diff --git a/advanced-react/.gitignore b/advanced-react/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..fd3dbb571a12a1c3baf000db049e141c888d05a8 --- /dev/null +++ b/advanced-react/.gitignore @@ -0,0 +1,36 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js +.yarn/install-state.gz + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env*.local + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/advanced-react/README.md b/advanced-react/README.md new file mode 100644 index 0000000000000000000000000000000000000000..0dc9ea2bcc4104b736ec1c0cf6e6e0d8d82ab07d --- /dev/null +++ b/advanced-react/README.md @@ -0,0 +1,36 @@ +This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app). + +## Getting Started + +First, run the development server: + +```bash +npm run dev +# or +yarn dev +# or +pnpm dev +# or +bun dev +``` + +Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. + +You can start editing the page by modifying `app/page.js`. The page auto-updates as you edit the file. + +This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font. + +## Learn More + +To learn more about Next.js, take a look at the following resources: + +- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. +- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. + +You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome! + +## Deploy on Vercel + +The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. + +Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. diff --git a/advanced-react/app/favicon.ico b/advanced-react/app/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..718d6fea4835ec2d246af9800eddb7ffb276240c Binary files /dev/null and b/advanced-react/app/favicon.ico differ diff --git a/advanced-react/app/globals.css b/advanced-react/app/globals.css new file mode 100644 index 0000000000000000000000000000000000000000..d4f491e152dd0aaca7ba3ffd87ed3300955a3620 --- /dev/null +++ b/advanced-react/app/globals.css @@ -0,0 +1,107 @@ +:root { + --max-width: 1100px; + --border-radius: 12px; + --font-mono: ui-monospace, Menlo, Monaco, 'Cascadia Mono', 'Segoe UI Mono', + 'Roboto Mono', 'Oxygen Mono', 'Ubuntu Monospace', 'Source Code Pro', + 'Fira Mono', 'Droid Sans Mono', 'Courier New', monospace; + + --foreground-rgb: 0, 0, 0; + --background-start-rgb: 214, 219, 220; + --background-end-rgb: 255, 255, 255; + + --primary-glow: conic-gradient( + from 180deg at 50% 50%, + #16abff33 0deg, + #0885ff33 55deg, + #54d6ff33 120deg, + #0071ff33 160deg, + transparent 360deg + ); + --secondary-glow: radial-gradient( + rgba(255, 255, 255, 1), + rgba(255, 255, 255, 0) + ); + + --tile-start-rgb: 239, 245, 249; + --tile-end-rgb: 228, 232, 233; + --tile-border: conic-gradient( + #00000080, + #00000040, + #00000030, + #00000020, + #00000010, + #00000010, + #00000080 + ); + + --callout-rgb: 238, 240, 241; + --callout-border-rgb: 172, 175, 176; + --card-rgb: 180, 185, 188; + --card-border-rgb: 131, 134, 135; +} + +@media (prefers-color-scheme: dark) { + :root { + --foreground-rgb: 255, 255, 255; + --background-start-rgb: 0, 0, 0; + --background-end-rgb: 0, 0, 0; + + --primary-glow: radial-gradient(rgba(1, 65, 255, 0.4), rgba(1, 65, 255, 0)); + --secondary-glow: linear-gradient( + to bottom right, + rgba(1, 65, 255, 0), + rgba(1, 65, 255, 0), + rgba(1, 65, 255, 0.3) + ); + + --tile-start-rgb: 2, 13, 46; + --tile-end-rgb: 2, 5, 19; + --tile-border: conic-gradient( + #ffffff80, + #ffffff40, + #ffffff30, + #ffffff20, + #ffffff10, + #ffffff10, + #ffffff80 + ); + + --callout-rgb: 20, 20, 20; + --callout-border-rgb: 108, 108, 108; + --card-rgb: 100, 100, 100; + --card-border-rgb: 200, 200, 200; + } +} + +* { + box-sizing: border-box; + padding: 0; + margin: 0; +} + +html, +body { + max-width: 100vw; + overflow-x: hidden; +} + +body { + color: rgb(var(--foreground-rgb)); + background: linear-gradient( + to bottom, + transparent, + rgb(var(--background-end-rgb)) + ) + rgb(var(--background-start-rgb)); +} + +a { + color: inherit; + text-decoration: none; +} + +@media (prefers-color-scheme: dark) { + html { + color-scheme: dark; + } +} diff --git a/advanced-react/app/layout.js b/advanced-react/app/layout.js new file mode 100644 index 0000000000000000000000000000000000000000..821f712283060f14e3328337975b1987d865f7b9 --- /dev/null +++ b/advanced-react/app/layout.js @@ -0,0 +1,17 @@ +import { Inter } from 'next/font/google' +import './globals.css' + +const inter = Inter({ subsets: ['latin'] }) + +export const metadata = { + title: 'Create Next App', + description: 'Generated by create next app', +} + +export default function RootLayout({ children }) { + return ( + <html lang="en"> + <body className={inter.className}>{children}</body> + </html> + ) +} diff --git a/advanced-react/app/page.js b/advanced-react/app/page.js new file mode 100644 index 0000000000000000000000000000000000000000..5f905a8a3277cae92add264a841009260037bf68 --- /dev/null +++ b/advanced-react/app/page.js @@ -0,0 +1,95 @@ +import Image from 'next/image' +import styles from './page.module.css' + +export default function Home() { + return ( + <main className={styles.main}> + <div className={styles.description}> + <p> + Get started by editing + <code className={styles.code}>app/page.js</code> + </p> + <div> + <a + href="https://vercel.com?utm_source=create-next-app&utm_medium=appdir-template&utm_campaign=create-next-app" + target="_blank" + rel="noopener noreferrer" + > + By{' '} + <Image + src="/vercel.svg" + alt="Vercel Logo" + className={styles.vercelLogo} + width={100} + height={24} + priority + /> + </a> + </div> + </div> + + <div className={styles.center}> + <Image + className={styles.logo} + src="/next.svg" + alt="Next.js Logo" + width={180} + height={37} + priority + /> + </div> + + <div className={styles.grid}> + <a + href="https://nextjs.org/docs?utm_source=create-next-app&utm_medium=appdir-template&utm_campaign=create-next-app" + className={styles.card} + target="_blank" + rel="noopener noreferrer" + > + <h2> + Docs <span>-></span> + </h2> + <p>Find in-depth information about Next.js features and API.</p> + </a> + + <a + href="https://nextjs.org/learn?utm_source=create-next-app&utm_medium=appdir-template&utm_campaign=create-next-app" + className={styles.card} + target="_blank" + rel="noopener noreferrer" + > + <h2> + Learn <span>-></span> + </h2> + <p>Learn about Next.js in an interactive course with quizzes!</p> + </a> + + <a + href="https://vercel.com/templates?framework=next.js&utm_source=create-next-app&utm_medium=appdir-template&utm_campaign=create-next-app" + className={styles.card} + target="_blank" + rel="noopener noreferrer" + > + <h2> + Templates <span>-></span> + </h2> + <p>Explore starter templates for Next.js.</p> + </a> + + <a + href="https://vercel.com/new?utm_source=create-next-app&utm_medium=appdir-template&utm_campaign=create-next-app" + className={styles.card} + target="_blank" + rel="noopener noreferrer" + > + <h2> + Deploy <span>-></span> + </h2> + <p> + Instantly deploy your Next.js site to a shareable URL with Vercel. + </p> + </a> + </div> + </main> + ) +} diff --git a/advanced-react/app/page.module.css b/advanced-react/app/page.module.css new file mode 100644 index 0000000000000000000000000000000000000000..6676d2c66b7875aa58a08a6b9276680349c69078 --- /dev/null +++ b/advanced-react/app/page.module.css @@ -0,0 +1,229 @@ +.main { + display: flex; + flex-direction: column; + justify-content: space-between; + align-items: center; + padding: 6rem; + min-height: 100vh; +} + +.description { + display: inherit; + justify-content: inherit; + align-items: inherit; + font-size: 0.85rem; + max-width: var(--max-width); + width: 100%; + z-index: 2; + font-family: var(--font-mono); +} + +.description a { + display: flex; + justify-content: center; + align-items: center; + gap: 0.5rem; +} + +.description p { + position: relative; + margin: 0; + padding: 1rem; + background-color: rgba(var(--callout-rgb), 0.5); + border: 1px solid rgba(var(--callout-border-rgb), 0.3); + border-radius: var(--border-radius); +} + +.code { + font-weight: 700; + font-family: var(--font-mono); +} + +.grid { + display: grid; + grid-template-columns: repeat(4, minmax(25%, auto)); + max-width: 100%; + width: var(--max-width); +} + +.card { + padding: 1rem 1.2rem; + border-radius: var(--border-radius); + background: rgba(var(--card-rgb), 0); + border: 1px solid rgba(var(--card-border-rgb), 0); + transition: background 200ms, border 200ms; +} + +.card span { + display: inline-block; + transition: transform 200ms; +} + +.card h2 { + font-weight: 600; + margin-bottom: 0.7rem; +} + +.card p { + margin: 0; + opacity: 0.6; + font-size: 0.9rem; + line-height: 1.5; + max-width: 30ch; +} + +.center { + display: flex; + justify-content: center; + align-items: center; + position: relative; + padding: 4rem 0; +} + +.center::before { + background: var(--secondary-glow); + border-radius: 50%; + width: 480px; + height: 360px; + margin-left: -400px; +} + +.center::after { + background: var(--primary-glow); + width: 240px; + height: 180px; + z-index: -1; +} + +.center::before, +.center::after { + content: ''; + left: 50%; + position: absolute; + filter: blur(45px); + transform: translateZ(0); +} + +.logo { + position: relative; +} +/* Enable hover only on non-touch devices */ +@media (hover: hover) and (pointer: fine) { + .card:hover { + background: rgba(var(--card-rgb), 0.1); + border: 1px solid rgba(var(--card-border-rgb), 0.15); + } + + .card:hover span { + transform: translateX(4px); + } +} + +@media (prefers-reduced-motion) { + .card:hover span { + transform: none; + } +} + +/* Mobile */ +@media (max-width: 700px) { + .content { + padding: 4rem; + } + + .grid { + grid-template-columns: 1fr; + margin-bottom: 120px; + max-width: 320px; + text-align: center; + } + + .card { + padding: 1rem 2.5rem; + } + + .card h2 { + margin-bottom: 0.5rem; + } + + .center { + padding: 8rem 0 6rem; + } + + .center::before { + transform: none; + height: 300px; + } + + .description { + font-size: 0.8rem; + } + + .description a { + padding: 1rem; + } + + .description p, + .description div { + display: flex; + justify-content: center; + position: fixed; + width: 100%; + } + + .description p { + align-items: center; + inset: 0 0 auto; + padding: 2rem 1rem 1.4rem; + border-radius: 0; + border: none; + border-bottom: 1px solid rgba(var(--callout-border-rgb), 0.25); + background: linear-gradient( + to bottom, + rgba(var(--background-start-rgb), 1), + rgba(var(--callout-rgb), 0.5) + ); + background-clip: padding-box; + backdrop-filter: blur(24px); + } + + .description div { + align-items: flex-end; + pointer-events: none; + inset: auto 0 0; + padding: 2rem; + height: 200px; + background: linear-gradient( + to bottom, + transparent 0%, + rgb(var(--background-end-rgb)) 40% + ); + z-index: 1; + } +} + +/* Tablet and Smaller Desktop */ +@media (min-width: 701px) and (max-width: 1120px) { + .grid { + grid-template-columns: repeat(2, 50%); + } +} + +@media (prefers-color-scheme: dark) { + .vercelLogo { + filter: invert(1); + } + + .logo { + filter: invert(1) drop-shadow(0 0 0.3rem #ffffff70); + } +} + +@keyframes rotate { + from { + transform: rotate(360deg); + } + to { + transform: rotate(0deg); + } +} diff --git a/advanced-react/jsconfig.json b/advanced-react/jsconfig.json new file mode 100644 index 0000000000000000000000000000000000000000..2a2e4b3bf8ba1c86d96fc2f5786597ad77a0e5e9 --- /dev/null +++ b/advanced-react/jsconfig.json @@ -0,0 +1,7 @@ +{ + "compilerOptions": { + "paths": { + "@/*": ["./*"] + } + } +} diff --git a/advanced-react/next.config.js b/advanced-react/next.config.js new file mode 100644 index 0000000000000000000000000000000000000000..767719fc4fba59345ae29e29159c9aff270f5819 --- /dev/null +++ b/advanced-react/next.config.js @@ -0,0 +1,4 @@ +/** @type {import('next').NextConfig} */ +const nextConfig = {} + +module.exports = nextConfig diff --git a/advanced-react/package-lock.json b/advanced-react/package-lock.json new file mode 100644 index 0000000000000000000000000000000000000000..5fa4ac22be68a0a218f3501764635840ae4e64bd --- /dev/null +++ b/advanced-react/package-lock.json @@ -0,0 +1,407 @@ +{ + "name": "advanced-dashboard-react", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "advanced-dashboard-react", + "version": "0.1.0", + "dependencies": { + "next": "14.0.4", + "react": "^18", + "react-dom": "^18" + } + }, + "node_modules/@next/env": { + "version": "14.0.4", + "resolved": "https://registry.npmjs.org/@next/env/-/env-14.0.4.tgz", + "integrity": "sha512-irQnbMLbUNQpP1wcE5NstJtbuA/69kRfzBrpAD7Gsn8zm/CY6YQYc3HQBz8QPxwISG26tIm5afvvVbu508oBeQ==" + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "14.0.4", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.0.4.tgz", + "integrity": "sha512-mF05E/5uPthWzyYDyptcwHptucf/jj09i2SXBPwNzbgBNc+XnwzrL0U6BmPjQeOL+FiB+iG1gwBeq7mlDjSRPg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "14.0.4", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.0.4.tgz", + "integrity": "sha512-IZQ3C7Bx0k2rYtrZZxKKiusMTM9WWcK5ajyhOZkYYTCc8xytmwSzR1skU7qLgVT/EY9xtXDG0WhY6fyujnI3rw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "14.0.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.0.4.tgz", + "integrity": "sha512-VwwZKrBQo/MGb1VOrxJ6LrKvbpo7UbROuyMRvQKTFKhNaXjUmKTu7wxVkIuCARAfiI8JpaWAnKR+D6tzpCcM4w==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "14.0.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.0.4.tgz", + "integrity": "sha512-8QftwPEW37XxXoAwsn+nXlodKWHfpMaSvt81W43Wh8dv0gkheD+30ezWMcFGHLI71KiWmHK5PSQbTQGUiidvLQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "14.0.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.0.4.tgz", + "integrity": "sha512-/s/Pme3VKfZAfISlYVq2hzFS8AcAIOTnoKupc/j4WlvF6GQ0VouS2Q2KEgPuO1eMBwakWPB1aYFIA4VNVh667A==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "14.0.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.0.4.tgz", + "integrity": "sha512-m8z/6Fyal4L9Bnlxde5g2Mfa1Z7dasMQyhEhskDATpqr+Y0mjOBZcXQ7G5U+vgL22cI4T7MfvgtrM2jdopqWaw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "14.0.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.0.4.tgz", + "integrity": "sha512-7Wv4PRiWIAWbm5XrGz3D8HUkCVDMMz9igffZG4NB1p4u1KoItwx9qjATHz88kwCEal/HXmbShucaslXCQXUM5w==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-ia32-msvc": { + "version": "14.0.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.0.4.tgz", + "integrity": "sha512-zLeNEAPULsl0phfGb4kdzF/cAVIfaC7hY+kt0/d+y9mzcZHsMS3hAS829WbJ31DkSlVKQeHEjZHIdhN+Pg7Gyg==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "14.0.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.0.4.tgz", + "integrity": "sha512-yEh2+R8qDlDCjxVpzOTEpBLQTEFAcP2A8fUFLaWNap9GitYKkKv1//y2S6XY6zsR4rCOPRpU7plYDR+az2n30A==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@swc/helpers": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", + "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001570", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001570.tgz", + "integrity": "sha512-+3e0ASu4sw1SWaoCtvPeyXp+5PsjigkSt8OXZbF9StH5pQWbxEjLAZE3n8Aup5udop1uRiKA7a4utUk/uoSpUw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/next": { + "version": "14.0.4", + "resolved": "https://registry.npmjs.org/next/-/next-14.0.4.tgz", + "integrity": "sha512-qbwypnM7327SadwFtxXnQdGiKpkuhaRLE2uq62/nRul9cj9KhQ5LhHmlziTNqUidZotw/Q1I9OjirBROdUJNgA==", + "dependencies": { + "@next/env": "14.0.4", + "@swc/helpers": "0.5.2", + "busboy": "1.6.0", + "caniuse-lite": "^1.0.30001406", + "graceful-fs": "^4.2.11", + "postcss": "8.4.31", + "styled-jsx": "5.1.1", + "watchpack": "2.4.0" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=18.17.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "14.0.4", + "@next/swc-darwin-x64": "14.0.4", + "@next/swc-linux-arm64-gnu": "14.0.4", + "@next/swc-linux-arm64-musl": "14.0.4", + "@next/swc-linux-x64-gnu": "14.0.4", + "@next/swc-linux-x64-musl": "14.0.4", + "@next/swc-win32-arm64-msvc": "14.0.4", + "@next/swc-win32-ia32-msvc": "14.0.4", + "@next/swc-win32-x64-msvc": "14.0.4" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/styled-jsx": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", + "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + } + } +} diff --git a/advanced-react/package.json b/advanced-react/package.json new file mode 100644 index 0000000000000000000000000000000000000000..3185892d49069656cfbf6676633a0efc0a3a3aa2 --- /dev/null +++ b/advanced-react/package.json @@ -0,0 +1,16 @@ +{ + "name": "advanced-dashboard-react", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "react": "^18", + "react-dom": "^18", + "next": "14.0.4" + } +} diff --git a/advanced-react/public/next.svg b/advanced-react/public/next.svg new file mode 100644 index 0000000000000000000000000000000000000000..5174b28c565c285e3e312ec5178be64fbeca8398 --- /dev/null +++ b/advanced-react/public/next.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 394 80"><path fill="#000" d="M262 0h68.5v12.7h-27.2v66.6h-13.6V12.7H262V0ZM149 0v12.7H94v20.4h44.3v12.6H94v21h55v12.6H80.5V0h68.7zm34.3 0h-17.8l63.8 79.4h17.9l-32-39.7 32-39.6h-17.9l-23 28.6-23-28.6zm18.3 56.7-9-11-27.1 33.7h17.8l18.3-22.7z"/><path fill="#000" d="M81 79.3 17 0H0v79.3h13.6V17l50.2 62.3H81Zm252.6-.4c-1 0-1.8-.4-2.5-1s-1.1-1.6-1.1-2.6.3-1.8 1-2.5 1.6-1 2.6-1 1.8.3 2.5 1a3.4 3.4 0 0 1 .6 4.3 3.7 3.7 0 0 1-3 1.8zm23.2-33.5h6v23.3c0 2.1-.4 4-1.3 5.5a9.1 9.1 0 0 1-3.8 3.5c-1.6.8-3.5 1.3-5.7 1.3-2 0-3.7-.4-5.3-1s-2.8-1.8-3.7-3.2c-.9-1.3-1.4-3-1.4-5h6c.1.8.3 1.6.7 2.2s1 1.2 1.6 1.5c.7.4 1.5.5 2.4.5 1 0 1.8-.2 2.4-.6a4 4 0 0 0 1.6-1.8c.3-.8.5-1.8.5-3V45.5zm30.9 9.1a4.4 4.4 0 0 0-2-3.3 7.5 7.5 0 0 0-4.3-1.1c-1.3 0-2.4.2-3.3.5-.9.4-1.6 1-2 1.6a3.5 3.5 0 0 0-.3 4c.3.5.7.9 1.3 1.2l1.8 1 2 .5 3.2.8c1.3.3 2.5.7 3.7 1.2a13 13 0 0 1 3.2 1.8 8.1 8.1 0 0 1 3 6.5c0 2-.5 3.7-1.5 5.1a10 10 0 0 1-4.4 3.5c-1.8.8-4.1 1.2-6.8 1.2-2.6 0-4.9-.4-6.8-1.2-2-.8-3.4-2-4.5-3.5a10 10 0 0 1-1.7-5.6h6a5 5 0 0 0 3.5 4.6c1 .4 2.2.6 3.4.6 1.3 0 2.5-.2 3.5-.6 1-.4 1.8-1 2.4-1.7a4 4 0 0 0 .8-2.4c0-.9-.2-1.6-.7-2.2a11 11 0 0 0-2.1-1.4l-3.2-1-3.8-1c-2.8-.7-5-1.7-6.6-3.2a7.2 7.2 0 0 1-2.4-5.7 8 8 0 0 1 1.7-5 10 10 0 0 1 4.3-3.5c2-.8 4-1.2 6.4-1.2 2.3 0 4.4.4 6.2 1.2 1.8.8 3.2 2 4.3 3.4 1 1.4 1.5 3 1.5 5h-5.8z"/></svg> \ No newline at end of file diff --git a/advanced-react/public/vercel.svg b/advanced-react/public/vercel.svg new file mode 100644 index 0000000000000000000000000000000000000000..d2f84222734f27b623d1c80dda3561b04d1284af --- /dev/null +++ b/advanced-react/public/vercel.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 283 64"><path fill="black" d="M141 16c-11 0-19 7-19 18s9 18 20 18c7 0 13-3 16-7l-7-5c-2 3-6 4-9 4-5 0-9-3-10-7h28v-3c0-11-8-18-19-18zm-9 15c1-4 4-7 9-7s8 3 9 7h-18zm117-15c-11 0-19 7-19 18s9 18 20 18c6 0 12-3 16-7l-8-5c-2 3-5 4-8 4-5 0-9-3-11-7h28l1-3c0-11-8-18-19-18zm-10 15c2-4 5-7 10-7s8 3 9 7h-19zm-39 3c0 6 4 10 10 10 4 0 7-2 9-5l8 5c-3 5-9 8-17 8-11 0-19-7-19-18s8-18 19-18c8 0 14 3 17 8l-8 5c-2-3-5-5-9-5-6 0-10 4-10 10zm83-29v46h-9V5h9zM37 0l37 64H0L37 0zm92 5-27 48L74 5h10l18 30 17-30h10zm59 12v10l-3-1c-6 0-10 4-10 10v15h-9V17h9v9c0-5 6-9 13-9z"/></svg> \ No newline at end of file diff --git a/advanced-vue/.gitignore b/advanced-vue/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..8ee54e8d343e466a213c8c30aa04be77126b170d --- /dev/null +++ b/advanced-vue/.gitignore @@ -0,0 +1,30 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +.DS_Store +dist +dist-ssr +coverage +*.local + +/cypress/videos/ +/cypress/screenshots/ + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +*.tsbuildinfo diff --git a/advanced-vue/.vscode/extensions.json b/advanced-vue/.vscode/extensions.json new file mode 100644 index 0000000000000000000000000000000000000000..c0a6e5a48110e472b09d68afa2a030af6ab3208b --- /dev/null +++ b/advanced-vue/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["Vue.volar", "Vue.vscode-typescript-vue-plugin"] +} diff --git a/advanced-vue/README.md b/advanced-vue/README.md new file mode 100644 index 0000000000000000000000000000000000000000..28b9a219f8999daa5340a87ae637c12135a6f8f3 --- /dev/null +++ b/advanced-vue/README.md @@ -0,0 +1,29 @@ +# polaris-dashboard + +This template should help get you started developing with Vue 3 in Vite. + +## Recommended IDE Setup + +[VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur) + [TypeScript Vue Plugin (Volar)](https://marketplace.visualstudio.com/items?itemName=Vue.vscode-typescript-vue-plugin). + +## Customize configuration + +See [Vite Configuration Reference](https://vitejs.dev/config/). + +## Project Setup + +```sh +npm install +``` + +### Compile and Hot-Reload for Development + +```sh +npm run dev +``` + +### Compile and Minify for Production + +```sh +npm run build +``` diff --git a/advanced-vue/index.html b/advanced-vue/index.html new file mode 100644 index 0000000000000000000000000000000000000000..73707caf1c9e35cb57cc14526a98c197852655a1 --- /dev/null +++ b/advanced-vue/index.html @@ -0,0 +1,13 @@ +<!DOCTYPE html> +<html lang="en"> + <head> + <meta charset="UTF-8"> + <link rel="icon" href="/favicon.ico"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <title>Polaris Dashboard</title> + </head> + <body> + <div id="app"></div> + <script type="module" src="/src/main.js"></script> + </body> +</html> diff --git a/advanced-vue/jsconfig.json b/advanced-vue/jsconfig.json new file mode 100644 index 0000000000000000000000000000000000000000..5a1f2d222a302a174e710614c6d76531b7bda926 --- /dev/null +++ b/advanced-vue/jsconfig.json @@ -0,0 +1,8 @@ +{ + "compilerOptions": { + "paths": { + "@/*": ["./src/*"] + } + }, + "exclude": ["node_modules", "dist"] +} diff --git a/advanced-vue/package-lock.json b/advanced-vue/package-lock.json new file mode 100644 index 0000000000000000000000000000000000000000..49baf43aa72ad1348935e4a09a8269f343699414 --- /dev/null +++ b/advanced-vue/package-lock.json @@ -0,0 +1,1974 @@ +{ + "name": "polaris-dashboard", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "polaris-dashboard", + "version": "0.0.0", + "dependencies": { + "@polaris/dashboard-sdk": "file:../", + "async": "^3.2.0", + "bootstrap": "^5.3.2", + "bootstrap-vue": "^2.23.1", + "bootstrap-vue-next": "^0.15.5", + "vue": "^3.3.11", + "vue-router": "^4.2.5", + "vue-typer": "^1.2.0", + "vue-writer": "^1.2.0" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^4.5.1", + "sass": "^1.69.5", + "unplugin-vue-components": "^0.26.0", + "vite": "^5.0.5" + } + }, + "..": { + "name": "@polaris/dashboard-sdk", + "version": "1.0.8", + "license": "ISC", + "dependencies": { + "@babel/plugin-proposal-object-rest-spread": "^7.20.7", + "chart.js": "^4.3.1", + "d3": "^7.7.0", + "d3-scale-chromatic": "^3.0.0", + "uuid": "^9.0.1" + }, + "devDependencies": { + "@babel/core": "^7.20.5", + "@babel/preset-env": "^7.20.2", + "babel-loader": "^9.1.0", + "css-loader": "^6.7.2", + "html-webpack-plugin": "^5.5.0", + "mini-css-extract-plugin": "^2.7.2", + "node-sass": "^9.0.0", + "sass-loader": "^13.2.2", + "style-loader": "^3.3.1", + "webpack": "^5.75.0", + "webpack-cli": "^5.0.1", + "webpack-dev-server": "^4.11.1" + }, + "peerDependencies": { + "gridstack": "^7.1.1" + } + }, + "node_modules/@antfu/utils": { + "version": "0.7.7", + "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-0.7.7.tgz", + "integrity": "sha512-gFPqTG7otEJ8uP6wrhDv6mqwGWYZKNvAcCq6u9hOj0c+IKCEsY4L1oC9trPq2SaWIzAfHvqfBDxF591JkMf+kg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@babel/parser": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", + "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.9.tgz", + "integrity": "sha512-jkYjjq7SdsWuNI6b5quymW0oC83NN5FdRPuCbs9HZ02mfVdAP8B8eeqLSYU3gb6OJEaY5CQabtTFbqBf26H3GA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.9.tgz", + "integrity": "sha512-q4cR+6ZD0938R19MyEW3jEsMzbb/1rulLXiNAJQADD/XYp7pT+rOS5JGxvpRW8dFDEfjW4wLgC/3FXIw4zYglQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.9.tgz", + "integrity": "sha512-KOqoPntWAH6ZxDwx1D6mRntIgZh9KodzgNOy5Ebt9ghzffOk9X2c1sPwtM9P+0eXbefnDhqYfkh5PLP5ULtWFA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.9.tgz", + "integrity": "sha512-KBJ9S0AFyLVx2E5D8W0vExqRW01WqRtczUZ8NRu+Pi+87opZn5tL4Y0xT0mA4FtHctd0ZgwNoN639fUUGlNIWw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.9.tgz", + "integrity": "sha512-vE0VotmNTQaTdX0Q9dOHmMTao6ObjyPm58CHZr1UK7qpNleQyxlFlNCaHsHx6Uqv86VgPmR4o2wdNq3dP1qyDQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.9.tgz", + "integrity": "sha512-uFQyd/o1IjiEk3rUHSwUKkqZwqdvuD8GevWF065eqgYfexcVkxh+IJgwTaGZVu59XczZGcN/YMh9uF1fWD8j1g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.9.tgz", + "integrity": "sha512-WMLgWAtkdTbTu1AWacY7uoj/YtHthgqrqhf1OaEWnZb7PQgpt8eaA/F3LkV0E6K/Lc0cUr/uaVP/49iE4M4asA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.9.tgz", + "integrity": "sha512-C/ChPohUYoyUaqn1h17m/6yt6OB14hbXvT8EgM1ZWaiiTYz7nWZR0SYmMnB5BzQA4GXl3BgBO1l8MYqL/He3qw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.9.tgz", + "integrity": "sha512-PiPblfe1BjK7WDAKR1Cr9O7VVPqVNpwFcPWgfn4xu0eMemzRp442hXyzF/fSwgrufI66FpHOEJk0yYdPInsmyQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.9.tgz", + "integrity": "sha512-f37i/0zE0MjDxijkPSQw1CO/7C27Eojqb+r3BbHVxMLkj8GCa78TrBZzvPyA/FNLUMzP3eyHCVkAopkKVja+6Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.9.tgz", + "integrity": "sha512-t6mN147pUIf3t6wUt3FeumoOTPfmv9Cc6DQlsVBpB7eCpLOqQDyWBP1ymXn1lDw4fNUSb/gBcKAmvTP49oIkaA==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.9.tgz", + "integrity": "sha512-jg9fujJTNTQBuDXdmAg1eeJUL4Jds7BklOTkkH80ZgQIoCTdQrDaHYgbFZyeTq8zbY+axgptncko3v9p5hLZtw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.9.tgz", + "integrity": "sha512-tkV0xUX0pUUgY4ha7z5BbDS85uI7ABw3V1d0RNTii7E9lbmV8Z37Pup2tsLV46SQWzjOeyDi1Q7Wx2+QM8WaCQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.9.tgz", + "integrity": "sha512-DfLp8dj91cufgPZDXr9p3FoR++m3ZJ6uIXsXrIvJdOjXVREtXuQCjfMfvmc3LScAVmLjcfloyVtpn43D56JFHg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.9.tgz", + "integrity": "sha512-zHbglfEdC88KMgCWpOl/zc6dDYJvWGLiUtmPRsr1OgCViu3z5GncvNVdf+6/56O2Ca8jUU+t1BW261V6kp8qdw==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.9.tgz", + "integrity": "sha512-JUjpystGFFmNrEHQnIVG8hKwvA2DN5o7RqiO1CVX8EN/F/gkCjkUMgVn6hzScpwnJtl2mPR6I9XV1oW8k9O+0A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.9.tgz", + "integrity": "sha512-GThgZPAwOBOsheA2RUlW5UeroRfESwMq/guy8uEe3wJlAOjpOXuSevLRd70NZ37ZrpO6RHGHgEHvPg1h3S1Jug==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.9.tgz", + "integrity": "sha512-Ki6PlzppaFVbLnD8PtlVQfsYw4S9n3eQl87cqgeIw+O3sRr9IghpfSKY62mggdt1yCSZ8QWvTZ9jo9fjDSg9uw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.9.tgz", + "integrity": "sha512-MLHj7k9hWh4y1ddkBpvRj2b9NCBhfgBt3VpWbHQnXRedVun/hC7sIyTGDGTfsGuXo4ebik2+3ShjcPbhtFwWDw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.9.tgz", + "integrity": "sha512-GQoa6OrQ8G08guMFgeXPH7yE/8Dt0IfOGWJSfSH4uafwdC7rWwrfE6P9N8AtPGIjUzdo2+7bN8Xo3qC578olhg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.9.tgz", + "integrity": "sha512-UOozV7Ntykvr5tSOlGCrqU3NBr3d8JqPes0QWN2WOXfvkWVGRajC+Ym0/Wj88fUgecUCLDdJPDF0Nna2UK3Qtg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.9.tgz", + "integrity": "sha512-oxoQgglOP7RH6iasDrhY+R/3cHrfwIDvRlT4CGChflq6twk8iENeVvMJjmvBb94Ik1Z+93iGO27err7w6l54GQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.2.tgz", + "integrity": "sha512-Ii3MrfY/GAIN3OhXNzpCKaLxHQfJF9qvwq/kEJYdqDxeIHa01K8sldugal6TmeeXl+WMvhv9cnVzUTaFFJF09A==", + "dependencies": { + "@floating-ui/utils": "^0.1.3" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.3.tgz", + "integrity": "sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==", + "dependencies": { + "@floating-ui/core": "^1.4.2", + "@floating-ui/utils": "^0.1.3" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.6.tgz", + "integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==" + }, + "node_modules/@floating-ui/vue": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@floating-ui/vue/-/vue-1.0.2.tgz", + "integrity": "sha512-sImlAl9mAoCKZLNlwWz2P2ZMJIDlOEDXrRD6aD2sIHAka1LPC+nWtB+D3lPe7IE7FGWSbwBPTnlSdlABa3Fr0A==", + "dependencies": { + "@floating-ui/dom": "^1.4.5", + "vue-demi": ">=0.13.0" + } + }, + "node_modules/@floating-ui/vue/node_modules/vue-demi": { + "version": "0.14.6", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz", + "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nuxt/opencollective": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@nuxt/opencollective/-/opencollective-0.3.3.tgz", + "integrity": "sha512-6IKCd+gP0HliixqZT/p8nW3tucD6Sv/u/eR2A9X4rxT/6hXlMzA4GZQzq4d2qnBAwSwGpmKyzkyTjNjrhaA25A==", + "dependencies": { + "chalk": "^4.1.0", + "consola": "^2.15.0", + "node-fetch": "^2.6.7" + }, + "bin": { + "opencollective": "bin/opencollective.js" + }, + "engines": { + "node": ">=8.0.0", + "npm": ">=5.0.0" + } + }, + "node_modules/@polaris/dashboard-sdk": { + "resolved": "..", + "link": true + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", + "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.0.tgz", + "integrity": "sha512-+1ge/xmaJpm1KVBuIH38Z94zj9fBD+hp+/5WLaHgyY8XLq1ibxk/zj6dTXaqM2cAbYKq8jYlhHd6k05If1W5xA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.0.tgz", + "integrity": "sha512-im6hUEyQ7ZfoZdNvtwgEJvBWZYauC9KVKq1w58LG2Zfz6zMd8gRrbN+xCVoqA2hv/v6fm9lp5LFGJ3za8EQH3A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.0.tgz", + "integrity": "sha512-u7aTMskN6Dmg1lCT0QJ+tINRt+ntUrvVkhbPfFz4bCwRZvjItx2nJtwJnJRlKMMaQCHRjrNqHRDYvE4mBm3DlQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.0.tgz", + "integrity": "sha512-8FvEl3w2ExmpcOmX5RJD0yqXcVSOqAJJUJ29Lca29Ik+3zPS1yFimr2fr5JSZ4Z5gt8/d7WqycpgkX9nocijSw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.0.tgz", + "integrity": "sha512-lHoKYaRwd4gge+IpqJHCY+8Vc3hhdJfU6ukFnnrJasEBUvVlydP8PuwndbWfGkdgSvZhHfSEw6urrlBj0TSSfg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.0.tgz", + "integrity": "sha512-JbEPfhndYeWHfOSeh4DOFvNXrj7ls9S/2omijVsao+LBPTPayT1uKcK3dHW3MwDJ7KO11t9m2cVTqXnTKpeaiw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.0.tgz", + "integrity": "sha512-ahqcSXLlcV2XUBM3/f/C6cRoh7NxYA/W7Yzuv4bDU1YscTFw7ay4LmD7l6OS8EMhTNvcrWGkEettL1Bhjf+B+w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.0.tgz", + "integrity": "sha512-uwvOYNtLw8gVtrExKhdFsYHA/kotURUmZYlinH2VcQxNCQJeJXnkmWgw2hI9Xgzhgu7J9QvWiq9TtTVwWMDa+w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.0.tgz", + "integrity": "sha512-m6pkSwcZZD2LCFHZX/zW2aLIISyzWLU3hrLLzQKMI12+OLEzgruTovAxY5sCZJkipklaZqPy/2bEEBNjp+Y7xg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.0.tgz", + "integrity": "sha512-VFAC1RDRSbU3iOF98X42KaVicAfKf0m0OvIu8dbnqhTe26Kh6Ym9JrDulz7Hbk7/9zGc41JkV02g+p3BivOdAg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.0.tgz", + "integrity": "sha512-9jPgMvTKXARz4inw6jezMLA2ihDBvgIU9Ml01hjdVpOcMKyxFBJrn83KVQINnbeqDv0+HdO1c09hgZ8N0s820Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.0.tgz", + "integrity": "sha512-WE4pT2kTXQN2bAv40Uog0AsV7/s9nT9HBWXAou8+++MBCnY51QS02KYtm6dQxxosKi1VIz/wZIrTQO5UP2EW+Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.0.tgz", + "integrity": "sha512-aPP5Q5AqNGuT0tnuEkK/g4mnt3ZhheiXrDIiSVIHN9mcN21OyXDVbEMqmXPE7e2OplNLDkcvV+ZoGJa2ZImFgw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz", + "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==" + }, + "node_modules/@vitejs/plugin-vue": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.5.2.tgz", + "integrity": "sha512-UGR3DlzLi/SaVBPX0cnSyE37vqxU3O6chn8l0HJNzQzDia6/Au2A4xKv+iIJW8w2daf80G7TYHhi1pAUjdZ0bQ==", + "dev": true, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.0.0 || ^5.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.11.tgz", + "integrity": "sha512-h97/TGWBilnLuRaj58sxNrsUU66fwdRKLOLQ9N/5iNDfp+DZhYH9Obhe0bXxhedl8fjAgpRANpiZfbgWyruQ0w==", + "dependencies": { + "@babel/parser": "^7.23.5", + "@vue/shared": "3.3.11", + "estree-walker": "^2.0.2", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.11.tgz", + "integrity": "sha512-zoAiUIqSKqAJ81WhfPXYmFGwDRuO+loqLxvXmfUdR5fOitPoUiIeFI9cTTyv9MU5O1+ZZglJVTusWzy+wfk5hw==", + "dependencies": { + "@vue/compiler-core": "3.3.11", + "@vue/shared": "3.3.11" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.11.tgz", + "integrity": "sha512-U4iqPlHO0KQeK1mrsxCN0vZzw43/lL8POxgpzcJweopmqtoYy9nljJzWDIQS3EfjiYhfdtdk9Gtgz7MRXnz3GA==", + "dependencies": { + "@babel/parser": "^7.23.5", + "@vue/compiler-core": "3.3.11", + "@vue/compiler-dom": "3.3.11", + "@vue/compiler-ssr": "3.3.11", + "@vue/reactivity-transform": "3.3.11", + "@vue/shared": "3.3.11", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.5", + "postcss": "^8.4.32", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.11.tgz", + "integrity": "sha512-Zd66ZwMvndxRTgVPdo+muV4Rv9n9DwQ4SSgWWKWkPFebHQfVYRrVjeygmmDmPewsHyznCNvJ2P2d6iOOhdv8Qg==", + "dependencies": { + "@vue/compiler-dom": "3.3.11", + "@vue/shared": "3.3.11" + } + }, + "node_modules/@vue/devtools-api": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.1.tgz", + "integrity": "sha512-+KpckaAQyfbvshdDW5xQylLni1asvNSGme1JFs8I1+/H5pHEhqUKMEQD/qn3Nx5+/nycBq11qAEi8lk+LXI2dA==" + }, + "node_modules/@vue/reactivity": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.3.11.tgz", + "integrity": "sha512-D5tcw091f0nuu+hXq5XANofD0OXnBmaRqMYl5B3fCR+mX+cXJIGNw/VNawBqkjLNWETrFW0i+xH9NvDbTPVh7g==", + "dependencies": { + "@vue/shared": "3.3.11" + } + }, + "node_modules/@vue/reactivity-transform": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.11.tgz", + "integrity": "sha512-fPGjH0wqJo68A0wQ1k158utDq/cRyZNlFoxGwNScE28aUFOKFEnCBsvyD8jHn+0kd0UKVpuGuaZEQ6r9FJRqCg==", + "dependencies": { + "@babel/parser": "^7.23.5", + "@vue/compiler-core": "3.3.11", + "@vue/shared": "3.3.11", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.5" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.3.11.tgz", + "integrity": "sha512-g9ztHGwEbS5RyWaOpXuyIVFTschclnwhqEbdy5AwGhYOgc7m/q3NFwr50MirZwTTzX55JY8pSkeib9BX04NIpw==", + "dependencies": { + "@vue/reactivity": "3.3.11", + "@vue/shared": "3.3.11" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.3.11.tgz", + "integrity": "sha512-OlhtV1PVpbgk+I2zl+Y5rQtDNcCDs12rsRg71XwaA2/Rbllw6mBLMi57VOn8G0AjOJ4Mdb4k56V37+g8ukShpQ==", + "dependencies": { + "@vue/runtime-core": "3.3.11", + "@vue/shared": "3.3.11", + "csstype": "^3.1.2" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.3.11.tgz", + "integrity": "sha512-AIWk0VwwxCAm4wqtJyxBylRTXSy1wCLOKbWxHaHiu14wjsNYtiRCSgVuqEPVuDpErOlRdNnuRgipQfXRLjLN5A==", + "dependencies": { + "@vue/compiler-ssr": "3.3.11", + "@vue/shared": "3.3.11" + }, + "peerDependencies": { + "vue": "3.3.11" + } + }, + "node_modules/@vue/shared": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.11.tgz", + "integrity": "sha512-u2G8ZQ9IhMWTMXaWqZycnK4UthG1fA238CD+DP4Dm4WJi5hdUKKLg0RMRaRpDPNMdkTwIDkp7WtD0Rd9BH9fLw==" + }, + "node_modules/@vueuse/core": { + "version": "10.7.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.7.0.tgz", + "integrity": "sha512-4EUDESCHtwu44ZWK3Gc/hZUVhVo/ysvdtwocB5vcauSV4B7NiGY5972WnsojB3vRNdxvAt7kzJWE2h9h7C9d5w==", + "dependencies": { + "@types/web-bluetooth": "^0.0.20", + "@vueuse/metadata": "10.7.0", + "@vueuse/shared": "10.7.0", + "vue-demi": ">=0.14.6" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/core/node_modules/vue-demi": { + "version": "0.14.6", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz", + "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/@vueuse/metadata": { + "version": "10.7.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.7.0.tgz", + "integrity": "sha512-GlaH7tKP2iBCZ3bHNZ6b0cl9g0CJK8lttkBNUX156gWvNYhTKEtbweWLm9rxCPIiwzYcr/5xML6T8ZUEt+DkvA==", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "10.7.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.7.0.tgz", + "integrity": "sha512-kc00uV6CiaTdc3i1CDC4a3lBxzaBE9AgYNtFN87B5OOscqeWElj/uza8qVDmk7/U8JbqoONLbtqiLJ5LGRuqlw==", + "dependencies": { + "vue-demi": ">=0.14.6" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared/node_modules/vue-demi": { + "version": "0.14.6", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz", + "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/acorn": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bootstrap": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.2.tgz", + "integrity": "sha512-D32nmNWiQHo94BKHLmOrdjlL05q1c8oxbtBphQFb9Z5to6eGRDCm0QgeaZ4zFBHzfg2++rqa2JkqCcxDy0sH0g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/twbs" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + } + ], + "peerDependencies": { + "@popperjs/core": "^2.11.8" + } + }, + "node_modules/bootstrap-vue": { + "version": "2.23.1", + "resolved": "https://registry.npmjs.org/bootstrap-vue/-/bootstrap-vue-2.23.1.tgz", + "integrity": "sha512-SEWkG4LzmMuWjQdSYmAQk1G/oOKm37dtNfjB5kxq0YafnL2W6qUAmeDTcIZVbPiQd2OQlIkWOMPBRGySk/zGsg==", + "hasInstallScript": true, + "dependencies": { + "@nuxt/opencollective": "^0.3.2", + "bootstrap": "^4.6.1", + "popper.js": "^1.16.1", + "portal-vue": "^2.1.7", + "vue-functional-data-merge": "^3.1.0" + } + }, + "node_modules/bootstrap-vue-next": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/bootstrap-vue-next/-/bootstrap-vue-next-0.15.5.tgz", + "integrity": "sha512-zKn0t07Jw/6LGxekm5qV/2JYDFpWJ2U9mEzt98hLIjXPdZg1qpxB7v/ElBKtHrynNfAFOJH5EF8RQxhCx2T4Ug==", + "dependencies": { + "@floating-ui/vue": "^1.0.2", + "@vueuse/core": "^10.6.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap-vue-next" + }, + "peerDependencies": { + "vue": "^3.3.8" + } + }, + "node_modules/bootstrap-vue/node_modules/@vue/compiler-sfc": { + "version": "2.7.15", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-2.7.15.tgz", + "integrity": "sha512-FCvIEevPmgCgqFBH7wD+3B97y7u7oj/Wr69zADBf403Tui377bThTjBvekaZvlRr4IwUAu3M6hYZeULZFJbdYg==", + "peer": true, + "dependencies": { + "@babel/parser": "^7.18.4", + "postcss": "^8.4.14", + "source-map": "^0.6.1" + } + }, + "node_modules/bootstrap-vue/node_modules/bootstrap": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.2.tgz", + "integrity": "sha512-51Bbp/Uxr9aTuy6ca/8FbFloBUJZLHwnhTcnjIeRn2suQWsWzcuJhGjKDB5eppVte/8oCdOL3VuwxvZDUggwGQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/twbs" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + } + ], + "peerDependencies": { + "jquery": "1.9.1 - 3", + "popper.js": "^1.16.1" + } + }, + "node_modules/bootstrap-vue/node_modules/portal-vue": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/portal-vue/-/portal-vue-2.1.7.tgz", + "integrity": "sha512-+yCno2oB3xA7irTt0EU5Ezw22L2J51uKAacE/6hMPMoO/mx3h4rXFkkBkT4GFsMDv/vEe8TNKC3ujJJ0PTwb6g==", + "peerDependencies": { + "vue": "^2.5.18" + } + }, + "node_modules/bootstrap-vue/node_modules/vue": { + "version": "2.7.15", + "resolved": "https://registry.npmjs.org/vue/-/vue-2.7.15.tgz", + "integrity": "sha512-a29fsXd2G0KMRqIFTpRgpSbWaNBK3lpCTOLuGLEDnlHWdjB8fwl6zyYZ8xCrqkJdatwZb4mGHiEfJjnw0Q6AwQ==", + "peer": true, + "dependencies": { + "@vue/compiler-sfc": "2.7.15", + "csstype": "^3.1.0" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/consola": { + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", + "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/esbuild": { + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.9.tgz", + "integrity": "sha512-U9CHtKSy+EpPsEBa+/A2gMs/h3ylBC0H0KSqIg7tpztHerLi6nrrcoUJAkNCEPumx8yJ+Byic4BVwHgRbN0TBg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.19.9", + "@esbuild/android-arm64": "0.19.9", + "@esbuild/android-x64": "0.19.9", + "@esbuild/darwin-arm64": "0.19.9", + "@esbuild/darwin-x64": "0.19.9", + "@esbuild/freebsd-arm64": "0.19.9", + "@esbuild/freebsd-x64": "0.19.9", + "@esbuild/linux-arm": "0.19.9", + "@esbuild/linux-arm64": "0.19.9", + "@esbuild/linux-ia32": "0.19.9", + "@esbuild/linux-loong64": "0.19.9", + "@esbuild/linux-mips64el": "0.19.9", + "@esbuild/linux-ppc64": "0.19.9", + "@esbuild/linux-riscv64": "0.19.9", + "@esbuild/linux-s390x": "0.19.9", + "@esbuild/linux-x64": "0.19.9", + "@esbuild/netbsd-x64": "0.19.9", + "@esbuild/openbsd-x64": "0.19.9", + "@esbuild/sunos-x64": "0.19.9", + "@esbuild/win32-arm64": "0.19.9", + "@esbuild/win32-ia32": "0.19.9", + "@esbuild/win32-x64": "0.19.9" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/immutable": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz", + "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jquery": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz", + "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==", + "peer": true + }, + "node_modules/local-pkg": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", + "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/lodash.split": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.split/-/lodash.split-4.4.2.tgz", + "integrity": "sha512-kn1IDX0aHfg0FsnPIyxCHTamZXt3YK3aExRH1LW8YhzP6+sCldTm8+E4aIg+nSmM6R4eqdWGrXWtfYI961bwIw==" + }, + "node_modules/magic-string": { + "version": "0.30.5", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", + "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/popper.js": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", + "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==", + "deprecated": "You can find the new Popper v2 at @popperjs/core, this package is dedicated to the legacy v1", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/postcss": { + "version": "8.4.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz", + "integrity": "sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.9.0.tgz", + "integrity": "sha512-bUHW/9N21z64gw8s6tP4c88P382Bq/L5uZDowHlHx6s/QWpjJXivIAbEw6LZthgSvlEizZBfLC4OAvWe7aoF7A==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.9.0", + "@rollup/rollup-android-arm64": "4.9.0", + "@rollup/rollup-darwin-arm64": "4.9.0", + "@rollup/rollup-darwin-x64": "4.9.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.9.0", + "@rollup/rollup-linux-arm64-gnu": "4.9.0", + "@rollup/rollup-linux-arm64-musl": "4.9.0", + "@rollup/rollup-linux-riscv64-gnu": "4.9.0", + "@rollup/rollup-linux-x64-gnu": "4.9.0", + "@rollup/rollup-linux-x64-musl": "4.9.0", + "@rollup/rollup-win32-arm64-msvc": "4.9.0", + "@rollup/rollup-win32-ia32-msvc": "4.9.0", + "@rollup/rollup-win32-x64-msvc": "4.9.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/sass": { + "version": "1.69.5", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.69.5.tgz", + "integrity": "sha512-qg2+UCJibLr2LCVOt3OlPhr/dqVHWOa9XtZf2OjbLs/T4VPSJ00udtgJxH3neXZm+QqX8B+3cU7RaLqp1iVfcQ==", + "dev": true, + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/unplugin": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.5.1.tgz", + "integrity": "sha512-0QkvG13z6RD+1L1FoibQqnvTwVBXvS4XSPwAyinVgoOCl2jAgwzdUKmEj05o4Lt8xwQI85Hb6mSyYkcAGwZPew==", + "dev": true, + "dependencies": { + "acorn": "^8.11.2", + "chokidar": "^3.5.3", + "webpack-sources": "^3.2.3", + "webpack-virtual-modules": "^0.6.0" + } + }, + "node_modules/unplugin-vue-components": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/unplugin-vue-components/-/unplugin-vue-components-0.26.0.tgz", + "integrity": "sha512-s7IdPDlnOvPamjunVxw8kNgKNK8A5KM1YpK5j/p97jEKTjlPNrA0nZBiSfAKKlK1gWZuyWXlKL5dk3EDw874LQ==", + "dev": true, + "dependencies": { + "@antfu/utils": "^0.7.6", + "@rollup/pluginutils": "^5.0.4", + "chokidar": "^3.5.3", + "debug": "^4.3.4", + "fast-glob": "^3.3.1", + "local-pkg": "^0.4.3", + "magic-string": "^0.30.3", + "minimatch": "^9.0.3", + "resolve": "^1.22.4", + "unplugin": "^1.4.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@babel/parser": "^7.15.8", + "@nuxt/kit": "^3.2.2", + "vue": "2 || 3" + }, + "peerDependenciesMeta": { + "@babel/parser": { + "optional": true + }, + "@nuxt/kit": { + "optional": true + } + } + }, + "node_modules/vite": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.8.tgz", + "integrity": "sha512-jYMALd8aeqR3yS9xlHd0OzQJndS9fH5ylVgWdB+pxTwxLKdO1pgC5Dlb398BUxpfaBxa4M9oT7j1g503Gaj5IQ==", + "dev": true, + "dependencies": { + "esbuild": "^0.19.3", + "postcss": "^8.4.32", + "rollup": "^4.2.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vue": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.3.11.tgz", + "integrity": "sha512-d4oBctG92CRO1cQfVBZp6WJAs0n8AK4Xf5fNjQCBeKCvMI1efGQ5E3Alt1slFJS9fZuPcFoiAiqFvQlv1X7t/w==", + "dependencies": { + "@vue/compiler-dom": "3.3.11", + "@vue/compiler-sfc": "3.3.11", + "@vue/runtime-dom": "3.3.11", + "@vue/server-renderer": "3.3.11", + "@vue/shared": "3.3.11" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-functional-data-merge": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vue-functional-data-merge/-/vue-functional-data-merge-3.1.0.tgz", + "integrity": "sha512-leT4kdJVQyeZNY1kmnS1xiUlQ9z1B/kdBFCILIjYYQDqZgLqCLa0UhjSSeRX6c3mUe6U5qYeM8LrEqkHJ1B4LA==" + }, + "node_modules/vue-router": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.2.5.tgz", + "integrity": "sha512-DIUpKcyg4+PTQKfFPX88UWhlagBEBEfJ5A8XDXRJLUnZOvcpMF8o/dnL90vpVkGaPbjvXazV/rC1qBKrZlFugw==", + "dependencies": { + "@vue/devtools-api": "^6.5.0" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/vue-typer": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vue-typer/-/vue-typer-1.2.0.tgz", + "integrity": "sha512-o0n2F9yOnbdQak1OiPFbZonIzysL5jiS1OPgaEX0KnMlKqXRKi808QHRdoMuqw44oYQM/vtxCt3AaNb9OzKH1Q==", + "dependencies": { + "lodash.split": "^4.4.2" + } + }, + "node_modules/vue-writer": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vue-writer/-/vue-writer-1.2.0.tgz", + "integrity": "sha512-EtunS6F12cyhXkKgIKDQxr6QEJpSmj4rUSqE149XZN5vbPQuX7PIbWovA1oPvGYUxrlq5HHobdZAzOzSeNAG7g==", + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "vue": "^3.0.5" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-virtual-modules": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.1.tgz", + "integrity": "sha512-poXpCylU7ExuvZK8z+On3kX+S8o/2dQ/SVYueKA0D4WEMXROXgY8Ez50/bQEUmvoSMMrWcrJqCHuhAbsiwg7Dg==", + "dev": true + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + } + } +} diff --git a/advanced-vue/package.json b/advanced-vue/package.json new file mode 100644 index 0000000000000000000000000000000000000000..f5da6e7e2166c3e76a0d29aad95a269816549891 --- /dev/null +++ b/advanced-vue/package.json @@ -0,0 +1,28 @@ +{ + "name": "polaris-dashboard", + "version": "0.0.0", + "private": true, + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview" + }, + "dependencies": { + "@polaris/dashboard-sdk": "file:../", + "async": "^3.2.0", + "bootstrap": "^5.3.2", + "bootstrap-vue": "^2.23.1", + "bootstrap-vue-next": "^0.15.5", + "vue": "^3.3.11", + "vue-router": "^4.2.5", + "vue-typer": "^1.2.0", + "vue-writer": "^1.2.0" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^4.5.1", + "sass": "^1.69.5", + "unplugin-vue-components": "^0.26.0", + "vite": "^5.0.5" + } +} diff --git a/advanced-vue/public/favicon.ico b/advanced-vue/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..df36fcfb72584e00488330b560ebcf34a41c64c2 Binary files /dev/null and b/advanced-vue/public/favicon.ico differ diff --git a/advanced-vue/src/App.vue b/advanced-vue/src/App.vue new file mode 100644 index 0000000000000000000000000000000000000000..72d2537b138160d14972e70f63a541201102897a --- /dev/null +++ b/advanced-vue/src/App.vue @@ -0,0 +1,11 @@ +<script setup> +import { RouterLink, RouterView } from 'vue-router' +import HelloWorld from './components/HelloWorld.vue' +</script> + +<template> +<BNavbar variant="primary" v-b-color-mode="'dark'"> + <BNavbarBrand tag="h1" class="mb-0">Polaris Dashboard</BNavbarBrand> +</BNavbar> + <RouterView /> +</template> \ No newline at end of file diff --git a/advanced-vue/src/assets/logo.svg b/advanced-vue/src/assets/logo.svg new file mode 100644 index 0000000000000000000000000000000000000000..7565660356e5b3723c9c33d508b830c9cfbea29f --- /dev/null +++ b/advanced-vue/src/assets/logo.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 261.76 226.69"><path d="M161.096.001l-30.225 52.351L100.647.001H-.005l130.877 226.688L261.749.001z" fill="#41b883"/><path d="M161.096.001l-30.225 52.351L100.647.001H52.346l78.526 136.01L209.398.001z" fill="#34495e"/></svg> diff --git a/advanced-vue/src/assets/main.scss b/advanced-vue/src/assets/main.scss new file mode 100644 index 0000000000000000000000000000000000000000..445918f1d2e051b36895e0e1d063fe0f44300766 --- /dev/null +++ b/advanced-vue/src/assets/main.scss @@ -0,0 +1 @@ +$primary: $blue \ No newline at end of file diff --git a/advanced-vue/src/components/HelloWorld.vue b/advanced-vue/src/components/HelloWorld.vue new file mode 100644 index 0000000000000000000000000000000000000000..5fb372c9c9e8ad63c632a14fb0323627dbdf6bb1 --- /dev/null +++ b/advanced-vue/src/components/HelloWorld.vue @@ -0,0 +1,44 @@ +<script setup> +defineProps({ + msg: { + type: String, + required: true + } +}) +</script> + +<template> + <div class="greetings"> + <h1 class="green">{{ msg }}</h1> + <h3> + You’ve successfully created a project with + <a href="https://vitejs.dev/" target="_blank" rel="noopener">Vite</a> + + <a href="https://vuejs.org/" target="_blank" rel="noopener">Vue 3</a>. + </h3> + </div> +</template> + +<style scoped> +h1 { + font-weight: 500; + font-size: 2.6rem; + position: relative; + top: -10px; +} + +h3 { + font-size: 1.2rem; +} + +.greetings h1, +.greetings h3 { + text-align: center; +} + +@media (min-width: 1024px) { + .greetings h1, + .greetings h3 { + text-align: left; + } +} +</style> diff --git a/advanced-vue/src/main.js b/advanced-vue/src/main.js new file mode 100644 index 0000000000000000000000000000000000000000..658c143d5d35a5115b2122f11be8736d1477394c --- /dev/null +++ b/advanced-vue/src/main.js @@ -0,0 +1,16 @@ + +import 'bootstrap/scss/_functions.scss' +import './assets/main.scss' +import 'bootstrap/scss/bootstrap.scss' + +import { createApp } from 'vue' +import App from './App.vue' +import router from './router' + +import VueWriter from "vue-writer"; +const app = createApp(App) + +app.use(router) +app.use(VueWriter) + +app.mount('#app') diff --git a/advanced-vue/src/router/index.js b/advanced-vue/src/router/index.js new file mode 100644 index 0000000000000000000000000000000000000000..a49ae507f39bdb792025d7c4bd1573b876e8cc96 --- /dev/null +++ b/advanced-vue/src/router/index.js @@ -0,0 +1,23 @@ +import { createRouter, createWebHistory } from 'vue-router' +import HomeView from '../views/HomeView.vue' + +const router = createRouter({ + history: createWebHistory(import.meta.env.BASE_URL), + routes: [ + { + path: '/', + name: 'home', + component: HomeView + }, + { + path: '/about', + name: 'about', + // route level code-splitting + // this generates a separate chunk (About.[hash].js) for this route + // which is lazy-loaded when the route is visited. + component: () => import('../views/AboutView.vue') + } + ] +}) + +export default router diff --git a/advanced-vue/src/views/AboutView.vue b/advanced-vue/src/views/AboutView.vue new file mode 100644 index 0000000000000000000000000000000000000000..756ad2a17909837834858538422308120cf09dab --- /dev/null +++ b/advanced-vue/src/views/AboutView.vue @@ -0,0 +1,15 @@ +<template> + <div class="about"> + <h1>This is an about page</h1> + </div> +</template> + +<style> +@media (min-width: 1024px) { + .about { + min-height: 100vh; + display: flex; + align-items: center; + } +} +</style> diff --git a/advanced-vue/src/views/HomeView.vue b/advanced-vue/src/views/HomeView.vue new file mode 100644 index 0000000000000000000000000000000000000000..47bb64933fd3fd830c2092974d99656d667091ed --- /dev/null +++ b/advanced-vue/src/views/HomeView.vue @@ -0,0 +1,10 @@ +<script setup> +</script> + +<template> + <main> + <div class="container"> + <h1><vue-writer :array="['Willkommen bei Polaris']" :typeSpeed="70" /></h1> + </div> + </main> +</template> diff --git a/advanced-vue/vite.config.js b/advanced-vue/vite.config.js new file mode 100644 index 0000000000000000000000000000000000000000..dd6c4638f0d07b49d76590c85e509b14dda2bcc6 --- /dev/null +++ b/advanced-vue/vite.config.js @@ -0,0 +1,21 @@ +import { fileURLToPath, URL } from 'node:url' + +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' +import Components from 'unplugin-vue-components/vite' +import {BootstrapVueNextResolver} from 'unplugin-vue-components/resolvers' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [ + vue(), + Components({ + resolvers: [BootstrapVueNextResolver()], + }), + ], + resolve: { + alias: { + '@': fileURLToPath(new URL('./src', import.meta.url)) + } + } +}) \ No newline at end of file diff --git a/advanced/README.md b/advanced/README.md new file mode 100644 index 0000000000000000000000000000000000000000..bd64de5a3803e55a4e4bbcddf395772f97d706e8 --- /dev/null +++ b/advanced/README.md @@ -0,0 +1,92 @@ +# dashboard-bochum + + + +## Getting started + +To make it easy for you to get started with GitLab, here's a list of recommended next steps. + +Already a pro? Just edit this README.md and make it your own. Want to make it easy? [Use the template at the bottom](#editing-this-readme)! + +## Add your files + +- [ ] [Create](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#create-a-file) or [upload](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#upload-a-file) files +- [ ] [Add files using the command line](https://docs.gitlab.com/ee/gitlab-basics/add-file.html#add-a-file-using-the-command-line) or push an existing Git repository with the following command: + +``` +cd existing_repo +git remote add origin https://gitlab.digitallearning.gmbh/polaris/dashboard-bochum.git +git branch -M main +git push -uf origin main +``` + +## Integrate with your tools + +- [ ] [Set up project integrations](https://gitlab.digitallearning.gmbh/polaris/dashboard-bochum/-/settings/integrations) + +## Collaborate with your team + +- [ ] [Invite team members and collaborators](https://docs.gitlab.com/ee/user/project/members/) +- [ ] [Create a new merge request](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html) +- [ ] [Automatically close issues from merge requests](https://docs.gitlab.com/ee/user/project/issues/managing_issues.html#closing-issues-automatically) +- [ ] [Enable merge request approvals](https://docs.gitlab.com/ee/user/project/merge_requests/approvals/) +- [ ] [Set auto-merge](https://docs.gitlab.com/ee/user/project/merge_requests/merge_when_pipeline_succeeds.html) + +## Test and Deploy + +Use the built-in continuous integration in GitLab. + +- [ ] [Get started with GitLab CI/CD](https://docs.gitlab.com/ee/ci/quick_start/index.html) +- [ ] [Analyze your code for known vulnerabilities with Static Application Security Testing(SAST)](https://docs.gitlab.com/ee/user/application_security/sast/) +- [ ] [Deploy to Kubernetes, Amazon EC2, or Amazon ECS using Auto Deploy](https://docs.gitlab.com/ee/topics/autodevops/requirements.html) +- [ ] [Use pull-based deployments for improved Kubernetes management](https://docs.gitlab.com/ee/user/clusters/agent/) +- [ ] [Set up protected environments](https://docs.gitlab.com/ee/ci/environments/protected_environments.html) + +*** + +# Editing this README + +When you're ready to make this README your own, just edit this file and use the handy template below (or feel free to structure it however you want - this is just a starting point!). Thank you to [makeareadme.com](https://www.makeareadme.com/) for this template. + +## Suggestions for a good README +Every project is different, so consider which of these sections apply to yours. The sections used in the template are suggestions for most open source projects. Also keep in mind that while a README can be too long and detailed, too long is better than too short. If you think your README is too long, consider utilizing another form of documentation rather than cutting out information. + +## Name +Choose a self-explaining name for your project. + +## Description +Let people know what your project can do specifically. Provide context and add a link to any reference visitors might be unfamiliar with. A list of Features or a Background subsection can also be added here. If there are alternatives to your project, this is a good place to list differentiating factors. + +## Badges +On some READMEs, you may see small images that convey metadata, such as whether or not all the tests are passing for the project. You can use Shields to add some to your README. Many services also have instructions for adding a badge. + +## Visuals +Depending on what you are making, it can be a good idea to include screenshots or even a video (you'll frequently see GIFs rather than actual videos). Tools like ttygif can help, but check out Asciinema for a more sophisticated method. + +## Installation +Within a particular ecosystem, there may be a common way of installing things, such as using Yarn, NuGet, or Homebrew. However, consider the possibility that whoever is reading your README is a novice and would like more guidance. Listing specific steps helps remove ambiguity and gets people to using your project as quickly as possible. If it only runs in a specific context like a particular programming language version or operating system or has dependencies that have to be installed manually, also add a Requirements subsection. + +## Usage +Use examples liberally, and show the expected output if you can. It's helpful to have inline the smallest example of usage that you can demonstrate, while providing links to more sophisticated examples if they are too long to reasonably include in the README. + +## Support +Tell people where they can go to for help. It can be any combination of an issue tracker, a chat room, an email address, etc. + +## Roadmap +If you have ideas for releases in the future, it is a good idea to list them in the README. + +## Contributing +State if you are open to contributions and what your requirements are for accepting them. + +For people who want to make changes to your project, it's helpful to have some documentation on how to get started. Perhaps there is a script that they should run or some environment variables that they need to set. Make these steps explicit. These instructions could also be useful to your future self. + +You can also document commands to lint the code or run tests. These steps help to ensure high code quality and reduce the likelihood that the changes inadvertently break something. Having instructions for running tests is especially helpful if it requires external setup, such as starting a Selenium server for testing in a browser. + +## Authors and acknowledgment +Show your appreciation to those who have contributed to the project. + +## License +For open source projects, say how it is licensed. + +## Project status +If you have run out of energy or time for your project, put a note at the top of the README saying that development has slowed down or stopped completely. Someone may choose to fork your project or volunteer to step in as a maintainer or owner, allowing your project to keep going. You can also make an explicit request for maintainers. diff --git a/advanced/dist/assets/039c0f6d9ddd5a0ce38f.jpg b/advanced/dist/assets/039c0f6d9ddd5a0ce38f.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0a8eaad9b87ea845bef7026059dc602ba16940bd Binary files /dev/null and b/advanced/dist/assets/039c0f6d9ddd5a0ce38f.jpg differ diff --git a/advanced/dist/bundle.js b/advanced/dist/bundle.js new file mode 100644 index 0000000000000000000000000000000000000000..662a672e173b1cd9fbe1ae674b2c2ac9153a7b78 --- /dev/null +++ b/advanced/dist/bundle.js @@ -0,0 +1 @@ +(()=>{var __webpack_modules__={8054:(__unused_webpack_module,__unused_webpack___webpack_exports__,__webpack_require__)=>{"use strict";eval('\n// EXTERNAL MODULE: ./node_modules/react/index.js\nvar react = __webpack_require__(7294);\nvar react_namespaceObject = /*#__PURE__*/__webpack_require__.t(react, 2);\n// EXTERNAL MODULE: ./node_modules/react-dom/client.js\nvar client = __webpack_require__(745);\n// EXTERNAL MODULE: ./node_modules/react-dom/index.js\nvar react_dom = __webpack_require__(3935);\nvar react_dom_namespaceObject = /*#__PURE__*/__webpack_require__.t(react_dom, 2);\n;// CONCATENATED MODULE: ./node_modules/@remix-run/router/dist/router.js\n/**\n * @remix-run/router v1.13.1\n *\n * Copyright (c) Remix Software Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE.md file in the root directory of this source tree.\n *\n * @license MIT\n */\nfunction router_extends() {\n router_extends = Object.assign ? Object.assign.bind() : function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return router_extends.apply(this, arguments);\n}\n\n////////////////////////////////////////////////////////////////////////////////\n//#region Types and Constants\n////////////////////////////////////////////////////////////////////////////////\n/**\n * Actions represent the type of change to a location value.\n */\nvar Action;\n(function (Action) {\n /**\n * A POP indicates a change to an arbitrary index in the history stack, such\n * as a back or forward navigation. It does not describe the direction of the\n * navigation, only that the current index changed.\n *\n * Note: This is the default action for newly created history objects.\n */\n Action["Pop"] = "POP";\n /**\n * A PUSH indicates a new entry being added to the history stack, such as when\n * a link is clicked and a new page loads. When this happens, all subsequent\n * entries in the stack are lost.\n */\n Action["Push"] = "PUSH";\n /**\n * A REPLACE indicates the entry at the current index in the history stack\n * being replaced by a new one.\n */\n Action["Replace"] = "REPLACE";\n})(Action || (Action = {}));\nconst PopStateEventType = "popstate";\n/**\n * Memory history stores the current location in memory. It is designed for use\n * in stateful non-browser environments like tests and React Native.\n */\nfunction router_createMemoryHistory(options) {\n if (options === void 0) {\n options = {};\n }\n let {\n initialEntries = ["/"],\n initialIndex,\n v5Compat = false\n } = options;\n let entries; // Declare so we can access from createMemoryLocation\n entries = initialEntries.map((entry, index) => createMemoryLocation(entry, typeof entry === "string" ? null : entry.state, index === 0 ? "default" : undefined));\n let index = clampIndex(initialIndex == null ? entries.length - 1 : initialIndex);\n let action = Action.Pop;\n let listener = null;\n function clampIndex(n) {\n return Math.min(Math.max(n, 0), entries.length - 1);\n }\n function getCurrentLocation() {\n return entries[index];\n }\n function createMemoryLocation(to, state, key) {\n if (state === void 0) {\n state = null;\n }\n let location = createLocation(entries ? getCurrentLocation().pathname : "/", to, state, key);\n warning(location.pathname.charAt(0) === "/", "relative pathnames are not supported in memory history: " + JSON.stringify(to));\n return location;\n }\n function createHref(to) {\n return typeof to === "string" ? to : router_createPath(to);\n }\n let history = {\n get index() {\n return index;\n },\n get action() {\n return action;\n },\n get location() {\n return getCurrentLocation();\n },\n createHref,\n createURL(to) {\n return new URL(createHref(to), "http://localhost");\n },\n encodeLocation(to) {\n let path = typeof to === "string" ? parsePath(to) : to;\n return {\n pathname: path.pathname || "",\n search: path.search || "",\n hash: path.hash || ""\n };\n },\n push(to, state) {\n action = Action.Push;\n let nextLocation = createMemoryLocation(to, state);\n index += 1;\n entries.splice(index, entries.length, nextLocation);\n if (v5Compat && listener) {\n listener({\n action,\n location: nextLocation,\n delta: 1\n });\n }\n },\n replace(to, state) {\n action = Action.Replace;\n let nextLocation = createMemoryLocation(to, state);\n entries[index] = nextLocation;\n if (v5Compat && listener) {\n listener({\n action,\n location: nextLocation,\n delta: 0\n });\n }\n },\n go(delta) {\n action = Action.Pop;\n let nextIndex = clampIndex(index + delta);\n let nextLocation = entries[nextIndex];\n index = nextIndex;\n if (listener) {\n listener({\n action,\n location: nextLocation,\n delta\n });\n }\n },\n listen(fn) {\n listener = fn;\n return () => {\n listener = null;\n };\n }\n };\n return history;\n}\n/**\n * Browser history stores the location in regular URLs. This is the standard for\n * most web apps, but it requires some configuration on the server to ensure you\n * serve the same app at multiple URLs.\n *\n * @see https://github.com/remix-run/history/tree/main/docs/api-reference.md#createbrowserhistory\n */\nfunction router_createBrowserHistory(options) {\n if (options === void 0) {\n options = {};\n }\n function createBrowserLocation(window, globalHistory) {\n let {\n pathname,\n search,\n hash\n } = window.location;\n return createLocation("", {\n pathname,\n search,\n hash\n },\n // state defaults to `null` because `window.history.state` does\n globalHistory.state && globalHistory.state.usr || null, globalHistory.state && globalHistory.state.key || "default");\n }\n function createBrowserHref(window, to) {\n return typeof to === "string" ? to : router_createPath(to);\n }\n return getUrlBasedHistory(createBrowserLocation, createBrowserHref, null, options);\n}\n/**\n * Hash history stores the location in window.location.hash. This makes it ideal\n * for situations where you don\'t want to send the location to the server for\n * some reason, either because you do cannot configure it or the URL space is\n * reserved for something else.\n *\n * @see https://github.com/remix-run/history/tree/main/docs/api-reference.md#createhashhistory\n */\nfunction router_createHashHistory(options) {\n if (options === void 0) {\n options = {};\n }\n function createHashLocation(window, globalHistory) {\n let {\n pathname = "/",\n search = "",\n hash = ""\n } = parsePath(window.location.hash.substr(1));\n // Hash URL should always have a leading / just like window.location.pathname\n // does, so if an app ends up at a route like /#something then we add a\n // leading slash so all of our path-matching behaves the same as if it would\n // in a browser router. This is particularly important when there exists a\n // root splat route (<Route path="*">) since that matches internally against\n // "/*" and we\'d expect /#something to 404 in a hash router app.\n if (!pathname.startsWith("/") && !pathname.startsWith(".")) {\n pathname = "/" + pathname;\n }\n return createLocation("", {\n pathname,\n search,\n hash\n },\n // state defaults to `null` because `window.history.state` does\n globalHistory.state && globalHistory.state.usr || null, globalHistory.state && globalHistory.state.key || "default");\n }\n function createHashHref(window, to) {\n let base = window.document.querySelector("base");\n let href = "";\n if (base && base.getAttribute("href")) {\n let url = window.location.href;\n let hashIndex = url.indexOf("#");\n href = hashIndex === -1 ? url : url.slice(0, hashIndex);\n }\n return href + "#" + (typeof to === "string" ? to : router_createPath(to));\n }\n function validateHashLocation(location, to) {\n warning(location.pathname.charAt(0) === "/", "relative pathnames are not supported in hash history.push(" + JSON.stringify(to) + ")");\n }\n return getUrlBasedHistory(createHashLocation, createHashHref, validateHashLocation, options);\n}\nfunction router_invariant(value, message) {\n if (value === false || value === null || typeof value === "undefined") {\n throw new Error(message);\n }\n}\nfunction warning(cond, message) {\n if (!cond) {\n // eslint-disable-next-line no-console\n if (typeof console !== "undefined") console.warn(message);\n try {\n // Welcome to debugging history!\n //\n // This error is thrown as a convenience, so you can more easily\n // find the source for a warning that appears in the console by\n // enabling "pause on exceptions" in your JavaScript debugger.\n throw new Error(message);\n // eslint-disable-next-line no-empty\n } catch (e) {}\n }\n}\nfunction createKey() {\n return Math.random().toString(36).substr(2, 8);\n}\n/**\n * For browser-based histories, we combine the state and key into an object\n */\nfunction getHistoryState(location, index) {\n return {\n usr: location.state,\n key: location.key,\n idx: index\n };\n}\n/**\n * Creates a Location object with a unique key from the given Path\n */\nfunction createLocation(current, to, state, key) {\n if (state === void 0) {\n state = null;\n }\n let location = router_extends({\n pathname: typeof current === "string" ? current : current.pathname,\n search: "",\n hash: ""\n }, typeof to === "string" ? parsePath(to) : to, {\n state,\n // TODO: This could be cleaned up. push/replace should probably just take\n // full Locations now and avoid the need to run through this flow at all\n // But that\'s a pretty big refactor to the current test suite so going to\n // keep as is for the time being and just let any incoming keys take precedence\n key: to && to.key || key || createKey()\n });\n return location;\n}\n/**\n * Creates a string URL path from the given pathname, search, and hash components.\n */\nfunction router_createPath(_ref) {\n let {\n pathname = "/",\n search = "",\n hash = ""\n } = _ref;\n if (search && search !== "?") pathname += search.charAt(0) === "?" ? search : "?" + search;\n if (hash && hash !== "#") pathname += hash.charAt(0) === "#" ? hash : "#" + hash;\n return pathname;\n}\n/**\n * Parses a string URL path into its separate pathname, search, and hash components.\n */\nfunction parsePath(path) {\n let parsedPath = {};\n if (path) {\n let hashIndex = path.indexOf("#");\n if (hashIndex >= 0) {\n parsedPath.hash = path.substr(hashIndex);\n path = path.substr(0, hashIndex);\n }\n let searchIndex = path.indexOf("?");\n if (searchIndex >= 0) {\n parsedPath.search = path.substr(searchIndex);\n path = path.substr(0, searchIndex);\n }\n if (path) {\n parsedPath.pathname = path;\n }\n }\n return parsedPath;\n}\nfunction getUrlBasedHistory(getLocation, createHref, validateLocation, options) {\n if (options === void 0) {\n options = {};\n }\n let {\n window = document.defaultView,\n v5Compat = false\n } = options;\n let globalHistory = window.history;\n let action = Action.Pop;\n let listener = null;\n let index = getIndex();\n // Index should only be null when we initialize. If not, it\'s because the\n // user called history.pushState or history.replaceState directly, in which\n // case we should log a warning as it will result in bugs.\n if (index == null) {\n index = 0;\n globalHistory.replaceState(router_extends({}, globalHistory.state, {\n idx: index\n }), "");\n }\n function getIndex() {\n let state = globalHistory.state || {\n idx: null\n };\n return state.idx;\n }\n function handlePop() {\n action = Action.Pop;\n let nextIndex = getIndex();\n let delta = nextIndex == null ? null : nextIndex - index;\n index = nextIndex;\n if (listener) {\n listener({\n action,\n location: history.location,\n delta\n });\n }\n }\n function push(to, state) {\n action = Action.Push;\n let location = createLocation(history.location, to, state);\n if (validateLocation) validateLocation(location, to);\n index = getIndex() + 1;\n let historyState = getHistoryState(location, index);\n let url = history.createHref(location);\n // try...catch because iOS limits us to 100 pushState calls :/\n try {\n globalHistory.pushState(historyState, "", url);\n } catch (error) {\n // If the exception is because `state` can\'t be serialized, let that throw\n // outwards just like a replace call would so the dev knows the cause\n // https://html.spec.whatwg.org/multipage/nav-history-apis.html#shared-history-push/replace-state-steps\n // https://html.spec.whatwg.org/multipage/structured-data.html#structuredserializeinternal\n if (error instanceof DOMException && error.name === "DataCloneError") {\n throw error;\n }\n // They are going to lose state here, but there is no real\n // way to warn them about it since the page will refresh...\n window.location.assign(url);\n }\n if (v5Compat && listener) {\n listener({\n action,\n location: history.location,\n delta: 1\n });\n }\n }\n function replace(to, state) {\n action = Action.Replace;\n let location = createLocation(history.location, to, state);\n if (validateLocation) validateLocation(location, to);\n index = getIndex();\n let historyState = getHistoryState(location, index);\n let url = history.createHref(location);\n globalHistory.replaceState(historyState, "", url);\n if (v5Compat && listener) {\n listener({\n action,\n location: history.location,\n delta: 0\n });\n }\n }\n function createURL(to) {\n // window.location.origin is "null" (the literal string value) in Firefox\n // under certain conditions, notably when serving from a local HTML file\n // See https://bugzilla.mozilla.org/show_bug.cgi?id=878297\n let base = window.location.origin !== "null" ? window.location.origin : window.location.href;\n let href = typeof to === "string" ? to : router_createPath(to);\n router_invariant(base, "No window.location.(origin|href) available to create URL for href: " + href);\n return new URL(href, base);\n }\n let history = {\n get action() {\n return action;\n },\n get location() {\n return getLocation(window, globalHistory);\n },\n listen(fn) {\n if (listener) {\n throw new Error("A history only accepts one active listener");\n }\n window.addEventListener(PopStateEventType, handlePop);\n listener = fn;\n return () => {\n window.removeEventListener(PopStateEventType, handlePop);\n listener = null;\n };\n },\n createHref(to) {\n return createHref(window, to);\n },\n createURL,\n encodeLocation(to) {\n // Encode a Location the same way window.location would\n let url = createURL(to);\n return {\n pathname: url.pathname,\n search: url.search,\n hash: url.hash\n };\n },\n push,\n replace,\n go(n) {\n return globalHistory.go(n);\n }\n };\n return history;\n}\n//#endregion\n\nvar ResultType;\n(function (ResultType) {\n ResultType["data"] = "data";\n ResultType["deferred"] = "deferred";\n ResultType["redirect"] = "redirect";\n ResultType["error"] = "error";\n})(ResultType || (ResultType = {}));\nconst immutableRouteKeys = new Set(["lazy", "caseSensitive", "path", "id", "index", "children"]);\nfunction isIndexRoute(route) {\n return route.index === true;\n}\n// Walk the route tree generating unique IDs where necessary, so we are working\n// solely with AgnosticDataRouteObject\'s within the Router\nfunction convertRoutesToDataRoutes(routes, mapRouteProperties, parentPath, manifest) {\n if (parentPath === void 0) {\n parentPath = [];\n }\n if (manifest === void 0) {\n manifest = {};\n }\n return routes.map((route, index) => {\n let treePath = [...parentPath, index];\n let id = typeof route.id === "string" ? route.id : treePath.join("-");\n router_invariant(route.index !== true || !route.children, "Cannot specify children on an index route");\n router_invariant(!manifest[id], "Found a route id collision on id \\"" + id + "\\". Route " + "id\'s must be globally unique within Data Router usages");\n if (isIndexRoute(route)) {\n let indexRoute = router_extends({}, route, mapRouteProperties(route), {\n id\n });\n manifest[id] = indexRoute;\n return indexRoute;\n } else {\n let pathOrLayoutRoute = router_extends({}, route, mapRouteProperties(route), {\n id,\n children: undefined\n });\n manifest[id] = pathOrLayoutRoute;\n if (route.children) {\n pathOrLayoutRoute.children = convertRoutesToDataRoutes(route.children, mapRouteProperties, treePath, manifest);\n }\n return pathOrLayoutRoute;\n }\n });\n}\n/**\n * Matches the given routes to a location and returns the match data.\n *\n * @see https://reactrouter.com/utils/match-routes\n */\nfunction matchRoutes(routes, locationArg, basename) {\n if (basename === void 0) {\n basename = "/";\n }\n let location = typeof locationArg === "string" ? parsePath(locationArg) : locationArg;\n let pathname = router_stripBasename(location.pathname || "/", basename);\n if (pathname == null) {\n return null;\n }\n let branches = flattenRoutes(routes);\n rankRouteBranches(branches);\n let matches = null;\n for (let i = 0; matches == null && i < branches.length; ++i) {\n matches = matchRouteBranch(branches[i],\n // Incoming pathnames are generally encoded from either window.location\n // or from router.navigate, but we want to match against the unencoded\n // paths in the route definitions. Memory router locations won\'t be\n // encoded here but there also shouldn\'t be anything to decode so this\n // should be a safe operation. This avoids needing matchRoutes to be\n // history-aware.\n safelyDecodeURI(pathname));\n }\n return matches;\n}\nfunction convertRouteMatchToUiMatch(match, loaderData) {\n let {\n route,\n pathname,\n params\n } = match;\n return {\n id: route.id,\n pathname,\n params,\n data: loaderData[route.id],\n handle: route.handle\n };\n}\nfunction flattenRoutes(routes, branches, parentsMeta, parentPath) {\n if (branches === void 0) {\n branches = [];\n }\n if (parentsMeta === void 0) {\n parentsMeta = [];\n }\n if (parentPath === void 0) {\n parentPath = "";\n }\n let flattenRoute = (route, index, relativePath) => {\n let meta = {\n relativePath: relativePath === undefined ? route.path || "" : relativePath,\n caseSensitive: route.caseSensitive === true,\n childrenIndex: index,\n route\n };\n if (meta.relativePath.startsWith("/")) {\n router_invariant(meta.relativePath.startsWith(parentPath), "Absolute route path \\"" + meta.relativePath + "\\" nested under path " + ("\\"" + parentPath + "\\" is not valid. An absolute child route path ") + "must start with the combined path of all its parent routes.");\n meta.relativePath = meta.relativePath.slice(parentPath.length);\n }\n let path = router_joinPaths([parentPath, meta.relativePath]);\n let routesMeta = parentsMeta.concat(meta);\n // Add the children before adding this route to the array, so we traverse the\n // route tree depth-first and child routes appear before their parents in\n // the "flattened" version.\n if (route.children && route.children.length > 0) {\n router_invariant(\n // Our types know better, but runtime JS may not!\n // @ts-expect-error\n route.index !== true, "Index routes must not have child routes. Please remove " + ("all child routes from route path \\"" + path + "\\"."));\n flattenRoutes(route.children, branches, routesMeta, path);\n }\n // Routes without a path shouldn\'t ever match by themselves unless they are\n // index routes, so don\'t add them to the list of possible branches.\n if (route.path == null && !route.index) {\n return;\n }\n branches.push({\n path,\n score: computeScore(path, route.index),\n routesMeta\n });\n };\n routes.forEach((route, index) => {\n var _route$path;\n // coarse-grain check for optional params\n if (route.path === "" || !((_route$path = route.path) != null && _route$path.includes("?"))) {\n flattenRoute(route, index);\n } else {\n for (let exploded of explodeOptionalSegments(route.path)) {\n flattenRoute(route, index, exploded);\n }\n }\n });\n return branches;\n}\n/**\n * Computes all combinations of optional path segments for a given path,\n * excluding combinations that are ambiguous and of lower priority.\n *\n * For example, `/one/:two?/three/:four?/:five?` explodes to:\n * - `/one/three`\n * - `/one/:two/three`\n * - `/one/three/:four`\n * - `/one/three/:five`\n * - `/one/:two/three/:four`\n * - `/one/:two/three/:five`\n * - `/one/three/:four/:five`\n * - `/one/:two/three/:four/:five`\n */\nfunction explodeOptionalSegments(path) {\n let segments = path.split("/");\n if (segments.length === 0) return [];\n let [first, ...rest] = segments;\n // Optional path segments are denoted by a trailing `?`\n let isOptional = first.endsWith("?");\n // Compute the corresponding required segment: `foo?` -> `foo`\n let required = first.replace(/\\?$/, "");\n if (rest.length === 0) {\n // Intepret empty string as omitting an optional segment\n // `["one", "", "three"]` corresponds to omitting `:two` from `/one/:two?/three` -> `/one/three`\n return isOptional ? [required, ""] : [required];\n }\n let restExploded = explodeOptionalSegments(rest.join("/"));\n let result = [];\n // All child paths with the prefix. Do this for all children before the\n // optional version for all children, so we get consistent ordering where the\n // parent optional aspect is preferred as required. Otherwise, we can get\n // child sections interspersed where deeper optional segments are higher than\n // parent optional segments, where for example, /:two would explode _earlier_\n // then /:one. By always including the parent as required _for all children_\n // first, we avoid this issue\n result.push(...restExploded.map(subpath => subpath === "" ? required : [required, subpath].join("/")));\n // Then, if this is an optional value, add all child versions without\n if (isOptional) {\n result.push(...restExploded);\n }\n // for absolute paths, ensure `/` instead of empty segment\n return result.map(exploded => path.startsWith("/") && exploded === "" ? "/" : exploded);\n}\nfunction rankRouteBranches(branches) {\n branches.sort((a, b) => a.score !== b.score ? b.score - a.score // Higher score first\n : compareIndexes(a.routesMeta.map(meta => meta.childrenIndex), b.routesMeta.map(meta => meta.childrenIndex)));\n}\nconst paramRe = /^:\\w+$/;\nconst dynamicSegmentValue = 3;\nconst indexRouteValue = 2;\nconst emptySegmentValue = 1;\nconst staticSegmentValue = 10;\nconst splatPenalty = -2;\nconst isSplat = s => s === "*";\nfunction computeScore(path, index) {\n let segments = path.split("/");\n let initialScore = segments.length;\n if (segments.some(isSplat)) {\n initialScore += splatPenalty;\n }\n if (index) {\n initialScore += indexRouteValue;\n }\n return segments.filter(s => !isSplat(s)).reduce((score, segment) => score + (paramRe.test(segment) ? dynamicSegmentValue : segment === "" ? emptySegmentValue : staticSegmentValue), initialScore);\n}\nfunction compareIndexes(a, b) {\n let siblings = a.length === b.length && a.slice(0, -1).every((n, i) => n === b[i]);\n return siblings ?\n // If two routes are siblings, we should try to match the earlier sibling\n // first. This allows people to have fine-grained control over the matching\n // behavior by simply putting routes with identical paths in the order they\n // want them tried.\n a[a.length - 1] - b[b.length - 1] :\n // Otherwise, it doesn\'t really make sense to rank non-siblings by index,\n // so they sort equally.\n 0;\n}\nfunction matchRouteBranch(branch, pathname) {\n let {\n routesMeta\n } = branch;\n let matchedParams = {};\n let matchedPathname = "/";\n let matches = [];\n for (let i = 0; i < routesMeta.length; ++i) {\n let meta = routesMeta[i];\n let end = i === routesMeta.length - 1;\n let remainingPathname = matchedPathname === "/" ? pathname : pathname.slice(matchedPathname.length) || "/";\n let match = router_matchPath({\n path: meta.relativePath,\n caseSensitive: meta.caseSensitive,\n end\n }, remainingPathname);\n if (!match) return null;\n Object.assign(matchedParams, match.params);\n let route = meta.route;\n matches.push({\n // TODO: Can this as be avoided?\n params: matchedParams,\n pathname: router_joinPaths([matchedPathname, match.pathname]),\n pathnameBase: normalizePathname(router_joinPaths([matchedPathname, match.pathnameBase])),\n route\n });\n if (match.pathnameBase !== "/") {\n matchedPathname = router_joinPaths([matchedPathname, match.pathnameBase]);\n }\n }\n return matches;\n}\n/**\n * Returns a path with params interpolated.\n *\n * @see https://reactrouter.com/utils/generate-path\n */\nfunction generatePath(originalPath, params) {\n if (params === void 0) {\n params = {};\n }\n let path = originalPath;\n if (path.endsWith("*") && path !== "*" && !path.endsWith("/*")) {\n warning(false, "Route path \\"" + path + "\\" will be treated as if it were " + ("\\"" + path.replace(/\\*$/, "/*") + "\\" because the `*` character must ") + "always follow a `/` in the pattern. To get rid of this warning, " + ("please change the route path to \\"" + path.replace(/\\*$/, "/*") + "\\"."));\n path = path.replace(/\\*$/, "/*");\n }\n // ensure `/` is added at the beginning if the path is absolute\n const prefix = path.startsWith("/") ? "/" : "";\n const stringify = p => p == null ? "" : typeof p === "string" ? p : String(p);\n const segments = path.split(/\\/+/).map((segment, index, array) => {\n const isLastSegment = index === array.length - 1;\n // only apply the splat if it\'s the last segment\n if (isLastSegment && segment === "*") {\n const star = "*";\n // Apply the splat\n return stringify(params[star]);\n }\n const keyMatch = segment.match(/^:(\\w+)(\\??)$/);\n if (keyMatch) {\n const [, key, optional] = keyMatch;\n let param = params[key];\n router_invariant(optional === "?" || param != null, "Missing \\":" + key + "\\" param");\n return stringify(param);\n }\n // Remove any optional markers from optional static segments\n return segment.replace(/\\?$/g, "");\n })\n // Remove empty segments\n .filter(segment => !!segment);\n return prefix + segments.join("/");\n}\n/**\n * Performs pattern matching on a URL pathname and returns information about\n * the match.\n *\n * @see https://reactrouter.com/utils/match-path\n */\nfunction router_matchPath(pattern, pathname) {\n if (typeof pattern === "string") {\n pattern = {\n path: pattern,\n caseSensitive: false,\n end: true\n };\n }\n let [matcher, compiledParams] = compilePath(pattern.path, pattern.caseSensitive, pattern.end);\n let match = pathname.match(matcher);\n if (!match) return null;\n let matchedPathname = match[0];\n let pathnameBase = matchedPathname.replace(/(.)\\/+$/, "$1");\n let captureGroups = match.slice(1);\n let params = compiledParams.reduce((memo, _ref, index) => {\n let {\n paramName,\n isOptional\n } = _ref;\n // We need to compute the pathnameBase here using the raw splat value\n // instead of using params["*"] later because it will be decoded then\n if (paramName === "*") {\n let splatValue = captureGroups[index] || "";\n pathnameBase = matchedPathname.slice(0, matchedPathname.length - splatValue.length).replace(/(.)\\/+$/, "$1");\n }\n const value = captureGroups[index];\n if (isOptional && !value) {\n memo[paramName] = undefined;\n } else {\n memo[paramName] = safelyDecodeURIComponent(value || "", paramName);\n }\n return memo;\n }, {});\n return {\n params,\n pathname: matchedPathname,\n pathnameBase,\n pattern\n };\n}\nfunction compilePath(path, caseSensitive, end) {\n if (caseSensitive === void 0) {\n caseSensitive = false;\n }\n if (end === void 0) {\n end = true;\n }\n warning(path === "*" || !path.endsWith("*") || path.endsWith("/*"), "Route path \\"" + path + "\\" will be treated as if it were " + ("\\"" + path.replace(/\\*$/, "/*") + "\\" because the `*` character must ") + "always follow a `/` in the pattern. To get rid of this warning, " + ("please change the route path to \\"" + path.replace(/\\*$/, "/*") + "\\"."));\n let params = [];\n let regexpSource = "^" + path.replace(/\\/*\\*?$/, "") // Ignore trailing / and /*, we\'ll handle it below\n .replace(/^\\/*/, "/") // Make sure it has a leading /\n .replace(/[\\\\.*+^${}|()[\\]]/g, "\\\\$&") // Escape special regex chars\n .replace(/\\/:(\\w+)(\\?)?/g, (_, paramName, isOptional) => {\n params.push({\n paramName,\n isOptional: isOptional != null\n });\n return isOptional ? "/?([^\\\\/]+)?" : "/([^\\\\/]+)";\n });\n if (path.endsWith("*")) {\n params.push({\n paramName: "*"\n });\n regexpSource += path === "*" || path === "/*" ? "(.*)$" // Already matched the initial /, just match the rest\n : "(?:\\\\/(.+)|\\\\/*)$"; // Don\'t include the / in params["*"]\n } else if (end) {\n // When matching to the end, ignore trailing slashes\n regexpSource += "\\\\/*$";\n } else if (path !== "" && path !== "/") {\n // If our path is non-empty and contains anything beyond an initial slash,\n // then we have _some_ form of path in our regex, so we should expect to\n // match only if we find the end of this path segment. Look for an optional\n // non-captured trailing slash (to match a portion of the URL) or the end\n // of the path (if we\'ve matched to the end). We used to do this with a\n // word boundary but that gives false positives on routes like\n // /user-preferences since `-` counts as a word boundary.\n regexpSource += "(?:(?=\\\\/|$))";\n } else ;\n let matcher = new RegExp(regexpSource, caseSensitive ? undefined : "i");\n return [matcher, params];\n}\nfunction safelyDecodeURI(value) {\n try {\n return decodeURI(value);\n } catch (error) {\n warning(false, "The URL path \\"" + value + "\\" could not be decoded because it is is a " + "malformed URL segment. This is probably due to a bad percent " + ("encoding (" + error + ")."));\n return value;\n }\n}\nfunction safelyDecodeURIComponent(value, paramName) {\n try {\n return decodeURIComponent(value);\n } catch (error) {\n warning(false, "The value for the URL param \\"" + paramName + "\\" will not be decoded because" + (" the string \\"" + value + "\\" is a malformed URL segment. This is probably") + (" due to a bad percent encoding (" + error + ")."));\n return value;\n }\n}\n/**\n * @private\n */\nfunction router_stripBasename(pathname, basename) {\n if (basename === "/") return pathname;\n if (!pathname.toLowerCase().startsWith(basename.toLowerCase())) {\n return null;\n }\n // We want to leave trailing slash behavior in the user\'s control, so if they\n // specify a basename with a trailing slash, we should support it\n let startIndex = basename.endsWith("/") ? basename.length - 1 : basename.length;\n let nextChar = pathname.charAt(startIndex);\n if (nextChar && nextChar !== "/") {\n // pathname does not start with basename/\n return null;\n }\n return pathname.slice(startIndex) || "/";\n}\n/**\n * Returns a resolved path object relative to the given pathname.\n *\n * @see https://reactrouter.com/utils/resolve-path\n */\nfunction resolvePath(to, fromPathname) {\n if (fromPathname === void 0) {\n fromPathname = "/";\n }\n let {\n pathname: toPathname,\n search = "",\n hash = ""\n } = typeof to === "string" ? parsePath(to) : to;\n let pathname = toPathname ? toPathname.startsWith("/") ? toPathname : resolvePathname(toPathname, fromPathname) : fromPathname;\n return {\n pathname,\n search: normalizeSearch(search),\n hash: normalizeHash(hash)\n };\n}\nfunction resolvePathname(relativePath, fromPathname) {\n let segments = fromPathname.replace(/\\/+$/, "").split("/");\n let relativeSegments = relativePath.split("/");\n relativeSegments.forEach(segment => {\n if (segment === "..") {\n // Keep the root "" segment so the pathname starts at /\n if (segments.length > 1) segments.pop();\n } else if (segment !== ".") {\n segments.push(segment);\n }\n });\n return segments.length > 1 ? segments.join("/") : "/";\n}\nfunction getInvalidPathError(char, field, dest, path) {\n return "Cannot include a \'" + char + "\' character in a manually specified " + ("`to." + field + "` field [" + JSON.stringify(path) + "]. Please separate it out to the ") + ("`to." + dest + "` field. Alternatively you may provide the full path as ") + "a string in <Link to=\\"...\\"> and the router will parse it for you.";\n}\n/**\n * @private\n *\n * When processing relative navigation we want to ignore ancestor routes that\n * do not contribute to the path, such that index/pathless layout routes don\'t\n * interfere.\n *\n * For example, when moving a route element into an index route and/or a\n * pathless layout route, relative link behavior contained within should stay\n * the same. Both of the following examples should link back to the root:\n *\n * <Route path="/">\n * <Route path="accounts" element={<Link to=".."}>\n * </Route>\n *\n * <Route path="/">\n * <Route path="accounts">\n * <Route element={<AccountsLayout />}> // <-- Does not contribute\n * <Route index element={<Link to=".."} /> // <-- Does not contribute\n * </Route\n * </Route>\n * </Route>\n */\nfunction getPathContributingMatches(matches) {\n return matches.filter((match, index) => index === 0 || match.route.path && match.route.path.length > 0);\n}\n/**\n * @private\n */\nfunction router_resolveTo(toArg, routePathnames, locationPathname, isPathRelative) {\n if (isPathRelative === void 0) {\n isPathRelative = false;\n }\n let to;\n if (typeof toArg === "string") {\n to = parsePath(toArg);\n } else {\n to = router_extends({}, toArg);\n router_invariant(!to.pathname || !to.pathname.includes("?"), getInvalidPathError("?", "pathname", "search", to));\n router_invariant(!to.pathname || !to.pathname.includes("#"), getInvalidPathError("#", "pathname", "hash", to));\n router_invariant(!to.search || !to.search.includes("#"), getInvalidPathError("#", "search", "hash", to));\n }\n let isEmptyPath = toArg === "" || to.pathname === "";\n let toPathname = isEmptyPath ? "/" : to.pathname;\n let from;\n // Routing is relative to the current pathname if explicitly requested.\n //\n // If a pathname is explicitly provided in `to`, it should be relative to the\n // route context. This is explained in `Note on `<Link to>` values` in our\n // migration guide from v5 as a means of disambiguation between `to` values\n // that begin with `/` and those that do not. However, this is problematic for\n // `to` values that do not provide a pathname. `to` can simply be a search or\n // hash string, in which case we should assume that the navigation is relative\n // to the current location\'s pathname and *not* the route pathname.\n if (toPathname == null) {\n from = locationPathname;\n } else if (isPathRelative) {\n let fromSegments = routePathnames[routePathnames.length - 1].replace(/^\\//, "").split("/");\n if (toPathname.startsWith("..")) {\n let toSegments = toPathname.split("/");\n // With relative="path", each leading .. segment means "go up one URL segment"\n while (toSegments[0] === "..") {\n toSegments.shift();\n fromSegments.pop();\n }\n to.pathname = toSegments.join("/");\n }\n from = "/" + fromSegments.join("/");\n } else {\n let routePathnameIndex = routePathnames.length - 1;\n if (toPathname.startsWith("..")) {\n let toSegments = toPathname.split("/");\n // With relative="route" (the default), each leading .. segment means\n // "go up one route" instead of "go up one URL segment". This is a key\n // difference from how <a href> works and a major reason we call this a\n // "to" value instead of a "href".\n while (toSegments[0] === "..") {\n toSegments.shift();\n routePathnameIndex -= 1;\n }\n to.pathname = toSegments.join("/");\n }\n // If there are more ".." segments than parent routes, resolve relative to\n // the root / URL.\n from = routePathnameIndex >= 0 ? routePathnames[routePathnameIndex] : "/";\n }\n let path = resolvePath(to, from);\n // Ensure the pathname has a trailing slash if the original "to" had one\n let hasExplicitTrailingSlash = toPathname && toPathname !== "/" && toPathname.endsWith("/");\n // Or if this was a link to the current path which has a trailing slash\n let hasCurrentTrailingSlash = (isEmptyPath || toPathname === ".") && locationPathname.endsWith("/");\n if (!path.pathname.endsWith("/") && (hasExplicitTrailingSlash || hasCurrentTrailingSlash)) {\n path.pathname += "/";\n }\n return path;\n}\n/**\n * @private\n */\nfunction getToPathname(to) {\n // Empty strings should be treated the same as / paths\n return to === "" || to.pathname === "" ? "/" : typeof to === "string" ? parsePath(to).pathname : to.pathname;\n}\n/**\n * @private\n */\nconst router_joinPaths = paths => paths.join("/").replace(/\\/\\/+/g, "/");\n/**\n * @private\n */\nconst normalizePathname = pathname => pathname.replace(/\\/+$/, "").replace(/^\\/*/, "/");\n/**\n * @private\n */\nconst normalizeSearch = search => !search || search === "?" ? "" : search.startsWith("?") ? search : "?" + search;\n/**\n * @private\n */\nconst normalizeHash = hash => !hash || hash === "#" ? "" : hash.startsWith("#") ? hash : "#" + hash;\n/**\n * This is a shortcut for creating `application/json` responses. Converts `data`\n * to JSON and sets the `Content-Type` header.\n */\nconst json = function json(data, init) {\n if (init === void 0) {\n init = {};\n }\n let responseInit = typeof init === "number" ? {\n status: init\n } : init;\n let headers = new Headers(responseInit.headers);\n if (!headers.has("Content-Type")) {\n headers.set("Content-Type", "application/json; charset=utf-8");\n }\n return new Response(JSON.stringify(data), router_extends({}, responseInit, {\n headers\n }));\n};\nclass AbortedDeferredError extends Error {}\nclass DeferredData {\n constructor(data, responseInit) {\n this.pendingKeysSet = new Set();\n this.subscribers = new Set();\n this.deferredKeys = [];\n router_invariant(data && typeof data === "object" && !Array.isArray(data), "defer() only accepts plain objects");\n // Set up an AbortController + Promise we can race against to exit early\n // cancellation\n let reject;\n this.abortPromise = new Promise((_, r) => reject = r);\n this.controller = new AbortController();\n let onAbort = () => reject(new AbortedDeferredError("Deferred data aborted"));\n this.unlistenAbortSignal = () => this.controller.signal.removeEventListener("abort", onAbort);\n this.controller.signal.addEventListener("abort", onAbort);\n this.data = Object.entries(data).reduce((acc, _ref2) => {\n let [key, value] = _ref2;\n return Object.assign(acc, {\n [key]: this.trackPromise(key, value)\n });\n }, {});\n if (this.done) {\n // All incoming values were resolved\n this.unlistenAbortSignal();\n }\n this.init = responseInit;\n }\n trackPromise(key, value) {\n if (!(value instanceof Promise)) {\n return value;\n }\n this.deferredKeys.push(key);\n this.pendingKeysSet.add(key);\n // We store a little wrapper promise that will be extended with\n // _data/_error props upon resolve/reject\n let promise = Promise.race([value, this.abortPromise]).then(data => this.onSettle(promise, key, undefined, data), error => this.onSettle(promise, key, error));\n // Register rejection listeners to avoid uncaught promise rejections on\n // errors or aborted deferred values\n promise.catch(() => {});\n Object.defineProperty(promise, "_tracked", {\n get: () => true\n });\n return promise;\n }\n onSettle(promise, key, error, data) {\n if (this.controller.signal.aborted && error instanceof AbortedDeferredError) {\n this.unlistenAbortSignal();\n Object.defineProperty(promise, "_error", {\n get: () => error\n });\n return Promise.reject(error);\n }\n this.pendingKeysSet.delete(key);\n if (this.done) {\n // Nothing left to abort!\n this.unlistenAbortSignal();\n }\n // If the promise was resolved/rejected with undefined, we\'ll throw an error as you\n // should always resolve with a value or null\n if (error === undefined && data === undefined) {\n let undefinedError = new Error("Deferred data for key \\"" + key + "\\" resolved/rejected with `undefined`, " + "you must resolve/reject with a value or `null`.");\n Object.defineProperty(promise, "_error", {\n get: () => undefinedError\n });\n this.emit(false, key);\n return Promise.reject(undefinedError);\n }\n if (data === undefined) {\n Object.defineProperty(promise, "_error", {\n get: () => error\n });\n this.emit(false, key);\n return Promise.reject(error);\n }\n Object.defineProperty(promise, "_data", {\n get: () => data\n });\n this.emit(false, key);\n return data;\n }\n emit(aborted, settledKey) {\n this.subscribers.forEach(subscriber => subscriber(aborted, settledKey));\n }\n subscribe(fn) {\n this.subscribers.add(fn);\n return () => this.subscribers.delete(fn);\n }\n cancel() {\n this.controller.abort();\n this.pendingKeysSet.forEach((v, k) => this.pendingKeysSet.delete(k));\n this.emit(true);\n }\n async resolveData(signal) {\n let aborted = false;\n if (!this.done) {\n let onAbort = () => this.cancel();\n signal.addEventListener("abort", onAbort);\n aborted = await new Promise(resolve => {\n this.subscribe(aborted => {\n signal.removeEventListener("abort", onAbort);\n if (aborted || this.done) {\n resolve(aborted);\n }\n });\n });\n }\n return aborted;\n }\n get done() {\n return this.pendingKeysSet.size === 0;\n }\n get unwrappedData() {\n router_invariant(this.data !== null && this.done, "Can only unwrap data on initialized and settled deferreds");\n return Object.entries(this.data).reduce((acc, _ref3) => {\n let [key, value] = _ref3;\n return Object.assign(acc, {\n [key]: unwrapTrackedPromise(value)\n });\n }, {});\n }\n get pendingKeys() {\n return Array.from(this.pendingKeysSet);\n }\n}\nfunction isTrackedPromise(value) {\n return value instanceof Promise && value._tracked === true;\n}\nfunction unwrapTrackedPromise(value) {\n if (!isTrackedPromise(value)) {\n return value;\n }\n if (value._error) {\n throw value._error;\n }\n return value._data;\n}\nconst defer = function defer(data, init) {\n if (init === void 0) {\n init = {};\n }\n let responseInit = typeof init === "number" ? {\n status: init\n } : init;\n return new DeferredData(data, responseInit);\n};\n/**\n * A redirect response. Sets the status code and the `Location` header.\n * Defaults to "302 Found".\n */\nconst redirect = function redirect(url, init) {\n if (init === void 0) {\n init = 302;\n }\n let responseInit = init;\n if (typeof responseInit === "number") {\n responseInit = {\n status: responseInit\n };\n } else if (typeof responseInit.status === "undefined") {\n responseInit.status = 302;\n }\n let headers = new Headers(responseInit.headers);\n headers.set("Location", url);\n return new Response(null, router_extends({}, responseInit, {\n headers\n }));\n};\n/**\n * A redirect response that will force a document reload to the new location.\n * Sets the status code and the `Location` header.\n * Defaults to "302 Found".\n */\nconst redirectDocument = (url, init) => {\n let response = redirect(url, init);\n response.headers.set("X-Remix-Reload-Document", "true");\n return response;\n};\n/**\n * @private\n * Utility class we use to hold auto-unwrapped 4xx/5xx Response bodies\n *\n * We don\'t export the class for public use since it\'s an implementation\n * detail, but we export the interface above so folks can build their own\n * abstractions around instances via isRouteErrorResponse()\n */\nclass ErrorResponseImpl {\n constructor(status, statusText, data, internal) {\n if (internal === void 0) {\n internal = false;\n }\n this.status = status;\n this.statusText = statusText || "";\n this.internal = internal;\n if (data instanceof Error) {\n this.data = data.toString();\n this.error = data;\n } else {\n this.data = data;\n }\n }\n}\n/**\n * Check if the given error is an ErrorResponse generated from a 4xx/5xx\n * Response thrown from an action/loader\n */\nfunction isRouteErrorResponse(error) {\n return error != null && typeof error.status === "number" && typeof error.statusText === "string" && typeof error.internal === "boolean" && "data" in error;\n}\n\nconst validMutationMethodsArr = ["post", "put", "patch", "delete"];\nconst validMutationMethods = new Set(validMutationMethodsArr);\nconst validRequestMethodsArr = ["get", ...validMutationMethodsArr];\nconst validRequestMethods = new Set(validRequestMethodsArr);\nconst redirectStatusCodes = new Set([301, 302, 303, 307, 308]);\nconst redirectPreserveMethodStatusCodes = new Set([307, 308]);\nconst IDLE_NAVIGATION = {\n state: "idle",\n location: undefined,\n formMethod: undefined,\n formAction: undefined,\n formEncType: undefined,\n formData: undefined,\n json: undefined,\n text: undefined\n};\nconst router_IDLE_FETCHER = {\n state: "idle",\n data: undefined,\n formMethod: undefined,\n formAction: undefined,\n formEncType: undefined,\n formData: undefined,\n json: undefined,\n text: undefined\n};\nconst router_IDLE_BLOCKER = {\n state: "unblocked",\n proceed: undefined,\n reset: undefined,\n location: undefined\n};\nconst ABSOLUTE_URL_REGEX = /^(?:[a-z][a-z0-9+.-]*:|\\/\\/)/i;\nconst defaultMapRouteProperties = route => ({\n hasErrorBoundary: Boolean(route.hasErrorBoundary)\n});\nconst TRANSITIONS_STORAGE_KEY = "remix-router-transitions";\n//#endregion\n////////////////////////////////////////////////////////////////////////////////\n//#region createRouter\n////////////////////////////////////////////////////////////////////////////////\n/**\n * Create a router and listen to history POP navigations\n */\nfunction router_createRouter(init) {\n const routerWindow = init.window ? init.window : typeof window !== "undefined" ? window : undefined;\n const isBrowser = typeof routerWindow !== "undefined" && typeof routerWindow.document !== "undefined" && typeof routerWindow.document.createElement !== "undefined";\n const isServer = !isBrowser;\n router_invariant(init.routes.length > 0, "You must provide a non-empty routes array to createRouter");\n let mapRouteProperties;\n if (init.mapRouteProperties) {\n mapRouteProperties = init.mapRouteProperties;\n } else if (init.detectErrorBoundary) {\n // If they are still using the deprecated version, wrap it with the new API\n let detectErrorBoundary = init.detectErrorBoundary;\n mapRouteProperties = route => ({\n hasErrorBoundary: detectErrorBoundary(route)\n });\n } else {\n mapRouteProperties = defaultMapRouteProperties;\n }\n // Routes keyed by ID\n let manifest = {};\n // Routes in tree format for matching\n let dataRoutes = convertRoutesToDataRoutes(init.routes, mapRouteProperties, undefined, manifest);\n let inFlightDataRoutes;\n let basename = init.basename || "/";\n // Config driven behavior flags\n let future = router_extends({\n v7_fetcherPersist: false,\n v7_normalizeFormMethod: false,\n v7_prependBasename: false\n }, init.future);\n // Cleanup function for history\n let unlistenHistory = null;\n // Externally-provided functions to call on all state changes\n let subscribers = new Set();\n // Externally-provided object to hold scroll restoration locations during routing\n let savedScrollPositions = null;\n // Externally-provided function to get scroll restoration keys\n let getScrollRestorationKey = null;\n // Externally-provided function to get current scroll position\n let getScrollPosition = null;\n // One-time flag to control the initial hydration scroll restoration. Because\n // we don\'t get the saved positions from <ScrollRestoration /> until _after_\n // the initial render, we need to manually trigger a separate updateState to\n // send along the restoreScrollPosition\n // Set to true if we have `hydrationData` since we assume we were SSR\'d and that\n // SSR did the initial scroll restoration.\n let initialScrollRestored = init.hydrationData != null;\n let initialMatches = matchRoutes(dataRoutes, init.history.location, basename);\n let initialErrors = null;\n if (initialMatches == null) {\n // If we do not match a user-provided-route, fall back to the root\n // to allow the error boundary to take over\n let error = getInternalRouterError(404, {\n pathname: init.history.location.pathname\n });\n let {\n matches,\n route\n } = getShortCircuitMatches(dataRoutes);\n initialMatches = matches;\n initialErrors = {\n [route.id]: error\n };\n }\n let initialized =\n // All initialMatches need to be loaded before we\'re ready. If we have lazy\n // functions around still then we\'ll need to run them in initialize()\n !initialMatches.some(m => m.route.lazy) && (\n // And we have to either have no loaders or have been provided hydrationData\n !initialMatches.some(m => m.route.loader) || init.hydrationData != null);\n let router;\n let state = {\n historyAction: init.history.action,\n location: init.history.location,\n matches: initialMatches,\n initialized,\n navigation: IDLE_NAVIGATION,\n // Don\'t restore on initial updateState() if we were SSR\'d\n restoreScrollPosition: init.hydrationData != null ? false : null,\n preventScrollReset: false,\n revalidation: "idle",\n loaderData: init.hydrationData && init.hydrationData.loaderData || {},\n actionData: init.hydrationData && init.hydrationData.actionData || null,\n errors: init.hydrationData && init.hydrationData.errors || initialErrors,\n fetchers: new Map(),\n blockers: new Map()\n };\n // -- Stateful internal variables to manage navigations --\n // Current navigation in progress (to be committed in completeNavigation)\n let pendingAction = Action.Pop;\n // Should the current navigation prevent the scroll reset if scroll cannot\n // be restored?\n let pendingPreventScrollReset = false;\n // AbortController for the active navigation\n let pendingNavigationController;\n // Should the current navigation enable document.startViewTransition?\n let pendingViewTransitionEnabled = false;\n // Store applied view transitions so we can apply them on POP\n let appliedViewTransitions = new Map();\n // Cleanup function for persisting applied transitions to sessionStorage\n let removePageHideEventListener = null;\n // We use this to avoid touching history in completeNavigation if a\n // revalidation is entirely uninterrupted\n let isUninterruptedRevalidation = false;\n // Use this internal flag to force revalidation of all loaders:\n // - submissions (completed or interrupted)\n // - useRevalidator()\n // - X-Remix-Revalidate (from redirect)\n let isRevalidationRequired = false;\n // Use this internal array to capture routes that require revalidation due\n // to a cancelled deferred on action submission\n let cancelledDeferredRoutes = [];\n // Use this internal array to capture fetcher loads that were cancelled by an\n // action navigation and require revalidation\n let cancelledFetcherLoads = [];\n // AbortControllers for any in-flight fetchers\n let fetchControllers = new Map();\n // Track loads based on the order in which they started\n let incrementingLoadId = 0;\n // Track the outstanding pending navigation data load to be compared against\n // the globally incrementing load when a fetcher load lands after a completed\n // navigation\n let pendingNavigationLoadId = -1;\n // Fetchers that triggered data reloads as a result of their actions\n let fetchReloadIds = new Map();\n // Fetchers that triggered redirect navigations\n let fetchRedirectIds = new Set();\n // Most recent href/match for fetcher.load calls for fetchers\n let fetchLoadMatches = new Map();\n // Ref-count mounted fetchers so we know when it\'s ok to clean them up\n let activeFetchers = new Map();\n // Fetchers that have requested a delete when using v7_fetcherPersist,\n // they\'ll be officially removed after they return to idle\n let deletedFetchers = new Set();\n // Store DeferredData instances for active route matches. When a\n // route loader returns defer() we stick one in here. Then, when a nested\n // promise resolves we update loaderData. If a new navigation starts we\n // cancel active deferreds for eliminated routes.\n let activeDeferreds = new Map();\n // Store blocker functions in a separate Map outside of router state since\n // we don\'t need to update UI state if they change\n let blockerFunctions = new Map();\n // Flag to ignore the next history update, so we can revert the URL change on\n // a POP navigation that was blocked by the user without touching router state\n let ignoreNextHistoryUpdate = false;\n // Initialize the router, all side effects should be kicked off from here.\n // Implemented as a Fluent API for ease of:\n // let router = createRouter(init).initialize();\n function initialize() {\n // If history informs us of a POP navigation, start the navigation but do not update\n // state. We\'ll update our own state once the navigation completes\n unlistenHistory = init.history.listen(_ref => {\n let {\n action: historyAction,\n location,\n delta\n } = _ref;\n // Ignore this event if it was just us resetting the URL from a\n // blocked POP navigation\n if (ignoreNextHistoryUpdate) {\n ignoreNextHistoryUpdate = false;\n return;\n }\n warning(blockerFunctions.size === 0 || delta != null, "You are trying to use a blocker on a POP navigation to a location " + "that was not created by @remix-run/router. This will fail silently in " + "production. This can happen if you are navigating outside the router " + "via `window.history.pushState`/`window.location.hash` instead of using " + "router navigation APIs. This can also happen if you are using " + "createHashRouter and the user manually changes the URL.");\n let blockerKey = shouldBlockNavigation({\n currentLocation: state.location,\n nextLocation: location,\n historyAction\n });\n if (blockerKey && delta != null) {\n // Restore the URL to match the current UI, but don\'t update router state\n ignoreNextHistoryUpdate = true;\n init.history.go(delta * -1);\n // Put the blocker into a blocked state\n updateBlocker(blockerKey, {\n state: "blocked",\n location,\n proceed() {\n updateBlocker(blockerKey, {\n state: "proceeding",\n proceed: undefined,\n reset: undefined,\n location\n });\n // Re-do the same POP navigation we just blocked\n init.history.go(delta);\n },\n reset() {\n let blockers = new Map(state.blockers);\n blockers.set(blockerKey, router_IDLE_BLOCKER);\n updateState({\n blockers\n });\n }\n });\n return;\n }\n return startNavigation(historyAction, location);\n });\n if (isBrowser) {\n // FIXME: This feels gross. How can we cleanup the lines between\n // scrollRestoration/appliedTransitions persistance?\n restoreAppliedTransitions(routerWindow, appliedViewTransitions);\n let _saveAppliedTransitions = () => persistAppliedTransitions(routerWindow, appliedViewTransitions);\n routerWindow.addEventListener("pagehide", _saveAppliedTransitions);\n removePageHideEventListener = () => routerWindow.removeEventListener("pagehide", _saveAppliedTransitions);\n }\n // Kick off initial data load if needed. Use Pop to avoid modifying history\n // Note we don\'t do any handling of lazy here. For SPA\'s it\'ll get handled\n // in the normal navigation flow. For SSR it\'s expected that lazy modules are\n // resolved prior to router creation since we can\'t go into a fallbackElement\n // UI for SSR\'d apps\n if (!state.initialized) {\n startNavigation(Action.Pop, state.location);\n }\n return router;\n }\n // Clean up a router and it\'s side effects\n function dispose() {\n if (unlistenHistory) {\n unlistenHistory();\n }\n if (removePageHideEventListener) {\n removePageHideEventListener();\n }\n subscribers.clear();\n pendingNavigationController && pendingNavigationController.abort();\n state.fetchers.forEach((_, key) => deleteFetcher(key));\n state.blockers.forEach((_, key) => deleteBlocker(key));\n }\n // Subscribe to state updates for the router\n function subscribe(fn) {\n subscribers.add(fn);\n return () => subscribers.delete(fn);\n }\n // Update our state and notify the calling context of the change\n function updateState(newState, opts) {\n if (opts === void 0) {\n opts = {};\n }\n state = router_extends({}, state, newState);\n // Prep fetcher cleanup so we can tell the UI which fetcher data entries\n // can be removed\n let completedFetchers = [];\n let deletedFetchersKeys = [];\n if (future.v7_fetcherPersist) {\n state.fetchers.forEach((fetcher, key) => {\n if (fetcher.state === "idle") {\n if (deletedFetchers.has(key)) {\n // Unmounted from the UI and can be totally removed\n deletedFetchersKeys.push(key);\n } else {\n // Returned to idle but still mounted in the UI, so semi-remains for\n // revalidations and such\n completedFetchers.push(key);\n }\n }\n });\n }\n // Iterate over a local copy so that if flushSync is used and we end up\n // removing and adding a new subscriber due to the useCallback dependencies,\n // we don\'t get ourselves into a loop calling the new subscriber immediately\n [...subscribers].forEach(subscriber => subscriber(state, {\n deletedFetchers: deletedFetchersKeys,\n unstable_viewTransitionOpts: opts.viewTransitionOpts,\n unstable_flushSync: opts.flushSync === true\n }));\n // Remove idle fetchers from state since we only care about in-flight fetchers.\n if (future.v7_fetcherPersist) {\n completedFetchers.forEach(key => state.fetchers.delete(key));\n deletedFetchersKeys.forEach(key => deleteFetcher(key));\n }\n }\n // Complete a navigation returning the state.navigation back to the IDLE_NAVIGATION\n // and setting state.[historyAction/location/matches] to the new route.\n // - Location is a required param\n // - Navigation will always be set to IDLE_NAVIGATION\n // - Can pass any other state in newState\n function completeNavigation(location, newState, _temp) {\n var _location$state, _location$state2;\n let {\n flushSync\n } = _temp === void 0 ? {} : _temp;\n // Deduce if we\'re in a loading/actionReload state:\n // - We have committed actionData in the store\n // - The current navigation was a mutation submission\n // - We\'re past the submitting state and into the loading state\n // - The location being loaded is not the result of a redirect\n let isActionReload = state.actionData != null && state.navigation.formMethod != null && isMutationMethod(state.navigation.formMethod) && state.navigation.state === "loading" && ((_location$state = location.state) == null ? void 0 : _location$state._isRedirect) !== true;\n let actionData;\n if (newState.actionData) {\n if (Object.keys(newState.actionData).length > 0) {\n actionData = newState.actionData;\n } else {\n // Empty actionData -> clear prior actionData due to an action error\n actionData = null;\n }\n } else if (isActionReload) {\n // Keep the current data if we\'re wrapping up the action reload\n actionData = state.actionData;\n } else {\n // Clear actionData on any other completed navigations\n actionData = null;\n }\n // Always preserve any existing loaderData from re-used routes\n let loaderData = newState.loaderData ? mergeLoaderData(state.loaderData, newState.loaderData, newState.matches || [], newState.errors) : state.loaderData;\n // On a successful navigation we can assume we got through all blockers\n // so we can start fresh\n let blockers = state.blockers;\n if (blockers.size > 0) {\n blockers = new Map(blockers);\n blockers.forEach((_, k) => blockers.set(k, router_IDLE_BLOCKER));\n }\n // Always respect the user flag. Otherwise don\'t reset on mutation\n // submission navigations unless they redirect\n let preventScrollReset = pendingPreventScrollReset === true || state.navigation.formMethod != null && isMutationMethod(state.navigation.formMethod) && ((_location$state2 = location.state) == null ? void 0 : _location$state2._isRedirect) !== true;\n if (inFlightDataRoutes) {\n dataRoutes = inFlightDataRoutes;\n inFlightDataRoutes = undefined;\n }\n if (isUninterruptedRevalidation) ; else if (pendingAction === Action.Pop) ; else if (pendingAction === Action.Push) {\n init.history.push(location, location.state);\n } else if (pendingAction === Action.Replace) {\n init.history.replace(location, location.state);\n }\n let viewTransitionOpts;\n // On POP, enable transitions if they were enabled on the original navigation\n if (pendingAction === Action.Pop) {\n // Forward takes precedence so they behave like the original navigation\n let priorPaths = appliedViewTransitions.get(state.location.pathname);\n if (priorPaths && priorPaths.has(location.pathname)) {\n viewTransitionOpts = {\n currentLocation: state.location,\n nextLocation: location\n };\n } else if (appliedViewTransitions.has(location.pathname)) {\n // If we don\'t have a previous forward nav, assume we\'re popping back to\n // the new location and enable if that location previously enabled\n viewTransitionOpts = {\n currentLocation: location,\n nextLocation: state.location\n };\n }\n } else if (pendingViewTransitionEnabled) {\n // Store the applied transition on PUSH/REPLACE\n let toPaths = appliedViewTransitions.get(state.location.pathname);\n if (toPaths) {\n toPaths.add(location.pathname);\n } else {\n toPaths = new Set([location.pathname]);\n appliedViewTransitions.set(state.location.pathname, toPaths);\n }\n viewTransitionOpts = {\n currentLocation: state.location,\n nextLocation: location\n };\n }\n updateState(router_extends({}, newState, {\n actionData,\n loaderData,\n historyAction: pendingAction,\n location,\n initialized: true,\n navigation: IDLE_NAVIGATION,\n revalidation: "idle",\n restoreScrollPosition: getSavedScrollPosition(location, newState.matches || state.matches),\n preventScrollReset,\n blockers\n }), {\n viewTransitionOpts,\n flushSync: flushSync === true\n });\n // Reset stateful navigation vars\n pendingAction = Action.Pop;\n pendingPreventScrollReset = false;\n pendingViewTransitionEnabled = false;\n isUninterruptedRevalidation = false;\n isRevalidationRequired = false;\n cancelledDeferredRoutes = [];\n cancelledFetcherLoads = [];\n }\n // Trigger a navigation event, which can either be a numerical POP or a PUSH\n // replace with an optional submission\n async function navigate(to, opts) {\n if (typeof to === "number") {\n init.history.go(to);\n return;\n }\n let normalizedPath = normalizeTo(state.location, state.matches, basename, future.v7_prependBasename, to, opts == null ? void 0 : opts.fromRouteId, opts == null ? void 0 : opts.relative);\n let {\n path,\n submission,\n error\n } = normalizeNavigateOptions(future.v7_normalizeFormMethod, false, normalizedPath, opts);\n let currentLocation = state.location;\n let nextLocation = createLocation(state.location, path, opts && opts.state);\n // When using navigate as a PUSH/REPLACE we aren\'t reading an already-encoded\n // URL from window.location, so we need to encode it here so the behavior\n // remains the same as POP and non-data-router usages. new URL() does all\n // the same encoding we\'d get from a history.pushState/window.location read\n // without having to touch history\n nextLocation = router_extends({}, nextLocation, init.history.encodeLocation(nextLocation));\n let userReplace = opts && opts.replace != null ? opts.replace : undefined;\n let historyAction = Action.Push;\n if (userReplace === true) {\n historyAction = Action.Replace;\n } else if (userReplace === false) ; else if (submission != null && isMutationMethod(submission.formMethod) && submission.formAction === state.location.pathname + state.location.search) {\n // By default on submissions to the current location we REPLACE so that\n // users don\'t have to double-click the back button to get to the prior\n // location. If the user redirects to a different location from the\n // action/loader this will be ignored and the redirect will be a PUSH\n historyAction = Action.Replace;\n }\n let preventScrollReset = opts && "preventScrollReset" in opts ? opts.preventScrollReset === true : undefined;\n let flushSync = (opts && opts.unstable_flushSync) === true;\n let blockerKey = shouldBlockNavigation({\n currentLocation,\n nextLocation,\n historyAction\n });\n if (blockerKey) {\n // Put the blocker into a blocked state\n updateBlocker(blockerKey, {\n state: "blocked",\n location: nextLocation,\n proceed() {\n updateBlocker(blockerKey, {\n state: "proceeding",\n proceed: undefined,\n reset: undefined,\n location: nextLocation\n });\n // Send the same navigation through\n navigate(to, opts);\n },\n reset() {\n let blockers = new Map(state.blockers);\n blockers.set(blockerKey, router_IDLE_BLOCKER);\n updateState({\n blockers\n });\n }\n });\n return;\n }\n return await startNavigation(historyAction, nextLocation, {\n submission,\n // Send through the formData serialization error if we have one so we can\n // render at the right error boundary after we match routes\n pendingError: error,\n preventScrollReset,\n replace: opts && opts.replace,\n enableViewTransition: opts && opts.unstable_viewTransition,\n flushSync\n });\n }\n // Revalidate all current loaders. If a navigation is in progress or if this\n // is interrupted by a navigation, allow this to "succeed" by calling all\n // loaders during the next loader round\n function revalidate() {\n interruptActiveLoads();\n updateState({\n revalidation: "loading"\n });\n // If we\'re currently submitting an action, we don\'t need to start a new\n // navigation, we\'ll just let the follow up loader execution call all loaders\n if (state.navigation.state === "submitting") {\n return;\n }\n // If we\'re currently in an idle state, start a new navigation for the current\n // action/location and mark it as uninterrupted, which will skip the history\n // update in completeNavigation\n if (state.navigation.state === "idle") {\n startNavigation(state.historyAction, state.location, {\n startUninterruptedRevalidation: true\n });\n return;\n }\n // Otherwise, if we\'re currently in a loading state, just start a new\n // navigation to the navigation.location but do not trigger an uninterrupted\n // revalidation so that history correctly updates once the navigation completes\n startNavigation(pendingAction || state.historyAction, state.navigation.location, {\n overrideNavigation: state.navigation\n });\n }\n // Start a navigation to the given action/location. Can optionally provide a\n // overrideNavigation which will override the normalLoad in the case of a redirect\n // navigation\n async function startNavigation(historyAction, location, opts) {\n // Abort any in-progress navigations and start a new one. Unset any ongoing\n // uninterrupted revalidations unless told otherwise, since we want this\n // new navigation to update history normally\n pendingNavigationController && pendingNavigationController.abort();\n pendingNavigationController = null;\n pendingAction = historyAction;\n isUninterruptedRevalidation = (opts && opts.startUninterruptedRevalidation) === true;\n // Save the current scroll position every time we start a new navigation,\n // and track whether we should reset scroll on completion\n saveScrollPosition(state.location, state.matches);\n pendingPreventScrollReset = (opts && opts.preventScrollReset) === true;\n pendingViewTransitionEnabled = (opts && opts.enableViewTransition) === true;\n let routesToUse = inFlightDataRoutes || dataRoutes;\n let loadingNavigation = opts && opts.overrideNavigation;\n let matches = matchRoutes(routesToUse, location, basename);\n let flushSync = (opts && opts.flushSync) === true;\n // Short circuit with a 404 on the root error boundary if we match nothing\n if (!matches) {\n let error = getInternalRouterError(404, {\n pathname: location.pathname\n });\n let {\n matches: notFoundMatches,\n route\n } = getShortCircuitMatches(routesToUse);\n // Cancel all pending deferred on 404s since we don\'t keep any routes\n cancelActiveDeferreds();\n completeNavigation(location, {\n matches: notFoundMatches,\n loaderData: {},\n errors: {\n [route.id]: error\n }\n }, {\n flushSync\n });\n return;\n }\n // Short circuit if it\'s only a hash change and not a revalidation or\n // mutation submission.\n //\n // Ignore on initial page loads because since the initial load will always\n // be "same hash". For example, on /page#hash and submit a <Form method="post">\n // which will default to a navigation to /page\n if (state.initialized && !isRevalidationRequired && isHashChangeOnly(state.location, location) && !(opts && opts.submission && isMutationMethod(opts.submission.formMethod))) {\n completeNavigation(location, {\n matches\n }, {\n flushSync\n });\n return;\n }\n // Create a controller/Request for this navigation\n pendingNavigationController = new AbortController();\n let request = createClientSideRequest(init.history, location, pendingNavigationController.signal, opts && opts.submission);\n let pendingActionData;\n let pendingError;\n if (opts && opts.pendingError) {\n // If we have a pendingError, it means the user attempted a GET submission\n // with binary FormData so assign here and skip to handleLoaders. That\n // way we handle calling loaders above the boundary etc. It\'s not really\n // different from an actionError in that sense.\n pendingError = {\n [findNearestBoundary(matches).route.id]: opts.pendingError\n };\n } else if (opts && opts.submission && isMutationMethod(opts.submission.formMethod)) {\n // Call action if we received an action submission\n let actionOutput = await handleAction(request, location, opts.submission, matches, {\n replace: opts.replace,\n flushSync\n });\n if (actionOutput.shortCircuited) {\n return;\n }\n pendingActionData = actionOutput.pendingActionData;\n pendingError = actionOutput.pendingActionError;\n loadingNavigation = getLoadingNavigation(location, opts.submission);\n flushSync = false;\n // Create a GET request for the loaders\n request = new Request(request.url, {\n signal: request.signal\n });\n }\n // Call loaders\n let {\n shortCircuited,\n loaderData,\n errors\n } = await handleLoaders(request, location, matches, loadingNavigation, opts && opts.submission, opts && opts.fetcherSubmission, opts && opts.replace, flushSync, pendingActionData, pendingError);\n if (shortCircuited) {\n return;\n }\n // Clean up now that the action/loaders have completed. Don\'t clean up if\n // we short circuited because pendingNavigationController will have already\n // been assigned to a new controller for the next navigation\n pendingNavigationController = null;\n completeNavigation(location, router_extends({\n matches\n }, pendingActionData ? {\n actionData: pendingActionData\n } : {}, {\n loaderData,\n errors\n }));\n }\n // Call the action matched by the leaf route for this navigation and handle\n // redirects/errors\n async function handleAction(request, location, submission, matches, opts) {\n if (opts === void 0) {\n opts = {};\n }\n interruptActiveLoads();\n // Put us in a submitting state\n let navigation = getSubmittingNavigation(location, submission);\n updateState({\n navigation\n }, {\n flushSync: opts.flushSync === true\n });\n // Call our action and get the result\n let result;\n let actionMatch = getTargetMatch(matches, location);\n if (!actionMatch.route.action && !actionMatch.route.lazy) {\n result = {\n type: ResultType.error,\n error: getInternalRouterError(405, {\n method: request.method,\n pathname: location.pathname,\n routeId: actionMatch.route.id\n })\n };\n } else {\n result = await callLoaderOrAction("action", request, actionMatch, matches, manifest, mapRouteProperties, basename);\n if (request.signal.aborted) {\n return {\n shortCircuited: true\n };\n }\n }\n if (isRedirectResult(result)) {\n let replace;\n if (opts && opts.replace != null) {\n replace = opts.replace;\n } else {\n // If the user didn\'t explicity indicate replace behavior, replace if\n // we redirected to the exact same location we\'re currently at to avoid\n // double back-buttons\n replace = result.location === state.location.pathname + state.location.search;\n }\n await startRedirectNavigation(state, result, {\n submission,\n replace\n });\n return {\n shortCircuited: true\n };\n }\n if (isErrorResult(result)) {\n // Store off the pending error - we use it to determine which loaders\n // to call and will commit it when we complete the navigation\n let boundaryMatch = findNearestBoundary(matches, actionMatch.route.id);\n // By default, all submissions are REPLACE navigations, but if the\n // action threw an error that\'ll be rendered in an errorElement, we fall\n // back to PUSH so that the user can use the back button to get back to\n // the pre-submission form location to try again\n if ((opts && opts.replace) !== true) {\n pendingAction = Action.Push;\n }\n return {\n // Send back an empty object we can use to clear out any prior actionData\n pendingActionData: {},\n pendingActionError: {\n [boundaryMatch.route.id]: result.error\n }\n };\n }\n if (isDeferredResult(result)) {\n throw getInternalRouterError(400, {\n type: "defer-action"\n });\n }\n return {\n pendingActionData: {\n [actionMatch.route.id]: result.data\n }\n };\n }\n // Call all applicable loaders for the given matches, handling redirects,\n // errors, etc.\n async function handleLoaders(request, location, matches, overrideNavigation, submission, fetcherSubmission, replace, flushSync, pendingActionData, pendingError) {\n // Figure out the right navigation we want to use for data loading\n let loadingNavigation = overrideNavigation || getLoadingNavigation(location, submission);\n // If this was a redirect from an action we don\'t have a "submission" but\n // we have it on the loading navigation so use that if available\n let activeSubmission = submission || fetcherSubmission || getSubmissionFromNavigation(loadingNavigation);\n let routesToUse = inFlightDataRoutes || dataRoutes;\n let [matchesToLoad, revalidatingFetchers] = getMatchesToLoad(init.history, state, matches, activeSubmission, location, isRevalidationRequired, cancelledDeferredRoutes, cancelledFetcherLoads, deletedFetchers, fetchLoadMatches, fetchRedirectIds, routesToUse, basename, pendingActionData, pendingError);\n // Cancel pending deferreds for no-longer-matched routes or routes we\'re\n // about to reload. Note that if this is an action reload we would have\n // already cancelled all pending deferreds so this would be a no-op\n cancelActiveDeferreds(routeId => !(matches && matches.some(m => m.route.id === routeId)) || matchesToLoad && matchesToLoad.some(m => m.route.id === routeId));\n pendingNavigationLoadId = ++incrementingLoadId;\n // Short circuit if we have no loaders to run\n if (matchesToLoad.length === 0 && revalidatingFetchers.length === 0) {\n let updatedFetchers = markFetchRedirectsDone();\n completeNavigation(location, router_extends({\n matches,\n loaderData: {},\n // Commit pending error if we\'re short circuiting\n errors: pendingError || null\n }, pendingActionData ? {\n actionData: pendingActionData\n } : {}, updatedFetchers ? {\n fetchers: new Map(state.fetchers)\n } : {}), {\n flushSync\n });\n return {\n shortCircuited: true\n };\n }\n // If this is an uninterrupted revalidation, we remain in our current idle\n // state. If not, we need to switch to our loading state and load data,\n // preserving any new action data or existing action data (in the case of\n // a revalidation interrupting an actionReload)\n if (!isUninterruptedRevalidation) {\n revalidatingFetchers.forEach(rf => {\n let fetcher = state.fetchers.get(rf.key);\n let revalidatingFetcher = getLoadingFetcher(undefined, fetcher ? fetcher.data : undefined);\n state.fetchers.set(rf.key, revalidatingFetcher);\n });\n let actionData = pendingActionData || state.actionData;\n updateState(router_extends({\n navigation: loadingNavigation\n }, actionData ? Object.keys(actionData).length === 0 ? {\n actionData: null\n } : {\n actionData\n } : {}, revalidatingFetchers.length > 0 ? {\n fetchers: new Map(state.fetchers)\n } : {}), {\n flushSync\n });\n }\n revalidatingFetchers.forEach(rf => {\n if (fetchControllers.has(rf.key)) {\n abortFetcher(rf.key);\n }\n if (rf.controller) {\n // Fetchers use an independent AbortController so that aborting a fetcher\n // (via deleteFetcher) does not abort the triggering navigation that\n // triggered the revalidation\n fetchControllers.set(rf.key, rf.controller);\n }\n });\n // Proxy navigation abort through to revalidation fetchers\n let abortPendingFetchRevalidations = () => revalidatingFetchers.forEach(f => abortFetcher(f.key));\n if (pendingNavigationController) {\n pendingNavigationController.signal.addEventListener("abort", abortPendingFetchRevalidations);\n }\n let {\n results,\n loaderResults,\n fetcherResults\n } = await callLoadersAndMaybeResolveData(state.matches, matches, matchesToLoad, revalidatingFetchers, request);\n if (request.signal.aborted) {\n return {\n shortCircuited: true\n };\n }\n // Clean up _after_ loaders have completed. Don\'t clean up if we short\n // circuited because fetchControllers would have been aborted and\n // reassigned to new controllers for the next navigation\n if (pendingNavigationController) {\n pendingNavigationController.signal.removeEventListener("abort", abortPendingFetchRevalidations);\n }\n revalidatingFetchers.forEach(rf => fetchControllers.delete(rf.key));\n // If any loaders returned a redirect Response, start a new REPLACE navigation\n let redirect = findRedirect(results);\n if (redirect) {\n if (redirect.idx >= matchesToLoad.length) {\n // If this redirect came from a fetcher make sure we mark it in\n // fetchRedirectIds so it doesn\'t get revalidated on the next set of\n // loader executions\n let fetcherKey = revalidatingFetchers[redirect.idx - matchesToLoad.length].key;\n fetchRedirectIds.add(fetcherKey);\n }\n await startRedirectNavigation(state, redirect.result, {\n replace\n });\n return {\n shortCircuited: true\n };\n }\n // Process and commit output from loaders\n let {\n loaderData,\n errors\n } = processLoaderData(state, matches, matchesToLoad, loaderResults, pendingError, revalidatingFetchers, fetcherResults, activeDeferreds);\n // Wire up subscribers to update loaderData as promises settle\n activeDeferreds.forEach((deferredData, routeId) => {\n deferredData.subscribe(aborted => {\n // Note: No need to updateState here since the TrackedPromise on\n // loaderData is stable across resolve/reject\n // Remove this instance if we were aborted or if promises have settled\n if (aborted || deferredData.done) {\n activeDeferreds.delete(routeId);\n }\n });\n });\n let updatedFetchers = markFetchRedirectsDone();\n let didAbortFetchLoads = abortStaleFetchLoads(pendingNavigationLoadId);\n let shouldUpdateFetchers = updatedFetchers || didAbortFetchLoads || revalidatingFetchers.length > 0;\n return router_extends({\n loaderData,\n errors\n }, shouldUpdateFetchers ? {\n fetchers: new Map(state.fetchers)\n } : {});\n }\n // Trigger a fetcher load/submit for the given fetcher key\n function fetch(key, routeId, href, opts) {\n if (isServer) {\n throw new Error("router.fetch() was called during the server render, but it shouldn\'t be. " + "You are likely calling a useFetcher() method in the body of your component. " + "Try moving it to a useEffect or a callback.");\n }\n if (fetchControllers.has(key)) abortFetcher(key);\n let flushSync = (opts && opts.unstable_flushSync) === true;\n let routesToUse = inFlightDataRoutes || dataRoutes;\n let normalizedPath = normalizeTo(state.location, state.matches, basename, future.v7_prependBasename, href, routeId, opts == null ? void 0 : opts.relative);\n let matches = matchRoutes(routesToUse, normalizedPath, basename);\n if (!matches) {\n setFetcherError(key, routeId, getInternalRouterError(404, {\n pathname: normalizedPath\n }), {\n flushSync\n });\n return;\n }\n let {\n path,\n submission,\n error\n } = normalizeNavigateOptions(future.v7_normalizeFormMethod, true, normalizedPath, opts);\n if (error) {\n setFetcherError(key, routeId, error, {\n flushSync\n });\n return;\n }\n let match = getTargetMatch(matches, path);\n pendingPreventScrollReset = (opts && opts.preventScrollReset) === true;\n if (submission && isMutationMethod(submission.formMethod)) {\n handleFetcherAction(key, routeId, path, match, matches, flushSync, submission);\n return;\n }\n // Store off the match so we can call it\'s shouldRevalidate on subsequent\n // revalidations\n fetchLoadMatches.set(key, {\n routeId,\n path\n });\n handleFetcherLoader(key, routeId, path, match, matches, flushSync, submission);\n }\n // Call the action for the matched fetcher.submit(), and then handle redirects,\n // errors, and revalidation\n async function handleFetcherAction(key, routeId, path, match, requestMatches, flushSync, submission) {\n interruptActiveLoads();\n fetchLoadMatches.delete(key);\n if (!match.route.action && !match.route.lazy) {\n let error = getInternalRouterError(405, {\n method: submission.formMethod,\n pathname: path,\n routeId: routeId\n });\n setFetcherError(key, routeId, error, {\n flushSync\n });\n return;\n }\n // Put this fetcher into it\'s submitting state\n let existingFetcher = state.fetchers.get(key);\n updateFetcherState(key, getSubmittingFetcher(submission, existingFetcher), {\n flushSync\n });\n // Call the action for the fetcher\n let abortController = new AbortController();\n let fetchRequest = createClientSideRequest(init.history, path, abortController.signal, submission);\n fetchControllers.set(key, abortController);\n let originatingLoadId = incrementingLoadId;\n let actionResult = await callLoaderOrAction("action", fetchRequest, match, requestMatches, manifest, mapRouteProperties, basename);\n if (fetchRequest.signal.aborted) {\n // We can delete this so long as we weren\'t aborted by our own fetcher\n // re-submit which would have put _new_ controller is in fetchControllers\n if (fetchControllers.get(key) === abortController) {\n fetchControllers.delete(key);\n }\n return;\n }\n if (deletedFetchers.has(key)) {\n updateFetcherState(key, getDoneFetcher(undefined));\n return;\n }\n if (isRedirectResult(actionResult)) {\n fetchControllers.delete(key);\n if (pendingNavigationLoadId > originatingLoadId) {\n // A new navigation was kicked off after our action started, so that\n // should take precedence over this redirect navigation. We already\n // set isRevalidationRequired so all loaders for the new route should\n // fire unless opted out via shouldRevalidate\n updateFetcherState(key, getDoneFetcher(undefined));\n return;\n } else {\n fetchRedirectIds.add(key);\n updateFetcherState(key, getLoadingFetcher(submission));\n return startRedirectNavigation(state, actionResult, {\n fetcherSubmission: submission\n });\n }\n }\n // Process any non-redirect errors thrown\n if (isErrorResult(actionResult)) {\n setFetcherError(key, routeId, actionResult.error);\n return;\n }\n if (isDeferredResult(actionResult)) {\n throw getInternalRouterError(400, {\n type: "defer-action"\n });\n }\n // Start the data load for current matches, or the next location if we\'re\n // in the middle of a navigation\n let nextLocation = state.navigation.location || state.location;\n let revalidationRequest = createClientSideRequest(init.history, nextLocation, abortController.signal);\n let routesToUse = inFlightDataRoutes || dataRoutes;\n let matches = state.navigation.state !== "idle" ? matchRoutes(routesToUse, state.navigation.location, basename) : state.matches;\n router_invariant(matches, "Didn\'t find any matches after fetcher action");\n let loadId = ++incrementingLoadId;\n fetchReloadIds.set(key, loadId);\n let loadFetcher = getLoadingFetcher(submission, actionResult.data);\n state.fetchers.set(key, loadFetcher);\n let [matchesToLoad, revalidatingFetchers] = getMatchesToLoad(init.history, state, matches, submission, nextLocation, isRevalidationRequired, cancelledDeferredRoutes, cancelledFetcherLoads, deletedFetchers, fetchLoadMatches, fetchRedirectIds, routesToUse, basename, {\n [match.route.id]: actionResult.data\n }, undefined // No need to send through errors since we short circuit above\n );\n // Put all revalidating fetchers into the loading state, except for the\n // current fetcher which we want to keep in it\'s current loading state which\n // contains it\'s action submission info + action data\n revalidatingFetchers.filter(rf => rf.key !== key).forEach(rf => {\n let staleKey = rf.key;\n let existingFetcher = state.fetchers.get(staleKey);\n let revalidatingFetcher = getLoadingFetcher(undefined, existingFetcher ? existingFetcher.data : undefined);\n state.fetchers.set(staleKey, revalidatingFetcher);\n if (fetchControllers.has(staleKey)) {\n abortFetcher(staleKey);\n }\n if (rf.controller) {\n fetchControllers.set(staleKey, rf.controller);\n }\n });\n updateState({\n fetchers: new Map(state.fetchers)\n });\n let abortPendingFetchRevalidations = () => revalidatingFetchers.forEach(rf => abortFetcher(rf.key));\n abortController.signal.addEventListener("abort", abortPendingFetchRevalidations);\n let {\n results,\n loaderResults,\n fetcherResults\n } = await callLoadersAndMaybeResolveData(state.matches, matches, matchesToLoad, revalidatingFetchers, revalidationRequest);\n if (abortController.signal.aborted) {\n return;\n }\n abortController.signal.removeEventListener("abort", abortPendingFetchRevalidations);\n fetchReloadIds.delete(key);\n fetchControllers.delete(key);\n revalidatingFetchers.forEach(r => fetchControllers.delete(r.key));\n let redirect = findRedirect(results);\n if (redirect) {\n if (redirect.idx >= matchesToLoad.length) {\n // If this redirect came from a fetcher make sure we mark it in\n // fetchRedirectIds so it doesn\'t get revalidated on the next set of\n // loader executions\n let fetcherKey = revalidatingFetchers[redirect.idx - matchesToLoad.length].key;\n fetchRedirectIds.add(fetcherKey);\n }\n return startRedirectNavigation(state, redirect.result);\n }\n // Process and commit output from loaders\n let {\n loaderData,\n errors\n } = processLoaderData(state, state.matches, matchesToLoad, loaderResults, undefined, revalidatingFetchers, fetcherResults, activeDeferreds);\n // Since we let revalidations complete even if the submitting fetcher was\n // deleted, only put it back to idle if it hasn\'t been deleted\n if (state.fetchers.has(key)) {\n let doneFetcher = getDoneFetcher(actionResult.data);\n state.fetchers.set(key, doneFetcher);\n }\n abortStaleFetchLoads(loadId);\n // If we are currently in a navigation loading state and this fetcher is\n // more recent than the navigation, we want the newer data so abort the\n // navigation and complete it with the fetcher data\n if (state.navigation.state === "loading" && loadId > pendingNavigationLoadId) {\n router_invariant(pendingAction, "Expected pending action");\n pendingNavigationController && pendingNavigationController.abort();\n completeNavigation(state.navigation.location, {\n matches,\n loaderData,\n errors,\n fetchers: new Map(state.fetchers)\n });\n } else {\n // otherwise just update with the fetcher data, preserving any existing\n // loaderData for loaders that did not need to reload. We have to\n // manually merge here since we aren\'t going through completeNavigation\n updateState({\n errors,\n loaderData: mergeLoaderData(state.loaderData, loaderData, matches, errors),\n fetchers: new Map(state.fetchers)\n });\n isRevalidationRequired = false;\n }\n }\n // Call the matched loader for fetcher.load(), handling redirects, errors, etc.\n async function handleFetcherLoader(key, routeId, path, match, matches, flushSync, submission) {\n let existingFetcher = state.fetchers.get(key);\n updateFetcherState(key, getLoadingFetcher(submission, existingFetcher ? existingFetcher.data : undefined), {\n flushSync\n });\n // Call the loader for this fetcher route match\n let abortController = new AbortController();\n let fetchRequest = createClientSideRequest(init.history, path, abortController.signal);\n fetchControllers.set(key, abortController);\n let originatingLoadId = incrementingLoadId;\n let result = await callLoaderOrAction("loader", fetchRequest, match, matches, manifest, mapRouteProperties, basename);\n // Deferred isn\'t supported for fetcher loads, await everything and treat it\n // as a normal load. resolveDeferredData will return undefined if this\n // fetcher gets aborted, so we just leave result untouched and short circuit\n // below if that happens\n if (isDeferredResult(result)) {\n result = (await resolveDeferredData(result, fetchRequest.signal, true)) || result;\n }\n // We can delete this so long as we weren\'t aborted by our our own fetcher\n // re-load which would have put _new_ controller is in fetchControllers\n if (fetchControllers.get(key) === abortController) {\n fetchControllers.delete(key);\n }\n if (fetchRequest.signal.aborted) {\n return;\n }\n if (deletedFetchers.has(key)) {\n updateFetcherState(key, getDoneFetcher(undefined));\n return;\n }\n // If the loader threw a redirect Response, start a new REPLACE navigation\n if (isRedirectResult(result)) {\n if (pendingNavigationLoadId > originatingLoadId) {\n // A new navigation was kicked off after our loader started, so that\n // should take precedence over this redirect navigation\n updateFetcherState(key, getDoneFetcher(undefined));\n return;\n } else {\n fetchRedirectIds.add(key);\n await startRedirectNavigation(state, result);\n return;\n }\n }\n // Process any non-redirect errors thrown\n if (isErrorResult(result)) {\n setFetcherError(key, routeId, result.error);\n return;\n }\n router_invariant(!isDeferredResult(result), "Unhandled fetcher deferred data");\n // Put the fetcher back into an idle state\n updateFetcherState(key, getDoneFetcher(result.data));\n }\n /**\n * Utility function to handle redirects returned from an action or loader.\n * Normally, a redirect "replaces" the navigation that triggered it. So, for\n * example:\n *\n * - user is on /a\n * - user clicks a link to /b\n * - loader for /b redirects to /c\n *\n * In a non-JS app the browser would track the in-flight navigation to /b and\n * then replace it with /c when it encountered the redirect response. In\n * the end it would only ever update the URL bar with /c.\n *\n * In client-side routing using pushState/replaceState, we aim to emulate\n * this behavior and we also do not update history until the end of the\n * navigation (including processed redirects). This means that we never\n * actually touch history until we\'ve processed redirects, so we just use\n * the history action from the original navigation (PUSH or REPLACE).\n */\n async function startRedirectNavigation(state, redirect, _temp2) {\n let {\n submission,\n fetcherSubmission,\n replace\n } = _temp2 === void 0 ? {} : _temp2;\n if (redirect.revalidate) {\n isRevalidationRequired = true;\n }\n let redirectLocation = createLocation(state.location, redirect.location, {\n _isRedirect: true\n });\n router_invariant(redirectLocation, "Expected a location on the redirect navigation");\n if (isBrowser) {\n let isDocumentReload = false;\n if (redirect.reloadDocument) {\n // Hard reload if the response contained X-Remix-Reload-Document\n isDocumentReload = true;\n } else if (ABSOLUTE_URL_REGEX.test(redirect.location)) {\n const url = init.history.createURL(redirect.location);\n isDocumentReload =\n // Hard reload if it\'s an absolute URL to a new origin\n url.origin !== routerWindow.location.origin ||\n // Hard reload if it\'s an absolute URL that does not match our basename\n router_stripBasename(url.pathname, basename) == null;\n }\n if (isDocumentReload) {\n if (replace) {\n routerWindow.location.replace(redirect.location);\n } else {\n routerWindow.location.assign(redirect.location);\n }\n return;\n }\n }\n // There\'s no need to abort on redirects, since we don\'t detect the\n // redirect until the action/loaders have settled\n pendingNavigationController = null;\n let redirectHistoryAction = replace === true ? Action.Replace : Action.Push;\n // Use the incoming submission if provided, fallback on the active one in\n // state.navigation\n let {\n formMethod,\n formAction,\n formEncType\n } = state.navigation;\n if (!submission && !fetcherSubmission && formMethod && formAction && formEncType) {\n submission = getSubmissionFromNavigation(state.navigation);\n }\n // If this was a 307/308 submission we want to preserve the HTTP method and\n // re-submit the GET/POST/PUT/PATCH/DELETE as a submission navigation to the\n // redirected location\n let activeSubmission = submission || fetcherSubmission;\n if (redirectPreserveMethodStatusCodes.has(redirect.status) && activeSubmission && isMutationMethod(activeSubmission.formMethod)) {\n await startNavigation(redirectHistoryAction, redirectLocation, {\n submission: router_extends({}, activeSubmission, {\n formAction: redirect.location\n }),\n // Preserve this flag across redirects\n preventScrollReset: pendingPreventScrollReset\n });\n } else {\n // If we have a navigation submission, we will preserve it through the\n // redirect navigation\n let overrideNavigation = getLoadingNavigation(redirectLocation, submission);\n await startNavigation(redirectHistoryAction, redirectLocation, {\n overrideNavigation,\n // Send fetcher submissions through for shouldRevalidate\n fetcherSubmission,\n // Preserve this flag across redirects\n preventScrollReset: pendingPreventScrollReset\n });\n }\n }\n async function callLoadersAndMaybeResolveData(currentMatches, matches, matchesToLoad, fetchersToLoad, request) {\n // Call all navigation loaders and revalidating fetcher loaders in parallel,\n // then slice off the results into separate arrays so we can handle them\n // accordingly\n let results = await Promise.all([...matchesToLoad.map(match => callLoaderOrAction("loader", request, match, matches, manifest, mapRouteProperties, basename)), ...fetchersToLoad.map(f => {\n if (f.matches && f.match && f.controller) {\n return callLoaderOrAction("loader", createClientSideRequest(init.history, f.path, f.controller.signal), f.match, f.matches, manifest, mapRouteProperties, basename);\n } else {\n let error = {\n type: ResultType.error,\n error: getInternalRouterError(404, {\n pathname: f.path\n })\n };\n return error;\n }\n })]);\n let loaderResults = results.slice(0, matchesToLoad.length);\n let fetcherResults = results.slice(matchesToLoad.length);\n await Promise.all([resolveDeferredResults(currentMatches, matchesToLoad, loaderResults, loaderResults.map(() => request.signal), false, state.loaderData), resolveDeferredResults(currentMatches, fetchersToLoad.map(f => f.match), fetcherResults, fetchersToLoad.map(f => f.controller ? f.controller.signal : null), true)]);\n return {\n results,\n loaderResults,\n fetcherResults\n };\n }\n function interruptActiveLoads() {\n // Every interruption triggers a revalidation\n isRevalidationRequired = true;\n // Cancel pending route-level deferreds and mark cancelled routes for\n // revalidation\n cancelledDeferredRoutes.push(...cancelActiveDeferreds());\n // Abort in-flight fetcher loads\n fetchLoadMatches.forEach((_, key) => {\n if (fetchControllers.has(key)) {\n cancelledFetcherLoads.push(key);\n abortFetcher(key);\n }\n });\n }\n function updateFetcherState(key, fetcher, opts) {\n if (opts === void 0) {\n opts = {};\n }\n state.fetchers.set(key, fetcher);\n updateState({\n fetchers: new Map(state.fetchers)\n }, {\n flushSync: (opts && opts.flushSync) === true\n });\n }\n function setFetcherError(key, routeId, error, opts) {\n if (opts === void 0) {\n opts = {};\n }\n let boundaryMatch = findNearestBoundary(state.matches, routeId);\n deleteFetcher(key);\n updateState({\n errors: {\n [boundaryMatch.route.id]: error\n },\n fetchers: new Map(state.fetchers)\n }, {\n flushSync: (opts && opts.flushSync) === true\n });\n }\n function getFetcher(key) {\n if (future.v7_fetcherPersist) {\n activeFetchers.set(key, (activeFetchers.get(key) || 0) + 1);\n // If this fetcher was previously marked for deletion, unmark it since we\n // have a new instance\n if (deletedFetchers.has(key)) {\n deletedFetchers.delete(key);\n }\n }\n return state.fetchers.get(key) || router_IDLE_FETCHER;\n }\n function deleteFetcher(key) {\n let fetcher = state.fetchers.get(key);\n // Don\'t abort the controller if this is a deletion of a fetcher.submit()\n // in it\'s loading phase since - we don\'t want to abort the corresponding\n // revalidation and want them to complete and land\n if (fetchControllers.has(key) && !(fetcher && fetcher.state === "loading" && fetchReloadIds.has(key))) {\n abortFetcher(key);\n }\n fetchLoadMatches.delete(key);\n fetchReloadIds.delete(key);\n fetchRedirectIds.delete(key);\n deletedFetchers.delete(key);\n state.fetchers.delete(key);\n }\n function deleteFetcherAndUpdateState(key) {\n if (future.v7_fetcherPersist) {\n let count = (activeFetchers.get(key) || 0) - 1;\n if (count <= 0) {\n activeFetchers.delete(key);\n deletedFetchers.add(key);\n } else {\n activeFetchers.set(key, count);\n }\n } else {\n deleteFetcher(key);\n }\n updateState({\n fetchers: new Map(state.fetchers)\n });\n }\n function abortFetcher(key) {\n let controller = fetchControllers.get(key);\n router_invariant(controller, "Expected fetch controller: " + key);\n controller.abort();\n fetchControllers.delete(key);\n }\n function markFetchersDone(keys) {\n for (let key of keys) {\n let fetcher = getFetcher(key);\n let doneFetcher = getDoneFetcher(fetcher.data);\n state.fetchers.set(key, doneFetcher);\n }\n }\n function markFetchRedirectsDone() {\n let doneKeys = [];\n let updatedFetchers = false;\n for (let key of fetchRedirectIds) {\n let fetcher = state.fetchers.get(key);\n router_invariant(fetcher, "Expected fetcher: " + key);\n if (fetcher.state === "loading") {\n fetchRedirectIds.delete(key);\n doneKeys.push(key);\n updatedFetchers = true;\n }\n }\n markFetchersDone(doneKeys);\n return updatedFetchers;\n }\n function abortStaleFetchLoads(landedId) {\n let yeetedKeys = [];\n for (let [key, id] of fetchReloadIds) {\n if (id < landedId) {\n let fetcher = state.fetchers.get(key);\n router_invariant(fetcher, "Expected fetcher: " + key);\n if (fetcher.state === "loading") {\n abortFetcher(key);\n fetchReloadIds.delete(key);\n yeetedKeys.push(key);\n }\n }\n }\n markFetchersDone(yeetedKeys);\n return yeetedKeys.length > 0;\n }\n function getBlocker(key, fn) {\n let blocker = state.blockers.get(key) || router_IDLE_BLOCKER;\n if (blockerFunctions.get(key) !== fn) {\n blockerFunctions.set(key, fn);\n }\n return blocker;\n }\n function deleteBlocker(key) {\n state.blockers.delete(key);\n blockerFunctions.delete(key);\n }\n // Utility function to update blockers, ensuring valid state transitions\n function updateBlocker(key, newBlocker) {\n let blocker = state.blockers.get(key) || router_IDLE_BLOCKER;\n // Poor mans state machine :)\n // https://mermaid.live/edit#pako:eNqVkc9OwzAMxl8l8nnjAYrEtDIOHEBIgwvKJTReGy3_lDpIqO27k6awMG0XcrLlnz87nwdonESogKXXBuE79rq75XZO3-yHds0RJVuv70YrPlUrCEe2HfrORS3rubqZfuhtpg5C9wk5tZ4VKcRUq88q9Z8RS0-48cE1iHJkL0ugbHuFLus9L6spZy8nX9MP2CNdomVaposqu3fGayT8T8-jJQwhepo_UtpgBQaDEUom04dZhAN1aJBDlUKJBxE1ceB2Smj0Mln-IBW5AFU2dwUiktt_2Qaq2dBfaKdEup85UV7Yd-dKjlnkabl2Pvr0DTkTreM\n router_invariant(blocker.state === "unblocked" && newBlocker.state === "blocked" || blocker.state === "blocked" && newBlocker.state === "blocked" || blocker.state === "blocked" && newBlocker.state === "proceeding" || blocker.state === "blocked" && newBlocker.state === "unblocked" || blocker.state === "proceeding" && newBlocker.state === "unblocked", "Invalid blocker state transition: " + blocker.state + " -> " + newBlocker.state);\n let blockers = new Map(state.blockers);\n blockers.set(key, newBlocker);\n updateState({\n blockers\n });\n }\n function shouldBlockNavigation(_ref2) {\n let {\n currentLocation,\n nextLocation,\n historyAction\n } = _ref2;\n if (blockerFunctions.size === 0) {\n return;\n }\n // We ony support a single active blocker at the moment since we don\'t have\n // any compelling use cases for multi-blocker yet\n if (blockerFunctions.size > 1) {\n warning(false, "A router only supports one blocker at a time");\n }\n let entries = Array.from(blockerFunctions.entries());\n let [blockerKey, blockerFunction] = entries[entries.length - 1];\n let blocker = state.blockers.get(blockerKey);\n if (blocker && blocker.state === "proceeding") {\n // If the blocker is currently proceeding, we don\'t need to re-check\n // it and can let this navigation continue\n return;\n }\n // At this point, we know we\'re unblocked/blocked so we need to check the\n // user-provided blocker function\n if (blockerFunction({\n currentLocation,\n nextLocation,\n historyAction\n })) {\n return blockerKey;\n }\n }\n function cancelActiveDeferreds(predicate) {\n let cancelledRouteIds = [];\n activeDeferreds.forEach((dfd, routeId) => {\n if (!predicate || predicate(routeId)) {\n // Cancel the deferred - but do not remove from activeDeferreds here -\n // we rely on the subscribers to do that so our tests can assert proper\n // cleanup via _internalActiveDeferreds\n dfd.cancel();\n cancelledRouteIds.push(routeId);\n activeDeferreds.delete(routeId);\n }\n });\n return cancelledRouteIds;\n }\n // Opt in to capturing and reporting scroll positions during navigations,\n // used by the <ScrollRestoration> component\n function enableScrollRestoration(positions, getPosition, getKey) {\n savedScrollPositions = positions;\n getScrollPosition = getPosition;\n getScrollRestorationKey = getKey || null;\n // Perform initial hydration scroll restoration, since we miss the boat on\n // the initial updateState() because we\'ve not yet rendered <ScrollRestoration/>\n // and therefore have no savedScrollPositions available\n if (!initialScrollRestored && state.navigation === IDLE_NAVIGATION) {\n initialScrollRestored = true;\n let y = getSavedScrollPosition(state.location, state.matches);\n if (y != null) {\n updateState({\n restoreScrollPosition: y\n });\n }\n }\n return () => {\n savedScrollPositions = null;\n getScrollPosition = null;\n getScrollRestorationKey = null;\n };\n }\n function getScrollKey(location, matches) {\n if (getScrollRestorationKey) {\n let key = getScrollRestorationKey(location, matches.map(m => convertRouteMatchToUiMatch(m, state.loaderData)));\n return key || location.key;\n }\n return location.key;\n }\n function saveScrollPosition(location, matches) {\n if (savedScrollPositions && getScrollPosition) {\n let key = getScrollKey(location, matches);\n savedScrollPositions[key] = getScrollPosition();\n }\n }\n function getSavedScrollPosition(location, matches) {\n if (savedScrollPositions) {\n let key = getScrollKey(location, matches);\n let y = savedScrollPositions[key];\n if (typeof y === "number") {\n return y;\n }\n }\n return null;\n }\n function _internalSetRoutes(newRoutes) {\n manifest = {};\n inFlightDataRoutes = convertRoutesToDataRoutes(newRoutes, mapRouteProperties, undefined, manifest);\n }\n router = {\n get basename() {\n return basename;\n },\n get state() {\n return state;\n },\n get routes() {\n return dataRoutes;\n },\n get window() {\n return routerWindow;\n },\n initialize,\n subscribe,\n enableScrollRestoration,\n navigate,\n fetch,\n revalidate,\n // Passthrough to history-aware createHref used by useHref so we get proper\n // hash-aware URLs in DOM paths\n createHref: to => init.history.createHref(to),\n encodeLocation: to => init.history.encodeLocation(to),\n getFetcher,\n deleteFetcher: deleteFetcherAndUpdateState,\n dispose,\n getBlocker,\n deleteBlocker,\n _internalFetchControllers: fetchControllers,\n _internalActiveDeferreds: activeDeferreds,\n // TODO: Remove setRoutes, it\'s temporary to avoid dealing with\n // updating the tree while validating the update algorithm.\n _internalSetRoutes\n };\n return router;\n}\n//#endregion\n////////////////////////////////////////////////////////////////////////////////\n//#region createStaticHandler\n////////////////////////////////////////////////////////////////////////////////\nconst UNSAFE_DEFERRED_SYMBOL = Symbol("deferred");\nfunction createStaticHandler(routes, opts) {\n router_invariant(routes.length > 0, "You must provide a non-empty routes array to createStaticHandler");\n let manifest = {};\n let basename = (opts ? opts.basename : null) || "/";\n let mapRouteProperties;\n if (opts != null && opts.mapRouteProperties) {\n mapRouteProperties = opts.mapRouteProperties;\n } else if (opts != null && opts.detectErrorBoundary) {\n // If they are still using the deprecated version, wrap it with the new API\n let detectErrorBoundary = opts.detectErrorBoundary;\n mapRouteProperties = route => ({\n hasErrorBoundary: detectErrorBoundary(route)\n });\n } else {\n mapRouteProperties = defaultMapRouteProperties;\n }\n let dataRoutes = convertRoutesToDataRoutes(routes, mapRouteProperties, undefined, manifest);\n /**\n * The query() method is intended for document requests, in which we want to\n * call an optional action and potentially multiple loaders for all nested\n * routes. It returns a StaticHandlerContext object, which is very similar\n * to the router state (location, loaderData, actionData, errors, etc.) and\n * also adds SSR-specific information such as the statusCode and headers\n * from action/loaders Responses.\n *\n * It _should_ never throw and should report all errors through the\n * returned context.errors object, properly associating errors to their error\n * boundary. Additionally, it tracks _deepestRenderedBoundaryId which can be\n * used to emulate React error boundaries during SSr by performing a second\n * pass only down to the boundaryId.\n *\n * The one exception where we do not return a StaticHandlerContext is when a\n * redirect response is returned or thrown from any action/loader. We\n * propagate that out and return the raw Response so the HTTP server can\n * return it directly.\n */\n async function query(request, _temp3) {\n let {\n requestContext\n } = _temp3 === void 0 ? {} : _temp3;\n let url = new URL(request.url);\n let method = request.method;\n let location = createLocation("", router_createPath(url), null, "default");\n let matches = matchRoutes(dataRoutes, location, basename);\n // SSR supports HEAD requests while SPA doesn\'t\n if (!isValidMethod(method) && method !== "HEAD") {\n let error = getInternalRouterError(405, {\n method\n });\n let {\n matches: methodNotAllowedMatches,\n route\n } = getShortCircuitMatches(dataRoutes);\n return {\n basename,\n location,\n matches: methodNotAllowedMatches,\n loaderData: {},\n actionData: null,\n errors: {\n [route.id]: error\n },\n statusCode: error.status,\n loaderHeaders: {},\n actionHeaders: {},\n activeDeferreds: null\n };\n } else if (!matches) {\n let error = getInternalRouterError(404, {\n pathname: location.pathname\n });\n let {\n matches: notFoundMatches,\n route\n } = getShortCircuitMatches(dataRoutes);\n return {\n basename,\n location,\n matches: notFoundMatches,\n loaderData: {},\n actionData: null,\n errors: {\n [route.id]: error\n },\n statusCode: error.status,\n loaderHeaders: {},\n actionHeaders: {},\n activeDeferreds: null\n };\n }\n let result = await queryImpl(request, location, matches, requestContext);\n if (isResponse(result)) {\n return result;\n }\n // When returning StaticHandlerContext, we patch back in the location here\n // since we need it for React Context. But this helps keep our submit and\n // loadRouteData operating on a Request instead of a Location\n return router_extends({\n location,\n basename\n }, result);\n }\n /**\n * The queryRoute() method is intended for targeted route requests, either\n * for fetch ?_data requests or resource route requests. In this case, we\n * are only ever calling a single action or loader, and we are returning the\n * returned value directly. In most cases, this will be a Response returned\n * from the action/loader, but it may be a primitive or other value as well -\n * and in such cases the calling context should handle that accordingly.\n *\n * We do respect the throw/return differentiation, so if an action/loader\n * throws, then this method will throw the value. This is important so we\n * can do proper boundary identification in Remix where a thrown Response\n * must go to the Catch Boundary but a returned Response is happy-path.\n *\n * One thing to note is that any Router-initiated Errors that make sense\n * to associate with a status code will be thrown as an ErrorResponse\n * instance which include the raw Error, such that the calling context can\n * serialize the error as they see fit while including the proper response\n * code. Examples here are 404 and 405 errors that occur prior to reaching\n * any user-defined loaders.\n */\n async function queryRoute(request, _temp4) {\n let {\n routeId,\n requestContext\n } = _temp4 === void 0 ? {} : _temp4;\n let url = new URL(request.url);\n let method = request.method;\n let location = createLocation("", router_createPath(url), null, "default");\n let matches = matchRoutes(dataRoutes, location, basename);\n // SSR supports HEAD requests while SPA doesn\'t\n if (!isValidMethod(method) && method !== "HEAD" && method !== "OPTIONS") {\n throw getInternalRouterError(405, {\n method\n });\n } else if (!matches) {\n throw getInternalRouterError(404, {\n pathname: location.pathname\n });\n }\n let match = routeId ? matches.find(m => m.route.id === routeId) : getTargetMatch(matches, location);\n if (routeId && !match) {\n throw getInternalRouterError(403, {\n pathname: location.pathname,\n routeId\n });\n } else if (!match) {\n // This should never hit I don\'t think?\n throw getInternalRouterError(404, {\n pathname: location.pathname\n });\n }\n let result = await queryImpl(request, location, matches, requestContext, match);\n if (isResponse(result)) {\n return result;\n }\n let error = result.errors ? Object.values(result.errors)[0] : undefined;\n if (error !== undefined) {\n // If we got back result.errors, that means the loader/action threw\n // _something_ that wasn\'t a Response, but it\'s not guaranteed/required\n // to be an `instanceof Error` either, so we have to use throw here to\n // preserve the "error" state outside of queryImpl.\n throw error;\n }\n // Pick off the right state value to return\n if (result.actionData) {\n return Object.values(result.actionData)[0];\n }\n if (result.loaderData) {\n var _result$activeDeferre;\n let data = Object.values(result.loaderData)[0];\n if ((_result$activeDeferre = result.activeDeferreds) != null && _result$activeDeferre[match.route.id]) {\n data[UNSAFE_DEFERRED_SYMBOL] = result.activeDeferreds[match.route.id];\n }\n return data;\n }\n return undefined;\n }\n async function queryImpl(request, location, matches, requestContext, routeMatch) {\n router_invariant(request.signal, "query()/queryRoute() requests must contain an AbortController signal");\n try {\n if (isMutationMethod(request.method.toLowerCase())) {\n let result = await submit(request, matches, routeMatch || getTargetMatch(matches, location), requestContext, routeMatch != null);\n return result;\n }\n let result = await loadRouteData(request, matches, requestContext, routeMatch);\n return isResponse(result) ? result : router_extends({}, result, {\n actionData: null,\n actionHeaders: {}\n });\n } catch (e) {\n // If the user threw/returned a Response in callLoaderOrAction, we throw\n // it to bail out and then return or throw here based on whether the user\n // returned or threw\n if (isQueryRouteResponse(e)) {\n if (e.type === ResultType.error) {\n throw e.response;\n }\n return e.response;\n }\n // Redirects are always returned since they don\'t propagate to catch\n // boundaries\n if (isRedirectResponse(e)) {\n return e;\n }\n throw e;\n }\n }\n async function submit(request, matches, actionMatch, requestContext, isRouteRequest) {\n let result;\n if (!actionMatch.route.action && !actionMatch.route.lazy) {\n let error = getInternalRouterError(405, {\n method: request.method,\n pathname: new URL(request.url).pathname,\n routeId: actionMatch.route.id\n });\n if (isRouteRequest) {\n throw error;\n }\n result = {\n type: ResultType.error,\n error\n };\n } else {\n result = await callLoaderOrAction("action", request, actionMatch, matches, manifest, mapRouteProperties, basename, {\n isStaticRequest: true,\n isRouteRequest,\n requestContext\n });\n if (request.signal.aborted) {\n let method = isRouteRequest ? "queryRoute" : "query";\n throw new Error(method + "() call aborted: " + request.method + " " + request.url);\n }\n }\n if (isRedirectResult(result)) {\n // Uhhhh - this should never happen, we should always throw these from\n // callLoaderOrAction, but the type narrowing here keeps TS happy and we\n // can get back on the "throw all redirect responses" train here should\n // this ever happen :/\n throw new Response(null, {\n status: result.status,\n headers: {\n Location: result.location\n }\n });\n }\n if (isDeferredResult(result)) {\n let error = getInternalRouterError(400, {\n type: "defer-action"\n });\n if (isRouteRequest) {\n throw error;\n }\n result = {\n type: ResultType.error,\n error\n };\n }\n if (isRouteRequest) {\n // Note: This should only be non-Response values if we get here, since\n // isRouteRequest should throw any Response received in callLoaderOrAction\n if (isErrorResult(result)) {\n throw result.error;\n }\n return {\n matches: [actionMatch],\n loaderData: {},\n actionData: {\n [actionMatch.route.id]: result.data\n },\n errors: null,\n // Note: statusCode + headers are unused here since queryRoute will\n // return the raw Response or value\n statusCode: 200,\n loaderHeaders: {},\n actionHeaders: {},\n activeDeferreds: null\n };\n }\n if (isErrorResult(result)) {\n // Store off the pending error - we use it to determine which loaders\n // to call and will commit it when we complete the navigation\n let boundaryMatch = findNearestBoundary(matches, actionMatch.route.id);\n let context = await loadRouteData(request, matches, requestContext, undefined, {\n [boundaryMatch.route.id]: result.error\n });\n // action status codes take precedence over loader status codes\n return router_extends({}, context, {\n statusCode: isRouteErrorResponse(result.error) ? result.error.status : 500,\n actionData: null,\n actionHeaders: router_extends({}, result.headers ? {\n [actionMatch.route.id]: result.headers\n } : {})\n });\n }\n // Create a GET request for the loaders\n let loaderRequest = new Request(request.url, {\n headers: request.headers,\n redirect: request.redirect,\n signal: request.signal\n });\n let context = await loadRouteData(loaderRequest, matches, requestContext);\n return router_extends({}, context, result.statusCode ? {\n statusCode: result.statusCode\n } : {}, {\n actionData: {\n [actionMatch.route.id]: result.data\n },\n actionHeaders: router_extends({}, result.headers ? {\n [actionMatch.route.id]: result.headers\n } : {})\n });\n }\n async function loadRouteData(request, matches, requestContext, routeMatch, pendingActionError) {\n let isRouteRequest = routeMatch != null;\n // Short circuit if we have no loaders to run (queryRoute())\n if (isRouteRequest && !(routeMatch != null && routeMatch.route.loader) && !(routeMatch != null && routeMatch.route.lazy)) {\n throw getInternalRouterError(400, {\n method: request.method,\n pathname: new URL(request.url).pathname,\n routeId: routeMatch == null ? void 0 : routeMatch.route.id\n });\n }\n let requestMatches = routeMatch ? [routeMatch] : getLoaderMatchesUntilBoundary(matches, Object.keys(pendingActionError || {})[0]);\n let matchesToLoad = requestMatches.filter(m => m.route.loader || m.route.lazy);\n // Short circuit if we have no loaders to run (query())\n if (matchesToLoad.length === 0) {\n return {\n matches,\n // Add a null for all matched routes for proper revalidation on the client\n loaderData: matches.reduce((acc, m) => Object.assign(acc, {\n [m.route.id]: null\n }), {}),\n errors: pendingActionError || null,\n statusCode: 200,\n loaderHeaders: {},\n activeDeferreds: null\n };\n }\n let results = await Promise.all([...matchesToLoad.map(match => callLoaderOrAction("loader", request, match, matches, manifest, mapRouteProperties, basename, {\n isStaticRequest: true,\n isRouteRequest,\n requestContext\n }))]);\n if (request.signal.aborted) {\n let method = isRouteRequest ? "queryRoute" : "query";\n throw new Error(method + "() call aborted: " + request.method + " " + request.url);\n }\n // Process and commit output from loaders\n let activeDeferreds = new Map();\n let context = processRouteLoaderData(matches, matchesToLoad, results, pendingActionError, activeDeferreds);\n // Add a null for any non-loader matches for proper revalidation on the client\n let executedLoaders = new Set(matchesToLoad.map(match => match.route.id));\n matches.forEach(match => {\n if (!executedLoaders.has(match.route.id)) {\n context.loaderData[match.route.id] = null;\n }\n });\n return router_extends({}, context, {\n matches,\n activeDeferreds: activeDeferreds.size > 0 ? Object.fromEntries(activeDeferreds.entries()) : null\n });\n }\n return {\n dataRoutes,\n query,\n queryRoute\n };\n}\n//#endregion\n////////////////////////////////////////////////////////////////////////////////\n//#region Helpers\n////////////////////////////////////////////////////////////////////////////////\n/**\n * Given an existing StaticHandlerContext and an error thrown at render time,\n * provide an updated StaticHandlerContext suitable for a second SSR render\n */\nfunction getStaticContextFromError(routes, context, error) {\n let newContext = router_extends({}, context, {\n statusCode: 500,\n errors: {\n [context._deepestRenderedBoundaryId || routes[0].id]: error\n }\n });\n return newContext;\n}\nfunction isSubmissionNavigation(opts) {\n return opts != null && ("formData" in opts && opts.formData != null || "body" in opts && opts.body !== undefined);\n}\nfunction normalizeTo(location, matches, basename, prependBasename, to, fromRouteId, relative) {\n let contextualMatches;\n let activeRouteMatch;\n if (fromRouteId) {\n // Grab matches up to the calling route so our route-relative logic is\n // relative to the correct source route\n contextualMatches = [];\n for (let match of matches) {\n contextualMatches.push(match);\n if (match.route.id === fromRouteId) {\n activeRouteMatch = match;\n break;\n }\n }\n } else {\n contextualMatches = matches;\n activeRouteMatch = matches[matches.length - 1];\n }\n // Resolve the relative path\n let path = router_resolveTo(to ? to : ".", getPathContributingMatches(contextualMatches).map(m => m.pathnameBase), router_stripBasename(location.pathname, basename) || location.pathname, relative === "path");\n // When `to` is not specified we inherit search/hash from the current\n // location, unlike when to="." and we just inherit the path.\n // See https://github.com/remix-run/remix/issues/927\n if (to == null) {\n path.search = location.search;\n path.hash = location.hash;\n }\n // Add an ?index param for matched index routes if we don\'t already have one\n if ((to == null || to === "" || to === ".") && activeRouteMatch && activeRouteMatch.route.index && !hasNakedIndexQuery(path.search)) {\n path.search = path.search ? path.search.replace(/^\\?/, "?index&") : "?index";\n }\n // If we\'re operating within a basename, prepend it to the pathname. If\n // this is a root navigation, then just use the raw basename which allows\n // the basename to have full control over the presence of a trailing slash\n // on root actions\n if (prependBasename && basename !== "/") {\n path.pathname = path.pathname === "/" ? basename : router_joinPaths([basename, path.pathname]);\n }\n return router_createPath(path);\n}\n// Normalize navigation options by converting formMethod=GET formData objects to\n// URLSearchParams so they behave identically to links with query params\nfunction normalizeNavigateOptions(normalizeFormMethod, isFetcher, path, opts) {\n // Return location verbatim on non-submission navigations\n if (!opts || !isSubmissionNavigation(opts)) {\n return {\n path\n };\n }\n if (opts.formMethod && !isValidMethod(opts.formMethod)) {\n return {\n path,\n error: getInternalRouterError(405, {\n method: opts.formMethod\n })\n };\n }\n let getInvalidBodyError = () => ({\n path,\n error: getInternalRouterError(400, {\n type: "invalid-body"\n })\n });\n // Create a Submission on non-GET navigations\n let rawFormMethod = opts.formMethod || "get";\n let formMethod = normalizeFormMethod ? rawFormMethod.toUpperCase() : rawFormMethod.toLowerCase();\n let formAction = stripHashFromPath(path);\n if (opts.body !== undefined) {\n if (opts.formEncType === "text/plain") {\n // text only support POST/PUT/PATCH/DELETE submissions\n if (!isMutationMethod(formMethod)) {\n return getInvalidBodyError();\n }\n let text = typeof opts.body === "string" ? opts.body : opts.body instanceof FormData || opts.body instanceof URLSearchParams ?\n // https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#plain-text-form-data\n Array.from(opts.body.entries()).reduce((acc, _ref3) => {\n let [name, value] = _ref3;\n return "" + acc + name + "=" + value + "\\n";\n }, "") : String(opts.body);\n return {\n path,\n submission: {\n formMethod,\n formAction,\n formEncType: opts.formEncType,\n formData: undefined,\n json: undefined,\n text\n }\n };\n } else if (opts.formEncType === "application/json") {\n // json only supports POST/PUT/PATCH/DELETE submissions\n if (!isMutationMethod(formMethod)) {\n return getInvalidBodyError();\n }\n try {\n let json = typeof opts.body === "string" ? JSON.parse(opts.body) : opts.body;\n return {\n path,\n submission: {\n formMethod,\n formAction,\n formEncType: opts.formEncType,\n formData: undefined,\n json,\n text: undefined\n }\n };\n } catch (e) {\n return getInvalidBodyError();\n }\n }\n }\n router_invariant(typeof FormData === "function", "FormData is not available in this environment");\n let searchParams;\n let formData;\n if (opts.formData) {\n searchParams = convertFormDataToSearchParams(opts.formData);\n formData = opts.formData;\n } else if (opts.body instanceof FormData) {\n searchParams = convertFormDataToSearchParams(opts.body);\n formData = opts.body;\n } else if (opts.body instanceof URLSearchParams) {\n searchParams = opts.body;\n formData = convertSearchParamsToFormData(searchParams);\n } else if (opts.body == null) {\n searchParams = new URLSearchParams();\n formData = new FormData();\n } else {\n try {\n searchParams = new URLSearchParams(opts.body);\n formData = convertSearchParamsToFormData(searchParams);\n } catch (e) {\n return getInvalidBodyError();\n }\n }\n let submission = {\n formMethod,\n formAction,\n formEncType: opts && opts.formEncType || "application/x-www-form-urlencoded",\n formData,\n json: undefined,\n text: undefined\n };\n if (isMutationMethod(submission.formMethod)) {\n return {\n path,\n submission\n };\n }\n // Flatten submission onto URLSearchParams for GET submissions\n let parsedPath = parsePath(path);\n // On GET navigation submissions we can drop the ?index param from the\n // resulting location since all loaders will run. But fetcher GET submissions\n // only run a single loader so we need to preserve any incoming ?index params\n if (isFetcher && parsedPath.search && hasNakedIndexQuery(parsedPath.search)) {\n searchParams.append("index", "");\n }\n parsedPath.search = "?" + searchParams;\n return {\n path: router_createPath(parsedPath),\n submission\n };\n}\n// Filter out all routes below any caught error as they aren\'t going to\n// render so we don\'t need to load them\nfunction getLoaderMatchesUntilBoundary(matches, boundaryId) {\n let boundaryMatches = matches;\n if (boundaryId) {\n let index = matches.findIndex(m => m.route.id === boundaryId);\n if (index >= 0) {\n boundaryMatches = matches.slice(0, index);\n }\n }\n return boundaryMatches;\n}\nfunction getMatchesToLoad(history, state, matches, submission, location, isRevalidationRequired, cancelledDeferredRoutes, cancelledFetcherLoads, deletedFetchers, fetchLoadMatches, fetchRedirectIds, routesToUse, basename, pendingActionData, pendingError) {\n let actionResult = pendingError ? Object.values(pendingError)[0] : pendingActionData ? Object.values(pendingActionData)[0] : undefined;\n let currentUrl = history.createURL(state.location);\n let nextUrl = history.createURL(location);\n // Pick navigation matches that are net-new or qualify for revalidation\n let boundaryId = pendingError ? Object.keys(pendingError)[0] : undefined;\n let boundaryMatches = getLoaderMatchesUntilBoundary(matches, boundaryId);\n let navigationMatches = boundaryMatches.filter((match, index) => {\n if (match.route.lazy) {\n // We haven\'t loaded this route yet so we don\'t know if it\'s got a loader!\n return true;\n }\n if (match.route.loader == null) {\n return false;\n }\n // Always call the loader on new route instances and pending defer cancellations\n if (isNewLoader(state.loaderData, state.matches[index], match) || cancelledDeferredRoutes.some(id => id === match.route.id)) {\n return true;\n }\n // This is the default implementation for when we revalidate. If the route\n // provides it\'s own implementation, then we give them full control but\n // provide this value so they can leverage it if needed after they check\n // their own specific use cases\n let currentRouteMatch = state.matches[index];\n let nextRouteMatch = match;\n return shouldRevalidateLoader(match, router_extends({\n currentUrl,\n currentParams: currentRouteMatch.params,\n nextUrl,\n nextParams: nextRouteMatch.params\n }, submission, {\n actionResult,\n defaultShouldRevalidate:\n // Forced revalidation due to submission, useRevalidator, or X-Remix-Revalidate\n isRevalidationRequired ||\n // Clicked the same link, resubmitted a GET form\n currentUrl.pathname + currentUrl.search === nextUrl.pathname + nextUrl.search ||\n // Search params affect all loaders\n currentUrl.search !== nextUrl.search || isNewRouteInstance(currentRouteMatch, nextRouteMatch)\n }));\n });\n // Pick fetcher.loads that need to be revalidated\n let revalidatingFetchers = [];\n fetchLoadMatches.forEach((f, key) => {\n // Don\'t revalidate if fetcher won\'t be present in the subsequent render\n if (!matches.some(m => m.route.id === f.routeId) || deletedFetchers.has(key)) {\n return;\n }\n let fetcherMatches = matchRoutes(routesToUse, f.path, basename);\n // If the fetcher path no longer matches, push it in with null matches so\n // we can trigger a 404 in callLoadersAndMaybeResolveData. Note this is\n // currently only a use-case for Remix HMR where the route tree can change\n // at runtime and remove a route previously loaded via a fetcher\n if (!fetcherMatches) {\n revalidatingFetchers.push({\n key,\n routeId: f.routeId,\n path: f.path,\n matches: null,\n match: null,\n controller: null\n });\n return;\n }\n // Revalidating fetchers are decoupled from the route matches since they\n // load from a static href. They revalidate based on explicit revalidation\n // (submission, useRevalidator, or X-Remix-Revalidate)\n let fetcher = state.fetchers.get(key);\n let fetcherMatch = getTargetMatch(fetcherMatches, f.path);\n let shouldRevalidate = false;\n if (fetchRedirectIds.has(key)) {\n // Never trigger a revalidation of an actively redirecting fetcher\n shouldRevalidate = false;\n } else if (cancelledFetcherLoads.includes(key)) {\n // Always revalidate if the fetcher was cancelled\n shouldRevalidate = true;\n } else if (fetcher && fetcher.state !== "idle" && fetcher.data === undefined) {\n // If the fetcher hasn\'t ever completed loading yet, then this isn\'t a\n // revalidation, it would just be a brand new load if an explicit\n // revalidation is required\n shouldRevalidate = isRevalidationRequired;\n } else {\n // Otherwise fall back on any user-defined shouldRevalidate, defaulting\n // to explicit revalidations only\n shouldRevalidate = shouldRevalidateLoader(fetcherMatch, router_extends({\n currentUrl,\n currentParams: state.matches[state.matches.length - 1].params,\n nextUrl,\n nextParams: matches[matches.length - 1].params\n }, submission, {\n actionResult,\n defaultShouldRevalidate: isRevalidationRequired\n }));\n }\n if (shouldRevalidate) {\n revalidatingFetchers.push({\n key,\n routeId: f.routeId,\n path: f.path,\n matches: fetcherMatches,\n match: fetcherMatch,\n controller: new AbortController()\n });\n }\n });\n return [navigationMatches, revalidatingFetchers];\n}\nfunction isNewLoader(currentLoaderData, currentMatch, match) {\n let isNew =\n // [a] -> [a, b]\n !currentMatch ||\n // [a, b] -> [a, c]\n match.route.id !== currentMatch.route.id;\n // Handle the case that we don\'t have data for a re-used route, potentially\n // from a prior error or from a cancelled pending deferred\n let isMissingData = currentLoaderData[match.route.id] === undefined;\n // Always load if this is a net-new route or we don\'t yet have data\n return isNew || isMissingData;\n}\nfunction isNewRouteInstance(currentMatch, match) {\n let currentPath = currentMatch.route.path;\n return (\n // param change for this match, /users/123 -> /users/456\n currentMatch.pathname !== match.pathname ||\n // splat param changed, which is not present in match.path\n // e.g. /files/images/avatar.jpg -> files/finances.xls\n currentPath != null && currentPath.endsWith("*") && currentMatch.params["*"] !== match.params["*"]\n );\n}\nfunction shouldRevalidateLoader(loaderMatch, arg) {\n if (loaderMatch.route.shouldRevalidate) {\n let routeChoice = loaderMatch.route.shouldRevalidate(arg);\n if (typeof routeChoice === "boolean") {\n return routeChoice;\n }\n }\n return arg.defaultShouldRevalidate;\n}\n/**\n * Execute route.lazy() methods to lazily load route modules (loader, action,\n * shouldRevalidate) and update the routeManifest in place which shares objects\n * with dataRoutes so those get updated as well.\n */\nasync function loadLazyRouteModule(route, mapRouteProperties, manifest) {\n if (!route.lazy) {\n return;\n }\n let lazyRoute = await route.lazy();\n // If the lazy route function was executed and removed by another parallel\n // call then we can return - first lazy() to finish wins because the return\n // value of lazy is expected to be static\n if (!route.lazy) {\n return;\n }\n let routeToUpdate = manifest[route.id];\n router_invariant(routeToUpdate, "No route found in manifest");\n // Update the route in place. This should be safe because there\'s no way\n // we could yet be sitting on this route as we can\'t get there without\n // resolving lazy() first.\n //\n // This is different than the HMR "update" use-case where we may actively be\n // on the route being updated. The main concern boils down to "does this\n // mutation affect any ongoing navigations or any current state.matches\n // values?". If not, it should be safe to update in place.\n let routeUpdates = {};\n for (let lazyRouteProperty in lazyRoute) {\n let staticRouteValue = routeToUpdate[lazyRouteProperty];\n let isPropertyStaticallyDefined = staticRouteValue !== undefined &&\n // This property isn\'t static since it should always be updated based\n // on the route updates\n lazyRouteProperty !== "hasErrorBoundary";\n warning(!isPropertyStaticallyDefined, "Route \\"" + routeToUpdate.id + "\\" has a static property \\"" + lazyRouteProperty + "\\" " + "defined but its lazy function is also returning a value for this property. " + ("The lazy route property \\"" + lazyRouteProperty + "\\" will be ignored."));\n if (!isPropertyStaticallyDefined && !immutableRouteKeys.has(lazyRouteProperty)) {\n routeUpdates[lazyRouteProperty] = lazyRoute[lazyRouteProperty];\n }\n }\n // Mutate the route with the provided updates. Do this first so we pass\n // the updated version to mapRouteProperties\n Object.assign(routeToUpdate, routeUpdates);\n // Mutate the `hasErrorBoundary` property on the route based on the route\n // updates and remove the `lazy` function so we don\'t resolve the lazy\n // route again.\n Object.assign(routeToUpdate, router_extends({}, mapRouteProperties(routeToUpdate), {\n lazy: undefined\n }));\n}\nasync function callLoaderOrAction(type, request, match, matches, manifest, mapRouteProperties, basename, opts) {\n if (opts === void 0) {\n opts = {};\n }\n let resultType;\n let result;\n let onReject;\n let runHandler = handler => {\n // Setup a promise we can race against so that abort signals short circuit\n let reject;\n let abortPromise = new Promise((_, r) => reject = r);\n onReject = () => reject();\n request.signal.addEventListener("abort", onReject);\n return Promise.race([handler({\n request,\n params: match.params,\n context: opts.requestContext\n }), abortPromise]);\n };\n try {\n let handler = match.route[type];\n if (match.route.lazy) {\n if (handler) {\n // Run statically defined handler in parallel with lazy()\n let handlerError;\n let values = await Promise.all([\n // If the handler throws, don\'t let it immediately bubble out,\n // since we need to let the lazy() execution finish so we know if this\n // route has a boundary that can handle the error\n runHandler(handler).catch(e => {\n handlerError = e;\n }), loadLazyRouteModule(match.route, mapRouteProperties, manifest)]);\n if (handlerError) {\n throw handlerError;\n }\n result = values[0];\n } else {\n // Load lazy route module, then run any returned handler\n await loadLazyRouteModule(match.route, mapRouteProperties, manifest);\n handler = match.route[type];\n if (handler) {\n // Handler still run even if we got interrupted to maintain consistency\n // with un-abortable behavior of handler execution on non-lazy or\n // previously-lazy-loaded routes\n result = await runHandler(handler);\n } else if (type === "action") {\n let url = new URL(request.url);\n let pathname = url.pathname + url.search;\n throw getInternalRouterError(405, {\n method: request.method,\n pathname,\n routeId: match.route.id\n });\n } else {\n // lazy() route has no loader to run. Short circuit here so we don\'t\n // hit the invariant below that errors on returning undefined.\n return {\n type: ResultType.data,\n data: undefined\n };\n }\n }\n } else if (!handler) {\n let url = new URL(request.url);\n let pathname = url.pathname + url.search;\n throw getInternalRouterError(404, {\n pathname\n });\n } else {\n result = await runHandler(handler);\n }\n router_invariant(result !== undefined, "You defined " + (type === "action" ? "an action" : "a loader") + " for route " + ("\\"" + match.route.id + "\\" but didn\'t return anything from your `" + type + "` ") + "function. Please return a value or `null`.");\n } catch (e) {\n resultType = ResultType.error;\n result = e;\n } finally {\n if (onReject) {\n request.signal.removeEventListener("abort", onReject);\n }\n }\n if (isResponse(result)) {\n let status = result.status;\n // Process redirects\n if (redirectStatusCodes.has(status)) {\n let location = result.headers.get("Location");\n router_invariant(location, "Redirects returned/thrown from loaders/actions must have a Location header");\n // Support relative routing in internal redirects\n if (!ABSOLUTE_URL_REGEX.test(location)) {\n location = normalizeTo(new URL(request.url), matches.slice(0, matches.indexOf(match) + 1), basename, true, location);\n } else if (!opts.isStaticRequest) {\n // Strip off the protocol+origin for same-origin + same-basename absolute\n // redirects. If this is a static request, we can let it go back to the\n // browser as-is\n let currentUrl = new URL(request.url);\n let url = location.startsWith("//") ? new URL(currentUrl.protocol + location) : new URL(location);\n let isSameBasename = router_stripBasename(url.pathname, basename) != null;\n if (url.origin === currentUrl.origin && isSameBasename) {\n location = url.pathname + url.search + url.hash;\n }\n }\n // Don\'t process redirects in the router during static requests requests.\n // Instead, throw the Response and let the server handle it with an HTTP\n // redirect. We also update the Location header in place in this flow so\n // basename and relative routing is taken into account\n if (opts.isStaticRequest) {\n result.headers.set("Location", location);\n throw result;\n }\n return {\n type: ResultType.redirect,\n status,\n location,\n revalidate: result.headers.get("X-Remix-Revalidate") !== null,\n reloadDocument: result.headers.get("X-Remix-Reload-Document") !== null\n };\n }\n // For SSR single-route requests, we want to hand Responses back directly\n // without unwrapping. We do this with the QueryRouteResponse wrapper\n // interface so we can know whether it was returned or thrown\n if (opts.isRouteRequest) {\n let queryRouteResponse = {\n type: resultType === ResultType.error ? ResultType.error : ResultType.data,\n response: result\n };\n throw queryRouteResponse;\n }\n let data;\n let contentType = result.headers.get("Content-Type");\n // Check between word boundaries instead of startsWith() due to the last\n // paragraph of https://httpwg.org/specs/rfc9110.html#field.content-type\n if (contentType && /\\bapplication\\/json\\b/.test(contentType)) {\n data = await result.json();\n } else {\n data = await result.text();\n }\n if (resultType === ResultType.error) {\n return {\n type: resultType,\n error: new ErrorResponseImpl(status, result.statusText, data),\n headers: result.headers\n };\n }\n return {\n type: ResultType.data,\n data,\n statusCode: result.status,\n headers: result.headers\n };\n }\n if (resultType === ResultType.error) {\n return {\n type: resultType,\n error: result\n };\n }\n if (isDeferredData(result)) {\n var _result$init, _result$init2;\n return {\n type: ResultType.deferred,\n deferredData: result,\n statusCode: (_result$init = result.init) == null ? void 0 : _result$init.status,\n headers: ((_result$init2 = result.init) == null ? void 0 : _result$init2.headers) && new Headers(result.init.headers)\n };\n }\n return {\n type: ResultType.data,\n data: result\n };\n}\n// Utility method for creating the Request instances for loaders/actions during\n// client-side navigations and fetches. During SSR we will always have a\n// Request instance from the static handler (query/queryRoute)\nfunction createClientSideRequest(history, location, signal, submission) {\n let url = history.createURL(stripHashFromPath(location)).toString();\n let init = {\n signal\n };\n if (submission && isMutationMethod(submission.formMethod)) {\n let {\n formMethod,\n formEncType\n } = submission;\n // Didn\'t think we needed this but it turns out unlike other methods, patch\n // won\'t be properly normalized to uppercase and results in a 405 error.\n // See: https://fetch.spec.whatwg.org/#concept-method\n init.method = formMethod.toUpperCase();\n if (formEncType === "application/json") {\n init.headers = new Headers({\n "Content-Type": formEncType\n });\n init.body = JSON.stringify(submission.json);\n } else if (formEncType === "text/plain") {\n // Content-Type is inferred (https://fetch.spec.whatwg.org/#dom-request)\n init.body = submission.text;\n } else if (formEncType === "application/x-www-form-urlencoded" && submission.formData) {\n // Content-Type is inferred (https://fetch.spec.whatwg.org/#dom-request)\n init.body = convertFormDataToSearchParams(submission.formData);\n } else {\n // Content-Type is inferred (https://fetch.spec.whatwg.org/#dom-request)\n init.body = submission.formData;\n }\n }\n return new Request(url, init);\n}\nfunction convertFormDataToSearchParams(formData) {\n let searchParams = new URLSearchParams();\n for (let [key, value] of formData.entries()) {\n // https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#converting-an-entry-list-to-a-list-of-name-value-pairs\n searchParams.append(key, typeof value === "string" ? value : value.name);\n }\n return searchParams;\n}\nfunction convertSearchParamsToFormData(searchParams) {\n let formData = new FormData();\n for (let [key, value] of searchParams.entries()) {\n formData.append(key, value);\n }\n return formData;\n}\nfunction processRouteLoaderData(matches, matchesToLoad, results, pendingError, activeDeferreds) {\n // Fill in loaderData/errors from our loaders\n let loaderData = {};\n let errors = null;\n let statusCode;\n let foundError = false;\n let loaderHeaders = {};\n // Process loader results into state.loaderData/state.errors\n results.forEach((result, index) => {\n let id = matchesToLoad[index].route.id;\n router_invariant(!isRedirectResult(result), "Cannot handle redirect results in processLoaderData");\n if (isErrorResult(result)) {\n // Look upwards from the matched route for the closest ancestor\n // error boundary, defaulting to the root match\n let boundaryMatch = findNearestBoundary(matches, id);\n let error = result.error;\n // If we have a pending action error, we report it at the highest-route\n // that throws a loader error, and then clear it out to indicate that\n // it was consumed\n if (pendingError) {\n error = Object.values(pendingError)[0];\n pendingError = undefined;\n }\n errors = errors || {};\n // Prefer higher error values if lower errors bubble to the same boundary\n if (errors[boundaryMatch.route.id] == null) {\n errors[boundaryMatch.route.id] = error;\n }\n // Clear our any prior loaderData for the throwing route\n loaderData[id] = undefined;\n // Once we find our first (highest) error, we set the status code and\n // prevent deeper status codes from overriding\n if (!foundError) {\n foundError = true;\n statusCode = isRouteErrorResponse(result.error) ? result.error.status : 500;\n }\n if (result.headers) {\n loaderHeaders[id] = result.headers;\n }\n } else {\n if (isDeferredResult(result)) {\n activeDeferreds.set(id, result.deferredData);\n loaderData[id] = result.deferredData.data;\n } else {\n loaderData[id] = result.data;\n }\n // Error status codes always override success status codes, but if all\n // loaders are successful we take the deepest status code.\n if (result.statusCode != null && result.statusCode !== 200 && !foundError) {\n statusCode = result.statusCode;\n }\n if (result.headers) {\n loaderHeaders[id] = result.headers;\n }\n }\n });\n // If we didn\'t consume the pending action error (i.e., all loaders\n // resolved), then consume it here. Also clear out any loaderData for the\n // throwing route\n if (pendingError) {\n errors = pendingError;\n loaderData[Object.keys(pendingError)[0]] = undefined;\n }\n return {\n loaderData,\n errors,\n statusCode: statusCode || 200,\n loaderHeaders\n };\n}\nfunction processLoaderData(state, matches, matchesToLoad, results, pendingError, revalidatingFetchers, fetcherResults, activeDeferreds) {\n let {\n loaderData,\n errors\n } = processRouteLoaderData(matches, matchesToLoad, results, pendingError, activeDeferreds);\n // Process results from our revalidating fetchers\n for (let index = 0; index < revalidatingFetchers.length; index++) {\n let {\n key,\n match,\n controller\n } = revalidatingFetchers[index];\n router_invariant(fetcherResults !== undefined && fetcherResults[index] !== undefined, "Did not find corresponding fetcher result");\n let result = fetcherResults[index];\n // Process fetcher non-redirect errors\n if (controller && controller.signal.aborted) {\n // Nothing to do for aborted fetchers\n continue;\n } else if (isErrorResult(result)) {\n let boundaryMatch = findNearestBoundary(state.matches, match == null ? void 0 : match.route.id);\n if (!(errors && errors[boundaryMatch.route.id])) {\n errors = router_extends({}, errors, {\n [boundaryMatch.route.id]: result.error\n });\n }\n state.fetchers.delete(key);\n } else if (isRedirectResult(result)) {\n // Should never get here, redirects should get processed above, but we\n // keep this to type narrow to a success result in the else\n router_invariant(false, "Unhandled fetcher revalidation redirect");\n } else if (isDeferredResult(result)) {\n // Should never get here, deferred data should be awaited for fetchers\n // in resolveDeferredResults\n router_invariant(false, "Unhandled fetcher deferred data");\n } else {\n let doneFetcher = getDoneFetcher(result.data);\n state.fetchers.set(key, doneFetcher);\n }\n }\n return {\n loaderData,\n errors\n };\n}\nfunction mergeLoaderData(loaderData, newLoaderData, matches, errors) {\n let mergedLoaderData = router_extends({}, newLoaderData);\n for (let match of matches) {\n let id = match.route.id;\n if (newLoaderData.hasOwnProperty(id)) {\n if (newLoaderData[id] !== undefined) {\n mergedLoaderData[id] = newLoaderData[id];\n }\n } else if (loaderData[id] !== undefined && match.route.loader) {\n // Preserve existing keys not included in newLoaderData and where a loader\n // wasn\'t removed by HMR\n mergedLoaderData[id] = loaderData[id];\n }\n if (errors && errors.hasOwnProperty(id)) {\n // Don\'t keep any loader data below the boundary\n break;\n }\n }\n return mergedLoaderData;\n}\n// Find the nearest error boundary, looking upwards from the leaf route (or the\n// route specified by routeId) for the closest ancestor error boundary,\n// defaulting to the root match\nfunction findNearestBoundary(matches, routeId) {\n let eligibleMatches = routeId ? matches.slice(0, matches.findIndex(m => m.route.id === routeId) + 1) : [...matches];\n return eligibleMatches.reverse().find(m => m.route.hasErrorBoundary === true) || matches[0];\n}\nfunction getShortCircuitMatches(routes) {\n // Prefer a root layout route if present, otherwise shim in a route object\n let route = routes.length === 1 ? routes[0] : routes.find(r => r.index || !r.path || r.path === "/") || {\n id: "__shim-error-route__"\n };\n return {\n matches: [{\n params: {},\n pathname: "",\n pathnameBase: "",\n route\n }],\n route\n };\n}\nfunction getInternalRouterError(status, _temp5) {\n let {\n pathname,\n routeId,\n method,\n type\n } = _temp5 === void 0 ? {} : _temp5;\n let statusText = "Unknown Server Error";\n let errorMessage = "Unknown @remix-run/router error";\n if (status === 400) {\n statusText = "Bad Request";\n if (method && pathname && routeId) {\n errorMessage = "You made a " + method + " request to \\"" + pathname + "\\" but " + ("did not provide a `loader` for route \\"" + routeId + "\\", ") + "so there is no way to handle the request.";\n } else if (type === "defer-action") {\n errorMessage = "defer() is not supported in actions";\n } else if (type === "invalid-body") {\n errorMessage = "Unable to encode submission body";\n }\n } else if (status === 403) {\n statusText = "Forbidden";\n errorMessage = "Route \\"" + routeId + "\\" does not match URL \\"" + pathname + "\\"";\n } else if (status === 404) {\n statusText = "Not Found";\n errorMessage = "No route matches URL \\"" + pathname + "\\"";\n } else if (status === 405) {\n statusText = "Method Not Allowed";\n if (method && pathname && routeId) {\n errorMessage = "You made a " + method.toUpperCase() + " request to \\"" + pathname + "\\" but " + ("did not provide an `action` for route \\"" + routeId + "\\", ") + "so there is no way to handle the request.";\n } else if (method) {\n errorMessage = "Invalid request method \\"" + method.toUpperCase() + "\\"";\n }\n }\n return new ErrorResponseImpl(status || 500, statusText, new Error(errorMessage), true);\n}\n// Find any returned redirect errors, starting from the lowest match\nfunction findRedirect(results) {\n for (let i = results.length - 1; i >= 0; i--) {\n let result = results[i];\n if (isRedirectResult(result)) {\n return {\n result,\n idx: i\n };\n }\n }\n}\nfunction stripHashFromPath(path) {\n let parsedPath = typeof path === "string" ? parsePath(path) : path;\n return router_createPath(router_extends({}, parsedPath, {\n hash: ""\n }));\n}\nfunction isHashChangeOnly(a, b) {\n if (a.pathname !== b.pathname || a.search !== b.search) {\n return false;\n }\n if (a.hash === "") {\n // /page -> /page#hash\n return b.hash !== "";\n } else if (a.hash === b.hash) {\n // /page#hash -> /page#hash\n return true;\n } else if (b.hash !== "") {\n // /page#hash -> /page#other\n return true;\n }\n // If the hash is removed the browser will re-perform a request to the server\n // /page#hash -> /page\n return false;\n}\nfunction isDeferredResult(result) {\n return result.type === ResultType.deferred;\n}\nfunction isErrorResult(result) {\n return result.type === ResultType.error;\n}\nfunction isRedirectResult(result) {\n return (result && result.type) === ResultType.redirect;\n}\nfunction isDeferredData(value) {\n let deferred = value;\n return deferred && typeof deferred === "object" && typeof deferred.data === "object" && typeof deferred.subscribe === "function" && typeof deferred.cancel === "function" && typeof deferred.resolveData === "function";\n}\nfunction isResponse(value) {\n return value != null && typeof value.status === "number" && typeof value.statusText === "string" && typeof value.headers === "object" && typeof value.body !== "undefined";\n}\nfunction isRedirectResponse(result) {\n if (!isResponse(result)) {\n return false;\n }\n let status = result.status;\n let location = result.headers.get("Location");\n return status >= 300 && status <= 399 && location != null;\n}\nfunction isQueryRouteResponse(obj) {\n return obj && isResponse(obj.response) && (obj.type === ResultType.data || obj.type === ResultType.error);\n}\nfunction isValidMethod(method) {\n return validRequestMethods.has(method.toLowerCase());\n}\nfunction isMutationMethod(method) {\n return validMutationMethods.has(method.toLowerCase());\n}\nasync function resolveDeferredResults(currentMatches, matchesToLoad, results, signals, isFetcher, currentLoaderData) {\n for (let index = 0; index < results.length; index++) {\n let result = results[index];\n let match = matchesToLoad[index];\n // If we don\'t have a match, then we can have a deferred result to do\n // anything with. This is for revalidating fetchers where the route was\n // removed during HMR\n if (!match) {\n continue;\n }\n let currentMatch = currentMatches.find(m => m.route.id === match.route.id);\n let isRevalidatingLoader = currentMatch != null && !isNewRouteInstance(currentMatch, match) && (currentLoaderData && currentLoaderData[match.route.id]) !== undefined;\n if (isDeferredResult(result) && (isFetcher || isRevalidatingLoader)) {\n // Note: we do not have to touch activeDeferreds here since we race them\n // against the signal in resolveDeferredData and they\'ll get aborted\n // there if needed\n let signal = signals[index];\n router_invariant(signal, "Expected an AbortSignal for revalidating fetcher deferred result");\n await resolveDeferredData(result, signal, isFetcher).then(result => {\n if (result) {\n results[index] = result || results[index];\n }\n });\n }\n }\n}\nasync function resolveDeferredData(result, signal, unwrap) {\n if (unwrap === void 0) {\n unwrap = false;\n }\n let aborted = await result.deferredData.resolveData(signal);\n if (aborted) {\n return;\n }\n if (unwrap) {\n try {\n return {\n type: ResultType.data,\n data: result.deferredData.unwrappedData\n };\n } catch (e) {\n // Handle any TrackedPromise._error values encountered while unwrapping\n return {\n type: ResultType.error,\n error: e\n };\n }\n }\n return {\n type: ResultType.data,\n data: result.deferredData.data\n };\n}\nfunction hasNakedIndexQuery(search) {\n return new URLSearchParams(search).getAll("index").some(v => v === "");\n}\nfunction getTargetMatch(matches, location) {\n let search = typeof location === "string" ? parsePath(location).search : location.search;\n if (matches[matches.length - 1].route.index && hasNakedIndexQuery(search || "")) {\n // Return the leaf index route when index is present\n return matches[matches.length - 1];\n }\n // Otherwise grab the deepest "path contributing" match (ignoring index and\n // pathless layout routes)\n let pathMatches = getPathContributingMatches(matches);\n return pathMatches[pathMatches.length - 1];\n}\nfunction getSubmissionFromNavigation(navigation) {\n let {\n formMethod,\n formAction,\n formEncType,\n text,\n formData,\n json\n } = navigation;\n if (!formMethod || !formAction || !formEncType) {\n return;\n }\n if (text != null) {\n return {\n formMethod,\n formAction,\n formEncType,\n formData: undefined,\n json: undefined,\n text\n };\n } else if (formData != null) {\n return {\n formMethod,\n formAction,\n formEncType,\n formData,\n json: undefined,\n text: undefined\n };\n } else if (json !== undefined) {\n return {\n formMethod,\n formAction,\n formEncType,\n formData: undefined,\n json,\n text: undefined\n };\n }\n}\nfunction getLoadingNavigation(location, submission) {\n if (submission) {\n let navigation = {\n state: "loading",\n location,\n formMethod: submission.formMethod,\n formAction: submission.formAction,\n formEncType: submission.formEncType,\n formData: submission.formData,\n json: submission.json,\n text: submission.text\n };\n return navigation;\n } else {\n let navigation = {\n state: "loading",\n location,\n formMethod: undefined,\n formAction: undefined,\n formEncType: undefined,\n formData: undefined,\n json: undefined,\n text: undefined\n };\n return navigation;\n }\n}\nfunction getSubmittingNavigation(location, submission) {\n let navigation = {\n state: "submitting",\n location,\n formMethod: submission.formMethod,\n formAction: submission.formAction,\n formEncType: submission.formEncType,\n formData: submission.formData,\n json: submission.json,\n text: submission.text\n };\n return navigation;\n}\nfunction getLoadingFetcher(submission, data) {\n if (submission) {\n let fetcher = {\n state: "loading",\n formMethod: submission.formMethod,\n formAction: submission.formAction,\n formEncType: submission.formEncType,\n formData: submission.formData,\n json: submission.json,\n text: submission.text,\n data\n };\n return fetcher;\n } else {\n let fetcher = {\n state: "loading",\n formMethod: undefined,\n formAction: undefined,\n formEncType: undefined,\n formData: undefined,\n json: undefined,\n text: undefined,\n data\n };\n return fetcher;\n }\n}\nfunction getSubmittingFetcher(submission, existingFetcher) {\n let fetcher = {\n state: "submitting",\n formMethod: submission.formMethod,\n formAction: submission.formAction,\n formEncType: submission.formEncType,\n formData: submission.formData,\n json: submission.json,\n text: submission.text,\n data: existingFetcher ? existingFetcher.data : undefined\n };\n return fetcher;\n}\nfunction getDoneFetcher(data) {\n let fetcher = {\n state: "idle",\n formMethod: undefined,\n formAction: undefined,\n formEncType: undefined,\n formData: undefined,\n json: undefined,\n text: undefined,\n data\n };\n return fetcher;\n}\nfunction restoreAppliedTransitions(_window, transitions) {\n try {\n let sessionPositions = _window.sessionStorage.getItem(TRANSITIONS_STORAGE_KEY);\n if (sessionPositions) {\n let json = JSON.parse(sessionPositions);\n for (let [k, v] of Object.entries(json || {})) {\n if (v && Array.isArray(v)) {\n transitions.set(k, new Set(v || []));\n }\n }\n }\n } catch (e) {\n // no-op, use default empty object\n }\n}\nfunction persistAppliedTransitions(_window, transitions) {\n if (transitions.size > 0) {\n let json = {};\n for (let [k, v] of transitions) {\n json[k] = [...v];\n }\n try {\n _window.sessionStorage.setItem(TRANSITIONS_STORAGE_KEY, JSON.stringify(json));\n } catch (error) {\n warning(false, "Failed to save applied view transitions in sessionStorage (" + error + ").");\n }\n }\n}\n//#endregion\n\n\n//# sourceMappingURL=router.js.map\n\n;// CONCATENATED MODULE: ./node_modules/react-router/dist/index.js\n/**\n * React Router v6.20.1\n *\n * Copyright (c) Remix Software Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE.md file in the root directory of this source tree.\n *\n * @license MIT\n */\n\n\n\n\nfunction dist_extends() {\n dist_extends = Object.assign ? Object.assign.bind() : function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return dist_extends.apply(this, arguments);\n}\n\n// Create react-specific types from the agnostic types in @remix-run/router to\n// export from react-router\nconst DataRouterContext = /*#__PURE__*/react.createContext(null);\nif (false) {}\nconst DataRouterStateContext = /*#__PURE__*/react.createContext(null);\nif (false) {}\nconst AwaitContext = /*#__PURE__*/react.createContext(null);\nif (false) {}\n\n/**\n * A Navigator is a "location changer"; it\'s how you get to different locations.\n *\n * Every history instance conforms to the Navigator interface, but the\n * distinction is useful primarily when it comes to the low-level `<Router>` API\n * where both the location and a navigator must be provided separately in order\n * to avoid "tearing" that may occur in a suspense-enabled app if the action\n * and/or location were to be read directly from the history instance.\n */\n\nconst NavigationContext = /*#__PURE__*/react.createContext(null);\nif (false) {}\nconst LocationContext = /*#__PURE__*/react.createContext(null);\nif (false) {}\nconst RouteContext = /*#__PURE__*/react.createContext({\n outlet: null,\n matches: [],\n isDataRoute: false\n});\nif (false) {}\nconst RouteErrorContext = /*#__PURE__*/react.createContext(null);\nif (false) {}\n\n/**\n * Returns the full href for the given "to" value. This is useful for building\n * custom links that are also accessible and preserve right-click behavior.\n *\n * @see https://reactrouter.com/hooks/use-href\n */\nfunction dist_useHref(to, _temp) {\n let {\n relative\n } = _temp === void 0 ? {} : _temp;\n !useInRouterContext() ? false ? 0 : UNSAFE_invariant(false) : void 0;\n let {\n basename,\n navigator\n } = React.useContext(NavigationContext);\n let {\n hash,\n pathname,\n search\n } = dist_useResolvedPath(to, {\n relative\n });\n let joinedPathname = pathname;\n\n // If we\'re operating within a basename, prepend it to the pathname prior\n // to creating the href. If this is a root navigation, then just use the raw\n // basename which allows the basename to have full control over the presence\n // of a trailing slash on root links\n if (basename !== "/") {\n joinedPathname = pathname === "/" ? basename : joinPaths([basename, pathname]);\n }\n return navigator.createHref({\n pathname: joinedPathname,\n search,\n hash\n });\n}\n\n/**\n * Returns true if this component is a descendant of a `<Router>`.\n *\n * @see https://reactrouter.com/hooks/use-in-router-context\n */\nfunction useInRouterContext() {\n return react.useContext(LocationContext) != null;\n}\n\n/**\n * Returns the current location object, which represents the current URL in web\n * browsers.\n *\n * Note: If you\'re using this it may mean you\'re doing some of your own\n * "routing" in your app, and we\'d like to know what your use case is. We may\n * be able to provide something higher-level to better suit your needs.\n *\n * @see https://reactrouter.com/hooks/use-location\n */\nfunction dist_useLocation() {\n !useInRouterContext() ? false ? 0 : router_invariant(false) : void 0;\n return react.useContext(LocationContext).location;\n}\n\n/**\n * Returns the current navigation action which describes how the router came to\n * the current location, either by a pop, push, or replace on the history stack.\n *\n * @see https://reactrouter.com/hooks/use-navigation-type\n */\nfunction useNavigationType() {\n return React.useContext(LocationContext).navigationType;\n}\n\n/**\n * Returns a PathMatch object if the given pattern matches the current URL.\n * This is useful for components that need to know "active" state, e.g.\n * `<NavLink>`.\n *\n * @see https://reactrouter.com/hooks/use-match\n */\nfunction useMatch(pattern) {\n !useInRouterContext() ? false ? 0 : UNSAFE_invariant(false) : void 0;\n let {\n pathname\n } = dist_useLocation();\n return React.useMemo(() => matchPath(pattern, pathname), [pathname, pattern]);\n}\n\n/**\n * The interface for the navigate() function returned from useNavigate().\n */\n\nconst navigateEffectWarning = (/* unused pure expression or super */ null && ("You should call navigate() in a React.useEffect(), not when " + "your component is first rendered."));\n\n// Mute warnings for calls to useNavigate in SSR environments\nfunction useIsomorphicLayoutEffect(cb) {\n let isStatic = React.useContext(NavigationContext).static;\n if (!isStatic) {\n // We should be able to get rid of this once react 18.3 is released\n // See: https://github.com/facebook/react/pull/26395\n // eslint-disable-next-line react-hooks/rules-of-hooks\n React.useLayoutEffect(cb);\n }\n}\n\n/**\n * Returns an imperative method for changing the location. Used by `<Link>`s, but\n * may also be used by other elements to change the location.\n *\n * @see https://reactrouter.com/hooks/use-navigate\n */\nfunction dist_useNavigate() {\n let {\n isDataRoute\n } = React.useContext(RouteContext);\n // Conditional usage is OK here because the usage of a data router is static\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return isDataRoute ? useNavigateStable() : useNavigateUnstable();\n}\nfunction useNavigateUnstable() {\n !useInRouterContext() ? false ? 0 : UNSAFE_invariant(false) : void 0;\n let dataRouterContext = React.useContext(DataRouterContext);\n let {\n basename,\n navigator\n } = React.useContext(NavigationContext);\n let {\n matches\n } = React.useContext(RouteContext);\n let {\n pathname: locationPathname\n } = dist_useLocation();\n let routePathnamesJson = JSON.stringify(UNSAFE_getPathContributingMatches(matches).map(match => match.pathnameBase));\n let activeRef = React.useRef(false);\n useIsomorphicLayoutEffect(() => {\n activeRef.current = true;\n });\n let navigate = React.useCallback(function (to, options) {\n if (options === void 0) {\n options = {};\n }\n false ? 0 : void 0;\n\n // Short circuit here since if this happens on first render the navigate\n // is useless because we haven\'t wired up our history listener yet\n if (!activeRef.current) return;\n if (typeof to === "number") {\n navigator.go(to);\n return;\n }\n let path = resolveTo(to, JSON.parse(routePathnamesJson), locationPathname, options.relative === "path");\n\n // If we\'re operating within a basename, prepend it to the pathname prior\n // to handing off to history (but only if we\'re not in a data router,\n // otherwise it\'ll prepend the basename inside of the router).\n // If this is a root navigation, then we navigate to the raw basename\n // which allows the basename to have full control over the presence of a\n // trailing slash on root links\n if (dataRouterContext == null && basename !== "/") {\n path.pathname = path.pathname === "/" ? basename : joinPaths([basename, path.pathname]);\n }\n (!!options.replace ? navigator.replace : navigator.push)(path, options.state, options);\n }, [basename, navigator, routePathnamesJson, locationPathname, dataRouterContext]);\n return navigate;\n}\nconst OutletContext = /*#__PURE__*/react.createContext(null);\n\n/**\n * Returns the context (if provided) for the child route at this level of the route\n * hierarchy.\n * @see https://reactrouter.com/hooks/use-outlet-context\n */\nfunction useOutletContext() {\n return React.useContext(OutletContext);\n}\n\n/**\n * Returns the element for the child route at this level of the route\n * hierarchy. Used internally by `<Outlet>` to render child routes.\n *\n * @see https://reactrouter.com/hooks/use-outlet\n */\nfunction useOutlet(context) {\n let outlet = react.useContext(RouteContext).outlet;\n if (outlet) {\n return /*#__PURE__*/react.createElement(OutletContext.Provider, {\n value: context\n }, outlet);\n }\n return outlet;\n}\n\n/**\n * Returns an object of key/value pairs of the dynamic params from the current\n * URL that were matched by the route path.\n *\n * @see https://reactrouter.com/hooks/use-params\n */\nfunction useParams() {\n let {\n matches\n } = React.useContext(RouteContext);\n let routeMatch = matches[matches.length - 1];\n return routeMatch ? routeMatch.params : {};\n}\n\n/**\n * Resolves the pathname of the given `to` value against the current location.\n *\n * @see https://reactrouter.com/hooks/use-resolved-path\n */\nfunction dist_useResolvedPath(to, _temp2) {\n let {\n relative\n } = _temp2 === void 0 ? {} : _temp2;\n let {\n matches\n } = React.useContext(RouteContext);\n let {\n pathname: locationPathname\n } = dist_useLocation();\n let routePathnamesJson = JSON.stringify(UNSAFE_getPathContributingMatches(matches).map(match => match.pathnameBase));\n return React.useMemo(() => resolveTo(to, JSON.parse(routePathnamesJson), locationPathname, relative === "path"), [to, routePathnamesJson, locationPathname, relative]);\n}\n\n/**\n * Returns the element of the route that matched the current location, prepared\n * with the correct context to render the remainder of the route tree. Route\n * elements in the tree must render an `<Outlet>` to render their child route\'s\n * element.\n *\n * @see https://reactrouter.com/hooks/use-routes\n */\nfunction useRoutes(routes, locationArg) {\n return useRoutesImpl(routes, locationArg);\n}\n\n// Internal implementation with accept optional param for RouterProvider usage\nfunction useRoutesImpl(routes, locationArg, dataRouterState) {\n !useInRouterContext() ? false ? 0 : router_invariant(false) : void 0;\n let {\n navigator\n } = react.useContext(NavigationContext);\n let {\n matches: parentMatches\n } = react.useContext(RouteContext);\n let routeMatch = parentMatches[parentMatches.length - 1];\n let parentParams = routeMatch ? routeMatch.params : {};\n let parentPathname = routeMatch ? routeMatch.pathname : "/";\n let parentPathnameBase = routeMatch ? routeMatch.pathnameBase : "/";\n let parentRoute = routeMatch && routeMatch.route;\n if (false) {}\n let locationFromContext = dist_useLocation();\n let location;\n if (locationArg) {\n var _parsedLocationArg$pa;\n let parsedLocationArg = typeof locationArg === "string" ? parsePath(locationArg) : locationArg;\n !(parentPathnameBase === "/" || ((_parsedLocationArg$pa = parsedLocationArg.pathname) == null ? void 0 : _parsedLocationArg$pa.startsWith(parentPathnameBase))) ? false ? 0 : router_invariant(false) : void 0;\n location = parsedLocationArg;\n } else {\n location = locationFromContext;\n }\n let pathname = location.pathname || "/";\n let remainingPathname = parentPathnameBase === "/" ? pathname : pathname.slice(parentPathnameBase.length) || "/";\n let matches = matchRoutes(routes, {\n pathname: remainingPathname\n });\n if (false) {}\n let renderedMatches = _renderMatches(matches && matches.map(match => Object.assign({}, match, {\n params: Object.assign({}, parentParams, match.params),\n pathname: router_joinPaths([parentPathnameBase,\n // Re-encode pathnames that were decoded inside matchRoutes\n navigator.encodeLocation ? navigator.encodeLocation(match.pathname).pathname : match.pathname]),\n pathnameBase: match.pathnameBase === "/" ? parentPathnameBase : router_joinPaths([parentPathnameBase,\n // Re-encode pathnames that were decoded inside matchRoutes\n navigator.encodeLocation ? navigator.encodeLocation(match.pathnameBase).pathname : match.pathnameBase])\n })), parentMatches, dataRouterState);\n\n // When a user passes in a `locationArg`, the associated routes need to\n // be wrapped in a new `LocationContext.Provider` in order for `useLocation`\n // to use the scoped location instead of the global location.\n if (locationArg && renderedMatches) {\n return /*#__PURE__*/react.createElement(LocationContext.Provider, {\n value: {\n location: dist_extends({\n pathname: "/",\n search: "",\n hash: "",\n state: null,\n key: "default"\n }, location),\n navigationType: Action.Pop\n }\n }, renderedMatches);\n }\n return renderedMatches;\n}\nfunction DefaultErrorComponent() {\n let error = useRouteError();\n let message = isRouteErrorResponse(error) ? error.status + " " + error.statusText : error instanceof Error ? error.message : JSON.stringify(error);\n let stack = error instanceof Error ? error.stack : null;\n let lightgrey = "rgba(200,200,200, 0.5)";\n let preStyles = {\n padding: "0.5rem",\n backgroundColor: lightgrey\n };\n let codeStyles = {\n padding: "2px 4px",\n backgroundColor: lightgrey\n };\n let devInfo = null;\n if (false) {}\n return /*#__PURE__*/react.createElement(react.Fragment, null, /*#__PURE__*/react.createElement("h2", null, "Unexpected Application Error!"), /*#__PURE__*/react.createElement("h3", {\n style: {\n fontStyle: "italic"\n }\n }, message), stack ? /*#__PURE__*/react.createElement("pre", {\n style: preStyles\n }, stack) : null, devInfo);\n}\nconst defaultErrorElement = /*#__PURE__*/react.createElement(DefaultErrorComponent, null);\nclass RenderErrorBoundary extends react.Component {\n constructor(props) {\n super(props);\n this.state = {\n location: props.location,\n revalidation: props.revalidation,\n error: props.error\n };\n }\n static getDerivedStateFromError(error) {\n return {\n error: error\n };\n }\n static getDerivedStateFromProps(props, state) {\n // When we get into an error state, the user will likely click "back" to the\n // previous page that didn\'t have an error. Because this wraps the entire\n // application, that will have no effect--the error page continues to display.\n // This gives us a mechanism to recover from the error when the location changes.\n //\n // Whether we\'re in an error state or not, we update the location in state\n // so that when we are in an error state, it gets reset when a new location\n // comes in and the user recovers from the error.\n if (state.location !== props.location || state.revalidation !== "idle" && props.revalidation === "idle") {\n return {\n error: props.error,\n location: props.location,\n revalidation: props.revalidation\n };\n }\n\n // If we\'re not changing locations, preserve the location but still surface\n // any new errors that may come through. We retain the existing error, we do\n // this because the error provided from the app state may be cleared without\n // the location changing.\n return {\n error: props.error || state.error,\n location: state.location,\n revalidation: props.revalidation || state.revalidation\n };\n }\n componentDidCatch(error, errorInfo) {\n console.error("React Router caught the following error during render", error, errorInfo);\n }\n render() {\n return this.state.error ? /*#__PURE__*/react.createElement(RouteContext.Provider, {\n value: this.props.routeContext\n }, /*#__PURE__*/react.createElement(RouteErrorContext.Provider, {\n value: this.state.error,\n children: this.props.component\n })) : this.props.children;\n }\n}\nfunction RenderedRoute(_ref) {\n let {\n routeContext,\n match,\n children\n } = _ref;\n let dataRouterContext = react.useContext(DataRouterContext);\n\n // Track how deep we got in our render pass to emulate SSR componentDidCatch\n // in a DataStaticRouter\n if (dataRouterContext && dataRouterContext.static && dataRouterContext.staticContext && (match.route.errorElement || match.route.ErrorBoundary)) {\n dataRouterContext.staticContext._deepestRenderedBoundaryId = match.route.id;\n }\n return /*#__PURE__*/react.createElement(RouteContext.Provider, {\n value: routeContext\n }, children);\n}\nfunction _renderMatches(matches, parentMatches, dataRouterState) {\n var _dataRouterState2;\n if (parentMatches === void 0) {\n parentMatches = [];\n }\n if (dataRouterState === void 0) {\n dataRouterState = null;\n }\n if (matches == null) {\n var _dataRouterState;\n if ((_dataRouterState = dataRouterState) != null && _dataRouterState.errors) {\n // Don\'t bail if we have data router errors so we can render them in the\n // boundary. Use the pre-matched (or shimmed) matches\n matches = dataRouterState.matches;\n } else {\n return null;\n }\n }\n let renderedMatches = matches;\n\n // If we have data errors, trim matches to the highest error boundary\n let errors = (_dataRouterState2 = dataRouterState) == null ? void 0 : _dataRouterState2.errors;\n if (errors != null) {\n let errorIndex = renderedMatches.findIndex(m => m.route.id && (errors == null ? void 0 : errors[m.route.id]));\n !(errorIndex >= 0) ? false ? 0 : router_invariant(false) : void 0;\n renderedMatches = renderedMatches.slice(0, Math.min(renderedMatches.length, errorIndex + 1));\n }\n return renderedMatches.reduceRight((outlet, match, index) => {\n let error = match.route.id ? errors == null ? void 0 : errors[match.route.id] : null;\n // Only data routers handle errors\n let errorElement = null;\n if (dataRouterState) {\n errorElement = match.route.errorElement || defaultErrorElement;\n }\n let matches = parentMatches.concat(renderedMatches.slice(0, index + 1));\n let getChildren = () => {\n let children;\n if (error) {\n children = errorElement;\n } else if (match.route.Component) {\n // Note: This is a de-optimized path since React won\'t re-use the\n // ReactElement since it\'s identity changes with each new\n // React.createElement call. We keep this so folks can use\n // `<Route Component={...}>` in `<Routes>` but generally `Component`\n // usage is only advised in `RouterProvider` when we can convert it to\n // `element` ahead of time.\n children = /*#__PURE__*/react.createElement(match.route.Component, null);\n } else if (match.route.element) {\n children = match.route.element;\n } else {\n children = outlet;\n }\n return /*#__PURE__*/react.createElement(RenderedRoute, {\n match: match,\n routeContext: {\n outlet,\n matches,\n isDataRoute: dataRouterState != null\n },\n children: children\n });\n };\n // Only wrap in an error boundary within data router usages when we have an\n // ErrorBoundary/errorElement on this route. Otherwise let it bubble up to\n // an ancestor ErrorBoundary/errorElement\n return dataRouterState && (match.route.ErrorBoundary || match.route.errorElement || index === 0) ? /*#__PURE__*/react.createElement(RenderErrorBoundary, {\n location: dataRouterState.location,\n revalidation: dataRouterState.revalidation,\n component: errorElement,\n error: error,\n children: getChildren(),\n routeContext: {\n outlet: null,\n matches,\n isDataRoute: true\n }\n }) : getChildren();\n }, null);\n}\nvar DataRouterHook = /*#__PURE__*/function (DataRouterHook) {\n DataRouterHook["UseBlocker"] = "useBlocker";\n DataRouterHook["UseRevalidator"] = "useRevalidator";\n DataRouterHook["UseNavigateStable"] = "useNavigate";\n return DataRouterHook;\n}(DataRouterHook || {});\nvar DataRouterStateHook = /*#__PURE__*/function (DataRouterStateHook) {\n DataRouterStateHook["UseBlocker"] = "useBlocker";\n DataRouterStateHook["UseLoaderData"] = "useLoaderData";\n DataRouterStateHook["UseActionData"] = "useActionData";\n DataRouterStateHook["UseRouteError"] = "useRouteError";\n DataRouterStateHook["UseNavigation"] = "useNavigation";\n DataRouterStateHook["UseRouteLoaderData"] = "useRouteLoaderData";\n DataRouterStateHook["UseMatches"] = "useMatches";\n DataRouterStateHook["UseRevalidator"] = "useRevalidator";\n DataRouterStateHook["UseNavigateStable"] = "useNavigate";\n DataRouterStateHook["UseRouteId"] = "useRouteId";\n return DataRouterStateHook;\n}(DataRouterStateHook || {});\nfunction getDataRouterConsoleError(hookName) {\n return hookName + " must be used within a data router. See https://reactrouter.com/routers/picking-a-router.";\n}\nfunction useDataRouterContext(hookName) {\n let ctx = React.useContext(DataRouterContext);\n !ctx ? false ? 0 : UNSAFE_invariant(false) : void 0;\n return ctx;\n}\nfunction useDataRouterState(hookName) {\n let state = react.useContext(DataRouterStateContext);\n !state ? false ? 0 : router_invariant(false) : void 0;\n return state;\n}\nfunction useRouteContext(hookName) {\n let route = react.useContext(RouteContext);\n !route ? false ? 0 : router_invariant(false) : void 0;\n return route;\n}\n\n// Internal version with hookName-aware debugging\nfunction useCurrentRouteId(hookName) {\n let route = useRouteContext(hookName);\n let thisRoute = route.matches[route.matches.length - 1];\n !thisRoute.route.id ? false ? 0 : router_invariant(false) : void 0;\n return thisRoute.route.id;\n}\n\n/**\n * Returns the ID for the nearest contextual route\n */\nfunction useRouteId() {\n return useCurrentRouteId(DataRouterStateHook.UseRouteId);\n}\n\n/**\n * Returns the current navigation, defaulting to an "idle" navigation when\n * no navigation is in progress\n */\nfunction dist_useNavigation() {\n let state = useDataRouterState(DataRouterStateHook.UseNavigation);\n return state.navigation;\n}\n\n/**\n * Returns a revalidate function for manually triggering revalidation, as well\n * as the current state of any manual revalidations\n */\nfunction useRevalidator() {\n let dataRouterContext = useDataRouterContext(DataRouterHook.UseRevalidator);\n let state = useDataRouterState(DataRouterStateHook.UseRevalidator);\n return React.useMemo(() => ({\n revalidate: dataRouterContext.router.revalidate,\n state: state.revalidation\n }), [dataRouterContext.router.revalidate, state.revalidation]);\n}\n\n/**\n * Returns the active route matches, useful for accessing loaderData for\n * parent/child routes or the route "handle" property\n */\nfunction dist_useMatches() {\n let {\n matches,\n loaderData\n } = useDataRouterState(DataRouterStateHook.UseMatches);\n return React.useMemo(() => matches.map(m => UNSAFE_convertRouteMatchToUiMatch(m, loaderData)), [matches, loaderData]);\n}\n\n/**\n * Returns the loader data for the nearest ancestor Route loader\n */\nfunction useLoaderData() {\n let state = useDataRouterState(DataRouterStateHook.UseLoaderData);\n let routeId = useCurrentRouteId(DataRouterStateHook.UseLoaderData);\n if (state.errors && state.errors[routeId] != null) {\n console.error("You cannot `useLoaderData` in an errorElement (routeId: " + routeId + ")");\n return undefined;\n }\n return state.loaderData[routeId];\n}\n\n/**\n * Returns the loaderData for the given routeId\n */\nfunction useRouteLoaderData(routeId) {\n let state = useDataRouterState(DataRouterStateHook.UseRouteLoaderData);\n return state.loaderData[routeId];\n}\n\n/**\n * Returns the action data for the nearest ancestor Route action\n */\nfunction useActionData() {\n let state = useDataRouterState(DataRouterStateHook.UseActionData);\n let routeId = useCurrentRouteId(DataRouterStateHook.UseLoaderData);\n return state.actionData ? state.actionData[routeId] : undefined;\n}\n\n/**\n * Returns the nearest ancestor Route error, which could be a loader/action\n * error or a render error. This is intended to be called from your\n * ErrorBoundary/errorElement to display a proper error message.\n */\nfunction useRouteError() {\n var _state$errors;\n let error = react.useContext(RouteErrorContext);\n let state = useDataRouterState(DataRouterStateHook.UseRouteError);\n let routeId = useCurrentRouteId(DataRouterStateHook.UseRouteError);\n\n // If this was a render error, we put it in a RouteError context inside\n // of RenderErrorBoundary\n if (error) {\n return error;\n }\n\n // Otherwise look for errors from our data router state\n return (_state$errors = state.errors) == null ? void 0 : _state$errors[routeId];\n}\n\n/**\n * Returns the happy-path data from the nearest ancestor `<Await />` value\n */\nfunction useAsyncValue() {\n let value = React.useContext(AwaitContext);\n return value == null ? void 0 : value._data;\n}\n\n/**\n * Returns the error from the nearest ancestor `<Await />` value\n */\nfunction useAsyncError() {\n let value = React.useContext(AwaitContext);\n return value == null ? void 0 : value._error;\n}\nlet blockerId = 0;\n\n/**\n * Allow the application to block navigations within the SPA and present the\n * user a confirmation dialog to confirm the navigation. Mostly used to avoid\n * using half-filled form data. This does not handle hard-reloads or\n * cross-origin navigations.\n */\nfunction dist_useBlocker(shouldBlock) {\n let {\n router,\n basename\n } = useDataRouterContext(DataRouterHook.UseBlocker);\n let state = useDataRouterState(DataRouterStateHook.UseBlocker);\n let [blockerKey, setBlockerKey] = React.useState("");\n let blockerFunction = React.useCallback(arg => {\n if (typeof shouldBlock !== "function") {\n return !!shouldBlock;\n }\n if (basename === "/") {\n return shouldBlock(arg);\n }\n\n // If they provided us a function and we\'ve got an active basename, strip\n // it from the locations we expose to the user to match the behavior of\n // useLocation\n let {\n currentLocation,\n nextLocation,\n historyAction\n } = arg;\n return shouldBlock({\n currentLocation: dist_extends({}, currentLocation, {\n pathname: stripBasename(currentLocation.pathname, basename) || currentLocation.pathname\n }),\n nextLocation: dist_extends({}, nextLocation, {\n pathname: stripBasename(nextLocation.pathname, basename) || nextLocation.pathname\n }),\n historyAction\n });\n }, [basename, shouldBlock]);\n\n // This effect is in charge of blocker key assignment and deletion (which is\n // tightly coupled to the key)\n React.useEffect(() => {\n let key = String(++blockerId);\n setBlockerKey(key);\n return () => router.deleteBlocker(key);\n }, [router]);\n\n // This effect handles assigning the blockerFunction. This is to handle\n // unstable blocker function identities, and happens only after the prior\n // effect so we don\'t get an orphaned blockerFunction in the router with a\n // key of "". Until then we just have the IDLE_BLOCKER.\n React.useEffect(() => {\n if (blockerKey !== "") {\n router.getBlocker(blockerKey, blockerFunction);\n }\n }, [router, blockerKey, blockerFunction]);\n\n // Prefer the blocker from `state` not `router.state` since DataRouterContext\n // is memoized so this ensures we update on blocker state updates\n return blockerKey && state.blockers.has(blockerKey) ? state.blockers.get(blockerKey) : IDLE_BLOCKER;\n}\n\n/**\n * Stable version of useNavigate that is used when we are in the context of\n * a RouterProvider.\n */\nfunction useNavigateStable() {\n let {\n router\n } = useDataRouterContext(DataRouterHook.UseNavigateStable);\n let id = useCurrentRouteId(DataRouterStateHook.UseNavigateStable);\n let activeRef = React.useRef(false);\n useIsomorphicLayoutEffect(() => {\n activeRef.current = true;\n });\n let navigate = React.useCallback(function (to, options) {\n if (options === void 0) {\n options = {};\n }\n false ? 0 : void 0;\n\n // Short circuit here since if this happens on first render the navigate\n // is useless because we haven\'t wired up our router subscriber yet\n if (!activeRef.current) return;\n if (typeof to === "number") {\n router.navigate(to);\n } else {\n router.navigate(to, dist_extends({\n fromRouteId: id\n }, options));\n }\n }, [router, id]);\n return navigate;\n}\nconst alreadyWarned = {};\nfunction warningOnce(key, cond, message) {\n if (!cond && !alreadyWarned[key]) {\n alreadyWarned[key] = true;\n false ? 0 : void 0;\n }\n}\n\n/**\n Webpack + React 17 fails to compile on any of the following because webpack\n complains that `startTransition` doesn\'t exist in `React`:\n * import { startTransition } from "react"\n * import * as React from from "react";\n "startTransition" in React ? React.startTransition(() => setState()) : setState()\n * import * as React from from "react";\n "startTransition" in React ? React["startTransition"](() => setState()) : setState()\n\n Moving it to a constant such as the following solves the Webpack/React 17 issue:\n * import * as React from from "react";\n const START_TRANSITION = "startTransition";\n START_TRANSITION in React ? React[START_TRANSITION](() => setState()) : setState()\n\n However, that introduces webpack/terser minification issues in production builds\n in React 18 where minification/obfuscation ends up removing the call of\n React.startTransition entirely from the first half of the ternary. Grabbing\n this exported reference once up front resolves that issue.\n\n See https://github.com/remix-run/react-router/issues/10579\n*/\nconst START_TRANSITION = "startTransition";\nconst startTransitionImpl = react_namespaceObject[START_TRANSITION];\n\n/**\n * Given a Remix Router instance, render the appropriate UI\n */\nfunction RouterProvider(_ref) {\n let {\n fallbackElement,\n router,\n future\n } = _ref;\n let [state, setStateImpl] = React.useState(router.state);\n let {\n v7_startTransition\n } = future || {};\n let setState = React.useCallback(newState => {\n if (v7_startTransition && startTransitionImpl) {\n startTransitionImpl(() => setStateImpl(newState));\n } else {\n setStateImpl(newState);\n }\n }, [setStateImpl, v7_startTransition]);\n\n // Need to use a layout effect here so we are subscribed early enough to\n // pick up on any render-driven redirects/navigations (useEffect/<Navigate>)\n React.useLayoutEffect(() => router.subscribe(setState), [router, setState]);\n let navigator = React.useMemo(() => {\n return {\n createHref: router.createHref,\n encodeLocation: router.encodeLocation,\n go: n => router.navigate(n),\n push: (to, state, opts) => router.navigate(to, {\n state,\n preventScrollReset: opts == null ? void 0 : opts.preventScrollReset\n }),\n replace: (to, state, opts) => router.navigate(to, {\n replace: true,\n state,\n preventScrollReset: opts == null ? void 0 : opts.preventScrollReset\n })\n };\n }, [router]);\n let basename = router.basename || "/";\n let dataRouterContext = React.useMemo(() => ({\n router,\n navigator,\n static: false,\n basename\n }), [router, navigator, basename]);\n\n // The fragment and {null} here are important! We need them to keep React 18\'s\n // useId happy when we are server-rendering since we may have a <script> here\n // containing the hydrated server-side staticContext (from StaticRouterProvider).\n // useId relies on the component tree structure to generate deterministic id\'s\n // so we need to ensure it remains the same on the client even though\n // we don\'t need the <script> tag\n return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(DataRouterContext.Provider, {\n value: dataRouterContext\n }, /*#__PURE__*/React.createElement(DataRouterStateContext.Provider, {\n value: state\n }, /*#__PURE__*/React.createElement(dist_Router, {\n basename: basename,\n location: state.location,\n navigationType: state.historyAction,\n navigator: navigator\n }, state.initialized ? /*#__PURE__*/React.createElement(DataRoutes, {\n routes: router.routes,\n state: state\n }) : fallbackElement))), null);\n}\nfunction DataRoutes(_ref2) {\n let {\n routes,\n state\n } = _ref2;\n return useRoutesImpl(routes, undefined, state);\n}\n/**\n * A `<Router>` that stores all entries in memory.\n *\n * @see https://reactrouter.com/router-components/memory-router\n */\nfunction MemoryRouter(_ref3) {\n let {\n basename,\n children,\n initialEntries,\n initialIndex,\n future\n } = _ref3;\n let historyRef = React.useRef();\n if (historyRef.current == null) {\n historyRef.current = createMemoryHistory({\n initialEntries,\n initialIndex,\n v5Compat: true\n });\n }\n let history = historyRef.current;\n let [state, setStateImpl] = React.useState({\n action: history.action,\n location: history.location\n });\n let {\n v7_startTransition\n } = future || {};\n let setState = React.useCallback(newState => {\n v7_startTransition && startTransitionImpl ? startTransitionImpl(() => setStateImpl(newState)) : setStateImpl(newState);\n }, [setStateImpl, v7_startTransition]);\n React.useLayoutEffect(() => history.listen(setState), [history, setState]);\n return /*#__PURE__*/React.createElement(dist_Router, {\n basename: basename,\n children: children,\n location: state.location,\n navigationType: state.action,\n navigator: history\n });\n}\n/**\n * Changes the current location.\n *\n * Note: This API is mostly useful in React.Component subclasses that are not\n * able to use hooks. In functional components, we recommend you use the\n * `useNavigate` hook instead.\n *\n * @see https://reactrouter.com/components/navigate\n */\nfunction Navigate(_ref4) {\n let {\n to,\n replace,\n state,\n relative\n } = _ref4;\n !useInRouterContext() ? false ? 0 : UNSAFE_invariant(false) : void 0;\n false ? 0 : void 0;\n let {\n matches\n } = React.useContext(RouteContext);\n let {\n pathname: locationPathname\n } = dist_useLocation();\n let navigate = dist_useNavigate();\n\n // Resolve the path outside of the effect so that when effects run twice in\n // StrictMode they navigate to the same place\n let path = resolveTo(to, UNSAFE_getPathContributingMatches(matches).map(match => match.pathnameBase), locationPathname, relative === "path");\n let jsonPath = JSON.stringify(path);\n React.useEffect(() => navigate(JSON.parse(jsonPath), {\n replace,\n state,\n relative\n }), [navigate, jsonPath, relative, replace, state]);\n return null;\n}\n/**\n * Renders the child route\'s element, if there is one.\n *\n * @see https://reactrouter.com/components/outlet\n */\nfunction Outlet(props) {\n return useOutlet(props.context);\n}\n/**\n * Declares an element that should be rendered at a certain URL path.\n *\n * @see https://reactrouter.com/components/route\n */\nfunction Route(_props) {\n false ? 0 : UNSAFE_invariant(false) ;\n}\n/**\n * Provides location context for the rest of the app.\n *\n * Note: You usually won\'t render a `<Router>` directly. Instead, you\'ll render a\n * router that is more specific to your environment such as a `<BrowserRouter>`\n * in web browsers or a `<StaticRouter>` for server rendering.\n *\n * @see https://reactrouter.com/router-components/router\n */\nfunction dist_Router(_ref5) {\n let {\n basename: basenameProp = "/",\n children = null,\n location: locationProp,\n navigationType = Action.Pop,\n navigator,\n static: staticProp = false\n } = _ref5;\n !!useInRouterContext() ? false ? 0 : router_invariant(false) : void 0;\n\n // Preserve trailing slashes on basename, so we can let the user control\n // the enforcement of trailing slashes throughout the app\n let basename = basenameProp.replace(/^\\/*/, "/");\n let navigationContext = react.useMemo(() => ({\n basename,\n navigator,\n static: staticProp\n }), [basename, navigator, staticProp]);\n if (typeof locationProp === "string") {\n locationProp = parsePath(locationProp);\n }\n let {\n pathname = "/",\n search = "",\n hash = "",\n state = null,\n key = "default"\n } = locationProp;\n let locationContext = react.useMemo(() => {\n let trailingPathname = router_stripBasename(pathname, basename);\n if (trailingPathname == null) {\n return null;\n }\n return {\n location: {\n pathname: trailingPathname,\n search,\n hash,\n state,\n key\n },\n navigationType\n };\n }, [basename, pathname, search, hash, state, key, navigationType]);\n false ? 0 : void 0;\n if (locationContext == null) {\n return null;\n }\n return /*#__PURE__*/react.createElement(NavigationContext.Provider, {\n value: navigationContext\n }, /*#__PURE__*/react.createElement(LocationContext.Provider, {\n children: children,\n value: locationContext\n }));\n}\n/**\n * A container for a nested tree of `<Route>` elements that renders the branch\n * that best matches the current location.\n *\n * @see https://reactrouter.com/components/routes\n */\nfunction Routes(_ref6) {\n let {\n children,\n location\n } = _ref6;\n return useRoutes(createRoutesFromChildren(children), location);\n}\n/**\n * Component to use for rendering lazily loaded data from returning defer()\n * in a loader function\n */\nfunction Await(_ref7) {\n let {\n children,\n errorElement,\n resolve\n } = _ref7;\n return /*#__PURE__*/React.createElement(AwaitErrorBoundary, {\n resolve: resolve,\n errorElement: errorElement\n }, /*#__PURE__*/React.createElement(ResolveAwait, null, children));\n}\nvar AwaitRenderStatus = /*#__PURE__*/function (AwaitRenderStatus) {\n AwaitRenderStatus[AwaitRenderStatus["pending"] = 0] = "pending";\n AwaitRenderStatus[AwaitRenderStatus["success"] = 1] = "success";\n AwaitRenderStatus[AwaitRenderStatus["error"] = 2] = "error";\n return AwaitRenderStatus;\n}(AwaitRenderStatus || {});\nconst neverSettledPromise = new Promise(() => {});\nclass AwaitErrorBoundary extends react.Component {\n constructor(props) {\n super(props);\n this.state = {\n error: null\n };\n }\n static getDerivedStateFromError(error) {\n return {\n error\n };\n }\n componentDidCatch(error, errorInfo) {\n console.error("<Await> caught the following error during render", error, errorInfo);\n }\n render() {\n let {\n children,\n errorElement,\n resolve\n } = this.props;\n let promise = null;\n let status = AwaitRenderStatus.pending;\n if (!(resolve instanceof Promise)) {\n // Didn\'t get a promise - provide as a resolved promise\n status = AwaitRenderStatus.success;\n promise = Promise.resolve();\n Object.defineProperty(promise, "_tracked", {\n get: () => true\n });\n Object.defineProperty(promise, "_data", {\n get: () => resolve\n });\n } else if (this.state.error) {\n // Caught a render error, provide it as a rejected promise\n status = AwaitRenderStatus.error;\n let renderError = this.state.error;\n promise = Promise.reject().catch(() => {}); // Avoid unhandled rejection warnings\n Object.defineProperty(promise, "_tracked", {\n get: () => true\n });\n Object.defineProperty(promise, "_error", {\n get: () => renderError\n });\n } else if (resolve._tracked) {\n // Already tracked promise - check contents\n promise = resolve;\n status = promise._error !== undefined ? AwaitRenderStatus.error : promise._data !== undefined ? AwaitRenderStatus.success : AwaitRenderStatus.pending;\n } else {\n // Raw (untracked) promise - track it\n status = AwaitRenderStatus.pending;\n Object.defineProperty(resolve, "_tracked", {\n get: () => true\n });\n promise = resolve.then(data => Object.defineProperty(resolve, "_data", {\n get: () => data\n }), error => Object.defineProperty(resolve, "_error", {\n get: () => error\n }));\n }\n if (status === AwaitRenderStatus.error && promise._error instanceof AbortedDeferredError) {\n // Freeze the UI by throwing a never resolved promise\n throw neverSettledPromise;\n }\n if (status === AwaitRenderStatus.error && !errorElement) {\n // No errorElement, throw to the nearest route-level error boundary\n throw promise._error;\n }\n if (status === AwaitRenderStatus.error) {\n // Render via our errorElement\n return /*#__PURE__*/react.createElement(AwaitContext.Provider, {\n value: promise,\n children: errorElement\n });\n }\n if (status === AwaitRenderStatus.success) {\n // Render children with resolved value\n return /*#__PURE__*/react.createElement(AwaitContext.Provider, {\n value: promise,\n children: children\n });\n }\n\n // Throw to the suspense boundary\n throw promise;\n }\n}\n\n/**\n * @private\n * Indirection to leverage useAsyncValue for a render-prop API on `<Await>`\n */\nfunction ResolveAwait(_ref8) {\n let {\n children\n } = _ref8;\n let data = useAsyncValue();\n let toRender = typeof children === "function" ? children(data) : children;\n return /*#__PURE__*/React.createElement(React.Fragment, null, toRender);\n}\n\n///////////////////////////////////////////////////////////////////////////////\n// UTILS\n///////////////////////////////////////////////////////////////////////////////\n\n/**\n * Creates a route config from a React "children" object, which is usually\n * either a `<Route>` element or an array of them. Used internally by\n * `<Routes>` to create a route config from its children.\n *\n * @see https://reactrouter.com/utils/create-routes-from-children\n */\nfunction createRoutesFromChildren(children, parentPath) {\n if (parentPath === void 0) {\n parentPath = [];\n }\n let routes = [];\n React.Children.forEach(children, (element, index) => {\n if (! /*#__PURE__*/React.isValidElement(element)) {\n // Ignore non-elements. This allows people to more easily inline\n // conditionals in their route config.\n return;\n }\n let treePath = [...parentPath, index];\n if (element.type === React.Fragment) {\n // Transparently support React.Fragment and its children.\n routes.push.apply(routes, createRoutesFromChildren(element.props.children, treePath));\n return;\n }\n !(element.type === Route) ? false ? 0 : UNSAFE_invariant(false) : void 0;\n !(!element.props.index || !element.props.children) ? false ? 0 : UNSAFE_invariant(false) : void 0;\n let route = {\n id: element.props.id || treePath.join("-"),\n caseSensitive: element.props.caseSensitive,\n element: element.props.element,\n Component: element.props.Component,\n index: element.props.index,\n path: element.props.path,\n loader: element.props.loader,\n action: element.props.action,\n errorElement: element.props.errorElement,\n ErrorBoundary: element.props.ErrorBoundary,\n hasErrorBoundary: element.props.ErrorBoundary != null || element.props.errorElement != null,\n shouldRevalidate: element.props.shouldRevalidate,\n handle: element.props.handle,\n lazy: element.props.lazy\n };\n if (element.props.children) {\n route.children = createRoutesFromChildren(element.props.children, treePath);\n }\n routes.push(route);\n });\n return routes;\n}\n\n/**\n * Renders the result of `matchRoutes()` into a React element.\n */\nfunction renderMatches(matches) {\n return _renderMatches(matches);\n}\n\nfunction mapRouteProperties(route) {\n let updates = {\n // Note: this check also occurs in createRoutesFromChildren so update\n // there if you change this -- please and thank you!\n hasErrorBoundary: route.ErrorBoundary != null || route.errorElement != null\n };\n if (route.Component) {\n if (false) {}\n Object.assign(updates, {\n element: /*#__PURE__*/react.createElement(route.Component),\n Component: undefined\n });\n }\n if (route.ErrorBoundary) {\n if (false) {}\n Object.assign(updates, {\n errorElement: /*#__PURE__*/react.createElement(route.ErrorBoundary),\n ErrorBoundary: undefined\n });\n }\n return updates;\n}\nfunction createMemoryRouter(routes, opts) {\n return createRouter({\n basename: opts == null ? void 0 : opts.basename,\n future: dist_extends({}, opts == null ? void 0 : opts.future, {\n v7_prependBasename: true\n }),\n history: createMemoryHistory({\n initialEntries: opts == null ? void 0 : opts.initialEntries,\n initialIndex: opts == null ? void 0 : opts.initialIndex\n }),\n hydrationData: opts == null ? void 0 : opts.hydrationData,\n routes,\n mapRouteProperties\n }).initialize();\n}\n\n\n//# sourceMappingURL=index.js.map\n\n;// CONCATENATED MODULE: ./node_modules/react-router-dom/dist/index.js\n/**\n * React Router DOM v6.20.1\n *\n * Copyright (c) Remix Software Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE.md file in the root directory of this source tree.\n *\n * @license MIT\n */\n\n\n\n\n\n\nfunction react_router_dom_dist_extends() {\n react_router_dom_dist_extends = Object.assign ? Object.assign.bind() : function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return react_router_dom_dist_extends.apply(this, arguments);\n}\nfunction dist_objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n return target;\n}\n\nconst defaultMethod = "get";\nconst defaultEncType = "application/x-www-form-urlencoded";\nfunction isHtmlElement(object) {\n return object != null && typeof object.tagName === "string";\n}\nfunction isButtonElement(object) {\n return isHtmlElement(object) && object.tagName.toLowerCase() === "button";\n}\nfunction isFormElement(object) {\n return isHtmlElement(object) && object.tagName.toLowerCase() === "form";\n}\nfunction isInputElement(object) {\n return isHtmlElement(object) && object.tagName.toLowerCase() === "input";\n}\nfunction isModifiedEvent(event) {\n return !!(event.metaKey || event.altKey || event.ctrlKey || event.shiftKey);\n}\nfunction shouldProcessLinkClick(event, target) {\n return event.button === 0 && (\n // Ignore everything but left clicks\n !target || target === "_self") &&\n // Let browser handle "target=_blank" etc.\n !isModifiedEvent(event) // Ignore clicks with modifier keys\n ;\n}\n/**\n * Creates a URLSearchParams object using the given initializer.\n *\n * This is identical to `new URLSearchParams(init)` except it also\n * supports arrays as values in the object form of the initializer\n * instead of just strings. This is convenient when you need multiple\n * values for a given key, but don\'t want to use an array initializer.\n *\n * For example, instead of:\n *\n * let searchParams = new URLSearchParams([\n * [\'sort\', \'name\'],\n * [\'sort\', \'price\']\n * ]);\n *\n * you can do:\n *\n * let searchParams = createSearchParams({\n * sort: [\'name\', \'price\']\n * });\n */\nfunction createSearchParams(init) {\n if (init === void 0) {\n init = "";\n }\n return new URLSearchParams(typeof init === "string" || Array.isArray(init) || init instanceof URLSearchParams ? init : Object.keys(init).reduce((memo, key) => {\n let value = init[key];\n return memo.concat(Array.isArray(value) ? value.map(v => [key, v]) : [[key, value]]);\n }, []));\n}\nfunction getSearchParamsForLocation(locationSearch, defaultSearchParams) {\n let searchParams = createSearchParams(locationSearch);\n if (defaultSearchParams) {\n // Use `defaultSearchParams.forEach(...)` here instead of iterating of\n // `defaultSearchParams.keys()` to work-around a bug in Firefox related to\n // web extensions. Relevant Bugzilla tickets:\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1414602\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1023984\n defaultSearchParams.forEach((_, key) => {\n if (!searchParams.has(key)) {\n defaultSearchParams.getAll(key).forEach(value => {\n searchParams.append(key, value);\n });\n }\n });\n }\n return searchParams;\n}\n// One-time check for submitter support\nlet _formDataSupportsSubmitter = null;\nfunction isFormDataSubmitterSupported() {\n if (_formDataSupportsSubmitter === null) {\n try {\n new FormData(document.createElement("form"),\n // @ts-expect-error if FormData supports the submitter parameter, this will throw\n 0);\n _formDataSupportsSubmitter = false;\n } catch (e) {\n _formDataSupportsSubmitter = true;\n }\n }\n return _formDataSupportsSubmitter;\n}\nconst supportedFormEncTypes = new Set(["application/x-www-form-urlencoded", "multipart/form-data", "text/plain"]);\nfunction getFormEncType(encType) {\n if (encType != null && !supportedFormEncTypes.has(encType)) {\n false ? 0 : void 0;\n return null;\n }\n return encType;\n}\nfunction getFormSubmissionInfo(target, basename) {\n let method;\n let action;\n let encType;\n let formData;\n let body;\n if (isFormElement(target)) {\n // When grabbing the action from the element, it will have had the basename\n // prefixed to ensure non-JS scenarios work, so strip it since we\'ll\n // re-prefix in the router\n let attr = target.getAttribute("action");\n action = attr ? stripBasename(attr, basename) : null;\n method = target.getAttribute("method") || defaultMethod;\n encType = getFormEncType(target.getAttribute("enctype")) || defaultEncType;\n formData = new FormData(target);\n } else if (isButtonElement(target) || isInputElement(target) && (target.type === "submit" || target.type === "image")) {\n let form = target.form;\n if (form == null) {\n throw new Error("Cannot submit a <button> or <input type=\\"submit\\"> without a <form>");\n }\n // <button>/<input type="submit"> may override attributes of <form>\n // When grabbing the action from the element, it will have had the basename\n // prefixed to ensure non-JS scenarios work, so strip it since we\'ll\n // re-prefix in the router\n let attr = target.getAttribute("formaction") || form.getAttribute("action");\n action = attr ? stripBasename(attr, basename) : null;\n method = target.getAttribute("formmethod") || form.getAttribute("method") || defaultMethod;\n encType = getFormEncType(target.getAttribute("formenctype")) || getFormEncType(form.getAttribute("enctype")) || defaultEncType;\n // Build a FormData object populated from a form and submitter\n formData = new FormData(form, target);\n // If this browser doesn\'t support the `FormData(el, submitter)` format,\n // then tack on the submitter value at the end. This is a lightweight\n // solution that is not 100% spec compliant. For complete support in older\n // browsers, consider using the `formdata-submitter-polyfill` package\n if (!isFormDataSubmitterSupported()) {\n let {\n name,\n type,\n value\n } = target;\n if (type === "image") {\n let prefix = name ? name + "." : "";\n formData.append(prefix + "x", "0");\n formData.append(prefix + "y", "0");\n } else if (name) {\n formData.append(name, value);\n }\n }\n } else if (isHtmlElement(target)) {\n throw new Error("Cannot submit element that is not <form>, <button>, or " + "<input type=\\"submit|image\\">");\n } else {\n method = defaultMethod;\n action = null;\n encType = defaultEncType;\n body = target;\n }\n // Send body for <Form encType="text/plain" so we encode it into text\n if (formData && encType === "text/plain") {\n body = formData;\n formData = undefined;\n }\n return {\n action,\n method: method.toLowerCase(),\n encType,\n formData,\n body\n };\n}\n\nconst _excluded = (/* unused pure expression or super */ null && (["onClick", "relative", "reloadDocument", "replace", "state", "target", "to", "preventScrollReset", "unstable_viewTransition"])),\n _excluded2 = (/* unused pure expression or super */ null && (["aria-current", "caseSensitive", "className", "end", "style", "to", "unstable_viewTransition", "children"])),\n _excluded3 = (/* unused pure expression or super */ null && (["fetcherKey", "navigate", "reloadDocument", "replace", "state", "method", "action", "onSubmit", "relative", "preventScrollReset", "unstable_viewTransition"]));\nfunction createBrowserRouter(routes, opts) {\n return router_createRouter({\n basename: opts == null ? void 0 : opts.basename,\n future: react_router_dom_dist_extends({}, opts == null ? void 0 : opts.future, {\n v7_prependBasename: true\n }),\n history: router_createBrowserHistory({\n window: opts == null ? void 0 : opts.window\n }),\n hydrationData: (opts == null ? void 0 : opts.hydrationData) || parseHydrationData(),\n routes,\n mapRouteProperties: mapRouteProperties,\n window: opts == null ? void 0 : opts.window\n }).initialize();\n}\nfunction createHashRouter(routes, opts) {\n return createRouter({\n basename: opts == null ? void 0 : opts.basename,\n future: react_router_dom_dist_extends({}, opts == null ? void 0 : opts.future, {\n v7_prependBasename: true\n }),\n history: createHashHistory({\n window: opts == null ? void 0 : opts.window\n }),\n hydrationData: (opts == null ? void 0 : opts.hydrationData) || parseHydrationData(),\n routes,\n mapRouteProperties: UNSAFE_mapRouteProperties,\n window: opts == null ? void 0 : opts.window\n }).initialize();\n}\nfunction parseHydrationData() {\n var _window;\n let state = (_window = window) == null ? void 0 : _window.__staticRouterHydrationData;\n if (state && state.errors) {\n state = react_router_dom_dist_extends({}, state, {\n errors: deserializeErrors(state.errors)\n });\n }\n return state;\n}\nfunction deserializeErrors(errors) {\n if (!errors) return null;\n let entries = Object.entries(errors);\n let serialized = {};\n for (let [key, val] of entries) {\n // Hey you! If you change this, please change the corresponding logic in\n // serializeErrors in react-router-dom/server.tsx :)\n if (val && val.__type === "RouteErrorResponse") {\n serialized[key] = new ErrorResponseImpl(val.status, val.statusText, val.data, val.internal === true);\n } else if (val && val.__type === "Error") {\n // Attempt to reconstruct the right type of Error (i.e., ReferenceError)\n if (val.__subType) {\n let ErrorConstructor = window[val.__subType];\n if (typeof ErrorConstructor === "function") {\n try {\n // @ts-expect-error\n let error = new ErrorConstructor(val.message);\n // Wipe away the client-side stack trace. Nothing to fill it in with\n // because we don\'t serialize SSR stack traces for security reasons\n error.stack = "";\n serialized[key] = error;\n } catch (e) {\n // no-op - fall through and create a normal Error\n }\n }\n }\n if (serialized[key] == null) {\n let error = new Error(val.message);\n // Wipe away the client-side stack trace. Nothing to fill it in with\n // because we don\'t serialize SSR stack traces for security reasons\n error.stack = "";\n serialized[key] = error;\n }\n } else {\n serialized[key] = val;\n }\n }\n return serialized;\n}\nconst ViewTransitionContext = /*#__PURE__*/react.createContext({\n isTransitioning: false\n});\nif (false) {}\nconst FetchersContext = /*#__PURE__*/react.createContext(new Map());\nif (false) {}\n//#endregion\n////////////////////////////////////////////////////////////////////////////////\n//#region Components\n////////////////////////////////////////////////////////////////////////////////\n/**\n Webpack + React 17 fails to compile on any of the following because webpack\n complains that `startTransition` doesn\'t exist in `React`:\n * import { startTransition } from "react"\n * import * as React from from "react";\n "startTransition" in React ? React.startTransition(() => setState()) : setState()\n * import * as React from from "react";\n "startTransition" in React ? React["startTransition"](() => setState()) : setState()\n\n Moving it to a constant such as the following solves the Webpack/React 17 issue:\n * import * as React from from "react";\n const START_TRANSITION = "startTransition";\n START_TRANSITION in React ? React[START_TRANSITION](() => setState()) : setState()\n\n However, that introduces webpack/terser minification issues in production builds\n in React 18 where minification/obfuscation ends up removing the call of\n React.startTransition entirely from the first half of the ternary. Grabbing\n this exported reference once up front resolves that issue.\n\n See https://github.com/remix-run/react-router/issues/10579\n*/\nconst dist_START_TRANSITION = "startTransition";\nconst dist_startTransitionImpl = react_namespaceObject[dist_START_TRANSITION];\nconst FLUSH_SYNC = "flushSync";\nconst flushSyncImpl = react_dom_namespaceObject[FLUSH_SYNC];\nfunction startTransitionSafe(cb) {\n if (dist_startTransitionImpl) {\n dist_startTransitionImpl(cb);\n } else {\n cb();\n }\n}\nfunction flushSyncSafe(cb) {\n if (flushSyncImpl) {\n flushSyncImpl(cb);\n } else {\n cb();\n }\n}\nclass Deferred {\n constructor() {\n this.status = "pending";\n this.promise = new Promise((resolve, reject) => {\n this.resolve = value => {\n if (this.status === "pending") {\n this.status = "resolved";\n resolve(value);\n }\n };\n this.reject = reason => {\n if (this.status === "pending") {\n this.status = "rejected";\n reject(reason);\n }\n };\n });\n }\n}\n/**\n * Given a Remix Router instance, render the appropriate UI\n */\nfunction dist_RouterProvider(_ref) {\n let {\n fallbackElement,\n router,\n future\n } = _ref;\n let [state, setStateImpl] = react.useState(router.state);\n let [pendingState, setPendingState] = react.useState();\n let [vtContext, setVtContext] = react.useState({\n isTransitioning: false\n });\n let [renderDfd, setRenderDfd] = react.useState();\n let [transition, setTransition] = react.useState();\n let [interruption, setInterruption] = react.useState();\n let fetcherData = react.useRef(new Map());\n let {\n v7_startTransition\n } = future || {};\n let optInStartTransition = react.useCallback(cb => {\n if (v7_startTransition) {\n startTransitionSafe(cb);\n } else {\n cb();\n }\n }, [v7_startTransition]);\n let setState = react.useCallback((newState, _ref2) => {\n let {\n deletedFetchers,\n unstable_flushSync: flushSync,\n unstable_viewTransitionOpts: viewTransitionOpts\n } = _ref2;\n deletedFetchers.forEach(key => fetcherData.current.delete(key));\n newState.fetchers.forEach((fetcher, key) => {\n if (fetcher.data !== undefined) {\n fetcherData.current.set(key, fetcher.data);\n }\n });\n let isViewTransitionUnavailable = router.window == null || typeof router.window.document.startViewTransition !== "function";\n // If this isn\'t a view transition or it\'s not available in this browser,\n // just update and be done with it\n if (!viewTransitionOpts || isViewTransitionUnavailable) {\n if (flushSync) {\n flushSyncSafe(() => setStateImpl(newState));\n } else {\n optInStartTransition(() => setStateImpl(newState));\n }\n return;\n }\n // flushSync + startViewTransition\n if (flushSync) {\n // Flush through the context to mark DOM elements as transition=ing\n flushSyncSafe(() => {\n // Cancel any pending transitions\n if (transition) {\n renderDfd && renderDfd.resolve();\n transition.skipTransition();\n }\n setVtContext({\n isTransitioning: true,\n flushSync: true,\n currentLocation: viewTransitionOpts.currentLocation,\n nextLocation: viewTransitionOpts.nextLocation\n });\n });\n // Update the DOM\n let t = router.window.document.startViewTransition(() => {\n flushSyncSafe(() => setStateImpl(newState));\n });\n // Clean up after the animation completes\n t.finished.finally(() => {\n flushSyncSafe(() => {\n setRenderDfd(undefined);\n setTransition(undefined);\n setPendingState(undefined);\n setVtContext({\n isTransitioning: false\n });\n });\n });\n flushSyncSafe(() => setTransition(t));\n return;\n }\n // startTransition + startViewTransition\n if (transition) {\n // Interrupting an in-progress transition, cancel and let everything flush\n // out, and then kick off a new transition from the interruption state\n renderDfd && renderDfd.resolve();\n transition.skipTransition();\n setInterruption({\n state: newState,\n currentLocation: viewTransitionOpts.currentLocation,\n nextLocation: viewTransitionOpts.nextLocation\n });\n } else {\n // Completed navigation update with opted-in view transitions, let \'er rip\n setPendingState(newState);\n setVtContext({\n isTransitioning: true,\n flushSync: false,\n currentLocation: viewTransitionOpts.currentLocation,\n nextLocation: viewTransitionOpts.nextLocation\n });\n }\n }, [router.window, transition, renderDfd, fetcherData, optInStartTransition]);\n // Need to use a layout effect here so we are subscribed early enough to\n // pick up on any render-driven redirects/navigations (useEffect/<Navigate>)\n react.useLayoutEffect(() => router.subscribe(setState), [router, setState]);\n // When we start a view transition, create a Deferred we can use for the\n // eventual "completed" render\n react.useEffect(() => {\n if (vtContext.isTransitioning && !vtContext.flushSync) {\n setRenderDfd(new Deferred());\n }\n }, [vtContext]);\n // Once the deferred is created, kick off startViewTransition() to update the\n // DOM and then wait on the Deferred to resolve (indicating the DOM update has\n // happened)\n react.useEffect(() => {\n if (renderDfd && pendingState && router.window) {\n let newState = pendingState;\n let renderPromise = renderDfd.promise;\n let transition = router.window.document.startViewTransition(async () => {\n optInStartTransition(() => setStateImpl(newState));\n await renderPromise;\n });\n transition.finished.finally(() => {\n setRenderDfd(undefined);\n setTransition(undefined);\n setPendingState(undefined);\n setVtContext({\n isTransitioning: false\n });\n });\n setTransition(transition);\n }\n }, [optInStartTransition, pendingState, renderDfd, router.window]);\n // When the new location finally renders and is committed to the DOM, this\n // effect will run to resolve the transition\n react.useEffect(() => {\n if (renderDfd && pendingState && state.location.key === pendingState.location.key) {\n renderDfd.resolve();\n }\n }, [renderDfd, transition, state.location, pendingState]);\n // If we get interrupted with a new navigation during a transition, we skip\n // the active transition, let it cleanup, then kick it off again here\n react.useEffect(() => {\n if (!vtContext.isTransitioning && interruption) {\n setPendingState(interruption.state);\n setVtContext({\n isTransitioning: true,\n flushSync: false,\n currentLocation: interruption.currentLocation,\n nextLocation: interruption.nextLocation\n });\n setInterruption(undefined);\n }\n }, [vtContext.isTransitioning, interruption]);\n let navigator = react.useMemo(() => {\n return {\n createHref: router.createHref,\n encodeLocation: router.encodeLocation,\n go: n => router.navigate(n),\n push: (to, state, opts) => router.navigate(to, {\n state,\n preventScrollReset: opts == null ? void 0 : opts.preventScrollReset\n }),\n replace: (to, state, opts) => router.navigate(to, {\n replace: true,\n state,\n preventScrollReset: opts == null ? void 0 : opts.preventScrollReset\n })\n };\n }, [router]);\n let basename = router.basename || "/";\n let dataRouterContext = react.useMemo(() => ({\n router,\n navigator,\n static: false,\n basename\n }), [router, navigator, basename]);\n // The fragment and {null} here are important! We need them to keep React 18\'s\n // useId happy when we are server-rendering since we may have a <script> here\n // containing the hydrated server-side staticContext (from StaticRouterProvider).\n // useId relies on the component tree structure to generate deterministic id\'s\n // so we need to ensure it remains the same on the client even though\n // we don\'t need the <script> tag\n return /*#__PURE__*/react.createElement(react.Fragment, null, /*#__PURE__*/react.createElement(DataRouterContext.Provider, {\n value: dataRouterContext\n }, /*#__PURE__*/react.createElement(DataRouterStateContext.Provider, {\n value: state\n }, /*#__PURE__*/react.createElement(FetchersContext.Provider, {\n value: fetcherData.current\n }, /*#__PURE__*/react.createElement(ViewTransitionContext.Provider, {\n value: vtContext\n }, /*#__PURE__*/react.createElement(dist_Router, {\n basename: basename,\n location: state.location,\n navigationType: state.historyAction,\n navigator: navigator\n }, state.initialized ? /*#__PURE__*/react.createElement(dist_DataRoutes, {\n routes: router.routes,\n state: state\n }) : fallbackElement))))), null);\n}\nfunction dist_DataRoutes(_ref3) {\n let {\n routes,\n state\n } = _ref3;\n return useRoutesImpl(routes, undefined, state);\n}\n/**\n * A `<Router>` for use in web browsers. Provides the cleanest URLs.\n */\nfunction BrowserRouter(_ref4) {\n let {\n basename,\n children,\n future,\n window\n } = _ref4;\n let historyRef = React.useRef();\n if (historyRef.current == null) {\n historyRef.current = createBrowserHistory({\n window,\n v5Compat: true\n });\n }\n let history = historyRef.current;\n let [state, setStateImpl] = React.useState({\n action: history.action,\n location: history.location\n });\n let {\n v7_startTransition\n } = future || {};\n let setState = React.useCallback(newState => {\n v7_startTransition && dist_startTransitionImpl ? dist_startTransitionImpl(() => setStateImpl(newState)) : setStateImpl(newState);\n }, [setStateImpl, v7_startTransition]);\n React.useLayoutEffect(() => history.listen(setState), [history, setState]);\n return /*#__PURE__*/React.createElement(Router, {\n basename: basename,\n children: children,\n location: state.location,\n navigationType: state.action,\n navigator: history\n });\n}\n/**\n * A `<Router>` for use in web browsers. Stores the location in the hash\n * portion of the URL so it is not sent to the server.\n */\nfunction HashRouter(_ref5) {\n let {\n basename,\n children,\n future,\n window\n } = _ref5;\n let historyRef = React.useRef();\n if (historyRef.current == null) {\n historyRef.current = createHashHistory({\n window,\n v5Compat: true\n });\n }\n let history = historyRef.current;\n let [state, setStateImpl] = React.useState({\n action: history.action,\n location: history.location\n });\n let {\n v7_startTransition\n } = future || {};\n let setState = React.useCallback(newState => {\n v7_startTransition && dist_startTransitionImpl ? dist_startTransitionImpl(() => setStateImpl(newState)) : setStateImpl(newState);\n }, [setStateImpl, v7_startTransition]);\n React.useLayoutEffect(() => history.listen(setState), [history, setState]);\n return /*#__PURE__*/React.createElement(Router, {\n basename: basename,\n children: children,\n location: state.location,\n navigationType: state.action,\n navigator: history\n });\n}\n/**\n * A `<Router>` that accepts a pre-instantiated history object. It\'s important\n * to note that using your own history object is highly discouraged and may add\n * two versions of the history library to your bundles unless you use the same\n * version of the history library that React Router uses internally.\n */\nfunction HistoryRouter(_ref6) {\n let {\n basename,\n children,\n future,\n history\n } = _ref6;\n let [state, setStateImpl] = React.useState({\n action: history.action,\n location: history.location\n });\n let {\n v7_startTransition\n } = future || {};\n let setState = React.useCallback(newState => {\n v7_startTransition && dist_startTransitionImpl ? dist_startTransitionImpl(() => setStateImpl(newState)) : setStateImpl(newState);\n }, [setStateImpl, v7_startTransition]);\n React.useLayoutEffect(() => history.listen(setState), [history, setState]);\n return /*#__PURE__*/React.createElement(Router, {\n basename: basename,\n children: children,\n location: state.location,\n navigationType: state.action,\n navigator: history\n });\n}\nif (false) {}\nconst isBrowser = typeof window !== "undefined" && typeof window.document !== "undefined" && typeof window.document.createElement !== "undefined";\nconst dist_ABSOLUTE_URL_REGEX = /^(?:[a-z][a-z0-9+.-]*:|\\/\\/)/i;\n/**\n * The public API for rendering a history-aware `<a>`.\n */\nconst Link = /*#__PURE__*/(/* unused pure expression or super */ null && (React.forwardRef(function LinkWithRef(_ref7, ref) {\n let {\n onClick,\n relative,\n reloadDocument,\n replace,\n state,\n target,\n to,\n preventScrollReset,\n unstable_viewTransition\n } = _ref7,\n rest = dist_objectWithoutPropertiesLoose(_ref7, _excluded);\n let {\n basename\n } = React.useContext(UNSAFE_NavigationContext);\n // Rendered into <a href> for absolute URLs\n let absoluteHref;\n let isExternal = false;\n if (typeof to === "string" && dist_ABSOLUTE_URL_REGEX.test(to)) {\n // Render the absolute href server- and client-side\n absoluteHref = to;\n // Only check for external origins client-side\n if (isBrowser) {\n try {\n let currentUrl = new URL(window.location.href);\n let targetUrl = to.startsWith("//") ? new URL(currentUrl.protocol + to) : new URL(to);\n let path = stripBasename(targetUrl.pathname, basename);\n if (targetUrl.origin === currentUrl.origin && path != null) {\n // Strip the protocol/origin/basename for same-origin absolute URLs\n to = path + targetUrl.search + targetUrl.hash;\n } else {\n isExternal = true;\n }\n } catch (e) {\n // We can\'t do external URL detection without a valid URL\n false ? 0 : void 0;\n }\n }\n }\n // Rendered into <a href> for relative URLs\n let href = useHref(to, {\n relative\n });\n let internalOnClick = useLinkClickHandler(to, {\n replace,\n state,\n target,\n preventScrollReset,\n relative,\n unstable_viewTransition\n });\n function handleClick(event) {\n if (onClick) onClick(event);\n if (!event.defaultPrevented) {\n internalOnClick(event);\n }\n }\n return (\n /*#__PURE__*/\n // eslint-disable-next-line jsx-a11y/anchor-has-content\n React.createElement("a", react_router_dom_dist_extends({}, rest, {\n href: absoluteHref || href,\n onClick: isExternal || reloadDocument ? onClick : handleClick,\n ref: ref,\n target: target\n }))\n );\n})));\nif (false) {}\n/**\n * A `<Link>` wrapper that knows if it\'s "active" or not.\n */\nconst NavLink = /*#__PURE__*/(/* unused pure expression or super */ null && (React.forwardRef(function NavLinkWithRef(_ref8, ref) {\n let {\n "aria-current": ariaCurrentProp = "page",\n caseSensitive = false,\n className: classNameProp = "",\n end = false,\n style: styleProp,\n to,\n unstable_viewTransition,\n children\n } = _ref8,\n rest = dist_objectWithoutPropertiesLoose(_ref8, _excluded2);\n let path = useResolvedPath(to, {\n relative: rest.relative\n });\n let location = useLocation();\n let routerState = React.useContext(UNSAFE_DataRouterStateContext);\n let {\n navigator\n } = React.useContext(UNSAFE_NavigationContext);\n let isTransitioning = routerState != null &&\n // Conditional usage is OK here because the usage of a data router is static\n // eslint-disable-next-line react-hooks/rules-of-hooks\n useViewTransitionState(path) && unstable_viewTransition === true;\n let toPathname = navigator.encodeLocation ? navigator.encodeLocation(path).pathname : path.pathname;\n let locationPathname = location.pathname;\n let nextLocationPathname = routerState && routerState.navigation && routerState.navigation.location ? routerState.navigation.location.pathname : null;\n if (!caseSensitive) {\n locationPathname = locationPathname.toLowerCase();\n nextLocationPathname = nextLocationPathname ? nextLocationPathname.toLowerCase() : null;\n toPathname = toPathname.toLowerCase();\n }\n // If the `to` has a trailing slash, look at that exact spot. Otherwise,\n // we\'re looking for a slash _after_ what\'s in `to`. For example:\n //\n // <NavLink to="/users"> and <NavLink to="/users/">\n // both want to look for a / at index 6 to match URL `/users/matt`\n const endSlashPosition = toPathname !== "/" && toPathname.endsWith("/") ? toPathname.length - 1 : toPathname.length;\n let isActive = locationPathname === toPathname || !end && locationPathname.startsWith(toPathname) && locationPathname.charAt(endSlashPosition) === "/";\n let isPending = nextLocationPathname != null && (nextLocationPathname === toPathname || !end && nextLocationPathname.startsWith(toPathname) && nextLocationPathname.charAt(toPathname.length) === "/");\n let renderProps = {\n isActive,\n isPending,\n isTransitioning\n };\n let ariaCurrent = isActive ? ariaCurrentProp : undefined;\n let className;\n if (typeof classNameProp === "function") {\n className = classNameProp(renderProps);\n } else {\n // If the className prop is not a function, we use a default `active`\n // class for <NavLink />s that are active. In v5 `active` was the default\n // value for `activeClassName`, but we are removing that API and can still\n // use the old default behavior for a cleaner upgrade path and keep the\n // simple styling rules working as they currently do.\n className = [classNameProp, isActive ? "active" : null, isPending ? "pending" : null, isTransitioning ? "transitioning" : null].filter(Boolean).join(" ");\n }\n let style = typeof styleProp === "function" ? styleProp(renderProps) : styleProp;\n return /*#__PURE__*/React.createElement(Link, react_router_dom_dist_extends({}, rest, {\n "aria-current": ariaCurrent,\n className: className,\n ref: ref,\n style: style,\n to: to,\n unstable_viewTransition: unstable_viewTransition\n }), typeof children === "function" ? children(renderProps) : children);\n})));\nif (false) {}\n/**\n * A `@remix-run/router`-aware `<form>`. It behaves like a normal form except\n * that the interaction with the server is with `fetch` instead of new document\n * requests, allowing components to add nicer UX to the page as the form is\n * submitted and returns with data.\n */\nconst Form = /*#__PURE__*/(/* unused pure expression or super */ null && (React.forwardRef((_ref9, forwardedRef) => {\n let {\n fetcherKey,\n navigate,\n reloadDocument,\n replace,\n state,\n method = defaultMethod,\n action,\n onSubmit,\n relative,\n preventScrollReset,\n unstable_viewTransition\n } = _ref9,\n props = dist_objectWithoutPropertiesLoose(_ref9, _excluded3);\n let submit = useSubmit();\n let formAction = useFormAction(action, {\n relative\n });\n let formMethod = method.toLowerCase() === "get" ? "get" : "post";\n let submitHandler = event => {\n onSubmit && onSubmit(event);\n if (event.defaultPrevented) return;\n event.preventDefault();\n let submitter = event.nativeEvent.submitter;\n let submitMethod = (submitter == null ? void 0 : submitter.getAttribute("formmethod")) || method;\n submit(submitter || event.currentTarget, {\n fetcherKey,\n method: submitMethod,\n navigate,\n replace,\n state,\n relative,\n preventScrollReset,\n unstable_viewTransition\n });\n };\n return /*#__PURE__*/React.createElement("form", react_router_dom_dist_extends({\n ref: forwardedRef,\n method: formMethod,\n action: formAction,\n onSubmit: reloadDocument ? onSubmit : submitHandler\n }, props));\n})));\nif (false) {}\n/**\n * This component will emulate the browser\'s scroll restoration on location\n * changes.\n */\nfunction ScrollRestoration(_ref10) {\n let {\n getKey,\n storageKey\n } = _ref10;\n useScrollRestoration({\n getKey,\n storageKey\n });\n return null;\n}\nif (false) {}\n//#endregion\n////////////////////////////////////////////////////////////////////////////////\n//#region Hooks\n////////////////////////////////////////////////////////////////////////////////\nvar dist_DataRouterHook;\n(function (DataRouterHook) {\n DataRouterHook["UseScrollRestoration"] = "useScrollRestoration";\n DataRouterHook["UseSubmit"] = "useSubmit";\n DataRouterHook["UseSubmitFetcher"] = "useSubmitFetcher";\n DataRouterHook["UseFetcher"] = "useFetcher";\n DataRouterHook["useViewTransitionState"] = "useViewTransitionState";\n})(dist_DataRouterHook || (dist_DataRouterHook = {}));\nvar dist_DataRouterStateHook;\n(function (DataRouterStateHook) {\n DataRouterStateHook["UseFetcher"] = "useFetcher";\n DataRouterStateHook["UseFetchers"] = "useFetchers";\n DataRouterStateHook["UseScrollRestoration"] = "useScrollRestoration";\n})(dist_DataRouterStateHook || (dist_DataRouterStateHook = {}));\n// Internal hooks\nfunction dist_getDataRouterConsoleError(hookName) {\n return hookName + " must be used within a data router. See https://reactrouter.com/routers/picking-a-router.";\n}\nfunction dist_useDataRouterContext(hookName) {\n let ctx = React.useContext(UNSAFE_DataRouterContext);\n !ctx ? false ? 0 : UNSAFE_invariant(false) : void 0;\n return ctx;\n}\nfunction dist_useDataRouterState(hookName) {\n let state = React.useContext(UNSAFE_DataRouterStateContext);\n !state ? false ? 0 : UNSAFE_invariant(false) : void 0;\n return state;\n}\n// External hooks\n/**\n * Handles the click behavior for router `<Link>` components. This is useful if\n * you need to create custom `<Link>` components with the same click behavior we\n * use in our exported `<Link>`.\n */\nfunction useLinkClickHandler(to, _temp) {\n let {\n target,\n replace: replaceProp,\n state,\n preventScrollReset,\n relative,\n unstable_viewTransition\n } = _temp === void 0 ? {} : _temp;\n let navigate = useNavigate();\n let location = useLocation();\n let path = useResolvedPath(to, {\n relative\n });\n return React.useCallback(event => {\n if (shouldProcessLinkClick(event, target)) {\n event.preventDefault();\n // If the URL hasn\'t changed, a regular <a> will do a replace instead of\n // a push, so do the same here unless the replace prop is explicitly set\n let replace = replaceProp !== undefined ? replaceProp : createPath(location) === createPath(path);\n navigate(to, {\n replace,\n state,\n preventScrollReset,\n relative,\n unstable_viewTransition\n });\n }\n }, [location, navigate, path, replaceProp, state, target, to, preventScrollReset, relative, unstable_viewTransition]);\n}\n/**\n * A convenient wrapper for reading and writing search parameters via the\n * URLSearchParams interface.\n */\nfunction useSearchParams(defaultInit) {\n false ? 0 : void 0;\n let defaultSearchParamsRef = React.useRef(createSearchParams(defaultInit));\n let hasSetSearchParamsRef = React.useRef(false);\n let location = useLocation();\n let searchParams = React.useMemo(() =>\n // Only merge in the defaults if we haven\'t yet called setSearchParams.\n // Once we call that we want those to take precedence, otherwise you can\'t\n // remove a param with setSearchParams({}) if it has an initial value\n getSearchParamsForLocation(location.search, hasSetSearchParamsRef.current ? null : defaultSearchParamsRef.current), [location.search]);\n let navigate = useNavigate();\n let setSearchParams = React.useCallback((nextInit, navigateOptions) => {\n const newSearchParams = createSearchParams(typeof nextInit === "function" ? nextInit(searchParams) : nextInit);\n hasSetSearchParamsRef.current = true;\n navigate("?" + newSearchParams, navigateOptions);\n }, [navigate, searchParams]);\n return [searchParams, setSearchParams];\n}\nfunction validateClientSideSubmission() {\n if (typeof document === "undefined") {\n throw new Error("You are calling submit during the server render. " + "Try calling submit within a `useEffect` or callback instead.");\n }\n}\nlet fetcherId = 0;\nlet getUniqueFetcherId = () => "__" + String(++fetcherId) + "__";\n/**\n * Returns a function that may be used to programmatically submit a form (or\n * some arbitrary data) to the server.\n */\nfunction useSubmit() {\n let {\n router\n } = dist_useDataRouterContext(dist_DataRouterHook.UseSubmit);\n let {\n basename\n } = React.useContext(UNSAFE_NavigationContext);\n let currentRouteId = UNSAFE_useRouteId();\n return React.useCallback(function (target, options) {\n if (options === void 0) {\n options = {};\n }\n validateClientSideSubmission();\n let {\n action,\n method,\n encType,\n formData,\n body\n } = getFormSubmissionInfo(target, basename);\n if (options.navigate === false) {\n let key = options.fetcherKey || getUniqueFetcherId();\n router.fetch(key, currentRouteId, options.action || action, {\n preventScrollReset: options.preventScrollReset,\n formData,\n body,\n formMethod: options.method || method,\n formEncType: options.encType || encType,\n unstable_flushSync: options.unstable_flushSync\n });\n } else {\n router.navigate(options.action || action, {\n preventScrollReset: options.preventScrollReset,\n formData,\n body,\n formMethod: options.method || method,\n formEncType: options.encType || encType,\n replace: options.replace,\n state: options.state,\n fromRouteId: currentRouteId,\n unstable_flushSync: options.unstable_flushSync,\n unstable_viewTransition: options.unstable_viewTransition\n });\n }\n }, [router, basename, currentRouteId]);\n}\n// v7: Eventually we should deprecate this entirely in favor of using the\n// router method directly?\nfunction useFormAction(action, _temp2) {\n let {\n relative\n } = _temp2 === void 0 ? {} : _temp2;\n let {\n basename\n } = React.useContext(UNSAFE_NavigationContext);\n let routeContext = React.useContext(UNSAFE_RouteContext);\n !routeContext ? false ? 0 : UNSAFE_invariant(false) : void 0;\n let [match] = routeContext.matches.slice(-1);\n // Shallow clone path so we can modify it below, otherwise we modify the\n // object referenced by useMemo inside useResolvedPath\n let path = react_router_dom_dist_extends({}, useResolvedPath(action ? action : ".", {\n relative\n }));\n // Previously we set the default action to ".". The problem with this is that\n // `useResolvedPath(".")` excludes search params of the resolved URL. This is\n // the intended behavior of when "." is specifically provided as\n // the form action, but inconsistent w/ browsers when the action is omitted.\n // https://github.com/remix-run/remix/issues/927\n let location = useLocation();\n if (action == null) {\n // Safe to write to this directly here since if action was undefined, we\n // would have called useResolvedPath(".") which will never include a search\n path.search = location.search;\n // When grabbing search params from the URL, remove any included ?index param\n // since it might not apply to our contextual route. We add it back based\n // on match.route.index below\n let params = new URLSearchParams(path.search);\n if (params.has("index") && params.get("index") === "") {\n params.delete("index");\n path.search = params.toString() ? "?" + params.toString() : "";\n }\n }\n if ((!action || action === ".") && match.route.index) {\n path.search = path.search ? path.search.replace(/^\\?/, "?index&") : "?index";\n }\n // If we\'re operating within a basename, prepend it to the pathname prior\n // to creating the form action. If this is a root navigation, then just use\n // the raw basename which allows the basename to have full control over the\n // presence of a trailing slash on root actions\n if (basename !== "/") {\n path.pathname = path.pathname === "/" ? basename : joinPaths([basename, path.pathname]);\n }\n return createPath(path);\n}\n// TODO: (v7) Change the useFetcher generic default from `any` to `unknown`\n/**\n * Interacts with route loaders and actions without causing a navigation. Great\n * for any interaction that stays on the same page.\n */\nfunction useFetcher(_temp3) {\n var _route$matches;\n let {\n key\n } = _temp3 === void 0 ? {} : _temp3;\n let {\n router\n } = dist_useDataRouterContext(dist_DataRouterHook.UseFetcher);\n let state = dist_useDataRouterState(dist_DataRouterStateHook.UseFetcher);\n let fetcherData = React.useContext(FetchersContext);\n let route = React.useContext(UNSAFE_RouteContext);\n let routeId = (_route$matches = route.matches[route.matches.length - 1]) == null ? void 0 : _route$matches.route.id;\n !fetcherData ? false ? 0 : UNSAFE_invariant(false) : void 0;\n !route ? false ? 0 : UNSAFE_invariant(false) : void 0;\n !(routeId != null) ? false ? 0 : UNSAFE_invariant(false) : void 0;\n // Fetcher key handling\n let [fetcherKey, setFetcherKey] = React.useState(key || "");\n if (key && key !== fetcherKey) {\n setFetcherKey(key);\n } else if (!fetcherKey) {\n setFetcherKey(getUniqueFetcherId());\n }\n // Registration/cleanup\n React.useEffect(() => {\n router.getFetcher(fetcherKey);\n return () => {\n // Tell the router we\'ve unmounted - if v7_fetcherPersist is enabled this\n // will not delete immediately but instead queue up a delete after the\n // fetcher returns to an `idle` state\n router.deleteFetcher(fetcherKey);\n };\n }, [router, fetcherKey]);\n // Fetcher additions\n let load = React.useCallback((href, opts) => {\n !routeId ? false ? 0 : UNSAFE_invariant(false) : void 0;\n router.fetch(fetcherKey, routeId, href, opts);\n }, [fetcherKey, routeId, router]);\n let submitImpl = useSubmit();\n let submit = React.useCallback((target, opts) => {\n submitImpl(target, react_router_dom_dist_extends({}, opts, {\n navigate: false,\n fetcherKey\n }));\n }, [fetcherKey, submitImpl]);\n let FetcherForm = React.useMemo(() => {\n let FetcherForm = /*#__PURE__*/React.forwardRef((props, ref) => {\n return /*#__PURE__*/React.createElement(Form, react_router_dom_dist_extends({}, props, {\n navigate: false,\n fetcherKey: fetcherKey,\n ref: ref\n }));\n });\n if (false) {}\n return FetcherForm;\n }, [fetcherKey]);\n // Exposed FetcherWithComponents\n let fetcher = state.fetchers.get(fetcherKey) || IDLE_FETCHER;\n let data = fetcherData.get(fetcherKey);\n let fetcherWithComponents = React.useMemo(() => react_router_dom_dist_extends({\n Form: FetcherForm,\n submit,\n load\n }, fetcher, {\n data\n }), [FetcherForm, submit, load, fetcher, data]);\n return fetcherWithComponents;\n}\n/**\n * Provides all fetchers currently on the page. Useful for layouts and parent\n * routes that need to provide pending/optimistic UI regarding the fetch.\n */\nfunction useFetchers() {\n let state = dist_useDataRouterState(dist_DataRouterStateHook.UseFetchers);\n return Array.from(state.fetchers.entries()).map(_ref11 => {\n let [key, fetcher] = _ref11;\n return react_router_dom_dist_extends({}, fetcher, {\n key\n });\n });\n}\nconst SCROLL_RESTORATION_STORAGE_KEY = "react-router-scroll-positions";\nlet savedScrollPositions = {};\n/**\n * When rendered inside a RouterProvider, will restore scroll positions on navigations\n */\nfunction useScrollRestoration(_temp4) {\n let {\n getKey,\n storageKey\n } = _temp4 === void 0 ? {} : _temp4;\n let {\n router\n } = dist_useDataRouterContext(dist_DataRouterHook.UseScrollRestoration);\n let {\n restoreScrollPosition,\n preventScrollReset\n } = dist_useDataRouterState(dist_DataRouterStateHook.UseScrollRestoration);\n let {\n basename\n } = React.useContext(UNSAFE_NavigationContext);\n let location = useLocation();\n let matches = useMatches();\n let navigation = useNavigation();\n // Trigger manual scroll restoration while we\'re active\n React.useEffect(() => {\n window.history.scrollRestoration = "manual";\n return () => {\n window.history.scrollRestoration = "auto";\n };\n }, []);\n // Save positions on pagehide\n usePageHide(React.useCallback(() => {\n if (navigation.state === "idle") {\n let key = (getKey ? getKey(location, matches) : null) || location.key;\n savedScrollPositions[key] = window.scrollY;\n }\n try {\n sessionStorage.setItem(storageKey || SCROLL_RESTORATION_STORAGE_KEY, JSON.stringify(savedScrollPositions));\n } catch (error) {\n false ? 0 : void 0;\n }\n window.history.scrollRestoration = "auto";\n }, [storageKey, getKey, navigation.state, location, matches]));\n // Read in any saved scroll locations\n if (typeof document !== "undefined") {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n React.useLayoutEffect(() => {\n try {\n let sessionPositions = sessionStorage.getItem(storageKey || SCROLL_RESTORATION_STORAGE_KEY);\n if (sessionPositions) {\n savedScrollPositions = JSON.parse(sessionPositions);\n }\n } catch (e) {\n // no-op, use default empty object\n }\n }, [storageKey]);\n // Enable scroll restoration in the router\n // eslint-disable-next-line react-hooks/rules-of-hooks\n React.useLayoutEffect(() => {\n let getKeyWithoutBasename = getKey && basename !== "/" ? (location, matches) => getKey( // Strip the basename to match useLocation()\n react_router_dom_dist_extends({}, location, {\n pathname: stripBasename(location.pathname, basename) || location.pathname\n }), matches) : getKey;\n let disableScrollRestoration = router == null ? void 0 : router.enableScrollRestoration(savedScrollPositions, () => window.scrollY, getKeyWithoutBasename);\n return () => disableScrollRestoration && disableScrollRestoration();\n }, [router, basename, getKey]);\n // Restore scrolling when state.restoreScrollPosition changes\n // eslint-disable-next-line react-hooks/rules-of-hooks\n React.useLayoutEffect(() => {\n // Explicit false means don\'t do anything (used for submissions)\n if (restoreScrollPosition === false) {\n return;\n }\n // been here before, scroll to it\n if (typeof restoreScrollPosition === "number") {\n window.scrollTo(0, restoreScrollPosition);\n return;\n }\n // try to scroll to the hash\n if (location.hash) {\n let el = document.getElementById(decodeURIComponent(location.hash.slice(1)));\n if (el) {\n el.scrollIntoView();\n return;\n }\n }\n // Don\'t reset if this navigation opted out\n if (preventScrollReset === true) {\n return;\n }\n // otherwise go to the top on new locations\n window.scrollTo(0, 0);\n }, [location, restoreScrollPosition, preventScrollReset]);\n }\n}\n/**\n * Setup a callback to be fired on the window\'s `beforeunload` event. This is\n * useful for saving some data to `window.localStorage` just before the page\n * refreshes.\n *\n * Note: The `callback` argument should be a function created with\n * `React.useCallback()`.\n */\nfunction useBeforeUnload(callback, options) {\n let {\n capture\n } = options || {};\n React.useEffect(() => {\n let opts = capture != null ? {\n capture\n } : undefined;\n window.addEventListener("beforeunload", callback, opts);\n return () => {\n window.removeEventListener("beforeunload", callback, opts);\n };\n }, [callback, capture]);\n}\n/**\n * Setup a callback to be fired on the window\'s `pagehide` event. This is\n * useful for saving some data to `window.localStorage` just before the page\n * refreshes. This event is better supported than beforeunload across browsers.\n *\n * Note: The `callback` argument should be a function created with\n * `React.useCallback()`.\n */\nfunction usePageHide(callback, options) {\n let {\n capture\n } = options || {};\n React.useEffect(() => {\n let opts = capture != null ? {\n capture\n } : undefined;\n window.addEventListener("pagehide", callback, opts);\n return () => {\n window.removeEventListener("pagehide", callback, opts);\n };\n }, [callback, capture]);\n}\n/**\n * Wrapper around useBlocker to show a window.confirm prompt to users instead\n * of building a custom UI with useBlocker.\n *\n * Warning: This has *a lot of rough edges* and behaves very differently (and\n * very incorrectly in some cases) across browsers if user click addition\n * back/forward navigations while the confirm is open. Use at your own risk.\n */\nfunction usePrompt(_ref12) {\n let {\n when,\n message\n } = _ref12;\n let blocker = useBlocker(when);\n React.useEffect(() => {\n if (blocker.state === "blocked") {\n let proceed = window.confirm(message);\n if (proceed) {\n // This timeout is needed to avoid a weird "race" on POP navigations\n // between the `window.history` revert navigation and the result of\n // `window.confirm`\n setTimeout(blocker.proceed, 0);\n } else {\n blocker.reset();\n }\n }\n }, [blocker, message]);\n React.useEffect(() => {\n if (blocker.state === "blocked" && !when) {\n blocker.reset();\n }\n }, [blocker, when]);\n}\n/**\n * Return a boolean indicating if there is an active view transition to the\n * given href. You can use this value to render CSS classes or viewTransitionName\n * styles onto your elements\n *\n * @param href The destination href\n * @param [opts.relative] Relative routing type ("route" | "path")\n */\nfunction useViewTransitionState(to, opts) {\n if (opts === void 0) {\n opts = {};\n }\n let vtContext = React.useContext(ViewTransitionContext);\n !(vtContext != null) ? false ? 0 : UNSAFE_invariant(false) : void 0;\n let {\n basename\n } = dist_useDataRouterContext(dist_DataRouterHook.useViewTransitionState);\n let path = useResolvedPath(to, {\n relative: opts.relative\n });\n if (!vtContext.isTransitioning) {\n return false;\n }\n let currentPath = stripBasename(vtContext.currentLocation.pathname, basename) || vtContext.currentLocation.pathname;\n let nextPath = stripBasename(vtContext.nextLocation.pathname, basename) || vtContext.nextLocation.pathname;\n // Transition is active if we\'re going to or coming from the indicated\n // destination. This ensures that other PUSH navigations that reverse\n // an indicated transition apply. I.e., on the list view you have:\n //\n // <NavLink to="/details/1" unstable_viewTransition>\n //\n // If you click the breadcrumb back to the list view:\n //\n // <NavLink to="/list" unstable_viewTransition>\n //\n // We should apply the transition because it\'s indicated as active going\n // from /list -> /details/1 and therefore should be active on the reverse\n // (even though this isn\'t strictly a POP reverse)\n return matchPath(path.pathname, nextPath) != null || matchPath(path.pathname, currentPath) != null;\n}\n//#endregion\n\n\n//# sourceMappingURL=index.js.map\n\n// EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\nvar injectStylesIntoStyleTag = __webpack_require__(3379);\nvar injectStylesIntoStyleTag_default = /*#__PURE__*/__webpack_require__.n(injectStylesIntoStyleTag);\n// EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/styleDomAPI.js\nvar styleDomAPI = __webpack_require__(7795);\nvar styleDomAPI_default = /*#__PURE__*/__webpack_require__.n(styleDomAPI);\n// EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/insertBySelector.js\nvar insertBySelector = __webpack_require__(569);\nvar insertBySelector_default = /*#__PURE__*/__webpack_require__.n(insertBySelector);\n// EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\nvar setAttributesWithoutAttributes = __webpack_require__(3565);\nvar setAttributesWithoutAttributes_default = /*#__PURE__*/__webpack_require__.n(setAttributesWithoutAttributes);\n// EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/insertStyleElement.js\nvar insertStyleElement = __webpack_require__(9216);\nvar insertStyleElement_default = /*#__PURE__*/__webpack_require__.n(insertStyleElement);\n// EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/styleTagTransform.js\nvar styleTagTransform = __webpack_require__(4589);\nvar styleTagTransform_default = /*#__PURE__*/__webpack_require__.n(styleTagTransform);\n// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./src/index.scss\nvar cjs_js_src = __webpack_require__(4800);\n;// CONCATENATED MODULE: ./src/index.scss\n\n \n \n \n \n \n \n \n \n \n\nvar options = {};\n\noptions.styleTagTransform = (styleTagTransform_default());\noptions.setAttributes = (setAttributesWithoutAttributes_default());\n\n options.insert = insertBySelector_default().bind(null, "head");\n \noptions.domAPI = (styleDomAPI_default());\noptions.insertStyleElement = (insertStyleElement_default());\n\nvar update = injectStylesIntoStyleTag_default()(cjs_js_src/* default */.Z, options);\n\n\n\n\n /* harmony default export */ const src = (cjs_js_src/* default */.Z && cjs_js_src/* default */.Z.locals ? cjs_js_src/* default */.Z.locals : undefined);\n\n// EXTERNAL MODULE: ./node_modules/classnames/index.js\nvar classnames = __webpack_require__(4184);\nvar classnames_default = /*#__PURE__*/__webpack_require__.n(classnames);\n;// CONCATENATED MODULE: ./node_modules/@restart/ui/esm/SelectableContext.js\n\nconst SelectableContext = /*#__PURE__*/react.createContext(null);\nconst makeEventKey = (eventKey, href = null) => {\n if (eventKey != null) return String(eventKey);\n return href || null;\n};\n/* harmony default export */ const esm_SelectableContext = (SelectableContext);\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/extends.js\nfunction extends_extends() {\n extends_extends = Object.assign ? Object.assign.bind() : function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return extends_extends.apply(this, arguments);\n}\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js\nfunction objectWithoutPropertiesLoose_objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n return target;\n}\n// EXTERNAL MODULE: ./node_modules/invariant/browser.js\nvar browser = __webpack_require__(1143);\nvar browser_default = /*#__PURE__*/__webpack_require__.n(browser);\n;// CONCATENATED MODULE: ./node_modules/uncontrollable/lib/esm/utils.js\n\n\nvar noop = function noop() {};\n\nfunction readOnlyPropType(handler, name) {\n return function (props, propName) {\n if (props[propName] !== undefined) {\n if (!props[handler]) {\n return new Error("You have provided a `" + propName + "` prop to `" + name + "` " + ("without an `" + handler + "` handler prop. This will render a read-only field. ") + ("If the field should be mutable use `" + defaultKey(propName) + "`. ") + ("Otherwise, set `" + handler + "`."));\n }\n }\n };\n}\n\nfunction uncontrolledPropTypes(controlledValues, displayName) {\n var propTypes = {};\n Object.keys(controlledValues).forEach(function (prop) {\n // add default propTypes for folks that use runtime checks\n propTypes[defaultKey(prop)] = noop;\n\n if (false) { var handler; }\n });\n return propTypes;\n}\nfunction isProp(props, prop) {\n return props[prop] !== undefined;\n}\nfunction defaultKey(key) {\n return \'default\' + key.charAt(0).toUpperCase() + key.substr(1);\n}\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n */\n\nfunction canAcceptRef(component) {\n return !!component && (typeof component !== \'function\' || component.prototype && component.prototype.isReactComponent);\n}\n;// CONCATENATED MODULE: ./node_modules/uncontrollable/lib/esm/hook.js\n\n\n\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }\n\nfunction _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }\n\n\n\n\nfunction useUncontrolledProp(propValue, defaultValue, handler) {\n var wasPropRef = (0,react.useRef)(propValue !== undefined);\n\n var _useState = (0,react.useState)(defaultValue),\n stateValue = _useState[0],\n setState = _useState[1];\n\n var isProp = propValue !== undefined;\n var wasProp = wasPropRef.current;\n wasPropRef.current = isProp;\n /**\n * If a prop switches from controlled to Uncontrolled\n * reset its value to the defaultValue\n */\n\n if (!isProp && wasProp && stateValue !== defaultValue) {\n setState(defaultValue);\n }\n\n return [isProp ? propValue : stateValue, (0,react.useCallback)(function (value) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n if (handler) handler.apply(void 0, [value].concat(args));\n setState(value);\n }, [handler])];\n}\n\n\nfunction useUncontrolled(props, config) {\n return Object.keys(config).reduce(function (result, fieldName) {\n var _extends2;\n\n var _ref = result,\n defaultValue = _ref[defaultKey(fieldName)],\n propsValue = _ref[fieldName],\n rest = objectWithoutPropertiesLoose_objectWithoutPropertiesLoose(_ref, [defaultKey(fieldName), fieldName].map(_toPropertyKey));\n\n var handlerName = config[fieldName];\n\n var _useUncontrolledProp = useUncontrolledProp(propsValue, defaultValue, props[handlerName]),\n value = _useUncontrolledProp[0],\n handler = _useUncontrolledProp[1];\n\n return extends_extends({}, rest, (_extends2 = {}, _extends2[fieldName] = value, _extends2[handlerName] = handler, _extends2));\n }, props);\n}\n;// CONCATENATED MODULE: ./node_modules/react-lifecycles-compat/react-lifecycles-compat.es.js\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nfunction componentWillMount() {\n // Call this.constructor.gDSFP to support sub-classes.\n var state = this.constructor.getDerivedStateFromProps(this.props, this.state);\n if (state !== null && state !== undefined) {\n this.setState(state);\n }\n}\n\nfunction componentWillReceiveProps(nextProps) {\n // Call this.constructor.gDSFP to support sub-classes.\n // Use the setState() updater to ensure state isn\'t stale in certain edge cases.\n function updater(prevState) {\n var state = this.constructor.getDerivedStateFromProps(nextProps, prevState);\n return state !== null && state !== undefined ? state : null;\n }\n // Binding "this" is important for shallow renderer support.\n this.setState(updater.bind(this));\n}\n\nfunction componentWillUpdate(nextProps, nextState) {\n try {\n var prevProps = this.props;\n var prevState = this.state;\n this.props = nextProps;\n this.state = nextState;\n this.__reactInternalSnapshotFlag = true;\n this.__reactInternalSnapshot = this.getSnapshotBeforeUpdate(\n prevProps,\n prevState\n );\n } finally {\n this.props = prevProps;\n this.state = prevState;\n }\n}\n\n// React may warn about cWM/cWRP/cWU methods being deprecated.\n// Add a flag to suppress these warnings for this special case.\ncomponentWillMount.__suppressDeprecationWarning = true;\ncomponentWillReceiveProps.__suppressDeprecationWarning = true;\ncomponentWillUpdate.__suppressDeprecationWarning = true;\n\nfunction react_lifecycles_compat_es_polyfill(Component) {\n var prototype = Component.prototype;\n\n if (!prototype || !prototype.isReactComponent) {\n throw new Error(\'Can only polyfill class components\');\n }\n\n if (\n typeof Component.getDerivedStateFromProps !== \'function\' &&\n typeof prototype.getSnapshotBeforeUpdate !== \'function\'\n ) {\n return Component;\n }\n\n // If new component APIs are defined, "unsafe" lifecycles won\'t be called.\n // Error if any of these lifecycles are present,\n // Because they would work differently between older and newer (16.3+) versions of React.\n var foundWillMountName = null;\n var foundWillReceivePropsName = null;\n var foundWillUpdateName = null;\n if (typeof prototype.componentWillMount === \'function\') {\n foundWillMountName = \'componentWillMount\';\n } else if (typeof prototype.UNSAFE_componentWillMount === \'function\') {\n foundWillMountName = \'UNSAFE_componentWillMount\';\n }\n if (typeof prototype.componentWillReceiveProps === \'function\') {\n foundWillReceivePropsName = \'componentWillReceiveProps\';\n } else if (typeof prototype.UNSAFE_componentWillReceiveProps === \'function\') {\n foundWillReceivePropsName = \'UNSAFE_componentWillReceiveProps\';\n }\n if (typeof prototype.componentWillUpdate === \'function\') {\n foundWillUpdateName = \'componentWillUpdate\';\n } else if (typeof prototype.UNSAFE_componentWillUpdate === \'function\') {\n foundWillUpdateName = \'UNSAFE_componentWillUpdate\';\n }\n if (\n foundWillMountName !== null ||\n foundWillReceivePropsName !== null ||\n foundWillUpdateName !== null\n ) {\n var componentName = Component.displayName || Component.name;\n var newApiName =\n typeof Component.getDerivedStateFromProps === \'function\'\n ? \'getDerivedStateFromProps()\'\n : \'getSnapshotBeforeUpdate()\';\n\n throw Error(\n \'Unsafe legacy lifecycles will not be called for components using new component APIs.\\n\\n\' +\n componentName +\n \' uses \' +\n newApiName +\n \' but also contains the following legacy lifecycles:\' +\n (foundWillMountName !== null ? \'\\n \' + foundWillMountName : \'\') +\n (foundWillReceivePropsName !== null\n ? \'\\n \' + foundWillReceivePropsName\n : \'\') +\n (foundWillUpdateName !== null ? \'\\n \' + foundWillUpdateName : \'\') +\n \'\\n\\nThe above lifecycles should be removed. Learn more about this warning here:\\n\' +\n \'https://fb.me/react-async-component-lifecycle-hooks\'\n );\n }\n\n // React <= 16.2 does not support static getDerivedStateFromProps.\n // As a workaround, use cWM and cWRP to invoke the new static lifecycle.\n // Newer versions of React will ignore these lifecycles if gDSFP exists.\n if (typeof Component.getDerivedStateFromProps === \'function\') {\n prototype.componentWillMount = componentWillMount;\n prototype.componentWillReceiveProps = componentWillReceiveProps;\n }\n\n // React <= 16.2 does not support getSnapshotBeforeUpdate.\n // As a workaround, use cWU to invoke the new lifecycle.\n // Newer versions of React will ignore that lifecycle if gSBU exists.\n if (typeof prototype.getSnapshotBeforeUpdate === \'function\') {\n if (typeof prototype.componentDidUpdate !== \'function\') {\n throw new Error(\n \'Cannot polyfill getSnapshotBeforeUpdate() for components that do not define componentDidUpdate() on the prototype\'\n );\n }\n\n prototype.componentWillUpdate = componentWillUpdate;\n\n var componentDidUpdate = prototype.componentDidUpdate;\n\n prototype.componentDidUpdate = function componentDidUpdatePolyfill(\n prevProps,\n prevState,\n maybeSnapshot\n ) {\n // 16.3+ will not execute our will-update method;\n // It will pass a snapshot value to did-update though.\n // Older versions will require our polyfilled will-update value.\n // We need to handle both cases, but can\'t just check for the presence of "maybeSnapshot",\n // Because for <= 15.x versions this might be a "prevContext" object.\n // We also can\'t just check "__reactInternalSnapshot",\n // Because get-snapshot might return a falsy value.\n // So check for the explicit __reactInternalSnapshotFlag flag to determine behavior.\n var snapshot = this.__reactInternalSnapshotFlag\n ? this.__reactInternalSnapshot\n : maybeSnapshot;\n\n componentDidUpdate.call(this, prevProps, prevState, snapshot);\n };\n }\n\n return Component;\n}\n\n\n\n;// CONCATENATED MODULE: ./node_modules/uncontrollable/lib/esm/uncontrollable.js\n\n\n\nvar _jsxFileName = "/Users/jquense/src/uncontrollable/src/uncontrollable.js";\n\n\n\n\nfunction uncontrollable(Component, controlledValues, methods) {\n if (methods === void 0) {\n methods = [];\n }\n\n var displayName = Component.displayName || Component.name || \'Component\';\n var canAcceptRef = Utils.canAcceptRef(Component);\n var controlledProps = Object.keys(controlledValues);\n var PROPS_TO_OMIT = controlledProps.map(Utils.defaultKey);\n !(canAcceptRef || !methods.length) ? false ? 0 : invariant(false) : void 0;\n\n var UncontrolledComponent =\n /*#__PURE__*/\n function (_React$Component) {\n _inheritsLoose(UncontrolledComponent, _React$Component);\n\n function UncontrolledComponent() {\n var _this;\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n _this = _React$Component.call.apply(_React$Component, [this].concat(args)) || this;\n _this.handlers = Object.create(null);\n controlledProps.forEach(function (propName) {\n var handlerName = controlledValues[propName];\n\n var handleChange = function handleChange(value) {\n if (_this.props[handlerName]) {\n var _this$props;\n\n _this._notifying = true;\n\n for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n\n (_this$props = _this.props)[handlerName].apply(_this$props, [value].concat(args));\n\n _this._notifying = false;\n }\n\n if (!_this.unmounted) _this.setState(function (_ref) {\n var _extends2;\n\n var values = _ref.values;\n return {\n values: _extends(Object.create(null), values, (_extends2 = {}, _extends2[propName] = value, _extends2))\n };\n });\n };\n\n _this.handlers[handlerName] = handleChange;\n });\n if (methods.length) _this.attachRef = function (ref) {\n _this.inner = ref;\n };\n var values = Object.create(null);\n controlledProps.forEach(function (key) {\n values[key] = _this.props[Utils.defaultKey(key)];\n });\n _this.state = {\n values: values,\n prevProps: {}\n };\n return _this;\n }\n\n var _proto = UncontrolledComponent.prototype;\n\n _proto.shouldComponentUpdate = function shouldComponentUpdate() {\n //let setState trigger the update\n return !this._notifying;\n };\n\n UncontrolledComponent.getDerivedStateFromProps = function getDerivedStateFromProps(props, _ref2) {\n var values = _ref2.values,\n prevProps = _ref2.prevProps;\n var nextState = {\n values: _extends(Object.create(null), values),\n prevProps: {}\n };\n controlledProps.forEach(function (key) {\n /**\n * If a prop switches from controlled to Uncontrolled\n * reset its value to the defaultValue\n */\n nextState.prevProps[key] = props[key];\n\n if (!Utils.isProp(props, key) && Utils.isProp(prevProps, key)) {\n nextState.values[key] = props[Utils.defaultKey(key)];\n }\n });\n return nextState;\n };\n\n _proto.componentWillUnmount = function componentWillUnmount() {\n this.unmounted = true;\n };\n\n _proto.render = function render() {\n var _this2 = this;\n\n var _this$props2 = this.props,\n innerRef = _this$props2.innerRef,\n props = _objectWithoutPropertiesLoose(_this$props2, ["innerRef"]);\n\n PROPS_TO_OMIT.forEach(function (prop) {\n delete props[prop];\n });\n var newProps = {};\n controlledProps.forEach(function (propName) {\n var propValue = _this2.props[propName];\n newProps[propName] = propValue !== undefined ? propValue : _this2.state.values[propName];\n });\n return React.createElement(Component, _extends({}, props, newProps, this.handlers, {\n ref: innerRef || this.attachRef\n }));\n };\n\n return UncontrolledComponent;\n }(React.Component);\n\n polyfill(UncontrolledComponent);\n UncontrolledComponent.displayName = "Uncontrolled(" + displayName + ")";\n UncontrolledComponent.propTypes = _extends({\n innerRef: function innerRef() {}\n }, Utils.uncontrolledPropTypes(controlledValues, displayName));\n methods.forEach(function (method) {\n UncontrolledComponent.prototype[method] = function $proxiedMethod() {\n var _this$inner;\n\n return (_this$inner = this.inner)[method].apply(_this$inner, arguments);\n };\n });\n var WrappedComponent = UncontrolledComponent;\n\n if (React.forwardRef) {\n WrappedComponent = React.forwardRef(function (props, ref) {\n return React.createElement(UncontrolledComponent, _extends({}, props, {\n innerRef: ref,\n __source: {\n fileName: _jsxFileName,\n lineNumber: 128\n },\n __self: this\n }));\n });\n WrappedComponent.propTypes = UncontrolledComponent.propTypes;\n }\n\n WrappedComponent.ControlledComponent = Component;\n /**\n * useful when wrapping a Component and you want to control\n * everything\n */\n\n WrappedComponent.deferControlTo = function (newComponent, additions, nextMethods) {\n if (additions === void 0) {\n additions = {};\n }\n\n return uncontrollable(newComponent, _extends({}, controlledValues, additions), nextMethods);\n };\n\n return WrappedComponent;\n}\n;// CONCATENATED MODULE: ./node_modules/uncontrollable/lib/esm/index.js\n\n\n// EXTERNAL MODULE: ./node_modules/react/jsx-runtime.js\nvar jsx_runtime = __webpack_require__(5893);\n;// CONCATENATED MODULE: ./node_modules/react-bootstrap/esm/ThemeProvider.js\n"use client";\n\n\n\n\nconst DEFAULT_BREAKPOINTS = [\'xxl\', \'xl\', \'lg\', \'md\', \'sm\', \'xs\'];\nconst DEFAULT_MIN_BREAKPOINT = \'xs\';\nconst ThemeContext = /*#__PURE__*/react.createContext({\n prefixes: {},\n breakpoints: DEFAULT_BREAKPOINTS,\n minBreakpoint: DEFAULT_MIN_BREAKPOINT\n});\nconst {\n Consumer,\n Provider\n} = ThemeContext;\nfunction ThemeProvider({\n prefixes = {},\n breakpoints = DEFAULT_BREAKPOINTS,\n minBreakpoint = DEFAULT_MIN_BREAKPOINT,\n dir,\n children\n}) {\n const contextValue = useMemo(() => ({\n prefixes: {\n ...prefixes\n },\n breakpoints,\n minBreakpoint,\n dir\n }), [prefixes, breakpoints, minBreakpoint, dir]);\n return /*#__PURE__*/_jsx(Provider, {\n value: contextValue,\n children: children\n });\n}\nfunction useBootstrapPrefix(prefix, defaultPrefix) {\n const {\n prefixes\n } = (0,react.useContext)(ThemeContext);\n return prefix || prefixes[defaultPrefix] || defaultPrefix;\n}\nfunction useBootstrapBreakpoints() {\n const {\n breakpoints\n } = (0,react.useContext)(ThemeContext);\n return breakpoints;\n}\nfunction useBootstrapMinBreakpoint() {\n const {\n minBreakpoint\n } = (0,react.useContext)(ThemeContext);\n return minBreakpoint;\n}\nfunction useIsRTL() {\n const {\n dir\n } = (0,react.useContext)(ThemeContext);\n return dir === \'rtl\';\n}\nfunction createBootstrapComponent(Component, opts) {\n if (typeof opts === \'string\') opts = {\n prefix: opts\n };\n const isClassy = Component.prototype && Component.prototype.isReactComponent;\n // If it\'s a functional component make sure we don\'t break it with a ref\n const {\n prefix,\n forwardRefAs = isClassy ? \'ref\' : \'innerRef\'\n } = opts;\n const Wrapped = /*#__PURE__*/React.forwardRef(({\n ...props\n }, ref) => {\n props[forwardRefAs] = ref;\n const bsPrefix = useBootstrapPrefix(props.bsPrefix, prefix);\n return /*#__PURE__*/_jsx(Component, {\n ...props,\n bsPrefix: bsPrefix\n });\n });\n Wrapped.displayName = `Bootstrap(${Component.displayName || Component.name})`;\n return Wrapped;\n}\n\n/* harmony default export */ const esm_ThemeProvider = ((/* unused pure expression or super */ null && (ThemeProvider)));\n;// CONCATENATED MODULE: ./node_modules/react-bootstrap/esm/NavbarBrand.js\n"use client";\n\n\n\n\n\nconst NavbarBrand = /*#__PURE__*/react.forwardRef(({\n bsPrefix,\n className,\n as,\n ...props\n}, ref) => {\n bsPrefix = useBootstrapPrefix(bsPrefix, \'navbar-brand\');\n const Component = as || (props.href ? \'a\' : \'span\');\n return /*#__PURE__*/(0,jsx_runtime.jsx)(Component, {\n ...props,\n ref: ref,\n className: classnames_default()(className, bsPrefix)\n });\n});\nNavbarBrand.displayName = \'NavbarBrand\';\n/* harmony default export */ const esm_NavbarBrand = (NavbarBrand);\n;// CONCATENATED MODULE: ./node_modules/dom-helpers/esm/ownerDocument.js\n/**\n * Returns the owner document of a given element.\n * \n * @param node the element\n */\nfunction ownerDocument(node) {\n return node && node.ownerDocument || document;\n}\n;// CONCATENATED MODULE: ./node_modules/dom-helpers/esm/ownerWindow.js\n\n/**\n * Returns the owner window of a given element.\n * \n * @param node the element\n */\n\nfunction ownerWindow(node) {\n var doc = ownerDocument(node);\n return doc && doc.defaultView || window;\n}\n;// CONCATENATED MODULE: ./node_modules/dom-helpers/esm/getComputedStyle.js\n\n/**\n * Returns one or all computed style properties of an element.\n * \n * @param node the element\n * @param psuedoElement the style property\n */\n\nfunction getComputedStyle_getComputedStyle(node, psuedoElement) {\n return ownerWindow(node).getComputedStyle(node, psuedoElement);\n}\n;// CONCATENATED MODULE: ./node_modules/dom-helpers/esm/hyphenate.js\nvar rUpper = /([A-Z])/g;\nfunction hyphenate(string) {\n return string.replace(rUpper, \'-$1\').toLowerCase();\n}\n;// CONCATENATED MODULE: ./node_modules/dom-helpers/esm/hyphenateStyle.js\n/**\n * Copyright 2013-2014, Facebook, Inc.\n * All rights reserved.\n * https://github.com/facebook/react/blob/2aeb8a2a6beb00617a4217f7f8284924fa2ad819/src/vendor/core/hyphenateStyleName.js\n */\n\nvar msPattern = /^ms-/;\nfunction hyphenateStyleName(string) {\n return hyphenate(string).replace(msPattern, \'-ms-\');\n}\n;// CONCATENATED MODULE: ./node_modules/dom-helpers/esm/isTransform.js\nvar supportedTransforms = /^((translate|rotate|scale)(X|Y|Z|3d)?|matrix(3d)?|perspective|skew(X|Y)?)$/i;\nfunction isTransform(value) {\n return !!(value && supportedTransforms.test(value));\n}\n;// CONCATENATED MODULE: ./node_modules/dom-helpers/esm/css.js\n\n\n\n\nfunction style(node, property) {\n var css = \'\';\n var transforms = \'\';\n\n if (typeof property === \'string\') {\n return node.style.getPropertyValue(hyphenateStyleName(property)) || getComputedStyle_getComputedStyle(node).getPropertyValue(hyphenateStyleName(property));\n }\n\n Object.keys(property).forEach(function (key) {\n var value = property[key];\n\n if (!value && value !== 0) {\n node.style.removeProperty(hyphenateStyleName(key));\n } else if (isTransform(key)) {\n transforms += key + "(" + value + ") ";\n } else {\n css += hyphenateStyleName(key) + ": " + value + ";";\n }\n });\n\n if (transforms) {\n css += "transform: " + transforms + ";";\n }\n\n node.style.cssText += ";" + css;\n}\n\n/* harmony default export */ const css = (style);\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js\nfunction _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n return _setPrototypeOf(o, p);\n}\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js\n\nfunction inheritsLoose_inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n _setPrototypeOf(subClass, superClass);\n}\n;// CONCATENATED MODULE: ./node_modules/react-transition-group/esm/config.js\n/* harmony default export */ const config = ({\n disabled: false\n});\n;// CONCATENATED MODULE: ./node_modules/react-transition-group/esm/TransitionGroupContext.js\n\n/* harmony default export */ const TransitionGroupContext = (react.createContext(null));\n;// CONCATENATED MODULE: ./node_modules/react-transition-group/esm/utils/reflow.js\nvar forceReflow = function forceReflow(node) {\n return node.scrollTop;\n};\n;// CONCATENATED MODULE: ./node_modules/react-transition-group/esm/Transition.js\n\n\n\n\n\n\n\n\n\nvar UNMOUNTED = \'unmounted\';\nvar EXITED = \'exited\';\nvar ENTERING = \'entering\';\nvar ENTERED = \'entered\';\nvar EXITING = \'exiting\';\n/**\n * The Transition component lets you describe a transition from one component\n * state to another _over time_ with a simple declarative API. Most commonly\n * it\'s used to animate the mounting and unmounting of a component, but can also\n * be used to describe in-place transition states as well.\n *\n * ---\n *\n * **Note**: `Transition` is a platform-agnostic base component. If you\'re using\n * transitions in CSS, you\'ll probably want to use\n * [`CSSTransition`](https://reactcommunity.org/react-transition-group/css-transition)\n * instead. It inherits all the features of `Transition`, but contains\n * additional features necessary to play nice with CSS transitions (hence the\n * name of the component).\n *\n * ---\n *\n * By default the `Transition` component does not alter the behavior of the\n * component it renders, it only tracks "enter" and "exit" states for the\n * components. It\'s up to you to give meaning and effect to those states. For\n * example we can add styles to a component when it enters or exits:\n *\n * ```jsx\n * import { Transition } from \'react-transition-group\';\n *\n * const duration = 300;\n *\n * const defaultStyle = {\n * transition: `opacity ${duration}ms ease-in-out`,\n * opacity: 0,\n * }\n *\n * const transitionStyles = {\n * entering: { opacity: 1 },\n * entered: { opacity: 1 },\n * exiting: { opacity: 0 },\n * exited: { opacity: 0 },\n * };\n *\n * const Fade = ({ in: inProp }) => (\n * <Transition in={inProp} timeout={duration}>\n * {state => (\n * <div style={{\n * ...defaultStyle,\n * ...transitionStyles[state]\n * }}>\n * I\'m a fade Transition!\n * </div>\n * )}\n * </Transition>\n * );\n * ```\n *\n * There are 4 main states a Transition can be in:\n * - `\'entering\'`\n * - `\'entered\'`\n * - `\'exiting\'`\n * - `\'exited\'`\n *\n * Transition state is toggled via the `in` prop. When `true` the component\n * begins the "Enter" stage. During this stage, the component will shift from\n * its current transition state, to `\'entering\'` for the duration of the\n * transition and then to the `\'entered\'` stage once it\'s complete. Let\'s take\n * the following example (we\'ll use the\n * [useState](https://reactjs.org/docs/hooks-reference.html#usestate) hook):\n *\n * ```jsx\n * function App() {\n * const [inProp, setInProp] = useState(false);\n * return (\n * <div>\n * <Transition in={inProp} timeout={500}>\n * {state => (\n * // ...\n * )}\n * </Transition>\n * <button onClick={() => setInProp(true)}>\n * Click to Enter\n * </button>\n * </div>\n * );\n * }\n * ```\n *\n * When the button is clicked the component will shift to the `\'entering\'` state\n * and stay there for 500ms (the value of `timeout`) before it finally switches\n * to `\'entered\'`.\n *\n * When `in` is `false` the same thing happens except the state moves from\n * `\'exiting\'` to `\'exited\'`.\n */\n\nvar Transition = /*#__PURE__*/function (_React$Component) {\n inheritsLoose_inheritsLoose(Transition, _React$Component);\n\n function Transition(props, context) {\n var _this;\n\n _this = _React$Component.call(this, props, context) || this;\n var parentGroup = context; // In the context of a TransitionGroup all enters are really appears\n\n var appear = parentGroup && !parentGroup.isMounting ? props.enter : props.appear;\n var initialStatus;\n _this.appearStatus = null;\n\n if (props.in) {\n if (appear) {\n initialStatus = EXITED;\n _this.appearStatus = ENTERING;\n } else {\n initialStatus = ENTERED;\n }\n } else {\n if (props.unmountOnExit || props.mountOnEnter) {\n initialStatus = UNMOUNTED;\n } else {\n initialStatus = EXITED;\n }\n }\n\n _this.state = {\n status: initialStatus\n };\n _this.nextCallback = null;\n return _this;\n }\n\n Transition.getDerivedStateFromProps = function getDerivedStateFromProps(_ref, prevState) {\n var nextIn = _ref.in;\n\n if (nextIn && prevState.status === UNMOUNTED) {\n return {\n status: EXITED\n };\n }\n\n return null;\n } // getSnapshotBeforeUpdate(prevProps) {\n // let nextStatus = null\n // if (prevProps !== this.props) {\n // const { status } = this.state\n // if (this.props.in) {\n // if (status !== ENTERING && status !== ENTERED) {\n // nextStatus = ENTERING\n // }\n // } else {\n // if (status === ENTERING || status === ENTERED) {\n // nextStatus = EXITING\n // }\n // }\n // }\n // return { nextStatus }\n // }\n ;\n\n var _proto = Transition.prototype;\n\n _proto.componentDidMount = function componentDidMount() {\n this.updateStatus(true, this.appearStatus);\n };\n\n _proto.componentDidUpdate = function componentDidUpdate(prevProps) {\n var nextStatus = null;\n\n if (prevProps !== this.props) {\n var status = this.state.status;\n\n if (this.props.in) {\n if (status !== ENTERING && status !== ENTERED) {\n nextStatus = ENTERING;\n }\n } else {\n if (status === ENTERING || status === ENTERED) {\n nextStatus = EXITING;\n }\n }\n }\n\n this.updateStatus(false, nextStatus);\n };\n\n _proto.componentWillUnmount = function componentWillUnmount() {\n this.cancelNextCallback();\n };\n\n _proto.getTimeouts = function getTimeouts() {\n var timeout = this.props.timeout;\n var exit, enter, appear;\n exit = enter = appear = timeout;\n\n if (timeout != null && typeof timeout !== \'number\') {\n exit = timeout.exit;\n enter = timeout.enter; // TODO: remove fallback for next major\n\n appear = timeout.appear !== undefined ? timeout.appear : enter;\n }\n\n return {\n exit: exit,\n enter: enter,\n appear: appear\n };\n };\n\n _proto.updateStatus = function updateStatus(mounting, nextStatus) {\n if (mounting === void 0) {\n mounting = false;\n }\n\n if (nextStatus !== null) {\n // nextStatus will always be ENTERING or EXITING.\n this.cancelNextCallback();\n\n if (nextStatus === ENTERING) {\n if (this.props.unmountOnExit || this.props.mountOnEnter) {\n var node = this.props.nodeRef ? this.props.nodeRef.current : react_dom.findDOMNode(this); // https://github.com/reactjs/react-transition-group/pull/749\n // With unmountOnExit or mountOnEnter, the enter animation should happen at the transition between `exited` and `entering`.\n // To make the animation happen, we have to separate each rendering and avoid being processed as batched.\n\n if (node) forceReflow(node);\n }\n\n this.performEnter(mounting);\n } else {\n this.performExit();\n }\n } else if (this.props.unmountOnExit && this.state.status === EXITED) {\n this.setState({\n status: UNMOUNTED\n });\n }\n };\n\n _proto.performEnter = function performEnter(mounting) {\n var _this2 = this;\n\n var enter = this.props.enter;\n var appearing = this.context ? this.context.isMounting : mounting;\n\n var _ref2 = this.props.nodeRef ? [appearing] : [react_dom.findDOMNode(this), appearing],\n maybeNode = _ref2[0],\n maybeAppearing = _ref2[1];\n\n var timeouts = this.getTimeouts();\n var enterTimeout = appearing ? timeouts.appear : timeouts.enter; // no enter animation skip right to ENTERED\n // if we are mounting and running this it means appear _must_ be set\n\n if (!mounting && !enter || config.disabled) {\n this.safeSetState({\n status: ENTERED\n }, function () {\n _this2.props.onEntered(maybeNode);\n });\n return;\n }\n\n this.props.onEnter(maybeNode, maybeAppearing);\n this.safeSetState({\n status: ENTERING\n }, function () {\n _this2.props.onEntering(maybeNode, maybeAppearing);\n\n _this2.onTransitionEnd(enterTimeout, function () {\n _this2.safeSetState({\n status: ENTERED\n }, function () {\n _this2.props.onEntered(maybeNode, maybeAppearing);\n });\n });\n });\n };\n\n _proto.performExit = function performExit() {\n var _this3 = this;\n\n var exit = this.props.exit;\n var timeouts = this.getTimeouts();\n var maybeNode = this.props.nodeRef ? undefined : react_dom.findDOMNode(this); // no exit animation skip right to EXITED\n\n if (!exit || config.disabled) {\n this.safeSetState({\n status: EXITED\n }, function () {\n _this3.props.onExited(maybeNode);\n });\n return;\n }\n\n this.props.onExit(maybeNode);\n this.safeSetState({\n status: EXITING\n }, function () {\n _this3.props.onExiting(maybeNode);\n\n _this3.onTransitionEnd(timeouts.exit, function () {\n _this3.safeSetState({\n status: EXITED\n }, function () {\n _this3.props.onExited(maybeNode);\n });\n });\n });\n };\n\n _proto.cancelNextCallback = function cancelNextCallback() {\n if (this.nextCallback !== null) {\n this.nextCallback.cancel();\n this.nextCallback = null;\n }\n };\n\n _proto.safeSetState = function safeSetState(nextState, callback) {\n // This shouldn\'t be necessary, but there are weird race conditions with\n // setState callbacks and unmounting in testing, so always make sure that\n // we can cancel any pending setState callbacks after we unmount.\n callback = this.setNextCallback(callback);\n this.setState(nextState, callback);\n };\n\n _proto.setNextCallback = function setNextCallback(callback) {\n var _this4 = this;\n\n var active = true;\n\n this.nextCallback = function (event) {\n if (active) {\n active = false;\n _this4.nextCallback = null;\n callback(event);\n }\n };\n\n this.nextCallback.cancel = function () {\n active = false;\n };\n\n return this.nextCallback;\n };\n\n _proto.onTransitionEnd = function onTransitionEnd(timeout, handler) {\n this.setNextCallback(handler);\n var node = this.props.nodeRef ? this.props.nodeRef.current : react_dom.findDOMNode(this);\n var doesNotHaveTimeoutOrListener = timeout == null && !this.props.addEndListener;\n\n if (!node || doesNotHaveTimeoutOrListener) {\n setTimeout(this.nextCallback, 0);\n return;\n }\n\n if (this.props.addEndListener) {\n var _ref3 = this.props.nodeRef ? [this.nextCallback] : [node, this.nextCallback],\n maybeNode = _ref3[0],\n maybeNextCallback = _ref3[1];\n\n this.props.addEndListener(maybeNode, maybeNextCallback);\n }\n\n if (timeout != null) {\n setTimeout(this.nextCallback, timeout);\n }\n };\n\n _proto.render = function render() {\n var status = this.state.status;\n\n if (status === UNMOUNTED) {\n return null;\n }\n\n var _this$props = this.props,\n children = _this$props.children,\n _in = _this$props.in,\n _mountOnEnter = _this$props.mountOnEnter,\n _unmountOnExit = _this$props.unmountOnExit,\n _appear = _this$props.appear,\n _enter = _this$props.enter,\n _exit = _this$props.exit,\n _timeout = _this$props.timeout,\n _addEndListener = _this$props.addEndListener,\n _onEnter = _this$props.onEnter,\n _onEntering = _this$props.onEntering,\n _onEntered = _this$props.onEntered,\n _onExit = _this$props.onExit,\n _onExiting = _this$props.onExiting,\n _onExited = _this$props.onExited,\n _nodeRef = _this$props.nodeRef,\n childProps = objectWithoutPropertiesLoose_objectWithoutPropertiesLoose(_this$props, ["children", "in", "mountOnEnter", "unmountOnExit", "appear", "enter", "exit", "timeout", "addEndListener", "onEnter", "onEntering", "onEntered", "onExit", "onExiting", "onExited", "nodeRef"]);\n\n return (\n /*#__PURE__*/\n // allows for nested Transitions\n react.createElement(TransitionGroupContext.Provider, {\n value: null\n }, typeof children === \'function\' ? children(status, childProps) : react.cloneElement(react.Children.only(children), childProps))\n );\n };\n\n return Transition;\n}(react.Component);\n\nTransition.contextType = TransitionGroupContext;\nTransition.propTypes = false ? 0 : {}; // Name the function so it is clearer in the documentation\n\nfunction Transition_noop() {}\n\nTransition.defaultProps = {\n in: false,\n mountOnEnter: false,\n unmountOnExit: false,\n appear: false,\n enter: true,\n exit: true,\n onEnter: Transition_noop,\n onEntering: Transition_noop,\n onEntered: Transition_noop,\n onExit: Transition_noop,\n onExiting: Transition_noop,\n onExited: Transition_noop\n};\nTransition.UNMOUNTED = UNMOUNTED;\nTransition.EXITED = EXITED;\nTransition.ENTERING = ENTERING;\nTransition.ENTERED = ENTERED;\nTransition.EXITING = EXITING;\n/* harmony default export */ const esm_Transition = (Transition);\n;// CONCATENATED MODULE: ./node_modules/dom-helpers/esm/canUseDOM.js\n/* harmony default export */ const canUseDOM = (!!(typeof window !== \'undefined\' && window.document && window.document.createElement));\n;// CONCATENATED MODULE: ./node_modules/dom-helpers/esm/addEventListener.js\n/* eslint-disable no-return-assign */\n\nvar optionsSupported = false;\nvar onceSupported = false;\n\ntry {\n var addEventListener_options = {\n get passive() {\n return optionsSupported = true;\n },\n\n get once() {\n // eslint-disable-next-line no-multi-assign\n return onceSupported = optionsSupported = true;\n }\n\n };\n\n if (canUseDOM) {\n window.addEventListener(\'test\', addEventListener_options, addEventListener_options);\n window.removeEventListener(\'test\', addEventListener_options, true);\n }\n} catch (e) {\n /* */\n}\n\n/**\n * An `addEventListener` ponyfill, supports the `once` option\n * \n * @param node the element\n * @param eventName the event name\n * @param handle the handler\n * @param options event options\n */\nfunction addEventListener(node, eventName, handler, options) {\n if (options && typeof options !== \'boolean\' && !onceSupported) {\n var once = options.once,\n capture = options.capture;\n var wrappedHandler = handler;\n\n if (!onceSupported && once) {\n wrappedHandler = handler.__once || function onceHandler(event) {\n this.removeEventListener(eventName, onceHandler, capture);\n handler.call(this, event);\n };\n\n handler.__once = wrappedHandler;\n }\n\n node.addEventListener(eventName, wrappedHandler, optionsSupported ? options : capture);\n }\n\n node.addEventListener(eventName, handler, options);\n}\n\n/* harmony default export */ const esm_addEventListener = (addEventListener);\n;// CONCATENATED MODULE: ./node_modules/dom-helpers/esm/removeEventListener.js\n/**\n * A `removeEventListener` ponyfill\n * \n * @param node the element\n * @param eventName the event name\n * @param handle the handler\n * @param options event options\n */\nfunction removeEventListener(node, eventName, handler, options) {\n var capture = options && typeof options !== \'boolean\' ? options.capture : options;\n node.removeEventListener(eventName, handler, capture);\n\n if (handler.__once) {\n node.removeEventListener(eventName, handler.__once, capture);\n }\n}\n\n/* harmony default export */ const esm_removeEventListener = (removeEventListener);\n;// CONCATENATED MODULE: ./node_modules/dom-helpers/esm/listen.js\n\n\n\nfunction listen(node, eventName, handler, options) {\n esm_addEventListener(node, eventName, handler, options);\n return function () {\n esm_removeEventListener(node, eventName, handler, options);\n };\n}\n\n/* harmony default export */ const esm_listen = (listen);\n;// CONCATENATED MODULE: ./node_modules/dom-helpers/esm/triggerEvent.js\n/**\n * Triggers an event on a given element.\n * \n * @param node the element\n * @param eventName the event name to trigger\n * @param bubbles whether the event should bubble up\n * @param cancelable whether the event should be cancelable\n */\nfunction triggerEvent(node, eventName, bubbles, cancelable) {\n if (bubbles === void 0) {\n bubbles = false;\n }\n\n if (cancelable === void 0) {\n cancelable = true;\n }\n\n if (node) {\n var event = document.createEvent(\'HTMLEvents\');\n event.initEvent(eventName, bubbles, cancelable);\n node.dispatchEvent(event);\n }\n}\n;// CONCATENATED MODULE: ./node_modules/dom-helpers/esm/transitionEnd.js\n\n\n\n\nfunction parseDuration(node) {\n var str = css(node, \'transitionDuration\') || \'\';\n var mult = str.indexOf(\'ms\') === -1 ? 1000 : 1;\n return parseFloat(str) * mult;\n}\n\nfunction emulateTransitionEnd(element, duration, padding) {\n if (padding === void 0) {\n padding = 5;\n }\n\n var called = false;\n var handle = setTimeout(function () {\n if (!called) triggerEvent(element, \'transitionend\', true);\n }, duration + padding);\n var remove = esm_listen(element, \'transitionend\', function () {\n called = true;\n }, {\n once: true\n });\n return function () {\n clearTimeout(handle);\n remove();\n };\n}\n\nfunction transitionEnd(element, handler, duration, padding) {\n if (duration == null) duration = parseDuration(element) || 0;\n var removeEmulate = emulateTransitionEnd(element, duration, padding);\n var remove = esm_listen(element, \'transitionend\', handler);\n return function () {\n removeEmulate();\n remove();\n };\n}\n;// CONCATENATED MODULE: ./node_modules/react-bootstrap/esm/transitionEndListener.js\n\n\nfunction transitionEndListener_parseDuration(node, property) {\n const str = css(node, property) || \'\';\n const mult = str.indexOf(\'ms\') === -1 ? 1000 : 1;\n return parseFloat(str) * mult;\n}\nfunction transitionEndListener(element, handler) {\n const duration = transitionEndListener_parseDuration(element, \'transitionDuration\');\n const delay = transitionEndListener_parseDuration(element, \'transitionDelay\');\n const remove = transitionEnd(element, e => {\n if (e.target === element) {\n remove();\n handler(e);\n }\n }, duration + delay);\n}\n;// CONCATENATED MODULE: ./node_modules/react-bootstrap/esm/createChainedFunction.js\n/**\n * Safe chained function\n *\n * Will only create a new function if needed,\n * otherwise will pass back existing functions or null.\n *\n * @param {function} functions to chain\n * @returns {function|null}\n */\nfunction createChainedFunction(...funcs) {\n return funcs.filter(f => f != null).reduce((acc, f) => {\n if (typeof f !== \'function\') {\n throw new Error(\'Invalid Argument Type, must only provide functions, undefined, or null.\');\n }\n if (acc === null) return f;\n return function chainedFunction(...args) {\n // @ts-ignore\n acc.apply(this, args);\n // @ts-ignore\n f.apply(this, args);\n };\n }, null);\n}\n/* harmony default export */ const esm_createChainedFunction = (createChainedFunction);\n;// CONCATENATED MODULE: ./node_modules/react-bootstrap/esm/triggerBrowserReflow.js\n// reading a dimension prop will cause the browser to recalculate,\n// which will let our animations work\nfunction triggerBrowserReflow(node) {\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n node.offsetHeight;\n}\n;// CONCATENATED MODULE: ./node_modules/@restart/hooks/esm/useMergedRefs.js\n\nconst toFnRef = ref => !ref || typeof ref === \'function\' ? ref : value => {\n ref.current = value;\n};\nfunction mergeRefs(refA, refB) {\n const a = toFnRef(refA);\n const b = toFnRef(refB);\n return value => {\n if (a) a(value);\n if (b) b(value);\n };\n}\n\n/**\n * Create and returns a single callback ref composed from two other Refs.\n *\n * ```tsx\n * const Button = React.forwardRef((props, ref) => {\n * const [element, attachRef] = useCallbackRef<HTMLButtonElement>();\n * const mergedRef = useMergedRefs(ref, attachRef);\n *\n * return <button ref={mergedRef} {...props}/>\n * })\n * ```\n *\n * @param refA A Callback or mutable Ref\n * @param refB A Callback or mutable Ref\n * @category refs\n */\nfunction useMergedRefs(refA, refB) {\n return (0,react.useMemo)(() => mergeRefs(refA, refB), [refA, refB]);\n}\n/* harmony default export */ const esm_useMergedRefs = (useMergedRefs);\n;// CONCATENATED MODULE: ./node_modules/react-bootstrap/esm/safeFindDOMNode.js\n\nfunction safeFindDOMNode(componentOrElement) {\n if (componentOrElement && \'setState\' in componentOrElement) {\n return react_dom.findDOMNode(componentOrElement);\n }\n return componentOrElement != null ? componentOrElement : null;\n}\n;// CONCATENATED MODULE: ./node_modules/react-bootstrap/esm/TransitionWrapper.js\n"use client";\n\n\n\n\n\n\n// Normalizes Transition callbacks when nodeRef is used.\nconst TransitionWrapper = /*#__PURE__*/react.forwardRef(({\n onEnter,\n onEntering,\n onEntered,\n onExit,\n onExiting,\n onExited,\n addEndListener,\n children,\n childRef,\n ...props\n}, ref) => {\n const nodeRef = (0,react.useRef)(null);\n const mergedRef = esm_useMergedRefs(nodeRef, childRef);\n const attachRef = r => {\n mergedRef(safeFindDOMNode(r));\n };\n const normalize = callback => param => {\n if (callback && nodeRef.current) {\n callback(nodeRef.current, param);\n }\n };\n\n /* eslint-disable react-hooks/exhaustive-deps */\n const handleEnter = (0,react.useCallback)(normalize(onEnter), [onEnter]);\n const handleEntering = (0,react.useCallback)(normalize(onEntering), [onEntering]);\n const handleEntered = (0,react.useCallback)(normalize(onEntered), [onEntered]);\n const handleExit = (0,react.useCallback)(normalize(onExit), [onExit]);\n const handleExiting = (0,react.useCallback)(normalize(onExiting), [onExiting]);\n const handleExited = (0,react.useCallback)(normalize(onExited), [onExited]);\n const handleAddEndListener = (0,react.useCallback)(normalize(addEndListener), [addEndListener]);\n /* eslint-enable react-hooks/exhaustive-deps */\n\n return /*#__PURE__*/(0,jsx_runtime.jsx)(esm_Transition, {\n ref: ref,\n ...props,\n onEnter: handleEnter,\n onEntered: handleEntered,\n onEntering: handleEntering,\n onExit: handleExit,\n onExited: handleExited,\n onExiting: handleExiting,\n addEndListener: handleAddEndListener,\n nodeRef: nodeRef,\n children: typeof children === \'function\' ? (status, innerProps) =>\n // TODO: Types for RTG missing innerProps, so need to cast.\n children(status, {\n ...innerProps,\n ref: attachRef\n }) : /*#__PURE__*/react.cloneElement(children, {\n ref: attachRef\n })\n });\n});\n/* harmony default export */ const esm_TransitionWrapper = (TransitionWrapper);\n;// CONCATENATED MODULE: ./node_modules/react-bootstrap/esm/Collapse.js\n\n\n\n\n\n\n\n\n\nconst MARGINS = {\n height: [\'marginTop\', \'marginBottom\'],\n width: [\'marginLeft\', \'marginRight\']\n};\nfunction getDefaultDimensionValue(dimension, elem) {\n const offset = `offset${dimension[0].toUpperCase()}${dimension.slice(1)}`;\n const value = elem[offset];\n const margins = MARGINS[dimension];\n return value +\n // @ts-ignore\n parseInt(css(elem, margins[0]), 10) +\n // @ts-ignore\n parseInt(css(elem, margins[1]), 10);\n}\nconst collapseStyles = {\n [EXITED]: \'collapse\',\n [EXITING]: \'collapsing\',\n [ENTERING]: \'collapsing\',\n [ENTERED]: \'collapse show\'\n};\nconst Collapse = /*#__PURE__*/react.forwardRef(({\n onEnter,\n onEntering,\n onEntered,\n onExit,\n onExiting,\n className,\n children,\n dimension = \'height\',\n in: inProp = false,\n timeout = 300,\n mountOnEnter = false,\n unmountOnExit = false,\n appear = false,\n getDimensionValue = getDefaultDimensionValue,\n ...props\n}, ref) => {\n /* Compute dimension */\n const computedDimension = typeof dimension === \'function\' ? dimension() : dimension;\n\n /* -- Expanding -- */\n const handleEnter = (0,react.useMemo)(() => esm_createChainedFunction(elem => {\n elem.style[computedDimension] = \'0\';\n }, onEnter), [computedDimension, onEnter]);\n const handleEntering = (0,react.useMemo)(() => esm_createChainedFunction(elem => {\n const scroll = `scroll${computedDimension[0].toUpperCase()}${computedDimension.slice(1)}`;\n elem.style[computedDimension] = `${elem[scroll]}px`;\n }, onEntering), [computedDimension, onEntering]);\n const handleEntered = (0,react.useMemo)(() => esm_createChainedFunction(elem => {\n elem.style[computedDimension] = null;\n }, onEntered), [computedDimension, onEntered]);\n\n /* -- Collapsing -- */\n const handleExit = (0,react.useMemo)(() => esm_createChainedFunction(elem => {\n elem.style[computedDimension] = `${getDimensionValue(computedDimension, elem)}px`;\n triggerBrowserReflow(elem);\n }, onExit), [onExit, getDimensionValue, computedDimension]);\n const handleExiting = (0,react.useMemo)(() => esm_createChainedFunction(elem => {\n elem.style[computedDimension] = null;\n }, onExiting), [computedDimension, onExiting]);\n return /*#__PURE__*/(0,jsx_runtime.jsx)(esm_TransitionWrapper, {\n ref: ref,\n addEndListener: transitionEndListener,\n ...props,\n "aria-expanded": props.role ? inProp : null,\n onEnter: handleEnter,\n onEntering: handleEntering,\n onEntered: handleEntered,\n onExit: handleExit,\n onExiting: handleExiting,\n childRef: children.ref,\n in: inProp,\n timeout: timeout,\n mountOnEnter: mountOnEnter,\n unmountOnExit: unmountOnExit,\n appear: appear,\n children: (state, innerProps) => /*#__PURE__*/react.cloneElement(children, {\n ...innerProps,\n className: classnames_default()(className, children.props.className, collapseStyles[state], computedDimension === \'width\' && \'collapse-horizontal\')\n })\n });\n});\n\n// @ts-ignore\n\n/* harmony default export */ const esm_Collapse = (Collapse);\n;// CONCATENATED MODULE: ./node_modules/react-bootstrap/esm/NavbarContext.js\n"use client";\n\n\n\n// TODO: check\n\nconst context = /*#__PURE__*/react.createContext(null);\ncontext.displayName = \'NavbarContext\';\n/* harmony default export */ const NavbarContext = (context);\n;// CONCATENATED MODULE: ./node_modules/react-bootstrap/esm/NavbarCollapse.js\n"use client";\n\n\n\n\n\n\n\nconst NavbarCollapse = /*#__PURE__*/react.forwardRef(({\n children,\n bsPrefix,\n ...props\n}, ref) => {\n bsPrefix = useBootstrapPrefix(bsPrefix, \'navbar-collapse\');\n const context = (0,react.useContext)(NavbarContext);\n return /*#__PURE__*/(0,jsx_runtime.jsx)(esm_Collapse, {\n in: !!(context && context.expanded),\n ...props,\n children: /*#__PURE__*/(0,jsx_runtime.jsx)("div", {\n ref: ref,\n className: bsPrefix,\n children: children\n })\n });\n});\nNavbarCollapse.displayName = \'NavbarCollapse\';\n/* harmony default export */ const esm_NavbarCollapse = (NavbarCollapse);\n;// CONCATENATED MODULE: ./node_modules/@restart/hooks/esm/useCommittedRef.js\n\n\n/**\n * Creates a `Ref` whose value is updated in an effect, ensuring the most recent\n * value is the one rendered with. Generally only required for Concurrent mode usage\n * where previous work in `render()` may be discarded before being used.\n *\n * This is safe to access in an event handler.\n *\n * @param value The `Ref` value\n */\nfunction useCommittedRef_useCommittedRef(value) {\n const ref = (0,react.useRef)(value);\n (0,react.useEffect)(() => {\n ref.current = value;\n }, [value]);\n return ref;\n}\n/* harmony default export */ const esm_useCommittedRef = (useCommittedRef_useCommittedRef);\n;// CONCATENATED MODULE: ./node_modules/@restart/hooks/esm/useEventCallback.js\n\n\nfunction useEventCallback(fn) {\n const ref = esm_useCommittedRef(fn);\n return (0,react.useCallback)(function (...args) {\n return ref.current && ref.current(...args);\n }, [ref]);\n}\n;// CONCATENATED MODULE: ./node_modules/react-bootstrap/esm/NavbarToggle.js\n"use client";\n\n\n\n\n\n\n\n\nconst NavbarToggle = /*#__PURE__*/react.forwardRef(({\n bsPrefix,\n className,\n children,\n label = \'Toggle navigation\',\n // Need to define the default "as" during prop destructuring to be compatible with styled-components github.com/react-bootstrap/react-bootstrap/issues/3595\n as: Component = \'button\',\n onClick,\n ...props\n}, ref) => {\n bsPrefix = useBootstrapPrefix(bsPrefix, \'navbar-toggler\');\n const {\n onToggle,\n expanded\n } = (0,react.useContext)(NavbarContext) || {};\n const handleClick = useEventCallback(e => {\n if (onClick) onClick(e);\n if (onToggle) onToggle();\n });\n if (Component === \'button\') {\n props.type = \'button\';\n }\n return /*#__PURE__*/(0,jsx_runtime.jsx)(Component, {\n ...props,\n ref: ref,\n onClick: handleClick,\n "aria-label": label,\n className: classnames_default()(className, bsPrefix, !expanded && \'collapsed\'),\n children: children || /*#__PURE__*/(0,jsx_runtime.jsx)("span", {\n className: `${bsPrefix}-icon`\n })\n });\n});\nNavbarToggle.displayName = \'NavbarToggle\';\n/* harmony default export */ const esm_NavbarToggle = (NavbarToggle);\n;// CONCATENATED MODULE: ./node_modules/@restart/hooks/esm/useIsomorphicEffect.js\n\nconst isReactNative = typeof __webpack_require__.g !== \'undefined\' &&\n// @ts-ignore\n__webpack_require__.g.navigator &&\n// @ts-ignore\n__webpack_require__.g.navigator.product === \'ReactNative\';\nconst isDOM = typeof document !== \'undefined\';\n\n/**\n * Is `useLayoutEffect` in a DOM or React Native environment, otherwise resolves to useEffect\n * Only useful to avoid the console warning.\n *\n * PREFER `useEffect` UNLESS YOU KNOW WHAT YOU ARE DOING.\n *\n * @category effects\n */\n/* harmony default export */ const useIsomorphicEffect = (isDOM || isReactNative ? react.useLayoutEffect : react.useEffect);\n;// CONCATENATED MODULE: ./node_modules/@restart/hooks/esm/useMediaQuery.js\n\n\nconst matchersByWindow = new WeakMap();\nconst getMatcher = (query, targetWindow) => {\n if (!query || !targetWindow) return undefined;\n const matchers = matchersByWindow.get(targetWindow) || new Map();\n matchersByWindow.set(targetWindow, matchers);\n let mql = matchers.get(query);\n if (!mql) {\n mql = targetWindow.matchMedia(query);\n mql.refCount = 0;\n matchers.set(mql.media, mql);\n }\n return mql;\n};\n/**\n * Match a media query and get updates as the match changes. The media string is\n * passed directly to `window.matchMedia` and run as a Layout Effect, so initial\n * matches are returned before the browser has a chance to paint.\n *\n * ```tsx\n * function Page() {\n * const isWide = useMediaQuery(\'min-width: 1000px\')\n *\n * return isWide ? "very wide" : \'not so wide\'\n * }\n * ```\n *\n * Media query lists are also reused globally, hook calls for the same query\n * will only create a matcher once under the hood.\n *\n * @param query A media query\n * @param targetWindow The window to match against, uses the globally available one as a default.\n */\nfunction useMediaQuery(query, targetWindow = typeof window === \'undefined\' ? undefined : window) {\n const mql = getMatcher(query, targetWindow);\n const [matches, setMatches] = (0,react.useState)(() => mql ? mql.matches : false);\n useIsomorphicEffect(() => {\n let mql = getMatcher(query, targetWindow);\n if (!mql) {\n return setMatches(false);\n }\n let matchers = matchersByWindow.get(targetWindow);\n const handleChange = () => {\n setMatches(mql.matches);\n };\n mql.refCount++;\n mql.addListener(handleChange);\n handleChange();\n return () => {\n mql.removeListener(handleChange);\n mql.refCount--;\n if (mql.refCount <= 0) {\n matchers == null ? void 0 : matchers.delete(mql.media);\n }\n mql = undefined;\n };\n }, [query]);\n return matches;\n}\n;// CONCATENATED MODULE: ./node_modules/@restart/hooks/esm/useBreakpoint.js\n\n\n/**\n * Create a responsive hook we a set of breakpoint names and widths.\n * You can use any valid css units as well as a numbers (for pixels).\n *\n * **NOTE:** The object key order is important! it\'s assumed to be in order from smallest to largest\n *\n * ```ts\n * const useBreakpoint = createBreakpointHook({\n * xs: 0,\n * sm: 576,\n * md: 768,\n * lg: 992,\n * xl: 1200,\n * })\n * ```\n *\n * **Watch out!** using string values will sometimes construct media queries using css `calc()` which\n * is NOT supported in media queries by all browsers at the moment. use numbers for\n * the widest range of browser support.\n *\n * @param breakpointValues A object hash of names to breakpoint dimensions\n */\nfunction createBreakpointHook(breakpointValues) {\n const names = Object.keys(breakpointValues);\n function and(query, next) {\n if (query === next) {\n return next;\n }\n return query ? `${query} and ${next}` : next;\n }\n function getNext(breakpoint) {\n return names[Math.min(names.indexOf(breakpoint) + 1, names.length - 1)];\n }\n function getMaxQuery(breakpoint) {\n const next = getNext(breakpoint);\n let value = breakpointValues[next];\n if (typeof value === \'number\') value = `${value - 0.2}px`;else value = `calc(${value} - 0.2px)`;\n return `(max-width: ${value})`;\n }\n function getMinQuery(breakpoint) {\n let value = breakpointValues[breakpoint];\n if (typeof value === \'number\') {\n value = `${value}px`;\n }\n return `(min-width: ${value})`;\n }\n\n /**\n * Match a set of breakpoints\n *\n * ```tsx\n * const MidSizeOnly = () => {\n * const isMid = useBreakpoint({ lg: \'down\', sm: \'up\' });\n *\n * if (isMid) return <div>On a Reasonable sized Screen!</div>\n * return null;\n * }\n * ```\n * @param breakpointMap An object map of breakpoints and directions, queries are constructed using "and" to join\n * breakpoints together\n * @param window Optionally specify the target window to match against (useful when rendering into iframes)\n */\n\n /**\n * Match a single breakpoint exactly, up, or down.\n *\n * ```tsx\n * const PhoneOnly = () => {\n * const isSmall = useBreakpoint(\'sm\', \'down\');\n *\n * if (isSmall) return <div>On a Small Screen!</div>\n * return null;\n * }\n * ```\n *\n * @param breakpoint The breakpoint key\n * @param direction A direction \'up\' for a max, \'down\' for min, true to match only the breakpoint\n * @param window Optionally specify the target window to match against (useful when rendering into iframes)\n */\n\n function useBreakpoint(breakpointOrMap, direction, window) {\n let breakpointMap;\n if (typeof breakpointOrMap === \'object\') {\n breakpointMap = breakpointOrMap;\n window = direction;\n direction = true;\n } else {\n direction = direction || true;\n breakpointMap = {\n [breakpointOrMap]: direction\n };\n }\n let query = (0,react.useMemo)(() => Object.entries(breakpointMap).reduce((query, [key, direction]) => {\n if (direction === \'up\' || direction === true) {\n query = and(query, getMinQuery(key));\n }\n if (direction === \'down\' || direction === true) {\n query = and(query, getMaxQuery(key));\n }\n return query;\n }, \'\'), [JSON.stringify(breakpointMap)]);\n return useMediaQuery(query, window);\n }\n return useBreakpoint;\n}\nconst useBreakpoint = createBreakpointHook({\n xs: 0,\n sm: 576,\n md: 768,\n lg: 992,\n xl: 1200,\n xxl: 1400\n});\n/* harmony default export */ const esm_useBreakpoint = (useBreakpoint);\n;// CONCATENATED MODULE: ./node_modules/dom-helpers/esm/activeElement.js\n\n/**\n * Returns the actively focused element safely.\n *\n * @param doc the document to check\n */\n\nfunction activeElement(doc) {\n if (doc === void 0) {\n doc = ownerDocument();\n }\n\n // Support: IE 9 only\n // IE9 throws an "Unspecified error" accessing document.activeElement from an <iframe>\n try {\n var active = doc.activeElement; // IE11 returns a seemingly empty object in some cases when accessing\n // document.activeElement from an <iframe>\n\n if (!active || !active.nodeName) return null;\n return active;\n } catch (e) {\n /* ie throws if no active element */\n return doc.body;\n }\n}\n;// CONCATENATED MODULE: ./node_modules/dom-helpers/esm/contains.js\n/* eslint-disable no-bitwise, no-cond-assign */\n\n/**\n * Checks if an element contains another given element.\n * \n * @param context the context element\n * @param node the element to check\n */\nfunction contains(context, node) {\n // HTML DOM and SVG DOM may have different support levels,\n // so we need to check on context instead of a document root element.\n if (context.contains) return context.contains(node);\n if (context.compareDocumentPosition) return context === node || !!(context.compareDocumentPosition(node) & 16);\n}\n;// CONCATENATED MODULE: ./node_modules/@restart/hooks/esm/useMounted.js\n\n\n/**\n * Track whether a component is current mounted. Generally less preferable than\n * properlly canceling effects so they don\'t run after a component is unmounted,\n * but helpful in cases where that isn\'t feasible, such as a `Promise` resolution.\n *\n * @returns a function that returns the current isMounted state of the component\n *\n * ```ts\n * const [data, setData] = useState(null)\n * const isMounted = useMounted()\n *\n * useEffect(() => {\n * fetchdata().then((newData) => {\n * if (isMounted()) {\n * setData(newData);\n * }\n * })\n * })\n * ```\n */\nfunction useMounted() {\n const mounted = (0,react.useRef)(true);\n const isMounted = (0,react.useRef)(() => mounted.current);\n (0,react.useEffect)(() => {\n mounted.current = true;\n return () => {\n mounted.current = false;\n };\n }, []);\n return isMounted.current;\n}\n;// CONCATENATED MODULE: ./node_modules/@restart/hooks/esm/useUpdatedRef.js\n\n\n/**\n * Returns a ref that is immediately updated with the new value\n *\n * @param value The Ref value\n * @category refs\n */\nfunction useUpdatedRef(value) {\n const valueRef = (0,react.useRef)(value);\n valueRef.current = value;\n return valueRef;\n}\n;// CONCATENATED MODULE: ./node_modules/@restart/hooks/esm/useWillUnmount.js\n\n\n\n/**\n * Attach a callback that fires when a component unmounts\n *\n * @param fn Handler to run when the component unmounts\n * @category effects\n */\nfunction useWillUnmount(fn) {\n const onUnmount = useUpdatedRef(fn);\n (0,react.useEffect)(() => () => onUnmount.current(), []);\n}\n;// CONCATENATED MODULE: ./node_modules/@restart/hooks/esm/usePrevious.js\n\n\n/**\n * Store the last of some value. Tracked via a `Ref` only updating it\n * after the component renders.\n *\n * Helpful if you need to compare a prop value to it\'s previous value during render.\n *\n * ```ts\n * function Component(props) {\n * const lastProps = usePrevious(props)\n *\n * if (lastProps.foo !== props.foo)\n * resetValueFromProps(props.foo)\n * }\n * ```\n *\n * @param value the value to track\n */\nfunction usePrevious(value) {\n const ref = (0,react.useRef)(null);\n (0,react.useEffect)(() => {\n ref.current = value;\n });\n return ref.current;\n}\n;// CONCATENATED MODULE: ./node_modules/@restart/ui/esm/DataKey.js\nconst ATTRIBUTE_PREFIX = `data-rr-ui-`;\nconst PROPERTY_PREFIX = `rrUi`;\nfunction dataAttr(property) {\n return `${ATTRIBUTE_PREFIX}${property}`;\n}\nfunction dataProp(property) {\n return `${PROPERTY_PREFIX}${property}`;\n}\n;// CONCATENATED MODULE: ./node_modules/@restart/ui/esm/getScrollbarWidth.js\n/**\n * Get the width of the vertical window scrollbar if it\'s visible\n */\nfunction getBodyScrollbarWidth(ownerDocument = document) {\n const window = ownerDocument.defaultView;\n return Math.abs(window.innerWidth - ownerDocument.documentElement.clientWidth);\n}\n;// CONCATENATED MODULE: ./node_modules/@restart/ui/esm/ModalManager.js\n\n\n\nconst OPEN_DATA_ATTRIBUTE = dataAttr(\'modal-open\');\n\n/**\n * Manages a stack of Modals as well as ensuring\n * body scrolling is is disabled and padding accounted for\n */\nclass ModalManager {\n constructor({\n ownerDocument,\n handleContainerOverflow = true,\n isRTL = false\n } = {}) {\n this.handleContainerOverflow = handleContainerOverflow;\n this.isRTL = isRTL;\n this.modals = [];\n this.ownerDocument = ownerDocument;\n }\n getScrollbarWidth() {\n return getBodyScrollbarWidth(this.ownerDocument);\n }\n getElement() {\n return (this.ownerDocument || document).body;\n }\n setModalAttributes(_modal) {\n // For overriding\n }\n removeModalAttributes(_modal) {\n // For overriding\n }\n setContainerStyle(containerState) {\n const style = {\n overflow: \'hidden\'\n };\n\n // we are only interested in the actual `style` here\n // because we will override it\n const paddingProp = this.isRTL ? \'paddingLeft\' : \'paddingRight\';\n const container = this.getElement();\n containerState.style = {\n overflow: container.style.overflow,\n [paddingProp]: container.style[paddingProp]\n };\n if (containerState.scrollBarWidth) {\n // use computed style, here to get the real padding\n // to add our scrollbar width\n style[paddingProp] = `${parseInt(css(container, paddingProp) || \'0\', 10) + containerState.scrollBarWidth}px`;\n }\n container.setAttribute(OPEN_DATA_ATTRIBUTE, \'\');\n css(container, style);\n }\n reset() {\n [...this.modals].forEach(m => this.remove(m));\n }\n removeContainerStyle(containerState) {\n const container = this.getElement();\n container.removeAttribute(OPEN_DATA_ATTRIBUTE);\n Object.assign(container.style, containerState.style);\n }\n add(modal) {\n let modalIdx = this.modals.indexOf(modal);\n if (modalIdx !== -1) {\n return modalIdx;\n }\n modalIdx = this.modals.length;\n this.modals.push(modal);\n this.setModalAttributes(modal);\n if (modalIdx !== 0) {\n return modalIdx;\n }\n this.state = {\n scrollBarWidth: this.getScrollbarWidth(),\n style: {}\n };\n if (this.handleContainerOverflow) {\n this.setContainerStyle(this.state);\n }\n return modalIdx;\n }\n remove(modal) {\n const modalIdx = this.modals.indexOf(modal);\n if (modalIdx === -1) {\n return;\n }\n this.modals.splice(modalIdx, 1);\n\n // if that was the last modal in a container,\n // clean up the container\n if (!this.modals.length && this.handleContainerOverflow) {\n this.removeContainerStyle(this.state);\n }\n this.removeModalAttributes(modal);\n }\n isTopModal(modal) {\n return !!this.modals.length && this.modals[this.modals.length - 1] === modal;\n }\n}\n/* harmony default export */ const esm_ModalManager = (ModalManager);\n;// CONCATENATED MODULE: ./node_modules/@restart/ui/esm/useWindow.js\n\n\nconst Context = /*#__PURE__*/(0,react.createContext)(canUseDOM ? window : undefined);\nconst WindowProvider = Context.Provider;\n\n/**\n * The document "window" placed in React context. Helpful for determining\n * SSR context, or when rendering into an iframe.\n *\n * @returns the current window\n */\nfunction useWindow() {\n return (0,react.useContext)(Context);\n}\n;// CONCATENATED MODULE: ./node_modules/@restart/ui/esm/useWaitForDOMRef.js\n\n\n\n\nconst resolveContainerRef = (ref, document) => {\n if (!canUseDOM) return null;\n if (ref == null) return (document || ownerDocument()).body;\n if (typeof ref === \'function\') ref = ref();\n if (ref && \'current\' in ref) ref = ref.current;\n if (ref && (\'nodeType\' in ref || ref.getBoundingClientRect)) return ref;\n return null;\n};\nfunction useWaitForDOMRef(ref, onResolved) {\n const window = useWindow();\n const [resolvedRef, setRef] = (0,react.useState)(() => resolveContainerRef(ref, window == null ? void 0 : window.document));\n if (!resolvedRef) {\n const earlyRef = resolveContainerRef(ref);\n if (earlyRef) setRef(earlyRef);\n }\n (0,react.useEffect)(() => {\n if (onResolved && resolvedRef) {\n onResolved(resolvedRef);\n }\n }, [onResolved, resolvedRef]);\n (0,react.useEffect)(() => {\n const nextRef = resolveContainerRef(ref);\n if (nextRef !== resolvedRef) {\n setRef(nextRef);\n }\n }, [ref, resolvedRef]);\n return resolvedRef;\n}\n;// CONCATENATED MODULE: ./node_modules/@restart/ui/esm/NoopTransition.js\n\n\n\nfunction NoopTransition({\n children,\n in: inProp,\n onExited,\n mountOnEnter,\n unmountOnExit\n}) {\n const ref = (0,react.useRef)(null);\n const hasEnteredRef = (0,react.useRef)(inProp);\n const handleExited = useEventCallback(onExited);\n (0,react.useEffect)(() => {\n if (inProp) hasEnteredRef.current = true;else {\n handleExited(ref.current);\n }\n }, [inProp, handleExited]);\n const combinedRef = esm_useMergedRefs(ref, children.ref);\n const child = /*#__PURE__*/(0,react.cloneElement)(children, {\n ref: combinedRef\n });\n if (inProp) return child;\n if (unmountOnExit) {\n return null;\n }\n if (!hasEnteredRef.current && mountOnEnter) {\n return null;\n }\n return child;\n}\n/* harmony default export */ const esm_NoopTransition = (NoopTransition);\n;// CONCATENATED MODULE: ./node_modules/@restart/ui/esm/ImperativeTransition.js\n\n\n\n\n\n\nfunction useTransition({\n in: inProp,\n onTransition\n}) {\n const ref = (0,react.useRef)(null);\n const isInitialRef = (0,react.useRef)(true);\n const handleTransition = useEventCallback(onTransition);\n useIsomorphicEffect(() => {\n if (!ref.current) {\n return undefined;\n }\n let stale = false;\n handleTransition({\n in: inProp,\n element: ref.current,\n initial: isInitialRef.current,\n isStale: () => stale\n });\n return () => {\n stale = true;\n };\n }, [inProp, handleTransition]);\n useIsomorphicEffect(() => {\n isInitialRef.current = false;\n // this is for strict mode\n return () => {\n isInitialRef.current = true;\n };\n }, []);\n return ref;\n}\n/**\n * Adapts an imperative transition function to a subset of the RTG `<Transition>` component API.\n *\n * ImperativeTransition does not support mounting options or `appear` at the moment, meaning\n * that it always acts like: `mountOnEnter={true} unmountOnExit={true} appear={true}`\n */\nfunction ImperativeTransition({\n children,\n in: inProp,\n onExited,\n onEntered,\n transition\n}) {\n const [exited, setExited] = (0,react.useState)(!inProp);\n\n // TODO: I think this needs to be in an effect\n if (inProp && exited) {\n setExited(false);\n }\n const ref = useTransition({\n in: !!inProp,\n onTransition: options => {\n const onFinish = () => {\n if (options.isStale()) return;\n if (options.in) {\n onEntered == null ? void 0 : onEntered(options.element, options.initial);\n } else {\n setExited(true);\n onExited == null ? void 0 : onExited(options.element);\n }\n };\n Promise.resolve(transition(options)).then(onFinish, error => {\n if (!options.in) setExited(true);\n throw error;\n });\n }\n });\n const combinedRef = esm_useMergedRefs(ref, children.ref);\n return exited && !inProp ? null : /*#__PURE__*/(0,react.cloneElement)(children, {\n ref: combinedRef\n });\n}\nfunction renderTransition(Component, runTransition, props) {\n if (Component) {\n return /*#__PURE__*/(0,jsx_runtime.jsx)(Component, Object.assign({}, props));\n }\n if (runTransition) {\n return /*#__PURE__*/(0,jsx_runtime.jsx)(ImperativeTransition, Object.assign({}, props, {\n transition: runTransition\n }));\n }\n return /*#__PURE__*/(0,jsx_runtime.jsx)(esm_NoopTransition, Object.assign({}, props));\n}\n;// CONCATENATED MODULE: ./node_modules/@restart/ui/esm/utils.js\n/* eslint-disable import/prefer-default-export */\nfunction isEscKey(e) {\n return e.code === \'Escape\' || e.keyCode === 27;\n}\n;// CONCATENATED MODULE: ./node_modules/@restart/ui/esm/Modal.js\nconst Modal_excluded = ["show", "role", "className", "style", "children", "backdrop", "keyboard", "onBackdropClick", "onEscapeKeyDown", "transition", "runTransition", "backdropTransition", "runBackdropTransition", "autoFocus", "enforceFocus", "restoreFocus", "restoreFocusOptions", "renderDialog", "renderBackdrop", "manager", "container", "onShow", "onHide", "onExit", "onExited", "onExiting", "onEnter", "onEntering", "onEntered"];\nfunction Modal_objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n/* eslint-disable @typescript-eslint/no-use-before-define, react/prop-types */\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nlet manager;\nfunction getManager(window) {\n if (!manager) manager = new esm_ModalManager({\n ownerDocument: window == null ? void 0 : window.document\n });\n return manager;\n}\nfunction useModalManager(provided) {\n const window = useWindow();\n const modalManager = provided || getManager(window);\n const modal = (0,react.useRef)({\n dialog: null,\n backdrop: null\n });\n return Object.assign(modal.current, {\n add: () => modalManager.add(modal.current),\n remove: () => modalManager.remove(modal.current),\n isTopModal: () => modalManager.isTopModal(modal.current),\n setDialogRef: (0,react.useCallback)(ref => {\n modal.current.dialog = ref;\n }, []),\n setBackdropRef: (0,react.useCallback)(ref => {\n modal.current.backdrop = ref;\n }, [])\n });\n}\nconst Modal = /*#__PURE__*/(0,react.forwardRef)((_ref, ref) => {\n let {\n show = false,\n role = \'dialog\',\n className,\n style,\n children,\n backdrop = true,\n keyboard = true,\n onBackdropClick,\n onEscapeKeyDown,\n transition,\n runTransition,\n backdropTransition,\n runBackdropTransition,\n autoFocus = true,\n enforceFocus = true,\n restoreFocus = true,\n restoreFocusOptions,\n renderDialog,\n renderBackdrop = props => /*#__PURE__*/(0,jsx_runtime.jsx)("div", Object.assign({}, props)),\n manager: providedManager,\n container: containerRef,\n onShow,\n onHide = () => {},\n onExit,\n onExited,\n onExiting,\n onEnter,\n onEntering,\n onEntered\n } = _ref,\n rest = Modal_objectWithoutPropertiesLoose(_ref, Modal_excluded);\n const ownerWindow = useWindow();\n const container = useWaitForDOMRef(containerRef);\n const modal = useModalManager(providedManager);\n const isMounted = useMounted();\n const prevShow = usePrevious(show);\n const [exited, setExited] = (0,react.useState)(!show);\n const lastFocusRef = (0,react.useRef)(null);\n (0,react.useImperativeHandle)(ref, () => modal, [modal]);\n if (canUseDOM && !prevShow && show) {\n lastFocusRef.current = activeElement(ownerWindow == null ? void 0 : ownerWindow.document);\n }\n\n // TODO: I think this needs to be in an effect\n if (show && exited) {\n setExited(false);\n }\n const handleShow = useEventCallback(() => {\n modal.add();\n removeKeydownListenerRef.current = esm_listen(document, \'keydown\', handleDocumentKeyDown);\n removeFocusListenerRef.current = esm_listen(document, \'focus\',\n // the timeout is necessary b/c this will run before the new modal is mounted\n // and so steals focus from it\n () => setTimeout(handleEnforceFocus), true);\n if (onShow) {\n onShow();\n }\n\n // autofocus after onShow to not trigger a focus event for previous\n // modals before this one is shown.\n if (autoFocus) {\n var _modal$dialog$ownerDo, _modal$dialog;\n const currentActiveElement = activeElement((_modal$dialog$ownerDo = (_modal$dialog = modal.dialog) == null ? void 0 : _modal$dialog.ownerDocument) != null ? _modal$dialog$ownerDo : ownerWindow == null ? void 0 : ownerWindow.document);\n if (modal.dialog && currentActiveElement && !contains(modal.dialog, currentActiveElement)) {\n lastFocusRef.current = currentActiveElement;\n modal.dialog.focus();\n }\n }\n });\n const handleHide = useEventCallback(() => {\n modal.remove();\n removeKeydownListenerRef.current == null ? void 0 : removeKeydownListenerRef.current();\n removeFocusListenerRef.current == null ? void 0 : removeFocusListenerRef.current();\n if (restoreFocus) {\n var _lastFocusRef$current;\n // Support: <=IE11 doesn\'t support `focus()` on svg elements (RB: #917)\n (_lastFocusRef$current = lastFocusRef.current) == null ? void 0 : _lastFocusRef$current.focus == null ? void 0 : _lastFocusRef$current.focus(restoreFocusOptions);\n lastFocusRef.current = null;\n }\n });\n\n // TODO: try and combine these effects: https://github.com/react-bootstrap/react-overlays/pull/794#discussion_r409954120\n\n // Show logic when:\n // - show is `true` _and_ `container` has resolved\n (0,react.useEffect)(() => {\n if (!show || !container) return;\n handleShow();\n }, [show, container, /* should never change: */handleShow]);\n\n // Hide cleanup logic when:\n // - `exited` switches to true\n // - component unmounts;\n (0,react.useEffect)(() => {\n if (!exited) return;\n handleHide();\n }, [exited, handleHide]);\n useWillUnmount(() => {\n handleHide();\n });\n\n // --------------------------------\n\n const handleEnforceFocus = useEventCallback(() => {\n if (!enforceFocus || !isMounted() || !modal.isTopModal()) {\n return;\n }\n const currentActiveElement = activeElement(ownerWindow == null ? void 0 : ownerWindow.document);\n if (modal.dialog && currentActiveElement && !contains(modal.dialog, currentActiveElement)) {\n modal.dialog.focus();\n }\n });\n const handleBackdropClick = useEventCallback(e => {\n if (e.target !== e.currentTarget) {\n return;\n }\n onBackdropClick == null ? void 0 : onBackdropClick(e);\n if (backdrop === true) {\n onHide();\n }\n });\n const handleDocumentKeyDown = useEventCallback(e => {\n if (keyboard && isEscKey(e) && modal.isTopModal()) {\n onEscapeKeyDown == null ? void 0 : onEscapeKeyDown(e);\n if (!e.defaultPrevented) {\n onHide();\n }\n }\n });\n const removeFocusListenerRef = (0,react.useRef)();\n const removeKeydownListenerRef = (0,react.useRef)();\n const handleHidden = (...args) => {\n setExited(true);\n onExited == null ? void 0 : onExited(...args);\n };\n if (!container) {\n return null;\n }\n const dialogProps = Object.assign({\n role,\n ref: modal.setDialogRef,\n // apparently only works on the dialog role element\n \'aria-modal\': role === \'dialog\' ? true : undefined\n }, rest, {\n style,\n className,\n tabIndex: -1\n });\n let dialog = renderDialog ? renderDialog(dialogProps) : /*#__PURE__*/(0,jsx_runtime.jsx)("div", Object.assign({}, dialogProps, {\n children: /*#__PURE__*/react.cloneElement(children, {\n role: \'document\'\n })\n }));\n dialog = renderTransition(transition, runTransition, {\n unmountOnExit: true,\n mountOnEnter: true,\n appear: true,\n in: !!show,\n onExit,\n onExiting,\n onExited: handleHidden,\n onEnter,\n onEntering,\n onEntered,\n children: dialog\n });\n let backdropElement = null;\n if (backdrop) {\n backdropElement = renderBackdrop({\n ref: modal.setBackdropRef,\n onClick: handleBackdropClick\n });\n backdropElement = renderTransition(backdropTransition, runBackdropTransition, {\n in: !!show,\n appear: true,\n mountOnEnter: true,\n unmountOnExit: true,\n children: backdropElement\n });\n }\n return /*#__PURE__*/(0,jsx_runtime.jsx)(jsx_runtime.Fragment, {\n children: /*#__PURE__*/react_dom.createPortal( /*#__PURE__*/(0,jsx_runtime.jsxs)(jsx_runtime.Fragment, {\n children: [backdropElement, dialog]\n }), container)\n });\n});\nModal.displayName = \'Modal\';\n/* harmony default export */ const esm_Modal = (Object.assign(Modal, {\n Manager: esm_ModalManager\n}));\n;// CONCATENATED MODULE: ./node_modules/react-bootstrap/esm/Fade.js\n\n\n\n\n\n\n\n\nconst fadeStyles = {\n [ENTERING]: \'show\',\n [ENTERED]: \'show\'\n};\nconst Fade = /*#__PURE__*/react.forwardRef(({\n className,\n children,\n transitionClasses = {},\n onEnter,\n ...rest\n}, ref) => {\n const props = {\n in: false,\n timeout: 300,\n mountOnEnter: false,\n unmountOnExit: false,\n appear: false,\n ...rest\n };\n const handleEnter = (0,react.useCallback)((node, isAppearing) => {\n triggerBrowserReflow(node);\n onEnter == null ? void 0 : onEnter(node, isAppearing);\n }, [onEnter]);\n return /*#__PURE__*/(0,jsx_runtime.jsx)(esm_TransitionWrapper, {\n ref: ref,\n addEndListener: transitionEndListener,\n ...props,\n onEnter: handleEnter,\n childRef: children.ref,\n children: (status, innerProps) => /*#__PURE__*/react.cloneElement(children, {\n ...innerProps,\n className: classnames_default()(\'fade\', className, children.props.className, fadeStyles[status], transitionClasses[status])\n })\n });\n});\nFade.displayName = \'Fade\';\n/* harmony default export */ const esm_Fade = (Fade);\n;// CONCATENATED MODULE: ./node_modules/react-bootstrap/esm/OffcanvasBody.js\n"use client";\n\n\n\n\n\nconst OffcanvasBody = /*#__PURE__*/react.forwardRef(({\n className,\n bsPrefix,\n as: Component = \'div\',\n ...props\n}, ref) => {\n bsPrefix = useBootstrapPrefix(bsPrefix, \'offcanvas-body\');\n return /*#__PURE__*/(0,jsx_runtime.jsx)(Component, {\n ref: ref,\n className: classnames_default()(className, bsPrefix),\n ...props\n });\n});\nOffcanvasBody.displayName = \'OffcanvasBody\';\n/* harmony default export */ const esm_OffcanvasBody = (OffcanvasBody);\n;// CONCATENATED MODULE: ./node_modules/react-bootstrap/esm/OffcanvasToggling.js\n"use client";\n\n\n\n\n\n\n\n\nconst transitionStyles = {\n [ENTERING]: \'show\',\n [ENTERED]: \'show\'\n};\nconst OffcanvasToggling = /*#__PURE__*/react.forwardRef(({\n bsPrefix,\n className,\n children,\n in: inProp = false,\n mountOnEnter = false,\n unmountOnExit = false,\n appear = false,\n ...props\n}, ref) => {\n bsPrefix = useBootstrapPrefix(bsPrefix, \'offcanvas\');\n return /*#__PURE__*/(0,jsx_runtime.jsx)(esm_TransitionWrapper, {\n ref: ref,\n addEndListener: transitionEndListener,\n in: inProp,\n mountOnEnter: mountOnEnter,\n unmountOnExit: unmountOnExit,\n appear: appear,\n ...props,\n childRef: children.ref,\n children: (status, innerProps) => /*#__PURE__*/react.cloneElement(children, {\n ...innerProps,\n className: classnames_default()(className, children.props.className, (status === ENTERING || status === EXITING) && `${bsPrefix}-toggling`, transitionStyles[status])\n })\n });\n});\nOffcanvasToggling.displayName = \'OffcanvasToggling\';\n/* harmony default export */ const esm_OffcanvasToggling = (OffcanvasToggling);\n;// CONCATENATED MODULE: ./node_modules/react-bootstrap/esm/ModalContext.js\n"use client";\n\n\nconst ModalContext = /*#__PURE__*/react.createContext({\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n onHide() {}\n});\n/* harmony default export */ const esm_ModalContext = (ModalContext);\n// EXTERNAL MODULE: ./node_modules/prop-types/index.js\nvar prop_types = __webpack_require__(5697);\nvar prop_types_default = /*#__PURE__*/__webpack_require__.n(prop_types);\n;// CONCATENATED MODULE: ./node_modules/react-bootstrap/esm/CloseButton.js\n\n\n\n\nconst propTypes = {\n /** An accessible label indicating the relevant information about the Close Button. */\n \'aria-label\': (prop_types_default()).string,\n /** A callback fired after the Close Button is clicked. */\n onClick: (prop_types_default()).func,\n /**\n * Render different color variant for the button.\n *\n * Omitting this will render the default dark color.\n */\n variant: prop_types_default().oneOf([\'white\'])\n};\nconst CloseButton = /*#__PURE__*/react.forwardRef(({\n className,\n variant,\n \'aria-label\': ariaLabel = \'Close\',\n ...props\n}, ref) => /*#__PURE__*/(0,jsx_runtime.jsx)("button", {\n ref: ref,\n type: "button",\n className: classnames_default()(\'btn-close\', variant && `btn-close-${variant}`, className),\n "aria-label": ariaLabel,\n ...props\n}));\nCloseButton.displayName = \'CloseButton\';\nCloseButton.propTypes = propTypes;\n/* harmony default export */ const esm_CloseButton = (CloseButton);\n;// CONCATENATED MODULE: ./node_modules/react-bootstrap/esm/AbstractModalHeader.js\n"use client";\n\n\n\n\n\n\n\n\nconst AbstractModalHeader = /*#__PURE__*/react.forwardRef(({\n closeLabel = \'Close\',\n closeVariant,\n closeButton = false,\n onHide,\n children,\n ...props\n}, ref) => {\n const context = (0,react.useContext)(esm_ModalContext);\n const handleClick = useEventCallback(() => {\n context == null ? void 0 : context.onHide();\n onHide == null ? void 0 : onHide();\n });\n return /*#__PURE__*/(0,jsx_runtime.jsxs)("div", {\n ref: ref,\n ...props,\n children: [children, closeButton && /*#__PURE__*/(0,jsx_runtime.jsx)(esm_CloseButton, {\n "aria-label": closeLabel,\n variant: closeVariant,\n onClick: handleClick\n })]\n });\n});\n/* harmony default export */ const esm_AbstractModalHeader = (AbstractModalHeader);\n;// CONCATENATED MODULE: ./node_modules/react-bootstrap/esm/OffcanvasHeader.js\n"use client";\n\n\n\n\n\n\nconst OffcanvasHeader = /*#__PURE__*/react.forwardRef(({\n bsPrefix,\n className,\n closeLabel = \'Close\',\n closeButton = false,\n ...props\n}, ref) => {\n bsPrefix = useBootstrapPrefix(bsPrefix, \'offcanvas-header\');\n return /*#__PURE__*/(0,jsx_runtime.jsx)(esm_AbstractModalHeader, {\n ref: ref,\n ...props,\n className: classnames_default()(className, bsPrefix),\n closeLabel: closeLabel,\n closeButton: closeButton\n });\n});\nOffcanvasHeader.displayName = \'OffcanvasHeader\';\n/* harmony default export */ const esm_OffcanvasHeader = (OffcanvasHeader);\n;// CONCATENATED MODULE: ./node_modules/react-bootstrap/esm/divWithClassName.js\n\n\n\n/* harmony default export */ const divWithClassName = (className => /*#__PURE__*/react.forwardRef((p, ref) => /*#__PURE__*/(0,jsx_runtime.jsx)("div", {\n ...p,\n ref: ref,\n className: classnames_default()(p.className, className)\n})));\n;// CONCATENATED MODULE: ./node_modules/react-bootstrap/esm/OffcanvasTitle.js\n"use client";\n\n\n\n\n\n\nconst DivStyledAsH5 = divWithClassName(\'h5\');\nconst OffcanvasTitle = /*#__PURE__*/react.forwardRef(({\n className,\n bsPrefix,\n as: Component = DivStyledAsH5,\n ...props\n}, ref) => {\n bsPrefix = useBootstrapPrefix(bsPrefix, \'offcanvas-title\');\n return /*#__PURE__*/(0,jsx_runtime.jsx)(Component, {\n ref: ref,\n className: classnames_default()(className, bsPrefix),\n ...props\n });\n});\nOffcanvasTitle.displayName = \'OffcanvasTitle\';\n/* harmony default export */ const esm_OffcanvasTitle = (OffcanvasTitle);\n;// CONCATENATED MODULE: ./node_modules/dom-helpers/esm/hasClass.js\n/**\n * Checks if a given element has a CSS class.\n * \n * @param element the element\n * @param className the CSS class name\n */\nfunction hasClass(element, className) {\n if (element.classList) return !!className && element.classList.contains(className);\n return (" " + (element.className.baseVal || element.className) + " ").indexOf(" " + className + " ") !== -1;\n}\n;// CONCATENATED MODULE: ./node_modules/dom-helpers/esm/addClass.js\n\n/**\n * Adds a CSS class to a given element.\n * \n * @param element the element\n * @param className the CSS class name\n */\n\nfunction addClass(element, className) {\n if (element.classList) element.classList.add(className);else if (!hasClass(element, className)) if (typeof element.className === \'string\') element.className = element.className + " " + className;else element.setAttribute(\'class\', (element.className && element.className.baseVal || \'\') + " " + className);\n}\n;// CONCATENATED MODULE: ./node_modules/dom-helpers/esm/querySelectorAll.js\nvar toArray = Function.prototype.bind.call(Function.prototype.call, [].slice);\n/**\n * Runs `querySelectorAll` on a given element.\n * \n * @param element the element\n * @param selector the selector\n */\n\nfunction qsa(element, selector) {\n return toArray(element.querySelectorAll(selector));\n}\n;// CONCATENATED MODULE: ./node_modules/dom-helpers/esm/removeClass.js\nfunction replaceClassName(origClass, classToRemove) {\n return origClass.replace(new RegExp("(^|\\\\s)" + classToRemove + "(?:\\\\s|$)", \'g\'), \'$1\').replace(/\\s+/g, \' \').replace(/^\\s*|\\s*$/g, \'\');\n}\n/**\n * Removes a CSS class from a given element.\n * \n * @param element the element\n * @param className the CSS class name\n */\n\n\nfunction removeClass(element, className) {\n if (element.classList) {\n element.classList.remove(className);\n } else if (typeof element.className === \'string\') {\n element.className = replaceClassName(element.className, className);\n } else {\n element.setAttribute(\'class\', replaceClassName(element.className && element.className.baseVal || \'\', className));\n }\n}\n;// CONCATENATED MODULE: ./node_modules/react-bootstrap/esm/BootstrapModalManager.js\n\n\n\n\n\nconst Selector = {\n FIXED_CONTENT: \'.fixed-top, .fixed-bottom, .is-fixed, .sticky-top\',\n STICKY_CONTENT: \'.sticky-top\',\n NAVBAR_TOGGLER: \'.navbar-toggler\'\n};\nclass BootstrapModalManager extends esm_ModalManager {\n adjustAndStore(prop, element, adjust) {\n const actual = element.style[prop];\n // TODO: DOMStringMap and CSSStyleDeclaration aren\'t strictly compatible\n // @ts-ignore\n element.dataset[prop] = actual;\n css(element, {\n [prop]: `${parseFloat(css(element, prop)) + adjust}px`\n });\n }\n restore(prop, element) {\n const value = element.dataset[prop];\n if (value !== undefined) {\n delete element.dataset[prop];\n css(element, {\n [prop]: value\n });\n }\n }\n setContainerStyle(containerState) {\n super.setContainerStyle(containerState);\n const container = this.getElement();\n addClass(container, \'modal-open\');\n if (!containerState.scrollBarWidth) return;\n const paddingProp = this.isRTL ? \'paddingLeft\' : \'paddingRight\';\n const marginProp = this.isRTL ? \'marginLeft\' : \'marginRight\';\n qsa(container, Selector.FIXED_CONTENT).forEach(el => this.adjustAndStore(paddingProp, el, containerState.scrollBarWidth));\n qsa(container, Selector.STICKY_CONTENT).forEach(el => this.adjustAndStore(marginProp, el, -containerState.scrollBarWidth));\n qsa(container, Selector.NAVBAR_TOGGLER).forEach(el => this.adjustAndStore(marginProp, el, containerState.scrollBarWidth));\n }\n removeContainerStyle(containerState) {\n super.removeContainerStyle(containerState);\n const container = this.getElement();\n removeClass(container, \'modal-open\');\n const paddingProp = this.isRTL ? \'paddingLeft\' : \'paddingRight\';\n const marginProp = this.isRTL ? \'marginLeft\' : \'marginRight\';\n qsa(container, Selector.FIXED_CONTENT).forEach(el => this.restore(paddingProp, el));\n qsa(container, Selector.STICKY_CONTENT).forEach(el => this.restore(marginProp, el));\n qsa(container, Selector.NAVBAR_TOGGLER).forEach(el => this.restore(marginProp, el));\n }\n}\nlet sharedManager;\nfunction getSharedManager(options) {\n if (!sharedManager) sharedManager = new BootstrapModalManager(options);\n return sharedManager;\n}\n/* harmony default export */ const esm_BootstrapModalManager = (BootstrapModalManager);\n;// CONCATENATED MODULE: ./node_modules/react-bootstrap/esm/Offcanvas.js\n"use client";\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nfunction DialogTransition(props) {\n return /*#__PURE__*/(0,jsx_runtime.jsx)(esm_OffcanvasToggling, {\n ...props\n });\n}\nfunction BackdropTransition(props) {\n return /*#__PURE__*/(0,jsx_runtime.jsx)(esm_Fade, {\n ...props\n });\n}\nconst Offcanvas = /*#__PURE__*/react.forwardRef(({\n bsPrefix,\n className,\n children,\n \'aria-labelledby\': ariaLabelledby,\n placement = \'start\',\n responsive,\n /* BaseModal props */\n\n show = false,\n backdrop = true,\n keyboard = true,\n scroll = false,\n onEscapeKeyDown,\n onShow,\n onHide,\n container,\n autoFocus = true,\n enforceFocus = true,\n restoreFocus = true,\n restoreFocusOptions,\n onEntered,\n onExit,\n onExiting,\n onEnter,\n onEntering,\n onExited,\n backdropClassName,\n manager: propsManager,\n renderStaticNode = false,\n ...props\n}, ref) => {\n const modalManager = (0,react.useRef)();\n bsPrefix = useBootstrapPrefix(bsPrefix, \'offcanvas\');\n const {\n onToggle\n } = (0,react.useContext)(NavbarContext) || {};\n const [showOffcanvas, setShowOffcanvas] = (0,react.useState)(false);\n const hideResponsiveOffcanvas = esm_useBreakpoint(responsive || \'xs\', \'up\');\n (0,react.useEffect)(() => {\n // Handles the case where screen is resized while the responsive\n // offcanvas is shown. If `responsive` not provided, just use `show`.\n setShowOffcanvas(responsive ? show && !hideResponsiveOffcanvas : show);\n }, [show, responsive, hideResponsiveOffcanvas]);\n const handleHide = useEventCallback(() => {\n onToggle == null ? void 0 : onToggle();\n onHide == null ? void 0 : onHide();\n });\n const modalContext = (0,react.useMemo)(() => ({\n onHide: handleHide\n }), [handleHide]);\n function getModalManager() {\n if (propsManager) return propsManager;\n if (scroll) {\n // Have to use a different modal manager since the shared\n // one handles overflow.\n if (!modalManager.current) modalManager.current = new esm_BootstrapModalManager({\n handleContainerOverflow: false\n });\n return modalManager.current;\n }\n return getSharedManager();\n }\n const handleEnter = (node, ...args) => {\n if (node) node.style.visibility = \'visible\';\n onEnter == null ? void 0 : onEnter(node, ...args);\n };\n const handleExited = (node, ...args) => {\n if (node) node.style.visibility = \'\';\n onExited == null ? void 0 : onExited(...args);\n };\n const renderBackdrop = (0,react.useCallback)(backdropProps => /*#__PURE__*/(0,jsx_runtime.jsx)("div", {\n ...backdropProps,\n className: classnames_default()(`${bsPrefix}-backdrop`, backdropClassName)\n }), [backdropClassName, bsPrefix]);\n const renderDialog = dialogProps => /*#__PURE__*/(0,jsx_runtime.jsx)("div", {\n ...dialogProps,\n ...props,\n className: classnames_default()(className, responsive ? `${bsPrefix}-${responsive}` : bsPrefix, `${bsPrefix}-${placement}`),\n "aria-labelledby": ariaLabelledby,\n children: children\n });\n return /*#__PURE__*/(0,jsx_runtime.jsxs)(jsx_runtime.Fragment, {\n children: [!showOffcanvas && (responsive || renderStaticNode) && renderDialog({}), /*#__PURE__*/(0,jsx_runtime.jsx)(esm_ModalContext.Provider, {\n value: modalContext,\n children: /*#__PURE__*/(0,jsx_runtime.jsx)(esm_Modal, {\n show: showOffcanvas,\n ref: ref,\n backdrop: backdrop,\n container: container,\n keyboard: keyboard,\n autoFocus: autoFocus,\n enforceFocus: enforceFocus && !scroll,\n restoreFocus: restoreFocus,\n restoreFocusOptions: restoreFocusOptions,\n onEscapeKeyDown: onEscapeKeyDown,\n onShow: onShow,\n onHide: handleHide,\n onEnter: handleEnter,\n onEntering: onEntering,\n onEntered: onEntered,\n onExit: onExit,\n onExiting: onExiting,\n onExited: handleExited,\n manager: getModalManager(),\n transition: DialogTransition,\n backdropTransition: BackdropTransition,\n renderBackdrop: renderBackdrop,\n renderDialog: renderDialog\n })\n })]\n });\n});\nOffcanvas.displayName = \'Offcanvas\';\n/* harmony default export */ const esm_Offcanvas = (Object.assign(Offcanvas, {\n Body: esm_OffcanvasBody,\n Header: esm_OffcanvasHeader,\n Title: esm_OffcanvasTitle\n}));\n;// CONCATENATED MODULE: ./node_modules/react-bootstrap/esm/NavbarOffcanvas.js\n"use client";\n\n\n\n\n\n\nconst NavbarOffcanvas = /*#__PURE__*/react.forwardRef((props, ref) => {\n const context = (0,react.useContext)(NavbarContext);\n return /*#__PURE__*/(0,jsx_runtime.jsx)(esm_Offcanvas, {\n ref: ref,\n show: !!(context != null && context.expanded),\n ...props,\n renderStaticNode: true\n });\n});\nNavbarOffcanvas.displayName = \'NavbarOffcanvas\';\n/* harmony default export */ const esm_NavbarOffcanvas = (NavbarOffcanvas);\n;// CONCATENATED MODULE: ./node_modules/react-bootstrap/esm/NavbarText.js\n"use client";\n\n\n\n\n\nconst NavbarText = /*#__PURE__*/react.forwardRef(({\n className,\n bsPrefix,\n as: Component = \'span\',\n ...props\n}, ref) => {\n bsPrefix = useBootstrapPrefix(bsPrefix, \'navbar-text\');\n return /*#__PURE__*/(0,jsx_runtime.jsx)(Component, {\n ref: ref,\n className: classnames_default()(className, bsPrefix),\n ...props\n });\n});\nNavbarText.displayName = \'NavbarText\';\n/* harmony default export */ const esm_NavbarText = (NavbarText);\n;// CONCATENATED MODULE: ./node_modules/react-bootstrap/esm/Navbar.js\n"use client";\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst Navbar = /*#__PURE__*/react.forwardRef((props, ref) => {\n const {\n bsPrefix: initialBsPrefix,\n expand = true,\n variant = \'light\',\n bg,\n fixed,\n sticky,\n className,\n // Need to define the default "as" during prop destructuring to be compatible with styled-components github.com/react-bootstrap/react-bootstrap/issues/3595\n as: Component = \'nav\',\n expanded,\n onToggle,\n onSelect,\n collapseOnSelect = false,\n ...controlledProps\n } = useUncontrolled(props, {\n expanded: \'onToggle\'\n });\n const bsPrefix = useBootstrapPrefix(initialBsPrefix, \'navbar\');\n const handleCollapse = (0,react.useCallback)((...args) => {\n onSelect == null ? void 0 : onSelect(...args);\n if (collapseOnSelect && expanded) {\n onToggle == null ? void 0 : onToggle(false);\n }\n }, [onSelect, collapseOnSelect, expanded, onToggle]);\n\n // will result in some false positives but that seems better\n // than false negatives. strict `undefined` check allows explicit\n // "nulling" of the role if the user really doesn\'t want one\n if (controlledProps.role === undefined && Component !== \'nav\') {\n controlledProps.role = \'navigation\';\n }\n let expandClass = `${bsPrefix}-expand`;\n if (typeof expand === \'string\') expandClass = `${expandClass}-${expand}`;\n const navbarContext = (0,react.useMemo)(() => ({\n onToggle: () => onToggle == null ? void 0 : onToggle(!expanded),\n bsPrefix,\n expanded: !!expanded,\n expand\n }), [bsPrefix, expanded, expand, onToggle]);\n return /*#__PURE__*/(0,jsx_runtime.jsx)(NavbarContext.Provider, {\n value: navbarContext,\n children: /*#__PURE__*/(0,jsx_runtime.jsx)(esm_SelectableContext.Provider, {\n value: handleCollapse,\n children: /*#__PURE__*/(0,jsx_runtime.jsx)(Component, {\n ref: ref,\n ...controlledProps,\n className: classnames_default()(className, bsPrefix, expand && expandClass, variant && `${bsPrefix}-${variant}`, bg && `bg-${bg}`, sticky && `sticky-${sticky}`, fixed && `fixed-${fixed}`)\n })\n })\n });\n});\nNavbar.displayName = \'Navbar\';\n/* harmony default export */ const esm_Navbar = (Object.assign(Navbar, {\n Brand: esm_NavbarBrand,\n Collapse: esm_NavbarCollapse,\n Offcanvas: esm_NavbarOffcanvas,\n Text: esm_NavbarText,\n Toggle: esm_NavbarToggle\n}));\n;// CONCATENATED MODULE: ./node_modules/react-bootstrap/esm/Container.js\n"use client";\n\n\n\n\n\nconst Container = /*#__PURE__*/react.forwardRef(({\n bsPrefix,\n fluid = false,\n // Need to define the default "as" during prop destructuring to be compatible with styled-components github.com/react-bootstrap/react-bootstrap/issues/3595\n as: Component = \'div\',\n className,\n ...props\n}, ref) => {\n const prefix = useBootstrapPrefix(bsPrefix, \'container\');\n const suffix = typeof fluid === \'string\' ? `-${fluid}` : \'-fluid\';\n return /*#__PURE__*/(0,jsx_runtime.jsx)(Component, {\n ref: ref,\n ...props,\n className: classnames_default()(className, fluid ? `${prefix}${suffix}` : prefix)\n });\n});\nContainer.displayName = \'Container\';\n/* harmony default export */ const esm_Container = (Container);\n// EXTERNAL MODULE: ./node_modules/prop-types-extra/lib/all.js\nvar lib_all = __webpack_require__(4391);\n;// CONCATENATED MODULE: ./node_modules/@restart/hooks/esm/useForceUpdate.js\n\n\n/**\n * Returns a function that triggers a component update. the hook equivalent to\n * `this.forceUpdate()` in a class component. In most cases using a state value directly\n * is preferable but may be required in some advanced usages of refs for interop or\n * when direct DOM manipulation is required.\n *\n * ```ts\n * const forceUpdate = useForceUpdate();\n *\n * const updateOnClick = useCallback(() => {\n * forceUpdate()\n * }, [forceUpdate])\n *\n * return <button type="button" onClick={updateOnClick}>Hi there</button>\n * ```\n */\nfunction useForceUpdate() {\n // The toggling state value is designed to defeat React optimizations for skipping\n // updates when they are strictly equal to the last state value\n const [, dispatch] = (0,react.useReducer)(state => !state, false);\n return dispatch;\n}\n;// CONCATENATED MODULE: ./node_modules/@restart/ui/esm/NavContext.js\n\nconst NavContext = /*#__PURE__*/react.createContext(null);\nNavContext.displayName = \'NavContext\';\n/* harmony default export */ const esm_NavContext = (NavContext);\n;// CONCATENATED MODULE: ./node_modules/@restart/ui/esm/TabContext.js\n\nconst TabContext = /*#__PURE__*/react.createContext(null);\n/* harmony default export */ const esm_TabContext = (TabContext);\n;// CONCATENATED MODULE: ./node_modules/@restart/ui/esm/Button.js\nconst Button_excluded = ["as", "disabled"];\nfunction Button_objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n\nfunction isTrivialHref(href) {\n return !href || href.trim() === \'#\';\n}\nfunction useButtonProps({\n tagName,\n disabled,\n href,\n target,\n rel,\n role,\n onClick,\n tabIndex = 0,\n type\n}) {\n if (!tagName) {\n if (href != null || target != null || rel != null) {\n tagName = \'a\';\n } else {\n tagName = \'button\';\n }\n }\n const meta = {\n tagName\n };\n if (tagName === \'button\') {\n return [{\n type: type || \'button\',\n disabled\n }, meta];\n }\n const handleClick = event => {\n if (disabled || tagName === \'a\' && isTrivialHref(href)) {\n event.preventDefault();\n }\n if (disabled) {\n event.stopPropagation();\n return;\n }\n onClick == null ? void 0 : onClick(event);\n };\n const handleKeyDown = event => {\n if (event.key === \' \') {\n event.preventDefault();\n handleClick(event);\n }\n };\n if (tagName === \'a\') {\n // Ensure there\'s a href so Enter can trigger anchor button.\n href || (href = \'#\');\n if (disabled) {\n href = undefined;\n }\n }\n return [{\n role: role != null ? role : \'button\',\n // explicitly undefined so that it overrides the props disabled in a spread\n // e.g. <Tag {...props} {...hookProps} />\n disabled: undefined,\n tabIndex: disabled ? undefined : tabIndex,\n href,\n target: tagName === \'a\' ? target : undefined,\n \'aria-disabled\': !disabled ? undefined : disabled,\n rel: tagName === \'a\' ? rel : undefined,\n onClick: handleClick,\n onKeyDown: handleKeyDown\n }, meta];\n}\nconst Button = /*#__PURE__*/react.forwardRef((_ref, ref) => {\n let {\n as: asProp,\n disabled\n } = _ref,\n props = Button_objectWithoutPropertiesLoose(_ref, Button_excluded);\n const [buttonProps, {\n tagName: Component\n }] = useButtonProps(Object.assign({\n tagName: asProp,\n disabled\n }, props));\n return /*#__PURE__*/(0,jsx_runtime.jsx)(Component, Object.assign({}, props, buttonProps, {\n ref: ref\n }));\n});\nButton.displayName = \'Button\';\n/* harmony default export */ const esm_Button = (Button);\n;// CONCATENATED MODULE: ./node_modules/@restart/ui/esm/NavItem.js\nconst NavItem_excluded = ["as", "active", "eventKey"];\nfunction NavItem_objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n\n\n\n\n\n\n\n\nfunction useNavItem({\n key,\n onClick,\n active,\n id,\n role,\n disabled\n}) {\n const parentOnSelect = (0,react.useContext)(esm_SelectableContext);\n const navContext = (0,react.useContext)(esm_NavContext);\n const tabContext = (0,react.useContext)(esm_TabContext);\n let isActive = active;\n const props = {\n role\n };\n if (navContext) {\n if (!role && navContext.role === \'tablist\') props.role = \'tab\';\n const contextControllerId = navContext.getControllerId(key != null ? key : null);\n const contextControlledId = navContext.getControlledId(key != null ? key : null);\n\n // @ts-ignore\n props[dataAttr(\'event-key\')] = key;\n props.id = contextControllerId || id;\n isActive = active == null && key != null ? navContext.activeKey === key : active;\n\n /**\n * Simplified scenario for `mountOnEnter`.\n *\n * While it would make sense to keep \'aria-controls\' for tabs that have been mounted at least\n * once, it would also complicate the code quite a bit, for very little gain.\n * The following implementation is probably good enough.\n *\n * @see https://github.com/react-restart/ui/pull/40#issuecomment-1009971561\n */\n if (isActive || !(tabContext != null && tabContext.unmountOnExit) && !(tabContext != null && tabContext.mountOnEnter)) props[\'aria-controls\'] = contextControlledId;\n }\n if (props.role === \'tab\') {\n props[\'aria-selected\'] = isActive;\n if (!isActive) {\n props.tabIndex = -1;\n }\n if (disabled) {\n props.tabIndex = -1;\n props[\'aria-disabled\'] = true;\n }\n }\n props.onClick = useEventCallback(e => {\n if (disabled) return;\n onClick == null ? void 0 : onClick(e);\n if (key == null) {\n return;\n }\n if (parentOnSelect && !e.isPropagationStopped()) {\n parentOnSelect(key, e);\n }\n });\n return [props, {\n isActive\n }];\n}\nconst NavItem = /*#__PURE__*/react.forwardRef((_ref, ref) => {\n let {\n as: Component = esm_Button,\n active,\n eventKey\n } = _ref,\n options = NavItem_objectWithoutPropertiesLoose(_ref, NavItem_excluded);\n const [props, meta] = useNavItem(Object.assign({\n key: makeEventKey(eventKey, options.href),\n active\n }, options));\n\n // @ts-ignore\n props[dataAttr(\'active\')] = meta.isActive;\n return /*#__PURE__*/(0,jsx_runtime.jsx)(Component, Object.assign({}, options, props, {\n ref: ref\n }));\n});\nNavItem.displayName = \'NavItem\';\n/* harmony default export */ const esm_NavItem = (NavItem);\n;// CONCATENATED MODULE: ./node_modules/@restart/ui/esm/Nav.js\nconst Nav_excluded = ["as", "onSelect", "activeKey", "role", "onKeyDown"];\nfunction Nav_objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n\n\n\n\n\n\n\n\n\n\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nconst Nav_noop = () => {};\nconst EVENT_KEY_ATTR = dataAttr(\'event-key\');\nconst Nav = /*#__PURE__*/react.forwardRef((_ref, ref) => {\n let {\n // Need to define the default "as" during prop destructuring to be compatible with styled-components github.com/react-bootstrap/react-bootstrap/issues/3595\n as: Component = \'div\',\n onSelect,\n activeKey,\n role,\n onKeyDown\n } = _ref,\n props = Nav_objectWithoutPropertiesLoose(_ref, Nav_excluded);\n // A ref and forceUpdate for refocus, b/c we only want to trigger when needed\n // and don\'t want to reset the set in the effect\n const forceUpdate = useForceUpdate();\n const needsRefocusRef = (0,react.useRef)(false);\n const parentOnSelect = (0,react.useContext)(esm_SelectableContext);\n const tabContext = (0,react.useContext)(esm_TabContext);\n let getControlledId, getControllerId;\n if (tabContext) {\n role = role || \'tablist\';\n activeKey = tabContext.activeKey;\n // TODO: do we need to duplicate these?\n getControlledId = tabContext.getControlledId;\n getControllerId = tabContext.getControllerId;\n }\n const listNode = (0,react.useRef)(null);\n const getNextActiveTab = offset => {\n const currentListNode = listNode.current;\n if (!currentListNode) return null;\n const items = qsa(currentListNode, `[${EVENT_KEY_ATTR}]:not([aria-disabled=true])`);\n const activeChild = currentListNode.querySelector(\'[aria-selected=true]\');\n if (!activeChild || activeChild !== document.activeElement) return null;\n const index = items.indexOf(activeChild);\n if (index === -1) return null;\n let nextIndex = index + offset;\n if (nextIndex >= items.length) nextIndex = 0;\n if (nextIndex < 0) nextIndex = items.length - 1;\n return items[nextIndex];\n };\n const handleSelect = (key, event) => {\n if (key == null) return;\n onSelect == null ? void 0 : onSelect(key, event);\n parentOnSelect == null ? void 0 : parentOnSelect(key, event);\n };\n const handleKeyDown = event => {\n onKeyDown == null ? void 0 : onKeyDown(event);\n if (!tabContext) {\n return;\n }\n let nextActiveChild;\n switch (event.key) {\n case \'ArrowLeft\':\n case \'ArrowUp\':\n nextActiveChild = getNextActiveTab(-1);\n break;\n case \'ArrowRight\':\n case \'ArrowDown\':\n nextActiveChild = getNextActiveTab(1);\n break;\n default:\n return;\n }\n if (!nextActiveChild) return;\n event.preventDefault();\n handleSelect(nextActiveChild.dataset[dataProp(\'EventKey\')] || null, event);\n needsRefocusRef.current = true;\n forceUpdate();\n };\n (0,react.useEffect)(() => {\n if (listNode.current && needsRefocusRef.current) {\n const activeChild = listNode.current.querySelector(`[${EVENT_KEY_ATTR}][aria-selected=true]`);\n activeChild == null ? void 0 : activeChild.focus();\n }\n needsRefocusRef.current = false;\n });\n const mergedRef = esm_useMergedRefs(ref, listNode);\n return /*#__PURE__*/(0,jsx_runtime.jsx)(esm_SelectableContext.Provider, {\n value: handleSelect,\n children: /*#__PURE__*/(0,jsx_runtime.jsx)(esm_NavContext.Provider, {\n value: {\n role,\n // used by NavLink to determine it\'s role\n activeKey: makeEventKey(activeKey),\n getControlledId: getControlledId || Nav_noop,\n getControllerId: getControllerId || Nav_noop\n },\n children: /*#__PURE__*/(0,jsx_runtime.jsx)(Component, Object.assign({}, props, {\n onKeyDown: handleKeyDown,\n ref: mergedRef,\n role: role\n }))\n })\n });\n});\nNav.displayName = \'Nav\';\n/* harmony default export */ const esm_Nav = (Object.assign(Nav, {\n Item: esm_NavItem\n}));\n;// CONCATENATED MODULE: ./node_modules/react-bootstrap/esm/CardHeaderContext.js\n"use client";\n\n\nconst CardHeaderContext_context = /*#__PURE__*/react.createContext(null);\nCardHeaderContext_context.displayName = \'CardHeaderContext\';\n/* harmony default export */ const CardHeaderContext = (CardHeaderContext_context);\n;// CONCATENATED MODULE: ./node_modules/react-bootstrap/esm/NavItem.js\n"use client";\n\n\n\n\n\nconst NavItem_NavItem = /*#__PURE__*/react.forwardRef(({\n className,\n bsPrefix,\n as: Component = \'div\',\n ...props\n}, ref) => {\n bsPrefix = useBootstrapPrefix(bsPrefix, \'nav-item\');\n return /*#__PURE__*/(0,jsx_runtime.jsx)(Component, {\n ref: ref,\n className: classnames_default()(className, bsPrefix),\n ...props\n });\n});\nNavItem_NavItem.displayName = \'NavItem\';\n/* harmony default export */ const react_bootstrap_esm_NavItem = (NavItem_NavItem);\n;// CONCATENATED MODULE: ./node_modules/@restart/hooks/esm/useCallbackRef.js\n\n\n/**\n * A convenience hook around `useState` designed to be paired with\n * the component [callback ref](https://reactjs.org/docs/refs-and-the-dom.html#callback-refs) api.\n * Callback refs are useful over `useRef()` when you need to respond to the ref being set\n * instead of lazily accessing it in an effect.\n *\n * ```ts\n * const [element, attachRef] = useCallbackRef<HTMLDivElement>()\n *\n * useEffect(() => {\n * if (!element) return\n *\n * const calendar = new FullCalendar.Calendar(element)\n *\n * return () => {\n * calendar.destroy()\n * }\n * }, [element])\n *\n * return <div ref={attachRef} />\n * ```\n *\n * @category refs\n */\nfunction useCallbackRef() {\n return (0,react.useState)(null);\n}\n;// CONCATENATED MODULE: ./node_modules/@restart/hooks/esm/useEventListener.js\n\n\n/**\n * Attaches an event handler outside directly to specified DOM element\n * bypassing the react synthetic event system.\n *\n * @param element The target to listen for events on\n * @param event The DOM event name\n * @param handler An event handler\n * @param capture Whether or not to listen during the capture event phase\n */\nfunction useEventListener_useEventListener(eventTarget, event, listener, capture = false) {\n const handler = useEventCallback(listener);\n (0,react.useEffect)(() => {\n const target = typeof eventTarget === \'function\' ? eventTarget() : eventTarget;\n target.addEventListener(event, handler, capture);\n return () => target.removeEventListener(event, handler, capture);\n }, [eventTarget]);\n}\n;// CONCATENATED MODULE: ./node_modules/@restart/hooks/esm/useGlobalListener.js\n\n\n/**\n * Attaches an event handler outside directly to the `document`,\n * bypassing the react synthetic event system.\n *\n * ```ts\n * useGlobalListener(\'keydown\', (event) => {\n * console.log(event.key)\n * })\n * ```\n *\n * @param event The DOM event name\n * @param handler An event handler\n * @param capture Whether or not to listen during the capture event phase\n */\nfunction useGlobalListener(event, handler, capture = false) {\n const documentTarget = useCallback(() => document, []);\n return useEventListener(documentTarget, event, handler, capture);\n}\n;// CONCATENATED MODULE: ./node_modules/@restart/hooks/esm/useInterval.js\n\n\n\n/**\n * Creates a `setInterval` that is properly cleaned up when a component unmounted\n *\n * ```tsx\n * function Timer() {\n * const [timer, setTimer] = useState(0)\n * useInterval(() => setTimer(i => i + 1), 1000)\n *\n * return <span>{timer} seconds past</span>\n * }\n * ```\n *\n * @param fn an function run on each interval\n * @param ms The milliseconds duration of the interval\n */\n\n/**\n * Creates a pausable `setInterval` that is properly cleaned up when a component unmounted\n *\n * ```tsx\n * const [paused, setPaused] = useState(false)\n * const [timer, setTimer] = useState(0)\n *\n * useInterval(() => setTimer(i => i + 1), 1000, paused)\n *\n * return (\n * <span>\n * {timer} seconds past\n *\n * <button onClick={() => setPaused(p => !p)}>{paused ? \'Play\' : \'Pause\' }</button>\n * </span>\n * )\n * ```\n *\n * @param fn an function run on each interval\n * @param ms The milliseconds duration of the interval\n * @param paused Whether or not the interval is currently running\n */\n\n/**\n * Creates a pausable `setInterval` that _fires_ immediately and is\n * properly cleaned up when a component unmounted\n *\n * ```tsx\n * const [timer, setTimer] = useState(-1)\n * useInterval(() => setTimer(i => i + 1), 1000, false, true)\n *\n * // will update to 0 on the first effect\n * return <span>{timer} seconds past</span>\n * ```\n *\n * @param fn an function run on each interval\n * @param ms The milliseconds duration of the interval\n * @param paused Whether or not the interval is currently running\n * @param runImmediately Whether to run the function immediately on mount or unpause\n * rather than waiting for the first interval to elapse\n *\n\n */\n\nfunction useInterval(fn, ms, paused = false, runImmediately = false) {\n let handle;\n const fnRef = useCommittedRef(fn);\n // this ref is necessary b/c useEffect will sometimes miss a paused toggle\n // orphaning a setTimeout chain in the aether, so relying on it\'s refresh logic is not reliable.\n const pausedRef = useCommittedRef(paused);\n const tick = () => {\n if (pausedRef.current) return;\n fnRef.current();\n schedule(); // eslint-disable-line no-use-before-define\n };\n\n const schedule = () => {\n clearTimeout(handle);\n handle = setTimeout(tick, ms);\n };\n useEffect(() => {\n if (runImmediately) {\n tick();\n } else {\n schedule();\n }\n return () => clearTimeout(handle);\n }, [paused, runImmediately]);\n}\n/* harmony default export */ const esm_useInterval = ((/* unused pure expression or super */ null && (useInterval)));\n;// CONCATENATED MODULE: ./node_modules/@restart/hooks/esm/useRafInterval.js\n\n\nfunction useRafInterval(fn, ms, paused = false) {\n let handle;\n let start = new Date().getTime();\n const fnRef = useCommittedRef(fn);\n // this ref is necessary b/c useEffect will sometimes miss a paused toggle\n // orphaning a setTimeout chain in the aether, so relying on it\'s refresh logic is not reliable.\n const pausedRef = useCommittedRef(paused);\n function loop() {\n const current = new Date().getTime();\n const delta = current - start;\n if (pausedRef.current) return;\n if (delta >= ms && fnRef.current) {\n fnRef.current();\n start = new Date().getTime();\n }\n cancelAnimationFrame(handle);\n handle = requestAnimationFrame(loop);\n }\n useEffect(() => {\n handle = requestAnimationFrame(loop);\n return () => cancelAnimationFrame(handle);\n }, []);\n}\n/* harmony default export */ const esm_useRafInterval = ((/* unused pure expression or super */ null && (useRafInterval)));\n;// CONCATENATED MODULE: ./node_modules/@restart/hooks/esm/useMergeState.js\n\n\n/**\n * Updates state, partial updates are merged into existing state values\n */\n\n/**\n * Mimics a React class component\'s state model, of having a single unified\n * `state` object and an updater that merges updates into the existing state, as\n * opposed to replacing it.\n *\n * ```js\n * const [state, setState] = useMergeState({ name: \'Betsy\', age: 24 })\n *\n * setState({ name: \'Johan\' }) // { name: \'Johan\', age: 24 }\n *\n * setState(state => ({ age: state.age + 10 })) // { name: \'Johan\', age: 34 }\n * ```\n *\n * @param initialState The initial state object\n */\nfunction useMergeState_useMergeState(initialState) {\n const [state, setState] = useState(initialState);\n const updater = useCallback(update => {\n if (update === null) return;\n if (typeof update === \'function\') {\n setState(state => {\n const nextState = update(state);\n return nextState == null ? state : Object.assign({}, state, nextState);\n });\n } else {\n setState(state => Object.assign({}, state, update));\n }\n }, [setState]);\n return [state, updater];\n}\n;// CONCATENATED MODULE: ./node_modules/@restart/hooks/esm/useMergeStateFromProps.js\n\nfunction useMergeStateFromProps(props, gDSFP, initialState) {\n const [state, setState] = useMergeState(initialState);\n const nextState = gDSFP(props, state);\n if (nextState !== null) setState(nextState);\n return [state, setState];\n}\n;// CONCATENATED MODULE: ./node_modules/@restart/hooks/esm/useImage.js\n\n/**\n * Fetch and load an image for programatic use such as in a `<canvas>` element.\n *\n * @param imageOrUrl The `HtmlImageElement` or image url to load\n * @param crossOrigin The `crossorigin` attribute to set\n *\n * ```ts\n * const { image, error } = useImage(\'/static/kittens.png\')\n * const ref = useRef<HTMLCanvasElement>()\n *\n * useEffect(() => {\n * const ctx = ref.current.getContext(\'2d\')\n *\n * if (image) {\n * ctx.drawImage(image, 0, 0)\n * }\n * }, [ref, image])\n *\n * return (\n * <>\n * {error && "there was a problem loading the image"}\n * <canvas ref={ref} />\n * </>\n * ```\n */\nfunction useImage(imageOrUrl, crossOrigin) {\n const [state, setState] = useState({\n image: null,\n error: null\n });\n useEffect(() => {\n if (!imageOrUrl) return undefined;\n let image;\n if (typeof imageOrUrl === \'string\') {\n image = new Image();\n if (crossOrigin) image.crossOrigin = crossOrigin;\n image.src = imageOrUrl;\n } else {\n image = imageOrUrl;\n if (image.complete && image.naturalHeight > 0) {\n setState({\n image,\n error: null\n });\n return;\n }\n }\n function onLoad() {\n setState({\n image,\n error: null\n });\n }\n function onError(error) {\n setState({\n image,\n error\n });\n }\n image.addEventListener(\'load\', onLoad);\n image.addEventListener(\'error\', onError);\n return () => {\n image.removeEventListener(\'load\', onLoad);\n image.removeEventListener(\'error\', onError);\n };\n }, [imageOrUrl, crossOrigin]);\n return state;\n}\n;// CONCATENATED MODULE: ./node_modules/@restart/hooks/esm/useResizeObserver.js\n\n\nconst targetMap = new WeakMap();\nlet resizeObserver;\nfunction getResizeObserver() {\n // eslint-disable-next-line no-return-assign\n return resizeObserver = resizeObserver || new window.ResizeObserver(entries => {\n entries.forEach(entry => {\n const handler = targetMap.get(entry.target);\n if (handler) handler(entry.contentRect);\n });\n });\n}\n\n/**\n * Efficiently observe size changes on an element. Depends on the `ResizeObserver` api,\n * and polyfills are needed in older browsers.\n *\n * ```ts\n * const [ref, attachRef] = useCallbackRef(null);\n *\n * const rect = useResizeObserver(ref);\n *\n * return (\n * <div ref={attachRef}>\n * {JSON.stringify(rect)}\n * </div>\n * )\n * ```\n *\n * @param element The DOM element to observe\n */\nfunction useResizeObserver(element) {\n const [rect, setRect] = useState(null);\n useEffect(() => {\n if (!element) return;\n getResizeObserver().observe(element);\n setRect(element.getBoundingClientRect());\n targetMap.set(element, rect => {\n setRect(rect);\n });\n return () => {\n targetMap.delete(element);\n };\n }, [element]);\n return rect;\n}\n;// CONCATENATED MODULE: ./node_modules/@restart/hooks/esm/index.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n;// CONCATENATED MODULE: ./node_modules/@restart/ui/esm/Anchor.js\nconst Anchor_excluded = ["onKeyDown"];\nfunction Anchor_objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n/* eslint-disable jsx-a11y/no-static-element-interactions */\n/* eslint-disable jsx-a11y/anchor-has-content */\n\n\n\n\n\nfunction Anchor_isTrivialHref(href) {\n return !href || href.trim() === \'#\';\n}\n/**\n * An generic `<a>` component that covers a few A11y cases, ensuring that\n * cases where the `href` is missing or trivial like "#" are treated like buttons.\n */\nconst Anchor = /*#__PURE__*/react.forwardRef((_ref, ref) => {\n let {\n onKeyDown\n } = _ref,\n props = Anchor_objectWithoutPropertiesLoose(_ref, Anchor_excluded);\n const [buttonProps] = useButtonProps(Object.assign({\n tagName: \'a\'\n }, props));\n const handleKeyDown = useEventCallback(e => {\n buttonProps.onKeyDown(e);\n onKeyDown == null ? void 0 : onKeyDown(e);\n });\n if (Anchor_isTrivialHref(props.href) || props.role === \'button\') {\n return /*#__PURE__*/(0,jsx_runtime.jsx)("a", Object.assign({\n ref: ref\n }, props, buttonProps, {\n onKeyDown: handleKeyDown\n }));\n }\n return /*#__PURE__*/(0,jsx_runtime.jsx)("a", Object.assign({\n ref: ref\n }, props, {\n onKeyDown: onKeyDown\n }));\n});\nAnchor.displayName = \'Anchor\';\n/* harmony default export */ const esm_Anchor = (Anchor);\n;// CONCATENATED MODULE: ./node_modules/react-bootstrap/esm/NavLink.js\n"use client";\n\n\n\n\n\n\n\n\nconst NavLink_NavLink = /*#__PURE__*/react.forwardRef(({\n bsPrefix,\n className,\n as: Component = esm_Anchor,\n active,\n eventKey,\n disabled = false,\n ...props\n}, ref) => {\n bsPrefix = useBootstrapPrefix(bsPrefix, \'nav-link\');\n const [navItemProps, meta] = useNavItem({\n key: makeEventKey(eventKey, props.href),\n active,\n disabled,\n ...props\n });\n return /*#__PURE__*/(0,jsx_runtime.jsx)(Component, {\n ...props,\n ...navItemProps,\n ref: ref,\n disabled: disabled,\n className: classnames_default()(className, bsPrefix, disabled && \'disabled\', meta.isActive && \'active\')\n });\n});\nNavLink_NavLink.displayName = \'NavLink\';\n/* harmony default export */ const esm_NavLink = (NavLink_NavLink);\n;// CONCATENATED MODULE: ./node_modules/react-bootstrap/esm/Nav.js\n"use client";\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst Nav_Nav = /*#__PURE__*/react.forwardRef((uncontrolledProps, ref) => {\n const {\n as = \'div\',\n bsPrefix: initialBsPrefix,\n variant,\n fill = false,\n justify = false,\n navbar,\n navbarScroll,\n className,\n activeKey,\n ...props\n } = useUncontrolled(uncontrolledProps, {\n activeKey: \'onSelect\'\n });\n const bsPrefix = useBootstrapPrefix(initialBsPrefix, \'nav\');\n let navbarBsPrefix;\n let cardHeaderBsPrefix;\n let isNavbar = false;\n const navbarContext = (0,react.useContext)(NavbarContext);\n const cardHeaderContext = (0,react.useContext)(CardHeaderContext);\n if (navbarContext) {\n navbarBsPrefix = navbarContext.bsPrefix;\n isNavbar = navbar == null ? true : navbar;\n } else if (cardHeaderContext) {\n ({\n cardHeaderBsPrefix\n } = cardHeaderContext);\n }\n return /*#__PURE__*/(0,jsx_runtime.jsx)(esm_Nav, {\n as: as,\n ref: ref,\n activeKey: activeKey,\n className: classnames_default()(className, {\n [bsPrefix]: !isNavbar,\n [`${navbarBsPrefix}-nav`]: isNavbar,\n [`${navbarBsPrefix}-nav-scroll`]: isNavbar && navbarScroll,\n [`${cardHeaderBsPrefix}-${variant}`]: !!cardHeaderBsPrefix,\n [`${bsPrefix}-${variant}`]: !!variant,\n [`${bsPrefix}-fill`]: fill,\n [`${bsPrefix}-justified`]: justify\n }),\n ...props\n });\n});\nNav_Nav.displayName = \'Nav\';\n/* harmony default export */ const react_bootstrap_esm_Nav = (Object.assign(Nav_Nav, {\n Item: react_bootstrap_esm_NavItem,\n Link: esm_NavLink\n}));\n;// CONCATENATED MODULE: ./node_modules/@restart/ui/node_modules/uncontrollable/lib/esm/index.js\nfunction esm_objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\nfunction esm_toPropertyKey(arg) { var key = esm_toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }\nfunction esm_toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }\n\nfunction esm_defaultKey(key) {\n return \'default\' + key.charAt(0).toUpperCase() + key.substr(1);\n}\nfunction esm_useUncontrolledProp(propValue, defaultValue, handler) {\n const wasPropRef = (0,react.useRef)(propValue !== undefined);\n const [stateValue, setState] = (0,react.useState)(defaultValue);\n const isProp = propValue !== undefined;\n const wasProp = wasPropRef.current;\n wasPropRef.current = isProp;\n\n /**\n * If a prop switches from controlled to Uncontrolled\n * reset its value to the defaultValue\n */\n if (!isProp && wasProp && stateValue !== defaultValue) {\n setState(defaultValue);\n }\n return [isProp ? propValue : stateValue, (0,react.useCallback)((...args) => {\n const [value, ...rest] = args;\n let returnValue = handler == null ? void 0 : handler(value, ...rest);\n setState(value);\n return returnValue;\n }, [handler])];\n}\n\nfunction esm_useUncontrolled(props, config) {\n return Object.keys(config).reduce((result, fieldName) => {\n const _ref = result,\n _defaultKey = esm_defaultKey(fieldName),\n {\n [_defaultKey]: defaultValue,\n [fieldName]: propsValue\n } = _ref,\n rest = esm_objectWithoutPropertiesLoose(_ref, [_defaultKey, fieldName].map(esm_toPropertyKey));\n const handlerName = config[fieldName];\n const [value, handler] = esm_useUncontrolledProp(propsValue, defaultValue, props[handlerName]);\n return Object.assign({}, rest, {\n [fieldName]: value,\n [handlerName]: handler\n });\n }, props);\n}\n;// CONCATENATED MODULE: ./node_modules/@restart/ui/esm/DropdownContext.js\n\nconst DropdownContext = /*#__PURE__*/react.createContext(null);\n/* harmony default export */ const esm_DropdownContext = (DropdownContext);\n;// CONCATENATED MODULE: ./node_modules/dequal/dist/index.mjs\nvar has = Object.prototype.hasOwnProperty;\n\nfunction find(iter, tar, key) {\n\tfor (key of iter.keys()) {\n\t\tif (dequal(key, tar)) return key;\n\t}\n}\n\nfunction dequal(foo, bar) {\n\tvar ctor, len, tmp;\n\tif (foo === bar) return true;\n\n\tif (foo && bar && (ctor=foo.constructor) === bar.constructor) {\n\t\tif (ctor === Date) return foo.getTime() === bar.getTime();\n\t\tif (ctor === RegExp) return foo.toString() === bar.toString();\n\n\t\tif (ctor === Array) {\n\t\t\tif ((len=foo.length) === bar.length) {\n\t\t\t\twhile (len-- && dequal(foo[len], bar[len]));\n\t\t\t}\n\t\t\treturn len === -1;\n\t\t}\n\n\t\tif (ctor === Set) {\n\t\t\tif (foo.size !== bar.size) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tfor (len of foo) {\n\t\t\t\ttmp = len;\n\t\t\t\tif (tmp && typeof tmp === \'object\') {\n\t\t\t\t\ttmp = find(bar, tmp);\n\t\t\t\t\tif (!tmp) return false;\n\t\t\t\t}\n\t\t\t\tif (!bar.has(tmp)) return false;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\n\t\tif (ctor === Map) {\n\t\t\tif (foo.size !== bar.size) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tfor (len of foo) {\n\t\t\t\ttmp = len[0];\n\t\t\t\tif (tmp && typeof tmp === \'object\') {\n\t\t\t\t\ttmp = find(bar, tmp);\n\t\t\t\t\tif (!tmp) return false;\n\t\t\t\t}\n\t\t\t\tif (!dequal(len[1], bar.get(tmp))) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\n\t\tif (ctor === ArrayBuffer) {\n\t\t\tfoo = new Uint8Array(foo);\n\t\t\tbar = new Uint8Array(bar);\n\t\t} else if (ctor === DataView) {\n\t\t\tif ((len=foo.byteLength) === bar.byteLength) {\n\t\t\t\twhile (len-- && foo.getInt8(len) === bar.getInt8(len));\n\t\t\t}\n\t\t\treturn len === -1;\n\t\t}\n\n\t\tif (ArrayBuffer.isView(foo)) {\n\t\t\tif ((len=foo.byteLength) === bar.byteLength) {\n\t\t\t\twhile (len-- && foo[len] === bar[len]);\n\t\t\t}\n\t\t\treturn len === -1;\n\t\t}\n\n\t\tif (!ctor || typeof foo === \'object\') {\n\t\t\tlen = 0;\n\t\t\tfor (ctor in foo) {\n\t\t\t\tif (has.call(foo, ctor) && ++len && !has.call(bar, ctor)) return false;\n\t\t\t\tif (!(ctor in bar) || !dequal(foo[ctor], bar[ctor])) return false;\n\t\t\t}\n\t\t\treturn Object.keys(bar).length === len;\n\t\t}\n\t}\n\n\treturn foo !== foo && bar !== bar;\n}\n\n;// CONCATENATED MODULE: ./node_modules/@restart/hooks/esm/useSafeState.js\n\n\n\n/**\n * `useSafeState` takes the return value of a `useState` hook and wraps the\n * setter to prevent updates onces the component has unmounted. Can used\n * with `useMergeState` and `useStateAsync` as well\n *\n * @param state The return value of a useStateHook\n *\n * ```ts\n * const [show, setShow] = useSafeState(useState(true));\n * ```\n */\n\nfunction useSafeState(state) {\n const isMounted = useMounted();\n return [state[0], (0,react.useCallback)(nextState => {\n if (!isMounted()) return;\n return state[1](nextState);\n }, [isMounted, state[1]])];\n}\n/* harmony default export */ const esm_useSafeState = (useSafeState);\n;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/utils/getBasePlacement.js\n\nfunction getBasePlacement(placement) {\n return placement.split(\'-\')[0];\n}\n;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/dom-utils/getWindow.js\nfunction getWindow(node) {\n if (node == null) {\n return window;\n }\n\n if (node.toString() !== \'[object Window]\') {\n var ownerDocument = node.ownerDocument;\n return ownerDocument ? ownerDocument.defaultView || window : window;\n }\n\n return node;\n}\n;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js\n\n\nfunction isElement(node) {\n var OwnElement = getWindow(node).Element;\n return node instanceof OwnElement || node instanceof Element;\n}\n\nfunction isHTMLElement(node) {\n var OwnElement = getWindow(node).HTMLElement;\n return node instanceof OwnElement || node instanceof HTMLElement;\n}\n\nfunction isShadowRoot(node) {\n // IE 11 has no ShadowRoot\n if (typeof ShadowRoot === \'undefined\') {\n return false;\n }\n\n var OwnElement = getWindow(node).ShadowRoot;\n return node instanceof OwnElement || node instanceof ShadowRoot;\n}\n\n\n;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/utils/math.js\nvar math_max = Math.max;\nvar math_min = Math.min;\nvar round = Math.round;\n;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/utils/userAgent.js\nfunction getUAString() {\n var uaData = navigator.userAgentData;\n\n if (uaData != null && uaData.brands && Array.isArray(uaData.brands)) {\n return uaData.brands.map(function (item) {\n return item.brand + "/" + item.version;\n }).join(\' \');\n }\n\n return navigator.userAgent;\n}\n;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/dom-utils/isLayoutViewport.js\n\nfunction isLayoutViewport() {\n return !/^((?!chrome|android).)*safari/i.test(getUAString());\n}\n;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js\n\n\n\n\nfunction getBoundingClientRect(element, includeScale, isFixedStrategy) {\n if (includeScale === void 0) {\n includeScale = false;\n }\n\n if (isFixedStrategy === void 0) {\n isFixedStrategy = false;\n }\n\n var clientRect = element.getBoundingClientRect();\n var scaleX = 1;\n var scaleY = 1;\n\n if (includeScale && isHTMLElement(element)) {\n scaleX = element.offsetWidth > 0 ? round(clientRect.width) / element.offsetWidth || 1 : 1;\n scaleY = element.offsetHeight > 0 ? round(clientRect.height) / element.offsetHeight || 1 : 1;\n }\n\n var _ref = isElement(element) ? getWindow(element) : window,\n visualViewport = _ref.visualViewport;\n\n var addVisualOffsets = !isLayoutViewport() && isFixedStrategy;\n var x = (clientRect.left + (addVisualOffsets && visualViewport ? visualViewport.offsetLeft : 0)) / scaleX;\n var y = (clientRect.top + (addVisualOffsets && visualViewport ? visualViewport.offsetTop : 0)) / scaleY;\n var width = clientRect.width / scaleX;\n var height = clientRect.height / scaleY;\n return {\n width: width,\n height: height,\n top: y,\n right: x + width,\n bottom: y + height,\n left: x,\n x: x,\n y: y\n };\n}\n;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js\n // Returns the layout rect of an element relative to its offsetParent. Layout\n// means it doesn\'t take into account transforms.\n\nfunction getLayoutRect(element) {\n var clientRect = getBoundingClientRect(element); // Use the clientRect sizes if it\'s not been transformed.\n // Fixes https://github.com/popperjs/popper-core/issues/1223\n\n var width = element.offsetWidth;\n var height = element.offsetHeight;\n\n if (Math.abs(clientRect.width - width) <= 1) {\n width = clientRect.width;\n }\n\n if (Math.abs(clientRect.height - height) <= 1) {\n height = clientRect.height;\n }\n\n return {\n x: element.offsetLeft,\n y: element.offsetTop,\n width: width,\n height: height\n };\n}\n;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/dom-utils/contains.js\n\nfunction contains_contains(parent, child) {\n var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method\n\n if (parent.contains(child)) {\n return true;\n } // then fallback to custom implementation with Shadow DOM support\n else if (rootNode && isShadowRoot(rootNode)) {\n var next = child;\n\n do {\n if (next && parent.isSameNode(next)) {\n return true;\n } // $FlowFixMe[prop-missing]: need a better way to handle this...\n\n\n next = next.parentNode || next.host;\n } while (next);\n } // Give up, the result is false\n\n\n return false;\n}\n;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/dom-utils/getNodeName.js\nfunction getNodeName(element) {\n return element ? (element.nodeName || \'\').toLowerCase() : null;\n}\n;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js\n\nfunction dom_utils_getComputedStyle_getComputedStyle(element) {\n return getWindow(element).getComputedStyle(element);\n}\n;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/dom-utils/isTableElement.js\n\nfunction isTableElement(element) {\n return [\'table\', \'td\', \'th\'].indexOf(getNodeName(element)) >= 0;\n}\n;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js\n\nfunction getDocumentElement(element) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return ((isElement(element) ? element.ownerDocument : // $FlowFixMe[prop-missing]\n element.document) || window.document).documentElement;\n}\n;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/dom-utils/getParentNode.js\n\n\n\nfunction getParentNode(element) {\n if (getNodeName(element) === \'html\') {\n return element;\n }\n\n return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle\n // $FlowFixMe[incompatible-return]\n // $FlowFixMe[prop-missing]\n element.assignedSlot || // step into the shadow DOM of the parent of a slotted node\n element.parentNode || ( // DOM Element detected\n isShadowRoot(element) ? element.host : null) || // ShadowRoot detected\n // $FlowFixMe[incompatible-call]: HTMLElement is a Node\n getDocumentElement(element) // fallback\n\n );\n}\n;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js\n\n\n\n\n\n\n\n\nfunction getTrueOffsetParent(element) {\n if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837\n dom_utils_getComputedStyle_getComputedStyle(element).position === \'fixed\') {\n return null;\n }\n\n return element.offsetParent;\n} // `.offsetParent` reports `null` for fixed elements, while absolute elements\n// return the containing block\n\n\nfunction getContainingBlock(element) {\n var isFirefox = /firefox/i.test(getUAString());\n var isIE = /Trident/i.test(getUAString());\n\n if (isIE && isHTMLElement(element)) {\n // In IE 9, 10 and 11 fixed elements containing block is always established by the viewport\n var elementCss = dom_utils_getComputedStyle_getComputedStyle(element);\n\n if (elementCss.position === \'fixed\') {\n return null;\n }\n }\n\n var currentNode = getParentNode(element);\n\n if (isShadowRoot(currentNode)) {\n currentNode = currentNode.host;\n }\n\n while (isHTMLElement(currentNode) && [\'html\', \'body\'].indexOf(getNodeName(currentNode)) < 0) {\n var css = dom_utils_getComputedStyle_getComputedStyle(currentNode); // This is non-exhaustive but covers the most common CSS properties that\n // create a containing block.\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n\n if (css.transform !== \'none\' || css.perspective !== \'none\' || css.contain === \'paint\' || [\'transform\', \'perspective\'].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === \'filter\' || isFirefox && css.filter && css.filter !== \'none\') {\n return currentNode;\n } else {\n currentNode = currentNode.parentNode;\n }\n }\n\n return null;\n} // Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\n\n\nfunction getOffsetParent(element) {\n var window = getWindow(element);\n var offsetParent = getTrueOffsetParent(element);\n\n while (offsetParent && isTableElement(offsetParent) && dom_utils_getComputedStyle_getComputedStyle(offsetParent).position === \'static\') {\n offsetParent = getTrueOffsetParent(offsetParent);\n }\n\n if (offsetParent && (getNodeName(offsetParent) === \'html\' || getNodeName(offsetParent) === \'body\' && dom_utils_getComputedStyle_getComputedStyle(offsetParent).position === \'static\')) {\n return window;\n }\n\n return offsetParent || getContainingBlock(element) || window;\n}\n;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js\nfunction getMainAxisFromPlacement(placement) {\n return [\'top\', \'bottom\'].indexOf(placement) >= 0 ? \'x\' : \'y\';\n}\n;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/utils/within.js\n\nfunction within(min, value, max) {\n return math_max(min, math_min(value, max));\n}\nfunction withinMaxClamp(min, value, max) {\n var v = within(min, value, max);\n return v > max ? max : v;\n}\n;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/utils/getFreshSideObject.js\nfunction getFreshSideObject() {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n };\n}\n;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/utils/mergePaddingObject.js\n\nfunction mergePaddingObject(paddingObject) {\n return Object.assign({}, getFreshSideObject(), paddingObject);\n}\n;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/utils/expandToHashMap.js\nfunction expandToHashMap(value, keys) {\n return keys.reduce(function (hashMap, key) {\n hashMap[key] = value;\n return hashMap;\n }, {});\n}\n;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/enums.js\nvar enums_top = \'top\';\nvar bottom = \'bottom\';\nvar right = \'right\';\nvar left = \'left\';\nvar auto = \'auto\';\nvar basePlacements = [enums_top, bottom, right, left];\nvar start = \'start\';\nvar end = \'end\';\nvar clippingParents = \'clippingParents\';\nvar viewport = \'viewport\';\nvar popper = \'popper\';\nvar reference = \'reference\';\nvar variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) {\n return acc.concat([placement + "-" + start, placement + "-" + end]);\n}, []);\nvar enums_placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) {\n return acc.concat([placement, placement + "-" + start, placement + "-" + end]);\n}, []); // modifiers that need to read the DOM\n\nvar beforeRead = \'beforeRead\';\nvar read = \'read\';\nvar afterRead = \'afterRead\'; // pure-logic modifiers\n\nvar beforeMain = \'beforeMain\';\nvar main = \'main\';\nvar afterMain = \'afterMain\'; // modifier with the purpose to write to the DOM (or write into a framework state)\n\nvar beforeWrite = \'beforeWrite\';\nvar write = \'write\';\nvar afterWrite = \'afterWrite\';\nvar modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];\n;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/modifiers/arrow.js\n\n\n\n\n\n\n\n\n // eslint-disable-next-line import/no-unused-modules\n\nvar toPaddingObject = function toPaddingObject(padding, state) {\n padding = typeof padding === \'function\' ? padding(Object.assign({}, state.rects, {\n placement: state.placement\n })) : padding;\n return mergePaddingObject(typeof padding !== \'number\' ? padding : expandToHashMap(padding, basePlacements));\n};\n\nfunction arrow(_ref) {\n var _state$modifiersData$;\n\n var state = _ref.state,\n name = _ref.name,\n options = _ref.options;\n var arrowElement = state.elements.arrow;\n var popperOffsets = state.modifiersData.popperOffsets;\n var basePlacement = getBasePlacement(state.placement);\n var axis = getMainAxisFromPlacement(basePlacement);\n var isVertical = [left, right].indexOf(basePlacement) >= 0;\n var len = isVertical ? \'height\' : \'width\';\n\n if (!arrowElement || !popperOffsets) {\n return;\n }\n\n var paddingObject = toPaddingObject(options.padding, state);\n var arrowRect = getLayoutRect(arrowElement);\n var minProp = axis === \'y\' ? enums_top : left;\n var maxProp = axis === \'y\' ? bottom : right;\n var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len];\n var startDiff = popperOffsets[axis] - state.rects.reference[axis];\n var arrowOffsetParent = getOffsetParent(arrowElement);\n var clientSize = arrowOffsetParent ? axis === \'y\' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;\n var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn\'t overflow the popper if the center point is\n // outside of the popper bounds\n\n var min = paddingObject[minProp];\n var max = clientSize - arrowRect[len] - paddingObject[maxProp];\n var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;\n var offset = within(min, center, max); // Prevents breaking syntax highlighting...\n\n var axisProp = axis;\n state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$);\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state,\n options = _ref2.options;\n var _options$element = options.element,\n arrowElement = _options$element === void 0 ? \'[data-popper-arrow]\' : _options$element;\n\n if (arrowElement == null) {\n return;\n } // CSS selector\n\n\n if (typeof arrowElement === \'string\') {\n arrowElement = state.elements.popper.querySelector(arrowElement);\n\n if (!arrowElement) {\n return;\n }\n }\n\n if (!contains_contains(state.elements.popper, arrowElement)) {\n return;\n }\n\n state.elements.arrow = arrowElement;\n} // eslint-disable-next-line import/no-unused-modules\n\n\n/* harmony default export */ const modifiers_arrow = ({\n name: \'arrow\',\n enabled: true,\n phase: \'main\',\n fn: arrow,\n effect: effect,\n requires: [\'popperOffsets\'],\n requiresIfExists: [\'preventOverflow\']\n});\n;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/utils/getVariation.js\nfunction getVariation(placement) {\n return placement.split(\'-\')[1];\n}\n;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/modifiers/computeStyles.js\n\n\n\n\n\n\n\n // eslint-disable-next-line import/no-unused-modules\n\nvar unsetSides = {\n top: \'auto\',\n right: \'auto\',\n bottom: \'auto\',\n left: \'auto\'\n}; // Round the offsets to the nearest suitable subpixel based on the DPR.\n// Zooming can change the DPR, but it seems to report a value that will\n// cleanly divide the values into the appropriate subpixels.\n\nfunction roundOffsetsByDPR(_ref, win) {\n var x = _ref.x,\n y = _ref.y;\n var dpr = win.devicePixelRatio || 1;\n return {\n x: round(x * dpr) / dpr || 0,\n y: round(y * dpr) / dpr || 0\n };\n}\n\nfunction mapToStyles(_ref2) {\n var _Object$assign2;\n\n var popper = _ref2.popper,\n popperRect = _ref2.popperRect,\n placement = _ref2.placement,\n variation = _ref2.variation,\n offsets = _ref2.offsets,\n position = _ref2.position,\n gpuAcceleration = _ref2.gpuAcceleration,\n adaptive = _ref2.adaptive,\n roundOffsets = _ref2.roundOffsets,\n isFixed = _ref2.isFixed;\n var _offsets$x = offsets.x,\n x = _offsets$x === void 0 ? 0 : _offsets$x,\n _offsets$y = offsets.y,\n y = _offsets$y === void 0 ? 0 : _offsets$y;\n\n var _ref3 = typeof roundOffsets === \'function\' ? roundOffsets({\n x: x,\n y: y\n }) : {\n x: x,\n y: y\n };\n\n x = _ref3.x;\n y = _ref3.y;\n var hasX = offsets.hasOwnProperty(\'x\');\n var hasY = offsets.hasOwnProperty(\'y\');\n var sideX = left;\n var sideY = enums_top;\n var win = window;\n\n if (adaptive) {\n var offsetParent = getOffsetParent(popper);\n var heightProp = \'clientHeight\';\n var widthProp = \'clientWidth\';\n\n if (offsetParent === getWindow(popper)) {\n offsetParent = getDocumentElement(popper);\n\n if (dom_utils_getComputedStyle_getComputedStyle(offsetParent).position !== \'static\' && position === \'absolute\') {\n heightProp = \'scrollHeight\';\n widthProp = \'scrollWidth\';\n }\n } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn\'t detect it\n\n\n offsetParent = offsetParent;\n\n if (placement === enums_top || (placement === left || placement === right) && variation === end) {\n sideY = bottom;\n var offsetY = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.height : // $FlowFixMe[prop-missing]\n offsetParent[heightProp];\n y -= offsetY - popperRect.height;\n y *= gpuAcceleration ? 1 : -1;\n }\n\n if (placement === left || (placement === enums_top || placement === bottom) && variation === end) {\n sideX = right;\n var offsetX = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.width : // $FlowFixMe[prop-missing]\n offsetParent[widthProp];\n x -= offsetX - popperRect.width;\n x *= gpuAcceleration ? 1 : -1;\n }\n }\n\n var commonStyles = Object.assign({\n position: position\n }, adaptive && unsetSides);\n\n var _ref4 = roundOffsets === true ? roundOffsetsByDPR({\n x: x,\n y: y\n }, getWindow(popper)) : {\n x: x,\n y: y\n };\n\n x = _ref4.x;\n y = _ref4.y;\n\n if (gpuAcceleration) {\n var _Object$assign;\n\n return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? \'0\' : \'\', _Object$assign[sideX] = hasX ? \'0\' : \'\', _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? "translate(" + x + "px, " + y + "px)" : "translate3d(" + x + "px, " + y + "px, 0)", _Object$assign));\n }\n\n return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + "px" : \'\', _Object$assign2[sideX] = hasX ? x + "px" : \'\', _Object$assign2.transform = \'\', _Object$assign2));\n}\n\nfunction computeStyles(_ref5) {\n var state = _ref5.state,\n options = _ref5.options;\n var _options$gpuAccelerat = options.gpuAcceleration,\n gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat,\n _options$adaptive = options.adaptive,\n adaptive = _options$adaptive === void 0 ? true : _options$adaptive,\n _options$roundOffsets = options.roundOffsets,\n roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets;\n var commonStyles = {\n placement: getBasePlacement(state.placement),\n variation: getVariation(state.placement),\n popper: state.elements.popper,\n popperRect: state.rects.popper,\n gpuAcceleration: gpuAcceleration,\n isFixed: state.options.strategy === \'fixed\'\n };\n\n if (state.modifiersData.popperOffsets != null) {\n state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.popperOffsets,\n position: state.options.strategy,\n adaptive: adaptive,\n roundOffsets: roundOffsets\n })));\n }\n\n if (state.modifiersData.arrow != null) {\n state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.arrow,\n position: \'absolute\',\n adaptive: false,\n roundOffsets: roundOffsets\n })));\n }\n\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n \'data-popper-placement\': state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\n/* harmony default export */ const modifiers_computeStyles = ({\n name: \'computeStyles\',\n enabled: true,\n phase: \'beforeWrite\',\n fn: computeStyles,\n data: {}\n});\n;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/modifiers/eventListeners.js\n // eslint-disable-next-line import/no-unused-modules\n\nvar passive = {\n passive: true\n};\n\nfunction eventListeners_effect(_ref) {\n var state = _ref.state,\n instance = _ref.instance,\n options = _ref.options;\n var _options$scroll = options.scroll,\n scroll = _options$scroll === void 0 ? true : _options$scroll,\n _options$resize = options.resize,\n resize = _options$resize === void 0 ? true : _options$resize;\n var window = getWindow(state.elements.popper);\n var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);\n\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.addEventListener(\'scroll\', instance.update, passive);\n });\n }\n\n if (resize) {\n window.addEventListener(\'resize\', instance.update, passive);\n }\n\n return function () {\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.removeEventListener(\'scroll\', instance.update, passive);\n });\n }\n\n if (resize) {\n window.removeEventListener(\'resize\', instance.update, passive);\n }\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\n/* harmony default export */ const eventListeners = ({\n name: \'eventListeners\',\n enabled: true,\n phase: \'write\',\n fn: function fn() {},\n effect: eventListeners_effect,\n data: {}\n});\n;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/utils/getOppositePlacement.js\nvar hash = {\n left: \'right\',\n right: \'left\',\n bottom: \'top\',\n top: \'bottom\'\n};\nfunction getOppositePlacement(placement) {\n return placement.replace(/left|right|bottom|top/g, function (matched) {\n return hash[matched];\n });\n}\n;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js\nvar getOppositeVariationPlacement_hash = {\n start: \'end\',\n end: \'start\'\n};\nfunction getOppositeVariationPlacement(placement) {\n return placement.replace(/start|end/g, function (matched) {\n return getOppositeVariationPlacement_hash[matched];\n });\n}\n;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js\n\nfunction getWindowScroll(node) {\n var win = getWindow(node);\n var scrollLeft = win.pageXOffset;\n var scrollTop = win.pageYOffset;\n return {\n scrollLeft: scrollLeft,\n scrollTop: scrollTop\n };\n}\n;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js\n\n\n\nfunction getWindowScrollBarX(element) {\n // If <html> has a CSS width greater than the viewport, then this will be\n // incorrect for RTL.\n // Popper 1 is broken in this case and never had a bug report so let\'s assume\n // it\'s not an issue. I don\'t think anyone ever specifies width on <html>\n // anyway.\n // Browsers where the left scrollbar doesn\'t cause an issue report `0` for\n // this (e.g. Edge 2019, IE11, Safari)\n return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft;\n}\n;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js\n\n\n\n\nfunction getViewportRect(element, strategy) {\n var win = getWindow(element);\n var html = getDocumentElement(element);\n var visualViewport = win.visualViewport;\n var width = html.clientWidth;\n var height = html.clientHeight;\n var x = 0;\n var y = 0;\n\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height;\n var layoutViewport = isLayoutViewport();\n\n if (layoutViewport || !layoutViewport && strategy === \'fixed\') {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n\n return {\n width: width,\n height: height,\n x: x + getWindowScrollBarX(element),\n y: y\n };\n}\n;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js\n\n\n\n\n // Gets the entire size of the scrollable document area, even extending outside\n// of the `<html>` and `<body>` rect bounds if horizontally scrollable\n\nfunction getDocumentRect(element) {\n var _element$ownerDocumen;\n\n var html = getDocumentElement(element);\n var winScroll = getWindowScroll(element);\n var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;\n var width = math_max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);\n var height = math_max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);\n var x = -winScroll.scrollLeft + getWindowScrollBarX(element);\n var y = -winScroll.scrollTop;\n\n if (dom_utils_getComputedStyle_getComputedStyle(body || html).direction === \'rtl\') {\n x += math_max(html.clientWidth, body ? body.clientWidth : 0) - width;\n }\n\n return {\n width: width,\n height: height,\n x: x,\n y: y\n };\n}\n;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js\n\nfunction isScrollParent(element) {\n // Firefox wants us to check `-x` and `-y` variations as well\n var _getComputedStyle = dom_utils_getComputedStyle_getComputedStyle(element),\n overflow = _getComputedStyle.overflow,\n overflowX = _getComputedStyle.overflowX,\n overflowY = _getComputedStyle.overflowY;\n\n return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);\n}\n;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js\n\n\n\n\nfunction getScrollParent(node) {\n if ([\'html\', \'body\', \'#document\'].indexOf(getNodeName(node)) >= 0) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return node.ownerDocument.body;\n }\n\n if (isHTMLElement(node) && isScrollParent(node)) {\n return node;\n }\n\n return getScrollParent(getParentNode(node));\n}\n;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js\n\n\n\n\n/*\ngiven a DOM element, return the list of all scroll parents, up the list of ancesors\nuntil we get to the top window object. This list is what we attach scroll listeners\nto, because if any of these parent elements scroll, we\'ll need to re-calculate the\nreference element\'s position.\n*/\n\nfunction listScrollParents(element, list) {\n var _element$ownerDocumen;\n\n if (list === void 0) {\n list = [];\n }\n\n var scrollParent = getScrollParent(element);\n var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body);\n var win = getWindow(scrollParent);\n var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent;\n var updatedList = list.concat(target);\n return isBody ? updatedList : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here\n updatedList.concat(listScrollParents(getParentNode(target)));\n}\n;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/utils/rectToClientRect.js\nfunction rectToClientRect(rect) {\n return Object.assign({}, rect, {\n left: rect.x,\n top: rect.y,\n right: rect.x + rect.width,\n bottom: rect.y + rect.height\n });\n}\n;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nfunction getInnerBoundingClientRect(element, strategy) {\n var rect = getBoundingClientRect(element, false, strategy === \'fixed\');\n rect.top = rect.top + element.clientTop;\n rect.left = rect.left + element.clientLeft;\n rect.bottom = rect.top + element.clientHeight;\n rect.right = rect.left + element.clientWidth;\n rect.width = element.clientWidth;\n rect.height = element.clientHeight;\n rect.x = rect.left;\n rect.y = rect.top;\n return rect;\n}\n\nfunction getClientRectFromMixedType(element, clippingParent, strategy) {\n return clippingParent === viewport ? rectToClientRect(getViewportRect(element, strategy)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent, strategy) : rectToClientRect(getDocumentRect(getDocumentElement(element)));\n} // A "clipping parent" is an overflowable container with the characteristic of\n// clipping (or hiding) overflowing elements with a position different from\n// `initial`\n\n\nfunction getClippingParents(element) {\n var clippingParents = listScrollParents(getParentNode(element));\n var canEscapeClipping = [\'absolute\', \'fixed\'].indexOf(dom_utils_getComputedStyle_getComputedStyle(element).position) >= 0;\n var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;\n\n if (!isElement(clipperElement)) {\n return [];\n } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414\n\n\n return clippingParents.filter(function (clippingParent) {\n return isElement(clippingParent) && contains_contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== \'body\';\n });\n} // Gets the maximum area that the element is visible in due to any number of\n// clipping parents\n\n\nfunction getClippingRect(element, boundary, rootBoundary, strategy) {\n var mainClippingParents = boundary === \'clippingParents\' ? getClippingParents(element) : [].concat(boundary);\n var clippingParents = [].concat(mainClippingParents, [rootBoundary]);\n var firstClippingParent = clippingParents[0];\n var clippingRect = clippingParents.reduce(function (accRect, clippingParent) {\n var rect = getClientRectFromMixedType(element, clippingParent, strategy);\n accRect.top = math_max(rect.top, accRect.top);\n accRect.right = math_min(rect.right, accRect.right);\n accRect.bottom = math_min(rect.bottom, accRect.bottom);\n accRect.left = math_max(rect.left, accRect.left);\n return accRect;\n }, getClientRectFromMixedType(element, firstClippingParent, strategy));\n clippingRect.width = clippingRect.right - clippingRect.left;\n clippingRect.height = clippingRect.bottom - clippingRect.top;\n clippingRect.x = clippingRect.left;\n clippingRect.y = clippingRect.top;\n return clippingRect;\n}\n;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/utils/computeOffsets.js\n\n\n\n\nfunction computeOffsets(_ref) {\n var reference = _ref.reference,\n element = _ref.element,\n placement = _ref.placement;\n var basePlacement = placement ? getBasePlacement(placement) : null;\n var variation = placement ? getVariation(placement) : null;\n var commonX = reference.x + reference.width / 2 - element.width / 2;\n var commonY = reference.y + reference.height / 2 - element.height / 2;\n var offsets;\n\n switch (basePlacement) {\n case enums_top:\n offsets = {\n x: commonX,\n y: reference.y - element.height\n };\n break;\n\n case bottom:\n offsets = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n\n case right:\n offsets = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n\n case left:\n offsets = {\n x: reference.x - element.width,\n y: commonY\n };\n break;\n\n default:\n offsets = {\n x: reference.x,\n y: reference.y\n };\n }\n\n var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null;\n\n if (mainAxis != null) {\n var len = mainAxis === \'y\' ? \'height\' : \'width\';\n\n switch (variation) {\n case start:\n offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2);\n break;\n\n case end:\n offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2);\n break;\n\n default:\n }\n }\n\n return offsets;\n}\n;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/utils/detectOverflow.js\n\n\n\n\n\n\n\n\n // eslint-disable-next-line import/no-unused-modules\n\nfunction detectOverflow(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n _options$placement = _options.placement,\n placement = _options$placement === void 0 ? state.placement : _options$placement,\n _options$strategy = _options.strategy,\n strategy = _options$strategy === void 0 ? state.strategy : _options$strategy,\n _options$boundary = _options.boundary,\n boundary = _options$boundary === void 0 ? clippingParents : _options$boundary,\n _options$rootBoundary = _options.rootBoundary,\n rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary,\n _options$elementConte = _options.elementContext,\n elementContext = _options$elementConte === void 0 ? popper : _options$elementConte,\n _options$altBoundary = _options.altBoundary,\n altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary,\n _options$padding = _options.padding,\n padding = _options$padding === void 0 ? 0 : _options$padding;\n var paddingObject = mergePaddingObject(typeof padding !== \'number\' ? padding : expandToHashMap(padding, basePlacements));\n var altContext = elementContext === popper ? reference : popper;\n var popperRect = state.rects.popper;\n var element = state.elements[altBoundary ? altContext : elementContext];\n var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary, strategy);\n var referenceClientRect = getBoundingClientRect(state.elements.reference);\n var popperOffsets = computeOffsets({\n reference: referenceClientRect,\n element: popperRect,\n strategy: \'absolute\',\n placement: placement\n });\n var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets));\n var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect\n // 0 or negative = within the clipping rect\n\n var overflowOffsets = {\n top: clippingClientRect.top - elementClientRect.top + paddingObject.top,\n bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,\n left: clippingClientRect.left - elementClientRect.left + paddingObject.left,\n right: elementClientRect.right - clippingClientRect.right + paddingObject.right\n };\n var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element\n\n if (elementContext === popper && offsetData) {\n var offset = offsetData[placement];\n Object.keys(overflowOffsets).forEach(function (key) {\n var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1;\n var axis = [enums_top, bottom].indexOf(key) >= 0 ? \'y\' : \'x\';\n overflowOffsets[key] += offset[axis] * multiply;\n });\n }\n\n return overflowOffsets;\n}\n;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js\n\n\n\n\nfunction computeAutoPlacement(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n placement = _options.placement,\n boundary = _options.boundary,\n rootBoundary = _options.rootBoundary,\n padding = _options.padding,\n flipVariations = _options.flipVariations,\n _options$allowedAutoP = _options.allowedAutoPlacements,\n allowedAutoPlacements = _options$allowedAutoP === void 0 ? enums_placements : _options$allowedAutoP;\n var variation = getVariation(placement);\n var placements = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) {\n return getVariation(placement) === variation;\n }) : basePlacements;\n var allowedPlacements = placements.filter(function (placement) {\n return allowedAutoPlacements.indexOf(placement) >= 0;\n });\n\n if (allowedPlacements.length === 0) {\n allowedPlacements = placements;\n } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions...\n\n\n var overflows = allowedPlacements.reduce(function (acc, placement) {\n acc[placement] = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding\n })[getBasePlacement(placement)];\n return acc;\n }, {});\n return Object.keys(overflows).sort(function (a, b) {\n return overflows[a] - overflows[b];\n });\n}\n;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/modifiers/flip.js\n\n\n\n\n\n\n // eslint-disable-next-line import/no-unused-modules\n\nfunction getExpandedFallbackPlacements(placement) {\n if (getBasePlacement(placement) === auto) {\n return [];\n }\n\n var oppositePlacement = getOppositePlacement(placement);\n return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)];\n}\n\nfunction flip(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n\n if (state.modifiersData[name]._skip) {\n return;\n }\n\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis,\n specifiedFallbackPlacements = options.fallbackPlacements,\n padding = options.padding,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n _options$flipVariatio = options.flipVariations,\n flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio,\n allowedAutoPlacements = options.allowedAutoPlacements;\n var preferredPlacement = state.options.placement;\n var basePlacement = getBasePlacement(preferredPlacement);\n var isBasePlacement = basePlacement === preferredPlacement;\n var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement));\n var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) {\n return acc.concat(getBasePlacement(placement) === auto ? computeAutoPlacement(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n flipVariations: flipVariations,\n allowedAutoPlacements: allowedAutoPlacements\n }) : placement);\n }, []);\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var checksMap = new Map();\n var makeFallbackChecks = true;\n var firstFittingPlacement = placements[0];\n\n for (var i = 0; i < placements.length; i++) {\n var placement = placements[i];\n\n var _basePlacement = getBasePlacement(placement);\n\n var isStartVariation = getVariation(placement) === start;\n var isVertical = [enums_top, bottom].indexOf(_basePlacement) >= 0;\n var len = isVertical ? \'width\' : \'height\';\n var overflow = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n altBoundary: altBoundary,\n padding: padding\n });\n var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : enums_top;\n\n if (referenceRect[len] > popperRect[len]) {\n mainVariationSide = getOppositePlacement(mainVariationSide);\n }\n\n var altVariationSide = getOppositePlacement(mainVariationSide);\n var checks = [];\n\n if (checkMainAxis) {\n checks.push(overflow[_basePlacement] <= 0);\n }\n\n if (checkAltAxis) {\n checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0);\n }\n\n if (checks.every(function (check) {\n return check;\n })) {\n firstFittingPlacement = placement;\n makeFallbackChecks = false;\n break;\n }\n\n checksMap.set(placement, checks);\n }\n\n if (makeFallbackChecks) {\n // `2` may be desired in some cases – research later\n var numberOfChecks = flipVariations ? 3 : 1;\n\n var _loop = function _loop(_i) {\n var fittingPlacement = placements.find(function (placement) {\n var checks = checksMap.get(placement);\n\n if (checks) {\n return checks.slice(0, _i).every(function (check) {\n return check;\n });\n }\n });\n\n if (fittingPlacement) {\n firstFittingPlacement = fittingPlacement;\n return "break";\n }\n };\n\n for (var _i = numberOfChecks; _i > 0; _i--) {\n var _ret = _loop(_i);\n\n if (_ret === "break") break;\n }\n }\n\n if (state.placement !== firstFittingPlacement) {\n state.modifiersData[name]._skip = true;\n state.placement = firstFittingPlacement;\n state.reset = true;\n }\n} // eslint-disable-next-line import/no-unused-modules\n\n\n/* harmony default export */ const modifiers_flip = ({\n name: \'flip\',\n enabled: true,\n phase: \'main\',\n fn: flip,\n requiresIfExists: [\'offset\'],\n data: {\n _skip: false\n }\n});\n;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/modifiers/hide.js\n\n\n\nfunction getSideOffsets(overflow, rect, preventedOffsets) {\n if (preventedOffsets === void 0) {\n preventedOffsets = {\n x: 0,\n y: 0\n };\n }\n\n return {\n top: overflow.top - rect.height - preventedOffsets.y,\n right: overflow.right - rect.width + preventedOffsets.x,\n bottom: overflow.bottom - rect.height + preventedOffsets.y,\n left: overflow.left - rect.width - preventedOffsets.x\n };\n}\n\nfunction isAnySideFullyClipped(overflow) {\n return [enums_top, right, bottom, left].some(function (side) {\n return overflow[side] >= 0;\n });\n}\n\nfunction hide(_ref) {\n var state = _ref.state,\n name = _ref.name;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var preventedOffsets = state.modifiersData.preventOverflow;\n var referenceOverflow = detectOverflow(state, {\n elementContext: \'reference\'\n });\n var popperAltOverflow = detectOverflow(state, {\n altBoundary: true\n });\n var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect);\n var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets);\n var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);\n var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);\n state.modifiersData[name] = {\n referenceClippingOffsets: referenceClippingOffsets,\n popperEscapeOffsets: popperEscapeOffsets,\n isReferenceHidden: isReferenceHidden,\n hasPopperEscaped: hasPopperEscaped\n };\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n \'data-popper-reference-hidden\': isReferenceHidden,\n \'data-popper-escaped\': hasPopperEscaped\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\n/* harmony default export */ const modifiers_hide = ({\n name: \'hide\',\n enabled: true,\n phase: \'main\',\n requiresIfExists: [\'preventOverflow\'],\n fn: hide\n});\n;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/modifiers/offset.js\n\n // eslint-disable-next-line import/no-unused-modules\n\nfunction distanceAndSkiddingToXY(placement, rects, offset) {\n var basePlacement = getBasePlacement(placement);\n var invertDistance = [left, enums_top].indexOf(basePlacement) >= 0 ? -1 : 1;\n\n var _ref = typeof offset === \'function\' ? offset(Object.assign({}, rects, {\n placement: placement\n })) : offset,\n skidding = _ref[0],\n distance = _ref[1];\n\n skidding = skidding || 0;\n distance = (distance || 0) * invertDistance;\n return [left, right].indexOf(basePlacement) >= 0 ? {\n x: distance,\n y: skidding\n } : {\n x: skidding,\n y: distance\n };\n}\n\nfunction offset(_ref2) {\n var state = _ref2.state,\n options = _ref2.options,\n name = _ref2.name;\n var _options$offset = options.offset,\n offset = _options$offset === void 0 ? [0, 0] : _options$offset;\n var data = enums_placements.reduce(function (acc, placement) {\n acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset);\n return acc;\n }, {});\n var _data$state$placement = data[state.placement],\n x = _data$state$placement.x,\n y = _data$state$placement.y;\n\n if (state.modifiersData.popperOffsets != null) {\n state.modifiersData.popperOffsets.x += x;\n state.modifiersData.popperOffsets.y += y;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\n/* harmony default export */ const modifiers_offset = ({\n name: \'offset\',\n enabled: true,\n phase: \'main\',\n requires: [\'popperOffsets\'],\n fn: offset\n});\n;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/modifiers/popperOffsets.js\n\n\nfunction popperOffsets(_ref) {\n var state = _ref.state,\n name = _ref.name;\n // Offsets are the actual position the popper needs to have to be\n // properly positioned near its reference element\n // This is the most basic placement, and will be adjusted by\n // the modifiers in the next step\n state.modifiersData[name] = computeOffsets({\n reference: state.rects.reference,\n element: state.rects.popper,\n strategy: \'absolute\',\n placement: state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\n/* harmony default export */ const modifiers_popperOffsets = ({\n name: \'popperOffsets\',\n enabled: true,\n phase: \'read\',\n fn: popperOffsets,\n data: {}\n});\n;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/utils/getAltAxis.js\nfunction getAltAxis(axis) {\n return axis === \'x\' ? \'y\' : \'x\';\n}\n;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/modifiers/preventOverflow.js\n\n\n\n\n\n\n\n\n\n\n\n\nfunction preventOverflow(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n padding = options.padding,\n _options$tether = options.tether,\n tether = _options$tether === void 0 ? true : _options$tether,\n _options$tetherOffset = options.tetherOffset,\n tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset;\n var overflow = detectOverflow(state, {\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n altBoundary: altBoundary\n });\n var basePlacement = getBasePlacement(state.placement);\n var variation = getVariation(state.placement);\n var isBasePlacement = !variation;\n var mainAxis = getMainAxisFromPlacement(basePlacement);\n var altAxis = getAltAxis(mainAxis);\n var popperOffsets = state.modifiersData.popperOffsets;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var tetherOffsetValue = typeof tetherOffset === \'function\' ? tetherOffset(Object.assign({}, state.rects, {\n placement: state.placement\n })) : tetherOffset;\n var normalizedTetherOffsetValue = typeof tetherOffsetValue === \'number\' ? {\n mainAxis: tetherOffsetValue,\n altAxis: tetherOffsetValue\n } : Object.assign({\n mainAxis: 0,\n altAxis: 0\n }, tetherOffsetValue);\n var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null;\n var data = {\n x: 0,\n y: 0\n };\n\n if (!popperOffsets) {\n return;\n }\n\n if (checkMainAxis) {\n var _offsetModifierState$;\n\n var mainSide = mainAxis === \'y\' ? enums_top : left;\n var altSide = mainAxis === \'y\' ? bottom : right;\n var len = mainAxis === \'y\' ? \'height\' : \'width\';\n var offset = popperOffsets[mainAxis];\n var min = offset + overflow[mainSide];\n var max = offset - overflow[altSide];\n var additive = tether ? -popperRect[len] / 2 : 0;\n var minLen = variation === start ? referenceRect[len] : popperRect[len];\n var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn\'t go\n // outside the reference bounds\n\n var arrowElement = state.elements.arrow;\n var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : {\n width: 0,\n height: 0\n };\n var arrowPaddingObject = state.modifiersData[\'arrow#persistent\'] ? state.modifiersData[\'arrow#persistent\'].padding : getFreshSideObject();\n var arrowPaddingMin = arrowPaddingObject[mainSide];\n var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don\'t want\n // to include its full size in the calculation. If the reference is small\n // and near the edge of a boundary, the popper can overflow even if the\n // reference is not overflowing as well (e.g. virtual elements with no\n // width or height)\n\n var arrowLen = within(0, referenceRect[len], arrowRect[len]);\n var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis;\n var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis;\n var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow);\n var clientOffset = arrowOffsetParent ? mainAxis === \'y\' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;\n var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0;\n var tetherMin = offset + minOffset - offsetModifierValue - clientOffset;\n var tetherMax = offset + maxOffset - offsetModifierValue;\n var preventedOffset = within(tether ? math_min(min, tetherMin) : min, offset, tether ? math_max(max, tetherMax) : max);\n popperOffsets[mainAxis] = preventedOffset;\n data[mainAxis] = preventedOffset - offset;\n }\n\n if (checkAltAxis) {\n var _offsetModifierState$2;\n\n var _mainSide = mainAxis === \'x\' ? enums_top : left;\n\n var _altSide = mainAxis === \'x\' ? bottom : right;\n\n var _offset = popperOffsets[altAxis];\n\n var _len = altAxis === \'y\' ? \'height\' : \'width\';\n\n var _min = _offset + overflow[_mainSide];\n\n var _max = _offset - overflow[_altSide];\n\n var isOriginSide = [enums_top, left].indexOf(basePlacement) !== -1;\n\n var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0;\n\n var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis;\n\n var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max;\n\n var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max);\n\n popperOffsets[altAxis] = _preventedOffset;\n data[altAxis] = _preventedOffset - _offset;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\n/* harmony default export */ const modifiers_preventOverflow = ({\n name: \'preventOverflow\',\n enabled: true,\n phase: \'main\',\n fn: preventOverflow,\n requiresIfExists: [\'offset\']\n});\n;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js\nfunction getHTMLElementScroll(element) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n}\n;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js\n\n\n\n\nfunction getNodeScroll(node) {\n if (node === getWindow(node) || !isHTMLElement(node)) {\n return getWindowScroll(node);\n } else {\n return getHTMLElementScroll(node);\n }\n}\n;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js\n\n\n\n\n\n\n\n\n\nfunction isElementScaled(element) {\n var rect = element.getBoundingClientRect();\n var scaleX = round(rect.width) / element.offsetWidth || 1;\n var scaleY = round(rect.height) / element.offsetHeight || 1;\n return scaleX !== 1 || scaleY !== 1;\n} // Returns the composite rect of an element relative to its offsetParent.\n// Composite means it takes into account transforms as well as layout.\n\n\nfunction getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {\n if (isFixed === void 0) {\n isFixed = false;\n }\n\n var isOffsetParentAnElement = isHTMLElement(offsetParent);\n var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent);\n var documentElement = getDocumentElement(offsetParent);\n var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled, isFixed);\n var scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n var offsets = {\n x: 0,\n y: 0\n };\n\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== \'body\' || // https://github.com/popperjs/popper-core/issues/1078\n isScrollParent(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n\n if (isHTMLElement(offsetParent)) {\n offsets = getBoundingClientRect(offsetParent, true);\n offsets.x += offsetParent.clientLeft;\n offsets.y += offsetParent.clientTop;\n } else if (documentElement) {\n offsets.x = getWindowScrollBarX(documentElement);\n }\n }\n\n return {\n x: rect.left + scroll.scrollLeft - offsets.x,\n y: rect.top + scroll.scrollTop - offsets.y,\n width: rect.width,\n height: rect.height\n };\n}\n;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/utils/orderModifiers.js\n // source: https://stackoverflow.com/questions/49875255\n\nfunction order(modifiers) {\n var map = new Map();\n var visited = new Set();\n var result = [];\n modifiers.forEach(function (modifier) {\n map.set(modifier.name, modifier);\n }); // On visiting object, check for its dependencies and visit them recursively\n\n function sort(modifier) {\n visited.add(modifier.name);\n var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);\n requires.forEach(function (dep) {\n if (!visited.has(dep)) {\n var depModifier = map.get(dep);\n\n if (depModifier) {\n sort(depModifier);\n }\n }\n });\n result.push(modifier);\n }\n\n modifiers.forEach(function (modifier) {\n if (!visited.has(modifier.name)) {\n // check for visited object\n sort(modifier);\n }\n });\n return result;\n}\n\nfunction orderModifiers(modifiers) {\n // order based on dependencies\n var orderedModifiers = order(modifiers); // order based on phase\n\n return modifierPhases.reduce(function (acc, phase) {\n return acc.concat(orderedModifiers.filter(function (modifier) {\n return modifier.phase === phase;\n }));\n }, []);\n}\n;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/utils/debounce.js\nfunction debounce(fn) {\n var pending;\n return function () {\n if (!pending) {\n pending = new Promise(function (resolve) {\n Promise.resolve().then(function () {\n pending = undefined;\n resolve(fn());\n });\n });\n }\n\n return pending;\n };\n}\n;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/utils/mergeByName.js\nfunction mergeByName(modifiers) {\n var merged = modifiers.reduce(function (merged, current) {\n var existing = merged[current.name];\n merged[current.name] = existing ? Object.assign({}, existing, current, {\n options: Object.assign({}, existing.options, current.options),\n data: Object.assign({}, existing.data, current.data)\n }) : current;\n return merged;\n }, {}); // IE11 does not support Object.values\n\n return Object.keys(merged).map(function (key) {\n return merged[key];\n });\n}\n;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/createPopper.js\n\n\n\n\n\n\n\n\n\nvar DEFAULT_OPTIONS = {\n placement: \'bottom\',\n modifiers: [],\n strategy: \'absolute\'\n};\n\nfunction areValidElements() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return !args.some(function (element) {\n return !(element && typeof element.getBoundingClientRect === \'function\');\n });\n}\n\nfunction popperGenerator(generatorOptions) {\n if (generatorOptions === void 0) {\n generatorOptions = {};\n }\n\n var _generatorOptions = generatorOptions,\n _generatorOptions$def = _generatorOptions.defaultModifiers,\n defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def,\n _generatorOptions$def2 = _generatorOptions.defaultOptions,\n defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2;\n return function createPopper(reference, popper, options) {\n if (options === void 0) {\n options = defaultOptions;\n }\n\n var state = {\n placement: \'bottom\',\n orderedModifiers: [],\n options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions),\n modifiersData: {},\n elements: {\n reference: reference,\n popper: popper\n },\n attributes: {},\n styles: {}\n };\n var effectCleanupFns = [];\n var isDestroyed = false;\n var instance = {\n state: state,\n setOptions: function setOptions(setOptionsAction) {\n var options = typeof setOptionsAction === \'function\' ? setOptionsAction(state.options) : setOptionsAction;\n cleanupModifierEffects();\n state.options = Object.assign({}, defaultOptions, state.options, options);\n state.scrollParents = {\n reference: isElement(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [],\n popper: listScrollParents(popper)\n }; // Orders the modifiers based on their dependencies and `phase`\n // properties\n\n var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers\n\n state.orderedModifiers = orderedModifiers.filter(function (m) {\n return m.enabled;\n });\n runModifierEffects();\n return instance.update();\n },\n // Sync update – it will always be executed, even if not necessary. This\n // is useful for low frequency updates where sync behavior simplifies the\n // logic.\n // For high frequency updates (e.g. `resize` and `scroll` events), always\n // prefer the async Popper#update method\n forceUpdate: function forceUpdate() {\n if (isDestroyed) {\n return;\n }\n\n var _state$elements = state.elements,\n reference = _state$elements.reference,\n popper = _state$elements.popper; // Don\'t proceed if `reference` or `popper` are not valid elements\n // anymore\n\n if (!areValidElements(reference, popper)) {\n return;\n } // Store the reference and popper rects to be read by modifiers\n\n\n state.rects = {\n reference: getCompositeRect(reference, getOffsetParent(popper), state.options.strategy === \'fixed\'),\n popper: getLayoutRect(popper)\n }; // Modifiers have the ability to reset the current update cycle. The\n // most common use case for this is the `flip` modifier changing the\n // placement, which then needs to re-run all the modifiers, because the\n // logic was previously ran for the previous placement and is therefore\n // stale/incorrect\n\n state.reset = false;\n state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier\n // is filled with the initial data specified by the modifier. This means\n // it doesn\'t persist and is fresh on each update.\n // To ensure persistent data, use `${name}#persistent`\n\n state.orderedModifiers.forEach(function (modifier) {\n return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);\n });\n\n for (var index = 0; index < state.orderedModifiers.length; index++) {\n if (state.reset === true) {\n state.reset = false;\n index = -1;\n continue;\n }\n\n var _state$orderedModifie = state.orderedModifiers[index],\n fn = _state$orderedModifie.fn,\n _state$orderedModifie2 = _state$orderedModifie.options,\n _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2,\n name = _state$orderedModifie.name;\n\n if (typeof fn === \'function\') {\n state = fn({\n state: state,\n options: _options,\n name: name,\n instance: instance\n }) || state;\n }\n }\n },\n // Async and optimistically optimized update – it will not be executed if\n // not necessary (debounced to run at most once-per-tick)\n update: debounce(function () {\n return new Promise(function (resolve) {\n instance.forceUpdate();\n resolve(state);\n });\n }),\n destroy: function destroy() {\n cleanupModifierEffects();\n isDestroyed = true;\n }\n };\n\n if (!areValidElements(reference, popper)) {\n return instance;\n }\n\n instance.setOptions(options).then(function (state) {\n if (!isDestroyed && options.onFirstUpdate) {\n options.onFirstUpdate(state);\n }\n }); // Modifiers have the ability to execute arbitrary code before the first\n // update cycle runs. They will be executed in the same order as the update\n // cycle. This is useful when a modifier adds some persistent data that\n // other modifiers need to use, but the modifier is run after the dependent\n // one.\n\n function runModifierEffects() {\n state.orderedModifiers.forEach(function (_ref) {\n var name = _ref.name,\n _ref$options = _ref.options,\n options = _ref$options === void 0 ? {} : _ref$options,\n effect = _ref.effect;\n\n if (typeof effect === \'function\') {\n var cleanupFn = effect({\n state: state,\n name: name,\n instance: instance,\n options: options\n });\n\n var noopFn = function noopFn() {};\n\n effectCleanupFns.push(cleanupFn || noopFn);\n }\n });\n }\n\n function cleanupModifierEffects() {\n effectCleanupFns.forEach(function (fn) {\n return fn();\n });\n effectCleanupFns = [];\n }\n\n return instance;\n };\n}\nvar createPopper = /*#__PURE__*/(/* unused pure expression or super */ null && (popperGenerator())); // eslint-disable-next-line import/no-unused-modules\n\n\n;// CONCATENATED MODULE: ./node_modules/@restart/ui/esm/popper.js\n\n\n\n\n\n\n\n\n\n\n\n// For the common JS build we will turn this file into a bundle with no imports.\n// This is b/c the Popper lib is all esm files, and would break in a common js only environment\nconst popper_createPopper = popperGenerator({\n defaultModifiers: [modifiers_hide, modifiers_popperOffsets, modifiers_computeStyles, eventListeners, modifiers_offset, modifiers_flip, modifiers_preventOverflow, modifiers_arrow]\n});\n\n;// CONCATENATED MODULE: ./node_modules/@restart/ui/esm/usePopper.js\nconst usePopper_excluded = ["enabled", "placement", "strategy", "modifiers"];\nfunction usePopper_objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n\n\n\nconst disabledApplyStylesModifier = {\n name: \'applyStyles\',\n enabled: false,\n phase: \'afterWrite\',\n fn: () => undefined\n};\n\n// until docjs supports type exports...\n\nconst ariaDescribedByModifier = {\n name: \'ariaDescribedBy\',\n enabled: true,\n phase: \'afterWrite\',\n effect: ({\n state\n }) => () => {\n const {\n reference,\n popper\n } = state.elements;\n if (\'removeAttribute\' in reference) {\n const ids = (reference.getAttribute(\'aria-describedby\') || \'\').split(\',\').filter(id => id.trim() !== popper.id);\n if (!ids.length) reference.removeAttribute(\'aria-describedby\');else reference.setAttribute(\'aria-describedby\', ids.join(\',\'));\n }\n },\n fn: ({\n state\n }) => {\n var _popper$getAttribute;\n const {\n popper,\n reference\n } = state.elements;\n const role = (_popper$getAttribute = popper.getAttribute(\'role\')) == null ? void 0 : _popper$getAttribute.toLowerCase();\n if (popper.id && role === \'tooltip\' && \'setAttribute\' in reference) {\n const ids = reference.getAttribute(\'aria-describedby\');\n if (ids && ids.split(\',\').indexOf(popper.id) !== -1) {\n return;\n }\n reference.setAttribute(\'aria-describedby\', ids ? `${ids},${popper.id}` : popper.id);\n }\n }\n};\nconst EMPTY_MODIFIERS = [];\n/**\n * Position an element relative some reference element using Popper.js\n *\n * @param referenceElement\n * @param popperElement\n * @param {object} options\n * @param {object=} options.modifiers Popper.js modifiers\n * @param {boolean=} options.enabled toggle the popper functionality on/off\n * @param {string=} options.placement The popper element placement relative to the reference element\n * @param {string=} options.strategy the positioning strategy\n * @param {function=} options.onCreate called when the popper is created\n * @param {function=} options.onUpdate called when the popper is updated\n *\n * @returns {UsePopperState} The popper state\n */\nfunction usePopper(referenceElement, popperElement, _ref = {}) {\n let {\n enabled = true,\n placement = \'bottom\',\n strategy = \'absolute\',\n modifiers = EMPTY_MODIFIERS\n } = _ref,\n config = usePopper_objectWithoutPropertiesLoose(_ref, usePopper_excluded);\n const prevModifiers = (0,react.useRef)(modifiers);\n const popperInstanceRef = (0,react.useRef)();\n const update = (0,react.useCallback)(() => {\n var _popperInstanceRef$cu;\n (_popperInstanceRef$cu = popperInstanceRef.current) == null ? void 0 : _popperInstanceRef$cu.update();\n }, []);\n const forceUpdate = (0,react.useCallback)(() => {\n var _popperInstanceRef$cu2;\n (_popperInstanceRef$cu2 = popperInstanceRef.current) == null ? void 0 : _popperInstanceRef$cu2.forceUpdate();\n }, []);\n const [popperState, setState] = esm_useSafeState((0,react.useState)({\n placement,\n update,\n forceUpdate,\n attributes: {},\n styles: {\n popper: {},\n arrow: {}\n }\n }));\n const updateModifier = (0,react.useMemo)(() => ({\n name: \'updateStateModifier\',\n enabled: true,\n phase: \'write\',\n requires: [\'computeStyles\'],\n fn: ({\n state\n }) => {\n const styles = {};\n const attributes = {};\n Object.keys(state.elements).forEach(element => {\n styles[element] = state.styles[element];\n attributes[element] = state.attributes[element];\n });\n setState({\n state,\n styles,\n attributes,\n update,\n forceUpdate,\n placement: state.placement\n });\n }\n }), [update, forceUpdate, setState]);\n const nextModifiers = (0,react.useMemo)(() => {\n if (!dequal(prevModifiers.current, modifiers)) {\n prevModifiers.current = modifiers;\n }\n return prevModifiers.current;\n }, [modifiers]);\n (0,react.useEffect)(() => {\n if (!popperInstanceRef.current || !enabled) return;\n popperInstanceRef.current.setOptions({\n placement,\n strategy,\n modifiers: [...nextModifiers, updateModifier, disabledApplyStylesModifier]\n });\n }, [strategy, placement, updateModifier, enabled, nextModifiers]);\n (0,react.useEffect)(() => {\n if (!enabled || referenceElement == null || popperElement == null) {\n return undefined;\n }\n popperInstanceRef.current = popper_createPopper(referenceElement, popperElement, Object.assign({}, config, {\n placement,\n strategy,\n modifiers: [...nextModifiers, ariaDescribedByModifier, updateModifier]\n }));\n return () => {\n if (popperInstanceRef.current != null) {\n popperInstanceRef.current.destroy();\n popperInstanceRef.current = undefined;\n setState(s => Object.assign({}, s, {\n attributes: {},\n styles: {\n popper: {}\n }\n }));\n }\n };\n // This is only run once to _create_ the popper\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [enabled, referenceElement, popperElement]);\n return popperState;\n}\n/* harmony default export */ const esm_usePopper = (usePopper);\n// EXTERNAL MODULE: ./node_modules/warning/warning.js\nvar warning_warning = __webpack_require__(2473);\nvar warning_default = /*#__PURE__*/__webpack_require__.n(warning_warning);\n;// CONCATENATED MODULE: ./node_modules/@restart/ui/esm/useClickOutside.js\n\n\n\n\n\n\nconst useClickOutside_noop = () => {};\nfunction isLeftClickEvent(event) {\n return event.button === 0;\n}\nfunction useClickOutside_isModifiedEvent(event) {\n return !!(event.metaKey || event.altKey || event.ctrlKey || event.shiftKey);\n}\nconst getRefTarget = ref => ref && (\'current\' in ref ? ref.current : ref);\nconst InitialTriggerEvents = {\n click: \'mousedown\',\n mouseup: \'mousedown\',\n pointerup: \'pointerdown\'\n};\n\n/**\n * The `useClickOutside` hook registers your callback on the document that fires\n * when a pointer event is registered outside of the provided ref or element.\n *\n * @param {Ref<HTMLElement>| HTMLElement} ref The element boundary\n * @param {function} onClickOutside\n * @param {object=} options\n * @param {boolean=} options.disabled\n * @param {string=} options.clickTrigger The DOM event name (click, mousedown, etc) to attach listeners on\n */\nfunction useClickOutside(ref, onClickOutside = useClickOutside_noop, {\n disabled,\n clickTrigger = \'click\'\n} = {}) {\n const preventMouseClickOutsideRef = (0,react.useRef)(false);\n const waitingForTrigger = (0,react.useRef)(false);\n const handleMouseCapture = (0,react.useCallback)(e => {\n const currentTarget = getRefTarget(ref);\n warning_default()(!!currentTarget, \'ClickOutside captured a close event but does not have a ref to compare it to. \' + \'useClickOutside(), should be passed a ref that resolves to a DOM node\');\n preventMouseClickOutsideRef.current = !currentTarget || useClickOutside_isModifiedEvent(e) || !isLeftClickEvent(e) || !!contains(currentTarget, e.target) || waitingForTrigger.current;\n waitingForTrigger.current = false;\n }, [ref]);\n const handleInitialMouse = useEventCallback(e => {\n const currentTarget = getRefTarget(ref);\n if (currentTarget && contains(currentTarget, e.target)) {\n waitingForTrigger.current = true;\n }\n });\n const handleMouse = useEventCallback(e => {\n if (!preventMouseClickOutsideRef.current) {\n onClickOutside(e);\n }\n });\n (0,react.useEffect)(() => {\n var _ownerWindow$event, _ownerWindow$parent;\n if (disabled || ref == null) return undefined;\n const doc = ownerDocument(getRefTarget(ref));\n const ownerWindow = doc.defaultView || window;\n\n // Store the current event to avoid triggering handlers immediately\n // For things rendered in an iframe, the event might originate on the parent window\n // so we should fall back to that global event if the local one doesn\'t exist\n // https://github.com/facebook/react/issues/20074\n let currentEvent = (_ownerWindow$event = ownerWindow.event) != null ? _ownerWindow$event : (_ownerWindow$parent = ownerWindow.parent) == null ? void 0 : _ownerWindow$parent.event;\n let removeInitialTriggerListener = null;\n if (InitialTriggerEvents[clickTrigger]) {\n removeInitialTriggerListener = esm_listen(doc, InitialTriggerEvents[clickTrigger], handleInitialMouse, true);\n }\n\n // Use capture for this listener so it fires before React\'s listener, to\n // avoid false positives in the contains() check below if the target DOM\n // element is removed in the React mouse callback.\n const removeMouseCaptureListener = esm_listen(doc, clickTrigger, handleMouseCapture, true);\n const removeMouseListener = esm_listen(doc, clickTrigger, e => {\n // skip if this event is the same as the one running when we added the handlers\n if (e === currentEvent) {\n currentEvent = undefined;\n return;\n }\n handleMouse(e);\n });\n let mobileSafariHackListeners = [];\n if (\'ontouchstart\' in doc.documentElement) {\n mobileSafariHackListeners = [].slice.call(doc.body.children).map(el => esm_listen(el, \'mousemove\', useClickOutside_noop));\n }\n return () => {\n removeInitialTriggerListener == null ? void 0 : removeInitialTriggerListener();\n removeMouseCaptureListener();\n removeMouseListener();\n mobileSafariHackListeners.forEach(remove => remove());\n };\n }, [ref, disabled, clickTrigger, handleMouseCapture, handleInitialMouse, handleMouse]);\n}\n/* harmony default export */ const esm_useClickOutside = (useClickOutside);\n;// CONCATENATED MODULE: ./node_modules/@restart/ui/esm/mergeOptionsWithPopperConfig.js\nfunction toModifierMap(modifiers) {\n const result = {};\n if (!Array.isArray(modifiers)) {\n return modifiers || result;\n }\n\n // eslint-disable-next-line no-unused-expressions\n modifiers == null ? void 0 : modifiers.forEach(m => {\n result[m.name] = m;\n });\n return result;\n}\nfunction toModifierArray(map = {}) {\n if (Array.isArray(map)) return map;\n return Object.keys(map).map(k => {\n map[k].name = k;\n return map[k];\n });\n}\nfunction mergeOptionsWithPopperConfig({\n enabled,\n enableEvents,\n placement,\n flip,\n offset,\n fixed,\n containerPadding,\n arrowElement,\n popperConfig = {}\n}) {\n var _modifiers$eventListe, _modifiers$preventOve, _modifiers$preventOve2, _modifiers$offset, _modifiers$arrow;\n const modifiers = toModifierMap(popperConfig.modifiers);\n return Object.assign({}, popperConfig, {\n placement,\n enabled,\n strategy: fixed ? \'fixed\' : popperConfig.strategy,\n modifiers: toModifierArray(Object.assign({}, modifiers, {\n eventListeners: {\n enabled: enableEvents,\n options: (_modifiers$eventListe = modifiers.eventListeners) == null ? void 0 : _modifiers$eventListe.options\n },\n preventOverflow: Object.assign({}, modifiers.preventOverflow, {\n options: containerPadding ? Object.assign({\n padding: containerPadding\n }, (_modifiers$preventOve = modifiers.preventOverflow) == null ? void 0 : _modifiers$preventOve.options) : (_modifiers$preventOve2 = modifiers.preventOverflow) == null ? void 0 : _modifiers$preventOve2.options\n }),\n offset: {\n options: Object.assign({\n offset\n }, (_modifiers$offset = modifiers.offset) == null ? void 0 : _modifiers$offset.options)\n },\n arrow: Object.assign({}, modifiers.arrow, {\n enabled: !!arrowElement,\n options: Object.assign({}, (_modifiers$arrow = modifiers.arrow) == null ? void 0 : _modifiers$arrow.options, {\n element: arrowElement\n })\n }),\n flip: Object.assign({\n enabled: !!flip\n }, modifiers.flip)\n }))\n });\n}\n;// CONCATENATED MODULE: ./node_modules/@restart/ui/esm/DropdownMenu.js\nconst DropdownMenu_excluded = ["children"];\nfunction DropdownMenu_objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n\n\n\n\n\n\n\n\nconst DropdownMenu_noop = () => {};\n\n/**\n * @memberOf Dropdown\n * @param {object} options\n * @param {boolean} options.flip Automatically adjust the menu `drop` position based on viewport edge detection\n * @param {[number, number]} options.offset Define an offset distance between the Menu and the Toggle\n * @param {boolean} options.show Display the menu manually, ignored in the context of a `Dropdown`\n * @param {boolean} options.usePopper opt in/out of using PopperJS to position menus. When disabled you must position it yourself.\n * @param {string} options.rootCloseEvent The pointer event to listen for when determining "clicks outside" the menu for triggering a close.\n * @param {object} options.popperConfig Options passed to the [`usePopper`](/api/usePopper) hook.\n */\nfunction useDropdownMenu(options = {}) {\n const context = (0,react.useContext)(esm_DropdownContext);\n const [arrowElement, attachArrowRef] = useCallbackRef();\n const hasShownRef = (0,react.useRef)(false);\n const {\n flip,\n offset,\n rootCloseEvent,\n fixed = false,\n placement: placementOverride,\n popperConfig = {},\n enableEventListeners = true,\n usePopper: shouldUsePopper = !!context\n } = options;\n const show = (context == null ? void 0 : context.show) == null ? !!options.show : context.show;\n if (show && !hasShownRef.current) {\n hasShownRef.current = true;\n }\n const handleClose = e => {\n context == null ? void 0 : context.toggle(false, e);\n };\n const {\n placement,\n setMenu,\n menuElement,\n toggleElement\n } = context || {};\n const popper = esm_usePopper(toggleElement, menuElement, mergeOptionsWithPopperConfig({\n placement: placementOverride || placement || \'bottom-start\',\n enabled: shouldUsePopper,\n enableEvents: enableEventListeners == null ? show : enableEventListeners,\n offset,\n flip,\n fixed,\n arrowElement,\n popperConfig\n }));\n const menuProps = Object.assign({\n ref: setMenu || DropdownMenu_noop,\n \'aria-labelledby\': toggleElement == null ? void 0 : toggleElement.id\n }, popper.attributes.popper, {\n style: popper.styles.popper\n });\n const metadata = {\n show,\n placement,\n hasShown: hasShownRef.current,\n toggle: context == null ? void 0 : context.toggle,\n popper: shouldUsePopper ? popper : null,\n arrowProps: shouldUsePopper ? Object.assign({\n ref: attachArrowRef\n }, popper.attributes.arrow, {\n style: popper.styles.arrow\n }) : {}\n };\n esm_useClickOutside(menuElement, handleClose, {\n clickTrigger: rootCloseEvent,\n disabled: !show\n });\n return [menuProps, metadata];\n}\nconst defaultProps = {\n usePopper: true\n};\n/**\n * Also exported as `<Dropdown.Menu>` from `Dropdown`.\n *\n * @displayName DropdownMenu\n * @memberOf Dropdown\n */\nfunction DropdownMenu(_ref) {\n let {\n children\n } = _ref,\n options = DropdownMenu_objectWithoutPropertiesLoose(_ref, DropdownMenu_excluded);\n const [props, meta] = useDropdownMenu(options);\n return /*#__PURE__*/(0,jsx_runtime.jsx)(jsx_runtime.Fragment, {\n children: children(props, meta)\n });\n}\nDropdownMenu.displayName = \'DropdownMenu\';\nDropdownMenu.defaultProps = defaultProps;\n\n/** @component */\n/* harmony default export */ const esm_DropdownMenu = (DropdownMenu);\n;// CONCATENATED MODULE: ./node_modules/@react-aria/ssr/dist/import.mjs\n\n\n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ /*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ // We must avoid a circular dependency with @react-aria/utils, and this useLayoutEffect is\n// guarded by a check that it only runs on the client side.\n// eslint-disable-next-line rulesdir/useLayoutEffectRule\n\n// Default context value to use in case there is no SSRProvider. This is fine for\n// client-only apps. In order to support multiple copies of React Aria potentially\n// being on the page at once, the prefix is set to a random number. SSRProvider\n// will reset this to zero for consistency between server and client, so in the\n// SSR case multiple copies of React Aria is not supported.\nconst $b5e257d569688ac6$var$defaultContext = {\n prefix: String(Math.round(Math.random() * 10000000000)),\n current: 0\n};\nconst $b5e257d569688ac6$var$SSRContext = /*#__PURE__*/ (0, react).createContext($b5e257d569688ac6$var$defaultContext);\nconst $b5e257d569688ac6$var$IsSSRContext = /*#__PURE__*/ (0, react).createContext(false);\n// This is only used in React < 18.\nfunction $b5e257d569688ac6$var$LegacySSRProvider(props) {\n let cur = (0, $73SJx$useContext)($b5e257d569688ac6$var$SSRContext);\n let counter = $b5e257d569688ac6$var$useCounter(cur === $b5e257d569688ac6$var$defaultContext);\n let [isSSR, setIsSSR] = (0, $73SJx$useState)(true);\n let value = (0, $73SJx$useMemo)(()=>({\n // If this is the first SSRProvider, start with an empty string prefix, otherwise\n // append and increment the counter.\n prefix: cur === $b5e257d569688ac6$var$defaultContext ? "" : `${cur.prefix}-${counter}`,\n current: 0\n }), [\n cur,\n counter\n ]);\n // If on the client, and the component was initially server rendered,\n // then schedule a layout effect to update the component after hydration.\n if (typeof document !== "undefined") // This if statement technically breaks the rules of hooks, but is safe\n // because the condition never changes after mounting.\n // eslint-disable-next-line react-hooks/rules-of-hooks\n (0, $73SJx$useLayoutEffect)(()=>{\n setIsSSR(false);\n }, []);\n return /*#__PURE__*/ (0, $73SJx$react).createElement($b5e257d569688ac6$var$SSRContext.Provider, {\n value: value\n }, /*#__PURE__*/ (0, $73SJx$react).createElement($b5e257d569688ac6$var$IsSSRContext.Provider, {\n value: isSSR\n }, props.children));\n}\nlet $b5e257d569688ac6$var$warnedAboutSSRProvider = false;\nfunction $b5e257d569688ac6$export$9f8ac96af4b1b2ae(props) {\n if (typeof (0, $73SJx$react)["useId"] === "function") {\n if ( true && !$b5e257d569688ac6$var$warnedAboutSSRProvider) {\n console.warn("In React 18, SSRProvider is not necessary and is a noop. You can remove it from your app.");\n $b5e257d569688ac6$var$warnedAboutSSRProvider = true;\n }\n return /*#__PURE__*/ (0, $73SJx$react).createElement((0, $73SJx$react).Fragment, null, props.children);\n }\n return /*#__PURE__*/ (0, $73SJx$react).createElement($b5e257d569688ac6$var$LegacySSRProvider, props);\n}\nlet $b5e257d569688ac6$var$canUseDOM = Boolean(typeof window !== "undefined" && window.document && window.document.createElement);\nlet $b5e257d569688ac6$var$componentIds = new WeakMap();\nfunction $b5e257d569688ac6$var$useCounter(isDisabled = false) {\n let ctx = (0, react.useContext)($b5e257d569688ac6$var$SSRContext);\n let ref = (0, react.useRef)(null);\n // eslint-disable-next-line rulesdir/pure-render\n if (ref.current === null && !isDisabled) {\n var _React___SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED_ReactCurrentOwner, _React___SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;\n // In strict mode, React renders components twice, and the ref will be reset to null on the second render.\n // This means our id counter will be incremented twice instead of once. This is a problem because on the\n // server, components are only rendered once and so ids generated on the server won\'t match the client.\n // In React 18, useId was introduced to solve this, but it is not available in older versions. So to solve this\n // we need to use some React internals to access the underlying Fiber instance, which is stable between renders.\n // This is exposed as ReactCurrentOwner in development, which is all we need since StrictMode only runs in development.\n // To ensure that we only increment the global counter once, we store the starting id for this component in\n // a weak map associated with the Fiber. On the second render, we reset the global counter to this value.\n // Since React runs the second render immediately after the first, this is safe.\n // @ts-ignore\n let currentOwner = (_React___SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = (0, react).__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED) === null || _React___SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED === void 0 ? void 0 : (_React___SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED_ReactCurrentOwner = _React___SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner) === null || _React___SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED_ReactCurrentOwner === void 0 ? void 0 : _React___SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED_ReactCurrentOwner.current;\n if (currentOwner) {\n let prevComponentValue = $b5e257d569688ac6$var$componentIds.get(currentOwner);\n if (prevComponentValue == null) // On the first render, and first call to useId, store the id and state in our weak map.\n $b5e257d569688ac6$var$componentIds.set(currentOwner, {\n id: ctx.current,\n state: currentOwner.memoizedState\n });\n else if (currentOwner.memoizedState !== prevComponentValue.state) {\n // On the second render, the memoizedState gets reset by React.\n // Reset the counter, and remove from the weak map so we don\'t\n // do this for subsequent useId calls.\n ctx.current = prevComponentValue.id;\n $b5e257d569688ac6$var$componentIds.delete(currentOwner);\n }\n }\n // eslint-disable-next-line rulesdir/pure-render\n ref.current = ++ctx.current;\n }\n // eslint-disable-next-line rulesdir/pure-render\n return ref.current;\n}\nfunction $b5e257d569688ac6$var$useLegacySSRSafeId(defaultId) {\n let ctx = (0, react.useContext)($b5e257d569688ac6$var$SSRContext);\n // If we are rendering in a non-DOM environment, and there\'s no SSRProvider,\n // provide a warning to hint to the developer to add one.\n if (ctx === $b5e257d569688ac6$var$defaultContext && !$b5e257d569688ac6$var$canUseDOM) console.warn("When server rendering, you must wrap your application in an <SSRProvider> to ensure consistent ids are generated between the client and server.");\n let counter = $b5e257d569688ac6$var$useCounter(!!defaultId);\n let prefix = ctx === $b5e257d569688ac6$var$defaultContext && "production" === "test" ? 0 : `react-aria${ctx.prefix}`;\n return defaultId || `${prefix}-${counter}`;\n}\nfunction $b5e257d569688ac6$var$useModernSSRSafeId(defaultId) {\n // @ts-ignore\n let id = (0, react).useId();\n let [didSSR] = (0, react.useState)($b5e257d569688ac6$export$535bd6ca7f90a273());\n let prefix = didSSR || "production" === "test" ? "react-aria" : `react-aria${$b5e257d569688ac6$var$defaultContext.prefix}`;\n return defaultId || `${prefix}-${id}`;\n}\nconst $b5e257d569688ac6$export$619500959fc48b26 = typeof (0, react)["useId"] === "function" ? $b5e257d569688ac6$var$useModernSSRSafeId : $b5e257d569688ac6$var$useLegacySSRSafeId;\nfunction $b5e257d569688ac6$var$getSnapshot() {\n return false;\n}\nfunction $b5e257d569688ac6$var$getServerSnapshot() {\n return true;\n}\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nfunction $b5e257d569688ac6$var$subscribe(onStoreChange) {\n // noop\n return ()=>{};\n}\nfunction $b5e257d569688ac6$export$535bd6ca7f90a273() {\n // In React 18, we can use useSyncExternalStore to detect if we\'re server rendering or hydrating.\n if (typeof (0, react)["useSyncExternalStore"] === "function") return (0, react)["useSyncExternalStore"]($b5e257d569688ac6$var$subscribe, $b5e257d569688ac6$var$getSnapshot, $b5e257d569688ac6$var$getServerSnapshot);\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return (0, react.useContext)($b5e257d569688ac6$var$IsSSRContext);\n}\n\n\n\n\n\n//# sourceMappingURL=module.js.map\n\n;// CONCATENATED MODULE: ./node_modules/@restart/ui/esm/DropdownToggle.js\n\n\n\n\n\n\nconst isRoleMenu = el => {\n var _el$getAttribute;\n return ((_el$getAttribute = el.getAttribute(\'role\')) == null ? void 0 : _el$getAttribute.toLowerCase()) === \'menu\';\n};\nconst DropdownToggle_noop = () => {};\n\n/**\n * Wires up Dropdown toggle functionality, returning a set a props to attach\n * to the element that functions as the dropdown toggle (generally a button).\n *\n * @memberOf Dropdown\n */\nfunction useDropdownToggle() {\n const id = $b5e257d569688ac6$export$619500959fc48b26();\n const {\n show = false,\n toggle = DropdownToggle_noop,\n setToggle,\n menuElement\n } = (0,react.useContext)(esm_DropdownContext) || {};\n const handleClick = (0,react.useCallback)(e => {\n toggle(!show, e);\n }, [show, toggle]);\n const props = {\n id,\n ref: setToggle || DropdownToggle_noop,\n onClick: handleClick,\n \'aria-expanded\': !!show\n };\n\n // This is maybe better down in an effect, but\n // the component is going to update anyway when the menu element\n // is set so might return new props.\n if (menuElement && isRoleMenu(menuElement)) {\n props[\'aria-haspopup\'] = true;\n }\n return [props, {\n show,\n toggle\n }];\n}\n/**\n * Also exported as `<Dropdown.Toggle>` from `Dropdown`.\n *\n * @displayName DropdownToggle\n * @memberOf Dropdown\n */\nfunction DropdownToggle({\n children\n}) {\n const [props, meta] = useDropdownToggle();\n return /*#__PURE__*/(0,jsx_runtime.jsx)(jsx_runtime.Fragment, {\n children: children(props, meta)\n });\n}\nDropdownToggle.displayName = \'DropdownToggle\';\n\n/** @component */\n/* harmony default export */ const esm_DropdownToggle = (DropdownToggle);\n;// CONCATENATED MODULE: ./node_modules/@restart/ui/esm/DropdownItem.js\nconst DropdownItem_excluded = ["eventKey", "disabled", "onClick", "active", "as"];\nfunction DropdownItem_objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n\n\n\n\n\n\n\n/**\n * Create a dropdown item. Returns a set of props for the dropdown item component\n * including an `onClick` handler that prevents selection when the item is disabled\n */\nfunction useDropdownItem({\n key,\n href,\n active,\n disabled,\n onClick\n}) {\n const onSelectCtx = (0,react.useContext)(esm_SelectableContext);\n const navContext = (0,react.useContext)(esm_NavContext);\n const {\n activeKey\n } = navContext || {};\n const eventKey = makeEventKey(key, href);\n const isActive = active == null && key != null ? makeEventKey(activeKey) === eventKey : active;\n const handleClick = useEventCallback(event => {\n if (disabled) return;\n onClick == null ? void 0 : onClick(event);\n if (onSelectCtx && !event.isPropagationStopped()) {\n onSelectCtx(eventKey, event);\n }\n });\n return [{\n onClick: handleClick,\n \'aria-disabled\': disabled || undefined,\n \'aria-selected\': isActive,\n [dataAttr(\'dropdown-item\')]: \'\'\n }, {\n isActive\n }];\n}\nconst DropdownItem = /*#__PURE__*/react.forwardRef((_ref, ref) => {\n let {\n eventKey,\n disabled,\n onClick,\n active,\n as: Component = esm_Button\n } = _ref,\n props = DropdownItem_objectWithoutPropertiesLoose(_ref, DropdownItem_excluded);\n const [dropdownItemProps] = useDropdownItem({\n key: eventKey,\n href: props.href,\n disabled,\n onClick,\n active\n });\n return /*#__PURE__*/(0,jsx_runtime.jsx)(Component, Object.assign({}, props, {\n ref: ref\n }, dropdownItemProps));\n});\nDropdownItem.displayName = \'DropdownItem\';\n/* harmony default export */ const esm_DropdownItem = (DropdownItem);\n;// CONCATENATED MODULE: ./node_modules/@restart/ui/esm/Dropdown.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nfunction useRefWithUpdate() {\n const forceUpdate = useForceUpdate();\n const ref = (0,react.useRef)(null);\n const attachRef = (0,react.useCallback)(element => {\n ref.current = element;\n // ensure that a menu set triggers an update for consumers\n forceUpdate();\n }, [forceUpdate]);\n return [ref, attachRef];\n}\n\n/**\n * @displayName Dropdown\n * @public\n */\nfunction Dropdown({\n defaultShow,\n show: rawShow,\n onSelect,\n onToggle: rawOnToggle,\n itemSelector = `* [${dataAttr(\'dropdown-item\')}]`,\n focusFirstItemOnShow,\n placement = \'bottom-start\',\n children\n}) {\n const window = useWindow();\n const [show, onToggle] = esm_useUncontrolledProp(rawShow, defaultShow, rawOnToggle);\n\n // We use normal refs instead of useCallbackRef in order to populate the\n // the value as quickly as possible, otherwise the effect to focus the element\n // may run before the state value is set\n const [menuRef, setMenu] = useRefWithUpdate();\n const menuElement = menuRef.current;\n const [toggleRef, setToggle] = useRefWithUpdate();\n const toggleElement = toggleRef.current;\n const lastShow = usePrevious(show);\n const lastSourceEvent = (0,react.useRef)(null);\n const focusInDropdown = (0,react.useRef)(false);\n const onSelectCtx = (0,react.useContext)(esm_SelectableContext);\n const toggle = (0,react.useCallback)((nextShow, event, source = event == null ? void 0 : event.type) => {\n onToggle(nextShow, {\n originalEvent: event,\n source\n });\n }, [onToggle]);\n const handleSelect = useEventCallback((key, event) => {\n onSelect == null ? void 0 : onSelect(key, event);\n toggle(false, event, \'select\');\n if (!event.isPropagationStopped()) {\n onSelectCtx == null ? void 0 : onSelectCtx(key, event);\n }\n });\n const context = (0,react.useMemo)(() => ({\n toggle,\n placement,\n show,\n menuElement,\n toggleElement,\n setMenu,\n setToggle\n }), [toggle, placement, show, menuElement, toggleElement, setMenu, setToggle]);\n if (menuElement && lastShow && !show) {\n focusInDropdown.current = menuElement.contains(menuElement.ownerDocument.activeElement);\n }\n const focusToggle = useEventCallback(() => {\n if (toggleElement && toggleElement.focus) {\n toggleElement.focus();\n }\n });\n const maybeFocusFirst = useEventCallback(() => {\n const type = lastSourceEvent.current;\n let focusType = focusFirstItemOnShow;\n if (focusType == null) {\n focusType = menuRef.current && isRoleMenu(menuRef.current) ? \'keyboard\' : false;\n }\n if (focusType === false || focusType === \'keyboard\' && !/^key.+$/.test(type)) {\n return;\n }\n const first = qsa(menuRef.current, itemSelector)[0];\n if (first && first.focus) first.focus();\n });\n (0,react.useEffect)(() => {\n if (show) maybeFocusFirst();else if (focusInDropdown.current) {\n focusInDropdown.current = false;\n focusToggle();\n }\n // only `show` should be changing\n }, [show, focusInDropdown, focusToggle, maybeFocusFirst]);\n (0,react.useEffect)(() => {\n lastSourceEvent.current = null;\n });\n const getNextFocusedChild = (current, offset) => {\n if (!menuRef.current) return null;\n const items = qsa(menuRef.current, itemSelector);\n let index = items.indexOf(current) + offset;\n index = Math.max(0, Math.min(index, items.length));\n return items[index];\n };\n useEventListener_useEventListener((0,react.useCallback)(() => window.document, [window]), \'keydown\', event => {\n var _menuRef$current, _toggleRef$current;\n const {\n key\n } = event;\n const target = event.target;\n const fromMenu = (_menuRef$current = menuRef.current) == null ? void 0 : _menuRef$current.contains(target);\n const fromToggle = (_toggleRef$current = toggleRef.current) == null ? void 0 : _toggleRef$current.contains(target);\n\n // Second only to https://github.com/twbs/bootstrap/blob/8cfbf6933b8a0146ac3fbc369f19e520bd1ebdac/js/src/dropdown.js#L400\n // in inscrutability\n const isInput = /input|textarea/i.test(target.tagName);\n if (isInput && (key === \' \' || key !== \'Escape\' && fromMenu || key === \'Escape\' && target.type === \'search\')) {\n return;\n }\n if (!fromMenu && !fromToggle) {\n return;\n }\n if (key === \'Tab\' && (!menuRef.current || !show)) {\n return;\n }\n lastSourceEvent.current = event.type;\n const meta = {\n originalEvent: event,\n source: event.type\n };\n switch (key) {\n case \'ArrowUp\':\n {\n const next = getNextFocusedChild(target, -1);\n if (next && next.focus) next.focus();\n event.preventDefault();\n return;\n }\n case \'ArrowDown\':\n event.preventDefault();\n if (!show) {\n onToggle(true, meta);\n } else {\n const next = getNextFocusedChild(target, 1);\n if (next && next.focus) next.focus();\n }\n return;\n case \'Tab\':\n // on keydown the target is the element being tabbed FROM, we need that\n // to know if this event is relevant to this dropdown (e.g. in this menu).\n // On `keyup` the target is the element being tagged TO which we use to check\n // if focus has left the menu\n esm_addEventListener(target.ownerDocument, \'keyup\', e => {\n var _menuRef$current2;\n if (e.key === \'Tab\' && !e.target || !((_menuRef$current2 = menuRef.current) != null && _menuRef$current2.contains(e.target))) {\n onToggle(false, meta);\n }\n }, {\n once: true\n });\n break;\n case \'Escape\':\n if (key === \'Escape\') {\n event.preventDefault();\n event.stopPropagation();\n }\n onToggle(false, meta);\n break;\n default:\n }\n });\n return /*#__PURE__*/(0,jsx_runtime.jsx)(esm_SelectableContext.Provider, {\n value: handleSelect,\n children: /*#__PURE__*/(0,jsx_runtime.jsx)(esm_DropdownContext.Provider, {\n value: context,\n children: children\n })\n });\n}\nDropdown.displayName = \'Dropdown\';\nDropdown.Menu = esm_DropdownMenu;\nDropdown.Toggle = esm_DropdownToggle;\nDropdown.Item = esm_DropdownItem;\n/* harmony default export */ const esm_Dropdown = (Dropdown);\n;// CONCATENATED MODULE: ./node_modules/react-bootstrap/esm/DropdownContext.js\n"use client";\n\n\nconst DropdownContext_DropdownContext = /*#__PURE__*/react.createContext({});\nDropdownContext_DropdownContext.displayName = \'DropdownContext\';\n/* harmony default export */ const react_bootstrap_esm_DropdownContext = (DropdownContext_DropdownContext);\n;// CONCATENATED MODULE: ./node_modules/react-bootstrap/esm/DropdownDivider.js\n"use client";\n\n\n\n\n\nconst DropdownDivider = /*#__PURE__*/react.forwardRef(({\n className,\n bsPrefix,\n as: Component = \'hr\',\n role = \'separator\',\n ...props\n}, ref) => {\n bsPrefix = useBootstrapPrefix(bsPrefix, \'dropdown-divider\');\n return /*#__PURE__*/(0,jsx_runtime.jsx)(Component, {\n ref: ref,\n className: classnames_default()(className, bsPrefix),\n role: role,\n ...props\n });\n});\nDropdownDivider.displayName = \'DropdownDivider\';\n/* harmony default export */ const esm_DropdownDivider = (DropdownDivider);\n;// CONCATENATED MODULE: ./node_modules/react-bootstrap/esm/DropdownHeader.js\n"use client";\n\n\n\n\n\nconst DropdownHeader = /*#__PURE__*/react.forwardRef(({\n className,\n bsPrefix,\n as: Component = \'div\',\n role = \'heading\',\n ...props\n}, ref) => {\n bsPrefix = useBootstrapPrefix(bsPrefix, \'dropdown-header\');\n return /*#__PURE__*/(0,jsx_runtime.jsx)(Component, {\n ref: ref,\n className: classnames_default()(className, bsPrefix),\n role: role,\n ...props\n });\n});\nDropdownHeader.displayName = \'DropdownHeader\';\n/* harmony default export */ const esm_DropdownHeader = (DropdownHeader);\n;// CONCATENATED MODULE: ./node_modules/react-bootstrap/esm/DropdownItem.js\n"use client";\n\n\n\n\n\n\n\nconst DropdownItem_DropdownItem = /*#__PURE__*/react.forwardRef(({\n bsPrefix,\n className,\n eventKey,\n disabled = false,\n onClick,\n active,\n as: Component = esm_Anchor,\n ...props\n}, ref) => {\n const prefix = useBootstrapPrefix(bsPrefix, \'dropdown-item\');\n const [dropdownItemProps, meta] = useDropdownItem({\n key: eventKey,\n href: props.href,\n disabled,\n onClick,\n active\n });\n return /*#__PURE__*/(0,jsx_runtime.jsx)(Component, {\n ...props,\n ...dropdownItemProps,\n ref: ref,\n className: classnames_default()(className, prefix, meta.isActive && \'active\', disabled && \'disabled\')\n });\n});\nDropdownItem_DropdownItem.displayName = \'DropdownItem\';\n/* harmony default export */ const react_bootstrap_esm_DropdownItem = (DropdownItem_DropdownItem);\n;// CONCATENATED MODULE: ./node_modules/react-bootstrap/esm/DropdownItemText.js\n"use client";\n\n\n\n\n\nconst DropdownItemText = /*#__PURE__*/react.forwardRef(({\n className,\n bsPrefix,\n as: Component = \'span\',\n ...props\n}, ref) => {\n bsPrefix = useBootstrapPrefix(bsPrefix, \'dropdown-item-text\');\n return /*#__PURE__*/(0,jsx_runtime.jsx)(Component, {\n ref: ref,\n className: classnames_default()(className, bsPrefix),\n ...props\n });\n});\nDropdownItemText.displayName = \'DropdownItemText\';\n/* harmony default export */ const esm_DropdownItemText = (DropdownItemText);\n;// CONCATENATED MODULE: ./node_modules/react-bootstrap/esm/InputGroupContext.js\n"use client";\n\n\nconst InputGroupContext_context = /*#__PURE__*/react.createContext(null);\nInputGroupContext_context.displayName = \'InputGroupContext\';\n/* harmony default export */ const InputGroupContext = (InputGroupContext_context);\n;// CONCATENATED MODULE: ./node_modules/react-bootstrap/esm/useWrappedRefWithWarning.js\n\n\n\nfunction useWrappedRefWithWarning(ref, componentName) {\n // @ts-ignore\n if (true) return ref;\n\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const warningRef = (0,react.useCallback)(refValue => {\n !(refValue == null || !refValue.isReactComponent) ? false ? 0 : browser_default()(false) : void 0;\n }, [componentName]);\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return esm_useMergedRefs(warningRef, ref);\n}\n;// CONCATENATED MODULE: ./node_modules/react-bootstrap/esm/DropdownMenu.js\n"use client";\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nfunction getDropdownMenuPlacement(alignEnd, dropDirection, isRTL) {\n const topStart = isRTL ? \'top-end\' : \'top-start\';\n const topEnd = isRTL ? \'top-start\' : \'top-end\';\n const bottomStart = isRTL ? \'bottom-end\' : \'bottom-start\';\n const bottomEnd = isRTL ? \'bottom-start\' : \'bottom-end\';\n const leftStart = isRTL ? \'right-start\' : \'left-start\';\n const leftEnd = isRTL ? \'right-end\' : \'left-end\';\n const rightStart = isRTL ? \'left-start\' : \'right-start\';\n const rightEnd = isRTL ? \'left-end\' : \'right-end\';\n let placement = alignEnd ? bottomEnd : bottomStart;\n if (dropDirection === \'up\') placement = alignEnd ? topEnd : topStart;else if (dropDirection === \'end\') placement = alignEnd ? rightEnd : rightStart;else if (dropDirection === \'start\') placement = alignEnd ? leftEnd : leftStart;else if (dropDirection === \'down-centered\') placement = \'bottom\';else if (dropDirection === \'up-centered\') placement = \'top\';\n return placement;\n}\nconst DropdownMenu_DropdownMenu = /*#__PURE__*/react.forwardRef(({\n bsPrefix,\n className,\n align,\n rootCloseEvent,\n flip = true,\n show: showProps,\n renderOnMount,\n // Need to define the default "as" during prop destructuring to be compatible with styled-components github.com/react-bootstrap/react-bootstrap/issues/3595\n as: Component = \'div\',\n popperConfig,\n variant,\n ...props\n}, ref) => {\n let alignEnd = false;\n const isNavbar = (0,react.useContext)(NavbarContext);\n const prefix = useBootstrapPrefix(bsPrefix, \'dropdown-menu\');\n const {\n align: contextAlign,\n drop,\n isRTL\n } = (0,react.useContext)(react_bootstrap_esm_DropdownContext);\n align = align || contextAlign;\n const isInputGroup = (0,react.useContext)(InputGroupContext);\n const alignClasses = [];\n if (align) {\n if (typeof align === \'object\') {\n const keys = Object.keys(align);\n false ? 0 : void 0;\n if (keys.length) {\n const brkPoint = keys[0];\n const direction = align[brkPoint];\n\n // .dropdown-menu-end is required for responsively aligning\n // left in addition to align left classes.\n alignEnd = direction === \'start\';\n alignClasses.push(`${prefix}-${brkPoint}-${direction}`);\n }\n } else if (align === \'end\') {\n alignEnd = true;\n }\n }\n const placement = getDropdownMenuPlacement(alignEnd, drop, isRTL);\n const [menuProps, {\n hasShown,\n popper,\n show,\n toggle\n }] = useDropdownMenu({\n flip,\n rootCloseEvent,\n show: showProps,\n usePopper: !isNavbar && alignClasses.length === 0,\n offset: [0, 2],\n popperConfig,\n placement\n });\n menuProps.ref = esm_useMergedRefs(useWrappedRefWithWarning(ref, \'DropdownMenu\'), menuProps.ref);\n useIsomorphicEffect(() => {\n // Popper\'s initial position for the menu is incorrect when\n // renderOnMount=true. Need to call update() to correct it.\n if (show) popper == null ? void 0 : popper.update();\n }, [show]);\n if (!hasShown && !renderOnMount && !isInputGroup) return null;\n\n // For custom components provide additional, non-DOM, props;\n if (typeof Component !== \'string\') {\n menuProps.show = show;\n menuProps.close = () => toggle == null ? void 0 : toggle(false);\n menuProps.align = align;\n }\n let style = props.style;\n if (popper != null && popper.placement) {\n // we don\'t need the default popper style,\n // menus are display: none when not shown.\n style = {\n ...props.style,\n ...menuProps.style\n };\n props[\'x-placement\'] = popper.placement;\n }\n return /*#__PURE__*/(0,jsx_runtime.jsx)(Component, {\n ...props,\n ...menuProps,\n style: style\n // Bootstrap css requires this data attrib to style responsive menus.\n ,\n ...((alignClasses.length || isNavbar) && {\n \'data-bs-popper\': \'static\'\n }),\n className: classnames_default()(className, prefix, show && \'show\', alignEnd && `${prefix}-end`, variant && `${prefix}-${variant}`, ...alignClasses)\n });\n});\nDropdownMenu_DropdownMenu.displayName = \'DropdownMenu\';\n/* harmony default export */ const react_bootstrap_esm_DropdownMenu = (DropdownMenu_DropdownMenu);\n;// CONCATENATED MODULE: ./node_modules/react-bootstrap/esm/Button.js\n"use client";\n\n\n\n\n\n\nconst Button_Button = /*#__PURE__*/react.forwardRef(({\n as,\n bsPrefix,\n variant = \'primary\',\n size,\n active = false,\n disabled = false,\n className,\n ...props\n}, ref) => {\n const prefix = useBootstrapPrefix(bsPrefix, \'btn\');\n const [buttonProps, {\n tagName\n }] = useButtonProps({\n tagName: as,\n disabled,\n ...props\n });\n const Component = tagName;\n return /*#__PURE__*/(0,jsx_runtime.jsx)(Component, {\n ...buttonProps,\n ...props,\n ref: ref,\n disabled: disabled,\n className: classnames_default()(className, prefix, active && \'active\', variant && `${prefix}-${variant}`, size && `${prefix}-${size}`, props.href && disabled && \'disabled\')\n });\n});\nButton_Button.displayName = \'Button\';\n/* harmony default export */ const react_bootstrap_esm_Button = (Button_Button);\n;// CONCATENATED MODULE: ./node_modules/react-bootstrap/esm/DropdownToggle.js\n"use client";\n\n\n\n\n\n\n\n\n\n\n\nconst DropdownToggle_DropdownToggle = /*#__PURE__*/react.forwardRef(({\n bsPrefix,\n split,\n className,\n childBsPrefix,\n // Need to define the default "as" during prop destructuring to be compatible with styled-components github.com/react-bootstrap/react-bootstrap/issues/3595\n as: Component = react_bootstrap_esm_Button,\n ...props\n}, ref) => {\n const prefix = useBootstrapPrefix(bsPrefix, \'dropdown-toggle\');\n const dropdownContext = (0,react.useContext)(esm_DropdownContext);\n if (childBsPrefix !== undefined) {\n props.bsPrefix = childBsPrefix;\n }\n const [toggleProps] = useDropdownToggle();\n toggleProps.ref = esm_useMergedRefs(toggleProps.ref, useWrappedRefWithWarning(ref, \'DropdownToggle\'));\n\n // This intentionally forwards size and variant (if set) to the\n // underlying component, to allow it to render size and style variants.\n return /*#__PURE__*/(0,jsx_runtime.jsx)(Component, {\n className: classnames_default()(className, prefix, split && `${prefix}-split`, (dropdownContext == null ? void 0 : dropdownContext.show) && \'show\'),\n ...toggleProps,\n ...props\n });\n});\nDropdownToggle_DropdownToggle.displayName = \'DropdownToggle\';\n/* harmony default export */ const react_bootstrap_esm_DropdownToggle = (DropdownToggle_DropdownToggle);\n;// CONCATENATED MODULE: ./node_modules/react-bootstrap/esm/Dropdown.js\n"use client";\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst Dropdown_Dropdown = /*#__PURE__*/react.forwardRef((pProps, ref) => {\n const {\n bsPrefix,\n drop = \'down\',\n show,\n className,\n align = \'start\',\n onSelect,\n onToggle,\n focusFirstItemOnShow,\n // Need to define the default "as" during prop destructuring to be compatible with styled-components github.com/react-bootstrap/react-bootstrap/issues/3595\n as: Component = \'div\',\n navbar: _4,\n autoClose = true,\n ...props\n } = useUncontrolled(pProps, {\n show: \'onToggle\'\n });\n const isInputGroup = (0,react.useContext)(InputGroupContext);\n const prefix = useBootstrapPrefix(bsPrefix, \'dropdown\');\n const isRTL = useIsRTL();\n const isClosingPermitted = source => {\n // autoClose=false only permits close on button click\n if (autoClose === false) return source === \'click\';\n\n // autoClose=inside doesn\'t permit close on rootClose\n if (autoClose === \'inside\') return source !== \'rootClose\';\n\n // autoClose=outside doesn\'t permit close on select\n if (autoClose === \'outside\') return source !== \'select\';\n return true;\n };\n const handleToggle = useEventCallback((nextShow, meta) => {\n if (meta.originalEvent.currentTarget === document && (meta.source !== \'keydown\' || meta.originalEvent.key === \'Escape\')) meta.source = \'rootClose\';\n if (isClosingPermitted(meta.source)) onToggle == null ? void 0 : onToggle(nextShow, meta);\n });\n const alignEnd = align === \'end\';\n const placement = getDropdownMenuPlacement(alignEnd, drop, isRTL);\n const contextValue = (0,react.useMemo)(() => ({\n align,\n drop,\n isRTL\n }), [align, drop, isRTL]);\n const directionClasses = {\n down: prefix,\n \'down-centered\': `${prefix}-center`,\n up: \'dropup\',\n \'up-centered\': \'dropup-center dropup\',\n end: \'dropend\',\n start: \'dropstart\'\n };\n return /*#__PURE__*/(0,jsx_runtime.jsx)(react_bootstrap_esm_DropdownContext.Provider, {\n value: contextValue,\n children: /*#__PURE__*/(0,jsx_runtime.jsx)(esm_Dropdown, {\n placement: placement,\n show: show,\n onSelect: onSelect,\n onToggle: handleToggle,\n focusFirstItemOnShow: focusFirstItemOnShow,\n itemSelector: `.${prefix}-item:not(.disabled):not(:disabled)`,\n children: isInputGroup ? props.children : /*#__PURE__*/(0,jsx_runtime.jsx)(Component, {\n ...props,\n ref: ref,\n className: classnames_default()(className, show && \'show\', directionClasses[drop])\n })\n })\n });\n});\nDropdown_Dropdown.displayName = \'Dropdown\';\n/* harmony default export */ const react_bootstrap_esm_Dropdown = (Object.assign(Dropdown_Dropdown, {\n Toggle: react_bootstrap_esm_DropdownToggle,\n Menu: react_bootstrap_esm_DropdownMenu,\n Item: react_bootstrap_esm_DropdownItem,\n ItemText: esm_DropdownItemText,\n Divider: esm_DropdownDivider,\n Header: esm_DropdownHeader\n}));\n;// CONCATENATED MODULE: ./node_modules/react-bootstrap/esm/NavDropdown.js\n"use client";\n\n\n\n\n\n\n\n\nconst NavDropdown = /*#__PURE__*/react.forwardRef(({\n id,\n title,\n children,\n bsPrefix,\n className,\n rootCloseEvent,\n menuRole,\n disabled,\n active,\n renderMenuOnMount,\n menuVariant,\n ...props\n}, ref) => {\n /* NavItem has no additional logic, it\'s purely presentational. Can set nav item class here to support "as" */\n const navItemPrefix = useBootstrapPrefix(undefined, \'nav-item\');\n return /*#__PURE__*/(0,jsx_runtime.jsxs)(react_bootstrap_esm_Dropdown, {\n ref: ref,\n ...props,\n className: classnames_default()(className, navItemPrefix),\n children: [/*#__PURE__*/(0,jsx_runtime.jsx)(react_bootstrap_esm_Dropdown.Toggle, {\n id: id,\n eventKey: null,\n active: active,\n disabled: disabled,\n childBsPrefix: bsPrefix,\n as: esm_NavLink,\n children: title\n }), /*#__PURE__*/(0,jsx_runtime.jsx)(react_bootstrap_esm_Dropdown.Menu, {\n role: menuRole,\n renderOnMount: renderMenuOnMount,\n rootCloseEvent: rootCloseEvent,\n variant: menuVariant,\n children: children\n })]\n });\n});\nNavDropdown.displayName = \'NavDropdown\';\n/* harmony default export */ const esm_NavDropdown = (Object.assign(NavDropdown, {\n Item: react_bootstrap_esm_Dropdown.Item,\n ItemText: react_bootstrap_esm_Dropdown.ItemText,\n Divider: react_bootstrap_esm_Dropdown.Divider,\n Header: react_bootstrap_esm_Dropdown.Header\n}));\n;// CONCATENATED MODULE: ./src/app/layout/layout.js\n\n\n\nfunction Layout() {\n return /*#__PURE__*/react.createElement(react.Fragment, null, /*#__PURE__*/react.createElement(esm_Navbar, {\n expand: "lg",\n bg: "primary",\n "data-bs-theme": "dark"\n }, /*#__PURE__*/react.createElement(esm_Container, {\n fluid: true\n }, /*#__PURE__*/react.createElement(esm_Navbar.Brand, {\n href: "#home"\n }, "Polaris Dashboard"), /*#__PURE__*/react.createElement(esm_Navbar.Toggle, {\n "aria-controls": "basic-navbar-nav"\n }), /*#__PURE__*/react.createElement(esm_Navbar.Collapse, {\n id: "basic-navbar-nav"\n }, /*#__PURE__*/react.createElement(react_bootstrap_esm_Nav, {\n className: "me-auto"\n }, /*#__PURE__*/react.createElement(react_bootstrap_esm_Nav.Link, {\n href: "/dashboard/1"\n }, "Home"), /*#__PURE__*/react.createElement(react_bootstrap_esm_Nav.Link, {\n href: "#link"\n }, "Datenerfassung"), /*#__PURE__*/react.createElement(esm_NavDropdown, {\n title: "Dashboards",\n id: "basic-nav-dropdown"\n }, /*#__PURE__*/react.createElement(esm_NavDropdown.Item, {\n href: "#action/3.1"\n }, "Dashboard 1"), /*#__PURE__*/react.createElement(esm_NavDropdown.Item, {\n href: "#action/3.2"\n }, "Dashboard Moodle"), /*#__PURE__*/react.createElement(esm_NavDropdown.Item, {\n href: "#action/3.3"\n }, "Dashboard Lernerfolg")), /*#__PURE__*/react.createElement(esm_NavDropdown, {\n title: "Entwickler Tools",\n id: "basic-nav-dropdown"\n }, /*#__PURE__*/react.createElement(esm_NavDropdown.Item, {\n href: "#action/3.1"\n }, "xAPI Statements Viewer")))))), /*#__PURE__*/react.createElement(Outlet, null));\n}\n;// CONCATENATED MODULE: ./src/app/layout/errorpage.js\n\n\nfunction ErrorPage() {\n var error = useRouteError();\n console.error(error);\n return /*#__PURE__*/react.createElement("div", {\n id: "error-page"\n }, /*#__PURE__*/react.createElement("h1", null, "Oops!"), /*#__PURE__*/react.createElement("p", null, "Sorry, an unexpected error has occurred."), /*#__PURE__*/react.createElement("p", null, /*#__PURE__*/react.createElement("i", null, error.statusText || error.message)));\n}\n// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!../src/css/styles.scss\nvar styles = __webpack_require__(254);\n;// CONCATENATED MODULE: ../src/css/styles.scss\n\n \n \n \n \n \n \n \n \n \n\nvar styles_options = {};\n\nstyles_options.styleTagTransform = (styleTagTransform_default());\nstyles_options.setAttributes = (setAttributesWithoutAttributes_default());\n\n styles_options.insert = insertBySelector_default().bind(null, "head");\n \nstyles_options.domAPI = (styleDomAPI_default());\nstyles_options.insertStyleElement = (insertStyleElement_default());\n\nvar styles_update = injectStylesIntoStyleTag_default()(styles/* default */.Z, styles_options);\n\n\n\n\n /* harmony default export */ const css_styles = (styles/* default */.Z && styles/* default */.Z.locals ? styles/* default */.Z.locals : undefined);\n\n// EXTERNAL MODULE: ../src/js/xapi.js\nvar xapi = __webpack_require__(8190);\n;// CONCATENATED MODULE: ../src/js/dashboard.js\n\nvar polaris_authority;\nfunction polarisDashboard(username, dashboardId, grid) {\n var generatexAPIStatement = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n var xapiCallback = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : null;\n polaris_authority = xApi.IFI.account({\n name: username,\n homePage: \'https://polaris.io/\' + dashboardId\n });\n grid.grid.on(\'added\', function (event, items) {\n console.log("addd");\n var statement = xApi.polaris.completed().actor(polaris_authority);\n console.log(statement.getStatement());\n });\n grid.grid.on(\'drag\', function (event, items) {\n console.log("drag");\n });\n grid.grid.on(\'resize\', function (event, items) {\n console.log("resize");\n var statement = xApi.polaris.resized().actor(polaris_authority);\n console.log(statement.getStatement());\n });\n return authority;\n}\n// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!../node_modules/gridstack/dist/gridstack.min.css\nvar gridstack_min = __webpack_require__(588);\n;// CONCATENATED MODULE: ../node_modules/gridstack/dist/gridstack.min.css\n\n \n \n \n \n \n \n \n \n \n\nvar gridstack_min_options = {};\n\ngridstack_min_options.styleTagTransform = (styleTagTransform_default());\ngridstack_min_options.setAttributes = (setAttributesWithoutAttributes_default());\n\n gridstack_min_options.insert = insertBySelector_default().bind(null, "head");\n \ngridstack_min_options.domAPI = (styleDomAPI_default());\ngridstack_min_options.insertStyleElement = (insertStyleElement_default());\n\nvar gridstack_min_update = injectStylesIntoStyleTag_default()(gridstack_min/* default */.Z, gridstack_min_options);\n\n\n\n\n /* harmony default export */ const dist_gridstack_min = (gridstack_min/* default */.Z && gridstack_min/* default */.Z.locals ? gridstack_min/* default */.Z.locals : undefined);\n\n// EXTERNAL MODULE: ../node_modules/gridstack/dist/gridstack.js\nvar gridstack = __webpack_require__(3624);\n;// CONCATENATED MODULE: ../src/js/utils.js\nfunction _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }\nfunction _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw new Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator["return"] && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a \'" + n + "\' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw new Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, "catch": function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; }\nfunction _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }\nfunction asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }\nfunction _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }\n\n\n\n/**\n * Request analytics engine results from rights engine.\n * @param {*} token\n * @param {*} url\n * @returns\n */\nfunction getResult(_x, _x2) {\n return _getResult.apply(this, arguments);\n}\n\n/**\n * Plots chart in each configured widget.\n * @param {*} nodes\n * @param {*} widgets\n */\nfunction _getResult() {\n _getResult = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(token, url) {\n var response, data;\n return _regeneratorRuntime().wrap(function _callee$(_context) {\n while (1) switch (_context.prev = _context.next) {\n case 0:\n _context.next = 2;\n return fetch(url, {\n headers: {\n Authorization: "Basic ".concat(token)\n }\n });\n case 2:\n response = _context.sent;\n _context.next = 5;\n return response.json();\n case 5:\n data = _context.sent;\n if (!(response.status !== 200)) {\n _context.next = 8;\n break;\n }\n throw Error(data.message);\n case 8:\n return _context.abrupt("return", data);\n case 9:\n case "end":\n return _context.stop();\n }\n }, _callee);\n }));\n return _getResult.apply(this, arguments);\n}\nfunction plotWidgets(nodes, widgets) {\n var _iterator = _createForOfIteratorHelper(nodes),\n _step;\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var node = _step.value;\n if (node.subGrid) {\n // Handle sub grid\n plotWidgets(node.subGrid.engine.nodes, widgets);\n } else {\n var widget = widgets[node.widgetId];\n if (widget) {\n plot(node, widget);\n } else if (node.el.getAttribute("widgetId")) {\n var widgetId = node.el.getAttribute("widgetId");\n plot(node, widgets[widgetId]);\n } else {\n console.error("Couldn\'t find widget by id ".concat(node.widgetId));\n }\n }\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n}\n\n/**\n * Calls plot function on each widget, passing current widget div container width, height and\n * updates widget content with resulting chart svg.\n * @param {*} node\n * @param {*} widget\n */\nfunction plot(node, widget) {\n var content = node.el.querySelector(".grid-stack-item-content");\n content.innerHTML = "";\n var width = content.offsetWidth;\n var height = content.offsetHeight;\n var generated = widget.plot(width, height, content);\n if (generated != null) {\n content.innerHTML = generated;\n }\n}\n\n/**\n * Renders single widget content for available widgets sidebar.\n * @param {*} widget\n * @param {*} widgetId\n * @returns\n */\nfunction createAvWidgetPlaceholder(widget, widgetId, node) {\n var content = node.querySelector(".grid-stack-item-content");\n var generated = widget.plot(400, 400, content);\n if (generated != null) {\n content.innerHTML = generated;\n }\n}\n\n/**\n * Renders all available widgets in sidebar.\n * @param {*} widgets\n */\nfunction drawAvailableWidgets(widgets) {\n var availableWidgets = document.getElementById("available-widgets");\n for (var _i = 0, _Object$keys = Object.keys(widgets); _i < _Object$keys.length; _i++) {\n var widgetId = _Object$keys[_i];\n var div = document.createElement("div");\n availableWidgets.appendChild(div, widgetId);\n div.innerHTML = "<div class=\\"newWidget grid-stack-item\\" widgetId=\\"".concat(widgetId, "\\"><div class=\\"grid-stack-item-content\\"></div></div>");\n createAvWidgetPlaceholder(widgets[widgetId], widgetId, div);\n }\n}\n\n/**\n * Handles widget drag in from sidebar by adding a widget to the widgets grid.\n * @param {*} event\n * @returns\n */\nfunction handleNewWidgetDragIn(event) {\n var parentWithClass = event.srcElement.closest(".newWidget");\n var targetEl = parentWithClass.cloneNode(true);\n targetEl.style.removeProperty("newWidget");\n return targetEl;\n}\n\n/**\n * Removes all child nodes from an HTML node.\n * @param {*} parent\n */\nfunction removeAllChildNodes(parent) {\n while (parent.firstChild) {\n parent.removeChild(parent.firstChild);\n }\n}\n\n/**\n * Initial widgets grid\n * @param {*} initialWidgets\n * @param {*} items\n */\nfunction initGrid(initialWidgets, items) {\n var widgets = initialWidgets;\n // Basic grid object\n var grid = gridstack.GridStack.init({\n cellHeight: 70,\n acceptWidgets: true,\n removable: ".dropzone-remove",\n minRow: 2,\n subGrid: {\n disableOneColumnMode: true,\n minRow: 2,\n cellHeight: 70,\n margin: 5,\n acceptWidgets: true,\n // will accept .grid-stack-item by default\n locked: true,\n noResize: true,\n noMove: true,\n removable: ".dropzone-remove"\n },\n subGridDynamic: true\n });\n\n // Enables widget resize and movement on grid\n function enableWidgetMoveAndResize() {\n grid.enableResize(true);\n grid.enableMove(true);\n grid.engine.nodes.map(function (e) {\n if (e.subGrid) {\n e.subGrid.enableResize(true);\n e.subGrid.enableMove(true);\n }\n });\n }\n\n // Disables widget resize and movement on grid\n function disableWidgetMoveAndResize() {\n grid.enableResize(false);\n grid.enableMove(false);\n grid.engine.nodes.map(function (e) {\n if (e.subGrid) {\n e.subGrid.enableResize(false);\n e.subGrid.enableMove(false);\n }\n });\n }\n grid.load(items);\n grid.setAnimation(false);\n addResizeListener(grid);\n plotWidgets(grid.engine.nodes, widgets);\n disableWidgetMoveAndResize();\n\n // Add resize listener for subgrid\n grid.engine.nodes.map(function (e) {\n if (e.subGrid) {\n e.subGrid.on("resizestop", function (event, el) {\n plotWidgets(grid.engine.nodes, widgets);\n });\n }\n });\n\n // Rerender all widgets on widget removal\n grid.on("removed change", function (e, items) {\n plotWidgets(grid.engine.nodes, widgets);\n });\n\n // Rerender all widgets when adding a new widget\n grid.on("added", function (e, items) {\n plotWidgets(grid.engine.nodes, widgets);\n });\n\n // Create resize event listener and rerenders all widgets on resize\n function addResizeListener(grid) {\n window.addEventListener("resize", function (event) {\n plotWidgets(grid.engine.nodes, widgets);\n }, true);\n }\n\n /**\n * Handle sidebar toggle, including enabeling/disabeling widget resize and movement.\n */\n function toggleSidebar() {\n var sidebar = document.getElementById("sidebar");\n var isVisible = sidebar.className === "sidebar";\n if (isVisible) {\n disableWidgetMoveAndResize();\n sidebar.className = "sidebar-hidden";\n var avWidgets = document.getElementById("available-widgets");\n removeAllChildNodes(avWidgets);\n plotWidgets(grid.engine.nodes, widgets);\n } else {\n sidebar.className = "sidebar";\n drawAvailableWidgets(widgets);\n gridstack.GridStack.setupDragIn(".newWidget", {\n revert: "invalid",\n scroll: false,\n appendTo: "body",\n helper: handleNewWidgetDragIn\n });\n enableWidgetMoveAndResize();\n plotWidgets(grid.engine.nodes, widgets);\n }\n }\n\n /**\n * Saves current grid configuration. The returned grid configuration can be loaded later (e.g. when the user revisited the dashboard).\n * @returns grid configuration\n */\n function save() {\n var oldGrid = grid.save();\n return oldGrid.map(function (item) {\n if (item.subGrid) {\n return {\n x: item.x,\n y: item.y,\n w: item.w,\n h: item.h,\n subGrid: {\n x: item.subGrid.x,\n y: item.subGrid.y,\n w: item.subGrid.w,\n h: item.subGrid.h,\n children: item.subGrid.children.map(function (e) {\n return {\n x: e.x,\n y: e.y,\n w: e.w,\n h: e.h,\n widgetId: e.widgetId\n };\n })\n }\n };\n } else {\n return {\n x: item.x,\n y: item.y,\n w: item.w,\n h: item.h,\n widgetId: item.widgetId\n };\n }\n });\n }\n\n /**\n * Loads a grid configuration. Should be used along with the save function.\n * @param {*} items\n */\n function load(items) {\n grid.removeAll();\n grid.load(items);\n plotWidgets(grid.engine.nodes, widgets);\n disableWidgetMoveAndResize();\n }\n\n /**\n * Refresh widgets with updated widgets array.\n * @param {*} newWidgets\n */\n function refreshWidgets(newWidgets) {\n widgets = newWidgets;\n plotWidgets(grid.engine.nodes, widgets);\n }\n return {\n grid: grid,\n toggleSidebar: toggleSidebar,\n save: save,\n load: load,\n enableWidgetMoveAndResize: enableWidgetMoveAndResize,\n disableWidgetMoveAndResize: disableWidgetMoveAndResize,\n refreshWidgets: refreshWidgets\n };\n}\n;// CONCATENATED MODULE: ../node_modules/d3-array/src/extent.js\nfunction extent(values, valueof) {\n let min;\n let max;\n if (valueof === undefined) {\n for (const value of values) {\n if (value != null) {\n if (min === undefined) {\n if (value >= value) min = max = value;\n } else {\n if (min > value) min = value;\n if (max < value) max = value;\n }\n }\n }\n } else {\n let index = -1;\n for (let value of values) {\n if ((value = valueof(value, ++index, values)) != null) {\n if (min === undefined) {\n if (value >= value) min = max = value;\n } else {\n if (min > value) min = value;\n if (max < value) max = value;\n }\n }\n }\n }\n return [min, max];\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-array/src/max.js\nfunction max_max(values, valueof) {\n let max;\n if (valueof === undefined) {\n for (const value of values) {\n if (value != null\n && (max < value || (max === undefined && value >= value))) {\n max = value;\n }\n }\n } else {\n let index = -1;\n for (let value of values) {\n if ((value = valueof(value, ++index, values)) != null\n && (max < value || (max === undefined && value >= value))) {\n max = value;\n }\n }\n }\n return max;\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-array/src/range.js\nfunction range(start, stop, step) {\n start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step;\n\n var i = -1,\n n = Math.max(0, Math.ceil((stop - start) / step)) | 0,\n range = new Array(n);\n\n while (++i < n) {\n range[i] = start + i * step;\n }\n\n return range;\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-array/src/map.js\nfunction map(values, mapper) {\n if (typeof values[Symbol.iterator] !== "function") throw new TypeError("values is not iterable");\n if (typeof mapper !== "function") throw new TypeError("mapper is not a function");\n return Array.from(values, (value, index) => mapper(value, index, values));\n}\n\n;// CONCATENATED MODULE: ../node_modules/internmap/src/index.js\nclass InternMap extends Map {\n constructor(entries, key = keyof) {\n super();\n Object.defineProperties(this, {_intern: {value: new Map()}, _key: {value: key}});\n if (entries != null) for (const [key, value] of entries) this.set(key, value);\n }\n get(key) {\n return super.get(intern_get(this, key));\n }\n has(key) {\n return super.has(intern_get(this, key));\n }\n set(key, value) {\n return super.set(intern_set(this, key), value);\n }\n delete(key) {\n return super.delete(intern_delete(this, key));\n }\n}\n\nclass InternSet extends Set {\n constructor(values, key = keyof) {\n super();\n Object.defineProperties(this, {_intern: {value: new Map()}, _key: {value: key}});\n if (values != null) for (const value of values) this.add(value);\n }\n has(value) {\n return super.has(intern_get(this, value));\n }\n add(value) {\n return super.add(intern_set(this, value));\n }\n delete(value) {\n return super.delete(intern_delete(this, value));\n }\n}\n\nfunction intern_get({_intern, _key}, value) {\n const key = _key(value);\n return _intern.has(key) ? _intern.get(key) : value;\n}\n\nfunction intern_set({_intern, _key}, value) {\n const key = _key(value);\n if (_intern.has(key)) return _intern.get(key);\n _intern.set(key, value);\n return value;\n}\n\nfunction intern_delete({_intern, _key}, value) {\n const key = _key(value);\n if (_intern.has(key)) {\n value = _intern.get(key);\n _intern.delete(key);\n }\n return value;\n}\n\nfunction keyof(value) {\n return value !== null && typeof value === "object" ? value.valueOf() : value;\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-array/src/index.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n // Deprecated; use bin.\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n // Deprecated; use leastIndex.\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n;// CONCATENATED MODULE: ../node_modules/d3-axis/src/identity.js\n/* harmony default export */ function src_identity(x) {\n return x;\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-axis/src/axis.js\n\n\nvar axis_top = 1,\n axis_right = 2,\n axis_bottom = 3,\n axis_left = 4,\n epsilon = 1e-6;\n\nfunction translateX(x) {\n return "translate(" + x + ",0)";\n}\n\nfunction translateY(y) {\n return "translate(0," + y + ")";\n}\n\nfunction number(scale) {\n return d => +scale(d);\n}\n\nfunction center(scale, offset) {\n offset = Math.max(0, scale.bandwidth() - offset * 2) / 2;\n if (scale.round()) offset = Math.round(offset);\n return d => +scale(d) + offset;\n}\n\nfunction entering() {\n return !this.__axis;\n}\n\nfunction axis(orient, scale) {\n var tickArguments = [],\n tickValues = null,\n tickFormat = null,\n tickSizeInner = 6,\n tickSizeOuter = 6,\n tickPadding = 3,\n offset = typeof window !== "undefined" && window.devicePixelRatio > 1 ? 0 : 0.5,\n k = orient === axis_top || orient === axis_left ? -1 : 1,\n x = orient === axis_left || orient === axis_right ? "x" : "y",\n transform = orient === axis_top || orient === axis_bottom ? translateX : translateY;\n\n function axis(context) {\n var values = tickValues == null ? (scale.ticks ? scale.ticks.apply(scale, tickArguments) : scale.domain()) : tickValues,\n format = tickFormat == null ? (scale.tickFormat ? scale.tickFormat.apply(scale, tickArguments) : src_identity) : tickFormat,\n spacing = Math.max(tickSizeInner, 0) + tickPadding,\n range = scale.range(),\n range0 = +range[0] + offset,\n range1 = +range[range.length - 1] + offset,\n position = (scale.bandwidth ? center : number)(scale.copy(), offset),\n selection = context.selection ? context.selection() : context,\n path = selection.selectAll(".domain").data([null]),\n tick = selection.selectAll(".tick").data(values, scale).order(),\n tickExit = tick.exit(),\n tickEnter = tick.enter().append("g").attr("class", "tick"),\n line = tick.select("line"),\n text = tick.select("text");\n\n path = path.merge(path.enter().insert("path", ".tick")\n .attr("class", "domain")\n .attr("stroke", "currentColor"));\n\n tick = tick.merge(tickEnter);\n\n line = line.merge(tickEnter.append("line")\n .attr("stroke", "currentColor")\n .attr(x + "2", k * tickSizeInner));\n\n text = text.merge(tickEnter.append("text")\n .attr("fill", "currentColor")\n .attr(x, k * spacing)\n .attr("dy", orient === axis_top ? "0em" : orient === axis_bottom ? "0.71em" : "0.32em"));\n\n if (context !== selection) {\n path = path.transition(context);\n tick = tick.transition(context);\n line = line.transition(context);\n text = text.transition(context);\n\n tickExit = tickExit.transition(context)\n .attr("opacity", epsilon)\n .attr("transform", function(d) { return isFinite(d = position(d)) ? transform(d + offset) : this.getAttribute("transform"); });\n\n tickEnter\n .attr("opacity", epsilon)\n .attr("transform", function(d) { var p = this.parentNode.__axis; return transform((p && isFinite(p = p(d)) ? p : position(d)) + offset); });\n }\n\n tickExit.remove();\n\n path\n .attr("d", orient === axis_left || orient === axis_right\n ? (tickSizeOuter ? "M" + k * tickSizeOuter + "," + range0 + "H" + offset + "V" + range1 + "H" + k * tickSizeOuter : "M" + offset + "," + range0 + "V" + range1)\n : (tickSizeOuter ? "M" + range0 + "," + k * tickSizeOuter + "V" + offset + "H" + range1 + "V" + k * tickSizeOuter : "M" + range0 + "," + offset + "H" + range1));\n\n tick\n .attr("opacity", 1)\n .attr("transform", function(d) { return transform(position(d) + offset); });\n\n line\n .attr(x + "2", k * tickSizeInner);\n\n text\n .attr(x, k * spacing)\n .text(format);\n\n selection.filter(entering)\n .attr("fill", "none")\n .attr("font-size", 10)\n .attr("font-family", "sans-serif")\n .attr("text-anchor", orient === axis_right ? "start" : orient === axis_left ? "end" : "middle");\n\n selection\n .each(function() { this.__axis = position; });\n }\n\n axis.scale = function(_) {\n return arguments.length ? (scale = _, axis) : scale;\n };\n\n axis.ticks = function() {\n return tickArguments = Array.from(arguments), axis;\n };\n\n axis.tickArguments = function(_) {\n return arguments.length ? (tickArguments = _ == null ? [] : Array.from(_), axis) : tickArguments.slice();\n };\n\n axis.tickValues = function(_) {\n return arguments.length ? (tickValues = _ == null ? null : Array.from(_), axis) : tickValues && tickValues.slice();\n };\n\n axis.tickFormat = function(_) {\n return arguments.length ? (tickFormat = _, axis) : tickFormat;\n };\n\n axis.tickSize = function(_) {\n return arguments.length ? (tickSizeInner = tickSizeOuter = +_, axis) : tickSizeInner;\n };\n\n axis.tickSizeInner = function(_) {\n return arguments.length ? (tickSizeInner = +_, axis) : tickSizeInner;\n };\n\n axis.tickSizeOuter = function(_) {\n return arguments.length ? (tickSizeOuter = +_, axis) : tickSizeOuter;\n };\n\n axis.tickPadding = function(_) {\n return arguments.length ? (tickPadding = +_, axis) : tickPadding;\n };\n\n axis.offset = function(_) {\n return arguments.length ? (offset = +_, axis) : offset;\n };\n\n return axis;\n}\n\nfunction axisTop(scale) {\n return axis(axis_top, scale);\n}\n\nfunction axisRight(scale) {\n return axis(axis_right, scale);\n}\n\nfunction axisBottom(scale) {\n return axis(axis_bottom, scale);\n}\n\nfunction axisLeft(scale) {\n return axis(axis_left, scale);\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-axis/src/index.js\n\n\n;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selector.js\nfunction none() {}\n\n/* harmony default export */ function selector(selector) {\n return selector == null ? none : function() {\n return this.querySelector(selector);\n };\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/select.js\n\n\n\n/* harmony default export */ function selection_select(select) {\n if (typeof select !== "function") select = selector(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {\n if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {\n if ("__data__" in node) subnode.__data__ = node.__data__;\n subgroup[i] = subnode;\n }\n }\n }\n\n return new Selection(subgroups, this._parents);\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-selection/src/array.js\n// Given something array like (or null), returns something that is strictly an\n// array. This is used to ensure that array-like objects passed to d3.selectAll\n// or selection.selectAll are converted into proper arrays when creating a\n// selection; we don’t ever want to create a selection backed by a live\n// HTMLCollection or NodeList. However, note that selection.selectAll will use a\n// static NodeList as a group, since it safely derived from querySelectorAll.\nfunction array(x) {\n return x == null ? [] : Array.isArray(x) ? x : Array.from(x);\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selectorAll.js\nfunction empty() {\n return [];\n}\n\n/* harmony default export */ function selectorAll(selector) {\n return selector == null ? empty : function() {\n return this.querySelectorAll(selector);\n };\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/selectAll.js\n\n\n\n\nfunction arrayAll(select) {\n return function() {\n return array(select.apply(this, arguments));\n };\n}\n\n/* harmony default export */ function selectAll(select) {\n if (typeof select === "function") select = arrayAll(select);\n else select = selectorAll(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n subgroups.push(select.call(node, node.__data__, i, group));\n parents.push(node);\n }\n }\n }\n\n return new Selection(subgroups, parents);\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-selection/src/matcher.js\n/* harmony default export */ function matcher(selector) {\n return function() {\n return this.matches(selector);\n };\n}\n\nfunction childMatcher(selector) {\n return function(node) {\n return node.matches(selector);\n };\n}\n\n\n;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/selectChild.js\n\n\nvar selectChild_find = Array.prototype.find;\n\nfunction childFind(match) {\n return function() {\n return selectChild_find.call(this.children, match);\n };\n}\n\nfunction childFirst() {\n return this.firstElementChild;\n}\n\n/* harmony default export */ function selectChild(match) {\n return this.select(match == null ? childFirst\n : childFind(typeof match === "function" ? match : childMatcher(match)));\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/selectChildren.js\n\n\nvar filter = Array.prototype.filter;\n\nfunction children() {\n return Array.from(this.children);\n}\n\nfunction childrenFilter(match) {\n return function() {\n return filter.call(this.children, match);\n };\n}\n\n/* harmony default export */ function selectChildren(match) {\n return this.selectAll(match == null ? children\n : childrenFilter(typeof match === "function" ? match : childMatcher(match)));\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/filter.js\n\n\n\n/* harmony default export */ function selection_filter(match) {\n if (typeof match !== "function") match = matcher(match);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {\n if ((node = group[i]) && match.call(node, node.__data__, i, group)) {\n subgroup.push(node);\n }\n }\n }\n\n return new Selection(subgroups, this._parents);\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/sparse.js\n/* harmony default export */ function sparse(update) {\n return new Array(update.length);\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/enter.js\n\n\n\n/* harmony default export */ function enter() {\n return new Selection(this._enter || this._groups.map(sparse), this._parents);\n}\n\nfunction EnterNode(parent, datum) {\n this.ownerDocument = parent.ownerDocument;\n this.namespaceURI = parent.namespaceURI;\n this._next = null;\n this._parent = parent;\n this.__data__ = datum;\n}\n\nEnterNode.prototype = {\n constructor: EnterNode,\n appendChild: function(child) { return this._parent.insertBefore(child, this._next); },\n insertBefore: function(child, next) { return this._parent.insertBefore(child, next); },\n querySelector: function(selector) { return this._parent.querySelector(selector); },\n querySelectorAll: function(selector) { return this._parent.querySelectorAll(selector); }\n};\n\n;// CONCATENATED MODULE: ../node_modules/d3-selection/src/constant.js\n/* harmony default export */ function src_constant(x) {\n return function() {\n return x;\n };\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/data.js\n\n\n\n\nfunction bindIndex(parent, group, enter, update, exit, data) {\n var i = 0,\n node,\n groupLength = group.length,\n dataLength = data.length;\n\n // Put any non-null nodes that fit into update.\n // Put any null nodes into enter.\n // Put any remaining data into enter.\n for (; i < dataLength; ++i) {\n if (node = group[i]) {\n node.__data__ = data[i];\n update[i] = node;\n } else {\n enter[i] = new EnterNode(parent, data[i]);\n }\n }\n\n // Put any non-null nodes that don’t fit into exit.\n for (; i < groupLength; ++i) {\n if (node = group[i]) {\n exit[i] = node;\n }\n }\n}\n\nfunction bindKey(parent, group, enter, update, exit, data, key) {\n var i,\n node,\n nodeByKeyValue = new Map,\n groupLength = group.length,\n dataLength = data.length,\n keyValues = new Array(groupLength),\n keyValue;\n\n // Compute the key for each node.\n // If multiple nodes have the same key, the duplicates are added to exit.\n for (i = 0; i < groupLength; ++i) {\n if (node = group[i]) {\n keyValues[i] = keyValue = key.call(node, node.__data__, i, group) + "";\n if (nodeByKeyValue.has(keyValue)) {\n exit[i] = node;\n } else {\n nodeByKeyValue.set(keyValue, node);\n }\n }\n }\n\n // Compute the key for each datum.\n // If there a node associated with this key, join and add it to update.\n // If there is not (or the key is a duplicate), add it to enter.\n for (i = 0; i < dataLength; ++i) {\n keyValue = key.call(parent, data[i], i, data) + "";\n if (node = nodeByKeyValue.get(keyValue)) {\n update[i] = node;\n node.__data__ = data[i];\n nodeByKeyValue.delete(keyValue);\n } else {\n enter[i] = new EnterNode(parent, data[i]);\n }\n }\n\n // Add any remaining nodes that were not bound to data to exit.\n for (i = 0; i < groupLength; ++i) {\n if ((node = group[i]) && (nodeByKeyValue.get(keyValues[i]) === node)) {\n exit[i] = node;\n }\n }\n}\n\nfunction datum(node) {\n return node.__data__;\n}\n\n/* harmony default export */ function data(value, key) {\n if (!arguments.length) return Array.from(this, datum);\n\n var bind = key ? bindKey : bindIndex,\n parents = this._parents,\n groups = this._groups;\n\n if (typeof value !== "function") value = src_constant(value);\n\n for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) {\n var parent = parents[j],\n group = groups[j],\n groupLength = group.length,\n data = arraylike(value.call(parent, parent && parent.__data__, j, parents)),\n dataLength = data.length,\n enterGroup = enter[j] = new Array(dataLength),\n updateGroup = update[j] = new Array(dataLength),\n exitGroup = exit[j] = new Array(groupLength);\n\n bind(parent, group, enterGroup, updateGroup, exitGroup, data, key);\n\n // Now connect the enter nodes to their following update node, such that\n // appendChild can insert the materialized enter node before this node,\n // rather than at the end of the parent node.\n for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) {\n if (previous = enterGroup[i0]) {\n if (i0 >= i1) i1 = i0 + 1;\n while (!(next = updateGroup[i1]) && ++i1 < dataLength);\n previous._next = next || null;\n }\n }\n }\n\n update = new Selection(update, parents);\n update._enter = enter;\n update._exit = exit;\n return update;\n}\n\n// Given some data, this returns an array-like view of it: an object that\n// exposes a length property and allows numeric indexing. Note that unlike\n// selectAll, this isn’t worried about “live” collections because the resulting\n// array will only be used briefly while data is being bound. (It is possible to\n// cause the data to change while iterating by using a key function, but please\n// don’t; we’d rather avoid a gratuitous copy.)\nfunction arraylike(data) {\n return typeof data === "object" && "length" in data\n ? data // Array, TypedArray, NodeList, array-like\n : Array.from(data); // Map, Set, iterable, string, or anything else\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/exit.js\n\n\n\n/* harmony default export */ function exit() {\n return new Selection(this._exit || this._groups.map(sparse), this._parents);\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/join.js\n/* harmony default export */ function join(onenter, onupdate, onexit) {\n var enter = this.enter(), update = this, exit = this.exit();\n if (typeof onenter === "function") {\n enter = onenter(enter);\n if (enter) enter = enter.selection();\n } else {\n enter = enter.append(onenter + "");\n }\n if (onupdate != null) {\n update = onupdate(update);\n if (update) update = update.selection();\n }\n if (onexit == null) exit.remove(); else onexit(exit);\n return enter && update ? enter.merge(update).order() : update;\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/merge.js\n\n\n/* harmony default export */ function merge(context) {\n var selection = context.selection ? context.selection() : context;\n\n for (var groups0 = this._groups, groups1 = selection._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {\n for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group0[i] || group1[i]) {\n merge[i] = node;\n }\n }\n }\n\n for (; j < m0; ++j) {\n merges[j] = groups0[j];\n }\n\n return new Selection(merges, this._parents);\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/order.js\n/* harmony default export */ function selection_order() {\n\n for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) {\n for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) {\n if (node = group[i]) {\n if (next && node.compareDocumentPosition(next) ^ 4) next.parentNode.insertBefore(node, next);\n next = node;\n }\n }\n }\n\n return this;\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/sort.js\n\n\n/* harmony default export */ function sort(compare) {\n if (!compare) compare = ascending;\n\n function compareNode(a, b) {\n return a && b ? compare(a.__data__, b.__data__) : !a - !b;\n }\n\n for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n sortgroup[i] = node;\n }\n }\n sortgroup.sort(compareNode);\n }\n\n return new Selection(sortgroups, this._parents).order();\n}\n\nfunction ascending(a, b) {\n return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/call.js\n/* harmony default export */ function call() {\n var callback = arguments[0];\n arguments[0] = this;\n callback.apply(null, arguments);\n return this;\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/nodes.js\n/* harmony default export */ function nodes() {\n return Array.from(this);\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/node.js\n/* harmony default export */ function node() {\n\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n for (var group = groups[j], i = 0, n = group.length; i < n; ++i) {\n var node = group[i];\n if (node) return node;\n }\n }\n\n return null;\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/size.js\n/* harmony default export */ function size() {\n let size = 0;\n for (const node of this) ++size; // eslint-disable-line no-unused-vars\n return size;\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/empty.js\n/* harmony default export */ function selection_empty() {\n return !this.node();\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/each.js\n/* harmony default export */ function each(callback) {\n\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {\n if (node = group[i]) callback.call(node, node.__data__, i, group);\n }\n }\n\n return this;\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-selection/src/namespaces.js\nvar xhtml = "http://www.w3.org/1999/xhtml";\n\n/* harmony default export */ const namespaces = ({\n svg: "http://www.w3.org/2000/svg",\n xhtml: xhtml,\n xlink: "http://www.w3.org/1999/xlink",\n xml: "http://www.w3.org/XML/1998/namespace",\n xmlns: "http://www.w3.org/2000/xmlns/"\n});\n\n;// CONCATENATED MODULE: ../node_modules/d3-selection/src/namespace.js\n\n\n/* harmony default export */ function namespace(name) {\n var prefix = name += "", i = prefix.indexOf(":");\n if (i >= 0 && (prefix = name.slice(0, i)) !== "xmlns") name = name.slice(i + 1);\n return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], local: name} : name; // eslint-disable-line no-prototype-builtins\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/attr.js\n\n\nfunction attrRemove(name) {\n return function() {\n this.removeAttribute(name);\n };\n}\n\nfunction attrRemoveNS(fullname) {\n return function() {\n this.removeAttributeNS(fullname.space, fullname.local);\n };\n}\n\nfunction attrConstant(name, value) {\n return function() {\n this.setAttribute(name, value);\n };\n}\n\nfunction attrConstantNS(fullname, value) {\n return function() {\n this.setAttributeNS(fullname.space, fullname.local, value);\n };\n}\n\nfunction attrFunction(name, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.removeAttribute(name);\n else this.setAttribute(name, v);\n };\n}\n\nfunction attrFunctionNS(fullname, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.removeAttributeNS(fullname.space, fullname.local);\n else this.setAttributeNS(fullname.space, fullname.local, v);\n };\n}\n\n/* harmony default export */ function attr(name, value) {\n var fullname = namespace(name);\n\n if (arguments.length < 2) {\n var node = this.node();\n return fullname.local\n ? node.getAttributeNS(fullname.space, fullname.local)\n : node.getAttribute(fullname);\n }\n\n return this.each((value == null\n ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === "function"\n ? (fullname.local ? attrFunctionNS : attrFunction)\n : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value));\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-selection/src/window.js\n/* harmony default export */ function src_window(node) {\n return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node\n || (node.document && node) // node is a Window\n || node.defaultView; // node is a Document\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/style.js\n\n\nfunction styleRemove(name) {\n return function() {\n this.style.removeProperty(name);\n };\n}\n\nfunction styleConstant(name, value, priority) {\n return function() {\n this.style.setProperty(name, value, priority);\n };\n}\n\nfunction styleFunction(name, value, priority) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.style.removeProperty(name);\n else this.style.setProperty(name, v, priority);\n };\n}\n\n/* harmony default export */ function selection_style(name, value, priority) {\n return arguments.length > 1\n ? this.each((value == null\n ? styleRemove : typeof value === "function"\n ? styleFunction\n : styleConstant)(name, value, priority == null ? "" : priority))\n : styleValue(this.node(), name);\n}\n\nfunction styleValue(node, name) {\n return node.style.getPropertyValue(name)\n || src_window(node).getComputedStyle(node, null).getPropertyValue(name);\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/property.js\nfunction propertyRemove(name) {\n return function() {\n delete this[name];\n };\n}\n\nfunction propertyConstant(name, value) {\n return function() {\n this[name] = value;\n };\n}\n\nfunction propertyFunction(name, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) delete this[name];\n else this[name] = v;\n };\n}\n\n/* harmony default export */ function property(name, value) {\n return arguments.length > 1\n ? this.each((value == null\n ? propertyRemove : typeof value === "function"\n ? propertyFunction\n : propertyConstant)(name, value))\n : this.node()[name];\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/classed.js\nfunction classArray(string) {\n return string.trim().split(/^|\\s+/);\n}\n\nfunction classList(node) {\n return node.classList || new ClassList(node);\n}\n\nfunction ClassList(node) {\n this._node = node;\n this._names = classArray(node.getAttribute("class") || "");\n}\n\nClassList.prototype = {\n add: function(name) {\n var i = this._names.indexOf(name);\n if (i < 0) {\n this._names.push(name);\n this._node.setAttribute("class", this._names.join(" "));\n }\n },\n remove: function(name) {\n var i = this._names.indexOf(name);\n if (i >= 0) {\n this._names.splice(i, 1);\n this._node.setAttribute("class", this._names.join(" "));\n }\n },\n contains: function(name) {\n return this._names.indexOf(name) >= 0;\n }\n};\n\nfunction classedAdd(node, names) {\n var list = classList(node), i = -1, n = names.length;\n while (++i < n) list.add(names[i]);\n}\n\nfunction classedRemove(node, names) {\n var list = classList(node), i = -1, n = names.length;\n while (++i < n) list.remove(names[i]);\n}\n\nfunction classedTrue(names) {\n return function() {\n classedAdd(this, names);\n };\n}\n\nfunction classedFalse(names) {\n return function() {\n classedRemove(this, names);\n };\n}\n\nfunction classedFunction(names, value) {\n return function() {\n (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names);\n };\n}\n\n/* harmony default export */ function classed(name, value) {\n var names = classArray(name + "");\n\n if (arguments.length < 2) {\n var list = classList(this.node()), i = -1, n = names.length;\n while (++i < n) if (!list.contains(names[i])) return false;\n return true;\n }\n\n return this.each((typeof value === "function"\n ? classedFunction : value\n ? classedTrue\n : classedFalse)(names, value));\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/text.js\nfunction textRemove() {\n this.textContent = "";\n}\n\nfunction textConstant(value) {\n return function() {\n this.textContent = value;\n };\n}\n\nfunction textFunction(value) {\n return function() {\n var v = value.apply(this, arguments);\n this.textContent = v == null ? "" : v;\n };\n}\n\n/* harmony default export */ function selection_text(value) {\n return arguments.length\n ? this.each(value == null\n ? textRemove : (typeof value === "function"\n ? textFunction\n : textConstant)(value))\n : this.node().textContent;\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/html.js\nfunction htmlRemove() {\n this.innerHTML = "";\n}\n\nfunction htmlConstant(value) {\n return function() {\n this.innerHTML = value;\n };\n}\n\nfunction htmlFunction(value) {\n return function() {\n var v = value.apply(this, arguments);\n this.innerHTML = v == null ? "" : v;\n };\n}\n\n/* harmony default export */ function html(value) {\n return arguments.length\n ? this.each(value == null\n ? htmlRemove : (typeof value === "function"\n ? htmlFunction\n : htmlConstant)(value))\n : this.node().innerHTML;\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/raise.js\nfunction raise() {\n if (this.nextSibling) this.parentNode.appendChild(this);\n}\n\n/* harmony default export */ function selection_raise() {\n return this.each(raise);\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/lower.js\nfunction lower() {\n if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild);\n}\n\n/* harmony default export */ function selection_lower() {\n return this.each(lower);\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-selection/src/creator.js\n\n\n\nfunction creatorInherit(name) {\n return function() {\n var document = this.ownerDocument,\n uri = this.namespaceURI;\n return uri === xhtml && document.documentElement.namespaceURI === xhtml\n ? document.createElement(name)\n : document.createElementNS(uri, name);\n };\n}\n\nfunction creatorFixed(fullname) {\n return function() {\n return this.ownerDocument.createElementNS(fullname.space, fullname.local);\n };\n}\n\n/* harmony default export */ function creator(name) {\n var fullname = namespace(name);\n return (fullname.local\n ? creatorFixed\n : creatorInherit)(fullname);\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/append.js\n\n\n/* harmony default export */ function append(name) {\n var create = typeof name === "function" ? name : creator(name);\n return this.select(function() {\n return this.appendChild(create.apply(this, arguments));\n });\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/insert.js\n\n\n\nfunction constantNull() {\n return null;\n}\n\n/* harmony default export */ function insert(name, before) {\n var create = typeof name === "function" ? name : creator(name),\n select = before == null ? constantNull : typeof before === "function" ? before : selector(before);\n return this.select(function() {\n return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null);\n });\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/remove.js\nfunction remove() {\n var parent = this.parentNode;\n if (parent) parent.removeChild(this);\n}\n\n/* harmony default export */ function selection_remove() {\n return this.each(remove);\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/clone.js\nfunction selection_cloneShallow() {\n var clone = this.cloneNode(false), parent = this.parentNode;\n return parent ? parent.insertBefore(clone, this.nextSibling) : clone;\n}\n\nfunction selection_cloneDeep() {\n var clone = this.cloneNode(true), parent = this.parentNode;\n return parent ? parent.insertBefore(clone, this.nextSibling) : clone;\n}\n\n/* harmony default export */ function clone(deep) {\n return this.select(deep ? selection_cloneDeep : selection_cloneShallow);\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/datum.js\n/* harmony default export */ function selection_datum(value) {\n return arguments.length\n ? this.property("__data__", value)\n : this.node().__data__;\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/on.js\nfunction contextListener(listener) {\n return function(event) {\n listener.call(this, event, this.__data__);\n };\n}\n\nfunction parseTypenames(typenames) {\n return typenames.trim().split(/^|\\s+/).map(function(t) {\n var name = "", i = t.indexOf(".");\n if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);\n return {type: t, name: name};\n });\n}\n\nfunction onRemove(typename) {\n return function() {\n var on = this.__on;\n if (!on) return;\n for (var j = 0, i = -1, m = on.length, o; j < m; ++j) {\n if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) {\n this.removeEventListener(o.type, o.listener, o.options);\n } else {\n on[++i] = o;\n }\n }\n if (++i) on.length = i;\n else delete this.__on;\n };\n}\n\nfunction onAdd(typename, value, options) {\n return function() {\n var on = this.__on, o, listener = contextListener(value);\n if (on) for (var j = 0, m = on.length; j < m; ++j) {\n if ((o = on[j]).type === typename.type && o.name === typename.name) {\n this.removeEventListener(o.type, o.listener, o.options);\n this.addEventListener(o.type, o.listener = listener, o.options = options);\n o.value = value;\n return;\n }\n }\n this.addEventListener(typename.type, listener, options);\n o = {type: typename.type, name: typename.name, value: value, listener: listener, options: options};\n if (!on) this.__on = [o];\n else on.push(o);\n };\n}\n\n/* harmony default export */ function on(typename, value, options) {\n var typenames = parseTypenames(typename + ""), i, n = typenames.length, t;\n\n if (arguments.length < 2) {\n var on = this.node().__on;\n if (on) for (var j = 0, m = on.length, o; j < m; ++j) {\n for (i = 0, o = on[j]; i < n; ++i) {\n if ((t = typenames[i]).type === o.type && t.name === o.name) {\n return o.value;\n }\n }\n }\n return;\n }\n\n on = value ? onAdd : onRemove;\n for (i = 0; i < n; ++i) this.each(on(typenames[i], value, options));\n return this;\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/dispatch.js\n\n\nfunction dispatchEvent(node, type, params) {\n var window = src_window(node),\n event = window.CustomEvent;\n\n if (typeof event === "function") {\n event = new event(type, params);\n } else {\n event = window.document.createEvent("Event");\n if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail;\n else event.initEvent(type, false, false);\n }\n\n node.dispatchEvent(event);\n}\n\nfunction dispatchConstant(type, params) {\n return function() {\n return dispatchEvent(this, type, params);\n };\n}\n\nfunction dispatchFunction(type, params) {\n return function() {\n return dispatchEvent(this, type, params.apply(this, arguments));\n };\n}\n\n/* harmony default export */ function selection_dispatch(type, params) {\n return this.each((typeof params === "function"\n ? dispatchFunction\n : dispatchConstant)(type, params));\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/iterator.js\n/* harmony default export */ function* iterator() {\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {\n if (node = group[i]) yield node;\n }\n }\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/index.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar root = [null];\n\nfunction Selection(groups, parents) {\n this._groups = groups;\n this._parents = parents;\n}\n\nfunction selection() {\n return new Selection([[document.documentElement]], root);\n}\n\nfunction selection_selection() {\n return this;\n}\n\nSelection.prototype = selection.prototype = {\n constructor: Selection,\n select: selection_select,\n selectAll: selectAll,\n selectChild: selectChild,\n selectChildren: selectChildren,\n filter: selection_filter,\n data: data,\n enter: enter,\n exit: exit,\n join: join,\n merge: merge,\n selection: selection_selection,\n order: selection_order,\n sort: sort,\n call: call,\n nodes: nodes,\n node: node,\n size: size,\n empty: selection_empty,\n each: each,\n attr: attr,\n style: selection_style,\n property: property,\n classed: classed,\n text: selection_text,\n html: html,\n raise: selection_raise,\n lower: selection_lower,\n append: append,\n insert: insert,\n remove: selection_remove,\n clone: clone,\n datum: selection_datum,\n on: on,\n dispatch: selection_dispatch,\n [Symbol.iterator]: iterator\n};\n\n/* harmony default export */ const src_selection = (selection);\n\n;// CONCATENATED MODULE: ../node_modules/d3-dispatch/src/dispatch.js\nvar dispatch_noop = {value: () => {}};\n\nfunction dispatch_dispatch() {\n for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) {\n if (!(t = arguments[i] + "") || (t in _) || /[\\s.]/.test(t)) throw new Error("illegal type: " + t);\n _[t] = [];\n }\n return new Dispatch(_);\n}\n\nfunction Dispatch(_) {\n this._ = _;\n}\n\nfunction dispatch_parseTypenames(typenames, types) {\n return typenames.trim().split(/^|\\s+/).map(function(t) {\n var name = "", i = t.indexOf(".");\n if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);\n if (t && !types.hasOwnProperty(t)) throw new Error("unknown type: " + t);\n return {type: t, name: name};\n });\n}\n\nDispatch.prototype = dispatch_dispatch.prototype = {\n constructor: Dispatch,\n on: function(typename, callback) {\n var _ = this._,\n T = dispatch_parseTypenames(typename + "", _),\n t,\n i = -1,\n n = T.length;\n\n // If no callback was specified, return the callback of the given type and name.\n if (arguments.length < 2) {\n while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t;\n return;\n }\n\n // If a type was specified, set the callback for the given type and name.\n // Otherwise, if a null callback was specified, remove callbacks of the given name.\n if (callback != null && typeof callback !== "function") throw new Error("invalid callback: " + callback);\n while (++i < n) {\n if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback);\n else if (callback == null) for (t in _) _[t] = set(_[t], typename.name, null);\n }\n\n return this;\n },\n copy: function() {\n var copy = {}, _ = this._;\n for (var t in _) copy[t] = _[t].slice();\n return new Dispatch(copy);\n },\n call: function(type, that) {\n if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2];\n if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type);\n for (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n },\n apply: function(type, that, args) {\n if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type);\n for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n }\n};\n\nfunction get(type, name) {\n for (var i = 0, n = type.length, c; i < n; ++i) {\n if ((c = type[i]).name === name) {\n return c.value;\n }\n }\n}\n\nfunction set(type, name, callback) {\n for (var i = 0, n = type.length; i < n; ++i) {\n if (type[i].name === name) {\n type[i] = dispatch_noop, type = type.slice(0, i).concat(type.slice(i + 1));\n break;\n }\n }\n if (callback != null) type.push({name: name, value: callback});\n return type;\n}\n\n/* harmony default export */ const src_dispatch = (dispatch_dispatch);\n\n;// CONCATENATED MODULE: ../node_modules/d3-timer/src/timer.js\nvar timer_frame = 0, // is an animation frame pending?\n timeout = 0, // is a timeout pending?\n interval = 0, // are any timers active?\n pokeDelay = 1000, // how frequently we check for clock skew\n taskHead,\n taskTail,\n clockLast = 0,\n clockNow = 0,\n clockSkew = 0,\n clock = typeof performance === "object" && performance.now ? performance : Date,\n setFrame = typeof window === "object" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) { setTimeout(f, 17); };\n\nfunction now() {\n return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);\n}\n\nfunction clearNow() {\n clockNow = 0;\n}\n\nfunction Timer() {\n this._call =\n this._time =\n this._next = null;\n}\n\nTimer.prototype = timer.prototype = {\n constructor: Timer,\n restart: function(callback, delay, time) {\n if (typeof callback !== "function") throw new TypeError("callback is not a function");\n time = (time == null ? now() : +time) + (delay == null ? 0 : +delay);\n if (!this._next && taskTail !== this) {\n if (taskTail) taskTail._next = this;\n else taskHead = this;\n taskTail = this;\n }\n this._call = callback;\n this._time = time;\n sleep();\n },\n stop: function() {\n if (this._call) {\n this._call = null;\n this._time = Infinity;\n sleep();\n }\n }\n};\n\nfunction timer(callback, delay, time) {\n var t = new Timer;\n t.restart(callback, delay, time);\n return t;\n}\n\nfunction timerFlush() {\n now(); // Get the current time, if not already set.\n ++timer_frame; // Pretend we’ve set an alarm, if we haven’t already.\n var t = taskHead, e;\n while (t) {\n if ((e = clockNow - t._time) >= 0) t._call.call(undefined, e);\n t = t._next;\n }\n --timer_frame;\n}\n\nfunction wake() {\n clockNow = (clockLast = clock.now()) + clockSkew;\n timer_frame = timeout = 0;\n try {\n timerFlush();\n } finally {\n timer_frame = 0;\n nap();\n clockNow = 0;\n }\n}\n\nfunction poke() {\n var now = clock.now(), delay = now - clockLast;\n if (delay > pokeDelay) clockSkew -= delay, clockLast = now;\n}\n\nfunction nap() {\n var t0, t1 = taskHead, t2, time = Infinity;\n while (t1) {\n if (t1._call) {\n if (time > t1._time) time = t1._time;\n t0 = t1, t1 = t1._next;\n } else {\n t2 = t1._next, t1._next = null;\n t1 = t0 ? t0._next = t2 : taskHead = t2;\n }\n }\n taskTail = t0;\n sleep(time);\n}\n\nfunction sleep(time) {\n if (timer_frame) return; // Soonest alarm already set, or will be.\n if (timeout) timeout = clearTimeout(timeout);\n var delay = time - clockNow; // Strictly less than if we recomputed clockNow.\n if (delay > 24) {\n if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew);\n if (interval) interval = clearInterval(interval);\n } else {\n if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay);\n timer_frame = 1, setFrame(wake);\n }\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-timer/src/timeout.js\n\n\n/* harmony default export */ function src_timeout(callback, delay, time) {\n var t = new Timer;\n delay = delay == null ? 0 : +delay;\n t.restart(elapsed => {\n t.stop();\n callback(elapsed + delay);\n }, delay, time);\n return t;\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/schedule.js\n\n\n\nvar emptyOn = src_dispatch("start", "end", "cancel", "interrupt");\nvar emptyTween = [];\n\nvar CREATED = 0;\nvar SCHEDULED = 1;\nvar STARTING = 2;\nvar STARTED = 3;\nvar RUNNING = 4;\nvar ENDING = 5;\nvar ENDED = 6;\n\n/* harmony default export */ function schedule(node, name, id, index, group, timing) {\n var schedules = node.__transition;\n if (!schedules) node.__transition = {};\n else if (id in schedules) return;\n create(node, id, {\n name: name,\n index: index, // For context during callback.\n group: group, // For context during callback.\n on: emptyOn,\n tween: emptyTween,\n time: timing.time,\n delay: timing.delay,\n duration: timing.duration,\n ease: timing.ease,\n timer: null,\n state: CREATED\n });\n}\n\nfunction init(node, id) {\n var schedule = schedule_get(node, id);\n if (schedule.state > CREATED) throw new Error("too late; already scheduled");\n return schedule;\n}\n\nfunction schedule_set(node, id) {\n var schedule = schedule_get(node, id);\n if (schedule.state > STARTED) throw new Error("too late; already running");\n return schedule;\n}\n\nfunction schedule_get(node, id) {\n var schedule = node.__transition;\n if (!schedule || !(schedule = schedule[id])) throw new Error("transition not found");\n return schedule;\n}\n\nfunction create(node, id, self) {\n var schedules = node.__transition,\n tween;\n\n // Initialize the self timer when the transition is created.\n // Note the actual delay is not known until the first callback!\n schedules[id] = self;\n self.timer = timer(schedule, 0, self.time);\n\n function schedule(elapsed) {\n self.state = SCHEDULED;\n self.timer.restart(start, self.delay, self.time);\n\n // If the elapsed delay is less than our first sleep, start immediately.\n if (self.delay <= elapsed) start(elapsed - self.delay);\n }\n\n function start(elapsed) {\n var i, j, n, o;\n\n // If the state is not SCHEDULED, then we previously errored on start.\n if (self.state !== SCHEDULED) return stop();\n\n for (i in schedules) {\n o = schedules[i];\n if (o.name !== self.name) continue;\n\n // While this element already has a starting transition during this frame,\n // defer starting an interrupting transition until that transition has a\n // chance to tick (and possibly end); see d3/d3-transition#54!\n if (o.state === STARTED) return src_timeout(start);\n\n // Interrupt the active transition, if any.\n if (o.state === RUNNING) {\n o.state = ENDED;\n o.timer.stop();\n o.on.call("interrupt", node, node.__data__, o.index, o.group);\n delete schedules[i];\n }\n\n // Cancel any pre-empted transitions.\n else if (+i < id) {\n o.state = ENDED;\n o.timer.stop();\n o.on.call("cancel", node, node.__data__, o.index, o.group);\n delete schedules[i];\n }\n }\n\n // Defer the first tick to end of the current frame; see d3/d3#1576.\n // Note the transition may be canceled after start and before the first tick!\n // Note this must be scheduled before the start event; see d3/d3-transition#16!\n // Assuming this is successful, subsequent callbacks go straight to tick.\n src_timeout(function() {\n if (self.state === STARTED) {\n self.state = RUNNING;\n self.timer.restart(tick, self.delay, self.time);\n tick(elapsed);\n }\n });\n\n // Dispatch the start event.\n // Note this must be done before the tween are initialized.\n self.state = STARTING;\n self.on.call("start", node, node.__data__, self.index, self.group);\n if (self.state !== STARTING) return; // interrupted\n self.state = STARTED;\n\n // Initialize the tween, deleting null tween.\n tween = new Array(n = self.tween.length);\n for (i = 0, j = -1; i < n; ++i) {\n if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) {\n tween[++j] = o;\n }\n }\n tween.length = j + 1;\n }\n\n function tick(elapsed) {\n var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.timer.restart(stop), self.state = ENDING, 1),\n i = -1,\n n = tween.length;\n\n while (++i < n) {\n tween[i].call(node, t);\n }\n\n // Dispatch the end event.\n if (self.state === ENDING) {\n self.on.call("end", node, node.__data__, self.index, self.group);\n stop();\n }\n }\n\n function stop() {\n self.state = ENDED;\n self.timer.stop();\n delete schedules[id];\n for (var i in schedules) return; // eslint-disable-line no-unused-vars\n delete node.__transition;\n }\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-transition/src/interrupt.js\n\n\n/* harmony default export */ function src_interrupt(node, name) {\n var schedules = node.__transition,\n schedule,\n active,\n empty = true,\n i;\n\n if (!schedules) return;\n\n name = name == null ? null : name + "";\n\n for (i in schedules) {\n if ((schedule = schedules[i]).name !== name) { empty = false; continue; }\n active = schedule.state > STARTING && schedule.state < ENDING;\n schedule.state = ENDED;\n schedule.timer.stop();\n schedule.on.call(active ? "interrupt" : "cancel", node, node.__data__, schedule.index, schedule.group);\n delete schedules[i];\n }\n\n if (empty) delete node.__transition;\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-transition/src/selection/interrupt.js\n\n\n/* harmony default export */ function selection_interrupt(name) {\n return this.each(function() {\n src_interrupt(this, name);\n });\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-interpolate/src/number.js\n/* harmony default export */ function src_number(a, b) {\n return a = +a, b = +b, function(t) {\n return a * (1 - t) + b * t;\n };\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-interpolate/src/transform/decompose.js\nvar degrees = 180 / Math.PI;\n\nvar decompose_identity = {\n translateX: 0,\n translateY: 0,\n rotate: 0,\n skewX: 0,\n scaleX: 1,\n scaleY: 1\n};\n\n/* harmony default export */ function decompose(a, b, c, d, e, f) {\n var scaleX, scaleY, skewX;\n if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX;\n if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX;\n if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY;\n if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX;\n return {\n translateX: e,\n translateY: f,\n rotate: Math.atan2(b, a) * degrees,\n skewX: Math.atan(skewX) * degrees,\n scaleX: scaleX,\n scaleY: scaleY\n };\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-interpolate/src/transform/parse.js\n\n\nvar svgNode;\n\n/* eslint-disable no-undef */\nfunction parseCss(value) {\n const m = new (typeof DOMMatrix === "function" ? DOMMatrix : WebKitCSSMatrix)(value + "");\n return m.isIdentity ? decompose_identity : decompose(m.a, m.b, m.c, m.d, m.e, m.f);\n}\n\nfunction parseSvg(value) {\n if (value == null) return decompose_identity;\n if (!svgNode) svgNode = document.createElementNS("http://www.w3.org/2000/svg", "g");\n svgNode.setAttribute("transform", value);\n if (!(value = svgNode.transform.baseVal.consolidate())) return decompose_identity;\n value = value.matrix;\n return decompose(value.a, value.b, value.c, value.d, value.e, value.f);\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-interpolate/src/transform/index.js\n\n\n\nfunction interpolateTransform(parse, pxComma, pxParen, degParen) {\n\n function pop(s) {\n return s.length ? s.pop() + " " : "";\n }\n\n function translate(xa, ya, xb, yb, s, q) {\n if (xa !== xb || ya !== yb) {\n var i = s.push("translate(", null, pxComma, null, pxParen);\n q.push({i: i - 4, x: src_number(xa, xb)}, {i: i - 2, x: src_number(ya, yb)});\n } else if (xb || yb) {\n s.push("translate(" + xb + pxComma + yb + pxParen);\n }\n }\n\n function rotate(a, b, s, q) {\n if (a !== b) {\n if (a - b > 180) b += 360; else if (b - a > 180) a += 360; // shortest path\n q.push({i: s.push(pop(s) + "rotate(", null, degParen) - 2, x: src_number(a, b)});\n } else if (b) {\n s.push(pop(s) + "rotate(" + b + degParen);\n }\n }\n\n function skewX(a, b, s, q) {\n if (a !== b) {\n q.push({i: s.push(pop(s) + "skewX(", null, degParen) - 2, x: src_number(a, b)});\n } else if (b) {\n s.push(pop(s) + "skewX(" + b + degParen);\n }\n }\n\n function scale(xa, ya, xb, yb, s, q) {\n if (xa !== xb || ya !== yb) {\n var i = s.push(pop(s) + "scale(", null, ",", null, ")");\n q.push({i: i - 4, x: src_number(xa, xb)}, {i: i - 2, x: src_number(ya, yb)});\n } else if (xb !== 1 || yb !== 1) {\n s.push(pop(s) + "scale(" + xb + "," + yb + ")");\n }\n }\n\n return function(a, b) {\n var s = [], // string constants and placeholders\n q = []; // number interpolators\n a = parse(a), b = parse(b);\n translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q);\n rotate(a.rotate, b.rotate, s, q);\n skewX(a.skewX, b.skewX, s, q);\n scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q);\n a = b = null; // gc\n return function(t) {\n var i = -1, n = q.length, o;\n while (++i < n) s[(o = q[i]).i] = o.x(t);\n return s.join("");\n };\n };\n}\n\nvar interpolateTransformCss = interpolateTransform(parseCss, "px, ", "px)", "deg)");\nvar interpolateTransformSvg = interpolateTransform(parseSvg, ", ", ")", ")");\n\n;// CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/tween.js\n\n\nfunction tweenRemove(id, name) {\n var tween0, tween1;\n return function() {\n var schedule = schedule_set(this, id),\n tween = schedule.tween;\n\n // If this node shared tween with the previous node,\n // just assign the updated shared tween and we’re done!\n // Otherwise, copy-on-write.\n if (tween !== tween0) {\n tween1 = tween0 = tween;\n for (var i = 0, n = tween1.length; i < n; ++i) {\n if (tween1[i].name === name) {\n tween1 = tween1.slice();\n tween1.splice(i, 1);\n break;\n }\n }\n }\n\n schedule.tween = tween1;\n };\n}\n\nfunction tweenFunction(id, name, value) {\n var tween0, tween1;\n if (typeof value !== "function") throw new Error;\n return function() {\n var schedule = schedule_set(this, id),\n tween = schedule.tween;\n\n // If this node shared tween with the previous node,\n // just assign the updated shared tween and we’re done!\n // Otherwise, copy-on-write.\n if (tween !== tween0) {\n tween1 = (tween0 = tween).slice();\n for (var t = {name: name, value: value}, i = 0, n = tween1.length; i < n; ++i) {\n if (tween1[i].name === name) {\n tween1[i] = t;\n break;\n }\n }\n if (i === n) tween1.push(t);\n }\n\n schedule.tween = tween1;\n };\n}\n\n/* harmony default export */ function tween(name, value) {\n var id = this._id;\n\n name += "";\n\n if (arguments.length < 2) {\n var tween = schedule_get(this.node(), id).tween;\n for (var i = 0, n = tween.length, t; i < n; ++i) {\n if ((t = tween[i]).name === name) {\n return t.value;\n }\n }\n return null;\n }\n\n return this.each((value == null ? tweenRemove : tweenFunction)(id, name, value));\n}\n\nfunction tweenValue(transition, name, value) {\n var id = transition._id;\n\n transition.each(function() {\n var schedule = schedule_set(this, id);\n (schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments);\n });\n\n return function(node) {\n return schedule_get(node, id).value[name];\n };\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-color/src/define.js\n/* harmony default export */ function src_define(constructor, factory, prototype) {\n constructor.prototype = factory.prototype = prototype;\n prototype.constructor = constructor;\n}\n\nfunction extend(parent, definition) {\n var prototype = Object.create(parent.prototype);\n for (var key in definition) prototype[key] = definition[key];\n return prototype;\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-color/src/color.js\n\n\nfunction Color() {}\n\nvar darker = 0.7;\nvar brighter = 1 / darker;\n\nvar reI = "\\\\s*([+-]?\\\\d+)\\\\s*",\n reN = "\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*",\n reP = "\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*",\n reHex = /^#([0-9a-f]{3,8})$/,\n reRgbInteger = new RegExp(`^rgb\\\\(${reI},${reI},${reI}\\\\)$`),\n reRgbPercent = new RegExp(`^rgb\\\\(${reP},${reP},${reP}\\\\)$`),\n reRgbaInteger = new RegExp(`^rgba\\\\(${reI},${reI},${reI},${reN}\\\\)$`),\n reRgbaPercent = new RegExp(`^rgba\\\\(${reP},${reP},${reP},${reN}\\\\)$`),\n reHslPercent = new RegExp(`^hsl\\\\(${reN},${reP},${reP}\\\\)$`),\n reHslaPercent = new RegExp(`^hsla\\\\(${reN},${reP},${reP},${reN}\\\\)$`);\n\nvar named = {\n aliceblue: 0xf0f8ff,\n antiquewhite: 0xfaebd7,\n aqua: 0x00ffff,\n aquamarine: 0x7fffd4,\n azure: 0xf0ffff,\n beige: 0xf5f5dc,\n bisque: 0xffe4c4,\n black: 0x000000,\n blanchedalmond: 0xffebcd,\n blue: 0x0000ff,\n blueviolet: 0x8a2be2,\n brown: 0xa52a2a,\n burlywood: 0xdeb887,\n cadetblue: 0x5f9ea0,\n chartreuse: 0x7fff00,\n chocolate: 0xd2691e,\n coral: 0xff7f50,\n cornflowerblue: 0x6495ed,\n cornsilk: 0xfff8dc,\n crimson: 0xdc143c,\n cyan: 0x00ffff,\n darkblue: 0x00008b,\n darkcyan: 0x008b8b,\n darkgoldenrod: 0xb8860b,\n darkgray: 0xa9a9a9,\n darkgreen: 0x006400,\n darkgrey: 0xa9a9a9,\n darkkhaki: 0xbdb76b,\n darkmagenta: 0x8b008b,\n darkolivegreen: 0x556b2f,\n darkorange: 0xff8c00,\n darkorchid: 0x9932cc,\n darkred: 0x8b0000,\n darksalmon: 0xe9967a,\n darkseagreen: 0x8fbc8f,\n darkslateblue: 0x483d8b,\n darkslategray: 0x2f4f4f,\n darkslategrey: 0x2f4f4f,\n darkturquoise: 0x00ced1,\n darkviolet: 0x9400d3,\n deeppink: 0xff1493,\n deepskyblue: 0x00bfff,\n dimgray: 0x696969,\n dimgrey: 0x696969,\n dodgerblue: 0x1e90ff,\n firebrick: 0xb22222,\n floralwhite: 0xfffaf0,\n forestgreen: 0x228b22,\n fuchsia: 0xff00ff,\n gainsboro: 0xdcdcdc,\n ghostwhite: 0xf8f8ff,\n gold: 0xffd700,\n goldenrod: 0xdaa520,\n gray: 0x808080,\n green: 0x008000,\n greenyellow: 0xadff2f,\n grey: 0x808080,\n honeydew: 0xf0fff0,\n hotpink: 0xff69b4,\n indianred: 0xcd5c5c,\n indigo: 0x4b0082,\n ivory: 0xfffff0,\n khaki: 0xf0e68c,\n lavender: 0xe6e6fa,\n lavenderblush: 0xfff0f5,\n lawngreen: 0x7cfc00,\n lemonchiffon: 0xfffacd,\n lightblue: 0xadd8e6,\n lightcoral: 0xf08080,\n lightcyan: 0xe0ffff,\n lightgoldenrodyellow: 0xfafad2,\n lightgray: 0xd3d3d3,\n lightgreen: 0x90ee90,\n lightgrey: 0xd3d3d3,\n lightpink: 0xffb6c1,\n lightsalmon: 0xffa07a,\n lightseagreen: 0x20b2aa,\n lightskyblue: 0x87cefa,\n lightslategray: 0x778899,\n lightslategrey: 0x778899,\n lightsteelblue: 0xb0c4de,\n lightyellow: 0xffffe0,\n lime: 0x00ff00,\n limegreen: 0x32cd32,\n linen: 0xfaf0e6,\n magenta: 0xff00ff,\n maroon: 0x800000,\n mediumaquamarine: 0x66cdaa,\n mediumblue: 0x0000cd,\n mediumorchid: 0xba55d3,\n mediumpurple: 0x9370db,\n mediumseagreen: 0x3cb371,\n mediumslateblue: 0x7b68ee,\n mediumspringgreen: 0x00fa9a,\n mediumturquoise: 0x48d1cc,\n mediumvioletred: 0xc71585,\n midnightblue: 0x191970,\n mintcream: 0xf5fffa,\n mistyrose: 0xffe4e1,\n moccasin: 0xffe4b5,\n navajowhite: 0xffdead,\n navy: 0x000080,\n oldlace: 0xfdf5e6,\n olive: 0x808000,\n olivedrab: 0x6b8e23,\n orange: 0xffa500,\n orangered: 0xff4500,\n orchid: 0xda70d6,\n palegoldenrod: 0xeee8aa,\n palegreen: 0x98fb98,\n paleturquoise: 0xafeeee,\n palevioletred: 0xdb7093,\n papayawhip: 0xffefd5,\n peachpuff: 0xffdab9,\n peru: 0xcd853f,\n pink: 0xffc0cb,\n plum: 0xdda0dd,\n powderblue: 0xb0e0e6,\n purple: 0x800080,\n rebeccapurple: 0x663399,\n red: 0xff0000,\n rosybrown: 0xbc8f8f,\n royalblue: 0x4169e1,\n saddlebrown: 0x8b4513,\n salmon: 0xfa8072,\n sandybrown: 0xf4a460,\n seagreen: 0x2e8b57,\n seashell: 0xfff5ee,\n sienna: 0xa0522d,\n silver: 0xc0c0c0,\n skyblue: 0x87ceeb,\n slateblue: 0x6a5acd,\n slategray: 0x708090,\n slategrey: 0x708090,\n snow: 0xfffafa,\n springgreen: 0x00ff7f,\n steelblue: 0x4682b4,\n tan: 0xd2b48c,\n teal: 0x008080,\n thistle: 0xd8bfd8,\n tomato: 0xff6347,\n turquoise: 0x40e0d0,\n violet: 0xee82ee,\n wheat: 0xf5deb3,\n white: 0xffffff,\n whitesmoke: 0xf5f5f5,\n yellow: 0xffff00,\n yellowgreen: 0x9acd32\n};\n\nsrc_define(Color, color, {\n copy(channels) {\n return Object.assign(new this.constructor, this, channels);\n },\n displayable() {\n return this.rgb().displayable();\n },\n hex: color_formatHex, // Deprecated! Use color.formatHex.\n formatHex: color_formatHex,\n formatHex8: color_formatHex8,\n formatHsl: color_formatHsl,\n formatRgb: color_formatRgb,\n toString: color_formatRgb\n});\n\nfunction color_formatHex() {\n return this.rgb().formatHex();\n}\n\nfunction color_formatHex8() {\n return this.rgb().formatHex8();\n}\n\nfunction color_formatHsl() {\n return hslConvert(this).formatHsl();\n}\n\nfunction color_formatRgb() {\n return this.rgb().formatRgb();\n}\n\nfunction color(format) {\n var m, l;\n format = (format + "").trim().toLowerCase();\n return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000\n : l === 3 ? new Rgb((m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1) // #f00\n : l === 8 ? rgba(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000\n : l === 4 ? rgba((m >> 12 & 0xf) | (m >> 8 & 0xf0), (m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), (((m & 0xf) << 4) | (m & 0xf)) / 0xff) // #f000\n : null) // invalid hex\n : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)\n : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)\n : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)\n : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)\n : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)\n : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)\n : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins\n : format === "transparent" ? new Rgb(NaN, NaN, NaN, 0)\n : null;\n}\n\nfunction rgbn(n) {\n return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);\n}\n\nfunction rgba(r, g, b, a) {\n if (a <= 0) r = g = b = NaN;\n return new Rgb(r, g, b, a);\n}\n\nfunction rgbConvert(o) {\n if (!(o instanceof Color)) o = color(o);\n if (!o) return new Rgb;\n o = o.rgb();\n return new Rgb(o.r, o.g, o.b, o.opacity);\n}\n\nfunction color_rgb(r, g, b, opacity) {\n return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);\n}\n\nfunction Rgb(r, g, b, opacity) {\n this.r = +r;\n this.g = +g;\n this.b = +b;\n this.opacity = +opacity;\n}\n\nsrc_define(Rgb, color_rgb, extend(Color, {\n brighter(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n darker(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n rgb() {\n return this;\n },\n clamp() {\n return new Rgb(clampi(this.r), clampi(this.g), clampi(this.b), clampa(this.opacity));\n },\n displayable() {\n return (-0.5 <= this.r && this.r < 255.5)\n && (-0.5 <= this.g && this.g < 255.5)\n && (-0.5 <= this.b && this.b < 255.5)\n && (0 <= this.opacity && this.opacity <= 1);\n },\n hex: rgb_formatHex, // Deprecated! Use color.formatHex.\n formatHex: rgb_formatHex,\n formatHex8: rgb_formatHex8,\n formatRgb: rgb_formatRgb,\n toString: rgb_formatRgb\n}));\n\nfunction rgb_formatHex() {\n return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}`;\n}\n\nfunction rgb_formatHex8() {\n return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}${hex((isNaN(this.opacity) ? 1 : this.opacity) * 255)}`;\n}\n\nfunction rgb_formatRgb() {\n const a = clampa(this.opacity);\n return `${a === 1 ? "rgb(" : "rgba("}${clampi(this.r)}, ${clampi(this.g)}, ${clampi(this.b)}${a === 1 ? ")" : `, ${a})`}`;\n}\n\nfunction clampa(opacity) {\n return isNaN(opacity) ? 1 : Math.max(0, Math.min(1, opacity));\n}\n\nfunction clampi(value) {\n return Math.max(0, Math.min(255, Math.round(value) || 0));\n}\n\nfunction hex(value) {\n value = clampi(value);\n return (value < 16 ? "0" : "") + value.toString(16);\n}\n\nfunction hsla(h, s, l, a) {\n if (a <= 0) h = s = l = NaN;\n else if (l <= 0 || l >= 1) h = s = NaN;\n else if (s <= 0) h = NaN;\n return new Hsl(h, s, l, a);\n}\n\nfunction hslConvert(o) {\n if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);\n if (!(o instanceof Color)) o = color(o);\n if (!o) return new Hsl;\n if (o instanceof Hsl) return o;\n o = o.rgb();\n var r = o.r / 255,\n g = o.g / 255,\n b = o.b / 255,\n min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n h = NaN,\n s = max - min,\n l = (max + min) / 2;\n if (s) {\n if (r === max) h = (g - b) / s + (g < b) * 6;\n else if (g === max) h = (b - r) / s + 2;\n else h = (r - g) / s + 4;\n s /= l < 0.5 ? max + min : 2 - max - min;\n h *= 60;\n } else {\n s = l > 0 && l < 1 ? 0 : h;\n }\n return new Hsl(h, s, l, o.opacity);\n}\n\nfunction hsl(h, s, l, opacity) {\n return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);\n}\n\nfunction Hsl(h, s, l, opacity) {\n this.h = +h;\n this.s = +s;\n this.l = +l;\n this.opacity = +opacity;\n}\n\nsrc_define(Hsl, hsl, extend(Color, {\n brighter(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n darker(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n rgb() {\n var h = this.h % 360 + (this.h < 0) * 360,\n s = isNaN(h) || isNaN(this.s) ? 0 : this.s,\n l = this.l,\n m2 = l + (l < 0.5 ? l : 1 - l) * s,\n m1 = 2 * l - m2;\n return new Rgb(\n hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),\n hsl2rgb(h, m1, m2),\n hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),\n this.opacity\n );\n },\n clamp() {\n return new Hsl(clamph(this.h), clampt(this.s), clampt(this.l), clampa(this.opacity));\n },\n displayable() {\n return (0 <= this.s && this.s <= 1 || isNaN(this.s))\n && (0 <= this.l && this.l <= 1)\n && (0 <= this.opacity && this.opacity <= 1);\n },\n formatHsl() {\n const a = clampa(this.opacity);\n return `${a === 1 ? "hsl(" : "hsla("}${clamph(this.h)}, ${clampt(this.s) * 100}%, ${clampt(this.l) * 100}%${a === 1 ? ")" : `, ${a})`}`;\n }\n}));\n\nfunction clamph(value) {\n value = (value || 0) % 360;\n return value < 0 ? value + 360 : value;\n}\n\nfunction clampt(value) {\n return Math.max(0, Math.min(1, value || 0));\n}\n\n/* From FvD 13.37, CSS Color Module Level 3 */\nfunction hsl2rgb(h, m1, m2) {\n return (h < 60 ? m1 + (m2 - m1) * h / 60\n : h < 180 ? m2\n : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60\n : m1) * 255;\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-interpolate/src/basis.js\nfunction basis(t1, v0, v1, v2, v3) {\n var t2 = t1 * t1, t3 = t2 * t1;\n return ((1 - 3 * t1 + 3 * t2 - t3) * v0\n + (4 - 6 * t2 + 3 * t3) * v1\n + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2\n + t3 * v3) / 6;\n}\n\n/* harmony default export */ function src_basis(values) {\n var n = values.length - 1;\n return function(t) {\n var i = t <= 0 ? (t = 0) : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n),\n v1 = values[i],\n v2 = values[i + 1],\n v0 = i > 0 ? values[i - 1] : 2 * v1 - v2,\n v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1;\n return basis((t - i / n) * n, v0, v1, v2, v3);\n };\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-interpolate/src/basisClosed.js\n\n\n/* harmony default export */ function basisClosed(values) {\n var n = values.length;\n return function(t) {\n var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n),\n v0 = values[(i + n - 1) % n],\n v1 = values[i % n],\n v2 = values[(i + 1) % n],\n v3 = values[(i + 2) % n];\n return basis((t - i / n) * n, v0, v1, v2, v3);\n };\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-interpolate/src/constant.js\n/* harmony default export */ const d3_interpolate_src_constant = (x => () => x);\n\n;// CONCATENATED MODULE: ../node_modules/d3-interpolate/src/color.js\n\n\nfunction linear(a, d) {\n return function(t) {\n return a + t * d;\n };\n}\n\nfunction exponential(a, b, y) {\n return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) {\n return Math.pow(a + t * b, y);\n };\n}\n\nfunction hue(a, b) {\n var d = b - a;\n return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant(isNaN(a) ? b : a);\n}\n\nfunction gamma(y) {\n return (y = +y) === 1 ? nogamma : function(a, b) {\n return b - a ? exponential(a, b, y) : d3_interpolate_src_constant(isNaN(a) ? b : a);\n };\n}\n\nfunction nogamma(a, b) {\n var d = b - a;\n return d ? linear(a, d) : d3_interpolate_src_constant(isNaN(a) ? b : a);\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-interpolate/src/rgb.js\n\n\n\n\n\n/* harmony default export */ const rgb = ((function rgbGamma(y) {\n var color = gamma(y);\n\n function rgb(start, end) {\n var r = color((start = color_rgb(start)).r, (end = color_rgb(end)).r),\n g = color(start.g, end.g),\n b = color(start.b, end.b),\n opacity = nogamma(start.opacity, end.opacity);\n return function(t) {\n start.r = r(t);\n start.g = g(t);\n start.b = b(t);\n start.opacity = opacity(t);\n return start + "";\n };\n }\n\n rgb.gamma = rgbGamma;\n\n return rgb;\n})(1));\n\nfunction rgbSpline(spline) {\n return function(colors) {\n var n = colors.length,\n r = new Array(n),\n g = new Array(n),\n b = new Array(n),\n i, color;\n for (i = 0; i < n; ++i) {\n color = color_rgb(colors[i]);\n r[i] = color.r || 0;\n g[i] = color.g || 0;\n b[i] = color.b || 0;\n }\n r = spline(r);\n g = spline(g);\n b = spline(b);\n color.opacity = 1;\n return function(t) {\n color.r = r(t);\n color.g = g(t);\n color.b = b(t);\n return color + "";\n };\n };\n}\n\nvar rgbBasis = rgbSpline(src_basis);\nvar rgbBasisClosed = rgbSpline(basisClosed);\n\n;// CONCATENATED MODULE: ../node_modules/d3-interpolate/src/string.js\n\n\nvar reA = /[-+]?(?:\\d+\\.?\\d*|\\.?\\d+)(?:[eE][-+]?\\d+)?/g,\n reB = new RegExp(reA.source, "g");\n\nfunction zero(b) {\n return function() {\n return b;\n };\n}\n\nfunction one(b) {\n return function(t) {\n return b(t) + "";\n };\n}\n\n/* harmony default export */ function string(a, b) {\n var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b\n am, // current match in a\n bm, // current match in b\n bs, // string preceding current number in b, if any\n i = -1, // index in s\n s = [], // string constants and placeholders\n q = []; // number interpolators\n\n // Coerce inputs to strings.\n a = a + "", b = b + "";\n\n // Interpolate pairs of numbers in a & b.\n while ((am = reA.exec(a))\n && (bm = reB.exec(b))) {\n if ((bs = bm.index) > bi) { // a string precedes the next number in b\n bs = b.slice(bi, bs);\n if (s[i]) s[i] += bs; // coalesce with previous string\n else s[++i] = bs;\n }\n if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match\n if (s[i]) s[i] += bm; // coalesce with previous string\n else s[++i] = bm;\n } else { // interpolate non-matching numbers\n s[++i] = null;\n q.push({i: i, x: src_number(am, bm)});\n }\n bi = reB.lastIndex;\n }\n\n // Add remains of b.\n if (bi < b.length) {\n bs = b.slice(bi);\n if (s[i]) s[i] += bs; // coalesce with previous string\n else s[++i] = bs;\n }\n\n // Special optimization for only a single match.\n // Otherwise, interpolate each of the numbers and rejoin the string.\n return s.length < 2 ? (q[0]\n ? one(q[0].x)\n : zero(b))\n : (b = q.length, function(t) {\n for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);\n return s.join("");\n });\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/interpolate.js\n\n\n\n/* harmony default export */ function transition_interpolate(a, b) {\n var c;\n return (typeof b === "number" ? src_number\n : b instanceof color ? rgb\n : (c = color(b)) ? (b = c, rgb)\n : string)(a, b);\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/attr.js\n\n\n\n\n\nfunction attr_attrRemove(name) {\n return function() {\n this.removeAttribute(name);\n };\n}\n\nfunction attr_attrRemoveNS(fullname) {\n return function() {\n this.removeAttributeNS(fullname.space, fullname.local);\n };\n}\n\nfunction attr_attrConstant(name, interpolate, value1) {\n var string00,\n string1 = value1 + "",\n interpolate0;\n return function() {\n var string0 = this.getAttribute(name);\n return string0 === string1 ? null\n : string0 === string00 ? interpolate0\n : interpolate0 = interpolate(string00 = string0, value1);\n };\n}\n\nfunction attr_attrConstantNS(fullname, interpolate, value1) {\n var string00,\n string1 = value1 + "",\n interpolate0;\n return function() {\n var string0 = this.getAttributeNS(fullname.space, fullname.local);\n return string0 === string1 ? null\n : string0 === string00 ? interpolate0\n : interpolate0 = interpolate(string00 = string0, value1);\n };\n}\n\nfunction attr_attrFunction(name, interpolate, value) {\n var string00,\n string10,\n interpolate0;\n return function() {\n var string0, value1 = value(this), string1;\n if (value1 == null) return void this.removeAttribute(name);\n string0 = this.getAttribute(name);\n string1 = value1 + "";\n return string0 === string1 ? null\n : string0 === string00 && string1 === string10 ? interpolate0\n : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));\n };\n}\n\nfunction attr_attrFunctionNS(fullname, interpolate, value) {\n var string00,\n string10,\n interpolate0;\n return function() {\n var string0, value1 = value(this), string1;\n if (value1 == null) return void this.removeAttributeNS(fullname.space, fullname.local);\n string0 = this.getAttributeNS(fullname.space, fullname.local);\n string1 = value1 + "";\n return string0 === string1 ? null\n : string0 === string00 && string1 === string10 ? interpolate0\n : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));\n };\n}\n\n/* harmony default export */ function transition_attr(name, value) {\n var fullname = namespace(name), i = fullname === "transform" ? interpolateTransformSvg : transition_interpolate;\n return this.attrTween(name, typeof value === "function"\n ? (fullname.local ? attr_attrFunctionNS : attr_attrFunction)(fullname, i, tweenValue(this, "attr." + name, value))\n : value == null ? (fullname.local ? attr_attrRemoveNS : attr_attrRemove)(fullname)\n : (fullname.local ? attr_attrConstantNS : attr_attrConstant)(fullname, i, value));\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/attrTween.js\n\n\nfunction attrInterpolate(name, i) {\n return function(t) {\n this.setAttribute(name, i.call(this, t));\n };\n}\n\nfunction attrInterpolateNS(fullname, i) {\n return function(t) {\n this.setAttributeNS(fullname.space, fullname.local, i.call(this, t));\n };\n}\n\nfunction attrTweenNS(fullname, value) {\n var t0, i0;\n function tween() {\n var i = value.apply(this, arguments);\n if (i !== i0) t0 = (i0 = i) && attrInterpolateNS(fullname, i);\n return t0;\n }\n tween._value = value;\n return tween;\n}\n\nfunction attrTween(name, value) {\n var t0, i0;\n function tween() {\n var i = value.apply(this, arguments);\n if (i !== i0) t0 = (i0 = i) && attrInterpolate(name, i);\n return t0;\n }\n tween._value = value;\n return tween;\n}\n\n/* harmony default export */ function transition_attrTween(name, value) {\n var key = "attr." + name;\n if (arguments.length < 2) return (key = this.tween(key)) && key._value;\n if (value == null) return this.tween(key, null);\n if (typeof value !== "function") throw new Error;\n var fullname = namespace(name);\n return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value));\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/delay.js\n\n\nfunction delayFunction(id, value) {\n return function() {\n init(this, id).delay = +value.apply(this, arguments);\n };\n}\n\nfunction delayConstant(id, value) {\n return value = +value, function() {\n init(this, id).delay = value;\n };\n}\n\n/* harmony default export */ function delay(value) {\n var id = this._id;\n\n return arguments.length\n ? this.each((typeof value === "function"\n ? delayFunction\n : delayConstant)(id, value))\n : schedule_get(this.node(), id).delay;\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/duration.js\n\n\nfunction durationFunction(id, value) {\n return function() {\n schedule_set(this, id).duration = +value.apply(this, arguments);\n };\n}\n\nfunction durationConstant(id, value) {\n return value = +value, function() {\n schedule_set(this, id).duration = value;\n };\n}\n\n/* harmony default export */ function duration(value) {\n var id = this._id;\n\n return arguments.length\n ? this.each((typeof value === "function"\n ? durationFunction\n : durationConstant)(id, value))\n : schedule_get(this.node(), id).duration;\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/ease.js\n\n\nfunction easeConstant(id, value) {\n if (typeof value !== "function") throw new Error;\n return function() {\n schedule_set(this, id).ease = value;\n };\n}\n\n/* harmony default export */ function ease(value) {\n var id = this._id;\n\n return arguments.length\n ? this.each(easeConstant(id, value))\n : schedule_get(this.node(), id).ease;\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/easeVarying.js\n\n\nfunction easeVarying(id, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (typeof v !== "function") throw new Error;\n schedule_set(this, id).ease = v;\n };\n}\n\n/* harmony default export */ function transition_easeVarying(value) {\n if (typeof value !== "function") throw new Error;\n return this.each(easeVarying(this._id, value));\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/filter.js\n\n\n\n/* harmony default export */ function transition_filter(match) {\n if (typeof match !== "function") match = matcher(match);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {\n if ((node = group[i]) && match.call(node, node.__data__, i, group)) {\n subgroup.push(node);\n }\n }\n }\n\n return new transition_Transition(subgroups, this._parents, this._name, this._id);\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/merge.js\n\n\n/* harmony default export */ function transition_merge(transition) {\n if (transition._id !== this._id) throw new Error;\n\n for (var groups0 = this._groups, groups1 = transition._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {\n for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group0[i] || group1[i]) {\n merge[i] = node;\n }\n }\n }\n\n for (; j < m0; ++j) {\n merges[j] = groups0[j];\n }\n\n return new transition_Transition(merges, this._parents, this._name, this._id);\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/on.js\n\n\nfunction on_start(name) {\n return (name + "").trim().split(/^|\\s+/).every(function(t) {\n var i = t.indexOf(".");\n if (i >= 0) t = t.slice(0, i);\n return !t || t === "start";\n });\n}\n\nfunction onFunction(id, name, listener) {\n var on0, on1, sit = on_start(name) ? init : schedule_set;\n return function() {\n var schedule = sit(this, id),\n on = schedule.on;\n\n // If this node shared a dispatch with the previous node,\n // just assign the updated shared dispatch and we’re done!\n // Otherwise, copy-on-write.\n if (on !== on0) (on1 = (on0 = on).copy()).on(name, listener);\n\n schedule.on = on1;\n };\n}\n\n/* harmony default export */ function transition_on(name, listener) {\n var id = this._id;\n\n return arguments.length < 2\n ? schedule_get(this.node(), id).on.on(name)\n : this.each(onFunction(id, name, listener));\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/remove.js\nfunction removeFunction(id) {\n return function() {\n var parent = this.parentNode;\n for (var i in this.__transition) if (+i !== id) return;\n if (parent) parent.removeChild(this);\n };\n}\n\n/* harmony default export */ function transition_remove() {\n return this.on("end.remove", removeFunction(this._id));\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/select.js\n\n\n\n\n/* harmony default export */ function transition_select(select) {\n var name = this._name,\n id = this._id;\n\n if (typeof select !== "function") select = selector(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {\n if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {\n if ("__data__" in node) subnode.__data__ = node.__data__;\n subgroup[i] = subnode;\n schedule(subgroup[i], name, id, i, subgroup, schedule_get(node, id));\n }\n }\n }\n\n return new transition_Transition(subgroups, this._parents, name, id);\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/selectAll.js\n\n\n\n\n/* harmony default export */ function transition_selectAll(select) {\n var name = this._name,\n id = this._id;\n\n if (typeof select !== "function") select = selectorAll(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n for (var children = select.call(node, node.__data__, i, group), child, inherit = schedule_get(node, id), k = 0, l = children.length; k < l; ++k) {\n if (child = children[k]) {\n schedule(child, name, id, k, children, inherit);\n }\n }\n subgroups.push(children);\n parents.push(node);\n }\n }\n }\n\n return new transition_Transition(subgroups, parents, name, id);\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/selection.js\n\n\nvar selection_Selection = src_selection.prototype.constructor;\n\n/* harmony default export */ function transition_selection() {\n return new selection_Selection(this._groups, this._parents);\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/style.js\n\n\n\n\n\n\nfunction styleNull(name, interpolate) {\n var string00,\n string10,\n interpolate0;\n return function() {\n var string0 = styleValue(this, name),\n string1 = (this.style.removeProperty(name), styleValue(this, name));\n return string0 === string1 ? null\n : string0 === string00 && string1 === string10 ? interpolate0\n : interpolate0 = interpolate(string00 = string0, string10 = string1);\n };\n}\n\nfunction style_styleRemove(name) {\n return function() {\n this.style.removeProperty(name);\n };\n}\n\nfunction style_styleConstant(name, interpolate, value1) {\n var string00,\n string1 = value1 + "",\n interpolate0;\n return function() {\n var string0 = styleValue(this, name);\n return string0 === string1 ? null\n : string0 === string00 ? interpolate0\n : interpolate0 = interpolate(string00 = string0, value1);\n };\n}\n\nfunction style_styleFunction(name, interpolate, value) {\n var string00,\n string10,\n interpolate0;\n return function() {\n var string0 = styleValue(this, name),\n value1 = value(this),\n string1 = value1 + "";\n if (value1 == null) string1 = value1 = (this.style.removeProperty(name), styleValue(this, name));\n return string0 === string1 ? null\n : string0 === string00 && string1 === string10 ? interpolate0\n : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));\n };\n}\n\nfunction styleMaybeRemove(id, name) {\n var on0, on1, listener0, key = "style." + name, event = "end." + key, remove;\n return function() {\n var schedule = schedule_set(this, id),\n on = schedule.on,\n listener = schedule.value[key] == null ? remove || (remove = style_styleRemove(name)) : undefined;\n\n // If this node shared a dispatch with the previous node,\n // just assign the updated shared dispatch and we’re done!\n // Otherwise, copy-on-write.\n if (on !== on0 || listener0 !== listener) (on1 = (on0 = on).copy()).on(event, listener0 = listener);\n\n schedule.on = on1;\n };\n}\n\n/* harmony default export */ function transition_style(name, value, priority) {\n var i = (name += "") === "transform" ? interpolateTransformCss : transition_interpolate;\n return value == null ? this\n .styleTween(name, styleNull(name, i))\n .on("end.style." + name, style_styleRemove(name))\n : typeof value === "function" ? this\n .styleTween(name, style_styleFunction(name, i, tweenValue(this, "style." + name, value)))\n .each(styleMaybeRemove(this._id, name))\n : this\n .styleTween(name, style_styleConstant(name, i, value), priority)\n .on("end.style." + name, null);\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/styleTween.js\nfunction styleInterpolate(name, i, priority) {\n return function(t) {\n this.style.setProperty(name, i.call(this, t), priority);\n };\n}\n\nfunction styleTween(name, value, priority) {\n var t, i0;\n function tween() {\n var i = value.apply(this, arguments);\n if (i !== i0) t = (i0 = i) && styleInterpolate(name, i, priority);\n return t;\n }\n tween._value = value;\n return tween;\n}\n\n/* harmony default export */ function transition_styleTween(name, value, priority) {\n var key = "style." + (name += "");\n if (arguments.length < 2) return (key = this.tween(key)) && key._value;\n if (value == null) return this.tween(key, null);\n if (typeof value !== "function") throw new Error;\n return this.tween(key, styleTween(name, value, priority == null ? "" : priority));\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/text.js\n\n\nfunction text_textConstant(value) {\n return function() {\n this.textContent = value;\n };\n}\n\nfunction text_textFunction(value) {\n return function() {\n var value1 = value(this);\n this.textContent = value1 == null ? "" : value1;\n };\n}\n\n/* harmony default export */ function transition_text(value) {\n return this.tween("text", typeof value === "function"\n ? text_textFunction(tweenValue(this, "text", value))\n : text_textConstant(value == null ? "" : value + ""));\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/textTween.js\nfunction textInterpolate(i) {\n return function(t) {\n this.textContent = i.call(this, t);\n };\n}\n\nfunction textTween(value) {\n var t0, i0;\n function tween() {\n var i = value.apply(this, arguments);\n if (i !== i0) t0 = (i0 = i) && textInterpolate(i);\n return t0;\n }\n tween._value = value;\n return tween;\n}\n\n/* harmony default export */ function transition_textTween(value) {\n var key = "text";\n if (arguments.length < 1) return (key = this.tween(key)) && key._value;\n if (value == null) return this.tween(key, null);\n if (typeof value !== "function") throw new Error;\n return this.tween(key, textTween(value));\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/transition.js\n\n\n\n/* harmony default export */ function transition() {\n var name = this._name,\n id0 = this._id,\n id1 = newId();\n\n for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n var inherit = schedule_get(node, id0);\n schedule(node, name, id1, i, group, {\n time: inherit.time + inherit.delay + inherit.duration,\n delay: 0,\n duration: inherit.duration,\n ease: inherit.ease\n });\n }\n }\n }\n\n return new transition_Transition(groups, this._parents, name, id1);\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/end.js\n\n\n/* harmony default export */ function transition_end() {\n var on0, on1, that = this, id = that._id, size = that.size();\n return new Promise(function(resolve, reject) {\n var cancel = {value: reject},\n end = {value: function() { if (--size === 0) resolve(); }};\n\n that.each(function() {\n var schedule = schedule_set(this, id),\n on = schedule.on;\n\n // If this node shared a dispatch with the previous node,\n // just assign the updated shared dispatch and we’re done!\n // Otherwise, copy-on-write.\n if (on !== on0) {\n on1 = (on0 = on).copy();\n on1._.cancel.push(cancel);\n on1._.interrupt.push(cancel);\n on1._.end.push(end);\n }\n\n schedule.on = on1;\n });\n\n // The selection was empty, resolve end immediately\n if (size === 0) resolve();\n });\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/index.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar id = 0;\n\nfunction transition_Transition(groups, parents, name, id) {\n this._groups = groups;\n this._parents = parents;\n this._name = name;\n this._id = id;\n}\n\nfunction transition_transition(name) {\n return src_selection().transition(name);\n}\n\nfunction newId() {\n return ++id;\n}\n\nvar selection_prototype = src_selection.prototype;\n\ntransition_Transition.prototype = transition_transition.prototype = {\n constructor: transition_Transition,\n select: transition_select,\n selectAll: transition_selectAll,\n selectChild: selection_prototype.selectChild,\n selectChildren: selection_prototype.selectChildren,\n filter: transition_filter,\n merge: transition_merge,\n selection: transition_selection,\n transition: transition,\n call: selection_prototype.call,\n nodes: selection_prototype.nodes,\n node: selection_prototype.node,\n size: selection_prototype.size,\n empty: selection_prototype.empty,\n each: selection_prototype.each,\n on: transition_on,\n attr: transition_attr,\n attrTween: transition_attrTween,\n style: transition_style,\n styleTween: transition_styleTween,\n text: transition_text,\n textTween: transition_textTween,\n remove: transition_remove,\n tween: tween,\n delay: delay,\n duration: duration,\n ease: ease,\n easeVarying: transition_easeVarying,\n end: transition_end,\n [Symbol.iterator]: selection_prototype[Symbol.iterator]\n};\n\n;// CONCATENATED MODULE: ../node_modules/d3-ease/src/cubic.js\nfunction cubicIn(t) {\n return t * t * t;\n}\n\nfunction cubicOut(t) {\n return --t * t * t + 1;\n}\n\nfunction cubicInOut(t) {\n return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-transition/src/selection/transition.js\n\n\n\n\n\nvar defaultTiming = {\n time: null, // Set on use.\n delay: 0,\n duration: 250,\n ease: cubicInOut\n};\n\nfunction inherit(node, id) {\n var timing;\n while (!(timing = node.__transition) || !(timing = timing[id])) {\n if (!(node = node.parentNode)) {\n throw new Error(`transition ${id} not found`);\n }\n }\n return timing;\n}\n\n/* harmony default export */ function selection_transition(name) {\n var id,\n timing;\n\n if (name instanceof transition_Transition) {\n id = name._id, name = name._name;\n } else {\n id = newId(), (timing = defaultTiming).time = now(), name = name == null ? null : name + "";\n }\n\n for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n schedule(node, name, id, i, group, timing || inherit(node, id));\n }\n }\n }\n\n return new transition_Transition(groups, this._parents, name, id);\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-transition/src/selection/index.js\n\n\n\n\nsrc_selection.prototype.interrupt = selection_interrupt;\nsrc_selection.prototype.transition = selection_transition;\n\n;// CONCATENATED MODULE: ../node_modules/d3-transition/src/index.js\n\n\n\n\n\n;// CONCATENATED MODULE: ../node_modules/d3-brush/src/brush.js\n\n\n\n\n\n\n\n\n\nvar MODE_DRAG = {name: "drag"},\n MODE_SPACE = {name: "space"},\n MODE_HANDLE = {name: "handle"},\n MODE_CENTER = {name: "center"};\n\nconst {abs, max, min} = Math;\n\nfunction number1(e) {\n return [+e[0], +e[1]];\n}\n\nfunction number2(e) {\n return [number1(e[0]), number1(e[1])];\n}\n\nvar X = {\n name: "x",\n handles: ["w", "e"].map(type),\n input: function(x, e) { return x == null ? null : [[+x[0], e[0][1]], [+x[1], e[1][1]]]; },\n output: function(xy) { return xy && [xy[0][0], xy[1][0]]; }\n};\n\nvar Y = {\n name: "y",\n handles: ["n", "s"].map(type),\n input: function(y, e) { return y == null ? null : [[e[0][0], +y[0]], [e[1][0], +y[1]]]; },\n output: function(xy) { return xy && [xy[0][1], xy[1][1]]; }\n};\n\nvar XY = {\n name: "xy",\n handles: ["n", "w", "e", "s", "nw", "ne", "sw", "se"].map(type),\n input: function(xy) { return xy == null ? null : number2(xy); },\n output: function(xy) { return xy; }\n};\n\nvar cursors = {\n overlay: "crosshair",\n selection: "move",\n n: "ns-resize",\n e: "ew-resize",\n s: "ns-resize",\n w: "ew-resize",\n nw: "nwse-resize",\n ne: "nesw-resize",\n se: "nwse-resize",\n sw: "nesw-resize"\n};\n\nvar flipX = {\n e: "w",\n w: "e",\n nw: "ne",\n ne: "nw",\n se: "sw",\n sw: "se"\n};\n\nvar flipY = {\n n: "s",\n s: "n",\n nw: "sw",\n ne: "se",\n se: "ne",\n sw: "nw"\n};\n\nvar signsX = {\n overlay: +1,\n selection: +1,\n n: null,\n e: +1,\n s: null,\n w: -1,\n nw: -1,\n ne: +1,\n se: +1,\n sw: -1\n};\n\nvar signsY = {\n overlay: +1,\n selection: +1,\n n: -1,\n e: null,\n s: +1,\n w: null,\n nw: -1,\n ne: -1,\n se: +1,\n sw: +1\n};\n\nfunction type(t) {\n return {type: t};\n}\n\n// Ignore right-click, since that should open the context menu.\nfunction defaultFilter(event) {\n return !event.ctrlKey && !event.button;\n}\n\nfunction defaultExtent() {\n var svg = this.ownerSVGElement || this;\n if (svg.hasAttribute("viewBox")) {\n svg = svg.viewBox.baseVal;\n return [[svg.x, svg.y], [svg.x + svg.width, svg.y + svg.height]];\n }\n return [[0, 0], [svg.width.baseVal.value, svg.height.baseVal.value]];\n}\n\nfunction defaultTouchable() {\n return navigator.maxTouchPoints || ("ontouchstart" in this);\n}\n\n// Like d3.local, but with the name “__brush” rather than auto-generated.\nfunction local(node) {\n while (!node.__brush) if (!(node = node.parentNode)) return;\n return node.__brush;\n}\n\nfunction brush_empty(extent) {\n return extent[0][0] === extent[1][0]\n || extent[0][1] === extent[1][1];\n}\n\nfunction brushSelection(node) {\n var state = node.__brush;\n return state ? state.dim.output(state.selection) : null;\n}\n\nfunction brushX() {\n return brush_brush(X);\n}\n\nfunction brushY() {\n return brush_brush(Y);\n}\n\n/* harmony default export */ function brush() {\n return brush_brush(XY);\n}\n\nfunction brush_brush(dim) {\n var extent = defaultExtent,\n filter = defaultFilter,\n touchable = defaultTouchable,\n keys = true,\n listeners = dispatch("start", "brush", "end"),\n handleSize = 6,\n touchending;\n\n function brush(group) {\n var overlay = group\n .property("__brush", initialize)\n .selectAll(".overlay")\n .data([type("overlay")]);\n\n overlay.enter().append("rect")\n .attr("class", "overlay")\n .attr("pointer-events", "all")\n .attr("cursor", cursors.overlay)\n .merge(overlay)\n .each(function() {\n var extent = local(this).extent;\n select(this)\n .attr("x", extent[0][0])\n .attr("y", extent[0][1])\n .attr("width", extent[1][0] - extent[0][0])\n .attr("height", extent[1][1] - extent[0][1]);\n });\n\n group.selectAll(".selection")\n .data([type("selection")])\n .enter().append("rect")\n .attr("class", "selection")\n .attr("cursor", cursors.selection)\n .attr("fill", "#777")\n .attr("fill-opacity", 0.3)\n .attr("stroke", "#fff")\n .attr("shape-rendering", "crispEdges");\n\n var handle = group.selectAll(".handle")\n .data(dim.handles, function(d) { return d.type; });\n\n handle.exit().remove();\n\n handle.enter().append("rect")\n .attr("class", function(d) { return "handle handle--" + d.type; })\n .attr("cursor", function(d) { return cursors[d.type]; });\n\n group\n .each(redraw)\n .attr("fill", "none")\n .attr("pointer-events", "all")\n .on("mousedown.brush", started)\n .filter(touchable)\n .on("touchstart.brush", started)\n .on("touchmove.brush", touchmoved)\n .on("touchend.brush touchcancel.brush", touchended)\n .style("touch-action", "none")\n .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)");\n }\n\n brush.move = function(group, selection, event) {\n if (group.tween) {\n group\n .on("start.brush", function(event) { emitter(this, arguments).beforestart().start(event); })\n .on("interrupt.brush end.brush", function(event) { emitter(this, arguments).end(event); })\n .tween("brush", function() {\n var that = this,\n state = that.__brush,\n emit = emitter(that, arguments),\n selection0 = state.selection,\n selection1 = dim.input(typeof selection === "function" ? selection.apply(this, arguments) : selection, state.extent),\n i = interpolate(selection0, selection1);\n\n function tween(t) {\n state.selection = t === 1 && selection1 === null ? null : i(t);\n redraw.call(that);\n emit.brush();\n }\n\n return selection0 !== null && selection1 !== null ? tween : tween(1);\n });\n } else {\n group\n .each(function() {\n var that = this,\n args = arguments,\n state = that.__brush,\n selection1 = dim.input(typeof selection === "function" ? selection.apply(that, args) : selection, state.extent),\n emit = emitter(that, args).beforestart();\n\n interrupt(that);\n state.selection = selection1 === null ? null : selection1;\n redraw.call(that);\n emit.start(event).brush(event).end(event);\n });\n }\n };\n\n brush.clear = function(group, event) {\n brush.move(group, null, event);\n };\n\n function redraw() {\n var group = select(this),\n selection = local(this).selection;\n\n if (selection) {\n group.selectAll(".selection")\n .style("display", null)\n .attr("x", selection[0][0])\n .attr("y", selection[0][1])\n .attr("width", selection[1][0] - selection[0][0])\n .attr("height", selection[1][1] - selection[0][1]);\n\n group.selectAll(".handle")\n .style("display", null)\n .attr("x", function(d) { return d.type[d.type.length - 1] === "e" ? selection[1][0] - handleSize / 2 : selection[0][0] - handleSize / 2; })\n .attr("y", function(d) { return d.type[0] === "s" ? selection[1][1] - handleSize / 2 : selection[0][1] - handleSize / 2; })\n .attr("width", function(d) { return d.type === "n" || d.type === "s" ? selection[1][0] - selection[0][0] + handleSize : handleSize; })\n .attr("height", function(d) { return d.type === "e" || d.type === "w" ? selection[1][1] - selection[0][1] + handleSize : handleSize; });\n }\n\n else {\n group.selectAll(".selection,.handle")\n .style("display", "none")\n .attr("x", null)\n .attr("y", null)\n .attr("width", null)\n .attr("height", null);\n }\n }\n\n function emitter(that, args, clean) {\n var emit = that.__brush.emitter;\n return emit && (!clean || !emit.clean) ? emit : new Emitter(that, args, clean);\n }\n\n function Emitter(that, args, clean) {\n this.that = that;\n this.args = args;\n this.state = that.__brush;\n this.active = 0;\n this.clean = clean;\n }\n\n Emitter.prototype = {\n beforestart: function() {\n if (++this.active === 1) this.state.emitter = this, this.starting = true;\n return this;\n },\n start: function(event, mode) {\n if (this.starting) this.starting = false, this.emit("start", event, mode);\n else this.emit("brush", event);\n return this;\n },\n brush: function(event, mode) {\n this.emit("brush", event, mode);\n return this;\n },\n end: function(event, mode) {\n if (--this.active === 0) delete this.state.emitter, this.emit("end", event, mode);\n return this;\n },\n emit: function(type, event, mode) {\n var d = select(this.that).datum();\n listeners.call(\n type,\n this.that,\n new BrushEvent(type, {\n sourceEvent: event,\n target: brush,\n selection: dim.output(this.state.selection),\n mode,\n dispatch: listeners\n }),\n d\n );\n }\n };\n\n function started(event) {\n if (touchending && !event.touches) return;\n if (!filter.apply(this, arguments)) return;\n\n var that = this,\n type = event.target.__data__.type,\n mode = (keys && event.metaKey ? type = "overlay" : type) === "selection" ? MODE_DRAG : (keys && event.altKey ? MODE_CENTER : MODE_HANDLE),\n signX = dim === Y ? null : signsX[type],\n signY = dim === X ? null : signsY[type],\n state = local(that),\n extent = state.extent,\n selection = state.selection,\n W = extent[0][0], w0, w1,\n N = extent[0][1], n0, n1,\n E = extent[1][0], e0, e1,\n S = extent[1][1], s0, s1,\n dx = 0,\n dy = 0,\n moving,\n shifting = signX && signY && keys && event.shiftKey,\n lockX,\n lockY,\n points = Array.from(event.touches || [event], t => {\n const i = t.identifier;\n t = pointer(t, that);\n t.point0 = t.slice();\n t.identifier = i;\n return t;\n });\n\n interrupt(that);\n var emit = emitter(that, arguments, true).beforestart();\n\n if (type === "overlay") {\n if (selection) moving = true;\n const pts = [points[0], points[1] || points[0]];\n state.selection = selection = [[\n w0 = dim === Y ? W : min(pts[0][0], pts[1][0]),\n n0 = dim === X ? N : min(pts[0][1], pts[1][1])\n ], [\n e0 = dim === Y ? E : max(pts[0][0], pts[1][0]),\n s0 = dim === X ? S : max(pts[0][1], pts[1][1])\n ]];\n if (points.length > 1) move(event);\n } else {\n w0 = selection[0][0];\n n0 = selection[0][1];\n e0 = selection[1][0];\n s0 = selection[1][1];\n }\n\n w1 = w0;\n n1 = n0;\n e1 = e0;\n s1 = s0;\n\n var group = select(that)\n .attr("pointer-events", "none");\n\n var overlay = group.selectAll(".overlay")\n .attr("cursor", cursors[type]);\n\n if (event.touches) {\n emit.moved = moved;\n emit.ended = ended;\n } else {\n var view = select(event.view)\n .on("mousemove.brush", moved, true)\n .on("mouseup.brush", ended, true);\n if (keys) view\n .on("keydown.brush", keydowned, true)\n .on("keyup.brush", keyupped, true)\n\n dragDisable(event.view);\n }\n\n redraw.call(that);\n emit.start(event, mode.name);\n\n function moved(event) {\n for (const p of event.changedTouches || [event]) {\n for (const d of points)\n if (d.identifier === p.identifier) d.cur = pointer(p, that);\n }\n if (shifting && !lockX && !lockY && points.length === 1) {\n const point = points[0];\n if (abs(point.cur[0] - point[0]) > abs(point.cur[1] - point[1]))\n lockY = true;\n else\n lockX = true;\n }\n for (const point of points)\n if (point.cur) point[0] = point.cur[0], point[1] = point.cur[1];\n moving = true;\n noevent(event);\n move(event);\n }\n\n function move(event) {\n const point = points[0], point0 = point.point0;\n var t;\n\n dx = point[0] - point0[0];\n dy = point[1] - point0[1];\n\n switch (mode) {\n case MODE_SPACE:\n case MODE_DRAG: {\n if (signX) dx = max(W - w0, min(E - e0, dx)), w1 = w0 + dx, e1 = e0 + dx;\n if (signY) dy = max(N - n0, min(S - s0, dy)), n1 = n0 + dy, s1 = s0 + dy;\n break;\n }\n case MODE_HANDLE: {\n if (points[1]) {\n if (signX) w1 = max(W, min(E, points[0][0])), e1 = max(W, min(E, points[1][0])), signX = 1;\n if (signY) n1 = max(N, min(S, points[0][1])), s1 = max(N, min(S, points[1][1])), signY = 1;\n } else {\n if (signX < 0) dx = max(W - w0, min(E - w0, dx)), w1 = w0 + dx, e1 = e0;\n else if (signX > 0) dx = max(W - e0, min(E - e0, dx)), w1 = w0, e1 = e0 + dx;\n if (signY < 0) dy = max(N - n0, min(S - n0, dy)), n1 = n0 + dy, s1 = s0;\n else if (signY > 0) dy = max(N - s0, min(S - s0, dy)), n1 = n0, s1 = s0 + dy;\n }\n break;\n }\n case MODE_CENTER: {\n if (signX) w1 = max(W, min(E, w0 - dx * signX)), e1 = max(W, min(E, e0 + dx * signX));\n if (signY) n1 = max(N, min(S, n0 - dy * signY)), s1 = max(N, min(S, s0 + dy * signY));\n break;\n }\n }\n\n if (e1 < w1) {\n signX *= -1;\n t = w0, w0 = e0, e0 = t;\n t = w1, w1 = e1, e1 = t;\n if (type in flipX) overlay.attr("cursor", cursors[type = flipX[type]]);\n }\n\n if (s1 < n1) {\n signY *= -1;\n t = n0, n0 = s0, s0 = t;\n t = n1, n1 = s1, s1 = t;\n if (type in flipY) overlay.attr("cursor", cursors[type = flipY[type]]);\n }\n\n if (state.selection) selection = state.selection; // May be set by brush.move!\n if (lockX) w1 = selection[0][0], e1 = selection[1][0];\n if (lockY) n1 = selection[0][1], s1 = selection[1][1];\n\n if (selection[0][0] !== w1\n || selection[0][1] !== n1\n || selection[1][0] !== e1\n || selection[1][1] !== s1) {\n state.selection = [[w1, n1], [e1, s1]];\n redraw.call(that);\n emit.brush(event, mode.name);\n }\n }\n\n function ended(event) {\n nopropagation(event);\n if (event.touches) {\n if (event.touches.length) return;\n if (touchending) clearTimeout(touchending);\n touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed!\n } else {\n dragEnable(event.view, moving);\n view.on("keydown.brush keyup.brush mousemove.brush mouseup.brush", null);\n }\n group.attr("pointer-events", "all");\n overlay.attr("cursor", cursors.overlay);\n if (state.selection) selection = state.selection; // May be set by brush.move (on start)!\n if (brush_empty(selection)) state.selection = null, redraw.call(that);\n emit.end(event, mode.name);\n }\n\n function keydowned(event) {\n switch (event.keyCode) {\n case 16: { // SHIFT\n shifting = signX && signY;\n break;\n }\n case 18: { // ALT\n if (mode === MODE_HANDLE) {\n if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;\n if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;\n mode = MODE_CENTER;\n move(event);\n }\n break;\n }\n case 32: { // SPACE; takes priority over ALT\n if (mode === MODE_HANDLE || mode === MODE_CENTER) {\n if (signX < 0) e0 = e1 - dx; else if (signX > 0) w0 = w1 - dx;\n if (signY < 0) s0 = s1 - dy; else if (signY > 0) n0 = n1 - dy;\n mode = MODE_SPACE;\n overlay.attr("cursor", cursors.selection);\n move(event);\n }\n break;\n }\n default: return;\n }\n noevent(event);\n }\n\n function keyupped(event) {\n switch (event.keyCode) {\n case 16: { // SHIFT\n if (shifting) {\n lockX = lockY = shifting = false;\n move(event);\n }\n break;\n }\n case 18: { // ALT\n if (mode === MODE_CENTER) {\n if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;\n if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;\n mode = MODE_HANDLE;\n move(event);\n }\n break;\n }\n case 32: { // SPACE\n if (mode === MODE_SPACE) {\n if (event.altKey) {\n if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;\n if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;\n mode = MODE_CENTER;\n } else {\n if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;\n if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;\n mode = MODE_HANDLE;\n }\n overlay.attr("cursor", cursors[type]);\n move(event);\n }\n break;\n }\n default: return;\n }\n noevent(event);\n }\n }\n\n function touchmoved(event) {\n emitter(this, arguments).moved(event);\n }\n\n function touchended(event) {\n emitter(this, arguments).ended(event);\n }\n\n function initialize() {\n var state = this.__brush || {selection: null};\n state.extent = number2(extent.apply(this, arguments));\n state.dim = dim;\n return state;\n }\n\n brush.extent = function(_) {\n return arguments.length ? (extent = typeof _ === "function" ? _ : constant(number2(_)), brush) : extent;\n };\n\n brush.filter = function(_) {\n return arguments.length ? (filter = typeof _ === "function" ? _ : constant(!!_), brush) : filter;\n };\n\n brush.touchable = function(_) {\n return arguments.length ? (touchable = typeof _ === "function" ? _ : constant(!!_), brush) : touchable;\n };\n\n brush.handleSize = function(_) {\n return arguments.length ? (handleSize = +_, brush) : handleSize;\n };\n\n brush.keyModifiers = function(_) {\n return arguments.length ? (keys = !!_, brush) : keys;\n };\n\n brush.on = function() {\n var value = listeners.on.apply(listeners, arguments);\n return value === listeners ? brush : value;\n };\n\n return brush;\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-brush/src/index.js\n\n\n;// CONCATENATED MODULE: ../node_modules/d3-scale/src/init.js\nfunction initRange(domain, range) {\n switch (arguments.length) {\n case 0: break;\n case 1: this.range(domain); break;\n default: this.range(range).domain(domain); break;\n }\n return this;\n}\n\nfunction init_initInterpolator(domain, interpolator) {\n switch (arguments.length) {\n case 0: break;\n case 1: {\n if (typeof domain === "function") this.interpolator(domain);\n else this.range(domain);\n break;\n }\n default: {\n this.domain(domain);\n if (typeof interpolator === "function") this.interpolator(interpolator);\n else this.range(interpolator);\n break;\n }\n }\n return this;\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-scale/src/ordinal.js\n\n\n\nconst implicit = Symbol("implicit");\n\nfunction ordinal() {\n var index = new InternMap(),\n domain = [],\n range = [],\n unknown = implicit;\n\n function scale(d) {\n let i = index.get(d);\n if (i === undefined) {\n if (unknown !== implicit) return unknown;\n index.set(d, i = domain.push(d) - 1);\n }\n return range[i % range.length];\n }\n\n scale.domain = function(_) {\n if (!arguments.length) return domain.slice();\n domain = [], index = new InternMap();\n for (const value of _) {\n if (index.has(value)) continue;\n index.set(value, domain.push(value) - 1);\n }\n return scale;\n };\n\n scale.range = function(_) {\n return arguments.length ? (range = Array.from(_), scale) : range.slice();\n };\n\n scale.unknown = function(_) {\n return arguments.length ? (unknown = _, scale) : unknown;\n };\n\n scale.copy = function() {\n return ordinal(domain, range).unknown(unknown);\n };\n\n initRange.apply(scale, arguments);\n\n return scale;\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-scale/src/band.js\n\n\n\n\nfunction band() {\n var scale = ordinal().unknown(undefined),\n domain = scale.domain,\n ordinalRange = scale.range,\n r0 = 0,\n r1 = 1,\n step,\n bandwidth,\n round = false,\n paddingInner = 0,\n paddingOuter = 0,\n align = 0.5;\n\n delete scale.unknown;\n\n function rescale() {\n var n = domain().length,\n reverse = r1 < r0,\n start = reverse ? r1 : r0,\n stop = reverse ? r0 : r1;\n step = (stop - start) / Math.max(1, n - paddingInner + paddingOuter * 2);\n if (round) step = Math.floor(step);\n start += (stop - start - step * (n - paddingInner)) * align;\n bandwidth = step * (1 - paddingInner);\n if (round) start = Math.round(start), bandwidth = Math.round(bandwidth);\n var values = range(n).map(function(i) { return start + step * i; });\n return ordinalRange(reverse ? values.reverse() : values);\n }\n\n scale.domain = function(_) {\n return arguments.length ? (domain(_), rescale()) : domain();\n };\n\n scale.range = function(_) {\n return arguments.length ? ([r0, r1] = _, r0 = +r0, r1 = +r1, rescale()) : [r0, r1];\n };\n\n scale.rangeRound = function(_) {\n return [r0, r1] = _, r0 = +r0, r1 = +r1, round = true, rescale();\n };\n\n scale.bandwidth = function() {\n return bandwidth;\n };\n\n scale.step = function() {\n return step;\n };\n\n scale.round = function(_) {\n return arguments.length ? (round = !!_, rescale()) : round;\n };\n\n scale.padding = function(_) {\n return arguments.length ? (paddingInner = Math.min(1, paddingOuter = +_), rescale()) : paddingInner;\n };\n\n scale.paddingInner = function(_) {\n return arguments.length ? (paddingInner = Math.min(1, _), rescale()) : paddingInner;\n };\n\n scale.paddingOuter = function(_) {\n return arguments.length ? (paddingOuter = +_, rescale()) : paddingOuter;\n };\n\n scale.align = function(_) {\n return arguments.length ? (align = Math.max(0, Math.min(1, _)), rescale()) : align;\n };\n\n scale.copy = function() {\n return band(domain(), [r0, r1])\n .round(round)\n .paddingInner(paddingInner)\n .paddingOuter(paddingOuter)\n .align(align);\n };\n\n return initRange.apply(rescale(), arguments);\n}\n\nfunction pointish(scale) {\n var copy = scale.copy;\n\n scale.padding = scale.paddingOuter;\n delete scale.paddingInner;\n delete scale.paddingOuter;\n\n scale.copy = function() {\n return pointish(copy());\n };\n\n return scale;\n}\n\nfunction point() {\n return pointish(band.apply(null, arguments).paddingInner(1));\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-array/src/ticks.js\nconst e10 = Math.sqrt(50),\n e5 = Math.sqrt(10),\n e2 = Math.sqrt(2);\n\nfunction tickSpec(start, stop, count) {\n const step = (stop - start) / Math.max(0, count),\n power = Math.floor(Math.log10(step)),\n error = step / Math.pow(10, power),\n factor = error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1;\n let i1, i2, inc;\n if (power < 0) {\n inc = Math.pow(10, -power) / factor;\n i1 = Math.round(start * inc);\n i2 = Math.round(stop * inc);\n if (i1 / inc < start) ++i1;\n if (i2 / inc > stop) --i2;\n inc = -inc;\n } else {\n inc = Math.pow(10, power) * factor;\n i1 = Math.round(start / inc);\n i2 = Math.round(stop / inc);\n if (i1 * inc < start) ++i1;\n if (i2 * inc > stop) --i2;\n }\n if (i2 < i1 && 0.5 <= count && count < 2) return tickSpec(start, stop, count * 2);\n return [i1, i2, inc];\n}\n\nfunction ticks(start, stop, count) {\n stop = +stop, start = +start, count = +count;\n if (!(count > 0)) return [];\n if (start === stop) return [start];\n const reverse = stop < start, [i1, i2, inc] = reverse ? tickSpec(stop, start, count) : tickSpec(start, stop, count);\n if (!(i2 >= i1)) return [];\n const n = i2 - i1 + 1, ticks = new Array(n);\n if (reverse) {\n if (inc < 0) for (let i = 0; i < n; ++i) ticks[i] = (i2 - i) / -inc;\n else for (let i = 0; i < n; ++i) ticks[i] = (i2 - i) * inc;\n } else {\n if (inc < 0) for (let i = 0; i < n; ++i) ticks[i] = (i1 + i) / -inc;\n else for (let i = 0; i < n; ++i) ticks[i] = (i1 + i) * inc;\n }\n return ticks;\n}\n\nfunction tickIncrement(start, stop, count) {\n stop = +stop, start = +start, count = +count;\n return tickSpec(start, stop, count)[2];\n}\n\nfunction tickStep(start, stop, count) {\n stop = +stop, start = +start, count = +count;\n const reverse = stop < start, inc = reverse ? tickIncrement(stop, start, count) : tickIncrement(start, stop, count);\n return (reverse ? -1 : 1) * (inc < 0 ? 1 / -inc : inc);\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-array/src/ascending.js\nfunction ascending_ascending(a, b) {\n return a == null || b == null ? NaN : a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-array/src/descending.js\nfunction descending(a, b) {\n return a == null || b == null ? NaN\n : b < a ? -1\n : b > a ? 1\n : b >= a ? 0\n : NaN;\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-array/src/bisector.js\n\n\n\nfunction bisector(f) {\n let compare1, compare2, delta;\n\n // If an accessor is specified, promote it to a comparator. In this case we\n // can test whether the search value is (self-) comparable. We can’t do this\n // for a comparator (except for specific, known comparators) because we can’t\n // tell if the comparator is symmetric, and an asymmetric comparator can’t be\n // used to test whether a single value is comparable.\n if (f.length !== 2) {\n compare1 = ascending_ascending;\n compare2 = (d, x) => ascending_ascending(f(d), x);\n delta = (d, x) => f(d) - x;\n } else {\n compare1 = f === ascending_ascending || f === descending ? f : bisector_zero;\n compare2 = f;\n delta = f;\n }\n\n function left(a, x, lo = 0, hi = a.length) {\n if (lo < hi) {\n if (compare1(x, x) !== 0) return hi;\n do {\n const mid = (lo + hi) >>> 1;\n if (compare2(a[mid], x) < 0) lo = mid + 1;\n else hi = mid;\n } while (lo < hi);\n }\n return lo;\n }\n\n function right(a, x, lo = 0, hi = a.length) {\n if (lo < hi) {\n if (compare1(x, x) !== 0) return hi;\n do {\n const mid = (lo + hi) >>> 1;\n if (compare2(a[mid], x) <= 0) lo = mid + 1;\n else hi = mid;\n } while (lo < hi);\n }\n return lo;\n }\n\n function center(a, x, lo = 0, hi = a.length) {\n const i = left(a, x, lo, hi - 1);\n return i > lo && delta(a[i - 1], x) > -delta(a[i], x) ? i - 1 : i;\n }\n\n return {left, center, right};\n}\n\nfunction bisector_zero() {\n return 0;\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-array/src/number.js\nfunction number_number(x) {\n return x === null ? NaN : +x;\n}\n\nfunction* numbers(values, valueof) {\n if (valueof === undefined) {\n for (let value of values) {\n if (value != null && (value = +value) >= value) {\n yield value;\n }\n }\n } else {\n let index = -1;\n for (let value of values) {\n if ((value = valueof(value, ++index, values)) != null && (value = +value) >= value) {\n yield value;\n }\n }\n }\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-array/src/bisect.js\n\n\n\n\nconst ascendingBisect = bisector(ascending_ascending);\nconst bisectRight = ascendingBisect.right;\nconst bisectLeft = ascendingBisect.left;\nconst bisectCenter = bisector(number_number).center;\n/* harmony default export */ const bisect = (bisectRight);\n\n;// CONCATENATED MODULE: ../node_modules/d3-interpolate/src/array.js\n\n\n\n/* harmony default export */ function src_array(a, b) {\n return (isNumberArray(b) ? numberArray : genericArray)(a, b);\n}\n\nfunction genericArray(a, b) {\n var nb = b ? b.length : 0,\n na = a ? Math.min(nb, a.length) : 0,\n x = new Array(na),\n c = new Array(nb),\n i;\n\n for (i = 0; i < na; ++i) x[i] = value(a[i], b[i]);\n for (; i < nb; ++i) c[i] = b[i];\n\n return function(t) {\n for (i = 0; i < na; ++i) c[i] = x[i](t);\n return c;\n };\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-interpolate/src/date.js\n/* harmony default export */ function date(a, b) {\n var d = new Date;\n return a = +a, b = +b, function(t) {\n return d.setTime(a * (1 - t) + b * t), d;\n };\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-interpolate/src/object.js\n\n\n/* harmony default export */ function object(a, b) {\n var i = {},\n c = {},\n k;\n\n if (a === null || typeof a !== "object") a = {};\n if (b === null || typeof b !== "object") b = {};\n\n for (k in b) {\n if (k in a) {\n i[k] = value(a[k], b[k]);\n } else {\n c[k] = b[k];\n }\n }\n\n return function(t) {\n for (k in i) c[k] = i[k](t);\n return c;\n };\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-interpolate/src/numberArray.js\n/* harmony default export */ function src_numberArray(a, b) {\n if (!b) b = [];\n var n = a ? Math.min(b.length, a.length) : 0,\n c = b.slice(),\n i;\n return function(t) {\n for (i = 0; i < n; ++i) c[i] = a[i] * (1 - t) + b[i] * t;\n return c;\n };\n}\n\nfunction numberArray_isNumberArray(x) {\n return ArrayBuffer.isView(x) && !(x instanceof DataView);\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-interpolate/src/value.js\n\n\n\n\n\n\n\n\n\n\n/* harmony default export */ function value(a, b) {\n var t = typeof b, c;\n return b == null || t === "boolean" ? d3_interpolate_src_constant(b)\n : (t === "number" ? src_number\n : t === "string" ? ((c = color(b)) ? (b = c, rgb) : string)\n : b instanceof color ? rgb\n : b instanceof Date ? date\n : numberArray_isNumberArray(b) ? src_numberArray\n : Array.isArray(b) ? genericArray\n : typeof b.valueOf !== "function" && typeof b.toString !== "function" || isNaN(b) ? object\n : src_number)(a, b);\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-interpolate/src/round.js\n/* harmony default export */ function src_round(a, b) {\n return a = +a, b = +b, function(t) {\n return Math.round(a * (1 - t) + b * t);\n };\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-scale/src/constant.js\nfunction constants(x) {\n return function() {\n return x;\n };\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-scale/src/number.js\nfunction src_number_number(x) {\n return +x;\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-scale/src/continuous.js\n\n\n\n\n\nvar unit = [0, 1];\n\nfunction continuous_identity(x) {\n return x;\n}\n\nfunction normalize(a, b) {\n return (b -= (a = +a))\n ? function(x) { return (x - a) / b; }\n : constants(isNaN(b) ? NaN : 0.5);\n}\n\nfunction clamper(a, b) {\n var t;\n if (a > b) t = a, a = b, b = t;\n return function(x) { return Math.max(a, Math.min(b, x)); };\n}\n\n// normalize(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1].\n// interpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding range value x in [a,b].\nfunction bimap(domain, range, interpolate) {\n var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1];\n if (d1 < d0) d0 = normalize(d1, d0), r0 = interpolate(r1, r0);\n else d0 = normalize(d0, d1), r0 = interpolate(r0, r1);\n return function(x) { return r0(d0(x)); };\n}\n\nfunction polymap(domain, range, interpolate) {\n var j = Math.min(domain.length, range.length) - 1,\n d = new Array(j),\n r = new Array(j),\n i = -1;\n\n // Reverse descending domains.\n if (domain[j] < domain[0]) {\n domain = domain.slice().reverse();\n range = range.slice().reverse();\n }\n\n while (++i < j) {\n d[i] = normalize(domain[i], domain[i + 1]);\n r[i] = interpolate(range[i], range[i + 1]);\n }\n\n return function(x) {\n var i = bisect(domain, x, 1, j) - 1;\n return r[i](d[i](x));\n };\n}\n\nfunction copy(source, target) {\n return target\n .domain(source.domain())\n .range(source.range())\n .interpolate(source.interpolate())\n .clamp(source.clamp())\n .unknown(source.unknown());\n}\n\nfunction transformer() {\n var domain = unit,\n range = unit,\n interpolate = value,\n transform,\n untransform,\n unknown,\n clamp = continuous_identity,\n piecewise,\n output,\n input;\n\n function rescale() {\n var n = Math.min(domain.length, range.length);\n if (clamp !== continuous_identity) clamp = clamper(domain[0], domain[n - 1]);\n piecewise = n > 2 ? polymap : bimap;\n output = input = null;\n return scale;\n }\n\n function scale(x) {\n return x == null || isNaN(x = +x) ? unknown : (output || (output = piecewise(domain.map(transform), range, interpolate)))(transform(clamp(x)));\n }\n\n scale.invert = function(y) {\n return clamp(untransform((input || (input = piecewise(range, domain.map(transform), src_number)))(y)));\n };\n\n scale.domain = function(_) {\n return arguments.length ? (domain = Array.from(_, src_number_number), rescale()) : domain.slice();\n };\n\n scale.range = function(_) {\n return arguments.length ? (range = Array.from(_), rescale()) : range.slice();\n };\n\n scale.rangeRound = function(_) {\n return range = Array.from(_), interpolate = src_round, rescale();\n };\n\n scale.clamp = function(_) {\n return arguments.length ? (clamp = _ ? true : continuous_identity, rescale()) : clamp !== continuous_identity;\n };\n\n scale.interpolate = function(_) {\n return arguments.length ? (interpolate = _, rescale()) : interpolate;\n };\n\n scale.unknown = function(_) {\n return arguments.length ? (unknown = _, scale) : unknown;\n };\n\n return function(t, u) {\n transform = t, untransform = u;\n return rescale();\n };\n}\n\nfunction continuous() {\n return transformer()(continuous_identity, continuous_identity);\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-format/src/formatSpecifier.js\n// [[fill]align][sign][symbol][0][width][,][.precision][~][type]\nvar re = /^(?:(.)?([<>=^]))?([+\\-( ])?([$#])?(0)?(\\d+)?(,)?(\\.\\d+)?(~)?([a-z%])?$/i;\n\nfunction formatSpecifier(specifier) {\n if (!(match = re.exec(specifier))) throw new Error("invalid format: " + specifier);\n var match;\n return new FormatSpecifier({\n fill: match[1],\n align: match[2],\n sign: match[3],\n symbol: match[4],\n zero: match[5],\n width: match[6],\n comma: match[7],\n precision: match[8] && match[8].slice(1),\n trim: match[9],\n type: match[10]\n });\n}\n\nformatSpecifier.prototype = FormatSpecifier.prototype; // instanceof\n\nfunction FormatSpecifier(specifier) {\n this.fill = specifier.fill === undefined ? " " : specifier.fill + "";\n this.align = specifier.align === undefined ? ">" : specifier.align + "";\n this.sign = specifier.sign === undefined ? "-" : specifier.sign + "";\n this.symbol = specifier.symbol === undefined ? "" : specifier.symbol + "";\n this.zero = !!specifier.zero;\n this.width = specifier.width === undefined ? undefined : +specifier.width;\n this.comma = !!specifier.comma;\n this.precision = specifier.precision === undefined ? undefined : +specifier.precision;\n this.trim = !!specifier.trim;\n this.type = specifier.type === undefined ? "" : specifier.type + "";\n}\n\nFormatSpecifier.prototype.toString = function() {\n return this.fill\n + this.align\n + this.sign\n + this.symbol\n + (this.zero ? "0" : "")\n + (this.width === undefined ? "" : Math.max(1, this.width | 0))\n + (this.comma ? "," : "")\n + (this.precision === undefined ? "" : "." + Math.max(0, this.precision | 0))\n + (this.trim ? "~" : "")\n + this.type;\n};\n\n;// CONCATENATED MODULE: ../node_modules/d3-format/src/formatDecimal.js\n/* harmony default export */ function formatDecimal(x) {\n return Math.abs(x = Math.round(x)) >= 1e21\n ? x.toLocaleString("en").replace(/,/g, "")\n : x.toString(10);\n}\n\n// Computes the decimal coefficient and exponent of the specified number x with\n// significant digits p, where x is positive and p is in [1, 21] or undefined.\n// For example, formatDecimalParts(1.23) returns ["123", 0].\nfunction formatDecimalParts(x, p) {\n if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf("e")) < 0) return null; // NaN, ±Infinity\n var i, coefficient = x.slice(0, i);\n\n // The string returned by toExponential either has the form \\d\\.\\d+e[-+]\\d+\n // (e.g., 1.2e+3) or the form \\de[-+]\\d+ (e.g., 1e+3).\n return [\n coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,\n +x.slice(i + 1)\n ];\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-format/src/exponent.js\n\n\n/* harmony default export */ function exponent(x) {\n return x = formatDecimalParts(Math.abs(x)), x ? x[1] : NaN;\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-format/src/precisionPrefix.js\n\n\n/* harmony default export */ function precisionPrefix(step, value) {\n return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3 - exponent(Math.abs(step)));\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-format/src/formatGroup.js\n/* harmony default export */ function formatGroup(grouping, thousands) {\n return function(value, width) {\n var i = value.length,\n t = [],\n j = 0,\n g = grouping[0],\n length = 0;\n\n while (i > 0 && g > 0) {\n if (length + g + 1 > width) g = Math.max(1, width - length);\n t.push(value.substring(i -= g, i + g));\n if ((length += g + 1) > width) break;\n g = grouping[j = (j + 1) % grouping.length];\n }\n\n return t.reverse().join(thousands);\n };\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-format/src/formatNumerals.js\n/* harmony default export */ function formatNumerals(numerals) {\n return function(value) {\n return value.replace(/[0-9]/g, function(i) {\n return numerals[+i];\n });\n };\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-format/src/formatTrim.js\n// Trims insignificant zeros, e.g., replaces 1.2000k with 1.2k.\n/* harmony default export */ function formatTrim(s) {\n out: for (var n = s.length, i = 1, i0 = -1, i1; i < n; ++i) {\n switch (s[i]) {\n case ".": i0 = i1 = i; break;\n case "0": if (i0 === 0) i0 = i; i1 = i; break;\n default: if (!+s[i]) break out; if (i0 > 0) i0 = 0; break;\n }\n }\n return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s;\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-format/src/formatPrefixAuto.js\n\n\nvar prefixExponent;\n\n/* harmony default export */ function formatPrefixAuto(x, p) {\n var d = formatDecimalParts(x, p);\n if (!d) return x + "";\n var coefficient = d[0],\n exponent = d[1],\n i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1,\n n = coefficient.length;\n return i === n ? coefficient\n : i > n ? coefficient + new Array(i - n + 1).join("0")\n : i > 0 ? coefficient.slice(0, i) + "." + coefficient.slice(i)\n : "0." + new Array(1 - i).join("0") + formatDecimalParts(x, Math.max(0, p + i - 1))[0]; // less than 1y!\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-format/src/formatRounded.js\n\n\n/* harmony default export */ function formatRounded(x, p) {\n var d = formatDecimalParts(x, p);\n if (!d) return x + "";\n var coefficient = d[0],\n exponent = d[1];\n return exponent < 0 ? "0." + new Array(-exponent).join("0") + coefficient\n : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + "." + coefficient.slice(exponent + 1)\n : coefficient + new Array(exponent - coefficient.length + 2).join("0");\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-format/src/formatTypes.js\n\n\n\n\n/* harmony default export */ const formatTypes = ({\n "%": (x, p) => (x * 100).toFixed(p),\n "b": (x) => Math.round(x).toString(2),\n "c": (x) => x + "",\n "d": formatDecimal,\n "e": (x, p) => x.toExponential(p),\n "f": (x, p) => x.toFixed(p),\n "g": (x, p) => x.toPrecision(p),\n "o": (x) => Math.round(x).toString(8),\n "p": (x, p) => formatRounded(x * 100, p),\n "r": formatRounded,\n "s": formatPrefixAuto,\n "X": (x) => Math.round(x).toString(16).toUpperCase(),\n "x": (x) => Math.round(x).toString(16)\n});\n\n;// CONCATENATED MODULE: ../node_modules/d3-format/src/identity.js\n/* harmony default export */ function d3_format_src_identity(x) {\n return x;\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-format/src/locale.js\n\n\n\n\n\n\n\n\n\nvar locale_map = Array.prototype.map,\n prefixes = ["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"];\n\n/* harmony default export */ function locale(locale) {\n var group = locale.grouping === undefined || locale.thousands === undefined ? d3_format_src_identity : formatGroup(locale_map.call(locale.grouping, Number), locale.thousands + ""),\n currencyPrefix = locale.currency === undefined ? "" : locale.currency[0] + "",\n currencySuffix = locale.currency === undefined ? "" : locale.currency[1] + "",\n decimal = locale.decimal === undefined ? "." : locale.decimal + "",\n numerals = locale.numerals === undefined ? d3_format_src_identity : formatNumerals(locale_map.call(locale.numerals, String)),\n percent = locale.percent === undefined ? "%" : locale.percent + "",\n minus = locale.minus === undefined ? "−" : locale.minus + "",\n nan = locale.nan === undefined ? "NaN" : locale.nan + "";\n\n function newFormat(specifier) {\n specifier = formatSpecifier(specifier);\n\n var fill = specifier.fill,\n align = specifier.align,\n sign = specifier.sign,\n symbol = specifier.symbol,\n zero = specifier.zero,\n width = specifier.width,\n comma = specifier.comma,\n precision = specifier.precision,\n trim = specifier.trim,\n type = specifier.type;\n\n // The "n" type is an alias for ",g".\n if (type === "n") comma = true, type = "g";\n\n // The "" type, and any invalid type, is an alias for ".12~g".\n else if (!formatTypes[type]) precision === undefined && (precision = 12), trim = true, type = "g";\n\n // If zero fill is specified, padding goes after sign and before digits.\n if (zero || (fill === "0" && align === "=")) zero = true, fill = "0", align = "=";\n\n // Compute the prefix and suffix.\n // For SI-prefix, the suffix is lazily computed.\n var prefix = symbol === "$" ? currencyPrefix : symbol === "#" && /[boxX]/.test(type) ? "0" + type.toLowerCase() : "",\n suffix = symbol === "$" ? currencySuffix : /[%p]/.test(type) ? percent : "";\n\n // What format function should we use?\n // Is this an integer type?\n // Can this type generate exponential notation?\n var formatType = formatTypes[type],\n maybeSuffix = /[defgprs%]/.test(type);\n\n // Set the default precision if not specified,\n // or clamp the specified precision to the supported range.\n // For significant precision, it must be in [1, 21].\n // For fixed precision, it must be in [0, 20].\n precision = precision === undefined ? 6\n : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision))\n : Math.max(0, Math.min(20, precision));\n\n function format(value) {\n var valuePrefix = prefix,\n valueSuffix = suffix,\n i, n, c;\n\n if (type === "c") {\n valueSuffix = formatType(value) + valueSuffix;\n value = "";\n } else {\n value = +value;\n\n // Determine the sign. -0 is not less than 0, but 1 / -0 is!\n var valueNegative = value < 0 || 1 / value < 0;\n\n // Perform the initial formatting.\n value = isNaN(value) ? nan : formatType(Math.abs(value), precision);\n\n // Trim insignificant zeros.\n if (trim) value = formatTrim(value);\n\n // If a negative value rounds to zero after formatting, and no explicit positive sign is requested, hide the sign.\n if (valueNegative && +value === 0 && sign !== "+") valueNegative = false;\n\n // Compute the prefix and suffix.\n valuePrefix = (valueNegative ? (sign === "(" ? sign : minus) : sign === "-" || sign === "(" ? "" : sign) + valuePrefix;\n valueSuffix = (type === "s" ? prefixes[8 + prefixExponent / 3] : "") + valueSuffix + (valueNegative && sign === "(" ? ")" : "");\n\n // Break the formatted value into the integer “value” part that can be\n // grouped, and fractional or exponential “suffix” part that is not.\n if (maybeSuffix) {\n i = -1, n = value.length;\n while (++i < n) {\n if (c = value.charCodeAt(i), 48 > c || c > 57) {\n valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix;\n value = value.slice(0, i);\n break;\n }\n }\n }\n }\n\n // If the fill character is not "0", grouping is applied before padding.\n if (comma && !zero) value = group(value, Infinity);\n\n // Compute the padding.\n var length = valuePrefix.length + value.length + valueSuffix.length,\n padding = length < width ? new Array(width - length + 1).join(fill) : "";\n\n // If the fill character is "0", grouping is applied after padding.\n if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = "";\n\n // Reconstruct the final output based on the desired alignment.\n switch (align) {\n case "<": value = valuePrefix + value + valueSuffix + padding; break;\n case "=": value = valuePrefix + padding + value + valueSuffix; break;\n case "^": value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length); break;\n default: value = padding + valuePrefix + value + valueSuffix; break;\n }\n\n return numerals(value);\n }\n\n format.toString = function() {\n return specifier + "";\n };\n\n return format;\n }\n\n function formatPrefix(specifier, value) {\n var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = "f", specifier)),\n e = Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3,\n k = Math.pow(10, -e),\n prefix = prefixes[8 + e / 3];\n return function(value) {\n return f(k * value) + prefix;\n };\n }\n\n return {\n format: newFormat,\n formatPrefix: formatPrefix\n };\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-format/src/defaultLocale.js\n\n\nvar defaultLocale_locale;\nvar format;\nvar formatPrefix;\n\ndefaultLocale({\n thousands: ",",\n grouping: [3],\n currency: ["$", ""]\n});\n\nfunction defaultLocale(definition) {\n defaultLocale_locale = locale(definition);\n format = defaultLocale_locale.format;\n formatPrefix = defaultLocale_locale.formatPrefix;\n return defaultLocale_locale;\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-format/src/precisionRound.js\n\n\n/* harmony default export */ function precisionRound(step, max) {\n step = Math.abs(step), max = Math.abs(max) - step;\n return Math.max(0, exponent(max) - exponent(step)) + 1;\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-format/src/precisionFixed.js\n\n\n/* harmony default export */ function precisionFixed(step) {\n return Math.max(0, -exponent(Math.abs(step)));\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-scale/src/tickFormat.js\n\n\n\nfunction tickFormat(start, stop, count, specifier) {\n var step = tickStep(start, stop, count),\n precision;\n specifier = formatSpecifier(specifier == null ? ",f" : specifier);\n switch (specifier.type) {\n case "s": {\n var value = Math.max(Math.abs(start), Math.abs(stop));\n if (specifier.precision == null && !isNaN(precision = precisionPrefix(step, value))) specifier.precision = precision;\n return formatPrefix(specifier, value);\n }\n case "":\n case "e":\n case "g":\n case "p":\n case "r": {\n if (specifier.precision == null && !isNaN(precision = precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === "e");\n break;\n }\n case "f":\n case "%": {\n if (specifier.precision == null && !isNaN(precision = precisionFixed(step))) specifier.precision = precision - (specifier.type === "%") * 2;\n break;\n }\n }\n return format(specifier);\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-scale/src/linear.js\n\n\n\n\n\nfunction linearish(scale) {\n var domain = scale.domain;\n\n scale.ticks = function(count) {\n var d = domain();\n return ticks(d[0], d[d.length - 1], count == null ? 10 : count);\n };\n\n scale.tickFormat = function(count, specifier) {\n var d = domain();\n return tickFormat(d[0], d[d.length - 1], count == null ? 10 : count, specifier);\n };\n\n scale.nice = function(count) {\n if (count == null) count = 10;\n\n var d = domain();\n var i0 = 0;\n var i1 = d.length - 1;\n var start = d[i0];\n var stop = d[i1];\n var prestep;\n var step;\n var maxIter = 10;\n\n if (stop < start) {\n step = start, start = stop, stop = step;\n step = i0, i0 = i1, i1 = step;\n }\n \n while (maxIter-- > 0) {\n step = tickIncrement(start, stop, count);\n if (step === prestep) {\n d[i0] = start\n d[i1] = stop\n return domain(d);\n } else if (step > 0) {\n start = Math.floor(start / step) * step;\n stop = Math.ceil(stop / step) * step;\n } else if (step < 0) {\n start = Math.ceil(start * step) / step;\n stop = Math.floor(stop * step) / step;\n } else {\n break;\n }\n prestep = step;\n }\n\n return scale;\n };\n\n return scale;\n}\n\nfunction linear_linear() {\n var scale = continuous();\n\n scale.copy = function() {\n return copy(scale, linear_linear());\n };\n\n initRange.apply(scale, arguments);\n\n return linearish(scale);\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-time/src/duration.js\nconst durationSecond = 1000;\nconst durationMinute = durationSecond * 60;\nconst durationHour = durationMinute * 60;\nconst durationDay = durationHour * 24;\nconst durationWeek = durationDay * 7;\nconst durationMonth = durationDay * 30;\nconst durationYear = durationDay * 365;\n\n;// CONCATENATED MODULE: ../node_modules/d3-time/src/interval.js\nconst t0 = new Date, t1 = new Date;\n\nfunction timeInterval(floori, offseti, count, field) {\n\n function interval(date) {\n return floori(date = arguments.length === 0 ? new Date : new Date(+date)), date;\n }\n\n interval.floor = (date) => {\n return floori(date = new Date(+date)), date;\n };\n\n interval.ceil = (date) => {\n return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date;\n };\n\n interval.round = (date) => {\n const d0 = interval(date), d1 = interval.ceil(date);\n return date - d0 < d1 - date ? d0 : d1;\n };\n\n interval.offset = (date, step) => {\n return offseti(date = new Date(+date), step == null ? 1 : Math.floor(step)), date;\n };\n\n interval.range = (start, stop, step) => {\n const range = [];\n start = interval.ceil(start);\n step = step == null ? 1 : Math.floor(step);\n if (!(start < stop) || !(step > 0)) return range; // also handles Invalid Date\n let previous;\n do range.push(previous = new Date(+start)), offseti(start, step), floori(start);\n while (previous < start && start < stop);\n return range;\n };\n\n interval.filter = (test) => {\n return timeInterval((date) => {\n if (date >= date) while (floori(date), !test(date)) date.setTime(date - 1);\n }, (date, step) => {\n if (date >= date) {\n if (step < 0) while (++step <= 0) {\n while (offseti(date, -1), !test(date)) {} // eslint-disable-line no-empty\n } else while (--step >= 0) {\n while (offseti(date, +1), !test(date)) {} // eslint-disable-line no-empty\n }\n }\n });\n };\n\n if (count) {\n interval.count = (start, end) => {\n t0.setTime(+start), t1.setTime(+end);\n floori(t0), floori(t1);\n return Math.floor(count(t0, t1));\n };\n\n interval.every = (step) => {\n step = Math.floor(step);\n return !isFinite(step) || !(step > 0) ? null\n : !(step > 1) ? interval\n : interval.filter(field\n ? (d) => field(d) % step === 0\n : (d) => interval.count(0, d) % step === 0);\n };\n }\n\n return interval;\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-time/src/millisecond.js\n\n\nconst millisecond = timeInterval(() => {\n // noop\n}, (date, step) => {\n date.setTime(+date + step);\n}, (start, end) => {\n return end - start;\n});\n\n// An optimized implementation for this simple case.\nmillisecond.every = (k) => {\n k = Math.floor(k);\n if (!isFinite(k) || !(k > 0)) return null;\n if (!(k > 1)) return millisecond;\n return timeInterval((date) => {\n date.setTime(Math.floor(date / k) * k);\n }, (date, step) => {\n date.setTime(+date + step * k);\n }, (start, end) => {\n return (end - start) / k;\n });\n};\n\nconst milliseconds = millisecond.range;\n\n;// CONCATENATED MODULE: ../node_modules/d3-time/src/second.js\n\n\n\nconst second = timeInterval((date) => {\n date.setTime(date - date.getMilliseconds());\n}, (date, step) => {\n date.setTime(+date + step * durationSecond);\n}, (start, end) => {\n return (end - start) / durationSecond;\n}, (date) => {\n return date.getUTCSeconds();\n});\n\nconst seconds = second.range;\n\n;// CONCATENATED MODULE: ../node_modules/d3-time/src/minute.js\n\n\n\nconst timeMinute = timeInterval((date) => {\n date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond);\n}, (date, step) => {\n date.setTime(+date + step * durationMinute);\n}, (start, end) => {\n return (end - start) / durationMinute;\n}, (date) => {\n return date.getMinutes();\n});\n\nconst timeMinutes = timeMinute.range;\n\nconst utcMinute = timeInterval((date) => {\n date.setUTCSeconds(0, 0);\n}, (date, step) => {\n date.setTime(+date + step * durationMinute);\n}, (start, end) => {\n return (end - start) / durationMinute;\n}, (date) => {\n return date.getUTCMinutes();\n});\n\nconst utcMinutes = utcMinute.range;\n\n;// CONCATENATED MODULE: ../node_modules/d3-time/src/hour.js\n\n\n\nconst timeHour = timeInterval((date) => {\n date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond - date.getMinutes() * durationMinute);\n}, (date, step) => {\n date.setTime(+date + step * durationHour);\n}, (start, end) => {\n return (end - start) / durationHour;\n}, (date) => {\n return date.getHours();\n});\n\nconst timeHours = timeHour.range;\n\nconst utcHour = timeInterval((date) => {\n date.setUTCMinutes(0, 0, 0);\n}, (date, step) => {\n date.setTime(+date + step * durationHour);\n}, (start, end) => {\n return (end - start) / durationHour;\n}, (date) => {\n return date.getUTCHours();\n});\n\nconst utcHours = utcHour.range;\n\n;// CONCATENATED MODULE: ../node_modules/d3-time/src/day.js\n\n\n\nconst timeDay = timeInterval(\n date => date.setHours(0, 0, 0, 0),\n (date, step) => date.setDate(date.getDate() + step),\n (start, end) => (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationDay,\n date => date.getDate() - 1\n);\n\nconst timeDays = timeDay.range;\n\nconst utcDay = timeInterval((date) => {\n date.setUTCHours(0, 0, 0, 0);\n}, (date, step) => {\n date.setUTCDate(date.getUTCDate() + step);\n}, (start, end) => {\n return (end - start) / durationDay;\n}, (date) => {\n return date.getUTCDate() - 1;\n});\n\nconst utcDays = utcDay.range;\n\nconst unixDay = timeInterval((date) => {\n date.setUTCHours(0, 0, 0, 0);\n}, (date, step) => {\n date.setUTCDate(date.getUTCDate() + step);\n}, (start, end) => {\n return (end - start) / durationDay;\n}, (date) => {\n return Math.floor(date / durationDay);\n});\n\nconst unixDays = unixDay.range;\n\n;// CONCATENATED MODULE: ../node_modules/d3-time/src/week.js\n\n\n\nfunction timeWeekday(i) {\n return timeInterval((date) => {\n date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7);\n date.setHours(0, 0, 0, 0);\n }, (date, step) => {\n date.setDate(date.getDate() + step * 7);\n }, (start, end) => {\n return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationWeek;\n });\n}\n\nconst timeSunday = timeWeekday(0);\nconst timeMonday = timeWeekday(1);\nconst timeTuesday = timeWeekday(2);\nconst timeWednesday = timeWeekday(3);\nconst timeThursday = timeWeekday(4);\nconst timeFriday = timeWeekday(5);\nconst timeSaturday = timeWeekday(6);\n\nconst timeSundays = timeSunday.range;\nconst timeMondays = timeMonday.range;\nconst timeTuesdays = timeTuesday.range;\nconst timeWednesdays = timeWednesday.range;\nconst timeThursdays = timeThursday.range;\nconst timeFridays = timeFriday.range;\nconst timeSaturdays = timeSaturday.range;\n\nfunction utcWeekday(i) {\n return timeInterval((date) => {\n date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7);\n date.setUTCHours(0, 0, 0, 0);\n }, (date, step) => {\n date.setUTCDate(date.getUTCDate() + step * 7);\n }, (start, end) => {\n return (end - start) / durationWeek;\n });\n}\n\nconst utcSunday = utcWeekday(0);\nconst utcMonday = utcWeekday(1);\nconst utcTuesday = utcWeekday(2);\nconst utcWednesday = utcWeekday(3);\nconst utcThursday = utcWeekday(4);\nconst utcFriday = utcWeekday(5);\nconst utcSaturday = utcWeekday(6);\n\nconst utcSundays = utcSunday.range;\nconst utcMondays = utcMonday.range;\nconst utcTuesdays = utcTuesday.range;\nconst utcWednesdays = utcWednesday.range;\nconst utcThursdays = utcThursday.range;\nconst utcFridays = utcFriday.range;\nconst utcSaturdays = utcSaturday.range;\n\n;// CONCATENATED MODULE: ../node_modules/d3-time/src/month.js\n\n\nconst timeMonth = timeInterval((date) => {\n date.setDate(1);\n date.setHours(0, 0, 0, 0);\n}, (date, step) => {\n date.setMonth(date.getMonth() + step);\n}, (start, end) => {\n return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12;\n}, (date) => {\n return date.getMonth();\n});\n\nconst timeMonths = timeMonth.range;\n\nconst utcMonth = timeInterval((date) => {\n date.setUTCDate(1);\n date.setUTCHours(0, 0, 0, 0);\n}, (date, step) => {\n date.setUTCMonth(date.getUTCMonth() + step);\n}, (start, end) => {\n return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12;\n}, (date) => {\n return date.getUTCMonth();\n});\n\nconst utcMonths = utcMonth.range;\n\n;// CONCATENATED MODULE: ../node_modules/d3-time/src/year.js\n\n\nconst timeYear = timeInterval((date) => {\n date.setMonth(0, 1);\n date.setHours(0, 0, 0, 0);\n}, (date, step) => {\n date.setFullYear(date.getFullYear() + step);\n}, (start, end) => {\n return end.getFullYear() - start.getFullYear();\n}, (date) => {\n return date.getFullYear();\n});\n\n// An optimized implementation for this simple case.\ntimeYear.every = (k) => {\n return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : timeInterval((date) => {\n date.setFullYear(Math.floor(date.getFullYear() / k) * k);\n date.setMonth(0, 1);\n date.setHours(0, 0, 0, 0);\n }, (date, step) => {\n date.setFullYear(date.getFullYear() + step * k);\n });\n};\n\nconst timeYears = timeYear.range;\n\nconst utcYear = timeInterval((date) => {\n date.setUTCMonth(0, 1);\n date.setUTCHours(0, 0, 0, 0);\n}, (date, step) => {\n date.setUTCFullYear(date.getUTCFullYear() + step);\n}, (start, end) => {\n return end.getUTCFullYear() - start.getUTCFullYear();\n}, (date) => {\n return date.getUTCFullYear();\n});\n\n// An optimized implementation for this simple case.\nutcYear.every = (k) => {\n return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : timeInterval((date) => {\n date.setUTCFullYear(Math.floor(date.getUTCFullYear() / k) * k);\n date.setUTCMonth(0, 1);\n date.setUTCHours(0, 0, 0, 0);\n }, (date, step) => {\n date.setUTCFullYear(date.getUTCFullYear() + step * k);\n });\n};\n\nconst utcYears = utcYear.range;\n\n;// CONCATENATED MODULE: ../node_modules/d3-time/src/ticks.js\n\n\n\n\n\n\n\n\n\n\n\nfunction ticker(year, month, week, day, hour, minute) {\n\n const tickIntervals = [\n [second, 1, durationSecond],\n [second, 5, 5 * durationSecond],\n [second, 15, 15 * durationSecond],\n [second, 30, 30 * durationSecond],\n [minute, 1, durationMinute],\n [minute, 5, 5 * durationMinute],\n [minute, 15, 15 * durationMinute],\n [minute, 30, 30 * durationMinute],\n [ hour, 1, durationHour ],\n [ hour, 3, 3 * durationHour ],\n [ hour, 6, 6 * durationHour ],\n [ hour, 12, 12 * durationHour ],\n [ day, 1, durationDay ],\n [ day, 2, 2 * durationDay ],\n [ week, 1, durationWeek ],\n [ month, 1, durationMonth ],\n [ month, 3, 3 * durationMonth ],\n [ year, 1, durationYear ]\n ];\n\n function ticks(start, stop, count) {\n const reverse = stop < start;\n if (reverse) [start, stop] = [stop, start];\n const interval = count && typeof count.range === "function" ? count : tickInterval(start, stop, count);\n const ticks = interval ? interval.range(start, +stop + 1) : []; // inclusive stop\n return reverse ? ticks.reverse() : ticks;\n }\n\n function tickInterval(start, stop, count) {\n const target = Math.abs(stop - start) / count;\n const i = bisector(([,, step]) => step).right(tickIntervals, target);\n if (i === tickIntervals.length) return year.every(tickStep(start / durationYear, stop / durationYear, count));\n if (i === 0) return millisecond.every(Math.max(tickStep(start, stop, count), 1));\n const [t, step] = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i];\n return t.every(step);\n }\n\n return [ticks, tickInterval];\n}\n\nconst [utcTicks, utcTickInterval] = ticker(utcYear, utcMonth, utcSunday, unixDay, utcHour, utcMinute);\nconst [timeTicks, timeTickInterval] = ticker(timeYear, timeMonth, timeSunday, timeDay, timeHour, timeMinute);\n\n\n\n;// CONCATENATED MODULE: ../node_modules/d3-time-format/src/locale.js\n\n\nfunction localDate(d) {\n if (0 <= d.y && d.y < 100) {\n var date = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L);\n date.setFullYear(d.y);\n return date;\n }\n return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L);\n}\n\nfunction utcDate(d) {\n if (0 <= d.y && d.y < 100) {\n var date = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L));\n date.setUTCFullYear(d.y);\n return date;\n }\n return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L));\n}\n\nfunction newDate(y, m, d) {\n return {y: y, m: m, d: d, H: 0, M: 0, S: 0, L: 0};\n}\n\nfunction formatLocale(locale) {\n var locale_dateTime = locale.dateTime,\n locale_date = locale.date,\n locale_time = locale.time,\n locale_periods = locale.periods,\n locale_weekdays = locale.days,\n locale_shortWeekdays = locale.shortDays,\n locale_months = locale.months,\n locale_shortMonths = locale.shortMonths;\n\n var periodRe = formatRe(locale_periods),\n periodLookup = formatLookup(locale_periods),\n weekdayRe = formatRe(locale_weekdays),\n weekdayLookup = formatLookup(locale_weekdays),\n shortWeekdayRe = formatRe(locale_shortWeekdays),\n shortWeekdayLookup = formatLookup(locale_shortWeekdays),\n monthRe = formatRe(locale_months),\n monthLookup = formatLookup(locale_months),\n shortMonthRe = formatRe(locale_shortMonths),\n shortMonthLookup = formatLookup(locale_shortMonths);\n\n var formats = {\n "a": formatShortWeekday,\n "A": formatWeekday,\n "b": formatShortMonth,\n "B": formatMonth,\n "c": null,\n "d": formatDayOfMonth,\n "e": formatDayOfMonth,\n "f": formatMicroseconds,\n "g": formatYearISO,\n "G": formatFullYearISO,\n "H": formatHour24,\n "I": formatHour12,\n "j": formatDayOfYear,\n "L": formatMilliseconds,\n "m": formatMonthNumber,\n "M": formatMinutes,\n "p": formatPeriod,\n "q": formatQuarter,\n "Q": formatUnixTimestamp,\n "s": formatUnixTimestampSeconds,\n "S": formatSeconds,\n "u": formatWeekdayNumberMonday,\n "U": formatWeekNumberSunday,\n "V": formatWeekNumberISO,\n "w": formatWeekdayNumberSunday,\n "W": formatWeekNumberMonday,\n "x": null,\n "X": null,\n "y": formatYear,\n "Y": formatFullYear,\n "Z": formatZone,\n "%": formatLiteralPercent\n };\n\n var utcFormats = {\n "a": formatUTCShortWeekday,\n "A": formatUTCWeekday,\n "b": formatUTCShortMonth,\n "B": formatUTCMonth,\n "c": null,\n "d": formatUTCDayOfMonth,\n "e": formatUTCDayOfMonth,\n "f": formatUTCMicroseconds,\n "g": formatUTCYearISO,\n "G": formatUTCFullYearISO,\n "H": formatUTCHour24,\n "I": formatUTCHour12,\n "j": formatUTCDayOfYear,\n "L": formatUTCMilliseconds,\n "m": formatUTCMonthNumber,\n "M": formatUTCMinutes,\n "p": formatUTCPeriod,\n "q": formatUTCQuarter,\n "Q": formatUnixTimestamp,\n "s": formatUnixTimestampSeconds,\n "S": formatUTCSeconds,\n "u": formatUTCWeekdayNumberMonday,\n "U": formatUTCWeekNumberSunday,\n "V": formatUTCWeekNumberISO,\n "w": formatUTCWeekdayNumberSunday,\n "W": formatUTCWeekNumberMonday,\n "x": null,\n "X": null,\n "y": formatUTCYear,\n "Y": formatUTCFullYear,\n "Z": formatUTCZone,\n "%": formatLiteralPercent\n };\n\n var parses = {\n "a": parseShortWeekday,\n "A": parseWeekday,\n "b": parseShortMonth,\n "B": parseMonth,\n "c": parseLocaleDateTime,\n "d": parseDayOfMonth,\n "e": parseDayOfMonth,\n "f": parseMicroseconds,\n "g": parseYear,\n "G": parseFullYear,\n "H": parseHour24,\n "I": parseHour24,\n "j": parseDayOfYear,\n "L": parseMilliseconds,\n "m": parseMonthNumber,\n "M": parseMinutes,\n "p": parsePeriod,\n "q": parseQuarter,\n "Q": parseUnixTimestamp,\n "s": parseUnixTimestampSeconds,\n "S": parseSeconds,\n "u": parseWeekdayNumberMonday,\n "U": parseWeekNumberSunday,\n "V": parseWeekNumberISO,\n "w": parseWeekdayNumberSunday,\n "W": parseWeekNumberMonday,\n "x": parseLocaleDate,\n "X": parseLocaleTime,\n "y": parseYear,\n "Y": parseFullYear,\n "Z": parseZone,\n "%": parseLiteralPercent\n };\n\n // These recursive directive definitions must be deferred.\n formats.x = newFormat(locale_date, formats);\n formats.X = newFormat(locale_time, formats);\n formats.c = newFormat(locale_dateTime, formats);\n utcFormats.x = newFormat(locale_date, utcFormats);\n utcFormats.X = newFormat(locale_time, utcFormats);\n utcFormats.c = newFormat(locale_dateTime, utcFormats);\n\n function newFormat(specifier, formats) {\n return function(date) {\n var string = [],\n i = -1,\n j = 0,\n n = specifier.length,\n c,\n pad,\n format;\n\n if (!(date instanceof Date)) date = new Date(+date);\n\n while (++i < n) {\n if (specifier.charCodeAt(i) === 37) {\n string.push(specifier.slice(j, i));\n if ((pad = pads[c = specifier.charAt(++i)]) != null) c = specifier.charAt(++i);\n else pad = c === "e" ? " " : "0";\n if (format = formats[c]) c = format(date, pad);\n string.push(c);\n j = i + 1;\n }\n }\n\n string.push(specifier.slice(j, i));\n return string.join("");\n };\n }\n\n function newParse(specifier, Z) {\n return function(string) {\n var d = newDate(1900, undefined, 1),\n i = parseSpecifier(d, specifier, string += "", 0),\n week, day;\n if (i != string.length) return null;\n\n // If a UNIX timestamp is specified, return it.\n if ("Q" in d) return new Date(d.Q);\n if ("s" in d) return new Date(d.s * 1000 + ("L" in d ? d.L : 0));\n\n // If this is utcParse, never use the local timezone.\n if (Z && !("Z" in d)) d.Z = 0;\n\n // The am-pm flag is 0 for AM, and 1 for PM.\n if ("p" in d) d.H = d.H % 12 + d.p * 12;\n\n // If the month was not specified, inherit from the quarter.\n if (d.m === undefined) d.m = "q" in d ? d.q : 0;\n\n // Convert day-of-week and week-of-year to day-of-year.\n if ("V" in d) {\n if (d.V < 1 || d.V > 53) return null;\n if (!("w" in d)) d.w = 1;\n if ("Z" in d) {\n week = utcDate(newDate(d.y, 0, 1)), day = week.getUTCDay();\n week = day > 4 || day === 0 ? utcMonday.ceil(week) : utcMonday(week);\n week = utcDay.offset(week, (d.V - 1) * 7);\n d.y = week.getUTCFullYear();\n d.m = week.getUTCMonth();\n d.d = week.getUTCDate() + (d.w + 6) % 7;\n } else {\n week = localDate(newDate(d.y, 0, 1)), day = week.getDay();\n week = day > 4 || day === 0 ? timeMonday.ceil(week) : timeMonday(week);\n week = timeDay.offset(week, (d.V - 1) * 7);\n d.y = week.getFullYear();\n d.m = week.getMonth();\n d.d = week.getDate() + (d.w + 6) % 7;\n }\n } else if ("W" in d || "U" in d) {\n if (!("w" in d)) d.w = "u" in d ? d.u % 7 : "W" in d ? 1 : 0;\n day = "Z" in d ? utcDate(newDate(d.y, 0, 1)).getUTCDay() : localDate(newDate(d.y, 0, 1)).getDay();\n d.m = 0;\n d.d = "W" in d ? (d.w + 6) % 7 + d.W * 7 - (day + 5) % 7 : d.w + d.U * 7 - (day + 6) % 7;\n }\n\n // If a time zone is specified, all fields are interpreted as UTC and then\n // offset according to the specified time zone.\n if ("Z" in d) {\n d.H += d.Z / 100 | 0;\n d.M += d.Z % 100;\n return utcDate(d);\n }\n\n // Otherwise, all fields are in local time.\n return localDate(d);\n };\n }\n\n function parseSpecifier(d, specifier, string, j) {\n var i = 0,\n n = specifier.length,\n m = string.length,\n c,\n parse;\n\n while (i < n) {\n if (j >= m) return -1;\n c = specifier.charCodeAt(i++);\n if (c === 37) {\n c = specifier.charAt(i++);\n parse = parses[c in pads ? specifier.charAt(i++) : c];\n if (!parse || ((j = parse(d, string, j)) < 0)) return -1;\n } else if (c != string.charCodeAt(j++)) {\n return -1;\n }\n }\n\n return j;\n }\n\n function parsePeriod(d, string, i) {\n var n = periodRe.exec(string.slice(i));\n return n ? (d.p = periodLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n }\n\n function parseShortWeekday(d, string, i) {\n var n = shortWeekdayRe.exec(string.slice(i));\n return n ? (d.w = shortWeekdayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n }\n\n function parseWeekday(d, string, i) {\n var n = weekdayRe.exec(string.slice(i));\n return n ? (d.w = weekdayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n }\n\n function parseShortMonth(d, string, i) {\n var n = shortMonthRe.exec(string.slice(i));\n return n ? (d.m = shortMonthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n }\n\n function parseMonth(d, string, i) {\n var n = monthRe.exec(string.slice(i));\n return n ? (d.m = monthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n }\n\n function parseLocaleDateTime(d, string, i) {\n return parseSpecifier(d, locale_dateTime, string, i);\n }\n\n function parseLocaleDate(d, string, i) {\n return parseSpecifier(d, locale_date, string, i);\n }\n\n function parseLocaleTime(d, string, i) {\n return parseSpecifier(d, locale_time, string, i);\n }\n\n function formatShortWeekday(d) {\n return locale_shortWeekdays[d.getDay()];\n }\n\n function formatWeekday(d) {\n return locale_weekdays[d.getDay()];\n }\n\n function formatShortMonth(d) {\n return locale_shortMonths[d.getMonth()];\n }\n\n function formatMonth(d) {\n return locale_months[d.getMonth()];\n }\n\n function formatPeriod(d) {\n return locale_periods[+(d.getHours() >= 12)];\n }\n\n function formatQuarter(d) {\n return 1 + ~~(d.getMonth() / 3);\n }\n\n function formatUTCShortWeekday(d) {\n return locale_shortWeekdays[d.getUTCDay()];\n }\n\n function formatUTCWeekday(d) {\n return locale_weekdays[d.getUTCDay()];\n }\n\n function formatUTCShortMonth(d) {\n return locale_shortMonths[d.getUTCMonth()];\n }\n\n function formatUTCMonth(d) {\n return locale_months[d.getUTCMonth()];\n }\n\n function formatUTCPeriod(d) {\n return locale_periods[+(d.getUTCHours() >= 12)];\n }\n\n function formatUTCQuarter(d) {\n return 1 + ~~(d.getUTCMonth() / 3);\n }\n\n return {\n format: function(specifier) {\n var f = newFormat(specifier += "", formats);\n f.toString = function() { return specifier; };\n return f;\n },\n parse: function(specifier) {\n var p = newParse(specifier += "", false);\n p.toString = function() { return specifier; };\n return p;\n },\n utcFormat: function(specifier) {\n var f = newFormat(specifier += "", utcFormats);\n f.toString = function() { return specifier; };\n return f;\n },\n utcParse: function(specifier) {\n var p = newParse(specifier += "", true);\n p.toString = function() { return specifier; };\n return p;\n }\n };\n}\n\nvar pads = {"-": "", "_": " ", "0": "0"},\n numberRe = /^\\s*\\d+/, // note: ignores next directive\n percentRe = /^%/,\n requoteRe = /[\\\\^$*+?|[\\]().{}]/g;\n\nfunction pad(value, fill, width) {\n var sign = value < 0 ? "-" : "",\n string = (sign ? -value : value) + "",\n length = string.length;\n return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);\n}\n\nfunction requote(s) {\n return s.replace(requoteRe, "\\\\$&");\n}\n\nfunction formatRe(names) {\n return new RegExp("^(?:" + names.map(requote).join("|") + ")", "i");\n}\n\nfunction formatLookup(names) {\n return new Map(names.map((name, i) => [name.toLowerCase(), i]));\n}\n\nfunction parseWeekdayNumberSunday(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 1));\n return n ? (d.w = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekdayNumberMonday(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 1));\n return n ? (d.u = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekNumberSunday(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.U = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekNumberISO(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.V = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekNumberMonday(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.W = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseFullYear(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 4));\n return n ? (d.y = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseYear(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2000), i + n[0].length) : -1;\n}\n\nfunction parseZone(d, string, i) {\n var n = /^(Z)|([+-]\\d\\d)(?::?(\\d\\d))?/.exec(string.slice(i, i + 6));\n return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || "00")), i + n[0].length) : -1;\n}\n\nfunction parseQuarter(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 1));\n return n ? (d.q = n[0] * 3 - 3, i + n[0].length) : -1;\n}\n\nfunction parseMonthNumber(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.m = n[0] - 1, i + n[0].length) : -1;\n}\n\nfunction parseDayOfMonth(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.d = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseDayOfYear(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 3));\n return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseHour24(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.H = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseMinutes(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.M = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseSeconds(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.S = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseMilliseconds(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 3));\n return n ? (d.L = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseMicroseconds(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 6));\n return n ? (d.L = Math.floor(n[0] / 1000), i + n[0].length) : -1;\n}\n\nfunction parseLiteralPercent(d, string, i) {\n var n = percentRe.exec(string.slice(i, i + 1));\n return n ? i + n[0].length : -1;\n}\n\nfunction parseUnixTimestamp(d, string, i) {\n var n = numberRe.exec(string.slice(i));\n return n ? (d.Q = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseUnixTimestampSeconds(d, string, i) {\n var n = numberRe.exec(string.slice(i));\n return n ? (d.s = +n[0], i + n[0].length) : -1;\n}\n\nfunction formatDayOfMonth(d, p) {\n return pad(d.getDate(), p, 2);\n}\n\nfunction formatHour24(d, p) {\n return pad(d.getHours(), p, 2);\n}\n\nfunction formatHour12(d, p) {\n return pad(d.getHours() % 12 || 12, p, 2);\n}\n\nfunction formatDayOfYear(d, p) {\n return pad(1 + timeDay.count(timeYear(d), d), p, 3);\n}\n\nfunction formatMilliseconds(d, p) {\n return pad(d.getMilliseconds(), p, 3);\n}\n\nfunction formatMicroseconds(d, p) {\n return formatMilliseconds(d, p) + "000";\n}\n\nfunction formatMonthNumber(d, p) {\n return pad(d.getMonth() + 1, p, 2);\n}\n\nfunction formatMinutes(d, p) {\n return pad(d.getMinutes(), p, 2);\n}\n\nfunction formatSeconds(d, p) {\n return pad(d.getSeconds(), p, 2);\n}\n\nfunction formatWeekdayNumberMonday(d) {\n var day = d.getDay();\n return day === 0 ? 7 : day;\n}\n\nfunction formatWeekNumberSunday(d, p) {\n return pad(timeSunday.count(timeYear(d) - 1, d), p, 2);\n}\n\nfunction dISO(d) {\n var day = d.getDay();\n return (day >= 4 || day === 0) ? timeThursday(d) : timeThursday.ceil(d);\n}\n\nfunction formatWeekNumberISO(d, p) {\n d = dISO(d);\n return pad(timeThursday.count(timeYear(d), d) + (timeYear(d).getDay() === 4), p, 2);\n}\n\nfunction formatWeekdayNumberSunday(d) {\n return d.getDay();\n}\n\nfunction formatWeekNumberMonday(d, p) {\n return pad(timeMonday.count(timeYear(d) - 1, d), p, 2);\n}\n\nfunction formatYear(d, p) {\n return pad(d.getFullYear() % 100, p, 2);\n}\n\nfunction formatYearISO(d, p) {\n d = dISO(d);\n return pad(d.getFullYear() % 100, p, 2);\n}\n\nfunction formatFullYear(d, p) {\n return pad(d.getFullYear() % 10000, p, 4);\n}\n\nfunction formatFullYearISO(d, p) {\n var day = d.getDay();\n d = (day >= 4 || day === 0) ? timeThursday(d) : timeThursday.ceil(d);\n return pad(d.getFullYear() % 10000, p, 4);\n}\n\nfunction formatZone(d) {\n var z = d.getTimezoneOffset();\n return (z > 0 ? "-" : (z *= -1, "+"))\n + pad(z / 60 | 0, "0", 2)\n + pad(z % 60, "0", 2);\n}\n\nfunction formatUTCDayOfMonth(d, p) {\n return pad(d.getUTCDate(), p, 2);\n}\n\nfunction formatUTCHour24(d, p) {\n return pad(d.getUTCHours(), p, 2);\n}\n\nfunction formatUTCHour12(d, p) {\n return pad(d.getUTCHours() % 12 || 12, p, 2);\n}\n\nfunction formatUTCDayOfYear(d, p) {\n return pad(1 + utcDay.count(utcYear(d), d), p, 3);\n}\n\nfunction formatUTCMilliseconds(d, p) {\n return pad(d.getUTCMilliseconds(), p, 3);\n}\n\nfunction formatUTCMicroseconds(d, p) {\n return formatUTCMilliseconds(d, p) + "000";\n}\n\nfunction formatUTCMonthNumber(d, p) {\n return pad(d.getUTCMonth() + 1, p, 2);\n}\n\nfunction formatUTCMinutes(d, p) {\n return pad(d.getUTCMinutes(), p, 2);\n}\n\nfunction formatUTCSeconds(d, p) {\n return pad(d.getUTCSeconds(), p, 2);\n}\n\nfunction formatUTCWeekdayNumberMonday(d) {\n var dow = d.getUTCDay();\n return dow === 0 ? 7 : dow;\n}\n\nfunction formatUTCWeekNumberSunday(d, p) {\n return pad(utcSunday.count(utcYear(d) - 1, d), p, 2);\n}\n\nfunction UTCdISO(d) {\n var day = d.getUTCDay();\n return (day >= 4 || day === 0) ? utcThursday(d) : utcThursday.ceil(d);\n}\n\nfunction formatUTCWeekNumberISO(d, p) {\n d = UTCdISO(d);\n return pad(utcThursday.count(utcYear(d), d) + (utcYear(d).getUTCDay() === 4), p, 2);\n}\n\nfunction formatUTCWeekdayNumberSunday(d) {\n return d.getUTCDay();\n}\n\nfunction formatUTCWeekNumberMonday(d, p) {\n return pad(utcMonday.count(utcYear(d) - 1, d), p, 2);\n}\n\nfunction formatUTCYear(d, p) {\n return pad(d.getUTCFullYear() % 100, p, 2);\n}\n\nfunction formatUTCYearISO(d, p) {\n d = UTCdISO(d);\n return pad(d.getUTCFullYear() % 100, p, 2);\n}\n\nfunction formatUTCFullYear(d, p) {\n return pad(d.getUTCFullYear() % 10000, p, 4);\n}\n\nfunction formatUTCFullYearISO(d, p) {\n var day = d.getUTCDay();\n d = (day >= 4 || day === 0) ? utcThursday(d) : utcThursday.ceil(d);\n return pad(d.getUTCFullYear() % 10000, p, 4);\n}\n\nfunction formatUTCZone() {\n return "+0000";\n}\n\nfunction formatLiteralPercent() {\n return "%";\n}\n\nfunction formatUnixTimestamp(d) {\n return +d;\n}\n\nfunction formatUnixTimestampSeconds(d) {\n return Math.floor(+d / 1000);\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-time-format/src/defaultLocale.js\n\n\nvar src_defaultLocale_locale;\nvar timeFormat;\nvar timeParse;\nvar utcFormat;\nvar utcParse;\n\ndefaultLocale_defaultLocale({\n dateTime: "%x, %X",\n date: "%-m/%-d/%Y",\n time: "%-I:%M:%S %p",\n periods: ["AM", "PM"],\n days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],\n shortDays: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],\n months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],\n shortMonths: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]\n});\n\nfunction defaultLocale_defaultLocale(definition) {\n src_defaultLocale_locale = formatLocale(definition);\n timeFormat = src_defaultLocale_locale.format;\n timeParse = src_defaultLocale_locale.parse;\n utcFormat = src_defaultLocale_locale.utcFormat;\n utcParse = src_defaultLocale_locale.utcParse;\n return src_defaultLocale_locale;\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-scale/src/nice.js\nfunction nice(domain, interval) {\n domain = domain.slice();\n\n var i0 = 0,\n i1 = domain.length - 1,\n x0 = domain[i0],\n x1 = domain[i1],\n t;\n\n if (x1 < x0) {\n t = i0, i0 = i1, i1 = t;\n t = x0, x0 = x1, x1 = t;\n }\n\n domain[i0] = interval.floor(x0);\n domain[i1] = interval.ceil(x1);\n return domain;\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-scale/src/time.js\n\n\n\n\n\n\nfunction time_date(t) {\n return new Date(t);\n}\n\nfunction time_number(t) {\n return t instanceof Date ? +t : +new Date(+t);\n}\n\nfunction calendar(ticks, tickInterval, year, month, week, day, hour, minute, second, format) {\n var scale = continuous(),\n invert = scale.invert,\n domain = scale.domain;\n\n var formatMillisecond = format(".%L"),\n formatSecond = format(":%S"),\n formatMinute = format("%I:%M"),\n formatHour = format("%I %p"),\n formatDay = format("%a %d"),\n formatWeek = format("%b %d"),\n formatMonth = format("%B"),\n formatYear = format("%Y");\n\n function tickFormat(date) {\n return (second(date) < date ? formatMillisecond\n : minute(date) < date ? formatSecond\n : hour(date) < date ? formatMinute\n : day(date) < date ? formatHour\n : month(date) < date ? (week(date) < date ? formatDay : formatWeek)\n : year(date) < date ? formatMonth\n : formatYear)(date);\n }\n\n scale.invert = function(y) {\n return new Date(invert(y));\n };\n\n scale.domain = function(_) {\n return arguments.length ? domain(Array.from(_, time_number)) : domain().map(time_date);\n };\n\n scale.ticks = function(interval) {\n var d = domain();\n return ticks(d[0], d[d.length - 1], interval == null ? 10 : interval);\n };\n\n scale.tickFormat = function(count, specifier) {\n return specifier == null ? tickFormat : format(specifier);\n };\n\n scale.nice = function(interval) {\n var d = domain();\n if (!interval || typeof interval.range !== "function") interval = tickInterval(d[0], d[d.length - 1], interval == null ? 10 : interval);\n return interval ? domain(nice(d, interval)) : scale;\n };\n\n scale.copy = function() {\n return copy(scale, calendar(ticks, tickInterval, year, month, week, day, hour, minute, second, format));\n };\n\n return scale;\n}\n\nfunction time() {\n return initRange.apply(calendar(timeTicks, timeTickInterval, timeYear, timeMonth, timeSunday, timeDay, timeHour, timeMinute, second, timeFormat).domain([new Date(2000, 0, 1), new Date(2000, 0, 2)]), arguments);\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-scale/src/sequential.js\n\n\n\n\n\n\n\n\nfunction sequential_transformer() {\n var x0 = 0,\n x1 = 1,\n t0,\n t1,\n k10,\n transform,\n interpolator = continuous_identity,\n clamp = false,\n unknown;\n\n function scale(x) {\n return x == null || isNaN(x = +x) ? unknown : interpolator(k10 === 0 ? 0.5 : (x = (transform(x) - t0) * k10, clamp ? Math.max(0, Math.min(1, x)) : x));\n }\n\n scale.domain = function(_) {\n return arguments.length ? ([x0, x1] = _, t0 = transform(x0 = +x0), t1 = transform(x1 = +x1), k10 = t0 === t1 ? 0 : 1 / (t1 - t0), scale) : [x0, x1];\n };\n\n scale.clamp = function(_) {\n return arguments.length ? (clamp = !!_, scale) : clamp;\n };\n\n scale.interpolator = function(_) {\n return arguments.length ? (interpolator = _, scale) : interpolator;\n };\n\n function range(interpolate) {\n return function(_) {\n var r0, r1;\n return arguments.length ? ([r0, r1] = _, interpolator = interpolate(r0, r1), scale) : [interpolator(0), interpolator(1)];\n };\n }\n\n scale.range = range(value);\n\n scale.rangeRound = range(src_round);\n\n scale.unknown = function(_) {\n return arguments.length ? (unknown = _, scale) : unknown;\n };\n\n return function(t) {\n transform = t, t0 = t(x0), t1 = t(x1), k10 = t0 === t1 ? 0 : 1 / (t1 - t0);\n return scale;\n };\n}\n\nfunction sequential_copy(source, target) {\n return target\n .domain(source.domain())\n .interpolator(source.interpolator())\n .clamp(source.clamp())\n .unknown(source.unknown());\n}\n\nfunction sequential() {\n var scale = linearish(sequential_transformer()(continuous_identity));\n\n scale.copy = function() {\n return sequential_copy(scale, sequential());\n };\n\n return init_initInterpolator.apply(scale, arguments);\n}\n\nfunction sequentialLog() {\n var scale = loggish(sequential_transformer()).domain([1, 10]);\n\n scale.copy = function() {\n return sequential_copy(scale, sequentialLog()).base(scale.base());\n };\n\n return initInterpolator.apply(scale, arguments);\n}\n\nfunction sequentialSymlog() {\n var scale = symlogish(sequential_transformer());\n\n scale.copy = function() {\n return sequential_copy(scale, sequentialSymlog()).constant(scale.constant());\n };\n\n return initInterpolator.apply(scale, arguments);\n}\n\nfunction sequentialPow() {\n var scale = powish(sequential_transformer());\n\n scale.copy = function() {\n return sequential_copy(scale, sequentialPow()).exponent(scale.exponent());\n };\n\n return initInterpolator.apply(scale, arguments);\n}\n\nfunction sequentialSqrt() {\n return sequentialPow.apply(null, arguments).exponent(0.5);\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-scale/src/index.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n;// CONCATENATED MODULE: ../node_modules/d3-scale-chromatic/src/colors.js\n/* harmony default export */ function colors(specifier) {\n var n = specifier.length / 6 | 0, colors = new Array(n), i = 0;\n while (i < n) colors[i] = "#" + specifier.slice(i * 6, ++i * 6);\n return colors;\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-scale-chromatic/src/categorical/Tableau10.js\n\n\n/* harmony default export */ const Tableau10 = (colors("4e79a7f28e2ce1575976b7b259a14fedc949af7aa1ff9da79c755fbab0ab"));\n\n;// CONCATENATED MODULE: ../node_modules/d3-scale-chromatic/src/ramp.js\n\n\n/* harmony default export */ const ramp = (scheme => rgbBasis(scheme[scheme.length - 1]));\n\n;// CONCATENATED MODULE: ../node_modules/d3-scale-chromatic/src/diverging/Spectral.js\n\n\n\nvar scheme = new Array(3).concat(\n "fc8d59ffffbf99d594",\n "d7191cfdae61abdda42b83ba",\n "d7191cfdae61ffffbfabdda42b83ba",\n "d53e4ffc8d59fee08be6f59899d5943288bd",\n "d53e4ffc8d59fee08bffffbfe6f59899d5943288bd",\n "d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd",\n "d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd",\n "9e0142d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd5e4fa2",\n "9e0142d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd5e4fa2"\n).map(colors);\n\n/* harmony default export */ const Spectral = (ramp(scheme));\n\n;// CONCATENATED MODULE: ../node_modules/d3-scale-chromatic/src/sequential-single/Greens.js\n\n\n\nvar Greens_scheme = new Array(3).concat(\n "e5f5e0a1d99b31a354",\n "edf8e9bae4b374c476238b45",\n "edf8e9bae4b374c47631a354006d2c",\n "edf8e9c7e9c0a1d99b74c47631a354006d2c",\n "edf8e9c7e9c0a1d99b74c47641ab5d238b45005a32",\n "f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45005a32",\n "f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45006d2c00441b"\n).map(colors);\n\n/* harmony default export */ const Greens = (ramp(Greens_scheme));\n\n;// CONCATENATED MODULE: ../node_modules/d3-scale-chromatic/src/index.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n;// CONCATENATED MODULE: ../node_modules/d3-selection/src/select.js\n\n\n/* harmony default export */ function src_select(selector) {\n return typeof selector === "string"\n ? new Selection([[document.querySelector(selector)]], [document.documentElement])\n : new Selection([[selector]], root);\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-selection/src/index.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n;// CONCATENATED MODULE: ../node_modules/d3-shape/src/constant.js\n/* harmony default export */ function d3_shape_src_constant(x) {\n return function constant() {\n return x;\n };\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-shape/src/math.js\nconst math_abs = Math.abs;\nconst atan2 = Math.atan2;\nconst cos = Math.cos;\nconst src_math_max = Math.max;\nconst src_math_min = Math.min;\nconst sin = Math.sin;\nconst sqrt = Math.sqrt;\n\nconst math_epsilon = 1e-12;\nconst pi = Math.PI;\nconst halfPi = pi / 2;\nconst tau = 2 * pi;\n\nfunction acos(x) {\n return x > 1 ? 0 : x < -1 ? pi : Math.acos(x);\n}\n\nfunction asin(x) {\n return x >= 1 ? halfPi : x <= -1 ? -halfPi : Math.asin(x);\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-path/src/path.js\nconst path_pi = Math.PI,\n path_tau = 2 * path_pi,\n path_epsilon = 1e-6,\n tauEpsilon = path_tau - path_epsilon;\n\nfunction path_append(strings) {\n this._ += strings[0];\n for (let i = 1, n = strings.length; i < n; ++i) {\n this._ += arguments[i] + strings[i];\n }\n}\n\nfunction appendRound(digits) {\n let d = Math.floor(digits);\n if (!(d >= 0)) throw new Error(`invalid digits: ${digits}`);\n if (d > 15) return path_append;\n const k = 10 ** d;\n return function(strings) {\n this._ += strings[0];\n for (let i = 1, n = strings.length; i < n; ++i) {\n this._ += Math.round(arguments[i] * k) / k + strings[i];\n }\n };\n}\n\nclass Path {\n constructor(digits) {\n this._x0 = this._y0 = // start of current subpath\n this._x1 = this._y1 = null; // end of current subpath\n this._ = "";\n this._append = digits == null ? path_append : appendRound(digits);\n }\n moveTo(x, y) {\n this._append`M${this._x0 = this._x1 = +x},${this._y0 = this._y1 = +y}`;\n }\n closePath() {\n if (this._x1 !== null) {\n this._x1 = this._x0, this._y1 = this._y0;\n this._append`Z`;\n }\n }\n lineTo(x, y) {\n this._append`L${this._x1 = +x},${this._y1 = +y}`;\n }\n quadraticCurveTo(x1, y1, x, y) {\n this._append`Q${+x1},${+y1},${this._x1 = +x},${this._y1 = +y}`;\n }\n bezierCurveTo(x1, y1, x2, y2, x, y) {\n this._append`C${+x1},${+y1},${+x2},${+y2},${this._x1 = +x},${this._y1 = +y}`;\n }\n arcTo(x1, y1, x2, y2, r) {\n x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r;\n\n // Is the radius negative? Error.\n if (r < 0) throw new Error(`negative radius: ${r}`);\n\n let x0 = this._x1,\n y0 = this._y1,\n x21 = x2 - x1,\n y21 = y2 - y1,\n x01 = x0 - x1,\n y01 = y0 - y1,\n l01_2 = x01 * x01 + y01 * y01;\n\n // Is this path empty? Move to (x1,y1).\n if (this._x1 === null) {\n this._append`M${this._x1 = x1},${this._y1 = y1}`;\n }\n\n // Or, is (x1,y1) coincident with (x0,y0)? Do nothing.\n else if (!(l01_2 > path_epsilon));\n\n // Or, are (x0,y0), (x1,y1) and (x2,y2) collinear?\n // Equivalently, is (x1,y1) coincident with (x2,y2)?\n // Or, is the radius zero? Line to (x1,y1).\n else if (!(Math.abs(y01 * x21 - y21 * x01) > path_epsilon) || !r) {\n this._append`L${this._x1 = x1},${this._y1 = y1}`;\n }\n\n // Otherwise, draw an arc!\n else {\n let x20 = x2 - x0,\n y20 = y2 - y0,\n l21_2 = x21 * x21 + y21 * y21,\n l20_2 = x20 * x20 + y20 * y20,\n l21 = Math.sqrt(l21_2),\n l01 = Math.sqrt(l01_2),\n l = r * Math.tan((path_pi - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2),\n t01 = l / l01,\n t21 = l / l21;\n\n // If the start tangent is not coincident with (x0,y0), line to.\n if (Math.abs(t01 - 1) > path_epsilon) {\n this._append`L${x1 + t01 * x01},${y1 + t01 * y01}`;\n }\n\n this._append`A${r},${r},0,0,${+(y01 * x20 > x01 * y20)},${this._x1 = x1 + t21 * x21},${this._y1 = y1 + t21 * y21}`;\n }\n }\n arc(x, y, r, a0, a1, ccw) {\n x = +x, y = +y, r = +r, ccw = !!ccw;\n\n // Is the radius negative? Error.\n if (r < 0) throw new Error(`negative radius: ${r}`);\n\n let dx = r * Math.cos(a0),\n dy = r * Math.sin(a0),\n x0 = x + dx,\n y0 = y + dy,\n cw = 1 ^ ccw,\n da = ccw ? a0 - a1 : a1 - a0;\n\n // Is this path empty? Move to (x0,y0).\n if (this._x1 === null) {\n this._append`M${x0},${y0}`;\n }\n\n // Or, is (x0,y0) not coincident with the previous point? Line to (x0,y0).\n else if (Math.abs(this._x1 - x0) > path_epsilon || Math.abs(this._y1 - y0) > path_epsilon) {\n this._append`L${x0},${y0}`;\n }\n\n // Is this arc empty? We’re done.\n if (!r) return;\n\n // Does the angle go the wrong way? Flip the direction.\n if (da < 0) da = da % path_tau + path_tau;\n\n // Is this a complete circle? Draw two arcs to complete the circle.\n if (da > tauEpsilon) {\n this._append`A${r},${r},0,1,${cw},${x - dx},${y - dy}A${r},${r},0,1,${cw},${this._x1 = x0},${this._y1 = y0}`;\n }\n\n // Is this arc non-empty? Draw an arc!\n else if (da > path_epsilon) {\n this._append`A${r},${r},0,${+(da >= path_pi)},${cw},${this._x1 = x + r * Math.cos(a1)},${this._y1 = y + r * Math.sin(a1)}`;\n }\n }\n rect(x, y, w, h) {\n this._append`M${this._x0 = this._x1 = +x},${this._y0 = this._y1 = +y}h${w = +w}v${+h}h${-w}Z`;\n }\n toString() {\n return this._;\n }\n}\n\nfunction path() {\n return new Path;\n}\n\n// Allow instanceof d3.path\npath.prototype = Path.prototype;\n\nfunction pathRound(digits = 3) {\n return new Path(+digits);\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-shape/src/path.js\n\n\nfunction withPath(shape) {\n let digits = 3;\n\n shape.digits = function(_) {\n if (!arguments.length) return digits;\n if (_ == null) {\n digits = null;\n } else {\n const d = Math.floor(_);\n if (!(d >= 0)) throw new RangeError(`invalid digits: ${_}`);\n digits = d;\n }\n return shape;\n };\n\n return () => new Path(digits);\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-shape/src/arc.js\n\n\n\n\nfunction arcInnerRadius(d) {\n return d.innerRadius;\n}\n\nfunction arcOuterRadius(d) {\n return d.outerRadius;\n}\n\nfunction arcStartAngle(d) {\n return d.startAngle;\n}\n\nfunction arcEndAngle(d) {\n return d.endAngle;\n}\n\nfunction arcPadAngle(d) {\n return d && d.padAngle; // Note: optional!\n}\n\nfunction intersect(x0, y0, x1, y1, x2, y2, x3, y3) {\n var x10 = x1 - x0, y10 = y1 - y0,\n x32 = x3 - x2, y32 = y3 - y2,\n t = y32 * x10 - x32 * y10;\n if (t * t < math_epsilon) return;\n t = (x32 * (y0 - y2) - y32 * (x0 - x2)) / t;\n return [x0 + t * x10, y0 + t * y10];\n}\n\n// Compute perpendicular offset line of length rc.\n// http://mathworld.wolfram.com/Circle-LineIntersection.html\nfunction cornerTangents(x0, y0, x1, y1, r1, rc, cw) {\n var x01 = x0 - x1,\n y01 = y0 - y1,\n lo = (cw ? rc : -rc) / sqrt(x01 * x01 + y01 * y01),\n ox = lo * y01,\n oy = -lo * x01,\n x11 = x0 + ox,\n y11 = y0 + oy,\n x10 = x1 + ox,\n y10 = y1 + oy,\n x00 = (x11 + x10) / 2,\n y00 = (y11 + y10) / 2,\n dx = x10 - x11,\n dy = y10 - y11,\n d2 = dx * dx + dy * dy,\n r = r1 - rc,\n D = x11 * y10 - x10 * y11,\n d = (dy < 0 ? -1 : 1) * sqrt(src_math_max(0, r * r * d2 - D * D)),\n cx0 = (D * dy - dx * d) / d2,\n cy0 = (-D * dx - dy * d) / d2,\n cx1 = (D * dy + dx * d) / d2,\n cy1 = (-D * dx + dy * d) / d2,\n dx0 = cx0 - x00,\n dy0 = cy0 - y00,\n dx1 = cx1 - x00,\n dy1 = cy1 - y00;\n\n // Pick the closer of the two intersection points.\n // TODO Is there a faster way to determine which intersection to use?\n if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1;\n\n return {\n cx: cx0,\n cy: cy0,\n x01: -ox,\n y01: -oy,\n x11: cx0 * (r1 / r - 1),\n y11: cy0 * (r1 / r - 1)\n };\n}\n\n/* harmony default export */ function src_arc() {\n var innerRadius = arcInnerRadius,\n outerRadius = arcOuterRadius,\n cornerRadius = d3_shape_src_constant(0),\n padRadius = null,\n startAngle = arcStartAngle,\n endAngle = arcEndAngle,\n padAngle = arcPadAngle,\n context = null,\n path = withPath(arc);\n\n function arc() {\n var buffer,\n r,\n r0 = +innerRadius.apply(this, arguments),\n r1 = +outerRadius.apply(this, arguments),\n a0 = startAngle.apply(this, arguments) - halfPi,\n a1 = endAngle.apply(this, arguments) - halfPi,\n da = math_abs(a1 - a0),\n cw = a1 > a0;\n\n if (!context) context = buffer = path();\n\n // Ensure that the outer radius is always larger than the inner radius.\n if (r1 < r0) r = r1, r1 = r0, r0 = r;\n\n // Is it a point?\n if (!(r1 > math_epsilon)) context.moveTo(0, 0);\n\n // Or is it a circle or annulus?\n else if (da > tau - math_epsilon) {\n context.moveTo(r1 * cos(a0), r1 * sin(a0));\n context.arc(0, 0, r1, a0, a1, !cw);\n if (r0 > math_epsilon) {\n context.moveTo(r0 * cos(a1), r0 * sin(a1));\n context.arc(0, 0, r0, a1, a0, cw);\n }\n }\n\n // Or is it a circular or annular sector?\n else {\n var a01 = a0,\n a11 = a1,\n a00 = a0,\n a10 = a1,\n da0 = da,\n da1 = da,\n ap = padAngle.apply(this, arguments) / 2,\n rp = (ap > math_epsilon) && (padRadius ? +padRadius.apply(this, arguments) : sqrt(r0 * r0 + r1 * r1)),\n rc = src_math_min(math_abs(r1 - r0) / 2, +cornerRadius.apply(this, arguments)),\n rc0 = rc,\n rc1 = rc,\n t0,\n t1;\n\n // Apply padding? Note that since r1 ≥ r0, da1 ≥ da0.\n if (rp > math_epsilon) {\n var p0 = asin(rp / r0 * sin(ap)),\n p1 = asin(rp / r1 * sin(ap));\n if ((da0 -= p0 * 2) > math_epsilon) p0 *= (cw ? 1 : -1), a00 += p0, a10 -= p0;\n else da0 = 0, a00 = a10 = (a0 + a1) / 2;\n if ((da1 -= p1 * 2) > math_epsilon) p1 *= (cw ? 1 : -1), a01 += p1, a11 -= p1;\n else da1 = 0, a01 = a11 = (a0 + a1) / 2;\n }\n\n var x01 = r1 * cos(a01),\n y01 = r1 * sin(a01),\n x10 = r0 * cos(a10),\n y10 = r0 * sin(a10);\n\n // Apply rounded corners?\n if (rc > math_epsilon) {\n var x11 = r1 * cos(a11),\n y11 = r1 * sin(a11),\n x00 = r0 * cos(a00),\n y00 = r0 * sin(a00),\n oc;\n\n // Restrict the corner radius according to the sector angle. If this\n // intersection fails, it’s probably because the arc is too small, so\n // disable the corner radius entirely.\n if (da < pi) {\n if (oc = intersect(x01, y01, x00, y00, x11, y11, x10, y10)) {\n var ax = x01 - oc[0],\n ay = y01 - oc[1],\n bx = x11 - oc[0],\n by = y11 - oc[1],\n kc = 1 / sin(acos((ax * bx + ay * by) / (sqrt(ax * ax + ay * ay) * sqrt(bx * bx + by * by))) / 2),\n lc = sqrt(oc[0] * oc[0] + oc[1] * oc[1]);\n rc0 = src_math_min(rc, (r0 - lc) / (kc - 1));\n rc1 = src_math_min(rc, (r1 - lc) / (kc + 1));\n } else {\n rc0 = rc1 = 0;\n }\n }\n }\n\n // Is the sector collapsed to a line?\n if (!(da1 > math_epsilon)) context.moveTo(x01, y01);\n\n // Does the sector’s outer ring have rounded corners?\n else if (rc1 > math_epsilon) {\n t0 = cornerTangents(x00, y00, x01, y01, r1, rc1, cw);\n t1 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw);\n\n context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01);\n\n // Have the corners merged?\n if (rc1 < rc) context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw);\n\n // Otherwise, draw the two corners and the ring.\n else {\n context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw);\n context.arc(0, 0, r1, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), !cw);\n context.arc(t1.cx, t1.cy, rc1, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw);\n }\n }\n\n // Or is the outer ring just a circular arc?\n else context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw);\n\n // Is there no inner ring, and it’s a circular sector?\n // Or perhaps it’s an annular sector collapsed due to padding?\n if (!(r0 > math_epsilon) || !(da0 > math_epsilon)) context.lineTo(x10, y10);\n\n // Does the sector’s inner ring (or point) have rounded corners?\n else if (rc0 > math_epsilon) {\n t0 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw);\n t1 = cornerTangents(x01, y01, x00, y00, r0, -rc0, cw);\n\n context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01);\n\n // Have the corners merged?\n if (rc0 < rc) context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw);\n\n // Otherwise, draw the two corners and the ring.\n else {\n context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw);\n context.arc(0, 0, r0, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), cw);\n context.arc(t1.cx, t1.cy, rc0, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw);\n }\n }\n\n // Or is the inner ring just a circular arc?\n else context.arc(0, 0, r0, a10, a00, cw);\n }\n\n context.closePath();\n\n if (buffer) return context = null, buffer + "" || null;\n }\n\n arc.centroid = function() {\n var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2,\n a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - pi / 2;\n return [cos(a) * r, sin(a) * r];\n };\n\n arc.innerRadius = function(_) {\n return arguments.length ? (innerRadius = typeof _ === "function" ? _ : d3_shape_src_constant(+_), arc) : innerRadius;\n };\n\n arc.outerRadius = function(_) {\n return arguments.length ? (outerRadius = typeof _ === "function" ? _ : d3_shape_src_constant(+_), arc) : outerRadius;\n };\n\n arc.cornerRadius = function(_) {\n return arguments.length ? (cornerRadius = typeof _ === "function" ? _ : d3_shape_src_constant(+_), arc) : cornerRadius;\n };\n\n arc.padRadius = function(_) {\n return arguments.length ? (padRadius = _ == null ? null : typeof _ === "function" ? _ : d3_shape_src_constant(+_), arc) : padRadius;\n };\n\n arc.startAngle = function(_) {\n return arguments.length ? (startAngle = typeof _ === "function" ? _ : d3_shape_src_constant(+_), arc) : startAngle;\n };\n\n arc.endAngle = function(_) {\n return arguments.length ? (endAngle = typeof _ === "function" ? _ : d3_shape_src_constant(+_), arc) : endAngle;\n };\n\n arc.padAngle = function(_) {\n return arguments.length ? (padAngle = typeof _ === "function" ? _ : d3_shape_src_constant(+_), arc) : padAngle;\n };\n\n arc.context = function(_) {\n return arguments.length ? ((context = _ == null ? null : _), arc) : context;\n };\n\n return arc;\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-shape/src/array.js\nvar slice = Array.prototype.slice;\n\n/* harmony default export */ function d3_shape_src_array(x) {\n return typeof x === "object" && "length" in x\n ? x // Array, TypedArray, NodeList, array-like\n : Array.from(x); // Map, Set, iterable, string, or anything else\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-shape/src/curve/linear.js\nfunction Linear(context) {\n this._context = context;\n}\n\nLinear.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._point = 0;\n },\n lineEnd: function() {\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; // falls through\n default: this._context.lineTo(x, y); break;\n }\n }\n};\n\n/* harmony default export */ function curve_linear(context) {\n return new Linear(context);\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-shape/src/point.js\nfunction point_x(p) {\n return p[0];\n}\n\nfunction point_y(p) {\n return p[1];\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-shape/src/line.js\n\n\n\n\n\n\n/* harmony default export */ function line(x, y) {\n var defined = d3_shape_src_constant(true),\n context = null,\n curve = curve_linear,\n output = null,\n path = withPath(line);\n\n x = typeof x === "function" ? x : (x === undefined) ? point_x : d3_shape_src_constant(x);\n y = typeof y === "function" ? y : (y === undefined) ? point_y : d3_shape_src_constant(y);\n\n function line(data) {\n var i,\n n = (data = d3_shape_src_array(data)).length,\n d,\n defined0 = false,\n buffer;\n\n if (context == null) output = curve(buffer = path());\n\n for (i = 0; i <= n; ++i) {\n if (!(i < n && defined(d = data[i], i, data)) === defined0) {\n if (defined0 = !defined0) output.lineStart();\n else output.lineEnd();\n }\n if (defined0) output.point(+x(d, i, data), +y(d, i, data));\n }\n\n if (buffer) return output = null, buffer + "" || null;\n }\n\n line.x = function(_) {\n return arguments.length ? (x = typeof _ === "function" ? _ : d3_shape_src_constant(+_), line) : x;\n };\n\n line.y = function(_) {\n return arguments.length ? (y = typeof _ === "function" ? _ : d3_shape_src_constant(+_), line) : y;\n };\n\n line.defined = function(_) {\n return arguments.length ? (defined = typeof _ === "function" ? _ : d3_shape_src_constant(!!_), line) : defined;\n };\n\n line.curve = function(_) {\n return arguments.length ? (curve = _, context != null && (output = curve(context)), line) : curve;\n };\n\n line.context = function(_) {\n return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), line) : context;\n };\n\n return line;\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-shape/src/area.js\n\n\n\n\n\n\n\n/* harmony default export */ function src_area(x0, y0, y1) {\n var x1 = null,\n defined = d3_shape_src_constant(true),\n context = null,\n curve = curve_linear,\n output = null,\n path = withPath(area);\n\n x0 = typeof x0 === "function" ? x0 : (x0 === undefined) ? point_x : d3_shape_src_constant(+x0);\n y0 = typeof y0 === "function" ? y0 : (y0 === undefined) ? d3_shape_src_constant(0) : d3_shape_src_constant(+y0);\n y1 = typeof y1 === "function" ? y1 : (y1 === undefined) ? point_y : d3_shape_src_constant(+y1);\n\n function area(data) {\n var i,\n j,\n k,\n n = (data = d3_shape_src_array(data)).length,\n d,\n defined0 = false,\n buffer,\n x0z = new Array(n),\n y0z = new Array(n);\n\n if (context == null) output = curve(buffer = path());\n\n for (i = 0; i <= n; ++i) {\n if (!(i < n && defined(d = data[i], i, data)) === defined0) {\n if (defined0 = !defined0) {\n j = i;\n output.areaStart();\n output.lineStart();\n } else {\n output.lineEnd();\n output.lineStart();\n for (k = i - 1; k >= j; --k) {\n output.point(x0z[k], y0z[k]);\n }\n output.lineEnd();\n output.areaEnd();\n }\n }\n if (defined0) {\n x0z[i] = +x0(d, i, data), y0z[i] = +y0(d, i, data);\n output.point(x1 ? +x1(d, i, data) : x0z[i], y1 ? +y1(d, i, data) : y0z[i]);\n }\n }\n\n if (buffer) return output = null, buffer + "" || null;\n }\n\n function arealine() {\n return line().defined(defined).curve(curve).context(context);\n }\n\n area.x = function(_) {\n return arguments.length ? (x0 = typeof _ === "function" ? _ : d3_shape_src_constant(+_), x1 = null, area) : x0;\n };\n\n area.x0 = function(_) {\n return arguments.length ? (x0 = typeof _ === "function" ? _ : d3_shape_src_constant(+_), area) : x0;\n };\n\n area.x1 = function(_) {\n return arguments.length ? (x1 = _ == null ? null : typeof _ === "function" ? _ : d3_shape_src_constant(+_), area) : x1;\n };\n\n area.y = function(_) {\n return arguments.length ? (y0 = typeof _ === "function" ? _ : d3_shape_src_constant(+_), y1 = null, area) : y0;\n };\n\n area.y0 = function(_) {\n return arguments.length ? (y0 = typeof _ === "function" ? _ : d3_shape_src_constant(+_), area) : y0;\n };\n\n area.y1 = function(_) {\n return arguments.length ? (y1 = _ == null ? null : typeof _ === "function" ? _ : d3_shape_src_constant(+_), area) : y1;\n };\n\n area.lineX0 =\n area.lineY0 = function() {\n return arealine().x(x0).y(y0);\n };\n\n area.lineY1 = function() {\n return arealine().x(x0).y(y1);\n };\n\n area.lineX1 = function() {\n return arealine().x(x1).y(y0);\n };\n\n area.defined = function(_) {\n return arguments.length ? (defined = typeof _ === "function" ? _ : d3_shape_src_constant(!!_), area) : defined;\n };\n\n area.curve = function(_) {\n return arguments.length ? (curve = _, context != null && (output = curve(context)), area) : curve;\n };\n\n area.context = function(_) {\n return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), area) : context;\n };\n\n return area;\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-shape/src/descending.js\n/* harmony default export */ function src_descending(a, b) {\n return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-shape/src/identity.js\n/* harmony default export */ function d3_shape_src_identity(d) {\n return d;\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-shape/src/pie.js\n\n\n\n\n\n\n/* harmony default export */ function src_pie() {\n var value = d3_shape_src_identity,\n sortValues = src_descending,\n sort = null,\n startAngle = d3_shape_src_constant(0),\n endAngle = d3_shape_src_constant(tau),\n padAngle = d3_shape_src_constant(0);\n\n function pie(data) {\n var i,\n n = (data = d3_shape_src_array(data)).length,\n j,\n k,\n sum = 0,\n index = new Array(n),\n arcs = new Array(n),\n a0 = +startAngle.apply(this, arguments),\n da = Math.min(tau, Math.max(-tau, endAngle.apply(this, arguments) - a0)),\n a1,\n p = Math.min(Math.abs(da) / n, padAngle.apply(this, arguments)),\n pa = p * (da < 0 ? -1 : 1),\n v;\n\n for (i = 0; i < n; ++i) {\n if ((v = arcs[index[i] = i] = +value(data[i], i, data)) > 0) {\n sum += v;\n }\n }\n\n // Optionally sort the arcs by previously-computed values or by data.\n if (sortValues != null) index.sort(function(i, j) { return sortValues(arcs[i], arcs[j]); });\n else if (sort != null) index.sort(function(i, j) { return sort(data[i], data[j]); });\n\n // Compute the arcs! They are stored in the original data\'s order.\n for (i = 0, k = sum ? (da - n * pa) / sum : 0; i < n; ++i, a0 = a1) {\n j = index[i], v = arcs[j], a1 = a0 + (v > 0 ? v * k : 0) + pa, arcs[j] = {\n data: data[j],\n index: i,\n value: v,\n startAngle: a0,\n endAngle: a1,\n padAngle: p\n };\n }\n\n return arcs;\n }\n\n pie.value = function(_) {\n return arguments.length ? (value = typeof _ === "function" ? _ : d3_shape_src_constant(+_), pie) : value;\n };\n\n pie.sortValues = function(_) {\n return arguments.length ? (sortValues = _, sort = null, pie) : sortValues;\n };\n\n pie.sort = function(_) {\n return arguments.length ? (sort = _, sortValues = null, pie) : sort;\n };\n\n pie.startAngle = function(_) {\n return arguments.length ? (startAngle = typeof _ === "function" ? _ : d3_shape_src_constant(+_), pie) : startAngle;\n };\n\n pie.endAngle = function(_) {\n return arguments.length ? (endAngle = typeof _ === "function" ? _ : d3_shape_src_constant(+_), pie) : endAngle;\n };\n\n pie.padAngle = function(_) {\n return arguments.length ? (padAngle = typeof _ === "function" ? _ : d3_shape_src_constant(+_), pie) : padAngle;\n };\n\n return pie;\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-shape/src/offset/none.js\n/* harmony default export */ function offset_none(series, order) {\n if (!((n = series.length) > 1)) return;\n for (var i = 1, j, s0, s1 = series[order[0]], n, m = s1.length; i < n; ++i) {\n s0 = s1, s1 = series[order[i]];\n for (j = 0; j < m; ++j) {\n s1[j][1] += s1[j][0] = isNaN(s0[j][1]) ? s0[j][0] : s0[j][1];\n }\n }\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-shape/src/order/none.js\n/* harmony default export */ function order_none(series) {\n var n = series.length, o = new Array(n);\n while (--n >= 0) o[n] = n;\n return o;\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-shape/src/stack.js\n\n\n\n\n\nfunction stackValue(d, key) {\n return d[key];\n}\n\nfunction stackSeries(key) {\n const series = [];\n series.key = key;\n return series;\n}\n\n/* harmony default export */ function stack() {\n var keys = d3_shape_src_constant([]),\n order = order_none,\n offset = offset_none,\n value = stackValue;\n\n function stack(data) {\n var sz = Array.from(keys.apply(this, arguments), stackSeries),\n i, n = sz.length, j = -1,\n oz;\n\n for (const d of data) {\n for (i = 0, ++j; i < n; ++i) {\n (sz[i][j] = [0, +value(d, sz[i].key, j, data)]).data = d;\n }\n }\n\n for (i = 0, oz = d3_shape_src_array(order(sz)); i < n; ++i) {\n sz[oz[i]].index = i;\n }\n\n offset(sz, oz);\n return sz;\n }\n\n stack.keys = function(_) {\n return arguments.length ? (keys = typeof _ === "function" ? _ : d3_shape_src_constant(Array.from(_)), stack) : keys;\n };\n\n stack.value = function(_) {\n return arguments.length ? (value = typeof _ === "function" ? _ : d3_shape_src_constant(+_), stack) : value;\n };\n\n stack.order = function(_) {\n return arguments.length ? (order = _ == null ? order_none : typeof _ === "function" ? _ : d3_shape_src_constant(Array.from(_)), stack) : order;\n };\n\n stack.offset = function(_) {\n return arguments.length ? (offset = _ == null ? offset_none : _, stack) : offset;\n };\n\n return stack;\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-shape/src/index.js\n\n\n\n\n // Note: radialArea is deprecated!\n // Note: radialLine is deprecated!\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n;// CONCATENATED MODULE: ../node_modules/d3-time-format/src/index.js\n\n\n\n\n\n;// CONCATENATED MODULE: ../node_modules/d3-zoom/src/transform.js\nfunction transform_Transform(k, x, y) {\n this.k = k;\n this.x = x;\n this.y = y;\n}\n\ntransform_Transform.prototype = {\n constructor: transform_Transform,\n scale: function(k) {\n return k === 1 ? this : new transform_Transform(this.k * k, this.x, this.y);\n },\n translate: function(x, y) {\n return x === 0 & y === 0 ? this : new transform_Transform(this.k, this.x + this.k * x, this.y + this.k * y);\n },\n apply: function(point) {\n return [point[0] * this.k + this.x, point[1] * this.k + this.y];\n },\n applyX: function(x) {\n return x * this.k + this.x;\n },\n applyY: function(y) {\n return y * this.k + this.y;\n },\n invert: function(location) {\n return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k];\n },\n invertX: function(x) {\n return (x - this.x) / this.k;\n },\n invertY: function(y) {\n return (y - this.y) / this.k;\n },\n rescaleX: function(x) {\n return x.copy().domain(x.range().map(this.invertX, this).map(x.invert, x));\n },\n rescaleY: function(y) {\n return y.copy().domain(y.range().map(this.invertY, this).map(y.invert, y));\n },\n toString: function() {\n return "translate(" + this.x + "," + this.y + ") scale(" + this.k + ")";\n }\n};\n\nvar transform_identity = new transform_Transform(1, 0, 0);\n\ntransform.prototype = transform_Transform.prototype;\n\nfunction transform(node) {\n while (!node.__zoom) if (!(node = node.parentNode)) return transform_identity;\n return node.__zoom;\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-zoom/src/zoom.js\n\n\n\n\n\n\n\n\n\n\n// Ignore right-click, since that should open the context menu.\n// except for pinch-to-zoom, which is sent as a wheel+ctrlKey event\nfunction zoom_defaultFilter(event) {\n return (!event.ctrlKey || event.type === \'wheel\') && !event.button;\n}\n\nfunction zoom_defaultExtent() {\n var e = this;\n if (e instanceof SVGElement) {\n e = e.ownerSVGElement || e;\n if (e.hasAttribute("viewBox")) {\n e = e.viewBox.baseVal;\n return [[e.x, e.y], [e.x + e.width, e.y + e.height]];\n }\n return [[0, 0], [e.width.baseVal.value, e.height.baseVal.value]];\n }\n return [[0, 0], [e.clientWidth, e.clientHeight]];\n}\n\nfunction defaultTransform() {\n return this.__zoom || identity;\n}\n\nfunction defaultWheelDelta(event) {\n return -event.deltaY * (event.deltaMode === 1 ? 0.05 : event.deltaMode ? 1 : 0.002) * (event.ctrlKey ? 10 : 1);\n}\n\nfunction zoom_defaultTouchable() {\n return navigator.maxTouchPoints || ("ontouchstart" in this);\n}\n\nfunction defaultConstrain(transform, extent, translateExtent) {\n var dx0 = transform.invertX(extent[0][0]) - translateExtent[0][0],\n dx1 = transform.invertX(extent[1][0]) - translateExtent[1][0],\n dy0 = transform.invertY(extent[0][1]) - translateExtent[0][1],\n dy1 = transform.invertY(extent[1][1]) - translateExtent[1][1];\n return transform.translate(\n dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1),\n dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1)\n );\n}\n\n/* harmony default export */ function zoom() {\n var filter = zoom_defaultFilter,\n extent = zoom_defaultExtent,\n constrain = defaultConstrain,\n wheelDelta = defaultWheelDelta,\n touchable = zoom_defaultTouchable,\n scaleExtent = [0, Infinity],\n translateExtent = [[-Infinity, -Infinity], [Infinity, Infinity]],\n duration = 250,\n interpolate = interpolateZoom,\n listeners = dispatch("start", "zoom", "end"),\n touchstarting,\n touchfirst,\n touchending,\n touchDelay = 500,\n wheelDelay = 150,\n clickDistance2 = 0,\n tapDistance = 10;\n\n function zoom(selection) {\n selection\n .property("__zoom", defaultTransform)\n .on("wheel.zoom", wheeled, {passive: false})\n .on("mousedown.zoom", mousedowned)\n .on("dblclick.zoom", dblclicked)\n .filter(touchable)\n .on("touchstart.zoom", touchstarted)\n .on("touchmove.zoom", touchmoved)\n .on("touchend.zoom touchcancel.zoom", touchended)\n .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)");\n }\n\n zoom.transform = function(collection, transform, point, event) {\n var selection = collection.selection ? collection.selection() : collection;\n selection.property("__zoom", defaultTransform);\n if (collection !== selection) {\n schedule(collection, transform, point, event);\n } else {\n selection.interrupt().each(function() {\n gesture(this, arguments)\n .event(event)\n .start()\n .zoom(null, typeof transform === "function" ? transform.apply(this, arguments) : transform)\n .end();\n });\n }\n };\n\n zoom.scaleBy = function(selection, k, p, event) {\n zoom.scaleTo(selection, function() {\n var k0 = this.__zoom.k,\n k1 = typeof k === "function" ? k.apply(this, arguments) : k;\n return k0 * k1;\n }, p, event);\n };\n\n zoom.scaleTo = function(selection, k, p, event) {\n zoom.transform(selection, function() {\n var e = extent.apply(this, arguments),\n t0 = this.__zoom,\n p0 = p == null ? centroid(e) : typeof p === "function" ? p.apply(this, arguments) : p,\n p1 = t0.invert(p0),\n k1 = typeof k === "function" ? k.apply(this, arguments) : k;\n return constrain(translate(scale(t0, k1), p0, p1), e, translateExtent);\n }, p, event);\n };\n\n zoom.translateBy = function(selection, x, y, event) {\n zoom.transform(selection, function() {\n return constrain(this.__zoom.translate(\n typeof x === "function" ? x.apply(this, arguments) : x,\n typeof y === "function" ? y.apply(this, arguments) : y\n ), extent.apply(this, arguments), translateExtent);\n }, null, event);\n };\n\n zoom.translateTo = function(selection, x, y, p, event) {\n zoom.transform(selection, function() {\n var e = extent.apply(this, arguments),\n t = this.__zoom,\n p0 = p == null ? centroid(e) : typeof p === "function" ? p.apply(this, arguments) : p;\n return constrain(identity.translate(p0[0], p0[1]).scale(t.k).translate(\n typeof x === "function" ? -x.apply(this, arguments) : -x,\n typeof y === "function" ? -y.apply(this, arguments) : -y\n ), e, translateExtent);\n }, p, event);\n };\n\n function scale(transform, k) {\n k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], k));\n return k === transform.k ? transform : new Transform(k, transform.x, transform.y);\n }\n\n function translate(transform, p0, p1) {\n var x = p0[0] - p1[0] * transform.k, y = p0[1] - p1[1] * transform.k;\n return x === transform.x && y === transform.y ? transform : new Transform(transform.k, x, y);\n }\n\n function centroid(extent) {\n return [(+extent[0][0] + +extent[1][0]) / 2, (+extent[0][1] + +extent[1][1]) / 2];\n }\n\n function schedule(transition, transform, point, event) {\n transition\n .on("start.zoom", function() { gesture(this, arguments).event(event).start(); })\n .on("interrupt.zoom end.zoom", function() { gesture(this, arguments).event(event).end(); })\n .tween("zoom", function() {\n var that = this,\n args = arguments,\n g = gesture(that, args).event(event),\n e = extent.apply(that, args),\n p = point == null ? centroid(e) : typeof point === "function" ? point.apply(that, args) : point,\n w = Math.max(e[1][0] - e[0][0], e[1][1] - e[0][1]),\n a = that.__zoom,\n b = typeof transform === "function" ? transform.apply(that, args) : transform,\n i = interpolate(a.invert(p).concat(w / a.k), b.invert(p).concat(w / b.k));\n return function(t) {\n if (t === 1) t = b; // Avoid rounding error on end.\n else { var l = i(t), k = w / l[2]; t = new Transform(k, p[0] - l[0] * k, p[1] - l[1] * k); }\n g.zoom(null, t);\n };\n });\n }\n\n function gesture(that, args, clean) {\n return (!clean && that.__zooming) || new Gesture(that, args);\n }\n\n function Gesture(that, args) {\n this.that = that;\n this.args = args;\n this.active = 0;\n this.sourceEvent = null;\n this.extent = extent.apply(that, args);\n this.taps = 0;\n }\n\n Gesture.prototype = {\n event: function(event) {\n if (event) this.sourceEvent = event;\n return this;\n },\n start: function() {\n if (++this.active === 1) {\n this.that.__zooming = this;\n this.emit("start");\n }\n return this;\n },\n zoom: function(key, transform) {\n if (this.mouse && key !== "mouse") this.mouse[1] = transform.invert(this.mouse[0]);\n if (this.touch0 && key !== "touch") this.touch0[1] = transform.invert(this.touch0[0]);\n if (this.touch1 && key !== "touch") this.touch1[1] = transform.invert(this.touch1[0]);\n this.that.__zoom = transform;\n this.emit("zoom");\n return this;\n },\n end: function() {\n if (--this.active === 0) {\n delete this.that.__zooming;\n this.emit("end");\n }\n return this;\n },\n emit: function(type) {\n var d = select(this.that).datum();\n listeners.call(\n type,\n this.that,\n new ZoomEvent(type, {\n sourceEvent: this.sourceEvent,\n target: zoom,\n type,\n transform: this.that.__zoom,\n dispatch: listeners\n }),\n d\n );\n }\n };\n\n function wheeled(event, ...args) {\n if (!filter.apply(this, arguments)) return;\n var g = gesture(this, args).event(event),\n t = this.__zoom,\n k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], t.k * Math.pow(2, wheelDelta.apply(this, arguments)))),\n p = pointer(event);\n\n // If the mouse is in the same location as before, reuse it.\n // If there were recent wheel events, reset the wheel idle timeout.\n if (g.wheel) {\n if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) {\n g.mouse[1] = t.invert(g.mouse[0] = p);\n }\n clearTimeout(g.wheel);\n }\n\n // If this wheel event won’t trigger a transform change, ignore it.\n else if (t.k === k) return;\n\n // Otherwise, capture the mouse point and location at the start.\n else {\n g.mouse = [p, t.invert(p)];\n interrupt(this);\n g.start();\n }\n\n noevent(event);\n g.wheel = setTimeout(wheelidled, wheelDelay);\n g.zoom("mouse", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent, translateExtent));\n\n function wheelidled() {\n g.wheel = null;\n g.end();\n }\n }\n\n function mousedowned(event, ...args) {\n if (touchending || !filter.apply(this, arguments)) return;\n var currentTarget = event.currentTarget,\n g = gesture(this, args, true).event(event),\n v = select(event.view).on("mousemove.zoom", mousemoved, true).on("mouseup.zoom", mouseupped, true),\n p = pointer(event, currentTarget),\n x0 = event.clientX,\n y0 = event.clientY;\n\n dragDisable(event.view);\n nopropagation(event);\n g.mouse = [p, this.__zoom.invert(p)];\n interrupt(this);\n g.start();\n\n function mousemoved(event) {\n noevent(event);\n if (!g.moved) {\n var dx = event.clientX - x0, dy = event.clientY - y0;\n g.moved = dx * dx + dy * dy > clickDistance2;\n }\n g.event(event)\n .zoom("mouse", constrain(translate(g.that.__zoom, g.mouse[0] = pointer(event, currentTarget), g.mouse[1]), g.extent, translateExtent));\n }\n\n function mouseupped(event) {\n v.on("mousemove.zoom mouseup.zoom", null);\n dragEnable(event.view, g.moved);\n noevent(event);\n g.event(event).end();\n }\n }\n\n function dblclicked(event, ...args) {\n if (!filter.apply(this, arguments)) return;\n var t0 = this.__zoom,\n p0 = pointer(event.changedTouches ? event.changedTouches[0] : event, this),\n p1 = t0.invert(p0),\n k1 = t0.k * (event.shiftKey ? 0.5 : 2),\n t1 = constrain(translate(scale(t0, k1), p0, p1), extent.apply(this, args), translateExtent);\n\n noevent(event);\n if (duration > 0) select(this).transition().duration(duration).call(schedule, t1, p0, event);\n else select(this).call(zoom.transform, t1, p0, event);\n }\n\n function touchstarted(event, ...args) {\n if (!filter.apply(this, arguments)) return;\n var touches = event.touches,\n n = touches.length,\n g = gesture(this, args, event.changedTouches.length === n).event(event),\n started, i, t, p;\n\n nopropagation(event);\n for (i = 0; i < n; ++i) {\n t = touches[i], p = pointer(t, this);\n p = [p, this.__zoom.invert(p), t.identifier];\n if (!g.touch0) g.touch0 = p, started = true, g.taps = 1 + !!touchstarting;\n else if (!g.touch1 && g.touch0[2] !== p[2]) g.touch1 = p, g.taps = 0;\n }\n\n if (touchstarting) touchstarting = clearTimeout(touchstarting);\n\n if (started) {\n if (g.taps < 2) touchfirst = p[0], touchstarting = setTimeout(function() { touchstarting = null; }, touchDelay);\n interrupt(this);\n g.start();\n }\n }\n\n function touchmoved(event, ...args) {\n if (!this.__zooming) return;\n var g = gesture(this, args).event(event),\n touches = event.changedTouches,\n n = touches.length, i, t, p, l;\n\n noevent(event);\n for (i = 0; i < n; ++i) {\n t = touches[i], p = pointer(t, this);\n if (g.touch0 && g.touch0[2] === t.identifier) g.touch0[0] = p;\n else if (g.touch1 && g.touch1[2] === t.identifier) g.touch1[0] = p;\n }\n t = g.that.__zoom;\n if (g.touch1) {\n var p0 = g.touch0[0], l0 = g.touch0[1],\n p1 = g.touch1[0], l1 = g.touch1[1],\n dp = (dp = p1[0] - p0[0]) * dp + (dp = p1[1] - p0[1]) * dp,\n dl = (dl = l1[0] - l0[0]) * dl + (dl = l1[1] - l0[1]) * dl;\n t = scale(t, Math.sqrt(dp / dl));\n p = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2];\n l = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2];\n }\n else if (g.touch0) p = g.touch0[0], l = g.touch0[1];\n else return;\n\n g.zoom("touch", constrain(translate(t, p, l), g.extent, translateExtent));\n }\n\n function touchended(event, ...args) {\n if (!this.__zooming) return;\n var g = gesture(this, args).event(event),\n touches = event.changedTouches,\n n = touches.length, i, t;\n\n nopropagation(event);\n if (touchending) clearTimeout(touchending);\n touchending = setTimeout(function() { touchending = null; }, touchDelay);\n for (i = 0; i < n; ++i) {\n t = touches[i];\n if (g.touch0 && g.touch0[2] === t.identifier) delete g.touch0;\n else if (g.touch1 && g.touch1[2] === t.identifier) delete g.touch1;\n }\n if (g.touch1 && !g.touch0) g.touch0 = g.touch1, delete g.touch1;\n if (g.touch0) g.touch0[1] = this.__zoom.invert(g.touch0[0]);\n else {\n g.end();\n // If this was a dbltap, reroute to the (optional) dblclick.zoom handler.\n if (g.taps === 2) {\n t = pointer(t, this);\n if (Math.hypot(touchfirst[0] - t[0], touchfirst[1] - t[1]) < tapDistance) {\n var p = select(this).on("dblclick.zoom");\n if (p) p.apply(this, arguments);\n }\n }\n }\n }\n\n zoom.wheelDelta = function(_) {\n return arguments.length ? (wheelDelta = typeof _ === "function" ? _ : constant(+_), zoom) : wheelDelta;\n };\n\n zoom.filter = function(_) {\n return arguments.length ? (filter = typeof _ === "function" ? _ : constant(!!_), zoom) : filter;\n };\n\n zoom.touchable = function(_) {\n return arguments.length ? (touchable = typeof _ === "function" ? _ : constant(!!_), zoom) : touchable;\n };\n\n zoom.extent = function(_) {\n return arguments.length ? (extent = typeof _ === "function" ? _ : constant([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent;\n };\n\n zoom.scaleExtent = function(_) {\n return arguments.length ? (scaleExtent[0] = +_[0], scaleExtent[1] = +_[1], zoom) : [scaleExtent[0], scaleExtent[1]];\n };\n\n zoom.translateExtent = function(_) {\n return arguments.length ? (translateExtent[0][0] = +_[0][0], translateExtent[1][0] = +_[1][0], translateExtent[0][1] = +_[0][1], translateExtent[1][1] = +_[1][1], zoom) : [[translateExtent[0][0], translateExtent[0][1]], [translateExtent[1][0], translateExtent[1][1]]];\n };\n\n zoom.constrain = function(_) {\n return arguments.length ? (constrain = _, zoom) : constrain;\n };\n\n zoom.duration = function(_) {\n return arguments.length ? (duration = +_, zoom) : duration;\n };\n\n zoom.interpolate = function(_) {\n return arguments.length ? (interpolate = _, zoom) : interpolate;\n };\n\n zoom.on = function() {\n var value = listeners.on.apply(listeners, arguments);\n return value === listeners ? zoom : value;\n };\n\n zoom.clickDistance = function(_) {\n return arguments.length ? (clickDistance2 = (_ = +_) * _, zoom) : Math.sqrt(clickDistance2);\n };\n\n zoom.tapDistance = function(_) {\n return arguments.length ? (tapDistance = +_, zoom) : tapDistance;\n };\n\n return zoom;\n}\n\n;// CONCATENATED MODULE: ../node_modules/d3-zoom/src/index.js\n\n\n\n;// CONCATENATED MODULE: ../node_modules/d3/src/index.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n;// CONCATENATED MODULE: ../src/js/charts/base.js\nfunction base_typeof(o) { "@babel/helpers - typeof"; return base_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, base_typeof(o); }\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, base_toPropertyKey(descriptor.key), descriptor); } }\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }\nfunction _defineProperty(obj, key, value) { key = base_toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction base_toPropertyKey(t) { var i = base_toPrimitive(t, "string"); return "symbol" == base_typeof(i) ? i : String(i); }\nfunction base_toPrimitive(t, r) { if ("object" != base_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != base_typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }\n\nvar COLOR_RANGE_1 = (/* unused pure expression or super */ null && (["gold", "blue", "green", "yellow", "black", "grey", "darkgreen", "pink", "brown", "slateblue", "grey1", "orange"]));\nvar COLOR_RANGE_2 = ["#1f77b4", "#aec7e8", "#ff7f0e", "#ffbb78", "#2ca02c", "#98df8a", "#d62728", "#ff9896", "#9467bd", "#c5b0d5", "#e377c2", "#f7b6d2", "#7f7f7f", "#c7c7c7", "#bcbd22", "#dbdb8d", "#17becf", "#9edae5", "salmon", "lightsalmon", "lightsteelblue", "steelblue", "yellow", "orange", "#cccccc", "#dddddd", "#eee", "#aaa", "#123456", "black"];\nvar BaseChartWidget = /*#__PURE__*/function () {\n function BaseChartWidget(title, description, data) {\n var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n _classCallCheck(this, BaseChartWidget);\n _defineProperty(this, "marginRight", 150);\n _defineProperty(this, "marginBottom", 150);\n _defineProperty(this, "colorRange", COLOR_RANGE_2);\n this.title = title;\n this.description = description;\n this.data = data;\n this.options = options;\n this.dataIsValid = Array.isArray(data) ? data.length > 0 : !!data;\n this.wrapper = document.createElement("div");\n this.svg = src_select(this.wrapper).append("svg");\n }\n _createClass(BaseChartWidget, [{\n key: "clearAndScaleSvg",\n value: function clearAndScaleSvg(divWidth, divHeight) {\n var translateX = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n var translateY = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;\n if (this.g) this.g.remove();\n this.svg.selectAll("*").remove();\n var x = translateX ? translateX : 100;\n var y = translateY ? translateY : 50;\n var bg_translate = this.title ? [5, 35] : [0, 0];\n var bg = this.svg.append("rect").attr("width", this.title ? divWidth - 10 : divWidth).attr("height", this.title ? divHeight - 40 : divHeight).attr("fill", "white").attr("rx", 3).attr("ry", 3).attr("transform", "translate(".concat(bg_translate[0], ",").concat(bg_translate[1], ")"));\n this.g = this.svg.append("g").attr("transform", "translate(".concat(x, ",").concat(y, ")"));\n this.svg.attr("height", divHeight).attr("width", divWidth);\n this.svg.attr("style", "background-color: #f5f5f5");\n var width = this.svg.attr("width") - this.marginRight;\n var height = this.svg.attr("height") - this.marginBottom;\n return [width, height];\n }\n }, {\n key: "drawTitle",\n value: function drawTitle() {\n var _this = this;\n if (this.title) this.svg.append("g").attr("transform", "translate(10, 0)").append("text").attr("text-anchor", "start").attr("x", 0).attr("y", 25).attr("class", "chart-title").text(this.title);\n if (this.description) {\n var randomId = Date.now();\n this.svg.append("g").attr("transform", "translate(".concat(this.svg.attr("width") - 40, ", 5)")).append("path").attr("class", "question-mark").attr("id", "id-".concat(randomId))\n // Font Awesome Pro 5.15.4 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License)\n .attr("d", "M256 8C119.043 8 8 119.083 8 256c0 136.997 111.043 248 248 248s248-111.003 248-248C504 119.083 392.957 8 256 8zm0 448c-110.532 0-200-89.431-200-200 0-110.495 89.472-200 200-200 110.491 0 200 89.471 200 200 0 110.53-89.431 200-200 200zm107.244-255.2c0 67.052-72.421 68.084-72.421 92.863V300c0 6.627-5.373 12-12 12h-45.647c-6.627 0-12-5.373-12-12v-8.659c0-35.745 27.1-50.034 47.579-61.516 17.561-9.845 28.324-16.541 28.324-29.579 0-17.246-21.999-28.693-39.784-28.693-23.189 0-33.894 10.977-48.942 29.969-4.057 5.12-11.46 6.071-16.666 2.124l-27.824-21.098c-5.107-3.872-6.251-11.066-2.644-16.363C184.846 131.491 214.94 112 261.794 112c49.071 0 101.45 38.304 101.45 88.8zM298 368c0 23.159-18.841 42-42 42s-42-18.841-42-42 18.841-42 42-42 42 18.841 42 42z");\n setTimeout(function () {\n var targetEl = document.getElementById("id-".concat(randomId));\n if (targetEl) targetEl.addEventListener("click", function (event) {\n _this.options.onShowDesc(_this.description);\n });\n });\n }\n }\n }, {\n key: "appendXAxis",\n value: function appendXAxis(x, height) {\n var xAxis = this.options.ticks ? axisBottom(x).ticks(this.options.ticks).tickFormat(timeFormat("%d.%m.%Y %H:%M")) : axisBottom(x).tickFormat(timeFormat("%d.%m.%Y %H:%M"));\n this.g.append("g").attr("transform", "translate(0," + height + ")").call(xAxis);\n }\n }, {\n key: "appendXAxisLabel",\n value: function appendXAxisLabel(width, height) {\n if (this.options.xAxisLabel) this.g.append("g").append("text").attr("x", width).attr("y", height + 50).attr("text-anchor", "end").attr("font-size", "18px").attr("fill", "black").text(this.options.xAxisLabel);\n }\n }, {\n key: "appendYAxisLabel",\n value: function appendYAxisLabel() {\n if (this.options.yAxisLabel) this.g.append("g").append("text").attr("transform", "rotate(-90)").attr("y", 6).attr("dy", "-4em").attr("text-anchor", "end").attr("font-size", "18px").attr("fill", "black").text(this.options.yAxisLabel);\n }\n }, {\n key: "showErrorMessage",\n value: function showErrorMessage(divWidth, divHeight) {\n this.g.append("g").append("text").attr("x", divWidth / 2 - 140).attr("y", divHeight / 2 - 20).attr("class", "chart-error-message").text("No data available.");\n }\n }, {\n key: "showLegend",\n value: function showLegend(keys, color, divWidth) {\n this.svg.append("g").selectAll("g").data(keys).enter().append("circle").attr("cx", divWidth - 120).attr("cy", function (d, i) {\n return 25 + i * 25;\n }).attr("r", 7).style("fill", function (d) {\n return color(d);\n });\n this.svg.selectAll("label").data(keys).enter().append("text").attr("x", divWidth - 100).attr("y", function (d, i) {\n return 25 + i * 25;\n }).style("fill", function (d) {\n return color(d);\n }).text(function (d) {\n return d;\n }).attr("text-anchor", "left").style("alignment-baseline", "middle");\n }\n }]);\n return BaseChartWidget;\n}();\n;// CONCATENATED MODULE: ../src/js/charts/linechart.js\nfunction linechart_typeof(o) { "@babel/helpers - typeof"; return linechart_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, linechart_typeof(o); }\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || linechart_unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }\nfunction linechart_unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return linechart_arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return linechart_arrayLikeToArray(o, minLen); }\nfunction linechart_arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }\nfunction _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\nfunction linechart_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\nfunction linechart_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, linechart_toPropertyKey(descriptor.key), descriptor); } }\nfunction linechart_createClass(Constructor, protoProps, staticProps) { if (protoProps) linechart_defineProperties(Constructor.prototype, protoProps); if (staticProps) linechart_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }\nfunction linechart_toPropertyKey(t) { var i = linechart_toPrimitive(t, "string"); return "symbol" == linechart_typeof(i) ? i : String(i); }\nfunction linechart_toPrimitive(t, r) { if ("object" != linechart_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != linechart_typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }\nfunction _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) linechart_setPrototypeOf(subClass, superClass); }\nfunction linechart_setPrototypeOf(o, p) { linechart_setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return linechart_setPrototypeOf(o, p); }\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\nfunction _possibleConstructorReturn(self, call) { if (call && (linechart_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); }\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called"); } return self; }\nfunction _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\n\nvar LineChartWidget = /*#__PURE__*/function (_BaseChartWidget) {\n _inherits(LineChartWidget, _BaseChartWidget);\n var _super = _createSuper(LineChartWidget);\n function LineChartWidget() {\n var _data;\n var title = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "";\n var description = arguments.length > 1 ? arguments[1] : undefined;\n var data = arguments.length > 2 ? arguments[2] : undefined;\n var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n linechart_classCallCheck(this, LineChartWidget);\n if (options.transform) data = ((_data = data) !== null && _data !== void 0 ? _data : []).map(options.transform);\n return _super.call(this, title, description, data, options);\n }\n linechart_createClass(LineChartWidget, [{\n key: "plot",\n value: function plot(divWidth, divHeight, el) {\n var _this$clearAndScaleSv = this.clearAndScaleSvg(divWidth, divHeight),\n _this$clearAndScaleSv2 = _slicedToArray(_this$clearAndScaleSv, 2),\n width = _this$clearAndScaleSv2[0],\n height = _this$clearAndScaleSv2[1];\n this.drawTitle();\n if (!this.dataIsValid) {\n this.showErrorMessage(divWidth, divHeight);\n return this.wrapper.innerHTML;\n }\n var _d3$extent = extent(this.data, function (d) {\n return d.column1;\n }),\n _d3$extent2 = _slicedToArray(_d3$extent, 2),\n xMin = _d3$extent2[0],\n xMax = _d3$extent2[1];\n var xScale = null;\n if (this.options.useTimeScale) {\n xScale = time().domain([xMin, xMax]).range([0, width]);\n } else {\n xScale = linear_linear().domain([xMin, xMax]).range([0, width]);\n }\n this.appendXAxis(xScale, height);\n this.appendXAxisLabel(width, height);\n this.appendYAxisLabel();\n var yMax = max_max(this.data, function (d) {\n return +d.column2;\n });\n var yScale = linear_linear().domain([0, yMax]).range([height, 0]);\n this.g.append("g").call(axisLeft(yScale));\n var color = ordinal().range(this.colorRange);\n this.g.append("path").datum(this.data).attr("stroke", function (d) {\n return color(d.column2);\n }).attr("class", "chart-path").attr("d", line().x(function (d) {\n return xScale(d.column1);\n }).y(function (d) {\n return yScale(d.column2);\n }));\n if (this.options.showLegend) this.showLegend(this.data.map(function (e) {\n return e.column1;\n }), color, divWidth);\n return this.wrapper.innerHTML;\n }\n }, {\n key: "appendXAxis",\n value: function appendXAxis(x, height) {\n var xAxis = this.options.ticks ? axisBottom(x).ticks(this.options.ticks) : axisBottom(x);\n if (this.options.useTimeScale) {\n xAxis.tickFormat(timeFormat("%d.%m.%Y %H:%M"));\n }\n this.g.append("g").attr("transform", "translate(0," + height + ")").call(xAxis);\n }\n }]);\n return LineChartWidget;\n}(BaseChartWidget);\n;// CONCATENATED MODULE: ../src/js/charts/barchart.js\nfunction barchart_typeof(o) { "@babel/helpers - typeof"; return barchart_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, barchart_typeof(o); }\nfunction barchart_slicedToArray(arr, i) { return barchart_arrayWithHoles(arr) || barchart_iterableToArrayLimit(arr, i) || barchart_unsupportedIterableToArray(arr, i) || barchart_nonIterableRest(); }\nfunction barchart_nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }\nfunction barchart_unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return barchart_arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return barchart_arrayLikeToArray(o, minLen); }\nfunction barchart_arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }\nfunction barchart_iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction barchart_arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\nfunction barchart_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\nfunction barchart_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, barchart_toPropertyKey(descriptor.key), descriptor); } }\nfunction barchart_createClass(Constructor, protoProps, staticProps) { if (protoProps) barchart_defineProperties(Constructor.prototype, protoProps); if (staticProps) barchart_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }\nfunction barchart_toPropertyKey(t) { var i = barchart_toPrimitive(t, "string"); return "symbol" == barchart_typeof(i) ? i : String(i); }\nfunction barchart_toPrimitive(t, r) { if ("object" != barchart_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != barchart_typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }\nfunction barchart_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) barchart_setPrototypeOf(subClass, superClass); }\nfunction barchart_setPrototypeOf(o, p) { barchart_setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return barchart_setPrototypeOf(o, p); }\nfunction barchart_createSuper(Derived) { var hasNativeReflectConstruct = barchart_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = barchart_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = barchart_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return barchart_possibleConstructorReturn(this, result); }; }\nfunction barchart_possibleConstructorReturn(self, call) { if (call && (barchart_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return barchart_assertThisInitialized(self); }\nfunction barchart_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called"); } return self; }\nfunction barchart_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\nfunction barchart_getPrototypeOf(o) { barchart_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return barchart_getPrototypeOf(o); }\n\n\nvar BarChartWidget = /*#__PURE__*/function (_BaseChartWidget) {\n barchart_inherits(BarChartWidget, _BaseChartWidget);\n var _super = barchart_createSuper(BarChartWidget);\n function BarChartWidget(title, description, data, options) {\n var _data;\n barchart_classCallCheck(this, BarChartWidget);\n if (options.transform) data = ((_data = data) !== null && _data !== void 0 ? _data : []).map(options.transform);\n return _super.call(this, title, description, data, options);\n }\n barchart_createClass(BarChartWidget, [{\n key: "plot",\n value: function plot(divWidth, divHeight, el) {\n var _this$clearAndScaleSv = this.clearAndScaleSvg(divWidth, divHeight),\n _this$clearAndScaleSv2 = barchart_slicedToArray(_this$clearAndScaleSv, 2),\n width = _this$clearAndScaleSv2[0],\n height = _this$clearAndScaleSv2[1];\n this.drawTitle();\n if (!this.dataIsValid) {\n this.showErrorMessage(divWidth, divHeight);\n return this.wrapper.innerHTML;\n }\n var xScale = band().range([0, width]).padding(0.4);\n var yScale = linear_linear().range([height, 0]);\n var max = max_max(this.data, function (d) {\n return d.column2;\n });\n xScale.domain(this.data.map(function (d) {\n return d.column1;\n }));\n yScale.domain([0, max]);\n this.appendXAxis(xScale, height);\n this.appendXAxisLabel(width, height);\n this.appendYAxisLabel();\n this.g.append("g").attr("transform", "translate(0, 0)").call(axisLeft(yScale));\n var color = ordinal().range(this.colorRange);\n this.g.selectAll(".bar").data(this.data).enter().append("rect").attr("fill", function (d) {\n return color(d.column2);\n }).attr("x", function (d) {\n return xScale(d.column1);\n }).attr("y", function (d) {\n return yScale(d.column2);\n }).attr("width", xScale.bandwidth()).attr("height", function (d) {\n return height - yScale(d.column2);\n });\n if (this.options.showLegend) this.showLegend(this.data.map(function (e) {\n return e.column1;\n }), color, divWidth);\n return this.wrapper.innerHTML;\n }\n }]);\n return BarChartWidget;\n}(BaseChartWidget);\n;// CONCATENATED MODULE: ../src/js/charts/piechart.js\nfunction piechart_typeof(o) { "@babel/helpers - typeof"; return piechart_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, piechart_typeof(o); }\nfunction piechart_slicedToArray(arr, i) { return piechart_arrayWithHoles(arr) || piechart_iterableToArrayLimit(arr, i) || piechart_unsupportedIterableToArray(arr, i) || piechart_nonIterableRest(); }\nfunction piechart_nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }\nfunction piechart_unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return piechart_arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return piechart_arrayLikeToArray(o, minLen); }\nfunction piechart_arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }\nfunction piechart_iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction piechart_arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\nfunction piechart_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\nfunction piechart_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, piechart_toPropertyKey(descriptor.key), descriptor); } }\nfunction piechart_createClass(Constructor, protoProps, staticProps) { if (protoProps) piechart_defineProperties(Constructor.prototype, protoProps); if (staticProps) piechart_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }\nfunction piechart_toPropertyKey(t) { var i = piechart_toPrimitive(t, "string"); return "symbol" == piechart_typeof(i) ? i : String(i); }\nfunction piechart_toPrimitive(t, r) { if ("object" != piechart_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != piechart_typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }\nfunction piechart_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) piechart_setPrototypeOf(subClass, superClass); }\nfunction piechart_setPrototypeOf(o, p) { piechart_setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return piechart_setPrototypeOf(o, p); }\nfunction piechart_createSuper(Derived) { var hasNativeReflectConstruct = piechart_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = piechart_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = piechart_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return piechart_possibleConstructorReturn(this, result); }; }\nfunction piechart_possibleConstructorReturn(self, call) { if (call && (piechart_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return piechart_assertThisInitialized(self); }\nfunction piechart_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called"); } return self; }\nfunction piechart_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\nfunction piechart_getPrototypeOf(o) { piechart_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return piechart_getPrototypeOf(o); }\n\n\nvar PieChartWidget = /*#__PURE__*/function (_BaseChartWidget) {\n piechart_inherits(PieChartWidget, _BaseChartWidget);\n var _super = piechart_createSuper(PieChartWidget);\n function PieChartWidget() {\n var _data;\n var _this;\n var title = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "";\n var description = arguments.length > 1 ? arguments[1] : undefined;\n var data = arguments.length > 2 ? arguments[2] : undefined;\n var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n piechart_classCallCheck(this, PieChartWidget);\n if (options.transform) data = ((_data = data) !== null && _data !== void 0 ? _data : []).map(options.transform);\n _this = _super.call(this, title, description, data, options);\n _this.marginRight = 100;\n _this.marginBottom = 60;\n return _this;\n }\n piechart_createClass(PieChartWidget, [{\n key: "plot",\n value: function plot(divWidth, divHeight, el) {\n var translateX = divWidth / 2,\n translateY = divHeight / 2;\n if (!this.dataIsValid) {\n this.clearAndScaleSvg(divWidth, divHeight);\n this.drawTitle();\n this.showErrorMessage(divWidth, divHeight);\n return this.wrapper.innerHTML;\n }\n var _this$clearAndScaleSv = this.clearAndScaleSvg(divWidth, divHeight, translateX, translateY),\n _this$clearAndScaleSv2 = piechart_slicedToArray(_this$clearAndScaleSv, 2),\n width = _this$clearAndScaleSv2[0],\n height = _this$clearAndScaleSv2[1];\n this.drawTitle();\n var radius = Math.min(width, height) / 1.5;\n var pie = src_pie().value(function (d) {\n return d.column2;\n });\n var path = src_arc().outerRadius(radius - 10).innerRadius(0);\n var label = src_arc().outerRadius(radius).innerRadius(radius - 80);\n var arc = this.g.selectAll(".arc").data(pie(this.data)).enter().append("g").attr("class", "arc");\n var color = ordinal().domain(this.data).range(this.colorRange);\n arc.append("path").attr("d", path).attr("fill", function (d) {\n return color(d.data.column1);\n });\n arc.append("text").attr("transform", function (d) {\n return "translate(" + (radius + 50) * Math.sin((d.endAngle - d.startAngle) / 2 + d.startAngle) + ", " + -1 * (radius - 10) * Math.cos((d.endAngle - d.startAngle) / 2 + d.startAngle) + ")";\n }).attr("dy", ".5em").text(function (d) {\n return "".concat(d.data.column2, " %");\n });\n if (this.options.showLegend) this.showLegend(this.data.map(function (e) {\n return e.column1;\n }), color, divWidth);\n return this.wrapper.innerHTML;\n }\n }]);\n return PieChartWidget;\n}(BaseChartWidget);\n;// CONCATENATED MODULE: ../src/js/charts/areachart.js\nfunction areachart_typeof(o) { "@babel/helpers - typeof"; return areachart_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, areachart_typeof(o); }\nfunction areachart_slicedToArray(arr, i) { return areachart_arrayWithHoles(arr) || areachart_iterableToArrayLimit(arr, i) || areachart_unsupportedIterableToArray(arr, i) || areachart_nonIterableRest(); }\nfunction areachart_nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }\nfunction areachart_unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return areachart_arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return areachart_arrayLikeToArray(o, minLen); }\nfunction areachart_arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }\nfunction areachart_iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction areachart_arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\nfunction areachart_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\nfunction areachart_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, areachart_toPropertyKey(descriptor.key), descriptor); } }\nfunction areachart_createClass(Constructor, protoProps, staticProps) { if (protoProps) areachart_defineProperties(Constructor.prototype, protoProps); if (staticProps) areachart_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }\nfunction areachart_toPropertyKey(t) { var i = areachart_toPrimitive(t, "string"); return "symbol" == areachart_typeof(i) ? i : String(i); }\nfunction areachart_toPrimitive(t, r) { if ("object" != areachart_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != areachart_typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }\nfunction areachart_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) areachart_setPrototypeOf(subClass, superClass); }\nfunction areachart_setPrototypeOf(o, p) { areachart_setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return areachart_setPrototypeOf(o, p); }\nfunction areachart_createSuper(Derived) { var hasNativeReflectConstruct = areachart_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = areachart_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = areachart_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return areachart_possibleConstructorReturn(this, result); }; }\nfunction areachart_possibleConstructorReturn(self, call) { if (call && (areachart_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return areachart_assertThisInitialized(self); }\nfunction areachart_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called"); } return self; }\nfunction areachart_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\nfunction areachart_getPrototypeOf(o) { areachart_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return areachart_getPrototypeOf(o); }\n\n\nvar AreaChartWidget = /*#__PURE__*/function (_BaseChartWidget) {\n areachart_inherits(AreaChartWidget, _BaseChartWidget);\n var _super = areachart_createSuper(AreaChartWidget);\n function AreaChartWidget() {\n var _data;\n var title = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "";\n var description = arguments.length > 1 ? arguments[1] : undefined;\n var data = arguments.length > 2 ? arguments[2] : undefined;\n var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n areachart_classCallCheck(this, AreaChartWidget);\n if (options.transform) data = ((_data = data) !== null && _data !== void 0 ? _data : []).map(options.transform);\n return _super.call(this, title, description, data, options);\n }\n areachart_createClass(AreaChartWidget, [{\n key: "plot",\n value: function plot(divWidth, divHeight, el) {\n var _this$clearAndScaleSv = this.clearAndScaleSvg(divWidth, divHeight),\n _this$clearAndScaleSv2 = areachart_slicedToArray(_this$clearAndScaleSv, 2),\n width = _this$clearAndScaleSv2[0],\n height = _this$clearAndScaleSv2[1];\n this.drawTitle();\n if (!this.dataIsValid) {\n this.showErrorMessage(divWidth, divHeight);\n return this.wrapper.innerHTML;\n }\n var x = time().domain(extent(this.data, function (d) {\n return d.column1;\n })).range([0, width]);\n this.appendXAxis(x, height);\n this.appendXAxisLabel(width, height);\n this.appendYAxisLabel();\n var y = linear_linear().domain([0, max_max(this.data, function (d) {\n return +d.column2;\n })]).range([height, 0]);\n this.g.append("g").call(axisLeft(y));\n var color = ordinal().range(this.colorRange);\n\n // Add the area\n this.g.append("path").datum(this.data).attr("fill", function (d) {\n return color(d.column2);\n }).attr("class", "chart-area").attr("d", src_area().x(function (d) {\n return x(d.column1);\n }).y0(y(0)).y1(function (d) {\n return y(d.column2);\n }));\n if (this.options.showLegend) this.showLegend(this.data.map(function (e) {\n return e.column1;\n }), color, divWidth);\n return this.wrapper.innerHTML;\n }\n }]);\n return AreaChartWidget;\n}(BaseChartWidget);\n;// CONCATENATED MODULE: ../src/js/charts/stacked_barchart.js\nfunction stacked_barchart_typeof(o) { "@babel/helpers - typeof"; return stacked_barchart_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, stacked_barchart_typeof(o); }\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { stacked_barchart_defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction stacked_barchart_defineProperty(obj, key, value) { key = stacked_barchart_toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || stacked_barchart_unsupportedIterableToArray(arr) || _nonIterableSpread(); }\nfunction _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }\nfunction _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }\nfunction _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return stacked_barchart_arrayLikeToArray(arr); }\nfunction stacked_barchart_slicedToArray(arr, i) { return stacked_barchart_arrayWithHoles(arr) || stacked_barchart_iterableToArrayLimit(arr, i) || stacked_barchart_unsupportedIterableToArray(arr, i) || stacked_barchart_nonIterableRest(); }\nfunction stacked_barchart_nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }\nfunction stacked_barchart_unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return stacked_barchart_arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return stacked_barchart_arrayLikeToArray(o, minLen); }\nfunction stacked_barchart_arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }\nfunction stacked_barchart_iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction stacked_barchart_arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\nfunction stacked_barchart_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\nfunction stacked_barchart_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, stacked_barchart_toPropertyKey(descriptor.key), descriptor); } }\nfunction stacked_barchart_createClass(Constructor, protoProps, staticProps) { if (protoProps) stacked_barchart_defineProperties(Constructor.prototype, protoProps); if (staticProps) stacked_barchart_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }\nfunction stacked_barchart_toPropertyKey(t) { var i = stacked_barchart_toPrimitive(t, "string"); return "symbol" == stacked_barchart_typeof(i) ? i : String(i); }\nfunction stacked_barchart_toPrimitive(t, r) { if ("object" != stacked_barchart_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != stacked_barchart_typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }\nfunction stacked_barchart_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) stacked_barchart_setPrototypeOf(subClass, superClass); }\nfunction stacked_barchart_setPrototypeOf(o, p) { stacked_barchart_setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return stacked_barchart_setPrototypeOf(o, p); }\nfunction stacked_barchart_createSuper(Derived) { var hasNativeReflectConstruct = stacked_barchart_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = stacked_barchart_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = stacked_barchart_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return stacked_barchart_possibleConstructorReturn(this, result); }; }\nfunction stacked_barchart_possibleConstructorReturn(self, call) { if (call && (stacked_barchart_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return stacked_barchart_assertThisInitialized(self); }\nfunction stacked_barchart_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called"); } return self; }\nfunction stacked_barchart_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\nfunction stacked_barchart_getPrototypeOf(o) { stacked_barchart_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return stacked_barchart_getPrototypeOf(o); }\n\n\nvar StackedBarChartWidget = /*#__PURE__*/function (_BaseChartWidget) {\n stacked_barchart_inherits(StackedBarChartWidget, _BaseChartWidget);\n var _super = stacked_barchart_createSuper(StackedBarChartWidget);\n function StackedBarChartWidget(title, description, data, groups, options) {\n var _data;\n var _this;\n stacked_barchart_classCallCheck(this, StackedBarChartWidget);\n if (options.transform) data = ((_data = data) !== null && _data !== void 0 ? _data : []).map(options.transform);\n _this = _super.call(this, title, description, data, options);\n _this.groups = groups;\n return _this;\n }\n stacked_barchart_createClass(StackedBarChartWidget, [{\n key: "plot",\n value: function plot(divWidth, divHeight, el) {\n var _this2 = this;\n var _this$clearAndScaleSv = this.clearAndScaleSvg(divWidth, divHeight),\n _this$clearAndScaleSv2 = stacked_barchart_slicedToArray(_this$clearAndScaleSv, 2),\n width = _this$clearAndScaleSv2[0],\n height = _this$clearAndScaleSv2[1];\n this.drawTitle();\n if (!this.dataIsValid) {\n this.showErrorMessage(divWidth, divHeight);\n return this.wrapper.innerHTML;\n }\n var subgroups = Object.keys(this.data["overall"][0]);\n var groups = Object.keys(this.data);\n var data = Object.keys(this.data).reduce(function (acc, key) {\n return [].concat(_toConsumableArray(acc), [_objectSpread(_objectSpread({}, _this2.data[key][0]), {}, {\n group: key\n })]);\n }, []);\n var stackedData = stack().keys(subgroups)(data);\n var min = stackedData[0][0][0];\n var max = stackedData[stackedData.length - 1][0][1];\n var x = band().domain(groups).range([0, width]).padding([0.2]);\n this.g.append("g").attr("transform", "translate(0, ".concat(height, ")")).call(axisBottom(x).tickSizeOuter(0));\n var y = linear_linear().domain([min, max]).range([height, 0]);\n this.g.append("g").call(axisLeft(y));\n var color = ordinal().domain(["overall"]).range(this.colorRange);\n this.g.append("g").selectAll("g").data(stackedData).join("g").attr("fill", function (d) {\n return color(d.key);\n }).selectAll("rect").data(function (d) {\n return d;\n }).join("rect").attr("x", function (d) {\n return x(d.data.group);\n }).attr("x", function (d) {\n return x(d.data.group);\n }).attr("y", function (d) {\n return y(d[1]);\n }).attr("height", function (d) {\n return y(d[0]) - y(d[1]);\n }).attr("width", x.bandwidth());\n if (this.options.showLegend) this.showLegend(subgroups, color, divWidth);\n return this.wrapper.innerHTML;\n }\n }]);\n return StackedBarChartWidget;\n}(BaseChartWidget);\n;// CONCATENATED MODULE: ../src/js/charts/grouped_barchart.js\nfunction grouped_barchart_typeof(o) { "@babel/helpers - typeof"; return grouped_barchart_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, grouped_barchart_typeof(o); }\nfunction grouped_barchart_slicedToArray(arr, i) { return grouped_barchart_arrayWithHoles(arr) || grouped_barchart_iterableToArrayLimit(arr, i) || grouped_barchart_unsupportedIterableToArray(arr, i) || grouped_barchart_nonIterableRest(); }\nfunction grouped_barchart_nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }\nfunction grouped_barchart_unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return grouped_barchart_arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return grouped_barchart_arrayLikeToArray(o, minLen); }\nfunction grouped_barchart_arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }\nfunction grouped_barchart_iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction grouped_barchart_arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\nfunction grouped_barchart_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\nfunction grouped_barchart_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, grouped_barchart_toPropertyKey(descriptor.key), descriptor); } }\nfunction grouped_barchart_createClass(Constructor, protoProps, staticProps) { if (protoProps) grouped_barchart_defineProperties(Constructor.prototype, protoProps); if (staticProps) grouped_barchart_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }\nfunction grouped_barchart_toPropertyKey(t) { var i = grouped_barchart_toPrimitive(t, "string"); return "symbol" == grouped_barchart_typeof(i) ? i : String(i); }\nfunction grouped_barchart_toPrimitive(t, r) { if ("object" != grouped_barchart_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != grouped_barchart_typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }\nfunction grouped_barchart_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) grouped_barchart_setPrototypeOf(subClass, superClass); }\nfunction grouped_barchart_setPrototypeOf(o, p) { grouped_barchart_setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return grouped_barchart_setPrototypeOf(o, p); }\nfunction grouped_barchart_createSuper(Derived) { var hasNativeReflectConstruct = grouped_barchart_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = grouped_barchart_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = grouped_barchart_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return grouped_barchart_possibleConstructorReturn(this, result); }; }\nfunction grouped_barchart_possibleConstructorReturn(self, call) { if (call && (grouped_barchart_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return grouped_barchart_assertThisInitialized(self); }\nfunction grouped_barchart_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called"); } return self; }\nfunction grouped_barchart_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\nfunction grouped_barchart_getPrototypeOf(o) { grouped_barchart_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return grouped_barchart_getPrototypeOf(o); }\n\n\n\n// Copyright 2021 Observable, Inc.\n// Released under the ISC license.\n// https://observablehq.com/@d3/grouped-bar-chart\n\nvar GroupedBarChartWidget = /*#__PURE__*/function (_BaseChartWidget) {\n grouped_barchart_inherits(GroupedBarChartWidget, _BaseChartWidget);\n var _super = grouped_barchart_createSuper(GroupedBarChartWidget);\n function GroupedBarChartWidget(titleText, description, data, _ref) {\n var _data;\n var _this;\n var transform = _ref.transform,\n _ref$x = _ref.x,\n x = _ref$x === void 0 ? function (d, i) {\n return i;\n } : _ref$x,\n _ref$y = _ref.y,\n y = _ref$y === void 0 ? function (d) {\n return d;\n } : _ref$y,\n _ref$z = _ref.z,\n z = _ref$z === void 0 ? function () {\n return 1;\n } : _ref$z,\n title = _ref.title,\n _ref$marginTop = _ref.marginTop,\n marginTop = _ref$marginTop === void 0 ? 0 : _ref$marginTop,\n _ref$marginRight = _ref.marginRight,\n marginRight = _ref$marginRight === void 0 ? 0 : _ref$marginRight,\n _ref$marginBottom = _ref.marginBottom,\n marginBottom = _ref$marginBottom === void 0 ? 0 : _ref$marginBottom,\n _ref$marginLeft = _ref.marginLeft,\n marginLeft = _ref$marginLeft === void 0 ? 40 : _ref$marginLeft,\n _ref$width = _ref.width,\n width = _ref$width === void 0 ? 640 : _ref$width,\n _ref$height = _ref.height,\n height = _ref$height === void 0 ? 400 : _ref$height,\n xDomain = _ref.xDomain,\n _ref$xRange = _ref.xRange,\n xRange = _ref$xRange === void 0 ? [marginLeft, width - marginRight] : _ref$xRange,\n _ref$xPadding = _ref.xPadding,\n xPadding = _ref$xPadding === void 0 ? 0.1 : _ref$xPadding,\n _ref$yType = _ref.yType,\n yType = _ref$yType === void 0 ? linear_linear : _ref$yType,\n yDomain = _ref.yDomain,\n _ref$yRange = _ref.yRange,\n yRange = _ref$yRange === void 0 ? [height - marginBottom, marginTop] : _ref$yRange,\n zDomain = _ref.zDomain,\n _ref$zPadding = _ref.zPadding,\n zPadding = _ref$zPadding === void 0 ? 0.05 : _ref$zPadding,\n yFormat = _ref.yFormat,\n yLabel = _ref.yLabel,\n _ref$colors = _ref.colors,\n colors = _ref$colors === void 0 ? Tableau10 : _ref$colors,\n _ref$drawLegend = _ref.drawLegend,\n drawLegend = _ref$drawLegend === void 0 ? true : _ref$drawLegend;\n grouped_barchart_classCallCheck(this, GroupedBarChartWidget);\n if (transform) data = ((_data = data) !== null && _data !== void 0 ? _data : []).map(transform);\n var options = {\n transform: transform,\n x: x,\n y: y,\n z: z,\n title: title,\n marginTop: marginTop,\n marginRight: marginRight,\n marginBottom: marginBottom,\n marginLeft: marginLeft,\n width: width,\n height: height,\n xDomain: xDomain,\n xRange: xRange,\n xPadding: xPadding,\n yType: yType,\n yDomain: yDomain,\n yRange: yRange,\n zDomain: zDomain,\n zPadding: zPadding,\n yFormat: yFormat,\n // a format specifier string for the y-axis\n yLabel: yLabel,\n // a label for the y-axis\n colors: colors,\n drawLegend: drawLegend\n };\n _this = _super.call(this, title, description, data, options);\n _this.options = options;\n _this.data = data;\n _this.wrapper = document.createElement("div");\n _this.svg = src_select(_this.wrapper).append("svg");\n return _this;\n }\n grouped_barchart_createClass(GroupedBarChartWidget, [{\n key: "plot",\n value: function plot(divWidth, divHeight, el) {\n var _zDomain,\n _this2 = this;\n var _this$clearAndScaleSv = this.clearAndScaleSvg(divWidth, divHeight),\n _this$clearAndScaleSv2 = grouped_barchart_slicedToArray(_this$clearAndScaleSv, 2),\n w = _this$clearAndScaleSv2[0],\n h = _this$clearAndScaleSv2[1];\n // this.drawTitle();\n\n var _this$options = this.options,\n x = _this$options.x,\n y = _this$options.y,\n z = _this$options.z,\n title = _this$options.title,\n marginTop = _this$options.marginTop,\n marginRight = _this$options.marginRight,\n marginBottom = _this$options.marginBottom,\n marginLeft = _this$options.marginLeft,\n width = _this$options.width,\n height = _this$options.height,\n xDomain = _this$options.xDomain,\n xRange = _this$options.xRange,\n xPadding = _this$options.xPadding,\n yType = _this$options.yType,\n yDomain = _this$options.yDomain,\n yRange = _this$options.yRange,\n zDomain = _this$options.zDomain,\n zPadding = _this$options.zPadding,\n yFormat = _this$options.yFormat,\n yLabel = _this$options.yLabel,\n colors = _this$options.colors,\n drawLegend = _this$options.drawLegend;\n var labelOffset = 15;\n width = w;\n height = h + 150;\n marginTop = labelOffset * ((_zDomain = zDomain) !== null && _zDomain !== void 0 ? _zDomain : []).length;\n marginRight = this.marginRight;\n marginBottom = this.marginBottom;\n yRange = [height - marginBottom, marginTop];\n xRange = [marginLeft, width - marginRight];\n var data = this.data;\n var X = map(data, x);\n var Y = map(data, y);\n var Z = map(data, z);\n\n // Compute default domains, and unique the x- and z-domains.\n if (xDomain === undefined) xDomain = X;\n if (yDomain === undefined) yDomain = [0, max_max(Y)];\n if (zDomain === undefined) zDomain = Z;\n xDomain = new InternSet(xDomain);\n zDomain = new InternSet(zDomain);\n\n // Omit any data not present in both the x- and z-domain.\n var I = range(X.length).filter(function (i) {\n return xDomain.has(X[i]) && zDomain.has(Z[i]);\n });\n\n // Construct scales, axes, and formats.\n var xScale = band(xDomain, xRange).paddingInner(xPadding);\n var xzScale = band(zDomain, [0, xScale.bandwidth()]).padding(zPadding);\n var yScale = yType(yDomain, yRange);\n var zScale = ordinal(zDomain, colors);\n var xAxis = axisBottom(xScale).tickSizeOuter(0);\n var yAxis = axisLeft(yScale).ticks(height / 60, yFormat);\n\n // Compute titles.\n if (title === undefined) {\n var formatValue = yScale.tickFormat(100, yFormat);\n title = function title(i) {\n return "".concat(X[i], "\\n").concat(Z[i], "\\n").concat(formatValue(Y[i]));\n };\n } else {\n var O = map(data, function (d) {\n return d;\n });\n var T = title;\n title = function title(i) {\n return T(O[i], i, data);\n };\n }\n this.g.append("g").attr("transform", "translate(".concat(marginLeft, ",0)")).call(yAxis).call(function (g) {\n return g.select(".domain").remove();\n }).call(function (g) {\n return g.selectAll(".tick line").clone().attr("x2", width - marginLeft - marginRight).attr("stroke-opacity", 0.1);\n }).call(function (g) {\n return g.append("text").attr("x", -marginLeft).attr("y", 100).attr("fill", "currentColor").attr("text-anchor", "start").text(yLabel);\n });\n this.g.append("g").selectAll("rect").data(I).join("rect").attr("x", function (i) {\n return xScale(X[i]) + xzScale(Z[i]);\n }).attr("y", function (i) {\n return yScale(Y[i]);\n }).attr("width", xzScale.bandwidth()).attr("height", function (i) {\n return yScale(0) - yScale(Y[i]);\n }).attr("fill", function (i) {\n return zScale(Z[i]);\n });\n if (drawLegend) {\n var _zDomain2;\n // custom legend\n var runner = 2;\n ((_zDomain2 = zDomain) !== null && _zDomain2 !== void 0 ? _zDomain2 : []).forEach(function (ele) {\n runner += 1;\n var color = zScale(ele);\n var yOffset = labelOffset * runner / 2;\n var xOffset = runner % 2 ? 0 : 200;\n _this2.g.append("circle").attr("cx", xOffset).attr("cy", yOffset).attr("r", 5).style("fill", color);\n _this2.g.append("text").attr("x", xOffset + 10).attr("y", yOffset + 4).text(ele).style("font-size", "15px").attr("alignment-baseline", "middle");\n });\n }\n if (title) this.g.append("title").text(title);\n this.g.append("g").attr("transform", "translate(0,".concat(height - marginBottom, ")")).call(xAxis);\n return this.wrapper.innerHTML;\n }\n }]);\n return GroupedBarChartWidget;\n}(BaseChartWidget);\n;// CONCATENATED MODULE: ../src/js/charts/simple_grouped_barchart.js\nfunction simple_grouped_barchart_typeof(o) { "@babel/helpers - typeof"; return simple_grouped_barchart_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, simple_grouped_barchart_typeof(o); }\nfunction simple_grouped_barchart_slicedToArray(arr, i) { return simple_grouped_barchart_arrayWithHoles(arr) || simple_grouped_barchart_iterableToArrayLimit(arr, i) || simple_grouped_barchart_unsupportedIterableToArray(arr, i) || simple_grouped_barchart_nonIterableRest(); }\nfunction simple_grouped_barchart_nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }\nfunction simple_grouped_barchart_iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction simple_grouped_barchart_arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\nfunction simple_grouped_barchart_ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction simple_grouped_barchart_objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? simple_grouped_barchart_ownKeys(Object(t), !0).forEach(function (r) { simple_grouped_barchart_defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : simple_grouped_barchart_ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction simple_grouped_barchart_defineProperty(obj, key, value) { key = simple_grouped_barchart_toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction simple_grouped_barchart_toConsumableArray(arr) { return simple_grouped_barchart_arrayWithoutHoles(arr) || simple_grouped_barchart_iterableToArray(arr) || simple_grouped_barchart_unsupportedIterableToArray(arr) || simple_grouped_barchart_nonIterableSpread(); }\nfunction simple_grouped_barchart_nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }\nfunction simple_grouped_barchart_unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return simple_grouped_barchart_arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return simple_grouped_barchart_arrayLikeToArray(o, minLen); }\nfunction simple_grouped_barchart_iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }\nfunction simple_grouped_barchart_arrayWithoutHoles(arr) { if (Array.isArray(arr)) return simple_grouped_barchart_arrayLikeToArray(arr); }\nfunction simple_grouped_barchart_arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }\nfunction simple_grouped_barchart_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\nfunction simple_grouped_barchart_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, simple_grouped_barchart_toPropertyKey(descriptor.key), descriptor); } }\nfunction simple_grouped_barchart_createClass(Constructor, protoProps, staticProps) { if (protoProps) simple_grouped_barchart_defineProperties(Constructor.prototype, protoProps); if (staticProps) simple_grouped_barchart_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }\nfunction simple_grouped_barchart_toPropertyKey(t) { var i = simple_grouped_barchart_toPrimitive(t, "string"); return "symbol" == simple_grouped_barchart_typeof(i) ? i : String(i); }\nfunction simple_grouped_barchart_toPrimitive(t, r) { if ("object" != simple_grouped_barchart_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != simple_grouped_barchart_typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }\nfunction simple_grouped_barchart_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) simple_grouped_barchart_setPrototypeOf(subClass, superClass); }\nfunction simple_grouped_barchart_setPrototypeOf(o, p) { simple_grouped_barchart_setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return simple_grouped_barchart_setPrototypeOf(o, p); }\nfunction simple_grouped_barchart_createSuper(Derived) { var hasNativeReflectConstruct = simple_grouped_barchart_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = simple_grouped_barchart_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = simple_grouped_barchart_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return simple_grouped_barchart_possibleConstructorReturn(this, result); }; }\nfunction simple_grouped_barchart_possibleConstructorReturn(self, call) { if (call && (simple_grouped_barchart_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return simple_grouped_barchart_assertThisInitialized(self); }\nfunction simple_grouped_barchart_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called"); } return self; }\nfunction simple_grouped_barchart_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\nfunction simple_grouped_barchart_getPrototypeOf(o) { simple_grouped_barchart_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return simple_grouped_barchart_getPrototypeOf(o); }\n\n\n\n// Copyright 2021 Observable, Inc.\n// Released under the ISC license.\n// https://observablehq.com/@d3/grouped-bar-chart\n\nvar SimpleGroupedBarChartWidget = /*#__PURE__*/function (_BaseChartWidget) {\n simple_grouped_barchart_inherits(SimpleGroupedBarChartWidget, _BaseChartWidget);\n var _super = simple_grouped_barchart_createSuper(SimpleGroupedBarChartWidget);\n function SimpleGroupedBarChartWidget(titleText, description, dict) {\n var _this;\n var _ref = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {},\n title = _ref.title,\n _ref$marginTop = _ref.marginTop,\n marginTop = _ref$marginTop === void 0 ? 0 : _ref$marginTop,\n _ref$marginRight = _ref.marginRight,\n marginRight = _ref$marginRight === void 0 ? 0 : _ref$marginRight,\n _ref$marginBottom = _ref.marginBottom,\n marginBottom = _ref$marginBottom === void 0 ? 0 : _ref$marginBottom,\n _ref$marginLeft = _ref.marginLeft,\n marginLeft = _ref$marginLeft === void 0 ? 40 : _ref$marginLeft,\n _ref$width = _ref.width,\n width = _ref$width === void 0 ? 640 : _ref$width,\n _ref$height = _ref.height,\n height = _ref$height === void 0 ? 400 : _ref$height,\n xDomain = _ref.xDomain,\n _ref$xRange = _ref.xRange,\n xRange = _ref$xRange === void 0 ? [marginLeft, width - marginRight] : _ref$xRange,\n _ref$xPadding = _ref.xPadding,\n xPadding = _ref$xPadding === void 0 ? 0.1 : _ref$xPadding,\n _ref$yType = _ref.yType,\n yType = _ref$yType === void 0 ? linear_linear : _ref$yType,\n yDomain = _ref.yDomain,\n _ref$yRange = _ref.yRange,\n yRange = _ref$yRange === void 0 ? [height - marginBottom, marginTop] : _ref$yRange,\n zDomain = _ref.zDomain,\n _ref$zPadding = _ref.zPadding,\n zPadding = _ref$zPadding === void 0 ? 0.05 : _ref$zPadding,\n yFormat = _ref.yFormat,\n yLabel = _ref.yLabel,\n _ref$colors = _ref.colors,\n colors = _ref$colors === void 0 ? Tableau10 : _ref$colors,\n _ref$drawLegend = _ref.drawLegend,\n drawLegend = _ref$drawLegend === void 0 ? true : _ref$drawLegend;\n simple_grouped_barchart_classCallCheck(this, SimpleGroupedBarChartWidget);\n var data = Object.keys(dict).reduce(function (agg, key) {\n return [].concat(simple_grouped_barchart_toConsumableArray(agg), [simple_grouped_barchart_objectSpread(simple_grouped_barchart_objectSpread({}, dict[key]), {}, {\n name: key\n })]);\n }, []);\n var categories = Array.from(new Set(data.flatMap(function (item) {\n return Object.keys(item);\n }))).filter(function (s) {\n return s != "name";\n });\n var names = data.reduce(function (agg, curr) {\n return [].concat(simple_grouped_barchart_toConsumableArray(agg), [curr["name"]]);\n }, []);\n var dataFlatted = categories.flatMap(function (category) {\n return data.map(function (d) {\n return {\n name: d.name,\n category: category,\n value: d[category]\n };\n });\n }); // pivot longer\n\n var options = simple_grouped_barchart_defineProperty(simple_grouped_barchart_defineProperty({\n x: function x(d) {\n return d.name;\n },\n y: function y(d) {\n return d.value;\n },\n z: function z(d) {\n return d.category;\n },\n title: title,\n marginTop: marginTop,\n marginRight: marginRight,\n marginBottom: marginBottom,\n marginLeft: marginLeft,\n width: width,\n height: height,\n xRange: xRange,\n xPadding: xPadding,\n yType: yType,\n yDomain: yDomain,\n yRange: yRange,\n zDomain: zDomain,\n zPadding: zPadding,\n yFormat: yFormat,\n // a format specifier string for the y-axis\n yLabel: yLabel,\n // a label for the y-axis\n drawLegend: drawLegend,\n xDomain: names\n }, "zDomain", categories), "colors", scheme[categories.length < 10 ? 10 : categories.length]);\n _this = _super.call(this, title, description, dataFlatted, options);\n _this.options = options;\n _this.dataFlatted = dataFlatted;\n _this.wrapper = document.createElement("div");\n _this.svg = src_select(_this.wrapper).append("svg");\n return _this;\n }\n simple_grouped_barchart_createClass(SimpleGroupedBarChartWidget, [{\n key: "plot",\n value: function plot(divWidth, divHeight, el) {\n var _zDomain,\n _this2 = this;\n var _this$clearAndScaleSv = this.clearAndScaleSvg(divWidth, divHeight),\n _this$clearAndScaleSv2 = simple_grouped_barchart_slicedToArray(_this$clearAndScaleSv, 2),\n w = _this$clearAndScaleSv2[0],\n h = _this$clearAndScaleSv2[1];\n // this.drawTitle();\n\n var _this$options = this.options,\n x = _this$options.x,\n y = _this$options.y,\n z = _this$options.z,\n title = _this$options.title,\n marginTop = _this$options.marginTop,\n marginRight = _this$options.marginRight,\n marginBottom = _this$options.marginBottom,\n marginLeft = _this$options.marginLeft,\n width = _this$options.width,\n height = _this$options.height,\n xDomain = _this$options.xDomain,\n xRange = _this$options.xRange,\n xPadding = _this$options.xPadding,\n yType = _this$options.yType,\n yDomain = _this$options.yDomain,\n yRange = _this$options.yRange,\n zDomain = _this$options.zDomain,\n zPadding = _this$options.zPadding,\n yFormat = _this$options.yFormat,\n yLabel = _this$options.yLabel,\n colors = _this$options.colors,\n drawLegend = _this$options.drawLegend;\n var labelOffset = 15;\n width = w;\n height = h + 150;\n marginTop = labelOffset * ((_zDomain = zDomain) !== null && _zDomain !== void 0 ? _zDomain : []).length;\n marginRight = this.marginRight;\n marginBottom = this.marginBottom;\n yRange = [height - marginBottom, marginTop];\n xRange = [marginLeft, width - marginRight];\n var dataFlatted = this.dataFlatted;\n var X = map(dataFlatted, x);\n var Y = map(dataFlatted, y);\n var Z = map(dataFlatted, z);\n\n // Compute default domains, and unique the x- and z-domains.\n if (xDomain === undefined) xDomain = X;\n if (yDomain === undefined) yDomain = [0, max_max(Y)];\n if (zDomain === undefined) zDomain = Z;\n xDomain = new InternSet(xDomain);\n zDomain = new InternSet(zDomain);\n\n // Omit any data not present in both the x- and z-domain.\n var I = range(X.length).filter(function (i) {\n return xDomain.has(X[i]) && zDomain.has(Z[i]);\n });\n\n // Construct scales, axes, and formats.\n var xScale = band(xDomain, xRange).paddingInner(xPadding);\n var xzScale = band(zDomain, [0, xScale.bandwidth()]).padding(zPadding);\n var yScale = yType(yDomain, yRange);\n var zScale = ordinal(zDomain, colors);\n var xAxis = axisBottom(xScale).tickSizeOuter(0);\n var yAxis = axisLeft(yScale).ticks(height / 60, yFormat);\n\n // Compute titles.\n if (title === undefined) {\n var formatValue = yScale.tickFormat(100, yFormat);\n title = function title(i) {\n return "".concat(X[i], "\\n").concat(Z[i], "\\n").concat(formatValue(Y[i]));\n };\n } else {\n var O = map(dataFlatted, function (d) {\n return d;\n });\n var T = title;\n title = function title(i) {\n return T(O[i], i, dataFlatted);\n };\n }\n this.g.append("g").attr("transform", "translate(".concat(marginLeft, ",0)")).call(yAxis).call(function (g) {\n return g.select(".domain").remove();\n }).call(function (g) {\n return g.selectAll(".tick line").clone().attr("x2", width - marginLeft - marginRight).attr("stroke-opacity", 0.1);\n }).call(function (g) {\n return g.append("text").attr("x", -marginLeft).attr("y", 100).attr("fill", "currentColor").attr("text-anchor", "start").text(yLabel);\n });\n this.g.append("g").selectAll("rect").data(I).join("rect").attr("x", function (i) {\n return xScale(X[i]) + xzScale(Z[i]);\n }).attr("y", function (i) {\n return yScale(Y[i]);\n }).attr("width", xzScale.bandwidth()).attr("height", function (i) {\n return yScale(0) - yScale(Y[i]);\n }).attr("fill", function (i) {\n return zScale(Z[i]);\n });\n if (drawLegend) {\n var _zDomain2;\n // custom legend\n var runner = 2;\n ((_zDomain2 = zDomain) !== null && _zDomain2 !== void 0 ? _zDomain2 : []).forEach(function (ele) {\n runner += 1;\n var color = zScale(ele);\n var yOffset = labelOffset * runner / 2;\n var xOffset = runner % 2 ? 0 : 200;\n _this2.g.append("circle").attr("cx", xOffset).attr("cy", yOffset).attr("r", 5).style("fill", color);\n _this2.g.append("text").attr("x", xOffset + 10).attr("y", yOffset + 4).text(ele).style("font-size", "15px").attr("alignment-baseline", "middle");\n });\n }\n if (title) this.g.append("title").text(title);\n this.g.append("g").attr("transform", "translate(0,".concat(height - marginBottom, ")")).call(xAxis);\n return this.wrapper.innerHTML;\n }\n }]);\n return SimpleGroupedBarChartWidget;\n}(BaseChartWidget);\n;// CONCATENATED MODULE: ../node_modules/@kurkle/color/dist/color.esm.js\n/*!\n * @kurkle/color v0.3.2\n * https://github.com/kurkle/color#readme\n * (c) 2023 Jukka Kurkela\n * Released under the MIT License\n */\nfunction color_esm_round(v) {\n return v + 0.5 | 0;\n}\nconst lim = (v, l, h) => Math.max(Math.min(v, h), l);\nfunction p2b(v) {\n return lim(color_esm_round(v * 2.55), 0, 255);\n}\nfunction b2p(v) {\n return lim(color_esm_round(v / 2.55), 0, 100);\n}\nfunction n2b(v) {\n return lim(color_esm_round(v * 255), 0, 255);\n}\nfunction b2n(v) {\n return lim(color_esm_round(v / 2.55) / 100, 0, 1);\n}\nfunction n2p(v) {\n return lim(color_esm_round(v * 100), 0, 100);\n}\n\nconst map$1 = {0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, A: 10, B: 11, C: 12, D: 13, E: 14, F: 15, a: 10, b: 11, c: 12, d: 13, e: 14, f: 15};\nconst color_esm_hex = [...\'0123456789ABCDEF\'];\nconst h1 = b => color_esm_hex[b & 0xF];\nconst h2 = b => color_esm_hex[(b & 0xF0) >> 4] + color_esm_hex[b & 0xF];\nconst eq = b => ((b & 0xF0) >> 4) === (b & 0xF);\nconst isShort = v => eq(v.r) && eq(v.g) && eq(v.b) && eq(v.a);\nfunction hexParse(str) {\n var len = str.length;\n var ret;\n if (str[0] === \'#\') {\n if (len === 4 || len === 5) {\n ret = {\n r: 255 & map$1[str[1]] * 17,\n g: 255 & map$1[str[2]] * 17,\n b: 255 & map$1[str[3]] * 17,\n a: len === 5 ? map$1[str[4]] * 17 : 255\n };\n } else if (len === 7 || len === 9) {\n ret = {\n r: map$1[str[1]] << 4 | map$1[str[2]],\n g: map$1[str[3]] << 4 | map$1[str[4]],\n b: map$1[str[5]] << 4 | map$1[str[6]],\n a: len === 9 ? (map$1[str[7]] << 4 | map$1[str[8]]) : 255\n };\n }\n }\n return ret;\n}\nconst alpha = (a, f) => a < 255 ? f(a) : \'\';\nfunction hexString(v) {\n var f = isShort(v) ? h1 : h2;\n return v\n ? \'#\' + f(v.r) + f(v.g) + f(v.b) + alpha(v.a, f)\n : undefined;\n}\n\nconst HUE_RE = /^(hsla?|hwb|hsv)\\(\\s*([-+.e\\d]+)(?:deg)?[\\s,]+([-+.e\\d]+)%[\\s,]+([-+.e\\d]+)%(?:[\\s,]+([-+.e\\d]+)(%)?)?\\s*\\)$/;\nfunction hsl2rgbn(h, s, l) {\n const a = s * Math.min(l, 1 - l);\n const f = (n, k = (n + h / 30) % 12) => l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n return [f(0), f(8), f(4)];\n}\nfunction hsv2rgbn(h, s, v) {\n const f = (n, k = (n + h / 60) % 6) => v - v * s * Math.max(Math.min(k, 4 - k, 1), 0);\n return [f(5), f(3), f(1)];\n}\nfunction hwb2rgbn(h, w, b) {\n const rgb = hsl2rgbn(h, 1, 0.5);\n let i;\n if (w + b > 1) {\n i = 1 / (w + b);\n w *= i;\n b *= i;\n }\n for (i = 0; i < 3; i++) {\n rgb[i] *= 1 - w - b;\n rgb[i] += w;\n }\n return rgb;\n}\nfunction hueValue(r, g, b, d, max) {\n if (r === max) {\n return ((g - b) / d) + (g < b ? 6 : 0);\n }\n if (g === max) {\n return (b - r) / d + 2;\n }\n return (r - g) / d + 4;\n}\nfunction rgb2hsl(v) {\n const range = 255;\n const r = v.r / range;\n const g = v.g / range;\n const b = v.b / range;\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const l = (max + min) / 2;\n let h, s, d;\n if (max !== min) {\n d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n h = hueValue(r, g, b, d, max);\n h = h * 60 + 0.5;\n }\n return [h | 0, s || 0, l];\n}\nfunction calln(f, a, b, c) {\n return (\n Array.isArray(a)\n ? f(a[0], a[1], a[2])\n : f(a, b, c)\n ).map(n2b);\n}\nfunction color_esm_hsl2rgb(h, s, l) {\n return calln(hsl2rgbn, h, s, l);\n}\nfunction hwb2rgb(h, w, b) {\n return calln(hwb2rgbn, h, w, b);\n}\nfunction hsv2rgb(h, s, v) {\n return calln(hsv2rgbn, h, s, v);\n}\nfunction color_esm_hue(h) {\n return (h % 360 + 360) % 360;\n}\nfunction hueParse(str) {\n const m = HUE_RE.exec(str);\n let a = 255;\n let v;\n if (!m) {\n return;\n }\n if (m[5] !== v) {\n a = m[6] ? p2b(+m[5]) : n2b(+m[5]);\n }\n const h = color_esm_hue(+m[2]);\n const p1 = +m[3] / 100;\n const p2 = +m[4] / 100;\n if (m[1] === \'hwb\') {\n v = hwb2rgb(h, p1, p2);\n } else if (m[1] === \'hsv\') {\n v = hsv2rgb(h, p1, p2);\n } else {\n v = color_esm_hsl2rgb(h, p1, p2);\n }\n return {\n r: v[0],\n g: v[1],\n b: v[2],\n a: a\n };\n}\nfunction rotate(v, deg) {\n var h = rgb2hsl(v);\n h[0] = color_esm_hue(h[0] + deg);\n h = color_esm_hsl2rgb(h);\n v.r = h[0];\n v.g = h[1];\n v.b = h[2];\n}\nfunction hslString(v) {\n if (!v) {\n return;\n }\n const a = rgb2hsl(v);\n const h = a[0];\n const s = n2p(a[1]);\n const l = n2p(a[2]);\n return v.a < 255\n ? `hsla(${h}, ${s}%, ${l}%, ${b2n(v.a)})`\n : `hsl(${h}, ${s}%, ${l}%)`;\n}\n\nconst color_esm_map = {\n x: \'dark\',\n Z: \'light\',\n Y: \'re\',\n X: \'blu\',\n W: \'gr\',\n V: \'medium\',\n U: \'slate\',\n A: \'ee\',\n T: \'ol\',\n S: \'or\',\n B: \'ra\',\n C: \'lateg\',\n D: \'ights\',\n R: \'in\',\n Q: \'turquois\',\n E: \'hi\',\n P: \'ro\',\n O: \'al\',\n N: \'le\',\n M: \'de\',\n L: \'yello\',\n F: \'en\',\n K: \'ch\',\n G: \'arks\',\n H: \'ea\',\n I: \'ightg\',\n J: \'wh\'\n};\nconst names$1 = {\n OiceXe: \'f0f8ff\',\n antiquewEte: \'faebd7\',\n aqua: \'ffff\',\n aquamarRe: \'7fffd4\',\n azuY: \'f0ffff\',\n beige: \'f5f5dc\',\n bisque: \'ffe4c4\',\n black: \'0\',\n blanKedOmond: \'ffebcd\',\n Xe: \'ff\',\n XeviTet: \'8a2be2\',\n bPwn: \'a52a2a\',\n burlywood: \'deb887\',\n caMtXe: \'5f9ea0\',\n KartYuse: \'7fff00\',\n KocTate: \'d2691e\',\n cSO: \'ff7f50\',\n cSnflowerXe: \'6495ed\',\n cSnsilk: \'fff8dc\',\n crimson: \'dc143c\',\n cyan: \'ffff\',\n xXe: \'8b\',\n xcyan: \'8b8b\',\n xgTMnPd: \'b8860b\',\n xWay: \'a9a9a9\',\n xgYF: \'6400\',\n xgYy: \'a9a9a9\',\n xkhaki: \'bdb76b\',\n xmagFta: \'8b008b\',\n xTivegYF: \'556b2f\',\n xSange: \'ff8c00\',\n xScEd: \'9932cc\',\n xYd: \'8b0000\',\n xsOmon: \'e9967a\',\n xsHgYF: \'8fbc8f\',\n xUXe: \'483d8b\',\n xUWay: \'2f4f4f\',\n xUgYy: \'2f4f4f\',\n xQe: \'ced1\',\n xviTet: \'9400d3\',\n dAppRk: \'ff1493\',\n dApskyXe: \'bfff\',\n dimWay: \'696969\',\n dimgYy: \'696969\',\n dodgerXe: \'1e90ff\',\n fiYbrick: \'b22222\',\n flSOwEte: \'fffaf0\',\n foYstWAn: \'228b22\',\n fuKsia: \'ff00ff\',\n gaRsbSo: \'dcdcdc\',\n ghostwEte: \'f8f8ff\',\n gTd: \'ffd700\',\n gTMnPd: \'daa520\',\n Way: \'808080\',\n gYF: \'8000\',\n gYFLw: \'adff2f\',\n gYy: \'808080\',\n honeyMw: \'f0fff0\',\n hotpRk: \'ff69b4\',\n RdianYd: \'cd5c5c\',\n Rdigo: \'4b0082\',\n ivSy: \'fffff0\',\n khaki: \'f0e68c\',\n lavFMr: \'e6e6fa\',\n lavFMrXsh: \'fff0f5\',\n lawngYF: \'7cfc00\',\n NmoncEffon: \'fffacd\',\n ZXe: \'add8e6\',\n ZcSO: \'f08080\',\n Zcyan: \'e0ffff\',\n ZgTMnPdLw: \'fafad2\',\n ZWay: \'d3d3d3\',\n ZgYF: \'90ee90\',\n ZgYy: \'d3d3d3\',\n ZpRk: \'ffb6c1\',\n ZsOmon: \'ffa07a\',\n ZsHgYF: \'20b2aa\',\n ZskyXe: \'87cefa\',\n ZUWay: \'778899\',\n ZUgYy: \'778899\',\n ZstAlXe: \'b0c4de\',\n ZLw: \'ffffe0\',\n lime: \'ff00\',\n limegYF: \'32cd32\',\n lRF: \'faf0e6\',\n magFta: \'ff00ff\',\n maPon: \'800000\',\n VaquamarRe: \'66cdaa\',\n VXe: \'cd\',\n VScEd: \'ba55d3\',\n VpurpN: \'9370db\',\n VsHgYF: \'3cb371\',\n VUXe: \'7b68ee\',\n VsprRggYF: \'fa9a\',\n VQe: \'48d1cc\',\n VviTetYd: \'c71585\',\n midnightXe: \'191970\',\n mRtcYam: \'f5fffa\',\n mistyPse: \'ffe4e1\',\n moccasR: \'ffe4b5\',\n navajowEte: \'ffdead\',\n navy: \'80\',\n Tdlace: \'fdf5e6\',\n Tive: \'808000\',\n TivedBb: \'6b8e23\',\n Sange: \'ffa500\',\n SangeYd: \'ff4500\',\n ScEd: \'da70d6\',\n pOegTMnPd: \'eee8aa\',\n pOegYF: \'98fb98\',\n pOeQe: \'afeeee\',\n pOeviTetYd: \'db7093\',\n papayawEp: \'ffefd5\',\n pHKpuff: \'ffdab9\',\n peru: \'cd853f\',\n pRk: \'ffc0cb\',\n plum: \'dda0dd\',\n powMrXe: \'b0e0e6\',\n purpN: \'800080\',\n YbeccapurpN: \'663399\',\n Yd: \'ff0000\',\n Psybrown: \'bc8f8f\',\n PyOXe: \'4169e1\',\n saddNbPwn: \'8b4513\',\n sOmon: \'fa8072\',\n sandybPwn: \'f4a460\',\n sHgYF: \'2e8b57\',\n sHshell: \'fff5ee\',\n siFna: \'a0522d\',\n silver: \'c0c0c0\',\n skyXe: \'87ceeb\',\n UXe: \'6a5acd\',\n UWay: \'708090\',\n UgYy: \'708090\',\n snow: \'fffafa\',\n sprRggYF: \'ff7f\',\n stAlXe: \'4682b4\',\n tan: \'d2b48c\',\n teO: \'8080\',\n tEstN: \'d8bfd8\',\n tomato: \'ff6347\',\n Qe: \'40e0d0\',\n viTet: \'ee82ee\',\n JHt: \'f5deb3\',\n wEte: \'ffffff\',\n wEtesmoke: \'f5f5f5\',\n Lw: \'ffff00\',\n LwgYF: \'9acd32\'\n};\nfunction unpack() {\n const unpacked = {};\n const keys = Object.keys(names$1);\n const tkeys = Object.keys(color_esm_map);\n let i, j, k, ok, nk;\n for (i = 0; i < keys.length; i++) {\n ok = nk = keys[i];\n for (j = 0; j < tkeys.length; j++) {\n k = tkeys[j];\n nk = nk.replace(k, color_esm_map[k]);\n }\n k = parseInt(names$1[ok], 16);\n unpacked[nk] = [k >> 16 & 0xFF, k >> 8 & 0xFF, k & 0xFF];\n }\n return unpacked;\n}\n\nlet names;\nfunction nameParse(str) {\n if (!names) {\n names = unpack();\n names.transparent = [0, 0, 0, 0];\n }\n const a = names[str.toLowerCase()];\n return a && {\n r: a[0],\n g: a[1],\n b: a[2],\n a: a.length === 4 ? a[3] : 255\n };\n}\n\nconst RGB_RE = /^rgba?\\(\\s*([-+.\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?(?:[\\s,/]+([-+.e\\d]+)(%)?)?\\s*\\)$/;\nfunction rgbParse(str) {\n const m = RGB_RE.exec(str);\n let a = 255;\n let r, g, b;\n if (!m) {\n return;\n }\n if (m[7] !== r) {\n const v = +m[7];\n a = m[8] ? p2b(v) : lim(v * 255, 0, 255);\n }\n r = +m[1];\n g = +m[3];\n b = +m[5];\n r = 255 & (m[2] ? p2b(r) : lim(r, 0, 255));\n g = 255 & (m[4] ? p2b(g) : lim(g, 0, 255));\n b = 255 & (m[6] ? p2b(b) : lim(b, 0, 255));\n return {\n r: r,\n g: g,\n b: b,\n a: a\n };\n}\nfunction rgbString(v) {\n return v && (\n v.a < 255\n ? `rgba(${v.r}, ${v.g}, ${v.b}, ${b2n(v.a)})`\n : `rgb(${v.r}, ${v.g}, ${v.b})`\n );\n}\n\nconst to = v => v <= 0.0031308 ? v * 12.92 : Math.pow(v, 1.0 / 2.4) * 1.055 - 0.055;\nconst from = v => v <= 0.04045 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\nfunction color_esm_interpolate(rgb1, rgb2, t) {\n const r = from(b2n(rgb1.r));\n const g = from(b2n(rgb1.g));\n const b = from(b2n(rgb1.b));\n return {\n r: n2b(to(r + t * (from(b2n(rgb2.r)) - r))),\n g: n2b(to(g + t * (from(b2n(rgb2.g)) - g))),\n b: n2b(to(b + t * (from(b2n(rgb2.b)) - b))),\n a: rgb1.a + t * (rgb2.a - rgb1.a)\n };\n}\n\nfunction modHSL(v, i, ratio) {\n if (v) {\n let tmp = rgb2hsl(v);\n tmp[i] = Math.max(0, Math.min(tmp[i] + tmp[i] * ratio, i === 0 ? 360 : 1));\n tmp = color_esm_hsl2rgb(tmp);\n v.r = tmp[0];\n v.g = tmp[1];\n v.b = tmp[2];\n }\n}\nfunction color_esm_clone(v, proto) {\n return v ? Object.assign(proto || {}, v) : v;\n}\nfunction fromObject(input) {\n var v = {r: 0, g: 0, b: 0, a: 255};\n if (Array.isArray(input)) {\n if (input.length >= 3) {\n v = {r: input[0], g: input[1], b: input[2], a: 255};\n if (input.length > 3) {\n v.a = n2b(input[3]);\n }\n }\n } else {\n v = color_esm_clone(input, {r: 0, g: 0, b: 0, a: 1});\n v.a = n2b(v.a);\n }\n return v;\n}\nfunction functionParse(str) {\n if (str.charAt(0) === \'r\') {\n return rgbParse(str);\n }\n return hueParse(str);\n}\nclass color_esm_Color {\n constructor(input) {\n if (input instanceof color_esm_Color) {\n return input;\n }\n const type = typeof input;\n let v;\n if (type === \'object\') {\n v = fromObject(input);\n } else if (type === \'string\') {\n v = hexParse(input) || nameParse(input) || functionParse(input);\n }\n this._rgb = v;\n this._valid = !!v;\n }\n get valid() {\n return this._valid;\n }\n get rgb() {\n var v = color_esm_clone(this._rgb);\n if (v) {\n v.a = b2n(v.a);\n }\n return v;\n }\n set rgb(obj) {\n this._rgb = fromObject(obj);\n }\n rgbString() {\n return this._valid ? rgbString(this._rgb) : undefined;\n }\n hexString() {\n return this._valid ? hexString(this._rgb) : undefined;\n }\n hslString() {\n return this._valid ? hslString(this._rgb) : undefined;\n }\n mix(color, weight) {\n if (color) {\n const c1 = this.rgb;\n const c2 = color.rgb;\n let w2;\n const p = weight === w2 ? 0.5 : weight;\n const w = 2 * p - 1;\n const a = c1.a - c2.a;\n const w1 = ((w * a === -1 ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n w2 = 1 - w1;\n c1.r = 0xFF & w1 * c1.r + w2 * c2.r + 0.5;\n c1.g = 0xFF & w1 * c1.g + w2 * c2.g + 0.5;\n c1.b = 0xFF & w1 * c1.b + w2 * c2.b + 0.5;\n c1.a = p * c1.a + (1 - p) * c2.a;\n this.rgb = c1;\n }\n return this;\n }\n interpolate(color, t) {\n if (color) {\n this._rgb = color_esm_interpolate(this._rgb, color._rgb, t);\n }\n return this;\n }\n clone() {\n return new color_esm_Color(this.rgb);\n }\n alpha(a) {\n this._rgb.a = n2b(a);\n return this;\n }\n clearer(ratio) {\n const rgb = this._rgb;\n rgb.a *= 1 - ratio;\n return this;\n }\n greyscale() {\n const rgb = this._rgb;\n const val = color_esm_round(rgb.r * 0.3 + rgb.g * 0.59 + rgb.b * 0.11);\n rgb.r = rgb.g = rgb.b = val;\n return this;\n }\n opaquer(ratio) {\n const rgb = this._rgb;\n rgb.a *= 1 + ratio;\n return this;\n }\n negate() {\n const v = this._rgb;\n v.r = 255 - v.r;\n v.g = 255 - v.g;\n v.b = 255 - v.b;\n return this;\n }\n lighten(ratio) {\n modHSL(this._rgb, 2, ratio);\n return this;\n }\n darken(ratio) {\n modHSL(this._rgb, 2, -ratio);\n return this;\n }\n saturate(ratio) {\n modHSL(this._rgb, 1, ratio);\n return this;\n }\n desaturate(ratio) {\n modHSL(this._rgb, 1, -ratio);\n return this;\n }\n rotate(deg) {\n rotate(this._rgb, deg);\n return this;\n }\n}\n\nfunction index_esm(input) {\n return new color_esm_Color(input);\n}\n\n\n\n;// CONCATENATED MODULE: ../node_modules/chart.js/dist/chunks/helpers.segment.js\n/*!\n * Chart.js v4.4.0\n * https://www.chartjs.org\n * (c) 2023 Chart.js Contributors\n * Released under the MIT License\n */\n\n\n/**\n * @namespace Chart.helpers\n */ /**\n * An empty function that can be used, for example, for optional callback.\n */ function helpers_segment_noop() {\n/* noop */ }\n/**\n * Returns a unique id, sequentially generated from a global variable.\n */ const uid = (()=>{\n let id = 0;\n return ()=>id++;\n})();\n/**\n * Returns true if `value` is neither null nor undefined, else returns false.\n * @param value - The value to test.\n * @since 2.7.0\n */ function isNullOrUndef(value) {\n return value === null || typeof value === \'undefined\';\n}\n/**\n * Returns true if `value` is an array (including typed arrays), else returns false.\n * @param value - The value to test.\n * @function\n */ function isArray(value) {\n if (Array.isArray && Array.isArray(value)) {\n return true;\n }\n const type = Object.prototype.toString.call(value);\n if (type.slice(0, 7) === \'[object\' && type.slice(-6) === \'Array]\') {\n return true;\n }\n return false;\n}\n/**\n * Returns true if `value` is an object (excluding null), else returns false.\n * @param value - The value to test.\n * @since 2.7.0\n */ function isObject(value) {\n return value !== null && Object.prototype.toString.call(value) === \'[object Object]\';\n}\n/**\n * Returns true if `value` is a finite number, else returns false\n * @param value - The value to test.\n */ function isNumberFinite(value) {\n return (typeof value === \'number\' || value instanceof Number) && isFinite(+value);\n}\n/**\n * Returns `value` if finite, else returns `defaultValue`.\n * @param value - The value to return if defined.\n * @param defaultValue - The value to return if `value` is not finite.\n */ function finiteOrDefault(value, defaultValue) {\n return isNumberFinite(value) ? value : defaultValue;\n}\n/**\n * Returns `value` if defined, else returns `defaultValue`.\n * @param value - The value to return if defined.\n * @param defaultValue - The value to return if `value` is undefined.\n */ function valueOrDefault(value, defaultValue) {\n return typeof value === \'undefined\' ? defaultValue : value;\n}\nconst toPercentage = (value, dimension)=>typeof value === \'string\' && value.endsWith(\'%\') ? parseFloat(value) / 100 : +value / dimension;\nconst toDimension = (value, dimension)=>typeof value === \'string\' && value.endsWith(\'%\') ? parseFloat(value) / 100 * dimension : +value;\n/**\n * Calls `fn` with the given `args` in the scope defined by `thisArg` and returns the\n * value returned by `fn`. If `fn` is not a function, this method returns undefined.\n * @param fn - The function to call.\n * @param args - The arguments with which `fn` should be called.\n * @param [thisArg] - The value of `this` provided for the call to `fn`.\n */ function callback(fn, args, thisArg) {\n if (fn && typeof fn.call === \'function\') {\n return fn.apply(thisArg, args);\n }\n}\nfunction helpers_segment_each(loopable, fn, thisArg, reverse) {\n let i, len, keys;\n if (isArray(loopable)) {\n len = loopable.length;\n if (reverse) {\n for(i = len - 1; i >= 0; i--){\n fn.call(thisArg, loopable[i], i);\n }\n } else {\n for(i = 0; i < len; i++){\n fn.call(thisArg, loopable[i], i);\n }\n }\n } else if (isObject(loopable)) {\n keys = Object.keys(loopable);\n len = keys.length;\n for(i = 0; i < len; i++){\n fn.call(thisArg, loopable[keys[i]], keys[i]);\n }\n }\n}\n/**\n * Returns true if the `a0` and `a1` arrays have the same content, else returns false.\n * @param a0 - The array to compare\n * @param a1 - The array to compare\n * @private\n */ function _elementsEqual(a0, a1) {\n let i, ilen, v0, v1;\n if (!a0 || !a1 || a0.length !== a1.length) {\n return false;\n }\n for(i = 0, ilen = a0.length; i < ilen; ++i){\n v0 = a0[i];\n v1 = a1[i];\n if (v0.datasetIndex !== v1.datasetIndex || v0.index !== v1.index) {\n return false;\n }\n }\n return true;\n}\n/**\n * Returns a deep copy of `source` without keeping references on objects and arrays.\n * @param source - The value to clone.\n */ function helpers_segment_clone(source) {\n if (isArray(source)) {\n return source.map(helpers_segment_clone);\n }\n if (isObject(source)) {\n const target = Object.create(null);\n const keys = Object.keys(source);\n const klen = keys.length;\n let k = 0;\n for(; k < klen; ++k){\n target[keys[k]] = helpers_segment_clone(source[keys[k]]);\n }\n return target;\n }\n return source;\n}\nfunction isValidKey(key) {\n return [\n \'__proto__\',\n \'prototype\',\n \'constructor\'\n ].indexOf(key) === -1;\n}\n/**\n * The default merger when Chart.helpers.merge is called without merger option.\n * Note(SB): also used by mergeConfig and mergeScaleConfig as fallback.\n * @private\n */ function _merger(key, target, source, options) {\n if (!isValidKey(key)) {\n return;\n }\n const tval = target[key];\n const sval = source[key];\n if (isObject(tval) && isObject(sval)) {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n helpers_segment_merge(tval, sval, options);\n } else {\n target[key] = helpers_segment_clone(sval);\n }\n}\nfunction helpers_segment_merge(target, source, options) {\n const sources = isArray(source) ? source : [\n source\n ];\n const ilen = sources.length;\n if (!isObject(target)) {\n return target;\n }\n options = options || {};\n const merger = options.merger || _merger;\n let current;\n for(let i = 0; i < ilen; ++i){\n current = sources[i];\n if (!isObject(current)) {\n continue;\n }\n const keys = Object.keys(current);\n for(let k = 0, klen = keys.length; k < klen; ++k){\n merger(keys[k], target, current, options);\n }\n }\n return target;\n}\nfunction mergeIf(target, source) {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n return helpers_segment_merge(target, source, {\n merger: _mergerIf\n });\n}\n/**\n * Merges source[key] in target[key] only if target[key] is undefined.\n * @private\n */ function _mergerIf(key, target, source) {\n if (!isValidKey(key)) {\n return;\n }\n const tval = target[key];\n const sval = source[key];\n if (isObject(tval) && isObject(sval)) {\n mergeIf(tval, sval);\n } else if (!Object.prototype.hasOwnProperty.call(target, key)) {\n target[key] = helpers_segment_clone(sval);\n }\n}\n/**\n * @private\n */ function _deprecated(scope, value, previous, current) {\n if (value !== undefined) {\n console.warn(scope + \': "\' + previous + \'" is deprecated. Please use "\' + current + \'" instead\');\n }\n}\n// resolveObjectKey resolver cache\nconst keyResolvers = {\n // Chart.helpers.core resolveObjectKey should resolve empty key to root object\n \'\': (v)=>v,\n // default resolvers\n x: (o)=>o.x,\n y: (o)=>o.y\n};\n/**\n * @private\n */ function _splitKey(key) {\n const parts = key.split(\'.\');\n const keys = [];\n let tmp = \'\';\n for (const part of parts){\n tmp += part;\n if (tmp.endsWith(\'\\\\\')) {\n tmp = tmp.slice(0, -1) + \'.\';\n } else {\n keys.push(tmp);\n tmp = \'\';\n }\n }\n return keys;\n}\nfunction _getKeyResolver(key) {\n const keys = _splitKey(key);\n return (obj)=>{\n for (const k of keys){\n if (k === \'\') {\n break;\n }\n obj = obj && obj[k];\n }\n return obj;\n };\n}\nfunction resolveObjectKey(obj, key) {\n const resolver = keyResolvers[key] || (keyResolvers[key] = _getKeyResolver(key));\n return resolver(obj);\n}\n/**\n * @private\n */ function _capitalize(str) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\nconst defined = (value)=>typeof value !== \'undefined\';\nconst isFunction = (value)=>typeof value === \'function\';\n// Adapted from https://stackoverflow.com/questions/31128855/comparing-ecma6-sets-for-equality#31129384\nconst setsEqual = (a, b)=>{\n if (a.size !== b.size) {\n return false;\n }\n for (const item of a){\n if (!b.has(item)) {\n return false;\n }\n }\n return true;\n};\n/**\n * @param e - The event\n * @private\n */ function _isClickEvent(e) {\n return e.type === \'mouseup\' || e.type === \'click\' || e.type === \'contextmenu\';\n}\n\n/**\n * @alias Chart.helpers.math\n * @namespace\n */ const PI = Math.PI;\nconst TAU = 2 * PI;\nconst PITAU = TAU + PI;\nconst INFINITY = Number.POSITIVE_INFINITY;\nconst RAD_PER_DEG = PI / 180;\nconst HALF_PI = PI / 2;\nconst QUARTER_PI = PI / 4;\nconst TWO_THIRDS_PI = PI * 2 / 3;\nconst log10 = Math.log10;\nconst sign = Math.sign;\nfunction almostEquals(x, y, epsilon) {\n return Math.abs(x - y) < epsilon;\n}\n/**\n * Implementation of the nice number algorithm used in determining where axis labels will go\n */ function niceNum(range) {\n const roundedRange = Math.round(range);\n range = almostEquals(range, roundedRange, range / 1000) ? roundedRange : range;\n const niceRange = Math.pow(10, Math.floor(log10(range)));\n const fraction = range / niceRange;\n const niceFraction = fraction <= 1 ? 1 : fraction <= 2 ? 2 : fraction <= 5 ? 5 : 10;\n return niceFraction * niceRange;\n}\n/**\n * Returns an array of factors sorted from 1 to sqrt(value)\n * @private\n */ function _factorize(value) {\n const result = [];\n const sqrt = Math.sqrt(value);\n let i;\n for(i = 1; i < sqrt; i++){\n if (value % i === 0) {\n result.push(i);\n result.push(value / i);\n }\n }\n if (sqrt === (sqrt | 0)) {\n result.push(sqrt);\n }\n result.sort((a, b)=>a - b).pop();\n return result;\n}\nfunction isNumber(n) {\n return !isNaN(parseFloat(n)) && isFinite(n);\n}\nfunction almostWhole(x, epsilon) {\n const rounded = Math.round(x);\n return rounded - epsilon <= x && rounded + epsilon >= x;\n}\n/**\n * @private\n */ function _setMinAndMaxByKey(array, target, property) {\n let i, ilen, value;\n for(i = 0, ilen = array.length; i < ilen; i++){\n value = array[i][property];\n if (!isNaN(value)) {\n target.min = Math.min(target.min, value);\n target.max = Math.max(target.max, value);\n }\n }\n}\nfunction toRadians(degrees) {\n return degrees * (PI / 180);\n}\nfunction toDegrees(radians) {\n return radians * (180 / PI);\n}\n/**\n * Returns the number of decimal places\n * i.e. the number of digits after the decimal point, of the value of this Number.\n * @param x - A number.\n * @returns The number of decimal places.\n * @private\n */ function _decimalPlaces(x) {\n if (!isNumberFinite(x)) {\n return;\n }\n let e = 1;\n let p = 0;\n while(Math.round(x * e) / e !== x){\n e *= 10;\n p++;\n }\n return p;\n}\n// Gets the angle from vertical upright to the point about a centre.\nfunction getAngleFromPoint(centrePoint, anglePoint) {\n const distanceFromXCenter = anglePoint.x - centrePoint.x;\n const distanceFromYCenter = anglePoint.y - centrePoint.y;\n const radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter);\n let angle = Math.atan2(distanceFromYCenter, distanceFromXCenter);\n if (angle < -0.5 * PI) {\n angle += TAU; // make sure the returned angle is in the range of (-PI/2, 3PI/2]\n }\n return {\n angle,\n distance: radialDistanceFromCenter\n };\n}\nfunction distanceBetweenPoints(pt1, pt2) {\n return Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2));\n}\n/**\n * Shortest distance between angles, in either direction.\n * @private\n */ function _angleDiff(a, b) {\n return (a - b + PITAU) % TAU - PI;\n}\n/**\n * Normalize angle to be between 0 and 2*PI\n * @private\n */ function _normalizeAngle(a) {\n return (a % TAU + TAU) % TAU;\n}\n/**\n * @private\n */ function _angleBetween(angle, start, end, sameAngleIsFullCircle) {\n const a = _normalizeAngle(angle);\n const s = _normalizeAngle(start);\n const e = _normalizeAngle(end);\n const angleToStart = _normalizeAngle(s - a);\n const angleToEnd = _normalizeAngle(e - a);\n const startToAngle = _normalizeAngle(a - s);\n const endToAngle = _normalizeAngle(a - e);\n return a === s || a === e || sameAngleIsFullCircle && s === e || angleToStart > angleToEnd && startToAngle < endToAngle;\n}\n/**\n * Limit `value` between `min` and `max`\n * @param value\n * @param min\n * @param max\n * @private\n */ function _limitValue(value, min, max) {\n return Math.max(min, Math.min(max, value));\n}\n/**\n * @param {number} value\n * @private\n */ function _int16Range(value) {\n return _limitValue(value, -32768, 32767);\n}\n/**\n * @param value\n * @param start\n * @param end\n * @param [epsilon]\n * @private\n */ function _isBetween(value, start, end, epsilon = 1e-6) {\n return value >= Math.min(start, end) - epsilon && value <= Math.max(start, end) + epsilon;\n}\n\nfunction _lookup(table, value, cmp) {\n cmp = cmp || ((index)=>table[index] < value);\n let hi = table.length - 1;\n let lo = 0;\n let mid;\n while(hi - lo > 1){\n mid = lo + hi >> 1;\n if (cmp(mid)) {\n lo = mid;\n } else {\n hi = mid;\n }\n }\n return {\n lo,\n hi\n };\n}\n/**\n * Binary search\n * @param table - the table search. must be sorted!\n * @param key - property name for the value in each entry\n * @param value - value to find\n * @param last - lookup last index\n * @private\n */ const _lookupByKey = (table, key, value, last)=>_lookup(table, value, last ? (index)=>{\n const ti = table[index][key];\n return ti < value || ti === value && table[index + 1][key] === value;\n } : (index)=>table[index][key] < value);\n/**\n * Reverse binary search\n * @param table - the table search. must be sorted!\n * @param key - property name for the value in each entry\n * @param value - value to find\n * @private\n */ const _rlookupByKey = (table, key, value)=>_lookup(table, value, (index)=>table[index][key] >= value);\n/**\n * Return subset of `values` between `min` and `max` inclusive.\n * Values are assumed to be in sorted order.\n * @param values - sorted array of values\n * @param min - min value\n * @param max - max value\n */ function _filterBetween(values, min, max) {\n let start = 0;\n let end = values.length;\n while(start < end && values[start] < min){\n start++;\n }\n while(end > start && values[end - 1] > max){\n end--;\n }\n return start > 0 || end < values.length ? values.slice(start, end) : values;\n}\nconst arrayEvents = [\n \'push\',\n \'pop\',\n \'shift\',\n \'splice\',\n \'unshift\'\n];\nfunction listenArrayEvents(array, listener) {\n if (array._chartjs) {\n array._chartjs.listeners.push(listener);\n return;\n }\n Object.defineProperty(array, \'_chartjs\', {\n configurable: true,\n enumerable: false,\n value: {\n listeners: [\n listener\n ]\n }\n });\n arrayEvents.forEach((key)=>{\n const method = \'_onData\' + _capitalize(key);\n const base = array[key];\n Object.defineProperty(array, key, {\n configurable: true,\n enumerable: false,\n value (...args) {\n const res = base.apply(this, args);\n array._chartjs.listeners.forEach((object)=>{\n if (typeof object[method] === \'function\') {\n object[method](...args);\n }\n });\n return res;\n }\n });\n });\n}\nfunction unlistenArrayEvents(array, listener) {\n const stub = array._chartjs;\n if (!stub) {\n return;\n }\n const listeners = stub.listeners;\n const index = listeners.indexOf(listener);\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n if (listeners.length > 0) {\n return;\n }\n arrayEvents.forEach((key)=>{\n delete array[key];\n });\n delete array._chartjs;\n}\n/**\n * @param items\n */ function _arrayUnique(items) {\n const set = new Set(items);\n if (set.size === items.length) {\n return items;\n }\n return Array.from(set);\n}\n\nfunction fontString(pixelSize, fontStyle, fontFamily) {\n return fontStyle + \' \' + pixelSize + \'px \' + fontFamily;\n}\n/**\n* Request animation polyfill\n*/ const requestAnimFrame = function() {\n if (typeof window === \'undefined\') {\n return function(callback) {\n return callback();\n };\n }\n return window.requestAnimationFrame;\n}();\n/**\n * Throttles calling `fn` once per animation frame\n * Latest arguments are used on the actual call\n */ function throttled(fn, thisArg) {\n let argsToUse = [];\n let ticking = false;\n return function(...args) {\n // Save the args for use later\n argsToUse = args;\n if (!ticking) {\n ticking = true;\n requestAnimFrame.call(window, ()=>{\n ticking = false;\n fn.apply(thisArg, argsToUse);\n });\n }\n };\n}\n/**\n * Debounces calling `fn` for `delay` ms\n */ function helpers_segment_debounce(fn, delay) {\n let timeout;\n return function(...args) {\n if (delay) {\n clearTimeout(timeout);\n timeout = setTimeout(fn, delay, args);\n } else {\n fn.apply(this, args);\n }\n return delay;\n };\n}\n/**\n * Converts \'start\' to \'left\', \'end\' to \'right\' and others to \'center\'\n * @private\n */ const _toLeftRightCenter = (align)=>align === \'start\' ? \'left\' : align === \'end\' ? \'right\' : \'center\';\n/**\n * Returns `start`, `end` or `(start + end) / 2` depending on `align`. Defaults to `center`\n * @private\n */ const _alignStartEnd = (align, start, end)=>align === \'start\' ? start : align === \'end\' ? end : (start + end) / 2;\n/**\n * Returns `left`, `right` or `(left + right) / 2` depending on `align`. Defaults to `left`\n * @private\n */ const _textX = (align, left, right, rtl)=>{\n const check = rtl ? \'left\' : \'right\';\n return align === check ? right : align === \'center\' ? (left + right) / 2 : left;\n};\n/**\n * Return start and count of visible points.\n * @private\n */ function _getStartAndCountOfVisiblePoints(meta, points, animationsDisabled) {\n const pointCount = points.length;\n let start = 0;\n let count = pointCount;\n if (meta._sorted) {\n const { iScale , _parsed } = meta;\n const axis = iScale.axis;\n const { min , max , minDefined , maxDefined } = iScale.getUserBounds();\n if (minDefined) {\n start = _limitValue(Math.min(// @ts-expect-error Need to type _parsed\n _lookupByKey(_parsed, axis, min).lo, // @ts-expect-error Need to fix types on _lookupByKey\n animationsDisabled ? pointCount : _lookupByKey(points, axis, iScale.getPixelForValue(min)).lo), 0, pointCount - 1);\n }\n if (maxDefined) {\n count = _limitValue(Math.max(// @ts-expect-error Need to type _parsed\n _lookupByKey(_parsed, iScale.axis, max, true).hi + 1, // @ts-expect-error Need to fix types on _lookupByKey\n animationsDisabled ? 0 : _lookupByKey(points, axis, iScale.getPixelForValue(max), true).hi + 1), start, pointCount) - start;\n } else {\n count = pointCount - start;\n }\n }\n return {\n start,\n count\n };\n}\n/**\n * Checks if the scale ranges have changed.\n * @param {object} meta - dataset meta.\n * @returns {boolean}\n * @private\n */ function _scaleRangesChanged(meta) {\n const { xScale , yScale , _scaleRanges } = meta;\n const newRanges = {\n xmin: xScale.min,\n xmax: xScale.max,\n ymin: yScale.min,\n ymax: yScale.max\n };\n if (!_scaleRanges) {\n meta._scaleRanges = newRanges;\n return true;\n }\n const changed = _scaleRanges.xmin !== xScale.min || _scaleRanges.xmax !== xScale.max || _scaleRanges.ymin !== yScale.min || _scaleRanges.ymax !== yScale.max;\n Object.assign(_scaleRanges, newRanges);\n return changed;\n}\n\nconst atEdge = (t)=>t === 0 || t === 1;\nconst elasticIn = (t, s, p)=>-(Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * TAU / p));\nconst elasticOut = (t, s, p)=>Math.pow(2, -10 * t) * Math.sin((t - s) * TAU / p) + 1;\n/**\n * Easing functions adapted from Robert Penner\'s easing equations.\n * @namespace Chart.helpers.easing.effects\n * @see http://www.robertpenner.com/easing/\n */ const effects = {\n linear: (t)=>t,\n easeInQuad: (t)=>t * t,\n easeOutQuad: (t)=>-t * (t - 2),\n easeInOutQuad: (t)=>(t /= 0.5) < 1 ? 0.5 * t * t : -0.5 * (--t * (t - 2) - 1),\n easeInCubic: (t)=>t * t * t,\n easeOutCubic: (t)=>(t -= 1) * t * t + 1,\n easeInOutCubic: (t)=>(t /= 0.5) < 1 ? 0.5 * t * t * t : 0.5 * ((t -= 2) * t * t + 2),\n easeInQuart: (t)=>t * t * t * t,\n easeOutQuart: (t)=>-((t -= 1) * t * t * t - 1),\n easeInOutQuart: (t)=>(t /= 0.5) < 1 ? 0.5 * t * t * t * t : -0.5 * ((t -= 2) * t * t * t - 2),\n easeInQuint: (t)=>t * t * t * t * t,\n easeOutQuint: (t)=>(t -= 1) * t * t * t * t + 1,\n easeInOutQuint: (t)=>(t /= 0.5) < 1 ? 0.5 * t * t * t * t * t : 0.5 * ((t -= 2) * t * t * t * t + 2),\n easeInSine: (t)=>-Math.cos(t * HALF_PI) + 1,\n easeOutSine: (t)=>Math.sin(t * HALF_PI),\n easeInOutSine: (t)=>-0.5 * (Math.cos(PI * t) - 1),\n easeInExpo: (t)=>t === 0 ? 0 : Math.pow(2, 10 * (t - 1)),\n easeOutExpo: (t)=>t === 1 ? 1 : -Math.pow(2, -10 * t) + 1,\n easeInOutExpo: (t)=>atEdge(t) ? t : t < 0.5 ? 0.5 * Math.pow(2, 10 * (t * 2 - 1)) : 0.5 * (-Math.pow(2, -10 * (t * 2 - 1)) + 2),\n easeInCirc: (t)=>t >= 1 ? t : -(Math.sqrt(1 - t * t) - 1),\n easeOutCirc: (t)=>Math.sqrt(1 - (t -= 1) * t),\n easeInOutCirc: (t)=>(t /= 0.5) < 1 ? -0.5 * (Math.sqrt(1 - t * t) - 1) : 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1),\n easeInElastic: (t)=>atEdge(t) ? t : elasticIn(t, 0.075, 0.3),\n easeOutElastic: (t)=>atEdge(t) ? t : elasticOut(t, 0.075, 0.3),\n easeInOutElastic (t) {\n const s = 0.1125;\n const p = 0.45;\n return atEdge(t) ? t : t < 0.5 ? 0.5 * elasticIn(t * 2, s, p) : 0.5 + 0.5 * elasticOut(t * 2 - 1, s, p);\n },\n easeInBack (t) {\n const s = 1.70158;\n return t * t * ((s + 1) * t - s);\n },\n easeOutBack (t) {\n const s = 1.70158;\n return (t -= 1) * t * ((s + 1) * t + s) + 1;\n },\n easeInOutBack (t) {\n let s = 1.70158;\n if ((t /= 0.5) < 1) {\n return 0.5 * (t * t * (((s *= 1.525) + 1) * t - s));\n }\n return 0.5 * ((t -= 2) * t * (((s *= 1.525) + 1) * t + s) + 2);\n },\n easeInBounce: (t)=>1 - effects.easeOutBounce(1 - t),\n easeOutBounce (t) {\n const m = 7.5625;\n const d = 2.75;\n if (t < 1 / d) {\n return m * t * t;\n }\n if (t < 2 / d) {\n return m * (t -= 1.5 / d) * t + 0.75;\n }\n if (t < 2.5 / d) {\n return m * (t -= 2.25 / d) * t + 0.9375;\n }\n return m * (t -= 2.625 / d) * t + 0.984375;\n },\n easeInOutBounce: (t)=>t < 0.5 ? effects.easeInBounce(t * 2) * 0.5 : effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5\n};\n\nfunction isPatternOrGradient(value) {\n if (value && typeof value === \'object\') {\n const type = value.toString();\n return type === \'[object CanvasPattern]\' || type === \'[object CanvasGradient]\';\n }\n return false;\n}\nfunction helpers_segment_color(value) {\n return isPatternOrGradient(value) ? value : new color_esm_Color(value);\n}\nfunction getHoverColor(value) {\n return isPatternOrGradient(value) ? value : new color_esm_Color(value).saturate(0.5).darken(0.1).hexString();\n}\n\nconst helpers_segment_numbers = [\n \'x\',\n \'y\',\n \'borderWidth\',\n \'radius\',\n \'tension\'\n];\nconst helpers_segment_colors = [\n \'color\',\n \'borderColor\',\n \'backgroundColor\'\n];\nfunction applyAnimationsDefaults(defaults) {\n defaults.set(\'animation\', {\n delay: undefined,\n duration: 1000,\n easing: \'easeOutQuart\',\n fn: undefined,\n from: undefined,\n loop: undefined,\n to: undefined,\n type: undefined\n });\n defaults.describe(\'animation\', {\n _fallback: false,\n _indexable: false,\n _scriptable: (name)=>name !== \'onProgress\' && name !== \'onComplete\' && name !== \'fn\'\n });\n defaults.set(\'animations\', {\n colors: {\n type: \'color\',\n properties: helpers_segment_colors\n },\n numbers: {\n type: \'number\',\n properties: helpers_segment_numbers\n }\n });\n defaults.describe(\'animations\', {\n _fallback: \'animation\'\n });\n defaults.set(\'transitions\', {\n active: {\n animation: {\n duration: 400\n }\n },\n resize: {\n animation: {\n duration: 0\n }\n },\n show: {\n animations: {\n colors: {\n from: \'transparent\'\n },\n visible: {\n type: \'boolean\',\n duration: 0\n }\n }\n },\n hide: {\n animations: {\n colors: {\n to: \'transparent\'\n },\n visible: {\n type: \'boolean\',\n easing: \'linear\',\n fn: (v)=>v | 0\n }\n }\n }\n });\n}\n\nfunction applyLayoutsDefaults(defaults) {\n defaults.set(\'layout\', {\n autoPadding: true,\n padding: {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n }\n });\n}\n\nconst intlCache = new Map();\nfunction getNumberFormat(locale, options) {\n options = options || {};\n const cacheKey = locale + JSON.stringify(options);\n let formatter = intlCache.get(cacheKey);\n if (!formatter) {\n formatter = new Intl.NumberFormat(locale, options);\n intlCache.set(cacheKey, formatter);\n }\n return formatter;\n}\nfunction formatNumber(num, locale, options) {\n return getNumberFormat(locale, options).format(num);\n}\n\nconst formatters = {\n values (value) {\n return isArray(value) ? value : \'\' + value;\n },\n numeric (tickValue, index, ticks) {\n if (tickValue === 0) {\n return \'0\';\n }\n const locale = this.chart.options.locale;\n let notation;\n let delta = tickValue;\n if (ticks.length > 1) {\n const maxTick = Math.max(Math.abs(ticks[0].value), Math.abs(ticks[ticks.length - 1].value));\n if (maxTick < 1e-4 || maxTick > 1e+15) {\n notation = \'scientific\';\n }\n delta = calculateDelta(tickValue, ticks);\n }\n const logDelta = log10(Math.abs(delta));\n const numDecimal = isNaN(logDelta) ? 1 : Math.max(Math.min(-1 * Math.floor(logDelta), 20), 0);\n const options = {\n notation,\n minimumFractionDigits: numDecimal,\n maximumFractionDigits: numDecimal\n };\n Object.assign(options, this.options.ticks.format);\n return formatNumber(tickValue, locale, options);\n },\n logarithmic (tickValue, index, ticks) {\n if (tickValue === 0) {\n return \'0\';\n }\n const remain = ticks[index].significand || tickValue / Math.pow(10, Math.floor(log10(tickValue)));\n if ([\n 1,\n 2,\n 3,\n 5,\n 10,\n 15\n ].includes(remain) || index > 0.8 * ticks.length) {\n return formatters.numeric.call(this, tickValue, index, ticks);\n }\n return \'\';\n }\n};\nfunction calculateDelta(tickValue, ticks) {\n let delta = ticks.length > 3 ? ticks[2].value - ticks[1].value : ticks[1].value - ticks[0].value;\n if (Math.abs(delta) >= 1 && tickValue !== Math.floor(tickValue)) {\n delta = tickValue - Math.floor(tickValue);\n }\n return delta;\n}\n var Ticks = {\n formatters\n};\n\nfunction applyScaleDefaults(defaults) {\n defaults.set(\'scale\', {\n display: true,\n offset: false,\n reverse: false,\n beginAtZero: false,\n bounds: \'ticks\',\n clip: true,\n grace: 0,\n grid: {\n display: true,\n lineWidth: 1,\n drawOnChartArea: true,\n drawTicks: true,\n tickLength: 8,\n tickWidth: (_ctx, options)=>options.lineWidth,\n tickColor: (_ctx, options)=>options.color,\n offset: false\n },\n border: {\n display: true,\n dash: [],\n dashOffset: 0.0,\n width: 1\n },\n title: {\n display: false,\n text: \'\',\n padding: {\n top: 4,\n bottom: 4\n }\n },\n ticks: {\n minRotation: 0,\n maxRotation: 50,\n mirror: false,\n textStrokeWidth: 0,\n textStrokeColor: \'\',\n padding: 3,\n display: true,\n autoSkip: true,\n autoSkipPadding: 3,\n labelOffset: 0,\n callback: Ticks.formatters.values,\n minor: {},\n major: {},\n align: \'center\',\n crossAlign: \'near\',\n showLabelBackdrop: false,\n backdropColor: \'rgba(255, 255, 255, 0.75)\',\n backdropPadding: 2\n }\n });\n defaults.route(\'scale.ticks\', \'color\', \'\', \'color\');\n defaults.route(\'scale.grid\', \'color\', \'\', \'borderColor\');\n defaults.route(\'scale.border\', \'color\', \'\', \'borderColor\');\n defaults.route(\'scale.title\', \'color\', \'\', \'color\');\n defaults.describe(\'scale\', {\n _fallback: false,\n _scriptable: (name)=>!name.startsWith(\'before\') && !name.startsWith(\'after\') && name !== \'callback\' && name !== \'parser\',\n _indexable: (name)=>name !== \'borderDash\' && name !== \'tickBorderDash\' && name !== \'dash\'\n });\n defaults.describe(\'scales\', {\n _fallback: \'scale\'\n });\n defaults.describe(\'scale.ticks\', {\n _scriptable: (name)=>name !== \'backdropPadding\' && name !== \'callback\',\n _indexable: (name)=>name !== \'backdropPadding\'\n });\n}\n\nconst overrides = Object.create(null);\nconst descriptors = Object.create(null);\n function getScope$1(node, key) {\n if (!key) {\n return node;\n }\n const keys = key.split(\'.\');\n for(let i = 0, n = keys.length; i < n; ++i){\n const k = keys[i];\n node = node[k] || (node[k] = Object.create(null));\n }\n return node;\n}\nfunction helpers_segment_set(root, scope, values) {\n if (typeof scope === \'string\') {\n return helpers_segment_merge(getScope$1(root, scope), values);\n }\n return helpers_segment_merge(getScope$1(root, \'\'), scope);\n}\n class Defaults {\n constructor(_descriptors, _appliers){\n this.animation = undefined;\n this.backgroundColor = \'rgba(0,0,0,0.1)\';\n this.borderColor = \'rgba(0,0,0,0.1)\';\n this.color = \'#666\';\n this.datasets = {};\n this.devicePixelRatio = (context)=>context.chart.platform.getDevicePixelRatio();\n this.elements = {};\n this.events = [\n \'mousemove\',\n \'mouseout\',\n \'click\',\n \'touchstart\',\n \'touchmove\'\n ];\n this.font = {\n family: "\'Helvetica Neue\', \'Helvetica\', \'Arial\', sans-serif",\n size: 12,\n style: \'normal\',\n lineHeight: 1.2,\n weight: null\n };\n this.hover = {};\n this.hoverBackgroundColor = (ctx, options)=>getHoverColor(options.backgroundColor);\n this.hoverBorderColor = (ctx, options)=>getHoverColor(options.borderColor);\n this.hoverColor = (ctx, options)=>getHoverColor(options.color);\n this.indexAxis = \'x\';\n this.interaction = {\n mode: \'nearest\',\n intersect: true,\n includeInvisible: false\n };\n this.maintainAspectRatio = true;\n this.onHover = null;\n this.onClick = null;\n this.parsing = true;\n this.plugins = {};\n this.responsive = true;\n this.scale = undefined;\n this.scales = {};\n this.showLine = true;\n this.drawActiveElementsOnTop = true;\n this.describe(_descriptors);\n this.apply(_appliers);\n }\n set(scope, values) {\n return helpers_segment_set(this, scope, values);\n }\n get(scope) {\n return getScope$1(this, scope);\n }\n describe(scope, values) {\n return helpers_segment_set(descriptors, scope, values);\n }\n override(scope, values) {\n return helpers_segment_set(overrides, scope, values);\n }\n route(scope, name, targetScope, targetName) {\n const scopeObject = getScope$1(this, scope);\n const targetScopeObject = getScope$1(this, targetScope);\n const privateName = \'_\' + name;\n Object.defineProperties(scopeObject, {\n [privateName]: {\n value: scopeObject[name],\n writable: true\n },\n [name]: {\n enumerable: true,\n get () {\n const local = this[privateName];\n const target = targetScopeObject[targetName];\n if (isObject(local)) {\n return Object.assign({}, target, local);\n }\n return valueOrDefault(local, target);\n },\n set (value) {\n this[privateName] = value;\n }\n }\n });\n }\n apply(appliers) {\n appliers.forEach((apply)=>apply(this));\n }\n}\nvar defaults = /* #__PURE__ */ new Defaults({\n _scriptable: (name)=>!name.startsWith(\'on\'),\n _indexable: (name)=>name !== \'events\',\n hover: {\n _fallback: \'interaction\'\n },\n interaction: {\n _scriptable: false,\n _indexable: false\n }\n}, [\n applyAnimationsDefaults,\n applyLayoutsDefaults,\n applyScaleDefaults\n]);\n\n/**\n * Converts the given font object into a CSS font string.\n * @param font - A font object.\n * @return The CSS font string. See https://developer.mozilla.org/en-US/docs/Web/CSS/font\n * @private\n */ function toFontString(font) {\n if (!font || isNullOrUndef(font.size) || isNullOrUndef(font.family)) {\n return null;\n }\n return (font.style ? font.style + \' \' : \'\') + (font.weight ? font.weight + \' \' : \'\') + font.size + \'px \' + font.family;\n}\n/**\n * @private\n */ function _measureText(ctx, data, gc, longest, string) {\n let textWidth = data[string];\n if (!textWidth) {\n textWidth = data[string] = ctx.measureText(string).width;\n gc.push(string);\n }\n if (textWidth > longest) {\n longest = textWidth;\n }\n return longest;\n}\n/**\n * @private\n */ // eslint-disable-next-line complexity\nfunction _longestText(ctx, font, arrayOfThings, cache) {\n cache = cache || {};\n let data = cache.data = cache.data || {};\n let gc = cache.garbageCollect = cache.garbageCollect || [];\n if (cache.font !== font) {\n data = cache.data = {};\n gc = cache.garbageCollect = [];\n cache.font = font;\n }\n ctx.save();\n ctx.font = font;\n let longest = 0;\n const ilen = arrayOfThings.length;\n let i, j, jlen, thing, nestedThing;\n for(i = 0; i < ilen; i++){\n thing = arrayOfThings[i];\n // Undefined strings and arrays should not be measured\n if (thing !== undefined && thing !== null && !isArray(thing)) {\n longest = _measureText(ctx, data, gc, longest, thing);\n } else if (isArray(thing)) {\n // if it is an array lets measure each element\n // to do maybe simplify this function a bit so we can do this more recursively?\n for(j = 0, jlen = thing.length; j < jlen; j++){\n nestedThing = thing[j];\n // Undefined strings and arrays should not be measured\n if (nestedThing !== undefined && nestedThing !== null && !isArray(nestedThing)) {\n longest = _measureText(ctx, data, gc, longest, nestedThing);\n }\n }\n }\n }\n ctx.restore();\n const gcLen = gc.length / 2;\n if (gcLen > arrayOfThings.length) {\n for(i = 0; i < gcLen; i++){\n delete data[gc[i]];\n }\n gc.splice(0, gcLen);\n }\n return longest;\n}\n/**\n * Returns the aligned pixel value to avoid anti-aliasing blur\n * @param chart - The chart instance.\n * @param pixel - A pixel value.\n * @param width - The width of the element.\n * @returns The aligned pixel value.\n * @private\n */ function _alignPixel(chart, pixel, width) {\n const devicePixelRatio = chart.currentDevicePixelRatio;\n const halfWidth = width !== 0 ? Math.max(width / 2, 0.5) : 0;\n return Math.round((pixel - halfWidth) * devicePixelRatio) / devicePixelRatio + halfWidth;\n}\n/**\n * Clears the entire canvas.\n */ function clearCanvas(canvas, ctx) {\n ctx = ctx || canvas.getContext(\'2d\');\n ctx.save();\n // canvas.width and canvas.height do not consider the canvas transform,\n // while clearRect does\n ctx.resetTransform();\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.restore();\n}\nfunction drawPoint(ctx, options, x, y) {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n drawPointLegend(ctx, options, x, y, null);\n}\n// eslint-disable-next-line complexity\nfunction drawPointLegend(ctx, options, x, y, w) {\n let type, xOffset, yOffset, size, cornerRadius, width, xOffsetW, yOffsetW;\n const style = options.pointStyle;\n const rotation = options.rotation;\n const radius = options.radius;\n let rad = (rotation || 0) * RAD_PER_DEG;\n if (style && typeof style === \'object\') {\n type = style.toString();\n if (type === \'[object HTMLImageElement]\' || type === \'[object HTMLCanvasElement]\') {\n ctx.save();\n ctx.translate(x, y);\n ctx.rotate(rad);\n ctx.drawImage(style, -style.width / 2, -style.height / 2, style.width, style.height);\n ctx.restore();\n return;\n }\n }\n if (isNaN(radius) || radius <= 0) {\n return;\n }\n ctx.beginPath();\n switch(style){\n // Default includes circle\n default:\n if (w) {\n ctx.ellipse(x, y, w / 2, radius, 0, 0, TAU);\n } else {\n ctx.arc(x, y, radius, 0, TAU);\n }\n ctx.closePath();\n break;\n case \'triangle\':\n width = w ? w / 2 : radius;\n ctx.moveTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n rad += TWO_THIRDS_PI;\n ctx.lineTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n rad += TWO_THIRDS_PI;\n ctx.lineTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n ctx.closePath();\n break;\n case \'rectRounded\':\n // NOTE: the rounded rect implementation changed to use `arc` instead of\n // `quadraticCurveTo` since it generates better results when rect is\n // almost a circle. 0.516 (instead of 0.5) produces results with visually\n // closer proportion to the previous impl and it is inscribed in the\n // circle with `radius`. For more details, see the following PRs:\n // https://github.com/chartjs/Chart.js/issues/5597\n // https://github.com/chartjs/Chart.js/issues/5858\n cornerRadius = radius * 0.516;\n size = radius - cornerRadius;\n xOffset = Math.cos(rad + QUARTER_PI) * size;\n xOffsetW = Math.cos(rad + QUARTER_PI) * (w ? w / 2 - cornerRadius : size);\n yOffset = Math.sin(rad + QUARTER_PI) * size;\n yOffsetW = Math.sin(rad + QUARTER_PI) * (w ? w / 2 - cornerRadius : size);\n ctx.arc(x - xOffsetW, y - yOffset, cornerRadius, rad - PI, rad - HALF_PI);\n ctx.arc(x + yOffsetW, y - xOffset, cornerRadius, rad - HALF_PI, rad);\n ctx.arc(x + xOffsetW, y + yOffset, cornerRadius, rad, rad + HALF_PI);\n ctx.arc(x - yOffsetW, y + xOffset, cornerRadius, rad + HALF_PI, rad + PI);\n ctx.closePath();\n break;\n case \'rect\':\n if (!rotation) {\n size = Math.SQRT1_2 * radius;\n width = w ? w / 2 : size;\n ctx.rect(x - width, y - size, 2 * width, 2 * size);\n break;\n }\n rad += QUARTER_PI;\n /* falls through */ case \'rectRot\':\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n ctx.closePath();\n break;\n case \'crossRot\':\n rad += QUARTER_PI;\n /* falls through */ case \'cross\':\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.moveTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n break;\n case \'star\':\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.moveTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n rad += QUARTER_PI;\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.moveTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n break;\n case \'line\':\n xOffset = w ? w / 2 : Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n ctx.moveTo(x - xOffset, y - yOffset);\n ctx.lineTo(x + xOffset, y + yOffset);\n break;\n case \'dash\':\n ctx.moveTo(x, y);\n ctx.lineTo(x + Math.cos(rad) * (w ? w / 2 : radius), y + Math.sin(rad) * radius);\n break;\n case false:\n ctx.closePath();\n break;\n }\n ctx.fill();\n if (options.borderWidth > 0) {\n ctx.stroke();\n }\n}\n/**\n * Returns true if the point is inside the rectangle\n * @param point - The point to test\n * @param area - The rectangle\n * @param margin - allowed margin\n * @private\n */ function _isPointInArea(point, area, margin) {\n margin = margin || 0.5; // margin - default is to match rounded decimals\n return !area || point && point.x > area.left - margin && point.x < area.right + margin && point.y > area.top - margin && point.y < area.bottom + margin;\n}\nfunction clipArea(ctx, area) {\n ctx.save();\n ctx.beginPath();\n ctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top);\n ctx.clip();\n}\nfunction unclipArea(ctx) {\n ctx.restore();\n}\n/**\n * @private\n */ function _steppedLineTo(ctx, previous, target, flip, mode) {\n if (!previous) {\n return ctx.lineTo(target.x, target.y);\n }\n if (mode === \'middle\') {\n const midpoint = (previous.x + target.x) / 2.0;\n ctx.lineTo(midpoint, previous.y);\n ctx.lineTo(midpoint, target.y);\n } else if (mode === \'after\' !== !!flip) {\n ctx.lineTo(previous.x, target.y);\n } else {\n ctx.lineTo(target.x, previous.y);\n }\n ctx.lineTo(target.x, target.y);\n}\n/**\n * @private\n */ function _bezierCurveTo(ctx, previous, target, flip) {\n if (!previous) {\n return ctx.lineTo(target.x, target.y);\n }\n ctx.bezierCurveTo(flip ? previous.cp1x : previous.cp2x, flip ? previous.cp1y : previous.cp2y, flip ? target.cp2x : target.cp1x, flip ? target.cp2y : target.cp1y, target.x, target.y);\n}\nfunction setRenderOpts(ctx, opts) {\n if (opts.translation) {\n ctx.translate(opts.translation[0], opts.translation[1]);\n }\n if (!isNullOrUndef(opts.rotation)) {\n ctx.rotate(opts.rotation);\n }\n if (opts.color) {\n ctx.fillStyle = opts.color;\n }\n if (opts.textAlign) {\n ctx.textAlign = opts.textAlign;\n }\n if (opts.textBaseline) {\n ctx.textBaseline = opts.textBaseline;\n }\n}\nfunction decorateText(ctx, x, y, line, opts) {\n if (opts.strikethrough || opts.underline) {\n /**\n * Now that IE11 support has been dropped, we can use more\n * of the TextMetrics object. The actual bounding boxes\n * are unflagged in Chrome, Firefox, Edge, and Safari so they\n * can be safely used.\n * See https://developer.mozilla.org/en-US/docs/Web/API/TextMetrics#Browser_compatibility\n */ const metrics = ctx.measureText(line);\n const left = x - metrics.actualBoundingBoxLeft;\n const right = x + metrics.actualBoundingBoxRight;\n const top = y - metrics.actualBoundingBoxAscent;\n const bottom = y + metrics.actualBoundingBoxDescent;\n const yDecoration = opts.strikethrough ? (top + bottom) / 2 : bottom;\n ctx.strokeStyle = ctx.fillStyle;\n ctx.beginPath();\n ctx.lineWidth = opts.decorationWidth || 2;\n ctx.moveTo(left, yDecoration);\n ctx.lineTo(right, yDecoration);\n ctx.stroke();\n }\n}\nfunction drawBackdrop(ctx, opts) {\n const oldColor = ctx.fillStyle;\n ctx.fillStyle = opts.color;\n ctx.fillRect(opts.left, opts.top, opts.width, opts.height);\n ctx.fillStyle = oldColor;\n}\n/**\n * Render text onto the canvas\n */ function renderText(ctx, text, x, y, font, opts = {}) {\n const lines = isArray(text) ? text : [\n text\n ];\n const stroke = opts.strokeWidth > 0 && opts.strokeColor !== \'\';\n let i, line;\n ctx.save();\n ctx.font = font.string;\n setRenderOpts(ctx, opts);\n for(i = 0; i < lines.length; ++i){\n line = lines[i];\n if (opts.backdrop) {\n drawBackdrop(ctx, opts.backdrop);\n }\n if (stroke) {\n if (opts.strokeColor) {\n ctx.strokeStyle = opts.strokeColor;\n }\n if (!isNullOrUndef(opts.strokeWidth)) {\n ctx.lineWidth = opts.strokeWidth;\n }\n ctx.strokeText(line, x, y, opts.maxWidth);\n }\n ctx.fillText(line, x, y, opts.maxWidth);\n decorateText(ctx, x, y, line, opts);\n y += Number(font.lineHeight);\n }\n ctx.restore();\n}\n/**\n * Add a path of a rectangle with rounded corners to the current sub-path\n * @param ctx - Context\n * @param rect - Bounding rect\n */ function addRoundedRectPath(ctx, rect) {\n const { x , y , w , h , radius } = rect;\n // top left arc\n ctx.arc(x + radius.topLeft, y + radius.topLeft, radius.topLeft, 1.5 * PI, PI, true);\n // line from top left to bottom left\n ctx.lineTo(x, y + h - radius.bottomLeft);\n // bottom left arc\n ctx.arc(x + radius.bottomLeft, y + h - radius.bottomLeft, radius.bottomLeft, PI, HALF_PI, true);\n // line from bottom left to bottom right\n ctx.lineTo(x + w - radius.bottomRight, y + h);\n // bottom right arc\n ctx.arc(x + w - radius.bottomRight, y + h - radius.bottomRight, radius.bottomRight, HALF_PI, 0, true);\n // line from bottom right to top right\n ctx.lineTo(x + w, y + radius.topRight);\n // top right arc\n ctx.arc(x + w - radius.topRight, y + radius.topRight, radius.topRight, 0, -HALF_PI, true);\n // line from top right to top left\n ctx.lineTo(x + radius.topLeft, y);\n}\n\nconst LINE_HEIGHT = /^(normal|(\\d+(?:\\.\\d+)?)(px|em|%)?)$/;\nconst FONT_STYLE = /^(normal|italic|initial|inherit|unset|(oblique( -?[0-9]?[0-9]deg)?))$/;\n/**\n * @alias Chart.helpers.options\n * @namespace\n */ /**\n * Converts the given line height `value` in pixels for a specific font `size`.\n * @param value - The lineHeight to parse (eg. 1.6, \'14px\', \'75%\', \'1.6em\').\n * @param size - The font size (in pixels) used to resolve relative `value`.\n * @returns The effective line height in pixels (size * 1.2 if value is invalid).\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/line-height\n * @since 2.7.0\n */ function toLineHeight(value, size) {\n const matches = (\'\' + value).match(LINE_HEIGHT);\n if (!matches || matches[1] === \'normal\') {\n return size * 1.2;\n }\n value = +matches[2];\n switch(matches[3]){\n case \'px\':\n return value;\n case \'%\':\n value /= 100;\n break;\n }\n return size * value;\n}\nconst numberOrZero = (v)=>+v || 0;\nfunction _readValueToProps(value, props) {\n const ret = {};\n const objProps = isObject(props);\n const keys = objProps ? Object.keys(props) : props;\n const read = isObject(value) ? objProps ? (prop)=>valueOrDefault(value[prop], value[props[prop]]) : (prop)=>value[prop] : ()=>value;\n for (const prop of keys){\n ret[prop] = numberOrZero(read(prop));\n }\n return ret;\n}\n/**\n * Converts the given value into a TRBL object.\n * @param value - If a number, set the value to all TRBL component,\n * else, if an object, use defined properties and sets undefined ones to 0.\n * x / y are shorthands for same value for left/right and top/bottom.\n * @returns The padding values (top, right, bottom, left)\n * @since 3.0.0\n */ function toTRBL(value) {\n return _readValueToProps(value, {\n top: \'y\',\n right: \'x\',\n bottom: \'y\',\n left: \'x\'\n });\n}\n/**\n * Converts the given value into a TRBL corners object (similar with css border-radius).\n * @param value - If a number, set the value to all TRBL corner components,\n * else, if an object, use defined properties and sets undefined ones to 0.\n * @returns The TRBL corner values (topLeft, topRight, bottomLeft, bottomRight)\n * @since 3.0.0\n */ function toTRBLCorners(value) {\n return _readValueToProps(value, [\n \'topLeft\',\n \'topRight\',\n \'bottomLeft\',\n \'bottomRight\'\n ]);\n}\n/**\n * Converts the given value into a padding object with pre-computed width/height.\n * @param value - If a number, set the value to all TRBL component,\n * else, if an object, use defined properties and sets undefined ones to 0.\n * x / y are shorthands for same value for left/right and top/bottom.\n * @returns The padding values (top, right, bottom, left, width, height)\n * @since 2.7.0\n */ function toPadding(value) {\n const obj = toTRBL(value);\n obj.width = obj.left + obj.right;\n obj.height = obj.top + obj.bottom;\n return obj;\n}\n/**\n * Parses font options and returns the font object.\n * @param options - A object that contains font options to be parsed.\n * @param fallback - A object that contains fallback font options.\n * @return The font object.\n * @private\n */ function toFont(options, fallback) {\n options = options || {};\n fallback = fallback || defaults.font;\n let size = valueOrDefault(options.size, fallback.size);\n if (typeof size === \'string\') {\n size = parseInt(size, 10);\n }\n let style = valueOrDefault(options.style, fallback.style);\n if (style && !(\'\' + style).match(FONT_STYLE)) {\n console.warn(\'Invalid font style specified: "\' + style + \'"\');\n style = undefined;\n }\n const font = {\n family: valueOrDefault(options.family, fallback.family),\n lineHeight: toLineHeight(valueOrDefault(options.lineHeight, fallback.lineHeight), size),\n size,\n style,\n weight: valueOrDefault(options.weight, fallback.weight),\n string: \'\'\n };\n font.string = toFontString(font);\n return font;\n}\n/**\n * Evaluates the given `inputs` sequentially and returns the first defined value.\n * @param inputs - An array of values, falling back to the last value.\n * @param context - If defined and the current value is a function, the value\n * is called with `context` as first argument and the result becomes the new input.\n * @param index - If defined and the current value is an array, the value\n * at `index` become the new input.\n * @param info - object to return information about resolution in\n * @param info.cacheable - Will be set to `false` if option is not cacheable.\n * @since 2.7.0\n */ function resolve(inputs, context, index, info) {\n let cacheable = true;\n let i, ilen, value;\n for(i = 0, ilen = inputs.length; i < ilen; ++i){\n value = inputs[i];\n if (value === undefined) {\n continue;\n }\n if (context !== undefined && typeof value === \'function\') {\n value = value(context);\n cacheable = false;\n }\n if (index !== undefined && isArray(value)) {\n value = value[index % value.length];\n cacheable = false;\n }\n if (value !== undefined) {\n if (info && !cacheable) {\n info.cacheable = false;\n }\n return value;\n }\n }\n}\n/**\n * @param minmax\n * @param grace\n * @param beginAtZero\n * @private\n */ function _addGrace(minmax, grace, beginAtZero) {\n const { min , max } = minmax;\n const change = toDimension(grace, (max - min) / 2);\n const keepZero = (value, add)=>beginAtZero && value === 0 ? 0 : value + add;\n return {\n min: keepZero(min, -Math.abs(change)),\n max: keepZero(max, change)\n };\n}\nfunction createContext(parentContext, context) {\n return Object.assign(Object.create(parentContext), context);\n}\n\n/**\n * Creates a Proxy for resolving raw values for options.\n * @param scopes - The option scopes to look for values, in resolution order\n * @param prefixes - The prefixes for values, in resolution order.\n * @param rootScopes - The root option scopes\n * @param fallback - Parent scopes fallback\n * @param getTarget - callback for getting the target for changed values\n * @returns Proxy\n * @private\n */ function _createResolver(scopes, prefixes = [\n \'\'\n], rootScopes, fallback, getTarget = ()=>scopes[0]) {\n const finalRootScopes = rootScopes || scopes;\n if (typeof fallback === \'undefined\') {\n fallback = _resolve(\'_fallback\', scopes);\n }\n const cache = {\n [Symbol.toStringTag]: \'Object\',\n _cacheable: true,\n _scopes: scopes,\n _rootScopes: finalRootScopes,\n _fallback: fallback,\n _getTarget: getTarget,\n override: (scope)=>_createResolver([\n scope,\n ...scopes\n ], prefixes, finalRootScopes, fallback)\n };\n return new Proxy(cache, {\n /**\n * A trap for the delete operator.\n */ deleteProperty (target, prop) {\n delete target[prop]; // remove from cache\n delete target._keys; // remove cached keys\n delete scopes[0][prop]; // remove from top level scope\n return true;\n },\n /**\n * A trap for getting property values.\n */ get (target, prop) {\n return _cached(target, prop, ()=>_resolveWithPrefixes(prop, prefixes, scopes, target));\n },\n /**\n * A trap for Object.getOwnPropertyDescriptor.\n * Also used by Object.hasOwnProperty.\n */ getOwnPropertyDescriptor (target, prop) {\n return Reflect.getOwnPropertyDescriptor(target._scopes[0], prop);\n },\n /**\n * A trap for Object.getPrototypeOf.\n */ getPrototypeOf () {\n return Reflect.getPrototypeOf(scopes[0]);\n },\n /**\n * A trap for the in operator.\n */ has (target, prop) {\n return getKeysFromAllScopes(target).includes(prop);\n },\n /**\n * A trap for Object.getOwnPropertyNames and Object.getOwnPropertySymbols.\n */ ownKeys (target) {\n return getKeysFromAllScopes(target);\n },\n /**\n * A trap for setting property values.\n */ set (target, prop, value) {\n const storage = target._storage || (target._storage = getTarget());\n target[prop] = storage[prop] = value; // set to top level scope + cache\n delete target._keys; // remove cached keys\n return true;\n }\n });\n}\n/**\n * Returns an Proxy for resolving option values with context.\n * @param proxy - The Proxy returned by `_createResolver`\n * @param context - Context object for scriptable/indexable options\n * @param subProxy - The proxy provided for scriptable options\n * @param descriptorDefaults - Defaults for descriptors\n * @private\n */ function _attachContext(proxy, context, subProxy, descriptorDefaults) {\n const cache = {\n _cacheable: false,\n _proxy: proxy,\n _context: context,\n _subProxy: subProxy,\n _stack: new Set(),\n _descriptors: _descriptors(proxy, descriptorDefaults),\n setContext: (ctx)=>_attachContext(proxy, ctx, subProxy, descriptorDefaults),\n override: (scope)=>_attachContext(proxy.override(scope), context, subProxy, descriptorDefaults)\n };\n return new Proxy(cache, {\n /**\n * A trap for the delete operator.\n */ deleteProperty (target, prop) {\n delete target[prop]; // remove from cache\n delete proxy[prop]; // remove from proxy\n return true;\n },\n /**\n * A trap for getting property values.\n */ get (target, prop, receiver) {\n return _cached(target, prop, ()=>_resolveWithContext(target, prop, receiver));\n },\n /**\n * A trap for Object.getOwnPropertyDescriptor.\n * Also used by Object.hasOwnProperty.\n */ getOwnPropertyDescriptor (target, prop) {\n return target._descriptors.allKeys ? Reflect.has(proxy, prop) ? {\n enumerable: true,\n configurable: true\n } : undefined : Reflect.getOwnPropertyDescriptor(proxy, prop);\n },\n /**\n * A trap for Object.getPrototypeOf.\n */ getPrototypeOf () {\n return Reflect.getPrototypeOf(proxy);\n },\n /**\n * A trap for the in operator.\n */ has (target, prop) {\n return Reflect.has(proxy, prop);\n },\n /**\n * A trap for Object.getOwnPropertyNames and Object.getOwnPropertySymbols.\n */ ownKeys () {\n return Reflect.ownKeys(proxy);\n },\n /**\n * A trap for setting property values.\n */ set (target, prop, value) {\n proxy[prop] = value; // set to proxy\n delete target[prop]; // remove from cache\n return true;\n }\n });\n}\n/**\n * @private\n */ function _descriptors(proxy, defaults = {\n scriptable: true,\n indexable: true\n}) {\n const { _scriptable =defaults.scriptable , _indexable =defaults.indexable , _allKeys =defaults.allKeys } = proxy;\n return {\n allKeys: _allKeys,\n scriptable: _scriptable,\n indexable: _indexable,\n isScriptable: isFunction(_scriptable) ? _scriptable : ()=>_scriptable,\n isIndexable: isFunction(_indexable) ? _indexable : ()=>_indexable\n };\n}\nconst readKey = (prefix, name)=>prefix ? prefix + _capitalize(name) : name;\nconst needsSubResolver = (prop, value)=>isObject(value) && prop !== \'adapters\' && (Object.getPrototypeOf(value) === null || value.constructor === Object);\nfunction _cached(target, prop, resolve) {\n if (Object.prototype.hasOwnProperty.call(target, prop)) {\n return target[prop];\n }\n const value = resolve();\n // cache the resolved value\n target[prop] = value;\n return value;\n}\nfunction _resolveWithContext(target, prop, receiver) {\n const { _proxy , _context , _subProxy , _descriptors: descriptors } = target;\n let value = _proxy[prop]; // resolve from proxy\n // resolve with context\n if (isFunction(value) && descriptors.isScriptable(prop)) {\n value = _resolveScriptable(prop, value, target, receiver);\n }\n if (isArray(value) && value.length) {\n value = _resolveArray(prop, value, target, descriptors.isIndexable);\n }\n if (needsSubResolver(prop, value)) {\n // if the resolved value is an object, create a sub resolver for it\n value = _attachContext(value, _context, _subProxy && _subProxy[prop], descriptors);\n }\n return value;\n}\nfunction _resolveScriptable(prop, getValue, target, receiver) {\n const { _proxy , _context , _subProxy , _stack } = target;\n if (_stack.has(prop)) {\n throw new Error(\'Recursion detected: \' + Array.from(_stack).join(\'->\') + \'->\' + prop);\n }\n _stack.add(prop);\n let value = getValue(_context, _subProxy || receiver);\n _stack.delete(prop);\n if (needsSubResolver(prop, value)) {\n // When scriptable option returns an object, create a resolver on that.\n value = createSubResolver(_proxy._scopes, _proxy, prop, value);\n }\n return value;\n}\nfunction _resolveArray(prop, value, target, isIndexable) {\n const { _proxy , _context , _subProxy , _descriptors: descriptors } = target;\n if (typeof _context.index !== \'undefined\' && isIndexable(prop)) {\n return value[_context.index % value.length];\n } else if (isObject(value[0])) {\n // Array of objects, return array or resolvers\n const arr = value;\n const scopes = _proxy._scopes.filter((s)=>s !== arr);\n value = [];\n for (const item of arr){\n const resolver = createSubResolver(scopes, _proxy, prop, item);\n value.push(_attachContext(resolver, _context, _subProxy && _subProxy[prop], descriptors));\n }\n }\n return value;\n}\nfunction resolveFallback(fallback, prop, value) {\n return isFunction(fallback) ? fallback(prop, value) : fallback;\n}\nconst getScope = (key, parent)=>key === true ? parent : typeof key === \'string\' ? resolveObjectKey(parent, key) : undefined;\nfunction addScopes(set, parentScopes, key, parentFallback, value) {\n for (const parent of parentScopes){\n const scope = getScope(key, parent);\n if (scope) {\n set.add(scope);\n const fallback = resolveFallback(scope._fallback, key, value);\n if (typeof fallback !== \'undefined\' && fallback !== key && fallback !== parentFallback) {\n // When we reach the descriptor that defines a new _fallback, return that.\n // The fallback will resume to that new scope.\n return fallback;\n }\n } else if (scope === false && typeof parentFallback !== \'undefined\' && key !== parentFallback) {\n // Fallback to `false` results to `false`, when falling back to different key.\n // For example `interaction` from `hover` or `plugins.tooltip` and `animation` from `animations`\n return null;\n }\n }\n return false;\n}\nfunction createSubResolver(parentScopes, resolver, prop, value) {\n const rootScopes = resolver._rootScopes;\n const fallback = resolveFallback(resolver._fallback, prop, value);\n const allScopes = [\n ...parentScopes,\n ...rootScopes\n ];\n const set = new Set();\n set.add(value);\n let key = addScopesFromKey(set, allScopes, prop, fallback || prop, value);\n if (key === null) {\n return false;\n }\n if (typeof fallback !== \'undefined\' && fallback !== prop) {\n key = addScopesFromKey(set, allScopes, fallback, key, value);\n if (key === null) {\n return false;\n }\n }\n return _createResolver(Array.from(set), [\n \'\'\n ], rootScopes, fallback, ()=>subGetTarget(resolver, prop, value));\n}\nfunction addScopesFromKey(set, allScopes, key, fallback, item) {\n while(key){\n key = addScopes(set, allScopes, key, fallback, item);\n }\n return key;\n}\nfunction subGetTarget(resolver, prop, value) {\n const parent = resolver._getTarget();\n if (!(prop in parent)) {\n parent[prop] = {};\n }\n const target = parent[prop];\n if (isArray(target) && isObject(value)) {\n // For array of objects, the object is used to store updated values\n return value;\n }\n return target || {};\n}\nfunction _resolveWithPrefixes(prop, prefixes, scopes, proxy) {\n let value;\n for (const prefix of prefixes){\n value = _resolve(readKey(prefix, prop), scopes);\n if (typeof value !== \'undefined\') {\n return needsSubResolver(prop, value) ? createSubResolver(scopes, proxy, prop, value) : value;\n }\n }\n}\nfunction _resolve(key, scopes) {\n for (const scope of scopes){\n if (!scope) {\n continue;\n }\n const value = scope[key];\n if (typeof value !== \'undefined\') {\n return value;\n }\n }\n}\nfunction getKeysFromAllScopes(target) {\n let keys = target._keys;\n if (!keys) {\n keys = target._keys = resolveKeysFromAllScopes(target._scopes);\n }\n return keys;\n}\nfunction resolveKeysFromAllScopes(scopes) {\n const set = new Set();\n for (const scope of scopes){\n for (const key of Object.keys(scope).filter((k)=>!k.startsWith(\'_\'))){\n set.add(key);\n }\n }\n return Array.from(set);\n}\nfunction _parseObjectDataRadialScale(meta, data, start, count) {\n const { iScale } = meta;\n const { key =\'r\' } = this._parsing;\n const parsed = new Array(count);\n let i, ilen, index, item;\n for(i = 0, ilen = count; i < ilen; ++i){\n index = i + start;\n item = data[index];\n parsed[i] = {\n r: iScale.parse(resolveObjectKey(item, key), index)\n };\n }\n return parsed;\n}\n\nconst EPSILON = Number.EPSILON || 1e-14;\nconst getPoint = (points, i)=>i < points.length && !points[i].skip && points[i];\nconst getValueAxis = (indexAxis)=>indexAxis === \'x\' ? \'y\' : \'x\';\nfunction splineCurve(firstPoint, middlePoint, afterPoint, t) {\n // Props to Rob Spencer at scaled innovation for his post on splining between points\n // http://scaledinnovation.com/analytics/splines/aboutSplines.html\n // This function must also respect "skipped" points\n const previous = firstPoint.skip ? middlePoint : firstPoint;\n const current = middlePoint;\n const next = afterPoint.skip ? middlePoint : afterPoint;\n const d01 = distanceBetweenPoints(current, previous);\n const d12 = distanceBetweenPoints(next, current);\n let s01 = d01 / (d01 + d12);\n let s12 = d12 / (d01 + d12);\n // If all points are the same, s01 & s02 will be inf\n s01 = isNaN(s01) ? 0 : s01;\n s12 = isNaN(s12) ? 0 : s12;\n const fa = t * s01; // scaling factor for triangle Ta\n const fb = t * s12;\n return {\n previous: {\n x: current.x - fa * (next.x - previous.x),\n y: current.y - fa * (next.y - previous.y)\n },\n next: {\n x: current.x + fb * (next.x - previous.x),\n y: current.y + fb * (next.y - previous.y)\n }\n };\n}\n/**\n * Adjust tangents to ensure monotonic properties\n */ function monotoneAdjust(points, deltaK, mK) {\n const pointsLen = points.length;\n let alphaK, betaK, tauK, squaredMagnitude, pointCurrent;\n let pointAfter = getPoint(points, 0);\n for(let i = 0; i < pointsLen - 1; ++i){\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent || !pointAfter) {\n continue;\n }\n if (almostEquals(deltaK[i], 0, EPSILON)) {\n mK[i] = mK[i + 1] = 0;\n continue;\n }\n alphaK = mK[i] / deltaK[i];\n betaK = mK[i + 1] / deltaK[i];\n squaredMagnitude = Math.pow(alphaK, 2) + Math.pow(betaK, 2);\n if (squaredMagnitude <= 9) {\n continue;\n }\n tauK = 3 / Math.sqrt(squaredMagnitude);\n mK[i] = alphaK * tauK * deltaK[i];\n mK[i + 1] = betaK * tauK * deltaK[i];\n }\n}\nfunction monotoneCompute(points, mK, indexAxis = \'x\') {\n const valueAxis = getValueAxis(indexAxis);\n const pointsLen = points.length;\n let delta, pointBefore, pointCurrent;\n let pointAfter = getPoint(points, 0);\n for(let i = 0; i < pointsLen; ++i){\n pointBefore = pointCurrent;\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent) {\n continue;\n }\n const iPixel = pointCurrent[indexAxis];\n const vPixel = pointCurrent[valueAxis];\n if (pointBefore) {\n delta = (iPixel - pointBefore[indexAxis]) / 3;\n pointCurrent[`cp1${indexAxis}`] = iPixel - delta;\n pointCurrent[`cp1${valueAxis}`] = vPixel - delta * mK[i];\n }\n if (pointAfter) {\n delta = (pointAfter[indexAxis] - iPixel) / 3;\n pointCurrent[`cp2${indexAxis}`] = iPixel + delta;\n pointCurrent[`cp2${valueAxis}`] = vPixel + delta * mK[i];\n }\n }\n}\n/**\n * This function calculates Bézier control points in a similar way than |splineCurve|,\n * but preserves monotonicity of the provided data and ensures no local extremums are added\n * between the dataset discrete points due to the interpolation.\n * See : https://en.wikipedia.org/wiki/Monotone_cubic_interpolation\n */ function splineCurveMonotone(points, indexAxis = \'x\') {\n const valueAxis = getValueAxis(indexAxis);\n const pointsLen = points.length;\n const deltaK = Array(pointsLen).fill(0);\n const mK = Array(pointsLen);\n // Calculate slopes (deltaK) and initialize tangents (mK)\n let i, pointBefore, pointCurrent;\n let pointAfter = getPoint(points, 0);\n for(i = 0; i < pointsLen; ++i){\n pointBefore = pointCurrent;\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent) {\n continue;\n }\n if (pointAfter) {\n const slopeDelta = pointAfter[indexAxis] - pointCurrent[indexAxis];\n // In the case of two points that appear at the same x pixel, slopeDeltaX is 0\n deltaK[i] = slopeDelta !== 0 ? (pointAfter[valueAxis] - pointCurrent[valueAxis]) / slopeDelta : 0;\n }\n mK[i] = !pointBefore ? deltaK[i] : !pointAfter ? deltaK[i - 1] : sign(deltaK[i - 1]) !== sign(deltaK[i]) ? 0 : (deltaK[i - 1] + deltaK[i]) / 2;\n }\n monotoneAdjust(points, deltaK, mK);\n monotoneCompute(points, mK, indexAxis);\n}\nfunction capControlPoint(pt, min, max) {\n return Math.max(Math.min(pt, max), min);\n}\nfunction capBezierPoints(points, area) {\n let i, ilen, point, inArea, inAreaPrev;\n let inAreaNext = _isPointInArea(points[0], area);\n for(i = 0, ilen = points.length; i < ilen; ++i){\n inAreaPrev = inArea;\n inArea = inAreaNext;\n inAreaNext = i < ilen - 1 && _isPointInArea(points[i + 1], area);\n if (!inArea) {\n continue;\n }\n point = points[i];\n if (inAreaPrev) {\n point.cp1x = capControlPoint(point.cp1x, area.left, area.right);\n point.cp1y = capControlPoint(point.cp1y, area.top, area.bottom);\n }\n if (inAreaNext) {\n point.cp2x = capControlPoint(point.cp2x, area.left, area.right);\n point.cp2y = capControlPoint(point.cp2y, area.top, area.bottom);\n }\n }\n}\n/**\n * @private\n */ function _updateBezierControlPoints(points, options, area, loop, indexAxis) {\n let i, ilen, point, controlPoints;\n // Only consider points that are drawn in case the spanGaps option is used\n if (options.spanGaps) {\n points = points.filter((pt)=>!pt.skip);\n }\n if (options.cubicInterpolationMode === \'monotone\') {\n splineCurveMonotone(points, indexAxis);\n } else {\n let prev = loop ? points[points.length - 1] : points[0];\n for(i = 0, ilen = points.length; i < ilen; ++i){\n point = points[i];\n controlPoints = splineCurve(prev, point, points[Math.min(i + 1, ilen - (loop ? 0 : 1)) % ilen], options.tension);\n point.cp1x = controlPoints.previous.x;\n point.cp1y = controlPoints.previous.y;\n point.cp2x = controlPoints.next.x;\n point.cp2y = controlPoints.next.y;\n prev = point;\n }\n }\n if (options.capBezierPoints) {\n capBezierPoints(points, area);\n }\n}\n\n/**\n * Note: typedefs are auto-exported, so use a made-up `dom` namespace where\n * necessary to avoid duplicates with `export * from \'./helpers`; see\n * https://github.com/microsoft/TypeScript/issues/46011\n * @typedef { import(\'../core/core.controller.js\').default } dom.Chart\n * @typedef { import(\'../../types\').ChartEvent } ChartEvent\n */ /**\n * @private\n */ function _isDomSupported() {\n return typeof window !== \'undefined\' && typeof document !== \'undefined\';\n}\n/**\n * @private\n */ function _getParentNode(domNode) {\n let parent = domNode.parentNode;\n if (parent && parent.toString() === \'[object ShadowRoot]\') {\n parent = parent.host;\n }\n return parent;\n}\n/**\n * convert max-width/max-height values that may be percentages into a number\n * @private\n */ function parseMaxStyle(styleValue, node, parentProperty) {\n let valueInPixels;\n if (typeof styleValue === \'string\') {\n valueInPixels = parseInt(styleValue, 10);\n if (styleValue.indexOf(\'%\') !== -1) {\n // percentage * size in dimension\n valueInPixels = valueInPixels / 100 * node.parentNode[parentProperty];\n }\n } else {\n valueInPixels = styleValue;\n }\n return valueInPixels;\n}\nconst helpers_segment_getComputedStyle = (element)=>element.ownerDocument.defaultView.getComputedStyle(element, null);\nfunction getStyle(el, property) {\n return helpers_segment_getComputedStyle(el).getPropertyValue(property);\n}\nconst positions = [\n \'top\',\n \'right\',\n \'bottom\',\n \'left\'\n];\nfunction getPositionedStyle(styles, style, suffix) {\n const result = {};\n suffix = suffix ? \'-\' + suffix : \'\';\n for(let i = 0; i < 4; i++){\n const pos = positions[i];\n result[pos] = parseFloat(styles[style + \'-\' + pos + suffix]) || 0;\n }\n result.width = result.left + result.right;\n result.height = result.top + result.bottom;\n return result;\n}\nconst useOffsetPos = (x, y, target)=>(x > 0 || y > 0) && (!target || !target.shadowRoot);\n/**\n * @param e\n * @param canvas\n * @returns Canvas position\n */ function getCanvasPosition(e, canvas) {\n const touches = e.touches;\n const source = touches && touches.length ? touches[0] : e;\n const { offsetX , offsetY } = source;\n let box = false;\n let x, y;\n if (useOffsetPos(offsetX, offsetY, e.target)) {\n x = offsetX;\n y = offsetY;\n } else {\n const rect = canvas.getBoundingClientRect();\n x = source.clientX - rect.left;\n y = source.clientY - rect.top;\n box = true;\n }\n return {\n x,\n y,\n box\n };\n}\n/**\n * Gets an event\'s x, y coordinates, relative to the chart area\n * @param event\n * @param chart\n * @returns x and y coordinates of the event\n */ function getRelativePosition(event, chart) {\n if (\'native\' in event) {\n return event;\n }\n const { canvas , currentDevicePixelRatio } = chart;\n const style = helpers_segment_getComputedStyle(canvas);\n const borderBox = style.boxSizing === \'border-box\';\n const paddings = getPositionedStyle(style, \'padding\');\n const borders = getPositionedStyle(style, \'border\', \'width\');\n const { x , y , box } = getCanvasPosition(event, canvas);\n const xOffset = paddings.left + (box && borders.left);\n const yOffset = paddings.top + (box && borders.top);\n let { width , height } = chart;\n if (borderBox) {\n width -= paddings.width + borders.width;\n height -= paddings.height + borders.height;\n }\n return {\n x: Math.round((x - xOffset) / width * canvas.width / currentDevicePixelRatio),\n y: Math.round((y - yOffset) / height * canvas.height / currentDevicePixelRatio)\n };\n}\nfunction getContainerSize(canvas, width, height) {\n let maxWidth, maxHeight;\n if (width === undefined || height === undefined) {\n const container = _getParentNode(canvas);\n if (!container) {\n width = canvas.clientWidth;\n height = canvas.clientHeight;\n } else {\n const rect = container.getBoundingClientRect(); // this is the border box of the container\n const containerStyle = helpers_segment_getComputedStyle(container);\n const containerBorder = getPositionedStyle(containerStyle, \'border\', \'width\');\n const containerPadding = getPositionedStyle(containerStyle, \'padding\');\n width = rect.width - containerPadding.width - containerBorder.width;\n height = rect.height - containerPadding.height - containerBorder.height;\n maxWidth = parseMaxStyle(containerStyle.maxWidth, container, \'clientWidth\');\n maxHeight = parseMaxStyle(containerStyle.maxHeight, container, \'clientHeight\');\n }\n }\n return {\n width,\n height,\n maxWidth: maxWidth || INFINITY,\n maxHeight: maxHeight || INFINITY\n };\n}\nconst round1 = (v)=>Math.round(v * 10) / 10;\n// eslint-disable-next-line complexity\nfunction getMaximumSize(canvas, bbWidth, bbHeight, aspectRatio) {\n const style = helpers_segment_getComputedStyle(canvas);\n const margins = getPositionedStyle(style, \'margin\');\n const maxWidth = parseMaxStyle(style.maxWidth, canvas, \'clientWidth\') || INFINITY;\n const maxHeight = parseMaxStyle(style.maxHeight, canvas, \'clientHeight\') || INFINITY;\n const containerSize = getContainerSize(canvas, bbWidth, bbHeight);\n let { width , height } = containerSize;\n if (style.boxSizing === \'content-box\') {\n const borders = getPositionedStyle(style, \'border\', \'width\');\n const paddings = getPositionedStyle(style, \'padding\');\n width -= paddings.width + borders.width;\n height -= paddings.height + borders.height;\n }\n width = Math.max(0, width - margins.width);\n height = Math.max(0, aspectRatio ? width / aspectRatio : height - margins.height);\n width = round1(Math.min(width, maxWidth, containerSize.maxWidth));\n height = round1(Math.min(height, maxHeight, containerSize.maxHeight));\n if (width && !height) {\n // https://github.com/chartjs/Chart.js/issues/4659\n // If the canvas has width, but no height, default to aspectRatio of 2 (canvas default)\n height = round1(width / 2);\n }\n const maintainHeight = bbWidth !== undefined || bbHeight !== undefined;\n if (maintainHeight && aspectRatio && containerSize.height && height > containerSize.height) {\n height = containerSize.height;\n width = round1(Math.floor(height * aspectRatio));\n }\n return {\n width,\n height\n };\n}\n/**\n * @param chart\n * @param forceRatio\n * @param forceStyle\n * @returns True if the canvas context size or transformation has changed.\n */ function retinaScale(chart, forceRatio, forceStyle) {\n const pixelRatio = forceRatio || 1;\n const deviceHeight = Math.floor(chart.height * pixelRatio);\n const deviceWidth = Math.floor(chart.width * pixelRatio);\n chart.height = Math.floor(chart.height);\n chart.width = Math.floor(chart.width);\n const canvas = chart.canvas;\n // If no style has been set on the canvas, the render size is used as display size,\n // making the chart visually bigger, so let\'s enforce it to the "correct" values.\n // See https://github.com/chartjs/Chart.js/issues/3575\n if (canvas.style && (forceStyle || !canvas.style.height && !canvas.style.width)) {\n canvas.style.height = `${chart.height}px`;\n canvas.style.width = `${chart.width}px`;\n }\n if (chart.currentDevicePixelRatio !== pixelRatio || canvas.height !== deviceHeight || canvas.width !== deviceWidth) {\n chart.currentDevicePixelRatio = pixelRatio;\n canvas.height = deviceHeight;\n canvas.width = deviceWidth;\n chart.ctx.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0);\n return true;\n }\n return false;\n}\n/**\n * Detects support for options object argument in addEventListener.\n * https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support\n * @private\n */ const supportsEventListenerOptions = function() {\n let passiveSupported = false;\n try {\n const options = {\n get passive () {\n passiveSupported = true;\n return false;\n }\n };\n window.addEventListener(\'test\', null, options);\n window.removeEventListener(\'test\', null, options);\n } catch (e) {\n // continue regardless of error\n }\n return passiveSupported;\n}();\n/**\n * The "used" size is the final value of a dimension property after all calculations have\n * been performed. This method uses the computed style of `element` but returns undefined\n * if the computed style is not expressed in pixels. That can happen in some cases where\n * `element` has a size relative to its parent and this last one is not yet displayed,\n * for example because of `display: none` on a parent node.\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/used_value\n * @returns Size in pixels or undefined if unknown.\n */ function readUsedSize(element, property) {\n const value = getStyle(element, property);\n const matches = value && value.match(/^(\\d+)(\\.\\d+)?px$/);\n return matches ? +matches[1] : undefined;\n}\n\n/**\n * @private\n */ function _pointInLine(p1, p2, t, mode) {\n return {\n x: p1.x + t * (p2.x - p1.x),\n y: p1.y + t * (p2.y - p1.y)\n };\n}\n/**\n * @private\n */ function _steppedInterpolation(p1, p2, t, mode) {\n return {\n x: p1.x + t * (p2.x - p1.x),\n y: mode === \'middle\' ? t < 0.5 ? p1.y : p2.y : mode === \'after\' ? t < 1 ? p1.y : p2.y : t > 0 ? p2.y : p1.y\n };\n}\n/**\n * @private\n */ function _bezierInterpolation(p1, p2, t, mode) {\n const cp1 = {\n x: p1.cp2x,\n y: p1.cp2y\n };\n const cp2 = {\n x: p2.cp1x,\n y: p2.cp1y\n };\n const a = _pointInLine(p1, cp1, t);\n const b = _pointInLine(cp1, cp2, t);\n const c = _pointInLine(cp2, p2, t);\n const d = _pointInLine(a, b, t);\n const e = _pointInLine(b, c, t);\n return _pointInLine(d, e, t);\n}\n\nconst getRightToLeftAdapter = function(rectX, width) {\n return {\n x (x) {\n return rectX + rectX + width - x;\n },\n setWidth (w) {\n width = w;\n },\n textAlign (align) {\n if (align === \'center\') {\n return align;\n }\n return align === \'right\' ? \'left\' : \'right\';\n },\n xPlus (x, value) {\n return x - value;\n },\n leftForLtr (x, itemWidth) {\n return x - itemWidth;\n }\n };\n};\nconst getLeftToRightAdapter = function() {\n return {\n x (x) {\n return x;\n },\n setWidth (w) {},\n textAlign (align) {\n return align;\n },\n xPlus (x, value) {\n return x + value;\n },\n leftForLtr (x, _itemWidth) {\n return x;\n }\n };\n};\nfunction getRtlAdapter(rtl, rectX, width) {\n return rtl ? getRightToLeftAdapter(rectX, width) : getLeftToRightAdapter();\n}\nfunction overrideTextDirection(ctx, direction) {\n let style, original;\n if (direction === \'ltr\' || direction === \'rtl\') {\n style = ctx.canvas.style;\n original = [\n style.getPropertyValue(\'direction\'),\n style.getPropertyPriority(\'direction\')\n ];\n style.setProperty(\'direction\', direction, \'important\');\n ctx.prevTextDirection = original;\n }\n}\nfunction restoreTextDirection(ctx, original) {\n if (original !== undefined) {\n delete ctx.prevTextDirection;\n ctx.canvas.style.setProperty(\'direction\', original[0], original[1]);\n }\n}\n\nfunction propertyFn(property) {\n if (property === \'angle\') {\n return {\n between: _angleBetween,\n compare: _angleDiff,\n normalize: _normalizeAngle\n };\n }\n return {\n between: _isBetween,\n compare: (a, b)=>a - b,\n normalize: (x)=>x\n };\n}\nfunction normalizeSegment({ start , end , count , loop , style }) {\n return {\n start: start % count,\n end: end % count,\n loop: loop && (end - start + 1) % count === 0,\n style\n };\n}\nfunction getSegment(segment, points, bounds) {\n const { property , start: startBound , end: endBound } = bounds;\n const { between , normalize } = propertyFn(property);\n const count = points.length;\n let { start , end , loop } = segment;\n let i, ilen;\n if (loop) {\n start += count;\n end += count;\n for(i = 0, ilen = count; i < ilen; ++i){\n if (!between(normalize(points[start % count][property]), startBound, endBound)) {\n break;\n }\n start--;\n end--;\n }\n start %= count;\n end %= count;\n }\n if (end < start) {\n end += count;\n }\n return {\n start,\n end,\n loop,\n style: segment.style\n };\n}\n function _boundSegment(segment, points, bounds) {\n if (!bounds) {\n return [\n segment\n ];\n }\n const { property , start: startBound , end: endBound } = bounds;\n const count = points.length;\n const { compare , between , normalize } = propertyFn(property);\n const { start , end , loop , style } = getSegment(segment, points, bounds);\n const result = [];\n let inside = false;\n let subStart = null;\n let value, point, prevValue;\n const startIsBefore = ()=>between(startBound, prevValue, value) && compare(startBound, prevValue) !== 0;\n const endIsBefore = ()=>compare(endBound, value) === 0 || between(endBound, prevValue, value);\n const shouldStart = ()=>inside || startIsBefore();\n const shouldStop = ()=>!inside || endIsBefore();\n for(let i = start, prev = start; i <= end; ++i){\n point = points[i % count];\n if (point.skip) {\n continue;\n }\n value = normalize(point[property]);\n if (value === prevValue) {\n continue;\n }\n inside = between(value, startBound, endBound);\n if (subStart === null && shouldStart()) {\n subStart = compare(value, startBound) === 0 ? i : prev;\n }\n if (subStart !== null && shouldStop()) {\n result.push(normalizeSegment({\n start: subStart,\n end: i,\n loop,\n count,\n style\n }));\n subStart = null;\n }\n prev = i;\n prevValue = value;\n }\n if (subStart !== null) {\n result.push(normalizeSegment({\n start: subStart,\n end,\n loop,\n count,\n style\n }));\n }\n return result;\n}\n function _boundSegments(line, bounds) {\n const result = [];\n const segments = line.segments;\n for(let i = 0; i < segments.length; i++){\n const sub = _boundSegment(segments[i], line.points, bounds);\n if (sub.length) {\n result.push(...sub);\n }\n }\n return result;\n}\n function findStartAndEnd(points, count, loop, spanGaps) {\n let start = 0;\n let end = count - 1;\n if (loop && !spanGaps) {\n while(start < count && !points[start].skip){\n start++;\n }\n }\n while(start < count && points[start].skip){\n start++;\n }\n start %= count;\n if (loop) {\n end += start;\n }\n while(end > start && points[end % count].skip){\n end--;\n }\n end %= count;\n return {\n start,\n end\n };\n}\n function solidSegments(points, start, max, loop) {\n const count = points.length;\n const result = [];\n let last = start;\n let prev = points[start];\n let end;\n for(end = start + 1; end <= max; ++end){\n const cur = points[end % count];\n if (cur.skip || cur.stop) {\n if (!prev.skip) {\n loop = false;\n result.push({\n start: start % count,\n end: (end - 1) % count,\n loop\n });\n start = last = cur.stop ? end : null;\n }\n } else {\n last = end;\n if (prev.skip) {\n start = end;\n }\n }\n prev = cur;\n }\n if (last !== null) {\n result.push({\n start: start % count,\n end: last % count,\n loop\n });\n }\n return result;\n}\n function _computeSegments(line, segmentOptions) {\n const points = line.points;\n const spanGaps = line.options.spanGaps;\n const count = points.length;\n if (!count) {\n return [];\n }\n const loop = !!line._loop;\n const { start , end } = findStartAndEnd(points, count, loop, spanGaps);\n if (spanGaps === true) {\n return splitByStyles(line, [\n {\n start,\n end,\n loop\n }\n ], points, segmentOptions);\n }\n const max = end < start ? end + count : end;\n const completeLoop = !!line._fullLoop && start === 0 && end === count - 1;\n return splitByStyles(line, solidSegments(points, start, max, completeLoop), points, segmentOptions);\n}\n function splitByStyles(line, segments, points, segmentOptions) {\n if (!segmentOptions || !segmentOptions.setContext || !points) {\n return segments;\n }\n return doSplitByStyles(line, segments, points, segmentOptions);\n}\n function doSplitByStyles(line, segments, points, segmentOptions) {\n const chartContext = line._chart.getContext();\n const baseStyle = readStyle(line.options);\n const { _datasetIndex: datasetIndex , options: { spanGaps } } = line;\n const count = points.length;\n const result = [];\n let prevStyle = baseStyle;\n let start = segments[0].start;\n let i = start;\n function addStyle(s, e, l, st) {\n const dir = spanGaps ? -1 : 1;\n if (s === e) {\n return;\n }\n s += count;\n while(points[s % count].skip){\n s -= dir;\n }\n while(points[e % count].skip){\n e += dir;\n }\n if (s % count !== e % count) {\n result.push({\n start: s % count,\n end: e % count,\n loop: l,\n style: st\n });\n prevStyle = st;\n start = e % count;\n }\n }\n for (const segment of segments){\n start = spanGaps ? start : segment.start;\n let prev = points[start % count];\n let style;\n for(i = start + 1; i <= segment.end; i++){\n const pt = points[i % count];\n style = readStyle(segmentOptions.setContext(createContext(chartContext, {\n type: \'segment\',\n p0: prev,\n p1: pt,\n p0DataIndex: (i - 1) % count,\n p1DataIndex: i % count,\n datasetIndex\n })));\n if (styleChanged(style, prevStyle)) {\n addStyle(start, i - 1, segment.loop, prevStyle);\n }\n prev = pt;\n prevStyle = style;\n }\n if (start < i - 1) {\n addStyle(start, i - 1, segment.loop, prevStyle);\n }\n }\n return result;\n}\nfunction readStyle(options) {\n return {\n backgroundColor: options.backgroundColor,\n borderCapStyle: options.borderCapStyle,\n borderDash: options.borderDash,\n borderDashOffset: options.borderDashOffset,\n borderJoinStyle: options.borderJoinStyle,\n borderWidth: options.borderWidth,\n borderColor: options.borderColor\n };\n}\nfunction styleChanged(style, prevStyle) {\n if (!prevStyle) {\n return false;\n }\n const cache = [];\n const replacer = function(key, value) {\n if (!isPatternOrGradient(value)) {\n return value;\n }\n if (!cache.includes(value)) {\n cache.push(value);\n }\n return cache.indexOf(value);\n };\n return JSON.stringify(style, replacer) !== JSON.stringify(prevStyle, replacer);\n}\n\n\n//# sourceMappingURL=helpers.segment.js.map\n\n;// CONCATENATED MODULE: ../node_modules/chart.js/dist/chart.js\n/*!\n * Chart.js v4.4.0\n * https://www.chartjs.org\n * (c) 2023 Chart.js Contributors\n * Released under the MIT License\n */\n\n\n\nclass Animator {\n constructor(){\n this._request = null;\n this._charts = new Map();\n this._running = false;\n this._lastDate = undefined;\n }\n _notify(chart, anims, date, type) {\n const callbacks = anims.listeners[type];\n const numSteps = anims.duration;\n callbacks.forEach((fn)=>fn({\n chart,\n initial: anims.initial,\n numSteps,\n currentStep: Math.min(date - anims.start, numSteps)\n }));\n }\n _refresh() {\n if (this._request) {\n return;\n }\n this._running = true;\n this._request = requestAnimFrame.call(window, ()=>{\n this._update();\n this._request = null;\n if (this._running) {\n this._refresh();\n }\n });\n }\n _update(date = Date.now()) {\n let remaining = 0;\n this._charts.forEach((anims, chart)=>{\n if (!anims.running || !anims.items.length) {\n return;\n }\n const items = anims.items;\n let i = items.length - 1;\n let draw = false;\n let item;\n for(; i >= 0; --i){\n item = items[i];\n if (item._active) {\n if (item._total > anims.duration) {\n anims.duration = item._total;\n }\n item.tick(date);\n draw = true;\n } else {\n items[i] = items[items.length - 1];\n items.pop();\n }\n }\n if (draw) {\n chart.draw();\n this._notify(chart, anims, date, \'progress\');\n }\n if (!items.length) {\n anims.running = false;\n this._notify(chart, anims, date, \'complete\');\n anims.initial = false;\n }\n remaining += items.length;\n });\n this._lastDate = date;\n if (remaining === 0) {\n this._running = false;\n }\n }\n _getAnims(chart) {\n const charts = this._charts;\n let anims = charts.get(chart);\n if (!anims) {\n anims = {\n running: false,\n initial: true,\n items: [],\n listeners: {\n complete: [],\n progress: []\n }\n };\n charts.set(chart, anims);\n }\n return anims;\n }\n listen(chart, event, cb) {\n this._getAnims(chart).listeners[event].push(cb);\n }\n add(chart, items) {\n if (!items || !items.length) {\n return;\n }\n this._getAnims(chart).items.push(...items);\n }\n has(chart) {\n return this._getAnims(chart).items.length > 0;\n }\n start(chart) {\n const anims = this._charts.get(chart);\n if (!anims) {\n return;\n }\n anims.running = true;\n anims.start = Date.now();\n anims.duration = anims.items.reduce((acc, cur)=>Math.max(acc, cur._duration), 0);\n this._refresh();\n }\n running(chart) {\n if (!this._running) {\n return false;\n }\n const anims = this._charts.get(chart);\n if (!anims || !anims.running || !anims.items.length) {\n return false;\n }\n return true;\n }\n stop(chart) {\n const anims = this._charts.get(chart);\n if (!anims || !anims.items.length) {\n return;\n }\n const items = anims.items;\n let i = items.length - 1;\n for(; i >= 0; --i){\n items[i].cancel();\n }\n anims.items = [];\n this._notify(chart, anims, Date.now(), \'complete\');\n }\n remove(chart) {\n return this._charts.delete(chart);\n }\n}\nvar animator = /* #__PURE__ */ new Animator();\n\nconst transparent = \'transparent\';\nconst interpolators = {\n boolean (from, to, factor) {\n return factor > 0.5 ? to : from;\n },\n color (from, to, factor) {\n const c0 = helpers_segment_color(from || transparent);\n const c1 = c0.valid && helpers_segment_color(to || transparent);\n return c1 && c1.valid ? c1.mix(c0, factor).hexString() : to;\n },\n number (from, to, factor) {\n return from + (to - from) * factor;\n }\n};\nclass Animation {\n constructor(cfg, target, prop, to){\n const currentValue = target[prop];\n to = resolve([\n cfg.to,\n to,\n currentValue,\n cfg.from\n ]);\n const from = resolve([\n cfg.from,\n currentValue,\n to\n ]);\n this._active = true;\n this._fn = cfg.fn || interpolators[cfg.type || typeof from];\n this._easing = effects[cfg.easing] || effects.linear;\n this._start = Math.floor(Date.now() + (cfg.delay || 0));\n this._duration = this._total = Math.floor(cfg.duration);\n this._loop = !!cfg.loop;\n this._target = target;\n this._prop = prop;\n this._from = from;\n this._to = to;\n this._promises = undefined;\n }\n active() {\n return this._active;\n }\n update(cfg, to, date) {\n if (this._active) {\n this._notify(false);\n const currentValue = this._target[this._prop];\n const elapsed = date - this._start;\n const remain = this._duration - elapsed;\n this._start = date;\n this._duration = Math.floor(Math.max(remain, cfg.duration));\n this._total += elapsed;\n this._loop = !!cfg.loop;\n this._to = resolve([\n cfg.to,\n to,\n currentValue,\n cfg.from\n ]);\n this._from = resolve([\n cfg.from,\n currentValue,\n to\n ]);\n }\n }\n cancel() {\n if (this._active) {\n this.tick(Date.now());\n this._active = false;\n this._notify(false);\n }\n }\n tick(date) {\n const elapsed = date - this._start;\n const duration = this._duration;\n const prop = this._prop;\n const from = this._from;\n const loop = this._loop;\n const to = this._to;\n let factor;\n this._active = from !== to && (loop || elapsed < duration);\n if (!this._active) {\n this._target[prop] = to;\n this._notify(true);\n return;\n }\n if (elapsed < 0) {\n this._target[prop] = from;\n return;\n }\n factor = elapsed / duration % 2;\n factor = loop && factor > 1 ? 2 - factor : factor;\n factor = this._easing(Math.min(1, Math.max(0, factor)));\n this._target[prop] = this._fn(from, to, factor);\n }\n wait() {\n const promises = this._promises || (this._promises = []);\n return new Promise((res, rej)=>{\n promises.push({\n res,\n rej\n });\n });\n }\n _notify(resolved) {\n const method = resolved ? \'res\' : \'rej\';\n const promises = this._promises || [];\n for(let i = 0; i < promises.length; i++){\n promises[i][method]();\n }\n }\n}\n\nclass Animations {\n constructor(chart, config){\n this._chart = chart;\n this._properties = new Map();\n this.configure(config);\n }\n configure(config) {\n if (!isObject(config)) {\n return;\n }\n const animationOptions = Object.keys(defaults.animation);\n const animatedProps = this._properties;\n Object.getOwnPropertyNames(config).forEach((key)=>{\n const cfg = config[key];\n if (!isObject(cfg)) {\n return;\n }\n const resolved = {};\n for (const option of animationOptions){\n resolved[option] = cfg[option];\n }\n (isArray(cfg.properties) && cfg.properties || [\n key\n ]).forEach((prop)=>{\n if (prop === key || !animatedProps.has(prop)) {\n animatedProps.set(prop, resolved);\n }\n });\n });\n }\n _animateOptions(target, values) {\n const newOptions = values.options;\n const options = resolveTargetOptions(target, newOptions);\n if (!options) {\n return [];\n }\n const animations = this._createAnimations(options, newOptions);\n if (newOptions.$shared) {\n awaitAll(target.options.$animations, newOptions).then(()=>{\n target.options = newOptions;\n }, ()=>{\n });\n }\n return animations;\n }\n _createAnimations(target, values) {\n const animatedProps = this._properties;\n const animations = [];\n const running = target.$animations || (target.$animations = {});\n const props = Object.keys(values);\n const date = Date.now();\n let i;\n for(i = props.length - 1; i >= 0; --i){\n const prop = props[i];\n if (prop.charAt(0) === \'$\') {\n continue;\n }\n if (prop === \'options\') {\n animations.push(...this._animateOptions(target, values));\n continue;\n }\n const value = values[prop];\n let animation = running[prop];\n const cfg = animatedProps.get(prop);\n if (animation) {\n if (cfg && animation.active()) {\n animation.update(cfg, value, date);\n continue;\n } else {\n animation.cancel();\n }\n }\n if (!cfg || !cfg.duration) {\n target[prop] = value;\n continue;\n }\n running[prop] = animation = new Animation(cfg, target, prop, value);\n animations.push(animation);\n }\n return animations;\n }\n update(target, values) {\n if (this._properties.size === 0) {\n Object.assign(target, values);\n return;\n }\n const animations = this._createAnimations(target, values);\n if (animations.length) {\n animator.add(this._chart, animations);\n return true;\n }\n }\n}\nfunction awaitAll(animations, properties) {\n const running = [];\n const keys = Object.keys(properties);\n for(let i = 0; i < keys.length; i++){\n const anim = animations[keys[i]];\n if (anim && anim.active()) {\n running.push(anim.wait());\n }\n }\n return Promise.all(running);\n}\nfunction resolveTargetOptions(target, newOptions) {\n if (!newOptions) {\n return;\n }\n let options = target.options;\n if (!options) {\n target.options = newOptions;\n return;\n }\n if (options.$shared) {\n target.options = options = Object.assign({}, options, {\n $shared: false,\n $animations: {}\n });\n }\n return options;\n}\n\nfunction scaleClip(scale, allowedOverflow) {\n const opts = scale && scale.options || {};\n const reverse = opts.reverse;\n const min = opts.min === undefined ? allowedOverflow : 0;\n const max = opts.max === undefined ? allowedOverflow : 0;\n return {\n start: reverse ? max : min,\n end: reverse ? min : max\n };\n}\nfunction defaultClip(xScale, yScale, allowedOverflow) {\n if (allowedOverflow === false) {\n return false;\n }\n const x = scaleClip(xScale, allowedOverflow);\n const y = scaleClip(yScale, allowedOverflow);\n return {\n top: y.end,\n right: x.end,\n bottom: y.start,\n left: x.start\n };\n}\nfunction toClip(value) {\n let t, r, b, l;\n if (isObject(value)) {\n t = value.top;\n r = value.right;\n b = value.bottom;\n l = value.left;\n } else {\n t = r = b = l = value;\n }\n return {\n top: t,\n right: r,\n bottom: b,\n left: l,\n disabled: value === false\n };\n}\nfunction getSortedDatasetIndices(chart, filterVisible) {\n const keys = [];\n const metasets = chart._getSortedDatasetMetas(filterVisible);\n let i, ilen;\n for(i = 0, ilen = metasets.length; i < ilen; ++i){\n keys.push(metasets[i].index);\n }\n return keys;\n}\nfunction applyStack(stack, value, dsIndex, options = {}) {\n const keys = stack.keys;\n const singleMode = options.mode === \'single\';\n let i, ilen, datasetIndex, otherValue;\n if (value === null) {\n return;\n }\n for(i = 0, ilen = keys.length; i < ilen; ++i){\n datasetIndex = +keys[i];\n if (datasetIndex === dsIndex) {\n if (options.all) {\n continue;\n }\n break;\n }\n otherValue = stack.values[datasetIndex];\n if (isNumberFinite(otherValue) && (singleMode || value === 0 || sign(value) === sign(otherValue))) {\n value += otherValue;\n }\n }\n return value;\n}\nfunction convertObjectDataToArray(data) {\n const keys = Object.keys(data);\n const adata = new Array(keys.length);\n let i, ilen, key;\n for(i = 0, ilen = keys.length; i < ilen; ++i){\n key = keys[i];\n adata[i] = {\n x: key,\n y: data[key]\n };\n }\n return adata;\n}\nfunction isStacked(scale, meta) {\n const stacked = scale && scale.options.stacked;\n return stacked || stacked === undefined && meta.stack !== undefined;\n}\nfunction getStackKey(indexScale, valueScale, meta) {\n return `${indexScale.id}.${valueScale.id}.${meta.stack || meta.type}`;\n}\nfunction getUserBounds(scale) {\n const { min , max , minDefined , maxDefined } = scale.getUserBounds();\n return {\n min: minDefined ? min : Number.NEGATIVE_INFINITY,\n max: maxDefined ? max : Number.POSITIVE_INFINITY\n };\n}\nfunction getOrCreateStack(stacks, stackKey, indexValue) {\n const subStack = stacks[stackKey] || (stacks[stackKey] = {});\n return subStack[indexValue] || (subStack[indexValue] = {});\n}\nfunction getLastIndexInStack(stack, vScale, positive, type) {\n for (const meta of vScale.getMatchingVisibleMetas(type).reverse()){\n const value = stack[meta.index];\n if (positive && value > 0 || !positive && value < 0) {\n return meta.index;\n }\n }\n return null;\n}\nfunction updateStacks(controller, parsed) {\n const { chart , _cachedMeta: meta } = controller;\n const stacks = chart._stacks || (chart._stacks = {});\n const { iScale , vScale , index: datasetIndex } = meta;\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const key = getStackKey(iScale, vScale, meta);\n const ilen = parsed.length;\n let stack;\n for(let i = 0; i < ilen; ++i){\n const item = parsed[i];\n const { [iAxis]: index , [vAxis]: value } = item;\n const itemStacks = item._stacks || (item._stacks = {});\n stack = itemStacks[vAxis] = getOrCreateStack(stacks, key, index);\n stack[datasetIndex] = value;\n stack._top = getLastIndexInStack(stack, vScale, true, meta.type);\n stack._bottom = getLastIndexInStack(stack, vScale, false, meta.type);\n const visualValues = stack._visualValues || (stack._visualValues = {});\n visualValues[datasetIndex] = value;\n }\n}\nfunction getFirstScaleId(chart, axis) {\n const scales = chart.scales;\n return Object.keys(scales).filter((key)=>scales[key].axis === axis).shift();\n}\nfunction createDatasetContext(parent, index) {\n return createContext(parent, {\n active: false,\n dataset: undefined,\n datasetIndex: index,\n index,\n mode: \'default\',\n type: \'dataset\'\n });\n}\nfunction createDataContext(parent, index, element) {\n return createContext(parent, {\n active: false,\n dataIndex: index,\n parsed: undefined,\n raw: undefined,\n element,\n index,\n mode: \'default\',\n type: \'data\'\n });\n}\nfunction clearStacks(meta, items) {\n const datasetIndex = meta.controller.index;\n const axis = meta.vScale && meta.vScale.axis;\n if (!axis) {\n return;\n }\n items = items || meta._parsed;\n for (const parsed of items){\n const stacks = parsed._stacks;\n if (!stacks || stacks[axis] === undefined || stacks[axis][datasetIndex] === undefined) {\n return;\n }\n delete stacks[axis][datasetIndex];\n if (stacks[axis]._visualValues !== undefined && stacks[axis]._visualValues[datasetIndex] !== undefined) {\n delete stacks[axis]._visualValues[datasetIndex];\n }\n }\n}\nconst isDirectUpdateMode = (mode)=>mode === \'reset\' || mode === \'none\';\nconst cloneIfNotShared = (cached, shared)=>shared ? cached : Object.assign({}, cached);\nconst createStack = (canStack, meta, chart)=>canStack && !meta.hidden && meta._stacked && {\n keys: getSortedDatasetIndices(chart, true),\n values: null\n };\nclass DatasetController {\n static defaults = {};\n static datasetElementType = null;\n static dataElementType = null;\n constructor(chart, datasetIndex){\n this.chart = chart;\n this._ctx = chart.ctx;\n this.index = datasetIndex;\n this._cachedDataOpts = {};\n this._cachedMeta = this.getMeta();\n this._type = this._cachedMeta.type;\n this.options = undefined;\n this._parsing = false;\n this._data = undefined;\n this._objectData = undefined;\n this._sharedOptions = undefined;\n this._drawStart = undefined;\n this._drawCount = undefined;\n this.enableOptionSharing = false;\n this.supportsDecimation = false;\n this.$context = undefined;\n this._syncList = [];\n this.datasetElementType = new.target.datasetElementType;\n this.dataElementType = new.target.dataElementType;\n this.initialize();\n }\n initialize() {\n const meta = this._cachedMeta;\n this.configure();\n this.linkScales();\n meta._stacked = isStacked(meta.vScale, meta);\n this.addElements();\n if (this.options.fill && !this.chart.isPluginEnabled(\'filler\')) {\n console.warn("Tried to use the \'fill\' option without the \'Filler\' plugin enabled. Please import and register the \'Filler\' plugin and make sure it is not disabled in the options");\n }\n }\n updateIndex(datasetIndex) {\n if (this.index !== datasetIndex) {\n clearStacks(this._cachedMeta);\n }\n this.index = datasetIndex;\n }\n linkScales() {\n const chart = this.chart;\n const meta = this._cachedMeta;\n const dataset = this.getDataset();\n const chooseId = (axis, x, y, r)=>axis === \'x\' ? x : axis === \'r\' ? r : y;\n const xid = meta.xAxisID = valueOrDefault(dataset.xAxisID, getFirstScaleId(chart, \'x\'));\n const yid = meta.yAxisID = valueOrDefault(dataset.yAxisID, getFirstScaleId(chart, \'y\'));\n const rid = meta.rAxisID = valueOrDefault(dataset.rAxisID, getFirstScaleId(chart, \'r\'));\n const indexAxis = meta.indexAxis;\n const iid = meta.iAxisID = chooseId(indexAxis, xid, yid, rid);\n const vid = meta.vAxisID = chooseId(indexAxis, yid, xid, rid);\n meta.xScale = this.getScaleForId(xid);\n meta.yScale = this.getScaleForId(yid);\n meta.rScale = this.getScaleForId(rid);\n meta.iScale = this.getScaleForId(iid);\n meta.vScale = this.getScaleForId(vid);\n }\n getDataset() {\n return this.chart.data.datasets[this.index];\n }\n getMeta() {\n return this.chart.getDatasetMeta(this.index);\n }\n getScaleForId(scaleID) {\n return this.chart.scales[scaleID];\n }\n _getOtherScale(scale) {\n const meta = this._cachedMeta;\n return scale === meta.iScale ? meta.vScale : meta.iScale;\n }\n reset() {\n this._update(\'reset\');\n }\n _destroy() {\n const meta = this._cachedMeta;\n if (this._data) {\n unlistenArrayEvents(this._data, this);\n }\n if (meta._stacked) {\n clearStacks(meta);\n }\n }\n _dataCheck() {\n const dataset = this.getDataset();\n const data = dataset.data || (dataset.data = []);\n const _data = this._data;\n if (isObject(data)) {\n this._data = convertObjectDataToArray(data);\n } else if (_data !== data) {\n if (_data) {\n unlistenArrayEvents(_data, this);\n const meta = this._cachedMeta;\n clearStacks(meta);\n meta._parsed = [];\n }\n if (data && Object.isExtensible(data)) {\n listenArrayEvents(data, this);\n }\n this._syncList = [];\n this._data = data;\n }\n }\n addElements() {\n const meta = this._cachedMeta;\n this._dataCheck();\n if (this.datasetElementType) {\n meta.dataset = new this.datasetElementType();\n }\n }\n buildOrUpdateElements(resetNewElements) {\n const meta = this._cachedMeta;\n const dataset = this.getDataset();\n let stackChanged = false;\n this._dataCheck();\n const oldStacked = meta._stacked;\n meta._stacked = isStacked(meta.vScale, meta);\n if (meta.stack !== dataset.stack) {\n stackChanged = true;\n clearStacks(meta);\n meta.stack = dataset.stack;\n }\n this._resyncElements(resetNewElements);\n if (stackChanged || oldStacked !== meta._stacked) {\n updateStacks(this, meta._parsed);\n }\n }\n configure() {\n const config = this.chart.config;\n const scopeKeys = config.datasetScopeKeys(this._type);\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys, true);\n this.options = config.createResolver(scopes, this.getContext());\n this._parsing = this.options.parsing;\n this._cachedDataOpts = {};\n }\n parse(start, count) {\n const { _cachedMeta: meta , _data: data } = this;\n const { iScale , _stacked } = meta;\n const iAxis = iScale.axis;\n let sorted = start === 0 && count === data.length ? true : meta._sorted;\n let prev = start > 0 && meta._parsed[start - 1];\n let i, cur, parsed;\n if (this._parsing === false) {\n meta._parsed = data;\n meta._sorted = true;\n parsed = data;\n } else {\n if (isArray(data[start])) {\n parsed = this.parseArrayData(meta, data, start, count);\n } else if (isObject(data[start])) {\n parsed = this.parseObjectData(meta, data, start, count);\n } else {\n parsed = this.parsePrimitiveData(meta, data, start, count);\n }\n const isNotInOrderComparedToPrev = ()=>cur[iAxis] === null || prev && cur[iAxis] < prev[iAxis];\n for(i = 0; i < count; ++i){\n meta._parsed[i + start] = cur = parsed[i];\n if (sorted) {\n if (isNotInOrderComparedToPrev()) {\n sorted = false;\n }\n prev = cur;\n }\n }\n meta._sorted = sorted;\n }\n if (_stacked) {\n updateStacks(this, parsed);\n }\n }\n parsePrimitiveData(meta, data, start, count) {\n const { iScale , vScale } = meta;\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const labels = iScale.getLabels();\n const singleScale = iScale === vScale;\n const parsed = new Array(count);\n let i, ilen, index;\n for(i = 0, ilen = count; i < ilen; ++i){\n index = i + start;\n parsed[i] = {\n [iAxis]: singleScale || iScale.parse(labels[index], index),\n [vAxis]: vScale.parse(data[index], index)\n };\n }\n return parsed;\n }\n parseArrayData(meta, data, start, count) {\n const { xScale , yScale } = meta;\n const parsed = new Array(count);\n let i, ilen, index, item;\n for(i = 0, ilen = count; i < ilen; ++i){\n index = i + start;\n item = data[index];\n parsed[i] = {\n x: xScale.parse(item[0], index),\n y: yScale.parse(item[1], index)\n };\n }\n return parsed;\n }\n parseObjectData(meta, data, start, count) {\n const { xScale , yScale } = meta;\n const { xAxisKey =\'x\' , yAxisKey =\'y\' } = this._parsing;\n const parsed = new Array(count);\n let i, ilen, index, item;\n for(i = 0, ilen = count; i < ilen; ++i){\n index = i + start;\n item = data[index];\n parsed[i] = {\n x: xScale.parse(resolveObjectKey(item, xAxisKey), index),\n y: yScale.parse(resolveObjectKey(item, yAxisKey), index)\n };\n }\n return parsed;\n }\n getParsed(index) {\n return this._cachedMeta._parsed[index];\n }\n getDataElement(index) {\n return this._cachedMeta.data[index];\n }\n applyStack(scale, parsed, mode) {\n const chart = this.chart;\n const meta = this._cachedMeta;\n const value = parsed[scale.axis];\n const stack = {\n keys: getSortedDatasetIndices(chart, true),\n values: parsed._stacks[scale.axis]._visualValues\n };\n return applyStack(stack, value, meta.index, {\n mode\n });\n }\n updateRangeFromParsed(range, scale, parsed, stack) {\n const parsedValue = parsed[scale.axis];\n let value = parsedValue === null ? NaN : parsedValue;\n const values = stack && parsed._stacks[scale.axis];\n if (stack && values) {\n stack.values = values;\n value = applyStack(stack, parsedValue, this._cachedMeta.index);\n }\n range.min = Math.min(range.min, value);\n range.max = Math.max(range.max, value);\n }\n getMinMax(scale, canStack) {\n const meta = this._cachedMeta;\n const _parsed = meta._parsed;\n const sorted = meta._sorted && scale === meta.iScale;\n const ilen = _parsed.length;\n const otherScale = this._getOtherScale(scale);\n const stack = createStack(canStack, meta, this.chart);\n const range = {\n min: Number.POSITIVE_INFINITY,\n max: Number.NEGATIVE_INFINITY\n };\n const { min: otherMin , max: otherMax } = getUserBounds(otherScale);\n let i, parsed;\n function _skip() {\n parsed = _parsed[i];\n const otherValue = parsed[otherScale.axis];\n return !isNumberFinite(parsed[scale.axis]) || otherMin > otherValue || otherMax < otherValue;\n }\n for(i = 0; i < ilen; ++i){\n if (_skip()) {\n continue;\n }\n this.updateRangeFromParsed(range, scale, parsed, stack);\n if (sorted) {\n break;\n }\n }\n if (sorted) {\n for(i = ilen - 1; i >= 0; --i){\n if (_skip()) {\n continue;\n }\n this.updateRangeFromParsed(range, scale, parsed, stack);\n break;\n }\n }\n return range;\n }\n getAllParsedValues(scale) {\n const parsed = this._cachedMeta._parsed;\n const values = [];\n let i, ilen, value;\n for(i = 0, ilen = parsed.length; i < ilen; ++i){\n value = parsed[i][scale.axis];\n if (isNumberFinite(value)) {\n values.push(value);\n }\n }\n return values;\n }\n getMaxOverflow() {\n return false;\n }\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const iScale = meta.iScale;\n const vScale = meta.vScale;\n const parsed = this.getParsed(index);\n return {\n label: iScale ? \'\' + iScale.getLabelForValue(parsed[iScale.axis]) : \'\',\n value: vScale ? \'\' + vScale.getLabelForValue(parsed[vScale.axis]) : \'\'\n };\n }\n _update(mode) {\n const meta = this._cachedMeta;\n this.update(mode || \'default\');\n meta._clip = toClip(valueOrDefault(this.options.clip, defaultClip(meta.xScale, meta.yScale, this.getMaxOverflow())));\n }\n update(mode) {}\n draw() {\n const ctx = this._ctx;\n const chart = this.chart;\n const meta = this._cachedMeta;\n const elements = meta.data || [];\n const area = chart.chartArea;\n const active = [];\n const start = this._drawStart || 0;\n const count = this._drawCount || elements.length - start;\n const drawActiveElementsOnTop = this.options.drawActiveElementsOnTop;\n let i;\n if (meta.dataset) {\n meta.dataset.draw(ctx, area, start, count);\n }\n for(i = start; i < start + count; ++i){\n const element = elements[i];\n if (element.hidden) {\n continue;\n }\n if (element.active && drawActiveElementsOnTop) {\n active.push(element);\n } else {\n element.draw(ctx, area);\n }\n }\n for(i = 0; i < active.length; ++i){\n active[i].draw(ctx, area);\n }\n }\n getStyle(index, active) {\n const mode = active ? \'active\' : \'default\';\n return index === undefined && this._cachedMeta.dataset ? this.resolveDatasetElementOptions(mode) : this.resolveDataElementOptions(index || 0, mode);\n }\n getContext(index, active, mode) {\n const dataset = this.getDataset();\n let context;\n if (index >= 0 && index < this._cachedMeta.data.length) {\n const element = this._cachedMeta.data[index];\n context = element.$context || (element.$context = createDataContext(this.getContext(), index, element));\n context.parsed = this.getParsed(index);\n context.raw = dataset.data[index];\n context.index = context.dataIndex = index;\n } else {\n context = this.$context || (this.$context = createDatasetContext(this.chart.getContext(), this.index));\n context.dataset = dataset;\n context.index = context.datasetIndex = this.index;\n }\n context.active = !!active;\n context.mode = mode;\n return context;\n }\n resolveDatasetElementOptions(mode) {\n return this._resolveElementOptions(this.datasetElementType.id, mode);\n }\n resolveDataElementOptions(index, mode) {\n return this._resolveElementOptions(this.dataElementType.id, mode, index);\n }\n _resolveElementOptions(elementType, mode = \'default\', index) {\n const active = mode === \'active\';\n const cache = this._cachedDataOpts;\n const cacheKey = elementType + \'-\' + mode;\n const cached = cache[cacheKey];\n const sharing = this.enableOptionSharing && defined(index);\n if (cached) {\n return cloneIfNotShared(cached, sharing);\n }\n const config = this.chart.config;\n const scopeKeys = config.datasetElementScopeKeys(this._type, elementType);\n const prefixes = active ? [\n `${elementType}Hover`,\n \'hover\',\n elementType,\n \'\'\n ] : [\n elementType,\n \'\'\n ];\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys);\n const names = Object.keys(defaults.elements[elementType]);\n const context = ()=>this.getContext(index, active, mode);\n const values = config.resolveNamedOptions(scopes, names, context, prefixes);\n if (values.$shared) {\n values.$shared = sharing;\n cache[cacheKey] = Object.freeze(cloneIfNotShared(values, sharing));\n }\n return values;\n }\n _resolveAnimations(index, transition, active) {\n const chart = this.chart;\n const cache = this._cachedDataOpts;\n const cacheKey = `animation-${transition}`;\n const cached = cache[cacheKey];\n if (cached) {\n return cached;\n }\n let options;\n if (chart.options.animation !== false) {\n const config = this.chart.config;\n const scopeKeys = config.datasetAnimationScopeKeys(this._type, transition);\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys);\n options = config.createResolver(scopes, this.getContext(index, active, transition));\n }\n const animations = new Animations(chart, options && options.animations);\n if (options && options._cacheable) {\n cache[cacheKey] = Object.freeze(animations);\n }\n return animations;\n }\n getSharedOptions(options) {\n if (!options.$shared) {\n return;\n }\n return this._sharedOptions || (this._sharedOptions = Object.assign({}, options));\n }\n includeOptions(mode, sharedOptions) {\n return !sharedOptions || isDirectUpdateMode(mode) || this.chart._animationsDisabled;\n }\n _getSharedOptions(start, mode) {\n const firstOpts = this.resolveDataElementOptions(start, mode);\n const previouslySharedOptions = this._sharedOptions;\n const sharedOptions = this.getSharedOptions(firstOpts);\n const includeOptions = this.includeOptions(mode, sharedOptions) || sharedOptions !== previouslySharedOptions;\n this.updateSharedOptions(sharedOptions, mode, firstOpts);\n return {\n sharedOptions,\n includeOptions\n };\n }\n updateElement(element, index, properties, mode) {\n if (isDirectUpdateMode(mode)) {\n Object.assign(element, properties);\n } else {\n this._resolveAnimations(index, mode).update(element, properties);\n }\n }\n updateSharedOptions(sharedOptions, mode, newOptions) {\n if (sharedOptions && !isDirectUpdateMode(mode)) {\n this._resolveAnimations(undefined, mode).update(sharedOptions, newOptions);\n }\n }\n _setStyle(element, index, mode, active) {\n element.active = active;\n const options = this.getStyle(index, active);\n this._resolveAnimations(index, mode, active).update(element, {\n options: !active && this.getSharedOptions(options) || options\n });\n }\n removeHoverStyle(element, datasetIndex, index) {\n this._setStyle(element, index, \'active\', false);\n }\n setHoverStyle(element, datasetIndex, index) {\n this._setStyle(element, index, \'active\', true);\n }\n _removeDatasetHoverStyle() {\n const element = this._cachedMeta.dataset;\n if (element) {\n this._setStyle(element, undefined, \'active\', false);\n }\n }\n _setDatasetHoverStyle() {\n const element = this._cachedMeta.dataset;\n if (element) {\n this._setStyle(element, undefined, \'active\', true);\n }\n }\n _resyncElements(resetNewElements) {\n const data = this._data;\n const elements = this._cachedMeta.data;\n for (const [method, arg1, arg2] of this._syncList){\n this[method](arg1, arg2);\n }\n this._syncList = [];\n const numMeta = elements.length;\n const numData = data.length;\n const count = Math.min(numData, numMeta);\n if (count) {\n this.parse(0, count);\n }\n if (numData > numMeta) {\n this._insertElements(numMeta, numData - numMeta, resetNewElements);\n } else if (numData < numMeta) {\n this._removeElements(numData, numMeta - numData);\n }\n }\n _insertElements(start, count, resetNewElements = true) {\n const meta = this._cachedMeta;\n const data = meta.data;\n const end = start + count;\n let i;\n const move = (arr)=>{\n arr.length += count;\n for(i = arr.length - 1; i >= end; i--){\n arr[i] = arr[i - count];\n }\n };\n move(data);\n for(i = start; i < end; ++i){\n data[i] = new this.dataElementType();\n }\n if (this._parsing) {\n move(meta._parsed);\n }\n this.parse(start, count);\n if (resetNewElements) {\n this.updateElements(data, start, count, \'reset\');\n }\n }\n updateElements(element, start, count, mode) {}\n _removeElements(start, count) {\n const meta = this._cachedMeta;\n if (this._parsing) {\n const removed = meta._parsed.splice(start, count);\n if (meta._stacked) {\n clearStacks(meta, removed);\n }\n }\n meta.data.splice(start, count);\n }\n _sync(args) {\n if (this._parsing) {\n this._syncList.push(args);\n } else {\n const [method, arg1, arg2] = args;\n this[method](arg1, arg2);\n }\n this.chart._dataChanges.push([\n this.index,\n ...args\n ]);\n }\n _onDataPush() {\n const count = arguments.length;\n this._sync([\n \'_insertElements\',\n this.getDataset().data.length - count,\n count\n ]);\n }\n _onDataPop() {\n this._sync([\n \'_removeElements\',\n this._cachedMeta.data.length - 1,\n 1\n ]);\n }\n _onDataShift() {\n this._sync([\n \'_removeElements\',\n 0,\n 1\n ]);\n }\n _onDataSplice(start, count) {\n if (count) {\n this._sync([\n \'_removeElements\',\n start,\n count\n ]);\n }\n const newCount = arguments.length - 2;\n if (newCount) {\n this._sync([\n \'_insertElements\',\n start,\n newCount\n ]);\n }\n }\n _onDataUnshift() {\n this._sync([\n \'_insertElements\',\n 0,\n arguments.length\n ]);\n }\n}\n\nfunction getAllScaleValues(scale, type) {\n if (!scale._cache.$bar) {\n const visibleMetas = scale.getMatchingVisibleMetas(type);\n let values = [];\n for(let i = 0, ilen = visibleMetas.length; i < ilen; i++){\n values = values.concat(visibleMetas[i].controller.getAllParsedValues(scale));\n }\n scale._cache.$bar = _arrayUnique(values.sort((a, b)=>a - b));\n }\n return scale._cache.$bar;\n}\n function computeMinSampleSize(meta) {\n const scale = meta.iScale;\n const values = getAllScaleValues(scale, meta.type);\n let min = scale._length;\n let i, ilen, curr, prev;\n const updateMinAndPrev = ()=>{\n if (curr === 32767 || curr === -32768) {\n return;\n }\n if (defined(prev)) {\n min = Math.min(min, Math.abs(curr - prev) || min);\n }\n prev = curr;\n };\n for(i = 0, ilen = values.length; i < ilen; ++i){\n curr = scale.getPixelForValue(values[i]);\n updateMinAndPrev();\n }\n prev = undefined;\n for(i = 0, ilen = scale.ticks.length; i < ilen; ++i){\n curr = scale.getPixelForTick(i);\n updateMinAndPrev();\n }\n return min;\n}\n function computeFitCategoryTraits(index, ruler, options, stackCount) {\n const thickness = options.barThickness;\n let size, ratio;\n if (isNullOrUndef(thickness)) {\n size = ruler.min * options.categoryPercentage;\n ratio = options.barPercentage;\n } else {\n size = thickness * stackCount;\n ratio = 1;\n }\n return {\n chunk: size / stackCount,\n ratio,\n start: ruler.pixels[index] - size / 2\n };\n}\n function computeFlexCategoryTraits(index, ruler, options, stackCount) {\n const pixels = ruler.pixels;\n const curr = pixels[index];\n let prev = index > 0 ? pixels[index - 1] : null;\n let next = index < pixels.length - 1 ? pixels[index + 1] : null;\n const percent = options.categoryPercentage;\n if (prev === null) {\n prev = curr - (next === null ? ruler.end - ruler.start : next - curr);\n }\n if (next === null) {\n next = curr + curr - prev;\n }\n const start = curr - (curr - Math.min(prev, next)) / 2 * percent;\n const size = Math.abs(next - prev) / 2 * percent;\n return {\n chunk: size / stackCount,\n ratio: options.barPercentage,\n start\n };\n}\nfunction parseFloatBar(entry, item, vScale, i) {\n const startValue = vScale.parse(entry[0], i);\n const endValue = vScale.parse(entry[1], i);\n const min = Math.min(startValue, endValue);\n const max = Math.max(startValue, endValue);\n let barStart = min;\n let barEnd = max;\n if (Math.abs(min) > Math.abs(max)) {\n barStart = max;\n barEnd = min;\n }\n item[vScale.axis] = barEnd;\n item._custom = {\n barStart,\n barEnd,\n start: startValue,\n end: endValue,\n min,\n max\n };\n}\nfunction parseValue(entry, item, vScale, i) {\n if (isArray(entry)) {\n parseFloatBar(entry, item, vScale, i);\n } else {\n item[vScale.axis] = vScale.parse(entry, i);\n }\n return item;\n}\nfunction parseArrayOrPrimitive(meta, data, start, count) {\n const iScale = meta.iScale;\n const vScale = meta.vScale;\n const labels = iScale.getLabels();\n const singleScale = iScale === vScale;\n const parsed = [];\n let i, ilen, item, entry;\n for(i = start, ilen = start + count; i < ilen; ++i){\n entry = data[i];\n item = {};\n item[iScale.axis] = singleScale || iScale.parse(labels[i], i);\n parsed.push(parseValue(entry, item, vScale, i));\n }\n return parsed;\n}\nfunction isFloatBar(custom) {\n return custom && custom.barStart !== undefined && custom.barEnd !== undefined;\n}\nfunction barSign(size, vScale, actualBase) {\n if (size !== 0) {\n return sign(size);\n }\n return (vScale.isHorizontal() ? 1 : -1) * (vScale.min >= actualBase ? 1 : -1);\n}\nfunction borderProps(properties) {\n let reverse, start, end, top, bottom;\n if (properties.horizontal) {\n reverse = properties.base > properties.x;\n start = \'left\';\n end = \'right\';\n } else {\n reverse = properties.base < properties.y;\n start = \'bottom\';\n end = \'top\';\n }\n if (reverse) {\n top = \'end\';\n bottom = \'start\';\n } else {\n top = \'start\';\n bottom = \'end\';\n }\n return {\n start,\n end,\n reverse,\n top,\n bottom\n };\n}\nfunction setBorderSkipped(properties, options, stack, index) {\n let edge = options.borderSkipped;\n const res = {};\n if (!edge) {\n properties.borderSkipped = res;\n return;\n }\n if (edge === true) {\n properties.borderSkipped = {\n top: true,\n right: true,\n bottom: true,\n left: true\n };\n return;\n }\n const { start , end , reverse , top , bottom } = borderProps(properties);\n if (edge === \'middle\' && stack) {\n properties.enableBorderRadius = true;\n if ((stack._top || 0) === index) {\n edge = top;\n } else if ((stack._bottom || 0) === index) {\n edge = bottom;\n } else {\n res[parseEdge(bottom, start, end, reverse)] = true;\n edge = top;\n }\n }\n res[parseEdge(edge, start, end, reverse)] = true;\n properties.borderSkipped = res;\n}\nfunction parseEdge(edge, a, b, reverse) {\n if (reverse) {\n edge = swap(edge, a, b);\n edge = startEnd(edge, b, a);\n } else {\n edge = startEnd(edge, a, b);\n }\n return edge;\n}\nfunction swap(orig, v1, v2) {\n return orig === v1 ? v2 : orig === v2 ? v1 : orig;\n}\nfunction startEnd(v, start, end) {\n return v === \'start\' ? start : v === \'end\' ? end : v;\n}\nfunction setInflateAmount(properties, { inflateAmount }, ratio) {\n properties.inflateAmount = inflateAmount === \'auto\' ? ratio === 1 ? 0.33 : 0 : inflateAmount;\n}\nclass BarController extends DatasetController {\n static id = \'bar\';\n static defaults = {\n datasetElementType: false,\n dataElementType: \'bar\',\n categoryPercentage: 0.8,\n barPercentage: 0.9,\n grouped: true,\n animations: {\n numbers: {\n type: \'number\',\n properties: [\n \'x\',\n \'y\',\n \'base\',\n \'width\',\n \'height\'\n ]\n }\n }\n };\n static overrides = {\n scales: {\n _index_: {\n type: \'category\',\n offset: true,\n grid: {\n offset: true\n }\n },\n _value_: {\n type: \'linear\',\n beginAtZero: true\n }\n }\n };\n parsePrimitiveData(meta, data, start, count) {\n return parseArrayOrPrimitive(meta, data, start, count);\n }\n parseArrayData(meta, data, start, count) {\n return parseArrayOrPrimitive(meta, data, start, count);\n }\n parseObjectData(meta, data, start, count) {\n const { iScale , vScale } = meta;\n const { xAxisKey =\'x\' , yAxisKey =\'y\' } = this._parsing;\n const iAxisKey = iScale.axis === \'x\' ? xAxisKey : yAxisKey;\n const vAxisKey = vScale.axis === \'x\' ? xAxisKey : yAxisKey;\n const parsed = [];\n let i, ilen, item, obj;\n for(i = start, ilen = start + count; i < ilen; ++i){\n obj = data[i];\n item = {};\n item[iScale.axis] = iScale.parse(resolveObjectKey(obj, iAxisKey), i);\n parsed.push(parseValue(resolveObjectKey(obj, vAxisKey), item, vScale, i));\n }\n return parsed;\n }\n updateRangeFromParsed(range, scale, parsed, stack) {\n super.updateRangeFromParsed(range, scale, parsed, stack);\n const custom = parsed._custom;\n if (custom && scale === this._cachedMeta.vScale) {\n range.min = Math.min(range.min, custom.min);\n range.max = Math.max(range.max, custom.max);\n }\n }\n getMaxOverflow() {\n return 0;\n }\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const { iScale , vScale } = meta;\n const parsed = this.getParsed(index);\n const custom = parsed._custom;\n const value = isFloatBar(custom) ? \'[\' + custom.start + \', \' + custom.end + \']\' : \'\' + vScale.getLabelForValue(parsed[vScale.axis]);\n return {\n label: \'\' + iScale.getLabelForValue(parsed[iScale.axis]),\n value\n };\n }\n initialize() {\n this.enableOptionSharing = true;\n super.initialize();\n const meta = this._cachedMeta;\n meta.stack = this.getDataset().stack;\n }\n update(mode) {\n const meta = this._cachedMeta;\n this.updateElements(meta.data, 0, meta.data.length, mode);\n }\n updateElements(bars, start, count, mode) {\n const reset = mode === \'reset\';\n const { index , _cachedMeta: { vScale } } = this;\n const base = vScale.getBasePixel();\n const horizontal = vScale.isHorizontal();\n const ruler = this._getRuler();\n const { sharedOptions , includeOptions } = this._getSharedOptions(start, mode);\n for(let i = start; i < start + count; i++){\n const parsed = this.getParsed(i);\n const vpixels = reset || isNullOrUndef(parsed[vScale.axis]) ? {\n base,\n head: base\n } : this._calculateBarValuePixels(i);\n const ipixels = this._calculateBarIndexPixels(i, ruler);\n const stack = (parsed._stacks || {})[vScale.axis];\n const properties = {\n horizontal,\n base: vpixels.base,\n enableBorderRadius: !stack || isFloatBar(parsed._custom) || index === stack._top || index === stack._bottom,\n x: horizontal ? vpixels.head : ipixels.center,\n y: horizontal ? ipixels.center : vpixels.head,\n height: horizontal ? ipixels.size : Math.abs(vpixels.size),\n width: horizontal ? Math.abs(vpixels.size) : ipixels.size\n };\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, bars[i].active ? \'active\' : mode);\n }\n const options = properties.options || bars[i].options;\n setBorderSkipped(properties, options, stack, index);\n setInflateAmount(properties, options, ruler.ratio);\n this.updateElement(bars[i], i, properties, mode);\n }\n }\n _getStacks(last, dataIndex) {\n const { iScale } = this._cachedMeta;\n const metasets = iScale.getMatchingVisibleMetas(this._type).filter((meta)=>meta.controller.options.grouped);\n const stacked = iScale.options.stacked;\n const stacks = [];\n const skipNull = (meta)=>{\n const parsed = meta.controller.getParsed(dataIndex);\n const val = parsed && parsed[meta.vScale.axis];\n if (isNullOrUndef(val) || isNaN(val)) {\n return true;\n }\n };\n for (const meta of metasets){\n if (dataIndex !== undefined && skipNull(meta)) {\n continue;\n }\n if (stacked === false || stacks.indexOf(meta.stack) === -1 || stacked === undefined && meta.stack === undefined) {\n stacks.push(meta.stack);\n }\n if (meta.index === last) {\n break;\n }\n }\n if (!stacks.length) {\n stacks.push(undefined);\n }\n return stacks;\n }\n _getStackCount(index) {\n return this._getStacks(undefined, index).length;\n }\n _getStackIndex(datasetIndex, name, dataIndex) {\n const stacks = this._getStacks(datasetIndex, dataIndex);\n const index = name !== undefined ? stacks.indexOf(name) : -1;\n return index === -1 ? stacks.length - 1 : index;\n }\n _getRuler() {\n const opts = this.options;\n const meta = this._cachedMeta;\n const iScale = meta.iScale;\n const pixels = [];\n let i, ilen;\n for(i = 0, ilen = meta.data.length; i < ilen; ++i){\n pixels.push(iScale.getPixelForValue(this.getParsed(i)[iScale.axis], i));\n }\n const barThickness = opts.barThickness;\n const min = barThickness || computeMinSampleSize(meta);\n return {\n min,\n pixels,\n start: iScale._startPixel,\n end: iScale._endPixel,\n stackCount: this._getStackCount(),\n scale: iScale,\n grouped: opts.grouped,\n ratio: barThickness ? 1 : opts.categoryPercentage * opts.barPercentage\n };\n }\n _calculateBarValuePixels(index) {\n const { _cachedMeta: { vScale , _stacked , index: datasetIndex } , options: { base: baseValue , minBarLength } } = this;\n const actualBase = baseValue || 0;\n const parsed = this.getParsed(index);\n const custom = parsed._custom;\n const floating = isFloatBar(custom);\n let value = parsed[vScale.axis];\n let start = 0;\n let length = _stacked ? this.applyStack(vScale, parsed, _stacked) : value;\n let head, size;\n if (length !== value) {\n start = length - value;\n length = value;\n }\n if (floating) {\n value = custom.barStart;\n length = custom.barEnd - custom.barStart;\n if (value !== 0 && sign(value) !== sign(custom.barEnd)) {\n start = 0;\n }\n start += value;\n }\n const startValue = !isNullOrUndef(baseValue) && !floating ? baseValue : start;\n let base = vScale.getPixelForValue(startValue);\n if (this.chart.getDataVisibility(index)) {\n head = vScale.getPixelForValue(start + length);\n } else {\n head = base;\n }\n size = head - base;\n if (Math.abs(size) < minBarLength) {\n size = barSign(size, vScale, actualBase) * minBarLength;\n if (value === actualBase) {\n base -= size / 2;\n }\n const startPixel = vScale.getPixelForDecimal(0);\n const endPixel = vScale.getPixelForDecimal(1);\n const min = Math.min(startPixel, endPixel);\n const max = Math.max(startPixel, endPixel);\n base = Math.max(Math.min(base, max), min);\n head = base + size;\n if (_stacked && !floating) {\n parsed._stacks[vScale.axis]._visualValues[datasetIndex] = vScale.getValueForPixel(head) - vScale.getValueForPixel(base);\n }\n }\n if (base === vScale.getPixelForValue(actualBase)) {\n const halfGrid = sign(size) * vScale.getLineWidthForValue(actualBase) / 2;\n base += halfGrid;\n size -= halfGrid;\n }\n return {\n size,\n base,\n head,\n center: head + size / 2\n };\n }\n _calculateBarIndexPixels(index, ruler) {\n const scale = ruler.scale;\n const options = this.options;\n const skipNull = options.skipNull;\n const maxBarThickness = valueOrDefault(options.maxBarThickness, Infinity);\n let center, size;\n if (ruler.grouped) {\n const stackCount = skipNull ? this._getStackCount(index) : ruler.stackCount;\n const range = options.barThickness === \'flex\' ? computeFlexCategoryTraits(index, ruler, options, stackCount) : computeFitCategoryTraits(index, ruler, options, stackCount);\n const stackIndex = this._getStackIndex(this.index, this._cachedMeta.stack, skipNull ? index : undefined);\n center = range.start + range.chunk * stackIndex + range.chunk / 2;\n size = Math.min(maxBarThickness, range.chunk * range.ratio);\n } else {\n center = scale.getPixelForValue(this.getParsed(index)[scale.axis], index);\n size = Math.min(maxBarThickness, ruler.min * ruler.ratio);\n }\n return {\n base: center - size / 2,\n head: center + size / 2,\n center,\n size\n };\n }\n draw() {\n const meta = this._cachedMeta;\n const vScale = meta.vScale;\n const rects = meta.data;\n const ilen = rects.length;\n let i = 0;\n for(; i < ilen; ++i){\n if (this.getParsed(i)[vScale.axis] !== null) {\n rects[i].draw(this._ctx);\n }\n }\n }\n}\n\nclass BubbleController extends DatasetController {\n static id = \'bubble\';\n static defaults = {\n datasetElementType: false,\n dataElementType: \'point\',\n animations: {\n numbers: {\n type: \'number\',\n properties: [\n \'x\',\n \'y\',\n \'borderWidth\',\n \'radius\'\n ]\n }\n }\n };\n static overrides = {\n scales: {\n x: {\n type: \'linear\'\n },\n y: {\n type: \'linear\'\n }\n }\n };\n initialize() {\n this.enableOptionSharing = true;\n super.initialize();\n }\n parsePrimitiveData(meta, data, start, count) {\n const parsed = super.parsePrimitiveData(meta, data, start, count);\n for(let i = 0; i < parsed.length; i++){\n parsed[i]._custom = this.resolveDataElementOptions(i + start).radius;\n }\n return parsed;\n }\n parseArrayData(meta, data, start, count) {\n const parsed = super.parseArrayData(meta, data, start, count);\n for(let i = 0; i < parsed.length; i++){\n const item = data[start + i];\n parsed[i]._custom = valueOrDefault(item[2], this.resolveDataElementOptions(i + start).radius);\n }\n return parsed;\n }\n parseObjectData(meta, data, start, count) {\n const parsed = super.parseObjectData(meta, data, start, count);\n for(let i = 0; i < parsed.length; i++){\n const item = data[start + i];\n parsed[i]._custom = valueOrDefault(item && item.r && +item.r, this.resolveDataElementOptions(i + start).radius);\n }\n return parsed;\n }\n getMaxOverflow() {\n const data = this._cachedMeta.data;\n let max = 0;\n for(let i = data.length - 1; i >= 0; --i){\n max = Math.max(max, data[i].size(this.resolveDataElementOptions(i)) / 2);\n }\n return max > 0 && max;\n }\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const labels = this.chart.data.labels || [];\n const { xScale , yScale } = meta;\n const parsed = this.getParsed(index);\n const x = xScale.getLabelForValue(parsed.x);\n const y = yScale.getLabelForValue(parsed.y);\n const r = parsed._custom;\n return {\n label: labels[index] || \'\',\n value: \'(\' + x + \', \' + y + (r ? \', \' + r : \'\') + \')\'\n };\n }\n update(mode) {\n const points = this._cachedMeta.data;\n this.updateElements(points, 0, points.length, mode);\n }\n updateElements(points, start, count, mode) {\n const reset = mode === \'reset\';\n const { iScale , vScale } = this._cachedMeta;\n const { sharedOptions , includeOptions } = this._getSharedOptions(start, mode);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n for(let i = start; i < start + count; i++){\n const point = points[i];\n const parsed = !reset && this.getParsed(i);\n const properties = {};\n const iPixel = properties[iAxis] = reset ? iScale.getPixelForDecimal(0.5) : iScale.getPixelForValue(parsed[iAxis]);\n const vPixel = properties[vAxis] = reset ? vScale.getBasePixel() : vScale.getPixelForValue(parsed[vAxis]);\n properties.skip = isNaN(iPixel) || isNaN(vPixel);\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? \'active\' : mode);\n if (reset) {\n properties.options.radius = 0;\n }\n }\n this.updateElement(point, i, properties, mode);\n }\n }\n resolveDataElementOptions(index, mode) {\n const parsed = this.getParsed(index);\n let values = super.resolveDataElementOptions(index, mode);\n if (values.$shared) {\n values = Object.assign({}, values, {\n $shared: false\n });\n }\n const radius = values.radius;\n if (mode !== \'active\') {\n values.radius = 0;\n }\n values.radius += valueOrDefault(parsed && parsed._custom, radius);\n return values;\n }\n}\n\nfunction getRatioAndOffset(rotation, circumference, cutout) {\n let ratioX = 1;\n let ratioY = 1;\n let offsetX = 0;\n let offsetY = 0;\n if (circumference < TAU) {\n const startAngle = rotation;\n const endAngle = startAngle + circumference;\n const startX = Math.cos(startAngle);\n const startY = Math.sin(startAngle);\n const endX = Math.cos(endAngle);\n const endY = Math.sin(endAngle);\n const calcMax = (angle, a, b)=>_angleBetween(angle, startAngle, endAngle, true) ? 1 : Math.max(a, a * cutout, b, b * cutout);\n const calcMin = (angle, a, b)=>_angleBetween(angle, startAngle, endAngle, true) ? -1 : Math.min(a, a * cutout, b, b * cutout);\n const maxX = calcMax(0, startX, endX);\n const maxY = calcMax(HALF_PI, startY, endY);\n const minX = calcMin(PI, startX, endX);\n const minY = calcMin(PI + HALF_PI, startY, endY);\n ratioX = (maxX - minX) / 2;\n ratioY = (maxY - minY) / 2;\n offsetX = -(maxX + minX) / 2;\n offsetY = -(maxY + minY) / 2;\n }\n return {\n ratioX,\n ratioY,\n offsetX,\n offsetY\n };\n}\nclass DoughnutController extends DatasetController {\n static id = \'doughnut\';\n static defaults = {\n datasetElementType: false,\n dataElementType: \'arc\',\n animation: {\n animateRotate: true,\n animateScale: false\n },\n animations: {\n numbers: {\n type: \'number\',\n properties: [\n \'circumference\',\n \'endAngle\',\n \'innerRadius\',\n \'outerRadius\',\n \'startAngle\',\n \'x\',\n \'y\',\n \'offset\',\n \'borderWidth\',\n \'spacing\'\n ]\n }\n },\n cutout: \'50%\',\n rotation: 0,\n circumference: 360,\n radius: \'100%\',\n spacing: 0,\n indexAxis: \'r\'\n };\n static descriptors = {\n _scriptable: (name)=>name !== \'spacing\',\n _indexable: (name)=>name !== \'spacing\' && !name.startsWith(\'borderDash\') && !name.startsWith(\'hoverBorderDash\')\n };\n static overrides = {\n aspectRatio: 1,\n plugins: {\n legend: {\n labels: {\n generateLabels (chart) {\n const data = chart.data;\n if (data.labels.length && data.datasets.length) {\n const { labels: { pointStyle , color } } = chart.legend.options;\n return data.labels.map((label, i)=>{\n const meta = chart.getDatasetMeta(0);\n const style = meta.controller.getStyle(i);\n return {\n text: label,\n fillStyle: style.backgroundColor,\n strokeStyle: style.borderColor,\n fontColor: color,\n lineWidth: style.borderWidth,\n pointStyle: pointStyle,\n hidden: !chart.getDataVisibility(i),\n index: i\n };\n });\n }\n return [];\n }\n },\n onClick (e, legendItem, legend) {\n legend.chart.toggleDataVisibility(legendItem.index);\n legend.chart.update();\n }\n }\n }\n };\n constructor(chart, datasetIndex){\n super(chart, datasetIndex);\n this.enableOptionSharing = true;\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n this.offsetX = undefined;\n this.offsetY = undefined;\n }\n linkScales() {}\n parse(start, count) {\n const data = this.getDataset().data;\n const meta = this._cachedMeta;\n if (this._parsing === false) {\n meta._parsed = data;\n } else {\n let getter = (i)=>+data[i];\n if (isObject(data[start])) {\n const { key =\'value\' } = this._parsing;\n getter = (i)=>+resolveObjectKey(data[i], key);\n }\n let i, ilen;\n for(i = start, ilen = start + count; i < ilen; ++i){\n meta._parsed[i] = getter(i);\n }\n }\n }\n _getRotation() {\n return toRadians(this.options.rotation - 90);\n }\n _getCircumference() {\n return toRadians(this.options.circumference);\n }\n _getRotationExtents() {\n let min = TAU;\n let max = -TAU;\n for(let i = 0; i < this.chart.data.datasets.length; ++i){\n if (this.chart.isDatasetVisible(i) && this.chart.getDatasetMeta(i).type === this._type) {\n const controller = this.chart.getDatasetMeta(i).controller;\n const rotation = controller._getRotation();\n const circumference = controller._getCircumference();\n min = Math.min(min, rotation);\n max = Math.max(max, rotation + circumference);\n }\n }\n return {\n rotation: min,\n circumference: max - min\n };\n }\n update(mode) {\n const chart = this.chart;\n const { chartArea } = chart;\n const meta = this._cachedMeta;\n const arcs = meta.data;\n const spacing = this.getMaxBorderWidth() + this.getMaxOffset(arcs) + this.options.spacing;\n const maxSize = Math.max((Math.min(chartArea.width, chartArea.height) - spacing) / 2, 0);\n const cutout = Math.min(toPercentage(this.options.cutout, maxSize), 1);\n const chartWeight = this._getRingWeight(this.index);\n const { circumference , rotation } = this._getRotationExtents();\n const { ratioX , ratioY , offsetX , offsetY } = getRatioAndOffset(rotation, circumference, cutout);\n const maxWidth = (chartArea.width - spacing) / ratioX;\n const maxHeight = (chartArea.height - spacing) / ratioY;\n const maxRadius = Math.max(Math.min(maxWidth, maxHeight) / 2, 0);\n const outerRadius = toDimension(this.options.radius, maxRadius);\n const innerRadius = Math.max(outerRadius * cutout, 0);\n const radiusLength = (outerRadius - innerRadius) / this._getVisibleDatasetWeightTotal();\n this.offsetX = offsetX * outerRadius;\n this.offsetY = offsetY * outerRadius;\n meta.total = this.calculateTotal();\n this.outerRadius = outerRadius - radiusLength * this._getRingWeightOffset(this.index);\n this.innerRadius = Math.max(this.outerRadius - radiusLength * chartWeight, 0);\n this.updateElements(arcs, 0, arcs.length, mode);\n }\n _circumference(i, reset) {\n const opts = this.options;\n const meta = this._cachedMeta;\n const circumference = this._getCircumference();\n if (reset && opts.animation.animateRotate || !this.chart.getDataVisibility(i) || meta._parsed[i] === null || meta.data[i].hidden) {\n return 0;\n }\n return this.calculateCircumference(meta._parsed[i] * circumference / TAU);\n }\n updateElements(arcs, start, count, mode) {\n const reset = mode === \'reset\';\n const chart = this.chart;\n const chartArea = chart.chartArea;\n const opts = chart.options;\n const animationOpts = opts.animation;\n const centerX = (chartArea.left + chartArea.right) / 2;\n const centerY = (chartArea.top + chartArea.bottom) / 2;\n const animateScale = reset && animationOpts.animateScale;\n const innerRadius = animateScale ? 0 : this.innerRadius;\n const outerRadius = animateScale ? 0 : this.outerRadius;\n const { sharedOptions , includeOptions } = this._getSharedOptions(start, mode);\n let startAngle = this._getRotation();\n let i;\n for(i = 0; i < start; ++i){\n startAngle += this._circumference(i, reset);\n }\n for(i = start; i < start + count; ++i){\n const circumference = this._circumference(i, reset);\n const arc = arcs[i];\n const properties = {\n x: centerX + this.offsetX,\n y: centerY + this.offsetY,\n startAngle,\n endAngle: startAngle + circumference,\n circumference,\n outerRadius,\n innerRadius\n };\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, arc.active ? \'active\' : mode);\n }\n startAngle += circumference;\n this.updateElement(arc, i, properties, mode);\n }\n }\n calculateTotal() {\n const meta = this._cachedMeta;\n const metaData = meta.data;\n let total = 0;\n let i;\n for(i = 0; i < metaData.length; i++){\n const value = meta._parsed[i];\n if (value !== null && !isNaN(value) && this.chart.getDataVisibility(i) && !metaData[i].hidden) {\n total += Math.abs(value);\n }\n }\n return total;\n }\n calculateCircumference(value) {\n const total = this._cachedMeta.total;\n if (total > 0 && !isNaN(value)) {\n return TAU * (Math.abs(value) / total);\n }\n return 0;\n }\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const chart = this.chart;\n const labels = chart.data.labels || [];\n const value = formatNumber(meta._parsed[index], chart.options.locale);\n return {\n label: labels[index] || \'\',\n value\n };\n }\n getMaxBorderWidth(arcs) {\n let max = 0;\n const chart = this.chart;\n let i, ilen, meta, controller, options;\n if (!arcs) {\n for(i = 0, ilen = chart.data.datasets.length; i < ilen; ++i){\n if (chart.isDatasetVisible(i)) {\n meta = chart.getDatasetMeta(i);\n arcs = meta.data;\n controller = meta.controller;\n break;\n }\n }\n }\n if (!arcs) {\n return 0;\n }\n for(i = 0, ilen = arcs.length; i < ilen; ++i){\n options = controller.resolveDataElementOptions(i);\n if (options.borderAlign !== \'inner\') {\n max = Math.max(max, options.borderWidth || 0, options.hoverBorderWidth || 0);\n }\n }\n return max;\n }\n getMaxOffset(arcs) {\n let max = 0;\n for(let i = 0, ilen = arcs.length; i < ilen; ++i){\n const options = this.resolveDataElementOptions(i);\n max = Math.max(max, options.offset || 0, options.hoverOffset || 0);\n }\n return max;\n }\n _getRingWeightOffset(datasetIndex) {\n let ringWeightOffset = 0;\n for(let i = 0; i < datasetIndex; ++i){\n if (this.chart.isDatasetVisible(i)) {\n ringWeightOffset += this._getRingWeight(i);\n }\n }\n return ringWeightOffset;\n }\n _getRingWeight(datasetIndex) {\n return Math.max(valueOrDefault(this.chart.data.datasets[datasetIndex].weight, 1), 0);\n }\n _getVisibleDatasetWeightTotal() {\n return this._getRingWeightOffset(this.chart.data.datasets.length) || 1;\n }\n}\n\nclass LineController extends DatasetController {\n static id = \'line\';\n static defaults = {\n datasetElementType: \'line\',\n dataElementType: \'point\',\n showLine: true,\n spanGaps: false\n };\n static overrides = {\n scales: {\n _index_: {\n type: \'category\'\n },\n _value_: {\n type: \'linear\'\n }\n }\n };\n initialize() {\n this.enableOptionSharing = true;\n this.supportsDecimation = true;\n super.initialize();\n }\n update(mode) {\n const meta = this._cachedMeta;\n const { dataset: line , data: points = [] , _dataset } = meta;\n const animationsDisabled = this.chart._animationsDisabled;\n let { start , count } = _getStartAndCountOfVisiblePoints(meta, points, animationsDisabled);\n this._drawStart = start;\n this._drawCount = count;\n if (_scaleRangesChanged(meta)) {\n start = 0;\n count = points.length;\n }\n line._chart = this.chart;\n line._datasetIndex = this.index;\n line._decimated = !!_dataset._decimated;\n line.points = points;\n const options = this.resolveDatasetElementOptions(mode);\n if (!this.options.showLine) {\n options.borderWidth = 0;\n }\n options.segment = this.options.segment;\n this.updateElement(line, undefined, {\n animated: !animationsDisabled,\n options\n }, mode);\n this.updateElements(points, start, count, mode);\n }\n updateElements(points, start, count, mode) {\n const reset = mode === \'reset\';\n const { iScale , vScale , _stacked , _dataset } = this._cachedMeta;\n const { sharedOptions , includeOptions } = this._getSharedOptions(start, mode);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const { spanGaps , segment } = this.options;\n const maxGapLength = isNumber(spanGaps) ? spanGaps : Number.POSITIVE_INFINITY;\n const directUpdate = this.chart._animationsDisabled || reset || mode === \'none\';\n const end = start + count;\n const pointsCount = points.length;\n let prevParsed = start > 0 && this.getParsed(start - 1);\n for(let i = 0; i < pointsCount; ++i){\n const point = points[i];\n const properties = directUpdate ? point : {};\n if (i < start || i >= end) {\n properties.skip = true;\n continue;\n }\n const parsed = this.getParsed(i);\n const nullData = isNullOrUndef(parsed[vAxis]);\n const iPixel = properties[iAxis] = iScale.getPixelForValue(parsed[iAxis], i);\n const vPixel = properties[vAxis] = reset || nullData ? vScale.getBasePixel() : vScale.getPixelForValue(_stacked ? this.applyStack(vScale, parsed, _stacked) : parsed[vAxis], i);\n properties.skip = isNaN(iPixel) || isNaN(vPixel) || nullData;\n properties.stop = i > 0 && Math.abs(parsed[iAxis] - prevParsed[iAxis]) > maxGapLength;\n if (segment) {\n properties.parsed = parsed;\n properties.raw = _dataset.data[i];\n }\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? \'active\' : mode);\n }\n if (!directUpdate) {\n this.updateElement(point, i, properties, mode);\n }\n prevParsed = parsed;\n }\n }\n getMaxOverflow() {\n const meta = this._cachedMeta;\n const dataset = meta.dataset;\n const border = dataset.options && dataset.options.borderWidth || 0;\n const data = meta.data || [];\n if (!data.length) {\n return border;\n }\n const firstPoint = data[0].size(this.resolveDataElementOptions(0));\n const lastPoint = data[data.length - 1].size(this.resolveDataElementOptions(data.length - 1));\n return Math.max(border, firstPoint, lastPoint) / 2;\n }\n draw() {\n const meta = this._cachedMeta;\n meta.dataset.updateControlPoints(this.chart.chartArea, meta.iScale.axis);\n super.draw();\n }\n}\n\nclass PolarAreaController extends DatasetController {\n static id = \'polarArea\';\n static defaults = {\n dataElementType: \'arc\',\n animation: {\n animateRotate: true,\n animateScale: true\n },\n animations: {\n numbers: {\n type: \'number\',\n properties: [\n \'x\',\n \'y\',\n \'startAngle\',\n \'endAngle\',\n \'innerRadius\',\n \'outerRadius\'\n ]\n }\n },\n indexAxis: \'r\',\n startAngle: 0\n };\n static overrides = {\n aspectRatio: 1,\n plugins: {\n legend: {\n labels: {\n generateLabels (chart) {\n const data = chart.data;\n if (data.labels.length && data.datasets.length) {\n const { labels: { pointStyle , color } } = chart.legend.options;\n return data.labels.map((label, i)=>{\n const meta = chart.getDatasetMeta(0);\n const style = meta.controller.getStyle(i);\n return {\n text: label,\n fillStyle: style.backgroundColor,\n strokeStyle: style.borderColor,\n fontColor: color,\n lineWidth: style.borderWidth,\n pointStyle: pointStyle,\n hidden: !chart.getDataVisibility(i),\n index: i\n };\n });\n }\n return [];\n }\n },\n onClick (e, legendItem, legend) {\n legend.chart.toggleDataVisibility(legendItem.index);\n legend.chart.update();\n }\n }\n },\n scales: {\n r: {\n type: \'radialLinear\',\n angleLines: {\n display: false\n },\n beginAtZero: true,\n grid: {\n circular: true\n },\n pointLabels: {\n display: false\n },\n startAngle: 0\n }\n }\n };\n constructor(chart, datasetIndex){\n super(chart, datasetIndex);\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n }\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const chart = this.chart;\n const labels = chart.data.labels || [];\n const value = formatNumber(meta._parsed[index].r, chart.options.locale);\n return {\n label: labels[index] || \'\',\n value\n };\n }\n parseObjectData(meta, data, start, count) {\n return _parseObjectDataRadialScale.bind(this)(meta, data, start, count);\n }\n update(mode) {\n const arcs = this._cachedMeta.data;\n this._updateRadius();\n this.updateElements(arcs, 0, arcs.length, mode);\n }\n getMinMax() {\n const meta = this._cachedMeta;\n const range = {\n min: Number.POSITIVE_INFINITY,\n max: Number.NEGATIVE_INFINITY\n };\n meta.data.forEach((element, index)=>{\n const parsed = this.getParsed(index).r;\n if (!isNaN(parsed) && this.chart.getDataVisibility(index)) {\n if (parsed < range.min) {\n range.min = parsed;\n }\n if (parsed > range.max) {\n range.max = parsed;\n }\n }\n });\n return range;\n }\n _updateRadius() {\n const chart = this.chart;\n const chartArea = chart.chartArea;\n const opts = chart.options;\n const minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top);\n const outerRadius = Math.max(minSize / 2, 0);\n const innerRadius = Math.max(opts.cutoutPercentage ? outerRadius / 100 * opts.cutoutPercentage : 1, 0);\n const radiusLength = (outerRadius - innerRadius) / chart.getVisibleDatasetCount();\n this.outerRadius = outerRadius - radiusLength * this.index;\n this.innerRadius = this.outerRadius - radiusLength;\n }\n updateElements(arcs, start, count, mode) {\n const reset = mode === \'reset\';\n const chart = this.chart;\n const opts = chart.options;\n const animationOpts = opts.animation;\n const scale = this._cachedMeta.rScale;\n const centerX = scale.xCenter;\n const centerY = scale.yCenter;\n const datasetStartAngle = scale.getIndexAngle(0) - 0.5 * PI;\n let angle = datasetStartAngle;\n let i;\n const defaultAngle = 360 / this.countVisibleElements();\n for(i = 0; i < start; ++i){\n angle += this._computeAngle(i, mode, defaultAngle);\n }\n for(i = start; i < start + count; i++){\n const arc = arcs[i];\n let startAngle = angle;\n let endAngle = angle + this._computeAngle(i, mode, defaultAngle);\n let outerRadius = chart.getDataVisibility(i) ? scale.getDistanceFromCenterForValue(this.getParsed(i).r) : 0;\n angle = endAngle;\n if (reset) {\n if (animationOpts.animateScale) {\n outerRadius = 0;\n }\n if (animationOpts.animateRotate) {\n startAngle = endAngle = datasetStartAngle;\n }\n }\n const properties = {\n x: centerX,\n y: centerY,\n innerRadius: 0,\n outerRadius,\n startAngle,\n endAngle,\n options: this.resolveDataElementOptions(i, arc.active ? \'active\' : mode)\n };\n this.updateElement(arc, i, properties, mode);\n }\n }\n countVisibleElements() {\n const meta = this._cachedMeta;\n let count = 0;\n meta.data.forEach((element, index)=>{\n if (!isNaN(this.getParsed(index).r) && this.chart.getDataVisibility(index)) {\n count++;\n }\n });\n return count;\n }\n _computeAngle(index, mode, defaultAngle) {\n return this.chart.getDataVisibility(index) ? toRadians(this.resolveDataElementOptions(index, mode).angle || defaultAngle) : 0;\n }\n}\n\nclass PieController extends DoughnutController {\n static id = \'pie\';\n static defaults = {\n cutout: 0,\n rotation: 0,\n circumference: 360,\n radius: \'100%\'\n };\n}\n\nclass RadarController extends DatasetController {\n static id = \'radar\';\n static defaults = {\n datasetElementType: \'line\',\n dataElementType: \'point\',\n indexAxis: \'r\',\n showLine: true,\n elements: {\n line: {\n fill: \'start\'\n }\n }\n };\n static overrides = {\n aspectRatio: 1,\n scales: {\n r: {\n type: \'radialLinear\'\n }\n }\n };\n getLabelAndValue(index) {\n const vScale = this._cachedMeta.vScale;\n const parsed = this.getParsed(index);\n return {\n label: vScale.getLabels()[index],\n value: \'\' + vScale.getLabelForValue(parsed[vScale.axis])\n };\n }\n parseObjectData(meta, data, start, count) {\n return _parseObjectDataRadialScale.bind(this)(meta, data, start, count);\n }\n update(mode) {\n const meta = this._cachedMeta;\n const line = meta.dataset;\n const points = meta.data || [];\n const labels = meta.iScale.getLabels();\n line.points = points;\n if (mode !== \'resize\') {\n const options = this.resolveDatasetElementOptions(mode);\n if (!this.options.showLine) {\n options.borderWidth = 0;\n }\n const properties = {\n _loop: true,\n _fullLoop: labels.length === points.length,\n options\n };\n this.updateElement(line, undefined, properties, mode);\n }\n this.updateElements(points, 0, points.length, mode);\n }\n updateElements(points, start, count, mode) {\n const scale = this._cachedMeta.rScale;\n const reset = mode === \'reset\';\n for(let i = start; i < start + count; i++){\n const point = points[i];\n const options = this.resolveDataElementOptions(i, point.active ? \'active\' : mode);\n const pointPosition = scale.getPointPositionForValue(i, this.getParsed(i).r);\n const x = reset ? scale.xCenter : pointPosition.x;\n const y = reset ? scale.yCenter : pointPosition.y;\n const properties = {\n x,\n y,\n angle: pointPosition.angle,\n skip: isNaN(x) || isNaN(y),\n options\n };\n this.updateElement(point, i, properties, mode);\n }\n }\n}\n\nclass ScatterController extends DatasetController {\n static id = \'scatter\';\n static defaults = {\n datasetElementType: false,\n dataElementType: \'point\',\n showLine: false,\n fill: false\n };\n static overrides = {\n interaction: {\n mode: \'point\'\n },\n scales: {\n x: {\n type: \'linear\'\n },\n y: {\n type: \'linear\'\n }\n }\n };\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const labels = this.chart.data.labels || [];\n const { xScale , yScale } = meta;\n const parsed = this.getParsed(index);\n const x = xScale.getLabelForValue(parsed.x);\n const y = yScale.getLabelForValue(parsed.y);\n return {\n label: labels[index] || \'\',\n value: \'(\' + x + \', \' + y + \')\'\n };\n }\n update(mode) {\n const meta = this._cachedMeta;\n const { data: points = [] } = meta;\n const animationsDisabled = this.chart._animationsDisabled;\n let { start , count } = _getStartAndCountOfVisiblePoints(meta, points, animationsDisabled);\n this._drawStart = start;\n this._drawCount = count;\n if (_scaleRangesChanged(meta)) {\n start = 0;\n count = points.length;\n }\n if (this.options.showLine) {\n if (!this.datasetElementType) {\n this.addElements();\n }\n const { dataset: line , _dataset } = meta;\n line._chart = this.chart;\n line._datasetIndex = this.index;\n line._decimated = !!_dataset._decimated;\n line.points = points;\n const options = this.resolveDatasetElementOptions(mode);\n options.segment = this.options.segment;\n this.updateElement(line, undefined, {\n animated: !animationsDisabled,\n options\n }, mode);\n } else if (this.datasetElementType) {\n delete meta.dataset;\n this.datasetElementType = false;\n }\n this.updateElements(points, start, count, mode);\n }\n addElements() {\n const { showLine } = this.options;\n if (!this.datasetElementType && showLine) {\n this.datasetElementType = this.chart.registry.getElement(\'line\');\n }\n super.addElements();\n }\n updateElements(points, start, count, mode) {\n const reset = mode === \'reset\';\n const { iScale , vScale , _stacked , _dataset } = this._cachedMeta;\n const firstOpts = this.resolveDataElementOptions(start, mode);\n const sharedOptions = this.getSharedOptions(firstOpts);\n const includeOptions = this.includeOptions(mode, sharedOptions);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const { spanGaps , segment } = this.options;\n const maxGapLength = isNumber(spanGaps) ? spanGaps : Number.POSITIVE_INFINITY;\n const directUpdate = this.chart._animationsDisabled || reset || mode === \'none\';\n let prevParsed = start > 0 && this.getParsed(start - 1);\n for(let i = start; i < start + count; ++i){\n const point = points[i];\n const parsed = this.getParsed(i);\n const properties = directUpdate ? point : {};\n const nullData = isNullOrUndef(parsed[vAxis]);\n const iPixel = properties[iAxis] = iScale.getPixelForValue(parsed[iAxis], i);\n const vPixel = properties[vAxis] = reset || nullData ? vScale.getBasePixel() : vScale.getPixelForValue(_stacked ? this.applyStack(vScale, parsed, _stacked) : parsed[vAxis], i);\n properties.skip = isNaN(iPixel) || isNaN(vPixel) || nullData;\n properties.stop = i > 0 && Math.abs(parsed[iAxis] - prevParsed[iAxis]) > maxGapLength;\n if (segment) {\n properties.parsed = parsed;\n properties.raw = _dataset.data[i];\n }\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? \'active\' : mode);\n }\n if (!directUpdate) {\n this.updateElement(point, i, properties, mode);\n }\n prevParsed = parsed;\n }\n this.updateSharedOptions(sharedOptions, mode, firstOpts);\n }\n getMaxOverflow() {\n const meta = this._cachedMeta;\n const data = meta.data || [];\n if (!this.options.showLine) {\n let max = 0;\n for(let i = data.length - 1; i >= 0; --i){\n max = Math.max(max, data[i].size(this.resolveDataElementOptions(i)) / 2);\n }\n return max > 0 && max;\n }\n const dataset = meta.dataset;\n const border = dataset.options && dataset.options.borderWidth || 0;\n if (!data.length) {\n return border;\n }\n const firstPoint = data[0].size(this.resolveDataElementOptions(0));\n const lastPoint = data[data.length - 1].size(this.resolveDataElementOptions(data.length - 1));\n return Math.max(border, firstPoint, lastPoint) / 2;\n }\n}\n\nvar controllers = /*#__PURE__*/Object.freeze({\n__proto__: null,\nBarController: BarController,\nBubbleController: BubbleController,\nDoughnutController: DoughnutController,\nLineController: LineController,\nPieController: PieController,\nPolarAreaController: PolarAreaController,\nRadarController: RadarController,\nScatterController: ScatterController\n});\n\n/**\n * @namespace Chart._adapters\n * @since 2.8.0\n * @private\n */ function chart_abstract() {\n throw new Error(\'This method is not implemented: Check that a complete date adapter is provided.\');\n}\n/**\n * Date adapter (current used by the time scale)\n * @namespace Chart._adapters._date\n * @memberof Chart._adapters\n * @private\n */ class DateAdapterBase {\n /**\n * Override default date adapter methods.\n * Accepts type parameter to define options type.\n * @example\n * Chart._adapters._date.override<{myAdapterOption: string}>({\n * init() {\n * console.log(this.options.myAdapterOption);\n * }\n * })\n */ static override(members) {\n Object.assign(DateAdapterBase.prototype, members);\n }\n options;\n constructor(options){\n this.options = options || {};\n }\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n init() {}\n formats() {\n return chart_abstract();\n }\n parse() {\n return chart_abstract();\n }\n format() {\n return chart_abstract();\n }\n add() {\n return chart_abstract();\n }\n diff() {\n return chart_abstract();\n }\n startOf() {\n return chart_abstract();\n }\n endOf() {\n return chart_abstract();\n }\n}\nvar adapters = {\n _date: DateAdapterBase\n};\n\nfunction binarySearch(metaset, axis, value, intersect) {\n const { controller , data , _sorted } = metaset;\n const iScale = controller._cachedMeta.iScale;\n if (iScale && axis === iScale.axis && axis !== \'r\' && _sorted && data.length) {\n const lookupMethod = iScale._reversePixels ? _rlookupByKey : _lookupByKey;\n if (!intersect) {\n return lookupMethod(data, axis, value);\n } else if (controller._sharedOptions) {\n const el = data[0];\n const range = typeof el.getRange === \'function\' && el.getRange(axis);\n if (range) {\n const start = lookupMethod(data, axis, value - range);\n const end = lookupMethod(data, axis, value + range);\n return {\n lo: start.lo,\n hi: end.hi\n };\n }\n }\n }\n return {\n lo: 0,\n hi: data.length - 1\n };\n}\n function evaluateInteractionItems(chart, axis, position, handler, intersect) {\n const metasets = chart.getSortedVisibleDatasetMetas();\n const value = position[axis];\n for(let i = 0, ilen = metasets.length; i < ilen; ++i){\n const { index , data } = metasets[i];\n const { lo , hi } = binarySearch(metasets[i], axis, value, intersect);\n for(let j = lo; j <= hi; ++j){\n const element = data[j];\n if (!element.skip) {\n handler(element, index, j);\n }\n }\n }\n}\n function getDistanceMetricForAxis(axis) {\n const useX = axis.indexOf(\'x\') !== -1;\n const useY = axis.indexOf(\'y\') !== -1;\n return function(pt1, pt2) {\n const deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0;\n const deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0;\n return Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2));\n };\n}\n function getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) {\n const items = [];\n if (!includeInvisible && !chart.isPointInArea(position)) {\n return items;\n }\n const evaluationFunc = function(element, datasetIndex, index) {\n if (!includeInvisible && !_isPointInArea(element, chart.chartArea, 0)) {\n return;\n }\n if (element.inRange(position.x, position.y, useFinalPosition)) {\n items.push({\n element,\n datasetIndex,\n index\n });\n }\n };\n evaluateInteractionItems(chart, axis, position, evaluationFunc, true);\n return items;\n}\n function getNearestRadialItems(chart, position, axis, useFinalPosition) {\n let items = [];\n function evaluationFunc(element, datasetIndex, index) {\n const { startAngle , endAngle } = element.getProps([\n \'startAngle\',\n \'endAngle\'\n ], useFinalPosition);\n const { angle } = getAngleFromPoint(element, {\n x: position.x,\n y: position.y\n });\n if (_angleBetween(angle, startAngle, endAngle)) {\n items.push({\n element,\n datasetIndex,\n index\n });\n }\n }\n evaluateInteractionItems(chart, axis, position, evaluationFunc);\n return items;\n}\n function getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition, includeInvisible) {\n let items = [];\n const distanceMetric = getDistanceMetricForAxis(axis);\n let minDistance = Number.POSITIVE_INFINITY;\n function evaluationFunc(element, datasetIndex, index) {\n const inRange = element.inRange(position.x, position.y, useFinalPosition);\n if (intersect && !inRange) {\n return;\n }\n const center = element.getCenterPoint(useFinalPosition);\n const pointInArea = !!includeInvisible || chart.isPointInArea(center);\n if (!pointInArea && !inRange) {\n return;\n }\n const distance = distanceMetric(position, center);\n if (distance < minDistance) {\n items = [\n {\n element,\n datasetIndex,\n index\n }\n ];\n minDistance = distance;\n } else if (distance === minDistance) {\n items.push({\n element,\n datasetIndex,\n index\n });\n }\n }\n evaluateInteractionItems(chart, axis, position, evaluationFunc);\n return items;\n}\n function getNearestItems(chart, position, axis, intersect, useFinalPosition, includeInvisible) {\n if (!includeInvisible && !chart.isPointInArea(position)) {\n return [];\n }\n return axis === \'r\' && !intersect ? getNearestRadialItems(chart, position, axis, useFinalPosition) : getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition, includeInvisible);\n}\n function getAxisItems(chart, position, axis, intersect, useFinalPosition) {\n const items = [];\n const rangeMethod = axis === \'x\' ? \'inXRange\' : \'inYRange\';\n let intersectsItem = false;\n evaluateInteractionItems(chart, axis, position, (element, datasetIndex, index)=>{\n if (element[rangeMethod](position[axis], useFinalPosition)) {\n items.push({\n element,\n datasetIndex,\n index\n });\n intersectsItem = intersectsItem || element.inRange(position.x, position.y, useFinalPosition);\n }\n });\n if (intersect && !intersectsItem) {\n return [];\n }\n return items;\n}\n var Interaction = {\n evaluateInteractionItems,\n modes: {\n index (chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || \'x\';\n const includeInvisible = options.includeInvisible || false;\n const items = options.intersect ? getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) : getNearestItems(chart, position, axis, false, useFinalPosition, includeInvisible);\n const elements = [];\n if (!items.length) {\n return [];\n }\n chart.getSortedVisibleDatasetMetas().forEach((meta)=>{\n const index = items[0].index;\n const element = meta.data[index];\n if (element && !element.skip) {\n elements.push({\n element,\n datasetIndex: meta.index,\n index\n });\n }\n });\n return elements;\n },\n dataset (chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || \'xy\';\n const includeInvisible = options.includeInvisible || false;\n let items = options.intersect ? getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) : getNearestItems(chart, position, axis, false, useFinalPosition, includeInvisible);\n if (items.length > 0) {\n const datasetIndex = items[0].datasetIndex;\n const data = chart.getDatasetMeta(datasetIndex).data;\n items = [];\n for(let i = 0; i < data.length; ++i){\n items.push({\n element: data[i],\n datasetIndex,\n index: i\n });\n }\n }\n return items;\n },\n point (chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || \'xy\';\n const includeInvisible = options.includeInvisible || false;\n return getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible);\n },\n nearest (chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || \'xy\';\n const includeInvisible = options.includeInvisible || false;\n return getNearestItems(chart, position, axis, options.intersect, useFinalPosition, includeInvisible);\n },\n x (chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n return getAxisItems(chart, position, \'x\', options.intersect, useFinalPosition);\n },\n y (chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n return getAxisItems(chart, position, \'y\', options.intersect, useFinalPosition);\n }\n }\n};\n\nconst STATIC_POSITIONS = [\n \'left\',\n \'top\',\n \'right\',\n \'bottom\'\n];\nfunction filterByPosition(array, position) {\n return array.filter((v)=>v.pos === position);\n}\nfunction filterDynamicPositionByAxis(array, axis) {\n return array.filter((v)=>STATIC_POSITIONS.indexOf(v.pos) === -1 && v.box.axis === axis);\n}\nfunction sortByWeight(array, reverse) {\n return array.sort((a, b)=>{\n const v0 = reverse ? b : a;\n const v1 = reverse ? a : b;\n return v0.weight === v1.weight ? v0.index - v1.index : v0.weight - v1.weight;\n });\n}\nfunction wrapBoxes(boxes) {\n const layoutBoxes = [];\n let i, ilen, box, pos, stack, stackWeight;\n for(i = 0, ilen = (boxes || []).length; i < ilen; ++i){\n box = boxes[i];\n ({ position: pos , options: { stack , stackWeight =1 } } = box);\n layoutBoxes.push({\n index: i,\n box,\n pos,\n horizontal: box.isHorizontal(),\n weight: box.weight,\n stack: stack && pos + stack,\n stackWeight\n });\n }\n return layoutBoxes;\n}\nfunction buildStacks(layouts) {\n const stacks = {};\n for (const wrap of layouts){\n const { stack , pos , stackWeight } = wrap;\n if (!stack || !STATIC_POSITIONS.includes(pos)) {\n continue;\n }\n const _stack = stacks[stack] || (stacks[stack] = {\n count: 0,\n placed: 0,\n weight: 0,\n size: 0\n });\n _stack.count++;\n _stack.weight += stackWeight;\n }\n return stacks;\n}\n function setLayoutDims(layouts, params) {\n const stacks = buildStacks(layouts);\n const { vBoxMaxWidth , hBoxMaxHeight } = params;\n let i, ilen, layout;\n for(i = 0, ilen = layouts.length; i < ilen; ++i){\n layout = layouts[i];\n const { fullSize } = layout.box;\n const stack = stacks[layout.stack];\n const factor = stack && layout.stackWeight / stack.weight;\n if (layout.horizontal) {\n layout.width = factor ? factor * vBoxMaxWidth : fullSize && params.availableWidth;\n layout.height = hBoxMaxHeight;\n } else {\n layout.width = vBoxMaxWidth;\n layout.height = factor ? factor * hBoxMaxHeight : fullSize && params.availableHeight;\n }\n }\n return stacks;\n}\nfunction buildLayoutBoxes(boxes) {\n const layoutBoxes = wrapBoxes(boxes);\n const fullSize = sortByWeight(layoutBoxes.filter((wrap)=>wrap.box.fullSize), true);\n const left = sortByWeight(filterByPosition(layoutBoxes, \'left\'), true);\n const right = sortByWeight(filterByPosition(layoutBoxes, \'right\'));\n const top = sortByWeight(filterByPosition(layoutBoxes, \'top\'), true);\n const bottom = sortByWeight(filterByPosition(layoutBoxes, \'bottom\'));\n const centerHorizontal = filterDynamicPositionByAxis(layoutBoxes, \'x\');\n const centerVertical = filterDynamicPositionByAxis(layoutBoxes, \'y\');\n return {\n fullSize,\n leftAndTop: left.concat(top),\n rightAndBottom: right.concat(centerVertical).concat(bottom).concat(centerHorizontal),\n chartArea: filterByPosition(layoutBoxes, \'chartArea\'),\n vertical: left.concat(right).concat(centerVertical),\n horizontal: top.concat(bottom).concat(centerHorizontal)\n };\n}\nfunction getCombinedMax(maxPadding, chartArea, a, b) {\n return Math.max(maxPadding[a], chartArea[a]) + Math.max(maxPadding[b], chartArea[b]);\n}\nfunction updateMaxPadding(maxPadding, boxPadding) {\n maxPadding.top = Math.max(maxPadding.top, boxPadding.top);\n maxPadding.left = Math.max(maxPadding.left, boxPadding.left);\n maxPadding.bottom = Math.max(maxPadding.bottom, boxPadding.bottom);\n maxPadding.right = Math.max(maxPadding.right, boxPadding.right);\n}\nfunction updateDims(chartArea, params, layout, stacks) {\n const { pos , box } = layout;\n const maxPadding = chartArea.maxPadding;\n if (!isObject(pos)) {\n if (layout.size) {\n chartArea[pos] -= layout.size;\n }\n const stack = stacks[layout.stack] || {\n size: 0,\n count: 1\n };\n stack.size = Math.max(stack.size, layout.horizontal ? box.height : box.width);\n layout.size = stack.size / stack.count;\n chartArea[pos] += layout.size;\n }\n if (box.getPadding) {\n updateMaxPadding(maxPadding, box.getPadding());\n }\n const newWidth = Math.max(0, params.outerWidth - getCombinedMax(maxPadding, chartArea, \'left\', \'right\'));\n const newHeight = Math.max(0, params.outerHeight - getCombinedMax(maxPadding, chartArea, \'top\', \'bottom\'));\n const widthChanged = newWidth !== chartArea.w;\n const heightChanged = newHeight !== chartArea.h;\n chartArea.w = newWidth;\n chartArea.h = newHeight;\n return layout.horizontal ? {\n same: widthChanged,\n other: heightChanged\n } : {\n same: heightChanged,\n other: widthChanged\n };\n}\nfunction handleMaxPadding(chartArea) {\n const maxPadding = chartArea.maxPadding;\n function updatePos(pos) {\n const change = Math.max(maxPadding[pos] - chartArea[pos], 0);\n chartArea[pos] += change;\n return change;\n }\n chartArea.y += updatePos(\'top\');\n chartArea.x += updatePos(\'left\');\n updatePos(\'right\');\n updatePos(\'bottom\');\n}\nfunction getMargins(horizontal, chartArea) {\n const maxPadding = chartArea.maxPadding;\n function marginForPositions(positions) {\n const margin = {\n left: 0,\n top: 0,\n right: 0,\n bottom: 0\n };\n positions.forEach((pos)=>{\n margin[pos] = Math.max(chartArea[pos], maxPadding[pos]);\n });\n return margin;\n }\n return horizontal ? marginForPositions([\n \'left\',\n \'right\'\n ]) : marginForPositions([\n \'top\',\n \'bottom\'\n ]);\n}\nfunction fitBoxes(boxes, chartArea, params, stacks) {\n const refitBoxes = [];\n let i, ilen, layout, box, refit, changed;\n for(i = 0, ilen = boxes.length, refit = 0; i < ilen; ++i){\n layout = boxes[i];\n box = layout.box;\n box.update(layout.width || chartArea.w, layout.height || chartArea.h, getMargins(layout.horizontal, chartArea));\n const { same , other } = updateDims(chartArea, params, layout, stacks);\n refit |= same && refitBoxes.length;\n changed = changed || other;\n if (!box.fullSize) {\n refitBoxes.push(layout);\n }\n }\n return refit && fitBoxes(refitBoxes, chartArea, params, stacks) || changed;\n}\nfunction setBoxDims(box, left, top, width, height) {\n box.top = top;\n box.left = left;\n box.right = left + width;\n box.bottom = top + height;\n box.width = width;\n box.height = height;\n}\nfunction placeBoxes(boxes, chartArea, params, stacks) {\n const userPadding = params.padding;\n let { x , y } = chartArea;\n for (const layout of boxes){\n const box = layout.box;\n const stack = stacks[layout.stack] || {\n count: 1,\n placed: 0,\n weight: 1\n };\n const weight = layout.stackWeight / stack.weight || 1;\n if (layout.horizontal) {\n const width = chartArea.w * weight;\n const height = stack.size || box.height;\n if (defined(stack.start)) {\n y = stack.start;\n }\n if (box.fullSize) {\n setBoxDims(box, userPadding.left, y, params.outerWidth - userPadding.right - userPadding.left, height);\n } else {\n setBoxDims(box, chartArea.left + stack.placed, y, width, height);\n }\n stack.start = y;\n stack.placed += width;\n y = box.bottom;\n } else {\n const height = chartArea.h * weight;\n const width = stack.size || box.width;\n if (defined(stack.start)) {\n x = stack.start;\n }\n if (box.fullSize) {\n setBoxDims(box, x, userPadding.top, width, params.outerHeight - userPadding.bottom - userPadding.top);\n } else {\n setBoxDims(box, x, chartArea.top + stack.placed, width, height);\n }\n stack.start = x;\n stack.placed += height;\n x = box.right;\n }\n }\n chartArea.x = x;\n chartArea.y = y;\n}\nvar layouts = {\n addBox (chart, item) {\n if (!chart.boxes) {\n chart.boxes = [];\n }\n item.fullSize = item.fullSize || false;\n item.position = item.position || \'top\';\n item.weight = item.weight || 0;\n item._layers = item._layers || function() {\n return [\n {\n z: 0,\n draw (chartArea) {\n item.draw(chartArea);\n }\n }\n ];\n };\n chart.boxes.push(item);\n },\n removeBox (chart, layoutItem) {\n const index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1;\n if (index !== -1) {\n chart.boxes.splice(index, 1);\n }\n },\n configure (chart, item, options) {\n item.fullSize = options.fullSize;\n item.position = options.position;\n item.weight = options.weight;\n },\n update (chart, width, height, minPadding) {\n if (!chart) {\n return;\n }\n const padding = toPadding(chart.options.layout.padding);\n const availableWidth = Math.max(width - padding.width, 0);\n const availableHeight = Math.max(height - padding.height, 0);\n const boxes = buildLayoutBoxes(chart.boxes);\n const verticalBoxes = boxes.vertical;\n const horizontalBoxes = boxes.horizontal;\n helpers_segment_each(chart.boxes, (box)=>{\n if (typeof box.beforeLayout === \'function\') {\n box.beforeLayout();\n }\n });\n const visibleVerticalBoxCount = verticalBoxes.reduce((total, wrap)=>wrap.box.options && wrap.box.options.display === false ? total : total + 1, 0) || 1;\n const params = Object.freeze({\n outerWidth: width,\n outerHeight: height,\n padding,\n availableWidth,\n availableHeight,\n vBoxMaxWidth: availableWidth / 2 / visibleVerticalBoxCount,\n hBoxMaxHeight: availableHeight / 2\n });\n const maxPadding = Object.assign({}, padding);\n updateMaxPadding(maxPadding, toPadding(minPadding));\n const chartArea = Object.assign({\n maxPadding,\n w: availableWidth,\n h: availableHeight,\n x: padding.left,\n y: padding.top\n }, padding);\n const stacks = setLayoutDims(verticalBoxes.concat(horizontalBoxes), params);\n fitBoxes(boxes.fullSize, chartArea, params, stacks);\n fitBoxes(verticalBoxes, chartArea, params, stacks);\n if (fitBoxes(horizontalBoxes, chartArea, params, stacks)) {\n fitBoxes(verticalBoxes, chartArea, params, stacks);\n }\n handleMaxPadding(chartArea);\n placeBoxes(boxes.leftAndTop, chartArea, params, stacks);\n chartArea.x += chartArea.w;\n chartArea.y += chartArea.h;\n placeBoxes(boxes.rightAndBottom, chartArea, params, stacks);\n chart.chartArea = {\n left: chartArea.left,\n top: chartArea.top,\n right: chartArea.left + chartArea.w,\n bottom: chartArea.top + chartArea.h,\n height: chartArea.h,\n width: chartArea.w\n };\n helpers_segment_each(boxes.chartArea, (layout)=>{\n const box = layout.box;\n Object.assign(box, chart.chartArea);\n box.update(chartArea.w, chartArea.h, {\n left: 0,\n top: 0,\n right: 0,\n bottom: 0\n });\n });\n }\n};\n\nclass BasePlatform {\n acquireContext(canvas, aspectRatio) {}\n releaseContext(context) {\n return false;\n }\n addEventListener(chart, type, listener) {}\n removeEventListener(chart, type, listener) {}\n getDevicePixelRatio() {\n return 1;\n }\n getMaximumSize(element, width, height, aspectRatio) {\n width = Math.max(0, width || element.width);\n height = height || element.height;\n return {\n width,\n height: Math.max(0, aspectRatio ? Math.floor(width / aspectRatio) : height)\n };\n }\n isAttached(canvas) {\n return true;\n }\n updateConfig(config) {\n }\n}\n\nclass BasicPlatform extends BasePlatform {\n acquireContext(item) {\n return item && item.getContext && item.getContext(\'2d\') || null;\n }\n updateConfig(config) {\n config.options.animation = false;\n }\n}\n\nconst EXPANDO_KEY = \'$chartjs\';\n const EVENT_TYPES = {\n touchstart: \'mousedown\',\n touchmove: \'mousemove\',\n touchend: \'mouseup\',\n pointerenter: \'mouseenter\',\n pointerdown: \'mousedown\',\n pointermove: \'mousemove\',\n pointerup: \'mouseup\',\n pointerleave: \'mouseout\',\n pointerout: \'mouseout\'\n};\nconst isNullOrEmpty = (value)=>value === null || value === \'\';\n function initCanvas(canvas, aspectRatio) {\n const style = canvas.style;\n const renderHeight = canvas.getAttribute(\'height\');\n const renderWidth = canvas.getAttribute(\'width\');\n canvas[EXPANDO_KEY] = {\n initial: {\n height: renderHeight,\n width: renderWidth,\n style: {\n display: style.display,\n height: style.height,\n width: style.width\n }\n }\n };\n style.display = style.display || \'block\';\n style.boxSizing = style.boxSizing || \'border-box\';\n if (isNullOrEmpty(renderWidth)) {\n const displayWidth = readUsedSize(canvas, \'width\');\n if (displayWidth !== undefined) {\n canvas.width = displayWidth;\n }\n }\n if (isNullOrEmpty(renderHeight)) {\n if (canvas.style.height === \'\') {\n canvas.height = canvas.width / (aspectRatio || 2);\n } else {\n const displayHeight = readUsedSize(canvas, \'height\');\n if (displayHeight !== undefined) {\n canvas.height = displayHeight;\n }\n }\n }\n return canvas;\n}\nconst eventListenerOptions = supportsEventListenerOptions ? {\n passive: true\n} : false;\nfunction addListener(node, type, listener) {\n node.addEventListener(type, listener, eventListenerOptions);\n}\nfunction removeListener(chart, type, listener) {\n chart.canvas.removeEventListener(type, listener, eventListenerOptions);\n}\nfunction fromNativeEvent(event, chart) {\n const type = EVENT_TYPES[event.type] || event.type;\n const { x , y } = getRelativePosition(event, chart);\n return {\n type,\n chart,\n native: event,\n x: x !== undefined ? x : null,\n y: y !== undefined ? y : null\n };\n}\nfunction nodeListContains(nodeList, canvas) {\n for (const node of nodeList){\n if (node === canvas || node.contains(canvas)) {\n return true;\n }\n }\n}\nfunction createAttachObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const observer = new MutationObserver((entries)=>{\n let trigger = false;\n for (const entry of entries){\n trigger = trigger || nodeListContains(entry.addedNodes, canvas);\n trigger = trigger && !nodeListContains(entry.removedNodes, canvas);\n }\n if (trigger) {\n listener();\n }\n });\n observer.observe(document, {\n childList: true,\n subtree: true\n });\n return observer;\n}\nfunction createDetachObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const observer = new MutationObserver((entries)=>{\n let trigger = false;\n for (const entry of entries){\n trigger = trigger || nodeListContains(entry.removedNodes, canvas);\n trigger = trigger && !nodeListContains(entry.addedNodes, canvas);\n }\n if (trigger) {\n listener();\n }\n });\n observer.observe(document, {\n childList: true,\n subtree: true\n });\n return observer;\n}\nconst drpListeningCharts = new Map();\nlet oldDevicePixelRatio = 0;\nfunction onWindowResize() {\n const dpr = window.devicePixelRatio;\n if (dpr === oldDevicePixelRatio) {\n return;\n }\n oldDevicePixelRatio = dpr;\n drpListeningCharts.forEach((resize, chart)=>{\n if (chart.currentDevicePixelRatio !== dpr) {\n resize();\n }\n });\n}\nfunction listenDevicePixelRatioChanges(chart, resize) {\n if (!drpListeningCharts.size) {\n window.addEventListener(\'resize\', onWindowResize);\n }\n drpListeningCharts.set(chart, resize);\n}\nfunction unlistenDevicePixelRatioChanges(chart) {\n drpListeningCharts.delete(chart);\n if (!drpListeningCharts.size) {\n window.removeEventListener(\'resize\', onWindowResize);\n }\n}\nfunction createResizeObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const container = canvas && _getParentNode(canvas);\n if (!container) {\n return;\n }\n const resize = throttled((width, height)=>{\n const w = container.clientWidth;\n listener(width, height);\n if (w < container.clientWidth) {\n listener();\n }\n }, window);\n const observer = new ResizeObserver((entries)=>{\n const entry = entries[0];\n const width = entry.contentRect.width;\n const height = entry.contentRect.height;\n if (width === 0 && height === 0) {\n return;\n }\n resize(width, height);\n });\n observer.observe(container);\n listenDevicePixelRatioChanges(chart, resize);\n return observer;\n}\nfunction releaseObserver(chart, type, observer) {\n if (observer) {\n observer.disconnect();\n }\n if (type === \'resize\') {\n unlistenDevicePixelRatioChanges(chart);\n }\n}\nfunction createProxyAndListen(chart, type, listener) {\n const canvas = chart.canvas;\n const proxy = throttled((event)=>{\n if (chart.ctx !== null) {\n listener(fromNativeEvent(event, chart));\n }\n }, chart);\n addListener(canvas, type, proxy);\n return proxy;\n}\n class DomPlatform extends BasePlatform {\n acquireContext(canvas, aspectRatio) {\n const context = canvas && canvas.getContext && canvas.getContext(\'2d\');\n if (context && context.canvas === canvas) {\n initCanvas(canvas, aspectRatio);\n return context;\n }\n return null;\n }\n releaseContext(context) {\n const canvas = context.canvas;\n if (!canvas[EXPANDO_KEY]) {\n return false;\n }\n const initial = canvas[EXPANDO_KEY].initial;\n [\n \'height\',\n \'width\'\n ].forEach((prop)=>{\n const value = initial[prop];\n if (isNullOrUndef(value)) {\n canvas.removeAttribute(prop);\n } else {\n canvas.setAttribute(prop, value);\n }\n });\n const style = initial.style || {};\n Object.keys(style).forEach((key)=>{\n canvas.style[key] = style[key];\n });\n canvas.width = canvas.width;\n delete canvas[EXPANDO_KEY];\n return true;\n }\n addEventListener(chart, type, listener) {\n this.removeEventListener(chart, type);\n const proxies = chart.$proxies || (chart.$proxies = {});\n const handlers = {\n attach: createAttachObserver,\n detach: createDetachObserver,\n resize: createResizeObserver\n };\n const handler = handlers[type] || createProxyAndListen;\n proxies[type] = handler(chart, type, listener);\n }\n removeEventListener(chart, type) {\n const proxies = chart.$proxies || (chart.$proxies = {});\n const proxy = proxies[type];\n if (!proxy) {\n return;\n }\n const handlers = {\n attach: releaseObserver,\n detach: releaseObserver,\n resize: releaseObserver\n };\n const handler = handlers[type] || removeListener;\n handler(chart, type, proxy);\n proxies[type] = undefined;\n }\n getDevicePixelRatio() {\n return window.devicePixelRatio;\n }\n getMaximumSize(canvas, width, height, aspectRatio) {\n return getMaximumSize(canvas, width, height, aspectRatio);\n }\n isAttached(canvas) {\n const container = _getParentNode(canvas);\n return !!(container && container.isConnected);\n }\n}\n\nfunction _detectPlatform(canvas) {\n if (!_isDomSupported() || typeof OffscreenCanvas !== \'undefined\' && canvas instanceof OffscreenCanvas) {\n return BasicPlatform;\n }\n return DomPlatform;\n}\n\nclass chart_Element {\n static defaults = {};\n static defaultRoutes = undefined;\n x;\n y;\n active = false;\n options;\n $animations;\n tooltipPosition(useFinalPosition) {\n const { x , y } = this.getProps([\n \'x\',\n \'y\'\n ], useFinalPosition);\n return {\n x,\n y\n };\n }\n hasValue() {\n return isNumber(this.x) && isNumber(this.y);\n }\n getProps(props, final) {\n const anims = this.$animations;\n if (!final || !anims) {\n // let\'s not create an object, if not needed\n return this;\n }\n const ret = {};\n props.forEach((prop)=>{\n ret[prop] = anims[prop] && anims[prop].active() ? anims[prop]._to : this[prop];\n });\n return ret;\n }\n}\n\nfunction autoSkip(scale, ticks) {\n const tickOpts = scale.options.ticks;\n const determinedMaxTicks = determineMaxTicks(scale);\n const ticksLimit = Math.min(tickOpts.maxTicksLimit || determinedMaxTicks, determinedMaxTicks);\n const majorIndices = tickOpts.major.enabled ? getMajorIndices(ticks) : [];\n const numMajorIndices = majorIndices.length;\n const first = majorIndices[0];\n const last = majorIndices[numMajorIndices - 1];\n const newTicks = [];\n if (numMajorIndices > ticksLimit) {\n skipMajors(ticks, newTicks, majorIndices, numMajorIndices / ticksLimit);\n return newTicks;\n }\n const spacing = calculateSpacing(majorIndices, ticks, ticksLimit);\n if (numMajorIndices > 0) {\n let i, ilen;\n const avgMajorSpacing = numMajorIndices > 1 ? Math.round((last - first) / (numMajorIndices - 1)) : null;\n skip(ticks, newTicks, spacing, isNullOrUndef(avgMajorSpacing) ? 0 : first - avgMajorSpacing, first);\n for(i = 0, ilen = numMajorIndices - 1; i < ilen; i++){\n skip(ticks, newTicks, spacing, majorIndices[i], majorIndices[i + 1]);\n }\n skip(ticks, newTicks, spacing, last, isNullOrUndef(avgMajorSpacing) ? ticks.length : last + avgMajorSpacing);\n return newTicks;\n }\n skip(ticks, newTicks, spacing);\n return newTicks;\n}\nfunction determineMaxTicks(scale) {\n const offset = scale.options.offset;\n const tickLength = scale._tickSize();\n const maxScale = scale._length / tickLength + (offset ? 0 : 1);\n const maxChart = scale._maxLength / tickLength;\n return Math.floor(Math.min(maxScale, maxChart));\n}\n function calculateSpacing(majorIndices, ticks, ticksLimit) {\n const evenMajorSpacing = getEvenSpacing(majorIndices);\n const spacing = ticks.length / ticksLimit;\n if (!evenMajorSpacing) {\n return Math.max(spacing, 1);\n }\n const factors = _factorize(evenMajorSpacing);\n for(let i = 0, ilen = factors.length - 1; i < ilen; i++){\n const factor = factors[i];\n if (factor > spacing) {\n return factor;\n }\n }\n return Math.max(spacing, 1);\n}\n function getMajorIndices(ticks) {\n const result = [];\n let i, ilen;\n for(i = 0, ilen = ticks.length; i < ilen; i++){\n if (ticks[i].major) {\n result.push(i);\n }\n }\n return result;\n}\n function skipMajors(ticks, newTicks, majorIndices, spacing) {\n let count = 0;\n let next = majorIndices[0];\n let i;\n spacing = Math.ceil(spacing);\n for(i = 0; i < ticks.length; i++){\n if (i === next) {\n newTicks.push(ticks[i]);\n count++;\n next = majorIndices[count * spacing];\n }\n }\n}\n function skip(ticks, newTicks, spacing, majorStart, majorEnd) {\n const start = valueOrDefault(majorStart, 0);\n const end = Math.min(valueOrDefault(majorEnd, ticks.length), ticks.length);\n let count = 0;\n let length, i, next;\n spacing = Math.ceil(spacing);\n if (majorEnd) {\n length = majorEnd - majorStart;\n spacing = length / Math.floor(length / spacing);\n }\n next = start;\n while(next < 0){\n count++;\n next = Math.round(start + count * spacing);\n }\n for(i = Math.max(start, 0); i < end; i++){\n if (i === next) {\n newTicks.push(ticks[i]);\n count++;\n next = Math.round(start + count * spacing);\n }\n }\n}\n function getEvenSpacing(arr) {\n const len = arr.length;\n let i, diff;\n if (len < 2) {\n return false;\n }\n for(diff = arr[0], i = 1; i < len; ++i){\n if (arr[i] - arr[i - 1] !== diff) {\n return false;\n }\n }\n return diff;\n}\n\nconst reverseAlign = (align)=>align === \'left\' ? \'right\' : align === \'right\' ? \'left\' : align;\nconst offsetFromEdge = (scale, edge, offset)=>edge === \'top\' || edge === \'left\' ? scale[edge] + offset : scale[edge] - offset;\nconst getTicksLimit = (ticksLength, maxTicksLimit)=>Math.min(maxTicksLimit || ticksLength, ticksLength);\n function sample(arr, numItems) {\n const result = [];\n const increment = arr.length / numItems;\n const len = arr.length;\n let i = 0;\n for(; i < len; i += increment){\n result.push(arr[Math.floor(i)]);\n }\n return result;\n}\n function getPixelForGridLine(scale, index, offsetGridLines) {\n const length = scale.ticks.length;\n const validIndex = Math.min(index, length - 1);\n const start = scale._startPixel;\n const end = scale._endPixel;\n const epsilon = 1e-6;\n let lineValue = scale.getPixelForTick(validIndex);\n let offset;\n if (offsetGridLines) {\n if (length === 1) {\n offset = Math.max(lineValue - start, end - lineValue);\n } else if (index === 0) {\n offset = (scale.getPixelForTick(1) - lineValue) / 2;\n } else {\n offset = (lineValue - scale.getPixelForTick(validIndex - 1)) / 2;\n }\n lineValue += validIndex < index ? offset : -offset;\n if (lineValue < start - epsilon || lineValue > end + epsilon) {\n return;\n }\n }\n return lineValue;\n}\n function garbageCollect(caches, length) {\n helpers_segment_each(caches, (cache)=>{\n const gc = cache.gc;\n const gcLen = gc.length / 2;\n let i;\n if (gcLen > length) {\n for(i = 0; i < gcLen; ++i){\n delete cache.data[gc[i]];\n }\n gc.splice(0, gcLen);\n }\n });\n}\n function getTickMarkLength(options) {\n return options.drawTicks ? options.tickLength : 0;\n}\n function getTitleHeight(options, fallback) {\n if (!options.display) {\n return 0;\n }\n const font = toFont(options.font, fallback);\n const padding = toPadding(options.padding);\n const lines = isArray(options.text) ? options.text.length : 1;\n return lines * font.lineHeight + padding.height;\n}\nfunction createScaleContext(parent, scale) {\n return createContext(parent, {\n scale,\n type: \'scale\'\n });\n}\nfunction createTickContext(parent, index, tick) {\n return createContext(parent, {\n tick,\n index,\n type: \'tick\'\n });\n}\nfunction titleAlign(align, position, reverse) {\n let ret = _toLeftRightCenter(align);\n if (reverse && position !== \'right\' || !reverse && position === \'right\') {\n ret = reverseAlign(ret);\n }\n return ret;\n}\nfunction titleArgs(scale, offset, position, align) {\n const { top , left , bottom , right , chart } = scale;\n const { chartArea , scales } = chart;\n let rotation = 0;\n let maxWidth, titleX, titleY;\n const height = bottom - top;\n const width = right - left;\n if (scale.isHorizontal()) {\n titleX = _alignStartEnd(align, left, right);\n if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n titleY = scales[positionAxisID].getPixelForValue(value) + height - offset;\n } else if (position === \'center\') {\n titleY = (chartArea.bottom + chartArea.top) / 2 + height - offset;\n } else {\n titleY = offsetFromEdge(scale, position, offset);\n }\n maxWidth = right - left;\n } else {\n if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n titleX = scales[positionAxisID].getPixelForValue(value) - width + offset;\n } else if (position === \'center\') {\n titleX = (chartArea.left + chartArea.right) / 2 - width + offset;\n } else {\n titleX = offsetFromEdge(scale, position, offset);\n }\n titleY = _alignStartEnd(align, bottom, top);\n rotation = position === \'left\' ? -HALF_PI : HALF_PI;\n }\n return {\n titleX,\n titleY,\n maxWidth,\n rotation\n };\n}\nclass Scale extends chart_Element {\n constructor(cfg){\n super();\n this.id = cfg.id;\n this.type = cfg.type;\n this.options = undefined;\n this.ctx = cfg.ctx;\n this.chart = cfg.chart;\n this.top = undefined;\n this.bottom = undefined;\n this.left = undefined;\n this.right = undefined;\n this.width = undefined;\n this.height = undefined;\n this._margins = {\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n };\n this.maxWidth = undefined;\n this.maxHeight = undefined;\n this.paddingTop = undefined;\n this.paddingBottom = undefined;\n this.paddingLeft = undefined;\n this.paddingRight = undefined;\n this.axis = undefined;\n this.labelRotation = undefined;\n this.min = undefined;\n this.max = undefined;\n this._range = undefined;\n this.ticks = [];\n this._gridLineItems = null;\n this._labelItems = null;\n this._labelSizes = null;\n this._length = 0;\n this._maxLength = 0;\n this._longestTextCache = {};\n this._startPixel = undefined;\n this._endPixel = undefined;\n this._reversePixels = false;\n this._userMax = undefined;\n this._userMin = undefined;\n this._suggestedMax = undefined;\n this._suggestedMin = undefined;\n this._ticksLength = 0;\n this._borderValue = 0;\n this._cache = {};\n this._dataLimitsCached = false;\n this.$context = undefined;\n }\n init(options) {\n this.options = options.setContext(this.getContext());\n this.axis = options.axis;\n this._userMin = this.parse(options.min);\n this._userMax = this.parse(options.max);\n this._suggestedMin = this.parse(options.suggestedMin);\n this._suggestedMax = this.parse(options.suggestedMax);\n }\n parse(raw, index) {\n return raw;\n }\n getUserBounds() {\n let { _userMin , _userMax , _suggestedMin , _suggestedMax } = this;\n _userMin = finiteOrDefault(_userMin, Number.POSITIVE_INFINITY);\n _userMax = finiteOrDefault(_userMax, Number.NEGATIVE_INFINITY);\n _suggestedMin = finiteOrDefault(_suggestedMin, Number.POSITIVE_INFINITY);\n _suggestedMax = finiteOrDefault(_suggestedMax, Number.NEGATIVE_INFINITY);\n return {\n min: finiteOrDefault(_userMin, _suggestedMin),\n max: finiteOrDefault(_userMax, _suggestedMax),\n minDefined: isNumberFinite(_userMin),\n maxDefined: isNumberFinite(_userMax)\n };\n }\n getMinMax(canStack) {\n let { min , max , minDefined , maxDefined } = this.getUserBounds();\n let range;\n if (minDefined && maxDefined) {\n return {\n min,\n max\n };\n }\n const metas = this.getMatchingVisibleMetas();\n for(let i = 0, ilen = metas.length; i < ilen; ++i){\n range = metas[i].controller.getMinMax(this, canStack);\n if (!minDefined) {\n min = Math.min(min, range.min);\n }\n if (!maxDefined) {\n max = Math.max(max, range.max);\n }\n }\n min = maxDefined && min > max ? max : min;\n max = minDefined && min > max ? min : max;\n return {\n min: finiteOrDefault(min, finiteOrDefault(max, min)),\n max: finiteOrDefault(max, finiteOrDefault(min, max))\n };\n }\n getPadding() {\n return {\n left: this.paddingLeft || 0,\n top: this.paddingTop || 0,\n right: this.paddingRight || 0,\n bottom: this.paddingBottom || 0\n };\n }\n getTicks() {\n return this.ticks;\n }\n getLabels() {\n const data = this.chart.data;\n return this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels || [];\n }\n getLabelItems(chartArea = this.chart.chartArea) {\n const items = this._labelItems || (this._labelItems = this._computeLabelItems(chartArea));\n return items;\n }\n beforeLayout() {\n this._cache = {};\n this._dataLimitsCached = false;\n }\n beforeUpdate() {\n callback(this.options.beforeUpdate, [\n this\n ]);\n }\n update(maxWidth, maxHeight, margins) {\n const { beginAtZero , grace , ticks: tickOpts } = this.options;\n const sampleSize = tickOpts.sampleSize;\n this.beforeUpdate();\n this.maxWidth = maxWidth;\n this.maxHeight = maxHeight;\n this._margins = margins = Object.assign({\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n }, margins);\n this.ticks = null;\n this._labelSizes = null;\n this._gridLineItems = null;\n this._labelItems = null;\n this.beforeSetDimensions();\n this.setDimensions();\n this.afterSetDimensions();\n this._maxLength = this.isHorizontal() ? this.width + margins.left + margins.right : this.height + margins.top + margins.bottom;\n if (!this._dataLimitsCached) {\n this.beforeDataLimits();\n this.determineDataLimits();\n this.afterDataLimits();\n this._range = _addGrace(this, grace, beginAtZero);\n this._dataLimitsCached = true;\n }\n this.beforeBuildTicks();\n this.ticks = this.buildTicks() || [];\n this.afterBuildTicks();\n const samplingEnabled = sampleSize < this.ticks.length;\n this._convertTicksToLabels(samplingEnabled ? sample(this.ticks, sampleSize) : this.ticks);\n this.configure();\n this.beforeCalculateLabelRotation();\n this.calculateLabelRotation();\n this.afterCalculateLabelRotation();\n if (tickOpts.display && (tickOpts.autoSkip || tickOpts.source === \'auto\')) {\n this.ticks = autoSkip(this, this.ticks);\n this._labelSizes = null;\n this.afterAutoSkip();\n }\n if (samplingEnabled) {\n this._convertTicksToLabels(this.ticks);\n }\n this.beforeFit();\n this.fit();\n this.afterFit();\n this.afterUpdate();\n }\n configure() {\n let reversePixels = this.options.reverse;\n let startPixel, endPixel;\n if (this.isHorizontal()) {\n startPixel = this.left;\n endPixel = this.right;\n } else {\n startPixel = this.top;\n endPixel = this.bottom;\n reversePixels = !reversePixels;\n }\n this._startPixel = startPixel;\n this._endPixel = endPixel;\n this._reversePixels = reversePixels;\n this._length = endPixel - startPixel;\n this._alignToPixels = this.options.alignToPixels;\n }\n afterUpdate() {\n callback(this.options.afterUpdate, [\n this\n ]);\n }\n beforeSetDimensions() {\n callback(this.options.beforeSetDimensions, [\n this\n ]);\n }\n setDimensions() {\n if (this.isHorizontal()) {\n this.width = this.maxWidth;\n this.left = 0;\n this.right = this.width;\n } else {\n this.height = this.maxHeight;\n this.top = 0;\n this.bottom = this.height;\n }\n this.paddingLeft = 0;\n this.paddingTop = 0;\n this.paddingRight = 0;\n this.paddingBottom = 0;\n }\n afterSetDimensions() {\n callback(this.options.afterSetDimensions, [\n this\n ]);\n }\n _callHooks(name) {\n this.chart.notifyPlugins(name, this.getContext());\n callback(this.options[name], [\n this\n ]);\n }\n beforeDataLimits() {\n this._callHooks(\'beforeDataLimits\');\n }\n determineDataLimits() {}\n afterDataLimits() {\n this._callHooks(\'afterDataLimits\');\n }\n beforeBuildTicks() {\n this._callHooks(\'beforeBuildTicks\');\n }\n buildTicks() {\n return [];\n }\n afterBuildTicks() {\n this._callHooks(\'afterBuildTicks\');\n }\n beforeTickToLabelConversion() {\n callback(this.options.beforeTickToLabelConversion, [\n this\n ]);\n }\n generateTickLabels(ticks) {\n const tickOpts = this.options.ticks;\n let i, ilen, tick;\n for(i = 0, ilen = ticks.length; i < ilen; i++){\n tick = ticks[i];\n tick.label = callback(tickOpts.callback, [\n tick.value,\n i,\n ticks\n ], this);\n }\n }\n afterTickToLabelConversion() {\n callback(this.options.afterTickToLabelConversion, [\n this\n ]);\n }\n beforeCalculateLabelRotation() {\n callback(this.options.beforeCalculateLabelRotation, [\n this\n ]);\n }\n calculateLabelRotation() {\n const options = this.options;\n const tickOpts = options.ticks;\n const numTicks = getTicksLimit(this.ticks.length, options.ticks.maxTicksLimit);\n const minRotation = tickOpts.minRotation || 0;\n const maxRotation = tickOpts.maxRotation;\n let labelRotation = minRotation;\n let tickWidth, maxHeight, maxLabelDiagonal;\n if (!this._isVisible() || !tickOpts.display || minRotation >= maxRotation || numTicks <= 1 || !this.isHorizontal()) {\n this.labelRotation = minRotation;\n return;\n }\n const labelSizes = this._getLabelSizes();\n const maxLabelWidth = labelSizes.widest.width;\n const maxLabelHeight = labelSizes.highest.height;\n const maxWidth = _limitValue(this.chart.width - maxLabelWidth, 0, this.maxWidth);\n tickWidth = options.offset ? this.maxWidth / numTicks : maxWidth / (numTicks - 1);\n if (maxLabelWidth + 6 > tickWidth) {\n tickWidth = maxWidth / (numTicks - (options.offset ? 0.5 : 1));\n maxHeight = this.maxHeight - getTickMarkLength(options.grid) - tickOpts.padding - getTitleHeight(options.title, this.chart.options.font);\n maxLabelDiagonal = Math.sqrt(maxLabelWidth * maxLabelWidth + maxLabelHeight * maxLabelHeight);\n labelRotation = toDegrees(Math.min(Math.asin(_limitValue((labelSizes.highest.height + 6) / tickWidth, -1, 1)), Math.asin(_limitValue(maxHeight / maxLabelDiagonal, -1, 1)) - Math.asin(_limitValue(maxLabelHeight / maxLabelDiagonal, -1, 1))));\n labelRotation = Math.max(minRotation, Math.min(maxRotation, labelRotation));\n }\n this.labelRotation = labelRotation;\n }\n afterCalculateLabelRotation() {\n callback(this.options.afterCalculateLabelRotation, [\n this\n ]);\n }\n afterAutoSkip() {}\n beforeFit() {\n callback(this.options.beforeFit, [\n this\n ]);\n }\n fit() {\n const minSize = {\n width: 0,\n height: 0\n };\n const { chart , options: { ticks: tickOpts , title: titleOpts , grid: gridOpts } } = this;\n const display = this._isVisible();\n const isHorizontal = this.isHorizontal();\n if (display) {\n const titleHeight = getTitleHeight(titleOpts, chart.options.font);\n if (isHorizontal) {\n minSize.width = this.maxWidth;\n minSize.height = getTickMarkLength(gridOpts) + titleHeight;\n } else {\n minSize.height = this.maxHeight;\n minSize.width = getTickMarkLength(gridOpts) + titleHeight;\n }\n if (tickOpts.display && this.ticks.length) {\n const { first , last , widest , highest } = this._getLabelSizes();\n const tickPadding = tickOpts.padding * 2;\n const angleRadians = toRadians(this.labelRotation);\n const cos = Math.cos(angleRadians);\n const sin = Math.sin(angleRadians);\n if (isHorizontal) {\n const labelHeight = tickOpts.mirror ? 0 : sin * widest.width + cos * highest.height;\n minSize.height = Math.min(this.maxHeight, minSize.height + labelHeight + tickPadding);\n } else {\n const labelWidth = tickOpts.mirror ? 0 : cos * widest.width + sin * highest.height;\n minSize.width = Math.min(this.maxWidth, minSize.width + labelWidth + tickPadding);\n }\n this._calculatePadding(first, last, sin, cos);\n }\n }\n this._handleMargins();\n if (isHorizontal) {\n this.width = this._length = chart.width - this._margins.left - this._margins.right;\n this.height = minSize.height;\n } else {\n this.width = minSize.width;\n this.height = this._length = chart.height - this._margins.top - this._margins.bottom;\n }\n }\n _calculatePadding(first, last, sin, cos) {\n const { ticks: { align , padding } , position } = this.options;\n const isRotated = this.labelRotation !== 0;\n const labelsBelowTicks = position !== \'top\' && this.axis === \'x\';\n if (this.isHorizontal()) {\n const offsetLeft = this.getPixelForTick(0) - this.left;\n const offsetRight = this.right - this.getPixelForTick(this.ticks.length - 1);\n let paddingLeft = 0;\n let paddingRight = 0;\n if (isRotated) {\n if (labelsBelowTicks) {\n paddingLeft = cos * first.width;\n paddingRight = sin * last.height;\n } else {\n paddingLeft = sin * first.height;\n paddingRight = cos * last.width;\n }\n } else if (align === \'start\') {\n paddingRight = last.width;\n } else if (align === \'end\') {\n paddingLeft = first.width;\n } else if (align !== \'inner\') {\n paddingLeft = first.width / 2;\n paddingRight = last.width / 2;\n }\n this.paddingLeft = Math.max((paddingLeft - offsetLeft + padding) * this.width / (this.width - offsetLeft), 0);\n this.paddingRight = Math.max((paddingRight - offsetRight + padding) * this.width / (this.width - offsetRight), 0);\n } else {\n let paddingTop = last.height / 2;\n let paddingBottom = first.height / 2;\n if (align === \'start\') {\n paddingTop = 0;\n paddingBottom = first.height;\n } else if (align === \'end\') {\n paddingTop = last.height;\n paddingBottom = 0;\n }\n this.paddingTop = paddingTop + padding;\n this.paddingBottom = paddingBottom + padding;\n }\n }\n _handleMargins() {\n if (this._margins) {\n this._margins.left = Math.max(this.paddingLeft, this._margins.left);\n this._margins.top = Math.max(this.paddingTop, this._margins.top);\n this._margins.right = Math.max(this.paddingRight, this._margins.right);\n this._margins.bottom = Math.max(this.paddingBottom, this._margins.bottom);\n }\n }\n afterFit() {\n callback(this.options.afterFit, [\n this\n ]);\n }\n isHorizontal() {\n const { axis , position } = this.options;\n return position === \'top\' || position === \'bottom\' || axis === \'x\';\n }\n isFullSize() {\n return this.options.fullSize;\n }\n _convertTicksToLabels(ticks) {\n this.beforeTickToLabelConversion();\n this.generateTickLabels(ticks);\n let i, ilen;\n for(i = 0, ilen = ticks.length; i < ilen; i++){\n if (isNullOrUndef(ticks[i].label)) {\n ticks.splice(i, 1);\n ilen--;\n i--;\n }\n }\n this.afterTickToLabelConversion();\n }\n _getLabelSizes() {\n let labelSizes = this._labelSizes;\n if (!labelSizes) {\n const sampleSize = this.options.ticks.sampleSize;\n let ticks = this.ticks;\n if (sampleSize < ticks.length) {\n ticks = sample(ticks, sampleSize);\n }\n this._labelSizes = labelSizes = this._computeLabelSizes(ticks, ticks.length, this.options.ticks.maxTicksLimit);\n }\n return labelSizes;\n }\n _computeLabelSizes(ticks, length, maxTicksLimit) {\n const { ctx , _longestTextCache: caches } = this;\n const widths = [];\n const heights = [];\n const increment = Math.floor(length / getTicksLimit(length, maxTicksLimit));\n let widestLabelSize = 0;\n let highestLabelSize = 0;\n let i, j, jlen, label, tickFont, fontString, cache, lineHeight, width, height, nestedLabel;\n for(i = 0; i < length; i += increment){\n label = ticks[i].label;\n tickFont = this._resolveTickFontOptions(i);\n ctx.font = fontString = tickFont.string;\n cache = caches[fontString] = caches[fontString] || {\n data: {},\n gc: []\n };\n lineHeight = tickFont.lineHeight;\n width = height = 0;\n if (!isNullOrUndef(label) && !isArray(label)) {\n width = _measureText(ctx, cache.data, cache.gc, width, label);\n height = lineHeight;\n } else if (isArray(label)) {\n for(j = 0, jlen = label.length; j < jlen; ++j){\n nestedLabel = label[j];\n if (!isNullOrUndef(nestedLabel) && !isArray(nestedLabel)) {\n width = _measureText(ctx, cache.data, cache.gc, width, nestedLabel);\n height += lineHeight;\n }\n }\n }\n widths.push(width);\n heights.push(height);\n widestLabelSize = Math.max(width, widestLabelSize);\n highestLabelSize = Math.max(height, highestLabelSize);\n }\n garbageCollect(caches, length);\n const widest = widths.indexOf(widestLabelSize);\n const highest = heights.indexOf(highestLabelSize);\n const valueAt = (idx)=>({\n width: widths[idx] || 0,\n height: heights[idx] || 0\n });\n return {\n first: valueAt(0),\n last: valueAt(length - 1),\n widest: valueAt(widest),\n highest: valueAt(highest),\n widths,\n heights\n };\n }\n getLabelForValue(value) {\n return value;\n }\n getPixelForValue(value, index) {\n return NaN;\n }\n getValueForPixel(pixel) {}\n getPixelForTick(index) {\n const ticks = this.ticks;\n if (index < 0 || index > ticks.length - 1) {\n return null;\n }\n return this.getPixelForValue(ticks[index].value);\n }\n getPixelForDecimal(decimal) {\n if (this._reversePixels) {\n decimal = 1 - decimal;\n }\n const pixel = this._startPixel + decimal * this._length;\n return _int16Range(this._alignToPixels ? _alignPixel(this.chart, pixel, 0) : pixel);\n }\n getDecimalForPixel(pixel) {\n const decimal = (pixel - this._startPixel) / this._length;\n return this._reversePixels ? 1 - decimal : decimal;\n }\n getBasePixel() {\n return this.getPixelForValue(this.getBaseValue());\n }\n getBaseValue() {\n const { min , max } = this;\n return min < 0 && max < 0 ? max : min > 0 && max > 0 ? min : 0;\n }\n getContext(index) {\n const ticks = this.ticks || [];\n if (index >= 0 && index < ticks.length) {\n const tick = ticks[index];\n return tick.$context || (tick.$context = createTickContext(this.getContext(), index, tick));\n }\n return this.$context || (this.$context = createScaleContext(this.chart.getContext(), this));\n }\n _tickSize() {\n const optionTicks = this.options.ticks;\n const rot = toRadians(this.labelRotation);\n const cos = Math.abs(Math.cos(rot));\n const sin = Math.abs(Math.sin(rot));\n const labelSizes = this._getLabelSizes();\n const padding = optionTicks.autoSkipPadding || 0;\n const w = labelSizes ? labelSizes.widest.width + padding : 0;\n const h = labelSizes ? labelSizes.highest.height + padding : 0;\n return this.isHorizontal() ? h * cos > w * sin ? w / cos : h / sin : h * sin < w * cos ? h / cos : w / sin;\n }\n _isVisible() {\n const display = this.options.display;\n if (display !== \'auto\') {\n return !!display;\n }\n return this.getMatchingVisibleMetas().length > 0;\n }\n _computeGridLineItems(chartArea) {\n const axis = this.axis;\n const chart = this.chart;\n const options = this.options;\n const { grid , position , border } = options;\n const offset = grid.offset;\n const isHorizontal = this.isHorizontal();\n const ticks = this.ticks;\n const ticksLength = ticks.length + (offset ? 1 : 0);\n const tl = getTickMarkLength(grid);\n const items = [];\n const borderOpts = border.setContext(this.getContext());\n const axisWidth = borderOpts.display ? borderOpts.width : 0;\n const axisHalfWidth = axisWidth / 2;\n const alignBorderValue = function(pixel) {\n return _alignPixel(chart, pixel, axisWidth);\n };\n let borderValue, i, lineValue, alignedLineValue;\n let tx1, ty1, tx2, ty2, x1, y1, x2, y2;\n if (position === \'top\') {\n borderValue = alignBorderValue(this.bottom);\n ty1 = this.bottom - tl;\n ty2 = borderValue - axisHalfWidth;\n y1 = alignBorderValue(chartArea.top) + axisHalfWidth;\n y2 = chartArea.bottom;\n } else if (position === \'bottom\') {\n borderValue = alignBorderValue(this.top);\n y1 = chartArea.top;\n y2 = alignBorderValue(chartArea.bottom) - axisHalfWidth;\n ty1 = borderValue + axisHalfWidth;\n ty2 = this.top + tl;\n } else if (position === \'left\') {\n borderValue = alignBorderValue(this.right);\n tx1 = this.right - tl;\n tx2 = borderValue - axisHalfWidth;\n x1 = alignBorderValue(chartArea.left) + axisHalfWidth;\n x2 = chartArea.right;\n } else if (position === \'right\') {\n borderValue = alignBorderValue(this.left);\n x1 = chartArea.left;\n x2 = alignBorderValue(chartArea.right) - axisHalfWidth;\n tx1 = borderValue + axisHalfWidth;\n tx2 = this.left + tl;\n } else if (axis === \'x\') {\n if (position === \'center\') {\n borderValue = alignBorderValue((chartArea.top + chartArea.bottom) / 2 + 0.5);\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n borderValue = alignBorderValue(this.chart.scales[positionAxisID].getPixelForValue(value));\n }\n y1 = chartArea.top;\n y2 = chartArea.bottom;\n ty1 = borderValue + axisHalfWidth;\n ty2 = ty1 + tl;\n } else if (axis === \'y\') {\n if (position === \'center\') {\n borderValue = alignBorderValue((chartArea.left + chartArea.right) / 2);\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n borderValue = alignBorderValue(this.chart.scales[positionAxisID].getPixelForValue(value));\n }\n tx1 = borderValue - axisHalfWidth;\n tx2 = tx1 - tl;\n x1 = chartArea.left;\n x2 = chartArea.right;\n }\n const limit = valueOrDefault(options.ticks.maxTicksLimit, ticksLength);\n const step = Math.max(1, Math.ceil(ticksLength / limit));\n for(i = 0; i < ticksLength; i += step){\n const context = this.getContext(i);\n const optsAtIndex = grid.setContext(context);\n const optsAtIndexBorder = border.setContext(context);\n const lineWidth = optsAtIndex.lineWidth;\n const lineColor = optsAtIndex.color;\n const borderDash = optsAtIndexBorder.dash || [];\n const borderDashOffset = optsAtIndexBorder.dashOffset;\n const tickWidth = optsAtIndex.tickWidth;\n const tickColor = optsAtIndex.tickColor;\n const tickBorderDash = optsAtIndex.tickBorderDash || [];\n const tickBorderDashOffset = optsAtIndex.tickBorderDashOffset;\n lineValue = getPixelForGridLine(this, i, offset);\n if (lineValue === undefined) {\n continue;\n }\n alignedLineValue = _alignPixel(chart, lineValue, lineWidth);\n if (isHorizontal) {\n tx1 = tx2 = x1 = x2 = alignedLineValue;\n } else {\n ty1 = ty2 = y1 = y2 = alignedLineValue;\n }\n items.push({\n tx1,\n ty1,\n tx2,\n ty2,\n x1,\n y1,\n x2,\n y2,\n width: lineWidth,\n color: lineColor,\n borderDash,\n borderDashOffset,\n tickWidth,\n tickColor,\n tickBorderDash,\n tickBorderDashOffset\n });\n }\n this._ticksLength = ticksLength;\n this._borderValue = borderValue;\n return items;\n }\n _computeLabelItems(chartArea) {\n const axis = this.axis;\n const options = this.options;\n const { position , ticks: optionTicks } = options;\n const isHorizontal = this.isHorizontal();\n const ticks = this.ticks;\n const { align , crossAlign , padding , mirror } = optionTicks;\n const tl = getTickMarkLength(options.grid);\n const tickAndPadding = tl + padding;\n const hTickAndPadding = mirror ? -padding : tickAndPadding;\n const rotation = -toRadians(this.labelRotation);\n const items = [];\n let i, ilen, tick, label, x, y, textAlign, pixel, font, lineHeight, lineCount, textOffset;\n let textBaseline = \'middle\';\n if (position === \'top\') {\n y = this.bottom - hTickAndPadding;\n textAlign = this._getXAxisLabelAlignment();\n } else if (position === \'bottom\') {\n y = this.top + hTickAndPadding;\n textAlign = this._getXAxisLabelAlignment();\n } else if (position === \'left\') {\n const ret = this._getYAxisLabelAlignment(tl);\n textAlign = ret.textAlign;\n x = ret.x;\n } else if (position === \'right\') {\n const ret = this._getYAxisLabelAlignment(tl);\n textAlign = ret.textAlign;\n x = ret.x;\n } else if (axis === \'x\') {\n if (position === \'center\') {\n y = (chartArea.top + chartArea.bottom) / 2 + tickAndPadding;\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n y = this.chart.scales[positionAxisID].getPixelForValue(value) + tickAndPadding;\n }\n textAlign = this._getXAxisLabelAlignment();\n } else if (axis === \'y\') {\n if (position === \'center\') {\n x = (chartArea.left + chartArea.right) / 2 - tickAndPadding;\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n x = this.chart.scales[positionAxisID].getPixelForValue(value);\n }\n textAlign = this._getYAxisLabelAlignment(tl).textAlign;\n }\n if (axis === \'y\') {\n if (align === \'start\') {\n textBaseline = \'top\';\n } else if (align === \'end\') {\n textBaseline = \'bottom\';\n }\n }\n const labelSizes = this._getLabelSizes();\n for(i = 0, ilen = ticks.length; i < ilen; ++i){\n tick = ticks[i];\n label = tick.label;\n const optsAtIndex = optionTicks.setContext(this.getContext(i));\n pixel = this.getPixelForTick(i) + optionTicks.labelOffset;\n font = this._resolveTickFontOptions(i);\n lineHeight = font.lineHeight;\n lineCount = isArray(label) ? label.length : 1;\n const halfCount = lineCount / 2;\n const color = optsAtIndex.color;\n const strokeColor = optsAtIndex.textStrokeColor;\n const strokeWidth = optsAtIndex.textStrokeWidth;\n let tickTextAlign = textAlign;\n if (isHorizontal) {\n x = pixel;\n if (textAlign === \'inner\') {\n if (i === ilen - 1) {\n tickTextAlign = !this.options.reverse ? \'right\' : \'left\';\n } else if (i === 0) {\n tickTextAlign = !this.options.reverse ? \'left\' : \'right\';\n } else {\n tickTextAlign = \'center\';\n }\n }\n if (position === \'top\') {\n if (crossAlign === \'near\' || rotation !== 0) {\n textOffset = -lineCount * lineHeight + lineHeight / 2;\n } else if (crossAlign === \'center\') {\n textOffset = -labelSizes.highest.height / 2 - halfCount * lineHeight + lineHeight;\n } else {\n textOffset = -labelSizes.highest.height + lineHeight / 2;\n }\n } else {\n if (crossAlign === \'near\' || rotation !== 0) {\n textOffset = lineHeight / 2;\n } else if (crossAlign === \'center\') {\n textOffset = labelSizes.highest.height / 2 - halfCount * lineHeight;\n } else {\n textOffset = labelSizes.highest.height - lineCount * lineHeight;\n }\n }\n if (mirror) {\n textOffset *= -1;\n }\n if (rotation !== 0 && !optsAtIndex.showLabelBackdrop) {\n x += lineHeight / 2 * Math.sin(rotation);\n }\n } else {\n y = pixel;\n textOffset = (1 - lineCount) * lineHeight / 2;\n }\n let backdrop;\n if (optsAtIndex.showLabelBackdrop) {\n const labelPadding = toPadding(optsAtIndex.backdropPadding);\n const height = labelSizes.heights[i];\n const width = labelSizes.widths[i];\n let top = textOffset - labelPadding.top;\n let left = 0 - labelPadding.left;\n switch(textBaseline){\n case \'middle\':\n top -= height / 2;\n break;\n case \'bottom\':\n top -= height;\n break;\n }\n switch(textAlign){\n case \'center\':\n left -= width / 2;\n break;\n case \'right\':\n left -= width;\n break;\n }\n backdrop = {\n left,\n top,\n width: width + labelPadding.width,\n height: height + labelPadding.height,\n color: optsAtIndex.backdropColor\n };\n }\n items.push({\n label,\n font,\n textOffset,\n options: {\n rotation,\n color,\n strokeColor,\n strokeWidth,\n textAlign: tickTextAlign,\n textBaseline,\n translation: [\n x,\n y\n ],\n backdrop\n }\n });\n }\n return items;\n }\n _getXAxisLabelAlignment() {\n const { position , ticks } = this.options;\n const rotation = -toRadians(this.labelRotation);\n if (rotation) {\n return position === \'top\' ? \'left\' : \'right\';\n }\n let align = \'center\';\n if (ticks.align === \'start\') {\n align = \'left\';\n } else if (ticks.align === \'end\') {\n align = \'right\';\n } else if (ticks.align === \'inner\') {\n align = \'inner\';\n }\n return align;\n }\n _getYAxisLabelAlignment(tl) {\n const { position , ticks: { crossAlign , mirror , padding } } = this.options;\n const labelSizes = this._getLabelSizes();\n const tickAndPadding = tl + padding;\n const widest = labelSizes.widest.width;\n let textAlign;\n let x;\n if (position === \'left\') {\n if (mirror) {\n x = this.right + padding;\n if (crossAlign === \'near\') {\n textAlign = \'left\';\n } else if (crossAlign === \'center\') {\n textAlign = \'center\';\n x += widest / 2;\n } else {\n textAlign = \'right\';\n x += widest;\n }\n } else {\n x = this.right - tickAndPadding;\n if (crossAlign === \'near\') {\n textAlign = \'right\';\n } else if (crossAlign === \'center\') {\n textAlign = \'center\';\n x -= widest / 2;\n } else {\n textAlign = \'left\';\n x = this.left;\n }\n }\n } else if (position === \'right\') {\n if (mirror) {\n x = this.left + padding;\n if (crossAlign === \'near\') {\n textAlign = \'right\';\n } else if (crossAlign === \'center\') {\n textAlign = \'center\';\n x -= widest / 2;\n } else {\n textAlign = \'left\';\n x -= widest;\n }\n } else {\n x = this.left + tickAndPadding;\n if (crossAlign === \'near\') {\n textAlign = \'left\';\n } else if (crossAlign === \'center\') {\n textAlign = \'center\';\n x += widest / 2;\n } else {\n textAlign = \'right\';\n x = this.right;\n }\n }\n } else {\n textAlign = \'right\';\n }\n return {\n textAlign,\n x\n };\n }\n _computeLabelArea() {\n if (this.options.ticks.mirror) {\n return;\n }\n const chart = this.chart;\n const position = this.options.position;\n if (position === \'left\' || position === \'right\') {\n return {\n top: 0,\n left: this.left,\n bottom: chart.height,\n right: this.right\n };\n }\n if (position === \'top\' || position === \'bottom\') {\n return {\n top: this.top,\n left: 0,\n bottom: this.bottom,\n right: chart.width\n };\n }\n }\n drawBackground() {\n const { ctx , options: { backgroundColor } , left , top , width , height } = this;\n if (backgroundColor) {\n ctx.save();\n ctx.fillStyle = backgroundColor;\n ctx.fillRect(left, top, width, height);\n ctx.restore();\n }\n }\n getLineWidthForValue(value) {\n const grid = this.options.grid;\n if (!this._isVisible() || !grid.display) {\n return 0;\n }\n const ticks = this.ticks;\n const index = ticks.findIndex((t)=>t.value === value);\n if (index >= 0) {\n const opts = grid.setContext(this.getContext(index));\n return opts.lineWidth;\n }\n return 0;\n }\n drawGrid(chartArea) {\n const grid = this.options.grid;\n const ctx = this.ctx;\n const items = this._gridLineItems || (this._gridLineItems = this._computeGridLineItems(chartArea));\n let i, ilen;\n const drawLine = (p1, p2, style)=>{\n if (!style.width || !style.color) {\n return;\n }\n ctx.save();\n ctx.lineWidth = style.width;\n ctx.strokeStyle = style.color;\n ctx.setLineDash(style.borderDash || []);\n ctx.lineDashOffset = style.borderDashOffset;\n ctx.beginPath();\n ctx.moveTo(p1.x, p1.y);\n ctx.lineTo(p2.x, p2.y);\n ctx.stroke();\n ctx.restore();\n };\n if (grid.display) {\n for(i = 0, ilen = items.length; i < ilen; ++i){\n const item = items[i];\n if (grid.drawOnChartArea) {\n drawLine({\n x: item.x1,\n y: item.y1\n }, {\n x: item.x2,\n y: item.y2\n }, item);\n }\n if (grid.drawTicks) {\n drawLine({\n x: item.tx1,\n y: item.ty1\n }, {\n x: item.tx2,\n y: item.ty2\n }, {\n color: item.tickColor,\n width: item.tickWidth,\n borderDash: item.tickBorderDash,\n borderDashOffset: item.tickBorderDashOffset\n });\n }\n }\n }\n }\n drawBorder() {\n const { chart , ctx , options: { border , grid } } = this;\n const borderOpts = border.setContext(this.getContext());\n const axisWidth = border.display ? borderOpts.width : 0;\n if (!axisWidth) {\n return;\n }\n const lastLineWidth = grid.setContext(this.getContext(0)).lineWidth;\n const borderValue = this._borderValue;\n let x1, x2, y1, y2;\n if (this.isHorizontal()) {\n x1 = _alignPixel(chart, this.left, axisWidth) - axisWidth / 2;\n x2 = _alignPixel(chart, this.right, lastLineWidth) + lastLineWidth / 2;\n y1 = y2 = borderValue;\n } else {\n y1 = _alignPixel(chart, this.top, axisWidth) - axisWidth / 2;\n y2 = _alignPixel(chart, this.bottom, lastLineWidth) + lastLineWidth / 2;\n x1 = x2 = borderValue;\n }\n ctx.save();\n ctx.lineWidth = borderOpts.width;\n ctx.strokeStyle = borderOpts.color;\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.stroke();\n ctx.restore();\n }\n drawLabels(chartArea) {\n const optionTicks = this.options.ticks;\n if (!optionTicks.display) {\n return;\n }\n const ctx = this.ctx;\n const area = this._computeLabelArea();\n if (area) {\n clipArea(ctx, area);\n }\n const items = this.getLabelItems(chartArea);\n for (const item of items){\n const renderTextOptions = item.options;\n const tickFont = item.font;\n const label = item.label;\n const y = item.textOffset;\n renderText(ctx, label, 0, y, tickFont, renderTextOptions);\n }\n if (area) {\n unclipArea(ctx);\n }\n }\n drawTitle() {\n const { ctx , options: { position , title , reverse } } = this;\n if (!title.display) {\n return;\n }\n const font = toFont(title.font);\n const padding = toPadding(title.padding);\n const align = title.align;\n let offset = font.lineHeight / 2;\n if (position === \'bottom\' || position === \'center\' || isObject(position)) {\n offset += padding.bottom;\n if (isArray(title.text)) {\n offset += font.lineHeight * (title.text.length - 1);\n }\n } else {\n offset += padding.top;\n }\n const { titleX , titleY , maxWidth , rotation } = titleArgs(this, offset, position, align);\n renderText(ctx, title.text, 0, 0, font, {\n color: title.color,\n maxWidth,\n rotation,\n textAlign: titleAlign(align, position, reverse),\n textBaseline: \'middle\',\n translation: [\n titleX,\n titleY\n ]\n });\n }\n draw(chartArea) {\n if (!this._isVisible()) {\n return;\n }\n this.drawBackground();\n this.drawGrid(chartArea);\n this.drawBorder();\n this.drawTitle();\n this.drawLabels(chartArea);\n }\n _layers() {\n const opts = this.options;\n const tz = opts.ticks && opts.ticks.z || 0;\n const gz = valueOrDefault(opts.grid && opts.grid.z, -1);\n const bz = valueOrDefault(opts.border && opts.border.z, 0);\n if (!this._isVisible() || this.draw !== Scale.prototype.draw) {\n return [\n {\n z: tz,\n draw: (chartArea)=>{\n this.draw(chartArea);\n }\n }\n ];\n }\n return [\n {\n z: gz,\n draw: (chartArea)=>{\n this.drawBackground();\n this.drawGrid(chartArea);\n this.drawTitle();\n }\n },\n {\n z: bz,\n draw: ()=>{\n this.drawBorder();\n }\n },\n {\n z: tz,\n draw: (chartArea)=>{\n this.drawLabels(chartArea);\n }\n }\n ];\n }\n getMatchingVisibleMetas(type) {\n const metas = this.chart.getSortedVisibleDatasetMetas();\n const axisID = this.axis + \'AxisID\';\n const result = [];\n let i, ilen;\n for(i = 0, ilen = metas.length; i < ilen; ++i){\n const meta = metas[i];\n if (meta[axisID] === this.id && (!type || meta.type === type)) {\n result.push(meta);\n }\n }\n return result;\n }\n _resolveTickFontOptions(index) {\n const opts = this.options.ticks.setContext(this.getContext(index));\n return toFont(opts.font);\n }\n _maxDigits() {\n const fontSize = this._resolveTickFontOptions(0).lineHeight;\n return (this.isHorizontal() ? this.width : this.height) / fontSize;\n }\n}\n\nclass TypedRegistry {\n constructor(type, scope, override){\n this.type = type;\n this.scope = scope;\n this.override = override;\n this.items = Object.create(null);\n }\n isForType(type) {\n return Object.prototype.isPrototypeOf.call(this.type.prototype, type.prototype);\n }\n register(item) {\n const proto = Object.getPrototypeOf(item);\n let parentScope;\n if (isIChartComponent(proto)) {\n parentScope = this.register(proto);\n }\n const items = this.items;\n const id = item.id;\n const scope = this.scope + \'.\' + id;\n if (!id) {\n throw new Error(\'class does not have id: \' + item);\n }\n if (id in items) {\n return scope;\n }\n items[id] = item;\n registerDefaults(item, scope, parentScope);\n if (this.override) {\n defaults.override(item.id, item.overrides);\n }\n return scope;\n }\n get(id) {\n return this.items[id];\n }\n unregister(item) {\n const items = this.items;\n const id = item.id;\n const scope = this.scope;\n if (id in items) {\n delete items[id];\n }\n if (scope && id in defaults[scope]) {\n delete defaults[scope][id];\n if (this.override) {\n delete overrides[id];\n }\n }\n }\n}\nfunction registerDefaults(item, scope, parentScope) {\n const itemDefaults = helpers_segment_merge(Object.create(null), [\n parentScope ? defaults.get(parentScope) : {},\n defaults.get(scope),\n item.defaults\n ]);\n defaults.set(scope, itemDefaults);\n if (item.defaultRoutes) {\n routeDefaults(scope, item.defaultRoutes);\n }\n if (item.descriptors) {\n defaults.describe(scope, item.descriptors);\n }\n}\nfunction routeDefaults(scope, routes) {\n Object.keys(routes).forEach((property)=>{\n const propertyParts = property.split(\'.\');\n const sourceName = propertyParts.pop();\n const sourceScope = [\n scope\n ].concat(propertyParts).join(\'.\');\n const parts = routes[property].split(\'.\');\n const targetName = parts.pop();\n const targetScope = parts.join(\'.\');\n defaults.route(sourceScope, sourceName, targetScope, targetName);\n });\n}\nfunction isIChartComponent(proto) {\n return \'id\' in proto && \'defaults\' in proto;\n}\n\nclass Registry {\n constructor(){\n this.controllers = new TypedRegistry(DatasetController, \'datasets\', true);\n this.elements = new TypedRegistry(chart_Element, \'elements\');\n this.plugins = new TypedRegistry(Object, \'plugins\');\n this.scales = new TypedRegistry(Scale, \'scales\');\n this._typedRegistries = [\n this.controllers,\n this.scales,\n this.elements\n ];\n }\n add(...args) {\n this._each(\'register\', args);\n }\n remove(...args) {\n this._each(\'unregister\', args);\n }\n addControllers(...args) {\n this._each(\'register\', args, this.controllers);\n }\n addElements(...args) {\n this._each(\'register\', args, this.elements);\n }\n addPlugins(...args) {\n this._each(\'register\', args, this.plugins);\n }\n addScales(...args) {\n this._each(\'register\', args, this.scales);\n }\n getController(id) {\n return this._get(id, this.controllers, \'controller\');\n }\n getElement(id) {\n return this._get(id, this.elements, \'element\');\n }\n getPlugin(id) {\n return this._get(id, this.plugins, \'plugin\');\n }\n getScale(id) {\n return this._get(id, this.scales, \'scale\');\n }\n removeControllers(...args) {\n this._each(\'unregister\', args, this.controllers);\n }\n removeElements(...args) {\n this._each(\'unregister\', args, this.elements);\n }\n removePlugins(...args) {\n this._each(\'unregister\', args, this.plugins);\n }\n removeScales(...args) {\n this._each(\'unregister\', args, this.scales);\n }\n _each(method, args, typedRegistry) {\n [\n ...args\n ].forEach((arg)=>{\n const reg = typedRegistry || this._getRegistryForType(arg);\n if (typedRegistry || reg.isForType(arg) || reg === this.plugins && arg.id) {\n this._exec(method, reg, arg);\n } else {\n helpers_segment_each(arg, (item)=>{\n const itemReg = typedRegistry || this._getRegistryForType(item);\n this._exec(method, itemReg, item);\n });\n }\n });\n }\n _exec(method, registry, component) {\n const camelMethod = _capitalize(method);\n callback(component[\'before\' + camelMethod], [], component);\n registry[method](component);\n callback(component[\'after\' + camelMethod], [], component);\n }\n _getRegistryForType(type) {\n for(let i = 0; i < this._typedRegistries.length; i++){\n const reg = this._typedRegistries[i];\n if (reg.isForType(type)) {\n return reg;\n }\n }\n return this.plugins;\n }\n _get(id, typedRegistry, type) {\n const item = typedRegistry.get(id);\n if (item === undefined) {\n throw new Error(\'"\' + id + \'" is not a registered \' + type + \'.\');\n }\n return item;\n }\n}\nvar registry = /* #__PURE__ */ new Registry();\n\nclass PluginService {\n constructor(){\n this._init = [];\n }\n notify(chart, hook, args, filter) {\n if (hook === \'beforeInit\') {\n this._init = this._createDescriptors(chart, true);\n this._notify(this._init, chart, \'install\');\n }\n const descriptors = filter ? this._descriptors(chart).filter(filter) : this._descriptors(chart);\n const result = this._notify(descriptors, chart, hook, args);\n if (hook === \'afterDestroy\') {\n this._notify(descriptors, chart, \'stop\');\n this._notify(this._init, chart, \'uninstall\');\n }\n return result;\n }\n _notify(descriptors, chart, hook, args) {\n args = args || {};\n for (const descriptor of descriptors){\n const plugin = descriptor.plugin;\n const method = plugin[hook];\n const params = [\n chart,\n args,\n descriptor.options\n ];\n if (callback(method, params, plugin) === false && args.cancelable) {\n return false;\n }\n }\n return true;\n }\n invalidate() {\n if (!isNullOrUndef(this._cache)) {\n this._oldCache = this._cache;\n this._cache = undefined;\n }\n }\n _descriptors(chart) {\n if (this._cache) {\n return this._cache;\n }\n const descriptors = this._cache = this._createDescriptors(chart);\n this._notifyStateChanges(chart);\n return descriptors;\n }\n _createDescriptors(chart, all) {\n const config = chart && chart.config;\n const options = valueOrDefault(config.options && config.options.plugins, {});\n const plugins = allPlugins(config);\n return options === false && !all ? [] : createDescriptors(chart, plugins, options, all);\n }\n _notifyStateChanges(chart) {\n const previousDescriptors = this._oldCache || [];\n const descriptors = this._cache;\n const diff = (a, b)=>a.filter((x)=>!b.some((y)=>x.plugin.id === y.plugin.id));\n this._notify(diff(previousDescriptors, descriptors), chart, \'stop\');\n this._notify(diff(descriptors, previousDescriptors), chart, \'start\');\n }\n}\n function allPlugins(config) {\n const localIds = {};\n const plugins = [];\n const keys = Object.keys(registry.plugins.items);\n for(let i = 0; i < keys.length; i++){\n plugins.push(registry.getPlugin(keys[i]));\n }\n const local = config.plugins || [];\n for(let i = 0; i < local.length; i++){\n const plugin = local[i];\n if (plugins.indexOf(plugin) === -1) {\n plugins.push(plugin);\n localIds[plugin.id] = true;\n }\n }\n return {\n plugins,\n localIds\n };\n}\nfunction getOpts(options, all) {\n if (!all && options === false) {\n return null;\n }\n if (options === true) {\n return {};\n }\n return options;\n}\nfunction createDescriptors(chart, { plugins , localIds }, options, all) {\n const result = [];\n const context = chart.getContext();\n for (const plugin of plugins){\n const id = plugin.id;\n const opts = getOpts(options[id], all);\n if (opts === null) {\n continue;\n }\n result.push({\n plugin,\n options: pluginOpts(chart.config, {\n plugin,\n local: localIds[id]\n }, opts, context)\n });\n }\n return result;\n}\nfunction pluginOpts(config, { plugin , local }, opts, context) {\n const keys = config.pluginScopeKeys(plugin);\n const scopes = config.getOptionScopes(opts, keys);\n if (local && plugin.defaults) {\n scopes.push(plugin.defaults);\n }\n return config.createResolver(scopes, context, [\n \'\'\n ], {\n scriptable: false,\n indexable: false,\n allKeys: true\n });\n}\n\nfunction getIndexAxis(type, options) {\n const datasetDefaults = defaults.datasets[type] || {};\n const datasetOptions = (options.datasets || {})[type] || {};\n return datasetOptions.indexAxis || options.indexAxis || datasetDefaults.indexAxis || \'x\';\n}\nfunction getAxisFromDefaultScaleID(id, indexAxis) {\n let axis = id;\n if (id === \'_index_\') {\n axis = indexAxis;\n } else if (id === \'_value_\') {\n axis = indexAxis === \'x\' ? \'y\' : \'x\';\n }\n return axis;\n}\nfunction getDefaultScaleIDFromAxis(axis, indexAxis) {\n return axis === indexAxis ? \'_index_\' : \'_value_\';\n}\nfunction idMatchesAxis(id) {\n if (id === \'x\' || id === \'y\' || id === \'r\') {\n return id;\n }\n}\nfunction axisFromPosition(position) {\n if (position === \'top\' || position === \'bottom\') {\n return \'x\';\n }\n if (position === \'left\' || position === \'right\') {\n return \'y\';\n }\n}\nfunction determineAxis(id, ...scaleOptions) {\n if (idMatchesAxis(id)) {\n return id;\n }\n for (const opts of scaleOptions){\n const axis = opts.axis || axisFromPosition(opts.position) || id.length > 1 && idMatchesAxis(id[0].toLowerCase());\n if (axis) {\n return axis;\n }\n }\n throw new Error(`Cannot determine type of \'${id}\' axis. Please provide \'axis\' or \'position\' option.`);\n}\nfunction getAxisFromDataset(id, axis, dataset) {\n if (dataset[axis + \'AxisID\'] === id) {\n return {\n axis\n };\n }\n}\nfunction retrieveAxisFromDatasets(id, config) {\n if (config.data && config.data.datasets) {\n const boundDs = config.data.datasets.filter((d)=>d.xAxisID === id || d.yAxisID === id);\n if (boundDs.length) {\n return getAxisFromDataset(id, \'x\', boundDs[0]) || getAxisFromDataset(id, \'y\', boundDs[0]);\n }\n }\n return {};\n}\nfunction mergeScaleConfig(config, options) {\n const chartDefaults = overrides[config.type] || {\n scales: {}\n };\n const configScales = options.scales || {};\n const chartIndexAxis = getIndexAxis(config.type, options);\n const scales = Object.create(null);\n Object.keys(configScales).forEach((id)=>{\n const scaleConf = configScales[id];\n if (!isObject(scaleConf)) {\n return console.error(`Invalid scale configuration for scale: ${id}`);\n }\n if (scaleConf._proxy) {\n return console.warn(`Ignoring resolver passed as options for scale: ${id}`);\n }\n const axis = determineAxis(id, scaleConf, retrieveAxisFromDatasets(id, config), defaults.scales[scaleConf.type]);\n const defaultId = getDefaultScaleIDFromAxis(axis, chartIndexAxis);\n const defaultScaleOptions = chartDefaults.scales || {};\n scales[id] = mergeIf(Object.create(null), [\n {\n axis\n },\n scaleConf,\n defaultScaleOptions[axis],\n defaultScaleOptions[defaultId]\n ]);\n });\n config.data.datasets.forEach((dataset)=>{\n const type = dataset.type || config.type;\n const indexAxis = dataset.indexAxis || getIndexAxis(type, options);\n const datasetDefaults = overrides[type] || {};\n const defaultScaleOptions = datasetDefaults.scales || {};\n Object.keys(defaultScaleOptions).forEach((defaultID)=>{\n const axis = getAxisFromDefaultScaleID(defaultID, indexAxis);\n const id = dataset[axis + \'AxisID\'] || axis;\n scales[id] = scales[id] || Object.create(null);\n mergeIf(scales[id], [\n {\n axis\n },\n configScales[id],\n defaultScaleOptions[defaultID]\n ]);\n });\n });\n Object.keys(scales).forEach((key)=>{\n const scale = scales[key];\n mergeIf(scale, [\n defaults.scales[scale.type],\n defaults.scale\n ]);\n });\n return scales;\n}\nfunction initOptions(config) {\n const options = config.options || (config.options = {});\n options.plugins = valueOrDefault(options.plugins, {});\n options.scales = mergeScaleConfig(config, options);\n}\nfunction initData(data) {\n data = data || {};\n data.datasets = data.datasets || [];\n data.labels = data.labels || [];\n return data;\n}\nfunction initConfig(config) {\n config = config || {};\n config.data = initData(config.data);\n initOptions(config);\n return config;\n}\nconst keyCache = new Map();\nconst keysCached = new Set();\nfunction cachedKeys(cacheKey, generate) {\n let keys = keyCache.get(cacheKey);\n if (!keys) {\n keys = generate();\n keyCache.set(cacheKey, keys);\n keysCached.add(keys);\n }\n return keys;\n}\nconst addIfFound = (set, obj, key)=>{\n const opts = resolveObjectKey(obj, key);\n if (opts !== undefined) {\n set.add(opts);\n }\n};\nclass Config {\n constructor(config){\n this._config = initConfig(config);\n this._scopeCache = new Map();\n this._resolverCache = new Map();\n }\n get platform() {\n return this._config.platform;\n }\n get type() {\n return this._config.type;\n }\n set type(type) {\n this._config.type = type;\n }\n get data() {\n return this._config.data;\n }\n set data(data) {\n this._config.data = initData(data);\n }\n get options() {\n return this._config.options;\n }\n set options(options) {\n this._config.options = options;\n }\n get plugins() {\n return this._config.plugins;\n }\n update() {\n const config = this._config;\n this.clearCache();\n initOptions(config);\n }\n clearCache() {\n this._scopeCache.clear();\n this._resolverCache.clear();\n }\n datasetScopeKeys(datasetType) {\n return cachedKeys(datasetType, ()=>[\n [\n `datasets.${datasetType}`,\n \'\'\n ]\n ]);\n }\n datasetAnimationScopeKeys(datasetType, transition) {\n return cachedKeys(`${datasetType}.transition.${transition}`, ()=>[\n [\n `datasets.${datasetType}.transitions.${transition}`,\n `transitions.${transition}`\n ],\n [\n `datasets.${datasetType}`,\n \'\'\n ]\n ]);\n }\n datasetElementScopeKeys(datasetType, elementType) {\n return cachedKeys(`${datasetType}-${elementType}`, ()=>[\n [\n `datasets.${datasetType}.elements.${elementType}`,\n `datasets.${datasetType}`,\n `elements.${elementType}`,\n \'\'\n ]\n ]);\n }\n pluginScopeKeys(plugin) {\n const id = plugin.id;\n const type = this.type;\n return cachedKeys(`${type}-plugin-${id}`, ()=>[\n [\n `plugins.${id}`,\n ...plugin.additionalOptionScopes || []\n ]\n ]);\n }\n _cachedScopes(mainScope, resetCache) {\n const _scopeCache = this._scopeCache;\n let cache = _scopeCache.get(mainScope);\n if (!cache || resetCache) {\n cache = new Map();\n _scopeCache.set(mainScope, cache);\n }\n return cache;\n }\n getOptionScopes(mainScope, keyLists, resetCache) {\n const { options , type } = this;\n const cache = this._cachedScopes(mainScope, resetCache);\n const cached = cache.get(keyLists);\n if (cached) {\n return cached;\n }\n const scopes = new Set();\n keyLists.forEach((keys)=>{\n if (mainScope) {\n scopes.add(mainScope);\n keys.forEach((key)=>addIfFound(scopes, mainScope, key));\n }\n keys.forEach((key)=>addIfFound(scopes, options, key));\n keys.forEach((key)=>addIfFound(scopes, overrides[type] || {}, key));\n keys.forEach((key)=>addIfFound(scopes, defaults, key));\n keys.forEach((key)=>addIfFound(scopes, descriptors, key));\n });\n const array = Array.from(scopes);\n if (array.length === 0) {\n array.push(Object.create(null));\n }\n if (keysCached.has(keyLists)) {\n cache.set(keyLists, array);\n }\n return array;\n }\n chartOptionScopes() {\n const { options , type } = this;\n return [\n options,\n overrides[type] || {},\n defaults.datasets[type] || {},\n {\n type\n },\n defaults,\n descriptors\n ];\n }\n resolveNamedOptions(scopes, names, context, prefixes = [\n \'\'\n ]) {\n const result = {\n $shared: true\n };\n const { resolver , subPrefixes } = getResolver(this._resolverCache, scopes, prefixes);\n let options = resolver;\n if (needContext(resolver, names)) {\n result.$shared = false;\n context = isFunction(context) ? context() : context;\n const subResolver = this.createResolver(scopes, context, subPrefixes);\n options = _attachContext(resolver, context, subResolver);\n }\n for (const prop of names){\n result[prop] = options[prop];\n }\n return result;\n }\n createResolver(scopes, context, prefixes = [\n \'\'\n ], descriptorDefaults) {\n const { resolver } = getResolver(this._resolverCache, scopes, prefixes);\n return isObject(context) ? _attachContext(resolver, context, undefined, descriptorDefaults) : resolver;\n }\n}\nfunction getResolver(resolverCache, scopes, prefixes) {\n let cache = resolverCache.get(scopes);\n if (!cache) {\n cache = new Map();\n resolverCache.set(scopes, cache);\n }\n const cacheKey = prefixes.join();\n let cached = cache.get(cacheKey);\n if (!cached) {\n const resolver = _createResolver(scopes, prefixes);\n cached = {\n resolver,\n subPrefixes: prefixes.filter((p)=>!p.toLowerCase().includes(\'hover\'))\n };\n cache.set(cacheKey, cached);\n }\n return cached;\n}\nconst hasFunction = (value)=>isObject(value) && Object.getOwnPropertyNames(value).reduce((acc, key)=>acc || isFunction(value[key]), false);\nfunction needContext(proxy, names) {\n const { isScriptable , isIndexable } = _descriptors(proxy);\n for (const prop of names){\n const scriptable = isScriptable(prop);\n const indexable = isIndexable(prop);\n const value = (indexable || scriptable) && proxy[prop];\n if (scriptable && (isFunction(value) || hasFunction(value)) || indexable && isArray(value)) {\n return true;\n }\n }\n return false;\n}\n\nvar version = "4.4.0";\n\nconst KNOWN_POSITIONS = [\n \'top\',\n \'bottom\',\n \'left\',\n \'right\',\n \'chartArea\'\n];\nfunction positionIsHorizontal(position, axis) {\n return position === \'top\' || position === \'bottom\' || KNOWN_POSITIONS.indexOf(position) === -1 && axis === \'x\';\n}\nfunction compare2Level(l1, l2) {\n return function(a, b) {\n return a[l1] === b[l1] ? a[l2] - b[l2] : a[l1] - b[l1];\n };\n}\nfunction onAnimationsComplete(context) {\n const chart = context.chart;\n const animationOptions = chart.options.animation;\n chart.notifyPlugins(\'afterRender\');\n callback(animationOptions && animationOptions.onComplete, [\n context\n ], chart);\n}\nfunction onAnimationProgress(context) {\n const chart = context.chart;\n const animationOptions = chart.options.animation;\n callback(animationOptions && animationOptions.onProgress, [\n context\n ], chart);\n}\n function getCanvas(item) {\n if (_isDomSupported() && typeof item === \'string\') {\n item = document.getElementById(item);\n } else if (item && item.length) {\n item = item[0];\n }\n if (item && item.canvas) {\n item = item.canvas;\n }\n return item;\n}\nconst instances = {};\nconst getChart = (key)=>{\n const canvas = getCanvas(key);\n return Object.values(instances).filter((c)=>c.canvas === canvas).pop();\n};\nfunction moveNumericKeys(obj, start, move) {\n const keys = Object.keys(obj);\n for (const key of keys){\n const intKey = +key;\n if (intKey >= start) {\n const value = obj[key];\n delete obj[key];\n if (move > 0 || intKey > start) {\n obj[intKey + move] = value;\n }\n }\n }\n}\n function determineLastEvent(e, lastEvent, inChartArea, isClick) {\n if (!inChartArea || e.type === \'mouseout\') {\n return null;\n }\n if (isClick) {\n return lastEvent;\n }\n return e;\n}\nfunction getSizeForArea(scale, chartArea, field) {\n return scale.options.clip ? scale[field] : chartArea[field];\n}\nfunction getDatasetArea(meta, chartArea) {\n const { xScale , yScale } = meta;\n if (xScale && yScale) {\n return {\n left: getSizeForArea(xScale, chartArea, \'left\'),\n right: getSizeForArea(xScale, chartArea, \'right\'),\n top: getSizeForArea(yScale, chartArea, \'top\'),\n bottom: getSizeForArea(yScale, chartArea, \'bottom\')\n };\n }\n return chartArea;\n}\nclass Chart {\n static defaults = defaults;\n static instances = instances;\n static overrides = overrides;\n static registry = registry;\n static version = version;\n static getChart = getChart;\n static register(...items) {\n registry.add(...items);\n invalidatePlugins();\n }\n static unregister(...items) {\n registry.remove(...items);\n invalidatePlugins();\n }\n constructor(item, userConfig){\n const config = this.config = new Config(userConfig);\n const initialCanvas = getCanvas(item);\n const existingChart = getChart(initialCanvas);\n if (existingChart) {\n throw new Error(\'Canvas is already in use. Chart with ID \\\'\' + existingChart.id + \'\\\'\' + \' must be destroyed before the canvas with ID \\\'\' + existingChart.canvas.id + \'\\\' can be reused.\');\n }\n const options = config.createResolver(config.chartOptionScopes(), this.getContext());\n this.platform = new (config.platform || _detectPlatform(initialCanvas))();\n this.platform.updateConfig(config);\n const context = this.platform.acquireContext(initialCanvas, options.aspectRatio);\n const canvas = context && context.canvas;\n const height = canvas && canvas.height;\n const width = canvas && canvas.width;\n this.id = uid();\n this.ctx = context;\n this.canvas = canvas;\n this.width = width;\n this.height = height;\n this._options = options;\n this._aspectRatio = this.aspectRatio;\n this._layers = [];\n this._metasets = [];\n this._stacks = undefined;\n this.boxes = [];\n this.currentDevicePixelRatio = undefined;\n this.chartArea = undefined;\n this._active = [];\n this._lastEvent = undefined;\n this._listeners = {};\n this._responsiveListeners = undefined;\n this._sortedMetasets = [];\n this.scales = {};\n this._plugins = new PluginService();\n this.$proxies = {};\n this._hiddenIndices = {};\n this.attached = false;\n this._animationsDisabled = undefined;\n this.$context = undefined;\n this._doResize = helpers_segment_debounce((mode)=>this.update(mode), options.resizeDelay || 0);\n this._dataChanges = [];\n instances[this.id] = this;\n if (!context || !canvas) {\n console.error("Failed to create chart: can\'t acquire context from the given item");\n return;\n }\n animator.listen(this, \'complete\', onAnimationsComplete);\n animator.listen(this, \'progress\', onAnimationProgress);\n this._initialize();\n if (this.attached) {\n this.update();\n }\n }\n get aspectRatio() {\n const { options: { aspectRatio , maintainAspectRatio } , width , height , _aspectRatio } = this;\n if (!isNullOrUndef(aspectRatio)) {\n return aspectRatio;\n }\n if (maintainAspectRatio && _aspectRatio) {\n return _aspectRatio;\n }\n return height ? width / height : null;\n }\n get data() {\n return this.config.data;\n }\n set data(data) {\n this.config.data = data;\n }\n get options() {\n return this._options;\n }\n set options(options) {\n this.config.options = options;\n }\n get registry() {\n return registry;\n }\n _initialize() {\n this.notifyPlugins(\'beforeInit\');\n if (this.options.responsive) {\n this.resize();\n } else {\n retinaScale(this, this.options.devicePixelRatio);\n }\n this.bindEvents();\n this.notifyPlugins(\'afterInit\');\n return this;\n }\n clear() {\n clearCanvas(this.canvas, this.ctx);\n return this;\n }\n stop() {\n animator.stop(this);\n return this;\n }\n resize(width, height) {\n if (!animator.running(this)) {\n this._resize(width, height);\n } else {\n this._resizeBeforeDraw = {\n width,\n height\n };\n }\n }\n _resize(width, height) {\n const options = this.options;\n const canvas = this.canvas;\n const aspectRatio = options.maintainAspectRatio && this.aspectRatio;\n const newSize = this.platform.getMaximumSize(canvas, width, height, aspectRatio);\n const newRatio = options.devicePixelRatio || this.platform.getDevicePixelRatio();\n const mode = this.width ? \'resize\' : \'attach\';\n this.width = newSize.width;\n this.height = newSize.height;\n this._aspectRatio = this.aspectRatio;\n if (!retinaScale(this, newRatio, true)) {\n return;\n }\n this.notifyPlugins(\'resize\', {\n size: newSize\n });\n callback(options.onResize, [\n this,\n newSize\n ], this);\n if (this.attached) {\n if (this._doResize(mode)) {\n this.render();\n }\n }\n }\n ensureScalesHaveIDs() {\n const options = this.options;\n const scalesOptions = options.scales || {};\n helpers_segment_each(scalesOptions, (axisOptions, axisID)=>{\n axisOptions.id = axisID;\n });\n }\n buildOrUpdateScales() {\n const options = this.options;\n const scaleOpts = options.scales;\n const scales = this.scales;\n const updated = Object.keys(scales).reduce((obj, id)=>{\n obj[id] = false;\n return obj;\n }, {});\n let items = [];\n if (scaleOpts) {\n items = items.concat(Object.keys(scaleOpts).map((id)=>{\n const scaleOptions = scaleOpts[id];\n const axis = determineAxis(id, scaleOptions);\n const isRadial = axis === \'r\';\n const isHorizontal = axis === \'x\';\n return {\n options: scaleOptions,\n dposition: isRadial ? \'chartArea\' : isHorizontal ? \'bottom\' : \'left\',\n dtype: isRadial ? \'radialLinear\' : isHorizontal ? \'category\' : \'linear\'\n };\n }));\n }\n helpers_segment_each(items, (item)=>{\n const scaleOptions = item.options;\n const id = scaleOptions.id;\n const axis = determineAxis(id, scaleOptions);\n const scaleType = valueOrDefault(scaleOptions.type, item.dtype);\n if (scaleOptions.position === undefined || positionIsHorizontal(scaleOptions.position, axis) !== positionIsHorizontal(item.dposition)) {\n scaleOptions.position = item.dposition;\n }\n updated[id] = true;\n let scale = null;\n if (id in scales && scales[id].type === scaleType) {\n scale = scales[id];\n } else {\n const scaleClass = registry.getScale(scaleType);\n scale = new scaleClass({\n id,\n type: scaleType,\n ctx: this.ctx,\n chart: this\n });\n scales[scale.id] = scale;\n }\n scale.init(scaleOptions, options);\n });\n helpers_segment_each(updated, (hasUpdated, id)=>{\n if (!hasUpdated) {\n delete scales[id];\n }\n });\n helpers_segment_each(scales, (scale)=>{\n layouts.configure(this, scale, scale.options);\n layouts.addBox(this, scale);\n });\n }\n _updateMetasets() {\n const metasets = this._metasets;\n const numData = this.data.datasets.length;\n const numMeta = metasets.length;\n metasets.sort((a, b)=>a.index - b.index);\n if (numMeta > numData) {\n for(let i = numData; i < numMeta; ++i){\n this._destroyDatasetMeta(i);\n }\n metasets.splice(numData, numMeta - numData);\n }\n this._sortedMetasets = metasets.slice(0).sort(compare2Level(\'order\', \'index\'));\n }\n _removeUnreferencedMetasets() {\n const { _metasets: metasets , data: { datasets } } = this;\n if (metasets.length > datasets.length) {\n delete this._stacks;\n }\n metasets.forEach((meta, index)=>{\n if (datasets.filter((x)=>x === meta._dataset).length === 0) {\n this._destroyDatasetMeta(index);\n }\n });\n }\n buildOrUpdateControllers() {\n const newControllers = [];\n const datasets = this.data.datasets;\n let i, ilen;\n this._removeUnreferencedMetasets();\n for(i = 0, ilen = datasets.length; i < ilen; i++){\n const dataset = datasets[i];\n let meta = this.getDatasetMeta(i);\n const type = dataset.type || this.config.type;\n if (meta.type && meta.type !== type) {\n this._destroyDatasetMeta(i);\n meta = this.getDatasetMeta(i);\n }\n meta.type = type;\n meta.indexAxis = dataset.indexAxis || getIndexAxis(type, this.options);\n meta.order = dataset.order || 0;\n meta.index = i;\n meta.label = \'\' + dataset.label;\n meta.visible = this.isDatasetVisible(i);\n if (meta.controller) {\n meta.controller.updateIndex(i);\n meta.controller.linkScales();\n } else {\n const ControllerClass = registry.getController(type);\n const { datasetElementType , dataElementType } = defaults.datasets[type];\n Object.assign(ControllerClass, {\n dataElementType: registry.getElement(dataElementType),\n datasetElementType: datasetElementType && registry.getElement(datasetElementType)\n });\n meta.controller = new ControllerClass(this, i);\n newControllers.push(meta.controller);\n }\n }\n this._updateMetasets();\n return newControllers;\n }\n _resetElements() {\n helpers_segment_each(this.data.datasets, (dataset, datasetIndex)=>{\n this.getDatasetMeta(datasetIndex).controller.reset();\n }, this);\n }\n reset() {\n this._resetElements();\n this.notifyPlugins(\'reset\');\n }\n update(mode) {\n const config = this.config;\n config.update();\n const options = this._options = config.createResolver(config.chartOptionScopes(), this.getContext());\n const animsDisabled = this._animationsDisabled = !options.animation;\n this._updateScales();\n this._checkEventBindings();\n this._updateHiddenIndices();\n this._plugins.invalidate();\n if (this.notifyPlugins(\'beforeUpdate\', {\n mode,\n cancelable: true\n }) === false) {\n return;\n }\n const newControllers = this.buildOrUpdateControllers();\n this.notifyPlugins(\'beforeElementsUpdate\');\n let minPadding = 0;\n for(let i = 0, ilen = this.data.datasets.length; i < ilen; i++){\n const { controller } = this.getDatasetMeta(i);\n const reset = !animsDisabled && newControllers.indexOf(controller) === -1;\n controller.buildOrUpdateElements(reset);\n minPadding = Math.max(+controller.getMaxOverflow(), minPadding);\n }\n minPadding = this._minPadding = options.layout.autoPadding ? minPadding : 0;\n this._updateLayout(minPadding);\n if (!animsDisabled) {\n helpers_segment_each(newControllers, (controller)=>{\n controller.reset();\n });\n }\n this._updateDatasets(mode);\n this.notifyPlugins(\'afterUpdate\', {\n mode\n });\n this._layers.sort(compare2Level(\'z\', \'_idx\'));\n const { _active , _lastEvent } = this;\n if (_lastEvent) {\n this._eventHandler(_lastEvent, true);\n } else if (_active.length) {\n this._updateHoverStyles(_active, _active, true);\n }\n this.render();\n }\n _updateScales() {\n helpers_segment_each(this.scales, (scale)=>{\n layouts.removeBox(this, scale);\n });\n this.ensureScalesHaveIDs();\n this.buildOrUpdateScales();\n }\n _checkEventBindings() {\n const options = this.options;\n const existingEvents = new Set(Object.keys(this._listeners));\n const newEvents = new Set(options.events);\n if (!setsEqual(existingEvents, newEvents) || !!this._responsiveListeners !== options.responsive) {\n this.unbindEvents();\n this.bindEvents();\n }\n }\n _updateHiddenIndices() {\n const { _hiddenIndices } = this;\n const changes = this._getUniformDataChanges() || [];\n for (const { method , start , count } of changes){\n const move = method === \'_removeElements\' ? -count : count;\n moveNumericKeys(_hiddenIndices, start, move);\n }\n }\n _getUniformDataChanges() {\n const _dataChanges = this._dataChanges;\n if (!_dataChanges || !_dataChanges.length) {\n return;\n }\n this._dataChanges = [];\n const datasetCount = this.data.datasets.length;\n const makeSet = (idx)=>new Set(_dataChanges.filter((c)=>c[0] === idx).map((c, i)=>i + \',\' + c.splice(1).join(\',\')));\n const changeSet = makeSet(0);\n for(let i = 1; i < datasetCount; i++){\n if (!setsEqual(changeSet, makeSet(i))) {\n return;\n }\n }\n return Array.from(changeSet).map((c)=>c.split(\',\')).map((a)=>({\n method: a[1],\n start: +a[2],\n count: +a[3]\n }));\n }\n _updateLayout(minPadding) {\n if (this.notifyPlugins(\'beforeLayout\', {\n cancelable: true\n }) === false) {\n return;\n }\n layouts.update(this, this.width, this.height, minPadding);\n const area = this.chartArea;\n const noArea = area.width <= 0 || area.height <= 0;\n this._layers = [];\n helpers_segment_each(this.boxes, (box)=>{\n if (noArea && box.position === \'chartArea\') {\n return;\n }\n if (box.configure) {\n box.configure();\n }\n this._layers.push(...box._layers());\n }, this);\n this._layers.forEach((item, index)=>{\n item._idx = index;\n });\n this.notifyPlugins(\'afterLayout\');\n }\n _updateDatasets(mode) {\n if (this.notifyPlugins(\'beforeDatasetsUpdate\', {\n mode,\n cancelable: true\n }) === false) {\n return;\n }\n for(let i = 0, ilen = this.data.datasets.length; i < ilen; ++i){\n this.getDatasetMeta(i).controller.configure();\n }\n for(let i = 0, ilen = this.data.datasets.length; i < ilen; ++i){\n this._updateDataset(i, isFunction(mode) ? mode({\n datasetIndex: i\n }) : mode);\n }\n this.notifyPlugins(\'afterDatasetsUpdate\', {\n mode\n });\n }\n _updateDataset(index, mode) {\n const meta = this.getDatasetMeta(index);\n const args = {\n meta,\n index,\n mode,\n cancelable: true\n };\n if (this.notifyPlugins(\'beforeDatasetUpdate\', args) === false) {\n return;\n }\n meta.controller._update(mode);\n args.cancelable = false;\n this.notifyPlugins(\'afterDatasetUpdate\', args);\n }\n render() {\n if (this.notifyPlugins(\'beforeRender\', {\n cancelable: true\n }) === false) {\n return;\n }\n if (animator.has(this)) {\n if (this.attached && !animator.running(this)) {\n animator.start(this);\n }\n } else {\n this.draw();\n onAnimationsComplete({\n chart: this\n });\n }\n }\n draw() {\n let i;\n if (this._resizeBeforeDraw) {\n const { width , height } = this._resizeBeforeDraw;\n this._resize(width, height);\n this._resizeBeforeDraw = null;\n }\n this.clear();\n if (this.width <= 0 || this.height <= 0) {\n return;\n }\n if (this.notifyPlugins(\'beforeDraw\', {\n cancelable: true\n }) === false) {\n return;\n }\n const layers = this._layers;\n for(i = 0; i < layers.length && layers[i].z <= 0; ++i){\n layers[i].draw(this.chartArea);\n }\n this._drawDatasets();\n for(; i < layers.length; ++i){\n layers[i].draw(this.chartArea);\n }\n this.notifyPlugins(\'afterDraw\');\n }\n _getSortedDatasetMetas(filterVisible) {\n const metasets = this._sortedMetasets;\n const result = [];\n let i, ilen;\n for(i = 0, ilen = metasets.length; i < ilen; ++i){\n const meta = metasets[i];\n if (!filterVisible || meta.visible) {\n result.push(meta);\n }\n }\n return result;\n }\n getSortedVisibleDatasetMetas() {\n return this._getSortedDatasetMetas(true);\n }\n _drawDatasets() {\n if (this.notifyPlugins(\'beforeDatasetsDraw\', {\n cancelable: true\n }) === false) {\n return;\n }\n const metasets = this.getSortedVisibleDatasetMetas();\n for(let i = metasets.length - 1; i >= 0; --i){\n this._drawDataset(metasets[i]);\n }\n this.notifyPlugins(\'afterDatasetsDraw\');\n }\n _drawDataset(meta) {\n const ctx = this.ctx;\n const clip = meta._clip;\n const useClip = !clip.disabled;\n const area = getDatasetArea(meta, this.chartArea);\n const args = {\n meta,\n index: meta.index,\n cancelable: true\n };\n if (this.notifyPlugins(\'beforeDatasetDraw\', args) === false) {\n return;\n }\n if (useClip) {\n clipArea(ctx, {\n left: clip.left === false ? 0 : area.left - clip.left,\n right: clip.right === false ? this.width : area.right + clip.right,\n top: clip.top === false ? 0 : area.top - clip.top,\n bottom: clip.bottom === false ? this.height : area.bottom + clip.bottom\n });\n }\n meta.controller.draw();\n if (useClip) {\n unclipArea(ctx);\n }\n args.cancelable = false;\n this.notifyPlugins(\'afterDatasetDraw\', args);\n }\n isPointInArea(point) {\n return _isPointInArea(point, this.chartArea, this._minPadding);\n }\n getElementsAtEventForMode(e, mode, options, useFinalPosition) {\n const method = Interaction.modes[mode];\n if (typeof method === \'function\') {\n return method(this, e, options, useFinalPosition);\n }\n return [];\n }\n getDatasetMeta(datasetIndex) {\n const dataset = this.data.datasets[datasetIndex];\n const metasets = this._metasets;\n let meta = metasets.filter((x)=>x && x._dataset === dataset).pop();\n if (!meta) {\n meta = {\n type: null,\n data: [],\n dataset: null,\n controller: null,\n hidden: null,\n xAxisID: null,\n yAxisID: null,\n order: dataset && dataset.order || 0,\n index: datasetIndex,\n _dataset: dataset,\n _parsed: [],\n _sorted: false\n };\n metasets.push(meta);\n }\n return meta;\n }\n getContext() {\n return this.$context || (this.$context = createContext(null, {\n chart: this,\n type: \'chart\'\n }));\n }\n getVisibleDatasetCount() {\n return this.getSortedVisibleDatasetMetas().length;\n }\n isDatasetVisible(datasetIndex) {\n const dataset = this.data.datasets[datasetIndex];\n if (!dataset) {\n return false;\n }\n const meta = this.getDatasetMeta(datasetIndex);\n return typeof meta.hidden === \'boolean\' ? !meta.hidden : !dataset.hidden;\n }\n setDatasetVisibility(datasetIndex, visible) {\n const meta = this.getDatasetMeta(datasetIndex);\n meta.hidden = !visible;\n }\n toggleDataVisibility(index) {\n this._hiddenIndices[index] = !this._hiddenIndices[index];\n }\n getDataVisibility(index) {\n return !this._hiddenIndices[index];\n }\n _updateVisibility(datasetIndex, dataIndex, visible) {\n const mode = visible ? \'show\' : \'hide\';\n const meta = this.getDatasetMeta(datasetIndex);\n const anims = meta.controller._resolveAnimations(undefined, mode);\n if (defined(dataIndex)) {\n meta.data[dataIndex].hidden = !visible;\n this.update();\n } else {\n this.setDatasetVisibility(datasetIndex, visible);\n anims.update(meta, {\n visible\n });\n this.update((ctx)=>ctx.datasetIndex === datasetIndex ? mode : undefined);\n }\n }\n hide(datasetIndex, dataIndex) {\n this._updateVisibility(datasetIndex, dataIndex, false);\n }\n show(datasetIndex, dataIndex) {\n this._updateVisibility(datasetIndex, dataIndex, true);\n }\n _destroyDatasetMeta(datasetIndex) {\n const meta = this._metasets[datasetIndex];\n if (meta && meta.controller) {\n meta.controller._destroy();\n }\n delete this._metasets[datasetIndex];\n }\n _stop() {\n let i, ilen;\n this.stop();\n animator.remove(this);\n for(i = 0, ilen = this.data.datasets.length; i < ilen; ++i){\n this._destroyDatasetMeta(i);\n }\n }\n destroy() {\n this.notifyPlugins(\'beforeDestroy\');\n const { canvas , ctx } = this;\n this._stop();\n this.config.clearCache();\n if (canvas) {\n this.unbindEvents();\n clearCanvas(canvas, ctx);\n this.platform.releaseContext(ctx);\n this.canvas = null;\n this.ctx = null;\n }\n delete instances[this.id];\n this.notifyPlugins(\'afterDestroy\');\n }\n toBase64Image(...args) {\n return this.canvas.toDataURL(...args);\n }\n bindEvents() {\n this.bindUserEvents();\n if (this.options.responsive) {\n this.bindResponsiveEvents();\n } else {\n this.attached = true;\n }\n }\n bindUserEvents() {\n const listeners = this._listeners;\n const platform = this.platform;\n const _add = (type, listener)=>{\n platform.addEventListener(this, type, listener);\n listeners[type] = listener;\n };\n const listener = (e, x, y)=>{\n e.offsetX = x;\n e.offsetY = y;\n this._eventHandler(e);\n };\n helpers_segment_each(this.options.events, (type)=>_add(type, listener));\n }\n bindResponsiveEvents() {\n if (!this._responsiveListeners) {\n this._responsiveListeners = {};\n }\n const listeners = this._responsiveListeners;\n const platform = this.platform;\n const _add = (type, listener)=>{\n platform.addEventListener(this, type, listener);\n listeners[type] = listener;\n };\n const _remove = (type, listener)=>{\n if (listeners[type]) {\n platform.removeEventListener(this, type, listener);\n delete listeners[type];\n }\n };\n const listener = (width, height)=>{\n if (this.canvas) {\n this.resize(width, height);\n }\n };\n let detached;\n const attached = ()=>{\n _remove(\'attach\', attached);\n this.attached = true;\n this.resize();\n _add(\'resize\', listener);\n _add(\'detach\', detached);\n };\n detached = ()=>{\n this.attached = false;\n _remove(\'resize\', listener);\n this._stop();\n this._resize(0, 0);\n _add(\'attach\', attached);\n };\n if (platform.isAttached(this.canvas)) {\n attached();\n } else {\n detached();\n }\n }\n unbindEvents() {\n helpers_segment_each(this._listeners, (listener, type)=>{\n this.platform.removeEventListener(this, type, listener);\n });\n this._listeners = {};\n helpers_segment_each(this._responsiveListeners, (listener, type)=>{\n this.platform.removeEventListener(this, type, listener);\n });\n this._responsiveListeners = undefined;\n }\n updateHoverStyle(items, mode, enabled) {\n const prefix = enabled ? \'set\' : \'remove\';\n let meta, item, i, ilen;\n if (mode === \'dataset\') {\n meta = this.getDatasetMeta(items[0].datasetIndex);\n meta.controller[\'_\' + prefix + \'DatasetHoverStyle\']();\n }\n for(i = 0, ilen = items.length; i < ilen; ++i){\n item = items[i];\n const controller = item && this.getDatasetMeta(item.datasetIndex).controller;\n if (controller) {\n controller[prefix + \'HoverStyle\'](item.element, item.datasetIndex, item.index);\n }\n }\n }\n getActiveElements() {\n return this._active || [];\n }\n setActiveElements(activeElements) {\n const lastActive = this._active || [];\n const active = activeElements.map(({ datasetIndex , index })=>{\n const meta = this.getDatasetMeta(datasetIndex);\n if (!meta) {\n throw new Error(\'No dataset found at index \' + datasetIndex);\n }\n return {\n datasetIndex,\n element: meta.data[index],\n index\n };\n });\n const changed = !_elementsEqual(active, lastActive);\n if (changed) {\n this._active = active;\n this._lastEvent = null;\n this._updateHoverStyles(active, lastActive);\n }\n }\n notifyPlugins(hook, args, filter) {\n return this._plugins.notify(this, hook, args, filter);\n }\n isPluginEnabled(pluginId) {\n return this._plugins._cache.filter((p)=>p.plugin.id === pluginId).length === 1;\n }\n _updateHoverStyles(active, lastActive, replay) {\n const hoverOptions = this.options.hover;\n const diff = (a, b)=>a.filter((x)=>!b.some((y)=>x.datasetIndex === y.datasetIndex && x.index === y.index));\n const deactivated = diff(lastActive, active);\n const activated = replay ? active : diff(active, lastActive);\n if (deactivated.length) {\n this.updateHoverStyle(deactivated, hoverOptions.mode, false);\n }\n if (activated.length && hoverOptions.mode) {\n this.updateHoverStyle(activated, hoverOptions.mode, true);\n }\n }\n _eventHandler(e, replay) {\n const args = {\n event: e,\n replay,\n cancelable: true,\n inChartArea: this.isPointInArea(e)\n };\n const eventFilter = (plugin)=>(plugin.options.events || this.options.events).includes(e.native.type);\n if (this.notifyPlugins(\'beforeEvent\', args, eventFilter) === false) {\n return;\n }\n const changed = this._handleEvent(e, replay, args.inChartArea);\n args.cancelable = false;\n this.notifyPlugins(\'afterEvent\', args, eventFilter);\n if (changed || args.changed) {\n this.render();\n }\n return this;\n }\n _handleEvent(e, replay, inChartArea) {\n const { _active: lastActive = [] , options } = this;\n const useFinalPosition = replay;\n const active = this._getActiveElements(e, lastActive, inChartArea, useFinalPosition);\n const isClick = _isClickEvent(e);\n const lastEvent = determineLastEvent(e, this._lastEvent, inChartArea, isClick);\n if (inChartArea) {\n this._lastEvent = null;\n callback(options.onHover, [\n e,\n active,\n this\n ], this);\n if (isClick) {\n callback(options.onClick, [\n e,\n active,\n this\n ], this);\n }\n }\n const changed = !_elementsEqual(active, lastActive);\n if (changed || replay) {\n this._active = active;\n this._updateHoverStyles(active, lastActive, replay);\n }\n this._lastEvent = lastEvent;\n return changed;\n }\n _getActiveElements(e, lastActive, inChartArea, useFinalPosition) {\n if (e.type === \'mouseout\') {\n return [];\n }\n if (!inChartArea) {\n return lastActive;\n }\n const hoverOptions = this.options.hover;\n return this.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions, useFinalPosition);\n }\n}\nfunction invalidatePlugins() {\n return helpers_segment_each(Chart.instances, (chart)=>chart._plugins.invalidate());\n}\n\nfunction clipArc(ctx, element, endAngle) {\n const { startAngle , pixelMargin , x , y , outerRadius , innerRadius } = element;\n let angleMargin = pixelMargin / outerRadius;\n // Draw an inner border by clipping the arc and drawing a double-width border\n // Enlarge the clipping arc by 0.33 pixels to eliminate glitches between borders\n ctx.beginPath();\n ctx.arc(x, y, outerRadius, startAngle - angleMargin, endAngle + angleMargin);\n if (innerRadius > pixelMargin) {\n angleMargin = pixelMargin / innerRadius;\n ctx.arc(x, y, innerRadius, endAngle + angleMargin, startAngle - angleMargin, true);\n } else {\n ctx.arc(x, y, pixelMargin, endAngle + HALF_PI, startAngle - HALF_PI);\n }\n ctx.closePath();\n ctx.clip();\n}\nfunction toRadiusCorners(value) {\n return _readValueToProps(value, [\n \'outerStart\',\n \'outerEnd\',\n \'innerStart\',\n \'innerEnd\'\n ]);\n}\n/**\n * Parse border radius from the provided options\n */ function parseBorderRadius$1(arc, innerRadius, outerRadius, angleDelta) {\n const o = toRadiusCorners(arc.options.borderRadius);\n const halfThickness = (outerRadius - innerRadius) / 2;\n const innerLimit = Math.min(halfThickness, angleDelta * innerRadius / 2);\n // Outer limits are complicated. We want to compute the available angular distance at\n // a radius of outerRadius - borderRadius because for small angular distances, this term limits.\n // We compute at r = outerRadius - borderRadius because this circle defines the center of the border corners.\n //\n // If the borderRadius is large, that value can become negative.\n // This causes the outer borders to lose their radius entirely, which is rather unexpected. To solve that, if borderRadius > outerRadius\n // we know that the thickness term will dominate and compute the limits at that point\n const computeOuterLimit = (val)=>{\n const outerArcLimit = (outerRadius - Math.min(halfThickness, val)) * angleDelta / 2;\n return _limitValue(val, 0, Math.min(halfThickness, outerArcLimit));\n };\n return {\n outerStart: computeOuterLimit(o.outerStart),\n outerEnd: computeOuterLimit(o.outerEnd),\n innerStart: _limitValue(o.innerStart, 0, innerLimit),\n innerEnd: _limitValue(o.innerEnd, 0, innerLimit)\n };\n}\n/**\n * Convert (r, 𝜃) to (x, y)\n */ function rThetaToXY(r, theta, x, y) {\n return {\n x: x + r * Math.cos(theta),\n y: y + r * Math.sin(theta)\n };\n}\n/**\n * Path the arc, respecting border radius by separating into left and right halves.\n *\n * Start End\n *\n * 1---\x3ea---\x3e2 Outer\n * / \\\n * 8 3\n * | |\n * | |\n * 7 4\n * \\ /\n * 6<---b<---5 Inner\n */ function pathArc(ctx, element, offset, spacing, end, circular) {\n const { x , y , startAngle: start , pixelMargin , innerRadius: innerR } = element;\n const outerRadius = Math.max(element.outerRadius + spacing + offset - pixelMargin, 0);\n const innerRadius = innerR > 0 ? innerR + spacing + offset + pixelMargin : 0;\n let spacingOffset = 0;\n const alpha = end - start;\n if (spacing) {\n // When spacing is present, it is the same for all items\n // So we adjust the start and end angle of the arc such that\n // the distance is the same as it would be without the spacing\n const noSpacingInnerRadius = innerR > 0 ? innerR - spacing : 0;\n const noSpacingOuterRadius = outerRadius > 0 ? outerRadius - spacing : 0;\n const avNogSpacingRadius = (noSpacingInnerRadius + noSpacingOuterRadius) / 2;\n const adjustedAngle = avNogSpacingRadius !== 0 ? alpha * avNogSpacingRadius / (avNogSpacingRadius + spacing) : alpha;\n spacingOffset = (alpha - adjustedAngle) / 2;\n }\n const beta = Math.max(0.001, alpha * outerRadius - offset / PI) / outerRadius;\n const angleOffset = (alpha - beta) / 2;\n const startAngle = start + angleOffset + spacingOffset;\n const endAngle = end - angleOffset - spacingOffset;\n const { outerStart , outerEnd , innerStart , innerEnd } = parseBorderRadius$1(element, innerRadius, outerRadius, endAngle - startAngle);\n const outerStartAdjustedRadius = outerRadius - outerStart;\n const outerEndAdjustedRadius = outerRadius - outerEnd;\n const outerStartAdjustedAngle = startAngle + outerStart / outerStartAdjustedRadius;\n const outerEndAdjustedAngle = endAngle - outerEnd / outerEndAdjustedRadius;\n const innerStartAdjustedRadius = innerRadius + innerStart;\n const innerEndAdjustedRadius = innerRadius + innerEnd;\n const innerStartAdjustedAngle = startAngle + innerStart / innerStartAdjustedRadius;\n const innerEndAdjustedAngle = endAngle - innerEnd / innerEndAdjustedRadius;\n ctx.beginPath();\n if (circular) {\n // The first arc segments from point 1 to point a to point 2\n const outerMidAdjustedAngle = (outerStartAdjustedAngle + outerEndAdjustedAngle) / 2;\n ctx.arc(x, y, outerRadius, outerStartAdjustedAngle, outerMidAdjustedAngle);\n ctx.arc(x, y, outerRadius, outerMidAdjustedAngle, outerEndAdjustedAngle);\n // The corner segment from point 2 to point 3\n if (outerEnd > 0) {\n const pCenter = rThetaToXY(outerEndAdjustedRadius, outerEndAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, outerEnd, outerEndAdjustedAngle, endAngle + HALF_PI);\n }\n // The line from point 3 to point 4\n const p4 = rThetaToXY(innerEndAdjustedRadius, endAngle, x, y);\n ctx.lineTo(p4.x, p4.y);\n // The corner segment from point 4 to point 5\n if (innerEnd > 0) {\n const pCenter = rThetaToXY(innerEndAdjustedRadius, innerEndAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, innerEnd, endAngle + HALF_PI, innerEndAdjustedAngle + Math.PI);\n }\n // The inner arc from point 5 to point b to point 6\n const innerMidAdjustedAngle = (endAngle - innerEnd / innerRadius + (startAngle + innerStart / innerRadius)) / 2;\n ctx.arc(x, y, innerRadius, endAngle - innerEnd / innerRadius, innerMidAdjustedAngle, true);\n ctx.arc(x, y, innerRadius, innerMidAdjustedAngle, startAngle + innerStart / innerRadius, true);\n // The corner segment from point 6 to point 7\n if (innerStart > 0) {\n const pCenter = rThetaToXY(innerStartAdjustedRadius, innerStartAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, innerStart, innerStartAdjustedAngle + Math.PI, startAngle - HALF_PI);\n }\n // The line from point 7 to point 8\n const p8 = rThetaToXY(outerStartAdjustedRadius, startAngle, x, y);\n ctx.lineTo(p8.x, p8.y);\n // The corner segment from point 8 to point 1\n if (outerStart > 0) {\n const pCenter = rThetaToXY(outerStartAdjustedRadius, outerStartAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, outerStart, startAngle - HALF_PI, outerStartAdjustedAngle);\n }\n } else {\n ctx.moveTo(x, y);\n const outerStartX = Math.cos(outerStartAdjustedAngle) * outerRadius + x;\n const outerStartY = Math.sin(outerStartAdjustedAngle) * outerRadius + y;\n ctx.lineTo(outerStartX, outerStartY);\n const outerEndX = Math.cos(outerEndAdjustedAngle) * outerRadius + x;\n const outerEndY = Math.sin(outerEndAdjustedAngle) * outerRadius + y;\n ctx.lineTo(outerEndX, outerEndY);\n }\n ctx.closePath();\n}\nfunction drawArc(ctx, element, offset, spacing, circular) {\n const { fullCircles , startAngle , circumference } = element;\n let endAngle = element.endAngle;\n if (fullCircles) {\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n for(let i = 0; i < fullCircles; ++i){\n ctx.fill();\n }\n if (!isNaN(circumference)) {\n endAngle = startAngle + (circumference % TAU || TAU);\n }\n }\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n ctx.fill();\n return endAngle;\n}\nfunction drawBorder(ctx, element, offset, spacing, circular) {\n const { fullCircles , startAngle , circumference , options } = element;\n const { borderWidth , borderJoinStyle , borderDash , borderDashOffset } = options;\n const inner = options.borderAlign === \'inner\';\n if (!borderWidth) {\n return;\n }\n ctx.setLineDash(borderDash || []);\n ctx.lineDashOffset = borderDashOffset;\n if (inner) {\n ctx.lineWidth = borderWidth * 2;\n ctx.lineJoin = borderJoinStyle || \'round\';\n } else {\n ctx.lineWidth = borderWidth;\n ctx.lineJoin = borderJoinStyle || \'bevel\';\n }\n let endAngle = element.endAngle;\n if (fullCircles) {\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n for(let i = 0; i < fullCircles; ++i){\n ctx.stroke();\n }\n if (!isNaN(circumference)) {\n endAngle = startAngle + (circumference % TAU || TAU);\n }\n }\n if (inner) {\n clipArc(ctx, element, endAngle);\n }\n if (!fullCircles) {\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n ctx.stroke();\n }\n}\nclass ArcElement extends chart_Element {\n static id = \'arc\';\n static defaults = {\n borderAlign: \'center\',\n borderColor: \'#fff\',\n borderDash: [],\n borderDashOffset: 0,\n borderJoinStyle: undefined,\n borderRadius: 0,\n borderWidth: 2,\n offset: 0,\n spacing: 0,\n angle: undefined,\n circular: true\n };\n static defaultRoutes = {\n backgroundColor: \'backgroundColor\'\n };\n static descriptors = {\n _scriptable: true,\n _indexable: (name)=>name !== \'borderDash\'\n };\n circumference;\n endAngle;\n fullCircles;\n innerRadius;\n outerRadius;\n pixelMargin;\n startAngle;\n constructor(cfg){\n super();\n this.options = undefined;\n this.circumference = undefined;\n this.startAngle = undefined;\n this.endAngle = undefined;\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n this.pixelMargin = 0;\n this.fullCircles = 0;\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n inRange(chartX, chartY, useFinalPosition) {\n const point = this.getProps([\n \'x\',\n \'y\'\n ], useFinalPosition);\n const { angle , distance } = getAngleFromPoint(point, {\n x: chartX,\n y: chartY\n });\n const { startAngle , endAngle , innerRadius , outerRadius , circumference } = this.getProps([\n \'startAngle\',\n \'endAngle\',\n \'innerRadius\',\n \'outerRadius\',\n \'circumference\'\n ], useFinalPosition);\n const rAdjust = (this.options.spacing + this.options.borderWidth) / 2;\n const _circumference = valueOrDefault(circumference, endAngle - startAngle);\n const betweenAngles = _circumference >= TAU || _angleBetween(angle, startAngle, endAngle);\n const withinRadius = _isBetween(distance, innerRadius + rAdjust, outerRadius + rAdjust);\n return betweenAngles && withinRadius;\n }\n getCenterPoint(useFinalPosition) {\n const { x , y , startAngle , endAngle , innerRadius , outerRadius } = this.getProps([\n \'x\',\n \'y\',\n \'startAngle\',\n \'endAngle\',\n \'innerRadius\',\n \'outerRadius\'\n ], useFinalPosition);\n const { offset , spacing } = this.options;\n const halfAngle = (startAngle + endAngle) / 2;\n const halfRadius = (innerRadius + outerRadius + spacing + offset) / 2;\n return {\n x: x + Math.cos(halfAngle) * halfRadius,\n y: y + Math.sin(halfAngle) * halfRadius\n };\n }\n tooltipPosition(useFinalPosition) {\n return this.getCenterPoint(useFinalPosition);\n }\n draw(ctx) {\n const { options , circumference } = this;\n const offset = (options.offset || 0) / 4;\n const spacing = (options.spacing || 0) / 2;\n const circular = options.circular;\n this.pixelMargin = options.borderAlign === \'inner\' ? 0.33 : 0;\n this.fullCircles = circumference > TAU ? Math.floor(circumference / TAU) : 0;\n if (circumference === 0 || this.innerRadius < 0 || this.outerRadius < 0) {\n return;\n }\n ctx.save();\n const halfAngle = (this.startAngle + this.endAngle) / 2;\n ctx.translate(Math.cos(halfAngle) * offset, Math.sin(halfAngle) * offset);\n const fix = 1 - Math.sin(Math.min(PI, circumference || 0));\n const radiusOffset = offset * fix;\n ctx.fillStyle = options.backgroundColor;\n ctx.strokeStyle = options.borderColor;\n drawArc(ctx, this, radiusOffset, spacing, circular);\n drawBorder(ctx, this, radiusOffset, spacing, circular);\n ctx.restore();\n }\n}\n\nfunction setStyle(ctx, options, style = options) {\n ctx.lineCap = valueOrDefault(style.borderCapStyle, options.borderCapStyle);\n ctx.setLineDash(valueOrDefault(style.borderDash, options.borderDash));\n ctx.lineDashOffset = valueOrDefault(style.borderDashOffset, options.borderDashOffset);\n ctx.lineJoin = valueOrDefault(style.borderJoinStyle, options.borderJoinStyle);\n ctx.lineWidth = valueOrDefault(style.borderWidth, options.borderWidth);\n ctx.strokeStyle = valueOrDefault(style.borderColor, options.borderColor);\n}\nfunction lineTo(ctx, previous, target) {\n ctx.lineTo(target.x, target.y);\n}\n function getLineMethod(options) {\n if (options.stepped) {\n return _steppedLineTo;\n }\n if (options.tension || options.cubicInterpolationMode === \'monotone\') {\n return _bezierCurveTo;\n }\n return lineTo;\n}\nfunction pathVars(points, segment, params = {}) {\n const count = points.length;\n const { start: paramsStart = 0 , end: paramsEnd = count - 1 } = params;\n const { start: segmentStart , end: segmentEnd } = segment;\n const start = Math.max(paramsStart, segmentStart);\n const end = Math.min(paramsEnd, segmentEnd);\n const outside = paramsStart < segmentStart && paramsEnd < segmentStart || paramsStart > segmentEnd && paramsEnd > segmentEnd;\n return {\n count,\n start,\n loop: segment.loop,\n ilen: end < start && !outside ? count + end - start : end - start\n };\n}\n function pathSegment(ctx, line, segment, params) {\n const { points , options } = line;\n const { count , start , loop , ilen } = pathVars(points, segment, params);\n const lineMethod = getLineMethod(options);\n let { move =true , reverse } = params || {};\n let i, point, prev;\n for(i = 0; i <= ilen; ++i){\n point = points[(start + (reverse ? ilen - i : i)) % count];\n if (point.skip) {\n continue;\n } else if (move) {\n ctx.moveTo(point.x, point.y);\n move = false;\n } else {\n lineMethod(ctx, prev, point, reverse, options.stepped);\n }\n prev = point;\n }\n if (loop) {\n point = points[(start + (reverse ? ilen : 0)) % count];\n lineMethod(ctx, prev, point, reverse, options.stepped);\n }\n return !!loop;\n}\n function fastPathSegment(ctx, line, segment, params) {\n const points = line.points;\n const { count , start , ilen } = pathVars(points, segment, params);\n const { move =true , reverse } = params || {};\n let avgX = 0;\n let countX = 0;\n let i, point, prevX, minY, maxY, lastY;\n const pointIndex = (index)=>(start + (reverse ? ilen - index : index)) % count;\n const drawX = ()=>{\n if (minY !== maxY) {\n ctx.lineTo(avgX, maxY);\n ctx.lineTo(avgX, minY);\n ctx.lineTo(avgX, lastY);\n }\n };\n if (move) {\n point = points[pointIndex(0)];\n ctx.moveTo(point.x, point.y);\n }\n for(i = 0; i <= ilen; ++i){\n point = points[pointIndex(i)];\n if (point.skip) {\n continue;\n }\n const x = point.x;\n const y = point.y;\n const truncX = x | 0;\n if (truncX === prevX) {\n if (y < minY) {\n minY = y;\n } else if (y > maxY) {\n maxY = y;\n }\n avgX = (countX * avgX + x) / ++countX;\n } else {\n drawX();\n ctx.lineTo(x, y);\n prevX = truncX;\n countX = 0;\n minY = maxY = y;\n }\n lastY = y;\n }\n drawX();\n}\n function _getSegmentMethod(line) {\n const opts = line.options;\n const borderDash = opts.borderDash && opts.borderDash.length;\n const useFastPath = !line._decimated && !line._loop && !opts.tension && opts.cubicInterpolationMode !== \'monotone\' && !opts.stepped && !borderDash;\n return useFastPath ? fastPathSegment : pathSegment;\n}\n function _getInterpolationMethod(options) {\n if (options.stepped) {\n return _steppedInterpolation;\n }\n if (options.tension || options.cubicInterpolationMode === \'monotone\') {\n return _bezierInterpolation;\n }\n return _pointInLine;\n}\nfunction strokePathWithCache(ctx, line, start, count) {\n let path = line._path;\n if (!path) {\n path = line._path = new Path2D();\n if (line.path(path, start, count)) {\n path.closePath();\n }\n }\n setStyle(ctx, line.options);\n ctx.stroke(path);\n}\nfunction strokePathDirect(ctx, line, start, count) {\n const { segments , options } = line;\n const segmentMethod = _getSegmentMethod(line);\n for (const segment of segments){\n setStyle(ctx, options, segment.style);\n ctx.beginPath();\n if (segmentMethod(ctx, line, segment, {\n start,\n end: start + count - 1\n })) {\n ctx.closePath();\n }\n ctx.stroke();\n }\n}\nconst usePath2D = typeof Path2D === \'function\';\nfunction draw(ctx, line, start, count) {\n if (usePath2D && !line.options.segment) {\n strokePathWithCache(ctx, line, start, count);\n } else {\n strokePathDirect(ctx, line, start, count);\n }\n}\nclass LineElement extends chart_Element {\n static id = \'line\';\n static defaults = {\n borderCapStyle: \'butt\',\n borderDash: [],\n borderDashOffset: 0,\n borderJoinStyle: \'miter\',\n borderWidth: 3,\n capBezierPoints: true,\n cubicInterpolationMode: \'default\',\n fill: false,\n spanGaps: false,\n stepped: false,\n tension: 0\n };\n static defaultRoutes = {\n backgroundColor: \'backgroundColor\',\n borderColor: \'borderColor\'\n };\n static descriptors = {\n _scriptable: true,\n _indexable: (name)=>name !== \'borderDash\' && name !== \'fill\'\n };\n constructor(cfg){\n super();\n this.animated = true;\n this.options = undefined;\n this._chart = undefined;\n this._loop = undefined;\n this._fullLoop = undefined;\n this._path = undefined;\n this._points = undefined;\n this._segments = undefined;\n this._decimated = false;\n this._pointsUpdated = false;\n this._datasetIndex = undefined;\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n updateControlPoints(chartArea, indexAxis) {\n const options = this.options;\n if ((options.tension || options.cubicInterpolationMode === \'monotone\') && !options.stepped && !this._pointsUpdated) {\n const loop = options.spanGaps ? this._loop : this._fullLoop;\n _updateBezierControlPoints(this._points, options, chartArea, loop, indexAxis);\n this._pointsUpdated = true;\n }\n }\n set points(points) {\n this._points = points;\n delete this._segments;\n delete this._path;\n this._pointsUpdated = false;\n }\n get points() {\n return this._points;\n }\n get segments() {\n return this._segments || (this._segments = _computeSegments(this, this.options.segment));\n }\n first() {\n const segments = this.segments;\n const points = this.points;\n return segments.length && points[segments[0].start];\n }\n last() {\n const segments = this.segments;\n const points = this.points;\n const count = segments.length;\n return count && points[segments[count - 1].end];\n }\n interpolate(point, property) {\n const options = this.options;\n const value = point[property];\n const points = this.points;\n const segments = _boundSegments(this, {\n property,\n start: value,\n end: value\n });\n if (!segments.length) {\n return;\n }\n const result = [];\n const _interpolate = _getInterpolationMethod(options);\n let i, ilen;\n for(i = 0, ilen = segments.length; i < ilen; ++i){\n const { start , end } = segments[i];\n const p1 = points[start];\n const p2 = points[end];\n if (p1 === p2) {\n result.push(p1);\n continue;\n }\n const t = Math.abs((value - p1[property]) / (p2[property] - p1[property]));\n const interpolated = _interpolate(p1, p2, t, options.stepped);\n interpolated[property] = point[property];\n result.push(interpolated);\n }\n return result.length === 1 ? result[0] : result;\n }\n pathSegment(ctx, segment, params) {\n const segmentMethod = _getSegmentMethod(this);\n return segmentMethod(ctx, this, segment, params);\n }\n path(ctx, start, count) {\n const segments = this.segments;\n const segmentMethod = _getSegmentMethod(this);\n let loop = this._loop;\n start = start || 0;\n count = count || this.points.length - start;\n for (const segment of segments){\n loop &= segmentMethod(ctx, this, segment, {\n start,\n end: start + count - 1\n });\n }\n return !!loop;\n }\n draw(ctx, chartArea, start, count) {\n const options = this.options || {};\n const points = this.points || [];\n if (points.length && options.borderWidth) {\n ctx.save();\n draw(ctx, this, start, count);\n ctx.restore();\n }\n if (this.animated) {\n this._pointsUpdated = false;\n this._path = undefined;\n }\n }\n}\n\nfunction inRange$1(el, pos, axis, useFinalPosition) {\n const options = el.options;\n const { [axis]: value } = el.getProps([\n axis\n ], useFinalPosition);\n return Math.abs(pos - value) < options.radius + options.hitRadius;\n}\nclass PointElement extends chart_Element {\n static id = \'point\';\n parsed;\n skip;\n stop;\n /**\n * @type {any}\n */ static defaults = {\n borderWidth: 1,\n hitRadius: 1,\n hoverBorderWidth: 1,\n hoverRadius: 4,\n pointStyle: \'circle\',\n radius: 3,\n rotation: 0\n };\n /**\n * @type {any}\n */ static defaultRoutes = {\n backgroundColor: \'backgroundColor\',\n borderColor: \'borderColor\'\n };\n constructor(cfg){\n super();\n this.options = undefined;\n this.parsed = undefined;\n this.skip = undefined;\n this.stop = undefined;\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n inRange(mouseX, mouseY, useFinalPosition) {\n const options = this.options;\n const { x , y } = this.getProps([\n \'x\',\n \'y\'\n ], useFinalPosition);\n return Math.pow(mouseX - x, 2) + Math.pow(mouseY - y, 2) < Math.pow(options.hitRadius + options.radius, 2);\n }\n inXRange(mouseX, useFinalPosition) {\n return inRange$1(this, mouseX, \'x\', useFinalPosition);\n }\n inYRange(mouseY, useFinalPosition) {\n return inRange$1(this, mouseY, \'y\', useFinalPosition);\n }\n getCenterPoint(useFinalPosition) {\n const { x , y } = this.getProps([\n \'x\',\n \'y\'\n ], useFinalPosition);\n return {\n x,\n y\n };\n }\n size(options) {\n options = options || this.options || {};\n let radius = options.radius || 0;\n radius = Math.max(radius, radius && options.hoverRadius || 0);\n const borderWidth = radius && options.borderWidth || 0;\n return (radius + borderWidth) * 2;\n }\n draw(ctx, area) {\n const options = this.options;\n if (this.skip || options.radius < 0.1 || !_isPointInArea(this, area, this.size(options) / 2)) {\n return;\n }\n ctx.strokeStyle = options.borderColor;\n ctx.lineWidth = options.borderWidth;\n ctx.fillStyle = options.backgroundColor;\n drawPoint(ctx, options, this.x, this.y);\n }\n getRange() {\n const options = this.options || {};\n // @ts-expect-error Fallbacks should never be hit in practice\n return options.radius + options.hitRadius;\n }\n}\n\nfunction getBarBounds(bar, useFinalPosition) {\n const { x , y , base , width , height } = bar.getProps([\n \'x\',\n \'y\',\n \'base\',\n \'width\',\n \'height\'\n ], useFinalPosition);\n let left, right, top, bottom, half;\n if (bar.horizontal) {\n half = height / 2;\n left = Math.min(x, base);\n right = Math.max(x, base);\n top = y - half;\n bottom = y + half;\n } else {\n half = width / 2;\n left = x - half;\n right = x + half;\n top = Math.min(y, base);\n bottom = Math.max(y, base);\n }\n return {\n left,\n top,\n right,\n bottom\n };\n}\nfunction skipOrLimit(skip, value, min, max) {\n return skip ? 0 : _limitValue(value, min, max);\n}\nfunction parseBorderWidth(bar, maxW, maxH) {\n const value = bar.options.borderWidth;\n const skip = bar.borderSkipped;\n const o = toTRBL(value);\n return {\n t: skipOrLimit(skip.top, o.top, 0, maxH),\n r: skipOrLimit(skip.right, o.right, 0, maxW),\n b: skipOrLimit(skip.bottom, o.bottom, 0, maxH),\n l: skipOrLimit(skip.left, o.left, 0, maxW)\n };\n}\nfunction parseBorderRadius(bar, maxW, maxH) {\n const { enableBorderRadius } = bar.getProps([\n \'enableBorderRadius\'\n ]);\n const value = bar.options.borderRadius;\n const o = toTRBLCorners(value);\n const maxR = Math.min(maxW, maxH);\n const skip = bar.borderSkipped;\n const enableBorder = enableBorderRadius || isObject(value);\n return {\n topLeft: skipOrLimit(!enableBorder || skip.top || skip.left, o.topLeft, 0, maxR),\n topRight: skipOrLimit(!enableBorder || skip.top || skip.right, o.topRight, 0, maxR),\n bottomLeft: skipOrLimit(!enableBorder || skip.bottom || skip.left, o.bottomLeft, 0, maxR),\n bottomRight: skipOrLimit(!enableBorder || skip.bottom || skip.right, o.bottomRight, 0, maxR)\n };\n}\nfunction boundingRects(bar) {\n const bounds = getBarBounds(bar);\n const width = bounds.right - bounds.left;\n const height = bounds.bottom - bounds.top;\n const border = parseBorderWidth(bar, width / 2, height / 2);\n const radius = parseBorderRadius(bar, width / 2, height / 2);\n return {\n outer: {\n x: bounds.left,\n y: bounds.top,\n w: width,\n h: height,\n radius\n },\n inner: {\n x: bounds.left + border.l,\n y: bounds.top + border.t,\n w: width - border.l - border.r,\n h: height - border.t - border.b,\n radius: {\n topLeft: Math.max(0, radius.topLeft - Math.max(border.t, border.l)),\n topRight: Math.max(0, radius.topRight - Math.max(border.t, border.r)),\n bottomLeft: Math.max(0, radius.bottomLeft - Math.max(border.b, border.l)),\n bottomRight: Math.max(0, radius.bottomRight - Math.max(border.b, border.r))\n }\n }\n };\n}\nfunction inRange(bar, x, y, useFinalPosition) {\n const skipX = x === null;\n const skipY = y === null;\n const skipBoth = skipX && skipY;\n const bounds = bar && !skipBoth && getBarBounds(bar, useFinalPosition);\n return bounds && (skipX || _isBetween(x, bounds.left, bounds.right)) && (skipY || _isBetween(y, bounds.top, bounds.bottom));\n}\nfunction hasRadius(radius) {\n return radius.topLeft || radius.topRight || radius.bottomLeft || radius.bottomRight;\n}\n function addNormalRectPath(ctx, rect) {\n ctx.rect(rect.x, rect.y, rect.w, rect.h);\n}\nfunction inflateRect(rect, amount, refRect = {}) {\n const x = rect.x !== refRect.x ? -amount : 0;\n const y = rect.y !== refRect.y ? -amount : 0;\n const w = (rect.x + rect.w !== refRect.x + refRect.w ? amount : 0) - x;\n const h = (rect.y + rect.h !== refRect.y + refRect.h ? amount : 0) - y;\n return {\n x: rect.x + x,\n y: rect.y + y,\n w: rect.w + w,\n h: rect.h + h,\n radius: rect.radius\n };\n}\nclass BarElement extends chart_Element {\n static id = \'bar\';\n static defaults = {\n borderSkipped: \'start\',\n borderWidth: 0,\n borderRadius: 0,\n inflateAmount: \'auto\',\n pointStyle: undefined\n };\n static defaultRoutes = {\n backgroundColor: \'backgroundColor\',\n borderColor: \'borderColor\'\n };\n constructor(cfg){\n super();\n this.options = undefined;\n this.horizontal = undefined;\n this.base = undefined;\n this.width = undefined;\n this.height = undefined;\n this.inflateAmount = undefined;\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n draw(ctx) {\n const { inflateAmount , options: { borderColor , backgroundColor } } = this;\n const { inner , outer } = boundingRects(this);\n const addRectPath = hasRadius(outer.radius) ? addRoundedRectPath : addNormalRectPath;\n ctx.save();\n if (outer.w !== inner.w || outer.h !== inner.h) {\n ctx.beginPath();\n addRectPath(ctx, inflateRect(outer, inflateAmount, inner));\n ctx.clip();\n addRectPath(ctx, inflateRect(inner, -inflateAmount, outer));\n ctx.fillStyle = borderColor;\n ctx.fill(\'evenodd\');\n }\n ctx.beginPath();\n addRectPath(ctx, inflateRect(inner, inflateAmount));\n ctx.fillStyle = backgroundColor;\n ctx.fill();\n ctx.restore();\n }\n inRange(mouseX, mouseY, useFinalPosition) {\n return inRange(this, mouseX, mouseY, useFinalPosition);\n }\n inXRange(mouseX, useFinalPosition) {\n return inRange(this, mouseX, null, useFinalPosition);\n }\n inYRange(mouseY, useFinalPosition) {\n return inRange(this, null, mouseY, useFinalPosition);\n }\n getCenterPoint(useFinalPosition) {\n const { x , y , base , horizontal } = this.getProps([\n \'x\',\n \'y\',\n \'base\',\n \'horizontal\'\n ], useFinalPosition);\n return {\n x: horizontal ? (x + base) / 2 : x,\n y: horizontal ? y : (y + base) / 2\n };\n }\n getRange(axis) {\n return axis === \'x\' ? this.width / 2 : this.height / 2;\n }\n}\n\nvar chart_elements = /*#__PURE__*/Object.freeze({\n__proto__: null,\nArcElement: ArcElement,\nBarElement: BarElement,\nLineElement: LineElement,\nPointElement: PointElement\n});\n\nconst BORDER_COLORS = [\n \'rgb(54, 162, 235)\',\n \'rgb(255, 99, 132)\',\n \'rgb(255, 159, 64)\',\n \'rgb(255, 205, 86)\',\n \'rgb(75, 192, 192)\',\n \'rgb(153, 102, 255)\',\n \'rgb(201, 203, 207)\' // grey\n];\n// Border colors with 50% transparency\nconst BACKGROUND_COLORS = /* #__PURE__ */ BORDER_COLORS.map((color)=>color.replace(\'rgb(\', \'rgba(\').replace(\')\', \', 0.5)\'));\nfunction getBorderColor(i) {\n return BORDER_COLORS[i % BORDER_COLORS.length];\n}\nfunction getBackgroundColor(i) {\n return BACKGROUND_COLORS[i % BACKGROUND_COLORS.length];\n}\nfunction colorizeDefaultDataset(dataset, i) {\n dataset.borderColor = getBorderColor(i);\n dataset.backgroundColor = getBackgroundColor(i);\n return ++i;\n}\nfunction colorizeDoughnutDataset(dataset, i) {\n dataset.backgroundColor = dataset.data.map(()=>getBorderColor(i++));\n return i;\n}\nfunction colorizePolarAreaDataset(dataset, i) {\n dataset.backgroundColor = dataset.data.map(()=>getBackgroundColor(i++));\n return i;\n}\nfunction getColorizer(chart) {\n let i = 0;\n return (dataset, datasetIndex)=>{\n const controller = chart.getDatasetMeta(datasetIndex).controller;\n if (controller instanceof DoughnutController) {\n i = colorizeDoughnutDataset(dataset, i);\n } else if (controller instanceof PolarAreaController) {\n i = colorizePolarAreaDataset(dataset, i);\n } else if (controller) {\n i = colorizeDefaultDataset(dataset, i);\n }\n };\n}\nfunction containsColorsDefinitions(descriptors) {\n let k;\n for(k in descriptors){\n if (descriptors[k].borderColor || descriptors[k].backgroundColor) {\n return true;\n }\n }\n return false;\n}\nfunction containsColorsDefinition(descriptor) {\n return descriptor && (descriptor.borderColor || descriptor.backgroundColor);\n}\nvar plugin_colors = {\n id: \'colors\',\n defaults: {\n enabled: true,\n forceOverride: false\n },\n beforeLayout (chart, _args, options) {\n if (!options.enabled) {\n return;\n }\n const { data: { datasets } , options: chartOptions } = chart.config;\n const { elements } = chartOptions;\n if (!options.forceOverride && (containsColorsDefinitions(datasets) || containsColorsDefinition(chartOptions) || elements && containsColorsDefinitions(elements))) {\n return;\n }\n const colorizer = getColorizer(chart);\n datasets.forEach(colorizer);\n }\n};\n\nfunction lttbDecimation(data, start, count, availableWidth, options) {\n const samples = options.samples || availableWidth;\n if (samples >= count) {\n return data.slice(start, start + count);\n }\n const decimated = [];\n const bucketWidth = (count - 2) / (samples - 2);\n let sampledIndex = 0;\n const endIndex = start + count - 1;\n let a = start;\n let i, maxAreaPoint, maxArea, area, nextA;\n decimated[sampledIndex++] = data[a];\n for(i = 0; i < samples - 2; i++){\n let avgX = 0;\n let avgY = 0;\n let j;\n const avgRangeStart = Math.floor((i + 1) * bucketWidth) + 1 + start;\n const avgRangeEnd = Math.min(Math.floor((i + 2) * bucketWidth) + 1, count) + start;\n const avgRangeLength = avgRangeEnd - avgRangeStart;\n for(j = avgRangeStart; j < avgRangeEnd; j++){\n avgX += data[j].x;\n avgY += data[j].y;\n }\n avgX /= avgRangeLength;\n avgY /= avgRangeLength;\n const rangeOffs = Math.floor(i * bucketWidth) + 1 + start;\n const rangeTo = Math.min(Math.floor((i + 1) * bucketWidth) + 1, count) + start;\n const { x: pointAx , y: pointAy } = data[a];\n maxArea = area = -1;\n for(j = rangeOffs; j < rangeTo; j++){\n area = 0.5 * Math.abs((pointAx - avgX) * (data[j].y - pointAy) - (pointAx - data[j].x) * (avgY - pointAy));\n if (area > maxArea) {\n maxArea = area;\n maxAreaPoint = data[j];\n nextA = j;\n }\n }\n decimated[sampledIndex++] = maxAreaPoint;\n a = nextA;\n }\n decimated[sampledIndex++] = data[endIndex];\n return decimated;\n}\nfunction minMaxDecimation(data, start, count, availableWidth) {\n let avgX = 0;\n let countX = 0;\n let i, point, x, y, prevX, minIndex, maxIndex, startIndex, minY, maxY;\n const decimated = [];\n const endIndex = start + count - 1;\n const xMin = data[start].x;\n const xMax = data[endIndex].x;\n const dx = xMax - xMin;\n for(i = start; i < start + count; ++i){\n point = data[i];\n x = (point.x - xMin) / dx * availableWidth;\n y = point.y;\n const truncX = x | 0;\n if (truncX === prevX) {\n if (y < minY) {\n minY = y;\n minIndex = i;\n } else if (y > maxY) {\n maxY = y;\n maxIndex = i;\n }\n avgX = (countX * avgX + point.x) / ++countX;\n } else {\n const lastIndex = i - 1;\n if (!isNullOrUndef(minIndex) && !isNullOrUndef(maxIndex)) {\n const intermediateIndex1 = Math.min(minIndex, maxIndex);\n const intermediateIndex2 = Math.max(minIndex, maxIndex);\n if (intermediateIndex1 !== startIndex && intermediateIndex1 !== lastIndex) {\n decimated.push({\n ...data[intermediateIndex1],\n x: avgX\n });\n }\n if (intermediateIndex2 !== startIndex && intermediateIndex2 !== lastIndex) {\n decimated.push({\n ...data[intermediateIndex2],\n x: avgX\n });\n }\n }\n if (i > 0 && lastIndex !== startIndex) {\n decimated.push(data[lastIndex]);\n }\n decimated.push(point);\n prevX = truncX;\n countX = 0;\n minY = maxY = y;\n minIndex = maxIndex = startIndex = i;\n }\n }\n return decimated;\n}\nfunction cleanDecimatedDataset(dataset) {\n if (dataset._decimated) {\n const data = dataset._data;\n delete dataset._decimated;\n delete dataset._data;\n Object.defineProperty(dataset, \'data\', {\n configurable: true,\n enumerable: true,\n writable: true,\n value: data\n });\n }\n}\nfunction cleanDecimatedData(chart) {\n chart.data.datasets.forEach((dataset)=>{\n cleanDecimatedDataset(dataset);\n });\n}\nfunction getStartAndCountOfVisiblePointsSimplified(meta, points) {\n const pointCount = points.length;\n let start = 0;\n let count;\n const { iScale } = meta;\n const { min , max , minDefined , maxDefined } = iScale.getUserBounds();\n if (minDefined) {\n start = _limitValue(_lookupByKey(points, iScale.axis, min).lo, 0, pointCount - 1);\n }\n if (maxDefined) {\n count = _limitValue(_lookupByKey(points, iScale.axis, max).hi + 1, start, pointCount) - start;\n } else {\n count = pointCount - start;\n }\n return {\n start,\n count\n };\n}\nvar plugin_decimation = {\n id: \'decimation\',\n defaults: {\n algorithm: \'min-max\',\n enabled: false\n },\n beforeElementsUpdate: (chart, args, options)=>{\n if (!options.enabled) {\n cleanDecimatedData(chart);\n return;\n }\n const availableWidth = chart.width;\n chart.data.datasets.forEach((dataset, datasetIndex)=>{\n const { _data , indexAxis } = dataset;\n const meta = chart.getDatasetMeta(datasetIndex);\n const data = _data || dataset.data;\n if (resolve([\n indexAxis,\n chart.options.indexAxis\n ]) === \'y\') {\n return;\n }\n if (!meta.controller.supportsDecimation) {\n return;\n }\n const xAxis = chart.scales[meta.xAxisID];\n if (xAxis.type !== \'linear\' && xAxis.type !== \'time\') {\n return;\n }\n if (chart.options.parsing) {\n return;\n }\n let { start , count } = getStartAndCountOfVisiblePointsSimplified(meta, data);\n const threshold = options.threshold || 4 * availableWidth;\n if (count <= threshold) {\n cleanDecimatedDataset(dataset);\n return;\n }\n if (isNullOrUndef(_data)) {\n dataset._data = data;\n delete dataset.data;\n Object.defineProperty(dataset, \'data\', {\n configurable: true,\n enumerable: true,\n get: function() {\n return this._decimated;\n },\n set: function(d) {\n this._data = d;\n }\n });\n }\n let decimated;\n switch(options.algorithm){\n case \'lttb\':\n decimated = lttbDecimation(data, start, count, availableWidth, options);\n break;\n case \'min-max\':\n decimated = minMaxDecimation(data, start, count, availableWidth);\n break;\n default:\n throw new Error(`Unsupported decimation algorithm \'${options.algorithm}\'`);\n }\n dataset._decimated = decimated;\n });\n },\n destroy (chart) {\n cleanDecimatedData(chart);\n }\n};\n\nfunction _segments(line, target, property) {\n const segments = line.segments;\n const points = line.points;\n const tpoints = target.points;\n const parts = [];\n for (const segment of segments){\n let { start , end } = segment;\n end = _findSegmentEnd(start, end, points);\n const bounds = _getBounds(property, points[start], points[end], segment.loop);\n if (!target.segments) {\n parts.push({\n source: segment,\n target: bounds,\n start: points[start],\n end: points[end]\n });\n continue;\n }\n const targetSegments = _boundSegments(target, bounds);\n for (const tgt of targetSegments){\n const subBounds = _getBounds(property, tpoints[tgt.start], tpoints[tgt.end], tgt.loop);\n const fillSources = _boundSegment(segment, points, subBounds);\n for (const fillSource of fillSources){\n parts.push({\n source: fillSource,\n target: tgt,\n start: {\n [property]: _getEdge(bounds, subBounds, \'start\', Math.max)\n },\n end: {\n [property]: _getEdge(bounds, subBounds, \'end\', Math.min)\n }\n });\n }\n }\n }\n return parts;\n}\nfunction _getBounds(property, first, last, loop) {\n if (loop) {\n return;\n }\n let start = first[property];\n let end = last[property];\n if (property === \'angle\') {\n start = _normalizeAngle(start);\n end = _normalizeAngle(end);\n }\n return {\n property,\n start,\n end\n };\n}\nfunction _pointsFromSegments(boundary, line) {\n const { x =null , y =null } = boundary || {};\n const linePoints = line.points;\n const points = [];\n line.segments.forEach(({ start , end })=>{\n end = _findSegmentEnd(start, end, linePoints);\n const first = linePoints[start];\n const last = linePoints[end];\n if (y !== null) {\n points.push({\n x: first.x,\n y\n });\n points.push({\n x: last.x,\n y\n });\n } else if (x !== null) {\n points.push({\n x,\n y: first.y\n });\n points.push({\n x,\n y: last.y\n });\n }\n });\n return points;\n}\nfunction _findSegmentEnd(start, end, points) {\n for(; end > start; end--){\n const point = points[end];\n if (!isNaN(point.x) && !isNaN(point.y)) {\n break;\n }\n }\n return end;\n}\nfunction _getEdge(a, b, prop, fn) {\n if (a && b) {\n return fn(a[prop], b[prop]);\n }\n return a ? a[prop] : b ? b[prop] : 0;\n}\n\nfunction _createBoundaryLine(boundary, line) {\n let points = [];\n let _loop = false;\n if (isArray(boundary)) {\n _loop = true;\n points = boundary;\n } else {\n points = _pointsFromSegments(boundary, line);\n }\n return points.length ? new LineElement({\n points,\n options: {\n tension: 0\n },\n _loop,\n _fullLoop: _loop\n }) : null;\n}\nfunction _shouldApplyFill(source) {\n return source && source.fill !== false;\n}\n\nfunction _resolveTarget(sources, index, propagate) {\n const source = sources[index];\n let fill = source.fill;\n const visited = [\n index\n ];\n let target;\n if (!propagate) {\n return fill;\n }\n while(fill !== false && visited.indexOf(fill) === -1){\n if (!isNumberFinite(fill)) {\n return fill;\n }\n target = sources[fill];\n if (!target) {\n return false;\n }\n if (target.visible) {\n return fill;\n }\n visited.push(fill);\n fill = target.fill;\n }\n return false;\n}\n function _decodeFill(line, index, count) {\n const fill = parseFillOption(line);\n if (isObject(fill)) {\n return isNaN(fill.value) ? false : fill;\n }\n let target = parseFloat(fill);\n if (isNumberFinite(target) && Math.floor(target) === target) {\n return decodeTargetIndex(fill[0], index, target, count);\n }\n return [\n \'origin\',\n \'start\',\n \'end\',\n \'stack\',\n \'shape\'\n ].indexOf(fill) >= 0 && fill;\n}\nfunction decodeTargetIndex(firstCh, index, target, count) {\n if (firstCh === \'-\' || firstCh === \'+\') {\n target = index + target;\n }\n if (target === index || target < 0 || target >= count) {\n return false;\n }\n return target;\n}\n function _getTargetPixel(fill, scale) {\n let pixel = null;\n if (fill === \'start\') {\n pixel = scale.bottom;\n } else if (fill === \'end\') {\n pixel = scale.top;\n } else if (isObject(fill)) {\n pixel = scale.getPixelForValue(fill.value);\n } else if (scale.getBasePixel) {\n pixel = scale.getBasePixel();\n }\n return pixel;\n}\n function _getTargetValue(fill, scale, startValue) {\n let value;\n if (fill === \'start\') {\n value = startValue;\n } else if (fill === \'end\') {\n value = scale.options.reverse ? scale.min : scale.max;\n } else if (isObject(fill)) {\n value = fill.value;\n } else {\n value = scale.getBaseValue();\n }\n return value;\n}\n function parseFillOption(line) {\n const options = line.options;\n const fillOption = options.fill;\n let fill = valueOrDefault(fillOption && fillOption.target, fillOption);\n if (fill === undefined) {\n fill = !!options.backgroundColor;\n }\n if (fill === false || fill === null) {\n return false;\n }\n if (fill === true) {\n return \'origin\';\n }\n return fill;\n}\n\nfunction _buildStackLine(source) {\n const { scale , index , line } = source;\n const points = [];\n const segments = line.segments;\n const sourcePoints = line.points;\n const linesBelow = getLinesBelow(scale, index);\n linesBelow.push(_createBoundaryLine({\n x: null,\n y: scale.bottom\n }, line));\n for(let i = 0; i < segments.length; i++){\n const segment = segments[i];\n for(let j = segment.start; j <= segment.end; j++){\n addPointsBelow(points, sourcePoints[j], linesBelow);\n }\n }\n return new LineElement({\n points,\n options: {}\n });\n}\n function getLinesBelow(scale, index) {\n const below = [];\n const metas = scale.getMatchingVisibleMetas(\'line\');\n for(let i = 0; i < metas.length; i++){\n const meta = metas[i];\n if (meta.index === index) {\n break;\n }\n if (!meta.hidden) {\n below.unshift(meta.dataset);\n }\n }\n return below;\n}\n function addPointsBelow(points, sourcePoint, linesBelow) {\n const postponed = [];\n for(let j = 0; j < linesBelow.length; j++){\n const line = linesBelow[j];\n const { first , last , point } = findPoint(line, sourcePoint, \'x\');\n if (!point || first && last) {\n continue;\n }\n if (first) {\n postponed.unshift(point);\n } else {\n points.push(point);\n if (!last) {\n break;\n }\n }\n }\n points.push(...postponed);\n}\n function findPoint(line, sourcePoint, property) {\n const point = line.interpolate(sourcePoint, property);\n if (!point) {\n return {};\n }\n const pointValue = point[property];\n const segments = line.segments;\n const linePoints = line.points;\n let first = false;\n let last = false;\n for(let i = 0; i < segments.length; i++){\n const segment = segments[i];\n const firstValue = linePoints[segment.start][property];\n const lastValue = linePoints[segment.end][property];\n if (_isBetween(pointValue, firstValue, lastValue)) {\n first = pointValue === firstValue;\n last = pointValue === lastValue;\n break;\n }\n }\n return {\n first,\n last,\n point\n };\n}\n\nclass simpleArc {\n constructor(opts){\n this.x = opts.x;\n this.y = opts.y;\n this.radius = opts.radius;\n }\n pathSegment(ctx, bounds, opts) {\n const { x , y , radius } = this;\n bounds = bounds || {\n start: 0,\n end: TAU\n };\n ctx.arc(x, y, radius, bounds.end, bounds.start, true);\n return !opts.bounds;\n }\n interpolate(point) {\n const { x , y , radius } = this;\n const angle = point.angle;\n return {\n x: x + Math.cos(angle) * radius,\n y: y + Math.sin(angle) * radius,\n angle\n };\n }\n}\n\nfunction _getTarget(source) {\n const { chart , fill , line } = source;\n if (isNumberFinite(fill)) {\n return getLineByIndex(chart, fill);\n }\n if (fill === \'stack\') {\n return _buildStackLine(source);\n }\n if (fill === \'shape\') {\n return true;\n }\n const boundary = computeBoundary(source);\n if (boundary instanceof simpleArc) {\n return boundary;\n }\n return _createBoundaryLine(boundary, line);\n}\n function getLineByIndex(chart, index) {\n const meta = chart.getDatasetMeta(index);\n const visible = meta && chart.isDatasetVisible(index);\n return visible ? meta.dataset : null;\n}\nfunction computeBoundary(source) {\n const scale = source.scale || {};\n if (scale.getPointPositionForValue) {\n return computeCircularBoundary(source);\n }\n return computeLinearBoundary(source);\n}\nfunction computeLinearBoundary(source) {\n const { scale ={} , fill } = source;\n const pixel = _getTargetPixel(fill, scale);\n if (isNumberFinite(pixel)) {\n const horizontal = scale.isHorizontal();\n return {\n x: horizontal ? pixel : null,\n y: horizontal ? null : pixel\n };\n }\n return null;\n}\nfunction computeCircularBoundary(source) {\n const { scale , fill } = source;\n const options = scale.options;\n const length = scale.getLabels().length;\n const start = options.reverse ? scale.max : scale.min;\n const value = _getTargetValue(fill, scale, start);\n const target = [];\n if (options.grid.circular) {\n const center = scale.getPointPositionForValue(0, start);\n return new simpleArc({\n x: center.x,\n y: center.y,\n radius: scale.getDistanceFromCenterForValue(value)\n });\n }\n for(let i = 0; i < length; ++i){\n target.push(scale.getPointPositionForValue(i, value));\n }\n return target;\n}\n\nfunction _drawfill(ctx, source, area) {\n const target = _getTarget(source);\n const { line , scale , axis } = source;\n const lineOpts = line.options;\n const fillOption = lineOpts.fill;\n const color = lineOpts.backgroundColor;\n const { above =color , below =color } = fillOption || {};\n if (target && line.points.length) {\n clipArea(ctx, area);\n doFill(ctx, {\n line,\n target,\n above,\n below,\n area,\n scale,\n axis\n });\n unclipArea(ctx);\n }\n}\nfunction doFill(ctx, cfg) {\n const { line , target , above , below , area , scale } = cfg;\n const property = line._loop ? \'angle\' : cfg.axis;\n ctx.save();\n if (property === \'x\' && below !== above) {\n clipVertical(ctx, target, area.top);\n fill(ctx, {\n line,\n target,\n color: above,\n scale,\n property\n });\n ctx.restore();\n ctx.save();\n clipVertical(ctx, target, area.bottom);\n }\n fill(ctx, {\n line,\n target,\n color: below,\n scale,\n property\n });\n ctx.restore();\n}\nfunction clipVertical(ctx, target, clipY) {\n const { segments , points } = target;\n let first = true;\n let lineLoop = false;\n ctx.beginPath();\n for (const segment of segments){\n const { start , end } = segment;\n const firstPoint = points[start];\n const lastPoint = points[_findSegmentEnd(start, end, points)];\n if (first) {\n ctx.moveTo(firstPoint.x, firstPoint.y);\n first = false;\n } else {\n ctx.lineTo(firstPoint.x, clipY);\n ctx.lineTo(firstPoint.x, firstPoint.y);\n }\n lineLoop = !!target.pathSegment(ctx, segment, {\n move: lineLoop\n });\n if (lineLoop) {\n ctx.closePath();\n } else {\n ctx.lineTo(lastPoint.x, clipY);\n }\n }\n ctx.lineTo(target.first().x, clipY);\n ctx.closePath();\n ctx.clip();\n}\nfunction fill(ctx, cfg) {\n const { line , target , property , color , scale } = cfg;\n const segments = _segments(line, target, property);\n for (const { source: src , target: tgt , start , end } of segments){\n const { style: { backgroundColor =color } = {} } = src;\n const notShape = target !== true;\n ctx.save();\n ctx.fillStyle = backgroundColor;\n clipBounds(ctx, scale, notShape && _getBounds(property, start, end));\n ctx.beginPath();\n const lineLoop = !!line.pathSegment(ctx, src);\n let loop;\n if (notShape) {\n if (lineLoop) {\n ctx.closePath();\n } else {\n interpolatedLineTo(ctx, target, end, property);\n }\n const targetLoop = !!target.pathSegment(ctx, tgt, {\n move: lineLoop,\n reverse: true\n });\n loop = lineLoop && targetLoop;\n if (!loop) {\n interpolatedLineTo(ctx, target, start, property);\n }\n }\n ctx.closePath();\n ctx.fill(loop ? \'evenodd\' : \'nonzero\');\n ctx.restore();\n }\n}\nfunction clipBounds(ctx, scale, bounds) {\n const { top , bottom } = scale.chart.chartArea;\n const { property , start , end } = bounds || {};\n if (property === \'x\') {\n ctx.beginPath();\n ctx.rect(start, top, end - start, bottom - top);\n ctx.clip();\n }\n}\nfunction interpolatedLineTo(ctx, target, point, property) {\n const interpolatedPoint = target.interpolate(point, property);\n if (interpolatedPoint) {\n ctx.lineTo(interpolatedPoint.x, interpolatedPoint.y);\n }\n}\n\nvar index = {\n id: \'filler\',\n afterDatasetsUpdate (chart, _args, options) {\n const count = (chart.data.datasets || []).length;\n const sources = [];\n let meta, i, line, source;\n for(i = 0; i < count; ++i){\n meta = chart.getDatasetMeta(i);\n line = meta.dataset;\n source = null;\n if (line && line.options && line instanceof LineElement) {\n source = {\n visible: chart.isDatasetVisible(i),\n index: i,\n fill: _decodeFill(line, i, count),\n chart,\n axis: meta.controller.options.indexAxis,\n scale: meta.vScale,\n line\n };\n }\n meta.$filler = source;\n sources.push(source);\n }\n for(i = 0; i < count; ++i){\n source = sources[i];\n if (!source || source.fill === false) {\n continue;\n }\n source.fill = _resolveTarget(sources, i, options.propagate);\n }\n },\n beforeDraw (chart, _args, options) {\n const draw = options.drawTime === \'beforeDraw\';\n const metasets = chart.getSortedVisibleDatasetMetas();\n const area = chart.chartArea;\n for(let i = metasets.length - 1; i >= 0; --i){\n const source = metasets[i].$filler;\n if (!source) {\n continue;\n }\n source.line.updateControlPoints(area, source.axis);\n if (draw && source.fill) {\n _drawfill(chart.ctx, source, area);\n }\n }\n },\n beforeDatasetsDraw (chart, _args, options) {\n if (options.drawTime !== \'beforeDatasetsDraw\') {\n return;\n }\n const metasets = chart.getSortedVisibleDatasetMetas();\n for(let i = metasets.length - 1; i >= 0; --i){\n const source = metasets[i].$filler;\n if (_shouldApplyFill(source)) {\n _drawfill(chart.ctx, source, chart.chartArea);\n }\n }\n },\n beforeDatasetDraw (chart, args, options) {\n const source = args.meta.$filler;\n if (!_shouldApplyFill(source) || options.drawTime !== \'beforeDatasetDraw\') {\n return;\n }\n _drawfill(chart.ctx, source, chart.chartArea);\n },\n defaults: {\n propagate: true,\n drawTime: \'beforeDatasetDraw\'\n }\n};\n\nconst getBoxSize = (labelOpts, fontSize)=>{\n let { boxHeight =fontSize , boxWidth =fontSize } = labelOpts;\n if (labelOpts.usePointStyle) {\n boxHeight = Math.min(boxHeight, fontSize);\n boxWidth = labelOpts.pointStyleWidth || Math.min(boxWidth, fontSize);\n }\n return {\n boxWidth,\n boxHeight,\n itemHeight: Math.max(fontSize, boxHeight)\n };\n};\nconst itemsEqual = (a, b)=>a !== null && b !== null && a.datasetIndex === b.datasetIndex && a.index === b.index;\nclass Legend extends chart_Element {\n constructor(config){\n super();\n this._added = false;\n this.legendHitBoxes = [];\n this._hoveredItem = null;\n this.doughnutMode = false;\n this.chart = config.chart;\n this.options = config.options;\n this.ctx = config.ctx;\n this.legendItems = undefined;\n this.columnSizes = undefined;\n this.lineWidths = undefined;\n this.maxHeight = undefined;\n this.maxWidth = undefined;\n this.top = undefined;\n this.bottom = undefined;\n this.left = undefined;\n this.right = undefined;\n this.height = undefined;\n this.width = undefined;\n this._margins = undefined;\n this.position = undefined;\n this.weight = undefined;\n this.fullSize = undefined;\n }\n update(maxWidth, maxHeight, margins) {\n this.maxWidth = maxWidth;\n this.maxHeight = maxHeight;\n this._margins = margins;\n this.setDimensions();\n this.buildLabels();\n this.fit();\n }\n setDimensions() {\n if (this.isHorizontal()) {\n this.width = this.maxWidth;\n this.left = this._margins.left;\n this.right = this.width;\n } else {\n this.height = this.maxHeight;\n this.top = this._margins.top;\n this.bottom = this.height;\n }\n }\n buildLabels() {\n const labelOpts = this.options.labels || {};\n let legendItems = callback(labelOpts.generateLabels, [\n this.chart\n ], this) || [];\n if (labelOpts.filter) {\n legendItems = legendItems.filter((item)=>labelOpts.filter(item, this.chart.data));\n }\n if (labelOpts.sort) {\n legendItems = legendItems.sort((a, b)=>labelOpts.sort(a, b, this.chart.data));\n }\n if (this.options.reverse) {\n legendItems.reverse();\n }\n this.legendItems = legendItems;\n }\n fit() {\n const { options , ctx } = this;\n if (!options.display) {\n this.width = this.height = 0;\n return;\n }\n const labelOpts = options.labels;\n const labelFont = toFont(labelOpts.font);\n const fontSize = labelFont.size;\n const titleHeight = this._computeTitleHeight();\n const { boxWidth , itemHeight } = getBoxSize(labelOpts, fontSize);\n let width, height;\n ctx.font = labelFont.string;\n if (this.isHorizontal()) {\n width = this.maxWidth;\n height = this._fitRows(titleHeight, fontSize, boxWidth, itemHeight) + 10;\n } else {\n height = this.maxHeight;\n width = this._fitCols(titleHeight, labelFont, boxWidth, itemHeight) + 10;\n }\n this.width = Math.min(width, options.maxWidth || this.maxWidth);\n this.height = Math.min(height, options.maxHeight || this.maxHeight);\n }\n _fitRows(titleHeight, fontSize, boxWidth, itemHeight) {\n const { ctx , maxWidth , options: { labels: { padding } } } = this;\n const hitboxes = this.legendHitBoxes = [];\n const lineWidths = this.lineWidths = [\n 0\n ];\n const lineHeight = itemHeight + padding;\n let totalHeight = titleHeight;\n ctx.textAlign = \'left\';\n ctx.textBaseline = \'middle\';\n let row = -1;\n let top = -lineHeight;\n this.legendItems.forEach((legendItem, i)=>{\n const itemWidth = boxWidth + fontSize / 2 + ctx.measureText(legendItem.text).width;\n if (i === 0 || lineWidths[lineWidths.length - 1] + itemWidth + 2 * padding > maxWidth) {\n totalHeight += lineHeight;\n lineWidths[lineWidths.length - (i > 0 ? 0 : 1)] = 0;\n top += lineHeight;\n row++;\n }\n hitboxes[i] = {\n left: 0,\n top,\n row,\n width: itemWidth,\n height: itemHeight\n };\n lineWidths[lineWidths.length - 1] += itemWidth + padding;\n });\n return totalHeight;\n }\n _fitCols(titleHeight, labelFont, boxWidth, _itemHeight) {\n const { ctx , maxHeight , options: { labels: { padding } } } = this;\n const hitboxes = this.legendHitBoxes = [];\n const columnSizes = this.columnSizes = [];\n const heightLimit = maxHeight - titleHeight;\n let totalWidth = padding;\n let currentColWidth = 0;\n let currentColHeight = 0;\n let left = 0;\n let col = 0;\n this.legendItems.forEach((legendItem, i)=>{\n const { itemWidth , itemHeight } = calculateItemSize(boxWidth, labelFont, ctx, legendItem, _itemHeight);\n if (i > 0 && currentColHeight + itemHeight + 2 * padding > heightLimit) {\n totalWidth += currentColWidth + padding;\n columnSizes.push({\n width: currentColWidth,\n height: currentColHeight\n });\n left += currentColWidth + padding;\n col++;\n currentColWidth = currentColHeight = 0;\n }\n hitboxes[i] = {\n left,\n top: currentColHeight,\n col,\n width: itemWidth,\n height: itemHeight\n };\n currentColWidth = Math.max(currentColWidth, itemWidth);\n currentColHeight += itemHeight + padding;\n });\n totalWidth += currentColWidth;\n columnSizes.push({\n width: currentColWidth,\n height: currentColHeight\n });\n return totalWidth;\n }\n adjustHitBoxes() {\n if (!this.options.display) {\n return;\n }\n const titleHeight = this._computeTitleHeight();\n const { legendHitBoxes: hitboxes , options: { align , labels: { padding } , rtl } } = this;\n const rtlHelper = getRtlAdapter(rtl, this.left, this.width);\n if (this.isHorizontal()) {\n let row = 0;\n let left = _alignStartEnd(align, this.left + padding, this.right - this.lineWidths[row]);\n for (const hitbox of hitboxes){\n if (row !== hitbox.row) {\n row = hitbox.row;\n left = _alignStartEnd(align, this.left + padding, this.right - this.lineWidths[row]);\n }\n hitbox.top += this.top + titleHeight + padding;\n hitbox.left = rtlHelper.leftForLtr(rtlHelper.x(left), hitbox.width);\n left += hitbox.width + padding;\n }\n } else {\n let col = 0;\n let top = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height);\n for (const hitbox of hitboxes){\n if (hitbox.col !== col) {\n col = hitbox.col;\n top = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height);\n }\n hitbox.top = top;\n hitbox.left += this.left + padding;\n hitbox.left = rtlHelper.leftForLtr(rtlHelper.x(hitbox.left), hitbox.width);\n top += hitbox.height + padding;\n }\n }\n }\n isHorizontal() {\n return this.options.position === \'top\' || this.options.position === \'bottom\';\n }\n draw() {\n if (this.options.display) {\n const ctx = this.ctx;\n clipArea(ctx, this);\n this._draw();\n unclipArea(ctx);\n }\n }\n _draw() {\n const { options: opts , columnSizes , lineWidths , ctx } = this;\n const { align , labels: labelOpts } = opts;\n const defaultColor = defaults.color;\n const rtlHelper = getRtlAdapter(opts.rtl, this.left, this.width);\n const labelFont = toFont(labelOpts.font);\n const { padding } = labelOpts;\n const fontSize = labelFont.size;\n const halfFontSize = fontSize / 2;\n let cursor;\n this.drawTitle();\n ctx.textAlign = rtlHelper.textAlign(\'left\');\n ctx.textBaseline = \'middle\';\n ctx.lineWidth = 0.5;\n ctx.font = labelFont.string;\n const { boxWidth , boxHeight , itemHeight } = getBoxSize(labelOpts, fontSize);\n const drawLegendBox = function(x, y, legendItem) {\n if (isNaN(boxWidth) || boxWidth <= 0 || isNaN(boxHeight) || boxHeight < 0) {\n return;\n }\n ctx.save();\n const lineWidth = valueOrDefault(legendItem.lineWidth, 1);\n ctx.fillStyle = valueOrDefault(legendItem.fillStyle, defaultColor);\n ctx.lineCap = valueOrDefault(legendItem.lineCap, \'butt\');\n ctx.lineDashOffset = valueOrDefault(legendItem.lineDashOffset, 0);\n ctx.lineJoin = valueOrDefault(legendItem.lineJoin, \'miter\');\n ctx.lineWidth = lineWidth;\n ctx.strokeStyle = valueOrDefault(legendItem.strokeStyle, defaultColor);\n ctx.setLineDash(valueOrDefault(legendItem.lineDash, []));\n if (labelOpts.usePointStyle) {\n const drawOptions = {\n radius: boxHeight * Math.SQRT2 / 2,\n pointStyle: legendItem.pointStyle,\n rotation: legendItem.rotation,\n borderWidth: lineWidth\n };\n const centerX = rtlHelper.xPlus(x, boxWidth / 2);\n const centerY = y + halfFontSize;\n drawPointLegend(ctx, drawOptions, centerX, centerY, labelOpts.pointStyleWidth && boxWidth);\n } else {\n const yBoxTop = y + Math.max((fontSize - boxHeight) / 2, 0);\n const xBoxLeft = rtlHelper.leftForLtr(x, boxWidth);\n const borderRadius = toTRBLCorners(legendItem.borderRadius);\n ctx.beginPath();\n if (Object.values(borderRadius).some((v)=>v !== 0)) {\n addRoundedRectPath(ctx, {\n x: xBoxLeft,\n y: yBoxTop,\n w: boxWidth,\n h: boxHeight,\n radius: borderRadius\n });\n } else {\n ctx.rect(xBoxLeft, yBoxTop, boxWidth, boxHeight);\n }\n ctx.fill();\n if (lineWidth !== 0) {\n ctx.stroke();\n }\n }\n ctx.restore();\n };\n const fillText = function(x, y, legendItem) {\n renderText(ctx, legendItem.text, x, y + itemHeight / 2, labelFont, {\n strikethrough: legendItem.hidden,\n textAlign: rtlHelper.textAlign(legendItem.textAlign)\n });\n };\n const isHorizontal = this.isHorizontal();\n const titleHeight = this._computeTitleHeight();\n if (isHorizontal) {\n cursor = {\n x: _alignStartEnd(align, this.left + padding, this.right - lineWidths[0]),\n y: this.top + padding + titleHeight,\n line: 0\n };\n } else {\n cursor = {\n x: this.left + padding,\n y: _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - columnSizes[0].height),\n line: 0\n };\n }\n overrideTextDirection(this.ctx, opts.textDirection);\n const lineHeight = itemHeight + padding;\n this.legendItems.forEach((legendItem, i)=>{\n ctx.strokeStyle = legendItem.fontColor;\n ctx.fillStyle = legendItem.fontColor;\n const textWidth = ctx.measureText(legendItem.text).width;\n const textAlign = rtlHelper.textAlign(legendItem.textAlign || (legendItem.textAlign = labelOpts.textAlign));\n const width = boxWidth + halfFontSize + textWidth;\n let x = cursor.x;\n let y = cursor.y;\n rtlHelper.setWidth(this.width);\n if (isHorizontal) {\n if (i > 0 && x + width + padding > this.right) {\n y = cursor.y += lineHeight;\n cursor.line++;\n x = cursor.x = _alignStartEnd(align, this.left + padding, this.right - lineWidths[cursor.line]);\n }\n } else if (i > 0 && y + lineHeight > this.bottom) {\n x = cursor.x = x + columnSizes[cursor.line].width + padding;\n cursor.line++;\n y = cursor.y = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - columnSizes[cursor.line].height);\n }\n const realX = rtlHelper.x(x);\n drawLegendBox(realX, y, legendItem);\n x = _textX(textAlign, x + boxWidth + halfFontSize, isHorizontal ? x + width : this.right, opts.rtl);\n fillText(rtlHelper.x(x), y, legendItem);\n if (isHorizontal) {\n cursor.x += width + padding;\n } else if (typeof legendItem.text !== \'string\') {\n const fontLineHeight = labelFont.lineHeight;\n cursor.y += calculateLegendItemHeight(legendItem, fontLineHeight) + padding;\n } else {\n cursor.y += lineHeight;\n }\n });\n restoreTextDirection(this.ctx, opts.textDirection);\n }\n drawTitle() {\n const opts = this.options;\n const titleOpts = opts.title;\n const titleFont = toFont(titleOpts.font);\n const titlePadding = toPadding(titleOpts.padding);\n if (!titleOpts.display) {\n return;\n }\n const rtlHelper = getRtlAdapter(opts.rtl, this.left, this.width);\n const ctx = this.ctx;\n const position = titleOpts.position;\n const halfFontSize = titleFont.size / 2;\n const topPaddingPlusHalfFontSize = titlePadding.top + halfFontSize;\n let y;\n let left = this.left;\n let maxWidth = this.width;\n if (this.isHorizontal()) {\n maxWidth = Math.max(...this.lineWidths);\n y = this.top + topPaddingPlusHalfFontSize;\n left = _alignStartEnd(opts.align, left, this.right - maxWidth);\n } else {\n const maxHeight = this.columnSizes.reduce((acc, size)=>Math.max(acc, size.height), 0);\n y = topPaddingPlusHalfFontSize + _alignStartEnd(opts.align, this.top, this.bottom - maxHeight - opts.labels.padding - this._computeTitleHeight());\n }\n const x = _alignStartEnd(position, left, left + maxWidth);\n ctx.textAlign = rtlHelper.textAlign(_toLeftRightCenter(position));\n ctx.textBaseline = \'middle\';\n ctx.strokeStyle = titleOpts.color;\n ctx.fillStyle = titleOpts.color;\n ctx.font = titleFont.string;\n renderText(ctx, titleOpts.text, x, y, titleFont);\n }\n _computeTitleHeight() {\n const titleOpts = this.options.title;\n const titleFont = toFont(titleOpts.font);\n const titlePadding = toPadding(titleOpts.padding);\n return titleOpts.display ? titleFont.lineHeight + titlePadding.height : 0;\n }\n _getLegendItemAt(x, y) {\n let i, hitBox, lh;\n if (_isBetween(x, this.left, this.right) && _isBetween(y, this.top, this.bottom)) {\n lh = this.legendHitBoxes;\n for(i = 0; i < lh.length; ++i){\n hitBox = lh[i];\n if (_isBetween(x, hitBox.left, hitBox.left + hitBox.width) && _isBetween(y, hitBox.top, hitBox.top + hitBox.height)) {\n return this.legendItems[i];\n }\n }\n }\n return null;\n }\n handleEvent(e) {\n const opts = this.options;\n if (!isListened(e.type, opts)) {\n return;\n }\n const hoveredItem = this._getLegendItemAt(e.x, e.y);\n if (e.type === \'mousemove\' || e.type === \'mouseout\') {\n const previous = this._hoveredItem;\n const sameItem = itemsEqual(previous, hoveredItem);\n if (previous && !sameItem) {\n callback(opts.onLeave, [\n e,\n previous,\n this\n ], this);\n }\n this._hoveredItem = hoveredItem;\n if (hoveredItem && !sameItem) {\n callback(opts.onHover, [\n e,\n hoveredItem,\n this\n ], this);\n }\n } else if (hoveredItem) {\n callback(opts.onClick, [\n e,\n hoveredItem,\n this\n ], this);\n }\n }\n}\nfunction calculateItemSize(boxWidth, labelFont, ctx, legendItem, _itemHeight) {\n const itemWidth = calculateItemWidth(legendItem, boxWidth, labelFont, ctx);\n const itemHeight = calculateItemHeight(_itemHeight, legendItem, labelFont.lineHeight);\n return {\n itemWidth,\n itemHeight\n };\n}\nfunction calculateItemWidth(legendItem, boxWidth, labelFont, ctx) {\n let legendItemText = legendItem.text;\n if (legendItemText && typeof legendItemText !== \'string\') {\n legendItemText = legendItemText.reduce((a, b)=>a.length > b.length ? a : b);\n }\n return boxWidth + labelFont.size / 2 + ctx.measureText(legendItemText).width;\n}\nfunction calculateItemHeight(_itemHeight, legendItem, fontLineHeight) {\n let itemHeight = _itemHeight;\n if (typeof legendItem.text !== \'string\') {\n itemHeight = calculateLegendItemHeight(legendItem, fontLineHeight);\n }\n return itemHeight;\n}\nfunction calculateLegendItemHeight(legendItem, fontLineHeight) {\n const labelHeight = legendItem.text ? legendItem.text.length : 0;\n return fontLineHeight * labelHeight;\n}\nfunction isListened(type, opts) {\n if ((type === \'mousemove\' || type === \'mouseout\') && (opts.onHover || opts.onLeave)) {\n return true;\n }\n if (opts.onClick && (type === \'click\' || type === \'mouseup\')) {\n return true;\n }\n return false;\n}\nvar plugin_legend = {\n id: \'legend\',\n _element: Legend,\n start (chart, _args, options) {\n const legend = chart.legend = new Legend({\n ctx: chart.ctx,\n options,\n chart\n });\n layouts.configure(chart, legend, options);\n layouts.addBox(chart, legend);\n },\n stop (chart) {\n layouts.removeBox(chart, chart.legend);\n delete chart.legend;\n },\n beforeUpdate (chart, _args, options) {\n const legend = chart.legend;\n layouts.configure(chart, legend, options);\n legend.options = options;\n },\n afterUpdate (chart) {\n const legend = chart.legend;\n legend.buildLabels();\n legend.adjustHitBoxes();\n },\n afterEvent (chart, args) {\n if (!args.replay) {\n chart.legend.handleEvent(args.event);\n }\n },\n defaults: {\n display: true,\n position: \'top\',\n align: \'center\',\n fullSize: true,\n reverse: false,\n weight: 1000,\n onClick (e, legendItem, legend) {\n const index = legendItem.datasetIndex;\n const ci = legend.chart;\n if (ci.isDatasetVisible(index)) {\n ci.hide(index);\n legendItem.hidden = true;\n } else {\n ci.show(index);\n legendItem.hidden = false;\n }\n },\n onHover: null,\n onLeave: null,\n labels: {\n color: (ctx)=>ctx.chart.options.color,\n boxWidth: 40,\n padding: 10,\n generateLabels (chart) {\n const datasets = chart.data.datasets;\n const { labels: { usePointStyle , pointStyle , textAlign , color , useBorderRadius , borderRadius } } = chart.legend.options;\n return chart._getSortedDatasetMetas().map((meta)=>{\n const style = meta.controller.getStyle(usePointStyle ? 0 : undefined);\n const borderWidth = toPadding(style.borderWidth);\n return {\n text: datasets[meta.index].label,\n fillStyle: style.backgroundColor,\n fontColor: color,\n hidden: !meta.visible,\n lineCap: style.borderCapStyle,\n lineDash: style.borderDash,\n lineDashOffset: style.borderDashOffset,\n lineJoin: style.borderJoinStyle,\n lineWidth: (borderWidth.width + borderWidth.height) / 4,\n strokeStyle: style.borderColor,\n pointStyle: pointStyle || style.pointStyle,\n rotation: style.rotation,\n textAlign: textAlign || style.textAlign,\n borderRadius: useBorderRadius && (borderRadius || style.borderRadius),\n datasetIndex: meta.index\n };\n }, this);\n }\n },\n title: {\n color: (ctx)=>ctx.chart.options.color,\n display: false,\n position: \'center\',\n text: \'\'\n }\n },\n descriptors: {\n _scriptable: (name)=>!name.startsWith(\'on\'),\n labels: {\n _scriptable: (name)=>![\n \'generateLabels\',\n \'filter\',\n \'sort\'\n ].includes(name)\n }\n }\n};\n\nclass Title extends chart_Element {\n constructor(config){\n super();\n this.chart = config.chart;\n this.options = config.options;\n this.ctx = config.ctx;\n this._padding = undefined;\n this.top = undefined;\n this.bottom = undefined;\n this.left = undefined;\n this.right = undefined;\n this.width = undefined;\n this.height = undefined;\n this.position = undefined;\n this.weight = undefined;\n this.fullSize = undefined;\n }\n update(maxWidth, maxHeight) {\n const opts = this.options;\n this.left = 0;\n this.top = 0;\n if (!opts.display) {\n this.width = this.height = this.right = this.bottom = 0;\n return;\n }\n this.width = this.right = maxWidth;\n this.height = this.bottom = maxHeight;\n const lineCount = isArray(opts.text) ? opts.text.length : 1;\n this._padding = toPadding(opts.padding);\n const textSize = lineCount * toFont(opts.font).lineHeight + this._padding.height;\n if (this.isHorizontal()) {\n this.height = textSize;\n } else {\n this.width = textSize;\n }\n }\n isHorizontal() {\n const pos = this.options.position;\n return pos === \'top\' || pos === \'bottom\';\n }\n _drawArgs(offset) {\n const { top , left , bottom , right , options } = this;\n const align = options.align;\n let rotation = 0;\n let maxWidth, titleX, titleY;\n if (this.isHorizontal()) {\n titleX = _alignStartEnd(align, left, right);\n titleY = top + offset;\n maxWidth = right - left;\n } else {\n if (options.position === \'left\') {\n titleX = left + offset;\n titleY = _alignStartEnd(align, bottom, top);\n rotation = PI * -0.5;\n } else {\n titleX = right - offset;\n titleY = _alignStartEnd(align, top, bottom);\n rotation = PI * 0.5;\n }\n maxWidth = bottom - top;\n }\n return {\n titleX,\n titleY,\n maxWidth,\n rotation\n };\n }\n draw() {\n const ctx = this.ctx;\n const opts = this.options;\n if (!opts.display) {\n return;\n }\n const fontOpts = toFont(opts.font);\n const lineHeight = fontOpts.lineHeight;\n const offset = lineHeight / 2 + this._padding.top;\n const { titleX , titleY , maxWidth , rotation } = this._drawArgs(offset);\n renderText(ctx, opts.text, 0, 0, fontOpts, {\n color: opts.color,\n maxWidth,\n rotation,\n textAlign: _toLeftRightCenter(opts.align),\n textBaseline: \'middle\',\n translation: [\n titleX,\n titleY\n ]\n });\n }\n}\nfunction createTitle(chart, titleOpts) {\n const title = new Title({\n ctx: chart.ctx,\n options: titleOpts,\n chart\n });\n layouts.configure(chart, title, titleOpts);\n layouts.addBox(chart, title);\n chart.titleBlock = title;\n}\nvar plugin_title = {\n id: \'title\',\n _element: Title,\n start (chart, _args, options) {\n createTitle(chart, options);\n },\n stop (chart) {\n const titleBlock = chart.titleBlock;\n layouts.removeBox(chart, titleBlock);\n delete chart.titleBlock;\n },\n beforeUpdate (chart, _args, options) {\n const title = chart.titleBlock;\n layouts.configure(chart, title, options);\n title.options = options;\n },\n defaults: {\n align: \'center\',\n display: false,\n font: {\n weight: \'bold\'\n },\n fullSize: true,\n padding: 10,\n position: \'top\',\n text: \'\',\n weight: 2000\n },\n defaultRoutes: {\n color: \'color\'\n },\n descriptors: {\n _scriptable: true,\n _indexable: false\n }\n};\n\nconst chart_map = new WeakMap();\nvar plugin_subtitle = {\n id: \'subtitle\',\n start (chart, _args, options) {\n const title = new Title({\n ctx: chart.ctx,\n options,\n chart\n });\n layouts.configure(chart, title, options);\n layouts.addBox(chart, title);\n chart_map.set(chart, title);\n },\n stop (chart) {\n layouts.removeBox(chart, chart_map.get(chart));\n chart_map.delete(chart);\n },\n beforeUpdate (chart, _args, options) {\n const title = chart_map.get(chart);\n layouts.configure(chart, title, options);\n title.options = options;\n },\n defaults: {\n align: \'center\',\n display: false,\n font: {\n weight: \'normal\'\n },\n fullSize: true,\n padding: 0,\n position: \'top\',\n text: \'\',\n weight: 1500\n },\n defaultRoutes: {\n color: \'color\'\n },\n descriptors: {\n _scriptable: true,\n _indexable: false\n }\n};\n\nconst positioners = {\n average (items) {\n if (!items.length) {\n return false;\n }\n let i, len;\n let x = 0;\n let y = 0;\n let count = 0;\n for(i = 0, len = items.length; i < len; ++i){\n const el = items[i].element;\n if (el && el.hasValue()) {\n const pos = el.tooltipPosition();\n x += pos.x;\n y += pos.y;\n ++count;\n }\n }\n return {\n x: x / count,\n y: y / count\n };\n },\n nearest (items, eventPosition) {\n if (!items.length) {\n return false;\n }\n let x = eventPosition.x;\n let y = eventPosition.y;\n let minDistance = Number.POSITIVE_INFINITY;\n let i, len, nearestElement;\n for(i = 0, len = items.length; i < len; ++i){\n const el = items[i].element;\n if (el && el.hasValue()) {\n const center = el.getCenterPoint();\n const d = distanceBetweenPoints(eventPosition, center);\n if (d < minDistance) {\n minDistance = d;\n nearestElement = el;\n }\n }\n }\n if (nearestElement) {\n const tp = nearestElement.tooltipPosition();\n x = tp.x;\n y = tp.y;\n }\n return {\n x,\n y\n };\n }\n};\nfunction pushOrConcat(base, toPush) {\n if (toPush) {\n if (isArray(toPush)) {\n Array.prototype.push.apply(base, toPush);\n } else {\n base.push(toPush);\n }\n }\n return base;\n}\n function splitNewlines(str) {\n if ((typeof str === \'string\' || str instanceof String) && str.indexOf(\'\\n\') > -1) {\n return str.split(\'\\n\');\n }\n return str;\n}\n function createTooltipItem(chart, item) {\n const { element , datasetIndex , index } = item;\n const controller = chart.getDatasetMeta(datasetIndex).controller;\n const { label , value } = controller.getLabelAndValue(index);\n return {\n chart,\n label,\n parsed: controller.getParsed(index),\n raw: chart.data.datasets[datasetIndex].data[index],\n formattedValue: value,\n dataset: controller.getDataset(),\n dataIndex: index,\n datasetIndex,\n element\n };\n}\n function getTooltipSize(tooltip, options) {\n const ctx = tooltip.chart.ctx;\n const { body , footer , title } = tooltip;\n const { boxWidth , boxHeight } = options;\n const bodyFont = toFont(options.bodyFont);\n const titleFont = toFont(options.titleFont);\n const footerFont = toFont(options.footerFont);\n const titleLineCount = title.length;\n const footerLineCount = footer.length;\n const bodyLineItemCount = body.length;\n const padding = toPadding(options.padding);\n let height = padding.height;\n let width = 0;\n let combinedBodyLength = body.reduce((count, bodyItem)=>count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length, 0);\n combinedBodyLength += tooltip.beforeBody.length + tooltip.afterBody.length;\n if (titleLineCount) {\n height += titleLineCount * titleFont.lineHeight + (titleLineCount - 1) * options.titleSpacing + options.titleMarginBottom;\n }\n if (combinedBodyLength) {\n const bodyLineHeight = options.displayColors ? Math.max(boxHeight, bodyFont.lineHeight) : bodyFont.lineHeight;\n height += bodyLineItemCount * bodyLineHeight + (combinedBodyLength - bodyLineItemCount) * bodyFont.lineHeight + (combinedBodyLength - 1) * options.bodySpacing;\n }\n if (footerLineCount) {\n height += options.footerMarginTop + footerLineCount * footerFont.lineHeight + (footerLineCount - 1) * options.footerSpacing;\n }\n let widthPadding = 0;\n const maxLineWidth = function(line) {\n width = Math.max(width, ctx.measureText(line).width + widthPadding);\n };\n ctx.save();\n ctx.font = titleFont.string;\n helpers_segment_each(tooltip.title, maxLineWidth);\n ctx.font = bodyFont.string;\n helpers_segment_each(tooltip.beforeBody.concat(tooltip.afterBody), maxLineWidth);\n widthPadding = options.displayColors ? boxWidth + 2 + options.boxPadding : 0;\n helpers_segment_each(body, (bodyItem)=>{\n helpers_segment_each(bodyItem.before, maxLineWidth);\n helpers_segment_each(bodyItem.lines, maxLineWidth);\n helpers_segment_each(bodyItem.after, maxLineWidth);\n });\n widthPadding = 0;\n ctx.font = footerFont.string;\n helpers_segment_each(tooltip.footer, maxLineWidth);\n ctx.restore();\n width += padding.width;\n return {\n width,\n height\n };\n}\nfunction determineYAlign(chart, size) {\n const { y , height } = size;\n if (y < height / 2) {\n return \'top\';\n } else if (y > chart.height - height / 2) {\n return \'bottom\';\n }\n return \'center\';\n}\nfunction doesNotFitWithAlign(xAlign, chart, options, size) {\n const { x , width } = size;\n const caret = options.caretSize + options.caretPadding;\n if (xAlign === \'left\' && x + width + caret > chart.width) {\n return true;\n }\n if (xAlign === \'right\' && x - width - caret < 0) {\n return true;\n }\n}\nfunction determineXAlign(chart, options, size, yAlign) {\n const { x , width } = size;\n const { width: chartWidth , chartArea: { left , right } } = chart;\n let xAlign = \'center\';\n if (yAlign === \'center\') {\n xAlign = x <= (left + right) / 2 ? \'left\' : \'right\';\n } else if (x <= width / 2) {\n xAlign = \'left\';\n } else if (x >= chartWidth - width / 2) {\n xAlign = \'right\';\n }\n if (doesNotFitWithAlign(xAlign, chart, options, size)) {\n xAlign = \'center\';\n }\n return xAlign;\n}\n function determineAlignment(chart, options, size) {\n const yAlign = size.yAlign || options.yAlign || determineYAlign(chart, size);\n return {\n xAlign: size.xAlign || options.xAlign || determineXAlign(chart, options, size, yAlign),\n yAlign\n };\n}\nfunction alignX(size, xAlign) {\n let { x , width } = size;\n if (xAlign === \'right\') {\n x -= width;\n } else if (xAlign === \'center\') {\n x -= width / 2;\n }\n return x;\n}\nfunction alignY(size, yAlign, paddingAndSize) {\n let { y , height } = size;\n if (yAlign === \'top\') {\n y += paddingAndSize;\n } else if (yAlign === \'bottom\') {\n y -= height + paddingAndSize;\n } else {\n y -= height / 2;\n }\n return y;\n}\n function getBackgroundPoint(options, size, alignment, chart) {\n const { caretSize , caretPadding , cornerRadius } = options;\n const { xAlign , yAlign } = alignment;\n const paddingAndSize = caretSize + caretPadding;\n const { topLeft , topRight , bottomLeft , bottomRight } = toTRBLCorners(cornerRadius);\n let x = alignX(size, xAlign);\n const y = alignY(size, yAlign, paddingAndSize);\n if (yAlign === \'center\') {\n if (xAlign === \'left\') {\n x += paddingAndSize;\n } else if (xAlign === \'right\') {\n x -= paddingAndSize;\n }\n } else if (xAlign === \'left\') {\n x -= Math.max(topLeft, bottomLeft) + caretSize;\n } else if (xAlign === \'right\') {\n x += Math.max(topRight, bottomRight) + caretSize;\n }\n return {\n x: _limitValue(x, 0, chart.width - size.width),\n y: _limitValue(y, 0, chart.height - size.height)\n };\n}\nfunction getAlignedX(tooltip, align, options) {\n const padding = toPadding(options.padding);\n return align === \'center\' ? tooltip.x + tooltip.width / 2 : align === \'right\' ? tooltip.x + tooltip.width - padding.right : tooltip.x + padding.left;\n}\n function getBeforeAfterBodyLines(callback) {\n return pushOrConcat([], splitNewlines(callback));\n}\nfunction createTooltipContext(parent, tooltip, tooltipItems) {\n return createContext(parent, {\n tooltip,\n tooltipItems,\n type: \'tooltip\'\n });\n}\nfunction overrideCallbacks(callbacks, context) {\n const override = context && context.dataset && context.dataset.tooltip && context.dataset.tooltip.callbacks;\n return override ? callbacks.override(override) : callbacks;\n}\nconst defaultCallbacks = {\n beforeTitle: helpers_segment_noop,\n title (tooltipItems) {\n if (tooltipItems.length > 0) {\n const item = tooltipItems[0];\n const labels = item.chart.data.labels;\n const labelCount = labels ? labels.length : 0;\n if (this && this.options && this.options.mode === \'dataset\') {\n return item.dataset.label || \'\';\n } else if (item.label) {\n return item.label;\n } else if (labelCount > 0 && item.dataIndex < labelCount) {\n return labels[item.dataIndex];\n }\n }\n return \'\';\n },\n afterTitle: helpers_segment_noop,\n beforeBody: helpers_segment_noop,\n beforeLabel: helpers_segment_noop,\n label (tooltipItem) {\n if (this && this.options && this.options.mode === \'dataset\') {\n return tooltipItem.label + \': \' + tooltipItem.formattedValue || tooltipItem.formattedValue;\n }\n let label = tooltipItem.dataset.label || \'\';\n if (label) {\n label += \': \';\n }\n const value = tooltipItem.formattedValue;\n if (!isNullOrUndef(value)) {\n label += value;\n }\n return label;\n },\n labelColor (tooltipItem) {\n const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex);\n const options = meta.controller.getStyle(tooltipItem.dataIndex);\n return {\n borderColor: options.borderColor,\n backgroundColor: options.backgroundColor,\n borderWidth: options.borderWidth,\n borderDash: options.borderDash,\n borderDashOffset: options.borderDashOffset,\n borderRadius: 0\n };\n },\n labelTextColor () {\n return this.options.bodyColor;\n },\n labelPointStyle (tooltipItem) {\n const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex);\n const options = meta.controller.getStyle(tooltipItem.dataIndex);\n return {\n pointStyle: options.pointStyle,\n rotation: options.rotation\n };\n },\n afterLabel: helpers_segment_noop,\n afterBody: helpers_segment_noop,\n beforeFooter: helpers_segment_noop,\n footer: helpers_segment_noop,\n afterFooter: helpers_segment_noop\n};\n function invokeCallbackWithFallback(callbacks, name, ctx, arg) {\n const result = callbacks[name].call(ctx, arg);\n if (typeof result === \'undefined\') {\n return defaultCallbacks[name].call(ctx, arg);\n }\n return result;\n}\nclass Tooltip extends chart_Element {\n static positioners = positioners;\n constructor(config){\n super();\n this.opacity = 0;\n this._active = [];\n this._eventPosition = undefined;\n this._size = undefined;\n this._cachedAnimations = undefined;\n this._tooltipItems = [];\n this.$animations = undefined;\n this.$context = undefined;\n this.chart = config.chart;\n this.options = config.options;\n this.dataPoints = undefined;\n this.title = undefined;\n this.beforeBody = undefined;\n this.body = undefined;\n this.afterBody = undefined;\n this.footer = undefined;\n this.xAlign = undefined;\n this.yAlign = undefined;\n this.x = undefined;\n this.y = undefined;\n this.height = undefined;\n this.width = undefined;\n this.caretX = undefined;\n this.caretY = undefined;\n this.labelColors = undefined;\n this.labelPointStyles = undefined;\n this.labelTextColors = undefined;\n }\n initialize(options) {\n this.options = options;\n this._cachedAnimations = undefined;\n this.$context = undefined;\n }\n _resolveAnimations() {\n const cached = this._cachedAnimations;\n if (cached) {\n return cached;\n }\n const chart = this.chart;\n const options = this.options.setContext(this.getContext());\n const opts = options.enabled && chart.options.animation && options.animations;\n const animations = new Animations(this.chart, opts);\n if (opts._cacheable) {\n this._cachedAnimations = Object.freeze(animations);\n }\n return animations;\n }\n getContext() {\n return this.$context || (this.$context = createTooltipContext(this.chart.getContext(), this, this._tooltipItems));\n }\n getTitle(context, options) {\n const { callbacks } = options;\n const beforeTitle = invokeCallbackWithFallback(callbacks, \'beforeTitle\', this, context);\n const title = invokeCallbackWithFallback(callbacks, \'title\', this, context);\n const afterTitle = invokeCallbackWithFallback(callbacks, \'afterTitle\', this, context);\n let lines = [];\n lines = pushOrConcat(lines, splitNewlines(beforeTitle));\n lines = pushOrConcat(lines, splitNewlines(title));\n lines = pushOrConcat(lines, splitNewlines(afterTitle));\n return lines;\n }\n getBeforeBody(tooltipItems, options) {\n return getBeforeAfterBodyLines(invokeCallbackWithFallback(options.callbacks, \'beforeBody\', this, tooltipItems));\n }\n getBody(tooltipItems, options) {\n const { callbacks } = options;\n const bodyItems = [];\n helpers_segment_each(tooltipItems, (context)=>{\n const bodyItem = {\n before: [],\n lines: [],\n after: []\n };\n const scoped = overrideCallbacks(callbacks, context);\n pushOrConcat(bodyItem.before, splitNewlines(invokeCallbackWithFallback(scoped, \'beforeLabel\', this, context)));\n pushOrConcat(bodyItem.lines, invokeCallbackWithFallback(scoped, \'label\', this, context));\n pushOrConcat(bodyItem.after, splitNewlines(invokeCallbackWithFallback(scoped, \'afterLabel\', this, context)));\n bodyItems.push(bodyItem);\n });\n return bodyItems;\n }\n getAfterBody(tooltipItems, options) {\n return getBeforeAfterBodyLines(invokeCallbackWithFallback(options.callbacks, \'afterBody\', this, tooltipItems));\n }\n getFooter(tooltipItems, options) {\n const { callbacks } = options;\n const beforeFooter = invokeCallbackWithFallback(callbacks, \'beforeFooter\', this, tooltipItems);\n const footer = invokeCallbackWithFallback(callbacks, \'footer\', this, tooltipItems);\n const afterFooter = invokeCallbackWithFallback(callbacks, \'afterFooter\', this, tooltipItems);\n let lines = [];\n lines = pushOrConcat(lines, splitNewlines(beforeFooter));\n lines = pushOrConcat(lines, splitNewlines(footer));\n lines = pushOrConcat(lines, splitNewlines(afterFooter));\n return lines;\n }\n _createItems(options) {\n const active = this._active;\n const data = this.chart.data;\n const labelColors = [];\n const labelPointStyles = [];\n const labelTextColors = [];\n let tooltipItems = [];\n let i, len;\n for(i = 0, len = active.length; i < len; ++i){\n tooltipItems.push(createTooltipItem(this.chart, active[i]));\n }\n if (options.filter) {\n tooltipItems = tooltipItems.filter((element, index, array)=>options.filter(element, index, array, data));\n }\n if (options.itemSort) {\n tooltipItems = tooltipItems.sort((a, b)=>options.itemSort(a, b, data));\n }\n helpers_segment_each(tooltipItems, (context)=>{\n const scoped = overrideCallbacks(options.callbacks, context);\n labelColors.push(invokeCallbackWithFallback(scoped, \'labelColor\', this, context));\n labelPointStyles.push(invokeCallbackWithFallback(scoped, \'labelPointStyle\', this, context));\n labelTextColors.push(invokeCallbackWithFallback(scoped, \'labelTextColor\', this, context));\n });\n this.labelColors = labelColors;\n this.labelPointStyles = labelPointStyles;\n this.labelTextColors = labelTextColors;\n this.dataPoints = tooltipItems;\n return tooltipItems;\n }\n update(changed, replay) {\n const options = this.options.setContext(this.getContext());\n const active = this._active;\n let properties;\n let tooltipItems = [];\n if (!active.length) {\n if (this.opacity !== 0) {\n properties = {\n opacity: 0\n };\n }\n } else {\n const position = positioners[options.position].call(this, active, this._eventPosition);\n tooltipItems = this._createItems(options);\n this.title = this.getTitle(tooltipItems, options);\n this.beforeBody = this.getBeforeBody(tooltipItems, options);\n this.body = this.getBody(tooltipItems, options);\n this.afterBody = this.getAfterBody(tooltipItems, options);\n this.footer = this.getFooter(tooltipItems, options);\n const size = this._size = getTooltipSize(this, options);\n const positionAndSize = Object.assign({}, position, size);\n const alignment = determineAlignment(this.chart, options, positionAndSize);\n const backgroundPoint = getBackgroundPoint(options, positionAndSize, alignment, this.chart);\n this.xAlign = alignment.xAlign;\n this.yAlign = alignment.yAlign;\n properties = {\n opacity: 1,\n x: backgroundPoint.x,\n y: backgroundPoint.y,\n width: size.width,\n height: size.height,\n caretX: position.x,\n caretY: position.y\n };\n }\n this._tooltipItems = tooltipItems;\n this.$context = undefined;\n if (properties) {\n this._resolveAnimations().update(this, properties);\n }\n if (changed && options.external) {\n options.external.call(this, {\n chart: this.chart,\n tooltip: this,\n replay\n });\n }\n }\n drawCaret(tooltipPoint, ctx, size, options) {\n const caretPosition = this.getCaretPosition(tooltipPoint, size, options);\n ctx.lineTo(caretPosition.x1, caretPosition.y1);\n ctx.lineTo(caretPosition.x2, caretPosition.y2);\n ctx.lineTo(caretPosition.x3, caretPosition.y3);\n }\n getCaretPosition(tooltipPoint, size, options) {\n const { xAlign , yAlign } = this;\n const { caretSize , cornerRadius } = options;\n const { topLeft , topRight , bottomLeft , bottomRight } = toTRBLCorners(cornerRadius);\n const { x: ptX , y: ptY } = tooltipPoint;\n const { width , height } = size;\n let x1, x2, x3, y1, y2, y3;\n if (yAlign === \'center\') {\n y2 = ptY + height / 2;\n if (xAlign === \'left\') {\n x1 = ptX;\n x2 = x1 - caretSize;\n y1 = y2 + caretSize;\n y3 = y2 - caretSize;\n } else {\n x1 = ptX + width;\n x2 = x1 + caretSize;\n y1 = y2 - caretSize;\n y3 = y2 + caretSize;\n }\n x3 = x1;\n } else {\n if (xAlign === \'left\') {\n x2 = ptX + Math.max(topLeft, bottomLeft) + caretSize;\n } else if (xAlign === \'right\') {\n x2 = ptX + width - Math.max(topRight, bottomRight) - caretSize;\n } else {\n x2 = this.caretX;\n }\n if (yAlign === \'top\') {\n y1 = ptY;\n y2 = y1 - caretSize;\n x1 = x2 - caretSize;\n x3 = x2 + caretSize;\n } else {\n y1 = ptY + height;\n y2 = y1 + caretSize;\n x1 = x2 + caretSize;\n x3 = x2 - caretSize;\n }\n y3 = y1;\n }\n return {\n x1,\n x2,\n x3,\n y1,\n y2,\n y3\n };\n }\n drawTitle(pt, ctx, options) {\n const title = this.title;\n const length = title.length;\n let titleFont, titleSpacing, i;\n if (length) {\n const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n pt.x = getAlignedX(this, options.titleAlign, options);\n ctx.textAlign = rtlHelper.textAlign(options.titleAlign);\n ctx.textBaseline = \'middle\';\n titleFont = toFont(options.titleFont);\n titleSpacing = options.titleSpacing;\n ctx.fillStyle = options.titleColor;\n ctx.font = titleFont.string;\n for(i = 0; i < length; ++i){\n ctx.fillText(title[i], rtlHelper.x(pt.x), pt.y + titleFont.lineHeight / 2);\n pt.y += titleFont.lineHeight + titleSpacing;\n if (i + 1 === length) {\n pt.y += options.titleMarginBottom - titleSpacing;\n }\n }\n }\n }\n _drawColorBox(ctx, pt, i, rtlHelper, options) {\n const labelColor = this.labelColors[i];\n const labelPointStyle = this.labelPointStyles[i];\n const { boxHeight , boxWidth } = options;\n const bodyFont = toFont(options.bodyFont);\n const colorX = getAlignedX(this, \'left\', options);\n const rtlColorX = rtlHelper.x(colorX);\n const yOffSet = boxHeight < bodyFont.lineHeight ? (bodyFont.lineHeight - boxHeight) / 2 : 0;\n const colorY = pt.y + yOffSet;\n if (options.usePointStyle) {\n const drawOptions = {\n radius: Math.min(boxWidth, boxHeight) / 2,\n pointStyle: labelPointStyle.pointStyle,\n rotation: labelPointStyle.rotation,\n borderWidth: 1\n };\n const centerX = rtlHelper.leftForLtr(rtlColorX, boxWidth) + boxWidth / 2;\n const centerY = colorY + boxHeight / 2;\n ctx.strokeStyle = options.multiKeyBackground;\n ctx.fillStyle = options.multiKeyBackground;\n drawPoint(ctx, drawOptions, centerX, centerY);\n ctx.strokeStyle = labelColor.borderColor;\n ctx.fillStyle = labelColor.backgroundColor;\n drawPoint(ctx, drawOptions, centerX, centerY);\n } else {\n ctx.lineWidth = isObject(labelColor.borderWidth) ? Math.max(...Object.values(labelColor.borderWidth)) : labelColor.borderWidth || 1;\n ctx.strokeStyle = labelColor.borderColor;\n ctx.setLineDash(labelColor.borderDash || []);\n ctx.lineDashOffset = labelColor.borderDashOffset || 0;\n const outerX = rtlHelper.leftForLtr(rtlColorX, boxWidth);\n const innerX = rtlHelper.leftForLtr(rtlHelper.xPlus(rtlColorX, 1), boxWidth - 2);\n const borderRadius = toTRBLCorners(labelColor.borderRadius);\n if (Object.values(borderRadius).some((v)=>v !== 0)) {\n ctx.beginPath();\n ctx.fillStyle = options.multiKeyBackground;\n addRoundedRectPath(ctx, {\n x: outerX,\n y: colorY,\n w: boxWidth,\n h: boxHeight,\n radius: borderRadius\n });\n ctx.fill();\n ctx.stroke();\n ctx.fillStyle = labelColor.backgroundColor;\n ctx.beginPath();\n addRoundedRectPath(ctx, {\n x: innerX,\n y: colorY + 1,\n w: boxWidth - 2,\n h: boxHeight - 2,\n radius: borderRadius\n });\n ctx.fill();\n } else {\n ctx.fillStyle = options.multiKeyBackground;\n ctx.fillRect(outerX, colorY, boxWidth, boxHeight);\n ctx.strokeRect(outerX, colorY, boxWidth, boxHeight);\n ctx.fillStyle = labelColor.backgroundColor;\n ctx.fillRect(innerX, colorY + 1, boxWidth - 2, boxHeight - 2);\n }\n }\n ctx.fillStyle = this.labelTextColors[i];\n }\n drawBody(pt, ctx, options) {\n const { body } = this;\n const { bodySpacing , bodyAlign , displayColors , boxHeight , boxWidth , boxPadding } = options;\n const bodyFont = toFont(options.bodyFont);\n let bodyLineHeight = bodyFont.lineHeight;\n let xLinePadding = 0;\n const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n const fillLineOfText = function(line) {\n ctx.fillText(line, rtlHelper.x(pt.x + xLinePadding), pt.y + bodyLineHeight / 2);\n pt.y += bodyLineHeight + bodySpacing;\n };\n const bodyAlignForCalculation = rtlHelper.textAlign(bodyAlign);\n let bodyItem, textColor, lines, i, j, ilen, jlen;\n ctx.textAlign = bodyAlign;\n ctx.textBaseline = \'middle\';\n ctx.font = bodyFont.string;\n pt.x = getAlignedX(this, bodyAlignForCalculation, options);\n ctx.fillStyle = options.bodyColor;\n helpers_segment_each(this.beforeBody, fillLineOfText);\n xLinePadding = displayColors && bodyAlignForCalculation !== \'right\' ? bodyAlign === \'center\' ? boxWidth / 2 + boxPadding : boxWidth + 2 + boxPadding : 0;\n for(i = 0, ilen = body.length; i < ilen; ++i){\n bodyItem = body[i];\n textColor = this.labelTextColors[i];\n ctx.fillStyle = textColor;\n helpers_segment_each(bodyItem.before, fillLineOfText);\n lines = bodyItem.lines;\n if (displayColors && lines.length) {\n this._drawColorBox(ctx, pt, i, rtlHelper, options);\n bodyLineHeight = Math.max(bodyFont.lineHeight, boxHeight);\n }\n for(j = 0, jlen = lines.length; j < jlen; ++j){\n fillLineOfText(lines[j]);\n bodyLineHeight = bodyFont.lineHeight;\n }\n helpers_segment_each(bodyItem.after, fillLineOfText);\n }\n xLinePadding = 0;\n bodyLineHeight = bodyFont.lineHeight;\n helpers_segment_each(this.afterBody, fillLineOfText);\n pt.y -= bodySpacing;\n }\n drawFooter(pt, ctx, options) {\n const footer = this.footer;\n const length = footer.length;\n let footerFont, i;\n if (length) {\n const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n pt.x = getAlignedX(this, options.footerAlign, options);\n pt.y += options.footerMarginTop;\n ctx.textAlign = rtlHelper.textAlign(options.footerAlign);\n ctx.textBaseline = \'middle\';\n footerFont = toFont(options.footerFont);\n ctx.fillStyle = options.footerColor;\n ctx.font = footerFont.string;\n for(i = 0; i < length; ++i){\n ctx.fillText(footer[i], rtlHelper.x(pt.x), pt.y + footerFont.lineHeight / 2);\n pt.y += footerFont.lineHeight + options.footerSpacing;\n }\n }\n }\n drawBackground(pt, ctx, tooltipSize, options) {\n const { xAlign , yAlign } = this;\n const { x , y } = pt;\n const { width , height } = tooltipSize;\n const { topLeft , topRight , bottomLeft , bottomRight } = toTRBLCorners(options.cornerRadius);\n ctx.fillStyle = options.backgroundColor;\n ctx.strokeStyle = options.borderColor;\n ctx.lineWidth = options.borderWidth;\n ctx.beginPath();\n ctx.moveTo(x + topLeft, y);\n if (yAlign === \'top\') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + width - topRight, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + topRight);\n if (yAlign === \'center\' && xAlign === \'right\') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + width, y + height - bottomRight);\n ctx.quadraticCurveTo(x + width, y + height, x + width - bottomRight, y + height);\n if (yAlign === \'bottom\') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + bottomLeft, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - bottomLeft);\n if (yAlign === \'center\' && xAlign === \'left\') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x, y + topLeft);\n ctx.quadraticCurveTo(x, y, x + topLeft, y);\n ctx.closePath();\n ctx.fill();\n if (options.borderWidth > 0) {\n ctx.stroke();\n }\n }\n _updateAnimationTarget(options) {\n const chart = this.chart;\n const anims = this.$animations;\n const animX = anims && anims.x;\n const animY = anims && anims.y;\n if (animX || animY) {\n const position = positioners[options.position].call(this, this._active, this._eventPosition);\n if (!position) {\n return;\n }\n const size = this._size = getTooltipSize(this, options);\n const positionAndSize = Object.assign({}, position, this._size);\n const alignment = determineAlignment(chart, options, positionAndSize);\n const point = getBackgroundPoint(options, positionAndSize, alignment, chart);\n if (animX._to !== point.x || animY._to !== point.y) {\n this.xAlign = alignment.xAlign;\n this.yAlign = alignment.yAlign;\n this.width = size.width;\n this.height = size.height;\n this.caretX = position.x;\n this.caretY = position.y;\n this._resolveAnimations().update(this, point);\n }\n }\n }\n _willRender() {\n return !!this.opacity;\n }\n draw(ctx) {\n const options = this.options.setContext(this.getContext());\n let opacity = this.opacity;\n if (!opacity) {\n return;\n }\n this._updateAnimationTarget(options);\n const tooltipSize = {\n width: this.width,\n height: this.height\n };\n const pt = {\n x: this.x,\n y: this.y\n };\n opacity = Math.abs(opacity) < 1e-3 ? 0 : opacity;\n const padding = toPadding(options.padding);\n const hasTooltipContent = this.title.length || this.beforeBody.length || this.body.length || this.afterBody.length || this.footer.length;\n if (options.enabled && hasTooltipContent) {\n ctx.save();\n ctx.globalAlpha = opacity;\n this.drawBackground(pt, ctx, tooltipSize, options);\n overrideTextDirection(ctx, options.textDirection);\n pt.y += padding.top;\n this.drawTitle(pt, ctx, options);\n this.drawBody(pt, ctx, options);\n this.drawFooter(pt, ctx, options);\n restoreTextDirection(ctx, options.textDirection);\n ctx.restore();\n }\n }\n getActiveElements() {\n return this._active || [];\n }\n setActiveElements(activeElements, eventPosition) {\n const lastActive = this._active;\n const active = activeElements.map(({ datasetIndex , index })=>{\n const meta = this.chart.getDatasetMeta(datasetIndex);\n if (!meta) {\n throw new Error(\'Cannot find a dataset at index \' + datasetIndex);\n }\n return {\n datasetIndex,\n element: meta.data[index],\n index\n };\n });\n const changed = !_elementsEqual(lastActive, active);\n const positionChanged = this._positionChanged(active, eventPosition);\n if (changed || positionChanged) {\n this._active = active;\n this._eventPosition = eventPosition;\n this._ignoreReplayEvents = true;\n this.update(true);\n }\n }\n handleEvent(e, replay, inChartArea = true) {\n if (replay && this._ignoreReplayEvents) {\n return false;\n }\n this._ignoreReplayEvents = false;\n const options = this.options;\n const lastActive = this._active || [];\n const active = this._getActiveElements(e, lastActive, replay, inChartArea);\n const positionChanged = this._positionChanged(active, e);\n const changed = replay || !_elementsEqual(active, lastActive) || positionChanged;\n if (changed) {\n this._active = active;\n if (options.enabled || options.external) {\n this._eventPosition = {\n x: e.x,\n y: e.y\n };\n this.update(true, replay);\n }\n }\n return changed;\n }\n _getActiveElements(e, lastActive, replay, inChartArea) {\n const options = this.options;\n if (e.type === \'mouseout\') {\n return [];\n }\n if (!inChartArea) {\n return lastActive;\n }\n const active = this.chart.getElementsAtEventForMode(e, options.mode, options, replay);\n if (options.reverse) {\n active.reverse();\n }\n return active;\n }\n _positionChanged(active, e) {\n const { caretX , caretY , options } = this;\n const position = positioners[options.position].call(this, active, e);\n return position !== false && (caretX !== position.x || caretY !== position.y);\n }\n}\nvar plugin_tooltip = {\n id: \'tooltip\',\n _element: Tooltip,\n positioners,\n afterInit (chart, _args, options) {\n if (options) {\n chart.tooltip = new Tooltip({\n chart,\n options\n });\n }\n },\n beforeUpdate (chart, _args, options) {\n if (chart.tooltip) {\n chart.tooltip.initialize(options);\n }\n },\n reset (chart, _args, options) {\n if (chart.tooltip) {\n chart.tooltip.initialize(options);\n }\n },\n afterDraw (chart) {\n const tooltip = chart.tooltip;\n if (tooltip && tooltip._willRender()) {\n const args = {\n tooltip\n };\n if (chart.notifyPlugins(\'beforeTooltipDraw\', {\n ...args,\n cancelable: true\n }) === false) {\n return;\n }\n tooltip.draw(chart.ctx);\n chart.notifyPlugins(\'afterTooltipDraw\', args);\n }\n },\n afterEvent (chart, args) {\n if (chart.tooltip) {\n const useFinalPosition = args.replay;\n if (chart.tooltip.handleEvent(args.event, useFinalPosition, args.inChartArea)) {\n args.changed = true;\n }\n }\n },\n defaults: {\n enabled: true,\n external: null,\n position: \'average\',\n backgroundColor: \'rgba(0,0,0,0.8)\',\n titleColor: \'#fff\',\n titleFont: {\n weight: \'bold\'\n },\n titleSpacing: 2,\n titleMarginBottom: 6,\n titleAlign: \'left\',\n bodyColor: \'#fff\',\n bodySpacing: 2,\n bodyFont: {},\n bodyAlign: \'left\',\n footerColor: \'#fff\',\n footerSpacing: 2,\n footerMarginTop: 6,\n footerFont: {\n weight: \'bold\'\n },\n footerAlign: \'left\',\n padding: 6,\n caretPadding: 2,\n caretSize: 5,\n cornerRadius: 6,\n boxHeight: (ctx, opts)=>opts.bodyFont.size,\n boxWidth: (ctx, opts)=>opts.bodyFont.size,\n multiKeyBackground: \'#fff\',\n displayColors: true,\n boxPadding: 0,\n borderColor: \'rgba(0,0,0,0)\',\n borderWidth: 0,\n animation: {\n duration: 400,\n easing: \'easeOutQuart\'\n },\n animations: {\n numbers: {\n type: \'number\',\n properties: [\n \'x\',\n \'y\',\n \'width\',\n \'height\',\n \'caretX\',\n \'caretY\'\n ]\n },\n opacity: {\n easing: \'linear\',\n duration: 200\n }\n },\n callbacks: defaultCallbacks\n },\n defaultRoutes: {\n bodyFont: \'font\',\n footerFont: \'font\',\n titleFont: \'font\'\n },\n descriptors: {\n _scriptable: (name)=>name !== \'filter\' && name !== \'itemSort\' && name !== \'external\',\n _indexable: false,\n callbacks: {\n _scriptable: false,\n _indexable: false\n },\n animation: {\n _fallback: false\n },\n animations: {\n _fallback: \'animation\'\n }\n },\n additionalOptionScopes: [\n \'interaction\'\n ]\n};\n\nvar plugins = /*#__PURE__*/Object.freeze({\n__proto__: null,\nColors: plugin_colors,\nDecimation: plugin_decimation,\nFiller: index,\nLegend: plugin_legend,\nSubTitle: plugin_subtitle,\nTitle: plugin_title,\nTooltip: plugin_tooltip\n});\n\nconst addIfString = (labels, raw, index, addedLabels)=>{\n if (typeof raw === \'string\') {\n index = labels.push(raw) - 1;\n addedLabels.unshift({\n index,\n label: raw\n });\n } else if (isNaN(raw)) {\n index = null;\n }\n return index;\n};\nfunction findOrAddLabel(labels, raw, index, addedLabels) {\n const first = labels.indexOf(raw);\n if (first === -1) {\n return addIfString(labels, raw, index, addedLabels);\n }\n const last = labels.lastIndexOf(raw);\n return first !== last ? index : first;\n}\nconst validIndex = (index, max)=>index === null ? null : _limitValue(Math.round(index), 0, max);\nfunction _getLabelForValue(value) {\n const labels = this.getLabels();\n if (value >= 0 && value < labels.length) {\n return labels[value];\n }\n return value;\n}\nclass CategoryScale extends Scale {\n static id = \'category\';\n static defaults = {\n ticks: {\n callback: _getLabelForValue\n }\n };\n constructor(cfg){\n super(cfg);\n this._startValue = undefined;\n this._valueRange = 0;\n this._addedLabels = [];\n }\n init(scaleOptions) {\n const added = this._addedLabels;\n if (added.length) {\n const labels = this.getLabels();\n for (const { index , label } of added){\n if (labels[index] === label) {\n labels.splice(index, 1);\n }\n }\n this._addedLabels = [];\n }\n super.init(scaleOptions);\n }\n parse(raw, index) {\n if (isNullOrUndef(raw)) {\n return null;\n }\n const labels = this.getLabels();\n index = isFinite(index) && labels[index] === raw ? index : findOrAddLabel(labels, raw, valueOrDefault(index, raw), this._addedLabels);\n return validIndex(index, labels.length - 1);\n }\n determineDataLimits() {\n const { minDefined , maxDefined } = this.getUserBounds();\n let { min , max } = this.getMinMax(true);\n if (this.options.bounds === \'ticks\') {\n if (!minDefined) {\n min = 0;\n }\n if (!maxDefined) {\n max = this.getLabels().length - 1;\n }\n }\n this.min = min;\n this.max = max;\n }\n buildTicks() {\n const min = this.min;\n const max = this.max;\n const offset = this.options.offset;\n const ticks = [];\n let labels = this.getLabels();\n labels = min === 0 && max === labels.length - 1 ? labels : labels.slice(min, max + 1);\n this._valueRange = Math.max(labels.length - (offset ? 0 : 1), 1);\n this._startValue = this.min - (offset ? 0.5 : 0);\n for(let value = min; value <= max; value++){\n ticks.push({\n value\n });\n }\n return ticks;\n }\n getLabelForValue(value) {\n return _getLabelForValue.call(this, value);\n }\n configure() {\n super.configure();\n if (!this.isHorizontal()) {\n this._reversePixels = !this._reversePixels;\n }\n }\n getPixelForValue(value) {\n if (typeof value !== \'number\') {\n value = this.parse(value);\n }\n return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange);\n }\n getPixelForTick(index) {\n const ticks = this.ticks;\n if (index < 0 || index > ticks.length - 1) {\n return null;\n }\n return this.getPixelForValue(ticks[index].value);\n }\n getValueForPixel(pixel) {\n return Math.round(this._startValue + this.getDecimalForPixel(pixel) * this._valueRange);\n }\n getBasePixel() {\n return this.bottom;\n }\n}\n\nfunction generateTicks$1(generationOptions, dataRange) {\n const ticks = [];\n const MIN_SPACING = 1e-14;\n const { bounds , step , min , max , precision , count , maxTicks , maxDigits , includeBounds } = generationOptions;\n const unit = step || 1;\n const maxSpaces = maxTicks - 1;\n const { min: rmin , max: rmax } = dataRange;\n const minDefined = !isNullOrUndef(min);\n const maxDefined = !isNullOrUndef(max);\n const countDefined = !isNullOrUndef(count);\n const minSpacing = (rmax - rmin) / (maxDigits + 1);\n let spacing = niceNum((rmax - rmin) / maxSpaces / unit) * unit;\n let factor, niceMin, niceMax, numSpaces;\n if (spacing < MIN_SPACING && !minDefined && !maxDefined) {\n return [\n {\n value: rmin\n },\n {\n value: rmax\n }\n ];\n }\n numSpaces = Math.ceil(rmax / spacing) - Math.floor(rmin / spacing);\n if (numSpaces > maxSpaces) {\n spacing = niceNum(numSpaces * spacing / maxSpaces / unit) * unit;\n }\n if (!isNullOrUndef(precision)) {\n factor = Math.pow(10, precision);\n spacing = Math.ceil(spacing * factor) / factor;\n }\n if (bounds === \'ticks\') {\n niceMin = Math.floor(rmin / spacing) * spacing;\n niceMax = Math.ceil(rmax / spacing) * spacing;\n } else {\n niceMin = rmin;\n niceMax = rmax;\n }\n if (minDefined && maxDefined && step && almostWhole((max - min) / step, spacing / 1000)) {\n numSpaces = Math.round(Math.min((max - min) / spacing, maxTicks));\n spacing = (max - min) / numSpaces;\n niceMin = min;\n niceMax = max;\n } else if (countDefined) {\n niceMin = minDefined ? min : niceMin;\n niceMax = maxDefined ? max : niceMax;\n numSpaces = count - 1;\n spacing = (niceMax - niceMin) / numSpaces;\n } else {\n numSpaces = (niceMax - niceMin) / spacing;\n if (almostEquals(numSpaces, Math.round(numSpaces), spacing / 1000)) {\n numSpaces = Math.round(numSpaces);\n } else {\n numSpaces = Math.ceil(numSpaces);\n }\n }\n const decimalPlaces = Math.max(_decimalPlaces(spacing), _decimalPlaces(niceMin));\n factor = Math.pow(10, isNullOrUndef(precision) ? decimalPlaces : precision);\n niceMin = Math.round(niceMin * factor) / factor;\n niceMax = Math.round(niceMax * factor) / factor;\n let j = 0;\n if (minDefined) {\n if (includeBounds && niceMin !== min) {\n ticks.push({\n value: min\n });\n if (niceMin < min) {\n j++;\n }\n if (almostEquals(Math.round((niceMin + j * spacing) * factor) / factor, min, relativeLabelSize(min, minSpacing, generationOptions))) {\n j++;\n }\n } else if (niceMin < min) {\n j++;\n }\n }\n for(; j < numSpaces; ++j){\n const tickValue = Math.round((niceMin + j * spacing) * factor) / factor;\n if (maxDefined && tickValue > max) {\n break;\n }\n ticks.push({\n value: tickValue\n });\n }\n if (maxDefined && includeBounds && niceMax !== max) {\n if (ticks.length && almostEquals(ticks[ticks.length - 1].value, max, relativeLabelSize(max, minSpacing, generationOptions))) {\n ticks[ticks.length - 1].value = max;\n } else {\n ticks.push({\n value: max\n });\n }\n } else if (!maxDefined || niceMax === max) {\n ticks.push({\n value: niceMax\n });\n }\n return ticks;\n}\nfunction relativeLabelSize(value, minSpacing, { horizontal , minRotation }) {\n const rad = toRadians(minRotation);\n const ratio = (horizontal ? Math.sin(rad) : Math.cos(rad)) || 0.001;\n const length = 0.75 * minSpacing * (\'\' + value).length;\n return Math.min(minSpacing / ratio, length);\n}\nclass LinearScaleBase extends Scale {\n constructor(cfg){\n super(cfg);\n this.start = undefined;\n this.end = undefined;\n this._startValue = undefined;\n this._endValue = undefined;\n this._valueRange = 0;\n }\n parse(raw, index) {\n if (isNullOrUndef(raw)) {\n return null;\n }\n if ((typeof raw === \'number\' || raw instanceof Number) && !isFinite(+raw)) {\n return null;\n }\n return +raw;\n }\n handleTickRangeOptions() {\n const { beginAtZero } = this.options;\n const { minDefined , maxDefined } = this.getUserBounds();\n let { min , max } = this;\n const setMin = (v)=>min = minDefined ? min : v;\n const setMax = (v)=>max = maxDefined ? max : v;\n if (beginAtZero) {\n const minSign = sign(min);\n const maxSign = sign(max);\n if (minSign < 0 && maxSign < 0) {\n setMax(0);\n } else if (minSign > 0 && maxSign > 0) {\n setMin(0);\n }\n }\n if (min === max) {\n let offset = max === 0 ? 1 : Math.abs(max * 0.05);\n setMax(max + offset);\n if (!beginAtZero) {\n setMin(min - offset);\n }\n }\n this.min = min;\n this.max = max;\n }\n getTickLimit() {\n const tickOpts = this.options.ticks;\n let { maxTicksLimit , stepSize } = tickOpts;\n let maxTicks;\n if (stepSize) {\n maxTicks = Math.ceil(this.max / stepSize) - Math.floor(this.min / stepSize) + 1;\n if (maxTicks > 1000) {\n console.warn(`scales.${this.id}.ticks.stepSize: ${stepSize} would result generating up to ${maxTicks} ticks. Limiting to 1000.`);\n maxTicks = 1000;\n }\n } else {\n maxTicks = this.computeTickLimit();\n maxTicksLimit = maxTicksLimit || 11;\n }\n if (maxTicksLimit) {\n maxTicks = Math.min(maxTicksLimit, maxTicks);\n }\n return maxTicks;\n }\n computeTickLimit() {\n return Number.POSITIVE_INFINITY;\n }\n buildTicks() {\n const opts = this.options;\n const tickOpts = opts.ticks;\n let maxTicks = this.getTickLimit();\n maxTicks = Math.max(2, maxTicks);\n const numericGeneratorOptions = {\n maxTicks,\n bounds: opts.bounds,\n min: opts.min,\n max: opts.max,\n precision: tickOpts.precision,\n step: tickOpts.stepSize,\n count: tickOpts.count,\n maxDigits: this._maxDigits(),\n horizontal: this.isHorizontal(),\n minRotation: tickOpts.minRotation || 0,\n includeBounds: tickOpts.includeBounds !== false\n };\n const dataRange = this._range || this;\n const ticks = generateTicks$1(numericGeneratorOptions, dataRange);\n if (opts.bounds === \'ticks\') {\n _setMinAndMaxByKey(ticks, this, \'value\');\n }\n if (opts.reverse) {\n ticks.reverse();\n this.start = this.max;\n this.end = this.min;\n } else {\n this.start = this.min;\n this.end = this.max;\n }\n return ticks;\n }\n configure() {\n const ticks = this.ticks;\n let start = this.min;\n let end = this.max;\n super.configure();\n if (this.options.offset && ticks.length) {\n const offset = (end - start) / Math.max(ticks.length - 1, 1) / 2;\n start -= offset;\n end += offset;\n }\n this._startValue = start;\n this._endValue = end;\n this._valueRange = end - start;\n }\n getLabelForValue(value) {\n return formatNumber(value, this.chart.options.locale, this.options.ticks.format);\n }\n}\n\nclass LinearScale extends LinearScaleBase {\n static id = \'linear\';\n static defaults = {\n ticks: {\n callback: Ticks.formatters.numeric\n }\n };\n determineDataLimits() {\n const { min , max } = this.getMinMax(true);\n this.min = isNumberFinite(min) ? min : 0;\n this.max = isNumberFinite(max) ? max : 1;\n this.handleTickRangeOptions();\n }\n computeTickLimit() {\n const horizontal = this.isHorizontal();\n const length = horizontal ? this.width : this.height;\n const minRotation = toRadians(this.options.ticks.minRotation);\n const ratio = (horizontal ? Math.sin(minRotation) : Math.cos(minRotation)) || 0.001;\n const tickFont = this._resolveTickFontOptions(0);\n return Math.ceil(length / Math.min(40, tickFont.lineHeight / ratio));\n }\n getPixelForValue(value) {\n return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange);\n }\n getValueForPixel(pixel) {\n return this._startValue + this.getDecimalForPixel(pixel) * this._valueRange;\n }\n}\n\nconst log10Floor = (v)=>Math.floor(log10(v));\nconst changeExponent = (v, m)=>Math.pow(10, log10Floor(v) + m);\nfunction isMajor(tickVal) {\n const remain = tickVal / Math.pow(10, log10Floor(tickVal));\n return remain === 1;\n}\nfunction steps(min, max, rangeExp) {\n const rangeStep = Math.pow(10, rangeExp);\n const start = Math.floor(min / rangeStep);\n const end = Math.ceil(max / rangeStep);\n return end - start;\n}\nfunction startExp(min, max) {\n const range = max - min;\n let rangeExp = log10Floor(range);\n while(steps(min, max, rangeExp) > 10){\n rangeExp++;\n }\n while(steps(min, max, rangeExp) < 10){\n rangeExp--;\n }\n return Math.min(rangeExp, log10Floor(min));\n}\n function generateTicks(generationOptions, { min , max }) {\n min = finiteOrDefault(generationOptions.min, min);\n const ticks = [];\n const minExp = log10Floor(min);\n let exp = startExp(min, max);\n let precision = exp < 0 ? Math.pow(10, Math.abs(exp)) : 1;\n const stepSize = Math.pow(10, exp);\n const base = minExp > exp ? Math.pow(10, minExp) : 0;\n const start = Math.round((min - base) * precision) / precision;\n const offset = Math.floor((min - base) / stepSize / 10) * stepSize * 10;\n let significand = Math.floor((start - offset) / Math.pow(10, exp));\n let value = finiteOrDefault(generationOptions.min, Math.round((base + offset + significand * Math.pow(10, exp)) * precision) / precision);\n while(value < max){\n ticks.push({\n value,\n major: isMajor(value),\n significand\n });\n if (significand >= 10) {\n significand = significand < 15 ? 15 : 20;\n } else {\n significand++;\n }\n if (significand >= 20) {\n exp++;\n significand = 2;\n precision = exp >= 0 ? 1 : precision;\n }\n value = Math.round((base + offset + significand * Math.pow(10, exp)) * precision) / precision;\n }\n const lastTick = finiteOrDefault(generationOptions.max, value);\n ticks.push({\n value: lastTick,\n major: isMajor(lastTick),\n significand\n });\n return ticks;\n}\nclass LogarithmicScale extends Scale {\n static id = \'logarithmic\';\n static defaults = {\n ticks: {\n callback: Ticks.formatters.logarithmic,\n major: {\n enabled: true\n }\n }\n };\n constructor(cfg){\n super(cfg);\n this.start = undefined;\n this.end = undefined;\n this._startValue = undefined;\n this._valueRange = 0;\n }\n parse(raw, index) {\n const value = LinearScaleBase.prototype.parse.apply(this, [\n raw,\n index\n ]);\n if (value === 0) {\n this._zero = true;\n return undefined;\n }\n return isNumberFinite(value) && value > 0 ? value : null;\n }\n determineDataLimits() {\n const { min , max } = this.getMinMax(true);\n this.min = isNumberFinite(min) ? Math.max(0, min) : null;\n this.max = isNumberFinite(max) ? Math.max(0, max) : null;\n if (this.options.beginAtZero) {\n this._zero = true;\n }\n if (this._zero && this.min !== this._suggestedMin && !isNumberFinite(this._userMin)) {\n this.min = min === changeExponent(this.min, 0) ? changeExponent(this.min, -1) : changeExponent(this.min, 0);\n }\n this.handleTickRangeOptions();\n }\n handleTickRangeOptions() {\n const { minDefined , maxDefined } = this.getUserBounds();\n let min = this.min;\n let max = this.max;\n const setMin = (v)=>min = minDefined ? min : v;\n const setMax = (v)=>max = maxDefined ? max : v;\n if (min === max) {\n if (min <= 0) {\n setMin(1);\n setMax(10);\n } else {\n setMin(changeExponent(min, -1));\n setMax(changeExponent(max, +1));\n }\n }\n if (min <= 0) {\n setMin(changeExponent(max, -1));\n }\n if (max <= 0) {\n setMax(changeExponent(min, +1));\n }\n this.min = min;\n this.max = max;\n }\n buildTicks() {\n const opts = this.options;\n const generationOptions = {\n min: this._userMin,\n max: this._userMax\n };\n const ticks = generateTicks(generationOptions, this);\n if (opts.bounds === \'ticks\') {\n _setMinAndMaxByKey(ticks, this, \'value\');\n }\n if (opts.reverse) {\n ticks.reverse();\n this.start = this.max;\n this.end = this.min;\n } else {\n this.start = this.min;\n this.end = this.max;\n }\n return ticks;\n }\n getLabelForValue(value) {\n return value === undefined ? \'0\' : formatNumber(value, this.chart.options.locale, this.options.ticks.format);\n }\n configure() {\n const start = this.min;\n super.configure();\n this._startValue = log10(start);\n this._valueRange = log10(this.max) - log10(start);\n }\n getPixelForValue(value) {\n if (value === undefined || value === 0) {\n value = this.min;\n }\n if (value === null || isNaN(value)) {\n return NaN;\n }\n return this.getPixelForDecimal(value === this.min ? 0 : (log10(value) - this._startValue) / this._valueRange);\n }\n getValueForPixel(pixel) {\n const decimal = this.getDecimalForPixel(pixel);\n return Math.pow(10, this._startValue + decimal * this._valueRange);\n }\n}\n\nfunction getTickBackdropHeight(opts) {\n const tickOpts = opts.ticks;\n if (tickOpts.display && opts.display) {\n const padding = toPadding(tickOpts.backdropPadding);\n return valueOrDefault(tickOpts.font && tickOpts.font.size, defaults.font.size) + padding.height;\n }\n return 0;\n}\nfunction measureLabelSize(ctx, font, label) {\n label = isArray(label) ? label : [\n label\n ];\n return {\n w: _longestText(ctx, font.string, label),\n h: label.length * font.lineHeight\n };\n}\nfunction determineLimits(angle, pos, size, min, max) {\n if (angle === min || angle === max) {\n return {\n start: pos - size / 2,\n end: pos + size / 2\n };\n } else if (angle < min || angle > max) {\n return {\n start: pos - size,\n end: pos\n };\n }\n return {\n start: pos,\n end: pos + size\n };\n}\n function fitWithPointLabels(scale) {\n const orig = {\n l: scale.left + scale._padding.left,\n r: scale.right - scale._padding.right,\n t: scale.top + scale._padding.top,\n b: scale.bottom - scale._padding.bottom\n };\n const limits = Object.assign({}, orig);\n const labelSizes = [];\n const padding = [];\n const valueCount = scale._pointLabels.length;\n const pointLabelOpts = scale.options.pointLabels;\n const additionalAngle = pointLabelOpts.centerPointLabels ? PI / valueCount : 0;\n for(let i = 0; i < valueCount; i++){\n const opts = pointLabelOpts.setContext(scale.getPointLabelContext(i));\n padding[i] = opts.padding;\n const pointPosition = scale.getPointPosition(i, scale.drawingArea + padding[i], additionalAngle);\n const plFont = toFont(opts.font);\n const textSize = measureLabelSize(scale.ctx, plFont, scale._pointLabels[i]);\n labelSizes[i] = textSize;\n const angleRadians = _normalizeAngle(scale.getIndexAngle(i) + additionalAngle);\n const angle = Math.round(toDegrees(angleRadians));\n const hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180);\n const vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270);\n updateLimits(limits, orig, angleRadians, hLimits, vLimits);\n }\n scale.setCenterPoint(orig.l - limits.l, limits.r - orig.r, orig.t - limits.t, limits.b - orig.b);\n scale._pointLabelItems = buildPointLabelItems(scale, labelSizes, padding);\n}\nfunction updateLimits(limits, orig, angle, hLimits, vLimits) {\n const sin = Math.abs(Math.sin(angle));\n const cos = Math.abs(Math.cos(angle));\n let x = 0;\n let y = 0;\n if (hLimits.start < orig.l) {\n x = (orig.l - hLimits.start) / sin;\n limits.l = Math.min(limits.l, orig.l - x);\n } else if (hLimits.end > orig.r) {\n x = (hLimits.end - orig.r) / sin;\n limits.r = Math.max(limits.r, orig.r + x);\n }\n if (vLimits.start < orig.t) {\n y = (orig.t - vLimits.start) / cos;\n limits.t = Math.min(limits.t, orig.t - y);\n } else if (vLimits.end > orig.b) {\n y = (vLimits.end - orig.b) / cos;\n limits.b = Math.max(limits.b, orig.b + y);\n }\n}\nfunction createPointLabelItem(scale, index, itemOpts) {\n const outerDistance = scale.drawingArea;\n const { extra , additionalAngle , padding , size } = itemOpts;\n const pointLabelPosition = scale.getPointPosition(index, outerDistance + extra + padding, additionalAngle);\n const angle = Math.round(toDegrees(_normalizeAngle(pointLabelPosition.angle + HALF_PI)));\n const y = yForAngle(pointLabelPosition.y, size.h, angle);\n const textAlign = getTextAlignForAngle(angle);\n const left = leftForTextAlign(pointLabelPosition.x, size.w, textAlign);\n return {\n visible: true,\n x: pointLabelPosition.x,\n y,\n textAlign,\n left,\n top: y,\n right: left + size.w,\n bottom: y + size.h\n };\n}\nfunction isNotOverlapped(item, area) {\n if (!area) {\n return true;\n }\n const { left , top , right , bottom } = item;\n const apexesInArea = _isPointInArea({\n x: left,\n y: top\n }, area) || _isPointInArea({\n x: left,\n y: bottom\n }, area) || _isPointInArea({\n x: right,\n y: top\n }, area) || _isPointInArea({\n x: right,\n y: bottom\n }, area);\n return !apexesInArea;\n}\nfunction buildPointLabelItems(scale, labelSizes, padding) {\n const items = [];\n const valueCount = scale._pointLabels.length;\n const opts = scale.options;\n const { centerPointLabels , display } = opts.pointLabels;\n const itemOpts = {\n extra: getTickBackdropHeight(opts) / 2,\n additionalAngle: centerPointLabels ? PI / valueCount : 0\n };\n let area;\n for(let i = 0; i < valueCount; i++){\n itemOpts.padding = padding[i];\n itemOpts.size = labelSizes[i];\n const item = createPointLabelItem(scale, i, itemOpts);\n items.push(item);\n if (display === \'auto\') {\n item.visible = isNotOverlapped(item, area);\n if (item.visible) {\n area = item;\n }\n }\n }\n return items;\n}\nfunction getTextAlignForAngle(angle) {\n if (angle === 0 || angle === 180) {\n return \'center\';\n } else if (angle < 180) {\n return \'left\';\n }\n return \'right\';\n}\nfunction leftForTextAlign(x, w, align) {\n if (align === \'right\') {\n x -= w;\n } else if (align === \'center\') {\n x -= w / 2;\n }\n return x;\n}\nfunction yForAngle(y, h, angle) {\n if (angle === 90 || angle === 270) {\n y -= h / 2;\n } else if (angle > 270 || angle < 90) {\n y -= h;\n }\n return y;\n}\nfunction drawPointLabelBox(ctx, opts, item) {\n const { left , top , right , bottom } = item;\n const { backdropColor } = opts;\n if (!isNullOrUndef(backdropColor)) {\n const borderRadius = toTRBLCorners(opts.borderRadius);\n const padding = toPadding(opts.backdropPadding);\n ctx.fillStyle = backdropColor;\n const backdropLeft = left - padding.left;\n const backdropTop = top - padding.top;\n const backdropWidth = right - left + padding.width;\n const backdropHeight = bottom - top + padding.height;\n if (Object.values(borderRadius).some((v)=>v !== 0)) {\n ctx.beginPath();\n addRoundedRectPath(ctx, {\n x: backdropLeft,\n y: backdropTop,\n w: backdropWidth,\n h: backdropHeight,\n radius: borderRadius\n });\n ctx.fill();\n } else {\n ctx.fillRect(backdropLeft, backdropTop, backdropWidth, backdropHeight);\n }\n }\n}\nfunction drawPointLabels(scale, labelCount) {\n const { ctx , options: { pointLabels } } = scale;\n for(let i = labelCount - 1; i >= 0; i--){\n const item = scale._pointLabelItems[i];\n if (!item.visible) {\n continue;\n }\n const optsAtIndex = pointLabels.setContext(scale.getPointLabelContext(i));\n drawPointLabelBox(ctx, optsAtIndex, item);\n const plFont = toFont(optsAtIndex.font);\n const { x , y , textAlign } = item;\n renderText(ctx, scale._pointLabels[i], x, y + plFont.lineHeight / 2, plFont, {\n color: optsAtIndex.color,\n textAlign: textAlign,\n textBaseline: \'middle\'\n });\n }\n}\nfunction pathRadiusLine(scale, radius, circular, labelCount) {\n const { ctx } = scale;\n if (circular) {\n ctx.arc(scale.xCenter, scale.yCenter, radius, 0, TAU);\n } else {\n let pointPosition = scale.getPointPosition(0, radius);\n ctx.moveTo(pointPosition.x, pointPosition.y);\n for(let i = 1; i < labelCount; i++){\n pointPosition = scale.getPointPosition(i, radius);\n ctx.lineTo(pointPosition.x, pointPosition.y);\n }\n }\n}\nfunction drawRadiusLine(scale, gridLineOpts, radius, labelCount, borderOpts) {\n const ctx = scale.ctx;\n const circular = gridLineOpts.circular;\n const { color , lineWidth } = gridLineOpts;\n if (!circular && !labelCount || !color || !lineWidth || radius < 0) {\n return;\n }\n ctx.save();\n ctx.strokeStyle = color;\n ctx.lineWidth = lineWidth;\n ctx.setLineDash(borderOpts.dash);\n ctx.lineDashOffset = borderOpts.dashOffset;\n ctx.beginPath();\n pathRadiusLine(scale, radius, circular, labelCount);\n ctx.closePath();\n ctx.stroke();\n ctx.restore();\n}\nfunction createPointLabelContext(parent, index, label) {\n return createContext(parent, {\n label,\n index,\n type: \'pointLabel\'\n });\n}\nclass RadialLinearScale extends LinearScaleBase {\n static id = \'radialLinear\';\n static defaults = {\n display: true,\n animate: true,\n position: \'chartArea\',\n angleLines: {\n display: true,\n lineWidth: 1,\n borderDash: [],\n borderDashOffset: 0.0\n },\n grid: {\n circular: false\n },\n startAngle: 0,\n ticks: {\n showLabelBackdrop: true,\n callback: Ticks.formatters.numeric\n },\n pointLabels: {\n backdropColor: undefined,\n backdropPadding: 2,\n display: true,\n font: {\n size: 10\n },\n callback (label) {\n return label;\n },\n padding: 5,\n centerPointLabels: false\n }\n };\n static defaultRoutes = {\n \'angleLines.color\': \'borderColor\',\n \'pointLabels.color\': \'color\',\n \'ticks.color\': \'color\'\n };\n static descriptors = {\n angleLines: {\n _fallback: \'grid\'\n }\n };\n constructor(cfg){\n super(cfg);\n this.xCenter = undefined;\n this.yCenter = undefined;\n this.drawingArea = undefined;\n this._pointLabels = [];\n this._pointLabelItems = [];\n }\n setDimensions() {\n const padding = this._padding = toPadding(getTickBackdropHeight(this.options) / 2);\n const w = this.width = this.maxWidth - padding.width;\n const h = this.height = this.maxHeight - padding.height;\n this.xCenter = Math.floor(this.left + w / 2 + padding.left);\n this.yCenter = Math.floor(this.top + h / 2 + padding.top);\n this.drawingArea = Math.floor(Math.min(w, h) / 2);\n }\n determineDataLimits() {\n const { min , max } = this.getMinMax(false);\n this.min = isNumberFinite(min) && !isNaN(min) ? min : 0;\n this.max = isNumberFinite(max) && !isNaN(max) ? max : 0;\n this.handleTickRangeOptions();\n }\n computeTickLimit() {\n return Math.ceil(this.drawingArea / getTickBackdropHeight(this.options));\n }\n generateTickLabels(ticks) {\n LinearScaleBase.prototype.generateTickLabels.call(this, ticks);\n this._pointLabels = this.getLabels().map((value, index)=>{\n const label = callback(this.options.pointLabels.callback, [\n value,\n index\n ], this);\n return label || label === 0 ? label : \'\';\n }).filter((v, i)=>this.chart.getDataVisibility(i));\n }\n fit() {\n const opts = this.options;\n if (opts.display && opts.pointLabels.display) {\n fitWithPointLabels(this);\n } else {\n this.setCenterPoint(0, 0, 0, 0);\n }\n }\n setCenterPoint(leftMovement, rightMovement, topMovement, bottomMovement) {\n this.xCenter += Math.floor((leftMovement - rightMovement) / 2);\n this.yCenter += Math.floor((topMovement - bottomMovement) / 2);\n this.drawingArea -= Math.min(this.drawingArea / 2, Math.max(leftMovement, rightMovement, topMovement, bottomMovement));\n }\n getIndexAngle(index) {\n const angleMultiplier = TAU / (this._pointLabels.length || 1);\n const startAngle = this.options.startAngle || 0;\n return _normalizeAngle(index * angleMultiplier + toRadians(startAngle));\n }\n getDistanceFromCenterForValue(value) {\n if (isNullOrUndef(value)) {\n return NaN;\n }\n const scalingFactor = this.drawingArea / (this.max - this.min);\n if (this.options.reverse) {\n return (this.max - value) * scalingFactor;\n }\n return (value - this.min) * scalingFactor;\n }\n getValueForDistanceFromCenter(distance) {\n if (isNullOrUndef(distance)) {\n return NaN;\n }\n const scaledDistance = distance / (this.drawingArea / (this.max - this.min));\n return this.options.reverse ? this.max - scaledDistance : this.min + scaledDistance;\n }\n getPointLabelContext(index) {\n const pointLabels = this._pointLabels || [];\n if (index >= 0 && index < pointLabels.length) {\n const pointLabel = pointLabels[index];\n return createPointLabelContext(this.getContext(), index, pointLabel);\n }\n }\n getPointPosition(index, distanceFromCenter, additionalAngle = 0) {\n const angle = this.getIndexAngle(index) - HALF_PI + additionalAngle;\n return {\n x: Math.cos(angle) * distanceFromCenter + this.xCenter,\n y: Math.sin(angle) * distanceFromCenter + this.yCenter,\n angle\n };\n }\n getPointPositionForValue(index, value) {\n return this.getPointPosition(index, this.getDistanceFromCenterForValue(value));\n }\n getBasePosition(index) {\n return this.getPointPositionForValue(index || 0, this.getBaseValue());\n }\n getPointLabelPosition(index) {\n const { left , top , right , bottom } = this._pointLabelItems[index];\n return {\n left,\n top,\n right,\n bottom\n };\n }\n drawBackground() {\n const { backgroundColor , grid: { circular } } = this.options;\n if (backgroundColor) {\n const ctx = this.ctx;\n ctx.save();\n ctx.beginPath();\n pathRadiusLine(this, this.getDistanceFromCenterForValue(this._endValue), circular, this._pointLabels.length);\n ctx.closePath();\n ctx.fillStyle = backgroundColor;\n ctx.fill();\n ctx.restore();\n }\n }\n drawGrid() {\n const ctx = this.ctx;\n const opts = this.options;\n const { angleLines , grid , border } = opts;\n const labelCount = this._pointLabels.length;\n let i, offset, position;\n if (opts.pointLabels.display) {\n drawPointLabels(this, labelCount);\n }\n if (grid.display) {\n this.ticks.forEach((tick, index)=>{\n if (index !== 0) {\n offset = this.getDistanceFromCenterForValue(tick.value);\n const context = this.getContext(index);\n const optsAtIndex = grid.setContext(context);\n const optsAtIndexBorder = border.setContext(context);\n drawRadiusLine(this, optsAtIndex, offset, labelCount, optsAtIndexBorder);\n }\n });\n }\n if (angleLines.display) {\n ctx.save();\n for(i = labelCount - 1; i >= 0; i--){\n const optsAtIndex = angleLines.setContext(this.getPointLabelContext(i));\n const { color , lineWidth } = optsAtIndex;\n if (!lineWidth || !color) {\n continue;\n }\n ctx.lineWidth = lineWidth;\n ctx.strokeStyle = color;\n ctx.setLineDash(optsAtIndex.borderDash);\n ctx.lineDashOffset = optsAtIndex.borderDashOffset;\n offset = this.getDistanceFromCenterForValue(opts.ticks.reverse ? this.min : this.max);\n position = this.getPointPosition(i, offset);\n ctx.beginPath();\n ctx.moveTo(this.xCenter, this.yCenter);\n ctx.lineTo(position.x, position.y);\n ctx.stroke();\n }\n ctx.restore();\n }\n }\n drawBorder() {}\n drawLabels() {\n const ctx = this.ctx;\n const opts = this.options;\n const tickOpts = opts.ticks;\n if (!tickOpts.display) {\n return;\n }\n const startAngle = this.getIndexAngle(0);\n let offset, width;\n ctx.save();\n ctx.translate(this.xCenter, this.yCenter);\n ctx.rotate(startAngle);\n ctx.textAlign = \'center\';\n ctx.textBaseline = \'middle\';\n this.ticks.forEach((tick, index)=>{\n if (index === 0 && !opts.reverse) {\n return;\n }\n const optsAtIndex = tickOpts.setContext(this.getContext(index));\n const tickFont = toFont(optsAtIndex.font);\n offset = this.getDistanceFromCenterForValue(this.ticks[index].value);\n if (optsAtIndex.showLabelBackdrop) {\n ctx.font = tickFont.string;\n width = ctx.measureText(tick.label).width;\n ctx.fillStyle = optsAtIndex.backdropColor;\n const padding = toPadding(optsAtIndex.backdropPadding);\n ctx.fillRect(-width / 2 - padding.left, -offset - tickFont.size / 2 - padding.top, width + padding.width, tickFont.size + padding.height);\n }\n renderText(ctx, tick.label, 0, -offset, tickFont, {\n color: optsAtIndex.color,\n strokeColor: optsAtIndex.textStrokeColor,\n strokeWidth: optsAtIndex.textStrokeWidth\n });\n });\n ctx.restore();\n }\n drawTitle() {}\n}\n\nconst INTERVALS = {\n millisecond: {\n common: true,\n size: 1,\n steps: 1000\n },\n second: {\n common: true,\n size: 1000,\n steps: 60\n },\n minute: {\n common: true,\n size: 60000,\n steps: 60\n },\n hour: {\n common: true,\n size: 3600000,\n steps: 24\n },\n day: {\n common: true,\n size: 86400000,\n steps: 30\n },\n week: {\n common: false,\n size: 604800000,\n steps: 4\n },\n month: {\n common: true,\n size: 2.628e9,\n steps: 12\n },\n quarter: {\n common: false,\n size: 7.884e9,\n steps: 4\n },\n year: {\n common: true,\n size: 3.154e10\n }\n};\n const UNITS = /* #__PURE__ */ Object.keys(INTERVALS);\n function sorter(a, b) {\n return a - b;\n}\n function parse(scale, input) {\n if (isNullOrUndef(input)) {\n return null;\n }\n const adapter = scale._adapter;\n const { parser , round , isoWeekday } = scale._parseOpts;\n let value = input;\n if (typeof parser === \'function\') {\n value = parser(value);\n }\n if (!isNumberFinite(value)) {\n value = typeof parser === \'string\' ? adapter.parse(value, parser) : adapter.parse(value);\n }\n if (value === null) {\n return null;\n }\n if (round) {\n value = round === \'week\' && (isNumber(isoWeekday) || isoWeekday === true) ? adapter.startOf(value, \'isoWeek\', isoWeekday) : adapter.startOf(value, round);\n }\n return +value;\n}\n function determineUnitForAutoTicks(minUnit, min, max, capacity) {\n const ilen = UNITS.length;\n for(let i = UNITS.indexOf(minUnit); i < ilen - 1; ++i){\n const interval = INTERVALS[UNITS[i]];\n const factor = interval.steps ? interval.steps : Number.MAX_SAFE_INTEGER;\n if (interval.common && Math.ceil((max - min) / (factor * interval.size)) <= capacity) {\n return UNITS[i];\n }\n }\n return UNITS[ilen - 1];\n}\n function determineUnitForFormatting(scale, numTicks, minUnit, min, max) {\n for(let i = UNITS.length - 1; i >= UNITS.indexOf(minUnit); i--){\n const unit = UNITS[i];\n if (INTERVALS[unit].common && scale._adapter.diff(max, min, unit) >= numTicks - 1) {\n return unit;\n }\n }\n return UNITS[minUnit ? UNITS.indexOf(minUnit) : 0];\n}\n function determineMajorUnit(unit) {\n for(let i = UNITS.indexOf(unit) + 1, ilen = UNITS.length; i < ilen; ++i){\n if (INTERVALS[UNITS[i]].common) {\n return UNITS[i];\n }\n }\n}\n function addTick(ticks, time, timestamps) {\n if (!timestamps) {\n ticks[time] = true;\n } else if (timestamps.length) {\n const { lo , hi } = _lookup(timestamps, time);\n const timestamp = timestamps[lo] >= time ? timestamps[lo] : timestamps[hi];\n ticks[timestamp] = true;\n }\n}\n function setMajorTicks(scale, ticks, map, majorUnit) {\n const adapter = scale._adapter;\n const first = +adapter.startOf(ticks[0].value, majorUnit);\n const last = ticks[ticks.length - 1].value;\n let major, index;\n for(major = first; major <= last; major = +adapter.add(major, 1, majorUnit)){\n index = map[major];\n if (index >= 0) {\n ticks[index].major = true;\n }\n }\n return ticks;\n}\n function ticksFromTimestamps(scale, values, majorUnit) {\n const ticks = [];\n const map = {};\n const ilen = values.length;\n let i, value;\n for(i = 0; i < ilen; ++i){\n value = values[i];\n map[value] = i;\n ticks.push({\n value,\n major: false\n });\n }\n return ilen === 0 || !majorUnit ? ticks : setMajorTicks(scale, ticks, map, majorUnit);\n}\nclass TimeScale extends Scale {\n static id = \'time\';\n static defaults = {\n bounds: \'data\',\n adapters: {},\n time: {\n parser: false,\n unit: false,\n round: false,\n isoWeekday: false,\n minUnit: \'millisecond\',\n displayFormats: {}\n },\n ticks: {\n source: \'auto\',\n callback: false,\n major: {\n enabled: false\n }\n }\n };\n constructor(props){\n super(props);\n this._cache = {\n data: [],\n labels: [],\n all: []\n };\n this._unit = \'day\';\n this._majorUnit = undefined;\n this._offsets = {};\n this._normalized = false;\n this._parseOpts = undefined;\n }\n init(scaleOpts, opts = {}) {\n const time = scaleOpts.time || (scaleOpts.time = {});\n const adapter = this._adapter = new adapters._date(scaleOpts.adapters.date);\n adapter.init(opts);\n mergeIf(time.displayFormats, adapter.formats());\n this._parseOpts = {\n parser: time.parser,\n round: time.round,\n isoWeekday: time.isoWeekday\n };\n super.init(scaleOpts);\n this._normalized = opts.normalized;\n }\n parse(raw, index) {\n if (raw === undefined) {\n return null;\n }\n return parse(this, raw);\n }\n beforeLayout() {\n super.beforeLayout();\n this._cache = {\n data: [],\n labels: [],\n all: []\n };\n }\n determineDataLimits() {\n const options = this.options;\n const adapter = this._adapter;\n const unit = options.time.unit || \'day\';\n let { min , max , minDefined , maxDefined } = this.getUserBounds();\n function _applyBounds(bounds) {\n if (!minDefined && !isNaN(bounds.min)) {\n min = Math.min(min, bounds.min);\n }\n if (!maxDefined && !isNaN(bounds.max)) {\n max = Math.max(max, bounds.max);\n }\n }\n if (!minDefined || !maxDefined) {\n _applyBounds(this._getLabelBounds());\n if (options.bounds !== \'ticks\' || options.ticks.source !== \'labels\') {\n _applyBounds(this.getMinMax(false));\n }\n }\n min = isNumberFinite(min) && !isNaN(min) ? min : +adapter.startOf(Date.now(), unit);\n max = isNumberFinite(max) && !isNaN(max) ? max : +adapter.endOf(Date.now(), unit) + 1;\n this.min = Math.min(min, max - 1);\n this.max = Math.max(min + 1, max);\n }\n _getLabelBounds() {\n const arr = this.getLabelTimestamps();\n let min = Number.POSITIVE_INFINITY;\n let max = Number.NEGATIVE_INFINITY;\n if (arr.length) {\n min = arr[0];\n max = arr[arr.length - 1];\n }\n return {\n min,\n max\n };\n }\n buildTicks() {\n const options = this.options;\n const timeOpts = options.time;\n const tickOpts = options.ticks;\n const timestamps = tickOpts.source === \'labels\' ? this.getLabelTimestamps() : this._generate();\n if (options.bounds === \'ticks\' && timestamps.length) {\n this.min = this._userMin || timestamps[0];\n this.max = this._userMax || timestamps[timestamps.length - 1];\n }\n const min = this.min;\n const max = this.max;\n const ticks = _filterBetween(timestamps, min, max);\n this._unit = timeOpts.unit || (tickOpts.autoSkip ? determineUnitForAutoTicks(timeOpts.minUnit, this.min, this.max, this._getLabelCapacity(min)) : determineUnitForFormatting(this, ticks.length, timeOpts.minUnit, this.min, this.max));\n this._majorUnit = !tickOpts.major.enabled || this._unit === \'year\' ? undefined : determineMajorUnit(this._unit);\n this.initOffsets(timestamps);\n if (options.reverse) {\n ticks.reverse();\n }\n return ticksFromTimestamps(this, ticks, this._majorUnit);\n }\n afterAutoSkip() {\n if (this.options.offsetAfterAutoskip) {\n this.initOffsets(this.ticks.map((tick)=>+tick.value));\n }\n }\n initOffsets(timestamps = []) {\n let start = 0;\n let end = 0;\n let first, last;\n if (this.options.offset && timestamps.length) {\n first = this.getDecimalForValue(timestamps[0]);\n if (timestamps.length === 1) {\n start = 1 - first;\n } else {\n start = (this.getDecimalForValue(timestamps[1]) - first) / 2;\n }\n last = this.getDecimalForValue(timestamps[timestamps.length - 1]);\n if (timestamps.length === 1) {\n end = last;\n } else {\n end = (last - this.getDecimalForValue(timestamps[timestamps.length - 2])) / 2;\n }\n }\n const limit = timestamps.length < 3 ? 0.5 : 0.25;\n start = _limitValue(start, 0, limit);\n end = _limitValue(end, 0, limit);\n this._offsets = {\n start,\n end,\n factor: 1 / (start + 1 + end)\n };\n }\n _generate() {\n const adapter = this._adapter;\n const min = this.min;\n const max = this.max;\n const options = this.options;\n const timeOpts = options.time;\n const minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, this._getLabelCapacity(min));\n const stepSize = valueOrDefault(options.ticks.stepSize, 1);\n const weekday = minor === \'week\' ? timeOpts.isoWeekday : false;\n const hasWeekday = isNumber(weekday) || weekday === true;\n const ticks = {};\n let first = min;\n let time, count;\n if (hasWeekday) {\n first = +adapter.startOf(first, \'isoWeek\', weekday);\n }\n first = +adapter.startOf(first, hasWeekday ? \'day\' : minor);\n if (adapter.diff(max, min, minor) > 100000 * stepSize) {\n throw new Error(min + \' and \' + max + \' are too far apart with stepSize of \' + stepSize + \' \' + minor);\n }\n const timestamps = options.ticks.source === \'data\' && this.getDataTimestamps();\n for(time = first, count = 0; time < max; time = +adapter.add(time, stepSize, minor), count++){\n addTick(ticks, time, timestamps);\n }\n if (time === max || options.bounds === \'ticks\' || count === 1) {\n addTick(ticks, time, timestamps);\n }\n return Object.keys(ticks).sort(sorter).map((x)=>+x);\n }\n getLabelForValue(value) {\n const adapter = this._adapter;\n const timeOpts = this.options.time;\n if (timeOpts.tooltipFormat) {\n return adapter.format(value, timeOpts.tooltipFormat);\n }\n return adapter.format(value, timeOpts.displayFormats.datetime);\n }\n format(value, format) {\n const options = this.options;\n const formats = options.time.displayFormats;\n const unit = this._unit;\n const fmt = format || formats[unit];\n return this._adapter.format(value, fmt);\n }\n _tickFormatFunction(time, index, ticks, format) {\n const options = this.options;\n const formatter = options.ticks.callback;\n if (formatter) {\n return callback(formatter, [\n time,\n index,\n ticks\n ], this);\n }\n const formats = options.time.displayFormats;\n const unit = this._unit;\n const majorUnit = this._majorUnit;\n const minorFormat = unit && formats[unit];\n const majorFormat = majorUnit && formats[majorUnit];\n const tick = ticks[index];\n const major = majorUnit && majorFormat && tick && tick.major;\n return this._adapter.format(time, format || (major ? majorFormat : minorFormat));\n }\n generateTickLabels(ticks) {\n let i, ilen, tick;\n for(i = 0, ilen = ticks.length; i < ilen; ++i){\n tick = ticks[i];\n tick.label = this._tickFormatFunction(tick.value, i, ticks);\n }\n }\n getDecimalForValue(value) {\n return value === null ? NaN : (value - this.min) / (this.max - this.min);\n }\n getPixelForValue(value) {\n const offsets = this._offsets;\n const pos = this.getDecimalForValue(value);\n return this.getPixelForDecimal((offsets.start + pos) * offsets.factor);\n }\n getValueForPixel(pixel) {\n const offsets = this._offsets;\n const pos = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\n return this.min + pos * (this.max - this.min);\n }\n _getLabelSize(label) {\n const ticksOpts = this.options.ticks;\n const tickLabelWidth = this.ctx.measureText(label).width;\n const angle = toRadians(this.isHorizontal() ? ticksOpts.maxRotation : ticksOpts.minRotation);\n const cosRotation = Math.cos(angle);\n const sinRotation = Math.sin(angle);\n const tickFontSize = this._resolveTickFontOptions(0).size;\n return {\n w: tickLabelWidth * cosRotation + tickFontSize * sinRotation,\n h: tickLabelWidth * sinRotation + tickFontSize * cosRotation\n };\n }\n _getLabelCapacity(exampleTime) {\n const timeOpts = this.options.time;\n const displayFormats = timeOpts.displayFormats;\n const format = displayFormats[timeOpts.unit] || displayFormats.millisecond;\n const exampleLabel = this._tickFormatFunction(exampleTime, 0, ticksFromTimestamps(this, [\n exampleTime\n ], this._majorUnit), format);\n const size = this._getLabelSize(exampleLabel);\n const capacity = Math.floor(this.isHorizontal() ? this.width / size.w : this.height / size.h) - 1;\n return capacity > 0 ? capacity : 1;\n }\n getDataTimestamps() {\n let timestamps = this._cache.data || [];\n let i, ilen;\n if (timestamps.length) {\n return timestamps;\n }\n const metas = this.getMatchingVisibleMetas();\n if (this._normalized && metas.length) {\n return this._cache.data = metas[0].controller.getAllParsedValues(this);\n }\n for(i = 0, ilen = metas.length; i < ilen; ++i){\n timestamps = timestamps.concat(metas[i].controller.getAllParsedValues(this));\n }\n return this._cache.data = this.normalize(timestamps);\n }\n getLabelTimestamps() {\n const timestamps = this._cache.labels || [];\n let i, ilen;\n if (timestamps.length) {\n return timestamps;\n }\n const labels = this.getLabels();\n for(i = 0, ilen = labels.length; i < ilen; ++i){\n timestamps.push(parse(this, labels[i]));\n }\n return this._cache.labels = this._normalized ? timestamps : this.normalize(timestamps);\n }\n normalize(values) {\n return _arrayUnique(values.sort(sorter));\n }\n}\n\nfunction chart_interpolate(table, val, reverse) {\n let lo = 0;\n let hi = table.length - 1;\n let prevSource, nextSource, prevTarget, nextTarget;\n if (reverse) {\n if (val >= table[lo].pos && val <= table[hi].pos) {\n ({ lo , hi } = _lookupByKey(table, \'pos\', val));\n }\n ({ pos: prevSource , time: prevTarget } = table[lo]);\n ({ pos: nextSource , time: nextTarget } = table[hi]);\n } else {\n if (val >= table[lo].time && val <= table[hi].time) {\n ({ lo , hi } = _lookupByKey(table, \'time\', val));\n }\n ({ time: prevSource , pos: prevTarget } = table[lo]);\n ({ time: nextSource , pos: nextTarget } = table[hi]);\n }\n const span = nextSource - prevSource;\n return span ? prevTarget + (nextTarget - prevTarget) * (val - prevSource) / span : prevTarget;\n}\nclass TimeSeriesScale extends TimeScale {\n static id = \'timeseries\';\n static defaults = TimeScale.defaults;\n constructor(props){\n super(props);\n this._table = [];\n this._minPos = undefined;\n this._tableRange = undefined;\n }\n initOffsets() {\n const timestamps = this._getTimestampsForTable();\n const table = this._table = this.buildLookupTable(timestamps);\n this._minPos = chart_interpolate(table, this.min);\n this._tableRange = chart_interpolate(table, this.max) - this._minPos;\n super.initOffsets(timestamps);\n }\n buildLookupTable(timestamps) {\n const { min , max } = this;\n const items = [];\n const table = [];\n let i, ilen, prev, curr, next;\n for(i = 0, ilen = timestamps.length; i < ilen; ++i){\n curr = timestamps[i];\n if (curr >= min && curr <= max) {\n items.push(curr);\n }\n }\n if (items.length < 2) {\n return [\n {\n time: min,\n pos: 0\n },\n {\n time: max,\n pos: 1\n }\n ];\n }\n for(i = 0, ilen = items.length; i < ilen; ++i){\n next = items[i + 1];\n prev = items[i - 1];\n curr = items[i];\n if (Math.round((next + prev) / 2) !== curr) {\n table.push({\n time: curr,\n pos: i / (ilen - 1)\n });\n }\n }\n return table;\n }\n _generate() {\n const min = this.min;\n const max = this.max;\n let timestamps = super.getDataTimestamps();\n if (!timestamps.includes(min) || !timestamps.length) {\n timestamps.splice(0, 0, min);\n }\n if (!timestamps.includes(max) || timestamps.length === 1) {\n timestamps.push(max);\n }\n return timestamps.sort((a, b)=>a - b);\n }\n _getTimestampsForTable() {\n let timestamps = this._cache.all || [];\n if (timestamps.length) {\n return timestamps;\n }\n const data = this.getDataTimestamps();\n const label = this.getLabelTimestamps();\n if (data.length && label.length) {\n timestamps = this.normalize(data.concat(label));\n } else {\n timestamps = data.length ? data : label;\n }\n timestamps = this._cache.all = timestamps;\n return timestamps;\n }\n getDecimalForValue(value) {\n return (chart_interpolate(this._table, value) - this._minPos) / this._tableRange;\n }\n getValueForPixel(pixel) {\n const offsets = this._offsets;\n const decimal = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\n return chart_interpolate(this._table, decimal * this._tableRange + this._minPos, true);\n }\n}\n\nvar scales = /*#__PURE__*/Object.freeze({\n__proto__: null,\nCategoryScale: CategoryScale,\nLinearScale: LinearScale,\nLogarithmicScale: LogarithmicScale,\nRadialLinearScale: RadialLinearScale,\nTimeScale: TimeScale,\nTimeSeriesScale: TimeSeriesScale\n});\n\nconst registerables = [\n controllers,\n chart_elements,\n plugins,\n scales\n];\n\n\n//# sourceMappingURL=chart.js.map\n\n;// CONCATENATED MODULE: ../node_modules/chart.js/auto/auto.js\n\n\nChart.register(...registerables);\n\n\n/* harmony default export */ const auto_auto = (Chart);\n\n;// CONCATENATED MODULE: ../node_modules/uuid/dist/esm-browser/native.js\nconst randomUUID = typeof crypto !== \'undefined\' && crypto.randomUUID && crypto.randomUUID.bind(crypto);\n/* harmony default export */ const esm_browser_native = ({\n randomUUID\n});\n;// CONCATENATED MODULE: ../node_modules/uuid/dist/esm-browser/rng.js\n// Unique ID creation requires a high quality random # generator. In the browser we therefore\n// require the crypto API and do not support built-in fallback to lower quality random number\n// generators (like Math.random()).\nlet getRandomValues;\nconst rnds8 = new Uint8Array(16);\nfunction rng() {\n // lazy load so that environments that need to polyfill have a chance to do so\n if (!getRandomValues) {\n // getRandomValues needs to be invoked in a context where "this" is a Crypto implementation.\n getRandomValues = typeof crypto !== \'undefined\' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto);\n\n if (!getRandomValues) {\n throw new Error(\'crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported\');\n }\n }\n\n return getRandomValues(rnds8);\n}\n;// CONCATENATED MODULE: ../node_modules/uuid/dist/esm-browser/stringify.js\n\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nconst byteToHex = [];\n\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\n\nfunction unsafeStringify(arr, offset = 0) {\n // Note: Be careful editing this code! It\'s been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n return byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + \'-\' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + \'-\' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + \'-\' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + \'-\' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]];\n}\n\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset); // Consistency check for valid UUID. If this throws, it\'s likely due to one\n // of the following:\n // - One or more input array values don\'t map to a hex octet (leading to\n // "undefined" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!validate(uuid)) {\n throw TypeError(\'Stringified UUID is invalid\');\n }\n\n return uuid;\n}\n\n/* harmony default export */ const esm_browser_stringify = ((/* unused pure expression or super */ null && (stringify)));\n;// CONCATENATED MODULE: ../node_modules/uuid/dist/esm-browser/v4.js\n\n\n\n\nfunction v4(options, buf, offset) {\n if (esm_browser_native.randomUUID && !buf && !options) {\n return esm_browser_native.randomUUID();\n }\n\n options = options || {};\n const rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return unsafeStringify(rnds);\n}\n\n/* harmony default export */ const esm_browser_v4 = (v4);\n;// CONCATENATED MODULE: ../src/js/charts/chartjs.js\nfunction chartjs_typeof(o) { "@babel/helpers - typeof"; return chartjs_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, chartjs_typeof(o); }\nfunction chartjs_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\nfunction chartjs_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, chartjs_toPropertyKey(descriptor.key), descriptor); } }\nfunction chartjs_createClass(Constructor, protoProps, staticProps) { if (protoProps) chartjs_defineProperties(Constructor.prototype, protoProps); if (staticProps) chartjs_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }\nfunction chartjs_toPropertyKey(t) { var i = chartjs_toPrimitive(t, "string"); return "symbol" == chartjs_typeof(i) ? i : String(i); }\nfunction chartjs_toPrimitive(t, r) { if ("object" != chartjs_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != chartjs_typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }\n\n\nvar ChartJSWidget = /*#__PURE__*/function () {\n function ChartJSWidget(title, description, data) {\n var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n var type = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : "bar";\n chartjs_classCallCheck(this, ChartJSWidget);\n this.title = title;\n this.description = description;\n this.data = data;\n this.options = options;\n this.type = type;\n this.dataIsValid = Array.isArray(data) ? data.length > 0 : !!data;\n }\n chartjs_createClass(ChartJSWidget, [{\n key: "plot",\n value: function plot(divWidth, divHeight, element) {\n var _this = this;\n element.style = "background-color: #f5f5f5; padding: 5px;";\n var title_element = document.createElement("div");\n title_element.className = "chart-title grid-title";\n title_element.innerHTML = this.title;\n title_element.style = "margin-bottom: 5px";\n if (this.description) {\n var question_mark_element = document.createElement("div");\n question_mark_element.className = "question-mark-legacy";\n question_mark_element.innerHTML = "?";\n var randomId = Date.now();\n question_mark_element.id = "id-".concat(randomId);\n title_element.appendChild(question_mark_element);\n setTimeout(function () {\n var targetEl = document.getElementById("id-".concat(randomId));\n if (targetEl) targetEl.addEventListener("click", function (event) {\n _this.options.onShowDesc(_this.description);\n });\n });\n }\n element.appendChild(title_element);\n var card_element = document.createElement("div");\n card_element.className = "card";\n element.appendChild(card_element);\n this.canvas = document.createElement("canvas");\n this.canvas.id = esm_browser_v4();\n card_element.appendChild(this.canvas);\n this.canvas.style.backgroundColor = \'#fff\';\n this.chart = new auto_auto(this.canvas.id, {\n type: this.type,\n data: this.data,\n options: this.options.chartjs_options\n });\n return null;\n }\n }]);\n return ChartJSWidget;\n}();\n;// CONCATENATED MODULE: ../src/js/charts/heatmap.js\nfunction heatmap_typeof(o) { "@babel/helpers - typeof"; return heatmap_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, heatmap_typeof(o); }\nfunction heatmap_slicedToArray(arr, i) { return heatmap_arrayWithHoles(arr) || heatmap_iterableToArrayLimit(arr, i) || heatmap_unsupportedIterableToArray(arr, i) || heatmap_nonIterableRest(); }\nfunction heatmap_nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }\nfunction heatmap_unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return heatmap_arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return heatmap_arrayLikeToArray(o, minLen); }\nfunction heatmap_arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }\nfunction heatmap_iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction heatmap_arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\nfunction heatmap_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\nfunction heatmap_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, heatmap_toPropertyKey(descriptor.key), descriptor); } }\nfunction heatmap_createClass(Constructor, protoProps, staticProps) { if (protoProps) heatmap_defineProperties(Constructor.prototype, protoProps); if (staticProps) heatmap_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }\nfunction heatmap_toPropertyKey(t) { var i = heatmap_toPrimitive(t, "string"); return "symbol" == heatmap_typeof(i) ? i : String(i); }\nfunction heatmap_toPrimitive(t, r) { if ("object" != heatmap_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != heatmap_typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }\nfunction heatmap_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) heatmap_setPrototypeOf(subClass, superClass); }\nfunction heatmap_setPrototypeOf(o, p) { heatmap_setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return heatmap_setPrototypeOf(o, p); }\nfunction heatmap_createSuper(Derived) { var hasNativeReflectConstruct = heatmap_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = heatmap_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = heatmap_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return heatmap_possibleConstructorReturn(this, result); }; }\nfunction heatmap_possibleConstructorReturn(self, call) { if (call && (heatmap_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return heatmap_assertThisInitialized(self); }\nfunction heatmap_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called"); } return self; }\nfunction heatmap_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\nfunction heatmap_getPrototypeOf(o) { heatmap_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return heatmap_getPrototypeOf(o); }\n\n\n//import { interpolateGreens } from "d3-scale-chromatic";\n\nvar HeatMapWidget = /*#__PURE__*/function (_BaseChartWidget) {\n heatmap_inherits(HeatMapWidget, _BaseChartWidget);\n var _super = heatmap_createSuper(HeatMapWidget);\n function HeatMapWidget(title, description, data, options) {\n var _data;\n heatmap_classCallCheck(this, HeatMapWidget);\n if (options.transform) data = ((_data = data) !== null && _data !== void 0 ? _data : []).map(options.transform);\n return _super.call(this, title, description, data, options);\n }\n heatmap_createClass(HeatMapWidget, [{\n key: "plot",\n value: function plot(divWidth, divHeight, el) {\n this.marginRight = 40;\n this.marginBottom = 40;\n var _this$clearAndScaleSv = this.clearAndScaleSvg(divWidth, divHeight, 20, 20),\n _this$clearAndScaleSv2 = heatmap_slicedToArray(_this$clearAndScaleSv, 2),\n width = _this$clearAndScaleSv2[0],\n height = _this$clearAndScaleSv2[1];\n this.drawTitle();\n if (!this.dataIsValid) {\n this.showErrorMessage(divWidth, divHeight);\n return this.wrapper.innerHTML;\n }\n var groups = map(this.data, function (d) {\n return d.group;\n });\n var vars = map(this.data, function (d) {\n return d.variable;\n });\n var xScale = band().range([0, width]).padding(0.1);\n var yScale = band().range([height, 0]).padding(0.1);\n xScale.domain(groups);\n yScale.domain(vars);\n if (this.options.showLegend) {\n this.g.append("g").style("font-size", 15).attr("transform", "translate(0," + height + ")").call(axisBottom(xScale).tickSize(0)).select(".domain").remove();\n this.g.append("g").style("font-size", 15).call(axisLeft(yScale).tickSize(0)).select(".domain").remove();\n }\n var max = max_max(this.data, function (d) {\n return d.value;\n });\n var colorScale = sequential().interpolator(Greens).domain([0, max]);\n this.g.selectAll().data(this.data, function (d) {\n return d.group + \':\' + d.variable;\n }).enter().append("rect").attr("x", function (d) {\n return xScale(d.group);\n }).attr("y", function (d) {\n return yScale(d.variable);\n }).attr("rx", 4).attr("ry", 4).attr("width", xScale.bandwidth()).attr("height", yScale.bandwidth()).style("fill", function (d) {\n return colorScale(d.value);\n }).style("stroke-width", 4).style("stroke", "none").style("opacity", 0.8);\n return this.wrapper.innerHTML;\n }\n }]);\n return HeatMapWidget;\n}(BaseChartWidget);\n;// CONCATENATED MODULE: ../src/js/elements/base_element.js\nfunction base_element_typeof(o) { "@babel/helpers - typeof"; return base_element_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, base_element_typeof(o); }\nfunction base_element_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\nfunction base_element_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, base_element_toPropertyKey(descriptor.key), descriptor); } }\nfunction base_element_createClass(Constructor, protoProps, staticProps) { if (protoProps) base_element_defineProperties(Constructor.prototype, protoProps); if (staticProps) base_element_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }\nfunction base_element_toPropertyKey(t) { var i = base_element_toPrimitive(t, "string"); return "symbol" == base_element_typeof(i) ? i : String(i); }\nfunction base_element_toPrimitive(t, r) { if ("object" != base_element_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != base_element_typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }\nvar BaseElement = /*#__PURE__*/function () {\n function BaseElement() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n base_element_classCallCheck(this, BaseElement);\n }\n base_element_createClass(BaseElement, [{\n key: "plot",\n value: function plot(divWidth, divHeight, element) {}\n }]);\n return BaseElement;\n}();\n;// CONCATENATED MODULE: ../src/js/elements/textelement.js\nfunction textelement_typeof(o) { "@babel/helpers - typeof"; return textelement_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, textelement_typeof(o); }\nfunction textelement_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\nfunction textelement_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, textelement_toPropertyKey(descriptor.key), descriptor); } }\nfunction textelement_createClass(Constructor, protoProps, staticProps) { if (protoProps) textelement_defineProperties(Constructor.prototype, protoProps); if (staticProps) textelement_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }\nfunction textelement_toPropertyKey(t) { var i = textelement_toPrimitive(t, "string"); return "symbol" == textelement_typeof(i) ? i : String(i); }\nfunction textelement_toPrimitive(t, r) { if ("object" != textelement_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != textelement_typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }\nfunction textelement_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) textelement_setPrototypeOf(subClass, superClass); }\nfunction textelement_setPrototypeOf(o, p) { textelement_setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return textelement_setPrototypeOf(o, p); }\nfunction textelement_createSuper(Derived) { var hasNativeReflectConstruct = textelement_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = textelement_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = textelement_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return textelement_possibleConstructorReturn(this, result); }; }\nfunction textelement_possibleConstructorReturn(self, call) { if (call && (textelement_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return textelement_assertThisInitialized(self); }\nfunction textelement_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called"); } return self; }\nfunction textelement_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\nfunction textelement_getPrototypeOf(o) { textelement_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return textelement_getPrototypeOf(o); }\n\nvar TextElement = /*#__PURE__*/function (_BaseElement) {\n textelement_inherits(TextElement, _BaseElement);\n var _super = textelement_createSuper(TextElement);\n function TextElement(text) {\n var _this;\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n textelement_classCallCheck(this, TextElement);\n _this = _super.call(this, options);\n _this.text = text;\n return _this;\n }\n textelement_createClass(TextElement, [{\n key: "plot",\n value: function plot(divWidth, divHeight, element) {\n var title_element = document.createElement("div");\n title_element.innerHTML = this.text;\n element.appendChild(title_element);\n }\n }]);\n return TextElement;\n}(BaseElement);\n;// CONCATENATED MODULE: ../src/js/elements/textareaelement.js\nfunction textareaelement_typeof(o) { "@babel/helpers - typeof"; return textareaelement_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, textareaelement_typeof(o); }\nfunction textareaelement_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\nfunction textareaelement_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, textareaelement_toPropertyKey(descriptor.key), descriptor); } }\nfunction textareaelement_createClass(Constructor, protoProps, staticProps) { if (protoProps) textareaelement_defineProperties(Constructor.prototype, protoProps); if (staticProps) textareaelement_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }\nfunction textareaelement_toPropertyKey(t) { var i = textareaelement_toPrimitive(t, "string"); return "symbol" == textareaelement_typeof(i) ? i : String(i); }\nfunction textareaelement_toPrimitive(t, r) { if ("object" != textareaelement_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != textareaelement_typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }\nfunction textareaelement_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) textareaelement_setPrototypeOf(subClass, superClass); }\nfunction textareaelement_setPrototypeOf(o, p) { textareaelement_setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return textareaelement_setPrototypeOf(o, p); }\nfunction textareaelement_createSuper(Derived) { var hasNativeReflectConstruct = textareaelement_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = textareaelement_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = textareaelement_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return textareaelement_possibleConstructorReturn(this, result); }; }\nfunction textareaelement_possibleConstructorReturn(self, call) { if (call && (textareaelement_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return textareaelement_assertThisInitialized(self); }\nfunction textareaelement_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called"); } return self; }\nfunction textareaelement_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\nfunction textareaelement_getPrototypeOf(o) { textareaelement_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return textareaelement_getPrototypeOf(o); }\n\nvar TextAreaElement = /*#__PURE__*/function (_BaseElement) {\n textareaelement_inherits(TextAreaElement, _BaseElement);\n var _super = textareaelement_createSuper(TextAreaElement);\n function TextAreaElement(text) {\n var _this;\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n textareaelement_classCallCheck(this, TextAreaElement);\n _this = _super.call(this, options);\n _this.text = text;\n return _this;\n }\n textareaelement_createClass(TextAreaElement, [{\n key: "plot",\n value: function plot(divWidth, divHeight, element) {\n var title_element = document.createElement("textarea");\n title_element.placeholder = this.text;\n title_element.rows = divHeight / 24;\n title_element.height = divHeight;\n title_element.className = "form-control";\n element.appendChild(title_element);\n }\n }]);\n return TextAreaElement;\n}(BaseElement);\n;// CONCATENATED MODULE: ../src/js/charts/scatterchart.js\nfunction scatterchart_typeof(o) { "@babel/helpers - typeof"; return scatterchart_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, scatterchart_typeof(o); }\nfunction scatterchart_slicedToArray(arr, i) { return scatterchart_arrayWithHoles(arr) || scatterchart_iterableToArrayLimit(arr, i) || scatterchart_unsupportedIterableToArray(arr, i) || scatterchart_nonIterableRest(); }\nfunction scatterchart_nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }\nfunction scatterchart_unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return scatterchart_arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return scatterchart_arrayLikeToArray(o, minLen); }\nfunction scatterchart_arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }\nfunction scatterchart_iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction scatterchart_arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\nfunction scatterchart_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\nfunction scatterchart_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, scatterchart_toPropertyKey(descriptor.key), descriptor); } }\nfunction scatterchart_createClass(Constructor, protoProps, staticProps) { if (protoProps) scatterchart_defineProperties(Constructor.prototype, protoProps); if (staticProps) scatterchart_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }\nfunction scatterchart_toPropertyKey(t) { var i = scatterchart_toPrimitive(t, "string"); return "symbol" == scatterchart_typeof(i) ? i : String(i); }\nfunction scatterchart_toPrimitive(t, r) { if ("object" != scatterchart_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != scatterchart_typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }\nfunction scatterchart_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) scatterchart_setPrototypeOf(subClass, superClass); }\nfunction scatterchart_setPrototypeOf(o, p) { scatterchart_setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return scatterchart_setPrototypeOf(o, p); }\nfunction scatterchart_createSuper(Derived) { var hasNativeReflectConstruct = scatterchart_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = scatterchart_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = scatterchart_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return scatterchart_possibleConstructorReturn(this, result); }; }\nfunction scatterchart_possibleConstructorReturn(self, call) { if (call && (scatterchart_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return scatterchart_assertThisInitialized(self); }\nfunction scatterchart_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called"); } return self; }\nfunction scatterchart_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\nfunction scatterchart_getPrototypeOf(o) { scatterchart_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return scatterchart_getPrototypeOf(o); }\n\n\n\n// options.highlight -> {column1, column2}\n\nvar ScatterChartWidget = /*#__PURE__*/function (_BaseChartWidget) {\n scatterchart_inherits(ScatterChartWidget, _BaseChartWidget);\n var _super = scatterchart_createSuper(ScatterChartWidget);\n function ScatterChartWidget(title, description, data, options) {\n var _data;\n scatterchart_classCallCheck(this, ScatterChartWidget);\n if (options.transform) data = ((_data = data) !== null && _data !== void 0 ? _data : []).map(options.transform);\n return _super.call(this, title, description, data, options);\n }\n scatterchart_createClass(ScatterChartWidget, [{\n key: "plot",\n value: function plot(divWidth, divHeight, el) {\n this.marginRight = 50;\n this.marginBottom = 50;\n var _this$clearAndScaleSv = this.clearAndScaleSvg(divWidth, divHeight, 20, 40),\n _this$clearAndScaleSv2 = scatterchart_slicedToArray(_this$clearAndScaleSv, 2),\n width = _this$clearAndScaleSv2[0],\n height = _this$clearAndScaleSv2[1];\n this.drawTitle();\n if (!this.dataIsValid) {\n this.showErrorMessage(divWidth, divHeight);\n return this.wrapper.innerHTML;\n }\n var circle_color = "color" in this.options ? this.options.color : "#001122";\n var highlight_color = "highlight_color" in this.options ? this.options.highlight_color : "#00AA44";\n var xmax = "xmax" in this.options ? this.options.xmax : max_max(this.data, function (d) {\n return d.column1;\n });\n var ymax = "ymax" in this.options ? this.options.ymax : max_max(this.data, function (d) {\n return d.column2;\n });\n var xScale = linear_linear().range([0, width]);\n var yScale = linear_linear().range([0, height]);\n xScale.domain([0, xmax]);\n yScale.domain([0, ymax]);\n var showAxes = "showAxes" in this.options ? this.options.showAxes : true;\n if (showAxes) {\n this.appendXAxis(xScale, height);\n this.appendXAxisLabel(width, height);\n this.appendYAxisLabel();\n this.g.append("g").attr("transform", "translate(0, 0)").call(axisLeft(yScale));\n }\n this.g.append(\'g\').selectAll("dot").data(this.data).enter().append("circle").attr("cx", function (d) {\n return xScale(d.column1);\n }).attr("cy", function (d) {\n return yScale(d.column2);\n }).attr("r", 2.5).style("fill", function (d) {\n return "highlight" in d ? d.highlight ? highlight_color : circle_color : circle_color;\n });\n return this.wrapper.innerHTML;\n }\n }]);\n return ScatterChartWidget;\n}(BaseChartWidget);\n;// CONCATENATED MODULE: ../src/js/charts/boxplot.js\nfunction boxplot_typeof(o) { "@babel/helpers - typeof"; return boxplot_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, boxplot_typeof(o); }\nfunction boxplot_slicedToArray(arr, i) { return boxplot_arrayWithHoles(arr) || boxplot_iterableToArrayLimit(arr, i) || boxplot_unsupportedIterableToArray(arr, i) || boxplot_nonIterableRest(); }\nfunction boxplot_nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }\nfunction boxplot_unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return boxplot_arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return boxplot_arrayLikeToArray(o, minLen); }\nfunction boxplot_arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }\nfunction boxplot_iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction boxplot_arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\nfunction boxplot_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\nfunction boxplot_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, boxplot_toPropertyKey(descriptor.key), descriptor); } }\nfunction boxplot_createClass(Constructor, protoProps, staticProps) { if (protoProps) boxplot_defineProperties(Constructor.prototype, protoProps); if (staticProps) boxplot_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }\nfunction boxplot_toPropertyKey(t) { var i = boxplot_toPrimitive(t, "string"); return "symbol" == boxplot_typeof(i) ? i : String(i); }\nfunction boxplot_toPrimitive(t, r) { if ("object" != boxplot_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != boxplot_typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }\nfunction boxplot_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) boxplot_setPrototypeOf(subClass, superClass); }\nfunction boxplot_setPrototypeOf(o, p) { boxplot_setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return boxplot_setPrototypeOf(o, p); }\nfunction boxplot_createSuper(Derived) { var hasNativeReflectConstruct = boxplot_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = boxplot_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = boxplot_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return boxplot_possibleConstructorReturn(this, result); }; }\nfunction boxplot_possibleConstructorReturn(self, call) { if (call && (boxplot_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return boxplot_assertThisInitialized(self); }\nfunction boxplot_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called"); } return self; }\nfunction boxplot_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\nfunction boxplot_getPrototypeOf(o) { boxplot_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return boxplot_getPrototypeOf(o); }\n\n\n\n/*\ndata = {\n min: 0,\n max: 100,\n q1: 12,\n median: 35,\n q3: 67,\n}\n\n */\n\nvar BoxPlotWidget = /*#__PURE__*/function (_BaseChartWidget) {\n boxplot_inherits(BoxPlotWidget, _BaseChartWidget);\n var _super = boxplot_createSuper(BoxPlotWidget);\n function BoxPlotWidget(title, description, data, options) {\n var _data;\n var _this;\n boxplot_classCallCheck(this, BoxPlotWidget);\n if (options.transform) data = ((_data = data) !== null && _data !== void 0 ? _data : []).map(options.transform);\n _this = _super.call(this, title, description, data, options);\n _this.marginRight = 10;\n _this.marginBottom = 20;\n return _this;\n }\n boxplot_createClass(BoxPlotWidget, [{\n key: "plot",\n value: function plot(divWidth, divHeight, el) {\n var _this$clearAndScaleSv = this.clearAndScaleSvg(divWidth, divHeight, 5, 10),\n _this$clearAndScaleSv2 = boxplot_slicedToArray(_this$clearAndScaleSv, 2),\n width = _this$clearAndScaleSv2[0],\n height = _this$clearAndScaleSv2[1];\n this.drawTitle();\n\n /*if (!this.dataIsValid) {\n this.showErrorMessage(divWidth, divHeight);\n return this.wrapper.innerHTML;\n }*/ // TODO\n\n var xScale = linear_linear().domain([this.data.min, this.data.max]).range([width, 0]);\n var center = height / 2.0;\n\n // Show the main horizontal line\n this.g.append("line").attr("x1", xScale(this.data.min)).attr("x2", xScale(this.data.max)).attr("y1", center).attr("y2", center).attr("stroke", "black");\n\n // Show the box\n this.g.append("rect").attr("x", xScale(this.data.q3)).attr("y", center - height / 2).attr("height", height).attr("width", xScale(this.data.q1) - xScale(this.data.q3)).attr("stroke", "black").style("fill", "#69b3a2");\n\n // show median, min and max horizontal lines\n this.g.selectAll("toto").data([this.data.min, this.data.median, this.data.max]).enter().append("line").attr("x1", function (d) {\n return xScale(d);\n }).attr("x2", function (d) {\n return xScale(d);\n }).attr("y1", center - height / 2).attr("y2", center + height / 2).attr("stroke", "black");\n return this.wrapper.innerHTML;\n }\n }]);\n return BoxPlotWidget;\n}(BaseChartWidget);\n;// CONCATENATED MODULE: ../src/js/charts/grid.js\nfunction grid_typeof(o) { "@babel/helpers - typeof"; return grid_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, grid_typeof(o); }\nfunction grid_createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = grid_unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }\nfunction grid_unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return grid_arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return grid_arrayLikeToArray(o, minLen); }\nfunction grid_arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }\nfunction grid_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\nfunction grid_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, grid_toPropertyKey(descriptor.key), descriptor); } }\nfunction grid_createClass(Constructor, protoProps, staticProps) { if (protoProps) grid_defineProperties(Constructor.prototype, protoProps); if (staticProps) grid_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }\nfunction grid_toPropertyKey(t) { var i = grid_toPrimitive(t, "string"); return "symbol" == grid_typeof(i) ? i : String(i); }\nfunction grid_toPrimitive(t, r) { if ("object" != grid_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != grid_typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }\nfunction grid_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) grid_setPrototypeOf(subClass, superClass); }\nfunction grid_setPrototypeOf(o, p) { grid_setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return grid_setPrototypeOf(o, p); }\nfunction grid_createSuper(Derived) { var hasNativeReflectConstruct = grid_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = grid_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = grid_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return grid_possibleConstructorReturn(this, result); }; }\nfunction grid_possibleConstructorReturn(self, call) { if (call && (grid_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return grid_assertThisInitialized(self); }\nfunction grid_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called"); } return self; }\nfunction grid_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\nfunction grid_getPrototypeOf(o) { grid_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return grid_getPrototypeOf(o); }\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar chart_types = (/* unused pure expression or super */ null && (["areachart", "barchart", "chartjs", "grouped_barchart", "heatmap", "linechart", "piechart", "simple_grouped_barchart", "stacked_barchart", "scatterchart"]));\n\n/*\n * // config: row oder column\n [\n {type: "", name: "", options: {}, data: []},\n ...\n ]\n *\n *\n */\n\nvar GridWidget = /*#__PURE__*/function (_BaseChartWidget) {\n grid_inherits(GridWidget, _BaseChartWidget);\n var _super = grid_createSuper(GridWidget);\n function GridWidget(title, description, data, options) {\n var _data;\n var _this;\n grid_classCallCheck(this, GridWidget);\n if (options.transform) data = ((_data = data) !== null && _data !== void 0 ? _data : []).map(options.transform);\n _this = _super.call(this, title, description, data, options);\n _this.svg.remove();\n delete _this.svg;\n delete _this.wrapper;\n return _this;\n }\n grid_createClass(GridWidget, [{\n key: "plot",\n value: function plot(divWidth, divHeight, el) {\n var _this2 = this;\n //const [width, height] = this.clearAndScaleSvg(divWidth, divHeight);\n //this.drawTitle(); // TODO: override!\n\n if (!this.dataIsValid) {\n console.log("Error: Grid data invalid");\n //this.showErrorMessage(divWidth, divHeight); // TODO: makes no sense here, display error another way\n return ""; // this.wrapper.innerHTML;\n }\n var title_element = document.createElement("div");\n title_element.className = "chart-title grid-title";\n title_element.innerHTML = this.title;\n if (this.description) {\n var question_mark_element = document.createElement("div");\n question_mark_element.className = "question-mark-legacy";\n question_mark_element.innerHTML = "?";\n var randomId = Date.now();\n question_mark_element.id = "id-".concat(randomId);\n title_element.appendChild(question_mark_element);\n setTimeout(function () {\n var targetEl = document.getElementById("id-".concat(randomId));\n if (targetEl) targetEl.addEventListener("click", function (event) {\n _this2.options.onShowDesc(_this2.description);\n });\n });\n }\n el.appendChild(title_element);\n el.style = "background-color: #f5f5f5";\n var width = divWidth;\n var height = divHeight;\n var cardHolder = document.createElement("div");\n cardHolder.className = "card";\n cardHolder.style = "margin: 5px";\n var widget = document.createElement("div");\n widget.style.display = "flex";\n if (this.options.direction) {\n widget.style.flexDirection = this.options.direction; // row, column\n } else {\n widget.style.flexDirection = "row"; // default\n }\n var temp_subtitle = document.createElement("div");\n temp_subtitle.className = "chart-subtitle";\n temp_subtitle.innerHTML = "temp";\n el.appendChild(temp_subtitle);\n height -= title_element.offsetHeight;\n height -= temp_subtitle.offsetHeight;\n height -= 12; // margin\n el.removeChild(temp_subtitle);\n cardHolder.appendChild(widget);\n el.appendChild(cardHolder);\n if (widget.style.flexDirection == "row") {\n width -= 12; // TODO Padding / Margins korrekt einberechnen\n width /= this.data.length;\n } else {\n height -= this.data.filter(function (widget) {\n return widget.name != "";\n }).length * 16;\n height /= this.data.length;\n width -= 12;\n }\n var firstColumn = true;\n var _iterator = grid_createForOfIteratorHelper(this.data),\n _step;\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var chart = _step.value;\n var subwidget_div = document.createElement("div");\n if (!firstColumn && this.options.direction !== "column") subwidget_div.style = "border-left: 1px solid grey";\n widget.appendChild(subwidget_div);\n var subwidget = null;\n switch (chart.type) {\n case "textAreaElement":\n subwidget = new TextAreaElement(chart.data.text, chart.options);\n break;\n case "textElement":\n subwidget = new TextElement(chart.data.text, chart.options);\n break;\n case "areachart":\n subwidget = new AreaChartWidget("", "", chart.data, chart.options);\n break;\n case "barchart":\n subwidget = new BarChartWidget("", "", chart.data, chart.options);\n break;\n case "boxplot":\n subwidget = new BoxPlotWidget("", "", chart.data, chart.options);\n break;\n case "chartjs":\n subwidget = new ChartJSWidget("", "", chart.data, chart.options);\n break;\n case "grid":\n subwidget = new GridWidget("", "", chart.data, chart.options);\n break;\n case "grouped_barchart":\n subwidget = new GroupedBarChartWidget("", "", chart.data, chart.options);\n break;\n case "heatmap":\n subwidget = new HeatMapWidget("", "", chart.data, chart.options);\n break;\n case "linechart":\n subwidget = new LineChartWidget("", "", chart.data, chart.options);\n break;\n case "piechart":\n subwidget = new PieChartWidget("", "", chart.data, chart.options);\n break;\n case "simple_grouped_barchart":\n subwidget = new SimpleGroupedBarChartWidget("", "", chart.data, chart.options);\n break;\n case "stacked_barchart":\n subwidget = new StackedBarChartWidget("", "", chart.data, chart.options);\n break;\n case "scatterchart":\n subwidget = new ScatterChartWidget("", "", chart.data, chart.options);\n break;\n default:\n // unknown -> render nothing\n widget.removeChild(subwidget_div);\n continue;\n }\n if (this.options.direction === "column") {\n var _subwidget_div$queryS, _subwidget_div$queryS2;\n (_subwidget_div$queryS = subwidget_div.querySelector(\'.chart-title\')) === null || _subwidget_div$queryS === void 0 || _subwidget_div$queryS.parentElement.remove();\n (_subwidget_div$queryS2 = subwidget_div.querySelector(\'.question-mark\')) === null || _subwidget_div$queryS2 === void 0 || _subwidget_div$queryS2.parentElement.remove();\n // TODO paint axes yes / no ?\n\n var subwidget_title = document.createElement("div");\n subwidget_title.className = "chart-subtitle column";\n subwidget_title.innerHTML = chart.name;\n subwidget_div.appendChild(subwidget_title);\n var generated = subwidget.plot(width, height, subwidget_div);\n if (generated != null) {\n subwidget_div.innerHTML = subwidget_div.innerHTML + generated;\n }\n } else {\n var _subwidget_div$queryS3, _subwidget_div$queryS4;\n (_subwidget_div$queryS3 = subwidget_div.querySelector(\'.chart-title\')) === null || _subwidget_div$queryS3 === void 0 || _subwidget_div$queryS3.parentElement.remove();\n (_subwidget_div$queryS4 = subwidget_div.querySelector(\'.question-mark\')) === null || _subwidget_div$queryS4 === void 0 || _subwidget_div$queryS4.parentElement.remove();\n // TODO paint axes yes / no ?\n\n var _subwidget_title = document.createElement("div");\n _subwidget_title.className = "chart-subtitle";\n _subwidget_title.innerHTML = chart.name;\n subwidget_div.appendChild(_subwidget_title);\n var _generated = subwidget.plot(width, height, subwidget_div);\n if (_generated != null) {\n subwidget_div.innerHTML = subwidget_div.innerHTML + _generated;\n }\n }\n firstColumn = false;\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n return null; // we write directly to the DOM, thus return null\n }\n }]);\n return GridWidget;\n}(BaseChartWidget);\n;// CONCATENATED MODULE: ../index.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n;// CONCATENATED MODULE: ./src/mock_charts/mock_bar_chart.js\n\nvar dict = {\n "accessed": 98,\n "started": 7,\n "graded": 7,\n "submitted": 7,\n "answered": 38,\n "leftUnanswered": 4\n};\nvar mock_bar_chart_data = Object.keys(dict).map(function (key) {\n return {\n column1: key,\n column2: dict[key]\n };\n});\nvar mockBarChart = {\n "barchart-widget": new BarChartWidget("Kursnutzung", "Darstellung des Fortschritts der Teilnehmer anhand der Nutzung der Lerninhalte", mock_bar_chart_data, {\n showLegend: true,\n xAxisLabel: "Status",\n yAxisLabel: "Anzahl"\n })\n};\nvar chartjs_data = {\n datasets: [{\n data: Object.keys(dict).map(function (key) {\n return dict[key];\n })\n }],\n labels: Object.keys(dict)\n};\nfunction mockChartJSBarChart(onShowDesc) {\n return {\n "chartjs-barchart-widget": new ChartJSWidget("Kursnutzung", "Darstellung des Fortschritts der Teilnehmer anhand der Nutzung der Lerninhalte", chartjs_data, {\n chartjs_options: {\n scales: {\n x: {\n title: {\n display: true,\n text: "Status"\n }\n },\n y: {\n title: {\n display: true,\n text: "Anzahl"\n }\n }\n },\n plugins: {\n legend: {\n display: false\n }\n }\n },\n onShowDesc: onShowDesc\n })\n };\n}\n;// CONCATENATED MODULE: ./src/mock_charts/mock_grid.js\n\nvar mock_grid_data = [{\n type: "heatmap",\n name: "Block 1",\n options: {\n showLegend: false\n },\n data: [{\n group: "A",\n variable: "v1",\n value: 12\n }, {\n group: "A",\n variable: "v2",\n value: 1\n }, {\n group: "A",\n variable: "v3",\n value: 26\n }, {\n group: "A",\n variable: "v4",\n value: 86\n }, {\n group: "A",\n variable: "v5",\n value: 10\n }, {\n group: "B",\n variable: "v1",\n value: 82\n }, {\n group: "B",\n variable: "v2",\n value: 65\n }, {\n group: "B",\n variable: "v3",\n value: 51\n }, {\n group: "B",\n variable: "v4",\n value: 2\n }, {\n group: "B",\n variable: "v5",\n value: 15\n }, {\n group: "C",\n variable: "v1",\n value: 23\n }, {\n group: "C",\n variable: "v2",\n value: 35\n }, {\n group: "C",\n variable: "v3",\n value: 45\n }, {\n group: "C",\n variable: "v4",\n value: 36\n }, {\n group: "C",\n variable: "v5",\n value: 19\n }, {\n group: "D",\n variable: "v1",\n value: 89\n }, {\n group: "D",\n variable: "v2",\n value: 64\n }, {\n group: "D",\n variable: "v3",\n value: 4\n }, {\n group: "D",\n variable: "v4",\n value: 39\n }, {\n group: "D",\n variable: "v5",\n value: 75\n }]\n}, {\n type: "heatmap",\n name: "Block 2",\n options: {\n showLegend: false\n },\n data: [{\n group: "A",\n variable: "v1",\n value: 12\n }, {\n group: "A",\n variable: "v2",\n value: 1\n }, {\n group: "A",\n variable: "v3",\n value: 26\n }, {\n group: "A",\n variable: "v4",\n value: 86\n }, {\n group: "A",\n variable: "v5",\n value: 10\n }, {\n group: "B",\n variable: "v1",\n value: 82\n }, {\n group: "B",\n variable: "v2",\n value: 65\n }, {\n group: "B",\n variable: "v3",\n value: 51\n }, {\n group: "B",\n variable: "v4",\n value: 2\n }, {\n group: "B",\n variable: "v5",\n value: 15\n }, {\n group: "C",\n variable: "v1",\n value: 23\n }, {\n group: "C",\n variable: "v2",\n value: 35\n }, {\n group: "C",\n variable: "v3",\n value: 45\n }, {\n group: "C",\n variable: "v4",\n value: 36\n }, {\n group: "C",\n variable: "v5",\n value: 19\n }, {\n group: "D",\n variable: "v1",\n value: 89\n }, {\n group: "D",\n variable: "v2",\n value: 64\n }, {\n group: "D",\n variable: "v3",\n value: 4\n }, {\n group: "D",\n variable: "v4",\n value: 39\n }, {\n group: "D",\n variable: "v5",\n value: 75\n }]\n}, {\n type: "heatmap",\n name: "Block 3",\n options: {\n showLegend: false\n },\n data: [{\n group: "A",\n variable: "v1",\n value: 12\n }, {\n group: "A",\n variable: "v2",\n value: 1\n }, {\n group: "A",\n variable: "v3",\n value: 26\n }, {\n group: "A",\n variable: "v4",\n value: 86\n }, {\n group: "A",\n variable: "v5",\n value: 10\n }, {\n group: "B",\n variable: "v1",\n value: 82\n }, {\n group: "B",\n variable: "v2",\n value: 65\n }, {\n group: "B",\n variable: "v3",\n value: 51\n }, {\n group: "B",\n variable: "v4",\n value: 2\n }, {\n group: "B",\n variable: "v5",\n value: 15\n }, {\n group: "C",\n variable: "v1",\n value: 23\n }, {\n group: "C",\n variable: "v2",\n value: 35\n }, {\n group: "C",\n variable: "v3",\n value: 45\n }, {\n group: "C",\n variable: "v4",\n value: 36\n }, {\n group: "C",\n variable: "v5",\n value: 19\n }, {\n group: "D",\n variable: "v1",\n value: 89\n }, {\n group: "D",\n variable: "v2",\n value: 64\n }, {\n group: "D",\n variable: "v3",\n value: 4\n }, {\n group: "D",\n variable: "v4",\n value: 39\n }, {\n group: "D",\n variable: "v5",\n value: 75\n }]\n}];\nfunction mockGrid(onShowDesc) {\n return {\n "grid-widget": new GridWidget("Kursnutzung in Blocks", "Verteilung der Nutzungsaktivität über die einzelnen Lern-Blocks", mock_grid_data, {\n direction: "row",\n onShowDesc: onShowDesc\n })\n };\n}\n;// CONCATENATED MODULE: ./src/mock_charts/mock_scatter_grid.js\n\nvar mock_scatter_grid_data = [{\n type: "scatterchart",\n name: "0-25%",\n options: {\n showLegend: false,\n showAxes: false,\n xmax: 10,\n ymax: 100\n },\n data: [{\n column1: 0,\n column2: 40,\n highlight: false\n }, {\n column1: 2,\n column2: 26,\n highlight: false\n }, {\n column1: 5,\n column2: 28,\n highlight: false\n }, {\n column1: 7,\n column2: 17,\n highlight: false\n }, {\n column1: 9,\n column2: 39,\n highlight: false\n }, {\n column1: 10,\n column2: 60,\n highlight: false\n }, {\n column1: 8,\n column2: 78,\n highlight: false\n }, {\n column1: 6,\n column2: 15,\n highlight: false\n }, {\n column1: 4,\n column2: 4,\n highlight: false\n }]\n}, {\n type: "scatterchart",\n name: "26-50%",\n options: {\n showLegend: false,\n showAxes: false,\n xmax: 10,\n ymax: 100\n },\n data: [{\n column1: 1,\n column2: 42,\n highlight: false\n }, {\n column1: 2,\n column2: 54,\n highlight: false\n }, {\n column1: 3,\n column2: 87,\n highlight: false\n }, {\n column1: 4,\n column2: 65,\n highlight: false\n }, {\n column1: 5,\n column2: 78,\n highlight: false\n }, {\n column1: 6,\n column2: 92,\n highlight: false\n }, {\n column1: 7,\n column2: 12,\n highlight: false\n }, {\n column1: 8,\n column2: 54,\n highlight: false\n }, {\n column1: 9,\n column2: 34,\n highlight: false\n }, {\n column1: 10,\n column2: 42,\n highlight: false\n }, {\n column1: 1,\n column2: 27,\n highlight: false\n }, {\n column1: 2,\n column2: 29,\n highlight: false\n }, {\n column1: 3,\n column2: 11,\n highlight: false\n }, {\n column1: 4,\n column2: 37,\n highlight: false\n }, {\n column1: 5,\n column2: 10,\n highlight: false\n }, {\n column1: 6,\n column2: 18,\n highlight: false\n }, {\n column1: 7,\n column2: 95,\n highlight: false\n }, {\n column1: 8,\n column2: 2,\n highlight: false\n }]\n}, {\n type: "scatterchart",\n name: "51-75%",\n options: {\n showLegend: false,\n showAxes: false,\n xmax: 10,\n ymax: 100\n },\n data: [{\n column1: 1,\n column2: 32,\n highlight: false\n }, {\n column1: 2,\n column2: 34,\n highlight: false\n }, {\n column1: 3,\n column2: 27,\n highlight: false\n }, {\n column1: 4,\n column2: 45,\n highlight: false\n }, {\n column1: 5,\n column2: 58,\n highlight: false\n }, {\n column1: 6,\n column2: 72,\n highlight: false\n }, {\n column1: 7,\n column2: 87,\n highlight: false\n }, {\n column1: 8,\n column2: 80,\n highlight: false\n }, {\n column1: 9,\n column2: 18,\n highlight: false\n }, {\n column1: 10,\n column2: 25,\n highlight: false\n }, {\n column1: 1,\n column2: 34,\n highlight: false\n }, {\n column1: 2,\n column2: 46,\n highlight: false\n }, {\n column1: 3,\n column2: 58,\n highlight: false\n }, {\n column1: 4,\n column2: 37,\n highlight: false\n }, {\n column1: 5,\n column2: 9,\n highlight: false\n }, {\n column1: 6,\n column2: 10,\n highlight: false\n }]\n}, {\n type: "scatterchart",\n name: "76-100%",\n options: {\n showLegend: false,\n showAxes: false,\n xmax: 10,\n ymax: 100\n },\n data: [{\n column1: 1,\n column2: 32,\n highlight: false\n }, {\n column1: 2,\n column2: 34,\n highlight: false\n }, {\n column1: 3,\n column2: 27,\n highlight: false\n }, {\n column1: 4,\n column2: 75,\n highlight: false\n }, {\n column1: 5,\n column2: 98,\n highlight: false\n }, {\n column1: 6,\n column2: 62,\n highlight: false\n }, {\n column1: 7,\n column2: 72,\n highlight: false\n }, {\n column1: 8,\n column2: 24,\n highlight: false\n }, {\n column1: 9,\n column2: 34,\n highlight: true\n }, {\n column1: 10,\n column2: 44,\n highlight: false\n }, {\n column1: 1,\n column2: 67,\n highlight: false\n }, {\n column1: 2,\n column2: 89,\n highlight: false\n }, {\n column1: 3,\n column2: 21,\n highlight: false\n }, {\n column1: 4,\n column2: 17,\n highlight: false\n }, {\n column1: 5,\n column2: 80,\n highlight: false\n }, {\n column1: 6,\n column2: 68,\n highlight: false\n }, {\n column1: 7,\n column2: 45,\n highlight: false\n }, {\n column1: 8,\n column2: 44,\n highlight: false\n }, {\n column1: 9,\n column2: 26,\n highlight: false\n }, {\n column1: 10,\n column2: 28,\n highlight: false\n }, {\n column1: 1,\n column2: 17,\n highlight: false\n }, {\n column1: 2,\n column2: 9,\n highlight: false\n }, {\n column1: 3,\n column2: 6,\n highlight: false\n }]\n}];\nfunction mockScatterGrid(onShowDesc) {\n return {\n "scatter-grid-widget": new GridWidget("Kursvergleich", "Vergleich mit anderen Studierenden", mock_scatter_grid_data, {\n direction: "row",\n onShowDesc: onShowDesc\n })\n };\n}\n;// CONCATENATED MODULE: ./src/mock_charts/mock_pie_grid.js\n\nvar mock_pie_grid_data = [{\n type: "grid",\n name: "Block 1",\n options: {\n direction: "column"\n },\n data: [{\n type: "piechart",\n name: "",\n options: {\n showLegend: false\n },\n data: [{\n column1: "bestanden",\n column2: 75\n }, {\n column1: "durchgefallen",\n column2: 25\n }]\n }, {\n type: "piechart",\n name: "",\n options: {\n showLegend: false\n },\n data: [{\n column1: "bestanden",\n column2: 68\n }, {\n column1: "durchgefallen",\n column2: 32\n }]\n }, {\n type: "piechart",\n name: "",\n options: {\n showLegend: false\n },\n data: [{\n column1: "bestanden",\n column2: 91\n }, {\n column1: "durchgefallen",\n column2: 9\n }]\n }]\n}, {\n type: "grid",\n name: "Block 2",\n options: {\n direction: "column"\n },\n data: [{\n type: "piechart",\n name: "",\n options: {\n showLegend: false\n },\n data: [{\n column1: "bestanden",\n column2: 83\n }, {\n column1: "durchgefallen",\n column2: 17\n }]\n }, {\n type: "piechart",\n name: "",\n options: {\n showLegend: false\n },\n data: [{\n column1: "bestanden",\n column2: 91\n }, {\n column1: "durchgefallen",\n column2: 9\n }]\n }, {\n type: "piechart",\n name: "",\n options: {\n showLegend: false\n },\n data: [{\n column1: "bestanden",\n column2: 76\n }, {\n column1: "durchgefallen",\n column2: 24\n }]\n }]\n}, {\n type: "grid",\n name: "Block 2",\n options: {\n direction: "column"\n },\n data: [{\n type: "piechart",\n name: "",\n options: {\n showLegend: false\n },\n data: [{\n column1: "bestanden",\n column2: 95\n }, {\n column1: "durchgefallen",\n column2: 5\n }]\n }, {\n type: "piechart",\n name: "",\n options: {\n showLegend: false\n },\n data: [{\n column1: "bestanden",\n column2: 35\n }, {\n column1: "durchgefallen",\n column2: 65\n }]\n }, {\n type: "piechart",\n name: "",\n options: {\n showLegend: false\n },\n data: [{\n column1: "bestanden",\n column2: 45\n }, {\n column1: "durchgefallen",\n column2: 55\n }]\n }]\n}];\nfunction mockPieGrid(onShowDesc) {\n return {\n "mc-pie-grid-widget": new GridWidget("MC-Tests", "Vergleich von Multiple-Choice Elementen", mock_pie_grid_data, {\n direction: "row",\n onShowDesc: onShowDesc\n })\n };\n}\n;// CONCATENATED MODULE: ./src/mock_charts/mock_deadlines.js\n\nvar mock_deadlines_data = [{\n type: "textElement",\n name: "Block 1",\n options: {\n showLegend: false\n },\n data: {\n text: "00.00.00 - noch ... Tage"\n }\n}, {\n type: "textElement",\n name: "Block 2",\n options: {\n showLegend: false\n },\n data: {\n text: "00.00.00 - noch ... Tage"\n }\n}, {\n type: "textElement",\n name: "Block 3",\n options: {\n showLegend: false\n },\n data: {\n text: "00.00.00 - noch ... Tage"\n }\n}];\nfunction mockDeadlines(onShowDesc) {\n return {\n "deadlines-grid-widget": new GridWidget("Deadlines", "Deadlines verschiedener Blöcke", mock_deadlines_data, {\n direction: "column",\n onShowDesc: onShowDesc\n })\n };\n}\n;// CONCATENATED MODULE: ./src/mock_charts/mock_progress_heat.js\n\nvar mock_progress_heat_data = [{\n type: "heatmap",\n name: "Block 1",\n options: {\n showLegend: false\n },\n data: [{\n group: "A",\n variable: "v1",\n value: 12\n }, {\n group: "B",\n variable: "v1",\n value: 82\n }, {\n group: "C",\n variable: "v1",\n value: 23\n }, {\n group: "D",\n variable: "v1",\n value: 89\n }, {\n group: "E",\n variable: "v1",\n value: 75\n }, {\n group: "F",\n variable: "v1",\n value: 38\n }, {\n group: "G",\n variable: "v1",\n value: 25\n }]\n}, {\n type: "heatmap",\n name: "Block 2",\n options: {\n showLegend: false\n },\n data: [{\n group: "A",\n variable: "v1",\n value: 12\n }, {\n group: "B",\n variable: "v1",\n value: 82\n }, {\n group: "C",\n variable: "v1",\n value: 23\n }, {\n group: "D",\n variable: "v1",\n value: 89\n }, {\n group: "E",\n variable: "v1",\n value: 75\n }, {\n group: "F",\n variable: "v1",\n value: 38\n }, {\n group: "G",\n variable: "v1",\n value: 25\n }]\n}, {\n type: "heatmap",\n name: "Block 3",\n options: {\n showLegend: false\n },\n data: [{\n group: "A",\n variable: "v1",\n value: 12\n }, {\n group: "B",\n variable: "v1",\n value: 82\n }, {\n group: "C",\n variable: "v1",\n value: 23\n }, {\n group: "D",\n variable: "v1",\n value: 89\n }, {\n group: "E",\n variable: "v1",\n value: 75\n }, {\n group: "F",\n variable: "v1",\n value: 38\n }, {\n group: "G",\n variable: "v1",\n value: 25\n }]\n}];\nfunction mockProgressHeat(onShowDesc) {\n return {\n "heat-progress-widget": new GridWidget("Kursfortschritt", "Fortschritt in den einzelnen Kursblöcken", mock_progress_heat_data, {\n direction: "column",\n onShowDesc: onShowDesc\n })\n };\n}\n;// CONCATENATED MODULE: ./src/mock_charts/mock_progress_box.js\n\n\nvar mock_progress_box_data = [{\n type: "boxplot",\n name: "Block 1",\n options: {\n showLegend: false\n },\n data: {\n min: 0,\n max: 100,\n q1: 34.8,\n median: 35,\n q3: 35.2\n }\n}, {\n type: "boxplot",\n name: "Block 2",\n options: {\n showLegend: false\n },\n data: {\n min: 0,\n max: 100,\n q1: 67.8,\n median: 68,\n q3: 68.2\n }\n}, {\n type: "boxplot",\n name: "Block 3",\n options: {\n showLegend: false\n },\n data: {\n min: 0,\n max: 100,\n q1: 64.8,\n median: 65,\n q3: 65.2\n }\n}];\nfunction mockProgressBox(onShowDesc) {\n return {\n "box-progress-widget": new GridWidget("Kursfortschritt", "Fortschritt in den einzelnen Kursblöcken", mock_progress_box_data, {\n direction: "column",\n onShowDesc: onShowDesc\n })\n };\n}\n;// CONCATENATED MODULE: ./src/mock_charts/mock_feedback.js\n\nvar mock_feedback_data = [{\n type: "textAreaElement",\n name: "",\n options: {\n showLegend: false\n },\n data: {\n text: "Gib hier dein Feedback ein"\n }\n}];\nfunction mockFeedback(onShowDesc) {\n return {\n "feedback-grid-widget": new GridWidget("Feedback", "Feedback Element", mock_feedback_data, {\n direction: "column",\n onShowDesc: onShowDesc\n })\n };\n}\n;// CONCATENATED MODULE: ./src/mock_charts/mock_line_chart.js\n\nvar mock_line_chart_data = [{\n column1: 0,\n column2: 80\n}, {\n column1: 10,\n column2: 60\n}, {\n column1: 20,\n column2: 70\n}, {\n column1: 30,\n column2: 20\n}, {\n column1: 40,\n column2: 0\n}, {\n column1: 50,\n column2: 60\n}, {\n column1: 60,\n column2: 70\n}, {\n column1: 70,\n column2: 80\n}, {\n column1: 80,\n column2: 76\n}, {\n column1: 90,\n column2: 60\n}, {\n column1: 100,\n column2: 70\n}];\nfunction mockLineChart(onShowDesc) {\n return {\n "line-chart-widget": new LineChartWidget("Kursnutzung", "Durchschnittliche Kursnutzung nach Blöcken", mock_line_chart_data, {\n showLegend: false,\n xAxisLabel: "Blöcke",\n yAxisLabel: "Teilnahme",\n onShowDesc: onShowDesc\n })\n };\n}\n;// CONCATENATED MODULE: ./src/app/pages/dashboard.js\nfunction dashboard_typeof(o) { "@babel/helpers - typeof"; return dashboard_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, dashboard_typeof(o); }\nfunction dashboard_ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction dashboard_objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? dashboard_ownKeys(Object(t), !0).forEach(function (r) { dashboard_defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : dashboard_ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction dashboard_defineProperty(obj, key, value) { key = dashboard_toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction dashboard_toPropertyKey(t) { var i = dashboard_toPrimitive(t, "string"); return "symbol" == dashboard_typeof(i) ? i : String(i); }\nfunction dashboard_toPrimitive(t, r) { if ("object" != dashboard_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != dashboard_typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }\n\n\n\n\n\n\n\n\n\n\n\nvar widgets_config = [{\n x: 0,\n y: 0,\n w: 4,\n h: 6,\n widgetId: "scatter-grid-widget"\n}, {\n x: 4,\n y: 0,\n w: 4,\n h: 6,\n widgetId: "grid-widget"\n}, {\n x: 8,\n y: 0,\n w: 4,\n h: 7,\n widgetId: "chartjs-barchart-widget"\n}, {\n x: 0,\n y: 6,\n w: 2,\n h: 5,\n widgetId: "heat-progress-widget"\n}, {\n x: 2,\n y: 6,\n w: 2,\n h: 5,\n widgetId: "box-progress-widget"\n}, {\n x: 0,\n y: 11,\n h: 6,\n w: 4,\n widgetId: "line-chart-widget"\n}, {\n x: 4,\n y: 6,\n w: 4,\n h: 8,\n widgetId: "mc-pie-grid-widget"\n}, {\n x: 8,\n y: 6,\n w: 4,\n h: 3,\n widgetId: "deadlines-grid-widget"\n}, {\n x: 8,\n y: 9,\n w: 4,\n h: 5,\n widgetId: "feedback-grid-widget"\n}];\nfunction Dashboard() {\n var onShowDesc = function onShowDesc(desc) {\n var modalContent = document.getElementById("modal-content-body");\n modalContent.innerText = desc;\n var modal = new bootstrap.Modal(document.getElementById("myModal"), {});\n modal.show();\n };\n\n /**\n * Opens bootstrap error modal.\n * @param {*} message\n */\n var showErrorModal = function showErrorModal(message) {\n var modalContent = document.getElementById("error-modal-content-body");\n modalContent.innerText = message;\n var modal = new bootstrap.Modal(document.getElementById("myErrorModal"), {});\n modal.show();\n };\n var buildWidgets = function buildWidgets(data) {\n var widgets = dashboard_objectSpread(dashboard_objectSpread(dashboard_objectSpread(dashboard_objectSpread(dashboard_objectSpread(dashboard_objectSpread(dashboard_objectSpread(dashboard_objectSpread(dashboard_objectSpread({}, mockChartJSBarChart(onShowDesc)), mockGrid(onShowDesc)), mockScatterGrid(onShowDesc)), mockPieGrid(onShowDesc)), mockDeadlines(onShowDesc)), mockProgressHeat(onShowDesc)), mockProgressBox(onShowDesc)), mockFeedback(onShowDesc)), mockLineChart(onShowDesc));\n return widgets;\n };\n (0,react.useEffect)(function () {\n var widgets = buildWidgets([]);\n\n // Initialize grid with widgets at configured positions\n var grid = initGrid(widgets, widgets_config);\n }, []);\n return /*#__PURE__*/react.createElement("div", {\n "class": "grid"\n }, /*#__PURE__*/react.createElement("div", {\n "class": "grid-stack"\n }));\n}\n;// CONCATENATED MODULE: ./node_modules/@fortawesome/fontawesome-svg-core/index.mjs\nfunction fontawesome_svg_core_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n enumerableOnly && (symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n })), keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction _objectSpread2(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = null != arguments[i] ? arguments[i] : {};\n i % 2 ? fontawesome_svg_core_ownKeys(Object(source), !0).forEach(function (key) {\n fontawesome_svg_core_defineProperty(target, key, source[key]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : fontawesome_svg_core_ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n\n return target;\n}\n\nfunction fontawesome_svg_core_typeof(obj) {\n "@babel/helpers - typeof";\n\n return fontawesome_svg_core_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) {\n return typeof obj;\n } : function (obj) {\n return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;\n }, fontawesome_svg_core_typeof(obj);\n}\n\nfunction _wrapRegExp() {\n _wrapRegExp = function (re, groups) {\n return new BabelRegExp(re, void 0, groups);\n };\n\n var _super = RegExp.prototype,\n _groups = new WeakMap();\n\n function BabelRegExp(re, flags, groups) {\n var _this = new RegExp(re, flags);\n\n return _groups.set(_this, groups || _groups.get(re)), fontawesome_svg_core_setPrototypeOf(_this, BabelRegExp.prototype);\n }\n\n function buildGroups(result, re) {\n var g = _groups.get(re);\n\n return Object.keys(g).reduce(function (groups, name) {\n return groups[name] = result[g[name]], groups;\n }, Object.create(null));\n }\n\n return fontawesome_svg_core_inherits(BabelRegExp, RegExp), BabelRegExp.prototype.exec = function (str) {\n var result = _super.exec.call(this, str);\n\n return result && (result.groups = buildGroups(result, this)), result;\n }, BabelRegExp.prototype[Symbol.replace] = function (str, substitution) {\n if ("string" == typeof substitution) {\n var groups = _groups.get(this);\n\n return _super[Symbol.replace].call(this, str, substitution.replace(/\\$<([^>]+)>/g, function (_, name) {\n return "$" + groups[name];\n }));\n }\n\n if ("function" == typeof substitution) {\n var _this = this;\n\n return _super[Symbol.replace].call(this, str, function () {\n var args = arguments;\n return "object" != typeof args[args.length - 1] && (args = [].slice.call(args)).push(buildGroups(args, _this)), substitution.apply(this, args);\n });\n }\n\n return _super[Symbol.replace].call(this, str, substitution);\n }, _wrapRegExp.apply(this, arguments);\n}\n\nfunction fontawesome_svg_core_classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError("Cannot call a class as a function");\n }\n}\n\nfunction fontawesome_svg_core_defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if ("value" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction fontawesome_svg_core_createClass(Constructor, protoProps, staticProps) {\n if (protoProps) fontawesome_svg_core_defineProperties(Constructor.prototype, protoProps);\n if (staticProps) fontawesome_svg_core_defineProperties(Constructor, staticProps);\n Object.defineProperty(Constructor, "prototype", {\n writable: false\n });\n return Constructor;\n}\n\nfunction fontawesome_svg_core_defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n\nfunction fontawesome_svg_core_inherits(subClass, superClass) {\n if (typeof superClass !== "function" && superClass !== null) {\n throw new TypeError("Super expression must either be null or a function");\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n writable: true,\n configurable: true\n }\n });\n Object.defineProperty(subClass, "prototype", {\n writable: false\n });\n if (superClass) fontawesome_svg_core_setPrototypeOf(subClass, superClass);\n}\n\nfunction fontawesome_svg_core_setPrototypeOf(o, p) {\n fontawesome_svg_core_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n\n return fontawesome_svg_core_setPrototypeOf(o, p);\n}\n\nfunction fontawesome_svg_core_slicedToArray(arr, i) {\n return fontawesome_svg_core_arrayWithHoles(arr) || fontawesome_svg_core_iterableToArrayLimit(arr, i) || fontawesome_svg_core_unsupportedIterableToArray(arr, i) || fontawesome_svg_core_nonIterableRest();\n}\n\nfunction fontawesome_svg_core_toConsumableArray(arr) {\n return fontawesome_svg_core_arrayWithoutHoles(arr) || fontawesome_svg_core_iterableToArray(arr) || fontawesome_svg_core_unsupportedIterableToArray(arr) || fontawesome_svg_core_nonIterableSpread();\n}\n\nfunction fontawesome_svg_core_arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return fontawesome_svg_core_arrayLikeToArray(arr);\n}\n\nfunction fontawesome_svg_core_arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}\n\nfunction fontawesome_svg_core_iterableToArray(iter) {\n if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);\n}\n\nfunction fontawesome_svg_core_iterableToArrayLimit(arr, i) {\n var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];\n\n if (_i == null) return;\n var _arr = [];\n var _n = true;\n var _d = false;\n\n var _s, _e;\n\n try {\n for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i["return"] != null) _i["return"]();\n } finally {\n if (_d) throw _e;\n }\n }\n\n return _arr;\n}\n\nfunction fontawesome_svg_core_unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === "string") return fontawesome_svg_core_arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === "Object" && o.constructor) n = o.constructor.name;\n if (n === "Map" || n === "Set") return Array.from(o);\n if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return fontawesome_svg_core_arrayLikeToArray(o, minLen);\n}\n\nfunction fontawesome_svg_core_arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n\n return arr2;\n}\n\nfunction fontawesome_svg_core_nonIterableSpread() {\n throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");\n}\n\nfunction fontawesome_svg_core_nonIterableRest() {\n throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");\n}\n\nvar fontawesome_svg_core_noop = function noop() {};\n\nvar _WINDOW = {};\nvar _DOCUMENT = {};\nvar _MUTATION_OBSERVER = null;\nvar _PERFORMANCE = {\n mark: fontawesome_svg_core_noop,\n measure: fontawesome_svg_core_noop\n};\n\ntry {\n if (typeof window !== \'undefined\') _WINDOW = window;\n if (typeof document !== \'undefined\') _DOCUMENT = document;\n if (typeof MutationObserver !== \'undefined\') _MUTATION_OBSERVER = MutationObserver;\n if (typeof performance !== \'undefined\') _PERFORMANCE = performance;\n} catch (e) {}\n\nvar _ref = _WINDOW.navigator || {},\n _ref$userAgent = _ref.userAgent,\n userAgent = _ref$userAgent === void 0 ? \'\' : _ref$userAgent;\nvar WINDOW = _WINDOW;\nvar DOCUMENT = _DOCUMENT;\nvar MUTATION_OBSERVER = _MUTATION_OBSERVER;\nvar PERFORMANCE = _PERFORMANCE;\nvar IS_BROWSER = !!WINDOW.document;\nvar IS_DOM = !!DOCUMENT.documentElement && !!DOCUMENT.head && typeof DOCUMENT.addEventListener === \'function\' && typeof DOCUMENT.createElement === \'function\';\nvar IS_IE = ~userAgent.indexOf(\'MSIE\') || ~userAgent.indexOf(\'Trident/\');\n\nvar _familyProxy, _familyProxy2, _familyProxy3, _familyProxy4, _familyProxy5;\n\nvar NAMESPACE_IDENTIFIER = \'___FONT_AWESOME___\';\nvar UNITS_IN_GRID = 16;\nvar DEFAULT_CSS_PREFIX = \'fa\';\nvar DEFAULT_REPLACEMENT_CLASS = \'svg-inline--fa\';\nvar DATA_FA_I2SVG = \'data-fa-i2svg\';\nvar DATA_FA_PSEUDO_ELEMENT = \'data-fa-pseudo-element\';\nvar DATA_FA_PSEUDO_ELEMENT_PENDING = \'data-fa-pseudo-element-pending\';\nvar DATA_PREFIX = \'data-prefix\';\nvar DATA_ICON = \'data-icon\';\nvar HTML_CLASS_I2SVG_BASE_CLASS = \'fontawesome-i2svg\';\nvar MUTATION_APPROACH_ASYNC = \'async\';\nvar TAGNAMES_TO_SKIP_FOR_PSEUDOELEMENTS = [\'HTML\', \'HEAD\', \'STYLE\', \'SCRIPT\'];\nvar PRODUCTION = function () {\n try {\n return "production" === \'production\';\n } catch (e) {\n return false;\n }\n}();\nvar FAMILY_CLASSIC = \'classic\';\nvar FAMILY_SHARP = \'sharp\';\nvar FAMILIES = [FAMILY_CLASSIC, FAMILY_SHARP];\n\nfunction familyProxy(obj) {\n // Defaults to the classic family if family is not available\n return new Proxy(obj, {\n get: function get(target, prop) {\n return prop in target ? target[prop] : target[FAMILY_CLASSIC];\n }\n });\n}\nvar PREFIX_TO_STYLE = familyProxy((_familyProxy = {}, fontawesome_svg_core_defineProperty(_familyProxy, FAMILY_CLASSIC, {\n \'fa\': \'solid\',\n \'fas\': \'solid\',\n \'fa-solid\': \'solid\',\n \'far\': \'regular\',\n \'fa-regular\': \'regular\',\n \'fal\': \'light\',\n \'fa-light\': \'light\',\n \'fat\': \'thin\',\n \'fa-thin\': \'thin\',\n \'fad\': \'duotone\',\n \'fa-duotone\': \'duotone\',\n \'fab\': \'brands\',\n \'fa-brands\': \'brands\',\n \'fak\': \'kit\',\n \'fakd\': \'kit\',\n \'fa-kit\': \'kit\',\n \'fa-kit-duotone\': \'kit\'\n}), fontawesome_svg_core_defineProperty(_familyProxy, FAMILY_SHARP, {\n \'fa\': \'solid\',\n \'fass\': \'solid\',\n \'fa-solid\': \'solid\',\n \'fasr\': \'regular\',\n \'fa-regular\': \'regular\',\n \'fasl\': \'light\',\n \'fa-light\': \'light\',\n \'fast\': \'thin\',\n \'fa-thin\': \'thin\'\n}), _familyProxy));\nvar STYLE_TO_PREFIX = familyProxy((_familyProxy2 = {}, fontawesome_svg_core_defineProperty(_familyProxy2, FAMILY_CLASSIC, {\n solid: \'fas\',\n regular: \'far\',\n light: \'fal\',\n thin: \'fat\',\n duotone: \'fad\',\n brands: \'fab\',\n kit: \'fak\'\n}), fontawesome_svg_core_defineProperty(_familyProxy2, FAMILY_SHARP, {\n solid: \'fass\',\n regular: \'fasr\',\n light: \'fasl\',\n thin: \'fast\'\n}), _familyProxy2));\nvar PREFIX_TO_LONG_STYLE = familyProxy((_familyProxy3 = {}, fontawesome_svg_core_defineProperty(_familyProxy3, FAMILY_CLASSIC, {\n fab: \'fa-brands\',\n fad: \'fa-duotone\',\n fak: \'fa-kit\',\n fal: \'fa-light\',\n far: \'fa-regular\',\n fas: \'fa-solid\',\n fat: \'fa-thin\'\n}), fontawesome_svg_core_defineProperty(_familyProxy3, FAMILY_SHARP, {\n fass: \'fa-solid\',\n fasr: \'fa-regular\',\n fasl: \'fa-light\',\n fast: \'fa-thin\'\n}), _familyProxy3));\nvar LONG_STYLE_TO_PREFIX = familyProxy((_familyProxy4 = {}, fontawesome_svg_core_defineProperty(_familyProxy4, FAMILY_CLASSIC, {\n \'fa-brands\': \'fab\',\n \'fa-duotone\': \'fad\',\n \'fa-kit\': \'fak\',\n \'fa-light\': \'fal\',\n \'fa-regular\': \'far\',\n \'fa-solid\': \'fas\',\n \'fa-thin\': \'fat\'\n}), fontawesome_svg_core_defineProperty(_familyProxy4, FAMILY_SHARP, {\n \'fa-solid\': \'fass\',\n \'fa-regular\': \'fasr\',\n \'fa-light\': \'fasl\',\n \'fa-thin\': \'fast\'\n}), _familyProxy4));\nvar ICON_SELECTION_SYNTAX_PATTERN = /fa(s|r|l|t|d|b|k|ss|sr|sl|st)?[\\-\\ ]/; // eslint-disable-line no-useless-escape\n\nvar LAYERS_TEXT_CLASSNAME = \'fa-layers-text\';\nvar FONT_FAMILY_PATTERN = /Font ?Awesome ?([56 ]*)(Solid|Regular|Light|Thin|Duotone|Brands|Free|Pro|Sharp|Kit)?.*/i;\nvar FONT_WEIGHT_TO_PREFIX = familyProxy((_familyProxy5 = {}, fontawesome_svg_core_defineProperty(_familyProxy5, FAMILY_CLASSIC, {\n 900: \'fas\',\n 400: \'far\',\n normal: \'far\',\n 300: \'fal\',\n 100: \'fat\'\n}), fontawesome_svg_core_defineProperty(_familyProxy5, FAMILY_SHARP, {\n 900: \'fass\',\n 400: \'fasr\',\n 300: \'fasl\',\n 100: \'fast\'\n}), _familyProxy5));\nvar oneToTen = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];\nvar oneToTwenty = oneToTen.concat([11, 12, 13, 14, 15, 16, 17, 18, 19, 20]);\nvar ATTRIBUTES_WATCHED_FOR_MUTATION = [\'class\', \'data-prefix\', \'data-icon\', \'data-fa-transform\', \'data-fa-mask\'];\nvar DUOTONE_CLASSES = {\n GROUP: \'duotone-group\',\n SWAP_OPACITY: \'swap-opacity\',\n PRIMARY: \'primary\',\n SECONDARY: \'secondary\'\n};\nvar fontawesome_svg_core_prefixes = new Set();\nObject.keys(STYLE_TO_PREFIX[FAMILY_CLASSIC]).map(fontawesome_svg_core_prefixes.add.bind(fontawesome_svg_core_prefixes));\nObject.keys(STYLE_TO_PREFIX[FAMILY_SHARP]).map(fontawesome_svg_core_prefixes.add.bind(fontawesome_svg_core_prefixes));\nvar RESERVED_CLASSES = [].concat(FAMILIES, fontawesome_svg_core_toConsumableArray(fontawesome_svg_core_prefixes), [\'2xs\', \'xs\', \'sm\', \'lg\', \'xl\', \'2xl\', \'beat\', \'border\', \'fade\', \'beat-fade\', \'bounce\', \'flip-both\', \'flip-horizontal\', \'flip-vertical\', \'flip\', \'fw\', \'inverse\', \'layers-counter\', \'layers-text\', \'layers\', \'li\', \'pull-left\', \'pull-right\', \'pulse\', \'rotate-180\', \'rotate-270\', \'rotate-90\', \'rotate-by\', \'shake\', \'spin-pulse\', \'spin-reverse\', \'spin\', \'stack-1x\', \'stack-2x\', \'stack\', \'ul\', DUOTONE_CLASSES.GROUP, DUOTONE_CLASSES.SWAP_OPACITY, DUOTONE_CLASSES.PRIMARY, DUOTONE_CLASSES.SECONDARY]).concat(oneToTen.map(function (n) {\n return "".concat(n, "x");\n})).concat(oneToTwenty.map(function (n) {\n return "w-".concat(n);\n}));\n\nvar initial = WINDOW.FontAwesomeConfig || {};\n\nfunction getAttrConfig(attr) {\n var element = DOCUMENT.querySelector(\'script[\' + attr + \']\');\n\n if (element) {\n return element.getAttribute(attr);\n }\n}\n\nfunction coerce(val) {\n // Getting an empty string will occur if the attribute is set on the HTML tag but without a value\n // We\'ll assume that this is an indication that it should be toggled to true\n if (val === \'\') return true;\n if (val === \'false\') return false;\n if (val === \'true\') return true;\n return val;\n}\n\nif (DOCUMENT && typeof DOCUMENT.querySelector === \'function\') {\n var attrs = [[\'data-family-prefix\', \'familyPrefix\'], [\'data-css-prefix\', \'cssPrefix\'], [\'data-family-default\', \'familyDefault\'], [\'data-style-default\', \'styleDefault\'], [\'data-replacement-class\', \'replacementClass\'], [\'data-auto-replace-svg\', \'autoReplaceSvg\'], [\'data-auto-add-css\', \'autoAddCss\'], [\'data-auto-a11y\', \'autoA11y\'], [\'data-search-pseudo-elements\', \'searchPseudoElements\'], [\'data-observe-mutations\', \'observeMutations\'], [\'data-mutate-approach\', \'mutateApproach\'], [\'data-keep-original-source\', \'keepOriginalSource\'], [\'data-measure-performance\', \'measurePerformance\'], [\'data-show-missing-icons\', \'showMissingIcons\']];\n attrs.forEach(function (_ref) {\n var _ref2 = fontawesome_svg_core_slicedToArray(_ref, 2),\n attr = _ref2[0],\n key = _ref2[1];\n\n var val = coerce(getAttrConfig(attr));\n\n if (val !== undefined && val !== null) {\n initial[key] = val;\n }\n });\n}\n\nvar _default = {\n styleDefault: \'solid\',\n familyDefault: \'classic\',\n cssPrefix: DEFAULT_CSS_PREFIX,\n replacementClass: DEFAULT_REPLACEMENT_CLASS,\n autoReplaceSvg: true,\n autoAddCss: true,\n autoA11y: true,\n searchPseudoElements: false,\n observeMutations: true,\n mutateApproach: \'async\',\n keepOriginalSource: true,\n measurePerformance: false,\n showMissingIcons: true\n}; // familyPrefix is deprecated but we must still support it if present\n\nif (initial.familyPrefix) {\n initial.cssPrefix = initial.familyPrefix;\n}\n\nvar _config = _objectSpread2(_objectSpread2({}, _default), initial);\n\nif (!_config.autoReplaceSvg) _config.observeMutations = false;\nvar fontawesome_svg_core_config = {};\nObject.keys(_default).forEach(function (key) {\n Object.defineProperty(fontawesome_svg_core_config, key, {\n enumerable: true,\n set: function set(val) {\n _config[key] = val;\n\n _onChangeCb.forEach(function (cb) {\n return cb(fontawesome_svg_core_config);\n });\n },\n get: function get() {\n return _config[key];\n }\n });\n}); // familyPrefix is deprecated as of 6.2.0 and should be removed in 7.0.0\n\nObject.defineProperty(fontawesome_svg_core_config, \'familyPrefix\', {\n enumerable: true,\n set: function set(val) {\n _config.cssPrefix = val;\n\n _onChangeCb.forEach(function (cb) {\n return cb(fontawesome_svg_core_config);\n });\n },\n get: function get() {\n return _config.cssPrefix;\n }\n});\nWINDOW.FontAwesomeConfig = fontawesome_svg_core_config;\nvar _onChangeCb = [];\nfunction onChange(cb) {\n _onChangeCb.push(cb);\n\n return function () {\n _onChangeCb.splice(_onChangeCb.indexOf(cb), 1);\n };\n}\n\nvar d = UNITS_IN_GRID;\nvar meaninglessTransform = {\n size: 16,\n x: 0,\n y: 0,\n rotate: 0,\n flipX: false,\n flipY: false\n};\nfunction insertCss(css) {\n if (!css || !IS_DOM) {\n return;\n }\n\n var style = DOCUMENT.createElement(\'style\');\n style.setAttribute(\'type\', \'text/css\');\n style.innerHTML = css;\n var headChildren = DOCUMENT.head.childNodes;\n var beforeChild = null;\n\n for (var i = headChildren.length - 1; i > -1; i--) {\n var child = headChildren[i];\n var tagName = (child.tagName || \'\').toUpperCase();\n\n if ([\'STYLE\', \'LINK\'].indexOf(tagName) > -1) {\n beforeChild = child;\n }\n }\n\n DOCUMENT.head.insertBefore(style, beforeChild);\n return css;\n}\nvar idPool = \'0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\';\nfunction nextUniqueId() {\n var size = 12;\n var id = \'\';\n\n while (size-- > 0) {\n id += idPool[Math.random() * 62 | 0];\n }\n\n return id;\n}\nfunction fontawesome_svg_core_toArray(obj) {\n var array = [];\n\n for (var i = (obj || []).length >>> 0; i--;) {\n array[i] = obj[i];\n }\n\n return array;\n}\nfunction fontawesome_svg_core_classArray(node) {\n if (node.classList) {\n return fontawesome_svg_core_toArray(node.classList);\n } else {\n return (node.getAttribute(\'class\') || \'\').split(\' \').filter(function (i) {\n return i;\n });\n }\n}\nfunction htmlEscape(str) {\n return "".concat(str).replace(/&/g, \'&\').replace(/"/g, \'"\').replace(/\'/g, \''\').replace(/</g, \'<\').replace(/>/g, \'>\');\n}\nfunction joinAttributes(attributes) {\n return Object.keys(attributes || {}).reduce(function (acc, attributeName) {\n return acc + "".concat(attributeName, "=\\"").concat(htmlEscape(attributes[attributeName]), "\\" ");\n }, \'\').trim();\n}\nfunction joinStyles(styles) {\n return Object.keys(styles || {}).reduce(function (acc, styleName) {\n return acc + "".concat(styleName, ": ").concat(styles[styleName].trim(), ";");\n }, \'\');\n}\nfunction transformIsMeaningful(transform) {\n return transform.size !== meaninglessTransform.size || transform.x !== meaninglessTransform.x || transform.y !== meaninglessTransform.y || transform.rotate !== meaninglessTransform.rotate || transform.flipX || transform.flipY;\n}\nfunction transformForSvg(_ref) {\n var transform = _ref.transform,\n containerWidth = _ref.containerWidth,\n iconWidth = _ref.iconWidth;\n var outer = {\n transform: "translate(".concat(containerWidth / 2, " 256)")\n };\n var innerTranslate = "translate(".concat(transform.x * 32, ", ").concat(transform.y * 32, ") ");\n var innerScale = "scale(".concat(transform.size / 16 * (transform.flipX ? -1 : 1), ", ").concat(transform.size / 16 * (transform.flipY ? -1 : 1), ") ");\n var innerRotate = "rotate(".concat(transform.rotate, " 0 0)");\n var inner = {\n transform: "".concat(innerTranslate, " ").concat(innerScale, " ").concat(innerRotate)\n };\n var path = {\n transform: "translate(".concat(iconWidth / 2 * -1, " -256)")\n };\n return {\n outer: outer,\n inner: inner,\n path: path\n };\n}\nfunction transformForCss(_ref2) {\n var transform = _ref2.transform,\n _ref2$width = _ref2.width,\n width = _ref2$width === void 0 ? UNITS_IN_GRID : _ref2$width,\n _ref2$height = _ref2.height,\n height = _ref2$height === void 0 ? UNITS_IN_GRID : _ref2$height,\n _ref2$startCentered = _ref2.startCentered,\n startCentered = _ref2$startCentered === void 0 ? false : _ref2$startCentered;\n var val = \'\';\n\n if (startCentered && IS_IE) {\n val += "translate(".concat(transform.x / d - width / 2, "em, ").concat(transform.y / d - height / 2, "em) ");\n } else if (startCentered) {\n val += "translate(calc(-50% + ".concat(transform.x / d, "em), calc(-50% + ").concat(transform.y / d, "em)) ");\n } else {\n val += "translate(".concat(transform.x / d, "em, ").concat(transform.y / d, "em) ");\n }\n\n val += "scale(".concat(transform.size / d * (transform.flipX ? -1 : 1), ", ").concat(transform.size / d * (transform.flipY ? -1 : 1), ") ");\n val += "rotate(".concat(transform.rotate, "deg) ");\n return val;\n}\n\nvar baseStyles = ":root, :host {\\n --fa-font-solid: normal 900 1em/1 \\"Font Awesome 6 Solid\\";\\n --fa-font-regular: normal 400 1em/1 \\"Font Awesome 6 Regular\\";\\n --fa-font-light: normal 300 1em/1 \\"Font Awesome 6 Light\\";\\n --fa-font-thin: normal 100 1em/1 \\"Font Awesome 6 Thin\\";\\n --fa-font-duotone: normal 900 1em/1 \\"Font Awesome 6 Duotone\\";\\n --fa-font-sharp-solid: normal 900 1em/1 \\"Font Awesome 6 Sharp\\";\\n --fa-font-sharp-regular: normal 400 1em/1 \\"Font Awesome 6 Sharp\\";\\n --fa-font-sharp-light: normal 300 1em/1 \\"Font Awesome 6 Sharp\\";\\n --fa-font-sharp-thin: normal 100 1em/1 \\"Font Awesome 6 Sharp\\";\\n --fa-font-brands: normal 400 1em/1 \\"Font Awesome 6 Brands\\";\\n}\\n\\nsvg:not(:root).svg-inline--fa, svg:not(:host).svg-inline--fa {\\n overflow: visible;\\n box-sizing: content-box;\\n}\\n\\n.svg-inline--fa {\\n display: var(--fa-display, inline-block);\\n height: 1em;\\n overflow: visible;\\n vertical-align: -0.125em;\\n}\\n.svg-inline--fa.fa-2xs {\\n vertical-align: 0.1em;\\n}\\n.svg-inline--fa.fa-xs {\\n vertical-align: 0em;\\n}\\n.svg-inline--fa.fa-sm {\\n vertical-align: -0.0714285705em;\\n}\\n.svg-inline--fa.fa-lg {\\n vertical-align: -0.2em;\\n}\\n.svg-inline--fa.fa-xl {\\n vertical-align: -0.25em;\\n}\\n.svg-inline--fa.fa-2xl {\\n vertical-align: -0.3125em;\\n}\\n.svg-inline--fa.fa-pull-left {\\n margin-right: var(--fa-pull-margin, 0.3em);\\n width: auto;\\n}\\n.svg-inline--fa.fa-pull-right {\\n margin-left: var(--fa-pull-margin, 0.3em);\\n width: auto;\\n}\\n.svg-inline--fa.fa-li {\\n width: var(--fa-li-width, 2em);\\n top: 0.25em;\\n}\\n.svg-inline--fa.fa-fw {\\n width: var(--fa-fw-width, 1.25em);\\n}\\n\\n.fa-layers svg.svg-inline--fa {\\n bottom: 0;\\n left: 0;\\n margin: auto;\\n position: absolute;\\n right: 0;\\n top: 0;\\n}\\n\\n.fa-layers-counter, .fa-layers-text {\\n display: inline-block;\\n position: absolute;\\n text-align: center;\\n}\\n\\n.fa-layers {\\n display: inline-block;\\n height: 1em;\\n position: relative;\\n text-align: center;\\n vertical-align: -0.125em;\\n width: 1em;\\n}\\n.fa-layers svg.svg-inline--fa {\\n -webkit-transform-origin: center center;\\n transform-origin: center center;\\n}\\n\\n.fa-layers-text {\\n left: 50%;\\n top: 50%;\\n -webkit-transform: translate(-50%, -50%);\\n transform: translate(-50%, -50%);\\n -webkit-transform-origin: center center;\\n transform-origin: center center;\\n}\\n\\n.fa-layers-counter {\\n background-color: var(--fa-counter-background-color, #ff253a);\\n border-radius: var(--fa-counter-border-radius, 1em);\\n box-sizing: border-box;\\n color: var(--fa-inverse, #fff);\\n line-height: var(--fa-counter-line-height, 1);\\n max-width: var(--fa-counter-max-width, 5em);\\n min-width: var(--fa-counter-min-width, 1.5em);\\n overflow: hidden;\\n padding: var(--fa-counter-padding, 0.25em 0.5em);\\n right: var(--fa-right, 0);\\n text-overflow: ellipsis;\\n top: var(--fa-top, 0);\\n -webkit-transform: scale(var(--fa-counter-scale, 0.25));\\n transform: scale(var(--fa-counter-scale, 0.25));\\n -webkit-transform-origin: top right;\\n transform-origin: top right;\\n}\\n\\n.fa-layers-bottom-right {\\n bottom: var(--fa-bottom, 0);\\n right: var(--fa-right, 0);\\n top: auto;\\n -webkit-transform: scale(var(--fa-layers-scale, 0.25));\\n transform: scale(var(--fa-layers-scale, 0.25));\\n -webkit-transform-origin: bottom right;\\n transform-origin: bottom right;\\n}\\n\\n.fa-layers-bottom-left {\\n bottom: var(--fa-bottom, 0);\\n left: var(--fa-left, 0);\\n right: auto;\\n top: auto;\\n -webkit-transform: scale(var(--fa-layers-scale, 0.25));\\n transform: scale(var(--fa-layers-scale, 0.25));\\n -webkit-transform-origin: bottom left;\\n transform-origin: bottom left;\\n}\\n\\n.fa-layers-top-right {\\n top: var(--fa-top, 0);\\n right: var(--fa-right, 0);\\n -webkit-transform: scale(var(--fa-layers-scale, 0.25));\\n transform: scale(var(--fa-layers-scale, 0.25));\\n -webkit-transform-origin: top right;\\n transform-origin: top right;\\n}\\n\\n.fa-layers-top-left {\\n left: var(--fa-left, 0);\\n right: auto;\\n top: var(--fa-top, 0);\\n -webkit-transform: scale(var(--fa-layers-scale, 0.25));\\n transform: scale(var(--fa-layers-scale, 0.25));\\n -webkit-transform-origin: top left;\\n transform-origin: top left;\\n}\\n\\n.fa-1x {\\n font-size: 1em;\\n}\\n\\n.fa-2x {\\n font-size: 2em;\\n}\\n\\n.fa-3x {\\n font-size: 3em;\\n}\\n\\n.fa-4x {\\n font-size: 4em;\\n}\\n\\n.fa-5x {\\n font-size: 5em;\\n}\\n\\n.fa-6x {\\n font-size: 6em;\\n}\\n\\n.fa-7x {\\n font-size: 7em;\\n}\\n\\n.fa-8x {\\n font-size: 8em;\\n}\\n\\n.fa-9x {\\n font-size: 9em;\\n}\\n\\n.fa-10x {\\n font-size: 10em;\\n}\\n\\n.fa-2xs {\\n font-size: 0.625em;\\n line-height: 0.1em;\\n vertical-align: 0.225em;\\n}\\n\\n.fa-xs {\\n font-size: 0.75em;\\n line-height: 0.0833333337em;\\n vertical-align: 0.125em;\\n}\\n\\n.fa-sm {\\n font-size: 0.875em;\\n line-height: 0.0714285718em;\\n vertical-align: 0.0535714295em;\\n}\\n\\n.fa-lg {\\n font-size: 1.25em;\\n line-height: 0.05em;\\n vertical-align: -0.075em;\\n}\\n\\n.fa-xl {\\n font-size: 1.5em;\\n line-height: 0.0416666682em;\\n vertical-align: -0.125em;\\n}\\n\\n.fa-2xl {\\n font-size: 2em;\\n line-height: 0.03125em;\\n vertical-align: -0.1875em;\\n}\\n\\n.fa-fw {\\n text-align: center;\\n width: 1.25em;\\n}\\n\\n.fa-ul {\\n list-style-type: none;\\n margin-left: var(--fa-li-margin, 2.5em);\\n padding-left: 0;\\n}\\n.fa-ul > li {\\n position: relative;\\n}\\n\\n.fa-li {\\n left: calc(var(--fa-li-width, 2em) * -1);\\n position: absolute;\\n text-align: center;\\n width: var(--fa-li-width, 2em);\\n line-height: inherit;\\n}\\n\\n.fa-border {\\n border-color: var(--fa-border-color, #eee);\\n border-radius: var(--fa-border-radius, 0.1em);\\n border-style: var(--fa-border-style, solid);\\n border-width: var(--fa-border-width, 0.08em);\\n padding: var(--fa-border-padding, 0.2em 0.25em 0.15em);\\n}\\n\\n.fa-pull-left {\\n float: left;\\n margin-right: var(--fa-pull-margin, 0.3em);\\n}\\n\\n.fa-pull-right {\\n float: right;\\n margin-left: var(--fa-pull-margin, 0.3em);\\n}\\n\\n.fa-beat {\\n -webkit-animation-name: fa-beat;\\n animation-name: fa-beat;\\n -webkit-animation-delay: var(--fa-animation-delay, 0s);\\n animation-delay: var(--fa-animation-delay, 0s);\\n -webkit-animation-direction: var(--fa-animation-direction, normal);\\n animation-direction: var(--fa-animation-direction, normal);\\n -webkit-animation-duration: var(--fa-animation-duration, 1s);\\n animation-duration: var(--fa-animation-duration, 1s);\\n -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n -webkit-animation-timing-function: var(--fa-animation-timing, ease-in-out);\\n animation-timing-function: var(--fa-animation-timing, ease-in-out);\\n}\\n\\n.fa-bounce {\\n -webkit-animation-name: fa-bounce;\\n animation-name: fa-bounce;\\n -webkit-animation-delay: var(--fa-animation-delay, 0s);\\n animation-delay: var(--fa-animation-delay, 0s);\\n -webkit-animation-direction: var(--fa-animation-direction, normal);\\n animation-direction: var(--fa-animation-direction, normal);\\n -webkit-animation-duration: var(--fa-animation-duration, 1s);\\n animation-duration: var(--fa-animation-duration, 1s);\\n -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n -webkit-animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.28, 0.84, 0.42, 1));\\n animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.28, 0.84, 0.42, 1));\\n}\\n\\n.fa-fade {\\n -webkit-animation-name: fa-fade;\\n animation-name: fa-fade;\\n -webkit-animation-delay: var(--fa-animation-delay, 0s);\\n animation-delay: var(--fa-animation-delay, 0s);\\n -webkit-animation-direction: var(--fa-animation-direction, normal);\\n animation-direction: var(--fa-animation-direction, normal);\\n -webkit-animation-duration: var(--fa-animation-duration, 1s);\\n animation-duration: var(--fa-animation-duration, 1s);\\n -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n -webkit-animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1));\\n animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1));\\n}\\n\\n.fa-beat-fade {\\n -webkit-animation-name: fa-beat-fade;\\n animation-name: fa-beat-fade;\\n -webkit-animation-delay: var(--fa-animation-delay, 0s);\\n animation-delay: var(--fa-animation-delay, 0s);\\n -webkit-animation-direction: var(--fa-animation-direction, normal);\\n animation-direction: var(--fa-animation-direction, normal);\\n -webkit-animation-duration: var(--fa-animation-duration, 1s);\\n animation-duration: var(--fa-animation-duration, 1s);\\n -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n -webkit-animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1));\\n animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1));\\n}\\n\\n.fa-flip {\\n -webkit-animation-name: fa-flip;\\n animation-name: fa-flip;\\n -webkit-animation-delay: var(--fa-animation-delay, 0s);\\n animation-delay: var(--fa-animation-delay, 0s);\\n -webkit-animation-direction: var(--fa-animation-direction, normal);\\n animation-direction: var(--fa-animation-direction, normal);\\n -webkit-animation-duration: var(--fa-animation-duration, 1s);\\n animation-duration: var(--fa-animation-duration, 1s);\\n -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n -webkit-animation-timing-function: var(--fa-animation-timing, ease-in-out);\\n animation-timing-function: var(--fa-animation-timing, ease-in-out);\\n}\\n\\n.fa-shake {\\n -webkit-animation-name: fa-shake;\\n animation-name: fa-shake;\\n -webkit-animation-delay: var(--fa-animation-delay, 0s);\\n animation-delay: var(--fa-animation-delay, 0s);\\n -webkit-animation-direction: var(--fa-animation-direction, normal);\\n animation-direction: var(--fa-animation-direction, normal);\\n -webkit-animation-duration: var(--fa-animation-duration, 1s);\\n animation-duration: var(--fa-animation-duration, 1s);\\n -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n -webkit-animation-timing-function: var(--fa-animation-timing, linear);\\n animation-timing-function: var(--fa-animation-timing, linear);\\n}\\n\\n.fa-spin {\\n -webkit-animation-name: fa-spin;\\n animation-name: fa-spin;\\n -webkit-animation-delay: var(--fa-animation-delay, 0s);\\n animation-delay: var(--fa-animation-delay, 0s);\\n -webkit-animation-direction: var(--fa-animation-direction, normal);\\n animation-direction: var(--fa-animation-direction, normal);\\n -webkit-animation-duration: var(--fa-animation-duration, 2s);\\n animation-duration: var(--fa-animation-duration, 2s);\\n -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n -webkit-animation-timing-function: var(--fa-animation-timing, linear);\\n animation-timing-function: var(--fa-animation-timing, linear);\\n}\\n\\n.fa-spin-reverse {\\n --fa-animation-direction: reverse;\\n}\\n\\n.fa-pulse,\\n.fa-spin-pulse {\\n -webkit-animation-name: fa-spin;\\n animation-name: fa-spin;\\n -webkit-animation-direction: var(--fa-animation-direction, normal);\\n animation-direction: var(--fa-animation-direction, normal);\\n -webkit-animation-duration: var(--fa-animation-duration, 1s);\\n animation-duration: var(--fa-animation-duration, 1s);\\n -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n -webkit-animation-timing-function: var(--fa-animation-timing, steps(8));\\n animation-timing-function: var(--fa-animation-timing, steps(8));\\n}\\n\\n@media (prefers-reduced-motion: reduce) {\\n .fa-beat,\\n.fa-bounce,\\n.fa-fade,\\n.fa-beat-fade,\\n.fa-flip,\\n.fa-pulse,\\n.fa-shake,\\n.fa-spin,\\n.fa-spin-pulse {\\n -webkit-animation-delay: -1ms;\\n animation-delay: -1ms;\\n -webkit-animation-duration: 1ms;\\n animation-duration: 1ms;\\n -webkit-animation-iteration-count: 1;\\n animation-iteration-count: 1;\\n -webkit-transition-delay: 0s;\\n transition-delay: 0s;\\n -webkit-transition-duration: 0s;\\n transition-duration: 0s;\\n }\\n}\\n@-webkit-keyframes fa-beat {\\n 0%, 90% {\\n -webkit-transform: scale(1);\\n transform: scale(1);\\n }\\n 45% {\\n -webkit-transform: scale(var(--fa-beat-scale, 1.25));\\n transform: scale(var(--fa-beat-scale, 1.25));\\n }\\n}\\n@keyframes fa-beat {\\n 0%, 90% {\\n -webkit-transform: scale(1);\\n transform: scale(1);\\n }\\n 45% {\\n -webkit-transform: scale(var(--fa-beat-scale, 1.25));\\n transform: scale(var(--fa-beat-scale, 1.25));\\n }\\n}\\n@-webkit-keyframes fa-bounce {\\n 0% {\\n -webkit-transform: scale(1, 1) translateY(0);\\n transform: scale(1, 1) translateY(0);\\n }\\n 10% {\\n -webkit-transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0);\\n transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0);\\n }\\n 30% {\\n -webkit-transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em));\\n transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em));\\n }\\n 50% {\\n -webkit-transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0);\\n transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0);\\n }\\n 57% {\\n -webkit-transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em));\\n transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em));\\n }\\n 64% {\\n -webkit-transform: scale(1, 1) translateY(0);\\n transform: scale(1, 1) translateY(0);\\n }\\n 100% {\\n -webkit-transform: scale(1, 1) translateY(0);\\n transform: scale(1, 1) translateY(0);\\n }\\n}\\n@keyframes fa-bounce {\\n 0% {\\n -webkit-transform: scale(1, 1) translateY(0);\\n transform: scale(1, 1) translateY(0);\\n }\\n 10% {\\n -webkit-transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0);\\n transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0);\\n }\\n 30% {\\n -webkit-transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em));\\n transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em));\\n }\\n 50% {\\n -webkit-transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0);\\n transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0);\\n }\\n 57% {\\n -webkit-transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em));\\n transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em));\\n }\\n 64% {\\n -webkit-transform: scale(1, 1) translateY(0);\\n transform: scale(1, 1) translateY(0);\\n }\\n 100% {\\n -webkit-transform: scale(1, 1) translateY(0);\\n transform: scale(1, 1) translateY(0);\\n }\\n}\\n@-webkit-keyframes fa-fade {\\n 50% {\\n opacity: var(--fa-fade-opacity, 0.4);\\n }\\n}\\n@keyframes fa-fade {\\n 50% {\\n opacity: var(--fa-fade-opacity, 0.4);\\n }\\n}\\n@-webkit-keyframes fa-beat-fade {\\n 0%, 100% {\\n opacity: var(--fa-beat-fade-opacity, 0.4);\\n -webkit-transform: scale(1);\\n transform: scale(1);\\n }\\n 50% {\\n opacity: 1;\\n -webkit-transform: scale(var(--fa-beat-fade-scale, 1.125));\\n transform: scale(var(--fa-beat-fade-scale, 1.125));\\n }\\n}\\n@keyframes fa-beat-fade {\\n 0%, 100% {\\n opacity: var(--fa-beat-fade-opacity, 0.4);\\n -webkit-transform: scale(1);\\n transform: scale(1);\\n }\\n 50% {\\n opacity: 1;\\n -webkit-transform: scale(var(--fa-beat-fade-scale, 1.125));\\n transform: scale(var(--fa-beat-fade-scale, 1.125));\\n }\\n}\\n@-webkit-keyframes fa-flip {\\n 50% {\\n -webkit-transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg));\\n transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg));\\n }\\n}\\n@keyframes fa-flip {\\n 50% {\\n -webkit-transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg));\\n transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg));\\n }\\n}\\n@-webkit-keyframes fa-shake {\\n 0% {\\n -webkit-transform: rotate(-15deg);\\n transform: rotate(-15deg);\\n }\\n 4% {\\n -webkit-transform: rotate(15deg);\\n transform: rotate(15deg);\\n }\\n 8%, 24% {\\n -webkit-transform: rotate(-18deg);\\n transform: rotate(-18deg);\\n }\\n 12%, 28% {\\n -webkit-transform: rotate(18deg);\\n transform: rotate(18deg);\\n }\\n 16% {\\n -webkit-transform: rotate(-22deg);\\n transform: rotate(-22deg);\\n }\\n 20% {\\n -webkit-transform: rotate(22deg);\\n transform: rotate(22deg);\\n }\\n 32% {\\n -webkit-transform: rotate(-12deg);\\n transform: rotate(-12deg);\\n }\\n 36% {\\n -webkit-transform: rotate(12deg);\\n transform: rotate(12deg);\\n }\\n 40%, 100% {\\n -webkit-transform: rotate(0deg);\\n transform: rotate(0deg);\\n }\\n}\\n@keyframes fa-shake {\\n 0% {\\n -webkit-transform: rotate(-15deg);\\n transform: rotate(-15deg);\\n }\\n 4% {\\n -webkit-transform: rotate(15deg);\\n transform: rotate(15deg);\\n }\\n 8%, 24% {\\n -webkit-transform: rotate(-18deg);\\n transform: rotate(-18deg);\\n }\\n 12%, 28% {\\n -webkit-transform: rotate(18deg);\\n transform: rotate(18deg);\\n }\\n 16% {\\n -webkit-transform: rotate(-22deg);\\n transform: rotate(-22deg);\\n }\\n 20% {\\n -webkit-transform: rotate(22deg);\\n transform: rotate(22deg);\\n }\\n 32% {\\n -webkit-transform: rotate(-12deg);\\n transform: rotate(-12deg);\\n }\\n 36% {\\n -webkit-transform: rotate(12deg);\\n transform: rotate(12deg);\\n }\\n 40%, 100% {\\n -webkit-transform: rotate(0deg);\\n transform: rotate(0deg);\\n }\\n}\\n@-webkit-keyframes fa-spin {\\n 0% {\\n -webkit-transform: rotate(0deg);\\n transform: rotate(0deg);\\n }\\n 100% {\\n -webkit-transform: rotate(360deg);\\n transform: rotate(360deg);\\n }\\n}\\n@keyframes fa-spin {\\n 0% {\\n -webkit-transform: rotate(0deg);\\n transform: rotate(0deg);\\n }\\n 100% {\\n -webkit-transform: rotate(360deg);\\n transform: rotate(360deg);\\n }\\n}\\n.fa-rotate-90 {\\n -webkit-transform: rotate(90deg);\\n transform: rotate(90deg);\\n}\\n\\n.fa-rotate-180 {\\n -webkit-transform: rotate(180deg);\\n transform: rotate(180deg);\\n}\\n\\n.fa-rotate-270 {\\n -webkit-transform: rotate(270deg);\\n transform: rotate(270deg);\\n}\\n\\n.fa-flip-horizontal {\\n -webkit-transform: scale(-1, 1);\\n transform: scale(-1, 1);\\n}\\n\\n.fa-flip-vertical {\\n -webkit-transform: scale(1, -1);\\n transform: scale(1, -1);\\n}\\n\\n.fa-flip-both,\\n.fa-flip-horizontal.fa-flip-vertical {\\n -webkit-transform: scale(-1, -1);\\n transform: scale(-1, -1);\\n}\\n\\n.fa-rotate-by {\\n -webkit-transform: rotate(var(--fa-rotate-angle, none));\\n transform: rotate(var(--fa-rotate-angle, none));\\n}\\n\\n.fa-stack {\\n display: inline-block;\\n vertical-align: middle;\\n height: 2em;\\n position: relative;\\n width: 2.5em;\\n}\\n\\n.fa-stack-1x,\\n.fa-stack-2x {\\n bottom: 0;\\n left: 0;\\n margin: auto;\\n position: absolute;\\n right: 0;\\n top: 0;\\n z-index: var(--fa-stack-z-index, auto);\\n}\\n\\n.svg-inline--fa.fa-stack-1x {\\n height: 1em;\\n width: 1.25em;\\n}\\n.svg-inline--fa.fa-stack-2x {\\n height: 2em;\\n width: 2.5em;\\n}\\n\\n.fa-inverse {\\n color: var(--fa-inverse, #fff);\\n}\\n\\n.sr-only,\\n.fa-sr-only {\\n position: absolute;\\n width: 1px;\\n height: 1px;\\n padding: 0;\\n margin: -1px;\\n overflow: hidden;\\n clip: rect(0, 0, 0, 0);\\n white-space: nowrap;\\n border-width: 0;\\n}\\n\\n.sr-only-focusable:not(:focus),\\n.fa-sr-only-focusable:not(:focus) {\\n position: absolute;\\n width: 1px;\\n height: 1px;\\n padding: 0;\\n margin: -1px;\\n overflow: hidden;\\n clip: rect(0, 0, 0, 0);\\n white-space: nowrap;\\n border-width: 0;\\n}\\n\\n.svg-inline--fa .fa-primary {\\n fill: var(--fa-primary-color, currentColor);\\n opacity: var(--fa-primary-opacity, 1);\\n}\\n\\n.svg-inline--fa .fa-secondary {\\n fill: var(--fa-secondary-color, currentColor);\\n opacity: var(--fa-secondary-opacity, 0.4);\\n}\\n\\n.svg-inline--fa.fa-swap-opacity .fa-primary {\\n opacity: var(--fa-secondary-opacity, 0.4);\\n}\\n\\n.svg-inline--fa.fa-swap-opacity .fa-secondary {\\n opacity: var(--fa-primary-opacity, 1);\\n}\\n\\n.svg-inline--fa mask .fa-primary,\\n.svg-inline--fa mask .fa-secondary {\\n fill: black;\\n}\\n\\n.fad.fa-inverse,\\n.fa-duotone.fa-inverse {\\n color: var(--fa-inverse, #fff);\\n}";\n\nfunction fontawesome_svg_core_css() {\n var dcp = DEFAULT_CSS_PREFIX;\n var drc = DEFAULT_REPLACEMENT_CLASS;\n var fp = fontawesome_svg_core_config.cssPrefix;\n var rc = fontawesome_svg_core_config.replacementClass;\n var s = baseStyles;\n\n if (fp !== dcp || rc !== drc) {\n var dPatt = new RegExp("\\\\.".concat(dcp, "\\\\-"), \'g\');\n var customPropPatt = new RegExp("\\\\--".concat(dcp, "\\\\-"), \'g\');\n var rPatt = new RegExp("\\\\.".concat(drc), \'g\');\n s = s.replace(dPatt, ".".concat(fp, "-")).replace(customPropPatt, "--".concat(fp, "-")).replace(rPatt, ".".concat(rc));\n }\n\n return s;\n}\n\nvar _cssInserted = false;\n\nfunction ensureCss() {\n if (fontawesome_svg_core_config.autoAddCss && !_cssInserted) {\n insertCss(fontawesome_svg_core_css());\n _cssInserted = true;\n }\n}\n\nvar InjectCSS = {\n mixout: function mixout() {\n return {\n dom: {\n css: fontawesome_svg_core_css,\n insertCss: ensureCss\n }\n };\n },\n hooks: function hooks() {\n return {\n beforeDOMElementCreation: function beforeDOMElementCreation() {\n ensureCss();\n },\n beforeI2svg: function beforeI2svg() {\n ensureCss();\n }\n };\n }\n};\n\nvar w = WINDOW || {};\nif (!w[NAMESPACE_IDENTIFIER]) w[NAMESPACE_IDENTIFIER] = {};\nif (!w[NAMESPACE_IDENTIFIER].styles) w[NAMESPACE_IDENTIFIER].styles = {};\nif (!w[NAMESPACE_IDENTIFIER].hooks) w[NAMESPACE_IDENTIFIER].hooks = {};\nif (!w[NAMESPACE_IDENTIFIER].shims) w[NAMESPACE_IDENTIFIER].shims = [];\nvar fontawesome_svg_core_namespace = w[NAMESPACE_IDENTIFIER];\n\nvar functions = [];\n\nvar listener = function listener() {\n DOCUMENT.removeEventListener(\'DOMContentLoaded\', listener);\n loaded = 1;\n functions.map(function (fn) {\n return fn();\n });\n};\n\nvar loaded = false;\n\nif (IS_DOM) {\n loaded = (DOCUMENT.documentElement.doScroll ? /^loaded|^c/ : /^loaded|^i|^c/).test(DOCUMENT.readyState);\n if (!loaded) DOCUMENT.addEventListener(\'DOMContentLoaded\', listener);\n}\n\nfunction domready (fn) {\n if (!IS_DOM) return;\n loaded ? setTimeout(fn, 0) : functions.push(fn);\n}\n\nfunction toHtml(abstractNodes) {\n var tag = abstractNodes.tag,\n _abstractNodes$attrib = abstractNodes.attributes,\n attributes = _abstractNodes$attrib === void 0 ? {} : _abstractNodes$attrib,\n _abstractNodes$childr = abstractNodes.children,\n children = _abstractNodes$childr === void 0 ? [] : _abstractNodes$childr;\n\n if (typeof abstractNodes === \'string\') {\n return htmlEscape(abstractNodes);\n } else {\n return "<".concat(tag, " ").concat(joinAttributes(attributes), ">").concat(children.map(toHtml).join(\'\'), "</").concat(tag, ">");\n }\n}\n\nfunction iconFromMapping(mapping, prefix, iconName) {\n if (mapping && mapping[prefix] && mapping[prefix][iconName]) {\n return {\n prefix: prefix,\n iconName: iconName,\n icon: mapping[prefix][iconName]\n };\n }\n}\n\n/**\n * Internal helper to bind a function known to have 4 arguments\n * to a given context.\n */\n\nvar bindInternal4 = function bindInternal4(func, thisContext) {\n return function (a, b, c, d) {\n return func.call(thisContext, a, b, c, d);\n };\n};\n\n/**\n * # Reduce\n *\n * A fast object `.reduce()` implementation.\n *\n * @param {Object} subject The object to reduce over.\n * @param {Function} fn The reducer function.\n * @param {mixed} initialValue The initial value for the reducer, defaults to subject[0].\n * @param {Object} thisContext The context for the reducer.\n * @return {mixed} The final result.\n */\n\n\nvar reduce = function fastReduceObject(subject, fn, initialValue, thisContext) {\n var keys = Object.keys(subject),\n length = keys.length,\n iterator = thisContext !== undefined ? bindInternal4(fn, thisContext) : fn,\n i,\n key,\n result;\n\n if (initialValue === undefined) {\n i = 1;\n result = subject[keys[0]];\n } else {\n i = 0;\n result = initialValue;\n }\n\n for (; i < length; i++) {\n key = keys[i];\n result = iterator(result, subject[key], key, subject);\n }\n\n return result;\n};\n\n/**\n * ucs2decode() and codePointAt() are both works of Mathias Bynens and licensed under MIT\n *\n * Copyright Mathias Bynens <https://mathiasbynens.be/>\n\n * Permission is hereby granted, free of charge, to any person obtaining\n * a copy of this software and associated documentation files (the\n * "Software"), to deal in the Software without restriction, including\n * without limitation the rights to use, copy, modify, merge, publish,\n * distribute, sublicense, and/or sell copies of the Software, and to\n * permit persons to whom the Software is furnished to do so, subject to\n * the following conditions:\n\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n\n * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\nfunction ucs2decode(string) {\n var output = [];\n var counter = 0;\n var length = string.length;\n\n while (counter < length) {\n var value = string.charCodeAt(counter++);\n\n if (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n var extra = string.charCodeAt(counter++);\n\n if ((extra & 0xFC00) == 0xDC00) {\n // eslint-disable-line eqeqeq\n output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n } else {\n output.push(value);\n counter--;\n }\n } else {\n output.push(value);\n }\n }\n\n return output;\n}\n\nfunction toHex(unicode) {\n var decoded = ucs2decode(unicode);\n return decoded.length === 1 ? decoded[0].toString(16) : null;\n}\nfunction codePointAt(string, index) {\n var size = string.length;\n var first = string.charCodeAt(index);\n var second;\n\n if (first >= 0xD800 && first <= 0xDBFF && size > index + 1) {\n second = string.charCodeAt(index + 1);\n\n if (second >= 0xDC00 && second <= 0xDFFF) {\n return (first - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n }\n }\n\n return first;\n}\n\nfunction normalizeIcons(icons) {\n return Object.keys(icons).reduce(function (acc, iconName) {\n var icon = icons[iconName];\n var expanded = !!icon.icon;\n\n if (expanded) {\n acc[icon.iconName] = icon.icon;\n } else {\n acc[iconName] = icon;\n }\n\n return acc;\n }, {});\n}\n\nfunction defineIcons(prefix, icons) {\n var params = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n var _params$skipHooks = params.skipHooks,\n skipHooks = _params$skipHooks === void 0 ? false : _params$skipHooks;\n var normalized = normalizeIcons(icons);\n\n if (typeof fontawesome_svg_core_namespace.hooks.addPack === \'function\' && !skipHooks) {\n fontawesome_svg_core_namespace.hooks.addPack(prefix, normalizeIcons(icons));\n } else {\n fontawesome_svg_core_namespace.styles[prefix] = _objectSpread2(_objectSpread2({}, fontawesome_svg_core_namespace.styles[prefix] || {}), normalized);\n }\n /**\n * Font Awesome 4 used the prefix of `fa` for all icons. With the introduction\n * of new styles we needed to differentiate between them. Prefix `fa` is now an alias\n * for `fas` so we\'ll ease the upgrade process for our users by automatically defining\n * this as well.\n */\n\n\n if (prefix === \'fas\') {\n defineIcons(\'fa\', icons);\n }\n}\n\nvar duotonePathRe = [/*#__PURE__*/_wrapRegExp(/path d="((?:(?!")[\\s\\S])+)".*path d="((?:(?!")[\\s\\S])+)"/, {\n d1: 1,\n d2: 2\n}), /*#__PURE__*/_wrapRegExp(/path class="((?:(?!")[\\s\\S])+)".*d="((?:(?!")[\\s\\S])+)".*path class="((?:(?!")[\\s\\S])+)".*d="((?:(?!")[\\s\\S])+)"/, {\n cls1: 1,\n d1: 2,\n cls2: 3,\n d2: 4\n}), /*#__PURE__*/_wrapRegExp(/path class="((?:(?!")[\\s\\S])+)".*d="((?:(?!")[\\s\\S])+)"/, {\n cls1: 1,\n d1: 2\n})];\n\nvar _LONG_STYLE, _PREFIXES, _PREFIXES_FOR_FAMILY;\nvar fontawesome_svg_core_styles = fontawesome_svg_core_namespace.styles,\n shims = fontawesome_svg_core_namespace.shims;\nvar LONG_STYLE = (_LONG_STYLE = {}, fontawesome_svg_core_defineProperty(_LONG_STYLE, FAMILY_CLASSIC, Object.values(PREFIX_TO_LONG_STYLE[FAMILY_CLASSIC])), fontawesome_svg_core_defineProperty(_LONG_STYLE, FAMILY_SHARP, Object.values(PREFIX_TO_LONG_STYLE[FAMILY_SHARP])), _LONG_STYLE);\nvar _defaultUsablePrefix = null;\nvar _byUnicode = {};\nvar _byLigature = {};\nvar _byOldName = {};\nvar _byOldUnicode = {};\nvar _byAlias = {};\nvar PREFIXES = (_PREFIXES = {}, fontawesome_svg_core_defineProperty(_PREFIXES, FAMILY_CLASSIC, Object.keys(PREFIX_TO_STYLE[FAMILY_CLASSIC])), fontawesome_svg_core_defineProperty(_PREFIXES, FAMILY_SHARP, Object.keys(PREFIX_TO_STYLE[FAMILY_SHARP])), _PREFIXES);\n\nfunction isReserved(name) {\n return ~RESERVED_CLASSES.indexOf(name);\n}\n\nfunction getIconName(cssPrefix, cls) {\n var parts = cls.split(\'-\');\n var prefix = parts[0];\n var iconName = parts.slice(1).join(\'-\');\n\n if (prefix === cssPrefix && iconName !== \'\' && !isReserved(iconName)) {\n return iconName;\n } else {\n return null;\n }\n}\nvar build = function build() {\n var lookup = function lookup(reducer) {\n return reduce(fontawesome_svg_core_styles, function (o, style, prefix) {\n o[prefix] = reduce(style, reducer, {});\n return o;\n }, {});\n };\n\n _byUnicode = lookup(function (acc, icon, iconName) {\n if (icon[3]) {\n acc[icon[3]] = iconName;\n }\n\n if (icon[2]) {\n var aliases = icon[2].filter(function (a) {\n return typeof a === \'number\';\n });\n aliases.forEach(function (alias) {\n acc[alias.toString(16)] = iconName;\n });\n }\n\n return acc;\n });\n _byLigature = lookup(function (acc, icon, iconName) {\n acc[iconName] = iconName;\n\n if (icon[2]) {\n var aliases = icon[2].filter(function (a) {\n return typeof a === \'string\';\n });\n aliases.forEach(function (alias) {\n acc[alias] = iconName;\n });\n }\n\n return acc;\n });\n _byAlias = lookup(function (acc, icon, iconName) {\n var aliases = icon[2];\n acc[iconName] = iconName;\n aliases.forEach(function (alias) {\n acc[alias] = iconName;\n });\n return acc;\n }); // If we have a Kit, we can\'t determine if regular is available since we\n // could be auto-fetching it. We\'ll have to assume that it is available.\n\n var hasRegular = \'far\' in fontawesome_svg_core_styles || fontawesome_svg_core_config.autoFetchSvg;\n var shimLookups = reduce(shims, function (acc, shim) {\n var maybeNameMaybeUnicode = shim[0];\n var prefix = shim[1];\n var iconName = shim[2];\n\n if (prefix === \'far\' && !hasRegular) {\n prefix = \'fas\';\n }\n\n if (typeof maybeNameMaybeUnicode === \'string\') {\n acc.names[maybeNameMaybeUnicode] = {\n prefix: prefix,\n iconName: iconName\n };\n }\n\n if (typeof maybeNameMaybeUnicode === \'number\') {\n acc.unicodes[maybeNameMaybeUnicode.toString(16)] = {\n prefix: prefix,\n iconName: iconName\n };\n }\n\n return acc;\n }, {\n names: {},\n unicodes: {}\n });\n _byOldName = shimLookups.names;\n _byOldUnicode = shimLookups.unicodes;\n _defaultUsablePrefix = getCanonicalPrefix(fontawesome_svg_core_config.styleDefault, {\n family: fontawesome_svg_core_config.familyDefault\n });\n};\nonChange(function (c) {\n _defaultUsablePrefix = getCanonicalPrefix(c.styleDefault, {\n family: fontawesome_svg_core_config.familyDefault\n });\n});\nbuild();\nfunction byUnicode(prefix, unicode) {\n return (_byUnicode[prefix] || {})[unicode];\n}\nfunction byLigature(prefix, ligature) {\n return (_byLigature[prefix] || {})[ligature];\n}\nfunction byAlias(prefix, alias) {\n return (_byAlias[prefix] || {})[alias];\n}\nfunction byOldName(name) {\n return _byOldName[name] || {\n prefix: null,\n iconName: null\n };\n}\nfunction byOldUnicode(unicode) {\n var oldUnicode = _byOldUnicode[unicode];\n var newUnicode = byUnicode(\'fas\', unicode);\n return oldUnicode || (newUnicode ? {\n prefix: \'fas\',\n iconName: newUnicode\n } : null) || {\n prefix: null,\n iconName: null\n };\n}\nfunction getDefaultUsablePrefix() {\n return _defaultUsablePrefix;\n}\nvar emptyCanonicalIcon = function emptyCanonicalIcon() {\n return {\n prefix: null,\n iconName: null,\n rest: []\n };\n};\nfunction getCanonicalPrefix(styleOrPrefix) {\n var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _params$family = params.family,\n family = _params$family === void 0 ? FAMILY_CLASSIC : _params$family;\n var style = PREFIX_TO_STYLE[family][styleOrPrefix];\n var prefix = STYLE_TO_PREFIX[family][styleOrPrefix] || STYLE_TO_PREFIX[family][style];\n var defined = styleOrPrefix in fontawesome_svg_core_namespace.styles ? styleOrPrefix : null;\n return prefix || defined || null;\n}\nvar PREFIXES_FOR_FAMILY = (_PREFIXES_FOR_FAMILY = {}, fontawesome_svg_core_defineProperty(_PREFIXES_FOR_FAMILY, FAMILY_CLASSIC, Object.keys(PREFIX_TO_LONG_STYLE[FAMILY_CLASSIC])), fontawesome_svg_core_defineProperty(_PREFIXES_FOR_FAMILY, FAMILY_SHARP, Object.keys(PREFIX_TO_LONG_STYLE[FAMILY_SHARP])), _PREFIXES_FOR_FAMILY);\nfunction getCanonicalIcon(values) {\n var _famProps;\n\n var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _params$skipLookups = params.skipLookups,\n skipLookups = _params$skipLookups === void 0 ? false : _params$skipLookups;\n var famProps = (_famProps = {}, fontawesome_svg_core_defineProperty(_famProps, FAMILY_CLASSIC, "".concat(fontawesome_svg_core_config.cssPrefix, "-").concat(FAMILY_CLASSIC)), fontawesome_svg_core_defineProperty(_famProps, FAMILY_SHARP, "".concat(fontawesome_svg_core_config.cssPrefix, "-").concat(FAMILY_SHARP)), _famProps);\n var givenPrefix = null;\n var family = FAMILY_CLASSIC;\n\n if (values.includes(famProps[FAMILY_CLASSIC]) || values.some(function (v) {\n return PREFIXES_FOR_FAMILY[FAMILY_CLASSIC].includes(v);\n })) {\n family = FAMILY_CLASSIC;\n }\n\n if (values.includes(famProps[FAMILY_SHARP]) || values.some(function (v) {\n return PREFIXES_FOR_FAMILY[FAMILY_SHARP].includes(v);\n })) {\n family = FAMILY_SHARP;\n }\n\n var canonical = values.reduce(function (acc, cls) {\n var iconName = getIconName(fontawesome_svg_core_config.cssPrefix, cls);\n\n if (fontawesome_svg_core_styles[cls]) {\n cls = LONG_STYLE[family].includes(cls) ? LONG_STYLE_TO_PREFIX[family][cls] : cls;\n givenPrefix = cls;\n acc.prefix = cls;\n } else if (PREFIXES[family].indexOf(cls) > -1) {\n givenPrefix = cls;\n acc.prefix = getCanonicalPrefix(cls, {\n family: family\n });\n } else if (iconName) {\n acc.iconName = iconName;\n } else if (cls !== fontawesome_svg_core_config.replacementClass && cls !== famProps[FAMILY_CLASSIC] && cls !== famProps[FAMILY_SHARP]) {\n acc.rest.push(cls);\n }\n\n if (!skipLookups && acc.prefix && acc.iconName) {\n var shim = givenPrefix === \'fa\' ? byOldName(acc.iconName) : {};\n var aliasIconName = byAlias(acc.prefix, acc.iconName);\n\n if (shim.prefix) {\n givenPrefix = null;\n }\n\n acc.iconName = shim.iconName || aliasIconName || acc.iconName;\n acc.prefix = shim.prefix || acc.prefix;\n\n if (acc.prefix === \'far\' && !fontawesome_svg_core_styles[\'far\'] && fontawesome_svg_core_styles[\'fas\'] && !fontawesome_svg_core_config.autoFetchSvg) {\n // Allow a fallback from the regular style to solid if regular is not available\n // but only if we aren\'t auto-fetching SVGs\n acc.prefix = \'fas\';\n }\n }\n\n return acc;\n }, emptyCanonicalIcon());\n\n if (values.includes(\'fa-brands\') || values.includes(\'fab\')) {\n canonical.prefix = \'fab\';\n }\n\n if (values.includes(\'fa-duotone\') || values.includes(\'fad\')) {\n canonical.prefix = \'fad\';\n }\n\n if (!canonical.prefix && family === FAMILY_SHARP && (fontawesome_svg_core_styles[\'fass\'] || fontawesome_svg_core_config.autoFetchSvg)) {\n canonical.prefix = \'fass\';\n canonical.iconName = byAlias(canonical.prefix, canonical.iconName) || canonical.iconName;\n }\n\n if (canonical.prefix === \'fa\' || givenPrefix === \'fa\') {\n // The fa prefix is not canonical. So if it has made it through until this point\n // we will shift it to the correct prefix.\n canonical.prefix = getDefaultUsablePrefix() || \'fas\';\n }\n\n return canonical;\n}\n\nvar Library = /*#__PURE__*/function () {\n function Library() {\n fontawesome_svg_core_classCallCheck(this, Library);\n\n this.definitions = {};\n }\n\n fontawesome_svg_core_createClass(Library, [{\n key: "add",\n value: function add() {\n var _this = this;\n\n for (var _len = arguments.length, definitions = new Array(_len), _key = 0; _key < _len; _key++) {\n definitions[_key] = arguments[_key];\n }\n\n var additions = definitions.reduce(this._pullDefinitions, {});\n Object.keys(additions).forEach(function (key) {\n _this.definitions[key] = _objectSpread2(_objectSpread2({}, _this.definitions[key] || {}), additions[key]);\n defineIcons(key, additions[key]); // TODO can we stop doing this? We can\'t get the icons by \'fa-solid\' any longer so this probably needs to change\n\n var longPrefix = PREFIX_TO_LONG_STYLE[FAMILY_CLASSIC][key];\n if (longPrefix) defineIcons(longPrefix, additions[key]);\n build();\n });\n }\n }, {\n key: "reset",\n value: function reset() {\n this.definitions = {};\n }\n }, {\n key: "_pullDefinitions",\n value: function _pullDefinitions(additions, definition) {\n var normalized = definition.prefix && definition.iconName && definition.icon ? {\n 0: definition\n } : definition;\n Object.keys(normalized).map(function (key) {\n var _normalized$key = normalized[key],\n prefix = _normalized$key.prefix,\n iconName = _normalized$key.iconName,\n icon = _normalized$key.icon;\n var aliases = icon[2];\n if (!additions[prefix]) additions[prefix] = {};\n\n if (aliases.length > 0) {\n aliases.forEach(function (alias) {\n if (typeof alias === \'string\') {\n additions[prefix][alias] = icon;\n }\n });\n }\n\n additions[prefix][iconName] = icon;\n });\n return additions;\n }\n }]);\n\n return Library;\n}();\n\nvar _plugins = [];\nvar _hooks = {};\nvar providers = {};\nvar defaultProviderKeys = Object.keys(providers);\nfunction registerPlugins(nextPlugins, _ref) {\n var obj = _ref.mixoutsTo;\n _plugins = nextPlugins;\n _hooks = {};\n Object.keys(providers).forEach(function (k) {\n if (defaultProviderKeys.indexOf(k) === -1) {\n delete providers[k];\n }\n });\n\n _plugins.forEach(function (plugin) {\n var mixout = plugin.mixout ? plugin.mixout() : {};\n Object.keys(mixout).forEach(function (tk) {\n if (typeof mixout[tk] === \'function\') {\n obj[tk] = mixout[tk];\n }\n\n if (fontawesome_svg_core_typeof(mixout[tk]) === \'object\') {\n Object.keys(mixout[tk]).forEach(function (sk) {\n if (!obj[tk]) {\n obj[tk] = {};\n }\n\n obj[tk][sk] = mixout[tk][sk];\n });\n }\n });\n\n if (plugin.hooks) {\n var hooks = plugin.hooks();\n Object.keys(hooks).forEach(function (hook) {\n if (!_hooks[hook]) {\n _hooks[hook] = [];\n }\n\n _hooks[hook].push(hooks[hook]);\n });\n }\n\n if (plugin.provides) {\n plugin.provides(providers);\n }\n });\n\n return obj;\n}\nfunction chainHooks(hook, accumulator) {\n for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n args[_key - 2] = arguments[_key];\n }\n\n var hookFns = _hooks[hook] || [];\n hookFns.forEach(function (hookFn) {\n accumulator = hookFn.apply(null, [accumulator].concat(args)); // eslint-disable-line no-useless-call\n });\n return accumulator;\n}\nfunction callHooks(hook) {\n for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n\n var hookFns = _hooks[hook] || [];\n hookFns.forEach(function (hookFn) {\n hookFn.apply(null, args);\n });\n return undefined;\n}\nfunction callProvided() {\n var hook = arguments[0];\n var args = Array.prototype.slice.call(arguments, 1);\n return providers[hook] ? providers[hook].apply(null, args) : undefined;\n}\n\nfunction findIconDefinition(iconLookup) {\n if (iconLookup.prefix === \'fa\') {\n iconLookup.prefix = \'fas\';\n }\n\n var iconName = iconLookup.iconName;\n var prefix = iconLookup.prefix || getDefaultUsablePrefix();\n if (!iconName) return;\n iconName = byAlias(prefix, iconName) || iconName;\n return iconFromMapping(library.definitions, prefix, iconName) || iconFromMapping(fontawesome_svg_core_namespace.styles, prefix, iconName);\n}\nvar library = new Library();\nvar noAuto = function noAuto() {\n fontawesome_svg_core_config.autoReplaceSvg = false;\n fontawesome_svg_core_config.observeMutations = false;\n callHooks(\'noAuto\');\n};\nvar dom = {\n i2svg: function i2svg() {\n var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n if (IS_DOM) {\n callHooks(\'beforeI2svg\', params);\n callProvided(\'pseudoElements2svg\', params);\n return callProvided(\'i2svg\', params);\n } else {\n return Promise.reject(\'Operation requires a DOM of some kind.\');\n }\n },\n watch: function watch() {\n var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var autoReplaceSvgRoot = params.autoReplaceSvgRoot;\n\n if (fontawesome_svg_core_config.autoReplaceSvg === false) {\n fontawesome_svg_core_config.autoReplaceSvg = true;\n }\n\n fontawesome_svg_core_config.observeMutations = true;\n domready(function () {\n autoReplace({\n autoReplaceSvgRoot: autoReplaceSvgRoot\n });\n callHooks(\'watch\', params);\n });\n }\n};\nvar fontawesome_svg_core_parse = {\n icon: function icon(_icon) {\n if (_icon === null) {\n return null;\n }\n\n if (fontawesome_svg_core_typeof(_icon) === \'object\' && _icon.prefix && _icon.iconName) {\n return {\n prefix: _icon.prefix,\n iconName: byAlias(_icon.prefix, _icon.iconName) || _icon.iconName\n };\n }\n\n if (Array.isArray(_icon) && _icon.length === 2) {\n var iconName = _icon[1].indexOf(\'fa-\') === 0 ? _icon[1].slice(3) : _icon[1];\n var prefix = getCanonicalPrefix(_icon[0]);\n return {\n prefix: prefix,\n iconName: byAlias(prefix, iconName) || iconName\n };\n }\n\n if (typeof _icon === \'string\' && (_icon.indexOf("".concat(fontawesome_svg_core_config.cssPrefix, "-")) > -1 || _icon.match(ICON_SELECTION_SYNTAX_PATTERN))) {\n var canonicalIcon = getCanonicalIcon(_icon.split(\' \'), {\n skipLookups: true\n });\n return {\n prefix: canonicalIcon.prefix || getDefaultUsablePrefix(),\n iconName: byAlias(canonicalIcon.prefix, canonicalIcon.iconName) || canonicalIcon.iconName\n };\n }\n\n if (typeof _icon === \'string\') {\n var _prefix = getDefaultUsablePrefix();\n\n return {\n prefix: _prefix,\n iconName: byAlias(_prefix, _icon) || _icon\n };\n }\n }\n};\nvar api = {\n noAuto: noAuto,\n config: fontawesome_svg_core_config,\n dom: dom,\n parse: fontawesome_svg_core_parse,\n library: library,\n findIconDefinition: findIconDefinition,\n toHtml: toHtml\n};\n\nvar autoReplace = function autoReplace() {\n var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var _params$autoReplaceSv = params.autoReplaceSvgRoot,\n autoReplaceSvgRoot = _params$autoReplaceSv === void 0 ? DOCUMENT : _params$autoReplaceSv;\n if ((Object.keys(fontawesome_svg_core_namespace.styles).length > 0 || fontawesome_svg_core_config.autoFetchSvg) && IS_DOM && fontawesome_svg_core_config.autoReplaceSvg) api.dom.i2svg({\n node: autoReplaceSvgRoot\n });\n};\n\nfunction domVariants(val, abstractCreator) {\n Object.defineProperty(val, \'abstract\', {\n get: abstractCreator\n });\n Object.defineProperty(val, \'html\', {\n get: function get() {\n return val.abstract.map(function (a) {\n return toHtml(a);\n });\n }\n });\n Object.defineProperty(val, \'node\', {\n get: function get() {\n if (!IS_DOM) return;\n var container = DOCUMENT.createElement(\'div\');\n container.innerHTML = val.html;\n return container.children;\n }\n });\n return val;\n}\n\nfunction asIcon (_ref) {\n var children = _ref.children,\n main = _ref.main,\n mask = _ref.mask,\n attributes = _ref.attributes,\n styles = _ref.styles,\n transform = _ref.transform;\n\n if (transformIsMeaningful(transform) && main.found && !mask.found) {\n var width = main.width,\n height = main.height;\n var offset = {\n x: width / height / 2,\n y: 0.5\n };\n attributes[\'style\'] = joinStyles(_objectSpread2(_objectSpread2({}, styles), {}, {\n \'transform-origin\': "".concat(offset.x + transform.x / 16, "em ").concat(offset.y + transform.y / 16, "em")\n }));\n }\n\n return [{\n tag: \'svg\',\n attributes: attributes,\n children: children\n }];\n}\n\nfunction asSymbol (_ref) {\n var prefix = _ref.prefix,\n iconName = _ref.iconName,\n children = _ref.children,\n attributes = _ref.attributes,\n symbol = _ref.symbol;\n var id = symbol === true ? "".concat(prefix, "-").concat(fontawesome_svg_core_config.cssPrefix, "-").concat(iconName) : symbol;\n return [{\n tag: \'svg\',\n attributes: {\n style: \'display: none;\'\n },\n children: [{\n tag: \'symbol\',\n attributes: _objectSpread2(_objectSpread2({}, attributes), {}, {\n id: id\n }),\n children: children\n }]\n }];\n}\n\nfunction makeInlineSvgAbstract(params) {\n var _params$icons = params.icons,\n main = _params$icons.main,\n mask = _params$icons.mask,\n prefix = params.prefix,\n iconName = params.iconName,\n transform = params.transform,\n symbol = params.symbol,\n title = params.title,\n maskId = params.maskId,\n titleId = params.titleId,\n extra = params.extra,\n _params$watchable = params.watchable,\n watchable = _params$watchable === void 0 ? false : _params$watchable;\n\n var _ref = mask.found ? mask : main,\n width = _ref.width,\n height = _ref.height;\n\n var isUploadedIcon = prefix === \'fak\';\n var attrClass = [fontawesome_svg_core_config.replacementClass, iconName ? "".concat(fontawesome_svg_core_config.cssPrefix, "-").concat(iconName) : \'\'].filter(function (c) {\n return extra.classes.indexOf(c) === -1;\n }).filter(function (c) {\n return c !== \'\' || !!c;\n }).concat(extra.classes).join(\' \');\n var content = {\n children: [],\n attributes: _objectSpread2(_objectSpread2({}, extra.attributes), {}, {\n \'data-prefix\': prefix,\n \'data-icon\': iconName,\n \'class\': attrClass,\n \'role\': extra.attributes.role || \'img\',\n \'xmlns\': \'http://www.w3.org/2000/svg\',\n \'viewBox\': "0 0 ".concat(width, " ").concat(height)\n })\n };\n var uploadedIconWidthStyle = isUploadedIcon && !~extra.classes.indexOf(\'fa-fw\') ? {\n width: "".concat(width / height * 16 * 0.0625, "em")\n } : {};\n\n if (watchable) {\n content.attributes[DATA_FA_I2SVG] = \'\';\n }\n\n if (title) {\n content.children.push({\n tag: \'title\',\n attributes: {\n id: content.attributes[\'aria-labelledby\'] || "title-".concat(titleId || nextUniqueId())\n },\n children: [title]\n });\n delete content.attributes.title;\n }\n\n var args = _objectSpread2(_objectSpread2({}, content), {}, {\n prefix: prefix,\n iconName: iconName,\n main: main,\n mask: mask,\n maskId: maskId,\n transform: transform,\n symbol: symbol,\n styles: _objectSpread2(_objectSpread2({}, uploadedIconWidthStyle), extra.styles)\n });\n\n var _ref2 = mask.found && main.found ? callProvided(\'generateAbstractMask\', args) || {\n children: [],\n attributes: {}\n } : callProvided(\'generateAbstractIcon\', args) || {\n children: [],\n attributes: {}\n },\n children = _ref2.children,\n attributes = _ref2.attributes;\n\n args.children = children;\n args.attributes = attributes;\n\n if (symbol) {\n return asSymbol(args);\n } else {\n return asIcon(args);\n }\n}\nfunction makeLayersTextAbstract(params) {\n var content = params.content,\n width = params.width,\n height = params.height,\n transform = params.transform,\n title = params.title,\n extra = params.extra,\n _params$watchable2 = params.watchable,\n watchable = _params$watchable2 === void 0 ? false : _params$watchable2;\n\n var attributes = _objectSpread2(_objectSpread2(_objectSpread2({}, extra.attributes), title ? {\n \'title\': title\n } : {}), {}, {\n \'class\': extra.classes.join(\' \')\n });\n\n if (watchable) {\n attributes[DATA_FA_I2SVG] = \'\';\n }\n\n var styles = _objectSpread2({}, extra.styles);\n\n if (transformIsMeaningful(transform)) {\n styles[\'transform\'] = transformForCss({\n transform: transform,\n startCentered: true,\n width: width,\n height: height\n });\n styles[\'-webkit-transform\'] = styles[\'transform\'];\n }\n\n var styleString = joinStyles(styles);\n\n if (styleString.length > 0) {\n attributes[\'style\'] = styleString;\n }\n\n var val = [];\n val.push({\n tag: \'span\',\n attributes: attributes,\n children: [content]\n });\n\n if (title) {\n val.push({\n tag: \'span\',\n attributes: {\n class: \'sr-only\'\n },\n children: [title]\n });\n }\n\n return val;\n}\nfunction makeLayersCounterAbstract(params) {\n var content = params.content,\n title = params.title,\n extra = params.extra;\n\n var attributes = _objectSpread2(_objectSpread2(_objectSpread2({}, extra.attributes), title ? {\n \'title\': title\n } : {}), {}, {\n \'class\': extra.classes.join(\' \')\n });\n\n var styleString = joinStyles(extra.styles);\n\n if (styleString.length > 0) {\n attributes[\'style\'] = styleString;\n }\n\n var val = [];\n val.push({\n tag: \'span\',\n attributes: attributes,\n children: [content]\n });\n\n if (title) {\n val.push({\n tag: \'span\',\n attributes: {\n class: \'sr-only\'\n },\n children: [title]\n });\n }\n\n return val;\n}\n\nvar styles$1 = fontawesome_svg_core_namespace.styles;\nfunction asFoundIcon(icon) {\n var width = icon[0];\n var height = icon[1];\n\n var _icon$slice = icon.slice(4),\n _icon$slice2 = fontawesome_svg_core_slicedToArray(_icon$slice, 1),\n vectorData = _icon$slice2[0];\n\n var element = null;\n\n if (Array.isArray(vectorData)) {\n element = {\n tag: \'g\',\n attributes: {\n class: "".concat(fontawesome_svg_core_config.cssPrefix, "-").concat(DUOTONE_CLASSES.GROUP)\n },\n children: [{\n tag: \'path\',\n attributes: {\n class: "".concat(fontawesome_svg_core_config.cssPrefix, "-").concat(DUOTONE_CLASSES.SECONDARY),\n fill: \'currentColor\',\n d: vectorData[0]\n }\n }, {\n tag: \'path\',\n attributes: {\n class: "".concat(fontawesome_svg_core_config.cssPrefix, "-").concat(DUOTONE_CLASSES.PRIMARY),\n fill: \'currentColor\',\n d: vectorData[1]\n }\n }]\n };\n } else {\n element = {\n tag: \'path\',\n attributes: {\n fill: \'currentColor\',\n d: vectorData\n }\n };\n }\n\n return {\n found: true,\n width: width,\n height: height,\n icon: element\n };\n}\nvar missingIconResolutionMixin = {\n found: false,\n width: 512,\n height: 512\n};\n\nfunction maybeNotifyMissing(iconName, prefix) {\n if (!PRODUCTION && !fontawesome_svg_core_config.showMissingIcons && iconName) {\n console.error("Icon with name \\"".concat(iconName, "\\" and prefix \\"").concat(prefix, "\\" is missing."));\n }\n}\n\nfunction findIcon(iconName, prefix) {\n var givenPrefix = prefix;\n\n if (prefix === \'fa\' && fontawesome_svg_core_config.styleDefault !== null) {\n prefix = getDefaultUsablePrefix();\n }\n\n return new Promise(function (resolve, reject) {\n var val = {\n found: false,\n width: 512,\n height: 512,\n icon: callProvided(\'missingIconAbstract\') || {}\n };\n\n if (givenPrefix === \'fa\') {\n var shim = byOldName(iconName) || {};\n iconName = shim.iconName || iconName;\n prefix = shim.prefix || prefix;\n }\n\n if (iconName && prefix && styles$1[prefix] && styles$1[prefix][iconName]) {\n var icon = styles$1[prefix][iconName];\n return resolve(asFoundIcon(icon));\n }\n\n maybeNotifyMissing(iconName, prefix);\n resolve(_objectSpread2(_objectSpread2({}, missingIconResolutionMixin), {}, {\n icon: fontawesome_svg_core_config.showMissingIcons && iconName ? callProvided(\'missingIconAbstract\') || {} : {}\n }));\n });\n}\n\nvar noop$1 = function noop() {};\n\nvar p = fontawesome_svg_core_config.measurePerformance && PERFORMANCE && PERFORMANCE.mark && PERFORMANCE.measure ? PERFORMANCE : {\n mark: noop$1,\n measure: noop$1\n};\nvar preamble = "FA \\"6.5.1\\"";\n\nvar begin = function begin(name) {\n p.mark("".concat(preamble, " ").concat(name, " begins"));\n return function () {\n return fontawesome_svg_core_end(name);\n };\n};\n\nvar fontawesome_svg_core_end = function end(name) {\n p.mark("".concat(preamble, " ").concat(name, " ends"));\n p.measure("".concat(preamble, " ").concat(name), "".concat(preamble, " ").concat(name, " begins"), "".concat(preamble, " ").concat(name, " ends"));\n};\n\nvar perf = {\n begin: begin,\n end: fontawesome_svg_core_end\n};\n\nvar noop$2 = function noop() {};\n\nfunction isWatched(node) {\n var i2svg = node.getAttribute ? node.getAttribute(DATA_FA_I2SVG) : null;\n return typeof i2svg === \'string\';\n}\n\nfunction hasPrefixAndIcon(node) {\n var prefix = node.getAttribute ? node.getAttribute(DATA_PREFIX) : null;\n var icon = node.getAttribute ? node.getAttribute(DATA_ICON) : null;\n return prefix && icon;\n}\n\nfunction hasBeenReplaced(node) {\n return node && node.classList && node.classList.contains && node.classList.contains(fontawesome_svg_core_config.replacementClass);\n}\n\nfunction getMutator() {\n if (fontawesome_svg_core_config.autoReplaceSvg === true) {\n return mutators.replace;\n }\n\n var mutator = mutators[fontawesome_svg_core_config.autoReplaceSvg];\n return mutator || mutators.replace;\n}\n\nfunction createElementNS(tag) {\n return DOCUMENT.createElementNS(\'http://www.w3.org/2000/svg\', tag);\n}\n\nfunction createElement(tag) {\n return DOCUMENT.createElement(tag);\n}\n\nfunction convertSVG(abstractObj) {\n var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _params$ceFn = params.ceFn,\n ceFn = _params$ceFn === void 0 ? abstractObj.tag === \'svg\' ? createElementNS : createElement : _params$ceFn;\n\n if (typeof abstractObj === \'string\') {\n return DOCUMENT.createTextNode(abstractObj);\n }\n\n var tag = ceFn(abstractObj.tag);\n Object.keys(abstractObj.attributes || []).forEach(function (key) {\n tag.setAttribute(key, abstractObj.attributes[key]);\n });\n var children = abstractObj.children || [];\n children.forEach(function (child) {\n tag.appendChild(convertSVG(child, {\n ceFn: ceFn\n }));\n });\n return tag;\n}\n\nfunction nodeAsComment(node) {\n var comment = " ".concat(node.outerHTML, " ");\n /* BEGIN.ATTRIBUTION */\n\n comment = "".concat(comment, "Font Awesome fontawesome.com ");\n /* END.ATTRIBUTION */\n\n return comment;\n}\n\nvar mutators = {\n replace: function replace(mutation) {\n var node = mutation[0];\n\n if (node.parentNode) {\n mutation[1].forEach(function (_abstract) {\n node.parentNode.insertBefore(convertSVG(_abstract), node);\n });\n\n if (node.getAttribute(DATA_FA_I2SVG) === null && fontawesome_svg_core_config.keepOriginalSource) {\n var comment = DOCUMENT.createComment(nodeAsComment(node));\n node.parentNode.replaceChild(comment, node);\n } else {\n node.remove();\n }\n }\n },\n nest: function nest(mutation) {\n var node = mutation[0];\n var _abstract2 = mutation[1]; // If we already have a replaced node we do not want to continue nesting within it.\n // Short-circuit to the standard replacement\n\n if (~fontawesome_svg_core_classArray(node).indexOf(fontawesome_svg_core_config.replacementClass)) {\n return mutators.replace(mutation);\n }\n\n var forSvg = new RegExp("".concat(fontawesome_svg_core_config.cssPrefix, "-.*"));\n delete _abstract2[0].attributes.id;\n\n if (_abstract2[0].attributes.class) {\n var splitClasses = _abstract2[0].attributes.class.split(\' \').reduce(function (acc, cls) {\n if (cls === fontawesome_svg_core_config.replacementClass || cls.match(forSvg)) {\n acc.toSvg.push(cls);\n } else {\n acc.toNode.push(cls);\n }\n\n return acc;\n }, {\n toNode: [],\n toSvg: []\n });\n\n _abstract2[0].attributes.class = splitClasses.toSvg.join(\' \');\n\n if (splitClasses.toNode.length === 0) {\n node.removeAttribute(\'class\');\n } else {\n node.setAttribute(\'class\', splitClasses.toNode.join(\' \'));\n }\n }\n\n var newInnerHTML = _abstract2.map(function (a) {\n return toHtml(a);\n }).join(\'\\n\');\n\n node.setAttribute(DATA_FA_I2SVG, \'\');\n node.innerHTML = newInnerHTML;\n }\n};\n\nfunction performOperationSync(op) {\n op();\n}\n\nfunction perform(mutations, callback) {\n var callbackFunction = typeof callback === \'function\' ? callback : noop$2;\n\n if (mutations.length === 0) {\n callbackFunction();\n } else {\n var frame = performOperationSync;\n\n if (fontawesome_svg_core_config.mutateApproach === MUTATION_APPROACH_ASYNC) {\n frame = WINDOW.requestAnimationFrame || performOperationSync;\n }\n\n frame(function () {\n var mutator = getMutator();\n var mark = perf.begin(\'mutate\');\n mutations.map(mutator);\n mark();\n callbackFunction();\n });\n }\n}\nvar disabled = false;\nfunction disableObservation() {\n disabled = true;\n}\nfunction enableObservation() {\n disabled = false;\n}\nvar mo = null;\nfunction observe(options) {\n if (!MUTATION_OBSERVER) {\n return;\n }\n\n if (!fontawesome_svg_core_config.observeMutations) {\n return;\n }\n\n var _options$treeCallback = options.treeCallback,\n treeCallback = _options$treeCallback === void 0 ? noop$2 : _options$treeCallback,\n _options$nodeCallback = options.nodeCallback,\n nodeCallback = _options$nodeCallback === void 0 ? noop$2 : _options$nodeCallback,\n _options$pseudoElemen = options.pseudoElementsCallback,\n pseudoElementsCallback = _options$pseudoElemen === void 0 ? noop$2 : _options$pseudoElemen,\n _options$observeMutat = options.observeMutationsRoot,\n observeMutationsRoot = _options$observeMutat === void 0 ? DOCUMENT : _options$observeMutat;\n mo = new MUTATION_OBSERVER(function (objects) {\n if (disabled) return;\n var defaultPrefix = getDefaultUsablePrefix();\n fontawesome_svg_core_toArray(objects).forEach(function (mutationRecord) {\n if (mutationRecord.type === \'childList\' && mutationRecord.addedNodes.length > 0 && !isWatched(mutationRecord.addedNodes[0])) {\n if (fontawesome_svg_core_config.searchPseudoElements) {\n pseudoElementsCallback(mutationRecord.target);\n }\n\n treeCallback(mutationRecord.target);\n }\n\n if (mutationRecord.type === \'attributes\' && mutationRecord.target.parentNode && fontawesome_svg_core_config.searchPseudoElements) {\n pseudoElementsCallback(mutationRecord.target.parentNode);\n }\n\n if (mutationRecord.type === \'attributes\' && isWatched(mutationRecord.target) && ~ATTRIBUTES_WATCHED_FOR_MUTATION.indexOf(mutationRecord.attributeName)) {\n if (mutationRecord.attributeName === \'class\' && hasPrefixAndIcon(mutationRecord.target)) {\n var _getCanonicalIcon = getCanonicalIcon(fontawesome_svg_core_classArray(mutationRecord.target)),\n prefix = _getCanonicalIcon.prefix,\n iconName = _getCanonicalIcon.iconName;\n\n mutationRecord.target.setAttribute(DATA_PREFIX, prefix || defaultPrefix);\n if (iconName) mutationRecord.target.setAttribute(DATA_ICON, iconName);\n } else if (hasBeenReplaced(mutationRecord.target)) {\n nodeCallback(mutationRecord.target);\n }\n }\n });\n });\n if (!IS_DOM) return;\n mo.observe(observeMutationsRoot, {\n childList: true,\n attributes: true,\n characterData: true,\n subtree: true\n });\n}\nfunction disconnect() {\n if (!mo) return;\n mo.disconnect();\n}\n\nfunction styleParser (node) {\n var style = node.getAttribute(\'style\');\n var val = [];\n\n if (style) {\n val = style.split(\';\').reduce(function (acc, style) {\n var styles = style.split(\':\');\n var prop = styles[0];\n var value = styles.slice(1);\n\n if (prop && value.length > 0) {\n acc[prop] = value.join(\':\').trim();\n }\n\n return acc;\n }, {});\n }\n\n return val;\n}\n\nfunction classParser (node) {\n var existingPrefix = node.getAttribute(\'data-prefix\');\n var existingIconName = node.getAttribute(\'data-icon\');\n var innerText = node.innerText !== undefined ? node.innerText.trim() : \'\';\n var val = getCanonicalIcon(fontawesome_svg_core_classArray(node));\n\n if (!val.prefix) {\n val.prefix = getDefaultUsablePrefix();\n }\n\n if (existingPrefix && existingIconName) {\n val.prefix = existingPrefix;\n val.iconName = existingIconName;\n }\n\n if (val.iconName && val.prefix) {\n return val;\n }\n\n if (val.prefix && innerText.length > 0) {\n val.iconName = byLigature(val.prefix, node.innerText) || byUnicode(val.prefix, toHex(node.innerText));\n }\n\n if (!val.iconName && fontawesome_svg_core_config.autoFetchSvg && node.firstChild && node.firstChild.nodeType === Node.TEXT_NODE) {\n val.iconName = node.firstChild.data;\n }\n\n return val;\n}\n\nfunction attributesParser (node) {\n var extraAttributes = fontawesome_svg_core_toArray(node.attributes).reduce(function (acc, attr) {\n if (acc.name !== \'class\' && acc.name !== \'style\') {\n acc[attr.name] = attr.value;\n }\n\n return acc;\n }, {});\n var title = node.getAttribute(\'title\');\n var titleId = node.getAttribute(\'data-fa-title-id\');\n\n if (fontawesome_svg_core_config.autoA11y) {\n if (title) {\n extraAttributes[\'aria-labelledby\'] = "".concat(fontawesome_svg_core_config.replacementClass, "-title-").concat(titleId || nextUniqueId());\n } else {\n extraAttributes[\'aria-hidden\'] = \'true\';\n extraAttributes[\'focusable\'] = \'false\';\n }\n }\n\n return extraAttributes;\n}\n\nfunction blankMeta() {\n return {\n iconName: null,\n title: null,\n titleId: null,\n prefix: null,\n transform: meaninglessTransform,\n symbol: false,\n mask: {\n iconName: null,\n prefix: null,\n rest: []\n },\n maskId: null,\n extra: {\n classes: [],\n styles: {},\n attributes: {}\n }\n };\n}\nfunction parseMeta(node) {\n var parser = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n styleParser: true\n };\n\n var _classParser = classParser(node),\n iconName = _classParser.iconName,\n prefix = _classParser.prefix,\n extraClasses = _classParser.rest;\n\n var extraAttributes = attributesParser(node);\n var pluginMeta = chainHooks(\'parseNodeAttributes\', {}, node);\n var extraStyles = parser.styleParser ? styleParser(node) : [];\n return _objectSpread2({\n iconName: iconName,\n title: node.getAttribute(\'title\'),\n titleId: node.getAttribute(\'data-fa-title-id\'),\n prefix: prefix,\n transform: meaninglessTransform,\n mask: {\n iconName: null,\n prefix: null,\n rest: []\n },\n maskId: null,\n symbol: false,\n extra: {\n classes: extraClasses,\n styles: extraStyles,\n attributes: extraAttributes\n }\n }, pluginMeta);\n}\n\nvar styles$2 = fontawesome_svg_core_namespace.styles;\n\nfunction generateMutation(node) {\n var nodeMeta = fontawesome_svg_core_config.autoReplaceSvg === \'nest\' ? parseMeta(node, {\n styleParser: false\n }) : parseMeta(node);\n\n if (~nodeMeta.extra.classes.indexOf(LAYERS_TEXT_CLASSNAME)) {\n return callProvided(\'generateLayersText\', node, nodeMeta);\n } else {\n return callProvided(\'generateSvgReplacementMutation\', node, nodeMeta);\n }\n}\n\nvar knownPrefixes = new Set();\nFAMILIES.map(function (family) {\n knownPrefixes.add("fa-".concat(family));\n});\nObject.keys(PREFIX_TO_STYLE[FAMILY_CLASSIC]).map(knownPrefixes.add.bind(knownPrefixes));\nObject.keys(PREFIX_TO_STYLE[FAMILY_SHARP]).map(knownPrefixes.add.bind(knownPrefixes));\nknownPrefixes = fontawesome_svg_core_toConsumableArray(knownPrefixes);\n\nfunction onTree(root) {\n var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n if (!IS_DOM) return Promise.resolve();\n var htmlClassList = DOCUMENT.documentElement.classList;\n\n var hclAdd = function hclAdd(suffix) {\n return htmlClassList.add("".concat(HTML_CLASS_I2SVG_BASE_CLASS, "-").concat(suffix));\n };\n\n var hclRemove = function hclRemove(suffix) {\n return htmlClassList.remove("".concat(HTML_CLASS_I2SVG_BASE_CLASS, "-").concat(suffix));\n };\n\n var prefixes = fontawesome_svg_core_config.autoFetchSvg ? knownPrefixes : FAMILIES.map(function (f) {\n return "fa-".concat(f);\n }).concat(Object.keys(styles$2));\n\n if (!prefixes.includes(\'fa\')) {\n prefixes.push(\'fa\');\n }\n\n var prefixesDomQuery = [".".concat(LAYERS_TEXT_CLASSNAME, ":not([").concat(DATA_FA_I2SVG, "])")].concat(prefixes.map(function (p) {\n return ".".concat(p, ":not([").concat(DATA_FA_I2SVG, "])");\n })).join(\', \');\n\n if (prefixesDomQuery.length === 0) {\n return Promise.resolve();\n }\n\n var candidates = [];\n\n try {\n candidates = fontawesome_svg_core_toArray(root.querySelectorAll(prefixesDomQuery));\n } catch (e) {// noop\n }\n\n if (candidates.length > 0) {\n hclAdd(\'pending\');\n hclRemove(\'complete\');\n } else {\n return Promise.resolve();\n }\n\n var mark = perf.begin(\'onTree\');\n var mutations = candidates.reduce(function (acc, node) {\n try {\n var mutation = generateMutation(node);\n\n if (mutation) {\n acc.push(mutation);\n }\n } catch (e) {\n if (!PRODUCTION) {\n if (e.name === \'MissingIcon\') {\n console.error(e);\n }\n }\n }\n\n return acc;\n }, []);\n return new Promise(function (resolve, reject) {\n Promise.all(mutations).then(function (resolvedMutations) {\n perform(resolvedMutations, function () {\n hclAdd(\'active\');\n hclAdd(\'complete\');\n hclRemove(\'pending\');\n if (typeof callback === \'function\') callback();\n mark();\n resolve();\n });\n }).catch(function (e) {\n mark();\n reject(e);\n });\n });\n}\n\nfunction onNode(node) {\n var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n generateMutation(node).then(function (mutation) {\n if (mutation) {\n perform([mutation], callback);\n }\n });\n}\n\nfunction resolveIcons(next) {\n return function (maybeIconDefinition) {\n var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var iconDefinition = (maybeIconDefinition || {}).icon ? maybeIconDefinition : findIconDefinition(maybeIconDefinition || {});\n var mask = params.mask;\n\n if (mask) {\n mask = (mask || {}).icon ? mask : findIconDefinition(mask || {});\n }\n\n return next(iconDefinition, _objectSpread2(_objectSpread2({}, params), {}, {\n mask: mask\n }));\n };\n}\n\nvar render = function render(iconDefinition) {\n var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _params$transform = params.transform,\n transform = _params$transform === void 0 ? meaninglessTransform : _params$transform,\n _params$symbol = params.symbol,\n symbol = _params$symbol === void 0 ? false : _params$symbol,\n _params$mask = params.mask,\n mask = _params$mask === void 0 ? null : _params$mask,\n _params$maskId = params.maskId,\n maskId = _params$maskId === void 0 ? null : _params$maskId,\n _params$title = params.title,\n title = _params$title === void 0 ? null : _params$title,\n _params$titleId = params.titleId,\n titleId = _params$titleId === void 0 ? null : _params$titleId,\n _params$classes = params.classes,\n classes = _params$classes === void 0 ? [] : _params$classes,\n _params$attributes = params.attributes,\n attributes = _params$attributes === void 0 ? {} : _params$attributes,\n _params$styles = params.styles,\n styles = _params$styles === void 0 ? {} : _params$styles;\n if (!iconDefinition) return;\n var prefix = iconDefinition.prefix,\n iconName = iconDefinition.iconName,\n icon = iconDefinition.icon;\n return domVariants(_objectSpread2({\n type: \'icon\'\n }, iconDefinition), function () {\n callHooks(\'beforeDOMElementCreation\', {\n iconDefinition: iconDefinition,\n params: params\n });\n\n if (fontawesome_svg_core_config.autoA11y) {\n if (title) {\n attributes[\'aria-labelledby\'] = "".concat(fontawesome_svg_core_config.replacementClass, "-title-").concat(titleId || nextUniqueId());\n } else {\n attributes[\'aria-hidden\'] = \'true\';\n attributes[\'focusable\'] = \'false\';\n }\n }\n\n return makeInlineSvgAbstract({\n icons: {\n main: asFoundIcon(icon),\n mask: mask ? asFoundIcon(mask.icon) : {\n found: false,\n width: null,\n height: null,\n icon: {}\n }\n },\n prefix: prefix,\n iconName: iconName,\n transform: _objectSpread2(_objectSpread2({}, meaninglessTransform), transform),\n symbol: symbol,\n title: title,\n maskId: maskId,\n titleId: titleId,\n extra: {\n attributes: attributes,\n styles: styles,\n classes: classes\n }\n });\n });\n};\nvar ReplaceElements = {\n mixout: function mixout() {\n return {\n icon: resolveIcons(render)\n };\n },\n hooks: function hooks() {\n return {\n mutationObserverCallbacks: function mutationObserverCallbacks(accumulator) {\n accumulator.treeCallback = onTree;\n accumulator.nodeCallback = onNode;\n return accumulator;\n }\n };\n },\n provides: function provides(providers$$1) {\n providers$$1.i2svg = function (params) {\n var _params$node = params.node,\n node = _params$node === void 0 ? DOCUMENT : _params$node,\n _params$callback = params.callback,\n callback = _params$callback === void 0 ? function () {} : _params$callback;\n return onTree(node, callback);\n };\n\n providers$$1.generateSvgReplacementMutation = function (node, nodeMeta) {\n var iconName = nodeMeta.iconName,\n title = nodeMeta.title,\n titleId = nodeMeta.titleId,\n prefix = nodeMeta.prefix,\n transform = nodeMeta.transform,\n symbol = nodeMeta.symbol,\n mask = nodeMeta.mask,\n maskId = nodeMeta.maskId,\n extra = nodeMeta.extra;\n return new Promise(function (resolve, reject) {\n Promise.all([findIcon(iconName, prefix), mask.iconName ? findIcon(mask.iconName, mask.prefix) : Promise.resolve({\n found: false,\n width: 512,\n height: 512,\n icon: {}\n })]).then(function (_ref) {\n var _ref2 = fontawesome_svg_core_slicedToArray(_ref, 2),\n main = _ref2[0],\n mask = _ref2[1];\n\n resolve([node, makeInlineSvgAbstract({\n icons: {\n main: main,\n mask: mask\n },\n prefix: prefix,\n iconName: iconName,\n transform: transform,\n symbol: symbol,\n maskId: maskId,\n title: title,\n titleId: titleId,\n extra: extra,\n watchable: true\n })]);\n }).catch(reject);\n });\n };\n\n providers$$1.generateAbstractIcon = function (_ref3) {\n var children = _ref3.children,\n attributes = _ref3.attributes,\n main = _ref3.main,\n transform = _ref3.transform,\n styles = _ref3.styles;\n var styleString = joinStyles(styles);\n\n if (styleString.length > 0) {\n attributes[\'style\'] = styleString;\n }\n\n var nextChild;\n\n if (transformIsMeaningful(transform)) {\n nextChild = callProvided(\'generateAbstractTransformGrouping\', {\n main: main,\n transform: transform,\n containerWidth: main.width,\n iconWidth: main.width\n });\n }\n\n children.push(nextChild || main.icon);\n return {\n children: children,\n attributes: attributes\n };\n };\n }\n};\n\nvar Layers = {\n mixout: function mixout() {\n return {\n layer: function layer(assembler) {\n var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _params$classes = params.classes,\n classes = _params$classes === void 0 ? [] : _params$classes;\n return domVariants({\n type: \'layer\'\n }, function () {\n callHooks(\'beforeDOMElementCreation\', {\n assembler: assembler,\n params: params\n });\n var children = [];\n assembler(function (args) {\n Array.isArray(args) ? args.map(function (a) {\n children = children.concat(a.abstract);\n }) : children = children.concat(args.abstract);\n });\n return [{\n tag: \'span\',\n attributes: {\n class: ["".concat(fontawesome_svg_core_config.cssPrefix, "-layers")].concat(fontawesome_svg_core_toConsumableArray(classes)).join(\' \')\n },\n children: children\n }];\n });\n }\n };\n }\n};\n\nvar LayersCounter = {\n mixout: function mixout() {\n return {\n counter: function counter(content) {\n var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _params$title = params.title,\n title = _params$title === void 0 ? null : _params$title,\n _params$classes = params.classes,\n classes = _params$classes === void 0 ? [] : _params$classes,\n _params$attributes = params.attributes,\n attributes = _params$attributes === void 0 ? {} : _params$attributes,\n _params$styles = params.styles,\n styles = _params$styles === void 0 ? {} : _params$styles;\n return domVariants({\n type: \'counter\',\n content: content\n }, function () {\n callHooks(\'beforeDOMElementCreation\', {\n content: content,\n params: params\n });\n return makeLayersCounterAbstract({\n content: content.toString(),\n title: title,\n extra: {\n attributes: attributes,\n styles: styles,\n classes: ["".concat(fontawesome_svg_core_config.cssPrefix, "-layers-counter")].concat(fontawesome_svg_core_toConsumableArray(classes))\n }\n });\n });\n }\n };\n }\n};\n\nvar LayersText = {\n mixout: function mixout() {\n return {\n text: function text(content) {\n var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _params$transform = params.transform,\n transform = _params$transform === void 0 ? meaninglessTransform : _params$transform,\n _params$title = params.title,\n title = _params$title === void 0 ? null : _params$title,\n _params$classes = params.classes,\n classes = _params$classes === void 0 ? [] : _params$classes,\n _params$attributes = params.attributes,\n attributes = _params$attributes === void 0 ? {} : _params$attributes,\n _params$styles = params.styles,\n styles = _params$styles === void 0 ? {} : _params$styles;\n return domVariants({\n type: \'text\',\n content: content\n }, function () {\n callHooks(\'beforeDOMElementCreation\', {\n content: content,\n params: params\n });\n return makeLayersTextAbstract({\n content: content,\n transform: _objectSpread2(_objectSpread2({}, meaninglessTransform), transform),\n title: title,\n extra: {\n attributes: attributes,\n styles: styles,\n classes: ["".concat(fontawesome_svg_core_config.cssPrefix, "-layers-text")].concat(fontawesome_svg_core_toConsumableArray(classes))\n }\n });\n });\n }\n };\n },\n provides: function provides(providers$$1) {\n providers$$1.generateLayersText = function (node, nodeMeta) {\n var title = nodeMeta.title,\n transform = nodeMeta.transform,\n extra = nodeMeta.extra;\n var width = null;\n var height = null;\n\n if (IS_IE) {\n var computedFontSize = parseInt(getComputedStyle(node).fontSize, 10);\n var boundingClientRect = node.getBoundingClientRect();\n width = boundingClientRect.width / computedFontSize;\n height = boundingClientRect.height / computedFontSize;\n }\n\n if (fontawesome_svg_core_config.autoA11y && !title) {\n extra.attributes[\'aria-hidden\'] = \'true\';\n }\n\n return Promise.resolve([node, makeLayersTextAbstract({\n content: node.innerHTML,\n width: width,\n height: height,\n transform: transform,\n title: title,\n extra: extra,\n watchable: true\n })]);\n };\n }\n};\n\nvar CLEAN_CONTENT_PATTERN = new RegExp("\\"", \'ug\');\nvar SECONDARY_UNICODE_RANGE = [1105920, 1112319];\nfunction hexValueFromContent(content) {\n var cleaned = content.replace(CLEAN_CONTENT_PATTERN, \'\');\n var codePoint = codePointAt(cleaned, 0);\n var isPrependTen = codePoint >= SECONDARY_UNICODE_RANGE[0] && codePoint <= SECONDARY_UNICODE_RANGE[1];\n var isDoubled = cleaned.length === 2 ? cleaned[0] === cleaned[1] : false;\n return {\n value: isDoubled ? toHex(cleaned[0]) : toHex(cleaned),\n isSecondary: isPrependTen || isDoubled\n };\n}\n\nfunction replaceForPosition(node, position) {\n var pendingAttribute = "".concat(DATA_FA_PSEUDO_ELEMENT_PENDING).concat(position.replace(\':\', \'-\'));\n return new Promise(function (resolve, reject) {\n if (node.getAttribute(pendingAttribute) !== null) {\n // This node is already being processed\n return resolve();\n }\n\n var children = fontawesome_svg_core_toArray(node.children);\n var alreadyProcessedPseudoElement = children.filter(function (c) {\n return c.getAttribute(DATA_FA_PSEUDO_ELEMENT) === position;\n })[0];\n var styles = WINDOW.getComputedStyle(node, position);\n var fontFamily = styles.getPropertyValue(\'font-family\').match(FONT_FAMILY_PATTERN);\n var fontWeight = styles.getPropertyValue(\'font-weight\');\n var content = styles.getPropertyValue(\'content\');\n\n if (alreadyProcessedPseudoElement && !fontFamily) {\n // If we\'ve already processed it but the current computed style does not result in a font-family,\n // that probably means that a class name that was previously present to make the icon has been\n // removed. So we now should delete the icon.\n node.removeChild(alreadyProcessedPseudoElement);\n return resolve();\n } else if (fontFamily && content !== \'none\' && content !== \'\') {\n var _content = styles.getPropertyValue(\'content\');\n\n var family = ~[\'Sharp\'].indexOf(fontFamily[2]) ? FAMILY_SHARP : FAMILY_CLASSIC;\n var prefix = ~[\'Solid\', \'Regular\', \'Light\', \'Thin\', \'Duotone\', \'Brands\', \'Kit\'].indexOf(fontFamily[2]) ? STYLE_TO_PREFIX[family][fontFamily[2].toLowerCase()] : FONT_WEIGHT_TO_PREFIX[family][fontWeight];\n\n var _hexValueFromContent = hexValueFromContent(_content),\n hexValue = _hexValueFromContent.value,\n isSecondary = _hexValueFromContent.isSecondary;\n\n var isV4 = fontFamily[0].startsWith(\'FontAwesome\');\n var iconName = byUnicode(prefix, hexValue);\n var iconIdentifier = iconName;\n\n if (isV4) {\n var iconName4 = byOldUnicode(hexValue);\n\n if (iconName4.iconName && iconName4.prefix) {\n iconName = iconName4.iconName;\n prefix = iconName4.prefix;\n }\n } // Only convert the pseudo element in this ::before/::after position into an icon if we haven\'t\n // already done so with the same prefix and iconName\n\n\n if (iconName && !isSecondary && (!alreadyProcessedPseudoElement || alreadyProcessedPseudoElement.getAttribute(DATA_PREFIX) !== prefix || alreadyProcessedPseudoElement.getAttribute(DATA_ICON) !== iconIdentifier)) {\n node.setAttribute(pendingAttribute, iconIdentifier);\n\n if (alreadyProcessedPseudoElement) {\n // Delete the old one, since we\'re replacing it with a new one\n node.removeChild(alreadyProcessedPseudoElement);\n }\n\n var meta = blankMeta();\n var extra = meta.extra;\n extra.attributes[DATA_FA_PSEUDO_ELEMENT] = position;\n findIcon(iconName, prefix).then(function (main) {\n var _abstract = makeInlineSvgAbstract(_objectSpread2(_objectSpread2({}, meta), {}, {\n icons: {\n main: main,\n mask: emptyCanonicalIcon()\n },\n prefix: prefix,\n iconName: iconIdentifier,\n extra: extra,\n watchable: true\n }));\n\n var element = DOCUMENT.createElementNS(\'http://www.w3.org/2000/svg\', \'svg\');\n\n if (position === \'::before\') {\n node.insertBefore(element, node.firstChild);\n } else {\n node.appendChild(element);\n }\n\n element.outerHTML = _abstract.map(function (a) {\n return toHtml(a);\n }).join(\'\\n\');\n node.removeAttribute(pendingAttribute);\n resolve();\n }).catch(reject);\n } else {\n resolve();\n }\n } else {\n resolve();\n }\n });\n}\n\nfunction replace(node) {\n return Promise.all([replaceForPosition(node, \'::before\'), replaceForPosition(node, \'::after\')]);\n}\n\nfunction processable(node) {\n return node.parentNode !== document.head && !~TAGNAMES_TO_SKIP_FOR_PSEUDOELEMENTS.indexOf(node.tagName.toUpperCase()) && !node.getAttribute(DATA_FA_PSEUDO_ELEMENT) && (!node.parentNode || node.parentNode.tagName !== \'svg\');\n}\n\nfunction searchPseudoElements(root) {\n if (!IS_DOM) return;\n return new Promise(function (resolve, reject) {\n var operations = fontawesome_svg_core_toArray(root.querySelectorAll(\'*\')).filter(processable).map(replace);\n var end = perf.begin(\'searchPseudoElements\');\n disableObservation();\n Promise.all(operations).then(function () {\n end();\n enableObservation();\n resolve();\n }).catch(function () {\n end();\n enableObservation();\n reject();\n });\n });\n}\n\nvar PseudoElements = {\n hooks: function hooks() {\n return {\n mutationObserverCallbacks: function mutationObserverCallbacks(accumulator) {\n accumulator.pseudoElementsCallback = searchPseudoElements;\n return accumulator;\n }\n };\n },\n provides: function provides(providers$$1) {\n providers$$1.pseudoElements2svg = function (params) {\n var _params$node = params.node,\n node = _params$node === void 0 ? DOCUMENT : _params$node;\n\n if (fontawesome_svg_core_config.searchPseudoElements) {\n searchPseudoElements(node);\n }\n };\n }\n};\n\nvar _unwatched = false;\nvar MutationObserver$1 = {\n mixout: function mixout() {\n return {\n dom: {\n unwatch: function unwatch() {\n disableObservation();\n _unwatched = true;\n }\n }\n };\n },\n hooks: function hooks() {\n return {\n bootstrap: function bootstrap() {\n observe(chainHooks(\'mutationObserverCallbacks\', {}));\n },\n noAuto: function noAuto() {\n disconnect();\n },\n watch: function watch(params) {\n var observeMutationsRoot = params.observeMutationsRoot;\n\n if (_unwatched) {\n enableObservation();\n } else {\n observe(chainHooks(\'mutationObserverCallbacks\', {\n observeMutationsRoot: observeMutationsRoot\n }));\n }\n }\n };\n }\n};\n\nvar parseTransformString = function parseTransformString(transformString) {\n var transform = {\n size: 16,\n x: 0,\n y: 0,\n flipX: false,\n flipY: false,\n rotate: 0\n };\n return transformString.toLowerCase().split(\' \').reduce(function (acc, n) {\n var parts = n.toLowerCase().split(\'-\');\n var first = parts[0];\n var rest = parts.slice(1).join(\'-\');\n\n if (first && rest === \'h\') {\n acc.flipX = true;\n return acc;\n }\n\n if (first && rest === \'v\') {\n acc.flipY = true;\n return acc;\n }\n\n rest = parseFloat(rest);\n\n if (isNaN(rest)) {\n return acc;\n }\n\n switch (first) {\n case \'grow\':\n acc.size = acc.size + rest;\n break;\n\n case \'shrink\':\n acc.size = acc.size - rest;\n break;\n\n case \'left\':\n acc.x = acc.x - rest;\n break;\n\n case \'right\':\n acc.x = acc.x + rest;\n break;\n\n case \'up\':\n acc.y = acc.y - rest;\n break;\n\n case \'down\':\n acc.y = acc.y + rest;\n break;\n\n case \'rotate\':\n acc.rotate = acc.rotate + rest;\n break;\n }\n\n return acc;\n }, transform);\n};\nvar PowerTransforms = {\n mixout: function mixout() {\n return {\n parse: {\n transform: function transform(transformString) {\n return parseTransformString(transformString);\n }\n }\n };\n },\n hooks: function hooks() {\n return {\n parseNodeAttributes: function parseNodeAttributes(accumulator, node) {\n var transformString = node.getAttribute(\'data-fa-transform\');\n\n if (transformString) {\n accumulator.transform = parseTransformString(transformString);\n }\n\n return accumulator;\n }\n };\n },\n provides: function provides(providers) {\n providers.generateAbstractTransformGrouping = function (_ref) {\n var main = _ref.main,\n transform = _ref.transform,\n containerWidth = _ref.containerWidth,\n iconWidth = _ref.iconWidth;\n var outer = {\n transform: "translate(".concat(containerWidth / 2, " 256)")\n };\n var innerTranslate = "translate(".concat(transform.x * 32, ", ").concat(transform.y * 32, ") ");\n var innerScale = "scale(".concat(transform.size / 16 * (transform.flipX ? -1 : 1), ", ").concat(transform.size / 16 * (transform.flipY ? -1 : 1), ") ");\n var innerRotate = "rotate(".concat(transform.rotate, " 0 0)");\n var inner = {\n transform: "".concat(innerTranslate, " ").concat(innerScale, " ").concat(innerRotate)\n };\n var path = {\n transform: "translate(".concat(iconWidth / 2 * -1, " -256)")\n };\n var operations = {\n outer: outer,\n inner: inner,\n path: path\n };\n return {\n tag: \'g\',\n attributes: _objectSpread2({}, operations.outer),\n children: [{\n tag: \'g\',\n attributes: _objectSpread2({}, operations.inner),\n children: [{\n tag: main.icon.tag,\n children: main.icon.children,\n attributes: _objectSpread2(_objectSpread2({}, main.icon.attributes), operations.path)\n }]\n }]\n };\n };\n }\n};\n\nvar ALL_SPACE = {\n x: 0,\n y: 0,\n width: \'100%\',\n height: \'100%\'\n};\n\nfunction fillBlack(_abstract) {\n var force = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n if (_abstract.attributes && (_abstract.attributes.fill || force)) {\n _abstract.attributes.fill = \'black\';\n }\n\n return _abstract;\n}\n\nfunction deGroup(_abstract2) {\n if (_abstract2.tag === \'g\') {\n return _abstract2.children;\n } else {\n return [_abstract2];\n }\n}\n\nvar Masks = {\n hooks: function hooks() {\n return {\n parseNodeAttributes: function parseNodeAttributes(accumulator, node) {\n var maskData = node.getAttribute(\'data-fa-mask\');\n var mask = !maskData ? emptyCanonicalIcon() : getCanonicalIcon(maskData.split(\' \').map(function (i) {\n return i.trim();\n }));\n\n if (!mask.prefix) {\n mask.prefix = getDefaultUsablePrefix();\n }\n\n accumulator.mask = mask;\n accumulator.maskId = node.getAttribute(\'data-fa-mask-id\');\n return accumulator;\n }\n };\n },\n provides: function provides(providers) {\n providers.generateAbstractMask = function (_ref) {\n var children = _ref.children,\n attributes = _ref.attributes,\n main = _ref.main,\n mask = _ref.mask,\n explicitMaskId = _ref.maskId,\n transform = _ref.transform;\n var mainWidth = main.width,\n mainPath = main.icon;\n var maskWidth = mask.width,\n maskPath = mask.icon;\n var trans = transformForSvg({\n transform: transform,\n containerWidth: maskWidth,\n iconWidth: mainWidth\n });\n var maskRect = {\n tag: \'rect\',\n attributes: _objectSpread2(_objectSpread2({}, ALL_SPACE), {}, {\n fill: \'white\'\n })\n };\n var maskInnerGroupChildrenMixin = mainPath.children ? {\n children: mainPath.children.map(fillBlack)\n } : {};\n var maskInnerGroup = {\n tag: \'g\',\n attributes: _objectSpread2({}, trans.inner),\n children: [fillBlack(_objectSpread2({\n tag: mainPath.tag,\n attributes: _objectSpread2(_objectSpread2({}, mainPath.attributes), trans.path)\n }, maskInnerGroupChildrenMixin))]\n };\n var maskOuterGroup = {\n tag: \'g\',\n attributes: _objectSpread2({}, trans.outer),\n children: [maskInnerGroup]\n };\n var maskId = "mask-".concat(explicitMaskId || nextUniqueId());\n var clipId = "clip-".concat(explicitMaskId || nextUniqueId());\n var maskTag = {\n tag: \'mask\',\n attributes: _objectSpread2(_objectSpread2({}, ALL_SPACE), {}, {\n id: maskId,\n maskUnits: \'userSpaceOnUse\',\n maskContentUnits: \'userSpaceOnUse\'\n }),\n children: [maskRect, maskOuterGroup]\n };\n var defs = {\n tag: \'defs\',\n children: [{\n tag: \'clipPath\',\n attributes: {\n id: clipId\n },\n children: deGroup(maskPath)\n }, maskTag]\n };\n children.push(defs, {\n tag: \'rect\',\n attributes: _objectSpread2({\n fill: \'currentColor\',\n \'clip-path\': "url(#".concat(clipId, ")"),\n mask: "url(#".concat(maskId, ")")\n }, ALL_SPACE)\n });\n return {\n children: children,\n attributes: attributes\n };\n };\n }\n};\n\nvar MissingIconIndicator = {\n provides: function provides(providers) {\n var reduceMotion = false;\n\n if (WINDOW.matchMedia) {\n reduceMotion = WINDOW.matchMedia(\'(prefers-reduced-motion: reduce)\').matches;\n }\n\n providers.missingIconAbstract = function () {\n var gChildren = [];\n var FILL = {\n fill: \'currentColor\'\n };\n var ANIMATION_BASE = {\n attributeType: \'XML\',\n repeatCount: \'indefinite\',\n dur: \'2s\'\n }; // Ring\n\n gChildren.push({\n tag: \'path\',\n attributes: _objectSpread2(_objectSpread2({}, FILL), {}, {\n d: \'M156.5,447.7l-12.6,29.5c-18.7-9.5-35.9-21.2-51.5-34.9l22.7-22.7C127.6,430.5,141.5,440,156.5,447.7z M40.6,272H8.5 c1.4,21.2,5.4,41.7,11.7,61.1L50,321.2C45.1,305.5,41.8,289,40.6,272z M40.6,240c1.4-18.8,5.2-37,11.1-54.1l-29.5-12.6 C14.7,194.3,10,216.7,8.5,240H40.6z M64.3,156.5c7.8-14.9,17.2-28.8,28.1-41.5L69.7,92.3c-13.7,15.6-25.5,32.8-34.9,51.5 L64.3,156.5z M397,419.6c-13.9,12-29.4,22.3-46.1,30.4l11.9,29.8c20.7-9.9,39.8-22.6,56.9-37.6L397,419.6z M115,92.4 c13.9-12,29.4-22.3,46.1-30.4l-11.9-29.8c-20.7,9.9-39.8,22.6-56.8,37.6L115,92.4z M447.7,355.5c-7.8,14.9-17.2,28.8-28.1,41.5 l22.7,22.7c13.7-15.6,25.5-32.9,34.9-51.5L447.7,355.5z M471.4,272c-1.4,18.8-5.2,37-11.1,54.1l29.5,12.6 c7.5-21.1,12.2-43.5,13.6-66.8H471.4z M321.2,462c-15.7,5-32.2,8.2-49.2,9.4v32.1c21.2-1.4,41.7-5.4,61.1-11.7L321.2,462z M240,471.4c-18.8-1.4-37-5.2-54.1-11.1l-12.6,29.5c21.1,7.5,43.5,12.2,66.8,13.6V471.4z M462,190.8c5,15.7,8.2,32.2,9.4,49.2h32.1 c-1.4-21.2-5.4-41.7-11.7-61.1L462,190.8z M92.4,397c-12-13.9-22.3-29.4-30.4-46.1l-29.8,11.9c9.9,20.7,22.6,39.8,37.6,56.9 L92.4,397z M272,40.6c18.8,1.4,36.9,5.2,54.1,11.1l12.6-29.5C317.7,14.7,295.3,10,272,8.5V40.6z M190.8,50 c15.7-5,32.2-8.2,49.2-9.4V8.5c-21.2,1.4-41.7,5.4-61.1,11.7L190.8,50z M442.3,92.3L419.6,115c12,13.9,22.3,29.4,30.5,46.1 l29.8-11.9C470,128.5,457.3,109.4,442.3,92.3z M397,92.4l22.7-22.7c-15.6-13.7-32.8-25.5-51.5-34.9l-12.6,29.5 C370.4,72.1,384.4,81.5,397,92.4z\'\n })\n });\n\n var OPACITY_ANIMATE = _objectSpread2(_objectSpread2({}, ANIMATION_BASE), {}, {\n attributeName: \'opacity\'\n });\n\n var dot = {\n tag: \'circle\',\n attributes: _objectSpread2(_objectSpread2({}, FILL), {}, {\n cx: \'256\',\n cy: \'364\',\n r: \'28\'\n }),\n children: []\n };\n\n if (!reduceMotion) {\n dot.children.push({\n tag: \'animate\',\n attributes: _objectSpread2(_objectSpread2({}, ANIMATION_BASE), {}, {\n attributeName: \'r\',\n values: \'28;14;28;28;14;28;\'\n })\n }, {\n tag: \'animate\',\n attributes: _objectSpread2(_objectSpread2({}, OPACITY_ANIMATE), {}, {\n values: \'1;0;1;1;0;1;\'\n })\n });\n }\n\n gChildren.push(dot);\n gChildren.push({\n tag: \'path\',\n attributes: _objectSpread2(_objectSpread2({}, FILL), {}, {\n opacity: \'1\',\n d: \'M263.7,312h-16c-6.6,0-12-5.4-12-12c0-71,77.4-63.9,77.4-107.8c0-20-17.8-40.2-57.4-40.2c-29.1,0-44.3,9.6-59.2,28.7 c-3.9,5-11.1,6-16.2,2.4l-13.1-9.2c-5.6-3.9-6.9-11.8-2.6-17.2c21.2-27.2,46.4-44.7,91.2-44.7c52.3,0,97.4,29.8,97.4,80.2 c0,67.6-77.4,63.5-77.4,107.8C275.7,306.6,270.3,312,263.7,312z\'\n }),\n children: reduceMotion ? [] : [{\n tag: \'animate\',\n attributes: _objectSpread2(_objectSpread2({}, OPACITY_ANIMATE), {}, {\n values: \'1;0;0;0;0;1;\'\n })\n }]\n });\n\n if (!reduceMotion) {\n // Exclamation\n gChildren.push({\n tag: \'path\',\n attributes: _objectSpread2(_objectSpread2({}, FILL), {}, {\n opacity: \'0\',\n d: \'M232.5,134.5l7,168c0.3,6.4,5.6,11.5,12,11.5h9c6.4,0,11.7-5.1,12-11.5l7-168c0.3-6.8-5.2-12.5-12-12.5h-23 C237.7,122,232.2,127.7,232.5,134.5z\'\n }),\n children: [{\n tag: \'animate\',\n attributes: _objectSpread2(_objectSpread2({}, OPACITY_ANIMATE), {}, {\n values: \'0;0;1;1;0;0;\'\n })\n }]\n });\n }\n\n return {\n tag: \'g\',\n attributes: {\n \'class\': \'missing\'\n },\n children: gChildren\n };\n };\n }\n};\n\nvar SvgSymbols = {\n hooks: function hooks() {\n return {\n parseNodeAttributes: function parseNodeAttributes(accumulator, node) {\n var symbolData = node.getAttribute(\'data-fa-symbol\');\n var symbol = symbolData === null ? false : symbolData === \'\' ? true : symbolData;\n accumulator[\'symbol\'] = symbol;\n return accumulator;\n }\n };\n }\n};\n\nvar fontawesome_svg_core_plugins = [InjectCSS, ReplaceElements, Layers, LayersCounter, LayersText, PseudoElements, MutationObserver$1, PowerTransforms, Masks, MissingIconIndicator, SvgSymbols];\n\nregisterPlugins(fontawesome_svg_core_plugins, {\n mixoutsTo: api\n});\nvar noAuto$1 = api.noAuto;\nvar config$1 = api.config;\nvar library$1 = api.library;\nvar dom$1 = api.dom;\nvar parse$1 = api.parse;\nvar findIconDefinition$1 = api.findIconDefinition;\nvar toHtml$1 = api.toHtml;\nvar icon = api.icon;\nvar fontawesome_svg_core_layer = api.layer;\nvar fontawesome_svg_core_text = api.text;\nvar counter = api.counter;\n\n\n\n;// CONCATENATED MODULE: ./node_modules/@fortawesome/react-fontawesome/index.es.js\n\n\n\n\nfunction index_es_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n enumerableOnly && (symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n })), keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction index_es_objectSpread2(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = null != arguments[i] ? arguments[i] : {};\n i % 2 ? index_es_ownKeys(Object(source), !0).forEach(function (key) {\n index_es_defineProperty(target, key, source[key]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : index_es_ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n\n return target;\n}\n\nfunction index_es_typeof(obj) {\n "@babel/helpers - typeof";\n\n return index_es_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) {\n return typeof obj;\n } : function (obj) {\n return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;\n }, index_es_typeof(obj);\n}\n\nfunction index_es_defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n\nfunction index_es_objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n\n return target;\n}\n\nfunction _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n\n var target = index_es_objectWithoutPropertiesLoose(source, excluded);\n\n var key, i;\n\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n\n return target;\n}\n\nfunction index_es_toConsumableArray(arr) {\n return index_es_arrayWithoutHoles(arr) || index_es_iterableToArray(arr) || index_es_unsupportedIterableToArray(arr) || index_es_nonIterableSpread();\n}\n\nfunction index_es_arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return index_es_arrayLikeToArray(arr);\n}\n\nfunction index_es_iterableToArray(iter) {\n if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);\n}\n\nfunction index_es_unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === "string") return index_es_arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === "Object" && o.constructor) n = o.constructor.name;\n if (n === "Map" || n === "Set") return Array.from(o);\n if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return index_es_arrayLikeToArray(o, minLen);\n}\n\nfunction index_es_arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n\n return arr2;\n}\n\nfunction index_es_nonIterableSpread() {\n throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");\n}\n\n// Get CSS class list from a props object\nfunction index_es_classList(props) {\n var _classes;\n\n var beat = props.beat,\n fade = props.fade,\n beatFade = props.beatFade,\n bounce = props.bounce,\n shake = props.shake,\n flash = props.flash,\n spin = props.spin,\n spinPulse = props.spinPulse,\n spinReverse = props.spinReverse,\n pulse = props.pulse,\n fixedWidth = props.fixedWidth,\n inverse = props.inverse,\n border = props.border,\n listItem = props.listItem,\n flip = props.flip,\n size = props.size,\n rotation = props.rotation,\n pull = props.pull; // map of CSS class names to properties\n\n var classes = (_classes = {\n \'fa-beat\': beat,\n \'fa-fade\': fade,\n \'fa-beat-fade\': beatFade,\n \'fa-bounce\': bounce,\n \'fa-shake\': shake,\n \'fa-flash\': flash,\n \'fa-spin\': spin,\n \'fa-spin-reverse\': spinReverse,\n \'fa-spin-pulse\': spinPulse,\n \'fa-pulse\': pulse,\n \'fa-fw\': fixedWidth,\n \'fa-inverse\': inverse,\n \'fa-border\': border,\n \'fa-li\': listItem,\n \'fa-flip\': flip === true,\n \'fa-flip-horizontal\': flip === \'horizontal\' || flip === \'both\',\n \'fa-flip-vertical\': flip === \'vertical\' || flip === \'both\'\n }, index_es_defineProperty(_classes, "fa-".concat(size), typeof size !== \'undefined\' && size !== null), index_es_defineProperty(_classes, "fa-rotate-".concat(rotation), typeof rotation !== \'undefined\' && rotation !== null && rotation !== 0), index_es_defineProperty(_classes, "fa-pull-".concat(pull), typeof pull !== \'undefined\' && pull !== null), index_es_defineProperty(_classes, \'fa-swap-opacity\', props.swapOpacity), _classes); // map over all the keys in the classes object\n // return an array of the keys where the value for the key is not null\n\n return Object.keys(classes).map(function (key) {\n return classes[key] ? key : null;\n }).filter(function (key) {\n return key;\n });\n}\n\n// Camelize taken from humps\n// humps is copyright © 2012+ Dom Christie\n// Released under the MIT license.\n// Performant way to determine if object coerces to a number\nfunction _isNumerical(obj) {\n obj = obj - 0; // eslint-disable-next-line no-self-compare\n\n return obj === obj;\n}\n\nfunction camelize(string) {\n if (_isNumerical(string)) {\n return string;\n } // eslint-disable-next-line no-useless-escape\n\n\n string = string.replace(/[\\-_\\s]+(.)?/g, function (match, chr) {\n return chr ? chr.toUpperCase() : \'\';\n }); // Ensure 1st char is always lowercase\n\n return string.substr(0, 1).toLowerCase() + string.substr(1);\n}\n\nvar index_es_excluded = ["style"];\n\nfunction capitalize(val) {\n return val.charAt(0).toUpperCase() + val.slice(1);\n}\n\nfunction styleToObject(style) {\n return style.split(\';\').map(function (s) {\n return s.trim();\n }).filter(function (s) {\n return s;\n }).reduce(function (acc, pair) {\n var i = pair.indexOf(\':\');\n var prop = camelize(pair.slice(0, i));\n var value = pair.slice(i + 1).trim();\n prop.startsWith(\'webkit\') ? acc[capitalize(prop)] = value : acc[prop] = value;\n return acc;\n }, {});\n}\n\nfunction convert(createElement, element) {\n var extraProps = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n if (typeof element === \'string\') {\n return element;\n }\n\n var children = (element.children || []).map(function (child) {\n return convert(createElement, child);\n });\n /* eslint-disable dot-notation */\n\n var mixins = Object.keys(element.attributes || {}).reduce(function (acc, key) {\n var val = element.attributes[key];\n\n switch (key) {\n case \'class\':\n acc.attrs[\'className\'] = val;\n delete element.attributes[\'class\'];\n break;\n\n case \'style\':\n acc.attrs[\'style\'] = styleToObject(val);\n break;\n\n default:\n if (key.indexOf(\'aria-\') === 0 || key.indexOf(\'data-\') === 0) {\n acc.attrs[key.toLowerCase()] = val;\n } else {\n acc.attrs[camelize(key)] = val;\n }\n\n }\n\n return acc;\n }, {\n attrs: {}\n });\n\n var _extraProps$style = extraProps.style,\n existingStyle = _extraProps$style === void 0 ? {} : _extraProps$style,\n remaining = _objectWithoutProperties(extraProps, index_es_excluded);\n\n mixins.attrs[\'style\'] = index_es_objectSpread2(index_es_objectSpread2({}, mixins.attrs[\'style\']), existingStyle);\n /* eslint-enable */\n\n return createElement.apply(void 0, [element.tag, index_es_objectSpread2(index_es_objectSpread2({}, mixins.attrs), remaining)].concat(index_es_toConsumableArray(children)));\n}\n\nvar index_es_PRODUCTION = false;\n\ntry {\n index_es_PRODUCTION = "production" === \'production\';\n} catch (e) {}\n\nfunction log () {\n if (!index_es_PRODUCTION && console && typeof console.error === \'function\') {\n var _console;\n\n (_console = console).error.apply(_console, arguments);\n }\n}\n\nfunction normalizeIconArgs(icon) {\n // this has everything that it needs to be rendered which means it was probably imported\n // directly from an icon svg package\n if (icon && index_es_typeof(icon) === \'object\' && icon.prefix && icon.iconName && icon.icon) {\n return icon;\n }\n\n if (parse$1.icon) {\n return parse$1.icon(icon);\n } // if the icon is null, there\'s nothing to do\n\n\n if (icon === null) {\n return null;\n } // if the icon is an object and has a prefix and an icon name, return it\n\n\n if (icon && index_es_typeof(icon) === \'object\' && icon.prefix && icon.iconName) {\n return icon;\n } // if it\'s an array with length of two\n\n\n if (Array.isArray(icon) && icon.length === 2) {\n // use the first item as prefix, second as icon name\n return {\n prefix: icon[0],\n iconName: icon[1]\n };\n } // if it\'s a string, use it as the icon name\n\n\n if (typeof icon === \'string\') {\n return {\n prefix: \'fas\',\n iconName: icon\n };\n }\n}\n\n// creates an object with a key of key\n// and a value of value\n// if certain conditions are met\nfunction objectWithKey(key, value) {\n // if the value is a non-empty array\n // or it\'s not an array but it is truthy\n // then create the object with the key and the value\n // if not, return an empty array\n return Array.isArray(value) && value.length > 0 || !Array.isArray(value) && value ? index_es_defineProperty({}, key, value) : {};\n}\n\nvar FontAwesomeIcon = /*#__PURE__*/react.forwardRef(function (props, ref) {\n var iconArgs = props.icon,\n maskArgs = props.mask,\n symbol = props.symbol,\n className = props.className,\n title = props.title,\n titleId = props.titleId,\n maskId = props.maskId;\n var iconLookup = normalizeIconArgs(iconArgs);\n var classes = objectWithKey(\'classes\', [].concat(index_es_toConsumableArray(index_es_classList(props)), index_es_toConsumableArray(className.split(\' \'))));\n var transform = objectWithKey(\'transform\', typeof props.transform === \'string\' ? parse$1.transform(props.transform) : props.transform);\n var mask = objectWithKey(\'mask\', normalizeIconArgs(maskArgs));\n var renderedIcon = icon(iconLookup, index_es_objectSpread2(index_es_objectSpread2(index_es_objectSpread2(index_es_objectSpread2({}, classes), transform), mask), {}, {\n symbol: symbol,\n title: title,\n titleId: titleId,\n maskId: maskId\n }));\n\n if (!renderedIcon) {\n log(\'Could not find icon\', iconLookup);\n return null;\n }\n\n var abstract = renderedIcon.abstract;\n var extraProps = {\n ref: ref\n };\n Object.keys(props).forEach(function (key) {\n // eslint-disable-next-line no-prototype-builtins\n if (!FontAwesomeIcon.defaultProps.hasOwnProperty(key)) {\n extraProps[key] = props[key];\n }\n });\n return convertCurry(abstract[0], extraProps);\n});\nFontAwesomeIcon.displayName = \'FontAwesomeIcon\';\nFontAwesomeIcon.propTypes = {\n beat: (prop_types_default()).bool,\n border: (prop_types_default()).bool,\n beatFade: (prop_types_default()).bool,\n bounce: (prop_types_default()).bool,\n className: (prop_types_default()).string,\n fade: (prop_types_default()).bool,\n flash: (prop_types_default()).bool,\n mask: prop_types_default().oneOfType([(prop_types_default()).object, (prop_types_default()).array, (prop_types_default()).string]),\n maskId: (prop_types_default()).string,\n fixedWidth: (prop_types_default()).bool,\n inverse: (prop_types_default()).bool,\n flip: prop_types_default().oneOf([true, false, \'horizontal\', \'vertical\', \'both\']),\n icon: prop_types_default().oneOfType([(prop_types_default()).object, (prop_types_default()).array, (prop_types_default()).string]),\n listItem: (prop_types_default()).bool,\n pull: prop_types_default().oneOf([\'right\', \'left\']),\n pulse: (prop_types_default()).bool,\n rotation: prop_types_default().oneOf([0, 90, 180, 270]),\n shake: (prop_types_default()).bool,\n size: prop_types_default().oneOf([\'2xs\', \'xs\', \'sm\', \'lg\', \'xl\', \'2xl\', \'1x\', \'2x\', \'3x\', \'4x\', \'5x\', \'6x\', \'7x\', \'8x\', \'9x\', \'10x\']),\n spin: (prop_types_default()).bool,\n spinPulse: (prop_types_default()).bool,\n spinReverse: (prop_types_default()).bool,\n symbol: prop_types_default().oneOfType([(prop_types_default()).bool, (prop_types_default()).string]),\n title: (prop_types_default()).string,\n titleId: (prop_types_default()).string,\n transform: prop_types_default().oneOfType([(prop_types_default()).string, (prop_types_default()).object]),\n swapOpacity: (prop_types_default()).bool\n};\nFontAwesomeIcon.defaultProps = {\n border: false,\n className: \'\',\n mask: null,\n maskId: null,\n fixedWidth: false,\n inverse: false,\n flip: false,\n icon: null,\n listItem: false,\n pull: null,\n pulse: false,\n rotation: null,\n size: null,\n spin: false,\n spinPulse: false,\n spinReverse: false,\n beat: false,\n fade: false,\n beatFade: false,\n bounce: false,\n shake: false,\n symbol: false,\n title: \'\',\n titleId: null,\n transform: null,\n swapOpacity: false\n};\nvar convertCurry = convert.bind(null, react.createElement);\n\n\n\n;// CONCATENATED MODULE: ./node_modules/react-bootstrap/esm/Row.js\n"use client";\n\n\n\n\n\nconst Row = /*#__PURE__*/react.forwardRef(({\n bsPrefix,\n className,\n // Need to define the default "as" during prop destructuring to be compatible with styled-components github.com/react-bootstrap/react-bootstrap/issues/3595\n as: Component = \'div\',\n ...props\n}, ref) => {\n const decoratedBsPrefix = useBootstrapPrefix(bsPrefix, \'row\');\n const breakpoints = useBootstrapBreakpoints();\n const minBreakpoint = useBootstrapMinBreakpoint();\n const sizePrefix = `${decoratedBsPrefix}-cols`;\n const classes = [];\n breakpoints.forEach(brkPoint => {\n const propValue = props[brkPoint];\n delete props[brkPoint];\n let cols;\n if (propValue != null && typeof propValue === \'object\') {\n ({\n cols\n } = propValue);\n } else {\n cols = propValue;\n }\n const infix = brkPoint !== minBreakpoint ? `-${brkPoint}` : \'\';\n if (cols != null) classes.push(`${sizePrefix}${infix}-${cols}`);\n });\n return /*#__PURE__*/(0,jsx_runtime.jsx)(Component, {\n ref: ref,\n ...props,\n className: classnames_default()(className, decoratedBsPrefix, ...classes)\n });\n});\nRow.displayName = \'Row\';\n/* harmony default export */ const esm_Row = (Row);\n;// CONCATENATED MODULE: ./node_modules/react-bootstrap/esm/Col.js\n"use client";\n\n\n\n\n\nfunction useCol({\n as,\n bsPrefix,\n className,\n ...props\n}) {\n bsPrefix = useBootstrapPrefix(bsPrefix, \'col\');\n const breakpoints = useBootstrapBreakpoints();\n const minBreakpoint = useBootstrapMinBreakpoint();\n const spans = [];\n const classes = [];\n breakpoints.forEach(brkPoint => {\n const propValue = props[brkPoint];\n delete props[brkPoint];\n let span;\n let offset;\n let order;\n if (typeof propValue === \'object\' && propValue != null) {\n ({\n span,\n offset,\n order\n } = propValue);\n } else {\n span = propValue;\n }\n const infix = brkPoint !== minBreakpoint ? `-${brkPoint}` : \'\';\n if (span) spans.push(span === true ? `${bsPrefix}${infix}` : `${bsPrefix}${infix}-${span}`);\n if (order != null) classes.push(`order${infix}-${order}`);\n if (offset != null) classes.push(`offset${infix}-${offset}`);\n });\n return [{\n ...props,\n className: classnames_default()(className, ...spans, ...classes)\n }, {\n as,\n bsPrefix,\n spans\n }];\n}\nconst Col = /*#__PURE__*/react.forwardRef(\n// Need to define the default "as" during prop destructuring to be compatible with styled-components github.com/react-bootstrap/react-bootstrap/issues/3595\n(props, ref) => {\n const [{\n className,\n ...colProps\n }, {\n as: Component = \'div\',\n bsPrefix,\n spans\n }] = useCol(props);\n return /*#__PURE__*/(0,jsx_runtime.jsx)(Component, {\n ...colProps,\n ref: ref,\n className: classnames_default()(className, !spans.length && bsPrefix)\n });\n});\nCol.displayName = \'Col\';\n/* harmony default export */ const esm_Col = (Col);\n;// CONCATENATED MODULE: ./src/app/pages/aurora-borealis-sky.jpg\nconst aurora_borealis_sky_namespaceObject = __webpack_require__.p + "assets/039c0f6d9ddd5a0ce38f.jpg";\n;// CONCATENATED MODULE: ./src/app/pages/login.js\nfunction login_slicedToArray(arr, i) { return login_arrayWithHoles(arr) || login_iterableToArrayLimit(arr, i) || login_unsupportedIterableToArray(arr, i) || login_nonIterableRest(); }\nfunction login_nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }\nfunction login_unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return login_arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return login_arrayLikeToArray(o, minLen); }\nfunction login_arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }\nfunction login_iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction login_arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\n\n\n\nfunction Login() {\n var _useState = (0,react.useState)(""),\n _useState2 = login_slicedToArray(_useState, 2),\n username = _useState2[0],\n setUsername = _useState2[1];\n var _useState3 = (0,react.useState)(""),\n _useState4 = login_slicedToArray(_useState3, 2),\n password = _useState4[0],\n setPassword = _useState4[1];\n var _useState5 = (0,react.useState)(false),\n _useState6 = login_slicedToArray(_useState5, 2),\n isLoading = _useState6[0],\n setIsLoading = _useState6[1];\n var login = function login() {};\n var onKeyDown = function onKeyDown(event) {\n if (event.key === "Enter") {\n event.preventDefault();\n login();\n }\n };\n return /*#__PURE__*/react.createElement(esm_Row, null, /*#__PURE__*/react.createElement(esm_Col, {\n md: 4,\n lg: 6,\n xl: 8,\n className: "d-none d-md-block video-container"\n }, /*#__PURE__*/react.createElement("video", {\n autoPlay: true,\n muted: true,\n loop: true\n }, /*#__PURE__*/react.createElement("source", {\n src: "/assets/cover.mp4",\n type: "video/mp4"\n }))), /*#__PURE__*/react.createElement(esm_Col, {\n md: 8,\n lg: 6,\n xl: 4\n }, /*#__PURE__*/react.createElement("div", {\n className: "form-left px-5"\n }, /*#__PURE__*/react.createElement("div", {\n className: "row g-4",\n style: {\n marginTop: "50px"\n }\n }, /*#__PURE__*/react.createElement("img", {\n src: aurora_borealis_sky_namespaceObject,\n style: {\n height: "50px",\n width: "auto"\n }\n }), " ", /*#__PURE__*/react.createElement("h3", null, "Polaris")), /*#__PURE__*/react.createElement("div", {\n className: "row g-4 mt-2",\n style: {\n borderLeft: "4px solid #3f51b5"\n }\n }, /*#__PURE__*/react.createElement("h4", {\n className: ""\n }, "Bitte melden Sie sich an."), /*#__PURE__*/react.createElement("div", {\n className: "col-12"\n }, /*#__PURE__*/react.createElement("label", null, "Nutzername", /*#__PURE__*/react.createElement("span", {\n className: "text-danger"\n }, "*")), /*#__PURE__*/react.createElement("div", {\n className: "input-group"\n }, /*#__PURE__*/react.createElement("div", {\n className: "input-group-text"\n }, /*#__PURE__*/react.createElement(FontAwesomeIcon, {\n icon: "user"\n })), /*#__PURE__*/react.createElement("input", {\n onKeyDown: onKeyDown,\n onChange: function onChange(e) {\n return setUsername(e.target.value);\n },\n value: username,\n type: "text",\n className: "form-control",\n placeholder: "E-Mail Adresse"\n }))), /*#__PURE__*/react.createElement("div", {\n className: "col-12"\n }, /*#__PURE__*/react.createElement("label", null, "Passwort", /*#__PURE__*/react.createElement("span", {\n className: "text-danger"\n }, "*")), /*#__PURE__*/react.createElement("div", {\n className: "input-group"\n }, /*#__PURE__*/react.createElement("div", {\n className: "input-group-text"\n }, /*#__PURE__*/react.createElement(FontAwesomeIcon, {\n icon: "key"\n })), /*#__PURE__*/react.createElement("input", {\n onKeyDown: onKeyDown,\n onChange: function onChange(e) {\n return setPassword(e.target.value);\n },\n value: password,\n type: "password",\n className: "form-control",\n placeholder: "Bitte geben Sie Ihr Passwort ein"\n }))), /*#__PURE__*/react.createElement("div", {\n className: "col-sm-6",\n style: {\n marginTop: "0px"\n }\n }, /*#__PURE__*/react.createElement("a", {\n style: {\n cursor: "pointer"\n },\n onClick: function onClick() {\n return setPasswordModalOpen(true);\n },\n className: "text-primary"\n }, "Passwort vergessen?")), /*#__PURE__*/react.createElement("div", {\n className: "col-sm-6"\n }, /*#__PURE__*/react.createElement(react_bootstrap_esm_Button, {\n onClick: function onClick() {\n return login();\n },\n className: "btn btn-primary px-4 float-end"\n }, /*#__PURE__*/react.createElement(FontAwesomeIcon, {\n icon: "sign-in"\n }), " Anmelden "))), /*#__PURE__*/react.createElement("div", {\n className: "text-center text-muted"\n }, "Impressum \\u2022 Datenschutz"))));\n}\n;// CONCATENATED MODULE: ./src/index.js\n\n\n\n\n\n\n\n\n\n// Clear the existing HTML content\ndocument.body.innerHTML = \'<div id="app"></div>\';\nvar router = createBrowserRouter([{\n path: "/",\n element: /*#__PURE__*/react.createElement(Layout, null),\n errorElement: /*#__PURE__*/react.createElement(ErrorPage, null),\n children: [{\n path: "dashboard/:dashboardId",\n element: /*#__PURE__*/react.createElement(Dashboard, null)\n }]\n}, {\n path: "/login",\n element: /*#__PURE__*/react.createElement(Login, null),\n errorElement: /*#__PURE__*/react.createElement(ErrorPage, null)\n}]);\n\n// Render your React component instead\nvar src_root = (0,client/* createRoot */.s)(document.getElementById(\'app\'));\nsrc_root.render( /*#__PURE__*/react.createElement(react.StrictMode, null, /*#__PURE__*/react.createElement(dist_RouterProvider, {\n router: router\n})));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUssSUFBSTtBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksZ0JBQVM7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLLElBQUk7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixjQUFRLEdBQUc7QUFDdkM7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLG1CQUFZO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sbUJBQVk7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxtQkFBWTtBQUNyQjtBQUNBO0FBQ0E7QUFDQSxFQUFFLGdCQUFTO0FBQ1g7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLGNBQVE7QUFDdkI7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5RUFBeUU7QUFDekU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0EscUNBQXFDLG1CQUFZO0FBQ2pEO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLGNBQVEsR0FBRztB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UUFBUSxJQUFJO0FBQ1o7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxrQkFBa0IsY0FBUTtBQUMxQjtBQUNBLE9BQU87QUFDUDtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVEsSUFBSTtBQUNaO0FBQ0EsUUFBUSxJQUFJO0FBQ1o7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxXQUFXLGNBQVE7QUFDbkI7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLE1BQU0sSUFBSTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxnQkFBUztBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sZ0JBQVM7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QSxJQUFJLGdCQUFTO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLGdCQUFTO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRSxnQkFBUztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsaUJBQVU7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUMsY0FBUTtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsOERBQThELGNBQVE7QUFDdEU7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsZ0JBQVM7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLGNBQVEsR0FBRztBQUMxQztBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsTUFBTTtBQUNOO0FBQ0E7QUFDQSxJQUFJLGdCQUFTO0FBQ2IsSUFBSTtBQUNKO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxnQkFBUztBQUNmO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLG9CQUFhO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxnQkFBUztBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLHNCQUFzQixxQ0FBcUM7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ04sSUFBSSxnQkFBUztBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLGlCQUFpQixjQUFRLEdBQUc7QUFDNUI7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTSxnQkFBUztBQUNmLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTSxnQkFBUztBQUNmLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QixjQUFRLEdBQUc7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLHlCQUF5QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLFFBQVE7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsaUJBQVUsQ0FBQyxjQUFRLEdBQUc7QUFDL0I7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0Isd0JBQXdCO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sZ0JBQVM7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QjtBQUNBO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7O0FDVDJDOztBQUVwQzs7QUFFQTtBQUNBOztBQUVQO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QixJQUFJO0FBQzdCLHdDQUF3QyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUk7QUFDMUQsd0NBQXdDLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSTtBQUMxRCwwQ0FBMEMsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSTtBQUNuRSwwQ0FBMEMsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSTtBQUNuRSx3Q0FBd0MsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJO0FBQzFELDBDQUEwQyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJOztBQUVuRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDLFNBQVMsY0FBYyxTQUFTO0FBQ3hFLGlCQUFpQixNQUFNO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBLHdDQUF3QyxVQUFVLGNBQWMsVUFBVTtBQUMxRSxpQkFBaUIsT0FBTztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0M7QUFDaEM7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLGdDQUFnQztBQUNoQztBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsZ0NBQWdDO0FBQ2hDO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxnQ0FBZ0M7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsWUFBWSw0QkFBNEI7QUFDeEM7QUFDQTtBQUNBLGtDQUFrQzs7QUFFbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsaUJBQWlCLE9BQU8sT0FBTyxRQUFRO0FBQ3ZDOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxhQUFhLFVBQVUsT0FBTyxRQUFRO0FBQ3RDOztBQUVBO0FBQ0E7QUFDQSxtQ0FBbUMsWUFBWSxNQUFNLFlBQVk7QUFDakU7O0FBRUE7QUFDQTtBQUNBLGFBQWEsWUFBWSxPQUFPLFFBQVEsV0FBVyxRQUFRO0FBQzNEOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGFBQWEsVUFBVSxPQUFPLFFBQVE7QUFDdEM7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZ0NBQWdDLFlBQVksTUFBTSxZQUFZO0FBQzlEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FB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Q0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx1Q0FBdUMsZ0RBQWdEO0FBQ3ZGLG9EQUFvRCw4Q0FBOEM7QUFDbEc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQztBQUNoQyxtQkFBbUIsNEJBQTRCO0FBQy9DO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxPQUFPO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLGlCQUFPO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLGFBQUc7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLGFBQUc7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSixRQUFRLGlCQUFPO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLGFBQUc7QUFDWixNQUFNLGlCQUFPO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLFNBQVM7QUFDM0MsYUFBYSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUU7QUFDNUI7O0FBRUEsTUFBTSxhQUFHO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsVUFBVTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQyxVQUFVO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQyxPQUFPO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLG1CQUFHO0FBQ1o7QUFDQSxlQUFlLHFCQUFLO0FBQ3BCO0FBQ0EsV0FBVyxxQkFBSztBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLG1CQUFHO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLG1CQUFHO0FBQ2xCO0FBQ0E7QUFDQSxlQUFlLG1CQUFHO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQ0FBK0M7QUFDL0M7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxVQUFVO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSw0Q0FBNEMsVUFBVTtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLFdBQVc7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0RBQXdEO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLGtCQUFrQjtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLDBCQUEwQjtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyxVQUFVO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLGFBQWE7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQyxpQ0FBaUM7QUFDakMsb0NBQW9DO0FBQ3BDO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrREFBa0Q7QUFDbEQsaUNBQWlDO0FBQ2pDO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQyxnQ0FBZ0M7QUFDaEM7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2QsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQyxpQ0FBaUM7QUFDakM7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsWUFBWSxrR0FBa0c7QUFDOUc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksNkRBQTZEO0FBQ3pFLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSwwQ0FBMEM7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLDZEQUE2RDtBQUN6RTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLFVBQVU7QUFDdEIsWUFBWSxZQUFZO0FBQ3hCO0FBQ0E7QUFDQSw2QkFBNkIsVUFBVTtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsbUJBQW1CO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QSxpQ0FBaUMsYUFBYTtBQUM5QyxnQ0FBZ0MsWUFBWTtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLHFDQUFxQztBQUNqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvREFBb0QsT0FBTztBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFlBQVk7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyxRQUFRO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0MsV0FBVztBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2RUFBNkU7QUFDN0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DLFVBQVU7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsU0FBUztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtREFBbUQsVUFBVTtBQUM3RDtBQUNBO0FBQ0EsNEJBQTRCLFlBQVk7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxPQUFPO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLFVBQVU7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEMsVUFBVTtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxhQUFhO0FBQ3JCO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUFDQTtBQUNBO0FBQ0EsZUFBZSwyQkFBMkI7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUVBQWlFLEVBQUU7QUFDbkU7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLFdBQVc7QUFDOUI7QUFDQTtBQUNBLHVCQUF1QixtQkFBbUI7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxxREFBcUQsU0FBUztBQUM5RDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLDJCQUEyQjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsbUJBQW1C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YztBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsNkJBQTZCO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNB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SSxFQUFFLEVBQUU7SUFDUkMsSUFBSSxFQUFFO0VBQ1YsQ0FBQztFQUNEaFQsSUFBSSxFQUNBLENBQ0k7SUFBQ3VKLE9BQU8sRUFBRSxDQUFDO0lBQUVZLE9BQU8sRUFBRSxFQUFFO0lBQUUrSSxTQUFTLEVBQUU7RUFBSyxDQUFDLEVBQzNDO0lBQUMzSixPQUFPLEVBQUUsQ0FBQztJQUFFWSxPQUFPLEVBQUUsRUFBRTtJQUFFK0ksU0FBUyxFQUFFO0VBQUssQ0FBQyxFQUMzQztJQUFDM0osT0FBTyxFQUFFLENBQUM7SUFBRVksT0FBTyxFQUFFLEVBQUU7SUFBRStJLFNBQVMsRUFBRTtFQUFLLENBQUMsRUFDM0M7SUFBQzNKLE9BQU8sRUFBRSxDQUFDO0lBQUVZLE9BQU8sRUFBRSxFQUFFO0lBQUUrSSxTQUFTLEVBQUU7RUFBSyxDQUFDLEVBQzNDO0lBQUMzSixPQUFPLEVBQUUsQ0FBQztJQUFFWSxPQUFPLEVBQUUsRUFBRTtJQUFFK0ksU0FBUyxFQUFFO0VBQUssQ0FBQyxFQUMzQztJQUFDM0osT0FBTyxFQUFFLENBQUM7SUFBRVksT0FBTyxFQUFFLEVBQUU7SUFBRStJLFNBQVMsRUFBRTtFQUFLLENBQUMsRUFDM0M7SUFBQzNKLE9BQU8sRUFBRSxDQUFDO0lBQUVZLE9BQU8sRUFBRSxFQUFFO0lBQUUrSSxTQUFTLEVBQUU7RUFBSyxDQUFDLEVBQzNDO0lBQUMzSixPQUFPLEVBQUUsQ0FBQztJQUFFWSxPQUFPLEVBQUUsRUFBRTtJQUFFK0ksU0FBUyxFQUFFO0VBQUssQ0FBQyxFQUMzQztJQUFDM0osT0FBTyxFQUFFLENBQUM7SUFBRVksT0FBTyxFQUFFLEVBQUU7SUFBRStJLFNBQVMsRUFBRTtFQUFLLENBQUMsRUFDM0M7SUFBQzNKLE9BQU8sRUFBRSxFQUFFO0lBQUVZLE9BQU8sRUFBRSxFQUFFO0lBQUUrSSxTQUFTLEVBQUU7RUFBSyxDQUFDLEVBQzVDO0lBQUMzSixPQUFPLEVBQUUsQ0FBQztJQUFFWSxPQUFPLEVBQUUsRUFBRTtJQUFFK0ksU0FBUyxFQUFFO0VBQUssQ0FBQyxFQUMzQztJQUFDM0osT0FBTyxFQUFFLENBQUM7SUFBRVksT0FBTyxFQUFFLEVBQUU7SUFBRStJLFNBQVMsRUFBRTtFQUFLLENBQUMsRUFDM0M7SUFBQzNKLE9BQU8sRUFBRSxDQUFDO0lBQUVZLE9BQU8sRUFBRSxFQUFFO0lBQUUrSSxTQUFTLEVBQUU7RUFBSyxDQUFDLEVBQzNDO0lBQUMzSixPQUFPLEVBQUUsQ0FBQztJQUFFWSxPQUFPLEVBQUUsRUFBRTtJQUFFK0ksU0FBUyxFQUFFO0VBQUssQ0FBQyxFQUMzQztJQUFDM0osT0FBTyxFQUFFLENBQUM7SUFBRVksT0FBTyxFQUFFLENBQUM7SUFBRStJLFNBQVMsRUFBRTtFQUFLLENBQUMsRUFDMUM7SUFBQzNKLE9BQU8sRUFBRSxDQUFDO0lBQUVZLE9BQU8sRUFBRSxFQUFFO0lBQUUrSSxTQUFTLEVBQUU7RUFBSyxDQUFDO0FBRXZELENBQUMsRUFDRDtFQUNJcGEsSUFBSSxFQUFFLGNBQWM7RUFDcEIxQyxJQUFJLEVBQUUsU0FBUztFQUNmNlAsT0FBTyxFQUFFO0lBQ0x1QyxVQUFVLEVBQUUsS0FBSztJQUNqQnlLLFFBQVEsRUFBRSxLQUFLO0lBQ2ZGLElBQUksRUFBRSxFQUFFO0lBQ1JDLElBQUksRUFBRTtFQUNWLENBQUM7RUFDRGhULElBQUksRUFDQSxDQUNJO0lBQUN1SixPQUFPLEVBQUUsQ0FBQztJQUFFWSxPQUFPLEVBQUUsRUFBRTtJQUFFK0ksU0FBUyxFQUFFO0VBQUssQ0FBQyxFQUMzQztJQUFDM0osT0FBTyxFQUFFLENBQUM7SUFBRVksT0FBTyxFQUFFLEVBQUU7SUFBRStJLFNBQVMsRUFBRTtFQUFLLENBQUMsRUFDM0M7SUFBQzNKLE9BQU8sRUFBRSxDQUFDO0lBQUVZLE9BQU8sRUFBRSxFQUFFO0lBQUUrSSxTQUFTLEVBQUU7RUFBSyxDQUFDLEVBQzNDO0lBQUMzSixPQUFPLEVBQUUsQ0FBQztJQUFFWSxPQUFPLEVBQUUsRUFBRTtJQUFFK0ksU0FBUyxFQUFFO0VBQUssQ0FBQyxFQUMzQztJQUFDM0osT0FBTyxFQUFFLENBQUM7SUFBRVksT0FBTyxFQUFFLEVBQUU7SUFBRStJLFNBQVMsRUFBRTtFQUFLLENBQUMsRUFDM0M7SUFBQzNKLE9BQU8sRUFBRSxDQUFDO0lBQUVZLE9BQU8sRUFBRSxFQUFFO0lBQUUrSSxTQUFTLEVBQUU7RUFBSyxDQUFDLEVBQzNDO0lBQUMzSixPQUFPLEVBQUUsQ0FBQztJQUFFWSxPQUFPLEVBQUUsRUFBRTtJQUFFK0ksU0FBUyxFQUFFO0VBQUssQ0FBQyxFQUMzQztJQUFDM0osT0FBTyxFQUFFLENBQUM7SUFBRVksT0FBTyxFQUFFLEVBQUU7SUFBRStJLFNBQVMsRUFBRTtFQUFLLENBQUMsRUFDM0M7SUFBQzNKLE9BQU8sRUFBRSxDQUFDO0lBQUVZLE9BQU8sRUFBRSxFQUFFO0lBQUUrSSxTQUFTLEVBQUU7RUFBSSxDQUFDLEVBQzFDO0lBQUMzSixPQUFPLEVBQUUsRUFBRTtJQUFFWSxPQUFPLEVBQUUsRUFBRTtJQUFFK0ksU0FBUyxFQUFFO0VBQUssQ0FBQyxFQUM1QztJQUFDM0osT0FBTyxFQUFFLENBQUM7SUFBRVksT0FBTyxFQUFFLEVBQUU7SUFBRStJLFNBQVMsRUFBRTtFQUFLLENBQUMsRUFDM0M7SUFBQzNKLE9BQU8sRUFBRSxDQUFDO0lBQUVZLE9BQU8sRUFBRSxFQUFFO0lBQUUrSSxTQUFTLEVBQUU7RUFBSyxDQUFDLEVBQzNDO0lBQUMzSixPQUFPLEVBQUUsQ0FBQztJQUFFWSxPQUFPLEVBQUUsRUFBRTtJQUFFK0ksU0FBUyxFQUFFO0VBQUssQ0FBQyxFQUMzQztJQUFDM0osT0FBTyxFQUFFLENBQUM7SUFBRVksT0FBTyxFQUFFLEVBQUU7SUFBRStJLFNBQVMsRUFBRTtFQUFLLENBQUMsRUFDM0M7SUFBQzNKLE9BQU8sRUFBRSxDQUFDO0lBQUVZLE9BQU8sRUFBRSxFQUFFO0lBQUUrSSxTQUFTLEVBQUU7RUFBSyxDQUFDLEVBQzNDO0lBQUMzSixPQUFPLEVBQUUsQ0FBQztJQUFFWSxPQUFPLEVBQUUsRUFBRTtJQUFFK0ksU0FBUyxFQUFFO0VBQUssQ0FBQyxFQUMzQztJQUFDM0osT0FBTyxFQUFFLENBQUM7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O0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDO0FBQ3JDO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0Esd0RBQXdEO0FBQ3hELFdBQVc7QUFDWCxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FB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QixtQkFBQSxDQUFDc0IsU0FBUyxNQUFFLENBQUM7RUFDM0JzUSxRQUFRLEVBQUUsQ0FDTjtJQUNFMkYsSUFBSSxFQUFFLHdCQUF3QjtJQUM5Qm1HLE9BQU8sZUFBRTFkLG1CQUFBLENBQUM4aEIsU0FBUyxNQUFFO0VBQ3ZCLENBQUM7QUFFVCxDQUFDLEVBQ0Q7RUFDSXZLLElBQUksRUFBRSxRQUFRO0VBQ2RtRyxPQUFPLGVBQUUxZCxtQkFBQSxDQUFDOGlCLEtBQUssTUFBRSxDQUFDO0VBQ2xCa0MsWUFBWSxlQUFFaGxCLG1CQUFBLENBQUNzQixTQUFTLE1BQUU7QUFDOUIsQ0FBQyxDQUNGLENBQUM7O0FBRUo7QUFDQSxJQUFNMmpCLFFBQUksR0FBR04sNEJBQVUsQ0FBQ3RXLFFBQVEsQ0FBQ0MsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3ZEMlcsUUFBSSxDQUFDQyxNQUFNLGVBQ1RsbEIsbUJBQUEsQ0FBQ0EsZ0JBQWdCLHFCQUNmQSxtQkFBQSxDQUFDNmtCLG1CQUFjO0VBQUNFLE1BQU0sRUFBRUE7QUFBTyxDQUFFLENBQ2pCLENBQ3BCLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvQHJlbWl4LXJ1bi9yb3V0ZXIvZGlzdC9yb3V0ZXIuanM/ODY0ZCIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvcmVhY3Qtcm91dGVyL2Rpc3QvaW5kZXguanM/NTc4YyIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvcmVhY3Qtcm91dGVyLWRvbS9kaXN0L2luZGV4LmpzPzQ4ZTgiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vc3JjL2luZGV4LnNjc3M/NzIyMyIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvQHJlc3RhcnQvdWkvZXNtL1NlbGVjdGFibGVDb250ZXh0LmpzP2FjMjEiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHMuanM/NjFlNCIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZS5qcz9kNjI0Iiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uL25vZGVfbW9kdWxlcy91bmNvbnRyb2xsYWJsZS9saWIvZXNtL3V0aWxzLmpzP2Y1NDUiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL3VuY29udHJvbGxhYmxlL2xpYi9lc20vaG9vay5qcz9iMWVlIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uL25vZGVfbW9kdWxlcy9yZWFjdC1saWZlY3ljbGVzLWNvbXBhdC9yZWFjdC1saWZlY3ljbGVzLWNvbXBhdC5lcy5qcz81NDIyIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uL25vZGVfbW9kdWxlcy91bmNvbnRyb2xsYWJsZS9saWIvZXNtL3VuY29udHJvbGxhYmxlLmpzPzU0NTkiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL3VuY29udHJvbGxhYmxlL2xpYi9lc20vaW5kZXguanM/Y2JjMCIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9UaGVtZVByb3ZpZGVyLmpzP2JkNDciLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vTmF2YmFyQnJhbmQuanM/MWY5MyIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvZG9tLWhlbHBlcnMvZXNtL293bmVyRG9jdW1lbnQuanM/NzU5YiIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvZG9tLWhlbHBlcnMvZXNtL293bmVyV2luZG93LmpzPzI5Y2EiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL2RvbS1oZWxwZXJzL2VzbS9nZXRDb21wdXRlZFN0eWxlLmpzP2NjMzQiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL2RvbS1oZWxwZXJzL2VzbS9oeXBoZW5hdGUuanM/MWMyMCIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvZG9tLWhlbHBlcnMvZXNtL2h5cGhlbmF0ZVN0eWxlLmpzPzQxM2EiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL2RvbS1oZWxwZXJzL2VzbS9pc1RyYW5zZm9ybS5qcz83NDU5Iiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uL25vZGVfbW9kdWxlcy9kb20taGVscGVycy9lc20vY3NzLmpzP2VlM2UiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NldFByb3RvdHlwZU9mLmpzPzZkYzUiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzTG9vc2UuanM/Yjc5ZSIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvcmVhY3QtdHJhbnNpdGlvbi1ncm91cC9lc20vY29uZmlnLmpzPzJhNDIiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXRyYW5zaXRpb24tZ3JvdXAvZXNtL1RyYW5zaXRpb25Hcm91cENvbnRleHQuanM/ZDBmNCIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvcmVhY3QtdHJhbnNpdGlvbi1ncm91cC9lc20vdXRpbHMvcmVmbG93LmpzP2I1N2YiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXRyYW5zaXRpb24tZ3JvdXAvZXNtL1RyYW5zaXRpb24uanM/NzUxYiIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvZG9tLWhlbHBlcnMvZXNtL2NhblVzZURPTS5qcz80ODljIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uL25vZGVfbW9kdWxlcy9kb20taGVscGVycy9lc20vYWRkRXZlbnRMaXN0ZW5lci5qcz9kOWY1Iiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uL25vZGVfbW9kdWxlcy9kb20taGVscGVycy9lc20vcmVtb3ZlRXZlbnRMaXN0ZW5lci5qcz80M2JjIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uL25vZGVfbW9kdWxlcy9kb20taGVscGVycy9lc20vbGlzdGVuLmpzPzE4NGIiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL2RvbS1oZWxwZXJzL2VzbS90cmlnZ2VyRXZlbnQuanM/MWNkMyIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvZG9tLWhlbHBlcnMvZXNtL3RyYW5zaXRpb25FbmQuanM/NjA0MCIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS90cmFuc2l0aW9uRW5kTGlzdGVuZXIuanM/YzJjNSIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9jcmVhdGVDaGFpbmVkRnVuY3Rpb24uanM/NDIwZiIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS90cmlnZ2VyQnJvd3NlclJlZmxvdy5qcz9jZmVhIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uL25vZGVfbW9kdWxlcy9AcmVzdGFydC9ob29rcy9lc20vdXNlTWVyZ2VkUmVmcy5qcz85NWM1Iiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL3NhZmVGaW5kRE9NTm9kZS5qcz9hOTBjIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL1RyYW5zaXRpb25XcmFwcGVyLmpzPzAxMmEiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vQ29sbGFwc2UuanM/YmQ4MiIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9OYXZiYXJDb250ZXh0LmpzP2E5NGEiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vTmF2YmFyQ29sbGFwc2UuanM/M2IxNiIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvQHJlc3RhcnQvaG9va3MvZXNtL3VzZUNvbW1pdHRlZFJlZi5qcz81ZjJiIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uL25vZGVfbW9kdWxlcy9AcmVzdGFydC9ob29rcy9lc20vdXNlRXZlbnRDYWxsYmFjay5qcz82NDI4Iiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL05hdmJhclRvZ2dsZS5qcz8wMzdkIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uL25vZGVfbW9kdWxlcy9AcmVzdGFydC9ob29rcy9lc20vdXNlSXNvbW9ycGhpY0VmZmVjdC5qcz83MWM0Iiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uL25vZGVfbW9kdWxlcy9AcmVzdGFydC9ob29rcy9lc20vdXNlTWVkaWFRdWVyeS5qcz83NTZiIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uL25vZGVfbW9kdWxlcy9AcmVzdGFydC9ob29rcy9lc20vdXNlQnJlYWtwb2ludC5qcz8yNGU2Iiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uL25vZGVfbW9kdWxlcy9kb20taGVscGVycy9lc20vYWN0aXZlRWxlbWVudC5qcz80OGVhIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uL25vZGVfbW9kdWxlcy9kb20taGVscGVycy9lc20vY29udGFpbnMuanM/NDYzOCIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvQHJlc3RhcnQvaG9va3MvZXNtL3VzZU1vdW50ZWQuanM/NWRjMSIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvQHJlc3RhcnQvaG9va3MvZXNtL3VzZVVwZGF0ZWRSZWYuanM/MTEzYyIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvQHJlc3RhcnQvaG9va3MvZXNtL3VzZVdpbGxVbm1vdW50LmpzPzhiOWQiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L2hvb2tzL2VzbS91c2VQcmV2aW91cy5qcz9hYWZjIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uL25vZGVfbW9kdWxlcy9AcmVzdGFydC91aS9lc20vRGF0YUtleS5qcz83NTZkIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uL25vZGVfbW9kdWxlcy9AcmVzdGFydC91aS9lc20vZ2V0U2Nyb2xsYmFyV2lkdGguanM/Y2M3YyIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvQHJlc3RhcnQvdWkvZXNtL01vZGFsTWFuYWdlci5qcz9lMWE1Iiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uL25vZGVfbW9kdWxlcy9AcmVzdGFydC91aS9lc20vdXNlV2luZG93LmpzPzg2ZmYiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L3VpL2VzbS91c2VXYWl0Rm9yRE9NUmVmLmpzP2E5NzAiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L3VpL2VzbS9Ob29wVHJhbnNpdGlvbi5qcz80NmFlIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uL25vZGVfbW9kdWxlcy9AcmVzdGFydC91aS9lc20vSW1wZXJhdGl2ZVRyYW5zaXRpb24uanM/YmIwNSIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvQHJlc3RhcnQvdWkvZXNtL3V0aWxzLmpzPzgzOGQiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L3VpL2VzbS9Nb2RhbC5qcz81MDMzIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL0ZhZGUuanM/ZWYxMSIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9PZmZjYW52YXNCb2R5LmpzPzM4NjAiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vT2ZmY2FudmFzVG9nZ2xpbmcuanM/MjFmYyIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9Nb2RhbENvbnRleHQuanM/ZWUyOCIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9DbG9zZUJ1dHRvbi5qcz81ZDAwIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL0Fic3RyYWN0TW9kYWxIZWFkZXIuanM/ZTdhMSIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9PZmZjYW52YXNIZWFkZXIuanM/MzJmYyIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9kaXZXaXRoQ2xhc3NOYW1lLmpzPzUzNTMiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vT2ZmY2FudmFzVGl0bGUuanM/YTM3NCIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvZG9tLWhlbHBlcnMvZXNtL2hhc0NsYXNzLmpzPzI5NzUiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL2RvbS1oZWxwZXJzL2VzbS9hZGRDbGFzcy5qcz83NjkzIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uL25vZGVfbW9kdWxlcy9kb20taGVscGVycy9lc20vcXVlcnlTZWxlY3RvckFsbC5qcz82NWVhIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uL25vZGVfbW9kdWxlcy9kb20taGVscGVycy9lc20vcmVtb3ZlQ2xhc3MuanM/ZDVhOSIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9Cb290c3RyYXBNb2RhbE1hbmFnZXIuanM/NmFlNSIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9PZmZjYW52YXMuanM/YjViNSIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9OYXZiYXJPZmZjYW52YXMuanM/MGNlNyIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9OYXZiYXJUZXh0LmpzPzhiMzAiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vTmF2YmFyLmpzP2U5Y2IiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vQ29udGFpbmVyLmpzP2VlZmEiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L2hvb2tzL2VzbS91c2VGb3JjZVVwZGF0ZS5qcz82MDYyIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uL25vZGVfbW9kdWxlcy9AcmVzdGFydC91aS9lc20vTmF2Q29udGV4dC5qcz8zNTk2Iiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uL25vZGVfbW9kdWxlcy9AcmVzdGFydC91aS9lc20vVGFiQ29udGV4dC5qcz9mNTc5Iiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uL25vZGVfbW9kdWxlcy9AcmVzdGFydC91aS9lc20vQnV0dG9uLmpzP2I4ZGUiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L3VpL2VzbS9OYXZJdGVtLmpzPzVhOWUiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L3VpL2VzbS9OYXYuanM/ZDllMSIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9DYXJkSGVhZGVyQ29udGV4dC5qcz84NjE5Iiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL05hdkl0ZW0uanM/MzIzZSIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvQHJlc3RhcnQvaG9va3MvZXNtL3VzZUNhbGxiYWNrUmVmLmpzP2VjMGUiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L2hvb2tzL2VzbS91c2VFdmVudExpc3RlbmVyLmpzPzJlNmYiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L2hvb2tzL2VzbS91c2VHbG9iYWxMaXN0ZW5lci5qcz85YTdiIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uL25vZGVfbW9kdWxlcy9AcmVzdGFydC9ob29rcy9lc20vdXNlSW50ZXJ2YWwuanM/YTA3ZiIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvQHJlc3RhcnQvaG9va3MvZXNtL3VzZVJhZkludGVydmFsLmpzPzIxMTkiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L2hvb2tzL2VzbS91c2VNZXJnZVN0YXRlLmpzPzQyZGEiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L2hvb2tzL2VzbS91c2VNZXJnZVN0YXRlRnJvbVByb3BzLmpzPzZmOTAiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L2hvb2tzL2VzbS91c2VJbWFnZS5qcz81ZDZmIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uL25vZGVfbW9kdWxlcy9AcmVzdGFydC9ob29rcy9lc20vdXNlUmVzaXplT2JzZXJ2ZXIuanM/MTlhNiIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvQHJlc3RhcnQvaG9va3MvZXNtL2luZGV4LmpzPzM4ZmMiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L3VpL2VzbS9BbmNob3IuanM/ZjI1MSIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9OYXZMaW5rLmpzPzg4YTIiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vTmF2LmpzP2Y5OGMiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L3VpL25vZGVfbW9kdWxlcy91bmNvbnRyb2xsYWJsZS9saWIvZXNtL2luZGV4LmpzP2UxZmQiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L3VpL2VzbS9Ecm9wZG93bkNvbnRleHQuanM/YzBkNiIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvZGVxdWFsL2Rpc3QvaW5kZXgubWpzPzlkZTgiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L2hvb2tzL2VzbS91c2VTYWZlU3RhdGUuanM/ZjdhZCIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2dldEJhc2VQbGFjZW1lbnQuanM/YjUwZSIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRXaW5kb3cuanM/MWZjMCIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9pbnN0YW5jZU9mLmpzPzI3NjciLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9tYXRoLmpzPzg0YzYiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy91c2VyQWdlbnQuanM/MTJkOCIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9pc0xheW91dFZpZXdwb3J0LmpzPzc0YWYiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0Qm91bmRpbmdDbGllbnRSZWN0LmpzPzBmODgiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0TGF5b3V0UmVjdC5qcz9lMmU5Iiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2NvbnRhaW5zLmpzPzdmMzciLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0Tm9kZU5hbWUuanM/NTc4OCIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRDb21wdXRlZFN0eWxlLmpzP2I1MTkiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvaXNUYWJsZUVsZW1lbnQuanM/YjQ1MSIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXREb2N1bWVudEVsZW1lbnQuanM/ZWY1MiIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRQYXJlbnROb2RlLmpzPzI4YmYiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0T2Zmc2V0UGFyZW50LmpzP2I2MmIiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9nZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQuanM/YWQ5ZCIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL3dpdGhpbi5qcz9lNDNmIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZ2V0RnJlc2hTaWRlT2JqZWN0LmpzPzM1ZjYiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9tZXJnZVBhZGRpbmdPYmplY3QuanM/ZDM5YiIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2V4cGFuZFRvSGFzaE1hcC5qcz85ODUyIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZW51bXMuanM/NzdmOSIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9hcnJvdy5qcz8wOTI5Iiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZ2V0VmFyaWF0aW9uLmpzPzNkOGQiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvY29tcHV0ZVN0eWxlcy5qcz83Y2RhIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvbW9kaWZpZXJzL2V2ZW50TGlzdGVuZXJzLmpzP2FkNmUiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9nZXRPcHBvc2l0ZVBsYWNlbWVudC5qcz81MjMyIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZ2V0T3Bwb3NpdGVWYXJpYXRpb25QbGFjZW1lbnQuanM/NTAwYiIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRXaW5kb3dTY3JvbGwuanM/YTMyMSIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRXaW5kb3dTY3JvbGxCYXJYLmpzPzYxMjUiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0Vmlld3BvcnRSZWN0LmpzPzdjNzMiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0RG9jdW1lbnRSZWN0LmpzPzNlNzkiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvaXNTY3JvbGxQYXJlbnQuanM/YWU2YyIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRTY3JvbGxQYXJlbnQuanM/OWQwZSIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9saXN0U2Nyb2xsUGFyZW50cy5qcz9lYTFhIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvcmVjdFRvQ2xpZW50UmVjdC5qcz83YmNmIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldENsaXBwaW5nUmVjdC5qcz85ZGUwIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvY29tcHV0ZU9mZnNldHMuanM/NWQ3ZSIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2RldGVjdE92ZXJmbG93LmpzP2I2MTciLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9jb21wdXRlQXV0b1BsYWNlbWVudC5qcz80M2NlIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvbW9kaWZpZXJzL2ZsaXAuanM/ZWNiMiIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9oaWRlLmpzPzFkNmMiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvb2Zmc2V0LmpzPzk4MzUiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvcG9wcGVyT2Zmc2V0cy5qcz8xMzRhIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZ2V0QWx0QXhpcy5qcz9mMmUwIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvbW9kaWZpZXJzL3ByZXZlbnRPdmVyZmxvdy5qcz85NDM1Iiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldEhUTUxFbGVtZW50U2Nyb2xsLmpzPzVmZTYiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0Tm9kZVNjcm9sbC5qcz8xOTlhIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldENvbXBvc2l0ZVJlY3QuanM/ZDExNiIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL29yZGVyTW9kaWZpZXJzLmpzP2I5ZTYiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9kZWJvdW5jZS5qcz9iMWUyIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvbWVyZ2VCeU5hbWUuanM/MmEzNSIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2NyZWF0ZVBvcHBlci5qcz82Y2VlIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uL25vZGVfbW9kdWxlcy9AcmVzdGFydC91aS9lc20vcG9wcGVyLmpzPzMyOWEiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L3VpL2VzbS91c2VQb3BwZXIuanM/ZTU5YiIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvQHJlc3RhcnQvdWkvZXNtL3VzZUNsaWNrT3V0c2lkZS5qcz9mZmZjIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uL25vZGVfbW9kdWxlcy9AcmVzdGFydC91aS9lc20vbWVyZ2VPcHRpb25zV2l0aFBvcHBlckNvbmZpZy5qcz8zNjM5Iiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uL25vZGVfbW9kdWxlcy9AcmVzdGFydC91aS9lc20vRHJvcGRvd25NZW51LmpzPzMxMGQiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL0ByZWFjdC1hcmlhL3Nzci9kaXN0L2ltcG9ydC5tanM/MmQyMiIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvQHJlc3RhcnQvdWkvZXNtL0Ryb3Bkb3duVG9nZ2xlLmpzPzAzZGEiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L3VpL2VzbS9Ecm9wZG93bkl0ZW0uanM/NWRlZSIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvQHJlc3RhcnQvdWkvZXNtL0Ryb3Bkb3duLmpzPzlhYzUiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vRHJvcGRvd25Db250ZXh0LmpzPzliYWIiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vRHJvcGRvd25EaXZpZGVyLmpzPzE0ZTUiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vRHJvcGRvd25IZWFkZXIuanM/OWMwOSIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9Ecm9wZG93bkl0ZW0uanM/NDBhOCIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9Ecm9wZG93bkl0ZW1UZXh0LmpzPzMyODIiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vSW5wdXRHcm91cENvbnRleHQuanM/M2Q4NyIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS91c2VXcmFwcGVkUmVmV2l0aFdhcm5pbmcuanM/NDk3NCIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9Ecm9wZG93bk1lbnUuanM/YWQyOSIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9CdXR0b24uanM/NzE2OSIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9Ecm9wZG93blRvZ2dsZS5qcz9lMGUwIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL0Ryb3Bkb3duLmpzP2Y3YmYiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vTmF2RHJvcGRvd24uanM/MTk2MSIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9zcmMvYXBwL2xheW91dC9sYXlvdXQuanM/NDVjYiIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9zcmMvYXBwL2xheW91dC9lcnJvcnBhZ2UuanM/NGI1YSIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vc3JjL2Nzcy9zdHlsZXMuc2Nzcz9hMmJhIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9zcmMvanMvZGFzaGJvYXJkLmpzPzdmOTciLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL25vZGVfbW9kdWxlcy9ncmlkc3RhY2svZGlzdC9ncmlkc3RhY2subWluLmNzcz8yNDRjIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9zcmMvanMvdXRpbHMuanM/OTI5MiIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9leHRlbnQuanM/YjQzYyIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9tYXguanM/OTNkNiIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9yYW5nZS5qcz9iY2E1Iiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL21hcC5qcz81Y2Y2Iiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvaW50ZXJubWFwL3NyYy9pbmRleC5qcz82MDI0Iiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL2luZGV4LmpzPzVjYTYiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL25vZGVfbW9kdWxlcy9kMy1heGlzL3NyYy9pZGVudGl0eS5qcz80NzRiIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZDMtYXhpcy9zcmMvYXhpcy5qcz9mNDlhIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZDMtYXhpcy9zcmMvaW5kZXguanM/NjU3ZCIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0b3IuanM/NjhhMSIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NlbGVjdC5qcz84ZTY4Iiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9hcnJheS5qcz85YTYyIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3RvckFsbC5qcz81MDZlIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vc2VsZWN0QWxsLmpzP2IzOTYiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL21hdGNoZXIuanM/ZjU5YyIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NlbGVjdENoaWxkLmpzPzgyOTYiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9zZWxlY3RDaGlsZHJlbi5qcz9iZjZiIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZmlsdGVyLmpzP2U2ODQiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9zcGFyc2UuanM/M2MzMyIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2VudGVyLmpzP2QyZDgiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL2NvbnN0YW50LmpzP2FkZDIiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9kYXRhLmpzPzFmN2EiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9leGl0LmpzPzNjNmUiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9qb2luLmpzPzhlN2EiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9tZXJnZS5qcz83NWI2Iiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vb3JkZXIuanM/ZjYxNyIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NvcnQuanM/YzJiZSIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2NhbGwuanM/N2MwZiIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL25vZGVzLmpzPzc0OGYiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9ub2RlLmpzP2M2MzUiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9zaXplLmpzP2E0YTciLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9lbXB0eS5qcz80NTY2Iiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZWFjaC5qcz8zMjZhIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9uYW1lc3BhY2VzLmpzPzZmN2UiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL25hbWVzcGFjZS5qcz83ZjBiIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vYXR0ci5qcz84ODBiIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy93aW5kb3cuanM/NTFiMyIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3N0eWxlLmpzPzVhNGYiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9wcm9wZXJ0eS5qcz83YmQ4Iiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vY2xhc3NlZC5qcz9jZGI5Iiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vdGV4dC5qcz9hMDcyIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vaHRtbC5qcz9jNWM5Iiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vcmFpc2UuanM/ZjNlOSIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2xvd2VyLmpzPzI5ZTciLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL2NyZWF0b3IuanM/OWU2NyIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2FwcGVuZC5qcz8yNmJiIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vaW5zZXJ0LmpzP2M3ODgiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9yZW1vdmUuanM/NWUzNCIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2Nsb25lLmpzPzRkYzAiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9kYXR1bS5qcz9mNWMyIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vb24uanM/ZmU1MCIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2Rpc3BhdGNoLmpzPzBhMTIiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9pdGVyYXRvci5qcz9hZTMwIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vaW5kZXguanM/ODZiYyIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vbm9kZV9tb2R1bGVzL2QzLWRpc3BhdGNoL3NyYy9kaXNwYXRjaC5qcz84NmQ3Iiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZDMtdGltZXIvc3JjL3RpbWVyLmpzPzEwZjAiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL25vZGVfbW9kdWxlcy9kMy10aW1lci9zcmMvdGltZW91dC5qcz9jYTY2Iiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9zY2hlZHVsZS5qcz80NzY2Iiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvaW50ZXJydXB0LmpzPzk3NTEiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy9zZWxlY3Rpb24vaW50ZXJydXB0LmpzP2VlZTQiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvbnVtYmVyLmpzPzBjZDIiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvdHJhbnNmb3JtL2RlY29tcG9zZS5qcz82NzllIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3RyYW5zZm9ybS9wYXJzZS5qcz9hY2I4Iiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3RyYW5zZm9ybS9pbmRleC5qcz83NjBmIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi90d2Vlbi5qcz9iMjQ4Iiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZDMtY29sb3Ivc3JjL2RlZmluZS5qcz9mMmIyIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZDMtY29sb3Ivc3JjL2NvbG9yLmpzPzk1ODMiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvYmFzaXMuanM/MWRlZCIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9iYXNpc0Nsb3NlZC5qcz8wMTRiIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL2NvbnN0YW50LmpzPzk4ZDEiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvY29sb3IuanM/NzI4MyIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9yZ2IuanM/ZGFhNyIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9zdHJpbmcuanM/NmVjOSIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vaW50ZXJwb2xhdGUuanM/ZDA4NyIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vYXR0ci5qcz8wNmYzIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9hdHRyVHdlZW4uanM/MWQwMCIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vZGVsYXkuanM/MmU5YSIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vZHVyYXRpb24uanM/YWM5MiIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vZWFzZS5qcz84NGE2Iiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9lYXNlVmFyeWluZy5qcz85OTU2Iiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9maWx0ZXIuanM/NWU1MSIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vbWVyZ2UuanM/ZDY4MSIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vb24uanM/ZDIyNiIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vcmVtb3ZlLmpzP2Y4Y2UiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3NlbGVjdC5qcz9jZWRhIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9zZWxlY3RBbGwuanM/ZWYxYiIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vc2VsZWN0aW9uLmpzP2I0YzMiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3N0eWxlLmpzPzEyNjgiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3N0eWxlVHdlZW4uanM/NWUyYSIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vdGV4dC5qcz9hMjk0Iiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi90ZXh0VHdlZW4uanM/Yjk3OSIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vdHJhbnNpdGlvbi5qcz9hMjVlIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9lbmQuanM/YmVjZiIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vaW5kZXguanM/NmQ5YyIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vbm9kZV9tb2R1bGVzL2QzLWVhc2Uvc3JjL2N1YmljLmpzPzEwMDMiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy9zZWxlY3Rpb24vdHJhbnNpdGlvbi5qcz85MDkyIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvc2VsZWN0aW9uL2luZGV4LmpzPzU2MDEiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy9pbmRleC5qcz8zYTY3Iiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZDMtYnJ1c2gvc3JjL2JydXNoLmpzP2VjOTkiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL25vZGVfbW9kdWxlcy9kMy1icnVzaC9zcmMvaW5kZXguanM/NWJlMiIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vbm9kZV9tb2R1bGVzL2QzLXNjYWxlL3NyYy9pbml0LmpzPzZiOGUiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL25vZGVfbW9kdWxlcy9kMy1zY2FsZS9zcmMvb3JkaW5hbC5qcz8xZGViIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZDMtc2NhbGUvc3JjL2JhbmQuanM/MmI3ZiIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy90aWNrcy5qcz84NTlkIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL2FzY2VuZGluZy5qcz85NTQ1Iiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL2Rlc2NlbmRpbmcuanM/NWE1NiIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9iaXNlY3Rvci5qcz9iMzI2Iiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL251bWJlci5qcz8zNWQzIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL2Jpc2VjdC5qcz80NzViIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL2FycmF5LmpzPzI5M2QiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvZGF0ZS5qcz81NmM1Iiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL29iamVjdC5qcz8xNDlmIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL251bWJlckFycmF5LmpzPzdlMjgiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvdmFsdWUuanM/ZjFjZiIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9yb3VuZC5qcz9iMzM1Iiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZDMtc2NhbGUvc3JjL2NvbnN0YW50LmpzPzNiYTEiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL25vZGVfbW9kdWxlcy9kMy1zY2FsZS9zcmMvbnVtYmVyLmpzPzgzNTkiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL25vZGVfbW9kdWxlcy9kMy1zY2FsZS9zcmMvY29udGludW91cy5qcz9hODkyIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9mb3JtYXRTcGVjaWZpZXIuanM/ZWQ0NSIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZm9ybWF0RGVjaW1hbC5qcz80N2ZlIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9leHBvbmVudC5qcz82ZjUwIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9wcmVjaXNpb25QcmVmaXguanM/NjA0MCIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZm9ybWF0R3JvdXAuanM/ODczYiIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZm9ybWF0TnVtZXJhbHMuanM/ZmY3MyIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZm9ybWF0VHJpbS5qcz84ZDJkIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9mb3JtYXRQcmVmaXhBdXRvLmpzPzIyMDIiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL25vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2Zvcm1hdFJvdW5kZWQuanM/ZTZmMCIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZm9ybWF0VHlwZXMuanM/MWMyMSIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvaWRlbnRpdHkuanM/MTNlMCIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvbG9jYWxlLmpzPzA0YzgiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL25vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2RlZmF1bHRMb2NhbGUuanM/Y2VlOCIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvcHJlY2lzaW9uUm91bmQuanM/M2JkYyIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvcHJlY2lzaW9uRml4ZWQuanM/YjhjZCIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vbm9kZV9tb2R1bGVzL2QzLXNjYWxlL3NyYy90aWNrRm9ybWF0LmpzP2ZiOTEiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL25vZGVfbW9kdWxlcy9kMy1zY2FsZS9zcmMvbGluZWFyLmpzP2MzOGYiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL25vZGVfbW9kdWxlcy9kMy10aW1lL3NyYy9kdXJhdGlvbi5qcz9mODJiIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZDMtdGltZS9zcmMvaW50ZXJ2YWwuanM/ZTlmNSIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vbm9kZV9tb2R1bGVzL2QzLXRpbWUvc3JjL21pbGxpc2Vjb25kLmpzPzFjODQiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL25vZGVfbW9kdWxlcy9kMy10aW1lL3NyYy9zZWNvbmQuanM/NjRhNiIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vbm9kZV9tb2R1bGVzL2QzLXRpbWUvc3JjL21pbnV0ZS5qcz9lYzZjIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZDMtdGltZS9zcmMvaG91ci5qcz80ZGExIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZDMtdGltZS9zcmMvZGF5LmpzP2NhZGMiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL25vZGVfbW9kdWxlcy9kMy10aW1lL3NyYy93ZWVrLmpzPzFiZDkiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL25vZGVfbW9kdWxlcy9kMy10aW1lL3NyYy9tb250aC5qcz8zMTA2Iiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZDMtdGltZS9zcmMveWVhci5qcz9hZWRmIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZDMtdGltZS9zcmMvdGlja3MuanM/ZTMwMyIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vbm9kZV9tb2R1bGVzL2QzLXRpbWUtZm9ybWF0L3NyYy9sb2NhbGUuanM/YjFlZiIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vbm9kZV9tb2R1bGVzL2QzLXRpbWUtZm9ybWF0L3NyYy9kZWZhdWx0TG9jYWxlLmpzPzBjZjEiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL25vZGVfbW9kdWxlcy9kMy1zY2FsZS9zcmMvbmljZS5qcz84NzQ4Iiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZDMtc2NhbGUvc3JjL3RpbWUuanM/ZDNiOSIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vbm9kZV9tb2R1bGVzL2QzLXNjYWxlL3NyYy9zZXF1ZW50aWFsLmpzP2ExOTEiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL25vZGVfbW9kdWxlcy9kMy1zY2FsZS9zcmMvaW5kZXguanM/YThjNyIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vbm9kZV9tb2R1bGVzL2QzLXNjYWxlLWNocm9tYXRpYy9zcmMvY29sb3JzLmpzPzg3NDMiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL25vZGVfbW9kdWxlcy9kMy1zY2FsZS1jaHJvbWF0aWMvc3JjL2NhdGVnb3JpY2FsL1RhYmxlYXUxMC5qcz9kZTlkIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZDMtc2NhbGUtY2hyb21hdGljL3NyYy9yYW1wLmpzPzQwNzYiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL25vZGVfbW9kdWxlcy9kMy1zY2FsZS1jaHJvbWF0aWMvc3JjL2RpdmVyZ2luZy9TcGVjdHJhbC5qcz9hMzY4Iiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZDMtc2NhbGUtY2hyb21hdGljL3NyYy9zZXF1ZW50aWFsLXNpbmdsZS9HcmVlbnMuanM/ZmQyNiIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vbm9kZV9tb2R1bGVzL2QzLXNjYWxlLWNocm9tYXRpYy9zcmMvaW5kZXguanM/YzliZiIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0LmpzP2E2MzEiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL2luZGV4LmpzP2Y0MDIiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL25vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvY29uc3RhbnQuanM/ZDMxYyIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vbm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9tYXRoLmpzP2VjMWMiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL25vZGVfbW9kdWxlcy9kMy1wYXRoL3NyYy9wYXRoLmpzP2UxM2YiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL25vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvcGF0aC5qcz9jYjgyIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL2FyYy5qcz9mNWRkIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL2FycmF5LmpzPzE0YmEiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL25vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvY3VydmUvbGluZWFyLmpzPzNmMzIiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL25vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvcG9pbnQuanM/OTlhMiIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vbm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9saW5lLmpzP2EzNzMiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL25vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvYXJlYS5qcz81NThkIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL2Rlc2NlbmRpbmcuanM/NWQ2NCIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vbm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9pZGVudGl0eS5qcz8yNmFiIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL3BpZS5qcz85OGJmIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL29mZnNldC9ub25lLmpzP2RiZmMiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL25vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvb3JkZXIvbm9uZS5qcz81ZmM0Iiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL3N0YWNrLmpzPzk3ZjgiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL25vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvaW5kZXguanM/OTRhYyIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vbm9kZV9tb2R1bGVzL2QzLXRpbWUtZm9ybWF0L3NyYy9pbmRleC5qcz84MjdjIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZDMtem9vbS9zcmMvdHJhbnNmb3JtLmpzP2Y2YTAiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL25vZGVfbW9kdWxlcy9kMy16b29tL3NyYy96b29tLmpzPzI1OGYiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL25vZGVfbW9kdWxlcy9kMy16b29tL3NyYy9pbmRleC5qcz82YzUwIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZDMvc3JjL2luZGV4LmpzP2NiZTYiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL3NyYy9qcy9jaGFydHMvYmFzZS5qcz82YjQ2Iiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9zcmMvanMvY2hhcnRzL2xpbmVjaGFydC5qcz8zOGE4Iiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9zcmMvanMvY2hhcnRzL2JhcmNoYXJ0LmpzPzc4MTkiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL3NyYy9qcy9jaGFydHMvcGllY2hhcnQuanM/Y2JiZiIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vc3JjL2pzL2NoYXJ0cy9hcmVhY2hhcnQuanM/MjlhNiIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vc3JjL2pzL2NoYXJ0cy9zdGFja2VkX2JhcmNoYXJ0LmpzP2Q3ZWIiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL3NyYy9qcy9jaGFydHMvZ3JvdXBlZF9iYXJjaGFydC5qcz8zNDIyIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9zcmMvanMvY2hhcnRzL3NpbXBsZV9ncm91cGVkX2JhcmNoYXJ0LmpzPzVlOWIiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL25vZGVfbW9kdWxlcy9Aa3Vya2xlL2NvbG9yL2Rpc3QvY29sb3IuZXNtLmpzPzk5OTEiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL25vZGVfbW9kdWxlcy9jaGFydC5qcy9kaXN0L2NodW5rcy9oZWxwZXJzLnNlZ21lbnQuanM/NzI5NSIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vbm9kZV9tb2R1bGVzL2NoYXJ0LmpzL2Rpc3QvY2hhcnQuanM/NTUwOSIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vbm9kZV9tb2R1bGVzL2NoYXJ0LmpzL2F1dG8vYXV0by5qcz9hZGYxIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL25hdGl2ZS5qcz9iM2YwIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3JuZy5qcz8zM2Y5Iiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3N0cmluZ2lmeS5qcz85ZDUyIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3Y0LmpzPzAzNzAiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL3NyYy9qcy9jaGFydHMvY2hhcnRqcy5qcz9kNTRmIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9zcmMvanMvY2hhcnRzL2hlYXRtYXAuanM/ZWVjMSIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vc3JjL2pzL2VsZW1lbnRzL2Jhc2VfZWxlbWVudC5qcz81MmNjIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9zcmMvanMvZWxlbWVudHMvdGV4dGVsZW1lbnQuanM/NDVjMiIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vc3JjL2pzL2VsZW1lbnRzL3RleHRhcmVhZWxlbWVudC5qcz9mYWZiIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9zcmMvanMvY2hhcnRzL3NjYXR0ZXJjaGFydC5qcz9lOTcxIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9zcmMvanMvY2hhcnRzL2JveHBsb3QuanM/MGZhOSIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vc3JjL2pzL2NoYXJ0cy9ncmlkLmpzP2QxZDAiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL2luZGV4LmpzPzU3N2EiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vc3JjL21vY2tfY2hhcnRzL21vY2tfYmFyX2NoYXJ0LmpzPzNiYTgiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vc3JjL21vY2tfY2hhcnRzL21vY2tfZ3JpZC5qcz9kYWZmIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uL3NyYy9tb2NrX2NoYXJ0cy9tb2NrX3NjYXR0ZXJfZ3JpZC5qcz80ZGZmIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uL3NyYy9tb2NrX2NoYXJ0cy9tb2NrX3BpZV9ncmlkLmpzP2QwNTEiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vc3JjL21vY2tfY2hhcnRzL21vY2tfZGVhZGxpbmVzLmpzP2VjMWEiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vc3JjL21vY2tfY2hhcnRzL21vY2tfcHJvZ3Jlc3NfaGVhdC5qcz9iMTczIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uL3NyYy9tb2NrX2NoYXJ0cy9tb2NrX3Byb2dyZXNzX2JveC5qcz82ZDAxIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uL3NyYy9tb2NrX2NoYXJ0cy9tb2NrX2ZlZWRiYWNrLmpzPzUyNjQiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vc3JjL21vY2tfY2hhcnRzL21vY2tfbGluZV9jaGFydC5qcz9hYjI5Iiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uL3NyYy9hcHAvcGFnZXMvZGFzaGJvYXJkLmpzPzQ0ZDAiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL0Bmb3J0YXdlc29tZS9mb250YXdlc29tZS1zdmctY29yZS9pbmRleC5tanM/ZTYxYSIsIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvQGZvcnRhd2Vzb21lL3JlYWN0LWZvbnRhd2Vzb21lL2luZGV4LmVzLmpzPzIwZmQiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vUm93LmpzP2RkOWYiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vQ29sLmpzPzI0OGUiLCJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vc3JjL2FwcC9wYWdlcy9sb2dpbi5qcz9kMDkxIiwid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uL3NyYy9pbmRleC5qcz9iNjM1Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHJlbWl4LXJ1bi9yb3V0ZXIgdjEuMTMuMVxuICpcbiAqIENvcHlyaWdodCAoYykgUmVtaXggU29mdHdhcmUgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRS5tZCBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICpcbiAqIEBsaWNlbnNlIE1JVFxuICovXG5mdW5jdGlvbiBfZXh0ZW5kcygpIHtcbiAgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07XG4gICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9O1xuICByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vI3JlZ2lvbiBUeXBlcyBhbmQgQ29uc3RhbnRzXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLyoqXG4gKiBBY3Rpb25zIHJlcHJlc2VudCB0aGUgdHlwZSBvZiBjaGFuZ2UgdG8gYSBsb2NhdGlvbiB2YWx1ZS5cbiAqL1xudmFyIEFjdGlvbjtcbihmdW5jdGlvbiAoQWN0aW9uKSB7XG4gIC8qKlxuICAgKiBBIFBPUCBpbmRpY2F0ZXMgYSBjaGFuZ2UgdG8gYW4gYXJiaXRyYXJ5IGluZGV4IGluIHRoZSBoaXN0b3J5IHN0YWNrLCBzdWNoXG4gICAqIGFzIGEgYmFjayBvciBmb3J3YXJkIG5hdmlnYXRpb24uIEl0IGRvZXMgbm90IGRlc2NyaWJlIHRoZSBkaXJlY3Rpb24gb2YgdGhlXG4gICAqIG5hdmlnYXRpb24sIG9ubHkgdGhhdCB0aGUgY3VycmVudCBpbmRleCBjaGFuZ2VkLlxuICAgKlxuICAgKiBOb3RlOiBUaGlzIGlzIHRoZSBkZWZhdWx0IGFjdGlvbiBmb3IgbmV3bHkgY3JlYXRlZCBoaXN0b3J5IG9iamVjdHMuXG4gICAqL1xuICBBY3Rpb25bXCJQb3BcIl0gPSBcIlBPUFwiO1xuICAvKipcbiAgICogQSBQVVNIIGluZGljYXRlcyBhIG5ldyBlbnRyeSBiZWluZyBhZGRlZCB0byB0aGUgaGlzdG9yeSBzdGFjaywgc3VjaCBhcyB3aGVuXG4gICAqIGEgbGluayBpcyBjbGlja2VkIGFuZCBhIG5ldyBwYWdlIGxvYWRzLiBXaGVuIHRoaXMgaGFwcGVucywgYWxsIHN1YnNlcXVlbnRcbiAgICogZW50cmllcyBpbiB0aGUgc3RhY2sgYXJlIGxvc3QuXG4gICAqL1xuICBBY3Rpb25bXCJQdXNoXCJdID0gXCJQVVNIXCI7XG4gIC8qKlxuICAgKiBBIFJFUExBQ0UgaW5kaWNhdGVzIHRoZSBlbnRyeSBhdCB0aGUgY3VycmVudCBpbmRleCBpbiB0aGUgaGlzdG9yeSBzdGFja1xuICAgKiBiZWluZyByZXBsYWNlZCBieSBhIG5ldyBvbmUuXG4gICAqL1xuICBBY3Rpb25bXCJSZXBsYWNlXCJdID0gXCJSRVBMQUNFXCI7XG59KShBY3Rpb24gfHwgKEFjdGlvbiA9IHt9KSk7XG5jb25zdCBQb3BTdGF0ZUV2ZW50VHlwZSA9IFwicG9wc3RhdGVcIjtcbi8qKlxuICogTWVtb3J5IGhpc3Rvcnkgc3RvcmVzIHRoZSBjdXJyZW50IGxvY2F0aW9uIGluIG1lbW9yeS4gSXQgaXMgZGVzaWduZWQgZm9yIHVzZVxuICogaW4gc3RhdGVmdWwgbm9uLWJyb3dzZXIgZW52aXJvbm1lbnRzIGxpa2UgdGVzdHMgYW5kIFJlYWN0IE5hdGl2ZS5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlTWVtb3J5SGlzdG9yeShvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cbiAgbGV0IHtcbiAgICBpbml0aWFsRW50cmllcyA9IFtcIi9cIl0sXG4gICAgaW5pdGlhbEluZGV4LFxuICAgIHY1Q29tcGF0ID0gZmFsc2VcbiAgfSA9IG9wdGlvbnM7XG4gIGxldCBlbnRyaWVzOyAvLyBEZWNsYXJlIHNvIHdlIGNhbiBhY2Nlc3MgZnJvbSBjcmVhdGVNZW1vcnlMb2NhdGlvblxuICBlbnRyaWVzID0gaW5pdGlhbEVudHJpZXMubWFwKChlbnRyeSwgaW5kZXgpID0+IGNyZWF0ZU1lbW9yeUxvY2F0aW9uKGVudHJ5LCB0eXBlb2YgZW50cnkgPT09IFwic3RyaW5nXCIgPyBudWxsIDogZW50cnkuc3RhdGUsIGluZGV4ID09PSAwID8gXCJkZWZhdWx0XCIgOiB1bmRlZmluZWQpKTtcbiAgbGV0IGluZGV4ID0gY2xhbXBJbmRleChpbml0aWFsSW5kZXggPT0gbnVsbCA/IGVudHJpZXMubGVuZ3RoIC0gMSA6IGluaXRpYWxJbmRleCk7XG4gIGxldCBhY3Rpb24gPSBBY3Rpb24uUG9wO1xuICBsZXQgbGlzdGVuZXIgPSBudWxsO1xuICBmdW5jdGlvbiBjbGFtcEluZGV4KG4pIHtcbiAgICByZXR1cm4gTWF0aC5taW4oTWF0aC5tYXgobiwgMCksIGVudHJpZXMubGVuZ3RoIC0gMSk7XG4gIH1cbiAgZnVuY3Rpb24gZ2V0Q3VycmVudExvY2F0aW9uKCkge1xuICAgIHJldHVybiBlbnRyaWVzW2luZGV4XTtcbiAgfVxuICBmdW5jdGlvbiBjcmVhdGVNZW1vcnlMb2NhdGlvbih0bywgc3RhdGUsIGtleSkge1xuICAgIGlmIChzdGF0ZSA9PT0gdm9pZCAwKSB7XG4gICAgICBzdGF0ZSA9IG51bGw7XG4gICAgfVxuICAgIGxldCBsb2NhdGlvbiA9IGNyZWF0ZUxvY2F0aW9uKGVudHJpZXMgPyBnZXRDdXJyZW50TG9jYXRpb24oKS5wYXRobmFtZSA6IFwiL1wiLCB0bywgc3RhdGUsIGtleSk7XG4gICAgd2FybmluZyhsb2NhdGlvbi5wYXRobmFtZS5jaGFyQXQoMCkgPT09IFwiL1wiLCBcInJlbGF0aXZlIHBhdGhuYW1lcyBhcmUgbm90IHN1cHBvcnRlZCBpbiBtZW1vcnkgaGlzdG9yeTogXCIgKyBKU09OLnN0cmluZ2lmeSh0bykpO1xuICAgIHJldHVybiBsb2NhdGlvbjtcbiAgfVxuICBmdW5jdGlvbiBjcmVhdGVIcmVmKHRvKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB0byA9PT0gXCJzdHJpbmdcIiA/IHRvIDogY3JlYXRlUGF0aCh0byk7XG4gIH1cbiAgbGV0IGhpc3RvcnkgPSB7XG4gICAgZ2V0IGluZGV4KCkge1xuICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH0sXG4gICAgZ2V0IGFjdGlvbigpIHtcbiAgICAgIHJldHVybiBhY3Rpb247XG4gICAgfSxcbiAgICBnZXQgbG9jYXRpb24oKSB7XG4gICAgICByZXR1cm4gZ2V0Q3VycmVudExvY2F0aW9uKCk7XG4gICAgfSxcbiAgICBjcmVhdGVIcmVmLFxuICAgIGNyZWF0ZVVSTCh0bykge1xuICAgICAgcmV0dXJuIG5ldyBVUkwoY3JlYXRlSHJlZih0byksIFwiaHR0cDovL2xvY2FsaG9zdFwiKTtcbiAgICB9LFxuICAgIGVuY29kZUxvY2F0aW9uKHRvKSB7XG4gICAgICBsZXQgcGF0aCA9IHR5cGVvZiB0byA9PT0gXCJzdHJpbmdcIiA/IHBhcnNlUGF0aCh0bykgOiB0bztcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBhdGhuYW1lOiBwYXRoLnBhdGhuYW1lIHx8IFwiXCIsXG4gICAgICAgIHNlYXJjaDogcGF0aC5zZWFyY2ggfHwgXCJcIixcbiAgICAgICAgaGFzaDogcGF0aC5oYXNoIHx8IFwiXCJcbiAgICAgIH07XG4gICAgfSxcbiAgICBwdXNoKHRvLCBzdGF0ZSkge1xuICAgICAgYWN0aW9uID0gQWN0aW9uLlB1c2g7XG4gICAgICBsZXQgbmV4dExvY2F0aW9uID0gY3JlYXRlTWVtb3J5TG9jYXRpb24odG8sIHN0YXRlKTtcbiAgICAgIGluZGV4ICs9IDE7XG4gICAgICBlbnRyaWVzLnNwbGljZShpbmRleCwgZW50cmllcy5sZW5ndGgsIG5leHRMb2NhdGlvbik7XG4gICAgICBpZiAodjVDb21wYXQgJiYgbGlzdGVuZXIpIHtcbiAgICAgICAgbGlzdGVuZXIoe1xuICAgICAgICAgIGFjdGlvbixcbiAgICAgICAgICBsb2NhdGlvbjogbmV4dExvY2F0aW9uLFxuICAgICAgICAgIGRlbHRhOiAxXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sXG4gICAgcmVwbGFjZSh0bywgc3RhdGUpIHtcbiAgICAgIGFjdGlvbiA9IEFjdGlvbi5SZXBsYWNlO1xuICAgICAgbGV0IG5leHRMb2NhdGlvbiA9IGNyZWF0ZU1lbW9yeUxvY2F0aW9uKHRvLCBzdGF0ZSk7XG4gICAgICBlbnRyaWVzW2luZGV4XSA9IG5leHRMb2NhdGlvbjtcbiAgICAgIGlmICh2NUNvbXBhdCAmJiBsaXN0ZW5lcikge1xuICAgICAgICBsaXN0ZW5lcih7XG4gICAgICAgICAgYWN0aW9uLFxuICAgICAgICAgIGxvY2F0aW9uOiBuZXh0TG9jYXRpb24sXG4gICAgICAgICAgZGVsdGE6IDBcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBnbyhkZWx0YSkge1xuICAgICAgYWN0aW9uID0gQWN0aW9uLlBvcDtcbiAgICAgIGxldCBuZXh0SW5kZXggPSBjbGFtcEluZGV4KGluZGV4ICsgZGVsdGEpO1xuICAgICAgbGV0IG5leHRMb2NhdGlvbiA9IGVudHJpZXNbbmV4dEluZGV4XTtcbiAgICAgIGluZGV4ID0gbmV4dEluZGV4O1xuICAgICAgaWYgKGxpc3RlbmVyKSB7XG4gICAgICAgIGxpc3RlbmVyKHtcbiAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgbG9jYXRpb246IG5leHRMb2NhdGlvbixcbiAgICAgICAgICBkZWx0YVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGxpc3Rlbihmbikge1xuICAgICAgbGlzdGVuZXIgPSBmbjtcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGxpc3RlbmVyID0gbnVsbDtcbiAgICAgIH07XG4gICAgfVxuICB9O1xuICByZXR1cm4gaGlzdG9yeTtcbn1cbi8qKlxuICogQnJvd3NlciBoaXN0b3J5IHN0b3JlcyB0aGUgbG9jYXRpb24gaW4gcmVndWxhciBVUkxzLiBUaGlzIGlzIHRoZSBzdGFuZGFyZCBmb3JcbiAqIG1vc3Qgd2ViIGFwcHMsIGJ1dCBpdCByZXF1aXJlcyBzb21lIGNvbmZpZ3VyYXRpb24gb24gdGhlIHNlcnZlciB0byBlbnN1cmUgeW91XG4gKiBzZXJ2ZSB0aGUgc2FtZSBhcHAgYXQgbXVsdGlwbGUgVVJMcy5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9yZW1peC1ydW4vaGlzdG9yeS90cmVlL21haW4vZG9jcy9hcGktcmVmZXJlbmNlLm1kI2NyZWF0ZWJyb3dzZXJoaXN0b3J5XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUJyb3dzZXJIaXN0b3J5KG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuICBmdW5jdGlvbiBjcmVhdGVCcm93c2VyTG9jYXRpb24od2luZG93LCBnbG9iYWxIaXN0b3J5KSB7XG4gICAgbGV0IHtcbiAgICAgIHBhdGhuYW1lLFxuICAgICAgc2VhcmNoLFxuICAgICAgaGFzaFxuICAgIH0gPSB3aW5kb3cubG9jYXRpb247XG4gICAgcmV0dXJuIGNyZWF0ZUxvY2F0aW9uKFwiXCIsIHtcbiAgICAgIHBhdGhuYW1lLFxuICAgICAgc2VhcmNoLFxuICAgICAgaGFzaFxuICAgIH0sXG4gICAgLy8gc3RhdGUgZGVmYXVsdHMgdG8gYG51bGxgIGJlY2F1c2UgYHdpbmRvdy5oaXN0b3J5LnN0YXRlYCBkb2VzXG4gICAgZ2xvYmFsSGlzdG9yeS5zdGF0ZSAmJiBnbG9iYWxIaXN0b3J5LnN0YXRlLnVzciB8fCBudWxsLCBnbG9iYWxIaXN0b3J5LnN0YXRlICYmIGdsb2JhbEhpc3Rvcnkuc3RhdGUua2V5IHx8IFwiZGVmYXVsdFwiKTtcbiAgfVxuICBmdW5jdGlvbiBjcmVhdGVCcm93c2VySHJlZih3aW5kb3csIHRvKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB0byA9PT0gXCJzdHJpbmdcIiA/IHRvIDogY3JlYXRlUGF0aCh0byk7XG4gIH1cbiAgcmV0dXJuIGdldFVybEJhc2VkSGlzdG9yeShjcmVhdGVCcm93c2VyTG9jYXRpb24sIGNyZWF0ZUJyb3dzZXJIcmVmLCBudWxsLCBvcHRpb25zKTtcbn1cbi8qKlxuICogSGFzaCBoaXN0b3J5IHN0b3JlcyB0aGUgbG9jYXRpb24gaW4gd2luZG93LmxvY2F0aW9uLmhhc2guIFRoaXMgbWFrZXMgaXQgaWRlYWxcbiAqIGZvciBzaXR1YXRpb25zIHdoZXJlIHlvdSBkb24ndCB3YW50IHRvIHNlbmQgdGhlIGxvY2F0aW9uIHRvIHRoZSBzZXJ2ZXIgZm9yXG4gKiBzb21lIHJlYXNvbiwgZWl0aGVyIGJlY2F1c2UgeW91IGRvIGNhbm5vdCBjb25maWd1cmUgaXQgb3IgdGhlIFVSTCBzcGFjZSBpc1xuICogcmVzZXJ2ZWQgZm9yIHNvbWV0aGluZyBlbHNlLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3JlbWl4LXJ1bi9oaXN0b3J5L3RyZWUvbWFpbi9kb2NzL2FwaS1yZWZlcmVuY2UubWQjY3JlYXRlaGFzaGhpc3RvcnlcbiAqL1xuZnVuY3Rpb24gY3JlYXRlSGFzaEhpc3Rvcnkob3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG4gIGZ1bmN0aW9uIGNyZWF0ZUhhc2hMb2NhdGlvbih3aW5kb3csIGdsb2JhbEhpc3RvcnkpIHtcbiAgICBsZXQge1xuICAgICAgcGF0aG5hbWUgPSBcIi9cIixcbiAgICAgIHNlYXJjaCA9IFwiXCIsXG4gICAgICBoYXNoID0gXCJcIlxuICAgIH0gPSBwYXJzZVBhdGgod2luZG93LmxvY2F0aW9uLmhhc2guc3Vic3RyKDEpKTtcbiAgICAvLyBIYXNoIFVSTCBzaG91bGQgYWx3YXlzIGhhdmUgYSBsZWFkaW5nIC8ganVzdCBsaWtlIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZVxuICAgIC8vIGRvZXMsIHNvIGlmIGFuIGFwcCBlbmRzIHVwIGF0IGEgcm91dGUgbGlrZSAvI3NvbWV0aGluZyB0aGVuIHdlIGFkZCBhXG4gICAgLy8gbGVhZGluZyBzbGFzaCBzbyBhbGwgb2Ygb3VyIHBhdGgtbWF0Y2hpbmcgYmVoYXZlcyB0aGUgc2FtZSBhcyBpZiBpdCB3b3VsZFxuICAgIC8vIGluIGEgYnJvd3NlciByb3V0ZXIuICBUaGlzIGlzIHBhcnRpY3VsYXJseSBpbXBvcnRhbnQgd2hlbiB0aGVyZSBleGlzdHMgYVxuICAgIC8vIHJvb3Qgc3BsYXQgcm91dGUgKDxSb3V0ZSBwYXRoPVwiKlwiPikgc2luY2UgdGhhdCBtYXRjaGVzIGludGVybmFsbHkgYWdhaW5zdFxuICAgIC8vIFwiLypcIiBhbmQgd2UnZCBleHBlY3QgLyNzb21ldGhpbmcgdG8gNDA0IGluIGEgaGFzaCByb3V0ZXIgYXBwLlxuICAgIGlmICghcGF0aG5hbWUuc3RhcnRzV2l0aChcIi9cIikgJiYgIXBhdGhuYW1lLnN0YXJ0c1dpdGgoXCIuXCIpKSB7XG4gICAgICBwYXRobmFtZSA9IFwiL1wiICsgcGF0aG5hbWU7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVMb2NhdGlvbihcIlwiLCB7XG4gICAgICBwYXRobmFtZSxcbiAgICAgIHNlYXJjaCxcbiAgICAgIGhhc2hcbiAgICB9LFxuICAgIC8vIHN0YXRlIGRlZmF1bHRzIHRvIGBudWxsYCBiZWNhdXNlIGB3aW5kb3cuaGlzdG9yeS5zdGF0ZWAgZG9lc1xuICAgIGdsb2JhbEhpc3Rvcnkuc3RhdGUgJiYgZ2xvYmFsSGlzdG9yeS5zdGF0ZS51c3IgfHwgbnVsbCwgZ2xvYmFsSGlzdG9yeS5zdGF0ZSAmJiBnbG9iYWxIaXN0b3J5LnN0YXRlLmtleSB8fCBcImRlZmF1bHRcIik7XG4gIH1cbiAgZnVuY3Rpb24gY3JlYXRlSGFzaEhyZWYod2luZG93LCB0bykge1xuICAgIGxldCBiYXNlID0gd2luZG93LmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJiYXNlXCIpO1xuICAgIGxldCBocmVmID0gXCJcIjtcbiAgICBpZiAoYmFzZSAmJiBiYXNlLmdldEF0dHJpYnV0ZShcImhyZWZcIikpIHtcbiAgICAgIGxldCB1cmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgICAgIGxldCBoYXNoSW5kZXggPSB1cmwuaW5kZXhPZihcIiNcIik7XG4gICAgICBocmVmID0gaGFzaEluZGV4ID09PSAtMSA/IHVybCA6IHVybC5zbGljZSgwLCBoYXNoSW5kZXgpO1xuICAgIH1cbiAgICByZXR1cm4gaHJlZiArIFwiI1wiICsgKHR5cGVvZiB0byA9PT0gXCJzdHJpbmdcIiA/IHRvIDogY3JlYXRlUGF0aCh0bykpO1xuICB9XG4gIGZ1bmN0aW9uIHZhbGlkYXRlSGFzaExvY2F0aW9uKGxvY2F0aW9uLCB0bykge1xuICAgIHdhcm5pbmcobG9jYXRpb24ucGF0aG5hbWUuY2hhckF0KDApID09PSBcIi9cIiwgXCJyZWxhdGl2ZSBwYXRobmFtZXMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gaGFzaCBoaXN0b3J5LnB1c2goXCIgKyBKU09OLnN0cmluZ2lmeSh0bykgKyBcIilcIik7XG4gIH1cbiAgcmV0dXJuIGdldFVybEJhc2VkSGlzdG9yeShjcmVhdGVIYXNoTG9jYXRpb24sIGNyZWF0ZUhhc2hIcmVmLCB2YWxpZGF0ZUhhc2hMb2NhdGlvbiwgb3B0aW9ucyk7XG59XG5mdW5jdGlvbiBpbnZhcmlhbnQodmFsdWUsIG1lc3NhZ2UpIHtcbiAgaWYgKHZhbHVlID09PSBmYWxzZSB8fCB2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHdhcm5pbmcoY29uZCwgbWVzc2FnZSkge1xuICBpZiAoIWNvbmQpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gXCJ1bmRlZmluZWRcIikgY29uc29sZS53YXJuKG1lc3NhZ2UpO1xuICAgIHRyeSB7XG4gICAgICAvLyBXZWxjb21lIHRvIGRlYnVnZ2luZyBoaXN0b3J5IVxuICAgICAgLy9cbiAgICAgIC8vIFRoaXMgZXJyb3IgaXMgdGhyb3duIGFzIGEgY29udmVuaWVuY2UsIHNvIHlvdSBjYW4gbW9yZSBlYXNpbHlcbiAgICAgIC8vIGZpbmQgdGhlIHNvdXJjZSBmb3IgYSB3YXJuaW5nIHRoYXQgYXBwZWFycyBpbiB0aGUgY29uc29sZSBieVxuICAgICAgLy8gZW5hYmxpbmcgXCJwYXVzZSBvbiBleGNlcHRpb25zXCIgaW4geW91ciBKYXZhU2NyaXB0IGRlYnVnZ2VyLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWVtcHR5XG4gICAgfSBjYXRjaCAoZSkge31cbiAgfVxufVxuZnVuY3Rpb24gY3JlYXRlS2V5KCkge1xuICByZXR1cm4gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyKDIsIDgpO1xufVxuLyoqXG4gKiBGb3IgYnJvd3Nlci1iYXNlZCBoaXN0b3JpZXMsIHdlIGNvbWJpbmUgdGhlIHN0YXRlIGFuZCBrZXkgaW50byBhbiBvYmplY3RcbiAqL1xuZnVuY3Rpb24gZ2V0SGlzdG9yeVN0YXRlKGxvY2F0aW9uLCBpbmRleCkge1xuICByZXR1cm4ge1xuICAgIHVzcjogbG9jYXRpb24uc3RhdGUsXG4gICAga2V5OiBsb2NhdGlvbi5rZXksXG4gICAgaWR4OiBpbmRleFxuICB9O1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgTG9jYXRpb24gb2JqZWN0IHdpdGggYSB1bmlxdWUga2V5IGZyb20gdGhlIGdpdmVuIFBhdGhcbiAqL1xuZnVuY3Rpb24gY3JlYXRlTG9jYXRpb24oY3VycmVudCwgdG8sIHN0YXRlLCBrZXkpIHtcbiAgaWYgKHN0YXRlID09PSB2b2lkIDApIHtcbiAgICBzdGF0ZSA9IG51bGw7XG4gIH1cbiAgbGV0IGxvY2F0aW9uID0gX2V4dGVuZHMoe1xuICAgIHBhdGhuYW1lOiB0eXBlb2YgY3VycmVudCA9PT0gXCJzdHJpbmdcIiA/IGN1cnJlbnQgOiBjdXJyZW50LnBhdGhuYW1lLFxuICAgIHNlYXJjaDogXCJcIixcbiAgICBoYXNoOiBcIlwiXG4gIH0sIHR5cGVvZiB0byA9PT0gXCJzdHJpbmdcIiA/IHBhcnNlUGF0aCh0bykgOiB0bywge1xuICAgIHN0YXRlLFxuICAgIC8vIFRPRE86IFRoaXMgY291bGQgYmUgY2xlYW5lZCB1cC4gIHB1c2gvcmVwbGFjZSBzaG91bGQgcHJvYmFibHkganVzdCB0YWtlXG4gICAgLy8gZnVsbCBMb2NhdGlvbnMgbm93IGFuZCBhdm9pZCB0aGUgbmVlZCB0byBydW4gdGhyb3VnaCB0aGlzIGZsb3cgYXQgYWxsXG4gICAgLy8gQnV0IHRoYXQncyBhIHByZXR0eSBiaWcgcmVmYWN0b3IgdG8gdGhlIGN1cnJlbnQgdGVzdCBzdWl0ZSBzbyBnb2luZyB0b1xuICAgIC8vIGtlZXAgYXMgaXMgZm9yIHRoZSB0aW1lIGJlaW5nIGFuZCBqdXN0IGxldCBhbnkgaW5jb21pbmcga2V5cyB0YWtlIHByZWNlZGVuY2VcbiAgICBrZXk6IHRvICYmIHRvLmtleSB8fCBrZXkgfHwgY3JlYXRlS2V5KClcbiAgfSk7XG4gIHJldHVybiBsb2NhdGlvbjtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIHN0cmluZyBVUkwgcGF0aCBmcm9tIHRoZSBnaXZlbiBwYXRobmFtZSwgc2VhcmNoLCBhbmQgaGFzaCBjb21wb25lbnRzLlxuICovXG5mdW5jdGlvbiBjcmVhdGVQYXRoKF9yZWYpIHtcbiAgbGV0IHtcbiAgICBwYXRobmFtZSA9IFwiL1wiLFxuICAgIHNlYXJjaCA9IFwiXCIsXG4gICAgaGFzaCA9IFwiXCJcbiAgfSA9IF9yZWY7XG4gIGlmIChzZWFyY2ggJiYgc2VhcmNoICE9PSBcIj9cIikgcGF0aG5hbWUgKz0gc2VhcmNoLmNoYXJBdCgwKSA9PT0gXCI/XCIgPyBzZWFyY2ggOiBcIj9cIiArIHNlYXJjaDtcbiAgaWYgKGhhc2ggJiYgaGFzaCAhPT0gXCIjXCIpIHBhdGhuYW1lICs9IGhhc2guY2hhckF0KDApID09PSBcIiNcIiA/IGhhc2ggOiBcIiNcIiArIGhhc2g7XG4gIHJldHVybiBwYXRobmFtZTtcbn1cbi8qKlxuICogUGFyc2VzIGEgc3RyaW5nIFVSTCBwYXRoIGludG8gaXRzIHNlcGFyYXRlIHBhdGhuYW1lLCBzZWFyY2gsIGFuZCBoYXNoIGNvbXBvbmVudHMuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlUGF0aChwYXRoKSB7XG4gIGxldCBwYXJzZWRQYXRoID0ge307XG4gIGlmIChwYXRoKSB7XG4gICAgbGV0IGhhc2hJbmRleCA9IHBhdGguaW5kZXhPZihcIiNcIik7XG4gICAgaWYgKGhhc2hJbmRleCA+PSAwKSB7XG4gICAgICBwYXJzZWRQYXRoLmhhc2ggPSBwYXRoLnN1YnN0cihoYXNoSW5kZXgpO1xuICAgICAgcGF0aCA9IHBhdGguc3Vic3RyKDAsIGhhc2hJbmRleCk7XG4gICAgfVxuICAgIGxldCBzZWFyY2hJbmRleCA9IHBhdGguaW5kZXhPZihcIj9cIik7XG4gICAgaWYgKHNlYXJjaEluZGV4ID49IDApIHtcbiAgICAgIHBhcnNlZFBhdGguc2VhcmNoID0gcGF0aC5zdWJzdHIoc2VhcmNoSW5kZXgpO1xuICAgICAgcGF0aCA9IHBhdGguc3Vic3RyKDAsIHNlYXJjaEluZGV4KTtcbiAgICB9XG4gICAgaWYgKHBhdGgpIHtcbiAgICAgIHBhcnNlZFBhdGgucGF0aG5hbWUgPSBwYXRoO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcGFyc2VkUGF0aDtcbn1cbmZ1bmN0aW9uIGdldFVybEJhc2VkSGlzdG9yeShnZXRMb2NhdGlvbiwgY3JlYXRlSHJlZiwgdmFsaWRhdGVMb2NhdGlvbiwgb3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG4gIGxldCB7XG4gICAgd2luZG93ID0gZG9jdW1lbnQuZGVmYXVsdFZpZXcsXG4gICAgdjVDb21wYXQgPSBmYWxzZVxuICB9ID0gb3B0aW9ucztcbiAgbGV0IGdsb2JhbEhpc3RvcnkgPSB3aW5kb3cuaGlzdG9yeTtcbiAgbGV0IGFjdGlvbiA9IEFjdGlvbi5Qb3A7XG4gIGxldCBsaXN0ZW5lciA9IG51bGw7XG4gIGxldCBpbmRleCA9IGdldEluZGV4KCk7XG4gIC8vIEluZGV4IHNob3VsZCBvbmx5IGJlIG51bGwgd2hlbiB3ZSBpbml0aWFsaXplLiBJZiBub3QsIGl0J3MgYmVjYXVzZSB0aGVcbiAgLy8gdXNlciBjYWxsZWQgaGlzdG9yeS5wdXNoU3RhdGUgb3IgaGlzdG9yeS5yZXBsYWNlU3RhdGUgZGlyZWN0bHksIGluIHdoaWNoXG4gIC8vIGNhc2Ugd2Ugc2hvdWxkIGxvZyBhIHdhcm5pbmcgYXMgaXQgd2lsbCByZXN1bHQgaW4gYnVncy5cbiAgaWYgKGluZGV4ID09IG51bGwpIHtcbiAgICBpbmRleCA9IDA7XG4gICAgZ2xvYmFsSGlzdG9yeS5yZXBsYWNlU3RhdGUoX2V4dGVuZHMoe30sIGdsb2JhbEhpc3Rvcnkuc3RhdGUsIHtcbiAgICAgIGlkeDogaW5kZXhcbiAgICB9KSwgXCJcIik7XG4gIH1cbiAgZnVuY3Rpb24gZ2V0SW5kZXgoKSB7XG4gICAgbGV0IHN0YXRlID0gZ2xvYmFsSGlzdG9yeS5zdGF0ZSB8fCB7XG4gICAgICBpZHg6IG51bGxcbiAgICB9O1xuICAgIHJldHVybiBzdGF0ZS5pZHg7XG4gIH1cbiAgZnVuY3Rpb24gaGFuZGxlUG9wKCkge1xuICAgIGFjdGlvbiA9IEFjdGlvbi5Qb3A7XG4gICAgbGV0IG5leHRJbmRleCA9IGdldEluZGV4KCk7XG4gICAgbGV0IGRlbHRhID0gbmV4dEluZGV4ID09IG51bGwgPyBudWxsIDogbmV4dEluZGV4IC0gaW5kZXg7XG4gICAgaW5kZXggPSBuZXh0SW5kZXg7XG4gICAgaWYgKGxpc3RlbmVyKSB7XG4gICAgICBsaXN0ZW5lcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgbG9jYXRpb246IGhpc3RvcnkubG9jYXRpb24sXG4gICAgICAgIGRlbHRhXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gcHVzaCh0bywgc3RhdGUpIHtcbiAgICBhY3Rpb24gPSBBY3Rpb24uUHVzaDtcbiAgICBsZXQgbG9jYXRpb24gPSBjcmVhdGVMb2NhdGlvbihoaXN0b3J5LmxvY2F0aW9uLCB0bywgc3RhdGUpO1xuICAgIGlmICh2YWxpZGF0ZUxvY2F0aW9uKSB2YWxpZGF0ZUxvY2F0aW9uKGxvY2F0aW9uLCB0byk7XG4gICAgaW5kZXggPSBnZXRJbmRleCgpICsgMTtcbiAgICBsZXQgaGlzdG9yeVN0YXRlID0gZ2V0SGlzdG9yeVN0YXRlKGxvY2F0aW9uLCBpbmRleCk7XG4gICAgbGV0IHVybCA9IGhpc3RvcnkuY3JlYXRlSHJlZihsb2NhdGlvbik7XG4gICAgLy8gdHJ5Li4uY2F0Y2ggYmVjYXVzZSBpT1MgbGltaXRzIHVzIHRvIDEwMCBwdXNoU3RhdGUgY2FsbHMgOi9cbiAgICB0cnkge1xuICAgICAgZ2xvYmFsSGlzdG9yeS5wdXNoU3RhdGUoaGlzdG9yeVN0YXRlLCBcIlwiLCB1cmwpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBJZiB0aGUgZXhjZXB0aW9uIGlzIGJlY2F1c2UgYHN0YXRlYCBjYW4ndCBiZSBzZXJpYWxpemVkLCBsZXQgdGhhdCB0aHJvd1xuICAgICAgLy8gb3V0d2FyZHMganVzdCBsaWtlIGEgcmVwbGFjZSBjYWxsIHdvdWxkIHNvIHRoZSBkZXYga25vd3MgdGhlIGNhdXNlXG4gICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9uYXYtaGlzdG9yeS1hcGlzLmh0bWwjc2hhcmVkLWhpc3RvcnktcHVzaC9yZXBsYWNlLXN0YXRlLXN0ZXBzXG4gICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zdHJ1Y3R1cmVkLWRhdGEuaHRtbCNzdHJ1Y3R1cmVkc2VyaWFsaXplaW50ZXJuYWxcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIERPTUV4Y2VwdGlvbiAmJiBlcnJvci5uYW1lID09PSBcIkRhdGFDbG9uZUVycm9yXCIpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICAvLyBUaGV5IGFyZSBnb2luZyB0byBsb3NlIHN0YXRlIGhlcmUsIGJ1dCB0aGVyZSBpcyBubyByZWFsXG4gICAgICAvLyB3YXkgdG8gd2FybiB0aGVtIGFib3V0IGl0IHNpbmNlIHRoZSBwYWdlIHdpbGwgcmVmcmVzaC4uLlxuICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbih1cmwpO1xuICAgIH1cbiAgICBpZiAodjVDb21wYXQgJiYgbGlzdGVuZXIpIHtcbiAgICAgIGxpc3RlbmVyKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBsb2NhdGlvbjogaGlzdG9yeS5sb2NhdGlvbixcbiAgICAgICAgZGVsdGE6IDFcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiByZXBsYWNlKHRvLCBzdGF0ZSkge1xuICAgIGFjdGlvbiA9IEFjdGlvbi5SZXBsYWNlO1xuICAgIGxldCBsb2NhdGlvbiA9IGNyZWF0ZUxvY2F0aW9uKGhpc3RvcnkubG9jYXRpb24sIHRvLCBzdGF0ZSk7XG4gICAgaWYgKHZhbGlkYXRlTG9jYXRpb24pIHZhbGlkYXRlTG9jYXRpb24obG9jYXRpb24sIHRvKTtcbiAgICBpbmRleCA9IGdldEluZGV4KCk7XG4gICAgbGV0IGhpc3RvcnlTdGF0ZSA9IGdldEhpc3RvcnlTdGF0ZShsb2NhdGlvbiwgaW5kZXgpO1xuICAgIGxldCB1cmwgPSBoaXN0b3J5LmNyZWF0ZUhyZWYobG9jYXRpb24pO1xuICAgIGdsb2JhbEhpc3RvcnkucmVwbGFjZVN0YXRlKGhpc3RvcnlTdGF0ZSwgXCJcIiwgdXJsKTtcbiAgICBpZiAodjVDb21wYXQgJiYgbGlzdGVuZXIpIHtcbiAgICAgIGxpc3RlbmVyKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBsb2NhdGlvbjogaGlzdG9yeS5sb2NhdGlvbixcbiAgICAgICAgZGVsdGE6IDBcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBjcmVhdGVVUkwodG8pIHtcbiAgICAvLyB3aW5kb3cubG9jYXRpb24ub3JpZ2luIGlzIFwibnVsbFwiICh0aGUgbGl0ZXJhbCBzdHJpbmcgdmFsdWUpIGluIEZpcmVmb3hcbiAgICAvLyB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnMsIG5vdGFibHkgd2hlbiBzZXJ2aW5nIGZyb20gYSBsb2NhbCBIVE1MIGZpbGVcbiAgICAvLyBTZWUgaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9ODc4Mjk3XG4gICAgbGV0IGJhc2UgPSB3aW5kb3cubG9jYXRpb24ub3JpZ2luICE9PSBcIm51bGxcIiA/IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4gOiB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgICBsZXQgaHJlZiA9IHR5cGVvZiB0byA9PT0gXCJzdHJpbmdcIiA/IHRvIDogY3JlYXRlUGF0aCh0byk7XG4gICAgaW52YXJpYW50KGJhc2UsIFwiTm8gd2luZG93LmxvY2F0aW9uLihvcmlnaW58aHJlZikgYXZhaWxhYmxlIHRvIGNyZWF0ZSBVUkwgZm9yIGhyZWY6IFwiICsgaHJlZik7XG4gICAgcmV0dXJuIG5ldyBVUkwoaHJlZiwgYmFzZSk7XG4gIH1cbiAgbGV0IGhpc3RvcnkgPSB7XG4gICAgZ2V0IGFjdGlvbigpIHtcbiAgICAgIHJldHVybiBhY3Rpb247XG4gICAgfSxcbiAgICBnZXQgbG9jYXRpb24oKSB7XG4gICAgICByZXR1cm4gZ2V0TG9jYXRpb24od2luZG93LCBnbG9iYWxIaXN0b3J5KTtcbiAgICB9LFxuICAgIGxpc3Rlbihmbikge1xuICAgICAgaWYgKGxpc3RlbmVyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkEgaGlzdG9yeSBvbmx5IGFjY2VwdHMgb25lIGFjdGl2ZSBsaXN0ZW5lclwiKTtcbiAgICAgIH1cbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFBvcFN0YXRlRXZlbnRUeXBlLCBoYW5kbGVQb3ApO1xuICAgICAgbGlzdGVuZXIgPSBmbjtcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFBvcFN0YXRlRXZlbnRUeXBlLCBoYW5kbGVQb3ApO1xuICAgICAgICBsaXN0ZW5lciA9IG51bGw7XG4gICAgICB9O1xuICAgIH0sXG4gICAgY3JlYXRlSHJlZih0bykge1xuICAgICAgcmV0dXJuIGNyZWF0ZUhyZWYod2luZG93LCB0byk7XG4gICAgfSxcbiAgICBjcmVhdGVVUkwsXG4gICAgZW5jb2RlTG9jYXRpb24odG8pIHtcbiAgICAgIC8vIEVuY29kZSBhIExvY2F0aW9uIHRoZSBzYW1lIHdheSB3aW5kb3cubG9jYXRpb24gd291bGRcbiAgICAgIGxldCB1cmwgPSBjcmVhdGVVUkwodG8pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGF0aG5hbWU6IHVybC5wYXRobmFtZSxcbiAgICAgICAgc2VhcmNoOiB1cmwuc2VhcmNoLFxuICAgICAgICBoYXNoOiB1cmwuaGFzaFxuICAgICAgfTtcbiAgICB9LFxuICAgIHB1c2gsXG4gICAgcmVwbGFjZSxcbiAgICBnbyhuKSB7XG4gICAgICByZXR1cm4gZ2xvYmFsSGlzdG9yeS5nbyhuKTtcbiAgICB9XG4gIH07XG4gIHJldHVybiBoaXN0b3J5O1xufVxuLy8jZW5kcmVnaW9uXG5cbnZhciBSZXN1bHRUeXBlO1xuKGZ1bmN0aW9uIChSZXN1bHRUeXBlKSB7XG4gIFJlc3VsdFR5cGVbXCJkYXRhXCJdID0gXCJkYXRhXCI7XG4gIFJlc3VsdFR5cGVbXCJkZWZlcnJlZFwiXSA9IFwiZGVmZXJyZWRcIjtcbiAgUmVzdWx0VHlwZVtcInJlZGlyZWN0XCJdID0gXCJyZWRpcmVjdFwiO1xuICBSZXN1bHRUeXBlW1wiZXJyb3JcIl0gPSBcImVycm9yXCI7XG59KShSZXN1bHRUeXBlIHx8IChSZXN1bHRUeXBlID0ge30pKTtcbmNvbnN0IGltbXV0YWJsZVJvdXRlS2V5cyA9IG5ldyBTZXQoW1wibGF6eVwiLCBcImNhc2VTZW5zaXRpdmVcIiwgXCJwYXRoXCIsIFwiaWRcIiwgXCJpbmRleFwiLCBcImNoaWxkcmVuXCJdKTtcbmZ1bmN0aW9uIGlzSW5kZXhSb3V0ZShyb3V0ZSkge1xuICByZXR1cm4gcm91dGUuaW5kZXggPT09IHRydWU7XG59XG4vLyBXYWxrIHRoZSByb3V0ZSB0cmVlIGdlbmVyYXRpbmcgdW5pcXVlIElEcyB3aGVyZSBuZWNlc3NhcnksIHNvIHdlIGFyZSB3b3JraW5nXG4vLyBzb2xlbHkgd2l0aCBBZ25vc3RpY0RhdGFSb3V0ZU9iamVjdCdzIHdpdGhpbiB0aGUgUm91dGVyXG5mdW5jdGlvbiBjb252ZXJ0Um91dGVzVG9EYXRhUm91dGVzKHJvdXRlcywgbWFwUm91dGVQcm9wZXJ0aWVzLCBwYXJlbnRQYXRoLCBtYW5pZmVzdCkge1xuICBpZiAocGFyZW50UGF0aCA9PT0gdm9pZCAwKSB7XG4gICAgcGFyZW50UGF0aCA9IFtdO1xuICB9XG4gIGlmIChtYW5pZmVzdCA9PT0gdm9pZCAwKSB7XG4gICAgbWFuaWZlc3QgPSB7fTtcbiAgfVxuICByZXR1cm4gcm91dGVzLm1hcCgocm91dGUsIGluZGV4KSA9PiB7XG4gICAgbGV0IHRyZWVQYXRoID0gWy4uLnBhcmVudFBhdGgsIGluZGV4XTtcbiAgICBsZXQgaWQgPSB0eXBlb2Ygcm91dGUuaWQgPT09IFwic3RyaW5nXCIgPyByb3V0ZS5pZCA6IHRyZWVQYXRoLmpvaW4oXCItXCIpO1xuICAgIGludmFyaWFudChyb3V0ZS5pbmRleCAhPT0gdHJ1ZSB8fCAhcm91dGUuY2hpbGRyZW4sIFwiQ2Fubm90IHNwZWNpZnkgY2hpbGRyZW4gb24gYW4gaW5kZXggcm91dGVcIik7XG4gICAgaW52YXJpYW50KCFtYW5pZmVzdFtpZF0sIFwiRm91bmQgYSByb3V0ZSBpZCBjb2xsaXNpb24gb24gaWQgXFxcIlwiICsgaWQgKyBcIlxcXCIuICBSb3V0ZSBcIiArIFwiaWQncyBtdXN0IGJlIGdsb2JhbGx5IHVuaXF1ZSB3aXRoaW4gRGF0YSBSb3V0ZXIgdXNhZ2VzXCIpO1xuICAgIGlmIChpc0luZGV4Um91dGUocm91dGUpKSB7XG4gICAgICBsZXQgaW5kZXhSb3V0ZSA9IF9leHRlbmRzKHt9LCByb3V0ZSwgbWFwUm91dGVQcm9wZXJ0aWVzKHJvdXRlKSwge1xuICAgICAgICBpZFxuICAgICAgfSk7XG4gICAgICBtYW5pZmVzdFtpZF0gPSBpbmRleFJvdXRlO1xuICAgICAgcmV0dXJuIGluZGV4Um91dGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBwYXRoT3JMYXlvdXRSb3V0ZSA9IF9leHRlbmRzKHt9LCByb3V0ZSwgbWFwUm91dGVQcm9wZXJ0aWVzKHJvdXRlKSwge1xuICAgICAgICBpZCxcbiAgICAgICAgY2hpbGRyZW46IHVuZGVmaW5lZFxuICAgICAgfSk7XG4gICAgICBtYW5pZmVzdFtpZF0gPSBwYXRoT3JMYXlvdXRSb3V0ZTtcbiAgICAgIGlmIChyb3V0ZS5jaGlsZHJlbikge1xuICAgICAgICBwYXRoT3JMYXlvdXRSb3V0ZS5jaGlsZHJlbiA9IGNvbnZlcnRSb3V0ZXNUb0RhdGFSb3V0ZXMocm91dGUuY2hpbGRyZW4sIG1hcFJvdXRlUHJvcGVydGllcywgdHJlZVBhdGgsIG1hbmlmZXN0KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXRoT3JMYXlvdXRSb3V0ZTtcbiAgICB9XG4gIH0pO1xufVxuLyoqXG4gKiBNYXRjaGVzIHRoZSBnaXZlbiByb3V0ZXMgdG8gYSBsb2NhdGlvbiBhbmQgcmV0dXJucyB0aGUgbWF0Y2ggZGF0YS5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vcmVhY3Ryb3V0ZXIuY29tL3V0aWxzL21hdGNoLXJvdXRlc1xuICovXG5mdW5jdGlvbiBtYXRjaFJvdXRlcyhyb3V0ZXMsIGxvY2F0aW9uQXJnLCBiYXNlbmFtZSkge1xuICBpZiAoYmFzZW5hbWUgPT09IHZvaWQgMCkge1xuICAgIGJhc2VuYW1lID0gXCIvXCI7XG4gIH1cbiAgbGV0IGxvY2F0aW9uID0gdHlwZW9mIGxvY2F0aW9uQXJnID09PSBcInN0cmluZ1wiID8gcGFyc2VQYXRoKGxvY2F0aW9uQXJnKSA6IGxvY2F0aW9uQXJnO1xuICBsZXQgcGF0aG5hbWUgPSBzdHJpcEJhc2VuYW1lKGxvY2F0aW9uLnBhdGhuYW1lIHx8IFwiL1wiLCBiYXNlbmFtZSk7XG4gIGlmIChwYXRobmFtZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgbGV0IGJyYW5jaGVzID0gZmxhdHRlblJvdXRlcyhyb3V0ZXMpO1xuICByYW5rUm91dGVCcmFuY2hlcyhicmFuY2hlcyk7XG4gIGxldCBtYXRjaGVzID0gbnVsbDtcbiAgZm9yIChsZXQgaSA9IDA7IG1hdGNoZXMgPT0gbnVsbCAmJiBpIDwgYnJhbmNoZXMubGVuZ3RoOyArK2kpIHtcbiAgICBtYXRjaGVzID0gbWF0Y2hSb3V0ZUJyYW5jaChicmFuY2hlc1tpXSxcbiAgICAvLyBJbmNvbWluZyBwYXRobmFtZXMgYXJlIGdlbmVyYWxseSBlbmNvZGVkIGZyb20gZWl0aGVyIHdpbmRvdy5sb2NhdGlvblxuICAgIC8vIG9yIGZyb20gcm91dGVyLm5hdmlnYXRlLCBidXQgd2Ugd2FudCB0byBtYXRjaCBhZ2FpbnN0IHRoZSB1bmVuY29kZWRcbiAgICAvLyBwYXRocyBpbiB0aGUgcm91dGUgZGVmaW5pdGlvbnMuICBNZW1vcnkgcm91dGVyIGxvY2F0aW9ucyB3b24ndCBiZVxuICAgIC8vIGVuY29kZWQgaGVyZSBidXQgdGhlcmUgYWxzbyBzaG91bGRuJ3QgYmUgYW55dGhpbmcgdG8gZGVjb2RlIHNvIHRoaXNcbiAgICAvLyBzaG91bGQgYmUgYSBzYWZlIG9wZXJhdGlvbi4gIFRoaXMgYXZvaWRzIG5lZWRpbmcgbWF0Y2hSb3V0ZXMgdG8gYmVcbiAgICAvLyBoaXN0b3J5LWF3YXJlLlxuICAgIHNhZmVseURlY29kZVVSSShwYXRobmFtZSkpO1xuICB9XG4gIHJldHVybiBtYXRjaGVzO1xufVxuZnVuY3Rpb24gY29udmVydFJvdXRlTWF0Y2hUb1VpTWF0Y2gobWF0Y2gsIGxvYWRlckRhdGEpIHtcbiAgbGV0IHtcbiAgICByb3V0ZSxcbiAgICBwYXRobmFtZSxcbiAgICBwYXJhbXNcbiAgfSA9IG1hdGNoO1xuICByZXR1cm4ge1xuICAgIGlkOiByb3V0ZS5pZCxcbiAgICBwYXRobmFtZSxcbiAgICBwYXJhbXMsXG4gICAgZGF0YTogbG9hZGVyRGF0YVtyb3V0ZS5pZF0sXG4gICAgaGFuZGxlOiByb3V0ZS5oYW5kbGVcbiAgfTtcbn1cbmZ1bmN0aW9uIGZsYXR0ZW5Sb3V0ZXMocm91dGVzLCBicmFuY2hlcywgcGFyZW50c01ldGEsIHBhcmVudFBhdGgpIHtcbiAgaWYgKGJyYW5jaGVzID09PSB2b2lkIDApIHtcbiAgICBicmFuY2hlcyA9IFtdO1xuICB9XG4gIGlmIChwYXJlbnRzTWV0YSA9PT0gdm9pZCAwKSB7XG4gICAgcGFyZW50c01ldGEgPSBbXTtcbiAgfVxuICBpZiAocGFyZW50UGF0aCA9PT0gdm9pZCAwKSB7XG4gICAgcGFyZW50UGF0aCA9IFwiXCI7XG4gIH1cbiAgbGV0IGZsYXR0ZW5Sb3V0ZSA9IChyb3V0ZSwgaW5kZXgsIHJlbGF0aXZlUGF0aCkgPT4ge1xuICAgIGxldCBtZXRhID0ge1xuICAgICAgcmVsYXRpdmVQYXRoOiByZWxhdGl2ZVBhdGggPT09IHVuZGVmaW5lZCA/IHJvdXRlLnBhdGggfHwgXCJcIiA6IHJlbGF0aXZlUGF0aCxcbiAgICAgIGNhc2VTZW5zaXRpdmU6IHJvdXRlLmNhc2VTZW5zaXRpdmUgPT09IHRydWUsXG4gICAgICBjaGlsZHJlbkluZGV4OiBpbmRleCxcbiAgICAgIHJvdXRlXG4gICAgfTtcbiAgICBpZiAobWV0YS5yZWxhdGl2ZVBhdGguc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICAgIGludmFyaWFudChtZXRhLnJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKHBhcmVudFBhdGgpLCBcIkFic29sdXRlIHJvdXRlIHBhdGggXFxcIlwiICsgbWV0YS5yZWxhdGl2ZVBhdGggKyBcIlxcXCIgbmVzdGVkIHVuZGVyIHBhdGggXCIgKyAoXCJcXFwiXCIgKyBwYXJlbnRQYXRoICsgXCJcXFwiIGlzIG5vdCB2YWxpZC4gQW4gYWJzb2x1dGUgY2hpbGQgcm91dGUgcGF0aCBcIikgKyBcIm11c3Qgc3RhcnQgd2l0aCB0aGUgY29tYmluZWQgcGF0aCBvZiBhbGwgaXRzIHBhcmVudCByb3V0ZXMuXCIpO1xuICAgICAgbWV0YS5yZWxhdGl2ZVBhdGggPSBtZXRhLnJlbGF0aXZlUGF0aC5zbGljZShwYXJlbnRQYXRoLmxlbmd0aCk7XG4gICAgfVxuICAgIGxldCBwYXRoID0gam9pblBhdGhzKFtwYXJlbnRQYXRoLCBtZXRhLnJlbGF0aXZlUGF0aF0pO1xuICAgIGxldCByb3V0ZXNNZXRhID0gcGFyZW50c01ldGEuY29uY2F0KG1ldGEpO1xuICAgIC8vIEFkZCB0aGUgY2hpbGRyZW4gYmVmb3JlIGFkZGluZyB0aGlzIHJvdXRlIHRvIHRoZSBhcnJheSwgc28gd2UgdHJhdmVyc2UgdGhlXG4gICAgLy8gcm91dGUgdHJlZSBkZXB0aC1maXJzdCBhbmQgY2hpbGQgcm91dGVzIGFwcGVhciBiZWZvcmUgdGhlaXIgcGFyZW50cyBpblxuICAgIC8vIHRoZSBcImZsYXR0ZW5lZFwiIHZlcnNpb24uXG4gICAgaWYgKHJvdXRlLmNoaWxkcmVuICYmIHJvdXRlLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgIGludmFyaWFudChcbiAgICAgIC8vIE91ciB0eXBlcyBrbm93IGJldHRlciwgYnV0IHJ1bnRpbWUgSlMgbWF5IG5vdCFcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgIHJvdXRlLmluZGV4ICE9PSB0cnVlLCBcIkluZGV4IHJvdXRlcyBtdXN0IG5vdCBoYXZlIGNoaWxkIHJvdXRlcy4gUGxlYXNlIHJlbW92ZSBcIiArIChcImFsbCBjaGlsZCByb3V0ZXMgZnJvbSByb3V0ZSBwYXRoIFxcXCJcIiArIHBhdGggKyBcIlxcXCIuXCIpKTtcbiAgICAgIGZsYXR0ZW5Sb3V0ZXMocm91dGUuY2hpbGRyZW4sIGJyYW5jaGVzLCByb3V0ZXNNZXRhLCBwYXRoKTtcbiAgICB9XG4gICAgLy8gUm91dGVzIHdpdGhvdXQgYSBwYXRoIHNob3VsZG4ndCBldmVyIG1hdGNoIGJ5IHRoZW1zZWx2ZXMgdW5sZXNzIHRoZXkgYXJlXG4gICAgLy8gaW5kZXggcm91dGVzLCBzbyBkb24ndCBhZGQgdGhlbSB0byB0aGUgbGlzdCBvZiBwb3NzaWJsZSBicmFuY2hlcy5cbiAgICBpZiAocm91dGUucGF0aCA9PSBudWxsICYmICFyb3V0ZS5pbmRleCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBicmFuY2hlcy5wdXNoKHtcbiAgICAgIHBhdGgsXG4gICAgICBzY29yZTogY29tcHV0ZVNjb3JlKHBhdGgsIHJvdXRlLmluZGV4KSxcbiAgICAgIHJvdXRlc01ldGFcbiAgICB9KTtcbiAgfTtcbiAgcm91dGVzLmZvckVhY2goKHJvdXRlLCBpbmRleCkgPT4ge1xuICAgIHZhciBfcm91dGUkcGF0aDtcbiAgICAvLyBjb2Fyc2UtZ3JhaW4gY2hlY2sgZm9yIG9wdGlvbmFsIHBhcmFtc1xuICAgIGlmIChyb3V0ZS5wYXRoID09PSBcIlwiIHx8ICEoKF9yb3V0ZSRwYXRoID0gcm91dGUucGF0aCkgIT0gbnVsbCAmJiBfcm91dGUkcGF0aC5pbmNsdWRlcyhcIj9cIikpKSB7XG4gICAgICBmbGF0dGVuUm91dGUocm91dGUsIGluZGV4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChsZXQgZXhwbG9kZWQgb2YgZXhwbG9kZU9wdGlvbmFsU2VnbWVudHMocm91dGUucGF0aCkpIHtcbiAgICAgICAgZmxhdHRlblJvdXRlKHJvdXRlLCBpbmRleCwgZXhwbG9kZWQpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHJldHVybiBicmFuY2hlcztcbn1cbi8qKlxuICogQ29tcHV0ZXMgYWxsIGNvbWJpbmF0aW9ucyBvZiBvcHRpb25hbCBwYXRoIHNlZ21lbnRzIGZvciBhIGdpdmVuIHBhdGgsXG4gKiBleGNsdWRpbmcgY29tYmluYXRpb25zIHRoYXQgYXJlIGFtYmlndW91cyBhbmQgb2YgbG93ZXIgcHJpb3JpdHkuXG4gKlxuICogRm9yIGV4YW1wbGUsIGAvb25lLzp0d28/L3RocmVlLzpmb3VyPy86Zml2ZT9gIGV4cGxvZGVzIHRvOlxuICogLSBgL29uZS90aHJlZWBcbiAqIC0gYC9vbmUvOnR3by90aHJlZWBcbiAqIC0gYC9vbmUvdGhyZWUvOmZvdXJgXG4gKiAtIGAvb25lL3RocmVlLzpmaXZlYFxuICogLSBgL29uZS86dHdvL3RocmVlLzpmb3VyYFxuICogLSBgL29uZS86dHdvL3RocmVlLzpmaXZlYFxuICogLSBgL29uZS90aHJlZS86Zm91ci86Zml2ZWBcbiAqIC0gYC9vbmUvOnR3by90aHJlZS86Zm91ci86Zml2ZWBcbiAqL1xuZnVuY3Rpb24gZXhwbG9kZU9wdGlvbmFsU2VnbWVudHMocGF0aCkge1xuICBsZXQgc2VnbWVudHMgPSBwYXRoLnNwbGl0KFwiL1wiKTtcbiAgaWYgKHNlZ21lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuICBsZXQgW2ZpcnN0LCAuLi5yZXN0XSA9IHNlZ21lbnRzO1xuICAvLyBPcHRpb25hbCBwYXRoIHNlZ21lbnRzIGFyZSBkZW5vdGVkIGJ5IGEgdHJhaWxpbmcgYD9gXG4gIGxldCBpc09wdGlvbmFsID0gZmlyc3QuZW5kc1dpdGgoXCI/XCIpO1xuICAvLyBDb21wdXRlIHRoZSBjb3JyZXNwb25kaW5nIHJlcXVpcmVkIHNlZ21lbnQ6IGBmb28/YCAtPiBgZm9vYFxuICBsZXQgcmVxdWlyZWQgPSBmaXJzdC5yZXBsYWNlKC9cXD8kLywgXCJcIik7XG4gIGlmIChyZXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgIC8vIEludGVwcmV0IGVtcHR5IHN0cmluZyBhcyBvbWl0dGluZyBhbiBvcHRpb25hbCBzZWdtZW50XG4gICAgLy8gYFtcIm9uZVwiLCBcIlwiLCBcInRocmVlXCJdYCBjb3JyZXNwb25kcyB0byBvbWl0dGluZyBgOnR3b2AgZnJvbSBgL29uZS86dHdvPy90aHJlZWAgLT4gYC9vbmUvdGhyZWVgXG4gICAgcmV0dXJuIGlzT3B0aW9uYWwgPyBbcmVxdWlyZWQsIFwiXCJdIDogW3JlcXVpcmVkXTtcbiAgfVxuICBsZXQgcmVzdEV4cGxvZGVkID0gZXhwbG9kZU9wdGlvbmFsU2VnbWVudHMocmVzdC5qb2luKFwiL1wiKSk7XG4gIGxldCByZXN1bHQgPSBbXTtcbiAgLy8gQWxsIGNoaWxkIHBhdGhzIHdpdGggdGhlIHByZWZpeC4gIERvIHRoaXMgZm9yIGFsbCBjaGlsZHJlbiBiZWZvcmUgdGhlXG4gIC8vIG9wdGlvbmFsIHZlcnNpb24gZm9yIGFsbCBjaGlsZHJlbiwgc28gd2UgZ2V0IGNvbnNpc3RlbnQgb3JkZXJpbmcgd2hlcmUgdGhlXG4gIC8vIHBhcmVudCBvcHRpb25hbCBhc3BlY3QgaXMgcHJlZmVycmVkIGFzIHJlcXVpcmVkLiAgT3RoZXJ3aXNlLCB3ZSBjYW4gZ2V0XG4gIC8vIGNoaWxkIHNlY3Rpb25zIGludGVyc3BlcnNlZCB3aGVyZSBkZWVwZXIgb3B0aW9uYWwgc2VnbWVudHMgYXJlIGhpZ2hlciB0aGFuXG4gIC8vIHBhcmVudCBvcHRpb25hbCBzZWdtZW50cywgd2hlcmUgZm9yIGV4YW1wbGUsIC86dHdvIHdvdWxkIGV4cGxvZGUgX2VhcmxpZXJfXG4gIC8vIHRoZW4gLzpvbmUuICBCeSBhbHdheXMgaW5jbHVkaW5nIHRoZSBwYXJlbnQgYXMgcmVxdWlyZWQgX2ZvciBhbGwgY2hpbGRyZW5fXG4gIC8vIGZpcnN0LCB3ZSBhdm9pZCB0aGlzIGlzc3VlXG4gIHJlc3VsdC5wdXNoKC4uLnJlc3RFeHBsb2RlZC5tYXAoc3VicGF0aCA9PiBzdWJwYXRoID09PSBcIlwiID8gcmVxdWlyZWQgOiBbcmVxdWlyZWQsIHN1YnBhdGhdLmpvaW4oXCIvXCIpKSk7XG4gIC8vIFRoZW4sIGlmIHRoaXMgaXMgYW4gb3B0aW9uYWwgdmFsdWUsIGFkZCBhbGwgY2hpbGQgdmVyc2lvbnMgd2l0aG91dFxuICBpZiAoaXNPcHRpb25hbCkge1xuICAgIHJlc3VsdC5wdXNoKC4uLnJlc3RFeHBsb2RlZCk7XG4gIH1cbiAgLy8gZm9yIGFic29sdXRlIHBhdGhzLCBlbnN1cmUgYC9gIGluc3RlYWQgb2YgZW1wdHkgc2VnbWVudFxuICByZXR1cm4gcmVzdWx0Lm1hcChleHBsb2RlZCA9PiBwYXRoLnN0YXJ0c1dpdGgoXCIvXCIpICYmIGV4cGxvZGVkID09PSBcIlwiID8gXCIvXCIgOiBleHBsb2RlZCk7XG59XG5mdW5jdGlvbiByYW5rUm91dGVCcmFuY2hlcyhicmFuY2hlcykge1xuICBicmFuY2hlcy5zb3J0KChhLCBiKSA9PiBhLnNjb3JlICE9PSBiLnNjb3JlID8gYi5zY29yZSAtIGEuc2NvcmUgLy8gSGlnaGVyIHNjb3JlIGZpcnN0XG4gIDogY29tcGFyZUluZGV4ZXMoYS5yb3V0ZXNNZXRhLm1hcChtZXRhID0+IG1ldGEuY2hpbGRyZW5JbmRleCksIGIucm91dGVzTWV0YS5tYXAobWV0YSA9PiBtZXRhLmNoaWxkcmVuSW5kZXgpKSk7XG59XG5jb25zdCBwYXJhbVJlID0gL146XFx3KyQvO1xuY29uc3QgZHluYW1pY1NlZ21lbnRWYWx1ZSA9IDM7XG5jb25zdCBpbmRleFJvdXRlVmFsdWUgPSAyO1xuY29uc3QgZW1wdHlTZWdtZW50VmFsdWUgPSAxO1xuY29uc3Qgc3RhdGljU2VnbWVudFZhbHVlID0gMTA7XG5jb25zdCBzcGxhdFBlbmFsdHkgPSAtMjtcbmNvbnN0IGlzU3BsYXQgPSBzID0+IHMgPT09IFwiKlwiO1xuZnVuY3Rpb24gY29tcHV0ZVNjb3JlKHBhdGgsIGluZGV4KSB7XG4gIGxldCBzZWdtZW50cyA9IHBhdGguc3BsaXQoXCIvXCIpO1xuICBsZXQgaW5pdGlhbFNjb3JlID0gc2VnbWVudHMubGVuZ3RoO1xuICBpZiAoc2VnbWVudHMuc29tZShpc1NwbGF0KSkge1xuICAgIGluaXRpYWxTY29yZSArPSBzcGxhdFBlbmFsdHk7XG4gIH1cbiAgaWYgKGluZGV4KSB7XG4gICAgaW5pdGlhbFNjb3JlICs9IGluZGV4Um91dGVWYWx1ZTtcbiAgfVxuICByZXR1cm4gc2VnbWVudHMuZmlsdGVyKHMgPT4gIWlzU3BsYXQocykpLnJlZHVjZSgoc2NvcmUsIHNlZ21lbnQpID0+IHNjb3JlICsgKHBhcmFtUmUudGVzdChzZWdtZW50KSA/IGR5bmFtaWNTZWdtZW50VmFsdWUgOiBzZWdtZW50ID09PSBcIlwiID8gZW1wdHlTZWdtZW50VmFsdWUgOiBzdGF0aWNTZWdtZW50VmFsdWUpLCBpbml0aWFsU2NvcmUpO1xufVxuZnVuY3Rpb24gY29tcGFyZUluZGV4ZXMoYSwgYikge1xuICBsZXQgc2libGluZ3MgPSBhLmxlbmd0aCA9PT0gYi5sZW5ndGggJiYgYS5zbGljZSgwLCAtMSkuZXZlcnkoKG4sIGkpID0+IG4gPT09IGJbaV0pO1xuICByZXR1cm4gc2libGluZ3MgP1xuICAvLyBJZiB0d28gcm91dGVzIGFyZSBzaWJsaW5ncywgd2Ugc2hvdWxkIHRyeSB0byBtYXRjaCB0aGUgZWFybGllciBzaWJsaW5nXG4gIC8vIGZpcnN0LiBUaGlzIGFsbG93cyBwZW9wbGUgdG8gaGF2ZSBmaW5lLWdyYWluZWQgY29udHJvbCBvdmVyIHRoZSBtYXRjaGluZ1xuICAvLyBiZWhhdmlvciBieSBzaW1wbHkgcHV0dGluZyByb3V0ZXMgd2l0aCBpZGVudGljYWwgcGF0aHMgaW4gdGhlIG9yZGVyIHRoZXlcbiAgLy8gd2FudCB0aGVtIHRyaWVkLlxuICBhW2EubGVuZ3RoIC0gMV0gLSBiW2IubGVuZ3RoIC0gMV0gOlxuICAvLyBPdGhlcndpc2UsIGl0IGRvZXNuJ3QgcmVhbGx5IG1ha2Ugc2Vuc2UgdG8gcmFuayBub24tc2libGluZ3MgYnkgaW5kZXgsXG4gIC8vIHNvIHRoZXkgc29ydCBlcXVhbGx5LlxuICAwO1xufVxuZnVuY3Rpb24gbWF0Y2hSb3V0ZUJyYW5jaChicmFuY2gsIHBhdGhuYW1lKSB7XG4gIGxldCB7XG4gICAgcm91dGVzTWV0YVxuICB9ID0gYnJhbmNoO1xuICBsZXQgbWF0Y2hlZFBhcmFtcyA9IHt9O1xuICBsZXQgbWF0Y2hlZFBhdGhuYW1lID0gXCIvXCI7XG4gIGxldCBtYXRjaGVzID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcm91dGVzTWV0YS5sZW5ndGg7ICsraSkge1xuICAgIGxldCBtZXRhID0gcm91dGVzTWV0YVtpXTtcbiAgICBsZXQgZW5kID0gaSA9PT0gcm91dGVzTWV0YS5sZW5ndGggLSAxO1xuICAgIGxldCByZW1haW5pbmdQYXRobmFtZSA9IG1hdGNoZWRQYXRobmFtZSA9PT0gXCIvXCIgPyBwYXRobmFtZSA6IHBhdGhuYW1lLnNsaWNlKG1hdGNoZWRQYXRobmFtZS5sZW5ndGgpIHx8IFwiL1wiO1xuICAgIGxldCBtYXRjaCA9IG1hdGNoUGF0aCh7XG4gICAgICBwYXRoOiBtZXRhLnJlbGF0aXZlUGF0aCxcbiAgICAgIGNhc2VTZW5zaXRpdmU6IG1ldGEuY2FzZVNlbnNpdGl2ZSxcbiAgICAgIGVuZFxuICAgIH0sIHJlbWFpbmluZ1BhdGhuYW1lKTtcbiAgICBpZiAoIW1hdGNoKSByZXR1cm4gbnVsbDtcbiAgICBPYmplY3QuYXNzaWduKG1hdGNoZWRQYXJhbXMsIG1hdGNoLnBhcmFtcyk7XG4gICAgbGV0IHJvdXRlID0gbWV0YS5yb3V0ZTtcbiAgICBtYXRjaGVzLnB1c2goe1xuICAgICAgLy8gVE9ETzogQ2FuIHRoaXMgYXMgYmUgYXZvaWRlZD9cbiAgICAgIHBhcmFtczogbWF0Y2hlZFBhcmFtcyxcbiAgICAgIHBhdGhuYW1lOiBqb2luUGF0aHMoW21hdGNoZWRQYXRobmFtZSwgbWF0Y2gucGF0aG5hbWVdKSxcbiAgICAgIHBhdGhuYW1lQmFzZTogbm9ybWFsaXplUGF0aG5hbWUoam9pblBhdGhzKFttYXRjaGVkUGF0aG5hbWUsIG1hdGNoLnBhdGhuYW1lQmFzZV0pKSxcbiAgICAgIHJvdXRlXG4gICAgfSk7XG4gICAgaWYgKG1hdGNoLnBhdGhuYW1lQmFzZSAhPT0gXCIvXCIpIHtcbiAgICAgIG1hdGNoZWRQYXRobmFtZSA9IGpvaW5QYXRocyhbbWF0Y2hlZFBhdGhuYW1lLCBtYXRjaC5wYXRobmFtZUJhc2VdKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1hdGNoZXM7XG59XG4vKipcbiAqIFJldHVybnMgYSBwYXRoIHdpdGggcGFyYW1zIGludGVycG9sYXRlZC5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vcmVhY3Ryb3V0ZXIuY29tL3V0aWxzL2dlbmVyYXRlLXBhdGhcbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVQYXRoKG9yaWdpbmFsUGF0aCwgcGFyYW1zKSB7XG4gIGlmIChwYXJhbXMgPT09IHZvaWQgMCkge1xuICAgIHBhcmFtcyA9IHt9O1xuICB9XG4gIGxldCBwYXRoID0gb3JpZ2luYWxQYXRoO1xuICBpZiAocGF0aC5lbmRzV2l0aChcIipcIikgJiYgcGF0aCAhPT0gXCIqXCIgJiYgIXBhdGguZW5kc1dpdGgoXCIvKlwiKSkge1xuICAgIHdhcm5pbmcoZmFsc2UsIFwiUm91dGUgcGF0aCBcXFwiXCIgKyBwYXRoICsgXCJcXFwiIHdpbGwgYmUgdHJlYXRlZCBhcyBpZiBpdCB3ZXJlIFwiICsgKFwiXFxcIlwiICsgcGF0aC5yZXBsYWNlKC9cXCokLywgXCIvKlwiKSArIFwiXFxcIiBiZWNhdXNlIHRoZSBgKmAgY2hhcmFjdGVyIG11c3QgXCIpICsgXCJhbHdheXMgZm9sbG93IGEgYC9gIGluIHRoZSBwYXR0ZXJuLiBUbyBnZXQgcmlkIG9mIHRoaXMgd2FybmluZywgXCIgKyAoXCJwbGVhc2UgY2hhbmdlIHRoZSByb3V0ZSBwYXRoIHRvIFxcXCJcIiArIHBhdGgucmVwbGFjZSgvXFwqJC8sIFwiLypcIikgKyBcIlxcXCIuXCIpKTtcbiAgICBwYXRoID0gcGF0aC5yZXBsYWNlKC9cXCokLywgXCIvKlwiKTtcbiAgfVxuICAvLyBlbnN1cmUgYC9gIGlzIGFkZGVkIGF0IHRoZSBiZWdpbm5pbmcgaWYgdGhlIHBhdGggaXMgYWJzb2x1dGVcbiAgY29uc3QgcHJlZml4ID0gcGF0aC5zdGFydHNXaXRoKFwiL1wiKSA/IFwiL1wiIDogXCJcIjtcbiAgY29uc3Qgc3RyaW5naWZ5ID0gcCA9PiBwID09IG51bGwgPyBcIlwiIDogdHlwZW9mIHAgPT09IFwic3RyaW5nXCIgPyBwIDogU3RyaW5nKHApO1xuICBjb25zdCBzZWdtZW50cyA9IHBhdGguc3BsaXQoL1xcLysvKS5tYXAoKHNlZ21lbnQsIGluZGV4LCBhcnJheSkgPT4ge1xuICAgIGNvbnN0IGlzTGFzdFNlZ21lbnQgPSBpbmRleCA9PT0gYXJyYXkubGVuZ3RoIC0gMTtcbiAgICAvLyBvbmx5IGFwcGx5IHRoZSBzcGxhdCBpZiBpdCdzIHRoZSBsYXN0IHNlZ21lbnRcbiAgICBpZiAoaXNMYXN0U2VnbWVudCAmJiBzZWdtZW50ID09PSBcIipcIikge1xuICAgICAgY29uc3Qgc3RhciA9IFwiKlwiO1xuICAgICAgLy8gQXBwbHkgdGhlIHNwbGF0XG4gICAgICByZXR1cm4gc3RyaW5naWZ5KHBhcmFtc1tzdGFyXSk7XG4gICAgfVxuICAgIGNvbnN0IGtleU1hdGNoID0gc2VnbWVudC5tYXRjaCgvXjooXFx3KykoXFw/PykkLyk7XG4gICAgaWYgKGtleU1hdGNoKSB7XG4gICAgICBjb25zdCBbLCBrZXksIG9wdGlvbmFsXSA9IGtleU1hdGNoO1xuICAgICAgbGV0IHBhcmFtID0gcGFyYW1zW2tleV07XG4gICAgICBpbnZhcmlhbnQob3B0aW9uYWwgPT09IFwiP1wiIHx8IHBhcmFtICE9IG51bGwsIFwiTWlzc2luZyBcXFwiOlwiICsga2V5ICsgXCJcXFwiIHBhcmFtXCIpO1xuICAgICAgcmV0dXJuIHN0cmluZ2lmeShwYXJhbSk7XG4gICAgfVxuICAgIC8vIFJlbW92ZSBhbnkgb3B0aW9uYWwgbWFya2VycyBmcm9tIG9wdGlvbmFsIHN0YXRpYyBzZWdtZW50c1xuICAgIHJldHVybiBzZWdtZW50LnJlcGxhY2UoL1xcPyQvZywgXCJcIik7XG4gIH0pXG4gIC8vIFJlbW92ZSBlbXB0eSBzZWdtZW50c1xuICAuZmlsdGVyKHNlZ21lbnQgPT4gISFzZWdtZW50KTtcbiAgcmV0dXJuIHByZWZpeCArIHNlZ21lbnRzLmpvaW4oXCIvXCIpO1xufVxuLyoqXG4gKiBQZXJmb3JtcyBwYXR0ZXJuIG1hdGNoaW5nIG9uIGEgVVJMIHBhdGhuYW1lIGFuZCByZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0XG4gKiB0aGUgbWF0Y2guXG4gKlxuICogQHNlZSBodHRwczovL3JlYWN0cm91dGVyLmNvbS91dGlscy9tYXRjaC1wYXRoXG4gKi9cbmZ1bmN0aW9uIG1hdGNoUGF0aChwYXR0ZXJuLCBwYXRobmFtZSkge1xuICBpZiAodHlwZW9mIHBhdHRlcm4gPT09IFwic3RyaW5nXCIpIHtcbiAgICBwYXR0ZXJuID0ge1xuICAgICAgcGF0aDogcGF0dGVybixcbiAgICAgIGNhc2VTZW5zaXRpdmU6IGZhbHNlLFxuICAgICAgZW5kOiB0cnVlXG4gICAgfTtcbiAgfVxuICBsZXQgW21hdGNoZXIsIGNvbXBpbGVkUGFyYW1zXSA9IGNvbXBpbGVQYXRoKHBhdHRlcm4ucGF0aCwgcGF0dGVybi5jYXNlU2Vuc2l0aXZlLCBwYXR0ZXJuLmVuZCk7XG4gIGxldCBtYXRjaCA9IHBhdGhuYW1lLm1hdGNoKG1hdGNoZXIpO1xuICBpZiAoIW1hdGNoKSByZXR1cm4gbnVsbDtcbiAgbGV0IG1hdGNoZWRQYXRobmFtZSA9IG1hdGNoWzBdO1xuICBsZXQgcGF0aG5hbWVCYXNlID0gbWF0Y2hlZFBhdGhuYW1lLnJlcGxhY2UoLyguKVxcLyskLywgXCIkMVwiKTtcbiAgbGV0IGNhcHR1cmVHcm91cHMgPSBtYXRjaC5zbGljZSgxKTtcbiAgbGV0IHBhcmFtcyA9IGNvbXBpbGVkUGFyYW1zLnJlZHVjZSgobWVtbywgX3JlZiwgaW5kZXgpID0+IHtcbiAgICBsZXQge1xuICAgICAgcGFyYW1OYW1lLFxuICAgICAgaXNPcHRpb25hbFxuICAgIH0gPSBfcmVmO1xuICAgIC8vIFdlIG5lZWQgdG8gY29tcHV0ZSB0aGUgcGF0aG5hbWVCYXNlIGhlcmUgdXNpbmcgdGhlIHJhdyBzcGxhdCB2YWx1ZVxuICAgIC8vIGluc3RlYWQgb2YgdXNpbmcgcGFyYW1zW1wiKlwiXSBsYXRlciBiZWNhdXNlIGl0IHdpbGwgYmUgZGVjb2RlZCB0aGVuXG4gICAgaWYgKHBhcmFtTmFtZSA9PT0gXCIqXCIpIHtcbiAgICAgIGxldCBzcGxhdFZhbHVlID0gY2FwdHVyZUdyb3Vwc1tpbmRleF0gfHwgXCJcIjtcbiAgICAgIHBhdGhuYW1lQmFzZSA9IG1hdGNoZWRQYXRobmFtZS5zbGljZSgwLCBtYXRjaGVkUGF0aG5hbWUubGVuZ3RoIC0gc3BsYXRWYWx1ZS5sZW5ndGgpLnJlcGxhY2UoLyguKVxcLyskLywgXCIkMVwiKTtcbiAgICB9XG4gICAgY29uc3QgdmFsdWUgPSBjYXB0dXJlR3JvdXBzW2luZGV4XTtcbiAgICBpZiAoaXNPcHRpb25hbCAmJiAhdmFsdWUpIHtcbiAgICAgIG1lbW9bcGFyYW1OYW1lXSA9IHVuZGVmaW5lZDtcbiAgICB9IGVsc2Uge1xuICAgICAgbWVtb1twYXJhbU5hbWVdID0gc2FmZWx5RGVjb2RlVVJJQ29tcG9uZW50KHZhbHVlIHx8IFwiXCIsIHBhcmFtTmFtZSk7XG4gICAgfVxuICAgIHJldHVybiBtZW1vO1xuICB9LCB7fSk7XG4gIHJldHVybiB7XG4gICAgcGFyYW1zLFxuICAgIHBhdGhuYW1lOiBtYXRjaGVkUGF0aG5hbWUsXG4gICAgcGF0aG5hbWVCYXNlLFxuICAgIHBhdHRlcm5cbiAgfTtcbn1cbmZ1bmN0aW9uIGNvbXBpbGVQYXRoKHBhdGgsIGNhc2VTZW5zaXRpdmUsIGVuZCkge1xuICBpZiAoY2FzZVNlbnNpdGl2ZSA9PT0gdm9pZCAwKSB7XG4gICAgY2FzZVNlbnNpdGl2ZSA9IGZhbHNlO1xuICB9XG4gIGlmIChlbmQgPT09IHZvaWQgMCkge1xuICAgIGVuZCA9IHRydWU7XG4gIH1cbiAgd2FybmluZyhwYXRoID09PSBcIipcIiB8fCAhcGF0aC5lbmRzV2l0aChcIipcIikgfHwgcGF0aC5lbmRzV2l0aChcIi8qXCIpLCBcIlJvdXRlIHBhdGggXFxcIlwiICsgcGF0aCArIFwiXFxcIiB3aWxsIGJlIHRyZWF0ZWQgYXMgaWYgaXQgd2VyZSBcIiArIChcIlxcXCJcIiArIHBhdGgucmVwbGFjZSgvXFwqJC8sIFwiLypcIikgKyBcIlxcXCIgYmVjYXVzZSB0aGUgYCpgIGNoYXJhY3RlciBtdXN0IFwiKSArIFwiYWx3YXlzIGZvbGxvdyBhIGAvYCBpbiB0aGUgcGF0dGVybi4gVG8gZ2V0IHJpZCBvZiB0aGlzIHdhcm5pbmcsIFwiICsgKFwicGxlYXNlIGNoYW5nZSB0aGUgcm91dGUgcGF0aCB0byBcXFwiXCIgKyBwYXRoLnJlcGxhY2UoL1xcKiQvLCBcIi8qXCIpICsgXCJcXFwiLlwiKSk7XG4gIGxldCBwYXJhbXMgPSBbXTtcbiAgbGV0IHJlZ2V4cFNvdXJjZSA9IFwiXlwiICsgcGF0aC5yZXBsYWNlKC9cXC8qXFwqPyQvLCBcIlwiKSAvLyBJZ25vcmUgdHJhaWxpbmcgLyBhbmQgLyosIHdlJ2xsIGhhbmRsZSBpdCBiZWxvd1xuICAucmVwbGFjZSgvXlxcLyovLCBcIi9cIikgLy8gTWFrZSBzdXJlIGl0IGhhcyBhIGxlYWRpbmcgL1xuICAucmVwbGFjZSgvW1xcXFwuKiteJHt9fCgpW1xcXV0vZywgXCJcXFxcJCZcIikgLy8gRXNjYXBlIHNwZWNpYWwgcmVnZXggY2hhcnNcbiAgLnJlcGxhY2UoL1xcLzooXFx3KykoXFw/KT8vZywgKF8sIHBhcmFtTmFtZSwgaXNPcHRpb25hbCkgPT4ge1xuICAgIHBhcmFtcy5wdXNoKHtcbiAgICAgIHBhcmFtTmFtZSxcbiAgICAgIGlzT3B0aW9uYWw6IGlzT3B0aW9uYWwgIT0gbnVsbFxuICAgIH0pO1xuICAgIHJldHVybiBpc09wdGlvbmFsID8gXCIvPyhbXlxcXFwvXSspP1wiIDogXCIvKFteXFxcXC9dKylcIjtcbiAgfSk7XG4gIGlmIChwYXRoLmVuZHNXaXRoKFwiKlwiKSkge1xuICAgIHBhcmFtcy5wdXNoKHtcbiAgICAgIHBhcmFtTmFtZTogXCIqXCJcbiAgICB9KTtcbiAgICByZWdleHBTb3VyY2UgKz0gcGF0aCA9PT0gXCIqXCIgfHwgcGF0aCA9PT0gXCIvKlwiID8gXCIoLiopJFwiIC8vIEFscmVhZHkgbWF0Y2hlZCB0aGUgaW5pdGlhbCAvLCBqdXN0IG1hdGNoIHRoZSByZXN0XG4gICAgOiBcIig/OlxcXFwvKC4rKXxcXFxcLyopJFwiOyAvLyBEb24ndCBpbmNsdWRlIHRoZSAvIGluIHBhcmFtc1tcIipcIl1cbiAgfSBlbHNlIGlmIChlbmQpIHtcbiAgICAvLyBXaGVuIG1hdGNoaW5nIHRvIHRoZSBlbmQsIGlnbm9yZSB0cmFpbGluZyBzbGFzaGVzXG4gICAgcmVnZXhwU291cmNlICs9IFwiXFxcXC8qJFwiO1xuICB9IGVsc2UgaWYgKHBhdGggIT09IFwiXCIgJiYgcGF0aCAhPT0gXCIvXCIpIHtcbiAgICAvLyBJZiBvdXIgcGF0aCBpcyBub24tZW1wdHkgYW5kIGNvbnRhaW5zIGFueXRoaW5nIGJleW9uZCBhbiBpbml0aWFsIHNsYXNoLFxuICAgIC8vIHRoZW4gd2UgaGF2ZSBfc29tZV8gZm9ybSBvZiBwYXRoIGluIG91ciByZWdleCwgc28gd2Ugc2hvdWxkIGV4cGVjdCB0b1xuICAgIC8vIG1hdGNoIG9ubHkgaWYgd2UgZmluZCB0aGUgZW5kIG9mIHRoaXMgcGF0aCBzZWdtZW50LiAgTG9vayBmb3IgYW4gb3B0aW9uYWxcbiAgICAvLyBub24tY2FwdHVyZWQgdHJhaWxpbmcgc2xhc2ggKHRvIG1hdGNoIGEgcG9ydGlvbiBvZiB0aGUgVVJMKSBvciB0aGUgZW5kXG4gICAgLy8gb2YgdGhlIHBhdGggKGlmIHdlJ3ZlIG1hdGNoZWQgdG8gdGhlIGVuZCkuICBXZSB1c2VkIHRvIGRvIHRoaXMgd2l0aCBhXG4gICAgLy8gd29yZCBib3VuZGFyeSBidXQgdGhhdCBnaXZlcyBmYWxzZSBwb3NpdGl2ZXMgb24gcm91dGVzIGxpa2VcbiAgICAvLyAvdXNlci1wcmVmZXJlbmNlcyBzaW5jZSBgLWAgY291bnRzIGFzIGEgd29yZCBib3VuZGFyeS5cbiAgICByZWdleHBTb3VyY2UgKz0gXCIoPzooPz1cXFxcL3wkKSlcIjtcbiAgfSBlbHNlIDtcbiAgbGV0IG1hdGNoZXIgPSBuZXcgUmVnRXhwKHJlZ2V4cFNvdXJjZSwgY2FzZVNlbnNpdGl2ZSA/IHVuZGVmaW5lZCA6IFwiaVwiKTtcbiAgcmV0dXJuIFttYXRjaGVyLCBwYXJhbXNdO1xufVxuZnVuY3Rpb24gc2FmZWx5RGVjb2RlVVJJKHZhbHVlKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGRlY29kZVVSSSh2YWx1ZSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgd2FybmluZyhmYWxzZSwgXCJUaGUgVVJMIHBhdGggXFxcIlwiICsgdmFsdWUgKyBcIlxcXCIgY291bGQgbm90IGJlIGRlY29kZWQgYmVjYXVzZSBpdCBpcyBpcyBhIFwiICsgXCJtYWxmb3JtZWQgVVJMIHNlZ21lbnQuIFRoaXMgaXMgcHJvYmFibHkgZHVlIHRvIGEgYmFkIHBlcmNlbnQgXCIgKyAoXCJlbmNvZGluZyAoXCIgKyBlcnJvciArIFwiKS5cIikpO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufVxuZnVuY3Rpb24gc2FmZWx5RGVjb2RlVVJJQ29tcG9uZW50KHZhbHVlLCBwYXJhbU5hbWUpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHZhbHVlKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB3YXJuaW5nKGZhbHNlLCBcIlRoZSB2YWx1ZSBmb3IgdGhlIFVSTCBwYXJhbSBcXFwiXCIgKyBwYXJhbU5hbWUgKyBcIlxcXCIgd2lsbCBub3QgYmUgZGVjb2RlZCBiZWNhdXNlXCIgKyAoXCIgdGhlIHN0cmluZyBcXFwiXCIgKyB2YWx1ZSArIFwiXFxcIiBpcyBhIG1hbGZvcm1lZCBVUkwgc2VnbWVudC4gVGhpcyBpcyBwcm9iYWJseVwiKSArIChcIiBkdWUgdG8gYSBiYWQgcGVyY2VudCBlbmNvZGluZyAoXCIgKyBlcnJvciArIFwiKS5cIikpO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufVxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBzdHJpcEJhc2VuYW1lKHBhdGhuYW1lLCBiYXNlbmFtZSkge1xuICBpZiAoYmFzZW5hbWUgPT09IFwiL1wiKSByZXR1cm4gcGF0aG5hbWU7XG4gIGlmICghcGF0aG5hbWUudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKGJhc2VuYW1lLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgLy8gV2Ugd2FudCB0byBsZWF2ZSB0cmFpbGluZyBzbGFzaCBiZWhhdmlvciBpbiB0aGUgdXNlcidzIGNvbnRyb2wsIHNvIGlmIHRoZXlcbiAgLy8gc3BlY2lmeSBhIGJhc2VuYW1lIHdpdGggYSB0cmFpbGluZyBzbGFzaCwgd2Ugc2hvdWxkIHN1cHBvcnQgaXRcbiAgbGV0IHN0YXJ0SW5kZXggPSBiYXNlbmFtZS5lbmRzV2l0aChcIi9cIikgPyBiYXNlbmFtZS5sZW5ndGggLSAxIDogYmFzZW5hbWUubGVuZ3RoO1xuICBsZXQgbmV4dENoYXIgPSBwYXRobmFtZS5jaGFyQXQoc3RhcnRJbmRleCk7XG4gIGlmIChuZXh0Q2hhciAmJiBuZXh0Q2hhciAhPT0gXCIvXCIpIHtcbiAgICAvLyBwYXRobmFtZSBkb2VzIG5vdCBzdGFydCB3aXRoIGJhc2VuYW1lL1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBwYXRobmFtZS5zbGljZShzdGFydEluZGV4KSB8fCBcIi9cIjtcbn1cbi8qKlxuICogUmV0dXJucyBhIHJlc29sdmVkIHBhdGggb2JqZWN0IHJlbGF0aXZlIHRvIHRoZSBnaXZlbiBwYXRobmFtZS5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vcmVhY3Ryb3V0ZXIuY29tL3V0aWxzL3Jlc29sdmUtcGF0aFxuICovXG5mdW5jdGlvbiByZXNvbHZlUGF0aCh0bywgZnJvbVBhdGhuYW1lKSB7XG4gIGlmIChmcm9tUGF0aG5hbWUgPT09IHZvaWQgMCkge1xuICAgIGZyb21QYXRobmFtZSA9IFwiL1wiO1xuICB9XG4gIGxldCB7XG4gICAgcGF0aG5hbWU6IHRvUGF0aG5hbWUsXG4gICAgc2VhcmNoID0gXCJcIixcbiAgICBoYXNoID0gXCJcIlxuICB9ID0gdHlwZW9mIHRvID09PSBcInN0cmluZ1wiID8gcGFyc2VQYXRoKHRvKSA6IHRvO1xuICBsZXQgcGF0aG5hbWUgPSB0b1BhdGhuYW1lID8gdG9QYXRobmFtZS5zdGFydHNXaXRoKFwiL1wiKSA/IHRvUGF0aG5hbWUgOiByZXNvbHZlUGF0aG5hbWUodG9QYXRobmFtZSwgZnJvbVBhdGhuYW1lKSA6IGZyb21QYXRobmFtZTtcbiAgcmV0dXJuIHtcbiAgICBwYXRobmFtZSxcbiAgICBzZWFyY2g6IG5vcm1hbGl6ZVNlYXJjaChzZWFyY2gpLFxuICAgIGhhc2g6IG5vcm1hbGl6ZUhhc2goaGFzaClcbiAgfTtcbn1cbmZ1bmN0aW9uIHJlc29sdmVQYXRobmFtZShyZWxhdGl2ZVBhdGgsIGZyb21QYXRobmFtZSkge1xuICBsZXQgc2VnbWVudHMgPSBmcm9tUGF0aG5hbWUucmVwbGFjZSgvXFwvKyQvLCBcIlwiKS5zcGxpdChcIi9cIik7XG4gIGxldCByZWxhdGl2ZVNlZ21lbnRzID0gcmVsYXRpdmVQYXRoLnNwbGl0KFwiL1wiKTtcbiAgcmVsYXRpdmVTZWdtZW50cy5mb3JFYWNoKHNlZ21lbnQgPT4ge1xuICAgIGlmIChzZWdtZW50ID09PSBcIi4uXCIpIHtcbiAgICAgIC8vIEtlZXAgdGhlIHJvb3QgXCJcIiBzZWdtZW50IHNvIHRoZSBwYXRobmFtZSBzdGFydHMgYXQgL1xuICAgICAgaWYgKHNlZ21lbnRzLmxlbmd0aCA+IDEpIHNlZ21lbnRzLnBvcCgpO1xuICAgIH0gZWxzZSBpZiAoc2VnbWVudCAhPT0gXCIuXCIpIHtcbiAgICAgIHNlZ21lbnRzLnB1c2goc2VnbWVudCk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHNlZ21lbnRzLmxlbmd0aCA+IDEgPyBzZWdtZW50cy5qb2luKFwiL1wiKSA6IFwiL1wiO1xufVxuZnVuY3Rpb24gZ2V0SW52YWxpZFBhdGhFcnJvcihjaGFyLCBmaWVsZCwgZGVzdCwgcGF0aCkge1xuICByZXR1cm4gXCJDYW5ub3QgaW5jbHVkZSBhICdcIiArIGNoYXIgKyBcIicgY2hhcmFjdGVyIGluIGEgbWFudWFsbHkgc3BlY2lmaWVkIFwiICsgKFwiYHRvLlwiICsgZmllbGQgKyBcImAgZmllbGQgW1wiICsgSlNPTi5zdHJpbmdpZnkocGF0aCkgKyBcIl0uICBQbGVhc2Ugc2VwYXJhdGUgaXQgb3V0IHRvIHRoZSBcIikgKyAoXCJgdG8uXCIgKyBkZXN0ICsgXCJgIGZpZWxkLiBBbHRlcm5hdGl2ZWx5IHlvdSBtYXkgcHJvdmlkZSB0aGUgZnVsbCBwYXRoIGFzIFwiKSArIFwiYSBzdHJpbmcgaW4gPExpbmsgdG89XFxcIi4uLlxcXCI+IGFuZCB0aGUgcm91dGVyIHdpbGwgcGFyc2UgaXQgZm9yIHlvdS5cIjtcbn1cbi8qKlxuICogQHByaXZhdGVcbiAqXG4gKiBXaGVuIHByb2Nlc3NpbmcgcmVsYXRpdmUgbmF2aWdhdGlvbiB3ZSB3YW50IHRvIGlnbm9yZSBhbmNlc3RvciByb3V0ZXMgdGhhdFxuICogZG8gbm90IGNvbnRyaWJ1dGUgdG8gdGhlIHBhdGgsIHN1Y2ggdGhhdCBpbmRleC9wYXRobGVzcyBsYXlvdXQgcm91dGVzIGRvbid0XG4gKiBpbnRlcmZlcmUuXG4gKlxuICogRm9yIGV4YW1wbGUsIHdoZW4gbW92aW5nIGEgcm91dGUgZWxlbWVudCBpbnRvIGFuIGluZGV4IHJvdXRlIGFuZC9vciBhXG4gKiBwYXRobGVzcyBsYXlvdXQgcm91dGUsIHJlbGF0aXZlIGxpbmsgYmVoYXZpb3IgY29udGFpbmVkIHdpdGhpbiBzaG91bGQgc3RheVxuICogdGhlIHNhbWUuICBCb3RoIG9mIHRoZSBmb2xsb3dpbmcgZXhhbXBsZXMgc2hvdWxkIGxpbmsgYmFjayB0byB0aGUgcm9vdDpcbiAqXG4gKiAgIDxSb3V0ZSBwYXRoPVwiL1wiPlxuICogICAgIDxSb3V0ZSBwYXRoPVwiYWNjb3VudHNcIiBlbGVtZW50PXs8TGluayB0bz1cIi4uXCJ9PlxuICogICA8L1JvdXRlPlxuICpcbiAqICAgPFJvdXRlIHBhdGg9XCIvXCI+XG4gKiAgICAgPFJvdXRlIHBhdGg9XCJhY2NvdW50c1wiPlxuICogICAgICAgPFJvdXRlIGVsZW1lbnQ9ezxBY2NvdW50c0xheW91dCAvPn0+ICAgICAgIC8vIDwtLSBEb2VzIG5vdCBjb250cmlidXRlXG4gKiAgICAgICAgIDxSb3V0ZSBpbmRleCBlbGVtZW50PXs8TGluayB0bz1cIi4uXCJ9IC8+ICAvLyA8LS0gRG9lcyBub3QgY29udHJpYnV0ZVxuICogICAgICAgPC9Sb3V0ZVxuICogICAgIDwvUm91dGU+XG4gKiAgIDwvUm91dGU+XG4gKi9cbmZ1bmN0aW9uIGdldFBhdGhDb250cmlidXRpbmdNYXRjaGVzKG1hdGNoZXMpIHtcbiAgcmV0dXJuIG1hdGNoZXMuZmlsdGVyKChtYXRjaCwgaW5kZXgpID0+IGluZGV4ID09PSAwIHx8IG1hdGNoLnJvdXRlLnBhdGggJiYgbWF0Y2gucm91dGUucGF0aC5sZW5ndGggPiAwKTtcbn1cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVRvKHRvQXJnLCByb3V0ZVBhdGhuYW1lcywgbG9jYXRpb25QYXRobmFtZSwgaXNQYXRoUmVsYXRpdmUpIHtcbiAgaWYgKGlzUGF0aFJlbGF0aXZlID09PSB2b2lkIDApIHtcbiAgICBpc1BhdGhSZWxhdGl2ZSA9IGZhbHNlO1xuICB9XG4gIGxldCB0bztcbiAgaWYgKHR5cGVvZiB0b0FyZyA9PT0gXCJzdHJpbmdcIikge1xuICAgIHRvID0gcGFyc2VQYXRoKHRvQXJnKTtcbiAgfSBlbHNlIHtcbiAgICB0byA9IF9leHRlbmRzKHt9LCB0b0FyZyk7XG4gICAgaW52YXJpYW50KCF0by5wYXRobmFtZSB8fCAhdG8ucGF0aG5hbWUuaW5jbHVkZXMoXCI/XCIpLCBnZXRJbnZhbGlkUGF0aEVycm9yKFwiP1wiLCBcInBhdGhuYW1lXCIsIFwic2VhcmNoXCIsIHRvKSk7XG4gICAgaW52YXJpYW50KCF0by5wYXRobmFtZSB8fCAhdG8ucGF0aG5hbWUuaW5jbHVkZXMoXCIjXCIpLCBnZXRJbnZhbGlkUGF0aEVycm9yKFwiI1wiLCBcInBhdGhuYW1lXCIsIFwiaGFzaFwiLCB0bykpO1xuICAgIGludmFyaWFudCghdG8uc2VhcmNoIHx8ICF0by5zZWFyY2guaW5jbHVkZXMoXCIjXCIpLCBnZXRJbnZhbGlkUGF0aEVycm9yKFwiI1wiLCBcInNlYXJjaFwiLCBcImhhc2hcIiwgdG8pKTtcbiAgfVxuICBsZXQgaXNFbXB0eVBhdGggPSB0b0FyZyA9PT0gXCJcIiB8fCB0by5wYXRobmFtZSA9PT0gXCJcIjtcbiAgbGV0IHRvUGF0aG5hbWUgPSBpc0VtcHR5UGF0aCA/IFwiL1wiIDogdG8ucGF0aG5hbWU7XG4gIGxldCBmcm9tO1xuICAvLyBSb3V0aW5nIGlzIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHBhdGhuYW1lIGlmIGV4cGxpY2l0bHkgcmVxdWVzdGVkLlxuICAvL1xuICAvLyBJZiBhIHBhdGhuYW1lIGlzIGV4cGxpY2l0bHkgcHJvdmlkZWQgaW4gYHRvYCwgaXQgc2hvdWxkIGJlIHJlbGF0aXZlIHRvIHRoZVxuICAvLyByb3V0ZSBjb250ZXh0LiBUaGlzIGlzIGV4cGxhaW5lZCBpbiBgTm90ZSBvbiBgPExpbmsgdG8+YCB2YWx1ZXNgIGluIG91clxuICAvLyBtaWdyYXRpb24gZ3VpZGUgZnJvbSB2NSBhcyBhIG1lYW5zIG9mIGRpc2FtYmlndWF0aW9uIGJldHdlZW4gYHRvYCB2YWx1ZXNcbiAgLy8gdGhhdCBiZWdpbiB3aXRoIGAvYCBhbmQgdGhvc2UgdGhhdCBkbyBub3QuIEhvd2V2ZXIsIHRoaXMgaXMgcHJvYmxlbWF0aWMgZm9yXG4gIC8vIGB0b2AgdmFsdWVzIHRoYXQgZG8gbm90IHByb3ZpZGUgYSBwYXRobmFtZS4gYHRvYCBjYW4gc2ltcGx5IGJlIGEgc2VhcmNoIG9yXG4gIC8vIGhhc2ggc3RyaW5nLCBpbiB3aGljaCBjYXNlIHdlIHNob3VsZCBhc3N1bWUgdGhhdCB0aGUgbmF2aWdhdGlvbiBpcyByZWxhdGl2ZVxuICAvLyB0byB0aGUgY3VycmVudCBsb2NhdGlvbidzIHBhdGhuYW1lIGFuZCAqbm90KiB0aGUgcm91dGUgcGF0aG5hbWUuXG4gIGlmICh0b1BhdGhuYW1lID09IG51bGwpIHtcbiAgICBmcm9tID0gbG9jYXRpb25QYXRobmFtZTtcbiAgfSBlbHNlIGlmIChpc1BhdGhSZWxhdGl2ZSkge1xuICAgIGxldCBmcm9tU2VnbWVudHMgPSByb3V0ZVBhdGhuYW1lc1tyb3V0ZVBhdGhuYW1lcy5sZW5ndGggLSAxXS5yZXBsYWNlKC9eXFwvLywgXCJcIikuc3BsaXQoXCIvXCIpO1xuICAgIGlmICh0b1BhdGhuYW1lLnN0YXJ0c1dpdGgoXCIuLlwiKSkge1xuICAgICAgbGV0IHRvU2VnbWVudHMgPSB0b1BhdGhuYW1lLnNwbGl0KFwiL1wiKTtcbiAgICAgIC8vIFdpdGggcmVsYXRpdmU9XCJwYXRoXCIsIGVhY2ggbGVhZGluZyAuLiBzZWdtZW50IG1lYW5zIFwiZ28gdXAgb25lIFVSTCBzZWdtZW50XCJcbiAgICAgIHdoaWxlICh0b1NlZ21lbnRzWzBdID09PSBcIi4uXCIpIHtcbiAgICAgICAgdG9TZWdtZW50cy5zaGlmdCgpO1xuICAgICAgICBmcm9tU2VnbWVudHMucG9wKCk7XG4gICAgICB9XG4gICAgICB0by5wYXRobmFtZSA9IHRvU2VnbWVudHMuam9pbihcIi9cIik7XG4gICAgfVxuICAgIGZyb20gPSBcIi9cIiArIGZyb21TZWdtZW50cy5qb2luKFwiL1wiKTtcbiAgfSBlbHNlIHtcbiAgICBsZXQgcm91dGVQYXRobmFtZUluZGV4ID0gcm91dGVQYXRobmFtZXMubGVuZ3RoIC0gMTtcbiAgICBpZiAodG9QYXRobmFtZS5zdGFydHNXaXRoKFwiLi5cIikpIHtcbiAgICAgIGxldCB0b1NlZ21lbnRzID0gdG9QYXRobmFtZS5zcGxpdChcIi9cIik7XG4gICAgICAvLyBXaXRoIHJlbGF0aXZlPVwicm91dGVcIiAodGhlIGRlZmF1bHQpLCBlYWNoIGxlYWRpbmcgLi4gc2VnbWVudCBtZWFuc1xuICAgICAgLy8gXCJnbyB1cCBvbmUgcm91dGVcIiBpbnN0ZWFkIG9mIFwiZ28gdXAgb25lIFVSTCBzZWdtZW50XCIuICBUaGlzIGlzIGEga2V5XG4gICAgICAvLyBkaWZmZXJlbmNlIGZyb20gaG93IDxhIGhyZWY+IHdvcmtzIGFuZCBhIG1ham9yIHJlYXNvbiB3ZSBjYWxsIHRoaXMgYVxuICAgICAgLy8gXCJ0b1wiIHZhbHVlIGluc3RlYWQgb2YgYSBcImhyZWZcIi5cbiAgICAgIHdoaWxlICh0b1NlZ21lbnRzWzBdID09PSBcIi4uXCIpIHtcbiAgICAgICAgdG9TZWdtZW50cy5zaGlmdCgpO1xuICAgICAgICByb3V0ZVBhdGhuYW1lSW5kZXggLT0gMTtcbiAgICAgIH1cbiAgICAgIHRvLnBhdGhuYW1lID0gdG9TZWdtZW50cy5qb2luKFwiL1wiKTtcbiAgICB9XG4gICAgLy8gSWYgdGhlcmUgYXJlIG1vcmUgXCIuLlwiIHNlZ21lbnRzIHRoYW4gcGFyZW50IHJvdXRlcywgcmVzb2x2ZSByZWxhdGl2ZSB0b1xuICAgIC8vIHRoZSByb290IC8gVVJMLlxuICAgIGZyb20gPSByb3V0ZVBhdGhuYW1lSW5kZXggPj0gMCA/IHJvdXRlUGF0aG5hbWVzW3JvdXRlUGF0aG5hbWVJbmRleF0gOiBcIi9cIjtcbiAgfVxuICBsZXQgcGF0aCA9IHJlc29sdmVQYXRoKHRvLCBmcm9tKTtcbiAgLy8gRW5zdXJlIHRoZSBwYXRobmFtZSBoYXMgYSB0cmFpbGluZyBzbGFzaCBpZiB0aGUgb3JpZ2luYWwgXCJ0b1wiIGhhZCBvbmVcbiAgbGV0IGhhc0V4cGxpY2l0VHJhaWxpbmdTbGFzaCA9IHRvUGF0aG5hbWUgJiYgdG9QYXRobmFtZSAhPT0gXCIvXCIgJiYgdG9QYXRobmFtZS5lbmRzV2l0aChcIi9cIik7XG4gIC8vIE9yIGlmIHRoaXMgd2FzIGEgbGluayB0byB0aGUgY3VycmVudCBwYXRoIHdoaWNoIGhhcyBhIHRyYWlsaW5nIHNsYXNoXG4gIGxldCBoYXNDdXJyZW50VHJhaWxpbmdTbGFzaCA9IChpc0VtcHR5UGF0aCB8fCB0b1BhdGhuYW1lID09PSBcIi5cIikgJiYgbG9jYXRpb25QYXRobmFtZS5lbmRzV2l0aChcIi9cIik7XG4gIGlmICghcGF0aC5wYXRobmFtZS5lbmRzV2l0aChcIi9cIikgJiYgKGhhc0V4cGxpY2l0VHJhaWxpbmdTbGFzaCB8fCBoYXNDdXJyZW50VHJhaWxpbmdTbGFzaCkpIHtcbiAgICBwYXRoLnBhdGhuYW1lICs9IFwiL1wiO1xuICB9XG4gIHJldHVybiBwYXRoO1xufVxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBnZXRUb1BhdGhuYW1lKHRvKSB7XG4gIC8vIEVtcHR5IHN0cmluZ3Mgc2hvdWxkIGJlIHRyZWF0ZWQgdGhlIHNhbWUgYXMgLyBwYXRoc1xuICByZXR1cm4gdG8gPT09IFwiXCIgfHwgdG8ucGF0aG5hbWUgPT09IFwiXCIgPyBcIi9cIiA6IHR5cGVvZiB0byA9PT0gXCJzdHJpbmdcIiA/IHBhcnNlUGF0aCh0bykucGF0aG5hbWUgOiB0by5wYXRobmFtZTtcbn1cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuY29uc3Qgam9pblBhdGhzID0gcGF0aHMgPT4gcGF0aHMuam9pbihcIi9cIikucmVwbGFjZSgvXFwvXFwvKy9nLCBcIi9cIik7XG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IG5vcm1hbGl6ZVBhdGhuYW1lID0gcGF0aG5hbWUgPT4gcGF0aG5hbWUucmVwbGFjZSgvXFwvKyQvLCBcIlwiKS5yZXBsYWNlKC9eXFwvKi8sIFwiL1wiKTtcbi8qKlxuICogQHByaXZhdGVcbiAqL1xuY29uc3Qgbm9ybWFsaXplU2VhcmNoID0gc2VhcmNoID0+ICFzZWFyY2ggfHwgc2VhcmNoID09PSBcIj9cIiA/IFwiXCIgOiBzZWFyY2guc3RhcnRzV2l0aChcIj9cIikgPyBzZWFyY2ggOiBcIj9cIiArIHNlYXJjaDtcbi8qKlxuICogQHByaXZhdGVcbiAqL1xuY29uc3Qgbm9ybWFsaXplSGFzaCA9IGhhc2ggPT4gIWhhc2ggfHwgaGFzaCA9PT0gXCIjXCIgPyBcIlwiIDogaGFzaC5zdGFydHNXaXRoKFwiI1wiKSA/IGhhc2ggOiBcIiNcIiArIGhhc2g7XG4vKipcbiAqIFRoaXMgaXMgYSBzaG9ydGN1dCBmb3IgY3JlYXRpbmcgYGFwcGxpY2F0aW9uL2pzb25gIHJlc3BvbnNlcy4gQ29udmVydHMgYGRhdGFgXG4gKiB0byBKU09OIGFuZCBzZXRzIHRoZSBgQ29udGVudC1UeXBlYCBoZWFkZXIuXG4gKi9cbmNvbnN0IGpzb24gPSBmdW5jdGlvbiBqc29uKGRhdGEsIGluaXQpIHtcbiAgaWYgKGluaXQgPT09IHZvaWQgMCkge1xuICAgIGluaXQgPSB7fTtcbiAgfVxuICBsZXQgcmVzcG9uc2VJbml0ID0gdHlwZW9mIGluaXQgPT09IFwibnVtYmVyXCIgPyB7XG4gICAgc3RhdHVzOiBpbml0XG4gIH0gOiBpbml0O1xuICBsZXQgaGVhZGVycyA9IG5ldyBIZWFkZXJzKHJlc3BvbnNlSW5pdC5oZWFkZXJzKTtcbiAgaWYgKCFoZWFkZXJzLmhhcyhcIkNvbnRlbnQtVHlwZVwiKSkge1xuICAgIGhlYWRlcnMuc2V0KFwiQ29udGVudC1UeXBlXCIsIFwiYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOFwiKTtcbiAgfVxuICByZXR1cm4gbmV3IFJlc3BvbnNlKEpTT04uc3RyaW5naWZ5KGRhdGEpLCBfZXh0ZW5kcyh7fSwgcmVzcG9uc2VJbml0LCB7XG4gICAgaGVhZGVyc1xuICB9KSk7XG59O1xuY2xhc3MgQWJvcnRlZERlZmVycmVkRXJyb3IgZXh0ZW5kcyBFcnJvciB7fVxuY2xhc3MgRGVmZXJyZWREYXRhIHtcbiAgY29uc3RydWN0b3IoZGF0YSwgcmVzcG9uc2VJbml0KSB7XG4gICAgdGhpcy5wZW5kaW5nS2V5c1NldCA9IG5ldyBTZXQoKTtcbiAgICB0aGlzLnN1YnNjcmliZXJzID0gbmV3IFNldCgpO1xuICAgIHRoaXMuZGVmZXJyZWRLZXlzID0gW107XG4gICAgaW52YXJpYW50KGRhdGEgJiYgdHlwZW9mIGRhdGEgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkoZGF0YSksIFwiZGVmZXIoKSBvbmx5IGFjY2VwdHMgcGxhaW4gb2JqZWN0c1wiKTtcbiAgICAvLyBTZXQgdXAgYW4gQWJvcnRDb250cm9sbGVyICsgUHJvbWlzZSB3ZSBjYW4gcmFjZSBhZ2FpbnN0IHRvIGV4aXQgZWFybHlcbiAgICAvLyBjYW5jZWxsYXRpb25cbiAgICBsZXQgcmVqZWN0O1xuICAgIHRoaXMuYWJvcnRQcm9taXNlID0gbmV3IFByb21pc2UoKF8sIHIpID0+IHJlamVjdCA9IHIpO1xuICAgIHRoaXMuY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICBsZXQgb25BYm9ydCA9ICgpID0+IHJlamVjdChuZXcgQWJvcnRlZERlZmVycmVkRXJyb3IoXCJEZWZlcnJlZCBkYXRhIGFib3J0ZWRcIikpO1xuICAgIHRoaXMudW5saXN0ZW5BYm9ydFNpZ25hbCA9ICgpID0+IHRoaXMuY29udHJvbGxlci5zaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIG9uQWJvcnQpO1xuICAgIHRoaXMuY29udHJvbGxlci5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIG9uQWJvcnQpO1xuICAgIHRoaXMuZGF0YSA9IE9iamVjdC5lbnRyaWVzKGRhdGEpLnJlZHVjZSgoYWNjLCBfcmVmMikgPT4ge1xuICAgICAgbGV0IFtrZXksIHZhbHVlXSA9IF9yZWYyO1xuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oYWNjLCB7XG4gICAgICAgIFtrZXldOiB0aGlzLnRyYWNrUHJvbWlzZShrZXksIHZhbHVlKVxuICAgICAgfSk7XG4gICAgfSwge30pO1xuICAgIGlmICh0aGlzLmRvbmUpIHtcbiAgICAgIC8vIEFsbCBpbmNvbWluZyB2YWx1ZXMgd2VyZSByZXNvbHZlZFxuICAgICAgdGhpcy51bmxpc3RlbkFib3J0U2lnbmFsKCk7XG4gICAgfVxuICAgIHRoaXMuaW5pdCA9IHJlc3BvbnNlSW5pdDtcbiAgfVxuICB0cmFja1Byb21pc2Uoa2V5LCB2YWx1ZSkge1xuICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgUHJvbWlzZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgdGhpcy5kZWZlcnJlZEtleXMucHVzaChrZXkpO1xuICAgIHRoaXMucGVuZGluZ0tleXNTZXQuYWRkKGtleSk7XG4gICAgLy8gV2Ugc3RvcmUgYSBsaXR0bGUgd3JhcHBlciBwcm9taXNlIHRoYXQgd2lsbCBiZSBleHRlbmRlZCB3aXRoXG4gICAgLy8gX2RhdGEvX2Vycm9yIHByb3BzIHVwb24gcmVzb2x2ZS9yZWplY3RcbiAgICBsZXQgcHJvbWlzZSA9IFByb21pc2UucmFjZShbdmFsdWUsIHRoaXMuYWJvcnRQcm9taXNlXSkudGhlbihkYXRhID0+IHRoaXMub25TZXR0bGUocHJvbWlzZSwga2V5LCB1bmRlZmluZWQsIGRhdGEpLCBlcnJvciA9PiB0aGlzLm9uU2V0dGxlKHByb21pc2UsIGtleSwgZXJyb3IpKTtcbiAgICAvLyBSZWdpc3RlciByZWplY3Rpb24gbGlzdGVuZXJzIHRvIGF2b2lkIHVuY2F1Z2h0IHByb21pc2UgcmVqZWN0aW9ucyBvblxuICAgIC8vIGVycm9ycyBvciBhYm9ydGVkIGRlZmVycmVkIHZhbHVlc1xuICAgIHByb21pc2UuY2F0Y2goKCkgPT4ge30pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm9taXNlLCBcIl90cmFja2VkXCIsIHtcbiAgICAgIGdldDogKCkgPT4gdHJ1ZVxuICAgIH0pO1xuICAgIHJldHVybiBwcm9taXNlO1xuICB9XG4gIG9uU2V0dGxlKHByb21pc2UsIGtleSwgZXJyb3IsIGRhdGEpIHtcbiAgICBpZiAodGhpcy5jb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkICYmIGVycm9yIGluc3RhbmNlb2YgQWJvcnRlZERlZmVycmVkRXJyb3IpIHtcbiAgICAgIHRoaXMudW5saXN0ZW5BYm9ydFNpZ25hbCgpO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb21pc2UsIFwiX2Vycm9yXCIsIHtcbiAgICAgICAgZ2V0OiAoKSA9PiBlcnJvclxuICAgICAgfSk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgIH1cbiAgICB0aGlzLnBlbmRpbmdLZXlzU2V0LmRlbGV0ZShrZXkpO1xuICAgIGlmICh0aGlzLmRvbmUpIHtcbiAgICAgIC8vIE5vdGhpbmcgbGVmdCB0byBhYm9ydCFcbiAgICAgIHRoaXMudW5saXN0ZW5BYm9ydFNpZ25hbCgpO1xuICAgIH1cbiAgICAvLyBJZiB0aGUgcHJvbWlzZSB3YXMgcmVzb2x2ZWQvcmVqZWN0ZWQgd2l0aCB1bmRlZmluZWQsIHdlJ2xsIHRocm93IGFuIGVycm9yIGFzIHlvdVxuICAgIC8vIHNob3VsZCBhbHdheXMgcmVzb2x2ZSB3aXRoIGEgdmFsdWUgb3IgbnVsbFxuICAgIGlmIChlcnJvciA9PT0gdW5kZWZpbmVkICYmIGRhdGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgbGV0IHVuZGVmaW5lZEVycm9yID0gbmV3IEVycm9yKFwiRGVmZXJyZWQgZGF0YSBmb3Iga2V5IFxcXCJcIiArIGtleSArIFwiXFxcIiByZXNvbHZlZC9yZWplY3RlZCB3aXRoIGB1bmRlZmluZWRgLCBcIiArIFwieW91IG11c3QgcmVzb2x2ZS9yZWplY3Qgd2l0aCBhIHZhbHVlIG9yIGBudWxsYC5cIik7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvbWlzZSwgXCJfZXJyb3JcIiwge1xuICAgICAgICBnZXQ6ICgpID0+IHVuZGVmaW5lZEVycm9yXG4gICAgICB9KTtcbiAgICAgIHRoaXMuZW1pdChmYWxzZSwga2V5KTtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCh1bmRlZmluZWRFcnJvcik7XG4gICAgfVxuICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm9taXNlLCBcIl9lcnJvclwiLCB7XG4gICAgICAgIGdldDogKCkgPT4gZXJyb3JcbiAgICAgIH0pO1xuICAgICAgdGhpcy5lbWl0KGZhbHNlLCBrZXkpO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb21pc2UsIFwiX2RhdGFcIiwge1xuICAgICAgZ2V0OiAoKSA9PiBkYXRhXG4gICAgfSk7XG4gICAgdGhpcy5lbWl0KGZhbHNlLCBrZXkpO1xuICAgIHJldHVybiBkYXRhO1xuICB9XG4gIGVtaXQoYWJvcnRlZCwgc2V0dGxlZEtleSkge1xuICAgIHRoaXMuc3Vic2NyaWJlcnMuZm9yRWFjaChzdWJzY3JpYmVyID0+IHN1YnNjcmliZXIoYWJvcnRlZCwgc2V0dGxlZEtleSkpO1xuICB9XG4gIHN1YnNjcmliZShmbikge1xuICAgIHRoaXMuc3Vic2NyaWJlcnMuYWRkKGZuKTtcbiAgICByZXR1cm4gKCkgPT4gdGhpcy5zdWJzY3JpYmVycy5kZWxldGUoZm4pO1xuICB9XG4gIGNhbmNlbCgpIHtcbiAgICB0aGlzLmNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICB0aGlzLnBlbmRpbmdLZXlzU2V0LmZvckVhY2goKHYsIGspID0+IHRoaXMucGVuZGluZ0tleXNTZXQuZGVsZXRlKGspKTtcbiAgICB0aGlzLmVtaXQodHJ1ZSk7XG4gIH1cbiAgYXN5bmMgcmVzb2x2ZURhdGEoc2lnbmFsKSB7XG4gICAgbGV0IGFib3J0ZWQgPSBmYWxzZTtcbiAgICBpZiAoIXRoaXMuZG9uZSkge1xuICAgICAgbGV0IG9uQWJvcnQgPSAoKSA9PiB0aGlzLmNhbmNlbCgpO1xuICAgICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBvbkFib3J0KTtcbiAgICAgIGFib3J0ZWQgPSBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgdGhpcy5zdWJzY3JpYmUoYWJvcnRlZCA9PiB7XG4gICAgICAgICAgc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBvbkFib3J0KTtcbiAgICAgICAgICBpZiAoYWJvcnRlZCB8fCB0aGlzLmRvbmUpIHtcbiAgICAgICAgICAgIHJlc29sdmUoYWJvcnRlZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gYWJvcnRlZDtcbiAgfVxuICBnZXQgZG9uZSgpIHtcbiAgICByZXR1cm4gdGhpcy5wZW5kaW5nS2V5c1NldC5zaXplID09PSAwO1xuICB9XG4gIGdldCB1bndyYXBwZWREYXRhKCkge1xuICAgIGludmFyaWFudCh0aGlzLmRhdGEgIT09IG51bGwgJiYgdGhpcy5kb25lLCBcIkNhbiBvbmx5IHVud3JhcCBkYXRhIG9uIGluaXRpYWxpemVkIGFuZCBzZXR0bGVkIGRlZmVycmVkc1wiKTtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXModGhpcy5kYXRhKS5yZWR1Y2UoKGFjYywgX3JlZjMpID0+IHtcbiAgICAgIGxldCBba2V5LCB2YWx1ZV0gPSBfcmVmMztcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKGFjYywge1xuICAgICAgICBba2V5XTogdW53cmFwVHJhY2tlZFByb21pc2UodmFsdWUpXG4gICAgICB9KTtcbiAgICB9LCB7fSk7XG4gIH1cbiAgZ2V0IHBlbmRpbmdLZXlzKCkge1xuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMucGVuZGluZ0tleXNTZXQpO1xuICB9XG59XG5mdW5jdGlvbiBpc1RyYWNrZWRQcm9taXNlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFByb21pc2UgJiYgdmFsdWUuX3RyYWNrZWQgPT09IHRydWU7XG59XG5mdW5jdGlvbiB1bndyYXBUcmFja2VkUHJvbWlzZSh2YWx1ZSkge1xuICBpZiAoIWlzVHJhY2tlZFByb21pc2UodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGlmICh2YWx1ZS5fZXJyb3IpIHtcbiAgICB0aHJvdyB2YWx1ZS5fZXJyb3I7XG4gIH1cbiAgcmV0dXJuIHZhbHVlLl9kYXRhO1xufVxuY29uc3QgZGVmZXIgPSBmdW5jdGlvbiBkZWZlcihkYXRhLCBpbml0KSB7XG4gIGlmIChpbml0ID09PSB2b2lkIDApIHtcbiAgICBpbml0ID0ge307XG4gIH1cbiAgbGV0IHJlc3BvbnNlSW5pdCA9IHR5cGVvZiBpbml0ID09PSBcIm51bWJlclwiID8ge1xuICAgIHN0YXR1czogaW5pdFxuICB9IDogaW5pdDtcbiAgcmV0dXJuIG5ldyBEZWZlcnJlZERhdGEoZGF0YSwgcmVzcG9uc2VJbml0KTtcbn07XG4vKipcbiAqIEEgcmVkaXJlY3QgcmVzcG9uc2UuIFNldHMgdGhlIHN0YXR1cyBjb2RlIGFuZCB0aGUgYExvY2F0aW9uYCBoZWFkZXIuXG4gKiBEZWZhdWx0cyB0byBcIjMwMiBGb3VuZFwiLlxuICovXG5jb25zdCByZWRpcmVjdCA9IGZ1bmN0aW9uIHJlZGlyZWN0KHVybCwgaW5pdCkge1xuICBpZiAoaW5pdCA9PT0gdm9pZCAwKSB7XG4gICAgaW5pdCA9IDMwMjtcbiAgfVxuICBsZXQgcmVzcG9uc2VJbml0ID0gaW5pdDtcbiAgaWYgKHR5cGVvZiByZXNwb25zZUluaXQgPT09IFwibnVtYmVyXCIpIHtcbiAgICByZXNwb25zZUluaXQgPSB7XG4gICAgICBzdGF0dXM6IHJlc3BvbnNlSW5pdFxuICAgIH07XG4gIH0gZWxzZSBpZiAodHlwZW9mIHJlc3BvbnNlSW5pdC5zdGF0dXMgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICByZXNwb25zZUluaXQuc3RhdHVzID0gMzAyO1xuICB9XG4gIGxldCBoZWFkZXJzID0gbmV3IEhlYWRlcnMocmVzcG9uc2VJbml0LmhlYWRlcnMpO1xuICBoZWFkZXJzLnNldChcIkxvY2F0aW9uXCIsIHVybCk7XG4gIHJldHVybiBuZXcgUmVzcG9uc2UobnVsbCwgX2V4dGVuZHMoe30sIHJlc3BvbnNlSW5pdCwge1xuICAgIGhlYWRlcnNcbiAgfSkpO1xufTtcbi8qKlxuICogQSByZWRpcmVjdCByZXNwb25zZSB0aGF0IHdpbGwgZm9yY2UgYSBkb2N1bWVudCByZWxvYWQgdG8gdGhlIG5ldyBsb2NhdGlvbi5cbiAqIFNldHMgdGhlIHN0YXR1cyBjb2RlIGFuZCB0aGUgYExvY2F0aW9uYCBoZWFkZXIuXG4gKiBEZWZhdWx0cyB0byBcIjMwMiBGb3VuZFwiLlxuICovXG5jb25zdCByZWRpcmVjdERvY3VtZW50ID0gKHVybCwgaW5pdCkgPT4ge1xuICBsZXQgcmVzcG9uc2UgPSByZWRpcmVjdCh1cmwsIGluaXQpO1xuICByZXNwb25zZS5oZWFkZXJzLnNldChcIlgtUmVtaXgtUmVsb2FkLURvY3VtZW50XCIsIFwidHJ1ZVwiKTtcbiAgcmV0dXJuIHJlc3BvbnNlO1xufTtcbi8qKlxuICogQHByaXZhdGVcbiAqIFV0aWxpdHkgY2xhc3Mgd2UgdXNlIHRvIGhvbGQgYXV0by11bndyYXBwZWQgNHh4LzV4eCBSZXNwb25zZSBib2RpZXNcbiAqXG4gKiBXZSBkb24ndCBleHBvcnQgdGhlIGNsYXNzIGZvciBwdWJsaWMgdXNlIHNpbmNlIGl0J3MgYW4gaW1wbGVtZW50YXRpb25cbiAqIGRldGFpbCwgYnV0IHdlIGV4cG9ydCB0aGUgaW50ZXJmYWNlIGFib3ZlIHNvIGZvbGtzIGNhbiBidWlsZCB0aGVpciBvd25cbiAqIGFic3RyYWN0aW9ucyBhcm91bmQgaW5zdGFuY2VzIHZpYSBpc1JvdXRlRXJyb3JSZXNwb25zZSgpXG4gKi9cbmNsYXNzIEVycm9yUmVzcG9uc2VJbXBsIHtcbiAgY29uc3RydWN0b3Ioc3RhdHVzLCBzdGF0dXNUZXh0LCBkYXRhLCBpbnRlcm5hbCkge1xuICAgIGlmIChpbnRlcm5hbCA9PT0gdm9pZCAwKSB7XG4gICAgICBpbnRlcm5hbCA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLnN0YXR1cyA9IHN0YXR1cztcbiAgICB0aGlzLnN0YXR1c1RleHQgPSBzdGF0dXNUZXh0IHx8IFwiXCI7XG4gICAgdGhpcy5pbnRlcm5hbCA9IGludGVybmFsO1xuICAgIGlmIChkYXRhIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIHRoaXMuZGF0YSA9IGRhdGEudG9TdHJpbmcoKTtcbiAgICAgIHRoaXMuZXJyb3IgPSBkYXRhO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBDaGVjayBpZiB0aGUgZ2l2ZW4gZXJyb3IgaXMgYW4gRXJyb3JSZXNwb25zZSBnZW5lcmF0ZWQgZnJvbSBhIDR4eC81eHhcbiAqIFJlc3BvbnNlIHRocm93biBmcm9tIGFuIGFjdGlvbi9sb2FkZXJcbiAqL1xuZnVuY3Rpb24gaXNSb3V0ZUVycm9yUmVzcG9uc2UoZXJyb3IpIHtcbiAgcmV0dXJuIGVycm9yICE9IG51bGwgJiYgdHlwZW9mIGVycm9yLnN0YXR1cyA9PT0gXCJudW1iZXJcIiAmJiB0eXBlb2YgZXJyb3Iuc3RhdHVzVGV4dCA9PT0gXCJzdHJpbmdcIiAmJiB0eXBlb2YgZXJyb3IuaW50ZXJuYWwgPT09IFwiYm9vbGVhblwiICYmIFwiZGF0YVwiIGluIGVycm9yO1xufVxuXG5jb25zdCB2YWxpZE11dGF0aW9uTWV0aG9kc0FyciA9IFtcInBvc3RcIiwgXCJwdXRcIiwgXCJwYXRjaFwiLCBcImRlbGV0ZVwiXTtcbmNvbnN0IHZhbGlkTXV0YXRpb25NZXRob2RzID0gbmV3IFNldCh2YWxpZE11dGF0aW9uTWV0aG9kc0Fycik7XG5jb25zdCB2YWxpZFJlcXVlc3RNZXRob2RzQXJyID0gW1wiZ2V0XCIsIC4uLnZhbGlkTXV0YXRpb25NZXRob2RzQXJyXTtcbmNvbnN0IHZhbGlkUmVxdWVzdE1ldGhvZHMgPSBuZXcgU2V0KHZhbGlkUmVxdWVzdE1ldGhvZHNBcnIpO1xuY29uc3QgcmVkaXJlY3RTdGF0dXNDb2RlcyA9IG5ldyBTZXQoWzMwMSwgMzAyLCAzMDMsIDMwNywgMzA4XSk7XG5jb25zdCByZWRpcmVjdFByZXNlcnZlTWV0aG9kU3RhdHVzQ29kZXMgPSBuZXcgU2V0KFszMDcsIDMwOF0pO1xuY29uc3QgSURMRV9OQVZJR0FUSU9OID0ge1xuICBzdGF0ZTogXCJpZGxlXCIsXG4gIGxvY2F0aW9uOiB1bmRlZmluZWQsXG4gIGZvcm1NZXRob2Q6IHVuZGVmaW5lZCxcbiAgZm9ybUFjdGlvbjogdW5kZWZpbmVkLFxuICBmb3JtRW5jVHlwZTogdW5kZWZpbmVkLFxuICBmb3JtRGF0YTogdW5kZWZpbmVkLFxuICBqc29uOiB1bmRlZmluZWQsXG4gIHRleHQ6IHVuZGVmaW5lZFxufTtcbmNvbnN0IElETEVfRkVUQ0hFUiA9IHtcbiAgc3RhdGU6IFwiaWRsZVwiLFxuICBkYXRhOiB1bmRlZmluZWQsXG4gIGZvcm1NZXRob2Q6IHVuZGVmaW5lZCxcbiAgZm9ybUFjdGlvbjogdW5kZWZpbmVkLFxuICBmb3JtRW5jVHlwZTogdW5kZWZpbmVkLFxuICBmb3JtRGF0YTogdW5kZWZpbmVkLFxuICBqc29uOiB1bmRlZmluZWQsXG4gIHRleHQ6IHVuZGVmaW5lZFxufTtcbmNvbnN0IElETEVfQkxPQ0tFUiA9IHtcbiAgc3RhdGU6IFwidW5ibG9ja2VkXCIsXG4gIHByb2NlZWQ6IHVuZGVmaW5lZCxcbiAgcmVzZXQ6IHVuZGVmaW5lZCxcbiAgbG9jYXRpb246IHVuZGVmaW5lZFxufTtcbmNvbnN0IEFCU09MVVRFX1VSTF9SRUdFWCA9IC9eKD86W2Etel1bYS16MC05Ky4tXSo6fFxcL1xcLykvaTtcbmNvbnN0IGRlZmF1bHRNYXBSb3V0ZVByb3BlcnRpZXMgPSByb3V0ZSA9PiAoe1xuICBoYXNFcnJvckJvdW5kYXJ5OiBCb29sZWFuKHJvdXRlLmhhc0Vycm9yQm91bmRhcnkpXG59KTtcbmNvbnN0IFRSQU5TSVRJT05TX1NUT1JBR0VfS0VZID0gXCJyZW1peC1yb3V0ZXItdHJhbnNpdGlvbnNcIjtcbi8vI2VuZHJlZ2lvblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vI3JlZ2lvbiBjcmVhdGVSb3V0ZXJcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vKipcbiAqIENyZWF0ZSBhIHJvdXRlciBhbmQgbGlzdGVuIHRvIGhpc3RvcnkgUE9QIG5hdmlnYXRpb25zXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVJvdXRlcihpbml0KSB7XG4gIGNvbnN0IHJvdXRlcldpbmRvdyA9IGluaXQud2luZG93ID8gaW5pdC53aW5kb3cgOiB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiID8gd2luZG93IDogdW5kZWZpbmVkO1xuICBjb25zdCBpc0Jyb3dzZXIgPSB0eXBlb2Ygcm91dGVyV2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiByb3V0ZXJXaW5kb3cuZG9jdW1lbnQgIT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIHJvdXRlcldpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50ICE9PSBcInVuZGVmaW5lZFwiO1xuICBjb25zdCBpc1NlcnZlciA9ICFpc0Jyb3dzZXI7XG4gIGludmFyaWFudChpbml0LnJvdXRlcy5sZW5ndGggPiAwLCBcIllvdSBtdXN0IHByb3ZpZGUgYSBub24tZW1wdHkgcm91dGVzIGFycmF5IHRvIGNyZWF0ZVJvdXRlclwiKTtcbiAgbGV0IG1hcFJvdXRlUHJvcGVydGllcztcbiAgaWYgKGluaXQubWFwUm91dGVQcm9wZXJ0aWVzKSB7XG4gICAgbWFwUm91dGVQcm9wZXJ0aWVzID0gaW5pdC5tYXBSb3V0ZVByb3BlcnRpZXM7XG4gIH0gZWxzZSBpZiAoaW5pdC5kZXRlY3RFcnJvckJvdW5kYXJ5KSB7XG4gICAgLy8gSWYgdGhleSBhcmUgc3RpbGwgdXNpbmcgdGhlIGRlcHJlY2F0ZWQgdmVyc2lvbiwgd3JhcCBpdCB3aXRoIHRoZSBuZXcgQVBJXG4gICAgbGV0IGRldGVjdEVycm9yQm91bmRhcnkgPSBpbml0LmRldGVjdEVycm9yQm91bmRhcnk7XG4gICAgbWFwUm91dGVQcm9wZXJ0aWVzID0gcm91dGUgPT4gKHtcbiAgICAgIGhhc0Vycm9yQm91bmRhcnk6IGRldGVjdEVycm9yQm91bmRhcnkocm91dGUpXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgbWFwUm91dGVQcm9wZXJ0aWVzID0gZGVmYXVsdE1hcFJvdXRlUHJvcGVydGllcztcbiAgfVxuICAvLyBSb3V0ZXMga2V5ZWQgYnkgSURcbiAgbGV0IG1hbmlmZXN0ID0ge307XG4gIC8vIFJvdXRlcyBpbiB0cmVlIGZvcm1hdCBmb3IgbWF0Y2hpbmdcbiAgbGV0IGRhdGFSb3V0ZXMgPSBjb252ZXJ0Um91dGVzVG9EYXRhUm91dGVzKGluaXQucm91dGVzLCBtYXBSb3V0ZVByb3BlcnRpZXMsIHVuZGVmaW5lZCwgbWFuaWZlc3QpO1xuICBsZXQgaW5GbGlnaHREYXRhUm91dGVzO1xuICBsZXQgYmFzZW5hbWUgPSBpbml0LmJhc2VuYW1lIHx8IFwiL1wiO1xuICAvLyBDb25maWcgZHJpdmVuIGJlaGF2aW9yIGZsYWdzXG4gIGxldCBmdXR1cmUgPSBfZXh0ZW5kcyh7XG4gICAgdjdfZmV0Y2hlclBlcnNpc3Q6IGZhbHNlLFxuICAgIHY3X25vcm1hbGl6ZUZvcm1NZXRob2Q6IGZhbHNlLFxuICAgIHY3X3ByZXBlbmRCYXNlbmFtZTogZmFsc2VcbiAgfSwgaW5pdC5mdXR1cmUpO1xuICAvLyBDbGVhbnVwIGZ1bmN0aW9uIGZvciBoaXN0b3J5XG4gIGxldCB1bmxpc3Rlbkhpc3RvcnkgPSBudWxsO1xuICAvLyBFeHRlcm5hbGx5LXByb3ZpZGVkIGZ1bmN0aW9ucyB0byBjYWxsIG9uIGFsbCBzdGF0ZSBjaGFuZ2VzXG4gIGxldCBzdWJzY3JpYmVycyA9IG5ldyBTZXQoKTtcbiAgLy8gRXh0ZXJuYWxseS1wcm92aWRlZCBvYmplY3QgdG8gaG9sZCBzY3JvbGwgcmVzdG9yYXRpb24gbG9jYXRpb25zIGR1cmluZyByb3V0aW5nXG4gIGxldCBzYXZlZFNjcm9sbFBvc2l0aW9ucyA9IG51bGw7XG4gIC8vIEV4dGVybmFsbHktcHJvdmlkZWQgZnVuY3Rpb24gdG8gZ2V0IHNjcm9sbCByZXN0b3JhdGlvbiBrZXlzXG4gIGxldCBnZXRTY3JvbGxSZXN0b3JhdGlvbktleSA9IG51bGw7XG4gIC8vIEV4dGVybmFsbHktcHJvdmlkZWQgZnVuY3Rpb24gdG8gZ2V0IGN1cnJlbnQgc2Nyb2xsIHBvc2l0aW9uXG4gIGxldCBnZXRTY3JvbGxQb3NpdGlvbiA9IG51bGw7XG4gIC8vIE9uZS10aW1lIGZsYWcgdG8gY29udHJvbCB0aGUgaW5pdGlhbCBoeWRyYXRpb24gc2Nyb2xsIHJlc3RvcmF0aW9uLiAgQmVjYXVzZVxuICAvLyB3ZSBkb24ndCBnZXQgdGhlIHNhdmVkIHBvc2l0aW9ucyBmcm9tIDxTY3JvbGxSZXN0b3JhdGlvbiAvPiB1bnRpbCBfYWZ0ZXJfXG4gIC8vIHRoZSBpbml0aWFsIHJlbmRlciwgd2UgbmVlZCB0byBtYW51YWxseSB0cmlnZ2VyIGEgc2VwYXJhdGUgdXBkYXRlU3RhdGUgdG9cbiAgLy8gc2VuZCBhbG9uZyB0aGUgcmVzdG9yZVNjcm9sbFBvc2l0aW9uXG4gIC8vIFNldCB0byB0cnVlIGlmIHdlIGhhdmUgYGh5ZHJhdGlvbkRhdGFgIHNpbmNlIHdlIGFzc3VtZSB3ZSB3ZXJlIFNTUidkIGFuZCB0aGF0XG4gIC8vIFNTUiBkaWQgdGhlIGluaXRpYWwgc2Nyb2xsIHJlc3RvcmF0aW9uLlxuICBsZXQgaW5pdGlhbFNjcm9sbFJlc3RvcmVkID0gaW5pdC5oeWRyYXRpb25EYXRhICE9IG51bGw7XG4gIGxldCBpbml0aWFsTWF0Y2hlcyA9IG1hdGNoUm91dGVzKGRhdGFSb3V0ZXMsIGluaXQuaGlzdG9yeS5sb2NhdGlvbiwgYmFzZW5hbWUpO1xuICBsZXQgaW5pdGlhbEVycm9ycyA9IG51bGw7XG4gIGlmIChpbml0aWFsTWF0Y2hlcyA9PSBudWxsKSB7XG4gICAgLy8gSWYgd2UgZG8gbm90IG1hdGNoIGEgdXNlci1wcm92aWRlZC1yb3V0ZSwgZmFsbCBiYWNrIHRvIHRoZSByb290XG4gICAgLy8gdG8gYWxsb3cgdGhlIGVycm9yIGJvdW5kYXJ5IHRvIHRha2Ugb3ZlclxuICAgIGxldCBlcnJvciA9IGdldEludGVybmFsUm91dGVyRXJyb3IoNDA0LCB7XG4gICAgICBwYXRobmFtZTogaW5pdC5oaXN0b3J5LmxvY2F0aW9uLnBhdGhuYW1lXG4gICAgfSk7XG4gICAgbGV0IHtcbiAgICAgIG1hdGNoZXMsXG4gICAgICByb3V0ZVxuICAgIH0gPSBnZXRTaG9ydENpcmN1aXRNYXRjaGVzKGRhdGFSb3V0ZXMpO1xuICAgIGluaXRpYWxNYXRjaGVzID0gbWF0Y2hlcztcbiAgICBpbml0aWFsRXJyb3JzID0ge1xuICAgICAgW3JvdXRlLmlkXTogZXJyb3JcbiAgICB9O1xuICB9XG4gIGxldCBpbml0aWFsaXplZCA9XG4gIC8vIEFsbCBpbml0aWFsTWF0Y2hlcyBuZWVkIHRvIGJlIGxvYWRlZCBiZWZvcmUgd2UncmUgcmVhZHkuICBJZiB3ZSBoYXZlIGxhenlcbiAgLy8gZnVuY3Rpb25zIGFyb3VuZCBzdGlsbCB0aGVuIHdlJ2xsIG5lZWQgdG8gcnVuIHRoZW0gaW4gaW5pdGlhbGl6ZSgpXG4gICFpbml0aWFsTWF0Y2hlcy5zb21lKG0gPT4gbS5yb3V0ZS5sYXp5KSAmJiAoXG4gIC8vIEFuZCB3ZSBoYXZlIHRvIGVpdGhlciBoYXZlIG5vIGxvYWRlcnMgb3IgaGF2ZSBiZWVuIHByb3ZpZGVkIGh5ZHJhdGlvbkRhdGFcbiAgIWluaXRpYWxNYXRjaGVzLnNvbWUobSA9PiBtLnJvdXRlLmxvYWRlcikgfHwgaW5pdC5oeWRyYXRpb25EYXRhICE9IG51bGwpO1xuICBsZXQgcm91dGVyO1xuICBsZXQgc3RhdGUgPSB7XG4gICAgaGlzdG9yeUFjdGlvbjogaW5pdC5oaXN0b3J5LmFjdGlvbixcbiAgICBsb2NhdGlvbjogaW5pdC5oaXN0b3J5LmxvY2F0aW9uLFxuICAgIG1hdGNoZXM6IGluaXRpYWxNYXRjaGVzLFxuICAgIGluaXRpYWxpemVkLFxuICAgIG5hdmlnYXRpb246IElETEVfTkFWSUdBVElPTixcbiAgICAvLyBEb24ndCByZXN0b3JlIG9uIGluaXRpYWwgdXBkYXRlU3RhdGUoKSBpZiB3ZSB3ZXJlIFNTUidkXG4gICAgcmVzdG9yZVNjcm9sbFBvc2l0aW9uOiBpbml0Lmh5ZHJhdGlvbkRhdGEgIT0gbnVsbCA/IGZhbHNlIDogbnVsbCxcbiAgICBwcmV2ZW50U2Nyb2xsUmVzZXQ6IGZhbHNlLFxuICAgIHJldmFsaWRhdGlvbjogXCJpZGxlXCIsXG4gICAgbG9hZGVyRGF0YTogaW5pdC5oeWRyYXRpb25EYXRhICYmIGluaXQuaHlkcmF0aW9uRGF0YS5sb2FkZXJEYXRhIHx8IHt9LFxuICAgIGFjdGlvbkRhdGE6IGluaXQuaHlkcmF0aW9uRGF0YSAmJiBpbml0Lmh5ZHJhdGlvbkRhdGEuYWN0aW9uRGF0YSB8fCBudWxsLFxuICAgIGVycm9yczogaW5pdC5oeWRyYXRpb25EYXRhICYmIGluaXQuaHlkcmF0aW9uRGF0YS5lcnJvcnMgfHwgaW5pdGlhbEVycm9ycyxcbiAgICBmZXRjaGVyczogbmV3IE1hcCgpLFxuICAgIGJsb2NrZXJzOiBuZXcgTWFwKClcbiAgfTtcbiAgLy8gLS0gU3RhdGVmdWwgaW50ZXJuYWwgdmFyaWFibGVzIHRvIG1hbmFnZSBuYXZpZ2F0aW9ucyAtLVxuICAvLyBDdXJyZW50IG5hdmlnYXRpb24gaW4gcHJvZ3Jlc3MgKHRvIGJlIGNvbW1pdHRlZCBpbiBjb21wbGV0ZU5hdmlnYXRpb24pXG4gIGxldCBwZW5kaW5nQWN0aW9uID0gQWN0aW9uLlBvcDtcbiAgLy8gU2hvdWxkIHRoZSBjdXJyZW50IG5hdmlnYXRpb24gcHJldmVudCB0aGUgc2Nyb2xsIHJlc2V0IGlmIHNjcm9sbCBjYW5ub3RcbiAgLy8gYmUgcmVzdG9yZWQ/XG4gIGxldCBwZW5kaW5nUHJldmVudFNjcm9sbFJlc2V0ID0gZmFsc2U7XG4gIC8vIEFib3J0Q29udHJvbGxlciBmb3IgdGhlIGFjdGl2ZSBuYXZpZ2F0aW9uXG4gIGxldCBwZW5kaW5nTmF2aWdhdGlvbkNvbnRyb2xsZXI7XG4gIC8vIFNob3VsZCB0aGUgY3VycmVudCBuYXZpZ2F0aW9uIGVuYWJsZSBkb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uP1xuICBsZXQgcGVuZGluZ1ZpZXdUcmFuc2l0aW9uRW5hYmxlZCA9IGZhbHNlO1xuICAvLyBTdG9yZSBhcHBsaWVkIHZpZXcgdHJhbnNpdGlvbnMgc28gd2UgY2FuIGFwcGx5IHRoZW0gb24gUE9QXG4gIGxldCBhcHBsaWVkVmlld1RyYW5zaXRpb25zID0gbmV3IE1hcCgpO1xuICAvLyBDbGVhbnVwIGZ1bmN0aW9uIGZvciBwZXJzaXN0aW5nIGFwcGxpZWQgdHJhbnNpdGlvbnMgdG8gc2Vzc2lvblN0b3JhZ2VcbiAgbGV0IHJlbW92ZVBhZ2VIaWRlRXZlbnRMaXN0ZW5lciA9IG51bGw7XG4gIC8vIFdlIHVzZSB0aGlzIHRvIGF2b2lkIHRvdWNoaW5nIGhpc3RvcnkgaW4gY29tcGxldGVOYXZpZ2F0aW9uIGlmIGFcbiAgLy8gcmV2YWxpZGF0aW9uIGlzIGVudGlyZWx5IHVuaW50ZXJydXB0ZWRcbiAgbGV0IGlzVW5pbnRlcnJ1cHRlZFJldmFsaWRhdGlvbiA9IGZhbHNlO1xuICAvLyBVc2UgdGhpcyBpbnRlcm5hbCBmbGFnIHRvIGZvcmNlIHJldmFsaWRhdGlvbiBvZiBhbGwgbG9hZGVyczpcbiAgLy8gIC0gc3VibWlzc2lvbnMgKGNvbXBsZXRlZCBvciBpbnRlcnJ1cHRlZClcbiAgLy8gIC0gdXNlUmV2YWxpZGF0b3IoKVxuICAvLyAgLSBYLVJlbWl4LVJldmFsaWRhdGUgKGZyb20gcmVkaXJlY3QpXG4gIGxldCBpc1JldmFsaWRhdGlvblJlcXVpcmVkID0gZmFsc2U7XG4gIC8vIFVzZSB0aGlzIGludGVybmFsIGFycmF5IHRvIGNhcHR1cmUgcm91dGVzIHRoYXQgcmVxdWlyZSByZXZhbGlkYXRpb24gZHVlXG4gIC8vIHRvIGEgY2FuY2VsbGVkIGRlZmVycmVkIG9uIGFjdGlvbiBzdWJtaXNzaW9uXG4gIGxldCBjYW5jZWxsZWREZWZlcnJlZFJvdXRlcyA9IFtdO1xuICAvLyBVc2UgdGhpcyBpbnRlcm5hbCBhcnJheSB0byBjYXB0dXJlIGZldGNoZXIgbG9hZHMgdGhhdCB3ZXJlIGNhbmNlbGxlZCBieSBhblxuICAvLyBhY3Rpb24gbmF2aWdhdGlvbiBhbmQgcmVxdWlyZSByZXZhbGlkYXRpb25cbiAgbGV0IGNhbmNlbGxlZEZldGNoZXJMb2FkcyA9IFtdO1xuICAvLyBBYm9ydENvbnRyb2xsZXJzIGZvciBhbnkgaW4tZmxpZ2h0IGZldGNoZXJzXG4gIGxldCBmZXRjaENvbnRyb2xsZXJzID0gbmV3IE1hcCgpO1xuICAvLyBUcmFjayBsb2FkcyBiYXNlZCBvbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBzdGFydGVkXG4gIGxldCBpbmNyZW1lbnRpbmdMb2FkSWQgPSAwO1xuICAvLyBUcmFjayB0aGUgb3V0c3RhbmRpbmcgcGVuZGluZyBuYXZpZ2F0aW9uIGRhdGEgbG9hZCB0byBiZSBjb21wYXJlZCBhZ2FpbnN0XG4gIC8vIHRoZSBnbG9iYWxseSBpbmNyZW1lbnRpbmcgbG9hZCB3aGVuIGEgZmV0Y2hlciBsb2FkIGxhbmRzIGFmdGVyIGEgY29tcGxldGVkXG4gIC8vIG5hdmlnYXRpb25cbiAgbGV0IHBlbmRpbmdOYXZpZ2F0aW9uTG9hZElkID0gLTE7XG4gIC8vIEZldGNoZXJzIHRoYXQgdHJpZ2dlcmVkIGRhdGEgcmVsb2FkcyBhcyBhIHJlc3VsdCBvZiB0aGVpciBhY3Rpb25zXG4gIGxldCBmZXRjaFJlbG9hZElkcyA9IG5ldyBNYXAoKTtcbiAgLy8gRmV0Y2hlcnMgdGhhdCB0cmlnZ2VyZWQgcmVkaXJlY3QgbmF2aWdhdGlvbnNcbiAgbGV0IGZldGNoUmVkaXJlY3RJZHMgPSBuZXcgU2V0KCk7XG4gIC8vIE1vc3QgcmVjZW50IGhyZWYvbWF0Y2ggZm9yIGZldGNoZXIubG9hZCBjYWxscyBmb3IgZmV0Y2hlcnNcbiAgbGV0IGZldGNoTG9hZE1hdGNoZXMgPSBuZXcgTWFwKCk7XG4gIC8vIFJlZi1jb3VudCBtb3VudGVkIGZldGNoZXJzIHNvIHdlIGtub3cgd2hlbiBpdCdzIG9rIHRvIGNsZWFuIHRoZW0gdXBcbiAgbGV0IGFjdGl2ZUZldGNoZXJzID0gbmV3IE1hcCgpO1xuICAvLyBGZXRjaGVycyB0aGF0IGhhdmUgcmVxdWVzdGVkIGEgZGVsZXRlIHdoZW4gdXNpbmcgdjdfZmV0Y2hlclBlcnNpc3QsXG4gIC8vIHRoZXknbGwgYmUgb2ZmaWNpYWxseSByZW1vdmVkIGFmdGVyIHRoZXkgcmV0dXJuIHRvIGlkbGVcbiAgbGV0IGRlbGV0ZWRGZXRjaGVycyA9IG5ldyBTZXQoKTtcbiAgLy8gU3RvcmUgRGVmZXJyZWREYXRhIGluc3RhbmNlcyBmb3IgYWN0aXZlIHJvdXRlIG1hdGNoZXMuICBXaGVuIGFcbiAgLy8gcm91dGUgbG9hZGVyIHJldHVybnMgZGVmZXIoKSB3ZSBzdGljayBvbmUgaW4gaGVyZS4gIFRoZW4sIHdoZW4gYSBuZXN0ZWRcbiAgLy8gcHJvbWlzZSByZXNvbHZlcyB3ZSB1cGRhdGUgbG9hZGVyRGF0YS4gIElmIGEgbmV3IG5hdmlnYXRpb24gc3RhcnRzIHdlXG4gIC8vIGNhbmNlbCBhY3RpdmUgZGVmZXJyZWRzIGZvciBlbGltaW5hdGVkIHJvdXRlcy5cbiAgbGV0IGFjdGl2ZURlZmVycmVkcyA9IG5ldyBNYXAoKTtcbiAgLy8gU3RvcmUgYmxvY2tlciBmdW5jdGlvbnMgaW4gYSBzZXBhcmF0ZSBNYXAgb3V0c2lkZSBvZiByb3V0ZXIgc3RhdGUgc2luY2VcbiAgLy8gd2UgZG9uJ3QgbmVlZCB0byB1cGRhdGUgVUkgc3RhdGUgaWYgdGhleSBjaGFuZ2VcbiAgbGV0IGJsb2NrZXJGdW5jdGlvbnMgPSBuZXcgTWFwKCk7XG4gIC8vIEZsYWcgdG8gaWdub3JlIHRoZSBuZXh0IGhpc3RvcnkgdXBkYXRlLCBzbyB3ZSBjYW4gcmV2ZXJ0IHRoZSBVUkwgY2hhbmdlIG9uXG4gIC8vIGEgUE9QIG5hdmlnYXRpb24gdGhhdCB3YXMgYmxvY2tlZCBieSB0aGUgdXNlciB3aXRob3V0IHRvdWNoaW5nIHJvdXRlciBzdGF0ZVxuICBsZXQgaWdub3JlTmV4dEhpc3RvcnlVcGRhdGUgPSBmYWxzZTtcbiAgLy8gSW5pdGlhbGl6ZSB0aGUgcm91dGVyLCBhbGwgc2lkZSBlZmZlY3RzIHNob3VsZCBiZSBraWNrZWQgb2ZmIGZyb20gaGVyZS5cbiAgLy8gSW1wbGVtZW50ZWQgYXMgYSBGbHVlbnQgQVBJIGZvciBlYXNlIG9mOlxuICAvLyAgIGxldCByb3V0ZXIgPSBjcmVhdGVSb3V0ZXIoaW5pdCkuaW5pdGlhbGl6ZSgpO1xuICBmdW5jdGlvbiBpbml0aWFsaXplKCkge1xuICAgIC8vIElmIGhpc3RvcnkgaW5mb3JtcyB1cyBvZiBhIFBPUCBuYXZpZ2F0aW9uLCBzdGFydCB0aGUgbmF2aWdhdGlvbiBidXQgZG8gbm90IHVwZGF0ZVxuICAgIC8vIHN0YXRlLiAgV2UnbGwgdXBkYXRlIG91ciBvd24gc3RhdGUgb25jZSB0aGUgbmF2aWdhdGlvbiBjb21wbGV0ZXNcbiAgICB1bmxpc3Rlbkhpc3RvcnkgPSBpbml0Lmhpc3RvcnkubGlzdGVuKF9yZWYgPT4ge1xuICAgICAgbGV0IHtcbiAgICAgICAgYWN0aW9uOiBoaXN0b3J5QWN0aW9uLFxuICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgZGVsdGFcbiAgICAgIH0gPSBfcmVmO1xuICAgICAgLy8gSWdub3JlIHRoaXMgZXZlbnQgaWYgaXQgd2FzIGp1c3QgdXMgcmVzZXR0aW5nIHRoZSBVUkwgZnJvbSBhXG4gICAgICAvLyBibG9ja2VkIFBPUCBuYXZpZ2F0aW9uXG4gICAgICBpZiAoaWdub3JlTmV4dEhpc3RvcnlVcGRhdGUpIHtcbiAgICAgICAgaWdub3JlTmV4dEhpc3RvcnlVcGRhdGUgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgd2FybmluZyhibG9ja2VyRnVuY3Rpb25zLnNpemUgPT09IDAgfHwgZGVsdGEgIT0gbnVsbCwgXCJZb3UgYXJlIHRyeWluZyB0byB1c2UgYSBibG9ja2VyIG9uIGEgUE9QIG5hdmlnYXRpb24gdG8gYSBsb2NhdGlvbiBcIiArIFwidGhhdCB3YXMgbm90IGNyZWF0ZWQgYnkgQHJlbWl4LXJ1bi9yb3V0ZXIuIFRoaXMgd2lsbCBmYWlsIHNpbGVudGx5IGluIFwiICsgXCJwcm9kdWN0aW9uLiBUaGlzIGNhbiBoYXBwZW4gaWYgeW91IGFyZSBuYXZpZ2F0aW5nIG91dHNpZGUgdGhlIHJvdXRlciBcIiArIFwidmlhIGB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGVgL2B3aW5kb3cubG9jYXRpb24uaGFzaGAgaW5zdGVhZCBvZiB1c2luZyBcIiArIFwicm91dGVyIG5hdmlnYXRpb24gQVBJcy4gIFRoaXMgY2FuIGFsc28gaGFwcGVuIGlmIHlvdSBhcmUgdXNpbmcgXCIgKyBcImNyZWF0ZUhhc2hSb3V0ZXIgYW5kIHRoZSB1c2VyIG1hbnVhbGx5IGNoYW5nZXMgdGhlIFVSTC5cIik7XG4gICAgICBsZXQgYmxvY2tlcktleSA9IHNob3VsZEJsb2NrTmF2aWdhdGlvbih7XG4gICAgICAgIGN1cnJlbnRMb2NhdGlvbjogc3RhdGUubG9jYXRpb24sXG4gICAgICAgIG5leHRMb2NhdGlvbjogbG9jYXRpb24sXG4gICAgICAgIGhpc3RvcnlBY3Rpb25cbiAgICAgIH0pO1xuICAgICAgaWYgKGJsb2NrZXJLZXkgJiYgZGVsdGEgIT0gbnVsbCkge1xuICAgICAgICAvLyBSZXN0b3JlIHRoZSBVUkwgdG8gbWF0Y2ggdGhlIGN1cnJlbnQgVUksIGJ1dCBkb24ndCB1cGRhdGUgcm91dGVyIHN0YXRlXG4gICAgICAgIGlnbm9yZU5leHRIaXN0b3J5VXBkYXRlID0gdHJ1ZTtcbiAgICAgICAgaW5pdC5oaXN0b3J5LmdvKGRlbHRhICogLTEpO1xuICAgICAgICAvLyBQdXQgdGhlIGJsb2NrZXIgaW50byBhIGJsb2NrZWQgc3RhdGVcbiAgICAgICAgdXBkYXRlQmxvY2tlcihibG9ja2VyS2V5LCB7XG4gICAgICAgICAgc3RhdGU6IFwiYmxvY2tlZFwiLFxuICAgICAgICAgIGxvY2F0aW9uLFxuICAgICAgICAgIHByb2NlZWQoKSB7XG4gICAgICAgICAgICB1cGRhdGVCbG9ja2VyKGJsb2NrZXJLZXksIHtcbiAgICAgICAgICAgICAgc3RhdGU6IFwicHJvY2VlZGluZ1wiLFxuICAgICAgICAgICAgICBwcm9jZWVkOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIHJlc2V0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIGxvY2F0aW9uXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIFJlLWRvIHRoZSBzYW1lIFBPUCBuYXZpZ2F0aW9uIHdlIGp1c3QgYmxvY2tlZFxuICAgICAgICAgICAgaW5pdC5oaXN0b3J5LmdvKGRlbHRhKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlc2V0KCkge1xuICAgICAgICAgICAgbGV0IGJsb2NrZXJzID0gbmV3IE1hcChzdGF0ZS5ibG9ja2Vycyk7XG4gICAgICAgICAgICBibG9ja2Vycy5zZXQoYmxvY2tlcktleSwgSURMRV9CTE9DS0VSKTtcbiAgICAgICAgICAgIHVwZGF0ZVN0YXRlKHtcbiAgICAgICAgICAgICAgYmxvY2tlcnNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdGFydE5hdmlnYXRpb24oaGlzdG9yeUFjdGlvbiwgbG9jYXRpb24pO1xuICAgIH0pO1xuICAgIGlmIChpc0Jyb3dzZXIpIHtcbiAgICAgIC8vIEZJWE1FOiBUaGlzIGZlZWxzIGdyb3NzLiAgSG93IGNhbiB3ZSBjbGVhbnVwIHRoZSBsaW5lcyBiZXR3ZWVuXG4gICAgICAvLyBzY3JvbGxSZXN0b3JhdGlvbi9hcHBsaWVkVHJhbnNpdGlvbnMgcGVyc2lzdGFuY2U/XG4gICAgICByZXN0b3JlQXBwbGllZFRyYW5zaXRpb25zKHJvdXRlcldpbmRvdywgYXBwbGllZFZpZXdUcmFuc2l0aW9ucyk7XG4gICAgICBsZXQgX3NhdmVBcHBsaWVkVHJhbnNpdGlvbnMgPSAoKSA9PiBwZXJzaXN0QXBwbGllZFRyYW5zaXRpb25zKHJvdXRlcldpbmRvdywgYXBwbGllZFZpZXdUcmFuc2l0aW9ucyk7XG4gICAgICByb3V0ZXJXaW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBhZ2VoaWRlXCIsIF9zYXZlQXBwbGllZFRyYW5zaXRpb25zKTtcbiAgICAgIHJlbW92ZVBhZ2VIaWRlRXZlbnRMaXN0ZW5lciA9ICgpID0+IHJvdXRlcldpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicGFnZWhpZGVcIiwgX3NhdmVBcHBsaWVkVHJhbnNpdGlvbnMpO1xuICAgIH1cbiAgICAvLyBLaWNrIG9mZiBpbml0aWFsIGRhdGEgbG9hZCBpZiBuZWVkZWQuICBVc2UgUG9wIHRvIGF2b2lkIG1vZGlmeWluZyBoaXN0b3J5XG4gICAgLy8gTm90ZSB3ZSBkb24ndCBkbyBhbnkgaGFuZGxpbmcgb2YgbGF6eSBoZXJlLiAgRm9yIFNQQSdzIGl0J2xsIGdldCBoYW5kbGVkXG4gICAgLy8gaW4gdGhlIG5vcm1hbCBuYXZpZ2F0aW9uIGZsb3cuICBGb3IgU1NSIGl0J3MgZXhwZWN0ZWQgdGhhdCBsYXp5IG1vZHVsZXMgYXJlXG4gICAgLy8gcmVzb2x2ZWQgcHJpb3IgdG8gcm91dGVyIGNyZWF0aW9uIHNpbmNlIHdlIGNhbid0IGdvIGludG8gYSBmYWxsYmFja0VsZW1lbnRcbiAgICAvLyBVSSBmb3IgU1NSJ2QgYXBwc1xuICAgIGlmICghc3RhdGUuaW5pdGlhbGl6ZWQpIHtcbiAgICAgIHN0YXJ0TmF2aWdhdGlvbihBY3Rpb24uUG9wLCBzdGF0ZS5sb2NhdGlvbik7XG4gICAgfVxuICAgIHJldHVybiByb3V0ZXI7XG4gIH1cbiAgLy8gQ2xlYW4gdXAgYSByb3V0ZXIgYW5kIGl0J3Mgc2lkZSBlZmZlY3RzXG4gIGZ1bmN0aW9uIGRpc3Bvc2UoKSB7XG4gICAgaWYgKHVubGlzdGVuSGlzdG9yeSkge1xuICAgICAgdW5saXN0ZW5IaXN0b3J5KCk7XG4gICAgfVxuICAgIGlmIChyZW1vdmVQYWdlSGlkZUV2ZW50TGlzdGVuZXIpIHtcbiAgICAgIHJlbW92ZVBhZ2VIaWRlRXZlbnRMaXN0ZW5lcigpO1xuICAgIH1cbiAgICBzdWJzY3JpYmVycy5jbGVhcigpO1xuICAgIHBlbmRpbmdOYXZpZ2F0aW9uQ29udHJvbGxlciAmJiBwZW5kaW5nTmF2aWdhdGlvbkNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICBzdGF0ZS5mZXRjaGVycy5mb3JFYWNoKChfLCBrZXkpID0+IGRlbGV0ZUZldGNoZXIoa2V5KSk7XG4gICAgc3RhdGUuYmxvY2tlcnMuZm9yRWFjaCgoXywga2V5KSA9PiBkZWxldGVCbG9ja2VyKGtleSkpO1xuICB9XG4gIC8vIFN1YnNjcmliZSB0byBzdGF0ZSB1cGRhdGVzIGZvciB0aGUgcm91dGVyXG4gIGZ1bmN0aW9uIHN1YnNjcmliZShmbikge1xuICAgIHN1YnNjcmliZXJzLmFkZChmbik7XG4gICAgcmV0dXJuICgpID0+IHN1YnNjcmliZXJzLmRlbGV0ZShmbik7XG4gIH1cbiAgLy8gVXBkYXRlIG91ciBzdGF0ZSBhbmQgbm90aWZ5IHRoZSBjYWxsaW5nIGNvbnRleHQgb2YgdGhlIGNoYW5nZVxuICBmdW5jdGlvbiB1cGRhdGVTdGF0ZShuZXdTdGF0ZSwgb3B0cykge1xuICAgIGlmIChvcHRzID09PSB2b2lkIDApIHtcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG4gICAgc3RhdGUgPSBfZXh0ZW5kcyh7fSwgc3RhdGUsIG5ld1N0YXRlKTtcbiAgICAvLyBQcmVwIGZldGNoZXIgY2xlYW51cCBzbyB3ZSBjYW4gdGVsbCB0aGUgVUkgd2hpY2ggZmV0Y2hlciBkYXRhIGVudHJpZXNcbiAgICAvLyBjYW4gYmUgcmVtb3ZlZFxuICAgIGxldCBjb21wbGV0ZWRGZXRjaGVycyA9IFtdO1xuICAgIGxldCBkZWxldGVkRmV0Y2hlcnNLZXlzID0gW107XG4gICAgaWYgKGZ1dHVyZS52N19mZXRjaGVyUGVyc2lzdCkge1xuICAgICAgc3RhdGUuZmV0Y2hlcnMuZm9yRWFjaCgoZmV0Y2hlciwga2V5KSA9PiB7XG4gICAgICAgIGlmIChmZXRjaGVyLnN0YXRlID09PSBcImlkbGVcIikge1xuICAgICAgICAgIGlmIChkZWxldGVkRmV0Y2hlcnMuaGFzKGtleSkpIHtcbiAgICAgICAgICAgIC8vIFVubW91bnRlZCBmcm9tIHRoZSBVSSBhbmQgY2FuIGJlIHRvdGFsbHkgcmVtb3ZlZFxuICAgICAgICAgICAgZGVsZXRlZEZldGNoZXJzS2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFJldHVybmVkIHRvIGlkbGUgYnV0IHN0aWxsIG1vdW50ZWQgaW4gdGhlIFVJLCBzbyBzZW1pLXJlbWFpbnMgZm9yXG4gICAgICAgICAgICAvLyByZXZhbGlkYXRpb25zIGFuZCBzdWNoXG4gICAgICAgICAgICBjb21wbGV0ZWRGZXRjaGVycy5wdXNoKGtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgLy8gSXRlcmF0ZSBvdmVyIGEgbG9jYWwgY29weSBzbyB0aGF0IGlmIGZsdXNoU3luYyBpcyB1c2VkIGFuZCB3ZSBlbmQgdXBcbiAgICAvLyByZW1vdmluZyBhbmQgYWRkaW5nIGEgbmV3IHN1YnNjcmliZXIgZHVlIHRvIHRoZSB1c2VDYWxsYmFjayBkZXBlbmRlbmNpZXMsXG4gICAgLy8gd2UgZG9uJ3QgZ2V0IG91cnNlbHZlcyBpbnRvIGEgbG9vcCBjYWxsaW5nIHRoZSBuZXcgc3Vic2NyaWJlciBpbW1lZGlhdGVseVxuICAgIFsuLi5zdWJzY3JpYmVyc10uZm9yRWFjaChzdWJzY3JpYmVyID0+IHN1YnNjcmliZXIoc3RhdGUsIHtcbiAgICAgIGRlbGV0ZWRGZXRjaGVyczogZGVsZXRlZEZldGNoZXJzS2V5cyxcbiAgICAgIHVuc3RhYmxlX3ZpZXdUcmFuc2l0aW9uT3B0czogb3B0cy52aWV3VHJhbnNpdGlvbk9wdHMsXG4gICAgICB1bnN0YWJsZV9mbHVzaFN5bmM6IG9wdHMuZmx1c2hTeW5jID09PSB0cnVlXG4gICAgfSkpO1xuICAgIC8vIFJlbW92ZSBpZGxlIGZldGNoZXJzIGZyb20gc3RhdGUgc2luY2Ugd2Ugb25seSBjYXJlIGFib3V0IGluLWZsaWdodCBmZXRjaGVycy5cbiAgICBpZiAoZnV0dXJlLnY3X2ZldGNoZXJQZXJzaXN0KSB7XG4gICAgICBjb21wbGV0ZWRGZXRjaGVycy5mb3JFYWNoKGtleSA9PiBzdGF0ZS5mZXRjaGVycy5kZWxldGUoa2V5KSk7XG4gICAgICBkZWxldGVkRmV0Y2hlcnNLZXlzLmZvckVhY2goa2V5ID0+IGRlbGV0ZUZldGNoZXIoa2V5KSk7XG4gICAgfVxuICB9XG4gIC8vIENvbXBsZXRlIGEgbmF2aWdhdGlvbiByZXR1cm5pbmcgdGhlIHN0YXRlLm5hdmlnYXRpb24gYmFjayB0byB0aGUgSURMRV9OQVZJR0FUSU9OXG4gIC8vIGFuZCBzZXR0aW5nIHN0YXRlLltoaXN0b3J5QWN0aW9uL2xvY2F0aW9uL21hdGNoZXNdIHRvIHRoZSBuZXcgcm91dGUuXG4gIC8vIC0gTG9jYXRpb24gaXMgYSByZXF1aXJlZCBwYXJhbVxuICAvLyAtIE5hdmlnYXRpb24gd2lsbCBhbHdheXMgYmUgc2V0IHRvIElETEVfTkFWSUdBVElPTlxuICAvLyAtIENhbiBwYXNzIGFueSBvdGhlciBzdGF0ZSBpbiBuZXdTdGF0ZVxuICBmdW5jdGlvbiBjb21wbGV0ZU5hdmlnYXRpb24obG9jYXRpb24sIG5ld1N0YXRlLCBfdGVtcCkge1xuICAgIHZhciBfbG9jYXRpb24kc3RhdGUsIF9sb2NhdGlvbiRzdGF0ZTI7XG4gICAgbGV0IHtcbiAgICAgIGZsdXNoU3luY1xuICAgIH0gPSBfdGVtcCA9PT0gdm9pZCAwID8ge30gOiBfdGVtcDtcbiAgICAvLyBEZWR1Y2UgaWYgd2UncmUgaW4gYSBsb2FkaW5nL2FjdGlvblJlbG9hZCBzdGF0ZTpcbiAgICAvLyAtIFdlIGhhdmUgY29tbWl0dGVkIGFjdGlvbkRhdGEgaW4gdGhlIHN0b3JlXG4gICAgLy8gLSBUaGUgY3VycmVudCBuYXZpZ2F0aW9uIHdhcyBhIG11dGF0aW9uIHN1Ym1pc3Npb25cbiAgICAvLyAtIFdlJ3JlIHBhc3QgdGhlIHN1Ym1pdHRpbmcgc3RhdGUgYW5kIGludG8gdGhlIGxvYWRpbmcgc3RhdGVcbiAgICAvLyAtIFRoZSBsb2NhdGlvbiBiZWluZyBsb2FkZWQgaXMgbm90IHRoZSByZXN1bHQgb2YgYSByZWRpcmVjdFxuICAgIGxldCBpc0FjdGlvblJlbG9hZCA9IHN0YXRlLmFjdGlvbkRhdGEgIT0gbnVsbCAmJiBzdGF0ZS5uYXZpZ2F0aW9uLmZvcm1NZXRob2QgIT0gbnVsbCAmJiBpc011dGF0aW9uTWV0aG9kKHN0YXRlLm5hdmlnYXRpb24uZm9ybU1ldGhvZCkgJiYgc3RhdGUubmF2aWdhdGlvbi5zdGF0ZSA9PT0gXCJsb2FkaW5nXCIgJiYgKChfbG9jYXRpb24kc3RhdGUgPSBsb2NhdGlvbi5zdGF0ZSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9sb2NhdGlvbiRzdGF0ZS5faXNSZWRpcmVjdCkgIT09IHRydWU7XG4gICAgbGV0IGFjdGlvbkRhdGE7XG4gICAgaWYgKG5ld1N0YXRlLmFjdGlvbkRhdGEpIHtcbiAgICAgIGlmIChPYmplY3Qua2V5cyhuZXdTdGF0ZS5hY3Rpb25EYXRhKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGFjdGlvbkRhdGEgPSBuZXdTdGF0ZS5hY3Rpb25EYXRhO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRW1wdHkgYWN0aW9uRGF0YSAtPiBjbGVhciBwcmlvciBhY3Rpb25EYXRhIGR1ZSB0byBhbiBhY3Rpb24gZXJyb3JcbiAgICAgICAgYWN0aW9uRGF0YSA9IG51bGw7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc0FjdGlvblJlbG9hZCkge1xuICAgICAgLy8gS2VlcCB0aGUgY3VycmVudCBkYXRhIGlmIHdlJ3JlIHdyYXBwaW5nIHVwIHRoZSBhY3Rpb24gcmVsb2FkXG4gICAgICBhY3Rpb25EYXRhID0gc3RhdGUuYWN0aW9uRGF0YTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ2xlYXIgYWN0aW9uRGF0YSBvbiBhbnkgb3RoZXIgY29tcGxldGVkIG5hdmlnYXRpb25zXG4gICAgICBhY3Rpb25EYXRhID0gbnVsbDtcbiAgICB9XG4gICAgLy8gQWx3YXlzIHByZXNlcnZlIGFueSBleGlzdGluZyBsb2FkZXJEYXRhIGZyb20gcmUtdXNlZCByb3V0ZXNcbiAgICBsZXQgbG9hZGVyRGF0YSA9IG5ld1N0YXRlLmxvYWRlckRhdGEgPyBtZXJnZUxvYWRlckRhdGEoc3RhdGUubG9hZGVyRGF0YSwgbmV3U3RhdGUubG9hZGVyRGF0YSwgbmV3U3RhdGUubWF0Y2hlcyB8fCBbXSwgbmV3U3RhdGUuZXJyb3JzKSA6IHN0YXRlLmxvYWRlckRhdGE7XG4gICAgLy8gT24gYSBzdWNjZXNzZnVsIG5hdmlnYXRpb24gd2UgY2FuIGFzc3VtZSB3ZSBnb3QgdGhyb3VnaCBhbGwgYmxvY2tlcnNcbiAgICAvLyBzbyB3ZSBjYW4gc3RhcnQgZnJlc2hcbiAgICBsZXQgYmxvY2tlcnMgPSBzdGF0ZS5ibG9ja2VycztcbiAgICBpZiAoYmxvY2tlcnMuc2l6ZSA+IDApIHtcbiAgICAgIGJsb2NrZXJzID0gbmV3IE1hcChibG9ja2Vycyk7XG4gICAgICBibG9ja2Vycy5mb3JFYWNoKChfLCBrKSA9PiBibG9ja2Vycy5zZXQoaywgSURMRV9CTE9DS0VSKSk7XG4gICAgfVxuICAgIC8vIEFsd2F5cyByZXNwZWN0IHRoZSB1c2VyIGZsYWcuICBPdGhlcndpc2UgZG9uJ3QgcmVzZXQgb24gbXV0YXRpb25cbiAgICAvLyBzdWJtaXNzaW9uIG5hdmlnYXRpb25zIHVubGVzcyB0aGV5IHJlZGlyZWN0XG4gICAgbGV0IHByZXZlbnRTY3JvbGxSZXNldCA9IHBlbmRpbmdQcmV2ZW50U2Nyb2xsUmVzZXQgPT09IHRydWUgfHwgc3RhdGUubmF2aWdhdGlvbi5mb3JtTWV0aG9kICE9IG51bGwgJiYgaXNNdXRhdGlvbk1ldGhvZChzdGF0ZS5uYXZpZ2F0aW9uLmZvcm1NZXRob2QpICYmICgoX2xvY2F0aW9uJHN0YXRlMiA9IGxvY2F0aW9uLnN0YXRlKSA9PSBudWxsID8gdm9pZCAwIDogX2xvY2F0aW9uJHN0YXRlMi5faXNSZWRpcmVjdCkgIT09IHRydWU7XG4gICAgaWYgKGluRmxpZ2h0RGF0YVJvdXRlcykge1xuICAgICAgZGF0YVJvdXRlcyA9IGluRmxpZ2h0RGF0YVJvdXRlcztcbiAgICAgIGluRmxpZ2h0RGF0YVJvdXRlcyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKGlzVW5pbnRlcnJ1cHRlZFJldmFsaWRhdGlvbikgOyBlbHNlIGlmIChwZW5kaW5nQWN0aW9uID09PSBBY3Rpb24uUG9wKSA7IGVsc2UgaWYgKHBlbmRpbmdBY3Rpb24gPT09IEFjdGlvbi5QdXNoKSB7XG4gICAgICBpbml0Lmhpc3RvcnkucHVzaChsb2NhdGlvbiwgbG9jYXRpb24uc3RhdGUpO1xuICAgIH0gZWxzZSBpZiAocGVuZGluZ0FjdGlvbiA9PT0gQWN0aW9uLlJlcGxhY2UpIHtcbiAgICAgIGluaXQuaGlzdG9yeS5yZXBsYWNlKGxvY2F0aW9uLCBsb2NhdGlvbi5zdGF0ZSk7XG4gICAgfVxuICAgIGxldCB2aWV3VHJhbnNpdGlvbk9wdHM7XG4gICAgLy8gT24gUE9QLCBlbmFibGUgdHJhbnNpdGlvbnMgaWYgdGhleSB3ZXJlIGVuYWJsZWQgb24gdGhlIG9yaWdpbmFsIG5hdmlnYXRpb25cbiAgICBpZiAocGVuZGluZ0FjdGlvbiA9PT0gQWN0aW9uLlBvcCkge1xuICAgICAgLy8gRm9yd2FyZCB0YWtlcyBwcmVjZWRlbmNlIHNvIHRoZXkgYmVoYXZlIGxpa2UgdGhlIG9yaWdpbmFsIG5hdmlnYXRpb25cbiAgICAgIGxldCBwcmlvclBhdGhzID0gYXBwbGllZFZpZXdUcmFuc2l0aW9ucy5nZXQoc3RhdGUubG9jYXRpb24ucGF0aG5hbWUpO1xuICAgICAgaWYgKHByaW9yUGF0aHMgJiYgcHJpb3JQYXRocy5oYXMobG9jYXRpb24ucGF0aG5hbWUpKSB7XG4gICAgICAgIHZpZXdUcmFuc2l0aW9uT3B0cyA9IHtcbiAgICAgICAgICBjdXJyZW50TG9jYXRpb246IHN0YXRlLmxvY2F0aW9uLFxuICAgICAgICAgIG5leHRMb2NhdGlvbjogbG9jYXRpb25cbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAoYXBwbGllZFZpZXdUcmFuc2l0aW9ucy5oYXMobG9jYXRpb24ucGF0aG5hbWUpKSB7XG4gICAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgYSBwcmV2aW91cyBmb3J3YXJkIG5hdiwgYXNzdW1lIHdlJ3JlIHBvcHBpbmcgYmFjayB0b1xuICAgICAgICAvLyB0aGUgbmV3IGxvY2F0aW9uIGFuZCBlbmFibGUgaWYgdGhhdCBsb2NhdGlvbiBwcmV2aW91c2x5IGVuYWJsZWRcbiAgICAgICAgdmlld1RyYW5zaXRpb25PcHRzID0ge1xuICAgICAgICAgIGN1cnJlbnRMb2NhdGlvbjogbG9jYXRpb24sXG4gICAgICAgICAgbmV4dExvY2F0aW9uOiBzdGF0ZS5sb2NhdGlvblxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocGVuZGluZ1ZpZXdUcmFuc2l0aW9uRW5hYmxlZCkge1xuICAgICAgLy8gU3RvcmUgdGhlIGFwcGxpZWQgdHJhbnNpdGlvbiBvbiBQVVNIL1JFUExBQ0VcbiAgICAgIGxldCB0b1BhdGhzID0gYXBwbGllZFZpZXdUcmFuc2l0aW9ucy5nZXQoc3RhdGUubG9jYXRpb24ucGF0aG5hbWUpO1xuICAgICAgaWYgKHRvUGF0aHMpIHtcbiAgICAgICAgdG9QYXRocy5hZGQobG9jYXRpb24ucGF0aG5hbWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdG9QYXRocyA9IG5ldyBTZXQoW2xvY2F0aW9uLnBhdGhuYW1lXSk7XG4gICAgICAgIGFwcGxpZWRWaWV3VHJhbnNpdGlvbnMuc2V0KHN0YXRlLmxvY2F0aW9uLnBhdGhuYW1lLCB0b1BhdGhzKTtcbiAgICAgIH1cbiAgICAgIHZpZXdUcmFuc2l0aW9uT3B0cyA9IHtcbiAgICAgICAgY3VycmVudExvY2F0aW9uOiBzdGF0ZS5sb2NhdGlvbixcbiAgICAgICAgbmV4dExvY2F0aW9uOiBsb2NhdGlvblxuICAgICAgfTtcbiAgICB9XG4gICAgdXBkYXRlU3RhdGUoX2V4dGVuZHMoe30sIG5ld1N0YXRlLCB7XG4gICAgICBhY3Rpb25EYXRhLFxuICAgICAgbG9hZGVyRGF0YSxcbiAgICAgIGhpc3RvcnlBY3Rpb246IHBlbmRpbmdBY3Rpb24sXG4gICAgICBsb2NhdGlvbixcbiAgICAgIGluaXRpYWxpemVkOiB0cnVlLFxuICAgICAgbmF2aWdhdGlvbjogSURMRV9OQVZJR0FUSU9OLFxuICAgICAgcmV2YWxpZGF0aW9uOiBcImlkbGVcIixcbiAgICAgIHJlc3RvcmVTY3JvbGxQb3NpdGlvbjogZ2V0U2F2ZWRTY3JvbGxQb3NpdGlvbihsb2NhdGlvbiwgbmV3U3RhdGUubWF0Y2hlcyB8fCBzdGF0ZS5tYXRjaGVzKSxcbiAgICAgIHByZXZlbnRTY3JvbGxSZXNldCxcbiAgICAgIGJsb2NrZXJzXG4gICAgfSksIHtcbiAgICAgIHZpZXdUcmFuc2l0aW9uT3B0cyxcbiAgICAgIGZsdXNoU3luYzogZmx1c2hTeW5jID09PSB0cnVlXG4gICAgfSk7XG4gICAgLy8gUmVzZXQgc3RhdGVmdWwgbmF2aWdhdGlvbiB2YXJzXG4gICAgcGVuZGluZ0FjdGlvbiA9IEFjdGlvbi5Qb3A7XG4gICAgcGVuZGluZ1ByZXZlbnRTY3JvbGxSZXNldCA9IGZhbHNlO1xuICAgIHBlbmRpbmdWaWV3VHJhbnNpdGlvbkVuYWJsZWQgPSBmYWxzZTtcbiAgICBpc1VuaW50ZXJydXB0ZWRSZXZhbGlkYXRpb24gPSBmYWxzZTtcbiAgICBpc1JldmFsaWRhdGlvblJlcXVpcmVkID0gZmFsc2U7XG4gICAgY2FuY2VsbGVkRGVmZXJyZWRSb3V0ZXMgPSBbXTtcbiAgICBjYW5jZWxsZWRGZXRjaGVyTG9hZHMgPSBbXTtcbiAgfVxuICAvLyBUcmlnZ2VyIGEgbmF2aWdhdGlvbiBldmVudCwgd2hpY2ggY2FuIGVpdGhlciBiZSBhIG51bWVyaWNhbCBQT1Agb3IgYSBQVVNIXG4gIC8vIHJlcGxhY2Ugd2l0aCBhbiBvcHRpb25hbCBzdWJtaXNzaW9uXG4gIGFzeW5jIGZ1bmN0aW9uIG5hdmlnYXRlKHRvLCBvcHRzKSB7XG4gICAgaWYgKHR5cGVvZiB0byA9PT0gXCJudW1iZXJcIikge1xuICAgICAgaW5pdC5oaXN0b3J5LmdvKHRvKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IG5vcm1hbGl6ZWRQYXRoID0gbm9ybWFsaXplVG8oc3RhdGUubG9jYXRpb24sIHN0YXRlLm1hdGNoZXMsIGJhc2VuYW1lLCBmdXR1cmUudjdfcHJlcGVuZEJhc2VuYW1lLCB0bywgb3B0cyA9PSBudWxsID8gdm9pZCAwIDogb3B0cy5mcm9tUm91dGVJZCwgb3B0cyA9PSBudWxsID8gdm9pZCAwIDogb3B0cy5yZWxhdGl2ZSk7XG4gICAgbGV0IHtcbiAgICAgIHBhdGgsXG4gICAgICBzdWJtaXNzaW9uLFxuICAgICAgZXJyb3JcbiAgICB9ID0gbm9ybWFsaXplTmF2aWdhdGVPcHRpb25zKGZ1dHVyZS52N19ub3JtYWxpemVGb3JtTWV0aG9kLCBmYWxzZSwgbm9ybWFsaXplZFBhdGgsIG9wdHMpO1xuICAgIGxldCBjdXJyZW50TG9jYXRpb24gPSBzdGF0ZS5sb2NhdGlvbjtcbiAgICBsZXQgbmV4dExvY2F0aW9uID0gY3JlYXRlTG9jYXRpb24oc3RhdGUubG9jYXRpb24sIHBhdGgsIG9wdHMgJiYgb3B0cy5zdGF0ZSk7XG4gICAgLy8gV2hlbiB1c2luZyBuYXZpZ2F0ZSBhcyBhIFBVU0gvUkVQTEFDRSB3ZSBhcmVuJ3QgcmVhZGluZyBhbiBhbHJlYWR5LWVuY29kZWRcbiAgICAvLyBVUkwgZnJvbSB3aW5kb3cubG9jYXRpb24sIHNvIHdlIG5lZWQgdG8gZW5jb2RlIGl0IGhlcmUgc28gdGhlIGJlaGF2aW9yXG4gICAgLy8gcmVtYWlucyB0aGUgc2FtZSBhcyBQT1AgYW5kIG5vbi1kYXRhLXJvdXRlciB1c2FnZXMuICBuZXcgVVJMKCkgZG9lcyBhbGxcbiAgICAvLyB0aGUgc2FtZSBlbmNvZGluZyB3ZSdkIGdldCBmcm9tIGEgaGlzdG9yeS5wdXNoU3RhdGUvd2luZG93LmxvY2F0aW9uIHJlYWRcbiAgICAvLyB3aXRob3V0IGhhdmluZyB0byB0b3VjaCBoaXN0b3J5XG4gICAgbmV4dExvY2F0aW9uID0gX2V4dGVuZHMoe30sIG5leHRMb2NhdGlvbiwgaW5pdC5oaXN0b3J5LmVuY29kZUxvY2F0aW9uKG5leHRMb2NhdGlvbikpO1xuICAgIGxldCB1c2VyUmVwbGFjZSA9IG9wdHMgJiYgb3B0cy5yZXBsYWNlICE9IG51bGwgPyBvcHRzLnJlcGxhY2UgOiB1bmRlZmluZWQ7XG4gICAgbGV0IGhpc3RvcnlBY3Rpb24gPSBBY3Rpb24uUHVzaDtcbiAgICBpZiAodXNlclJlcGxhY2UgPT09IHRydWUpIHtcbiAgICAgIGhpc3RvcnlBY3Rpb24gPSBBY3Rpb24uUmVwbGFjZTtcbiAgICB9IGVsc2UgaWYgKHVzZXJSZXBsYWNlID09PSBmYWxzZSkgOyBlbHNlIGlmIChzdWJtaXNzaW9uICE9IG51bGwgJiYgaXNNdXRhdGlvbk1ldGhvZChzdWJtaXNzaW9uLmZvcm1NZXRob2QpICYmIHN1Ym1pc3Npb24uZm9ybUFjdGlvbiA9PT0gc3RhdGUubG9jYXRpb24ucGF0aG5hbWUgKyBzdGF0ZS5sb2NhdGlvbi5zZWFyY2gpIHtcbiAgICAgIC8vIEJ5IGRlZmF1bHQgb24gc3VibWlzc2lvbnMgdG8gdGhlIGN1cnJlbnQgbG9jYXRpb24gd2UgUkVQTEFDRSBzbyB0aGF0XG4gICAgICAvLyB1c2VycyBkb24ndCBoYXZlIHRvIGRvdWJsZS1jbGljayB0aGUgYmFjayBidXR0b24gdG8gZ2V0IHRvIHRoZSBwcmlvclxuICAgICAgLy8gbG9jYXRpb24uICBJZiB0aGUgdXNlciByZWRpcmVjdHMgdG8gYSBkaWZmZXJlbnQgbG9jYXRpb24gZnJvbSB0aGVcbiAgICAgIC8vIGFjdGlvbi9sb2FkZXIgdGhpcyB3aWxsIGJlIGlnbm9yZWQgYW5kIHRoZSByZWRpcmVjdCB3aWxsIGJlIGEgUFVTSFxuICAgICAgaGlzdG9yeUFjdGlvbiA9IEFjdGlvbi5SZXBsYWNlO1xuICAgIH1cbiAgICBsZXQgcHJldmVudFNjcm9sbFJlc2V0ID0gb3B0cyAmJiBcInByZXZlbnRTY3JvbGxSZXNldFwiIGluIG9wdHMgPyBvcHRzLnByZXZlbnRTY3JvbGxSZXNldCA9PT0gdHJ1ZSA6IHVuZGVmaW5lZDtcbiAgICBsZXQgZmx1c2hTeW5jID0gKG9wdHMgJiYgb3B0cy51bnN0YWJsZV9mbHVzaFN5bmMpID09PSB0cnVlO1xuICAgIGxldCBibG9ja2VyS2V5ID0gc2hvdWxkQmxvY2tOYXZpZ2F0aW9uKHtcbiAgICAgIGN1cnJlbnRMb2NhdGlvbixcbiAgICAgIG5leHRMb2NhdGlvbixcbiAgICAgIGhpc3RvcnlBY3Rpb25cbiAgICB9KTtcbiAgICBpZiAoYmxvY2tlcktleSkge1xuICAgICAgLy8gUHV0IHRoZSBibG9ja2VyIGludG8gYSBibG9ja2VkIHN0YXRlXG4gICAgICB1cGRhdGVCbG9ja2VyKGJsb2NrZXJLZXksIHtcbiAgICAgICAgc3RhdGU6IFwiYmxvY2tlZFwiLFxuICAgICAgICBsb2NhdGlvbjogbmV4dExvY2F0aW9uLFxuICAgICAgICBwcm9jZWVkKCkge1xuICAgICAgICAgIHVwZGF0ZUJsb2NrZXIoYmxvY2tlcktleSwge1xuICAgICAgICAgICAgc3RhdGU6IFwicHJvY2VlZGluZ1wiLFxuICAgICAgICAgICAgcHJvY2VlZDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgcmVzZXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGxvY2F0aW9uOiBuZXh0TG9jYXRpb25cbiAgICAgICAgICB9KTtcbiAgICAgICAgICAvLyBTZW5kIHRoZSBzYW1lIG5hdmlnYXRpb24gdGhyb3VnaFxuICAgICAgICAgIG5hdmlnYXRlKHRvLCBvcHRzKTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVzZXQoKSB7XG4gICAgICAgICAgbGV0IGJsb2NrZXJzID0gbmV3IE1hcChzdGF0ZS5ibG9ja2Vycyk7XG4gICAgICAgICAgYmxvY2tlcnMuc2V0KGJsb2NrZXJLZXksIElETEVfQkxPQ0tFUik7XG4gICAgICAgICAgdXBkYXRlU3RhdGUoe1xuICAgICAgICAgICAgYmxvY2tlcnNcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCBzdGFydE5hdmlnYXRpb24oaGlzdG9yeUFjdGlvbiwgbmV4dExvY2F0aW9uLCB7XG4gICAgICBzdWJtaXNzaW9uLFxuICAgICAgLy8gU2VuZCB0aHJvdWdoIHRoZSBmb3JtRGF0YSBzZXJpYWxpemF0aW9uIGVycm9yIGlmIHdlIGhhdmUgb25lIHNvIHdlIGNhblxuICAgICAgLy8gcmVuZGVyIGF0IHRoZSByaWdodCBlcnJvciBib3VuZGFyeSBhZnRlciB3ZSBtYXRjaCByb3V0ZXNcbiAgICAgIHBlbmRpbmdFcnJvcjogZXJyb3IsXG4gICAgICBwcmV2ZW50U2Nyb2xsUmVzZXQsXG4gICAgICByZXBsYWNlOiBvcHRzICYmIG9wdHMucmVwbGFjZSxcbiAgICAgIGVuYWJsZVZpZXdUcmFuc2l0aW9uOiBvcHRzICYmIG9wdHMudW5zdGFibGVfdmlld1RyYW5zaXRpb24sXG4gICAgICBmbHVzaFN5bmNcbiAgICB9KTtcbiAgfVxuICAvLyBSZXZhbGlkYXRlIGFsbCBjdXJyZW50IGxvYWRlcnMuICBJZiBhIG5hdmlnYXRpb24gaXMgaW4gcHJvZ3Jlc3Mgb3IgaWYgdGhpc1xuICAvLyBpcyBpbnRlcnJ1cHRlZCBieSBhIG5hdmlnYXRpb24sIGFsbG93IHRoaXMgdG8gXCJzdWNjZWVkXCIgYnkgY2FsbGluZyBhbGxcbiAgLy8gbG9hZGVycyBkdXJpbmcgdGhlIG5leHQgbG9hZGVyIHJvdW5kXG4gIGZ1bmN0aW9uIHJldmFsaWRhdGUoKSB7XG4gICAgaW50ZXJydXB0QWN0aXZlTG9hZHMoKTtcbiAgICB1cGRhdGVTdGF0ZSh7XG4gICAgICByZXZhbGlkYXRpb246IFwibG9hZGluZ1wiXG4gICAgfSk7XG4gICAgLy8gSWYgd2UncmUgY3VycmVudGx5IHN1Ym1pdHRpbmcgYW4gYWN0aW9uLCB3ZSBkb24ndCBuZWVkIHRvIHN0YXJ0IGEgbmV3XG4gICAgLy8gbmF2aWdhdGlvbiwgd2UnbGwganVzdCBsZXQgdGhlIGZvbGxvdyB1cCBsb2FkZXIgZXhlY3V0aW9uIGNhbGwgYWxsIGxvYWRlcnNcbiAgICBpZiAoc3RhdGUubmF2aWdhdGlvbi5zdGF0ZSA9PT0gXCJzdWJtaXR0aW5nXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gSWYgd2UncmUgY3VycmVudGx5IGluIGFuIGlkbGUgc3RhdGUsIHN0YXJ0IGEgbmV3IG5hdmlnYXRpb24gZm9yIHRoZSBjdXJyZW50XG4gICAgLy8gYWN0aW9uL2xvY2F0aW9uIGFuZCBtYXJrIGl0IGFzIHVuaW50ZXJydXB0ZWQsIHdoaWNoIHdpbGwgc2tpcCB0aGUgaGlzdG9yeVxuICAgIC8vIHVwZGF0ZSBpbiBjb21wbGV0ZU5hdmlnYXRpb25cbiAgICBpZiAoc3RhdGUubmF2aWdhdGlvbi5zdGF0ZSA9PT0gXCJpZGxlXCIpIHtcbiAgICAgIHN0YXJ0TmF2aWdhdGlvbihzdGF0ZS5oaXN0b3J5QWN0aW9uLCBzdGF0ZS5sb2NhdGlvbiwge1xuICAgICAgICBzdGFydFVuaW50ZXJydXB0ZWRSZXZhbGlkYXRpb246IHRydWVcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBPdGhlcndpc2UsIGlmIHdlJ3JlIGN1cnJlbnRseSBpbiBhIGxvYWRpbmcgc3RhdGUsIGp1c3Qgc3RhcnQgYSBuZXdcbiAgICAvLyBuYXZpZ2F0aW9uIHRvIHRoZSBuYXZpZ2F0aW9uLmxvY2F0aW9uIGJ1dCBkbyBub3QgdHJpZ2dlciBhbiB1bmludGVycnVwdGVkXG4gICAgLy8gcmV2YWxpZGF0aW9uIHNvIHRoYXQgaGlzdG9yeSBjb3JyZWN0bHkgdXBkYXRlcyBvbmNlIHRoZSBuYXZpZ2F0aW9uIGNvbXBsZXRlc1xuICAgIHN0YXJ0TmF2aWdhdGlvbihwZW5kaW5nQWN0aW9uIHx8IHN0YXRlLmhpc3RvcnlBY3Rpb24sIHN0YXRlLm5hdmlnYXRpb24ubG9jYXRpb24sIHtcbiAgICAgIG92ZXJyaWRlTmF2aWdhdGlvbjogc3RhdGUubmF2aWdhdGlvblxuICAgIH0pO1xuICB9XG4gIC8vIFN0YXJ0IGEgbmF2aWdhdGlvbiB0byB0aGUgZ2l2ZW4gYWN0aW9uL2xvY2F0aW9uLiAgQ2FuIG9wdGlvbmFsbHkgcHJvdmlkZSBhXG4gIC8vIG92ZXJyaWRlTmF2aWdhdGlvbiB3aGljaCB3aWxsIG92ZXJyaWRlIHRoZSBub3JtYWxMb2FkIGluIHRoZSBjYXNlIG9mIGEgcmVkaXJlY3RcbiAgLy8gbmF2aWdhdGlvblxuICBhc3luYyBmdW5jdGlvbiBzdGFydE5hdmlnYXRpb24oaGlzdG9yeUFjdGlvbiwgbG9jYXRpb24sIG9wdHMpIHtcbiAgICAvLyBBYm9ydCBhbnkgaW4tcHJvZ3Jlc3MgbmF2aWdhdGlvbnMgYW5kIHN0YXJ0IGEgbmV3IG9uZS4gVW5zZXQgYW55IG9uZ29pbmdcbiAgICAvLyB1bmludGVycnVwdGVkIHJldmFsaWRhdGlvbnMgdW5sZXNzIHRvbGQgb3RoZXJ3aXNlLCBzaW5jZSB3ZSB3YW50IHRoaXNcbiAgICAvLyBuZXcgbmF2aWdhdGlvbiB0byB1cGRhdGUgaGlzdG9yeSBub3JtYWxseVxuICAgIHBlbmRpbmdOYXZpZ2F0aW9uQ29udHJvbGxlciAmJiBwZW5kaW5nTmF2aWdhdGlvbkNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICBwZW5kaW5nTmF2aWdhdGlvbkNvbnRyb2xsZXIgPSBudWxsO1xuICAgIHBlbmRpbmdBY3Rpb24gPSBoaXN0b3J5QWN0aW9uO1xuICAgIGlzVW5pbnRlcnJ1cHRlZFJldmFsaWRhdGlvbiA9IChvcHRzICYmIG9wdHMuc3RhcnRVbmludGVycnVwdGVkUmV2YWxpZGF0aW9uKSA9PT0gdHJ1ZTtcbiAgICAvLyBTYXZlIHRoZSBjdXJyZW50IHNjcm9sbCBwb3NpdGlvbiBldmVyeSB0aW1lIHdlIHN0YXJ0IGEgbmV3IG5hdmlnYXRpb24sXG4gICAgLy8gYW5kIHRyYWNrIHdoZXRoZXIgd2Ugc2hvdWxkIHJlc2V0IHNjcm9sbCBvbiBjb21wbGV0aW9uXG4gICAgc2F2ZVNjcm9sbFBvc2l0aW9uKHN0YXRlLmxvY2F0aW9uLCBzdGF0ZS5tYXRjaGVzKTtcbiAgICBwZW5kaW5nUHJldmVudFNjcm9sbFJlc2V0ID0gKG9wdHMgJiYgb3B0cy5wcmV2ZW50U2Nyb2xsUmVzZXQpID09PSB0cnVlO1xuICAgIHBlbmRpbmdWaWV3VHJhbnNpdGlvbkVuYWJsZWQgPSAob3B0cyAmJiBvcHRzLmVuYWJsZVZpZXdUcmFuc2l0aW9uKSA9PT0gdHJ1ZTtcbiAgICBsZXQgcm91dGVzVG9Vc2UgPSBpbkZsaWdodERhdGFSb3V0ZXMgfHwgZGF0YVJvdXRlcztcbiAgICBsZXQgbG9hZGluZ05hdmlnYXRpb24gPSBvcHRzICYmIG9wdHMub3ZlcnJpZGVOYXZpZ2F0aW9uO1xuICAgIGxldCBtYXRjaGVzID0gbWF0Y2hSb3V0ZXMocm91dGVzVG9Vc2UsIGxvY2F0aW9uLCBiYXNlbmFtZSk7XG4gICAgbGV0IGZsdXNoU3luYyA9IChvcHRzICYmIG9wdHMuZmx1c2hTeW5jKSA9PT0gdHJ1ZTtcbiAgICAvLyBTaG9ydCBjaXJjdWl0IHdpdGggYSA0MDQgb24gdGhlIHJvb3QgZXJyb3IgYm91bmRhcnkgaWYgd2UgbWF0Y2ggbm90aGluZ1xuICAgIGlmICghbWF0Y2hlcykge1xuICAgICAgbGV0IGVycm9yID0gZ2V0SW50ZXJuYWxSb3V0ZXJFcnJvcig0MDQsIHtcbiAgICAgICAgcGF0aG5hbWU6IGxvY2F0aW9uLnBhdGhuYW1lXG4gICAgICB9KTtcbiAgICAgIGxldCB7XG4gICAgICAgIG1hdGNoZXM6IG5vdEZvdW5kTWF0Y2hlcyxcbiAgICAgICAgcm91dGVcbiAgICAgIH0gPSBnZXRTaG9ydENpcmN1aXRNYXRjaGVzKHJvdXRlc1RvVXNlKTtcbiAgICAgIC8vIENhbmNlbCBhbGwgcGVuZGluZyBkZWZlcnJlZCBvbiA0MDRzIHNpbmNlIHdlIGRvbid0IGtlZXAgYW55IHJvdXRlc1xuICAgICAgY2FuY2VsQWN0aXZlRGVmZXJyZWRzKCk7XG4gICAgICBjb21wbGV0ZU5hdmlnYXRpb24obG9jYXRpb24sIHtcbiAgICAgICAgbWF0Y2hlczogbm90Rm91bmRNYXRjaGVzLFxuICAgICAgICBsb2FkZXJEYXRhOiB7fSxcbiAgICAgICAgZXJyb3JzOiB7XG4gICAgICAgICAgW3JvdXRlLmlkXTogZXJyb3JcbiAgICAgICAgfVxuICAgICAgfSwge1xuICAgICAgICBmbHVzaFN5bmNcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBTaG9ydCBjaXJjdWl0IGlmIGl0J3Mgb25seSBhIGhhc2ggY2hhbmdlIGFuZCBub3QgYSByZXZhbGlkYXRpb24gb3JcbiAgICAvLyBtdXRhdGlvbiBzdWJtaXNzaW9uLlxuICAgIC8vXG4gICAgLy8gSWdub3JlIG9uIGluaXRpYWwgcGFnZSBsb2FkcyBiZWNhdXNlIHNpbmNlIHRoZSBpbml0aWFsIGxvYWQgd2lsbCBhbHdheXNcbiAgICAvLyBiZSBcInNhbWUgaGFzaFwiLiAgRm9yIGV4YW1wbGUsIG9uIC9wYWdlI2hhc2ggYW5kIHN1Ym1pdCBhIDxGb3JtIG1ldGhvZD1cInBvc3RcIj5cbiAgICAvLyB3aGljaCB3aWxsIGRlZmF1bHQgdG8gYSBuYXZpZ2F0aW9uIHRvIC9wYWdlXG4gICAgaWYgKHN0YXRlLmluaXRpYWxpemVkICYmICFpc1JldmFsaWRhdGlvblJlcXVpcmVkICYmIGlzSGFzaENoYW5nZU9ubHkoc3RhdGUubG9jYXRpb24sIGxvY2F0aW9uKSAmJiAhKG9wdHMgJiYgb3B0cy5zdWJtaXNzaW9uICYmIGlzTXV0YXRpb25NZXRob2Qob3B0cy5zdWJtaXNzaW9uLmZvcm1NZXRob2QpKSkge1xuICAgICAgY29tcGxldGVOYXZpZ2F0aW9uKGxvY2F0aW9uLCB7XG4gICAgICAgIG1hdGNoZXNcbiAgICAgIH0sIHtcbiAgICAgICAgZmx1c2hTeW5jXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gQ3JlYXRlIGEgY29udHJvbGxlci9SZXF1ZXN0IGZvciB0aGlzIG5hdmlnYXRpb25cbiAgICBwZW5kaW5nTmF2aWdhdGlvbkNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgbGV0IHJlcXVlc3QgPSBjcmVhdGVDbGllbnRTaWRlUmVxdWVzdChpbml0Lmhpc3RvcnksIGxvY2F0aW9uLCBwZW5kaW5nTmF2aWdhdGlvbkNvbnRyb2xsZXIuc2lnbmFsLCBvcHRzICYmIG9wdHMuc3VibWlzc2lvbik7XG4gICAgbGV0IHBlbmRpbmdBY3Rpb25EYXRhO1xuICAgIGxldCBwZW5kaW5nRXJyb3I7XG4gICAgaWYgKG9wdHMgJiYgb3B0cy5wZW5kaW5nRXJyb3IpIHtcbiAgICAgIC8vIElmIHdlIGhhdmUgYSBwZW5kaW5nRXJyb3IsIGl0IG1lYW5zIHRoZSB1c2VyIGF0dGVtcHRlZCBhIEdFVCBzdWJtaXNzaW9uXG4gICAgICAvLyB3aXRoIGJpbmFyeSBGb3JtRGF0YSBzbyBhc3NpZ24gaGVyZSBhbmQgc2tpcCB0byBoYW5kbGVMb2FkZXJzLiAgVGhhdFxuICAgICAgLy8gd2F5IHdlIGhhbmRsZSBjYWxsaW5nIGxvYWRlcnMgYWJvdmUgdGhlIGJvdW5kYXJ5IGV0Yy4gIEl0J3Mgbm90IHJlYWxseVxuICAgICAgLy8gZGlmZmVyZW50IGZyb20gYW4gYWN0aW9uRXJyb3IgaW4gdGhhdCBzZW5zZS5cbiAgICAgIHBlbmRpbmdFcnJvciA9IHtcbiAgICAgICAgW2ZpbmROZWFyZXN0Qm91bmRhcnkobWF0Y2hlcykucm91dGUuaWRdOiBvcHRzLnBlbmRpbmdFcnJvclxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKG9wdHMgJiYgb3B0cy5zdWJtaXNzaW9uICYmIGlzTXV0YXRpb25NZXRob2Qob3B0cy5zdWJtaXNzaW9uLmZvcm1NZXRob2QpKSB7XG4gICAgICAvLyBDYWxsIGFjdGlvbiBpZiB3ZSByZWNlaXZlZCBhbiBhY3Rpb24gc3VibWlzc2lvblxuICAgICAgbGV0IGFjdGlvbk91dHB1dCA9IGF3YWl0IGhhbmRsZUFjdGlvbihyZXF1ZXN0LCBsb2NhdGlvbiwgb3B0cy5zdWJtaXNzaW9uLCBtYXRjaGVzLCB7XG4gICAgICAgIHJlcGxhY2U6IG9wdHMucmVwbGFjZSxcbiAgICAgICAgZmx1c2hTeW5jXG4gICAgICB9KTtcbiAgICAgIGlmIChhY3Rpb25PdXRwdXQuc2hvcnRDaXJjdWl0ZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcGVuZGluZ0FjdGlvbkRhdGEgPSBhY3Rpb25PdXRwdXQucGVuZGluZ0FjdGlvbkRhdGE7XG4gICAgICBwZW5kaW5nRXJyb3IgPSBhY3Rpb25PdXRwdXQucGVuZGluZ0FjdGlvbkVycm9yO1xuICAgICAgbG9hZGluZ05hdmlnYXRpb24gPSBnZXRMb2FkaW5nTmF2aWdhdGlvbihsb2NhdGlvbiwgb3B0cy5zdWJtaXNzaW9uKTtcbiAgICAgIGZsdXNoU3luYyA9IGZhbHNlO1xuICAgICAgLy8gQ3JlYXRlIGEgR0VUIHJlcXVlc3QgZm9yIHRoZSBsb2FkZXJzXG4gICAgICByZXF1ZXN0ID0gbmV3IFJlcXVlc3QocmVxdWVzdC51cmwsIHtcbiAgICAgICAgc2lnbmFsOiByZXF1ZXN0LnNpZ25hbFxuICAgICAgfSk7XG4gICAgfVxuICAgIC8vIENhbGwgbG9hZGVyc1xuICAgIGxldCB7XG4gICAgICBzaG9ydENpcmN1aXRlZCxcbiAgICAgIGxvYWRlckRhdGEsXG4gICAgICBlcnJvcnNcbiAgICB9ID0gYXdhaXQgaGFuZGxlTG9hZGVycyhyZXF1ZXN0LCBsb2NhdGlvbiwgbWF0Y2hlcywgbG9hZGluZ05hdmlnYXRpb24sIG9wdHMgJiYgb3B0cy5zdWJtaXNzaW9uLCBvcHRzICYmIG9wdHMuZmV0Y2hlclN1Ym1pc3Npb24sIG9wdHMgJiYgb3B0cy5yZXBsYWNlLCBmbHVzaFN5bmMsIHBlbmRpbmdBY3Rpb25EYXRhLCBwZW5kaW5nRXJyb3IpO1xuICAgIGlmIChzaG9ydENpcmN1aXRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBDbGVhbiB1cCBub3cgdGhhdCB0aGUgYWN0aW9uL2xvYWRlcnMgaGF2ZSBjb21wbGV0ZWQuICBEb24ndCBjbGVhbiB1cCBpZlxuICAgIC8vIHdlIHNob3J0IGNpcmN1aXRlZCBiZWNhdXNlIHBlbmRpbmdOYXZpZ2F0aW9uQ29udHJvbGxlciB3aWxsIGhhdmUgYWxyZWFkeVxuICAgIC8vIGJlZW4gYXNzaWduZWQgdG8gYSBuZXcgY29udHJvbGxlciBmb3IgdGhlIG5leHQgbmF2aWdhdGlvblxuICAgIHBlbmRpbmdOYXZpZ2F0aW9uQ29udHJvbGxlciA9IG51bGw7XG4gICAgY29tcGxldGVOYXZpZ2F0aW9uKGxvY2F0aW9uLCBfZXh0ZW5kcyh7XG4gICAgICBtYXRjaGVzXG4gICAgfSwgcGVuZGluZ0FjdGlvbkRhdGEgPyB7XG4gICAgICBhY3Rpb25EYXRhOiBwZW5kaW5nQWN0aW9uRGF0YVxuICAgIH0gOiB7fSwge1xuICAgICAgbG9hZGVyRGF0YSxcbiAgICAgIGVycm9yc1xuICAgIH0pKTtcbiAgfVxuICAvLyBDYWxsIHRoZSBhY3Rpb24gbWF0Y2hlZCBieSB0aGUgbGVhZiByb3V0ZSBmb3IgdGhpcyBuYXZpZ2F0aW9uIGFuZCBoYW5kbGVcbiAgLy8gcmVkaXJlY3RzL2Vycm9yc1xuICBhc3luYyBmdW5jdGlvbiBoYW5kbGVBY3Rpb24ocmVxdWVzdCwgbG9jYXRpb24sIHN1Ym1pc3Npb24sIG1hdGNoZXMsIG9wdHMpIHtcbiAgICBpZiAob3B0cyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRzID0ge307XG4gICAgfVxuICAgIGludGVycnVwdEFjdGl2ZUxvYWRzKCk7XG4gICAgLy8gUHV0IHVzIGluIGEgc3VibWl0dGluZyBzdGF0ZVxuICAgIGxldCBuYXZpZ2F0aW9uID0gZ2V0U3VibWl0dGluZ05hdmlnYXRpb24obG9jYXRpb24sIHN1Ym1pc3Npb24pO1xuICAgIHVwZGF0ZVN0YXRlKHtcbiAgICAgIG5hdmlnYXRpb25cbiAgICB9LCB7XG4gICAgICBmbHVzaFN5bmM6IG9wdHMuZmx1c2hTeW5jID09PSB0cnVlXG4gICAgfSk7XG4gICAgLy8gQ2FsbCBvdXIgYWN0aW9uIGFuZCBnZXQgdGhlIHJlc3VsdFxuICAgIGxldCByZXN1bHQ7XG4gICAgbGV0IGFjdGlvbk1hdGNoID0gZ2V0VGFyZ2V0TWF0Y2gobWF0Y2hlcywgbG9jYXRpb24pO1xuICAgIGlmICghYWN0aW9uTWF0Y2gucm91dGUuYWN0aW9uICYmICFhY3Rpb25NYXRjaC5yb3V0ZS5sYXp5KSB7XG4gICAgICByZXN1bHQgPSB7XG4gICAgICAgIHR5cGU6IFJlc3VsdFR5cGUuZXJyb3IsXG4gICAgICAgIGVycm9yOiBnZXRJbnRlcm5hbFJvdXRlckVycm9yKDQwNSwge1xuICAgICAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG4gICAgICAgICAgcGF0aG5hbWU6IGxvY2F0aW9uLnBhdGhuYW1lLFxuICAgICAgICAgIHJvdXRlSWQ6IGFjdGlvbk1hdGNoLnJvdXRlLmlkXG4gICAgICAgIH0pXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSBhd2FpdCBjYWxsTG9hZGVyT3JBY3Rpb24oXCJhY3Rpb25cIiwgcmVxdWVzdCwgYWN0aW9uTWF0Y2gsIG1hdGNoZXMsIG1hbmlmZXN0LCBtYXBSb3V0ZVByb3BlcnRpZXMsIGJhc2VuYW1lKTtcbiAgICAgIGlmIChyZXF1ZXN0LnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc2hvcnRDaXJjdWl0ZWQ6IHRydWVcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzUmVkaXJlY3RSZXN1bHQocmVzdWx0KSkge1xuICAgICAgbGV0IHJlcGxhY2U7XG4gICAgICBpZiAob3B0cyAmJiBvcHRzLnJlcGxhY2UgIT0gbnVsbCkge1xuICAgICAgICByZXBsYWNlID0gb3B0cy5yZXBsYWNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSWYgdGhlIHVzZXIgZGlkbid0IGV4cGxpY2l0eSBpbmRpY2F0ZSByZXBsYWNlIGJlaGF2aW9yLCByZXBsYWNlIGlmXG4gICAgICAgIC8vIHdlIHJlZGlyZWN0ZWQgdG8gdGhlIGV4YWN0IHNhbWUgbG9jYXRpb24gd2UncmUgY3VycmVudGx5IGF0IHRvIGF2b2lkXG4gICAgICAgIC8vIGRvdWJsZSBiYWNrLWJ1dHRvbnNcbiAgICAgICAgcmVwbGFjZSA9IHJlc3VsdC5sb2NhdGlvbiA9PT0gc3RhdGUubG9jYXRpb24ucGF0aG5hbWUgKyBzdGF0ZS5sb2NhdGlvbi5zZWFyY2g7XG4gICAgICB9XG4gICAgICBhd2FpdCBzdGFydFJlZGlyZWN0TmF2aWdhdGlvbihzdGF0ZSwgcmVzdWx0LCB7XG4gICAgICAgIHN1Ym1pc3Npb24sXG4gICAgICAgIHJlcGxhY2VcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2hvcnRDaXJjdWl0ZWQ6IHRydWVcbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChpc0Vycm9yUmVzdWx0KHJlc3VsdCkpIHtcbiAgICAgIC8vIFN0b3JlIG9mZiB0aGUgcGVuZGluZyBlcnJvciAtIHdlIHVzZSBpdCB0byBkZXRlcm1pbmUgd2hpY2ggbG9hZGVyc1xuICAgICAgLy8gdG8gY2FsbCBhbmQgd2lsbCBjb21taXQgaXQgd2hlbiB3ZSBjb21wbGV0ZSB0aGUgbmF2aWdhdGlvblxuICAgICAgbGV0IGJvdW5kYXJ5TWF0Y2ggPSBmaW5kTmVhcmVzdEJvdW5kYXJ5KG1hdGNoZXMsIGFjdGlvbk1hdGNoLnJvdXRlLmlkKTtcbiAgICAgIC8vIEJ5IGRlZmF1bHQsIGFsbCBzdWJtaXNzaW9ucyBhcmUgUkVQTEFDRSBuYXZpZ2F0aW9ucywgYnV0IGlmIHRoZVxuICAgICAgLy8gYWN0aW9uIHRocmV3IGFuIGVycm9yIHRoYXQnbGwgYmUgcmVuZGVyZWQgaW4gYW4gZXJyb3JFbGVtZW50LCB3ZSBmYWxsXG4gICAgICAvLyBiYWNrIHRvIFBVU0ggc28gdGhhdCB0aGUgdXNlciBjYW4gdXNlIHRoZSBiYWNrIGJ1dHRvbiB0byBnZXQgYmFjayB0b1xuICAgICAgLy8gdGhlIHByZS1zdWJtaXNzaW9uIGZvcm0gbG9jYXRpb24gdG8gdHJ5IGFnYWluXG4gICAgICBpZiAoKG9wdHMgJiYgb3B0cy5yZXBsYWNlKSAhPT0gdHJ1ZSkge1xuICAgICAgICBwZW5kaW5nQWN0aW9uID0gQWN0aW9uLlB1c2g7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICAvLyBTZW5kIGJhY2sgYW4gZW1wdHkgb2JqZWN0IHdlIGNhbiB1c2UgdG8gY2xlYXIgb3V0IGFueSBwcmlvciBhY3Rpb25EYXRhXG4gICAgICAgIHBlbmRpbmdBY3Rpb25EYXRhOiB7fSxcbiAgICAgICAgcGVuZGluZ0FjdGlvbkVycm9yOiB7XG4gICAgICAgICAgW2JvdW5kYXJ5TWF0Y2gucm91dGUuaWRdOiByZXN1bHQuZXJyb3JcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKGlzRGVmZXJyZWRSZXN1bHQocmVzdWx0KSkge1xuICAgICAgdGhyb3cgZ2V0SW50ZXJuYWxSb3V0ZXJFcnJvcig0MDAsIHtcbiAgICAgICAgdHlwZTogXCJkZWZlci1hY3Rpb25cIlxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBwZW5kaW5nQWN0aW9uRGF0YToge1xuICAgICAgICBbYWN0aW9uTWF0Y2gucm91dGUuaWRdOiByZXN1bHQuZGF0YVxuICAgICAgfVxuICAgIH07XG4gIH1cbiAgLy8gQ2FsbCBhbGwgYXBwbGljYWJsZSBsb2FkZXJzIGZvciB0aGUgZ2l2ZW4gbWF0Y2hlcywgaGFuZGxpbmcgcmVkaXJlY3RzLFxuICAvLyBlcnJvcnMsIGV0Yy5cbiAgYXN5bmMgZnVuY3Rpb24gaGFuZGxlTG9hZGVycyhyZXF1ZXN0LCBsb2NhdGlvbiwgbWF0Y2hlcywgb3ZlcnJpZGVOYXZpZ2F0aW9uLCBzdWJtaXNzaW9uLCBmZXRjaGVyU3VibWlzc2lvbiwgcmVwbGFjZSwgZmx1c2hTeW5jLCBwZW5kaW5nQWN0aW9uRGF0YSwgcGVuZGluZ0Vycm9yKSB7XG4gICAgLy8gRmlndXJlIG91dCB0aGUgcmlnaHQgbmF2aWdhdGlvbiB3ZSB3YW50IHRvIHVzZSBmb3IgZGF0YSBsb2FkaW5nXG4gICAgbGV0IGxvYWRpbmdOYXZpZ2F0aW9uID0gb3ZlcnJpZGVOYXZpZ2F0aW9uIHx8IGdldExvYWRpbmdOYXZpZ2F0aW9uKGxvY2F0aW9uLCBzdWJtaXNzaW9uKTtcbiAgICAvLyBJZiB0aGlzIHdhcyBhIHJlZGlyZWN0IGZyb20gYW4gYWN0aW9uIHdlIGRvbid0IGhhdmUgYSBcInN1Ym1pc3Npb25cIiBidXRcbiAgICAvLyB3ZSBoYXZlIGl0IG9uIHRoZSBsb2FkaW5nIG5hdmlnYXRpb24gc28gdXNlIHRoYXQgaWYgYXZhaWxhYmxlXG4gICAgbGV0IGFjdGl2ZVN1Ym1pc3Npb24gPSBzdWJtaXNzaW9uIHx8IGZldGNoZXJTdWJtaXNzaW9uIHx8IGdldFN1Ym1pc3Npb25Gcm9tTmF2aWdhdGlvbihsb2FkaW5nTmF2aWdhdGlvbik7XG4gICAgbGV0IHJvdXRlc1RvVXNlID0gaW5GbGlnaHREYXRhUm91dGVzIHx8IGRhdGFSb3V0ZXM7XG4gICAgbGV0IFttYXRjaGVzVG9Mb2FkLCByZXZhbGlkYXRpbmdGZXRjaGVyc10gPSBnZXRNYXRjaGVzVG9Mb2FkKGluaXQuaGlzdG9yeSwgc3RhdGUsIG1hdGNoZXMsIGFjdGl2ZVN1Ym1pc3Npb24sIGxvY2F0aW9uLCBpc1JldmFsaWRhdGlvblJlcXVpcmVkLCBjYW5jZWxsZWREZWZlcnJlZFJvdXRlcywgY2FuY2VsbGVkRmV0Y2hlckxvYWRzLCBkZWxldGVkRmV0Y2hlcnMsIGZldGNoTG9hZE1hdGNoZXMsIGZldGNoUmVkaXJlY3RJZHMsIHJvdXRlc1RvVXNlLCBiYXNlbmFtZSwgcGVuZGluZ0FjdGlvbkRhdGEsIHBlbmRpbmdFcnJvcik7XG4gICAgLy8gQ2FuY2VsIHBlbmRpbmcgZGVmZXJyZWRzIGZvciBuby1sb25nZXItbWF0Y2hlZCByb3V0ZXMgb3Igcm91dGVzIHdlJ3JlXG4gICAgLy8gYWJvdXQgdG8gcmVsb2FkLiAgTm90ZSB0aGF0IGlmIHRoaXMgaXMgYW4gYWN0aW9uIHJlbG9hZCB3ZSB3b3VsZCBoYXZlXG4gICAgLy8gYWxyZWFkeSBjYW5jZWxsZWQgYWxsIHBlbmRpbmcgZGVmZXJyZWRzIHNvIHRoaXMgd291bGQgYmUgYSBuby1vcFxuICAgIGNhbmNlbEFjdGl2ZURlZmVycmVkcyhyb3V0ZUlkID0+ICEobWF0Y2hlcyAmJiBtYXRjaGVzLnNvbWUobSA9PiBtLnJvdXRlLmlkID09PSByb3V0ZUlkKSkgfHwgbWF0Y2hlc1RvTG9hZCAmJiBtYXRjaGVzVG9Mb2FkLnNvbWUobSA9PiBtLnJvdXRlLmlkID09PSByb3V0ZUlkKSk7XG4gICAgcGVuZGluZ05hdmlnYXRpb25Mb2FkSWQgPSArK2luY3JlbWVudGluZ0xvYWRJZDtcbiAgICAvLyBTaG9ydCBjaXJjdWl0IGlmIHdlIGhhdmUgbm8gbG9hZGVycyB0byBydW5cbiAgICBpZiAobWF0Y2hlc1RvTG9hZC5sZW5ndGggPT09IDAgJiYgcmV2YWxpZGF0aW5nRmV0Y2hlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICBsZXQgdXBkYXRlZEZldGNoZXJzID0gbWFya0ZldGNoUmVkaXJlY3RzRG9uZSgpO1xuICAgICAgY29tcGxldGVOYXZpZ2F0aW9uKGxvY2F0aW9uLCBfZXh0ZW5kcyh7XG4gICAgICAgIG1hdGNoZXMsXG4gICAgICAgIGxvYWRlckRhdGE6IHt9LFxuICAgICAgICAvLyBDb21taXQgcGVuZGluZyBlcnJvciBpZiB3ZSdyZSBzaG9ydCBjaXJjdWl0aW5nXG4gICAgICAgIGVycm9yczogcGVuZGluZ0Vycm9yIHx8IG51bGxcbiAgICAgIH0sIHBlbmRpbmdBY3Rpb25EYXRhID8ge1xuICAgICAgICBhY3Rpb25EYXRhOiBwZW5kaW5nQWN0aW9uRGF0YVxuICAgICAgfSA6IHt9LCB1cGRhdGVkRmV0Y2hlcnMgPyB7XG4gICAgICAgIGZldGNoZXJzOiBuZXcgTWFwKHN0YXRlLmZldGNoZXJzKVxuICAgICAgfSA6IHt9KSwge1xuICAgICAgICBmbHVzaFN5bmNcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2hvcnRDaXJjdWl0ZWQ6IHRydWVcbiAgICAgIH07XG4gICAgfVxuICAgIC8vIElmIHRoaXMgaXMgYW4gdW5pbnRlcnJ1cHRlZCByZXZhbGlkYXRpb24sIHdlIHJlbWFpbiBpbiBvdXIgY3VycmVudCBpZGxlXG4gICAgLy8gc3RhdGUuICBJZiBub3QsIHdlIG5lZWQgdG8gc3dpdGNoIHRvIG91ciBsb2FkaW5nIHN0YXRlIGFuZCBsb2FkIGRhdGEsXG4gICAgLy8gcHJlc2VydmluZyBhbnkgbmV3IGFjdGlvbiBkYXRhIG9yIGV4aXN0aW5nIGFjdGlvbiBkYXRhIChpbiB0aGUgY2FzZSBvZlxuICAgIC8vIGEgcmV2YWxpZGF0aW9uIGludGVycnVwdGluZyBhbiBhY3Rpb25SZWxvYWQpXG4gICAgaWYgKCFpc1VuaW50ZXJydXB0ZWRSZXZhbGlkYXRpb24pIHtcbiAgICAgIHJldmFsaWRhdGluZ0ZldGNoZXJzLmZvckVhY2gocmYgPT4ge1xuICAgICAgICBsZXQgZmV0Y2hlciA9IHN0YXRlLmZldGNoZXJzLmdldChyZi5rZXkpO1xuICAgICAgICBsZXQgcmV2YWxpZGF0aW5nRmV0Y2hlciA9IGdldExvYWRpbmdGZXRjaGVyKHVuZGVmaW5lZCwgZmV0Y2hlciA/IGZldGNoZXIuZGF0YSA6IHVuZGVmaW5lZCk7XG4gICAgICAgIHN0YXRlLmZldGNoZXJzLnNldChyZi5rZXksIHJldmFsaWRhdGluZ0ZldGNoZXIpO1xuICAgICAgfSk7XG4gICAgICBsZXQgYWN0aW9uRGF0YSA9IHBlbmRpbmdBY3Rpb25EYXRhIHx8IHN0YXRlLmFjdGlvbkRhdGE7XG4gICAgICB1cGRhdGVTdGF0ZShfZXh0ZW5kcyh7XG4gICAgICAgIG5hdmlnYXRpb246IGxvYWRpbmdOYXZpZ2F0aW9uXG4gICAgICB9LCBhY3Rpb25EYXRhID8gT2JqZWN0LmtleXMoYWN0aW9uRGF0YSkubGVuZ3RoID09PSAwID8ge1xuICAgICAgICBhY3Rpb25EYXRhOiBudWxsXG4gICAgICB9IDoge1xuICAgICAgICBhY3Rpb25EYXRhXG4gICAgICB9IDoge30sIHJldmFsaWRhdGluZ0ZldGNoZXJzLmxlbmd0aCA+IDAgPyB7XG4gICAgICAgIGZldGNoZXJzOiBuZXcgTWFwKHN0YXRlLmZldGNoZXJzKVxuICAgICAgfSA6IHt9KSwge1xuICAgICAgICBmbHVzaFN5bmNcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXZhbGlkYXRpbmdGZXRjaGVycy5mb3JFYWNoKHJmID0+IHtcbiAgICAgIGlmIChmZXRjaENvbnRyb2xsZXJzLmhhcyhyZi5rZXkpKSB7XG4gICAgICAgIGFib3J0RmV0Y2hlcihyZi5rZXkpO1xuICAgICAgfVxuICAgICAgaWYgKHJmLmNvbnRyb2xsZXIpIHtcbiAgICAgICAgLy8gRmV0Y2hlcnMgdXNlIGFuIGluZGVwZW5kZW50IEFib3J0Q29udHJvbGxlciBzbyB0aGF0IGFib3J0aW5nIGEgZmV0Y2hlclxuICAgICAgICAvLyAodmlhIGRlbGV0ZUZldGNoZXIpIGRvZXMgbm90IGFib3J0IHRoZSB0cmlnZ2VyaW5nIG5hdmlnYXRpb24gdGhhdFxuICAgICAgICAvLyB0cmlnZ2VyZWQgdGhlIHJldmFsaWRhdGlvblxuICAgICAgICBmZXRjaENvbnRyb2xsZXJzLnNldChyZi5rZXksIHJmLmNvbnRyb2xsZXIpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIC8vIFByb3h5IG5hdmlnYXRpb24gYWJvcnQgdGhyb3VnaCB0byByZXZhbGlkYXRpb24gZmV0Y2hlcnNcbiAgICBsZXQgYWJvcnRQZW5kaW5nRmV0Y2hSZXZhbGlkYXRpb25zID0gKCkgPT4gcmV2YWxpZGF0aW5nRmV0Y2hlcnMuZm9yRWFjaChmID0+IGFib3J0RmV0Y2hlcihmLmtleSkpO1xuICAgIGlmIChwZW5kaW5nTmF2aWdhdGlvbkNvbnRyb2xsZXIpIHtcbiAgICAgIHBlbmRpbmdOYXZpZ2F0aW9uQ29udHJvbGxlci5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIGFib3J0UGVuZGluZ0ZldGNoUmV2YWxpZGF0aW9ucyk7XG4gICAgfVxuICAgIGxldCB7XG4gICAgICByZXN1bHRzLFxuICAgICAgbG9hZGVyUmVzdWx0cyxcbiAgICAgIGZldGNoZXJSZXN1bHRzXG4gICAgfSA9IGF3YWl0IGNhbGxMb2FkZXJzQW5kTWF5YmVSZXNvbHZlRGF0YShzdGF0ZS5tYXRjaGVzLCBtYXRjaGVzLCBtYXRjaGVzVG9Mb2FkLCByZXZhbGlkYXRpbmdGZXRjaGVycywgcmVxdWVzdCk7XG4gICAgaWYgKHJlcXVlc3Quc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNob3J0Q2lyY3VpdGVkOiB0cnVlXG4gICAgICB9O1xuICAgIH1cbiAgICAvLyBDbGVhbiB1cCBfYWZ0ZXJfIGxvYWRlcnMgaGF2ZSBjb21wbGV0ZWQuICBEb24ndCBjbGVhbiB1cCBpZiB3ZSBzaG9ydFxuICAgIC8vIGNpcmN1aXRlZCBiZWNhdXNlIGZldGNoQ29udHJvbGxlcnMgd291bGQgaGF2ZSBiZWVuIGFib3J0ZWQgYW5kXG4gICAgLy8gcmVhc3NpZ25lZCB0byBuZXcgY29udHJvbGxlcnMgZm9yIHRoZSBuZXh0IG5hdmlnYXRpb25cbiAgICBpZiAocGVuZGluZ05hdmlnYXRpb25Db250cm9sbGVyKSB7XG4gICAgICBwZW5kaW5nTmF2aWdhdGlvbkNvbnRyb2xsZXIuc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBhYm9ydFBlbmRpbmdGZXRjaFJldmFsaWRhdGlvbnMpO1xuICAgIH1cbiAgICByZXZhbGlkYXRpbmdGZXRjaGVycy5mb3JFYWNoKHJmID0+IGZldGNoQ29udHJvbGxlcnMuZGVsZXRlKHJmLmtleSkpO1xuICAgIC8vIElmIGFueSBsb2FkZXJzIHJldHVybmVkIGEgcmVkaXJlY3QgUmVzcG9uc2UsIHN0YXJ0IGEgbmV3IFJFUExBQ0UgbmF2aWdhdGlvblxuICAgIGxldCByZWRpcmVjdCA9IGZpbmRSZWRpcmVjdChyZXN1bHRzKTtcbiAgICBpZiAocmVkaXJlY3QpIHtcbiAgICAgIGlmIChyZWRpcmVjdC5pZHggPj0gbWF0Y2hlc1RvTG9hZC5sZW5ndGgpIHtcbiAgICAgICAgLy8gSWYgdGhpcyByZWRpcmVjdCBjYW1lIGZyb20gYSBmZXRjaGVyIG1ha2Ugc3VyZSB3ZSBtYXJrIGl0IGluXG4gICAgICAgIC8vIGZldGNoUmVkaXJlY3RJZHMgc28gaXQgZG9lc24ndCBnZXQgcmV2YWxpZGF0ZWQgb24gdGhlIG5leHQgc2V0IG9mXG4gICAgICAgIC8vIGxvYWRlciBleGVjdXRpb25zXG4gICAgICAgIGxldCBmZXRjaGVyS2V5ID0gcmV2YWxpZGF0aW5nRmV0Y2hlcnNbcmVkaXJlY3QuaWR4IC0gbWF0Y2hlc1RvTG9hZC5sZW5ndGhdLmtleTtcbiAgICAgICAgZmV0Y2hSZWRpcmVjdElkcy5hZGQoZmV0Y2hlcktleSk7XG4gICAgICB9XG4gICAgICBhd2FpdCBzdGFydFJlZGlyZWN0TmF2aWdhdGlvbihzdGF0ZSwgcmVkaXJlY3QucmVzdWx0LCB7XG4gICAgICAgIHJlcGxhY2VcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2hvcnRDaXJjdWl0ZWQ6IHRydWVcbiAgICAgIH07XG4gICAgfVxuICAgIC8vIFByb2Nlc3MgYW5kIGNvbW1pdCBvdXRwdXQgZnJvbSBsb2FkZXJzXG4gICAgbGV0IHtcbiAgICAgIGxvYWRlckRhdGEsXG4gICAgICBlcnJvcnNcbiAgICB9ID0gcHJvY2Vzc0xvYWRlckRhdGEoc3RhdGUsIG1hdGNoZXMsIG1hdGNoZXNUb0xvYWQsIGxvYWRlclJlc3VsdHMsIHBlbmRpbmdFcnJvciwgcmV2YWxpZGF0aW5nRmV0Y2hlcnMsIGZldGNoZXJSZXN1bHRzLCBhY3RpdmVEZWZlcnJlZHMpO1xuICAgIC8vIFdpcmUgdXAgc3Vic2NyaWJlcnMgdG8gdXBkYXRlIGxvYWRlckRhdGEgYXMgcHJvbWlzZXMgc2V0dGxlXG4gICAgYWN0aXZlRGVmZXJyZWRzLmZvckVhY2goKGRlZmVycmVkRGF0YSwgcm91dGVJZCkgPT4ge1xuICAgICAgZGVmZXJyZWREYXRhLnN1YnNjcmliZShhYm9ydGVkID0+IHtcbiAgICAgICAgLy8gTm90ZTogTm8gbmVlZCB0byB1cGRhdGVTdGF0ZSBoZXJlIHNpbmNlIHRoZSBUcmFja2VkUHJvbWlzZSBvblxuICAgICAgICAvLyBsb2FkZXJEYXRhIGlzIHN0YWJsZSBhY3Jvc3MgcmVzb2x2ZS9yZWplY3RcbiAgICAgICAgLy8gUmVtb3ZlIHRoaXMgaW5zdGFuY2UgaWYgd2Ugd2VyZSBhYm9ydGVkIG9yIGlmIHByb21pc2VzIGhhdmUgc2V0dGxlZFxuICAgICAgICBpZiAoYWJvcnRlZCB8fCBkZWZlcnJlZERhdGEuZG9uZSkge1xuICAgICAgICAgIGFjdGl2ZURlZmVycmVkcy5kZWxldGUocm91dGVJZCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGxldCB1cGRhdGVkRmV0Y2hlcnMgPSBtYXJrRmV0Y2hSZWRpcmVjdHNEb25lKCk7XG4gICAgbGV0IGRpZEFib3J0RmV0Y2hMb2FkcyA9IGFib3J0U3RhbGVGZXRjaExvYWRzKHBlbmRpbmdOYXZpZ2F0aW9uTG9hZElkKTtcbiAgICBsZXQgc2hvdWxkVXBkYXRlRmV0Y2hlcnMgPSB1cGRhdGVkRmV0Y2hlcnMgfHwgZGlkQWJvcnRGZXRjaExvYWRzIHx8IHJldmFsaWRhdGluZ0ZldGNoZXJzLmxlbmd0aCA+IDA7XG4gICAgcmV0dXJuIF9leHRlbmRzKHtcbiAgICAgIGxvYWRlckRhdGEsXG4gICAgICBlcnJvcnNcbiAgICB9LCBzaG91bGRVcGRhdGVGZXRjaGVycyA/IHtcbiAgICAgIGZldGNoZXJzOiBuZXcgTWFwKHN0YXRlLmZldGNoZXJzKVxuICAgIH0gOiB7fSk7XG4gIH1cbiAgLy8gVHJpZ2dlciBhIGZldGNoZXIgbG9hZC9zdWJtaXQgZm9yIHRoZSBnaXZlbiBmZXRjaGVyIGtleVxuICBmdW5jdGlvbiBmZXRjaChrZXksIHJvdXRlSWQsIGhyZWYsIG9wdHMpIHtcbiAgICBpZiAoaXNTZXJ2ZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInJvdXRlci5mZXRjaCgpIHdhcyBjYWxsZWQgZHVyaW5nIHRoZSBzZXJ2ZXIgcmVuZGVyLCBidXQgaXQgc2hvdWxkbid0IGJlLiBcIiArIFwiWW91IGFyZSBsaWtlbHkgY2FsbGluZyBhIHVzZUZldGNoZXIoKSBtZXRob2QgaW4gdGhlIGJvZHkgb2YgeW91ciBjb21wb25lbnQuIFwiICsgXCJUcnkgbW92aW5nIGl0IHRvIGEgdXNlRWZmZWN0IG9yIGEgY2FsbGJhY2suXCIpO1xuICAgIH1cbiAgICBpZiAoZmV0Y2hDb250cm9sbGVycy5oYXMoa2V5KSkgYWJvcnRGZXRjaGVyKGtleSk7XG4gICAgbGV0IGZsdXNoU3luYyA9IChvcHRzICYmIG9wdHMudW5zdGFibGVfZmx1c2hTeW5jKSA9PT0gdHJ1ZTtcbiAgICBsZXQgcm91dGVzVG9Vc2UgPSBpbkZsaWdodERhdGFSb3V0ZXMgfHwgZGF0YVJvdXRlcztcbiAgICBsZXQgbm9ybWFsaXplZFBhdGggPSBub3JtYWxpemVUbyhzdGF0ZS5sb2NhdGlvbiwgc3RhdGUubWF0Y2hlcywgYmFzZW5hbWUsIGZ1dHVyZS52N19wcmVwZW5kQmFzZW5hbWUsIGhyZWYsIHJvdXRlSWQsIG9wdHMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wdHMucmVsYXRpdmUpO1xuICAgIGxldCBtYXRjaGVzID0gbWF0Y2hSb3V0ZXMocm91dGVzVG9Vc2UsIG5vcm1hbGl6ZWRQYXRoLCBiYXNlbmFtZSk7XG4gICAgaWYgKCFtYXRjaGVzKSB7XG4gICAgICBzZXRGZXRjaGVyRXJyb3Ioa2V5LCByb3V0ZUlkLCBnZXRJbnRlcm5hbFJvdXRlckVycm9yKDQwNCwge1xuICAgICAgICBwYXRobmFtZTogbm9ybWFsaXplZFBhdGhcbiAgICAgIH0pLCB7XG4gICAgICAgIGZsdXNoU3luY1xuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCB7XG4gICAgICBwYXRoLFxuICAgICAgc3VibWlzc2lvbixcbiAgICAgIGVycm9yXG4gICAgfSA9IG5vcm1hbGl6ZU5hdmlnYXRlT3B0aW9ucyhmdXR1cmUudjdfbm9ybWFsaXplRm9ybU1ldGhvZCwgdHJ1ZSwgbm9ybWFsaXplZFBhdGgsIG9wdHMpO1xuICAgIGlmIChlcnJvcikge1xuICAgICAgc2V0RmV0Y2hlckVycm9yKGtleSwgcm91dGVJZCwgZXJyb3IsIHtcbiAgICAgICAgZmx1c2hTeW5jXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IG1hdGNoID0gZ2V0VGFyZ2V0TWF0Y2gobWF0Y2hlcywgcGF0aCk7XG4gICAgcGVuZGluZ1ByZXZlbnRTY3JvbGxSZXNldCA9IChvcHRzICYmIG9wdHMucHJldmVudFNjcm9sbFJlc2V0KSA9PT0gdHJ1ZTtcbiAgICBpZiAoc3VibWlzc2lvbiAmJiBpc011dGF0aW9uTWV0aG9kKHN1Ym1pc3Npb24uZm9ybU1ldGhvZCkpIHtcbiAgICAgIGhhbmRsZUZldGNoZXJBY3Rpb24oa2V5LCByb3V0ZUlkLCBwYXRoLCBtYXRjaCwgbWF0Y2hlcywgZmx1c2hTeW5jLCBzdWJtaXNzaW9uKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gU3RvcmUgb2ZmIHRoZSBtYXRjaCBzbyB3ZSBjYW4gY2FsbCBpdCdzIHNob3VsZFJldmFsaWRhdGUgb24gc3Vic2VxdWVudFxuICAgIC8vIHJldmFsaWRhdGlvbnNcbiAgICBmZXRjaExvYWRNYXRjaGVzLnNldChrZXksIHtcbiAgICAgIHJvdXRlSWQsXG4gICAgICBwYXRoXG4gICAgfSk7XG4gICAgaGFuZGxlRmV0Y2hlckxvYWRlcihrZXksIHJvdXRlSWQsIHBhdGgsIG1hdGNoLCBtYXRjaGVzLCBmbHVzaFN5bmMsIHN1Ym1pc3Npb24pO1xuICB9XG4gIC8vIENhbGwgdGhlIGFjdGlvbiBmb3IgdGhlIG1hdGNoZWQgZmV0Y2hlci5zdWJtaXQoKSwgYW5kIHRoZW4gaGFuZGxlIHJlZGlyZWN0cyxcbiAgLy8gZXJyb3JzLCBhbmQgcmV2YWxpZGF0aW9uXG4gIGFzeW5jIGZ1bmN0aW9uIGhhbmRsZUZldGNoZXJBY3Rpb24oa2V5LCByb3V0ZUlkLCBwYXRoLCBtYXRjaCwgcmVxdWVzdE1hdGNoZXMsIGZsdXNoU3luYywgc3VibWlzc2lvbikge1xuICAgIGludGVycnVwdEFjdGl2ZUxvYWRzKCk7XG4gICAgZmV0Y2hMb2FkTWF0Y2hlcy5kZWxldGUoa2V5KTtcbiAgICBpZiAoIW1hdGNoLnJvdXRlLmFjdGlvbiAmJiAhbWF0Y2gucm91dGUubGF6eSkge1xuICAgICAgbGV0IGVycm9yID0gZ2V0SW50ZXJuYWxSb3V0ZXJFcnJvcig0MDUsIHtcbiAgICAgICAgbWV0aG9kOiBzdWJtaXNzaW9uLmZvcm1NZXRob2QsXG4gICAgICAgIHBhdGhuYW1lOiBwYXRoLFxuICAgICAgICByb3V0ZUlkOiByb3V0ZUlkXG4gICAgICB9KTtcbiAgICAgIHNldEZldGNoZXJFcnJvcihrZXksIHJvdXRlSWQsIGVycm9yLCB7XG4gICAgICAgIGZsdXNoU3luY1xuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFB1dCB0aGlzIGZldGNoZXIgaW50byBpdCdzIHN1Ym1pdHRpbmcgc3RhdGVcbiAgICBsZXQgZXhpc3RpbmdGZXRjaGVyID0gc3RhdGUuZmV0Y2hlcnMuZ2V0KGtleSk7XG4gICAgdXBkYXRlRmV0Y2hlclN0YXRlKGtleSwgZ2V0U3VibWl0dGluZ0ZldGNoZXIoc3VibWlzc2lvbiwgZXhpc3RpbmdGZXRjaGVyKSwge1xuICAgICAgZmx1c2hTeW5jXG4gICAgfSk7XG4gICAgLy8gQ2FsbCB0aGUgYWN0aW9uIGZvciB0aGUgZmV0Y2hlclxuICAgIGxldCBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgbGV0IGZldGNoUmVxdWVzdCA9IGNyZWF0ZUNsaWVudFNpZGVSZXF1ZXN0KGluaXQuaGlzdG9yeSwgcGF0aCwgYWJvcnRDb250cm9sbGVyLnNpZ25hbCwgc3VibWlzc2lvbik7XG4gICAgZmV0Y2hDb250cm9sbGVycy5zZXQoa2V5LCBhYm9ydENvbnRyb2xsZXIpO1xuICAgIGxldCBvcmlnaW5hdGluZ0xvYWRJZCA9IGluY3JlbWVudGluZ0xvYWRJZDtcbiAgICBsZXQgYWN0aW9uUmVzdWx0ID0gYXdhaXQgY2FsbExvYWRlck9yQWN0aW9uKFwiYWN0aW9uXCIsIGZldGNoUmVxdWVzdCwgbWF0Y2gsIHJlcXVlc3RNYXRjaGVzLCBtYW5pZmVzdCwgbWFwUm91dGVQcm9wZXJ0aWVzLCBiYXNlbmFtZSk7XG4gICAgaWYgKGZldGNoUmVxdWVzdC5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgLy8gV2UgY2FuIGRlbGV0ZSB0aGlzIHNvIGxvbmcgYXMgd2Ugd2VyZW4ndCBhYm9ydGVkIGJ5IG91ciBvd24gZmV0Y2hlclxuICAgICAgLy8gcmUtc3VibWl0IHdoaWNoIHdvdWxkIGhhdmUgcHV0IF9uZXdfIGNvbnRyb2xsZXIgaXMgaW4gZmV0Y2hDb250cm9sbGVyc1xuICAgICAgaWYgKGZldGNoQ29udHJvbGxlcnMuZ2V0KGtleSkgPT09IGFib3J0Q29udHJvbGxlcikge1xuICAgICAgICBmZXRjaENvbnRyb2xsZXJzLmRlbGV0ZShrZXkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoZGVsZXRlZEZldGNoZXJzLmhhcyhrZXkpKSB7XG4gICAgICB1cGRhdGVGZXRjaGVyU3RhdGUoa2V5LCBnZXREb25lRmV0Y2hlcih1bmRlZmluZWQpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGlzUmVkaXJlY3RSZXN1bHQoYWN0aW9uUmVzdWx0KSkge1xuICAgICAgZmV0Y2hDb250cm9sbGVycy5kZWxldGUoa2V5KTtcbiAgICAgIGlmIChwZW5kaW5nTmF2aWdhdGlvbkxvYWRJZCA+IG9yaWdpbmF0aW5nTG9hZElkKSB7XG4gICAgICAgIC8vIEEgbmV3IG5hdmlnYXRpb24gd2FzIGtpY2tlZCBvZmYgYWZ0ZXIgb3VyIGFjdGlvbiBzdGFydGVkLCBzbyB0aGF0XG4gICAgICAgIC8vIHNob3VsZCB0YWtlIHByZWNlZGVuY2Ugb3ZlciB0aGlzIHJlZGlyZWN0IG5hdmlnYXRpb24uICBXZSBhbHJlYWR5XG4gICAgICAgIC8vIHNldCBpc1JldmFsaWRhdGlvblJlcXVpcmVkIHNvIGFsbCBsb2FkZXJzIGZvciB0aGUgbmV3IHJvdXRlIHNob3VsZFxuICAgICAgICAvLyBmaXJlIHVubGVzcyBvcHRlZCBvdXQgdmlhIHNob3VsZFJldmFsaWRhdGVcbiAgICAgICAgdXBkYXRlRmV0Y2hlclN0YXRlKGtleSwgZ2V0RG9uZUZldGNoZXIodW5kZWZpbmVkKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZldGNoUmVkaXJlY3RJZHMuYWRkKGtleSk7XG4gICAgICAgIHVwZGF0ZUZldGNoZXJTdGF0ZShrZXksIGdldExvYWRpbmdGZXRjaGVyKHN1Ym1pc3Npb24pKTtcbiAgICAgICAgcmV0dXJuIHN0YXJ0UmVkaXJlY3ROYXZpZ2F0aW9uKHN0YXRlLCBhY3Rpb25SZXN1bHQsIHtcbiAgICAgICAgICBmZXRjaGVyU3VibWlzc2lvbjogc3VibWlzc2lvblxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gUHJvY2VzcyBhbnkgbm9uLXJlZGlyZWN0IGVycm9ycyB0aHJvd25cbiAgICBpZiAoaXNFcnJvclJlc3VsdChhY3Rpb25SZXN1bHQpKSB7XG4gICAgICBzZXRGZXRjaGVyRXJyb3Ioa2V5LCByb3V0ZUlkLCBhY3Rpb25SZXN1bHQuZXJyb3IpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaXNEZWZlcnJlZFJlc3VsdChhY3Rpb25SZXN1bHQpKSB7XG4gICAgICB0aHJvdyBnZXRJbnRlcm5hbFJvdXRlckVycm9yKDQwMCwge1xuICAgICAgICB0eXBlOiBcImRlZmVyLWFjdGlvblwiXG4gICAgICB9KTtcbiAgICB9XG4gICAgLy8gU3RhcnQgdGhlIGRhdGEgbG9hZCBmb3IgY3VycmVudCBtYXRjaGVzLCBvciB0aGUgbmV4dCBsb2NhdGlvbiBpZiB3ZSdyZVxuICAgIC8vIGluIHRoZSBtaWRkbGUgb2YgYSBuYXZpZ2F0aW9uXG4gICAgbGV0IG5leHRMb2NhdGlvbiA9IHN0YXRlLm5hdmlnYXRpb24ubG9jYXRpb24gfHwgc3RhdGUubG9jYXRpb247XG4gICAgbGV0IHJldmFsaWRhdGlvblJlcXVlc3QgPSBjcmVhdGVDbGllbnRTaWRlUmVxdWVzdChpbml0Lmhpc3RvcnksIG5leHRMb2NhdGlvbiwgYWJvcnRDb250cm9sbGVyLnNpZ25hbCk7XG4gICAgbGV0IHJvdXRlc1RvVXNlID0gaW5GbGlnaHREYXRhUm91dGVzIHx8IGRhdGFSb3V0ZXM7XG4gICAgbGV0IG1hdGNoZXMgPSBzdGF0ZS5uYXZpZ2F0aW9uLnN0YXRlICE9PSBcImlkbGVcIiA/IG1hdGNoUm91dGVzKHJvdXRlc1RvVXNlLCBzdGF0ZS5uYXZpZ2F0aW9uLmxvY2F0aW9uLCBiYXNlbmFtZSkgOiBzdGF0ZS5tYXRjaGVzO1xuICAgIGludmFyaWFudChtYXRjaGVzLCBcIkRpZG4ndCBmaW5kIGFueSBtYXRjaGVzIGFmdGVyIGZldGNoZXIgYWN0aW9uXCIpO1xuICAgIGxldCBsb2FkSWQgPSArK2luY3JlbWVudGluZ0xvYWRJZDtcbiAgICBmZXRjaFJlbG9hZElkcy5zZXQoa2V5LCBsb2FkSWQpO1xuICAgIGxldCBsb2FkRmV0Y2hlciA9IGdldExvYWRpbmdGZXRjaGVyKHN1Ym1pc3Npb24sIGFjdGlvblJlc3VsdC5kYXRhKTtcbiAgICBzdGF0ZS5mZXRjaGVycy5zZXQoa2V5LCBsb2FkRmV0Y2hlcik7XG4gICAgbGV0IFttYXRjaGVzVG9Mb2FkLCByZXZhbGlkYXRpbmdGZXRjaGVyc10gPSBnZXRNYXRjaGVzVG9Mb2FkKGluaXQuaGlzdG9yeSwgc3RhdGUsIG1hdGNoZXMsIHN1Ym1pc3Npb24sIG5leHRMb2NhdGlvbiwgaXNSZXZhbGlkYXRpb25SZXF1aXJlZCwgY2FuY2VsbGVkRGVmZXJyZWRSb3V0ZXMsIGNhbmNlbGxlZEZldGNoZXJMb2FkcywgZGVsZXRlZEZldGNoZXJzLCBmZXRjaExvYWRNYXRjaGVzLCBmZXRjaFJlZGlyZWN0SWRzLCByb3V0ZXNUb1VzZSwgYmFzZW5hbWUsIHtcbiAgICAgIFttYXRjaC5yb3V0ZS5pZF06IGFjdGlvblJlc3VsdC5kYXRhXG4gICAgfSwgdW5kZWZpbmVkIC8vIE5vIG5lZWQgdG8gc2VuZCB0aHJvdWdoIGVycm9ycyBzaW5jZSB3ZSBzaG9ydCBjaXJjdWl0IGFib3ZlXG4gICAgKTtcbiAgICAvLyBQdXQgYWxsIHJldmFsaWRhdGluZyBmZXRjaGVycyBpbnRvIHRoZSBsb2FkaW5nIHN0YXRlLCBleGNlcHQgZm9yIHRoZVxuICAgIC8vIGN1cnJlbnQgZmV0Y2hlciB3aGljaCB3ZSB3YW50IHRvIGtlZXAgaW4gaXQncyBjdXJyZW50IGxvYWRpbmcgc3RhdGUgd2hpY2hcbiAgICAvLyBjb250YWlucyBpdCdzIGFjdGlvbiBzdWJtaXNzaW9uIGluZm8gKyBhY3Rpb24gZGF0YVxuICAgIHJldmFsaWRhdGluZ0ZldGNoZXJzLmZpbHRlcihyZiA9PiByZi5rZXkgIT09IGtleSkuZm9yRWFjaChyZiA9PiB7XG4gICAgICBsZXQgc3RhbGVLZXkgPSByZi5rZXk7XG4gICAgICBsZXQgZXhpc3RpbmdGZXRjaGVyID0gc3RhdGUuZmV0Y2hlcnMuZ2V0KHN0YWxlS2V5KTtcbiAgICAgIGxldCByZXZhbGlkYXRpbmdGZXRjaGVyID0gZ2V0TG9hZGluZ0ZldGNoZXIodW5kZWZpbmVkLCBleGlzdGluZ0ZldGNoZXIgPyBleGlzdGluZ0ZldGNoZXIuZGF0YSA6IHVuZGVmaW5lZCk7XG4gICAgICBzdGF0ZS5mZXRjaGVycy5zZXQoc3RhbGVLZXksIHJldmFsaWRhdGluZ0ZldGNoZXIpO1xuICAgICAgaWYgKGZldGNoQ29udHJvbGxlcnMuaGFzKHN0YWxlS2V5KSkge1xuICAgICAgICBhYm9ydEZldGNoZXIoc3RhbGVLZXkpO1xuICAgICAgfVxuICAgICAgaWYgKHJmLmNvbnRyb2xsZXIpIHtcbiAgICAgICAgZmV0Y2hDb250cm9sbGVycy5zZXQoc3RhbGVLZXksIHJmLmNvbnRyb2xsZXIpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHVwZGF0ZVN0YXRlKHtcbiAgICAgIGZldGNoZXJzOiBuZXcgTWFwKHN0YXRlLmZldGNoZXJzKVxuICAgIH0pO1xuICAgIGxldCBhYm9ydFBlbmRpbmdGZXRjaFJldmFsaWRhdGlvbnMgPSAoKSA9PiByZXZhbGlkYXRpbmdGZXRjaGVycy5mb3JFYWNoKHJmID0+IGFib3J0RmV0Y2hlcihyZi5rZXkpKTtcbiAgICBhYm9ydENvbnRyb2xsZXIuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBhYm9ydFBlbmRpbmdGZXRjaFJldmFsaWRhdGlvbnMpO1xuICAgIGxldCB7XG4gICAgICByZXN1bHRzLFxuICAgICAgbG9hZGVyUmVzdWx0cyxcbiAgICAgIGZldGNoZXJSZXN1bHRzXG4gICAgfSA9IGF3YWl0IGNhbGxMb2FkZXJzQW5kTWF5YmVSZXNvbHZlRGF0YShzdGF0ZS5tYXRjaGVzLCBtYXRjaGVzLCBtYXRjaGVzVG9Mb2FkLCByZXZhbGlkYXRpbmdGZXRjaGVycywgcmV2YWxpZGF0aW9uUmVxdWVzdCk7XG4gICAgaWYgKGFib3J0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhYm9ydENvbnRyb2xsZXIuc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBhYm9ydFBlbmRpbmdGZXRjaFJldmFsaWRhdGlvbnMpO1xuICAgIGZldGNoUmVsb2FkSWRzLmRlbGV0ZShrZXkpO1xuICAgIGZldGNoQ29udHJvbGxlcnMuZGVsZXRlKGtleSk7XG4gICAgcmV2YWxpZGF0aW5nRmV0Y2hlcnMuZm9yRWFjaChyID0+IGZldGNoQ29udHJvbGxlcnMuZGVsZXRlKHIua2V5KSk7XG4gICAgbGV0IHJlZGlyZWN0ID0gZmluZFJlZGlyZWN0KHJlc3VsdHMpO1xuICAgIGlmIChyZWRpcmVjdCkge1xuICAgICAgaWYgKHJlZGlyZWN0LmlkeCA+PSBtYXRjaGVzVG9Mb2FkLmxlbmd0aCkge1xuICAgICAgICAvLyBJZiB0aGlzIHJlZGlyZWN0IGNhbWUgZnJvbSBhIGZldGNoZXIgbWFrZSBzdXJlIHdlIG1hcmsgaXQgaW5cbiAgICAgICAgLy8gZmV0Y2hSZWRpcmVjdElkcyBzbyBpdCBkb2Vzbid0IGdldCByZXZhbGlkYXRlZCBvbiB0aGUgbmV4dCBzZXQgb2ZcbiAgICAgICAgLy8gbG9hZGVyIGV4ZWN1dGlvbnNcbiAgICAgICAgbGV0IGZldGNoZXJLZXkgPSByZXZhbGlkYXRpbmdGZXRjaGVyc1tyZWRpcmVjdC5pZHggLSBtYXRjaGVzVG9Mb2FkLmxlbmd0aF0ua2V5O1xuICAgICAgICBmZXRjaFJlZGlyZWN0SWRzLmFkZChmZXRjaGVyS2V5KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdGFydFJlZGlyZWN0TmF2aWdhdGlvbihzdGF0ZSwgcmVkaXJlY3QucmVzdWx0KTtcbiAgICB9XG4gICAgLy8gUHJvY2VzcyBhbmQgY29tbWl0IG91dHB1dCBmcm9tIGxvYWRlcnNcbiAgICBsZXQge1xuICAgICAgbG9hZGVyRGF0YSxcbiAgICAgIGVycm9yc1xuICAgIH0gPSBwcm9jZXNzTG9hZGVyRGF0YShzdGF0ZSwgc3RhdGUubWF0Y2hlcywgbWF0Y2hlc1RvTG9hZCwgbG9hZGVyUmVzdWx0cywgdW5kZWZpbmVkLCByZXZhbGlkYXRpbmdGZXRjaGVycywgZmV0Y2hlclJlc3VsdHMsIGFjdGl2ZURlZmVycmVkcyk7XG4gICAgLy8gU2luY2Ugd2UgbGV0IHJldmFsaWRhdGlvbnMgY29tcGxldGUgZXZlbiBpZiB0aGUgc3VibWl0dGluZyBmZXRjaGVyIHdhc1xuICAgIC8vIGRlbGV0ZWQsIG9ubHkgcHV0IGl0IGJhY2sgdG8gaWRsZSBpZiBpdCBoYXNuJ3QgYmVlbiBkZWxldGVkXG4gICAgaWYgKHN0YXRlLmZldGNoZXJzLmhhcyhrZXkpKSB7XG4gICAgICBsZXQgZG9uZUZldGNoZXIgPSBnZXREb25lRmV0Y2hlcihhY3Rpb25SZXN1bHQuZGF0YSk7XG4gICAgICBzdGF0ZS5mZXRjaGVycy5zZXQoa2V5LCBkb25lRmV0Y2hlcik7XG4gICAgfVxuICAgIGFib3J0U3RhbGVGZXRjaExvYWRzKGxvYWRJZCk7XG4gICAgLy8gSWYgd2UgYXJlIGN1cnJlbnRseSBpbiBhIG5hdmlnYXRpb24gbG9hZGluZyBzdGF0ZSBhbmQgdGhpcyBmZXRjaGVyIGlzXG4gICAgLy8gbW9yZSByZWNlbnQgdGhhbiB0aGUgbmF2aWdhdGlvbiwgd2Ugd2FudCB0aGUgbmV3ZXIgZGF0YSBzbyBhYm9ydCB0aGVcbiAgICAvLyBuYXZpZ2F0aW9uIGFuZCBjb21wbGV0ZSBpdCB3aXRoIHRoZSBmZXRjaGVyIGRhdGFcbiAgICBpZiAoc3RhdGUubmF2aWdhdGlvbi5zdGF0ZSA9PT0gXCJsb2FkaW5nXCIgJiYgbG9hZElkID4gcGVuZGluZ05hdmlnYXRpb25Mb2FkSWQpIHtcbiAgICAgIGludmFyaWFudChwZW5kaW5nQWN0aW9uLCBcIkV4cGVjdGVkIHBlbmRpbmcgYWN0aW9uXCIpO1xuICAgICAgcGVuZGluZ05hdmlnYXRpb25Db250cm9sbGVyICYmIHBlbmRpbmdOYXZpZ2F0aW9uQ29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgY29tcGxldGVOYXZpZ2F0aW9uKHN0YXRlLm5hdmlnYXRpb24ubG9jYXRpb24sIHtcbiAgICAgICAgbWF0Y2hlcyxcbiAgICAgICAgbG9hZGVyRGF0YSxcbiAgICAgICAgZXJyb3JzLFxuICAgICAgICBmZXRjaGVyczogbmV3IE1hcChzdGF0ZS5mZXRjaGVycylcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBvdGhlcndpc2UganVzdCB1cGRhdGUgd2l0aCB0aGUgZmV0Y2hlciBkYXRhLCBwcmVzZXJ2aW5nIGFueSBleGlzdGluZ1xuICAgICAgLy8gbG9hZGVyRGF0YSBmb3IgbG9hZGVycyB0aGF0IGRpZCBub3QgbmVlZCB0byByZWxvYWQuICBXZSBoYXZlIHRvXG4gICAgICAvLyBtYW51YWxseSBtZXJnZSBoZXJlIHNpbmNlIHdlIGFyZW4ndCBnb2luZyB0aHJvdWdoIGNvbXBsZXRlTmF2aWdhdGlvblxuICAgICAgdXBkYXRlU3RhdGUoe1xuICAgICAgICBlcnJvcnMsXG4gICAgICAgIGxvYWRlckRhdGE6IG1lcmdlTG9hZGVyRGF0YShzdGF0ZS5sb2FkZXJEYXRhLCBsb2FkZXJEYXRhLCBtYXRjaGVzLCBlcnJvcnMpLFxuICAgICAgICBmZXRjaGVyczogbmV3IE1hcChzdGF0ZS5mZXRjaGVycylcbiAgICAgIH0pO1xuICAgICAgaXNSZXZhbGlkYXRpb25SZXF1aXJlZCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuICAvLyBDYWxsIHRoZSBtYXRjaGVkIGxvYWRlciBmb3IgZmV0Y2hlci5sb2FkKCksIGhhbmRsaW5nIHJlZGlyZWN0cywgZXJyb3JzLCBldGMuXG4gIGFzeW5jIGZ1bmN0aW9uIGhhbmRsZUZldGNoZXJMb2FkZXIoa2V5LCByb3V0ZUlkLCBwYXRoLCBtYXRjaCwgbWF0Y2hlcywgZmx1c2hTeW5jLCBzdWJtaXNzaW9uKSB7XG4gICAgbGV0IGV4aXN0aW5nRmV0Y2hlciA9IHN0YXRlLmZldGNoZXJzLmdldChrZXkpO1xuICAgIHVwZGF0ZUZldGNoZXJTdGF0ZShrZXksIGdldExvYWRpbmdGZXRjaGVyKHN1Ym1pc3Npb24sIGV4aXN0aW5nRmV0Y2hlciA/IGV4aXN0aW5nRmV0Y2hlci5kYXRhIDogdW5kZWZpbmVkKSwge1xuICAgICAgZmx1c2hTeW5jXG4gICAgfSk7XG4gICAgLy8gQ2FsbCB0aGUgbG9hZGVyIGZvciB0aGlzIGZldGNoZXIgcm91dGUgbWF0Y2hcbiAgICBsZXQgYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIGxldCBmZXRjaFJlcXVlc3QgPSBjcmVhdGVDbGllbnRTaWRlUmVxdWVzdChpbml0Lmhpc3RvcnksIHBhdGgsIGFib3J0Q29udHJvbGxlci5zaWduYWwpO1xuICAgIGZldGNoQ29udHJvbGxlcnMuc2V0KGtleSwgYWJvcnRDb250cm9sbGVyKTtcbiAgICBsZXQgb3JpZ2luYXRpbmdMb2FkSWQgPSBpbmNyZW1lbnRpbmdMb2FkSWQ7XG4gICAgbGV0IHJlc3VsdCA9IGF3YWl0IGNhbGxMb2FkZXJPckFjdGlvbihcImxvYWRlclwiLCBmZXRjaFJlcXVlc3QsIG1hdGNoLCBtYXRjaGVzLCBtYW5pZmVzdCwgbWFwUm91dGVQcm9wZXJ0aWVzLCBiYXNlbmFtZSk7XG4gICAgLy8gRGVmZXJyZWQgaXNuJ3Qgc3VwcG9ydGVkIGZvciBmZXRjaGVyIGxvYWRzLCBhd2FpdCBldmVyeXRoaW5nIGFuZCB0cmVhdCBpdFxuICAgIC8vIGFzIGEgbm9ybWFsIGxvYWQuICByZXNvbHZlRGVmZXJyZWREYXRhIHdpbGwgcmV0dXJuIHVuZGVmaW5lZCBpZiB0aGlzXG4gICAgLy8gZmV0Y2hlciBnZXRzIGFib3J0ZWQsIHNvIHdlIGp1c3QgbGVhdmUgcmVzdWx0IHVudG91Y2hlZCBhbmQgc2hvcnQgY2lyY3VpdFxuICAgIC8vIGJlbG93IGlmIHRoYXQgaGFwcGVuc1xuICAgIGlmIChpc0RlZmVycmVkUmVzdWx0KHJlc3VsdCkpIHtcbiAgICAgIHJlc3VsdCA9IChhd2FpdCByZXNvbHZlRGVmZXJyZWREYXRhKHJlc3VsdCwgZmV0Y2hSZXF1ZXN0LnNpZ25hbCwgdHJ1ZSkpIHx8IHJlc3VsdDtcbiAgICB9XG4gICAgLy8gV2UgY2FuIGRlbGV0ZSB0aGlzIHNvIGxvbmcgYXMgd2Ugd2VyZW4ndCBhYm9ydGVkIGJ5IG91ciBvdXIgb3duIGZldGNoZXJcbiAgICAvLyByZS1sb2FkIHdoaWNoIHdvdWxkIGhhdmUgcHV0IF9uZXdfIGNvbnRyb2xsZXIgaXMgaW4gZmV0Y2hDb250cm9sbGVyc1xuICAgIGlmIChmZXRjaENvbnRyb2xsZXJzLmdldChrZXkpID09PSBhYm9ydENvbnRyb2xsZXIpIHtcbiAgICAgIGZldGNoQ29udHJvbGxlcnMuZGVsZXRlKGtleSk7XG4gICAgfVxuICAgIGlmIChmZXRjaFJlcXVlc3Quc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGRlbGV0ZWRGZXRjaGVycy5oYXMoa2V5KSkge1xuICAgICAgdXBkYXRlRmV0Y2hlclN0YXRlKGtleSwgZ2V0RG9uZUZldGNoZXIodW5kZWZpbmVkKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIElmIHRoZSBsb2FkZXIgdGhyZXcgYSByZWRpcmVjdCBSZXNwb25zZSwgc3RhcnQgYSBuZXcgUkVQTEFDRSBuYXZpZ2F0aW9uXG4gICAgaWYgKGlzUmVkaXJlY3RSZXN1bHQocmVzdWx0KSkge1xuICAgICAgaWYgKHBlbmRpbmdOYXZpZ2F0aW9uTG9hZElkID4gb3JpZ2luYXRpbmdMb2FkSWQpIHtcbiAgICAgICAgLy8gQSBuZXcgbmF2aWdhdGlvbiB3YXMga2lja2VkIG9mZiBhZnRlciBvdXIgbG9hZGVyIHN0YXJ0ZWQsIHNvIHRoYXRcbiAgICAgICAgLy8gc2hvdWxkIHRha2UgcHJlY2VkZW5jZSBvdmVyIHRoaXMgcmVkaXJlY3QgbmF2aWdhdGlvblxuICAgICAgICB1cGRhdGVGZXRjaGVyU3RhdGUoa2V5LCBnZXREb25lRmV0Y2hlcih1bmRlZmluZWQpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmV0Y2hSZWRpcmVjdElkcy5hZGQoa2V5KTtcbiAgICAgICAgYXdhaXQgc3RhcnRSZWRpcmVjdE5hdmlnYXRpb24oc3RhdGUsIHJlc3VsdCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gUHJvY2VzcyBhbnkgbm9uLXJlZGlyZWN0IGVycm9ycyB0aHJvd25cbiAgICBpZiAoaXNFcnJvclJlc3VsdChyZXN1bHQpKSB7XG4gICAgICBzZXRGZXRjaGVyRXJyb3Ioa2V5LCByb3V0ZUlkLCByZXN1bHQuZXJyb3IpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpbnZhcmlhbnQoIWlzRGVmZXJyZWRSZXN1bHQocmVzdWx0KSwgXCJVbmhhbmRsZWQgZmV0Y2hlciBkZWZlcnJlZCBkYXRhXCIpO1xuICAgIC8vIFB1dCB0aGUgZmV0Y2hlciBiYWNrIGludG8gYW4gaWRsZSBzdGF0ZVxuICAgIHVwZGF0ZUZldGNoZXJTdGF0ZShrZXksIGdldERvbmVGZXRjaGVyKHJlc3VsdC5kYXRhKSk7XG4gIH1cbiAgLyoqXG4gICAqIFV0aWxpdHkgZnVuY3Rpb24gdG8gaGFuZGxlIHJlZGlyZWN0cyByZXR1cm5lZCBmcm9tIGFuIGFjdGlvbiBvciBsb2FkZXIuXG4gICAqIE5vcm1hbGx5LCBhIHJlZGlyZWN0IFwicmVwbGFjZXNcIiB0aGUgbmF2aWdhdGlvbiB0aGF0IHRyaWdnZXJlZCBpdC4gIFNvLCBmb3JcbiAgICogZXhhbXBsZTpcbiAgICpcbiAgICogIC0gdXNlciBpcyBvbiAvYVxuICAgKiAgLSB1c2VyIGNsaWNrcyBhIGxpbmsgdG8gL2JcbiAgICogIC0gbG9hZGVyIGZvciAvYiByZWRpcmVjdHMgdG8gL2NcbiAgICpcbiAgICogSW4gYSBub24tSlMgYXBwIHRoZSBicm93c2VyIHdvdWxkIHRyYWNrIHRoZSBpbi1mbGlnaHQgbmF2aWdhdGlvbiB0byAvYiBhbmRcbiAgICogdGhlbiByZXBsYWNlIGl0IHdpdGggL2Mgd2hlbiBpdCBlbmNvdW50ZXJlZCB0aGUgcmVkaXJlY3QgcmVzcG9uc2UuICBJblxuICAgKiB0aGUgZW5kIGl0IHdvdWxkIG9ubHkgZXZlciB1cGRhdGUgdGhlIFVSTCBiYXIgd2l0aCAvYy5cbiAgICpcbiAgICogSW4gY2xpZW50LXNpZGUgcm91dGluZyB1c2luZyBwdXNoU3RhdGUvcmVwbGFjZVN0YXRlLCB3ZSBhaW0gdG8gZW11bGF0ZVxuICAgKiB0aGlzIGJlaGF2aW9yIGFuZCB3ZSBhbHNvIGRvIG5vdCB1cGRhdGUgaGlzdG9yeSB1bnRpbCB0aGUgZW5kIG9mIHRoZVxuICAgKiBuYXZpZ2F0aW9uIChpbmNsdWRpbmcgcHJvY2Vzc2VkIHJlZGlyZWN0cykuICBUaGlzIG1lYW5zIHRoYXQgd2UgbmV2ZXJcbiAgICogYWN0dWFsbHkgdG91Y2ggaGlzdG9yeSB1bnRpbCB3ZSd2ZSBwcm9jZXNzZWQgcmVkaXJlY3RzLCBzbyB3ZSBqdXN0IHVzZVxuICAgKiB0aGUgaGlzdG9yeSBhY3Rpb24gZnJvbSB0aGUgb3JpZ2luYWwgbmF2aWdhdGlvbiAoUFVTSCBvciBSRVBMQUNFKS5cbiAgICovXG4gIGFzeW5jIGZ1bmN0aW9uIHN0YXJ0UmVkaXJlY3ROYXZpZ2F0aW9uKHN0YXRlLCByZWRpcmVjdCwgX3RlbXAyKSB7XG4gICAgbGV0IHtcbiAgICAgIHN1Ym1pc3Npb24sXG4gICAgICBmZXRjaGVyU3VibWlzc2lvbixcbiAgICAgIHJlcGxhY2VcbiAgICB9ID0gX3RlbXAyID09PSB2b2lkIDAgPyB7fSA6IF90ZW1wMjtcbiAgICBpZiAocmVkaXJlY3QucmV2YWxpZGF0ZSkge1xuICAgICAgaXNSZXZhbGlkYXRpb25SZXF1aXJlZCA9IHRydWU7XG4gICAgfVxuICAgIGxldCByZWRpcmVjdExvY2F0aW9uID0gY3JlYXRlTG9jYXRpb24oc3RhdGUubG9jYXRpb24sIHJlZGlyZWN0LmxvY2F0aW9uLCB7XG4gICAgICBfaXNSZWRpcmVjdDogdHJ1ZVxuICAgIH0pO1xuICAgIGludmFyaWFudChyZWRpcmVjdExvY2F0aW9uLCBcIkV4cGVjdGVkIGEgbG9jYXRpb24gb24gdGhlIHJlZGlyZWN0IG5hdmlnYXRpb25cIik7XG4gICAgaWYgKGlzQnJvd3Nlcikge1xuICAgICAgbGV0IGlzRG9jdW1lbnRSZWxvYWQgPSBmYWxzZTtcbiAgICAgIGlmIChyZWRpcmVjdC5yZWxvYWREb2N1bWVudCkge1xuICAgICAgICAvLyBIYXJkIHJlbG9hZCBpZiB0aGUgcmVzcG9uc2UgY29udGFpbmVkIFgtUmVtaXgtUmVsb2FkLURvY3VtZW50XG4gICAgICAgIGlzRG9jdW1lbnRSZWxvYWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChBQlNPTFVURV9VUkxfUkVHRVgudGVzdChyZWRpcmVjdC5sb2NhdGlvbikpIHtcbiAgICAgICAgY29uc3QgdXJsID0gaW5pdC5oaXN0b3J5LmNyZWF0ZVVSTChyZWRpcmVjdC5sb2NhdGlvbik7XG4gICAgICAgIGlzRG9jdW1lbnRSZWxvYWQgPVxuICAgICAgICAvLyBIYXJkIHJlbG9hZCBpZiBpdCdzIGFuIGFic29sdXRlIFVSTCB0byBhIG5ldyBvcmlnaW5cbiAgICAgICAgdXJsLm9yaWdpbiAhPT0gcm91dGVyV2luZG93LmxvY2F0aW9uLm9yaWdpbiB8fFxuICAgICAgICAvLyBIYXJkIHJlbG9hZCBpZiBpdCdzIGFuIGFic29sdXRlIFVSTCB0aGF0IGRvZXMgbm90IG1hdGNoIG91ciBiYXNlbmFtZVxuICAgICAgICBzdHJpcEJhc2VuYW1lKHVybC5wYXRobmFtZSwgYmFzZW5hbWUpID09IG51bGw7XG4gICAgICB9XG4gICAgICBpZiAoaXNEb2N1bWVudFJlbG9hZCkge1xuICAgICAgICBpZiAocmVwbGFjZSkge1xuICAgICAgICAgIHJvdXRlcldpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKHJlZGlyZWN0LmxvY2F0aW9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByb3V0ZXJXaW5kb3cubG9jYXRpb24uYXNzaWduKHJlZGlyZWN0LmxvY2F0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFRoZXJlJ3Mgbm8gbmVlZCB0byBhYm9ydCBvbiByZWRpcmVjdHMsIHNpbmNlIHdlIGRvbid0IGRldGVjdCB0aGVcbiAgICAvLyByZWRpcmVjdCB1bnRpbCB0aGUgYWN0aW9uL2xvYWRlcnMgaGF2ZSBzZXR0bGVkXG4gICAgcGVuZGluZ05hdmlnYXRpb25Db250cm9sbGVyID0gbnVsbDtcbiAgICBsZXQgcmVkaXJlY3RIaXN0b3J5QWN0aW9uID0gcmVwbGFjZSA9PT0gdHJ1ZSA/IEFjdGlvbi5SZXBsYWNlIDogQWN0aW9uLlB1c2g7XG4gICAgLy8gVXNlIHRoZSBpbmNvbWluZyBzdWJtaXNzaW9uIGlmIHByb3ZpZGVkLCBmYWxsYmFjayBvbiB0aGUgYWN0aXZlIG9uZSBpblxuICAgIC8vIHN0YXRlLm5hdmlnYXRpb25cbiAgICBsZXQge1xuICAgICAgZm9ybU1ldGhvZCxcbiAgICAgIGZvcm1BY3Rpb24sXG4gICAgICBmb3JtRW5jVHlwZVxuICAgIH0gPSBzdGF0ZS5uYXZpZ2F0aW9uO1xuICAgIGlmICghc3VibWlzc2lvbiAmJiAhZmV0Y2hlclN1Ym1pc3Npb24gJiYgZm9ybU1ldGhvZCAmJiBmb3JtQWN0aW9uICYmIGZvcm1FbmNUeXBlKSB7XG4gICAgICBzdWJtaXNzaW9uID0gZ2V0U3VibWlzc2lvbkZyb21OYXZpZ2F0aW9uKHN0YXRlLm5hdmlnYXRpb24pO1xuICAgIH1cbiAgICAvLyBJZiB0aGlzIHdhcyBhIDMwNy8zMDggc3VibWlzc2lvbiB3ZSB3YW50IHRvIHByZXNlcnZlIHRoZSBIVFRQIG1ldGhvZCBhbmRcbiAgICAvLyByZS1zdWJtaXQgdGhlIEdFVC9QT1NUL1BVVC9QQVRDSC9ERUxFVEUgYXMgYSBzdWJtaXNzaW9uIG5hdmlnYXRpb24gdG8gdGhlXG4gICAgLy8gcmVkaXJlY3RlZCBsb2NhdGlvblxuICAgIGxldCBhY3RpdmVTdWJtaXNzaW9uID0gc3VibWlzc2lvbiB8fCBmZXRjaGVyU3VibWlzc2lvbjtcbiAgICBpZiAocmVkaXJlY3RQcmVzZXJ2ZU1ldGhvZFN0YXR1c0NvZGVzLmhhcyhyZWRpcmVjdC5zdGF0dXMpICYmIGFjdGl2ZVN1Ym1pc3Npb24gJiYgaXNNdXRhdGlvbk1ldGhvZChhY3RpdmVTdWJtaXNzaW9uLmZvcm1NZXRob2QpKSB7XG4gICAgICBhd2FpdCBzdGFydE5hdmlnYXRpb24ocmVkaXJlY3RIaXN0b3J5QWN0aW9uLCByZWRpcmVjdExvY2F0aW9uLCB7XG4gICAgICAgIHN1Ym1pc3Npb246IF9leHRlbmRzKHt9LCBhY3RpdmVTdWJtaXNzaW9uLCB7XG4gICAgICAgICAgZm9ybUFjdGlvbjogcmVkaXJlY3QubG9jYXRpb25cbiAgICAgICAgfSksXG4gICAgICAgIC8vIFByZXNlcnZlIHRoaXMgZmxhZyBhY3Jvc3MgcmVkaXJlY3RzXG4gICAgICAgIHByZXZlbnRTY3JvbGxSZXNldDogcGVuZGluZ1ByZXZlbnRTY3JvbGxSZXNldFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElmIHdlIGhhdmUgYSBuYXZpZ2F0aW9uIHN1Ym1pc3Npb24sIHdlIHdpbGwgcHJlc2VydmUgaXQgdGhyb3VnaCB0aGVcbiAgICAgIC8vIHJlZGlyZWN0IG5hdmlnYXRpb25cbiAgICAgIGxldCBvdmVycmlkZU5hdmlnYXRpb24gPSBnZXRMb2FkaW5nTmF2aWdhdGlvbihyZWRpcmVjdExvY2F0aW9uLCBzdWJtaXNzaW9uKTtcbiAgICAgIGF3YWl0IHN0YXJ0TmF2aWdhdGlvbihyZWRpcmVjdEhpc3RvcnlBY3Rpb24sIHJlZGlyZWN0TG9jYXRpb24sIHtcbiAgICAgICAgb3ZlcnJpZGVOYXZpZ2F0aW9uLFxuICAgICAgICAvLyBTZW5kIGZldGNoZXIgc3VibWlzc2lvbnMgdGhyb3VnaCBmb3Igc2hvdWxkUmV2YWxpZGF0ZVxuICAgICAgICBmZXRjaGVyU3VibWlzc2lvbixcbiAgICAgICAgLy8gUHJlc2VydmUgdGhpcyBmbGFnIGFjcm9zcyByZWRpcmVjdHNcbiAgICAgICAgcHJldmVudFNjcm9sbFJlc2V0OiBwZW5kaW5nUHJldmVudFNjcm9sbFJlc2V0XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgYXN5bmMgZnVuY3Rpb24gY2FsbExvYWRlcnNBbmRNYXliZVJlc29sdmVEYXRhKGN1cnJlbnRNYXRjaGVzLCBtYXRjaGVzLCBtYXRjaGVzVG9Mb2FkLCBmZXRjaGVyc1RvTG9hZCwgcmVxdWVzdCkge1xuICAgIC8vIENhbGwgYWxsIG5hdmlnYXRpb24gbG9hZGVycyBhbmQgcmV2YWxpZGF0aW5nIGZldGNoZXIgbG9hZGVycyBpbiBwYXJhbGxlbCxcbiAgICAvLyB0aGVuIHNsaWNlIG9mZiB0aGUgcmVzdWx0cyBpbnRvIHNlcGFyYXRlIGFycmF5cyBzbyB3ZSBjYW4gaGFuZGxlIHRoZW1cbiAgICAvLyBhY2NvcmRpbmdseVxuICAgIGxldCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoWy4uLm1hdGNoZXNUb0xvYWQubWFwKG1hdGNoID0+IGNhbGxMb2FkZXJPckFjdGlvbihcImxvYWRlclwiLCByZXF1ZXN0LCBtYXRjaCwgbWF0Y2hlcywgbWFuaWZlc3QsIG1hcFJvdXRlUHJvcGVydGllcywgYmFzZW5hbWUpKSwgLi4uZmV0Y2hlcnNUb0xvYWQubWFwKGYgPT4ge1xuICAgICAgaWYgKGYubWF0Y2hlcyAmJiBmLm1hdGNoICYmIGYuY29udHJvbGxlcikge1xuICAgICAgICByZXR1cm4gY2FsbExvYWRlck9yQWN0aW9uKFwibG9hZGVyXCIsIGNyZWF0ZUNsaWVudFNpZGVSZXF1ZXN0KGluaXQuaGlzdG9yeSwgZi5wYXRoLCBmLmNvbnRyb2xsZXIuc2lnbmFsKSwgZi5tYXRjaCwgZi5tYXRjaGVzLCBtYW5pZmVzdCwgbWFwUm91dGVQcm9wZXJ0aWVzLCBiYXNlbmFtZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgZXJyb3IgPSB7XG4gICAgICAgICAgdHlwZTogUmVzdWx0VHlwZS5lcnJvcixcbiAgICAgICAgICBlcnJvcjogZ2V0SW50ZXJuYWxSb3V0ZXJFcnJvcig0MDQsIHtcbiAgICAgICAgICAgIHBhdGhuYW1lOiBmLnBhdGhcbiAgICAgICAgICB9KVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICB9XG4gICAgfSldKTtcbiAgICBsZXQgbG9hZGVyUmVzdWx0cyA9IHJlc3VsdHMuc2xpY2UoMCwgbWF0Y2hlc1RvTG9hZC5sZW5ndGgpO1xuICAgIGxldCBmZXRjaGVyUmVzdWx0cyA9IHJlc3VsdHMuc2xpY2UobWF0Y2hlc1RvTG9hZC5sZW5ndGgpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFtyZXNvbHZlRGVmZXJyZWRSZXN1bHRzKGN1cnJlbnRNYXRjaGVzLCBtYXRjaGVzVG9Mb2FkLCBsb2FkZXJSZXN1bHRzLCBsb2FkZXJSZXN1bHRzLm1hcCgoKSA9PiByZXF1ZXN0LnNpZ25hbCksIGZhbHNlLCBzdGF0ZS5sb2FkZXJEYXRhKSwgcmVzb2x2ZURlZmVycmVkUmVzdWx0cyhjdXJyZW50TWF0Y2hlcywgZmV0Y2hlcnNUb0xvYWQubWFwKGYgPT4gZi5tYXRjaCksIGZldGNoZXJSZXN1bHRzLCBmZXRjaGVyc1RvTG9hZC5tYXAoZiA9PiBmLmNvbnRyb2xsZXIgPyBmLmNvbnRyb2xsZXIuc2lnbmFsIDogbnVsbCksIHRydWUpXSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlc3VsdHMsXG4gICAgICBsb2FkZXJSZXN1bHRzLFxuICAgICAgZmV0Y2hlclJlc3VsdHNcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIGludGVycnVwdEFjdGl2ZUxvYWRzKCkge1xuICAgIC8vIEV2ZXJ5IGludGVycnVwdGlvbiB0cmlnZ2VycyBhIHJldmFsaWRhdGlvblxuICAgIGlzUmV2YWxpZGF0aW9uUmVxdWlyZWQgPSB0cnVlO1xuICAgIC8vIENhbmNlbCBwZW5kaW5nIHJvdXRlLWxldmVsIGRlZmVycmVkcyBhbmQgbWFyayBjYW5jZWxsZWQgcm91dGVzIGZvclxuICAgIC8vIHJldmFsaWRhdGlvblxuICAgIGNhbmNlbGxlZERlZmVycmVkUm91dGVzLnB1c2goLi4uY2FuY2VsQWN0aXZlRGVmZXJyZWRzKCkpO1xuICAgIC8vIEFib3J0IGluLWZsaWdodCBmZXRjaGVyIGxvYWRzXG4gICAgZmV0Y2hMb2FkTWF0Y2hlcy5mb3JFYWNoKChfLCBrZXkpID0+IHtcbiAgICAgIGlmIChmZXRjaENvbnRyb2xsZXJzLmhhcyhrZXkpKSB7XG4gICAgICAgIGNhbmNlbGxlZEZldGNoZXJMb2Fkcy5wdXNoKGtleSk7XG4gICAgICAgIGFib3J0RmV0Y2hlcihrZXkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGZ1bmN0aW9uIHVwZGF0ZUZldGNoZXJTdGF0ZShrZXksIGZldGNoZXIsIG9wdHMpIHtcbiAgICBpZiAob3B0cyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRzID0ge307XG4gICAgfVxuICAgIHN0YXRlLmZldGNoZXJzLnNldChrZXksIGZldGNoZXIpO1xuICAgIHVwZGF0ZVN0YXRlKHtcbiAgICAgIGZldGNoZXJzOiBuZXcgTWFwKHN0YXRlLmZldGNoZXJzKVxuICAgIH0sIHtcbiAgICAgIGZsdXNoU3luYzogKG9wdHMgJiYgb3B0cy5mbHVzaFN5bmMpID09PSB0cnVlXG4gICAgfSk7XG4gIH1cbiAgZnVuY3Rpb24gc2V0RmV0Y2hlckVycm9yKGtleSwgcm91dGVJZCwgZXJyb3IsIG9wdHMpIHtcbiAgICBpZiAob3B0cyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRzID0ge307XG4gICAgfVxuICAgIGxldCBib3VuZGFyeU1hdGNoID0gZmluZE5lYXJlc3RCb3VuZGFyeShzdGF0ZS5tYXRjaGVzLCByb3V0ZUlkKTtcbiAgICBkZWxldGVGZXRjaGVyKGtleSk7XG4gICAgdXBkYXRlU3RhdGUoe1xuICAgICAgZXJyb3JzOiB7XG4gICAgICAgIFtib3VuZGFyeU1hdGNoLnJvdXRlLmlkXTogZXJyb3JcbiAgICAgIH0sXG4gICAgICBmZXRjaGVyczogbmV3IE1hcChzdGF0ZS5mZXRjaGVycylcbiAgICB9LCB7XG4gICAgICBmbHVzaFN5bmM6IChvcHRzICYmIG9wdHMuZmx1c2hTeW5jKSA9PT0gdHJ1ZVxuICAgIH0pO1xuICB9XG4gIGZ1bmN0aW9uIGdldEZldGNoZXIoa2V5KSB7XG4gICAgaWYgKGZ1dHVyZS52N19mZXRjaGVyUGVyc2lzdCkge1xuICAgICAgYWN0aXZlRmV0Y2hlcnMuc2V0KGtleSwgKGFjdGl2ZUZldGNoZXJzLmdldChrZXkpIHx8IDApICsgMSk7XG4gICAgICAvLyBJZiB0aGlzIGZldGNoZXIgd2FzIHByZXZpb3VzbHkgbWFya2VkIGZvciBkZWxldGlvbiwgdW5tYXJrIGl0IHNpbmNlIHdlXG4gICAgICAvLyBoYXZlIGEgbmV3IGluc3RhbmNlXG4gICAgICBpZiAoZGVsZXRlZEZldGNoZXJzLmhhcyhrZXkpKSB7XG4gICAgICAgIGRlbGV0ZWRGZXRjaGVycy5kZWxldGUoa2V5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN0YXRlLmZldGNoZXJzLmdldChrZXkpIHx8IElETEVfRkVUQ0hFUjtcbiAgfVxuICBmdW5jdGlvbiBkZWxldGVGZXRjaGVyKGtleSkge1xuICAgIGxldCBmZXRjaGVyID0gc3RhdGUuZmV0Y2hlcnMuZ2V0KGtleSk7XG4gICAgLy8gRG9uJ3QgYWJvcnQgdGhlIGNvbnRyb2xsZXIgaWYgdGhpcyBpcyBhIGRlbGV0aW9uIG9mIGEgZmV0Y2hlci5zdWJtaXQoKVxuICAgIC8vIGluIGl0J3MgbG9hZGluZyBwaGFzZSBzaW5jZSAtIHdlIGRvbid0IHdhbnQgdG8gYWJvcnQgdGhlIGNvcnJlc3BvbmRpbmdcbiAgICAvLyByZXZhbGlkYXRpb24gYW5kIHdhbnQgdGhlbSB0byBjb21wbGV0ZSBhbmQgbGFuZFxuICAgIGlmIChmZXRjaENvbnRyb2xsZXJzLmhhcyhrZXkpICYmICEoZmV0Y2hlciAmJiBmZXRjaGVyLnN0YXRlID09PSBcImxvYWRpbmdcIiAmJiBmZXRjaFJlbG9hZElkcy5oYXMoa2V5KSkpIHtcbiAgICAgIGFib3J0RmV0Y2hlcihrZXkpO1xuICAgIH1cbiAgICBmZXRjaExvYWRNYXRjaGVzLmRlbGV0ZShrZXkpO1xuICAgIGZldGNoUmVsb2FkSWRzLmRlbGV0ZShrZXkpO1xuICAgIGZldGNoUmVkaXJlY3RJZHMuZGVsZXRlKGtleSk7XG4gICAgZGVsZXRlZEZldGNoZXJzLmRlbGV0ZShrZXkpO1xuICAgIHN0YXRlLmZldGNoZXJzLmRlbGV0ZShrZXkpO1xuICB9XG4gIGZ1bmN0aW9uIGRlbGV0ZUZldGNoZXJBbmRVcGRhdGVTdGF0ZShrZXkpIHtcbiAgICBpZiAoZnV0dXJlLnY3X2ZldGNoZXJQZXJzaXN0KSB7XG4gICAgICBsZXQgY291bnQgPSAoYWN0aXZlRmV0Y2hlcnMuZ2V0KGtleSkgfHwgMCkgLSAxO1xuICAgICAgaWYgKGNvdW50IDw9IDApIHtcbiAgICAgICAgYWN0aXZlRmV0Y2hlcnMuZGVsZXRlKGtleSk7XG4gICAgICAgIGRlbGV0ZWRGZXRjaGVycy5hZGQoa2V5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFjdGl2ZUZldGNoZXJzLnNldChrZXksIGNvdW50KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlRmV0Y2hlcihrZXkpO1xuICAgIH1cbiAgICB1cGRhdGVTdGF0ZSh7XG4gICAgICBmZXRjaGVyczogbmV3IE1hcChzdGF0ZS5mZXRjaGVycylcbiAgICB9KTtcbiAgfVxuICBmdW5jdGlvbiBhYm9ydEZldGNoZXIoa2V5KSB7XG4gICAgbGV0IGNvbnRyb2xsZXIgPSBmZXRjaENvbnRyb2xsZXJzLmdldChrZXkpO1xuICAgIGludmFyaWFudChjb250cm9sbGVyLCBcIkV4cGVjdGVkIGZldGNoIGNvbnRyb2xsZXI6IFwiICsga2V5KTtcbiAgICBjb250cm9sbGVyLmFib3J0KCk7XG4gICAgZmV0Y2hDb250cm9sbGVycy5kZWxldGUoa2V5KTtcbiAgfVxuICBmdW5jdGlvbiBtYXJrRmV0Y2hlcnNEb25lKGtleXMpIHtcbiAgICBmb3IgKGxldCBrZXkgb2Yga2V5cykge1xuICAgICAgbGV0IGZldGNoZXIgPSBnZXRGZXRjaGVyKGtleSk7XG4gICAgICBsZXQgZG9uZUZldGNoZXIgPSBnZXREb25lRmV0Y2hlcihmZXRjaGVyLmRhdGEpO1xuICAgICAgc3RhdGUuZmV0Y2hlcnMuc2V0KGtleSwgZG9uZUZldGNoZXIpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBtYXJrRmV0Y2hSZWRpcmVjdHNEb25lKCkge1xuICAgIGxldCBkb25lS2V5cyA9IFtdO1xuICAgIGxldCB1cGRhdGVkRmV0Y2hlcnMgPSBmYWxzZTtcbiAgICBmb3IgKGxldCBrZXkgb2YgZmV0Y2hSZWRpcmVjdElkcykge1xuICAgICAgbGV0IGZldGNoZXIgPSBzdGF0ZS5mZXRjaGVycy5nZXQoa2V5KTtcbiAgICAgIGludmFyaWFudChmZXRjaGVyLCBcIkV4cGVjdGVkIGZldGNoZXI6IFwiICsga2V5KTtcbiAgICAgIGlmIChmZXRjaGVyLnN0YXRlID09PSBcImxvYWRpbmdcIikge1xuICAgICAgICBmZXRjaFJlZGlyZWN0SWRzLmRlbGV0ZShrZXkpO1xuICAgICAgICBkb25lS2V5cy5wdXNoKGtleSk7XG4gICAgICAgIHVwZGF0ZWRGZXRjaGVycyA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIG1hcmtGZXRjaGVyc0RvbmUoZG9uZUtleXMpO1xuICAgIHJldHVybiB1cGRhdGVkRmV0Y2hlcnM7XG4gIH1cbiAgZnVuY3Rpb24gYWJvcnRTdGFsZUZldGNoTG9hZHMobGFuZGVkSWQpIHtcbiAgICBsZXQgeWVldGVkS2V5cyA9IFtdO1xuICAgIGZvciAobGV0IFtrZXksIGlkXSBvZiBmZXRjaFJlbG9hZElkcykge1xuICAgICAgaWYgKGlkIDwgbGFuZGVkSWQpIHtcbiAgICAgICAgbGV0IGZldGNoZXIgPSBzdGF0ZS5mZXRjaGVycy5nZXQoa2V5KTtcbiAgICAgICAgaW52YXJpYW50KGZldGNoZXIsIFwiRXhwZWN0ZWQgZmV0Y2hlcjogXCIgKyBrZXkpO1xuICAgICAgICBpZiAoZmV0Y2hlci5zdGF0ZSA9PT0gXCJsb2FkaW5nXCIpIHtcbiAgICAgICAgICBhYm9ydEZldGNoZXIoa2V5KTtcbiAgICAgICAgICBmZXRjaFJlbG9hZElkcy5kZWxldGUoa2V5KTtcbiAgICAgICAgICB5ZWV0ZWRLZXlzLnB1c2goa2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBtYXJrRmV0Y2hlcnNEb25lKHllZXRlZEtleXMpO1xuICAgIHJldHVybiB5ZWV0ZWRLZXlzLmxlbmd0aCA+IDA7XG4gIH1cbiAgZnVuY3Rpb24gZ2V0QmxvY2tlcihrZXksIGZuKSB7XG4gICAgbGV0IGJsb2NrZXIgPSBzdGF0ZS5ibG9ja2Vycy5nZXQoa2V5KSB8fCBJRExFX0JMT0NLRVI7XG4gICAgaWYgKGJsb2NrZXJGdW5jdGlvbnMuZ2V0KGtleSkgIT09IGZuKSB7XG4gICAgICBibG9ja2VyRnVuY3Rpb25zLnNldChrZXksIGZuKTtcbiAgICB9XG4gICAgcmV0dXJuIGJsb2NrZXI7XG4gIH1cbiAgZnVuY3Rpb24gZGVsZXRlQmxvY2tlcihrZXkpIHtcbiAgICBzdGF0ZS5ibG9ja2Vycy5kZWxldGUoa2V5KTtcbiAgICBibG9ja2VyRnVuY3Rpb25zLmRlbGV0ZShrZXkpO1xuICB9XG4gIC8vIFV0aWxpdHkgZnVuY3Rpb24gdG8gdXBkYXRlIGJsb2NrZXJzLCBlbnN1cmluZyB2YWxpZCBzdGF0ZSB0cmFuc2l0aW9uc1xuICBmdW5jdGlvbiB1cGRhdGVCbG9ja2VyKGtleSwgbmV3QmxvY2tlcikge1xuICAgIGxldCBibG9ja2VyID0gc3RhdGUuYmxvY2tlcnMuZ2V0KGtleSkgfHwgSURMRV9CTE9DS0VSO1xuICAgIC8vIFBvb3IgbWFucyBzdGF0ZSBtYWNoaW5lIDopXG4gICAgLy8gaHR0cHM6Ly9tZXJtYWlkLmxpdmUvZWRpdCNwYWtvOmVOcVZrYzlPd3pBTXhsOGw4bm5qQVlyRXRESU9IRUJJZ3d2S0pUUmVHeTNfbERwSXFPMjdrNmF3TUcwWGNyTGxuejg3bndkb25FU29nS1hYQnVFNzlycTc1WFpPMy15SGRzMFJKVnV2NzBZclBsVXJDRWUySGZyT1JTM3J1YnFaZnVodHBnNUM5d2s1dFo0VktjUlVxODhxOVo4UlMwLTQ4Y0UxaUhKa0wwdWdiSHVGTHVzOUw2c3BaeThuWDlNUDJDTmRvbVZhcG9zcXUzZkdheVQ4VDgtakpRd2hlcG9fVXRwZ0JRYURFVW9tMDRkWmhBTjFhSkJEbFVLSkJ4RTFjZUIyU21qME1sbi1JQlc1QUZVMmR3VWlrdHRfMlFhcTJkQmZhS2RFdXA4NVVWN1lkLWRLamxua2FibDJQdnIwRFRrVHJlTVxuICAgIGludmFyaWFudChibG9ja2VyLnN0YXRlID09PSBcInVuYmxvY2tlZFwiICYmIG5ld0Jsb2NrZXIuc3RhdGUgPT09IFwiYmxvY2tlZFwiIHx8IGJsb2NrZXIuc3RhdGUgPT09IFwiYmxvY2tlZFwiICYmIG5ld0Jsb2NrZXIuc3RhdGUgPT09IFwiYmxvY2tlZFwiIHx8IGJsb2NrZXIuc3RhdGUgPT09IFwiYmxvY2tlZFwiICYmIG5ld0Jsb2NrZXIuc3RhdGUgPT09IFwicHJvY2VlZGluZ1wiIHx8IGJsb2NrZXIuc3RhdGUgPT09IFwiYmxvY2tlZFwiICYmIG5ld0Jsb2NrZXIuc3RhdGUgPT09IFwidW5ibG9ja2VkXCIgfHwgYmxvY2tlci5zdGF0ZSA9PT0gXCJwcm9jZWVkaW5nXCIgJiYgbmV3QmxvY2tlci5zdGF0ZSA9PT0gXCJ1bmJsb2NrZWRcIiwgXCJJbnZhbGlkIGJsb2NrZXIgc3RhdGUgdHJhbnNpdGlvbjogXCIgKyBibG9ja2VyLnN0YXRlICsgXCIgLT4gXCIgKyBuZXdCbG9ja2VyLnN0YXRlKTtcbiAgICBsZXQgYmxvY2tlcnMgPSBuZXcgTWFwKHN0YXRlLmJsb2NrZXJzKTtcbiAgICBibG9ja2Vycy5zZXQoa2V5LCBuZXdCbG9ja2VyKTtcbiAgICB1cGRhdGVTdGF0ZSh7XG4gICAgICBibG9ja2Vyc1xuICAgIH0pO1xuICB9XG4gIGZ1bmN0aW9uIHNob3VsZEJsb2NrTmF2aWdhdGlvbihfcmVmMikge1xuICAgIGxldCB7XG4gICAgICBjdXJyZW50TG9jYXRpb24sXG4gICAgICBuZXh0TG9jYXRpb24sXG4gICAgICBoaXN0b3J5QWN0aW9uXG4gICAgfSA9IF9yZWYyO1xuICAgIGlmIChibG9ja2VyRnVuY3Rpb25zLnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gV2Ugb255IHN1cHBvcnQgYSBzaW5nbGUgYWN0aXZlIGJsb2NrZXIgYXQgdGhlIG1vbWVudCBzaW5jZSB3ZSBkb24ndCBoYXZlXG4gICAgLy8gYW55IGNvbXBlbGxpbmcgdXNlIGNhc2VzIGZvciBtdWx0aS1ibG9ja2VyIHlldFxuICAgIGlmIChibG9ja2VyRnVuY3Rpb25zLnNpemUgPiAxKSB7XG4gICAgICB3YXJuaW5nKGZhbHNlLCBcIkEgcm91dGVyIG9ubHkgc3VwcG9ydHMgb25lIGJsb2NrZXIgYXQgYSB0aW1lXCIpO1xuICAgIH1cbiAgICBsZXQgZW50cmllcyA9IEFycmF5LmZyb20oYmxvY2tlckZ1bmN0aW9ucy5lbnRyaWVzKCkpO1xuICAgIGxldCBbYmxvY2tlcktleSwgYmxvY2tlckZ1bmN0aW9uXSA9IGVudHJpZXNbZW50cmllcy5sZW5ndGggLSAxXTtcbiAgICBsZXQgYmxvY2tlciA9IHN0YXRlLmJsb2NrZXJzLmdldChibG9ja2VyS2V5KTtcbiAgICBpZiAoYmxvY2tlciAmJiBibG9ja2VyLnN0YXRlID09PSBcInByb2NlZWRpbmdcIikge1xuICAgICAgLy8gSWYgdGhlIGJsb2NrZXIgaXMgY3VycmVudGx5IHByb2NlZWRpbmcsIHdlIGRvbid0IG5lZWQgdG8gcmUtY2hlY2tcbiAgICAgIC8vIGl0IGFuZCBjYW4gbGV0IHRoaXMgbmF2aWdhdGlvbiBjb250aW51ZVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBBdCB0aGlzIHBvaW50LCB3ZSBrbm93IHdlJ3JlIHVuYmxvY2tlZC9ibG9ja2VkIHNvIHdlIG5lZWQgdG8gY2hlY2sgdGhlXG4gICAgLy8gdXNlci1wcm92aWRlZCBibG9ja2VyIGZ1bmN0aW9uXG4gICAgaWYgKGJsb2NrZXJGdW5jdGlvbih7XG4gICAgICBjdXJyZW50TG9jYXRpb24sXG4gICAgICBuZXh0TG9jYXRpb24sXG4gICAgICBoaXN0b3J5QWN0aW9uXG4gICAgfSkpIHtcbiAgICAgIHJldHVybiBibG9ja2VyS2V5O1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBjYW5jZWxBY3RpdmVEZWZlcnJlZHMocHJlZGljYXRlKSB7XG4gICAgbGV0IGNhbmNlbGxlZFJvdXRlSWRzID0gW107XG4gICAgYWN0aXZlRGVmZXJyZWRzLmZvckVhY2goKGRmZCwgcm91dGVJZCkgPT4ge1xuICAgICAgaWYgKCFwcmVkaWNhdGUgfHwgcHJlZGljYXRlKHJvdXRlSWQpKSB7XG4gICAgICAgIC8vIENhbmNlbCB0aGUgZGVmZXJyZWQgLSBidXQgZG8gbm90IHJlbW92ZSBmcm9tIGFjdGl2ZURlZmVycmVkcyBoZXJlIC1cbiAgICAgICAgLy8gd2UgcmVseSBvbiB0aGUgc3Vic2NyaWJlcnMgdG8gZG8gdGhhdCBzbyBvdXIgdGVzdHMgY2FuIGFzc2VydCBwcm9wZXJcbiAgICAgICAgLy8gY2xlYW51cCB2aWEgX2ludGVybmFsQWN0aXZlRGVmZXJyZWRzXG4gICAgICAgIGRmZC5jYW5jZWwoKTtcbiAgICAgICAgY2FuY2VsbGVkUm91dGVJZHMucHVzaChyb3V0ZUlkKTtcbiAgICAgICAgYWN0aXZlRGVmZXJyZWRzLmRlbGV0ZShyb3V0ZUlkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gY2FuY2VsbGVkUm91dGVJZHM7XG4gIH1cbiAgLy8gT3B0IGluIHRvIGNhcHR1cmluZyBhbmQgcmVwb3J0aW5nIHNjcm9sbCBwb3NpdGlvbnMgZHVyaW5nIG5hdmlnYXRpb25zLFxuICAvLyB1c2VkIGJ5IHRoZSA8U2Nyb2xsUmVzdG9yYXRpb24+IGNvbXBvbmVudFxuICBmdW5jdGlvbiBlbmFibGVTY3JvbGxSZXN0b3JhdGlvbihwb3NpdGlvbnMsIGdldFBvc2l0aW9uLCBnZXRLZXkpIHtcbiAgICBzYXZlZFNjcm9sbFBvc2l0aW9ucyA9IHBvc2l0aW9ucztcbiAgICBnZXRTY3JvbGxQb3NpdGlvbiA9IGdldFBvc2l0aW9uO1xuICAgIGdldFNjcm9sbFJlc3RvcmF0aW9uS2V5ID0gZ2V0S2V5IHx8IG51bGw7XG4gICAgLy8gUGVyZm9ybSBpbml0aWFsIGh5ZHJhdGlvbiBzY3JvbGwgcmVzdG9yYXRpb24sIHNpbmNlIHdlIG1pc3MgdGhlIGJvYXQgb25cbiAgICAvLyB0aGUgaW5pdGlhbCB1cGRhdGVTdGF0ZSgpIGJlY2F1c2Ugd2UndmUgbm90IHlldCByZW5kZXJlZCA8U2Nyb2xsUmVzdG9yYXRpb24vPlxuICAgIC8vIGFuZCB0aGVyZWZvcmUgaGF2ZSBubyBzYXZlZFNjcm9sbFBvc2l0aW9ucyBhdmFpbGFibGVcbiAgICBpZiAoIWluaXRpYWxTY3JvbGxSZXN0b3JlZCAmJiBzdGF0ZS5uYXZpZ2F0aW9uID09PSBJRExFX05BVklHQVRJT04pIHtcbiAgICAgIGluaXRpYWxTY3JvbGxSZXN0b3JlZCA9IHRydWU7XG4gICAgICBsZXQgeSA9IGdldFNhdmVkU2Nyb2xsUG9zaXRpb24oc3RhdGUubG9jYXRpb24sIHN0YXRlLm1hdGNoZXMpO1xuICAgICAgaWYgKHkgIT0gbnVsbCkge1xuICAgICAgICB1cGRhdGVTdGF0ZSh7XG4gICAgICAgICAgcmVzdG9yZVNjcm9sbFBvc2l0aW9uOiB5XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgc2F2ZWRTY3JvbGxQb3NpdGlvbnMgPSBudWxsO1xuICAgICAgZ2V0U2Nyb2xsUG9zaXRpb24gPSBudWxsO1xuICAgICAgZ2V0U2Nyb2xsUmVzdG9yYXRpb25LZXkgPSBudWxsO1xuICAgIH07XG4gIH1cbiAgZnVuY3Rpb24gZ2V0U2Nyb2xsS2V5KGxvY2F0aW9uLCBtYXRjaGVzKSB7XG4gICAgaWYgKGdldFNjcm9sbFJlc3RvcmF0aW9uS2V5KSB7XG4gICAgICBsZXQga2V5ID0gZ2V0U2Nyb2xsUmVzdG9yYXRpb25LZXkobG9jYXRpb24sIG1hdGNoZXMubWFwKG0gPT4gY29udmVydFJvdXRlTWF0Y2hUb1VpTWF0Y2gobSwgc3RhdGUubG9hZGVyRGF0YSkpKTtcbiAgICAgIHJldHVybiBrZXkgfHwgbG9jYXRpb24ua2V5O1xuICAgIH1cbiAgICByZXR1cm4gbG9jYXRpb24ua2V5O1xuICB9XG4gIGZ1bmN0aW9uIHNhdmVTY3JvbGxQb3NpdGlvbihsb2NhdGlvbiwgbWF0Y2hlcykge1xuICAgIGlmIChzYXZlZFNjcm9sbFBvc2l0aW9ucyAmJiBnZXRTY3JvbGxQb3NpdGlvbikge1xuICAgICAgbGV0IGtleSA9IGdldFNjcm9sbEtleShsb2NhdGlvbiwgbWF0Y2hlcyk7XG4gICAgICBzYXZlZFNjcm9sbFBvc2l0aW9uc1trZXldID0gZ2V0U2Nyb2xsUG9zaXRpb24oKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gZ2V0U2F2ZWRTY3JvbGxQb3NpdGlvbihsb2NhdGlvbiwgbWF0Y2hlcykge1xuICAgIGlmIChzYXZlZFNjcm9sbFBvc2l0aW9ucykge1xuICAgICAgbGV0IGtleSA9IGdldFNjcm9sbEtleShsb2NhdGlvbiwgbWF0Y2hlcyk7XG4gICAgICBsZXQgeSA9IHNhdmVkU2Nyb2xsUG9zaXRpb25zW2tleV07XG4gICAgICBpZiAodHlwZW9mIHkgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgcmV0dXJuIHk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGZ1bmN0aW9uIF9pbnRlcm5hbFNldFJvdXRlcyhuZXdSb3V0ZXMpIHtcbiAgICBtYW5pZmVzdCA9IHt9O1xuICAgIGluRmxpZ2h0RGF0YVJvdXRlcyA9IGNvbnZlcnRSb3V0ZXNUb0RhdGFSb3V0ZXMobmV3Um91dGVzLCBtYXBSb3V0ZVByb3BlcnRpZXMsIHVuZGVmaW5lZCwgbWFuaWZlc3QpO1xuICB9XG4gIHJvdXRlciA9IHtcbiAgICBnZXQgYmFzZW5hbWUoKSB7XG4gICAgICByZXR1cm4gYmFzZW5hbWU7XG4gICAgfSxcbiAgICBnZXQgc3RhdGUoKSB7XG4gICAgICByZXR1cm4gc3RhdGU7XG4gICAgfSxcbiAgICBnZXQgcm91dGVzKCkge1xuICAgICAgcmV0dXJuIGRhdGFSb3V0ZXM7XG4gICAgfSxcbiAgICBnZXQgd2luZG93KCkge1xuICAgICAgcmV0dXJuIHJvdXRlcldpbmRvdztcbiAgICB9LFxuICAgIGluaXRpYWxpemUsXG4gICAgc3Vic2NyaWJlLFxuICAgIGVuYWJsZVNjcm9sbFJlc3RvcmF0aW9uLFxuICAgIG5hdmlnYXRlLFxuICAgIGZldGNoLFxuICAgIHJldmFsaWRhdGUsXG4gICAgLy8gUGFzc3Rocm91Z2ggdG8gaGlzdG9yeS1hd2FyZSBjcmVhdGVIcmVmIHVzZWQgYnkgdXNlSHJlZiBzbyB3ZSBnZXQgcHJvcGVyXG4gICAgLy8gaGFzaC1hd2FyZSBVUkxzIGluIERPTSBwYXRoc1xuICAgIGNyZWF0ZUhyZWY6IHRvID0+IGluaXQuaGlzdG9yeS5jcmVhdGVIcmVmKHRvKSxcbiAgICBlbmNvZGVMb2NhdGlvbjogdG8gPT4gaW5pdC5oaXN0b3J5LmVuY29kZUxvY2F0aW9uKHRvKSxcbiAgICBnZXRGZXRjaGVyLFxuICAgIGRlbGV0ZUZldGNoZXI6IGRlbGV0ZUZldGNoZXJBbmRVcGRhdGVTdGF0ZSxcbiAgICBkaXNwb3NlLFxuICAgIGdldEJsb2NrZXIsXG4gICAgZGVsZXRlQmxvY2tlcixcbiAgICBfaW50ZXJuYWxGZXRjaENvbnRyb2xsZXJzOiBmZXRjaENvbnRyb2xsZXJzLFxuICAgIF9pbnRlcm5hbEFjdGl2ZURlZmVycmVkczogYWN0aXZlRGVmZXJyZWRzLFxuICAgIC8vIFRPRE86IFJlbW92ZSBzZXRSb3V0ZXMsIGl0J3MgdGVtcG9yYXJ5IHRvIGF2b2lkIGRlYWxpbmcgd2l0aFxuICAgIC8vIHVwZGF0aW5nIHRoZSB0cmVlIHdoaWxlIHZhbGlkYXRpbmcgdGhlIHVwZGF0ZSBhbGdvcml0aG0uXG4gICAgX2ludGVybmFsU2V0Um91dGVzXG4gIH07XG4gIHJldHVybiByb3V0ZXI7XG59XG4vLyNlbmRyZWdpb25cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyNyZWdpb24gY3JlYXRlU3RhdGljSGFuZGxlclxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbmNvbnN0IFVOU0FGRV9ERUZFUlJFRF9TWU1CT0wgPSBTeW1ib2woXCJkZWZlcnJlZFwiKTtcbmZ1bmN0aW9uIGNyZWF0ZVN0YXRpY0hhbmRsZXIocm91dGVzLCBvcHRzKSB7XG4gIGludmFyaWFudChyb3V0ZXMubGVuZ3RoID4gMCwgXCJZb3UgbXVzdCBwcm92aWRlIGEgbm9uLWVtcHR5IHJvdXRlcyBhcnJheSB0byBjcmVhdGVTdGF0aWNIYW5kbGVyXCIpO1xuICBsZXQgbWFuaWZlc3QgPSB7fTtcbiAgbGV0IGJhc2VuYW1lID0gKG9wdHMgPyBvcHRzLmJhc2VuYW1lIDogbnVsbCkgfHwgXCIvXCI7XG4gIGxldCBtYXBSb3V0ZVByb3BlcnRpZXM7XG4gIGlmIChvcHRzICE9IG51bGwgJiYgb3B0cy5tYXBSb3V0ZVByb3BlcnRpZXMpIHtcbiAgICBtYXBSb3V0ZVByb3BlcnRpZXMgPSBvcHRzLm1hcFJvdXRlUHJvcGVydGllcztcbiAgfSBlbHNlIGlmIChvcHRzICE9IG51bGwgJiYgb3B0cy5kZXRlY3RFcnJvckJvdW5kYXJ5KSB7XG4gICAgLy8gSWYgdGhleSBhcmUgc3RpbGwgdXNpbmcgdGhlIGRlcHJlY2F0ZWQgdmVyc2lvbiwgd3JhcCBpdCB3aXRoIHRoZSBuZXcgQVBJXG4gICAgbGV0IGRldGVjdEVycm9yQm91bmRhcnkgPSBvcHRzLmRldGVjdEVycm9yQm91bmRhcnk7XG4gICAgbWFwUm91dGVQcm9wZXJ0aWVzID0gcm91dGUgPT4gKHtcbiAgICAgIGhhc0Vycm9yQm91bmRhcnk6IGRldGVjdEVycm9yQm91bmRhcnkocm91dGUpXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgbWFwUm91dGVQcm9wZXJ0aWVzID0gZGVmYXVsdE1hcFJvdXRlUHJvcGVydGllcztcbiAgfVxuICBsZXQgZGF0YVJvdXRlcyA9IGNvbnZlcnRSb3V0ZXNUb0RhdGFSb3V0ZXMocm91dGVzLCBtYXBSb3V0ZVByb3BlcnRpZXMsIHVuZGVmaW5lZCwgbWFuaWZlc3QpO1xuICAvKipcbiAgICogVGhlIHF1ZXJ5KCkgbWV0aG9kIGlzIGludGVuZGVkIGZvciBkb2N1bWVudCByZXF1ZXN0cywgaW4gd2hpY2ggd2Ugd2FudCB0b1xuICAgKiBjYWxsIGFuIG9wdGlvbmFsIGFjdGlvbiBhbmQgcG90ZW50aWFsbHkgbXVsdGlwbGUgbG9hZGVycyBmb3IgYWxsIG5lc3RlZFxuICAgKiByb3V0ZXMuICBJdCByZXR1cm5zIGEgU3RhdGljSGFuZGxlckNvbnRleHQgb2JqZWN0LCB3aGljaCBpcyB2ZXJ5IHNpbWlsYXJcbiAgICogdG8gdGhlIHJvdXRlciBzdGF0ZSAobG9jYXRpb24sIGxvYWRlckRhdGEsIGFjdGlvbkRhdGEsIGVycm9ycywgZXRjLikgYW5kXG4gICAqIGFsc28gYWRkcyBTU1Itc3BlY2lmaWMgaW5mb3JtYXRpb24gc3VjaCBhcyB0aGUgc3RhdHVzQ29kZSBhbmQgaGVhZGVyc1xuICAgKiBmcm9tIGFjdGlvbi9sb2FkZXJzIFJlc3BvbnNlcy5cbiAgICpcbiAgICogSXQgX3Nob3VsZF8gbmV2ZXIgdGhyb3cgYW5kIHNob3VsZCByZXBvcnQgYWxsIGVycm9ycyB0aHJvdWdoIHRoZVxuICAgKiByZXR1cm5lZCBjb250ZXh0LmVycm9ycyBvYmplY3QsIHByb3Blcmx5IGFzc29jaWF0aW5nIGVycm9ycyB0byB0aGVpciBlcnJvclxuICAgKiBib3VuZGFyeS4gIEFkZGl0aW9uYWxseSwgaXQgdHJhY2tzIF9kZWVwZXN0UmVuZGVyZWRCb3VuZGFyeUlkIHdoaWNoIGNhbiBiZVxuICAgKiB1c2VkIHRvIGVtdWxhdGUgUmVhY3QgZXJyb3IgYm91bmRhcmllcyBkdXJpbmcgU1NyIGJ5IHBlcmZvcm1pbmcgYSBzZWNvbmRcbiAgICogcGFzcyBvbmx5IGRvd24gdG8gdGhlIGJvdW5kYXJ5SWQuXG4gICAqXG4gICAqIFRoZSBvbmUgZXhjZXB0aW9uIHdoZXJlIHdlIGRvIG5vdCByZXR1cm4gYSBTdGF0aWNIYW5kbGVyQ29udGV4dCBpcyB3aGVuIGFcbiAgICogcmVkaXJlY3QgcmVzcG9uc2UgaXMgcmV0dXJuZWQgb3IgdGhyb3duIGZyb20gYW55IGFjdGlvbi9sb2FkZXIuICBXZVxuICAgKiBwcm9wYWdhdGUgdGhhdCBvdXQgYW5kIHJldHVybiB0aGUgcmF3IFJlc3BvbnNlIHNvIHRoZSBIVFRQIHNlcnZlciBjYW5cbiAgICogcmV0dXJuIGl0IGRpcmVjdGx5LlxuICAgKi9cbiAgYXN5bmMgZnVuY3Rpb24gcXVlcnkocmVxdWVzdCwgX3RlbXAzKSB7XG4gICAgbGV0IHtcbiAgICAgIHJlcXVlc3RDb250ZXh0XG4gICAgfSA9IF90ZW1wMyA9PT0gdm9pZCAwID8ge30gOiBfdGVtcDM7XG4gICAgbGV0IHVybCA9IG5ldyBVUkwocmVxdWVzdC51cmwpO1xuICAgIGxldCBtZXRob2QgPSByZXF1ZXN0Lm1ldGhvZDtcbiAgICBsZXQgbG9jYXRpb24gPSBjcmVhdGVMb2NhdGlvbihcIlwiLCBjcmVhdGVQYXRoKHVybCksIG51bGwsIFwiZGVmYXVsdFwiKTtcbiAgICBsZXQgbWF0Y2hlcyA9IG1hdGNoUm91dGVzKGRhdGFSb3V0ZXMsIGxvY2F0aW9uLCBiYXNlbmFtZSk7XG4gICAgLy8gU1NSIHN1cHBvcnRzIEhFQUQgcmVxdWVzdHMgd2hpbGUgU1BBIGRvZXNuJ3RcbiAgICBpZiAoIWlzVmFsaWRNZXRob2QobWV0aG9kKSAmJiBtZXRob2QgIT09IFwiSEVBRFwiKSB7XG4gICAgICBsZXQgZXJyb3IgPSBnZXRJbnRlcm5hbFJvdXRlckVycm9yKDQwNSwge1xuICAgICAgICBtZXRob2RcbiAgICAgIH0pO1xuICAgICAgbGV0IHtcbiAgICAgICAgbWF0Y2hlczogbWV0aG9kTm90QWxsb3dlZE1hdGNoZXMsXG4gICAgICAgIHJvdXRlXG4gICAgICB9ID0gZ2V0U2hvcnRDaXJjdWl0TWF0Y2hlcyhkYXRhUm91dGVzKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGJhc2VuYW1lLFxuICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgbWF0Y2hlczogbWV0aG9kTm90QWxsb3dlZE1hdGNoZXMsXG4gICAgICAgIGxvYWRlckRhdGE6IHt9LFxuICAgICAgICBhY3Rpb25EYXRhOiBudWxsLFxuICAgICAgICBlcnJvcnM6IHtcbiAgICAgICAgICBbcm91dGUuaWRdOiBlcnJvclxuICAgICAgICB9LFxuICAgICAgICBzdGF0dXNDb2RlOiBlcnJvci5zdGF0dXMsXG4gICAgICAgIGxvYWRlckhlYWRlcnM6IHt9LFxuICAgICAgICBhY3Rpb25IZWFkZXJzOiB7fSxcbiAgICAgICAgYWN0aXZlRGVmZXJyZWRzOiBudWxsXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAoIW1hdGNoZXMpIHtcbiAgICAgIGxldCBlcnJvciA9IGdldEludGVybmFsUm91dGVyRXJyb3IoNDA0LCB7XG4gICAgICAgIHBhdGhuYW1lOiBsb2NhdGlvbi5wYXRobmFtZVxuICAgICAgfSk7XG4gICAgICBsZXQge1xuICAgICAgICBtYXRjaGVzOiBub3RGb3VuZE1hdGNoZXMsXG4gICAgICAgIHJvdXRlXG4gICAgICB9ID0gZ2V0U2hvcnRDaXJjdWl0TWF0Y2hlcyhkYXRhUm91dGVzKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGJhc2VuYW1lLFxuICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgbWF0Y2hlczogbm90Rm91bmRNYXRjaGVzLFxuICAgICAgICBsb2FkZXJEYXRhOiB7fSxcbiAgICAgICAgYWN0aW9uRGF0YTogbnVsbCxcbiAgICAgICAgZXJyb3JzOiB7XG4gICAgICAgICAgW3JvdXRlLmlkXTogZXJyb3JcbiAgICAgICAgfSxcbiAgICAgICAgc3RhdHVzQ29kZTogZXJyb3Iuc3RhdHVzLFxuICAgICAgICBsb2FkZXJIZWFkZXJzOiB7fSxcbiAgICAgICAgYWN0aW9uSGVhZGVyczoge30sXG4gICAgICAgIGFjdGl2ZURlZmVycmVkczogbnVsbFxuICAgICAgfTtcbiAgICB9XG4gICAgbGV0IHJlc3VsdCA9IGF3YWl0IHF1ZXJ5SW1wbChyZXF1ZXN0LCBsb2NhdGlvbiwgbWF0Y2hlcywgcmVxdWVzdENvbnRleHQpO1xuICAgIGlmIChpc1Jlc3BvbnNlKHJlc3VsdCkpIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8vIFdoZW4gcmV0dXJuaW5nIFN0YXRpY0hhbmRsZXJDb250ZXh0LCB3ZSBwYXRjaCBiYWNrIGluIHRoZSBsb2NhdGlvbiBoZXJlXG4gICAgLy8gc2luY2Ugd2UgbmVlZCBpdCBmb3IgUmVhY3QgQ29udGV4dC4gIEJ1dCB0aGlzIGhlbHBzIGtlZXAgb3VyIHN1Ym1pdCBhbmRcbiAgICAvLyBsb2FkUm91dGVEYXRhIG9wZXJhdGluZyBvbiBhIFJlcXVlc3QgaW5zdGVhZCBvZiBhIExvY2F0aW9uXG4gICAgcmV0dXJuIF9leHRlbmRzKHtcbiAgICAgIGxvY2F0aW9uLFxuICAgICAgYmFzZW5hbWVcbiAgICB9LCByZXN1bHQpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgcXVlcnlSb3V0ZSgpIG1ldGhvZCBpcyBpbnRlbmRlZCBmb3IgdGFyZ2V0ZWQgcm91dGUgcmVxdWVzdHMsIGVpdGhlclxuICAgKiBmb3IgZmV0Y2ggP19kYXRhIHJlcXVlc3RzIG9yIHJlc291cmNlIHJvdXRlIHJlcXVlc3RzLiAgSW4gdGhpcyBjYXNlLCB3ZVxuICAgKiBhcmUgb25seSBldmVyIGNhbGxpbmcgYSBzaW5nbGUgYWN0aW9uIG9yIGxvYWRlciwgYW5kIHdlIGFyZSByZXR1cm5pbmcgdGhlXG4gICAqIHJldHVybmVkIHZhbHVlIGRpcmVjdGx5LiAgSW4gbW9zdCBjYXNlcywgdGhpcyB3aWxsIGJlIGEgUmVzcG9uc2UgcmV0dXJuZWRcbiAgICogZnJvbSB0aGUgYWN0aW9uL2xvYWRlciwgYnV0IGl0IG1heSBiZSBhIHByaW1pdGl2ZSBvciBvdGhlciB2YWx1ZSBhcyB3ZWxsIC1cbiAgICogYW5kIGluIHN1Y2ggY2FzZXMgdGhlIGNhbGxpbmcgY29udGV4dCBzaG91bGQgaGFuZGxlIHRoYXQgYWNjb3JkaW5nbHkuXG4gICAqXG4gICAqIFdlIGRvIHJlc3BlY3QgdGhlIHRocm93L3JldHVybiBkaWZmZXJlbnRpYXRpb24sIHNvIGlmIGFuIGFjdGlvbi9sb2FkZXJcbiAgICogdGhyb3dzLCB0aGVuIHRoaXMgbWV0aG9kIHdpbGwgdGhyb3cgdGhlIHZhbHVlLiAgVGhpcyBpcyBpbXBvcnRhbnQgc28gd2VcbiAgICogY2FuIGRvIHByb3BlciBib3VuZGFyeSBpZGVudGlmaWNhdGlvbiBpbiBSZW1peCB3aGVyZSBhIHRocm93biBSZXNwb25zZVxuICAgKiBtdXN0IGdvIHRvIHRoZSBDYXRjaCBCb3VuZGFyeSBidXQgYSByZXR1cm5lZCBSZXNwb25zZSBpcyBoYXBweS1wYXRoLlxuICAgKlxuICAgKiBPbmUgdGhpbmcgdG8gbm90ZSBpcyB0aGF0IGFueSBSb3V0ZXItaW5pdGlhdGVkIEVycm9ycyB0aGF0IG1ha2Ugc2Vuc2VcbiAgICogdG8gYXNzb2NpYXRlIHdpdGggYSBzdGF0dXMgY29kZSB3aWxsIGJlIHRocm93biBhcyBhbiBFcnJvclJlc3BvbnNlXG4gICAqIGluc3RhbmNlIHdoaWNoIGluY2x1ZGUgdGhlIHJhdyBFcnJvciwgc3VjaCB0aGF0IHRoZSBjYWxsaW5nIGNvbnRleHQgY2FuXG4gICAqIHNlcmlhbGl6ZSB0aGUgZXJyb3IgYXMgdGhleSBzZWUgZml0IHdoaWxlIGluY2x1ZGluZyB0aGUgcHJvcGVyIHJlc3BvbnNlXG4gICAqIGNvZGUuICBFeGFtcGxlcyBoZXJlIGFyZSA0MDQgYW5kIDQwNSBlcnJvcnMgdGhhdCBvY2N1ciBwcmlvciB0byByZWFjaGluZ1xuICAgKiBhbnkgdXNlci1kZWZpbmVkIGxvYWRlcnMuXG4gICAqL1xuICBhc3luYyBmdW5jdGlvbiBxdWVyeVJvdXRlKHJlcXVlc3QsIF90ZW1wNCkge1xuICAgIGxldCB7XG4gICAgICByb3V0ZUlkLFxuICAgICAgcmVxdWVzdENvbnRleHRcbiAgICB9ID0gX3RlbXA0ID09PSB2b2lkIDAgPyB7fSA6IF90ZW1wNDtcbiAgICBsZXQgdXJsID0gbmV3IFVSTChyZXF1ZXN0LnVybCk7XG4gICAgbGV0IG1ldGhvZCA9IHJlcXVlc3QubWV0aG9kO1xuICAgIGxldCBsb2NhdGlvbiA9IGNyZWF0ZUxvY2F0aW9uKFwiXCIsIGNyZWF0ZVBhdGgodXJsKSwgbnVsbCwgXCJkZWZhdWx0XCIpO1xuICAgIGxldCBtYXRjaGVzID0gbWF0Y2hSb3V0ZXMoZGF0YVJvdXRlcywgbG9jYXRpb24sIGJhc2VuYW1lKTtcbiAgICAvLyBTU1Igc3VwcG9ydHMgSEVBRCByZXF1ZXN0cyB3aGlsZSBTUEEgZG9lc24ndFxuICAgIGlmICghaXNWYWxpZE1ldGhvZChtZXRob2QpICYmIG1ldGhvZCAhPT0gXCJIRUFEXCIgJiYgbWV0aG9kICE9PSBcIk9QVElPTlNcIikge1xuICAgICAgdGhyb3cgZ2V0SW50ZXJuYWxSb3V0ZXJFcnJvcig0MDUsIHtcbiAgICAgICAgbWV0aG9kXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKCFtYXRjaGVzKSB7XG4gICAgICB0aHJvdyBnZXRJbnRlcm5hbFJvdXRlckVycm9yKDQwNCwge1xuICAgICAgICBwYXRobmFtZTogbG9jYXRpb24ucGF0aG5hbWVcbiAgICAgIH0pO1xuICAgIH1cbiAgICBsZXQgbWF0Y2ggPSByb3V0ZUlkID8gbWF0Y2hlcy5maW5kKG0gPT4gbS5yb3V0ZS5pZCA9PT0gcm91dGVJZCkgOiBnZXRUYXJnZXRNYXRjaChtYXRjaGVzLCBsb2NhdGlvbik7XG4gICAgaWYgKHJvdXRlSWQgJiYgIW1hdGNoKSB7XG4gICAgICB0aHJvdyBnZXRJbnRlcm5hbFJvdXRlckVycm9yKDQwMywge1xuICAgICAgICBwYXRobmFtZTogbG9jYXRpb24ucGF0aG5hbWUsXG4gICAgICAgIHJvdXRlSWRcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoIW1hdGNoKSB7XG4gICAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBoaXQgSSBkb24ndCB0aGluaz9cbiAgICAgIHRocm93IGdldEludGVybmFsUm91dGVyRXJyb3IoNDA0LCB7XG4gICAgICAgIHBhdGhuYW1lOiBsb2NhdGlvbi5wYXRobmFtZVxuICAgICAgfSk7XG4gICAgfVxuICAgIGxldCByZXN1bHQgPSBhd2FpdCBxdWVyeUltcGwocmVxdWVzdCwgbG9jYXRpb24sIG1hdGNoZXMsIHJlcXVlc3RDb250ZXh0LCBtYXRjaCk7XG4gICAgaWYgKGlzUmVzcG9uc2UocmVzdWx0KSkge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgbGV0IGVycm9yID0gcmVzdWx0LmVycm9ycyA/IE9iamVjdC52YWx1ZXMocmVzdWx0LmVycm9ycylbMF0gOiB1bmRlZmluZWQ7XG4gICAgaWYgKGVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIElmIHdlIGdvdCBiYWNrIHJlc3VsdC5lcnJvcnMsIHRoYXQgbWVhbnMgdGhlIGxvYWRlci9hY3Rpb24gdGhyZXdcbiAgICAgIC8vIF9zb21ldGhpbmdfIHRoYXQgd2Fzbid0IGEgUmVzcG9uc2UsIGJ1dCBpdCdzIG5vdCBndWFyYW50ZWVkL3JlcXVpcmVkXG4gICAgICAvLyB0byBiZSBhbiBgaW5zdGFuY2VvZiBFcnJvcmAgZWl0aGVyLCBzbyB3ZSBoYXZlIHRvIHVzZSB0aHJvdyBoZXJlIHRvXG4gICAgICAvLyBwcmVzZXJ2ZSB0aGUgXCJlcnJvclwiIHN0YXRlIG91dHNpZGUgb2YgcXVlcnlJbXBsLlxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIC8vIFBpY2sgb2ZmIHRoZSByaWdodCBzdGF0ZSB2YWx1ZSB0byByZXR1cm5cbiAgICBpZiAocmVzdWx0LmFjdGlvbkRhdGEpIHtcbiAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKHJlc3VsdC5hY3Rpb25EYXRhKVswXTtcbiAgICB9XG4gICAgaWYgKHJlc3VsdC5sb2FkZXJEYXRhKSB7XG4gICAgICB2YXIgX3Jlc3VsdCRhY3RpdmVEZWZlcnJlO1xuICAgICAgbGV0IGRhdGEgPSBPYmplY3QudmFsdWVzKHJlc3VsdC5sb2FkZXJEYXRhKVswXTtcbiAgICAgIGlmICgoX3Jlc3VsdCRhY3RpdmVEZWZlcnJlID0gcmVzdWx0LmFjdGl2ZURlZmVycmVkcykgIT0gbnVsbCAmJiBfcmVzdWx0JGFjdGl2ZURlZmVycmVbbWF0Y2gucm91dGUuaWRdKSB7XG4gICAgICAgIGRhdGFbVU5TQUZFX0RFRkVSUkVEX1NZTUJPTF0gPSByZXN1bHQuYWN0aXZlRGVmZXJyZWRzW21hdGNoLnJvdXRlLmlkXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGFzeW5jIGZ1bmN0aW9uIHF1ZXJ5SW1wbChyZXF1ZXN0LCBsb2NhdGlvbiwgbWF0Y2hlcywgcmVxdWVzdENvbnRleHQsIHJvdXRlTWF0Y2gpIHtcbiAgICBpbnZhcmlhbnQocmVxdWVzdC5zaWduYWwsIFwicXVlcnkoKS9xdWVyeVJvdXRlKCkgcmVxdWVzdHMgbXVzdCBjb250YWluIGFuIEFib3J0Q29udHJvbGxlciBzaWduYWxcIik7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChpc011dGF0aW9uTWV0aG9kKHJlcXVlc3QubWV0aG9kLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBzdWJtaXQocmVxdWVzdCwgbWF0Y2hlcywgcm91dGVNYXRjaCB8fCBnZXRUYXJnZXRNYXRjaChtYXRjaGVzLCBsb2NhdGlvbiksIHJlcXVlc3RDb250ZXh0LCByb3V0ZU1hdGNoICE9IG51bGwpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IGxvYWRSb3V0ZURhdGEocmVxdWVzdCwgbWF0Y2hlcywgcmVxdWVzdENvbnRleHQsIHJvdXRlTWF0Y2gpO1xuICAgICAgcmV0dXJuIGlzUmVzcG9uc2UocmVzdWx0KSA/IHJlc3VsdCA6IF9leHRlbmRzKHt9LCByZXN1bHQsIHtcbiAgICAgICAgYWN0aW9uRGF0YTogbnVsbCxcbiAgICAgICAgYWN0aW9uSGVhZGVyczoge31cbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIElmIHRoZSB1c2VyIHRocmV3L3JldHVybmVkIGEgUmVzcG9uc2UgaW4gY2FsbExvYWRlck9yQWN0aW9uLCB3ZSB0aHJvd1xuICAgICAgLy8gaXQgdG8gYmFpbCBvdXQgYW5kIHRoZW4gcmV0dXJuIG9yIHRocm93IGhlcmUgYmFzZWQgb24gd2hldGhlciB0aGUgdXNlclxuICAgICAgLy8gcmV0dXJuZWQgb3IgdGhyZXdcbiAgICAgIGlmIChpc1F1ZXJ5Um91dGVSZXNwb25zZShlKSkge1xuICAgICAgICBpZiAoZS50eXBlID09PSBSZXN1bHRUeXBlLmVycm9yKSB7XG4gICAgICAgICAgdGhyb3cgZS5yZXNwb25zZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZS5yZXNwb25zZTtcbiAgICAgIH1cbiAgICAgIC8vIFJlZGlyZWN0cyBhcmUgYWx3YXlzIHJldHVybmVkIHNpbmNlIHRoZXkgZG9uJ3QgcHJvcGFnYXRlIHRvIGNhdGNoXG4gICAgICAvLyBib3VuZGFyaWVzXG4gICAgICBpZiAoaXNSZWRpcmVjdFJlc3BvbnNlKGUpKSB7XG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfVxuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cbiAgYXN5bmMgZnVuY3Rpb24gc3VibWl0KHJlcXVlc3QsIG1hdGNoZXMsIGFjdGlvbk1hdGNoLCByZXF1ZXN0Q29udGV4dCwgaXNSb3V0ZVJlcXVlc3QpIHtcbiAgICBsZXQgcmVzdWx0O1xuICAgIGlmICghYWN0aW9uTWF0Y2gucm91dGUuYWN0aW9uICYmICFhY3Rpb25NYXRjaC5yb3V0ZS5sYXp5KSB7XG4gICAgICBsZXQgZXJyb3IgPSBnZXRJbnRlcm5hbFJvdXRlckVycm9yKDQwNSwge1xuICAgICAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxuICAgICAgICBwYXRobmFtZTogbmV3IFVSTChyZXF1ZXN0LnVybCkucGF0aG5hbWUsXG4gICAgICAgIHJvdXRlSWQ6IGFjdGlvbk1hdGNoLnJvdXRlLmlkXG4gICAgICB9KTtcbiAgICAgIGlmIChpc1JvdXRlUmVxdWVzdCkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgdHlwZTogUmVzdWx0VHlwZS5lcnJvcixcbiAgICAgICAgZXJyb3JcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IGNhbGxMb2FkZXJPckFjdGlvbihcImFjdGlvblwiLCByZXF1ZXN0LCBhY3Rpb25NYXRjaCwgbWF0Y2hlcywgbWFuaWZlc3QsIG1hcFJvdXRlUHJvcGVydGllcywgYmFzZW5hbWUsIHtcbiAgICAgICAgaXNTdGF0aWNSZXF1ZXN0OiB0cnVlLFxuICAgICAgICBpc1JvdXRlUmVxdWVzdCxcbiAgICAgICAgcmVxdWVzdENvbnRleHRcbiAgICAgIH0pO1xuICAgICAgaWYgKHJlcXVlc3Quc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgbGV0IG1ldGhvZCA9IGlzUm91dGVSZXF1ZXN0ID8gXCJxdWVyeVJvdXRlXCIgOiBcInF1ZXJ5XCI7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtZXRob2QgKyBcIigpIGNhbGwgYWJvcnRlZDogXCIgKyByZXF1ZXN0Lm1ldGhvZCArIFwiIFwiICsgcmVxdWVzdC51cmwpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNSZWRpcmVjdFJlc3VsdChyZXN1bHQpKSB7XG4gICAgICAvLyBVaGhoaCAtIHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiwgd2Ugc2hvdWxkIGFsd2F5cyB0aHJvdyB0aGVzZSBmcm9tXG4gICAgICAvLyBjYWxsTG9hZGVyT3JBY3Rpb24sIGJ1dCB0aGUgdHlwZSBuYXJyb3dpbmcgaGVyZSBrZWVwcyBUUyBoYXBweSBhbmQgd2VcbiAgICAgIC8vIGNhbiBnZXQgYmFjayBvbiB0aGUgXCJ0aHJvdyBhbGwgcmVkaXJlY3QgcmVzcG9uc2VzXCIgdHJhaW4gaGVyZSBzaG91bGRcbiAgICAgIC8vIHRoaXMgZXZlciBoYXBwZW4gOi9cbiAgICAgIHRocm93IG5ldyBSZXNwb25zZShudWxsLCB7XG4gICAgICAgIHN0YXR1czogcmVzdWx0LnN0YXR1cyxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIExvY2F0aW9uOiByZXN1bHQubG9jYXRpb25cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChpc0RlZmVycmVkUmVzdWx0KHJlc3VsdCkpIHtcbiAgICAgIGxldCBlcnJvciA9IGdldEludGVybmFsUm91dGVyRXJyb3IoNDAwLCB7XG4gICAgICAgIHR5cGU6IFwiZGVmZXItYWN0aW9uXCJcbiAgICAgIH0pO1xuICAgICAgaWYgKGlzUm91dGVSZXF1ZXN0KSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgcmVzdWx0ID0ge1xuICAgICAgICB0eXBlOiBSZXN1bHRUeXBlLmVycm9yLFxuICAgICAgICBlcnJvclxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKGlzUm91dGVSZXF1ZXN0KSB7XG4gICAgICAvLyBOb3RlOiBUaGlzIHNob3VsZCBvbmx5IGJlIG5vbi1SZXNwb25zZSB2YWx1ZXMgaWYgd2UgZ2V0IGhlcmUsIHNpbmNlXG4gICAgICAvLyBpc1JvdXRlUmVxdWVzdCBzaG91bGQgdGhyb3cgYW55IFJlc3BvbnNlIHJlY2VpdmVkIGluIGNhbGxMb2FkZXJPckFjdGlvblxuICAgICAgaWYgKGlzRXJyb3JSZXN1bHQocmVzdWx0KSkge1xuICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBtYXRjaGVzOiBbYWN0aW9uTWF0Y2hdLFxuICAgICAgICBsb2FkZXJEYXRhOiB7fSxcbiAgICAgICAgYWN0aW9uRGF0YToge1xuICAgICAgICAgIFthY3Rpb25NYXRjaC5yb3V0ZS5pZF06IHJlc3VsdC5kYXRhXG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yczogbnVsbCxcbiAgICAgICAgLy8gTm90ZTogc3RhdHVzQ29kZSArIGhlYWRlcnMgYXJlIHVudXNlZCBoZXJlIHNpbmNlIHF1ZXJ5Um91dGUgd2lsbFxuICAgICAgICAvLyByZXR1cm4gdGhlIHJhdyBSZXNwb25zZSBvciB2YWx1ZVxuICAgICAgICBzdGF0dXNDb2RlOiAyMDAsXG4gICAgICAgIGxvYWRlckhlYWRlcnM6IHt9LFxuICAgICAgICBhY3Rpb25IZWFkZXJzOiB7fSxcbiAgICAgICAgYWN0aXZlRGVmZXJyZWRzOiBudWxsXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAoaXNFcnJvclJlc3VsdChyZXN1bHQpKSB7XG4gICAgICAvLyBTdG9yZSBvZmYgdGhlIHBlbmRpbmcgZXJyb3IgLSB3ZSB1c2UgaXQgdG8gZGV0ZXJtaW5lIHdoaWNoIGxvYWRlcnNcbiAgICAgIC8vIHRvIGNhbGwgYW5kIHdpbGwgY29tbWl0IGl0IHdoZW4gd2UgY29tcGxldGUgdGhlIG5hdmlnYXRpb25cbiAgICAgIGxldCBib3VuZGFyeU1hdGNoID0gZmluZE5lYXJlc3RCb3VuZGFyeShtYXRjaGVzLCBhY3Rpb25NYXRjaC5yb3V0ZS5pZCk7XG4gICAgICBsZXQgY29udGV4dCA9IGF3YWl0IGxvYWRSb3V0ZURhdGEocmVxdWVzdCwgbWF0Y2hlcywgcmVxdWVzdENvbnRleHQsIHVuZGVmaW5lZCwge1xuICAgICAgICBbYm91bmRhcnlNYXRjaC5yb3V0ZS5pZF06IHJlc3VsdC5lcnJvclxuICAgICAgfSk7XG4gICAgICAvLyBhY3Rpb24gc3RhdHVzIGNvZGVzIHRha2UgcHJlY2VkZW5jZSBvdmVyIGxvYWRlciBzdGF0dXMgY29kZXNcbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgY29udGV4dCwge1xuICAgICAgICBzdGF0dXNDb2RlOiBpc1JvdXRlRXJyb3JSZXNwb25zZShyZXN1bHQuZXJyb3IpID8gcmVzdWx0LmVycm9yLnN0YXR1cyA6IDUwMCxcbiAgICAgICAgYWN0aW9uRGF0YTogbnVsbCxcbiAgICAgICAgYWN0aW9uSGVhZGVyczogX2V4dGVuZHMoe30sIHJlc3VsdC5oZWFkZXJzID8ge1xuICAgICAgICAgIFthY3Rpb25NYXRjaC5yb3V0ZS5pZF06IHJlc3VsdC5oZWFkZXJzXG4gICAgICAgIH0gOiB7fSlcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBDcmVhdGUgYSBHRVQgcmVxdWVzdCBmb3IgdGhlIGxvYWRlcnNcbiAgICBsZXQgbG9hZGVyUmVxdWVzdCA9IG5ldyBSZXF1ZXN0KHJlcXVlc3QudXJsLCB7XG4gICAgICBoZWFkZXJzOiByZXF1ZXN0LmhlYWRlcnMsXG4gICAgICByZWRpcmVjdDogcmVxdWVzdC5yZWRpcmVjdCxcbiAgICAgIHNpZ25hbDogcmVxdWVzdC5zaWduYWxcbiAgICB9KTtcbiAgICBsZXQgY29udGV4dCA9IGF3YWl0IGxvYWRSb3V0ZURhdGEobG9hZGVyUmVxdWVzdCwgbWF0Y2hlcywgcmVxdWVzdENvbnRleHQpO1xuICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgY29udGV4dCwgcmVzdWx0LnN0YXR1c0NvZGUgPyB7XG4gICAgICBzdGF0dXNDb2RlOiByZXN1bHQuc3RhdHVzQ29kZVxuICAgIH0gOiB7fSwge1xuICAgICAgYWN0aW9uRGF0YToge1xuICAgICAgICBbYWN0aW9uTWF0Y2gucm91dGUuaWRdOiByZXN1bHQuZGF0YVxuICAgICAgfSxcbiAgICAgIGFjdGlvbkhlYWRlcnM6IF9leHRlbmRzKHt9LCByZXN1bHQuaGVhZGVycyA/IHtcbiAgICAgICAgW2FjdGlvbk1hdGNoLnJvdXRlLmlkXTogcmVzdWx0LmhlYWRlcnNcbiAgICAgIH0gOiB7fSlcbiAgICB9KTtcbiAgfVxuICBhc3luYyBmdW5jdGlvbiBsb2FkUm91dGVEYXRhKHJlcXVlc3QsIG1hdGNoZXMsIHJlcXVlc3RDb250ZXh0LCByb3V0ZU1hdGNoLCBwZW5kaW5nQWN0aW9uRXJyb3IpIHtcbiAgICBsZXQgaXNSb3V0ZVJlcXVlc3QgPSByb3V0ZU1hdGNoICE9IG51bGw7XG4gICAgLy8gU2hvcnQgY2lyY3VpdCBpZiB3ZSBoYXZlIG5vIGxvYWRlcnMgdG8gcnVuIChxdWVyeVJvdXRlKCkpXG4gICAgaWYgKGlzUm91dGVSZXF1ZXN0ICYmICEocm91dGVNYXRjaCAhPSBudWxsICYmIHJvdXRlTWF0Y2gucm91dGUubG9hZGVyKSAmJiAhKHJvdXRlTWF0Y2ggIT0gbnVsbCAmJiByb3V0ZU1hdGNoLnJvdXRlLmxhenkpKSB7XG4gICAgICB0aHJvdyBnZXRJbnRlcm5hbFJvdXRlckVycm9yKDQwMCwge1xuICAgICAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxuICAgICAgICBwYXRobmFtZTogbmV3IFVSTChyZXF1ZXN0LnVybCkucGF0aG5hbWUsXG4gICAgICAgIHJvdXRlSWQ6IHJvdXRlTWF0Y2ggPT0gbnVsbCA/IHZvaWQgMCA6IHJvdXRlTWF0Y2gucm91dGUuaWRcbiAgICAgIH0pO1xuICAgIH1cbiAgICBsZXQgcmVxdWVzdE1hdGNoZXMgPSByb3V0ZU1hdGNoID8gW3JvdXRlTWF0Y2hdIDogZ2V0TG9hZGVyTWF0Y2hlc1VudGlsQm91bmRhcnkobWF0Y2hlcywgT2JqZWN0LmtleXMocGVuZGluZ0FjdGlvbkVycm9yIHx8IHt9KVswXSk7XG4gICAgbGV0IG1hdGNoZXNUb0xvYWQgPSByZXF1ZXN0TWF0Y2hlcy5maWx0ZXIobSA9PiBtLnJvdXRlLmxvYWRlciB8fCBtLnJvdXRlLmxhenkpO1xuICAgIC8vIFNob3J0IGNpcmN1aXQgaWYgd2UgaGF2ZSBubyBsb2FkZXJzIHRvIHJ1biAocXVlcnkoKSlcbiAgICBpZiAobWF0Y2hlc1RvTG9hZC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG1hdGNoZXMsXG4gICAgICAgIC8vIEFkZCBhIG51bGwgZm9yIGFsbCBtYXRjaGVkIHJvdXRlcyBmb3IgcHJvcGVyIHJldmFsaWRhdGlvbiBvbiB0aGUgY2xpZW50XG4gICAgICAgIGxvYWRlckRhdGE6IG1hdGNoZXMucmVkdWNlKChhY2MsIG0pID0+IE9iamVjdC5hc3NpZ24oYWNjLCB7XG4gICAgICAgICAgW20ucm91dGUuaWRdOiBudWxsXG4gICAgICAgIH0pLCB7fSksXG4gICAgICAgIGVycm9yczogcGVuZGluZ0FjdGlvbkVycm9yIHx8IG51bGwsXG4gICAgICAgIHN0YXR1c0NvZGU6IDIwMCxcbiAgICAgICAgbG9hZGVySGVhZGVyczoge30sXG4gICAgICAgIGFjdGl2ZURlZmVycmVkczogbnVsbFxuICAgICAgfTtcbiAgICB9XG4gICAgbGV0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChbLi4ubWF0Y2hlc1RvTG9hZC5tYXAobWF0Y2ggPT4gY2FsbExvYWRlck9yQWN0aW9uKFwibG9hZGVyXCIsIHJlcXVlc3QsIG1hdGNoLCBtYXRjaGVzLCBtYW5pZmVzdCwgbWFwUm91dGVQcm9wZXJ0aWVzLCBiYXNlbmFtZSwge1xuICAgICAgaXNTdGF0aWNSZXF1ZXN0OiB0cnVlLFxuICAgICAgaXNSb3V0ZVJlcXVlc3QsXG4gICAgICByZXF1ZXN0Q29udGV4dFxuICAgIH0pKV0pO1xuICAgIGlmIChyZXF1ZXN0LnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICBsZXQgbWV0aG9kID0gaXNSb3V0ZVJlcXVlc3QgPyBcInF1ZXJ5Um91dGVcIiA6IFwicXVlcnlcIjtcbiAgICAgIHRocm93IG5ldyBFcnJvcihtZXRob2QgKyBcIigpIGNhbGwgYWJvcnRlZDogXCIgKyByZXF1ZXN0Lm1ldGhvZCArIFwiIFwiICsgcmVxdWVzdC51cmwpO1xuICAgIH1cbiAgICAvLyBQcm9jZXNzIGFuZCBjb21taXQgb3V0cHV0IGZyb20gbG9hZGVyc1xuICAgIGxldCBhY3RpdmVEZWZlcnJlZHMgPSBuZXcgTWFwKCk7XG4gICAgbGV0IGNvbnRleHQgPSBwcm9jZXNzUm91dGVMb2FkZXJEYXRhKG1hdGNoZXMsIG1hdGNoZXNUb0xvYWQsIHJlc3VsdHMsIHBlbmRpbmdBY3Rpb25FcnJvciwgYWN0aXZlRGVmZXJyZWRzKTtcbiAgICAvLyBBZGQgYSBudWxsIGZvciBhbnkgbm9uLWxvYWRlciBtYXRjaGVzIGZvciBwcm9wZXIgcmV2YWxpZGF0aW9uIG9uIHRoZSBjbGllbnRcbiAgICBsZXQgZXhlY3V0ZWRMb2FkZXJzID0gbmV3IFNldChtYXRjaGVzVG9Mb2FkLm1hcChtYXRjaCA9PiBtYXRjaC5yb3V0ZS5pZCkpO1xuICAgIG1hdGNoZXMuZm9yRWFjaChtYXRjaCA9PiB7XG4gICAgICBpZiAoIWV4ZWN1dGVkTG9hZGVycy5oYXMobWF0Y2gucm91dGUuaWQpKSB7XG4gICAgICAgIGNvbnRleHQubG9hZGVyRGF0YVttYXRjaC5yb3V0ZS5pZF0gPSBudWxsO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgY29udGV4dCwge1xuICAgICAgbWF0Y2hlcyxcbiAgICAgIGFjdGl2ZURlZmVycmVkczogYWN0aXZlRGVmZXJyZWRzLnNpemUgPiAwID8gT2JqZWN0LmZyb21FbnRyaWVzKGFjdGl2ZURlZmVycmVkcy5lbnRyaWVzKCkpIDogbnVsbFxuICAgIH0pO1xuICB9XG4gIHJldHVybiB7XG4gICAgZGF0YVJvdXRlcyxcbiAgICBxdWVyeSxcbiAgICBxdWVyeVJvdXRlXG4gIH07XG59XG4vLyNlbmRyZWdpb25cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyNyZWdpb24gSGVscGVyc1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8qKlxuICogR2l2ZW4gYW4gZXhpc3RpbmcgU3RhdGljSGFuZGxlckNvbnRleHQgYW5kIGFuIGVycm9yIHRocm93biBhdCByZW5kZXIgdGltZSxcbiAqIHByb3ZpZGUgYW4gdXBkYXRlZCBTdGF0aWNIYW5kbGVyQ29udGV4dCBzdWl0YWJsZSBmb3IgYSBzZWNvbmQgU1NSIHJlbmRlclxuICovXG5mdW5jdGlvbiBnZXRTdGF0aWNDb250ZXh0RnJvbUVycm9yKHJvdXRlcywgY29udGV4dCwgZXJyb3IpIHtcbiAgbGV0IG5ld0NvbnRleHQgPSBfZXh0ZW5kcyh7fSwgY29udGV4dCwge1xuICAgIHN0YXR1c0NvZGU6IDUwMCxcbiAgICBlcnJvcnM6IHtcbiAgICAgIFtjb250ZXh0Ll9kZWVwZXN0UmVuZGVyZWRCb3VuZGFyeUlkIHx8IHJvdXRlc1swXS5pZF06IGVycm9yXG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIG5ld0NvbnRleHQ7XG59XG5mdW5jdGlvbiBpc1N1Ym1pc3Npb25OYXZpZ2F0aW9uKG9wdHMpIHtcbiAgcmV0dXJuIG9wdHMgIT0gbnVsbCAmJiAoXCJmb3JtRGF0YVwiIGluIG9wdHMgJiYgb3B0cy5mb3JtRGF0YSAhPSBudWxsIHx8IFwiYm9keVwiIGluIG9wdHMgJiYgb3B0cy5ib2R5ICE9PSB1bmRlZmluZWQpO1xufVxuZnVuY3Rpb24gbm9ybWFsaXplVG8obG9jYXRpb24sIG1hdGNoZXMsIGJhc2VuYW1lLCBwcmVwZW5kQmFzZW5hbWUsIHRvLCBmcm9tUm91dGVJZCwgcmVsYXRpdmUpIHtcbiAgbGV0IGNvbnRleHR1YWxNYXRjaGVzO1xuICBsZXQgYWN0aXZlUm91dGVNYXRjaDtcbiAgaWYgKGZyb21Sb3V0ZUlkKSB7XG4gICAgLy8gR3JhYiBtYXRjaGVzIHVwIHRvIHRoZSBjYWxsaW5nIHJvdXRlIHNvIG91ciByb3V0ZS1yZWxhdGl2ZSBsb2dpYyBpc1xuICAgIC8vIHJlbGF0aXZlIHRvIHRoZSBjb3JyZWN0IHNvdXJjZSByb3V0ZVxuICAgIGNvbnRleHR1YWxNYXRjaGVzID0gW107XG4gICAgZm9yIChsZXQgbWF0Y2ggb2YgbWF0Y2hlcykge1xuICAgICAgY29udGV4dHVhbE1hdGNoZXMucHVzaChtYXRjaCk7XG4gICAgICBpZiAobWF0Y2gucm91dGUuaWQgPT09IGZyb21Sb3V0ZUlkKSB7XG4gICAgICAgIGFjdGl2ZVJvdXRlTWF0Y2ggPSBtYXRjaDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNvbnRleHR1YWxNYXRjaGVzID0gbWF0Y2hlcztcbiAgICBhY3RpdmVSb3V0ZU1hdGNoID0gbWF0Y2hlc1ttYXRjaGVzLmxlbmd0aCAtIDFdO1xuICB9XG4gIC8vIFJlc29sdmUgdGhlIHJlbGF0aXZlIHBhdGhcbiAgbGV0IHBhdGggPSByZXNvbHZlVG8odG8gPyB0byA6IFwiLlwiLCBnZXRQYXRoQ29udHJpYnV0aW5nTWF0Y2hlcyhjb250ZXh0dWFsTWF0Y2hlcykubWFwKG0gPT4gbS5wYXRobmFtZUJhc2UpLCBzdHJpcEJhc2VuYW1lKGxvY2F0aW9uLnBhdGhuYW1lLCBiYXNlbmFtZSkgfHwgbG9jYXRpb24ucGF0aG5hbWUsIHJlbGF0aXZlID09PSBcInBhdGhcIik7XG4gIC8vIFdoZW4gYHRvYCBpcyBub3Qgc3BlY2lmaWVkIHdlIGluaGVyaXQgc2VhcmNoL2hhc2ggZnJvbSB0aGUgY3VycmVudFxuICAvLyBsb2NhdGlvbiwgdW5saWtlIHdoZW4gdG89XCIuXCIgYW5kIHdlIGp1c3QgaW5oZXJpdCB0aGUgcGF0aC5cbiAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9yZW1peC1ydW4vcmVtaXgvaXNzdWVzLzkyN1xuICBpZiAodG8gPT0gbnVsbCkge1xuICAgIHBhdGguc2VhcmNoID0gbG9jYXRpb24uc2VhcmNoO1xuICAgIHBhdGguaGFzaCA9IGxvY2F0aW9uLmhhc2g7XG4gIH1cbiAgLy8gQWRkIGFuID9pbmRleCBwYXJhbSBmb3IgbWF0Y2hlZCBpbmRleCByb3V0ZXMgaWYgd2UgZG9uJ3QgYWxyZWFkeSBoYXZlIG9uZVxuICBpZiAoKHRvID09IG51bGwgfHwgdG8gPT09IFwiXCIgfHwgdG8gPT09IFwiLlwiKSAmJiBhY3RpdmVSb3V0ZU1hdGNoICYmIGFjdGl2ZVJvdXRlTWF0Y2gucm91dGUuaW5kZXggJiYgIWhhc05ha2VkSW5kZXhRdWVyeShwYXRoLnNlYXJjaCkpIHtcbiAgICBwYXRoLnNlYXJjaCA9IHBhdGguc2VhcmNoID8gcGF0aC5zZWFyY2gucmVwbGFjZSgvXlxcPy8sIFwiP2luZGV4JlwiKSA6IFwiP2luZGV4XCI7XG4gIH1cbiAgLy8gSWYgd2UncmUgb3BlcmF0aW5nIHdpdGhpbiBhIGJhc2VuYW1lLCBwcmVwZW5kIGl0IHRvIHRoZSBwYXRobmFtZS4gIElmXG4gIC8vIHRoaXMgaXMgYSByb290IG5hdmlnYXRpb24sIHRoZW4ganVzdCB1c2UgdGhlIHJhdyBiYXNlbmFtZSB3aGljaCBhbGxvd3NcbiAgLy8gdGhlIGJhc2VuYW1lIHRvIGhhdmUgZnVsbCBjb250cm9sIG92ZXIgdGhlIHByZXNlbmNlIG9mIGEgdHJhaWxpbmcgc2xhc2hcbiAgLy8gb24gcm9vdCBhY3Rpb25zXG4gIGlmIChwcmVwZW5kQmFzZW5hbWUgJiYgYmFzZW5hbWUgIT09IFwiL1wiKSB7XG4gICAgcGF0aC5wYXRobmFtZSA9IHBhdGgucGF0aG5hbWUgPT09IFwiL1wiID8gYmFzZW5hbWUgOiBqb2luUGF0aHMoW2Jhc2VuYW1lLCBwYXRoLnBhdGhuYW1lXSk7XG4gIH1cbiAgcmV0dXJuIGNyZWF0ZVBhdGgocGF0aCk7XG59XG4vLyBOb3JtYWxpemUgbmF2aWdhdGlvbiBvcHRpb25zIGJ5IGNvbnZlcnRpbmcgZm9ybU1ldGhvZD1HRVQgZm9ybURhdGEgb2JqZWN0cyB0b1xuLy8gVVJMU2VhcmNoUGFyYW1zIHNvIHRoZXkgYmVoYXZlIGlkZW50aWNhbGx5IHRvIGxpbmtzIHdpdGggcXVlcnkgcGFyYW1zXG5mdW5jdGlvbiBub3JtYWxpemVOYXZpZ2F0ZU9wdGlvbnMobm9ybWFsaXplRm9ybU1ldGhvZCwgaXNGZXRjaGVyLCBwYXRoLCBvcHRzKSB7XG4gIC8vIFJldHVybiBsb2NhdGlvbiB2ZXJiYXRpbSBvbiBub24tc3VibWlzc2lvbiBuYXZpZ2F0aW9uc1xuICBpZiAoIW9wdHMgfHwgIWlzU3VibWlzc2lvbk5hdmlnYXRpb24ob3B0cykpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcGF0aFxuICAgIH07XG4gIH1cbiAgaWYgKG9wdHMuZm9ybU1ldGhvZCAmJiAhaXNWYWxpZE1ldGhvZChvcHRzLmZvcm1NZXRob2QpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhdGgsXG4gICAgICBlcnJvcjogZ2V0SW50ZXJuYWxSb3V0ZXJFcnJvcig0MDUsIHtcbiAgICAgICAgbWV0aG9kOiBvcHRzLmZvcm1NZXRob2RcbiAgICAgIH0pXG4gICAgfTtcbiAgfVxuICBsZXQgZ2V0SW52YWxpZEJvZHlFcnJvciA9ICgpID0+ICh7XG4gICAgcGF0aCxcbiAgICBlcnJvcjogZ2V0SW50ZXJuYWxSb3V0ZXJFcnJvcig0MDAsIHtcbiAgICAgIHR5cGU6IFwiaW52YWxpZC1ib2R5XCJcbiAgICB9KVxuICB9KTtcbiAgLy8gQ3JlYXRlIGEgU3VibWlzc2lvbiBvbiBub24tR0VUIG5hdmlnYXRpb25zXG4gIGxldCByYXdGb3JtTWV0aG9kID0gb3B0cy5mb3JtTWV0aG9kIHx8IFwiZ2V0XCI7XG4gIGxldCBmb3JtTWV0aG9kID0gbm9ybWFsaXplRm9ybU1ldGhvZCA/IHJhd0Zvcm1NZXRob2QudG9VcHBlckNhc2UoKSA6IHJhd0Zvcm1NZXRob2QudG9Mb3dlckNhc2UoKTtcbiAgbGV0IGZvcm1BY3Rpb24gPSBzdHJpcEhhc2hGcm9tUGF0aChwYXRoKTtcbiAgaWYgKG9wdHMuYm9keSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKG9wdHMuZm9ybUVuY1R5cGUgPT09IFwidGV4dC9wbGFpblwiKSB7XG4gICAgICAvLyB0ZXh0IG9ubHkgc3VwcG9ydCBQT1NUL1BVVC9QQVRDSC9ERUxFVEUgc3VibWlzc2lvbnNcbiAgICAgIGlmICghaXNNdXRhdGlvbk1ldGhvZChmb3JtTWV0aG9kKSkge1xuICAgICAgICByZXR1cm4gZ2V0SW52YWxpZEJvZHlFcnJvcigpO1xuICAgICAgfVxuICAgICAgbGV0IHRleHQgPSB0eXBlb2Ygb3B0cy5ib2R5ID09PSBcInN0cmluZ1wiID8gb3B0cy5ib2R5IDogb3B0cy5ib2R5IGluc3RhbmNlb2YgRm9ybURhdGEgfHwgb3B0cy5ib2R5IGluc3RhbmNlb2YgVVJMU2VhcmNoUGFyYW1zID9cbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2Zvcm0tY29udHJvbC1pbmZyYXN0cnVjdHVyZS5odG1sI3BsYWluLXRleHQtZm9ybS1kYXRhXG4gICAgICBBcnJheS5mcm9tKG9wdHMuYm9keS5lbnRyaWVzKCkpLnJlZHVjZSgoYWNjLCBfcmVmMykgPT4ge1xuICAgICAgICBsZXQgW25hbWUsIHZhbHVlXSA9IF9yZWYzO1xuICAgICAgICByZXR1cm4gXCJcIiArIGFjYyArIG5hbWUgKyBcIj1cIiArIHZhbHVlICsgXCJcXG5cIjtcbiAgICAgIH0sIFwiXCIpIDogU3RyaW5nKG9wdHMuYm9keSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwYXRoLFxuICAgICAgICBzdWJtaXNzaW9uOiB7XG4gICAgICAgICAgZm9ybU1ldGhvZCxcbiAgICAgICAgICBmb3JtQWN0aW9uLFxuICAgICAgICAgIGZvcm1FbmNUeXBlOiBvcHRzLmZvcm1FbmNUeXBlLFxuICAgICAgICAgIGZvcm1EYXRhOiB1bmRlZmluZWQsXG4gICAgICAgICAganNvbjogdW5kZWZpbmVkLFxuICAgICAgICAgIHRleHRcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKG9wdHMuZm9ybUVuY1R5cGUgPT09IFwiYXBwbGljYXRpb24vanNvblwiKSB7XG4gICAgICAvLyBqc29uIG9ubHkgc3VwcG9ydHMgUE9TVC9QVVQvUEFUQ0gvREVMRVRFIHN1Ym1pc3Npb25zXG4gICAgICBpZiAoIWlzTXV0YXRpb25NZXRob2QoZm9ybU1ldGhvZCkpIHtcbiAgICAgICAgcmV0dXJuIGdldEludmFsaWRCb2R5RXJyb3IoKTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGxldCBqc29uID0gdHlwZW9mIG9wdHMuYm9keSA9PT0gXCJzdHJpbmdcIiA/IEpTT04ucGFyc2Uob3B0cy5ib2R5KSA6IG9wdHMuYm9keTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBwYXRoLFxuICAgICAgICAgIHN1Ym1pc3Npb246IHtcbiAgICAgICAgICAgIGZvcm1NZXRob2QsXG4gICAgICAgICAgICBmb3JtQWN0aW9uLFxuICAgICAgICAgICAgZm9ybUVuY1R5cGU6IG9wdHMuZm9ybUVuY1R5cGUsXG4gICAgICAgICAgICBmb3JtRGF0YTogdW5kZWZpbmVkLFxuICAgICAgICAgICAganNvbixcbiAgICAgICAgICAgIHRleHQ6IHVuZGVmaW5lZFxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGdldEludmFsaWRCb2R5RXJyb3IoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaW52YXJpYW50KHR5cGVvZiBGb3JtRGF0YSA9PT0gXCJmdW5jdGlvblwiLCBcIkZvcm1EYXRhIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhpcyBlbnZpcm9ubWVudFwiKTtcbiAgbGV0IHNlYXJjaFBhcmFtcztcbiAgbGV0IGZvcm1EYXRhO1xuICBpZiAob3B0cy5mb3JtRGF0YSkge1xuICAgIHNlYXJjaFBhcmFtcyA9IGNvbnZlcnRGb3JtRGF0YVRvU2VhcmNoUGFyYW1zKG9wdHMuZm9ybURhdGEpO1xuICAgIGZvcm1EYXRhID0gb3B0cy5mb3JtRGF0YTtcbiAgfSBlbHNlIGlmIChvcHRzLmJvZHkgaW5zdGFuY2VvZiBGb3JtRGF0YSkge1xuICAgIHNlYXJjaFBhcmFtcyA9IGNvbnZlcnRGb3JtRGF0YVRvU2VhcmNoUGFyYW1zKG9wdHMuYm9keSk7XG4gICAgZm9ybURhdGEgPSBvcHRzLmJvZHk7XG4gIH0gZWxzZSBpZiAob3B0cy5ib2R5IGluc3RhbmNlb2YgVVJMU2VhcmNoUGFyYW1zKSB7XG4gICAgc2VhcmNoUGFyYW1zID0gb3B0cy5ib2R5O1xuICAgIGZvcm1EYXRhID0gY29udmVydFNlYXJjaFBhcmFtc1RvRm9ybURhdGEoc2VhcmNoUGFyYW1zKTtcbiAgfSBlbHNlIGlmIChvcHRzLmJvZHkgPT0gbnVsbCkge1xuICAgIHNlYXJjaFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgICBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICB9IGVsc2Uge1xuICAgIHRyeSB7XG4gICAgICBzZWFyY2hQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKG9wdHMuYm9keSk7XG4gICAgICBmb3JtRGF0YSA9IGNvbnZlcnRTZWFyY2hQYXJhbXNUb0Zvcm1EYXRhKHNlYXJjaFBhcmFtcyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGdldEludmFsaWRCb2R5RXJyb3IoKTtcbiAgICB9XG4gIH1cbiAgbGV0IHN1Ym1pc3Npb24gPSB7XG4gICAgZm9ybU1ldGhvZCxcbiAgICBmb3JtQWN0aW9uLFxuICAgIGZvcm1FbmNUeXBlOiBvcHRzICYmIG9wdHMuZm9ybUVuY1R5cGUgfHwgXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIixcbiAgICBmb3JtRGF0YSxcbiAgICBqc29uOiB1bmRlZmluZWQsXG4gICAgdGV4dDogdW5kZWZpbmVkXG4gIH07XG4gIGlmIChpc011dGF0aW9uTWV0aG9kKHN1Ym1pc3Npb24uZm9ybU1ldGhvZCkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcGF0aCxcbiAgICAgIHN1Ym1pc3Npb25cbiAgICB9O1xuICB9XG4gIC8vIEZsYXR0ZW4gc3VibWlzc2lvbiBvbnRvIFVSTFNlYXJjaFBhcmFtcyBmb3IgR0VUIHN1Ym1pc3Npb25zXG4gIGxldCBwYXJzZWRQYXRoID0gcGFyc2VQYXRoKHBhdGgpO1xuICAvLyBPbiBHRVQgbmF2aWdhdGlvbiBzdWJtaXNzaW9ucyB3ZSBjYW4gZHJvcCB0aGUgP2luZGV4IHBhcmFtIGZyb20gdGhlXG4gIC8vIHJlc3VsdGluZyBsb2NhdGlvbiBzaW5jZSBhbGwgbG9hZGVycyB3aWxsIHJ1bi4gIEJ1dCBmZXRjaGVyIEdFVCBzdWJtaXNzaW9uc1xuICAvLyBvbmx5IHJ1biBhIHNpbmdsZSBsb2FkZXIgc28gd2UgbmVlZCB0byBwcmVzZXJ2ZSBhbnkgaW5jb21pbmcgP2luZGV4IHBhcmFtc1xuICBpZiAoaXNGZXRjaGVyICYmIHBhcnNlZFBhdGguc2VhcmNoICYmIGhhc05ha2VkSW5kZXhRdWVyeShwYXJzZWRQYXRoLnNlYXJjaCkpIHtcbiAgICBzZWFyY2hQYXJhbXMuYXBwZW5kKFwiaW5kZXhcIiwgXCJcIik7XG4gIH1cbiAgcGFyc2VkUGF0aC5zZWFyY2ggPSBcIj9cIiArIHNlYXJjaFBhcmFtcztcbiAgcmV0dXJuIHtcbiAgICBwYXRoOiBjcmVhdGVQYXRoKHBhcnNlZFBhdGgpLFxuICAgIHN1Ym1pc3Npb25cbiAgfTtcbn1cbi8vIEZpbHRlciBvdXQgYWxsIHJvdXRlcyBiZWxvdyBhbnkgY2F1Z2h0IGVycm9yIGFzIHRoZXkgYXJlbid0IGdvaW5nIHRvXG4vLyByZW5kZXIgc28gd2UgZG9uJ3QgbmVlZCB0byBsb2FkIHRoZW1cbmZ1bmN0aW9uIGdldExvYWRlck1hdGNoZXNVbnRpbEJvdW5kYXJ5KG1hdGNoZXMsIGJvdW5kYXJ5SWQpIHtcbiAgbGV0IGJvdW5kYXJ5TWF0Y2hlcyA9IG1hdGNoZXM7XG4gIGlmIChib3VuZGFyeUlkKSB7XG4gICAgbGV0IGluZGV4ID0gbWF0Y2hlcy5maW5kSW5kZXgobSA9PiBtLnJvdXRlLmlkID09PSBib3VuZGFyeUlkKTtcbiAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgYm91bmRhcnlNYXRjaGVzID0gbWF0Y2hlcy5zbGljZSgwLCBpbmRleCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBib3VuZGFyeU1hdGNoZXM7XG59XG5mdW5jdGlvbiBnZXRNYXRjaGVzVG9Mb2FkKGhpc3RvcnksIHN0YXRlLCBtYXRjaGVzLCBzdWJtaXNzaW9uLCBsb2NhdGlvbiwgaXNSZXZhbGlkYXRpb25SZXF1aXJlZCwgY2FuY2VsbGVkRGVmZXJyZWRSb3V0ZXMsIGNhbmNlbGxlZEZldGNoZXJMb2FkcywgZGVsZXRlZEZldGNoZXJzLCBmZXRjaExvYWRNYXRjaGVzLCBmZXRjaFJlZGlyZWN0SWRzLCByb3V0ZXNUb1VzZSwgYmFzZW5hbWUsIHBlbmRpbmdBY3Rpb25EYXRhLCBwZW5kaW5nRXJyb3IpIHtcbiAgbGV0IGFjdGlvblJlc3VsdCA9IHBlbmRpbmdFcnJvciA/IE9iamVjdC52YWx1ZXMocGVuZGluZ0Vycm9yKVswXSA6IHBlbmRpbmdBY3Rpb25EYXRhID8gT2JqZWN0LnZhbHVlcyhwZW5kaW5nQWN0aW9uRGF0YSlbMF0gOiB1bmRlZmluZWQ7XG4gIGxldCBjdXJyZW50VXJsID0gaGlzdG9yeS5jcmVhdGVVUkwoc3RhdGUubG9jYXRpb24pO1xuICBsZXQgbmV4dFVybCA9IGhpc3RvcnkuY3JlYXRlVVJMKGxvY2F0aW9uKTtcbiAgLy8gUGljayBuYXZpZ2F0aW9uIG1hdGNoZXMgdGhhdCBhcmUgbmV0LW5ldyBvciBxdWFsaWZ5IGZvciByZXZhbGlkYXRpb25cbiAgbGV0IGJvdW5kYXJ5SWQgPSBwZW5kaW5nRXJyb3IgPyBPYmplY3Qua2V5cyhwZW5kaW5nRXJyb3IpWzBdIDogdW5kZWZpbmVkO1xuICBsZXQgYm91bmRhcnlNYXRjaGVzID0gZ2V0TG9hZGVyTWF0Y2hlc1VudGlsQm91bmRhcnkobWF0Y2hlcywgYm91bmRhcnlJZCk7XG4gIGxldCBuYXZpZ2F0aW9uTWF0Y2hlcyA9IGJvdW5kYXJ5TWF0Y2hlcy5maWx0ZXIoKG1hdGNoLCBpbmRleCkgPT4ge1xuICAgIGlmIChtYXRjaC5yb3V0ZS5sYXp5KSB7XG4gICAgICAvLyBXZSBoYXZlbid0IGxvYWRlZCB0aGlzIHJvdXRlIHlldCBzbyB3ZSBkb24ndCBrbm93IGlmIGl0J3MgZ290IGEgbG9hZGVyIVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChtYXRjaC5yb3V0ZS5sb2FkZXIgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvLyBBbHdheXMgY2FsbCB0aGUgbG9hZGVyIG9uIG5ldyByb3V0ZSBpbnN0YW5jZXMgYW5kIHBlbmRpbmcgZGVmZXIgY2FuY2VsbGF0aW9uc1xuICAgIGlmIChpc05ld0xvYWRlcihzdGF0ZS5sb2FkZXJEYXRhLCBzdGF0ZS5tYXRjaGVzW2luZGV4XSwgbWF0Y2gpIHx8IGNhbmNlbGxlZERlZmVycmVkUm91dGVzLnNvbWUoaWQgPT4gaWQgPT09IG1hdGNoLnJvdXRlLmlkKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8vIFRoaXMgaXMgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZm9yIHdoZW4gd2UgcmV2YWxpZGF0ZS4gIElmIHRoZSByb3V0ZVxuICAgIC8vIHByb3ZpZGVzIGl0J3Mgb3duIGltcGxlbWVudGF0aW9uLCB0aGVuIHdlIGdpdmUgdGhlbSBmdWxsIGNvbnRyb2wgYnV0XG4gICAgLy8gcHJvdmlkZSB0aGlzIHZhbHVlIHNvIHRoZXkgY2FuIGxldmVyYWdlIGl0IGlmIG5lZWRlZCBhZnRlciB0aGV5IGNoZWNrXG4gICAgLy8gdGhlaXIgb3duIHNwZWNpZmljIHVzZSBjYXNlc1xuICAgIGxldCBjdXJyZW50Um91dGVNYXRjaCA9IHN0YXRlLm1hdGNoZXNbaW5kZXhdO1xuICAgIGxldCBuZXh0Um91dGVNYXRjaCA9IG1hdGNoO1xuICAgIHJldHVybiBzaG91bGRSZXZhbGlkYXRlTG9hZGVyKG1hdGNoLCBfZXh0ZW5kcyh7XG4gICAgICBjdXJyZW50VXJsLFxuICAgICAgY3VycmVudFBhcmFtczogY3VycmVudFJvdXRlTWF0Y2gucGFyYW1zLFxuICAgICAgbmV4dFVybCxcbiAgICAgIG5leHRQYXJhbXM6IG5leHRSb3V0ZU1hdGNoLnBhcmFtc1xuICAgIH0sIHN1Ym1pc3Npb24sIHtcbiAgICAgIGFjdGlvblJlc3VsdCxcbiAgICAgIGRlZmF1bHRTaG91bGRSZXZhbGlkYXRlOlxuICAgICAgLy8gRm9yY2VkIHJldmFsaWRhdGlvbiBkdWUgdG8gc3VibWlzc2lvbiwgdXNlUmV2YWxpZGF0b3IsIG9yIFgtUmVtaXgtUmV2YWxpZGF0ZVxuICAgICAgaXNSZXZhbGlkYXRpb25SZXF1aXJlZCB8fFxuICAgICAgLy8gQ2xpY2tlZCB0aGUgc2FtZSBsaW5rLCByZXN1Ym1pdHRlZCBhIEdFVCBmb3JtXG4gICAgICBjdXJyZW50VXJsLnBhdGhuYW1lICsgY3VycmVudFVybC5zZWFyY2ggPT09IG5leHRVcmwucGF0aG5hbWUgKyBuZXh0VXJsLnNlYXJjaCB8fFxuICAgICAgLy8gU2VhcmNoIHBhcmFtcyBhZmZlY3QgYWxsIGxvYWRlcnNcbiAgICAgIGN1cnJlbnRVcmwuc2VhcmNoICE9PSBuZXh0VXJsLnNlYXJjaCB8fCBpc05ld1JvdXRlSW5zdGFuY2UoY3VycmVudFJvdXRlTWF0Y2gsIG5leHRSb3V0ZU1hdGNoKVxuICAgIH0pKTtcbiAgfSk7XG4gIC8vIFBpY2sgZmV0Y2hlci5sb2FkcyB0aGF0IG5lZWQgdG8gYmUgcmV2YWxpZGF0ZWRcbiAgbGV0IHJldmFsaWRhdGluZ0ZldGNoZXJzID0gW107XG4gIGZldGNoTG9hZE1hdGNoZXMuZm9yRWFjaCgoZiwga2V5KSA9PiB7XG4gICAgLy8gRG9uJ3QgcmV2YWxpZGF0ZSBpZiBmZXRjaGVyIHdvbid0IGJlIHByZXNlbnQgaW4gdGhlIHN1YnNlcXVlbnQgcmVuZGVyXG4gICAgaWYgKCFtYXRjaGVzLnNvbWUobSA9PiBtLnJvdXRlLmlkID09PSBmLnJvdXRlSWQpIHx8IGRlbGV0ZWRGZXRjaGVycy5oYXMoa2V5KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgZmV0Y2hlck1hdGNoZXMgPSBtYXRjaFJvdXRlcyhyb3V0ZXNUb1VzZSwgZi5wYXRoLCBiYXNlbmFtZSk7XG4gICAgLy8gSWYgdGhlIGZldGNoZXIgcGF0aCBubyBsb25nZXIgbWF0Y2hlcywgcHVzaCBpdCBpbiB3aXRoIG51bGwgbWF0Y2hlcyBzb1xuICAgIC8vIHdlIGNhbiB0cmlnZ2VyIGEgNDA0IGluIGNhbGxMb2FkZXJzQW5kTWF5YmVSZXNvbHZlRGF0YS4gIE5vdGUgdGhpcyBpc1xuICAgIC8vIGN1cnJlbnRseSBvbmx5IGEgdXNlLWNhc2UgZm9yIFJlbWl4IEhNUiB3aGVyZSB0aGUgcm91dGUgdHJlZSBjYW4gY2hhbmdlXG4gICAgLy8gYXQgcnVudGltZSBhbmQgcmVtb3ZlIGEgcm91dGUgcHJldmlvdXNseSBsb2FkZWQgdmlhIGEgZmV0Y2hlclxuICAgIGlmICghZmV0Y2hlck1hdGNoZXMpIHtcbiAgICAgIHJldmFsaWRhdGluZ0ZldGNoZXJzLnB1c2goe1xuICAgICAgICBrZXksXG4gICAgICAgIHJvdXRlSWQ6IGYucm91dGVJZCxcbiAgICAgICAgcGF0aDogZi5wYXRoLFxuICAgICAgICBtYXRjaGVzOiBudWxsLFxuICAgICAgICBtYXRjaDogbnVsbCxcbiAgICAgICAgY29udHJvbGxlcjogbnVsbFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFJldmFsaWRhdGluZyBmZXRjaGVycyBhcmUgZGVjb3VwbGVkIGZyb20gdGhlIHJvdXRlIG1hdGNoZXMgc2luY2UgdGhleVxuICAgIC8vIGxvYWQgZnJvbSBhIHN0YXRpYyBocmVmLiAgVGhleSByZXZhbGlkYXRlIGJhc2VkIG9uIGV4cGxpY2l0IHJldmFsaWRhdGlvblxuICAgIC8vIChzdWJtaXNzaW9uLCB1c2VSZXZhbGlkYXRvciwgb3IgWC1SZW1peC1SZXZhbGlkYXRlKVxuICAgIGxldCBmZXRjaGVyID0gc3RhdGUuZmV0Y2hlcnMuZ2V0KGtleSk7XG4gICAgbGV0IGZldGNoZXJNYXRjaCA9IGdldFRhcmdldE1hdGNoKGZldGNoZXJNYXRjaGVzLCBmLnBhdGgpO1xuICAgIGxldCBzaG91bGRSZXZhbGlkYXRlID0gZmFsc2U7XG4gICAgaWYgKGZldGNoUmVkaXJlY3RJZHMuaGFzKGtleSkpIHtcbiAgICAgIC8vIE5ldmVyIHRyaWdnZXIgYSByZXZhbGlkYXRpb24gb2YgYW4gYWN0aXZlbHkgcmVkaXJlY3RpbmcgZmV0Y2hlclxuICAgICAgc2hvdWxkUmV2YWxpZGF0ZSA9IGZhbHNlO1xuICAgIH0gZWxzZSBpZiAoY2FuY2VsbGVkRmV0Y2hlckxvYWRzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgIC8vIEFsd2F5cyByZXZhbGlkYXRlIGlmIHRoZSBmZXRjaGVyIHdhcyBjYW5jZWxsZWRcbiAgICAgIHNob3VsZFJldmFsaWRhdGUgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAoZmV0Y2hlciAmJiBmZXRjaGVyLnN0YXRlICE9PSBcImlkbGVcIiAmJiBmZXRjaGVyLmRhdGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gSWYgdGhlIGZldGNoZXIgaGFzbid0IGV2ZXIgY29tcGxldGVkIGxvYWRpbmcgeWV0LCB0aGVuIHRoaXMgaXNuJ3QgYVxuICAgICAgLy8gcmV2YWxpZGF0aW9uLCBpdCB3b3VsZCBqdXN0IGJlIGEgYnJhbmQgbmV3IGxvYWQgaWYgYW4gZXhwbGljaXRcbiAgICAgIC8vIHJldmFsaWRhdGlvbiBpcyByZXF1aXJlZFxuICAgICAgc2hvdWxkUmV2YWxpZGF0ZSA9IGlzUmV2YWxpZGF0aW9uUmVxdWlyZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE90aGVyd2lzZSBmYWxsIGJhY2sgb24gYW55IHVzZXItZGVmaW5lZCBzaG91bGRSZXZhbGlkYXRlLCBkZWZhdWx0aW5nXG4gICAgICAvLyB0byBleHBsaWNpdCByZXZhbGlkYXRpb25zIG9ubHlcbiAgICAgIHNob3VsZFJldmFsaWRhdGUgPSBzaG91bGRSZXZhbGlkYXRlTG9hZGVyKGZldGNoZXJNYXRjaCwgX2V4dGVuZHMoe1xuICAgICAgICBjdXJyZW50VXJsLFxuICAgICAgICBjdXJyZW50UGFyYW1zOiBzdGF0ZS5tYXRjaGVzW3N0YXRlLm1hdGNoZXMubGVuZ3RoIC0gMV0ucGFyYW1zLFxuICAgICAgICBuZXh0VXJsLFxuICAgICAgICBuZXh0UGFyYW1zOiBtYXRjaGVzW21hdGNoZXMubGVuZ3RoIC0gMV0ucGFyYW1zXG4gICAgICB9LCBzdWJtaXNzaW9uLCB7XG4gICAgICAgIGFjdGlvblJlc3VsdCxcbiAgICAgICAgZGVmYXVsdFNob3VsZFJldmFsaWRhdGU6IGlzUmV2YWxpZGF0aW9uUmVxdWlyZWRcbiAgICAgIH0pKTtcbiAgICB9XG4gICAgaWYgKHNob3VsZFJldmFsaWRhdGUpIHtcbiAgICAgIHJldmFsaWRhdGluZ0ZldGNoZXJzLnB1c2goe1xuICAgICAgICBrZXksXG4gICAgICAgIHJvdXRlSWQ6IGYucm91dGVJZCxcbiAgICAgICAgcGF0aDogZi5wYXRoLFxuICAgICAgICBtYXRjaGVzOiBmZXRjaGVyTWF0Y2hlcyxcbiAgICAgICAgbWF0Y2g6IGZldGNoZXJNYXRjaCxcbiAgICAgICAgY29udHJvbGxlcjogbmV3IEFib3J0Q29udHJvbGxlcigpXG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gW25hdmlnYXRpb25NYXRjaGVzLCByZXZhbGlkYXRpbmdGZXRjaGVyc107XG59XG5mdW5jdGlvbiBpc05ld0xvYWRlcihjdXJyZW50TG9hZGVyRGF0YSwgY3VycmVudE1hdGNoLCBtYXRjaCkge1xuICBsZXQgaXNOZXcgPVxuICAvLyBbYV0gLT4gW2EsIGJdXG4gICFjdXJyZW50TWF0Y2ggfHxcbiAgLy8gW2EsIGJdIC0+IFthLCBjXVxuICBtYXRjaC5yb3V0ZS5pZCAhPT0gY3VycmVudE1hdGNoLnJvdXRlLmlkO1xuICAvLyBIYW5kbGUgdGhlIGNhc2UgdGhhdCB3ZSBkb24ndCBoYXZlIGRhdGEgZm9yIGEgcmUtdXNlZCByb3V0ZSwgcG90ZW50aWFsbHlcbiAgLy8gZnJvbSBhIHByaW9yIGVycm9yIG9yIGZyb20gYSBjYW5jZWxsZWQgcGVuZGluZyBkZWZlcnJlZFxuICBsZXQgaXNNaXNzaW5nRGF0YSA9IGN1cnJlbnRMb2FkZXJEYXRhW21hdGNoLnJvdXRlLmlkXSA9PT0gdW5kZWZpbmVkO1xuICAvLyBBbHdheXMgbG9hZCBpZiB0aGlzIGlzIGEgbmV0LW5ldyByb3V0ZSBvciB3ZSBkb24ndCB5ZXQgaGF2ZSBkYXRhXG4gIHJldHVybiBpc05ldyB8fCBpc01pc3NpbmdEYXRhO1xufVxuZnVuY3Rpb24gaXNOZXdSb3V0ZUluc3RhbmNlKGN1cnJlbnRNYXRjaCwgbWF0Y2gpIHtcbiAgbGV0IGN1cnJlbnRQYXRoID0gY3VycmVudE1hdGNoLnJvdXRlLnBhdGg7XG4gIHJldHVybiAoXG4gICAgLy8gcGFyYW0gY2hhbmdlIGZvciB0aGlzIG1hdGNoLCAvdXNlcnMvMTIzIC0+IC91c2Vycy80NTZcbiAgICBjdXJyZW50TWF0Y2gucGF0aG5hbWUgIT09IG1hdGNoLnBhdGhuYW1lIHx8XG4gICAgLy8gc3BsYXQgcGFyYW0gY2hhbmdlZCwgd2hpY2ggaXMgbm90IHByZXNlbnQgaW4gbWF0Y2gucGF0aFxuICAgIC8vIGUuZy4gL2ZpbGVzL2ltYWdlcy9hdmF0YXIuanBnIC0+IGZpbGVzL2ZpbmFuY2VzLnhsc1xuICAgIGN1cnJlbnRQYXRoICE9IG51bGwgJiYgY3VycmVudFBhdGguZW5kc1dpdGgoXCIqXCIpICYmIGN1cnJlbnRNYXRjaC5wYXJhbXNbXCIqXCJdICE9PSBtYXRjaC5wYXJhbXNbXCIqXCJdXG4gICk7XG59XG5mdW5jdGlvbiBzaG91bGRSZXZhbGlkYXRlTG9hZGVyKGxvYWRlck1hdGNoLCBhcmcpIHtcbiAgaWYgKGxvYWRlck1hdGNoLnJvdXRlLnNob3VsZFJldmFsaWRhdGUpIHtcbiAgICBsZXQgcm91dGVDaG9pY2UgPSBsb2FkZXJNYXRjaC5yb3V0ZS5zaG91bGRSZXZhbGlkYXRlKGFyZyk7XG4gICAgaWYgKHR5cGVvZiByb3V0ZUNob2ljZSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgIHJldHVybiByb3V0ZUNob2ljZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGFyZy5kZWZhdWx0U2hvdWxkUmV2YWxpZGF0ZTtcbn1cbi8qKlxuICogRXhlY3V0ZSByb3V0ZS5sYXp5KCkgbWV0aG9kcyB0byBsYXppbHkgbG9hZCByb3V0ZSBtb2R1bGVzIChsb2FkZXIsIGFjdGlvbixcbiAqIHNob3VsZFJldmFsaWRhdGUpIGFuZCB1cGRhdGUgdGhlIHJvdXRlTWFuaWZlc3QgaW4gcGxhY2Ugd2hpY2ggc2hhcmVzIG9iamVjdHNcbiAqIHdpdGggZGF0YVJvdXRlcyBzbyB0aG9zZSBnZXQgdXBkYXRlZCBhcyB3ZWxsLlxuICovXG5hc3luYyBmdW5jdGlvbiBsb2FkTGF6eVJvdXRlTW9kdWxlKHJvdXRlLCBtYXBSb3V0ZVByb3BlcnRpZXMsIG1hbmlmZXN0KSB7XG4gIGlmICghcm91dGUubGF6eSkge1xuICAgIHJldHVybjtcbiAgfVxuICBsZXQgbGF6eVJvdXRlID0gYXdhaXQgcm91dGUubGF6eSgpO1xuICAvLyBJZiB0aGUgbGF6eSByb3V0ZSBmdW5jdGlvbiB3YXMgZXhlY3V0ZWQgYW5kIHJlbW92ZWQgYnkgYW5vdGhlciBwYXJhbGxlbFxuICAvLyBjYWxsIHRoZW4gd2UgY2FuIHJldHVybiAtIGZpcnN0IGxhenkoKSB0byBmaW5pc2ggd2lucyBiZWNhdXNlIHRoZSByZXR1cm5cbiAgLy8gdmFsdWUgb2YgbGF6eSBpcyBleHBlY3RlZCB0byBiZSBzdGF0aWNcbiAgaWYgKCFyb3V0ZS5sYXp5KSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxldCByb3V0ZVRvVXBkYXRlID0gbWFuaWZlc3Rbcm91dGUuaWRdO1xuICBpbnZhcmlhbnQocm91dGVUb1VwZGF0ZSwgXCJObyByb3V0ZSBmb3VuZCBpbiBtYW5pZmVzdFwiKTtcbiAgLy8gVXBkYXRlIHRoZSByb3V0ZSBpbiBwbGFjZS4gIFRoaXMgc2hvdWxkIGJlIHNhZmUgYmVjYXVzZSB0aGVyZSdzIG5vIHdheVxuICAvLyB3ZSBjb3VsZCB5ZXQgYmUgc2l0dGluZyBvbiB0aGlzIHJvdXRlIGFzIHdlIGNhbid0IGdldCB0aGVyZSB3aXRob3V0XG4gIC8vIHJlc29sdmluZyBsYXp5KCkgZmlyc3QuXG4gIC8vXG4gIC8vIFRoaXMgaXMgZGlmZmVyZW50IHRoYW4gdGhlIEhNUiBcInVwZGF0ZVwiIHVzZS1jYXNlIHdoZXJlIHdlIG1heSBhY3RpdmVseSBiZVxuICAvLyBvbiB0aGUgcm91dGUgYmVpbmcgdXBkYXRlZC4gIFRoZSBtYWluIGNvbmNlcm4gYm9pbHMgZG93biB0byBcImRvZXMgdGhpc1xuICAvLyBtdXRhdGlvbiBhZmZlY3QgYW55IG9uZ29pbmcgbmF2aWdhdGlvbnMgb3IgYW55IGN1cnJlbnQgc3RhdGUubWF0Y2hlc1xuICAvLyB2YWx1ZXM/XCIuICBJZiBub3QsIGl0IHNob3VsZCBiZSBzYWZlIHRvIHVwZGF0ZSBpbiBwbGFjZS5cbiAgbGV0IHJvdXRlVXBkYXRlcyA9IHt9O1xuICBmb3IgKGxldCBsYXp5Um91dGVQcm9wZXJ0eSBpbiBsYXp5Um91dGUpIHtcbiAgICBsZXQgc3RhdGljUm91dGVWYWx1ZSA9IHJvdXRlVG9VcGRhdGVbbGF6eVJvdXRlUHJvcGVydHldO1xuICAgIGxldCBpc1Byb3BlcnR5U3RhdGljYWxseURlZmluZWQgPSBzdGF0aWNSb3V0ZVZhbHVlICE9PSB1bmRlZmluZWQgJiZcbiAgICAvLyBUaGlzIHByb3BlcnR5IGlzbid0IHN0YXRpYyBzaW5jZSBpdCBzaG91bGQgYWx3YXlzIGJlIHVwZGF0ZWQgYmFzZWRcbiAgICAvLyBvbiB0aGUgcm91dGUgdXBkYXRlc1xuICAgIGxhenlSb3V0ZVByb3BlcnR5ICE9PSBcImhhc0Vycm9yQm91bmRhcnlcIjtcbiAgICB3YXJuaW5nKCFpc1Byb3BlcnR5U3RhdGljYWxseURlZmluZWQsIFwiUm91dGUgXFxcIlwiICsgcm91dGVUb1VwZGF0ZS5pZCArIFwiXFxcIiBoYXMgYSBzdGF0aWMgcHJvcGVydHkgXFxcIlwiICsgbGF6eVJvdXRlUHJvcGVydHkgKyBcIlxcXCIgXCIgKyBcImRlZmluZWQgYnV0IGl0cyBsYXp5IGZ1bmN0aW9uIGlzIGFsc28gcmV0dXJuaW5nIGEgdmFsdWUgZm9yIHRoaXMgcHJvcGVydHkuIFwiICsgKFwiVGhlIGxhenkgcm91dGUgcHJvcGVydHkgXFxcIlwiICsgbGF6eVJvdXRlUHJvcGVydHkgKyBcIlxcXCIgd2lsbCBiZSBpZ25vcmVkLlwiKSk7XG4gICAgaWYgKCFpc1Byb3BlcnR5U3RhdGljYWxseURlZmluZWQgJiYgIWltbXV0YWJsZVJvdXRlS2V5cy5oYXMobGF6eVJvdXRlUHJvcGVydHkpKSB7XG4gICAgICByb3V0ZVVwZGF0ZXNbbGF6eVJvdXRlUHJvcGVydHldID0gbGF6eVJvdXRlW2xhenlSb3V0ZVByb3BlcnR5XTtcbiAgICB9XG4gIH1cbiAgLy8gTXV0YXRlIHRoZSByb3V0ZSB3aXRoIHRoZSBwcm92aWRlZCB1cGRhdGVzLiAgRG8gdGhpcyBmaXJzdCBzbyB3ZSBwYXNzXG4gIC8vIHRoZSB1cGRhdGVkIHZlcnNpb24gdG8gbWFwUm91dGVQcm9wZXJ0aWVzXG4gIE9iamVjdC5hc3NpZ24ocm91dGVUb1VwZGF0ZSwgcm91dGVVcGRhdGVzKTtcbiAgLy8gTXV0YXRlIHRoZSBgaGFzRXJyb3JCb3VuZGFyeWAgcHJvcGVydHkgb24gdGhlIHJvdXRlIGJhc2VkIG9uIHRoZSByb3V0ZVxuICAvLyB1cGRhdGVzIGFuZCByZW1vdmUgdGhlIGBsYXp5YCBmdW5jdGlvbiBzbyB3ZSBkb24ndCByZXNvbHZlIHRoZSBsYXp5XG4gIC8vIHJvdXRlIGFnYWluLlxuICBPYmplY3QuYXNzaWduKHJvdXRlVG9VcGRhdGUsIF9leHRlbmRzKHt9LCBtYXBSb3V0ZVByb3BlcnRpZXMocm91dGVUb1VwZGF0ZSksIHtcbiAgICBsYXp5OiB1bmRlZmluZWRcbiAgfSkpO1xufVxuYXN5bmMgZnVuY3Rpb24gY2FsbExvYWRlck9yQWN0aW9uKHR5cGUsIHJlcXVlc3QsIG1hdGNoLCBtYXRjaGVzLCBtYW5pZmVzdCwgbWFwUm91dGVQcm9wZXJ0aWVzLCBiYXNlbmFtZSwgb3B0cykge1xuICBpZiAob3B0cyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0cyA9IHt9O1xuICB9XG4gIGxldCByZXN1bHRUeXBlO1xuICBsZXQgcmVzdWx0O1xuICBsZXQgb25SZWplY3Q7XG4gIGxldCBydW5IYW5kbGVyID0gaGFuZGxlciA9PiB7XG4gICAgLy8gU2V0dXAgYSBwcm9taXNlIHdlIGNhbiByYWNlIGFnYWluc3Qgc28gdGhhdCBhYm9ydCBzaWduYWxzIHNob3J0IGNpcmN1aXRcbiAgICBsZXQgcmVqZWN0O1xuICAgIGxldCBhYm9ydFByb21pc2UgPSBuZXcgUHJvbWlzZSgoXywgcikgPT4gcmVqZWN0ID0gcik7XG4gICAgb25SZWplY3QgPSAoKSA9PiByZWplY3QoKTtcbiAgICByZXF1ZXN0LnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgb25SZWplY3QpO1xuICAgIHJldHVybiBQcm9taXNlLnJhY2UoW2hhbmRsZXIoe1xuICAgICAgcmVxdWVzdCxcbiAgICAgIHBhcmFtczogbWF0Y2gucGFyYW1zLFxuICAgICAgY29udGV4dDogb3B0cy5yZXF1ZXN0Q29udGV4dFxuICAgIH0pLCBhYm9ydFByb21pc2VdKTtcbiAgfTtcbiAgdHJ5IHtcbiAgICBsZXQgaGFuZGxlciA9IG1hdGNoLnJvdXRlW3R5cGVdO1xuICAgIGlmIChtYXRjaC5yb3V0ZS5sYXp5KSB7XG4gICAgICBpZiAoaGFuZGxlcikge1xuICAgICAgICAvLyBSdW4gc3RhdGljYWxseSBkZWZpbmVkIGhhbmRsZXIgaW4gcGFyYWxsZWwgd2l0aCBsYXp5KClcbiAgICAgICAgbGV0IGhhbmRsZXJFcnJvcjtcbiAgICAgICAgbGV0IHZhbHVlcyA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgLy8gSWYgdGhlIGhhbmRsZXIgdGhyb3dzLCBkb24ndCBsZXQgaXQgaW1tZWRpYXRlbHkgYnViYmxlIG91dCxcbiAgICAgICAgLy8gc2luY2Ugd2UgbmVlZCB0byBsZXQgdGhlIGxhenkoKSBleGVjdXRpb24gZmluaXNoIHNvIHdlIGtub3cgaWYgdGhpc1xuICAgICAgICAvLyByb3V0ZSBoYXMgYSBib3VuZGFyeSB0aGF0IGNhbiBoYW5kbGUgdGhlIGVycm9yXG4gICAgICAgIHJ1bkhhbmRsZXIoaGFuZGxlcikuY2F0Y2goZSA9PiB7XG4gICAgICAgICAgaGFuZGxlckVycm9yID0gZTtcbiAgICAgICAgfSksIGxvYWRMYXp5Um91dGVNb2R1bGUobWF0Y2gucm91dGUsIG1hcFJvdXRlUHJvcGVydGllcywgbWFuaWZlc3QpXSk7XG4gICAgICAgIGlmIChoYW5kbGVyRXJyb3IpIHtcbiAgICAgICAgICB0aHJvdyBoYW5kbGVyRXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0ID0gdmFsdWVzWzBdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gTG9hZCBsYXp5IHJvdXRlIG1vZHVsZSwgdGhlbiBydW4gYW55IHJldHVybmVkIGhhbmRsZXJcbiAgICAgICAgYXdhaXQgbG9hZExhenlSb3V0ZU1vZHVsZShtYXRjaC5yb3V0ZSwgbWFwUm91dGVQcm9wZXJ0aWVzLCBtYW5pZmVzdCk7XG4gICAgICAgIGhhbmRsZXIgPSBtYXRjaC5yb3V0ZVt0eXBlXTtcbiAgICAgICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgICAgICAvLyBIYW5kbGVyIHN0aWxsIHJ1biBldmVuIGlmIHdlIGdvdCBpbnRlcnJ1cHRlZCB0byBtYWludGFpbiBjb25zaXN0ZW5jeVxuICAgICAgICAgIC8vIHdpdGggdW4tYWJvcnRhYmxlIGJlaGF2aW9yIG9mIGhhbmRsZXIgZXhlY3V0aW9uIG9uIG5vbi1sYXp5IG9yXG4gICAgICAgICAgLy8gcHJldmlvdXNseS1sYXp5LWxvYWRlZCByb3V0ZXNcbiAgICAgICAgICByZXN1bHQgPSBhd2FpdCBydW5IYW5kbGVyKGhhbmRsZXIpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFwiYWN0aW9uXCIpIHtcbiAgICAgICAgICBsZXQgdXJsID0gbmV3IFVSTChyZXF1ZXN0LnVybCk7XG4gICAgICAgICAgbGV0IHBhdGhuYW1lID0gdXJsLnBhdGhuYW1lICsgdXJsLnNlYXJjaDtcbiAgICAgICAgICB0aHJvdyBnZXRJbnRlcm5hbFJvdXRlckVycm9yKDQwNSwge1xuICAgICAgICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICAgICAgICAgIHBhdGhuYW1lLFxuICAgICAgICAgICAgcm91dGVJZDogbWF0Y2gucm91dGUuaWRcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBsYXp5KCkgcm91dGUgaGFzIG5vIGxvYWRlciB0byBydW4uICBTaG9ydCBjaXJjdWl0IGhlcmUgc28gd2UgZG9uJ3RcbiAgICAgICAgICAvLyBoaXQgdGhlIGludmFyaWFudCBiZWxvdyB0aGF0IGVycm9ycyBvbiByZXR1cm5pbmcgdW5kZWZpbmVkLlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBSZXN1bHRUeXBlLmRhdGEsXG4gICAgICAgICAgICBkYXRhOiB1bmRlZmluZWRcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghaGFuZGxlcikge1xuICAgICAgbGV0IHVybCA9IG5ldyBVUkwocmVxdWVzdC51cmwpO1xuICAgICAgbGV0IHBhdGhuYW1lID0gdXJsLnBhdGhuYW1lICsgdXJsLnNlYXJjaDtcbiAgICAgIHRocm93IGdldEludGVybmFsUm91dGVyRXJyb3IoNDA0LCB7XG4gICAgICAgIHBhdGhuYW1lXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gYXdhaXQgcnVuSGFuZGxlcihoYW5kbGVyKTtcbiAgICB9XG4gICAgaW52YXJpYW50KHJlc3VsdCAhPT0gdW5kZWZpbmVkLCBcIllvdSBkZWZpbmVkIFwiICsgKHR5cGUgPT09IFwiYWN0aW9uXCIgPyBcImFuIGFjdGlvblwiIDogXCJhIGxvYWRlclwiKSArIFwiIGZvciByb3V0ZSBcIiArIChcIlxcXCJcIiArIG1hdGNoLnJvdXRlLmlkICsgXCJcXFwiIGJ1dCBkaWRuJ3QgcmV0dXJuIGFueXRoaW5nIGZyb20geW91ciBgXCIgKyB0eXBlICsgXCJgIFwiKSArIFwiZnVuY3Rpb24uIFBsZWFzZSByZXR1cm4gYSB2YWx1ZSBvciBgbnVsbGAuXCIpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmVzdWx0VHlwZSA9IFJlc3VsdFR5cGUuZXJyb3I7XG4gICAgcmVzdWx0ID0gZTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAob25SZWplY3QpIHtcbiAgICAgIHJlcXVlc3Quc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBvblJlamVjdCk7XG4gICAgfVxuICB9XG4gIGlmIChpc1Jlc3BvbnNlKHJlc3VsdCkpIHtcbiAgICBsZXQgc3RhdHVzID0gcmVzdWx0LnN0YXR1cztcbiAgICAvLyBQcm9jZXNzIHJlZGlyZWN0c1xuICAgIGlmIChyZWRpcmVjdFN0YXR1c0NvZGVzLmhhcyhzdGF0dXMpKSB7XG4gICAgICBsZXQgbG9jYXRpb24gPSByZXN1bHQuaGVhZGVycy5nZXQoXCJMb2NhdGlvblwiKTtcbiAgICAgIGludmFyaWFudChsb2NhdGlvbiwgXCJSZWRpcmVjdHMgcmV0dXJuZWQvdGhyb3duIGZyb20gbG9hZGVycy9hY3Rpb25zIG11c3QgaGF2ZSBhIExvY2F0aW9uIGhlYWRlclwiKTtcbiAgICAgIC8vIFN1cHBvcnQgcmVsYXRpdmUgcm91dGluZyBpbiBpbnRlcm5hbCByZWRpcmVjdHNcbiAgICAgIGlmICghQUJTT0xVVEVfVVJMX1JFR0VYLnRlc3QobG9jYXRpb24pKSB7XG4gICAgICAgIGxvY2F0aW9uID0gbm9ybWFsaXplVG8obmV3IFVSTChyZXF1ZXN0LnVybCksIG1hdGNoZXMuc2xpY2UoMCwgbWF0Y2hlcy5pbmRleE9mKG1hdGNoKSArIDEpLCBiYXNlbmFtZSwgdHJ1ZSwgbG9jYXRpb24pO1xuICAgICAgfSBlbHNlIGlmICghb3B0cy5pc1N0YXRpY1JlcXVlc3QpIHtcbiAgICAgICAgLy8gU3RyaXAgb2ZmIHRoZSBwcm90b2NvbCtvcmlnaW4gZm9yIHNhbWUtb3JpZ2luICsgc2FtZS1iYXNlbmFtZSBhYnNvbHV0ZVxuICAgICAgICAvLyByZWRpcmVjdHMuIElmIHRoaXMgaXMgYSBzdGF0aWMgcmVxdWVzdCwgd2UgY2FuIGxldCBpdCBnbyBiYWNrIHRvIHRoZVxuICAgICAgICAvLyBicm93c2VyIGFzLWlzXG4gICAgICAgIGxldCBjdXJyZW50VXJsID0gbmV3IFVSTChyZXF1ZXN0LnVybCk7XG4gICAgICAgIGxldCB1cmwgPSBsb2NhdGlvbi5zdGFydHNXaXRoKFwiLy9cIikgPyBuZXcgVVJMKGN1cnJlbnRVcmwucHJvdG9jb2wgKyBsb2NhdGlvbikgOiBuZXcgVVJMKGxvY2F0aW9uKTtcbiAgICAgICAgbGV0IGlzU2FtZUJhc2VuYW1lID0gc3RyaXBCYXNlbmFtZSh1cmwucGF0aG5hbWUsIGJhc2VuYW1lKSAhPSBudWxsO1xuICAgICAgICBpZiAodXJsLm9yaWdpbiA9PT0gY3VycmVudFVybC5vcmlnaW4gJiYgaXNTYW1lQmFzZW5hbWUpIHtcbiAgICAgICAgICBsb2NhdGlvbiA9IHVybC5wYXRobmFtZSArIHVybC5zZWFyY2ggKyB1cmwuaGFzaDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gRG9uJ3QgcHJvY2VzcyByZWRpcmVjdHMgaW4gdGhlIHJvdXRlciBkdXJpbmcgc3RhdGljIHJlcXVlc3RzIHJlcXVlc3RzLlxuICAgICAgLy8gSW5zdGVhZCwgdGhyb3cgdGhlIFJlc3BvbnNlIGFuZCBsZXQgdGhlIHNlcnZlciBoYW5kbGUgaXQgd2l0aCBhbiBIVFRQXG4gICAgICAvLyByZWRpcmVjdC4gIFdlIGFsc28gdXBkYXRlIHRoZSBMb2NhdGlvbiBoZWFkZXIgaW4gcGxhY2UgaW4gdGhpcyBmbG93IHNvXG4gICAgICAvLyBiYXNlbmFtZSBhbmQgcmVsYXRpdmUgcm91dGluZyBpcyB0YWtlbiBpbnRvIGFjY291bnRcbiAgICAgIGlmIChvcHRzLmlzU3RhdGljUmVxdWVzdCkge1xuICAgICAgICByZXN1bHQuaGVhZGVycy5zZXQoXCJMb2NhdGlvblwiLCBsb2NhdGlvbik7XG4gICAgICAgIHRocm93IHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFJlc3VsdFR5cGUucmVkaXJlY3QsXG4gICAgICAgIHN0YXR1cyxcbiAgICAgICAgbG9jYXRpb24sXG4gICAgICAgIHJldmFsaWRhdGU6IHJlc3VsdC5oZWFkZXJzLmdldChcIlgtUmVtaXgtUmV2YWxpZGF0ZVwiKSAhPT0gbnVsbCxcbiAgICAgICAgcmVsb2FkRG9jdW1lbnQ6IHJlc3VsdC5oZWFkZXJzLmdldChcIlgtUmVtaXgtUmVsb2FkLURvY3VtZW50XCIpICE9PSBudWxsXG4gICAgICB9O1xuICAgIH1cbiAgICAvLyBGb3IgU1NSIHNpbmdsZS1yb3V0ZSByZXF1ZXN0cywgd2Ugd2FudCB0byBoYW5kIFJlc3BvbnNlcyBiYWNrIGRpcmVjdGx5XG4gICAgLy8gd2l0aG91dCB1bndyYXBwaW5nLiAgV2UgZG8gdGhpcyB3aXRoIHRoZSBRdWVyeVJvdXRlUmVzcG9uc2Ugd3JhcHBlclxuICAgIC8vIGludGVyZmFjZSBzbyB3ZSBjYW4ga25vdyB3aGV0aGVyIGl0IHdhcyByZXR1cm5lZCBvciB0aHJvd25cbiAgICBpZiAob3B0cy5pc1JvdXRlUmVxdWVzdCkge1xuICAgICAgbGV0IHF1ZXJ5Um91dGVSZXNwb25zZSA9IHtcbiAgICAgICAgdHlwZTogcmVzdWx0VHlwZSA9PT0gUmVzdWx0VHlwZS5lcnJvciA/IFJlc3VsdFR5cGUuZXJyb3IgOiBSZXN1bHRUeXBlLmRhdGEsXG4gICAgICAgIHJlc3BvbnNlOiByZXN1bHRcbiAgICAgIH07XG4gICAgICB0aHJvdyBxdWVyeVJvdXRlUmVzcG9uc2U7XG4gICAgfVxuICAgIGxldCBkYXRhO1xuICAgIGxldCBjb250ZW50VHlwZSA9IHJlc3VsdC5oZWFkZXJzLmdldChcIkNvbnRlbnQtVHlwZVwiKTtcbiAgICAvLyBDaGVjayBiZXR3ZWVuIHdvcmQgYm91bmRhcmllcyBpbnN0ZWFkIG9mIHN0YXJ0c1dpdGgoKSBkdWUgdG8gdGhlIGxhc3RcbiAgICAvLyBwYXJhZ3JhcGggb2YgaHR0cHM6Ly9odHRwd2cub3JnL3NwZWNzL3JmYzkxMTAuaHRtbCNmaWVsZC5jb250ZW50LXR5cGVcbiAgICBpZiAoY29udGVudFR5cGUgJiYgL1xcYmFwcGxpY2F0aW9uXFwvanNvblxcYi8udGVzdChjb250ZW50VHlwZSkpIHtcbiAgICAgIGRhdGEgPSBhd2FpdCByZXN1bHQuanNvbigpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXRhID0gYXdhaXQgcmVzdWx0LnRleHQoKTtcbiAgICB9XG4gICAgaWYgKHJlc3VsdFR5cGUgPT09IFJlc3VsdFR5cGUuZXJyb3IpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IHJlc3VsdFR5cGUsXG4gICAgICAgIGVycm9yOiBuZXcgRXJyb3JSZXNwb25zZUltcGwoc3RhdHVzLCByZXN1bHQuc3RhdHVzVGV4dCwgZGF0YSksXG4gICAgICAgIGhlYWRlcnM6IHJlc3VsdC5oZWFkZXJzXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogUmVzdWx0VHlwZS5kYXRhLFxuICAgICAgZGF0YSxcbiAgICAgIHN0YXR1c0NvZGU6IHJlc3VsdC5zdGF0dXMsXG4gICAgICBoZWFkZXJzOiByZXN1bHQuaGVhZGVyc1xuICAgIH07XG4gIH1cbiAgaWYgKHJlc3VsdFR5cGUgPT09IFJlc3VsdFR5cGUuZXJyb3IpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogcmVzdWx0VHlwZSxcbiAgICAgIGVycm9yOiByZXN1bHRcbiAgICB9O1xuICB9XG4gIGlmIChpc0RlZmVycmVkRGF0YShyZXN1bHQpKSB7XG4gICAgdmFyIF9yZXN1bHQkaW5pdCwgX3Jlc3VsdCRpbml0MjtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogUmVzdWx0VHlwZS5kZWZlcnJlZCxcbiAgICAgIGRlZmVycmVkRGF0YTogcmVzdWx0LFxuICAgICAgc3RhdHVzQ29kZTogKF9yZXN1bHQkaW5pdCA9IHJlc3VsdC5pbml0KSA9PSBudWxsID8gdm9pZCAwIDogX3Jlc3VsdCRpbml0LnN0YXR1cyxcbiAgICAgIGhlYWRlcnM6ICgoX3Jlc3VsdCRpbml0MiA9IHJlc3VsdC5pbml0KSA9PSBudWxsID8gdm9pZCAwIDogX3Jlc3VsdCRpbml0Mi5oZWFkZXJzKSAmJiBuZXcgSGVhZGVycyhyZXN1bHQuaW5pdC5oZWFkZXJzKVxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBSZXN1bHRUeXBlLmRhdGEsXG4gICAgZGF0YTogcmVzdWx0XG4gIH07XG59XG4vLyBVdGlsaXR5IG1ldGhvZCBmb3IgY3JlYXRpbmcgdGhlIFJlcXVlc3QgaW5zdGFuY2VzIGZvciBsb2FkZXJzL2FjdGlvbnMgZHVyaW5nXG4vLyBjbGllbnQtc2lkZSBuYXZpZ2F0aW9ucyBhbmQgZmV0Y2hlcy4gIER1cmluZyBTU1Igd2Ugd2lsbCBhbHdheXMgaGF2ZSBhXG4vLyBSZXF1ZXN0IGluc3RhbmNlIGZyb20gdGhlIHN0YXRpYyBoYW5kbGVyIChxdWVyeS9xdWVyeVJvdXRlKVxuZnVuY3Rpb24gY3JlYXRlQ2xpZW50U2lkZVJlcXVlc3QoaGlzdG9yeSwgbG9jYXRpb24sIHNpZ25hbCwgc3VibWlzc2lvbikge1xuICBsZXQgdXJsID0gaGlzdG9yeS5jcmVhdGVVUkwoc3RyaXBIYXNoRnJvbVBhdGgobG9jYXRpb24pKS50b1N0cmluZygpO1xuICBsZXQgaW5pdCA9IHtcbiAgICBzaWduYWxcbiAgfTtcbiAgaWYgKHN1Ym1pc3Npb24gJiYgaXNNdXRhdGlvbk1ldGhvZChzdWJtaXNzaW9uLmZvcm1NZXRob2QpKSB7XG4gICAgbGV0IHtcbiAgICAgIGZvcm1NZXRob2QsXG4gICAgICBmb3JtRW5jVHlwZVxuICAgIH0gPSBzdWJtaXNzaW9uO1xuICAgIC8vIERpZG4ndCB0aGluayB3ZSBuZWVkZWQgdGhpcyBidXQgaXQgdHVybnMgb3V0IHVubGlrZSBvdGhlciBtZXRob2RzLCBwYXRjaFxuICAgIC8vIHdvbid0IGJlIHByb3Blcmx5IG5vcm1hbGl6ZWQgdG8gdXBwZXJjYXNlIGFuZCByZXN1bHRzIGluIGEgNDA1IGVycm9yLlxuICAgIC8vIFNlZTogaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtbWV0aG9kXG4gICAgaW5pdC5tZXRob2QgPSBmb3JtTWV0aG9kLnRvVXBwZXJDYXNlKCk7XG4gICAgaWYgKGZvcm1FbmNUeXBlID09PSBcImFwcGxpY2F0aW9uL2pzb25cIikge1xuICAgICAgaW5pdC5oZWFkZXJzID0gbmV3IEhlYWRlcnMoe1xuICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBmb3JtRW5jVHlwZVxuICAgICAgfSk7XG4gICAgICBpbml0LmJvZHkgPSBKU09OLnN0cmluZ2lmeShzdWJtaXNzaW9uLmpzb24pO1xuICAgIH0gZWxzZSBpZiAoZm9ybUVuY1R5cGUgPT09IFwidGV4dC9wbGFpblwiKSB7XG4gICAgICAvLyBDb250ZW50LVR5cGUgaXMgaW5mZXJyZWQgKGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNkb20tcmVxdWVzdClcbiAgICAgIGluaXQuYm9keSA9IHN1Ym1pc3Npb24udGV4dDtcbiAgICB9IGVsc2UgaWYgKGZvcm1FbmNUeXBlID09PSBcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFwiICYmIHN1Ym1pc3Npb24uZm9ybURhdGEpIHtcbiAgICAgIC8vIENvbnRlbnQtVHlwZSBpcyBpbmZlcnJlZCAoaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2RvbS1yZXF1ZXN0KVxuICAgICAgaW5pdC5ib2R5ID0gY29udmVydEZvcm1EYXRhVG9TZWFyY2hQYXJhbXMoc3VibWlzc2lvbi5mb3JtRGF0YSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENvbnRlbnQtVHlwZSBpcyBpbmZlcnJlZCAoaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2RvbS1yZXF1ZXN0KVxuICAgICAgaW5pdC5ib2R5ID0gc3VibWlzc2lvbi5mb3JtRGF0YTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5ldyBSZXF1ZXN0KHVybCwgaW5pdCk7XG59XG5mdW5jdGlvbiBjb252ZXJ0Rm9ybURhdGFUb1NlYXJjaFBhcmFtcyhmb3JtRGF0YSkge1xuICBsZXQgc2VhcmNoUGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICBmb3IgKGxldCBba2V5LCB2YWx1ZV0gb2YgZm9ybURhdGEuZW50cmllcygpKSB7XG4gICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZm9ybS1jb250cm9sLWluZnJhc3RydWN0dXJlLmh0bWwjY29udmVydGluZy1hbi1lbnRyeS1saXN0LXRvLWEtbGlzdC1vZi1uYW1lLXZhbHVlLXBhaXJzXG4gICAgc2VhcmNoUGFyYW1zLmFwcGVuZChrZXksIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiA/IHZhbHVlIDogdmFsdWUubmFtZSk7XG4gIH1cbiAgcmV0dXJuIHNlYXJjaFBhcmFtcztcbn1cbmZ1bmN0aW9uIGNvbnZlcnRTZWFyY2hQYXJhbXNUb0Zvcm1EYXRhKHNlYXJjaFBhcmFtcykge1xuICBsZXQgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgZm9yIChsZXQgW2tleSwgdmFsdWVdIG9mIHNlYXJjaFBhcmFtcy5lbnRyaWVzKCkpIHtcbiAgICBmb3JtRGF0YS5hcHBlbmQoa2V5LCB2YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIGZvcm1EYXRhO1xufVxuZnVuY3Rpb24gcHJvY2Vzc1JvdXRlTG9hZGVyRGF0YShtYXRjaGVzLCBtYXRjaGVzVG9Mb2FkLCByZXN1bHRzLCBwZW5kaW5nRXJyb3IsIGFjdGl2ZURlZmVycmVkcykge1xuICAvLyBGaWxsIGluIGxvYWRlckRhdGEvZXJyb3JzIGZyb20gb3VyIGxvYWRlcnNcbiAgbGV0IGxvYWRlckRhdGEgPSB7fTtcbiAgbGV0IGVycm9ycyA9IG51bGw7XG4gIGxldCBzdGF0dXNDb2RlO1xuICBsZXQgZm91bmRFcnJvciA9IGZhbHNlO1xuICBsZXQgbG9hZGVySGVhZGVycyA9IHt9O1xuICAvLyBQcm9jZXNzIGxvYWRlciByZXN1bHRzIGludG8gc3RhdGUubG9hZGVyRGF0YS9zdGF0ZS5lcnJvcnNcbiAgcmVzdWx0cy5mb3JFYWNoKChyZXN1bHQsIGluZGV4KSA9PiB7XG4gICAgbGV0IGlkID0gbWF0Y2hlc1RvTG9hZFtpbmRleF0ucm91dGUuaWQ7XG4gICAgaW52YXJpYW50KCFpc1JlZGlyZWN0UmVzdWx0KHJlc3VsdCksIFwiQ2Fubm90IGhhbmRsZSByZWRpcmVjdCByZXN1bHRzIGluIHByb2Nlc3NMb2FkZXJEYXRhXCIpO1xuICAgIGlmIChpc0Vycm9yUmVzdWx0KHJlc3VsdCkpIHtcbiAgICAgIC8vIExvb2sgdXB3YXJkcyBmcm9tIHRoZSBtYXRjaGVkIHJvdXRlIGZvciB0aGUgY2xvc2VzdCBhbmNlc3RvclxuICAgICAgLy8gZXJyb3IgYm91bmRhcnksIGRlZmF1bHRpbmcgdG8gdGhlIHJvb3QgbWF0Y2hcbiAgICAgIGxldCBib3VuZGFyeU1hdGNoID0gZmluZE5lYXJlc3RCb3VuZGFyeShtYXRjaGVzLCBpZCk7XG4gICAgICBsZXQgZXJyb3IgPSByZXN1bHQuZXJyb3I7XG4gICAgICAvLyBJZiB3ZSBoYXZlIGEgcGVuZGluZyBhY3Rpb24gZXJyb3IsIHdlIHJlcG9ydCBpdCBhdCB0aGUgaGlnaGVzdC1yb3V0ZVxuICAgICAgLy8gdGhhdCB0aHJvd3MgYSBsb2FkZXIgZXJyb3IsIGFuZCB0aGVuIGNsZWFyIGl0IG91dCB0byBpbmRpY2F0ZSB0aGF0XG4gICAgICAvLyBpdCB3YXMgY29uc3VtZWRcbiAgICAgIGlmIChwZW5kaW5nRXJyb3IpIHtcbiAgICAgICAgZXJyb3IgPSBPYmplY3QudmFsdWVzKHBlbmRpbmdFcnJvcilbMF07XG4gICAgICAgIHBlbmRpbmdFcnJvciA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGVycm9ycyA9IGVycm9ycyB8fCB7fTtcbiAgICAgIC8vIFByZWZlciBoaWdoZXIgZXJyb3IgdmFsdWVzIGlmIGxvd2VyIGVycm9ycyBidWJibGUgdG8gdGhlIHNhbWUgYm91bmRhcnlcbiAgICAgIGlmIChlcnJvcnNbYm91bmRhcnlNYXRjaC5yb3V0ZS5pZF0gPT0gbnVsbCkge1xuICAgICAgICBlcnJvcnNbYm91bmRhcnlNYXRjaC5yb3V0ZS5pZF0gPSBlcnJvcjtcbiAgICAgIH1cbiAgICAgIC8vIENsZWFyIG91ciBhbnkgcHJpb3IgbG9hZGVyRGF0YSBmb3IgdGhlIHRocm93aW5nIHJvdXRlXG4gICAgICBsb2FkZXJEYXRhW2lkXSA9IHVuZGVmaW5lZDtcbiAgICAgIC8vIE9uY2Ugd2UgZmluZCBvdXIgZmlyc3QgKGhpZ2hlc3QpIGVycm9yLCB3ZSBzZXQgdGhlIHN0YXR1cyBjb2RlIGFuZFxuICAgICAgLy8gcHJldmVudCBkZWVwZXIgc3RhdHVzIGNvZGVzIGZyb20gb3ZlcnJpZGluZ1xuICAgICAgaWYgKCFmb3VuZEVycm9yKSB7XG4gICAgICAgIGZvdW5kRXJyb3IgPSB0cnVlO1xuICAgICAgICBzdGF0dXNDb2RlID0gaXNSb3V0ZUVycm9yUmVzcG9uc2UocmVzdWx0LmVycm9yKSA/IHJlc3VsdC5lcnJvci5zdGF0dXMgOiA1MDA7XG4gICAgICB9XG4gICAgICBpZiAocmVzdWx0LmhlYWRlcnMpIHtcbiAgICAgICAgbG9hZGVySGVhZGVyc1tpZF0gPSByZXN1bHQuaGVhZGVycztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGlzRGVmZXJyZWRSZXN1bHQocmVzdWx0KSkge1xuICAgICAgICBhY3RpdmVEZWZlcnJlZHMuc2V0KGlkLCByZXN1bHQuZGVmZXJyZWREYXRhKTtcbiAgICAgICAgbG9hZGVyRGF0YVtpZF0gPSByZXN1bHQuZGVmZXJyZWREYXRhLmRhdGE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2FkZXJEYXRhW2lkXSA9IHJlc3VsdC5kYXRhO1xuICAgICAgfVxuICAgICAgLy8gRXJyb3Igc3RhdHVzIGNvZGVzIGFsd2F5cyBvdmVycmlkZSBzdWNjZXNzIHN0YXR1cyBjb2RlcywgYnV0IGlmIGFsbFxuICAgICAgLy8gbG9hZGVycyBhcmUgc3VjY2Vzc2Z1bCB3ZSB0YWtlIHRoZSBkZWVwZXN0IHN0YXR1cyBjb2RlLlxuICAgICAgaWYgKHJlc3VsdC5zdGF0dXNDb2RlICE9IG51bGwgJiYgcmVzdWx0LnN0YXR1c0NvZGUgIT09IDIwMCAmJiAhZm91bmRFcnJvcikge1xuICAgICAgICBzdGF0dXNDb2RlID0gcmVzdWx0LnN0YXR1c0NvZGU7XG4gICAgICB9XG4gICAgICBpZiAocmVzdWx0LmhlYWRlcnMpIHtcbiAgICAgICAgbG9hZGVySGVhZGVyc1tpZF0gPSByZXN1bHQuaGVhZGVycztcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICAvLyBJZiB3ZSBkaWRuJ3QgY29uc3VtZSB0aGUgcGVuZGluZyBhY3Rpb24gZXJyb3IgKGkuZS4sIGFsbCBsb2FkZXJzXG4gIC8vIHJlc29sdmVkKSwgdGhlbiBjb25zdW1lIGl0IGhlcmUuICBBbHNvIGNsZWFyIG91dCBhbnkgbG9hZGVyRGF0YSBmb3IgdGhlXG4gIC8vIHRocm93aW5nIHJvdXRlXG4gIGlmIChwZW5kaW5nRXJyb3IpIHtcbiAgICBlcnJvcnMgPSBwZW5kaW5nRXJyb3I7XG4gICAgbG9hZGVyRGF0YVtPYmplY3Qua2V5cyhwZW5kaW5nRXJyb3IpWzBdXSA9IHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4ge1xuICAgIGxvYWRlckRhdGEsXG4gICAgZXJyb3JzLFxuICAgIHN0YXR1c0NvZGU6IHN0YXR1c0NvZGUgfHwgMjAwLFxuICAgIGxvYWRlckhlYWRlcnNcbiAgfTtcbn1cbmZ1bmN0aW9uIHByb2Nlc3NMb2FkZXJEYXRhKHN0YXRlLCBtYXRjaGVzLCBtYXRjaGVzVG9Mb2FkLCByZXN1bHRzLCBwZW5kaW5nRXJyb3IsIHJldmFsaWRhdGluZ0ZldGNoZXJzLCBmZXRjaGVyUmVzdWx0cywgYWN0aXZlRGVmZXJyZWRzKSB7XG4gIGxldCB7XG4gICAgbG9hZGVyRGF0YSxcbiAgICBlcnJvcnNcbiAgfSA9IHByb2Nlc3NSb3V0ZUxvYWRlckRhdGEobWF0Y2hlcywgbWF0Y2hlc1RvTG9hZCwgcmVzdWx0cywgcGVuZGluZ0Vycm9yLCBhY3RpdmVEZWZlcnJlZHMpO1xuICAvLyBQcm9jZXNzIHJlc3VsdHMgZnJvbSBvdXIgcmV2YWxpZGF0aW5nIGZldGNoZXJzXG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCByZXZhbGlkYXRpbmdGZXRjaGVycy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBsZXQge1xuICAgICAga2V5LFxuICAgICAgbWF0Y2gsXG4gICAgICBjb250cm9sbGVyXG4gICAgfSA9IHJldmFsaWRhdGluZ0ZldGNoZXJzW2luZGV4XTtcbiAgICBpbnZhcmlhbnQoZmV0Y2hlclJlc3VsdHMgIT09IHVuZGVmaW5lZCAmJiBmZXRjaGVyUmVzdWx0c1tpbmRleF0gIT09IHVuZGVmaW5lZCwgXCJEaWQgbm90IGZpbmQgY29ycmVzcG9uZGluZyBmZXRjaGVyIHJlc3VsdFwiKTtcbiAgICBsZXQgcmVzdWx0ID0gZmV0Y2hlclJlc3VsdHNbaW5kZXhdO1xuICAgIC8vIFByb2Nlc3MgZmV0Y2hlciBub24tcmVkaXJlY3QgZXJyb3JzXG4gICAgaWYgKGNvbnRyb2xsZXIgJiYgY29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgLy8gTm90aGluZyB0byBkbyBmb3IgYWJvcnRlZCBmZXRjaGVyc1xuICAgICAgY29udGludWU7XG4gICAgfSBlbHNlIGlmIChpc0Vycm9yUmVzdWx0KHJlc3VsdCkpIHtcbiAgICAgIGxldCBib3VuZGFyeU1hdGNoID0gZmluZE5lYXJlc3RCb3VuZGFyeShzdGF0ZS5tYXRjaGVzLCBtYXRjaCA9PSBudWxsID8gdm9pZCAwIDogbWF0Y2gucm91dGUuaWQpO1xuICAgICAgaWYgKCEoZXJyb3JzICYmIGVycm9yc1tib3VuZGFyeU1hdGNoLnJvdXRlLmlkXSkpIHtcbiAgICAgICAgZXJyb3JzID0gX2V4dGVuZHMoe30sIGVycm9ycywge1xuICAgICAgICAgIFtib3VuZGFyeU1hdGNoLnJvdXRlLmlkXTogcmVzdWx0LmVycm9yXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgc3RhdGUuZmV0Y2hlcnMuZGVsZXRlKGtleSk7XG4gICAgfSBlbHNlIGlmIChpc1JlZGlyZWN0UmVzdWx0KHJlc3VsdCkpIHtcbiAgICAgIC8vIFNob3VsZCBuZXZlciBnZXQgaGVyZSwgcmVkaXJlY3RzIHNob3VsZCBnZXQgcHJvY2Vzc2VkIGFib3ZlLCBidXQgd2VcbiAgICAgIC8vIGtlZXAgdGhpcyB0byB0eXBlIG5hcnJvdyB0byBhIHN1Y2Nlc3MgcmVzdWx0IGluIHRoZSBlbHNlXG4gICAgICBpbnZhcmlhbnQoZmFsc2UsIFwiVW5oYW5kbGVkIGZldGNoZXIgcmV2YWxpZGF0aW9uIHJlZGlyZWN0XCIpO1xuICAgIH0gZWxzZSBpZiAoaXNEZWZlcnJlZFJlc3VsdChyZXN1bHQpKSB7XG4gICAgICAvLyBTaG91bGQgbmV2ZXIgZ2V0IGhlcmUsIGRlZmVycmVkIGRhdGEgc2hvdWxkIGJlIGF3YWl0ZWQgZm9yIGZldGNoZXJzXG4gICAgICAvLyBpbiByZXNvbHZlRGVmZXJyZWRSZXN1bHRzXG4gICAgICBpbnZhcmlhbnQoZmFsc2UsIFwiVW5oYW5kbGVkIGZldGNoZXIgZGVmZXJyZWQgZGF0YVwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGRvbmVGZXRjaGVyID0gZ2V0RG9uZUZldGNoZXIocmVzdWx0LmRhdGEpO1xuICAgICAgc3RhdGUuZmV0Y2hlcnMuc2V0KGtleSwgZG9uZUZldGNoZXIpO1xuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIGxvYWRlckRhdGEsXG4gICAgZXJyb3JzXG4gIH07XG59XG5mdW5jdGlvbiBtZXJnZUxvYWRlckRhdGEobG9hZGVyRGF0YSwgbmV3TG9hZGVyRGF0YSwgbWF0Y2hlcywgZXJyb3JzKSB7XG4gIGxldCBtZXJnZWRMb2FkZXJEYXRhID0gX2V4dGVuZHMoe30sIG5ld0xvYWRlckRhdGEpO1xuICBmb3IgKGxldCBtYXRjaCBvZiBtYXRjaGVzKSB7XG4gICAgbGV0IGlkID0gbWF0Y2gucm91dGUuaWQ7XG4gICAgaWYgKG5ld0xvYWRlckRhdGEuaGFzT3duUHJvcGVydHkoaWQpKSB7XG4gICAgICBpZiAobmV3TG9hZGVyRGF0YVtpZF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBtZXJnZWRMb2FkZXJEYXRhW2lkXSA9IG5ld0xvYWRlckRhdGFbaWRdO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobG9hZGVyRGF0YVtpZF0gIT09IHVuZGVmaW5lZCAmJiBtYXRjaC5yb3V0ZS5sb2FkZXIpIHtcbiAgICAgIC8vIFByZXNlcnZlIGV4aXN0aW5nIGtleXMgbm90IGluY2x1ZGVkIGluIG5ld0xvYWRlckRhdGEgYW5kIHdoZXJlIGEgbG9hZGVyXG4gICAgICAvLyB3YXNuJ3QgcmVtb3ZlZCBieSBITVJcbiAgICAgIG1lcmdlZExvYWRlckRhdGFbaWRdID0gbG9hZGVyRGF0YVtpZF07XG4gICAgfVxuICAgIGlmIChlcnJvcnMgJiYgZXJyb3JzLmhhc093blByb3BlcnR5KGlkKSkge1xuICAgICAgLy8gRG9uJ3Qga2VlcCBhbnkgbG9hZGVyIGRhdGEgYmVsb3cgdGhlIGJvdW5kYXJ5XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1lcmdlZExvYWRlckRhdGE7XG59XG4vLyBGaW5kIHRoZSBuZWFyZXN0IGVycm9yIGJvdW5kYXJ5LCBsb29raW5nIHVwd2FyZHMgZnJvbSB0aGUgbGVhZiByb3V0ZSAob3IgdGhlXG4vLyByb3V0ZSBzcGVjaWZpZWQgYnkgcm91dGVJZCkgZm9yIHRoZSBjbG9zZXN0IGFuY2VzdG9yIGVycm9yIGJvdW5kYXJ5LFxuLy8gZGVmYXVsdGluZyB0byB0aGUgcm9vdCBtYXRjaFxuZnVuY3Rpb24gZmluZE5lYXJlc3RCb3VuZGFyeShtYXRjaGVzLCByb3V0ZUlkKSB7XG4gIGxldCBlbGlnaWJsZU1hdGNoZXMgPSByb3V0ZUlkID8gbWF0Y2hlcy5zbGljZSgwLCBtYXRjaGVzLmZpbmRJbmRleChtID0+IG0ucm91dGUuaWQgPT09IHJvdXRlSWQpICsgMSkgOiBbLi4ubWF0Y2hlc107XG4gIHJldHVybiBlbGlnaWJsZU1hdGNoZXMucmV2ZXJzZSgpLmZpbmQobSA9PiBtLnJvdXRlLmhhc0Vycm9yQm91bmRhcnkgPT09IHRydWUpIHx8IG1hdGNoZXNbMF07XG59XG5mdW5jdGlvbiBnZXRTaG9ydENpcmN1aXRNYXRjaGVzKHJvdXRlcykge1xuICAvLyBQcmVmZXIgYSByb290IGxheW91dCByb3V0ZSBpZiBwcmVzZW50LCBvdGhlcndpc2Ugc2hpbSBpbiBhIHJvdXRlIG9iamVjdFxuICBsZXQgcm91dGUgPSByb3V0ZXMubGVuZ3RoID09PSAxID8gcm91dGVzWzBdIDogcm91dGVzLmZpbmQociA9PiByLmluZGV4IHx8ICFyLnBhdGggfHwgci5wYXRoID09PSBcIi9cIikgfHwge1xuICAgIGlkOiBcIl9fc2hpbS1lcnJvci1yb3V0ZV9fXCJcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBtYXRjaGVzOiBbe1xuICAgICAgcGFyYW1zOiB7fSxcbiAgICAgIHBhdGhuYW1lOiBcIlwiLFxuICAgICAgcGF0aG5hbWVCYXNlOiBcIlwiLFxuICAgICAgcm91dGVcbiAgICB9XSxcbiAgICByb3V0ZVxuICB9O1xufVxuZnVuY3Rpb24gZ2V0SW50ZXJuYWxSb3V0ZXJFcnJvcihzdGF0dXMsIF90ZW1wNSkge1xuICBsZXQge1xuICAgIHBhdGhuYW1lLFxuICAgIHJvdXRlSWQsXG4gICAgbWV0aG9kLFxuICAgIHR5cGVcbiAgfSA9IF90ZW1wNSA9PT0gdm9pZCAwID8ge30gOiBfdGVtcDU7XG4gIGxldCBzdGF0dXNUZXh0ID0gXCJVbmtub3duIFNlcnZlciBFcnJvclwiO1xuICBsZXQgZXJyb3JNZXNzYWdlID0gXCJVbmtub3duIEByZW1peC1ydW4vcm91dGVyIGVycm9yXCI7XG4gIGlmIChzdGF0dXMgPT09IDQwMCkge1xuICAgIHN0YXR1c1RleHQgPSBcIkJhZCBSZXF1ZXN0XCI7XG4gICAgaWYgKG1ldGhvZCAmJiBwYXRobmFtZSAmJiByb3V0ZUlkKSB7XG4gICAgICBlcnJvck1lc3NhZ2UgPSBcIllvdSBtYWRlIGEgXCIgKyBtZXRob2QgKyBcIiByZXF1ZXN0IHRvIFxcXCJcIiArIHBhdGhuYW1lICsgXCJcXFwiIGJ1dCBcIiArIChcImRpZCBub3QgcHJvdmlkZSBhIGBsb2FkZXJgIGZvciByb3V0ZSBcXFwiXCIgKyByb3V0ZUlkICsgXCJcXFwiLCBcIikgKyBcInNvIHRoZXJlIGlzIG5vIHdheSB0byBoYW5kbGUgdGhlIHJlcXVlc3QuXCI7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBcImRlZmVyLWFjdGlvblwiKSB7XG4gICAgICBlcnJvck1lc3NhZ2UgPSBcImRlZmVyKCkgaXMgbm90IHN1cHBvcnRlZCBpbiBhY3Rpb25zXCI7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBcImludmFsaWQtYm9keVwiKSB7XG4gICAgICBlcnJvck1lc3NhZ2UgPSBcIlVuYWJsZSB0byBlbmNvZGUgc3VibWlzc2lvbiBib2R5XCI7XG4gICAgfVxuICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgc3RhdHVzVGV4dCA9IFwiRm9yYmlkZGVuXCI7XG4gICAgZXJyb3JNZXNzYWdlID0gXCJSb3V0ZSBcXFwiXCIgKyByb3V0ZUlkICsgXCJcXFwiIGRvZXMgbm90IG1hdGNoIFVSTCBcXFwiXCIgKyBwYXRobmFtZSArIFwiXFxcIlwiO1xuICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDA0KSB7XG4gICAgc3RhdHVzVGV4dCA9IFwiTm90IEZvdW5kXCI7XG4gICAgZXJyb3JNZXNzYWdlID0gXCJObyByb3V0ZSBtYXRjaGVzIFVSTCBcXFwiXCIgKyBwYXRobmFtZSArIFwiXFxcIlwiO1xuICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDA1KSB7XG4gICAgc3RhdHVzVGV4dCA9IFwiTWV0aG9kIE5vdCBBbGxvd2VkXCI7XG4gICAgaWYgKG1ldGhvZCAmJiBwYXRobmFtZSAmJiByb3V0ZUlkKSB7XG4gICAgICBlcnJvck1lc3NhZ2UgPSBcIllvdSBtYWRlIGEgXCIgKyBtZXRob2QudG9VcHBlckNhc2UoKSArIFwiIHJlcXVlc3QgdG8gXFxcIlwiICsgcGF0aG5hbWUgKyBcIlxcXCIgYnV0IFwiICsgKFwiZGlkIG5vdCBwcm92aWRlIGFuIGBhY3Rpb25gIGZvciByb3V0ZSBcXFwiXCIgKyByb3V0ZUlkICsgXCJcXFwiLCBcIikgKyBcInNvIHRoZXJlIGlzIG5vIHdheSB0byBoYW5kbGUgdGhlIHJlcXVlc3QuXCI7XG4gICAgfSBlbHNlIGlmIChtZXRob2QpIHtcbiAgICAgIGVycm9yTWVzc2FnZSA9IFwiSW52YWxpZCByZXF1ZXN0IG1ldGhvZCBcXFwiXCIgKyBtZXRob2QudG9VcHBlckNhc2UoKSArIFwiXFxcIlwiO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbmV3IEVycm9yUmVzcG9uc2VJbXBsKHN0YXR1cyB8fCA1MDAsIHN0YXR1c1RleHQsIG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpLCB0cnVlKTtcbn1cbi8vIEZpbmQgYW55IHJldHVybmVkIHJlZGlyZWN0IGVycm9ycywgc3RhcnRpbmcgZnJvbSB0aGUgbG93ZXN0IG1hdGNoXG5mdW5jdGlvbiBmaW5kUmVkaXJlY3QocmVzdWx0cykge1xuICBmb3IgKGxldCBpID0gcmVzdWx0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGxldCByZXN1bHQgPSByZXN1bHRzW2ldO1xuICAgIGlmIChpc1JlZGlyZWN0UmVzdWx0KHJlc3VsdCkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlc3VsdCxcbiAgICAgICAgaWR4OiBpXG4gICAgICB9O1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gc3RyaXBIYXNoRnJvbVBhdGgocGF0aCkge1xuICBsZXQgcGFyc2VkUGF0aCA9IHR5cGVvZiBwYXRoID09PSBcInN0cmluZ1wiID8gcGFyc2VQYXRoKHBhdGgpIDogcGF0aDtcbiAgcmV0dXJuIGNyZWF0ZVBhdGgoX2V4dGVuZHMoe30sIHBhcnNlZFBhdGgsIHtcbiAgICBoYXNoOiBcIlwiXG4gIH0pKTtcbn1cbmZ1bmN0aW9uIGlzSGFzaENoYW5nZU9ubHkoYSwgYikge1xuICBpZiAoYS5wYXRobmFtZSAhPT0gYi5wYXRobmFtZSB8fCBhLnNlYXJjaCAhPT0gYi5zZWFyY2gpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGEuaGFzaCA9PT0gXCJcIikge1xuICAgIC8vIC9wYWdlIC0+IC9wYWdlI2hhc2hcbiAgICByZXR1cm4gYi5oYXNoICE9PSBcIlwiO1xuICB9IGVsc2UgaWYgKGEuaGFzaCA9PT0gYi5oYXNoKSB7XG4gICAgLy8gL3BhZ2UjaGFzaCAtPiAvcGFnZSNoYXNoXG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSBpZiAoYi5oYXNoICE9PSBcIlwiKSB7XG4gICAgLy8gL3BhZ2UjaGFzaCAtPiAvcGFnZSNvdGhlclxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8vIElmIHRoZSBoYXNoIGlzIHJlbW92ZWQgdGhlIGJyb3dzZXIgd2lsbCByZS1wZXJmb3JtIGEgcmVxdWVzdCB0byB0aGUgc2VydmVyXG4gIC8vIC9wYWdlI2hhc2ggLT4gL3BhZ2VcbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gaXNEZWZlcnJlZFJlc3VsdChyZXN1bHQpIHtcbiAgcmV0dXJuIHJlc3VsdC50eXBlID09PSBSZXN1bHRUeXBlLmRlZmVycmVkO1xufVxuZnVuY3Rpb24gaXNFcnJvclJlc3VsdChyZXN1bHQpIHtcbiAgcmV0dXJuIHJlc3VsdC50eXBlID09PSBSZXN1bHRUeXBlLmVycm9yO1xufVxuZnVuY3Rpb24gaXNSZWRpcmVjdFJlc3VsdChyZXN1bHQpIHtcbiAgcmV0dXJuIChyZXN1bHQgJiYgcmVzdWx0LnR5cGUpID09PSBSZXN1bHRUeXBlLnJlZGlyZWN0O1xufVxuZnVuY3Rpb24gaXNEZWZlcnJlZERhdGEodmFsdWUpIHtcbiAgbGV0IGRlZmVycmVkID0gdmFsdWU7XG4gIHJldHVybiBkZWZlcnJlZCAmJiB0eXBlb2YgZGVmZXJyZWQgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIGRlZmVycmVkLmRhdGEgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIGRlZmVycmVkLnN1YnNjcmliZSA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBkZWZlcnJlZC5jYW5jZWwgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgZGVmZXJyZWQucmVzb2x2ZURhdGEgPT09IFwiZnVuY3Rpb25cIjtcbn1cbmZ1bmN0aW9uIGlzUmVzcG9uc2UodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgdHlwZW9mIHZhbHVlLnN0YXR1cyA9PT0gXCJudW1iZXJcIiAmJiB0eXBlb2YgdmFsdWUuc3RhdHVzVGV4dCA9PT0gXCJzdHJpbmdcIiAmJiB0eXBlb2YgdmFsdWUuaGVhZGVycyA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgdmFsdWUuYm9keSAhPT0gXCJ1bmRlZmluZWRcIjtcbn1cbmZ1bmN0aW9uIGlzUmVkaXJlY3RSZXNwb25zZShyZXN1bHQpIHtcbiAgaWYgKCFpc1Jlc3BvbnNlKHJlc3VsdCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgbGV0IHN0YXR1cyA9IHJlc3VsdC5zdGF0dXM7XG4gIGxldCBsb2NhdGlvbiA9IHJlc3VsdC5oZWFkZXJzLmdldChcIkxvY2F0aW9uXCIpO1xuICByZXR1cm4gc3RhdHVzID49IDMwMCAmJiBzdGF0dXMgPD0gMzk5ICYmIGxvY2F0aW9uICE9IG51bGw7XG59XG5mdW5jdGlvbiBpc1F1ZXJ5Um91dGVSZXNwb25zZShvYmopIHtcbiAgcmV0dXJuIG9iaiAmJiBpc1Jlc3BvbnNlKG9iai5yZXNwb25zZSkgJiYgKG9iai50eXBlID09PSBSZXN1bHRUeXBlLmRhdGEgfHwgb2JqLnR5cGUgPT09IFJlc3VsdFR5cGUuZXJyb3IpO1xufVxuZnVuY3Rpb24gaXNWYWxpZE1ldGhvZChtZXRob2QpIHtcbiAgcmV0dXJuIHZhbGlkUmVxdWVzdE1ldGhvZHMuaGFzKG1ldGhvZC50b0xvd2VyQ2FzZSgpKTtcbn1cbmZ1bmN0aW9uIGlzTXV0YXRpb25NZXRob2QobWV0aG9kKSB7XG4gIHJldHVybiB2YWxpZE11dGF0aW9uTWV0aG9kcy5oYXMobWV0aG9kLnRvTG93ZXJDYXNlKCkpO1xufVxuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZURlZmVycmVkUmVzdWx0cyhjdXJyZW50TWF0Y2hlcywgbWF0Y2hlc1RvTG9hZCwgcmVzdWx0cywgc2lnbmFscywgaXNGZXRjaGVyLCBjdXJyZW50TG9hZGVyRGF0YSkge1xuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgcmVzdWx0cy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBsZXQgcmVzdWx0ID0gcmVzdWx0c1tpbmRleF07XG4gICAgbGV0IG1hdGNoID0gbWF0Y2hlc1RvTG9hZFtpbmRleF07XG4gICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhIG1hdGNoLCB0aGVuIHdlIGNhbiBoYXZlIGEgZGVmZXJyZWQgcmVzdWx0IHRvIGRvXG4gICAgLy8gYW55dGhpbmcgd2l0aC4gIFRoaXMgaXMgZm9yIHJldmFsaWRhdGluZyBmZXRjaGVycyB3aGVyZSB0aGUgcm91dGUgd2FzXG4gICAgLy8gcmVtb3ZlZCBkdXJpbmcgSE1SXG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGxldCBjdXJyZW50TWF0Y2ggPSBjdXJyZW50TWF0Y2hlcy5maW5kKG0gPT4gbS5yb3V0ZS5pZCA9PT0gbWF0Y2gucm91dGUuaWQpO1xuICAgIGxldCBpc1JldmFsaWRhdGluZ0xvYWRlciA9IGN1cnJlbnRNYXRjaCAhPSBudWxsICYmICFpc05ld1JvdXRlSW5zdGFuY2UoY3VycmVudE1hdGNoLCBtYXRjaCkgJiYgKGN1cnJlbnRMb2FkZXJEYXRhICYmIGN1cnJlbnRMb2FkZXJEYXRhW21hdGNoLnJvdXRlLmlkXSkgIT09IHVuZGVmaW5lZDtcbiAgICBpZiAoaXNEZWZlcnJlZFJlc3VsdChyZXN1bHQpICYmIChpc0ZldGNoZXIgfHwgaXNSZXZhbGlkYXRpbmdMb2FkZXIpKSB7XG4gICAgICAvLyBOb3RlOiB3ZSBkbyBub3QgaGF2ZSB0byB0b3VjaCBhY3RpdmVEZWZlcnJlZHMgaGVyZSBzaW5jZSB3ZSByYWNlIHRoZW1cbiAgICAgIC8vIGFnYWluc3QgdGhlIHNpZ25hbCBpbiByZXNvbHZlRGVmZXJyZWREYXRhIGFuZCB0aGV5J2xsIGdldCBhYm9ydGVkXG4gICAgICAvLyB0aGVyZSBpZiBuZWVkZWRcbiAgICAgIGxldCBzaWduYWwgPSBzaWduYWxzW2luZGV4XTtcbiAgICAgIGludmFyaWFudChzaWduYWwsIFwiRXhwZWN0ZWQgYW4gQWJvcnRTaWduYWwgZm9yIHJldmFsaWRhdGluZyBmZXRjaGVyIGRlZmVycmVkIHJlc3VsdFwiKTtcbiAgICAgIGF3YWl0IHJlc29sdmVEZWZlcnJlZERhdGEocmVzdWx0LCBzaWduYWwsIGlzRmV0Y2hlcikudGhlbihyZXN1bHQgPT4ge1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgcmVzdWx0c1tpbmRleF0gPSByZXN1bHQgfHwgcmVzdWx0c1tpbmRleF07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZURlZmVycmVkRGF0YShyZXN1bHQsIHNpZ25hbCwgdW53cmFwKSB7XG4gIGlmICh1bndyYXAgPT09IHZvaWQgMCkge1xuICAgIHVud3JhcCA9IGZhbHNlO1xuICB9XG4gIGxldCBhYm9ydGVkID0gYXdhaXQgcmVzdWx0LmRlZmVycmVkRGF0YS5yZXNvbHZlRGF0YShzaWduYWwpO1xuICBpZiAoYWJvcnRlZCkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAodW53cmFwKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFJlc3VsdFR5cGUuZGF0YSxcbiAgICAgICAgZGF0YTogcmVzdWx0LmRlZmVycmVkRGF0YS51bndyYXBwZWREYXRhXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIEhhbmRsZSBhbnkgVHJhY2tlZFByb21pc2UuX2Vycm9yIHZhbHVlcyBlbmNvdW50ZXJlZCB3aGlsZSB1bndyYXBwaW5nXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBSZXN1bHRUeXBlLmVycm9yLFxuICAgICAgICBlcnJvcjogZVxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBSZXN1bHRUeXBlLmRhdGEsXG4gICAgZGF0YTogcmVzdWx0LmRlZmVycmVkRGF0YS5kYXRhXG4gIH07XG59XG5mdW5jdGlvbiBoYXNOYWtlZEluZGV4UXVlcnkoc2VhcmNoKSB7XG4gIHJldHVybiBuZXcgVVJMU2VhcmNoUGFyYW1zKHNlYXJjaCkuZ2V0QWxsKFwiaW5kZXhcIikuc29tZSh2ID0+IHYgPT09IFwiXCIpO1xufVxuZnVuY3Rpb24gZ2V0VGFyZ2V0TWF0Y2gobWF0Y2hlcywgbG9jYXRpb24pIHtcbiAgbGV0IHNlYXJjaCA9IHR5cGVvZiBsb2NhdGlvbiA9PT0gXCJzdHJpbmdcIiA/IHBhcnNlUGF0aChsb2NhdGlvbikuc2VhcmNoIDogbG9jYXRpb24uc2VhcmNoO1xuICBpZiAobWF0Y2hlc1ttYXRjaGVzLmxlbmd0aCAtIDFdLnJvdXRlLmluZGV4ICYmIGhhc05ha2VkSW5kZXhRdWVyeShzZWFyY2ggfHwgXCJcIikpIHtcbiAgICAvLyBSZXR1cm4gdGhlIGxlYWYgaW5kZXggcm91dGUgd2hlbiBpbmRleCBpcyBwcmVzZW50XG4gICAgcmV0dXJuIG1hdGNoZXNbbWF0Y2hlcy5sZW5ndGggLSAxXTtcbiAgfVxuICAvLyBPdGhlcndpc2UgZ3JhYiB0aGUgZGVlcGVzdCBcInBhdGggY29udHJpYnV0aW5nXCIgbWF0Y2ggKGlnbm9yaW5nIGluZGV4IGFuZFxuICAvLyBwYXRobGVzcyBsYXlvdXQgcm91dGVzKVxuICBsZXQgcGF0aE1hdGNoZXMgPSBnZXRQYXRoQ29udHJpYnV0aW5nTWF0Y2hlcyhtYXRjaGVzKTtcbiAgcmV0dXJuIHBhdGhNYXRjaGVzW3BhdGhNYXRjaGVzLmxlbmd0aCAtIDFdO1xufVxuZnVuY3Rpb24gZ2V0U3VibWlzc2lvbkZyb21OYXZpZ2F0aW9uKG5hdmlnYXRpb24pIHtcbiAgbGV0IHtcbiAgICBmb3JtTWV0aG9kLFxuICAgIGZvcm1BY3Rpb24sXG4gICAgZm9ybUVuY1R5cGUsXG4gICAgdGV4dCxcbiAgICBmb3JtRGF0YSxcbiAgICBqc29uXG4gIH0gPSBuYXZpZ2F0aW9uO1xuICBpZiAoIWZvcm1NZXRob2QgfHwgIWZvcm1BY3Rpb24gfHwgIWZvcm1FbmNUeXBlKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICh0ZXh0ICE9IG51bGwpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZm9ybU1ldGhvZCxcbiAgICAgIGZvcm1BY3Rpb24sXG4gICAgICBmb3JtRW5jVHlwZSxcbiAgICAgIGZvcm1EYXRhOiB1bmRlZmluZWQsXG4gICAgICBqc29uOiB1bmRlZmluZWQsXG4gICAgICB0ZXh0XG4gICAgfTtcbiAgfSBlbHNlIGlmIChmb3JtRGF0YSAhPSBudWxsKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZvcm1NZXRob2QsXG4gICAgICBmb3JtQWN0aW9uLFxuICAgICAgZm9ybUVuY1R5cGUsXG4gICAgICBmb3JtRGF0YSxcbiAgICAgIGpzb246IHVuZGVmaW5lZCxcbiAgICAgIHRleHQ6IHVuZGVmaW5lZFxuICAgIH07XG4gIH0gZWxzZSBpZiAoanNvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZvcm1NZXRob2QsXG4gICAgICBmb3JtQWN0aW9uLFxuICAgICAgZm9ybUVuY1R5cGUsXG4gICAgICBmb3JtRGF0YTogdW5kZWZpbmVkLFxuICAgICAganNvbixcbiAgICAgIHRleHQ6IHVuZGVmaW5lZFxuICAgIH07XG4gIH1cbn1cbmZ1bmN0aW9uIGdldExvYWRpbmdOYXZpZ2F0aW9uKGxvY2F0aW9uLCBzdWJtaXNzaW9uKSB7XG4gIGlmIChzdWJtaXNzaW9uKSB7XG4gICAgbGV0IG5hdmlnYXRpb24gPSB7XG4gICAgICBzdGF0ZTogXCJsb2FkaW5nXCIsXG4gICAgICBsb2NhdGlvbixcbiAgICAgIGZvcm1NZXRob2Q6IHN1Ym1pc3Npb24uZm9ybU1ldGhvZCxcbiAgICAgIGZvcm1BY3Rpb246IHN1Ym1pc3Npb24uZm9ybUFjdGlvbixcbiAgICAgIGZvcm1FbmNUeXBlOiBzdWJtaXNzaW9uLmZvcm1FbmNUeXBlLFxuICAgICAgZm9ybURhdGE6IHN1Ym1pc3Npb24uZm9ybURhdGEsXG4gICAgICBqc29uOiBzdWJtaXNzaW9uLmpzb24sXG4gICAgICB0ZXh0OiBzdWJtaXNzaW9uLnRleHRcbiAgICB9O1xuICAgIHJldHVybiBuYXZpZ2F0aW9uO1xuICB9IGVsc2Uge1xuICAgIGxldCBuYXZpZ2F0aW9uID0ge1xuICAgICAgc3RhdGU6IFwibG9hZGluZ1wiLFxuICAgICAgbG9jYXRpb24sXG4gICAgICBmb3JtTWV0aG9kOiB1bmRlZmluZWQsXG4gICAgICBmb3JtQWN0aW9uOiB1bmRlZmluZWQsXG4gICAgICBmb3JtRW5jVHlwZTogdW5kZWZpbmVkLFxuICAgICAgZm9ybURhdGE6IHVuZGVmaW5lZCxcbiAgICAgIGpzb246IHVuZGVmaW5lZCxcbiAgICAgIHRleHQ6IHVuZGVmaW5lZFxuICAgIH07XG4gICAgcmV0dXJuIG5hdmlnYXRpb247XG4gIH1cbn1cbmZ1bmN0aW9uIGdldFN1Ym1pdHRpbmdOYXZpZ2F0aW9uKGxvY2F0aW9uLCBzdWJtaXNzaW9uKSB7XG4gIGxldCBuYXZpZ2F0aW9uID0ge1xuICAgIHN0YXRlOiBcInN1Ym1pdHRpbmdcIixcbiAgICBsb2NhdGlvbixcbiAgICBmb3JtTWV0aG9kOiBzdWJtaXNzaW9uLmZvcm1NZXRob2QsXG4gICAgZm9ybUFjdGlvbjogc3VibWlzc2lvbi5mb3JtQWN0aW9uLFxuICAgIGZvcm1FbmNUeXBlOiBzdWJtaXNzaW9uLmZvcm1FbmNUeXBlLFxuICAgIGZvcm1EYXRhOiBzdWJtaXNzaW9uLmZvcm1EYXRhLFxuICAgIGpzb246IHN1Ym1pc3Npb24uanNvbixcbiAgICB0ZXh0OiBzdWJtaXNzaW9uLnRleHRcbiAgfTtcbiAgcmV0dXJuIG5hdmlnYXRpb247XG59XG5mdW5jdGlvbiBnZXRMb2FkaW5nRmV0Y2hlcihzdWJtaXNzaW9uLCBkYXRhKSB7XG4gIGlmIChzdWJtaXNzaW9uKSB7XG4gICAgbGV0IGZldGNoZXIgPSB7XG4gICAgICBzdGF0ZTogXCJsb2FkaW5nXCIsXG4gICAgICBmb3JtTWV0aG9kOiBzdWJtaXNzaW9uLmZvcm1NZXRob2QsXG4gICAgICBmb3JtQWN0aW9uOiBzdWJtaXNzaW9uLmZvcm1BY3Rpb24sXG4gICAgICBmb3JtRW5jVHlwZTogc3VibWlzc2lvbi5mb3JtRW5jVHlwZSxcbiAgICAgIGZvcm1EYXRhOiBzdWJtaXNzaW9uLmZvcm1EYXRhLFxuICAgICAganNvbjogc3VibWlzc2lvbi5qc29uLFxuICAgICAgdGV4dDogc3VibWlzc2lvbi50ZXh0LFxuICAgICAgZGF0YVxuICAgIH07XG4gICAgcmV0dXJuIGZldGNoZXI7XG4gIH0gZWxzZSB7XG4gICAgbGV0IGZldGNoZXIgPSB7XG4gICAgICBzdGF0ZTogXCJsb2FkaW5nXCIsXG4gICAgICBmb3JtTWV0aG9kOiB1bmRlZmluZWQsXG4gICAgICBmb3JtQWN0aW9uOiB1bmRlZmluZWQsXG4gICAgICBmb3JtRW5jVHlwZTogdW5kZWZpbmVkLFxuICAgICAgZm9ybURhdGE6IHVuZGVmaW5lZCxcbiAgICAgIGpzb246IHVuZGVmaW5lZCxcbiAgICAgIHRleHQ6IHVuZGVmaW5lZCxcbiAgICAgIGRhdGFcbiAgICB9O1xuICAgIHJldHVybiBmZXRjaGVyO1xuICB9XG59XG5mdW5jdGlvbiBnZXRTdWJtaXR0aW5nRmV0Y2hlcihzdWJtaXNzaW9uLCBleGlzdGluZ0ZldGNoZXIpIHtcbiAgbGV0IGZldGNoZXIgPSB7XG4gICAgc3RhdGU6IFwic3VibWl0dGluZ1wiLFxuICAgIGZvcm1NZXRob2Q6IHN1Ym1pc3Npb24uZm9ybU1ldGhvZCxcbiAgICBmb3JtQWN0aW9uOiBzdWJtaXNzaW9uLmZvcm1BY3Rpb24sXG4gICAgZm9ybUVuY1R5cGU6IHN1Ym1pc3Npb24uZm9ybUVuY1R5cGUsXG4gICAgZm9ybURhdGE6IHN1Ym1pc3Npb24uZm9ybURhdGEsXG4gICAganNvbjogc3VibWlzc2lvbi5qc29uLFxuICAgIHRleHQ6IHN1Ym1pc3Npb24udGV4dCxcbiAgICBkYXRhOiBleGlzdGluZ0ZldGNoZXIgPyBleGlzdGluZ0ZldGNoZXIuZGF0YSA6IHVuZGVmaW5lZFxuICB9O1xuICByZXR1cm4gZmV0Y2hlcjtcbn1cbmZ1bmN0aW9uIGdldERvbmVGZXRjaGVyKGRhdGEpIHtcbiAgbGV0IGZldGNoZXIgPSB7XG4gICAgc3RhdGU6IFwiaWRsZVwiLFxuICAgIGZvcm1NZXRob2Q6IHVuZGVmaW5lZCxcbiAgICBmb3JtQWN0aW9uOiB1bmRlZmluZWQsXG4gICAgZm9ybUVuY1R5cGU6IHVuZGVmaW5lZCxcbiAgICBmb3JtRGF0YTogdW5kZWZpbmVkLFxuICAgIGpzb246IHVuZGVmaW5lZCxcbiAgICB0ZXh0OiB1bmRlZmluZWQsXG4gICAgZGF0YVxuICB9O1xuICByZXR1cm4gZmV0Y2hlcjtcbn1cbmZ1bmN0aW9uIHJlc3RvcmVBcHBsaWVkVHJhbnNpdGlvbnMoX3dpbmRvdywgdHJhbnNpdGlvbnMpIHtcbiAgdHJ5IHtcbiAgICBsZXQgc2Vzc2lvblBvc2l0aW9ucyA9IF93aW5kb3cuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShUUkFOU0lUSU9OU19TVE9SQUdFX0tFWSk7XG4gICAgaWYgKHNlc3Npb25Qb3NpdGlvbnMpIHtcbiAgICAgIGxldCBqc29uID0gSlNPTi5wYXJzZShzZXNzaW9uUG9zaXRpb25zKTtcbiAgICAgIGZvciAobGV0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhqc29uIHx8IHt9KSkge1xuICAgICAgICBpZiAodiAmJiBBcnJheS5pc0FycmF5KHYpKSB7XG4gICAgICAgICAgdHJhbnNpdGlvbnMuc2V0KGssIG5ldyBTZXQodiB8fCBbXSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gbm8tb3AsIHVzZSBkZWZhdWx0IGVtcHR5IG9iamVjdFxuICB9XG59XG5mdW5jdGlvbiBwZXJzaXN0QXBwbGllZFRyYW5zaXRpb25zKF93aW5kb3csIHRyYW5zaXRpb25zKSB7XG4gIGlmICh0cmFuc2l0aW9ucy5zaXplID4gMCkge1xuICAgIGxldCBqc29uID0ge307XG4gICAgZm9yIChsZXQgW2ssIHZdIG9mIHRyYW5zaXRpb25zKSB7XG4gICAgICBqc29uW2tdID0gWy4uLnZdO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgX3dpbmRvdy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFRSQU5TSVRJT05TX1NUT1JBR0VfS0VZLCBKU09OLnN0cmluZ2lmeShqc29uKSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHdhcm5pbmcoZmFsc2UsIFwiRmFpbGVkIHRvIHNhdmUgYXBwbGllZCB2aWV3IHRyYW5zaXRpb25zIGluIHNlc3Npb25TdG9yYWdlIChcIiArIGVycm9yICsgXCIpLlwiKTtcbiAgICB9XG4gIH1cbn1cbi8vI2VuZHJlZ2lvblxuXG5leHBvcnQgeyBBYm9ydGVkRGVmZXJyZWRFcnJvciwgQWN0aW9uLCBJRExFX0JMT0NLRVIsIElETEVfRkVUQ0hFUiwgSURMRV9OQVZJR0FUSU9OLCBVTlNBRkVfREVGRVJSRURfU1lNQk9MLCBEZWZlcnJlZERhdGEgYXMgVU5TQUZFX0RlZmVycmVkRGF0YSwgRXJyb3JSZXNwb25zZUltcGwgYXMgVU5TQUZFX0Vycm9yUmVzcG9uc2VJbXBsLCBjb252ZXJ0Um91dGVNYXRjaFRvVWlNYXRjaCBhcyBVTlNBRkVfY29udmVydFJvdXRlTWF0Y2hUb1VpTWF0Y2gsIGNvbnZlcnRSb3V0ZXNUb0RhdGFSb3V0ZXMgYXMgVU5TQUZFX2NvbnZlcnRSb3V0ZXNUb0RhdGFSb3V0ZXMsIGdldFBhdGhDb250cmlidXRpbmdNYXRjaGVzIGFzIFVOU0FGRV9nZXRQYXRoQ29udHJpYnV0aW5nTWF0Y2hlcywgaW52YXJpYW50IGFzIFVOU0FGRV9pbnZhcmlhbnQsIHdhcm5pbmcgYXMgVU5TQUZFX3dhcm5pbmcsIGNyZWF0ZUJyb3dzZXJIaXN0b3J5LCBjcmVhdGVIYXNoSGlzdG9yeSwgY3JlYXRlTWVtb3J5SGlzdG9yeSwgY3JlYXRlUGF0aCwgY3JlYXRlUm91dGVyLCBjcmVhdGVTdGF0aWNIYW5kbGVyLCBkZWZlciwgZ2VuZXJhdGVQYXRoLCBnZXRTdGF0aWNDb250ZXh0RnJvbUVycm9yLCBnZXRUb1BhdGhuYW1lLCBpc0RlZmVycmVkRGF0YSwgaXNSb3V0ZUVycm9yUmVzcG9uc2UsIGpvaW5QYXRocywganNvbiwgbWF0Y2hQYXRoLCBtYXRjaFJvdXRlcywgbm9ybWFsaXplUGF0aG5hbWUsIHBhcnNlUGF0aCwgcmVkaXJlY3QsIHJlZGlyZWN0RG9jdW1lbnQsIHJlc29sdmVQYXRoLCByZXNvbHZlVG8sIHN0cmlwQmFzZW5hbWUgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJvdXRlci5qcy5tYXBcbiIsIi8qKlxuICogUmVhY3QgUm91dGVyIHY2LjIwLjFcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIFJlbWl4IFNvZnR3YXJlIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UubWQgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgVU5TQUZFX2ludmFyaWFudCwgam9pblBhdGhzLCBtYXRjaFBhdGgsIFVOU0FGRV9nZXRQYXRoQ29udHJpYnV0aW5nTWF0Y2hlcywgVU5TQUZFX3dhcm5pbmcsIHJlc29sdmVUbywgcGFyc2VQYXRoLCBtYXRjaFJvdXRlcywgQWN0aW9uLCBVTlNBRkVfY29udmVydFJvdXRlTWF0Y2hUb1VpTWF0Y2gsIHN0cmlwQmFzZW5hbWUsIElETEVfQkxPQ0tFUiwgaXNSb3V0ZUVycm9yUmVzcG9uc2UsIGNyZWF0ZU1lbW9yeUhpc3RvcnksIEFib3J0ZWREZWZlcnJlZEVycm9yLCBjcmVhdGVSb3V0ZXIgfSBmcm9tICdAcmVtaXgtcnVuL3JvdXRlcic7XG5leHBvcnQgeyBBYm9ydGVkRGVmZXJyZWRFcnJvciwgQWN0aW9uIGFzIE5hdmlnYXRpb25UeXBlLCBjcmVhdGVQYXRoLCBkZWZlciwgZ2VuZXJhdGVQYXRoLCBpc1JvdXRlRXJyb3JSZXNwb25zZSwganNvbiwgbWF0Y2hQYXRoLCBtYXRjaFJvdXRlcywgcGFyc2VQYXRoLCByZWRpcmVjdCwgcmVkaXJlY3REb2N1bWVudCwgcmVzb2x2ZVBhdGggfSBmcm9tICdAcmVtaXgtcnVuL3JvdXRlcic7XG5cbmZ1bmN0aW9uIF9leHRlbmRzKCkge1xuICBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gPyBPYmplY3QuYXNzaWduLmJpbmQoKSA6IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHtcbiAgICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXQ7XG4gIH07XG4gIHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG4vLyBDcmVhdGUgcmVhY3Qtc3BlY2lmaWMgdHlwZXMgZnJvbSB0aGUgYWdub3N0aWMgdHlwZXMgaW4gQHJlbWl4LXJ1bi9yb3V0ZXIgdG9cbi8vIGV4cG9ydCBmcm9tIHJlYWN0LXJvdXRlclxuY29uc3QgRGF0YVJvdXRlckNvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgRGF0YVJvdXRlckNvbnRleHQuZGlzcGxheU5hbWUgPSBcIkRhdGFSb3V0ZXJcIjtcbn1cbmNvbnN0IERhdGFSb3V0ZXJTdGF0ZUNvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgRGF0YVJvdXRlclN0YXRlQ29udGV4dC5kaXNwbGF5TmFtZSA9IFwiRGF0YVJvdXRlclN0YXRlXCI7XG59XG5jb25zdCBBd2FpdENvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgQXdhaXRDb250ZXh0LmRpc3BsYXlOYW1lID0gXCJBd2FpdFwiO1xufVxuXG4vKipcbiAqIEEgTmF2aWdhdG9yIGlzIGEgXCJsb2NhdGlvbiBjaGFuZ2VyXCI7IGl0J3MgaG93IHlvdSBnZXQgdG8gZGlmZmVyZW50IGxvY2F0aW9ucy5cbiAqXG4gKiBFdmVyeSBoaXN0b3J5IGluc3RhbmNlIGNvbmZvcm1zIHRvIHRoZSBOYXZpZ2F0b3IgaW50ZXJmYWNlLCBidXQgdGhlXG4gKiBkaXN0aW5jdGlvbiBpcyB1c2VmdWwgcHJpbWFyaWx5IHdoZW4gaXQgY29tZXMgdG8gdGhlIGxvdy1sZXZlbCBgPFJvdXRlcj5gIEFQSVxuICogd2hlcmUgYm90aCB0aGUgbG9jYXRpb24gYW5kIGEgbmF2aWdhdG9yIG11c3QgYmUgcHJvdmlkZWQgc2VwYXJhdGVseSBpbiBvcmRlclxuICogdG8gYXZvaWQgXCJ0ZWFyaW5nXCIgdGhhdCBtYXkgb2NjdXIgaW4gYSBzdXNwZW5zZS1lbmFibGVkIGFwcCBpZiB0aGUgYWN0aW9uXG4gKiBhbmQvb3IgbG9jYXRpb24gd2VyZSB0byBiZSByZWFkIGRpcmVjdGx5IGZyb20gdGhlIGhpc3RvcnkgaW5zdGFuY2UuXG4gKi9cblxuY29uc3QgTmF2aWdhdGlvbkNvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgTmF2aWdhdGlvbkNvbnRleHQuZGlzcGxheU5hbWUgPSBcIk5hdmlnYXRpb25cIjtcbn1cbmNvbnN0IExvY2F0aW9uQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KG51bGwpO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICBMb2NhdGlvbkNvbnRleHQuZGlzcGxheU5hbWUgPSBcIkxvY2F0aW9uXCI7XG59XG5jb25zdCBSb3V0ZUNvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dCh7XG4gIG91dGxldDogbnVsbCxcbiAgbWF0Y2hlczogW10sXG4gIGlzRGF0YVJvdXRlOiBmYWxzZVxufSk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIFJvdXRlQ29udGV4dC5kaXNwbGF5TmFtZSA9IFwiUm91dGVcIjtcbn1cbmNvbnN0IFJvdXRlRXJyb3JDb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQobnVsbCk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIFJvdXRlRXJyb3JDb250ZXh0LmRpc3BsYXlOYW1lID0gXCJSb3V0ZUVycm9yXCI7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZnVsbCBocmVmIGZvciB0aGUgZ2l2ZW4gXCJ0b1wiIHZhbHVlLiBUaGlzIGlzIHVzZWZ1bCBmb3IgYnVpbGRpbmdcbiAqIGN1c3RvbSBsaW5rcyB0aGF0IGFyZSBhbHNvIGFjY2Vzc2libGUgYW5kIHByZXNlcnZlIHJpZ2h0LWNsaWNrIGJlaGF2aW9yLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9yZWFjdHJvdXRlci5jb20vaG9va3MvdXNlLWhyZWZcbiAqL1xuZnVuY3Rpb24gdXNlSHJlZih0bywgX3RlbXApIHtcbiAgbGV0IHtcbiAgICByZWxhdGl2ZVxuICB9ID0gX3RlbXAgPT09IHZvaWQgMCA/IHt9IDogX3RlbXA7XG4gICF1c2VJblJvdXRlckNvbnRleHQoKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IFVOU0FGRV9pbnZhcmlhbnQoZmFsc2UsIC8vIFRPRE86IFRoaXMgZXJyb3IgaXMgcHJvYmFibHkgYmVjYXVzZSB0aGV5IHNvbWVob3cgaGF2ZSAyIHZlcnNpb25zIG9mIHRoZVxuICAvLyByb3V0ZXIgbG9hZGVkLiBXZSBjYW4gaGVscCB0aGVtIHVuZGVyc3RhbmQgaG93IHRvIGF2b2lkIHRoYXQuXG4gIFwidXNlSHJlZigpIG1heSBiZSB1c2VkIG9ubHkgaW4gdGhlIGNvbnRleHQgb2YgYSA8Um91dGVyPiBjb21wb25lbnQuXCIpIDogVU5TQUZFX2ludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG4gIGxldCB7XG4gICAgYmFzZW5hbWUsXG4gICAgbmF2aWdhdG9yXG4gIH0gPSBSZWFjdC51c2VDb250ZXh0KE5hdmlnYXRpb25Db250ZXh0KTtcbiAgbGV0IHtcbiAgICBoYXNoLFxuICAgIHBhdGhuYW1lLFxuICAgIHNlYXJjaFxuICB9ID0gdXNlUmVzb2x2ZWRQYXRoKHRvLCB7XG4gICAgcmVsYXRpdmVcbiAgfSk7XG4gIGxldCBqb2luZWRQYXRobmFtZSA9IHBhdGhuYW1lO1xuXG4gIC8vIElmIHdlJ3JlIG9wZXJhdGluZyB3aXRoaW4gYSBiYXNlbmFtZSwgcHJlcGVuZCBpdCB0byB0aGUgcGF0aG5hbWUgcHJpb3JcbiAgLy8gdG8gY3JlYXRpbmcgdGhlIGhyZWYuICBJZiB0aGlzIGlzIGEgcm9vdCBuYXZpZ2F0aW9uLCB0aGVuIGp1c3QgdXNlIHRoZSByYXdcbiAgLy8gYmFzZW5hbWUgd2hpY2ggYWxsb3dzIHRoZSBiYXNlbmFtZSB0byBoYXZlIGZ1bGwgY29udHJvbCBvdmVyIHRoZSBwcmVzZW5jZVxuICAvLyBvZiBhIHRyYWlsaW5nIHNsYXNoIG9uIHJvb3QgbGlua3NcbiAgaWYgKGJhc2VuYW1lICE9PSBcIi9cIikge1xuICAgIGpvaW5lZFBhdGhuYW1lID0gcGF0aG5hbWUgPT09IFwiL1wiID8gYmFzZW5hbWUgOiBqb2luUGF0aHMoW2Jhc2VuYW1lLCBwYXRobmFtZV0pO1xuICB9XG4gIHJldHVybiBuYXZpZ2F0b3IuY3JlYXRlSHJlZih7XG4gICAgcGF0aG5hbWU6IGpvaW5lZFBhdGhuYW1lLFxuICAgIHNlYXJjaCxcbiAgICBoYXNoXG4gIH0pO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGNvbXBvbmVudCBpcyBhIGRlc2NlbmRhbnQgb2YgYSBgPFJvdXRlcj5gLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9yZWFjdHJvdXRlci5jb20vaG9va3MvdXNlLWluLXJvdXRlci1jb250ZXh0XG4gKi9cbmZ1bmN0aW9uIHVzZUluUm91dGVyQ29udGV4dCgpIHtcbiAgcmV0dXJuIFJlYWN0LnVzZUNvbnRleHQoTG9jYXRpb25Db250ZXh0KSAhPSBudWxsO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGN1cnJlbnQgbG9jYXRpb24gb2JqZWN0LCB3aGljaCByZXByZXNlbnRzIHRoZSBjdXJyZW50IFVSTCBpbiB3ZWJcbiAqIGJyb3dzZXJzLlxuICpcbiAqIE5vdGU6IElmIHlvdSdyZSB1c2luZyB0aGlzIGl0IG1heSBtZWFuIHlvdSdyZSBkb2luZyBzb21lIG9mIHlvdXIgb3duXG4gKiBcInJvdXRpbmdcIiBpbiB5b3VyIGFwcCwgYW5kIHdlJ2QgbGlrZSB0byBrbm93IHdoYXQgeW91ciB1c2UgY2FzZSBpcy4gV2UgbWF5XG4gKiBiZSBhYmxlIHRvIHByb3ZpZGUgc29tZXRoaW5nIGhpZ2hlci1sZXZlbCB0byBiZXR0ZXIgc3VpdCB5b3VyIG5lZWRzLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9yZWFjdHJvdXRlci5jb20vaG9va3MvdXNlLWxvY2F0aW9uXG4gKi9cbmZ1bmN0aW9uIHVzZUxvY2F0aW9uKCkge1xuICAhdXNlSW5Sb3V0ZXJDb250ZXh0KCkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBVTlNBRkVfaW52YXJpYW50KGZhbHNlLCAvLyBUT0RPOiBUaGlzIGVycm9yIGlzIHByb2JhYmx5IGJlY2F1c2UgdGhleSBzb21laG93IGhhdmUgMiB2ZXJzaW9ucyBvZiB0aGVcbiAgLy8gcm91dGVyIGxvYWRlZC4gV2UgY2FuIGhlbHAgdGhlbSB1bmRlcnN0YW5kIGhvdyB0byBhdm9pZCB0aGF0LlxuICBcInVzZUxvY2F0aW9uKCkgbWF5IGJlIHVzZWQgb25seSBpbiB0aGUgY29udGV4dCBvZiBhIDxSb3V0ZXI+IGNvbXBvbmVudC5cIikgOiBVTlNBRkVfaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgcmV0dXJuIFJlYWN0LnVzZUNvbnRleHQoTG9jYXRpb25Db250ZXh0KS5sb2NhdGlvbjtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjdXJyZW50IG5hdmlnYXRpb24gYWN0aW9uIHdoaWNoIGRlc2NyaWJlcyBob3cgdGhlIHJvdXRlciBjYW1lIHRvXG4gKiB0aGUgY3VycmVudCBsb2NhdGlvbiwgZWl0aGVyIGJ5IGEgcG9wLCBwdXNoLCBvciByZXBsYWNlIG9uIHRoZSBoaXN0b3J5IHN0YWNrLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9yZWFjdHJvdXRlci5jb20vaG9va3MvdXNlLW5hdmlnYXRpb24tdHlwZVxuICovXG5mdW5jdGlvbiB1c2VOYXZpZ2F0aW9uVHlwZSgpIHtcbiAgcmV0dXJuIFJlYWN0LnVzZUNvbnRleHQoTG9jYXRpb25Db250ZXh0KS5uYXZpZ2F0aW9uVHlwZTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgUGF0aE1hdGNoIG9iamVjdCBpZiB0aGUgZ2l2ZW4gcGF0dGVybiBtYXRjaGVzIHRoZSBjdXJyZW50IFVSTC5cbiAqIFRoaXMgaXMgdXNlZnVsIGZvciBjb21wb25lbnRzIHRoYXQgbmVlZCB0byBrbm93IFwiYWN0aXZlXCIgc3RhdGUsIGUuZy5cbiAqIGA8TmF2TGluaz5gLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9yZWFjdHJvdXRlci5jb20vaG9va3MvdXNlLW1hdGNoXG4gKi9cbmZ1bmN0aW9uIHVzZU1hdGNoKHBhdHRlcm4pIHtcbiAgIXVzZUluUm91dGVyQ29udGV4dCgpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gVU5TQUZFX2ludmFyaWFudChmYWxzZSwgLy8gVE9ETzogVGhpcyBlcnJvciBpcyBwcm9iYWJseSBiZWNhdXNlIHRoZXkgc29tZWhvdyBoYXZlIDIgdmVyc2lvbnMgb2YgdGhlXG4gIC8vIHJvdXRlciBsb2FkZWQuIFdlIGNhbiBoZWxwIHRoZW0gdW5kZXJzdGFuZCBob3cgdG8gYXZvaWQgdGhhdC5cbiAgXCJ1c2VNYXRjaCgpIG1heSBiZSB1c2VkIG9ubHkgaW4gdGhlIGNvbnRleHQgb2YgYSA8Um91dGVyPiBjb21wb25lbnQuXCIpIDogVU5TQUZFX2ludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG4gIGxldCB7XG4gICAgcGF0aG5hbWVcbiAgfSA9IHVzZUxvY2F0aW9uKCk7XG4gIHJldHVybiBSZWFjdC51c2VNZW1vKCgpID0+IG1hdGNoUGF0aChwYXR0ZXJuLCBwYXRobmFtZSksIFtwYXRobmFtZSwgcGF0dGVybl0pO1xufVxuXG4vKipcbiAqIFRoZSBpbnRlcmZhY2UgZm9yIHRoZSBuYXZpZ2F0ZSgpIGZ1bmN0aW9uIHJldHVybmVkIGZyb20gdXNlTmF2aWdhdGUoKS5cbiAqL1xuXG5jb25zdCBuYXZpZ2F0ZUVmZmVjdFdhcm5pbmcgPSBcIllvdSBzaG91bGQgY2FsbCBuYXZpZ2F0ZSgpIGluIGEgUmVhY3QudXNlRWZmZWN0KCksIG5vdCB3aGVuIFwiICsgXCJ5b3VyIGNvbXBvbmVudCBpcyBmaXJzdCByZW5kZXJlZC5cIjtcblxuLy8gTXV0ZSB3YXJuaW5ncyBmb3IgY2FsbHMgdG8gdXNlTmF2aWdhdGUgaW4gU1NSIGVudmlyb25tZW50c1xuZnVuY3Rpb24gdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdChjYikge1xuICBsZXQgaXNTdGF0aWMgPSBSZWFjdC51c2VDb250ZXh0KE5hdmlnYXRpb25Db250ZXh0KS5zdGF0aWM7XG4gIGlmICghaXNTdGF0aWMpIHtcbiAgICAvLyBXZSBzaG91bGQgYmUgYWJsZSB0byBnZXQgcmlkIG9mIHRoaXMgb25jZSByZWFjdCAxOC4zIGlzIHJlbGVhc2VkXG4gICAgLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC8yNjM5NVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9ydWxlcy1vZi1ob29rc1xuICAgIFJlYWN0LnVzZUxheW91dEVmZmVjdChjYik7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGFuIGltcGVyYXRpdmUgbWV0aG9kIGZvciBjaGFuZ2luZyB0aGUgbG9jYXRpb24uIFVzZWQgYnkgYDxMaW5rPmBzLCBidXRcbiAqIG1heSBhbHNvIGJlIHVzZWQgYnkgb3RoZXIgZWxlbWVudHMgdG8gY2hhbmdlIHRoZSBsb2NhdGlvbi5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vcmVhY3Ryb3V0ZXIuY29tL2hvb2tzL3VzZS1uYXZpZ2F0ZVxuICovXG5mdW5jdGlvbiB1c2VOYXZpZ2F0ZSgpIHtcbiAgbGV0IHtcbiAgICBpc0RhdGFSb3V0ZVxuICB9ID0gUmVhY3QudXNlQ29udGV4dChSb3V0ZUNvbnRleHQpO1xuICAvLyBDb25kaXRpb25hbCB1c2FnZSBpcyBPSyBoZXJlIGJlY2F1c2UgdGhlIHVzYWdlIG9mIGEgZGF0YSByb3V0ZXIgaXMgc3RhdGljXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9ydWxlcy1vZi1ob29rc1xuICByZXR1cm4gaXNEYXRhUm91dGUgPyB1c2VOYXZpZ2F0ZVN0YWJsZSgpIDogdXNlTmF2aWdhdGVVbnN0YWJsZSgpO1xufVxuZnVuY3Rpb24gdXNlTmF2aWdhdGVVbnN0YWJsZSgpIHtcbiAgIXVzZUluUm91dGVyQ29udGV4dCgpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gVU5TQUZFX2ludmFyaWFudChmYWxzZSwgLy8gVE9ETzogVGhpcyBlcnJvciBpcyBwcm9iYWJseSBiZWNhdXNlIHRoZXkgc29tZWhvdyBoYXZlIDIgdmVyc2lvbnMgb2YgdGhlXG4gIC8vIHJvdXRlciBsb2FkZWQuIFdlIGNhbiBoZWxwIHRoZW0gdW5kZXJzdGFuZCBob3cgdG8gYXZvaWQgdGhhdC5cbiAgXCJ1c2VOYXZpZ2F0ZSgpIG1heSBiZSB1c2VkIG9ubHkgaW4gdGhlIGNvbnRleHQgb2YgYSA8Um91dGVyPiBjb21wb25lbnQuXCIpIDogVU5TQUZFX2ludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG4gIGxldCBkYXRhUm91dGVyQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoRGF0YVJvdXRlckNvbnRleHQpO1xuICBsZXQge1xuICAgIGJhc2VuYW1lLFxuICAgIG5hdmlnYXRvclxuICB9ID0gUmVhY3QudXNlQ29udGV4dChOYXZpZ2F0aW9uQ29udGV4dCk7XG4gIGxldCB7XG4gICAgbWF0Y2hlc1xuICB9ID0gUmVhY3QudXNlQ29udGV4dChSb3V0ZUNvbnRleHQpO1xuICBsZXQge1xuICAgIHBhdGhuYW1lOiBsb2NhdGlvblBhdGhuYW1lXG4gIH0gPSB1c2VMb2NhdGlvbigpO1xuICBsZXQgcm91dGVQYXRobmFtZXNKc29uID0gSlNPTi5zdHJpbmdpZnkoVU5TQUZFX2dldFBhdGhDb250cmlidXRpbmdNYXRjaGVzKG1hdGNoZXMpLm1hcChtYXRjaCA9PiBtYXRjaC5wYXRobmFtZUJhc2UpKTtcbiAgbGV0IGFjdGl2ZVJlZiA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG4gIHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QoKCkgPT4ge1xuICAgIGFjdGl2ZVJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgfSk7XG4gIGxldCBuYXZpZ2F0ZSA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uICh0bywgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICB9XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gVU5TQUZFX3dhcm5pbmcoYWN0aXZlUmVmLmN1cnJlbnQsIG5hdmlnYXRlRWZmZWN0V2FybmluZykgOiB2b2lkIDA7XG5cbiAgICAvLyBTaG9ydCBjaXJjdWl0IGhlcmUgc2luY2UgaWYgdGhpcyBoYXBwZW5zIG9uIGZpcnN0IHJlbmRlciB0aGUgbmF2aWdhdGVcbiAgICAvLyBpcyB1c2VsZXNzIGJlY2F1c2Ugd2UgaGF2ZW4ndCB3aXJlZCB1cCBvdXIgaGlzdG9yeSBsaXN0ZW5lciB5ZXRcbiAgICBpZiAoIWFjdGl2ZVJlZi5jdXJyZW50KSByZXR1cm47XG4gICAgaWYgKHR5cGVvZiB0byA9PT0gXCJudW1iZXJcIikge1xuICAgICAgbmF2aWdhdG9yLmdvKHRvKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IHBhdGggPSByZXNvbHZlVG8odG8sIEpTT04ucGFyc2Uocm91dGVQYXRobmFtZXNKc29uKSwgbG9jYXRpb25QYXRobmFtZSwgb3B0aW9ucy5yZWxhdGl2ZSA9PT0gXCJwYXRoXCIpO1xuXG4gICAgLy8gSWYgd2UncmUgb3BlcmF0aW5nIHdpdGhpbiBhIGJhc2VuYW1lLCBwcmVwZW5kIGl0IHRvIHRoZSBwYXRobmFtZSBwcmlvclxuICAgIC8vIHRvIGhhbmRpbmcgb2ZmIHRvIGhpc3RvcnkgKGJ1dCBvbmx5IGlmIHdlJ3JlIG5vdCBpbiBhIGRhdGEgcm91dGVyLFxuICAgIC8vIG90aGVyd2lzZSBpdCdsbCBwcmVwZW5kIHRoZSBiYXNlbmFtZSBpbnNpZGUgb2YgdGhlIHJvdXRlcikuXG4gICAgLy8gSWYgdGhpcyBpcyBhIHJvb3QgbmF2aWdhdGlvbiwgdGhlbiB3ZSBuYXZpZ2F0ZSB0byB0aGUgcmF3IGJhc2VuYW1lXG4gICAgLy8gd2hpY2ggYWxsb3dzIHRoZSBiYXNlbmFtZSB0byBoYXZlIGZ1bGwgY29udHJvbCBvdmVyIHRoZSBwcmVzZW5jZSBvZiBhXG4gICAgLy8gdHJhaWxpbmcgc2xhc2ggb24gcm9vdCBsaW5rc1xuICAgIGlmIChkYXRhUm91dGVyQ29udGV4dCA9PSBudWxsICYmIGJhc2VuYW1lICE9PSBcIi9cIikge1xuICAgICAgcGF0aC5wYXRobmFtZSA9IHBhdGgucGF0aG5hbWUgPT09IFwiL1wiID8gYmFzZW5hbWUgOiBqb2luUGF0aHMoW2Jhc2VuYW1lLCBwYXRoLnBhdGhuYW1lXSk7XG4gICAgfVxuICAgICghIW9wdGlvbnMucmVwbGFjZSA/IG5hdmlnYXRvci5yZXBsYWNlIDogbmF2aWdhdG9yLnB1c2gpKHBhdGgsIG9wdGlvbnMuc3RhdGUsIG9wdGlvbnMpO1xuICB9LCBbYmFzZW5hbWUsIG5hdmlnYXRvciwgcm91dGVQYXRobmFtZXNKc29uLCBsb2NhdGlvblBhdGhuYW1lLCBkYXRhUm91dGVyQ29udGV4dF0pO1xuICByZXR1cm4gbmF2aWdhdGU7XG59XG5jb25zdCBPdXRsZXRDb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQobnVsbCk7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgY29udGV4dCAoaWYgcHJvdmlkZWQpIGZvciB0aGUgY2hpbGQgcm91dGUgYXQgdGhpcyBsZXZlbCBvZiB0aGUgcm91dGVcbiAqIGhpZXJhcmNoeS5cbiAqIEBzZWUgaHR0cHM6Ly9yZWFjdHJvdXRlci5jb20vaG9va3MvdXNlLW91dGxldC1jb250ZXh0XG4gKi9cbmZ1bmN0aW9uIHVzZU91dGxldENvbnRleHQoKSB7XG4gIHJldHVybiBSZWFjdC51c2VDb250ZXh0KE91dGxldENvbnRleHQpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGVsZW1lbnQgZm9yIHRoZSBjaGlsZCByb3V0ZSBhdCB0aGlzIGxldmVsIG9mIHRoZSByb3V0ZVxuICogaGllcmFyY2h5LiBVc2VkIGludGVybmFsbHkgYnkgYDxPdXRsZXQ+YCB0byByZW5kZXIgY2hpbGQgcm91dGVzLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9yZWFjdHJvdXRlci5jb20vaG9va3MvdXNlLW91dGxldFxuICovXG5mdW5jdGlvbiB1c2VPdXRsZXQoY29udGV4dCkge1xuICBsZXQgb3V0bGV0ID0gUmVhY3QudXNlQ29udGV4dChSb3V0ZUNvbnRleHQpLm91dGxldDtcbiAgaWYgKG91dGxldCkge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChPdXRsZXRDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgICB2YWx1ZTogY29udGV4dFxuICAgIH0sIG91dGxldCk7XG4gIH1cbiAgcmV0dXJuIG91dGxldDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGFuIG9iamVjdCBvZiBrZXkvdmFsdWUgcGFpcnMgb2YgdGhlIGR5bmFtaWMgcGFyYW1zIGZyb20gdGhlIGN1cnJlbnRcbiAqIFVSTCB0aGF0IHdlcmUgbWF0Y2hlZCBieSB0aGUgcm91dGUgcGF0aC5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vcmVhY3Ryb3V0ZXIuY29tL2hvb2tzL3VzZS1wYXJhbXNcbiAqL1xuZnVuY3Rpb24gdXNlUGFyYW1zKCkge1xuICBsZXQge1xuICAgIG1hdGNoZXNcbiAgfSA9IFJlYWN0LnVzZUNvbnRleHQoUm91dGVDb250ZXh0KTtcbiAgbGV0IHJvdXRlTWF0Y2ggPSBtYXRjaGVzW21hdGNoZXMubGVuZ3RoIC0gMV07XG4gIHJldHVybiByb3V0ZU1hdGNoID8gcm91dGVNYXRjaC5wYXJhbXMgOiB7fTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgcGF0aG5hbWUgb2YgdGhlIGdpdmVuIGB0b2AgdmFsdWUgYWdhaW5zdCB0aGUgY3VycmVudCBsb2NhdGlvbi5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vcmVhY3Ryb3V0ZXIuY29tL2hvb2tzL3VzZS1yZXNvbHZlZC1wYXRoXG4gKi9cbmZ1bmN0aW9uIHVzZVJlc29sdmVkUGF0aCh0bywgX3RlbXAyKSB7XG4gIGxldCB7XG4gICAgcmVsYXRpdmVcbiAgfSA9IF90ZW1wMiA9PT0gdm9pZCAwID8ge30gOiBfdGVtcDI7XG4gIGxldCB7XG4gICAgbWF0Y2hlc1xuICB9ID0gUmVhY3QudXNlQ29udGV4dChSb3V0ZUNvbnRleHQpO1xuICBsZXQge1xuICAgIHBhdGhuYW1lOiBsb2NhdGlvblBhdGhuYW1lXG4gIH0gPSB1c2VMb2NhdGlvbigpO1xuICBsZXQgcm91dGVQYXRobmFtZXNKc29uID0gSlNPTi5zdHJpbmdpZnkoVU5TQUZFX2dldFBhdGhDb250cmlidXRpbmdNYXRjaGVzKG1hdGNoZXMpLm1hcChtYXRjaCA9PiBtYXRjaC5wYXRobmFtZUJhc2UpKTtcbiAgcmV0dXJuIFJlYWN0LnVzZU1lbW8oKCkgPT4gcmVzb2x2ZVRvKHRvLCBKU09OLnBhcnNlKHJvdXRlUGF0aG5hbWVzSnNvbiksIGxvY2F0aW9uUGF0aG5hbWUsIHJlbGF0aXZlID09PSBcInBhdGhcIiksIFt0bywgcm91dGVQYXRobmFtZXNKc29uLCBsb2NhdGlvblBhdGhuYW1lLCByZWxhdGl2ZV0pO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGVsZW1lbnQgb2YgdGhlIHJvdXRlIHRoYXQgbWF0Y2hlZCB0aGUgY3VycmVudCBsb2NhdGlvbiwgcHJlcGFyZWRcbiAqIHdpdGggdGhlIGNvcnJlY3QgY29udGV4dCB0byByZW5kZXIgdGhlIHJlbWFpbmRlciBvZiB0aGUgcm91dGUgdHJlZS4gUm91dGVcbiAqIGVsZW1lbnRzIGluIHRoZSB0cmVlIG11c3QgcmVuZGVyIGFuIGA8T3V0bGV0PmAgdG8gcmVuZGVyIHRoZWlyIGNoaWxkIHJvdXRlJ3NcbiAqIGVsZW1lbnQuXG4gKlxuICogQHNlZSBodHRwczovL3JlYWN0cm91dGVyLmNvbS9ob29rcy91c2Utcm91dGVzXG4gKi9cbmZ1bmN0aW9uIHVzZVJvdXRlcyhyb3V0ZXMsIGxvY2F0aW9uQXJnKSB7XG4gIHJldHVybiB1c2VSb3V0ZXNJbXBsKHJvdXRlcywgbG9jYXRpb25BcmcpO1xufVxuXG4vLyBJbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiB3aXRoIGFjY2VwdCBvcHRpb25hbCBwYXJhbSBmb3IgUm91dGVyUHJvdmlkZXIgdXNhZ2VcbmZ1bmN0aW9uIHVzZVJvdXRlc0ltcGwocm91dGVzLCBsb2NhdGlvbkFyZywgZGF0YVJvdXRlclN0YXRlKSB7XG4gICF1c2VJblJvdXRlckNvbnRleHQoKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IFVOU0FGRV9pbnZhcmlhbnQoZmFsc2UsIC8vIFRPRE86IFRoaXMgZXJyb3IgaXMgcHJvYmFibHkgYmVjYXVzZSB0aGV5IHNvbWVob3cgaGF2ZSAyIHZlcnNpb25zIG9mIHRoZVxuICAvLyByb3V0ZXIgbG9hZGVkLiBXZSBjYW4gaGVscCB0aGVtIHVuZGVyc3RhbmQgaG93IHRvIGF2b2lkIHRoYXQuXG4gIFwidXNlUm91dGVzKCkgbWF5IGJlIHVzZWQgb25seSBpbiB0aGUgY29udGV4dCBvZiBhIDxSb3V0ZXI+IGNvbXBvbmVudC5cIikgOiBVTlNBRkVfaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgbGV0IHtcbiAgICBuYXZpZ2F0b3JcbiAgfSA9IFJlYWN0LnVzZUNvbnRleHQoTmF2aWdhdGlvbkNvbnRleHQpO1xuICBsZXQge1xuICAgIG1hdGNoZXM6IHBhcmVudE1hdGNoZXNcbiAgfSA9IFJlYWN0LnVzZUNvbnRleHQoUm91dGVDb250ZXh0KTtcbiAgbGV0IHJvdXRlTWF0Y2ggPSBwYXJlbnRNYXRjaGVzW3BhcmVudE1hdGNoZXMubGVuZ3RoIC0gMV07XG4gIGxldCBwYXJlbnRQYXJhbXMgPSByb3V0ZU1hdGNoID8gcm91dGVNYXRjaC5wYXJhbXMgOiB7fTtcbiAgbGV0IHBhcmVudFBhdGhuYW1lID0gcm91dGVNYXRjaCA/IHJvdXRlTWF0Y2gucGF0aG5hbWUgOiBcIi9cIjtcbiAgbGV0IHBhcmVudFBhdGhuYW1lQmFzZSA9IHJvdXRlTWF0Y2ggPyByb3V0ZU1hdGNoLnBhdGhuYW1lQmFzZSA6IFwiL1wiO1xuICBsZXQgcGFyZW50Um91dGUgPSByb3V0ZU1hdGNoICYmIHJvdXRlTWF0Y2gucm91dGU7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAvLyBZb3Ugd29uJ3QgZ2V0IGEgd2FybmluZyBhYm91dCAyIGRpZmZlcmVudCA8Um91dGVzPiB1bmRlciBhIDxSb3V0ZT5cbiAgICAvLyB3aXRob3V0IGEgdHJhaWxpbmcgKiwgYnV0IHRoaXMgaXMgYSBiZXN0LWVmZm9ydCB3YXJuaW5nIGFueXdheSBzaW5jZSB3ZVxuICAgIC8vIGNhbm5vdCBldmVuIGdpdmUgdGhlIHdhcm5pbmcgdW5sZXNzIHRoZXkgbGFuZCBhdCB0aGUgcGFyZW50IHJvdXRlLlxuICAgIC8vXG4gICAgLy8gRXhhbXBsZTpcbiAgICAvL1xuICAgIC8vIDxSb3V0ZXM+XG4gICAgLy8gICB7LyogVGhpcyByb3V0ZSBwYXRoIE1VU1QgZW5kIHdpdGggLyogYmVjYXVzZSBvdGhlcndpc2VcbiAgICAvLyAgICAgICBpdCB3aWxsIG5ldmVyIG1hdGNoIC9ibG9nL3Bvc3QvMTIzICovfVxuICAgIC8vICAgPFJvdXRlIHBhdGg9XCJibG9nXCIgZWxlbWVudD17PEJsb2cgLz59IC8+XG4gICAgLy8gICA8Um91dGUgcGF0aD1cImJsb2cvZmVlZFwiIGVsZW1lbnQ9ezxCbG9nRmVlZCAvPn0gLz5cbiAgICAvLyA8L1JvdXRlcz5cbiAgICAvL1xuICAgIC8vIGZ1bmN0aW9uIEJsb2coKSB7XG4gICAgLy8gICByZXR1cm4gKFxuICAgIC8vICAgICA8Um91dGVzPlxuICAgIC8vICAgICAgIDxSb3V0ZSBwYXRoPVwicG9zdC86aWRcIiBlbGVtZW50PXs8UG9zdCAvPn0gLz5cbiAgICAvLyAgICAgPC9Sb3V0ZXM+XG4gICAgLy8gICApO1xuICAgIC8vIH1cbiAgICBsZXQgcGFyZW50UGF0aCA9IHBhcmVudFJvdXRlICYmIHBhcmVudFJvdXRlLnBhdGggfHwgXCJcIjtcbiAgICB3YXJuaW5nT25jZShwYXJlbnRQYXRobmFtZSwgIXBhcmVudFJvdXRlIHx8IHBhcmVudFBhdGguZW5kc1dpdGgoXCIqXCIpLCBcIllvdSByZW5kZXJlZCBkZXNjZW5kYW50IDxSb3V0ZXM+IChvciBjYWxsZWQgYHVzZVJvdXRlcygpYCkgYXQgXCIgKyAoXCJcXFwiXCIgKyBwYXJlbnRQYXRobmFtZSArIFwiXFxcIiAodW5kZXIgPFJvdXRlIHBhdGg9XFxcIlwiICsgcGFyZW50UGF0aCArIFwiXFxcIj4pIGJ1dCB0aGUgXCIpICsgXCJwYXJlbnQgcm91dGUgcGF0aCBoYXMgbm8gdHJhaWxpbmcgXFxcIipcXFwiLiBUaGlzIG1lYW5zIGlmIHlvdSBuYXZpZ2F0ZSBcIiArIFwiZGVlcGVyLCB0aGUgcGFyZW50IHdvbid0IG1hdGNoIGFueW1vcmUgYW5kIHRoZXJlZm9yZSB0aGUgY2hpbGQgXCIgKyBcInJvdXRlcyB3aWxsIG5ldmVyIHJlbmRlci5cXG5cXG5cIiArIChcIlBsZWFzZSBjaGFuZ2UgdGhlIHBhcmVudCA8Um91dGUgcGF0aD1cXFwiXCIgKyBwYXJlbnRQYXRoICsgXCJcXFwiPiB0byA8Um91dGUgXCIpICsgKFwicGF0aD1cXFwiXCIgKyAocGFyZW50UGF0aCA9PT0gXCIvXCIgPyBcIipcIiA6IHBhcmVudFBhdGggKyBcIi8qXCIpICsgXCJcXFwiPi5cIikpO1xuICB9XG4gIGxldCBsb2NhdGlvbkZyb21Db250ZXh0ID0gdXNlTG9jYXRpb24oKTtcbiAgbGV0IGxvY2F0aW9uO1xuICBpZiAobG9jYXRpb25BcmcpIHtcbiAgICB2YXIgX3BhcnNlZExvY2F0aW9uQXJnJHBhO1xuICAgIGxldCBwYXJzZWRMb2NhdGlvbkFyZyA9IHR5cGVvZiBsb2NhdGlvbkFyZyA9PT0gXCJzdHJpbmdcIiA/IHBhcnNlUGF0aChsb2NhdGlvbkFyZykgOiBsb2NhdGlvbkFyZztcbiAgICAhKHBhcmVudFBhdGhuYW1lQmFzZSA9PT0gXCIvXCIgfHwgKChfcGFyc2VkTG9jYXRpb25BcmckcGEgPSBwYXJzZWRMb2NhdGlvbkFyZy5wYXRobmFtZSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9wYXJzZWRMb2NhdGlvbkFyZyRwYS5zdGFydHNXaXRoKHBhcmVudFBhdGhuYW1lQmFzZSkpKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IFVOU0FGRV9pbnZhcmlhbnQoZmFsc2UsIFwiV2hlbiBvdmVycmlkaW5nIHRoZSBsb2NhdGlvbiB1c2luZyBgPFJvdXRlcyBsb2NhdGlvbj5gIG9yIGB1c2VSb3V0ZXMocm91dGVzLCBsb2NhdGlvbilgLCBcIiArIFwidGhlIGxvY2F0aW9uIHBhdGhuYW1lIG11c3QgYmVnaW4gd2l0aCB0aGUgcG9ydGlvbiBvZiB0aGUgVVJMIHBhdGhuYW1lIHRoYXQgd2FzIFwiICsgKFwibWF0Y2hlZCBieSBhbGwgcGFyZW50IHJvdXRlcy4gVGhlIGN1cnJlbnQgcGF0aG5hbWUgYmFzZSBpcyBcXFwiXCIgKyBwYXJlbnRQYXRobmFtZUJhc2UgKyBcIlxcXCIgXCIpICsgKFwiYnV0IHBhdGhuYW1lIFxcXCJcIiArIHBhcnNlZExvY2F0aW9uQXJnLnBhdGhuYW1lICsgXCJcXFwiIHdhcyBnaXZlbiBpbiB0aGUgYGxvY2F0aW9uYCBwcm9wLlwiKSkgOiBVTlNBRkVfaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgICBsb2NhdGlvbiA9IHBhcnNlZExvY2F0aW9uQXJnO1xuICB9IGVsc2Uge1xuICAgIGxvY2F0aW9uID0gbG9jYXRpb25Gcm9tQ29udGV4dDtcbiAgfVxuICBsZXQgcGF0aG5hbWUgPSBsb2NhdGlvbi5wYXRobmFtZSB8fCBcIi9cIjtcbiAgbGV0IHJlbWFpbmluZ1BhdGhuYW1lID0gcGFyZW50UGF0aG5hbWVCYXNlID09PSBcIi9cIiA/IHBhdGhuYW1lIDogcGF0aG5hbWUuc2xpY2UocGFyZW50UGF0aG5hbWVCYXNlLmxlbmd0aCkgfHwgXCIvXCI7XG4gIGxldCBtYXRjaGVzID0gbWF0Y2hSb3V0ZXMocm91dGVzLCB7XG4gICAgcGF0aG5hbWU6IHJlbWFpbmluZ1BhdGhuYW1lXG4gIH0pO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gVU5TQUZFX3dhcm5pbmcocGFyZW50Um91dGUgfHwgbWF0Y2hlcyAhPSBudWxsLCBcIk5vIHJvdXRlcyBtYXRjaGVkIGxvY2F0aW9uIFxcXCJcIiArIGxvY2F0aW9uLnBhdGhuYW1lICsgbG9jYXRpb24uc2VhcmNoICsgbG9jYXRpb24uaGFzaCArIFwiXFxcIiBcIikgOiB2b2lkIDA7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gVU5TQUZFX3dhcm5pbmcobWF0Y2hlcyA9PSBudWxsIHx8IG1hdGNoZXNbbWF0Y2hlcy5sZW5ndGggLSAxXS5yb3V0ZS5lbGVtZW50ICE9PSB1bmRlZmluZWQgfHwgbWF0Y2hlc1ttYXRjaGVzLmxlbmd0aCAtIDFdLnJvdXRlLkNvbXBvbmVudCAhPT0gdW5kZWZpbmVkLCBcIk1hdGNoZWQgbGVhZiByb3V0ZSBhdCBsb2NhdGlvbiBcXFwiXCIgKyBsb2NhdGlvbi5wYXRobmFtZSArIGxvY2F0aW9uLnNlYXJjaCArIGxvY2F0aW9uLmhhc2ggKyBcIlxcXCIgXCIgKyBcImRvZXMgbm90IGhhdmUgYW4gZWxlbWVudCBvciBDb21wb25lbnQuIFRoaXMgbWVhbnMgaXQgd2lsbCByZW5kZXIgYW4gPE91dGxldCAvPiB3aXRoIGEgXCIgKyBcIm51bGwgdmFsdWUgYnkgZGVmYXVsdCByZXN1bHRpbmcgaW4gYW4gXFxcImVtcHR5XFxcIiBwYWdlLlwiKSA6IHZvaWQgMDtcbiAgfVxuICBsZXQgcmVuZGVyZWRNYXRjaGVzID0gX3JlbmRlck1hdGNoZXMobWF0Y2hlcyAmJiBtYXRjaGVzLm1hcChtYXRjaCA9PiBPYmplY3QuYXNzaWduKHt9LCBtYXRjaCwge1xuICAgIHBhcmFtczogT2JqZWN0LmFzc2lnbih7fSwgcGFyZW50UGFyYW1zLCBtYXRjaC5wYXJhbXMpLFxuICAgIHBhdGhuYW1lOiBqb2luUGF0aHMoW3BhcmVudFBhdGhuYW1lQmFzZSxcbiAgICAvLyBSZS1lbmNvZGUgcGF0aG5hbWVzIHRoYXQgd2VyZSBkZWNvZGVkIGluc2lkZSBtYXRjaFJvdXRlc1xuICAgIG5hdmlnYXRvci5lbmNvZGVMb2NhdGlvbiA/IG5hdmlnYXRvci5lbmNvZGVMb2NhdGlvbihtYXRjaC5wYXRobmFtZSkucGF0aG5hbWUgOiBtYXRjaC5wYXRobmFtZV0pLFxuICAgIHBhdGhuYW1lQmFzZTogbWF0Y2gucGF0aG5hbWVCYXNlID09PSBcIi9cIiA/IHBhcmVudFBhdGhuYW1lQmFzZSA6IGpvaW5QYXRocyhbcGFyZW50UGF0aG5hbWVCYXNlLFxuICAgIC8vIFJlLWVuY29kZSBwYXRobmFtZXMgdGhhdCB3ZXJlIGRlY29kZWQgaW5zaWRlIG1hdGNoUm91dGVzXG4gICAgbmF2aWdhdG9yLmVuY29kZUxvY2F0aW9uID8gbmF2aWdhdG9yLmVuY29kZUxvY2F0aW9uKG1hdGNoLnBhdGhuYW1lQmFzZSkucGF0aG5hbWUgOiBtYXRjaC5wYXRobmFtZUJhc2VdKVxuICB9KSksIHBhcmVudE1hdGNoZXMsIGRhdGFSb3V0ZXJTdGF0ZSk7XG5cbiAgLy8gV2hlbiBhIHVzZXIgcGFzc2VzIGluIGEgYGxvY2F0aW9uQXJnYCwgdGhlIGFzc29jaWF0ZWQgcm91dGVzIG5lZWQgdG9cbiAgLy8gYmUgd3JhcHBlZCBpbiBhIG5ldyBgTG9jYXRpb25Db250ZXh0LlByb3ZpZGVyYCBpbiBvcmRlciBmb3IgYHVzZUxvY2F0aW9uYFxuICAvLyB0byB1c2UgdGhlIHNjb3BlZCBsb2NhdGlvbiBpbnN0ZWFkIG9mIHRoZSBnbG9iYWwgbG9jYXRpb24uXG4gIGlmIChsb2NhdGlvbkFyZyAmJiByZW5kZXJlZE1hdGNoZXMpIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTG9jYXRpb25Db250ZXh0LlByb3ZpZGVyLCB7XG4gICAgICB2YWx1ZToge1xuICAgICAgICBsb2NhdGlvbjogX2V4dGVuZHMoe1xuICAgICAgICAgIHBhdGhuYW1lOiBcIi9cIixcbiAgICAgICAgICBzZWFyY2g6IFwiXCIsXG4gICAgICAgICAgaGFzaDogXCJcIixcbiAgICAgICAgICBzdGF0ZTogbnVsbCxcbiAgICAgICAgICBrZXk6IFwiZGVmYXVsdFwiXG4gICAgICAgIH0sIGxvY2F0aW9uKSxcbiAgICAgICAgbmF2aWdhdGlvblR5cGU6IEFjdGlvbi5Qb3BcbiAgICAgIH1cbiAgICB9LCByZW5kZXJlZE1hdGNoZXMpO1xuICB9XG4gIHJldHVybiByZW5kZXJlZE1hdGNoZXM7XG59XG5mdW5jdGlvbiBEZWZhdWx0RXJyb3JDb21wb25lbnQoKSB7XG4gIGxldCBlcnJvciA9IHVzZVJvdXRlRXJyb3IoKTtcbiAgbGV0IG1lc3NhZ2UgPSBpc1JvdXRlRXJyb3JSZXNwb25zZShlcnJvcikgPyBlcnJvci5zdGF0dXMgKyBcIiBcIiArIGVycm9yLnN0YXR1c1RleHQgOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IEpTT04uc3RyaW5naWZ5KGVycm9yKTtcbiAgbGV0IHN0YWNrID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLnN0YWNrIDogbnVsbDtcbiAgbGV0IGxpZ2h0Z3JleSA9IFwicmdiYSgyMDAsMjAwLDIwMCwgMC41KVwiO1xuICBsZXQgcHJlU3R5bGVzID0ge1xuICAgIHBhZGRpbmc6IFwiMC41cmVtXCIsXG4gICAgYmFja2dyb3VuZENvbG9yOiBsaWdodGdyZXlcbiAgfTtcbiAgbGV0IGNvZGVTdHlsZXMgPSB7XG4gICAgcGFkZGluZzogXCIycHggNHB4XCIsXG4gICAgYmFja2dyb3VuZENvbG9yOiBsaWdodGdyZXlcbiAgfTtcbiAgbGV0IGRldkluZm8gPSBudWxsO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgY29uc29sZS5lcnJvcihcIkVycm9yIGhhbmRsZWQgYnkgUmVhY3QgUm91dGVyIGRlZmF1bHQgRXJyb3JCb3VuZGFyeTpcIiwgZXJyb3IpO1xuICAgIGRldkluZm8gPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwXCIsIG51bGwsIFwiXFx1RDgzRFxcdURDQkYgSGV5IGRldmVsb3BlciBcXHVEODNEXFx1REM0QlwiKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwXCIsIG51bGwsIFwiWW91IGNhbiBwcm92aWRlIGEgd2F5IGJldHRlciBVWCB0aGFuIHRoaXMgd2hlbiB5b3VyIGFwcCB0aHJvd3MgZXJyb3JzIGJ5IHByb3ZpZGluZyB5b3VyIG93biBcIiwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJjb2RlXCIsIHtcbiAgICAgIHN0eWxlOiBjb2RlU3R5bGVzXG4gICAgfSwgXCJFcnJvckJvdW5kYXJ5XCIpLCBcIiBvclwiLCBcIiBcIiwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJjb2RlXCIsIHtcbiAgICAgIHN0eWxlOiBjb2RlU3R5bGVzXG4gICAgfSwgXCJlcnJvckVsZW1lbnRcIiksIFwiIHByb3Agb24geW91ciByb3V0ZS5cIikpO1xuICB9XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJoMlwiLCBudWxsLCBcIlVuZXhwZWN0ZWQgQXBwbGljYXRpb24gRXJyb3IhXCIpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImgzXCIsIHtcbiAgICBzdHlsZToge1xuICAgICAgZm9udFN0eWxlOiBcIml0YWxpY1wiXG4gICAgfVxuICB9LCBtZXNzYWdlKSwgc3RhY2sgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInByZVwiLCB7XG4gICAgc3R5bGU6IHByZVN0eWxlc1xuICB9LCBzdGFjaykgOiBudWxsLCBkZXZJbmZvKTtcbn1cbmNvbnN0IGRlZmF1bHRFcnJvckVsZW1lbnQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChEZWZhdWx0RXJyb3JDb21wb25lbnQsIG51bGwpO1xuY2xhc3MgUmVuZGVyRXJyb3JCb3VuZGFyeSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBsb2NhdGlvbjogcHJvcHMubG9jYXRpb24sXG4gICAgICByZXZhbGlkYXRpb246IHByb3BzLnJldmFsaWRhdGlvbixcbiAgICAgIGVycm9yOiBwcm9wcy5lcnJvclxuICAgIH07XG4gIH1cbiAgc3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcihlcnJvcikge1xuICAgIHJldHVybiB7XG4gICAgICBlcnJvcjogZXJyb3JcbiAgICB9O1xuICB9XG4gIHN0YXRpYyBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMocHJvcHMsIHN0YXRlKSB7XG4gICAgLy8gV2hlbiB3ZSBnZXQgaW50byBhbiBlcnJvciBzdGF0ZSwgdGhlIHVzZXIgd2lsbCBsaWtlbHkgY2xpY2sgXCJiYWNrXCIgdG8gdGhlXG4gICAgLy8gcHJldmlvdXMgcGFnZSB0aGF0IGRpZG4ndCBoYXZlIGFuIGVycm9yLiBCZWNhdXNlIHRoaXMgd3JhcHMgdGhlIGVudGlyZVxuICAgIC8vIGFwcGxpY2F0aW9uLCB0aGF0IHdpbGwgaGF2ZSBubyBlZmZlY3QtLXRoZSBlcnJvciBwYWdlIGNvbnRpbnVlcyB0byBkaXNwbGF5LlxuICAgIC8vIFRoaXMgZ2l2ZXMgdXMgYSBtZWNoYW5pc20gdG8gcmVjb3ZlciBmcm9tIHRoZSBlcnJvciB3aGVuIHRoZSBsb2NhdGlvbiBjaGFuZ2VzLlxuICAgIC8vXG4gICAgLy8gV2hldGhlciB3ZSdyZSBpbiBhbiBlcnJvciBzdGF0ZSBvciBub3QsIHdlIHVwZGF0ZSB0aGUgbG9jYXRpb24gaW4gc3RhdGVcbiAgICAvLyBzbyB0aGF0IHdoZW4gd2UgYXJlIGluIGFuIGVycm9yIHN0YXRlLCBpdCBnZXRzIHJlc2V0IHdoZW4gYSBuZXcgbG9jYXRpb25cbiAgICAvLyBjb21lcyBpbiBhbmQgdGhlIHVzZXIgcmVjb3ZlcnMgZnJvbSB0aGUgZXJyb3IuXG4gICAgaWYgKHN0YXRlLmxvY2F0aW9uICE9PSBwcm9wcy5sb2NhdGlvbiB8fCBzdGF0ZS5yZXZhbGlkYXRpb24gIT09IFwiaWRsZVwiICYmIHByb3BzLnJldmFsaWRhdGlvbiA9PT0gXCJpZGxlXCIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGVycm9yOiBwcm9wcy5lcnJvcixcbiAgICAgICAgbG9jYXRpb246IHByb3BzLmxvY2F0aW9uLFxuICAgICAgICByZXZhbGlkYXRpb246IHByb3BzLnJldmFsaWRhdGlvblxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBJZiB3ZSdyZSBub3QgY2hhbmdpbmcgbG9jYXRpb25zLCBwcmVzZXJ2ZSB0aGUgbG9jYXRpb24gYnV0IHN0aWxsIHN1cmZhY2VcbiAgICAvLyBhbnkgbmV3IGVycm9ycyB0aGF0IG1heSBjb21lIHRocm91Z2guIFdlIHJldGFpbiB0aGUgZXhpc3RpbmcgZXJyb3IsIHdlIGRvXG4gICAgLy8gdGhpcyBiZWNhdXNlIHRoZSBlcnJvciBwcm92aWRlZCBmcm9tIHRoZSBhcHAgc3RhdGUgbWF5IGJlIGNsZWFyZWQgd2l0aG91dFxuICAgIC8vIHRoZSBsb2NhdGlvbiBjaGFuZ2luZy5cbiAgICByZXR1cm4ge1xuICAgICAgZXJyb3I6IHByb3BzLmVycm9yIHx8IHN0YXRlLmVycm9yLFxuICAgICAgbG9jYXRpb246IHN0YXRlLmxvY2F0aW9uLFxuICAgICAgcmV2YWxpZGF0aW9uOiBwcm9wcy5yZXZhbGlkYXRpb24gfHwgc3RhdGUucmV2YWxpZGF0aW9uXG4gICAgfTtcbiAgfVxuICBjb21wb25lbnREaWRDYXRjaChlcnJvciwgZXJyb3JJbmZvKSB7XG4gICAgY29uc29sZS5lcnJvcihcIlJlYWN0IFJvdXRlciBjYXVnaHQgdGhlIGZvbGxvd2luZyBlcnJvciBkdXJpbmcgcmVuZGVyXCIsIGVycm9yLCBlcnJvckluZm8pO1xuICB9XG4gIHJlbmRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5lcnJvciA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJvdXRlQ29udGV4dC5Qcm92aWRlciwge1xuICAgICAgdmFsdWU6IHRoaXMucHJvcHMucm91dGVDb250ZXh0XG4gICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUm91dGVFcnJvckNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICAgIHZhbHVlOiB0aGlzLnN0YXRlLmVycm9yLFxuICAgICAgY2hpbGRyZW46IHRoaXMucHJvcHMuY29tcG9uZW50XG4gICAgfSkpIDogdGhpcy5wcm9wcy5jaGlsZHJlbjtcbiAgfVxufVxuZnVuY3Rpb24gUmVuZGVyZWRSb3V0ZShfcmVmKSB7XG4gIGxldCB7XG4gICAgcm91dGVDb250ZXh0LFxuICAgIG1hdGNoLFxuICAgIGNoaWxkcmVuXG4gIH0gPSBfcmVmO1xuICBsZXQgZGF0YVJvdXRlckNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KERhdGFSb3V0ZXJDb250ZXh0KTtcblxuICAvLyBUcmFjayBob3cgZGVlcCB3ZSBnb3QgaW4gb3VyIHJlbmRlciBwYXNzIHRvIGVtdWxhdGUgU1NSIGNvbXBvbmVudERpZENhdGNoXG4gIC8vIGluIGEgRGF0YVN0YXRpY1JvdXRlclxuICBpZiAoZGF0YVJvdXRlckNvbnRleHQgJiYgZGF0YVJvdXRlckNvbnRleHQuc3RhdGljICYmIGRhdGFSb3V0ZXJDb250ZXh0LnN0YXRpY0NvbnRleHQgJiYgKG1hdGNoLnJvdXRlLmVycm9yRWxlbWVudCB8fCBtYXRjaC5yb3V0ZS5FcnJvckJvdW5kYXJ5KSkge1xuICAgIGRhdGFSb3V0ZXJDb250ZXh0LnN0YXRpY0NvbnRleHQuX2RlZXBlc3RSZW5kZXJlZEJvdW5kYXJ5SWQgPSBtYXRjaC5yb3V0ZS5pZDtcbiAgfVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUm91dGVDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IHJvdXRlQ29udGV4dFxuICB9LCBjaGlsZHJlbik7XG59XG5mdW5jdGlvbiBfcmVuZGVyTWF0Y2hlcyhtYXRjaGVzLCBwYXJlbnRNYXRjaGVzLCBkYXRhUm91dGVyU3RhdGUpIHtcbiAgdmFyIF9kYXRhUm91dGVyU3RhdGUyO1xuICBpZiAocGFyZW50TWF0Y2hlcyA9PT0gdm9pZCAwKSB7XG4gICAgcGFyZW50TWF0Y2hlcyA9IFtdO1xuICB9XG4gIGlmIChkYXRhUm91dGVyU3RhdGUgPT09IHZvaWQgMCkge1xuICAgIGRhdGFSb3V0ZXJTdGF0ZSA9IG51bGw7XG4gIH1cbiAgaWYgKG1hdGNoZXMgPT0gbnVsbCkge1xuICAgIHZhciBfZGF0YVJvdXRlclN0YXRlO1xuICAgIGlmICgoX2RhdGFSb3V0ZXJTdGF0ZSA9IGRhdGFSb3V0ZXJTdGF0ZSkgIT0gbnVsbCAmJiBfZGF0YVJvdXRlclN0YXRlLmVycm9ycykge1xuICAgICAgLy8gRG9uJ3QgYmFpbCBpZiB3ZSBoYXZlIGRhdGEgcm91dGVyIGVycm9ycyBzbyB3ZSBjYW4gcmVuZGVyIHRoZW0gaW4gdGhlXG4gICAgICAvLyBib3VuZGFyeS4gIFVzZSB0aGUgcHJlLW1hdGNoZWQgKG9yIHNoaW1tZWQpIG1hdGNoZXNcbiAgICAgIG1hdGNoZXMgPSBkYXRhUm91dGVyU3RhdGUubWF0Y2hlcztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG4gIGxldCByZW5kZXJlZE1hdGNoZXMgPSBtYXRjaGVzO1xuXG4gIC8vIElmIHdlIGhhdmUgZGF0YSBlcnJvcnMsIHRyaW0gbWF0Y2hlcyB0byB0aGUgaGlnaGVzdCBlcnJvciBib3VuZGFyeVxuICBsZXQgZXJyb3JzID0gKF9kYXRhUm91dGVyU3RhdGUyID0gZGF0YVJvdXRlclN0YXRlKSA9PSBudWxsID8gdm9pZCAwIDogX2RhdGFSb3V0ZXJTdGF0ZTIuZXJyb3JzO1xuICBpZiAoZXJyb3JzICE9IG51bGwpIHtcbiAgICBsZXQgZXJyb3JJbmRleCA9IHJlbmRlcmVkTWF0Y2hlcy5maW5kSW5kZXgobSA9PiBtLnJvdXRlLmlkICYmIChlcnJvcnMgPT0gbnVsbCA/IHZvaWQgMCA6IGVycm9yc1ttLnJvdXRlLmlkXSkpO1xuICAgICEoZXJyb3JJbmRleCA+PSAwKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IFVOU0FGRV9pbnZhcmlhbnQoZmFsc2UsIFwiQ291bGQgbm90IGZpbmQgYSBtYXRjaGluZyByb3V0ZSBmb3IgZXJyb3JzIG9uIHJvdXRlIElEczogXCIgKyBPYmplY3Qua2V5cyhlcnJvcnMpLmpvaW4oXCIsXCIpKSA6IFVOU0FGRV9pbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICAgIHJlbmRlcmVkTWF0Y2hlcyA9IHJlbmRlcmVkTWF0Y2hlcy5zbGljZSgwLCBNYXRoLm1pbihyZW5kZXJlZE1hdGNoZXMubGVuZ3RoLCBlcnJvckluZGV4ICsgMSkpO1xuICB9XG4gIHJldHVybiByZW5kZXJlZE1hdGNoZXMucmVkdWNlUmlnaHQoKG91dGxldCwgbWF0Y2gsIGluZGV4KSA9PiB7XG4gICAgbGV0IGVycm9yID0gbWF0Y2gucm91dGUuaWQgPyBlcnJvcnMgPT0gbnVsbCA/IHZvaWQgMCA6IGVycm9yc1ttYXRjaC5yb3V0ZS5pZF0gOiBudWxsO1xuICAgIC8vIE9ubHkgZGF0YSByb3V0ZXJzIGhhbmRsZSBlcnJvcnNcbiAgICBsZXQgZXJyb3JFbGVtZW50ID0gbnVsbDtcbiAgICBpZiAoZGF0YVJvdXRlclN0YXRlKSB7XG4gICAgICBlcnJvckVsZW1lbnQgPSBtYXRjaC5yb3V0ZS5lcnJvckVsZW1lbnQgfHwgZGVmYXVsdEVycm9yRWxlbWVudDtcbiAgICB9XG4gICAgbGV0IG1hdGNoZXMgPSBwYXJlbnRNYXRjaGVzLmNvbmNhdChyZW5kZXJlZE1hdGNoZXMuc2xpY2UoMCwgaW5kZXggKyAxKSk7XG4gICAgbGV0IGdldENoaWxkcmVuID0gKCkgPT4ge1xuICAgICAgbGV0IGNoaWxkcmVuO1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIGNoaWxkcmVuID0gZXJyb3JFbGVtZW50O1xuICAgICAgfSBlbHNlIGlmIChtYXRjaC5yb3V0ZS5Db21wb25lbnQpIHtcbiAgICAgICAgLy8gTm90ZTogVGhpcyBpcyBhIGRlLW9wdGltaXplZCBwYXRoIHNpbmNlIFJlYWN0IHdvbid0IHJlLXVzZSB0aGVcbiAgICAgICAgLy8gUmVhY3RFbGVtZW50IHNpbmNlIGl0J3MgaWRlbnRpdHkgY2hhbmdlcyB3aXRoIGVhY2ggbmV3XG4gICAgICAgIC8vIFJlYWN0LmNyZWF0ZUVsZW1lbnQgY2FsbC4gIFdlIGtlZXAgdGhpcyBzbyBmb2xrcyBjYW4gdXNlXG4gICAgICAgIC8vIGA8Um91dGUgQ29tcG9uZW50PXsuLi59PmAgaW4gYDxSb3V0ZXM+YCBidXQgZ2VuZXJhbGx5IGBDb21wb25lbnRgXG4gICAgICAgIC8vIHVzYWdlIGlzIG9ubHkgYWR2aXNlZCBpbiBgUm91dGVyUHJvdmlkZXJgIHdoZW4gd2UgY2FuIGNvbnZlcnQgaXQgdG9cbiAgICAgICAgLy8gYGVsZW1lbnRgIGFoZWFkIG9mIHRpbWUuXG4gICAgICAgIGNoaWxkcmVuID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQobWF0Y2gucm91dGUuQ29tcG9uZW50LCBudWxsKTtcbiAgICAgIH0gZWxzZSBpZiAobWF0Y2gucm91dGUuZWxlbWVudCkge1xuICAgICAgICBjaGlsZHJlbiA9IG1hdGNoLnJvdXRlLmVsZW1lbnQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjaGlsZHJlbiA9IG91dGxldDtcbiAgICAgIH1cbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZW5kZXJlZFJvdXRlLCB7XG4gICAgICAgIG1hdGNoOiBtYXRjaCxcbiAgICAgICAgcm91dGVDb250ZXh0OiB7XG4gICAgICAgICAgb3V0bGV0LFxuICAgICAgICAgIG1hdGNoZXMsXG4gICAgICAgICAgaXNEYXRhUm91dGU6IGRhdGFSb3V0ZXJTdGF0ZSAhPSBudWxsXG4gICAgICAgIH0sXG4gICAgICAgIGNoaWxkcmVuOiBjaGlsZHJlblxuICAgICAgfSk7XG4gICAgfTtcbiAgICAvLyBPbmx5IHdyYXAgaW4gYW4gZXJyb3IgYm91bmRhcnkgd2l0aGluIGRhdGEgcm91dGVyIHVzYWdlcyB3aGVuIHdlIGhhdmUgYW5cbiAgICAvLyBFcnJvckJvdW5kYXJ5L2Vycm9yRWxlbWVudCBvbiB0aGlzIHJvdXRlLiAgT3RoZXJ3aXNlIGxldCBpdCBidWJibGUgdXAgdG9cbiAgICAvLyBhbiBhbmNlc3RvciBFcnJvckJvdW5kYXJ5L2Vycm9yRWxlbWVudFxuICAgIHJldHVybiBkYXRhUm91dGVyU3RhdGUgJiYgKG1hdGNoLnJvdXRlLkVycm9yQm91bmRhcnkgfHwgbWF0Y2gucm91dGUuZXJyb3JFbGVtZW50IHx8IGluZGV4ID09PSAwKSA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlbmRlckVycm9yQm91bmRhcnksIHtcbiAgICAgIGxvY2F0aW9uOiBkYXRhUm91dGVyU3RhdGUubG9jYXRpb24sXG4gICAgICByZXZhbGlkYXRpb246IGRhdGFSb3V0ZXJTdGF0ZS5yZXZhbGlkYXRpb24sXG4gICAgICBjb21wb25lbnQ6IGVycm9yRWxlbWVudCxcbiAgICAgIGVycm9yOiBlcnJvcixcbiAgICAgIGNoaWxkcmVuOiBnZXRDaGlsZHJlbigpLFxuICAgICAgcm91dGVDb250ZXh0OiB7XG4gICAgICAgIG91dGxldDogbnVsbCxcbiAgICAgICAgbWF0Y2hlcyxcbiAgICAgICAgaXNEYXRhUm91dGU6IHRydWVcbiAgICAgIH1cbiAgICB9KSA6IGdldENoaWxkcmVuKCk7XG4gIH0sIG51bGwpO1xufVxudmFyIERhdGFSb3V0ZXJIb29rID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChEYXRhUm91dGVySG9vaykge1xuICBEYXRhUm91dGVySG9va1tcIlVzZUJsb2NrZXJcIl0gPSBcInVzZUJsb2NrZXJcIjtcbiAgRGF0YVJvdXRlckhvb2tbXCJVc2VSZXZhbGlkYXRvclwiXSA9IFwidXNlUmV2YWxpZGF0b3JcIjtcbiAgRGF0YVJvdXRlckhvb2tbXCJVc2VOYXZpZ2F0ZVN0YWJsZVwiXSA9IFwidXNlTmF2aWdhdGVcIjtcbiAgcmV0dXJuIERhdGFSb3V0ZXJIb29rO1xufShEYXRhUm91dGVySG9vayB8fCB7fSk7XG52YXIgRGF0YVJvdXRlclN0YXRlSG9vayA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoRGF0YVJvdXRlclN0YXRlSG9vaykge1xuICBEYXRhUm91dGVyU3RhdGVIb29rW1wiVXNlQmxvY2tlclwiXSA9IFwidXNlQmxvY2tlclwiO1xuICBEYXRhUm91dGVyU3RhdGVIb29rW1wiVXNlTG9hZGVyRGF0YVwiXSA9IFwidXNlTG9hZGVyRGF0YVwiO1xuICBEYXRhUm91dGVyU3RhdGVIb29rW1wiVXNlQWN0aW9uRGF0YVwiXSA9IFwidXNlQWN0aW9uRGF0YVwiO1xuICBEYXRhUm91dGVyU3RhdGVIb29rW1wiVXNlUm91dGVFcnJvclwiXSA9IFwidXNlUm91dGVFcnJvclwiO1xuICBEYXRhUm91dGVyU3RhdGVIb29rW1wiVXNlTmF2aWdhdGlvblwiXSA9IFwidXNlTmF2aWdhdGlvblwiO1xuICBEYXRhUm91dGVyU3RhdGVIb29rW1wiVXNlUm91dGVMb2FkZXJEYXRhXCJdID0gXCJ1c2VSb3V0ZUxvYWRlckRhdGFcIjtcbiAgRGF0YVJvdXRlclN0YXRlSG9va1tcIlVzZU1hdGNoZXNcIl0gPSBcInVzZU1hdGNoZXNcIjtcbiAgRGF0YVJvdXRlclN0YXRlSG9va1tcIlVzZVJldmFsaWRhdG9yXCJdID0gXCJ1c2VSZXZhbGlkYXRvclwiO1xuICBEYXRhUm91dGVyU3RhdGVIb29rW1wiVXNlTmF2aWdhdGVTdGFibGVcIl0gPSBcInVzZU5hdmlnYXRlXCI7XG4gIERhdGFSb3V0ZXJTdGF0ZUhvb2tbXCJVc2VSb3V0ZUlkXCJdID0gXCJ1c2VSb3V0ZUlkXCI7XG4gIHJldHVybiBEYXRhUm91dGVyU3RhdGVIb29rO1xufShEYXRhUm91dGVyU3RhdGVIb29rIHx8IHt9KTtcbmZ1bmN0aW9uIGdldERhdGFSb3V0ZXJDb25zb2xlRXJyb3IoaG9va05hbWUpIHtcbiAgcmV0dXJuIGhvb2tOYW1lICsgXCIgbXVzdCBiZSB1c2VkIHdpdGhpbiBhIGRhdGEgcm91dGVyLiAgU2VlIGh0dHBzOi8vcmVhY3Ryb3V0ZXIuY29tL3JvdXRlcnMvcGlja2luZy1hLXJvdXRlci5cIjtcbn1cbmZ1bmN0aW9uIHVzZURhdGFSb3V0ZXJDb250ZXh0KGhvb2tOYW1lKSB7XG4gIGxldCBjdHggPSBSZWFjdC51c2VDb250ZXh0KERhdGFSb3V0ZXJDb250ZXh0KTtcbiAgIWN0eCA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IFVOU0FGRV9pbnZhcmlhbnQoZmFsc2UsIGdldERhdGFSb3V0ZXJDb25zb2xlRXJyb3IoaG9va05hbWUpKSA6IFVOU0FGRV9pbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICByZXR1cm4gY3R4O1xufVxuZnVuY3Rpb24gdXNlRGF0YVJvdXRlclN0YXRlKGhvb2tOYW1lKSB7XG4gIGxldCBzdGF0ZSA9IFJlYWN0LnVzZUNvbnRleHQoRGF0YVJvdXRlclN0YXRlQ29udGV4dCk7XG4gICFzdGF0ZSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IFVOU0FGRV9pbnZhcmlhbnQoZmFsc2UsIGdldERhdGFSb3V0ZXJDb25zb2xlRXJyb3IoaG9va05hbWUpKSA6IFVOU0FGRV9pbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICByZXR1cm4gc3RhdGU7XG59XG5mdW5jdGlvbiB1c2VSb3V0ZUNvbnRleHQoaG9va05hbWUpIHtcbiAgbGV0IHJvdXRlID0gUmVhY3QudXNlQ29udGV4dChSb3V0ZUNvbnRleHQpO1xuICAhcm91dGUgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBVTlNBRkVfaW52YXJpYW50KGZhbHNlLCBnZXREYXRhUm91dGVyQ29uc29sZUVycm9yKGhvb2tOYW1lKSkgOiBVTlNBRkVfaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgcmV0dXJuIHJvdXRlO1xufVxuXG4vLyBJbnRlcm5hbCB2ZXJzaW9uIHdpdGggaG9va05hbWUtYXdhcmUgZGVidWdnaW5nXG5mdW5jdGlvbiB1c2VDdXJyZW50Um91dGVJZChob29rTmFtZSkge1xuICBsZXQgcm91dGUgPSB1c2VSb3V0ZUNvbnRleHQoaG9va05hbWUpO1xuICBsZXQgdGhpc1JvdXRlID0gcm91dGUubWF0Y2hlc1tyb3V0ZS5tYXRjaGVzLmxlbmd0aCAtIDFdO1xuICAhdGhpc1JvdXRlLnJvdXRlLmlkID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gVU5TQUZFX2ludmFyaWFudChmYWxzZSwgaG9va05hbWUgKyBcIiBjYW4gb25seSBiZSB1c2VkIG9uIHJvdXRlcyB0aGF0IGNvbnRhaW4gYSB1bmlxdWUgXFxcImlkXFxcIlwiKSA6IFVOU0FGRV9pbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICByZXR1cm4gdGhpc1JvdXRlLnJvdXRlLmlkO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIElEIGZvciB0aGUgbmVhcmVzdCBjb250ZXh0dWFsIHJvdXRlXG4gKi9cbmZ1bmN0aW9uIHVzZVJvdXRlSWQoKSB7XG4gIHJldHVybiB1c2VDdXJyZW50Um91dGVJZChEYXRhUm91dGVyU3RhdGVIb29rLlVzZVJvdXRlSWQpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGN1cnJlbnQgbmF2aWdhdGlvbiwgZGVmYXVsdGluZyB0byBhbiBcImlkbGVcIiBuYXZpZ2F0aW9uIHdoZW5cbiAqIG5vIG5hdmlnYXRpb24gaXMgaW4gcHJvZ3Jlc3NcbiAqL1xuZnVuY3Rpb24gdXNlTmF2aWdhdGlvbigpIHtcbiAgbGV0IHN0YXRlID0gdXNlRGF0YVJvdXRlclN0YXRlKERhdGFSb3V0ZXJTdGF0ZUhvb2suVXNlTmF2aWdhdGlvbik7XG4gIHJldHVybiBzdGF0ZS5uYXZpZ2F0aW9uO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSByZXZhbGlkYXRlIGZ1bmN0aW9uIGZvciBtYW51YWxseSB0cmlnZ2VyaW5nIHJldmFsaWRhdGlvbiwgYXMgd2VsbFxuICogYXMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgYW55IG1hbnVhbCByZXZhbGlkYXRpb25zXG4gKi9cbmZ1bmN0aW9uIHVzZVJldmFsaWRhdG9yKCkge1xuICBsZXQgZGF0YVJvdXRlckNvbnRleHQgPSB1c2VEYXRhUm91dGVyQ29udGV4dChEYXRhUm91dGVySG9vay5Vc2VSZXZhbGlkYXRvcik7XG4gIGxldCBzdGF0ZSA9IHVzZURhdGFSb3V0ZXJTdGF0ZShEYXRhUm91dGVyU3RhdGVIb29rLlVzZVJldmFsaWRhdG9yKTtcbiAgcmV0dXJuIFJlYWN0LnVzZU1lbW8oKCkgPT4gKHtcbiAgICByZXZhbGlkYXRlOiBkYXRhUm91dGVyQ29udGV4dC5yb3V0ZXIucmV2YWxpZGF0ZSxcbiAgICBzdGF0ZTogc3RhdGUucmV2YWxpZGF0aW9uXG4gIH0pLCBbZGF0YVJvdXRlckNvbnRleHQucm91dGVyLnJldmFsaWRhdGUsIHN0YXRlLnJldmFsaWRhdGlvbl0pO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGFjdGl2ZSByb3V0ZSBtYXRjaGVzLCB1c2VmdWwgZm9yIGFjY2Vzc2luZyBsb2FkZXJEYXRhIGZvclxuICogcGFyZW50L2NoaWxkIHJvdXRlcyBvciB0aGUgcm91dGUgXCJoYW5kbGVcIiBwcm9wZXJ0eVxuICovXG5mdW5jdGlvbiB1c2VNYXRjaGVzKCkge1xuICBsZXQge1xuICAgIG1hdGNoZXMsXG4gICAgbG9hZGVyRGF0YVxuICB9ID0gdXNlRGF0YVJvdXRlclN0YXRlKERhdGFSb3V0ZXJTdGF0ZUhvb2suVXNlTWF0Y2hlcyk7XG4gIHJldHVybiBSZWFjdC51c2VNZW1vKCgpID0+IG1hdGNoZXMubWFwKG0gPT4gVU5TQUZFX2NvbnZlcnRSb3V0ZU1hdGNoVG9VaU1hdGNoKG0sIGxvYWRlckRhdGEpKSwgW21hdGNoZXMsIGxvYWRlckRhdGFdKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBsb2FkZXIgZGF0YSBmb3IgdGhlIG5lYXJlc3QgYW5jZXN0b3IgUm91dGUgbG9hZGVyXG4gKi9cbmZ1bmN0aW9uIHVzZUxvYWRlckRhdGEoKSB7XG4gIGxldCBzdGF0ZSA9IHVzZURhdGFSb3V0ZXJTdGF0ZShEYXRhUm91dGVyU3RhdGVIb29rLlVzZUxvYWRlckRhdGEpO1xuICBsZXQgcm91dGVJZCA9IHVzZUN1cnJlbnRSb3V0ZUlkKERhdGFSb3V0ZXJTdGF0ZUhvb2suVXNlTG9hZGVyRGF0YSk7XG4gIGlmIChzdGF0ZS5lcnJvcnMgJiYgc3RhdGUuZXJyb3JzW3JvdXRlSWRdICE9IG51bGwpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiWW91IGNhbm5vdCBgdXNlTG9hZGVyRGF0YWAgaW4gYW4gZXJyb3JFbGVtZW50IChyb3V0ZUlkOiBcIiArIHJvdXRlSWQgKyBcIilcIik7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gc3RhdGUubG9hZGVyRGF0YVtyb3V0ZUlkXTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBsb2FkZXJEYXRhIGZvciB0aGUgZ2l2ZW4gcm91dGVJZFxuICovXG5mdW5jdGlvbiB1c2VSb3V0ZUxvYWRlckRhdGEocm91dGVJZCkge1xuICBsZXQgc3RhdGUgPSB1c2VEYXRhUm91dGVyU3RhdGUoRGF0YVJvdXRlclN0YXRlSG9vay5Vc2VSb3V0ZUxvYWRlckRhdGEpO1xuICByZXR1cm4gc3RhdGUubG9hZGVyRGF0YVtyb3V0ZUlkXTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBhY3Rpb24gZGF0YSBmb3IgdGhlIG5lYXJlc3QgYW5jZXN0b3IgUm91dGUgYWN0aW9uXG4gKi9cbmZ1bmN0aW9uIHVzZUFjdGlvbkRhdGEoKSB7XG4gIGxldCBzdGF0ZSA9IHVzZURhdGFSb3V0ZXJTdGF0ZShEYXRhUm91dGVyU3RhdGVIb29rLlVzZUFjdGlvbkRhdGEpO1xuICBsZXQgcm91dGVJZCA9IHVzZUN1cnJlbnRSb3V0ZUlkKERhdGFSb3V0ZXJTdGF0ZUhvb2suVXNlTG9hZGVyRGF0YSk7XG4gIHJldHVybiBzdGF0ZS5hY3Rpb25EYXRhID8gc3RhdGUuYWN0aW9uRGF0YVtyb3V0ZUlkXSA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBuZWFyZXN0IGFuY2VzdG9yIFJvdXRlIGVycm9yLCB3aGljaCBjb3VsZCBiZSBhIGxvYWRlci9hY3Rpb25cbiAqIGVycm9yIG9yIGEgcmVuZGVyIGVycm9yLiAgVGhpcyBpcyBpbnRlbmRlZCB0byBiZSBjYWxsZWQgZnJvbSB5b3VyXG4gKiBFcnJvckJvdW5kYXJ5L2Vycm9yRWxlbWVudCB0byBkaXNwbGF5IGEgcHJvcGVyIGVycm9yIG1lc3NhZ2UuXG4gKi9cbmZ1bmN0aW9uIHVzZVJvdXRlRXJyb3IoKSB7XG4gIHZhciBfc3RhdGUkZXJyb3JzO1xuICBsZXQgZXJyb3IgPSBSZWFjdC51c2VDb250ZXh0KFJvdXRlRXJyb3JDb250ZXh0KTtcbiAgbGV0IHN0YXRlID0gdXNlRGF0YVJvdXRlclN0YXRlKERhdGFSb3V0ZXJTdGF0ZUhvb2suVXNlUm91dGVFcnJvcik7XG4gIGxldCByb3V0ZUlkID0gdXNlQ3VycmVudFJvdXRlSWQoRGF0YVJvdXRlclN0YXRlSG9vay5Vc2VSb3V0ZUVycm9yKTtcblxuICAvLyBJZiB0aGlzIHdhcyBhIHJlbmRlciBlcnJvciwgd2UgcHV0IGl0IGluIGEgUm91dGVFcnJvciBjb250ZXh0IGluc2lkZVxuICAvLyBvZiBSZW5kZXJFcnJvckJvdW5kYXJ5XG4gIGlmIChlcnJvcikge1xuICAgIHJldHVybiBlcnJvcjtcbiAgfVxuXG4gIC8vIE90aGVyd2lzZSBsb29rIGZvciBlcnJvcnMgZnJvbSBvdXIgZGF0YSByb3V0ZXIgc3RhdGVcbiAgcmV0dXJuIChfc3RhdGUkZXJyb3JzID0gc3RhdGUuZXJyb3JzKSA9PSBudWxsID8gdm9pZCAwIDogX3N0YXRlJGVycm9yc1tyb3V0ZUlkXTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBoYXBweS1wYXRoIGRhdGEgZnJvbSB0aGUgbmVhcmVzdCBhbmNlc3RvciBgPEF3YWl0IC8+YCB2YWx1ZVxuICovXG5mdW5jdGlvbiB1c2VBc3luY1ZhbHVlKCkge1xuICBsZXQgdmFsdWUgPSBSZWFjdC51c2VDb250ZXh0KEF3YWl0Q29udGV4dCk7XG4gIHJldHVybiB2YWx1ZSA9PSBudWxsID8gdm9pZCAwIDogdmFsdWUuX2RhdGE7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZXJyb3IgZnJvbSB0aGUgbmVhcmVzdCBhbmNlc3RvciBgPEF3YWl0IC8+YCB2YWx1ZVxuICovXG5mdW5jdGlvbiB1c2VBc3luY0Vycm9yKCkge1xuICBsZXQgdmFsdWUgPSBSZWFjdC51c2VDb250ZXh0KEF3YWl0Q29udGV4dCk7XG4gIHJldHVybiB2YWx1ZSA9PSBudWxsID8gdm9pZCAwIDogdmFsdWUuX2Vycm9yO1xufVxubGV0IGJsb2NrZXJJZCA9IDA7XG5cbi8qKlxuICogQWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIGJsb2NrIG5hdmlnYXRpb25zIHdpdGhpbiB0aGUgU1BBIGFuZCBwcmVzZW50IHRoZVxuICogdXNlciBhIGNvbmZpcm1hdGlvbiBkaWFsb2cgdG8gY29uZmlybSB0aGUgbmF2aWdhdGlvbi4gIE1vc3RseSB1c2VkIHRvIGF2b2lkXG4gKiB1c2luZyBoYWxmLWZpbGxlZCBmb3JtIGRhdGEuICBUaGlzIGRvZXMgbm90IGhhbmRsZSBoYXJkLXJlbG9hZHMgb3JcbiAqIGNyb3NzLW9yaWdpbiBuYXZpZ2F0aW9ucy5cbiAqL1xuZnVuY3Rpb24gdXNlQmxvY2tlcihzaG91bGRCbG9jaykge1xuICBsZXQge1xuICAgIHJvdXRlcixcbiAgICBiYXNlbmFtZVxuICB9ID0gdXNlRGF0YVJvdXRlckNvbnRleHQoRGF0YVJvdXRlckhvb2suVXNlQmxvY2tlcik7XG4gIGxldCBzdGF0ZSA9IHVzZURhdGFSb3V0ZXJTdGF0ZShEYXRhUm91dGVyU3RhdGVIb29rLlVzZUJsb2NrZXIpO1xuICBsZXQgW2Jsb2NrZXJLZXksIHNldEJsb2NrZXJLZXldID0gUmVhY3QudXNlU3RhdGUoXCJcIik7XG4gIGxldCBibG9ja2VyRnVuY3Rpb24gPSBSZWFjdC51c2VDYWxsYmFjayhhcmcgPT4ge1xuICAgIGlmICh0eXBlb2Ygc2hvdWxkQmxvY2sgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuICEhc2hvdWxkQmxvY2s7XG4gICAgfVxuICAgIGlmIChiYXNlbmFtZSA9PT0gXCIvXCIpIHtcbiAgICAgIHJldHVybiBzaG91bGRCbG9jayhhcmcpO1xuICAgIH1cblxuICAgIC8vIElmIHRoZXkgcHJvdmlkZWQgdXMgYSBmdW5jdGlvbiBhbmQgd2UndmUgZ290IGFuIGFjdGl2ZSBiYXNlbmFtZSwgc3RyaXBcbiAgICAvLyBpdCBmcm9tIHRoZSBsb2NhdGlvbnMgd2UgZXhwb3NlIHRvIHRoZSB1c2VyIHRvIG1hdGNoIHRoZSBiZWhhdmlvciBvZlxuICAgIC8vIHVzZUxvY2F0aW9uXG4gICAgbGV0IHtcbiAgICAgIGN1cnJlbnRMb2NhdGlvbixcbiAgICAgIG5leHRMb2NhdGlvbixcbiAgICAgIGhpc3RvcnlBY3Rpb25cbiAgICB9ID0gYXJnO1xuICAgIHJldHVybiBzaG91bGRCbG9jayh7XG4gICAgICBjdXJyZW50TG9jYXRpb246IF9leHRlbmRzKHt9LCBjdXJyZW50TG9jYXRpb24sIHtcbiAgICAgICAgcGF0aG5hbWU6IHN0cmlwQmFzZW5hbWUoY3VycmVudExvY2F0aW9uLnBhdGhuYW1lLCBiYXNlbmFtZSkgfHwgY3VycmVudExvY2F0aW9uLnBhdGhuYW1lXG4gICAgICB9KSxcbiAgICAgIG5leHRMb2NhdGlvbjogX2V4dGVuZHMoe30sIG5leHRMb2NhdGlvbiwge1xuICAgICAgICBwYXRobmFtZTogc3RyaXBCYXNlbmFtZShuZXh0TG9jYXRpb24ucGF0aG5hbWUsIGJhc2VuYW1lKSB8fCBuZXh0TG9jYXRpb24ucGF0aG5hbWVcbiAgICAgIH0pLFxuICAgICAgaGlzdG9yeUFjdGlvblxuICAgIH0pO1xuICB9LCBbYmFzZW5hbWUsIHNob3VsZEJsb2NrXSk7XG5cbiAgLy8gVGhpcyBlZmZlY3QgaXMgaW4gY2hhcmdlIG9mIGJsb2NrZXIga2V5IGFzc2lnbm1lbnQgYW5kIGRlbGV0aW9uICh3aGljaCBpc1xuICAvLyB0aWdodGx5IGNvdXBsZWQgdG8gdGhlIGtleSlcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBsZXQga2V5ID0gU3RyaW5nKCsrYmxvY2tlcklkKTtcbiAgICBzZXRCbG9ja2VyS2V5KGtleSk7XG4gICAgcmV0dXJuICgpID0+IHJvdXRlci5kZWxldGVCbG9ja2VyKGtleSk7XG4gIH0sIFtyb3V0ZXJdKTtcblxuICAvLyBUaGlzIGVmZmVjdCBoYW5kbGVzIGFzc2lnbmluZyB0aGUgYmxvY2tlckZ1bmN0aW9uLiAgVGhpcyBpcyB0byBoYW5kbGVcbiAgLy8gdW5zdGFibGUgYmxvY2tlciBmdW5jdGlvbiBpZGVudGl0aWVzLCBhbmQgaGFwcGVucyBvbmx5IGFmdGVyIHRoZSBwcmlvclxuICAvLyBlZmZlY3Qgc28gd2UgZG9uJ3QgZ2V0IGFuIG9ycGhhbmVkIGJsb2NrZXJGdW5jdGlvbiBpbiB0aGUgcm91dGVyIHdpdGggYVxuICAvLyBrZXkgb2YgXCJcIi4gIFVudGlsIHRoZW4gd2UganVzdCBoYXZlIHRoZSBJRExFX0JMT0NLRVIuXG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGJsb2NrZXJLZXkgIT09IFwiXCIpIHtcbiAgICAgIHJvdXRlci5nZXRCbG9ja2VyKGJsb2NrZXJLZXksIGJsb2NrZXJGdW5jdGlvbik7XG4gICAgfVxuICB9LCBbcm91dGVyLCBibG9ja2VyS2V5LCBibG9ja2VyRnVuY3Rpb25dKTtcblxuICAvLyBQcmVmZXIgdGhlIGJsb2NrZXIgZnJvbSBgc3RhdGVgIG5vdCBgcm91dGVyLnN0YXRlYCBzaW5jZSBEYXRhUm91dGVyQ29udGV4dFxuICAvLyBpcyBtZW1vaXplZCBzbyB0aGlzIGVuc3VyZXMgd2UgdXBkYXRlIG9uIGJsb2NrZXIgc3RhdGUgdXBkYXRlc1xuICByZXR1cm4gYmxvY2tlcktleSAmJiBzdGF0ZS5ibG9ja2Vycy5oYXMoYmxvY2tlcktleSkgPyBzdGF0ZS5ibG9ja2Vycy5nZXQoYmxvY2tlcktleSkgOiBJRExFX0JMT0NLRVI7XG59XG5cbi8qKlxuICogU3RhYmxlIHZlcnNpb24gb2YgdXNlTmF2aWdhdGUgdGhhdCBpcyB1c2VkIHdoZW4gd2UgYXJlIGluIHRoZSBjb250ZXh0IG9mXG4gKiBhIFJvdXRlclByb3ZpZGVyLlxuICovXG5mdW5jdGlvbiB1c2VOYXZpZ2F0ZVN0YWJsZSgpIHtcbiAgbGV0IHtcbiAgICByb3V0ZXJcbiAgfSA9IHVzZURhdGFSb3V0ZXJDb250ZXh0KERhdGFSb3V0ZXJIb29rLlVzZU5hdmlnYXRlU3RhYmxlKTtcbiAgbGV0IGlkID0gdXNlQ3VycmVudFJvdXRlSWQoRGF0YVJvdXRlclN0YXRlSG9vay5Vc2VOYXZpZ2F0ZVN0YWJsZSk7XG4gIGxldCBhY3RpdmVSZWYgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuICB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0KCgpID0+IHtcbiAgICBhY3RpdmVSZWYuY3VycmVudCA9IHRydWU7XG4gIH0pO1xuICBsZXQgbmF2aWdhdGUgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAodG8sIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRpb25zID0ge307XG4gICAgfVxuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IFVOU0FGRV93YXJuaW5nKGFjdGl2ZVJlZi5jdXJyZW50LCBuYXZpZ2F0ZUVmZmVjdFdhcm5pbmcpIDogdm9pZCAwO1xuXG4gICAgLy8gU2hvcnQgY2lyY3VpdCBoZXJlIHNpbmNlIGlmIHRoaXMgaGFwcGVucyBvbiBmaXJzdCByZW5kZXIgdGhlIG5hdmlnYXRlXG4gICAgLy8gaXMgdXNlbGVzcyBiZWNhdXNlIHdlIGhhdmVuJ3Qgd2lyZWQgdXAgb3VyIHJvdXRlciBzdWJzY3JpYmVyIHlldFxuICAgIGlmICghYWN0aXZlUmVmLmN1cnJlbnQpIHJldHVybjtcbiAgICBpZiAodHlwZW9mIHRvID09PSBcIm51bWJlclwiKSB7XG4gICAgICByb3V0ZXIubmF2aWdhdGUodG8pO1xuICAgIH0gZWxzZSB7XG4gICAgICByb3V0ZXIubmF2aWdhdGUodG8sIF9leHRlbmRzKHtcbiAgICAgICAgZnJvbVJvdXRlSWQ6IGlkXG4gICAgICB9LCBvcHRpb25zKSk7XG4gICAgfVxuICB9LCBbcm91dGVyLCBpZF0pO1xuICByZXR1cm4gbmF2aWdhdGU7XG59XG5jb25zdCBhbHJlYWR5V2FybmVkID0ge307XG5mdW5jdGlvbiB3YXJuaW5nT25jZShrZXksIGNvbmQsIG1lc3NhZ2UpIHtcbiAgaWYgKCFjb25kICYmICFhbHJlYWR5V2FybmVkW2tleV0pIHtcbiAgICBhbHJlYWR5V2FybmVkW2tleV0gPSB0cnVlO1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IFVOU0FGRV93YXJuaW5nKGZhbHNlLCBtZXNzYWdlKSA6IHZvaWQgMDtcbiAgfVxufVxuXG4vKipcbiAgV2VicGFjayArIFJlYWN0IDE3IGZhaWxzIHRvIGNvbXBpbGUgb24gYW55IG9mIHRoZSBmb2xsb3dpbmcgYmVjYXVzZSB3ZWJwYWNrXG4gIGNvbXBsYWlucyB0aGF0IGBzdGFydFRyYW5zaXRpb25gIGRvZXNuJ3QgZXhpc3QgaW4gYFJlYWN0YDpcbiAgKiBpbXBvcnQgeyBzdGFydFRyYW5zaXRpb24gfSBmcm9tIFwicmVhY3RcIlxuICAqIGltcG9ydCAqIGFzIFJlYWN0IGZyb20gZnJvbSBcInJlYWN0XCI7XG4gICAgXCJzdGFydFRyYW5zaXRpb25cIiBpbiBSZWFjdCA/IFJlYWN0LnN0YXJ0VHJhbnNpdGlvbigoKSA9PiBzZXRTdGF0ZSgpKSA6IHNldFN0YXRlKClcbiAgKiBpbXBvcnQgKiBhcyBSZWFjdCBmcm9tIGZyb20gXCJyZWFjdFwiO1xuICAgIFwic3RhcnRUcmFuc2l0aW9uXCIgaW4gUmVhY3QgPyBSZWFjdFtcInN0YXJ0VHJhbnNpdGlvblwiXSgoKSA9PiBzZXRTdGF0ZSgpKSA6IHNldFN0YXRlKClcblxuICBNb3ZpbmcgaXQgdG8gYSBjb25zdGFudCBzdWNoIGFzIHRoZSBmb2xsb3dpbmcgc29sdmVzIHRoZSBXZWJwYWNrL1JlYWN0IDE3IGlzc3VlOlxuICAqIGltcG9ydCAqIGFzIFJlYWN0IGZyb20gZnJvbSBcInJlYWN0XCI7XG4gICAgY29uc3QgU1RBUlRfVFJBTlNJVElPTiA9IFwic3RhcnRUcmFuc2l0aW9uXCI7XG4gICAgU1RBUlRfVFJBTlNJVElPTiBpbiBSZWFjdCA/IFJlYWN0W1NUQVJUX1RSQU5TSVRJT05dKCgpID0+IHNldFN0YXRlKCkpIDogc2V0U3RhdGUoKVxuXG4gIEhvd2V2ZXIsIHRoYXQgaW50cm9kdWNlcyB3ZWJwYWNrL3RlcnNlciBtaW5pZmljYXRpb24gaXNzdWVzIGluIHByb2R1Y3Rpb24gYnVpbGRzXG4gIGluIFJlYWN0IDE4IHdoZXJlIG1pbmlmaWNhdGlvbi9vYmZ1c2NhdGlvbiBlbmRzIHVwIHJlbW92aW5nIHRoZSBjYWxsIG9mXG4gIFJlYWN0LnN0YXJ0VHJhbnNpdGlvbiBlbnRpcmVseSBmcm9tIHRoZSBmaXJzdCBoYWxmIG9mIHRoZSB0ZXJuYXJ5LiAgR3JhYmJpbmdcbiAgdGhpcyBleHBvcnRlZCByZWZlcmVuY2Ugb25jZSB1cCBmcm9udCByZXNvbHZlcyB0aGF0IGlzc3VlLlxuXG4gIFNlZSBodHRwczovL2dpdGh1Yi5jb20vcmVtaXgtcnVuL3JlYWN0LXJvdXRlci9pc3N1ZXMvMTA1NzlcbiovXG5jb25zdCBTVEFSVF9UUkFOU0lUSU9OID0gXCJzdGFydFRyYW5zaXRpb25cIjtcbmNvbnN0IHN0YXJ0VHJhbnNpdGlvbkltcGwgPSBSZWFjdFtTVEFSVF9UUkFOU0lUSU9OXTtcblxuLyoqXG4gKiBHaXZlbiBhIFJlbWl4IFJvdXRlciBpbnN0YW5jZSwgcmVuZGVyIHRoZSBhcHByb3ByaWF0ZSBVSVxuICovXG5mdW5jdGlvbiBSb3V0ZXJQcm92aWRlcihfcmVmKSB7XG4gIGxldCB7XG4gICAgZmFsbGJhY2tFbGVtZW50LFxuICAgIHJvdXRlcixcbiAgICBmdXR1cmVcbiAgfSA9IF9yZWY7XG4gIGxldCBbc3RhdGUsIHNldFN0YXRlSW1wbF0gPSBSZWFjdC51c2VTdGF0ZShyb3V0ZXIuc3RhdGUpO1xuICBsZXQge1xuICAgIHY3X3N0YXJ0VHJhbnNpdGlvblxuICB9ID0gZnV0dXJlIHx8IHt9O1xuICBsZXQgc2V0U3RhdGUgPSBSZWFjdC51c2VDYWxsYmFjayhuZXdTdGF0ZSA9PiB7XG4gICAgaWYgKHY3X3N0YXJ0VHJhbnNpdGlvbiAmJiBzdGFydFRyYW5zaXRpb25JbXBsKSB7XG4gICAgICBzdGFydFRyYW5zaXRpb25JbXBsKCgpID0+IHNldFN0YXRlSW1wbChuZXdTdGF0ZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRTdGF0ZUltcGwobmV3U3RhdGUpO1xuICAgIH1cbiAgfSwgW3NldFN0YXRlSW1wbCwgdjdfc3RhcnRUcmFuc2l0aW9uXSk7XG5cbiAgLy8gTmVlZCB0byB1c2UgYSBsYXlvdXQgZWZmZWN0IGhlcmUgc28gd2UgYXJlIHN1YnNjcmliZWQgZWFybHkgZW5vdWdoIHRvXG4gIC8vIHBpY2sgdXAgb24gYW55IHJlbmRlci1kcml2ZW4gcmVkaXJlY3RzL25hdmlnYXRpb25zICh1c2VFZmZlY3QvPE5hdmlnYXRlPilcbiAgUmVhY3QudXNlTGF5b3V0RWZmZWN0KCgpID0+IHJvdXRlci5zdWJzY3JpYmUoc2V0U3RhdGUpLCBbcm91dGVyLCBzZXRTdGF0ZV0pO1xuICBsZXQgbmF2aWdhdG9yID0gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNyZWF0ZUhyZWY6IHJvdXRlci5jcmVhdGVIcmVmLFxuICAgICAgZW5jb2RlTG9jYXRpb246IHJvdXRlci5lbmNvZGVMb2NhdGlvbixcbiAgICAgIGdvOiBuID0+IHJvdXRlci5uYXZpZ2F0ZShuKSxcbiAgICAgIHB1c2g6ICh0bywgc3RhdGUsIG9wdHMpID0+IHJvdXRlci5uYXZpZ2F0ZSh0bywge1xuICAgICAgICBzdGF0ZSxcbiAgICAgICAgcHJldmVudFNjcm9sbFJlc2V0OiBvcHRzID09IG51bGwgPyB2b2lkIDAgOiBvcHRzLnByZXZlbnRTY3JvbGxSZXNldFxuICAgICAgfSksXG4gICAgICByZXBsYWNlOiAodG8sIHN0YXRlLCBvcHRzKSA9PiByb3V0ZXIubmF2aWdhdGUodG8sIHtcbiAgICAgICAgcmVwbGFjZTogdHJ1ZSxcbiAgICAgICAgc3RhdGUsXG4gICAgICAgIHByZXZlbnRTY3JvbGxSZXNldDogb3B0cyA9PSBudWxsID8gdm9pZCAwIDogb3B0cy5wcmV2ZW50U2Nyb2xsUmVzZXRcbiAgICAgIH0pXG4gICAgfTtcbiAgfSwgW3JvdXRlcl0pO1xuICBsZXQgYmFzZW5hbWUgPSByb3V0ZXIuYmFzZW5hbWUgfHwgXCIvXCI7XG4gIGxldCBkYXRhUm91dGVyQ29udGV4dCA9IFJlYWN0LnVzZU1lbW8oKCkgPT4gKHtcbiAgICByb3V0ZXIsXG4gICAgbmF2aWdhdG9yLFxuICAgIHN0YXRpYzogZmFsc2UsXG4gICAgYmFzZW5hbWVcbiAgfSksIFtyb3V0ZXIsIG5hdmlnYXRvciwgYmFzZW5hbWVdKTtcblxuICAvLyBUaGUgZnJhZ21lbnQgYW5kIHtudWxsfSBoZXJlIGFyZSBpbXBvcnRhbnQhICBXZSBuZWVkIHRoZW0gdG8ga2VlcCBSZWFjdCAxOCdzXG4gIC8vIHVzZUlkIGhhcHB5IHdoZW4gd2UgYXJlIHNlcnZlci1yZW5kZXJpbmcgc2luY2Ugd2UgbWF5IGhhdmUgYSA8c2NyaXB0PiBoZXJlXG4gIC8vIGNvbnRhaW5pbmcgdGhlIGh5ZHJhdGVkIHNlcnZlci1zaWRlIHN0YXRpY0NvbnRleHQgKGZyb20gU3RhdGljUm91dGVyUHJvdmlkZXIpLlxuICAvLyB1c2VJZCByZWxpZXMgb24gdGhlIGNvbXBvbmVudCB0cmVlIHN0cnVjdHVyZSB0byBnZW5lcmF0ZSBkZXRlcm1pbmlzdGljIGlkJ3NcbiAgLy8gc28gd2UgbmVlZCB0byBlbnN1cmUgaXQgcmVtYWlucyB0aGUgc2FtZSBvbiB0aGUgY2xpZW50IGV2ZW4gdGhvdWdoXG4gIC8vIHdlIGRvbid0IG5lZWQgdGhlIDxzY3JpcHQ+IHRhZ1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KERhdGFSb3V0ZXJDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IGRhdGFSb3V0ZXJDb250ZXh0XG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KERhdGFSb3V0ZXJTdGF0ZUNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogc3RhdGVcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUm91dGVyLCB7XG4gICAgYmFzZW5hbWU6IGJhc2VuYW1lLFxuICAgIGxvY2F0aW9uOiBzdGF0ZS5sb2NhdGlvbixcbiAgICBuYXZpZ2F0aW9uVHlwZTogc3RhdGUuaGlzdG9yeUFjdGlvbixcbiAgICBuYXZpZ2F0b3I6IG5hdmlnYXRvclxuICB9LCBzdGF0ZS5pbml0aWFsaXplZCA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KERhdGFSb3V0ZXMsIHtcbiAgICByb3V0ZXM6IHJvdXRlci5yb3V0ZXMsXG4gICAgc3RhdGU6IHN0YXRlXG4gIH0pIDogZmFsbGJhY2tFbGVtZW50KSkpLCBudWxsKTtcbn1cbmZ1bmN0aW9uIERhdGFSb3V0ZXMoX3JlZjIpIHtcbiAgbGV0IHtcbiAgICByb3V0ZXMsXG4gICAgc3RhdGVcbiAgfSA9IF9yZWYyO1xuICByZXR1cm4gdXNlUm91dGVzSW1wbChyb3V0ZXMsIHVuZGVmaW5lZCwgc3RhdGUpO1xufVxuLyoqXG4gKiBBIGA8Um91dGVyPmAgdGhhdCBzdG9yZXMgYWxsIGVudHJpZXMgaW4gbWVtb3J5LlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9yZWFjdHJvdXRlci5jb20vcm91dGVyLWNvbXBvbmVudHMvbWVtb3J5LXJvdXRlclxuICovXG5mdW5jdGlvbiBNZW1vcnlSb3V0ZXIoX3JlZjMpIHtcbiAgbGV0IHtcbiAgICBiYXNlbmFtZSxcbiAgICBjaGlsZHJlbixcbiAgICBpbml0aWFsRW50cmllcyxcbiAgICBpbml0aWFsSW5kZXgsXG4gICAgZnV0dXJlXG4gIH0gPSBfcmVmMztcbiAgbGV0IGhpc3RvcnlSZWYgPSBSZWFjdC51c2VSZWYoKTtcbiAgaWYgKGhpc3RvcnlSZWYuY3VycmVudCA9PSBudWxsKSB7XG4gICAgaGlzdG9yeVJlZi5jdXJyZW50ID0gY3JlYXRlTWVtb3J5SGlzdG9yeSh7XG4gICAgICBpbml0aWFsRW50cmllcyxcbiAgICAgIGluaXRpYWxJbmRleCxcbiAgICAgIHY1Q29tcGF0OiB0cnVlXG4gICAgfSk7XG4gIH1cbiAgbGV0IGhpc3RvcnkgPSBoaXN0b3J5UmVmLmN1cnJlbnQ7XG4gIGxldCBbc3RhdGUsIHNldFN0YXRlSW1wbF0gPSBSZWFjdC51c2VTdGF0ZSh7XG4gICAgYWN0aW9uOiBoaXN0b3J5LmFjdGlvbixcbiAgICBsb2NhdGlvbjogaGlzdG9yeS5sb2NhdGlvblxuICB9KTtcbiAgbGV0IHtcbiAgICB2N19zdGFydFRyYW5zaXRpb25cbiAgfSA9IGZ1dHVyZSB8fCB7fTtcbiAgbGV0IHNldFN0YXRlID0gUmVhY3QudXNlQ2FsbGJhY2sobmV3U3RhdGUgPT4ge1xuICAgIHY3X3N0YXJ0VHJhbnNpdGlvbiAmJiBzdGFydFRyYW5zaXRpb25JbXBsID8gc3RhcnRUcmFuc2l0aW9uSW1wbCgoKSA9PiBzZXRTdGF0ZUltcGwobmV3U3RhdGUpKSA6IHNldFN0YXRlSW1wbChuZXdTdGF0ZSk7XG4gIH0sIFtzZXRTdGF0ZUltcGwsIHY3X3N0YXJ0VHJhbnNpdGlvbl0pO1xuICBSZWFjdC51c2VMYXlvdXRFZmZlY3QoKCkgPT4gaGlzdG9yeS5saXN0ZW4oc2V0U3RhdGUpLCBbaGlzdG9yeSwgc2V0U3RhdGVdKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJvdXRlciwge1xuICAgIGJhc2VuYW1lOiBiYXNlbmFtZSxcbiAgICBjaGlsZHJlbjogY2hpbGRyZW4sXG4gICAgbG9jYXRpb246IHN0YXRlLmxvY2F0aW9uLFxuICAgIG5hdmlnYXRpb25UeXBlOiBzdGF0ZS5hY3Rpb24sXG4gICAgbmF2aWdhdG9yOiBoaXN0b3J5XG4gIH0pO1xufVxuLyoqXG4gKiBDaGFuZ2VzIHRoZSBjdXJyZW50IGxvY2F0aW9uLlxuICpcbiAqIE5vdGU6IFRoaXMgQVBJIGlzIG1vc3RseSB1c2VmdWwgaW4gUmVhY3QuQ29tcG9uZW50IHN1YmNsYXNzZXMgdGhhdCBhcmUgbm90XG4gKiBhYmxlIHRvIHVzZSBob29rcy4gSW4gZnVuY3Rpb25hbCBjb21wb25lbnRzLCB3ZSByZWNvbW1lbmQgeW91IHVzZSB0aGVcbiAqIGB1c2VOYXZpZ2F0ZWAgaG9vayBpbnN0ZWFkLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9yZWFjdHJvdXRlci5jb20vY29tcG9uZW50cy9uYXZpZ2F0ZVxuICovXG5mdW5jdGlvbiBOYXZpZ2F0ZShfcmVmNCkge1xuICBsZXQge1xuICAgIHRvLFxuICAgIHJlcGxhY2UsXG4gICAgc3RhdGUsXG4gICAgcmVsYXRpdmVcbiAgfSA9IF9yZWY0O1xuICAhdXNlSW5Sb3V0ZXJDb250ZXh0KCkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBVTlNBRkVfaW52YXJpYW50KGZhbHNlLCAvLyBUT0RPOiBUaGlzIGVycm9yIGlzIHByb2JhYmx5IGJlY2F1c2UgdGhleSBzb21laG93IGhhdmUgMiB2ZXJzaW9ucyBvZlxuICAvLyB0aGUgcm91dGVyIGxvYWRlZC4gV2UgY2FuIGhlbHAgdGhlbSB1bmRlcnN0YW5kIGhvdyB0byBhdm9pZCB0aGF0LlxuICBcIjxOYXZpZ2F0ZT4gbWF5IGJlIHVzZWQgb25seSBpbiB0aGUgY29udGV4dCBvZiBhIDxSb3V0ZXI+IGNvbXBvbmVudC5cIikgOiBVTlNBRkVfaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gVU5TQUZFX3dhcm5pbmcoIVJlYWN0LnVzZUNvbnRleHQoTmF2aWdhdGlvbkNvbnRleHQpLnN0YXRpYywgXCI8TmF2aWdhdGU+IG11c3Qgbm90IGJlIHVzZWQgb24gdGhlIGluaXRpYWwgcmVuZGVyIGluIGEgPFN0YXRpY1JvdXRlcj4uIFwiICsgXCJUaGlzIGlzIGEgbm8tb3AsIGJ1dCB5b3Ugc2hvdWxkIG1vZGlmeSB5b3VyIGNvZGUgc28gdGhlIDxOYXZpZ2F0ZT4gaXMgXCIgKyBcIm9ubHkgZXZlciByZW5kZXJlZCBpbiByZXNwb25zZSB0byBzb21lIHVzZXIgaW50ZXJhY3Rpb24gb3Igc3RhdGUgY2hhbmdlLlwiKSA6IHZvaWQgMDtcbiAgbGV0IHtcbiAgICBtYXRjaGVzXG4gIH0gPSBSZWFjdC51c2VDb250ZXh0KFJvdXRlQ29udGV4dCk7XG4gIGxldCB7XG4gICAgcGF0aG5hbWU6IGxvY2F0aW9uUGF0aG5hbWVcbiAgfSA9IHVzZUxvY2F0aW9uKCk7XG4gIGxldCBuYXZpZ2F0ZSA9IHVzZU5hdmlnYXRlKCk7XG5cbiAgLy8gUmVzb2x2ZSB0aGUgcGF0aCBvdXRzaWRlIG9mIHRoZSBlZmZlY3Qgc28gdGhhdCB3aGVuIGVmZmVjdHMgcnVuIHR3aWNlIGluXG4gIC8vIFN0cmljdE1vZGUgdGhleSBuYXZpZ2F0ZSB0byB0aGUgc2FtZSBwbGFjZVxuICBsZXQgcGF0aCA9IHJlc29sdmVUbyh0bywgVU5TQUZFX2dldFBhdGhDb250cmlidXRpbmdNYXRjaGVzKG1hdGNoZXMpLm1hcChtYXRjaCA9PiBtYXRjaC5wYXRobmFtZUJhc2UpLCBsb2NhdGlvblBhdGhuYW1lLCByZWxhdGl2ZSA9PT0gXCJwYXRoXCIpO1xuICBsZXQganNvblBhdGggPSBKU09OLnN0cmluZ2lmeShwYXRoKTtcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IG5hdmlnYXRlKEpTT04ucGFyc2UoanNvblBhdGgpLCB7XG4gICAgcmVwbGFjZSxcbiAgICBzdGF0ZSxcbiAgICByZWxhdGl2ZVxuICB9KSwgW25hdmlnYXRlLCBqc29uUGF0aCwgcmVsYXRpdmUsIHJlcGxhY2UsIHN0YXRlXSk7XG4gIHJldHVybiBudWxsO1xufVxuLyoqXG4gKiBSZW5kZXJzIHRoZSBjaGlsZCByb3V0ZSdzIGVsZW1lbnQsIGlmIHRoZXJlIGlzIG9uZS5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vcmVhY3Ryb3V0ZXIuY29tL2NvbXBvbmVudHMvb3V0bGV0XG4gKi9cbmZ1bmN0aW9uIE91dGxldChwcm9wcykge1xuICByZXR1cm4gdXNlT3V0bGV0KHByb3BzLmNvbnRleHQpO1xufVxuLyoqXG4gKiBEZWNsYXJlcyBhbiBlbGVtZW50IHRoYXQgc2hvdWxkIGJlIHJlbmRlcmVkIGF0IGEgY2VydGFpbiBVUkwgcGF0aC5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vcmVhY3Ryb3V0ZXIuY29tL2NvbXBvbmVudHMvcm91dGVcbiAqL1xuZnVuY3Rpb24gUm91dGUoX3Byb3BzKSB7XG4gIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IFVOU0FGRV9pbnZhcmlhbnQoZmFsc2UsIFwiQSA8Um91dGU+IGlzIG9ubHkgZXZlciB0byBiZSB1c2VkIGFzIHRoZSBjaGlsZCBvZiA8Um91dGVzPiBlbGVtZW50LCBcIiArIFwibmV2ZXIgcmVuZGVyZWQgZGlyZWN0bHkuIFBsZWFzZSB3cmFwIHlvdXIgPFJvdXRlPiBpbiBhIDxSb3V0ZXM+LlwiKSA6IFVOU0FGRV9pbnZhcmlhbnQoZmFsc2UpIDtcbn1cbi8qKlxuICogUHJvdmlkZXMgbG9jYXRpb24gY29udGV4dCBmb3IgdGhlIHJlc3Qgb2YgdGhlIGFwcC5cbiAqXG4gKiBOb3RlOiBZb3UgdXN1YWxseSB3b24ndCByZW5kZXIgYSBgPFJvdXRlcj5gIGRpcmVjdGx5LiBJbnN0ZWFkLCB5b3UnbGwgcmVuZGVyIGFcbiAqIHJvdXRlciB0aGF0IGlzIG1vcmUgc3BlY2lmaWMgdG8geW91ciBlbnZpcm9ubWVudCBzdWNoIGFzIGEgYDxCcm93c2VyUm91dGVyPmBcbiAqIGluIHdlYiBicm93c2VycyBvciBhIGA8U3RhdGljUm91dGVyPmAgZm9yIHNlcnZlciByZW5kZXJpbmcuXG4gKlxuICogQHNlZSBodHRwczovL3JlYWN0cm91dGVyLmNvbS9yb3V0ZXItY29tcG9uZW50cy9yb3V0ZXJcbiAqL1xuZnVuY3Rpb24gUm91dGVyKF9yZWY1KSB7XG4gIGxldCB7XG4gICAgYmFzZW5hbWU6IGJhc2VuYW1lUHJvcCA9IFwiL1wiLFxuICAgIGNoaWxkcmVuID0gbnVsbCxcbiAgICBsb2NhdGlvbjogbG9jYXRpb25Qcm9wLFxuICAgIG5hdmlnYXRpb25UeXBlID0gQWN0aW9uLlBvcCxcbiAgICBuYXZpZ2F0b3IsXG4gICAgc3RhdGljOiBzdGF0aWNQcm9wID0gZmFsc2VcbiAgfSA9IF9yZWY1O1xuICAhIXVzZUluUm91dGVyQ29udGV4dCgpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gVU5TQUZFX2ludmFyaWFudChmYWxzZSwgXCJZb3UgY2Fubm90IHJlbmRlciBhIDxSb3V0ZXI+IGluc2lkZSBhbm90aGVyIDxSb3V0ZXI+LlwiICsgXCIgWW91IHNob3VsZCBuZXZlciBoYXZlIG1vcmUgdGhhbiBvbmUgaW4geW91ciBhcHAuXCIpIDogVU5TQUZFX2ludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG5cbiAgLy8gUHJlc2VydmUgdHJhaWxpbmcgc2xhc2hlcyBvbiBiYXNlbmFtZSwgc28gd2UgY2FuIGxldCB0aGUgdXNlciBjb250cm9sXG4gIC8vIHRoZSBlbmZvcmNlbWVudCBvZiB0cmFpbGluZyBzbGFzaGVzIHRocm91Z2hvdXQgdGhlIGFwcFxuICBsZXQgYmFzZW5hbWUgPSBiYXNlbmFtZVByb3AucmVwbGFjZSgvXlxcLyovLCBcIi9cIik7XG4gIGxldCBuYXZpZ2F0aW9uQ29udGV4dCA9IFJlYWN0LnVzZU1lbW8oKCkgPT4gKHtcbiAgICBiYXNlbmFtZSxcbiAgICBuYXZpZ2F0b3IsXG4gICAgc3RhdGljOiBzdGF0aWNQcm9wXG4gIH0pLCBbYmFzZW5hbWUsIG5hdmlnYXRvciwgc3RhdGljUHJvcF0pO1xuICBpZiAodHlwZW9mIGxvY2F0aW9uUHJvcCA9PT0gXCJzdHJpbmdcIikge1xuICAgIGxvY2F0aW9uUHJvcCA9IHBhcnNlUGF0aChsb2NhdGlvblByb3ApO1xuICB9XG4gIGxldCB7XG4gICAgcGF0aG5hbWUgPSBcIi9cIixcbiAgICBzZWFyY2ggPSBcIlwiLFxuICAgIGhhc2ggPSBcIlwiLFxuICAgIHN0YXRlID0gbnVsbCxcbiAgICBrZXkgPSBcImRlZmF1bHRcIlxuICB9ID0gbG9jYXRpb25Qcm9wO1xuICBsZXQgbG9jYXRpb25Db250ZXh0ID0gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgbGV0IHRyYWlsaW5nUGF0aG5hbWUgPSBzdHJpcEJhc2VuYW1lKHBhdGhuYW1lLCBiYXNlbmFtZSk7XG4gICAgaWYgKHRyYWlsaW5nUGF0aG5hbWUgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBsb2NhdGlvbjoge1xuICAgICAgICBwYXRobmFtZTogdHJhaWxpbmdQYXRobmFtZSxcbiAgICAgICAgc2VhcmNoLFxuICAgICAgICBoYXNoLFxuICAgICAgICBzdGF0ZSxcbiAgICAgICAga2V5XG4gICAgICB9LFxuICAgICAgbmF2aWdhdGlvblR5cGVcbiAgICB9O1xuICB9LCBbYmFzZW5hbWUsIHBhdGhuYW1lLCBzZWFyY2gsIGhhc2gsIHN0YXRlLCBrZXksIG5hdmlnYXRpb25UeXBlXSk7XG4gIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IFVOU0FGRV93YXJuaW5nKGxvY2F0aW9uQ29udGV4dCAhPSBudWxsLCBcIjxSb3V0ZXIgYmFzZW5hbWU9XFxcIlwiICsgYmFzZW5hbWUgKyBcIlxcXCI+IGlzIG5vdCBhYmxlIHRvIG1hdGNoIHRoZSBVUkwgXCIgKyAoXCJcXFwiXCIgKyBwYXRobmFtZSArIHNlYXJjaCArIGhhc2ggKyBcIlxcXCIgYmVjYXVzZSBpdCBkb2VzIG5vdCBzdGFydCB3aXRoIHRoZSBcIikgKyBcImJhc2VuYW1lLCBzbyB0aGUgPFJvdXRlcj4gd29uJ3QgcmVuZGVyIGFueXRoaW5nLlwiKSA6IHZvaWQgMDtcbiAgaWYgKGxvY2F0aW9uQ29udGV4dCA9PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE5hdmlnYXRpb25Db250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IG5hdmlnYXRpb25Db250ZXh0XG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KExvY2F0aW9uQ29udGV4dC5Qcm92aWRlciwge1xuICAgIGNoaWxkcmVuOiBjaGlsZHJlbixcbiAgICB2YWx1ZTogbG9jYXRpb25Db250ZXh0XG4gIH0pKTtcbn1cbi8qKlxuICogQSBjb250YWluZXIgZm9yIGEgbmVzdGVkIHRyZWUgb2YgYDxSb3V0ZT5gIGVsZW1lbnRzIHRoYXQgcmVuZGVycyB0aGUgYnJhbmNoXG4gKiB0aGF0IGJlc3QgbWF0Y2hlcyB0aGUgY3VycmVudCBsb2NhdGlvbi5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vcmVhY3Ryb3V0ZXIuY29tL2NvbXBvbmVudHMvcm91dGVzXG4gKi9cbmZ1bmN0aW9uIFJvdXRlcyhfcmVmNikge1xuICBsZXQge1xuICAgIGNoaWxkcmVuLFxuICAgIGxvY2F0aW9uXG4gIH0gPSBfcmVmNjtcbiAgcmV0dXJuIHVzZVJvdXRlcyhjcmVhdGVSb3V0ZXNGcm9tQ2hpbGRyZW4oY2hpbGRyZW4pLCBsb2NhdGlvbik7XG59XG4vKipcbiAqIENvbXBvbmVudCB0byB1c2UgZm9yIHJlbmRlcmluZyBsYXppbHkgbG9hZGVkIGRhdGEgZnJvbSByZXR1cm5pbmcgZGVmZXIoKVxuICogaW4gYSBsb2FkZXIgZnVuY3Rpb25cbiAqL1xuZnVuY3Rpb24gQXdhaXQoX3JlZjcpIHtcbiAgbGV0IHtcbiAgICBjaGlsZHJlbixcbiAgICBlcnJvckVsZW1lbnQsXG4gICAgcmVzb2x2ZVxuICB9ID0gX3JlZjc7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChBd2FpdEVycm9yQm91bmRhcnksIHtcbiAgICByZXNvbHZlOiByZXNvbHZlLFxuICAgIGVycm9yRWxlbWVudDogZXJyb3JFbGVtZW50XG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlc29sdmVBd2FpdCwgbnVsbCwgY2hpbGRyZW4pKTtcbn1cbnZhciBBd2FpdFJlbmRlclN0YXR1cyA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoQXdhaXRSZW5kZXJTdGF0dXMpIHtcbiAgQXdhaXRSZW5kZXJTdGF0dXNbQXdhaXRSZW5kZXJTdGF0dXNbXCJwZW5kaW5nXCJdID0gMF0gPSBcInBlbmRpbmdcIjtcbiAgQXdhaXRSZW5kZXJTdGF0dXNbQXdhaXRSZW5kZXJTdGF0dXNbXCJzdWNjZXNzXCJdID0gMV0gPSBcInN1Y2Nlc3NcIjtcbiAgQXdhaXRSZW5kZXJTdGF0dXNbQXdhaXRSZW5kZXJTdGF0dXNbXCJlcnJvclwiXSA9IDJdID0gXCJlcnJvclwiO1xuICByZXR1cm4gQXdhaXRSZW5kZXJTdGF0dXM7XG59KEF3YWl0UmVuZGVyU3RhdHVzIHx8IHt9KTtcbmNvbnN0IG5ldmVyU2V0dGxlZFByb21pc2UgPSBuZXcgUHJvbWlzZSgoKSA9PiB7fSk7XG5jbGFzcyBBd2FpdEVycm9yQm91bmRhcnkgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgZXJyb3I6IG51bGxcbiAgICB9O1xuICB9XG4gIHN0YXRpYyBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IoZXJyb3IpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZXJyb3JcbiAgICB9O1xuICB9XG4gIGNvbXBvbmVudERpZENhdGNoKGVycm9yLCBlcnJvckluZm8pIHtcbiAgICBjb25zb2xlLmVycm9yKFwiPEF3YWl0PiBjYXVnaHQgdGhlIGZvbGxvd2luZyBlcnJvciBkdXJpbmcgcmVuZGVyXCIsIGVycm9yLCBlcnJvckluZm8pO1xuICB9XG4gIHJlbmRlcigpIHtcbiAgICBsZXQge1xuICAgICAgY2hpbGRyZW4sXG4gICAgICBlcnJvckVsZW1lbnQsXG4gICAgICByZXNvbHZlXG4gICAgfSA9IHRoaXMucHJvcHM7XG4gICAgbGV0IHByb21pc2UgPSBudWxsO1xuICAgIGxldCBzdGF0dXMgPSBBd2FpdFJlbmRlclN0YXR1cy5wZW5kaW5nO1xuICAgIGlmICghKHJlc29sdmUgaW5zdGFuY2VvZiBQcm9taXNlKSkge1xuICAgICAgLy8gRGlkbid0IGdldCBhIHByb21pc2UgLSBwcm92aWRlIGFzIGEgcmVzb2x2ZWQgcHJvbWlzZVxuICAgICAgc3RhdHVzID0gQXdhaXRSZW5kZXJTdGF0dXMuc3VjY2VzcztcbiAgICAgIHByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm9taXNlLCBcIl90cmFja2VkXCIsIHtcbiAgICAgICAgZ2V0OiAoKSA9PiB0cnVlXG4gICAgICB9KTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm9taXNlLCBcIl9kYXRhXCIsIHtcbiAgICAgICAgZ2V0OiAoKSA9PiByZXNvbHZlXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUuZXJyb3IpIHtcbiAgICAgIC8vIENhdWdodCBhIHJlbmRlciBlcnJvciwgcHJvdmlkZSBpdCBhcyBhIHJlamVjdGVkIHByb21pc2VcbiAgICAgIHN0YXR1cyA9IEF3YWl0UmVuZGVyU3RhdHVzLmVycm9yO1xuICAgICAgbGV0IHJlbmRlckVycm9yID0gdGhpcy5zdGF0ZS5lcnJvcjtcbiAgICAgIHByb21pc2UgPSBQcm9taXNlLnJlamVjdCgpLmNhdGNoKCgpID0+IHt9KTsgLy8gQXZvaWQgdW5oYW5kbGVkIHJlamVjdGlvbiB3YXJuaW5nc1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb21pc2UsIFwiX3RyYWNrZWRcIiwge1xuICAgICAgICBnZXQ6ICgpID0+IHRydWVcbiAgICAgIH0pO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb21pc2UsIFwiX2Vycm9yXCIsIHtcbiAgICAgICAgZ2V0OiAoKSA9PiByZW5kZXJFcnJvclxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChyZXNvbHZlLl90cmFja2VkKSB7XG4gICAgICAvLyBBbHJlYWR5IHRyYWNrZWQgcHJvbWlzZSAtIGNoZWNrIGNvbnRlbnRzXG4gICAgICBwcm9taXNlID0gcmVzb2x2ZTtcbiAgICAgIHN0YXR1cyA9IHByb21pc2UuX2Vycm9yICE9PSB1bmRlZmluZWQgPyBBd2FpdFJlbmRlclN0YXR1cy5lcnJvciA6IHByb21pc2UuX2RhdGEgIT09IHVuZGVmaW5lZCA/IEF3YWl0UmVuZGVyU3RhdHVzLnN1Y2Nlc3MgOiBBd2FpdFJlbmRlclN0YXR1cy5wZW5kaW5nO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSYXcgKHVudHJhY2tlZCkgcHJvbWlzZSAtIHRyYWNrIGl0XG4gICAgICBzdGF0dXMgPSBBd2FpdFJlbmRlclN0YXR1cy5wZW5kaW5nO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlc29sdmUsIFwiX3RyYWNrZWRcIiwge1xuICAgICAgICBnZXQ6ICgpID0+IHRydWVcbiAgICAgIH0pO1xuICAgICAgcHJvbWlzZSA9IHJlc29sdmUudGhlbihkYXRhID0+IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXNvbHZlLCBcIl9kYXRhXCIsIHtcbiAgICAgICAgZ2V0OiAoKSA9PiBkYXRhXG4gICAgICB9KSwgZXJyb3IgPT4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlc29sdmUsIFwiX2Vycm9yXCIsIHtcbiAgICAgICAgZ2V0OiAoKSA9PiBlcnJvclxuICAgICAgfSkpO1xuICAgIH1cbiAgICBpZiAoc3RhdHVzID09PSBBd2FpdFJlbmRlclN0YXR1cy5lcnJvciAmJiBwcm9taXNlLl9lcnJvciBpbnN0YW5jZW9mIEFib3J0ZWREZWZlcnJlZEVycm9yKSB7XG4gICAgICAvLyBGcmVlemUgdGhlIFVJIGJ5IHRocm93aW5nIGEgbmV2ZXIgcmVzb2x2ZWQgcHJvbWlzZVxuICAgICAgdGhyb3cgbmV2ZXJTZXR0bGVkUHJvbWlzZTtcbiAgICB9XG4gICAgaWYgKHN0YXR1cyA9PT0gQXdhaXRSZW5kZXJTdGF0dXMuZXJyb3IgJiYgIWVycm9yRWxlbWVudCkge1xuICAgICAgLy8gTm8gZXJyb3JFbGVtZW50LCB0aHJvdyB0byB0aGUgbmVhcmVzdCByb3V0ZS1sZXZlbCBlcnJvciBib3VuZGFyeVxuICAgICAgdGhyb3cgcHJvbWlzZS5fZXJyb3I7XG4gICAgfVxuICAgIGlmIChzdGF0dXMgPT09IEF3YWl0UmVuZGVyU3RhdHVzLmVycm9yKSB7XG4gICAgICAvLyBSZW5kZXIgdmlhIG91ciBlcnJvckVsZW1lbnRcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChBd2FpdENvbnRleHQuUHJvdmlkZXIsIHtcbiAgICAgICAgdmFsdWU6IHByb21pc2UsXG4gICAgICAgIGNoaWxkcmVuOiBlcnJvckVsZW1lbnRcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoc3RhdHVzID09PSBBd2FpdFJlbmRlclN0YXR1cy5zdWNjZXNzKSB7XG4gICAgICAvLyBSZW5kZXIgY2hpbGRyZW4gd2l0aCByZXNvbHZlZCB2YWx1ZVxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEF3YWl0Q29udGV4dC5Qcm92aWRlciwge1xuICAgICAgICB2YWx1ZTogcHJvbWlzZSxcbiAgICAgICAgY2hpbGRyZW46IGNoaWxkcmVuXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBUaHJvdyB0byB0aGUgc3VzcGVuc2UgYm91bmRhcnlcbiAgICB0aHJvdyBwcm9taXNlO1xuICB9XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEluZGlyZWN0aW9uIHRvIGxldmVyYWdlIHVzZUFzeW5jVmFsdWUgZm9yIGEgcmVuZGVyLXByb3AgQVBJIG9uIGA8QXdhaXQ+YFxuICovXG5mdW5jdGlvbiBSZXNvbHZlQXdhaXQoX3JlZjgpIHtcbiAgbGV0IHtcbiAgICBjaGlsZHJlblxuICB9ID0gX3JlZjg7XG4gIGxldCBkYXRhID0gdXNlQXN5bmNWYWx1ZSgpO1xuICBsZXQgdG9SZW5kZXIgPSB0eXBlb2YgY2hpbGRyZW4gPT09IFwiZnVuY3Rpb25cIiA/IGNoaWxkcmVuKGRhdGEpIDogY2hpbGRyZW47XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgdG9SZW5kZXIpO1xufVxuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBVVElMU1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4vKipcbiAqIENyZWF0ZXMgYSByb3V0ZSBjb25maWcgZnJvbSBhIFJlYWN0IFwiY2hpbGRyZW5cIiBvYmplY3QsIHdoaWNoIGlzIHVzdWFsbHlcbiAqIGVpdGhlciBhIGA8Um91dGU+YCBlbGVtZW50IG9yIGFuIGFycmF5IG9mIHRoZW0uIFVzZWQgaW50ZXJuYWxseSBieVxuICogYDxSb3V0ZXM+YCB0byBjcmVhdGUgYSByb3V0ZSBjb25maWcgZnJvbSBpdHMgY2hpbGRyZW4uXG4gKlxuICogQHNlZSBodHRwczovL3JlYWN0cm91dGVyLmNvbS91dGlscy9jcmVhdGUtcm91dGVzLWZyb20tY2hpbGRyZW5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlUm91dGVzRnJvbUNoaWxkcmVuKGNoaWxkcmVuLCBwYXJlbnRQYXRoKSB7XG4gIGlmIChwYXJlbnRQYXRoID09PSB2b2lkIDApIHtcbiAgICBwYXJlbnRQYXRoID0gW107XG4gIH1cbiAgbGV0IHJvdXRlcyA9IFtdO1xuICBSZWFjdC5DaGlsZHJlbi5mb3JFYWNoKGNoaWxkcmVuLCAoZWxlbWVudCwgaW5kZXgpID0+IHtcbiAgICBpZiAoISAvKiNfX1BVUkVfXyovUmVhY3QuaXNWYWxpZEVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAgIC8vIElnbm9yZSBub24tZWxlbWVudHMuIFRoaXMgYWxsb3dzIHBlb3BsZSB0byBtb3JlIGVhc2lseSBpbmxpbmVcbiAgICAgIC8vIGNvbmRpdGlvbmFscyBpbiB0aGVpciByb3V0ZSBjb25maWcuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCB0cmVlUGF0aCA9IFsuLi5wYXJlbnRQYXRoLCBpbmRleF07XG4gICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gUmVhY3QuRnJhZ21lbnQpIHtcbiAgICAgIC8vIFRyYW5zcGFyZW50bHkgc3VwcG9ydCBSZWFjdC5GcmFnbWVudCBhbmQgaXRzIGNoaWxkcmVuLlxuICAgICAgcm91dGVzLnB1c2guYXBwbHkocm91dGVzLCBjcmVhdGVSb3V0ZXNGcm9tQ2hpbGRyZW4oZWxlbWVudC5wcm9wcy5jaGlsZHJlbiwgdHJlZVBhdGgpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgIShlbGVtZW50LnR5cGUgPT09IFJvdXRlKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IFVOU0FGRV9pbnZhcmlhbnQoZmFsc2UsIFwiW1wiICsgKHR5cGVvZiBlbGVtZW50LnR5cGUgPT09IFwic3RyaW5nXCIgPyBlbGVtZW50LnR5cGUgOiBlbGVtZW50LnR5cGUubmFtZSkgKyBcIl0gaXMgbm90IGEgPFJvdXRlPiBjb21wb25lbnQuIEFsbCBjb21wb25lbnQgY2hpbGRyZW4gb2YgPFJvdXRlcz4gbXVzdCBiZSBhIDxSb3V0ZT4gb3IgPFJlYWN0LkZyYWdtZW50PlwiKSA6IFVOU0FGRV9pbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICAgICEoIWVsZW1lbnQucHJvcHMuaW5kZXggfHwgIWVsZW1lbnQucHJvcHMuY2hpbGRyZW4pID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gVU5TQUZFX2ludmFyaWFudChmYWxzZSwgXCJBbiBpbmRleCByb3V0ZSBjYW5ub3QgaGF2ZSBjaGlsZCByb3V0ZXMuXCIpIDogVU5TQUZFX2ludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG4gICAgbGV0IHJvdXRlID0ge1xuICAgICAgaWQ6IGVsZW1lbnQucHJvcHMuaWQgfHwgdHJlZVBhdGguam9pbihcIi1cIiksXG4gICAgICBjYXNlU2Vuc2l0aXZlOiBlbGVtZW50LnByb3BzLmNhc2VTZW5zaXRpdmUsXG4gICAgICBlbGVtZW50OiBlbGVtZW50LnByb3BzLmVsZW1lbnQsXG4gICAgICBDb21wb25lbnQ6IGVsZW1lbnQucHJvcHMuQ29tcG9uZW50LFxuICAgICAgaW5kZXg6IGVsZW1lbnQucHJvcHMuaW5kZXgsXG4gICAgICBwYXRoOiBlbGVtZW50LnByb3BzLnBhdGgsXG4gICAgICBsb2FkZXI6IGVsZW1lbnQucHJvcHMubG9hZGVyLFxuICAgICAgYWN0aW9uOiBlbGVtZW50LnByb3BzLmFjdGlvbixcbiAgICAgIGVycm9yRWxlbWVudDogZWxlbWVudC5wcm9wcy5lcnJvckVsZW1lbnQsXG4gICAgICBFcnJvckJvdW5kYXJ5OiBlbGVtZW50LnByb3BzLkVycm9yQm91bmRhcnksXG4gICAgICBoYXNFcnJvckJvdW5kYXJ5OiBlbGVtZW50LnByb3BzLkVycm9yQm91bmRhcnkgIT0gbnVsbCB8fCBlbGVtZW50LnByb3BzLmVycm9yRWxlbWVudCAhPSBudWxsLFxuICAgICAgc2hvdWxkUmV2YWxpZGF0ZTogZWxlbWVudC5wcm9wcy5zaG91bGRSZXZhbGlkYXRlLFxuICAgICAgaGFuZGxlOiBlbGVtZW50LnByb3BzLmhhbmRsZSxcbiAgICAgIGxhenk6IGVsZW1lbnQucHJvcHMubGF6eVxuICAgIH07XG4gICAgaWYgKGVsZW1lbnQucHJvcHMuY2hpbGRyZW4pIHtcbiAgICAgIHJvdXRlLmNoaWxkcmVuID0gY3JlYXRlUm91dGVzRnJvbUNoaWxkcmVuKGVsZW1lbnQucHJvcHMuY2hpbGRyZW4sIHRyZWVQYXRoKTtcbiAgICB9XG4gICAgcm91dGVzLnB1c2gocm91dGUpO1xuICB9KTtcbiAgcmV0dXJuIHJvdXRlcztcbn1cblxuLyoqXG4gKiBSZW5kZXJzIHRoZSByZXN1bHQgb2YgYG1hdGNoUm91dGVzKClgIGludG8gYSBSZWFjdCBlbGVtZW50LlxuICovXG5mdW5jdGlvbiByZW5kZXJNYXRjaGVzKG1hdGNoZXMpIHtcbiAgcmV0dXJuIF9yZW5kZXJNYXRjaGVzKG1hdGNoZXMpO1xufVxuXG5mdW5jdGlvbiBtYXBSb3V0ZVByb3BlcnRpZXMocm91dGUpIHtcbiAgbGV0IHVwZGF0ZXMgPSB7XG4gICAgLy8gTm90ZTogdGhpcyBjaGVjayBhbHNvIG9jY3VycyBpbiBjcmVhdGVSb3V0ZXNGcm9tQ2hpbGRyZW4gc28gdXBkYXRlXG4gICAgLy8gdGhlcmUgaWYgeW91IGNoYW5nZSB0aGlzIC0tIHBsZWFzZSBhbmQgdGhhbmsgeW91IVxuICAgIGhhc0Vycm9yQm91bmRhcnk6IHJvdXRlLkVycm9yQm91bmRhcnkgIT0gbnVsbCB8fCByb3V0ZS5lcnJvckVsZW1lbnQgIT0gbnVsbFxuICB9O1xuICBpZiAocm91dGUuQ29tcG9uZW50KSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgaWYgKHJvdXRlLmVsZW1lbnQpIHtcbiAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gVU5TQUZFX3dhcm5pbmcoZmFsc2UsIFwiWW91IHNob3VsZCBub3QgaW5jbHVkZSBib3RoIGBDb21wb25lbnRgIGFuZCBgZWxlbWVudGAgb24geW91ciByb3V0ZSAtIFwiICsgXCJgQ29tcG9uZW50YCB3aWxsIGJlIHVzZWQuXCIpIDogdm9pZCAwO1xuICAgICAgfVxuICAgIH1cbiAgICBPYmplY3QuYXNzaWduKHVwZGF0ZXMsIHtcbiAgICAgIGVsZW1lbnQ6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KHJvdXRlLkNvbXBvbmVudCksXG4gICAgICBDb21wb25lbnQ6IHVuZGVmaW5lZFxuICAgIH0pO1xuICB9XG4gIGlmIChyb3V0ZS5FcnJvckJvdW5kYXJ5KSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgaWYgKHJvdXRlLmVycm9yRWxlbWVudCkge1xuICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBVTlNBRkVfd2FybmluZyhmYWxzZSwgXCJZb3Ugc2hvdWxkIG5vdCBpbmNsdWRlIGJvdGggYEVycm9yQm91bmRhcnlgIGFuZCBgZXJyb3JFbGVtZW50YCBvbiB5b3VyIHJvdXRlIC0gXCIgKyBcImBFcnJvckJvdW5kYXJ5YCB3aWxsIGJlIHVzZWQuXCIpIDogdm9pZCAwO1xuICAgICAgfVxuICAgIH1cbiAgICBPYmplY3QuYXNzaWduKHVwZGF0ZXMsIHtcbiAgICAgIGVycm9yRWxlbWVudDogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQocm91dGUuRXJyb3JCb3VuZGFyeSksXG4gICAgICBFcnJvckJvdW5kYXJ5OiB1bmRlZmluZWRcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gdXBkYXRlcztcbn1cbmZ1bmN0aW9uIGNyZWF0ZU1lbW9yeVJvdXRlcihyb3V0ZXMsIG9wdHMpIHtcbiAgcmV0dXJuIGNyZWF0ZVJvdXRlcih7XG4gICAgYmFzZW5hbWU6IG9wdHMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wdHMuYmFzZW5hbWUsXG4gICAgZnV0dXJlOiBfZXh0ZW5kcyh7fSwgb3B0cyA9PSBudWxsID8gdm9pZCAwIDogb3B0cy5mdXR1cmUsIHtcbiAgICAgIHY3X3ByZXBlbmRCYXNlbmFtZTogdHJ1ZVxuICAgIH0pLFxuICAgIGhpc3Rvcnk6IGNyZWF0ZU1lbW9yeUhpc3Rvcnkoe1xuICAgICAgaW5pdGlhbEVudHJpZXM6IG9wdHMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wdHMuaW5pdGlhbEVudHJpZXMsXG4gICAgICBpbml0aWFsSW5kZXg6IG9wdHMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wdHMuaW5pdGlhbEluZGV4XG4gICAgfSksXG4gICAgaHlkcmF0aW9uRGF0YTogb3B0cyA9PSBudWxsID8gdm9pZCAwIDogb3B0cy5oeWRyYXRpb25EYXRhLFxuICAgIHJvdXRlcyxcbiAgICBtYXBSb3V0ZVByb3BlcnRpZXNcbiAgfSkuaW5pdGlhbGl6ZSgpO1xufVxuXG5leHBvcnQgeyBBd2FpdCwgTWVtb3J5Um91dGVyLCBOYXZpZ2F0ZSwgT3V0bGV0LCBSb3V0ZSwgUm91dGVyLCBSb3V0ZXJQcm92aWRlciwgUm91dGVzLCBEYXRhUm91dGVyQ29udGV4dCBhcyBVTlNBRkVfRGF0YVJvdXRlckNvbnRleHQsIERhdGFSb3V0ZXJTdGF0ZUNvbnRleHQgYXMgVU5TQUZFX0RhdGFSb3V0ZXJTdGF0ZUNvbnRleHQsIExvY2F0aW9uQ29udGV4dCBhcyBVTlNBRkVfTG9jYXRpb25Db250ZXh0LCBOYXZpZ2F0aW9uQ29udGV4dCBhcyBVTlNBRkVfTmF2aWdhdGlvbkNvbnRleHQsIFJvdXRlQ29udGV4dCBhcyBVTlNBRkVfUm91dGVDb250ZXh0LCBtYXBSb3V0ZVByb3BlcnRpZXMgYXMgVU5TQUZFX21hcFJvdXRlUHJvcGVydGllcywgdXNlUm91dGVJZCBhcyBVTlNBRkVfdXNlUm91dGVJZCwgdXNlUm91dGVzSW1wbCBhcyBVTlNBRkVfdXNlUm91dGVzSW1wbCwgY3JlYXRlTWVtb3J5Um91dGVyLCBjcmVhdGVSb3V0ZXNGcm9tQ2hpbGRyZW4sIGNyZWF0ZVJvdXRlc0Zyb21DaGlsZHJlbiBhcyBjcmVhdGVSb3V0ZXNGcm9tRWxlbWVudHMsIHJlbmRlck1hdGNoZXMsIHVzZUFjdGlvbkRhdGEsIHVzZUFzeW5jRXJyb3IsIHVzZUFzeW5jVmFsdWUsIHVzZUJsb2NrZXIsIHVzZUhyZWYsIHVzZUluUm91dGVyQ29udGV4dCwgdXNlTG9hZGVyRGF0YSwgdXNlTG9jYXRpb24sIHVzZU1hdGNoLCB1c2VNYXRjaGVzLCB1c2VOYXZpZ2F0ZSwgdXNlTmF2aWdhdGlvbiwgdXNlTmF2aWdhdGlvblR5cGUsIHVzZU91dGxldCwgdXNlT3V0bGV0Q29udGV4dCwgdXNlUGFyYW1zLCB1c2VSZXNvbHZlZFBhdGgsIHVzZVJldmFsaWRhdG9yLCB1c2VSb3V0ZUVycm9yLCB1c2VSb3V0ZUxvYWRlckRhdGEsIHVzZVJvdXRlcyB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwXG4iLCIvKipcbiAqIFJlYWN0IFJvdXRlciBET00gdjYuMjAuMVxuICpcbiAqIENvcHlyaWdodCAoYykgUmVtaXggU29mdHdhcmUgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRS5tZCBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICpcbiAqIEBsaWNlbnNlIE1JVFxuICovXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgKiBhcyBSZWFjdERPTSBmcm9tICdyZWFjdC1kb20nO1xuaW1wb3J0IHsgVU5TQUZFX21hcFJvdXRlUHJvcGVydGllcywgVU5TQUZFX0RhdGFSb3V0ZXJDb250ZXh0LCBVTlNBRkVfRGF0YVJvdXRlclN0YXRlQ29udGV4dCwgUm91dGVyLCBVTlNBRkVfdXNlUm91dGVzSW1wbCwgVU5TQUZFX05hdmlnYXRpb25Db250ZXh0LCB1c2VIcmVmLCB1c2VSZXNvbHZlZFBhdGgsIHVzZUxvY2F0aW9uLCB1c2VOYXZpZ2F0ZSwgY3JlYXRlUGF0aCwgVU5TQUZFX3VzZVJvdXRlSWQsIFVOU0FGRV9Sb3V0ZUNvbnRleHQsIHVzZU1hdGNoZXMsIHVzZU5hdmlnYXRpb24sIHVzZUJsb2NrZXIgfSBmcm9tICdyZWFjdC1yb3V0ZXInO1xuZXhwb3J0IHsgQWJvcnRlZERlZmVycmVkRXJyb3IsIEF3YWl0LCBNZW1vcnlSb3V0ZXIsIE5hdmlnYXRlLCBOYXZpZ2F0aW9uVHlwZSwgT3V0bGV0LCBSb3V0ZSwgUm91dGVyLCBSb3V0ZXMsIFVOU0FGRV9EYXRhUm91dGVyQ29udGV4dCwgVU5TQUZFX0RhdGFSb3V0ZXJTdGF0ZUNvbnRleHQsIFVOU0FGRV9Mb2NhdGlvbkNvbnRleHQsIFVOU0FGRV9OYXZpZ2F0aW9uQ29udGV4dCwgVU5TQUZFX1JvdXRlQ29udGV4dCwgVU5TQUZFX3VzZVJvdXRlSWQsIGNyZWF0ZU1lbW9yeVJvdXRlciwgY3JlYXRlUGF0aCwgY3JlYXRlUm91dGVzRnJvbUNoaWxkcmVuLCBjcmVhdGVSb3V0ZXNGcm9tRWxlbWVudHMsIGRlZmVyLCBnZW5lcmF0ZVBhdGgsIGlzUm91dGVFcnJvclJlc3BvbnNlLCBqc29uLCBtYXRjaFBhdGgsIG1hdGNoUm91dGVzLCBwYXJzZVBhdGgsIHJlZGlyZWN0LCByZWRpcmVjdERvY3VtZW50LCByZW5kZXJNYXRjaGVzLCByZXNvbHZlUGF0aCwgdXNlQWN0aW9uRGF0YSwgdXNlQXN5bmNFcnJvciwgdXNlQXN5bmNWYWx1ZSwgdXNlQmxvY2tlciwgdXNlSHJlZiwgdXNlSW5Sb3V0ZXJDb250ZXh0LCB1c2VMb2FkZXJEYXRhLCB1c2VMb2NhdGlvbiwgdXNlTWF0Y2gsIHVzZU1hdGNoZXMsIHVzZU5hdmlnYXRlLCB1c2VOYXZpZ2F0aW9uLCB1c2VOYXZpZ2F0aW9uVHlwZSwgdXNlT3V0bGV0LCB1c2VPdXRsZXRDb250ZXh0LCB1c2VQYXJhbXMsIHVzZVJlc29sdmVkUGF0aCwgdXNlUmV2YWxpZGF0b3IsIHVzZVJvdXRlRXJyb3IsIHVzZVJvdXRlTG9hZGVyRGF0YSwgdXNlUm91dGVzIH0gZnJvbSAncmVhY3Qtcm91dGVyJztcbmltcG9ydCB7IHN0cmlwQmFzZW5hbWUsIFVOU0FGRV93YXJuaW5nLCBjcmVhdGVSb3V0ZXIsIGNyZWF0ZUJyb3dzZXJIaXN0b3J5LCBjcmVhdGVIYXNoSGlzdG9yeSwgVU5TQUZFX0Vycm9yUmVzcG9uc2VJbXBsLCBVTlNBRkVfaW52YXJpYW50LCBqb2luUGF0aHMsIElETEVfRkVUQ0hFUiwgbWF0Y2hQYXRoIH0gZnJvbSAnQHJlbWl4LXJ1bi9yb3V0ZXInO1xuXG5mdW5jdGlvbiBfZXh0ZW5kcygpIHtcbiAgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07XG4gICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9O1xuICByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpIHtcbiAgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307XG4gIHZhciB0YXJnZXQgPSB7fTtcbiAgdmFyIHNvdXJjZUtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpO1xuICB2YXIga2V5LCBpO1xuICBmb3IgKGkgPSAwOyBpIDwgc291cmNlS2V5cy5sZW5ndGg7IGkrKykge1xuICAgIGtleSA9IHNvdXJjZUtleXNbaV07XG4gICAgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTtcbiAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICB9XG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbmNvbnN0IGRlZmF1bHRNZXRob2QgPSBcImdldFwiO1xuY29uc3QgZGVmYXVsdEVuY1R5cGUgPSBcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFwiO1xuZnVuY3Rpb24gaXNIdG1sRWxlbWVudChvYmplY3QpIHtcbiAgcmV0dXJuIG9iamVjdCAhPSBudWxsICYmIHR5cGVvZiBvYmplY3QudGFnTmFtZSA9PT0gXCJzdHJpbmdcIjtcbn1cbmZ1bmN0aW9uIGlzQnV0dG9uRWxlbWVudChvYmplY3QpIHtcbiAgcmV0dXJuIGlzSHRtbEVsZW1lbnQob2JqZWN0KSAmJiBvYmplY3QudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImJ1dHRvblwiO1xufVxuZnVuY3Rpb24gaXNGb3JtRWxlbWVudChvYmplY3QpIHtcbiAgcmV0dXJuIGlzSHRtbEVsZW1lbnQob2JqZWN0KSAmJiBvYmplY3QudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImZvcm1cIjtcbn1cbmZ1bmN0aW9uIGlzSW5wdXRFbGVtZW50KG9iamVjdCkge1xuICByZXR1cm4gaXNIdG1sRWxlbWVudChvYmplY3QpICYmIG9iamVjdC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiaW5wdXRcIjtcbn1cbmZ1bmN0aW9uIGlzTW9kaWZpZWRFdmVudChldmVudCkge1xuICByZXR1cm4gISEoZXZlbnQubWV0YUtleSB8fCBldmVudC5hbHRLZXkgfHwgZXZlbnQuY3RybEtleSB8fCBldmVudC5zaGlmdEtleSk7XG59XG5mdW5jdGlvbiBzaG91bGRQcm9jZXNzTGlua0NsaWNrKGV2ZW50LCB0YXJnZXQpIHtcbiAgcmV0dXJuIGV2ZW50LmJ1dHRvbiA9PT0gMCAmJiAoXG4gIC8vIElnbm9yZSBldmVyeXRoaW5nIGJ1dCBsZWZ0IGNsaWNrc1xuICAhdGFyZ2V0IHx8IHRhcmdldCA9PT0gXCJfc2VsZlwiKSAmJlxuICAvLyBMZXQgYnJvd3NlciBoYW5kbGUgXCJ0YXJnZXQ9X2JsYW5rXCIgZXRjLlxuICAhaXNNb2RpZmllZEV2ZW50KGV2ZW50KSAvLyBJZ25vcmUgY2xpY2tzIHdpdGggbW9kaWZpZXIga2V5c1xuICA7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBVUkxTZWFyY2hQYXJhbXMgb2JqZWN0IHVzaW5nIHRoZSBnaXZlbiBpbml0aWFsaXplci5cbiAqXG4gKiBUaGlzIGlzIGlkZW50aWNhbCB0byBgbmV3IFVSTFNlYXJjaFBhcmFtcyhpbml0KWAgZXhjZXB0IGl0IGFsc29cbiAqIHN1cHBvcnRzIGFycmF5cyBhcyB2YWx1ZXMgaW4gdGhlIG9iamVjdCBmb3JtIG9mIHRoZSBpbml0aWFsaXplclxuICogaW5zdGVhZCBvZiBqdXN0IHN0cmluZ3MuIFRoaXMgaXMgY29udmVuaWVudCB3aGVuIHlvdSBuZWVkIG11bHRpcGxlXG4gKiB2YWx1ZXMgZm9yIGEgZ2l2ZW4ga2V5LCBidXQgZG9uJ3Qgd2FudCB0byB1c2UgYW4gYXJyYXkgaW5pdGlhbGl6ZXIuXG4gKlxuICogRm9yIGV4YW1wbGUsIGluc3RlYWQgb2Y6XG4gKlxuICogICBsZXQgc2VhcmNoUGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhbXG4gKiAgICAgWydzb3J0JywgJ25hbWUnXSxcbiAqICAgICBbJ3NvcnQnLCAncHJpY2UnXVxuICogICBdKTtcbiAqXG4gKiB5b3UgY2FuIGRvOlxuICpcbiAqICAgbGV0IHNlYXJjaFBhcmFtcyA9IGNyZWF0ZVNlYXJjaFBhcmFtcyh7XG4gKiAgICAgc29ydDogWyduYW1lJywgJ3ByaWNlJ11cbiAqICAgfSk7XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVNlYXJjaFBhcmFtcyhpbml0KSB7XG4gIGlmIChpbml0ID09PSB2b2lkIDApIHtcbiAgICBpbml0ID0gXCJcIjtcbiAgfVxuICByZXR1cm4gbmV3IFVSTFNlYXJjaFBhcmFtcyh0eXBlb2YgaW5pdCA9PT0gXCJzdHJpbmdcIiB8fCBBcnJheS5pc0FycmF5KGluaXQpIHx8IGluaXQgaW5zdGFuY2VvZiBVUkxTZWFyY2hQYXJhbXMgPyBpbml0IDogT2JqZWN0LmtleXMoaW5pdCkucmVkdWNlKChtZW1vLCBrZXkpID0+IHtcbiAgICBsZXQgdmFsdWUgPSBpbml0W2tleV07XG4gICAgcmV0dXJuIG1lbW8uY29uY2F0KEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUubWFwKHYgPT4gW2tleSwgdl0pIDogW1trZXksIHZhbHVlXV0pO1xuICB9LCBbXSkpO1xufVxuZnVuY3Rpb24gZ2V0U2VhcmNoUGFyYW1zRm9yTG9jYXRpb24obG9jYXRpb25TZWFyY2gsIGRlZmF1bHRTZWFyY2hQYXJhbXMpIHtcbiAgbGV0IHNlYXJjaFBhcmFtcyA9IGNyZWF0ZVNlYXJjaFBhcmFtcyhsb2NhdGlvblNlYXJjaCk7XG4gIGlmIChkZWZhdWx0U2VhcmNoUGFyYW1zKSB7XG4gICAgLy8gVXNlIGBkZWZhdWx0U2VhcmNoUGFyYW1zLmZvckVhY2goLi4uKWAgaGVyZSBpbnN0ZWFkIG9mIGl0ZXJhdGluZyBvZlxuICAgIC8vIGBkZWZhdWx0U2VhcmNoUGFyYW1zLmtleXMoKWAgdG8gd29yay1hcm91bmQgYSBidWcgaW4gRmlyZWZveCByZWxhdGVkIHRvXG4gICAgLy8gd2ViIGV4dGVuc2lvbnMuIFJlbGV2YW50IEJ1Z3ppbGxhIHRpY2tldHM6XG4gICAgLy8gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTQxNDYwMlxuICAgIC8vIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTEwMjM5ODRcbiAgICBkZWZhdWx0U2VhcmNoUGFyYW1zLmZvckVhY2goKF8sIGtleSkgPT4ge1xuICAgICAgaWYgKCFzZWFyY2hQYXJhbXMuaGFzKGtleSkpIHtcbiAgICAgICAgZGVmYXVsdFNlYXJjaFBhcmFtcy5nZXRBbGwoa2V5KS5mb3JFYWNoKHZhbHVlID0+IHtcbiAgICAgICAgICBzZWFyY2hQYXJhbXMuYXBwZW5kKGtleSwgdmFsdWUpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICByZXR1cm4gc2VhcmNoUGFyYW1zO1xufVxuLy8gT25lLXRpbWUgY2hlY2sgZm9yIHN1Ym1pdHRlciBzdXBwb3J0XG5sZXQgX2Zvcm1EYXRhU3VwcG9ydHNTdWJtaXR0ZXIgPSBudWxsO1xuZnVuY3Rpb24gaXNGb3JtRGF0YVN1Ym1pdHRlclN1cHBvcnRlZCgpIHtcbiAgaWYgKF9mb3JtRGF0YVN1cHBvcnRzU3VibWl0dGVyID09PSBudWxsKSB7XG4gICAgdHJ5IHtcbiAgICAgIG5ldyBGb3JtRGF0YShkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZm9ybVwiKSxcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgaWYgRm9ybURhdGEgc3VwcG9ydHMgdGhlIHN1Ym1pdHRlciBwYXJhbWV0ZXIsIHRoaXMgd2lsbCB0aHJvd1xuICAgICAgMCk7XG4gICAgICBfZm9ybURhdGFTdXBwb3J0c1N1Ym1pdHRlciA9IGZhbHNlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIF9mb3JtRGF0YVN1cHBvcnRzU3VibWl0dGVyID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIF9mb3JtRGF0YVN1cHBvcnRzU3VibWl0dGVyO1xufVxuY29uc3Qgc3VwcG9ydGVkRm9ybUVuY1R5cGVzID0gbmV3IFNldChbXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIiwgXCJtdWx0aXBhcnQvZm9ybS1kYXRhXCIsIFwidGV4dC9wbGFpblwiXSk7XG5mdW5jdGlvbiBnZXRGb3JtRW5jVHlwZShlbmNUeXBlKSB7XG4gIGlmIChlbmNUeXBlICE9IG51bGwgJiYgIXN1cHBvcnRlZEZvcm1FbmNUeXBlcy5oYXMoZW5jVHlwZSkpIHtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBVTlNBRkVfd2FybmluZyhmYWxzZSwgXCJcXFwiXCIgKyBlbmNUeXBlICsgXCJcXFwiIGlzIG5vdCBhIHZhbGlkIGBlbmNUeXBlYCBmb3IgYDxGb3JtPmAvYDxmZXRjaGVyLkZvcm0+YCBcIiArIChcImFuZCB3aWxsIGRlZmF1bHQgdG8gXFxcIlwiICsgZGVmYXVsdEVuY1R5cGUgKyBcIlxcXCJcIikpIDogdm9pZCAwO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBlbmNUeXBlO1xufVxuZnVuY3Rpb24gZ2V0Rm9ybVN1Ym1pc3Npb25JbmZvKHRhcmdldCwgYmFzZW5hbWUpIHtcbiAgbGV0IG1ldGhvZDtcbiAgbGV0IGFjdGlvbjtcbiAgbGV0IGVuY1R5cGU7XG4gIGxldCBmb3JtRGF0YTtcbiAgbGV0IGJvZHk7XG4gIGlmIChpc0Zvcm1FbGVtZW50KHRhcmdldCkpIHtcbiAgICAvLyBXaGVuIGdyYWJiaW5nIHRoZSBhY3Rpb24gZnJvbSB0aGUgZWxlbWVudCwgaXQgd2lsbCBoYXZlIGhhZCB0aGUgYmFzZW5hbWVcbiAgICAvLyBwcmVmaXhlZCB0byBlbnN1cmUgbm9uLUpTIHNjZW5hcmlvcyB3b3JrLCBzbyBzdHJpcCBpdCBzaW5jZSB3ZSdsbFxuICAgIC8vIHJlLXByZWZpeCBpbiB0aGUgcm91dGVyXG4gICAgbGV0IGF0dHIgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKFwiYWN0aW9uXCIpO1xuICAgIGFjdGlvbiA9IGF0dHIgPyBzdHJpcEJhc2VuYW1lKGF0dHIsIGJhc2VuYW1lKSA6IG51bGw7XG4gICAgbWV0aG9kID0gdGFyZ2V0LmdldEF0dHJpYnV0ZShcIm1ldGhvZFwiKSB8fCBkZWZhdWx0TWV0aG9kO1xuICAgIGVuY1R5cGUgPSBnZXRGb3JtRW5jVHlwZSh0YXJnZXQuZ2V0QXR0cmlidXRlKFwiZW5jdHlwZVwiKSkgfHwgZGVmYXVsdEVuY1R5cGU7XG4gICAgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEodGFyZ2V0KTtcbiAgfSBlbHNlIGlmIChpc0J1dHRvbkVsZW1lbnQodGFyZ2V0KSB8fCBpc0lucHV0RWxlbWVudCh0YXJnZXQpICYmICh0YXJnZXQudHlwZSA9PT0gXCJzdWJtaXRcIiB8fCB0YXJnZXQudHlwZSA9PT0gXCJpbWFnZVwiKSkge1xuICAgIGxldCBmb3JtID0gdGFyZ2V0LmZvcm07XG4gICAgaWYgKGZvcm0gPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IHN1Ym1pdCBhIDxidXR0b24+IG9yIDxpbnB1dCB0eXBlPVxcXCJzdWJtaXRcXFwiPiB3aXRob3V0IGEgPGZvcm0+XCIpO1xuICAgIH1cbiAgICAvLyA8YnV0dG9uPi88aW5wdXQgdHlwZT1cInN1Ym1pdFwiPiBtYXkgb3ZlcnJpZGUgYXR0cmlidXRlcyBvZiA8Zm9ybT5cbiAgICAvLyBXaGVuIGdyYWJiaW5nIHRoZSBhY3Rpb24gZnJvbSB0aGUgZWxlbWVudCwgaXQgd2lsbCBoYXZlIGhhZCB0aGUgYmFzZW5hbWVcbiAgICAvLyBwcmVmaXhlZCB0byBlbnN1cmUgbm9uLUpTIHNjZW5hcmlvcyB3b3JrLCBzbyBzdHJpcCBpdCBzaW5jZSB3ZSdsbFxuICAgIC8vIHJlLXByZWZpeCBpbiB0aGUgcm91dGVyXG4gICAgbGV0IGF0dHIgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKFwiZm9ybWFjdGlvblwiKSB8fCBmb3JtLmdldEF0dHJpYnV0ZShcImFjdGlvblwiKTtcbiAgICBhY3Rpb24gPSBhdHRyID8gc3RyaXBCYXNlbmFtZShhdHRyLCBiYXNlbmFtZSkgOiBudWxsO1xuICAgIG1ldGhvZCA9IHRhcmdldC5nZXRBdHRyaWJ1dGUoXCJmb3JtbWV0aG9kXCIpIHx8IGZvcm0uZ2V0QXR0cmlidXRlKFwibWV0aG9kXCIpIHx8IGRlZmF1bHRNZXRob2Q7XG4gICAgZW5jVHlwZSA9IGdldEZvcm1FbmNUeXBlKHRhcmdldC5nZXRBdHRyaWJ1dGUoXCJmb3JtZW5jdHlwZVwiKSkgfHwgZ2V0Rm9ybUVuY1R5cGUoZm9ybS5nZXRBdHRyaWJ1dGUoXCJlbmN0eXBlXCIpKSB8fCBkZWZhdWx0RW5jVHlwZTtcbiAgICAvLyBCdWlsZCBhIEZvcm1EYXRhIG9iamVjdCBwb3B1bGF0ZWQgZnJvbSBhIGZvcm0gYW5kIHN1Ym1pdHRlclxuICAgIGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKGZvcm0sIHRhcmdldCk7XG4gICAgLy8gSWYgdGhpcyBicm93c2VyIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgYEZvcm1EYXRhKGVsLCBzdWJtaXR0ZXIpYCBmb3JtYXQsXG4gICAgLy8gdGhlbiB0YWNrIG9uIHRoZSBzdWJtaXR0ZXIgdmFsdWUgYXQgdGhlIGVuZC4gIFRoaXMgaXMgYSBsaWdodHdlaWdodFxuICAgIC8vIHNvbHV0aW9uIHRoYXQgaXMgbm90IDEwMCUgc3BlYyBjb21wbGlhbnQuICBGb3IgY29tcGxldGUgc3VwcG9ydCBpbiBvbGRlclxuICAgIC8vIGJyb3dzZXJzLCBjb25zaWRlciB1c2luZyB0aGUgYGZvcm1kYXRhLXN1Ym1pdHRlci1wb2x5ZmlsbGAgcGFja2FnZVxuICAgIGlmICghaXNGb3JtRGF0YVN1Ym1pdHRlclN1cHBvcnRlZCgpKSB7XG4gICAgICBsZXQge1xuICAgICAgICBuYW1lLFxuICAgICAgICB0eXBlLFxuICAgICAgICB2YWx1ZVxuICAgICAgfSA9IHRhcmdldDtcbiAgICAgIGlmICh0eXBlID09PSBcImltYWdlXCIpIHtcbiAgICAgICAgbGV0IHByZWZpeCA9IG5hbWUgPyBuYW1lICsgXCIuXCIgOiBcIlwiO1xuICAgICAgICBmb3JtRGF0YS5hcHBlbmQocHJlZml4ICsgXCJ4XCIsIFwiMFwiKTtcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKHByZWZpeCArIFwieVwiLCBcIjBcIik7XG4gICAgICB9IGVsc2UgaWYgKG5hbWUpIHtcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNIdG1sRWxlbWVudCh0YXJnZXQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IHN1Ym1pdCBlbGVtZW50IHRoYXQgaXMgbm90IDxmb3JtPiwgPGJ1dHRvbj4sIG9yIFwiICsgXCI8aW5wdXQgdHlwZT1cXFwic3VibWl0fGltYWdlXFxcIj5cIik7XG4gIH0gZWxzZSB7XG4gICAgbWV0aG9kID0gZGVmYXVsdE1ldGhvZDtcbiAgICBhY3Rpb24gPSBudWxsO1xuICAgIGVuY1R5cGUgPSBkZWZhdWx0RW5jVHlwZTtcbiAgICBib2R5ID0gdGFyZ2V0O1xuICB9XG4gIC8vIFNlbmQgYm9keSBmb3IgPEZvcm0gZW5jVHlwZT1cInRleHQvcGxhaW5cIiBzbyB3ZSBlbmNvZGUgaXQgaW50byB0ZXh0XG4gIGlmIChmb3JtRGF0YSAmJiBlbmNUeXBlID09PSBcInRleHQvcGxhaW5cIikge1xuICAgIGJvZHkgPSBmb3JtRGF0YTtcbiAgICBmb3JtRGF0YSA9IHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4ge1xuICAgIGFjdGlvbixcbiAgICBtZXRob2Q6IG1ldGhvZC50b0xvd2VyQ2FzZSgpLFxuICAgIGVuY1R5cGUsXG4gICAgZm9ybURhdGEsXG4gICAgYm9keVxuICB9O1xufVxuXG5jb25zdCBfZXhjbHVkZWQgPSBbXCJvbkNsaWNrXCIsIFwicmVsYXRpdmVcIiwgXCJyZWxvYWREb2N1bWVudFwiLCBcInJlcGxhY2VcIiwgXCJzdGF0ZVwiLCBcInRhcmdldFwiLCBcInRvXCIsIFwicHJldmVudFNjcm9sbFJlc2V0XCIsIFwidW5zdGFibGVfdmlld1RyYW5zaXRpb25cIl0sXG4gIF9leGNsdWRlZDIgPSBbXCJhcmlhLWN1cnJlbnRcIiwgXCJjYXNlU2Vuc2l0aXZlXCIsIFwiY2xhc3NOYW1lXCIsIFwiZW5kXCIsIFwic3R5bGVcIiwgXCJ0b1wiLCBcInVuc3RhYmxlX3ZpZXdUcmFuc2l0aW9uXCIsIFwiY2hpbGRyZW5cIl0sXG4gIF9leGNsdWRlZDMgPSBbXCJmZXRjaGVyS2V5XCIsIFwibmF2aWdhdGVcIiwgXCJyZWxvYWREb2N1bWVudFwiLCBcInJlcGxhY2VcIiwgXCJzdGF0ZVwiLCBcIm1ldGhvZFwiLCBcImFjdGlvblwiLCBcIm9uU3VibWl0XCIsIFwicmVsYXRpdmVcIiwgXCJwcmV2ZW50U2Nyb2xsUmVzZXRcIiwgXCJ1bnN0YWJsZV92aWV3VHJhbnNpdGlvblwiXTtcbmZ1bmN0aW9uIGNyZWF0ZUJyb3dzZXJSb3V0ZXIocm91dGVzLCBvcHRzKSB7XG4gIHJldHVybiBjcmVhdGVSb3V0ZXIoe1xuICAgIGJhc2VuYW1lOiBvcHRzID09IG51bGwgPyB2b2lkIDAgOiBvcHRzLmJhc2VuYW1lLFxuICAgIGZ1dHVyZTogX2V4dGVuZHMoe30sIG9wdHMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wdHMuZnV0dXJlLCB7XG4gICAgICB2N19wcmVwZW5kQmFzZW5hbWU6IHRydWVcbiAgICB9KSxcbiAgICBoaXN0b3J5OiBjcmVhdGVCcm93c2VySGlzdG9yeSh7XG4gICAgICB3aW5kb3c6IG9wdHMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wdHMud2luZG93XG4gICAgfSksXG4gICAgaHlkcmF0aW9uRGF0YTogKG9wdHMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wdHMuaHlkcmF0aW9uRGF0YSkgfHwgcGFyc2VIeWRyYXRpb25EYXRhKCksXG4gICAgcm91dGVzLFxuICAgIG1hcFJvdXRlUHJvcGVydGllczogVU5TQUZFX21hcFJvdXRlUHJvcGVydGllcyxcbiAgICB3aW5kb3c6IG9wdHMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wdHMud2luZG93XG4gIH0pLmluaXRpYWxpemUoKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUhhc2hSb3V0ZXIocm91dGVzLCBvcHRzKSB7XG4gIHJldHVybiBjcmVhdGVSb3V0ZXIoe1xuICAgIGJhc2VuYW1lOiBvcHRzID09IG51bGwgPyB2b2lkIDAgOiBvcHRzLmJhc2VuYW1lLFxuICAgIGZ1dHVyZTogX2V4dGVuZHMoe30sIG9wdHMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wdHMuZnV0dXJlLCB7XG4gICAgICB2N19wcmVwZW5kQmFzZW5hbWU6IHRydWVcbiAgICB9KSxcbiAgICBoaXN0b3J5OiBjcmVhdGVIYXNoSGlzdG9yeSh7XG4gICAgICB3aW5kb3c6IG9wdHMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wdHMud2luZG93XG4gICAgfSksXG4gICAgaHlkcmF0aW9uRGF0YTogKG9wdHMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wdHMuaHlkcmF0aW9uRGF0YSkgfHwgcGFyc2VIeWRyYXRpb25EYXRhKCksXG4gICAgcm91dGVzLFxuICAgIG1hcFJvdXRlUHJvcGVydGllczogVU5TQUZFX21hcFJvdXRlUHJvcGVydGllcyxcbiAgICB3aW5kb3c6IG9wdHMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wdHMud2luZG93XG4gIH0pLmluaXRpYWxpemUoKTtcbn1cbmZ1bmN0aW9uIHBhcnNlSHlkcmF0aW9uRGF0YSgpIHtcbiAgdmFyIF93aW5kb3c7XG4gIGxldCBzdGF0ZSA9IChfd2luZG93ID0gd2luZG93KSA9PSBudWxsID8gdm9pZCAwIDogX3dpbmRvdy5fX3N0YXRpY1JvdXRlckh5ZHJhdGlvbkRhdGE7XG4gIGlmIChzdGF0ZSAmJiBzdGF0ZS5lcnJvcnMpIHtcbiAgICBzdGF0ZSA9IF9leHRlbmRzKHt9LCBzdGF0ZSwge1xuICAgICAgZXJyb3JzOiBkZXNlcmlhbGl6ZUVycm9ycyhzdGF0ZS5lcnJvcnMpXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHN0YXRlO1xufVxuZnVuY3Rpb24gZGVzZXJpYWxpemVFcnJvcnMoZXJyb3JzKSB7XG4gIGlmICghZXJyb3JzKSByZXR1cm4gbnVsbDtcbiAgbGV0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyhlcnJvcnMpO1xuICBsZXQgc2VyaWFsaXplZCA9IHt9O1xuICBmb3IgKGxldCBba2V5LCB2YWxdIG9mIGVudHJpZXMpIHtcbiAgICAvLyBIZXkgeW91ISAgSWYgeW91IGNoYW5nZSB0aGlzLCBwbGVhc2UgY2hhbmdlIHRoZSBjb3JyZXNwb25kaW5nIGxvZ2ljIGluXG4gICAgLy8gc2VyaWFsaXplRXJyb3JzIGluIHJlYWN0LXJvdXRlci1kb20vc2VydmVyLnRzeCA6KVxuICAgIGlmICh2YWwgJiYgdmFsLl9fdHlwZSA9PT0gXCJSb3V0ZUVycm9yUmVzcG9uc2VcIikge1xuICAgICAgc2VyaWFsaXplZFtrZXldID0gbmV3IFVOU0FGRV9FcnJvclJlc3BvbnNlSW1wbCh2YWwuc3RhdHVzLCB2YWwuc3RhdHVzVGV4dCwgdmFsLmRhdGEsIHZhbC5pbnRlcm5hbCA9PT0gdHJ1ZSk7XG4gICAgfSBlbHNlIGlmICh2YWwgJiYgdmFsLl9fdHlwZSA9PT0gXCJFcnJvclwiKSB7XG4gICAgICAvLyBBdHRlbXB0IHRvIHJlY29uc3RydWN0IHRoZSByaWdodCB0eXBlIG9mIEVycm9yIChpLmUuLCBSZWZlcmVuY2VFcnJvcilcbiAgICAgIGlmICh2YWwuX19zdWJUeXBlKSB7XG4gICAgICAgIGxldCBFcnJvckNvbnN0cnVjdG9yID0gd2luZG93W3ZhbC5fX3N1YlR5cGVdO1xuICAgICAgICBpZiAodHlwZW9mIEVycm9yQ29uc3RydWN0b3IgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICBsZXQgZXJyb3IgPSBuZXcgRXJyb3JDb25zdHJ1Y3Rvcih2YWwubWVzc2FnZSk7XG4gICAgICAgICAgICAvLyBXaXBlIGF3YXkgdGhlIGNsaWVudC1zaWRlIHN0YWNrIHRyYWNlLiAgTm90aGluZyB0byBmaWxsIGl0IGluIHdpdGhcbiAgICAgICAgICAgIC8vIGJlY2F1c2Ugd2UgZG9uJ3Qgc2VyaWFsaXplIFNTUiBzdGFjayB0cmFjZXMgZm9yIHNlY3VyaXR5IHJlYXNvbnNcbiAgICAgICAgICAgIGVycm9yLnN0YWNrID0gXCJcIjtcbiAgICAgICAgICAgIHNlcmlhbGl6ZWRba2V5XSA9IGVycm9yO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIG5vLW9wIC0gZmFsbCB0aHJvdWdoIGFuZCBjcmVhdGUgYSBub3JtYWwgRXJyb3JcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzZXJpYWxpemVkW2tleV0gPT0gbnVsbCkge1xuICAgICAgICBsZXQgZXJyb3IgPSBuZXcgRXJyb3IodmFsLm1lc3NhZ2UpO1xuICAgICAgICAvLyBXaXBlIGF3YXkgdGhlIGNsaWVudC1zaWRlIHN0YWNrIHRyYWNlLiAgTm90aGluZyB0byBmaWxsIGl0IGluIHdpdGhcbiAgICAgICAgLy8gYmVjYXVzZSB3ZSBkb24ndCBzZXJpYWxpemUgU1NSIHN0YWNrIHRyYWNlcyBmb3Igc2VjdXJpdHkgcmVhc29uc1xuICAgICAgICBlcnJvci5zdGFjayA9IFwiXCI7XG4gICAgICAgIHNlcmlhbGl6ZWRba2V5XSA9IGVycm9yO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzZXJpYWxpemVkW2tleV0gPSB2YWw7XG4gICAgfVxuICB9XG4gIHJldHVybiBzZXJpYWxpemVkO1xufVxuY29uc3QgVmlld1RyYW5zaXRpb25Db250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQoe1xuICBpc1RyYW5zaXRpb25pbmc6IGZhbHNlXG59KTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgVmlld1RyYW5zaXRpb25Db250ZXh0LmRpc3BsYXlOYW1lID0gXCJWaWV3VHJhbnNpdGlvblwiO1xufVxuY29uc3QgRmV0Y2hlcnNDb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQobmV3IE1hcCgpKTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgRmV0Y2hlcnNDb250ZXh0LmRpc3BsYXlOYW1lID0gXCJGZXRjaGVyc1wiO1xufVxuLy8jZW5kcmVnaW9uXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8jcmVnaW9uIENvbXBvbmVudHNcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vKipcbiAgV2VicGFjayArIFJlYWN0IDE3IGZhaWxzIHRvIGNvbXBpbGUgb24gYW55IG9mIHRoZSBmb2xsb3dpbmcgYmVjYXVzZSB3ZWJwYWNrXG4gIGNvbXBsYWlucyB0aGF0IGBzdGFydFRyYW5zaXRpb25gIGRvZXNuJ3QgZXhpc3QgaW4gYFJlYWN0YDpcbiAgKiBpbXBvcnQgeyBzdGFydFRyYW5zaXRpb24gfSBmcm9tIFwicmVhY3RcIlxuICAqIGltcG9ydCAqIGFzIFJlYWN0IGZyb20gZnJvbSBcInJlYWN0XCI7XG4gICAgXCJzdGFydFRyYW5zaXRpb25cIiBpbiBSZWFjdCA/IFJlYWN0LnN0YXJ0VHJhbnNpdGlvbigoKSA9PiBzZXRTdGF0ZSgpKSA6IHNldFN0YXRlKClcbiAgKiBpbXBvcnQgKiBhcyBSZWFjdCBmcm9tIGZyb20gXCJyZWFjdFwiO1xuICAgIFwic3RhcnRUcmFuc2l0aW9uXCIgaW4gUmVhY3QgPyBSZWFjdFtcInN0YXJ0VHJhbnNpdGlvblwiXSgoKSA9PiBzZXRTdGF0ZSgpKSA6IHNldFN0YXRlKClcblxuICBNb3ZpbmcgaXQgdG8gYSBjb25zdGFudCBzdWNoIGFzIHRoZSBmb2xsb3dpbmcgc29sdmVzIHRoZSBXZWJwYWNrL1JlYWN0IDE3IGlzc3VlOlxuICAqIGltcG9ydCAqIGFzIFJlYWN0IGZyb20gZnJvbSBcInJlYWN0XCI7XG4gICAgY29uc3QgU1RBUlRfVFJBTlNJVElPTiA9IFwic3RhcnRUcmFuc2l0aW9uXCI7XG4gICAgU1RBUlRfVFJBTlNJVElPTiBpbiBSZWFjdCA/IFJlYWN0W1NUQVJUX1RSQU5TSVRJT05dKCgpID0+IHNldFN0YXRlKCkpIDogc2V0U3RhdGUoKVxuXG4gIEhvd2V2ZXIsIHRoYXQgaW50cm9kdWNlcyB3ZWJwYWNrL3RlcnNlciBtaW5pZmljYXRpb24gaXNzdWVzIGluIHByb2R1Y3Rpb24gYnVpbGRzXG4gIGluIFJlYWN0IDE4IHdoZXJlIG1pbmlmaWNhdGlvbi9vYmZ1c2NhdGlvbiBlbmRzIHVwIHJlbW92aW5nIHRoZSBjYWxsIG9mXG4gIFJlYWN0LnN0YXJ0VHJhbnNpdGlvbiBlbnRpcmVseSBmcm9tIHRoZSBmaXJzdCBoYWxmIG9mIHRoZSB0ZXJuYXJ5LiAgR3JhYmJpbmdcbiAgdGhpcyBleHBvcnRlZCByZWZlcmVuY2Ugb25jZSB1cCBmcm9udCByZXNvbHZlcyB0aGF0IGlzc3VlLlxuXG4gIFNlZSBodHRwczovL2dpdGh1Yi5jb20vcmVtaXgtcnVuL3JlYWN0LXJvdXRlci9pc3N1ZXMvMTA1NzlcbiovXG5jb25zdCBTVEFSVF9UUkFOU0lUSU9OID0gXCJzdGFydFRyYW5zaXRpb25cIjtcbmNvbnN0IHN0YXJ0VHJhbnNpdGlvbkltcGwgPSBSZWFjdFtTVEFSVF9UUkFOU0lUSU9OXTtcbmNvbnN0IEZMVVNIX1NZTkMgPSBcImZsdXNoU3luY1wiO1xuY29uc3QgZmx1c2hTeW5jSW1wbCA9IFJlYWN0RE9NW0ZMVVNIX1NZTkNdO1xuZnVuY3Rpb24gc3RhcnRUcmFuc2l0aW9uU2FmZShjYikge1xuICBpZiAoc3RhcnRUcmFuc2l0aW9uSW1wbCkge1xuICAgIHN0YXJ0VHJhbnNpdGlvbkltcGwoY2IpO1xuICB9IGVsc2Uge1xuICAgIGNiKCk7XG4gIH1cbn1cbmZ1bmN0aW9uIGZsdXNoU3luY1NhZmUoY2IpIHtcbiAgaWYgKGZsdXNoU3luY0ltcGwpIHtcbiAgICBmbHVzaFN5bmNJbXBsKGNiKTtcbiAgfSBlbHNlIHtcbiAgICBjYigpO1xuICB9XG59XG5jbGFzcyBEZWZlcnJlZCB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuc3RhdHVzID0gXCJwZW5kaW5nXCI7XG4gICAgdGhpcy5wcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5yZXNvbHZlID0gdmFsdWUgPT4ge1xuICAgICAgICBpZiAodGhpcy5zdGF0dXMgPT09IFwicGVuZGluZ1wiKSB7XG4gICAgICAgICAgdGhpcy5zdGF0dXMgPSBcInJlc29sdmVkXCI7XG4gICAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICB0aGlzLnJlamVjdCA9IHJlYXNvbiA9PiB7XG4gICAgICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gXCJwZW5kaW5nXCIpIHtcbiAgICAgICAgICB0aGlzLnN0YXR1cyA9IFwicmVqZWN0ZWRcIjtcbiAgICAgICAgICByZWplY3QocmVhc29uKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxufVxuLyoqXG4gKiBHaXZlbiBhIFJlbWl4IFJvdXRlciBpbnN0YW5jZSwgcmVuZGVyIHRoZSBhcHByb3ByaWF0ZSBVSVxuICovXG5mdW5jdGlvbiBSb3V0ZXJQcm92aWRlcihfcmVmKSB7XG4gIGxldCB7XG4gICAgZmFsbGJhY2tFbGVtZW50LFxuICAgIHJvdXRlcixcbiAgICBmdXR1cmVcbiAgfSA9IF9yZWY7XG4gIGxldCBbc3RhdGUsIHNldFN0YXRlSW1wbF0gPSBSZWFjdC51c2VTdGF0ZShyb3V0ZXIuc3RhdGUpO1xuICBsZXQgW3BlbmRpbmdTdGF0ZSwgc2V0UGVuZGluZ1N0YXRlXSA9IFJlYWN0LnVzZVN0YXRlKCk7XG4gIGxldCBbdnRDb250ZXh0LCBzZXRWdENvbnRleHRdID0gUmVhY3QudXNlU3RhdGUoe1xuICAgIGlzVHJhbnNpdGlvbmluZzogZmFsc2VcbiAgfSk7XG4gIGxldCBbcmVuZGVyRGZkLCBzZXRSZW5kZXJEZmRdID0gUmVhY3QudXNlU3RhdGUoKTtcbiAgbGV0IFt0cmFuc2l0aW9uLCBzZXRUcmFuc2l0aW9uXSA9IFJlYWN0LnVzZVN0YXRlKCk7XG4gIGxldCBbaW50ZXJydXB0aW9uLCBzZXRJbnRlcnJ1cHRpb25dID0gUmVhY3QudXNlU3RhdGUoKTtcbiAgbGV0IGZldGNoZXJEYXRhID0gUmVhY3QudXNlUmVmKG5ldyBNYXAoKSk7XG4gIGxldCB7XG4gICAgdjdfc3RhcnRUcmFuc2l0aW9uXG4gIH0gPSBmdXR1cmUgfHwge307XG4gIGxldCBvcHRJblN0YXJ0VHJhbnNpdGlvbiA9IFJlYWN0LnVzZUNhbGxiYWNrKGNiID0+IHtcbiAgICBpZiAodjdfc3RhcnRUcmFuc2l0aW9uKSB7XG4gICAgICBzdGFydFRyYW5zaXRpb25TYWZlKGNiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2IoKTtcbiAgICB9XG4gIH0sIFt2N19zdGFydFRyYW5zaXRpb25dKTtcbiAgbGV0IHNldFN0YXRlID0gUmVhY3QudXNlQ2FsbGJhY2soKG5ld1N0YXRlLCBfcmVmMikgPT4ge1xuICAgIGxldCB7XG4gICAgICBkZWxldGVkRmV0Y2hlcnMsXG4gICAgICB1bnN0YWJsZV9mbHVzaFN5bmM6IGZsdXNoU3luYyxcbiAgICAgIHVuc3RhYmxlX3ZpZXdUcmFuc2l0aW9uT3B0czogdmlld1RyYW5zaXRpb25PcHRzXG4gICAgfSA9IF9yZWYyO1xuICAgIGRlbGV0ZWRGZXRjaGVycy5mb3JFYWNoKGtleSA9PiBmZXRjaGVyRGF0YS5jdXJyZW50LmRlbGV0ZShrZXkpKTtcbiAgICBuZXdTdGF0ZS5mZXRjaGVycy5mb3JFYWNoKChmZXRjaGVyLCBrZXkpID0+IHtcbiAgICAgIGlmIChmZXRjaGVyLmRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBmZXRjaGVyRGF0YS5jdXJyZW50LnNldChrZXksIGZldGNoZXIuZGF0YSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgbGV0IGlzVmlld1RyYW5zaXRpb25VbmF2YWlsYWJsZSA9IHJvdXRlci53aW5kb3cgPT0gbnVsbCB8fCB0eXBlb2Ygcm91dGVyLndpbmRvdy5kb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uICE9PSBcImZ1bmN0aW9uXCI7XG4gICAgLy8gSWYgdGhpcyBpc24ndCBhIHZpZXcgdHJhbnNpdGlvbiBvciBpdCdzIG5vdCBhdmFpbGFibGUgaW4gdGhpcyBicm93c2VyLFxuICAgIC8vIGp1c3QgdXBkYXRlIGFuZCBiZSBkb25lIHdpdGggaXRcbiAgICBpZiAoIXZpZXdUcmFuc2l0aW9uT3B0cyB8fCBpc1ZpZXdUcmFuc2l0aW9uVW5hdmFpbGFibGUpIHtcbiAgICAgIGlmIChmbHVzaFN5bmMpIHtcbiAgICAgICAgZmx1c2hTeW5jU2FmZSgoKSA9PiBzZXRTdGF0ZUltcGwobmV3U3RhdGUpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9wdEluU3RhcnRUcmFuc2l0aW9uKCgpID0+IHNldFN0YXRlSW1wbChuZXdTdGF0ZSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBmbHVzaFN5bmMgKyBzdGFydFZpZXdUcmFuc2l0aW9uXG4gICAgaWYgKGZsdXNoU3luYykge1xuICAgICAgLy8gRmx1c2ggdGhyb3VnaCB0aGUgY29udGV4dCB0byBtYXJrIERPTSBlbGVtZW50cyBhcyB0cmFuc2l0aW9uPWluZ1xuICAgICAgZmx1c2hTeW5jU2FmZSgoKSA9PiB7XG4gICAgICAgIC8vIENhbmNlbCBhbnkgcGVuZGluZyB0cmFuc2l0aW9uc1xuICAgICAgICBpZiAodHJhbnNpdGlvbikge1xuICAgICAgICAgIHJlbmRlckRmZCAmJiByZW5kZXJEZmQucmVzb2x2ZSgpO1xuICAgICAgICAgIHRyYW5zaXRpb24uc2tpcFRyYW5zaXRpb24oKTtcbiAgICAgICAgfVxuICAgICAgICBzZXRWdENvbnRleHQoe1xuICAgICAgICAgIGlzVHJhbnNpdGlvbmluZzogdHJ1ZSxcbiAgICAgICAgICBmbHVzaFN5bmM6IHRydWUsXG4gICAgICAgICAgY3VycmVudExvY2F0aW9uOiB2aWV3VHJhbnNpdGlvbk9wdHMuY3VycmVudExvY2F0aW9uLFxuICAgICAgICAgIG5leHRMb2NhdGlvbjogdmlld1RyYW5zaXRpb25PcHRzLm5leHRMb2NhdGlvblxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgLy8gVXBkYXRlIHRoZSBET01cbiAgICAgIGxldCB0ID0gcm91dGVyLndpbmRvdy5kb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKCgpID0+IHtcbiAgICAgICAgZmx1c2hTeW5jU2FmZSgoKSA9PiBzZXRTdGF0ZUltcGwobmV3U3RhdGUpKTtcbiAgICAgIH0pO1xuICAgICAgLy8gQ2xlYW4gdXAgYWZ0ZXIgdGhlIGFuaW1hdGlvbiBjb21wbGV0ZXNcbiAgICAgIHQuZmluaXNoZWQuZmluYWxseSgoKSA9PiB7XG4gICAgICAgIGZsdXNoU3luY1NhZmUoKCkgPT4ge1xuICAgICAgICAgIHNldFJlbmRlckRmZCh1bmRlZmluZWQpO1xuICAgICAgICAgIHNldFRyYW5zaXRpb24odW5kZWZpbmVkKTtcbiAgICAgICAgICBzZXRQZW5kaW5nU3RhdGUodW5kZWZpbmVkKTtcbiAgICAgICAgICBzZXRWdENvbnRleHQoe1xuICAgICAgICAgICAgaXNUcmFuc2l0aW9uaW5nOiBmYWxzZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgZmx1c2hTeW5jU2FmZSgoKSA9PiBzZXRUcmFuc2l0aW9uKHQpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gc3RhcnRUcmFuc2l0aW9uICsgc3RhcnRWaWV3VHJhbnNpdGlvblxuICAgIGlmICh0cmFuc2l0aW9uKSB7XG4gICAgICAvLyBJbnRlcnJ1cHRpbmcgYW4gaW4tcHJvZ3Jlc3MgdHJhbnNpdGlvbiwgY2FuY2VsIGFuZCBsZXQgZXZlcnl0aGluZyBmbHVzaFxuICAgICAgLy8gb3V0LCBhbmQgdGhlbiBraWNrIG9mZiBhIG5ldyB0cmFuc2l0aW9uIGZyb20gdGhlIGludGVycnVwdGlvbiBzdGF0ZVxuICAgICAgcmVuZGVyRGZkICYmIHJlbmRlckRmZC5yZXNvbHZlKCk7XG4gICAgICB0cmFuc2l0aW9uLnNraXBUcmFuc2l0aW9uKCk7XG4gICAgICBzZXRJbnRlcnJ1cHRpb24oe1xuICAgICAgICBzdGF0ZTogbmV3U3RhdGUsXG4gICAgICAgIGN1cnJlbnRMb2NhdGlvbjogdmlld1RyYW5zaXRpb25PcHRzLmN1cnJlbnRMb2NhdGlvbixcbiAgICAgICAgbmV4dExvY2F0aW9uOiB2aWV3VHJhbnNpdGlvbk9wdHMubmV4dExvY2F0aW9uXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ29tcGxldGVkIG5hdmlnYXRpb24gdXBkYXRlIHdpdGggb3B0ZWQtaW4gdmlldyB0cmFuc2l0aW9ucywgbGV0ICdlciByaXBcbiAgICAgIHNldFBlbmRpbmdTdGF0ZShuZXdTdGF0ZSk7XG4gICAgICBzZXRWdENvbnRleHQoe1xuICAgICAgICBpc1RyYW5zaXRpb25pbmc6IHRydWUsXG4gICAgICAgIGZsdXNoU3luYzogZmFsc2UsXG4gICAgICAgIGN1cnJlbnRMb2NhdGlvbjogdmlld1RyYW5zaXRpb25PcHRzLmN1cnJlbnRMb2NhdGlvbixcbiAgICAgICAgbmV4dExvY2F0aW9uOiB2aWV3VHJhbnNpdGlvbk9wdHMubmV4dExvY2F0aW9uXG4gICAgICB9KTtcbiAgICB9XG4gIH0sIFtyb3V0ZXIud2luZG93LCB0cmFuc2l0aW9uLCByZW5kZXJEZmQsIGZldGNoZXJEYXRhLCBvcHRJblN0YXJ0VHJhbnNpdGlvbl0pO1xuICAvLyBOZWVkIHRvIHVzZSBhIGxheW91dCBlZmZlY3QgaGVyZSBzbyB3ZSBhcmUgc3Vic2NyaWJlZCBlYXJseSBlbm91Z2ggdG9cbiAgLy8gcGljayB1cCBvbiBhbnkgcmVuZGVyLWRyaXZlbiByZWRpcmVjdHMvbmF2aWdhdGlvbnMgKHVzZUVmZmVjdC88TmF2aWdhdGU+KVxuICBSZWFjdC51c2VMYXlvdXRFZmZlY3QoKCkgPT4gcm91dGVyLnN1YnNjcmliZShzZXRTdGF0ZSksIFtyb3V0ZXIsIHNldFN0YXRlXSk7XG4gIC8vIFdoZW4gd2Ugc3RhcnQgYSB2aWV3IHRyYW5zaXRpb24sIGNyZWF0ZSBhIERlZmVycmVkIHdlIGNhbiB1c2UgZm9yIHRoZVxuICAvLyBldmVudHVhbCBcImNvbXBsZXRlZFwiIHJlbmRlclxuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICh2dENvbnRleHQuaXNUcmFuc2l0aW9uaW5nICYmICF2dENvbnRleHQuZmx1c2hTeW5jKSB7XG4gICAgICBzZXRSZW5kZXJEZmQobmV3IERlZmVycmVkKCkpO1xuICAgIH1cbiAgfSwgW3Z0Q29udGV4dF0pO1xuICAvLyBPbmNlIHRoZSBkZWZlcnJlZCBpcyBjcmVhdGVkLCBraWNrIG9mZiBzdGFydFZpZXdUcmFuc2l0aW9uKCkgdG8gdXBkYXRlIHRoZVxuICAvLyBET00gYW5kIHRoZW4gd2FpdCBvbiB0aGUgRGVmZXJyZWQgdG8gcmVzb2x2ZSAoaW5kaWNhdGluZyB0aGUgRE9NIHVwZGF0ZSBoYXNcbiAgLy8gaGFwcGVuZWQpXG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHJlbmRlckRmZCAmJiBwZW5kaW5nU3RhdGUgJiYgcm91dGVyLndpbmRvdykge1xuICAgICAgbGV0IG5ld1N0YXRlID0gcGVuZGluZ1N0YXRlO1xuICAgICAgbGV0IHJlbmRlclByb21pc2UgPSByZW5kZXJEZmQucHJvbWlzZTtcbiAgICAgIGxldCB0cmFuc2l0aW9uID0gcm91dGVyLndpbmRvdy5kb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgICAgb3B0SW5TdGFydFRyYW5zaXRpb24oKCkgPT4gc2V0U3RhdGVJbXBsKG5ld1N0YXRlKSk7XG4gICAgICAgIGF3YWl0IHJlbmRlclByb21pc2U7XG4gICAgICB9KTtcbiAgICAgIHRyYW5zaXRpb24uZmluaXNoZWQuZmluYWxseSgoKSA9PiB7XG4gICAgICAgIHNldFJlbmRlckRmZCh1bmRlZmluZWQpO1xuICAgICAgICBzZXRUcmFuc2l0aW9uKHVuZGVmaW5lZCk7XG4gICAgICAgIHNldFBlbmRpbmdTdGF0ZSh1bmRlZmluZWQpO1xuICAgICAgICBzZXRWdENvbnRleHQoe1xuICAgICAgICAgIGlzVHJhbnNpdGlvbmluZzogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHNldFRyYW5zaXRpb24odHJhbnNpdGlvbik7XG4gICAgfVxuICB9LCBbb3B0SW5TdGFydFRyYW5zaXRpb24sIHBlbmRpbmdTdGF0ZSwgcmVuZGVyRGZkLCByb3V0ZXIud2luZG93XSk7XG4gIC8vIFdoZW4gdGhlIG5ldyBsb2NhdGlvbiBmaW5hbGx5IHJlbmRlcnMgYW5kIGlzIGNvbW1pdHRlZCB0byB0aGUgRE9NLCB0aGlzXG4gIC8vIGVmZmVjdCB3aWxsIHJ1biB0byByZXNvbHZlIHRoZSB0cmFuc2l0aW9uXG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHJlbmRlckRmZCAmJiBwZW5kaW5nU3RhdGUgJiYgc3RhdGUubG9jYXRpb24ua2V5ID09PSBwZW5kaW5nU3RhdGUubG9jYXRpb24ua2V5KSB7XG4gICAgICByZW5kZXJEZmQucmVzb2x2ZSgpO1xuICAgIH1cbiAgfSwgW3JlbmRlckRmZCwgdHJhbnNpdGlvbiwgc3RhdGUubG9jYXRpb24sIHBlbmRpbmdTdGF0ZV0pO1xuICAvLyBJZiB3ZSBnZXQgaW50ZXJydXB0ZWQgd2l0aCBhIG5ldyBuYXZpZ2F0aW9uIGR1cmluZyBhIHRyYW5zaXRpb24sIHdlIHNraXBcbiAgLy8gdGhlIGFjdGl2ZSB0cmFuc2l0aW9uLCBsZXQgaXQgY2xlYW51cCwgdGhlbiBraWNrIGl0IG9mZiBhZ2FpbiBoZXJlXG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCF2dENvbnRleHQuaXNUcmFuc2l0aW9uaW5nICYmIGludGVycnVwdGlvbikge1xuICAgICAgc2V0UGVuZGluZ1N0YXRlKGludGVycnVwdGlvbi5zdGF0ZSk7XG4gICAgICBzZXRWdENvbnRleHQoe1xuICAgICAgICBpc1RyYW5zaXRpb25pbmc6IHRydWUsXG4gICAgICAgIGZsdXNoU3luYzogZmFsc2UsXG4gICAgICAgIGN1cnJlbnRMb2NhdGlvbjogaW50ZXJydXB0aW9uLmN1cnJlbnRMb2NhdGlvbixcbiAgICAgICAgbmV4dExvY2F0aW9uOiBpbnRlcnJ1cHRpb24ubmV4dExvY2F0aW9uXG4gICAgICB9KTtcbiAgICAgIHNldEludGVycnVwdGlvbih1bmRlZmluZWQpO1xuICAgIH1cbiAgfSwgW3Z0Q29udGV4dC5pc1RyYW5zaXRpb25pbmcsIGludGVycnVwdGlvbl0pO1xuICBsZXQgbmF2aWdhdG9yID0gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNyZWF0ZUhyZWY6IHJvdXRlci5jcmVhdGVIcmVmLFxuICAgICAgZW5jb2RlTG9jYXRpb246IHJvdXRlci5lbmNvZGVMb2NhdGlvbixcbiAgICAgIGdvOiBuID0+IHJvdXRlci5uYXZpZ2F0ZShuKSxcbiAgICAgIHB1c2g6ICh0bywgc3RhdGUsIG9wdHMpID0+IHJvdXRlci5uYXZpZ2F0ZSh0bywge1xuICAgICAgICBzdGF0ZSxcbiAgICAgICAgcHJldmVudFNjcm9sbFJlc2V0OiBvcHRzID09IG51bGwgPyB2b2lkIDAgOiBvcHRzLnByZXZlbnRTY3JvbGxSZXNldFxuICAgICAgfSksXG4gICAgICByZXBsYWNlOiAodG8sIHN0YXRlLCBvcHRzKSA9PiByb3V0ZXIubmF2aWdhdGUodG8sIHtcbiAgICAgICAgcmVwbGFjZTogdHJ1ZSxcbiAgICAgICAgc3RhdGUsXG4gICAgICAgIHByZXZlbnRTY3JvbGxSZXNldDogb3B0cyA9PSBudWxsID8gdm9pZCAwIDogb3B0cy5wcmV2ZW50U2Nyb2xsUmVzZXRcbiAgICAgIH0pXG4gICAgfTtcbiAgfSwgW3JvdXRlcl0pO1xuICBsZXQgYmFzZW5hbWUgPSByb3V0ZXIuYmFzZW5hbWUgfHwgXCIvXCI7XG4gIGxldCBkYXRhUm91dGVyQ29udGV4dCA9IFJlYWN0LnVzZU1lbW8oKCkgPT4gKHtcbiAgICByb3V0ZXIsXG4gICAgbmF2aWdhdG9yLFxuICAgIHN0YXRpYzogZmFsc2UsXG4gICAgYmFzZW5hbWVcbiAgfSksIFtyb3V0ZXIsIG5hdmlnYXRvciwgYmFzZW5hbWVdKTtcbiAgLy8gVGhlIGZyYWdtZW50IGFuZCB7bnVsbH0gaGVyZSBhcmUgaW1wb3J0YW50ISAgV2UgbmVlZCB0aGVtIHRvIGtlZXAgUmVhY3QgMTgnc1xuICAvLyB1c2VJZCBoYXBweSB3aGVuIHdlIGFyZSBzZXJ2ZXItcmVuZGVyaW5nIHNpbmNlIHdlIG1heSBoYXZlIGEgPHNjcmlwdD4gaGVyZVxuICAvLyBjb250YWluaW5nIHRoZSBoeWRyYXRlZCBzZXJ2ZXItc2lkZSBzdGF0aWNDb250ZXh0IChmcm9tIFN0YXRpY1JvdXRlclByb3ZpZGVyKS5cbiAgLy8gdXNlSWQgcmVsaWVzIG9uIHRoZSBjb21wb25lbnQgdHJlZSBzdHJ1Y3R1cmUgdG8gZ2VuZXJhdGUgZGV0ZXJtaW5pc3RpYyBpZCdzXG4gIC8vIHNvIHdlIG5lZWQgdG8gZW5zdXJlIGl0IHJlbWFpbnMgdGhlIHNhbWUgb24gdGhlIGNsaWVudCBldmVuIHRob3VnaFxuICAvLyB3ZSBkb24ndCBuZWVkIHRoZSA8c2NyaXB0PiB0YWdcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChVTlNBRkVfRGF0YVJvdXRlckNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogZGF0YVJvdXRlckNvbnRleHRcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVU5TQUZFX0RhdGFSb3V0ZXJTdGF0ZUNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogc3RhdGVcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRmV0Y2hlcnNDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IGZldGNoZXJEYXRhLmN1cnJlbnRcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVmlld1RyYW5zaXRpb25Db250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IHZ0Q29udGV4dFxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSb3V0ZXIsIHtcbiAgICBiYXNlbmFtZTogYmFzZW5hbWUsXG4gICAgbG9jYXRpb246IHN0YXRlLmxvY2F0aW9uLFxuICAgIG5hdmlnYXRpb25UeXBlOiBzdGF0ZS5oaXN0b3J5QWN0aW9uLFxuICAgIG5hdmlnYXRvcjogbmF2aWdhdG9yXG4gIH0sIHN0YXRlLmluaXRpYWxpemVkID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRGF0YVJvdXRlcywge1xuICAgIHJvdXRlczogcm91dGVyLnJvdXRlcyxcbiAgICBzdGF0ZTogc3RhdGVcbiAgfSkgOiBmYWxsYmFja0VsZW1lbnQpKSkpKSwgbnVsbCk7XG59XG5mdW5jdGlvbiBEYXRhUm91dGVzKF9yZWYzKSB7XG4gIGxldCB7XG4gICAgcm91dGVzLFxuICAgIHN0YXRlXG4gIH0gPSBfcmVmMztcbiAgcmV0dXJuIFVOU0FGRV91c2VSb3V0ZXNJbXBsKHJvdXRlcywgdW5kZWZpbmVkLCBzdGF0ZSk7XG59XG4vKipcbiAqIEEgYDxSb3V0ZXI+YCBmb3IgdXNlIGluIHdlYiBicm93c2Vycy4gUHJvdmlkZXMgdGhlIGNsZWFuZXN0IFVSTHMuXG4gKi9cbmZ1bmN0aW9uIEJyb3dzZXJSb3V0ZXIoX3JlZjQpIHtcbiAgbGV0IHtcbiAgICBiYXNlbmFtZSxcbiAgICBjaGlsZHJlbixcbiAgICBmdXR1cmUsXG4gICAgd2luZG93XG4gIH0gPSBfcmVmNDtcbiAgbGV0IGhpc3RvcnlSZWYgPSBSZWFjdC51c2VSZWYoKTtcbiAgaWYgKGhpc3RvcnlSZWYuY3VycmVudCA9PSBudWxsKSB7XG4gICAgaGlzdG9yeVJlZi5jdXJyZW50ID0gY3JlYXRlQnJvd3Nlckhpc3Rvcnkoe1xuICAgICAgd2luZG93LFxuICAgICAgdjVDb21wYXQ6IHRydWVcbiAgICB9KTtcbiAgfVxuICBsZXQgaGlzdG9yeSA9IGhpc3RvcnlSZWYuY3VycmVudDtcbiAgbGV0IFtzdGF0ZSwgc2V0U3RhdGVJbXBsXSA9IFJlYWN0LnVzZVN0YXRlKHtcbiAgICBhY3Rpb246IGhpc3RvcnkuYWN0aW9uLFxuICAgIGxvY2F0aW9uOiBoaXN0b3J5LmxvY2F0aW9uXG4gIH0pO1xuICBsZXQge1xuICAgIHY3X3N0YXJ0VHJhbnNpdGlvblxuICB9ID0gZnV0dXJlIHx8IHt9O1xuICBsZXQgc2V0U3RhdGUgPSBSZWFjdC51c2VDYWxsYmFjayhuZXdTdGF0ZSA9PiB7XG4gICAgdjdfc3RhcnRUcmFuc2l0aW9uICYmIHN0YXJ0VHJhbnNpdGlvbkltcGwgPyBzdGFydFRyYW5zaXRpb25JbXBsKCgpID0+IHNldFN0YXRlSW1wbChuZXdTdGF0ZSkpIDogc2V0U3RhdGVJbXBsKG5ld1N0YXRlKTtcbiAgfSwgW3NldFN0YXRlSW1wbCwgdjdfc3RhcnRUcmFuc2l0aW9uXSk7XG4gIFJlYWN0LnVzZUxheW91dEVmZmVjdCgoKSA9PiBoaXN0b3J5Lmxpc3RlbihzZXRTdGF0ZSksIFtoaXN0b3J5LCBzZXRTdGF0ZV0pO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUm91dGVyLCB7XG4gICAgYmFzZW5hbWU6IGJhc2VuYW1lLFxuICAgIGNoaWxkcmVuOiBjaGlsZHJlbixcbiAgICBsb2NhdGlvbjogc3RhdGUubG9jYXRpb24sXG4gICAgbmF2aWdhdGlvblR5cGU6IHN0YXRlLmFjdGlvbixcbiAgICBuYXZpZ2F0b3I6IGhpc3RvcnlcbiAgfSk7XG59XG4vKipcbiAqIEEgYDxSb3V0ZXI+YCBmb3IgdXNlIGluIHdlYiBicm93c2Vycy4gU3RvcmVzIHRoZSBsb2NhdGlvbiBpbiB0aGUgaGFzaFxuICogcG9ydGlvbiBvZiB0aGUgVVJMIHNvIGl0IGlzIG5vdCBzZW50IHRvIHRoZSBzZXJ2ZXIuXG4gKi9cbmZ1bmN0aW9uIEhhc2hSb3V0ZXIoX3JlZjUpIHtcbiAgbGV0IHtcbiAgICBiYXNlbmFtZSxcbiAgICBjaGlsZHJlbixcbiAgICBmdXR1cmUsXG4gICAgd2luZG93XG4gIH0gPSBfcmVmNTtcbiAgbGV0IGhpc3RvcnlSZWYgPSBSZWFjdC51c2VSZWYoKTtcbiAgaWYgKGhpc3RvcnlSZWYuY3VycmVudCA9PSBudWxsKSB7XG4gICAgaGlzdG9yeVJlZi5jdXJyZW50ID0gY3JlYXRlSGFzaEhpc3Rvcnkoe1xuICAgICAgd2luZG93LFxuICAgICAgdjVDb21wYXQ6IHRydWVcbiAgICB9KTtcbiAgfVxuICBsZXQgaGlzdG9yeSA9IGhpc3RvcnlSZWYuY3VycmVudDtcbiAgbGV0IFtzdGF0ZSwgc2V0U3RhdGVJbXBsXSA9IFJlYWN0LnVzZVN0YXRlKHtcbiAgICBhY3Rpb246IGhpc3RvcnkuYWN0aW9uLFxuICAgIGxvY2F0aW9uOiBoaXN0b3J5LmxvY2F0aW9uXG4gIH0pO1xuICBsZXQge1xuICAgIHY3X3N0YXJ0VHJhbnNpdGlvblxuICB9ID0gZnV0dXJlIHx8IHt9O1xuICBsZXQgc2V0U3RhdGUgPSBSZWFjdC51c2VDYWxsYmFjayhuZXdTdGF0ZSA9PiB7XG4gICAgdjdfc3RhcnRUcmFuc2l0aW9uICYmIHN0YXJ0VHJhbnNpdGlvbkltcGwgPyBzdGFydFRyYW5zaXRpb25JbXBsKCgpID0+IHNldFN0YXRlSW1wbChuZXdTdGF0ZSkpIDogc2V0U3RhdGVJbXBsKG5ld1N0YXRlKTtcbiAgfSwgW3NldFN0YXRlSW1wbCwgdjdfc3RhcnRUcmFuc2l0aW9uXSk7XG4gIFJlYWN0LnVzZUxheW91dEVmZmVjdCgoKSA9PiBoaXN0b3J5Lmxpc3RlbihzZXRTdGF0ZSksIFtoaXN0b3J5LCBzZXRTdGF0ZV0pO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUm91dGVyLCB7XG4gICAgYmFzZW5hbWU6IGJhc2VuYW1lLFxuICAgIGNoaWxkcmVuOiBjaGlsZHJlbixcbiAgICBsb2NhdGlvbjogc3RhdGUubG9jYXRpb24sXG4gICAgbmF2aWdhdGlvblR5cGU6IHN0YXRlLmFjdGlvbixcbiAgICBuYXZpZ2F0b3I6IGhpc3RvcnlcbiAgfSk7XG59XG4vKipcbiAqIEEgYDxSb3V0ZXI+YCB0aGF0IGFjY2VwdHMgYSBwcmUtaW5zdGFudGlhdGVkIGhpc3Rvcnkgb2JqZWN0LiBJdCdzIGltcG9ydGFudFxuICogdG8gbm90ZSB0aGF0IHVzaW5nIHlvdXIgb3duIGhpc3Rvcnkgb2JqZWN0IGlzIGhpZ2hseSBkaXNjb3VyYWdlZCBhbmQgbWF5IGFkZFxuICogdHdvIHZlcnNpb25zIG9mIHRoZSBoaXN0b3J5IGxpYnJhcnkgdG8geW91ciBidW5kbGVzIHVubGVzcyB5b3UgdXNlIHRoZSBzYW1lXG4gKiB2ZXJzaW9uIG9mIHRoZSBoaXN0b3J5IGxpYnJhcnkgdGhhdCBSZWFjdCBSb3V0ZXIgdXNlcyBpbnRlcm5hbGx5LlxuICovXG5mdW5jdGlvbiBIaXN0b3J5Um91dGVyKF9yZWY2KSB7XG4gIGxldCB7XG4gICAgYmFzZW5hbWUsXG4gICAgY2hpbGRyZW4sXG4gICAgZnV0dXJlLFxuICAgIGhpc3RvcnlcbiAgfSA9IF9yZWY2O1xuICBsZXQgW3N0YXRlLCBzZXRTdGF0ZUltcGxdID0gUmVhY3QudXNlU3RhdGUoe1xuICAgIGFjdGlvbjogaGlzdG9yeS5hY3Rpb24sXG4gICAgbG9jYXRpb246IGhpc3RvcnkubG9jYXRpb25cbiAgfSk7XG4gIGxldCB7XG4gICAgdjdfc3RhcnRUcmFuc2l0aW9uXG4gIH0gPSBmdXR1cmUgfHwge307XG4gIGxldCBzZXRTdGF0ZSA9IFJlYWN0LnVzZUNhbGxiYWNrKG5ld1N0YXRlID0+IHtcbiAgICB2N19zdGFydFRyYW5zaXRpb24gJiYgc3RhcnRUcmFuc2l0aW9uSW1wbCA/IHN0YXJ0VHJhbnNpdGlvbkltcGwoKCkgPT4gc2V0U3RhdGVJbXBsKG5ld1N0YXRlKSkgOiBzZXRTdGF0ZUltcGwobmV3U3RhdGUpO1xuICB9LCBbc2V0U3RhdGVJbXBsLCB2N19zdGFydFRyYW5zaXRpb25dKTtcbiAgUmVhY3QudXNlTGF5b3V0RWZmZWN0KCgpID0+IGhpc3RvcnkubGlzdGVuKHNldFN0YXRlKSwgW2hpc3RvcnksIHNldFN0YXRlXSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSb3V0ZXIsIHtcbiAgICBiYXNlbmFtZTogYmFzZW5hbWUsXG4gICAgY2hpbGRyZW46IGNoaWxkcmVuLFxuICAgIGxvY2F0aW9uOiBzdGF0ZS5sb2NhdGlvbixcbiAgICBuYXZpZ2F0aW9uVHlwZTogc3RhdGUuYWN0aW9uLFxuICAgIG5hdmlnYXRvcjogaGlzdG9yeVxuICB9KTtcbn1cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgSGlzdG9yeVJvdXRlci5kaXNwbGF5TmFtZSA9IFwidW5zdGFibGVfSGlzdG9yeVJvdXRlclwiO1xufVxuY29uc3QgaXNCcm93c2VyID0gdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2Ygd2luZG93LmRvY3VtZW50ICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAhPT0gXCJ1bmRlZmluZWRcIjtcbmNvbnN0IEFCU09MVVRFX1VSTF9SRUdFWCA9IC9eKD86W2Etel1bYS16MC05Ky4tXSo6fFxcL1xcLykvaTtcbi8qKlxuICogVGhlIHB1YmxpYyBBUEkgZm9yIHJlbmRlcmluZyBhIGhpc3RvcnktYXdhcmUgYDxhPmAuXG4gKi9cbmNvbnN0IExpbmsgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiBMaW5rV2l0aFJlZihfcmVmNywgcmVmKSB7XG4gIGxldCB7XG4gICAgICBvbkNsaWNrLFxuICAgICAgcmVsYXRpdmUsXG4gICAgICByZWxvYWREb2N1bWVudCxcbiAgICAgIHJlcGxhY2UsXG4gICAgICBzdGF0ZSxcbiAgICAgIHRhcmdldCxcbiAgICAgIHRvLFxuICAgICAgcHJldmVudFNjcm9sbFJlc2V0LFxuICAgICAgdW5zdGFibGVfdmlld1RyYW5zaXRpb25cbiAgICB9ID0gX3JlZjcsXG4gICAgcmVzdCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKF9yZWY3LCBfZXhjbHVkZWQpO1xuICBsZXQge1xuICAgIGJhc2VuYW1lXG4gIH0gPSBSZWFjdC51c2VDb250ZXh0KFVOU0FGRV9OYXZpZ2F0aW9uQ29udGV4dCk7XG4gIC8vIFJlbmRlcmVkIGludG8gPGEgaHJlZj4gZm9yIGFic29sdXRlIFVSTHNcbiAgbGV0IGFic29sdXRlSHJlZjtcbiAgbGV0IGlzRXh0ZXJuYWwgPSBmYWxzZTtcbiAgaWYgKHR5cGVvZiB0byA9PT0gXCJzdHJpbmdcIiAmJiBBQlNPTFVURV9VUkxfUkVHRVgudGVzdCh0bykpIHtcbiAgICAvLyBSZW5kZXIgdGhlIGFic29sdXRlIGhyZWYgc2VydmVyLSBhbmQgY2xpZW50LXNpZGVcbiAgICBhYnNvbHV0ZUhyZWYgPSB0bztcbiAgICAvLyBPbmx5IGNoZWNrIGZvciBleHRlcm5hbCBvcmlnaW5zIGNsaWVudC1zaWRlXG4gICAgaWYgKGlzQnJvd3Nlcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbGV0IGN1cnJlbnRVcmwgPSBuZXcgVVJMKHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcbiAgICAgICAgbGV0IHRhcmdldFVybCA9IHRvLnN0YXJ0c1dpdGgoXCIvL1wiKSA/IG5ldyBVUkwoY3VycmVudFVybC5wcm90b2NvbCArIHRvKSA6IG5ldyBVUkwodG8pO1xuICAgICAgICBsZXQgcGF0aCA9IHN0cmlwQmFzZW5hbWUodGFyZ2V0VXJsLnBhdGhuYW1lLCBiYXNlbmFtZSk7XG4gICAgICAgIGlmICh0YXJnZXRVcmwub3JpZ2luID09PSBjdXJyZW50VXJsLm9yaWdpbiAmJiBwYXRoICE9IG51bGwpIHtcbiAgICAgICAgICAvLyBTdHJpcCB0aGUgcHJvdG9jb2wvb3JpZ2luL2Jhc2VuYW1lIGZvciBzYW1lLW9yaWdpbiBhYnNvbHV0ZSBVUkxzXG4gICAgICAgICAgdG8gPSBwYXRoICsgdGFyZ2V0VXJsLnNlYXJjaCArIHRhcmdldFVybC5oYXNoO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlzRXh0ZXJuYWwgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIFdlIGNhbid0IGRvIGV4dGVybmFsIFVSTCBkZXRlY3Rpb24gd2l0aG91dCBhIHZhbGlkIFVSTFxuICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBVTlNBRkVfd2FybmluZyhmYWxzZSwgXCI8TGluayB0bz1cXFwiXCIgKyB0byArIFwiXFxcIj4gY29udGFpbnMgYW4gaW52YWxpZCBVUkwgd2hpY2ggd2lsbCBwcm9iYWJseSBicmVhayBcIiArIFwid2hlbiBjbGlja2VkIC0gcGxlYXNlIHVwZGF0ZSB0byBhIHZhbGlkIFVSTCBwYXRoLlwiKSA6IHZvaWQgMDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLy8gUmVuZGVyZWQgaW50byA8YSBocmVmPiBmb3IgcmVsYXRpdmUgVVJMc1xuICBsZXQgaHJlZiA9IHVzZUhyZWYodG8sIHtcbiAgICByZWxhdGl2ZVxuICB9KTtcbiAgbGV0IGludGVybmFsT25DbGljayA9IHVzZUxpbmtDbGlja0hhbmRsZXIodG8sIHtcbiAgICByZXBsYWNlLFxuICAgIHN0YXRlLFxuICAgIHRhcmdldCxcbiAgICBwcmV2ZW50U2Nyb2xsUmVzZXQsXG4gICAgcmVsYXRpdmUsXG4gICAgdW5zdGFibGVfdmlld1RyYW5zaXRpb25cbiAgfSk7XG4gIGZ1bmN0aW9uIGhhbmRsZUNsaWNrKGV2ZW50KSB7XG4gICAgaWYgKG9uQ2xpY2spIG9uQ2xpY2soZXZlbnQpO1xuICAgIGlmICghZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgaW50ZXJuYWxPbkNsaWNrKGV2ZW50KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIChcbiAgICAvKiNfX1BVUkVfXyovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzeC1hMTF5L2FuY2hvci1oYXMtY29udGVudFxuICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJhXCIsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgICBocmVmOiBhYnNvbHV0ZUhyZWYgfHwgaHJlZixcbiAgICAgIG9uQ2xpY2s6IGlzRXh0ZXJuYWwgfHwgcmVsb2FkRG9jdW1lbnQgPyBvbkNsaWNrIDogaGFuZGxlQ2xpY2ssXG4gICAgICByZWY6IHJlZixcbiAgICAgIHRhcmdldDogdGFyZ2V0XG4gICAgfSkpXG4gICk7XG59KTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgTGluay5kaXNwbGF5TmFtZSA9IFwiTGlua1wiO1xufVxuLyoqXG4gKiBBIGA8TGluaz5gIHdyYXBwZXIgdGhhdCBrbm93cyBpZiBpdCdzIFwiYWN0aXZlXCIgb3Igbm90LlxuICovXG5jb25zdCBOYXZMaW5rID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gTmF2TGlua1dpdGhSZWYoX3JlZjgsIHJlZikge1xuICBsZXQge1xuICAgICAgXCJhcmlhLWN1cnJlbnRcIjogYXJpYUN1cnJlbnRQcm9wID0gXCJwYWdlXCIsXG4gICAgICBjYXNlU2Vuc2l0aXZlID0gZmFsc2UsXG4gICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZVByb3AgPSBcIlwiLFxuICAgICAgZW5kID0gZmFsc2UsXG4gICAgICBzdHlsZTogc3R5bGVQcm9wLFxuICAgICAgdG8sXG4gICAgICB1bnN0YWJsZV92aWV3VHJhbnNpdGlvbixcbiAgICAgIGNoaWxkcmVuXG4gICAgfSA9IF9yZWY4LFxuICAgIHJlc3QgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShfcmVmOCwgX2V4Y2x1ZGVkMik7XG4gIGxldCBwYXRoID0gdXNlUmVzb2x2ZWRQYXRoKHRvLCB7XG4gICAgcmVsYXRpdmU6IHJlc3QucmVsYXRpdmVcbiAgfSk7XG4gIGxldCBsb2NhdGlvbiA9IHVzZUxvY2F0aW9uKCk7XG4gIGxldCByb3V0ZXJTdGF0ZSA9IFJlYWN0LnVzZUNvbnRleHQoVU5TQUZFX0RhdGFSb3V0ZXJTdGF0ZUNvbnRleHQpO1xuICBsZXQge1xuICAgIG5hdmlnYXRvclxuICB9ID0gUmVhY3QudXNlQ29udGV4dChVTlNBRkVfTmF2aWdhdGlvbkNvbnRleHQpO1xuICBsZXQgaXNUcmFuc2l0aW9uaW5nID0gcm91dGVyU3RhdGUgIT0gbnVsbCAmJlxuICAvLyBDb25kaXRpb25hbCB1c2FnZSBpcyBPSyBoZXJlIGJlY2F1c2UgdGhlIHVzYWdlIG9mIGEgZGF0YSByb3V0ZXIgaXMgc3RhdGljXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9ydWxlcy1vZi1ob29rc1xuICB1c2VWaWV3VHJhbnNpdGlvblN0YXRlKHBhdGgpICYmIHVuc3RhYmxlX3ZpZXdUcmFuc2l0aW9uID09PSB0cnVlO1xuICBsZXQgdG9QYXRobmFtZSA9IG5hdmlnYXRvci5lbmNvZGVMb2NhdGlvbiA/IG5hdmlnYXRvci5lbmNvZGVMb2NhdGlvbihwYXRoKS5wYXRobmFtZSA6IHBhdGgucGF0aG5hbWU7XG4gIGxldCBsb2NhdGlvblBhdGhuYW1lID0gbG9jYXRpb24ucGF0aG5hbWU7XG4gIGxldCBuZXh0TG9jYXRpb25QYXRobmFtZSA9IHJvdXRlclN0YXRlICYmIHJvdXRlclN0YXRlLm5hdmlnYXRpb24gJiYgcm91dGVyU3RhdGUubmF2aWdhdGlvbi5sb2NhdGlvbiA/IHJvdXRlclN0YXRlLm5hdmlnYXRpb24ubG9jYXRpb24ucGF0aG5hbWUgOiBudWxsO1xuICBpZiAoIWNhc2VTZW5zaXRpdmUpIHtcbiAgICBsb2NhdGlvblBhdGhuYW1lID0gbG9jYXRpb25QYXRobmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIG5leHRMb2NhdGlvblBhdGhuYW1lID0gbmV4dExvY2F0aW9uUGF0aG5hbWUgPyBuZXh0TG9jYXRpb25QYXRobmFtZS50b0xvd2VyQ2FzZSgpIDogbnVsbDtcbiAgICB0b1BhdGhuYW1lID0gdG9QYXRobmFtZS50b0xvd2VyQ2FzZSgpO1xuICB9XG4gIC8vIElmIHRoZSBgdG9gIGhhcyBhIHRyYWlsaW5nIHNsYXNoLCBsb29rIGF0IHRoYXQgZXhhY3Qgc3BvdC4gIE90aGVyd2lzZSxcbiAgLy8gd2UncmUgbG9va2luZyBmb3IgYSBzbGFzaCBfYWZ0ZXJfIHdoYXQncyBpbiBgdG9gLiAgRm9yIGV4YW1wbGU6XG4gIC8vXG4gIC8vIDxOYXZMaW5rIHRvPVwiL3VzZXJzXCI+IGFuZCA8TmF2TGluayB0bz1cIi91c2Vycy9cIj5cbiAgLy8gYm90aCB3YW50IHRvIGxvb2sgZm9yIGEgLyBhdCBpbmRleCA2IHRvIG1hdGNoIFVSTCBgL3VzZXJzL21hdHRgXG4gIGNvbnN0IGVuZFNsYXNoUG9zaXRpb24gPSB0b1BhdGhuYW1lICE9PSBcIi9cIiAmJiB0b1BhdGhuYW1lLmVuZHNXaXRoKFwiL1wiKSA/IHRvUGF0aG5hbWUubGVuZ3RoIC0gMSA6IHRvUGF0aG5hbWUubGVuZ3RoO1xuICBsZXQgaXNBY3RpdmUgPSBsb2NhdGlvblBhdGhuYW1lID09PSB0b1BhdGhuYW1lIHx8ICFlbmQgJiYgbG9jYXRpb25QYXRobmFtZS5zdGFydHNXaXRoKHRvUGF0aG5hbWUpICYmIGxvY2F0aW9uUGF0aG5hbWUuY2hhckF0KGVuZFNsYXNoUG9zaXRpb24pID09PSBcIi9cIjtcbiAgbGV0IGlzUGVuZGluZyA9IG5leHRMb2NhdGlvblBhdGhuYW1lICE9IG51bGwgJiYgKG5leHRMb2NhdGlvblBhdGhuYW1lID09PSB0b1BhdGhuYW1lIHx8ICFlbmQgJiYgbmV4dExvY2F0aW9uUGF0aG5hbWUuc3RhcnRzV2l0aCh0b1BhdGhuYW1lKSAmJiBuZXh0TG9jYXRpb25QYXRobmFtZS5jaGFyQXQodG9QYXRobmFtZS5sZW5ndGgpID09PSBcIi9cIik7XG4gIGxldCByZW5kZXJQcm9wcyA9IHtcbiAgICBpc0FjdGl2ZSxcbiAgICBpc1BlbmRpbmcsXG4gICAgaXNUcmFuc2l0aW9uaW5nXG4gIH07XG4gIGxldCBhcmlhQ3VycmVudCA9IGlzQWN0aXZlID8gYXJpYUN1cnJlbnRQcm9wIDogdW5kZWZpbmVkO1xuICBsZXQgY2xhc3NOYW1lO1xuICBpZiAodHlwZW9mIGNsYXNzTmFtZVByb3AgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGNsYXNzTmFtZSA9IGNsYXNzTmFtZVByb3AocmVuZGVyUHJvcHMpO1xuICB9IGVsc2Uge1xuICAgIC8vIElmIHRoZSBjbGFzc05hbWUgcHJvcCBpcyBub3QgYSBmdW5jdGlvbiwgd2UgdXNlIGEgZGVmYXVsdCBgYWN0aXZlYFxuICAgIC8vIGNsYXNzIGZvciA8TmF2TGluayAvPnMgdGhhdCBhcmUgYWN0aXZlLiBJbiB2NSBgYWN0aXZlYCB3YXMgdGhlIGRlZmF1bHRcbiAgICAvLyB2YWx1ZSBmb3IgYGFjdGl2ZUNsYXNzTmFtZWAsIGJ1dCB3ZSBhcmUgcmVtb3ZpbmcgdGhhdCBBUEkgYW5kIGNhbiBzdGlsbFxuICAgIC8vIHVzZSB0aGUgb2xkIGRlZmF1bHQgYmVoYXZpb3IgZm9yIGEgY2xlYW5lciB1cGdyYWRlIHBhdGggYW5kIGtlZXAgdGhlXG4gICAgLy8gc2ltcGxlIHN0eWxpbmcgcnVsZXMgd29ya2luZyBhcyB0aGV5IGN1cnJlbnRseSBkby5cbiAgICBjbGFzc05hbWUgPSBbY2xhc3NOYW1lUHJvcCwgaXNBY3RpdmUgPyBcImFjdGl2ZVwiIDogbnVsbCwgaXNQZW5kaW5nID8gXCJwZW5kaW5nXCIgOiBudWxsLCBpc1RyYW5zaXRpb25pbmcgPyBcInRyYW5zaXRpb25pbmdcIiA6IG51bGxdLmZpbHRlcihCb29sZWFuKS5qb2luKFwiIFwiKTtcbiAgfVxuICBsZXQgc3R5bGUgPSB0eXBlb2Ygc3R5bGVQcm9wID09PSBcImZ1bmN0aW9uXCIgPyBzdHlsZVByb3AocmVuZGVyUHJvcHMpIDogc3R5bGVQcm9wO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTGluaywgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICBcImFyaWEtY3VycmVudFwiOiBhcmlhQ3VycmVudCxcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZSxcbiAgICByZWY6IHJlZixcbiAgICBzdHlsZTogc3R5bGUsXG4gICAgdG86IHRvLFxuICAgIHVuc3RhYmxlX3ZpZXdUcmFuc2l0aW9uOiB1bnN0YWJsZV92aWV3VHJhbnNpdGlvblxuICB9KSwgdHlwZW9mIGNoaWxkcmVuID09PSBcImZ1bmN0aW9uXCIgPyBjaGlsZHJlbihyZW5kZXJQcm9wcykgOiBjaGlsZHJlbik7XG59KTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgTmF2TGluay5kaXNwbGF5TmFtZSA9IFwiTmF2TGlua1wiO1xufVxuLyoqXG4gKiBBIGBAcmVtaXgtcnVuL3JvdXRlcmAtYXdhcmUgYDxmb3JtPmAuIEl0IGJlaGF2ZXMgbGlrZSBhIG5vcm1hbCBmb3JtIGV4Y2VwdFxuICogdGhhdCB0aGUgaW50ZXJhY3Rpb24gd2l0aCB0aGUgc2VydmVyIGlzIHdpdGggYGZldGNoYCBpbnN0ZWFkIG9mIG5ldyBkb2N1bWVudFxuICogcmVxdWVzdHMsIGFsbG93aW5nIGNvbXBvbmVudHMgdG8gYWRkIG5pY2VyIFVYIHRvIHRoZSBwYWdlIGFzIHRoZSBmb3JtIGlzXG4gKiBzdWJtaXR0ZWQgYW5kIHJldHVybnMgd2l0aCBkYXRhLlxuICovXG5jb25zdCBGb3JtID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKF9yZWY5LCBmb3J3YXJkZWRSZWYpID0+IHtcbiAgbGV0IHtcbiAgICAgIGZldGNoZXJLZXksXG4gICAgICBuYXZpZ2F0ZSxcbiAgICAgIHJlbG9hZERvY3VtZW50LFxuICAgICAgcmVwbGFjZSxcbiAgICAgIHN0YXRlLFxuICAgICAgbWV0aG9kID0gZGVmYXVsdE1ldGhvZCxcbiAgICAgIGFjdGlvbixcbiAgICAgIG9uU3VibWl0LFxuICAgICAgcmVsYXRpdmUsXG4gICAgICBwcmV2ZW50U2Nyb2xsUmVzZXQsXG4gICAgICB1bnN0YWJsZV92aWV3VHJhbnNpdGlvblxuICAgIH0gPSBfcmVmOSxcbiAgICBwcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKF9yZWY5LCBfZXhjbHVkZWQzKTtcbiAgbGV0IHN1Ym1pdCA9IHVzZVN1Ym1pdCgpO1xuICBsZXQgZm9ybUFjdGlvbiA9IHVzZUZvcm1BY3Rpb24oYWN0aW9uLCB7XG4gICAgcmVsYXRpdmVcbiAgfSk7XG4gIGxldCBmb3JtTWV0aG9kID0gbWV0aG9kLnRvTG93ZXJDYXNlKCkgPT09IFwiZ2V0XCIgPyBcImdldFwiIDogXCJwb3N0XCI7XG4gIGxldCBzdWJtaXRIYW5kbGVyID0gZXZlbnQgPT4ge1xuICAgIG9uU3VibWl0ICYmIG9uU3VibWl0KGV2ZW50KTtcbiAgICBpZiAoZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkgcmV0dXJuO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgbGV0IHN1Ym1pdHRlciA9IGV2ZW50Lm5hdGl2ZUV2ZW50LnN1Ym1pdHRlcjtcbiAgICBsZXQgc3VibWl0TWV0aG9kID0gKHN1Ym1pdHRlciA9PSBudWxsID8gdm9pZCAwIDogc3VibWl0dGVyLmdldEF0dHJpYnV0ZShcImZvcm1tZXRob2RcIikpIHx8IG1ldGhvZDtcbiAgICBzdWJtaXQoc3VibWl0dGVyIHx8IGV2ZW50LmN1cnJlbnRUYXJnZXQsIHtcbiAgICAgIGZldGNoZXJLZXksXG4gICAgICBtZXRob2Q6IHN1Ym1pdE1ldGhvZCxcbiAgICAgIG5hdmlnYXRlLFxuICAgICAgcmVwbGFjZSxcbiAgICAgIHN0YXRlLFxuICAgICAgcmVsYXRpdmUsXG4gICAgICBwcmV2ZW50U2Nyb2xsUmVzZXQsXG4gICAgICB1bnN0YWJsZV92aWV3VHJhbnNpdGlvblxuICAgIH0pO1xuICB9O1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJmb3JtXCIsIF9leHRlbmRzKHtcbiAgICByZWY6IGZvcndhcmRlZFJlZixcbiAgICBtZXRob2Q6IGZvcm1NZXRob2QsXG4gICAgYWN0aW9uOiBmb3JtQWN0aW9uLFxuICAgIG9uU3VibWl0OiByZWxvYWREb2N1bWVudCA/IG9uU3VibWl0IDogc3VibWl0SGFuZGxlclxuICB9LCBwcm9wcykpO1xufSk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIEZvcm0uZGlzcGxheU5hbWUgPSBcIkZvcm1cIjtcbn1cbi8qKlxuICogVGhpcyBjb21wb25lbnQgd2lsbCBlbXVsYXRlIHRoZSBicm93c2VyJ3Mgc2Nyb2xsIHJlc3RvcmF0aW9uIG9uIGxvY2F0aW9uXG4gKiBjaGFuZ2VzLlxuICovXG5mdW5jdGlvbiBTY3JvbGxSZXN0b3JhdGlvbihfcmVmMTApIHtcbiAgbGV0IHtcbiAgICBnZXRLZXksXG4gICAgc3RvcmFnZUtleVxuICB9ID0gX3JlZjEwO1xuICB1c2VTY3JvbGxSZXN0b3JhdGlvbih7XG4gICAgZ2V0S2V5LFxuICAgIHN0b3JhZ2VLZXlcbiAgfSk7XG4gIHJldHVybiBudWxsO1xufVxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICBTY3JvbGxSZXN0b3JhdGlvbi5kaXNwbGF5TmFtZSA9IFwiU2Nyb2xsUmVzdG9yYXRpb25cIjtcbn1cbi8vI2VuZHJlZ2lvblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vI3JlZ2lvbiBIb29rc1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbnZhciBEYXRhUm91dGVySG9vaztcbihmdW5jdGlvbiAoRGF0YVJvdXRlckhvb2spIHtcbiAgRGF0YVJvdXRlckhvb2tbXCJVc2VTY3JvbGxSZXN0b3JhdGlvblwiXSA9IFwidXNlU2Nyb2xsUmVzdG9yYXRpb25cIjtcbiAgRGF0YVJvdXRlckhvb2tbXCJVc2VTdWJtaXRcIl0gPSBcInVzZVN1Ym1pdFwiO1xuICBEYXRhUm91dGVySG9va1tcIlVzZVN1Ym1pdEZldGNoZXJcIl0gPSBcInVzZVN1Ym1pdEZldGNoZXJcIjtcbiAgRGF0YVJvdXRlckhvb2tbXCJVc2VGZXRjaGVyXCJdID0gXCJ1c2VGZXRjaGVyXCI7XG4gIERhdGFSb3V0ZXJIb29rW1widXNlVmlld1RyYW5zaXRpb25TdGF0ZVwiXSA9IFwidXNlVmlld1RyYW5zaXRpb25TdGF0ZVwiO1xufSkoRGF0YVJvdXRlckhvb2sgfHwgKERhdGFSb3V0ZXJIb29rID0ge30pKTtcbnZhciBEYXRhUm91dGVyU3RhdGVIb29rO1xuKGZ1bmN0aW9uIChEYXRhUm91dGVyU3RhdGVIb29rKSB7XG4gIERhdGFSb3V0ZXJTdGF0ZUhvb2tbXCJVc2VGZXRjaGVyXCJdID0gXCJ1c2VGZXRjaGVyXCI7XG4gIERhdGFSb3V0ZXJTdGF0ZUhvb2tbXCJVc2VGZXRjaGVyc1wiXSA9IFwidXNlRmV0Y2hlcnNcIjtcbiAgRGF0YVJvdXRlclN0YXRlSG9va1tcIlVzZVNjcm9sbFJlc3RvcmF0aW9uXCJdID0gXCJ1c2VTY3JvbGxSZXN0b3JhdGlvblwiO1xufSkoRGF0YVJvdXRlclN0YXRlSG9vayB8fCAoRGF0YVJvdXRlclN0YXRlSG9vayA9IHt9KSk7XG4vLyBJbnRlcm5hbCBob29rc1xuZnVuY3Rpb24gZ2V0RGF0YVJvdXRlckNvbnNvbGVFcnJvcihob29rTmFtZSkge1xuICByZXR1cm4gaG9va05hbWUgKyBcIiBtdXN0IGJlIHVzZWQgd2l0aGluIGEgZGF0YSByb3V0ZXIuICBTZWUgaHR0cHM6Ly9yZWFjdHJvdXRlci5jb20vcm91dGVycy9waWNraW5nLWEtcm91dGVyLlwiO1xufVxuZnVuY3Rpb24gdXNlRGF0YVJvdXRlckNvbnRleHQoaG9va05hbWUpIHtcbiAgbGV0IGN0eCA9IFJlYWN0LnVzZUNvbnRleHQoVU5TQUZFX0RhdGFSb3V0ZXJDb250ZXh0KTtcbiAgIWN0eCA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IFVOU0FGRV9pbnZhcmlhbnQoZmFsc2UsIGdldERhdGFSb3V0ZXJDb25zb2xlRXJyb3IoaG9va05hbWUpKSA6IFVOU0FGRV9pbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICByZXR1cm4gY3R4O1xufVxuZnVuY3Rpb24gdXNlRGF0YVJvdXRlclN0YXRlKGhvb2tOYW1lKSB7XG4gIGxldCBzdGF0ZSA9IFJlYWN0LnVzZUNvbnRleHQoVU5TQUZFX0RhdGFSb3V0ZXJTdGF0ZUNvbnRleHQpO1xuICAhc3RhdGUgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBVTlNBRkVfaW52YXJpYW50KGZhbHNlLCBnZXREYXRhUm91dGVyQ29uc29sZUVycm9yKGhvb2tOYW1lKSkgOiBVTlNBRkVfaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgcmV0dXJuIHN0YXRlO1xufVxuLy8gRXh0ZXJuYWwgaG9va3Ncbi8qKlxuICogSGFuZGxlcyB0aGUgY2xpY2sgYmVoYXZpb3IgZm9yIHJvdXRlciBgPExpbms+YCBjb21wb25lbnRzLiBUaGlzIGlzIHVzZWZ1bCBpZlxuICogeW91IG5lZWQgdG8gY3JlYXRlIGN1c3RvbSBgPExpbms+YCBjb21wb25lbnRzIHdpdGggdGhlIHNhbWUgY2xpY2sgYmVoYXZpb3Igd2VcbiAqIHVzZSBpbiBvdXIgZXhwb3J0ZWQgYDxMaW5rPmAuXG4gKi9cbmZ1bmN0aW9uIHVzZUxpbmtDbGlja0hhbmRsZXIodG8sIF90ZW1wKSB7XG4gIGxldCB7XG4gICAgdGFyZ2V0LFxuICAgIHJlcGxhY2U6IHJlcGxhY2VQcm9wLFxuICAgIHN0YXRlLFxuICAgIHByZXZlbnRTY3JvbGxSZXNldCxcbiAgICByZWxhdGl2ZSxcbiAgICB1bnN0YWJsZV92aWV3VHJhbnNpdGlvblxuICB9ID0gX3RlbXAgPT09IHZvaWQgMCA/IHt9IDogX3RlbXA7XG4gIGxldCBuYXZpZ2F0ZSA9IHVzZU5hdmlnYXRlKCk7XG4gIGxldCBsb2NhdGlvbiA9IHVzZUxvY2F0aW9uKCk7XG4gIGxldCBwYXRoID0gdXNlUmVzb2x2ZWRQYXRoKHRvLCB7XG4gICAgcmVsYXRpdmVcbiAgfSk7XG4gIHJldHVybiBSZWFjdC51c2VDYWxsYmFjayhldmVudCA9PiB7XG4gICAgaWYgKHNob3VsZFByb2Nlc3NMaW5rQ2xpY2soZXZlbnQsIHRhcmdldCkpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAvLyBJZiB0aGUgVVJMIGhhc24ndCBjaGFuZ2VkLCBhIHJlZ3VsYXIgPGE+IHdpbGwgZG8gYSByZXBsYWNlIGluc3RlYWQgb2ZcbiAgICAgIC8vIGEgcHVzaCwgc28gZG8gdGhlIHNhbWUgaGVyZSB1bmxlc3MgdGhlIHJlcGxhY2UgcHJvcCBpcyBleHBsaWNpdGx5IHNldFxuICAgICAgbGV0IHJlcGxhY2UgPSByZXBsYWNlUHJvcCAhPT0gdW5kZWZpbmVkID8gcmVwbGFjZVByb3AgOiBjcmVhdGVQYXRoKGxvY2F0aW9uKSA9PT0gY3JlYXRlUGF0aChwYXRoKTtcbiAgICAgIG5hdmlnYXRlKHRvLCB7XG4gICAgICAgIHJlcGxhY2UsXG4gICAgICAgIHN0YXRlLFxuICAgICAgICBwcmV2ZW50U2Nyb2xsUmVzZXQsXG4gICAgICAgIHJlbGF0aXZlLFxuICAgICAgICB1bnN0YWJsZV92aWV3VHJhbnNpdGlvblxuICAgICAgfSk7XG4gICAgfVxuICB9LCBbbG9jYXRpb24sIG5hdmlnYXRlLCBwYXRoLCByZXBsYWNlUHJvcCwgc3RhdGUsIHRhcmdldCwgdG8sIHByZXZlbnRTY3JvbGxSZXNldCwgcmVsYXRpdmUsIHVuc3RhYmxlX3ZpZXdUcmFuc2l0aW9uXSk7XG59XG4vKipcbiAqIEEgY29udmVuaWVudCB3cmFwcGVyIGZvciByZWFkaW5nIGFuZCB3cml0aW5nIHNlYXJjaCBwYXJhbWV0ZXJzIHZpYSB0aGVcbiAqIFVSTFNlYXJjaFBhcmFtcyBpbnRlcmZhY2UuXG4gKi9cbmZ1bmN0aW9uIHVzZVNlYXJjaFBhcmFtcyhkZWZhdWx0SW5pdCkge1xuICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBVTlNBRkVfd2FybmluZyh0eXBlb2YgVVJMU2VhcmNoUGFyYW1zICE9PSBcInVuZGVmaW5lZFwiLCBcIllvdSBjYW5ub3QgdXNlIHRoZSBgdXNlU2VhcmNoUGFyYW1zYCBob29rIGluIGEgYnJvd3NlciB0aGF0IGRvZXMgbm90IFwiICsgXCJzdXBwb3J0IHRoZSBVUkxTZWFyY2hQYXJhbXMgQVBJLiBJZiB5b3UgbmVlZCB0byBzdXBwb3J0IEludGVybmV0IFwiICsgXCJFeHBsb3JlciAxMSwgd2UgcmVjb21tZW5kIHlvdSBsb2FkIGEgcG9seWZpbGwgc3VjaCBhcyBcIiArIFwiaHR0cHM6Ly9naXRodWIuY29tL3VuZ2FwL3VybC1zZWFyY2gtcGFyYW1zXFxuXFxuXCIgKyBcIklmIHlvdSdyZSB1bnN1cmUgaG93IHRvIGxvYWQgcG9seWZpbGxzLCB3ZSByZWNvbW1lbmQgeW91IGNoZWNrIG91dCBcIiArIFwiaHR0cHM6Ly9wb2x5ZmlsbC5pby92My8gd2hpY2ggcHJvdmlkZXMgc29tZSByZWNvbW1lbmRhdGlvbnMgYWJvdXQgaG93IFwiICsgXCJ0byBsb2FkIHBvbHlmaWxscyBvbmx5IGZvciB1c2VycyB0aGF0IG5lZWQgdGhlbSwgaW5zdGVhZCBvZiBmb3IgZXZlcnkgXCIgKyBcInVzZXIuXCIpIDogdm9pZCAwO1xuICBsZXQgZGVmYXVsdFNlYXJjaFBhcmFtc1JlZiA9IFJlYWN0LnVzZVJlZihjcmVhdGVTZWFyY2hQYXJhbXMoZGVmYXVsdEluaXQpKTtcbiAgbGV0IGhhc1NldFNlYXJjaFBhcmFtc1JlZiA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG4gIGxldCBsb2NhdGlvbiA9IHVzZUxvY2F0aW9uKCk7XG4gIGxldCBzZWFyY2hQYXJhbXMgPSBSZWFjdC51c2VNZW1vKCgpID0+XG4gIC8vIE9ubHkgbWVyZ2UgaW4gdGhlIGRlZmF1bHRzIGlmIHdlIGhhdmVuJ3QgeWV0IGNhbGxlZCBzZXRTZWFyY2hQYXJhbXMuXG4gIC8vIE9uY2Ugd2UgY2FsbCB0aGF0IHdlIHdhbnQgdGhvc2UgdG8gdGFrZSBwcmVjZWRlbmNlLCBvdGhlcndpc2UgeW91IGNhbid0XG4gIC8vIHJlbW92ZSBhIHBhcmFtIHdpdGggc2V0U2VhcmNoUGFyYW1zKHt9KSBpZiBpdCBoYXMgYW4gaW5pdGlhbCB2YWx1ZVxuICBnZXRTZWFyY2hQYXJhbXNGb3JMb2NhdGlvbihsb2NhdGlvbi5zZWFyY2gsIGhhc1NldFNlYXJjaFBhcmFtc1JlZi5jdXJyZW50ID8gbnVsbCA6IGRlZmF1bHRTZWFyY2hQYXJhbXNSZWYuY3VycmVudCksIFtsb2NhdGlvbi5zZWFyY2hdKTtcbiAgbGV0IG5hdmlnYXRlID0gdXNlTmF2aWdhdGUoKTtcbiAgbGV0IHNldFNlYXJjaFBhcmFtcyA9IFJlYWN0LnVzZUNhbGxiYWNrKChuZXh0SW5pdCwgbmF2aWdhdGVPcHRpb25zKSA9PiB7XG4gICAgY29uc3QgbmV3U2VhcmNoUGFyYW1zID0gY3JlYXRlU2VhcmNoUGFyYW1zKHR5cGVvZiBuZXh0SW5pdCA9PT0gXCJmdW5jdGlvblwiID8gbmV4dEluaXQoc2VhcmNoUGFyYW1zKSA6IG5leHRJbml0KTtcbiAgICBoYXNTZXRTZWFyY2hQYXJhbXNSZWYuY3VycmVudCA9IHRydWU7XG4gICAgbmF2aWdhdGUoXCI/XCIgKyBuZXdTZWFyY2hQYXJhbXMsIG5hdmlnYXRlT3B0aW9ucyk7XG4gIH0sIFtuYXZpZ2F0ZSwgc2VhcmNoUGFyYW1zXSk7XG4gIHJldHVybiBbc2VhcmNoUGFyYW1zLCBzZXRTZWFyY2hQYXJhbXNdO1xufVxuZnVuY3Rpb24gdmFsaWRhdGVDbGllbnRTaWRlU3VibWlzc2lvbigpIHtcbiAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHRocm93IG5ldyBFcnJvcihcIllvdSBhcmUgY2FsbGluZyBzdWJtaXQgZHVyaW5nIHRoZSBzZXJ2ZXIgcmVuZGVyLiBcIiArIFwiVHJ5IGNhbGxpbmcgc3VibWl0IHdpdGhpbiBhIGB1c2VFZmZlY3RgIG9yIGNhbGxiYWNrIGluc3RlYWQuXCIpO1xuICB9XG59XG5sZXQgZmV0Y2hlcklkID0gMDtcbmxldCBnZXRVbmlxdWVGZXRjaGVySWQgPSAoKSA9PiBcIl9fXCIgKyBTdHJpbmcoKytmZXRjaGVySWQpICsgXCJfX1wiO1xuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBtYXkgYmUgdXNlZCB0byBwcm9ncmFtbWF0aWNhbGx5IHN1Ym1pdCBhIGZvcm0gKG9yXG4gKiBzb21lIGFyYml0cmFyeSBkYXRhKSB0byB0aGUgc2VydmVyLlxuICovXG5mdW5jdGlvbiB1c2VTdWJtaXQoKSB7XG4gIGxldCB7XG4gICAgcm91dGVyXG4gIH0gPSB1c2VEYXRhUm91dGVyQ29udGV4dChEYXRhUm91dGVySG9vay5Vc2VTdWJtaXQpO1xuICBsZXQge1xuICAgIGJhc2VuYW1lXG4gIH0gPSBSZWFjdC51c2VDb250ZXh0KFVOU0FGRV9OYXZpZ2F0aW9uQ29udGV4dCk7XG4gIGxldCBjdXJyZW50Um91dGVJZCA9IFVOU0FGRV91c2VSb3V0ZUlkKCk7XG4gIHJldHVybiBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAodGFyZ2V0LCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0aW9ucyA9IHt9O1xuICAgIH1cbiAgICB2YWxpZGF0ZUNsaWVudFNpZGVTdWJtaXNzaW9uKCk7XG4gICAgbGV0IHtcbiAgICAgIGFjdGlvbixcbiAgICAgIG1ldGhvZCxcbiAgICAgIGVuY1R5cGUsXG4gICAgICBmb3JtRGF0YSxcbiAgICAgIGJvZHlcbiAgICB9ID0gZ2V0Rm9ybVN1Ym1pc3Npb25JbmZvKHRhcmdldCwgYmFzZW5hbWUpO1xuICAgIGlmIChvcHRpb25zLm5hdmlnYXRlID09PSBmYWxzZSkge1xuICAgICAgbGV0IGtleSA9IG9wdGlvbnMuZmV0Y2hlcktleSB8fCBnZXRVbmlxdWVGZXRjaGVySWQoKTtcbiAgICAgIHJvdXRlci5mZXRjaChrZXksIGN1cnJlbnRSb3V0ZUlkLCBvcHRpb25zLmFjdGlvbiB8fCBhY3Rpb24sIHtcbiAgICAgICAgcHJldmVudFNjcm9sbFJlc2V0OiBvcHRpb25zLnByZXZlbnRTY3JvbGxSZXNldCxcbiAgICAgICAgZm9ybURhdGEsXG4gICAgICAgIGJvZHksXG4gICAgICAgIGZvcm1NZXRob2Q6IG9wdGlvbnMubWV0aG9kIHx8IG1ldGhvZCxcbiAgICAgICAgZm9ybUVuY1R5cGU6IG9wdGlvbnMuZW5jVHlwZSB8fCBlbmNUeXBlLFxuICAgICAgICB1bnN0YWJsZV9mbHVzaFN5bmM6IG9wdGlvbnMudW5zdGFibGVfZmx1c2hTeW5jXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcm91dGVyLm5hdmlnYXRlKG9wdGlvbnMuYWN0aW9uIHx8IGFjdGlvbiwge1xuICAgICAgICBwcmV2ZW50U2Nyb2xsUmVzZXQ6IG9wdGlvbnMucHJldmVudFNjcm9sbFJlc2V0LFxuICAgICAgICBmb3JtRGF0YSxcbiAgICAgICAgYm9keSxcbiAgICAgICAgZm9ybU1ldGhvZDogb3B0aW9ucy5tZXRob2QgfHwgbWV0aG9kLFxuICAgICAgICBmb3JtRW5jVHlwZTogb3B0aW9ucy5lbmNUeXBlIHx8IGVuY1R5cGUsXG4gICAgICAgIHJlcGxhY2U6IG9wdGlvbnMucmVwbGFjZSxcbiAgICAgICAgc3RhdGU6IG9wdGlvbnMuc3RhdGUsXG4gICAgICAgIGZyb21Sb3V0ZUlkOiBjdXJyZW50Um91dGVJZCxcbiAgICAgICAgdW5zdGFibGVfZmx1c2hTeW5jOiBvcHRpb25zLnVuc3RhYmxlX2ZsdXNoU3luYyxcbiAgICAgICAgdW5zdGFibGVfdmlld1RyYW5zaXRpb246IG9wdGlvbnMudW5zdGFibGVfdmlld1RyYW5zaXRpb25cbiAgICAgIH0pO1xuICAgIH1cbiAgfSwgW3JvdXRlciwgYmFzZW5hbWUsIGN1cnJlbnRSb3V0ZUlkXSk7XG59XG4vLyB2NzogRXZlbnR1YWxseSB3ZSBzaG91bGQgZGVwcmVjYXRlIHRoaXMgZW50aXJlbHkgaW4gZmF2b3Igb2YgdXNpbmcgdGhlXG4vLyByb3V0ZXIgbWV0aG9kIGRpcmVjdGx5P1xuZnVuY3Rpb24gdXNlRm9ybUFjdGlvbihhY3Rpb24sIF90ZW1wMikge1xuICBsZXQge1xuICAgIHJlbGF0aXZlXG4gIH0gPSBfdGVtcDIgPT09IHZvaWQgMCA/IHt9IDogX3RlbXAyO1xuICBsZXQge1xuICAgIGJhc2VuYW1lXG4gIH0gPSBSZWFjdC51c2VDb250ZXh0KFVOU0FGRV9OYXZpZ2F0aW9uQ29udGV4dCk7XG4gIGxldCByb3V0ZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KFVOU0FGRV9Sb3V0ZUNvbnRleHQpO1xuICAhcm91dGVDb250ZXh0ID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gVU5TQUZFX2ludmFyaWFudChmYWxzZSwgXCJ1c2VGb3JtQWN0aW9uIG11c3QgYmUgdXNlZCBpbnNpZGUgYSBSb3V0ZUNvbnRleHRcIikgOiBVTlNBRkVfaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgbGV0IFttYXRjaF0gPSByb3V0ZUNvbnRleHQubWF0Y2hlcy5zbGljZSgtMSk7XG4gIC8vIFNoYWxsb3cgY2xvbmUgcGF0aCBzbyB3ZSBjYW4gbW9kaWZ5IGl0IGJlbG93LCBvdGhlcndpc2Ugd2UgbW9kaWZ5IHRoZVxuICAvLyBvYmplY3QgcmVmZXJlbmNlZCBieSB1c2VNZW1vIGluc2lkZSB1c2VSZXNvbHZlZFBhdGhcbiAgbGV0IHBhdGggPSBfZXh0ZW5kcyh7fSwgdXNlUmVzb2x2ZWRQYXRoKGFjdGlvbiA/IGFjdGlvbiA6IFwiLlwiLCB7XG4gICAgcmVsYXRpdmVcbiAgfSkpO1xuICAvLyBQcmV2aW91c2x5IHdlIHNldCB0aGUgZGVmYXVsdCBhY3Rpb24gdG8gXCIuXCIuIFRoZSBwcm9ibGVtIHdpdGggdGhpcyBpcyB0aGF0XG4gIC8vIGB1c2VSZXNvbHZlZFBhdGgoXCIuXCIpYCBleGNsdWRlcyBzZWFyY2ggcGFyYW1zIG9mIHRoZSByZXNvbHZlZCBVUkwuIFRoaXMgaXNcbiAgLy8gdGhlIGludGVuZGVkIGJlaGF2aW9yIG9mIHdoZW4gXCIuXCIgaXMgc3BlY2lmaWNhbGx5IHByb3ZpZGVkIGFzXG4gIC8vIHRoZSBmb3JtIGFjdGlvbiwgYnV0IGluY29uc2lzdGVudCB3LyBicm93c2VycyB3aGVuIHRoZSBhY3Rpb24gaXMgb21pdHRlZC5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3JlbWl4LXJ1bi9yZW1peC9pc3N1ZXMvOTI3XG4gIGxldCBsb2NhdGlvbiA9IHVzZUxvY2F0aW9uKCk7XG4gIGlmIChhY3Rpb24gPT0gbnVsbCkge1xuICAgIC8vIFNhZmUgdG8gd3JpdGUgdG8gdGhpcyBkaXJlY3RseSBoZXJlIHNpbmNlIGlmIGFjdGlvbiB3YXMgdW5kZWZpbmVkLCB3ZVxuICAgIC8vIHdvdWxkIGhhdmUgY2FsbGVkIHVzZVJlc29sdmVkUGF0aChcIi5cIikgd2hpY2ggd2lsbCBuZXZlciBpbmNsdWRlIGEgc2VhcmNoXG4gICAgcGF0aC5zZWFyY2ggPSBsb2NhdGlvbi5zZWFyY2g7XG4gICAgLy8gV2hlbiBncmFiYmluZyBzZWFyY2ggcGFyYW1zIGZyb20gdGhlIFVSTCwgcmVtb3ZlIGFueSBpbmNsdWRlZCA/aW5kZXggcGFyYW1cbiAgICAvLyBzaW5jZSBpdCBtaWdodCBub3QgYXBwbHkgdG8gb3VyIGNvbnRleHR1YWwgcm91dGUuICBXZSBhZGQgaXQgYmFjayBiYXNlZFxuICAgIC8vIG9uIG1hdGNoLnJvdXRlLmluZGV4IGJlbG93XG4gICAgbGV0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMocGF0aC5zZWFyY2gpO1xuICAgIGlmIChwYXJhbXMuaGFzKFwiaW5kZXhcIikgJiYgcGFyYW1zLmdldChcImluZGV4XCIpID09PSBcIlwiKSB7XG4gICAgICBwYXJhbXMuZGVsZXRlKFwiaW5kZXhcIik7XG4gICAgICBwYXRoLnNlYXJjaCA9IHBhcmFtcy50b1N0cmluZygpID8gXCI/XCIgKyBwYXJhbXMudG9TdHJpbmcoKSA6IFwiXCI7XG4gICAgfVxuICB9XG4gIGlmICgoIWFjdGlvbiB8fCBhY3Rpb24gPT09IFwiLlwiKSAmJiBtYXRjaC5yb3V0ZS5pbmRleCkge1xuICAgIHBhdGguc2VhcmNoID0gcGF0aC5zZWFyY2ggPyBwYXRoLnNlYXJjaC5yZXBsYWNlKC9eXFw/LywgXCI/aW5kZXgmXCIpIDogXCI/aW5kZXhcIjtcbiAgfVxuICAvLyBJZiB3ZSdyZSBvcGVyYXRpbmcgd2l0aGluIGEgYmFzZW5hbWUsIHByZXBlbmQgaXQgdG8gdGhlIHBhdGhuYW1lIHByaW9yXG4gIC8vIHRvIGNyZWF0aW5nIHRoZSBmb3JtIGFjdGlvbi4gIElmIHRoaXMgaXMgYSByb290IG5hdmlnYXRpb24sIHRoZW4ganVzdCB1c2VcbiAgLy8gdGhlIHJhdyBiYXNlbmFtZSB3aGljaCBhbGxvd3MgdGhlIGJhc2VuYW1lIHRvIGhhdmUgZnVsbCBjb250cm9sIG92ZXIgdGhlXG4gIC8vIHByZXNlbmNlIG9mIGEgdHJhaWxpbmcgc2xhc2ggb24gcm9vdCBhY3Rpb25zXG4gIGlmIChiYXNlbmFtZSAhPT0gXCIvXCIpIHtcbiAgICBwYXRoLnBhdGhuYW1lID0gcGF0aC5wYXRobmFtZSA9PT0gXCIvXCIgPyBiYXNlbmFtZSA6IGpvaW5QYXRocyhbYmFzZW5hbWUsIHBhdGgucGF0aG5hbWVdKTtcbiAgfVxuICByZXR1cm4gY3JlYXRlUGF0aChwYXRoKTtcbn1cbi8vIFRPRE86ICh2NykgQ2hhbmdlIHRoZSB1c2VGZXRjaGVyIGdlbmVyaWMgZGVmYXVsdCBmcm9tIGBhbnlgIHRvIGB1bmtub3duYFxuLyoqXG4gKiBJbnRlcmFjdHMgd2l0aCByb3V0ZSBsb2FkZXJzIGFuZCBhY3Rpb25zIHdpdGhvdXQgY2F1c2luZyBhIG5hdmlnYXRpb24uIEdyZWF0XG4gKiBmb3IgYW55IGludGVyYWN0aW9uIHRoYXQgc3RheXMgb24gdGhlIHNhbWUgcGFnZS5cbiAqL1xuZnVuY3Rpb24gdXNlRmV0Y2hlcihfdGVtcDMpIHtcbiAgdmFyIF9yb3V0ZSRtYXRjaGVzO1xuICBsZXQge1xuICAgIGtleVxuICB9ID0gX3RlbXAzID09PSB2b2lkIDAgPyB7fSA6IF90ZW1wMztcbiAgbGV0IHtcbiAgICByb3V0ZXJcbiAgfSA9IHVzZURhdGFSb3V0ZXJDb250ZXh0KERhdGFSb3V0ZXJIb29rLlVzZUZldGNoZXIpO1xuICBsZXQgc3RhdGUgPSB1c2VEYXRhUm91dGVyU3RhdGUoRGF0YVJvdXRlclN0YXRlSG9vay5Vc2VGZXRjaGVyKTtcbiAgbGV0IGZldGNoZXJEYXRhID0gUmVhY3QudXNlQ29udGV4dChGZXRjaGVyc0NvbnRleHQpO1xuICBsZXQgcm91dGUgPSBSZWFjdC51c2VDb250ZXh0KFVOU0FGRV9Sb3V0ZUNvbnRleHQpO1xuICBsZXQgcm91dGVJZCA9IChfcm91dGUkbWF0Y2hlcyA9IHJvdXRlLm1hdGNoZXNbcm91dGUubWF0Y2hlcy5sZW5ndGggLSAxXSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9yb3V0ZSRtYXRjaGVzLnJvdXRlLmlkO1xuICAhZmV0Y2hlckRhdGEgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBVTlNBRkVfaW52YXJpYW50KGZhbHNlLCBcInVzZUZldGNoZXIgbXVzdCBiZSB1c2VkIGluc2lkZSBhIEZldGNoZXJzQ29udGV4dFwiKSA6IFVOU0FGRV9pbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICAhcm91dGUgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBVTlNBRkVfaW52YXJpYW50KGZhbHNlLCBcInVzZUZldGNoZXIgbXVzdCBiZSB1c2VkIGluc2lkZSBhIFJvdXRlQ29udGV4dFwiKSA6IFVOU0FGRV9pbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICAhKHJvdXRlSWQgIT0gbnVsbCkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBVTlNBRkVfaW52YXJpYW50KGZhbHNlLCBcInVzZUZldGNoZXIgY2FuIG9ubHkgYmUgdXNlZCBvbiByb3V0ZXMgdGhhdCBjb250YWluIGEgdW5pcXVlIFxcXCJpZFxcXCJcIikgOiBVTlNBRkVfaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgLy8gRmV0Y2hlciBrZXkgaGFuZGxpbmdcbiAgbGV0IFtmZXRjaGVyS2V5LCBzZXRGZXRjaGVyS2V5XSA9IFJlYWN0LnVzZVN0YXRlKGtleSB8fCBcIlwiKTtcbiAgaWYgKGtleSAmJiBrZXkgIT09IGZldGNoZXJLZXkpIHtcbiAgICBzZXRGZXRjaGVyS2V5KGtleSk7XG4gIH0gZWxzZSBpZiAoIWZldGNoZXJLZXkpIHtcbiAgICBzZXRGZXRjaGVyS2V5KGdldFVuaXF1ZUZldGNoZXJJZCgpKTtcbiAgfVxuICAvLyBSZWdpc3RyYXRpb24vY2xlYW51cFxuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIHJvdXRlci5nZXRGZXRjaGVyKGZldGNoZXJLZXkpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAvLyBUZWxsIHRoZSByb3V0ZXIgd2UndmUgdW5tb3VudGVkIC0gaWYgdjdfZmV0Y2hlclBlcnNpc3QgaXMgZW5hYmxlZCB0aGlzXG4gICAgICAvLyB3aWxsIG5vdCBkZWxldGUgaW1tZWRpYXRlbHkgYnV0IGluc3RlYWQgcXVldWUgdXAgYSBkZWxldGUgYWZ0ZXIgdGhlXG4gICAgICAvLyBmZXRjaGVyIHJldHVybnMgdG8gYW4gYGlkbGVgIHN0YXRlXG4gICAgICByb3V0ZXIuZGVsZXRlRmV0Y2hlcihmZXRjaGVyS2V5KTtcbiAgICB9O1xuICB9LCBbcm91dGVyLCBmZXRjaGVyS2V5XSk7XG4gIC8vIEZldGNoZXIgYWRkaXRpb25zXG4gIGxldCBsb2FkID0gUmVhY3QudXNlQ2FsbGJhY2soKGhyZWYsIG9wdHMpID0+IHtcbiAgICAhcm91dGVJZCA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IFVOU0FGRV9pbnZhcmlhbnQoZmFsc2UsIFwiTm8gcm91dGVJZCBhdmFpbGFibGUgZm9yIGZldGNoZXIubG9hZCgpXCIpIDogVU5TQUZFX2ludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG4gICAgcm91dGVyLmZldGNoKGZldGNoZXJLZXksIHJvdXRlSWQsIGhyZWYsIG9wdHMpO1xuICB9LCBbZmV0Y2hlcktleSwgcm91dGVJZCwgcm91dGVyXSk7XG4gIGxldCBzdWJtaXRJbXBsID0gdXNlU3VibWl0KCk7XG4gIGxldCBzdWJtaXQgPSBSZWFjdC51c2VDYWxsYmFjaygodGFyZ2V0LCBvcHRzKSA9PiB7XG4gICAgc3VibWl0SW1wbCh0YXJnZXQsIF9leHRlbmRzKHt9LCBvcHRzLCB7XG4gICAgICBuYXZpZ2F0ZTogZmFsc2UsXG4gICAgICBmZXRjaGVyS2V5XG4gICAgfSkpO1xuICB9LCBbZmV0Y2hlcktleSwgc3VibWl0SW1wbF0pO1xuICBsZXQgRmV0Y2hlckZvcm0gPSBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICBsZXQgRmV0Y2hlckZvcm0gPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigocHJvcHMsIHJlZikgPT4ge1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEZvcm0sIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgICAgICBuYXZpZ2F0ZTogZmFsc2UsXG4gICAgICAgIGZldGNoZXJLZXk6IGZldGNoZXJLZXksXG4gICAgICAgIHJlZjogcmVmXG4gICAgICB9KSk7XG4gICAgfSk7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgRmV0Y2hlckZvcm0uZGlzcGxheU5hbWUgPSBcImZldGNoZXIuRm9ybVwiO1xuICAgIH1cbiAgICByZXR1cm4gRmV0Y2hlckZvcm07XG4gIH0sIFtmZXRjaGVyS2V5XSk7XG4gIC8vIEV4cG9zZWQgRmV0Y2hlcldpdGhDb21wb25lbnRzXG4gIGxldCBmZXRjaGVyID0gc3RhdGUuZmV0Y2hlcnMuZ2V0KGZldGNoZXJLZXkpIHx8IElETEVfRkVUQ0hFUjtcbiAgbGV0IGRhdGEgPSBmZXRjaGVyRGF0YS5nZXQoZmV0Y2hlcktleSk7XG4gIGxldCBmZXRjaGVyV2l0aENvbXBvbmVudHMgPSBSZWFjdC51c2VNZW1vKCgpID0+IF9leHRlbmRzKHtcbiAgICBGb3JtOiBGZXRjaGVyRm9ybSxcbiAgICBzdWJtaXQsXG4gICAgbG9hZFxuICB9LCBmZXRjaGVyLCB7XG4gICAgZGF0YVxuICB9KSwgW0ZldGNoZXJGb3JtLCBzdWJtaXQsIGxvYWQsIGZldGNoZXIsIGRhdGFdKTtcbiAgcmV0dXJuIGZldGNoZXJXaXRoQ29tcG9uZW50cztcbn1cbi8qKlxuICogUHJvdmlkZXMgYWxsIGZldGNoZXJzIGN1cnJlbnRseSBvbiB0aGUgcGFnZS4gVXNlZnVsIGZvciBsYXlvdXRzIGFuZCBwYXJlbnRcbiAqIHJvdXRlcyB0aGF0IG5lZWQgdG8gcHJvdmlkZSBwZW5kaW5nL29wdGltaXN0aWMgVUkgcmVnYXJkaW5nIHRoZSBmZXRjaC5cbiAqL1xuZnVuY3Rpb24gdXNlRmV0Y2hlcnMoKSB7XG4gIGxldCBzdGF0ZSA9IHVzZURhdGFSb3V0ZXJTdGF0ZShEYXRhUm91dGVyU3RhdGVIb29rLlVzZUZldGNoZXJzKTtcbiAgcmV0dXJuIEFycmF5LmZyb20oc3RhdGUuZmV0Y2hlcnMuZW50cmllcygpKS5tYXAoX3JlZjExID0+IHtcbiAgICBsZXQgW2tleSwgZmV0Y2hlcl0gPSBfcmVmMTE7XG4gICAgcmV0dXJuIF9leHRlbmRzKHt9LCBmZXRjaGVyLCB7XG4gICAgICBrZXlcbiAgICB9KTtcbiAgfSk7XG59XG5jb25zdCBTQ1JPTExfUkVTVE9SQVRJT05fU1RPUkFHRV9LRVkgPSBcInJlYWN0LXJvdXRlci1zY3JvbGwtcG9zaXRpb25zXCI7XG5sZXQgc2F2ZWRTY3JvbGxQb3NpdGlvbnMgPSB7fTtcbi8qKlxuICogV2hlbiByZW5kZXJlZCBpbnNpZGUgYSBSb3V0ZXJQcm92aWRlciwgd2lsbCByZXN0b3JlIHNjcm9sbCBwb3NpdGlvbnMgb24gbmF2aWdhdGlvbnNcbiAqL1xuZnVuY3Rpb24gdXNlU2Nyb2xsUmVzdG9yYXRpb24oX3RlbXA0KSB7XG4gIGxldCB7XG4gICAgZ2V0S2V5LFxuICAgIHN0b3JhZ2VLZXlcbiAgfSA9IF90ZW1wNCA9PT0gdm9pZCAwID8ge30gOiBfdGVtcDQ7XG4gIGxldCB7XG4gICAgcm91dGVyXG4gIH0gPSB1c2VEYXRhUm91dGVyQ29udGV4dChEYXRhUm91dGVySG9vay5Vc2VTY3JvbGxSZXN0b3JhdGlvbik7XG4gIGxldCB7XG4gICAgcmVzdG9yZVNjcm9sbFBvc2l0aW9uLFxuICAgIHByZXZlbnRTY3JvbGxSZXNldFxuICB9ID0gdXNlRGF0YVJvdXRlclN0YXRlKERhdGFSb3V0ZXJTdGF0ZUhvb2suVXNlU2Nyb2xsUmVzdG9yYXRpb24pO1xuICBsZXQge1xuICAgIGJhc2VuYW1lXG4gIH0gPSBSZWFjdC51c2VDb250ZXh0KFVOU0FGRV9OYXZpZ2F0aW9uQ29udGV4dCk7XG4gIGxldCBsb2NhdGlvbiA9IHVzZUxvY2F0aW9uKCk7XG4gIGxldCBtYXRjaGVzID0gdXNlTWF0Y2hlcygpO1xuICBsZXQgbmF2aWdhdGlvbiA9IHVzZU5hdmlnYXRpb24oKTtcbiAgLy8gVHJpZ2dlciBtYW51YWwgc2Nyb2xsIHJlc3RvcmF0aW9uIHdoaWxlIHdlJ3JlIGFjdGl2ZVxuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIHdpbmRvdy5oaXN0b3J5LnNjcm9sbFJlc3RvcmF0aW9uID0gXCJtYW51YWxcIjtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgd2luZG93Lmhpc3Rvcnkuc2Nyb2xsUmVzdG9yYXRpb24gPSBcImF1dG9cIjtcbiAgICB9O1xuICB9LCBbXSk7XG4gIC8vIFNhdmUgcG9zaXRpb25zIG9uIHBhZ2VoaWRlXG4gIHVzZVBhZ2VIaWRlKFJlYWN0LnVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBpZiAobmF2aWdhdGlvbi5zdGF0ZSA9PT0gXCJpZGxlXCIpIHtcbiAgICAgIGxldCBrZXkgPSAoZ2V0S2V5ID8gZ2V0S2V5KGxvY2F0aW9uLCBtYXRjaGVzKSA6IG51bGwpIHx8IGxvY2F0aW9uLmtleTtcbiAgICAgIHNhdmVkU2Nyb2xsUG9zaXRpb25zW2tleV0gPSB3aW5kb3cuc2Nyb2xsWTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oc3RvcmFnZUtleSB8fCBTQ1JPTExfUkVTVE9SQVRJT05fU1RPUkFHRV9LRVksIEpTT04uc3RyaW5naWZ5KHNhdmVkU2Nyb2xsUG9zaXRpb25zKSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IFVOU0FGRV93YXJuaW5nKGZhbHNlLCBcIkZhaWxlZCB0byBzYXZlIHNjcm9sbCBwb3NpdGlvbnMgaW4gc2Vzc2lvblN0b3JhZ2UsIDxTY3JvbGxSZXN0b3JhdGlvbiAvPiB3aWxsIG5vdCB3b3JrIHByb3Blcmx5IChcIiArIGVycm9yICsgXCIpLlwiKSA6IHZvaWQgMDtcbiAgICB9XG4gICAgd2luZG93Lmhpc3Rvcnkuc2Nyb2xsUmVzdG9yYXRpb24gPSBcImF1dG9cIjtcbiAgfSwgW3N0b3JhZ2VLZXksIGdldEtleSwgbmF2aWdhdGlvbi5zdGF0ZSwgbG9jYXRpb24sIG1hdGNoZXNdKSk7XG4gIC8vIFJlYWQgaW4gYW55IHNhdmVkIHNjcm9sbCBsb2NhdGlvbnNcbiAgaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9ydWxlcy1vZi1ob29rc1xuICAgIFJlYWN0LnVzZUxheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBsZXQgc2Vzc2lvblBvc2l0aW9ucyA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oc3RvcmFnZUtleSB8fCBTQ1JPTExfUkVTVE9SQVRJT05fU1RPUkFHRV9LRVkpO1xuICAgICAgICBpZiAoc2Vzc2lvblBvc2l0aW9ucykge1xuICAgICAgICAgIHNhdmVkU2Nyb2xsUG9zaXRpb25zID0gSlNPTi5wYXJzZShzZXNzaW9uUG9zaXRpb25zKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBuby1vcCwgdXNlIGRlZmF1bHQgZW1wdHkgb2JqZWN0XG4gICAgICB9XG4gICAgfSwgW3N0b3JhZ2VLZXldKTtcbiAgICAvLyBFbmFibGUgc2Nyb2xsIHJlc3RvcmF0aW9uIGluIHRoZSByb3V0ZXJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvcnVsZXMtb2YtaG9va3NcbiAgICBSZWFjdC51c2VMYXlvdXRFZmZlY3QoKCkgPT4ge1xuICAgICAgbGV0IGdldEtleVdpdGhvdXRCYXNlbmFtZSA9IGdldEtleSAmJiBiYXNlbmFtZSAhPT0gXCIvXCIgPyAobG9jYXRpb24sIG1hdGNoZXMpID0+IGdldEtleSggLy8gU3RyaXAgdGhlIGJhc2VuYW1lIHRvIG1hdGNoIHVzZUxvY2F0aW9uKClcbiAgICAgIF9leHRlbmRzKHt9LCBsb2NhdGlvbiwge1xuICAgICAgICBwYXRobmFtZTogc3RyaXBCYXNlbmFtZShsb2NhdGlvbi5wYXRobmFtZSwgYmFzZW5hbWUpIHx8IGxvY2F0aW9uLnBhdGhuYW1lXG4gICAgICB9KSwgbWF0Y2hlcykgOiBnZXRLZXk7XG4gICAgICBsZXQgZGlzYWJsZVNjcm9sbFJlc3RvcmF0aW9uID0gcm91dGVyID09IG51bGwgPyB2b2lkIDAgOiByb3V0ZXIuZW5hYmxlU2Nyb2xsUmVzdG9yYXRpb24oc2F2ZWRTY3JvbGxQb3NpdGlvbnMsICgpID0+IHdpbmRvdy5zY3JvbGxZLCBnZXRLZXlXaXRob3V0QmFzZW5hbWUpO1xuICAgICAgcmV0dXJuICgpID0+IGRpc2FibGVTY3JvbGxSZXN0b3JhdGlvbiAmJiBkaXNhYmxlU2Nyb2xsUmVzdG9yYXRpb24oKTtcbiAgICB9LCBbcm91dGVyLCBiYXNlbmFtZSwgZ2V0S2V5XSk7XG4gICAgLy8gUmVzdG9yZSBzY3JvbGxpbmcgd2hlbiBzdGF0ZS5yZXN0b3JlU2Nyb2xsUG9zaXRpb24gY2hhbmdlc1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9ydWxlcy1vZi1ob29rc1xuICAgIFJlYWN0LnVzZUxheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgICAvLyBFeHBsaWNpdCBmYWxzZSBtZWFucyBkb24ndCBkbyBhbnl0aGluZyAodXNlZCBmb3Igc3VibWlzc2lvbnMpXG4gICAgICBpZiAocmVzdG9yZVNjcm9sbFBvc2l0aW9uID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBiZWVuIGhlcmUgYmVmb3JlLCBzY3JvbGwgdG8gaXRcbiAgICAgIGlmICh0eXBlb2YgcmVzdG9yZVNjcm9sbFBvc2l0aW9uID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIHdpbmRvdy5zY3JvbGxUbygwLCByZXN0b3JlU2Nyb2xsUG9zaXRpb24pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyB0cnkgdG8gc2Nyb2xsIHRvIHRoZSBoYXNoXG4gICAgICBpZiAobG9jYXRpb24uaGFzaCkge1xuICAgICAgICBsZXQgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkZWNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaGFzaC5zbGljZSgxKSkpO1xuICAgICAgICBpZiAoZWwpIHtcbiAgICAgICAgICBlbC5zY3JvbGxJbnRvVmlldygpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gRG9uJ3QgcmVzZXQgaWYgdGhpcyBuYXZpZ2F0aW9uIG9wdGVkIG91dFxuICAgICAgaWYgKHByZXZlbnRTY3JvbGxSZXNldCA9PT0gdHJ1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBvdGhlcndpc2UgZ28gdG8gdGhlIHRvcCBvbiBuZXcgbG9jYXRpb25zXG4gICAgICB3aW5kb3cuc2Nyb2xsVG8oMCwgMCk7XG4gICAgfSwgW2xvY2F0aW9uLCByZXN0b3JlU2Nyb2xsUG9zaXRpb24sIHByZXZlbnRTY3JvbGxSZXNldF0pO1xuICB9XG59XG4vKipcbiAqIFNldHVwIGEgY2FsbGJhY2sgdG8gYmUgZmlyZWQgb24gdGhlIHdpbmRvdydzIGBiZWZvcmV1bmxvYWRgIGV2ZW50LiBUaGlzIGlzXG4gKiB1c2VmdWwgZm9yIHNhdmluZyBzb21lIGRhdGEgdG8gYHdpbmRvdy5sb2NhbFN0b3JhZ2VgIGp1c3QgYmVmb3JlIHRoZSBwYWdlXG4gKiByZWZyZXNoZXMuXG4gKlxuICogTm90ZTogVGhlIGBjYWxsYmFja2AgYXJndW1lbnQgc2hvdWxkIGJlIGEgZnVuY3Rpb24gY3JlYXRlZCB3aXRoXG4gKiBgUmVhY3QudXNlQ2FsbGJhY2soKWAuXG4gKi9cbmZ1bmN0aW9uIHVzZUJlZm9yZVVubG9hZChjYWxsYmFjaywgb3B0aW9ucykge1xuICBsZXQge1xuICAgIGNhcHR1cmVcbiAgfSA9IG9wdGlvbnMgfHwge307XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgbGV0IG9wdHMgPSBjYXB0dXJlICE9IG51bGwgPyB7XG4gICAgICBjYXB0dXJlXG4gICAgfSA6IHVuZGVmaW5lZDtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImJlZm9yZXVubG9hZFwiLCBjYWxsYmFjaywgb3B0cyk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwiYmVmb3JldW5sb2FkXCIsIGNhbGxiYWNrLCBvcHRzKTtcbiAgICB9O1xuICB9LCBbY2FsbGJhY2ssIGNhcHR1cmVdKTtcbn1cbi8qKlxuICogU2V0dXAgYSBjYWxsYmFjayB0byBiZSBmaXJlZCBvbiB0aGUgd2luZG93J3MgYHBhZ2VoaWRlYCBldmVudC4gVGhpcyBpc1xuICogdXNlZnVsIGZvciBzYXZpbmcgc29tZSBkYXRhIHRvIGB3aW5kb3cubG9jYWxTdG9yYWdlYCBqdXN0IGJlZm9yZSB0aGUgcGFnZVxuICogcmVmcmVzaGVzLiAgVGhpcyBldmVudCBpcyBiZXR0ZXIgc3VwcG9ydGVkIHRoYW4gYmVmb3JldW5sb2FkIGFjcm9zcyBicm93c2Vycy5cbiAqXG4gKiBOb3RlOiBUaGUgYGNhbGxiYWNrYCBhcmd1bWVudCBzaG91bGQgYmUgYSBmdW5jdGlvbiBjcmVhdGVkIHdpdGhcbiAqIGBSZWFjdC51c2VDYWxsYmFjaygpYC5cbiAqL1xuZnVuY3Rpb24gdXNlUGFnZUhpZGUoY2FsbGJhY2ssIG9wdGlvbnMpIHtcbiAgbGV0IHtcbiAgICBjYXB0dXJlXG4gIH0gPSBvcHRpb25zIHx8IHt9O1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGxldCBvcHRzID0gY2FwdHVyZSAhPSBudWxsID8ge1xuICAgICAgY2FwdHVyZVxuICAgIH0gOiB1bmRlZmluZWQ7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwYWdlaGlkZVwiLCBjYWxsYmFjaywgb3B0cyk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicGFnZWhpZGVcIiwgY2FsbGJhY2ssIG9wdHMpO1xuICAgIH07XG4gIH0sIFtjYWxsYmFjaywgY2FwdHVyZV0pO1xufVxuLyoqXG4gKiBXcmFwcGVyIGFyb3VuZCB1c2VCbG9ja2VyIHRvIHNob3cgYSB3aW5kb3cuY29uZmlybSBwcm9tcHQgdG8gdXNlcnMgaW5zdGVhZFxuICogb2YgYnVpbGRpbmcgYSBjdXN0b20gVUkgd2l0aCB1c2VCbG9ja2VyLlxuICpcbiAqIFdhcm5pbmc6IFRoaXMgaGFzICphIGxvdCBvZiByb3VnaCBlZGdlcyogYW5kIGJlaGF2ZXMgdmVyeSBkaWZmZXJlbnRseSAoYW5kXG4gKiB2ZXJ5IGluY29ycmVjdGx5IGluIHNvbWUgY2FzZXMpIGFjcm9zcyBicm93c2VycyBpZiB1c2VyIGNsaWNrIGFkZGl0aW9uXG4gKiBiYWNrL2ZvcndhcmQgbmF2aWdhdGlvbnMgd2hpbGUgdGhlIGNvbmZpcm0gaXMgb3Blbi4gIFVzZSBhdCB5b3VyIG93biByaXNrLlxuICovXG5mdW5jdGlvbiB1c2VQcm9tcHQoX3JlZjEyKSB7XG4gIGxldCB7XG4gICAgd2hlbixcbiAgICBtZXNzYWdlXG4gIH0gPSBfcmVmMTI7XG4gIGxldCBibG9ja2VyID0gdXNlQmxvY2tlcih3aGVuKTtcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoYmxvY2tlci5zdGF0ZSA9PT0gXCJibG9ja2VkXCIpIHtcbiAgICAgIGxldCBwcm9jZWVkID0gd2luZG93LmNvbmZpcm0obWVzc2FnZSk7XG4gICAgICBpZiAocHJvY2VlZCkge1xuICAgICAgICAvLyBUaGlzIHRpbWVvdXQgaXMgbmVlZGVkIHRvIGF2b2lkIGEgd2VpcmQgXCJyYWNlXCIgb24gUE9QIG5hdmlnYXRpb25zXG4gICAgICAgIC8vIGJldHdlZW4gdGhlIGB3aW5kb3cuaGlzdG9yeWAgcmV2ZXJ0IG5hdmlnYXRpb24gYW5kIHRoZSByZXN1bHQgb2ZcbiAgICAgICAgLy8gYHdpbmRvdy5jb25maXJtYFxuICAgICAgICBzZXRUaW1lb3V0KGJsb2NrZXIucHJvY2VlZCwgMCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBibG9ja2VyLnJlc2V0KCk7XG4gICAgICB9XG4gICAgfVxuICB9LCBbYmxvY2tlciwgbWVzc2FnZV0pO1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChibG9ja2VyLnN0YXRlID09PSBcImJsb2NrZWRcIiAmJiAhd2hlbikge1xuICAgICAgYmxvY2tlci5yZXNldCgpO1xuICAgIH1cbiAgfSwgW2Jsb2NrZXIsIHdoZW5dKTtcbn1cbi8qKlxuICogUmV0dXJuIGEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoZXJlIGlzIGFuIGFjdGl2ZSB2aWV3IHRyYW5zaXRpb24gdG8gdGhlXG4gKiBnaXZlbiBocmVmLiAgWW91IGNhbiB1c2UgdGhpcyB2YWx1ZSB0byByZW5kZXIgQ1NTIGNsYXNzZXMgb3Igdmlld1RyYW5zaXRpb25OYW1lXG4gKiBzdHlsZXMgb250byB5b3VyIGVsZW1lbnRzXG4gKlxuICogQHBhcmFtIGhyZWYgVGhlIGRlc3RpbmF0aW9uIGhyZWZcbiAqIEBwYXJhbSBbb3B0cy5yZWxhdGl2ZV0gUmVsYXRpdmUgcm91dGluZyB0eXBlIChcInJvdXRlXCIgfCBcInBhdGhcIilcbiAqL1xuZnVuY3Rpb24gdXNlVmlld1RyYW5zaXRpb25TdGF0ZSh0bywgb3B0cykge1xuICBpZiAob3B0cyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0cyA9IHt9O1xuICB9XG4gIGxldCB2dENvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KFZpZXdUcmFuc2l0aW9uQ29udGV4dCk7XG4gICEodnRDb250ZXh0ICE9IG51bGwpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gVU5TQUZFX2ludmFyaWFudChmYWxzZSwgXCJgdW5zdGFibGVfdXNlVmlld1RyYW5zaXRpb25TdGF0ZWAgbXVzdCBiZSB1c2VkIHdpdGhpbiBgcmVhY3Qtcm91dGVyLWRvbWAncyBgUm91dGVyUHJvdmlkZXJgLiAgXCIgKyBcIkRpZCB5b3UgYWNjaWRlbnRhbGx5IGltcG9ydCBgUm91dGVyUHJvdmlkZXJgIGZyb20gYHJlYWN0LXJvdXRlcmA/XCIpIDogVU5TQUZFX2ludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG4gIGxldCB7XG4gICAgYmFzZW5hbWVcbiAgfSA9IHVzZURhdGFSb3V0ZXJDb250ZXh0KERhdGFSb3V0ZXJIb29rLnVzZVZpZXdUcmFuc2l0aW9uU3RhdGUpO1xuICBsZXQgcGF0aCA9IHVzZVJlc29sdmVkUGF0aCh0bywge1xuICAgIHJlbGF0aXZlOiBvcHRzLnJlbGF0aXZlXG4gIH0pO1xuICBpZiAoIXZ0Q29udGV4dC5pc1RyYW5zaXRpb25pbmcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgbGV0IGN1cnJlbnRQYXRoID0gc3RyaXBCYXNlbmFtZSh2dENvbnRleHQuY3VycmVudExvY2F0aW9uLnBhdGhuYW1lLCBiYXNlbmFtZSkgfHwgdnRDb250ZXh0LmN1cnJlbnRMb2NhdGlvbi5wYXRobmFtZTtcbiAgbGV0IG5leHRQYXRoID0gc3RyaXBCYXNlbmFtZSh2dENvbnRleHQubmV4dExvY2F0aW9uLnBhdGhuYW1lLCBiYXNlbmFtZSkgfHwgdnRDb250ZXh0Lm5leHRMb2NhdGlvbi5wYXRobmFtZTtcbiAgLy8gVHJhbnNpdGlvbiBpcyBhY3RpdmUgaWYgd2UncmUgZ29pbmcgdG8gb3IgY29taW5nIGZyb20gdGhlIGluZGljYXRlZFxuICAvLyBkZXN0aW5hdGlvbi4gIFRoaXMgZW5zdXJlcyB0aGF0IG90aGVyIFBVU0ggbmF2aWdhdGlvbnMgdGhhdCByZXZlcnNlXG4gIC8vIGFuIGluZGljYXRlZCB0cmFuc2l0aW9uIGFwcGx5LiAgSS5lLiwgb24gdGhlIGxpc3QgdmlldyB5b3UgaGF2ZTpcbiAgLy9cbiAgLy8gICA8TmF2TGluayB0bz1cIi9kZXRhaWxzLzFcIiB1bnN0YWJsZV92aWV3VHJhbnNpdGlvbj5cbiAgLy9cbiAgLy8gSWYgeW91IGNsaWNrIHRoZSBicmVhZGNydW1iIGJhY2sgdG8gdGhlIGxpc3QgdmlldzpcbiAgLy9cbiAgLy8gICA8TmF2TGluayB0bz1cIi9saXN0XCIgdW5zdGFibGVfdmlld1RyYW5zaXRpb24+XG4gIC8vXG4gIC8vIFdlIHNob3VsZCBhcHBseSB0aGUgdHJhbnNpdGlvbiBiZWNhdXNlIGl0J3MgaW5kaWNhdGVkIGFzIGFjdGl2ZSBnb2luZ1xuICAvLyBmcm9tIC9saXN0IC0+IC9kZXRhaWxzLzEgYW5kIHRoZXJlZm9yZSBzaG91bGQgYmUgYWN0aXZlIG9uIHRoZSByZXZlcnNlXG4gIC8vIChldmVuIHRob3VnaCB0aGlzIGlzbid0IHN0cmljdGx5IGEgUE9QIHJldmVyc2UpXG4gIHJldHVybiBtYXRjaFBhdGgocGF0aC5wYXRobmFtZSwgbmV4dFBhdGgpICE9IG51bGwgfHwgbWF0Y2hQYXRoKHBhdGgucGF0aG5hbWUsIGN1cnJlbnRQYXRoKSAhPSBudWxsO1xufVxuLy8jZW5kcmVnaW9uXG5cbmV4cG9ydCB7IEJyb3dzZXJSb3V0ZXIsIEZvcm0sIEhhc2hSb3V0ZXIsIExpbmssIE5hdkxpbmssIFJvdXRlclByb3ZpZGVyLCBTY3JvbGxSZXN0b3JhdGlvbiwgRmV0Y2hlcnNDb250ZXh0IGFzIFVOU0FGRV9GZXRjaGVyc0NvbnRleHQsIFZpZXdUcmFuc2l0aW9uQ29udGV4dCBhcyBVTlNBRkVfVmlld1RyYW5zaXRpb25Db250ZXh0LCB1c2VTY3JvbGxSZXN0b3JhdGlvbiBhcyBVTlNBRkVfdXNlU2Nyb2xsUmVzdG9yYXRpb24sIGNyZWF0ZUJyb3dzZXJSb3V0ZXIsIGNyZWF0ZUhhc2hSb3V0ZXIsIGNyZWF0ZVNlYXJjaFBhcmFtcywgSGlzdG9yeVJvdXRlciBhcyB1bnN0YWJsZV9IaXN0b3J5Um91dGVyLCB1c2VQcm9tcHQgYXMgdW5zdGFibGVfdXNlUHJvbXB0LCB1c2VWaWV3VHJhbnNpdGlvblN0YXRlIGFzIHVuc3RhYmxlX3VzZVZpZXdUcmFuc2l0aW9uU3RhdGUsIHVzZUJlZm9yZVVubG9hZCwgdXNlRmV0Y2hlciwgdXNlRmV0Y2hlcnMsIHVzZUZvcm1BY3Rpb24sIHVzZUxpbmtDbGlja0hhbmRsZXIsIHVzZVNlYXJjaFBhcmFtcywgdXNlU3VibWl0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXBcbiIsIlxuICAgICAgaW1wb3J0IEFQSSBmcm9tIFwiIS4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgaW1wb3J0IGRvbUFQSSBmcm9tIFwiIS4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0Rm4gZnJvbSBcIiEuLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzXCI7XG4gICAgICBpbXBvcnQgc2V0QXR0cmlidXRlcyBmcm9tIFwiIS4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydFN0eWxlRWxlbWVudCBmcm9tIFwiIS4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qc1wiO1xuICAgICAgaW1wb3J0IHN0eWxlVGFnVHJhbnNmb3JtRm4gZnJvbSBcIiEuLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qc1wiO1xuICAgICAgaW1wb3J0IGNvbnRlbnQsICogYXMgbmFtZWRFeHBvcnQgZnJvbSBcIiEhLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi4vbm9kZV9tb2R1bGVzL3Nhc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vaW5kZXguc2Nzc1wiO1xuICAgICAgXG4gICAgICBcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5zdHlsZVRhZ1RyYW5zZm9ybSA9IHN0eWxlVGFnVHJhbnNmb3JtRm47XG5vcHRpb25zLnNldEF0dHJpYnV0ZXMgPSBzZXRBdHRyaWJ1dGVzO1xuXG4gICAgICBvcHRpb25zLmluc2VydCA9IGluc2VydEZuLmJpbmQobnVsbCwgXCJoZWFkXCIpO1xuICAgIFxub3B0aW9ucy5kb21BUEkgPSBkb21BUEk7XG5vcHRpb25zLmluc2VydFN0eWxlRWxlbWVudCA9IGluc2VydFN0eWxlRWxlbWVudDtcblxudmFyIHVwZGF0ZSA9IEFQSShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCAqIGZyb20gXCIhIS4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4uL25vZGVfbW9kdWxlcy9zYXNzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL2luZGV4LnNjc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5jb25zdCBTZWxlY3RhYmxlQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KG51bGwpO1xuZXhwb3J0IGNvbnN0IG1ha2VFdmVudEtleSA9IChldmVudEtleSwgaHJlZiA9IG51bGwpID0+IHtcbiAgaWYgKGV2ZW50S2V5ICE9IG51bGwpIHJldHVybiBTdHJpbmcoZXZlbnRLZXkpO1xuICByZXR1cm4gaHJlZiB8fCBudWxsO1xufTtcbmV4cG9ydCBkZWZhdWx0IFNlbGVjdGFibGVDb250ZXh0OyIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9leHRlbmRzKCkge1xuICBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gPyBPYmplY3QuYXNzaWduLmJpbmQoKSA6IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHtcbiAgICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXQ7XG4gIH07XG4gIHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpIHtcbiAgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307XG4gIHZhciB0YXJnZXQgPSB7fTtcbiAgdmFyIHNvdXJjZUtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpO1xuICB2YXIga2V5LCBpO1xuICBmb3IgKGkgPSAwOyBpIDwgc291cmNlS2V5cy5sZW5ndGg7IGkrKykge1xuICAgIGtleSA9IHNvdXJjZUtleXNbaV07XG4gICAgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTtcbiAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICB9XG4gIHJldHVybiB0YXJnZXQ7XG59IiwiaW1wb3J0IGludmFyaWFudCBmcm9tICdpbnZhcmlhbnQnO1xuXG52YXIgbm9vcCA9IGZ1bmN0aW9uIG5vb3AoKSB7fTtcblxuZnVuY3Rpb24gcmVhZE9ubHlQcm9wVHlwZShoYW5kbGVyLCBuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbiAocHJvcHMsIHByb3BOYW1lKSB7XG4gICAgaWYgKHByb3BzW3Byb3BOYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoIXByb3BzW2hhbmRsZXJdKSB7XG4gICAgICAgIHJldHVybiBuZXcgRXJyb3IoXCJZb3UgaGF2ZSBwcm92aWRlZCBhIGBcIiArIHByb3BOYW1lICsgXCJgIHByb3AgdG8gYFwiICsgbmFtZSArIFwiYCBcIiArIChcIndpdGhvdXQgYW4gYFwiICsgaGFuZGxlciArIFwiYCBoYW5kbGVyIHByb3AuIFRoaXMgd2lsbCByZW5kZXIgYSByZWFkLW9ubHkgZmllbGQuIFwiKSArIChcIklmIHRoZSBmaWVsZCBzaG91bGQgYmUgbXV0YWJsZSB1c2UgYFwiICsgZGVmYXVsdEtleShwcm9wTmFtZSkgKyBcImAuIFwiKSArIChcIk90aGVyd2lzZSwgc2V0IGBcIiArIGhhbmRsZXIgKyBcImAuXCIpKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1bmNvbnRyb2xsZWRQcm9wVHlwZXMoY29udHJvbGxlZFZhbHVlcywgZGlzcGxheU5hbWUpIHtcbiAgdmFyIHByb3BUeXBlcyA9IHt9O1xuICBPYmplY3Qua2V5cyhjb250cm9sbGVkVmFsdWVzKS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgLy8gYWRkIGRlZmF1bHQgcHJvcFR5cGVzIGZvciBmb2xrcyB0aGF0IHVzZSBydW50aW1lIGNoZWNrc1xuICAgIHByb3BUeXBlc1tkZWZhdWx0S2V5KHByb3ApXSA9IG5vb3A7XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgdmFyIGhhbmRsZXIgPSBjb250cm9sbGVkVmFsdWVzW3Byb3BdO1xuICAgICAgISh0eXBlb2YgaGFuZGxlciA9PT0gJ3N0cmluZycgJiYgaGFuZGxlci50cmltKCkubGVuZ3RoKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IGludmFyaWFudChmYWxzZSwgJ1VuY29udHJvbGxhYmxlIC0gWyVzXTogdGhlIHByb3AgYCVzYCBuZWVkcyBhIHZhbGlkIGhhbmRsZXIga2V5IG5hbWUgaW4gb3JkZXIgdG8gbWFrZSBpdCB1bmNvbnRyb2xsYWJsZScsIGRpc3BsYXlOYW1lLCBwcm9wKSA6IGludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG4gICAgICBwcm9wVHlwZXNbcHJvcF0gPSByZWFkT25seVByb3BUeXBlKGhhbmRsZXIsIGRpc3BsYXlOYW1lKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcHJvcFR5cGVzO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzUHJvcChwcm9wcywgcHJvcCkge1xuICByZXR1cm4gcHJvcHNbcHJvcF0gIT09IHVuZGVmaW5lZDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBkZWZhdWx0S2V5KGtleSkge1xuICByZXR1cm4gJ2RlZmF1bHQnICsga2V5LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsga2V5LnN1YnN0cigxKTtcbn1cbi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY2FuQWNjZXB0UmVmKGNvbXBvbmVudCkge1xuICByZXR1cm4gISFjb21wb25lbnQgJiYgKHR5cGVvZiBjb21wb25lbnQgIT09ICdmdW5jdGlvbicgfHwgY29tcG9uZW50LnByb3RvdHlwZSAmJiBjb21wb25lbnQucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQpO1xufSIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlXCI7XG5cbmZ1bmN0aW9uIF90b1Byb3BlcnR5S2V5KGFyZykgeyB2YXIga2V5ID0gX3RvUHJpbWl0aXZlKGFyZywgXCJzdHJpbmdcIik7IHJldHVybiB0eXBlb2Yga2V5ID09PSBcInN5bWJvbFwiID8ga2V5IDogU3RyaW5nKGtleSk7IH1cblxuZnVuY3Rpb24gX3RvUHJpbWl0aXZlKGlucHV0LCBoaW50KSB7IGlmICh0eXBlb2YgaW5wdXQgIT09IFwib2JqZWN0XCIgfHwgaW5wdXQgPT09IG51bGwpIHJldHVybiBpbnB1dDsgdmFyIHByaW0gPSBpbnB1dFtTeW1ib2wudG9QcmltaXRpdmVdOyBpZiAocHJpbSAhPT0gdW5kZWZpbmVkKSB7IHZhciByZXMgPSBwcmltLmNhbGwoaW5wdXQsIGhpbnQgfHwgXCJkZWZhdWx0XCIpOyBpZiAodHlwZW9mIHJlcyAhPT0gXCJvYmplY3RcIikgcmV0dXJuIHJlczsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuXCIpOyB9IHJldHVybiAoaGludCA9PT0gXCJzdHJpbmdcIiA/IFN0cmluZyA6IE51bWJlcikoaW5wdXQpOyB9XG5cbmltcG9ydCB7IHVzZUNhbGxiYWNrLCB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0ICogYXMgVXRpbHMgZnJvbSAnLi91dGlscyc7XG5cbmZ1bmN0aW9uIHVzZVVuY29udHJvbGxlZFByb3AocHJvcFZhbHVlLCBkZWZhdWx0VmFsdWUsIGhhbmRsZXIpIHtcbiAgdmFyIHdhc1Byb3BSZWYgPSB1c2VSZWYocHJvcFZhbHVlICE9PSB1bmRlZmluZWQpO1xuXG4gIHZhciBfdXNlU3RhdGUgPSB1c2VTdGF0ZShkZWZhdWx0VmFsdWUpLFxuICAgICAgc3RhdGVWYWx1ZSA9IF91c2VTdGF0ZVswXSxcbiAgICAgIHNldFN0YXRlID0gX3VzZVN0YXRlWzFdO1xuXG4gIHZhciBpc1Byb3AgPSBwcm9wVmFsdWUgIT09IHVuZGVmaW5lZDtcbiAgdmFyIHdhc1Byb3AgPSB3YXNQcm9wUmVmLmN1cnJlbnQ7XG4gIHdhc1Byb3BSZWYuY3VycmVudCA9IGlzUHJvcDtcbiAgLyoqXG4gICAqIElmIGEgcHJvcCBzd2l0Y2hlcyBmcm9tIGNvbnRyb2xsZWQgdG8gVW5jb250cm9sbGVkXG4gICAqIHJlc2V0IGl0cyB2YWx1ZSB0byB0aGUgZGVmYXVsdFZhbHVlXG4gICAqL1xuXG4gIGlmICghaXNQcm9wICYmIHdhc1Byb3AgJiYgc3RhdGVWYWx1ZSAhPT0gZGVmYXVsdFZhbHVlKSB7XG4gICAgc2V0U3RhdGUoZGVmYXVsdFZhbHVlKTtcbiAgfVxuXG4gIHJldHVybiBbaXNQcm9wID8gcHJvcFZhbHVlIDogc3RhdGVWYWx1ZSwgdXNlQ2FsbGJhY2soZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgaWYgKGhhbmRsZXIpIGhhbmRsZXIuYXBwbHkodm9pZCAwLCBbdmFsdWVdLmNvbmNhdChhcmdzKSk7XG4gICAgc2V0U3RhdGUodmFsdWUpO1xuICB9LCBbaGFuZGxlcl0pXTtcbn1cblxuZXhwb3J0IHsgdXNlVW5jb250cm9sbGVkUHJvcCB9O1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlVW5jb250cm9sbGVkKHByb3BzLCBjb25maWcpIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKGNvbmZpZykucmVkdWNlKGZ1bmN0aW9uIChyZXN1bHQsIGZpZWxkTmFtZSkge1xuICAgIHZhciBfZXh0ZW5kczI7XG5cbiAgICB2YXIgX3JlZiA9IHJlc3VsdCxcbiAgICAgICAgZGVmYXVsdFZhbHVlID0gX3JlZltVdGlscy5kZWZhdWx0S2V5KGZpZWxkTmFtZSldLFxuICAgICAgICBwcm9wc1ZhbHVlID0gX3JlZltmaWVsZE5hbWVdLFxuICAgICAgICByZXN0ID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UoX3JlZiwgW1V0aWxzLmRlZmF1bHRLZXkoZmllbGROYW1lKSwgZmllbGROYW1lXS5tYXAoX3RvUHJvcGVydHlLZXkpKTtcblxuICAgIHZhciBoYW5kbGVyTmFtZSA9IGNvbmZpZ1tmaWVsZE5hbWVdO1xuXG4gICAgdmFyIF91c2VVbmNvbnRyb2xsZWRQcm9wID0gdXNlVW5jb250cm9sbGVkUHJvcChwcm9wc1ZhbHVlLCBkZWZhdWx0VmFsdWUsIHByb3BzW2hhbmRsZXJOYW1lXSksXG4gICAgICAgIHZhbHVlID0gX3VzZVVuY29udHJvbGxlZFByb3BbMF0sXG4gICAgICAgIGhhbmRsZXIgPSBfdXNlVW5jb250cm9sbGVkUHJvcFsxXTtcblxuICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgcmVzdCwgKF9leHRlbmRzMiA9IHt9LCBfZXh0ZW5kczJbZmllbGROYW1lXSA9IHZhbHVlLCBfZXh0ZW5kczJbaGFuZGxlck5hbWVdID0gaGFuZGxlciwgX2V4dGVuZHMyKSk7XG4gIH0sIHByb3BzKTtcbn0iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbmZ1bmN0aW9uIGNvbXBvbmVudFdpbGxNb3VudCgpIHtcbiAgLy8gQ2FsbCB0aGlzLmNvbnN0cnVjdG9yLmdEU0ZQIHRvIHN1cHBvcnQgc3ViLWNsYXNzZXMuXG4gIHZhciBzdGF0ZSA9IHRoaXMuY29uc3RydWN0b3IuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKHRoaXMucHJvcHMsIHRoaXMuc3RhdGUpO1xuICBpZiAoc3RhdGUgIT09IG51bGwgJiYgc3RhdGUgIT09IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuc2V0U3RhdGUoc3RhdGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzKSB7XG4gIC8vIENhbGwgdGhpcy5jb25zdHJ1Y3Rvci5nRFNGUCB0byBzdXBwb3J0IHN1Yi1jbGFzc2VzLlxuICAvLyBVc2UgdGhlIHNldFN0YXRlKCkgdXBkYXRlciB0byBlbnN1cmUgc3RhdGUgaXNuJ3Qgc3RhbGUgaW4gY2VydGFpbiBlZGdlIGNhc2VzLlxuICBmdW5jdGlvbiB1cGRhdGVyKHByZXZTdGF0ZSkge1xuICAgIHZhciBzdGF0ZSA9IHRoaXMuY29uc3RydWN0b3IuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKG5leHRQcm9wcywgcHJldlN0YXRlKTtcbiAgICByZXR1cm4gc3RhdGUgIT09IG51bGwgJiYgc3RhdGUgIT09IHVuZGVmaW5lZCA/IHN0YXRlIDogbnVsbDtcbiAgfVxuICAvLyBCaW5kaW5nIFwidGhpc1wiIGlzIGltcG9ydGFudCBmb3Igc2hhbGxvdyByZW5kZXJlciBzdXBwb3J0LlxuICB0aGlzLnNldFN0YXRlKHVwZGF0ZXIuYmluZCh0aGlzKSk7XG59XG5cbmZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVcGRhdGUobmV4dFByb3BzLCBuZXh0U3RhdGUpIHtcbiAgdHJ5IHtcbiAgICB2YXIgcHJldlByb3BzID0gdGhpcy5wcm9wcztcbiAgICB2YXIgcHJldlN0YXRlID0gdGhpcy5zdGF0ZTtcbiAgICB0aGlzLnByb3BzID0gbmV4dFByb3BzO1xuICAgIHRoaXMuc3RhdGUgPSBuZXh0U3RhdGU7XG4gICAgdGhpcy5fX3JlYWN0SW50ZXJuYWxTbmFwc2hvdEZsYWcgPSB0cnVlO1xuICAgIHRoaXMuX19yZWFjdEludGVybmFsU25hcHNob3QgPSB0aGlzLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlKFxuICAgICAgcHJldlByb3BzLFxuICAgICAgcHJldlN0YXRlXG4gICAgKTtcbiAgfSBmaW5hbGx5IHtcbiAgICB0aGlzLnByb3BzID0gcHJldlByb3BzO1xuICAgIHRoaXMuc3RhdGUgPSBwcmV2U3RhdGU7XG4gIH1cbn1cblxuLy8gUmVhY3QgbWF5IHdhcm4gYWJvdXQgY1dNL2NXUlAvY1dVIG1ldGhvZHMgYmVpbmcgZGVwcmVjYXRlZC5cbi8vIEFkZCBhIGZsYWcgdG8gc3VwcHJlc3MgdGhlc2Ugd2FybmluZ3MgZm9yIHRoaXMgc3BlY2lhbCBjYXNlLlxuY29tcG9uZW50V2lsbE1vdW50Ll9fc3VwcHJlc3NEZXByZWNhdGlvbldhcm5pbmcgPSB0cnVlO1xuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcy5fX3N1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5nID0gdHJ1ZTtcbmNvbXBvbmVudFdpbGxVcGRhdGUuX19zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZyA9IHRydWU7XG5cbmZ1bmN0aW9uIHBvbHlmaWxsKENvbXBvbmVudCkge1xuICB2YXIgcHJvdG90eXBlID0gQ29tcG9uZW50LnByb3RvdHlwZTtcblxuICBpZiAoIXByb3RvdHlwZSB8fCAhcHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhbiBvbmx5IHBvbHlmaWxsIGNsYXNzIGNvbXBvbmVudHMnKTtcbiAgfVxuXG4gIGlmIChcbiAgICB0eXBlb2YgQ29tcG9uZW50LmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyAhPT0gJ2Z1bmN0aW9uJyAmJlxuICAgIHR5cGVvZiBwcm90b3R5cGUuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgIT09ICdmdW5jdGlvbidcbiAgKSB7XG4gICAgcmV0dXJuIENvbXBvbmVudDtcbiAgfVxuXG4gIC8vIElmIG5ldyBjb21wb25lbnQgQVBJcyBhcmUgZGVmaW5lZCwgXCJ1bnNhZmVcIiBsaWZlY3ljbGVzIHdvbid0IGJlIGNhbGxlZC5cbiAgLy8gRXJyb3IgaWYgYW55IG9mIHRoZXNlIGxpZmVjeWNsZXMgYXJlIHByZXNlbnQsXG4gIC8vIEJlY2F1c2UgdGhleSB3b3VsZCB3b3JrIGRpZmZlcmVudGx5IGJldHdlZW4gb2xkZXIgYW5kIG5ld2VyICgxNi4zKykgdmVyc2lvbnMgb2YgUmVhY3QuXG4gIHZhciBmb3VuZFdpbGxNb3VudE5hbWUgPSBudWxsO1xuICB2YXIgZm91bmRXaWxsUmVjZWl2ZVByb3BzTmFtZSA9IG51bGw7XG4gIHZhciBmb3VuZFdpbGxVcGRhdGVOYW1lID0gbnVsbDtcbiAgaWYgKHR5cGVvZiBwcm90b3R5cGUuY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgZm91bmRXaWxsTW91bnROYW1lID0gJ2NvbXBvbmVudFdpbGxNb3VudCc7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHByb3RvdHlwZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgZm91bmRXaWxsTW91bnROYW1lID0gJ1VOU0FGRV9jb21wb25lbnRXaWxsTW91bnQnO1xuICB9XG4gIGlmICh0eXBlb2YgcHJvdG90eXBlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBmb3VuZFdpbGxSZWNlaXZlUHJvcHNOYW1lID0gJ2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMnO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBwcm90b3R5cGUuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBmb3VuZFdpbGxSZWNlaXZlUHJvcHNOYW1lID0gJ1VOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzJztcbiAgfVxuICBpZiAodHlwZW9mIHByb3RvdHlwZS5jb21wb25lbnRXaWxsVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgZm91bmRXaWxsVXBkYXRlTmFtZSA9ICdjb21wb25lbnRXaWxsVXBkYXRlJztcbiAgfSBlbHNlIGlmICh0eXBlb2YgcHJvdG90eXBlLlVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgZm91bmRXaWxsVXBkYXRlTmFtZSA9ICdVTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSc7XG4gIH1cbiAgaWYgKFxuICAgIGZvdW5kV2lsbE1vdW50TmFtZSAhPT0gbnVsbCB8fFxuICAgIGZvdW5kV2lsbFJlY2VpdmVQcm9wc05hbWUgIT09IG51bGwgfHxcbiAgICBmb3VuZFdpbGxVcGRhdGVOYW1lICE9PSBudWxsXG4gICkge1xuICAgIHZhciBjb21wb25lbnROYW1lID0gQ29tcG9uZW50LmRpc3BsYXlOYW1lIHx8IENvbXBvbmVudC5uYW1lO1xuICAgIHZhciBuZXdBcGlOYW1lID1cbiAgICAgIHR5cGVvZiBDb21wb25lbnQuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nXG4gICAgICAgID8gJ2dldERlcml2ZWRTdGF0ZUZyb21Qcm9wcygpJ1xuICAgICAgICA6ICdnZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSgpJztcblxuICAgIHRocm93IEVycm9yKFxuICAgICAgJ1Vuc2FmZSBsZWdhY3kgbGlmZWN5Y2xlcyB3aWxsIG5vdCBiZSBjYWxsZWQgZm9yIGNvbXBvbmVudHMgdXNpbmcgbmV3IGNvbXBvbmVudCBBUElzLlxcblxcbicgK1xuICAgICAgICBjb21wb25lbnROYW1lICtcbiAgICAgICAgJyB1c2VzICcgK1xuICAgICAgICBuZXdBcGlOYW1lICtcbiAgICAgICAgJyBidXQgYWxzbyBjb250YWlucyB0aGUgZm9sbG93aW5nIGxlZ2FjeSBsaWZlY3ljbGVzOicgK1xuICAgICAgICAoZm91bmRXaWxsTW91bnROYW1lICE9PSBudWxsID8gJ1xcbiAgJyArIGZvdW5kV2lsbE1vdW50TmFtZSA6ICcnKSArXG4gICAgICAgIChmb3VuZFdpbGxSZWNlaXZlUHJvcHNOYW1lICE9PSBudWxsXG4gICAgICAgICAgPyAnXFxuICAnICsgZm91bmRXaWxsUmVjZWl2ZVByb3BzTmFtZVxuICAgICAgICAgIDogJycpICtcbiAgICAgICAgKGZvdW5kV2lsbFVwZGF0ZU5hbWUgIT09IG51bGwgPyAnXFxuICAnICsgZm91bmRXaWxsVXBkYXRlTmFtZSA6ICcnKSArXG4gICAgICAgICdcXG5cXG5UaGUgYWJvdmUgbGlmZWN5Y2xlcyBzaG91bGQgYmUgcmVtb3ZlZC4gTGVhcm4gbW9yZSBhYm91dCB0aGlzIHdhcm5pbmcgaGVyZTpcXG4nICtcbiAgICAgICAgJ2h0dHBzOi8vZmIubWUvcmVhY3QtYXN5bmMtY29tcG9uZW50LWxpZmVjeWNsZS1ob29rcydcbiAgICApO1xuICB9XG5cbiAgLy8gUmVhY3QgPD0gMTYuMiBkb2VzIG5vdCBzdXBwb3J0IHN0YXRpYyBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMuXG4gIC8vIEFzIGEgd29ya2Fyb3VuZCwgdXNlIGNXTSBhbmQgY1dSUCB0byBpbnZva2UgdGhlIG5ldyBzdGF0aWMgbGlmZWN5Y2xlLlxuICAvLyBOZXdlciB2ZXJzaW9ucyBvZiBSZWFjdCB3aWxsIGlnbm9yZSB0aGVzZSBsaWZlY3ljbGVzIGlmIGdEU0ZQIGV4aXN0cy5cbiAgaWYgKHR5cGVvZiBDb21wb25lbnQuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcHJvdG90eXBlLmNvbXBvbmVudFdpbGxNb3VudCA9IGNvbXBvbmVudFdpbGxNb3VudDtcbiAgICBwcm90b3R5cGUuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9IGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHM7XG4gIH1cblxuICAvLyBSZWFjdCA8PSAxNi4yIGRvZXMgbm90IHN1cHBvcnQgZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUuXG4gIC8vIEFzIGEgd29ya2Fyb3VuZCwgdXNlIGNXVSB0byBpbnZva2UgdGhlIG5ldyBsaWZlY3ljbGUuXG4gIC8vIE5ld2VyIHZlcnNpb25zIG9mIFJlYWN0IHdpbGwgaWdub3JlIHRoYXQgbGlmZWN5Y2xlIGlmIGdTQlUgZXhpc3RzLlxuICBpZiAodHlwZW9mIHByb3RvdHlwZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGlmICh0eXBlb2YgcHJvdG90eXBlLmNvbXBvbmVudERpZFVwZGF0ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnQ2Fubm90IHBvbHlmaWxsIGdldFNuYXBzaG90QmVmb3JlVXBkYXRlKCkgZm9yIGNvbXBvbmVudHMgdGhhdCBkbyBub3QgZGVmaW5lIGNvbXBvbmVudERpZFVwZGF0ZSgpIG9uIHRoZSBwcm90b3R5cGUnXG4gICAgICApO1xuICAgIH1cblxuICAgIHByb3RvdHlwZS5jb21wb25lbnRXaWxsVXBkYXRlID0gY29tcG9uZW50V2lsbFVwZGF0ZTtcblxuICAgIHZhciBjb21wb25lbnREaWRVcGRhdGUgPSBwcm90b3R5cGUuY29tcG9uZW50RGlkVXBkYXRlO1xuXG4gICAgcHJvdG90eXBlLmNvbXBvbmVudERpZFVwZGF0ZSA9IGZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZVBvbHlmaWxsKFxuICAgICAgcHJldlByb3BzLFxuICAgICAgcHJldlN0YXRlLFxuICAgICAgbWF5YmVTbmFwc2hvdFxuICAgICkge1xuICAgICAgLy8gMTYuMysgd2lsbCBub3QgZXhlY3V0ZSBvdXIgd2lsbC11cGRhdGUgbWV0aG9kO1xuICAgICAgLy8gSXQgd2lsbCBwYXNzIGEgc25hcHNob3QgdmFsdWUgdG8gZGlkLXVwZGF0ZSB0aG91Z2guXG4gICAgICAvLyBPbGRlciB2ZXJzaW9ucyB3aWxsIHJlcXVpcmUgb3VyIHBvbHlmaWxsZWQgd2lsbC11cGRhdGUgdmFsdWUuXG4gICAgICAvLyBXZSBuZWVkIHRvIGhhbmRsZSBib3RoIGNhc2VzLCBidXQgY2FuJ3QganVzdCBjaGVjayBmb3IgdGhlIHByZXNlbmNlIG9mIFwibWF5YmVTbmFwc2hvdFwiLFxuICAgICAgLy8gQmVjYXVzZSBmb3IgPD0gMTUueCB2ZXJzaW9ucyB0aGlzIG1pZ2h0IGJlIGEgXCJwcmV2Q29udGV4dFwiIG9iamVjdC5cbiAgICAgIC8vIFdlIGFsc28gY2FuJ3QganVzdCBjaGVjayBcIl9fcmVhY3RJbnRlcm5hbFNuYXBzaG90XCIsXG4gICAgICAvLyBCZWNhdXNlIGdldC1zbmFwc2hvdCBtaWdodCByZXR1cm4gYSBmYWxzeSB2YWx1ZS5cbiAgICAgIC8vIFNvIGNoZWNrIGZvciB0aGUgZXhwbGljaXQgX19yZWFjdEludGVybmFsU25hcHNob3RGbGFnIGZsYWcgdG8gZGV0ZXJtaW5lIGJlaGF2aW9yLlxuICAgICAgdmFyIHNuYXBzaG90ID0gdGhpcy5fX3JlYWN0SW50ZXJuYWxTbmFwc2hvdEZsYWdcbiAgICAgICAgPyB0aGlzLl9fcmVhY3RJbnRlcm5hbFNuYXBzaG90XG4gICAgICAgIDogbWF5YmVTbmFwc2hvdDtcblxuICAgICAgY29tcG9uZW50RGlkVXBkYXRlLmNhbGwodGhpcywgcHJldlByb3BzLCBwcmV2U3RhdGUsIHNuYXBzaG90KTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIENvbXBvbmVudDtcbn1cblxuZXhwb3J0IHsgcG9seWZpbGwgfTtcbiIsImltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZVwiO1xuaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX2luaGVyaXRzTG9vc2UgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzTG9vc2VcIjtcbnZhciBfanN4RmlsZU5hbWUgPSBcIi9Vc2Vycy9qcXVlbnNlL3NyYy91bmNvbnRyb2xsYWJsZS9zcmMvdW5jb250cm9sbGFibGUuanNcIjtcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBwb2x5ZmlsbCB9IGZyb20gJ3JlYWN0LWxpZmVjeWNsZXMtY29tcGF0JztcbmltcG9ydCBpbnZhcmlhbnQgZnJvbSAnaW52YXJpYW50JztcbmltcG9ydCAqIGFzIFV0aWxzIGZyb20gJy4vdXRpbHMnO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdW5jb250cm9sbGFibGUoQ29tcG9uZW50LCBjb250cm9sbGVkVmFsdWVzLCBtZXRob2RzKSB7XG4gIGlmIChtZXRob2RzID09PSB2b2lkIDApIHtcbiAgICBtZXRob2RzID0gW107XG4gIH1cblxuICB2YXIgZGlzcGxheU5hbWUgPSBDb21wb25lbnQuZGlzcGxheU5hbWUgfHwgQ29tcG9uZW50Lm5hbWUgfHwgJ0NvbXBvbmVudCc7XG4gIHZhciBjYW5BY2NlcHRSZWYgPSBVdGlscy5jYW5BY2NlcHRSZWYoQ29tcG9uZW50KTtcbiAgdmFyIGNvbnRyb2xsZWRQcm9wcyA9IE9iamVjdC5rZXlzKGNvbnRyb2xsZWRWYWx1ZXMpO1xuICB2YXIgUFJPUFNfVE9fT01JVCA9IGNvbnRyb2xsZWRQcm9wcy5tYXAoVXRpbHMuZGVmYXVsdEtleSk7XG4gICEoY2FuQWNjZXB0UmVmIHx8ICFtZXRob2RzLmxlbmd0aCkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBpbnZhcmlhbnQoZmFsc2UsICdbdW5jb250cm9sbGFibGVdIHN0YXRlbGVzcyBmdW5jdGlvbiBjb21wb25lbnRzIGNhbm5vdCBwYXNzIHRocm91Z2ggbWV0aG9kcyAnICsgJ2JlY2F1c2UgdGhleSBoYXZlIG5vIGFzc29jaWF0ZWQgaW5zdGFuY2VzLiBDaGVjayBjb21wb25lbnQ6ICcgKyBkaXNwbGF5TmFtZSArICcsICcgKyAnYXR0ZW1wdGluZyB0byBwYXNzIHRocm91Z2ggbWV0aG9kczogJyArIG1ldGhvZHMuam9pbignLCAnKSkgOiBpbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuXG4gIHZhciBVbmNvbnRyb2xsZWRDb21wb25lbnQgPVxuICAvKiNfX1BVUkVfXyovXG4gIGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICAgX2luaGVyaXRzTG9vc2UoVW5jb250cm9sbGVkQ29tcG9uZW50LCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICAgIGZ1bmN0aW9uIFVuY29udHJvbGxlZENvbXBvbmVudCgpIHtcbiAgICAgIHZhciBfdGhpcztcblxuICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICB9XG5cbiAgICAgIF90aGlzID0gX1JlYWN0JENvbXBvbmVudC5jYWxsLmFwcGx5KF9SZWFjdCRDb21wb25lbnQsIFt0aGlzXS5jb25jYXQoYXJncykpIHx8IHRoaXM7XG4gICAgICBfdGhpcy5oYW5kbGVycyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICBjb250cm9sbGVkUHJvcHMuZm9yRWFjaChmdW5jdGlvbiAocHJvcE5hbWUpIHtcbiAgICAgICAgdmFyIGhhbmRsZXJOYW1lID0gY29udHJvbGxlZFZhbHVlc1twcm9wTmFtZV07XG5cbiAgICAgICAgdmFyIGhhbmRsZUNoYW5nZSA9IGZ1bmN0aW9uIGhhbmRsZUNoYW5nZSh2YWx1ZSkge1xuICAgICAgICAgIGlmIChfdGhpcy5wcm9wc1toYW5kbGVyTmFtZV0pIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyRwcm9wcztcblxuICAgICAgICAgICAgX3RoaXMuX25vdGlmeWluZyA9IHRydWU7XG5cbiAgICAgICAgICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuMiA+IDEgPyBfbGVuMiAtIDEgOiAwKSwgX2tleTIgPSAxOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICAgICAgICAgIGFyZ3NbX2tleTIgLSAxXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIChfdGhpcyRwcm9wcyA9IF90aGlzLnByb3BzKVtoYW5kbGVyTmFtZV0uYXBwbHkoX3RoaXMkcHJvcHMsIFt2YWx1ZV0uY29uY2F0KGFyZ3MpKTtcblxuICAgICAgICAgICAgX3RoaXMuX25vdGlmeWluZyA9IGZhbHNlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghX3RoaXMudW5tb3VudGVkKSBfdGhpcy5zZXRTdGF0ZShmdW5jdGlvbiAoX3JlZikge1xuICAgICAgICAgICAgdmFyIF9leHRlbmRzMjtcblxuICAgICAgICAgICAgdmFyIHZhbHVlcyA9IF9yZWYudmFsdWVzO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgdmFsdWVzOiBfZXh0ZW5kcyhPYmplY3QuY3JlYXRlKG51bGwpLCB2YWx1ZXMsIChfZXh0ZW5kczIgPSB7fSwgX2V4dGVuZHMyW3Byb3BOYW1lXSA9IHZhbHVlLCBfZXh0ZW5kczIpKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICBfdGhpcy5oYW5kbGVyc1toYW5kbGVyTmFtZV0gPSBoYW5kbGVDaGFuZ2U7XG4gICAgICB9KTtcbiAgICAgIGlmIChtZXRob2RzLmxlbmd0aCkgX3RoaXMuYXR0YWNoUmVmID0gZnVuY3Rpb24gKHJlZikge1xuICAgICAgICBfdGhpcy5pbm5lciA9IHJlZjtcbiAgICAgIH07XG4gICAgICB2YXIgdmFsdWVzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgIGNvbnRyb2xsZWRQcm9wcy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgdmFsdWVzW2tleV0gPSBfdGhpcy5wcm9wc1tVdGlscy5kZWZhdWx0S2V5KGtleSldO1xuICAgICAgfSk7XG4gICAgICBfdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgdmFsdWVzOiB2YWx1ZXMsXG4gICAgICAgIHByZXZQcm9wczoge31cbiAgICAgIH07XG4gICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuXG4gICAgdmFyIF9wcm90byA9IFVuY29udHJvbGxlZENvbXBvbmVudC5wcm90b3R5cGU7XG5cbiAgICBfcHJvdG8uc2hvdWxkQ29tcG9uZW50VXBkYXRlID0gZnVuY3Rpb24gc2hvdWxkQ29tcG9uZW50VXBkYXRlKCkge1xuICAgICAgLy9sZXQgc2V0U3RhdGUgdHJpZ2dlciB0aGUgdXBkYXRlXG4gICAgICByZXR1cm4gIXRoaXMuX25vdGlmeWluZztcbiAgICB9O1xuXG4gICAgVW5jb250cm9sbGVkQ29tcG9uZW50LmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9IGZ1bmN0aW9uIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhwcm9wcywgX3JlZjIpIHtcbiAgICAgIHZhciB2YWx1ZXMgPSBfcmVmMi52YWx1ZXMsXG4gICAgICAgICAgcHJldlByb3BzID0gX3JlZjIucHJldlByb3BzO1xuICAgICAgdmFyIG5leHRTdGF0ZSA9IHtcbiAgICAgICAgdmFsdWVzOiBfZXh0ZW5kcyhPYmplY3QuY3JlYXRlKG51bGwpLCB2YWx1ZXMpLFxuICAgICAgICBwcmV2UHJvcHM6IHt9XG4gICAgICB9O1xuICAgICAgY29udHJvbGxlZFByb3BzLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAvKipcbiAgICAgICAgICogSWYgYSBwcm9wIHN3aXRjaGVzIGZyb20gY29udHJvbGxlZCB0byBVbmNvbnRyb2xsZWRcbiAgICAgICAgICogcmVzZXQgaXRzIHZhbHVlIHRvIHRoZSBkZWZhdWx0VmFsdWVcbiAgICAgICAgICovXG4gICAgICAgIG5leHRTdGF0ZS5wcmV2UHJvcHNba2V5XSA9IHByb3BzW2tleV07XG5cbiAgICAgICAgaWYgKCFVdGlscy5pc1Byb3AocHJvcHMsIGtleSkgJiYgVXRpbHMuaXNQcm9wKHByZXZQcm9wcywga2V5KSkge1xuICAgICAgICAgIG5leHRTdGF0ZS52YWx1ZXNba2V5XSA9IHByb3BzW1V0aWxzLmRlZmF1bHRLZXkoa2V5KV07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG5leHRTdGF0ZTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLmNvbXBvbmVudFdpbGxVbm1vdW50ID0gZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICB0aGlzLnVubW91bnRlZCA9IHRydWU7XG4gICAgfTtcblxuICAgIF9wcm90by5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdmFyIF90aGlzJHByb3BzMiA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgaW5uZXJSZWYgPSBfdGhpcyRwcm9wczIuaW5uZXJSZWYsXG4gICAgICAgICAgcHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShfdGhpcyRwcm9wczIsIFtcImlubmVyUmVmXCJdKTtcblxuICAgICAgUFJPUFNfVE9fT01JVC5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgICAgIGRlbGV0ZSBwcm9wc1twcm9wXTtcbiAgICAgIH0pO1xuICAgICAgdmFyIG5ld1Byb3BzID0ge307XG4gICAgICBjb250cm9sbGVkUHJvcHMuZm9yRWFjaChmdW5jdGlvbiAocHJvcE5hbWUpIHtcbiAgICAgICAgdmFyIHByb3BWYWx1ZSA9IF90aGlzMi5wcm9wc1twcm9wTmFtZV07XG4gICAgICAgIG5ld1Byb3BzW3Byb3BOYW1lXSA9IHByb3BWYWx1ZSAhPT0gdW5kZWZpbmVkID8gcHJvcFZhbHVlIDogX3RoaXMyLnN0YXRlLnZhbHVlc1twcm9wTmFtZV07XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KENvbXBvbmVudCwgX2V4dGVuZHMoe30sIHByb3BzLCBuZXdQcm9wcywgdGhpcy5oYW5kbGVycywge1xuICAgICAgICByZWY6IGlubmVyUmVmIHx8IHRoaXMuYXR0YWNoUmVmXG4gICAgICB9KSk7XG4gICAgfTtcblxuICAgIHJldHVybiBVbmNvbnRyb2xsZWRDb21wb25lbnQ7XG4gIH0oUmVhY3QuQ29tcG9uZW50KTtcblxuICBwb2x5ZmlsbChVbmNvbnRyb2xsZWRDb21wb25lbnQpO1xuICBVbmNvbnRyb2xsZWRDb21wb25lbnQuZGlzcGxheU5hbWUgPSBcIlVuY29udHJvbGxlZChcIiArIGRpc3BsYXlOYW1lICsgXCIpXCI7XG4gIFVuY29udHJvbGxlZENvbXBvbmVudC5wcm9wVHlwZXMgPSBfZXh0ZW5kcyh7XG4gICAgaW5uZXJSZWY6IGZ1bmN0aW9uIGlubmVyUmVmKCkge31cbiAgfSwgVXRpbHMudW5jb250cm9sbGVkUHJvcFR5cGVzKGNvbnRyb2xsZWRWYWx1ZXMsIGRpc3BsYXlOYW1lKSk7XG4gIG1ldGhvZHMuZm9yRWFjaChmdW5jdGlvbiAobWV0aG9kKSB7XG4gICAgVW5jb250cm9sbGVkQ29tcG9uZW50LnByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24gJHByb3hpZWRNZXRob2QoKSB7XG4gICAgICB2YXIgX3RoaXMkaW5uZXI7XG5cbiAgICAgIHJldHVybiAoX3RoaXMkaW5uZXIgPSB0aGlzLmlubmVyKVttZXRob2RdLmFwcGx5KF90aGlzJGlubmVyLCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH0pO1xuICB2YXIgV3JhcHBlZENvbXBvbmVudCA9IFVuY29udHJvbGxlZENvbXBvbmVudDtcblxuICBpZiAoUmVhY3QuZm9yd2FyZFJlZikge1xuICAgIFdyYXBwZWRDb21wb25lbnQgPSBSZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcmVmKSB7XG4gICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChVbmNvbnRyb2xsZWRDb21wb25lbnQsIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgICAgICBpbm5lclJlZjogcmVmLFxuICAgICAgICBfX3NvdXJjZToge1xuICAgICAgICAgIGZpbGVOYW1lOiBfanN4RmlsZU5hbWUsXG4gICAgICAgICAgbGluZU51bWJlcjogMTI4XG4gICAgICAgIH0sXG4gICAgICAgIF9fc2VsZjogdGhpc1xuICAgICAgfSkpO1xuICAgIH0pO1xuICAgIFdyYXBwZWRDb21wb25lbnQucHJvcFR5cGVzID0gVW5jb250cm9sbGVkQ29tcG9uZW50LnByb3BUeXBlcztcbiAgfVxuXG4gIFdyYXBwZWRDb21wb25lbnQuQ29udHJvbGxlZENvbXBvbmVudCA9IENvbXBvbmVudDtcbiAgLyoqXG4gICAqIHVzZWZ1bCB3aGVuIHdyYXBwaW5nIGEgQ29tcG9uZW50IGFuZCB5b3Ugd2FudCB0byBjb250cm9sXG4gICAqIGV2ZXJ5dGhpbmdcbiAgICovXG5cbiAgV3JhcHBlZENvbXBvbmVudC5kZWZlckNvbnRyb2xUbyA9IGZ1bmN0aW9uIChuZXdDb21wb25lbnQsIGFkZGl0aW9ucywgbmV4dE1ldGhvZHMpIHtcbiAgICBpZiAoYWRkaXRpb25zID09PSB2b2lkIDApIHtcbiAgICAgIGFkZGl0aW9ucyA9IHt9O1xuICAgIH1cblxuICAgIHJldHVybiB1bmNvbnRyb2xsYWJsZShuZXdDb21wb25lbnQsIF9leHRlbmRzKHt9LCBjb250cm9sbGVkVmFsdWVzLCBhZGRpdGlvbnMpLCBuZXh0TWV0aG9kcyk7XG4gIH07XG5cbiAgcmV0dXJuIFdyYXBwZWRDb21wb25lbnQ7XG59IiwiZXhwb3J0IHsgZGVmYXVsdCBhcyB1c2VVbmNvbnRyb2xsZWQsIHVzZVVuY29udHJvbGxlZFByb3AgfSBmcm9tICcuL2hvb2snO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB1bmNvbnRyb2xsYWJsZSB9IGZyb20gJy4vdW5jb250cm9sbGFibGUnOyIsIlwidXNlIGNsaWVudFwiO1xuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VDb250ZXh0LCB1c2VNZW1vIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmV4cG9ydCBjb25zdCBERUZBVUxUX0JSRUFLUE9JTlRTID0gWyd4eGwnLCAneGwnLCAnbGcnLCAnbWQnLCAnc20nLCAneHMnXTtcbmV4cG9ydCBjb25zdCBERUZBVUxUX01JTl9CUkVBS1BPSU5UID0gJ3hzJztcbmNvbnN0IFRoZW1lQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KHtcbiAgcHJlZml4ZXM6IHt9LFxuICBicmVha3BvaW50czogREVGQVVMVF9CUkVBS1BPSU5UUyxcbiAgbWluQnJlYWtwb2ludDogREVGQVVMVF9NSU5fQlJFQUtQT0lOVFxufSk7XG5jb25zdCB7XG4gIENvbnN1bWVyLFxuICBQcm92aWRlclxufSA9IFRoZW1lQ29udGV4dDtcbmZ1bmN0aW9uIFRoZW1lUHJvdmlkZXIoe1xuICBwcmVmaXhlcyA9IHt9LFxuICBicmVha3BvaW50cyA9IERFRkFVTFRfQlJFQUtQT0lOVFMsXG4gIG1pbkJyZWFrcG9pbnQgPSBERUZBVUxUX01JTl9CUkVBS1BPSU5ULFxuICBkaXIsXG4gIGNoaWxkcmVuXG59KSB7XG4gIGNvbnN0IGNvbnRleHRWYWx1ZSA9IHVzZU1lbW8oKCkgPT4gKHtcbiAgICBwcmVmaXhlczoge1xuICAgICAgLi4ucHJlZml4ZXNcbiAgICB9LFxuICAgIGJyZWFrcG9pbnRzLFxuICAgIG1pbkJyZWFrcG9pbnQsXG4gICAgZGlyXG4gIH0pLCBbcHJlZml4ZXMsIGJyZWFrcG9pbnRzLCBtaW5CcmVha3BvaW50LCBkaXJdKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KFByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IGNvbnRleHRWYWx1ZSxcbiAgICBjaGlsZHJlbjogY2hpbGRyZW5cbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gdXNlQm9vdHN0cmFwUHJlZml4KHByZWZpeCwgZGVmYXVsdFByZWZpeCkge1xuICBjb25zdCB7XG4gICAgcHJlZml4ZXNcbiAgfSA9IHVzZUNvbnRleHQoVGhlbWVDb250ZXh0KTtcbiAgcmV0dXJuIHByZWZpeCB8fCBwcmVmaXhlc1tkZWZhdWx0UHJlZml4XSB8fCBkZWZhdWx0UHJlZml4O1xufVxuZXhwb3J0IGZ1bmN0aW9uIHVzZUJvb3RzdHJhcEJyZWFrcG9pbnRzKCkge1xuICBjb25zdCB7XG4gICAgYnJlYWtwb2ludHNcbiAgfSA9IHVzZUNvbnRleHQoVGhlbWVDb250ZXh0KTtcbiAgcmV0dXJuIGJyZWFrcG9pbnRzO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHVzZUJvb3RzdHJhcE1pbkJyZWFrcG9pbnQoKSB7XG4gIGNvbnN0IHtcbiAgICBtaW5CcmVha3BvaW50XG4gIH0gPSB1c2VDb250ZXh0KFRoZW1lQ29udGV4dCk7XG4gIHJldHVybiBtaW5CcmVha3BvaW50O1xufVxuZXhwb3J0IGZ1bmN0aW9uIHVzZUlzUlRMKCkge1xuICBjb25zdCB7XG4gICAgZGlyXG4gIH0gPSB1c2VDb250ZXh0KFRoZW1lQ29udGV4dCk7XG4gIHJldHVybiBkaXIgPT09ICdydGwnO1xufVxuZnVuY3Rpb24gY3JlYXRlQm9vdHN0cmFwQ29tcG9uZW50KENvbXBvbmVudCwgb3B0cykge1xuICBpZiAodHlwZW9mIG9wdHMgPT09ICdzdHJpbmcnKSBvcHRzID0ge1xuICAgIHByZWZpeDogb3B0c1xuICB9O1xuICBjb25zdCBpc0NsYXNzeSA9IENvbXBvbmVudC5wcm90b3R5cGUgJiYgQ29tcG9uZW50LnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50O1xuICAvLyBJZiBpdCdzIGEgZnVuY3Rpb25hbCBjb21wb25lbnQgbWFrZSBzdXJlIHdlIGRvbid0IGJyZWFrIGl0IHdpdGggYSByZWZcbiAgY29uc3Qge1xuICAgIHByZWZpeCxcbiAgICBmb3J3YXJkUmVmQXMgPSBpc0NsYXNzeSA/ICdyZWYnIDogJ2lubmVyUmVmJ1xuICB9ID0gb3B0cztcbiAgY29uc3QgV3JhcHBlZCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKCh7XG4gICAgLi4ucHJvcHNcbiAgfSwgcmVmKSA9PiB7XG4gICAgcHJvcHNbZm9yd2FyZFJlZkFzXSA9IHJlZjtcbiAgICBjb25zdCBic1ByZWZpeCA9IHVzZUJvb3RzdHJhcFByZWZpeChwcm9wcy5ic1ByZWZpeCwgcHJlZml4KTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL19qc3goQ29tcG9uZW50LCB7XG4gICAgICAuLi5wcm9wcyxcbiAgICAgIGJzUHJlZml4OiBic1ByZWZpeFxuICAgIH0pO1xuICB9KTtcbiAgV3JhcHBlZC5kaXNwbGF5TmFtZSA9IGBCb290c3RyYXAoJHtDb21wb25lbnQuZGlzcGxheU5hbWUgfHwgQ29tcG9uZW50Lm5hbWV9KWA7XG4gIHJldHVybiBXcmFwcGVkO1xufVxuZXhwb3J0IHsgY3JlYXRlQm9vdHN0cmFwQ29tcG9uZW50LCBDb25zdW1lciBhcyBUaGVtZUNvbnN1bWVyIH07XG5leHBvcnQgZGVmYXVsdCBUaGVtZVByb3ZpZGVyOyIsIlwidXNlIGNsaWVudFwiO1xuXG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUJvb3RzdHJhcFByZWZpeCB9IGZyb20gJy4vVGhlbWVQcm92aWRlcic7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgTmF2YmFyQnJhbmQgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigoe1xuICBic1ByZWZpeCxcbiAgY2xhc3NOYW1lLFxuICBhcyxcbiAgLi4ucHJvcHNcbn0sIHJlZikgPT4ge1xuICBic1ByZWZpeCA9IHVzZUJvb3RzdHJhcFByZWZpeChic1ByZWZpeCwgJ25hdmJhci1icmFuZCcpO1xuICBjb25zdCBDb21wb25lbnQgPSBhcyB8fCAocHJvcHMuaHJlZiA/ICdhJyA6ICdzcGFuJyk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChDb21wb25lbnQsIHtcbiAgICAuLi5wcm9wcyxcbiAgICByZWY6IHJlZixcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoY2xhc3NOYW1lLCBic1ByZWZpeClcbiAgfSk7XG59KTtcbk5hdmJhckJyYW5kLmRpc3BsYXlOYW1lID0gJ05hdmJhckJyYW5kJztcbmV4cG9ydCBkZWZhdWx0IE5hdmJhckJyYW5kOyIsIi8qKlxuICogUmV0dXJucyB0aGUgb3duZXIgZG9jdW1lbnQgb2YgYSBnaXZlbiBlbGVtZW50LlxuICogXG4gKiBAcGFyYW0gbm9kZSB0aGUgZWxlbWVudFxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBvd25lckRvY3VtZW50KG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUgJiYgbm9kZS5vd25lckRvY3VtZW50IHx8IGRvY3VtZW50O1xufSIsImltcG9ydCBvd25lckRvY3VtZW50IGZyb20gJy4vb3duZXJEb2N1bWVudCc7XG4vKipcbiAqIFJldHVybnMgdGhlIG93bmVyIHdpbmRvdyBvZiBhIGdpdmVuIGVsZW1lbnQuXG4gKiBcbiAqIEBwYXJhbSBub2RlIHRoZSBlbGVtZW50XG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gb3duZXJXaW5kb3cobm9kZSkge1xuICB2YXIgZG9jID0gb3duZXJEb2N1bWVudChub2RlKTtcbiAgcmV0dXJuIGRvYyAmJiBkb2MuZGVmYXVsdFZpZXcgfHwgd2luZG93O1xufSIsImltcG9ydCBvd25lcldpbmRvdyBmcm9tICcuL293bmVyV2luZG93Jztcbi8qKlxuICogUmV0dXJucyBvbmUgb3IgYWxsIGNvbXB1dGVkIHN0eWxlIHByb3BlcnRpZXMgb2YgYW4gZWxlbWVudC5cbiAqIFxuICogQHBhcmFtIG5vZGUgdGhlIGVsZW1lbnRcbiAqIEBwYXJhbSBwc3VlZG9FbGVtZW50IHRoZSBzdHlsZSBwcm9wZXJ0eVxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldENvbXB1dGVkU3R5bGUobm9kZSwgcHN1ZWRvRWxlbWVudCkge1xuICByZXR1cm4gb3duZXJXaW5kb3cobm9kZSkuZ2V0Q29tcHV0ZWRTdHlsZShub2RlLCBwc3VlZG9FbGVtZW50KTtcbn0iLCJ2YXIgclVwcGVyID0gLyhbQS1aXSkvZztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGh5cGhlbmF0ZShzdHJpbmcpIHtcbiAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKHJVcHBlciwgJy0kMScpLnRvTG93ZXJDYXNlKCk7XG59IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy0yMDE0LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9ibG9iLzJhZWI4YTJhNmJlYjAwNjE3YTQyMTdmN2Y4Mjg0OTI0ZmEyYWQ4MTkvc3JjL3ZlbmRvci9jb3JlL2h5cGhlbmF0ZVN0eWxlTmFtZS5qc1xuICovXG5pbXBvcnQgaHlwaGVuYXRlIGZyb20gJy4vaHlwaGVuYXRlJztcbnZhciBtc1BhdHRlcm4gPSAvXm1zLS87XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBoeXBoZW5hdGVTdHlsZU5hbWUoc3RyaW5nKSB7XG4gIHJldHVybiBoeXBoZW5hdGUoc3RyaW5nKS5yZXBsYWNlKG1zUGF0dGVybiwgJy1tcy0nKTtcbn0iLCJ2YXIgc3VwcG9ydGVkVHJhbnNmb3JtcyA9IC9eKCh0cmFuc2xhdGV8cm90YXRlfHNjYWxlKShYfFl8WnwzZCk/fG1hdHJpeCgzZCk/fHBlcnNwZWN0aXZlfHNrZXcoWHxZKT8pJC9pO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNUcmFuc2Zvcm0odmFsdWUpIHtcbiAgcmV0dXJuICEhKHZhbHVlICYmIHN1cHBvcnRlZFRyYW5zZm9ybXMudGVzdCh2YWx1ZSkpO1xufSIsImltcG9ydCBnZXRDb21wdXRlZFN0eWxlIGZyb20gJy4vZ2V0Q29tcHV0ZWRTdHlsZSc7XG5pbXBvcnQgaHlwaGVuYXRlIGZyb20gJy4vaHlwaGVuYXRlU3R5bGUnO1xuaW1wb3J0IGlzVHJhbnNmb3JtIGZyb20gJy4vaXNUcmFuc2Zvcm0nO1xuXG5mdW5jdGlvbiBzdHlsZShub2RlLCBwcm9wZXJ0eSkge1xuICB2YXIgY3NzID0gJyc7XG4gIHZhciB0cmFuc2Zvcm1zID0gJyc7XG5cbiAgaWYgKHR5cGVvZiBwcm9wZXJ0eSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gbm9kZS5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKGh5cGhlbmF0ZShwcm9wZXJ0eSkpIHx8IGdldENvbXB1dGVkU3R5bGUobm9kZSkuZ2V0UHJvcGVydHlWYWx1ZShoeXBoZW5hdGUocHJvcGVydHkpKTtcbiAgfVxuXG4gIE9iamVjdC5rZXlzKHByb3BlcnR5KS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgdmFsdWUgPSBwcm9wZXJ0eVtrZXldO1xuXG4gICAgaWYgKCF2YWx1ZSAmJiB2YWx1ZSAhPT0gMCkge1xuICAgICAgbm9kZS5zdHlsZS5yZW1vdmVQcm9wZXJ0eShoeXBoZW5hdGUoa2V5KSk7XG4gICAgfSBlbHNlIGlmIChpc1RyYW5zZm9ybShrZXkpKSB7XG4gICAgICB0cmFuc2Zvcm1zICs9IGtleSArIFwiKFwiICsgdmFsdWUgKyBcIikgXCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNzcyArPSBoeXBoZW5hdGUoa2V5KSArIFwiOiBcIiArIHZhbHVlICsgXCI7XCI7XG4gICAgfVxuICB9KTtcblxuICBpZiAodHJhbnNmb3Jtcykge1xuICAgIGNzcyArPSBcInRyYW5zZm9ybTogXCIgKyB0cmFuc2Zvcm1zICsgXCI7XCI7XG4gIH1cblxuICBub2RlLnN0eWxlLmNzc1RleHQgKz0gXCI7XCIgKyBjc3M7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHN0eWxlOyIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7XG4gIF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZi5iaW5kKCkgOiBmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkge1xuICAgIG8uX19wcm90b19fID0gcDtcbiAgICByZXR1cm4gbztcbiAgfTtcbiAgcmV0dXJuIF9zZXRQcm90b3R5cGVPZihvLCBwKTtcbn0iLCJpbXBvcnQgc2V0UHJvdG90eXBlT2YgZnJvbSBcIi4vc2V0UHJvdG90eXBlT2YuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9pbmhlcml0c0xvb3NlKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7XG4gIHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcy5wcm90b3R5cGUpO1xuICBzdWJDbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBzdWJDbGFzcztcbiAgc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpO1xufSIsImV4cG9ydCBkZWZhdWx0IHtcbiAgZGlzYWJsZWQ6IGZhbHNlXG59OyIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5leHBvcnQgZGVmYXVsdCBSZWFjdC5jcmVhdGVDb250ZXh0KG51bGwpOyIsImV4cG9ydCB2YXIgZm9yY2VSZWZsb3cgPSBmdW5jdGlvbiBmb3JjZVJlZmxvdyhub2RlKSB7XG4gIHJldHVybiBub2RlLnNjcm9sbFRvcDtcbn07IiwiaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlXCI7XG5pbXBvcnQgX2luaGVyaXRzTG9vc2UgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzTG9vc2VcIjtcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFJlYWN0RE9NIGZyb20gJ3JlYWN0LWRvbSc7XG5pbXBvcnQgY29uZmlnIGZyb20gJy4vY29uZmlnJztcbmltcG9ydCB7IHRpbWVvdXRzU2hhcGUgfSBmcm9tICcuL3V0aWxzL1Byb3BUeXBlcyc7XG5pbXBvcnQgVHJhbnNpdGlvbkdyb3VwQ29udGV4dCBmcm9tICcuL1RyYW5zaXRpb25Hcm91cENvbnRleHQnO1xuaW1wb3J0IHsgZm9yY2VSZWZsb3cgfSBmcm9tICcuL3V0aWxzL3JlZmxvdyc7XG5leHBvcnQgdmFyIFVOTU9VTlRFRCA9ICd1bm1vdW50ZWQnO1xuZXhwb3J0IHZhciBFWElURUQgPSAnZXhpdGVkJztcbmV4cG9ydCB2YXIgRU5URVJJTkcgPSAnZW50ZXJpbmcnO1xuZXhwb3J0IHZhciBFTlRFUkVEID0gJ2VudGVyZWQnO1xuZXhwb3J0IHZhciBFWElUSU5HID0gJ2V4aXRpbmcnO1xuLyoqXG4gKiBUaGUgVHJhbnNpdGlvbiBjb21wb25lbnQgbGV0cyB5b3UgZGVzY3JpYmUgYSB0cmFuc2l0aW9uIGZyb20gb25lIGNvbXBvbmVudFxuICogc3RhdGUgdG8gYW5vdGhlciBfb3ZlciB0aW1lXyB3aXRoIGEgc2ltcGxlIGRlY2xhcmF0aXZlIEFQSS4gTW9zdCBjb21tb25seVxuICogaXQncyB1c2VkIHRvIGFuaW1hdGUgdGhlIG1vdW50aW5nIGFuZCB1bm1vdW50aW5nIG9mIGEgY29tcG9uZW50LCBidXQgY2FuIGFsc29cbiAqIGJlIHVzZWQgdG8gZGVzY3JpYmUgaW4tcGxhY2UgdHJhbnNpdGlvbiBzdGF0ZXMgYXMgd2VsbC5cbiAqXG4gKiAtLS1cbiAqXG4gKiAqKk5vdGUqKjogYFRyYW5zaXRpb25gIGlzIGEgcGxhdGZvcm0tYWdub3N0aWMgYmFzZSBjb21wb25lbnQuIElmIHlvdSdyZSB1c2luZ1xuICogdHJhbnNpdGlvbnMgaW4gQ1NTLCB5b3UnbGwgcHJvYmFibHkgd2FudCB0byB1c2VcbiAqIFtgQ1NTVHJhbnNpdGlvbmBdKGh0dHBzOi8vcmVhY3Rjb21tdW5pdHkub3JnL3JlYWN0LXRyYW5zaXRpb24tZ3JvdXAvY3NzLXRyYW5zaXRpb24pXG4gKiBpbnN0ZWFkLiBJdCBpbmhlcml0cyBhbGwgdGhlIGZlYXR1cmVzIG9mIGBUcmFuc2l0aW9uYCwgYnV0IGNvbnRhaW5zXG4gKiBhZGRpdGlvbmFsIGZlYXR1cmVzIG5lY2Vzc2FyeSB0byBwbGF5IG5pY2Ugd2l0aCBDU1MgdHJhbnNpdGlvbnMgKGhlbmNlIHRoZVxuICogbmFtZSBvZiB0aGUgY29tcG9uZW50KS5cbiAqXG4gKiAtLS1cbiAqXG4gKiBCeSBkZWZhdWx0IHRoZSBgVHJhbnNpdGlvbmAgY29tcG9uZW50IGRvZXMgbm90IGFsdGVyIHRoZSBiZWhhdmlvciBvZiB0aGVcbiAqIGNvbXBvbmVudCBpdCByZW5kZXJzLCBpdCBvbmx5IHRyYWNrcyBcImVudGVyXCIgYW5kIFwiZXhpdFwiIHN0YXRlcyBmb3IgdGhlXG4gKiBjb21wb25lbnRzLiBJdCdzIHVwIHRvIHlvdSB0byBnaXZlIG1lYW5pbmcgYW5kIGVmZmVjdCB0byB0aG9zZSBzdGF0ZXMuIEZvclxuICogZXhhbXBsZSB3ZSBjYW4gYWRkIHN0eWxlcyB0byBhIGNvbXBvbmVudCB3aGVuIGl0IGVudGVycyBvciBleGl0czpcbiAqXG4gKiBgYGBqc3hcbiAqIGltcG9ydCB7IFRyYW5zaXRpb24gfSBmcm9tICdyZWFjdC10cmFuc2l0aW9uLWdyb3VwJztcbiAqXG4gKiBjb25zdCBkdXJhdGlvbiA9IDMwMDtcbiAqXG4gKiBjb25zdCBkZWZhdWx0U3R5bGUgPSB7XG4gKiAgIHRyYW5zaXRpb246IGBvcGFjaXR5ICR7ZHVyYXRpb259bXMgZWFzZS1pbi1vdXRgLFxuICogICBvcGFjaXR5OiAwLFxuICogfVxuICpcbiAqIGNvbnN0IHRyYW5zaXRpb25TdHlsZXMgPSB7XG4gKiAgIGVudGVyaW5nOiB7IG9wYWNpdHk6IDEgfSxcbiAqICAgZW50ZXJlZDogIHsgb3BhY2l0eTogMSB9LFxuICogICBleGl0aW5nOiAgeyBvcGFjaXR5OiAwIH0sXG4gKiAgIGV4aXRlZDogIHsgb3BhY2l0eTogMCB9LFxuICogfTtcbiAqXG4gKiBjb25zdCBGYWRlID0gKHsgaW46IGluUHJvcCB9KSA9PiAoXG4gKiAgIDxUcmFuc2l0aW9uIGluPXtpblByb3B9IHRpbWVvdXQ9e2R1cmF0aW9ufT5cbiAqICAgICB7c3RhdGUgPT4gKFxuICogICAgICAgPGRpdiBzdHlsZT17e1xuICogICAgICAgICAuLi5kZWZhdWx0U3R5bGUsXG4gKiAgICAgICAgIC4uLnRyYW5zaXRpb25TdHlsZXNbc3RhdGVdXG4gKiAgICAgICB9fT5cbiAqICAgICAgICAgSSdtIGEgZmFkZSBUcmFuc2l0aW9uIVxuICogICAgICAgPC9kaXY+XG4gKiAgICAgKX1cbiAqICAgPC9UcmFuc2l0aW9uPlxuICogKTtcbiAqIGBgYFxuICpcbiAqIFRoZXJlIGFyZSA0IG1haW4gc3RhdGVzIGEgVHJhbnNpdGlvbiBjYW4gYmUgaW46XG4gKiAgLSBgJ2VudGVyaW5nJ2BcbiAqICAtIGAnZW50ZXJlZCdgXG4gKiAgLSBgJ2V4aXRpbmcnYFxuICogIC0gYCdleGl0ZWQnYFxuICpcbiAqIFRyYW5zaXRpb24gc3RhdGUgaXMgdG9nZ2xlZCB2aWEgdGhlIGBpbmAgcHJvcC4gV2hlbiBgdHJ1ZWAgdGhlIGNvbXBvbmVudFxuICogYmVnaW5zIHRoZSBcIkVudGVyXCIgc3RhZ2UuIER1cmluZyB0aGlzIHN0YWdlLCB0aGUgY29tcG9uZW50IHdpbGwgc2hpZnQgZnJvbVxuICogaXRzIGN1cnJlbnQgdHJhbnNpdGlvbiBzdGF0ZSwgdG8gYCdlbnRlcmluZydgIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlXG4gKiB0cmFuc2l0aW9uIGFuZCB0aGVuIHRvIHRoZSBgJ2VudGVyZWQnYCBzdGFnZSBvbmNlIGl0J3MgY29tcGxldGUuIExldCdzIHRha2VcbiAqIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSAod2UnbGwgdXNlIHRoZVxuICogW3VzZVN0YXRlXShodHRwczovL3JlYWN0anMub3JnL2RvY3MvaG9va3MtcmVmZXJlbmNlLmh0bWwjdXNlc3RhdGUpIGhvb2spOlxuICpcbiAqIGBgYGpzeFxuICogZnVuY3Rpb24gQXBwKCkge1xuICogICBjb25zdCBbaW5Qcm9wLCBzZXRJblByb3BdID0gdXNlU3RhdGUoZmFsc2UpO1xuICogICByZXR1cm4gKFxuICogICAgIDxkaXY+XG4gKiAgICAgICA8VHJhbnNpdGlvbiBpbj17aW5Qcm9wfSB0aW1lb3V0PXs1MDB9PlxuICogICAgICAgICB7c3RhdGUgPT4gKFxuICogICAgICAgICAgIC8vIC4uLlxuICogICAgICAgICApfVxuICogICAgICAgPC9UcmFuc2l0aW9uPlxuICogICAgICAgPGJ1dHRvbiBvbkNsaWNrPXsoKSA9PiBzZXRJblByb3AodHJ1ZSl9PlxuICogICAgICAgICBDbGljayB0byBFbnRlclxuICogICAgICAgPC9idXR0b24+XG4gKiAgICAgPC9kaXY+XG4gKiAgICk7XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBXaGVuIHRoZSBidXR0b24gaXMgY2xpY2tlZCB0aGUgY29tcG9uZW50IHdpbGwgc2hpZnQgdG8gdGhlIGAnZW50ZXJpbmcnYCBzdGF0ZVxuICogYW5kIHN0YXkgdGhlcmUgZm9yIDUwMG1zICh0aGUgdmFsdWUgb2YgYHRpbWVvdXRgKSBiZWZvcmUgaXQgZmluYWxseSBzd2l0Y2hlc1xuICogdG8gYCdlbnRlcmVkJ2AuXG4gKlxuICogV2hlbiBgaW5gIGlzIGBmYWxzZWAgdGhlIHNhbWUgdGhpbmcgaGFwcGVucyBleGNlcHQgdGhlIHN0YXRlIG1vdmVzIGZyb21cbiAqIGAnZXhpdGluZydgIHRvIGAnZXhpdGVkJ2AuXG4gKi9cblxudmFyIFRyYW5zaXRpb24gPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzTG9vc2UoVHJhbnNpdGlvbiwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gVHJhbnNpdGlvbihwcm9wcywgY29udGV4dCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIF90aGlzID0gX1JlYWN0JENvbXBvbmVudC5jYWxsKHRoaXMsIHByb3BzLCBjb250ZXh0KSB8fCB0aGlzO1xuICAgIHZhciBwYXJlbnRHcm91cCA9IGNvbnRleHQ7IC8vIEluIHRoZSBjb250ZXh0IG9mIGEgVHJhbnNpdGlvbkdyb3VwIGFsbCBlbnRlcnMgYXJlIHJlYWxseSBhcHBlYXJzXG5cbiAgICB2YXIgYXBwZWFyID0gcGFyZW50R3JvdXAgJiYgIXBhcmVudEdyb3VwLmlzTW91bnRpbmcgPyBwcm9wcy5lbnRlciA6IHByb3BzLmFwcGVhcjtcbiAgICB2YXIgaW5pdGlhbFN0YXR1cztcbiAgICBfdGhpcy5hcHBlYXJTdGF0dXMgPSBudWxsO1xuXG4gICAgaWYgKHByb3BzLmluKSB7XG4gICAgICBpZiAoYXBwZWFyKSB7XG4gICAgICAgIGluaXRpYWxTdGF0dXMgPSBFWElURUQ7XG4gICAgICAgIF90aGlzLmFwcGVhclN0YXR1cyA9IEVOVEVSSU5HO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5pdGlhbFN0YXR1cyA9IEVOVEVSRUQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChwcm9wcy51bm1vdW50T25FeGl0IHx8IHByb3BzLm1vdW50T25FbnRlcikge1xuICAgICAgICBpbml0aWFsU3RhdHVzID0gVU5NT1VOVEVEO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5pdGlhbFN0YXR1cyA9IEVYSVRFRDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBfdGhpcy5zdGF0ZSA9IHtcbiAgICAgIHN0YXR1czogaW5pdGlhbFN0YXR1c1xuICAgIH07XG4gICAgX3RoaXMubmV4dENhbGxiYWNrID0gbnVsbDtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBUcmFuc2l0aW9uLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9IGZ1bmN0aW9uIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhfcmVmLCBwcmV2U3RhdGUpIHtcbiAgICB2YXIgbmV4dEluID0gX3JlZi5pbjtcblxuICAgIGlmIChuZXh0SW4gJiYgcHJldlN0YXRlLnN0YXR1cyA9PT0gVU5NT1VOVEVEKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdGF0dXM6IEVYSVRFRFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfSAvLyBnZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZShwcmV2UHJvcHMpIHtcbiAgLy8gICBsZXQgbmV4dFN0YXR1cyA9IG51bGxcbiAgLy8gICBpZiAocHJldlByb3BzICE9PSB0aGlzLnByb3BzKSB7XG4gIC8vICAgICBjb25zdCB7IHN0YXR1cyB9ID0gdGhpcy5zdGF0ZVxuICAvLyAgICAgaWYgKHRoaXMucHJvcHMuaW4pIHtcbiAgLy8gICAgICAgaWYgKHN0YXR1cyAhPT0gRU5URVJJTkcgJiYgc3RhdHVzICE9PSBFTlRFUkVEKSB7XG4gIC8vICAgICAgICAgbmV4dFN0YXR1cyA9IEVOVEVSSU5HXG4gIC8vICAgICAgIH1cbiAgLy8gICAgIH0gZWxzZSB7XG4gIC8vICAgICAgIGlmIChzdGF0dXMgPT09IEVOVEVSSU5HIHx8IHN0YXR1cyA9PT0gRU5URVJFRCkge1xuICAvLyAgICAgICAgIG5leHRTdGF0dXMgPSBFWElUSU5HXG4gIC8vICAgICAgIH1cbiAgLy8gICAgIH1cbiAgLy8gICB9XG4gIC8vICAgcmV0dXJuIHsgbmV4dFN0YXR1cyB9XG4gIC8vIH1cbiAgO1xuXG4gIHZhciBfcHJvdG8gPSBUcmFuc2l0aW9uLnByb3RvdHlwZTtcblxuICBfcHJvdG8uY29tcG9uZW50RGlkTW91bnQgPSBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICB0aGlzLnVwZGF0ZVN0YXR1cyh0cnVlLCB0aGlzLmFwcGVhclN0YXR1cyk7XG4gIH07XG5cbiAgX3Byb3RvLmNvbXBvbmVudERpZFVwZGF0ZSA9IGZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMpIHtcbiAgICB2YXIgbmV4dFN0YXR1cyA9IG51bGw7XG5cbiAgICBpZiAocHJldlByb3BzICE9PSB0aGlzLnByb3BzKSB7XG4gICAgICB2YXIgc3RhdHVzID0gdGhpcy5zdGF0ZS5zdGF0dXM7XG5cbiAgICAgIGlmICh0aGlzLnByb3BzLmluKSB7XG4gICAgICAgIGlmIChzdGF0dXMgIT09IEVOVEVSSU5HICYmIHN0YXR1cyAhPT0gRU5URVJFRCkge1xuICAgICAgICAgIG5leHRTdGF0dXMgPSBFTlRFUklORztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gRU5URVJJTkcgfHwgc3RhdHVzID09PSBFTlRFUkVEKSB7XG4gICAgICAgICAgbmV4dFN0YXR1cyA9IEVYSVRJTkc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZVN0YXR1cyhmYWxzZSwgbmV4dFN0YXR1cyk7XG4gIH07XG5cbiAgX3Byb3RvLmNvbXBvbmVudFdpbGxVbm1vdW50ID0gZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgdGhpcy5jYW5jZWxOZXh0Q2FsbGJhY2soKTtcbiAgfTtcblxuICBfcHJvdG8uZ2V0VGltZW91dHMgPSBmdW5jdGlvbiBnZXRUaW1lb3V0cygpIHtcbiAgICB2YXIgdGltZW91dCA9IHRoaXMucHJvcHMudGltZW91dDtcbiAgICB2YXIgZXhpdCwgZW50ZXIsIGFwcGVhcjtcbiAgICBleGl0ID0gZW50ZXIgPSBhcHBlYXIgPSB0aW1lb3V0O1xuXG4gICAgaWYgKHRpbWVvdXQgIT0gbnVsbCAmJiB0eXBlb2YgdGltZW91dCAhPT0gJ251bWJlcicpIHtcbiAgICAgIGV4aXQgPSB0aW1lb3V0LmV4aXQ7XG4gICAgICBlbnRlciA9IHRpbWVvdXQuZW50ZXI7IC8vIFRPRE86IHJlbW92ZSBmYWxsYmFjayBmb3IgbmV4dCBtYWpvclxuXG4gICAgICBhcHBlYXIgPSB0aW1lb3V0LmFwcGVhciAhPT0gdW5kZWZpbmVkID8gdGltZW91dC5hcHBlYXIgOiBlbnRlcjtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZXhpdDogZXhpdCxcbiAgICAgIGVudGVyOiBlbnRlcixcbiAgICAgIGFwcGVhcjogYXBwZWFyXG4gICAgfTtcbiAgfTtcblxuICBfcHJvdG8udXBkYXRlU3RhdHVzID0gZnVuY3Rpb24gdXBkYXRlU3RhdHVzKG1vdW50aW5nLCBuZXh0U3RhdHVzKSB7XG4gICAgaWYgKG1vdW50aW5nID09PSB2b2lkIDApIHtcbiAgICAgIG1vdW50aW5nID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKG5leHRTdGF0dXMgIT09IG51bGwpIHtcbiAgICAgIC8vIG5leHRTdGF0dXMgd2lsbCBhbHdheXMgYmUgRU5URVJJTkcgb3IgRVhJVElORy5cbiAgICAgIHRoaXMuY2FuY2VsTmV4dENhbGxiYWNrKCk7XG5cbiAgICAgIGlmIChuZXh0U3RhdHVzID09PSBFTlRFUklORykge1xuICAgICAgICBpZiAodGhpcy5wcm9wcy51bm1vdW50T25FeGl0IHx8IHRoaXMucHJvcHMubW91bnRPbkVudGVyKSB7XG4gICAgICAgICAgdmFyIG5vZGUgPSB0aGlzLnByb3BzLm5vZGVSZWYgPyB0aGlzLnByb3BzLm5vZGVSZWYuY3VycmVudCA6IFJlYWN0RE9NLmZpbmRET01Ob2RlKHRoaXMpOyAvLyBodHRwczovL2dpdGh1Yi5jb20vcmVhY3Rqcy9yZWFjdC10cmFuc2l0aW9uLWdyb3VwL3B1bGwvNzQ5XG4gICAgICAgICAgLy8gV2l0aCB1bm1vdW50T25FeGl0IG9yIG1vdW50T25FbnRlciwgdGhlIGVudGVyIGFuaW1hdGlvbiBzaG91bGQgaGFwcGVuIGF0IHRoZSB0cmFuc2l0aW9uIGJldHdlZW4gYGV4aXRlZGAgYW5kIGBlbnRlcmluZ2AuXG4gICAgICAgICAgLy8gVG8gbWFrZSB0aGUgYW5pbWF0aW9uIGhhcHBlbiwgIHdlIGhhdmUgdG8gc2VwYXJhdGUgZWFjaCByZW5kZXJpbmcgYW5kIGF2b2lkIGJlaW5nIHByb2Nlc3NlZCBhcyBiYXRjaGVkLlxuXG4gICAgICAgICAgaWYgKG5vZGUpIGZvcmNlUmVmbG93KG5vZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wZXJmb3JtRW50ZXIobW91bnRpbmcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wZXJmb3JtRXhpdCgpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5wcm9wcy51bm1vdW50T25FeGl0ICYmIHRoaXMuc3RhdGUuc3RhdHVzID09PSBFWElURUQpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBzdGF0dXM6IFVOTU9VTlRFRFxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIF9wcm90by5wZXJmb3JtRW50ZXIgPSBmdW5jdGlvbiBwZXJmb3JtRW50ZXIobW91bnRpbmcpIHtcbiAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgIHZhciBlbnRlciA9IHRoaXMucHJvcHMuZW50ZXI7XG4gICAgdmFyIGFwcGVhcmluZyA9IHRoaXMuY29udGV4dCA/IHRoaXMuY29udGV4dC5pc01vdW50aW5nIDogbW91bnRpbmc7XG5cbiAgICB2YXIgX3JlZjIgPSB0aGlzLnByb3BzLm5vZGVSZWYgPyBbYXBwZWFyaW5nXSA6IFtSZWFjdERPTS5maW5kRE9NTm9kZSh0aGlzKSwgYXBwZWFyaW5nXSxcbiAgICAgICAgbWF5YmVOb2RlID0gX3JlZjJbMF0sXG4gICAgICAgIG1heWJlQXBwZWFyaW5nID0gX3JlZjJbMV07XG5cbiAgICB2YXIgdGltZW91dHMgPSB0aGlzLmdldFRpbWVvdXRzKCk7XG4gICAgdmFyIGVudGVyVGltZW91dCA9IGFwcGVhcmluZyA/IHRpbWVvdXRzLmFwcGVhciA6IHRpbWVvdXRzLmVudGVyOyAvLyBubyBlbnRlciBhbmltYXRpb24gc2tpcCByaWdodCB0byBFTlRFUkVEXG4gICAgLy8gaWYgd2UgYXJlIG1vdW50aW5nIGFuZCBydW5uaW5nIHRoaXMgaXQgbWVhbnMgYXBwZWFyIF9tdXN0XyBiZSBzZXRcblxuICAgIGlmICghbW91bnRpbmcgJiYgIWVudGVyIHx8IGNvbmZpZy5kaXNhYmxlZCkge1xuICAgICAgdGhpcy5zYWZlU2V0U3RhdGUoe1xuICAgICAgICBzdGF0dXM6IEVOVEVSRURcbiAgICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgX3RoaXMyLnByb3BzLm9uRW50ZXJlZChtYXliZU5vZGUpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5wcm9wcy5vbkVudGVyKG1heWJlTm9kZSwgbWF5YmVBcHBlYXJpbmcpO1xuICAgIHRoaXMuc2FmZVNldFN0YXRlKHtcbiAgICAgIHN0YXR1czogRU5URVJJTkdcbiAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpczIucHJvcHMub25FbnRlcmluZyhtYXliZU5vZGUsIG1heWJlQXBwZWFyaW5nKTtcblxuICAgICAgX3RoaXMyLm9uVHJhbnNpdGlvbkVuZChlbnRlclRpbWVvdXQsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgX3RoaXMyLnNhZmVTZXRTdGF0ZSh7XG4gICAgICAgICAgc3RhdHVzOiBFTlRFUkVEXG4gICAgICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBfdGhpczIucHJvcHMub25FbnRlcmVkKG1heWJlTm9kZSwgbWF5YmVBcHBlYXJpbmcpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIF9wcm90by5wZXJmb3JtRXhpdCA9IGZ1bmN0aW9uIHBlcmZvcm1FeGl0KCkge1xuICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgdmFyIGV4aXQgPSB0aGlzLnByb3BzLmV4aXQ7XG4gICAgdmFyIHRpbWVvdXRzID0gdGhpcy5nZXRUaW1lb3V0cygpO1xuICAgIHZhciBtYXliZU5vZGUgPSB0aGlzLnByb3BzLm5vZGVSZWYgPyB1bmRlZmluZWQgOiBSZWFjdERPTS5maW5kRE9NTm9kZSh0aGlzKTsgLy8gbm8gZXhpdCBhbmltYXRpb24gc2tpcCByaWdodCB0byBFWElURURcblxuICAgIGlmICghZXhpdCB8fCBjb25maWcuZGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuc2FmZVNldFN0YXRlKHtcbiAgICAgICAgc3RhdHVzOiBFWElURURcbiAgICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgX3RoaXMzLnByb3BzLm9uRXhpdGVkKG1heWJlTm9kZSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnByb3BzLm9uRXhpdChtYXliZU5vZGUpO1xuICAgIHRoaXMuc2FmZVNldFN0YXRlKHtcbiAgICAgIHN0YXR1czogRVhJVElOR1xuICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgIF90aGlzMy5wcm9wcy5vbkV4aXRpbmcobWF5YmVOb2RlKTtcblxuICAgICAgX3RoaXMzLm9uVHJhbnNpdGlvbkVuZCh0aW1lb3V0cy5leGl0LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzMy5zYWZlU2V0U3RhdGUoe1xuICAgICAgICAgIHN0YXR1czogRVhJVEVEXG4gICAgICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBfdGhpczMucHJvcHMub25FeGl0ZWQobWF5YmVOb2RlKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcblxuICBfcHJvdG8uY2FuY2VsTmV4dENhbGxiYWNrID0gZnVuY3Rpb24gY2FuY2VsTmV4dENhbGxiYWNrKCkge1xuICAgIGlmICh0aGlzLm5leHRDYWxsYmFjayAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5uZXh0Q2FsbGJhY2suY2FuY2VsKCk7XG4gICAgICB0aGlzLm5leHRDYWxsYmFjayA9IG51bGw7XG4gICAgfVxuICB9O1xuXG4gIF9wcm90by5zYWZlU2V0U3RhdGUgPSBmdW5jdGlvbiBzYWZlU2V0U3RhdGUobmV4dFN0YXRlLCBjYWxsYmFjaykge1xuICAgIC8vIFRoaXMgc2hvdWxkbid0IGJlIG5lY2Vzc2FyeSwgYnV0IHRoZXJlIGFyZSB3ZWlyZCByYWNlIGNvbmRpdGlvbnMgd2l0aFxuICAgIC8vIHNldFN0YXRlIGNhbGxiYWNrcyBhbmQgdW5tb3VudGluZyBpbiB0ZXN0aW5nLCBzbyBhbHdheXMgbWFrZSBzdXJlIHRoYXRcbiAgICAvLyB3ZSBjYW4gY2FuY2VsIGFueSBwZW5kaW5nIHNldFN0YXRlIGNhbGxiYWNrcyBhZnRlciB3ZSB1bm1vdW50LlxuICAgIGNhbGxiYWNrID0gdGhpcy5zZXROZXh0Q2FsbGJhY2soY2FsbGJhY2spO1xuICAgIHRoaXMuc2V0U3RhdGUobmV4dFN0YXRlLCBjYWxsYmFjayk7XG4gIH07XG5cbiAgX3Byb3RvLnNldE5leHRDYWxsYmFjayA9IGZ1bmN0aW9uIHNldE5leHRDYWxsYmFjayhjYWxsYmFjaykge1xuICAgIHZhciBfdGhpczQgPSB0aGlzO1xuXG4gICAgdmFyIGFjdGl2ZSA9IHRydWU7XG5cbiAgICB0aGlzLm5leHRDYWxsYmFjayA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgaWYgKGFjdGl2ZSkge1xuICAgICAgICBhY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgX3RoaXM0Lm5leHRDYWxsYmFjayA9IG51bGw7XG4gICAgICAgIGNhbGxiYWNrKGV2ZW50KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5uZXh0Q2FsbGJhY2suY2FuY2VsID0gZnVuY3Rpb24gKCkge1xuICAgICAgYWN0aXZlID0gZmFsc2U7XG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLm5leHRDYWxsYmFjaztcbiAgfTtcblxuICBfcHJvdG8ub25UcmFuc2l0aW9uRW5kID0gZnVuY3Rpb24gb25UcmFuc2l0aW9uRW5kKHRpbWVvdXQsIGhhbmRsZXIpIHtcbiAgICB0aGlzLnNldE5leHRDYWxsYmFjayhoYW5kbGVyKTtcbiAgICB2YXIgbm9kZSA9IHRoaXMucHJvcHMubm9kZVJlZiA/IHRoaXMucHJvcHMubm9kZVJlZi5jdXJyZW50IDogUmVhY3RET00uZmluZERPTU5vZGUodGhpcyk7XG4gICAgdmFyIGRvZXNOb3RIYXZlVGltZW91dE9yTGlzdGVuZXIgPSB0aW1lb3V0ID09IG51bGwgJiYgIXRoaXMucHJvcHMuYWRkRW5kTGlzdGVuZXI7XG5cbiAgICBpZiAoIW5vZGUgfHwgZG9lc05vdEhhdmVUaW1lb3V0T3JMaXN0ZW5lcikge1xuICAgICAgc2V0VGltZW91dCh0aGlzLm5leHRDYWxsYmFjaywgMCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucHJvcHMuYWRkRW5kTGlzdGVuZXIpIHtcbiAgICAgIHZhciBfcmVmMyA9IHRoaXMucHJvcHMubm9kZVJlZiA/IFt0aGlzLm5leHRDYWxsYmFja10gOiBbbm9kZSwgdGhpcy5uZXh0Q2FsbGJhY2tdLFxuICAgICAgICAgIG1heWJlTm9kZSA9IF9yZWYzWzBdLFxuICAgICAgICAgIG1heWJlTmV4dENhbGxiYWNrID0gX3JlZjNbMV07XG5cbiAgICAgIHRoaXMucHJvcHMuYWRkRW5kTGlzdGVuZXIobWF5YmVOb2RlLCBtYXliZU5leHRDYWxsYmFjayk7XG4gICAgfVxuXG4gICAgaWYgKHRpbWVvdXQgIT0gbnVsbCkge1xuICAgICAgc2V0VGltZW91dCh0aGlzLm5leHRDYWxsYmFjaywgdGltZW91dCk7XG4gICAgfVxuICB9O1xuXG4gIF9wcm90by5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIHN0YXR1cyA9IHRoaXMuc3RhdGUuc3RhdHVzO1xuXG4gICAgaWYgKHN0YXR1cyA9PT0gVU5NT1VOVEVEKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgX3RoaXMkcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBjaGlsZHJlbiA9IF90aGlzJHByb3BzLmNoaWxkcmVuLFxuICAgICAgICBfaW4gPSBfdGhpcyRwcm9wcy5pbixcbiAgICAgICAgX21vdW50T25FbnRlciA9IF90aGlzJHByb3BzLm1vdW50T25FbnRlcixcbiAgICAgICAgX3VubW91bnRPbkV4aXQgPSBfdGhpcyRwcm9wcy51bm1vdW50T25FeGl0LFxuICAgICAgICBfYXBwZWFyID0gX3RoaXMkcHJvcHMuYXBwZWFyLFxuICAgICAgICBfZW50ZXIgPSBfdGhpcyRwcm9wcy5lbnRlcixcbiAgICAgICAgX2V4aXQgPSBfdGhpcyRwcm9wcy5leGl0LFxuICAgICAgICBfdGltZW91dCA9IF90aGlzJHByb3BzLnRpbWVvdXQsXG4gICAgICAgIF9hZGRFbmRMaXN0ZW5lciA9IF90aGlzJHByb3BzLmFkZEVuZExpc3RlbmVyLFxuICAgICAgICBfb25FbnRlciA9IF90aGlzJHByb3BzLm9uRW50ZXIsXG4gICAgICAgIF9vbkVudGVyaW5nID0gX3RoaXMkcHJvcHMub25FbnRlcmluZyxcbiAgICAgICAgX29uRW50ZXJlZCA9IF90aGlzJHByb3BzLm9uRW50ZXJlZCxcbiAgICAgICAgX29uRXhpdCA9IF90aGlzJHByb3BzLm9uRXhpdCxcbiAgICAgICAgX29uRXhpdGluZyA9IF90aGlzJHByb3BzLm9uRXhpdGluZyxcbiAgICAgICAgX29uRXhpdGVkID0gX3RoaXMkcHJvcHMub25FeGl0ZWQsXG4gICAgICAgIF9ub2RlUmVmID0gX3RoaXMkcHJvcHMubm9kZVJlZixcbiAgICAgICAgY2hpbGRQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKF90aGlzJHByb3BzLCBbXCJjaGlsZHJlblwiLCBcImluXCIsIFwibW91bnRPbkVudGVyXCIsIFwidW5tb3VudE9uRXhpdFwiLCBcImFwcGVhclwiLCBcImVudGVyXCIsIFwiZXhpdFwiLCBcInRpbWVvdXRcIiwgXCJhZGRFbmRMaXN0ZW5lclwiLCBcIm9uRW50ZXJcIiwgXCJvbkVudGVyaW5nXCIsIFwib25FbnRlcmVkXCIsIFwib25FeGl0XCIsIFwib25FeGl0aW5nXCIsIFwib25FeGl0ZWRcIiwgXCJub2RlUmVmXCJdKTtcblxuICAgIHJldHVybiAoXG4gICAgICAvKiNfX1BVUkVfXyovXG4gICAgICAvLyBhbGxvd3MgZm9yIG5lc3RlZCBUcmFuc2l0aW9uc1xuICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChUcmFuc2l0aW9uR3JvdXBDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgICAgIHZhbHVlOiBudWxsXG4gICAgICB9LCB0eXBlb2YgY2hpbGRyZW4gPT09ICdmdW5jdGlvbicgPyBjaGlsZHJlbihzdGF0dXMsIGNoaWxkUHJvcHMpIDogUmVhY3QuY2xvbmVFbGVtZW50KFJlYWN0LkNoaWxkcmVuLm9ubHkoY2hpbGRyZW4pLCBjaGlsZFByb3BzKSlcbiAgICApO1xuICB9O1xuXG4gIHJldHVybiBUcmFuc2l0aW9uO1xufShSZWFjdC5Db21wb25lbnQpO1xuXG5UcmFuc2l0aW9uLmNvbnRleHRUeXBlID0gVHJhbnNpdGlvbkdyb3VwQ29udGV4dDtcblRyYW5zaXRpb24ucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8ge1xuICAvKipcbiAgICogQSBSZWFjdCByZWZlcmVuY2UgdG8gRE9NIGVsZW1lbnQgdGhhdCBuZWVkIHRvIHRyYW5zaXRpb246XG4gICAqIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS81MTEyNzEzMC80NjcxOTMyXG4gICAqXG4gICAqICAgLSBXaGVuIGBub2RlUmVmYCBwcm9wIGlzIHVzZWQsIGBub2RlYCBpcyBub3QgcGFzc2VkIHRvIGNhbGxiYWNrIGZ1bmN0aW9uc1xuICAgKiAgICAgIChlLmcuIGBvbkVudGVyYCkgYmVjYXVzZSB1c2VyIGFscmVhZHkgaGFzIGRpcmVjdCBhY2Nlc3MgdG8gdGhlIG5vZGUuXG4gICAqICAgLSBXaGVuIGNoYW5naW5nIGBrZXlgIHByb3Agb2YgYFRyYW5zaXRpb25gIGluIGEgYFRyYW5zaXRpb25Hcm91cGAgYSBuZXdcbiAgICogICAgIGBub2RlUmVmYCBuZWVkIHRvIGJlIHByb3ZpZGVkIHRvIGBUcmFuc2l0aW9uYCB3aXRoIGNoYW5nZWQgYGtleWAgcHJvcFxuICAgKiAgICAgKHNlZVxuICAgKiAgICAgW3Rlc3QvQ1NTVHJhbnNpdGlvbi10ZXN0LmpzXShodHRwczovL2dpdGh1Yi5jb20vcmVhY3Rqcy9yZWFjdC10cmFuc2l0aW9uLWdyb3VwL2Jsb2IvMTM0MzVmODk3YjNhYjcxZjZlMTlkNzI0ZjE0NTU5NmY1OTEwNTgxYy90ZXN0L0NTU1RyYW5zaXRpb24tdGVzdC5qcyNMMzYyLUw0MzcpKS5cbiAgICovXG4gIG5vZGVSZWY6IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgY3VycmVudDogdHlwZW9mIEVsZW1lbnQgPT09ICd1bmRlZmluZWQnID8gUHJvcFR5cGVzLmFueSA6IGZ1bmN0aW9uIChwcm9wVmFsdWUsIGtleSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSwgc2VjcmV0KSB7XG4gICAgICB2YXIgdmFsdWUgPSBwcm9wVmFsdWVba2V5XTtcbiAgICAgIHJldHVybiBQcm9wVHlwZXMuaW5zdGFuY2VPZih2YWx1ZSAmJiAnb3duZXJEb2N1bWVudCcgaW4gdmFsdWUgPyB2YWx1ZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LkVsZW1lbnQgOiBFbGVtZW50KShwcm9wVmFsdWUsIGtleSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSwgc2VjcmV0KTtcbiAgICB9XG4gIH0pLFxuXG4gIC8qKlxuICAgKiBBIGBmdW5jdGlvbmAgY2hpbGQgY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBhIFJlYWN0IGVsZW1lbnQuIFRoaXMgZnVuY3Rpb24gaXNcbiAgICogY2FsbGVkIHdpdGggdGhlIGN1cnJlbnQgdHJhbnNpdGlvbiBzdGF0dXMgKGAnZW50ZXJpbmcnYCwgYCdlbnRlcmVkJ2AsXG4gICAqIGAnZXhpdGluZydgLCBgJ2V4aXRlZCdgKSwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gYXBwbHkgY29udGV4dFxuICAgKiBzcGVjaWZpYyBwcm9wcyB0byBhIGNvbXBvbmVudC5cbiAgICpcbiAgICogYGBganN4XG4gICAqIDxUcmFuc2l0aW9uIGluPXt0aGlzLnN0YXRlLmlufSB0aW1lb3V0PXsxNTB9PlxuICAgKiAgIHtzdGF0ZSA9PiAoXG4gICAqICAgICA8TXlDb21wb25lbnQgY2xhc3NOYW1lPXtgZmFkZSBmYWRlLSR7c3RhdGV9YH0gLz5cbiAgICogICApfVxuICAgKiA8L1RyYW5zaXRpb24+XG4gICAqIGBgYFxuICAgKi9cbiAgY2hpbGRyZW46IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsIFByb3BUeXBlcy5lbGVtZW50LmlzUmVxdWlyZWRdKS5pc1JlcXVpcmVkLFxuXG4gIC8qKlxuICAgKiBTaG93IHRoZSBjb21wb25lbnQ7IHRyaWdnZXJzIHRoZSBlbnRlciBvciBleGl0IHN0YXRlc1xuICAgKi9cbiAgaW46IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBCeSBkZWZhdWx0IHRoZSBjaGlsZCBjb21wb25lbnQgaXMgbW91bnRlZCBpbW1lZGlhdGVseSBhbG9uZyB3aXRoXG4gICAqIHRoZSBwYXJlbnQgYFRyYW5zaXRpb25gIGNvbXBvbmVudC4gSWYgeW91IHdhbnQgdG8gXCJsYXp5IG1vdW50XCIgdGhlIGNvbXBvbmVudCBvbiB0aGVcbiAgICogZmlyc3QgYGluPXt0cnVlfWAgeW91IGNhbiBzZXQgYG1vdW50T25FbnRlcmAuIEFmdGVyIHRoZSBmaXJzdCBlbnRlciB0cmFuc2l0aW9uIHRoZSBjb21wb25lbnQgd2lsbCBzdGF5XG4gICAqIG1vdW50ZWQsIGV2ZW4gb24gXCJleGl0ZWRcIiwgdW5sZXNzIHlvdSBhbHNvIHNwZWNpZnkgYHVubW91bnRPbkV4aXRgLlxuICAgKi9cbiAgbW91bnRPbkVudGVyOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogQnkgZGVmYXVsdCB0aGUgY2hpbGQgY29tcG9uZW50IHN0YXlzIG1vdW50ZWQgYWZ0ZXIgaXQgcmVhY2hlcyB0aGUgYCdleGl0ZWQnYCBzdGF0ZS5cbiAgICogU2V0IGB1bm1vdW50T25FeGl0YCBpZiB5b3UnZCBwcmVmZXIgdG8gdW5tb3VudCB0aGUgY29tcG9uZW50IGFmdGVyIGl0IGZpbmlzaGVzIGV4aXRpbmcuXG4gICAqL1xuICB1bm1vdW50T25FeGl0OiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogQnkgZGVmYXVsdCB0aGUgY2hpbGQgY29tcG9uZW50IGRvZXMgbm90IHBlcmZvcm0gdGhlIGVudGVyIHRyYW5zaXRpb24gd2hlblxuICAgKiBpdCBmaXJzdCBtb3VudHMsIHJlZ2FyZGxlc3Mgb2YgdGhlIHZhbHVlIG9mIGBpbmAuIElmIHlvdSB3YW50IHRoaXNcbiAgICogYmVoYXZpb3IsIHNldCBib3RoIGBhcHBlYXJgIGFuZCBgaW5gIHRvIGB0cnVlYC5cbiAgICpcbiAgICogPiAqKk5vdGUqKjogdGhlcmUgYXJlIG5vIHNwZWNpYWwgYXBwZWFyIHN0YXRlcyBsaWtlIGBhcHBlYXJpbmdgL2BhcHBlYXJlZGAsIHRoaXMgcHJvcFxuICAgKiA+IG9ubHkgYWRkcyBhbiBhZGRpdGlvbmFsIGVudGVyIHRyYW5zaXRpb24uIEhvd2V2ZXIsIGluIHRoZVxuICAgKiA+IGA8Q1NTVHJhbnNpdGlvbj5gIGNvbXBvbmVudCB0aGF0IGZpcnN0IGVudGVyIHRyYW5zaXRpb24gZG9lcyByZXN1bHQgaW5cbiAgICogPiBhZGRpdGlvbmFsIGAuYXBwZWFyLSpgIGNsYXNzZXMsIHRoYXQgd2F5IHlvdSBjYW4gY2hvb3NlIHRvIHN0eWxlIGl0XG4gICAqID4gZGlmZmVyZW50bHkuXG4gICAqL1xuICBhcHBlYXI6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBFbmFibGUgb3IgZGlzYWJsZSBlbnRlciB0cmFuc2l0aW9ucy5cbiAgICovXG4gIGVudGVyOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogRW5hYmxlIG9yIGRpc2FibGUgZXhpdCB0cmFuc2l0aW9ucy5cbiAgICovXG4gIGV4aXQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBUaGUgZHVyYXRpb24gb2YgdGhlIHRyYW5zaXRpb24sIGluIG1pbGxpc2Vjb25kcy5cbiAgICogUmVxdWlyZWQgdW5sZXNzIGBhZGRFbmRMaXN0ZW5lcmAgaXMgcHJvdmlkZWQuXG4gICAqXG4gICAqIFlvdSBtYXkgc3BlY2lmeSBhIHNpbmdsZSB0aW1lb3V0IGZvciBhbGwgdHJhbnNpdGlvbnM6XG4gICAqXG4gICAqIGBgYGpzeFxuICAgKiB0aW1lb3V0PXs1MDB9XG4gICAqIGBgYFxuICAgKlxuICAgKiBvciBpbmRpdmlkdWFsbHk6XG4gICAqXG4gICAqIGBgYGpzeFxuICAgKiB0aW1lb3V0PXt7XG4gICAqICBhcHBlYXI6IDUwMCxcbiAgICogIGVudGVyOiAzMDAsXG4gICAqICBleGl0OiA1MDAsXG4gICAqIH19XG4gICAqIGBgYFxuICAgKlxuICAgKiAtIGBhcHBlYXJgIGRlZmF1bHRzIHRvIHRoZSB2YWx1ZSBvZiBgZW50ZXJgXG4gICAqIC0gYGVudGVyYCBkZWZhdWx0cyB0byBgMGBcbiAgICogLSBgZXhpdGAgZGVmYXVsdHMgdG8gYDBgXG4gICAqXG4gICAqIEB0eXBlIHtudW1iZXIgfCB7IGVudGVyPzogbnVtYmVyLCBleGl0PzogbnVtYmVyLCBhcHBlYXI/OiBudW1iZXIgfX1cbiAgICovXG4gIHRpbWVvdXQ6IGZ1bmN0aW9uIHRpbWVvdXQocHJvcHMpIHtcbiAgICB2YXIgcHQgPSB0aW1lb3V0c1NoYXBlO1xuICAgIGlmICghcHJvcHMuYWRkRW5kTGlzdGVuZXIpIHB0ID0gcHQuaXNSZXF1aXJlZDtcblxuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIHJldHVybiBwdC5hcHBseSh2b2lkIDAsIFtwcm9wc10uY29uY2F0KGFyZ3MpKTtcbiAgfSxcblxuICAvKipcbiAgICogQWRkIGEgY3VzdG9tIHRyYW5zaXRpb24gZW5kIHRyaWdnZXIuIENhbGxlZCB3aXRoIHRoZSB0cmFuc2l0aW9uaW5nXG4gICAqIERPTSBub2RlIGFuZCBhIGBkb25lYCBjYWxsYmFjay4gQWxsb3dzIGZvciBtb3JlIGZpbmUgZ3JhaW5lZCB0cmFuc2l0aW9uIGVuZFxuICAgKiBsb2dpYy4gVGltZW91dHMgYXJlIHN0aWxsIHVzZWQgYXMgYSBmYWxsYmFjayBpZiBwcm92aWRlZC5cbiAgICpcbiAgICogKipOb3RlKio6IHdoZW4gYG5vZGVSZWZgIHByb3AgaXMgcGFzc2VkLCBgbm9kZWAgaXMgbm90IHBhc3NlZC5cbiAgICpcbiAgICogYGBganN4XG4gICAqIGFkZEVuZExpc3RlbmVyPXsobm9kZSwgZG9uZSkgPT4ge1xuICAgKiAgIC8vIHVzZSB0aGUgY3NzIHRyYW5zaXRpb25lbmQgZXZlbnQgdG8gbWFyayB0aGUgZmluaXNoIG9mIGEgdHJhbnNpdGlvblxuICAgKiAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsIGRvbmUsIGZhbHNlKTtcbiAgICogfX1cbiAgICogYGBgXG4gICAqL1xuICBhZGRFbmRMaXN0ZW5lcjogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIGZpcmVkIGJlZm9yZSB0aGUgXCJlbnRlcmluZ1wiIHN0YXR1cyBpcyBhcHBsaWVkLiBBbiBleHRyYSBwYXJhbWV0ZXJcbiAgICogYGlzQXBwZWFyaW5nYCBpcyBzdXBwbGllZCB0byBpbmRpY2F0ZSBpZiB0aGUgZW50ZXIgc3RhZ2UgaXMgb2NjdXJyaW5nIG9uIHRoZSBpbml0aWFsIG1vdW50XG4gICAqXG4gICAqICoqTm90ZSoqOiB3aGVuIGBub2RlUmVmYCBwcm9wIGlzIHBhc3NlZCwgYG5vZGVgIGlzIG5vdCBwYXNzZWQuXG4gICAqXG4gICAqIEB0eXBlIEZ1bmN0aW9uKG5vZGU6IEh0bWxFbGVtZW50LCBpc0FwcGVhcmluZzogYm9vbCkgLT4gdm9pZFxuICAgKi9cbiAgb25FbnRlcjogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIGZpcmVkIGFmdGVyIHRoZSBcImVudGVyaW5nXCIgc3RhdHVzIGlzIGFwcGxpZWQuIEFuIGV4dHJhIHBhcmFtZXRlclxuICAgKiBgaXNBcHBlYXJpbmdgIGlzIHN1cHBsaWVkIHRvIGluZGljYXRlIGlmIHRoZSBlbnRlciBzdGFnZSBpcyBvY2N1cnJpbmcgb24gdGhlIGluaXRpYWwgbW91bnRcbiAgICpcbiAgICogKipOb3RlKio6IHdoZW4gYG5vZGVSZWZgIHByb3AgaXMgcGFzc2VkLCBgbm9kZWAgaXMgbm90IHBhc3NlZC5cbiAgICpcbiAgICogQHR5cGUgRnVuY3Rpb24obm9kZTogSHRtbEVsZW1lbnQsIGlzQXBwZWFyaW5nOiBib29sKVxuICAgKi9cbiAgb25FbnRlcmluZzogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIGZpcmVkIGFmdGVyIHRoZSBcImVudGVyZWRcIiBzdGF0dXMgaXMgYXBwbGllZC4gQW4gZXh0cmEgcGFyYW1ldGVyXG4gICAqIGBpc0FwcGVhcmluZ2AgaXMgc3VwcGxpZWQgdG8gaW5kaWNhdGUgaWYgdGhlIGVudGVyIHN0YWdlIGlzIG9jY3VycmluZyBvbiB0aGUgaW5pdGlhbCBtb3VudFxuICAgKlxuICAgKiAqKk5vdGUqKjogd2hlbiBgbm9kZVJlZmAgcHJvcCBpcyBwYXNzZWQsIGBub2RlYCBpcyBub3QgcGFzc2VkLlxuICAgKlxuICAgKiBAdHlwZSBGdW5jdGlvbihub2RlOiBIdG1sRWxlbWVudCwgaXNBcHBlYXJpbmc6IGJvb2wpIC0+IHZvaWRcbiAgICovXG4gIG9uRW50ZXJlZDogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIGZpcmVkIGJlZm9yZSB0aGUgXCJleGl0aW5nXCIgc3RhdHVzIGlzIGFwcGxpZWQuXG4gICAqXG4gICAqICoqTm90ZSoqOiB3aGVuIGBub2RlUmVmYCBwcm9wIGlzIHBhc3NlZCwgYG5vZGVgIGlzIG5vdCBwYXNzZWQuXG4gICAqXG4gICAqIEB0eXBlIEZ1bmN0aW9uKG5vZGU6IEh0bWxFbGVtZW50KSAtPiB2b2lkXG4gICAqL1xuICBvbkV4aXQ6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayBmaXJlZCBhZnRlciB0aGUgXCJleGl0aW5nXCIgc3RhdHVzIGlzIGFwcGxpZWQuXG4gICAqXG4gICAqICoqTm90ZSoqOiB3aGVuIGBub2RlUmVmYCBwcm9wIGlzIHBhc3NlZCwgYG5vZGVgIGlzIG5vdCBwYXNzZWQuXG4gICAqXG4gICAqIEB0eXBlIEZ1bmN0aW9uKG5vZGU6IEh0bWxFbGVtZW50KSAtPiB2b2lkXG4gICAqL1xuICBvbkV4aXRpbmc6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayBmaXJlZCBhZnRlciB0aGUgXCJleGl0ZWRcIiBzdGF0dXMgaXMgYXBwbGllZC5cbiAgICpcbiAgICogKipOb3RlKio6IHdoZW4gYG5vZGVSZWZgIHByb3AgaXMgcGFzc2VkLCBgbm9kZWAgaXMgbm90IHBhc3NlZFxuICAgKlxuICAgKiBAdHlwZSBGdW5jdGlvbihub2RlOiBIdG1sRWxlbWVudCkgLT4gdm9pZFxuICAgKi9cbiAgb25FeGl0ZWQ6IFByb3BUeXBlcy5mdW5jXG59IDoge307IC8vIE5hbWUgdGhlIGZ1bmN0aW9uIHNvIGl0IGlzIGNsZWFyZXIgaW4gdGhlIGRvY3VtZW50YXRpb25cblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cblRyYW5zaXRpb24uZGVmYXVsdFByb3BzID0ge1xuICBpbjogZmFsc2UsXG4gIG1vdW50T25FbnRlcjogZmFsc2UsXG4gIHVubW91bnRPbkV4aXQ6IGZhbHNlLFxuICBhcHBlYXI6IGZhbHNlLFxuICBlbnRlcjogdHJ1ZSxcbiAgZXhpdDogdHJ1ZSxcbiAgb25FbnRlcjogbm9vcCxcbiAgb25FbnRlcmluZzogbm9vcCxcbiAgb25FbnRlcmVkOiBub29wLFxuICBvbkV4aXQ6IG5vb3AsXG4gIG9uRXhpdGluZzogbm9vcCxcbiAgb25FeGl0ZWQ6IG5vb3Bcbn07XG5UcmFuc2l0aW9uLlVOTU9VTlRFRCA9IFVOTU9VTlRFRDtcblRyYW5zaXRpb24uRVhJVEVEID0gRVhJVEVEO1xuVHJhbnNpdGlvbi5FTlRFUklORyA9IEVOVEVSSU5HO1xuVHJhbnNpdGlvbi5FTlRFUkVEID0gRU5URVJFRDtcblRyYW5zaXRpb24uRVhJVElORyA9IEVYSVRJTkc7XG5leHBvcnQgZGVmYXVsdCBUcmFuc2l0aW9uOyIsImV4cG9ydCBkZWZhdWx0ICEhKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5kb2N1bWVudCAmJiB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCk7IiwiLyogZXNsaW50LWRpc2FibGUgbm8tcmV0dXJuLWFzc2lnbiAqL1xuaW1wb3J0IGNhblVzZURPTSBmcm9tICcuL2NhblVzZURPTSc7XG5leHBvcnQgdmFyIG9wdGlvbnNTdXBwb3J0ZWQgPSBmYWxzZTtcbmV4cG9ydCB2YXIgb25jZVN1cHBvcnRlZCA9IGZhbHNlO1xuXG50cnkge1xuICB2YXIgb3B0aW9ucyA9IHtcbiAgICBnZXQgcGFzc2l2ZSgpIHtcbiAgICAgIHJldHVybiBvcHRpb25zU3VwcG9ydGVkID0gdHJ1ZTtcbiAgICB9LFxuXG4gICAgZ2V0IG9uY2UoKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbXVsdGktYXNzaWduXG4gICAgICByZXR1cm4gb25jZVN1cHBvcnRlZCA9IG9wdGlvbnNTdXBwb3J0ZWQgPSB0cnVlO1xuICAgIH1cblxuICB9O1xuXG4gIGlmIChjYW5Vc2VET00pIHtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndGVzdCcsIG9wdGlvbnMsIG9wdGlvbnMpO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCd0ZXN0Jywgb3B0aW9ucywgdHJ1ZSk7XG4gIH1cbn0gY2F0Y2ggKGUpIHtcbiAgLyogKi9cbn1cblxuLyoqXG4gKiBBbiBgYWRkRXZlbnRMaXN0ZW5lcmAgcG9ueWZpbGwsIHN1cHBvcnRzIHRoZSBgb25jZWAgb3B0aW9uXG4gKiBcbiAqIEBwYXJhbSBub2RlIHRoZSBlbGVtZW50XG4gKiBAcGFyYW0gZXZlbnROYW1lIHRoZSBldmVudCBuYW1lXG4gKiBAcGFyYW0gaGFuZGxlIHRoZSBoYW5kbGVyXG4gKiBAcGFyYW0gb3B0aW9ucyBldmVudCBvcHRpb25zXG4gKi9cbmZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXIobm9kZSwgZXZlbnROYW1lLCBoYW5kbGVyLCBvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zICYmIHR5cGVvZiBvcHRpb25zICE9PSAnYm9vbGVhbicgJiYgIW9uY2VTdXBwb3J0ZWQpIHtcbiAgICB2YXIgb25jZSA9IG9wdGlvbnMub25jZSxcbiAgICAgICAgY2FwdHVyZSA9IG9wdGlvbnMuY2FwdHVyZTtcbiAgICB2YXIgd3JhcHBlZEhhbmRsZXIgPSBoYW5kbGVyO1xuXG4gICAgaWYgKCFvbmNlU3VwcG9ydGVkICYmIG9uY2UpIHtcbiAgICAgIHdyYXBwZWRIYW5kbGVyID0gaGFuZGxlci5fX29uY2UgfHwgZnVuY3Rpb24gb25jZUhhbmRsZXIoZXZlbnQpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgb25jZUhhbmRsZXIsIGNhcHR1cmUpO1xuICAgICAgICBoYW5kbGVyLmNhbGwodGhpcywgZXZlbnQpO1xuICAgICAgfTtcblxuICAgICAgaGFuZGxlci5fX29uY2UgPSB3cmFwcGVkSGFuZGxlcjtcbiAgICB9XG5cbiAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCB3cmFwcGVkSGFuZGxlciwgb3B0aW9uc1N1cHBvcnRlZCA/IG9wdGlvbnMgOiBjYXB0dXJlKTtcbiAgfVxuXG4gIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGhhbmRsZXIsIG9wdGlvbnMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBhZGRFdmVudExpc3RlbmVyOyIsIi8qKlxuICogQSBgcmVtb3ZlRXZlbnRMaXN0ZW5lcmAgcG9ueWZpbGxcbiAqIFxuICogQHBhcmFtIG5vZGUgdGhlIGVsZW1lbnRcbiAqIEBwYXJhbSBldmVudE5hbWUgdGhlIGV2ZW50IG5hbWVcbiAqIEBwYXJhbSBoYW5kbGUgdGhlIGhhbmRsZXJcbiAqIEBwYXJhbSBvcHRpb25zIGV2ZW50IG9wdGlvbnNcbiAqL1xuZnVuY3Rpb24gcmVtb3ZlRXZlbnRMaXN0ZW5lcihub2RlLCBldmVudE5hbWUsIGhhbmRsZXIsIG9wdGlvbnMpIHtcbiAgdmFyIGNhcHR1cmUgPSBvcHRpb25zICYmIHR5cGVvZiBvcHRpb25zICE9PSAnYm9vbGVhbicgPyBvcHRpb25zLmNhcHR1cmUgOiBvcHRpb25zO1xuICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBoYW5kbGVyLCBjYXB0dXJlKTtcblxuICBpZiAoaGFuZGxlci5fX29uY2UpIHtcbiAgICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBoYW5kbGVyLl9fb25jZSwgY2FwdHVyZSk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgcmVtb3ZlRXZlbnRMaXN0ZW5lcjsiLCJpbXBvcnQgYWRkRXZlbnRMaXN0ZW5lciBmcm9tICcuL2FkZEV2ZW50TGlzdGVuZXInO1xuaW1wb3J0IHJlbW92ZUV2ZW50TGlzdGVuZXIgZnJvbSAnLi9yZW1vdmVFdmVudExpc3RlbmVyJztcblxuZnVuY3Rpb24gbGlzdGVuKG5vZGUsIGV2ZW50TmFtZSwgaGFuZGxlciwgb3B0aW9ucykge1xuICBhZGRFdmVudExpc3RlbmVyKG5vZGUsIGV2ZW50TmFtZSwgaGFuZGxlciwgb3B0aW9ucyk7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcihub2RlLCBldmVudE5hbWUsIGhhbmRsZXIsIG9wdGlvbnMpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBsaXN0ZW47IiwiLyoqXG4gKiBUcmlnZ2VycyBhbiBldmVudCBvbiBhIGdpdmVuIGVsZW1lbnQuXG4gKiBcbiAqIEBwYXJhbSBub2RlIHRoZSBlbGVtZW50XG4gKiBAcGFyYW0gZXZlbnROYW1lIHRoZSBldmVudCBuYW1lIHRvIHRyaWdnZXJcbiAqIEBwYXJhbSBidWJibGVzIHdoZXRoZXIgdGhlIGV2ZW50IHNob3VsZCBidWJibGUgdXBcbiAqIEBwYXJhbSBjYW5jZWxhYmxlIHdoZXRoZXIgdGhlIGV2ZW50IHNob3VsZCBiZSBjYW5jZWxhYmxlXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRyaWdnZXJFdmVudChub2RlLCBldmVudE5hbWUsIGJ1YmJsZXMsIGNhbmNlbGFibGUpIHtcbiAgaWYgKGJ1YmJsZXMgPT09IHZvaWQgMCkge1xuICAgIGJ1YmJsZXMgPSBmYWxzZTtcbiAgfVxuXG4gIGlmIChjYW5jZWxhYmxlID09PSB2b2lkIDApIHtcbiAgICBjYW5jZWxhYmxlID0gdHJ1ZTtcbiAgfVxuXG4gIGlmIChub2RlKSB7XG4gICAgdmFyIGV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0hUTUxFdmVudHMnKTtcbiAgICBldmVudC5pbml0RXZlbnQoZXZlbnROYW1lLCBidWJibGVzLCBjYW5jZWxhYmxlKTtcbiAgICBub2RlLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICB9XG59IiwiaW1wb3J0IGNzcyBmcm9tICcuL2Nzcyc7XG5pbXBvcnQgbGlzdGVuIGZyb20gJy4vbGlzdGVuJztcbmltcG9ydCB0cmlnZ2VyRXZlbnQgZnJvbSAnLi90cmlnZ2VyRXZlbnQnO1xuXG5mdW5jdGlvbiBwYXJzZUR1cmF0aW9uKG5vZGUpIHtcbiAgdmFyIHN0ciA9IGNzcyhub2RlLCAndHJhbnNpdGlvbkR1cmF0aW9uJykgfHwgJyc7XG4gIHZhciBtdWx0ID0gc3RyLmluZGV4T2YoJ21zJykgPT09IC0xID8gMTAwMCA6IDE7XG4gIHJldHVybiBwYXJzZUZsb2F0KHN0cikgKiBtdWx0O1xufVxuXG5mdW5jdGlvbiBlbXVsYXRlVHJhbnNpdGlvbkVuZChlbGVtZW50LCBkdXJhdGlvbiwgcGFkZGluZykge1xuICBpZiAocGFkZGluZyA9PT0gdm9pZCAwKSB7XG4gICAgcGFkZGluZyA9IDU7XG4gIH1cblxuICB2YXIgY2FsbGVkID0gZmFsc2U7XG4gIHZhciBoYW5kbGUgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIWNhbGxlZCkgdHJpZ2dlckV2ZW50KGVsZW1lbnQsICd0cmFuc2l0aW9uZW5kJywgdHJ1ZSk7XG4gIH0sIGR1cmF0aW9uICsgcGFkZGluZyk7XG4gIHZhciByZW1vdmUgPSBsaXN0ZW4oZWxlbWVudCwgJ3RyYW5zaXRpb25lbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgY2FsbGVkID0gdHJ1ZTtcbiAgfSwge1xuICAgIG9uY2U6IHRydWVcbiAgfSk7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgY2xlYXJUaW1lb3V0KGhhbmRsZSk7XG4gICAgcmVtb3ZlKCk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRyYW5zaXRpb25FbmQoZWxlbWVudCwgaGFuZGxlciwgZHVyYXRpb24sIHBhZGRpbmcpIHtcbiAgaWYgKGR1cmF0aW9uID09IG51bGwpIGR1cmF0aW9uID0gcGFyc2VEdXJhdGlvbihlbGVtZW50KSB8fCAwO1xuICB2YXIgcmVtb3ZlRW11bGF0ZSA9IGVtdWxhdGVUcmFuc2l0aW9uRW5kKGVsZW1lbnQsIGR1cmF0aW9uLCBwYWRkaW5nKTtcbiAgdmFyIHJlbW92ZSA9IGxpc3RlbihlbGVtZW50LCAndHJhbnNpdGlvbmVuZCcsIGhhbmRsZXIpO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHJlbW92ZUVtdWxhdGUoKTtcbiAgICByZW1vdmUoKTtcbiAgfTtcbn0iLCJpbXBvcnQgY3NzIGZyb20gJ2RvbS1oZWxwZXJzL2Nzcyc7XG5pbXBvcnQgdHJhbnNpdGlvbkVuZCBmcm9tICdkb20taGVscGVycy90cmFuc2l0aW9uRW5kJztcbmZ1bmN0aW9uIHBhcnNlRHVyYXRpb24obm9kZSwgcHJvcGVydHkpIHtcbiAgY29uc3Qgc3RyID0gY3NzKG5vZGUsIHByb3BlcnR5KSB8fCAnJztcbiAgY29uc3QgbXVsdCA9IHN0ci5pbmRleE9mKCdtcycpID09PSAtMSA/IDEwMDAgOiAxO1xuICByZXR1cm4gcGFyc2VGbG9hdChzdHIpICogbXVsdDtcbn1cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRyYW5zaXRpb25FbmRMaXN0ZW5lcihlbGVtZW50LCBoYW5kbGVyKSB7XG4gIGNvbnN0IGR1cmF0aW9uID0gcGFyc2VEdXJhdGlvbihlbGVtZW50LCAndHJhbnNpdGlvbkR1cmF0aW9uJyk7XG4gIGNvbnN0IGRlbGF5ID0gcGFyc2VEdXJhdGlvbihlbGVtZW50LCAndHJhbnNpdGlvbkRlbGF5Jyk7XG4gIGNvbnN0IHJlbW92ZSA9IHRyYW5zaXRpb25FbmQoZWxlbWVudCwgZSA9PiB7XG4gICAgaWYgKGUudGFyZ2V0ID09PSBlbGVtZW50KSB7XG4gICAgICByZW1vdmUoKTtcbiAgICAgIGhhbmRsZXIoZSk7XG4gICAgfVxuICB9LCBkdXJhdGlvbiArIGRlbGF5KTtcbn0iLCIvKipcbiAqIFNhZmUgY2hhaW5lZCBmdW5jdGlvblxuICpcbiAqIFdpbGwgb25seSBjcmVhdGUgYSBuZXcgZnVuY3Rpb24gaWYgbmVlZGVkLFxuICogb3RoZXJ3aXNlIHdpbGwgcGFzcyBiYWNrIGV4aXN0aW5nIGZ1bmN0aW9ucyBvciBudWxsLlxuICpcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGZ1bmN0aW9ucyB0byBjaGFpblxuICogQHJldHVybnMge2Z1bmN0aW9ufG51bGx9XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUNoYWluZWRGdW5jdGlvbiguLi5mdW5jcykge1xuICByZXR1cm4gZnVuY3MuZmlsdGVyKGYgPT4gZiAhPSBudWxsKS5yZWR1Y2UoKGFjYywgZikgPT4ge1xuICAgIGlmICh0eXBlb2YgZiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIEFyZ3VtZW50IFR5cGUsIG11c3Qgb25seSBwcm92aWRlIGZ1bmN0aW9ucywgdW5kZWZpbmVkLCBvciBudWxsLicpO1xuICAgIH1cbiAgICBpZiAoYWNjID09PSBudWxsKSByZXR1cm4gZjtcbiAgICByZXR1cm4gZnVuY3Rpb24gY2hhaW5lZEZ1bmN0aW9uKC4uLmFyZ3MpIHtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGFjYy5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGYuYXBwbHkodGhpcywgYXJncyk7XG4gICAgfTtcbiAgfSwgbnVsbCk7XG59XG5leHBvcnQgZGVmYXVsdCBjcmVhdGVDaGFpbmVkRnVuY3Rpb247IiwiLy8gcmVhZGluZyBhIGRpbWVuc2lvbiBwcm9wIHdpbGwgY2F1c2UgdGhlIGJyb3dzZXIgdG8gcmVjYWxjdWxhdGUsXG4vLyB3aGljaCB3aWxsIGxldCBvdXIgYW5pbWF0aW9ucyB3b3JrXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0cmlnZ2VyQnJvd3NlclJlZmxvdyhub2RlKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLWV4cHJlc3Npb25zXG4gIG5vZGUub2Zmc2V0SGVpZ2h0O1xufSIsImltcG9ydCB7IHVzZU1lbW8gfSBmcm9tICdyZWFjdCc7XG5jb25zdCB0b0ZuUmVmID0gcmVmID0+ICFyZWYgfHwgdHlwZW9mIHJlZiA9PT0gJ2Z1bmN0aW9uJyA/IHJlZiA6IHZhbHVlID0+IHtcbiAgcmVmLmN1cnJlbnQgPSB2YWx1ZTtcbn07XG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VSZWZzKHJlZkEsIHJlZkIpIHtcbiAgY29uc3QgYSA9IHRvRm5SZWYocmVmQSk7XG4gIGNvbnN0IGIgPSB0b0ZuUmVmKHJlZkIpO1xuICByZXR1cm4gdmFsdWUgPT4ge1xuICAgIGlmIChhKSBhKHZhbHVlKTtcbiAgICBpZiAoYikgYih2YWx1ZSk7XG4gIH07XG59XG5cbi8qKlxuICogQ3JlYXRlIGFuZCByZXR1cm5zIGEgc2luZ2xlIGNhbGxiYWNrIHJlZiBjb21wb3NlZCBmcm9tIHR3byBvdGhlciBSZWZzLlxuICpcbiAqIGBgYHRzeFxuICogY29uc3QgQnV0dG9uID0gUmVhY3QuZm9yd2FyZFJlZigocHJvcHMsIHJlZikgPT4ge1xuICogICBjb25zdCBbZWxlbWVudCwgYXR0YWNoUmVmXSA9IHVzZUNhbGxiYWNrUmVmPEhUTUxCdXR0b25FbGVtZW50PigpO1xuICogICBjb25zdCBtZXJnZWRSZWYgPSB1c2VNZXJnZWRSZWZzKHJlZiwgYXR0YWNoUmVmKTtcbiAqXG4gKiAgIHJldHVybiA8YnV0dG9uIHJlZj17bWVyZ2VkUmVmfSB7Li4ucHJvcHN9Lz5cbiAqIH0pXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gcmVmQSBBIENhbGxiYWNrIG9yIG11dGFibGUgUmVmXG4gKiBAcGFyYW0gcmVmQiBBIENhbGxiYWNrIG9yIG11dGFibGUgUmVmXG4gKiBAY2F0ZWdvcnkgcmVmc1xuICovXG5mdW5jdGlvbiB1c2VNZXJnZWRSZWZzKHJlZkEsIHJlZkIpIHtcbiAgcmV0dXJuIHVzZU1lbW8oKCkgPT4gbWVyZ2VSZWZzKHJlZkEsIHJlZkIpLCBbcmVmQSwgcmVmQl0pO1xufVxuZXhwb3J0IGRlZmF1bHQgdXNlTWVyZ2VkUmVmczsiLCJpbXBvcnQgUmVhY3RET00gZnJvbSAncmVhY3QtZG9tJztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHNhZmVGaW5kRE9NTm9kZShjb21wb25lbnRPckVsZW1lbnQpIHtcbiAgaWYgKGNvbXBvbmVudE9yRWxlbWVudCAmJiAnc2V0U3RhdGUnIGluIGNvbXBvbmVudE9yRWxlbWVudCkge1xuICAgIHJldHVybiBSZWFjdERPTS5maW5kRE9NTm9kZShjb21wb25lbnRPckVsZW1lbnQpO1xuICB9XG4gIHJldHVybiBjb21wb25lbnRPckVsZW1lbnQgIT0gbnVsbCA/IGNvbXBvbmVudE9yRWxlbWVudCA6IG51bGw7XG59IiwiXCJ1c2UgY2xpZW50XCI7XG5cbmltcG9ydCBSZWFjdCwgeyB1c2VDYWxsYmFjaywgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFRyYW5zaXRpb24gZnJvbSAncmVhY3QtdHJhbnNpdGlvbi1ncm91cC9UcmFuc2l0aW9uJztcbmltcG9ydCB1c2VNZXJnZWRSZWZzIGZyb20gJ0ByZXN0YXJ0L2hvb2tzL3VzZU1lcmdlZFJlZnMnO1xuaW1wb3J0IHNhZmVGaW5kRE9NTm9kZSBmcm9tICcuL3NhZmVGaW5kRE9NTm9kZSc7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuLy8gTm9ybWFsaXplcyBUcmFuc2l0aW9uIGNhbGxiYWNrcyB3aGVuIG5vZGVSZWYgaXMgdXNlZC5cbmNvbnN0IFRyYW5zaXRpb25XcmFwcGVyID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHtcbiAgb25FbnRlcixcbiAgb25FbnRlcmluZyxcbiAgb25FbnRlcmVkLFxuICBvbkV4aXQsXG4gIG9uRXhpdGluZyxcbiAgb25FeGl0ZWQsXG4gIGFkZEVuZExpc3RlbmVyLFxuICBjaGlsZHJlbixcbiAgY2hpbGRSZWYsXG4gIC4uLnByb3BzXG59LCByZWYpID0+IHtcbiAgY29uc3Qgbm9kZVJlZiA9IHVzZVJlZihudWxsKTtcbiAgY29uc3QgbWVyZ2VkUmVmID0gdXNlTWVyZ2VkUmVmcyhub2RlUmVmLCBjaGlsZFJlZik7XG4gIGNvbnN0IGF0dGFjaFJlZiA9IHIgPT4ge1xuICAgIG1lcmdlZFJlZihzYWZlRmluZERPTU5vZGUocikpO1xuICB9O1xuICBjb25zdCBub3JtYWxpemUgPSBjYWxsYmFjayA9PiBwYXJhbSA9PiB7XG4gICAgaWYgKGNhbGxiYWNrICYmIG5vZGVSZWYuY3VycmVudCkge1xuICAgICAgY2FsbGJhY2sobm9kZVJlZi5jdXJyZW50LCBwYXJhbSk7XG4gICAgfVxuICB9O1xuXG4gIC8qIGVzbGludC1kaXNhYmxlIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwcyAqL1xuICBjb25zdCBoYW5kbGVFbnRlciA9IHVzZUNhbGxiYWNrKG5vcm1hbGl6ZShvbkVudGVyKSwgW29uRW50ZXJdKTtcbiAgY29uc3QgaGFuZGxlRW50ZXJpbmcgPSB1c2VDYWxsYmFjayhub3JtYWxpemUob25FbnRlcmluZyksIFtvbkVudGVyaW5nXSk7XG4gIGNvbnN0IGhhbmRsZUVudGVyZWQgPSB1c2VDYWxsYmFjayhub3JtYWxpemUob25FbnRlcmVkKSwgW29uRW50ZXJlZF0pO1xuICBjb25zdCBoYW5kbGVFeGl0ID0gdXNlQ2FsbGJhY2sobm9ybWFsaXplKG9uRXhpdCksIFtvbkV4aXRdKTtcbiAgY29uc3QgaGFuZGxlRXhpdGluZyA9IHVzZUNhbGxiYWNrKG5vcm1hbGl6ZShvbkV4aXRpbmcpLCBbb25FeGl0aW5nXSk7XG4gIGNvbnN0IGhhbmRsZUV4aXRlZCA9IHVzZUNhbGxiYWNrKG5vcm1hbGl6ZShvbkV4aXRlZCksIFtvbkV4aXRlZF0pO1xuICBjb25zdCBoYW5kbGVBZGRFbmRMaXN0ZW5lciA9IHVzZUNhbGxiYWNrKG5vcm1hbGl6ZShhZGRFbmRMaXN0ZW5lciksIFthZGRFbmRMaXN0ZW5lcl0pO1xuICAvKiBlc2xpbnQtZW5hYmxlIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwcyAqL1xuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChUcmFuc2l0aW9uLCB7XG4gICAgcmVmOiByZWYsXG4gICAgLi4ucHJvcHMsXG4gICAgb25FbnRlcjogaGFuZGxlRW50ZXIsXG4gICAgb25FbnRlcmVkOiBoYW5kbGVFbnRlcmVkLFxuICAgIG9uRW50ZXJpbmc6IGhhbmRsZUVudGVyaW5nLFxuICAgIG9uRXhpdDogaGFuZGxlRXhpdCxcbiAgICBvbkV4aXRlZDogaGFuZGxlRXhpdGVkLFxuICAgIG9uRXhpdGluZzogaGFuZGxlRXhpdGluZyxcbiAgICBhZGRFbmRMaXN0ZW5lcjogaGFuZGxlQWRkRW5kTGlzdGVuZXIsXG4gICAgbm9kZVJlZjogbm9kZVJlZixcbiAgICBjaGlsZHJlbjogdHlwZW9mIGNoaWxkcmVuID09PSAnZnVuY3Rpb24nID8gKHN0YXR1cywgaW5uZXJQcm9wcykgPT5cbiAgICAvLyBUT0RPOiBUeXBlcyBmb3IgUlRHIG1pc3NpbmcgaW5uZXJQcm9wcywgc28gbmVlZCB0byBjYXN0LlxuICAgIGNoaWxkcmVuKHN0YXR1cywge1xuICAgICAgLi4uaW5uZXJQcm9wcyxcbiAgICAgIHJlZjogYXR0YWNoUmVmXG4gICAgfSkgOiAvKiNfX1BVUkVfXyovUmVhY3QuY2xvbmVFbGVtZW50KGNoaWxkcmVuLCB7XG4gICAgICByZWY6IGF0dGFjaFJlZlxuICAgIH0pXG4gIH0pO1xufSk7XG5leHBvcnQgZGVmYXVsdCBUcmFuc2l0aW9uV3JhcHBlcjsiLCJpbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBjc3MgZnJvbSAnZG9tLWhlbHBlcnMvY3NzJztcbmltcG9ydCBSZWFjdCwgeyB1c2VNZW1vIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgRU5URVJFRCwgRU5URVJJTkcsIEVYSVRFRCwgRVhJVElORyB9IGZyb20gJ3JlYWN0LXRyYW5zaXRpb24tZ3JvdXAvVHJhbnNpdGlvbic7XG5pbXBvcnQgdHJhbnNpdGlvbkVuZExpc3RlbmVyIGZyb20gJy4vdHJhbnNpdGlvbkVuZExpc3RlbmVyJztcbmltcG9ydCBjcmVhdGVDaGFpbmVkRnVuY3Rpb24gZnJvbSAnLi9jcmVhdGVDaGFpbmVkRnVuY3Rpb24nO1xuaW1wb3J0IHRyaWdnZXJCcm93c2VyUmVmbG93IGZyb20gJy4vdHJpZ2dlckJyb3dzZXJSZWZsb3cnO1xuaW1wb3J0IFRyYW5zaXRpb25XcmFwcGVyIGZyb20gJy4vVHJhbnNpdGlvbldyYXBwZXInO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmNvbnN0IE1BUkdJTlMgPSB7XG4gIGhlaWdodDogWydtYXJnaW5Ub3AnLCAnbWFyZ2luQm90dG9tJ10sXG4gIHdpZHRoOiBbJ21hcmdpbkxlZnQnLCAnbWFyZ2luUmlnaHQnXVxufTtcbmZ1bmN0aW9uIGdldERlZmF1bHREaW1lbnNpb25WYWx1ZShkaW1lbnNpb24sIGVsZW0pIHtcbiAgY29uc3Qgb2Zmc2V0ID0gYG9mZnNldCR7ZGltZW5zaW9uWzBdLnRvVXBwZXJDYXNlKCl9JHtkaW1lbnNpb24uc2xpY2UoMSl9YDtcbiAgY29uc3QgdmFsdWUgPSBlbGVtW29mZnNldF07XG4gIGNvbnN0IG1hcmdpbnMgPSBNQVJHSU5TW2RpbWVuc2lvbl07XG4gIHJldHVybiB2YWx1ZSArXG4gIC8vIEB0cy1pZ25vcmVcbiAgcGFyc2VJbnQoY3NzKGVsZW0sIG1hcmdpbnNbMF0pLCAxMCkgK1xuICAvLyBAdHMtaWdub3JlXG4gIHBhcnNlSW50KGNzcyhlbGVtLCBtYXJnaW5zWzFdKSwgMTApO1xufVxuY29uc3QgY29sbGFwc2VTdHlsZXMgPSB7XG4gIFtFWElURURdOiAnY29sbGFwc2UnLFxuICBbRVhJVElOR106ICdjb2xsYXBzaW5nJyxcbiAgW0VOVEVSSU5HXTogJ2NvbGxhcHNpbmcnLFxuICBbRU5URVJFRF06ICdjb2xsYXBzZSBzaG93J1xufTtcbmNvbnN0IENvbGxhcHNlID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHtcbiAgb25FbnRlcixcbiAgb25FbnRlcmluZyxcbiAgb25FbnRlcmVkLFxuICBvbkV4aXQsXG4gIG9uRXhpdGluZyxcbiAgY2xhc3NOYW1lLFxuICBjaGlsZHJlbixcbiAgZGltZW5zaW9uID0gJ2hlaWdodCcsXG4gIGluOiBpblByb3AgPSBmYWxzZSxcbiAgdGltZW91dCA9IDMwMCxcbiAgbW91bnRPbkVudGVyID0gZmFsc2UsXG4gIHVubW91bnRPbkV4aXQgPSBmYWxzZSxcbiAgYXBwZWFyID0gZmFsc2UsXG4gIGdldERpbWVuc2lvblZhbHVlID0gZ2V0RGVmYXVsdERpbWVuc2lvblZhbHVlLFxuICAuLi5wcm9wc1xufSwgcmVmKSA9PiB7XG4gIC8qIENvbXB1dGUgZGltZW5zaW9uICovXG4gIGNvbnN0IGNvbXB1dGVkRGltZW5zaW9uID0gdHlwZW9mIGRpbWVuc2lvbiA9PT0gJ2Z1bmN0aW9uJyA/IGRpbWVuc2lvbigpIDogZGltZW5zaW9uO1xuXG4gIC8qIC0tIEV4cGFuZGluZyAtLSAqL1xuICBjb25zdCBoYW5kbGVFbnRlciA9IHVzZU1lbW8oKCkgPT4gY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uKGVsZW0gPT4ge1xuICAgIGVsZW0uc3R5bGVbY29tcHV0ZWREaW1lbnNpb25dID0gJzAnO1xuICB9LCBvbkVudGVyKSwgW2NvbXB1dGVkRGltZW5zaW9uLCBvbkVudGVyXSk7XG4gIGNvbnN0IGhhbmRsZUVudGVyaW5nID0gdXNlTWVtbygoKSA9PiBjcmVhdGVDaGFpbmVkRnVuY3Rpb24oZWxlbSA9PiB7XG4gICAgY29uc3Qgc2Nyb2xsID0gYHNjcm9sbCR7Y29tcHV0ZWREaW1lbnNpb25bMF0udG9VcHBlckNhc2UoKX0ke2NvbXB1dGVkRGltZW5zaW9uLnNsaWNlKDEpfWA7XG4gICAgZWxlbS5zdHlsZVtjb21wdXRlZERpbWVuc2lvbl0gPSBgJHtlbGVtW3Njcm9sbF19cHhgO1xuICB9LCBvbkVudGVyaW5nKSwgW2NvbXB1dGVkRGltZW5zaW9uLCBvbkVudGVyaW5nXSk7XG4gIGNvbnN0IGhhbmRsZUVudGVyZWQgPSB1c2VNZW1vKCgpID0+IGNyZWF0ZUNoYWluZWRGdW5jdGlvbihlbGVtID0+IHtcbiAgICBlbGVtLnN0eWxlW2NvbXB1dGVkRGltZW5zaW9uXSA9IG51bGw7XG4gIH0sIG9uRW50ZXJlZCksIFtjb21wdXRlZERpbWVuc2lvbiwgb25FbnRlcmVkXSk7XG5cbiAgLyogLS0gQ29sbGFwc2luZyAtLSAqL1xuICBjb25zdCBoYW5kbGVFeGl0ID0gdXNlTWVtbygoKSA9PiBjcmVhdGVDaGFpbmVkRnVuY3Rpb24oZWxlbSA9PiB7XG4gICAgZWxlbS5zdHlsZVtjb21wdXRlZERpbWVuc2lvbl0gPSBgJHtnZXREaW1lbnNpb25WYWx1ZShjb21wdXRlZERpbWVuc2lvbiwgZWxlbSl9cHhgO1xuICAgIHRyaWdnZXJCcm93c2VyUmVmbG93KGVsZW0pO1xuICB9LCBvbkV4aXQpLCBbb25FeGl0LCBnZXREaW1lbnNpb25WYWx1ZSwgY29tcHV0ZWREaW1lbnNpb25dKTtcbiAgY29uc3QgaGFuZGxlRXhpdGluZyA9IHVzZU1lbW8oKCkgPT4gY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uKGVsZW0gPT4ge1xuICAgIGVsZW0uc3R5bGVbY29tcHV0ZWREaW1lbnNpb25dID0gbnVsbDtcbiAgfSwgb25FeGl0aW5nKSwgW2NvbXB1dGVkRGltZW5zaW9uLCBvbkV4aXRpbmddKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KFRyYW5zaXRpb25XcmFwcGVyLCB7XG4gICAgcmVmOiByZWYsXG4gICAgYWRkRW5kTGlzdGVuZXI6IHRyYW5zaXRpb25FbmRMaXN0ZW5lcixcbiAgICAuLi5wcm9wcyxcbiAgICBcImFyaWEtZXhwYW5kZWRcIjogcHJvcHMucm9sZSA/IGluUHJvcCA6IG51bGwsXG4gICAgb25FbnRlcjogaGFuZGxlRW50ZXIsXG4gICAgb25FbnRlcmluZzogaGFuZGxlRW50ZXJpbmcsXG4gICAgb25FbnRlcmVkOiBoYW5kbGVFbnRlcmVkLFxuICAgIG9uRXhpdDogaGFuZGxlRXhpdCxcbiAgICBvbkV4aXRpbmc6IGhhbmRsZUV4aXRpbmcsXG4gICAgY2hpbGRSZWY6IGNoaWxkcmVuLnJlZixcbiAgICBpbjogaW5Qcm9wLFxuICAgIHRpbWVvdXQ6IHRpbWVvdXQsXG4gICAgbW91bnRPbkVudGVyOiBtb3VudE9uRW50ZXIsXG4gICAgdW5tb3VudE9uRXhpdDogdW5tb3VudE9uRXhpdCxcbiAgICBhcHBlYXI6IGFwcGVhcixcbiAgICBjaGlsZHJlbjogKHN0YXRlLCBpbm5lclByb3BzKSA9PiAvKiNfX1BVUkVfXyovUmVhY3QuY2xvbmVFbGVtZW50KGNoaWxkcmVuLCB7XG4gICAgICAuLi5pbm5lclByb3BzLFxuICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGNsYXNzTmFtZSwgY2hpbGRyZW4ucHJvcHMuY2xhc3NOYW1lLCBjb2xsYXBzZVN0eWxlc1tzdGF0ZV0sIGNvbXB1dGVkRGltZW5zaW9uID09PSAnd2lkdGgnICYmICdjb2xsYXBzZS1ob3Jpem9udGFsJylcbiAgICB9KVxuICB9KTtcbn0pO1xuXG4vLyBAdHMtaWdub3JlXG5cbmV4cG9ydCBkZWZhdWx0IENvbGxhcHNlOyIsIlwidXNlIGNsaWVudFwiO1xuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbi8vIFRPRE86IGNoZWNrXG5cbmNvbnN0IGNvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcbmNvbnRleHQuZGlzcGxheU5hbWUgPSAnTmF2YmFyQ29udGV4dCc7XG5leHBvcnQgZGVmYXVsdCBjb250ZXh0OyIsIlwidXNlIGNsaWVudFwiO1xuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VDb250ZXh0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IENvbGxhcHNlIGZyb20gJy4vQ29sbGFwc2UnO1xuaW1wb3J0IHsgdXNlQm9vdHN0cmFwUHJlZml4IH0gZnJvbSAnLi9UaGVtZVByb3ZpZGVyJztcbmltcG9ydCBOYXZiYXJDb250ZXh0IGZyb20gJy4vTmF2YmFyQ29udGV4dCc7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgTmF2YmFyQ29sbGFwc2UgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigoe1xuICBjaGlsZHJlbixcbiAgYnNQcmVmaXgsXG4gIC4uLnByb3BzXG59LCByZWYpID0+IHtcbiAgYnNQcmVmaXggPSB1c2VCb290c3RyYXBQcmVmaXgoYnNQcmVmaXgsICduYXZiYXItY29sbGFwc2UnKTtcbiAgY29uc3QgY29udGV4dCA9IHVzZUNvbnRleHQoTmF2YmFyQ29udGV4dCk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChDb2xsYXBzZSwge1xuICAgIGluOiAhIShjb250ZXh0ICYmIGNvbnRleHQuZXhwYW5kZWQpLFxuICAgIC4uLnByb3BzLFxuICAgIGNoaWxkcmVuOiAvKiNfX1BVUkVfXyovX2pzeChcImRpdlwiLCB7XG4gICAgICByZWY6IHJlZixcbiAgICAgIGNsYXNzTmFtZTogYnNQcmVmaXgsXG4gICAgICBjaGlsZHJlbjogY2hpbGRyZW5cbiAgICB9KVxuICB9KTtcbn0pO1xuTmF2YmFyQ29sbGFwc2UuZGlzcGxheU5hbWUgPSAnTmF2YmFyQ29sbGFwc2UnO1xuZXhwb3J0IGRlZmF1bHQgTmF2YmFyQ29sbGFwc2U7IiwiaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGBSZWZgIHdob3NlIHZhbHVlIGlzIHVwZGF0ZWQgaW4gYW4gZWZmZWN0LCBlbnN1cmluZyB0aGUgbW9zdCByZWNlbnRcbiAqIHZhbHVlIGlzIHRoZSBvbmUgcmVuZGVyZWQgd2l0aC4gR2VuZXJhbGx5IG9ubHkgcmVxdWlyZWQgZm9yIENvbmN1cnJlbnQgbW9kZSB1c2FnZVxuICogd2hlcmUgcHJldmlvdXMgd29yayBpbiBgcmVuZGVyKClgIG1heSBiZSBkaXNjYXJkZWQgYmVmb3JlIGJlaW5nIHVzZWQuXG4gKlxuICogVGhpcyBpcyBzYWZlIHRvIGFjY2VzcyBpbiBhbiBldmVudCBoYW5kbGVyLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSBUaGUgYFJlZmAgdmFsdWVcbiAqL1xuZnVuY3Rpb24gdXNlQ29tbWl0dGVkUmVmKHZhbHVlKSB7XG4gIGNvbnN0IHJlZiA9IHVzZVJlZih2YWx1ZSk7XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgcmVmLmN1cnJlbnQgPSB2YWx1ZTtcbiAgfSwgW3ZhbHVlXSk7XG4gIHJldHVybiByZWY7XG59XG5leHBvcnQgZGVmYXVsdCB1c2VDb21taXR0ZWRSZWY7IiwiaW1wb3J0IHsgdXNlQ2FsbGJhY2sgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdXNlQ29tbWl0dGVkUmVmIGZyb20gJy4vdXNlQ29tbWl0dGVkUmVmJztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZUV2ZW50Q2FsbGJhY2soZm4pIHtcbiAgY29uc3QgcmVmID0gdXNlQ29tbWl0dGVkUmVmKGZuKTtcbiAgcmV0dXJuIHVzZUNhbGxiYWNrKGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgcmV0dXJuIHJlZi5jdXJyZW50ICYmIHJlZi5jdXJyZW50KC4uLmFyZ3MpO1xuICB9LCBbcmVmXSk7XG59IiwiXCJ1c2UgY2xpZW50XCI7XG5cbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB1c2VFdmVudENhbGxiYWNrIGZyb20gJ0ByZXN0YXJ0L2hvb2tzL3VzZUV2ZW50Q2FsbGJhY2snO1xuaW1wb3J0IHsgdXNlQm9vdHN0cmFwUHJlZml4IH0gZnJvbSAnLi9UaGVtZVByb3ZpZGVyJztcbmltcG9ydCBOYXZiYXJDb250ZXh0IGZyb20gJy4vTmF2YmFyQ29udGV4dCc7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgTmF2YmFyVG9nZ2xlID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHtcbiAgYnNQcmVmaXgsXG4gIGNsYXNzTmFtZSxcbiAgY2hpbGRyZW4sXG4gIGxhYmVsID0gJ1RvZ2dsZSBuYXZpZ2F0aW9uJyxcbiAgLy8gTmVlZCB0byBkZWZpbmUgdGhlIGRlZmF1bHQgXCJhc1wiIGR1cmluZyBwcm9wIGRlc3RydWN0dXJpbmcgdG8gYmUgY29tcGF0aWJsZSB3aXRoIHN0eWxlZC1jb21wb25lbnRzIGdpdGh1Yi5jb20vcmVhY3QtYm9vdHN0cmFwL3JlYWN0LWJvb3RzdHJhcC9pc3N1ZXMvMzU5NVxuICBhczogQ29tcG9uZW50ID0gJ2J1dHRvbicsXG4gIG9uQ2xpY2ssXG4gIC4uLnByb3BzXG59LCByZWYpID0+IHtcbiAgYnNQcmVmaXggPSB1c2VCb290c3RyYXBQcmVmaXgoYnNQcmVmaXgsICduYXZiYXItdG9nZ2xlcicpO1xuICBjb25zdCB7XG4gICAgb25Ub2dnbGUsXG4gICAgZXhwYW5kZWRcbiAgfSA9IHVzZUNvbnRleHQoTmF2YmFyQ29udGV4dCkgfHwge307XG4gIGNvbnN0IGhhbmRsZUNsaWNrID0gdXNlRXZlbnRDYWxsYmFjayhlID0+IHtcbiAgICBpZiAob25DbGljaykgb25DbGljayhlKTtcbiAgICBpZiAob25Ub2dnbGUpIG9uVG9nZ2xlKCk7XG4gIH0pO1xuICBpZiAoQ29tcG9uZW50ID09PSAnYnV0dG9uJykge1xuICAgIHByb3BzLnR5cGUgPSAnYnV0dG9uJztcbiAgfVxuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goQ29tcG9uZW50LCB7XG4gICAgLi4ucHJvcHMsXG4gICAgcmVmOiByZWYsXG4gICAgb25DbGljazogaGFuZGxlQ2xpY2ssXG4gICAgXCJhcmlhLWxhYmVsXCI6IGxhYmVsLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjbGFzc05hbWUsIGJzUHJlZml4LCAhZXhwYW5kZWQgJiYgJ2NvbGxhcHNlZCcpLFxuICAgIGNoaWxkcmVuOiBjaGlsZHJlbiB8fCAvKiNfX1BVUkVfXyovX2pzeChcInNwYW5cIiwge1xuICAgICAgY2xhc3NOYW1lOiBgJHtic1ByZWZpeH0taWNvbmBcbiAgICB9KVxuICB9KTtcbn0pO1xuTmF2YmFyVG9nZ2xlLmRpc3BsYXlOYW1lID0gJ05hdmJhclRvZ2dsZSc7XG5leHBvcnQgZGVmYXVsdCBOYXZiYXJUb2dnbGU7IiwiaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VMYXlvdXRFZmZlY3QgfSBmcm9tICdyZWFjdCc7XG5jb25zdCBpc1JlYWN0TmF0aXZlID0gdHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcgJiZcbi8vIEB0cy1pZ25vcmVcbmdsb2JhbC5uYXZpZ2F0b3IgJiZcbi8vIEB0cy1pZ25vcmVcbmdsb2JhbC5uYXZpZ2F0b3IucHJvZHVjdCA9PT0gJ1JlYWN0TmF0aXZlJztcbmNvbnN0IGlzRE9NID0gdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJztcblxuLyoqXG4gKiBJcyBgdXNlTGF5b3V0RWZmZWN0YCBpbiBhIERPTSBvciBSZWFjdCBOYXRpdmUgZW52aXJvbm1lbnQsIG90aGVyd2lzZSByZXNvbHZlcyB0byB1c2VFZmZlY3RcbiAqIE9ubHkgdXNlZnVsIHRvIGF2b2lkIHRoZSBjb25zb2xlIHdhcm5pbmcuXG4gKlxuICogUFJFRkVSIGB1c2VFZmZlY3RgIFVOTEVTUyBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkcuXG4gKlxuICogQGNhdGVnb3J5IGVmZmVjdHNcbiAqL1xuZXhwb3J0IGRlZmF1bHQgaXNET00gfHwgaXNSZWFjdE5hdGl2ZSA/IHVzZUxheW91dEVmZmVjdCA6IHVzZUVmZmVjdDsiLCJpbXBvcnQgdXNlRWZmZWN0IGZyb20gJy4vdXNlSXNvbW9ycGhpY0VmZmVjdCc7XG5pbXBvcnQgeyB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcbmNvbnN0IG1hdGNoZXJzQnlXaW5kb3cgPSBuZXcgV2Vha01hcCgpO1xuY29uc3QgZ2V0TWF0Y2hlciA9IChxdWVyeSwgdGFyZ2V0V2luZG93KSA9PiB7XG4gIGlmICghcXVlcnkgfHwgIXRhcmdldFdpbmRvdykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgbWF0Y2hlcnMgPSBtYXRjaGVyc0J5V2luZG93LmdldCh0YXJnZXRXaW5kb3cpIHx8IG5ldyBNYXAoKTtcbiAgbWF0Y2hlcnNCeVdpbmRvdy5zZXQodGFyZ2V0V2luZG93LCBtYXRjaGVycyk7XG4gIGxldCBtcWwgPSBtYXRjaGVycy5nZXQocXVlcnkpO1xuICBpZiAoIW1xbCkge1xuICAgIG1xbCA9IHRhcmdldFdpbmRvdy5tYXRjaE1lZGlhKHF1ZXJ5KTtcbiAgICBtcWwucmVmQ291bnQgPSAwO1xuICAgIG1hdGNoZXJzLnNldChtcWwubWVkaWEsIG1xbCk7XG4gIH1cbiAgcmV0dXJuIG1xbDtcbn07XG4vKipcbiAqIE1hdGNoIGEgbWVkaWEgcXVlcnkgYW5kIGdldCB1cGRhdGVzIGFzIHRoZSBtYXRjaCBjaGFuZ2VzLiBUaGUgbWVkaWEgc3RyaW5nIGlzXG4gKiBwYXNzZWQgZGlyZWN0bHkgdG8gYHdpbmRvdy5tYXRjaE1lZGlhYCBhbmQgcnVuIGFzIGEgTGF5b3V0IEVmZmVjdCwgc28gaW5pdGlhbFxuICogbWF0Y2hlcyBhcmUgcmV0dXJuZWQgYmVmb3JlIHRoZSBicm93c2VyIGhhcyBhIGNoYW5jZSB0byBwYWludC5cbiAqXG4gKiBgYGB0c3hcbiAqIGZ1bmN0aW9uIFBhZ2UoKSB7XG4gKiAgIGNvbnN0IGlzV2lkZSA9IHVzZU1lZGlhUXVlcnkoJ21pbi13aWR0aDogMTAwMHB4JylcbiAqXG4gKiAgIHJldHVybiBpc1dpZGUgPyBcInZlcnkgd2lkZVwiIDogJ25vdCBzbyB3aWRlJ1xuICogfVxuICogYGBgXG4gKlxuICogTWVkaWEgcXVlcnkgbGlzdHMgYXJlIGFsc28gcmV1c2VkIGdsb2JhbGx5LCBob29rIGNhbGxzIGZvciB0aGUgc2FtZSBxdWVyeVxuICogd2lsbCBvbmx5IGNyZWF0ZSBhIG1hdGNoZXIgb25jZSB1bmRlciB0aGUgaG9vZC5cbiAqXG4gKiBAcGFyYW0gcXVlcnkgQSBtZWRpYSBxdWVyeVxuICogQHBhcmFtIHRhcmdldFdpbmRvdyBUaGUgd2luZG93IHRvIG1hdGNoIGFnYWluc3QsIHVzZXMgdGhlIGdsb2JhbGx5IGF2YWlsYWJsZSBvbmUgYXMgYSBkZWZhdWx0LlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VNZWRpYVF1ZXJ5KHF1ZXJ5LCB0YXJnZXRXaW5kb3cgPSB0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IHdpbmRvdykge1xuICBjb25zdCBtcWwgPSBnZXRNYXRjaGVyKHF1ZXJ5LCB0YXJnZXRXaW5kb3cpO1xuICBjb25zdCBbbWF0Y2hlcywgc2V0TWF0Y2hlc10gPSB1c2VTdGF0ZSgoKSA9PiBtcWwgPyBtcWwubWF0Y2hlcyA6IGZhbHNlKTtcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBsZXQgbXFsID0gZ2V0TWF0Y2hlcihxdWVyeSwgdGFyZ2V0V2luZG93KTtcbiAgICBpZiAoIW1xbCkge1xuICAgICAgcmV0dXJuIHNldE1hdGNoZXMoZmFsc2UpO1xuICAgIH1cbiAgICBsZXQgbWF0Y2hlcnMgPSBtYXRjaGVyc0J5V2luZG93LmdldCh0YXJnZXRXaW5kb3cpO1xuICAgIGNvbnN0IGhhbmRsZUNoYW5nZSA9ICgpID0+IHtcbiAgICAgIHNldE1hdGNoZXMobXFsLm1hdGNoZXMpO1xuICAgIH07XG4gICAgbXFsLnJlZkNvdW50Kys7XG4gICAgbXFsLmFkZExpc3RlbmVyKGhhbmRsZUNoYW5nZSk7XG4gICAgaGFuZGxlQ2hhbmdlKCk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIG1xbC5yZW1vdmVMaXN0ZW5lcihoYW5kbGVDaGFuZ2UpO1xuICAgICAgbXFsLnJlZkNvdW50LS07XG4gICAgICBpZiAobXFsLnJlZkNvdW50IDw9IDApIHtcbiAgICAgICAgbWF0Y2hlcnMgPT0gbnVsbCA/IHZvaWQgMCA6IG1hdGNoZXJzLmRlbGV0ZShtcWwubWVkaWEpO1xuICAgICAgfVxuICAgICAgbXFsID0gdW5kZWZpbmVkO1xuICAgIH07XG4gIH0sIFtxdWVyeV0pO1xuICByZXR1cm4gbWF0Y2hlcztcbn0iLCJpbXBvcnQgdXNlTWVkaWFRdWVyeSBmcm9tICcuL3VzZU1lZGlhUXVlcnknO1xuaW1wb3J0IHsgdXNlTWVtbyB9IGZyb20gJ3JlYWN0Jztcbi8qKlxuICogQ3JlYXRlIGEgcmVzcG9uc2l2ZSBob29rIHdlIGEgc2V0IG9mIGJyZWFrcG9pbnQgbmFtZXMgYW5kIHdpZHRocy5cbiAqIFlvdSBjYW4gdXNlIGFueSB2YWxpZCBjc3MgdW5pdHMgYXMgd2VsbCBhcyBhIG51bWJlcnMgKGZvciBwaXhlbHMpLlxuICpcbiAqICoqTk9URToqKiBUaGUgb2JqZWN0IGtleSBvcmRlciBpcyBpbXBvcnRhbnQhIGl0J3MgYXNzdW1lZCB0byBiZSBpbiBvcmRlciBmcm9tIHNtYWxsZXN0IHRvIGxhcmdlc3RcbiAqXG4gKiBgYGB0c1xuICogY29uc3QgdXNlQnJlYWtwb2ludCA9IGNyZWF0ZUJyZWFrcG9pbnRIb29rKHtcbiAqICB4czogMCxcbiAqICBzbTogNTc2LFxuICogIG1kOiA3NjgsXG4gKiAgbGc6IDk5MixcbiAqICB4bDogMTIwMCxcbiAqIH0pXG4gKiBgYGBcbiAqXG4gKiAqKldhdGNoIG91dCEqKiB1c2luZyBzdHJpbmcgdmFsdWVzIHdpbGwgc29tZXRpbWVzIGNvbnN0cnVjdCBtZWRpYSBxdWVyaWVzIHVzaW5nIGNzcyBgY2FsYygpYCB3aGljaFxuICogaXMgTk9UIHN1cHBvcnRlZCBpbiBtZWRpYSBxdWVyaWVzIGJ5IGFsbCBicm93c2VycyBhdCB0aGUgbW9tZW50LiB1c2UgbnVtYmVycyBmb3JcbiAqIHRoZSB3aWRlc3QgcmFuZ2Ugb2YgYnJvd3NlciBzdXBwb3J0LlxuICpcbiAqIEBwYXJhbSBicmVha3BvaW50VmFsdWVzIEEgb2JqZWN0IGhhc2ggb2YgbmFtZXMgdG8gYnJlYWtwb2ludCBkaW1lbnNpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVCcmVha3BvaW50SG9vayhicmVha3BvaW50VmFsdWVzKSB7XG4gIGNvbnN0IG5hbWVzID0gT2JqZWN0LmtleXMoYnJlYWtwb2ludFZhbHVlcyk7XG4gIGZ1bmN0aW9uIGFuZChxdWVyeSwgbmV4dCkge1xuICAgIGlmIChxdWVyeSA9PT0gbmV4dCkge1xuICAgICAgcmV0dXJuIG5leHQ7XG4gICAgfVxuICAgIHJldHVybiBxdWVyeSA/IGAke3F1ZXJ5fSBhbmQgJHtuZXh0fWAgOiBuZXh0O1xuICB9XG4gIGZ1bmN0aW9uIGdldE5leHQoYnJlYWtwb2ludCkge1xuICAgIHJldHVybiBuYW1lc1tNYXRoLm1pbihuYW1lcy5pbmRleE9mKGJyZWFrcG9pbnQpICsgMSwgbmFtZXMubGVuZ3RoIC0gMSldO1xuICB9XG4gIGZ1bmN0aW9uIGdldE1heFF1ZXJ5KGJyZWFrcG9pbnQpIHtcbiAgICBjb25zdCBuZXh0ID0gZ2V0TmV4dChicmVha3BvaW50KTtcbiAgICBsZXQgdmFsdWUgPSBicmVha3BvaW50VmFsdWVzW25leHRdO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB2YWx1ZSA9IGAke3ZhbHVlIC0gMC4yfXB4YDtlbHNlIHZhbHVlID0gYGNhbGMoJHt2YWx1ZX0gLSAwLjJweClgO1xuICAgIHJldHVybiBgKG1heC13aWR0aDogJHt2YWx1ZX0pYDtcbiAgfVxuICBmdW5jdGlvbiBnZXRNaW5RdWVyeShicmVha3BvaW50KSB7XG4gICAgbGV0IHZhbHVlID0gYnJlYWtwb2ludFZhbHVlc1ticmVha3BvaW50XTtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgdmFsdWUgPSBgJHt2YWx1ZX1weGA7XG4gICAgfVxuICAgIHJldHVybiBgKG1pbi13aWR0aDogJHt2YWx1ZX0pYDtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXRjaCBhIHNldCBvZiBicmVha3BvaW50c1xuICAgKlxuICAgKiBgYGB0c3hcbiAgICogY29uc3QgTWlkU2l6ZU9ubHkgPSAoKSA9PiB7XG4gICAqICAgY29uc3QgaXNNaWQgPSB1c2VCcmVha3BvaW50KHsgbGc6ICdkb3duJywgc206ICd1cCcgfSk7XG4gICAqXG4gICAqICAgaWYgKGlzTWlkKSByZXR1cm4gPGRpdj5PbiBhIFJlYXNvbmFibGUgc2l6ZWQgU2NyZWVuITwvZGl2PlxuICAgKiAgIHJldHVybiBudWxsO1xuICAgKiB9XG4gICAqIGBgYFxuICAgKiBAcGFyYW0gYnJlYWtwb2ludE1hcCBBbiBvYmplY3QgbWFwIG9mIGJyZWFrcG9pbnRzIGFuZCBkaXJlY3Rpb25zLCBxdWVyaWVzIGFyZSBjb25zdHJ1Y3RlZCB1c2luZyBcImFuZFwiIHRvIGpvaW5cbiAgICogYnJlYWtwb2ludHMgdG9nZXRoZXJcbiAgICogQHBhcmFtIHdpbmRvdyBPcHRpb25hbGx5IHNwZWNpZnkgdGhlIHRhcmdldCB3aW5kb3cgdG8gbWF0Y2ggYWdhaW5zdCAodXNlZnVsIHdoZW4gcmVuZGVyaW5nIGludG8gaWZyYW1lcylcbiAgICovXG5cbiAgLyoqXG4gICAqIE1hdGNoIGEgc2luZ2xlIGJyZWFrcG9pbnQgZXhhY3RseSwgdXAsIG9yIGRvd24uXG4gICAqXG4gICAqIGBgYHRzeFxuICAgKiBjb25zdCBQaG9uZU9ubHkgPSAoKSA9PiB7XG4gICAqICAgY29uc3QgaXNTbWFsbCA9IHVzZUJyZWFrcG9pbnQoJ3NtJywgJ2Rvd24nKTtcbiAgICpcbiAgICogICBpZiAoaXNTbWFsbCkgcmV0dXJuIDxkaXY+T24gYSBTbWFsbCBTY3JlZW4hPC9kaXY+XG4gICAqICAgcmV0dXJuIG51bGw7XG4gICAqIH1cbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSBicmVha3BvaW50IFRoZSBicmVha3BvaW50IGtleVxuICAgKiBAcGFyYW0gZGlyZWN0aW9uIEEgZGlyZWN0aW9uICd1cCcgZm9yIGEgbWF4LCAnZG93bicgZm9yIG1pbiwgdHJ1ZSB0byBtYXRjaCBvbmx5IHRoZSBicmVha3BvaW50XG4gICAqIEBwYXJhbSB3aW5kb3cgT3B0aW9uYWxseSBzcGVjaWZ5IHRoZSB0YXJnZXQgd2luZG93IHRvIG1hdGNoIGFnYWluc3QgKHVzZWZ1bCB3aGVuIHJlbmRlcmluZyBpbnRvIGlmcmFtZXMpXG4gICAqL1xuXG4gIGZ1bmN0aW9uIHVzZUJyZWFrcG9pbnQoYnJlYWtwb2ludE9yTWFwLCBkaXJlY3Rpb24sIHdpbmRvdykge1xuICAgIGxldCBicmVha3BvaW50TWFwO1xuICAgIGlmICh0eXBlb2YgYnJlYWtwb2ludE9yTWFwID09PSAnb2JqZWN0Jykge1xuICAgICAgYnJlYWtwb2ludE1hcCA9IGJyZWFrcG9pbnRPck1hcDtcbiAgICAgIHdpbmRvdyA9IGRpcmVjdGlvbjtcbiAgICAgIGRpcmVjdGlvbiA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRpcmVjdGlvbiA9IGRpcmVjdGlvbiB8fCB0cnVlO1xuICAgICAgYnJlYWtwb2ludE1hcCA9IHtcbiAgICAgICAgW2JyZWFrcG9pbnRPck1hcF06IGRpcmVjdGlvblxuICAgICAgfTtcbiAgICB9XG4gICAgbGV0IHF1ZXJ5ID0gdXNlTWVtbygoKSA9PiBPYmplY3QuZW50cmllcyhicmVha3BvaW50TWFwKS5yZWR1Y2UoKHF1ZXJ5LCBba2V5LCBkaXJlY3Rpb25dKSA9PiB7XG4gICAgICBpZiAoZGlyZWN0aW9uID09PSAndXAnIHx8IGRpcmVjdGlvbiA9PT0gdHJ1ZSkge1xuICAgICAgICBxdWVyeSA9IGFuZChxdWVyeSwgZ2V0TWluUXVlcnkoa2V5KSk7XG4gICAgICB9XG4gICAgICBpZiAoZGlyZWN0aW9uID09PSAnZG93bicgfHwgZGlyZWN0aW9uID09PSB0cnVlKSB7XG4gICAgICAgIHF1ZXJ5ID0gYW5kKHF1ZXJ5LCBnZXRNYXhRdWVyeShrZXkpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBxdWVyeTtcbiAgICB9LCAnJyksIFtKU09OLnN0cmluZ2lmeShicmVha3BvaW50TWFwKV0pO1xuICAgIHJldHVybiB1c2VNZWRpYVF1ZXJ5KHF1ZXJ5LCB3aW5kb3cpO1xuICB9XG4gIHJldHVybiB1c2VCcmVha3BvaW50O1xufVxuY29uc3QgdXNlQnJlYWtwb2ludCA9IGNyZWF0ZUJyZWFrcG9pbnRIb29rKHtcbiAgeHM6IDAsXG4gIHNtOiA1NzYsXG4gIG1kOiA3NjgsXG4gIGxnOiA5OTIsXG4gIHhsOiAxMjAwLFxuICB4eGw6IDE0MDBcbn0pO1xuZXhwb3J0IGRlZmF1bHQgdXNlQnJlYWtwb2ludDsiLCJpbXBvcnQgb3duZXJEb2N1bWVudCBmcm9tICcuL293bmVyRG9jdW1lbnQnO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSBhY3RpdmVseSBmb2N1c2VkIGVsZW1lbnQgc2FmZWx5LlxuICpcbiAqIEBwYXJhbSBkb2MgdGhlIGRvY3VtZW50IHRvIGNoZWNrXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYWN0aXZlRWxlbWVudChkb2MpIHtcbiAgaWYgKGRvYyA9PT0gdm9pZCAwKSB7XG4gICAgZG9jID0gb3duZXJEb2N1bWVudCgpO1xuICB9XG5cbiAgLy8gU3VwcG9ydDogSUUgOSBvbmx5XG4gIC8vIElFOSB0aHJvd3MgYW4gXCJVbnNwZWNpZmllZCBlcnJvclwiIGFjY2Vzc2luZyBkb2N1bWVudC5hY3RpdmVFbGVtZW50IGZyb20gYW4gPGlmcmFtZT5cbiAgdHJ5IHtcbiAgICB2YXIgYWN0aXZlID0gZG9jLmFjdGl2ZUVsZW1lbnQ7IC8vIElFMTEgcmV0dXJucyBhIHNlZW1pbmdseSBlbXB0eSBvYmplY3QgaW4gc29tZSBjYXNlcyB3aGVuIGFjY2Vzc2luZ1xuICAgIC8vIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgZnJvbSBhbiA8aWZyYW1lPlxuXG4gICAgaWYgKCFhY3RpdmUgfHwgIWFjdGl2ZS5ub2RlTmFtZSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIGFjdGl2ZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8qIGllIHRocm93cyBpZiBubyBhY3RpdmUgZWxlbWVudCAqL1xuICAgIHJldHVybiBkb2MuYm9keTtcbiAgfVxufSIsIi8qIGVzbGludC1kaXNhYmxlIG5vLWJpdHdpc2UsIG5vLWNvbmQtYXNzaWduICovXG5cbi8qKlxuICogQ2hlY2tzIGlmIGFuIGVsZW1lbnQgY29udGFpbnMgYW5vdGhlciBnaXZlbiBlbGVtZW50LlxuICogXG4gKiBAcGFyYW0gY29udGV4dCB0aGUgY29udGV4dCBlbGVtZW50XG4gKiBAcGFyYW0gbm9kZSB0aGUgZWxlbWVudCB0byBjaGVja1xuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb250YWlucyhjb250ZXh0LCBub2RlKSB7XG4gIC8vIEhUTUwgRE9NIGFuZCBTVkcgRE9NIG1heSBoYXZlIGRpZmZlcmVudCBzdXBwb3J0IGxldmVscyxcbiAgLy8gc28gd2UgbmVlZCB0byBjaGVjayBvbiBjb250ZXh0IGluc3RlYWQgb2YgYSBkb2N1bWVudCByb290IGVsZW1lbnQuXG4gIGlmIChjb250ZXh0LmNvbnRhaW5zKSByZXR1cm4gY29udGV4dC5jb250YWlucyhub2RlKTtcbiAgaWYgKGNvbnRleHQuY29tcGFyZURvY3VtZW50UG9zaXRpb24pIHJldHVybiBjb250ZXh0ID09PSBub2RlIHx8ICEhKGNvbnRleHQuY29tcGFyZURvY3VtZW50UG9zaXRpb24obm9kZSkgJiAxNik7XG59IiwiaW1wb3J0IHsgdXNlUmVmLCB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCc7XG5cbi8qKlxuICogVHJhY2sgd2hldGhlciBhIGNvbXBvbmVudCBpcyBjdXJyZW50IG1vdW50ZWQuIEdlbmVyYWxseSBsZXNzIHByZWZlcmFibGUgdGhhblxuICogcHJvcGVybGx5IGNhbmNlbGluZyBlZmZlY3RzIHNvIHRoZXkgZG9uJ3QgcnVuIGFmdGVyIGEgY29tcG9uZW50IGlzIHVubW91bnRlZCxcbiAqIGJ1dCBoZWxwZnVsIGluIGNhc2VzIHdoZXJlIHRoYXQgaXNuJ3QgZmVhc2libGUsIHN1Y2ggYXMgYSBgUHJvbWlzZWAgcmVzb2x1dGlvbi5cbiAqXG4gKiBAcmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgY3VycmVudCBpc01vdW50ZWQgc3RhdGUgb2YgdGhlIGNvbXBvbmVudFxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBbZGF0YSwgc2V0RGF0YV0gPSB1c2VTdGF0ZShudWxsKVxuICogY29uc3QgaXNNb3VudGVkID0gdXNlTW91bnRlZCgpXG4gKlxuICogdXNlRWZmZWN0KCgpID0+IHtcbiAqICAgZmV0Y2hkYXRhKCkudGhlbigobmV3RGF0YSkgPT4ge1xuICogICAgICBpZiAoaXNNb3VudGVkKCkpIHtcbiAqICAgICAgICBzZXREYXRhKG5ld0RhdGEpO1xuICogICAgICB9XG4gKiAgIH0pXG4gKiB9KVxuICogYGBgXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZU1vdW50ZWQoKSB7XG4gIGNvbnN0IG1vdW50ZWQgPSB1c2VSZWYodHJ1ZSk7XG4gIGNvbnN0IGlzTW91bnRlZCA9IHVzZVJlZigoKSA9PiBtb3VudGVkLmN1cnJlbnQpO1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIG1vdW50ZWQuY3VycmVudCA9IHRydWU7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIG1vdW50ZWQuY3VycmVudCA9IGZhbHNlO1xuICAgIH07XG4gIH0sIFtdKTtcbiAgcmV0dXJuIGlzTW91bnRlZC5jdXJyZW50O1xufSIsImltcG9ydCB7IHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcblxuLyoqXG4gKiBSZXR1cm5zIGEgcmVmIHRoYXQgaXMgaW1tZWRpYXRlbHkgdXBkYXRlZCB3aXRoIHRoZSBuZXcgdmFsdWVcbiAqXG4gKiBAcGFyYW0gdmFsdWUgVGhlIFJlZiB2YWx1ZVxuICogQGNhdGVnb3J5IHJlZnNcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlVXBkYXRlZFJlZih2YWx1ZSkge1xuICBjb25zdCB2YWx1ZVJlZiA9IHVzZVJlZih2YWx1ZSk7XG4gIHZhbHVlUmVmLmN1cnJlbnQgPSB2YWx1ZTtcbiAgcmV0dXJuIHZhbHVlUmVmO1xufSIsImltcG9ydCB1c2VVcGRhdGVkUmVmIGZyb20gJy4vdXNlVXBkYXRlZFJlZic7XG5pbXBvcnQgeyB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCc7XG5cbi8qKlxuICogQXR0YWNoIGEgY2FsbGJhY2sgdGhhdCBmaXJlcyB3aGVuIGEgY29tcG9uZW50IHVubW91bnRzXG4gKlxuICogQHBhcmFtIGZuIEhhbmRsZXIgdG8gcnVuIHdoZW4gdGhlIGNvbXBvbmVudCB1bm1vdW50c1xuICogQGNhdGVnb3J5IGVmZmVjdHNcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlV2lsbFVubW91bnQoZm4pIHtcbiAgY29uc3Qgb25Vbm1vdW50ID0gdXNlVXBkYXRlZFJlZihmbik7XG4gIHVzZUVmZmVjdCgoKSA9PiAoKSA9PiBvblVubW91bnQuY3VycmVudCgpLCBbXSk7XG59IiwiaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5cbi8qKlxuICogU3RvcmUgdGhlIGxhc3Qgb2Ygc29tZSB2YWx1ZS4gVHJhY2tlZCB2aWEgYSBgUmVmYCBvbmx5IHVwZGF0aW5nIGl0XG4gKiBhZnRlciB0aGUgY29tcG9uZW50IHJlbmRlcnMuXG4gKlxuICogSGVscGZ1bCBpZiB5b3UgbmVlZCB0byBjb21wYXJlIGEgcHJvcCB2YWx1ZSB0byBpdCdzIHByZXZpb3VzIHZhbHVlIGR1cmluZyByZW5kZXIuXG4gKlxuICogYGBgdHNcbiAqIGZ1bmN0aW9uIENvbXBvbmVudChwcm9wcykge1xuICogICBjb25zdCBsYXN0UHJvcHMgPSB1c2VQcmV2aW91cyhwcm9wcylcbiAqXG4gKiAgIGlmIChsYXN0UHJvcHMuZm9vICE9PSBwcm9wcy5mb28pXG4gKiAgICAgcmVzZXRWYWx1ZUZyb21Qcm9wcyhwcm9wcy5mb28pXG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIHRyYWNrXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZVByZXZpb3VzKHZhbHVlKSB7XG4gIGNvbnN0IHJlZiA9IHVzZVJlZihudWxsKTtcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICByZWYuY3VycmVudCA9IHZhbHVlO1xuICB9KTtcbiAgcmV0dXJuIHJlZi5jdXJyZW50O1xufSIsImV4cG9ydCBjb25zdCBBVFRSSUJVVEVfUFJFRklYID0gYGRhdGEtcnItdWktYDtcbmV4cG9ydCBjb25zdCBQUk9QRVJUWV9QUkVGSVggPSBgcnJVaWA7XG5leHBvcnQgZnVuY3Rpb24gZGF0YUF0dHIocHJvcGVydHkpIHtcbiAgcmV0dXJuIGAke0FUVFJJQlVURV9QUkVGSVh9JHtwcm9wZXJ0eX1gO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGRhdGFQcm9wKHByb3BlcnR5KSB7XG4gIHJldHVybiBgJHtQUk9QRVJUWV9QUkVGSVh9JHtwcm9wZXJ0eX1gO1xufSIsIi8qKlxuICogR2V0IHRoZSB3aWR0aCBvZiB0aGUgdmVydGljYWwgd2luZG93IHNjcm9sbGJhciBpZiBpdCdzIHZpc2libGVcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0Qm9keVNjcm9sbGJhcldpZHRoKG93bmVyRG9jdW1lbnQgPSBkb2N1bWVudCkge1xuICBjb25zdCB3aW5kb3cgPSBvd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O1xuICByZXR1cm4gTWF0aC5hYnMod2luZG93LmlubmVyV2lkdGggLSBvd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk7XG59IiwiaW1wb3J0IGNzcyBmcm9tICdkb20taGVscGVycy9jc3MnO1xuaW1wb3J0IHsgZGF0YUF0dHIgfSBmcm9tICcuL0RhdGFLZXknO1xuaW1wb3J0IGdldEJvZHlTY3JvbGxiYXJXaWR0aCBmcm9tICcuL2dldFNjcm9sbGJhcldpZHRoJztcbmV4cG9ydCBjb25zdCBPUEVOX0RBVEFfQVRUUklCVVRFID0gZGF0YUF0dHIoJ21vZGFsLW9wZW4nKTtcblxuLyoqXG4gKiBNYW5hZ2VzIGEgc3RhY2sgb2YgTW9kYWxzIGFzIHdlbGwgYXMgZW5zdXJpbmdcbiAqIGJvZHkgc2Nyb2xsaW5nIGlzIGlzIGRpc2FibGVkIGFuZCBwYWRkaW5nIGFjY291bnRlZCBmb3JcbiAqL1xuY2xhc3MgTW9kYWxNYW5hZ2VyIHtcbiAgY29uc3RydWN0b3Ioe1xuICAgIG93bmVyRG9jdW1lbnQsXG4gICAgaGFuZGxlQ29udGFpbmVyT3ZlcmZsb3cgPSB0cnVlLFxuICAgIGlzUlRMID0gZmFsc2VcbiAgfSA9IHt9KSB7XG4gICAgdGhpcy5oYW5kbGVDb250YWluZXJPdmVyZmxvdyA9IGhhbmRsZUNvbnRhaW5lck92ZXJmbG93O1xuICAgIHRoaXMuaXNSVEwgPSBpc1JUTDtcbiAgICB0aGlzLm1vZGFscyA9IFtdO1xuICAgIHRoaXMub3duZXJEb2N1bWVudCA9IG93bmVyRG9jdW1lbnQ7XG4gIH1cbiAgZ2V0U2Nyb2xsYmFyV2lkdGgoKSB7XG4gICAgcmV0dXJuIGdldEJvZHlTY3JvbGxiYXJXaWR0aCh0aGlzLm93bmVyRG9jdW1lbnQpO1xuICB9XG4gIGdldEVsZW1lbnQoKSB7XG4gICAgcmV0dXJuICh0aGlzLm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQpLmJvZHk7XG4gIH1cbiAgc2V0TW9kYWxBdHRyaWJ1dGVzKF9tb2RhbCkge1xuICAgIC8vIEZvciBvdmVycmlkaW5nXG4gIH1cbiAgcmVtb3ZlTW9kYWxBdHRyaWJ1dGVzKF9tb2RhbCkge1xuICAgIC8vIEZvciBvdmVycmlkaW5nXG4gIH1cbiAgc2V0Q29udGFpbmVyU3R5bGUoY29udGFpbmVyU3RhdGUpIHtcbiAgICBjb25zdCBzdHlsZSA9IHtcbiAgICAgIG92ZXJmbG93OiAnaGlkZGVuJ1xuICAgIH07XG5cbiAgICAvLyB3ZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIHRoZSBhY3R1YWwgYHN0eWxlYCBoZXJlXG4gICAgLy8gYmVjYXVzZSB3ZSB3aWxsIG92ZXJyaWRlIGl0XG4gICAgY29uc3QgcGFkZGluZ1Byb3AgPSB0aGlzLmlzUlRMID8gJ3BhZGRpbmdMZWZ0JyA6ICdwYWRkaW5nUmlnaHQnO1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuZ2V0RWxlbWVudCgpO1xuICAgIGNvbnRhaW5lclN0YXRlLnN0eWxlID0ge1xuICAgICAgb3ZlcmZsb3c6IGNvbnRhaW5lci5zdHlsZS5vdmVyZmxvdyxcbiAgICAgIFtwYWRkaW5nUHJvcF06IGNvbnRhaW5lci5zdHlsZVtwYWRkaW5nUHJvcF1cbiAgICB9O1xuICAgIGlmIChjb250YWluZXJTdGF0ZS5zY3JvbGxCYXJXaWR0aCkge1xuICAgICAgLy8gdXNlIGNvbXB1dGVkIHN0eWxlLCBoZXJlIHRvIGdldCB0aGUgcmVhbCBwYWRkaW5nXG4gICAgICAvLyB0byBhZGQgb3VyIHNjcm9sbGJhciB3aWR0aFxuICAgICAgc3R5bGVbcGFkZGluZ1Byb3BdID0gYCR7cGFyc2VJbnQoY3NzKGNvbnRhaW5lciwgcGFkZGluZ1Byb3ApIHx8ICcwJywgMTApICsgY29udGFpbmVyU3RhdGUuc2Nyb2xsQmFyV2lkdGh9cHhgO1xuICAgIH1cbiAgICBjb250YWluZXIuc2V0QXR0cmlidXRlKE9QRU5fREFUQV9BVFRSSUJVVEUsICcnKTtcbiAgICBjc3MoY29udGFpbmVyLCBzdHlsZSk7XG4gIH1cbiAgcmVzZXQoKSB7XG4gICAgWy4uLnRoaXMubW9kYWxzXS5mb3JFYWNoKG0gPT4gdGhpcy5yZW1vdmUobSkpO1xuICB9XG4gIHJlbW92ZUNvbnRhaW5lclN0eWxlKGNvbnRhaW5lclN0YXRlKSB7XG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5nZXRFbGVtZW50KCk7XG4gICAgY29udGFpbmVyLnJlbW92ZUF0dHJpYnV0ZShPUEVOX0RBVEFfQVRUUklCVVRFKTtcbiAgICBPYmplY3QuYXNzaWduKGNvbnRhaW5lci5zdHlsZSwgY29udGFpbmVyU3RhdGUuc3R5bGUpO1xuICB9XG4gIGFkZChtb2RhbCkge1xuICAgIGxldCBtb2RhbElkeCA9IHRoaXMubW9kYWxzLmluZGV4T2YobW9kYWwpO1xuICAgIGlmIChtb2RhbElkeCAhPT0gLTEpIHtcbiAgICAgIHJldHVybiBtb2RhbElkeDtcbiAgICB9XG4gICAgbW9kYWxJZHggPSB0aGlzLm1vZGFscy5sZW5ndGg7XG4gICAgdGhpcy5tb2RhbHMucHVzaChtb2RhbCk7XG4gICAgdGhpcy5zZXRNb2RhbEF0dHJpYnV0ZXMobW9kYWwpO1xuICAgIGlmIChtb2RhbElkeCAhPT0gMCkge1xuICAgICAgcmV0dXJuIG1vZGFsSWR4O1xuICAgIH1cbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgc2Nyb2xsQmFyV2lkdGg6IHRoaXMuZ2V0U2Nyb2xsYmFyV2lkdGgoKSxcbiAgICAgIHN0eWxlOiB7fVxuICAgIH07XG4gICAgaWYgKHRoaXMuaGFuZGxlQ29udGFpbmVyT3ZlcmZsb3cpIHtcbiAgICAgIHRoaXMuc2V0Q29udGFpbmVyU3R5bGUodGhpcy5zdGF0ZSk7XG4gICAgfVxuICAgIHJldHVybiBtb2RhbElkeDtcbiAgfVxuICByZW1vdmUobW9kYWwpIHtcbiAgICBjb25zdCBtb2RhbElkeCA9IHRoaXMubW9kYWxzLmluZGV4T2YobW9kYWwpO1xuICAgIGlmIChtb2RhbElkeCA9PT0gLTEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5tb2RhbHMuc3BsaWNlKG1vZGFsSWR4LCAxKTtcblxuICAgIC8vIGlmIHRoYXQgd2FzIHRoZSBsYXN0IG1vZGFsIGluIGEgY29udGFpbmVyLFxuICAgIC8vIGNsZWFuIHVwIHRoZSBjb250YWluZXJcbiAgICBpZiAoIXRoaXMubW9kYWxzLmxlbmd0aCAmJiB0aGlzLmhhbmRsZUNvbnRhaW5lck92ZXJmbG93KSB7XG4gICAgICB0aGlzLnJlbW92ZUNvbnRhaW5lclN0eWxlKHRoaXMuc3RhdGUpO1xuICAgIH1cbiAgICB0aGlzLnJlbW92ZU1vZGFsQXR0cmlidXRlcyhtb2RhbCk7XG4gIH1cbiAgaXNUb3BNb2RhbChtb2RhbCkge1xuICAgIHJldHVybiAhIXRoaXMubW9kYWxzLmxlbmd0aCAmJiB0aGlzLm1vZGFsc1t0aGlzLm1vZGFscy5sZW5ndGggLSAxXSA9PT0gbW9kYWw7XG4gIH1cbn1cbmV4cG9ydCBkZWZhdWx0IE1vZGFsTWFuYWdlcjsiLCJpbXBvcnQgeyBjcmVhdGVDb250ZXh0LCB1c2VDb250ZXh0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNhblVzZURPTSBmcm9tICdkb20taGVscGVycy9jYW5Vc2VET00nO1xuY29uc3QgQ29udGV4dCA9IC8qI19fUFVSRV9fKi9jcmVhdGVDb250ZXh0KGNhblVzZURPTSA/IHdpbmRvdyA6IHVuZGVmaW5lZCk7XG5leHBvcnQgY29uc3QgV2luZG93UHJvdmlkZXIgPSBDb250ZXh0LlByb3ZpZGVyO1xuXG4vKipcbiAqIFRoZSBkb2N1bWVudCBcIndpbmRvd1wiIHBsYWNlZCBpbiBSZWFjdCBjb250ZXh0LiBIZWxwZnVsIGZvciBkZXRlcm1pbmluZ1xuICogU1NSIGNvbnRleHQsIG9yIHdoZW4gcmVuZGVyaW5nIGludG8gYW4gaWZyYW1lLlxuICpcbiAqIEByZXR1cm5zIHRoZSBjdXJyZW50IHdpbmRvd1xuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VXaW5kb3coKSB7XG4gIHJldHVybiB1c2VDb250ZXh0KENvbnRleHQpO1xufSIsImltcG9ydCBvd25lckRvY3VtZW50IGZyb20gJ2RvbS1oZWxwZXJzL293bmVyRG9jdW1lbnQnO1xuaW1wb3J0IGNhblVzZURPTSBmcm9tICdkb20taGVscGVycy9jYW5Vc2VET00nO1xuaW1wb3J0IHsgdXNlU3RhdGUsIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB1c2VXaW5kb3cgZnJvbSAnLi91c2VXaW5kb3cnO1xuZXhwb3J0IGNvbnN0IHJlc29sdmVDb250YWluZXJSZWYgPSAocmVmLCBkb2N1bWVudCkgPT4ge1xuICBpZiAoIWNhblVzZURPTSkgcmV0dXJuIG51bGw7XG4gIGlmIChyZWYgPT0gbnVsbCkgcmV0dXJuIChkb2N1bWVudCB8fCBvd25lckRvY3VtZW50KCkpLmJvZHk7XG4gIGlmICh0eXBlb2YgcmVmID09PSAnZnVuY3Rpb24nKSByZWYgPSByZWYoKTtcbiAgaWYgKHJlZiAmJiAnY3VycmVudCcgaW4gcmVmKSByZWYgPSByZWYuY3VycmVudDtcbiAgaWYgKHJlZiAmJiAoJ25vZGVUeXBlJyBpbiByZWYgfHwgcmVmLmdldEJvdW5kaW5nQ2xpZW50UmVjdCkpIHJldHVybiByZWY7XG4gIHJldHVybiBudWxsO1xufTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZVdhaXRGb3JET01SZWYocmVmLCBvblJlc29sdmVkKSB7XG4gIGNvbnN0IHdpbmRvdyA9IHVzZVdpbmRvdygpO1xuICBjb25zdCBbcmVzb2x2ZWRSZWYsIHNldFJlZl0gPSB1c2VTdGF0ZSgoKSA9PiByZXNvbHZlQ29udGFpbmVyUmVmKHJlZiwgd2luZG93ID09IG51bGwgPyB2b2lkIDAgOiB3aW5kb3cuZG9jdW1lbnQpKTtcbiAgaWYgKCFyZXNvbHZlZFJlZikge1xuICAgIGNvbnN0IGVhcmx5UmVmID0gcmVzb2x2ZUNvbnRhaW5lclJlZihyZWYpO1xuICAgIGlmIChlYXJseVJlZikgc2V0UmVmKGVhcmx5UmVmKTtcbiAgfVxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChvblJlc29sdmVkICYmIHJlc29sdmVkUmVmKSB7XG4gICAgICBvblJlc29sdmVkKHJlc29sdmVkUmVmKTtcbiAgICB9XG4gIH0sIFtvblJlc29sdmVkLCByZXNvbHZlZFJlZl0pO1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IG5leHRSZWYgPSByZXNvbHZlQ29udGFpbmVyUmVmKHJlZik7XG4gICAgaWYgKG5leHRSZWYgIT09IHJlc29sdmVkUmVmKSB7XG4gICAgICBzZXRSZWYobmV4dFJlZik7XG4gICAgfVxuICB9LCBbcmVmLCByZXNvbHZlZFJlZl0pO1xuICByZXR1cm4gcmVzb2x2ZWRSZWY7XG59IiwiaW1wb3J0IHVzZUV2ZW50Q2FsbGJhY2sgZnJvbSAnQHJlc3RhcnQvaG9va3MvdXNlRXZlbnRDYWxsYmFjayc7XG5pbXBvcnQgdXNlTWVyZ2VkUmVmcyBmcm9tICdAcmVzdGFydC9ob29rcy91c2VNZXJnZWRSZWZzJztcbmltcG9ydCB7IGNsb25lRWxlbWVudCwgdXNlRWZmZWN0LCB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5mdW5jdGlvbiBOb29wVHJhbnNpdGlvbih7XG4gIGNoaWxkcmVuLFxuICBpbjogaW5Qcm9wLFxuICBvbkV4aXRlZCxcbiAgbW91bnRPbkVudGVyLFxuICB1bm1vdW50T25FeGl0XG59KSB7XG4gIGNvbnN0IHJlZiA9IHVzZVJlZihudWxsKTtcbiAgY29uc3QgaGFzRW50ZXJlZFJlZiA9IHVzZVJlZihpblByb3ApO1xuICBjb25zdCBoYW5kbGVFeGl0ZWQgPSB1c2VFdmVudENhbGxiYWNrKG9uRXhpdGVkKTtcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoaW5Qcm9wKSBoYXNFbnRlcmVkUmVmLmN1cnJlbnQgPSB0cnVlO2Vsc2Uge1xuICAgICAgaGFuZGxlRXhpdGVkKHJlZi5jdXJyZW50KTtcbiAgICB9XG4gIH0sIFtpblByb3AsIGhhbmRsZUV4aXRlZF0pO1xuICBjb25zdCBjb21iaW5lZFJlZiA9IHVzZU1lcmdlZFJlZnMocmVmLCBjaGlsZHJlbi5yZWYpO1xuICBjb25zdCBjaGlsZCA9IC8qI19fUFVSRV9fKi9jbG9uZUVsZW1lbnQoY2hpbGRyZW4sIHtcbiAgICByZWY6IGNvbWJpbmVkUmVmXG4gIH0pO1xuICBpZiAoaW5Qcm9wKSByZXR1cm4gY2hpbGQ7XG4gIGlmICh1bm1vdW50T25FeGl0KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKCFoYXNFbnRlcmVkUmVmLmN1cnJlbnQgJiYgbW91bnRPbkVudGVyKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIGNoaWxkO1xufVxuZXhwb3J0IGRlZmF1bHQgTm9vcFRyYW5zaXRpb247IiwiaW1wb3J0IHVzZU1lcmdlZFJlZnMgZnJvbSAnQHJlc3RhcnQvaG9va3MvdXNlTWVyZ2VkUmVmcyc7XG5pbXBvcnQgdXNlRXZlbnRDYWxsYmFjayBmcm9tICdAcmVzdGFydC9ob29rcy91c2VFdmVudENhbGxiYWNrJztcbmltcG9ydCB1c2VJc29tb3JwaGljRWZmZWN0IGZyb20gJ0ByZXN0YXJ0L2hvb2tzL3VzZUlzb21vcnBoaWNFZmZlY3QnO1xuaW1wb3J0IFJlYWN0LCB7IHVzZVJlZiwgY2xvbmVFbGVtZW50LCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBOb29wVHJhbnNpdGlvbiBmcm9tICcuL05vb3BUcmFuc2l0aW9uJztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5leHBvcnQgZnVuY3Rpb24gdXNlVHJhbnNpdGlvbih7XG4gIGluOiBpblByb3AsXG4gIG9uVHJhbnNpdGlvblxufSkge1xuICBjb25zdCByZWYgPSB1c2VSZWYobnVsbCk7XG4gIGNvbnN0IGlzSW5pdGlhbFJlZiA9IHVzZVJlZih0cnVlKTtcbiAgY29uc3QgaGFuZGxlVHJhbnNpdGlvbiA9IHVzZUV2ZW50Q2FsbGJhY2sob25UcmFuc2l0aW9uKTtcbiAgdXNlSXNvbW9ycGhpY0VmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFyZWYuY3VycmVudCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgbGV0IHN0YWxlID0gZmFsc2U7XG4gICAgaGFuZGxlVHJhbnNpdGlvbih7XG4gICAgICBpbjogaW5Qcm9wLFxuICAgICAgZWxlbWVudDogcmVmLmN1cnJlbnQsXG4gICAgICBpbml0aWFsOiBpc0luaXRpYWxSZWYuY3VycmVudCxcbiAgICAgIGlzU3RhbGU6ICgpID0+IHN0YWxlXG4gICAgfSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHN0YWxlID0gdHJ1ZTtcbiAgICB9O1xuICB9LCBbaW5Qcm9wLCBoYW5kbGVUcmFuc2l0aW9uXSk7XG4gIHVzZUlzb21vcnBoaWNFZmZlY3QoKCkgPT4ge1xuICAgIGlzSW5pdGlhbFJlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgLy8gdGhpcyBpcyBmb3Igc3RyaWN0IG1vZGVcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgaXNJbml0aWFsUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgIH07XG4gIH0sIFtdKTtcbiAgcmV0dXJuIHJlZjtcbn1cbi8qKlxuICogQWRhcHRzIGFuIGltcGVyYXRpdmUgdHJhbnNpdGlvbiBmdW5jdGlvbiB0byBhIHN1YnNldCBvZiB0aGUgUlRHIGA8VHJhbnNpdGlvbj5gIGNvbXBvbmVudCBBUEkuXG4gKlxuICogSW1wZXJhdGl2ZVRyYW5zaXRpb24gZG9lcyBub3Qgc3VwcG9ydCBtb3VudGluZyBvcHRpb25zIG9yIGBhcHBlYXJgIGF0IHRoZSBtb21lbnQsIG1lYW5pbmdcbiAqIHRoYXQgaXQgYWx3YXlzIGFjdHMgbGlrZTogYG1vdW50T25FbnRlcj17dHJ1ZX0gdW5tb3VudE9uRXhpdD17dHJ1ZX0gYXBwZWFyPXt0cnVlfWBcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gSW1wZXJhdGl2ZVRyYW5zaXRpb24oe1xuICBjaGlsZHJlbixcbiAgaW46IGluUHJvcCxcbiAgb25FeGl0ZWQsXG4gIG9uRW50ZXJlZCxcbiAgdHJhbnNpdGlvblxufSkge1xuICBjb25zdCBbZXhpdGVkLCBzZXRFeGl0ZWRdID0gdXNlU3RhdGUoIWluUHJvcCk7XG5cbiAgLy8gVE9ETzogSSB0aGluayB0aGlzIG5lZWRzIHRvIGJlIGluIGFuIGVmZmVjdFxuICBpZiAoaW5Qcm9wICYmIGV4aXRlZCkge1xuICAgIHNldEV4aXRlZChmYWxzZSk7XG4gIH1cbiAgY29uc3QgcmVmID0gdXNlVHJhbnNpdGlvbih7XG4gICAgaW46ICEhaW5Qcm9wLFxuICAgIG9uVHJhbnNpdGlvbjogb3B0aW9ucyA9PiB7XG4gICAgICBjb25zdCBvbkZpbmlzaCA9ICgpID0+IHtcbiAgICAgICAgaWYgKG9wdGlvbnMuaXNTdGFsZSgpKSByZXR1cm47XG4gICAgICAgIGlmIChvcHRpb25zLmluKSB7XG4gICAgICAgICAgb25FbnRlcmVkID09IG51bGwgPyB2b2lkIDAgOiBvbkVudGVyZWQob3B0aW9ucy5lbGVtZW50LCBvcHRpb25zLmluaXRpYWwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNldEV4aXRlZCh0cnVlKTtcbiAgICAgICAgICBvbkV4aXRlZCA9PSBudWxsID8gdm9pZCAwIDogb25FeGl0ZWQob3B0aW9ucy5lbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIFByb21pc2UucmVzb2x2ZSh0cmFuc2l0aW9uKG9wdGlvbnMpKS50aGVuKG9uRmluaXNoLCBlcnJvciA9PiB7XG4gICAgICAgIGlmICghb3B0aW9ucy5pbikgc2V0RXhpdGVkKHRydWUpO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG4gIGNvbnN0IGNvbWJpbmVkUmVmID0gdXNlTWVyZ2VkUmVmcyhyZWYsIGNoaWxkcmVuLnJlZik7XG4gIHJldHVybiBleGl0ZWQgJiYgIWluUHJvcCA/IG51bGwgOiAvKiNfX1BVUkVfXyovY2xvbmVFbGVtZW50KGNoaWxkcmVuLCB7XG4gICAgcmVmOiBjb21iaW5lZFJlZlxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJUcmFuc2l0aW9uKENvbXBvbmVudCwgcnVuVHJhbnNpdGlvbiwgcHJvcHMpIHtcbiAgaWYgKENvbXBvbmVudCkge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChDb21wb25lbnQsIE9iamVjdC5hc3NpZ24oe30sIHByb3BzKSk7XG4gIH1cbiAgaWYgKHJ1blRyYW5zaXRpb24pIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL19qc3goSW1wZXJhdGl2ZVRyYW5zaXRpb24sIE9iamVjdC5hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICB0cmFuc2l0aW9uOiBydW5UcmFuc2l0aW9uXG4gICAgfSkpO1xuICB9XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChOb29wVHJhbnNpdGlvbiwgT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMpKTtcbn0iLCIvKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvcHJlZmVyLWRlZmF1bHQtZXhwb3J0ICovXG5leHBvcnQgZnVuY3Rpb24gaXNFc2NLZXkoZSkge1xuICByZXR1cm4gZS5jb2RlID09PSAnRXNjYXBlJyB8fCBlLmtleUNvZGUgPT09IDI3O1xufSIsImNvbnN0IF9leGNsdWRlZCA9IFtcInNob3dcIiwgXCJyb2xlXCIsIFwiY2xhc3NOYW1lXCIsIFwic3R5bGVcIiwgXCJjaGlsZHJlblwiLCBcImJhY2tkcm9wXCIsIFwia2V5Ym9hcmRcIiwgXCJvbkJhY2tkcm9wQ2xpY2tcIiwgXCJvbkVzY2FwZUtleURvd25cIiwgXCJ0cmFuc2l0aW9uXCIsIFwicnVuVHJhbnNpdGlvblwiLCBcImJhY2tkcm9wVHJhbnNpdGlvblwiLCBcInJ1bkJhY2tkcm9wVHJhbnNpdGlvblwiLCBcImF1dG9Gb2N1c1wiLCBcImVuZm9yY2VGb2N1c1wiLCBcInJlc3RvcmVGb2N1c1wiLCBcInJlc3RvcmVGb2N1c09wdGlvbnNcIiwgXCJyZW5kZXJEaWFsb2dcIiwgXCJyZW5kZXJCYWNrZHJvcFwiLCBcIm1hbmFnZXJcIiwgXCJjb250YWluZXJcIiwgXCJvblNob3dcIiwgXCJvbkhpZGVcIiwgXCJvbkV4aXRcIiwgXCJvbkV4aXRlZFwiLCBcIm9uRXhpdGluZ1wiLCBcIm9uRW50ZXJcIiwgXCJvbkVudGVyaW5nXCIsIFwib25FbnRlcmVkXCJdO1xuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCkgeyBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTsgdmFyIHRhcmdldCA9IHt9OyB2YXIgc291cmNlS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7IHZhciBrZXksIGk7IGZvciAoaSA9IDA7IGkgPCBzb3VyY2VLZXlzLmxlbmd0aDsgaSsrKSB7IGtleSA9IHNvdXJjZUtleXNbaV07IGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gcmV0dXJuIHRhcmdldDsgfVxuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVzZS1iZWZvcmUtZGVmaW5lLCByZWFjdC9wcm9wLXR5cGVzICovXG5cbmltcG9ydCBhY3RpdmVFbGVtZW50IGZyb20gJ2RvbS1oZWxwZXJzL2FjdGl2ZUVsZW1lbnQnO1xuaW1wb3J0IGNvbnRhaW5zIGZyb20gJ2RvbS1oZWxwZXJzL2NvbnRhaW5zJztcbmltcG9ydCBjYW5Vc2VET00gZnJvbSAnZG9tLWhlbHBlcnMvY2FuVXNlRE9NJztcbmltcG9ydCBsaXN0ZW4gZnJvbSAnZG9tLWhlbHBlcnMvbGlzdGVuJztcbmltcG9ydCB7IHVzZVN0YXRlLCB1c2VSZWYsIHVzZUNhbGxiYWNrLCB1c2VJbXBlcmF0aXZlSGFuZGxlLCBmb3J3YXJkUmVmLCB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUmVhY3RET00gZnJvbSAncmVhY3QtZG9tJztcbmltcG9ydCB1c2VNb3VudGVkIGZyb20gJ0ByZXN0YXJ0L2hvb2tzL3VzZU1vdW50ZWQnO1xuaW1wb3J0IHVzZVdpbGxVbm1vdW50IGZyb20gJ0ByZXN0YXJ0L2hvb2tzL3VzZVdpbGxVbm1vdW50JztcbmltcG9ydCB1c2VQcmV2aW91cyBmcm9tICdAcmVzdGFydC9ob29rcy91c2VQcmV2aW91cyc7XG5pbXBvcnQgdXNlRXZlbnRDYWxsYmFjayBmcm9tICdAcmVzdGFydC9ob29rcy91c2VFdmVudENhbGxiYWNrJztcbmltcG9ydCBNb2RhbE1hbmFnZXIgZnJvbSAnLi9Nb2RhbE1hbmFnZXInO1xuaW1wb3J0IHVzZVdhaXRGb3JET01SZWYgZnJvbSAnLi91c2VXYWl0Rm9yRE9NUmVmJztcbmltcG9ydCB1c2VXaW5kb3cgZnJvbSAnLi91c2VXaW5kb3cnO1xuaW1wb3J0IHsgcmVuZGVyVHJhbnNpdGlvbiB9IGZyb20gJy4vSW1wZXJhdGl2ZVRyYW5zaXRpb24nO1xuaW1wb3J0IHsgaXNFc2NLZXkgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBGcmFnbWVudCBhcyBfRnJhZ21lbnQgfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IGpzeHMgYXMgX2pzeHMgfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmxldCBtYW5hZ2VyO1xuZnVuY3Rpb24gZ2V0TWFuYWdlcih3aW5kb3cpIHtcbiAgaWYgKCFtYW5hZ2VyKSBtYW5hZ2VyID0gbmV3IE1vZGFsTWFuYWdlcih7XG4gICAgb3duZXJEb2N1bWVudDogd2luZG93ID09IG51bGwgPyB2b2lkIDAgOiB3aW5kb3cuZG9jdW1lbnRcbiAgfSk7XG4gIHJldHVybiBtYW5hZ2VyO1xufVxuZnVuY3Rpb24gdXNlTW9kYWxNYW5hZ2VyKHByb3ZpZGVkKSB7XG4gIGNvbnN0IHdpbmRvdyA9IHVzZVdpbmRvdygpO1xuICBjb25zdCBtb2RhbE1hbmFnZXIgPSBwcm92aWRlZCB8fCBnZXRNYW5hZ2VyKHdpbmRvdyk7XG4gIGNvbnN0IG1vZGFsID0gdXNlUmVmKHtcbiAgICBkaWFsb2c6IG51bGwsXG4gICAgYmFja2Ryb3A6IG51bGxcbiAgfSk7XG4gIHJldHVybiBPYmplY3QuYXNzaWduKG1vZGFsLmN1cnJlbnQsIHtcbiAgICBhZGQ6ICgpID0+IG1vZGFsTWFuYWdlci5hZGQobW9kYWwuY3VycmVudCksXG4gICAgcmVtb3ZlOiAoKSA9PiBtb2RhbE1hbmFnZXIucmVtb3ZlKG1vZGFsLmN1cnJlbnQpLFxuICAgIGlzVG9wTW9kYWw6ICgpID0+IG1vZGFsTWFuYWdlci5pc1RvcE1vZGFsKG1vZGFsLmN1cnJlbnQpLFxuICAgIHNldERpYWxvZ1JlZjogdXNlQ2FsbGJhY2socmVmID0+IHtcbiAgICAgIG1vZGFsLmN1cnJlbnQuZGlhbG9nID0gcmVmO1xuICAgIH0sIFtdKSxcbiAgICBzZXRCYWNrZHJvcFJlZjogdXNlQ2FsbGJhY2socmVmID0+IHtcbiAgICAgIG1vZGFsLmN1cnJlbnQuYmFja2Ryb3AgPSByZWY7XG4gICAgfSwgW10pXG4gIH0pO1xufVxuY29uc3QgTW9kYWwgPSAvKiNfX1BVUkVfXyovZm9yd2FyZFJlZigoX3JlZiwgcmVmKSA9PiB7XG4gIGxldCB7XG4gICAgICBzaG93ID0gZmFsc2UsXG4gICAgICByb2xlID0gJ2RpYWxvZycsXG4gICAgICBjbGFzc05hbWUsXG4gICAgICBzdHlsZSxcbiAgICAgIGNoaWxkcmVuLFxuICAgICAgYmFja2Ryb3AgPSB0cnVlLFxuICAgICAga2V5Ym9hcmQgPSB0cnVlLFxuICAgICAgb25CYWNrZHJvcENsaWNrLFxuICAgICAgb25Fc2NhcGVLZXlEb3duLFxuICAgICAgdHJhbnNpdGlvbixcbiAgICAgIHJ1blRyYW5zaXRpb24sXG4gICAgICBiYWNrZHJvcFRyYW5zaXRpb24sXG4gICAgICBydW5CYWNrZHJvcFRyYW5zaXRpb24sXG4gICAgICBhdXRvRm9jdXMgPSB0cnVlLFxuICAgICAgZW5mb3JjZUZvY3VzID0gdHJ1ZSxcbiAgICAgIHJlc3RvcmVGb2N1cyA9IHRydWUsXG4gICAgICByZXN0b3JlRm9jdXNPcHRpb25zLFxuICAgICAgcmVuZGVyRGlhbG9nLFxuICAgICAgcmVuZGVyQmFja2Ryb3AgPSBwcm9wcyA9PiAvKiNfX1BVUkVfXyovX2pzeChcImRpdlwiLCBPYmplY3QuYXNzaWduKHt9LCBwcm9wcykpLFxuICAgICAgbWFuYWdlcjogcHJvdmlkZWRNYW5hZ2VyLFxuICAgICAgY29udGFpbmVyOiBjb250YWluZXJSZWYsXG4gICAgICBvblNob3csXG4gICAgICBvbkhpZGUgPSAoKSA9PiB7fSxcbiAgICAgIG9uRXhpdCxcbiAgICAgIG9uRXhpdGVkLFxuICAgICAgb25FeGl0aW5nLFxuICAgICAgb25FbnRlcixcbiAgICAgIG9uRW50ZXJpbmcsXG4gICAgICBvbkVudGVyZWRcbiAgICB9ID0gX3JlZixcbiAgICByZXN0ID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UoX3JlZiwgX2V4Y2x1ZGVkKTtcbiAgY29uc3Qgb3duZXJXaW5kb3cgPSB1c2VXaW5kb3coKTtcbiAgY29uc3QgY29udGFpbmVyID0gdXNlV2FpdEZvckRPTVJlZihjb250YWluZXJSZWYpO1xuICBjb25zdCBtb2RhbCA9IHVzZU1vZGFsTWFuYWdlcihwcm92aWRlZE1hbmFnZXIpO1xuICBjb25zdCBpc01vdW50ZWQgPSB1c2VNb3VudGVkKCk7XG4gIGNvbnN0IHByZXZTaG93ID0gdXNlUHJldmlvdXMoc2hvdyk7XG4gIGNvbnN0IFtleGl0ZWQsIHNldEV4aXRlZF0gPSB1c2VTdGF0ZSghc2hvdyk7XG4gIGNvbnN0IGxhc3RGb2N1c1JlZiA9IHVzZVJlZihudWxsKTtcbiAgdXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsICgpID0+IG1vZGFsLCBbbW9kYWxdKTtcbiAgaWYgKGNhblVzZURPTSAmJiAhcHJldlNob3cgJiYgc2hvdykge1xuICAgIGxhc3RGb2N1c1JlZi5jdXJyZW50ID0gYWN0aXZlRWxlbWVudChvd25lcldpbmRvdyA9PSBudWxsID8gdm9pZCAwIDogb3duZXJXaW5kb3cuZG9jdW1lbnQpO1xuICB9XG5cbiAgLy8gVE9ETzogSSB0aGluayB0aGlzIG5lZWRzIHRvIGJlIGluIGFuIGVmZmVjdFxuICBpZiAoc2hvdyAmJiBleGl0ZWQpIHtcbiAgICBzZXRFeGl0ZWQoZmFsc2UpO1xuICB9XG4gIGNvbnN0IGhhbmRsZVNob3cgPSB1c2VFdmVudENhbGxiYWNrKCgpID0+IHtcbiAgICBtb2RhbC5hZGQoKTtcbiAgICByZW1vdmVLZXlkb3duTGlzdGVuZXJSZWYuY3VycmVudCA9IGxpc3Rlbihkb2N1bWVudCwgJ2tleWRvd24nLCBoYW5kbGVEb2N1bWVudEtleURvd24pO1xuICAgIHJlbW92ZUZvY3VzTGlzdGVuZXJSZWYuY3VycmVudCA9IGxpc3Rlbihkb2N1bWVudCwgJ2ZvY3VzJyxcbiAgICAvLyB0aGUgdGltZW91dCBpcyBuZWNlc3NhcnkgYi9jIHRoaXMgd2lsbCBydW4gYmVmb3JlIHRoZSBuZXcgbW9kYWwgaXMgbW91bnRlZFxuICAgIC8vIGFuZCBzbyBzdGVhbHMgZm9jdXMgZnJvbSBpdFxuICAgICgpID0+IHNldFRpbWVvdXQoaGFuZGxlRW5mb3JjZUZvY3VzKSwgdHJ1ZSk7XG4gICAgaWYgKG9uU2hvdykge1xuICAgICAgb25TaG93KCk7XG4gICAgfVxuXG4gICAgLy8gYXV0b2ZvY3VzIGFmdGVyIG9uU2hvdyB0byBub3QgdHJpZ2dlciBhIGZvY3VzIGV2ZW50IGZvciBwcmV2aW91c1xuICAgIC8vIG1vZGFscyBiZWZvcmUgdGhpcyBvbmUgaXMgc2hvd24uXG4gICAgaWYgKGF1dG9Gb2N1cykge1xuICAgICAgdmFyIF9tb2RhbCRkaWFsb2ckb3duZXJEbywgX21vZGFsJGRpYWxvZztcbiAgICAgIGNvbnN0IGN1cnJlbnRBY3RpdmVFbGVtZW50ID0gYWN0aXZlRWxlbWVudCgoX21vZGFsJGRpYWxvZyRvd25lckRvID0gKF9tb2RhbCRkaWFsb2cgPSBtb2RhbC5kaWFsb2cpID09IG51bGwgPyB2b2lkIDAgOiBfbW9kYWwkZGlhbG9nLm93bmVyRG9jdW1lbnQpICE9IG51bGwgPyBfbW9kYWwkZGlhbG9nJG93bmVyRG8gOiBvd25lcldpbmRvdyA9PSBudWxsID8gdm9pZCAwIDogb3duZXJXaW5kb3cuZG9jdW1lbnQpO1xuICAgICAgaWYgKG1vZGFsLmRpYWxvZyAmJiBjdXJyZW50QWN0aXZlRWxlbWVudCAmJiAhY29udGFpbnMobW9kYWwuZGlhbG9nLCBjdXJyZW50QWN0aXZlRWxlbWVudCkpIHtcbiAgICAgICAgbGFzdEZvY3VzUmVmLmN1cnJlbnQgPSBjdXJyZW50QWN0aXZlRWxlbWVudDtcbiAgICAgICAgbW9kYWwuZGlhbG9nLmZvY3VzKCk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgY29uc3QgaGFuZGxlSGlkZSA9IHVzZUV2ZW50Q2FsbGJhY2soKCkgPT4ge1xuICAgIG1vZGFsLnJlbW92ZSgpO1xuICAgIHJlbW92ZUtleWRvd25MaXN0ZW5lclJlZi5jdXJyZW50ID09IG51bGwgPyB2b2lkIDAgOiByZW1vdmVLZXlkb3duTGlzdGVuZXJSZWYuY3VycmVudCgpO1xuICAgIHJlbW92ZUZvY3VzTGlzdGVuZXJSZWYuY3VycmVudCA9PSBudWxsID8gdm9pZCAwIDogcmVtb3ZlRm9jdXNMaXN0ZW5lclJlZi5jdXJyZW50KCk7XG4gICAgaWYgKHJlc3RvcmVGb2N1cykge1xuICAgICAgdmFyIF9sYXN0Rm9jdXNSZWYkY3VycmVudDtcbiAgICAgIC8vIFN1cHBvcnQ6IDw9SUUxMSBkb2Vzbid0IHN1cHBvcnQgYGZvY3VzKClgIG9uIHN2ZyBlbGVtZW50cyAoUkI6ICM5MTcpXG4gICAgICAoX2xhc3RGb2N1c1JlZiRjdXJyZW50ID0gbGFzdEZvY3VzUmVmLmN1cnJlbnQpID09IG51bGwgPyB2b2lkIDAgOiBfbGFzdEZvY3VzUmVmJGN1cnJlbnQuZm9jdXMgPT0gbnVsbCA/IHZvaWQgMCA6IF9sYXN0Rm9jdXNSZWYkY3VycmVudC5mb2N1cyhyZXN0b3JlRm9jdXNPcHRpb25zKTtcbiAgICAgIGxhc3RGb2N1c1JlZi5jdXJyZW50ID0gbnVsbDtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIFRPRE86IHRyeSBhbmQgY29tYmluZSB0aGVzZSBlZmZlY3RzOiBodHRwczovL2dpdGh1Yi5jb20vcmVhY3QtYm9vdHN0cmFwL3JlYWN0LW92ZXJsYXlzL3B1bGwvNzk0I2Rpc2N1c3Npb25fcjQwOTk1NDEyMFxuXG4gIC8vIFNob3cgbG9naWMgd2hlbjpcbiAgLy8gIC0gc2hvdyBpcyBgdHJ1ZWAgX2FuZF8gYGNvbnRhaW5lcmAgaGFzIHJlc29sdmVkXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFzaG93IHx8ICFjb250YWluZXIpIHJldHVybjtcbiAgICBoYW5kbGVTaG93KCk7XG4gIH0sIFtzaG93LCBjb250YWluZXIsIC8qIHNob3VsZCBuZXZlciBjaGFuZ2U6ICovaGFuZGxlU2hvd10pO1xuXG4gIC8vIEhpZGUgY2xlYW51cCBsb2dpYyB3aGVuOlxuICAvLyAgLSBgZXhpdGVkYCBzd2l0Y2hlcyB0byB0cnVlXG4gIC8vICAtIGNvbXBvbmVudCB1bm1vdW50cztcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWV4aXRlZCkgcmV0dXJuO1xuICAgIGhhbmRsZUhpZGUoKTtcbiAgfSwgW2V4aXRlZCwgaGFuZGxlSGlkZV0pO1xuICB1c2VXaWxsVW5tb3VudCgoKSA9PiB7XG4gICAgaGFuZGxlSGlkZSgpO1xuICB9KTtcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIGNvbnN0IGhhbmRsZUVuZm9yY2VGb2N1cyA9IHVzZUV2ZW50Q2FsbGJhY2soKCkgPT4ge1xuICAgIGlmICghZW5mb3JjZUZvY3VzIHx8ICFpc01vdW50ZWQoKSB8fCAhbW9kYWwuaXNUb3BNb2RhbCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGN1cnJlbnRBY3RpdmVFbGVtZW50ID0gYWN0aXZlRWxlbWVudChvd25lcldpbmRvdyA9PSBudWxsID8gdm9pZCAwIDogb3duZXJXaW5kb3cuZG9jdW1lbnQpO1xuICAgIGlmIChtb2RhbC5kaWFsb2cgJiYgY3VycmVudEFjdGl2ZUVsZW1lbnQgJiYgIWNvbnRhaW5zKG1vZGFsLmRpYWxvZywgY3VycmVudEFjdGl2ZUVsZW1lbnQpKSB7XG4gICAgICBtb2RhbC5kaWFsb2cuZm9jdXMoKTtcbiAgICB9XG4gIH0pO1xuICBjb25zdCBoYW5kbGVCYWNrZHJvcENsaWNrID0gdXNlRXZlbnRDYWxsYmFjayhlID0+IHtcbiAgICBpZiAoZS50YXJnZXQgIT09IGUuY3VycmVudFRhcmdldCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBvbkJhY2tkcm9wQ2xpY2sgPT0gbnVsbCA/IHZvaWQgMCA6IG9uQmFja2Ryb3BDbGljayhlKTtcbiAgICBpZiAoYmFja2Ryb3AgPT09IHRydWUpIHtcbiAgICAgIG9uSGlkZSgpO1xuICAgIH1cbiAgfSk7XG4gIGNvbnN0IGhhbmRsZURvY3VtZW50S2V5RG93biA9IHVzZUV2ZW50Q2FsbGJhY2soZSA9PiB7XG4gICAgaWYgKGtleWJvYXJkICYmIGlzRXNjS2V5KGUpICYmIG1vZGFsLmlzVG9wTW9kYWwoKSkge1xuICAgICAgb25Fc2NhcGVLZXlEb3duID09IG51bGwgPyB2b2lkIDAgOiBvbkVzY2FwZUtleURvd24oZSk7XG4gICAgICBpZiAoIWUuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICBvbkhpZGUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICBjb25zdCByZW1vdmVGb2N1c0xpc3RlbmVyUmVmID0gdXNlUmVmKCk7XG4gIGNvbnN0IHJlbW92ZUtleWRvd25MaXN0ZW5lclJlZiA9IHVzZVJlZigpO1xuICBjb25zdCBoYW5kbGVIaWRkZW4gPSAoLi4uYXJncykgPT4ge1xuICAgIHNldEV4aXRlZCh0cnVlKTtcbiAgICBvbkV4aXRlZCA9PSBudWxsID8gdm9pZCAwIDogb25FeGl0ZWQoLi4uYXJncyk7XG4gIH07XG4gIGlmICghY29udGFpbmVyKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgZGlhbG9nUHJvcHMgPSBPYmplY3QuYXNzaWduKHtcbiAgICByb2xlLFxuICAgIHJlZjogbW9kYWwuc2V0RGlhbG9nUmVmLFxuICAgIC8vIGFwcGFyZW50bHkgb25seSB3b3JrcyBvbiB0aGUgZGlhbG9nIHJvbGUgZWxlbWVudFxuICAgICdhcmlhLW1vZGFsJzogcm9sZSA9PT0gJ2RpYWxvZycgPyB0cnVlIDogdW5kZWZpbmVkXG4gIH0sIHJlc3QsIHtcbiAgICBzdHlsZSxcbiAgICBjbGFzc05hbWUsXG4gICAgdGFiSW5kZXg6IC0xXG4gIH0pO1xuICBsZXQgZGlhbG9nID0gcmVuZGVyRGlhbG9nID8gcmVuZGVyRGlhbG9nKGRpYWxvZ1Byb3BzKSA6IC8qI19fUFVSRV9fKi9fanN4KFwiZGl2XCIsIE9iamVjdC5hc3NpZ24oe30sIGRpYWxvZ1Byb3BzLCB7XG4gICAgY2hpbGRyZW46IC8qI19fUFVSRV9fKi9SZWFjdC5jbG9uZUVsZW1lbnQoY2hpbGRyZW4sIHtcbiAgICAgIHJvbGU6ICdkb2N1bWVudCdcbiAgICB9KVxuICB9KSk7XG4gIGRpYWxvZyA9IHJlbmRlclRyYW5zaXRpb24odHJhbnNpdGlvbiwgcnVuVHJhbnNpdGlvbiwge1xuICAgIHVubW91bnRPbkV4aXQ6IHRydWUsXG4gICAgbW91bnRPbkVudGVyOiB0cnVlLFxuICAgIGFwcGVhcjogdHJ1ZSxcbiAgICBpbjogISFzaG93LFxuICAgIG9uRXhpdCxcbiAgICBvbkV4aXRpbmcsXG4gICAgb25FeGl0ZWQ6IGhhbmRsZUhpZGRlbixcbiAgICBvbkVudGVyLFxuICAgIG9uRW50ZXJpbmcsXG4gICAgb25FbnRlcmVkLFxuICAgIGNoaWxkcmVuOiBkaWFsb2dcbiAgfSk7XG4gIGxldCBiYWNrZHJvcEVsZW1lbnQgPSBudWxsO1xuICBpZiAoYmFja2Ryb3ApIHtcbiAgICBiYWNrZHJvcEVsZW1lbnQgPSByZW5kZXJCYWNrZHJvcCh7XG4gICAgICByZWY6IG1vZGFsLnNldEJhY2tkcm9wUmVmLFxuICAgICAgb25DbGljazogaGFuZGxlQmFja2Ryb3BDbGlja1xuICAgIH0pO1xuICAgIGJhY2tkcm9wRWxlbWVudCA9IHJlbmRlclRyYW5zaXRpb24oYmFja2Ryb3BUcmFuc2l0aW9uLCBydW5CYWNrZHJvcFRyYW5zaXRpb24sIHtcbiAgICAgIGluOiAhIXNob3csXG4gICAgICBhcHBlYXI6IHRydWUsXG4gICAgICBtb3VudE9uRW50ZXI6IHRydWUsXG4gICAgICB1bm1vdW50T25FeGl0OiB0cnVlLFxuICAgICAgY2hpbGRyZW46IGJhY2tkcm9wRWxlbWVudFxuICAgIH0pO1xuICB9XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChfRnJhZ21lbnQsIHtcbiAgICBjaGlsZHJlbjogLyojX19QVVJFX18qL1JlYWN0RE9NLmNyZWF0ZVBvcnRhbCggLyojX19QVVJFX18qL19qc3hzKF9GcmFnbWVudCwge1xuICAgICAgY2hpbGRyZW46IFtiYWNrZHJvcEVsZW1lbnQsIGRpYWxvZ11cbiAgICB9KSwgY29udGFpbmVyKVxuICB9KTtcbn0pO1xuTW9kYWwuZGlzcGxheU5hbWUgPSAnTW9kYWwnO1xuZXhwb3J0IGRlZmF1bHQgT2JqZWN0LmFzc2lnbihNb2RhbCwge1xuICBNYW5hZ2VyOiBNb2RhbE1hbmFnZXJcbn0pOyIsImltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQ2FsbGJhY2sgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBFTlRFUkVELCBFTlRFUklORyB9IGZyb20gJ3JlYWN0LXRyYW5zaXRpb24tZ3JvdXAvVHJhbnNpdGlvbic7XG5pbXBvcnQgdHJhbnNpdGlvbkVuZExpc3RlbmVyIGZyb20gJy4vdHJhbnNpdGlvbkVuZExpc3RlbmVyJztcbmltcG9ydCB0cmlnZ2VyQnJvd3NlclJlZmxvdyBmcm9tICcuL3RyaWdnZXJCcm93c2VyUmVmbG93JztcbmltcG9ydCBUcmFuc2l0aW9uV3JhcHBlciBmcm9tICcuL1RyYW5zaXRpb25XcmFwcGVyJztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5jb25zdCBmYWRlU3R5bGVzID0ge1xuICBbRU5URVJJTkddOiAnc2hvdycsXG4gIFtFTlRFUkVEXTogJ3Nob3cnXG59O1xuY29uc3QgRmFkZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKCh7XG4gIGNsYXNzTmFtZSxcbiAgY2hpbGRyZW4sXG4gIHRyYW5zaXRpb25DbGFzc2VzID0ge30sXG4gIG9uRW50ZXIsXG4gIC4uLnJlc3Rcbn0sIHJlZikgPT4ge1xuICBjb25zdCBwcm9wcyA9IHtcbiAgICBpbjogZmFsc2UsXG4gICAgdGltZW91dDogMzAwLFxuICAgIG1vdW50T25FbnRlcjogZmFsc2UsXG4gICAgdW5tb3VudE9uRXhpdDogZmFsc2UsXG4gICAgYXBwZWFyOiBmYWxzZSxcbiAgICAuLi5yZXN0XG4gIH07XG4gIGNvbnN0IGhhbmRsZUVudGVyID0gdXNlQ2FsbGJhY2soKG5vZGUsIGlzQXBwZWFyaW5nKSA9PiB7XG4gICAgdHJpZ2dlckJyb3dzZXJSZWZsb3cobm9kZSk7XG4gICAgb25FbnRlciA9PSBudWxsID8gdm9pZCAwIDogb25FbnRlcihub2RlLCBpc0FwcGVhcmluZyk7XG4gIH0sIFtvbkVudGVyXSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChUcmFuc2l0aW9uV3JhcHBlciwge1xuICAgIHJlZjogcmVmLFxuICAgIGFkZEVuZExpc3RlbmVyOiB0cmFuc2l0aW9uRW5kTGlzdGVuZXIsXG4gICAgLi4ucHJvcHMsXG4gICAgb25FbnRlcjogaGFuZGxlRW50ZXIsXG4gICAgY2hpbGRSZWY6IGNoaWxkcmVuLnJlZixcbiAgICBjaGlsZHJlbjogKHN0YXR1cywgaW5uZXJQcm9wcykgPT4gLyojX19QVVJFX18qL1JlYWN0LmNsb25lRWxlbWVudChjaGlsZHJlbiwge1xuICAgICAgLi4uaW5uZXJQcm9wcyxcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcygnZmFkZScsIGNsYXNzTmFtZSwgY2hpbGRyZW4ucHJvcHMuY2xhc3NOYW1lLCBmYWRlU3R5bGVzW3N0YXR1c10sIHRyYW5zaXRpb25DbGFzc2VzW3N0YXR1c10pXG4gICAgfSlcbiAgfSk7XG59KTtcbkZhZGUuZGlzcGxheU5hbWUgPSAnRmFkZSc7XG5leHBvcnQgZGVmYXVsdCBGYWRlOyIsIlwidXNlIGNsaWVudFwiO1xuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB7IHVzZUJvb3RzdHJhcFByZWZpeCB9IGZyb20gJy4vVGhlbWVQcm92aWRlcic7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgT2ZmY2FudmFzQm9keSA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKCh7XG4gIGNsYXNzTmFtZSxcbiAgYnNQcmVmaXgsXG4gIGFzOiBDb21wb25lbnQgPSAnZGl2JyxcbiAgLi4ucHJvcHNcbn0sIHJlZikgPT4ge1xuICBic1ByZWZpeCA9IHVzZUJvb3RzdHJhcFByZWZpeChic1ByZWZpeCwgJ29mZmNhbnZhcy1ib2R5Jyk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChDb21wb25lbnQsIHtcbiAgICByZWY6IHJlZixcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoY2xhc3NOYW1lLCBic1ByZWZpeCksXG4gICAgLi4ucHJvcHNcbiAgfSk7XG59KTtcbk9mZmNhbnZhc0JvZHkuZGlzcGxheU5hbWUgPSAnT2ZmY2FudmFzQm9keSc7XG5leHBvcnQgZGVmYXVsdCBPZmZjYW52YXNCb2R5OyIsIlwidXNlIGNsaWVudFwiO1xuXG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IEVOVEVSRUQsIEVOVEVSSU5HLCBFWElUSU5HIH0gZnJvbSAncmVhY3QtdHJhbnNpdGlvbi1ncm91cC9UcmFuc2l0aW9uJztcbmltcG9ydCB0cmFuc2l0aW9uRW5kTGlzdGVuZXIgZnJvbSAnLi90cmFuc2l0aW9uRW5kTGlzdGVuZXInO1xuaW1wb3J0IFRyYW5zaXRpb25XcmFwcGVyIGZyb20gJy4vVHJhbnNpdGlvbldyYXBwZXInO1xuaW1wb3J0IHsgdXNlQm9vdHN0cmFwUHJlZml4IH0gZnJvbSAnLi9UaGVtZVByb3ZpZGVyJztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5jb25zdCB0cmFuc2l0aW9uU3R5bGVzID0ge1xuICBbRU5URVJJTkddOiAnc2hvdycsXG4gIFtFTlRFUkVEXTogJ3Nob3cnXG59O1xuY29uc3QgT2ZmY2FudmFzVG9nZ2xpbmcgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigoe1xuICBic1ByZWZpeCxcbiAgY2xhc3NOYW1lLFxuICBjaGlsZHJlbixcbiAgaW46IGluUHJvcCA9IGZhbHNlLFxuICBtb3VudE9uRW50ZXIgPSBmYWxzZSxcbiAgdW5tb3VudE9uRXhpdCA9IGZhbHNlLFxuICBhcHBlYXIgPSBmYWxzZSxcbiAgLi4ucHJvcHNcbn0sIHJlZikgPT4ge1xuICBic1ByZWZpeCA9IHVzZUJvb3RzdHJhcFByZWZpeChic1ByZWZpeCwgJ29mZmNhbnZhcycpO1xuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goVHJhbnNpdGlvbldyYXBwZXIsIHtcbiAgICByZWY6IHJlZixcbiAgICBhZGRFbmRMaXN0ZW5lcjogdHJhbnNpdGlvbkVuZExpc3RlbmVyLFxuICAgIGluOiBpblByb3AsXG4gICAgbW91bnRPbkVudGVyOiBtb3VudE9uRW50ZXIsXG4gICAgdW5tb3VudE9uRXhpdDogdW5tb3VudE9uRXhpdCxcbiAgICBhcHBlYXI6IGFwcGVhcixcbiAgICAuLi5wcm9wcyxcbiAgICBjaGlsZFJlZjogY2hpbGRyZW4ucmVmLFxuICAgIGNoaWxkcmVuOiAoc3RhdHVzLCBpbm5lclByb3BzKSA9PiAvKiNfX1BVUkVfXyovUmVhY3QuY2xvbmVFbGVtZW50KGNoaWxkcmVuLCB7XG4gICAgICAuLi5pbm5lclByb3BzLFxuICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGNsYXNzTmFtZSwgY2hpbGRyZW4ucHJvcHMuY2xhc3NOYW1lLCAoc3RhdHVzID09PSBFTlRFUklORyB8fCBzdGF0dXMgPT09IEVYSVRJTkcpICYmIGAke2JzUHJlZml4fS10b2dnbGluZ2AsIHRyYW5zaXRpb25TdHlsZXNbc3RhdHVzXSlcbiAgICB9KVxuICB9KTtcbn0pO1xuT2ZmY2FudmFzVG9nZ2xpbmcuZGlzcGxheU5hbWUgPSAnT2ZmY2FudmFzVG9nZ2xpbmcnO1xuZXhwb3J0IGRlZmF1bHQgT2ZmY2FudmFzVG9nZ2xpbmc7IiwiXCJ1c2UgY2xpZW50XCI7XG5cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmNvbnN0IE1vZGFsQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICBvbkhpZGUoKSB7fVxufSk7XG5leHBvcnQgZGVmYXVsdCBNb2RhbENvbnRleHQ7IiwiaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmNvbnN0IHByb3BUeXBlcyA9IHtcbiAgLyoqIEFuIGFjY2Vzc2libGUgbGFiZWwgaW5kaWNhdGluZyB0aGUgcmVsZXZhbnQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIENsb3NlIEJ1dHRvbi4gKi9cbiAgJ2FyaWEtbGFiZWwnOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAvKiogQSBjYWxsYmFjayBmaXJlZCBhZnRlciB0aGUgQ2xvc2UgQnV0dG9uIGlzIGNsaWNrZWQuICovXG4gIG9uQ2xpY2s6IFByb3BUeXBlcy5mdW5jLFxuICAvKipcbiAgICogUmVuZGVyIGRpZmZlcmVudCBjb2xvciB2YXJpYW50IGZvciB0aGUgYnV0dG9uLlxuICAgKlxuICAgKiBPbWl0dGluZyB0aGlzIHdpbGwgcmVuZGVyIHRoZSBkZWZhdWx0IGRhcmsgY29sb3IuXG4gICAqL1xuICB2YXJpYW50OiBQcm9wVHlwZXMub25lT2YoWyd3aGl0ZSddKVxufTtcbmNvbnN0IENsb3NlQnV0dG9uID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHtcbiAgY2xhc3NOYW1lLFxuICB2YXJpYW50LFxuICAnYXJpYS1sYWJlbCc6IGFyaWFMYWJlbCA9ICdDbG9zZScsXG4gIC4uLnByb3BzXG59LCByZWYpID0+IC8qI19fUFVSRV9fKi9fanN4KFwiYnV0dG9uXCIsIHtcbiAgcmVmOiByZWYsXG4gIHR5cGU6IFwiYnV0dG9uXCIsXG4gIGNsYXNzTmFtZTogY2xhc3NOYW1lcygnYnRuLWNsb3NlJywgdmFyaWFudCAmJiBgYnRuLWNsb3NlLSR7dmFyaWFudH1gLCBjbGFzc05hbWUpLFxuICBcImFyaWEtbGFiZWxcIjogYXJpYUxhYmVsLFxuICAuLi5wcm9wc1xufSkpO1xuQ2xvc2VCdXR0b24uZGlzcGxheU5hbWUgPSAnQ2xvc2VCdXR0b24nO1xuQ2xvc2VCdXR0b24ucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuZXhwb3J0IGRlZmF1bHQgQ2xvc2VCdXR0b247IiwiXCJ1c2UgY2xpZW50XCI7XG5cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdXNlRXZlbnRDYWxsYmFjayBmcm9tICdAcmVzdGFydC9ob29rcy91c2VFdmVudENhbGxiYWNrJztcbmltcG9ydCBDbG9zZUJ1dHRvbiBmcm9tICcuL0Nsb3NlQnV0dG9uJztcbmltcG9ydCBNb2RhbENvbnRleHQgZnJvbSAnLi9Nb2RhbENvbnRleHQnO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IGpzeHMgYXMgX2pzeHMgfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmNvbnN0IEFic3RyYWN0TW9kYWxIZWFkZXIgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigoe1xuICBjbG9zZUxhYmVsID0gJ0Nsb3NlJyxcbiAgY2xvc2VWYXJpYW50LFxuICBjbG9zZUJ1dHRvbiA9IGZhbHNlLFxuICBvbkhpZGUsXG4gIGNoaWxkcmVuLFxuICAuLi5wcm9wc1xufSwgcmVmKSA9PiB7XG4gIGNvbnN0IGNvbnRleHQgPSB1c2VDb250ZXh0KE1vZGFsQ29udGV4dCk7XG4gIGNvbnN0IGhhbmRsZUNsaWNrID0gdXNlRXZlbnRDYWxsYmFjaygoKSA9PiB7XG4gICAgY29udGV4dCA9PSBudWxsID8gdm9pZCAwIDogY29udGV4dC5vbkhpZGUoKTtcbiAgICBvbkhpZGUgPT0gbnVsbCA/IHZvaWQgMCA6IG9uSGlkZSgpO1xuICB9KTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4cyhcImRpdlwiLCB7XG4gICAgcmVmOiByZWYsXG4gICAgLi4ucHJvcHMsXG4gICAgY2hpbGRyZW46IFtjaGlsZHJlbiwgY2xvc2VCdXR0b24gJiYgLyojX19QVVJFX18qL19qc3goQ2xvc2VCdXR0b24sIHtcbiAgICAgIFwiYXJpYS1sYWJlbFwiOiBjbG9zZUxhYmVsLFxuICAgICAgdmFyaWFudDogY2xvc2VWYXJpYW50LFxuICAgICAgb25DbGljazogaGFuZGxlQ2xpY2tcbiAgICB9KV1cbiAgfSk7XG59KTtcbmV4cG9ydCBkZWZhdWx0IEFic3RyYWN0TW9kYWxIZWFkZXI7IiwiXCJ1c2UgY2xpZW50XCI7XG5cbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQm9vdHN0cmFwUHJlZml4IH0gZnJvbSAnLi9UaGVtZVByb3ZpZGVyJztcbmltcG9ydCBBYnN0cmFjdE1vZGFsSGVhZGVyIGZyb20gJy4vQWJzdHJhY3RNb2RhbEhlYWRlcic7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgT2ZmY2FudmFzSGVhZGVyID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHtcbiAgYnNQcmVmaXgsXG4gIGNsYXNzTmFtZSxcbiAgY2xvc2VMYWJlbCA9ICdDbG9zZScsXG4gIGNsb3NlQnV0dG9uID0gZmFsc2UsXG4gIC4uLnByb3BzXG59LCByZWYpID0+IHtcbiAgYnNQcmVmaXggPSB1c2VCb290c3RyYXBQcmVmaXgoYnNQcmVmaXgsICdvZmZjYW52YXMtaGVhZGVyJyk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChBYnN0cmFjdE1vZGFsSGVhZGVyLCB7XG4gICAgcmVmOiByZWYsXG4gICAgLi4ucHJvcHMsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGNsYXNzTmFtZSwgYnNQcmVmaXgpLFxuICAgIGNsb3NlTGFiZWw6IGNsb3NlTGFiZWwsXG4gICAgY2xvc2VCdXR0b246IGNsb3NlQnV0dG9uXG4gIH0pO1xufSk7XG5PZmZjYW52YXNIZWFkZXIuZGlzcGxheU5hbWUgPSAnT2ZmY2FudmFzSGVhZGVyJztcbmV4cG9ydCBkZWZhdWx0IE9mZmNhbnZhc0hlYWRlcjsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5leHBvcnQgZGVmYXVsdCAoY2xhc3NOYW1lID0+IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKChwLCByZWYpID0+IC8qI19fUFVSRV9fKi9fanN4KFwiZGl2XCIsIHtcbiAgLi4ucCxcbiAgcmVmOiByZWYsXG4gIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhwLmNsYXNzTmFtZSwgY2xhc3NOYW1lKVxufSkpKTsiLCJcInVzZSBjbGllbnRcIjtcblxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgZGl2V2l0aENsYXNzTmFtZSBmcm9tICcuL2RpdldpdGhDbGFzc05hbWUnO1xuaW1wb3J0IHsgdXNlQm9vdHN0cmFwUHJlZml4IH0gZnJvbSAnLi9UaGVtZVByb3ZpZGVyJztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5jb25zdCBEaXZTdHlsZWRBc0g1ID0gZGl2V2l0aENsYXNzTmFtZSgnaDUnKTtcbmNvbnN0IE9mZmNhbnZhc1RpdGxlID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHtcbiAgY2xhc3NOYW1lLFxuICBic1ByZWZpeCxcbiAgYXM6IENvbXBvbmVudCA9IERpdlN0eWxlZEFzSDUsXG4gIC4uLnByb3BzXG59LCByZWYpID0+IHtcbiAgYnNQcmVmaXggPSB1c2VCb290c3RyYXBQcmVmaXgoYnNQcmVmaXgsICdvZmZjYW52YXMtdGl0bGUnKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KENvbXBvbmVudCwge1xuICAgIHJlZjogcmVmLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjbGFzc05hbWUsIGJzUHJlZml4KSxcbiAgICAuLi5wcm9wc1xuICB9KTtcbn0pO1xuT2ZmY2FudmFzVGl0bGUuZGlzcGxheU5hbWUgPSAnT2ZmY2FudmFzVGl0bGUnO1xuZXhwb3J0IGRlZmF1bHQgT2ZmY2FudmFzVGl0bGU7IiwiLyoqXG4gKiBDaGVja3MgaWYgYSBnaXZlbiBlbGVtZW50IGhhcyBhIENTUyBjbGFzcy5cbiAqIFxuICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnRcbiAqIEBwYXJhbSBjbGFzc05hbWUgdGhlIENTUyBjbGFzcyBuYW1lXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGhhc0NsYXNzKGVsZW1lbnQsIGNsYXNzTmFtZSkge1xuICBpZiAoZWxlbWVudC5jbGFzc0xpc3QpIHJldHVybiAhIWNsYXNzTmFtZSAmJiBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWUpO1xuICByZXR1cm4gKFwiIFwiICsgKGVsZW1lbnQuY2xhc3NOYW1lLmJhc2VWYWwgfHwgZWxlbWVudC5jbGFzc05hbWUpICsgXCIgXCIpLmluZGV4T2YoXCIgXCIgKyBjbGFzc05hbWUgKyBcIiBcIikgIT09IC0xO1xufSIsImltcG9ydCBoYXNDbGFzcyBmcm9tICcuL2hhc0NsYXNzJztcbi8qKlxuICogQWRkcyBhIENTUyBjbGFzcyB0byBhIGdpdmVuIGVsZW1lbnQuXG4gKiBcbiAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50XG4gKiBAcGFyYW0gY2xhc3NOYW1lIHRoZSBDU1MgY2xhc3MgbmFtZVxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGFkZENsYXNzKGVsZW1lbnQsIGNsYXNzTmFtZSkge1xuICBpZiAoZWxlbWVudC5jbGFzc0xpc3QpIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChjbGFzc05hbWUpO2Vsc2UgaWYgKCFoYXNDbGFzcyhlbGVtZW50LCBjbGFzc05hbWUpKSBpZiAodHlwZW9mIGVsZW1lbnQuY2xhc3NOYW1lID09PSAnc3RyaW5nJykgZWxlbWVudC5jbGFzc05hbWUgPSBlbGVtZW50LmNsYXNzTmFtZSArIFwiIFwiICsgY2xhc3NOYW1lO2Vsc2UgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgKGVsZW1lbnQuY2xhc3NOYW1lICYmIGVsZW1lbnQuY2xhc3NOYW1lLmJhc2VWYWwgfHwgJycpICsgXCIgXCIgKyBjbGFzc05hbWUpO1xufSIsInZhciB0b0FycmF5ID0gRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQuY2FsbChGdW5jdGlvbi5wcm90b3R5cGUuY2FsbCwgW10uc2xpY2UpO1xuLyoqXG4gKiBSdW5zIGBxdWVyeVNlbGVjdG9yQWxsYCBvbiBhIGdpdmVuIGVsZW1lbnQuXG4gKiBcbiAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50XG4gKiBAcGFyYW0gc2VsZWN0b3IgdGhlIHNlbGVjdG9yXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcXNhKGVsZW1lbnQsIHNlbGVjdG9yKSB7XG4gIHJldHVybiB0b0FycmF5KGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcikpO1xufSIsImZ1bmN0aW9uIHJlcGxhY2VDbGFzc05hbWUob3JpZ0NsYXNzLCBjbGFzc1RvUmVtb3ZlKSB7XG4gIHJldHVybiBvcmlnQ2xhc3MucmVwbGFjZShuZXcgUmVnRXhwKFwiKF58XFxcXHMpXCIgKyBjbGFzc1RvUmVtb3ZlICsgXCIoPzpcXFxcc3wkKVwiLCAnZycpLCAnJDEnKS5yZXBsYWNlKC9cXHMrL2csICcgJykucmVwbGFjZSgvXlxccyp8XFxzKiQvZywgJycpO1xufVxuLyoqXG4gKiBSZW1vdmVzIGEgQ1NTIGNsYXNzIGZyb20gYSBnaXZlbiBlbGVtZW50LlxuICogXG4gKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudFxuICogQHBhcmFtIGNsYXNzTmFtZSB0aGUgQ1NTIGNsYXNzIG5hbWVcbiAqL1xuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlbW92ZUNsYXNzKGVsZW1lbnQsIGNsYXNzTmFtZSkge1xuICBpZiAoZWxlbWVudC5jbGFzc0xpc3QpIHtcbiAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoY2xhc3NOYW1lKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgZWxlbWVudC5jbGFzc05hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgZWxlbWVudC5jbGFzc05hbWUgPSByZXBsYWNlQ2xhc3NOYW1lKGVsZW1lbnQuY2xhc3NOYW1lLCBjbGFzc05hbWUpO1xuICB9IGVsc2Uge1xuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdjbGFzcycsIHJlcGxhY2VDbGFzc05hbWUoZWxlbWVudC5jbGFzc05hbWUgJiYgZWxlbWVudC5jbGFzc05hbWUuYmFzZVZhbCB8fCAnJywgY2xhc3NOYW1lKSk7XG4gIH1cbn0iLCJpbXBvcnQgYWRkQ2xhc3MgZnJvbSAnZG9tLWhlbHBlcnMvYWRkQ2xhc3MnO1xuaW1wb3J0IGNzcyBmcm9tICdkb20taGVscGVycy9jc3MnO1xuaW1wb3J0IHFzYSBmcm9tICdkb20taGVscGVycy9xdWVyeVNlbGVjdG9yQWxsJztcbmltcG9ydCByZW1vdmVDbGFzcyBmcm9tICdkb20taGVscGVycy9yZW1vdmVDbGFzcyc7XG5pbXBvcnQgTW9kYWxNYW5hZ2VyIGZyb20gJ0ByZXN0YXJ0L3VpL01vZGFsTWFuYWdlcic7XG5jb25zdCBTZWxlY3RvciA9IHtcbiAgRklYRURfQ09OVEVOVDogJy5maXhlZC10b3AsIC5maXhlZC1ib3R0b20sIC5pcy1maXhlZCwgLnN0aWNreS10b3AnLFxuICBTVElDS1lfQ09OVEVOVDogJy5zdGlja3ktdG9wJyxcbiAgTkFWQkFSX1RPR0dMRVI6ICcubmF2YmFyLXRvZ2dsZXInXG59O1xuY2xhc3MgQm9vdHN0cmFwTW9kYWxNYW5hZ2VyIGV4dGVuZHMgTW9kYWxNYW5hZ2VyIHtcbiAgYWRqdXN0QW5kU3RvcmUocHJvcCwgZWxlbWVudCwgYWRqdXN0KSB7XG4gICAgY29uc3QgYWN0dWFsID0gZWxlbWVudC5zdHlsZVtwcm9wXTtcbiAgICAvLyBUT0RPOiBET01TdHJpbmdNYXAgYW5kIENTU1N0eWxlRGVjbGFyYXRpb24gYXJlbid0IHN0cmljdGx5IGNvbXBhdGlibGVcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgZWxlbWVudC5kYXRhc2V0W3Byb3BdID0gYWN0dWFsO1xuICAgIGNzcyhlbGVtZW50LCB7XG4gICAgICBbcHJvcF06IGAke3BhcnNlRmxvYXQoY3NzKGVsZW1lbnQsIHByb3ApKSArIGFkanVzdH1weGBcbiAgICB9KTtcbiAgfVxuICByZXN0b3JlKHByb3AsIGVsZW1lbnQpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGVsZW1lbnQuZGF0YXNldFtwcm9wXTtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZGVsZXRlIGVsZW1lbnQuZGF0YXNldFtwcm9wXTtcbiAgICAgIGNzcyhlbGVtZW50LCB7XG4gICAgICAgIFtwcm9wXTogdmFsdWVcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBzZXRDb250YWluZXJTdHlsZShjb250YWluZXJTdGF0ZSkge1xuICAgIHN1cGVyLnNldENvbnRhaW5lclN0eWxlKGNvbnRhaW5lclN0YXRlKTtcbiAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmdldEVsZW1lbnQoKTtcbiAgICBhZGRDbGFzcyhjb250YWluZXIsICdtb2RhbC1vcGVuJyk7XG4gICAgaWYgKCFjb250YWluZXJTdGF0ZS5zY3JvbGxCYXJXaWR0aCkgcmV0dXJuO1xuICAgIGNvbnN0IHBhZGRpbmdQcm9wID0gdGhpcy5pc1JUTCA/ICdwYWRkaW5nTGVmdCcgOiAncGFkZGluZ1JpZ2h0JztcbiAgICBjb25zdCBtYXJnaW5Qcm9wID0gdGhpcy5pc1JUTCA/ICdtYXJnaW5MZWZ0JyA6ICdtYXJnaW5SaWdodCc7XG4gICAgcXNhKGNvbnRhaW5lciwgU2VsZWN0b3IuRklYRURfQ09OVEVOVCkuZm9yRWFjaChlbCA9PiB0aGlzLmFkanVzdEFuZFN0b3JlKHBhZGRpbmdQcm9wLCBlbCwgY29udGFpbmVyU3RhdGUuc2Nyb2xsQmFyV2lkdGgpKTtcbiAgICBxc2EoY29udGFpbmVyLCBTZWxlY3Rvci5TVElDS1lfQ09OVEVOVCkuZm9yRWFjaChlbCA9PiB0aGlzLmFkanVzdEFuZFN0b3JlKG1hcmdpblByb3AsIGVsLCAtY29udGFpbmVyU3RhdGUuc2Nyb2xsQmFyV2lkdGgpKTtcbiAgICBxc2EoY29udGFpbmVyLCBTZWxlY3Rvci5OQVZCQVJfVE9HR0xFUikuZm9yRWFjaChlbCA9PiB0aGlzLmFkanVzdEFuZFN0b3JlKG1hcmdpblByb3AsIGVsLCBjb250YWluZXJTdGF0ZS5zY3JvbGxCYXJXaWR0aCkpO1xuICB9XG4gIHJlbW92ZUNvbnRhaW5lclN0eWxlKGNvbnRhaW5lclN0YXRlKSB7XG4gICAgc3VwZXIucmVtb3ZlQ29udGFpbmVyU3R5bGUoY29udGFpbmVyU3RhdGUpO1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuZ2V0RWxlbWVudCgpO1xuICAgIHJlbW92ZUNsYXNzKGNvbnRhaW5lciwgJ21vZGFsLW9wZW4nKTtcbiAgICBjb25zdCBwYWRkaW5nUHJvcCA9IHRoaXMuaXNSVEwgPyAncGFkZGluZ0xlZnQnIDogJ3BhZGRpbmdSaWdodCc7XG4gICAgY29uc3QgbWFyZ2luUHJvcCA9IHRoaXMuaXNSVEwgPyAnbWFyZ2luTGVmdCcgOiAnbWFyZ2luUmlnaHQnO1xuICAgIHFzYShjb250YWluZXIsIFNlbGVjdG9yLkZJWEVEX0NPTlRFTlQpLmZvckVhY2goZWwgPT4gdGhpcy5yZXN0b3JlKHBhZGRpbmdQcm9wLCBlbCkpO1xuICAgIHFzYShjb250YWluZXIsIFNlbGVjdG9yLlNUSUNLWV9DT05URU5UKS5mb3JFYWNoKGVsID0+IHRoaXMucmVzdG9yZShtYXJnaW5Qcm9wLCBlbCkpO1xuICAgIHFzYShjb250YWluZXIsIFNlbGVjdG9yLk5BVkJBUl9UT0dHTEVSKS5mb3JFYWNoKGVsID0+IHRoaXMucmVzdG9yZShtYXJnaW5Qcm9wLCBlbCkpO1xuICB9XG59XG5sZXQgc2hhcmVkTWFuYWdlcjtcbmV4cG9ydCBmdW5jdGlvbiBnZXRTaGFyZWRNYW5hZ2VyKG9wdGlvbnMpIHtcbiAgaWYgKCFzaGFyZWRNYW5hZ2VyKSBzaGFyZWRNYW5hZ2VyID0gbmV3IEJvb3RzdHJhcE1vZGFsTWFuYWdlcihvcHRpb25zKTtcbiAgcmV0dXJuIHNoYXJlZE1hbmFnZXI7XG59XG5leHBvcnQgZGVmYXVsdCBCb290c3RyYXBNb2RhbE1hbmFnZXI7IiwiXCJ1c2UgY2xpZW50XCI7XG5cbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHVzZUJyZWFrcG9pbnQgZnJvbSAnQHJlc3RhcnQvaG9va3MvdXNlQnJlYWtwb2ludCc7XG5pbXBvcnQgdXNlRXZlbnRDYWxsYmFjayBmcm9tICdAcmVzdGFydC9ob29rcy91c2VFdmVudENhbGxiYWNrJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUNhbGxiYWNrLCB1c2VDb250ZXh0LCB1c2VFZmZlY3QsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgQmFzZU1vZGFsIGZyb20gJ0ByZXN0YXJ0L3VpL01vZGFsJztcbmltcG9ydCBGYWRlIGZyb20gJy4vRmFkZSc7XG5pbXBvcnQgT2ZmY2FudmFzQm9keSBmcm9tICcuL09mZmNhbnZhc0JvZHknO1xuaW1wb3J0IE9mZmNhbnZhc1RvZ2dsaW5nIGZyb20gJy4vT2ZmY2FudmFzVG9nZ2xpbmcnO1xuaW1wb3J0IE1vZGFsQ29udGV4dCBmcm9tICcuL01vZGFsQ29udGV4dCc7XG5pbXBvcnQgTmF2YmFyQ29udGV4dCBmcm9tICcuL05hdmJhckNvbnRleHQnO1xuaW1wb3J0IE9mZmNhbnZhc0hlYWRlciBmcm9tICcuL09mZmNhbnZhc0hlYWRlcic7XG5pbXBvcnQgT2ZmY2FudmFzVGl0bGUgZnJvbSAnLi9PZmZjYW52YXNUaXRsZSc7XG5pbXBvcnQgeyB1c2VCb290c3RyYXBQcmVmaXggfSBmcm9tICcuL1RoZW1lUHJvdmlkZXInO1xuaW1wb3J0IEJvb3RzdHJhcE1vZGFsTWFuYWdlciwgeyBnZXRTaGFyZWRNYW5hZ2VyIH0gZnJvbSAnLi9Cb290c3RyYXBNb2RhbE1hbmFnZXInO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IEZyYWdtZW50IGFzIF9GcmFnbWVudCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuZnVuY3Rpb24gRGlhbG9nVHJhbnNpdGlvbihwcm9wcykge1xuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goT2ZmY2FudmFzVG9nZ2xpbmcsIHtcbiAgICAuLi5wcm9wc1xuICB9KTtcbn1cbmZ1bmN0aW9uIEJhY2tkcm9wVHJhbnNpdGlvbihwcm9wcykge1xuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goRmFkZSwge1xuICAgIC4uLnByb3BzXG4gIH0pO1xufVxuY29uc3QgT2ZmY2FudmFzID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHtcbiAgYnNQcmVmaXgsXG4gIGNsYXNzTmFtZSxcbiAgY2hpbGRyZW4sXG4gICdhcmlhLWxhYmVsbGVkYnknOiBhcmlhTGFiZWxsZWRieSxcbiAgcGxhY2VtZW50ID0gJ3N0YXJ0JyxcbiAgcmVzcG9uc2l2ZSxcbiAgLyogQmFzZU1vZGFsIHByb3BzICovXG5cbiAgc2hvdyA9IGZhbHNlLFxuICBiYWNrZHJvcCA9IHRydWUsXG4gIGtleWJvYXJkID0gdHJ1ZSxcbiAgc2Nyb2xsID0gZmFsc2UsXG4gIG9uRXNjYXBlS2V5RG93bixcbiAgb25TaG93LFxuICBvbkhpZGUsXG4gIGNvbnRhaW5lcixcbiAgYXV0b0ZvY3VzID0gdHJ1ZSxcbiAgZW5mb3JjZUZvY3VzID0gdHJ1ZSxcbiAgcmVzdG9yZUZvY3VzID0gdHJ1ZSxcbiAgcmVzdG9yZUZvY3VzT3B0aW9ucyxcbiAgb25FbnRlcmVkLFxuICBvbkV4aXQsXG4gIG9uRXhpdGluZyxcbiAgb25FbnRlcixcbiAgb25FbnRlcmluZyxcbiAgb25FeGl0ZWQsXG4gIGJhY2tkcm9wQ2xhc3NOYW1lLFxuICBtYW5hZ2VyOiBwcm9wc01hbmFnZXIsXG4gIHJlbmRlclN0YXRpY05vZGUgPSBmYWxzZSxcbiAgLi4ucHJvcHNcbn0sIHJlZikgPT4ge1xuICBjb25zdCBtb2RhbE1hbmFnZXIgPSB1c2VSZWYoKTtcbiAgYnNQcmVmaXggPSB1c2VCb290c3RyYXBQcmVmaXgoYnNQcmVmaXgsICdvZmZjYW52YXMnKTtcbiAgY29uc3Qge1xuICAgIG9uVG9nZ2xlXG4gIH0gPSB1c2VDb250ZXh0KE5hdmJhckNvbnRleHQpIHx8IHt9O1xuICBjb25zdCBbc2hvd09mZmNhbnZhcywgc2V0U2hvd09mZmNhbnZhc10gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IGhpZGVSZXNwb25zaXZlT2ZmY2FudmFzID0gdXNlQnJlYWtwb2ludChyZXNwb25zaXZlIHx8ICd4cycsICd1cCcpO1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIC8vIEhhbmRsZXMgdGhlIGNhc2Ugd2hlcmUgc2NyZWVuIGlzIHJlc2l6ZWQgd2hpbGUgdGhlIHJlc3BvbnNpdmVcbiAgICAvLyBvZmZjYW52YXMgaXMgc2hvd24uIElmIGByZXNwb25zaXZlYCBub3QgcHJvdmlkZWQsIGp1c3QgdXNlIGBzaG93YC5cbiAgICBzZXRTaG93T2ZmY2FudmFzKHJlc3BvbnNpdmUgPyBzaG93ICYmICFoaWRlUmVzcG9uc2l2ZU9mZmNhbnZhcyA6IHNob3cpO1xuICB9LCBbc2hvdywgcmVzcG9uc2l2ZSwgaGlkZVJlc3BvbnNpdmVPZmZjYW52YXNdKTtcbiAgY29uc3QgaGFuZGxlSGlkZSA9IHVzZUV2ZW50Q2FsbGJhY2soKCkgPT4ge1xuICAgIG9uVG9nZ2xlID09IG51bGwgPyB2b2lkIDAgOiBvblRvZ2dsZSgpO1xuICAgIG9uSGlkZSA9PSBudWxsID8gdm9pZCAwIDogb25IaWRlKCk7XG4gIH0pO1xuICBjb25zdCBtb2RhbENvbnRleHQgPSB1c2VNZW1vKCgpID0+ICh7XG4gICAgb25IaWRlOiBoYW5kbGVIaWRlXG4gIH0pLCBbaGFuZGxlSGlkZV0pO1xuICBmdW5jdGlvbiBnZXRNb2RhbE1hbmFnZXIoKSB7XG4gICAgaWYgKHByb3BzTWFuYWdlcikgcmV0dXJuIHByb3BzTWFuYWdlcjtcbiAgICBpZiAoc2Nyb2xsKSB7XG4gICAgICAvLyBIYXZlIHRvIHVzZSBhIGRpZmZlcmVudCBtb2RhbCBtYW5hZ2VyIHNpbmNlIHRoZSBzaGFyZWRcbiAgICAgIC8vIG9uZSBoYW5kbGVzIG92ZXJmbG93LlxuICAgICAgaWYgKCFtb2RhbE1hbmFnZXIuY3VycmVudCkgbW9kYWxNYW5hZ2VyLmN1cnJlbnQgPSBuZXcgQm9vdHN0cmFwTW9kYWxNYW5hZ2VyKHtcbiAgICAgICAgaGFuZGxlQ29udGFpbmVyT3ZlcmZsb3c6IGZhbHNlXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBtb2RhbE1hbmFnZXIuY3VycmVudDtcbiAgICB9XG4gICAgcmV0dXJuIGdldFNoYXJlZE1hbmFnZXIoKTtcbiAgfVxuICBjb25zdCBoYW5kbGVFbnRlciA9IChub2RlLCAuLi5hcmdzKSA9PiB7XG4gICAgaWYgKG5vZGUpIG5vZGUuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJztcbiAgICBvbkVudGVyID09IG51bGwgPyB2b2lkIDAgOiBvbkVudGVyKG5vZGUsIC4uLmFyZ3MpO1xuICB9O1xuICBjb25zdCBoYW5kbGVFeGl0ZWQgPSAobm9kZSwgLi4uYXJncykgPT4ge1xuICAgIGlmIChub2RlKSBub2RlLnN0eWxlLnZpc2liaWxpdHkgPSAnJztcbiAgICBvbkV4aXRlZCA9PSBudWxsID8gdm9pZCAwIDogb25FeGl0ZWQoLi4uYXJncyk7XG4gIH07XG4gIGNvbnN0IHJlbmRlckJhY2tkcm9wID0gdXNlQ2FsbGJhY2soYmFja2Ryb3BQcm9wcyA9PiAvKiNfX1BVUkVfXyovX2pzeChcImRpdlwiLCB7XG4gICAgLi4uYmFja2Ryb3BQcm9wcyxcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoYCR7YnNQcmVmaXh9LWJhY2tkcm9wYCwgYmFja2Ryb3BDbGFzc05hbWUpXG4gIH0pLCBbYmFja2Ryb3BDbGFzc05hbWUsIGJzUHJlZml4XSk7XG4gIGNvbnN0IHJlbmRlckRpYWxvZyA9IGRpYWxvZ1Byb3BzID0+IC8qI19fUFVSRV9fKi9fanN4KFwiZGl2XCIsIHtcbiAgICAuLi5kaWFsb2dQcm9wcyxcbiAgICAuLi5wcm9wcyxcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoY2xhc3NOYW1lLCByZXNwb25zaXZlID8gYCR7YnNQcmVmaXh9LSR7cmVzcG9uc2l2ZX1gIDogYnNQcmVmaXgsIGAke2JzUHJlZml4fS0ke3BsYWNlbWVudH1gKSxcbiAgICBcImFyaWEtbGFiZWxsZWRieVwiOiBhcmlhTGFiZWxsZWRieSxcbiAgICBjaGlsZHJlbjogY2hpbGRyZW5cbiAgfSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeHMoX0ZyYWdtZW50LCB7XG4gICAgY2hpbGRyZW46IFshc2hvd09mZmNhbnZhcyAmJiAocmVzcG9uc2l2ZSB8fCByZW5kZXJTdGF0aWNOb2RlKSAmJiByZW5kZXJEaWFsb2coe30pLCAvKiNfX1BVUkVfXyovX2pzeChNb2RhbENvbnRleHQuUHJvdmlkZXIsIHtcbiAgICAgIHZhbHVlOiBtb2RhbENvbnRleHQsXG4gICAgICBjaGlsZHJlbjogLyojX19QVVJFX18qL19qc3goQmFzZU1vZGFsLCB7XG4gICAgICAgIHNob3c6IHNob3dPZmZjYW52YXMsXG4gICAgICAgIHJlZjogcmVmLFxuICAgICAgICBiYWNrZHJvcDogYmFja2Ryb3AsXG4gICAgICAgIGNvbnRhaW5lcjogY29udGFpbmVyLFxuICAgICAgICBrZXlib2FyZDoga2V5Ym9hcmQsXG4gICAgICAgIGF1dG9Gb2N1czogYXV0b0ZvY3VzLFxuICAgICAgICBlbmZvcmNlRm9jdXM6IGVuZm9yY2VGb2N1cyAmJiAhc2Nyb2xsLFxuICAgICAgICByZXN0b3JlRm9jdXM6IHJlc3RvcmVGb2N1cyxcbiAgICAgICAgcmVzdG9yZUZvY3VzT3B0aW9uczogcmVzdG9yZUZvY3VzT3B0aW9ucyxcbiAgICAgICAgb25Fc2NhcGVLZXlEb3duOiBvbkVzY2FwZUtleURvd24sXG4gICAgICAgIG9uU2hvdzogb25TaG93LFxuICAgICAgICBvbkhpZGU6IGhhbmRsZUhpZGUsXG4gICAgICAgIG9uRW50ZXI6IGhhbmRsZUVudGVyLFxuICAgICAgICBvbkVudGVyaW5nOiBvbkVudGVyaW5nLFxuICAgICAgICBvbkVudGVyZWQ6IG9uRW50ZXJlZCxcbiAgICAgICAgb25FeGl0OiBvbkV4aXQsXG4gICAgICAgIG9uRXhpdGluZzogb25FeGl0aW5nLFxuICAgICAgICBvbkV4aXRlZDogaGFuZGxlRXhpdGVkLFxuICAgICAgICBtYW5hZ2VyOiBnZXRNb2RhbE1hbmFnZXIoKSxcbiAgICAgICAgdHJhbnNpdGlvbjogRGlhbG9nVHJhbnNpdGlvbixcbiAgICAgICAgYmFja2Ryb3BUcmFuc2l0aW9uOiBCYWNrZHJvcFRyYW5zaXRpb24sXG4gICAgICAgIHJlbmRlckJhY2tkcm9wOiByZW5kZXJCYWNrZHJvcCxcbiAgICAgICAgcmVuZGVyRGlhbG9nOiByZW5kZXJEaWFsb2dcbiAgICAgIH0pXG4gICAgfSldXG4gIH0pO1xufSk7XG5PZmZjYW52YXMuZGlzcGxheU5hbWUgPSAnT2ZmY2FudmFzJztcbmV4cG9ydCBkZWZhdWx0IE9iamVjdC5hc3NpZ24oT2ZmY2FudmFzLCB7XG4gIEJvZHk6IE9mZmNhbnZhc0JvZHksXG4gIEhlYWRlcjogT2ZmY2FudmFzSGVhZGVyLFxuICBUaXRsZTogT2ZmY2FudmFzVGl0bGVcbn0pOyIsIlwidXNlIGNsaWVudFwiO1xuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VDb250ZXh0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IE9mZmNhbnZhcyBmcm9tICcuL09mZmNhbnZhcyc7XG5pbXBvcnQgTmF2YmFyQ29udGV4dCBmcm9tICcuL05hdmJhckNvbnRleHQnO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmNvbnN0IE5hdmJhck9mZmNhbnZhcyA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKChwcm9wcywgcmVmKSA9PiB7XG4gIGNvbnN0IGNvbnRleHQgPSB1c2VDb250ZXh0KE5hdmJhckNvbnRleHQpO1xuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goT2ZmY2FudmFzLCB7XG4gICAgcmVmOiByZWYsXG4gICAgc2hvdzogISEoY29udGV4dCAhPSBudWxsICYmIGNvbnRleHQuZXhwYW5kZWQpLFxuICAgIC4uLnByb3BzLFxuICAgIHJlbmRlclN0YXRpY05vZGU6IHRydWVcbiAgfSk7XG59KTtcbk5hdmJhck9mZmNhbnZhcy5kaXNwbGF5TmFtZSA9ICdOYXZiYXJPZmZjYW52YXMnO1xuZXhwb3J0IGRlZmF1bHQgTmF2YmFyT2ZmY2FudmFzOyIsIlwidXNlIGNsaWVudFwiO1xuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB7IHVzZUJvb3RzdHJhcFByZWZpeCB9IGZyb20gJy4vVGhlbWVQcm92aWRlcic7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgTmF2YmFyVGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKCh7XG4gIGNsYXNzTmFtZSxcbiAgYnNQcmVmaXgsXG4gIGFzOiBDb21wb25lbnQgPSAnc3BhbicsXG4gIC4uLnByb3BzXG59LCByZWYpID0+IHtcbiAgYnNQcmVmaXggPSB1c2VCb290c3RyYXBQcmVmaXgoYnNQcmVmaXgsICduYXZiYXItdGV4dCcpO1xuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goQ29tcG9uZW50LCB7XG4gICAgcmVmOiByZWYsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGNsYXNzTmFtZSwgYnNQcmVmaXgpLFxuICAgIC4uLnByb3BzXG4gIH0pO1xufSk7XG5OYXZiYXJUZXh0LmRpc3BsYXlOYW1lID0gJ05hdmJhclRleHQnO1xuZXhwb3J0IGRlZmF1bHQgTmF2YmFyVGV4dDsiLCJcInVzZSBjbGllbnRcIjtcblxuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VDYWxsYmFjaywgdXNlTWVtbyB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBTZWxlY3RhYmxlQ29udGV4dCBmcm9tICdAcmVzdGFydC91aS9TZWxlY3RhYmxlQ29udGV4dCc7XG5pbXBvcnQgeyB1c2VVbmNvbnRyb2xsZWQgfSBmcm9tICd1bmNvbnRyb2xsYWJsZSc7XG5pbXBvcnQgTmF2YmFyQnJhbmQgZnJvbSAnLi9OYXZiYXJCcmFuZCc7XG5pbXBvcnQgTmF2YmFyQ29sbGFwc2UgZnJvbSAnLi9OYXZiYXJDb2xsYXBzZSc7XG5pbXBvcnQgTmF2YmFyVG9nZ2xlIGZyb20gJy4vTmF2YmFyVG9nZ2xlJztcbmltcG9ydCBOYXZiYXJPZmZjYW52YXMgZnJvbSAnLi9OYXZiYXJPZmZjYW52YXMnO1xuaW1wb3J0IHsgdXNlQm9vdHN0cmFwUHJlZml4IH0gZnJvbSAnLi9UaGVtZVByb3ZpZGVyJztcbmltcG9ydCBOYXZiYXJDb250ZXh0IGZyb20gJy4vTmF2YmFyQ29udGV4dCc7XG5pbXBvcnQgTmF2YmFyVGV4dCBmcm9tICcuL05hdmJhclRleHQnO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmNvbnN0IE5hdmJhciA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKChwcm9wcywgcmVmKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBic1ByZWZpeDogaW5pdGlhbEJzUHJlZml4LFxuICAgIGV4cGFuZCA9IHRydWUsXG4gICAgdmFyaWFudCA9ICdsaWdodCcsXG4gICAgYmcsXG4gICAgZml4ZWQsXG4gICAgc3RpY2t5LFxuICAgIGNsYXNzTmFtZSxcbiAgICAvLyBOZWVkIHRvIGRlZmluZSB0aGUgZGVmYXVsdCBcImFzXCIgZHVyaW5nIHByb3AgZGVzdHJ1Y3R1cmluZyB0byBiZSBjb21wYXRpYmxlIHdpdGggc3R5bGVkLWNvbXBvbmVudHMgZ2l0aHViLmNvbS9yZWFjdC1ib290c3RyYXAvcmVhY3QtYm9vdHN0cmFwL2lzc3Vlcy8zNTk1XG4gICAgYXM6IENvbXBvbmVudCA9ICduYXYnLFxuICAgIGV4cGFuZGVkLFxuICAgIG9uVG9nZ2xlLFxuICAgIG9uU2VsZWN0LFxuICAgIGNvbGxhcHNlT25TZWxlY3QgPSBmYWxzZSxcbiAgICAuLi5jb250cm9sbGVkUHJvcHNcbiAgfSA9IHVzZVVuY29udHJvbGxlZChwcm9wcywge1xuICAgIGV4cGFuZGVkOiAnb25Ub2dnbGUnXG4gIH0pO1xuICBjb25zdCBic1ByZWZpeCA9IHVzZUJvb3RzdHJhcFByZWZpeChpbml0aWFsQnNQcmVmaXgsICduYXZiYXInKTtcbiAgY29uc3QgaGFuZGxlQ29sbGFwc2UgPSB1c2VDYWxsYmFjaygoLi4uYXJncykgPT4ge1xuICAgIG9uU2VsZWN0ID09IG51bGwgPyB2b2lkIDAgOiBvblNlbGVjdCguLi5hcmdzKTtcbiAgICBpZiAoY29sbGFwc2VPblNlbGVjdCAmJiBleHBhbmRlZCkge1xuICAgICAgb25Ub2dnbGUgPT0gbnVsbCA/IHZvaWQgMCA6IG9uVG9nZ2xlKGZhbHNlKTtcbiAgICB9XG4gIH0sIFtvblNlbGVjdCwgY29sbGFwc2VPblNlbGVjdCwgZXhwYW5kZWQsIG9uVG9nZ2xlXSk7XG5cbiAgLy8gd2lsbCByZXN1bHQgaW4gc29tZSBmYWxzZSBwb3NpdGl2ZXMgYnV0IHRoYXQgc2VlbXMgYmV0dGVyXG4gIC8vIHRoYW4gZmFsc2UgbmVnYXRpdmVzLiBzdHJpY3QgYHVuZGVmaW5lZGAgY2hlY2sgYWxsb3dzIGV4cGxpY2l0XG4gIC8vIFwibnVsbGluZ1wiIG9mIHRoZSByb2xlIGlmIHRoZSB1c2VyIHJlYWxseSBkb2Vzbid0IHdhbnQgb25lXG4gIGlmIChjb250cm9sbGVkUHJvcHMucm9sZSA9PT0gdW5kZWZpbmVkICYmIENvbXBvbmVudCAhPT0gJ25hdicpIHtcbiAgICBjb250cm9sbGVkUHJvcHMucm9sZSA9ICduYXZpZ2F0aW9uJztcbiAgfVxuICBsZXQgZXhwYW5kQ2xhc3MgPSBgJHtic1ByZWZpeH0tZXhwYW5kYDtcbiAgaWYgKHR5cGVvZiBleHBhbmQgPT09ICdzdHJpbmcnKSBleHBhbmRDbGFzcyA9IGAke2V4cGFuZENsYXNzfS0ke2V4cGFuZH1gO1xuICBjb25zdCBuYXZiYXJDb250ZXh0ID0gdXNlTWVtbygoKSA9PiAoe1xuICAgIG9uVG9nZ2xlOiAoKSA9PiBvblRvZ2dsZSA9PSBudWxsID8gdm9pZCAwIDogb25Ub2dnbGUoIWV4cGFuZGVkKSxcbiAgICBic1ByZWZpeCxcbiAgICBleHBhbmRlZDogISFleHBhbmRlZCxcbiAgICBleHBhbmRcbiAgfSksIFtic1ByZWZpeCwgZXhwYW5kZWQsIGV4cGFuZCwgb25Ub2dnbGVdKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KE5hdmJhckNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogbmF2YmFyQ29udGV4dCxcbiAgICBjaGlsZHJlbjogLyojX19QVVJFX18qL19qc3goU2VsZWN0YWJsZUNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICAgIHZhbHVlOiBoYW5kbGVDb2xsYXBzZSxcbiAgICAgIGNoaWxkcmVuOiAvKiNfX1BVUkVfXyovX2pzeChDb21wb25lbnQsIHtcbiAgICAgICAgcmVmOiByZWYsXG4gICAgICAgIC4uLmNvbnRyb2xsZWRQcm9wcyxcbiAgICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGNsYXNzTmFtZSwgYnNQcmVmaXgsIGV4cGFuZCAmJiBleHBhbmRDbGFzcywgdmFyaWFudCAmJiBgJHtic1ByZWZpeH0tJHt2YXJpYW50fWAsIGJnICYmIGBiZy0ke2JnfWAsIHN0aWNreSAmJiBgc3RpY2t5LSR7c3RpY2t5fWAsIGZpeGVkICYmIGBmaXhlZC0ke2ZpeGVkfWApXG4gICAgICB9KVxuICAgIH0pXG4gIH0pO1xufSk7XG5OYXZiYXIuZGlzcGxheU5hbWUgPSAnTmF2YmFyJztcbmV4cG9ydCBkZWZhdWx0IE9iamVjdC5hc3NpZ24oTmF2YmFyLCB7XG4gIEJyYW5kOiBOYXZiYXJCcmFuZCxcbiAgQ29sbGFwc2U6IE5hdmJhckNvbGxhcHNlLFxuICBPZmZjYW52YXM6IE5hdmJhck9mZmNhbnZhcyxcbiAgVGV4dDogTmF2YmFyVGV4dCxcbiAgVG9nZ2xlOiBOYXZiYXJUb2dnbGVcbn0pOyIsIlwidXNlIGNsaWVudFwiO1xuXG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUJvb3RzdHJhcFByZWZpeCB9IGZyb20gJy4vVGhlbWVQcm92aWRlcic7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgQ29udGFpbmVyID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHtcbiAgYnNQcmVmaXgsXG4gIGZsdWlkID0gZmFsc2UsXG4gIC8vIE5lZWQgdG8gZGVmaW5lIHRoZSBkZWZhdWx0IFwiYXNcIiBkdXJpbmcgcHJvcCBkZXN0cnVjdHVyaW5nIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBzdHlsZWQtY29tcG9uZW50cyBnaXRodWIuY29tL3JlYWN0LWJvb3RzdHJhcC9yZWFjdC1ib290c3RyYXAvaXNzdWVzLzM1OTVcbiAgYXM6IENvbXBvbmVudCA9ICdkaXYnLFxuICBjbGFzc05hbWUsXG4gIC4uLnByb3BzXG59LCByZWYpID0+IHtcbiAgY29uc3QgcHJlZml4ID0gdXNlQm9vdHN0cmFwUHJlZml4KGJzUHJlZml4LCAnY29udGFpbmVyJyk7XG4gIGNvbnN0IHN1ZmZpeCA9IHR5cGVvZiBmbHVpZCA9PT0gJ3N0cmluZycgPyBgLSR7Zmx1aWR9YCA6ICctZmx1aWQnO1xuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goQ29tcG9uZW50LCB7XG4gICAgcmVmOiByZWYsXG4gICAgLi4ucHJvcHMsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGNsYXNzTmFtZSwgZmx1aWQgPyBgJHtwcmVmaXh9JHtzdWZmaXh9YCA6IHByZWZpeClcbiAgfSk7XG59KTtcbkNvbnRhaW5lci5kaXNwbGF5TmFtZSA9ICdDb250YWluZXInO1xuZXhwb3J0IGRlZmF1bHQgQ29udGFpbmVyOyIsImltcG9ydCB7IHVzZVJlZHVjZXIgfSBmcm9tICdyZWFjdCc7XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgdHJpZ2dlcnMgYSBjb21wb25lbnQgdXBkYXRlLiB0aGUgaG9vayBlcXVpdmFsZW50IHRvXG4gKiBgdGhpcy5mb3JjZVVwZGF0ZSgpYCBpbiBhIGNsYXNzIGNvbXBvbmVudC4gSW4gbW9zdCBjYXNlcyB1c2luZyBhIHN0YXRlIHZhbHVlIGRpcmVjdGx5XG4gKiBpcyBwcmVmZXJhYmxlIGJ1dCBtYXkgYmUgcmVxdWlyZWQgaW4gc29tZSBhZHZhbmNlZCB1c2FnZXMgb2YgcmVmcyBmb3IgaW50ZXJvcCBvclxuICogd2hlbiBkaXJlY3QgRE9NIG1hbmlwdWxhdGlvbiBpcyByZXF1aXJlZC5cbiAqXG4gKiBgYGB0c1xuICogY29uc3QgZm9yY2VVcGRhdGUgPSB1c2VGb3JjZVVwZGF0ZSgpO1xuICpcbiAqIGNvbnN0IHVwZGF0ZU9uQ2xpY2sgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gKiAgZm9yY2VVcGRhdGUoKVxuICogfSwgW2ZvcmNlVXBkYXRlXSlcbiAqXG4gKiByZXR1cm4gPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgb25DbGljaz17dXBkYXRlT25DbGlja30+SGkgdGhlcmU8L2J1dHRvbj5cbiAqIGBgYFxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VGb3JjZVVwZGF0ZSgpIHtcbiAgLy8gVGhlIHRvZ2dsaW5nIHN0YXRlIHZhbHVlIGlzIGRlc2lnbmVkIHRvIGRlZmVhdCBSZWFjdCBvcHRpbWl6YXRpb25zIGZvciBza2lwcGluZ1xuICAvLyB1cGRhdGVzIHdoZW4gdGhleSBhcmUgc3RyaWN0bHkgZXF1YWwgdG8gdGhlIGxhc3Qgc3RhdGUgdmFsdWVcbiAgY29uc3QgWywgZGlzcGF0Y2hdID0gdXNlUmVkdWNlcihzdGF0ZSA9PiAhc3RhdGUsIGZhbHNlKTtcbiAgcmV0dXJuIGRpc3BhdGNoO1xufSIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmNvbnN0IE5hdkNvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcbk5hdkNvbnRleHQuZGlzcGxheU5hbWUgPSAnTmF2Q29udGV4dCc7XG5leHBvcnQgZGVmYXVsdCBOYXZDb250ZXh0OyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmNvbnN0IFRhYkNvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcbmV4cG9ydCBkZWZhdWx0IFRhYkNvbnRleHQ7IiwiY29uc3QgX2V4Y2x1ZGVkID0gW1wiYXNcIiwgXCJkaXNhYmxlZFwiXTtcbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpIHsgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307IHZhciB0YXJnZXQgPSB7fTsgdmFyIHNvdXJjZUtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpOyB2YXIga2V5LCBpOyBmb3IgKGkgPSAwOyBpIDwgc291cmNlS2V5cy5sZW5ndGg7IGkrKykgeyBrZXkgPSBzb3VyY2VLZXlzW2ldOyBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlOyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IHJldHVybiB0YXJnZXQ7IH1cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5leHBvcnQgZnVuY3Rpb24gaXNUcml2aWFsSHJlZihocmVmKSB7XG4gIHJldHVybiAhaHJlZiB8fCBocmVmLnRyaW0oKSA9PT0gJyMnO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHVzZUJ1dHRvblByb3BzKHtcbiAgdGFnTmFtZSxcbiAgZGlzYWJsZWQsXG4gIGhyZWYsXG4gIHRhcmdldCxcbiAgcmVsLFxuICByb2xlLFxuICBvbkNsaWNrLFxuICB0YWJJbmRleCA9IDAsXG4gIHR5cGVcbn0pIHtcbiAgaWYgKCF0YWdOYW1lKSB7XG4gICAgaWYgKGhyZWYgIT0gbnVsbCB8fCB0YXJnZXQgIT0gbnVsbCB8fCByZWwgIT0gbnVsbCkge1xuICAgICAgdGFnTmFtZSA9ICdhJztcbiAgICB9IGVsc2Uge1xuICAgICAgdGFnTmFtZSA9ICdidXR0b24nO1xuICAgIH1cbiAgfVxuICBjb25zdCBtZXRhID0ge1xuICAgIHRhZ05hbWVcbiAgfTtcbiAgaWYgKHRhZ05hbWUgPT09ICdidXR0b24nKSB7XG4gICAgcmV0dXJuIFt7XG4gICAgICB0eXBlOiB0eXBlIHx8ICdidXR0b24nLFxuICAgICAgZGlzYWJsZWRcbiAgICB9LCBtZXRhXTtcbiAgfVxuICBjb25zdCBoYW5kbGVDbGljayA9IGV2ZW50ID0+IHtcbiAgICBpZiAoZGlzYWJsZWQgfHwgdGFnTmFtZSA9PT0gJ2EnICYmIGlzVHJpdmlhbEhyZWYoaHJlZikpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIG9uQ2xpY2sgPT0gbnVsbCA/IHZvaWQgMCA6IG9uQ2xpY2soZXZlbnQpO1xuICB9O1xuICBjb25zdCBoYW5kbGVLZXlEb3duID0gZXZlbnQgPT4ge1xuICAgIGlmIChldmVudC5rZXkgPT09ICcgJykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGhhbmRsZUNsaWNrKGV2ZW50KTtcbiAgICB9XG4gIH07XG4gIGlmICh0YWdOYW1lID09PSAnYScpIHtcbiAgICAvLyBFbnN1cmUgdGhlcmUncyBhIGhyZWYgc28gRW50ZXIgY2FuIHRyaWdnZXIgYW5jaG9yIGJ1dHRvbi5cbiAgICBocmVmIHx8IChocmVmID0gJyMnKTtcbiAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgIGhyZWYgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG4gIHJldHVybiBbe1xuICAgIHJvbGU6IHJvbGUgIT0gbnVsbCA/IHJvbGUgOiAnYnV0dG9uJyxcbiAgICAvLyBleHBsaWNpdGx5IHVuZGVmaW5lZCBzbyB0aGF0IGl0IG92ZXJyaWRlcyB0aGUgcHJvcHMgZGlzYWJsZWQgaW4gYSBzcHJlYWRcbiAgICAvLyBlLmcuIDxUYWcgey4uLnByb3BzfSB7Li4uaG9va1Byb3BzfSAvPlxuICAgIGRpc2FibGVkOiB1bmRlZmluZWQsXG4gICAgdGFiSW5kZXg6IGRpc2FibGVkID8gdW5kZWZpbmVkIDogdGFiSW5kZXgsXG4gICAgaHJlZixcbiAgICB0YXJnZXQ6IHRhZ05hbWUgPT09ICdhJyA/IHRhcmdldCA6IHVuZGVmaW5lZCxcbiAgICAnYXJpYS1kaXNhYmxlZCc6ICFkaXNhYmxlZCA/IHVuZGVmaW5lZCA6IGRpc2FibGVkLFxuICAgIHJlbDogdGFnTmFtZSA9PT0gJ2EnID8gcmVsIDogdW5kZWZpbmVkLFxuICAgIG9uQ2xpY2s6IGhhbmRsZUNsaWNrLFxuICAgIG9uS2V5RG93bjogaGFuZGxlS2V5RG93blxuICB9LCBtZXRhXTtcbn1cbmNvbnN0IEJ1dHRvbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKChfcmVmLCByZWYpID0+IHtcbiAgbGV0IHtcbiAgICAgIGFzOiBhc1Byb3AsXG4gICAgICBkaXNhYmxlZFxuICAgIH0gPSBfcmVmLFxuICAgIHByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UoX3JlZiwgX2V4Y2x1ZGVkKTtcbiAgY29uc3QgW2J1dHRvblByb3BzLCB7XG4gICAgdGFnTmFtZTogQ29tcG9uZW50XG4gIH1dID0gdXNlQnV0dG9uUHJvcHMoT2JqZWN0LmFzc2lnbih7XG4gICAgdGFnTmFtZTogYXNQcm9wLFxuICAgIGRpc2FibGVkXG4gIH0sIHByb3BzKSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChDb21wb25lbnQsIE9iamVjdC5hc3NpZ24oe30sIHByb3BzLCBidXR0b25Qcm9wcywge1xuICAgIHJlZjogcmVmXG4gIH0pKTtcbn0pO1xuQnV0dG9uLmRpc3BsYXlOYW1lID0gJ0J1dHRvbic7XG5leHBvcnQgZGVmYXVsdCBCdXR0b247IiwiY29uc3QgX2V4Y2x1ZGVkID0gW1wiYXNcIiwgXCJhY3RpdmVcIiwgXCJldmVudEtleVwiXTtcbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpIHsgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307IHZhciB0YXJnZXQgPSB7fTsgdmFyIHNvdXJjZUtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpOyB2YXIga2V5LCBpOyBmb3IgKGkgPSAwOyBpIDwgc291cmNlS2V5cy5sZW5ndGg7IGkrKykgeyBrZXkgPSBzb3VyY2VLZXlzW2ldOyBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlOyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IHJldHVybiB0YXJnZXQ7IH1cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdXNlRXZlbnRDYWxsYmFjayBmcm9tICdAcmVzdGFydC9ob29rcy91c2VFdmVudENhbGxiYWNrJztcbmltcG9ydCBOYXZDb250ZXh0IGZyb20gJy4vTmF2Q29udGV4dCc7XG5pbXBvcnQgU2VsZWN0YWJsZUNvbnRleHQsIHsgbWFrZUV2ZW50S2V5IH0gZnJvbSAnLi9TZWxlY3RhYmxlQ29udGV4dCc7XG5pbXBvcnQgQnV0dG9uIGZyb20gJy4vQnV0dG9uJztcbmltcG9ydCB7IGRhdGFBdHRyIH0gZnJvbSAnLi9EYXRhS2V5JztcbmltcG9ydCBUYWJDb250ZXh0IGZyb20gJy4vVGFiQ29udGV4dCc7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuZXhwb3J0IGZ1bmN0aW9uIHVzZU5hdkl0ZW0oe1xuICBrZXksXG4gIG9uQ2xpY2ssXG4gIGFjdGl2ZSxcbiAgaWQsXG4gIHJvbGUsXG4gIGRpc2FibGVkXG59KSB7XG4gIGNvbnN0IHBhcmVudE9uU2VsZWN0ID0gdXNlQ29udGV4dChTZWxlY3RhYmxlQ29udGV4dCk7XG4gIGNvbnN0IG5hdkNvbnRleHQgPSB1c2VDb250ZXh0KE5hdkNvbnRleHQpO1xuICBjb25zdCB0YWJDb250ZXh0ID0gdXNlQ29udGV4dChUYWJDb250ZXh0KTtcbiAgbGV0IGlzQWN0aXZlID0gYWN0aXZlO1xuICBjb25zdCBwcm9wcyA9IHtcbiAgICByb2xlXG4gIH07XG4gIGlmIChuYXZDb250ZXh0KSB7XG4gICAgaWYgKCFyb2xlICYmIG5hdkNvbnRleHQucm9sZSA9PT0gJ3RhYmxpc3QnKSBwcm9wcy5yb2xlID0gJ3RhYic7XG4gICAgY29uc3QgY29udGV4dENvbnRyb2xsZXJJZCA9IG5hdkNvbnRleHQuZ2V0Q29udHJvbGxlcklkKGtleSAhPSBudWxsID8ga2V5IDogbnVsbCk7XG4gICAgY29uc3QgY29udGV4dENvbnRyb2xsZWRJZCA9IG5hdkNvbnRleHQuZ2V0Q29udHJvbGxlZElkKGtleSAhPSBudWxsID8ga2V5IDogbnVsbCk7XG5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgcHJvcHNbZGF0YUF0dHIoJ2V2ZW50LWtleScpXSA9IGtleTtcbiAgICBwcm9wcy5pZCA9IGNvbnRleHRDb250cm9sbGVySWQgfHwgaWQ7XG4gICAgaXNBY3RpdmUgPSBhY3RpdmUgPT0gbnVsbCAmJiBrZXkgIT0gbnVsbCA/IG5hdkNvbnRleHQuYWN0aXZlS2V5ID09PSBrZXkgOiBhY3RpdmU7XG5cbiAgICAvKipcbiAgICAgKiBTaW1wbGlmaWVkIHNjZW5hcmlvIGZvciBgbW91bnRPbkVudGVyYC5cbiAgICAgKlxuICAgICAqIFdoaWxlIGl0IHdvdWxkIG1ha2Ugc2Vuc2UgdG8ga2VlcCAnYXJpYS1jb250cm9scycgZm9yIHRhYnMgdGhhdCBoYXZlIGJlZW4gbW91bnRlZCBhdCBsZWFzdFxuICAgICAqIG9uY2UsIGl0IHdvdWxkIGFsc28gY29tcGxpY2F0ZSB0aGUgY29kZSBxdWl0ZSBhIGJpdCwgZm9yIHZlcnkgbGl0dGxlIGdhaW4uXG4gICAgICogVGhlIGZvbGxvd2luZyBpbXBsZW1lbnRhdGlvbiBpcyBwcm9iYWJseSBnb29kIGVub3VnaC5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3JlYWN0LXJlc3RhcnQvdWkvcHVsbC80MCNpc3N1ZWNvbW1lbnQtMTAwOTk3MTU2MVxuICAgICAqL1xuICAgIGlmIChpc0FjdGl2ZSB8fCAhKHRhYkNvbnRleHQgIT0gbnVsbCAmJiB0YWJDb250ZXh0LnVubW91bnRPbkV4aXQpICYmICEodGFiQ29udGV4dCAhPSBudWxsICYmIHRhYkNvbnRleHQubW91bnRPbkVudGVyKSkgcHJvcHNbJ2FyaWEtY29udHJvbHMnXSA9IGNvbnRleHRDb250cm9sbGVkSWQ7XG4gIH1cbiAgaWYgKHByb3BzLnJvbGUgPT09ICd0YWInKSB7XG4gICAgcHJvcHNbJ2FyaWEtc2VsZWN0ZWQnXSA9IGlzQWN0aXZlO1xuICAgIGlmICghaXNBY3RpdmUpIHtcbiAgICAgIHByb3BzLnRhYkluZGV4ID0gLTE7XG4gICAgfVxuICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgcHJvcHMudGFiSW5kZXggPSAtMTtcbiAgICAgIHByb3BzWydhcmlhLWRpc2FibGVkJ10gPSB0cnVlO1xuICAgIH1cbiAgfVxuICBwcm9wcy5vbkNsaWNrID0gdXNlRXZlbnRDYWxsYmFjayhlID0+IHtcbiAgICBpZiAoZGlzYWJsZWQpIHJldHVybjtcbiAgICBvbkNsaWNrID09IG51bGwgPyB2b2lkIDAgOiBvbkNsaWNrKGUpO1xuICAgIGlmIChrZXkgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAocGFyZW50T25TZWxlY3QgJiYgIWUuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSkge1xuICAgICAgcGFyZW50T25TZWxlY3Qoa2V5LCBlKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gW3Byb3BzLCB7XG4gICAgaXNBY3RpdmVcbiAgfV07XG59XG5jb25zdCBOYXZJdGVtID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKF9yZWYsIHJlZikgPT4ge1xuICBsZXQge1xuICAgICAgYXM6IENvbXBvbmVudCA9IEJ1dHRvbixcbiAgICAgIGFjdGl2ZSxcbiAgICAgIGV2ZW50S2V5XG4gICAgfSA9IF9yZWYsXG4gICAgb3B0aW9ucyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKF9yZWYsIF9leGNsdWRlZCk7XG4gIGNvbnN0IFtwcm9wcywgbWV0YV0gPSB1c2VOYXZJdGVtKE9iamVjdC5hc3NpZ24oe1xuICAgIGtleTogbWFrZUV2ZW50S2V5KGV2ZW50S2V5LCBvcHRpb25zLmhyZWYpLFxuICAgIGFjdGl2ZVxuICB9LCBvcHRpb25zKSk7XG5cbiAgLy8gQHRzLWlnbm9yZVxuICBwcm9wc1tkYXRhQXR0cignYWN0aXZlJyldID0gbWV0YS5pc0FjdGl2ZTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KENvbXBvbmVudCwgT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucywgcHJvcHMsIHtcbiAgICByZWY6IHJlZlxuICB9KSk7XG59KTtcbk5hdkl0ZW0uZGlzcGxheU5hbWUgPSAnTmF2SXRlbSc7XG5leHBvcnQgZGVmYXVsdCBOYXZJdGVtOyIsImNvbnN0IF9leGNsdWRlZCA9IFtcImFzXCIsIFwib25TZWxlY3RcIiwgXCJhY3RpdmVLZXlcIiwgXCJyb2xlXCIsIFwib25LZXlEb3duXCJdO1xuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCkgeyBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTsgdmFyIHRhcmdldCA9IHt9OyB2YXIgc291cmNlS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7IHZhciBrZXksIGk7IGZvciAoaSA9IDA7IGkgPCBzb3VyY2VLZXlzLmxlbmd0aDsgaSsrKSB7IGtleSA9IHNvdXJjZUtleXNbaV07IGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gcmV0dXJuIHRhcmdldDsgfVxuaW1wb3J0IHFzYSBmcm9tICdkb20taGVscGVycy9xdWVyeVNlbGVjdG9yQWxsJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUNvbnRleHQsIHVzZUVmZmVjdCwgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHVzZUZvcmNlVXBkYXRlIGZyb20gJ0ByZXN0YXJ0L2hvb2tzL3VzZUZvcmNlVXBkYXRlJztcbmltcG9ydCB1c2VNZXJnZWRSZWZzIGZyb20gJ0ByZXN0YXJ0L2hvb2tzL3VzZU1lcmdlZFJlZnMnO1xuaW1wb3J0IE5hdkNvbnRleHQgZnJvbSAnLi9OYXZDb250ZXh0JztcbmltcG9ydCBTZWxlY3RhYmxlQ29udGV4dCwgeyBtYWtlRXZlbnRLZXkgfSBmcm9tICcuL1NlbGVjdGFibGVDb250ZXh0JztcbmltcG9ydCBUYWJDb250ZXh0IGZyb20gJy4vVGFiQ29udGV4dCc7XG5pbXBvcnQgeyBkYXRhQXR0ciwgZGF0YVByb3AgfSBmcm9tICcuL0RhdGFLZXknO1xuaW1wb3J0IE5hdkl0ZW0gZnJvbSAnLi9OYXZJdGVtJztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG5jb25zdCBub29wID0gKCkgPT4ge307XG5jb25zdCBFVkVOVF9LRVlfQVRUUiA9IGRhdGFBdHRyKCdldmVudC1rZXknKTtcbmNvbnN0IE5hdiA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKChfcmVmLCByZWYpID0+IHtcbiAgbGV0IHtcbiAgICAgIC8vIE5lZWQgdG8gZGVmaW5lIHRoZSBkZWZhdWx0IFwiYXNcIiBkdXJpbmcgcHJvcCBkZXN0cnVjdHVyaW5nIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBzdHlsZWQtY29tcG9uZW50cyBnaXRodWIuY29tL3JlYWN0LWJvb3RzdHJhcC9yZWFjdC1ib290c3RyYXAvaXNzdWVzLzM1OTVcbiAgICAgIGFzOiBDb21wb25lbnQgPSAnZGl2JyxcbiAgICAgIG9uU2VsZWN0LFxuICAgICAgYWN0aXZlS2V5LFxuICAgICAgcm9sZSxcbiAgICAgIG9uS2V5RG93blxuICAgIH0gPSBfcmVmLFxuICAgIHByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UoX3JlZiwgX2V4Y2x1ZGVkKTtcbiAgLy8gQSByZWYgYW5kIGZvcmNlVXBkYXRlIGZvciByZWZvY3VzLCBiL2Mgd2Ugb25seSB3YW50IHRvIHRyaWdnZXIgd2hlbiBuZWVkZWRcbiAgLy8gYW5kIGRvbid0IHdhbnQgdG8gcmVzZXQgdGhlIHNldCBpbiB0aGUgZWZmZWN0XG4gIGNvbnN0IGZvcmNlVXBkYXRlID0gdXNlRm9yY2VVcGRhdGUoKTtcbiAgY29uc3QgbmVlZHNSZWZvY3VzUmVmID0gdXNlUmVmKGZhbHNlKTtcbiAgY29uc3QgcGFyZW50T25TZWxlY3QgPSB1c2VDb250ZXh0KFNlbGVjdGFibGVDb250ZXh0KTtcbiAgY29uc3QgdGFiQ29udGV4dCA9IHVzZUNvbnRleHQoVGFiQ29udGV4dCk7XG4gIGxldCBnZXRDb250cm9sbGVkSWQsIGdldENvbnRyb2xsZXJJZDtcbiAgaWYgKHRhYkNvbnRleHQpIHtcbiAgICByb2xlID0gcm9sZSB8fCAndGFibGlzdCc7XG4gICAgYWN0aXZlS2V5ID0gdGFiQ29udGV4dC5hY3RpdmVLZXk7XG4gICAgLy8gVE9ETzogZG8gd2UgbmVlZCB0byBkdXBsaWNhdGUgdGhlc2U/XG4gICAgZ2V0Q29udHJvbGxlZElkID0gdGFiQ29udGV4dC5nZXRDb250cm9sbGVkSWQ7XG4gICAgZ2V0Q29udHJvbGxlcklkID0gdGFiQ29udGV4dC5nZXRDb250cm9sbGVySWQ7XG4gIH1cbiAgY29uc3QgbGlzdE5vZGUgPSB1c2VSZWYobnVsbCk7XG4gIGNvbnN0IGdldE5leHRBY3RpdmVUYWIgPSBvZmZzZXQgPT4ge1xuICAgIGNvbnN0IGN1cnJlbnRMaXN0Tm9kZSA9IGxpc3ROb2RlLmN1cnJlbnQ7XG4gICAgaWYgKCFjdXJyZW50TGlzdE5vZGUpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGl0ZW1zID0gcXNhKGN1cnJlbnRMaXN0Tm9kZSwgYFske0VWRU5UX0tFWV9BVFRSfV06bm90KFthcmlhLWRpc2FibGVkPXRydWVdKWApO1xuICAgIGNvbnN0IGFjdGl2ZUNoaWxkID0gY3VycmVudExpc3ROb2RlLnF1ZXJ5U2VsZWN0b3IoJ1thcmlhLXNlbGVjdGVkPXRydWVdJyk7XG4gICAgaWYgKCFhY3RpdmVDaGlsZCB8fCBhY3RpdmVDaGlsZCAhPT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgaW5kZXggPSBpdGVtcy5pbmRleE9mKGFjdGl2ZUNoaWxkKTtcbiAgICBpZiAoaW5kZXggPT09IC0xKSByZXR1cm4gbnVsbDtcbiAgICBsZXQgbmV4dEluZGV4ID0gaW5kZXggKyBvZmZzZXQ7XG4gICAgaWYgKG5leHRJbmRleCA+PSBpdGVtcy5sZW5ndGgpIG5leHRJbmRleCA9IDA7XG4gICAgaWYgKG5leHRJbmRleCA8IDApIG5leHRJbmRleCA9IGl0ZW1zLmxlbmd0aCAtIDE7XG4gICAgcmV0dXJuIGl0ZW1zW25leHRJbmRleF07XG4gIH07XG4gIGNvbnN0IGhhbmRsZVNlbGVjdCA9IChrZXksIGV2ZW50KSA9PiB7XG4gICAgaWYgKGtleSA9PSBudWxsKSByZXR1cm47XG4gICAgb25TZWxlY3QgPT0gbnVsbCA/IHZvaWQgMCA6IG9uU2VsZWN0KGtleSwgZXZlbnQpO1xuICAgIHBhcmVudE9uU2VsZWN0ID09IG51bGwgPyB2b2lkIDAgOiBwYXJlbnRPblNlbGVjdChrZXksIGV2ZW50KTtcbiAgfTtcbiAgY29uc3QgaGFuZGxlS2V5RG93biA9IGV2ZW50ID0+IHtcbiAgICBvbktleURvd24gPT0gbnVsbCA/IHZvaWQgMCA6IG9uS2V5RG93bihldmVudCk7XG4gICAgaWYgKCF0YWJDb250ZXh0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBuZXh0QWN0aXZlQ2hpbGQ7XG4gICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgIGNhc2UgJ0Fycm93TGVmdCc6XG4gICAgICBjYXNlICdBcnJvd1VwJzpcbiAgICAgICAgbmV4dEFjdGl2ZUNoaWxkID0gZ2V0TmV4dEFjdGl2ZVRhYigtMSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnQXJyb3dSaWdodCc6XG4gICAgICBjYXNlICdBcnJvd0Rvd24nOlxuICAgICAgICBuZXh0QWN0aXZlQ2hpbGQgPSBnZXROZXh0QWN0aXZlVGFiKDEpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFuZXh0QWN0aXZlQ2hpbGQpIHJldHVybjtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGhhbmRsZVNlbGVjdChuZXh0QWN0aXZlQ2hpbGQuZGF0YXNldFtkYXRhUHJvcCgnRXZlbnRLZXknKV0gfHwgbnVsbCwgZXZlbnQpO1xuICAgIG5lZWRzUmVmb2N1c1JlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICBmb3JjZVVwZGF0ZSgpO1xuICB9O1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChsaXN0Tm9kZS5jdXJyZW50ICYmIG5lZWRzUmVmb2N1c1JlZi5jdXJyZW50KSB7XG4gICAgICBjb25zdCBhY3RpdmVDaGlsZCA9IGxpc3ROb2RlLmN1cnJlbnQucXVlcnlTZWxlY3RvcihgWyR7RVZFTlRfS0VZX0FUVFJ9XVthcmlhLXNlbGVjdGVkPXRydWVdYCk7XG4gICAgICBhY3RpdmVDaGlsZCA9PSBudWxsID8gdm9pZCAwIDogYWN0aXZlQ2hpbGQuZm9jdXMoKTtcbiAgICB9XG4gICAgbmVlZHNSZWZvY3VzUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgfSk7XG4gIGNvbnN0IG1lcmdlZFJlZiA9IHVzZU1lcmdlZFJlZnMocmVmLCBsaXN0Tm9kZSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChTZWxlY3RhYmxlQ29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBoYW5kbGVTZWxlY3QsXG4gICAgY2hpbGRyZW46IC8qI19fUFVSRV9fKi9fanN4KE5hdkNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICAgIHZhbHVlOiB7XG4gICAgICAgIHJvbGUsXG4gICAgICAgIC8vIHVzZWQgYnkgTmF2TGluayB0byBkZXRlcm1pbmUgaXQncyByb2xlXG4gICAgICAgIGFjdGl2ZUtleTogbWFrZUV2ZW50S2V5KGFjdGl2ZUtleSksXG4gICAgICAgIGdldENvbnRyb2xsZWRJZDogZ2V0Q29udHJvbGxlZElkIHx8IG5vb3AsXG4gICAgICAgIGdldENvbnRyb2xsZXJJZDogZ2V0Q29udHJvbGxlcklkIHx8IG5vb3BcbiAgICAgIH0sXG4gICAgICBjaGlsZHJlbjogLyojX19QVVJFX18qL19qc3goQ29tcG9uZW50LCBPYmplY3QuYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICBvbktleURvd246IGhhbmRsZUtleURvd24sXG4gICAgICAgIHJlZjogbWVyZ2VkUmVmLFxuICAgICAgICByb2xlOiByb2xlXG4gICAgICB9KSlcbiAgICB9KVxuICB9KTtcbn0pO1xuTmF2LmRpc3BsYXlOYW1lID0gJ05hdic7XG5leHBvcnQgZGVmYXVsdCBPYmplY3QuYXNzaWduKE5hdiwge1xuICBJdGVtOiBOYXZJdGVtXG59KTsiLCJcInVzZSBjbGllbnRcIjtcblxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuY29uc3QgY29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KG51bGwpO1xuY29udGV4dC5kaXNwbGF5TmFtZSA9ICdDYXJkSGVhZGVyQ29udGV4dCc7XG5leHBvcnQgZGVmYXVsdCBjb250ZXh0OyIsIlwidXNlIGNsaWVudFwiO1xuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB7IHVzZUJvb3RzdHJhcFByZWZpeCB9IGZyb20gJy4vVGhlbWVQcm92aWRlcic7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgTmF2SXRlbSA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKCh7XG4gIGNsYXNzTmFtZSxcbiAgYnNQcmVmaXgsXG4gIGFzOiBDb21wb25lbnQgPSAnZGl2JyxcbiAgLi4ucHJvcHNcbn0sIHJlZikgPT4ge1xuICBic1ByZWZpeCA9IHVzZUJvb3RzdHJhcFByZWZpeChic1ByZWZpeCwgJ25hdi1pdGVtJyk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChDb21wb25lbnQsIHtcbiAgICByZWY6IHJlZixcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoY2xhc3NOYW1lLCBic1ByZWZpeCksXG4gICAgLi4ucHJvcHNcbiAgfSk7XG59KTtcbk5hdkl0ZW0uZGlzcGxheU5hbWUgPSAnTmF2SXRlbSc7XG5leHBvcnQgZGVmYXVsdCBOYXZJdGVtOyIsImltcG9ydCB7IHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuXG4vKipcbiAqIEEgY29udmVuaWVuY2UgaG9vayBhcm91bmQgYHVzZVN0YXRlYCBkZXNpZ25lZCB0byBiZSBwYWlyZWQgd2l0aFxuICogdGhlIGNvbXBvbmVudCBbY2FsbGJhY2sgcmVmXShodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVmcy1hbmQtdGhlLWRvbS5odG1sI2NhbGxiYWNrLXJlZnMpIGFwaS5cbiAqIENhbGxiYWNrIHJlZnMgYXJlIHVzZWZ1bCBvdmVyIGB1c2VSZWYoKWAgd2hlbiB5b3UgbmVlZCB0byByZXNwb25kIHRvIHRoZSByZWYgYmVpbmcgc2V0XG4gKiBpbnN0ZWFkIG9mIGxhemlseSBhY2Nlc3NpbmcgaXQgaW4gYW4gZWZmZWN0LlxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBbZWxlbWVudCwgYXR0YWNoUmVmXSA9IHVzZUNhbGxiYWNrUmVmPEhUTUxEaXZFbGVtZW50PigpXG4gKlxuICogdXNlRWZmZWN0KCgpID0+IHtcbiAqICAgaWYgKCFlbGVtZW50KSByZXR1cm5cbiAqXG4gKiAgIGNvbnN0IGNhbGVuZGFyID0gbmV3IEZ1bGxDYWxlbmRhci5DYWxlbmRhcihlbGVtZW50KVxuICpcbiAqICAgcmV0dXJuICgpID0+IHtcbiAqICAgICBjYWxlbmRhci5kZXN0cm95KClcbiAqICAgfVxuICogfSwgW2VsZW1lbnRdKVxuICpcbiAqIHJldHVybiA8ZGl2IHJlZj17YXR0YWNoUmVmfSAvPlxuICogYGBgXG4gKlxuICogQGNhdGVnb3J5IHJlZnNcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlQ2FsbGJhY2tSZWYoKSB7XG4gIHJldHVybiB1c2VTdGF0ZShudWxsKTtcbn0iLCJpbXBvcnQgeyB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdXNlRXZlbnRDYWxsYmFjayBmcm9tICcuL3VzZUV2ZW50Q2FsbGJhY2snO1xuLyoqXG4gKiBBdHRhY2hlcyBhbiBldmVudCBoYW5kbGVyIG91dHNpZGUgZGlyZWN0bHkgdG8gc3BlY2lmaWVkIERPTSBlbGVtZW50XG4gKiBieXBhc3NpbmcgdGhlIHJlYWN0IHN5bnRoZXRpYyBldmVudCBzeXN0ZW0uXG4gKlxuICogQHBhcmFtIGVsZW1lbnQgVGhlIHRhcmdldCB0byBsaXN0ZW4gZm9yIGV2ZW50cyBvblxuICogQHBhcmFtIGV2ZW50IFRoZSBET00gZXZlbnQgbmFtZVxuICogQHBhcmFtIGhhbmRsZXIgQW4gZXZlbnQgaGFuZGxlclxuICogQHBhcmFtIGNhcHR1cmUgV2hldGhlciBvciBub3QgdG8gbGlzdGVuIGR1cmluZyB0aGUgY2FwdHVyZSBldmVudCBwaGFzZVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VFdmVudExpc3RlbmVyKGV2ZW50VGFyZ2V0LCBldmVudCwgbGlzdGVuZXIsIGNhcHR1cmUgPSBmYWxzZSkge1xuICBjb25zdCBoYW5kbGVyID0gdXNlRXZlbnRDYWxsYmFjayhsaXN0ZW5lcik7XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgdGFyZ2V0ID0gdHlwZW9mIGV2ZW50VGFyZ2V0ID09PSAnZnVuY3Rpb24nID8gZXZlbnRUYXJnZXQoKSA6IGV2ZW50VGFyZ2V0O1xuICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBoYW5kbGVyLCBjYXB0dXJlKTtcbiAgICByZXR1cm4gKCkgPT4gdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGhhbmRsZXIsIGNhcHR1cmUpO1xuICB9LCBbZXZlbnRUYXJnZXRdKTtcbn0iLCJpbXBvcnQgdXNlRXZlbnRMaXN0ZW5lciBmcm9tICcuL3VzZUV2ZW50TGlzdGVuZXInO1xuaW1wb3J0IHsgdXNlQ2FsbGJhY2sgfSBmcm9tICdyZWFjdCc7XG4vKipcbiAqIEF0dGFjaGVzIGFuIGV2ZW50IGhhbmRsZXIgb3V0c2lkZSBkaXJlY3RseSB0byB0aGUgYGRvY3VtZW50YCxcbiAqIGJ5cGFzc2luZyB0aGUgcmVhY3Qgc3ludGhldGljIGV2ZW50IHN5c3RlbS5cbiAqXG4gKiBgYGB0c1xuICogdXNlR2xvYmFsTGlzdGVuZXIoJ2tleWRvd24nLCAoZXZlbnQpID0+IHtcbiAqICBjb25zb2xlLmxvZyhldmVudC5rZXkpXG4gKiB9KVxuICogYGBgXG4gKlxuICogQHBhcmFtIGV2ZW50IFRoZSBET00gZXZlbnQgbmFtZVxuICogQHBhcmFtIGhhbmRsZXIgQW4gZXZlbnQgaGFuZGxlclxuICogQHBhcmFtIGNhcHR1cmUgV2hldGhlciBvciBub3QgdG8gbGlzdGVuIGR1cmluZyB0aGUgY2FwdHVyZSBldmVudCBwaGFzZVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VHbG9iYWxMaXN0ZW5lcihldmVudCwgaGFuZGxlciwgY2FwdHVyZSA9IGZhbHNlKSB7XG4gIGNvbnN0IGRvY3VtZW50VGFyZ2V0ID0gdXNlQ2FsbGJhY2soKCkgPT4gZG9jdW1lbnQsIFtdKTtcbiAgcmV0dXJuIHVzZUV2ZW50TGlzdGVuZXIoZG9jdW1lbnRUYXJnZXQsIGV2ZW50LCBoYW5kbGVyLCBjYXB0dXJlKTtcbn0iLCJpbXBvcnQgeyB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdXNlQ29tbWl0dGVkUmVmIGZyb20gJy4vdXNlQ29tbWl0dGVkUmVmJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgYHNldEludGVydmFsYCB0aGF0IGlzIHByb3Blcmx5IGNsZWFuZWQgdXAgd2hlbiBhIGNvbXBvbmVudCB1bm1vdW50ZWRcbiAqXG4gKiBgYGB0c3hcbiAqICBmdW5jdGlvbiBUaW1lcigpIHtcbiAqICAgIGNvbnN0IFt0aW1lciwgc2V0VGltZXJdID0gdXNlU3RhdGUoMClcbiAqICAgIHVzZUludGVydmFsKCgpID0+IHNldFRpbWVyKGkgPT4gaSArIDEpLCAxMDAwKVxuICpcbiAqICAgIHJldHVybiA8c3Bhbj57dGltZXJ9IHNlY29uZHMgcGFzdDwvc3Bhbj5cbiAqICB9XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gZm4gYW4gZnVuY3Rpb24gcnVuIG9uIGVhY2ggaW50ZXJ2YWxcbiAqIEBwYXJhbSBtcyBUaGUgbWlsbGlzZWNvbmRzIGR1cmF0aW9uIG9mIHRoZSBpbnRlcnZhbFxuICovXG5cbi8qKlxuICogQ3JlYXRlcyBhIHBhdXNhYmxlIGBzZXRJbnRlcnZhbGAgdGhhdCBpcyBwcm9wZXJseSBjbGVhbmVkIHVwIHdoZW4gYSBjb21wb25lbnQgdW5tb3VudGVkXG4gKlxuICogYGBgdHN4XG4gKiAgY29uc3QgW3BhdXNlZCwgc2V0UGF1c2VkXSA9IHVzZVN0YXRlKGZhbHNlKVxuICogIGNvbnN0IFt0aW1lciwgc2V0VGltZXJdID0gdXNlU3RhdGUoMClcbiAqXG4gKiAgdXNlSW50ZXJ2YWwoKCkgPT4gc2V0VGltZXIoaSA9PiBpICsgMSksIDEwMDAsIHBhdXNlZClcbiAqXG4gKiAgcmV0dXJuIChcbiAqICAgIDxzcGFuPlxuICogICAgICB7dGltZXJ9IHNlY29uZHMgcGFzdFxuICpcbiAqICAgICAgPGJ1dHRvbiBvbkNsaWNrPXsoKSA9PiBzZXRQYXVzZWQocCA9PiAhcCl9PntwYXVzZWQgPyAnUGxheScgOiAnUGF1c2UnIH08L2J1dHRvbj5cbiAqICAgIDwvc3Bhbj5cbiAqIClcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBmbiBhbiBmdW5jdGlvbiBydW4gb24gZWFjaCBpbnRlcnZhbFxuICogQHBhcmFtIG1zIFRoZSBtaWxsaXNlY29uZHMgZHVyYXRpb24gb2YgdGhlIGludGVydmFsXG4gKiBAcGFyYW0gcGF1c2VkIFdoZXRoZXIgb3Igbm90IHRoZSBpbnRlcnZhbCBpcyBjdXJyZW50bHkgcnVubmluZ1xuICovXG5cbi8qKlxuICogQ3JlYXRlcyBhIHBhdXNhYmxlIGBzZXRJbnRlcnZhbGAgdGhhdCBfZmlyZXNfIGltbWVkaWF0ZWx5IGFuZCBpc1xuICogcHJvcGVybHkgY2xlYW5lZCB1cCB3aGVuIGEgY29tcG9uZW50IHVubW91bnRlZFxuICpcbiAqIGBgYHRzeFxuICogIGNvbnN0IFt0aW1lciwgc2V0VGltZXJdID0gdXNlU3RhdGUoLTEpXG4gKiAgdXNlSW50ZXJ2YWwoKCkgPT4gc2V0VGltZXIoaSA9PiBpICsgMSksIDEwMDAsIGZhbHNlLCB0cnVlKVxuICpcbiAqICAvLyB3aWxsIHVwZGF0ZSB0byAwIG9uIHRoZSBmaXJzdCBlZmZlY3RcbiAqICByZXR1cm4gPHNwYW4+e3RpbWVyfSBzZWNvbmRzIHBhc3Q8L3NwYW4+XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gZm4gYW4gZnVuY3Rpb24gcnVuIG9uIGVhY2ggaW50ZXJ2YWxcbiAqIEBwYXJhbSBtcyBUaGUgbWlsbGlzZWNvbmRzIGR1cmF0aW9uIG9mIHRoZSBpbnRlcnZhbFxuICogQHBhcmFtIHBhdXNlZCBXaGV0aGVyIG9yIG5vdCB0aGUgaW50ZXJ2YWwgaXMgY3VycmVudGx5IHJ1bm5pbmdcbiAqIEBwYXJhbSBydW5JbW1lZGlhdGVseSBXaGV0aGVyIHRvIHJ1biB0aGUgZnVuY3Rpb24gaW1tZWRpYXRlbHkgb24gbW91bnQgb3IgdW5wYXVzZVxuICogcmF0aGVyIHRoYW4gd2FpdGluZyBmb3IgdGhlIGZpcnN0IGludGVydmFsIHRvIGVsYXBzZVxuICpcblxuICovXG5cbmZ1bmN0aW9uIHVzZUludGVydmFsKGZuLCBtcywgcGF1c2VkID0gZmFsc2UsIHJ1bkltbWVkaWF0ZWx5ID0gZmFsc2UpIHtcbiAgbGV0IGhhbmRsZTtcbiAgY29uc3QgZm5SZWYgPSB1c2VDb21taXR0ZWRSZWYoZm4pO1xuICAvLyB0aGlzIHJlZiBpcyBuZWNlc3NhcnkgYi9jIHVzZUVmZmVjdCB3aWxsIHNvbWV0aW1lcyBtaXNzIGEgcGF1c2VkIHRvZ2dsZVxuICAvLyBvcnBoYW5pbmcgYSBzZXRUaW1lb3V0IGNoYWluIGluIHRoZSBhZXRoZXIsIHNvIHJlbHlpbmcgb24gaXQncyByZWZyZXNoIGxvZ2ljIGlzIG5vdCByZWxpYWJsZS5cbiAgY29uc3QgcGF1c2VkUmVmID0gdXNlQ29tbWl0dGVkUmVmKHBhdXNlZCk7XG4gIGNvbnN0IHRpY2sgPSAoKSA9PiB7XG4gICAgaWYgKHBhdXNlZFJlZi5jdXJyZW50KSByZXR1cm47XG4gICAgZm5SZWYuY3VycmVudCgpO1xuICAgIHNjaGVkdWxlKCk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgfTtcblxuICBjb25zdCBzY2hlZHVsZSA9ICgpID0+IHtcbiAgICBjbGVhclRpbWVvdXQoaGFuZGxlKTtcbiAgICBoYW5kbGUgPSBzZXRUaW1lb3V0KHRpY2ssIG1zKTtcbiAgfTtcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAocnVuSW1tZWRpYXRlbHkpIHtcbiAgICAgIHRpY2soKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2NoZWR1bGUoKTtcbiAgICB9XG4gICAgcmV0dXJuICgpID0+IGNsZWFyVGltZW91dChoYW5kbGUpO1xuICB9LCBbcGF1c2VkLCBydW5JbW1lZGlhdGVseV0pO1xufVxuZXhwb3J0IGRlZmF1bHQgdXNlSW50ZXJ2YWw7IiwiaW1wb3J0IHsgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHVzZUNvbW1pdHRlZFJlZiBmcm9tICcuL3VzZUNvbW1pdHRlZFJlZic7XG5mdW5jdGlvbiB1c2VSYWZJbnRlcnZhbChmbiwgbXMsIHBhdXNlZCA9IGZhbHNlKSB7XG4gIGxldCBoYW5kbGU7XG4gIGxldCBzdGFydCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICBjb25zdCBmblJlZiA9IHVzZUNvbW1pdHRlZFJlZihmbik7XG4gIC8vIHRoaXMgcmVmIGlzIG5lY2Vzc2FyeSBiL2MgdXNlRWZmZWN0IHdpbGwgc29tZXRpbWVzIG1pc3MgYSBwYXVzZWQgdG9nZ2xlXG4gIC8vIG9ycGhhbmluZyBhIHNldFRpbWVvdXQgY2hhaW4gaW4gdGhlIGFldGhlciwgc28gcmVseWluZyBvbiBpdCdzIHJlZnJlc2ggbG9naWMgaXMgbm90IHJlbGlhYmxlLlxuICBjb25zdCBwYXVzZWRSZWYgPSB1c2VDb21taXR0ZWRSZWYocGF1c2VkKTtcbiAgZnVuY3Rpb24gbG9vcCgpIHtcbiAgICBjb25zdCBjdXJyZW50ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgY29uc3QgZGVsdGEgPSBjdXJyZW50IC0gc3RhcnQ7XG4gICAgaWYgKHBhdXNlZFJlZi5jdXJyZW50KSByZXR1cm47XG4gICAgaWYgKGRlbHRhID49IG1zICYmIGZuUmVmLmN1cnJlbnQpIHtcbiAgICAgIGZuUmVmLmN1cnJlbnQoKTtcbiAgICAgIHN0YXJ0ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgfVxuICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKGhhbmRsZSk7XG4gICAgaGFuZGxlID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGxvb3ApO1xuICB9XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaGFuZGxlID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGxvb3ApO1xuICAgIHJldHVybiAoKSA9PiBjYW5jZWxBbmltYXRpb25GcmFtZShoYW5kbGUpO1xuICB9LCBbXSk7XG59XG5leHBvcnQgZGVmYXVsdCB1c2VSYWZJbnRlcnZhbDsiLCJpbXBvcnQgeyB1c2VDYWxsYmFjaywgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5cbi8qKlxuICogVXBkYXRlcyBzdGF0ZSwgcGFydGlhbCB1cGRhdGVzIGFyZSBtZXJnZWQgaW50byBleGlzdGluZyBzdGF0ZSB2YWx1ZXNcbiAqL1xuXG4vKipcbiAqIE1pbWljcyBhIFJlYWN0IGNsYXNzIGNvbXBvbmVudCdzIHN0YXRlIG1vZGVsLCBvZiBoYXZpbmcgYSBzaW5nbGUgdW5pZmllZFxuICogYHN0YXRlYCBvYmplY3QgYW5kIGFuIHVwZGF0ZXIgdGhhdCBtZXJnZXMgdXBkYXRlcyBpbnRvIHRoZSBleGlzdGluZyBzdGF0ZSwgYXNcbiAqIG9wcG9zZWQgdG8gcmVwbGFjaW5nIGl0LlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBbc3RhdGUsIHNldFN0YXRlXSA9IHVzZU1lcmdlU3RhdGUoeyBuYW1lOiAnQmV0c3knLCBhZ2U6IDI0IH0pXG4gKlxuICogc2V0U3RhdGUoeyBuYW1lOiAnSm9oYW4nIH0pIC8vIHsgbmFtZTogJ0pvaGFuJywgYWdlOiAyNCB9XG4gKlxuICogc2V0U3RhdGUoc3RhdGUgPT4gKHsgYWdlOiBzdGF0ZS5hZ2UgKyAxMCB9KSkgLy8geyBuYW1lOiAnSm9oYW4nLCBhZ2U6IDM0IH1cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBpbml0aWFsU3RhdGUgVGhlIGluaXRpYWwgc3RhdGUgb2JqZWN0XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZU1lcmdlU3RhdGUoaW5pdGlhbFN0YXRlKSB7XG4gIGNvbnN0IFtzdGF0ZSwgc2V0U3RhdGVdID0gdXNlU3RhdGUoaW5pdGlhbFN0YXRlKTtcbiAgY29uc3QgdXBkYXRlciA9IHVzZUNhbGxiYWNrKHVwZGF0ZSA9PiB7XG4gICAgaWYgKHVwZGF0ZSA9PT0gbnVsbCkgcmV0dXJuO1xuICAgIGlmICh0eXBlb2YgdXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBzZXRTdGF0ZShzdGF0ZSA9PiB7XG4gICAgICAgIGNvbnN0IG5leHRTdGF0ZSA9IHVwZGF0ZShzdGF0ZSk7XG4gICAgICAgIHJldHVybiBuZXh0U3RhdGUgPT0gbnVsbCA/IHN0YXRlIDogT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIG5leHRTdGF0ZSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0U3RhdGUoc3RhdGUgPT4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHVwZGF0ZSkpO1xuICAgIH1cbiAgfSwgW3NldFN0YXRlXSk7XG4gIHJldHVybiBbc3RhdGUsIHVwZGF0ZXJdO1xufSIsImltcG9ydCB1c2VNZXJnZVN0YXRlIGZyb20gJy4vdXNlTWVyZ2VTdGF0ZSc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VNZXJnZVN0YXRlRnJvbVByb3BzKHByb3BzLCBnRFNGUCwgaW5pdGlhbFN0YXRlKSB7XG4gIGNvbnN0IFtzdGF0ZSwgc2V0U3RhdGVdID0gdXNlTWVyZ2VTdGF0ZShpbml0aWFsU3RhdGUpO1xuICBjb25zdCBuZXh0U3RhdGUgPSBnRFNGUChwcm9wcywgc3RhdGUpO1xuICBpZiAobmV4dFN0YXRlICE9PSBudWxsKSBzZXRTdGF0ZShuZXh0U3RhdGUpO1xuICByZXR1cm4gW3N0YXRlLCBzZXRTdGF0ZV07XG59IiwiaW1wb3J0IHsgdXNlU3RhdGUsIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0Jztcbi8qKlxuICogRmV0Y2ggYW5kIGxvYWQgYW4gaW1hZ2UgZm9yIHByb2dyYW1hdGljIHVzZSBzdWNoIGFzIGluIGEgYDxjYW52YXM+YCBlbGVtZW50LlxuICpcbiAqIEBwYXJhbSBpbWFnZU9yVXJsIFRoZSBgSHRtbEltYWdlRWxlbWVudGAgb3IgaW1hZ2UgdXJsIHRvIGxvYWRcbiAqIEBwYXJhbSBjcm9zc09yaWdpbiBUaGUgYGNyb3Nzb3JpZ2luYCBhdHRyaWJ1dGUgdG8gc2V0XG4gKlxuICogYGBgdHNcbiAqIGNvbnN0IHsgaW1hZ2UsIGVycm9yIH0gPSB1c2VJbWFnZSgnL3N0YXRpYy9raXR0ZW5zLnBuZycpXG4gKiBjb25zdCByZWYgPSB1c2VSZWY8SFRNTENhbnZhc0VsZW1lbnQ+KClcbiAqXG4gKiB1c2VFZmZlY3QoKCkgPT4ge1xuICogICBjb25zdCBjdHggPSByZWYuY3VycmVudC5nZXRDb250ZXh0KCcyZCcpXG4gKlxuICogICBpZiAoaW1hZ2UpIHtcbiAqICAgICBjdHguZHJhd0ltYWdlKGltYWdlLCAwLCAwKVxuICogICB9XG4gKiB9LCBbcmVmLCBpbWFnZV0pXG4gKlxuICogcmV0dXJuIChcbiAqICAgPD5cbiAqICAgICB7ZXJyb3IgJiYgXCJ0aGVyZSB3YXMgYSBwcm9ibGVtIGxvYWRpbmcgdGhlIGltYWdlXCJ9XG4gKiAgICAgPGNhbnZhcyByZWY9e3JlZn0gLz5cbiAqICAgPC8+XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlSW1hZ2UoaW1hZ2VPclVybCwgY3Jvc3NPcmlnaW4pIHtcbiAgY29uc3QgW3N0YXRlLCBzZXRTdGF0ZV0gPSB1c2VTdGF0ZSh7XG4gICAgaW1hZ2U6IG51bGwsXG4gICAgZXJyb3I6IG51bGxcbiAgfSk7XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFpbWFnZU9yVXJsKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGxldCBpbWFnZTtcbiAgICBpZiAodHlwZW9mIGltYWdlT3JVcmwgPT09ICdzdHJpbmcnKSB7XG4gICAgICBpbWFnZSA9IG5ldyBJbWFnZSgpO1xuICAgICAgaWYgKGNyb3NzT3JpZ2luKSBpbWFnZS5jcm9zc09yaWdpbiA9IGNyb3NzT3JpZ2luO1xuICAgICAgaW1hZ2Uuc3JjID0gaW1hZ2VPclVybDtcbiAgICB9IGVsc2Uge1xuICAgICAgaW1hZ2UgPSBpbWFnZU9yVXJsO1xuICAgICAgaWYgKGltYWdlLmNvbXBsZXRlICYmIGltYWdlLm5hdHVyYWxIZWlnaHQgPiAwKSB7XG4gICAgICAgIHNldFN0YXRlKHtcbiAgICAgICAgICBpbWFnZSxcbiAgICAgICAgICBlcnJvcjogbnVsbFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBvbkxvYWQoKSB7XG4gICAgICBzZXRTdGF0ZSh7XG4gICAgICAgIGltYWdlLFxuICAgICAgICBlcnJvcjogbnVsbFxuICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG9uRXJyb3IoZXJyb3IpIHtcbiAgICAgIHNldFN0YXRlKHtcbiAgICAgICAgaW1hZ2UsXG4gICAgICAgIGVycm9yXG4gICAgICB9KTtcbiAgICB9XG4gICAgaW1hZ2UuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIG9uTG9hZCk7XG4gICAgaW1hZ2UuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgaW1hZ2UucmVtb3ZlRXZlbnRMaXN0ZW5lcignbG9hZCcsIG9uTG9hZCk7XG4gICAgICBpbWFnZS5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIG9uRXJyb3IpO1xuICAgIH07XG4gIH0sIFtpbWFnZU9yVXJsLCBjcm9zc09yaWdpbl0pO1xuICByZXR1cm4gc3RhdGU7XG59IiwiaW1wb3J0IHsgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdXNlRWZmZWN0IGZyb20gJy4vdXNlSXNvbW9ycGhpY0VmZmVjdCc7XG5jb25zdCB0YXJnZXRNYXAgPSBuZXcgV2Vha01hcCgpO1xubGV0IHJlc2l6ZU9ic2VydmVyO1xuZnVuY3Rpb24gZ2V0UmVzaXplT2JzZXJ2ZXIoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXR1cm4tYXNzaWduXG4gIHJldHVybiByZXNpemVPYnNlcnZlciA9IHJlc2l6ZU9ic2VydmVyIHx8IG5ldyB3aW5kb3cuUmVzaXplT2JzZXJ2ZXIoZW50cmllcyA9PiB7XG4gICAgZW50cmllcy5mb3JFYWNoKGVudHJ5ID0+IHtcbiAgICAgIGNvbnN0IGhhbmRsZXIgPSB0YXJnZXRNYXAuZ2V0KGVudHJ5LnRhcmdldCk7XG4gICAgICBpZiAoaGFuZGxlcikgaGFuZGxlcihlbnRyeS5jb250ZW50UmVjdCk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEVmZmljaWVudGx5IG9ic2VydmUgc2l6ZSBjaGFuZ2VzIG9uIGFuIGVsZW1lbnQuIERlcGVuZHMgb24gdGhlIGBSZXNpemVPYnNlcnZlcmAgYXBpLFxuICogYW5kIHBvbHlmaWxscyBhcmUgbmVlZGVkIGluIG9sZGVyIGJyb3dzZXJzLlxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBbcmVmLCBhdHRhY2hSZWZdID0gdXNlQ2FsbGJhY2tSZWYobnVsbCk7XG4gKlxuICogY29uc3QgcmVjdCA9IHVzZVJlc2l6ZU9ic2VydmVyKHJlZik7XG4gKlxuICogcmV0dXJuIChcbiAqICA8ZGl2IHJlZj17YXR0YWNoUmVmfT5cbiAqICAgIHtKU09OLnN0cmluZ2lmeShyZWN0KX1cbiAqICA8L2Rpdj5cbiAqIClcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBlbGVtZW50IFRoZSBET00gZWxlbWVudCB0byBvYnNlcnZlXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZVJlc2l6ZU9ic2VydmVyKGVsZW1lbnQpIHtcbiAgY29uc3QgW3JlY3QsIHNldFJlY3RdID0gdXNlU3RhdGUobnVsbCk7XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFlbGVtZW50KSByZXR1cm47XG4gICAgZ2V0UmVzaXplT2JzZXJ2ZXIoKS5vYnNlcnZlKGVsZW1lbnQpO1xuICAgIHNldFJlY3QoZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk7XG4gICAgdGFyZ2V0TWFwLnNldChlbGVtZW50LCByZWN0ID0+IHtcbiAgICAgIHNldFJlY3QocmVjdCk7XG4gICAgfSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHRhcmdldE1hcC5kZWxldGUoZWxlbWVudCk7XG4gICAgfTtcbiAgfSwgW2VsZW1lbnRdKTtcbiAgcmV0dXJuIHJlY3Q7XG59IiwiaW1wb3J0IHVzZUNhbGxiYWNrUmVmIGZyb20gJy4vdXNlQ2FsbGJhY2tSZWYnO1xuaW1wb3J0IHVzZUNvbW1pdHRlZFJlZiBmcm9tICcuL3VzZUNvbW1pdHRlZFJlZic7XG5pbXBvcnQgdXNlRXZlbnRDYWxsYmFjayBmcm9tICcuL3VzZUV2ZW50Q2FsbGJhY2snO1xuaW1wb3J0IHVzZUV2ZW50TGlzdGVuZXIgZnJvbSAnLi91c2VFdmVudExpc3RlbmVyJztcbmltcG9ydCB1c2VHbG9iYWxMaXN0ZW5lciBmcm9tICcuL3VzZUdsb2JhbExpc3RlbmVyJztcbmltcG9ydCB1c2VJbnRlcnZhbCBmcm9tICcuL3VzZUludGVydmFsJztcbmltcG9ydCB1c2VSYWZJbnRlcnZhbCBmcm9tICcuL3VzZVJhZkludGVydmFsJztcbmltcG9ydCB1c2VNZXJnZVN0YXRlIGZyb20gJy4vdXNlTWVyZ2VTdGF0ZSc7XG5pbXBvcnQgdXNlTWVyZ2VTdGF0ZUZyb21Qcm9wcyBmcm9tICcuL3VzZU1lcmdlU3RhdGVGcm9tUHJvcHMnO1xuaW1wb3J0IHVzZU1vdW50ZWQgZnJvbSAnLi91c2VNb3VudGVkJztcbmltcG9ydCB1c2VQcmV2aW91cyBmcm9tICcuL3VzZVByZXZpb3VzJztcbmltcG9ydCB1c2VJbWFnZSBmcm9tICcuL3VzZUltYWdlJztcbmltcG9ydCB1c2VSZXNpemVPYnNlcnZlciBmcm9tICcuL3VzZVJlc2l6ZU9ic2VydmVyJztcbmV4cG9ydCB7IHVzZUNhbGxiYWNrUmVmLCB1c2VDb21taXR0ZWRSZWYsIHVzZUV2ZW50Q2FsbGJhY2ssIHVzZUV2ZW50TGlzdGVuZXIsIHVzZUdsb2JhbExpc3RlbmVyLCB1c2VJbnRlcnZhbCwgdXNlUmFmSW50ZXJ2YWwsIHVzZU1lcmdlU3RhdGUsIHVzZU1lcmdlU3RhdGVGcm9tUHJvcHMsIHVzZU1vdW50ZWQsIHVzZVByZXZpb3VzLCB1c2VJbWFnZSwgdXNlUmVzaXplT2JzZXJ2ZXIgfTsiLCJjb25zdCBfZXhjbHVkZWQgPSBbXCJvbktleURvd25cIl07XG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKSB7IGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9OyB2YXIgdGFyZ2V0ID0ge307IHZhciBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTsgdmFyIGtleSwgaTsgZm9yIChpID0gMDsgaSA8IHNvdXJjZUtleXMubGVuZ3RoOyBpKyspIHsga2V5ID0gc291cmNlS2V5c1tpXTsgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSByZXR1cm4gdGFyZ2V0OyB9XG4vKiBlc2xpbnQtZGlzYWJsZSBqc3gtYTExeS9uby1zdGF0aWMtZWxlbWVudC1pbnRlcmFjdGlvbnMgKi9cbi8qIGVzbGludC1kaXNhYmxlIGpzeC1hMTF5L2FuY2hvci1oYXMtY29udGVudCAqL1xuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VFdmVudENhbGxiYWNrIH0gZnJvbSAnQHJlc3RhcnQvaG9va3MnO1xuaW1wb3J0IHsgdXNlQnV0dG9uUHJvcHMgfSBmcm9tICcuL0J1dHRvbic7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuZXhwb3J0IGZ1bmN0aW9uIGlzVHJpdmlhbEhyZWYoaHJlZikge1xuICByZXR1cm4gIWhyZWYgfHwgaHJlZi50cmltKCkgPT09ICcjJztcbn1cbi8qKlxuICogQW4gZ2VuZXJpYyBgPGE+YCBjb21wb25lbnQgdGhhdCBjb3ZlcnMgYSBmZXcgQTExeSBjYXNlcywgZW5zdXJpbmcgdGhhdFxuICogY2FzZXMgd2hlcmUgdGhlIGBocmVmYCBpcyBtaXNzaW5nIG9yIHRyaXZpYWwgbGlrZSBcIiNcIiBhcmUgdHJlYXRlZCBsaWtlIGJ1dHRvbnMuXG4gKi9cbmNvbnN0IEFuY2hvciA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKChfcmVmLCByZWYpID0+IHtcbiAgbGV0IHtcbiAgICAgIG9uS2V5RG93blxuICAgIH0gPSBfcmVmLFxuICAgIHByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UoX3JlZiwgX2V4Y2x1ZGVkKTtcbiAgY29uc3QgW2J1dHRvblByb3BzXSA9IHVzZUJ1dHRvblByb3BzKE9iamVjdC5hc3NpZ24oe1xuICAgIHRhZ05hbWU6ICdhJ1xuICB9LCBwcm9wcykpO1xuICBjb25zdCBoYW5kbGVLZXlEb3duID0gdXNlRXZlbnRDYWxsYmFjayhlID0+IHtcbiAgICBidXR0b25Qcm9wcy5vbktleURvd24oZSk7XG4gICAgb25LZXlEb3duID09IG51bGwgPyB2b2lkIDAgOiBvbktleURvd24oZSk7XG4gIH0pO1xuICBpZiAoaXNUcml2aWFsSHJlZihwcm9wcy5ocmVmKSB8fCBwcm9wcy5yb2xlID09PSAnYnV0dG9uJykge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChcImFcIiwgT2JqZWN0LmFzc2lnbih7XG4gICAgICByZWY6IHJlZlxuICAgIH0sIHByb3BzLCBidXR0b25Qcm9wcywge1xuICAgICAgb25LZXlEb3duOiBoYW5kbGVLZXlEb3duXG4gICAgfSkpO1xuICB9XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChcImFcIiwgT2JqZWN0LmFzc2lnbih7XG4gICAgcmVmOiByZWZcbiAgfSwgcHJvcHMsIHtcbiAgICBvbktleURvd246IG9uS2V5RG93blxuICB9KSk7XG59KTtcbkFuY2hvci5kaXNwbGF5TmFtZSA9ICdBbmNob3InO1xuZXhwb3J0IGRlZmF1bHQgQW5jaG9yOyIsIlwidXNlIGNsaWVudFwiO1xuXG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBBbmNob3IgZnJvbSAnQHJlc3RhcnQvdWkvQW5jaG9yJztcbmltcG9ydCB7IHVzZU5hdkl0ZW0gfSBmcm9tICdAcmVzdGFydC91aS9OYXZJdGVtJztcbmltcG9ydCB7IG1ha2VFdmVudEtleSB9IGZyb20gJ0ByZXN0YXJ0L3VpL1NlbGVjdGFibGVDb250ZXh0JztcbmltcG9ydCB7IHVzZUJvb3RzdHJhcFByZWZpeCB9IGZyb20gJy4vVGhlbWVQcm92aWRlcic7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgTmF2TGluayA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKCh7XG4gIGJzUHJlZml4LFxuICBjbGFzc05hbWUsXG4gIGFzOiBDb21wb25lbnQgPSBBbmNob3IsXG4gIGFjdGl2ZSxcbiAgZXZlbnRLZXksXG4gIGRpc2FibGVkID0gZmFsc2UsXG4gIC4uLnByb3BzXG59LCByZWYpID0+IHtcbiAgYnNQcmVmaXggPSB1c2VCb290c3RyYXBQcmVmaXgoYnNQcmVmaXgsICduYXYtbGluaycpO1xuICBjb25zdCBbbmF2SXRlbVByb3BzLCBtZXRhXSA9IHVzZU5hdkl0ZW0oe1xuICAgIGtleTogbWFrZUV2ZW50S2V5KGV2ZW50S2V5LCBwcm9wcy5ocmVmKSxcbiAgICBhY3RpdmUsXG4gICAgZGlzYWJsZWQsXG4gICAgLi4ucHJvcHNcbiAgfSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChDb21wb25lbnQsIHtcbiAgICAuLi5wcm9wcyxcbiAgICAuLi5uYXZJdGVtUHJvcHMsXG4gICAgcmVmOiByZWYsXG4gICAgZGlzYWJsZWQ6IGRpc2FibGVkLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjbGFzc05hbWUsIGJzUHJlZml4LCBkaXNhYmxlZCAmJiAnZGlzYWJsZWQnLCBtZXRhLmlzQWN0aXZlICYmICdhY3RpdmUnKVxuICB9KTtcbn0pO1xuTmF2TGluay5kaXNwbGF5TmFtZSA9ICdOYXZMaW5rJztcbmV4cG9ydCBkZWZhdWx0IE5hdkxpbms7IiwiXCJ1c2UgY2xpZW50XCI7XG5cbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IGFsbCBmcm9tICdwcm9wLXR5cGVzLWV4dHJhL2xpYi9hbGwnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZVVuY29udHJvbGxlZCB9IGZyb20gJ3VuY29udHJvbGxhYmxlJztcbmltcG9ydCBCYXNlTmF2IGZyb20gJ0ByZXN0YXJ0L3VpL05hdic7XG5pbXBvcnQgeyB1c2VCb290c3RyYXBQcmVmaXggfSBmcm9tICcuL1RoZW1lUHJvdmlkZXInO1xuaW1wb3J0IE5hdmJhckNvbnRleHQgZnJvbSAnLi9OYXZiYXJDb250ZXh0JztcbmltcG9ydCBDYXJkSGVhZGVyQ29udGV4dCBmcm9tICcuL0NhcmRIZWFkZXJDb250ZXh0JztcbmltcG9ydCBOYXZJdGVtIGZyb20gJy4vTmF2SXRlbSc7XG5pbXBvcnQgTmF2TGluayBmcm9tICcuL05hdkxpbmsnO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmNvbnN0IE5hdiA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKCh1bmNvbnRyb2xsZWRQcm9wcywgcmVmKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBhcyA9ICdkaXYnLFxuICAgIGJzUHJlZml4OiBpbml0aWFsQnNQcmVmaXgsXG4gICAgdmFyaWFudCxcbiAgICBmaWxsID0gZmFsc2UsXG4gICAganVzdGlmeSA9IGZhbHNlLFxuICAgIG5hdmJhcixcbiAgICBuYXZiYXJTY3JvbGwsXG4gICAgY2xhc3NOYW1lLFxuICAgIGFjdGl2ZUtleSxcbiAgICAuLi5wcm9wc1xuICB9ID0gdXNlVW5jb250cm9sbGVkKHVuY29udHJvbGxlZFByb3BzLCB7XG4gICAgYWN0aXZlS2V5OiAnb25TZWxlY3QnXG4gIH0pO1xuICBjb25zdCBic1ByZWZpeCA9IHVzZUJvb3RzdHJhcFByZWZpeChpbml0aWFsQnNQcmVmaXgsICduYXYnKTtcbiAgbGV0IG5hdmJhckJzUHJlZml4O1xuICBsZXQgY2FyZEhlYWRlckJzUHJlZml4O1xuICBsZXQgaXNOYXZiYXIgPSBmYWxzZTtcbiAgY29uc3QgbmF2YmFyQ29udGV4dCA9IHVzZUNvbnRleHQoTmF2YmFyQ29udGV4dCk7XG4gIGNvbnN0IGNhcmRIZWFkZXJDb250ZXh0ID0gdXNlQ29udGV4dChDYXJkSGVhZGVyQ29udGV4dCk7XG4gIGlmIChuYXZiYXJDb250ZXh0KSB7XG4gICAgbmF2YmFyQnNQcmVmaXggPSBuYXZiYXJDb250ZXh0LmJzUHJlZml4O1xuICAgIGlzTmF2YmFyID0gbmF2YmFyID09IG51bGwgPyB0cnVlIDogbmF2YmFyO1xuICB9IGVsc2UgaWYgKGNhcmRIZWFkZXJDb250ZXh0KSB7XG4gICAgKHtcbiAgICAgIGNhcmRIZWFkZXJCc1ByZWZpeFxuICAgIH0gPSBjYXJkSGVhZGVyQ29udGV4dCk7XG4gIH1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KEJhc2VOYXYsIHtcbiAgICBhczogYXMsXG4gICAgcmVmOiByZWYsXG4gICAgYWN0aXZlS2V5OiBhY3RpdmVLZXksXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGNsYXNzTmFtZSwge1xuICAgICAgW2JzUHJlZml4XTogIWlzTmF2YmFyLFxuICAgICAgW2Ake25hdmJhckJzUHJlZml4fS1uYXZgXTogaXNOYXZiYXIsXG4gICAgICBbYCR7bmF2YmFyQnNQcmVmaXh9LW5hdi1zY3JvbGxgXTogaXNOYXZiYXIgJiYgbmF2YmFyU2Nyb2xsLFxuICAgICAgW2Ake2NhcmRIZWFkZXJCc1ByZWZpeH0tJHt2YXJpYW50fWBdOiAhIWNhcmRIZWFkZXJCc1ByZWZpeCxcbiAgICAgIFtgJHtic1ByZWZpeH0tJHt2YXJpYW50fWBdOiAhIXZhcmlhbnQsXG4gICAgICBbYCR7YnNQcmVmaXh9LWZpbGxgXTogZmlsbCxcbiAgICAgIFtgJHtic1ByZWZpeH0tanVzdGlmaWVkYF06IGp1c3RpZnlcbiAgICB9KSxcbiAgICAuLi5wcm9wc1xuICB9KTtcbn0pO1xuTmF2LmRpc3BsYXlOYW1lID0gJ05hdic7XG5leHBvcnQgZGVmYXVsdCBPYmplY3QuYXNzaWduKE5hdiwge1xuICBJdGVtOiBOYXZJdGVtLFxuICBMaW5rOiBOYXZMaW5rXG59KTsiLCJmdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKSB7IGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9OyB2YXIgdGFyZ2V0ID0ge307IHZhciBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTsgdmFyIGtleSwgaTsgZm9yIChpID0gMDsgaSA8IHNvdXJjZUtleXMubGVuZ3RoOyBpKyspIHsga2V5ID0gc291cmNlS2V5c1tpXTsgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5mdW5jdGlvbiBfdG9Qcm9wZXJ0eUtleShhcmcpIHsgdmFyIGtleSA9IF90b1ByaW1pdGl2ZShhcmcsIFwic3RyaW5nXCIpOyByZXR1cm4gdHlwZW9mIGtleSA9PT0gXCJzeW1ib2xcIiA/IGtleSA6IFN0cmluZyhrZXkpOyB9XG5mdW5jdGlvbiBfdG9QcmltaXRpdmUoaW5wdXQsIGhpbnQpIHsgaWYgKHR5cGVvZiBpbnB1dCAhPT0gXCJvYmplY3RcIiB8fCBpbnB1dCA9PT0gbnVsbCkgcmV0dXJuIGlucHV0OyB2YXIgcHJpbSA9IGlucHV0W1N5bWJvbC50b1ByaW1pdGl2ZV07IGlmIChwcmltICE9PSB1bmRlZmluZWQpIHsgdmFyIHJlcyA9IHByaW0uY2FsbChpbnB1dCwgaGludCB8fCBcImRlZmF1bHRcIik7IGlmICh0eXBlb2YgcmVzICE9PSBcIm9iamVjdFwiKSByZXR1cm4gcmVzOyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS5cIik7IH0gcmV0dXJuIChoaW50ID09PSBcInN0cmluZ1wiID8gU3RyaW5nIDogTnVtYmVyKShpbnB1dCk7IH1cbmltcG9ydCB7IHVzZUNhbGxiYWNrLCB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHRLZXkoa2V5KSB7XG4gIHJldHVybiAnZGVmYXVsdCcgKyBrZXkuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBrZXkuc3Vic3RyKDEpO1xufVxuZnVuY3Rpb24gdXNlVW5jb250cm9sbGVkUHJvcChwcm9wVmFsdWUsIGRlZmF1bHRWYWx1ZSwgaGFuZGxlcikge1xuICBjb25zdCB3YXNQcm9wUmVmID0gdXNlUmVmKHByb3BWYWx1ZSAhPT0gdW5kZWZpbmVkKTtcbiAgY29uc3QgW3N0YXRlVmFsdWUsIHNldFN0YXRlXSA9IHVzZVN0YXRlKGRlZmF1bHRWYWx1ZSk7XG4gIGNvbnN0IGlzUHJvcCA9IHByb3BWYWx1ZSAhPT0gdW5kZWZpbmVkO1xuICBjb25zdCB3YXNQcm9wID0gd2FzUHJvcFJlZi5jdXJyZW50O1xuICB3YXNQcm9wUmVmLmN1cnJlbnQgPSBpc1Byb3A7XG5cbiAgLyoqXG4gICAqIElmIGEgcHJvcCBzd2l0Y2hlcyBmcm9tIGNvbnRyb2xsZWQgdG8gVW5jb250cm9sbGVkXG4gICAqIHJlc2V0IGl0cyB2YWx1ZSB0byB0aGUgZGVmYXVsdFZhbHVlXG4gICAqL1xuICBpZiAoIWlzUHJvcCAmJiB3YXNQcm9wICYmIHN0YXRlVmFsdWUgIT09IGRlZmF1bHRWYWx1ZSkge1xuICAgIHNldFN0YXRlKGRlZmF1bHRWYWx1ZSk7XG4gIH1cbiAgcmV0dXJuIFtpc1Byb3AgPyBwcm9wVmFsdWUgOiBzdGF0ZVZhbHVlLCB1c2VDYWxsYmFjaygoLi4uYXJncykgPT4ge1xuICAgIGNvbnN0IFt2YWx1ZSwgLi4ucmVzdF0gPSBhcmdzO1xuICAgIGxldCByZXR1cm5WYWx1ZSA9IGhhbmRsZXIgPT0gbnVsbCA/IHZvaWQgMCA6IGhhbmRsZXIodmFsdWUsIC4uLnJlc3QpO1xuICAgIHNldFN0YXRlKHZhbHVlKTtcbiAgICByZXR1cm4gcmV0dXJuVmFsdWU7XG4gIH0sIFtoYW5kbGVyXSldO1xufVxuZXhwb3J0IHsgdXNlVW5jb250cm9sbGVkUHJvcCB9O1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVVuY29udHJvbGxlZChwcm9wcywgY29uZmlnKSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhjb25maWcpLnJlZHVjZSgocmVzdWx0LCBmaWVsZE5hbWUpID0+IHtcbiAgICBjb25zdCBfcmVmID0gcmVzdWx0LFxuICAgICAgX2RlZmF1bHRLZXkgPSBkZWZhdWx0S2V5KGZpZWxkTmFtZSksXG4gICAgICB7XG4gICAgICAgIFtfZGVmYXVsdEtleV06IGRlZmF1bHRWYWx1ZSxcbiAgICAgICAgW2ZpZWxkTmFtZV06IHByb3BzVmFsdWVcbiAgICAgIH0gPSBfcmVmLFxuICAgICAgcmVzdCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKF9yZWYsIFtfZGVmYXVsdEtleSwgZmllbGROYW1lXS5tYXAoX3RvUHJvcGVydHlLZXkpKTtcbiAgICBjb25zdCBoYW5kbGVyTmFtZSA9IGNvbmZpZ1tmaWVsZE5hbWVdO1xuICAgIGNvbnN0IFt2YWx1ZSwgaGFuZGxlcl0gPSB1c2VVbmNvbnRyb2xsZWRQcm9wKHByb3BzVmFsdWUsIGRlZmF1bHRWYWx1ZSwgcHJvcHNbaGFuZGxlck5hbWVdKTtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgcmVzdCwge1xuICAgICAgW2ZpZWxkTmFtZV06IHZhbHVlLFxuICAgICAgW2hhbmRsZXJOYW1lXTogaGFuZGxlclxuICAgIH0pO1xuICB9LCBwcm9wcyk7XG59IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuY29uc3QgRHJvcGRvd25Db250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQobnVsbCk7XG5leHBvcnQgZGVmYXVsdCBEcm9wZG93bkNvbnRleHQ7IiwidmFyIGhhcyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbmZ1bmN0aW9uIGZpbmQoaXRlciwgdGFyLCBrZXkpIHtcblx0Zm9yIChrZXkgb2YgaXRlci5rZXlzKCkpIHtcblx0XHRpZiAoZGVxdWFsKGtleSwgdGFyKSkgcmV0dXJuIGtleTtcblx0fVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVxdWFsKGZvbywgYmFyKSB7XG5cdHZhciBjdG9yLCBsZW4sIHRtcDtcblx0aWYgKGZvbyA9PT0gYmFyKSByZXR1cm4gdHJ1ZTtcblxuXHRpZiAoZm9vICYmIGJhciAmJiAoY3Rvcj1mb28uY29uc3RydWN0b3IpID09PSBiYXIuY29uc3RydWN0b3IpIHtcblx0XHRpZiAoY3RvciA9PT0gRGF0ZSkgcmV0dXJuIGZvby5nZXRUaW1lKCkgPT09IGJhci5nZXRUaW1lKCk7XG5cdFx0aWYgKGN0b3IgPT09IFJlZ0V4cCkgcmV0dXJuIGZvby50b1N0cmluZygpID09PSBiYXIudG9TdHJpbmcoKTtcblxuXHRcdGlmIChjdG9yID09PSBBcnJheSkge1xuXHRcdFx0aWYgKChsZW49Zm9vLmxlbmd0aCkgPT09IGJhci5sZW5ndGgpIHtcblx0XHRcdFx0d2hpbGUgKGxlbi0tICYmIGRlcXVhbChmb29bbGVuXSwgYmFyW2xlbl0pKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBsZW4gPT09IC0xO1xuXHRcdH1cblxuXHRcdGlmIChjdG9yID09PSBTZXQpIHtcblx0XHRcdGlmIChmb28uc2l6ZSAhPT0gYmFyLnNpemUpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0Zm9yIChsZW4gb2YgZm9vKSB7XG5cdFx0XHRcdHRtcCA9IGxlbjtcblx0XHRcdFx0aWYgKHRtcCAmJiB0eXBlb2YgdG1wID09PSAnb2JqZWN0Jykge1xuXHRcdFx0XHRcdHRtcCA9IGZpbmQoYmFyLCB0bXApO1xuXHRcdFx0XHRcdGlmICghdG1wKSByZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCFiYXIuaGFzKHRtcCkpIHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdGlmIChjdG9yID09PSBNYXApIHtcblx0XHRcdGlmIChmb28uc2l6ZSAhPT0gYmFyLnNpemUpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0Zm9yIChsZW4gb2YgZm9vKSB7XG5cdFx0XHRcdHRtcCA9IGxlblswXTtcblx0XHRcdFx0aWYgKHRtcCAmJiB0eXBlb2YgdG1wID09PSAnb2JqZWN0Jykge1xuXHRcdFx0XHRcdHRtcCA9IGZpbmQoYmFyLCB0bXApO1xuXHRcdFx0XHRcdGlmICghdG1wKSByZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCFkZXF1YWwobGVuWzFdLCBiYXIuZ2V0KHRtcCkpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRpZiAoY3RvciA9PT0gQXJyYXlCdWZmZXIpIHtcblx0XHRcdGZvbyA9IG5ldyBVaW50OEFycmF5KGZvbyk7XG5cdFx0XHRiYXIgPSBuZXcgVWludDhBcnJheShiYXIpO1xuXHRcdH0gZWxzZSBpZiAoY3RvciA9PT0gRGF0YVZpZXcpIHtcblx0XHRcdGlmICgobGVuPWZvby5ieXRlTGVuZ3RoKSA9PT0gYmFyLmJ5dGVMZW5ndGgpIHtcblx0XHRcdFx0d2hpbGUgKGxlbi0tICYmIGZvby5nZXRJbnQ4KGxlbikgPT09IGJhci5nZXRJbnQ4KGxlbikpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGxlbiA9PT0gLTE7XG5cdFx0fVxuXG5cdFx0aWYgKEFycmF5QnVmZmVyLmlzVmlldyhmb28pKSB7XG5cdFx0XHRpZiAoKGxlbj1mb28uYnl0ZUxlbmd0aCkgPT09IGJhci5ieXRlTGVuZ3RoKSB7XG5cdFx0XHRcdHdoaWxlIChsZW4tLSAmJiBmb29bbGVuXSA9PT0gYmFyW2xlbl0pO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGxlbiA9PT0gLTE7XG5cdFx0fVxuXG5cdFx0aWYgKCFjdG9yIHx8IHR5cGVvZiBmb28gPT09ICdvYmplY3QnKSB7XG5cdFx0XHRsZW4gPSAwO1xuXHRcdFx0Zm9yIChjdG9yIGluIGZvbykge1xuXHRcdFx0XHRpZiAoaGFzLmNhbGwoZm9vLCBjdG9yKSAmJiArK2xlbiAmJiAhaGFzLmNhbGwoYmFyLCBjdG9yKSkgcmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRpZiAoIShjdG9yIGluIGJhcikgfHwgIWRlcXVhbChmb29bY3Rvcl0sIGJhcltjdG9yXSkpIHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBPYmplY3Qua2V5cyhiYXIpLmxlbmd0aCA9PT0gbGVuO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBmb28gIT09IGZvbyAmJiBiYXIgIT09IGJhcjtcbn1cbiIsImltcG9ydCB7IHVzZUNhbGxiYWNrIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHVzZU1vdW50ZWQgZnJvbSAnLi91c2VNb3VudGVkJztcblxuLyoqXG4gKiBgdXNlU2FmZVN0YXRlYCB0YWtlcyB0aGUgcmV0dXJuIHZhbHVlIG9mIGEgYHVzZVN0YXRlYCBob29rIGFuZCB3cmFwcyB0aGVcbiAqIHNldHRlciB0byBwcmV2ZW50IHVwZGF0ZXMgb25jZXMgdGhlIGNvbXBvbmVudCBoYXMgdW5tb3VudGVkLiBDYW4gdXNlZFxuICogd2l0aCBgdXNlTWVyZ2VTdGF0ZWAgYW5kIGB1c2VTdGF0ZUFzeW5jYCBhcyB3ZWxsXG4gKlxuICogQHBhcmFtIHN0YXRlIFRoZSByZXR1cm4gdmFsdWUgb2YgYSB1c2VTdGF0ZUhvb2tcbiAqXG4gKiBgYGB0c1xuICogY29uc3QgW3Nob3csIHNldFNob3ddID0gdXNlU2FmZVN0YXRlKHVzZVN0YXRlKHRydWUpKTtcbiAqIGBgYFxuICovXG5cbmZ1bmN0aW9uIHVzZVNhZmVTdGF0ZShzdGF0ZSkge1xuICBjb25zdCBpc01vdW50ZWQgPSB1c2VNb3VudGVkKCk7XG4gIHJldHVybiBbc3RhdGVbMF0sIHVzZUNhbGxiYWNrKG5leHRTdGF0ZSA9PiB7XG4gICAgaWYgKCFpc01vdW50ZWQoKSkgcmV0dXJuO1xuICAgIHJldHVybiBzdGF0ZVsxXShuZXh0U3RhdGUpO1xuICB9LCBbaXNNb3VudGVkLCBzdGF0ZVsxXV0pXTtcbn1cbmV4cG9ydCBkZWZhdWx0IHVzZVNhZmVTdGF0ZTsiLCJpbXBvcnQgeyBhdXRvIH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCkge1xuICByZXR1cm4gcGxhY2VtZW50LnNwbGl0KCctJylbMF07XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0V2luZG93KG5vZGUpIHtcbiAgaWYgKG5vZGUgPT0gbnVsbCkge1xuICAgIHJldHVybiB3aW5kb3c7XG4gIH1cblxuICBpZiAobm9kZS50b1N0cmluZygpICE9PSAnW29iamVjdCBXaW5kb3ddJykge1xuICAgIHZhciBvd25lckRvY3VtZW50ID0gbm9kZS5vd25lckRvY3VtZW50O1xuICAgIHJldHVybiBvd25lckRvY3VtZW50ID8gb3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyB8fCB3aW5kb3cgOiB3aW5kb3c7XG4gIH1cblxuICByZXR1cm4gbm9kZTtcbn0iLCJpbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuL2dldFdpbmRvdy5qc1wiO1xuXG5mdW5jdGlvbiBpc0VsZW1lbnQobm9kZSkge1xuICB2YXIgT3duRWxlbWVudCA9IGdldFdpbmRvdyhub2RlKS5FbGVtZW50O1xuICByZXR1cm4gbm9kZSBpbnN0YW5jZW9mIE93bkVsZW1lbnQgfHwgbm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQ7XG59XG5cbmZ1bmN0aW9uIGlzSFRNTEVsZW1lbnQobm9kZSkge1xuICB2YXIgT3duRWxlbWVudCA9IGdldFdpbmRvdyhub2RlKS5IVE1MRWxlbWVudDtcbiAgcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiBPd25FbGVtZW50IHx8IG5vZGUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudDtcbn1cblxuZnVuY3Rpb24gaXNTaGFkb3dSb290KG5vZGUpIHtcbiAgLy8gSUUgMTEgaGFzIG5vIFNoYWRvd1Jvb3RcbiAgaWYgKHR5cGVvZiBTaGFkb3dSb290ID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBPd25FbGVtZW50ID0gZ2V0V2luZG93KG5vZGUpLlNoYWRvd1Jvb3Q7XG4gIHJldHVybiBub2RlIGluc3RhbmNlb2YgT3duRWxlbWVudCB8fCBub2RlIGluc3RhbmNlb2YgU2hhZG93Um9vdDtcbn1cblxuZXhwb3J0IHsgaXNFbGVtZW50LCBpc0hUTUxFbGVtZW50LCBpc1NoYWRvd1Jvb3QgfTsiLCJleHBvcnQgdmFyIG1heCA9IE1hdGgubWF4O1xuZXhwb3J0IHZhciBtaW4gPSBNYXRoLm1pbjtcbmV4cG9ydCB2YXIgcm91bmQgPSBNYXRoLnJvdW5kOyIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFVBU3RyaW5nKCkge1xuICB2YXIgdWFEYXRhID0gbmF2aWdhdG9yLnVzZXJBZ2VudERhdGE7XG5cbiAgaWYgKHVhRGF0YSAhPSBudWxsICYmIHVhRGF0YS5icmFuZHMgJiYgQXJyYXkuaXNBcnJheSh1YURhdGEuYnJhbmRzKSkge1xuICAgIHJldHVybiB1YURhdGEuYnJhbmRzLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgcmV0dXJuIGl0ZW0uYnJhbmQgKyBcIi9cIiArIGl0ZW0udmVyc2lvbjtcbiAgICB9KS5qb2luKCcgJyk7XG4gIH1cblxuICByZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudDtcbn0iLCJpbXBvcnQgZ2V0VUFTdHJpbmcgZnJvbSBcIi4uL3V0aWxzL3VzZXJBZ2VudC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNMYXlvdXRWaWV3cG9ydCgpIHtcbiAgcmV0dXJuICEvXigoPyFjaHJvbWV8YW5kcm9pZCkuKSpzYWZhcmkvaS50ZXN0KGdldFVBU3RyaW5nKCkpO1xufSIsImltcG9ydCB7IGlzRWxlbWVudCwgaXNIVE1MRWxlbWVudCB9IGZyb20gXCIuL2luc3RhbmNlT2YuanNcIjtcbmltcG9ydCB7IHJvdW5kIH0gZnJvbSBcIi4uL3V0aWxzL21hdGguanNcIjtcbmltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4vZ2V0V2luZG93LmpzXCI7XG5pbXBvcnQgaXNMYXlvdXRWaWV3cG9ydCBmcm9tIFwiLi9pc0xheW91dFZpZXdwb3J0LmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRCb3VuZGluZ0NsaWVudFJlY3QoZWxlbWVudCwgaW5jbHVkZVNjYWxlLCBpc0ZpeGVkU3RyYXRlZ3kpIHtcbiAgaWYgKGluY2x1ZGVTY2FsZSA9PT0gdm9pZCAwKSB7XG4gICAgaW5jbHVkZVNjYWxlID0gZmFsc2U7XG4gIH1cblxuICBpZiAoaXNGaXhlZFN0cmF0ZWd5ID09PSB2b2lkIDApIHtcbiAgICBpc0ZpeGVkU3RyYXRlZ3kgPSBmYWxzZTtcbiAgfVxuXG4gIHZhciBjbGllbnRSZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgdmFyIHNjYWxlWCA9IDE7XG4gIHZhciBzY2FsZVkgPSAxO1xuXG4gIGlmIChpbmNsdWRlU2NhbGUgJiYgaXNIVE1MRWxlbWVudChlbGVtZW50KSkge1xuICAgIHNjYWxlWCA9IGVsZW1lbnQub2Zmc2V0V2lkdGggPiAwID8gcm91bmQoY2xpZW50UmVjdC53aWR0aCkgLyBlbGVtZW50Lm9mZnNldFdpZHRoIHx8IDEgOiAxO1xuICAgIHNjYWxlWSA9IGVsZW1lbnQub2Zmc2V0SGVpZ2h0ID4gMCA/IHJvdW5kKGNsaWVudFJlY3QuaGVpZ2h0KSAvIGVsZW1lbnQub2Zmc2V0SGVpZ2h0IHx8IDEgOiAxO1xuICB9XG5cbiAgdmFyIF9yZWYgPSBpc0VsZW1lbnQoZWxlbWVudCkgPyBnZXRXaW5kb3coZWxlbWVudCkgOiB3aW5kb3csXG4gICAgICB2aXN1YWxWaWV3cG9ydCA9IF9yZWYudmlzdWFsVmlld3BvcnQ7XG5cbiAgdmFyIGFkZFZpc3VhbE9mZnNldHMgPSAhaXNMYXlvdXRWaWV3cG9ydCgpICYmIGlzRml4ZWRTdHJhdGVneTtcbiAgdmFyIHggPSAoY2xpZW50UmVjdC5sZWZ0ICsgKGFkZFZpc3VhbE9mZnNldHMgJiYgdmlzdWFsVmlld3BvcnQgPyB2aXN1YWxWaWV3cG9ydC5vZmZzZXRMZWZ0IDogMCkpIC8gc2NhbGVYO1xuICB2YXIgeSA9IChjbGllbnRSZWN0LnRvcCArIChhZGRWaXN1YWxPZmZzZXRzICYmIHZpc3VhbFZpZXdwb3J0ID8gdmlzdWFsVmlld3BvcnQub2Zmc2V0VG9wIDogMCkpIC8gc2NhbGVZO1xuICB2YXIgd2lkdGggPSBjbGllbnRSZWN0LndpZHRoIC8gc2NhbGVYO1xuICB2YXIgaGVpZ2h0ID0gY2xpZW50UmVjdC5oZWlnaHQgLyBzY2FsZVk7XG4gIHJldHVybiB7XG4gICAgd2lkdGg6IHdpZHRoLFxuICAgIGhlaWdodDogaGVpZ2h0LFxuICAgIHRvcDogeSxcbiAgICByaWdodDogeCArIHdpZHRoLFxuICAgIGJvdHRvbTogeSArIGhlaWdodCxcbiAgICBsZWZ0OiB4LFxuICAgIHg6IHgsXG4gICAgeTogeVxuICB9O1xufSIsImltcG9ydCBnZXRCb3VuZGluZ0NsaWVudFJlY3QgZnJvbSBcIi4vZ2V0Qm91bmRpbmdDbGllbnRSZWN0LmpzXCI7IC8vIFJldHVybnMgdGhlIGxheW91dCByZWN0IG9mIGFuIGVsZW1lbnQgcmVsYXRpdmUgdG8gaXRzIG9mZnNldFBhcmVudC4gTGF5b3V0XG4vLyBtZWFucyBpdCBkb2Vzbid0IHRha2UgaW50byBhY2NvdW50IHRyYW5zZm9ybXMuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldExheW91dFJlY3QoZWxlbWVudCkge1xuICB2YXIgY2xpZW50UmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50KTsgLy8gVXNlIHRoZSBjbGllbnRSZWN0IHNpemVzIGlmIGl0J3Mgbm90IGJlZW4gdHJhbnNmb3JtZWQuXG4gIC8vIEZpeGVzIGh0dHBzOi8vZ2l0aHViLmNvbS9wb3BwZXJqcy9wb3BwZXItY29yZS9pc3N1ZXMvMTIyM1xuXG4gIHZhciB3aWR0aCA9IGVsZW1lbnQub2Zmc2V0V2lkdGg7XG4gIHZhciBoZWlnaHQgPSBlbGVtZW50Lm9mZnNldEhlaWdodDtcblxuICBpZiAoTWF0aC5hYnMoY2xpZW50UmVjdC53aWR0aCAtIHdpZHRoKSA8PSAxKSB7XG4gICAgd2lkdGggPSBjbGllbnRSZWN0LndpZHRoO1xuICB9XG5cbiAgaWYgKE1hdGguYWJzKGNsaWVudFJlY3QuaGVpZ2h0IC0gaGVpZ2h0KSA8PSAxKSB7XG4gICAgaGVpZ2h0ID0gY2xpZW50UmVjdC5oZWlnaHQ7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHg6IGVsZW1lbnQub2Zmc2V0TGVmdCxcbiAgICB5OiBlbGVtZW50Lm9mZnNldFRvcCxcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHRcbiAgfTtcbn0iLCJpbXBvcnQgeyBpc1NoYWRvd1Jvb3QgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb250YWlucyhwYXJlbnQsIGNoaWxkKSB7XG4gIHZhciByb290Tm9kZSA9IGNoaWxkLmdldFJvb3ROb2RlICYmIGNoaWxkLmdldFJvb3ROb2RlKCk7IC8vIEZpcnN0LCBhdHRlbXB0IHdpdGggZmFzdGVyIG5hdGl2ZSBtZXRob2RcblxuICBpZiAocGFyZW50LmNvbnRhaW5zKGNoaWxkKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IC8vIHRoZW4gZmFsbGJhY2sgdG8gY3VzdG9tIGltcGxlbWVudGF0aW9uIHdpdGggU2hhZG93IERPTSBzdXBwb3J0XG4gIGVsc2UgaWYgKHJvb3ROb2RlICYmIGlzU2hhZG93Um9vdChyb290Tm9kZSkpIHtcbiAgICAgIHZhciBuZXh0ID0gY2hpbGQ7XG5cbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKG5leHQgJiYgcGFyZW50LmlzU2FtZU5vZGUobmV4dCkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSAvLyAkRmxvd0ZpeE1lW3Byb3AtbWlzc2luZ106IG5lZWQgYSBiZXR0ZXIgd2F5IHRvIGhhbmRsZSB0aGlzLi4uXG5cblxuICAgICAgICBuZXh0ID0gbmV4dC5wYXJlbnROb2RlIHx8IG5leHQuaG9zdDtcbiAgICAgIH0gd2hpbGUgKG5leHQpO1xuICAgIH0gLy8gR2l2ZSB1cCwgdGhlIHJlc3VsdCBpcyBmYWxzZVxuXG5cbiAgcmV0dXJuIGZhbHNlO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE5vZGVOYW1lKGVsZW1lbnQpIHtcbiAgcmV0dXJuIGVsZW1lbnQgPyAoZWxlbWVudC5ub2RlTmFtZSB8fCAnJykudG9Mb3dlckNhc2UoKSA6IG51bGw7XG59IiwiaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkge1xuICByZXR1cm4gZ2V0V2luZG93KGVsZW1lbnQpLmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7XG59IiwiaW1wb3J0IGdldE5vZGVOYW1lIGZyb20gXCIuL2dldE5vZGVOYW1lLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc1RhYmxlRWxlbWVudChlbGVtZW50KSB7XG4gIHJldHVybiBbJ3RhYmxlJywgJ3RkJywgJ3RoJ10uaW5kZXhPZihnZXROb2RlTmFtZShlbGVtZW50KSkgPj0gMDtcbn0iLCJpbXBvcnQgeyBpc0VsZW1lbnQgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXREb2N1bWVudEVsZW1lbnQoZWxlbWVudCkge1xuICAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1yZXR1cm5dOiBhc3N1bWUgYm9keSBpcyBhbHdheXMgYXZhaWxhYmxlXG4gIHJldHVybiAoKGlzRWxlbWVudChlbGVtZW50KSA/IGVsZW1lbnQub3duZXJEb2N1bWVudCA6IC8vICRGbG93Rml4TWVbcHJvcC1taXNzaW5nXVxuICBlbGVtZW50LmRvY3VtZW50KSB8fCB3aW5kb3cuZG9jdW1lbnQpLmRvY3VtZW50RWxlbWVudDtcbn0iLCJpbXBvcnQgZ2V0Tm9kZU5hbWUgZnJvbSBcIi4vZ2V0Tm9kZU5hbWUuanNcIjtcbmltcG9ydCBnZXREb2N1bWVudEVsZW1lbnQgZnJvbSBcIi4vZ2V0RG9jdW1lbnRFbGVtZW50LmpzXCI7XG5pbXBvcnQgeyBpc1NoYWRvd1Jvb3QgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRQYXJlbnROb2RlKGVsZW1lbnQpIHtcbiAgaWYgKGdldE5vZGVOYW1lKGVsZW1lbnQpID09PSAnaHRtbCcpIHtcbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxuXG4gIHJldHVybiAoLy8gdGhpcyBpcyBhIHF1aWNrZXIgKGJ1dCBsZXNzIHR5cGUgc2FmZSkgd2F5IHRvIHNhdmUgcXVpdGUgc29tZSBieXRlcyBmcm9tIHRoZSBidW5kbGVcbiAgICAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1yZXR1cm5dXG4gICAgLy8gJEZsb3dGaXhNZVtwcm9wLW1pc3NpbmddXG4gICAgZWxlbWVudC5hc3NpZ25lZFNsb3QgfHwgLy8gc3RlcCBpbnRvIHRoZSBzaGFkb3cgRE9NIG9mIHRoZSBwYXJlbnQgb2YgYSBzbG90dGVkIG5vZGVcbiAgICBlbGVtZW50LnBhcmVudE5vZGUgfHwgKCAvLyBET00gRWxlbWVudCBkZXRlY3RlZFxuICAgIGlzU2hhZG93Um9vdChlbGVtZW50KSA/IGVsZW1lbnQuaG9zdCA6IG51bGwpIHx8IC8vIFNoYWRvd1Jvb3QgZGV0ZWN0ZWRcbiAgICAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1jYWxsXTogSFRNTEVsZW1lbnQgaXMgYSBOb2RlXG4gICAgZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpIC8vIGZhbGxiYWNrXG5cbiAgKTtcbn0iLCJpbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuL2dldFdpbmRvdy5qc1wiO1xuaW1wb3J0IGdldE5vZGVOYW1lIGZyb20gXCIuL2dldE5vZGVOYW1lLmpzXCI7XG5pbXBvcnQgZ2V0Q29tcHV0ZWRTdHlsZSBmcm9tIFwiLi9nZXRDb21wdXRlZFN0eWxlLmpzXCI7XG5pbXBvcnQgeyBpc0hUTUxFbGVtZW50LCBpc1NoYWRvd1Jvb3QgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5pbXBvcnQgaXNUYWJsZUVsZW1lbnQgZnJvbSBcIi4vaXNUYWJsZUVsZW1lbnQuanNcIjtcbmltcG9ydCBnZXRQYXJlbnROb2RlIGZyb20gXCIuL2dldFBhcmVudE5vZGUuanNcIjtcbmltcG9ydCBnZXRVQVN0cmluZyBmcm9tIFwiLi4vdXRpbHMvdXNlckFnZW50LmpzXCI7XG5cbmZ1bmN0aW9uIGdldFRydWVPZmZzZXRQYXJlbnQoZWxlbWVudCkge1xuICBpZiAoIWlzSFRNTEVsZW1lbnQoZWxlbWVudCkgfHwgLy8gaHR0cHM6Ly9naXRodWIuY29tL3BvcHBlcmpzL3BvcHBlci1jb3JlL2lzc3Vlcy84MzdcbiAgZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5wb3NpdGlvbiA9PT0gJ2ZpeGVkJykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQub2Zmc2V0UGFyZW50O1xufSAvLyBgLm9mZnNldFBhcmVudGAgcmVwb3J0cyBgbnVsbGAgZm9yIGZpeGVkIGVsZW1lbnRzLCB3aGlsZSBhYnNvbHV0ZSBlbGVtZW50c1xuLy8gcmV0dXJuIHRoZSBjb250YWluaW5nIGJsb2NrXG5cblxuZnVuY3Rpb24gZ2V0Q29udGFpbmluZ0Jsb2NrKGVsZW1lbnQpIHtcbiAgdmFyIGlzRmlyZWZveCA9IC9maXJlZm94L2kudGVzdChnZXRVQVN0cmluZygpKTtcbiAgdmFyIGlzSUUgPSAvVHJpZGVudC9pLnRlc3QoZ2V0VUFTdHJpbmcoKSk7XG5cbiAgaWYgKGlzSUUgJiYgaXNIVE1MRWxlbWVudChlbGVtZW50KSkge1xuICAgIC8vIEluIElFIDksIDEwIGFuZCAxMSBmaXhlZCBlbGVtZW50cyBjb250YWluaW5nIGJsb2NrIGlzIGFsd2F5cyBlc3RhYmxpc2hlZCBieSB0aGUgdmlld3BvcnRcbiAgICB2YXIgZWxlbWVudENzcyA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7XG5cbiAgICBpZiAoZWxlbWVudENzcy5wb3NpdGlvbiA9PT0gJ2ZpeGVkJykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgdmFyIGN1cnJlbnROb2RlID0gZ2V0UGFyZW50Tm9kZShlbGVtZW50KTtcblxuICBpZiAoaXNTaGFkb3dSb290KGN1cnJlbnROb2RlKSkge1xuICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUuaG9zdDtcbiAgfVxuXG4gIHdoaWxlIChpc0hUTUxFbGVtZW50KGN1cnJlbnROb2RlKSAmJiBbJ2h0bWwnLCAnYm9keSddLmluZGV4T2YoZ2V0Tm9kZU5hbWUoY3VycmVudE5vZGUpKSA8IDApIHtcbiAgICB2YXIgY3NzID0gZ2V0Q29tcHV0ZWRTdHlsZShjdXJyZW50Tm9kZSk7IC8vIFRoaXMgaXMgbm9uLWV4aGF1c3RpdmUgYnV0IGNvdmVycyB0aGUgbW9zdCBjb21tb24gQ1NTIHByb3BlcnRpZXMgdGhhdFxuICAgIC8vIGNyZWF0ZSBhIGNvbnRhaW5pbmcgYmxvY2suXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL0NvbnRhaW5pbmdfYmxvY2sjaWRlbnRpZnlpbmdfdGhlX2NvbnRhaW5pbmdfYmxvY2tcblxuICAgIGlmIChjc3MudHJhbnNmb3JtICE9PSAnbm9uZScgfHwgY3NzLnBlcnNwZWN0aXZlICE9PSAnbm9uZScgfHwgY3NzLmNvbnRhaW4gPT09ICdwYWludCcgfHwgWyd0cmFuc2Zvcm0nLCAncGVyc3BlY3RpdmUnXS5pbmRleE9mKGNzcy53aWxsQ2hhbmdlKSAhPT0gLTEgfHwgaXNGaXJlZm94ICYmIGNzcy53aWxsQ2hhbmdlID09PSAnZmlsdGVyJyB8fCBpc0ZpcmVmb3ggJiYgY3NzLmZpbHRlciAmJiBjc3MuZmlsdGVyICE9PSAnbm9uZScpIHtcbiAgICAgIHJldHVybiBjdXJyZW50Tm9kZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5wYXJlbnROb2RlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufSAvLyBHZXRzIHRoZSBjbG9zZXN0IGFuY2VzdG9yIHBvc2l0aW9uZWQgZWxlbWVudC4gSGFuZGxlcyBzb21lIGVkZ2UgY2FzZXMsXG4vLyBzdWNoIGFzIHRhYmxlIGFuY2VzdG9ycyBhbmQgY3Jvc3MgYnJvd3NlciBidWdzLlxuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE9mZnNldFBhcmVudChlbGVtZW50KSB7XG4gIHZhciB3aW5kb3cgPSBnZXRXaW5kb3coZWxlbWVudCk7XG4gIHZhciBvZmZzZXRQYXJlbnQgPSBnZXRUcnVlT2Zmc2V0UGFyZW50KGVsZW1lbnQpO1xuXG4gIHdoaWxlIChvZmZzZXRQYXJlbnQgJiYgaXNUYWJsZUVsZW1lbnQob2Zmc2V0UGFyZW50KSAmJiBnZXRDb21wdXRlZFN0eWxlKG9mZnNldFBhcmVudCkucG9zaXRpb24gPT09ICdzdGF0aWMnKSB7XG4gICAgb2Zmc2V0UGFyZW50ID0gZ2V0VHJ1ZU9mZnNldFBhcmVudChvZmZzZXRQYXJlbnQpO1xuICB9XG5cbiAgaWYgKG9mZnNldFBhcmVudCAmJiAoZ2V0Tm9kZU5hbWUob2Zmc2V0UGFyZW50KSA9PT0gJ2h0bWwnIHx8IGdldE5vZGVOYW1lKG9mZnNldFBhcmVudCkgPT09ICdib2R5JyAmJiBnZXRDb21wdXRlZFN0eWxlKG9mZnNldFBhcmVudCkucG9zaXRpb24gPT09ICdzdGF0aWMnKSkge1xuICAgIHJldHVybiB3aW5kb3c7XG4gIH1cblxuICByZXR1cm4gb2Zmc2V0UGFyZW50IHx8IGdldENvbnRhaW5pbmdCbG9jayhlbGVtZW50KSB8fCB3aW5kb3c7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50KHBsYWNlbWVudCkge1xuICByZXR1cm4gWyd0b3AnLCAnYm90dG9tJ10uaW5kZXhPZihwbGFjZW1lbnQpID49IDAgPyAneCcgOiAneSc7XG59IiwiaW1wb3J0IHsgbWF4IGFzIG1hdGhNYXgsIG1pbiBhcyBtYXRoTWluIH0gZnJvbSBcIi4vbWF0aC5qc1wiO1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhpbihtaW4sIHZhbHVlLCBtYXgpIHtcbiAgcmV0dXJuIG1hdGhNYXgobWluLCBtYXRoTWluKHZhbHVlLCBtYXgpKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB3aXRoaW5NYXhDbGFtcChtaW4sIHZhbHVlLCBtYXgpIHtcbiAgdmFyIHYgPSB3aXRoaW4obWluLCB2YWx1ZSwgbWF4KTtcbiAgcmV0dXJuIHYgPiBtYXggPyBtYXggOiB2O1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldEZyZXNoU2lkZU9iamVjdCgpIHtcbiAgcmV0dXJuIHtcbiAgICB0b3A6IDAsXG4gICAgcmlnaHQ6IDAsXG4gICAgYm90dG9tOiAwLFxuICAgIGxlZnQ6IDBcbiAgfTtcbn0iLCJpbXBvcnQgZ2V0RnJlc2hTaWRlT2JqZWN0IGZyb20gXCIuL2dldEZyZXNoU2lkZU9iamVjdC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbWVyZ2VQYWRkaW5nT2JqZWN0KHBhZGRpbmdPYmplY3QpIHtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGdldEZyZXNoU2lkZU9iamVjdCgpLCBwYWRkaW5nT2JqZWN0KTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBleHBhbmRUb0hhc2hNYXAodmFsdWUsIGtleXMpIHtcbiAgcmV0dXJuIGtleXMucmVkdWNlKGZ1bmN0aW9uIChoYXNoTWFwLCBrZXkpIHtcbiAgICBoYXNoTWFwW2tleV0gPSB2YWx1ZTtcbiAgICByZXR1cm4gaGFzaE1hcDtcbiAgfSwge30pO1xufSIsImV4cG9ydCB2YXIgdG9wID0gJ3RvcCc7XG5leHBvcnQgdmFyIGJvdHRvbSA9ICdib3R0b20nO1xuZXhwb3J0IHZhciByaWdodCA9ICdyaWdodCc7XG5leHBvcnQgdmFyIGxlZnQgPSAnbGVmdCc7XG5leHBvcnQgdmFyIGF1dG8gPSAnYXV0byc7XG5leHBvcnQgdmFyIGJhc2VQbGFjZW1lbnRzID0gW3RvcCwgYm90dG9tLCByaWdodCwgbGVmdF07XG5leHBvcnQgdmFyIHN0YXJ0ID0gJ3N0YXJ0JztcbmV4cG9ydCB2YXIgZW5kID0gJ2VuZCc7XG5leHBvcnQgdmFyIGNsaXBwaW5nUGFyZW50cyA9ICdjbGlwcGluZ1BhcmVudHMnO1xuZXhwb3J0IHZhciB2aWV3cG9ydCA9ICd2aWV3cG9ydCc7XG5leHBvcnQgdmFyIHBvcHBlciA9ICdwb3BwZXInO1xuZXhwb3J0IHZhciByZWZlcmVuY2UgPSAncmVmZXJlbmNlJztcbmV4cG9ydCB2YXIgdmFyaWF0aW9uUGxhY2VtZW50cyA9IC8qI19fUFVSRV9fKi9iYXNlUGxhY2VtZW50cy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgcGxhY2VtZW50KSB7XG4gIHJldHVybiBhY2MuY29uY2F0KFtwbGFjZW1lbnQgKyBcIi1cIiArIHN0YXJ0LCBwbGFjZW1lbnQgKyBcIi1cIiArIGVuZF0pO1xufSwgW10pO1xuZXhwb3J0IHZhciBwbGFjZW1lbnRzID0gLyojX19QVVJFX18qL1tdLmNvbmNhdChiYXNlUGxhY2VtZW50cywgW2F1dG9dKS5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgcGxhY2VtZW50KSB7XG4gIHJldHVybiBhY2MuY29uY2F0KFtwbGFjZW1lbnQsIHBsYWNlbWVudCArIFwiLVwiICsgc3RhcnQsIHBsYWNlbWVudCArIFwiLVwiICsgZW5kXSk7XG59LCBbXSk7IC8vIG1vZGlmaWVycyB0aGF0IG5lZWQgdG8gcmVhZCB0aGUgRE9NXG5cbmV4cG9ydCB2YXIgYmVmb3JlUmVhZCA9ICdiZWZvcmVSZWFkJztcbmV4cG9ydCB2YXIgcmVhZCA9ICdyZWFkJztcbmV4cG9ydCB2YXIgYWZ0ZXJSZWFkID0gJ2FmdGVyUmVhZCc7IC8vIHB1cmUtbG9naWMgbW9kaWZpZXJzXG5cbmV4cG9ydCB2YXIgYmVmb3JlTWFpbiA9ICdiZWZvcmVNYWluJztcbmV4cG9ydCB2YXIgbWFpbiA9ICdtYWluJztcbmV4cG9ydCB2YXIgYWZ0ZXJNYWluID0gJ2FmdGVyTWFpbic7IC8vIG1vZGlmaWVyIHdpdGggdGhlIHB1cnBvc2UgdG8gd3JpdGUgdG8gdGhlIERPTSAob3Igd3JpdGUgaW50byBhIGZyYW1ld29yayBzdGF0ZSlcblxuZXhwb3J0IHZhciBiZWZvcmVXcml0ZSA9ICdiZWZvcmVXcml0ZSc7XG5leHBvcnQgdmFyIHdyaXRlID0gJ3dyaXRlJztcbmV4cG9ydCB2YXIgYWZ0ZXJXcml0ZSA9ICdhZnRlcldyaXRlJztcbmV4cG9ydCB2YXIgbW9kaWZpZXJQaGFzZXMgPSBbYmVmb3JlUmVhZCwgcmVhZCwgYWZ0ZXJSZWFkLCBiZWZvcmVNYWluLCBtYWluLCBhZnRlck1haW4sIGJlZm9yZVdyaXRlLCB3cml0ZSwgYWZ0ZXJXcml0ZV07IiwiaW1wb3J0IGdldEJhc2VQbGFjZW1lbnQgZnJvbSBcIi4uL3V0aWxzL2dldEJhc2VQbGFjZW1lbnQuanNcIjtcbmltcG9ydCBnZXRMYXlvdXRSZWN0IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0TGF5b3V0UmVjdC5qc1wiO1xuaW1wb3J0IGNvbnRhaW5zIGZyb20gXCIuLi9kb20tdXRpbHMvY29udGFpbnMuanNcIjtcbmltcG9ydCBnZXRPZmZzZXRQYXJlbnQgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRPZmZzZXRQYXJlbnQuanNcIjtcbmltcG9ydCBnZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQgZnJvbSBcIi4uL3V0aWxzL2dldE1haW5BeGlzRnJvbVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IHsgd2l0aGluIH0gZnJvbSBcIi4uL3V0aWxzL3dpdGhpbi5qc1wiO1xuaW1wb3J0IG1lcmdlUGFkZGluZ09iamVjdCBmcm9tIFwiLi4vdXRpbHMvbWVyZ2VQYWRkaW5nT2JqZWN0LmpzXCI7XG5pbXBvcnQgZXhwYW5kVG9IYXNoTWFwIGZyb20gXCIuLi91dGlscy9leHBhbmRUb0hhc2hNYXAuanNcIjtcbmltcG9ydCB7IGxlZnQsIHJpZ2h0LCBiYXNlUGxhY2VtZW50cywgdG9wLCBib3R0b20gfSBmcm9tIFwiLi4vZW51bXMuanNcIjsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG52YXIgdG9QYWRkaW5nT2JqZWN0ID0gZnVuY3Rpb24gdG9QYWRkaW5nT2JqZWN0KHBhZGRpbmcsIHN0YXRlKSB7XG4gIHBhZGRpbmcgPSB0eXBlb2YgcGFkZGluZyA9PT0gJ2Z1bmN0aW9uJyA/IHBhZGRpbmcoT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUucmVjdHMsIHtcbiAgICBwbGFjZW1lbnQ6IHN0YXRlLnBsYWNlbWVudFxuICB9KSkgOiBwYWRkaW5nO1xuICByZXR1cm4gbWVyZ2VQYWRkaW5nT2JqZWN0KHR5cGVvZiBwYWRkaW5nICE9PSAnbnVtYmVyJyA/IHBhZGRpbmcgOiBleHBhbmRUb0hhc2hNYXAocGFkZGluZywgYmFzZVBsYWNlbWVudHMpKTtcbn07XG5cbmZ1bmN0aW9uIGFycm93KF9yZWYpIHtcbiAgdmFyIF9zdGF0ZSRtb2RpZmllcnNEYXRhJDtcblxuICB2YXIgc3RhdGUgPSBfcmVmLnN0YXRlLFxuICAgICAgbmFtZSA9IF9yZWYubmFtZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmLm9wdGlvbnM7XG4gIHZhciBhcnJvd0VsZW1lbnQgPSBzdGF0ZS5lbGVtZW50cy5hcnJvdztcbiAgdmFyIHBvcHBlck9mZnNldHMgPSBzdGF0ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHM7XG4gIHZhciBiYXNlUGxhY2VtZW50ID0gZ2V0QmFzZVBsYWNlbWVudChzdGF0ZS5wbGFjZW1lbnQpO1xuICB2YXIgYXhpcyA9IGdldE1haW5BeGlzRnJvbVBsYWNlbWVudChiYXNlUGxhY2VtZW50KTtcbiAgdmFyIGlzVmVydGljYWwgPSBbbGVmdCwgcmlnaHRdLmluZGV4T2YoYmFzZVBsYWNlbWVudCkgPj0gMDtcbiAgdmFyIGxlbiA9IGlzVmVydGljYWwgPyAnaGVpZ2h0JyA6ICd3aWR0aCc7XG5cbiAgaWYgKCFhcnJvd0VsZW1lbnQgfHwgIXBvcHBlck9mZnNldHMpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgcGFkZGluZ09iamVjdCA9IHRvUGFkZGluZ09iamVjdChvcHRpb25zLnBhZGRpbmcsIHN0YXRlKTtcbiAgdmFyIGFycm93UmVjdCA9IGdldExheW91dFJlY3QoYXJyb3dFbGVtZW50KTtcbiAgdmFyIG1pblByb3AgPSBheGlzID09PSAneScgPyB0b3AgOiBsZWZ0O1xuICB2YXIgbWF4UHJvcCA9IGF4aXMgPT09ICd5JyA/IGJvdHRvbSA6IHJpZ2h0O1xuICB2YXIgZW5kRGlmZiA9IHN0YXRlLnJlY3RzLnJlZmVyZW5jZVtsZW5dICsgc3RhdGUucmVjdHMucmVmZXJlbmNlW2F4aXNdIC0gcG9wcGVyT2Zmc2V0c1theGlzXSAtIHN0YXRlLnJlY3RzLnBvcHBlcltsZW5dO1xuICB2YXIgc3RhcnREaWZmID0gcG9wcGVyT2Zmc2V0c1theGlzXSAtIHN0YXRlLnJlY3RzLnJlZmVyZW5jZVtheGlzXTtcbiAgdmFyIGFycm93T2Zmc2V0UGFyZW50ID0gZ2V0T2Zmc2V0UGFyZW50KGFycm93RWxlbWVudCk7XG4gIHZhciBjbGllbnRTaXplID0gYXJyb3dPZmZzZXRQYXJlbnQgPyBheGlzID09PSAneScgPyBhcnJvd09mZnNldFBhcmVudC5jbGllbnRIZWlnaHQgfHwgMCA6IGFycm93T2Zmc2V0UGFyZW50LmNsaWVudFdpZHRoIHx8IDAgOiAwO1xuICB2YXIgY2VudGVyVG9SZWZlcmVuY2UgPSBlbmREaWZmIC8gMiAtIHN0YXJ0RGlmZiAvIDI7IC8vIE1ha2Ugc3VyZSB0aGUgYXJyb3cgZG9lc24ndCBvdmVyZmxvdyB0aGUgcG9wcGVyIGlmIHRoZSBjZW50ZXIgcG9pbnQgaXNcbiAgLy8gb3V0c2lkZSBvZiB0aGUgcG9wcGVyIGJvdW5kc1xuXG4gIHZhciBtaW4gPSBwYWRkaW5nT2JqZWN0W21pblByb3BdO1xuICB2YXIgbWF4ID0gY2xpZW50U2l6ZSAtIGFycm93UmVjdFtsZW5dIC0gcGFkZGluZ09iamVjdFttYXhQcm9wXTtcbiAgdmFyIGNlbnRlciA9IGNsaWVudFNpemUgLyAyIC0gYXJyb3dSZWN0W2xlbl0gLyAyICsgY2VudGVyVG9SZWZlcmVuY2U7XG4gIHZhciBvZmZzZXQgPSB3aXRoaW4obWluLCBjZW50ZXIsIG1heCk7IC8vIFByZXZlbnRzIGJyZWFraW5nIHN5bnRheCBoaWdobGlnaHRpbmcuLi5cblxuICB2YXIgYXhpc1Byb3AgPSBheGlzO1xuICBzdGF0ZS5tb2RpZmllcnNEYXRhW25hbWVdID0gKF9zdGF0ZSRtb2RpZmllcnNEYXRhJCA9IHt9LCBfc3RhdGUkbW9kaWZpZXJzRGF0YSRbYXhpc1Byb3BdID0gb2Zmc2V0LCBfc3RhdGUkbW9kaWZpZXJzRGF0YSQuY2VudGVyT2Zmc2V0ID0gb2Zmc2V0IC0gY2VudGVyLCBfc3RhdGUkbW9kaWZpZXJzRGF0YSQpO1xufVxuXG5mdW5jdGlvbiBlZmZlY3QoX3JlZjIpIHtcbiAgdmFyIHN0YXRlID0gX3JlZjIuc3RhdGUsXG4gICAgICBvcHRpb25zID0gX3JlZjIub3B0aW9ucztcbiAgdmFyIF9vcHRpb25zJGVsZW1lbnQgPSBvcHRpb25zLmVsZW1lbnQsXG4gICAgICBhcnJvd0VsZW1lbnQgPSBfb3B0aW9ucyRlbGVtZW50ID09PSB2b2lkIDAgPyAnW2RhdGEtcG9wcGVyLWFycm93XScgOiBfb3B0aW9ucyRlbGVtZW50O1xuXG4gIGlmIChhcnJvd0VsZW1lbnQgPT0gbnVsbCkge1xuICAgIHJldHVybjtcbiAgfSAvLyBDU1Mgc2VsZWN0b3JcblxuXG4gIGlmICh0eXBlb2YgYXJyb3dFbGVtZW50ID09PSAnc3RyaW5nJykge1xuICAgIGFycm93RWxlbWVudCA9IHN0YXRlLmVsZW1lbnRzLnBvcHBlci5xdWVyeVNlbGVjdG9yKGFycm93RWxlbWVudCk7XG5cbiAgICBpZiAoIWFycm93RWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIGlmICghY29udGFpbnMoc3RhdGUuZWxlbWVudHMucG9wcGVyLCBhcnJvd0VsZW1lbnQpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgc3RhdGUuZWxlbWVudHMuYXJyb3cgPSBhcnJvd0VsZW1lbnQ7XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdhcnJvdycsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAnbWFpbicsXG4gIGZuOiBhcnJvdyxcbiAgZWZmZWN0OiBlZmZlY3QsXG4gIHJlcXVpcmVzOiBbJ3BvcHBlck9mZnNldHMnXSxcbiAgcmVxdWlyZXNJZkV4aXN0czogWydwcmV2ZW50T3ZlcmZsb3cnXVxufTsiLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRWYXJpYXRpb24ocGxhY2VtZW50KSB7XG4gIHJldHVybiBwbGFjZW1lbnQuc3BsaXQoJy0nKVsxXTtcbn0iLCJpbXBvcnQgeyB0b3AsIGxlZnQsIHJpZ2h0LCBib3R0b20sIGVuZCB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuaW1wb3J0IGdldE9mZnNldFBhcmVudCBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldE9mZnNldFBhcmVudC5qc1wiO1xuaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldFdpbmRvdy5qc1wiO1xuaW1wb3J0IGdldERvY3VtZW50RWxlbWVudCBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldERvY3VtZW50RWxlbWVudC5qc1wiO1xuaW1wb3J0IGdldENvbXB1dGVkU3R5bGUgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRDb21wdXRlZFN0eWxlLmpzXCI7XG5pbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0QmFzZVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IGdldFZhcmlhdGlvbiBmcm9tIFwiLi4vdXRpbHMvZ2V0VmFyaWF0aW9uLmpzXCI7XG5pbXBvcnQgeyByb3VuZCB9IGZyb20gXCIuLi91dGlscy9tYXRoLmpzXCI7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxudmFyIHVuc2V0U2lkZXMgPSB7XG4gIHRvcDogJ2F1dG8nLFxuICByaWdodDogJ2F1dG8nLFxuICBib3R0b206ICdhdXRvJyxcbiAgbGVmdDogJ2F1dG8nXG59OyAvLyBSb3VuZCB0aGUgb2Zmc2V0cyB0byB0aGUgbmVhcmVzdCBzdWl0YWJsZSBzdWJwaXhlbCBiYXNlZCBvbiB0aGUgRFBSLlxuLy8gWm9vbWluZyBjYW4gY2hhbmdlIHRoZSBEUFIsIGJ1dCBpdCBzZWVtcyB0byByZXBvcnQgYSB2YWx1ZSB0aGF0IHdpbGxcbi8vIGNsZWFubHkgZGl2aWRlIHRoZSB2YWx1ZXMgaW50byB0aGUgYXBwcm9wcmlhdGUgc3VicGl4ZWxzLlxuXG5mdW5jdGlvbiByb3VuZE9mZnNldHNCeURQUihfcmVmLCB3aW4pIHtcbiAgdmFyIHggPSBfcmVmLngsXG4gICAgICB5ID0gX3JlZi55O1xuICB2YXIgZHByID0gd2luLmRldmljZVBpeGVsUmF0aW8gfHwgMTtcbiAgcmV0dXJuIHtcbiAgICB4OiByb3VuZCh4ICogZHByKSAvIGRwciB8fCAwLFxuICAgIHk6IHJvdW5kKHkgKiBkcHIpIC8gZHByIHx8IDBcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1hcFRvU3R5bGVzKF9yZWYyKSB7XG4gIHZhciBfT2JqZWN0JGFzc2lnbjI7XG5cbiAgdmFyIHBvcHBlciA9IF9yZWYyLnBvcHBlcixcbiAgICAgIHBvcHBlclJlY3QgPSBfcmVmMi5wb3BwZXJSZWN0LFxuICAgICAgcGxhY2VtZW50ID0gX3JlZjIucGxhY2VtZW50LFxuICAgICAgdmFyaWF0aW9uID0gX3JlZjIudmFyaWF0aW9uLFxuICAgICAgb2Zmc2V0cyA9IF9yZWYyLm9mZnNldHMsXG4gICAgICBwb3NpdGlvbiA9IF9yZWYyLnBvc2l0aW9uLFxuICAgICAgZ3B1QWNjZWxlcmF0aW9uID0gX3JlZjIuZ3B1QWNjZWxlcmF0aW9uLFxuICAgICAgYWRhcHRpdmUgPSBfcmVmMi5hZGFwdGl2ZSxcbiAgICAgIHJvdW5kT2Zmc2V0cyA9IF9yZWYyLnJvdW5kT2Zmc2V0cyxcbiAgICAgIGlzRml4ZWQgPSBfcmVmMi5pc0ZpeGVkO1xuICB2YXIgX29mZnNldHMkeCA9IG9mZnNldHMueCxcbiAgICAgIHggPSBfb2Zmc2V0cyR4ID09PSB2b2lkIDAgPyAwIDogX29mZnNldHMkeCxcbiAgICAgIF9vZmZzZXRzJHkgPSBvZmZzZXRzLnksXG4gICAgICB5ID0gX29mZnNldHMkeSA9PT0gdm9pZCAwID8gMCA6IF9vZmZzZXRzJHk7XG5cbiAgdmFyIF9yZWYzID0gdHlwZW9mIHJvdW5kT2Zmc2V0cyA9PT0gJ2Z1bmN0aW9uJyA/IHJvdW5kT2Zmc2V0cyh7XG4gICAgeDogeCxcbiAgICB5OiB5XG4gIH0pIDoge1xuICAgIHg6IHgsXG4gICAgeTogeVxuICB9O1xuXG4gIHggPSBfcmVmMy54O1xuICB5ID0gX3JlZjMueTtcbiAgdmFyIGhhc1ggPSBvZmZzZXRzLmhhc093blByb3BlcnR5KCd4Jyk7XG4gIHZhciBoYXNZID0gb2Zmc2V0cy5oYXNPd25Qcm9wZXJ0eSgneScpO1xuICB2YXIgc2lkZVggPSBsZWZ0O1xuICB2YXIgc2lkZVkgPSB0b3A7XG4gIHZhciB3aW4gPSB3aW5kb3c7XG5cbiAgaWYgKGFkYXB0aXZlKSB7XG4gICAgdmFyIG9mZnNldFBhcmVudCA9IGdldE9mZnNldFBhcmVudChwb3BwZXIpO1xuICAgIHZhciBoZWlnaHRQcm9wID0gJ2NsaWVudEhlaWdodCc7XG4gICAgdmFyIHdpZHRoUHJvcCA9ICdjbGllbnRXaWR0aCc7XG5cbiAgICBpZiAob2Zmc2V0UGFyZW50ID09PSBnZXRXaW5kb3cocG9wcGVyKSkge1xuICAgICAgb2Zmc2V0UGFyZW50ID0gZ2V0RG9jdW1lbnRFbGVtZW50KHBvcHBlcik7XG5cbiAgICAgIGlmIChnZXRDb21wdXRlZFN0eWxlKG9mZnNldFBhcmVudCkucG9zaXRpb24gIT09ICdzdGF0aWMnICYmIHBvc2l0aW9uID09PSAnYWJzb2x1dGUnKSB7XG4gICAgICAgIGhlaWdodFByb3AgPSAnc2Nyb2xsSGVpZ2h0JztcbiAgICAgICAgd2lkdGhQcm9wID0gJ3Njcm9sbFdpZHRoJztcbiAgICAgIH1cbiAgICB9IC8vICRGbG93Rml4TWVbaW5jb21wYXRpYmxlLWNhc3RdOiBmb3JjZSB0eXBlIHJlZmluZW1lbnQsIHdlIGNvbXBhcmUgb2Zmc2V0UGFyZW50IHdpdGggd2luZG93IGFib3ZlLCBidXQgRmxvdyBkb2Vzbid0IGRldGVjdCBpdFxuXG5cbiAgICBvZmZzZXRQYXJlbnQgPSBvZmZzZXRQYXJlbnQ7XG5cbiAgICBpZiAocGxhY2VtZW50ID09PSB0b3AgfHwgKHBsYWNlbWVudCA9PT0gbGVmdCB8fCBwbGFjZW1lbnQgPT09IHJpZ2h0KSAmJiB2YXJpYXRpb24gPT09IGVuZCkge1xuICAgICAgc2lkZVkgPSBib3R0b207XG4gICAgICB2YXIgb2Zmc2V0WSA9IGlzRml4ZWQgJiYgb2Zmc2V0UGFyZW50ID09PSB3aW4gJiYgd2luLnZpc3VhbFZpZXdwb3J0ID8gd2luLnZpc3VhbFZpZXdwb3J0LmhlaWdodCA6IC8vICRGbG93Rml4TWVbcHJvcC1taXNzaW5nXVxuICAgICAgb2Zmc2V0UGFyZW50W2hlaWdodFByb3BdO1xuICAgICAgeSAtPSBvZmZzZXRZIC0gcG9wcGVyUmVjdC5oZWlnaHQ7XG4gICAgICB5ICo9IGdwdUFjY2VsZXJhdGlvbiA/IDEgOiAtMTtcbiAgICB9XG5cbiAgICBpZiAocGxhY2VtZW50ID09PSBsZWZ0IHx8IChwbGFjZW1lbnQgPT09IHRvcCB8fCBwbGFjZW1lbnQgPT09IGJvdHRvbSkgJiYgdmFyaWF0aW9uID09PSBlbmQpIHtcbiAgICAgIHNpZGVYID0gcmlnaHQ7XG4gICAgICB2YXIgb2Zmc2V0WCA9IGlzRml4ZWQgJiYgb2Zmc2V0UGFyZW50ID09PSB3aW4gJiYgd2luLnZpc3VhbFZpZXdwb3J0ID8gd2luLnZpc3VhbFZpZXdwb3J0LndpZHRoIDogLy8gJEZsb3dGaXhNZVtwcm9wLW1pc3NpbmddXG4gICAgICBvZmZzZXRQYXJlbnRbd2lkdGhQcm9wXTtcbiAgICAgIHggLT0gb2Zmc2V0WCAtIHBvcHBlclJlY3Qud2lkdGg7XG4gICAgICB4ICo9IGdwdUFjY2VsZXJhdGlvbiA/IDEgOiAtMTtcbiAgICB9XG4gIH1cblxuICB2YXIgY29tbW9uU3R5bGVzID0gT2JqZWN0LmFzc2lnbih7XG4gICAgcG9zaXRpb246IHBvc2l0aW9uXG4gIH0sIGFkYXB0aXZlICYmIHVuc2V0U2lkZXMpO1xuXG4gIHZhciBfcmVmNCA9IHJvdW5kT2Zmc2V0cyA9PT0gdHJ1ZSA/IHJvdW5kT2Zmc2V0c0J5RFBSKHtcbiAgICB4OiB4LFxuICAgIHk6IHlcbiAgfSwgZ2V0V2luZG93KHBvcHBlcikpIDoge1xuICAgIHg6IHgsXG4gICAgeTogeVxuICB9O1xuXG4gIHggPSBfcmVmNC54O1xuICB5ID0gX3JlZjQueTtcblxuICBpZiAoZ3B1QWNjZWxlcmF0aW9uKSB7XG4gICAgdmFyIF9PYmplY3QkYXNzaWduO1xuXG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGNvbW1vblN0eWxlcywgKF9PYmplY3QkYXNzaWduID0ge30sIF9PYmplY3QkYXNzaWduW3NpZGVZXSA9IGhhc1kgPyAnMCcgOiAnJywgX09iamVjdCRhc3NpZ25bc2lkZVhdID0gaGFzWCA/ICcwJyA6ICcnLCBfT2JqZWN0JGFzc2lnbi50cmFuc2Zvcm0gPSAod2luLmRldmljZVBpeGVsUmF0aW8gfHwgMSkgPD0gMSA/IFwidHJhbnNsYXRlKFwiICsgeCArIFwicHgsIFwiICsgeSArIFwicHgpXCIgOiBcInRyYW5zbGF0ZTNkKFwiICsgeCArIFwicHgsIFwiICsgeSArIFwicHgsIDApXCIsIF9PYmplY3QkYXNzaWduKSk7XG4gIH1cblxuICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgY29tbW9uU3R5bGVzLCAoX09iamVjdCRhc3NpZ24yID0ge30sIF9PYmplY3QkYXNzaWduMltzaWRlWV0gPSBoYXNZID8geSArIFwicHhcIiA6ICcnLCBfT2JqZWN0JGFzc2lnbjJbc2lkZVhdID0gaGFzWCA/IHggKyBcInB4XCIgOiAnJywgX09iamVjdCRhc3NpZ24yLnRyYW5zZm9ybSA9ICcnLCBfT2JqZWN0JGFzc2lnbjIpKTtcbn1cblxuZnVuY3Rpb24gY29tcHV0ZVN0eWxlcyhfcmVmNSkge1xuICB2YXIgc3RhdGUgPSBfcmVmNS5zdGF0ZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmNS5vcHRpb25zO1xuICB2YXIgX29wdGlvbnMkZ3B1QWNjZWxlcmF0ID0gb3B0aW9ucy5ncHVBY2NlbGVyYXRpb24sXG4gICAgICBncHVBY2NlbGVyYXRpb24gPSBfb3B0aW9ucyRncHVBY2NlbGVyYXQgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRncHVBY2NlbGVyYXQsXG4gICAgICBfb3B0aW9ucyRhZGFwdGl2ZSA9IG9wdGlvbnMuYWRhcHRpdmUsXG4gICAgICBhZGFwdGl2ZSA9IF9vcHRpb25zJGFkYXB0aXZlID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkYWRhcHRpdmUsXG4gICAgICBfb3B0aW9ucyRyb3VuZE9mZnNldHMgPSBvcHRpb25zLnJvdW5kT2Zmc2V0cyxcbiAgICAgIHJvdW5kT2Zmc2V0cyA9IF9vcHRpb25zJHJvdW5kT2Zmc2V0cyA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJHJvdW5kT2Zmc2V0cztcbiAgdmFyIGNvbW1vblN0eWxlcyA9IHtcbiAgICBwbGFjZW1lbnQ6IGdldEJhc2VQbGFjZW1lbnQoc3RhdGUucGxhY2VtZW50KSxcbiAgICB2YXJpYXRpb246IGdldFZhcmlhdGlvbihzdGF0ZS5wbGFjZW1lbnQpLFxuICAgIHBvcHBlcjogc3RhdGUuZWxlbWVudHMucG9wcGVyLFxuICAgIHBvcHBlclJlY3Q6IHN0YXRlLnJlY3RzLnBvcHBlcixcbiAgICBncHVBY2NlbGVyYXRpb246IGdwdUFjY2VsZXJhdGlvbixcbiAgICBpc0ZpeGVkOiBzdGF0ZS5vcHRpb25zLnN0cmF0ZWd5ID09PSAnZml4ZWQnXG4gIH07XG5cbiAgaWYgKHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cyAhPSBudWxsKSB7XG4gICAgc3RhdGUuc3R5bGVzLnBvcHBlciA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnN0eWxlcy5wb3BwZXIsIG1hcFRvU3R5bGVzKE9iamVjdC5hc3NpZ24oe30sIGNvbW1vblN0eWxlcywge1xuICAgICAgb2Zmc2V0czogc3RhdGUubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzLFxuICAgICAgcG9zaXRpb246IHN0YXRlLm9wdGlvbnMuc3RyYXRlZ3ksXG4gICAgICBhZGFwdGl2ZTogYWRhcHRpdmUsXG4gICAgICByb3VuZE9mZnNldHM6IHJvdW5kT2Zmc2V0c1xuICAgIH0pKSk7XG4gIH1cblxuICBpZiAoc3RhdGUubW9kaWZpZXJzRGF0YS5hcnJvdyAhPSBudWxsKSB7XG4gICAgc3RhdGUuc3R5bGVzLmFycm93ID0gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuc3R5bGVzLmFycm93LCBtYXBUb1N0eWxlcyhPYmplY3QuYXNzaWduKHt9LCBjb21tb25TdHlsZXMsIHtcbiAgICAgIG9mZnNldHM6IHN0YXRlLm1vZGlmaWVyc0RhdGEuYXJyb3csXG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgIGFkYXB0aXZlOiBmYWxzZSxcbiAgICAgIHJvdW5kT2Zmc2V0czogcm91bmRPZmZzZXRzXG4gICAgfSkpKTtcbiAgfVxuXG4gIHN0YXRlLmF0dHJpYnV0ZXMucG9wcGVyID0gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuYXR0cmlidXRlcy5wb3BwZXIsIHtcbiAgICAnZGF0YS1wb3BwZXItcGxhY2VtZW50Jzogc3RhdGUucGxhY2VtZW50XG4gIH0pO1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnY29tcHV0ZVN0eWxlcycsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAnYmVmb3JlV3JpdGUnLFxuICBmbjogY29tcHV0ZVN0eWxlcyxcbiAgZGF0YToge31cbn07IiwiaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldFdpbmRvdy5qc1wiOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbnZhciBwYXNzaXZlID0ge1xuICBwYXNzaXZlOiB0cnVlXG59O1xuXG5mdW5jdGlvbiBlZmZlY3QoX3JlZikge1xuICB2YXIgc3RhdGUgPSBfcmVmLnN0YXRlLFxuICAgICAgaW5zdGFuY2UgPSBfcmVmLmluc3RhbmNlLFxuICAgICAgb3B0aW9ucyA9IF9yZWYub3B0aW9ucztcbiAgdmFyIF9vcHRpb25zJHNjcm9sbCA9IG9wdGlvbnMuc2Nyb2xsLFxuICAgICAgc2Nyb2xsID0gX29wdGlvbnMkc2Nyb2xsID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkc2Nyb2xsLFxuICAgICAgX29wdGlvbnMkcmVzaXplID0gb3B0aW9ucy5yZXNpemUsXG4gICAgICByZXNpemUgPSBfb3B0aW9ucyRyZXNpemUgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRyZXNpemU7XG4gIHZhciB3aW5kb3cgPSBnZXRXaW5kb3coc3RhdGUuZWxlbWVudHMucG9wcGVyKTtcbiAgdmFyIHNjcm9sbFBhcmVudHMgPSBbXS5jb25jYXQoc3RhdGUuc2Nyb2xsUGFyZW50cy5yZWZlcmVuY2UsIHN0YXRlLnNjcm9sbFBhcmVudHMucG9wcGVyKTtcblxuICBpZiAoc2Nyb2xsKSB7XG4gICAgc2Nyb2xsUGFyZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChzY3JvbGxQYXJlbnQpIHtcbiAgICAgIHNjcm9sbFBhcmVudC5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBpbnN0YW5jZS51cGRhdGUsIHBhc3NpdmUpO1xuICAgIH0pO1xuICB9XG5cbiAgaWYgKHJlc2l6ZSkge1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBpbnN0YW5jZS51cGRhdGUsIHBhc3NpdmUpO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoc2Nyb2xsKSB7XG4gICAgICBzY3JvbGxQYXJlbnRzLmZvckVhY2goZnVuY3Rpb24gKHNjcm9sbFBhcmVudCkge1xuICAgICAgICBzY3JvbGxQYXJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgaW5zdGFuY2UudXBkYXRlLCBwYXNzaXZlKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChyZXNpemUpIHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCBpbnN0YW5jZS51cGRhdGUsIHBhc3NpdmUpO1xuICAgIH1cbiAgfTtcbn0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbmFtZTogJ2V2ZW50TGlzdGVuZXJzJyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICd3cml0ZScsXG4gIGZuOiBmdW5jdGlvbiBmbigpIHt9LFxuICBlZmZlY3Q6IGVmZmVjdCxcbiAgZGF0YToge31cbn07IiwidmFyIGhhc2ggPSB7XG4gIGxlZnQ6ICdyaWdodCcsXG4gIHJpZ2h0OiAnbGVmdCcsXG4gIGJvdHRvbTogJ3RvcCcsXG4gIHRvcDogJ2JvdHRvbSdcbn07XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRPcHBvc2l0ZVBsYWNlbWVudChwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIHBsYWNlbWVudC5yZXBsYWNlKC9sZWZ0fHJpZ2h0fGJvdHRvbXx0b3AvZywgZnVuY3Rpb24gKG1hdGNoZWQpIHtcbiAgICByZXR1cm4gaGFzaFttYXRjaGVkXTtcbiAgfSk7XG59IiwidmFyIGhhc2ggPSB7XG4gIHN0YXJ0OiAnZW5kJyxcbiAgZW5kOiAnc3RhcnQnXG59O1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0T3Bwb3NpdGVWYXJpYXRpb25QbGFjZW1lbnQocGxhY2VtZW50KSB7XG4gIHJldHVybiBwbGFjZW1lbnQucmVwbGFjZSgvc3RhcnR8ZW5kL2csIGZ1bmN0aW9uIChtYXRjaGVkKSB7XG4gICAgcmV0dXJuIGhhc2hbbWF0Y2hlZF07XG4gIH0pO1xufSIsImltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4vZ2V0V2luZG93LmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRXaW5kb3dTY3JvbGwobm9kZSkge1xuICB2YXIgd2luID0gZ2V0V2luZG93KG5vZGUpO1xuICB2YXIgc2Nyb2xsTGVmdCA9IHdpbi5wYWdlWE9mZnNldDtcbiAgdmFyIHNjcm9sbFRvcCA9IHdpbi5wYWdlWU9mZnNldDtcbiAgcmV0dXJuIHtcbiAgICBzY3JvbGxMZWZ0OiBzY3JvbGxMZWZ0LFxuICAgIHNjcm9sbFRvcDogc2Nyb2xsVG9wXG4gIH07XG59IiwiaW1wb3J0IGdldEJvdW5kaW5nQ2xpZW50UmVjdCBmcm9tIFwiLi9nZXRCb3VuZGluZ0NsaWVudFJlY3QuanNcIjtcbmltcG9ydCBnZXREb2N1bWVudEVsZW1lbnQgZnJvbSBcIi4vZ2V0RG9jdW1lbnRFbGVtZW50LmpzXCI7XG5pbXBvcnQgZ2V0V2luZG93U2Nyb2xsIGZyb20gXCIuL2dldFdpbmRvd1Njcm9sbC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0V2luZG93U2Nyb2xsQmFyWChlbGVtZW50KSB7XG4gIC8vIElmIDxodG1sPiBoYXMgYSBDU1Mgd2lkdGggZ3JlYXRlciB0aGFuIHRoZSB2aWV3cG9ydCwgdGhlbiB0aGlzIHdpbGwgYmVcbiAgLy8gaW5jb3JyZWN0IGZvciBSVEwuXG4gIC8vIFBvcHBlciAxIGlzIGJyb2tlbiBpbiB0aGlzIGNhc2UgYW5kIG5ldmVyIGhhZCBhIGJ1ZyByZXBvcnQgc28gbGV0J3MgYXNzdW1lXG4gIC8vIGl0J3Mgbm90IGFuIGlzc3VlLiBJIGRvbid0IHRoaW5rIGFueW9uZSBldmVyIHNwZWNpZmllcyB3aWR0aCBvbiA8aHRtbD5cbiAgLy8gYW55d2F5LlxuICAvLyBCcm93c2VycyB3aGVyZSB0aGUgbGVmdCBzY3JvbGxiYXIgZG9lc24ndCBjYXVzZSBhbiBpc3N1ZSByZXBvcnQgYDBgIGZvclxuICAvLyB0aGlzIChlLmcuIEVkZ2UgMjAxOSwgSUUxMSwgU2FmYXJpKVxuICByZXR1cm4gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KGdldERvY3VtZW50RWxlbWVudChlbGVtZW50KSkubGVmdCArIGdldFdpbmRvd1Njcm9sbChlbGVtZW50KS5zY3JvbGxMZWZ0O1xufSIsImltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4vZ2V0V2luZG93LmpzXCI7XG5pbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gXCIuL2dldERvY3VtZW50RWxlbWVudC5qc1wiO1xuaW1wb3J0IGdldFdpbmRvd1Njcm9sbEJhclggZnJvbSBcIi4vZ2V0V2luZG93U2Nyb2xsQmFyWC5qc1wiO1xuaW1wb3J0IGlzTGF5b3V0Vmlld3BvcnQgZnJvbSBcIi4vaXNMYXlvdXRWaWV3cG9ydC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0Vmlld3BvcnRSZWN0KGVsZW1lbnQsIHN0cmF0ZWd5KSB7XG4gIHZhciB3aW4gPSBnZXRXaW5kb3coZWxlbWVudCk7XG4gIHZhciBodG1sID0gZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpO1xuICB2YXIgdmlzdWFsVmlld3BvcnQgPSB3aW4udmlzdWFsVmlld3BvcnQ7XG4gIHZhciB3aWR0aCA9IGh0bWwuY2xpZW50V2lkdGg7XG4gIHZhciBoZWlnaHQgPSBodG1sLmNsaWVudEhlaWdodDtcbiAgdmFyIHggPSAwO1xuICB2YXIgeSA9IDA7XG5cbiAgaWYgKHZpc3VhbFZpZXdwb3J0KSB7XG4gICAgd2lkdGggPSB2aXN1YWxWaWV3cG9ydC53aWR0aDtcbiAgICBoZWlnaHQgPSB2aXN1YWxWaWV3cG9ydC5oZWlnaHQ7XG4gICAgdmFyIGxheW91dFZpZXdwb3J0ID0gaXNMYXlvdXRWaWV3cG9ydCgpO1xuXG4gICAgaWYgKGxheW91dFZpZXdwb3J0IHx8ICFsYXlvdXRWaWV3cG9ydCAmJiBzdHJhdGVneSA9PT0gJ2ZpeGVkJykge1xuICAgICAgeCA9IHZpc3VhbFZpZXdwb3J0Lm9mZnNldExlZnQ7XG4gICAgICB5ID0gdmlzdWFsVmlld3BvcnQub2Zmc2V0VG9wO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgd2lkdGg6IHdpZHRoLFxuICAgIGhlaWdodDogaGVpZ2h0LFxuICAgIHg6IHggKyBnZXRXaW5kb3dTY3JvbGxCYXJYKGVsZW1lbnQpLFxuICAgIHk6IHlcbiAgfTtcbn0iLCJpbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gXCIuL2dldERvY3VtZW50RWxlbWVudC5qc1wiO1xuaW1wb3J0IGdldENvbXB1dGVkU3R5bGUgZnJvbSBcIi4vZ2V0Q29tcHV0ZWRTdHlsZS5qc1wiO1xuaW1wb3J0IGdldFdpbmRvd1Njcm9sbEJhclggZnJvbSBcIi4vZ2V0V2luZG93U2Nyb2xsQmFyWC5qc1wiO1xuaW1wb3J0IGdldFdpbmRvd1Njcm9sbCBmcm9tIFwiLi9nZXRXaW5kb3dTY3JvbGwuanNcIjtcbmltcG9ydCB7IG1heCB9IGZyb20gXCIuLi91dGlscy9tYXRoLmpzXCI7IC8vIEdldHMgdGhlIGVudGlyZSBzaXplIG9mIHRoZSBzY3JvbGxhYmxlIGRvY3VtZW50IGFyZWEsIGV2ZW4gZXh0ZW5kaW5nIG91dHNpZGVcbi8vIG9mIHRoZSBgPGh0bWw+YCBhbmQgYDxib2R5PmAgcmVjdCBib3VuZHMgaWYgaG9yaXpvbnRhbGx5IHNjcm9sbGFibGVcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0RG9jdW1lbnRSZWN0KGVsZW1lbnQpIHtcbiAgdmFyIF9lbGVtZW50JG93bmVyRG9jdW1lbjtcblxuICB2YXIgaHRtbCA9IGdldERvY3VtZW50RWxlbWVudChlbGVtZW50KTtcbiAgdmFyIHdpblNjcm9sbCA9IGdldFdpbmRvd1Njcm9sbChlbGVtZW50KTtcbiAgdmFyIGJvZHkgPSAoX2VsZW1lbnQkb3duZXJEb2N1bWVuID0gZWxlbWVudC5vd25lckRvY3VtZW50KSA9PSBudWxsID8gdm9pZCAwIDogX2VsZW1lbnQkb3duZXJEb2N1bWVuLmJvZHk7XG4gIHZhciB3aWR0aCA9IG1heChodG1sLnNjcm9sbFdpZHRoLCBodG1sLmNsaWVudFdpZHRoLCBib2R5ID8gYm9keS5zY3JvbGxXaWR0aCA6IDAsIGJvZHkgPyBib2R5LmNsaWVudFdpZHRoIDogMCk7XG4gIHZhciBoZWlnaHQgPSBtYXgoaHRtbC5zY3JvbGxIZWlnaHQsIGh0bWwuY2xpZW50SGVpZ2h0LCBib2R5ID8gYm9keS5zY3JvbGxIZWlnaHQgOiAwLCBib2R5ID8gYm9keS5jbGllbnRIZWlnaHQgOiAwKTtcbiAgdmFyIHggPSAtd2luU2Nyb2xsLnNjcm9sbExlZnQgKyBnZXRXaW5kb3dTY3JvbGxCYXJYKGVsZW1lbnQpO1xuICB2YXIgeSA9IC13aW5TY3JvbGwuc2Nyb2xsVG9wO1xuXG4gIGlmIChnZXRDb21wdXRlZFN0eWxlKGJvZHkgfHwgaHRtbCkuZGlyZWN0aW9uID09PSAncnRsJykge1xuICAgIHggKz0gbWF4KGh0bWwuY2xpZW50V2lkdGgsIGJvZHkgPyBib2R5LmNsaWVudFdpZHRoIDogMCkgLSB3aWR0aDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgd2lkdGg6IHdpZHRoLFxuICAgIGhlaWdodDogaGVpZ2h0LFxuICAgIHg6IHgsXG4gICAgeTogeVxuICB9O1xufSIsImltcG9ydCBnZXRDb21wdXRlZFN0eWxlIGZyb20gXCIuL2dldENvbXB1dGVkU3R5bGUuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzU2Nyb2xsUGFyZW50KGVsZW1lbnQpIHtcbiAgLy8gRmlyZWZveCB3YW50cyB1cyB0byBjaGVjayBgLXhgIGFuZCBgLXlgIHZhcmlhdGlvbnMgYXMgd2VsbFxuICB2YXIgX2dldENvbXB1dGVkU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLFxuICAgICAgb3ZlcmZsb3cgPSBfZ2V0Q29tcHV0ZWRTdHlsZS5vdmVyZmxvdyxcbiAgICAgIG92ZXJmbG93WCA9IF9nZXRDb21wdXRlZFN0eWxlLm92ZXJmbG93WCxcbiAgICAgIG92ZXJmbG93WSA9IF9nZXRDb21wdXRlZFN0eWxlLm92ZXJmbG93WTtcblxuICByZXR1cm4gL2F1dG98c2Nyb2xsfG92ZXJsYXl8aGlkZGVuLy50ZXN0KG92ZXJmbG93ICsgb3ZlcmZsb3dZICsgb3ZlcmZsb3dYKTtcbn0iLCJpbXBvcnQgZ2V0UGFyZW50Tm9kZSBmcm9tIFwiLi9nZXRQYXJlbnROb2RlLmpzXCI7XG5pbXBvcnQgaXNTY3JvbGxQYXJlbnQgZnJvbSBcIi4vaXNTY3JvbGxQYXJlbnQuanNcIjtcbmltcG9ydCBnZXROb2RlTmFtZSBmcm9tIFwiLi9nZXROb2RlTmFtZS5qc1wiO1xuaW1wb3J0IHsgaXNIVE1MRWxlbWVudCB9IGZyb20gXCIuL2luc3RhbmNlT2YuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFNjcm9sbFBhcmVudChub2RlKSB7XG4gIGlmIChbJ2h0bWwnLCAnYm9keScsICcjZG9jdW1lbnQnXS5pbmRleE9mKGdldE5vZGVOYW1lKG5vZGUpKSA+PSAwKSB7XG4gICAgLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtcmV0dXJuXTogYXNzdW1lIGJvZHkgaXMgYWx3YXlzIGF2YWlsYWJsZVxuICAgIHJldHVybiBub2RlLm93bmVyRG9jdW1lbnQuYm9keTtcbiAgfVxuXG4gIGlmIChpc0hUTUxFbGVtZW50KG5vZGUpICYmIGlzU2Nyb2xsUGFyZW50KG5vZGUpKSB7XG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICByZXR1cm4gZ2V0U2Nyb2xsUGFyZW50KGdldFBhcmVudE5vZGUobm9kZSkpO1xufSIsImltcG9ydCBnZXRTY3JvbGxQYXJlbnQgZnJvbSBcIi4vZ2V0U2Nyb2xsUGFyZW50LmpzXCI7XG5pbXBvcnQgZ2V0UGFyZW50Tm9kZSBmcm9tIFwiLi9nZXRQYXJlbnROb2RlLmpzXCI7XG5pbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuL2dldFdpbmRvdy5qc1wiO1xuaW1wb3J0IGlzU2Nyb2xsUGFyZW50IGZyb20gXCIuL2lzU2Nyb2xsUGFyZW50LmpzXCI7XG4vKlxuZ2l2ZW4gYSBET00gZWxlbWVudCwgcmV0dXJuIHRoZSBsaXN0IG9mIGFsbCBzY3JvbGwgcGFyZW50cywgdXAgdGhlIGxpc3Qgb2YgYW5jZXNvcnNcbnVudGlsIHdlIGdldCB0byB0aGUgdG9wIHdpbmRvdyBvYmplY3QuIFRoaXMgbGlzdCBpcyB3aGF0IHdlIGF0dGFjaCBzY3JvbGwgbGlzdGVuZXJzXG50bywgYmVjYXVzZSBpZiBhbnkgb2YgdGhlc2UgcGFyZW50IGVsZW1lbnRzIHNjcm9sbCwgd2UnbGwgbmVlZCB0byByZS1jYWxjdWxhdGUgdGhlXG5yZWZlcmVuY2UgZWxlbWVudCdzIHBvc2l0aW9uLlxuKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbGlzdFNjcm9sbFBhcmVudHMoZWxlbWVudCwgbGlzdCkge1xuICB2YXIgX2VsZW1lbnQkb3duZXJEb2N1bWVuO1xuXG4gIGlmIChsaXN0ID09PSB2b2lkIDApIHtcbiAgICBsaXN0ID0gW107XG4gIH1cblxuICB2YXIgc2Nyb2xsUGFyZW50ID0gZ2V0U2Nyb2xsUGFyZW50KGVsZW1lbnQpO1xuICB2YXIgaXNCb2R5ID0gc2Nyb2xsUGFyZW50ID09PSAoKF9lbGVtZW50JG93bmVyRG9jdW1lbiA9IGVsZW1lbnQub3duZXJEb2N1bWVudCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9lbGVtZW50JG93bmVyRG9jdW1lbi5ib2R5KTtcbiAgdmFyIHdpbiA9IGdldFdpbmRvdyhzY3JvbGxQYXJlbnQpO1xuICB2YXIgdGFyZ2V0ID0gaXNCb2R5ID8gW3dpbl0uY29uY2F0KHdpbi52aXN1YWxWaWV3cG9ydCB8fCBbXSwgaXNTY3JvbGxQYXJlbnQoc2Nyb2xsUGFyZW50KSA/IHNjcm9sbFBhcmVudCA6IFtdKSA6IHNjcm9sbFBhcmVudDtcbiAgdmFyIHVwZGF0ZWRMaXN0ID0gbGlzdC5jb25jYXQodGFyZ2V0KTtcbiAgcmV0dXJuIGlzQm9keSA/IHVwZGF0ZWRMaXN0IDogLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtY2FsbF06IGlzQm9keSB0ZWxscyB1cyB0YXJnZXQgd2lsbCBiZSBhbiBIVE1MRWxlbWVudCBoZXJlXG4gIHVwZGF0ZWRMaXN0LmNvbmNhdChsaXN0U2Nyb2xsUGFyZW50cyhnZXRQYXJlbnROb2RlKHRhcmdldCkpKTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZWN0VG9DbGllbnRSZWN0KHJlY3QpIHtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHJlY3QsIHtcbiAgICBsZWZ0OiByZWN0LngsXG4gICAgdG9wOiByZWN0LnksXG4gICAgcmlnaHQ6IHJlY3QueCArIHJlY3Qud2lkdGgsXG4gICAgYm90dG9tOiByZWN0LnkgKyByZWN0LmhlaWdodFxuICB9KTtcbn0iLCJpbXBvcnQgeyB2aWV3cG9ydCB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuaW1wb3J0IGdldFZpZXdwb3J0UmVjdCBmcm9tIFwiLi9nZXRWaWV3cG9ydFJlY3QuanNcIjtcbmltcG9ydCBnZXREb2N1bWVudFJlY3QgZnJvbSBcIi4vZ2V0RG9jdW1lbnRSZWN0LmpzXCI7XG5pbXBvcnQgbGlzdFNjcm9sbFBhcmVudHMgZnJvbSBcIi4vbGlzdFNjcm9sbFBhcmVudHMuanNcIjtcbmltcG9ydCBnZXRPZmZzZXRQYXJlbnQgZnJvbSBcIi4vZ2V0T2Zmc2V0UGFyZW50LmpzXCI7XG5pbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gXCIuL2dldERvY3VtZW50RWxlbWVudC5qc1wiO1xuaW1wb3J0IGdldENvbXB1dGVkU3R5bGUgZnJvbSBcIi4vZ2V0Q29tcHV0ZWRTdHlsZS5qc1wiO1xuaW1wb3J0IHsgaXNFbGVtZW50LCBpc0hUTUxFbGVtZW50IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuaW1wb3J0IGdldEJvdW5kaW5nQ2xpZW50UmVjdCBmcm9tIFwiLi9nZXRCb3VuZGluZ0NsaWVudFJlY3QuanNcIjtcbmltcG9ydCBnZXRQYXJlbnROb2RlIGZyb20gXCIuL2dldFBhcmVudE5vZGUuanNcIjtcbmltcG9ydCBjb250YWlucyBmcm9tIFwiLi9jb250YWlucy5qc1wiO1xuaW1wb3J0IGdldE5vZGVOYW1lIGZyb20gXCIuL2dldE5vZGVOYW1lLmpzXCI7XG5pbXBvcnQgcmVjdFRvQ2xpZW50UmVjdCBmcm9tIFwiLi4vdXRpbHMvcmVjdFRvQ2xpZW50UmVjdC5qc1wiO1xuaW1wb3J0IHsgbWF4LCBtaW4gfSBmcm9tIFwiLi4vdXRpbHMvbWF0aC5qc1wiO1xuXG5mdW5jdGlvbiBnZXRJbm5lckJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50LCBzdHJhdGVneSkge1xuICB2YXIgcmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50LCBmYWxzZSwgc3RyYXRlZ3kgPT09ICdmaXhlZCcpO1xuICByZWN0LnRvcCA9IHJlY3QudG9wICsgZWxlbWVudC5jbGllbnRUb3A7XG4gIHJlY3QubGVmdCA9IHJlY3QubGVmdCArIGVsZW1lbnQuY2xpZW50TGVmdDtcbiAgcmVjdC5ib3R0b20gPSByZWN0LnRvcCArIGVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICByZWN0LnJpZ2h0ID0gcmVjdC5sZWZ0ICsgZWxlbWVudC5jbGllbnRXaWR0aDtcbiAgcmVjdC53aWR0aCA9IGVsZW1lbnQuY2xpZW50V2lkdGg7XG4gIHJlY3QuaGVpZ2h0ID0gZWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gIHJlY3QueCA9IHJlY3QubGVmdDtcbiAgcmVjdC55ID0gcmVjdC50b3A7XG4gIHJldHVybiByZWN0O1xufVxuXG5mdW5jdGlvbiBnZXRDbGllbnRSZWN0RnJvbU1peGVkVHlwZShlbGVtZW50LCBjbGlwcGluZ1BhcmVudCwgc3RyYXRlZ3kpIHtcbiAgcmV0dXJuIGNsaXBwaW5nUGFyZW50ID09PSB2aWV3cG9ydCA/IHJlY3RUb0NsaWVudFJlY3QoZ2V0Vmlld3BvcnRSZWN0KGVsZW1lbnQsIHN0cmF0ZWd5KSkgOiBpc0VsZW1lbnQoY2xpcHBpbmdQYXJlbnQpID8gZ2V0SW5uZXJCb3VuZGluZ0NsaWVudFJlY3QoY2xpcHBpbmdQYXJlbnQsIHN0cmF0ZWd5KSA6IHJlY3RUb0NsaWVudFJlY3QoZ2V0RG9jdW1lbnRSZWN0KGdldERvY3VtZW50RWxlbWVudChlbGVtZW50KSkpO1xufSAvLyBBIFwiY2xpcHBpbmcgcGFyZW50XCIgaXMgYW4gb3ZlcmZsb3dhYmxlIGNvbnRhaW5lciB3aXRoIHRoZSBjaGFyYWN0ZXJpc3RpYyBvZlxuLy8gY2xpcHBpbmcgKG9yIGhpZGluZykgb3ZlcmZsb3dpbmcgZWxlbWVudHMgd2l0aCBhIHBvc2l0aW9uIGRpZmZlcmVudCBmcm9tXG4vLyBgaW5pdGlhbGBcblxuXG5mdW5jdGlvbiBnZXRDbGlwcGluZ1BhcmVudHMoZWxlbWVudCkge1xuICB2YXIgY2xpcHBpbmdQYXJlbnRzID0gbGlzdFNjcm9sbFBhcmVudHMoZ2V0UGFyZW50Tm9kZShlbGVtZW50KSk7XG4gIHZhciBjYW5Fc2NhcGVDbGlwcGluZyA9IFsnYWJzb2x1dGUnLCAnZml4ZWQnXS5pbmRleE9mKGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkucG9zaXRpb24pID49IDA7XG4gIHZhciBjbGlwcGVyRWxlbWVudCA9IGNhbkVzY2FwZUNsaXBwaW5nICYmIGlzSFRNTEVsZW1lbnQoZWxlbWVudCkgPyBnZXRPZmZzZXRQYXJlbnQoZWxlbWVudCkgOiBlbGVtZW50O1xuXG4gIGlmICghaXNFbGVtZW50KGNsaXBwZXJFbGVtZW50KSkge1xuICAgIHJldHVybiBbXTtcbiAgfSAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1yZXR1cm5dOiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svZmxvdy9pc3N1ZXMvMTQxNFxuXG5cbiAgcmV0dXJuIGNsaXBwaW5nUGFyZW50cy5maWx0ZXIoZnVuY3Rpb24gKGNsaXBwaW5nUGFyZW50KSB7XG4gICAgcmV0dXJuIGlzRWxlbWVudChjbGlwcGluZ1BhcmVudCkgJiYgY29udGFpbnMoY2xpcHBpbmdQYXJlbnQsIGNsaXBwZXJFbGVtZW50KSAmJiBnZXROb2RlTmFtZShjbGlwcGluZ1BhcmVudCkgIT09ICdib2R5JztcbiAgfSk7XG59IC8vIEdldHMgdGhlIG1heGltdW0gYXJlYSB0aGF0IHRoZSBlbGVtZW50IGlzIHZpc2libGUgaW4gZHVlIHRvIGFueSBudW1iZXIgb2Zcbi8vIGNsaXBwaW5nIHBhcmVudHNcblxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRDbGlwcGluZ1JlY3QoZWxlbWVudCwgYm91bmRhcnksIHJvb3RCb3VuZGFyeSwgc3RyYXRlZ3kpIHtcbiAgdmFyIG1haW5DbGlwcGluZ1BhcmVudHMgPSBib3VuZGFyeSA9PT0gJ2NsaXBwaW5nUGFyZW50cycgPyBnZXRDbGlwcGluZ1BhcmVudHMoZWxlbWVudCkgOiBbXS5jb25jYXQoYm91bmRhcnkpO1xuICB2YXIgY2xpcHBpbmdQYXJlbnRzID0gW10uY29uY2F0KG1haW5DbGlwcGluZ1BhcmVudHMsIFtyb290Qm91bmRhcnldKTtcbiAgdmFyIGZpcnN0Q2xpcHBpbmdQYXJlbnQgPSBjbGlwcGluZ1BhcmVudHNbMF07XG4gIHZhciBjbGlwcGluZ1JlY3QgPSBjbGlwcGluZ1BhcmVudHMucmVkdWNlKGZ1bmN0aW9uIChhY2NSZWN0LCBjbGlwcGluZ1BhcmVudCkge1xuICAgIHZhciByZWN0ID0gZ2V0Q2xpZW50UmVjdEZyb21NaXhlZFR5cGUoZWxlbWVudCwgY2xpcHBpbmdQYXJlbnQsIHN0cmF0ZWd5KTtcbiAgICBhY2NSZWN0LnRvcCA9IG1heChyZWN0LnRvcCwgYWNjUmVjdC50b3ApO1xuICAgIGFjY1JlY3QucmlnaHQgPSBtaW4ocmVjdC5yaWdodCwgYWNjUmVjdC5yaWdodCk7XG4gICAgYWNjUmVjdC5ib3R0b20gPSBtaW4ocmVjdC5ib3R0b20sIGFjY1JlY3QuYm90dG9tKTtcbiAgICBhY2NSZWN0LmxlZnQgPSBtYXgocmVjdC5sZWZ0LCBhY2NSZWN0LmxlZnQpO1xuICAgIHJldHVybiBhY2NSZWN0O1xuICB9LCBnZXRDbGllbnRSZWN0RnJvbU1peGVkVHlwZShlbGVtZW50LCBmaXJzdENsaXBwaW5nUGFyZW50LCBzdHJhdGVneSkpO1xuICBjbGlwcGluZ1JlY3Qud2lkdGggPSBjbGlwcGluZ1JlY3QucmlnaHQgLSBjbGlwcGluZ1JlY3QubGVmdDtcbiAgY2xpcHBpbmdSZWN0LmhlaWdodCA9IGNsaXBwaW5nUmVjdC5ib3R0b20gLSBjbGlwcGluZ1JlY3QudG9wO1xuICBjbGlwcGluZ1JlY3QueCA9IGNsaXBwaW5nUmVjdC5sZWZ0O1xuICBjbGlwcGluZ1JlY3QueSA9IGNsaXBwaW5nUmVjdC50b3A7XG4gIHJldHVybiBjbGlwcGluZ1JlY3Q7XG59IiwiaW1wb3J0IGdldEJhc2VQbGFjZW1lbnQgZnJvbSBcIi4vZ2V0QmFzZVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IGdldFZhcmlhdGlvbiBmcm9tIFwiLi9nZXRWYXJpYXRpb24uanNcIjtcbmltcG9ydCBnZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQgZnJvbSBcIi4vZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgeyB0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnQsIHN0YXJ0LCBlbmQgfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbXB1dGVPZmZzZXRzKF9yZWYpIHtcbiAgdmFyIHJlZmVyZW5jZSA9IF9yZWYucmVmZXJlbmNlLFxuICAgICAgZWxlbWVudCA9IF9yZWYuZWxlbWVudCxcbiAgICAgIHBsYWNlbWVudCA9IF9yZWYucGxhY2VtZW50O1xuICB2YXIgYmFzZVBsYWNlbWVudCA9IHBsYWNlbWVudCA/IGdldEJhc2VQbGFjZW1lbnQocGxhY2VtZW50KSA6IG51bGw7XG4gIHZhciB2YXJpYXRpb24gPSBwbGFjZW1lbnQgPyBnZXRWYXJpYXRpb24ocGxhY2VtZW50KSA6IG51bGw7XG4gIHZhciBjb21tb25YID0gcmVmZXJlbmNlLnggKyByZWZlcmVuY2Uud2lkdGggLyAyIC0gZWxlbWVudC53aWR0aCAvIDI7XG4gIHZhciBjb21tb25ZID0gcmVmZXJlbmNlLnkgKyByZWZlcmVuY2UuaGVpZ2h0IC8gMiAtIGVsZW1lbnQuaGVpZ2h0IC8gMjtcbiAgdmFyIG9mZnNldHM7XG5cbiAgc3dpdGNoIChiYXNlUGxhY2VtZW50KSB7XG4gICAgY2FzZSB0b3A6XG4gICAgICBvZmZzZXRzID0ge1xuICAgICAgICB4OiBjb21tb25YLFxuICAgICAgICB5OiByZWZlcmVuY2UueSAtIGVsZW1lbnQuaGVpZ2h0XG4gICAgICB9O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIGJvdHRvbTpcbiAgICAgIG9mZnNldHMgPSB7XG4gICAgICAgIHg6IGNvbW1vblgsXG4gICAgICAgIHk6IHJlZmVyZW5jZS55ICsgcmVmZXJlbmNlLmhlaWdodFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSByaWdodDpcbiAgICAgIG9mZnNldHMgPSB7XG4gICAgICAgIHg6IHJlZmVyZW5jZS54ICsgcmVmZXJlbmNlLndpZHRoLFxuICAgICAgICB5OiBjb21tb25ZXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIGxlZnQ6XG4gICAgICBvZmZzZXRzID0ge1xuICAgICAgICB4OiByZWZlcmVuY2UueCAtIGVsZW1lbnQud2lkdGgsXG4gICAgICAgIHk6IGNvbW1vbllcbiAgICAgIH07XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICBvZmZzZXRzID0ge1xuICAgICAgICB4OiByZWZlcmVuY2UueCxcbiAgICAgICAgeTogcmVmZXJlbmNlLnlcbiAgICAgIH07XG4gIH1cblxuICB2YXIgbWFpbkF4aXMgPSBiYXNlUGxhY2VtZW50ID8gZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50KGJhc2VQbGFjZW1lbnQpIDogbnVsbDtcblxuICBpZiAobWFpbkF4aXMgIT0gbnVsbCkge1xuICAgIHZhciBsZW4gPSBtYWluQXhpcyA9PT0gJ3knID8gJ2hlaWdodCcgOiAnd2lkdGgnO1xuXG4gICAgc3dpdGNoICh2YXJpYXRpb24pIHtcbiAgICAgIGNhc2Ugc3RhcnQ6XG4gICAgICAgIG9mZnNldHNbbWFpbkF4aXNdID0gb2Zmc2V0c1ttYWluQXhpc10gLSAocmVmZXJlbmNlW2xlbl0gLyAyIC0gZWxlbWVudFtsZW5dIC8gMik7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIGVuZDpcbiAgICAgICAgb2Zmc2V0c1ttYWluQXhpc10gPSBvZmZzZXRzW21haW5BeGlzXSArIChyZWZlcmVuY2VbbGVuXSAvIDIgLSBlbGVtZW50W2xlbl0gLyAyKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9mZnNldHM7XG59IiwiaW1wb3J0IGdldENsaXBwaW5nUmVjdCBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldENsaXBwaW5nUmVjdC5qc1wiO1xuaW1wb3J0IGdldERvY3VtZW50RWxlbWVudCBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldERvY3VtZW50RWxlbWVudC5qc1wiO1xuaW1wb3J0IGdldEJvdW5kaW5nQ2xpZW50UmVjdCBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldEJvdW5kaW5nQ2xpZW50UmVjdC5qc1wiO1xuaW1wb3J0IGNvbXB1dGVPZmZzZXRzIGZyb20gXCIuL2NvbXB1dGVPZmZzZXRzLmpzXCI7XG5pbXBvcnQgcmVjdFRvQ2xpZW50UmVjdCBmcm9tIFwiLi9yZWN0VG9DbGllbnRSZWN0LmpzXCI7XG5pbXBvcnQgeyBjbGlwcGluZ1BhcmVudHMsIHJlZmVyZW5jZSwgcG9wcGVyLCBib3R0b20sIHRvcCwgcmlnaHQsIGJhc2VQbGFjZW1lbnRzLCB2aWV3cG9ydCB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuaW1wb3J0IHsgaXNFbGVtZW50IH0gZnJvbSBcIi4uL2RvbS11dGlscy9pbnN0YW5jZU9mLmpzXCI7XG5pbXBvcnQgbWVyZ2VQYWRkaW5nT2JqZWN0IGZyb20gXCIuL21lcmdlUGFkZGluZ09iamVjdC5qc1wiO1xuaW1wb3J0IGV4cGFuZFRvSGFzaE1hcCBmcm9tIFwiLi9leHBhbmRUb0hhc2hNYXAuanNcIjsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwgb3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgdmFyIF9vcHRpb25zID0gb3B0aW9ucyxcbiAgICAgIF9vcHRpb25zJHBsYWNlbWVudCA9IF9vcHRpb25zLnBsYWNlbWVudCxcbiAgICAgIHBsYWNlbWVudCA9IF9vcHRpb25zJHBsYWNlbWVudCA9PT0gdm9pZCAwID8gc3RhdGUucGxhY2VtZW50IDogX29wdGlvbnMkcGxhY2VtZW50LFxuICAgICAgX29wdGlvbnMkc3RyYXRlZ3kgPSBfb3B0aW9ucy5zdHJhdGVneSxcbiAgICAgIHN0cmF0ZWd5ID0gX29wdGlvbnMkc3RyYXRlZ3kgPT09IHZvaWQgMCA/IHN0YXRlLnN0cmF0ZWd5IDogX29wdGlvbnMkc3RyYXRlZ3ksXG4gICAgICBfb3B0aW9ucyRib3VuZGFyeSA9IF9vcHRpb25zLmJvdW5kYXJ5LFxuICAgICAgYm91bmRhcnkgPSBfb3B0aW9ucyRib3VuZGFyeSA9PT0gdm9pZCAwID8gY2xpcHBpbmdQYXJlbnRzIDogX29wdGlvbnMkYm91bmRhcnksXG4gICAgICBfb3B0aW9ucyRyb290Qm91bmRhcnkgPSBfb3B0aW9ucy5yb290Qm91bmRhcnksXG4gICAgICByb290Qm91bmRhcnkgPSBfb3B0aW9ucyRyb290Qm91bmRhcnkgPT09IHZvaWQgMCA/IHZpZXdwb3J0IDogX29wdGlvbnMkcm9vdEJvdW5kYXJ5LFxuICAgICAgX29wdGlvbnMkZWxlbWVudENvbnRlID0gX29wdGlvbnMuZWxlbWVudENvbnRleHQsXG4gICAgICBlbGVtZW50Q29udGV4dCA9IF9vcHRpb25zJGVsZW1lbnRDb250ZSA9PT0gdm9pZCAwID8gcG9wcGVyIDogX29wdGlvbnMkZWxlbWVudENvbnRlLFxuICAgICAgX29wdGlvbnMkYWx0Qm91bmRhcnkgPSBfb3B0aW9ucy5hbHRCb3VuZGFyeSxcbiAgICAgIGFsdEJvdW5kYXJ5ID0gX29wdGlvbnMkYWx0Qm91bmRhcnkgPT09IHZvaWQgMCA/IGZhbHNlIDogX29wdGlvbnMkYWx0Qm91bmRhcnksXG4gICAgICBfb3B0aW9ucyRwYWRkaW5nID0gX29wdGlvbnMucGFkZGluZyxcbiAgICAgIHBhZGRpbmcgPSBfb3B0aW9ucyRwYWRkaW5nID09PSB2b2lkIDAgPyAwIDogX29wdGlvbnMkcGFkZGluZztcbiAgdmFyIHBhZGRpbmdPYmplY3QgPSBtZXJnZVBhZGRpbmdPYmplY3QodHlwZW9mIHBhZGRpbmcgIT09ICdudW1iZXInID8gcGFkZGluZyA6IGV4cGFuZFRvSGFzaE1hcChwYWRkaW5nLCBiYXNlUGxhY2VtZW50cykpO1xuICB2YXIgYWx0Q29udGV4dCA9IGVsZW1lbnRDb250ZXh0ID09PSBwb3BwZXIgPyByZWZlcmVuY2UgOiBwb3BwZXI7XG4gIHZhciBwb3BwZXJSZWN0ID0gc3RhdGUucmVjdHMucG9wcGVyO1xuICB2YXIgZWxlbWVudCA9IHN0YXRlLmVsZW1lbnRzW2FsdEJvdW5kYXJ5ID8gYWx0Q29udGV4dCA6IGVsZW1lbnRDb250ZXh0XTtcbiAgdmFyIGNsaXBwaW5nQ2xpZW50UmVjdCA9IGdldENsaXBwaW5nUmVjdChpc0VsZW1lbnQoZWxlbWVudCkgPyBlbGVtZW50IDogZWxlbWVudC5jb250ZXh0RWxlbWVudCB8fCBnZXREb2N1bWVudEVsZW1lbnQoc3RhdGUuZWxlbWVudHMucG9wcGVyKSwgYm91bmRhcnksIHJvb3RCb3VuZGFyeSwgc3RyYXRlZ3kpO1xuICB2YXIgcmVmZXJlbmNlQ2xpZW50UmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChzdGF0ZS5lbGVtZW50cy5yZWZlcmVuY2UpO1xuICB2YXIgcG9wcGVyT2Zmc2V0cyA9IGNvbXB1dGVPZmZzZXRzKHtcbiAgICByZWZlcmVuY2U6IHJlZmVyZW5jZUNsaWVudFJlY3QsXG4gICAgZWxlbWVudDogcG9wcGVyUmVjdCxcbiAgICBzdHJhdGVneTogJ2Fic29sdXRlJyxcbiAgICBwbGFjZW1lbnQ6IHBsYWNlbWVudFxuICB9KTtcbiAgdmFyIHBvcHBlckNsaWVudFJlY3QgPSByZWN0VG9DbGllbnRSZWN0KE9iamVjdC5hc3NpZ24oe30sIHBvcHBlclJlY3QsIHBvcHBlck9mZnNldHMpKTtcbiAgdmFyIGVsZW1lbnRDbGllbnRSZWN0ID0gZWxlbWVudENvbnRleHQgPT09IHBvcHBlciA/IHBvcHBlckNsaWVudFJlY3QgOiByZWZlcmVuY2VDbGllbnRSZWN0OyAvLyBwb3NpdGl2ZSA9IG92ZXJmbG93aW5nIHRoZSBjbGlwcGluZyByZWN0XG4gIC8vIDAgb3IgbmVnYXRpdmUgPSB3aXRoaW4gdGhlIGNsaXBwaW5nIHJlY3RcblxuICB2YXIgb3ZlcmZsb3dPZmZzZXRzID0ge1xuICAgIHRvcDogY2xpcHBpbmdDbGllbnRSZWN0LnRvcCAtIGVsZW1lbnRDbGllbnRSZWN0LnRvcCArIHBhZGRpbmdPYmplY3QudG9wLFxuICAgIGJvdHRvbTogZWxlbWVudENsaWVudFJlY3QuYm90dG9tIC0gY2xpcHBpbmdDbGllbnRSZWN0LmJvdHRvbSArIHBhZGRpbmdPYmplY3QuYm90dG9tLFxuICAgIGxlZnQ6IGNsaXBwaW5nQ2xpZW50UmVjdC5sZWZ0IC0gZWxlbWVudENsaWVudFJlY3QubGVmdCArIHBhZGRpbmdPYmplY3QubGVmdCxcbiAgICByaWdodDogZWxlbWVudENsaWVudFJlY3QucmlnaHQgLSBjbGlwcGluZ0NsaWVudFJlY3QucmlnaHQgKyBwYWRkaW5nT2JqZWN0LnJpZ2h0XG4gIH07XG4gIHZhciBvZmZzZXREYXRhID0gc3RhdGUubW9kaWZpZXJzRGF0YS5vZmZzZXQ7IC8vIE9mZnNldHMgY2FuIGJlIGFwcGxpZWQgb25seSB0byB0aGUgcG9wcGVyIGVsZW1lbnRcblxuICBpZiAoZWxlbWVudENvbnRleHQgPT09IHBvcHBlciAmJiBvZmZzZXREYXRhKSB7XG4gICAgdmFyIG9mZnNldCA9IG9mZnNldERhdGFbcGxhY2VtZW50XTtcbiAgICBPYmplY3Qua2V5cyhvdmVyZmxvd09mZnNldHMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgdmFyIG11bHRpcGx5ID0gW3JpZ2h0LCBib3R0b21dLmluZGV4T2Yoa2V5KSA+PSAwID8gMSA6IC0xO1xuICAgICAgdmFyIGF4aXMgPSBbdG9wLCBib3R0b21dLmluZGV4T2Yoa2V5KSA+PSAwID8gJ3knIDogJ3gnO1xuICAgICAgb3ZlcmZsb3dPZmZzZXRzW2tleV0gKz0gb2Zmc2V0W2F4aXNdICogbXVsdGlwbHk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gb3ZlcmZsb3dPZmZzZXRzO1xufSIsImltcG9ydCBnZXRWYXJpYXRpb24gZnJvbSBcIi4vZ2V0VmFyaWF0aW9uLmpzXCI7XG5pbXBvcnQgeyB2YXJpYXRpb25QbGFjZW1lbnRzLCBiYXNlUGxhY2VtZW50cywgcGxhY2VtZW50cyBhcyBhbGxQbGFjZW1lbnRzIH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5pbXBvcnQgZGV0ZWN0T3ZlcmZsb3cgZnJvbSBcIi4vZGV0ZWN0T3ZlcmZsb3cuanNcIjtcbmltcG9ydCBnZXRCYXNlUGxhY2VtZW50IGZyb20gXCIuL2dldEJhc2VQbGFjZW1lbnQuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbXB1dGVBdXRvUGxhY2VtZW50KHN0YXRlLCBvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICB2YXIgX29wdGlvbnMgPSBvcHRpb25zLFxuICAgICAgcGxhY2VtZW50ID0gX29wdGlvbnMucGxhY2VtZW50LFxuICAgICAgYm91bmRhcnkgPSBfb3B0aW9ucy5ib3VuZGFyeSxcbiAgICAgIHJvb3RCb3VuZGFyeSA9IF9vcHRpb25zLnJvb3RCb3VuZGFyeSxcbiAgICAgIHBhZGRpbmcgPSBfb3B0aW9ucy5wYWRkaW5nLFxuICAgICAgZmxpcFZhcmlhdGlvbnMgPSBfb3B0aW9ucy5mbGlwVmFyaWF0aW9ucyxcbiAgICAgIF9vcHRpb25zJGFsbG93ZWRBdXRvUCA9IF9vcHRpb25zLmFsbG93ZWRBdXRvUGxhY2VtZW50cyxcbiAgICAgIGFsbG93ZWRBdXRvUGxhY2VtZW50cyA9IF9vcHRpb25zJGFsbG93ZWRBdXRvUCA9PT0gdm9pZCAwID8gYWxsUGxhY2VtZW50cyA6IF9vcHRpb25zJGFsbG93ZWRBdXRvUDtcbiAgdmFyIHZhcmlhdGlvbiA9IGdldFZhcmlhdGlvbihwbGFjZW1lbnQpO1xuICB2YXIgcGxhY2VtZW50cyA9IHZhcmlhdGlvbiA/IGZsaXBWYXJpYXRpb25zID8gdmFyaWF0aW9uUGxhY2VtZW50cyA6IHZhcmlhdGlvblBsYWNlbWVudHMuZmlsdGVyKGZ1bmN0aW9uIChwbGFjZW1lbnQpIHtcbiAgICByZXR1cm4gZ2V0VmFyaWF0aW9uKHBsYWNlbWVudCkgPT09IHZhcmlhdGlvbjtcbiAgfSkgOiBiYXNlUGxhY2VtZW50cztcbiAgdmFyIGFsbG93ZWRQbGFjZW1lbnRzID0gcGxhY2VtZW50cy5maWx0ZXIoZnVuY3Rpb24gKHBsYWNlbWVudCkge1xuICAgIHJldHVybiBhbGxvd2VkQXV0b1BsYWNlbWVudHMuaW5kZXhPZihwbGFjZW1lbnQpID49IDA7XG4gIH0pO1xuXG4gIGlmIChhbGxvd2VkUGxhY2VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICBhbGxvd2VkUGxhY2VtZW50cyA9IHBsYWNlbWVudHM7XG4gIH0gLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtdHlwZV06IEZsb3cgc2VlbXMgdG8gaGF2ZSBwcm9ibGVtcyB3aXRoIHR3byBhcnJheSB1bmlvbnMuLi5cblxuXG4gIHZhciBvdmVyZmxvd3MgPSBhbGxvd2VkUGxhY2VtZW50cy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgcGxhY2VtZW50KSB7XG4gICAgYWNjW3BsYWNlbWVudF0gPSBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwge1xuICAgICAgcGxhY2VtZW50OiBwbGFjZW1lbnQsXG4gICAgICBib3VuZGFyeTogYm91bmRhcnksXG4gICAgICByb290Qm91bmRhcnk6IHJvb3RCb3VuZGFyeSxcbiAgICAgIHBhZGRpbmc6IHBhZGRpbmdcbiAgICB9KVtnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCldO1xuICAgIHJldHVybiBhY2M7XG4gIH0sIHt9KTtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKG92ZXJmbG93cykuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBvdmVyZmxvd3NbYV0gLSBvdmVyZmxvd3NbYl07XG4gIH0pO1xufSIsImltcG9ydCBnZXRPcHBvc2l0ZVBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0T3Bwb3NpdGVQbGFjZW1lbnQuanNcIjtcbmltcG9ydCBnZXRCYXNlUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRCYXNlUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgZ2V0T3Bwb3NpdGVWYXJpYXRpb25QbGFjZW1lbnQgZnJvbSBcIi4uL3V0aWxzL2dldE9wcG9zaXRlVmFyaWF0aW9uUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgZGV0ZWN0T3ZlcmZsb3cgZnJvbSBcIi4uL3V0aWxzL2RldGVjdE92ZXJmbG93LmpzXCI7XG5pbXBvcnQgY29tcHV0ZUF1dG9QbGFjZW1lbnQgZnJvbSBcIi4uL3V0aWxzL2NvbXB1dGVBdXRvUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgeyBib3R0b20sIHRvcCwgc3RhcnQsIHJpZ2h0LCBsZWZ0LCBhdXRvIH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5pbXBvcnQgZ2V0VmFyaWF0aW9uIGZyb20gXCIuLi91dGlscy9nZXRWYXJpYXRpb24uanNcIjsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5mdW5jdGlvbiBnZXRFeHBhbmRlZEZhbGxiYWNrUGxhY2VtZW50cyhwbGFjZW1lbnQpIHtcbiAgaWYgKGdldEJhc2VQbGFjZW1lbnQocGxhY2VtZW50KSA9PT0gYXV0bykge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHZhciBvcHBvc2l0ZVBsYWNlbWVudCA9IGdldE9wcG9zaXRlUGxhY2VtZW50KHBsYWNlbWVudCk7XG4gIHJldHVybiBbZ2V0T3Bwb3NpdGVWYXJpYXRpb25QbGFjZW1lbnQocGxhY2VtZW50KSwgb3Bwb3NpdGVQbGFjZW1lbnQsIGdldE9wcG9zaXRlVmFyaWF0aW9uUGxhY2VtZW50KG9wcG9zaXRlUGxhY2VtZW50KV07XG59XG5cbmZ1bmN0aW9uIGZsaXAoX3JlZikge1xuICB2YXIgc3RhdGUgPSBfcmVmLnN0YXRlLFxuICAgICAgb3B0aW9ucyA9IF9yZWYub3B0aW9ucyxcbiAgICAgIG5hbWUgPSBfcmVmLm5hbWU7XG5cbiAgaWYgKHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0uX3NraXApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgX29wdGlvbnMkbWFpbkF4aXMgPSBvcHRpb25zLm1haW5BeGlzLFxuICAgICAgY2hlY2tNYWluQXhpcyA9IF9vcHRpb25zJG1haW5BeGlzID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkbWFpbkF4aXMsXG4gICAgICBfb3B0aW9ucyRhbHRBeGlzID0gb3B0aW9ucy5hbHRBeGlzLFxuICAgICAgY2hlY2tBbHRBeGlzID0gX29wdGlvbnMkYWx0QXhpcyA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJGFsdEF4aXMsXG4gICAgICBzcGVjaWZpZWRGYWxsYmFja1BsYWNlbWVudHMgPSBvcHRpb25zLmZhbGxiYWNrUGxhY2VtZW50cyxcbiAgICAgIHBhZGRpbmcgPSBvcHRpb25zLnBhZGRpbmcsXG4gICAgICBib3VuZGFyeSA9IG9wdGlvbnMuYm91bmRhcnksXG4gICAgICByb290Qm91bmRhcnkgPSBvcHRpb25zLnJvb3RCb3VuZGFyeSxcbiAgICAgIGFsdEJvdW5kYXJ5ID0gb3B0aW9ucy5hbHRCb3VuZGFyeSxcbiAgICAgIF9vcHRpb25zJGZsaXBWYXJpYXRpbyA9IG9wdGlvbnMuZmxpcFZhcmlhdGlvbnMsXG4gICAgICBmbGlwVmFyaWF0aW9ucyA9IF9vcHRpb25zJGZsaXBWYXJpYXRpbyA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJGZsaXBWYXJpYXRpbyxcbiAgICAgIGFsbG93ZWRBdXRvUGxhY2VtZW50cyA9IG9wdGlvbnMuYWxsb3dlZEF1dG9QbGFjZW1lbnRzO1xuICB2YXIgcHJlZmVycmVkUGxhY2VtZW50ID0gc3RhdGUub3B0aW9ucy5wbGFjZW1lbnQ7XG4gIHZhciBiYXNlUGxhY2VtZW50ID0gZ2V0QmFzZVBsYWNlbWVudChwcmVmZXJyZWRQbGFjZW1lbnQpO1xuICB2YXIgaXNCYXNlUGxhY2VtZW50ID0gYmFzZVBsYWNlbWVudCA9PT0gcHJlZmVycmVkUGxhY2VtZW50O1xuICB2YXIgZmFsbGJhY2tQbGFjZW1lbnRzID0gc3BlY2lmaWVkRmFsbGJhY2tQbGFjZW1lbnRzIHx8IChpc0Jhc2VQbGFjZW1lbnQgfHwgIWZsaXBWYXJpYXRpb25zID8gW2dldE9wcG9zaXRlUGxhY2VtZW50KHByZWZlcnJlZFBsYWNlbWVudCldIDogZ2V0RXhwYW5kZWRGYWxsYmFja1BsYWNlbWVudHMocHJlZmVycmVkUGxhY2VtZW50KSk7XG4gIHZhciBwbGFjZW1lbnRzID0gW3ByZWZlcnJlZFBsYWNlbWVudF0uY29uY2F0KGZhbGxiYWNrUGxhY2VtZW50cykucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHBsYWNlbWVudCkge1xuICAgIHJldHVybiBhY2MuY29uY2F0KGdldEJhc2VQbGFjZW1lbnQocGxhY2VtZW50KSA9PT0gYXV0byA/IGNvbXB1dGVBdXRvUGxhY2VtZW50KHN0YXRlLCB7XG4gICAgICBwbGFjZW1lbnQ6IHBsYWNlbWVudCxcbiAgICAgIGJvdW5kYXJ5OiBib3VuZGFyeSxcbiAgICAgIHJvb3RCb3VuZGFyeTogcm9vdEJvdW5kYXJ5LFxuICAgICAgcGFkZGluZzogcGFkZGluZyxcbiAgICAgIGZsaXBWYXJpYXRpb25zOiBmbGlwVmFyaWF0aW9ucyxcbiAgICAgIGFsbG93ZWRBdXRvUGxhY2VtZW50czogYWxsb3dlZEF1dG9QbGFjZW1lbnRzXG4gICAgfSkgOiBwbGFjZW1lbnQpO1xuICB9LCBbXSk7XG4gIHZhciByZWZlcmVuY2VSZWN0ID0gc3RhdGUucmVjdHMucmVmZXJlbmNlO1xuICB2YXIgcG9wcGVyUmVjdCA9IHN0YXRlLnJlY3RzLnBvcHBlcjtcbiAgdmFyIGNoZWNrc01hcCA9IG5ldyBNYXAoKTtcbiAgdmFyIG1ha2VGYWxsYmFja0NoZWNrcyA9IHRydWU7XG4gIHZhciBmaXJzdEZpdHRpbmdQbGFjZW1lbnQgPSBwbGFjZW1lbnRzWzBdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcGxhY2VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBwbGFjZW1lbnQgPSBwbGFjZW1lbnRzW2ldO1xuXG4gICAgdmFyIF9iYXNlUGxhY2VtZW50ID0gZ2V0QmFzZVBsYWNlbWVudChwbGFjZW1lbnQpO1xuXG4gICAgdmFyIGlzU3RhcnRWYXJpYXRpb24gPSBnZXRWYXJpYXRpb24ocGxhY2VtZW50KSA9PT0gc3RhcnQ7XG4gICAgdmFyIGlzVmVydGljYWwgPSBbdG9wLCBib3R0b21dLmluZGV4T2YoX2Jhc2VQbGFjZW1lbnQpID49IDA7XG4gICAgdmFyIGxlbiA9IGlzVmVydGljYWwgPyAnd2lkdGgnIDogJ2hlaWdodCc7XG4gICAgdmFyIG92ZXJmbG93ID0gZGV0ZWN0T3ZlcmZsb3coc3RhdGUsIHtcbiAgICAgIHBsYWNlbWVudDogcGxhY2VtZW50LFxuICAgICAgYm91bmRhcnk6IGJvdW5kYXJ5LFxuICAgICAgcm9vdEJvdW5kYXJ5OiByb290Qm91bmRhcnksXG4gICAgICBhbHRCb3VuZGFyeTogYWx0Qm91bmRhcnksXG4gICAgICBwYWRkaW5nOiBwYWRkaW5nXG4gICAgfSk7XG4gICAgdmFyIG1haW5WYXJpYXRpb25TaWRlID0gaXNWZXJ0aWNhbCA/IGlzU3RhcnRWYXJpYXRpb24gPyByaWdodCA6IGxlZnQgOiBpc1N0YXJ0VmFyaWF0aW9uID8gYm90dG9tIDogdG9wO1xuXG4gICAgaWYgKHJlZmVyZW5jZVJlY3RbbGVuXSA+IHBvcHBlclJlY3RbbGVuXSkge1xuICAgICAgbWFpblZhcmlhdGlvblNpZGUgPSBnZXRPcHBvc2l0ZVBsYWNlbWVudChtYWluVmFyaWF0aW9uU2lkZSk7XG4gICAgfVxuXG4gICAgdmFyIGFsdFZhcmlhdGlvblNpZGUgPSBnZXRPcHBvc2l0ZVBsYWNlbWVudChtYWluVmFyaWF0aW9uU2lkZSk7XG4gICAgdmFyIGNoZWNrcyA9IFtdO1xuXG4gICAgaWYgKGNoZWNrTWFpbkF4aXMpIHtcbiAgICAgIGNoZWNrcy5wdXNoKG92ZXJmbG93W19iYXNlUGxhY2VtZW50XSA8PSAwKTtcbiAgICB9XG5cbiAgICBpZiAoY2hlY2tBbHRBeGlzKSB7XG4gICAgICBjaGVja3MucHVzaChvdmVyZmxvd1ttYWluVmFyaWF0aW9uU2lkZV0gPD0gMCwgb3ZlcmZsb3dbYWx0VmFyaWF0aW9uU2lkZV0gPD0gMCk7XG4gICAgfVxuXG4gICAgaWYgKGNoZWNrcy5ldmVyeShmdW5jdGlvbiAoY2hlY2spIHtcbiAgICAgIHJldHVybiBjaGVjaztcbiAgICB9KSkge1xuICAgICAgZmlyc3RGaXR0aW5nUGxhY2VtZW50ID0gcGxhY2VtZW50O1xuICAgICAgbWFrZUZhbGxiYWNrQ2hlY2tzID0gZmFsc2U7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBjaGVja3NNYXAuc2V0KHBsYWNlbWVudCwgY2hlY2tzKTtcbiAgfVxuXG4gIGlmIChtYWtlRmFsbGJhY2tDaGVja3MpIHtcbiAgICAvLyBgMmAgbWF5IGJlIGRlc2lyZWQgaW4gc29tZSBjYXNlcyDigJMgcmVzZWFyY2ggbGF0ZXJcbiAgICB2YXIgbnVtYmVyT2ZDaGVja3MgPSBmbGlwVmFyaWF0aW9ucyA/IDMgOiAxO1xuXG4gICAgdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3AoX2kpIHtcbiAgICAgIHZhciBmaXR0aW5nUGxhY2VtZW50ID0gcGxhY2VtZW50cy5maW5kKGZ1bmN0aW9uIChwbGFjZW1lbnQpIHtcbiAgICAgICAgdmFyIGNoZWNrcyA9IGNoZWNrc01hcC5nZXQocGxhY2VtZW50KTtcblxuICAgICAgICBpZiAoY2hlY2tzKSB7XG4gICAgICAgICAgcmV0dXJuIGNoZWNrcy5zbGljZSgwLCBfaSkuZXZlcnkoZnVuY3Rpb24gKGNoZWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gY2hlY2s7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAoZml0dGluZ1BsYWNlbWVudCkge1xuICAgICAgICBmaXJzdEZpdHRpbmdQbGFjZW1lbnQgPSBmaXR0aW5nUGxhY2VtZW50O1xuICAgICAgICByZXR1cm4gXCJicmVha1wiO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBmb3IgKHZhciBfaSA9IG51bWJlck9mQ2hlY2tzOyBfaSA+IDA7IF9pLS0pIHtcbiAgICAgIHZhciBfcmV0ID0gX2xvb3AoX2kpO1xuXG4gICAgICBpZiAoX3JldCA9PT0gXCJicmVha1wiKSBicmVhaztcbiAgICB9XG4gIH1cblxuICBpZiAoc3RhdGUucGxhY2VtZW50ICE9PSBmaXJzdEZpdHRpbmdQbGFjZW1lbnQpIHtcbiAgICBzdGF0ZS5tb2RpZmllcnNEYXRhW25hbWVdLl9za2lwID0gdHJ1ZTtcbiAgICBzdGF0ZS5wbGFjZW1lbnQgPSBmaXJzdEZpdHRpbmdQbGFjZW1lbnQ7XG4gICAgc3RhdGUucmVzZXQgPSB0cnVlO1xuICB9XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdmbGlwJyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdtYWluJyxcbiAgZm46IGZsaXAsXG4gIHJlcXVpcmVzSWZFeGlzdHM6IFsnb2Zmc2V0J10sXG4gIGRhdGE6IHtcbiAgICBfc2tpcDogZmFsc2VcbiAgfVxufTsiLCJpbXBvcnQgeyB0b3AsIGJvdHRvbSwgbGVmdCwgcmlnaHQgfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmltcG9ydCBkZXRlY3RPdmVyZmxvdyBmcm9tIFwiLi4vdXRpbHMvZGV0ZWN0T3ZlcmZsb3cuanNcIjtcblxuZnVuY3Rpb24gZ2V0U2lkZU9mZnNldHMob3ZlcmZsb3csIHJlY3QsIHByZXZlbnRlZE9mZnNldHMpIHtcbiAgaWYgKHByZXZlbnRlZE9mZnNldHMgPT09IHZvaWQgMCkge1xuICAgIHByZXZlbnRlZE9mZnNldHMgPSB7XG4gICAgICB4OiAwLFxuICAgICAgeTogMFxuICAgIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHRvcDogb3ZlcmZsb3cudG9wIC0gcmVjdC5oZWlnaHQgLSBwcmV2ZW50ZWRPZmZzZXRzLnksXG4gICAgcmlnaHQ6IG92ZXJmbG93LnJpZ2h0IC0gcmVjdC53aWR0aCArIHByZXZlbnRlZE9mZnNldHMueCxcbiAgICBib3R0b206IG92ZXJmbG93LmJvdHRvbSAtIHJlY3QuaGVpZ2h0ICsgcHJldmVudGVkT2Zmc2V0cy55LFxuICAgIGxlZnQ6IG92ZXJmbG93LmxlZnQgLSByZWN0LndpZHRoIC0gcHJldmVudGVkT2Zmc2V0cy54XG4gIH07XG59XG5cbmZ1bmN0aW9uIGlzQW55U2lkZUZ1bGx5Q2xpcHBlZChvdmVyZmxvdykge1xuICByZXR1cm4gW3RvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdF0uc29tZShmdW5jdGlvbiAoc2lkZSkge1xuICAgIHJldHVybiBvdmVyZmxvd1tzaWRlXSA+PSAwO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gaGlkZShfcmVmKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYuc3RhdGUsXG4gICAgICBuYW1lID0gX3JlZi5uYW1lO1xuICB2YXIgcmVmZXJlbmNlUmVjdCA9IHN0YXRlLnJlY3RzLnJlZmVyZW5jZTtcbiAgdmFyIHBvcHBlclJlY3QgPSBzdGF0ZS5yZWN0cy5wb3BwZXI7XG4gIHZhciBwcmV2ZW50ZWRPZmZzZXRzID0gc3RhdGUubW9kaWZpZXJzRGF0YS5wcmV2ZW50T3ZlcmZsb3c7XG4gIHZhciByZWZlcmVuY2VPdmVyZmxvdyA9IGRldGVjdE92ZXJmbG93KHN0YXRlLCB7XG4gICAgZWxlbWVudENvbnRleHQ6ICdyZWZlcmVuY2UnXG4gIH0pO1xuICB2YXIgcG9wcGVyQWx0T3ZlcmZsb3cgPSBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwge1xuICAgIGFsdEJvdW5kYXJ5OiB0cnVlXG4gIH0pO1xuICB2YXIgcmVmZXJlbmNlQ2xpcHBpbmdPZmZzZXRzID0gZ2V0U2lkZU9mZnNldHMocmVmZXJlbmNlT3ZlcmZsb3csIHJlZmVyZW5jZVJlY3QpO1xuICB2YXIgcG9wcGVyRXNjYXBlT2Zmc2V0cyA9IGdldFNpZGVPZmZzZXRzKHBvcHBlckFsdE92ZXJmbG93LCBwb3BwZXJSZWN0LCBwcmV2ZW50ZWRPZmZzZXRzKTtcbiAgdmFyIGlzUmVmZXJlbmNlSGlkZGVuID0gaXNBbnlTaWRlRnVsbHlDbGlwcGVkKHJlZmVyZW5jZUNsaXBwaW5nT2Zmc2V0cyk7XG4gIHZhciBoYXNQb3BwZXJFc2NhcGVkID0gaXNBbnlTaWRlRnVsbHlDbGlwcGVkKHBvcHBlckVzY2FwZU9mZnNldHMpO1xuICBzdGF0ZS5tb2RpZmllcnNEYXRhW25hbWVdID0ge1xuICAgIHJlZmVyZW5jZUNsaXBwaW5nT2Zmc2V0czogcmVmZXJlbmNlQ2xpcHBpbmdPZmZzZXRzLFxuICAgIHBvcHBlckVzY2FwZU9mZnNldHM6IHBvcHBlckVzY2FwZU9mZnNldHMsXG4gICAgaXNSZWZlcmVuY2VIaWRkZW46IGlzUmVmZXJlbmNlSGlkZGVuLFxuICAgIGhhc1BvcHBlckVzY2FwZWQ6IGhhc1BvcHBlckVzY2FwZWRcbiAgfTtcbiAgc3RhdGUuYXR0cmlidXRlcy5wb3BwZXIgPSBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5hdHRyaWJ1dGVzLnBvcHBlciwge1xuICAgICdkYXRhLXBvcHBlci1yZWZlcmVuY2UtaGlkZGVuJzogaXNSZWZlcmVuY2VIaWRkZW4sXG4gICAgJ2RhdGEtcG9wcGVyLWVzY2FwZWQnOiBoYXNQb3BwZXJFc2NhcGVkXG4gIH0pO1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnaGlkZScsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAnbWFpbicsXG4gIHJlcXVpcmVzSWZFeGlzdHM6IFsncHJldmVudE92ZXJmbG93J10sXG4gIGZuOiBoaWRlXG59OyIsImltcG9ydCBnZXRCYXNlUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRCYXNlUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgeyB0b3AsIGxlZnQsIHJpZ2h0LCBwbGFjZW1lbnRzIH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuZXhwb3J0IGZ1bmN0aW9uIGRpc3RhbmNlQW5kU2tpZGRpbmdUb1hZKHBsYWNlbWVudCwgcmVjdHMsIG9mZnNldCkge1xuICB2YXIgYmFzZVBsYWNlbWVudCA9IGdldEJhc2VQbGFjZW1lbnQocGxhY2VtZW50KTtcbiAgdmFyIGludmVydERpc3RhbmNlID0gW2xlZnQsIHRvcF0uaW5kZXhPZihiYXNlUGxhY2VtZW50KSA+PSAwID8gLTEgOiAxO1xuXG4gIHZhciBfcmVmID0gdHlwZW9mIG9mZnNldCA9PT0gJ2Z1bmN0aW9uJyA/IG9mZnNldChPYmplY3QuYXNzaWduKHt9LCByZWN0cywge1xuICAgIHBsYWNlbWVudDogcGxhY2VtZW50XG4gIH0pKSA6IG9mZnNldCxcbiAgICAgIHNraWRkaW5nID0gX3JlZlswXSxcbiAgICAgIGRpc3RhbmNlID0gX3JlZlsxXTtcblxuICBza2lkZGluZyA9IHNraWRkaW5nIHx8IDA7XG4gIGRpc3RhbmNlID0gKGRpc3RhbmNlIHx8IDApICogaW52ZXJ0RGlzdGFuY2U7XG4gIHJldHVybiBbbGVmdCwgcmlnaHRdLmluZGV4T2YoYmFzZVBsYWNlbWVudCkgPj0gMCA/IHtcbiAgICB4OiBkaXN0YW5jZSxcbiAgICB5OiBza2lkZGluZ1xuICB9IDoge1xuICAgIHg6IHNraWRkaW5nLFxuICAgIHk6IGRpc3RhbmNlXG4gIH07XG59XG5cbmZ1bmN0aW9uIG9mZnNldChfcmVmMikge1xuICB2YXIgc3RhdGUgPSBfcmVmMi5zdGF0ZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmMi5vcHRpb25zLFxuICAgICAgbmFtZSA9IF9yZWYyLm5hbWU7XG4gIHZhciBfb3B0aW9ucyRvZmZzZXQgPSBvcHRpb25zLm9mZnNldCxcbiAgICAgIG9mZnNldCA9IF9vcHRpb25zJG9mZnNldCA9PT0gdm9pZCAwID8gWzAsIDBdIDogX29wdGlvbnMkb2Zmc2V0O1xuICB2YXIgZGF0YSA9IHBsYWNlbWVudHMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHBsYWNlbWVudCkge1xuICAgIGFjY1twbGFjZW1lbnRdID0gZGlzdGFuY2VBbmRTa2lkZGluZ1RvWFkocGxhY2VtZW50LCBzdGF0ZS5yZWN0cywgb2Zmc2V0KTtcbiAgICByZXR1cm4gYWNjO1xuICB9LCB7fSk7XG4gIHZhciBfZGF0YSRzdGF0ZSRwbGFjZW1lbnQgPSBkYXRhW3N0YXRlLnBsYWNlbWVudF0sXG4gICAgICB4ID0gX2RhdGEkc3RhdGUkcGxhY2VtZW50LngsXG4gICAgICB5ID0gX2RhdGEkc3RhdGUkcGxhY2VtZW50Lnk7XG5cbiAgaWYgKHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cyAhPSBudWxsKSB7XG4gICAgc3RhdGUubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzLnggKz0geDtcbiAgICBzdGF0ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHMueSArPSB5O1xuICB9XG5cbiAgc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXSA9IGRhdGE7XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdvZmZzZXQnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ21haW4nLFxuICByZXF1aXJlczogWydwb3BwZXJPZmZzZXRzJ10sXG4gIGZuOiBvZmZzZXRcbn07IiwiaW1wb3J0IGNvbXB1dGVPZmZzZXRzIGZyb20gXCIuLi91dGlscy9jb21wdXRlT2Zmc2V0cy5qc1wiO1xuXG5mdW5jdGlvbiBwb3BwZXJPZmZzZXRzKF9yZWYpIHtcbiAgdmFyIHN0YXRlID0gX3JlZi5zdGF0ZSxcbiAgICAgIG5hbWUgPSBfcmVmLm5hbWU7XG4gIC8vIE9mZnNldHMgYXJlIHRoZSBhY3R1YWwgcG9zaXRpb24gdGhlIHBvcHBlciBuZWVkcyB0byBoYXZlIHRvIGJlXG4gIC8vIHByb3Blcmx5IHBvc2l0aW9uZWQgbmVhciBpdHMgcmVmZXJlbmNlIGVsZW1lbnRcbiAgLy8gVGhpcyBpcyB0aGUgbW9zdCBiYXNpYyBwbGFjZW1lbnQsIGFuZCB3aWxsIGJlIGFkanVzdGVkIGJ5XG4gIC8vIHRoZSBtb2RpZmllcnMgaW4gdGhlIG5leHQgc3RlcFxuICBzdGF0ZS5tb2RpZmllcnNEYXRhW25hbWVdID0gY29tcHV0ZU9mZnNldHMoe1xuICAgIHJlZmVyZW5jZTogc3RhdGUucmVjdHMucmVmZXJlbmNlLFxuICAgIGVsZW1lbnQ6IHN0YXRlLnJlY3RzLnBvcHBlcixcbiAgICBzdHJhdGVneTogJ2Fic29sdXRlJyxcbiAgICBwbGFjZW1lbnQ6IHN0YXRlLnBsYWNlbWVudFxuICB9KTtcbn0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbmFtZTogJ3BvcHBlck9mZnNldHMnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ3JlYWQnLFxuICBmbjogcG9wcGVyT2Zmc2V0cyxcbiAgZGF0YToge31cbn07IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0QWx0QXhpcyhheGlzKSB7XG4gIHJldHVybiBheGlzID09PSAneCcgPyAneScgOiAneCc7XG59IiwiaW1wb3J0IHsgdG9wLCBsZWZ0LCByaWdodCwgYm90dG9tLCBzdGFydCB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuaW1wb3J0IGdldEJhc2VQbGFjZW1lbnQgZnJvbSBcIi4uL3V0aWxzL2dldEJhc2VQbGFjZW1lbnQuanNcIjtcbmltcG9ydCBnZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQgZnJvbSBcIi4uL3V0aWxzL2dldE1haW5BeGlzRnJvbVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IGdldEFsdEF4aXMgZnJvbSBcIi4uL3V0aWxzL2dldEFsdEF4aXMuanNcIjtcbmltcG9ydCB7IHdpdGhpbiwgd2l0aGluTWF4Q2xhbXAgfSBmcm9tIFwiLi4vdXRpbHMvd2l0aGluLmpzXCI7XG5pbXBvcnQgZ2V0TGF5b3V0UmVjdCBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldExheW91dFJlY3QuanNcIjtcbmltcG9ydCBnZXRPZmZzZXRQYXJlbnQgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRPZmZzZXRQYXJlbnQuanNcIjtcbmltcG9ydCBkZXRlY3RPdmVyZmxvdyBmcm9tIFwiLi4vdXRpbHMvZGV0ZWN0T3ZlcmZsb3cuanNcIjtcbmltcG9ydCBnZXRWYXJpYXRpb24gZnJvbSBcIi4uL3V0aWxzL2dldFZhcmlhdGlvbi5qc1wiO1xuaW1wb3J0IGdldEZyZXNoU2lkZU9iamVjdCBmcm9tIFwiLi4vdXRpbHMvZ2V0RnJlc2hTaWRlT2JqZWN0LmpzXCI7XG5pbXBvcnQgeyBtaW4gYXMgbWF0aE1pbiwgbWF4IGFzIG1hdGhNYXggfSBmcm9tIFwiLi4vdXRpbHMvbWF0aC5qc1wiO1xuXG5mdW5jdGlvbiBwcmV2ZW50T3ZlcmZsb3coX3JlZikge1xuICB2YXIgc3RhdGUgPSBfcmVmLnN0YXRlLFxuICAgICAgb3B0aW9ucyA9IF9yZWYub3B0aW9ucyxcbiAgICAgIG5hbWUgPSBfcmVmLm5hbWU7XG4gIHZhciBfb3B0aW9ucyRtYWluQXhpcyA9IG9wdGlvbnMubWFpbkF4aXMsXG4gICAgICBjaGVja01haW5BeGlzID0gX29wdGlvbnMkbWFpbkF4aXMgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRtYWluQXhpcyxcbiAgICAgIF9vcHRpb25zJGFsdEF4aXMgPSBvcHRpb25zLmFsdEF4aXMsXG4gICAgICBjaGVja0FsdEF4aXMgPSBfb3B0aW9ucyRhbHRBeGlzID09PSB2b2lkIDAgPyBmYWxzZSA6IF9vcHRpb25zJGFsdEF4aXMsXG4gICAgICBib3VuZGFyeSA9IG9wdGlvbnMuYm91bmRhcnksXG4gICAgICByb290Qm91bmRhcnkgPSBvcHRpb25zLnJvb3RCb3VuZGFyeSxcbiAgICAgIGFsdEJvdW5kYXJ5ID0gb3B0aW9ucy5hbHRCb3VuZGFyeSxcbiAgICAgIHBhZGRpbmcgPSBvcHRpb25zLnBhZGRpbmcsXG4gICAgICBfb3B0aW9ucyR0ZXRoZXIgPSBvcHRpb25zLnRldGhlcixcbiAgICAgIHRldGhlciA9IF9vcHRpb25zJHRldGhlciA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJHRldGhlcixcbiAgICAgIF9vcHRpb25zJHRldGhlck9mZnNldCA9IG9wdGlvbnMudGV0aGVyT2Zmc2V0LFxuICAgICAgdGV0aGVyT2Zmc2V0ID0gX29wdGlvbnMkdGV0aGVyT2Zmc2V0ID09PSB2b2lkIDAgPyAwIDogX29wdGlvbnMkdGV0aGVyT2Zmc2V0O1xuICB2YXIgb3ZlcmZsb3cgPSBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwge1xuICAgIGJvdW5kYXJ5OiBib3VuZGFyeSxcbiAgICByb290Qm91bmRhcnk6IHJvb3RCb3VuZGFyeSxcbiAgICBwYWRkaW5nOiBwYWRkaW5nLFxuICAgIGFsdEJvdW5kYXJ5OiBhbHRCb3VuZGFyeVxuICB9KTtcbiAgdmFyIGJhc2VQbGFjZW1lbnQgPSBnZXRCYXNlUGxhY2VtZW50KHN0YXRlLnBsYWNlbWVudCk7XG4gIHZhciB2YXJpYXRpb24gPSBnZXRWYXJpYXRpb24oc3RhdGUucGxhY2VtZW50KTtcbiAgdmFyIGlzQmFzZVBsYWNlbWVudCA9ICF2YXJpYXRpb247XG4gIHZhciBtYWluQXhpcyA9IGdldE1haW5BeGlzRnJvbVBsYWNlbWVudChiYXNlUGxhY2VtZW50KTtcbiAgdmFyIGFsdEF4aXMgPSBnZXRBbHRBeGlzKG1haW5BeGlzKTtcbiAgdmFyIHBvcHBlck9mZnNldHMgPSBzdGF0ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHM7XG4gIHZhciByZWZlcmVuY2VSZWN0ID0gc3RhdGUucmVjdHMucmVmZXJlbmNlO1xuICB2YXIgcG9wcGVyUmVjdCA9IHN0YXRlLnJlY3RzLnBvcHBlcjtcbiAgdmFyIHRldGhlck9mZnNldFZhbHVlID0gdHlwZW9mIHRldGhlck9mZnNldCA9PT0gJ2Z1bmN0aW9uJyA/IHRldGhlck9mZnNldChPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5yZWN0cywge1xuICAgIHBsYWNlbWVudDogc3RhdGUucGxhY2VtZW50XG4gIH0pKSA6IHRldGhlck9mZnNldDtcbiAgdmFyIG5vcm1hbGl6ZWRUZXRoZXJPZmZzZXRWYWx1ZSA9IHR5cGVvZiB0ZXRoZXJPZmZzZXRWYWx1ZSA9PT0gJ251bWJlcicgPyB7XG4gICAgbWFpbkF4aXM6IHRldGhlck9mZnNldFZhbHVlLFxuICAgIGFsdEF4aXM6IHRldGhlck9mZnNldFZhbHVlXG4gIH0gOiBPYmplY3QuYXNzaWduKHtcbiAgICBtYWluQXhpczogMCxcbiAgICBhbHRBeGlzOiAwXG4gIH0sIHRldGhlck9mZnNldFZhbHVlKTtcbiAgdmFyIG9mZnNldE1vZGlmaWVyU3RhdGUgPSBzdGF0ZS5tb2RpZmllcnNEYXRhLm9mZnNldCA/IHN0YXRlLm1vZGlmaWVyc0RhdGEub2Zmc2V0W3N0YXRlLnBsYWNlbWVudF0gOiBudWxsO1xuICB2YXIgZGF0YSA9IHtcbiAgICB4OiAwLFxuICAgIHk6IDBcbiAgfTtcblxuICBpZiAoIXBvcHBlck9mZnNldHMpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoY2hlY2tNYWluQXhpcykge1xuICAgIHZhciBfb2Zmc2V0TW9kaWZpZXJTdGF0ZSQ7XG5cbiAgICB2YXIgbWFpblNpZGUgPSBtYWluQXhpcyA9PT0gJ3knID8gdG9wIDogbGVmdDtcbiAgICB2YXIgYWx0U2lkZSA9IG1haW5BeGlzID09PSAneScgPyBib3R0b20gOiByaWdodDtcbiAgICB2YXIgbGVuID0gbWFpbkF4aXMgPT09ICd5JyA/ICdoZWlnaHQnIDogJ3dpZHRoJztcbiAgICB2YXIgb2Zmc2V0ID0gcG9wcGVyT2Zmc2V0c1ttYWluQXhpc107XG4gICAgdmFyIG1pbiA9IG9mZnNldCArIG92ZXJmbG93W21haW5TaWRlXTtcbiAgICB2YXIgbWF4ID0gb2Zmc2V0IC0gb3ZlcmZsb3dbYWx0U2lkZV07XG4gICAgdmFyIGFkZGl0aXZlID0gdGV0aGVyID8gLXBvcHBlclJlY3RbbGVuXSAvIDIgOiAwO1xuICAgIHZhciBtaW5MZW4gPSB2YXJpYXRpb24gPT09IHN0YXJ0ID8gcmVmZXJlbmNlUmVjdFtsZW5dIDogcG9wcGVyUmVjdFtsZW5dO1xuICAgIHZhciBtYXhMZW4gPSB2YXJpYXRpb24gPT09IHN0YXJ0ID8gLXBvcHBlclJlY3RbbGVuXSA6IC1yZWZlcmVuY2VSZWN0W2xlbl07IC8vIFdlIG5lZWQgdG8gaW5jbHVkZSB0aGUgYXJyb3cgaW4gdGhlIGNhbGN1bGF0aW9uIHNvIHRoZSBhcnJvdyBkb2Vzbid0IGdvXG4gICAgLy8gb3V0c2lkZSB0aGUgcmVmZXJlbmNlIGJvdW5kc1xuXG4gICAgdmFyIGFycm93RWxlbWVudCA9IHN0YXRlLmVsZW1lbnRzLmFycm93O1xuICAgIHZhciBhcnJvd1JlY3QgPSB0ZXRoZXIgJiYgYXJyb3dFbGVtZW50ID8gZ2V0TGF5b3V0UmVjdChhcnJvd0VsZW1lbnQpIDoge1xuICAgICAgd2lkdGg6IDAsXG4gICAgICBoZWlnaHQ6IDBcbiAgICB9O1xuICAgIHZhciBhcnJvd1BhZGRpbmdPYmplY3QgPSBzdGF0ZS5tb2RpZmllcnNEYXRhWydhcnJvdyNwZXJzaXN0ZW50J10gPyBzdGF0ZS5tb2RpZmllcnNEYXRhWydhcnJvdyNwZXJzaXN0ZW50J10ucGFkZGluZyA6IGdldEZyZXNoU2lkZU9iamVjdCgpO1xuICAgIHZhciBhcnJvd1BhZGRpbmdNaW4gPSBhcnJvd1BhZGRpbmdPYmplY3RbbWFpblNpZGVdO1xuICAgIHZhciBhcnJvd1BhZGRpbmdNYXggPSBhcnJvd1BhZGRpbmdPYmplY3RbYWx0U2lkZV07IC8vIElmIHRoZSByZWZlcmVuY2UgbGVuZ3RoIGlzIHNtYWxsZXIgdGhhbiB0aGUgYXJyb3cgbGVuZ3RoLCB3ZSBkb24ndCB3YW50XG4gICAgLy8gdG8gaW5jbHVkZSBpdHMgZnVsbCBzaXplIGluIHRoZSBjYWxjdWxhdGlvbi4gSWYgdGhlIHJlZmVyZW5jZSBpcyBzbWFsbFxuICAgIC8vIGFuZCBuZWFyIHRoZSBlZGdlIG9mIGEgYm91bmRhcnksIHRoZSBwb3BwZXIgY2FuIG92ZXJmbG93IGV2ZW4gaWYgdGhlXG4gICAgLy8gcmVmZXJlbmNlIGlzIG5vdCBvdmVyZmxvd2luZyBhcyB3ZWxsIChlLmcuIHZpcnR1YWwgZWxlbWVudHMgd2l0aCBub1xuICAgIC8vIHdpZHRoIG9yIGhlaWdodClcblxuICAgIHZhciBhcnJvd0xlbiA9IHdpdGhpbigwLCByZWZlcmVuY2VSZWN0W2xlbl0sIGFycm93UmVjdFtsZW5dKTtcbiAgICB2YXIgbWluT2Zmc2V0ID0gaXNCYXNlUGxhY2VtZW50ID8gcmVmZXJlbmNlUmVjdFtsZW5dIC8gMiAtIGFkZGl0aXZlIC0gYXJyb3dMZW4gLSBhcnJvd1BhZGRpbmdNaW4gLSBub3JtYWxpemVkVGV0aGVyT2Zmc2V0VmFsdWUubWFpbkF4aXMgOiBtaW5MZW4gLSBhcnJvd0xlbiAtIGFycm93UGFkZGluZ01pbiAtIG5vcm1hbGl6ZWRUZXRoZXJPZmZzZXRWYWx1ZS5tYWluQXhpcztcbiAgICB2YXIgbWF4T2Zmc2V0ID0gaXNCYXNlUGxhY2VtZW50ID8gLXJlZmVyZW5jZVJlY3RbbGVuXSAvIDIgKyBhZGRpdGl2ZSArIGFycm93TGVuICsgYXJyb3dQYWRkaW5nTWF4ICsgbm9ybWFsaXplZFRldGhlck9mZnNldFZhbHVlLm1haW5BeGlzIDogbWF4TGVuICsgYXJyb3dMZW4gKyBhcnJvd1BhZGRpbmdNYXggKyBub3JtYWxpemVkVGV0aGVyT2Zmc2V0VmFsdWUubWFpbkF4aXM7XG4gICAgdmFyIGFycm93T2Zmc2V0UGFyZW50ID0gc3RhdGUuZWxlbWVudHMuYXJyb3cgJiYgZ2V0T2Zmc2V0UGFyZW50KHN0YXRlLmVsZW1lbnRzLmFycm93KTtcbiAgICB2YXIgY2xpZW50T2Zmc2V0ID0gYXJyb3dPZmZzZXRQYXJlbnQgPyBtYWluQXhpcyA9PT0gJ3knID8gYXJyb3dPZmZzZXRQYXJlbnQuY2xpZW50VG9wIHx8IDAgOiBhcnJvd09mZnNldFBhcmVudC5jbGllbnRMZWZ0IHx8IDAgOiAwO1xuICAgIHZhciBvZmZzZXRNb2RpZmllclZhbHVlID0gKF9vZmZzZXRNb2RpZmllclN0YXRlJCA9IG9mZnNldE1vZGlmaWVyU3RhdGUgPT0gbnVsbCA/IHZvaWQgMCA6IG9mZnNldE1vZGlmaWVyU3RhdGVbbWFpbkF4aXNdKSAhPSBudWxsID8gX29mZnNldE1vZGlmaWVyU3RhdGUkIDogMDtcbiAgICB2YXIgdGV0aGVyTWluID0gb2Zmc2V0ICsgbWluT2Zmc2V0IC0gb2Zmc2V0TW9kaWZpZXJWYWx1ZSAtIGNsaWVudE9mZnNldDtcbiAgICB2YXIgdGV0aGVyTWF4ID0gb2Zmc2V0ICsgbWF4T2Zmc2V0IC0gb2Zmc2V0TW9kaWZpZXJWYWx1ZTtcbiAgICB2YXIgcHJldmVudGVkT2Zmc2V0ID0gd2l0aGluKHRldGhlciA/IG1hdGhNaW4obWluLCB0ZXRoZXJNaW4pIDogbWluLCBvZmZzZXQsIHRldGhlciA/IG1hdGhNYXgobWF4LCB0ZXRoZXJNYXgpIDogbWF4KTtcbiAgICBwb3BwZXJPZmZzZXRzW21haW5BeGlzXSA9IHByZXZlbnRlZE9mZnNldDtcbiAgICBkYXRhW21haW5BeGlzXSA9IHByZXZlbnRlZE9mZnNldCAtIG9mZnNldDtcbiAgfVxuXG4gIGlmIChjaGVja0FsdEF4aXMpIHtcbiAgICB2YXIgX29mZnNldE1vZGlmaWVyU3RhdGUkMjtcblxuICAgIHZhciBfbWFpblNpZGUgPSBtYWluQXhpcyA9PT0gJ3gnID8gdG9wIDogbGVmdDtcblxuICAgIHZhciBfYWx0U2lkZSA9IG1haW5BeGlzID09PSAneCcgPyBib3R0b20gOiByaWdodDtcblxuICAgIHZhciBfb2Zmc2V0ID0gcG9wcGVyT2Zmc2V0c1thbHRBeGlzXTtcblxuICAgIHZhciBfbGVuID0gYWx0QXhpcyA9PT0gJ3knID8gJ2hlaWdodCcgOiAnd2lkdGgnO1xuXG4gICAgdmFyIF9taW4gPSBfb2Zmc2V0ICsgb3ZlcmZsb3dbX21haW5TaWRlXTtcblxuICAgIHZhciBfbWF4ID0gX29mZnNldCAtIG92ZXJmbG93W19hbHRTaWRlXTtcblxuICAgIHZhciBpc09yaWdpblNpZGUgPSBbdG9wLCBsZWZ0XS5pbmRleE9mKGJhc2VQbGFjZW1lbnQpICE9PSAtMTtcblxuICAgIHZhciBfb2Zmc2V0TW9kaWZpZXJWYWx1ZSA9IChfb2Zmc2V0TW9kaWZpZXJTdGF0ZSQyID0gb2Zmc2V0TW9kaWZpZXJTdGF0ZSA9PSBudWxsID8gdm9pZCAwIDogb2Zmc2V0TW9kaWZpZXJTdGF0ZVthbHRBeGlzXSkgIT0gbnVsbCA/IF9vZmZzZXRNb2RpZmllclN0YXRlJDIgOiAwO1xuXG4gICAgdmFyIF90ZXRoZXJNaW4gPSBpc09yaWdpblNpZGUgPyBfbWluIDogX29mZnNldCAtIHJlZmVyZW5jZVJlY3RbX2xlbl0gLSBwb3BwZXJSZWN0W19sZW5dIC0gX29mZnNldE1vZGlmaWVyVmFsdWUgKyBub3JtYWxpemVkVGV0aGVyT2Zmc2V0VmFsdWUuYWx0QXhpcztcblxuICAgIHZhciBfdGV0aGVyTWF4ID0gaXNPcmlnaW5TaWRlID8gX29mZnNldCArIHJlZmVyZW5jZVJlY3RbX2xlbl0gKyBwb3BwZXJSZWN0W19sZW5dIC0gX29mZnNldE1vZGlmaWVyVmFsdWUgLSBub3JtYWxpemVkVGV0aGVyT2Zmc2V0VmFsdWUuYWx0QXhpcyA6IF9tYXg7XG5cbiAgICB2YXIgX3ByZXZlbnRlZE9mZnNldCA9IHRldGhlciAmJiBpc09yaWdpblNpZGUgPyB3aXRoaW5NYXhDbGFtcChfdGV0aGVyTWluLCBfb2Zmc2V0LCBfdGV0aGVyTWF4KSA6IHdpdGhpbih0ZXRoZXIgPyBfdGV0aGVyTWluIDogX21pbiwgX29mZnNldCwgdGV0aGVyID8gX3RldGhlck1heCA6IF9tYXgpO1xuXG4gICAgcG9wcGVyT2Zmc2V0c1thbHRBeGlzXSA9IF9wcmV2ZW50ZWRPZmZzZXQ7XG4gICAgZGF0YVthbHRBeGlzXSA9IF9wcmV2ZW50ZWRPZmZzZXQgLSBfb2Zmc2V0O1xuICB9XG5cbiAgc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXSA9IGRhdGE7XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdwcmV2ZW50T3ZlcmZsb3cnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ21haW4nLFxuICBmbjogcHJldmVudE92ZXJmbG93LFxuICByZXF1aXJlc0lmRXhpc3RzOiBbJ29mZnNldCddXG59OyIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldEhUTUxFbGVtZW50U2Nyb2xsKGVsZW1lbnQpIHtcbiAgcmV0dXJuIHtcbiAgICBzY3JvbGxMZWZ0OiBlbGVtZW50LnNjcm9sbExlZnQsXG4gICAgc2Nyb2xsVG9wOiBlbGVtZW50LnNjcm9sbFRvcFxuICB9O1xufSIsImltcG9ydCBnZXRXaW5kb3dTY3JvbGwgZnJvbSBcIi4vZ2V0V2luZG93U2Nyb2xsLmpzXCI7XG5pbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuL2dldFdpbmRvdy5qc1wiO1xuaW1wb3J0IHsgaXNIVE1MRWxlbWVudCB9IGZyb20gXCIuL2luc3RhbmNlT2YuanNcIjtcbmltcG9ydCBnZXRIVE1MRWxlbWVudFNjcm9sbCBmcm9tIFwiLi9nZXRIVE1MRWxlbWVudFNjcm9sbC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0Tm9kZVNjcm9sbChub2RlKSB7XG4gIGlmIChub2RlID09PSBnZXRXaW5kb3cobm9kZSkgfHwgIWlzSFRNTEVsZW1lbnQobm9kZSkpIHtcbiAgICByZXR1cm4gZ2V0V2luZG93U2Nyb2xsKG5vZGUpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBnZXRIVE1MRWxlbWVudFNjcm9sbChub2RlKTtcbiAgfVxufSIsImltcG9ydCBnZXRCb3VuZGluZ0NsaWVudFJlY3QgZnJvbSBcIi4vZ2V0Qm91bmRpbmdDbGllbnRSZWN0LmpzXCI7XG5pbXBvcnQgZ2V0Tm9kZVNjcm9sbCBmcm9tIFwiLi9nZXROb2RlU2Nyb2xsLmpzXCI7XG5pbXBvcnQgZ2V0Tm9kZU5hbWUgZnJvbSBcIi4vZ2V0Tm9kZU5hbWUuanNcIjtcbmltcG9ydCB7IGlzSFRNTEVsZW1lbnQgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5pbXBvcnQgZ2V0V2luZG93U2Nyb2xsQmFyWCBmcm9tIFwiLi9nZXRXaW5kb3dTY3JvbGxCYXJYLmpzXCI7XG5pbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gXCIuL2dldERvY3VtZW50RWxlbWVudC5qc1wiO1xuaW1wb3J0IGlzU2Nyb2xsUGFyZW50IGZyb20gXCIuL2lzU2Nyb2xsUGFyZW50LmpzXCI7XG5pbXBvcnQgeyByb3VuZCB9IGZyb20gXCIuLi91dGlscy9tYXRoLmpzXCI7XG5cbmZ1bmN0aW9uIGlzRWxlbWVudFNjYWxlZChlbGVtZW50KSB7XG4gIHZhciByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgdmFyIHNjYWxlWCA9IHJvdW5kKHJlY3Qud2lkdGgpIC8gZWxlbWVudC5vZmZzZXRXaWR0aCB8fCAxO1xuICB2YXIgc2NhbGVZID0gcm91bmQocmVjdC5oZWlnaHQpIC8gZWxlbWVudC5vZmZzZXRIZWlnaHQgfHwgMTtcbiAgcmV0dXJuIHNjYWxlWCAhPT0gMSB8fCBzY2FsZVkgIT09IDE7XG59IC8vIFJldHVybnMgdGhlIGNvbXBvc2l0ZSByZWN0IG9mIGFuIGVsZW1lbnQgcmVsYXRpdmUgdG8gaXRzIG9mZnNldFBhcmVudC5cbi8vIENvbXBvc2l0ZSBtZWFucyBpdCB0YWtlcyBpbnRvIGFjY291bnQgdHJhbnNmb3JtcyBhcyB3ZWxsIGFzIGxheW91dC5cblxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRDb21wb3NpdGVSZWN0KGVsZW1lbnRPclZpcnR1YWxFbGVtZW50LCBvZmZzZXRQYXJlbnQsIGlzRml4ZWQpIHtcbiAgaWYgKGlzRml4ZWQgPT09IHZvaWQgMCkge1xuICAgIGlzRml4ZWQgPSBmYWxzZTtcbiAgfVxuXG4gIHZhciBpc09mZnNldFBhcmVudEFuRWxlbWVudCA9IGlzSFRNTEVsZW1lbnQob2Zmc2V0UGFyZW50KTtcbiAgdmFyIG9mZnNldFBhcmVudElzU2NhbGVkID0gaXNIVE1MRWxlbWVudChvZmZzZXRQYXJlbnQpICYmIGlzRWxlbWVudFNjYWxlZChvZmZzZXRQYXJlbnQpO1xuICB2YXIgZG9jdW1lbnRFbGVtZW50ID0gZ2V0RG9jdW1lbnRFbGVtZW50KG9mZnNldFBhcmVudCk7XG4gIHZhciByZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KGVsZW1lbnRPclZpcnR1YWxFbGVtZW50LCBvZmZzZXRQYXJlbnRJc1NjYWxlZCwgaXNGaXhlZCk7XG4gIHZhciBzY3JvbGwgPSB7XG4gICAgc2Nyb2xsTGVmdDogMCxcbiAgICBzY3JvbGxUb3A6IDBcbiAgfTtcbiAgdmFyIG9mZnNldHMgPSB7XG4gICAgeDogMCxcbiAgICB5OiAwXG4gIH07XG5cbiAgaWYgKGlzT2Zmc2V0UGFyZW50QW5FbGVtZW50IHx8ICFpc09mZnNldFBhcmVudEFuRWxlbWVudCAmJiAhaXNGaXhlZCkge1xuICAgIGlmIChnZXROb2RlTmFtZShvZmZzZXRQYXJlbnQpICE9PSAnYm9keScgfHwgLy8gaHR0cHM6Ly9naXRodWIuY29tL3BvcHBlcmpzL3BvcHBlci1jb3JlL2lzc3Vlcy8xMDc4XG4gICAgaXNTY3JvbGxQYXJlbnQoZG9jdW1lbnRFbGVtZW50KSkge1xuICAgICAgc2Nyb2xsID0gZ2V0Tm9kZVNjcm9sbChvZmZzZXRQYXJlbnQpO1xuICAgIH1cblxuICAgIGlmIChpc0hUTUxFbGVtZW50KG9mZnNldFBhcmVudCkpIHtcbiAgICAgIG9mZnNldHMgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3Qob2Zmc2V0UGFyZW50LCB0cnVlKTtcbiAgICAgIG9mZnNldHMueCArPSBvZmZzZXRQYXJlbnQuY2xpZW50TGVmdDtcbiAgICAgIG9mZnNldHMueSArPSBvZmZzZXRQYXJlbnQuY2xpZW50VG9wO1xuICAgIH0gZWxzZSBpZiAoZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgICBvZmZzZXRzLnggPSBnZXRXaW5kb3dTY3JvbGxCYXJYKGRvY3VtZW50RWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB4OiByZWN0LmxlZnQgKyBzY3JvbGwuc2Nyb2xsTGVmdCAtIG9mZnNldHMueCxcbiAgICB5OiByZWN0LnRvcCArIHNjcm9sbC5zY3JvbGxUb3AgLSBvZmZzZXRzLnksXG4gICAgd2lkdGg6IHJlY3Qud2lkdGgsXG4gICAgaGVpZ2h0OiByZWN0LmhlaWdodFxuICB9O1xufSIsImltcG9ydCB7IG1vZGlmaWVyUGhhc2VzIH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7IC8vIHNvdXJjZTogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNDk4NzUyNTVcblxuZnVuY3Rpb24gb3JkZXIobW9kaWZpZXJzKSB7XG4gIHZhciBtYXAgPSBuZXcgTWFwKCk7XG4gIHZhciB2aXNpdGVkID0gbmV3IFNldCgpO1xuICB2YXIgcmVzdWx0ID0gW107XG4gIG1vZGlmaWVycy5mb3JFYWNoKGZ1bmN0aW9uIChtb2RpZmllcikge1xuICAgIG1hcC5zZXQobW9kaWZpZXIubmFtZSwgbW9kaWZpZXIpO1xuICB9KTsgLy8gT24gdmlzaXRpbmcgb2JqZWN0LCBjaGVjayBmb3IgaXRzIGRlcGVuZGVuY2llcyBhbmQgdmlzaXQgdGhlbSByZWN1cnNpdmVseVxuXG4gIGZ1bmN0aW9uIHNvcnQobW9kaWZpZXIpIHtcbiAgICB2aXNpdGVkLmFkZChtb2RpZmllci5uYW1lKTtcbiAgICB2YXIgcmVxdWlyZXMgPSBbXS5jb25jYXQobW9kaWZpZXIucmVxdWlyZXMgfHwgW10sIG1vZGlmaWVyLnJlcXVpcmVzSWZFeGlzdHMgfHwgW10pO1xuICAgIHJlcXVpcmVzLmZvckVhY2goZnVuY3Rpb24gKGRlcCkge1xuICAgICAgaWYgKCF2aXNpdGVkLmhhcyhkZXApKSB7XG4gICAgICAgIHZhciBkZXBNb2RpZmllciA9IG1hcC5nZXQoZGVwKTtcblxuICAgICAgICBpZiAoZGVwTW9kaWZpZXIpIHtcbiAgICAgICAgICBzb3J0KGRlcE1vZGlmaWVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJlc3VsdC5wdXNoKG1vZGlmaWVyKTtcbiAgfVxuXG4gIG1vZGlmaWVycy5mb3JFYWNoKGZ1bmN0aW9uIChtb2RpZmllcikge1xuICAgIGlmICghdmlzaXRlZC5oYXMobW9kaWZpZXIubmFtZSkpIHtcbiAgICAgIC8vIGNoZWNrIGZvciB2aXNpdGVkIG9iamVjdFxuICAgICAgc29ydChtb2RpZmllcik7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gb3JkZXJNb2RpZmllcnMobW9kaWZpZXJzKSB7XG4gIC8vIG9yZGVyIGJhc2VkIG9uIGRlcGVuZGVuY2llc1xuICB2YXIgb3JkZXJlZE1vZGlmaWVycyA9IG9yZGVyKG1vZGlmaWVycyk7IC8vIG9yZGVyIGJhc2VkIG9uIHBoYXNlXG5cbiAgcmV0dXJuIG1vZGlmaWVyUGhhc2VzLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBwaGFzZSkge1xuICAgIHJldHVybiBhY2MuY29uY2F0KG9yZGVyZWRNb2RpZmllcnMuZmlsdGVyKGZ1bmN0aW9uIChtb2RpZmllcikge1xuICAgICAgcmV0dXJuIG1vZGlmaWVyLnBoYXNlID09PSBwaGFzZTtcbiAgICB9KSk7XG4gIH0sIFtdKTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkZWJvdW5jZShmbikge1xuICB2YXIgcGVuZGluZztcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXBlbmRpbmcpIHtcbiAgICAgIHBlbmRpbmcgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBwZW5kaW5nID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHJlc29sdmUoZm4oKSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBlbmRpbmc7XG4gIH07XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbWVyZ2VCeU5hbWUobW9kaWZpZXJzKSB7XG4gIHZhciBtZXJnZWQgPSBtb2RpZmllcnMucmVkdWNlKGZ1bmN0aW9uIChtZXJnZWQsIGN1cnJlbnQpIHtcbiAgICB2YXIgZXhpc3RpbmcgPSBtZXJnZWRbY3VycmVudC5uYW1lXTtcbiAgICBtZXJnZWRbY3VycmVudC5uYW1lXSA9IGV4aXN0aW5nID8gT2JqZWN0LmFzc2lnbih7fSwgZXhpc3RpbmcsIGN1cnJlbnQsIHtcbiAgICAgIG9wdGlvbnM6IE9iamVjdC5hc3NpZ24oe30sIGV4aXN0aW5nLm9wdGlvbnMsIGN1cnJlbnQub3B0aW9ucyksXG4gICAgICBkYXRhOiBPYmplY3QuYXNzaWduKHt9LCBleGlzdGluZy5kYXRhLCBjdXJyZW50LmRhdGEpXG4gICAgfSkgOiBjdXJyZW50O1xuICAgIHJldHVybiBtZXJnZWQ7XG4gIH0sIHt9KTsgLy8gSUUxMSBkb2VzIG5vdCBzdXBwb3J0IE9iamVjdC52YWx1ZXNcblxuICByZXR1cm4gT2JqZWN0LmtleXMobWVyZ2VkKS5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiBtZXJnZWRba2V5XTtcbiAgfSk7XG59IiwiaW1wb3J0IGdldENvbXBvc2l0ZVJlY3QgZnJvbSBcIi4vZG9tLXV0aWxzL2dldENvbXBvc2l0ZVJlY3QuanNcIjtcbmltcG9ydCBnZXRMYXlvdXRSZWN0IGZyb20gXCIuL2RvbS11dGlscy9nZXRMYXlvdXRSZWN0LmpzXCI7XG5pbXBvcnQgbGlzdFNjcm9sbFBhcmVudHMgZnJvbSBcIi4vZG9tLXV0aWxzL2xpc3RTY3JvbGxQYXJlbnRzLmpzXCI7XG5pbXBvcnQgZ2V0T2Zmc2V0UGFyZW50IGZyb20gXCIuL2RvbS11dGlscy9nZXRPZmZzZXRQYXJlbnQuanNcIjtcbmltcG9ydCBvcmRlck1vZGlmaWVycyBmcm9tIFwiLi91dGlscy9vcmRlck1vZGlmaWVycy5qc1wiO1xuaW1wb3J0IGRlYm91bmNlIGZyb20gXCIuL3V0aWxzL2RlYm91bmNlLmpzXCI7XG5pbXBvcnQgbWVyZ2VCeU5hbWUgZnJvbSBcIi4vdXRpbHMvbWVyZ2VCeU5hbWUuanNcIjtcbmltcG9ydCBkZXRlY3RPdmVyZmxvdyBmcm9tIFwiLi91dGlscy9kZXRlY3RPdmVyZmxvdy5qc1wiO1xuaW1wb3J0IHsgaXNFbGVtZW50IH0gZnJvbSBcIi4vZG9tLXV0aWxzL2luc3RhbmNlT2YuanNcIjtcbnZhciBERUZBVUxUX09QVElPTlMgPSB7XG4gIHBsYWNlbWVudDogJ2JvdHRvbScsXG4gIG1vZGlmaWVyczogW10sXG4gIHN0cmF0ZWd5OiAnYWJzb2x1dGUnXG59O1xuXG5mdW5jdGlvbiBhcmVWYWxpZEVsZW1lbnRzKCkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICB9XG5cbiAgcmV0dXJuICFhcmdzLnNvbWUoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICByZXR1cm4gIShlbGVtZW50ICYmIHR5cGVvZiBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCA9PT0gJ2Z1bmN0aW9uJyk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcG9wcGVyR2VuZXJhdG9yKGdlbmVyYXRvck9wdGlvbnMpIHtcbiAgaWYgKGdlbmVyYXRvck9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIGdlbmVyYXRvck9wdGlvbnMgPSB7fTtcbiAgfVxuXG4gIHZhciBfZ2VuZXJhdG9yT3B0aW9ucyA9IGdlbmVyYXRvck9wdGlvbnMsXG4gICAgICBfZ2VuZXJhdG9yT3B0aW9ucyRkZWYgPSBfZ2VuZXJhdG9yT3B0aW9ucy5kZWZhdWx0TW9kaWZpZXJzLFxuICAgICAgZGVmYXVsdE1vZGlmaWVycyA9IF9nZW5lcmF0b3JPcHRpb25zJGRlZiA9PT0gdm9pZCAwID8gW10gOiBfZ2VuZXJhdG9yT3B0aW9ucyRkZWYsXG4gICAgICBfZ2VuZXJhdG9yT3B0aW9ucyRkZWYyID0gX2dlbmVyYXRvck9wdGlvbnMuZGVmYXVsdE9wdGlvbnMsXG4gICAgICBkZWZhdWx0T3B0aW9ucyA9IF9nZW5lcmF0b3JPcHRpb25zJGRlZjIgPT09IHZvaWQgMCA/IERFRkFVTFRfT1BUSU9OUyA6IF9nZW5lcmF0b3JPcHRpb25zJGRlZjI7XG4gIHJldHVybiBmdW5jdGlvbiBjcmVhdGVQb3BwZXIocmVmZXJlbmNlLCBwb3BwZXIsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRpb25zID0gZGVmYXVsdE9wdGlvbnM7XG4gICAgfVxuXG4gICAgdmFyIHN0YXRlID0ge1xuICAgICAgcGxhY2VtZW50OiAnYm90dG9tJyxcbiAgICAgIG9yZGVyZWRNb2RpZmllcnM6IFtdLFxuICAgICAgb3B0aW9uczogT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9PUFRJT05TLCBkZWZhdWx0T3B0aW9ucyksXG4gICAgICBtb2RpZmllcnNEYXRhOiB7fSxcbiAgICAgIGVsZW1lbnRzOiB7XG4gICAgICAgIHJlZmVyZW5jZTogcmVmZXJlbmNlLFxuICAgICAgICBwb3BwZXI6IHBvcHBlclxuICAgICAgfSxcbiAgICAgIGF0dHJpYnV0ZXM6IHt9LFxuICAgICAgc3R5bGVzOiB7fVxuICAgIH07XG4gICAgdmFyIGVmZmVjdENsZWFudXBGbnMgPSBbXTtcbiAgICB2YXIgaXNEZXN0cm95ZWQgPSBmYWxzZTtcbiAgICB2YXIgaW5zdGFuY2UgPSB7XG4gICAgICBzdGF0ZTogc3RhdGUsXG4gICAgICBzZXRPcHRpb25zOiBmdW5jdGlvbiBzZXRPcHRpb25zKHNldE9wdGlvbnNBY3Rpb24pIHtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSB0eXBlb2Ygc2V0T3B0aW9uc0FjdGlvbiA9PT0gJ2Z1bmN0aW9uJyA/IHNldE9wdGlvbnNBY3Rpb24oc3RhdGUub3B0aW9ucykgOiBzZXRPcHRpb25zQWN0aW9uO1xuICAgICAgICBjbGVhbnVwTW9kaWZpZXJFZmZlY3RzKCk7XG4gICAgICAgIHN0YXRlLm9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0T3B0aW9ucywgc3RhdGUub3B0aW9ucywgb3B0aW9ucyk7XG4gICAgICAgIHN0YXRlLnNjcm9sbFBhcmVudHMgPSB7XG4gICAgICAgICAgcmVmZXJlbmNlOiBpc0VsZW1lbnQocmVmZXJlbmNlKSA/IGxpc3RTY3JvbGxQYXJlbnRzKHJlZmVyZW5jZSkgOiByZWZlcmVuY2UuY29udGV4dEVsZW1lbnQgPyBsaXN0U2Nyb2xsUGFyZW50cyhyZWZlcmVuY2UuY29udGV4dEVsZW1lbnQpIDogW10sXG4gICAgICAgICAgcG9wcGVyOiBsaXN0U2Nyb2xsUGFyZW50cyhwb3BwZXIpXG4gICAgICAgIH07IC8vIE9yZGVycyB0aGUgbW9kaWZpZXJzIGJhc2VkIG9uIHRoZWlyIGRlcGVuZGVuY2llcyBhbmQgYHBoYXNlYFxuICAgICAgICAvLyBwcm9wZXJ0aWVzXG5cbiAgICAgICAgdmFyIG9yZGVyZWRNb2RpZmllcnMgPSBvcmRlck1vZGlmaWVycyhtZXJnZUJ5TmFtZShbXS5jb25jYXQoZGVmYXVsdE1vZGlmaWVycywgc3RhdGUub3B0aW9ucy5tb2RpZmllcnMpKSk7IC8vIFN0cmlwIG91dCBkaXNhYmxlZCBtb2RpZmllcnNcblxuICAgICAgICBzdGF0ZS5vcmRlcmVkTW9kaWZpZXJzID0gb3JkZXJlZE1vZGlmaWVycy5maWx0ZXIoZnVuY3Rpb24gKG0pIHtcbiAgICAgICAgICByZXR1cm4gbS5lbmFibGVkO1xuICAgICAgICB9KTtcbiAgICAgICAgcnVuTW9kaWZpZXJFZmZlY3RzKCk7XG4gICAgICAgIHJldHVybiBpbnN0YW5jZS51cGRhdGUoKTtcbiAgICAgIH0sXG4gICAgICAvLyBTeW5jIHVwZGF0ZSDigJMgaXQgd2lsbCBhbHdheXMgYmUgZXhlY3V0ZWQsIGV2ZW4gaWYgbm90IG5lY2Vzc2FyeS4gVGhpc1xuICAgICAgLy8gaXMgdXNlZnVsIGZvciBsb3cgZnJlcXVlbmN5IHVwZGF0ZXMgd2hlcmUgc3luYyBiZWhhdmlvciBzaW1wbGlmaWVzIHRoZVxuICAgICAgLy8gbG9naWMuXG4gICAgICAvLyBGb3IgaGlnaCBmcmVxdWVuY3kgdXBkYXRlcyAoZS5nLiBgcmVzaXplYCBhbmQgYHNjcm9sbGAgZXZlbnRzKSwgYWx3YXlzXG4gICAgICAvLyBwcmVmZXIgdGhlIGFzeW5jIFBvcHBlciN1cGRhdGUgbWV0aG9kXG4gICAgICBmb3JjZVVwZGF0ZTogZnVuY3Rpb24gZm9yY2VVcGRhdGUoKSB7XG4gICAgICAgIGlmIChpc0Rlc3Ryb3llZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBfc3RhdGUkZWxlbWVudHMgPSBzdGF0ZS5lbGVtZW50cyxcbiAgICAgICAgICAgIHJlZmVyZW5jZSA9IF9zdGF0ZSRlbGVtZW50cy5yZWZlcmVuY2UsXG4gICAgICAgICAgICBwb3BwZXIgPSBfc3RhdGUkZWxlbWVudHMucG9wcGVyOyAvLyBEb24ndCBwcm9jZWVkIGlmIGByZWZlcmVuY2VgIG9yIGBwb3BwZXJgIGFyZSBub3QgdmFsaWQgZWxlbWVudHNcbiAgICAgICAgLy8gYW55bW9yZVxuXG4gICAgICAgIGlmICghYXJlVmFsaWRFbGVtZW50cyhyZWZlcmVuY2UsIHBvcHBlcikpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gLy8gU3RvcmUgdGhlIHJlZmVyZW5jZSBhbmQgcG9wcGVyIHJlY3RzIHRvIGJlIHJlYWQgYnkgbW9kaWZpZXJzXG5cblxuICAgICAgICBzdGF0ZS5yZWN0cyA9IHtcbiAgICAgICAgICByZWZlcmVuY2U6IGdldENvbXBvc2l0ZVJlY3QocmVmZXJlbmNlLCBnZXRPZmZzZXRQYXJlbnQocG9wcGVyKSwgc3RhdGUub3B0aW9ucy5zdHJhdGVneSA9PT0gJ2ZpeGVkJyksXG4gICAgICAgICAgcG9wcGVyOiBnZXRMYXlvdXRSZWN0KHBvcHBlcilcbiAgICAgICAgfTsgLy8gTW9kaWZpZXJzIGhhdmUgdGhlIGFiaWxpdHkgdG8gcmVzZXQgdGhlIGN1cnJlbnQgdXBkYXRlIGN5Y2xlLiBUaGVcbiAgICAgICAgLy8gbW9zdCBjb21tb24gdXNlIGNhc2UgZm9yIHRoaXMgaXMgdGhlIGBmbGlwYCBtb2RpZmllciBjaGFuZ2luZyB0aGVcbiAgICAgICAgLy8gcGxhY2VtZW50LCB3aGljaCB0aGVuIG5lZWRzIHRvIHJlLXJ1biBhbGwgdGhlIG1vZGlmaWVycywgYmVjYXVzZSB0aGVcbiAgICAgICAgLy8gbG9naWMgd2FzIHByZXZpb3VzbHkgcmFuIGZvciB0aGUgcHJldmlvdXMgcGxhY2VtZW50IGFuZCBpcyB0aGVyZWZvcmVcbiAgICAgICAgLy8gc3RhbGUvaW5jb3JyZWN0XG5cbiAgICAgICAgc3RhdGUucmVzZXQgPSBmYWxzZTtcbiAgICAgICAgc3RhdGUucGxhY2VtZW50ID0gc3RhdGUub3B0aW9ucy5wbGFjZW1lbnQ7IC8vIE9uIGVhY2ggdXBkYXRlIGN5Y2xlLCB0aGUgYG1vZGlmaWVyc0RhdGFgIHByb3BlcnR5IGZvciBlYWNoIG1vZGlmaWVyXG4gICAgICAgIC8vIGlzIGZpbGxlZCB3aXRoIHRoZSBpbml0aWFsIGRhdGEgc3BlY2lmaWVkIGJ5IHRoZSBtb2RpZmllci4gVGhpcyBtZWFuc1xuICAgICAgICAvLyBpdCBkb2Vzbid0IHBlcnNpc3QgYW5kIGlzIGZyZXNoIG9uIGVhY2ggdXBkYXRlLlxuICAgICAgICAvLyBUbyBlbnN1cmUgcGVyc2lzdGVudCBkYXRhLCB1c2UgYCR7bmFtZX0jcGVyc2lzdGVudGBcblxuICAgICAgICBzdGF0ZS5vcmRlcmVkTW9kaWZpZXJzLmZvckVhY2goZnVuY3Rpb24gKG1vZGlmaWVyKSB7XG4gICAgICAgICAgcmV0dXJuIHN0YXRlLm1vZGlmaWVyc0RhdGFbbW9kaWZpZXIubmFtZV0gPSBPYmplY3QuYXNzaWduKHt9LCBtb2RpZmllci5kYXRhKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IHN0YXRlLm9yZGVyZWRNb2RpZmllcnMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgaWYgKHN0YXRlLnJlc2V0ID09PSB0cnVlKSB7XG4gICAgICAgICAgICBzdGF0ZS5yZXNldCA9IGZhbHNlO1xuICAgICAgICAgICAgaW5kZXggPSAtMTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBfc3RhdGUkb3JkZXJlZE1vZGlmaWUgPSBzdGF0ZS5vcmRlcmVkTW9kaWZpZXJzW2luZGV4XSxcbiAgICAgICAgICAgICAgZm4gPSBfc3RhdGUkb3JkZXJlZE1vZGlmaWUuZm4sXG4gICAgICAgICAgICAgIF9zdGF0ZSRvcmRlcmVkTW9kaWZpZTIgPSBfc3RhdGUkb3JkZXJlZE1vZGlmaWUub3B0aW9ucyxcbiAgICAgICAgICAgICAgX29wdGlvbnMgPSBfc3RhdGUkb3JkZXJlZE1vZGlmaWUyID09PSB2b2lkIDAgPyB7fSA6IF9zdGF0ZSRvcmRlcmVkTW9kaWZpZTIsXG4gICAgICAgICAgICAgIG5hbWUgPSBfc3RhdGUkb3JkZXJlZE1vZGlmaWUubmFtZTtcblxuICAgICAgICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHN0YXRlID0gZm4oe1xuICAgICAgICAgICAgICBzdGF0ZTogc3RhdGUsXG4gICAgICAgICAgICAgIG9wdGlvbnM6IF9vcHRpb25zLFxuICAgICAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgICAgICBpbnN0YW5jZTogaW5zdGFuY2VcbiAgICAgICAgICAgIH0pIHx8IHN0YXRlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vIEFzeW5jIGFuZCBvcHRpbWlzdGljYWxseSBvcHRpbWl6ZWQgdXBkYXRlIOKAkyBpdCB3aWxsIG5vdCBiZSBleGVjdXRlZCBpZlxuICAgICAgLy8gbm90IG5lY2Vzc2FyeSAoZGVib3VuY2VkIHRvIHJ1biBhdCBtb3N0IG9uY2UtcGVyLXRpY2spXG4gICAgICB1cGRhdGU6IGRlYm91bmNlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgICAgaW5zdGFuY2UuZm9yY2VVcGRhdGUoKTtcbiAgICAgICAgICByZXNvbHZlKHN0YXRlKTtcbiAgICAgICAgfSk7XG4gICAgICB9KSxcbiAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgICAgIGNsZWFudXBNb2RpZmllckVmZmVjdHMoKTtcbiAgICAgICAgaXNEZXN0cm95ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAoIWFyZVZhbGlkRWxlbWVudHMocmVmZXJlbmNlLCBwb3BwZXIpKSB7XG4gICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgfVxuXG4gICAgaW5zdGFuY2Uuc2V0T3B0aW9ucyhvcHRpb25zKS50aGVuKGZ1bmN0aW9uIChzdGF0ZSkge1xuICAgICAgaWYgKCFpc0Rlc3Ryb3llZCAmJiBvcHRpb25zLm9uRmlyc3RVcGRhdGUpIHtcbiAgICAgICAgb3B0aW9ucy5vbkZpcnN0VXBkYXRlKHN0YXRlKTtcbiAgICAgIH1cbiAgICB9KTsgLy8gTW9kaWZpZXJzIGhhdmUgdGhlIGFiaWxpdHkgdG8gZXhlY3V0ZSBhcmJpdHJhcnkgY29kZSBiZWZvcmUgdGhlIGZpcnN0XG4gICAgLy8gdXBkYXRlIGN5Y2xlIHJ1bnMuIFRoZXkgd2lsbCBiZSBleGVjdXRlZCBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGUgdXBkYXRlXG4gICAgLy8gY3ljbGUuIFRoaXMgaXMgdXNlZnVsIHdoZW4gYSBtb2RpZmllciBhZGRzIHNvbWUgcGVyc2lzdGVudCBkYXRhIHRoYXRcbiAgICAvLyBvdGhlciBtb2RpZmllcnMgbmVlZCB0byB1c2UsIGJ1dCB0aGUgbW9kaWZpZXIgaXMgcnVuIGFmdGVyIHRoZSBkZXBlbmRlbnRcbiAgICAvLyBvbmUuXG5cbiAgICBmdW5jdGlvbiBydW5Nb2RpZmllckVmZmVjdHMoKSB7XG4gICAgICBzdGF0ZS5vcmRlcmVkTW9kaWZpZXJzLmZvckVhY2goZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgICAgdmFyIG5hbWUgPSBfcmVmLm5hbWUsXG4gICAgICAgICAgICBfcmVmJG9wdGlvbnMgPSBfcmVmLm9wdGlvbnMsXG4gICAgICAgICAgICBvcHRpb25zID0gX3JlZiRvcHRpb25zID09PSB2b2lkIDAgPyB7fSA6IF9yZWYkb3B0aW9ucyxcbiAgICAgICAgICAgIGVmZmVjdCA9IF9yZWYuZWZmZWN0O1xuXG4gICAgICAgIGlmICh0eXBlb2YgZWZmZWN0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgdmFyIGNsZWFudXBGbiA9IGVmZmVjdCh7XG4gICAgICAgICAgICBzdGF0ZTogc3RhdGUsXG4gICAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgICAgaW5zdGFuY2U6IGluc3RhbmNlLFxuICAgICAgICAgICAgb3B0aW9uczogb3B0aW9uc1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgdmFyIG5vb3BGbiA9IGZ1bmN0aW9uIG5vb3BGbigpIHt9O1xuXG4gICAgICAgICAgZWZmZWN0Q2xlYW51cEZucy5wdXNoKGNsZWFudXBGbiB8fCBub29wRm4pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjbGVhbnVwTW9kaWZpZXJFZmZlY3RzKCkge1xuICAgICAgZWZmZWN0Q2xlYW51cEZucy5mb3JFYWNoKGZ1bmN0aW9uIChmbikge1xuICAgICAgICByZXR1cm4gZm4oKTtcbiAgICAgIH0pO1xuICAgICAgZWZmZWN0Q2xlYW51cEZucyA9IFtdO1xuICAgIH1cblxuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfTtcbn1cbmV4cG9ydCB2YXIgY3JlYXRlUG9wcGVyID0gLyojX19QVVJFX18qL3BvcHBlckdlbmVyYXRvcigpOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbmV4cG9ydCB7IGRldGVjdE92ZXJmbG93IH07IiwiaW1wb3J0IGFycm93IGZyb20gJ0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvYXJyb3cnO1xuaW1wb3J0IGNvbXB1dGVTdHlsZXMgZnJvbSAnQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9jb21wdXRlU3R5bGVzJztcbmltcG9ydCBldmVudExpc3RlbmVycyBmcm9tICdAcG9wcGVyanMvY29yZS9saWIvbW9kaWZpZXJzL2V2ZW50TGlzdGVuZXJzJztcbmltcG9ydCBmbGlwIGZyb20gJ0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvZmxpcCc7XG5pbXBvcnQgaGlkZSBmcm9tICdAcG9wcGVyanMvY29yZS9saWIvbW9kaWZpZXJzL2hpZGUnO1xuaW1wb3J0IG9mZnNldCBmcm9tICdAcG9wcGVyanMvY29yZS9saWIvbW9kaWZpZXJzL29mZnNldCc7XG5pbXBvcnQgcG9wcGVyT2Zmc2V0cyBmcm9tICdAcG9wcGVyanMvY29yZS9saWIvbW9kaWZpZXJzL3BvcHBlck9mZnNldHMnO1xuaW1wb3J0IHByZXZlbnRPdmVyZmxvdyBmcm9tICdAcG9wcGVyanMvY29yZS9saWIvbW9kaWZpZXJzL3ByZXZlbnRPdmVyZmxvdyc7XG5pbXBvcnQgeyBwbGFjZW1lbnRzIH0gZnJvbSAnQHBvcHBlcmpzL2NvcmUvbGliL2VudW1zJztcbmltcG9ydCB7IHBvcHBlckdlbmVyYXRvciB9IGZyb20gJ0Bwb3BwZXJqcy9jb3JlL2xpYi9wb3BwZXItYmFzZSc7XG5cbi8vIEZvciB0aGUgY29tbW9uIEpTIGJ1aWxkIHdlIHdpbGwgdHVybiB0aGlzIGZpbGUgaW50byBhIGJ1bmRsZSB3aXRoIG5vIGltcG9ydHMuXG4vLyBUaGlzIGlzIGIvYyB0aGUgUG9wcGVyIGxpYiBpcyBhbGwgZXNtIGZpbGVzLCBhbmQgd291bGQgYnJlYWsgaW4gYSBjb21tb24ganMgb25seSBlbnZpcm9ubWVudFxuZXhwb3J0IGNvbnN0IGNyZWF0ZVBvcHBlciA9IHBvcHBlckdlbmVyYXRvcih7XG4gIGRlZmF1bHRNb2RpZmllcnM6IFtoaWRlLCBwb3BwZXJPZmZzZXRzLCBjb21wdXRlU3R5bGVzLCBldmVudExpc3RlbmVycywgb2Zmc2V0LCBmbGlwLCBwcmV2ZW50T3ZlcmZsb3csIGFycm93XVxufSk7XG5leHBvcnQgeyBwbGFjZW1lbnRzIH07IiwiY29uc3QgX2V4Y2x1ZGVkID0gW1wiZW5hYmxlZFwiLCBcInBsYWNlbWVudFwiLCBcInN0cmF0ZWd5XCIsIFwibW9kaWZpZXJzXCJdO1xuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCkgeyBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTsgdmFyIHRhcmdldCA9IHt9OyB2YXIgc291cmNlS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7IHZhciBrZXksIGk7IGZvciAoaSA9IDA7IGkgPCBzb3VyY2VLZXlzLmxlbmd0aDsgaSsrKSB7IGtleSA9IHNvdXJjZUtleXNbaV07IGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gcmV0dXJuIHRhcmdldDsgfVxuaW1wb3J0IHsgdXNlQ2FsbGJhY2ssIHVzZUVmZmVjdCwgdXNlTWVtbywgdXNlUmVmLCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGRlcXVhbCB9IGZyb20gJ2RlcXVhbCc7XG5pbXBvcnQgdXNlU2FmZVN0YXRlIGZyb20gJ0ByZXN0YXJ0L2hvb2tzL3VzZVNhZmVTdGF0ZSc7XG5pbXBvcnQgeyBjcmVhdGVQb3BwZXIgfSBmcm9tICcuL3BvcHBlcic7XG5jb25zdCBkaXNhYmxlZEFwcGx5U3R5bGVzTW9kaWZpZXIgPSB7XG4gIG5hbWU6ICdhcHBseVN0eWxlcycsXG4gIGVuYWJsZWQ6IGZhbHNlLFxuICBwaGFzZTogJ2FmdGVyV3JpdGUnLFxuICBmbjogKCkgPT4gdW5kZWZpbmVkXG59O1xuXG4vLyB1bnRpbCBkb2NqcyBzdXBwb3J0cyB0eXBlIGV4cG9ydHMuLi5cblxuY29uc3QgYXJpYURlc2NyaWJlZEJ5TW9kaWZpZXIgPSB7XG4gIG5hbWU6ICdhcmlhRGVzY3JpYmVkQnknLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ2FmdGVyV3JpdGUnLFxuICBlZmZlY3Q6ICh7XG4gICAgc3RhdGVcbiAgfSkgPT4gKCkgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIHJlZmVyZW5jZSxcbiAgICAgIHBvcHBlclxuICAgIH0gPSBzdGF0ZS5lbGVtZW50cztcbiAgICBpZiAoJ3JlbW92ZUF0dHJpYnV0ZScgaW4gcmVmZXJlbmNlKSB7XG4gICAgICBjb25zdCBpZHMgPSAocmVmZXJlbmNlLmdldEF0dHJpYnV0ZSgnYXJpYS1kZXNjcmliZWRieScpIHx8ICcnKS5zcGxpdCgnLCcpLmZpbHRlcihpZCA9PiBpZC50cmltKCkgIT09IHBvcHBlci5pZCk7XG4gICAgICBpZiAoIWlkcy5sZW5ndGgpIHJlZmVyZW5jZS5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtZGVzY3JpYmVkYnknKTtlbHNlIHJlZmVyZW5jZS5zZXRBdHRyaWJ1dGUoJ2FyaWEtZGVzY3JpYmVkYnknLCBpZHMuam9pbignLCcpKTtcbiAgICB9XG4gIH0sXG4gIGZuOiAoe1xuICAgIHN0YXRlXG4gIH0pID0+IHtcbiAgICB2YXIgX3BvcHBlciRnZXRBdHRyaWJ1dGU7XG4gICAgY29uc3Qge1xuICAgICAgcG9wcGVyLFxuICAgICAgcmVmZXJlbmNlXG4gICAgfSA9IHN0YXRlLmVsZW1lbnRzO1xuICAgIGNvbnN0IHJvbGUgPSAoX3BvcHBlciRnZXRBdHRyaWJ1dGUgPSBwb3BwZXIuZ2V0QXR0cmlidXRlKCdyb2xlJykpID09IG51bGwgPyB2b2lkIDAgOiBfcG9wcGVyJGdldEF0dHJpYnV0ZS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChwb3BwZXIuaWQgJiYgcm9sZSA9PT0gJ3Rvb2x0aXAnICYmICdzZXRBdHRyaWJ1dGUnIGluIHJlZmVyZW5jZSkge1xuICAgICAgY29uc3QgaWRzID0gcmVmZXJlbmNlLmdldEF0dHJpYnV0ZSgnYXJpYS1kZXNjcmliZWRieScpO1xuICAgICAgaWYgKGlkcyAmJiBpZHMuc3BsaXQoJywnKS5pbmRleE9mKHBvcHBlci5pZCkgIT09IC0xKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHJlZmVyZW5jZS5zZXRBdHRyaWJ1dGUoJ2FyaWEtZGVzY3JpYmVkYnknLCBpZHMgPyBgJHtpZHN9LCR7cG9wcGVyLmlkfWAgOiBwb3BwZXIuaWQpO1xuICAgIH1cbiAgfVxufTtcbmNvbnN0IEVNUFRZX01PRElGSUVSUyA9IFtdO1xuLyoqXG4gKiBQb3NpdGlvbiBhbiBlbGVtZW50IHJlbGF0aXZlIHNvbWUgcmVmZXJlbmNlIGVsZW1lbnQgdXNpbmcgUG9wcGVyLmpzXG4gKlxuICogQHBhcmFtIHJlZmVyZW5jZUVsZW1lbnRcbiAqIEBwYXJhbSBwb3BwZXJFbGVtZW50XG4gKiBAcGFyYW0ge29iamVjdH0gICAgICBvcHRpb25zXG4gKiBAcGFyYW0ge29iamVjdD19ICAgICBvcHRpb25zLm1vZGlmaWVycyBQb3BwZXIuanMgbW9kaWZpZXJzXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSAgICBvcHRpb25zLmVuYWJsZWQgdG9nZ2xlIHRoZSBwb3BwZXIgZnVuY3Rpb25hbGl0eSBvbi9vZmZcbiAqIEBwYXJhbSB7c3RyaW5nPX0gICAgIG9wdGlvbnMucGxhY2VtZW50IFRoZSBwb3BwZXIgZWxlbWVudCBwbGFjZW1lbnQgcmVsYXRpdmUgdG8gdGhlIHJlZmVyZW5jZSBlbGVtZW50XG4gKiBAcGFyYW0ge3N0cmluZz19ICAgICBvcHRpb25zLnN0cmF0ZWd5IHRoZSBwb3NpdGlvbmluZyBzdHJhdGVneVxuICogQHBhcmFtIHtmdW5jdGlvbj19ICAgb3B0aW9ucy5vbkNyZWF0ZSBjYWxsZWQgd2hlbiB0aGUgcG9wcGVyIGlzIGNyZWF0ZWRcbiAqIEBwYXJhbSB7ZnVuY3Rpb249fSAgIG9wdGlvbnMub25VcGRhdGUgY2FsbGVkIHdoZW4gdGhlIHBvcHBlciBpcyB1cGRhdGVkXG4gKlxuICogQHJldHVybnMge1VzZVBvcHBlclN0YXRlfSBUaGUgcG9wcGVyIHN0YXRlXG4gKi9cbmZ1bmN0aW9uIHVzZVBvcHBlcihyZWZlcmVuY2VFbGVtZW50LCBwb3BwZXJFbGVtZW50LCBfcmVmID0ge30pIHtcbiAgbGV0IHtcbiAgICAgIGVuYWJsZWQgPSB0cnVlLFxuICAgICAgcGxhY2VtZW50ID0gJ2JvdHRvbScsXG4gICAgICBzdHJhdGVneSA9ICdhYnNvbHV0ZScsXG4gICAgICBtb2RpZmllcnMgPSBFTVBUWV9NT0RJRklFUlNcbiAgICB9ID0gX3JlZixcbiAgICBjb25maWcgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShfcmVmLCBfZXhjbHVkZWQpO1xuICBjb25zdCBwcmV2TW9kaWZpZXJzID0gdXNlUmVmKG1vZGlmaWVycyk7XG4gIGNvbnN0IHBvcHBlckluc3RhbmNlUmVmID0gdXNlUmVmKCk7XG4gIGNvbnN0IHVwZGF0ZSA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICB2YXIgX3BvcHBlckluc3RhbmNlUmVmJGN1O1xuICAgIChfcG9wcGVySW5zdGFuY2VSZWYkY3UgPSBwb3BwZXJJbnN0YW5jZVJlZi5jdXJyZW50KSA9PSBudWxsID8gdm9pZCAwIDogX3BvcHBlckluc3RhbmNlUmVmJGN1LnVwZGF0ZSgpO1xuICB9LCBbXSk7XG4gIGNvbnN0IGZvcmNlVXBkYXRlID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHZhciBfcG9wcGVySW5zdGFuY2VSZWYkY3UyO1xuICAgIChfcG9wcGVySW5zdGFuY2VSZWYkY3UyID0gcG9wcGVySW5zdGFuY2VSZWYuY3VycmVudCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9wb3BwZXJJbnN0YW5jZVJlZiRjdTIuZm9yY2VVcGRhdGUoKTtcbiAgfSwgW10pO1xuICBjb25zdCBbcG9wcGVyU3RhdGUsIHNldFN0YXRlXSA9IHVzZVNhZmVTdGF0ZSh1c2VTdGF0ZSh7XG4gICAgcGxhY2VtZW50LFxuICAgIHVwZGF0ZSxcbiAgICBmb3JjZVVwZGF0ZSxcbiAgICBhdHRyaWJ1dGVzOiB7fSxcbiAgICBzdHlsZXM6IHtcbiAgICAgIHBvcHBlcjoge30sXG4gICAgICBhcnJvdzoge31cbiAgICB9XG4gIH0pKTtcbiAgY29uc3QgdXBkYXRlTW9kaWZpZXIgPSB1c2VNZW1vKCgpID0+ICh7XG4gICAgbmFtZTogJ3VwZGF0ZVN0YXRlTW9kaWZpZXInLFxuICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgcGhhc2U6ICd3cml0ZScsXG4gICAgcmVxdWlyZXM6IFsnY29tcHV0ZVN0eWxlcyddLFxuICAgIGZuOiAoe1xuICAgICAgc3RhdGVcbiAgICB9KSA9PiB7XG4gICAgICBjb25zdCBzdHlsZXMgPSB7fTtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSB7fTtcbiAgICAgIE9iamVjdC5rZXlzKHN0YXRlLmVsZW1lbnRzKS5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICBzdHlsZXNbZWxlbWVudF0gPSBzdGF0ZS5zdHlsZXNbZWxlbWVudF07XG4gICAgICAgIGF0dHJpYnV0ZXNbZWxlbWVudF0gPSBzdGF0ZS5hdHRyaWJ1dGVzW2VsZW1lbnRdO1xuICAgICAgfSk7XG4gICAgICBzZXRTdGF0ZSh7XG4gICAgICAgIHN0YXRlLFxuICAgICAgICBzdHlsZXMsXG4gICAgICAgIGF0dHJpYnV0ZXMsXG4gICAgICAgIHVwZGF0ZSxcbiAgICAgICAgZm9yY2VVcGRhdGUsXG4gICAgICAgIHBsYWNlbWVudDogc3RhdGUucGxhY2VtZW50XG4gICAgICB9KTtcbiAgICB9XG4gIH0pLCBbdXBkYXRlLCBmb3JjZVVwZGF0ZSwgc2V0U3RhdGVdKTtcbiAgY29uc3QgbmV4dE1vZGlmaWVycyA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGlmICghZGVxdWFsKHByZXZNb2RpZmllcnMuY3VycmVudCwgbW9kaWZpZXJzKSkge1xuICAgICAgcHJldk1vZGlmaWVycy5jdXJyZW50ID0gbW9kaWZpZXJzO1xuICAgIH1cbiAgICByZXR1cm4gcHJldk1vZGlmaWVycy5jdXJyZW50O1xuICB9LCBbbW9kaWZpZXJzXSk7XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFwb3BwZXJJbnN0YW5jZVJlZi5jdXJyZW50IHx8ICFlbmFibGVkKSByZXR1cm47XG4gICAgcG9wcGVySW5zdGFuY2VSZWYuY3VycmVudC5zZXRPcHRpb25zKHtcbiAgICAgIHBsYWNlbWVudCxcbiAgICAgIHN0cmF0ZWd5LFxuICAgICAgbW9kaWZpZXJzOiBbLi4ubmV4dE1vZGlmaWVycywgdXBkYXRlTW9kaWZpZXIsIGRpc2FibGVkQXBwbHlTdHlsZXNNb2RpZmllcl1cbiAgICB9KTtcbiAgfSwgW3N0cmF0ZWd5LCBwbGFjZW1lbnQsIHVwZGF0ZU1vZGlmaWVyLCBlbmFibGVkLCBuZXh0TW9kaWZpZXJzXSk7XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFlbmFibGVkIHx8IHJlZmVyZW5jZUVsZW1lbnQgPT0gbnVsbCB8fCBwb3BwZXJFbGVtZW50ID09IG51bGwpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHBvcHBlckluc3RhbmNlUmVmLmN1cnJlbnQgPSBjcmVhdGVQb3BwZXIocmVmZXJlbmNlRWxlbWVudCwgcG9wcGVyRWxlbWVudCwgT2JqZWN0LmFzc2lnbih7fSwgY29uZmlnLCB7XG4gICAgICBwbGFjZW1lbnQsXG4gICAgICBzdHJhdGVneSxcbiAgICAgIG1vZGlmaWVyczogWy4uLm5leHRNb2RpZmllcnMsIGFyaWFEZXNjcmliZWRCeU1vZGlmaWVyLCB1cGRhdGVNb2RpZmllcl1cbiAgICB9KSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGlmIChwb3BwZXJJbnN0YW5jZVJlZi5jdXJyZW50ICE9IG51bGwpIHtcbiAgICAgICAgcG9wcGVySW5zdGFuY2VSZWYuY3VycmVudC5kZXN0cm95KCk7XG4gICAgICAgIHBvcHBlckluc3RhbmNlUmVmLmN1cnJlbnQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHNldFN0YXRlKHMgPT4gT2JqZWN0LmFzc2lnbih7fSwgcywge1xuICAgICAgICAgIGF0dHJpYnV0ZXM6IHt9LFxuICAgICAgICAgIHN0eWxlczoge1xuICAgICAgICAgICAgcG9wcGVyOiB7fVxuICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xuICAgICAgfVxuICAgIH07XG4gICAgLy8gVGhpcyBpcyBvbmx5IHJ1biBvbmNlIHRvIF9jcmVhdGVfIHRoZSBwb3BwZXJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gIH0sIFtlbmFibGVkLCByZWZlcmVuY2VFbGVtZW50LCBwb3BwZXJFbGVtZW50XSk7XG4gIHJldHVybiBwb3BwZXJTdGF0ZTtcbn1cbmV4cG9ydCBkZWZhdWx0IHVzZVBvcHBlcjsiLCJpbXBvcnQgY29udGFpbnMgZnJvbSAnZG9tLWhlbHBlcnMvY29udGFpbnMnO1xuaW1wb3J0IGxpc3RlbiBmcm9tICdkb20taGVscGVycy9saXN0ZW4nO1xuaW1wb3J0IG93bmVyRG9jdW1lbnQgZnJvbSAnZG9tLWhlbHBlcnMvb3duZXJEb2N1bWVudCc7XG5pbXBvcnQgeyB1c2VDYWxsYmFjaywgdXNlRWZmZWN0LCB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdXNlRXZlbnRDYWxsYmFjayBmcm9tICdAcmVzdGFydC9ob29rcy91c2VFdmVudENhbGxiYWNrJztcbmltcG9ydCB3YXJuaW5nIGZyb20gJ3dhcm5pbmcnO1xuY29uc3Qgbm9vcCA9ICgpID0+IHt9O1xuZnVuY3Rpb24gaXNMZWZ0Q2xpY2tFdmVudChldmVudCkge1xuICByZXR1cm4gZXZlbnQuYnV0dG9uID09PSAwO1xufVxuZnVuY3Rpb24gaXNNb2RpZmllZEV2ZW50KGV2ZW50KSB7XG4gIHJldHVybiAhIShldmVudC5tZXRhS2V5IHx8IGV2ZW50LmFsdEtleSB8fCBldmVudC5jdHJsS2V5IHx8IGV2ZW50LnNoaWZ0S2V5KTtcbn1cbmV4cG9ydCBjb25zdCBnZXRSZWZUYXJnZXQgPSByZWYgPT4gcmVmICYmICgnY3VycmVudCcgaW4gcmVmID8gcmVmLmN1cnJlbnQgOiByZWYpO1xuY29uc3QgSW5pdGlhbFRyaWdnZXJFdmVudHMgPSB7XG4gIGNsaWNrOiAnbW91c2Vkb3duJyxcbiAgbW91c2V1cDogJ21vdXNlZG93bicsXG4gIHBvaW50ZXJ1cDogJ3BvaW50ZXJkb3duJ1xufTtcblxuLyoqXG4gKiBUaGUgYHVzZUNsaWNrT3V0c2lkZWAgaG9vayByZWdpc3RlcnMgeW91ciBjYWxsYmFjayBvbiB0aGUgZG9jdW1lbnQgdGhhdCBmaXJlc1xuICogd2hlbiBhIHBvaW50ZXIgZXZlbnQgaXMgcmVnaXN0ZXJlZCBvdXRzaWRlIG9mIHRoZSBwcm92aWRlZCByZWYgb3IgZWxlbWVudC5cbiAqXG4gKiBAcGFyYW0ge1JlZjxIVE1MRWxlbWVudD58IEhUTUxFbGVtZW50fSByZWYgIFRoZSBlbGVtZW50IGJvdW5kYXJ5XG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBvbkNsaWNrT3V0c2lkZVxuICogQHBhcmFtIHtvYmplY3Q9fSAgb3B0aW9uc1xuICogQHBhcmFtIHtib29sZWFuPX0gb3B0aW9ucy5kaXNhYmxlZFxuICogQHBhcmFtIHtzdHJpbmc9fSAgb3B0aW9ucy5jbGlja1RyaWdnZXIgVGhlIERPTSBldmVudCBuYW1lIChjbGljaywgbW91c2Vkb3duLCBldGMpIHRvIGF0dGFjaCBsaXN0ZW5lcnMgb25cbiAqL1xuZnVuY3Rpb24gdXNlQ2xpY2tPdXRzaWRlKHJlZiwgb25DbGlja091dHNpZGUgPSBub29wLCB7XG4gIGRpc2FibGVkLFxuICBjbGlja1RyaWdnZXIgPSAnY2xpY2snXG59ID0ge30pIHtcbiAgY29uc3QgcHJldmVudE1vdXNlQ2xpY2tPdXRzaWRlUmVmID0gdXNlUmVmKGZhbHNlKTtcbiAgY29uc3Qgd2FpdGluZ0ZvclRyaWdnZXIgPSB1c2VSZWYoZmFsc2UpO1xuICBjb25zdCBoYW5kbGVNb3VzZUNhcHR1cmUgPSB1c2VDYWxsYmFjayhlID0+IHtcbiAgICBjb25zdCBjdXJyZW50VGFyZ2V0ID0gZ2V0UmVmVGFyZ2V0KHJlZik7XG4gICAgd2FybmluZyghIWN1cnJlbnRUYXJnZXQsICdDbGlja091dHNpZGUgY2FwdHVyZWQgYSBjbG9zZSBldmVudCBidXQgZG9lcyBub3QgaGF2ZSBhIHJlZiB0byBjb21wYXJlIGl0IHRvLiAnICsgJ3VzZUNsaWNrT3V0c2lkZSgpLCBzaG91bGQgYmUgcGFzc2VkIGEgcmVmIHRoYXQgcmVzb2x2ZXMgdG8gYSBET00gbm9kZScpO1xuICAgIHByZXZlbnRNb3VzZUNsaWNrT3V0c2lkZVJlZi5jdXJyZW50ID0gIWN1cnJlbnRUYXJnZXQgfHwgaXNNb2RpZmllZEV2ZW50KGUpIHx8ICFpc0xlZnRDbGlja0V2ZW50KGUpIHx8ICEhY29udGFpbnMoY3VycmVudFRhcmdldCwgZS50YXJnZXQpIHx8IHdhaXRpbmdGb3JUcmlnZ2VyLmN1cnJlbnQ7XG4gICAgd2FpdGluZ0ZvclRyaWdnZXIuY3VycmVudCA9IGZhbHNlO1xuICB9LCBbcmVmXSk7XG4gIGNvbnN0IGhhbmRsZUluaXRpYWxNb3VzZSA9IHVzZUV2ZW50Q2FsbGJhY2soZSA9PiB7XG4gICAgY29uc3QgY3VycmVudFRhcmdldCA9IGdldFJlZlRhcmdldChyZWYpO1xuICAgIGlmIChjdXJyZW50VGFyZ2V0ICYmIGNvbnRhaW5zKGN1cnJlbnRUYXJnZXQsIGUudGFyZ2V0KSkge1xuICAgICAgd2FpdGluZ0ZvclRyaWdnZXIuY3VycmVudCA9IHRydWU7XG4gICAgfVxuICB9KTtcbiAgY29uc3QgaGFuZGxlTW91c2UgPSB1c2VFdmVudENhbGxiYWNrKGUgPT4ge1xuICAgIGlmICghcHJldmVudE1vdXNlQ2xpY2tPdXRzaWRlUmVmLmN1cnJlbnQpIHtcbiAgICAgIG9uQ2xpY2tPdXRzaWRlKGUpO1xuICAgIH1cbiAgfSk7XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgdmFyIF9vd25lcldpbmRvdyRldmVudCwgX293bmVyV2luZG93JHBhcmVudDtcbiAgICBpZiAoZGlzYWJsZWQgfHwgcmVmID09IG51bGwpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgZG9jID0gb3duZXJEb2N1bWVudChnZXRSZWZUYXJnZXQocmVmKSk7XG4gICAgY29uc3Qgb3duZXJXaW5kb3cgPSBkb2MuZGVmYXVsdFZpZXcgfHwgd2luZG93O1xuXG4gICAgLy8gU3RvcmUgdGhlIGN1cnJlbnQgZXZlbnQgdG8gYXZvaWQgdHJpZ2dlcmluZyBoYW5kbGVycyBpbW1lZGlhdGVseVxuICAgIC8vIEZvciB0aGluZ3MgcmVuZGVyZWQgaW4gYW4gaWZyYW1lLCB0aGUgZXZlbnQgbWlnaHQgb3JpZ2luYXRlIG9uIHRoZSBwYXJlbnQgd2luZG93XG4gICAgLy8gc28gd2Ugc2hvdWxkIGZhbGwgYmFjayB0byB0aGF0IGdsb2JhbCBldmVudCBpZiB0aGUgbG9jYWwgb25lIGRvZXNuJ3QgZXhpc3RcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzIwMDc0XG4gICAgbGV0IGN1cnJlbnRFdmVudCA9IChfb3duZXJXaW5kb3ckZXZlbnQgPSBvd25lcldpbmRvdy5ldmVudCkgIT0gbnVsbCA/IF9vd25lcldpbmRvdyRldmVudCA6IChfb3duZXJXaW5kb3ckcGFyZW50ID0gb3duZXJXaW5kb3cucGFyZW50KSA9PSBudWxsID8gdm9pZCAwIDogX293bmVyV2luZG93JHBhcmVudC5ldmVudDtcbiAgICBsZXQgcmVtb3ZlSW5pdGlhbFRyaWdnZXJMaXN0ZW5lciA9IG51bGw7XG4gICAgaWYgKEluaXRpYWxUcmlnZ2VyRXZlbnRzW2NsaWNrVHJpZ2dlcl0pIHtcbiAgICAgIHJlbW92ZUluaXRpYWxUcmlnZ2VyTGlzdGVuZXIgPSBsaXN0ZW4oZG9jLCBJbml0aWFsVHJpZ2dlckV2ZW50c1tjbGlja1RyaWdnZXJdLCBoYW5kbGVJbml0aWFsTW91c2UsIHRydWUpO1xuICAgIH1cblxuICAgIC8vIFVzZSBjYXB0dXJlIGZvciB0aGlzIGxpc3RlbmVyIHNvIGl0IGZpcmVzIGJlZm9yZSBSZWFjdCdzIGxpc3RlbmVyLCB0b1xuICAgIC8vIGF2b2lkIGZhbHNlIHBvc2l0aXZlcyBpbiB0aGUgY29udGFpbnMoKSBjaGVjayBiZWxvdyBpZiB0aGUgdGFyZ2V0IERPTVxuICAgIC8vIGVsZW1lbnQgaXMgcmVtb3ZlZCBpbiB0aGUgUmVhY3QgbW91c2UgY2FsbGJhY2suXG4gICAgY29uc3QgcmVtb3ZlTW91c2VDYXB0dXJlTGlzdGVuZXIgPSBsaXN0ZW4oZG9jLCBjbGlja1RyaWdnZXIsIGhhbmRsZU1vdXNlQ2FwdHVyZSwgdHJ1ZSk7XG4gICAgY29uc3QgcmVtb3ZlTW91c2VMaXN0ZW5lciA9IGxpc3Rlbihkb2MsIGNsaWNrVHJpZ2dlciwgZSA9PiB7XG4gICAgICAvLyBza2lwIGlmIHRoaXMgZXZlbnQgaXMgdGhlIHNhbWUgYXMgdGhlIG9uZSBydW5uaW5nIHdoZW4gd2UgYWRkZWQgdGhlIGhhbmRsZXJzXG4gICAgICBpZiAoZSA9PT0gY3VycmVudEV2ZW50KSB7XG4gICAgICAgIGN1cnJlbnRFdmVudCA9IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaGFuZGxlTW91c2UoZSk7XG4gICAgfSk7XG4gICAgbGV0IG1vYmlsZVNhZmFyaUhhY2tMaXN0ZW5lcnMgPSBbXTtcbiAgICBpZiAoJ29udG91Y2hzdGFydCcgaW4gZG9jLmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgbW9iaWxlU2FmYXJpSGFja0xpc3RlbmVycyA9IFtdLnNsaWNlLmNhbGwoZG9jLmJvZHkuY2hpbGRyZW4pLm1hcChlbCA9PiBsaXN0ZW4oZWwsICdtb3VzZW1vdmUnLCBub29wKSk7XG4gICAgfVxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICByZW1vdmVJbml0aWFsVHJpZ2dlckxpc3RlbmVyID09IG51bGwgPyB2b2lkIDAgOiByZW1vdmVJbml0aWFsVHJpZ2dlckxpc3RlbmVyKCk7XG4gICAgICByZW1vdmVNb3VzZUNhcHR1cmVMaXN0ZW5lcigpO1xuICAgICAgcmVtb3ZlTW91c2VMaXN0ZW5lcigpO1xuICAgICAgbW9iaWxlU2FmYXJpSGFja0xpc3RlbmVycy5mb3JFYWNoKHJlbW92ZSA9PiByZW1vdmUoKSk7XG4gICAgfTtcbiAgfSwgW3JlZiwgZGlzYWJsZWQsIGNsaWNrVHJpZ2dlciwgaGFuZGxlTW91c2VDYXB0dXJlLCBoYW5kbGVJbml0aWFsTW91c2UsIGhhbmRsZU1vdXNlXSk7XG59XG5leHBvcnQgZGVmYXVsdCB1c2VDbGlja091dHNpZGU7IiwiZXhwb3J0IGZ1bmN0aW9uIHRvTW9kaWZpZXJNYXAobW9kaWZpZXJzKSB7XG4gIGNvbnN0IHJlc3VsdCA9IHt9O1xuICBpZiAoIUFycmF5LmlzQXJyYXkobW9kaWZpZXJzKSkge1xuICAgIHJldHVybiBtb2RpZmllcnMgfHwgcmVzdWx0O1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC1leHByZXNzaW9uc1xuICBtb2RpZmllcnMgPT0gbnVsbCA/IHZvaWQgMCA6IG1vZGlmaWVycy5mb3JFYWNoKG0gPT4ge1xuICAgIHJlc3VsdFttLm5hbWVdID0gbTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5leHBvcnQgZnVuY3Rpb24gdG9Nb2RpZmllckFycmF5KG1hcCA9IHt9KSB7XG4gIGlmIChBcnJheS5pc0FycmF5KG1hcCkpIHJldHVybiBtYXA7XG4gIHJldHVybiBPYmplY3Qua2V5cyhtYXApLm1hcChrID0+IHtcbiAgICBtYXBba10ubmFtZSA9IGs7XG4gICAgcmV0dXJuIG1hcFtrXTtcbiAgfSk7XG59XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtZXJnZU9wdGlvbnNXaXRoUG9wcGVyQ29uZmlnKHtcbiAgZW5hYmxlZCxcbiAgZW5hYmxlRXZlbnRzLFxuICBwbGFjZW1lbnQsXG4gIGZsaXAsXG4gIG9mZnNldCxcbiAgZml4ZWQsXG4gIGNvbnRhaW5lclBhZGRpbmcsXG4gIGFycm93RWxlbWVudCxcbiAgcG9wcGVyQ29uZmlnID0ge31cbn0pIHtcbiAgdmFyIF9tb2RpZmllcnMkZXZlbnRMaXN0ZSwgX21vZGlmaWVycyRwcmV2ZW50T3ZlLCBfbW9kaWZpZXJzJHByZXZlbnRPdmUyLCBfbW9kaWZpZXJzJG9mZnNldCwgX21vZGlmaWVycyRhcnJvdztcbiAgY29uc3QgbW9kaWZpZXJzID0gdG9Nb2RpZmllck1hcChwb3BwZXJDb25maWcubW9kaWZpZXJzKTtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHBvcHBlckNvbmZpZywge1xuICAgIHBsYWNlbWVudCxcbiAgICBlbmFibGVkLFxuICAgIHN0cmF0ZWd5OiBmaXhlZCA/ICdmaXhlZCcgOiBwb3BwZXJDb25maWcuc3RyYXRlZ3ksXG4gICAgbW9kaWZpZXJzOiB0b01vZGlmaWVyQXJyYXkoT2JqZWN0LmFzc2lnbih7fSwgbW9kaWZpZXJzLCB7XG4gICAgICBldmVudExpc3RlbmVyczoge1xuICAgICAgICBlbmFibGVkOiBlbmFibGVFdmVudHMsXG4gICAgICAgIG9wdGlvbnM6IChfbW9kaWZpZXJzJGV2ZW50TGlzdGUgPSBtb2RpZmllcnMuZXZlbnRMaXN0ZW5lcnMpID09IG51bGwgPyB2b2lkIDAgOiBfbW9kaWZpZXJzJGV2ZW50TGlzdGUub3B0aW9uc1xuICAgICAgfSxcbiAgICAgIHByZXZlbnRPdmVyZmxvdzogT2JqZWN0LmFzc2lnbih7fSwgbW9kaWZpZXJzLnByZXZlbnRPdmVyZmxvdywge1xuICAgICAgICBvcHRpb25zOiBjb250YWluZXJQYWRkaW5nID8gT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgcGFkZGluZzogY29udGFpbmVyUGFkZGluZ1xuICAgICAgICB9LCAoX21vZGlmaWVycyRwcmV2ZW50T3ZlID0gbW9kaWZpZXJzLnByZXZlbnRPdmVyZmxvdykgPT0gbnVsbCA/IHZvaWQgMCA6IF9tb2RpZmllcnMkcHJldmVudE92ZS5vcHRpb25zKSA6IChfbW9kaWZpZXJzJHByZXZlbnRPdmUyID0gbW9kaWZpZXJzLnByZXZlbnRPdmVyZmxvdykgPT0gbnVsbCA/IHZvaWQgMCA6IF9tb2RpZmllcnMkcHJldmVudE92ZTIub3B0aW9uc1xuICAgICAgfSksXG4gICAgICBvZmZzZXQ6IHtcbiAgICAgICAgb3B0aW9uczogT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgb2Zmc2V0XG4gICAgICAgIH0sIChfbW9kaWZpZXJzJG9mZnNldCA9IG1vZGlmaWVycy5vZmZzZXQpID09IG51bGwgPyB2b2lkIDAgOiBfbW9kaWZpZXJzJG9mZnNldC5vcHRpb25zKVxuICAgICAgfSxcbiAgICAgIGFycm93OiBPYmplY3QuYXNzaWduKHt9LCBtb2RpZmllcnMuYXJyb3csIHtcbiAgICAgICAgZW5hYmxlZDogISFhcnJvd0VsZW1lbnQsXG4gICAgICAgIG9wdGlvbnM6IE9iamVjdC5hc3NpZ24oe30sIChfbW9kaWZpZXJzJGFycm93ID0gbW9kaWZpZXJzLmFycm93KSA9PSBudWxsID8gdm9pZCAwIDogX21vZGlmaWVycyRhcnJvdy5vcHRpb25zLCB7XG4gICAgICAgICAgZWxlbWVudDogYXJyb3dFbGVtZW50XG4gICAgICAgIH0pXG4gICAgICB9KSxcbiAgICAgIGZsaXA6IE9iamVjdC5hc3NpZ24oe1xuICAgICAgICBlbmFibGVkOiAhIWZsaXBcbiAgICAgIH0sIG1vZGlmaWVycy5mbGlwKVxuICAgIH0pKVxuICB9KTtcbn0iLCJjb25zdCBfZXhjbHVkZWQgPSBbXCJjaGlsZHJlblwiXTtcbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpIHsgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307IHZhciB0YXJnZXQgPSB7fTsgdmFyIHNvdXJjZUtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpOyB2YXIga2V5LCBpOyBmb3IgKGkgPSAwOyBpIDwgc291cmNlS2V5cy5sZW5ndGg7IGkrKykgeyBrZXkgPSBzb3VyY2VLZXlzW2ldOyBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlOyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IHJldHVybiB0YXJnZXQ7IH1cbmltcG9ydCB7IHVzZUNvbnRleHQsIHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB1c2VDYWxsYmFja1JlZiBmcm9tICdAcmVzdGFydC9ob29rcy91c2VDYWxsYmFja1JlZic7XG5pbXBvcnQgRHJvcGRvd25Db250ZXh0IGZyb20gJy4vRHJvcGRvd25Db250ZXh0JztcbmltcG9ydCB1c2VQb3BwZXIgZnJvbSAnLi91c2VQb3BwZXInO1xuaW1wb3J0IHVzZUNsaWNrT3V0c2lkZSBmcm9tICcuL3VzZUNsaWNrT3V0c2lkZSc7XG5pbXBvcnQgbWVyZ2VPcHRpb25zV2l0aFBvcHBlckNvbmZpZyBmcm9tICcuL21lcmdlT3B0aW9uc1dpdGhQb3BwZXJDb25maWcnO1xuaW1wb3J0IHsgRnJhZ21lbnQgYXMgX0ZyYWdtZW50IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3Qgbm9vcCA9ICgpID0+IHt9O1xuXG4vKipcbiAqIEBtZW1iZXJPZiBEcm9wZG93blxuICogQHBhcmFtIHtvYmplY3R9ICBvcHRpb25zXG4gKiBAcGFyYW0ge2Jvb2xlYW59IG9wdGlvbnMuZmxpcCBBdXRvbWF0aWNhbGx5IGFkanVzdCB0aGUgbWVudSBgZHJvcGAgcG9zaXRpb24gYmFzZWQgb24gdmlld3BvcnQgZWRnZSBkZXRlY3Rpb25cbiAqIEBwYXJhbSB7W251bWJlciwgbnVtYmVyXX0gb3B0aW9ucy5vZmZzZXQgRGVmaW5lIGFuIG9mZnNldCBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBNZW51IGFuZCB0aGUgVG9nZ2xlXG4gKiBAcGFyYW0ge2Jvb2xlYW59IG9wdGlvbnMuc2hvdyBEaXNwbGF5IHRoZSBtZW51IG1hbnVhbGx5LCBpZ25vcmVkIGluIHRoZSBjb250ZXh0IG9mIGEgYERyb3Bkb3duYFxuICogQHBhcmFtIHtib29sZWFufSBvcHRpb25zLnVzZVBvcHBlciBvcHQgaW4vb3V0IG9mIHVzaW5nIFBvcHBlckpTIHRvIHBvc2l0aW9uIG1lbnVzLiBXaGVuIGRpc2FibGVkIHlvdSBtdXN0IHBvc2l0aW9uIGl0IHlvdXJzZWxmLlxuICogQHBhcmFtIHtzdHJpbmd9ICBvcHRpb25zLnJvb3RDbG9zZUV2ZW50IFRoZSBwb2ludGVyIGV2ZW50IHRvIGxpc3RlbiBmb3Igd2hlbiBkZXRlcm1pbmluZyBcImNsaWNrcyBvdXRzaWRlXCIgdGhlIG1lbnUgZm9yIHRyaWdnZXJpbmcgYSBjbG9zZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSAgb3B0aW9ucy5wb3BwZXJDb25maWcgT3B0aW9ucyBwYXNzZWQgdG8gdGhlIFtgdXNlUG9wcGVyYF0oL2FwaS91c2VQb3BwZXIpIGhvb2suXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VEcm9wZG93bk1lbnUob3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IGNvbnRleHQgPSB1c2VDb250ZXh0KERyb3Bkb3duQ29udGV4dCk7XG4gIGNvbnN0IFthcnJvd0VsZW1lbnQsIGF0dGFjaEFycm93UmVmXSA9IHVzZUNhbGxiYWNrUmVmKCk7XG4gIGNvbnN0IGhhc1Nob3duUmVmID0gdXNlUmVmKGZhbHNlKTtcbiAgY29uc3Qge1xuICAgIGZsaXAsXG4gICAgb2Zmc2V0LFxuICAgIHJvb3RDbG9zZUV2ZW50LFxuICAgIGZpeGVkID0gZmFsc2UsXG4gICAgcGxhY2VtZW50OiBwbGFjZW1lbnRPdmVycmlkZSxcbiAgICBwb3BwZXJDb25maWcgPSB7fSxcbiAgICBlbmFibGVFdmVudExpc3RlbmVycyA9IHRydWUsXG4gICAgdXNlUG9wcGVyOiBzaG91bGRVc2VQb3BwZXIgPSAhIWNvbnRleHRcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHNob3cgPSAoY29udGV4dCA9PSBudWxsID8gdm9pZCAwIDogY29udGV4dC5zaG93KSA9PSBudWxsID8gISFvcHRpb25zLnNob3cgOiBjb250ZXh0LnNob3c7XG4gIGlmIChzaG93ICYmICFoYXNTaG93blJlZi5jdXJyZW50KSB7XG4gICAgaGFzU2hvd25SZWYuY3VycmVudCA9IHRydWU7XG4gIH1cbiAgY29uc3QgaGFuZGxlQ2xvc2UgPSBlID0+IHtcbiAgICBjb250ZXh0ID09IG51bGwgPyB2b2lkIDAgOiBjb250ZXh0LnRvZ2dsZShmYWxzZSwgZSk7XG4gIH07XG4gIGNvbnN0IHtcbiAgICBwbGFjZW1lbnQsXG4gICAgc2V0TWVudSxcbiAgICBtZW51RWxlbWVudCxcbiAgICB0b2dnbGVFbGVtZW50XG4gIH0gPSBjb250ZXh0IHx8IHt9O1xuICBjb25zdCBwb3BwZXIgPSB1c2VQb3BwZXIodG9nZ2xlRWxlbWVudCwgbWVudUVsZW1lbnQsIG1lcmdlT3B0aW9uc1dpdGhQb3BwZXJDb25maWcoe1xuICAgIHBsYWNlbWVudDogcGxhY2VtZW50T3ZlcnJpZGUgfHwgcGxhY2VtZW50IHx8ICdib3R0b20tc3RhcnQnLFxuICAgIGVuYWJsZWQ6IHNob3VsZFVzZVBvcHBlcixcbiAgICBlbmFibGVFdmVudHM6IGVuYWJsZUV2ZW50TGlzdGVuZXJzID09IG51bGwgPyBzaG93IDogZW5hYmxlRXZlbnRMaXN0ZW5lcnMsXG4gICAgb2Zmc2V0LFxuICAgIGZsaXAsXG4gICAgZml4ZWQsXG4gICAgYXJyb3dFbGVtZW50LFxuICAgIHBvcHBlckNvbmZpZ1xuICB9KSk7XG4gIGNvbnN0IG1lbnVQcm9wcyA9IE9iamVjdC5hc3NpZ24oe1xuICAgIHJlZjogc2V0TWVudSB8fCBub29wLFxuICAgICdhcmlhLWxhYmVsbGVkYnknOiB0b2dnbGVFbGVtZW50ID09IG51bGwgPyB2b2lkIDAgOiB0b2dnbGVFbGVtZW50LmlkXG4gIH0sIHBvcHBlci5hdHRyaWJ1dGVzLnBvcHBlciwge1xuICAgIHN0eWxlOiBwb3BwZXIuc3R5bGVzLnBvcHBlclxuICB9KTtcbiAgY29uc3QgbWV0YWRhdGEgPSB7XG4gICAgc2hvdyxcbiAgICBwbGFjZW1lbnQsXG4gICAgaGFzU2hvd246IGhhc1Nob3duUmVmLmN1cnJlbnQsXG4gICAgdG9nZ2xlOiBjb250ZXh0ID09IG51bGwgPyB2b2lkIDAgOiBjb250ZXh0LnRvZ2dsZSxcbiAgICBwb3BwZXI6IHNob3VsZFVzZVBvcHBlciA/IHBvcHBlciA6IG51bGwsXG4gICAgYXJyb3dQcm9wczogc2hvdWxkVXNlUG9wcGVyID8gT2JqZWN0LmFzc2lnbih7XG4gICAgICByZWY6IGF0dGFjaEFycm93UmVmXG4gICAgfSwgcG9wcGVyLmF0dHJpYnV0ZXMuYXJyb3csIHtcbiAgICAgIHN0eWxlOiBwb3BwZXIuc3R5bGVzLmFycm93XG4gICAgfSkgOiB7fVxuICB9O1xuICB1c2VDbGlja091dHNpZGUobWVudUVsZW1lbnQsIGhhbmRsZUNsb3NlLCB7XG4gICAgY2xpY2tUcmlnZ2VyOiByb290Q2xvc2VFdmVudCxcbiAgICBkaXNhYmxlZDogIXNob3dcbiAgfSk7XG4gIHJldHVybiBbbWVudVByb3BzLCBtZXRhZGF0YV07XG59XG5jb25zdCBkZWZhdWx0UHJvcHMgPSB7XG4gIHVzZVBvcHBlcjogdHJ1ZVxufTtcbi8qKlxuICogQWxzbyBleHBvcnRlZCBhcyBgPERyb3Bkb3duLk1lbnU+YCBmcm9tIGBEcm9wZG93bmAuXG4gKlxuICogQGRpc3BsYXlOYW1lIERyb3Bkb3duTWVudVxuICogQG1lbWJlck9mIERyb3Bkb3duXG4gKi9cbmZ1bmN0aW9uIERyb3Bkb3duTWVudShfcmVmKSB7XG4gIGxldCB7XG4gICAgICBjaGlsZHJlblxuICAgIH0gPSBfcmVmLFxuICAgIG9wdGlvbnMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShfcmVmLCBfZXhjbHVkZWQpO1xuICBjb25zdCBbcHJvcHMsIG1ldGFdID0gdXNlRHJvcGRvd25NZW51KG9wdGlvbnMpO1xuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goX0ZyYWdtZW50LCB7XG4gICAgY2hpbGRyZW46IGNoaWxkcmVuKHByb3BzLCBtZXRhKVxuICB9KTtcbn1cbkRyb3Bkb3duTWVudS5kaXNwbGF5TmFtZSA9ICdEcm9wZG93bk1lbnUnO1xuRHJvcGRvd25NZW51LmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcblxuLyoqIEBjb21wb25lbnQgKi9cbmV4cG9ydCBkZWZhdWx0IERyb3Bkb3duTWVudTsiLCJpbXBvcnQgJDczU0p4JHJlYWN0LCB7dXNlQ29udGV4dCBhcyAkNzNTSngkdXNlQ29udGV4dCwgdXNlU3RhdGUgYXMgJDczU0p4JHVzZVN0YXRlLCB1c2VNZW1vIGFzICQ3M1NKeCR1c2VNZW1vLCB1c2VMYXlvdXRFZmZlY3QgYXMgJDczU0p4JHVzZUxheW91dEVmZmVjdCwgdXNlUmVmIGFzICQ3M1NKeCR1c2VSZWZ9IGZyb20gXCJyZWFjdFwiO1xuXG4vKlxuICogQ29weXJpZ2h0IDIwMjAgQWRvYmUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weVxuICogb2YgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlclxuICogdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgUkVQUkVTRU5UQVRJT05TXG4gKiBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2VcbiAqIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi8gLypcbiAqIENvcHlyaWdodCAyMDIwIEFkb2JlLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHlcbiAqIG9mIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXJcbiAqIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIFJFUFJFU0VOVEFUSU9OU1xuICogT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlXG4gKiBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovIC8vIFdlIG11c3QgYXZvaWQgYSBjaXJjdWxhciBkZXBlbmRlbmN5IHdpdGggQHJlYWN0LWFyaWEvdXRpbHMsIGFuZCB0aGlzIHVzZUxheW91dEVmZmVjdCBpc1xuLy8gZ3VhcmRlZCBieSBhIGNoZWNrIHRoYXQgaXQgb25seSBydW5zIG9uIHRoZSBjbGllbnQgc2lkZS5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBydWxlc2Rpci91c2VMYXlvdXRFZmZlY3RSdWxlXG5cbi8vIERlZmF1bHQgY29udGV4dCB2YWx1ZSB0byB1c2UgaW4gY2FzZSB0aGVyZSBpcyBubyBTU1JQcm92aWRlci4gVGhpcyBpcyBmaW5lIGZvclxuLy8gY2xpZW50LW9ubHkgYXBwcy4gSW4gb3JkZXIgdG8gc3VwcG9ydCBtdWx0aXBsZSBjb3BpZXMgb2YgUmVhY3QgQXJpYSBwb3RlbnRpYWxseVxuLy8gYmVpbmcgb24gdGhlIHBhZ2UgYXQgb25jZSwgdGhlIHByZWZpeCBpcyBzZXQgdG8gYSByYW5kb20gbnVtYmVyLiBTU1JQcm92aWRlclxuLy8gd2lsbCByZXNldCB0aGlzIHRvIHplcm8gZm9yIGNvbnNpc3RlbmN5IGJldHdlZW4gc2VydmVyIGFuZCBjbGllbnQsIHNvIGluIHRoZVxuLy8gU1NSIGNhc2UgbXVsdGlwbGUgY29waWVzIG9mIFJlYWN0IEFyaWEgaXMgbm90IHN1cHBvcnRlZC5cbmNvbnN0ICRiNWUyNTdkNTY5Njg4YWM2JHZhciRkZWZhdWx0Q29udGV4dCA9IHtcbiAgICBwcmVmaXg6IFN0cmluZyhNYXRoLnJvdW5kKE1hdGgucmFuZG9tKCkgKiAxMDAwMDAwMDAwMCkpLFxuICAgIGN1cnJlbnQ6IDBcbn07XG5jb25zdCAkYjVlMjU3ZDU2OTY4OGFjNiR2YXIkU1NSQ29udGV4dCA9IC8qI19fUFVSRV9fKi8gKDAsICQ3M1NKeCRyZWFjdCkuY3JlYXRlQ29udGV4dCgkYjVlMjU3ZDU2OTY4OGFjNiR2YXIkZGVmYXVsdENvbnRleHQpO1xuY29uc3QgJGI1ZTI1N2Q1Njk2ODhhYzYkdmFyJElzU1NSQ29udGV4dCA9IC8qI19fUFVSRV9fKi8gKDAsICQ3M1NKeCRyZWFjdCkuY3JlYXRlQ29udGV4dChmYWxzZSk7XG4vLyBUaGlzIGlzIG9ubHkgdXNlZCBpbiBSZWFjdCA8IDE4LlxuZnVuY3Rpb24gJGI1ZTI1N2Q1Njk2ODhhYzYkdmFyJExlZ2FjeVNTUlByb3ZpZGVyKHByb3BzKSB7XG4gICAgbGV0IGN1ciA9ICgwLCAkNzNTSngkdXNlQ29udGV4dCkoJGI1ZTI1N2Q1Njk2ODhhYzYkdmFyJFNTUkNvbnRleHQpO1xuICAgIGxldCBjb3VudGVyID0gJGI1ZTI1N2Q1Njk2ODhhYzYkdmFyJHVzZUNvdW50ZXIoY3VyID09PSAkYjVlMjU3ZDU2OTY4OGFjNiR2YXIkZGVmYXVsdENvbnRleHQpO1xuICAgIGxldCBbaXNTU1IsIHNldElzU1NSXSA9ICgwLCAkNzNTSngkdXNlU3RhdGUpKHRydWUpO1xuICAgIGxldCB2YWx1ZSA9ICgwLCAkNzNTSngkdXNlTWVtbykoKCk9Pih7XG4gICAgICAgICAgICAvLyBJZiB0aGlzIGlzIHRoZSBmaXJzdCBTU1JQcm92aWRlciwgc3RhcnQgd2l0aCBhbiBlbXB0eSBzdHJpbmcgcHJlZml4LCBvdGhlcndpc2VcbiAgICAgICAgICAgIC8vIGFwcGVuZCBhbmQgaW5jcmVtZW50IHRoZSBjb3VudGVyLlxuICAgICAgICAgICAgcHJlZml4OiBjdXIgPT09ICRiNWUyNTdkNTY5Njg4YWM2JHZhciRkZWZhdWx0Q29udGV4dCA/IFwiXCIgOiBgJHtjdXIucHJlZml4fS0ke2NvdW50ZXJ9YCxcbiAgICAgICAgICAgIGN1cnJlbnQ6IDBcbiAgICAgICAgfSksIFtcbiAgICAgICAgY3VyLFxuICAgICAgICBjb3VudGVyXG4gICAgXSk7XG4gICAgLy8gSWYgb24gdGhlIGNsaWVudCwgYW5kIHRoZSBjb21wb25lbnQgd2FzIGluaXRpYWxseSBzZXJ2ZXIgcmVuZGVyZWQsXG4gICAgLy8gdGhlbiBzY2hlZHVsZSBhIGxheW91dCBlZmZlY3QgdG8gdXBkYXRlIHRoZSBjb21wb25lbnQgYWZ0ZXIgaHlkcmF0aW9uLlxuICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09IFwidW5kZWZpbmVkXCIpIC8vIFRoaXMgaWYgc3RhdGVtZW50IHRlY2huaWNhbGx5IGJyZWFrcyB0aGUgcnVsZXMgb2YgaG9va3MsIGJ1dCBpcyBzYWZlXG4gICAgLy8gYmVjYXVzZSB0aGUgY29uZGl0aW9uIG5ldmVyIGNoYW5nZXMgYWZ0ZXIgbW91bnRpbmcuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL3J1bGVzLW9mLWhvb2tzXG4gICAgKDAsICQ3M1NKeCR1c2VMYXlvdXRFZmZlY3QpKCgpPT57XG4gICAgICAgIHNldElzU1NSKGZhbHNlKTtcbiAgICB9LCBbXSk7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi8gKDAsICQ3M1NKeCRyZWFjdCkuY3JlYXRlRWxlbWVudCgkYjVlMjU3ZDU2OTY4OGFjNiR2YXIkU1NSQ29udGV4dC5Qcm92aWRlciwge1xuICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICB9LCAvKiNfX1BVUkVfXyovICgwLCAkNzNTSngkcmVhY3QpLmNyZWF0ZUVsZW1lbnQoJGI1ZTI1N2Q1Njk2ODhhYzYkdmFyJElzU1NSQ29udGV4dC5Qcm92aWRlciwge1xuICAgICAgICB2YWx1ZTogaXNTU1JcbiAgICB9LCBwcm9wcy5jaGlsZHJlbikpO1xufVxubGV0ICRiNWUyNTdkNTY5Njg4YWM2JHZhciR3YXJuZWRBYm91dFNTUlByb3ZpZGVyID0gZmFsc2U7XG5mdW5jdGlvbiAkYjVlMjU3ZDU2OTY4OGFjNiRleHBvcnQkOWY4YWM5NmFmNGIxYjJhZShwcm9wcykge1xuICAgIGlmICh0eXBlb2YgKDAsICQ3M1NKeCRyZWFjdClbXCJ1c2VJZFwiXSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJ0ZXN0XCIgJiYgISRiNWUyNTdkNTY5Njg4YWM2JHZhciR3YXJuZWRBYm91dFNTUlByb3ZpZGVyKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXCJJbiBSZWFjdCAxOCwgU1NSUHJvdmlkZXIgaXMgbm90IG5lY2Vzc2FyeSBhbmQgaXMgYSBub29wLiBZb3UgY2FuIHJlbW92ZSBpdCBmcm9tIHlvdXIgYXBwLlwiKTtcbiAgICAgICAgICAgICRiNWUyNTdkNTY5Njg4YWM2JHZhciR3YXJuZWRBYm91dFNTUlByb3ZpZGVyID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gLyojX19QVVJFX18qLyAoMCwgJDczU0p4JHJlYWN0KS5jcmVhdGVFbGVtZW50KCgwLCAkNzNTSngkcmVhY3QpLkZyYWdtZW50LCBudWxsLCBwcm9wcy5jaGlsZHJlbik7XG4gICAgfVxuICAgIHJldHVybiAvKiNfX1BVUkVfXyovICgwLCAkNzNTSngkcmVhY3QpLmNyZWF0ZUVsZW1lbnQoJGI1ZTI1N2Q1Njk2ODhhYzYkdmFyJExlZ2FjeVNTUlByb3ZpZGVyLCBwcm9wcyk7XG59XG5sZXQgJGI1ZTI1N2Q1Njk2ODhhYzYkdmFyJGNhblVzZURPTSA9IEJvb2xlYW4odHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB3aW5kb3cuZG9jdW1lbnQgJiYgd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpO1xubGV0ICRiNWUyNTdkNTY5Njg4YWM2JHZhciRjb21wb25lbnRJZHMgPSBuZXcgV2Vha01hcCgpO1xuZnVuY3Rpb24gJGI1ZTI1N2Q1Njk2ODhhYzYkdmFyJHVzZUNvdW50ZXIoaXNEaXNhYmxlZCA9IGZhbHNlKSB7XG4gICAgbGV0IGN0eCA9ICgwLCAkNzNTSngkdXNlQ29udGV4dCkoJGI1ZTI1N2Q1Njk2ODhhYzYkdmFyJFNTUkNvbnRleHQpO1xuICAgIGxldCByZWYgPSAoMCwgJDczU0p4JHVzZVJlZikobnVsbCk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJ1bGVzZGlyL3B1cmUtcmVuZGVyXG4gICAgaWYgKHJlZi5jdXJyZW50ID09PSBudWxsICYmICFpc0Rpc2FibGVkKSB7XG4gICAgICAgIHZhciBfUmVhY3RfX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRURfUmVhY3RDdXJyZW50T3duZXIsIF9SZWFjdF9fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRDtcbiAgICAgICAgLy8gSW4gc3RyaWN0IG1vZGUsIFJlYWN0IHJlbmRlcnMgY29tcG9uZW50cyB0d2ljZSwgYW5kIHRoZSByZWYgd2lsbCBiZSByZXNldCB0byBudWxsIG9uIHRoZSBzZWNvbmQgcmVuZGVyLlxuICAgICAgICAvLyBUaGlzIG1lYW5zIG91ciBpZCBjb3VudGVyIHdpbGwgYmUgaW5jcmVtZW50ZWQgdHdpY2UgaW5zdGVhZCBvZiBvbmNlLiBUaGlzIGlzIGEgcHJvYmxlbSBiZWNhdXNlIG9uIHRoZVxuICAgICAgICAvLyBzZXJ2ZXIsIGNvbXBvbmVudHMgYXJlIG9ubHkgcmVuZGVyZWQgb25jZSBhbmQgc28gaWRzIGdlbmVyYXRlZCBvbiB0aGUgc2VydmVyIHdvbid0IG1hdGNoIHRoZSBjbGllbnQuXG4gICAgICAgIC8vIEluIFJlYWN0IDE4LCB1c2VJZCB3YXMgaW50cm9kdWNlZCB0byBzb2x2ZSB0aGlzLCBidXQgaXQgaXMgbm90IGF2YWlsYWJsZSBpbiBvbGRlciB2ZXJzaW9ucy4gU28gdG8gc29sdmUgdGhpc1xuICAgICAgICAvLyB3ZSBuZWVkIHRvIHVzZSBzb21lIFJlYWN0IGludGVybmFscyB0byBhY2Nlc3MgdGhlIHVuZGVybHlpbmcgRmliZXIgaW5zdGFuY2UsIHdoaWNoIGlzIHN0YWJsZSBiZXR3ZWVuIHJlbmRlcnMuXG4gICAgICAgIC8vIFRoaXMgaXMgZXhwb3NlZCBhcyBSZWFjdEN1cnJlbnRPd25lciBpbiBkZXZlbG9wbWVudCwgd2hpY2ggaXMgYWxsIHdlIG5lZWQgc2luY2UgU3RyaWN0TW9kZSBvbmx5IHJ1bnMgaW4gZGV2ZWxvcG1lbnQuXG4gICAgICAgIC8vIFRvIGVuc3VyZSB0aGF0IHdlIG9ubHkgaW5jcmVtZW50IHRoZSBnbG9iYWwgY291bnRlciBvbmNlLCB3ZSBzdG9yZSB0aGUgc3RhcnRpbmcgaWQgZm9yIHRoaXMgY29tcG9uZW50IGluXG4gICAgICAgIC8vIGEgd2VhayBtYXAgYXNzb2NpYXRlZCB3aXRoIHRoZSBGaWJlci4gT24gdGhlIHNlY29uZCByZW5kZXIsIHdlIHJlc2V0IHRoZSBnbG9iYWwgY291bnRlciB0byB0aGlzIHZhbHVlLlxuICAgICAgICAvLyBTaW5jZSBSZWFjdCBydW5zIHRoZSBzZWNvbmQgcmVuZGVyIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBmaXJzdCwgdGhpcyBpcyBzYWZlLlxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGxldCBjdXJyZW50T3duZXIgPSAoX1JlYWN0X19fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEID0gKDAsICQ3M1NKeCRyZWFjdCkuX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQpID09PSBudWxsIHx8IF9SZWFjdF9fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRCA9PT0gdm9pZCAwID8gdm9pZCAwIDogKF9SZWFjdF9fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRF9SZWFjdEN1cnJlbnRPd25lciA9IF9SZWFjdF9fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRC5SZWFjdEN1cnJlbnRPd25lcikgPT09IG51bGwgfHwgX1JlYWN0X19fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEX1JlYWN0Q3VycmVudE93bmVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfUmVhY3RfX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRURfUmVhY3RDdXJyZW50T3duZXIuY3VycmVudDtcbiAgICAgICAgaWYgKGN1cnJlbnRPd25lcikge1xuICAgICAgICAgICAgbGV0IHByZXZDb21wb25lbnRWYWx1ZSA9ICRiNWUyNTdkNTY5Njg4YWM2JHZhciRjb21wb25lbnRJZHMuZ2V0KGN1cnJlbnRPd25lcik7XG4gICAgICAgICAgICBpZiAocHJldkNvbXBvbmVudFZhbHVlID09IG51bGwpIC8vIE9uIHRoZSBmaXJzdCByZW5kZXIsIGFuZCBmaXJzdCBjYWxsIHRvIHVzZUlkLCBzdG9yZSB0aGUgaWQgYW5kIHN0YXRlIGluIG91ciB3ZWFrIG1hcC5cbiAgICAgICAgICAgICRiNWUyNTdkNTY5Njg4YWM2JHZhciRjb21wb25lbnRJZHMuc2V0KGN1cnJlbnRPd25lciwge1xuICAgICAgICAgICAgICAgIGlkOiBjdHguY3VycmVudCxcbiAgICAgICAgICAgICAgICBzdGF0ZTogY3VycmVudE93bmVyLm1lbW9pemVkU3RhdGVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZWxzZSBpZiAoY3VycmVudE93bmVyLm1lbW9pemVkU3RhdGUgIT09IHByZXZDb21wb25lbnRWYWx1ZS5zdGF0ZSkge1xuICAgICAgICAgICAgICAgIC8vIE9uIHRoZSBzZWNvbmQgcmVuZGVyLCB0aGUgbWVtb2l6ZWRTdGF0ZSBnZXRzIHJlc2V0IGJ5IFJlYWN0LlxuICAgICAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBjb3VudGVyLCBhbmQgcmVtb3ZlIGZyb20gdGhlIHdlYWsgbWFwIHNvIHdlIGRvbid0XG4gICAgICAgICAgICAgICAgLy8gZG8gdGhpcyBmb3Igc3Vic2VxdWVudCB1c2VJZCBjYWxscy5cbiAgICAgICAgICAgICAgICBjdHguY3VycmVudCA9IHByZXZDb21wb25lbnRWYWx1ZS5pZDtcbiAgICAgICAgICAgICAgICAkYjVlMjU3ZDU2OTY4OGFjNiR2YXIkY29tcG9uZW50SWRzLmRlbGV0ZShjdXJyZW50T3duZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBydWxlc2Rpci9wdXJlLXJlbmRlclxuICAgICAgICByZWYuY3VycmVudCA9ICsrY3R4LmN1cnJlbnQ7XG4gICAgfVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBydWxlc2Rpci9wdXJlLXJlbmRlclxuICAgIHJldHVybiByZWYuY3VycmVudDtcbn1cbmZ1bmN0aW9uICRiNWUyNTdkNTY5Njg4YWM2JHZhciR1c2VMZWdhY3lTU1JTYWZlSWQoZGVmYXVsdElkKSB7XG4gICAgbGV0IGN0eCA9ICgwLCAkNzNTSngkdXNlQ29udGV4dCkoJGI1ZTI1N2Q1Njk2ODhhYzYkdmFyJFNTUkNvbnRleHQpO1xuICAgIC8vIElmIHdlIGFyZSByZW5kZXJpbmcgaW4gYSBub24tRE9NIGVudmlyb25tZW50LCBhbmQgdGhlcmUncyBubyBTU1JQcm92aWRlcixcbiAgICAvLyBwcm92aWRlIGEgd2FybmluZyB0byBoaW50IHRvIHRoZSBkZXZlbG9wZXIgdG8gYWRkIG9uZS5cbiAgICBpZiAoY3R4ID09PSAkYjVlMjU3ZDU2OTY4OGFjNiR2YXIkZGVmYXVsdENvbnRleHQgJiYgISRiNWUyNTdkNTY5Njg4YWM2JHZhciRjYW5Vc2VET00pIGNvbnNvbGUud2FybihcIldoZW4gc2VydmVyIHJlbmRlcmluZywgeW91IG11c3Qgd3JhcCB5b3VyIGFwcGxpY2F0aW9uIGluIGFuIDxTU1JQcm92aWRlcj4gdG8gZW5zdXJlIGNvbnNpc3RlbnQgaWRzIGFyZSBnZW5lcmF0ZWQgYmV0d2VlbiB0aGUgY2xpZW50IGFuZCBzZXJ2ZXIuXCIpO1xuICAgIGxldCBjb3VudGVyID0gJGI1ZTI1N2Q1Njk2ODhhYzYkdmFyJHVzZUNvdW50ZXIoISFkZWZhdWx0SWQpO1xuICAgIGxldCBwcmVmaXggPSBjdHggPT09ICRiNWUyNTdkNTY5Njg4YWM2JHZhciRkZWZhdWx0Q29udGV4dCAmJiBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJ0ZXN0XCIgPyBcInJlYWN0LWFyaWFcIiA6IGByZWFjdC1hcmlhJHtjdHgucHJlZml4fWA7XG4gICAgcmV0dXJuIGRlZmF1bHRJZCB8fCBgJHtwcmVmaXh9LSR7Y291bnRlcn1gO1xufVxuZnVuY3Rpb24gJGI1ZTI1N2Q1Njk2ODhhYzYkdmFyJHVzZU1vZGVyblNTUlNhZmVJZChkZWZhdWx0SWQpIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgbGV0IGlkID0gKDAsICQ3M1NKeCRyZWFjdCkudXNlSWQoKTtcbiAgICBsZXQgW2RpZFNTUl0gPSAoMCwgJDczU0p4JHVzZVN0YXRlKSgkYjVlMjU3ZDU2OTY4OGFjNiRleHBvcnQkNTM1YmQ2Y2E3ZjkwYTI3MygpKTtcbiAgICBsZXQgcHJlZml4ID0gZGlkU1NSIHx8IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInRlc3RcIiA/IFwicmVhY3QtYXJpYVwiIDogYHJlYWN0LWFyaWEkeyRiNWUyNTdkNTY5Njg4YWM2JHZhciRkZWZhdWx0Q29udGV4dC5wcmVmaXh9YDtcbiAgICByZXR1cm4gZGVmYXVsdElkIHx8IGAke3ByZWZpeH0tJHtpZH1gO1xufVxuY29uc3QgJGI1ZTI1N2Q1Njk2ODhhYzYkZXhwb3J0JDYxOTUwMDk1OWZjNDhiMjYgPSB0eXBlb2YgKDAsICQ3M1NKeCRyZWFjdClbXCJ1c2VJZFwiXSA9PT0gXCJmdW5jdGlvblwiID8gJGI1ZTI1N2Q1Njk2ODhhYzYkdmFyJHVzZU1vZGVyblNTUlNhZmVJZCA6ICRiNWUyNTdkNTY5Njg4YWM2JHZhciR1c2VMZWdhY3lTU1JTYWZlSWQ7XG5mdW5jdGlvbiAkYjVlMjU3ZDU2OTY4OGFjNiR2YXIkZ2V0U25hcHNob3QoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gJGI1ZTI1N2Q1Njk2ODhhYzYkdmFyJGdldFNlcnZlclNuYXBzaG90KCkge1xuICAgIHJldHVybiB0cnVlO1xufVxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuZnVuY3Rpb24gJGI1ZTI1N2Q1Njk2ODhhYzYkdmFyJHN1YnNjcmliZShvblN0b3JlQ2hhbmdlKSB7XG4gICAgLy8gbm9vcFxuICAgIHJldHVybiAoKT0+e307XG59XG5mdW5jdGlvbiAkYjVlMjU3ZDU2OTY4OGFjNiRleHBvcnQkNTM1YmQ2Y2E3ZjkwYTI3MygpIHtcbiAgICAvLyBJbiBSZWFjdCAxOCwgd2UgY2FuIHVzZSB1c2VTeW5jRXh0ZXJuYWxTdG9yZSB0byBkZXRlY3QgaWYgd2UncmUgc2VydmVyIHJlbmRlcmluZyBvciBoeWRyYXRpbmcuXG4gICAgaWYgKHR5cGVvZiAoMCwgJDczU0p4JHJlYWN0KVtcInVzZVN5bmNFeHRlcm5hbFN0b3JlXCJdID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiAoMCwgJDczU0p4JHJlYWN0KVtcInVzZVN5bmNFeHRlcm5hbFN0b3JlXCJdKCRiNWUyNTdkNTY5Njg4YWM2JHZhciRzdWJzY3JpYmUsICRiNWUyNTdkNTY5Njg4YWM2JHZhciRnZXRTbmFwc2hvdCwgJGI1ZTI1N2Q1Njk2ODhhYzYkdmFyJGdldFNlcnZlclNuYXBzaG90KTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvcnVsZXMtb2YtaG9va3NcbiAgICByZXR1cm4gKDAsICQ3M1NKeCR1c2VDb250ZXh0KSgkYjVlMjU3ZDU2OTY4OGFjNiR2YXIkSXNTU1JDb250ZXh0KTtcbn1cblxuXG5cblxuZXhwb3J0IHskYjVlMjU3ZDU2OTY4OGFjNiRleHBvcnQkOWY4YWM5NmFmNGIxYjJhZSBhcyBTU1JQcm92aWRlciwgJGI1ZTI1N2Q1Njk2ODhhYzYkZXhwb3J0JDYxOTUwMDk1OWZjNDhiMjYgYXMgdXNlU1NSU2FmZUlkLCAkYjVlMjU3ZDU2OTY4OGFjNiRleHBvcnQkNTM1YmQ2Y2E3ZjkwYTI3MyBhcyB1c2VJc1NTUn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tb2R1bGUuanMubWFwXG4iLCJpbXBvcnQgeyB1c2VDb250ZXh0LCB1c2VDYWxsYmFjayB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZVNTUlNhZmVJZCB9IGZyb20gJy4vc3NyJztcbmltcG9ydCBEcm9wZG93bkNvbnRleHQgZnJvbSAnLi9Ecm9wZG93bkNvbnRleHQnO1xuaW1wb3J0IHsgRnJhZ21lbnQgYXMgX0ZyYWdtZW50IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuZXhwb3J0IGNvbnN0IGlzUm9sZU1lbnUgPSBlbCA9PiB7XG4gIHZhciBfZWwkZ2V0QXR0cmlidXRlO1xuICByZXR1cm4gKChfZWwkZ2V0QXR0cmlidXRlID0gZWwuZ2V0QXR0cmlidXRlKCdyb2xlJykpID09IG51bGwgPyB2b2lkIDAgOiBfZWwkZ2V0QXR0cmlidXRlLnRvTG93ZXJDYXNlKCkpID09PSAnbWVudSc7XG59O1xuY29uc3Qgbm9vcCA9ICgpID0+IHt9O1xuXG4vKipcbiAqIFdpcmVzIHVwIERyb3Bkb3duIHRvZ2dsZSBmdW5jdGlvbmFsaXR5LCByZXR1cm5pbmcgYSBzZXQgYSBwcm9wcyB0byBhdHRhY2hcbiAqIHRvIHRoZSBlbGVtZW50IHRoYXQgZnVuY3Rpb25zIGFzIHRoZSBkcm9wZG93biB0b2dnbGUgKGdlbmVyYWxseSBhIGJ1dHRvbikuXG4gKlxuICogQG1lbWJlck9mIERyb3Bkb3duXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VEcm9wZG93blRvZ2dsZSgpIHtcbiAgY29uc3QgaWQgPSB1c2VTU1JTYWZlSWQoKTtcbiAgY29uc3Qge1xuICAgIHNob3cgPSBmYWxzZSxcbiAgICB0b2dnbGUgPSBub29wLFxuICAgIHNldFRvZ2dsZSxcbiAgICBtZW51RWxlbWVudFxuICB9ID0gdXNlQ29udGV4dChEcm9wZG93bkNvbnRleHQpIHx8IHt9O1xuICBjb25zdCBoYW5kbGVDbGljayA9IHVzZUNhbGxiYWNrKGUgPT4ge1xuICAgIHRvZ2dsZSghc2hvdywgZSk7XG4gIH0sIFtzaG93LCB0b2dnbGVdKTtcbiAgY29uc3QgcHJvcHMgPSB7XG4gICAgaWQsXG4gICAgcmVmOiBzZXRUb2dnbGUgfHwgbm9vcCxcbiAgICBvbkNsaWNrOiBoYW5kbGVDbGljayxcbiAgICAnYXJpYS1leHBhbmRlZCc6ICEhc2hvd1xuICB9O1xuXG4gIC8vIFRoaXMgaXMgbWF5YmUgYmV0dGVyIGRvd24gaW4gYW4gZWZmZWN0LCBidXRcbiAgLy8gdGhlIGNvbXBvbmVudCBpcyBnb2luZyB0byB1cGRhdGUgYW55d2F5IHdoZW4gdGhlIG1lbnUgZWxlbWVudFxuICAvLyBpcyBzZXQgc28gbWlnaHQgcmV0dXJuIG5ldyBwcm9wcy5cbiAgaWYgKG1lbnVFbGVtZW50ICYmIGlzUm9sZU1lbnUobWVudUVsZW1lbnQpKSB7XG4gICAgcHJvcHNbJ2FyaWEtaGFzcG9wdXAnXSA9IHRydWU7XG4gIH1cbiAgcmV0dXJuIFtwcm9wcywge1xuICAgIHNob3csXG4gICAgdG9nZ2xlXG4gIH1dO1xufVxuLyoqXG4gKiBBbHNvIGV4cG9ydGVkIGFzIGA8RHJvcGRvd24uVG9nZ2xlPmAgZnJvbSBgRHJvcGRvd25gLlxuICpcbiAqIEBkaXNwbGF5TmFtZSBEcm9wZG93blRvZ2dsZVxuICogQG1lbWJlck9mIERyb3Bkb3duXG4gKi9cbmZ1bmN0aW9uIERyb3Bkb3duVG9nZ2xlKHtcbiAgY2hpbGRyZW5cbn0pIHtcbiAgY29uc3QgW3Byb3BzLCBtZXRhXSA9IHVzZURyb3Bkb3duVG9nZ2xlKCk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChfRnJhZ21lbnQsIHtcbiAgICBjaGlsZHJlbjogY2hpbGRyZW4ocHJvcHMsIG1ldGEpXG4gIH0pO1xufVxuRHJvcGRvd25Ub2dnbGUuZGlzcGxheU5hbWUgPSAnRHJvcGRvd25Ub2dnbGUnO1xuXG4vKiogQGNvbXBvbmVudCAqL1xuZXhwb3J0IGRlZmF1bHQgRHJvcGRvd25Ub2dnbGU7IiwiY29uc3QgX2V4Y2x1ZGVkID0gW1wiZXZlbnRLZXlcIiwgXCJkaXNhYmxlZFwiLCBcIm9uQ2xpY2tcIiwgXCJhY3RpdmVcIiwgXCJhc1wiXTtcbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpIHsgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307IHZhciB0YXJnZXQgPSB7fTsgdmFyIHNvdXJjZUtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpOyB2YXIga2V5LCBpOyBmb3IgKGkgPSAwOyBpIDwgc291cmNlS2V5cy5sZW5ndGg7IGkrKykgeyBrZXkgPSBzb3VyY2VLZXlzW2ldOyBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlOyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IHJldHVybiB0YXJnZXQ7IH1cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdXNlRXZlbnRDYWxsYmFjayBmcm9tICdAcmVzdGFydC9ob29rcy91c2VFdmVudENhbGxiYWNrJztcbmltcG9ydCBTZWxlY3RhYmxlQ29udGV4dCwgeyBtYWtlRXZlbnRLZXkgfSBmcm9tICcuL1NlbGVjdGFibGVDb250ZXh0JztcbmltcG9ydCBOYXZDb250ZXh0IGZyb20gJy4vTmF2Q29udGV4dCc7XG5pbXBvcnQgQnV0dG9uIGZyb20gJy4vQnV0dG9uJztcbmltcG9ydCB7IGRhdGFBdHRyIH0gZnJvbSAnLi9EYXRhS2V5JztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG4vKipcbiAqIENyZWF0ZSBhIGRyb3Bkb3duIGl0ZW0uIFJldHVybnMgYSBzZXQgb2YgcHJvcHMgZm9yIHRoZSBkcm9wZG93biBpdGVtIGNvbXBvbmVudFxuICogaW5jbHVkaW5nIGFuIGBvbkNsaWNrYCBoYW5kbGVyIHRoYXQgcHJldmVudHMgc2VsZWN0aW9uIHdoZW4gdGhlIGl0ZW0gaXMgZGlzYWJsZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZURyb3Bkb3duSXRlbSh7XG4gIGtleSxcbiAgaHJlZixcbiAgYWN0aXZlLFxuICBkaXNhYmxlZCxcbiAgb25DbGlja1xufSkge1xuICBjb25zdCBvblNlbGVjdEN0eCA9IHVzZUNvbnRleHQoU2VsZWN0YWJsZUNvbnRleHQpO1xuICBjb25zdCBuYXZDb250ZXh0ID0gdXNlQ29udGV4dChOYXZDb250ZXh0KTtcbiAgY29uc3Qge1xuICAgIGFjdGl2ZUtleVxuICB9ID0gbmF2Q29udGV4dCB8fCB7fTtcbiAgY29uc3QgZXZlbnRLZXkgPSBtYWtlRXZlbnRLZXkoa2V5LCBocmVmKTtcbiAgY29uc3QgaXNBY3RpdmUgPSBhY3RpdmUgPT0gbnVsbCAmJiBrZXkgIT0gbnVsbCA/IG1ha2VFdmVudEtleShhY3RpdmVLZXkpID09PSBldmVudEtleSA6IGFjdGl2ZTtcbiAgY29uc3QgaGFuZGxlQ2xpY2sgPSB1c2VFdmVudENhbGxiYWNrKGV2ZW50ID0+IHtcbiAgICBpZiAoZGlzYWJsZWQpIHJldHVybjtcbiAgICBvbkNsaWNrID09IG51bGwgPyB2b2lkIDAgOiBvbkNsaWNrKGV2ZW50KTtcbiAgICBpZiAob25TZWxlY3RDdHggJiYgIWV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpIHtcbiAgICAgIG9uU2VsZWN0Q3R4KGV2ZW50S2V5LCBldmVudCk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIFt7XG4gICAgb25DbGljazogaGFuZGxlQ2xpY2ssXG4gICAgJ2FyaWEtZGlzYWJsZWQnOiBkaXNhYmxlZCB8fCB1bmRlZmluZWQsXG4gICAgJ2FyaWEtc2VsZWN0ZWQnOiBpc0FjdGl2ZSxcbiAgICBbZGF0YUF0dHIoJ2Ryb3Bkb3duLWl0ZW0nKV06ICcnXG4gIH0sIHtcbiAgICBpc0FjdGl2ZVxuICB9XTtcbn1cbmNvbnN0IERyb3Bkb3duSXRlbSA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKChfcmVmLCByZWYpID0+IHtcbiAgbGV0IHtcbiAgICAgIGV2ZW50S2V5LFxuICAgICAgZGlzYWJsZWQsXG4gICAgICBvbkNsaWNrLFxuICAgICAgYWN0aXZlLFxuICAgICAgYXM6IENvbXBvbmVudCA9IEJ1dHRvblxuICAgIH0gPSBfcmVmLFxuICAgIHByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UoX3JlZiwgX2V4Y2x1ZGVkKTtcbiAgY29uc3QgW2Ryb3Bkb3duSXRlbVByb3BzXSA9IHVzZURyb3Bkb3duSXRlbSh7XG4gICAga2V5OiBldmVudEtleSxcbiAgICBocmVmOiBwcm9wcy5ocmVmLFxuICAgIGRpc2FibGVkLFxuICAgIG9uQ2xpY2ssXG4gICAgYWN0aXZlXG4gIH0pO1xuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goQ29tcG9uZW50LCBPYmplY3QuYXNzaWduKHt9LCBwcm9wcywge1xuICAgIHJlZjogcmVmXG4gIH0sIGRyb3Bkb3duSXRlbVByb3BzKSk7XG59KTtcbkRyb3Bkb3duSXRlbS5kaXNwbGF5TmFtZSA9ICdEcm9wZG93bkl0ZW0nO1xuZXhwb3J0IGRlZmF1bHQgRHJvcGRvd25JdGVtOyIsImltcG9ydCBxc2EgZnJvbSAnZG9tLWhlbHBlcnMvcXVlcnlTZWxlY3RvckFsbCc7XG5pbXBvcnQgYWRkRXZlbnRMaXN0ZW5lciBmcm9tICdkb20taGVscGVycy9hZGRFdmVudExpc3RlbmVyJztcbmltcG9ydCB7IHVzZUNhbGxiYWNrLCB1c2VSZWYsIHVzZUVmZmVjdCwgdXNlTWVtbywgdXNlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZVVuY29udHJvbGxlZFByb3AgfSBmcm9tICd1bmNvbnRyb2xsYWJsZSc7XG5pbXBvcnQgdXNlUHJldmlvdXMgZnJvbSAnQHJlc3RhcnQvaG9va3MvdXNlUHJldmlvdXMnO1xuaW1wb3J0IHVzZUZvcmNlVXBkYXRlIGZyb20gJ0ByZXN0YXJ0L2hvb2tzL3VzZUZvcmNlVXBkYXRlJztcbmltcG9ydCB1c2VFdmVudExpc3RlbmVyIGZyb20gJ0ByZXN0YXJ0L2hvb2tzL3VzZUV2ZW50TGlzdGVuZXInO1xuaW1wb3J0IHVzZUV2ZW50Q2FsbGJhY2sgZnJvbSAnQHJlc3RhcnQvaG9va3MvdXNlRXZlbnRDYWxsYmFjayc7XG5pbXBvcnQgRHJvcGRvd25Db250ZXh0IGZyb20gJy4vRHJvcGRvd25Db250ZXh0JztcbmltcG9ydCBEcm9wZG93bk1lbnUgZnJvbSAnLi9Ecm9wZG93bk1lbnUnO1xuaW1wb3J0IERyb3Bkb3duVG9nZ2xlLCB7IGlzUm9sZU1lbnUgfSBmcm9tICcuL0Ryb3Bkb3duVG9nZ2xlJztcbmltcG9ydCBEcm9wZG93bkl0ZW0gZnJvbSAnLi9Ecm9wZG93bkl0ZW0nO1xuaW1wb3J0IFNlbGVjdGFibGVDb250ZXh0IGZyb20gJy4vU2VsZWN0YWJsZUNvbnRleHQnO1xuaW1wb3J0IHsgZGF0YUF0dHIgfSBmcm9tICcuL0RhdGFLZXknO1xuaW1wb3J0IHVzZVdpbmRvdyBmcm9tICcuL3VzZVdpbmRvdyc7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuZnVuY3Rpb24gdXNlUmVmV2l0aFVwZGF0ZSgpIHtcbiAgY29uc3QgZm9yY2VVcGRhdGUgPSB1c2VGb3JjZVVwZGF0ZSgpO1xuICBjb25zdCByZWYgPSB1c2VSZWYobnVsbCk7XG4gIGNvbnN0IGF0dGFjaFJlZiA9IHVzZUNhbGxiYWNrKGVsZW1lbnQgPT4ge1xuICAgIHJlZi5jdXJyZW50ID0gZWxlbWVudDtcbiAgICAvLyBlbnN1cmUgdGhhdCBhIG1lbnUgc2V0IHRyaWdnZXJzIGFuIHVwZGF0ZSBmb3IgY29uc3VtZXJzXG4gICAgZm9yY2VVcGRhdGUoKTtcbiAgfSwgW2ZvcmNlVXBkYXRlXSk7XG4gIHJldHVybiBbcmVmLCBhdHRhY2hSZWZdO1xufVxuXG4vKipcbiAqIEBkaXNwbGF5TmFtZSBEcm9wZG93blxuICogQHB1YmxpY1xuICovXG5mdW5jdGlvbiBEcm9wZG93bih7XG4gIGRlZmF1bHRTaG93LFxuICBzaG93OiByYXdTaG93LFxuICBvblNlbGVjdCxcbiAgb25Ub2dnbGU6IHJhd09uVG9nZ2xlLFxuICBpdGVtU2VsZWN0b3IgPSBgKiBbJHtkYXRhQXR0cignZHJvcGRvd24taXRlbScpfV1gLFxuICBmb2N1c0ZpcnN0SXRlbU9uU2hvdyxcbiAgcGxhY2VtZW50ID0gJ2JvdHRvbS1zdGFydCcsXG4gIGNoaWxkcmVuXG59KSB7XG4gIGNvbnN0IHdpbmRvdyA9IHVzZVdpbmRvdygpO1xuICBjb25zdCBbc2hvdywgb25Ub2dnbGVdID0gdXNlVW5jb250cm9sbGVkUHJvcChyYXdTaG93LCBkZWZhdWx0U2hvdywgcmF3T25Ub2dnbGUpO1xuXG4gIC8vIFdlIHVzZSBub3JtYWwgcmVmcyBpbnN0ZWFkIG9mIHVzZUNhbGxiYWNrUmVmIGluIG9yZGVyIHRvIHBvcHVsYXRlIHRoZVxuICAvLyB0aGUgdmFsdWUgYXMgcXVpY2tseSBhcyBwb3NzaWJsZSwgb3RoZXJ3aXNlIHRoZSBlZmZlY3QgdG8gZm9jdXMgdGhlIGVsZW1lbnRcbiAgLy8gbWF5IHJ1biBiZWZvcmUgdGhlIHN0YXRlIHZhbHVlIGlzIHNldFxuICBjb25zdCBbbWVudVJlZiwgc2V0TWVudV0gPSB1c2VSZWZXaXRoVXBkYXRlKCk7XG4gIGNvbnN0IG1lbnVFbGVtZW50ID0gbWVudVJlZi5jdXJyZW50O1xuICBjb25zdCBbdG9nZ2xlUmVmLCBzZXRUb2dnbGVdID0gdXNlUmVmV2l0aFVwZGF0ZSgpO1xuICBjb25zdCB0b2dnbGVFbGVtZW50ID0gdG9nZ2xlUmVmLmN1cnJlbnQ7XG4gIGNvbnN0IGxhc3RTaG93ID0gdXNlUHJldmlvdXMoc2hvdyk7XG4gIGNvbnN0IGxhc3RTb3VyY2VFdmVudCA9IHVzZVJlZihudWxsKTtcbiAgY29uc3QgZm9jdXNJbkRyb3Bkb3duID0gdXNlUmVmKGZhbHNlKTtcbiAgY29uc3Qgb25TZWxlY3RDdHggPSB1c2VDb250ZXh0KFNlbGVjdGFibGVDb250ZXh0KTtcbiAgY29uc3QgdG9nZ2xlID0gdXNlQ2FsbGJhY2soKG5leHRTaG93LCBldmVudCwgc291cmNlID0gZXZlbnQgPT0gbnVsbCA/IHZvaWQgMCA6IGV2ZW50LnR5cGUpID0+IHtcbiAgICBvblRvZ2dsZShuZXh0U2hvdywge1xuICAgICAgb3JpZ2luYWxFdmVudDogZXZlbnQsXG4gICAgICBzb3VyY2VcbiAgICB9KTtcbiAgfSwgW29uVG9nZ2xlXSk7XG4gIGNvbnN0IGhhbmRsZVNlbGVjdCA9IHVzZUV2ZW50Q2FsbGJhY2soKGtleSwgZXZlbnQpID0+IHtcbiAgICBvblNlbGVjdCA9PSBudWxsID8gdm9pZCAwIDogb25TZWxlY3Qoa2V5LCBldmVudCk7XG4gICAgdG9nZ2xlKGZhbHNlLCBldmVudCwgJ3NlbGVjdCcpO1xuICAgIGlmICghZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSkge1xuICAgICAgb25TZWxlY3RDdHggPT0gbnVsbCA/IHZvaWQgMCA6IG9uU2VsZWN0Q3R4KGtleSwgZXZlbnQpO1xuICAgIH1cbiAgfSk7XG4gIGNvbnN0IGNvbnRleHQgPSB1c2VNZW1vKCgpID0+ICh7XG4gICAgdG9nZ2xlLFxuICAgIHBsYWNlbWVudCxcbiAgICBzaG93LFxuICAgIG1lbnVFbGVtZW50LFxuICAgIHRvZ2dsZUVsZW1lbnQsXG4gICAgc2V0TWVudSxcbiAgICBzZXRUb2dnbGVcbiAgfSksIFt0b2dnbGUsIHBsYWNlbWVudCwgc2hvdywgbWVudUVsZW1lbnQsIHRvZ2dsZUVsZW1lbnQsIHNldE1lbnUsIHNldFRvZ2dsZV0pO1xuICBpZiAobWVudUVsZW1lbnQgJiYgbGFzdFNob3cgJiYgIXNob3cpIHtcbiAgICBmb2N1c0luRHJvcGRvd24uY3VycmVudCA9IG1lbnVFbGVtZW50LmNvbnRhaW5zKG1lbnVFbGVtZW50Lm93bmVyRG9jdW1lbnQuYWN0aXZlRWxlbWVudCk7XG4gIH1cbiAgY29uc3QgZm9jdXNUb2dnbGUgPSB1c2VFdmVudENhbGxiYWNrKCgpID0+IHtcbiAgICBpZiAodG9nZ2xlRWxlbWVudCAmJiB0b2dnbGVFbGVtZW50LmZvY3VzKSB7XG4gICAgICB0b2dnbGVFbGVtZW50LmZvY3VzKCk7XG4gICAgfVxuICB9KTtcbiAgY29uc3QgbWF5YmVGb2N1c0ZpcnN0ID0gdXNlRXZlbnRDYWxsYmFjaygoKSA9PiB7XG4gICAgY29uc3QgdHlwZSA9IGxhc3RTb3VyY2VFdmVudC5jdXJyZW50O1xuICAgIGxldCBmb2N1c1R5cGUgPSBmb2N1c0ZpcnN0SXRlbU9uU2hvdztcbiAgICBpZiAoZm9jdXNUeXBlID09IG51bGwpIHtcbiAgICAgIGZvY3VzVHlwZSA9IG1lbnVSZWYuY3VycmVudCAmJiBpc1JvbGVNZW51KG1lbnVSZWYuY3VycmVudCkgPyAna2V5Ym9hcmQnIDogZmFsc2U7XG4gICAgfVxuICAgIGlmIChmb2N1c1R5cGUgPT09IGZhbHNlIHx8IGZvY3VzVHlwZSA9PT0gJ2tleWJvYXJkJyAmJiAhL15rZXkuKyQvLnRlc3QodHlwZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZmlyc3QgPSBxc2EobWVudVJlZi5jdXJyZW50LCBpdGVtU2VsZWN0b3IpWzBdO1xuICAgIGlmIChmaXJzdCAmJiBmaXJzdC5mb2N1cykgZmlyc3QuZm9jdXMoKTtcbiAgfSk7XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHNob3cpIG1heWJlRm9jdXNGaXJzdCgpO2Vsc2UgaWYgKGZvY3VzSW5Ecm9wZG93bi5jdXJyZW50KSB7XG4gICAgICBmb2N1c0luRHJvcGRvd24uY3VycmVudCA9IGZhbHNlO1xuICAgICAgZm9jdXNUb2dnbGUoKTtcbiAgICB9XG4gICAgLy8gb25seSBgc2hvd2Agc2hvdWxkIGJlIGNoYW5naW5nXG4gIH0sIFtzaG93LCBmb2N1c0luRHJvcGRvd24sIGZvY3VzVG9nZ2xlLCBtYXliZUZvY3VzRmlyc3RdKTtcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBsYXN0U291cmNlRXZlbnQuY3VycmVudCA9IG51bGw7XG4gIH0pO1xuICBjb25zdCBnZXROZXh0Rm9jdXNlZENoaWxkID0gKGN1cnJlbnQsIG9mZnNldCkgPT4ge1xuICAgIGlmICghbWVudVJlZi5jdXJyZW50KSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBpdGVtcyA9IHFzYShtZW51UmVmLmN1cnJlbnQsIGl0ZW1TZWxlY3Rvcik7XG4gICAgbGV0IGluZGV4ID0gaXRlbXMuaW5kZXhPZihjdXJyZW50KSArIG9mZnNldDtcbiAgICBpbmRleCA9IE1hdGgubWF4KDAsIE1hdGgubWluKGluZGV4LCBpdGVtcy5sZW5ndGgpKTtcbiAgICByZXR1cm4gaXRlbXNbaW5kZXhdO1xuICB9O1xuICB1c2VFdmVudExpc3RlbmVyKHVzZUNhbGxiYWNrKCgpID0+IHdpbmRvdy5kb2N1bWVudCwgW3dpbmRvd10pLCAna2V5ZG93bicsIGV2ZW50ID0+IHtcbiAgICB2YXIgX21lbnVSZWYkY3VycmVudCwgX3RvZ2dsZVJlZiRjdXJyZW50O1xuICAgIGNvbnN0IHtcbiAgICAgIGtleVxuICAgIH0gPSBldmVudDtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG4gICAgY29uc3QgZnJvbU1lbnUgPSAoX21lbnVSZWYkY3VycmVudCA9IG1lbnVSZWYuY3VycmVudCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9tZW51UmVmJGN1cnJlbnQuY29udGFpbnModGFyZ2V0KTtcbiAgICBjb25zdCBmcm9tVG9nZ2xlID0gKF90b2dnbGVSZWYkY3VycmVudCA9IHRvZ2dsZVJlZi5jdXJyZW50KSA9PSBudWxsID8gdm9pZCAwIDogX3RvZ2dsZVJlZiRjdXJyZW50LmNvbnRhaW5zKHRhcmdldCk7XG5cbiAgICAvLyBTZWNvbmQgb25seSB0byBodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi84Y2ZiZjY5MzNiOGEwMTQ2YWMzZmJjMzY5ZjE5ZTUyMGJkMWViZGFjL2pzL3NyYy9kcm9wZG93bi5qcyNMNDAwXG4gICAgLy8gaW4gaW5zY3J1dGFiaWxpdHlcbiAgICBjb25zdCBpc0lucHV0ID0gL2lucHV0fHRleHRhcmVhL2kudGVzdCh0YXJnZXQudGFnTmFtZSk7XG4gICAgaWYgKGlzSW5wdXQgJiYgKGtleSA9PT0gJyAnIHx8IGtleSAhPT0gJ0VzY2FwZScgJiYgZnJvbU1lbnUgfHwga2V5ID09PSAnRXNjYXBlJyAmJiB0YXJnZXQudHlwZSA9PT0gJ3NlYXJjaCcpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghZnJvbU1lbnUgJiYgIWZyb21Ub2dnbGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGtleSA9PT0gJ1RhYicgJiYgKCFtZW51UmVmLmN1cnJlbnQgfHwgIXNob3cpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxhc3RTb3VyY2VFdmVudC5jdXJyZW50ID0gZXZlbnQudHlwZTtcbiAgICBjb25zdCBtZXRhID0ge1xuICAgICAgb3JpZ2luYWxFdmVudDogZXZlbnQsXG4gICAgICBzb3VyY2U6IGV2ZW50LnR5cGVcbiAgICB9O1xuICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICBjYXNlICdBcnJvd1VwJzpcbiAgICAgICAge1xuICAgICAgICAgIGNvbnN0IG5leHQgPSBnZXROZXh0Rm9jdXNlZENoaWxkKHRhcmdldCwgLTEpO1xuICAgICAgICAgIGlmIChuZXh0ICYmIG5leHQuZm9jdXMpIG5leHQuZm9jdXMoKTtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgaWYgKCFzaG93KSB7XG4gICAgICAgICAgb25Ub2dnbGUodHJ1ZSwgbWV0YSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgbmV4dCA9IGdldE5leHRGb2N1c2VkQ2hpbGQodGFyZ2V0LCAxKTtcbiAgICAgICAgICBpZiAobmV4dCAmJiBuZXh0LmZvY3VzKSBuZXh0LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgY2FzZSAnVGFiJzpcbiAgICAgICAgLy8gb24ga2V5ZG93biB0aGUgdGFyZ2V0IGlzIHRoZSBlbGVtZW50IGJlaW5nIHRhYmJlZCBGUk9NLCB3ZSBuZWVkIHRoYXRcbiAgICAgICAgLy8gdG8ga25vdyBpZiB0aGlzIGV2ZW50IGlzIHJlbGV2YW50IHRvIHRoaXMgZHJvcGRvd24gKGUuZy4gaW4gdGhpcyBtZW51KS5cbiAgICAgICAgLy8gT24gYGtleXVwYCB0aGUgdGFyZ2V0IGlzIHRoZSBlbGVtZW50IGJlaW5nIHRhZ2dlZCBUTyB3aGljaCB3ZSB1c2UgdG8gY2hlY2tcbiAgICAgICAgLy8gaWYgZm9jdXMgaGFzIGxlZnQgdGhlIG1lbnVcbiAgICAgICAgYWRkRXZlbnRMaXN0ZW5lcih0YXJnZXQub3duZXJEb2N1bWVudCwgJ2tleXVwJywgZSA9PiB7XG4gICAgICAgICAgdmFyIF9tZW51UmVmJGN1cnJlbnQyO1xuICAgICAgICAgIGlmIChlLmtleSA9PT0gJ1RhYicgJiYgIWUudGFyZ2V0IHx8ICEoKF9tZW51UmVmJGN1cnJlbnQyID0gbWVudVJlZi5jdXJyZW50KSAhPSBudWxsICYmIF9tZW51UmVmJGN1cnJlbnQyLmNvbnRhaW5zKGUudGFyZ2V0KSkpIHtcbiAgICAgICAgICAgIG9uVG9nZ2xlKGZhbHNlLCBtZXRhKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIHtcbiAgICAgICAgICBvbmNlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0VzY2FwZSc6XG4gICAgICAgIGlmIChrZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgfVxuICAgICAgICBvblRvZ2dsZShmYWxzZSwgbWV0YSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goU2VsZWN0YWJsZUNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogaGFuZGxlU2VsZWN0LFxuICAgIGNoaWxkcmVuOiAvKiNfX1BVUkVfXyovX2pzeChEcm9wZG93bkNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICAgIHZhbHVlOiBjb250ZXh0LFxuICAgICAgY2hpbGRyZW46IGNoaWxkcmVuXG4gICAgfSlcbiAgfSk7XG59XG5Ecm9wZG93bi5kaXNwbGF5TmFtZSA9ICdEcm9wZG93bic7XG5Ecm9wZG93bi5NZW51ID0gRHJvcGRvd25NZW51O1xuRHJvcGRvd24uVG9nZ2xlID0gRHJvcGRvd25Ub2dnbGU7XG5Ecm9wZG93bi5JdGVtID0gRHJvcGRvd25JdGVtO1xuZXhwb3J0IGRlZmF1bHQgRHJvcGRvd247IiwiXCJ1c2UgY2xpZW50XCI7XG5cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmNvbnN0IERyb3Bkb3duQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KHt9KTtcbkRyb3Bkb3duQ29udGV4dC5kaXNwbGF5TmFtZSA9ICdEcm9wZG93bkNvbnRleHQnO1xuZXhwb3J0IGRlZmF1bHQgRHJvcGRvd25Db250ZXh0OyIsIlwidXNlIGNsaWVudFwiO1xuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB7IHVzZUJvb3RzdHJhcFByZWZpeCB9IGZyb20gJy4vVGhlbWVQcm92aWRlcic7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgRHJvcGRvd25EaXZpZGVyID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHtcbiAgY2xhc3NOYW1lLFxuICBic1ByZWZpeCxcbiAgYXM6IENvbXBvbmVudCA9ICdocicsXG4gIHJvbGUgPSAnc2VwYXJhdG9yJyxcbiAgLi4ucHJvcHNcbn0sIHJlZikgPT4ge1xuICBic1ByZWZpeCA9IHVzZUJvb3RzdHJhcFByZWZpeChic1ByZWZpeCwgJ2Ryb3Bkb3duLWRpdmlkZXInKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KENvbXBvbmVudCwge1xuICAgIHJlZjogcmVmLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjbGFzc05hbWUsIGJzUHJlZml4KSxcbiAgICByb2xlOiByb2xlLFxuICAgIC4uLnByb3BzXG4gIH0pO1xufSk7XG5Ecm9wZG93bkRpdmlkZXIuZGlzcGxheU5hbWUgPSAnRHJvcGRvd25EaXZpZGVyJztcbmV4cG9ydCBkZWZhdWx0IERyb3Bkb3duRGl2aWRlcjsiLCJcInVzZSBjbGllbnRcIjtcblxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgeyB1c2VCb290c3RyYXBQcmVmaXggfSBmcm9tICcuL1RoZW1lUHJvdmlkZXInO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmNvbnN0IERyb3Bkb3duSGVhZGVyID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHtcbiAgY2xhc3NOYW1lLFxuICBic1ByZWZpeCxcbiAgYXM6IENvbXBvbmVudCA9ICdkaXYnLFxuICByb2xlID0gJ2hlYWRpbmcnLFxuICAuLi5wcm9wc1xufSwgcmVmKSA9PiB7XG4gIGJzUHJlZml4ID0gdXNlQm9vdHN0cmFwUHJlZml4KGJzUHJlZml4LCAnZHJvcGRvd24taGVhZGVyJyk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChDb21wb25lbnQsIHtcbiAgICByZWY6IHJlZixcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoY2xhc3NOYW1lLCBic1ByZWZpeCksXG4gICAgcm9sZTogcm9sZSxcbiAgICAuLi5wcm9wc1xuICB9KTtcbn0pO1xuRHJvcGRvd25IZWFkZXIuZGlzcGxheU5hbWUgPSAnRHJvcGRvd25IZWFkZXInO1xuZXhwb3J0IGRlZmF1bHQgRHJvcGRvd25IZWFkZXI7IiwiXCJ1c2UgY2xpZW50XCI7XG5cbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlRHJvcGRvd25JdGVtIH0gZnJvbSAnQHJlc3RhcnQvdWkvRHJvcGRvd25JdGVtJztcbmltcG9ydCBBbmNob3IgZnJvbSAnQHJlc3RhcnQvdWkvQW5jaG9yJztcbmltcG9ydCB7IHVzZUJvb3RzdHJhcFByZWZpeCB9IGZyb20gJy4vVGhlbWVQcm92aWRlcic7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgRHJvcGRvd25JdGVtID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHtcbiAgYnNQcmVmaXgsXG4gIGNsYXNzTmFtZSxcbiAgZXZlbnRLZXksXG4gIGRpc2FibGVkID0gZmFsc2UsXG4gIG9uQ2xpY2ssXG4gIGFjdGl2ZSxcbiAgYXM6IENvbXBvbmVudCA9IEFuY2hvcixcbiAgLi4ucHJvcHNcbn0sIHJlZikgPT4ge1xuICBjb25zdCBwcmVmaXggPSB1c2VCb290c3RyYXBQcmVmaXgoYnNQcmVmaXgsICdkcm9wZG93bi1pdGVtJyk7XG4gIGNvbnN0IFtkcm9wZG93bkl0ZW1Qcm9wcywgbWV0YV0gPSB1c2VEcm9wZG93bkl0ZW0oe1xuICAgIGtleTogZXZlbnRLZXksXG4gICAgaHJlZjogcHJvcHMuaHJlZixcbiAgICBkaXNhYmxlZCxcbiAgICBvbkNsaWNrLFxuICAgIGFjdGl2ZVxuICB9KTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KENvbXBvbmVudCwge1xuICAgIC4uLnByb3BzLFxuICAgIC4uLmRyb3Bkb3duSXRlbVByb3BzLFxuICAgIHJlZjogcmVmLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjbGFzc05hbWUsIHByZWZpeCwgbWV0YS5pc0FjdGl2ZSAmJiAnYWN0aXZlJywgZGlzYWJsZWQgJiYgJ2Rpc2FibGVkJylcbiAgfSk7XG59KTtcbkRyb3Bkb3duSXRlbS5kaXNwbGF5TmFtZSA9ICdEcm9wZG93bkl0ZW0nO1xuZXhwb3J0IGRlZmF1bHQgRHJvcGRvd25JdGVtOyIsIlwidXNlIGNsaWVudFwiO1xuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB7IHVzZUJvb3RzdHJhcFByZWZpeCB9IGZyb20gJy4vVGhlbWVQcm92aWRlcic7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgRHJvcGRvd25JdGVtVGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKCh7XG4gIGNsYXNzTmFtZSxcbiAgYnNQcmVmaXgsXG4gIGFzOiBDb21wb25lbnQgPSAnc3BhbicsXG4gIC4uLnByb3BzXG59LCByZWYpID0+IHtcbiAgYnNQcmVmaXggPSB1c2VCb290c3RyYXBQcmVmaXgoYnNQcmVmaXgsICdkcm9wZG93bi1pdGVtLXRleHQnKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KENvbXBvbmVudCwge1xuICAgIHJlZjogcmVmLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjbGFzc05hbWUsIGJzUHJlZml4KSxcbiAgICAuLi5wcm9wc1xuICB9KTtcbn0pO1xuRHJvcGRvd25JdGVtVGV4dC5kaXNwbGF5TmFtZSA9ICdEcm9wZG93bkl0ZW1UZXh0JztcbmV4cG9ydCBkZWZhdWx0IERyb3Bkb3duSXRlbVRleHQ7IiwiXCJ1c2UgY2xpZW50XCI7XG5cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmNvbnN0IGNvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcbmNvbnRleHQuZGlzcGxheU5hbWUgPSAnSW5wdXRHcm91cENvbnRleHQnO1xuZXhwb3J0IGRlZmF1bHQgY29udGV4dDsiLCJpbXBvcnQgaW52YXJpYW50IGZyb20gJ2ludmFyaWFudCc7XG5pbXBvcnQgeyB1c2VDYWxsYmFjayB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB1c2VNZXJnZWRSZWZzIGZyb20gJ0ByZXN0YXJ0L2hvb2tzL3VzZU1lcmdlZFJlZnMnO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlV3JhcHBlZFJlZldpdGhXYXJuaW5nKHJlZiwgY29tcG9uZW50TmFtZSkge1xuICAvLyBAdHMtaWdub3JlXG4gIGlmICghKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHJldHVybiByZWY7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL3J1bGVzLW9mLWhvb2tzXG4gIGNvbnN0IHdhcm5pbmdSZWYgPSB1c2VDYWxsYmFjayhyZWZWYWx1ZSA9PiB7XG4gICAgIShyZWZWYWx1ZSA9PSBudWxsIHx8ICFyZWZWYWx1ZS5pc1JlYWN0Q29tcG9uZW50KSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IGludmFyaWFudChmYWxzZSwgYCR7Y29tcG9uZW50TmFtZX0gaW5qZWN0ZWQgYSByZWYgdG8gYSBwcm92aWRlZCBcXGBhc1xcYCBjb21wb25lbnQgdGhhdCByZXNvbHZlZCB0byBhIGNvbXBvbmVudCBpbnN0YW5jZSBpbnN0ZWFkIG9mIGEgRE9NIGVsZW1lbnQuIGAgKyAnVXNlIGBSZWFjdC5mb3J3YXJkUmVmYCB0byBwcm92aWRlIHRoZSBpbmplY3RlZCByZWYgdG8gdGhlIGNsYXNzIGNvbXBvbmVudCBhcyBhIHByb3AgaW4gb3JkZXIgdG8gcGFzcyBpdCBkaXJlY3RseSB0byBhIERPTSBlbGVtZW50JykgOiBpbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICB9LCBbY29tcG9uZW50TmFtZV0pO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvcnVsZXMtb2YtaG9va3NcbiAgcmV0dXJuIHVzZU1lcmdlZFJlZnMod2FybmluZ1JlZiwgcmVmKTtcbn0iLCJcInVzZSBjbGllbnRcIjtcblxuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VDb250ZXh0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlRHJvcGRvd25NZW51IH0gZnJvbSAnQHJlc3RhcnQvdWkvRHJvcGRvd25NZW51JztcbmltcG9ydCB1c2VJc29tb3JwaGljRWZmZWN0IGZyb20gJ0ByZXN0YXJ0L2hvb2tzL3VzZUlzb21vcnBoaWNFZmZlY3QnO1xuaW1wb3J0IHVzZU1lcmdlZFJlZnMgZnJvbSAnQHJlc3RhcnQvaG9va3MvdXNlTWVyZ2VkUmVmcyc7XG5pbXBvcnQgd2FybmluZyBmcm9tICd3YXJuaW5nJztcbmltcG9ydCBEcm9wZG93bkNvbnRleHQgZnJvbSAnLi9Ecm9wZG93bkNvbnRleHQnO1xuaW1wb3J0IElucHV0R3JvdXBDb250ZXh0IGZyb20gJy4vSW5wdXRHcm91cENvbnRleHQnO1xuaW1wb3J0IE5hdmJhckNvbnRleHQgZnJvbSAnLi9OYXZiYXJDb250ZXh0JztcbmltcG9ydCB7IHVzZUJvb3RzdHJhcFByZWZpeCB9IGZyb20gJy4vVGhlbWVQcm92aWRlcic7XG5pbXBvcnQgdXNlV3JhcHBlZFJlZldpdGhXYXJuaW5nIGZyb20gJy4vdXNlV3JhcHBlZFJlZldpdGhXYXJuaW5nJztcbmltcG9ydCB7IGFsaWduUHJvcFR5cGUgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5leHBvcnQgZnVuY3Rpb24gZ2V0RHJvcGRvd25NZW51UGxhY2VtZW50KGFsaWduRW5kLCBkcm9wRGlyZWN0aW9uLCBpc1JUTCkge1xuICBjb25zdCB0b3BTdGFydCA9IGlzUlRMID8gJ3RvcC1lbmQnIDogJ3RvcC1zdGFydCc7XG4gIGNvbnN0IHRvcEVuZCA9IGlzUlRMID8gJ3RvcC1zdGFydCcgOiAndG9wLWVuZCc7XG4gIGNvbnN0IGJvdHRvbVN0YXJ0ID0gaXNSVEwgPyAnYm90dG9tLWVuZCcgOiAnYm90dG9tLXN0YXJ0JztcbiAgY29uc3QgYm90dG9tRW5kID0gaXNSVEwgPyAnYm90dG9tLXN0YXJ0JyA6ICdib3R0b20tZW5kJztcbiAgY29uc3QgbGVmdFN0YXJ0ID0gaXNSVEwgPyAncmlnaHQtc3RhcnQnIDogJ2xlZnQtc3RhcnQnO1xuICBjb25zdCBsZWZ0RW5kID0gaXNSVEwgPyAncmlnaHQtZW5kJyA6ICdsZWZ0LWVuZCc7XG4gIGNvbnN0IHJpZ2h0U3RhcnQgPSBpc1JUTCA/ICdsZWZ0LXN0YXJ0JyA6ICdyaWdodC1zdGFydCc7XG4gIGNvbnN0IHJpZ2h0RW5kID0gaXNSVEwgPyAnbGVmdC1lbmQnIDogJ3JpZ2h0LWVuZCc7XG4gIGxldCBwbGFjZW1lbnQgPSBhbGlnbkVuZCA/IGJvdHRvbUVuZCA6IGJvdHRvbVN0YXJ0O1xuICBpZiAoZHJvcERpcmVjdGlvbiA9PT0gJ3VwJykgcGxhY2VtZW50ID0gYWxpZ25FbmQgPyB0b3BFbmQgOiB0b3BTdGFydDtlbHNlIGlmIChkcm9wRGlyZWN0aW9uID09PSAnZW5kJykgcGxhY2VtZW50ID0gYWxpZ25FbmQgPyByaWdodEVuZCA6IHJpZ2h0U3RhcnQ7ZWxzZSBpZiAoZHJvcERpcmVjdGlvbiA9PT0gJ3N0YXJ0JykgcGxhY2VtZW50ID0gYWxpZ25FbmQgPyBsZWZ0RW5kIDogbGVmdFN0YXJ0O2Vsc2UgaWYgKGRyb3BEaXJlY3Rpb24gPT09ICdkb3duLWNlbnRlcmVkJykgcGxhY2VtZW50ID0gJ2JvdHRvbSc7ZWxzZSBpZiAoZHJvcERpcmVjdGlvbiA9PT0gJ3VwLWNlbnRlcmVkJykgcGxhY2VtZW50ID0gJ3RvcCc7XG4gIHJldHVybiBwbGFjZW1lbnQ7XG59XG5jb25zdCBEcm9wZG93bk1lbnUgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigoe1xuICBic1ByZWZpeCxcbiAgY2xhc3NOYW1lLFxuICBhbGlnbixcbiAgcm9vdENsb3NlRXZlbnQsXG4gIGZsaXAgPSB0cnVlLFxuICBzaG93OiBzaG93UHJvcHMsXG4gIHJlbmRlck9uTW91bnQsXG4gIC8vIE5lZWQgdG8gZGVmaW5lIHRoZSBkZWZhdWx0IFwiYXNcIiBkdXJpbmcgcHJvcCBkZXN0cnVjdHVyaW5nIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBzdHlsZWQtY29tcG9uZW50cyBnaXRodWIuY29tL3JlYWN0LWJvb3RzdHJhcC9yZWFjdC1ib290c3RyYXAvaXNzdWVzLzM1OTVcbiAgYXM6IENvbXBvbmVudCA9ICdkaXYnLFxuICBwb3BwZXJDb25maWcsXG4gIHZhcmlhbnQsXG4gIC4uLnByb3BzXG59LCByZWYpID0+IHtcbiAgbGV0IGFsaWduRW5kID0gZmFsc2U7XG4gIGNvbnN0IGlzTmF2YmFyID0gdXNlQ29udGV4dChOYXZiYXJDb250ZXh0KTtcbiAgY29uc3QgcHJlZml4ID0gdXNlQm9vdHN0cmFwUHJlZml4KGJzUHJlZml4LCAnZHJvcGRvd24tbWVudScpO1xuICBjb25zdCB7XG4gICAgYWxpZ246IGNvbnRleHRBbGlnbixcbiAgICBkcm9wLFxuICAgIGlzUlRMXG4gIH0gPSB1c2VDb250ZXh0KERyb3Bkb3duQ29udGV4dCk7XG4gIGFsaWduID0gYWxpZ24gfHwgY29udGV4dEFsaWduO1xuICBjb25zdCBpc0lucHV0R3JvdXAgPSB1c2VDb250ZXh0KElucHV0R3JvdXBDb250ZXh0KTtcbiAgY29uc3QgYWxpZ25DbGFzc2VzID0gW107XG4gIGlmIChhbGlnbikge1xuICAgIGlmICh0eXBlb2YgYWxpZ24gPT09ICdvYmplY3QnKSB7XG4gICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoYWxpZ24pO1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyhrZXlzLmxlbmd0aCA9PT0gMSwgJ1RoZXJlIHNob3VsZCBvbmx5IGJlIDEgYnJlYWtwb2ludCB3aGVuIHBhc3NpbmcgYW4gb2JqZWN0IHRvIGBhbGlnbmAnKSA6IHZvaWQgMDtcbiAgICAgIGlmIChrZXlzLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBicmtQb2ludCA9IGtleXNbMF07XG4gICAgICAgIGNvbnN0IGRpcmVjdGlvbiA9IGFsaWduW2Jya1BvaW50XTtcblxuICAgICAgICAvLyAuZHJvcGRvd24tbWVudS1lbmQgaXMgcmVxdWlyZWQgZm9yIHJlc3BvbnNpdmVseSBhbGlnbmluZ1xuICAgICAgICAvLyBsZWZ0IGluIGFkZGl0aW9uIHRvIGFsaWduIGxlZnQgY2xhc3Nlcy5cbiAgICAgICAgYWxpZ25FbmQgPSBkaXJlY3Rpb24gPT09ICdzdGFydCc7XG4gICAgICAgIGFsaWduQ2xhc3Nlcy5wdXNoKGAke3ByZWZpeH0tJHticmtQb2ludH0tJHtkaXJlY3Rpb259YCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChhbGlnbiA9PT0gJ2VuZCcpIHtcbiAgICAgIGFsaWduRW5kID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgY29uc3QgcGxhY2VtZW50ID0gZ2V0RHJvcGRvd25NZW51UGxhY2VtZW50KGFsaWduRW5kLCBkcm9wLCBpc1JUTCk7XG4gIGNvbnN0IFttZW51UHJvcHMsIHtcbiAgICBoYXNTaG93bixcbiAgICBwb3BwZXIsXG4gICAgc2hvdyxcbiAgICB0b2dnbGVcbiAgfV0gPSB1c2VEcm9wZG93bk1lbnUoe1xuICAgIGZsaXAsXG4gICAgcm9vdENsb3NlRXZlbnQsXG4gICAgc2hvdzogc2hvd1Byb3BzLFxuICAgIHVzZVBvcHBlcjogIWlzTmF2YmFyICYmIGFsaWduQ2xhc3Nlcy5sZW5ndGggPT09IDAsXG4gICAgb2Zmc2V0OiBbMCwgMl0sXG4gICAgcG9wcGVyQ29uZmlnLFxuICAgIHBsYWNlbWVudFxuICB9KTtcbiAgbWVudVByb3BzLnJlZiA9IHVzZU1lcmdlZFJlZnModXNlV3JhcHBlZFJlZldpdGhXYXJuaW5nKHJlZiwgJ0Ryb3Bkb3duTWVudScpLCBtZW51UHJvcHMucmVmKTtcbiAgdXNlSXNvbW9ycGhpY0VmZmVjdCgoKSA9PiB7XG4gICAgLy8gUG9wcGVyJ3MgaW5pdGlhbCBwb3NpdGlvbiBmb3IgdGhlIG1lbnUgaXMgaW5jb3JyZWN0IHdoZW5cbiAgICAvLyByZW5kZXJPbk1vdW50PXRydWUuIE5lZWQgdG8gY2FsbCB1cGRhdGUoKSB0byBjb3JyZWN0IGl0LlxuICAgIGlmIChzaG93KSBwb3BwZXIgPT0gbnVsbCA/IHZvaWQgMCA6IHBvcHBlci51cGRhdGUoKTtcbiAgfSwgW3Nob3ddKTtcbiAgaWYgKCFoYXNTaG93biAmJiAhcmVuZGVyT25Nb3VudCAmJiAhaXNJbnB1dEdyb3VwKSByZXR1cm4gbnVsbDtcblxuICAvLyBGb3IgY3VzdG9tIGNvbXBvbmVudHMgcHJvdmlkZSBhZGRpdGlvbmFsLCBub24tRE9NLCBwcm9wcztcbiAgaWYgKHR5cGVvZiBDb21wb25lbnQgIT09ICdzdHJpbmcnKSB7XG4gICAgbWVudVByb3BzLnNob3cgPSBzaG93O1xuICAgIG1lbnVQcm9wcy5jbG9zZSA9ICgpID0+IHRvZ2dsZSA9PSBudWxsID8gdm9pZCAwIDogdG9nZ2xlKGZhbHNlKTtcbiAgICBtZW51UHJvcHMuYWxpZ24gPSBhbGlnbjtcbiAgfVxuICBsZXQgc3R5bGUgPSBwcm9wcy5zdHlsZTtcbiAgaWYgKHBvcHBlciAhPSBudWxsICYmIHBvcHBlci5wbGFjZW1lbnQpIHtcbiAgICAvLyB3ZSBkb24ndCBuZWVkIHRoZSBkZWZhdWx0IHBvcHBlciBzdHlsZSxcbiAgICAvLyBtZW51cyBhcmUgZGlzcGxheTogbm9uZSB3aGVuIG5vdCBzaG93bi5cbiAgICBzdHlsZSA9IHtcbiAgICAgIC4uLnByb3BzLnN0eWxlLFxuICAgICAgLi4ubWVudVByb3BzLnN0eWxlXG4gICAgfTtcbiAgICBwcm9wc1sneC1wbGFjZW1lbnQnXSA9IHBvcHBlci5wbGFjZW1lbnQ7XG4gIH1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KENvbXBvbmVudCwge1xuICAgIC4uLnByb3BzLFxuICAgIC4uLm1lbnVQcm9wcyxcbiAgICBzdHlsZTogc3R5bGVcbiAgICAvLyBCb290c3RyYXAgY3NzIHJlcXVpcmVzIHRoaXMgZGF0YSBhdHRyaWIgdG8gc3R5bGUgcmVzcG9uc2l2ZSBtZW51cy5cbiAgICAsXG4gICAgLi4uKChhbGlnbkNsYXNzZXMubGVuZ3RoIHx8IGlzTmF2YmFyKSAmJiB7XG4gICAgICAnZGF0YS1icy1wb3BwZXInOiAnc3RhdGljJ1xuICAgIH0pLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjbGFzc05hbWUsIHByZWZpeCwgc2hvdyAmJiAnc2hvdycsIGFsaWduRW5kICYmIGAke3ByZWZpeH0tZW5kYCwgdmFyaWFudCAmJiBgJHtwcmVmaXh9LSR7dmFyaWFudH1gLCAuLi5hbGlnbkNsYXNzZXMpXG4gIH0pO1xufSk7XG5Ecm9wZG93bk1lbnUuZGlzcGxheU5hbWUgPSAnRHJvcGRvd25NZW51JztcbmV4cG9ydCBkZWZhdWx0IERyb3Bkb3duTWVudTsiLCJcInVzZSBjbGllbnRcIjtcblxuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VCdXR0b25Qcm9wcyB9IGZyb20gJ0ByZXN0YXJ0L3VpL0J1dHRvbic7XG5pbXBvcnQgeyB1c2VCb290c3RyYXBQcmVmaXggfSBmcm9tICcuL1RoZW1lUHJvdmlkZXInO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmNvbnN0IEJ1dHRvbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKCh7XG4gIGFzLFxuICBic1ByZWZpeCxcbiAgdmFyaWFudCA9ICdwcmltYXJ5JyxcbiAgc2l6ZSxcbiAgYWN0aXZlID0gZmFsc2UsXG4gIGRpc2FibGVkID0gZmFsc2UsXG4gIGNsYXNzTmFtZSxcbiAgLi4ucHJvcHNcbn0sIHJlZikgPT4ge1xuICBjb25zdCBwcmVmaXggPSB1c2VCb290c3RyYXBQcmVmaXgoYnNQcmVmaXgsICdidG4nKTtcbiAgY29uc3QgW2J1dHRvblByb3BzLCB7XG4gICAgdGFnTmFtZVxuICB9XSA9IHVzZUJ1dHRvblByb3BzKHtcbiAgICB0YWdOYW1lOiBhcyxcbiAgICBkaXNhYmxlZCxcbiAgICAuLi5wcm9wc1xuICB9KTtcbiAgY29uc3QgQ29tcG9uZW50ID0gdGFnTmFtZTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KENvbXBvbmVudCwge1xuICAgIC4uLmJ1dHRvblByb3BzLFxuICAgIC4uLnByb3BzLFxuICAgIHJlZjogcmVmLFxuICAgIGRpc2FibGVkOiBkaXNhYmxlZCxcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoY2xhc3NOYW1lLCBwcmVmaXgsIGFjdGl2ZSAmJiAnYWN0aXZlJywgdmFyaWFudCAmJiBgJHtwcmVmaXh9LSR7dmFyaWFudH1gLCBzaXplICYmIGAke3ByZWZpeH0tJHtzaXplfWAsIHByb3BzLmhyZWYgJiYgZGlzYWJsZWQgJiYgJ2Rpc2FibGVkJylcbiAgfSk7XG59KTtcbkJ1dHRvbi5kaXNwbGF5TmFtZSA9ICdCdXR0b24nO1xuZXhwb3J0IGRlZmF1bHQgQnV0dG9uOyIsIlwidXNlIGNsaWVudFwiO1xuXG5pbXBvcnQgdXNlTWVyZ2VkUmVmcyBmcm9tICdAcmVzdGFydC9ob29rcy91c2VNZXJnZWRSZWZzJztcbmltcG9ydCBEcm9wZG93bkNvbnRleHQgZnJvbSAnQHJlc3RhcnQvdWkvRHJvcGRvd25Db250ZXh0JztcbmltcG9ydCB7IHVzZURyb3Bkb3duVG9nZ2xlIH0gZnJvbSAnQHJlc3RhcnQvdWkvRHJvcGRvd25Ub2dnbGUnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VDb250ZXh0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IEJ1dHRvbiBmcm9tICcuL0J1dHRvbic7XG5pbXBvcnQgeyB1c2VCb290c3RyYXBQcmVmaXggfSBmcm9tICcuL1RoZW1lUHJvdmlkZXInO1xuaW1wb3J0IHVzZVdyYXBwZWRSZWZXaXRoV2FybmluZyBmcm9tICcuL3VzZVdyYXBwZWRSZWZXaXRoV2FybmluZyc7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgRHJvcGRvd25Ub2dnbGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigoe1xuICBic1ByZWZpeCxcbiAgc3BsaXQsXG4gIGNsYXNzTmFtZSxcbiAgY2hpbGRCc1ByZWZpeCxcbiAgLy8gTmVlZCB0byBkZWZpbmUgdGhlIGRlZmF1bHQgXCJhc1wiIGR1cmluZyBwcm9wIGRlc3RydWN0dXJpbmcgdG8gYmUgY29tcGF0aWJsZSB3aXRoIHN0eWxlZC1jb21wb25lbnRzIGdpdGh1Yi5jb20vcmVhY3QtYm9vdHN0cmFwL3JlYWN0LWJvb3RzdHJhcC9pc3N1ZXMvMzU5NVxuICBhczogQ29tcG9uZW50ID0gQnV0dG9uLFxuICAuLi5wcm9wc1xufSwgcmVmKSA9PiB7XG4gIGNvbnN0IHByZWZpeCA9IHVzZUJvb3RzdHJhcFByZWZpeChic1ByZWZpeCwgJ2Ryb3Bkb3duLXRvZ2dsZScpO1xuICBjb25zdCBkcm9wZG93bkNvbnRleHQgPSB1c2VDb250ZXh0KERyb3Bkb3duQ29udGV4dCk7XG4gIGlmIChjaGlsZEJzUHJlZml4ICE9PSB1bmRlZmluZWQpIHtcbiAgICBwcm9wcy5ic1ByZWZpeCA9IGNoaWxkQnNQcmVmaXg7XG4gIH1cbiAgY29uc3QgW3RvZ2dsZVByb3BzXSA9IHVzZURyb3Bkb3duVG9nZ2xlKCk7XG4gIHRvZ2dsZVByb3BzLnJlZiA9IHVzZU1lcmdlZFJlZnModG9nZ2xlUHJvcHMucmVmLCB1c2VXcmFwcGVkUmVmV2l0aFdhcm5pbmcocmVmLCAnRHJvcGRvd25Ub2dnbGUnKSk7XG5cbiAgLy8gVGhpcyBpbnRlbnRpb25hbGx5IGZvcndhcmRzIHNpemUgYW5kIHZhcmlhbnQgKGlmIHNldCkgdG8gdGhlXG4gIC8vIHVuZGVybHlpbmcgY29tcG9uZW50LCB0byBhbGxvdyBpdCB0byByZW5kZXIgc2l6ZSBhbmQgc3R5bGUgdmFyaWFudHMuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChDb21wb25lbnQsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoY2xhc3NOYW1lLCBwcmVmaXgsIHNwbGl0ICYmIGAke3ByZWZpeH0tc3BsaXRgLCAoZHJvcGRvd25Db250ZXh0ID09IG51bGwgPyB2b2lkIDAgOiBkcm9wZG93bkNvbnRleHQuc2hvdykgJiYgJ3Nob3cnKSxcbiAgICAuLi50b2dnbGVQcm9wcyxcbiAgICAuLi5wcm9wc1xuICB9KTtcbn0pO1xuRHJvcGRvd25Ub2dnbGUuZGlzcGxheU5hbWUgPSAnRHJvcGRvd25Ub2dnbGUnO1xuZXhwb3J0IGRlZmF1bHQgRHJvcGRvd25Ub2dnbGU7IiwiXCJ1c2UgY2xpZW50XCI7XG5cbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQ29udGV4dCwgdXNlTWVtbyB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBCYXNlRHJvcGRvd24gZnJvbSAnQHJlc3RhcnQvdWkvRHJvcGRvd24nO1xuaW1wb3J0IHsgdXNlVW5jb250cm9sbGVkIH0gZnJvbSAndW5jb250cm9sbGFibGUnO1xuaW1wb3J0IHVzZUV2ZW50Q2FsbGJhY2sgZnJvbSAnQHJlc3RhcnQvaG9va3MvdXNlRXZlbnRDYWxsYmFjayc7XG5pbXBvcnQgRHJvcGRvd25Db250ZXh0IGZyb20gJy4vRHJvcGRvd25Db250ZXh0JztcbmltcG9ydCBEcm9wZG93bkRpdmlkZXIgZnJvbSAnLi9Ecm9wZG93bkRpdmlkZXInO1xuaW1wb3J0IERyb3Bkb3duSGVhZGVyIGZyb20gJy4vRHJvcGRvd25IZWFkZXInO1xuaW1wb3J0IERyb3Bkb3duSXRlbSBmcm9tICcuL0Ryb3Bkb3duSXRlbSc7XG5pbXBvcnQgRHJvcGRvd25JdGVtVGV4dCBmcm9tICcuL0Ryb3Bkb3duSXRlbVRleHQnO1xuaW1wb3J0IERyb3Bkb3duTWVudSwgeyBnZXREcm9wZG93bk1lbnVQbGFjZW1lbnQgfSBmcm9tICcuL0Ryb3Bkb3duTWVudSc7XG5pbXBvcnQgRHJvcGRvd25Ub2dnbGUgZnJvbSAnLi9Ecm9wZG93blRvZ2dsZSc7XG5pbXBvcnQgSW5wdXRHcm91cENvbnRleHQgZnJvbSAnLi9JbnB1dEdyb3VwQ29udGV4dCc7XG5pbXBvcnQgeyB1c2VCb290c3RyYXBQcmVmaXgsIHVzZUlzUlRMIH0gZnJvbSAnLi9UaGVtZVByb3ZpZGVyJztcbmltcG9ydCB7IGFsaWduUHJvcFR5cGUgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5jb25zdCBEcm9wZG93biA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKChwUHJvcHMsIHJlZikgPT4ge1xuICBjb25zdCB7XG4gICAgYnNQcmVmaXgsXG4gICAgZHJvcCA9ICdkb3duJyxcbiAgICBzaG93LFxuICAgIGNsYXNzTmFtZSxcbiAgICBhbGlnbiA9ICdzdGFydCcsXG4gICAgb25TZWxlY3QsXG4gICAgb25Ub2dnbGUsXG4gICAgZm9jdXNGaXJzdEl0ZW1PblNob3csXG4gICAgLy8gTmVlZCB0byBkZWZpbmUgdGhlIGRlZmF1bHQgXCJhc1wiIGR1cmluZyBwcm9wIGRlc3RydWN0dXJpbmcgdG8gYmUgY29tcGF0aWJsZSB3aXRoIHN0eWxlZC1jb21wb25lbnRzIGdpdGh1Yi5jb20vcmVhY3QtYm9vdHN0cmFwL3JlYWN0LWJvb3RzdHJhcC9pc3N1ZXMvMzU5NVxuICAgIGFzOiBDb21wb25lbnQgPSAnZGl2JyxcbiAgICBuYXZiYXI6IF80LFxuICAgIGF1dG9DbG9zZSA9IHRydWUsXG4gICAgLi4ucHJvcHNcbiAgfSA9IHVzZVVuY29udHJvbGxlZChwUHJvcHMsIHtcbiAgICBzaG93OiAnb25Ub2dnbGUnXG4gIH0pO1xuICBjb25zdCBpc0lucHV0R3JvdXAgPSB1c2VDb250ZXh0KElucHV0R3JvdXBDb250ZXh0KTtcbiAgY29uc3QgcHJlZml4ID0gdXNlQm9vdHN0cmFwUHJlZml4KGJzUHJlZml4LCAnZHJvcGRvd24nKTtcbiAgY29uc3QgaXNSVEwgPSB1c2VJc1JUTCgpO1xuICBjb25zdCBpc0Nsb3NpbmdQZXJtaXR0ZWQgPSBzb3VyY2UgPT4ge1xuICAgIC8vIGF1dG9DbG9zZT1mYWxzZSBvbmx5IHBlcm1pdHMgY2xvc2Ugb24gYnV0dG9uIGNsaWNrXG4gICAgaWYgKGF1dG9DbG9zZSA9PT0gZmFsc2UpIHJldHVybiBzb3VyY2UgPT09ICdjbGljayc7XG5cbiAgICAvLyBhdXRvQ2xvc2U9aW5zaWRlIGRvZXNuJ3QgcGVybWl0IGNsb3NlIG9uIHJvb3RDbG9zZVxuICAgIGlmIChhdXRvQ2xvc2UgPT09ICdpbnNpZGUnKSByZXR1cm4gc291cmNlICE9PSAncm9vdENsb3NlJztcblxuICAgIC8vIGF1dG9DbG9zZT1vdXRzaWRlIGRvZXNuJ3QgcGVybWl0IGNsb3NlIG9uIHNlbGVjdFxuICAgIGlmIChhdXRvQ2xvc2UgPT09ICdvdXRzaWRlJykgcmV0dXJuIHNvdXJjZSAhPT0gJ3NlbGVjdCc7XG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG4gIGNvbnN0IGhhbmRsZVRvZ2dsZSA9IHVzZUV2ZW50Q2FsbGJhY2soKG5leHRTaG93LCBtZXRhKSA9PiB7XG4gICAgaWYgKG1ldGEub3JpZ2luYWxFdmVudC5jdXJyZW50VGFyZ2V0ID09PSBkb2N1bWVudCAmJiAobWV0YS5zb3VyY2UgIT09ICdrZXlkb3duJyB8fCBtZXRhLm9yaWdpbmFsRXZlbnQua2V5ID09PSAnRXNjYXBlJykpIG1ldGEuc291cmNlID0gJ3Jvb3RDbG9zZSc7XG4gICAgaWYgKGlzQ2xvc2luZ1Blcm1pdHRlZChtZXRhLnNvdXJjZSkpIG9uVG9nZ2xlID09IG51bGwgPyB2b2lkIDAgOiBvblRvZ2dsZShuZXh0U2hvdywgbWV0YSk7XG4gIH0pO1xuICBjb25zdCBhbGlnbkVuZCA9IGFsaWduID09PSAnZW5kJztcbiAgY29uc3QgcGxhY2VtZW50ID0gZ2V0RHJvcGRvd25NZW51UGxhY2VtZW50KGFsaWduRW5kLCBkcm9wLCBpc1JUTCk7XG4gIGNvbnN0IGNvbnRleHRWYWx1ZSA9IHVzZU1lbW8oKCkgPT4gKHtcbiAgICBhbGlnbixcbiAgICBkcm9wLFxuICAgIGlzUlRMXG4gIH0pLCBbYWxpZ24sIGRyb3AsIGlzUlRMXSk7XG4gIGNvbnN0IGRpcmVjdGlvbkNsYXNzZXMgPSB7XG4gICAgZG93bjogcHJlZml4LFxuICAgICdkb3duLWNlbnRlcmVkJzogYCR7cHJlZml4fS1jZW50ZXJgLFxuICAgIHVwOiAnZHJvcHVwJyxcbiAgICAndXAtY2VudGVyZWQnOiAnZHJvcHVwLWNlbnRlciBkcm9wdXAnLFxuICAgIGVuZDogJ2Ryb3BlbmQnLFxuICAgIHN0YXJ0OiAnZHJvcHN0YXJ0J1xuICB9O1xuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goRHJvcGRvd25Db250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IGNvbnRleHRWYWx1ZSxcbiAgICBjaGlsZHJlbjogLyojX19QVVJFX18qL19qc3goQmFzZURyb3Bkb3duLCB7XG4gICAgICBwbGFjZW1lbnQ6IHBsYWNlbWVudCxcbiAgICAgIHNob3c6IHNob3csXG4gICAgICBvblNlbGVjdDogb25TZWxlY3QsXG4gICAgICBvblRvZ2dsZTogaGFuZGxlVG9nZ2xlLFxuICAgICAgZm9jdXNGaXJzdEl0ZW1PblNob3c6IGZvY3VzRmlyc3RJdGVtT25TaG93LFxuICAgICAgaXRlbVNlbGVjdG9yOiBgLiR7cHJlZml4fS1pdGVtOm5vdCguZGlzYWJsZWQpOm5vdCg6ZGlzYWJsZWQpYCxcbiAgICAgIGNoaWxkcmVuOiBpc0lucHV0R3JvdXAgPyBwcm9wcy5jaGlsZHJlbiA6IC8qI19fUFVSRV9fKi9fanN4KENvbXBvbmVudCwge1xuICAgICAgICAuLi5wcm9wcyxcbiAgICAgICAgcmVmOiByZWYsXG4gICAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjbGFzc05hbWUsIHNob3cgJiYgJ3Nob3cnLCBkaXJlY3Rpb25DbGFzc2VzW2Ryb3BdKVxuICAgICAgfSlcbiAgICB9KVxuICB9KTtcbn0pO1xuRHJvcGRvd24uZGlzcGxheU5hbWUgPSAnRHJvcGRvd24nO1xuZXhwb3J0IGRlZmF1bHQgT2JqZWN0LmFzc2lnbihEcm9wZG93biwge1xuICBUb2dnbGU6IERyb3Bkb3duVG9nZ2xlLFxuICBNZW51OiBEcm9wZG93bk1lbnUsXG4gIEl0ZW06IERyb3Bkb3duSXRlbSxcbiAgSXRlbVRleHQ6IERyb3Bkb3duSXRlbVRleHQsXG4gIERpdmlkZXI6IERyb3Bkb3duRGl2aWRlcixcbiAgSGVhZGVyOiBEcm9wZG93bkhlYWRlclxufSk7IiwiXCJ1c2UgY2xpZW50XCI7XG5cbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQm9vdHN0cmFwUHJlZml4IH0gZnJvbSAnLi9UaGVtZVByb3ZpZGVyJztcbmltcG9ydCBEcm9wZG93biBmcm9tICcuL0Ryb3Bkb3duJztcbmltcG9ydCBOYXZMaW5rIGZyb20gJy4vTmF2TGluayc7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgTmF2RHJvcGRvd24gPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigoe1xuICBpZCxcbiAgdGl0bGUsXG4gIGNoaWxkcmVuLFxuICBic1ByZWZpeCxcbiAgY2xhc3NOYW1lLFxuICByb290Q2xvc2VFdmVudCxcbiAgbWVudVJvbGUsXG4gIGRpc2FibGVkLFxuICBhY3RpdmUsXG4gIHJlbmRlck1lbnVPbk1vdW50LFxuICBtZW51VmFyaWFudCxcbiAgLi4ucHJvcHNcbn0sIHJlZikgPT4ge1xuICAvKiBOYXZJdGVtIGhhcyBubyBhZGRpdGlvbmFsIGxvZ2ljLCBpdCdzIHB1cmVseSBwcmVzZW50YXRpb25hbC4gQ2FuIHNldCBuYXYgaXRlbSBjbGFzcyBoZXJlIHRvIHN1cHBvcnQgXCJhc1wiICovXG4gIGNvbnN0IG5hdkl0ZW1QcmVmaXggPSB1c2VCb290c3RyYXBQcmVmaXgodW5kZWZpbmVkLCAnbmF2LWl0ZW0nKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4cyhEcm9wZG93biwge1xuICAgIHJlZjogcmVmLFxuICAgIC4uLnByb3BzLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjbGFzc05hbWUsIG5hdkl0ZW1QcmVmaXgpLFxuICAgIGNoaWxkcmVuOiBbLyojX19QVVJFX18qL19qc3goRHJvcGRvd24uVG9nZ2xlLCB7XG4gICAgICBpZDogaWQsXG4gICAgICBldmVudEtleTogbnVsbCxcbiAgICAgIGFjdGl2ZTogYWN0aXZlLFxuICAgICAgZGlzYWJsZWQ6IGRpc2FibGVkLFxuICAgICAgY2hpbGRCc1ByZWZpeDogYnNQcmVmaXgsXG4gICAgICBhczogTmF2TGluayxcbiAgICAgIGNoaWxkcmVuOiB0aXRsZVxuICAgIH0pLCAvKiNfX1BVUkVfXyovX2pzeChEcm9wZG93bi5NZW51LCB7XG4gICAgICByb2xlOiBtZW51Um9sZSxcbiAgICAgIHJlbmRlck9uTW91bnQ6IHJlbmRlck1lbnVPbk1vdW50LFxuICAgICAgcm9vdENsb3NlRXZlbnQ6IHJvb3RDbG9zZUV2ZW50LFxuICAgICAgdmFyaWFudDogbWVudVZhcmlhbnQsXG4gICAgICBjaGlsZHJlbjogY2hpbGRyZW5cbiAgICB9KV1cbiAgfSk7XG59KTtcbk5hdkRyb3Bkb3duLmRpc3BsYXlOYW1lID0gJ05hdkRyb3Bkb3duJztcbmV4cG9ydCBkZWZhdWx0IE9iamVjdC5hc3NpZ24oTmF2RHJvcGRvd24sIHtcbiAgSXRlbTogRHJvcGRvd24uSXRlbSxcbiAgSXRlbVRleHQ6IERyb3Bkb3duLkl0ZW1UZXh0LFxuICBEaXZpZGVyOiBEcm9wZG93bi5EaXZpZGVyLFxuICBIZWFkZXI6IERyb3Bkb3duLkhlYWRlclxufSk7IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IENvbnRhaW5lciwgTmF2LCBOYXZEcm9wZG93biwgTmF2YmFyIH0gZnJvbSAncmVhY3QtYm9vdHN0cmFwJztcbmltcG9ydCB7IE91dGxldCB9IGZyb20gJ3JlYWN0LXJvdXRlci1kb20nO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBMYXlvdXQoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDw+XG4gICAgICAgPE5hdmJhciBleHBhbmQ9XCJsZ1wiIGJnPVwicHJpbWFyeVwiIGRhdGEtYnMtdGhlbWU9XCJkYXJrXCI+XG4gICAgICA8Q29udGFpbmVyIGZsdWlkPlxuICAgICAgICA8TmF2YmFyLkJyYW5kIGhyZWY9XCIjaG9tZVwiPlBvbGFyaXMgRGFzaGJvYXJkPC9OYXZiYXIuQnJhbmQ+XG4gICAgICAgIDxOYXZiYXIuVG9nZ2xlIGFyaWEtY29udHJvbHM9XCJiYXNpYy1uYXZiYXItbmF2XCIgLz5cbiAgICAgICAgPE5hdmJhci5Db2xsYXBzZSBpZD1cImJhc2ljLW5hdmJhci1uYXZcIj5cbiAgICAgICAgICA8TmF2IGNsYXNzTmFtZT1cIm1lLWF1dG9cIj5cbiAgICAgICAgICAgIDxOYXYuTGluayBocmVmPVwiL2Rhc2hib2FyZC8xXCI+SG9tZTwvTmF2Lkxpbms+XG4gICAgICAgICAgICA8TmF2LkxpbmsgaHJlZj1cIiNsaW5rXCI+RGF0ZW5lcmZhc3N1bmc8L05hdi5MaW5rPlxuICAgICAgICAgICAgPE5hdkRyb3Bkb3duIHRpdGxlPVwiRGFzaGJvYXJkc1wiIGlkPVwiYmFzaWMtbmF2LWRyb3Bkb3duXCI+XG4gICAgICAgICAgICAgIDxOYXZEcm9wZG93bi5JdGVtIGhyZWY9XCIjYWN0aW9uLzMuMVwiPkRhc2hib2FyZCAxPC9OYXZEcm9wZG93bi5JdGVtPlxuICAgICAgICAgICAgICA8TmF2RHJvcGRvd24uSXRlbSBocmVmPVwiI2FjdGlvbi8zLjJcIj5EYXNoYm9hcmQgTW9vZGxlXG4gICAgICAgICAgICAgIDwvTmF2RHJvcGRvd24uSXRlbT5cbiAgICAgICAgICAgICAgPE5hdkRyb3Bkb3duLkl0ZW0gaHJlZj1cIiNhY3Rpb24vMy4zXCI+RGFzaGJvYXJkIExlcm5lcmZvbGc8L05hdkRyb3Bkb3duLkl0ZW0+XG4gICAgICAgICAgICA8L05hdkRyb3Bkb3duPlxuXG4gICAgICAgICAgICA8TmF2RHJvcGRvd24gdGl0bGU9XCJFbnR3aWNrbGVyIFRvb2xzXCIgaWQ9XCJiYXNpYy1uYXYtZHJvcGRvd25cIj5cbiAgICAgICAgICAgICAgPE5hdkRyb3Bkb3duLkl0ZW0gaHJlZj1cIiNhY3Rpb24vMy4xXCI+eEFQSSBTdGF0ZW1lbnRzIFZpZXdlcjwvTmF2RHJvcGRvd24uSXRlbT5cbiAgICAgICAgICAgIDwvTmF2RHJvcGRvd24+XG4gICAgICAgICAgPC9OYXY+XG4gICAgICAgIDwvTmF2YmFyLkNvbGxhcHNlPlxuICAgICAgPC9Db250YWluZXI+XG4gICAgPC9OYXZiYXI+XG5cbiAgICA8T3V0bGV0IC8+XG4gICAgICA8Lz5cbiAgICApO1xuICB9IiwiaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgdXNlUm91dGVFcnJvciB9IGZyb20gXCJyZWFjdC1yb3V0ZXItZG9tXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIEVycm9yUGFnZSgpIHtcbiAgY29uc3QgZXJyb3IgPSB1c2VSb3V0ZUVycm9yKCk7XG4gIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuXG4gIHJldHVybiAoXG4gICAgPGRpdiBpZD1cImVycm9yLXBhZ2VcIj5cbiAgICAgIDxoMT5Pb3BzITwvaDE+XG4gICAgICA8cD5Tb3JyeSwgYW4gdW5leHBlY3RlZCBlcnJvciBoYXMgb2NjdXJyZWQuPC9wPlxuICAgICAgPHA+XG4gICAgICAgIDxpPntlcnJvci5zdGF0dXNUZXh0IHx8IGVycm9yLm1lc3NhZ2V9PC9pPlxuICAgICAgPC9wPlxuICAgIDwvZGl2PlxuICApO1xufSIsIlxuICAgICAgaW1wb3J0IEFQSSBmcm9tIFwiIS4uLy4uL2FkdmFuY2VkL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgaW1wb3J0IGRvbUFQSSBmcm9tIFwiIS4uLy4uL2FkdmFuY2VkL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0Rm4gZnJvbSBcIiEuLi8uLi9hZHZhbmNlZC9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzXCI7XG4gICAgICBpbXBvcnQgc2V0QXR0cmlidXRlcyBmcm9tIFwiIS4uLy4uL2FkdmFuY2VkL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydFN0eWxlRWxlbWVudCBmcm9tIFwiIS4uLy4uL2FkdmFuY2VkL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qc1wiO1xuICAgICAgaW1wb3J0IHN0eWxlVGFnVHJhbnNmb3JtRm4gZnJvbSBcIiEuLi8uLi9hZHZhbmNlZC9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qc1wiO1xuICAgICAgaW1wb3J0IGNvbnRlbnQsICogYXMgbmFtZWRFeHBvcnQgZnJvbSBcIiEhLi4vLi4vYWR2YW5jZWQvbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi4vLi4vYWR2YW5jZWQvbm9kZV9tb2R1bGVzL3Nhc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vc3R5bGVzLnNjc3NcIjtcbiAgICAgIFxuICAgICAgXG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0gPSBzdHlsZVRhZ1RyYW5zZm9ybUZuO1xub3B0aW9ucy5zZXRBdHRyaWJ1dGVzID0gc2V0QXR0cmlidXRlcztcblxuICAgICAgb3B0aW9ucy5pbnNlcnQgPSBpbnNlcnRGbi5iaW5kKG51bGwsIFwiaGVhZFwiKTtcbiAgICBcbm9wdGlvbnMuZG9tQVBJID0gZG9tQVBJO1xub3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7XG5cbnZhciB1cGRhdGUgPSBBUEkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgKiBmcm9tIFwiISEuLi8uLi9hZHZhbmNlZC9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuLi8uLi9hZHZhbmNlZC9ub2RlX21vZHVsZXMvc2Fzcy1sb2FkZXIvZGlzdC9janMuanMhLi9zdHlsZXMuc2Nzc1wiO1xuICAgICAgIGV4cG9ydCBkZWZhdWx0IGNvbnRlbnQgJiYgY29udGVudC5sb2NhbHMgPyBjb250ZW50LmxvY2FscyA6IHVuZGVmaW5lZDtcbiIsImltcG9ydCB4QXBpIGZyb20gXCIuL3hhcGlcIjtcblxuZXhwb3J0IHZhciBwb2xhcmlzX2F1dGhvcml0eTtcblxuZXhwb3J0IGZ1bmN0aW9uIHBvbGFyaXNEYXNoYm9hcmQodXNlcm5hbWUsIGRhc2hib2FyZElkLCBncmlkLCBnZW5lcmF0ZXhBUElTdGF0ZW1lbnQgPSBmYWxzZSwgeGFwaUNhbGxiYWNrID0gbnVsbClcbntcbiAgICBwb2xhcmlzX2F1dGhvcml0eSA9IHhBcGkuSUZJLmFjY291bnQoe1xuICAgICAgICBuYW1lOiB1c2VybmFtZSxcbiAgICAgICAgaG9tZVBhZ2U6ICdodHRwczovL3BvbGFyaXMuaW8vJyArIGRhc2hib2FyZElkXG4gICAgfSk7XG5cbiAgICBncmlkLmdyaWQub24oJ2FkZGVkJywgZnVuY3Rpb24oZXZlbnQsIGl0ZW1zKSB7XG4gICAgICAgY29uc29sZS5sb2coXCJhZGRkXCIpO1xuICAgICAgIGNvbnN0IHN0YXRlbWVudCA9IHhBcGkucG9sYXJpcy5jb21wbGV0ZWQoKS5hY3Rvcihwb2xhcmlzX2F1dGhvcml0eSlcblxuICAgICAgIGNvbnNvbGUubG9nKHN0YXRlbWVudC5nZXRTdGF0ZW1lbnQoKSlcbiAgICAgIH0pO1xuXG4gICAgICBncmlkLmdyaWQub24oJ2RyYWcnLCBmdW5jdGlvbihldmVudCwgaXRlbXMpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJkcmFnXCIpO1xuICAgICAgIH0pO1xuXG4gICAgICAgXG4gICAgICAgZ3JpZC5ncmlkLm9uKCdyZXNpemUnLCBmdW5jdGlvbihldmVudCwgaXRlbXMpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJyZXNpemVcIik7XG4gICAgICAgIFxuICAgICAgIGNvbnN0IHN0YXRlbWVudCA9IHhBcGkucG9sYXJpcy5yZXNpemVkKCkuYWN0b3IocG9sYXJpc19hdXRob3JpdHkpXG5cbiAgICAgICBjb25zb2xlLmxvZyhzdGF0ZW1lbnQuZ2V0U3RhdGVtZW50KCkpXG4gICAgICAgfSk7XG4gXG4gICAgcmV0dXJuIGF1dGhvcml0eTtcbn0iLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi8uLi9hZHZhbmNlZC9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi8uLi9hZHZhbmNlZC9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vLi4vYWR2YW5jZWQvbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi8uLi9hZHZhbmNlZC9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi8uLi9hZHZhbmNlZC9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vLi4vYWR2YW5jZWQvbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uLy4uL2FkdmFuY2VkL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4uLy4uLy4uL2FkdmFuY2VkL25vZGVfbW9kdWxlcy9zYXNzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL2dyaWRzdGFjay5taW4uY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5cbiAgICAgIG9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG4gICAgXG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vYWR2YW5jZWQvbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi4vLi4vLi4vYWR2YW5jZWQvbm9kZV9tb2R1bGVzL3Nhc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vZ3JpZHN0YWNrLm1pbi5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJpbXBvcnQgXCJncmlkc3RhY2svZGlzdC9ncmlkc3RhY2subWluLmNzc1wiO1xuaW1wb3J0IHsgR3JpZFN0YWNrIH0gZnJvbSBcImdyaWRzdGFja1wiO1xuXG4vKipcbiAqIFJlcXVlc3QgYW5hbHl0aWNzIGVuZ2luZSByZXN1bHRzIGZyb20gcmlnaHRzIGVuZ2luZS5cbiAqIEBwYXJhbSB7Kn0gdG9rZW5cbiAqIEBwYXJhbSB7Kn0gdXJsXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UmVzdWx0KHRva2VuLCB1cmwpIHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICBoZWFkZXJzOiB7XG4gICAgICBBdXRob3JpemF0aW9uOiBgQmFzaWMgJHt0b2tlbn1gLFxuICAgIH0sXG4gIH0pO1xuICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICBpZiAocmVzcG9uc2Uuc3RhdHVzICE9PSAyMDApIHRocm93IEVycm9yKGRhdGEubWVzc2FnZSk7XG4gIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIFBsb3RzIGNoYXJ0IGluIGVhY2ggY29uZmlndXJlZCB3aWRnZXQuXG4gKiBAcGFyYW0geyp9IG5vZGVzXG4gKiBAcGFyYW0geyp9IHdpZGdldHNcbiAqL1xuZnVuY3Rpb24gcGxvdFdpZGdldHMobm9kZXMsIHdpZGdldHMpIHtcbiAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7XG4gICAgaWYgKG5vZGUuc3ViR3JpZCkge1xuICAgICAgLy8gSGFuZGxlIHN1YiBncmlkXG4gICAgICBwbG90V2lkZ2V0cyhub2RlLnN1YkdyaWQuZW5naW5lLm5vZGVzLCB3aWRnZXRzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgd2lkZ2V0ID0gd2lkZ2V0c1tub2RlLndpZGdldElkXTtcbiAgICAgIGlmICh3aWRnZXQpIHtcbiAgICAgICAgcGxvdChub2RlLCB3aWRnZXQpO1xuICAgICAgfSBlbHNlIGlmIChub2RlLmVsLmdldEF0dHJpYnV0ZShcIndpZGdldElkXCIpKSB7XG4gICAgICAgIGNvbnN0IHdpZGdldElkID0gbm9kZS5lbC5nZXRBdHRyaWJ1dGUoXCJ3aWRnZXRJZFwiKTtcbiAgICAgICAgcGxvdChub2RlLCB3aWRnZXRzW3dpZGdldElkXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBDb3VsZG4ndCBmaW5kIHdpZGdldCBieSBpZCAke25vZGUud2lkZ2V0SWR9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ2FsbHMgcGxvdCBmdW5jdGlvbiBvbiBlYWNoIHdpZGdldCwgcGFzc2luZyBjdXJyZW50IHdpZGdldCBkaXYgY29udGFpbmVyIHdpZHRoLCBoZWlnaHQgYW5kXG4gKiB1cGRhdGVzIHdpZGdldCBjb250ZW50IHdpdGggcmVzdWx0aW5nIGNoYXJ0IHN2Zy5cbiAqIEBwYXJhbSB7Kn0gbm9kZVxuICogQHBhcmFtIHsqfSB3aWRnZXRcbiAqL1xuZnVuY3Rpb24gcGxvdChub2RlLCB3aWRnZXQpIHtcbiAgY29uc3QgY29udGVudCA9IG5vZGUuZWwucXVlcnlTZWxlY3RvcihcIi5ncmlkLXN0YWNrLWl0ZW0tY29udGVudFwiKTtcbiAgY29udGVudC5pbm5lckhUTUwgPSBcIlwiO1xuICBjb25zdCB3aWR0aCA9IGNvbnRlbnQub2Zmc2V0V2lkdGg7XG4gIGNvbnN0IGhlaWdodCA9IGNvbnRlbnQub2Zmc2V0SGVpZ2h0O1xuICBjb25zdCBnZW5lcmF0ZWQgPSB3aWRnZXQucGxvdCh3aWR0aCwgaGVpZ2h0LCBjb250ZW50KTtcbiAgaWYoZ2VuZXJhdGVkICE9IG51bGwpXG4gIHtcbiAgICBjb250ZW50LmlubmVySFRNTCA9IGdlbmVyYXRlZDtcbiAgfVxufVxuXG4vKipcbiAqIFJlbmRlcnMgc2luZ2xlIHdpZGdldCBjb250ZW50IGZvciBhdmFpbGFibGUgd2lkZ2V0cyBzaWRlYmFyLlxuICogQHBhcmFtIHsqfSB3aWRnZXRcbiAqIEBwYXJhbSB7Kn0gd2lkZ2V0SWRcbiAqIEByZXR1cm5zXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUF2V2lkZ2V0UGxhY2Vob2xkZXIod2lkZ2V0LCB3aWRnZXRJZCwgbm9kZSkge1xuICBjb25zdCBjb250ZW50ID0gbm9kZS5xdWVyeVNlbGVjdG9yKFwiLmdyaWQtc3RhY2staXRlbS1jb250ZW50XCIpO1xuICBjb25zdCBnZW5lcmF0ZWQgPSB3aWRnZXQucGxvdCg0MDAsIDQwMCwgY29udGVudCk7XG4gIGlmKGdlbmVyYXRlZCAhPSBudWxsKVxuICB7XG4gICAgY29udGVudC5pbm5lckhUTUwgPSBnZW5lcmF0ZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBSZW5kZXJzIGFsbCBhdmFpbGFibGUgd2lkZ2V0cyBpbiBzaWRlYmFyLlxuICogQHBhcmFtIHsqfSB3aWRnZXRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkcmF3QXZhaWxhYmxlV2lkZ2V0cyh3aWRnZXRzKSB7XG4gIGNvbnN0IGF2YWlsYWJsZVdpZGdldHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImF2YWlsYWJsZS13aWRnZXRzXCIpO1xuICBmb3IgKGNvbnN0IHdpZGdldElkIG9mIE9iamVjdC5rZXlzKHdpZGdldHMpKSB7XG4gICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBhdmFpbGFibGVXaWRnZXRzLmFwcGVuZENoaWxkKGRpdiwgd2lkZ2V0SWQpO1xuICAgIGRpdi5pbm5lckhUTUwgPSBgPGRpdiBjbGFzcz1cIm5ld1dpZGdldCBncmlkLXN0YWNrLWl0ZW1cIiB3aWRnZXRJZD1cIiR7d2lkZ2V0SWR9XCI+PGRpdiBjbGFzcz1cImdyaWQtc3RhY2staXRlbS1jb250ZW50XCI+PC9kaXY+PC9kaXY+YDtcbiAgICBjcmVhdGVBdldpZGdldFBsYWNlaG9sZGVyKHdpZGdldHNbd2lkZ2V0SWRdLCB3aWRnZXRJZCwgZGl2KTtcbiAgfVxufVxuXG4vKipcbiAqIEhhbmRsZXMgd2lkZ2V0IGRyYWcgaW4gZnJvbSBzaWRlYmFyIGJ5IGFkZGluZyBhIHdpZGdldCB0byB0aGUgd2lkZ2V0cyBncmlkLlxuICogQHBhcmFtIHsqfSBldmVudFxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZU5ld1dpZGdldERyYWdJbihldmVudCkge1xuICBjb25zdCBwYXJlbnRXaXRoQ2xhc3MgPSBldmVudC5zcmNFbGVtZW50LmNsb3Nlc3QoXCIubmV3V2lkZ2V0XCIpO1xuICBjb25zdCB0YXJnZXRFbCA9IHBhcmVudFdpdGhDbGFzcy5jbG9uZU5vZGUodHJ1ZSk7XG4gIHRhcmdldEVsLnN0eWxlLnJlbW92ZVByb3BlcnR5KFwibmV3V2lkZ2V0XCIpO1xuICByZXR1cm4gdGFyZ2V0RWw7XG59XG5cbi8qKlxuICogUmVtb3ZlcyBhbGwgY2hpbGQgbm9kZXMgZnJvbSBhbiBIVE1MIG5vZGUuXG4gKiBAcGFyYW0geyp9IHBhcmVudFxuICovXG5mdW5jdGlvbiByZW1vdmVBbGxDaGlsZE5vZGVzKHBhcmVudCkge1xuICB3aGlsZSAocGFyZW50LmZpcnN0Q2hpbGQpIHtcbiAgICBwYXJlbnQucmVtb3ZlQ2hpbGQocGFyZW50LmZpcnN0Q2hpbGQpO1xuICB9XG59XG5cbi8qKlxuICogSW5pdGlhbCB3aWRnZXRzIGdyaWRcbiAqIEBwYXJhbSB7Kn0gaW5pdGlhbFdpZGdldHNcbiAqIEBwYXJhbSB7Kn0gaXRlbXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXRHcmlkKGluaXRpYWxXaWRnZXRzLCBpdGVtcykge1xuICBsZXQgd2lkZ2V0cyA9IGluaXRpYWxXaWRnZXRzO1xuICAvLyBCYXNpYyBncmlkIG9iamVjdFxuICBjb25zdCBncmlkID0gR3JpZFN0YWNrLmluaXQoe1xuICAgIGNlbGxIZWlnaHQ6IDcwLFxuICAgIGFjY2VwdFdpZGdldHM6IHRydWUsXG4gICAgcmVtb3ZhYmxlOiBcIi5kcm9wem9uZS1yZW1vdmVcIixcbiAgICBtaW5Sb3c6IDIsXG4gICAgc3ViR3JpZDoge1xuICAgICAgZGlzYWJsZU9uZUNvbHVtbk1vZGU6IHRydWUsXG4gICAgICBtaW5Sb3c6IDIsXG4gICAgICBjZWxsSGVpZ2h0OiA3MCxcbiAgICAgIG1hcmdpbjogNSxcbiAgICAgIGFjY2VwdFdpZGdldHM6IHRydWUsIC8vIHdpbGwgYWNjZXB0IC5ncmlkLXN0YWNrLWl0ZW0gYnkgZGVmYXVsdFxuICAgICAgbG9ja2VkOiB0cnVlLFxuICAgICAgbm9SZXNpemU6IHRydWUsXG4gICAgICBub01vdmU6IHRydWUsXG4gICAgICByZW1vdmFibGU6IFwiLmRyb3B6b25lLXJlbW92ZVwiLFxuICAgIH0sXG4gICAgc3ViR3JpZER5bmFtaWM6IHRydWUsXG4gIH0pO1xuXG4gIC8vIEVuYWJsZXMgd2lkZ2V0IHJlc2l6ZSBhbmQgbW92ZW1lbnQgb24gZ3JpZFxuICBmdW5jdGlvbiBlbmFibGVXaWRnZXRNb3ZlQW5kUmVzaXplKCkge1xuICAgIGdyaWQuZW5hYmxlUmVzaXplKHRydWUpO1xuICAgIGdyaWQuZW5hYmxlTW92ZSh0cnVlKTtcblxuICAgIGdyaWQuZW5naW5lLm5vZGVzLm1hcCgoZSkgPT4ge1xuICAgICAgaWYgKGUuc3ViR3JpZCkge1xuICAgICAgICBlLnN1YkdyaWQuZW5hYmxlUmVzaXplKHRydWUpO1xuICAgICAgICBlLnN1YkdyaWQuZW5hYmxlTW92ZSh0cnVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIERpc2FibGVzIHdpZGdldCByZXNpemUgYW5kIG1vdmVtZW50IG9uIGdyaWRcbiAgZnVuY3Rpb24gZGlzYWJsZVdpZGdldE1vdmVBbmRSZXNpemUoKSB7XG4gICAgZ3JpZC5lbmFibGVSZXNpemUoZmFsc2UpO1xuICAgIGdyaWQuZW5hYmxlTW92ZShmYWxzZSk7XG5cbiAgICBncmlkLmVuZ2luZS5ub2Rlcy5tYXAoKGUpID0+IHtcbiAgICAgIGlmIChlLnN1YkdyaWQpIHtcbiAgICAgICAgZS5zdWJHcmlkLmVuYWJsZVJlc2l6ZShmYWxzZSk7XG4gICAgICAgIGUuc3ViR3JpZC5lbmFibGVNb3ZlKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGdyaWQubG9hZChpdGVtcyk7XG4gIGdyaWQuc2V0QW5pbWF0aW9uKGZhbHNlKTtcbiAgYWRkUmVzaXplTGlzdGVuZXIoZ3JpZCk7XG5cbiAgcGxvdFdpZGdldHMoZ3JpZC5lbmdpbmUubm9kZXMsIHdpZGdldHMpO1xuICBkaXNhYmxlV2lkZ2V0TW92ZUFuZFJlc2l6ZSgpO1xuXG4gIC8vIEFkZCByZXNpemUgbGlzdGVuZXIgZm9yIHN1YmdyaWRcbiAgZ3JpZC5lbmdpbmUubm9kZXMubWFwKChlKSA9PiB7XG4gICAgaWYgKGUuc3ViR3JpZCkge1xuICAgICAgZS5zdWJHcmlkLm9uKFwicmVzaXplc3RvcFwiLCBmdW5jdGlvbiAoZXZlbnQsIGVsKSB7XG4gICAgICAgIHBsb3RXaWRnZXRzKGdyaWQuZW5naW5lLm5vZGVzLCB3aWRnZXRzKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gUmVyZW5kZXIgYWxsIHdpZGdldHMgb24gd2lkZ2V0IHJlbW92YWxcbiAgZ3JpZC5vbihcInJlbW92ZWQgY2hhbmdlXCIsIGZ1bmN0aW9uIChlLCBpdGVtcykge1xuICAgIHBsb3RXaWRnZXRzKGdyaWQuZW5naW5lLm5vZGVzLCB3aWRnZXRzKTtcbiAgfSk7XG5cbiAgLy8gUmVyZW5kZXIgYWxsIHdpZGdldHMgd2hlbiBhZGRpbmcgYSBuZXcgd2lkZ2V0XG4gIGdyaWQub24oXCJhZGRlZFwiLCBmdW5jdGlvbiAoZSwgaXRlbXMpIHtcbiAgICBwbG90V2lkZ2V0cyhncmlkLmVuZ2luZS5ub2Rlcywgd2lkZ2V0cyk7XG4gIH0pO1xuXG4gIC8vIENyZWF0ZSByZXNpemUgZXZlbnQgbGlzdGVuZXIgYW5kIHJlcmVuZGVycyBhbGwgd2lkZ2V0cyBvbiByZXNpemVcbiAgZnVuY3Rpb24gYWRkUmVzaXplTGlzdGVuZXIoZ3JpZCkge1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgXCJyZXNpemVcIixcbiAgICAgIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBwbG90V2lkZ2V0cyhncmlkLmVuZ2luZS5ub2Rlcywgd2lkZ2V0cyk7XG4gICAgICB9LFxuICAgICAgdHJ1ZVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIHNpZGViYXIgdG9nZ2xlLCBpbmNsdWRpbmcgZW5hYmVsaW5nL2Rpc2FiZWxpbmcgd2lkZ2V0IHJlc2l6ZSBhbmQgbW92ZW1lbnQuXG4gICAqL1xuICBmdW5jdGlvbiB0b2dnbGVTaWRlYmFyKCkge1xuICAgIGNvbnN0IHNpZGViYXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInNpZGViYXJcIik7XG4gICAgY29uc3QgaXNWaXNpYmxlID0gc2lkZWJhci5jbGFzc05hbWUgPT09IFwic2lkZWJhclwiO1xuICAgIGlmIChpc1Zpc2libGUpIHtcbiAgICAgIGRpc2FibGVXaWRnZXRNb3ZlQW5kUmVzaXplKCk7XG4gICAgICBzaWRlYmFyLmNsYXNzTmFtZSA9IFwic2lkZWJhci1oaWRkZW5cIjtcbiAgICAgIGNvbnN0IGF2V2lkZ2V0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYXZhaWxhYmxlLXdpZGdldHNcIik7XG4gICAgICByZW1vdmVBbGxDaGlsZE5vZGVzKGF2V2lkZ2V0cyk7XG4gICAgICBwbG90V2lkZ2V0cyhncmlkLmVuZ2luZS5ub2Rlcywgd2lkZ2V0cyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNpZGViYXIuY2xhc3NOYW1lID0gXCJzaWRlYmFyXCI7XG4gICAgICBkcmF3QXZhaWxhYmxlV2lkZ2V0cyh3aWRnZXRzKTtcbiAgICAgIEdyaWRTdGFjay5zZXR1cERyYWdJbihcIi5uZXdXaWRnZXRcIiwge1xuICAgICAgICByZXZlcnQ6IFwiaW52YWxpZFwiLFxuICAgICAgICBzY3JvbGw6IGZhbHNlLFxuICAgICAgICBhcHBlbmRUbzogXCJib2R5XCIsXG4gICAgICAgIGhlbHBlcjogaGFuZGxlTmV3V2lkZ2V0RHJhZ0luLFxuICAgICAgfSk7XG5cbiAgICAgIGVuYWJsZVdpZGdldE1vdmVBbmRSZXNpemUoKTtcbiAgICAgIHBsb3RXaWRnZXRzKGdyaWQuZW5naW5lLm5vZGVzLCB3aWRnZXRzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2F2ZXMgY3VycmVudCBncmlkIGNvbmZpZ3VyYXRpb24uIFRoZSByZXR1cm5lZCBncmlkIGNvbmZpZ3VyYXRpb24gY2FuIGJlIGxvYWRlZCBsYXRlciAoZS5nLiB3aGVuIHRoZSB1c2VyIHJldmlzaXRlZCB0aGUgZGFzaGJvYXJkKS5cbiAgICogQHJldHVybnMgZ3JpZCBjb25maWd1cmF0aW9uXG4gICAqL1xuICBmdW5jdGlvbiBzYXZlKCkge1xuICAgIGNvbnN0IG9sZEdyaWQgPSBncmlkLnNhdmUoKTtcbiAgICByZXR1cm4gb2xkR3JpZC5tYXAoKGl0ZW0pID0+IHtcbiAgICAgIGlmIChpdGVtLnN1YkdyaWQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB4OiBpdGVtLngsXG4gICAgICAgICAgeTogaXRlbS55LFxuICAgICAgICAgIHc6IGl0ZW0udyxcbiAgICAgICAgICBoOiBpdGVtLmgsXG4gICAgICAgICAgc3ViR3JpZDoge1xuICAgICAgICAgICAgeDogaXRlbS5zdWJHcmlkLngsXG4gICAgICAgICAgICB5OiBpdGVtLnN1YkdyaWQueSxcbiAgICAgICAgICAgIHc6IGl0ZW0uc3ViR3JpZC53LFxuICAgICAgICAgICAgaDogaXRlbS5zdWJHcmlkLmgsXG4gICAgICAgICAgICBjaGlsZHJlbjogaXRlbS5zdWJHcmlkLmNoaWxkcmVuLm1hcCgoZSkgPT4gKHtcbiAgICAgICAgICAgICAgeDogZS54LFxuICAgICAgICAgICAgICB5OiBlLnksXG4gICAgICAgICAgICAgIHc6IGUudyxcbiAgICAgICAgICAgICAgaDogZS5oLFxuICAgICAgICAgICAgICB3aWRnZXRJZDogZS53aWRnZXRJZCxcbiAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB4OiBpdGVtLngsXG4gICAgICAgICAgeTogaXRlbS55LFxuICAgICAgICAgIHc6IGl0ZW0udyxcbiAgICAgICAgICBoOiBpdGVtLmgsXG4gICAgICAgICAgd2lkZ2V0SWQ6IGl0ZW0ud2lkZ2V0SWQsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgYSBncmlkIGNvbmZpZ3VyYXRpb24uIFNob3VsZCBiZSB1c2VkIGFsb25nIHdpdGggdGhlIHNhdmUgZnVuY3Rpb24uXG4gICAqIEBwYXJhbSB7Kn0gaXRlbXNcbiAgICovXG4gIGZ1bmN0aW9uIGxvYWQoaXRlbXMpIHtcbiAgICBncmlkLnJlbW92ZUFsbCgpO1xuICAgIGdyaWQubG9hZChpdGVtcyk7XG4gICAgcGxvdFdpZGdldHMoZ3JpZC5lbmdpbmUubm9kZXMsIHdpZGdldHMpO1xuICAgIGRpc2FibGVXaWRnZXRNb3ZlQW5kUmVzaXplKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVmcmVzaCB3aWRnZXRzIHdpdGggdXBkYXRlZCB3aWRnZXRzIGFycmF5LlxuICAgKiBAcGFyYW0geyp9IG5ld1dpZGdldHNcbiAgICovXG4gIGZ1bmN0aW9uIHJlZnJlc2hXaWRnZXRzKG5ld1dpZGdldHMpIHtcbiAgICB3aWRnZXRzID0gbmV3V2lkZ2V0cztcbiAgICBwbG90V2lkZ2V0cyhncmlkLmVuZ2luZS5ub2Rlcywgd2lkZ2V0cyk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGdyaWQsXG4gICAgdG9nZ2xlU2lkZWJhcixcbiAgICBzYXZlLFxuICAgIGxvYWQsXG4gICAgZW5hYmxlV2lkZ2V0TW92ZUFuZFJlc2l6ZSxcbiAgICBkaXNhYmxlV2lkZ2V0TW92ZUFuZFJlc2l6ZSxcbiAgICByZWZyZXNoV2lkZ2V0cyxcbiAgfTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGV4dGVudCh2YWx1ZXMsIHZhbHVlb2YpIHtcbiAgbGV0IG1pbjtcbiAgbGV0IG1heDtcbiAgaWYgKHZhbHVlb2YgPT09IHVuZGVmaW5lZCkge1xuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICBpZiAobWluID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAodmFsdWUgPj0gdmFsdWUpIG1pbiA9IG1heCA9IHZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChtaW4gPiB2YWx1ZSkgbWluID0gdmFsdWU7XG4gICAgICAgICAgaWYgKG1heCA8IHZhbHVlKSBtYXggPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsZXQgaW5kZXggPSAtMTtcbiAgICBmb3IgKGxldCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgIGlmICgodmFsdWUgPSB2YWx1ZW9mKHZhbHVlLCArK2luZGV4LCB2YWx1ZXMpKSAhPSBudWxsKSB7XG4gICAgICAgIGlmIChtaW4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmICh2YWx1ZSA+PSB2YWx1ZSkgbWluID0gbWF4ID0gdmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKG1pbiA+IHZhbHVlKSBtaW4gPSB2YWx1ZTtcbiAgICAgICAgICBpZiAobWF4IDwgdmFsdWUpIG1heCA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBbbWluLCBtYXhdO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbWF4KHZhbHVlcywgdmFsdWVvZikge1xuICBsZXQgbWF4O1xuICBpZiAodmFsdWVvZiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgIGlmICh2YWx1ZSAhPSBudWxsXG4gICAgICAgICAgJiYgKG1heCA8IHZhbHVlIHx8IChtYXggPT09IHVuZGVmaW5lZCAmJiB2YWx1ZSA+PSB2YWx1ZSkpKSB7XG4gICAgICAgIG1heCA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsZXQgaW5kZXggPSAtMTtcbiAgICBmb3IgKGxldCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgIGlmICgodmFsdWUgPSB2YWx1ZW9mKHZhbHVlLCArK2luZGV4LCB2YWx1ZXMpKSAhPSBudWxsXG4gICAgICAgICAgJiYgKG1heCA8IHZhbHVlIHx8IChtYXggPT09IHVuZGVmaW5lZCAmJiB2YWx1ZSA+PSB2YWx1ZSkpKSB7XG4gICAgICAgIG1heCA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gbWF4O1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmFuZ2Uoc3RhcnQsIHN0b3AsIHN0ZXApIHtcbiAgc3RhcnQgPSArc3RhcnQsIHN0b3AgPSArc3RvcCwgc3RlcCA9IChuID0gYXJndW1lbnRzLmxlbmd0aCkgPCAyID8gKHN0b3AgPSBzdGFydCwgc3RhcnQgPSAwLCAxKSA6IG4gPCAzID8gMSA6ICtzdGVwO1xuXG4gIHZhciBpID0gLTEsXG4gICAgICBuID0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKChzdG9wIC0gc3RhcnQpIC8gc3RlcCkpIHwgMCxcbiAgICAgIHJhbmdlID0gbmV3IEFycmF5KG4pO1xuXG4gIHdoaWxlICgrK2kgPCBuKSB7XG4gICAgcmFuZ2VbaV0gPSBzdGFydCArIGkgKiBzdGVwO1xuICB9XG5cbiAgcmV0dXJuIHJhbmdlO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbWFwKHZhbHVlcywgbWFwcGVyKSB7XG4gIGlmICh0eXBlb2YgdmFsdWVzW1N5bWJvbC5pdGVyYXRvcl0gIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcInZhbHVlcyBpcyBub3QgaXRlcmFibGVcIik7XG4gIGlmICh0eXBlb2YgbWFwcGVyICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJtYXBwZXIgaXMgbm90IGEgZnVuY3Rpb25cIik7XG4gIHJldHVybiBBcnJheS5mcm9tKHZhbHVlcywgKHZhbHVlLCBpbmRleCkgPT4gbWFwcGVyKHZhbHVlLCBpbmRleCwgdmFsdWVzKSk7XG59XG4iLCJleHBvcnQgY2xhc3MgSW50ZXJuTWFwIGV4dGVuZHMgTWFwIHtcbiAgY29uc3RydWN0b3IoZW50cmllcywga2V5ID0ga2V5b2YpIHtcbiAgICBzdXBlcigpO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHtfaW50ZXJuOiB7dmFsdWU6IG5ldyBNYXAoKX0sIF9rZXk6IHt2YWx1ZToga2V5fX0pO1xuICAgIGlmIChlbnRyaWVzICE9IG51bGwpIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGVudHJpZXMpIHRoaXMuc2V0KGtleSwgdmFsdWUpO1xuICB9XG4gIGdldChrZXkpIHtcbiAgICByZXR1cm4gc3VwZXIuZ2V0KGludGVybl9nZXQodGhpcywga2V5KSk7XG4gIH1cbiAgaGFzKGtleSkge1xuICAgIHJldHVybiBzdXBlci5oYXMoaW50ZXJuX2dldCh0aGlzLCBrZXkpKTtcbiAgfVxuICBzZXQoa2V5LCB2YWx1ZSkge1xuICAgIHJldHVybiBzdXBlci5zZXQoaW50ZXJuX3NldCh0aGlzLCBrZXkpLCB2YWx1ZSk7XG4gIH1cbiAgZGVsZXRlKGtleSkge1xuICAgIHJldHVybiBzdXBlci5kZWxldGUoaW50ZXJuX2RlbGV0ZSh0aGlzLCBrZXkpKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgSW50ZXJuU2V0IGV4dGVuZHMgU2V0IHtcbiAgY29uc3RydWN0b3IodmFsdWVzLCBrZXkgPSBrZXlvZikge1xuICAgIHN1cGVyKCk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcywge19pbnRlcm46IHt2YWx1ZTogbmV3IE1hcCgpfSwgX2tleToge3ZhbHVlOiBrZXl9fSk7XG4gICAgaWYgKHZhbHVlcyAhPSBudWxsKSBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykgdGhpcy5hZGQodmFsdWUpO1xuICB9XG4gIGhhcyh2YWx1ZSkge1xuICAgIHJldHVybiBzdXBlci5oYXMoaW50ZXJuX2dldCh0aGlzLCB2YWx1ZSkpO1xuICB9XG4gIGFkZCh2YWx1ZSkge1xuICAgIHJldHVybiBzdXBlci5hZGQoaW50ZXJuX3NldCh0aGlzLCB2YWx1ZSkpO1xuICB9XG4gIGRlbGV0ZSh2YWx1ZSkge1xuICAgIHJldHVybiBzdXBlci5kZWxldGUoaW50ZXJuX2RlbGV0ZSh0aGlzLCB2YWx1ZSkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGludGVybl9nZXQoe19pbnRlcm4sIF9rZXl9LCB2YWx1ZSkge1xuICBjb25zdCBrZXkgPSBfa2V5KHZhbHVlKTtcbiAgcmV0dXJuIF9pbnRlcm4uaGFzKGtleSkgPyBfaW50ZXJuLmdldChrZXkpIDogdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGludGVybl9zZXQoe19pbnRlcm4sIF9rZXl9LCB2YWx1ZSkge1xuICBjb25zdCBrZXkgPSBfa2V5KHZhbHVlKTtcbiAgaWYgKF9pbnRlcm4uaGFzKGtleSkpIHJldHVybiBfaW50ZXJuLmdldChrZXkpO1xuICBfaW50ZXJuLnNldChrZXksIHZhbHVlKTtcbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiBpbnRlcm5fZGVsZXRlKHtfaW50ZXJuLCBfa2V5fSwgdmFsdWUpIHtcbiAgY29uc3Qga2V5ID0gX2tleSh2YWx1ZSk7XG4gIGlmIChfaW50ZXJuLmhhcyhrZXkpKSB7XG4gICAgdmFsdWUgPSBfaW50ZXJuLmdldChrZXkpO1xuICAgIF9pbnRlcm4uZGVsZXRlKGtleSk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiBrZXlvZih2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiID8gdmFsdWUudmFsdWVPZigpIDogdmFsdWU7XG59XG4iLCJleHBvcnQge2RlZmF1bHQgYXMgYmlzZWN0LCBiaXNlY3RSaWdodCwgYmlzZWN0TGVmdCwgYmlzZWN0Q2VudGVyfSBmcm9tIFwiLi9iaXNlY3QuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBhc2NlbmRpbmd9IGZyb20gXCIuL2FzY2VuZGluZy5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGJpc2VjdG9yfSBmcm9tIFwiLi9iaXNlY3Rvci5qc1wiO1xuZXhwb3J0IHtibHVyLCBibHVyMiwgYmx1ckltYWdlfSBmcm9tIFwiLi9ibHVyLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgY291bnR9IGZyb20gXCIuL2NvdW50LmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgY3Jvc3N9IGZyb20gXCIuL2Nyb3NzLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgY3Vtc3VtfSBmcm9tIFwiLi9jdW1zdW0uanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBkZXNjZW5kaW5nfSBmcm9tIFwiLi9kZXNjZW5kaW5nLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgZGV2aWF0aW9ufSBmcm9tIFwiLi9kZXZpYXRpb24uanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBleHRlbnR9IGZyb20gXCIuL2V4dGVudC5qc1wiO1xuZXhwb3J0IHtBZGRlciwgZnN1bSwgZmN1bXN1bX0gZnJvbSBcIi4vZnN1bS5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGdyb3VwLCBmbGF0R3JvdXAsIGZsYXRSb2xsdXAsIGdyb3VwcywgaW5kZXgsIGluZGV4ZXMsIHJvbGx1cCwgcm9sbHVwc30gZnJvbSBcIi4vZ3JvdXAuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBncm91cFNvcnR9IGZyb20gXCIuL2dyb3VwU29ydC5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGJpbiwgZGVmYXVsdCBhcyBoaXN0b2dyYW19IGZyb20gXCIuL2Jpbi5qc1wiOyAvLyBEZXByZWNhdGVkOyB1c2UgYmluLlxuZXhwb3J0IHtkZWZhdWx0IGFzIHRocmVzaG9sZEZyZWVkbWFuRGlhY29uaXN9IGZyb20gXCIuL3RocmVzaG9sZC9mcmVlZG1hbkRpYWNvbmlzLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgdGhyZXNob2xkU2NvdHR9IGZyb20gXCIuL3RocmVzaG9sZC9zY290dC5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHRocmVzaG9sZFN0dXJnZXN9IGZyb20gXCIuL3RocmVzaG9sZC9zdHVyZ2VzLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgbWF4fSBmcm9tIFwiLi9tYXguanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBtYXhJbmRleH0gZnJvbSBcIi4vbWF4SW5kZXguanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBtZWFufSBmcm9tIFwiLi9tZWFuLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgbWVkaWFuLCBtZWRpYW5JbmRleH0gZnJvbSBcIi4vbWVkaWFuLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgbWVyZ2V9IGZyb20gXCIuL21lcmdlLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgbWlufSBmcm9tIFwiLi9taW4uanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBtaW5JbmRleH0gZnJvbSBcIi4vbWluSW5kZXguanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBtb2RlfSBmcm9tIFwiLi9tb2RlLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgbmljZX0gZnJvbSBcIi4vbmljZS5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHBhaXJzfSBmcm9tIFwiLi9wYWlycy5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHBlcm11dGV9IGZyb20gXCIuL3Blcm11dGUuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBxdWFudGlsZSwgcXVhbnRpbGVJbmRleCwgcXVhbnRpbGVTb3J0ZWR9IGZyb20gXCIuL3F1YW50aWxlLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgcXVpY2tzZWxlY3R9IGZyb20gXCIuL3F1aWNrc2VsZWN0LmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgcmFuZ2V9IGZyb20gXCIuL3JhbmdlLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgcmFua30gZnJvbSBcIi4vcmFuay5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGxlYXN0fSBmcm9tIFwiLi9sZWFzdC5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGxlYXN0SW5kZXh9IGZyb20gXCIuL2xlYXN0SW5kZXguanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBncmVhdGVzdH0gZnJvbSBcIi4vZ3JlYXRlc3QuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBncmVhdGVzdEluZGV4fSBmcm9tIFwiLi9ncmVhdGVzdEluZGV4LmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgc2Nhbn0gZnJvbSBcIi4vc2Nhbi5qc1wiOyAvLyBEZXByZWNhdGVkOyB1c2UgbGVhc3RJbmRleC5cbmV4cG9ydCB7ZGVmYXVsdCBhcyBzaHVmZmxlLCBzaHVmZmxlcn0gZnJvbSBcIi4vc2h1ZmZsZS5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHN1bX0gZnJvbSBcIi4vc3VtLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgdGlja3MsIHRpY2tJbmNyZW1lbnQsIHRpY2tTdGVwfSBmcm9tIFwiLi90aWNrcy5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHRyYW5zcG9zZX0gZnJvbSBcIi4vdHJhbnNwb3NlLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgdmFyaWFuY2V9IGZyb20gXCIuL3ZhcmlhbmNlLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgemlwfSBmcm9tIFwiLi96aXAuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBldmVyeX0gZnJvbSBcIi4vZXZlcnkuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBzb21lfSBmcm9tIFwiLi9zb21lLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgZmlsdGVyfSBmcm9tIFwiLi9maWx0ZXIuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBtYXB9IGZyb20gXCIuL21hcC5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHJlZHVjZX0gZnJvbSBcIi4vcmVkdWNlLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgcmV2ZXJzZX0gZnJvbSBcIi4vcmV2ZXJzZS5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHNvcnR9IGZyb20gXCIuL3NvcnQuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBkaWZmZXJlbmNlfSBmcm9tIFwiLi9kaWZmZXJlbmNlLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgZGlzam9pbnR9IGZyb20gXCIuL2Rpc2pvaW50LmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgaW50ZXJzZWN0aW9ufSBmcm9tIFwiLi9pbnRlcnNlY3Rpb24uanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBzdWJzZXR9IGZyb20gXCIuL3N1YnNldC5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHN1cGVyc2V0fSBmcm9tIFwiLi9zdXBlcnNldC5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHVuaW9ufSBmcm9tIFwiLi91bmlvbi5qc1wiO1xuZXhwb3J0IHtJbnRlcm5NYXAsIEludGVyblNldH0gZnJvbSBcImludGVybm1hcFwiO1xuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCkge1xuICByZXR1cm4geDtcbn1cbiIsImltcG9ydCBpZGVudGl0eSBmcm9tIFwiLi9pZGVudGl0eS5qc1wiO1xuXG52YXIgdG9wID0gMSxcbiAgICByaWdodCA9IDIsXG4gICAgYm90dG9tID0gMyxcbiAgICBsZWZ0ID0gNCxcbiAgICBlcHNpbG9uID0gMWUtNjtcblxuZnVuY3Rpb24gdHJhbnNsYXRlWCh4KSB7XG4gIHJldHVybiBcInRyYW5zbGF0ZShcIiArIHggKyBcIiwwKVwiO1xufVxuXG5mdW5jdGlvbiB0cmFuc2xhdGVZKHkpIHtcbiAgcmV0dXJuIFwidHJhbnNsYXRlKDAsXCIgKyB5ICsgXCIpXCI7XG59XG5cbmZ1bmN0aW9uIG51bWJlcihzY2FsZSkge1xuICByZXR1cm4gZCA9PiArc2NhbGUoZCk7XG59XG5cbmZ1bmN0aW9uIGNlbnRlcihzY2FsZSwgb2Zmc2V0KSB7XG4gIG9mZnNldCA9IE1hdGgubWF4KDAsIHNjYWxlLmJhbmR3aWR0aCgpIC0gb2Zmc2V0ICogMikgLyAyO1xuICBpZiAoc2NhbGUucm91bmQoKSkgb2Zmc2V0ID0gTWF0aC5yb3VuZChvZmZzZXQpO1xuICByZXR1cm4gZCA9PiArc2NhbGUoZCkgKyBvZmZzZXQ7XG59XG5cbmZ1bmN0aW9uIGVudGVyaW5nKCkge1xuICByZXR1cm4gIXRoaXMuX19heGlzO1xufVxuXG5mdW5jdGlvbiBheGlzKG9yaWVudCwgc2NhbGUpIHtcbiAgdmFyIHRpY2tBcmd1bWVudHMgPSBbXSxcbiAgICAgIHRpY2tWYWx1ZXMgPSBudWxsLFxuICAgICAgdGlja0Zvcm1hdCA9IG51bGwsXG4gICAgICB0aWNrU2l6ZUlubmVyID0gNixcbiAgICAgIHRpY2tTaXplT3V0ZXIgPSA2LFxuICAgICAgdGlja1BhZGRpbmcgPSAzLFxuICAgICAgb2Zmc2V0ID0gdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyA+IDEgPyAwIDogMC41LFxuICAgICAgayA9IG9yaWVudCA9PT0gdG9wIHx8IG9yaWVudCA9PT0gbGVmdCA/IC0xIDogMSxcbiAgICAgIHggPSBvcmllbnQgPT09IGxlZnQgfHwgb3JpZW50ID09PSByaWdodCA/IFwieFwiIDogXCJ5XCIsXG4gICAgICB0cmFuc2Zvcm0gPSBvcmllbnQgPT09IHRvcCB8fCBvcmllbnQgPT09IGJvdHRvbSA/IHRyYW5zbGF0ZVggOiB0cmFuc2xhdGVZO1xuXG4gIGZ1bmN0aW9uIGF4aXMoY29udGV4dCkge1xuICAgIHZhciB2YWx1ZXMgPSB0aWNrVmFsdWVzID09IG51bGwgPyAoc2NhbGUudGlja3MgPyBzY2FsZS50aWNrcy5hcHBseShzY2FsZSwgdGlja0FyZ3VtZW50cykgOiBzY2FsZS5kb21haW4oKSkgOiB0aWNrVmFsdWVzLFxuICAgICAgICBmb3JtYXQgPSB0aWNrRm9ybWF0ID09IG51bGwgPyAoc2NhbGUudGlja0Zvcm1hdCA/IHNjYWxlLnRpY2tGb3JtYXQuYXBwbHkoc2NhbGUsIHRpY2tBcmd1bWVudHMpIDogaWRlbnRpdHkpIDogdGlja0Zvcm1hdCxcbiAgICAgICAgc3BhY2luZyA9IE1hdGgubWF4KHRpY2tTaXplSW5uZXIsIDApICsgdGlja1BhZGRpbmcsXG4gICAgICAgIHJhbmdlID0gc2NhbGUucmFuZ2UoKSxcbiAgICAgICAgcmFuZ2UwID0gK3JhbmdlWzBdICsgb2Zmc2V0LFxuICAgICAgICByYW5nZTEgPSArcmFuZ2VbcmFuZ2UubGVuZ3RoIC0gMV0gKyBvZmZzZXQsXG4gICAgICAgIHBvc2l0aW9uID0gKHNjYWxlLmJhbmR3aWR0aCA/IGNlbnRlciA6IG51bWJlcikoc2NhbGUuY29weSgpLCBvZmZzZXQpLFxuICAgICAgICBzZWxlY3Rpb24gPSBjb250ZXh0LnNlbGVjdGlvbiA/IGNvbnRleHQuc2VsZWN0aW9uKCkgOiBjb250ZXh0LFxuICAgICAgICBwYXRoID0gc2VsZWN0aW9uLnNlbGVjdEFsbChcIi5kb21haW5cIikuZGF0YShbbnVsbF0pLFxuICAgICAgICB0aWNrID0gc2VsZWN0aW9uLnNlbGVjdEFsbChcIi50aWNrXCIpLmRhdGEodmFsdWVzLCBzY2FsZSkub3JkZXIoKSxcbiAgICAgICAgdGlja0V4aXQgPSB0aWNrLmV4aXQoKSxcbiAgICAgICAgdGlja0VudGVyID0gdGljay5lbnRlcigpLmFwcGVuZChcImdcIikuYXR0cihcImNsYXNzXCIsIFwidGlja1wiKSxcbiAgICAgICAgbGluZSA9IHRpY2suc2VsZWN0KFwibGluZVwiKSxcbiAgICAgICAgdGV4dCA9IHRpY2suc2VsZWN0KFwidGV4dFwiKTtcblxuICAgIHBhdGggPSBwYXRoLm1lcmdlKHBhdGguZW50ZXIoKS5pbnNlcnQoXCJwYXRoXCIsIFwiLnRpY2tcIilcbiAgICAgICAgLmF0dHIoXCJjbGFzc1wiLCBcImRvbWFpblwiKVxuICAgICAgICAuYXR0cihcInN0cm9rZVwiLCBcImN1cnJlbnRDb2xvclwiKSk7XG5cbiAgICB0aWNrID0gdGljay5tZXJnZSh0aWNrRW50ZXIpO1xuXG4gICAgbGluZSA9IGxpbmUubWVyZ2UodGlja0VudGVyLmFwcGVuZChcImxpbmVcIilcbiAgICAgICAgLmF0dHIoXCJzdHJva2VcIiwgXCJjdXJyZW50Q29sb3JcIilcbiAgICAgICAgLmF0dHIoeCArIFwiMlwiLCBrICogdGlja1NpemVJbm5lcikpO1xuXG4gICAgdGV4dCA9IHRleHQubWVyZ2UodGlja0VudGVyLmFwcGVuZChcInRleHRcIilcbiAgICAgICAgLmF0dHIoXCJmaWxsXCIsIFwiY3VycmVudENvbG9yXCIpXG4gICAgICAgIC5hdHRyKHgsIGsgKiBzcGFjaW5nKVxuICAgICAgICAuYXR0cihcImR5XCIsIG9yaWVudCA9PT0gdG9wID8gXCIwZW1cIiA6IG9yaWVudCA9PT0gYm90dG9tID8gXCIwLjcxZW1cIiA6IFwiMC4zMmVtXCIpKTtcblxuICAgIGlmIChjb250ZXh0ICE9PSBzZWxlY3Rpb24pIHtcbiAgICAgIHBhdGggPSBwYXRoLnRyYW5zaXRpb24oY29udGV4dCk7XG4gICAgICB0aWNrID0gdGljay50cmFuc2l0aW9uKGNvbnRleHQpO1xuICAgICAgbGluZSA9IGxpbmUudHJhbnNpdGlvbihjb250ZXh0KTtcbiAgICAgIHRleHQgPSB0ZXh0LnRyYW5zaXRpb24oY29udGV4dCk7XG5cbiAgICAgIHRpY2tFeGl0ID0gdGlja0V4aXQudHJhbnNpdGlvbihjb250ZXh0KVxuICAgICAgICAgIC5hdHRyKFwib3BhY2l0eVwiLCBlcHNpbG9uKVxuICAgICAgICAgIC5hdHRyKFwidHJhbnNmb3JtXCIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGlzRmluaXRlKGQgPSBwb3NpdGlvbihkKSkgPyB0cmFuc2Zvcm0oZCArIG9mZnNldCkgOiB0aGlzLmdldEF0dHJpYnV0ZShcInRyYW5zZm9ybVwiKTsgfSk7XG5cbiAgICAgIHRpY2tFbnRlclxuICAgICAgICAgIC5hdHRyKFwib3BhY2l0eVwiLCBlcHNpbG9uKVxuICAgICAgICAgIC5hdHRyKFwidHJhbnNmb3JtXCIsIGZ1bmN0aW9uKGQpIHsgdmFyIHAgPSB0aGlzLnBhcmVudE5vZGUuX19heGlzOyByZXR1cm4gdHJhbnNmb3JtKChwICYmIGlzRmluaXRlKHAgPSBwKGQpKSA/IHAgOiBwb3NpdGlvbihkKSkgKyBvZmZzZXQpOyB9KTtcbiAgICB9XG5cbiAgICB0aWNrRXhpdC5yZW1vdmUoKTtcblxuICAgIHBhdGhcbiAgICAgICAgLmF0dHIoXCJkXCIsIG9yaWVudCA9PT0gbGVmdCB8fCBvcmllbnQgPT09IHJpZ2h0XG4gICAgICAgICAgICA/ICh0aWNrU2l6ZU91dGVyID8gXCJNXCIgKyBrICogdGlja1NpemVPdXRlciArIFwiLFwiICsgcmFuZ2UwICsgXCJIXCIgKyBvZmZzZXQgKyBcIlZcIiArIHJhbmdlMSArIFwiSFwiICsgayAqIHRpY2tTaXplT3V0ZXIgOiBcIk1cIiArIG9mZnNldCArIFwiLFwiICsgcmFuZ2UwICsgXCJWXCIgKyByYW5nZTEpXG4gICAgICAgICAgICA6ICh0aWNrU2l6ZU91dGVyID8gXCJNXCIgKyByYW5nZTAgKyBcIixcIiArIGsgKiB0aWNrU2l6ZU91dGVyICsgXCJWXCIgKyBvZmZzZXQgKyBcIkhcIiArIHJhbmdlMSArIFwiVlwiICsgayAqIHRpY2tTaXplT3V0ZXIgOiBcIk1cIiArIHJhbmdlMCArIFwiLFwiICsgb2Zmc2V0ICsgXCJIXCIgKyByYW5nZTEpKTtcblxuICAgIHRpY2tcbiAgICAgICAgLmF0dHIoXCJvcGFjaXR5XCIsIDEpXG4gICAgICAgIC5hdHRyKFwidHJhbnNmb3JtXCIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIHRyYW5zZm9ybShwb3NpdGlvbihkKSArIG9mZnNldCk7IH0pO1xuXG4gICAgbGluZVxuICAgICAgICAuYXR0cih4ICsgXCIyXCIsIGsgKiB0aWNrU2l6ZUlubmVyKTtcblxuICAgIHRleHRcbiAgICAgICAgLmF0dHIoeCwgayAqIHNwYWNpbmcpXG4gICAgICAgIC50ZXh0KGZvcm1hdCk7XG5cbiAgICBzZWxlY3Rpb24uZmlsdGVyKGVudGVyaW5nKVxuICAgICAgICAuYXR0cihcImZpbGxcIiwgXCJub25lXCIpXG4gICAgICAgIC5hdHRyKFwiZm9udC1zaXplXCIsIDEwKVxuICAgICAgICAuYXR0cihcImZvbnQtZmFtaWx5XCIsIFwic2Fucy1zZXJpZlwiKVxuICAgICAgICAuYXR0cihcInRleHQtYW5jaG9yXCIsIG9yaWVudCA9PT0gcmlnaHQgPyBcInN0YXJ0XCIgOiBvcmllbnQgPT09IGxlZnQgPyBcImVuZFwiIDogXCJtaWRkbGVcIik7XG5cbiAgICBzZWxlY3Rpb25cbiAgICAgICAgLmVhY2goZnVuY3Rpb24oKSB7IHRoaXMuX19heGlzID0gcG9zaXRpb247IH0pO1xuICB9XG5cbiAgYXhpcy5zY2FsZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzY2FsZSA9IF8sIGF4aXMpIDogc2NhbGU7XG4gIH07XG5cbiAgYXhpcy50aWNrcyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aWNrQXJndW1lbnRzID0gQXJyYXkuZnJvbShhcmd1bWVudHMpLCBheGlzO1xuICB9O1xuXG4gIGF4aXMudGlja0FyZ3VtZW50cyA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aWNrQXJndW1lbnRzID0gXyA9PSBudWxsID8gW10gOiBBcnJheS5mcm9tKF8pLCBheGlzKSA6IHRpY2tBcmd1bWVudHMuc2xpY2UoKTtcbiAgfTtcblxuICBheGlzLnRpY2tWYWx1ZXMgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGlja1ZhbHVlcyA9IF8gPT0gbnVsbCA/IG51bGwgOiBBcnJheS5mcm9tKF8pLCBheGlzKSA6IHRpY2tWYWx1ZXMgJiYgdGlja1ZhbHVlcy5zbGljZSgpO1xuICB9O1xuXG4gIGF4aXMudGlja0Zvcm1hdCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aWNrRm9ybWF0ID0gXywgYXhpcykgOiB0aWNrRm9ybWF0O1xuICB9O1xuXG4gIGF4aXMudGlja1NpemUgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGlja1NpemVJbm5lciA9IHRpY2tTaXplT3V0ZXIgPSArXywgYXhpcykgOiB0aWNrU2l6ZUlubmVyO1xuICB9O1xuXG4gIGF4aXMudGlja1NpemVJbm5lciA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aWNrU2l6ZUlubmVyID0gK18sIGF4aXMpIDogdGlja1NpemVJbm5lcjtcbiAgfTtcblxuICBheGlzLnRpY2tTaXplT3V0ZXIgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGlja1NpemVPdXRlciA9ICtfLCBheGlzKSA6IHRpY2tTaXplT3V0ZXI7XG4gIH07XG5cbiAgYXhpcy50aWNrUGFkZGluZyA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aWNrUGFkZGluZyA9ICtfLCBheGlzKSA6IHRpY2tQYWRkaW5nO1xuICB9O1xuXG4gIGF4aXMub2Zmc2V0ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG9mZnNldCA9ICtfLCBheGlzKSA6IG9mZnNldDtcbiAgfTtcblxuICByZXR1cm4gYXhpcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGF4aXNUb3Aoc2NhbGUpIHtcbiAgcmV0dXJuIGF4aXModG9wLCBzY2FsZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBheGlzUmlnaHQoc2NhbGUpIHtcbiAgcmV0dXJuIGF4aXMocmlnaHQsIHNjYWxlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGF4aXNCb3R0b20oc2NhbGUpIHtcbiAgcmV0dXJuIGF4aXMoYm90dG9tLCBzY2FsZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBheGlzTGVmdChzY2FsZSkge1xuICByZXR1cm4gYXhpcyhsZWZ0LCBzY2FsZSk7XG59XG4iLCJleHBvcnQge1xuICBheGlzVG9wLFxuICBheGlzUmlnaHQsXG4gIGF4aXNCb3R0b20sXG4gIGF4aXNMZWZ0XG59IGZyb20gXCIuL2F4aXMuanNcIjtcbiIsImZ1bmN0aW9uIG5vbmUoKSB7fVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3Rvcikge1xuICByZXR1cm4gc2VsZWN0b3IgPT0gbnVsbCA/IG5vbmUgOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgfTtcbn1cbiIsImltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuaW1wb3J0IHNlbGVjdG9yIGZyb20gXCIuLi9zZWxlY3Rvci5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3QpIHtcbiAgaWYgKHR5cGVvZiBzZWxlY3QgIT09IFwiZnVuY3Rpb25cIikgc2VsZWN0ID0gc2VsZWN0b3Ioc2VsZWN0KTtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIHN1Ymdyb3VwID0gc3ViZ3JvdXBzW2pdID0gbmV3IEFycmF5KG4pLCBub2RlLCBzdWJub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIChzdWJub2RlID0gc2VsZWN0LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKSkge1xuICAgICAgICBpZiAoXCJfX2RhdGFfX1wiIGluIG5vZGUpIHN1Ym5vZGUuX19kYXRhX18gPSBub2RlLl9fZGF0YV9fO1xuICAgICAgICBzdWJncm91cFtpXSA9IHN1Ym5vZGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24oc3ViZ3JvdXBzLCB0aGlzLl9wYXJlbnRzKTtcbn1cbiIsIi8vIEdpdmVuIHNvbWV0aGluZyBhcnJheSBsaWtlIChvciBudWxsKSwgcmV0dXJucyBzb21ldGhpbmcgdGhhdCBpcyBzdHJpY3RseSBhblxuLy8gYXJyYXkuIFRoaXMgaXMgdXNlZCB0byBlbnN1cmUgdGhhdCBhcnJheS1saWtlIG9iamVjdHMgcGFzc2VkIHRvIGQzLnNlbGVjdEFsbFxuLy8gb3Igc2VsZWN0aW9uLnNlbGVjdEFsbCBhcmUgY29udmVydGVkIGludG8gcHJvcGVyIGFycmF5cyB3aGVuIGNyZWF0aW5nIGFcbi8vIHNlbGVjdGlvbjsgd2UgZG9u4oCZdCBldmVyIHdhbnQgdG8gY3JlYXRlIGEgc2VsZWN0aW9uIGJhY2tlZCBieSBhIGxpdmVcbi8vIEhUTUxDb2xsZWN0aW9uIG9yIE5vZGVMaXN0LiBIb3dldmVyLCBub3RlIHRoYXQgc2VsZWN0aW9uLnNlbGVjdEFsbCB3aWxsIHVzZSBhXG4vLyBzdGF0aWMgTm9kZUxpc3QgYXMgYSBncm91cCwgc2luY2UgaXQgc2FmZWx5IGRlcml2ZWQgZnJvbSBxdWVyeVNlbGVjdG9yQWxsLlxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYXJyYXkoeCkge1xuICByZXR1cm4geCA9PSBudWxsID8gW10gOiBBcnJheS5pc0FycmF5KHgpID8geCA6IEFycmF5LmZyb20oeCk7XG59XG4iLCJmdW5jdGlvbiBlbXB0eSgpIHtcbiAgcmV0dXJuIFtdO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3Rvcikge1xuICByZXR1cm4gc2VsZWN0b3IgPT0gbnVsbCA/IGVtcHR5IDogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7XG4gIH07XG59XG4iLCJpbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcbmltcG9ydCBhcnJheSBmcm9tIFwiLi4vYXJyYXkuanNcIjtcbmltcG9ydCBzZWxlY3RvckFsbCBmcm9tIFwiLi4vc2VsZWN0b3JBbGwuanNcIjtcblxuZnVuY3Rpb24gYXJyYXlBbGwoc2VsZWN0KSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gYXJyYXkoc2VsZWN0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3QpIHtcbiAgaWYgKHR5cGVvZiBzZWxlY3QgPT09IFwiZnVuY3Rpb25cIikgc2VsZWN0ID0gYXJyYXlBbGwoc2VsZWN0KTtcbiAgZWxzZSBzZWxlY3QgPSBzZWxlY3RvckFsbChzZWxlY3QpO1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IFtdLCBwYXJlbnRzID0gW10sIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICAgIHN1Ymdyb3Vwcy5wdXNoKHNlbGVjdC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSk7XG4gICAgICAgIHBhcmVudHMucHVzaChub2RlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFNlbGVjdGlvbihzdWJncm91cHMsIHBhcmVudHMpO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0b3IpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLm1hdGNoZXMoc2VsZWN0b3IpO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hpbGRNYXRjaGVyKHNlbGVjdG9yKSB7XG4gIHJldHVybiBmdW5jdGlvbihub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUubWF0Y2hlcyhzZWxlY3Rvcik7XG4gIH07XG59XG5cbiIsImltcG9ydCB7Y2hpbGRNYXRjaGVyfSBmcm9tIFwiLi4vbWF0Y2hlci5qc1wiO1xuXG52YXIgZmluZCA9IEFycmF5LnByb3RvdHlwZS5maW5kO1xuXG5mdW5jdGlvbiBjaGlsZEZpbmQobWF0Y2gpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBmaW5kLmNhbGwodGhpcy5jaGlsZHJlbiwgbWF0Y2gpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBjaGlsZEZpcnN0KCkge1xuICByZXR1cm4gdGhpcy5maXJzdEVsZW1lbnRDaGlsZDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obWF0Y2gpIHtcbiAgcmV0dXJuIHRoaXMuc2VsZWN0KG1hdGNoID09IG51bGwgPyBjaGlsZEZpcnN0XG4gICAgICA6IGNoaWxkRmluZCh0eXBlb2YgbWF0Y2ggPT09IFwiZnVuY3Rpb25cIiA/IG1hdGNoIDogY2hpbGRNYXRjaGVyKG1hdGNoKSkpO1xufVxuIiwiaW1wb3J0IHtjaGlsZE1hdGNoZXJ9IGZyb20gXCIuLi9tYXRjaGVyLmpzXCI7XG5cbnZhciBmaWx0ZXIgPSBBcnJheS5wcm90b3R5cGUuZmlsdGVyO1xuXG5mdW5jdGlvbiBjaGlsZHJlbigpIHtcbiAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5jaGlsZHJlbik7XG59XG5cbmZ1bmN0aW9uIGNoaWxkcmVuRmlsdGVyKG1hdGNoKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZmlsdGVyLmNhbGwodGhpcy5jaGlsZHJlbiwgbWF0Y2gpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihtYXRjaCkge1xuICByZXR1cm4gdGhpcy5zZWxlY3RBbGwobWF0Y2ggPT0gbnVsbCA/IGNoaWxkcmVuXG4gICAgICA6IGNoaWxkcmVuRmlsdGVyKHR5cGVvZiBtYXRjaCA9PT0gXCJmdW5jdGlvblwiID8gbWF0Y2ggOiBjaGlsZE1hdGNoZXIobWF0Y2gpKSk7XG59XG4iLCJpbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcbmltcG9ydCBtYXRjaGVyIGZyb20gXCIuLi9tYXRjaGVyLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG1hdGNoKSB7XG4gIGlmICh0eXBlb2YgbWF0Y2ggIT09IFwiZnVuY3Rpb25cIikgbWF0Y2ggPSBtYXRjaGVyKG1hdGNoKTtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIHN1Ymdyb3VwID0gc3ViZ3JvdXBzW2pdID0gW10sIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgbWF0Y2guY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkpIHtcbiAgICAgICAgc3ViZ3JvdXAucHVzaChub2RlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFNlbGVjdGlvbihzdWJncm91cHMsIHRoaXMuX3BhcmVudHMpO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odXBkYXRlKSB7XG4gIHJldHVybiBuZXcgQXJyYXkodXBkYXRlLmxlbmd0aCk7XG59XG4iLCJpbXBvcnQgc3BhcnNlIGZyb20gXCIuL3NwYXJzZS5qc1wiO1xuaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFNlbGVjdGlvbih0aGlzLl9lbnRlciB8fCB0aGlzLl9ncm91cHMubWFwKHNwYXJzZSksIHRoaXMuX3BhcmVudHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gRW50ZXJOb2RlKHBhcmVudCwgZGF0dW0pIHtcbiAgdGhpcy5vd25lckRvY3VtZW50ID0gcGFyZW50Lm93bmVyRG9jdW1lbnQ7XG4gIHRoaXMubmFtZXNwYWNlVVJJID0gcGFyZW50Lm5hbWVzcGFjZVVSSTtcbiAgdGhpcy5fbmV4dCA9IG51bGw7XG4gIHRoaXMuX3BhcmVudCA9IHBhcmVudDtcbiAgdGhpcy5fX2RhdGFfXyA9IGRhdHVtO1xufVxuXG5FbnRlck5vZGUucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogRW50ZXJOb2RlLFxuICBhcHBlbmRDaGlsZDogZnVuY3Rpb24oY2hpbGQpIHsgcmV0dXJuIHRoaXMuX3BhcmVudC5pbnNlcnRCZWZvcmUoY2hpbGQsIHRoaXMuX25leHQpOyB9LFxuICBpbnNlcnRCZWZvcmU6IGZ1bmN0aW9uKGNoaWxkLCBuZXh0KSB7IHJldHVybiB0aGlzLl9wYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLCBuZXh0KTsgfSxcbiAgcXVlcnlTZWxlY3RvcjogZnVuY3Rpb24oc2VsZWN0b3IpIHsgcmV0dXJuIHRoaXMuX3BhcmVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTsgfSxcbiAgcXVlcnlTZWxlY3RvckFsbDogZnVuY3Rpb24oc2VsZWN0b3IpIHsgcmV0dXJuIHRoaXMuX3BhcmVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTsgfVxufTtcbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB4O1xuICB9O1xufVxuIiwiaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5pbXBvcnQge0VudGVyTm9kZX0gZnJvbSBcIi4vZW50ZXIuanNcIjtcbmltcG9ydCBjb25zdGFudCBmcm9tIFwiLi4vY29uc3RhbnQuanNcIjtcblxuZnVuY3Rpb24gYmluZEluZGV4KHBhcmVudCwgZ3JvdXAsIGVudGVyLCB1cGRhdGUsIGV4aXQsIGRhdGEpIHtcbiAgdmFyIGkgPSAwLFxuICAgICAgbm9kZSxcbiAgICAgIGdyb3VwTGVuZ3RoID0gZ3JvdXAubGVuZ3RoLFxuICAgICAgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoO1xuXG4gIC8vIFB1dCBhbnkgbm9uLW51bGwgbm9kZXMgdGhhdCBmaXQgaW50byB1cGRhdGUuXG4gIC8vIFB1dCBhbnkgbnVsbCBub2RlcyBpbnRvIGVudGVyLlxuICAvLyBQdXQgYW55IHJlbWFpbmluZyBkYXRhIGludG8gZW50ZXIuXG4gIGZvciAoOyBpIDwgZGF0YUxlbmd0aDsgKytpKSB7XG4gICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgbm9kZS5fX2RhdGFfXyA9IGRhdGFbaV07XG4gICAgICB1cGRhdGVbaV0gPSBub2RlO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbnRlcltpXSA9IG5ldyBFbnRlck5vZGUocGFyZW50LCBkYXRhW2ldKTtcbiAgICB9XG4gIH1cblxuICAvLyBQdXQgYW55IG5vbi1udWxsIG5vZGVzIHRoYXQgZG9u4oCZdCBmaXQgaW50byBleGl0LlxuICBmb3IgKDsgaSA8IGdyb3VwTGVuZ3RoOyArK2kpIHtcbiAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICBleGl0W2ldID0gbm9kZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYmluZEtleShwYXJlbnQsIGdyb3VwLCBlbnRlciwgdXBkYXRlLCBleGl0LCBkYXRhLCBrZXkpIHtcbiAgdmFyIGksXG4gICAgICBub2RlLFxuICAgICAgbm9kZUJ5S2V5VmFsdWUgPSBuZXcgTWFwLFxuICAgICAgZ3JvdXBMZW5ndGggPSBncm91cC5sZW5ndGgsXG4gICAgICBkYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGgsXG4gICAgICBrZXlWYWx1ZXMgPSBuZXcgQXJyYXkoZ3JvdXBMZW5ndGgpLFxuICAgICAga2V5VmFsdWU7XG5cbiAgLy8gQ29tcHV0ZSB0aGUga2V5IGZvciBlYWNoIG5vZGUuXG4gIC8vIElmIG11bHRpcGxlIG5vZGVzIGhhdmUgdGhlIHNhbWUga2V5LCB0aGUgZHVwbGljYXRlcyBhcmUgYWRkZWQgdG8gZXhpdC5cbiAgZm9yIChpID0gMDsgaSA8IGdyb3VwTGVuZ3RoOyArK2kpIHtcbiAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICBrZXlWYWx1ZXNbaV0gPSBrZXlWYWx1ZSA9IGtleS5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSArIFwiXCI7XG4gICAgICBpZiAobm9kZUJ5S2V5VmFsdWUuaGFzKGtleVZhbHVlKSkge1xuICAgICAgICBleGl0W2ldID0gbm9kZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5vZGVCeUtleVZhbHVlLnNldChrZXlWYWx1ZSwgbm9kZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gQ29tcHV0ZSB0aGUga2V5IGZvciBlYWNoIGRhdHVtLlxuICAvLyBJZiB0aGVyZSBhIG5vZGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMga2V5LCBqb2luIGFuZCBhZGQgaXQgdG8gdXBkYXRlLlxuICAvLyBJZiB0aGVyZSBpcyBub3QgKG9yIHRoZSBrZXkgaXMgYSBkdXBsaWNhdGUpLCBhZGQgaXQgdG8gZW50ZXIuXG4gIGZvciAoaSA9IDA7IGkgPCBkYXRhTGVuZ3RoOyArK2kpIHtcbiAgICBrZXlWYWx1ZSA9IGtleS5jYWxsKHBhcmVudCwgZGF0YVtpXSwgaSwgZGF0YSkgKyBcIlwiO1xuICAgIGlmIChub2RlID0gbm9kZUJ5S2V5VmFsdWUuZ2V0KGtleVZhbHVlKSkge1xuICAgICAgdXBkYXRlW2ldID0gbm9kZTtcbiAgICAgIG5vZGUuX19kYXRhX18gPSBkYXRhW2ldO1xuICAgICAgbm9kZUJ5S2V5VmFsdWUuZGVsZXRlKGtleVZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZW50ZXJbaV0gPSBuZXcgRW50ZXJOb2RlKHBhcmVudCwgZGF0YVtpXSk7XG4gICAgfVxuICB9XG5cbiAgLy8gQWRkIGFueSByZW1haW5pbmcgbm9kZXMgdGhhdCB3ZXJlIG5vdCBib3VuZCB0byBkYXRhIHRvIGV4aXQuXG4gIGZvciAoaSA9IDA7IGkgPCBncm91cExlbmd0aDsgKytpKSB7XG4gICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIChub2RlQnlLZXlWYWx1ZS5nZXQoa2V5VmFsdWVzW2ldKSA9PT0gbm9kZSkpIHtcbiAgICAgIGV4aXRbaV0gPSBub2RlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBkYXR1bShub2RlKSB7XG4gIHJldHVybiBub2RlLl9fZGF0YV9fO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIEFycmF5LmZyb20odGhpcywgZGF0dW0pO1xuXG4gIHZhciBiaW5kID0ga2V5ID8gYmluZEtleSA6IGJpbmRJbmRleCxcbiAgICAgIHBhcmVudHMgPSB0aGlzLl9wYXJlbnRzLFxuICAgICAgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzO1xuXG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdmFsdWUgPSBjb25zdGFudCh2YWx1ZSk7XG5cbiAgZm9yICh2YXIgbSA9IGdyb3Vwcy5sZW5ndGgsIHVwZGF0ZSA9IG5ldyBBcnJheShtKSwgZW50ZXIgPSBuZXcgQXJyYXkobSksIGV4aXQgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgdmFyIHBhcmVudCA9IHBhcmVudHNbal0sXG4gICAgICAgIGdyb3VwID0gZ3JvdXBzW2pdLFxuICAgICAgICBncm91cExlbmd0aCA9IGdyb3VwLmxlbmd0aCxcbiAgICAgICAgZGF0YSA9IGFycmF5bGlrZSh2YWx1ZS5jYWxsKHBhcmVudCwgcGFyZW50ICYmIHBhcmVudC5fX2RhdGFfXywgaiwgcGFyZW50cykpLFxuICAgICAgICBkYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGgsXG4gICAgICAgIGVudGVyR3JvdXAgPSBlbnRlcltqXSA9IG5ldyBBcnJheShkYXRhTGVuZ3RoKSxcbiAgICAgICAgdXBkYXRlR3JvdXAgPSB1cGRhdGVbal0gPSBuZXcgQXJyYXkoZGF0YUxlbmd0aCksXG4gICAgICAgIGV4aXRHcm91cCA9IGV4aXRbal0gPSBuZXcgQXJyYXkoZ3JvdXBMZW5ndGgpO1xuXG4gICAgYmluZChwYXJlbnQsIGdyb3VwLCBlbnRlckdyb3VwLCB1cGRhdGVHcm91cCwgZXhpdEdyb3VwLCBkYXRhLCBrZXkpO1xuXG4gICAgLy8gTm93IGNvbm5lY3QgdGhlIGVudGVyIG5vZGVzIHRvIHRoZWlyIGZvbGxvd2luZyB1cGRhdGUgbm9kZSwgc3VjaCB0aGF0XG4gICAgLy8gYXBwZW5kQ2hpbGQgY2FuIGluc2VydCB0aGUgbWF0ZXJpYWxpemVkIGVudGVyIG5vZGUgYmVmb3JlIHRoaXMgbm9kZSxcbiAgICAvLyByYXRoZXIgdGhhbiBhdCB0aGUgZW5kIG9mIHRoZSBwYXJlbnQgbm9kZS5cbiAgICBmb3IgKHZhciBpMCA9IDAsIGkxID0gMCwgcHJldmlvdXMsIG5leHQ7IGkwIDwgZGF0YUxlbmd0aDsgKytpMCkge1xuICAgICAgaWYgKHByZXZpb3VzID0gZW50ZXJHcm91cFtpMF0pIHtcbiAgICAgICAgaWYgKGkwID49IGkxKSBpMSA9IGkwICsgMTtcbiAgICAgICAgd2hpbGUgKCEobmV4dCA9IHVwZGF0ZUdyb3VwW2kxXSkgJiYgKytpMSA8IGRhdGFMZW5ndGgpO1xuICAgICAgICBwcmV2aW91cy5fbmV4dCA9IG5leHQgfHwgbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB1cGRhdGUgPSBuZXcgU2VsZWN0aW9uKHVwZGF0ZSwgcGFyZW50cyk7XG4gIHVwZGF0ZS5fZW50ZXIgPSBlbnRlcjtcbiAgdXBkYXRlLl9leGl0ID0gZXhpdDtcbiAgcmV0dXJuIHVwZGF0ZTtcbn1cblxuLy8gR2l2ZW4gc29tZSBkYXRhLCB0aGlzIHJldHVybnMgYW4gYXJyYXktbGlrZSB2aWV3IG9mIGl0OiBhbiBvYmplY3QgdGhhdFxuLy8gZXhwb3NlcyBhIGxlbmd0aCBwcm9wZXJ0eSBhbmQgYWxsb3dzIG51bWVyaWMgaW5kZXhpbmcuIE5vdGUgdGhhdCB1bmxpa2Vcbi8vIHNlbGVjdEFsbCwgdGhpcyBpc27igJl0IHdvcnJpZWQgYWJvdXQg4oCcbGl2ZeKAnSBjb2xsZWN0aW9ucyBiZWNhdXNlIHRoZSByZXN1bHRpbmdcbi8vIGFycmF5IHdpbGwgb25seSBiZSB1c2VkIGJyaWVmbHkgd2hpbGUgZGF0YSBpcyBiZWluZyBib3VuZC4gKEl0IGlzIHBvc3NpYmxlIHRvXG4vLyBjYXVzZSB0aGUgZGF0YSB0byBjaGFuZ2Ugd2hpbGUgaXRlcmF0aW5nIGJ5IHVzaW5nIGEga2V5IGZ1bmN0aW9uLCBidXQgcGxlYXNlXG4vLyBkb27igJl0OyB3ZeKAmWQgcmF0aGVyIGF2b2lkIGEgZ3JhdHVpdG91cyBjb3B5LilcbmZ1bmN0aW9uIGFycmF5bGlrZShkYXRhKSB7XG4gIHJldHVybiB0eXBlb2YgZGF0YSA9PT0gXCJvYmplY3RcIiAmJiBcImxlbmd0aFwiIGluIGRhdGFcbiAgICA/IGRhdGEgLy8gQXJyYXksIFR5cGVkQXJyYXksIE5vZGVMaXN0LCBhcnJheS1saWtlXG4gICAgOiBBcnJheS5mcm9tKGRhdGEpOyAvLyBNYXAsIFNldCwgaXRlcmFibGUsIHN0cmluZywgb3IgYW55dGhpbmcgZWxzZVxufVxuIiwiaW1wb3J0IHNwYXJzZSBmcm9tIFwiLi9zcGFyc2UuanNcIjtcbmltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24odGhpcy5fZXhpdCB8fCB0aGlzLl9ncm91cHMubWFwKHNwYXJzZSksIHRoaXMuX3BhcmVudHMpO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24ob25lbnRlciwgb251cGRhdGUsIG9uZXhpdCkge1xuICB2YXIgZW50ZXIgPSB0aGlzLmVudGVyKCksIHVwZGF0ZSA9IHRoaXMsIGV4aXQgPSB0aGlzLmV4aXQoKTtcbiAgaWYgKHR5cGVvZiBvbmVudGVyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBlbnRlciA9IG9uZW50ZXIoZW50ZXIpO1xuICAgIGlmIChlbnRlcikgZW50ZXIgPSBlbnRlci5zZWxlY3Rpb24oKTtcbiAgfSBlbHNlIHtcbiAgICBlbnRlciA9IGVudGVyLmFwcGVuZChvbmVudGVyICsgXCJcIik7XG4gIH1cbiAgaWYgKG9udXBkYXRlICE9IG51bGwpIHtcbiAgICB1cGRhdGUgPSBvbnVwZGF0ZSh1cGRhdGUpO1xuICAgIGlmICh1cGRhdGUpIHVwZGF0ZSA9IHVwZGF0ZS5zZWxlY3Rpb24oKTtcbiAgfVxuICBpZiAob25leGl0ID09IG51bGwpIGV4aXQucmVtb3ZlKCk7IGVsc2Ugb25leGl0KGV4aXQpO1xuICByZXR1cm4gZW50ZXIgJiYgdXBkYXRlID8gZW50ZXIubWVyZ2UodXBkYXRlKS5vcmRlcigpIDogdXBkYXRlO1xufVxuIiwiaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNvbnRleHQpIHtcbiAgdmFyIHNlbGVjdGlvbiA9IGNvbnRleHQuc2VsZWN0aW9uID8gY29udGV4dC5zZWxlY3Rpb24oKSA6IGNvbnRleHQ7XG5cbiAgZm9yICh2YXIgZ3JvdXBzMCA9IHRoaXMuX2dyb3VwcywgZ3JvdXBzMSA9IHNlbGVjdGlvbi5fZ3JvdXBzLCBtMCA9IGdyb3VwczAubGVuZ3RoLCBtMSA9IGdyb3VwczEubGVuZ3RoLCBtID0gTWF0aC5taW4obTAsIG0xKSwgbWVyZ2VzID0gbmV3IEFycmF5KG0wKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cDAgPSBncm91cHMwW2pdLCBncm91cDEgPSBncm91cHMxW2pdLCBuID0gZ3JvdXAwLmxlbmd0aCwgbWVyZ2UgPSBtZXJnZXNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwMFtpXSB8fCBncm91cDFbaV0pIHtcbiAgICAgICAgbWVyZ2VbaV0gPSBub2RlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZvciAoOyBqIDwgbTA7ICsraikge1xuICAgIG1lcmdlc1tqXSA9IGdyb3VwczBbal07XG4gIH1cblxuICByZXR1cm4gbmV3IFNlbGVjdGlvbihtZXJnZXMsIHRoaXMuX3BhcmVudHMpO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBqID0gLTEsIG0gPSBncm91cHMubGVuZ3RoOyArK2ogPCBtOykge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBpID0gZ3JvdXAubGVuZ3RoIC0gMSwgbmV4dCA9IGdyb3VwW2ldLCBub2RlOyAtLWkgPj0gMDspIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgICAgaWYgKG5leHQgJiYgbm9kZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihuZXh0KSBeIDQpIG5leHQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobm9kZSwgbmV4dCk7XG4gICAgICAgIG5leHQgPSBub2RlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufVxuIiwiaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNvbXBhcmUpIHtcbiAgaWYgKCFjb21wYXJlKSBjb21wYXJlID0gYXNjZW5kaW5nO1xuXG4gIGZ1bmN0aW9uIGNvbXBhcmVOb2RlKGEsIGIpIHtcbiAgICByZXR1cm4gYSAmJiBiID8gY29tcGFyZShhLl9fZGF0YV9fLCBiLl9fZGF0YV9fKSA6ICFhIC0gIWI7XG4gIH1cblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzb3J0Z3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBzb3J0Z3JvdXAgPSBzb3J0Z3JvdXBzW2pdID0gbmV3IEFycmF5KG4pLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgICBzb3J0Z3JvdXBbaV0gPSBub2RlO1xuICAgICAgfVxuICAgIH1cbiAgICBzb3J0Z3JvdXAuc29ydChjb21wYXJlTm9kZSk7XG4gIH1cblxuICByZXR1cm4gbmV3IFNlbGVjdGlvbihzb3J0Z3JvdXBzLCB0aGlzLl9wYXJlbnRzKS5vcmRlcigpO1xufVxuXG5mdW5jdGlvbiBhc2NlbmRpbmcoYSwgYikge1xuICByZXR1cm4gYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IGEgPj0gYiA/IDAgOiBOYU47XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIGNhbGxiYWNrID0gYXJndW1lbnRzWzBdO1xuICBhcmd1bWVudHNbMF0gPSB0aGlzO1xuICBjYWxsYmFjay5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICByZXR1cm4gdGhpcztcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgaiA9IDAsIG0gPSBncm91cHMubGVuZ3RoOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIGkgPSAwLCBuID0gZ3JvdXAubGVuZ3RoOyBpIDwgbjsgKytpKSB7XG4gICAgICB2YXIgbm9kZSA9IGdyb3VwW2ldO1xuICAgICAgaWYgKG5vZGUpIHJldHVybiBub2RlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIGxldCBzaXplID0gMDtcbiAgZm9yIChjb25zdCBub2RlIG9mIHRoaXMpICsrc2l6ZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICByZXR1cm4gc2l6ZTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gIXRoaXMubm9kZSgpO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY2FsbGJhY2spIHtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIGogPSAwLCBtID0gZ3JvdXBzLmxlbmd0aDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBpID0gMCwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZTsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgY2FsbGJhY2suY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59XG4iLCJleHBvcnQgdmFyIHhodG1sID0gXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCI7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgc3ZnOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXG4gIHhodG1sOiB4aHRtbCxcbiAgeGxpbms6IFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiLFxuICB4bWw6IFwiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlXCIsXG4gIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvXCJcbn07XG4iLCJpbXBvcnQgbmFtZXNwYWNlcyBmcm9tIFwiLi9uYW1lc3BhY2VzLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUpIHtcbiAgdmFyIHByZWZpeCA9IG5hbWUgKz0gXCJcIiwgaSA9IHByZWZpeC5pbmRleE9mKFwiOlwiKTtcbiAgaWYgKGkgPj0gMCAmJiAocHJlZml4ID0gbmFtZS5zbGljZSgwLCBpKSkgIT09IFwieG1sbnNcIikgbmFtZSA9IG5hbWUuc2xpY2UoaSArIDEpO1xuICByZXR1cm4gbmFtZXNwYWNlcy5oYXNPd25Qcm9wZXJ0eShwcmVmaXgpID8ge3NwYWNlOiBuYW1lc3BhY2VzW3ByZWZpeF0sIGxvY2FsOiBuYW1lfSA6IG5hbWU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG59XG4iLCJpbXBvcnQgbmFtZXNwYWNlIGZyb20gXCIuLi9uYW1lc3BhY2UuanNcIjtcblxuZnVuY3Rpb24gYXR0clJlbW92ZShuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0clJlbW92ZU5TKGZ1bGxuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJDb25zdGFudChuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyQ29uc3RhbnROUyhmdWxsbmFtZSwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuc2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsLCB2YWx1ZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJGdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmICh2ID09IG51bGwpIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgIGVsc2UgdGhpcy5zZXRBdHRyaWJ1dGUobmFtZSwgdik7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJGdW5jdGlvbk5TKGZ1bGxuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmICh2ID09IG51bGwpIHRoaXMucmVtb3ZlQXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTtcbiAgICBlbHNlIHRoaXMuc2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsLCB2KTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgdmFyIGZ1bGxuYW1lID0gbmFtZXNwYWNlKG5hbWUpO1xuXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgIHZhciBub2RlID0gdGhpcy5ub2RlKCk7XG4gICAgcmV0dXJuIGZ1bGxuYW1lLmxvY2FsXG4gICAgICAgID8gbm9kZS5nZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpXG4gICAgICAgIDogbm9kZS5nZXRBdHRyaWJ1dGUoZnVsbG5hbWUpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuZWFjaCgodmFsdWUgPT0gbnVsbFxuICAgICAgPyAoZnVsbG5hbWUubG9jYWwgPyBhdHRyUmVtb3ZlTlMgOiBhdHRyUmVtb3ZlKSA6ICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyAoZnVsbG5hbWUubG9jYWwgPyBhdHRyRnVuY3Rpb25OUyA6IGF0dHJGdW5jdGlvbilcbiAgICAgIDogKGZ1bGxuYW1lLmxvY2FsID8gYXR0ckNvbnN0YW50TlMgOiBhdHRyQ29uc3RhbnQpKSkoZnVsbG5hbWUsIHZhbHVlKSk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihub2RlKSB7XG4gIHJldHVybiAobm9kZS5vd25lckRvY3VtZW50ICYmIG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldykgLy8gbm9kZSBpcyBhIE5vZGVcbiAgICAgIHx8IChub2RlLmRvY3VtZW50ICYmIG5vZGUpIC8vIG5vZGUgaXMgYSBXaW5kb3dcbiAgICAgIHx8IG5vZGUuZGVmYXVsdFZpZXc7IC8vIG5vZGUgaXMgYSBEb2N1bWVudFxufVxuIiwiaW1wb3J0IGRlZmF1bHRWaWV3IGZyb20gXCIuLi93aW5kb3cuanNcIjtcblxuZnVuY3Rpb24gc3R5bGVSZW1vdmUobmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3R5bGVDb25zdGFudChuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkobmFtZSwgdmFsdWUsIHByaW9yaXR5KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3R5bGVGdW5jdGlvbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAodiA9PSBudWxsKSB0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KG5hbWUpO1xuICAgIGVsc2UgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuYW1lLCB2LCBwcmlvcml0eSk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA+IDFcbiAgICAgID8gdGhpcy5lYWNoKCh2YWx1ZSA9PSBudWxsXG4gICAgICAgICAgICA/IHN0eWxlUmVtb3ZlIDogdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICAgID8gc3R5bGVGdW5jdGlvblxuICAgICAgICAgICAgOiBzdHlsZUNvbnN0YW50KShuYW1lLCB2YWx1ZSwgcHJpb3JpdHkgPT0gbnVsbCA/IFwiXCIgOiBwcmlvcml0eSkpXG4gICAgICA6IHN0eWxlVmFsdWUodGhpcy5ub2RlKCksIG5hbWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3R5bGVWYWx1ZShub2RlLCBuYW1lKSB7XG4gIHJldHVybiBub2RlLnN0eWxlLmdldFByb3BlcnR5VmFsdWUobmFtZSlcbiAgICAgIHx8IGRlZmF1bHRWaWV3KG5vZGUpLmdldENvbXB1dGVkU3R5bGUobm9kZSwgbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZShuYW1lKTtcbn1cbiIsImZ1bmN0aW9uIHByb3BlcnR5UmVtb3ZlKG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIGRlbGV0ZSB0aGlzW25hbWVdO1xuICB9O1xufVxuXG5mdW5jdGlvbiBwcm9wZXJ0eUNvbnN0YW50KG5hbWUsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzW25hbWVdID0gdmFsdWU7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHByb3BlcnR5RnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAodiA9PSBudWxsKSBkZWxldGUgdGhpc1tuYW1lXTtcbiAgICBlbHNlIHRoaXNbbmFtZV0gPSB2O1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA+IDFcbiAgICAgID8gdGhpcy5lYWNoKCh2YWx1ZSA9PSBudWxsXG4gICAgICAgICAgPyBwcm9wZXJ0eVJlbW92ZSA6IHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgPyBwcm9wZXJ0eUZ1bmN0aW9uXG4gICAgICAgICAgOiBwcm9wZXJ0eUNvbnN0YW50KShuYW1lLCB2YWx1ZSkpXG4gICAgICA6IHRoaXMubm9kZSgpW25hbWVdO1xufVxuIiwiZnVuY3Rpb24gY2xhc3NBcnJheShzdHJpbmcpIHtcbiAgcmV0dXJuIHN0cmluZy50cmltKCkuc3BsaXQoL158XFxzKy8pO1xufVxuXG5mdW5jdGlvbiBjbGFzc0xpc3Qobm9kZSkge1xuICByZXR1cm4gbm9kZS5jbGFzc0xpc3QgfHwgbmV3IENsYXNzTGlzdChub2RlKTtcbn1cblxuZnVuY3Rpb24gQ2xhc3NMaXN0KG5vZGUpIHtcbiAgdGhpcy5fbm9kZSA9IG5vZGU7XG4gIHRoaXMuX25hbWVzID0gY2xhc3NBcnJheShub2RlLmdldEF0dHJpYnV0ZShcImNsYXNzXCIpIHx8IFwiXCIpO1xufVxuXG5DbGFzc0xpc3QucHJvdG90eXBlID0ge1xuICBhZGQ6IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICB2YXIgaSA9IHRoaXMuX25hbWVzLmluZGV4T2YobmFtZSk7XG4gICAgaWYgKGkgPCAwKSB7XG4gICAgICB0aGlzLl9uYW1lcy5wdXNoKG5hbWUpO1xuICAgICAgdGhpcy5fbm9kZS5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCB0aGlzLl9uYW1lcy5qb2luKFwiIFwiKSk7XG4gICAgfVxuICB9LFxuICByZW1vdmU6IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICB2YXIgaSA9IHRoaXMuX25hbWVzLmluZGV4T2YobmFtZSk7XG4gICAgaWYgKGkgPj0gMCkge1xuICAgICAgdGhpcy5fbmFtZXMuc3BsaWNlKGksIDEpO1xuICAgICAgdGhpcy5fbm9kZS5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCB0aGlzLl9uYW1lcy5qb2luKFwiIFwiKSk7XG4gICAgfVxuICB9LFxuICBjb250YWluczogZnVuY3Rpb24obmFtZSkge1xuICAgIHJldHVybiB0aGlzLl9uYW1lcy5pbmRleE9mKG5hbWUpID49IDA7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGNsYXNzZWRBZGQobm9kZSwgbmFtZXMpIHtcbiAgdmFyIGxpc3QgPSBjbGFzc0xpc3Qobm9kZSksIGkgPSAtMSwgbiA9IG5hbWVzLmxlbmd0aDtcbiAgd2hpbGUgKCsraSA8IG4pIGxpc3QuYWRkKG5hbWVzW2ldKTtcbn1cblxuZnVuY3Rpb24gY2xhc3NlZFJlbW92ZShub2RlLCBuYW1lcykge1xuICB2YXIgbGlzdCA9IGNsYXNzTGlzdChub2RlKSwgaSA9IC0xLCBuID0gbmFtZXMubGVuZ3RoO1xuICB3aGlsZSAoKytpIDwgbikgbGlzdC5yZW1vdmUobmFtZXNbaV0pO1xufVxuXG5mdW5jdGlvbiBjbGFzc2VkVHJ1ZShuYW1lcykge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgY2xhc3NlZEFkZCh0aGlzLCBuYW1lcyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNsYXNzZWRGYWxzZShuYW1lcykge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgY2xhc3NlZFJlbW92ZSh0aGlzLCBuYW1lcyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNsYXNzZWRGdW5jdGlvbihuYW1lcywgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICh2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpID8gY2xhc3NlZEFkZCA6IGNsYXNzZWRSZW1vdmUpKHRoaXMsIG5hbWVzKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgdmFyIG5hbWVzID0gY2xhc3NBcnJheShuYW1lICsgXCJcIik7XG5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgdmFyIGxpc3QgPSBjbGFzc0xpc3QodGhpcy5ub2RlKCkpLCBpID0gLTEsIG4gPSBuYW1lcy5sZW5ndGg7XG4gICAgd2hpbGUgKCsraSA8IG4pIGlmICghbGlzdC5jb250YWlucyhuYW1lc1tpXSkpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiB0aGlzLmVhY2goKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IGNsYXNzZWRGdW5jdGlvbiA6IHZhbHVlXG4gICAgICA/IGNsYXNzZWRUcnVlXG4gICAgICA6IGNsYXNzZWRGYWxzZSkobmFtZXMsIHZhbHVlKSk7XG59XG4iLCJmdW5jdGlvbiB0ZXh0UmVtb3ZlKCkge1xuICB0aGlzLnRleHRDb250ZW50ID0gXCJcIjtcbn1cblxuZnVuY3Rpb24gdGV4dENvbnN0YW50KHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnRleHRDb250ZW50ID0gdmFsdWU7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHRleHRGdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHRoaXMudGV4dENvbnRlbnQgPSB2ID09IG51bGwgPyBcIlwiIDogdjtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgID8gdGhpcy5lYWNoKHZhbHVlID09IG51bGxcbiAgICAgICAgICA/IHRleHRSZW1vdmUgOiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IHRleHRGdW5jdGlvblxuICAgICAgICAgIDogdGV4dENvbnN0YW50KSh2YWx1ZSkpXG4gICAgICA6IHRoaXMubm9kZSgpLnRleHRDb250ZW50O1xufVxuIiwiZnVuY3Rpb24gaHRtbFJlbW92ZSgpIHtcbiAgdGhpcy5pbm5lckhUTUwgPSBcIlwiO1xufVxuXG5mdW5jdGlvbiBodG1sQ29uc3RhbnQodmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuaW5uZXJIVE1MID0gdmFsdWU7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGh0bWxGdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHRoaXMuaW5uZXJIVE1MID0gdiA9PSBudWxsID8gXCJcIiA6IHY7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoXG4gICAgICA/IHRoaXMuZWFjaCh2YWx1ZSA9PSBudWxsXG4gICAgICAgICAgPyBodG1sUmVtb3ZlIDogKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgPyBodG1sRnVuY3Rpb25cbiAgICAgICAgICA6IGh0bWxDb25zdGFudCkodmFsdWUpKVxuICAgICAgOiB0aGlzLm5vZGUoKS5pbm5lckhUTUw7XG59XG4iLCJmdW5jdGlvbiByYWlzZSgpIHtcbiAgaWYgKHRoaXMubmV4dFNpYmxpbmcpIHRoaXMucGFyZW50Tm9kZS5hcHBlbmRDaGlsZCh0aGlzKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmVhY2gocmFpc2UpO1xufVxuIiwiZnVuY3Rpb24gbG93ZXIoKSB7XG4gIGlmICh0aGlzLnByZXZpb3VzU2libGluZykgdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLCB0aGlzLnBhcmVudE5vZGUuZmlyc3RDaGlsZCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5lYWNoKGxvd2VyKTtcbn1cbiIsImltcG9ydCBuYW1lc3BhY2UgZnJvbSBcIi4vbmFtZXNwYWNlLmpzXCI7XG5pbXBvcnQge3hodG1sfSBmcm9tIFwiLi9uYW1lc3BhY2VzLmpzXCI7XG5cbmZ1bmN0aW9uIGNyZWF0b3JJbmhlcml0KG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBkb2N1bWVudCA9IHRoaXMub3duZXJEb2N1bWVudCxcbiAgICAgICAgdXJpID0gdGhpcy5uYW1lc3BhY2VVUkk7XG4gICAgcmV0dXJuIHVyaSA9PT0geGh0bWwgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm5hbWVzcGFjZVVSSSA9PT0geGh0bWxcbiAgICAgICAgPyBkb2N1bWVudC5jcmVhdGVFbGVtZW50KG5hbWUpXG4gICAgICAgIDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHVyaSwgbmFtZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNyZWF0b3JGaXhlZChmdWxsbmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSkge1xuICB2YXIgZnVsbG5hbWUgPSBuYW1lc3BhY2UobmFtZSk7XG4gIHJldHVybiAoZnVsbG5hbWUubG9jYWxcbiAgICAgID8gY3JlYXRvckZpeGVkXG4gICAgICA6IGNyZWF0b3JJbmhlcml0KShmdWxsbmFtZSk7XG59XG4iLCJpbXBvcnQgY3JlYXRvciBmcm9tIFwiLi4vY3JlYXRvci5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lKSB7XG4gIHZhciBjcmVhdGUgPSB0eXBlb2YgbmFtZSA9PT0gXCJmdW5jdGlvblwiID8gbmFtZSA6IGNyZWF0b3IobmFtZSk7XG4gIHJldHVybiB0aGlzLnNlbGVjdChmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5hcHBlbmRDaGlsZChjcmVhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGNyZWF0b3IgZnJvbSBcIi4uL2NyZWF0b3IuanNcIjtcbmltcG9ydCBzZWxlY3RvciBmcm9tIFwiLi4vc2VsZWN0b3IuanNcIjtcblxuZnVuY3Rpb24gY29uc3RhbnROdWxsKCkge1xuICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgYmVmb3JlKSB7XG4gIHZhciBjcmVhdGUgPSB0eXBlb2YgbmFtZSA9PT0gXCJmdW5jdGlvblwiID8gbmFtZSA6IGNyZWF0b3IobmFtZSksXG4gICAgICBzZWxlY3QgPSBiZWZvcmUgPT0gbnVsbCA/IGNvbnN0YW50TnVsbCA6IHR5cGVvZiBiZWZvcmUgPT09IFwiZnVuY3Rpb25cIiA/IGJlZm9yZSA6IHNlbGVjdG9yKGJlZm9yZSk7XG4gIHJldHVybiB0aGlzLnNlbGVjdChmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5pbnNlcnRCZWZvcmUoY3JlYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksIHNlbGVjdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IG51bGwpO1xuICB9KTtcbn1cbiIsImZ1bmN0aW9uIHJlbW92ZSgpIHtcbiAgdmFyIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTtcbiAgaWYgKHBhcmVudCkgcGFyZW50LnJlbW92ZUNoaWxkKHRoaXMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuZWFjaChyZW1vdmUpO1xufVxuIiwiZnVuY3Rpb24gc2VsZWN0aW9uX2Nsb25lU2hhbGxvdygpIHtcbiAgdmFyIGNsb25lID0gdGhpcy5jbG9uZU5vZGUoZmFsc2UpLCBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7XG4gIHJldHVybiBwYXJlbnQgPyBwYXJlbnQuaW5zZXJ0QmVmb3JlKGNsb25lLCB0aGlzLm5leHRTaWJsaW5nKSA6IGNsb25lO1xufVxuXG5mdW5jdGlvbiBzZWxlY3Rpb25fY2xvbmVEZWVwKCkge1xuICB2YXIgY2xvbmUgPSB0aGlzLmNsb25lTm9kZSh0cnVlKSwgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlO1xuICByZXR1cm4gcGFyZW50ID8gcGFyZW50Lmluc2VydEJlZm9yZShjbG9uZSwgdGhpcy5uZXh0U2libGluZykgOiBjbG9uZTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZGVlcCkge1xuICByZXR1cm4gdGhpcy5zZWxlY3QoZGVlcCA/IHNlbGVjdGlvbl9jbG9uZURlZXAgOiBzZWxlY3Rpb25fY2xvbmVTaGFsbG93KTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoXG4gICAgICA/IHRoaXMucHJvcGVydHkoXCJfX2RhdGFfX1wiLCB2YWx1ZSlcbiAgICAgIDogdGhpcy5ub2RlKCkuX19kYXRhX187XG59XG4iLCJmdW5jdGlvbiBjb250ZXh0TGlzdGVuZXIobGlzdGVuZXIpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgbGlzdGVuZXIuY2FsbCh0aGlzLCBldmVudCwgdGhpcy5fX2RhdGFfXyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHBhcnNlVHlwZW5hbWVzKHR5cGVuYW1lcykge1xuICByZXR1cm4gdHlwZW5hbWVzLnRyaW0oKS5zcGxpdCgvXnxcXHMrLykubWFwKGZ1bmN0aW9uKHQpIHtcbiAgICB2YXIgbmFtZSA9IFwiXCIsIGkgPSB0LmluZGV4T2YoXCIuXCIpO1xuICAgIGlmIChpID49IDApIG5hbWUgPSB0LnNsaWNlKGkgKyAxKSwgdCA9IHQuc2xpY2UoMCwgaSk7XG4gICAgcmV0dXJuIHt0eXBlOiB0LCBuYW1lOiBuYW1lfTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG9uUmVtb3ZlKHR5cGVuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgb24gPSB0aGlzLl9fb247XG4gICAgaWYgKCFvbikgcmV0dXJuO1xuICAgIGZvciAodmFyIGogPSAwLCBpID0gLTEsIG0gPSBvbi5sZW5ndGgsIG87IGogPCBtOyArK2opIHtcbiAgICAgIGlmIChvID0gb25bal0sICghdHlwZW5hbWUudHlwZSB8fCBvLnR5cGUgPT09IHR5cGVuYW1lLnR5cGUpICYmIG8ubmFtZSA9PT0gdHlwZW5hbWUubmFtZSkge1xuICAgICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoby50eXBlLCBvLmxpc3RlbmVyLCBvLm9wdGlvbnMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb25bKytpXSA9IG87XG4gICAgICB9XG4gICAgfVxuICAgIGlmICgrK2kpIG9uLmxlbmd0aCA9IGk7XG4gICAgZWxzZSBkZWxldGUgdGhpcy5fX29uO1xuICB9O1xufVxuXG5mdW5jdGlvbiBvbkFkZCh0eXBlbmFtZSwgdmFsdWUsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBvbiA9IHRoaXMuX19vbiwgbywgbGlzdGVuZXIgPSBjb250ZXh0TGlzdGVuZXIodmFsdWUpO1xuICAgIGlmIChvbikgZm9yICh2YXIgaiA9IDAsIG0gPSBvbi5sZW5ndGg7IGogPCBtOyArK2opIHtcbiAgICAgIGlmICgobyA9IG9uW2pdKS50eXBlID09PSB0eXBlbmFtZS50eXBlICYmIG8ubmFtZSA9PT0gdHlwZW5hbWUubmFtZSkge1xuICAgICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoby50eXBlLCBvLmxpc3RlbmVyLCBvLm9wdGlvbnMpO1xuICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoby50eXBlLCBvLmxpc3RlbmVyID0gbGlzdGVuZXIsIG8ub3B0aW9ucyA9IG9wdGlvbnMpO1xuICAgICAgICBvLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKHR5cGVuYW1lLnR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKTtcbiAgICBvID0ge3R5cGU6IHR5cGVuYW1lLnR5cGUsIG5hbWU6IHR5cGVuYW1lLm5hbWUsIHZhbHVlOiB2YWx1ZSwgbGlzdGVuZXI6IGxpc3RlbmVyLCBvcHRpb25zOiBvcHRpb25zfTtcbiAgICBpZiAoIW9uKSB0aGlzLl9fb24gPSBbb107XG4gICAgZWxzZSBvbi5wdXNoKG8pO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih0eXBlbmFtZSwgdmFsdWUsIG9wdGlvbnMpIHtcbiAgdmFyIHR5cGVuYW1lcyA9IHBhcnNlVHlwZW5hbWVzKHR5cGVuYW1lICsgXCJcIiksIGksIG4gPSB0eXBlbmFtZXMubGVuZ3RoLCB0O1xuXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgIHZhciBvbiA9IHRoaXMubm9kZSgpLl9fb247XG4gICAgaWYgKG9uKSBmb3IgKHZhciBqID0gMCwgbSA9IG9uLmxlbmd0aCwgbzsgaiA8IG07ICsraikge1xuICAgICAgZm9yIChpID0gMCwgbyA9IG9uW2pdOyBpIDwgbjsgKytpKSB7XG4gICAgICAgIGlmICgodCA9IHR5cGVuYW1lc1tpXSkudHlwZSA9PT0gby50eXBlICYmIHQubmFtZSA9PT0gby5uYW1lKSB7XG4gICAgICAgICAgcmV0dXJuIG8udmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgb24gPSB2YWx1ZSA/IG9uQWRkIDogb25SZW1vdmU7XG4gIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHRoaXMuZWFjaChvbih0eXBlbmFtZXNbaV0sIHZhbHVlLCBvcHRpb25zKSk7XG4gIHJldHVybiB0aGlzO1xufVxuIiwiaW1wb3J0IGRlZmF1bHRWaWV3IGZyb20gXCIuLi93aW5kb3cuanNcIjtcblxuZnVuY3Rpb24gZGlzcGF0Y2hFdmVudChub2RlLCB0eXBlLCBwYXJhbXMpIHtcbiAgdmFyIHdpbmRvdyA9IGRlZmF1bHRWaWV3KG5vZGUpLFxuICAgICAgZXZlbnQgPSB3aW5kb3cuQ3VzdG9tRXZlbnQ7XG5cbiAgaWYgKHR5cGVvZiBldmVudCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgZXZlbnQgPSBuZXcgZXZlbnQodHlwZSwgcGFyYW1zKTtcbiAgfSBlbHNlIHtcbiAgICBldmVudCA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFdmVudChcIkV2ZW50XCIpO1xuICAgIGlmIChwYXJhbXMpIGV2ZW50LmluaXRFdmVudCh0eXBlLCBwYXJhbXMuYnViYmxlcywgcGFyYW1zLmNhbmNlbGFibGUpLCBldmVudC5kZXRhaWwgPSBwYXJhbXMuZGV0YWlsO1xuICAgIGVsc2UgZXZlbnQuaW5pdEV2ZW50KHR5cGUsIGZhbHNlLCBmYWxzZSk7XG4gIH1cblxuICBub2RlLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xufVxuXG5mdW5jdGlvbiBkaXNwYXRjaENvbnN0YW50KHR5cGUsIHBhcmFtcykge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGRpc3BhdGNoRXZlbnQodGhpcywgdHlwZSwgcGFyYW1zKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hGdW5jdGlvbih0eXBlLCBwYXJhbXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBkaXNwYXRjaEV2ZW50KHRoaXMsIHR5cGUsIHBhcmFtcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odHlwZSwgcGFyYW1zKSB7XG4gIHJldHVybiB0aGlzLmVhY2goKHR5cGVvZiBwYXJhbXMgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyBkaXNwYXRjaEZ1bmN0aW9uXG4gICAgICA6IGRpc3BhdGNoQ29uc3RhbnQpKHR5cGUsIHBhcmFtcykpO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24qKCkge1xuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIGogPSAwLCBtID0gZ3JvdXBzLmxlbmd0aDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBpID0gMCwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZTsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgeWllbGQgbm9kZTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCBzZWxlY3Rpb25fc2VsZWN0IGZyb20gXCIuL3NlbGVjdC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9zZWxlY3RBbGwgZnJvbSBcIi4vc2VsZWN0QWxsLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3NlbGVjdENoaWxkIGZyb20gXCIuL3NlbGVjdENoaWxkLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3NlbGVjdENoaWxkcmVuIGZyb20gXCIuL3NlbGVjdENoaWxkcmVuLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2ZpbHRlciBmcm9tIFwiLi9maWx0ZXIuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fZGF0YSBmcm9tIFwiLi9kYXRhLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2VudGVyIGZyb20gXCIuL2VudGVyLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2V4aXQgZnJvbSBcIi4vZXhpdC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9qb2luIGZyb20gXCIuL2pvaW4uanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fbWVyZ2UgZnJvbSBcIi4vbWVyZ2UuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fb3JkZXIgZnJvbSBcIi4vb3JkZXIuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fc29ydCBmcm9tIFwiLi9zb3J0LmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2NhbGwgZnJvbSBcIi4vY2FsbC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9ub2RlcyBmcm9tIFwiLi9ub2Rlcy5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9ub2RlIGZyb20gXCIuL25vZGUuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fc2l6ZSBmcm9tIFwiLi9zaXplLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2VtcHR5IGZyb20gXCIuL2VtcHR5LmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2VhY2ggZnJvbSBcIi4vZWFjaC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9hdHRyIGZyb20gXCIuL2F0dHIuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fc3R5bGUgZnJvbSBcIi4vc3R5bGUuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fcHJvcGVydHkgZnJvbSBcIi4vcHJvcGVydHkuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fY2xhc3NlZCBmcm9tIFwiLi9jbGFzc2VkLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3RleHQgZnJvbSBcIi4vdGV4dC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9odG1sIGZyb20gXCIuL2h0bWwuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fcmFpc2UgZnJvbSBcIi4vcmFpc2UuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fbG93ZXIgZnJvbSBcIi4vbG93ZXIuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fYXBwZW5kIGZyb20gXCIuL2FwcGVuZC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9pbnNlcnQgZnJvbSBcIi4vaW5zZXJ0LmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3JlbW92ZSBmcm9tIFwiLi9yZW1vdmUuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fY2xvbmUgZnJvbSBcIi4vY2xvbmUuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fZGF0dW0gZnJvbSBcIi4vZGF0dW0uanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fb24gZnJvbSBcIi4vb24uanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fZGlzcGF0Y2ggZnJvbSBcIi4vZGlzcGF0Y2guanNcIjtcbmltcG9ydCBzZWxlY3Rpb25faXRlcmF0b3IgZnJvbSBcIi4vaXRlcmF0b3IuanNcIjtcblxuZXhwb3J0IHZhciByb290ID0gW251bGxdO1xuXG5leHBvcnQgZnVuY3Rpb24gU2VsZWN0aW9uKGdyb3VwcywgcGFyZW50cykge1xuICB0aGlzLl9ncm91cHMgPSBncm91cHM7XG4gIHRoaXMuX3BhcmVudHMgPSBwYXJlbnRzO1xufVxuXG5mdW5jdGlvbiBzZWxlY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKFtbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XV0sIHJvb3QpO1xufVxuXG5mdW5jdGlvbiBzZWxlY3Rpb25fc2VsZWN0aW9uKCkge1xuICByZXR1cm4gdGhpcztcbn1cblxuU2VsZWN0aW9uLnByb3RvdHlwZSA9IHNlbGVjdGlvbi5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBTZWxlY3Rpb24sXG4gIHNlbGVjdDogc2VsZWN0aW9uX3NlbGVjdCxcbiAgc2VsZWN0QWxsOiBzZWxlY3Rpb25fc2VsZWN0QWxsLFxuICBzZWxlY3RDaGlsZDogc2VsZWN0aW9uX3NlbGVjdENoaWxkLFxuICBzZWxlY3RDaGlsZHJlbjogc2VsZWN0aW9uX3NlbGVjdENoaWxkcmVuLFxuICBmaWx0ZXI6IHNlbGVjdGlvbl9maWx0ZXIsXG4gIGRhdGE6IHNlbGVjdGlvbl9kYXRhLFxuICBlbnRlcjogc2VsZWN0aW9uX2VudGVyLFxuICBleGl0OiBzZWxlY3Rpb25fZXhpdCxcbiAgam9pbjogc2VsZWN0aW9uX2pvaW4sXG4gIG1lcmdlOiBzZWxlY3Rpb25fbWVyZ2UsXG4gIHNlbGVjdGlvbjogc2VsZWN0aW9uX3NlbGVjdGlvbixcbiAgb3JkZXI6IHNlbGVjdGlvbl9vcmRlcixcbiAgc29ydDogc2VsZWN0aW9uX3NvcnQsXG4gIGNhbGw6IHNlbGVjdGlvbl9jYWxsLFxuICBub2Rlczogc2VsZWN0aW9uX25vZGVzLFxuICBub2RlOiBzZWxlY3Rpb25fbm9kZSxcbiAgc2l6ZTogc2VsZWN0aW9uX3NpemUsXG4gIGVtcHR5OiBzZWxlY3Rpb25fZW1wdHksXG4gIGVhY2g6IHNlbGVjdGlvbl9lYWNoLFxuICBhdHRyOiBzZWxlY3Rpb25fYXR0cixcbiAgc3R5bGU6IHNlbGVjdGlvbl9zdHlsZSxcbiAgcHJvcGVydHk6IHNlbGVjdGlvbl9wcm9wZXJ0eSxcbiAgY2xhc3NlZDogc2VsZWN0aW9uX2NsYXNzZWQsXG4gIHRleHQ6IHNlbGVjdGlvbl90ZXh0LFxuICBodG1sOiBzZWxlY3Rpb25faHRtbCxcbiAgcmFpc2U6IHNlbGVjdGlvbl9yYWlzZSxcbiAgbG93ZXI6IHNlbGVjdGlvbl9sb3dlcixcbiAgYXBwZW5kOiBzZWxlY3Rpb25fYXBwZW5kLFxuICBpbnNlcnQ6IHNlbGVjdGlvbl9pbnNlcnQsXG4gIHJlbW92ZTogc2VsZWN0aW9uX3JlbW92ZSxcbiAgY2xvbmU6IHNlbGVjdGlvbl9jbG9uZSxcbiAgZGF0dW06IHNlbGVjdGlvbl9kYXR1bSxcbiAgb246IHNlbGVjdGlvbl9vbixcbiAgZGlzcGF0Y2g6IHNlbGVjdGlvbl9kaXNwYXRjaCxcbiAgW1N5bWJvbC5pdGVyYXRvcl06IHNlbGVjdGlvbl9pdGVyYXRvclxufTtcblxuZXhwb3J0IGRlZmF1bHQgc2VsZWN0aW9uO1xuIiwidmFyIG5vb3AgPSB7dmFsdWU6ICgpID0+IHt9fTtcblxuZnVuY3Rpb24gZGlzcGF0Y2goKSB7XG4gIGZvciAodmFyIGkgPSAwLCBuID0gYXJndW1lbnRzLmxlbmd0aCwgXyA9IHt9LCB0OyBpIDwgbjsgKytpKSB7XG4gICAgaWYgKCEodCA9IGFyZ3VtZW50c1tpXSArIFwiXCIpIHx8ICh0IGluIF8pIHx8IC9bXFxzLl0vLnRlc3QodCkpIHRocm93IG5ldyBFcnJvcihcImlsbGVnYWwgdHlwZTogXCIgKyB0KTtcbiAgICBfW3RdID0gW107XG4gIH1cbiAgcmV0dXJuIG5ldyBEaXNwYXRjaChfKTtcbn1cblxuZnVuY3Rpb24gRGlzcGF0Y2goXykge1xuICB0aGlzLl8gPSBfO1xufVxuXG5mdW5jdGlvbiBwYXJzZVR5cGVuYW1lcyh0eXBlbmFtZXMsIHR5cGVzKSB7XG4gIHJldHVybiB0eXBlbmFtZXMudHJpbSgpLnNwbGl0KC9efFxccysvKS5tYXAoZnVuY3Rpb24odCkge1xuICAgIHZhciBuYW1lID0gXCJcIiwgaSA9IHQuaW5kZXhPZihcIi5cIik7XG4gICAgaWYgKGkgPj0gMCkgbmFtZSA9IHQuc2xpY2UoaSArIDEpLCB0ID0gdC5zbGljZSgwLCBpKTtcbiAgICBpZiAodCAmJiAhdHlwZXMuaGFzT3duUHJvcGVydHkodCkpIHRocm93IG5ldyBFcnJvcihcInVua25vd24gdHlwZTogXCIgKyB0KTtcbiAgICByZXR1cm4ge3R5cGU6IHQsIG5hbWU6IG5hbWV9O1xuICB9KTtcbn1cblxuRGlzcGF0Y2gucHJvdG90eXBlID0gZGlzcGF0Y2gucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogRGlzcGF0Y2gsXG4gIG9uOiBmdW5jdGlvbih0eXBlbmFtZSwgY2FsbGJhY2spIHtcbiAgICB2YXIgXyA9IHRoaXMuXyxcbiAgICAgICAgVCA9IHBhcnNlVHlwZW5hbWVzKHR5cGVuYW1lICsgXCJcIiwgXyksXG4gICAgICAgIHQsXG4gICAgICAgIGkgPSAtMSxcbiAgICAgICAgbiA9IFQubGVuZ3RoO1xuXG4gICAgLy8gSWYgbm8gY2FsbGJhY2sgd2FzIHNwZWNpZmllZCwgcmV0dXJuIHRoZSBjYWxsYmFjayBvZiB0aGUgZ2l2ZW4gdHlwZSBhbmQgbmFtZS5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoKHQgPSAodHlwZW5hbWUgPSBUW2ldKS50eXBlKSAmJiAodCA9IGdldChfW3RdLCB0eXBlbmFtZS5uYW1lKSkpIHJldHVybiB0O1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElmIGEgdHlwZSB3YXMgc3BlY2lmaWVkLCBzZXQgdGhlIGNhbGxiYWNrIGZvciB0aGUgZ2l2ZW4gdHlwZSBhbmQgbmFtZS5cbiAgICAvLyBPdGhlcndpc2UsIGlmIGEgbnVsbCBjYWxsYmFjayB3YXMgc3BlY2lmaWVkLCByZW1vdmUgY2FsbGJhY2tzIG9mIHRoZSBnaXZlbiBuYW1lLlxuICAgIGlmIChjYWxsYmFjayAhPSBudWxsICYmIHR5cGVvZiBjYWxsYmFjayAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIGNhbGxiYWNrOiBcIiArIGNhbGxiYWNrKTtcbiAgICB3aGlsZSAoKytpIDwgbikge1xuICAgICAgaWYgKHQgPSAodHlwZW5hbWUgPSBUW2ldKS50eXBlKSBfW3RdID0gc2V0KF9bdF0sIHR5cGVuYW1lLm5hbWUsIGNhbGxiYWNrKTtcbiAgICAgIGVsc2UgaWYgKGNhbGxiYWNrID09IG51bGwpIGZvciAodCBpbiBfKSBfW3RdID0gc2V0KF9bdF0sIHR5cGVuYW1lLm5hbWUsIG51bGwpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBjb3B5OiBmdW5jdGlvbigpIHtcbiAgICB2YXIgY29weSA9IHt9LCBfID0gdGhpcy5fO1xuICAgIGZvciAodmFyIHQgaW4gXykgY29weVt0XSA9IF9bdF0uc2xpY2UoKTtcbiAgICByZXR1cm4gbmV3IERpc3BhdGNoKGNvcHkpO1xuICB9LFxuICBjYWxsOiBmdW5jdGlvbih0eXBlLCB0aGF0KSB7XG4gICAgaWYgKChuID0gYXJndW1lbnRzLmxlbmd0aCAtIDIpID4gMCkgZm9yICh2YXIgYXJncyA9IG5ldyBBcnJheShuKSwgaSA9IDAsIG4sIHQ7IGkgPCBuOyArK2kpIGFyZ3NbaV0gPSBhcmd1bWVudHNbaSArIDJdO1xuICAgIGlmICghdGhpcy5fLmhhc093blByb3BlcnR5KHR5cGUpKSB0aHJvdyBuZXcgRXJyb3IoXCJ1bmtub3duIHR5cGU6IFwiICsgdHlwZSk7XG4gICAgZm9yICh0ID0gdGhpcy5fW3R5cGVdLCBpID0gMCwgbiA9IHQubGVuZ3RoOyBpIDwgbjsgKytpKSB0W2ldLnZhbHVlLmFwcGx5KHRoYXQsIGFyZ3MpO1xuICB9LFxuICBhcHBseTogZnVuY3Rpb24odHlwZSwgdGhhdCwgYXJncykge1xuICAgIGlmICghdGhpcy5fLmhhc093blByb3BlcnR5KHR5cGUpKSB0aHJvdyBuZXcgRXJyb3IoXCJ1bmtub3duIHR5cGU6IFwiICsgdHlwZSk7XG4gICAgZm9yICh2YXIgdCA9IHRoaXMuX1t0eXBlXSwgaSA9IDAsIG4gPSB0Lmxlbmd0aDsgaSA8IG47ICsraSkgdFtpXS52YWx1ZS5hcHBseSh0aGF0LCBhcmdzKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gZ2V0KHR5cGUsIG5hbWUpIHtcbiAgZm9yICh2YXIgaSA9IDAsIG4gPSB0eXBlLmxlbmd0aCwgYzsgaSA8IG47ICsraSkge1xuICAgIGlmICgoYyA9IHR5cGVbaV0pLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgIHJldHVybiBjLnZhbHVlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzZXQodHlwZSwgbmFtZSwgY2FsbGJhY2spIHtcbiAgZm9yICh2YXIgaSA9IDAsIG4gPSB0eXBlLmxlbmd0aDsgaSA8IG47ICsraSkge1xuICAgIGlmICh0eXBlW2ldLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgIHR5cGVbaV0gPSBub29wLCB0eXBlID0gdHlwZS5zbGljZSgwLCBpKS5jb25jYXQodHlwZS5zbGljZShpICsgMSkpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIGlmIChjYWxsYmFjayAhPSBudWxsKSB0eXBlLnB1c2goe25hbWU6IG5hbWUsIHZhbHVlOiBjYWxsYmFja30pO1xuICByZXR1cm4gdHlwZTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZGlzcGF0Y2g7XG4iLCJ2YXIgZnJhbWUgPSAwLCAvLyBpcyBhbiBhbmltYXRpb24gZnJhbWUgcGVuZGluZz9cbiAgICB0aW1lb3V0ID0gMCwgLy8gaXMgYSB0aW1lb3V0IHBlbmRpbmc/XG4gICAgaW50ZXJ2YWwgPSAwLCAvLyBhcmUgYW55IHRpbWVycyBhY3RpdmU/XG4gICAgcG9rZURlbGF5ID0gMTAwMCwgLy8gaG93IGZyZXF1ZW50bHkgd2UgY2hlY2sgZm9yIGNsb2NrIHNrZXdcbiAgICB0YXNrSGVhZCxcbiAgICB0YXNrVGFpbCxcbiAgICBjbG9ja0xhc3QgPSAwLFxuICAgIGNsb2NrTm93ID0gMCxcbiAgICBjbG9ja1NrZXcgPSAwLFxuICAgIGNsb2NrID0gdHlwZW9mIHBlcmZvcm1hbmNlID09PSBcIm9iamVjdFwiICYmIHBlcmZvcm1hbmNlLm5vdyA/IHBlcmZvcm1hbmNlIDogRGF0ZSxcbiAgICBzZXRGcmFtZSA9IHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIgJiYgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSA/IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUuYmluZCh3aW5kb3cpIDogZnVuY3Rpb24oZikgeyBzZXRUaW1lb3V0KGYsIDE3KTsgfTtcblxuZXhwb3J0IGZ1bmN0aW9uIG5vdygpIHtcbiAgcmV0dXJuIGNsb2NrTm93IHx8IChzZXRGcmFtZShjbGVhck5vdyksIGNsb2NrTm93ID0gY2xvY2subm93KCkgKyBjbG9ja1NrZXcpO1xufVxuXG5mdW5jdGlvbiBjbGVhck5vdygpIHtcbiAgY2xvY2tOb3cgPSAwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gVGltZXIoKSB7XG4gIHRoaXMuX2NhbGwgPVxuICB0aGlzLl90aW1lID1cbiAgdGhpcy5fbmV4dCA9IG51bGw7XG59XG5cblRpbWVyLnByb3RvdHlwZSA9IHRpbWVyLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IFRpbWVyLFxuICByZXN0YXJ0OiBmdW5jdGlvbihjYWxsYmFjaywgZGVsYXksIHRpbWUpIHtcbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJjYWxsYmFjayBpcyBub3QgYSBmdW5jdGlvblwiKTtcbiAgICB0aW1lID0gKHRpbWUgPT0gbnVsbCA/IG5vdygpIDogK3RpbWUpICsgKGRlbGF5ID09IG51bGwgPyAwIDogK2RlbGF5KTtcbiAgICBpZiAoIXRoaXMuX25leHQgJiYgdGFza1RhaWwgIT09IHRoaXMpIHtcbiAgICAgIGlmICh0YXNrVGFpbCkgdGFza1RhaWwuX25leHQgPSB0aGlzO1xuICAgICAgZWxzZSB0YXNrSGVhZCA9IHRoaXM7XG4gICAgICB0YXNrVGFpbCA9IHRoaXM7XG4gICAgfVxuICAgIHRoaXMuX2NhbGwgPSBjYWxsYmFjaztcbiAgICB0aGlzLl90aW1lID0gdGltZTtcbiAgICBzbGVlcCgpO1xuICB9LFxuICBzdG9wOiBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5fY2FsbCkge1xuICAgICAgdGhpcy5fY2FsbCA9IG51bGw7XG4gICAgICB0aGlzLl90aW1lID0gSW5maW5pdHk7XG4gICAgICBzbGVlcCgpO1xuICAgIH1cbiAgfVxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHRpbWVyKGNhbGxiYWNrLCBkZWxheSwgdGltZSkge1xuICB2YXIgdCA9IG5ldyBUaW1lcjtcbiAgdC5yZXN0YXJ0KGNhbGxiYWNrLCBkZWxheSwgdGltZSk7XG4gIHJldHVybiB0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdGltZXJGbHVzaCgpIHtcbiAgbm93KCk7IC8vIEdldCB0aGUgY3VycmVudCB0aW1lLCBpZiBub3QgYWxyZWFkeSBzZXQuXG4gICsrZnJhbWU7IC8vIFByZXRlbmQgd2XigJl2ZSBzZXQgYW4gYWxhcm0sIGlmIHdlIGhhdmVu4oCZdCBhbHJlYWR5LlxuICB2YXIgdCA9IHRhc2tIZWFkLCBlO1xuICB3aGlsZSAodCkge1xuICAgIGlmICgoZSA9IGNsb2NrTm93IC0gdC5fdGltZSkgPj0gMCkgdC5fY2FsbC5jYWxsKHVuZGVmaW5lZCwgZSk7XG4gICAgdCA9IHQuX25leHQ7XG4gIH1cbiAgLS1mcmFtZTtcbn1cblxuZnVuY3Rpb24gd2FrZSgpIHtcbiAgY2xvY2tOb3cgPSAoY2xvY2tMYXN0ID0gY2xvY2subm93KCkpICsgY2xvY2tTa2V3O1xuICBmcmFtZSA9IHRpbWVvdXQgPSAwO1xuICB0cnkge1xuICAgIHRpbWVyRmx1c2goKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBmcmFtZSA9IDA7XG4gICAgbmFwKCk7XG4gICAgY2xvY2tOb3cgPSAwO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBva2UoKSB7XG4gIHZhciBub3cgPSBjbG9jay5ub3coKSwgZGVsYXkgPSBub3cgLSBjbG9ja0xhc3Q7XG4gIGlmIChkZWxheSA+IHBva2VEZWxheSkgY2xvY2tTa2V3IC09IGRlbGF5LCBjbG9ja0xhc3QgPSBub3c7XG59XG5cbmZ1bmN0aW9uIG5hcCgpIHtcbiAgdmFyIHQwLCB0MSA9IHRhc2tIZWFkLCB0MiwgdGltZSA9IEluZmluaXR5O1xuICB3aGlsZSAodDEpIHtcbiAgICBpZiAodDEuX2NhbGwpIHtcbiAgICAgIGlmICh0aW1lID4gdDEuX3RpbWUpIHRpbWUgPSB0MS5fdGltZTtcbiAgICAgIHQwID0gdDEsIHQxID0gdDEuX25leHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHQyID0gdDEuX25leHQsIHQxLl9uZXh0ID0gbnVsbDtcbiAgICAgIHQxID0gdDAgPyB0MC5fbmV4dCA9IHQyIDogdGFza0hlYWQgPSB0MjtcbiAgICB9XG4gIH1cbiAgdGFza1RhaWwgPSB0MDtcbiAgc2xlZXAodGltZSk7XG59XG5cbmZ1bmN0aW9uIHNsZWVwKHRpbWUpIHtcbiAgaWYgKGZyYW1lKSByZXR1cm47IC8vIFNvb25lc3QgYWxhcm0gYWxyZWFkeSBzZXQsIG9yIHdpbGwgYmUuXG4gIGlmICh0aW1lb3V0KSB0aW1lb3V0ID0gY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICB2YXIgZGVsYXkgPSB0aW1lIC0gY2xvY2tOb3c7IC8vIFN0cmljdGx5IGxlc3MgdGhhbiBpZiB3ZSByZWNvbXB1dGVkIGNsb2NrTm93LlxuICBpZiAoZGVsYXkgPiAyNCkge1xuICAgIGlmICh0aW1lIDwgSW5maW5pdHkpIHRpbWVvdXQgPSBzZXRUaW1lb3V0KHdha2UsIHRpbWUgLSBjbG9jay5ub3coKSAtIGNsb2NrU2tldyk7XG4gICAgaWYgKGludGVydmFsKSBpbnRlcnZhbCA9IGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICB9IGVsc2Uge1xuICAgIGlmICghaW50ZXJ2YWwpIGNsb2NrTGFzdCA9IGNsb2NrLm5vdygpLCBpbnRlcnZhbCA9IHNldEludGVydmFsKHBva2UsIHBva2VEZWxheSk7XG4gICAgZnJhbWUgPSAxLCBzZXRGcmFtZSh3YWtlKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtUaW1lcn0gZnJvbSBcIi4vdGltZXIuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY2FsbGJhY2ssIGRlbGF5LCB0aW1lKSB7XG4gIHZhciB0ID0gbmV3IFRpbWVyO1xuICBkZWxheSA9IGRlbGF5ID09IG51bGwgPyAwIDogK2RlbGF5O1xuICB0LnJlc3RhcnQoZWxhcHNlZCA9PiB7XG4gICAgdC5zdG9wKCk7XG4gICAgY2FsbGJhY2soZWxhcHNlZCArIGRlbGF5KTtcbiAgfSwgZGVsYXksIHRpbWUpO1xuICByZXR1cm4gdDtcbn1cbiIsImltcG9ydCB7ZGlzcGF0Y2h9IGZyb20gXCJkMy1kaXNwYXRjaFwiO1xuaW1wb3J0IHt0aW1lciwgdGltZW91dH0gZnJvbSBcImQzLXRpbWVyXCI7XG5cbnZhciBlbXB0eU9uID0gZGlzcGF0Y2goXCJzdGFydFwiLCBcImVuZFwiLCBcImNhbmNlbFwiLCBcImludGVycnVwdFwiKTtcbnZhciBlbXB0eVR3ZWVuID0gW107XG5cbmV4cG9ydCB2YXIgQ1JFQVRFRCA9IDA7XG5leHBvcnQgdmFyIFNDSEVEVUxFRCA9IDE7XG5leHBvcnQgdmFyIFNUQVJUSU5HID0gMjtcbmV4cG9ydCB2YXIgU1RBUlRFRCA9IDM7XG5leHBvcnQgdmFyIFJVTk5JTkcgPSA0O1xuZXhwb3J0IHZhciBFTkRJTkcgPSA1O1xuZXhwb3J0IHZhciBFTkRFRCA9IDY7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5vZGUsIG5hbWUsIGlkLCBpbmRleCwgZ3JvdXAsIHRpbWluZykge1xuICB2YXIgc2NoZWR1bGVzID0gbm9kZS5fX3RyYW5zaXRpb247XG4gIGlmICghc2NoZWR1bGVzKSBub2RlLl9fdHJhbnNpdGlvbiA9IHt9O1xuICBlbHNlIGlmIChpZCBpbiBzY2hlZHVsZXMpIHJldHVybjtcbiAgY3JlYXRlKG5vZGUsIGlkLCB7XG4gICAgbmFtZTogbmFtZSxcbiAgICBpbmRleDogaW5kZXgsIC8vIEZvciBjb250ZXh0IGR1cmluZyBjYWxsYmFjay5cbiAgICBncm91cDogZ3JvdXAsIC8vIEZvciBjb250ZXh0IGR1cmluZyBjYWxsYmFjay5cbiAgICBvbjogZW1wdHlPbixcbiAgICB0d2VlbjogZW1wdHlUd2VlbixcbiAgICB0aW1lOiB0aW1pbmcudGltZSxcbiAgICBkZWxheTogdGltaW5nLmRlbGF5LFxuICAgIGR1cmF0aW9uOiB0aW1pbmcuZHVyYXRpb24sXG4gICAgZWFzZTogdGltaW5nLmVhc2UsXG4gICAgdGltZXI6IG51bGwsXG4gICAgc3RhdGU6IENSRUFURURcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbml0KG5vZGUsIGlkKSB7XG4gIHZhciBzY2hlZHVsZSA9IGdldChub2RlLCBpZCk7XG4gIGlmIChzY2hlZHVsZS5zdGF0ZSA+IENSRUFURUQpIHRocm93IG5ldyBFcnJvcihcInRvbyBsYXRlOyBhbHJlYWR5IHNjaGVkdWxlZFwiKTtcbiAgcmV0dXJuIHNjaGVkdWxlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0KG5vZGUsIGlkKSB7XG4gIHZhciBzY2hlZHVsZSA9IGdldChub2RlLCBpZCk7XG4gIGlmIChzY2hlZHVsZS5zdGF0ZSA+IFNUQVJURUQpIHRocm93IG5ldyBFcnJvcihcInRvbyBsYXRlOyBhbHJlYWR5IHJ1bm5pbmdcIik7XG4gIHJldHVybiBzY2hlZHVsZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldChub2RlLCBpZCkge1xuICB2YXIgc2NoZWR1bGUgPSBub2RlLl9fdHJhbnNpdGlvbjtcbiAgaWYgKCFzY2hlZHVsZSB8fCAhKHNjaGVkdWxlID0gc2NoZWR1bGVbaWRdKSkgdGhyb3cgbmV3IEVycm9yKFwidHJhbnNpdGlvbiBub3QgZm91bmRcIik7XG4gIHJldHVybiBzY2hlZHVsZTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlKG5vZGUsIGlkLCBzZWxmKSB7XG4gIHZhciBzY2hlZHVsZXMgPSBub2RlLl9fdHJhbnNpdGlvbixcbiAgICAgIHR3ZWVuO1xuXG4gIC8vIEluaXRpYWxpemUgdGhlIHNlbGYgdGltZXIgd2hlbiB0aGUgdHJhbnNpdGlvbiBpcyBjcmVhdGVkLlxuICAvLyBOb3RlIHRoZSBhY3R1YWwgZGVsYXkgaXMgbm90IGtub3duIHVudGlsIHRoZSBmaXJzdCBjYWxsYmFjayFcbiAgc2NoZWR1bGVzW2lkXSA9IHNlbGY7XG4gIHNlbGYudGltZXIgPSB0aW1lcihzY2hlZHVsZSwgMCwgc2VsZi50aW1lKTtcblxuICBmdW5jdGlvbiBzY2hlZHVsZShlbGFwc2VkKSB7XG4gICAgc2VsZi5zdGF0ZSA9IFNDSEVEVUxFRDtcbiAgICBzZWxmLnRpbWVyLnJlc3RhcnQoc3RhcnQsIHNlbGYuZGVsYXksIHNlbGYudGltZSk7XG5cbiAgICAvLyBJZiB0aGUgZWxhcHNlZCBkZWxheSBpcyBsZXNzIHRoYW4gb3VyIGZpcnN0IHNsZWVwLCBzdGFydCBpbW1lZGlhdGVseS5cbiAgICBpZiAoc2VsZi5kZWxheSA8PSBlbGFwc2VkKSBzdGFydChlbGFwc2VkIC0gc2VsZi5kZWxheSk7XG4gIH1cblxuICBmdW5jdGlvbiBzdGFydChlbGFwc2VkKSB7XG4gICAgdmFyIGksIGosIG4sIG87XG5cbiAgICAvLyBJZiB0aGUgc3RhdGUgaXMgbm90IFNDSEVEVUxFRCwgdGhlbiB3ZSBwcmV2aW91c2x5IGVycm9yZWQgb24gc3RhcnQuXG4gICAgaWYgKHNlbGYuc3RhdGUgIT09IFNDSEVEVUxFRCkgcmV0dXJuIHN0b3AoKTtcblxuICAgIGZvciAoaSBpbiBzY2hlZHVsZXMpIHtcbiAgICAgIG8gPSBzY2hlZHVsZXNbaV07XG4gICAgICBpZiAoby5uYW1lICE9PSBzZWxmLm5hbWUpIGNvbnRpbnVlO1xuXG4gICAgICAvLyBXaGlsZSB0aGlzIGVsZW1lbnQgYWxyZWFkeSBoYXMgYSBzdGFydGluZyB0cmFuc2l0aW9uIGR1cmluZyB0aGlzIGZyYW1lLFxuICAgICAgLy8gZGVmZXIgc3RhcnRpbmcgYW4gaW50ZXJydXB0aW5nIHRyYW5zaXRpb24gdW50aWwgdGhhdCB0cmFuc2l0aW9uIGhhcyBhXG4gICAgICAvLyBjaGFuY2UgdG8gdGljayAoYW5kIHBvc3NpYmx5IGVuZCk7IHNlZSBkMy9kMy10cmFuc2l0aW9uIzU0IVxuICAgICAgaWYgKG8uc3RhdGUgPT09IFNUQVJURUQpIHJldHVybiB0aW1lb3V0KHN0YXJ0KTtcblxuICAgICAgLy8gSW50ZXJydXB0IHRoZSBhY3RpdmUgdHJhbnNpdGlvbiwgaWYgYW55LlxuICAgICAgaWYgKG8uc3RhdGUgPT09IFJVTk5JTkcpIHtcbiAgICAgICAgby5zdGF0ZSA9IEVOREVEO1xuICAgICAgICBvLnRpbWVyLnN0b3AoKTtcbiAgICAgICAgby5vbi5jYWxsKFwiaW50ZXJydXB0XCIsIG5vZGUsIG5vZGUuX19kYXRhX18sIG8uaW5kZXgsIG8uZ3JvdXApO1xuICAgICAgICBkZWxldGUgc2NoZWR1bGVzW2ldO1xuICAgICAgfVxuXG4gICAgICAvLyBDYW5jZWwgYW55IHByZS1lbXB0ZWQgdHJhbnNpdGlvbnMuXG4gICAgICBlbHNlIGlmICgraSA8IGlkKSB7XG4gICAgICAgIG8uc3RhdGUgPSBFTkRFRDtcbiAgICAgICAgby50aW1lci5zdG9wKCk7XG4gICAgICAgIG8ub24uY2FsbChcImNhbmNlbFwiLCBub2RlLCBub2RlLl9fZGF0YV9fLCBvLmluZGV4LCBvLmdyb3VwKTtcbiAgICAgICAgZGVsZXRlIHNjaGVkdWxlc1tpXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEZWZlciB0aGUgZmlyc3QgdGljayB0byBlbmQgb2YgdGhlIGN1cnJlbnQgZnJhbWU7IHNlZSBkMy9kMyMxNTc2LlxuICAgIC8vIE5vdGUgdGhlIHRyYW5zaXRpb24gbWF5IGJlIGNhbmNlbGVkIGFmdGVyIHN0YXJ0IGFuZCBiZWZvcmUgdGhlIGZpcnN0IHRpY2shXG4gICAgLy8gTm90ZSB0aGlzIG11c3QgYmUgc2NoZWR1bGVkIGJlZm9yZSB0aGUgc3RhcnQgZXZlbnQ7IHNlZSBkMy9kMy10cmFuc2l0aW9uIzE2IVxuICAgIC8vIEFzc3VtaW5nIHRoaXMgaXMgc3VjY2Vzc2Z1bCwgc3Vic2VxdWVudCBjYWxsYmFja3MgZ28gc3RyYWlnaHQgdG8gdGljay5cbiAgICB0aW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHNlbGYuc3RhdGUgPT09IFNUQVJURUQpIHtcbiAgICAgICAgc2VsZi5zdGF0ZSA9IFJVTk5JTkc7XG4gICAgICAgIHNlbGYudGltZXIucmVzdGFydCh0aWNrLCBzZWxmLmRlbGF5LCBzZWxmLnRpbWUpO1xuICAgICAgICB0aWNrKGVsYXBzZWQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gRGlzcGF0Y2ggdGhlIHN0YXJ0IGV2ZW50LlxuICAgIC8vIE5vdGUgdGhpcyBtdXN0IGJlIGRvbmUgYmVmb3JlIHRoZSB0d2VlbiBhcmUgaW5pdGlhbGl6ZWQuXG4gICAgc2VsZi5zdGF0ZSA9IFNUQVJUSU5HO1xuICAgIHNlbGYub24uY2FsbChcInN0YXJ0XCIsIG5vZGUsIG5vZGUuX19kYXRhX18sIHNlbGYuaW5kZXgsIHNlbGYuZ3JvdXApO1xuICAgIGlmIChzZWxmLnN0YXRlICE9PSBTVEFSVElORykgcmV0dXJuOyAvLyBpbnRlcnJ1cHRlZFxuICAgIHNlbGYuc3RhdGUgPSBTVEFSVEVEO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSB0aGUgdHdlZW4sIGRlbGV0aW5nIG51bGwgdHdlZW4uXG4gICAgdHdlZW4gPSBuZXcgQXJyYXkobiA9IHNlbGYudHdlZW4ubGVuZ3RoKTtcbiAgICBmb3IgKGkgPSAwLCBqID0gLTE7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChvID0gc2VsZi50d2VlbltpXS52YWx1ZS5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIHNlbGYuaW5kZXgsIHNlbGYuZ3JvdXApKSB7XG4gICAgICAgIHR3ZWVuWysral0gPSBvO1xuICAgICAgfVxuICAgIH1cbiAgICB0d2Vlbi5sZW5ndGggPSBqICsgMTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRpY2soZWxhcHNlZCkge1xuICAgIHZhciB0ID0gZWxhcHNlZCA8IHNlbGYuZHVyYXRpb24gPyBzZWxmLmVhc2UuY2FsbChudWxsLCBlbGFwc2VkIC8gc2VsZi5kdXJhdGlvbikgOiAoc2VsZi50aW1lci5yZXN0YXJ0KHN0b3ApLCBzZWxmLnN0YXRlID0gRU5ESU5HLCAxKSxcbiAgICAgICAgaSA9IC0xLFxuICAgICAgICBuID0gdHdlZW4ubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICAgIHR3ZWVuW2ldLmNhbGwobm9kZSwgdCk7XG4gICAgfVxuXG4gICAgLy8gRGlzcGF0Y2ggdGhlIGVuZCBldmVudC5cbiAgICBpZiAoc2VsZi5zdGF0ZSA9PT0gRU5ESU5HKSB7XG4gICAgICBzZWxmLm9uLmNhbGwoXCJlbmRcIiwgbm9kZSwgbm9kZS5fX2RhdGFfXywgc2VsZi5pbmRleCwgc2VsZi5ncm91cCk7XG4gICAgICBzdG9wKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc3RvcCgpIHtcbiAgICBzZWxmLnN0YXRlID0gRU5ERUQ7XG4gICAgc2VsZi50aW1lci5zdG9wKCk7XG4gICAgZGVsZXRlIHNjaGVkdWxlc1tpZF07XG4gICAgZm9yICh2YXIgaSBpbiBzY2hlZHVsZXMpIHJldHVybjsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIGRlbGV0ZSBub2RlLl9fdHJhbnNpdGlvbjtcbiAgfVxufVxuIiwiaW1wb3J0IHtTVEFSVElORywgRU5ESU5HLCBFTkRFRH0gZnJvbSBcIi4vdHJhbnNpdGlvbi9zY2hlZHVsZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihub2RlLCBuYW1lKSB7XG4gIHZhciBzY2hlZHVsZXMgPSBub2RlLl9fdHJhbnNpdGlvbixcbiAgICAgIHNjaGVkdWxlLFxuICAgICAgYWN0aXZlLFxuICAgICAgZW1wdHkgPSB0cnVlLFxuICAgICAgaTtcblxuICBpZiAoIXNjaGVkdWxlcykgcmV0dXJuO1xuXG4gIG5hbWUgPSBuYW1lID09IG51bGwgPyBudWxsIDogbmFtZSArIFwiXCI7XG5cbiAgZm9yIChpIGluIHNjaGVkdWxlcykge1xuICAgIGlmICgoc2NoZWR1bGUgPSBzY2hlZHVsZXNbaV0pLm5hbWUgIT09IG5hbWUpIHsgZW1wdHkgPSBmYWxzZTsgY29udGludWU7IH1cbiAgICBhY3RpdmUgPSBzY2hlZHVsZS5zdGF0ZSA+IFNUQVJUSU5HICYmIHNjaGVkdWxlLnN0YXRlIDwgRU5ESU5HO1xuICAgIHNjaGVkdWxlLnN0YXRlID0gRU5ERUQ7XG4gICAgc2NoZWR1bGUudGltZXIuc3RvcCgpO1xuICAgIHNjaGVkdWxlLm9uLmNhbGwoYWN0aXZlID8gXCJpbnRlcnJ1cHRcIiA6IFwiY2FuY2VsXCIsIG5vZGUsIG5vZGUuX19kYXRhX18sIHNjaGVkdWxlLmluZGV4LCBzY2hlZHVsZS5ncm91cCk7XG4gICAgZGVsZXRlIHNjaGVkdWxlc1tpXTtcbiAgfVxuXG4gIGlmIChlbXB0eSkgZGVsZXRlIG5vZGUuX190cmFuc2l0aW9uO1xufVxuIiwiaW1wb3J0IGludGVycnVwdCBmcm9tIFwiLi4vaW50ZXJydXB0LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUpIHtcbiAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHtcbiAgICBpbnRlcnJ1cHQodGhpcywgbmFtZSk7XG4gIH0pO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYSwgYikge1xuICByZXR1cm4gYSA9ICthLCBiID0gK2IsIGZ1bmN0aW9uKHQpIHtcbiAgICByZXR1cm4gYSAqICgxIC0gdCkgKyBiICogdDtcbiAgfTtcbn1cbiIsInZhciBkZWdyZWVzID0gMTgwIC8gTWF0aC5QSTtcblxuZXhwb3J0IHZhciBpZGVudGl0eSA9IHtcbiAgdHJhbnNsYXRlWDogMCxcbiAgdHJhbnNsYXRlWTogMCxcbiAgcm90YXRlOiAwLFxuICBza2V3WDogMCxcbiAgc2NhbGVYOiAxLFxuICBzY2FsZVk6IDFcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgdmFyIHNjYWxlWCwgc2NhbGVZLCBza2V3WDtcbiAgaWYgKHNjYWxlWCA9IE1hdGguc3FydChhICogYSArIGIgKiBiKSkgYSAvPSBzY2FsZVgsIGIgLz0gc2NhbGVYO1xuICBpZiAoc2tld1ggPSBhICogYyArIGIgKiBkKSBjIC09IGEgKiBza2V3WCwgZCAtPSBiICogc2tld1g7XG4gIGlmIChzY2FsZVkgPSBNYXRoLnNxcnQoYyAqIGMgKyBkICogZCkpIGMgLz0gc2NhbGVZLCBkIC89IHNjYWxlWSwgc2tld1ggLz0gc2NhbGVZO1xuICBpZiAoYSAqIGQgPCBiICogYykgYSA9IC1hLCBiID0gLWIsIHNrZXdYID0gLXNrZXdYLCBzY2FsZVggPSAtc2NhbGVYO1xuICByZXR1cm4ge1xuICAgIHRyYW5zbGF0ZVg6IGUsXG4gICAgdHJhbnNsYXRlWTogZixcbiAgICByb3RhdGU6IE1hdGguYXRhbjIoYiwgYSkgKiBkZWdyZWVzLFxuICAgIHNrZXdYOiBNYXRoLmF0YW4oc2tld1gpICogZGVncmVlcyxcbiAgICBzY2FsZVg6IHNjYWxlWCxcbiAgICBzY2FsZVk6IHNjYWxlWVxuICB9O1xufVxuIiwiaW1wb3J0IGRlY29tcG9zZSwge2lkZW50aXR5fSBmcm9tIFwiLi9kZWNvbXBvc2UuanNcIjtcblxudmFyIHN2Z05vZGU7XG5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVmICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VDc3ModmFsdWUpIHtcbiAgY29uc3QgbSA9IG5ldyAodHlwZW9mIERPTU1hdHJpeCA9PT0gXCJmdW5jdGlvblwiID8gRE9NTWF0cml4IDogV2ViS2l0Q1NTTWF0cml4KSh2YWx1ZSArIFwiXCIpO1xuICByZXR1cm4gbS5pc0lkZW50aXR5ID8gaWRlbnRpdHkgOiBkZWNvbXBvc2UobS5hLCBtLmIsIG0uYywgbS5kLCBtLmUsIG0uZik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVN2Zyh2YWx1ZSkge1xuICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIGlkZW50aXR5O1xuICBpZiAoIXN2Z05vZGUpIHN2Z05vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLCBcImdcIik7XG4gIHN2Z05vZGUuc2V0QXR0cmlidXRlKFwidHJhbnNmb3JtXCIsIHZhbHVlKTtcbiAgaWYgKCEodmFsdWUgPSBzdmdOb2RlLnRyYW5zZm9ybS5iYXNlVmFsLmNvbnNvbGlkYXRlKCkpKSByZXR1cm4gaWRlbnRpdHk7XG4gIHZhbHVlID0gdmFsdWUubWF0cml4O1xuICByZXR1cm4gZGVjb21wb3NlKHZhbHVlLmEsIHZhbHVlLmIsIHZhbHVlLmMsIHZhbHVlLmQsIHZhbHVlLmUsIHZhbHVlLmYpO1xufVxuIiwiaW1wb3J0IG51bWJlciBmcm9tIFwiLi4vbnVtYmVyLmpzXCI7XG5pbXBvcnQge3BhcnNlQ3NzLCBwYXJzZVN2Z30gZnJvbSBcIi4vcGFyc2UuanNcIjtcblxuZnVuY3Rpb24gaW50ZXJwb2xhdGVUcmFuc2Zvcm0ocGFyc2UsIHB4Q29tbWEsIHB4UGFyZW4sIGRlZ1BhcmVuKSB7XG5cbiAgZnVuY3Rpb24gcG9wKHMpIHtcbiAgICByZXR1cm4gcy5sZW5ndGggPyBzLnBvcCgpICsgXCIgXCIgOiBcIlwiO1xuICB9XG5cbiAgZnVuY3Rpb24gdHJhbnNsYXRlKHhhLCB5YSwgeGIsIHliLCBzLCBxKSB7XG4gICAgaWYgKHhhICE9PSB4YiB8fCB5YSAhPT0geWIpIHtcbiAgICAgIHZhciBpID0gcy5wdXNoKFwidHJhbnNsYXRlKFwiLCBudWxsLCBweENvbW1hLCBudWxsLCBweFBhcmVuKTtcbiAgICAgIHEucHVzaCh7aTogaSAtIDQsIHg6IG51bWJlcih4YSwgeGIpfSwge2k6IGkgLSAyLCB4OiBudW1iZXIoeWEsIHliKX0pO1xuICAgIH0gZWxzZSBpZiAoeGIgfHwgeWIpIHtcbiAgICAgIHMucHVzaChcInRyYW5zbGF0ZShcIiArIHhiICsgcHhDb21tYSArIHliICsgcHhQYXJlbik7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcm90YXRlKGEsIGIsIHMsIHEpIHtcbiAgICBpZiAoYSAhPT0gYikge1xuICAgICAgaWYgKGEgLSBiID4gMTgwKSBiICs9IDM2MDsgZWxzZSBpZiAoYiAtIGEgPiAxODApIGEgKz0gMzYwOyAvLyBzaG9ydGVzdCBwYXRoXG4gICAgICBxLnB1c2goe2k6IHMucHVzaChwb3AocykgKyBcInJvdGF0ZShcIiwgbnVsbCwgZGVnUGFyZW4pIC0gMiwgeDogbnVtYmVyKGEsIGIpfSk7XG4gICAgfSBlbHNlIGlmIChiKSB7XG4gICAgICBzLnB1c2gocG9wKHMpICsgXCJyb3RhdGUoXCIgKyBiICsgZGVnUGFyZW4pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNrZXdYKGEsIGIsIHMsIHEpIHtcbiAgICBpZiAoYSAhPT0gYikge1xuICAgICAgcS5wdXNoKHtpOiBzLnB1c2gocG9wKHMpICsgXCJza2V3WChcIiwgbnVsbCwgZGVnUGFyZW4pIC0gMiwgeDogbnVtYmVyKGEsIGIpfSk7XG4gICAgfSBlbHNlIGlmIChiKSB7XG4gICAgICBzLnB1c2gocG9wKHMpICsgXCJza2V3WChcIiArIGIgKyBkZWdQYXJlbik7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc2NhbGUoeGEsIHlhLCB4YiwgeWIsIHMsIHEpIHtcbiAgICBpZiAoeGEgIT09IHhiIHx8IHlhICE9PSB5Yikge1xuICAgICAgdmFyIGkgPSBzLnB1c2gocG9wKHMpICsgXCJzY2FsZShcIiwgbnVsbCwgXCIsXCIsIG51bGwsIFwiKVwiKTtcbiAgICAgIHEucHVzaCh7aTogaSAtIDQsIHg6IG51bWJlcih4YSwgeGIpfSwge2k6IGkgLSAyLCB4OiBudW1iZXIoeWEsIHliKX0pO1xuICAgIH0gZWxzZSBpZiAoeGIgIT09IDEgfHwgeWIgIT09IDEpIHtcbiAgICAgIHMucHVzaChwb3AocykgKyBcInNjYWxlKFwiICsgeGIgKyBcIixcIiArIHliICsgXCIpXCIpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbihhLCBiKSB7XG4gICAgdmFyIHMgPSBbXSwgLy8gc3RyaW5nIGNvbnN0YW50cyBhbmQgcGxhY2Vob2xkZXJzXG4gICAgICAgIHEgPSBbXTsgLy8gbnVtYmVyIGludGVycG9sYXRvcnNcbiAgICBhID0gcGFyc2UoYSksIGIgPSBwYXJzZShiKTtcbiAgICB0cmFuc2xhdGUoYS50cmFuc2xhdGVYLCBhLnRyYW5zbGF0ZVksIGIudHJhbnNsYXRlWCwgYi50cmFuc2xhdGVZLCBzLCBxKTtcbiAgICByb3RhdGUoYS5yb3RhdGUsIGIucm90YXRlLCBzLCBxKTtcbiAgICBza2V3WChhLnNrZXdYLCBiLnNrZXdYLCBzLCBxKTtcbiAgICBzY2FsZShhLnNjYWxlWCwgYS5zY2FsZVksIGIuc2NhbGVYLCBiLnNjYWxlWSwgcywgcSk7XG4gICAgYSA9IGIgPSBudWxsOyAvLyBnY1xuICAgIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgICB2YXIgaSA9IC0xLCBuID0gcS5sZW5ndGgsIG87XG4gICAgICB3aGlsZSAoKytpIDwgbikgc1sobyA9IHFbaV0pLmldID0gby54KHQpO1xuICAgICAgcmV0dXJuIHMuam9pbihcIlwiKTtcbiAgICB9O1xuICB9O1xufVxuXG5leHBvcnQgdmFyIGludGVycG9sYXRlVHJhbnNmb3JtQ3NzID0gaW50ZXJwb2xhdGVUcmFuc2Zvcm0ocGFyc2VDc3MsIFwicHgsIFwiLCBcInB4KVwiLCBcImRlZylcIik7XG5leHBvcnQgdmFyIGludGVycG9sYXRlVHJhbnNmb3JtU3ZnID0gaW50ZXJwb2xhdGVUcmFuc2Zvcm0ocGFyc2VTdmcsIFwiLCBcIiwgXCIpXCIsIFwiKVwiKTtcbiIsImltcG9ydCB7Z2V0LCBzZXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmZ1bmN0aW9uIHR3ZWVuUmVtb3ZlKGlkLCBuYW1lKSB7XG4gIHZhciB0d2VlbjAsIHR3ZWVuMTtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzY2hlZHVsZSA9IHNldCh0aGlzLCBpZCksXG4gICAgICAgIHR3ZWVuID0gc2NoZWR1bGUudHdlZW47XG5cbiAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIHR3ZWVuIHdpdGggdGhlIHByZXZpb3VzIG5vZGUsXG4gICAgLy8ganVzdCBhc3NpZ24gdGhlIHVwZGF0ZWQgc2hhcmVkIHR3ZWVuIGFuZCB3ZeKAmXJlIGRvbmUhXG4gICAgLy8gT3RoZXJ3aXNlLCBjb3B5LW9uLXdyaXRlLlxuICAgIGlmICh0d2VlbiAhPT0gdHdlZW4wKSB7XG4gICAgICB0d2VlbjEgPSB0d2VlbjAgPSB0d2VlbjtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBuID0gdHdlZW4xLmxlbmd0aDsgaSA8IG47ICsraSkge1xuICAgICAgICBpZiAodHdlZW4xW2ldLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgICAgICB0d2VlbjEgPSB0d2VlbjEuc2xpY2UoKTtcbiAgICAgICAgICB0d2VlbjEuc3BsaWNlKGksIDEpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgc2NoZWR1bGUudHdlZW4gPSB0d2VlbjE7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHR3ZWVuRnVuY3Rpb24oaWQsIG5hbWUsIHZhbHVlKSB7XG4gIHZhciB0d2VlbjAsIHR3ZWVuMTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3I7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc2NoZWR1bGUgPSBzZXQodGhpcywgaWQpLFxuICAgICAgICB0d2VlbiA9IHNjaGVkdWxlLnR3ZWVuO1xuXG4gICAgLy8gSWYgdGhpcyBub2RlIHNoYXJlZCB0d2VlbiB3aXRoIHRoZSBwcmV2aW91cyBub2RlLFxuICAgIC8vIGp1c3QgYXNzaWduIHRoZSB1cGRhdGVkIHNoYXJlZCB0d2VlbiBhbmQgd2XigJlyZSBkb25lIVxuICAgIC8vIE90aGVyd2lzZSwgY29weS1vbi13cml0ZS5cbiAgICBpZiAodHdlZW4gIT09IHR3ZWVuMCkge1xuICAgICAgdHdlZW4xID0gKHR3ZWVuMCA9IHR3ZWVuKS5zbGljZSgpO1xuICAgICAgZm9yICh2YXIgdCA9IHtuYW1lOiBuYW1lLCB2YWx1ZTogdmFsdWV9LCBpID0gMCwgbiA9IHR3ZWVuMS5sZW5ndGg7IGkgPCBuOyArK2kpIHtcbiAgICAgICAgaWYgKHR3ZWVuMVtpXS5uYW1lID09PSBuYW1lKSB7XG4gICAgICAgICAgdHdlZW4xW2ldID0gdDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGkgPT09IG4pIHR3ZWVuMS5wdXNoKHQpO1xuICAgIH1cblxuICAgIHNjaGVkdWxlLnR3ZWVuID0gdHdlZW4xO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICB2YXIgaWQgPSB0aGlzLl9pZDtcblxuICBuYW1lICs9IFwiXCI7XG5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgdmFyIHR3ZWVuID0gZ2V0KHRoaXMubm9kZSgpLCBpZCkudHdlZW47XG4gICAgZm9yICh2YXIgaSA9IDAsIG4gPSB0d2Vlbi5sZW5ndGgsIHQ7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmICgodCA9IHR3ZWVuW2ldKS5uYW1lID09PSBuYW1lKSB7XG4gICAgICAgIHJldHVybiB0LnZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiB0aGlzLmVhY2goKHZhbHVlID09IG51bGwgPyB0d2VlblJlbW92ZSA6IHR3ZWVuRnVuY3Rpb24pKGlkLCBuYW1lLCB2YWx1ZSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdHdlZW5WYWx1ZSh0cmFuc2l0aW9uLCBuYW1lLCB2YWx1ZSkge1xuICB2YXIgaWQgPSB0cmFuc2l0aW9uLl9pZDtcblxuICB0cmFuc2l0aW9uLmVhY2goZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNjaGVkdWxlID0gc2V0KHRoaXMsIGlkKTtcbiAgICAoc2NoZWR1bGUudmFsdWUgfHwgKHNjaGVkdWxlLnZhbHVlID0ge30pKVtuYW1lXSA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH0pO1xuXG4gIHJldHVybiBmdW5jdGlvbihub2RlKSB7XG4gICAgcmV0dXJuIGdldChub2RlLCBpZCkudmFsdWVbbmFtZV07XG4gIH07XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjb25zdHJ1Y3RvciwgZmFjdG9yeSwgcHJvdG90eXBlKSB7XG4gIGNvbnN0cnVjdG9yLnByb3RvdHlwZSA9IGZhY3RvcnkucHJvdG90eXBlID0gcHJvdG90eXBlO1xuICBwcm90b3R5cGUuY29uc3RydWN0b3IgPSBjb25zdHJ1Y3Rvcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4dGVuZChwYXJlbnQsIGRlZmluaXRpb24pIHtcbiAgdmFyIHByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUocGFyZW50LnByb3RvdHlwZSk7XG4gIGZvciAodmFyIGtleSBpbiBkZWZpbml0aW9uKSBwcm90b3R5cGVba2V5XSA9IGRlZmluaXRpb25ba2V5XTtcbiAgcmV0dXJuIHByb3RvdHlwZTtcbn1cbiIsImltcG9ydCBkZWZpbmUsIHtleHRlbmR9IGZyb20gXCIuL2RlZmluZS5qc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gQ29sb3IoKSB7fVxuXG5leHBvcnQgdmFyIGRhcmtlciA9IDAuNztcbmV4cG9ydCB2YXIgYnJpZ2h0ZXIgPSAxIC8gZGFya2VyO1xuXG52YXIgcmVJID0gXCJcXFxccyooWystXT9cXFxcZCspXFxcXHMqXCIsXG4gICAgcmVOID0gXCJcXFxccyooWystXT8oPzpcXFxcZCpcXFxcLik/XFxcXGQrKD86W2VFXVsrLV0/XFxcXGQrKT8pXFxcXHMqXCIsXG4gICAgcmVQID0gXCJcXFxccyooWystXT8oPzpcXFxcZCpcXFxcLik/XFxcXGQrKD86W2VFXVsrLV0/XFxcXGQrKT8pJVxcXFxzKlwiLFxuICAgIHJlSGV4ID0gL14jKFswLTlhLWZdezMsOH0pJC8sXG4gICAgcmVSZ2JJbnRlZ2VyID0gbmV3IFJlZ0V4cChgXnJnYlxcXFwoJHtyZUl9LCR7cmVJfSwke3JlSX1cXFxcKSRgKSxcbiAgICByZVJnYlBlcmNlbnQgPSBuZXcgUmVnRXhwKGBecmdiXFxcXCgke3JlUH0sJHtyZVB9LCR7cmVQfVxcXFwpJGApLFxuICAgIHJlUmdiYUludGVnZXIgPSBuZXcgUmVnRXhwKGBecmdiYVxcXFwoJHtyZUl9LCR7cmVJfSwke3JlSX0sJHtyZU59XFxcXCkkYCksXG4gICAgcmVSZ2JhUGVyY2VudCA9IG5ldyBSZWdFeHAoYF5yZ2JhXFxcXCgke3JlUH0sJHtyZVB9LCR7cmVQfSwke3JlTn1cXFxcKSRgKSxcbiAgICByZUhzbFBlcmNlbnQgPSBuZXcgUmVnRXhwKGBeaHNsXFxcXCgke3JlTn0sJHtyZVB9LCR7cmVQfVxcXFwpJGApLFxuICAgIHJlSHNsYVBlcmNlbnQgPSBuZXcgUmVnRXhwKGBeaHNsYVxcXFwoJHtyZU59LCR7cmVQfSwke3JlUH0sJHtyZU59XFxcXCkkYCk7XG5cbnZhciBuYW1lZCA9IHtcbiAgYWxpY2VibHVlOiAweGYwZjhmZixcbiAgYW50aXF1ZXdoaXRlOiAweGZhZWJkNyxcbiAgYXF1YTogMHgwMGZmZmYsXG4gIGFxdWFtYXJpbmU6IDB4N2ZmZmQ0LFxuICBhenVyZTogMHhmMGZmZmYsXG4gIGJlaWdlOiAweGY1ZjVkYyxcbiAgYmlzcXVlOiAweGZmZTRjNCxcbiAgYmxhY2s6IDB4MDAwMDAwLFxuICBibGFuY2hlZGFsbW9uZDogMHhmZmViY2QsXG4gIGJsdWU6IDB4MDAwMGZmLFxuICBibHVldmlvbGV0OiAweDhhMmJlMixcbiAgYnJvd246IDB4YTUyYTJhLFxuICBidXJseXdvb2Q6IDB4ZGViODg3LFxuICBjYWRldGJsdWU6IDB4NWY5ZWEwLFxuICBjaGFydHJldXNlOiAweDdmZmYwMCxcbiAgY2hvY29sYXRlOiAweGQyNjkxZSxcbiAgY29yYWw6IDB4ZmY3ZjUwLFxuICBjb3JuZmxvd2VyYmx1ZTogMHg2NDk1ZWQsXG4gIGNvcm5zaWxrOiAweGZmZjhkYyxcbiAgY3JpbXNvbjogMHhkYzE0M2MsXG4gIGN5YW46IDB4MDBmZmZmLFxuICBkYXJrYmx1ZTogMHgwMDAwOGIsXG4gIGRhcmtjeWFuOiAweDAwOGI4YixcbiAgZGFya2dvbGRlbnJvZDogMHhiODg2MGIsXG4gIGRhcmtncmF5OiAweGE5YTlhOSxcbiAgZGFya2dyZWVuOiAweDAwNjQwMCxcbiAgZGFya2dyZXk6IDB4YTlhOWE5LFxuICBkYXJra2hha2k6IDB4YmRiNzZiLFxuICBkYXJrbWFnZW50YTogMHg4YjAwOGIsXG4gIGRhcmtvbGl2ZWdyZWVuOiAweDU1NmIyZixcbiAgZGFya29yYW5nZTogMHhmZjhjMDAsXG4gIGRhcmtvcmNoaWQ6IDB4OTkzMmNjLFxuICBkYXJrcmVkOiAweDhiMDAwMCxcbiAgZGFya3NhbG1vbjogMHhlOTk2N2EsXG4gIGRhcmtzZWFncmVlbjogMHg4ZmJjOGYsXG4gIGRhcmtzbGF0ZWJsdWU6IDB4NDgzZDhiLFxuICBkYXJrc2xhdGVncmF5OiAweDJmNGY0ZixcbiAgZGFya3NsYXRlZ3JleTogMHgyZjRmNGYsXG4gIGRhcmt0dXJxdW9pc2U6IDB4MDBjZWQxLFxuICBkYXJrdmlvbGV0OiAweDk0MDBkMyxcbiAgZGVlcHBpbms6IDB4ZmYxNDkzLFxuICBkZWVwc2t5Ymx1ZTogMHgwMGJmZmYsXG4gIGRpbWdyYXk6IDB4Njk2OTY5LFxuICBkaW1ncmV5OiAweDY5Njk2OSxcbiAgZG9kZ2VyYmx1ZTogMHgxZTkwZmYsXG4gIGZpcmVicmljazogMHhiMjIyMjIsXG4gIGZsb3JhbHdoaXRlOiAweGZmZmFmMCxcbiAgZm9yZXN0Z3JlZW46IDB4MjI4YjIyLFxuICBmdWNoc2lhOiAweGZmMDBmZixcbiAgZ2FpbnNib3JvOiAweGRjZGNkYyxcbiAgZ2hvc3R3aGl0ZTogMHhmOGY4ZmYsXG4gIGdvbGQ6IDB4ZmZkNzAwLFxuICBnb2xkZW5yb2Q6IDB4ZGFhNTIwLFxuICBncmF5OiAweDgwODA4MCxcbiAgZ3JlZW46IDB4MDA4MDAwLFxuICBncmVlbnllbGxvdzogMHhhZGZmMmYsXG4gIGdyZXk6IDB4ODA4MDgwLFxuICBob25leWRldzogMHhmMGZmZjAsXG4gIGhvdHBpbms6IDB4ZmY2OWI0LFxuICBpbmRpYW5yZWQ6IDB4Y2Q1YzVjLFxuICBpbmRpZ286IDB4NGIwMDgyLFxuICBpdm9yeTogMHhmZmZmZjAsXG4gIGtoYWtpOiAweGYwZTY4YyxcbiAgbGF2ZW5kZXI6IDB4ZTZlNmZhLFxuICBsYXZlbmRlcmJsdXNoOiAweGZmZjBmNSxcbiAgbGF3bmdyZWVuOiAweDdjZmMwMCxcbiAgbGVtb25jaGlmZm9uOiAweGZmZmFjZCxcbiAgbGlnaHRibHVlOiAweGFkZDhlNixcbiAgbGlnaHRjb3JhbDogMHhmMDgwODAsXG4gIGxpZ2h0Y3lhbjogMHhlMGZmZmYsXG4gIGxpZ2h0Z29sZGVucm9keWVsbG93OiAweGZhZmFkMixcbiAgbGlnaHRncmF5OiAweGQzZDNkMyxcbiAgbGlnaHRncmVlbjogMHg5MGVlOTAsXG4gIGxpZ2h0Z3JleTogMHhkM2QzZDMsXG4gIGxpZ2h0cGluazogMHhmZmI2YzEsXG4gIGxpZ2h0c2FsbW9uOiAweGZmYTA3YSxcbiAgbGlnaHRzZWFncmVlbjogMHgyMGIyYWEsXG4gIGxpZ2h0c2t5Ymx1ZTogMHg4N2NlZmEsXG4gIGxpZ2h0c2xhdGVncmF5OiAweDc3ODg5OSxcbiAgbGlnaHRzbGF0ZWdyZXk6IDB4Nzc4ODk5LFxuICBsaWdodHN0ZWVsYmx1ZTogMHhiMGM0ZGUsXG4gIGxpZ2h0eWVsbG93OiAweGZmZmZlMCxcbiAgbGltZTogMHgwMGZmMDAsXG4gIGxpbWVncmVlbjogMHgzMmNkMzIsXG4gIGxpbmVuOiAweGZhZjBlNixcbiAgbWFnZW50YTogMHhmZjAwZmYsXG4gIG1hcm9vbjogMHg4MDAwMDAsXG4gIG1lZGl1bWFxdWFtYXJpbmU6IDB4NjZjZGFhLFxuICBtZWRpdW1ibHVlOiAweDAwMDBjZCxcbiAgbWVkaXVtb3JjaGlkOiAweGJhNTVkMyxcbiAgbWVkaXVtcHVycGxlOiAweDkzNzBkYixcbiAgbWVkaXVtc2VhZ3JlZW46IDB4M2NiMzcxLFxuICBtZWRpdW1zbGF0ZWJsdWU6IDB4N2I2OGVlLFxuICBtZWRpdW1zcHJpbmdncmVlbjogMHgwMGZhOWEsXG4gIG1lZGl1bXR1cnF1b2lzZTogMHg0OGQxY2MsXG4gIG1lZGl1bXZpb2xldHJlZDogMHhjNzE1ODUsXG4gIG1pZG5pZ2h0Ymx1ZTogMHgxOTE5NzAsXG4gIG1pbnRjcmVhbTogMHhmNWZmZmEsXG4gIG1pc3R5cm9zZTogMHhmZmU0ZTEsXG4gIG1vY2Nhc2luOiAweGZmZTRiNSxcbiAgbmF2YWpvd2hpdGU6IDB4ZmZkZWFkLFxuICBuYXZ5OiAweDAwMDA4MCxcbiAgb2xkbGFjZTogMHhmZGY1ZTYsXG4gIG9saXZlOiAweDgwODAwMCxcbiAgb2xpdmVkcmFiOiAweDZiOGUyMyxcbiAgb3JhbmdlOiAweGZmYTUwMCxcbiAgb3JhbmdlcmVkOiAweGZmNDUwMCxcbiAgb3JjaGlkOiAweGRhNzBkNixcbiAgcGFsZWdvbGRlbnJvZDogMHhlZWU4YWEsXG4gIHBhbGVncmVlbjogMHg5OGZiOTgsXG4gIHBhbGV0dXJxdW9pc2U6IDB4YWZlZWVlLFxuICBwYWxldmlvbGV0cmVkOiAweGRiNzA5MyxcbiAgcGFwYXlhd2hpcDogMHhmZmVmZDUsXG4gIHBlYWNocHVmZjogMHhmZmRhYjksXG4gIHBlcnU6IDB4Y2Q4NTNmLFxuICBwaW5rOiAweGZmYzBjYixcbiAgcGx1bTogMHhkZGEwZGQsXG4gIHBvd2RlcmJsdWU6IDB4YjBlMGU2LFxuICBwdXJwbGU6IDB4ODAwMDgwLFxuICByZWJlY2NhcHVycGxlOiAweDY2MzM5OSxcbiAgcmVkOiAweGZmMDAwMCxcbiAgcm9zeWJyb3duOiAweGJjOGY4ZixcbiAgcm95YWxibHVlOiAweDQxNjllMSxcbiAgc2FkZGxlYnJvd246IDB4OGI0NTEzLFxuICBzYWxtb246IDB4ZmE4MDcyLFxuICBzYW5keWJyb3duOiAweGY0YTQ2MCxcbiAgc2VhZ3JlZW46IDB4MmU4YjU3LFxuICBzZWFzaGVsbDogMHhmZmY1ZWUsXG4gIHNpZW5uYTogMHhhMDUyMmQsXG4gIHNpbHZlcjogMHhjMGMwYzAsXG4gIHNreWJsdWU6IDB4ODdjZWViLFxuICBzbGF0ZWJsdWU6IDB4NmE1YWNkLFxuICBzbGF0ZWdyYXk6IDB4NzA4MDkwLFxuICBzbGF0ZWdyZXk6IDB4NzA4MDkwLFxuICBzbm93OiAweGZmZmFmYSxcbiAgc3ByaW5nZ3JlZW46IDB4MDBmZjdmLFxuICBzdGVlbGJsdWU6IDB4NDY4MmI0LFxuICB0YW46IDB4ZDJiNDhjLFxuICB0ZWFsOiAweDAwODA4MCxcbiAgdGhpc3RsZTogMHhkOGJmZDgsXG4gIHRvbWF0bzogMHhmZjYzNDcsXG4gIHR1cnF1b2lzZTogMHg0MGUwZDAsXG4gIHZpb2xldDogMHhlZTgyZWUsXG4gIHdoZWF0OiAweGY1ZGViMyxcbiAgd2hpdGU6IDB4ZmZmZmZmLFxuICB3aGl0ZXNtb2tlOiAweGY1ZjVmNSxcbiAgeWVsbG93OiAweGZmZmYwMCxcbiAgeWVsbG93Z3JlZW46IDB4OWFjZDMyXG59O1xuXG5kZWZpbmUoQ29sb3IsIGNvbG9yLCB7XG4gIGNvcHkoY2hhbm5lbHMpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihuZXcgdGhpcy5jb25zdHJ1Y3RvciwgdGhpcywgY2hhbm5lbHMpO1xuICB9LFxuICBkaXNwbGF5YWJsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5yZ2IoKS5kaXNwbGF5YWJsZSgpO1xuICB9LFxuICBoZXg6IGNvbG9yX2Zvcm1hdEhleCwgLy8gRGVwcmVjYXRlZCEgVXNlIGNvbG9yLmZvcm1hdEhleC5cbiAgZm9ybWF0SGV4OiBjb2xvcl9mb3JtYXRIZXgsXG4gIGZvcm1hdEhleDg6IGNvbG9yX2Zvcm1hdEhleDgsXG4gIGZvcm1hdEhzbDogY29sb3JfZm9ybWF0SHNsLFxuICBmb3JtYXRSZ2I6IGNvbG9yX2Zvcm1hdFJnYixcbiAgdG9TdHJpbmc6IGNvbG9yX2Zvcm1hdFJnYlxufSk7XG5cbmZ1bmN0aW9uIGNvbG9yX2Zvcm1hdEhleCgpIHtcbiAgcmV0dXJuIHRoaXMucmdiKCkuZm9ybWF0SGV4KCk7XG59XG5cbmZ1bmN0aW9uIGNvbG9yX2Zvcm1hdEhleDgoKSB7XG4gIHJldHVybiB0aGlzLnJnYigpLmZvcm1hdEhleDgoKTtcbn1cblxuZnVuY3Rpb24gY29sb3JfZm9ybWF0SHNsKCkge1xuICByZXR1cm4gaHNsQ29udmVydCh0aGlzKS5mb3JtYXRIc2woKTtcbn1cblxuZnVuY3Rpb24gY29sb3JfZm9ybWF0UmdiKCkge1xuICByZXR1cm4gdGhpcy5yZ2IoKS5mb3JtYXRSZ2IoKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY29sb3IoZm9ybWF0KSB7XG4gIHZhciBtLCBsO1xuICBmb3JtYXQgPSAoZm9ybWF0ICsgXCJcIikudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gIHJldHVybiAobSA9IHJlSGV4LmV4ZWMoZm9ybWF0KSkgPyAobCA9IG1bMV0ubGVuZ3RoLCBtID0gcGFyc2VJbnQobVsxXSwgMTYpLCBsID09PSA2ID8gcmdibihtKSAvLyAjZmYwMDAwXG4gICAgICA6IGwgPT09IDMgPyBuZXcgUmdiKChtID4+IDggJiAweGYpIHwgKG0gPj4gNCAmIDB4ZjApLCAobSA+PiA0ICYgMHhmKSB8IChtICYgMHhmMCksICgobSAmIDB4ZikgPDwgNCkgfCAobSAmIDB4ZiksIDEpIC8vICNmMDBcbiAgICAgIDogbCA9PT0gOCA/IHJnYmEobSA+PiAyNCAmIDB4ZmYsIG0gPj4gMTYgJiAweGZmLCBtID4+IDggJiAweGZmLCAobSAmIDB4ZmYpIC8gMHhmZikgLy8gI2ZmMDAwMDAwXG4gICAgICA6IGwgPT09IDQgPyByZ2JhKChtID4+IDEyICYgMHhmKSB8IChtID4+IDggJiAweGYwKSwgKG0gPj4gOCAmIDB4ZikgfCAobSA+PiA0ICYgMHhmMCksIChtID4+IDQgJiAweGYpIHwgKG0gJiAweGYwKSwgKCgobSAmIDB4ZikgPDwgNCkgfCAobSAmIDB4ZikpIC8gMHhmZikgLy8gI2YwMDBcbiAgICAgIDogbnVsbCkgLy8gaW52YWxpZCBoZXhcbiAgICAgIDogKG0gPSByZVJnYkludGVnZXIuZXhlYyhmb3JtYXQpKSA/IG5ldyBSZ2IobVsxXSwgbVsyXSwgbVszXSwgMSkgLy8gcmdiKDI1NSwgMCwgMClcbiAgICAgIDogKG0gPSByZVJnYlBlcmNlbnQuZXhlYyhmb3JtYXQpKSA/IG5ldyBSZ2IobVsxXSAqIDI1NSAvIDEwMCwgbVsyXSAqIDI1NSAvIDEwMCwgbVszXSAqIDI1NSAvIDEwMCwgMSkgLy8gcmdiKDEwMCUsIDAlLCAwJSlcbiAgICAgIDogKG0gPSByZVJnYmFJbnRlZ2VyLmV4ZWMoZm9ybWF0KSkgPyByZ2JhKG1bMV0sIG1bMl0sIG1bM10sIG1bNF0pIC8vIHJnYmEoMjU1LCAwLCAwLCAxKVxuICAgICAgOiAobSA9IHJlUmdiYVBlcmNlbnQuZXhlYyhmb3JtYXQpKSA/IHJnYmEobVsxXSAqIDI1NSAvIDEwMCwgbVsyXSAqIDI1NSAvIDEwMCwgbVszXSAqIDI1NSAvIDEwMCwgbVs0XSkgLy8gcmdiKDEwMCUsIDAlLCAwJSwgMSlcbiAgICAgIDogKG0gPSByZUhzbFBlcmNlbnQuZXhlYyhmb3JtYXQpKSA/IGhzbGEobVsxXSwgbVsyXSAvIDEwMCwgbVszXSAvIDEwMCwgMSkgLy8gaHNsKDEyMCwgNTAlLCA1MCUpXG4gICAgICA6IChtID0gcmVIc2xhUGVyY2VudC5leGVjKGZvcm1hdCkpID8gaHNsYShtWzFdLCBtWzJdIC8gMTAwLCBtWzNdIC8gMTAwLCBtWzRdKSAvLyBoc2xhKDEyMCwgNTAlLCA1MCUsIDEpXG4gICAgICA6IG5hbWVkLmhhc093blByb3BlcnR5KGZvcm1hdCkgPyByZ2JuKG5hbWVkW2Zvcm1hdF0pIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gICAgICA6IGZvcm1hdCA9PT0gXCJ0cmFuc3BhcmVudFwiID8gbmV3IFJnYihOYU4sIE5hTiwgTmFOLCAwKVxuICAgICAgOiBudWxsO1xufVxuXG5mdW5jdGlvbiByZ2JuKG4pIHtcbiAgcmV0dXJuIG5ldyBSZ2IobiA+PiAxNiAmIDB4ZmYsIG4gPj4gOCAmIDB4ZmYsIG4gJiAweGZmLCAxKTtcbn1cblxuZnVuY3Rpb24gcmdiYShyLCBnLCBiLCBhKSB7XG4gIGlmIChhIDw9IDApIHIgPSBnID0gYiA9IE5hTjtcbiAgcmV0dXJuIG5ldyBSZ2IociwgZywgYiwgYSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZ2JDb252ZXJ0KG8pIHtcbiAgaWYgKCEobyBpbnN0YW5jZW9mIENvbG9yKSkgbyA9IGNvbG9yKG8pO1xuICBpZiAoIW8pIHJldHVybiBuZXcgUmdiO1xuICBvID0gby5yZ2IoKTtcbiAgcmV0dXJuIG5ldyBSZ2Ioby5yLCBvLmcsIG8uYiwgby5vcGFjaXR5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJnYihyLCBnLCBiLCBvcGFjaXR5KSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gcmdiQ29udmVydChyKSA6IG5ldyBSZ2IociwgZywgYiwgb3BhY2l0eSA9PSBudWxsID8gMSA6IG9wYWNpdHkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gUmdiKHIsIGcsIGIsIG9wYWNpdHkpIHtcbiAgdGhpcy5yID0gK3I7XG4gIHRoaXMuZyA9ICtnO1xuICB0aGlzLmIgPSArYjtcbiAgdGhpcy5vcGFjaXR5ID0gK29wYWNpdHk7XG59XG5cbmRlZmluZShSZ2IsIHJnYiwgZXh0ZW5kKENvbG9yLCB7XG4gIGJyaWdodGVyKGspIHtcbiAgICBrID0gayA9PSBudWxsID8gYnJpZ2h0ZXIgOiBNYXRoLnBvdyhicmlnaHRlciwgayk7XG4gICAgcmV0dXJuIG5ldyBSZ2IodGhpcy5yICogaywgdGhpcy5nICogaywgdGhpcy5iICogaywgdGhpcy5vcGFjaXR5KTtcbiAgfSxcbiAgZGFya2VyKGspIHtcbiAgICBrID0gayA9PSBudWxsID8gZGFya2VyIDogTWF0aC5wb3coZGFya2VyLCBrKTtcbiAgICByZXR1cm4gbmV3IFJnYih0aGlzLnIgKiBrLCB0aGlzLmcgKiBrLCB0aGlzLmIgKiBrLCB0aGlzLm9wYWNpdHkpO1xuICB9LFxuICByZ2IoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIGNsYW1wKCkge1xuICAgIHJldHVybiBuZXcgUmdiKGNsYW1waSh0aGlzLnIpLCBjbGFtcGkodGhpcy5nKSwgY2xhbXBpKHRoaXMuYiksIGNsYW1wYSh0aGlzLm9wYWNpdHkpKTtcbiAgfSxcbiAgZGlzcGxheWFibGUoKSB7XG4gICAgcmV0dXJuICgtMC41IDw9IHRoaXMuciAmJiB0aGlzLnIgPCAyNTUuNSlcbiAgICAgICAgJiYgKC0wLjUgPD0gdGhpcy5nICYmIHRoaXMuZyA8IDI1NS41KVxuICAgICAgICAmJiAoLTAuNSA8PSB0aGlzLmIgJiYgdGhpcy5iIDwgMjU1LjUpXG4gICAgICAgICYmICgwIDw9IHRoaXMub3BhY2l0eSAmJiB0aGlzLm9wYWNpdHkgPD0gMSk7XG4gIH0sXG4gIGhleDogcmdiX2Zvcm1hdEhleCwgLy8gRGVwcmVjYXRlZCEgVXNlIGNvbG9yLmZvcm1hdEhleC5cbiAgZm9ybWF0SGV4OiByZ2JfZm9ybWF0SGV4LFxuICBmb3JtYXRIZXg4OiByZ2JfZm9ybWF0SGV4OCxcbiAgZm9ybWF0UmdiOiByZ2JfZm9ybWF0UmdiLFxuICB0b1N0cmluZzogcmdiX2Zvcm1hdFJnYlxufSkpO1xuXG5mdW5jdGlvbiByZ2JfZm9ybWF0SGV4KCkge1xuICByZXR1cm4gYCMke2hleCh0aGlzLnIpfSR7aGV4KHRoaXMuZyl9JHtoZXgodGhpcy5iKX1gO1xufVxuXG5mdW5jdGlvbiByZ2JfZm9ybWF0SGV4OCgpIHtcbiAgcmV0dXJuIGAjJHtoZXgodGhpcy5yKX0ke2hleCh0aGlzLmcpfSR7aGV4KHRoaXMuYil9JHtoZXgoKGlzTmFOKHRoaXMub3BhY2l0eSkgPyAxIDogdGhpcy5vcGFjaXR5KSAqIDI1NSl9YDtcbn1cblxuZnVuY3Rpb24gcmdiX2Zvcm1hdFJnYigpIHtcbiAgY29uc3QgYSA9IGNsYW1wYSh0aGlzLm9wYWNpdHkpO1xuICByZXR1cm4gYCR7YSA9PT0gMSA/IFwicmdiKFwiIDogXCJyZ2JhKFwifSR7Y2xhbXBpKHRoaXMucil9LCAke2NsYW1waSh0aGlzLmcpfSwgJHtjbGFtcGkodGhpcy5iKX0ke2EgPT09IDEgPyBcIilcIiA6IGAsICR7YX0pYH1gO1xufVxuXG5mdW5jdGlvbiBjbGFtcGEob3BhY2l0eSkge1xuICByZXR1cm4gaXNOYU4ob3BhY2l0eSkgPyAxIDogTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgb3BhY2l0eSkpO1xufVxuXG5mdW5jdGlvbiBjbGFtcGkodmFsdWUpIHtcbiAgcmV0dXJuIE1hdGgubWF4KDAsIE1hdGgubWluKDI1NSwgTWF0aC5yb3VuZCh2YWx1ZSkgfHwgMCkpO1xufVxuXG5mdW5jdGlvbiBoZXgodmFsdWUpIHtcbiAgdmFsdWUgPSBjbGFtcGkodmFsdWUpO1xuICByZXR1cm4gKHZhbHVlIDwgMTYgPyBcIjBcIiA6IFwiXCIpICsgdmFsdWUudG9TdHJpbmcoMTYpO1xufVxuXG5mdW5jdGlvbiBoc2xhKGgsIHMsIGwsIGEpIHtcbiAgaWYgKGEgPD0gMCkgaCA9IHMgPSBsID0gTmFOO1xuICBlbHNlIGlmIChsIDw9IDAgfHwgbCA+PSAxKSBoID0gcyA9IE5hTjtcbiAgZWxzZSBpZiAocyA8PSAwKSBoID0gTmFOO1xuICByZXR1cm4gbmV3IEhzbChoLCBzLCBsLCBhKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhzbENvbnZlcnQobykge1xuICBpZiAobyBpbnN0YW5jZW9mIEhzbCkgcmV0dXJuIG5ldyBIc2woby5oLCBvLnMsIG8ubCwgby5vcGFjaXR5KTtcbiAgaWYgKCEobyBpbnN0YW5jZW9mIENvbG9yKSkgbyA9IGNvbG9yKG8pO1xuICBpZiAoIW8pIHJldHVybiBuZXcgSHNsO1xuICBpZiAobyBpbnN0YW5jZW9mIEhzbCkgcmV0dXJuIG87XG4gIG8gPSBvLnJnYigpO1xuICB2YXIgciA9IG8uciAvIDI1NSxcbiAgICAgIGcgPSBvLmcgLyAyNTUsXG4gICAgICBiID0gby5iIC8gMjU1LFxuICAgICAgbWluID0gTWF0aC5taW4ociwgZywgYiksXG4gICAgICBtYXggPSBNYXRoLm1heChyLCBnLCBiKSxcbiAgICAgIGggPSBOYU4sXG4gICAgICBzID0gbWF4IC0gbWluLFxuICAgICAgbCA9IChtYXggKyBtaW4pIC8gMjtcbiAgaWYgKHMpIHtcbiAgICBpZiAociA9PT0gbWF4KSBoID0gKGcgLSBiKSAvIHMgKyAoZyA8IGIpICogNjtcbiAgICBlbHNlIGlmIChnID09PSBtYXgpIGggPSAoYiAtIHIpIC8gcyArIDI7XG4gICAgZWxzZSBoID0gKHIgLSBnKSAvIHMgKyA0O1xuICAgIHMgLz0gbCA8IDAuNSA/IG1heCArIG1pbiA6IDIgLSBtYXggLSBtaW47XG4gICAgaCAqPSA2MDtcbiAgfSBlbHNlIHtcbiAgICBzID0gbCA+IDAgJiYgbCA8IDEgPyAwIDogaDtcbiAgfVxuICByZXR1cm4gbmV3IEhzbChoLCBzLCBsLCBvLm9wYWNpdHkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaHNsKGgsIHMsIGwsIG9wYWNpdHkpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyBoc2xDb252ZXJ0KGgpIDogbmV3IEhzbChoLCBzLCBsLCBvcGFjaXR5ID09IG51bGwgPyAxIDogb3BhY2l0eSk7XG59XG5cbmZ1bmN0aW9uIEhzbChoLCBzLCBsLCBvcGFjaXR5KSB7XG4gIHRoaXMuaCA9ICtoO1xuICB0aGlzLnMgPSArcztcbiAgdGhpcy5sID0gK2w7XG4gIHRoaXMub3BhY2l0eSA9ICtvcGFjaXR5O1xufVxuXG5kZWZpbmUoSHNsLCBoc2wsIGV4dGVuZChDb2xvciwge1xuICBicmlnaHRlcihrKSB7XG4gICAgayA9IGsgPT0gbnVsbCA/IGJyaWdodGVyIDogTWF0aC5wb3coYnJpZ2h0ZXIsIGspO1xuICAgIHJldHVybiBuZXcgSHNsKHRoaXMuaCwgdGhpcy5zLCB0aGlzLmwgKiBrLCB0aGlzLm9wYWNpdHkpO1xuICB9LFxuICBkYXJrZXIoaykge1xuICAgIGsgPSBrID09IG51bGwgPyBkYXJrZXIgOiBNYXRoLnBvdyhkYXJrZXIsIGspO1xuICAgIHJldHVybiBuZXcgSHNsKHRoaXMuaCwgdGhpcy5zLCB0aGlzLmwgKiBrLCB0aGlzLm9wYWNpdHkpO1xuICB9LFxuICByZ2IoKSB7XG4gICAgdmFyIGggPSB0aGlzLmggJSAzNjAgKyAodGhpcy5oIDwgMCkgKiAzNjAsXG4gICAgICAgIHMgPSBpc05hTihoKSB8fCBpc05hTih0aGlzLnMpID8gMCA6IHRoaXMucyxcbiAgICAgICAgbCA9IHRoaXMubCxcbiAgICAgICAgbTIgPSBsICsgKGwgPCAwLjUgPyBsIDogMSAtIGwpICogcyxcbiAgICAgICAgbTEgPSAyICogbCAtIG0yO1xuICAgIHJldHVybiBuZXcgUmdiKFxuICAgICAgaHNsMnJnYihoID49IDI0MCA/IGggLSAyNDAgOiBoICsgMTIwLCBtMSwgbTIpLFxuICAgICAgaHNsMnJnYihoLCBtMSwgbTIpLFxuICAgICAgaHNsMnJnYihoIDwgMTIwID8gaCArIDI0MCA6IGggLSAxMjAsIG0xLCBtMiksXG4gICAgICB0aGlzLm9wYWNpdHlcbiAgICApO1xuICB9LFxuICBjbGFtcCgpIHtcbiAgICByZXR1cm4gbmV3IEhzbChjbGFtcGgodGhpcy5oKSwgY2xhbXB0KHRoaXMucyksIGNsYW1wdCh0aGlzLmwpLCBjbGFtcGEodGhpcy5vcGFjaXR5KSk7XG4gIH0sXG4gIGRpc3BsYXlhYmxlKCkge1xuICAgIHJldHVybiAoMCA8PSB0aGlzLnMgJiYgdGhpcy5zIDw9IDEgfHwgaXNOYU4odGhpcy5zKSlcbiAgICAgICAgJiYgKDAgPD0gdGhpcy5sICYmIHRoaXMubCA8PSAxKVxuICAgICAgICAmJiAoMCA8PSB0aGlzLm9wYWNpdHkgJiYgdGhpcy5vcGFjaXR5IDw9IDEpO1xuICB9LFxuICBmb3JtYXRIc2woKSB7XG4gICAgY29uc3QgYSA9IGNsYW1wYSh0aGlzLm9wYWNpdHkpO1xuICAgIHJldHVybiBgJHthID09PSAxID8gXCJoc2woXCIgOiBcImhzbGEoXCJ9JHtjbGFtcGgodGhpcy5oKX0sICR7Y2xhbXB0KHRoaXMucykgKiAxMDB9JSwgJHtjbGFtcHQodGhpcy5sKSAqIDEwMH0lJHthID09PSAxID8gXCIpXCIgOiBgLCAke2F9KWB9YDtcbiAgfVxufSkpO1xuXG5mdW5jdGlvbiBjbGFtcGgodmFsdWUpIHtcbiAgdmFsdWUgPSAodmFsdWUgfHwgMCkgJSAzNjA7XG4gIHJldHVybiB2YWx1ZSA8IDAgPyB2YWx1ZSArIDM2MCA6IHZhbHVlO1xufVxuXG5mdW5jdGlvbiBjbGFtcHQodmFsdWUpIHtcbiAgcmV0dXJuIE1hdGgubWF4KDAsIE1hdGgubWluKDEsIHZhbHVlIHx8IDApKTtcbn1cblxuLyogRnJvbSBGdkQgMTMuMzcsIENTUyBDb2xvciBNb2R1bGUgTGV2ZWwgMyAqL1xuZnVuY3Rpb24gaHNsMnJnYihoLCBtMSwgbTIpIHtcbiAgcmV0dXJuIChoIDwgNjAgPyBtMSArIChtMiAtIG0xKSAqIGggLyA2MFxuICAgICAgOiBoIDwgMTgwID8gbTJcbiAgICAgIDogaCA8IDI0MCA/IG0xICsgKG0yIC0gbTEpICogKDI0MCAtIGgpIC8gNjBcbiAgICAgIDogbTEpICogMjU1O1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGJhc2lzKHQxLCB2MCwgdjEsIHYyLCB2Mykge1xuICB2YXIgdDIgPSB0MSAqIHQxLCB0MyA9IHQyICogdDE7XG4gIHJldHVybiAoKDEgLSAzICogdDEgKyAzICogdDIgLSB0MykgKiB2MFxuICAgICAgKyAoNCAtIDYgKiB0MiArIDMgKiB0MykgKiB2MVxuICAgICAgKyAoMSArIDMgKiB0MSArIDMgKiB0MiAtIDMgKiB0MykgKiB2MlxuICAgICAgKyB0MyAqIHYzKSAvIDY7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlcykge1xuICB2YXIgbiA9IHZhbHVlcy5sZW5ndGggLSAxO1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHZhciBpID0gdCA8PSAwID8gKHQgPSAwKSA6IHQgPj0gMSA/ICh0ID0gMSwgbiAtIDEpIDogTWF0aC5mbG9vcih0ICogbiksXG4gICAgICAgIHYxID0gdmFsdWVzW2ldLFxuICAgICAgICB2MiA9IHZhbHVlc1tpICsgMV0sXG4gICAgICAgIHYwID0gaSA+IDAgPyB2YWx1ZXNbaSAtIDFdIDogMiAqIHYxIC0gdjIsXG4gICAgICAgIHYzID0gaSA8IG4gLSAxID8gdmFsdWVzW2kgKyAyXSA6IDIgKiB2MiAtIHYxO1xuICAgIHJldHVybiBiYXNpcygodCAtIGkgLyBuKSAqIG4sIHYwLCB2MSwgdjIsIHYzKTtcbiAgfTtcbn1cbiIsImltcG9ydCB7YmFzaXN9IGZyb20gXCIuL2Jhc2lzLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlcykge1xuICB2YXIgbiA9IHZhbHVlcy5sZW5ndGg7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgdmFyIGkgPSBNYXRoLmZsb29yKCgodCAlPSAxKSA8IDAgPyArK3QgOiB0KSAqIG4pLFxuICAgICAgICB2MCA9IHZhbHVlc1soaSArIG4gLSAxKSAlIG5dLFxuICAgICAgICB2MSA9IHZhbHVlc1tpICUgbl0sXG4gICAgICAgIHYyID0gdmFsdWVzWyhpICsgMSkgJSBuXSxcbiAgICAgICAgdjMgPSB2YWx1ZXNbKGkgKyAyKSAlIG5dO1xuICAgIHJldHVybiBiYXNpcygodCAtIGkgLyBuKSAqIG4sIHYwLCB2MSwgdjIsIHYzKTtcbiAgfTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IHggPT4gKCkgPT4geDtcbiIsImltcG9ydCBjb25zdGFudCBmcm9tIFwiLi9jb25zdGFudC5qc1wiO1xuXG5mdW5jdGlvbiBsaW5lYXIoYSwgZCkge1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHJldHVybiBhICsgdCAqIGQ7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGV4cG9uZW50aWFsKGEsIGIsIHkpIHtcbiAgcmV0dXJuIGEgPSBNYXRoLnBvdyhhLCB5KSwgYiA9IE1hdGgucG93KGIsIHkpIC0gYSwgeSA9IDEgLyB5LCBmdW5jdGlvbih0KSB7XG4gICAgcmV0dXJuIE1hdGgucG93KGEgKyB0ICogYiwgeSk7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBodWUoYSwgYikge1xuICB2YXIgZCA9IGIgLSBhO1xuICByZXR1cm4gZCA/IGxpbmVhcihhLCBkID4gMTgwIHx8IGQgPCAtMTgwID8gZCAtIDM2MCAqIE1hdGgucm91bmQoZCAvIDM2MCkgOiBkKSA6IGNvbnN0YW50KGlzTmFOKGEpID8gYiA6IGEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2FtbWEoeSkge1xuICByZXR1cm4gKHkgPSAreSkgPT09IDEgPyBub2dhbW1hIDogZnVuY3Rpb24oYSwgYikge1xuICAgIHJldHVybiBiIC0gYSA/IGV4cG9uZW50aWFsKGEsIGIsIHkpIDogY29uc3RhbnQoaXNOYU4oYSkgPyBiIDogYSk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG5vZ2FtbWEoYSwgYikge1xuICB2YXIgZCA9IGIgLSBhO1xuICByZXR1cm4gZCA/IGxpbmVhcihhLCBkKSA6IGNvbnN0YW50KGlzTmFOKGEpID8gYiA6IGEpO1xufVxuIiwiaW1wb3J0IHtyZ2IgYXMgY29sb3JSZ2J9IGZyb20gXCJkMy1jb2xvclwiO1xuaW1wb3J0IGJhc2lzIGZyb20gXCIuL2Jhc2lzLmpzXCI7XG5pbXBvcnQgYmFzaXNDbG9zZWQgZnJvbSBcIi4vYmFzaXNDbG9zZWQuanNcIjtcbmltcG9ydCBub2dhbW1hLCB7Z2FtbWF9IGZyb20gXCIuL2NvbG9yLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiByZ2JHYW1tYSh5KSB7XG4gIHZhciBjb2xvciA9IGdhbW1hKHkpO1xuXG4gIGZ1bmN0aW9uIHJnYihzdGFydCwgZW5kKSB7XG4gICAgdmFyIHIgPSBjb2xvcigoc3RhcnQgPSBjb2xvclJnYihzdGFydCkpLnIsIChlbmQgPSBjb2xvclJnYihlbmQpKS5yKSxcbiAgICAgICAgZyA9IGNvbG9yKHN0YXJ0LmcsIGVuZC5nKSxcbiAgICAgICAgYiA9IGNvbG9yKHN0YXJ0LmIsIGVuZC5iKSxcbiAgICAgICAgb3BhY2l0eSA9IG5vZ2FtbWEoc3RhcnQub3BhY2l0eSwgZW5kLm9wYWNpdHkpO1xuICAgIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgICBzdGFydC5yID0gcih0KTtcbiAgICAgIHN0YXJ0LmcgPSBnKHQpO1xuICAgICAgc3RhcnQuYiA9IGIodCk7XG4gICAgICBzdGFydC5vcGFjaXR5ID0gb3BhY2l0eSh0KTtcbiAgICAgIHJldHVybiBzdGFydCArIFwiXCI7XG4gICAgfTtcbiAgfVxuXG4gIHJnYi5nYW1tYSA9IHJnYkdhbW1hO1xuXG4gIHJldHVybiByZ2I7XG59KSgxKTtcblxuZnVuY3Rpb24gcmdiU3BsaW5lKHNwbGluZSkge1xuICByZXR1cm4gZnVuY3Rpb24oY29sb3JzKSB7XG4gICAgdmFyIG4gPSBjb2xvcnMubGVuZ3RoLFxuICAgICAgICByID0gbmV3IEFycmF5KG4pLFxuICAgICAgICBnID0gbmV3IEFycmF5KG4pLFxuICAgICAgICBiID0gbmV3IEFycmF5KG4pLFxuICAgICAgICBpLCBjb2xvcjtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBjb2xvciA9IGNvbG9yUmdiKGNvbG9yc1tpXSk7XG4gICAgICByW2ldID0gY29sb3IuciB8fCAwO1xuICAgICAgZ1tpXSA9IGNvbG9yLmcgfHwgMDtcbiAgICAgIGJbaV0gPSBjb2xvci5iIHx8IDA7XG4gICAgfVxuICAgIHIgPSBzcGxpbmUocik7XG4gICAgZyA9IHNwbGluZShnKTtcbiAgICBiID0gc3BsaW5lKGIpO1xuICAgIGNvbG9yLm9wYWNpdHkgPSAxO1xuICAgIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgICBjb2xvci5yID0gcih0KTtcbiAgICAgIGNvbG9yLmcgPSBnKHQpO1xuICAgICAgY29sb3IuYiA9IGIodCk7XG4gICAgICByZXR1cm4gY29sb3IgKyBcIlwiO1xuICAgIH07XG4gIH07XG59XG5cbmV4cG9ydCB2YXIgcmdiQmFzaXMgPSByZ2JTcGxpbmUoYmFzaXMpO1xuZXhwb3J0IHZhciByZ2JCYXNpc0Nsb3NlZCA9IHJnYlNwbGluZShiYXNpc0Nsb3NlZCk7XG4iLCJpbXBvcnQgbnVtYmVyIGZyb20gXCIuL251bWJlci5qc1wiO1xuXG52YXIgcmVBID0gL1stK10/KD86XFxkK1xcLj9cXGQqfFxcLj9cXGQrKSg/OltlRV1bLStdP1xcZCspPy9nLFxuICAgIHJlQiA9IG5ldyBSZWdFeHAocmVBLnNvdXJjZSwgXCJnXCIpO1xuXG5mdW5jdGlvbiB6ZXJvKGIpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBiO1xuICB9O1xufVxuXG5mdW5jdGlvbiBvbmUoYikge1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHJldHVybiBiKHQpICsgXCJcIjtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYSwgYikge1xuICB2YXIgYmkgPSByZUEubGFzdEluZGV4ID0gcmVCLmxhc3RJbmRleCA9IDAsIC8vIHNjYW4gaW5kZXggZm9yIG5leHQgbnVtYmVyIGluIGJcbiAgICAgIGFtLCAvLyBjdXJyZW50IG1hdGNoIGluIGFcbiAgICAgIGJtLCAvLyBjdXJyZW50IG1hdGNoIGluIGJcbiAgICAgIGJzLCAvLyBzdHJpbmcgcHJlY2VkaW5nIGN1cnJlbnQgbnVtYmVyIGluIGIsIGlmIGFueVxuICAgICAgaSA9IC0xLCAvLyBpbmRleCBpbiBzXG4gICAgICBzID0gW10sIC8vIHN0cmluZyBjb25zdGFudHMgYW5kIHBsYWNlaG9sZGVyc1xuICAgICAgcSA9IFtdOyAvLyBudW1iZXIgaW50ZXJwb2xhdG9yc1xuXG4gIC8vIENvZXJjZSBpbnB1dHMgdG8gc3RyaW5ncy5cbiAgYSA9IGEgKyBcIlwiLCBiID0gYiArIFwiXCI7XG5cbiAgLy8gSW50ZXJwb2xhdGUgcGFpcnMgb2YgbnVtYmVycyBpbiBhICYgYi5cbiAgd2hpbGUgKChhbSA9IHJlQS5leGVjKGEpKVxuICAgICAgJiYgKGJtID0gcmVCLmV4ZWMoYikpKSB7XG4gICAgaWYgKChicyA9IGJtLmluZGV4KSA+IGJpKSB7IC8vIGEgc3RyaW5nIHByZWNlZGVzIHRoZSBuZXh0IG51bWJlciBpbiBiXG4gICAgICBicyA9IGIuc2xpY2UoYmksIGJzKTtcbiAgICAgIGlmIChzW2ldKSBzW2ldICs9IGJzOyAvLyBjb2FsZXNjZSB3aXRoIHByZXZpb3VzIHN0cmluZ1xuICAgICAgZWxzZSBzWysraV0gPSBicztcbiAgICB9XG4gICAgaWYgKChhbSA9IGFtWzBdKSA9PT0gKGJtID0gYm1bMF0pKSB7IC8vIG51bWJlcnMgaW4gYSAmIGIgbWF0Y2hcbiAgICAgIGlmIChzW2ldKSBzW2ldICs9IGJtOyAvLyBjb2FsZXNjZSB3aXRoIHByZXZpb3VzIHN0cmluZ1xuICAgICAgZWxzZSBzWysraV0gPSBibTtcbiAgICB9IGVsc2UgeyAvLyBpbnRlcnBvbGF0ZSBub24tbWF0Y2hpbmcgbnVtYmVyc1xuICAgICAgc1srK2ldID0gbnVsbDtcbiAgICAgIHEucHVzaCh7aTogaSwgeDogbnVtYmVyKGFtLCBibSl9KTtcbiAgICB9XG4gICAgYmkgPSByZUIubGFzdEluZGV4O1xuICB9XG5cbiAgLy8gQWRkIHJlbWFpbnMgb2YgYi5cbiAgaWYgKGJpIDwgYi5sZW5ndGgpIHtcbiAgICBicyA9IGIuc2xpY2UoYmkpO1xuICAgIGlmIChzW2ldKSBzW2ldICs9IGJzOyAvLyBjb2FsZXNjZSB3aXRoIHByZXZpb3VzIHN0cmluZ1xuICAgIGVsc2Ugc1srK2ldID0gYnM7XG4gIH1cblxuICAvLyBTcGVjaWFsIG9wdGltaXphdGlvbiBmb3Igb25seSBhIHNpbmdsZSBtYXRjaC5cbiAgLy8gT3RoZXJ3aXNlLCBpbnRlcnBvbGF0ZSBlYWNoIG9mIHRoZSBudW1iZXJzIGFuZCByZWpvaW4gdGhlIHN0cmluZy5cbiAgcmV0dXJuIHMubGVuZ3RoIDwgMiA/IChxWzBdXG4gICAgICA/IG9uZShxWzBdLngpXG4gICAgICA6IHplcm8oYikpXG4gICAgICA6IChiID0gcS5sZW5ndGgsIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbzsgaSA8IGI7ICsraSkgc1sobyA9IHFbaV0pLmldID0gby54KHQpO1xuICAgICAgICAgIHJldHVybiBzLmpvaW4oXCJcIik7XG4gICAgICAgIH0pO1xufVxuIiwiaW1wb3J0IHtjb2xvcn0gZnJvbSBcImQzLWNvbG9yXCI7XG5pbXBvcnQge2ludGVycG9sYXRlTnVtYmVyLCBpbnRlcnBvbGF0ZVJnYiwgaW50ZXJwb2xhdGVTdHJpbmd9IGZyb20gXCJkMy1pbnRlcnBvbGF0ZVwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhLCBiKSB7XG4gIHZhciBjO1xuICByZXR1cm4gKHR5cGVvZiBiID09PSBcIm51bWJlclwiID8gaW50ZXJwb2xhdGVOdW1iZXJcbiAgICAgIDogYiBpbnN0YW5jZW9mIGNvbG9yID8gaW50ZXJwb2xhdGVSZ2JcbiAgICAgIDogKGMgPSBjb2xvcihiKSkgPyAoYiA9IGMsIGludGVycG9sYXRlUmdiKVxuICAgICAgOiBpbnRlcnBvbGF0ZVN0cmluZykoYSwgYik7XG59XG4iLCJpbXBvcnQge2ludGVycG9sYXRlVHJhbnNmb3JtU3ZnIGFzIGludGVycG9sYXRlVHJhbnNmb3JtfSBmcm9tIFwiZDMtaW50ZXJwb2xhdGVcIjtcbmltcG9ydCB7bmFtZXNwYWNlfSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQge3R3ZWVuVmFsdWV9IGZyb20gXCIuL3R3ZWVuLmpzXCI7XG5pbXBvcnQgaW50ZXJwb2xhdGUgZnJvbSBcIi4vaW50ZXJwb2xhdGUuanNcIjtcblxuZnVuY3Rpb24gYXR0clJlbW92ZShuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0clJlbW92ZU5TKGZ1bGxuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJDb25zdGFudChuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUxKSB7XG4gIHZhciBzdHJpbmcwMCxcbiAgICAgIHN0cmluZzEgPSB2YWx1ZTEgKyBcIlwiLFxuICAgICAgaW50ZXJwb2xhdGUwO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0cmluZzAgPSB0aGlzLmdldEF0dHJpYnV0ZShuYW1lKTtcbiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGxcbiAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgdmFsdWUxKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckNvbnN0YW50TlMoZnVsbG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZTEpIHtcbiAgdmFyIHN0cmluZzAwLFxuICAgICAgc3RyaW5nMSA9IHZhbHVlMSArIFwiXCIsXG4gICAgICBpbnRlcnBvbGF0ZTA7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RyaW5nMCA9IHRoaXMuZ2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTtcbiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGxcbiAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgdmFsdWUxKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckZ1bmN0aW9uKG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZSkge1xuICB2YXIgc3RyaW5nMDAsXG4gICAgICBzdHJpbmcxMCxcbiAgICAgIGludGVycG9sYXRlMDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdHJpbmcwLCB2YWx1ZTEgPSB2YWx1ZSh0aGlzKSwgc3RyaW5nMTtcbiAgICBpZiAodmFsdWUxID09IG51bGwpIHJldHVybiB2b2lkIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgIHN0cmluZzAgPSB0aGlzLmdldEF0dHJpYnV0ZShuYW1lKTtcbiAgICBzdHJpbmcxID0gdmFsdWUxICsgXCJcIjtcbiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGxcbiAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCAmJiBzdHJpbmcxID09PSBzdHJpbmcxMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IChzdHJpbmcxMCA9IHN0cmluZzEsIGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgdmFsdWUxKSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJGdW5jdGlvbk5TKGZ1bGxuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUpIHtcbiAgdmFyIHN0cmluZzAwLFxuICAgICAgc3RyaW5nMTAsXG4gICAgICBpbnRlcnBvbGF0ZTA7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RyaW5nMCwgdmFsdWUxID0gdmFsdWUodGhpcyksIHN0cmluZzE7XG4gICAgaWYgKHZhbHVlMSA9PSBudWxsKSByZXR1cm4gdm9pZCB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7XG4gICAgc3RyaW5nMCA9IHRoaXMuZ2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTtcbiAgICBzdHJpbmcxID0gdmFsdWUxICsgXCJcIjtcbiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGxcbiAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCAmJiBzdHJpbmcxID09PSBzdHJpbmcxMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IChzdHJpbmcxMCA9IHN0cmluZzEsIGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgdmFsdWUxKSk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHZhciBmdWxsbmFtZSA9IG5hbWVzcGFjZShuYW1lKSwgaSA9IGZ1bGxuYW1lID09PSBcInRyYW5zZm9ybVwiID8gaW50ZXJwb2xhdGVUcmFuc2Zvcm0gOiBpbnRlcnBvbGF0ZTtcbiAgcmV0dXJuIHRoaXMuYXR0clR3ZWVuKG5hbWUsIHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJGdW5jdGlvbk5TIDogYXR0ckZ1bmN0aW9uKShmdWxsbmFtZSwgaSwgdHdlZW5WYWx1ZSh0aGlzLCBcImF0dHIuXCIgKyBuYW1lLCB2YWx1ZSkpXG4gICAgICA6IHZhbHVlID09IG51bGwgPyAoZnVsbG5hbWUubG9jYWwgPyBhdHRyUmVtb3ZlTlMgOiBhdHRyUmVtb3ZlKShmdWxsbmFtZSlcbiAgICAgIDogKGZ1bGxuYW1lLmxvY2FsID8gYXR0ckNvbnN0YW50TlMgOiBhdHRyQ29uc3RhbnQpKGZ1bGxuYW1lLCBpLCB2YWx1ZSkpO1xufVxuIiwiaW1wb3J0IHtuYW1lc3BhY2V9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcblxuZnVuY3Rpb24gYXR0ckludGVycG9sYXRlKG5hbWUsIGkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCBpLmNhbGwodGhpcywgdCkpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRySW50ZXJwb2xhdGVOUyhmdWxsbmFtZSwgaSkge1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHRoaXMuc2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsLCBpLmNhbGwodGhpcywgdCkpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyVHdlZW5OUyhmdWxsbmFtZSwgdmFsdWUpIHtcbiAgdmFyIHQwLCBpMDtcbiAgZnVuY3Rpb24gdHdlZW4oKSB7XG4gICAgdmFyIGkgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmIChpICE9PSBpMCkgdDAgPSAoaTAgPSBpKSAmJiBhdHRySW50ZXJwb2xhdGVOUyhmdWxsbmFtZSwgaSk7XG4gICAgcmV0dXJuIHQwO1xuICB9XG4gIHR3ZWVuLl92YWx1ZSA9IHZhbHVlO1xuICByZXR1cm4gdHdlZW47XG59XG5cbmZ1bmN0aW9uIGF0dHJUd2VlbihuYW1lLCB2YWx1ZSkge1xuICB2YXIgdDAsIGkwO1xuICBmdW5jdGlvbiB0d2VlbigpIHtcbiAgICB2YXIgaSA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKGkgIT09IGkwKSB0MCA9IChpMCA9IGkpICYmIGF0dHJJbnRlcnBvbGF0ZShuYW1lLCBpKTtcbiAgICByZXR1cm4gdDA7XG4gIH1cbiAgdHdlZW4uX3ZhbHVlID0gdmFsdWU7XG4gIHJldHVybiB0d2Vlbjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgdmFyIGtleSA9IFwiYXR0ci5cIiArIG5hbWU7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgcmV0dXJuIChrZXkgPSB0aGlzLnR3ZWVuKGtleSkpICYmIGtleS5fdmFsdWU7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gdGhpcy50d2VlbihrZXksIG51bGwpO1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcjtcbiAgdmFyIGZ1bGxuYW1lID0gbmFtZXNwYWNlKG5hbWUpO1xuICByZXR1cm4gdGhpcy50d2VlbihrZXksIChmdWxsbmFtZS5sb2NhbCA/IGF0dHJUd2Vlbk5TIDogYXR0clR3ZWVuKShmdWxsbmFtZSwgdmFsdWUpKTtcbn1cbiIsImltcG9ydCB7Z2V0LCBpbml0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5mdW5jdGlvbiBkZWxheUZ1bmN0aW9uKGlkLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgaW5pdCh0aGlzLCBpZCkuZGVsYXkgPSArdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZGVsYXlDb25zdGFudChpZCwgdmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID0gK3ZhbHVlLCBmdW5jdGlvbigpIHtcbiAgICBpbml0KHRoaXMsIGlkKS5kZWxheSA9IHZhbHVlO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICB2YXIgaWQgPSB0aGlzLl9pZDtcblxuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgICAgPyB0aGlzLmVhY2goKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgPyBkZWxheUZ1bmN0aW9uXG4gICAgICAgICAgOiBkZWxheUNvbnN0YW50KShpZCwgdmFsdWUpKVxuICAgICAgOiBnZXQodGhpcy5ub2RlKCksIGlkKS5kZWxheTtcbn1cbiIsImltcG9ydCB7Z2V0LCBzZXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmZ1bmN0aW9uIGR1cmF0aW9uRnVuY3Rpb24oaWQsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICBzZXQodGhpcywgaWQpLmR1cmF0aW9uID0gK3ZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGR1cmF0aW9uQ29uc3RhbnQoaWQsIHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9ICt2YWx1ZSwgZnVuY3Rpb24oKSB7XG4gICAgc2V0KHRoaXMsIGlkKS5kdXJhdGlvbiA9IHZhbHVlO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICB2YXIgaWQgPSB0aGlzLl9pZDtcblxuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgICAgPyB0aGlzLmVhY2goKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgPyBkdXJhdGlvbkZ1bmN0aW9uXG4gICAgICAgICAgOiBkdXJhdGlvbkNvbnN0YW50KShpZCwgdmFsdWUpKVxuICAgICAgOiBnZXQodGhpcy5ub2RlKCksIGlkKS5kdXJhdGlvbjtcbn1cbiIsImltcG9ydCB7Z2V0LCBzZXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmZ1bmN0aW9uIGVhc2VDb25zdGFudChpZCwgdmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3I7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICBzZXQodGhpcywgaWQpLmVhc2UgPSB2YWx1ZTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgdmFyIGlkID0gdGhpcy5faWQ7XG5cbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgID8gdGhpcy5lYWNoKGVhc2VDb25zdGFudChpZCwgdmFsdWUpKVxuICAgICAgOiBnZXQodGhpcy5ub2RlKCksIGlkKS5lYXNlO1xufVxuIiwiaW1wb3J0IHtzZXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmZ1bmN0aW9uIGVhc2VWYXJ5aW5nKGlkLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmICh0eXBlb2YgdiAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3I7XG4gICAgc2V0KHRoaXMsIGlkKS5lYXNlID0gdjtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3I7XG4gIHJldHVybiB0aGlzLmVhY2goZWFzZVZhcnlpbmcodGhpcy5faWQsIHZhbHVlKSk7XG59XG4iLCJpbXBvcnQge21hdGNoZXJ9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCB7VHJhbnNpdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obWF0Y2gpIHtcbiAgaWYgKHR5cGVvZiBtYXRjaCAhPT0gXCJmdW5jdGlvblwiKSBtYXRjaCA9IG1hdGNoZXIobWF0Y2gpO1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAgPSBzdWJncm91cHNbal0gPSBbXSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmICgobm9kZSA9IGdyb3VwW2ldKSAmJiBtYXRjaC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSkge1xuICAgICAgICBzdWJncm91cC5wdXNoKG5vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgVHJhbnNpdGlvbihzdWJncm91cHMsIHRoaXMuX3BhcmVudHMsIHRoaXMuX25hbWUsIHRoaXMuX2lkKTtcbn1cbiIsImltcG9ydCB7VHJhbnNpdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odHJhbnNpdGlvbikge1xuICBpZiAodHJhbnNpdGlvbi5faWQgIT09IHRoaXMuX2lkKSB0aHJvdyBuZXcgRXJyb3I7XG5cbiAgZm9yICh2YXIgZ3JvdXBzMCA9IHRoaXMuX2dyb3VwcywgZ3JvdXBzMSA9IHRyYW5zaXRpb24uX2dyb3VwcywgbTAgPSBncm91cHMwLmxlbmd0aCwgbTEgPSBncm91cHMxLmxlbmd0aCwgbSA9IE1hdGgubWluKG0wLCBtMSksIG1lcmdlcyA9IG5ldyBBcnJheShtMCksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAwID0gZ3JvdXBzMFtqXSwgZ3JvdXAxID0gZ3JvdXBzMVtqXSwgbiA9IGdyb3VwMC5sZW5ndGgsIG1lcmdlID0gbWVyZ2VzW2pdID0gbmV3IEFycmF5KG4pLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cDBbaV0gfHwgZ3JvdXAxW2ldKSB7XG4gICAgICAgIG1lcmdlW2ldID0gbm9kZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmb3IgKDsgaiA8IG0wOyArK2opIHtcbiAgICBtZXJnZXNbal0gPSBncm91cHMwW2pdO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKG1lcmdlcywgdGhpcy5fcGFyZW50cywgdGhpcy5fbmFtZSwgdGhpcy5faWQpO1xufVxuIiwiaW1wb3J0IHtnZXQsIHNldCwgaW5pdH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZnVuY3Rpb24gc3RhcnQobmFtZSkge1xuICByZXR1cm4gKG5hbWUgKyBcIlwiKS50cmltKCkuc3BsaXQoL158XFxzKy8pLmV2ZXJ5KGZ1bmN0aW9uKHQpIHtcbiAgICB2YXIgaSA9IHQuaW5kZXhPZihcIi5cIik7XG4gICAgaWYgKGkgPj0gMCkgdCA9IHQuc2xpY2UoMCwgaSk7XG4gICAgcmV0dXJuICF0IHx8IHQgPT09IFwic3RhcnRcIjtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG9uRnVuY3Rpb24oaWQsIG5hbWUsIGxpc3RlbmVyKSB7XG4gIHZhciBvbjAsIG9uMSwgc2l0ID0gc3RhcnQobmFtZSkgPyBpbml0IDogc2V0O1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNjaGVkdWxlID0gc2l0KHRoaXMsIGlkKSxcbiAgICAgICAgb24gPSBzY2hlZHVsZS5vbjtcblxuICAgIC8vIElmIHRoaXMgbm9kZSBzaGFyZWQgYSBkaXNwYXRjaCB3aXRoIHRoZSBwcmV2aW91cyBub2RlLFxuICAgIC8vIGp1c3QgYXNzaWduIHRoZSB1cGRhdGVkIHNoYXJlZCBkaXNwYXRjaCBhbmQgd2XigJlyZSBkb25lIVxuICAgIC8vIE90aGVyd2lzZSwgY29weS1vbi13cml0ZS5cbiAgICBpZiAob24gIT09IG9uMCkgKG9uMSA9IChvbjAgPSBvbikuY29weSgpKS5vbihuYW1lLCBsaXN0ZW5lcik7XG5cbiAgICBzY2hlZHVsZS5vbiA9IG9uMTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgbGlzdGVuZXIpIHtcbiAgdmFyIGlkID0gdGhpcy5faWQ7XG5cbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPCAyXG4gICAgICA/IGdldCh0aGlzLm5vZGUoKSwgaWQpLm9uLm9uKG5hbWUpXG4gICAgICA6IHRoaXMuZWFjaChvbkZ1bmN0aW9uKGlkLCBuYW1lLCBsaXN0ZW5lcikpO1xufVxuIiwiZnVuY3Rpb24gcmVtb3ZlRnVuY3Rpb24oaWQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7XG4gICAgZm9yICh2YXIgaSBpbiB0aGlzLl9fdHJhbnNpdGlvbikgaWYgKCtpICE9PSBpZCkgcmV0dXJuO1xuICAgIGlmIChwYXJlbnQpIHBhcmVudC5yZW1vdmVDaGlsZCh0aGlzKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLm9uKFwiZW5kLnJlbW92ZVwiLCByZW1vdmVGdW5jdGlvbih0aGlzLl9pZCkpO1xufVxuIiwiaW1wb3J0IHtzZWxlY3Rvcn0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IHtUcmFuc2l0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuaW1wb3J0IHNjaGVkdWxlLCB7Z2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3QpIHtcbiAgdmFyIG5hbWUgPSB0aGlzLl9uYW1lLFxuICAgICAgaWQgPSB0aGlzLl9pZDtcblxuICBpZiAodHlwZW9mIHNlbGVjdCAhPT0gXCJmdW5jdGlvblwiKSBzZWxlY3QgPSBzZWxlY3RvcihzZWxlY3QpO1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAgPSBzdWJncm91cHNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIHN1Ym5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgKHN1Ym5vZGUgPSBzZWxlY3QuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkpKSB7XG4gICAgICAgIGlmIChcIl9fZGF0YV9fXCIgaW4gbm9kZSkgc3Vibm9kZS5fX2RhdGFfXyA9IG5vZGUuX19kYXRhX187XG4gICAgICAgIHN1Ymdyb3VwW2ldID0gc3Vibm9kZTtcbiAgICAgICAgc2NoZWR1bGUoc3ViZ3JvdXBbaV0sIG5hbWUsIGlkLCBpLCBzdWJncm91cCwgZ2V0KG5vZGUsIGlkKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKHN1Ymdyb3VwcywgdGhpcy5fcGFyZW50cywgbmFtZSwgaWQpO1xufVxuIiwiaW1wb3J0IHtzZWxlY3RvckFsbH0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IHtUcmFuc2l0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuaW1wb3J0IHNjaGVkdWxlLCB7Z2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3QpIHtcbiAgdmFyIG5hbWUgPSB0aGlzLl9uYW1lLFxuICAgICAgaWQgPSB0aGlzLl9pZDtcblxuICBpZiAodHlwZW9mIHNlbGVjdCAhPT0gXCJmdW5jdGlvblwiKSBzZWxlY3QgPSBzZWxlY3RvckFsbChzZWxlY3QpO1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IFtdLCBwYXJlbnRzID0gW10sIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICAgIGZvciAodmFyIGNoaWxkcmVuID0gc2VsZWN0LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApLCBjaGlsZCwgaW5oZXJpdCA9IGdldChub2RlLCBpZCksIGsgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBrIDwgbDsgKytrKSB7XG4gICAgICAgICAgaWYgKGNoaWxkID0gY2hpbGRyZW5ba10pIHtcbiAgICAgICAgICAgIHNjaGVkdWxlKGNoaWxkLCBuYW1lLCBpZCwgaywgY2hpbGRyZW4sIGluaGVyaXQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzdWJncm91cHMucHVzaChjaGlsZHJlbik7XG4gICAgICAgIHBhcmVudHMucHVzaChub2RlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFRyYW5zaXRpb24oc3ViZ3JvdXBzLCBwYXJlbnRzLCBuYW1lLCBpZCk7XG59XG4iLCJpbXBvcnQge3NlbGVjdGlvbn0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuXG52YXIgU2VsZWN0aW9uID0gc2VsZWN0aW9uLnByb3RvdHlwZS5jb25zdHJ1Y3RvcjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKHRoaXMuX2dyb3VwcywgdGhpcy5fcGFyZW50cyk7XG59XG4iLCJpbXBvcnQge2ludGVycG9sYXRlVHJhbnNmb3JtQ3NzIGFzIGludGVycG9sYXRlVHJhbnNmb3JtfSBmcm9tIFwiZDMtaW50ZXJwb2xhdGVcIjtcbmltcG9ydCB7c3R5bGV9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCB7c2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuaW1wb3J0IHt0d2VlblZhbHVlfSBmcm9tIFwiLi90d2Vlbi5qc1wiO1xuaW1wb3J0IGludGVycG9sYXRlIGZyb20gXCIuL2ludGVycG9sYXRlLmpzXCI7XG5cbmZ1bmN0aW9uIHN0eWxlTnVsbChuYW1lLCBpbnRlcnBvbGF0ZSkge1xuICB2YXIgc3RyaW5nMDAsXG4gICAgICBzdHJpbmcxMCxcbiAgICAgIGludGVycG9sYXRlMDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdHJpbmcwID0gc3R5bGUodGhpcywgbmFtZSksXG4gICAgICAgIHN0cmluZzEgPSAodGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKSwgc3R5bGUodGhpcywgbmFtZSkpO1xuICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbFxuICAgICAgICA6IHN0cmluZzAgPT09IHN0cmluZzAwICYmIHN0cmluZzEgPT09IHN0cmluZzEwID8gaW50ZXJwb2xhdGUwXG4gICAgICAgIDogaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCBzdHJpbmcxMCA9IHN0cmluZzEpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBzdHlsZVJlbW92ZShuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KG5hbWUpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBzdHlsZUNvbnN0YW50KG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZTEpIHtcbiAgdmFyIHN0cmluZzAwLFxuICAgICAgc3RyaW5nMSA9IHZhbHVlMSArIFwiXCIsXG4gICAgICBpbnRlcnBvbGF0ZTA7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RyaW5nMCA9IHN0eWxlKHRoaXMsIG5hbWUpO1xuICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbFxuICAgICAgICA6IHN0cmluZzAgPT09IHN0cmluZzAwID8gaW50ZXJwb2xhdGUwXG4gICAgICAgIDogaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCB2YWx1ZTEpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBzdHlsZUZ1bmN0aW9uKG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZSkge1xuICB2YXIgc3RyaW5nMDAsXG4gICAgICBzdHJpbmcxMCxcbiAgICAgIGludGVycG9sYXRlMDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdHJpbmcwID0gc3R5bGUodGhpcywgbmFtZSksXG4gICAgICAgIHZhbHVlMSA9IHZhbHVlKHRoaXMpLFxuICAgICAgICBzdHJpbmcxID0gdmFsdWUxICsgXCJcIjtcbiAgICBpZiAodmFsdWUxID09IG51bGwpIHN0cmluZzEgPSB2YWx1ZTEgPSAodGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKSwgc3R5bGUodGhpcywgbmFtZSkpO1xuICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbFxuICAgICAgICA6IHN0cmluZzAgPT09IHN0cmluZzAwICYmIHN0cmluZzEgPT09IHN0cmluZzEwID8gaW50ZXJwb2xhdGUwXG4gICAgICAgIDogKHN0cmluZzEwID0gc3RyaW5nMSwgaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCB2YWx1ZTEpKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3R5bGVNYXliZVJlbW92ZShpZCwgbmFtZSkge1xuICB2YXIgb24wLCBvbjEsIGxpc3RlbmVyMCwga2V5ID0gXCJzdHlsZS5cIiArIG5hbWUsIGV2ZW50ID0gXCJlbmQuXCIgKyBrZXksIHJlbW92ZTtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzY2hlZHVsZSA9IHNldCh0aGlzLCBpZCksXG4gICAgICAgIG9uID0gc2NoZWR1bGUub24sXG4gICAgICAgIGxpc3RlbmVyID0gc2NoZWR1bGUudmFsdWVba2V5XSA9PSBudWxsID8gcmVtb3ZlIHx8IChyZW1vdmUgPSBzdHlsZVJlbW92ZShuYW1lKSkgOiB1bmRlZmluZWQ7XG5cbiAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIGEgZGlzcGF0Y2ggd2l0aCB0aGUgcHJldmlvdXMgbm9kZSxcbiAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgZGlzcGF0Y2ggYW5kIHdl4oCZcmUgZG9uZSFcbiAgICAvLyBPdGhlcndpc2UsIGNvcHktb24td3JpdGUuXG4gICAgaWYgKG9uICE9PSBvbjAgfHwgbGlzdGVuZXIwICE9PSBsaXN0ZW5lcikgKG9uMSA9IChvbjAgPSBvbikuY29weSgpKS5vbihldmVudCwgbGlzdGVuZXIwID0gbGlzdGVuZXIpO1xuXG4gICAgc2NoZWR1bGUub24gPSBvbjE7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkge1xuICB2YXIgaSA9IChuYW1lICs9IFwiXCIpID09PSBcInRyYW5zZm9ybVwiID8gaW50ZXJwb2xhdGVUcmFuc2Zvcm0gOiBpbnRlcnBvbGF0ZTtcbiAgcmV0dXJuIHZhbHVlID09IG51bGwgPyB0aGlzXG4gICAgICAuc3R5bGVUd2VlbihuYW1lLCBzdHlsZU51bGwobmFtZSwgaSkpXG4gICAgICAub24oXCJlbmQuc3R5bGUuXCIgKyBuYW1lLCBzdHlsZVJlbW92ZShuYW1lKSlcbiAgICA6IHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiID8gdGhpc1xuICAgICAgLnN0eWxlVHdlZW4obmFtZSwgc3R5bGVGdW5jdGlvbihuYW1lLCBpLCB0d2VlblZhbHVlKHRoaXMsIFwic3R5bGUuXCIgKyBuYW1lLCB2YWx1ZSkpKVxuICAgICAgLmVhY2goc3R5bGVNYXliZVJlbW92ZSh0aGlzLl9pZCwgbmFtZSkpXG4gICAgOiB0aGlzXG4gICAgICAuc3R5bGVUd2VlbihuYW1lLCBzdHlsZUNvbnN0YW50KG5hbWUsIGksIHZhbHVlKSwgcHJpb3JpdHkpXG4gICAgICAub24oXCJlbmQuc3R5bGUuXCIgKyBuYW1lLCBudWxsKTtcbn1cbiIsImZ1bmN0aW9uIHN0eWxlSW50ZXJwb2xhdGUobmFtZSwgaSwgcHJpb3JpdHkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIGkuY2FsbCh0aGlzLCB0KSwgcHJpb3JpdHkpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBzdHlsZVR3ZWVuKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkge1xuICB2YXIgdCwgaTA7XG4gIGZ1bmN0aW9uIHR3ZWVuKCkge1xuICAgIHZhciBpID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAoaSAhPT0gaTApIHQgPSAoaTAgPSBpKSAmJiBzdHlsZUludGVycG9sYXRlKG5hbWUsIGksIHByaW9yaXR5KTtcbiAgICByZXR1cm4gdDtcbiAgfVxuICB0d2Vlbi5fdmFsdWUgPSB2YWx1ZTtcbiAgcmV0dXJuIHR3ZWVuO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHtcbiAgdmFyIGtleSA9IFwic3R5bGUuXCIgKyAobmFtZSArPSBcIlwiKTtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSByZXR1cm4gKGtleSA9IHRoaXMudHdlZW4oa2V5KSkgJiYga2V5Ll92YWx1ZTtcbiAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiB0aGlzLnR3ZWVuKGtleSwgbnVsbCk7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yO1xuICByZXR1cm4gdGhpcy50d2VlbihrZXksIHN0eWxlVHdlZW4obmFtZSwgdmFsdWUsIHByaW9yaXR5ID09IG51bGwgPyBcIlwiIDogcHJpb3JpdHkpKTtcbn1cbiIsImltcG9ydCB7dHdlZW5WYWx1ZX0gZnJvbSBcIi4vdHdlZW4uanNcIjtcblxuZnVuY3Rpb24gdGV4dENvbnN0YW50KHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnRleHRDb250ZW50ID0gdmFsdWU7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHRleHRGdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHZhbHVlMSA9IHZhbHVlKHRoaXMpO1xuICAgIHRoaXMudGV4dENvbnRlbnQgPSB2YWx1ZTEgPT0gbnVsbCA/IFwiXCIgOiB2YWx1ZTE7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiB0aGlzLnR3ZWVuKFwidGV4dFwiLCB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyB0ZXh0RnVuY3Rpb24odHdlZW5WYWx1ZSh0aGlzLCBcInRleHRcIiwgdmFsdWUpKVxuICAgICAgOiB0ZXh0Q29uc3RhbnQodmFsdWUgPT0gbnVsbCA/IFwiXCIgOiB2YWx1ZSArIFwiXCIpKTtcbn1cbiIsImZ1bmN0aW9uIHRleHRJbnRlcnBvbGF0ZShpKSB7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgdGhpcy50ZXh0Q29udGVudCA9IGkuY2FsbCh0aGlzLCB0KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gdGV4dFR3ZWVuKHZhbHVlKSB7XG4gIHZhciB0MCwgaTA7XG4gIGZ1bmN0aW9uIHR3ZWVuKCkge1xuICAgIHZhciBpID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAoaSAhPT0gaTApIHQwID0gKGkwID0gaSkgJiYgdGV4dEludGVycG9sYXRlKGkpO1xuICAgIHJldHVybiB0MDtcbiAgfVxuICB0d2Vlbi5fdmFsdWUgPSB2YWx1ZTtcbiAgcmV0dXJuIHR3ZWVuO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICB2YXIga2V5ID0gXCJ0ZXh0XCI7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMSkgcmV0dXJuIChrZXkgPSB0aGlzLnR3ZWVuKGtleSkpICYmIGtleS5fdmFsdWU7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gdGhpcy50d2VlbihrZXksIG51bGwpO1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcjtcbiAgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCB0ZXh0VHdlZW4odmFsdWUpKTtcbn1cbiIsImltcG9ydCB7VHJhbnNpdGlvbiwgbmV3SWR9IGZyb20gXCIuL2luZGV4LmpzXCI7XG5pbXBvcnQgc2NoZWR1bGUsIHtnZXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgbmFtZSA9IHRoaXMuX25hbWUsXG4gICAgICBpZDAgPSB0aGlzLl9pZCxcbiAgICAgIGlkMSA9IG5ld0lkKCk7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgICAgdmFyIGluaGVyaXQgPSBnZXQobm9kZSwgaWQwKTtcbiAgICAgICAgc2NoZWR1bGUobm9kZSwgbmFtZSwgaWQxLCBpLCBncm91cCwge1xuICAgICAgICAgIHRpbWU6IGluaGVyaXQudGltZSArIGluaGVyaXQuZGVsYXkgKyBpbmhlcml0LmR1cmF0aW9uLFxuICAgICAgICAgIGRlbGF5OiAwLFxuICAgICAgICAgIGR1cmF0aW9uOiBpbmhlcml0LmR1cmF0aW9uLFxuICAgICAgICAgIGVhc2U6IGluaGVyaXQuZWFzZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFRyYW5zaXRpb24oZ3JvdXBzLCB0aGlzLl9wYXJlbnRzLCBuYW1lLCBpZDEpO1xufVxuIiwiaW1wb3J0IHtzZXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgb24wLCBvbjEsIHRoYXQgPSB0aGlzLCBpZCA9IHRoYXQuX2lkLCBzaXplID0gdGhhdC5zaXplKCk7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICB2YXIgY2FuY2VsID0ge3ZhbHVlOiByZWplY3R9LFxuICAgICAgICBlbmQgPSB7dmFsdWU6IGZ1bmN0aW9uKCkgeyBpZiAoLS1zaXplID09PSAwKSByZXNvbHZlKCk7IH19O1xuXG4gICAgdGhhdC5lYWNoKGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNjaGVkdWxlID0gc2V0KHRoaXMsIGlkKSxcbiAgICAgICAgICBvbiA9IHNjaGVkdWxlLm9uO1xuXG4gICAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIGEgZGlzcGF0Y2ggd2l0aCB0aGUgcHJldmlvdXMgbm9kZSxcbiAgICAgIC8vIGp1c3QgYXNzaWduIHRoZSB1cGRhdGVkIHNoYXJlZCBkaXNwYXRjaCBhbmQgd2XigJlyZSBkb25lIVxuICAgICAgLy8gT3RoZXJ3aXNlLCBjb3B5LW9uLXdyaXRlLlxuICAgICAgaWYgKG9uICE9PSBvbjApIHtcbiAgICAgICAgb24xID0gKG9uMCA9IG9uKS5jb3B5KCk7XG4gICAgICAgIG9uMS5fLmNhbmNlbC5wdXNoKGNhbmNlbCk7XG4gICAgICAgIG9uMS5fLmludGVycnVwdC5wdXNoKGNhbmNlbCk7XG4gICAgICAgIG9uMS5fLmVuZC5wdXNoKGVuZCk7XG4gICAgICB9XG5cbiAgICAgIHNjaGVkdWxlLm9uID0gb24xO1xuICAgIH0pO1xuXG4gICAgLy8gVGhlIHNlbGVjdGlvbiB3YXMgZW1wdHksIHJlc29sdmUgZW5kIGltbWVkaWF0ZWx5XG4gICAgaWYgKHNpemUgPT09IDApIHJlc29sdmUoKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQge3NlbGVjdGlvbn0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IHRyYW5zaXRpb25fYXR0ciBmcm9tIFwiLi9hdHRyLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9hdHRyVHdlZW4gZnJvbSBcIi4vYXR0clR3ZWVuLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9kZWxheSBmcm9tIFwiLi9kZWxheS5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fZHVyYXRpb24gZnJvbSBcIi4vZHVyYXRpb24uanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX2Vhc2UgZnJvbSBcIi4vZWFzZS5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fZWFzZVZhcnlpbmcgZnJvbSBcIi4vZWFzZVZhcnlpbmcuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX2ZpbHRlciBmcm9tIFwiLi9maWx0ZXIuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX21lcmdlIGZyb20gXCIuL21lcmdlLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9vbiBmcm9tIFwiLi9vbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fcmVtb3ZlIGZyb20gXCIuL3JlbW92ZS5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fc2VsZWN0IGZyb20gXCIuL3NlbGVjdC5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fc2VsZWN0QWxsIGZyb20gXCIuL3NlbGVjdEFsbC5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fc2VsZWN0aW9uIGZyb20gXCIuL3NlbGVjdGlvbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fc3R5bGUgZnJvbSBcIi4vc3R5bGUuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3N0eWxlVHdlZW4gZnJvbSBcIi4vc3R5bGVUd2Vlbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fdGV4dCBmcm9tIFwiLi90ZXh0LmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl90ZXh0VHdlZW4gZnJvbSBcIi4vdGV4dFR3ZWVuLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl90cmFuc2l0aW9uIGZyb20gXCIuL3RyYW5zaXRpb24uanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3R3ZWVuIGZyb20gXCIuL3R3ZWVuLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9lbmQgZnJvbSBcIi4vZW5kLmpzXCI7XG5cbnZhciBpZCA9IDA7XG5cbmV4cG9ydCBmdW5jdGlvbiBUcmFuc2l0aW9uKGdyb3VwcywgcGFyZW50cywgbmFtZSwgaWQpIHtcbiAgdGhpcy5fZ3JvdXBzID0gZ3JvdXBzO1xuICB0aGlzLl9wYXJlbnRzID0gcGFyZW50cztcbiAgdGhpcy5fbmFtZSA9IG5hbWU7XG4gIHRoaXMuX2lkID0gaWQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRyYW5zaXRpb24obmFtZSkge1xuICByZXR1cm4gc2VsZWN0aW9uKCkudHJhbnNpdGlvbihuYW1lKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5ld0lkKCkge1xuICByZXR1cm4gKytpZDtcbn1cblxudmFyIHNlbGVjdGlvbl9wcm90b3R5cGUgPSBzZWxlY3Rpb24ucHJvdG90eXBlO1xuXG5UcmFuc2l0aW9uLnByb3RvdHlwZSA9IHRyYW5zaXRpb24ucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogVHJhbnNpdGlvbixcbiAgc2VsZWN0OiB0cmFuc2l0aW9uX3NlbGVjdCxcbiAgc2VsZWN0QWxsOiB0cmFuc2l0aW9uX3NlbGVjdEFsbCxcbiAgc2VsZWN0Q2hpbGQ6IHNlbGVjdGlvbl9wcm90b3R5cGUuc2VsZWN0Q2hpbGQsXG4gIHNlbGVjdENoaWxkcmVuOiBzZWxlY3Rpb25fcHJvdG90eXBlLnNlbGVjdENoaWxkcmVuLFxuICBmaWx0ZXI6IHRyYW5zaXRpb25fZmlsdGVyLFxuICBtZXJnZTogdHJhbnNpdGlvbl9tZXJnZSxcbiAgc2VsZWN0aW9uOiB0cmFuc2l0aW9uX3NlbGVjdGlvbixcbiAgdHJhbnNpdGlvbjogdHJhbnNpdGlvbl90cmFuc2l0aW9uLFxuICBjYWxsOiBzZWxlY3Rpb25fcHJvdG90eXBlLmNhbGwsXG4gIG5vZGVzOiBzZWxlY3Rpb25fcHJvdG90eXBlLm5vZGVzLFxuICBub2RlOiBzZWxlY3Rpb25fcHJvdG90eXBlLm5vZGUsXG4gIHNpemU6IHNlbGVjdGlvbl9wcm90b3R5cGUuc2l6ZSxcbiAgZW1wdHk6IHNlbGVjdGlvbl9wcm90b3R5cGUuZW1wdHksXG4gIGVhY2g6IHNlbGVjdGlvbl9wcm90b3R5cGUuZWFjaCxcbiAgb246IHRyYW5zaXRpb25fb24sXG4gIGF0dHI6IHRyYW5zaXRpb25fYXR0cixcbiAgYXR0clR3ZWVuOiB0cmFuc2l0aW9uX2F0dHJUd2VlbixcbiAgc3R5bGU6IHRyYW5zaXRpb25fc3R5bGUsXG4gIHN0eWxlVHdlZW46IHRyYW5zaXRpb25fc3R5bGVUd2VlbixcbiAgdGV4dDogdHJhbnNpdGlvbl90ZXh0LFxuICB0ZXh0VHdlZW46IHRyYW5zaXRpb25fdGV4dFR3ZWVuLFxuICByZW1vdmU6IHRyYW5zaXRpb25fcmVtb3ZlLFxuICB0d2VlbjogdHJhbnNpdGlvbl90d2VlbixcbiAgZGVsYXk6IHRyYW5zaXRpb25fZGVsYXksXG4gIGR1cmF0aW9uOiB0cmFuc2l0aW9uX2R1cmF0aW9uLFxuICBlYXNlOiB0cmFuc2l0aW9uX2Vhc2UsXG4gIGVhc2VWYXJ5aW5nOiB0cmFuc2l0aW9uX2Vhc2VWYXJ5aW5nLFxuICBlbmQ6IHRyYW5zaXRpb25fZW5kLFxuICBbU3ltYm9sLml0ZXJhdG9yXTogc2VsZWN0aW9uX3Byb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdXG59O1xuIiwiZXhwb3J0IGZ1bmN0aW9uIGN1YmljSW4odCkge1xuICByZXR1cm4gdCAqIHQgKiB0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3ViaWNPdXQodCkge1xuICByZXR1cm4gLS10ICogdCAqIHQgKyAxO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3ViaWNJbk91dCh0KSB7XG4gIHJldHVybiAoKHQgKj0gMikgPD0gMSA/IHQgKiB0ICogdCA6ICh0IC09IDIpICogdCAqIHQgKyAyKSAvIDI7XG59XG4iLCJpbXBvcnQge1RyYW5zaXRpb24sIG5ld0lkfSBmcm9tIFwiLi4vdHJhbnNpdGlvbi9pbmRleC5qc1wiO1xuaW1wb3J0IHNjaGVkdWxlIGZyb20gXCIuLi90cmFuc2l0aW9uL3NjaGVkdWxlLmpzXCI7XG5pbXBvcnQge2Vhc2VDdWJpY0luT3V0fSBmcm9tIFwiZDMtZWFzZVwiO1xuaW1wb3J0IHtub3d9IGZyb20gXCJkMy10aW1lclwiO1xuXG52YXIgZGVmYXVsdFRpbWluZyA9IHtcbiAgdGltZTogbnVsbCwgLy8gU2V0IG9uIHVzZS5cbiAgZGVsYXk6IDAsXG4gIGR1cmF0aW9uOiAyNTAsXG4gIGVhc2U6IGVhc2VDdWJpY0luT3V0XG59O1xuXG5mdW5jdGlvbiBpbmhlcml0KG5vZGUsIGlkKSB7XG4gIHZhciB0aW1pbmc7XG4gIHdoaWxlICghKHRpbWluZyA9IG5vZGUuX190cmFuc2l0aW9uKSB8fCAhKHRpbWluZyA9IHRpbWluZ1tpZF0pKSB7XG4gICAgaWYgKCEobm9kZSA9IG5vZGUucGFyZW50Tm9kZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgdHJhbnNpdGlvbiAke2lkfSBub3QgZm91bmRgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRpbWluZztcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSkge1xuICB2YXIgaWQsXG4gICAgICB0aW1pbmc7XG5cbiAgaWYgKG5hbWUgaW5zdGFuY2VvZiBUcmFuc2l0aW9uKSB7XG4gICAgaWQgPSBuYW1lLl9pZCwgbmFtZSA9IG5hbWUuX25hbWU7XG4gIH0gZWxzZSB7XG4gICAgaWQgPSBuZXdJZCgpLCAodGltaW5nID0gZGVmYXVsdFRpbWluZykudGltZSA9IG5vdygpLCBuYW1lID0gbmFtZSA9PSBudWxsID8gbnVsbCA6IG5hbWUgKyBcIlwiO1xuICB9XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgICAgc2NoZWR1bGUobm9kZSwgbmFtZSwgaWQsIGksIGdyb3VwLCB0aW1pbmcgfHwgaW5oZXJpdChub2RlLCBpZCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgVHJhbnNpdGlvbihncm91cHMsIHRoaXMuX3BhcmVudHMsIG5hbWUsIGlkKTtcbn1cbiIsImltcG9ydCB7c2VsZWN0aW9ufSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2ludGVycnVwdCBmcm9tIFwiLi9pbnRlcnJ1cHQuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fdHJhbnNpdGlvbiBmcm9tIFwiLi90cmFuc2l0aW9uLmpzXCI7XG5cbnNlbGVjdGlvbi5wcm90b3R5cGUuaW50ZXJydXB0ID0gc2VsZWN0aW9uX2ludGVycnVwdDtcbnNlbGVjdGlvbi5wcm90b3R5cGUudHJhbnNpdGlvbiA9IHNlbGVjdGlvbl90cmFuc2l0aW9uO1xuIiwiaW1wb3J0IFwiLi9zZWxlY3Rpb24vaW5kZXguanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyB0cmFuc2l0aW9ufSBmcm9tIFwiLi90cmFuc2l0aW9uL2luZGV4LmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgYWN0aXZlfSBmcm9tIFwiLi9hY3RpdmUuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBpbnRlcnJ1cHR9IGZyb20gXCIuL2ludGVycnVwdC5qc1wiO1xuIiwiaW1wb3J0IHtkaXNwYXRjaH0gZnJvbSBcImQzLWRpc3BhdGNoXCI7XG5pbXBvcnQge2RyYWdEaXNhYmxlLCBkcmFnRW5hYmxlfSBmcm9tIFwiZDMtZHJhZ1wiO1xuaW1wb3J0IHtpbnRlcnBvbGF0ZX0gZnJvbSBcImQzLWludGVycG9sYXRlXCI7XG5pbXBvcnQge3BvaW50ZXIsIHNlbGVjdH0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IHtpbnRlcnJ1cHR9IGZyb20gXCJkMy10cmFuc2l0aW9uXCI7XG5pbXBvcnQgY29uc3RhbnQgZnJvbSBcIi4vY29uc3RhbnQuanNcIjtcbmltcG9ydCBCcnVzaEV2ZW50IGZyb20gXCIuL2V2ZW50LmpzXCI7XG5pbXBvcnQgbm9ldmVudCwge25vcHJvcGFnYXRpb259IGZyb20gXCIuL25vZXZlbnQuanNcIjtcblxudmFyIE1PREVfRFJBRyA9IHtuYW1lOiBcImRyYWdcIn0sXG4gICAgTU9ERV9TUEFDRSA9IHtuYW1lOiBcInNwYWNlXCJ9LFxuICAgIE1PREVfSEFORExFID0ge25hbWU6IFwiaGFuZGxlXCJ9LFxuICAgIE1PREVfQ0VOVEVSID0ge25hbWU6IFwiY2VudGVyXCJ9O1xuXG5jb25zdCB7YWJzLCBtYXgsIG1pbn0gPSBNYXRoO1xuXG5mdW5jdGlvbiBudW1iZXIxKGUpIHtcbiAgcmV0dXJuIFsrZVswXSwgK2VbMV1dO1xufVxuXG5mdW5jdGlvbiBudW1iZXIyKGUpIHtcbiAgcmV0dXJuIFtudW1iZXIxKGVbMF0pLCBudW1iZXIxKGVbMV0pXTtcbn1cblxudmFyIFggPSB7XG4gIG5hbWU6IFwieFwiLFxuICBoYW5kbGVzOiBbXCJ3XCIsIFwiZVwiXS5tYXAodHlwZSksXG4gIGlucHV0OiBmdW5jdGlvbih4LCBlKSB7IHJldHVybiB4ID09IG51bGwgPyBudWxsIDogW1sreFswXSwgZVswXVsxXV0sIFsreFsxXSwgZVsxXVsxXV1dOyB9LFxuICBvdXRwdXQ6IGZ1bmN0aW9uKHh5KSB7IHJldHVybiB4eSAmJiBbeHlbMF1bMF0sIHh5WzFdWzBdXTsgfVxufTtcblxudmFyIFkgPSB7XG4gIG5hbWU6IFwieVwiLFxuICBoYW5kbGVzOiBbXCJuXCIsIFwic1wiXS5tYXAodHlwZSksXG4gIGlucHV0OiBmdW5jdGlvbih5LCBlKSB7IHJldHVybiB5ID09IG51bGwgPyBudWxsIDogW1tlWzBdWzBdLCAreVswXV0sIFtlWzFdWzBdLCAreVsxXV1dOyB9LFxuICBvdXRwdXQ6IGZ1bmN0aW9uKHh5KSB7IHJldHVybiB4eSAmJiBbeHlbMF1bMV0sIHh5WzFdWzFdXTsgfVxufTtcblxudmFyIFhZID0ge1xuICBuYW1lOiBcInh5XCIsXG4gIGhhbmRsZXM6IFtcIm5cIiwgXCJ3XCIsIFwiZVwiLCBcInNcIiwgXCJud1wiLCBcIm5lXCIsIFwic3dcIiwgXCJzZVwiXS5tYXAodHlwZSksXG4gIGlucHV0OiBmdW5jdGlvbih4eSkgeyByZXR1cm4geHkgPT0gbnVsbCA/IG51bGwgOiBudW1iZXIyKHh5KTsgfSxcbiAgb3V0cHV0OiBmdW5jdGlvbih4eSkgeyByZXR1cm4geHk7IH1cbn07XG5cbnZhciBjdXJzb3JzID0ge1xuICBvdmVybGF5OiBcImNyb3NzaGFpclwiLFxuICBzZWxlY3Rpb246IFwibW92ZVwiLFxuICBuOiBcIm5zLXJlc2l6ZVwiLFxuICBlOiBcImV3LXJlc2l6ZVwiLFxuICBzOiBcIm5zLXJlc2l6ZVwiLFxuICB3OiBcImV3LXJlc2l6ZVwiLFxuICBudzogXCJud3NlLXJlc2l6ZVwiLFxuICBuZTogXCJuZXN3LXJlc2l6ZVwiLFxuICBzZTogXCJud3NlLXJlc2l6ZVwiLFxuICBzdzogXCJuZXN3LXJlc2l6ZVwiXG59O1xuXG52YXIgZmxpcFggPSB7XG4gIGU6IFwid1wiLFxuICB3OiBcImVcIixcbiAgbnc6IFwibmVcIixcbiAgbmU6IFwibndcIixcbiAgc2U6IFwic3dcIixcbiAgc3c6IFwic2VcIlxufTtcblxudmFyIGZsaXBZID0ge1xuICBuOiBcInNcIixcbiAgczogXCJuXCIsXG4gIG53OiBcInN3XCIsXG4gIG5lOiBcInNlXCIsXG4gIHNlOiBcIm5lXCIsXG4gIHN3OiBcIm53XCJcbn07XG5cbnZhciBzaWduc1ggPSB7XG4gIG92ZXJsYXk6ICsxLFxuICBzZWxlY3Rpb246ICsxLFxuICBuOiBudWxsLFxuICBlOiArMSxcbiAgczogbnVsbCxcbiAgdzogLTEsXG4gIG53OiAtMSxcbiAgbmU6ICsxLFxuICBzZTogKzEsXG4gIHN3OiAtMVxufTtcblxudmFyIHNpZ25zWSA9IHtcbiAgb3ZlcmxheTogKzEsXG4gIHNlbGVjdGlvbjogKzEsXG4gIG46IC0xLFxuICBlOiBudWxsLFxuICBzOiArMSxcbiAgdzogbnVsbCxcbiAgbnc6IC0xLFxuICBuZTogLTEsXG4gIHNlOiArMSxcbiAgc3c6ICsxXG59O1xuXG5mdW5jdGlvbiB0eXBlKHQpIHtcbiAgcmV0dXJuIHt0eXBlOiB0fTtcbn1cblxuLy8gSWdub3JlIHJpZ2h0LWNsaWNrLCBzaW5jZSB0aGF0IHNob3VsZCBvcGVuIHRoZSBjb250ZXh0IG1lbnUuXG5mdW5jdGlvbiBkZWZhdWx0RmlsdGVyKGV2ZW50KSB7XG4gIHJldHVybiAhZXZlbnQuY3RybEtleSAmJiAhZXZlbnQuYnV0dG9uO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0RXh0ZW50KCkge1xuICB2YXIgc3ZnID0gdGhpcy5vd25lclNWR0VsZW1lbnQgfHwgdGhpcztcbiAgaWYgKHN2Zy5oYXNBdHRyaWJ1dGUoXCJ2aWV3Qm94XCIpKSB7XG4gICAgc3ZnID0gc3ZnLnZpZXdCb3guYmFzZVZhbDtcbiAgICByZXR1cm4gW1tzdmcueCwgc3ZnLnldLCBbc3ZnLnggKyBzdmcud2lkdGgsIHN2Zy55ICsgc3ZnLmhlaWdodF1dO1xuICB9XG4gIHJldHVybiBbWzAsIDBdLCBbc3ZnLndpZHRoLmJhc2VWYWwudmFsdWUsIHN2Zy5oZWlnaHQuYmFzZVZhbC52YWx1ZV1dO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0VG91Y2hhYmxlKCkge1xuICByZXR1cm4gbmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzIHx8IChcIm9udG91Y2hzdGFydFwiIGluIHRoaXMpO1xufVxuXG4vLyBMaWtlIGQzLmxvY2FsLCBidXQgd2l0aCB0aGUgbmFtZSDigJxfX2JydXNo4oCdIHJhdGhlciB0aGFuIGF1dG8tZ2VuZXJhdGVkLlxuZnVuY3Rpb24gbG9jYWwobm9kZSkge1xuICB3aGlsZSAoIW5vZGUuX19icnVzaCkgaWYgKCEobm9kZSA9IG5vZGUucGFyZW50Tm9kZSkpIHJldHVybjtcbiAgcmV0dXJuIG5vZGUuX19icnVzaDtcbn1cblxuZnVuY3Rpb24gZW1wdHkoZXh0ZW50KSB7XG4gIHJldHVybiBleHRlbnRbMF1bMF0gPT09IGV4dGVudFsxXVswXVxuICAgICAgfHwgZXh0ZW50WzBdWzFdID09PSBleHRlbnRbMV1bMV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBicnVzaFNlbGVjdGlvbihub2RlKSB7XG4gIHZhciBzdGF0ZSA9IG5vZGUuX19icnVzaDtcbiAgcmV0dXJuIHN0YXRlID8gc3RhdGUuZGltLm91dHB1dChzdGF0ZS5zZWxlY3Rpb24pIDogbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJydXNoWCgpIHtcbiAgcmV0dXJuIGJydXNoKFgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnJ1c2hZKCkge1xuICByZXR1cm4gYnJ1c2goWSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gYnJ1c2goWFkpO1xufVxuXG5mdW5jdGlvbiBicnVzaChkaW0pIHtcbiAgdmFyIGV4dGVudCA9IGRlZmF1bHRFeHRlbnQsXG4gICAgICBmaWx0ZXIgPSBkZWZhdWx0RmlsdGVyLFxuICAgICAgdG91Y2hhYmxlID0gZGVmYXVsdFRvdWNoYWJsZSxcbiAgICAgIGtleXMgPSB0cnVlLFxuICAgICAgbGlzdGVuZXJzID0gZGlzcGF0Y2goXCJzdGFydFwiLCBcImJydXNoXCIsIFwiZW5kXCIpLFxuICAgICAgaGFuZGxlU2l6ZSA9IDYsXG4gICAgICB0b3VjaGVuZGluZztcblxuICBmdW5jdGlvbiBicnVzaChncm91cCkge1xuICAgIHZhciBvdmVybGF5ID0gZ3JvdXBcbiAgICAgICAgLnByb3BlcnR5KFwiX19icnVzaFwiLCBpbml0aWFsaXplKVxuICAgICAgLnNlbGVjdEFsbChcIi5vdmVybGF5XCIpXG4gICAgICAuZGF0YShbdHlwZShcIm92ZXJsYXlcIildKTtcblxuICAgIG92ZXJsYXkuZW50ZXIoKS5hcHBlbmQoXCJyZWN0XCIpXG4gICAgICAgIC5hdHRyKFwiY2xhc3NcIiwgXCJvdmVybGF5XCIpXG4gICAgICAgIC5hdHRyKFwicG9pbnRlci1ldmVudHNcIiwgXCJhbGxcIilcbiAgICAgICAgLmF0dHIoXCJjdXJzb3JcIiwgY3Vyc29ycy5vdmVybGF5KVxuICAgICAgLm1lcmdlKG92ZXJsYXkpXG4gICAgICAgIC5lYWNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhciBleHRlbnQgPSBsb2NhbCh0aGlzKS5leHRlbnQ7XG4gICAgICAgICAgc2VsZWN0KHRoaXMpXG4gICAgICAgICAgICAgIC5hdHRyKFwieFwiLCBleHRlbnRbMF1bMF0pXG4gICAgICAgICAgICAgIC5hdHRyKFwieVwiLCBleHRlbnRbMF1bMV0pXG4gICAgICAgICAgICAgIC5hdHRyKFwid2lkdGhcIiwgZXh0ZW50WzFdWzBdIC0gZXh0ZW50WzBdWzBdKVxuICAgICAgICAgICAgICAuYXR0cihcImhlaWdodFwiLCBleHRlbnRbMV1bMV0gLSBleHRlbnRbMF1bMV0pO1xuICAgICAgICB9KTtcblxuICAgIGdyb3VwLnNlbGVjdEFsbChcIi5zZWxlY3Rpb25cIilcbiAgICAgIC5kYXRhKFt0eXBlKFwic2VsZWN0aW9uXCIpXSlcbiAgICAgIC5lbnRlcigpLmFwcGVuZChcInJlY3RcIilcbiAgICAgICAgLmF0dHIoXCJjbGFzc1wiLCBcInNlbGVjdGlvblwiKVxuICAgICAgICAuYXR0cihcImN1cnNvclwiLCBjdXJzb3JzLnNlbGVjdGlvbilcbiAgICAgICAgLmF0dHIoXCJmaWxsXCIsIFwiIzc3N1wiKVxuICAgICAgICAuYXR0cihcImZpbGwtb3BhY2l0eVwiLCAwLjMpXG4gICAgICAgIC5hdHRyKFwic3Ryb2tlXCIsIFwiI2ZmZlwiKVxuICAgICAgICAuYXR0cihcInNoYXBlLXJlbmRlcmluZ1wiLCBcImNyaXNwRWRnZXNcIik7XG5cbiAgICB2YXIgaGFuZGxlID0gZ3JvdXAuc2VsZWN0QWxsKFwiLmhhbmRsZVwiKVxuICAgICAgLmRhdGEoZGltLmhhbmRsZXMsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQudHlwZTsgfSk7XG5cbiAgICBoYW5kbGUuZXhpdCgpLnJlbW92ZSgpO1xuXG4gICAgaGFuZGxlLmVudGVyKCkuYXBwZW5kKFwicmVjdFwiKVxuICAgICAgICAuYXR0cihcImNsYXNzXCIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIFwiaGFuZGxlIGhhbmRsZS0tXCIgKyBkLnR5cGU7IH0pXG4gICAgICAgIC5hdHRyKFwiY3Vyc29yXCIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGN1cnNvcnNbZC50eXBlXTsgfSk7XG5cbiAgICBncm91cFxuICAgICAgICAuZWFjaChyZWRyYXcpXG4gICAgICAgIC5hdHRyKFwiZmlsbFwiLCBcIm5vbmVcIilcbiAgICAgICAgLmF0dHIoXCJwb2ludGVyLWV2ZW50c1wiLCBcImFsbFwiKVxuICAgICAgICAub24oXCJtb3VzZWRvd24uYnJ1c2hcIiwgc3RhcnRlZClcbiAgICAgIC5maWx0ZXIodG91Y2hhYmxlKVxuICAgICAgICAub24oXCJ0b3VjaHN0YXJ0LmJydXNoXCIsIHN0YXJ0ZWQpXG4gICAgICAgIC5vbihcInRvdWNobW92ZS5icnVzaFwiLCB0b3VjaG1vdmVkKVxuICAgICAgICAub24oXCJ0b3VjaGVuZC5icnVzaCB0b3VjaGNhbmNlbC5icnVzaFwiLCB0b3VjaGVuZGVkKVxuICAgICAgICAuc3R5bGUoXCJ0b3VjaC1hY3Rpb25cIiwgXCJub25lXCIpXG4gICAgICAgIC5zdHlsZShcIi13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvclwiLCBcInJnYmEoMCwwLDAsMClcIik7XG4gIH1cblxuICBicnVzaC5tb3ZlID0gZnVuY3Rpb24oZ3JvdXAsIHNlbGVjdGlvbiwgZXZlbnQpIHtcbiAgICBpZiAoZ3JvdXAudHdlZW4pIHtcbiAgICAgIGdyb3VwXG4gICAgICAgICAgLm9uKFwic3RhcnQuYnJ1c2hcIiwgZnVuY3Rpb24oZXZlbnQpIHsgZW1pdHRlcih0aGlzLCBhcmd1bWVudHMpLmJlZm9yZXN0YXJ0KCkuc3RhcnQoZXZlbnQpOyB9KVxuICAgICAgICAgIC5vbihcImludGVycnVwdC5icnVzaCBlbmQuYnJ1c2hcIiwgZnVuY3Rpb24oZXZlbnQpIHsgZW1pdHRlcih0aGlzLCBhcmd1bWVudHMpLmVuZChldmVudCk7IH0pXG4gICAgICAgICAgLnR3ZWVuKFwiYnJ1c2hcIiwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsXG4gICAgICAgICAgICAgICAgc3RhdGUgPSB0aGF0Ll9fYnJ1c2gsXG4gICAgICAgICAgICAgICAgZW1pdCA9IGVtaXR0ZXIodGhhdCwgYXJndW1lbnRzKSxcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb24wID0gc3RhdGUuc2VsZWN0aW9uLFxuICAgICAgICAgICAgICAgIHNlbGVjdGlvbjEgPSBkaW0uaW5wdXQodHlwZW9mIHNlbGVjdGlvbiA9PT0gXCJmdW5jdGlvblwiID8gc2VsZWN0aW9uLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBzZWxlY3Rpb24sIHN0YXRlLmV4dGVudCksXG4gICAgICAgICAgICAgICAgaSA9IGludGVycG9sYXRlKHNlbGVjdGlvbjAsIHNlbGVjdGlvbjEpO1xuXG4gICAgICAgICAgICBmdW5jdGlvbiB0d2Vlbih0KSB7XG4gICAgICAgICAgICAgIHN0YXRlLnNlbGVjdGlvbiA9IHQgPT09IDEgJiYgc2VsZWN0aW9uMSA9PT0gbnVsbCA/IG51bGwgOiBpKHQpO1xuICAgICAgICAgICAgICByZWRyYXcuY2FsbCh0aGF0KTtcbiAgICAgICAgICAgICAgZW1pdC5icnVzaCgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gc2VsZWN0aW9uMCAhPT0gbnVsbCAmJiBzZWxlY3Rpb24xICE9PSBudWxsID8gdHdlZW4gOiB0d2VlbigxKTtcbiAgICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ3JvdXBcbiAgICAgICAgICAuZWFjaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcyxcbiAgICAgICAgICAgICAgICBhcmdzID0gYXJndW1lbnRzLFxuICAgICAgICAgICAgICAgIHN0YXRlID0gdGhhdC5fX2JydXNoLFxuICAgICAgICAgICAgICAgIHNlbGVjdGlvbjEgPSBkaW0uaW5wdXQodHlwZW9mIHNlbGVjdGlvbiA9PT0gXCJmdW5jdGlvblwiID8gc2VsZWN0aW9uLmFwcGx5KHRoYXQsIGFyZ3MpIDogc2VsZWN0aW9uLCBzdGF0ZS5leHRlbnQpLFxuICAgICAgICAgICAgICAgIGVtaXQgPSBlbWl0dGVyKHRoYXQsIGFyZ3MpLmJlZm9yZXN0YXJ0KCk7XG5cbiAgICAgICAgICAgIGludGVycnVwdCh0aGF0KTtcbiAgICAgICAgICAgIHN0YXRlLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjEgPT09IG51bGwgPyBudWxsIDogc2VsZWN0aW9uMTtcbiAgICAgICAgICAgIHJlZHJhdy5jYWxsKHRoYXQpO1xuICAgICAgICAgICAgZW1pdC5zdGFydChldmVudCkuYnJ1c2goZXZlbnQpLmVuZChldmVudCk7XG4gICAgICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIGJydXNoLmNsZWFyID0gZnVuY3Rpb24oZ3JvdXAsIGV2ZW50KSB7XG4gICAgYnJ1c2gubW92ZShncm91cCwgbnVsbCwgZXZlbnQpO1xuICB9O1xuXG4gIGZ1bmN0aW9uIHJlZHJhdygpIHtcbiAgICB2YXIgZ3JvdXAgPSBzZWxlY3QodGhpcyksXG4gICAgICAgIHNlbGVjdGlvbiA9IGxvY2FsKHRoaXMpLnNlbGVjdGlvbjtcblxuICAgIGlmIChzZWxlY3Rpb24pIHtcbiAgICAgIGdyb3VwLnNlbGVjdEFsbChcIi5zZWxlY3Rpb25cIilcbiAgICAgICAgICAuc3R5bGUoXCJkaXNwbGF5XCIsIG51bGwpXG4gICAgICAgICAgLmF0dHIoXCJ4XCIsIHNlbGVjdGlvblswXVswXSlcbiAgICAgICAgICAuYXR0cihcInlcIiwgc2VsZWN0aW9uWzBdWzFdKVxuICAgICAgICAgIC5hdHRyKFwid2lkdGhcIiwgc2VsZWN0aW9uWzFdWzBdIC0gc2VsZWN0aW9uWzBdWzBdKVxuICAgICAgICAgIC5hdHRyKFwiaGVpZ2h0XCIsIHNlbGVjdGlvblsxXVsxXSAtIHNlbGVjdGlvblswXVsxXSk7XG5cbiAgICAgIGdyb3VwLnNlbGVjdEFsbChcIi5oYW5kbGVcIilcbiAgICAgICAgICAuc3R5bGUoXCJkaXNwbGF5XCIsIG51bGwpXG4gICAgICAgICAgLmF0dHIoXCJ4XCIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQudHlwZVtkLnR5cGUubGVuZ3RoIC0gMV0gPT09IFwiZVwiID8gc2VsZWN0aW9uWzFdWzBdIC0gaGFuZGxlU2l6ZSAvIDIgOiBzZWxlY3Rpb25bMF1bMF0gLSBoYW5kbGVTaXplIC8gMjsgfSlcbiAgICAgICAgICAuYXR0cihcInlcIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZC50eXBlWzBdID09PSBcInNcIiA/IHNlbGVjdGlvblsxXVsxXSAtIGhhbmRsZVNpemUgLyAyIDogc2VsZWN0aW9uWzBdWzFdIC0gaGFuZGxlU2l6ZSAvIDI7IH0pXG4gICAgICAgICAgLmF0dHIoXCJ3aWR0aFwiLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLnR5cGUgPT09IFwiblwiIHx8IGQudHlwZSA9PT0gXCJzXCIgPyBzZWxlY3Rpb25bMV1bMF0gLSBzZWxlY3Rpb25bMF1bMF0gKyBoYW5kbGVTaXplIDogaGFuZGxlU2l6ZTsgfSlcbiAgICAgICAgICAuYXR0cihcImhlaWdodFwiLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLnR5cGUgPT09IFwiZVwiIHx8IGQudHlwZSA9PT0gXCJ3XCIgPyBzZWxlY3Rpb25bMV1bMV0gLSBzZWxlY3Rpb25bMF1bMV0gKyBoYW5kbGVTaXplIDogaGFuZGxlU2l6ZTsgfSk7XG4gICAgfVxuXG4gICAgZWxzZSB7XG4gICAgICBncm91cC5zZWxlY3RBbGwoXCIuc2VsZWN0aW9uLC5oYW5kbGVcIilcbiAgICAgICAgICAuc3R5bGUoXCJkaXNwbGF5XCIsIFwibm9uZVwiKVxuICAgICAgICAgIC5hdHRyKFwieFwiLCBudWxsKVxuICAgICAgICAgIC5hdHRyKFwieVwiLCBudWxsKVxuICAgICAgICAgIC5hdHRyKFwid2lkdGhcIiwgbnVsbClcbiAgICAgICAgICAuYXR0cihcImhlaWdodFwiLCBudWxsKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBlbWl0dGVyKHRoYXQsIGFyZ3MsIGNsZWFuKSB7XG4gICAgdmFyIGVtaXQgPSB0aGF0Ll9fYnJ1c2guZW1pdHRlcjtcbiAgICByZXR1cm4gZW1pdCAmJiAoIWNsZWFuIHx8ICFlbWl0LmNsZWFuKSA/IGVtaXQgOiBuZXcgRW1pdHRlcih0aGF0LCBhcmdzLCBjbGVhbik7XG4gIH1cblxuICBmdW5jdGlvbiBFbWl0dGVyKHRoYXQsIGFyZ3MsIGNsZWFuKSB7XG4gICAgdGhpcy50aGF0ID0gdGhhdDtcbiAgICB0aGlzLmFyZ3MgPSBhcmdzO1xuICAgIHRoaXMuc3RhdGUgPSB0aGF0Ll9fYnJ1c2g7XG4gICAgdGhpcy5hY3RpdmUgPSAwO1xuICAgIHRoaXMuY2xlYW4gPSBjbGVhbjtcbiAgfVxuXG4gIEVtaXR0ZXIucHJvdG90eXBlID0ge1xuICAgIGJlZm9yZXN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICAgIGlmICgrK3RoaXMuYWN0aXZlID09PSAxKSB0aGlzLnN0YXRlLmVtaXR0ZXIgPSB0aGlzLCB0aGlzLnN0YXJ0aW5nID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgc3RhcnQ6IGZ1bmN0aW9uKGV2ZW50LCBtb2RlKSB7XG4gICAgICBpZiAodGhpcy5zdGFydGluZykgdGhpcy5zdGFydGluZyA9IGZhbHNlLCB0aGlzLmVtaXQoXCJzdGFydFwiLCBldmVudCwgbW9kZSk7XG4gICAgICBlbHNlIHRoaXMuZW1pdChcImJydXNoXCIsIGV2ZW50KTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgYnJ1c2g6IGZ1bmN0aW9uKGV2ZW50LCBtb2RlKSB7XG4gICAgICB0aGlzLmVtaXQoXCJicnVzaFwiLCBldmVudCwgbW9kZSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIGVuZDogZnVuY3Rpb24oZXZlbnQsIG1vZGUpIHtcbiAgICAgIGlmICgtLXRoaXMuYWN0aXZlID09PSAwKSBkZWxldGUgdGhpcy5zdGF0ZS5lbWl0dGVyLCB0aGlzLmVtaXQoXCJlbmRcIiwgZXZlbnQsIG1vZGUpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICBlbWl0OiBmdW5jdGlvbih0eXBlLCBldmVudCwgbW9kZSkge1xuICAgICAgdmFyIGQgPSBzZWxlY3QodGhpcy50aGF0KS5kYXR1bSgpO1xuICAgICAgbGlzdGVuZXJzLmNhbGwoXG4gICAgICAgIHR5cGUsXG4gICAgICAgIHRoaXMudGhhdCxcbiAgICAgICAgbmV3IEJydXNoRXZlbnQodHlwZSwge1xuICAgICAgICAgIHNvdXJjZUV2ZW50OiBldmVudCxcbiAgICAgICAgICB0YXJnZXQ6IGJydXNoLFxuICAgICAgICAgIHNlbGVjdGlvbjogZGltLm91dHB1dCh0aGlzLnN0YXRlLnNlbGVjdGlvbiksXG4gICAgICAgICAgbW9kZSxcbiAgICAgICAgICBkaXNwYXRjaDogbGlzdGVuZXJzXG4gICAgICAgIH0pLFxuICAgICAgICBkXG4gICAgICApO1xuICAgIH1cbiAgfTtcblxuICBmdW5jdGlvbiBzdGFydGVkKGV2ZW50KSB7XG4gICAgaWYgKHRvdWNoZW5kaW5nICYmICFldmVudC50b3VjaGVzKSByZXR1cm47XG4gICAgaWYgKCFmaWx0ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSkgcmV0dXJuO1xuXG4gICAgdmFyIHRoYXQgPSB0aGlzLFxuICAgICAgICB0eXBlID0gZXZlbnQudGFyZ2V0Ll9fZGF0YV9fLnR5cGUsXG4gICAgICAgIG1vZGUgPSAoa2V5cyAmJiBldmVudC5tZXRhS2V5ID8gdHlwZSA9IFwib3ZlcmxheVwiIDogdHlwZSkgPT09IFwic2VsZWN0aW9uXCIgPyBNT0RFX0RSQUcgOiAoa2V5cyAmJiBldmVudC5hbHRLZXkgPyBNT0RFX0NFTlRFUiA6IE1PREVfSEFORExFKSxcbiAgICAgICAgc2lnblggPSBkaW0gPT09IFkgPyBudWxsIDogc2lnbnNYW3R5cGVdLFxuICAgICAgICBzaWduWSA9IGRpbSA9PT0gWCA/IG51bGwgOiBzaWduc1lbdHlwZV0sXG4gICAgICAgIHN0YXRlID0gbG9jYWwodGhhdCksXG4gICAgICAgIGV4dGVudCA9IHN0YXRlLmV4dGVudCxcbiAgICAgICAgc2VsZWN0aW9uID0gc3RhdGUuc2VsZWN0aW9uLFxuICAgICAgICBXID0gZXh0ZW50WzBdWzBdLCB3MCwgdzEsXG4gICAgICAgIE4gPSBleHRlbnRbMF1bMV0sIG4wLCBuMSxcbiAgICAgICAgRSA9IGV4dGVudFsxXVswXSwgZTAsIGUxLFxuICAgICAgICBTID0gZXh0ZW50WzFdWzFdLCBzMCwgczEsXG4gICAgICAgIGR4ID0gMCxcbiAgICAgICAgZHkgPSAwLFxuICAgICAgICBtb3ZpbmcsXG4gICAgICAgIHNoaWZ0aW5nID0gc2lnblggJiYgc2lnblkgJiYga2V5cyAmJiBldmVudC5zaGlmdEtleSxcbiAgICAgICAgbG9ja1gsXG4gICAgICAgIGxvY2tZLFxuICAgICAgICBwb2ludHMgPSBBcnJheS5mcm9tKGV2ZW50LnRvdWNoZXMgfHwgW2V2ZW50XSwgdCA9PiB7XG4gICAgICAgICAgY29uc3QgaSA9IHQuaWRlbnRpZmllcjtcbiAgICAgICAgICB0ID0gcG9pbnRlcih0LCB0aGF0KTtcbiAgICAgICAgICB0LnBvaW50MCA9IHQuc2xpY2UoKTtcbiAgICAgICAgICB0LmlkZW50aWZpZXIgPSBpO1xuICAgICAgICAgIHJldHVybiB0O1xuICAgICAgICB9KTtcblxuICAgIGludGVycnVwdCh0aGF0KTtcbiAgICB2YXIgZW1pdCA9IGVtaXR0ZXIodGhhdCwgYXJndW1lbnRzLCB0cnVlKS5iZWZvcmVzdGFydCgpO1xuXG4gICAgaWYgKHR5cGUgPT09IFwib3ZlcmxheVwiKSB7XG4gICAgICBpZiAoc2VsZWN0aW9uKSBtb3ZpbmcgPSB0cnVlO1xuICAgICAgY29uc3QgcHRzID0gW3BvaW50c1swXSwgcG9pbnRzWzFdIHx8IHBvaW50c1swXV07XG4gICAgICBzdGF0ZS5zZWxlY3Rpb24gPSBzZWxlY3Rpb24gPSBbW1xuICAgICAgICAgIHcwID0gZGltID09PSBZID8gVyA6IG1pbihwdHNbMF1bMF0sIHB0c1sxXVswXSksXG4gICAgICAgICAgbjAgPSBkaW0gPT09IFggPyBOIDogbWluKHB0c1swXVsxXSwgcHRzWzFdWzFdKVxuICAgICAgICBdLCBbXG4gICAgICAgICAgZTAgPSBkaW0gPT09IFkgPyBFIDogbWF4KHB0c1swXVswXSwgcHRzWzFdWzBdKSxcbiAgICAgICAgICBzMCA9IGRpbSA9PT0gWCA/IFMgOiBtYXgocHRzWzBdWzFdLCBwdHNbMV1bMV0pXG4gICAgICAgIF1dO1xuICAgICAgaWYgKHBvaW50cy5sZW5ndGggPiAxKSBtb3ZlKGV2ZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdzAgPSBzZWxlY3Rpb25bMF1bMF07XG4gICAgICBuMCA9IHNlbGVjdGlvblswXVsxXTtcbiAgICAgIGUwID0gc2VsZWN0aW9uWzFdWzBdO1xuICAgICAgczAgPSBzZWxlY3Rpb25bMV1bMV07XG4gICAgfVxuXG4gICAgdzEgPSB3MDtcbiAgICBuMSA9IG4wO1xuICAgIGUxID0gZTA7XG4gICAgczEgPSBzMDtcblxuICAgIHZhciBncm91cCA9IHNlbGVjdCh0aGF0KVxuICAgICAgICAuYXR0cihcInBvaW50ZXItZXZlbnRzXCIsIFwibm9uZVwiKTtcblxuICAgIHZhciBvdmVybGF5ID0gZ3JvdXAuc2VsZWN0QWxsKFwiLm92ZXJsYXlcIilcbiAgICAgICAgLmF0dHIoXCJjdXJzb3JcIiwgY3Vyc29yc1t0eXBlXSk7XG5cbiAgICBpZiAoZXZlbnQudG91Y2hlcykge1xuICAgICAgZW1pdC5tb3ZlZCA9IG1vdmVkO1xuICAgICAgZW1pdC5lbmRlZCA9IGVuZGVkO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgdmlldyA9IHNlbGVjdChldmVudC52aWV3KVxuICAgICAgICAgIC5vbihcIm1vdXNlbW92ZS5icnVzaFwiLCBtb3ZlZCwgdHJ1ZSlcbiAgICAgICAgICAub24oXCJtb3VzZXVwLmJydXNoXCIsIGVuZGVkLCB0cnVlKTtcbiAgICAgIGlmIChrZXlzKSB2aWV3XG4gICAgICAgICAgLm9uKFwia2V5ZG93bi5icnVzaFwiLCBrZXlkb3duZWQsIHRydWUpXG4gICAgICAgICAgLm9uKFwia2V5dXAuYnJ1c2hcIiwga2V5dXBwZWQsIHRydWUpXG5cbiAgICAgIGRyYWdEaXNhYmxlKGV2ZW50LnZpZXcpO1xuICAgIH1cblxuICAgIHJlZHJhdy5jYWxsKHRoYXQpO1xuICAgIGVtaXQuc3RhcnQoZXZlbnQsIG1vZGUubmFtZSk7XG5cbiAgICBmdW5jdGlvbiBtb3ZlZChldmVudCkge1xuICAgICAgZm9yIChjb25zdCBwIG9mIGV2ZW50LmNoYW5nZWRUb3VjaGVzIHx8IFtldmVudF0pIHtcbiAgICAgICAgZm9yIChjb25zdCBkIG9mIHBvaW50cylcbiAgICAgICAgICBpZiAoZC5pZGVudGlmaWVyID09PSBwLmlkZW50aWZpZXIpIGQuY3VyID0gcG9pbnRlcihwLCB0aGF0KTtcbiAgICAgIH1cbiAgICAgIGlmIChzaGlmdGluZyAmJiAhbG9ja1ggJiYgIWxvY2tZICYmIHBvaW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgY29uc3QgcG9pbnQgPSBwb2ludHNbMF07XG4gICAgICAgIGlmIChhYnMocG9pbnQuY3VyWzBdIC0gcG9pbnRbMF0pID4gYWJzKHBvaW50LmN1clsxXSAtIHBvaW50WzFdKSlcbiAgICAgICAgICBsb2NrWSA9IHRydWU7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICBsb2NrWCA9IHRydWU7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IHBvaW50IG9mIHBvaW50cylcbiAgICAgICAgaWYgKHBvaW50LmN1cikgcG9pbnRbMF0gPSBwb2ludC5jdXJbMF0sIHBvaW50WzFdID0gcG9pbnQuY3VyWzFdO1xuICAgICAgbW92aW5nID0gdHJ1ZTtcbiAgICAgIG5vZXZlbnQoZXZlbnQpO1xuICAgICAgbW92ZShldmVudCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbW92ZShldmVudCkge1xuICAgICAgY29uc3QgcG9pbnQgPSBwb2ludHNbMF0sIHBvaW50MCA9IHBvaW50LnBvaW50MDtcbiAgICAgIHZhciB0O1xuXG4gICAgICBkeCA9IHBvaW50WzBdIC0gcG9pbnQwWzBdO1xuICAgICAgZHkgPSBwb2ludFsxXSAtIHBvaW50MFsxXTtcblxuICAgICAgc3dpdGNoIChtb2RlKSB7XG4gICAgICAgIGNhc2UgTU9ERV9TUEFDRTpcbiAgICAgICAgY2FzZSBNT0RFX0RSQUc6IHtcbiAgICAgICAgICBpZiAoc2lnblgpIGR4ID0gbWF4KFcgLSB3MCwgbWluKEUgLSBlMCwgZHgpKSwgdzEgPSB3MCArIGR4LCBlMSA9IGUwICsgZHg7XG4gICAgICAgICAgaWYgKHNpZ25ZKSBkeSA9IG1heChOIC0gbjAsIG1pbihTIC0gczAsIGR5KSksIG4xID0gbjAgKyBkeSwgczEgPSBzMCArIGR5O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgTU9ERV9IQU5ETEU6IHtcbiAgICAgICAgICBpZiAocG9pbnRzWzFdKSB7XG4gICAgICAgICAgICBpZiAoc2lnblgpIHcxID0gbWF4KFcsIG1pbihFLCBwb2ludHNbMF1bMF0pKSwgZTEgPSBtYXgoVywgbWluKEUsIHBvaW50c1sxXVswXSkpLCBzaWduWCA9IDE7XG4gICAgICAgICAgICBpZiAoc2lnblkpIG4xID0gbWF4KE4sIG1pbihTLCBwb2ludHNbMF1bMV0pKSwgczEgPSBtYXgoTiwgbWluKFMsIHBvaW50c1sxXVsxXSkpLCBzaWduWSA9IDE7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChzaWduWCA8IDApIGR4ID0gbWF4KFcgLSB3MCwgbWluKEUgLSB3MCwgZHgpKSwgdzEgPSB3MCArIGR4LCBlMSA9IGUwO1xuICAgICAgICAgICAgZWxzZSBpZiAoc2lnblggPiAwKSBkeCA9IG1heChXIC0gZTAsIG1pbihFIC0gZTAsIGR4KSksIHcxID0gdzAsIGUxID0gZTAgKyBkeDtcbiAgICAgICAgICAgIGlmIChzaWduWSA8IDApIGR5ID0gbWF4KE4gLSBuMCwgbWluKFMgLSBuMCwgZHkpKSwgbjEgPSBuMCArIGR5LCBzMSA9IHMwO1xuICAgICAgICAgICAgZWxzZSBpZiAoc2lnblkgPiAwKSBkeSA9IG1heChOIC0gczAsIG1pbihTIC0gczAsIGR5KSksIG4xID0gbjAsIHMxID0gczAgKyBkeTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBNT0RFX0NFTlRFUjoge1xuICAgICAgICAgIGlmIChzaWduWCkgdzEgPSBtYXgoVywgbWluKEUsIHcwIC0gZHggKiBzaWduWCkpLCBlMSA9IG1heChXLCBtaW4oRSwgZTAgKyBkeCAqIHNpZ25YKSk7XG4gICAgICAgICAgaWYgKHNpZ25ZKSBuMSA9IG1heChOLCBtaW4oUywgbjAgLSBkeSAqIHNpZ25ZKSksIHMxID0gbWF4KE4sIG1pbihTLCBzMCArIGR5ICogc2lnblkpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZTEgPCB3MSkge1xuICAgICAgICBzaWduWCAqPSAtMTtcbiAgICAgICAgdCA9IHcwLCB3MCA9IGUwLCBlMCA9IHQ7XG4gICAgICAgIHQgPSB3MSwgdzEgPSBlMSwgZTEgPSB0O1xuICAgICAgICBpZiAodHlwZSBpbiBmbGlwWCkgb3ZlcmxheS5hdHRyKFwiY3Vyc29yXCIsIGN1cnNvcnNbdHlwZSA9IGZsaXBYW3R5cGVdXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzMSA8IG4xKSB7XG4gICAgICAgIHNpZ25ZICo9IC0xO1xuICAgICAgICB0ID0gbjAsIG4wID0gczAsIHMwID0gdDtcbiAgICAgICAgdCA9IG4xLCBuMSA9IHMxLCBzMSA9IHQ7XG4gICAgICAgIGlmICh0eXBlIGluIGZsaXBZKSBvdmVybGF5LmF0dHIoXCJjdXJzb3JcIiwgY3Vyc29yc1t0eXBlID0gZmxpcFlbdHlwZV1dKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXRlLnNlbGVjdGlvbikgc2VsZWN0aW9uID0gc3RhdGUuc2VsZWN0aW9uOyAvLyBNYXkgYmUgc2V0IGJ5IGJydXNoLm1vdmUhXG4gICAgICBpZiAobG9ja1gpIHcxID0gc2VsZWN0aW9uWzBdWzBdLCBlMSA9IHNlbGVjdGlvblsxXVswXTtcbiAgICAgIGlmIChsb2NrWSkgbjEgPSBzZWxlY3Rpb25bMF1bMV0sIHMxID0gc2VsZWN0aW9uWzFdWzFdO1xuXG4gICAgICBpZiAoc2VsZWN0aW9uWzBdWzBdICE9PSB3MVxuICAgICAgICAgIHx8IHNlbGVjdGlvblswXVsxXSAhPT0gbjFcbiAgICAgICAgICB8fCBzZWxlY3Rpb25bMV1bMF0gIT09IGUxXG4gICAgICAgICAgfHwgc2VsZWN0aW9uWzFdWzFdICE9PSBzMSkge1xuICAgICAgICBzdGF0ZS5zZWxlY3Rpb24gPSBbW3cxLCBuMV0sIFtlMSwgczFdXTtcbiAgICAgICAgcmVkcmF3LmNhbGwodGhhdCk7XG4gICAgICAgIGVtaXQuYnJ1c2goZXZlbnQsIG1vZGUubmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZW5kZWQoZXZlbnQpIHtcbiAgICAgIG5vcHJvcGFnYXRpb24oZXZlbnQpO1xuICAgICAgaWYgKGV2ZW50LnRvdWNoZXMpIHtcbiAgICAgICAgaWYgKGV2ZW50LnRvdWNoZXMubGVuZ3RoKSByZXR1cm47XG4gICAgICAgIGlmICh0b3VjaGVuZGluZykgY2xlYXJUaW1lb3V0KHRvdWNoZW5kaW5nKTtcbiAgICAgICAgdG91Y2hlbmRpbmcgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyB0b3VjaGVuZGluZyA9IG51bGw7IH0sIDUwMCk7IC8vIEdob3N0IGNsaWNrcyBhcmUgZGVsYXllZCFcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRyYWdFbmFibGUoZXZlbnQudmlldywgbW92aW5nKTtcbiAgICAgICAgdmlldy5vbihcImtleWRvd24uYnJ1c2gga2V5dXAuYnJ1c2ggbW91c2Vtb3ZlLmJydXNoIG1vdXNldXAuYnJ1c2hcIiwgbnVsbCk7XG4gICAgICB9XG4gICAgICBncm91cC5hdHRyKFwicG9pbnRlci1ldmVudHNcIiwgXCJhbGxcIik7XG4gICAgICBvdmVybGF5LmF0dHIoXCJjdXJzb3JcIiwgY3Vyc29ycy5vdmVybGF5KTtcbiAgICAgIGlmIChzdGF0ZS5zZWxlY3Rpb24pIHNlbGVjdGlvbiA9IHN0YXRlLnNlbGVjdGlvbjsgLy8gTWF5IGJlIHNldCBieSBicnVzaC5tb3ZlIChvbiBzdGFydCkhXG4gICAgICBpZiAoZW1wdHkoc2VsZWN0aW9uKSkgc3RhdGUuc2VsZWN0aW9uID0gbnVsbCwgcmVkcmF3LmNhbGwodGhhdCk7XG4gICAgICBlbWl0LmVuZChldmVudCwgbW9kZS5uYW1lKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBrZXlkb3duZWQoZXZlbnQpIHtcbiAgICAgIHN3aXRjaCAoZXZlbnQua2V5Q29kZSkge1xuICAgICAgICBjYXNlIDE2OiB7IC8vIFNISUZUXG4gICAgICAgICAgc2hpZnRpbmcgPSBzaWduWCAmJiBzaWduWTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIDE4OiB7IC8vIEFMVFxuICAgICAgICAgIGlmIChtb2RlID09PSBNT0RFX0hBTkRMRSkge1xuICAgICAgICAgICAgaWYgKHNpZ25YKSBlMCA9IGUxIC0gZHggKiBzaWduWCwgdzAgPSB3MSArIGR4ICogc2lnblg7XG4gICAgICAgICAgICBpZiAoc2lnblkpIHMwID0gczEgLSBkeSAqIHNpZ25ZLCBuMCA9IG4xICsgZHkgKiBzaWduWTtcbiAgICAgICAgICAgIG1vZGUgPSBNT0RFX0NFTlRFUjtcbiAgICAgICAgICAgIG1vdmUoZXZlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIDMyOiB7IC8vIFNQQUNFOyB0YWtlcyBwcmlvcml0eSBvdmVyIEFMVFxuICAgICAgICAgIGlmIChtb2RlID09PSBNT0RFX0hBTkRMRSB8fCBtb2RlID09PSBNT0RFX0NFTlRFUikge1xuICAgICAgICAgICAgaWYgKHNpZ25YIDwgMCkgZTAgPSBlMSAtIGR4OyBlbHNlIGlmIChzaWduWCA+IDApIHcwID0gdzEgLSBkeDtcbiAgICAgICAgICAgIGlmIChzaWduWSA8IDApIHMwID0gczEgLSBkeTsgZWxzZSBpZiAoc2lnblkgPiAwKSBuMCA9IG4xIC0gZHk7XG4gICAgICAgICAgICBtb2RlID0gTU9ERV9TUEFDRTtcbiAgICAgICAgICAgIG92ZXJsYXkuYXR0cihcImN1cnNvclwiLCBjdXJzb3JzLnNlbGVjdGlvbik7XG4gICAgICAgICAgICBtb3ZlKGV2ZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDogcmV0dXJuO1xuICAgICAgfVxuICAgICAgbm9ldmVudChldmVudCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24ga2V5dXBwZWQoZXZlbnQpIHtcbiAgICAgIHN3aXRjaCAoZXZlbnQua2V5Q29kZSkge1xuICAgICAgICBjYXNlIDE2OiB7IC8vIFNISUZUXG4gICAgICAgICAgaWYgKHNoaWZ0aW5nKSB7XG4gICAgICAgICAgICBsb2NrWCA9IGxvY2tZID0gc2hpZnRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIG1vdmUoZXZlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIDE4OiB7IC8vIEFMVFxuICAgICAgICAgIGlmIChtb2RlID09PSBNT0RFX0NFTlRFUikge1xuICAgICAgICAgICAgaWYgKHNpZ25YIDwgMCkgZTAgPSBlMTsgZWxzZSBpZiAoc2lnblggPiAwKSB3MCA9IHcxO1xuICAgICAgICAgICAgaWYgKHNpZ25ZIDwgMCkgczAgPSBzMTsgZWxzZSBpZiAoc2lnblkgPiAwKSBuMCA9IG4xO1xuICAgICAgICAgICAgbW9kZSA9IE1PREVfSEFORExFO1xuICAgICAgICAgICAgbW92ZShldmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgMzI6IHsgLy8gU1BBQ0VcbiAgICAgICAgICBpZiAobW9kZSA9PT0gTU9ERV9TUEFDRSkge1xuICAgICAgICAgICAgaWYgKGV2ZW50LmFsdEtleSkge1xuICAgICAgICAgICAgICBpZiAoc2lnblgpIGUwID0gZTEgLSBkeCAqIHNpZ25YLCB3MCA9IHcxICsgZHggKiBzaWduWDtcbiAgICAgICAgICAgICAgaWYgKHNpZ25ZKSBzMCA9IHMxIC0gZHkgKiBzaWduWSwgbjAgPSBuMSArIGR5ICogc2lnblk7XG4gICAgICAgICAgICAgIG1vZGUgPSBNT0RFX0NFTlRFUjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmIChzaWduWCA8IDApIGUwID0gZTE7IGVsc2UgaWYgKHNpZ25YID4gMCkgdzAgPSB3MTtcbiAgICAgICAgICAgICAgaWYgKHNpZ25ZIDwgMCkgczAgPSBzMTsgZWxzZSBpZiAoc2lnblkgPiAwKSBuMCA9IG4xO1xuICAgICAgICAgICAgICBtb2RlID0gTU9ERV9IQU5ETEU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvdmVybGF5LmF0dHIoXCJjdXJzb3JcIiwgY3Vyc29yc1t0eXBlXSk7XG4gICAgICAgICAgICBtb3ZlKGV2ZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDogcmV0dXJuO1xuICAgICAgfVxuICAgICAgbm9ldmVudChldmVudCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdG91Y2htb3ZlZChldmVudCkge1xuICAgIGVtaXR0ZXIodGhpcywgYXJndW1lbnRzKS5tb3ZlZChldmVudCk7XG4gIH1cblxuICBmdW5jdGlvbiB0b3VjaGVuZGVkKGV2ZW50KSB7XG4gICAgZW1pdHRlcih0aGlzLCBhcmd1bWVudHMpLmVuZGVkKGV2ZW50KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGluaXRpYWxpemUoKSB7XG4gICAgdmFyIHN0YXRlID0gdGhpcy5fX2JydXNoIHx8IHtzZWxlY3Rpb246IG51bGx9O1xuICAgIHN0YXRlLmV4dGVudCA9IG51bWJlcjIoZXh0ZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICAgIHN0YXRlLmRpbSA9IGRpbTtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICBicnVzaC5leHRlbnQgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZXh0ZW50ID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudChudW1iZXIyKF8pKSwgYnJ1c2gpIDogZXh0ZW50O1xuICB9O1xuXG4gIGJydXNoLmZpbHRlciA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChmaWx0ZXIgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCEhXyksIGJydXNoKSA6IGZpbHRlcjtcbiAgfTtcblxuICBicnVzaC50b3VjaGFibGUgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodG91Y2hhYmxlID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCghIV8pLCBicnVzaCkgOiB0b3VjaGFibGU7XG4gIH07XG5cbiAgYnJ1c2guaGFuZGxlU2l6ZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChoYW5kbGVTaXplID0gK18sIGJydXNoKSA6IGhhbmRsZVNpemU7XG4gIH07XG5cbiAgYnJ1c2gua2V5TW9kaWZpZXJzID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGtleXMgPSAhIV8sIGJydXNoKSA6IGtleXM7XG4gIH07XG5cbiAgYnJ1c2gub24gPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgdmFsdWUgPSBsaXN0ZW5lcnMub24uYXBwbHkobGlzdGVuZXJzLCBhcmd1bWVudHMpO1xuICAgIHJldHVybiB2YWx1ZSA9PT0gbGlzdGVuZXJzID8gYnJ1c2ggOiB2YWx1ZTtcbiAgfTtcblxuICByZXR1cm4gYnJ1c2g7XG59XG4iLCJleHBvcnQge1xuICBkZWZhdWx0IGFzIGJydXNoLFxuICBicnVzaFgsXG4gIGJydXNoWSxcbiAgYnJ1c2hTZWxlY3Rpb25cbn0gZnJvbSBcIi4vYnJ1c2guanNcIjtcbiIsImV4cG9ydCBmdW5jdGlvbiBpbml0UmFuZ2UoZG9tYWluLCByYW5nZSkge1xuICBzd2l0Y2ggKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICBjYXNlIDA6IGJyZWFrO1xuICAgIGNhc2UgMTogdGhpcy5yYW5nZShkb21haW4pOyBicmVhaztcbiAgICBkZWZhdWx0OiB0aGlzLnJhbmdlKHJhbmdlKS5kb21haW4oZG9tYWluKTsgYnJlYWs7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbml0SW50ZXJwb2xhdG9yKGRvbWFpbiwgaW50ZXJwb2xhdG9yKSB7XG4gIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgIGNhc2UgMDogYnJlYWs7XG4gICAgY2FzZSAxOiB7XG4gICAgICBpZiAodHlwZW9mIGRvbWFpbiA9PT0gXCJmdW5jdGlvblwiKSB0aGlzLmludGVycG9sYXRvcihkb21haW4pO1xuICAgICAgZWxzZSB0aGlzLnJhbmdlKGRvbWFpbik7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgdGhpcy5kb21haW4oZG9tYWluKTtcbiAgICAgIGlmICh0eXBlb2YgaW50ZXJwb2xhdG9yID09PSBcImZ1bmN0aW9uXCIpIHRoaXMuaW50ZXJwb2xhdG9yKGludGVycG9sYXRvcik7XG4gICAgICBlbHNlIHRoaXMucmFuZ2UoaW50ZXJwb2xhdG9yKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGhpcztcbn1cbiIsImltcG9ydCB7SW50ZXJuTWFwfSBmcm9tIFwiZDMtYXJyYXlcIjtcbmltcG9ydCB7aW5pdFJhbmdlfSBmcm9tIFwiLi9pbml0LmpzXCI7XG5cbmV4cG9ydCBjb25zdCBpbXBsaWNpdCA9IFN5bWJvbChcImltcGxpY2l0XCIpO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBvcmRpbmFsKCkge1xuICB2YXIgaW5kZXggPSBuZXcgSW50ZXJuTWFwKCksXG4gICAgICBkb21haW4gPSBbXSxcbiAgICAgIHJhbmdlID0gW10sXG4gICAgICB1bmtub3duID0gaW1wbGljaXQ7XG5cbiAgZnVuY3Rpb24gc2NhbGUoZCkge1xuICAgIGxldCBpID0gaW5kZXguZ2V0KGQpO1xuICAgIGlmIChpID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh1bmtub3duICE9PSBpbXBsaWNpdCkgcmV0dXJuIHVua25vd247XG4gICAgICBpbmRleC5zZXQoZCwgaSA9IGRvbWFpbi5wdXNoKGQpIC0gMSk7XG4gICAgfVxuICAgIHJldHVybiByYW5nZVtpICUgcmFuZ2UubGVuZ3RoXTtcbiAgfVxuXG4gIHNjYWxlLmRvbWFpbiA9IGZ1bmN0aW9uKF8pIHtcbiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBkb21haW4uc2xpY2UoKTtcbiAgICBkb21haW4gPSBbXSwgaW5kZXggPSBuZXcgSW50ZXJuTWFwKCk7XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiBfKSB7XG4gICAgICBpZiAoaW5kZXguaGFzKHZhbHVlKSkgY29udGludWU7XG4gICAgICBpbmRleC5zZXQodmFsdWUsIGRvbWFpbi5wdXNoKHZhbHVlKSAtIDEpO1xuICAgIH1cbiAgICByZXR1cm4gc2NhbGU7XG4gIH07XG5cbiAgc2NhbGUucmFuZ2UgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocmFuZ2UgPSBBcnJheS5mcm9tKF8pLCBzY2FsZSkgOiByYW5nZS5zbGljZSgpO1xuICB9O1xuXG4gIHNjYWxlLnVua25vd24gPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodW5rbm93biA9IF8sIHNjYWxlKSA6IHVua25vd247XG4gIH07XG5cbiAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBvcmRpbmFsKGRvbWFpbiwgcmFuZ2UpLnVua25vd24odW5rbm93bik7XG4gIH07XG5cbiAgaW5pdFJhbmdlLmFwcGx5KHNjYWxlLCBhcmd1bWVudHMpO1xuXG4gIHJldHVybiBzY2FsZTtcbn1cbiIsImltcG9ydCB7cmFuZ2UgYXMgc2VxdWVuY2V9IGZyb20gXCJkMy1hcnJheVwiO1xuaW1wb3J0IHtpbml0UmFuZ2V9IGZyb20gXCIuL2luaXQuanNcIjtcbmltcG9ydCBvcmRpbmFsIGZyb20gXCIuL29yZGluYWwuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYmFuZCgpIHtcbiAgdmFyIHNjYWxlID0gb3JkaW5hbCgpLnVua25vd24odW5kZWZpbmVkKSxcbiAgICAgIGRvbWFpbiA9IHNjYWxlLmRvbWFpbixcbiAgICAgIG9yZGluYWxSYW5nZSA9IHNjYWxlLnJhbmdlLFxuICAgICAgcjAgPSAwLFxuICAgICAgcjEgPSAxLFxuICAgICAgc3RlcCxcbiAgICAgIGJhbmR3aWR0aCxcbiAgICAgIHJvdW5kID0gZmFsc2UsXG4gICAgICBwYWRkaW5nSW5uZXIgPSAwLFxuICAgICAgcGFkZGluZ091dGVyID0gMCxcbiAgICAgIGFsaWduID0gMC41O1xuXG4gIGRlbGV0ZSBzY2FsZS51bmtub3duO1xuXG4gIGZ1bmN0aW9uIHJlc2NhbGUoKSB7XG4gICAgdmFyIG4gPSBkb21haW4oKS5sZW5ndGgsXG4gICAgICAgIHJldmVyc2UgPSByMSA8IHIwLFxuICAgICAgICBzdGFydCA9IHJldmVyc2UgPyByMSA6IHIwLFxuICAgICAgICBzdG9wID0gcmV2ZXJzZSA/IHIwIDogcjE7XG4gICAgc3RlcCA9IChzdG9wIC0gc3RhcnQpIC8gTWF0aC5tYXgoMSwgbiAtIHBhZGRpbmdJbm5lciArIHBhZGRpbmdPdXRlciAqIDIpO1xuICAgIGlmIChyb3VuZCkgc3RlcCA9IE1hdGguZmxvb3Ioc3RlcCk7XG4gICAgc3RhcnQgKz0gKHN0b3AgLSBzdGFydCAtIHN0ZXAgKiAobiAtIHBhZGRpbmdJbm5lcikpICogYWxpZ247XG4gICAgYmFuZHdpZHRoID0gc3RlcCAqICgxIC0gcGFkZGluZ0lubmVyKTtcbiAgICBpZiAocm91bmQpIHN0YXJ0ID0gTWF0aC5yb3VuZChzdGFydCksIGJhbmR3aWR0aCA9IE1hdGgucm91bmQoYmFuZHdpZHRoKTtcbiAgICB2YXIgdmFsdWVzID0gc2VxdWVuY2UobikubWFwKGZ1bmN0aW9uKGkpIHsgcmV0dXJuIHN0YXJ0ICsgc3RlcCAqIGk7IH0pO1xuICAgIHJldHVybiBvcmRpbmFsUmFuZ2UocmV2ZXJzZSA/IHZhbHVlcy5yZXZlcnNlKCkgOiB2YWx1ZXMpO1xuICB9XG5cbiAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRvbWFpbihfKSwgcmVzY2FsZSgpKSA6IGRvbWFpbigpO1xuICB9O1xuXG4gIHNjYWxlLnJhbmdlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKFtyMCwgcjFdID0gXywgcjAgPSArcjAsIHIxID0gK3IxLCByZXNjYWxlKCkpIDogW3IwLCByMV07XG4gIH07XG5cbiAgc2NhbGUucmFuZ2VSb3VuZCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gW3IwLCByMV0gPSBfLCByMCA9ICtyMCwgcjEgPSArcjEsIHJvdW5kID0gdHJ1ZSwgcmVzY2FsZSgpO1xuICB9O1xuXG4gIHNjYWxlLmJhbmR3aWR0aCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBiYW5kd2lkdGg7XG4gIH07XG5cbiAgc2NhbGUuc3RlcCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBzdGVwO1xuICB9O1xuXG4gIHNjYWxlLnJvdW5kID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHJvdW5kID0gISFfLCByZXNjYWxlKCkpIDogcm91bmQ7XG4gIH07XG5cbiAgc2NhbGUucGFkZGluZyA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYWRkaW5nSW5uZXIgPSBNYXRoLm1pbigxLCBwYWRkaW5nT3V0ZXIgPSArXyksIHJlc2NhbGUoKSkgOiBwYWRkaW5nSW5uZXI7XG4gIH07XG5cbiAgc2NhbGUucGFkZGluZ0lubmVyID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBhZGRpbmdJbm5lciA9IE1hdGgubWluKDEsIF8pLCByZXNjYWxlKCkpIDogcGFkZGluZ0lubmVyO1xuICB9O1xuXG4gIHNjYWxlLnBhZGRpbmdPdXRlciA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYWRkaW5nT3V0ZXIgPSArXywgcmVzY2FsZSgpKSA6IHBhZGRpbmdPdXRlcjtcbiAgfTtcblxuICBzY2FsZS5hbGlnbiA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChhbGlnbiA9IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIF8pKSwgcmVzY2FsZSgpKSA6IGFsaWduO1xuICB9O1xuXG4gIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gYmFuZChkb21haW4oKSwgW3IwLCByMV0pXG4gICAgICAgIC5yb3VuZChyb3VuZClcbiAgICAgICAgLnBhZGRpbmdJbm5lcihwYWRkaW5nSW5uZXIpXG4gICAgICAgIC5wYWRkaW5nT3V0ZXIocGFkZGluZ091dGVyKVxuICAgICAgICAuYWxpZ24oYWxpZ24pO1xuICB9O1xuXG4gIHJldHVybiBpbml0UmFuZ2UuYXBwbHkocmVzY2FsZSgpLCBhcmd1bWVudHMpO1xufVxuXG5mdW5jdGlvbiBwb2ludGlzaChzY2FsZSkge1xuICB2YXIgY29weSA9IHNjYWxlLmNvcHk7XG5cbiAgc2NhbGUucGFkZGluZyA9IHNjYWxlLnBhZGRpbmdPdXRlcjtcbiAgZGVsZXRlIHNjYWxlLnBhZGRpbmdJbm5lcjtcbiAgZGVsZXRlIHNjYWxlLnBhZGRpbmdPdXRlcjtcblxuICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHBvaW50aXNoKGNvcHkoKSk7XG4gIH07XG5cbiAgcmV0dXJuIHNjYWxlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcG9pbnQoKSB7XG4gIHJldHVybiBwb2ludGlzaChiYW5kLmFwcGx5KG51bGwsIGFyZ3VtZW50cykucGFkZGluZ0lubmVyKDEpKTtcbn1cbiIsImNvbnN0IGUxMCA9IE1hdGguc3FydCg1MCksXG4gICAgZTUgPSBNYXRoLnNxcnQoMTApLFxuICAgIGUyID0gTWF0aC5zcXJ0KDIpO1xuXG5mdW5jdGlvbiB0aWNrU3BlYyhzdGFydCwgc3RvcCwgY291bnQpIHtcbiAgY29uc3Qgc3RlcCA9IChzdG9wIC0gc3RhcnQpIC8gTWF0aC5tYXgoMCwgY291bnQpLFxuICAgICAgcG93ZXIgPSBNYXRoLmZsb29yKE1hdGgubG9nMTAoc3RlcCkpLFxuICAgICAgZXJyb3IgPSBzdGVwIC8gTWF0aC5wb3coMTAsIHBvd2VyKSxcbiAgICAgIGZhY3RvciA9IGVycm9yID49IGUxMCA/IDEwIDogZXJyb3IgPj0gZTUgPyA1IDogZXJyb3IgPj0gZTIgPyAyIDogMTtcbiAgbGV0IGkxLCBpMiwgaW5jO1xuICBpZiAocG93ZXIgPCAwKSB7XG4gICAgaW5jID0gTWF0aC5wb3coMTAsIC1wb3dlcikgLyBmYWN0b3I7XG4gICAgaTEgPSBNYXRoLnJvdW5kKHN0YXJ0ICogaW5jKTtcbiAgICBpMiA9IE1hdGgucm91bmQoc3RvcCAqIGluYyk7XG4gICAgaWYgKGkxIC8gaW5jIDwgc3RhcnQpICsraTE7XG4gICAgaWYgKGkyIC8gaW5jID4gc3RvcCkgLS1pMjtcbiAgICBpbmMgPSAtaW5jO1xuICB9IGVsc2Uge1xuICAgIGluYyA9IE1hdGgucG93KDEwLCBwb3dlcikgKiBmYWN0b3I7XG4gICAgaTEgPSBNYXRoLnJvdW5kKHN0YXJ0IC8gaW5jKTtcbiAgICBpMiA9IE1hdGgucm91bmQoc3RvcCAvIGluYyk7XG4gICAgaWYgKGkxICogaW5jIDwgc3RhcnQpICsraTE7XG4gICAgaWYgKGkyICogaW5jID4gc3RvcCkgLS1pMjtcbiAgfVxuICBpZiAoaTIgPCBpMSAmJiAwLjUgPD0gY291bnQgJiYgY291bnQgPCAyKSByZXR1cm4gdGlja1NwZWMoc3RhcnQsIHN0b3AsIGNvdW50ICogMik7XG4gIHJldHVybiBbaTEsIGkyLCBpbmNdO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0aWNrcyhzdGFydCwgc3RvcCwgY291bnQpIHtcbiAgc3RvcCA9ICtzdG9wLCBzdGFydCA9ICtzdGFydCwgY291bnQgPSArY291bnQ7XG4gIGlmICghKGNvdW50ID4gMCkpIHJldHVybiBbXTtcbiAgaWYgKHN0YXJ0ID09PSBzdG9wKSByZXR1cm4gW3N0YXJ0XTtcbiAgY29uc3QgcmV2ZXJzZSA9IHN0b3AgPCBzdGFydCwgW2kxLCBpMiwgaW5jXSA9IHJldmVyc2UgPyB0aWNrU3BlYyhzdG9wLCBzdGFydCwgY291bnQpIDogdGlja1NwZWMoc3RhcnQsIHN0b3AsIGNvdW50KTtcbiAgaWYgKCEoaTIgPj0gaTEpKSByZXR1cm4gW107XG4gIGNvbnN0IG4gPSBpMiAtIGkxICsgMSwgdGlja3MgPSBuZXcgQXJyYXkobik7XG4gIGlmIChyZXZlcnNlKSB7XG4gICAgaWYgKGluYyA8IDApIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgKytpKSB0aWNrc1tpXSA9IChpMiAtIGkpIC8gLWluYztcbiAgICBlbHNlIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgKytpKSB0aWNrc1tpXSA9IChpMiAtIGkpICogaW5jO1xuICB9IGVsc2Uge1xuICAgIGlmIChpbmMgPCAwKSBmb3IgKGxldCBpID0gMDsgaSA8IG47ICsraSkgdGlja3NbaV0gPSAoaTEgKyBpKSAvIC1pbmM7XG4gICAgZWxzZSBmb3IgKGxldCBpID0gMDsgaSA8IG47ICsraSkgdGlja3NbaV0gPSAoaTEgKyBpKSAqIGluYztcbiAgfVxuICByZXR1cm4gdGlja3M7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0aWNrSW5jcmVtZW50KHN0YXJ0LCBzdG9wLCBjb3VudCkge1xuICBzdG9wID0gK3N0b3AsIHN0YXJ0ID0gK3N0YXJ0LCBjb3VudCA9ICtjb3VudDtcbiAgcmV0dXJuIHRpY2tTcGVjKHN0YXJ0LCBzdG9wLCBjb3VudClbMl07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0aWNrU3RlcChzdGFydCwgc3RvcCwgY291bnQpIHtcbiAgc3RvcCA9ICtzdG9wLCBzdGFydCA9ICtzdGFydCwgY291bnQgPSArY291bnQ7XG4gIGNvbnN0IHJldmVyc2UgPSBzdG9wIDwgc3RhcnQsIGluYyA9IHJldmVyc2UgPyB0aWNrSW5jcmVtZW50KHN0b3AsIHN0YXJ0LCBjb3VudCkgOiB0aWNrSW5jcmVtZW50KHN0YXJ0LCBzdG9wLCBjb3VudCk7XG4gIHJldHVybiAocmV2ZXJzZSA/IC0xIDogMSkgKiAoaW5jIDwgMCA/IDEgLyAtaW5jIDogaW5jKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGFzY2VuZGluZyhhLCBiKSB7XG4gIHJldHVybiBhID09IG51bGwgfHwgYiA9PSBudWxsID8gTmFOIDogYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IGEgPj0gYiA/IDAgOiBOYU47XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkZXNjZW5kaW5nKGEsIGIpIHtcbiAgcmV0dXJuIGEgPT0gbnVsbCB8fCBiID09IG51bGwgPyBOYU5cbiAgICA6IGIgPCBhID8gLTFcbiAgICA6IGIgPiBhID8gMVxuICAgIDogYiA+PSBhID8gMFxuICAgIDogTmFOO1xufVxuIiwiaW1wb3J0IGFzY2VuZGluZyBmcm9tIFwiLi9hc2NlbmRpbmcuanNcIjtcbmltcG9ydCBkZXNjZW5kaW5nIGZyb20gXCIuL2Rlc2NlbmRpbmcuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYmlzZWN0b3IoZikge1xuICBsZXQgY29tcGFyZTEsIGNvbXBhcmUyLCBkZWx0YTtcblxuICAvLyBJZiBhbiBhY2Nlc3NvciBpcyBzcGVjaWZpZWQsIHByb21vdGUgaXQgdG8gYSBjb21wYXJhdG9yLiBJbiB0aGlzIGNhc2Ugd2VcbiAgLy8gY2FuIHRlc3Qgd2hldGhlciB0aGUgc2VhcmNoIHZhbHVlIGlzIChzZWxmLSkgY29tcGFyYWJsZS4gV2UgY2Fu4oCZdCBkbyB0aGlzXG4gIC8vIGZvciBhIGNvbXBhcmF0b3IgKGV4Y2VwdCBmb3Igc3BlY2lmaWMsIGtub3duIGNvbXBhcmF0b3JzKSBiZWNhdXNlIHdlIGNhbuKAmXRcbiAgLy8gdGVsbCBpZiB0aGUgY29tcGFyYXRvciBpcyBzeW1tZXRyaWMsIGFuZCBhbiBhc3ltbWV0cmljIGNvbXBhcmF0b3IgY2Fu4oCZdCBiZVxuICAvLyB1c2VkIHRvIHRlc3Qgd2hldGhlciBhIHNpbmdsZSB2YWx1ZSBpcyBjb21wYXJhYmxlLlxuICBpZiAoZi5sZW5ndGggIT09IDIpIHtcbiAgICBjb21wYXJlMSA9IGFzY2VuZGluZztcbiAgICBjb21wYXJlMiA9IChkLCB4KSA9PiBhc2NlbmRpbmcoZihkKSwgeCk7XG4gICAgZGVsdGEgPSAoZCwgeCkgPT4gZihkKSAtIHg7XG4gIH0gZWxzZSB7XG4gICAgY29tcGFyZTEgPSBmID09PSBhc2NlbmRpbmcgfHwgZiA9PT0gZGVzY2VuZGluZyA/IGYgOiB6ZXJvO1xuICAgIGNvbXBhcmUyID0gZjtcbiAgICBkZWx0YSA9IGY7XG4gIH1cblxuICBmdW5jdGlvbiBsZWZ0KGEsIHgsIGxvID0gMCwgaGkgPSBhLmxlbmd0aCkge1xuICAgIGlmIChsbyA8IGhpKSB7XG4gICAgICBpZiAoY29tcGFyZTEoeCwgeCkgIT09IDApIHJldHVybiBoaTtcbiAgICAgIGRvIHtcbiAgICAgICAgY29uc3QgbWlkID0gKGxvICsgaGkpID4+PiAxO1xuICAgICAgICBpZiAoY29tcGFyZTIoYVttaWRdLCB4KSA8IDApIGxvID0gbWlkICsgMTtcbiAgICAgICAgZWxzZSBoaSA9IG1pZDtcbiAgICAgIH0gd2hpbGUgKGxvIDwgaGkpO1xuICAgIH1cbiAgICByZXR1cm4gbG87XG4gIH1cblxuICBmdW5jdGlvbiByaWdodChhLCB4LCBsbyA9IDAsIGhpID0gYS5sZW5ndGgpIHtcbiAgICBpZiAobG8gPCBoaSkge1xuICAgICAgaWYgKGNvbXBhcmUxKHgsIHgpICE9PSAwKSByZXR1cm4gaGk7XG4gICAgICBkbyB7XG4gICAgICAgIGNvbnN0IG1pZCA9IChsbyArIGhpKSA+Pj4gMTtcbiAgICAgICAgaWYgKGNvbXBhcmUyKGFbbWlkXSwgeCkgPD0gMCkgbG8gPSBtaWQgKyAxO1xuICAgICAgICBlbHNlIGhpID0gbWlkO1xuICAgICAgfSB3aGlsZSAobG8gPCBoaSk7XG4gICAgfVxuICAgIHJldHVybiBsbztcbiAgfVxuXG4gIGZ1bmN0aW9uIGNlbnRlcihhLCB4LCBsbyA9IDAsIGhpID0gYS5sZW5ndGgpIHtcbiAgICBjb25zdCBpID0gbGVmdChhLCB4LCBsbywgaGkgLSAxKTtcbiAgICByZXR1cm4gaSA+IGxvICYmIGRlbHRhKGFbaSAtIDFdLCB4KSA+IC1kZWx0YShhW2ldLCB4KSA/IGkgLSAxIDogaTtcbiAgfVxuXG4gIHJldHVybiB7bGVmdCwgY2VudGVyLCByaWdodH07XG59XG5cbmZ1bmN0aW9uIHplcm8oKSB7XG4gIHJldHVybiAwO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbnVtYmVyKHgpIHtcbiAgcmV0dXJuIHggPT09IG51bGwgPyBOYU4gOiAreDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uKiBudW1iZXJzKHZhbHVlcywgdmFsdWVvZikge1xuICBpZiAodmFsdWVvZiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiAodmFsdWUgPSArdmFsdWUpID49IHZhbHVlKSB7XG4gICAgICAgIHlpZWxkIHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsZXQgaW5kZXggPSAtMTtcbiAgICBmb3IgKGxldCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgIGlmICgodmFsdWUgPSB2YWx1ZW9mKHZhbHVlLCArK2luZGV4LCB2YWx1ZXMpKSAhPSBudWxsICYmICh2YWx1ZSA9ICt2YWx1ZSkgPj0gdmFsdWUpIHtcbiAgICAgICAgeWllbGQgdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgYXNjZW5kaW5nIGZyb20gXCIuL2FzY2VuZGluZy5qc1wiO1xuaW1wb3J0IGJpc2VjdG9yIGZyb20gXCIuL2Jpc2VjdG9yLmpzXCI7XG5pbXBvcnQgbnVtYmVyIGZyb20gXCIuL251bWJlci5qc1wiO1xuXG5jb25zdCBhc2NlbmRpbmdCaXNlY3QgPSBiaXNlY3Rvcihhc2NlbmRpbmcpO1xuZXhwb3J0IGNvbnN0IGJpc2VjdFJpZ2h0ID0gYXNjZW5kaW5nQmlzZWN0LnJpZ2h0O1xuZXhwb3J0IGNvbnN0IGJpc2VjdExlZnQgPSBhc2NlbmRpbmdCaXNlY3QubGVmdDtcbmV4cG9ydCBjb25zdCBiaXNlY3RDZW50ZXIgPSBiaXNlY3RvcihudW1iZXIpLmNlbnRlcjtcbmV4cG9ydCBkZWZhdWx0IGJpc2VjdFJpZ2h0O1xuIiwiaW1wb3J0IHZhbHVlIGZyb20gXCIuL3ZhbHVlLmpzXCI7XG5pbXBvcnQgbnVtYmVyQXJyYXksIHtpc051bWJlckFycmF5fSBmcm9tIFwiLi9udW1iZXJBcnJheS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhLCBiKSB7XG4gIHJldHVybiAoaXNOdW1iZXJBcnJheShiKSA/IG51bWJlckFycmF5IDogZ2VuZXJpY0FycmF5KShhLCBiKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyaWNBcnJheShhLCBiKSB7XG4gIHZhciBuYiA9IGIgPyBiLmxlbmd0aCA6IDAsXG4gICAgICBuYSA9IGEgPyBNYXRoLm1pbihuYiwgYS5sZW5ndGgpIDogMCxcbiAgICAgIHggPSBuZXcgQXJyYXkobmEpLFxuICAgICAgYyA9IG5ldyBBcnJheShuYiksXG4gICAgICBpO1xuXG4gIGZvciAoaSA9IDA7IGkgPCBuYTsgKytpKSB4W2ldID0gdmFsdWUoYVtpXSwgYltpXSk7XG4gIGZvciAoOyBpIDwgbmI7ICsraSkgY1tpXSA9IGJbaV07XG5cbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbmE7ICsraSkgY1tpXSA9IHhbaV0odCk7XG4gICAgcmV0dXJuIGM7XG4gIH07XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhLCBiKSB7XG4gIHZhciBkID0gbmV3IERhdGU7XG4gIHJldHVybiBhID0gK2EsIGIgPSArYiwgZnVuY3Rpb24odCkge1xuICAgIHJldHVybiBkLnNldFRpbWUoYSAqICgxIC0gdCkgKyBiICogdCksIGQ7XG4gIH07XG59XG4iLCJpbXBvcnQgdmFsdWUgZnJvbSBcIi4vdmFsdWUuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYSwgYikge1xuICB2YXIgaSA9IHt9LFxuICAgICAgYyA9IHt9LFxuICAgICAgaztcblxuICBpZiAoYSA9PT0gbnVsbCB8fCB0eXBlb2YgYSAhPT0gXCJvYmplY3RcIikgYSA9IHt9O1xuICBpZiAoYiA9PT0gbnVsbCB8fCB0eXBlb2YgYiAhPT0gXCJvYmplY3RcIikgYiA9IHt9O1xuXG4gIGZvciAoayBpbiBiKSB7XG4gICAgaWYgKGsgaW4gYSkge1xuICAgICAgaVtrXSA9IHZhbHVlKGFba10sIGJba10pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjW2tdID0gYltrXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIGZvciAoayBpbiBpKSBjW2tdID0gaVtrXSh0KTtcbiAgICByZXR1cm4gYztcbiAgfTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGEsIGIpIHtcbiAgaWYgKCFiKSBiID0gW107XG4gIHZhciBuID0gYSA/IE1hdGgubWluKGIubGVuZ3RoLCBhLmxlbmd0aCkgOiAwLFxuICAgICAgYyA9IGIuc2xpY2UoKSxcbiAgICAgIGk7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgY1tpXSA9IGFbaV0gKiAoMSAtIHQpICsgYltpXSAqIHQ7XG4gICAgcmV0dXJuIGM7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc051bWJlckFycmF5KHgpIHtcbiAgcmV0dXJuIEFycmF5QnVmZmVyLmlzVmlldyh4KSAmJiAhKHggaW5zdGFuY2VvZiBEYXRhVmlldyk7XG59XG4iLCJpbXBvcnQge2NvbG9yfSBmcm9tIFwiZDMtY29sb3JcIjtcbmltcG9ydCByZ2IgZnJvbSBcIi4vcmdiLmpzXCI7XG5pbXBvcnQge2dlbmVyaWNBcnJheX0gZnJvbSBcIi4vYXJyYXkuanNcIjtcbmltcG9ydCBkYXRlIGZyb20gXCIuL2RhdGUuanNcIjtcbmltcG9ydCBudW1iZXIgZnJvbSBcIi4vbnVtYmVyLmpzXCI7XG5pbXBvcnQgb2JqZWN0IGZyb20gXCIuL29iamVjdC5qc1wiO1xuaW1wb3J0IHN0cmluZyBmcm9tIFwiLi9zdHJpbmcuanNcIjtcbmltcG9ydCBjb25zdGFudCBmcm9tIFwiLi9jb25zdGFudC5qc1wiO1xuaW1wb3J0IG51bWJlckFycmF5LCB7aXNOdW1iZXJBcnJheX0gZnJvbSBcIi4vbnVtYmVyQXJyYXkuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYSwgYikge1xuICB2YXIgdCA9IHR5cGVvZiBiLCBjO1xuICByZXR1cm4gYiA9PSBudWxsIHx8IHQgPT09IFwiYm9vbGVhblwiID8gY29uc3RhbnQoYilcbiAgICAgIDogKHQgPT09IFwibnVtYmVyXCIgPyBudW1iZXJcbiAgICAgIDogdCA9PT0gXCJzdHJpbmdcIiA/ICgoYyA9IGNvbG9yKGIpKSA/IChiID0gYywgcmdiKSA6IHN0cmluZylcbiAgICAgIDogYiBpbnN0YW5jZW9mIGNvbG9yID8gcmdiXG4gICAgICA6IGIgaW5zdGFuY2VvZiBEYXRlID8gZGF0ZVxuICAgICAgOiBpc051bWJlckFycmF5KGIpID8gbnVtYmVyQXJyYXlcbiAgICAgIDogQXJyYXkuaXNBcnJheShiKSA/IGdlbmVyaWNBcnJheVxuICAgICAgOiB0eXBlb2YgYi52YWx1ZU9mICE9PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIGIudG9TdHJpbmcgIT09IFwiZnVuY3Rpb25cIiB8fCBpc05hTihiKSA/IG9iamVjdFxuICAgICAgOiBudW1iZXIpKGEsIGIpO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYSwgYikge1xuICByZXR1cm4gYSA9ICthLCBiID0gK2IsIGZ1bmN0aW9uKHQpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChhICogKDEgLSB0KSArIGIgKiB0KTtcbiAgfTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbnN0YW50cyh4KSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4geDtcbiAgfTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG51bWJlcih4KSB7XG4gIHJldHVybiAreDtcbn1cbiIsImltcG9ydCB7YmlzZWN0fSBmcm9tIFwiZDMtYXJyYXlcIjtcbmltcG9ydCB7aW50ZXJwb2xhdGUgYXMgaW50ZXJwb2xhdGVWYWx1ZSwgaW50ZXJwb2xhdGVOdW1iZXIsIGludGVycG9sYXRlUm91bmR9IGZyb20gXCJkMy1pbnRlcnBvbGF0ZVwiO1xuaW1wb3J0IGNvbnN0YW50IGZyb20gXCIuL2NvbnN0YW50LmpzXCI7XG5pbXBvcnQgbnVtYmVyIGZyb20gXCIuL251bWJlci5qc1wiO1xuXG52YXIgdW5pdCA9IFswLCAxXTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlkZW50aXR5KHgpIHtcbiAgcmV0dXJuIHg7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZShhLCBiKSB7XG4gIHJldHVybiAoYiAtPSAoYSA9ICthKSlcbiAgICAgID8gZnVuY3Rpb24oeCkgeyByZXR1cm4gKHggLSBhKSAvIGI7IH1cbiAgICAgIDogY29uc3RhbnQoaXNOYU4oYikgPyBOYU4gOiAwLjUpO1xufVxuXG5mdW5jdGlvbiBjbGFtcGVyKGEsIGIpIHtcbiAgdmFyIHQ7XG4gIGlmIChhID4gYikgdCA9IGEsIGEgPSBiLCBiID0gdDtcbiAgcmV0dXJuIGZ1bmN0aW9uKHgpIHsgcmV0dXJuIE1hdGgubWF4KGEsIE1hdGgubWluKGIsIHgpKTsgfTtcbn1cblxuLy8gbm9ybWFsaXplKGEsIGIpKHgpIHRha2VzIGEgZG9tYWluIHZhbHVlIHggaW4gW2EsYl0gYW5kIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgcGFyYW1ldGVyIHQgaW4gWzAsMV0uXG4vLyBpbnRlcnBvbGF0ZShhLCBiKSh0KSB0YWtlcyBhIHBhcmFtZXRlciB0IGluIFswLDFdIGFuZCByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIHJhbmdlIHZhbHVlIHggaW4gW2EsYl0uXG5mdW5jdGlvbiBiaW1hcChkb21haW4sIHJhbmdlLCBpbnRlcnBvbGF0ZSkge1xuICB2YXIgZDAgPSBkb21haW5bMF0sIGQxID0gZG9tYWluWzFdLCByMCA9IHJhbmdlWzBdLCByMSA9IHJhbmdlWzFdO1xuICBpZiAoZDEgPCBkMCkgZDAgPSBub3JtYWxpemUoZDEsIGQwKSwgcjAgPSBpbnRlcnBvbGF0ZShyMSwgcjApO1xuICBlbHNlIGQwID0gbm9ybWFsaXplKGQwLCBkMSksIHIwID0gaW50ZXJwb2xhdGUocjAsIHIxKTtcbiAgcmV0dXJuIGZ1bmN0aW9uKHgpIHsgcmV0dXJuIHIwKGQwKHgpKTsgfTtcbn1cblxuZnVuY3Rpb24gcG9seW1hcChkb21haW4sIHJhbmdlLCBpbnRlcnBvbGF0ZSkge1xuICB2YXIgaiA9IE1hdGgubWluKGRvbWFpbi5sZW5ndGgsIHJhbmdlLmxlbmd0aCkgLSAxLFxuICAgICAgZCA9IG5ldyBBcnJheShqKSxcbiAgICAgIHIgPSBuZXcgQXJyYXkoaiksXG4gICAgICBpID0gLTE7XG5cbiAgLy8gUmV2ZXJzZSBkZXNjZW5kaW5nIGRvbWFpbnMuXG4gIGlmIChkb21haW5bal0gPCBkb21haW5bMF0pIHtcbiAgICBkb21haW4gPSBkb21haW4uc2xpY2UoKS5yZXZlcnNlKCk7XG4gICAgcmFuZ2UgPSByYW5nZS5zbGljZSgpLnJldmVyc2UoKTtcbiAgfVxuXG4gIHdoaWxlICgrK2kgPCBqKSB7XG4gICAgZFtpXSA9IG5vcm1hbGl6ZShkb21haW5baV0sIGRvbWFpbltpICsgMV0pO1xuICAgIHJbaV0gPSBpbnRlcnBvbGF0ZShyYW5nZVtpXSwgcmFuZ2VbaSArIDFdKTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbih4KSB7XG4gICAgdmFyIGkgPSBiaXNlY3QoZG9tYWluLCB4LCAxLCBqKSAtIDE7XG4gICAgcmV0dXJuIHJbaV0oZFtpXSh4KSk7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb3B5KHNvdXJjZSwgdGFyZ2V0KSB7XG4gIHJldHVybiB0YXJnZXRcbiAgICAgIC5kb21haW4oc291cmNlLmRvbWFpbigpKVxuICAgICAgLnJhbmdlKHNvdXJjZS5yYW5nZSgpKVxuICAgICAgLmludGVycG9sYXRlKHNvdXJjZS5pbnRlcnBvbGF0ZSgpKVxuICAgICAgLmNsYW1wKHNvdXJjZS5jbGFtcCgpKVxuICAgICAgLnVua25vd24oc291cmNlLnVua25vd24oKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1lcigpIHtcbiAgdmFyIGRvbWFpbiA9IHVuaXQsXG4gICAgICByYW5nZSA9IHVuaXQsXG4gICAgICBpbnRlcnBvbGF0ZSA9IGludGVycG9sYXRlVmFsdWUsXG4gICAgICB0cmFuc2Zvcm0sXG4gICAgICB1bnRyYW5zZm9ybSxcbiAgICAgIHVua25vd24sXG4gICAgICBjbGFtcCA9IGlkZW50aXR5LFxuICAgICAgcGllY2V3aXNlLFxuICAgICAgb3V0cHV0LFxuICAgICAgaW5wdXQ7XG5cbiAgZnVuY3Rpb24gcmVzY2FsZSgpIHtcbiAgICB2YXIgbiA9IE1hdGgubWluKGRvbWFpbi5sZW5ndGgsIHJhbmdlLmxlbmd0aCk7XG4gICAgaWYgKGNsYW1wICE9PSBpZGVudGl0eSkgY2xhbXAgPSBjbGFtcGVyKGRvbWFpblswXSwgZG9tYWluW24gLSAxXSk7XG4gICAgcGllY2V3aXNlID0gbiA+IDIgPyBwb2x5bWFwIDogYmltYXA7XG4gICAgb3V0cHV0ID0gaW5wdXQgPSBudWxsO1xuICAgIHJldHVybiBzY2FsZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNjYWxlKHgpIHtcbiAgICByZXR1cm4geCA9PSBudWxsIHx8IGlzTmFOKHggPSAreCkgPyB1bmtub3duIDogKG91dHB1dCB8fCAob3V0cHV0ID0gcGllY2V3aXNlKGRvbWFpbi5tYXAodHJhbnNmb3JtKSwgcmFuZ2UsIGludGVycG9sYXRlKSkpKHRyYW5zZm9ybShjbGFtcCh4KSkpO1xuICB9XG5cbiAgc2NhbGUuaW52ZXJ0ID0gZnVuY3Rpb24oeSkge1xuICAgIHJldHVybiBjbGFtcCh1bnRyYW5zZm9ybSgoaW5wdXQgfHwgKGlucHV0ID0gcGllY2V3aXNlKHJhbmdlLCBkb21haW4ubWFwKHRyYW5zZm9ybSksIGludGVycG9sYXRlTnVtYmVyKSkpKHkpKSk7XG4gIH07XG5cbiAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRvbWFpbiA9IEFycmF5LmZyb20oXywgbnVtYmVyKSwgcmVzY2FsZSgpKSA6IGRvbWFpbi5zbGljZSgpO1xuICB9O1xuXG4gIHNjYWxlLnJhbmdlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHJhbmdlID0gQXJyYXkuZnJvbShfKSwgcmVzY2FsZSgpKSA6IHJhbmdlLnNsaWNlKCk7XG4gIH07XG5cbiAgc2NhbGUucmFuZ2VSb3VuZCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gcmFuZ2UgPSBBcnJheS5mcm9tKF8pLCBpbnRlcnBvbGF0ZSA9IGludGVycG9sYXRlUm91bmQsIHJlc2NhbGUoKTtcbiAgfTtcblxuICBzY2FsZS5jbGFtcCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjbGFtcCA9IF8gPyB0cnVlIDogaWRlbnRpdHksIHJlc2NhbGUoKSkgOiBjbGFtcCAhPT0gaWRlbnRpdHk7XG4gIH07XG5cbiAgc2NhbGUuaW50ZXJwb2xhdGUgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoaW50ZXJwb2xhdGUgPSBfLCByZXNjYWxlKCkpIDogaW50ZXJwb2xhdGU7XG4gIH07XG5cbiAgc2NhbGUudW5rbm93biA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh1bmtub3duID0gXywgc2NhbGUpIDogdW5rbm93bjtcbiAgfTtcblxuICByZXR1cm4gZnVuY3Rpb24odCwgdSkge1xuICAgIHRyYW5zZm9ybSA9IHQsIHVudHJhbnNmb3JtID0gdTtcbiAgICByZXR1cm4gcmVzY2FsZSgpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb250aW51b3VzKCkge1xuICByZXR1cm4gdHJhbnNmb3JtZXIoKShpZGVudGl0eSwgaWRlbnRpdHkpO1xufVxuIiwiLy8gW1tmaWxsXWFsaWduXVtzaWduXVtzeW1ib2xdWzBdW3dpZHRoXVssXVsucHJlY2lzaW9uXVt+XVt0eXBlXVxudmFyIHJlID0gL14oPzooLik/KFs8Pj1eXSkpPyhbK1xcLSggXSk/KFskI10pPygwKT8oXFxkKyk/KCwpPyhcXC5cXGQrKT8ofik/KFthLXolXSk/JC9pO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBmb3JtYXRTcGVjaWZpZXIoc3BlY2lmaWVyKSB7XG4gIGlmICghKG1hdGNoID0gcmUuZXhlYyhzcGVjaWZpZXIpKSkgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBmb3JtYXQ6IFwiICsgc3BlY2lmaWVyKTtcbiAgdmFyIG1hdGNoO1xuICByZXR1cm4gbmV3IEZvcm1hdFNwZWNpZmllcih7XG4gICAgZmlsbDogbWF0Y2hbMV0sXG4gICAgYWxpZ246IG1hdGNoWzJdLFxuICAgIHNpZ246IG1hdGNoWzNdLFxuICAgIHN5bWJvbDogbWF0Y2hbNF0sXG4gICAgemVybzogbWF0Y2hbNV0sXG4gICAgd2lkdGg6IG1hdGNoWzZdLFxuICAgIGNvbW1hOiBtYXRjaFs3XSxcbiAgICBwcmVjaXNpb246IG1hdGNoWzhdICYmIG1hdGNoWzhdLnNsaWNlKDEpLFxuICAgIHRyaW06IG1hdGNoWzldLFxuICAgIHR5cGU6IG1hdGNoWzEwXVxuICB9KTtcbn1cblxuZm9ybWF0U3BlY2lmaWVyLnByb3RvdHlwZSA9IEZvcm1hdFNwZWNpZmllci5wcm90b3R5cGU7IC8vIGluc3RhbmNlb2ZcblxuZXhwb3J0IGZ1bmN0aW9uIEZvcm1hdFNwZWNpZmllcihzcGVjaWZpZXIpIHtcbiAgdGhpcy5maWxsID0gc3BlY2lmaWVyLmZpbGwgPT09IHVuZGVmaW5lZCA/IFwiIFwiIDogc3BlY2lmaWVyLmZpbGwgKyBcIlwiO1xuICB0aGlzLmFsaWduID0gc3BlY2lmaWVyLmFsaWduID09PSB1bmRlZmluZWQgPyBcIj5cIiA6IHNwZWNpZmllci5hbGlnbiArIFwiXCI7XG4gIHRoaXMuc2lnbiA9IHNwZWNpZmllci5zaWduID09PSB1bmRlZmluZWQgPyBcIi1cIiA6IHNwZWNpZmllci5zaWduICsgXCJcIjtcbiAgdGhpcy5zeW1ib2wgPSBzcGVjaWZpZXIuc3ltYm9sID09PSB1bmRlZmluZWQgPyBcIlwiIDogc3BlY2lmaWVyLnN5bWJvbCArIFwiXCI7XG4gIHRoaXMuemVybyA9ICEhc3BlY2lmaWVyLnplcm87XG4gIHRoaXMud2lkdGggPSBzcGVjaWZpZXIud2lkdGggPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6ICtzcGVjaWZpZXIud2lkdGg7XG4gIHRoaXMuY29tbWEgPSAhIXNwZWNpZmllci5jb21tYTtcbiAgdGhpcy5wcmVjaXNpb24gPSBzcGVjaWZpZXIucHJlY2lzaW9uID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiArc3BlY2lmaWVyLnByZWNpc2lvbjtcbiAgdGhpcy50cmltID0gISFzcGVjaWZpZXIudHJpbTtcbiAgdGhpcy50eXBlID0gc3BlY2lmaWVyLnR5cGUgPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBzcGVjaWZpZXIudHlwZSArIFwiXCI7XG59XG5cbkZvcm1hdFNwZWNpZmllci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuZmlsbFxuICAgICAgKyB0aGlzLmFsaWduXG4gICAgICArIHRoaXMuc2lnblxuICAgICAgKyB0aGlzLnN5bWJvbFxuICAgICAgKyAodGhpcy56ZXJvID8gXCIwXCIgOiBcIlwiKVxuICAgICAgKyAodGhpcy53aWR0aCA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IE1hdGgubWF4KDEsIHRoaXMud2lkdGggfCAwKSlcbiAgICAgICsgKHRoaXMuY29tbWEgPyBcIixcIiA6IFwiXCIpXG4gICAgICArICh0aGlzLnByZWNpc2lvbiA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IFwiLlwiICsgTWF0aC5tYXgoMCwgdGhpcy5wcmVjaXNpb24gfCAwKSlcbiAgICAgICsgKHRoaXMudHJpbSA/IFwiflwiIDogXCJcIilcbiAgICAgICsgdGhpcy50eXBlO1xufTtcbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIE1hdGguYWJzKHggPSBNYXRoLnJvdW5kKHgpKSA+PSAxZTIxXG4gICAgICA/IHgudG9Mb2NhbGVTdHJpbmcoXCJlblwiKS5yZXBsYWNlKC8sL2csIFwiXCIpXG4gICAgICA6IHgudG9TdHJpbmcoMTApO1xufVxuXG4vLyBDb21wdXRlcyB0aGUgZGVjaW1hbCBjb2VmZmljaWVudCBhbmQgZXhwb25lbnQgb2YgdGhlIHNwZWNpZmllZCBudW1iZXIgeCB3aXRoXG4vLyBzaWduaWZpY2FudCBkaWdpdHMgcCwgd2hlcmUgeCBpcyBwb3NpdGl2ZSBhbmQgcCBpcyBpbiBbMSwgMjFdIG9yIHVuZGVmaW5lZC5cbi8vIEZvciBleGFtcGxlLCBmb3JtYXREZWNpbWFsUGFydHMoMS4yMykgcmV0dXJucyBbXCIxMjNcIiwgMF0uXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0RGVjaW1hbFBhcnRzKHgsIHApIHtcbiAgaWYgKChpID0gKHggPSBwID8geC50b0V4cG9uZW50aWFsKHAgLSAxKSA6IHgudG9FeHBvbmVudGlhbCgpKS5pbmRleE9mKFwiZVwiKSkgPCAwKSByZXR1cm4gbnVsbDsgLy8gTmFOLCDCsUluZmluaXR5XG4gIHZhciBpLCBjb2VmZmljaWVudCA9IHguc2xpY2UoMCwgaSk7XG5cbiAgLy8gVGhlIHN0cmluZyByZXR1cm5lZCBieSB0b0V4cG9uZW50aWFsIGVpdGhlciBoYXMgdGhlIGZvcm0gXFxkXFwuXFxkK2VbLStdXFxkK1xuICAvLyAoZS5nLiwgMS4yZSszKSBvciB0aGUgZm9ybSBcXGRlWy0rXVxcZCsgKGUuZy4sIDFlKzMpLlxuICByZXR1cm4gW1xuICAgIGNvZWZmaWNpZW50Lmxlbmd0aCA+IDEgPyBjb2VmZmljaWVudFswXSArIGNvZWZmaWNpZW50LnNsaWNlKDIpIDogY29lZmZpY2llbnQsXG4gICAgK3guc2xpY2UoaSArIDEpXG4gIF07XG59XG4iLCJpbXBvcnQge2Zvcm1hdERlY2ltYWxQYXJ0c30gZnJvbSBcIi4vZm9ybWF0RGVjaW1hbC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4KSB7XG4gIHJldHVybiB4ID0gZm9ybWF0RGVjaW1hbFBhcnRzKE1hdGguYWJzKHgpKSwgeCA/IHhbMV0gOiBOYU47XG59XG4iLCJpbXBvcnQgZXhwb25lbnQgZnJvbSBcIi4vZXhwb25lbnQuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc3RlcCwgdmFsdWUpIHtcbiAgcmV0dXJuIE1hdGgubWF4KDAsIE1hdGgubWF4KC04LCBNYXRoLm1pbig4LCBNYXRoLmZsb29yKGV4cG9uZW50KHZhbHVlKSAvIDMpKSkgKiAzIC0gZXhwb25lbnQoTWF0aC5hYnMoc3RlcCkpKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGdyb3VwaW5nLCB0aG91c2FuZHMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlLCB3aWR0aCkge1xuICAgIHZhciBpID0gdmFsdWUubGVuZ3RoLFxuICAgICAgICB0ID0gW10sXG4gICAgICAgIGogPSAwLFxuICAgICAgICBnID0gZ3JvdXBpbmdbMF0sXG4gICAgICAgIGxlbmd0aCA9IDA7XG5cbiAgICB3aGlsZSAoaSA+IDAgJiYgZyA+IDApIHtcbiAgICAgIGlmIChsZW5ndGggKyBnICsgMSA+IHdpZHRoKSBnID0gTWF0aC5tYXgoMSwgd2lkdGggLSBsZW5ndGgpO1xuICAgICAgdC5wdXNoKHZhbHVlLnN1YnN0cmluZyhpIC09IGcsIGkgKyBnKSk7XG4gICAgICBpZiAoKGxlbmd0aCArPSBnICsgMSkgPiB3aWR0aCkgYnJlYWs7XG4gICAgICBnID0gZ3JvdXBpbmdbaiA9IChqICsgMSkgJSBncm91cGluZy5sZW5ndGhdO1xuICAgIH1cblxuICAgIHJldHVybiB0LnJldmVyc2UoKS5qb2luKHRob3VzYW5kcyk7XG4gIH07XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihudW1lcmFscykge1xuICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUucmVwbGFjZSgvWzAtOV0vZywgZnVuY3Rpb24oaSkge1xuICAgICAgcmV0dXJuIG51bWVyYWxzWytpXTtcbiAgICB9KTtcbiAgfTtcbn1cbiIsIi8vIFRyaW1zIGluc2lnbmlmaWNhbnQgemVyb3MsIGUuZy4sIHJlcGxhY2VzIDEuMjAwMGsgd2l0aCAxLjJrLlxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24ocykge1xuICBvdXQ6IGZvciAodmFyIG4gPSBzLmxlbmd0aCwgaSA9IDEsIGkwID0gLTEsIGkxOyBpIDwgbjsgKytpKSB7XG4gICAgc3dpdGNoIChzW2ldKSB7XG4gICAgICBjYXNlIFwiLlwiOiBpMCA9IGkxID0gaTsgYnJlYWs7XG4gICAgICBjYXNlIFwiMFwiOiBpZiAoaTAgPT09IDApIGkwID0gaTsgaTEgPSBpOyBicmVhaztcbiAgICAgIGRlZmF1bHQ6IGlmICghK3NbaV0pIGJyZWFrIG91dDsgaWYgKGkwID4gMCkgaTAgPSAwOyBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGkwID4gMCA/IHMuc2xpY2UoMCwgaTApICsgcy5zbGljZShpMSArIDEpIDogcztcbn1cbiIsImltcG9ydCB7Zm9ybWF0RGVjaW1hbFBhcnRzfSBmcm9tIFwiLi9mb3JtYXREZWNpbWFsLmpzXCI7XG5cbmV4cG9ydCB2YXIgcHJlZml4RXhwb25lbnQ7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgsIHApIHtcbiAgdmFyIGQgPSBmb3JtYXREZWNpbWFsUGFydHMoeCwgcCk7XG4gIGlmICghZCkgcmV0dXJuIHggKyBcIlwiO1xuICB2YXIgY29lZmZpY2llbnQgPSBkWzBdLFxuICAgICAgZXhwb25lbnQgPSBkWzFdLFxuICAgICAgaSA9IGV4cG9uZW50IC0gKHByZWZpeEV4cG9uZW50ID0gTWF0aC5tYXgoLTgsIE1hdGgubWluKDgsIE1hdGguZmxvb3IoZXhwb25lbnQgLyAzKSkpICogMykgKyAxLFxuICAgICAgbiA9IGNvZWZmaWNpZW50Lmxlbmd0aDtcbiAgcmV0dXJuIGkgPT09IG4gPyBjb2VmZmljaWVudFxuICAgICAgOiBpID4gbiA/IGNvZWZmaWNpZW50ICsgbmV3IEFycmF5KGkgLSBuICsgMSkuam9pbihcIjBcIilcbiAgICAgIDogaSA+IDAgPyBjb2VmZmljaWVudC5zbGljZSgwLCBpKSArIFwiLlwiICsgY29lZmZpY2llbnQuc2xpY2UoaSlcbiAgICAgIDogXCIwLlwiICsgbmV3IEFycmF5KDEgLSBpKS5qb2luKFwiMFwiKSArIGZvcm1hdERlY2ltYWxQYXJ0cyh4LCBNYXRoLm1heCgwLCBwICsgaSAtIDEpKVswXTsgLy8gbGVzcyB0aGFuIDF5IVxufVxuIiwiaW1wb3J0IHtmb3JtYXREZWNpbWFsUGFydHN9IGZyb20gXCIuL2Zvcm1hdERlY2ltYWwuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCwgcCkge1xuICB2YXIgZCA9IGZvcm1hdERlY2ltYWxQYXJ0cyh4LCBwKTtcbiAgaWYgKCFkKSByZXR1cm4geCArIFwiXCI7XG4gIHZhciBjb2VmZmljaWVudCA9IGRbMF0sXG4gICAgICBleHBvbmVudCA9IGRbMV07XG4gIHJldHVybiBleHBvbmVudCA8IDAgPyBcIjAuXCIgKyBuZXcgQXJyYXkoLWV4cG9uZW50KS5qb2luKFwiMFwiKSArIGNvZWZmaWNpZW50XG4gICAgICA6IGNvZWZmaWNpZW50Lmxlbmd0aCA+IGV4cG9uZW50ICsgMSA/IGNvZWZmaWNpZW50LnNsaWNlKDAsIGV4cG9uZW50ICsgMSkgKyBcIi5cIiArIGNvZWZmaWNpZW50LnNsaWNlKGV4cG9uZW50ICsgMSlcbiAgICAgIDogY29lZmZpY2llbnQgKyBuZXcgQXJyYXkoZXhwb25lbnQgLSBjb2VmZmljaWVudC5sZW5ndGggKyAyKS5qb2luKFwiMFwiKTtcbn1cbiIsImltcG9ydCBmb3JtYXREZWNpbWFsIGZyb20gXCIuL2Zvcm1hdERlY2ltYWwuanNcIjtcbmltcG9ydCBmb3JtYXRQcmVmaXhBdXRvIGZyb20gXCIuL2Zvcm1hdFByZWZpeEF1dG8uanNcIjtcbmltcG9ydCBmb3JtYXRSb3VuZGVkIGZyb20gXCIuL2Zvcm1hdFJvdW5kZWQuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQge1xuICBcIiVcIjogKHgsIHApID0+ICh4ICogMTAwKS50b0ZpeGVkKHApLFxuICBcImJcIjogKHgpID0+IE1hdGgucm91bmQoeCkudG9TdHJpbmcoMiksXG4gIFwiY1wiOiAoeCkgPT4geCArIFwiXCIsXG4gIFwiZFwiOiBmb3JtYXREZWNpbWFsLFxuICBcImVcIjogKHgsIHApID0+IHgudG9FeHBvbmVudGlhbChwKSxcbiAgXCJmXCI6ICh4LCBwKSA9PiB4LnRvRml4ZWQocCksXG4gIFwiZ1wiOiAoeCwgcCkgPT4geC50b1ByZWNpc2lvbihwKSxcbiAgXCJvXCI6ICh4KSA9PiBNYXRoLnJvdW5kKHgpLnRvU3RyaW5nKDgpLFxuICBcInBcIjogKHgsIHApID0+IGZvcm1hdFJvdW5kZWQoeCAqIDEwMCwgcCksXG4gIFwiclwiOiBmb3JtYXRSb3VuZGVkLFxuICBcInNcIjogZm9ybWF0UHJlZml4QXV0byxcbiAgXCJYXCI6ICh4KSA9PiBNYXRoLnJvdW5kKHgpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpLFxuICBcInhcIjogKHgpID0+IE1hdGgucm91bmQoeCkudG9TdHJpbmcoMTYpXG59O1xuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCkge1xuICByZXR1cm4geDtcbn1cbiIsImltcG9ydCBleHBvbmVudCBmcm9tIFwiLi9leHBvbmVudC5qc1wiO1xuaW1wb3J0IGZvcm1hdEdyb3VwIGZyb20gXCIuL2Zvcm1hdEdyb3VwLmpzXCI7XG5pbXBvcnQgZm9ybWF0TnVtZXJhbHMgZnJvbSBcIi4vZm9ybWF0TnVtZXJhbHMuanNcIjtcbmltcG9ydCBmb3JtYXRTcGVjaWZpZXIgZnJvbSBcIi4vZm9ybWF0U3BlY2lmaWVyLmpzXCI7XG5pbXBvcnQgZm9ybWF0VHJpbSBmcm9tIFwiLi9mb3JtYXRUcmltLmpzXCI7XG5pbXBvcnQgZm9ybWF0VHlwZXMgZnJvbSBcIi4vZm9ybWF0VHlwZXMuanNcIjtcbmltcG9ydCB7cHJlZml4RXhwb25lbnR9IGZyb20gXCIuL2Zvcm1hdFByZWZpeEF1dG8uanNcIjtcbmltcG9ydCBpZGVudGl0eSBmcm9tIFwiLi9pZGVudGl0eS5qc1wiO1xuXG52YXIgbWFwID0gQXJyYXkucHJvdG90eXBlLm1hcCxcbiAgICBwcmVmaXhlcyA9IFtcInlcIixcInpcIixcImFcIixcImZcIixcInBcIixcIm5cIixcIsK1XCIsXCJtXCIsXCJcIixcImtcIixcIk1cIixcIkdcIixcIlRcIixcIlBcIixcIkVcIixcIlpcIixcIllcIl07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGxvY2FsZSkge1xuICB2YXIgZ3JvdXAgPSBsb2NhbGUuZ3JvdXBpbmcgPT09IHVuZGVmaW5lZCB8fCBsb2NhbGUudGhvdXNhbmRzID09PSB1bmRlZmluZWQgPyBpZGVudGl0eSA6IGZvcm1hdEdyb3VwKG1hcC5jYWxsKGxvY2FsZS5ncm91cGluZywgTnVtYmVyKSwgbG9jYWxlLnRob3VzYW5kcyArIFwiXCIpLFxuICAgICAgY3VycmVuY3lQcmVmaXggPSBsb2NhbGUuY3VycmVuY3kgPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBsb2NhbGUuY3VycmVuY3lbMF0gKyBcIlwiLFxuICAgICAgY3VycmVuY3lTdWZmaXggPSBsb2NhbGUuY3VycmVuY3kgPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBsb2NhbGUuY3VycmVuY3lbMV0gKyBcIlwiLFxuICAgICAgZGVjaW1hbCA9IGxvY2FsZS5kZWNpbWFsID09PSB1bmRlZmluZWQgPyBcIi5cIiA6IGxvY2FsZS5kZWNpbWFsICsgXCJcIixcbiAgICAgIG51bWVyYWxzID0gbG9jYWxlLm51bWVyYWxzID09PSB1bmRlZmluZWQgPyBpZGVudGl0eSA6IGZvcm1hdE51bWVyYWxzKG1hcC5jYWxsKGxvY2FsZS5udW1lcmFscywgU3RyaW5nKSksXG4gICAgICBwZXJjZW50ID0gbG9jYWxlLnBlcmNlbnQgPT09IHVuZGVmaW5lZCA/IFwiJVwiIDogbG9jYWxlLnBlcmNlbnQgKyBcIlwiLFxuICAgICAgbWludXMgPSBsb2NhbGUubWludXMgPT09IHVuZGVmaW5lZCA/IFwi4oiSXCIgOiBsb2NhbGUubWludXMgKyBcIlwiLFxuICAgICAgbmFuID0gbG9jYWxlLm5hbiA9PT0gdW5kZWZpbmVkID8gXCJOYU5cIiA6IGxvY2FsZS5uYW4gKyBcIlwiO1xuXG4gIGZ1bmN0aW9uIG5ld0Zvcm1hdChzcGVjaWZpZXIpIHtcbiAgICBzcGVjaWZpZXIgPSBmb3JtYXRTcGVjaWZpZXIoc3BlY2lmaWVyKTtcblxuICAgIHZhciBmaWxsID0gc3BlY2lmaWVyLmZpbGwsXG4gICAgICAgIGFsaWduID0gc3BlY2lmaWVyLmFsaWduLFxuICAgICAgICBzaWduID0gc3BlY2lmaWVyLnNpZ24sXG4gICAgICAgIHN5bWJvbCA9IHNwZWNpZmllci5zeW1ib2wsXG4gICAgICAgIHplcm8gPSBzcGVjaWZpZXIuemVybyxcbiAgICAgICAgd2lkdGggPSBzcGVjaWZpZXIud2lkdGgsXG4gICAgICAgIGNvbW1hID0gc3BlY2lmaWVyLmNvbW1hLFxuICAgICAgICBwcmVjaXNpb24gPSBzcGVjaWZpZXIucHJlY2lzaW9uLFxuICAgICAgICB0cmltID0gc3BlY2lmaWVyLnRyaW0sXG4gICAgICAgIHR5cGUgPSBzcGVjaWZpZXIudHlwZTtcblxuICAgIC8vIFRoZSBcIm5cIiB0eXBlIGlzIGFuIGFsaWFzIGZvciBcIixnXCIuXG4gICAgaWYgKHR5cGUgPT09IFwiblwiKSBjb21tYSA9IHRydWUsIHR5cGUgPSBcImdcIjtcblxuICAgIC8vIFRoZSBcIlwiIHR5cGUsIGFuZCBhbnkgaW52YWxpZCB0eXBlLCBpcyBhbiBhbGlhcyBmb3IgXCIuMTJ+Z1wiLlxuICAgIGVsc2UgaWYgKCFmb3JtYXRUeXBlc1t0eXBlXSkgcHJlY2lzaW9uID09PSB1bmRlZmluZWQgJiYgKHByZWNpc2lvbiA9IDEyKSwgdHJpbSA9IHRydWUsIHR5cGUgPSBcImdcIjtcblxuICAgIC8vIElmIHplcm8gZmlsbCBpcyBzcGVjaWZpZWQsIHBhZGRpbmcgZ29lcyBhZnRlciBzaWduIGFuZCBiZWZvcmUgZGlnaXRzLlxuICAgIGlmICh6ZXJvIHx8IChmaWxsID09PSBcIjBcIiAmJiBhbGlnbiA9PT0gXCI9XCIpKSB6ZXJvID0gdHJ1ZSwgZmlsbCA9IFwiMFwiLCBhbGlnbiA9IFwiPVwiO1xuXG4gICAgLy8gQ29tcHV0ZSB0aGUgcHJlZml4IGFuZCBzdWZmaXguXG4gICAgLy8gRm9yIFNJLXByZWZpeCwgdGhlIHN1ZmZpeCBpcyBsYXppbHkgY29tcHV0ZWQuXG4gICAgdmFyIHByZWZpeCA9IHN5bWJvbCA9PT0gXCIkXCIgPyBjdXJyZW5jeVByZWZpeCA6IHN5bWJvbCA9PT0gXCIjXCIgJiYgL1tib3hYXS8udGVzdCh0eXBlKSA/IFwiMFwiICsgdHlwZS50b0xvd2VyQ2FzZSgpIDogXCJcIixcbiAgICAgICAgc3VmZml4ID0gc3ltYm9sID09PSBcIiRcIiA/IGN1cnJlbmN5U3VmZml4IDogL1slcF0vLnRlc3QodHlwZSkgPyBwZXJjZW50IDogXCJcIjtcblxuICAgIC8vIFdoYXQgZm9ybWF0IGZ1bmN0aW9uIHNob3VsZCB3ZSB1c2U/XG4gICAgLy8gSXMgdGhpcyBhbiBpbnRlZ2VyIHR5cGU/XG4gICAgLy8gQ2FuIHRoaXMgdHlwZSBnZW5lcmF0ZSBleHBvbmVudGlhbCBub3RhdGlvbj9cbiAgICB2YXIgZm9ybWF0VHlwZSA9IGZvcm1hdFR5cGVzW3R5cGVdLFxuICAgICAgICBtYXliZVN1ZmZpeCA9IC9bZGVmZ3BycyVdLy50ZXN0KHR5cGUpO1xuXG4gICAgLy8gU2V0IHRoZSBkZWZhdWx0IHByZWNpc2lvbiBpZiBub3Qgc3BlY2lmaWVkLFxuICAgIC8vIG9yIGNsYW1wIHRoZSBzcGVjaWZpZWQgcHJlY2lzaW9uIHRvIHRoZSBzdXBwb3J0ZWQgcmFuZ2UuXG4gICAgLy8gRm9yIHNpZ25pZmljYW50IHByZWNpc2lvbiwgaXQgbXVzdCBiZSBpbiBbMSwgMjFdLlxuICAgIC8vIEZvciBmaXhlZCBwcmVjaXNpb24sIGl0IG11c3QgYmUgaW4gWzAsIDIwXS5cbiAgICBwcmVjaXNpb24gPSBwcmVjaXNpb24gPT09IHVuZGVmaW5lZCA/IDZcbiAgICAgICAgOiAvW2dwcnNdLy50ZXN0KHR5cGUpID8gTWF0aC5tYXgoMSwgTWF0aC5taW4oMjEsIHByZWNpc2lvbikpXG4gICAgICAgIDogTWF0aC5tYXgoMCwgTWF0aC5taW4oMjAsIHByZWNpc2lvbikpO1xuXG4gICAgZnVuY3Rpb24gZm9ybWF0KHZhbHVlKSB7XG4gICAgICB2YXIgdmFsdWVQcmVmaXggPSBwcmVmaXgsXG4gICAgICAgICAgdmFsdWVTdWZmaXggPSBzdWZmaXgsXG4gICAgICAgICAgaSwgbiwgYztcblxuICAgICAgaWYgKHR5cGUgPT09IFwiY1wiKSB7XG4gICAgICAgIHZhbHVlU3VmZml4ID0gZm9ybWF0VHlwZSh2YWx1ZSkgKyB2YWx1ZVN1ZmZpeDtcbiAgICAgICAgdmFsdWUgPSBcIlwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWUgPSArdmFsdWU7XG5cbiAgICAgICAgLy8gRGV0ZXJtaW5lIHRoZSBzaWduLiAtMCBpcyBub3QgbGVzcyB0aGFuIDAsIGJ1dCAxIC8gLTAgaXMhXG4gICAgICAgIHZhciB2YWx1ZU5lZ2F0aXZlID0gdmFsdWUgPCAwIHx8IDEgLyB2YWx1ZSA8IDA7XG5cbiAgICAgICAgLy8gUGVyZm9ybSB0aGUgaW5pdGlhbCBmb3JtYXR0aW5nLlxuICAgICAgICB2YWx1ZSA9IGlzTmFOKHZhbHVlKSA/IG5hbiA6IGZvcm1hdFR5cGUoTWF0aC5hYnModmFsdWUpLCBwcmVjaXNpb24pO1xuXG4gICAgICAgIC8vIFRyaW0gaW5zaWduaWZpY2FudCB6ZXJvcy5cbiAgICAgICAgaWYgKHRyaW0pIHZhbHVlID0gZm9ybWF0VHJpbSh2YWx1ZSk7XG5cbiAgICAgICAgLy8gSWYgYSBuZWdhdGl2ZSB2YWx1ZSByb3VuZHMgdG8gemVybyBhZnRlciBmb3JtYXR0aW5nLCBhbmQgbm8gZXhwbGljaXQgcG9zaXRpdmUgc2lnbiBpcyByZXF1ZXN0ZWQsIGhpZGUgdGhlIHNpZ24uXG4gICAgICAgIGlmICh2YWx1ZU5lZ2F0aXZlICYmICt2YWx1ZSA9PT0gMCAmJiBzaWduICE9PSBcIitcIikgdmFsdWVOZWdhdGl2ZSA9IGZhbHNlO1xuXG4gICAgICAgIC8vIENvbXB1dGUgdGhlIHByZWZpeCBhbmQgc3VmZml4LlxuICAgICAgICB2YWx1ZVByZWZpeCA9ICh2YWx1ZU5lZ2F0aXZlID8gKHNpZ24gPT09IFwiKFwiID8gc2lnbiA6IG1pbnVzKSA6IHNpZ24gPT09IFwiLVwiIHx8IHNpZ24gPT09IFwiKFwiID8gXCJcIiA6IHNpZ24pICsgdmFsdWVQcmVmaXg7XG4gICAgICAgIHZhbHVlU3VmZml4ID0gKHR5cGUgPT09IFwic1wiID8gcHJlZml4ZXNbOCArIHByZWZpeEV4cG9uZW50IC8gM10gOiBcIlwiKSArIHZhbHVlU3VmZml4ICsgKHZhbHVlTmVnYXRpdmUgJiYgc2lnbiA9PT0gXCIoXCIgPyBcIilcIiA6IFwiXCIpO1xuXG4gICAgICAgIC8vIEJyZWFrIHRoZSBmb3JtYXR0ZWQgdmFsdWUgaW50byB0aGUgaW50ZWdlciDigJx2YWx1ZeKAnSBwYXJ0IHRoYXQgY2FuIGJlXG4gICAgICAgIC8vIGdyb3VwZWQsIGFuZCBmcmFjdGlvbmFsIG9yIGV4cG9uZW50aWFsIOKAnHN1ZmZpeOKAnSBwYXJ0IHRoYXQgaXMgbm90LlxuICAgICAgICBpZiAobWF5YmVTdWZmaXgpIHtcbiAgICAgICAgICBpID0gLTEsIG4gPSB2YWx1ZS5sZW5ndGg7XG4gICAgICAgICAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICAgICAgICAgIGlmIChjID0gdmFsdWUuY2hhckNvZGVBdChpKSwgNDggPiBjIHx8IGMgPiA1Nykge1xuICAgICAgICAgICAgICB2YWx1ZVN1ZmZpeCA9IChjID09PSA0NiA/IGRlY2ltYWwgKyB2YWx1ZS5zbGljZShpICsgMSkgOiB2YWx1ZS5zbGljZShpKSkgKyB2YWx1ZVN1ZmZpeDtcbiAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zbGljZSgwLCBpKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoZSBmaWxsIGNoYXJhY3RlciBpcyBub3QgXCIwXCIsIGdyb3VwaW5nIGlzIGFwcGxpZWQgYmVmb3JlIHBhZGRpbmcuXG4gICAgICBpZiAoY29tbWEgJiYgIXplcm8pIHZhbHVlID0gZ3JvdXAodmFsdWUsIEluZmluaXR5KTtcblxuICAgICAgLy8gQ29tcHV0ZSB0aGUgcGFkZGluZy5cbiAgICAgIHZhciBsZW5ndGggPSB2YWx1ZVByZWZpeC5sZW5ndGggKyB2YWx1ZS5sZW5ndGggKyB2YWx1ZVN1ZmZpeC5sZW5ndGgsXG4gICAgICAgICAgcGFkZGluZyA9IGxlbmd0aCA8IHdpZHRoID8gbmV3IEFycmF5KHdpZHRoIC0gbGVuZ3RoICsgMSkuam9pbihmaWxsKSA6IFwiXCI7XG5cbiAgICAgIC8vIElmIHRoZSBmaWxsIGNoYXJhY3RlciBpcyBcIjBcIiwgZ3JvdXBpbmcgaXMgYXBwbGllZCBhZnRlciBwYWRkaW5nLlxuICAgICAgaWYgKGNvbW1hICYmIHplcm8pIHZhbHVlID0gZ3JvdXAocGFkZGluZyArIHZhbHVlLCBwYWRkaW5nLmxlbmd0aCA/IHdpZHRoIC0gdmFsdWVTdWZmaXgubGVuZ3RoIDogSW5maW5pdHkpLCBwYWRkaW5nID0gXCJcIjtcblxuICAgICAgLy8gUmVjb25zdHJ1Y3QgdGhlIGZpbmFsIG91dHB1dCBiYXNlZCBvbiB0aGUgZGVzaXJlZCBhbGlnbm1lbnQuXG4gICAgICBzd2l0Y2ggKGFsaWduKSB7XG4gICAgICAgIGNhc2UgXCI8XCI6IHZhbHVlID0gdmFsdWVQcmVmaXggKyB2YWx1ZSArIHZhbHVlU3VmZml4ICsgcGFkZGluZzsgYnJlYWs7XG4gICAgICAgIGNhc2UgXCI9XCI6IHZhbHVlID0gdmFsdWVQcmVmaXggKyBwYWRkaW5nICsgdmFsdWUgKyB2YWx1ZVN1ZmZpeDsgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJeXCI6IHZhbHVlID0gcGFkZGluZy5zbGljZSgwLCBsZW5ndGggPSBwYWRkaW5nLmxlbmd0aCA+PiAxKSArIHZhbHVlUHJlZml4ICsgdmFsdWUgKyB2YWx1ZVN1ZmZpeCArIHBhZGRpbmcuc2xpY2UobGVuZ3RoKTsgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6IHZhbHVlID0gcGFkZGluZyArIHZhbHVlUHJlZml4ICsgdmFsdWUgKyB2YWx1ZVN1ZmZpeDsgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudW1lcmFscyh2YWx1ZSk7XG4gICAgfVxuXG4gICAgZm9ybWF0LnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gc3BlY2lmaWVyICsgXCJcIjtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGZvcm1hdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZvcm1hdFByZWZpeChzcGVjaWZpZXIsIHZhbHVlKSB7XG4gICAgdmFyIGYgPSBuZXdGb3JtYXQoKHNwZWNpZmllciA9IGZvcm1hdFNwZWNpZmllcihzcGVjaWZpZXIpLCBzcGVjaWZpZXIudHlwZSA9IFwiZlwiLCBzcGVjaWZpZXIpKSxcbiAgICAgICAgZSA9IE1hdGgubWF4KC04LCBNYXRoLm1pbig4LCBNYXRoLmZsb29yKGV4cG9uZW50KHZhbHVlKSAvIDMpKSkgKiAzLFxuICAgICAgICBrID0gTWF0aC5wb3coMTAsIC1lKSxcbiAgICAgICAgcHJlZml4ID0gcHJlZml4ZXNbOCArIGUgLyAzXTtcbiAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHJldHVybiBmKGsgKiB2YWx1ZSkgKyBwcmVmaXg7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZm9ybWF0OiBuZXdGb3JtYXQsXG4gICAgZm9ybWF0UHJlZml4OiBmb3JtYXRQcmVmaXhcbiAgfTtcbn1cbiIsImltcG9ydCBmb3JtYXRMb2NhbGUgZnJvbSBcIi4vbG9jYWxlLmpzXCI7XG5cbnZhciBsb2NhbGU7XG5leHBvcnQgdmFyIGZvcm1hdDtcbmV4cG9ydCB2YXIgZm9ybWF0UHJlZml4O1xuXG5kZWZhdWx0TG9jYWxlKHtcbiAgdGhvdXNhbmRzOiBcIixcIixcbiAgZ3JvdXBpbmc6IFszXSxcbiAgY3VycmVuY3k6IFtcIiRcIiwgXCJcIl1cbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkZWZhdWx0TG9jYWxlKGRlZmluaXRpb24pIHtcbiAgbG9jYWxlID0gZm9ybWF0TG9jYWxlKGRlZmluaXRpb24pO1xuICBmb3JtYXQgPSBsb2NhbGUuZm9ybWF0O1xuICBmb3JtYXRQcmVmaXggPSBsb2NhbGUuZm9ybWF0UHJlZml4O1xuICByZXR1cm4gbG9jYWxlO1xufVxuIiwiaW1wb3J0IGV4cG9uZW50IGZyb20gXCIuL2V4cG9uZW50LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHN0ZXAsIG1heCkge1xuICBzdGVwID0gTWF0aC5hYnMoc3RlcCksIG1heCA9IE1hdGguYWJzKG1heCkgLSBzdGVwO1xuICByZXR1cm4gTWF0aC5tYXgoMCwgZXhwb25lbnQobWF4KSAtIGV4cG9uZW50KHN0ZXApKSArIDE7XG59XG4iLCJpbXBvcnQgZXhwb25lbnQgZnJvbSBcIi4vZXhwb25lbnQuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc3RlcCkge1xuICByZXR1cm4gTWF0aC5tYXgoMCwgLWV4cG9uZW50KE1hdGguYWJzKHN0ZXApKSk7XG59XG4iLCJpbXBvcnQge3RpY2tTdGVwfSBmcm9tIFwiZDMtYXJyYXlcIjtcbmltcG9ydCB7Zm9ybWF0LCBmb3JtYXRQcmVmaXgsIGZvcm1hdFNwZWNpZmllciwgcHJlY2lzaW9uRml4ZWQsIHByZWNpc2lvblByZWZpeCwgcHJlY2lzaW9uUm91bmR9IGZyb20gXCJkMy1mb3JtYXRcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdGlja0Zvcm1hdChzdGFydCwgc3RvcCwgY291bnQsIHNwZWNpZmllcikge1xuICB2YXIgc3RlcCA9IHRpY2tTdGVwKHN0YXJ0LCBzdG9wLCBjb3VudCksXG4gICAgICBwcmVjaXNpb247XG4gIHNwZWNpZmllciA9IGZvcm1hdFNwZWNpZmllcihzcGVjaWZpZXIgPT0gbnVsbCA/IFwiLGZcIiA6IHNwZWNpZmllcik7XG4gIHN3aXRjaCAoc3BlY2lmaWVyLnR5cGUpIHtcbiAgICBjYXNlIFwic1wiOiB7XG4gICAgICB2YXIgdmFsdWUgPSBNYXRoLm1heChNYXRoLmFicyhzdGFydCksIE1hdGguYWJzKHN0b3ApKTtcbiAgICAgIGlmIChzcGVjaWZpZXIucHJlY2lzaW9uID09IG51bGwgJiYgIWlzTmFOKHByZWNpc2lvbiA9IHByZWNpc2lvblByZWZpeChzdGVwLCB2YWx1ZSkpKSBzcGVjaWZpZXIucHJlY2lzaW9uID0gcHJlY2lzaW9uO1xuICAgICAgcmV0dXJuIGZvcm1hdFByZWZpeChzcGVjaWZpZXIsIHZhbHVlKTtcbiAgICB9XG4gICAgY2FzZSBcIlwiOlxuICAgIGNhc2UgXCJlXCI6XG4gICAgY2FzZSBcImdcIjpcbiAgICBjYXNlIFwicFwiOlxuICAgIGNhc2UgXCJyXCI6IHtcbiAgICAgIGlmIChzcGVjaWZpZXIucHJlY2lzaW9uID09IG51bGwgJiYgIWlzTmFOKHByZWNpc2lvbiA9IHByZWNpc2lvblJvdW5kKHN0ZXAsIE1hdGgubWF4KE1hdGguYWJzKHN0YXJ0KSwgTWF0aC5hYnMoc3RvcCkpKSkpIHNwZWNpZmllci5wcmVjaXNpb24gPSBwcmVjaXNpb24gLSAoc3BlY2lmaWVyLnR5cGUgPT09IFwiZVwiKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlIFwiZlwiOlxuICAgIGNhc2UgXCIlXCI6IHtcbiAgICAgIGlmIChzcGVjaWZpZXIucHJlY2lzaW9uID09IG51bGwgJiYgIWlzTmFOKHByZWNpc2lvbiA9IHByZWNpc2lvbkZpeGVkKHN0ZXApKSkgc3BlY2lmaWVyLnByZWNpc2lvbiA9IHByZWNpc2lvbiAtIChzcGVjaWZpZXIudHlwZSA9PT0gXCIlXCIpICogMjtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZm9ybWF0KHNwZWNpZmllcik7XG59XG4iLCJpbXBvcnQge3RpY2tzLCB0aWNrSW5jcmVtZW50fSBmcm9tIFwiZDMtYXJyYXlcIjtcbmltcG9ydCBjb250aW51b3VzLCB7Y29weX0gZnJvbSBcIi4vY29udGludW91cy5qc1wiO1xuaW1wb3J0IHtpbml0UmFuZ2V9IGZyb20gXCIuL2luaXQuanNcIjtcbmltcG9ydCB0aWNrRm9ybWF0IGZyb20gXCIuL3RpY2tGb3JtYXQuanNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGxpbmVhcmlzaChzY2FsZSkge1xuICB2YXIgZG9tYWluID0gc2NhbGUuZG9tYWluO1xuXG4gIHNjYWxlLnRpY2tzID0gZnVuY3Rpb24oY291bnQpIHtcbiAgICB2YXIgZCA9IGRvbWFpbigpO1xuICAgIHJldHVybiB0aWNrcyhkWzBdLCBkW2QubGVuZ3RoIC0gMV0sIGNvdW50ID09IG51bGwgPyAxMCA6IGNvdW50KTtcbiAgfTtcblxuICBzY2FsZS50aWNrRm9ybWF0ID0gZnVuY3Rpb24oY291bnQsIHNwZWNpZmllcikge1xuICAgIHZhciBkID0gZG9tYWluKCk7XG4gICAgcmV0dXJuIHRpY2tGb3JtYXQoZFswXSwgZFtkLmxlbmd0aCAtIDFdLCBjb3VudCA9PSBudWxsID8gMTAgOiBjb3VudCwgc3BlY2lmaWVyKTtcbiAgfTtcblxuICBzY2FsZS5uaWNlID0gZnVuY3Rpb24oY291bnQpIHtcbiAgICBpZiAoY291bnQgPT0gbnVsbCkgY291bnQgPSAxMDtcblxuICAgIHZhciBkID0gZG9tYWluKCk7XG4gICAgdmFyIGkwID0gMDtcbiAgICB2YXIgaTEgPSBkLmxlbmd0aCAtIDE7XG4gICAgdmFyIHN0YXJ0ID0gZFtpMF07XG4gICAgdmFyIHN0b3AgPSBkW2kxXTtcbiAgICB2YXIgcHJlc3RlcDtcbiAgICB2YXIgc3RlcDtcbiAgICB2YXIgbWF4SXRlciA9IDEwO1xuXG4gICAgaWYgKHN0b3AgPCBzdGFydCkge1xuICAgICAgc3RlcCA9IHN0YXJ0LCBzdGFydCA9IHN0b3AsIHN0b3AgPSBzdGVwO1xuICAgICAgc3RlcCA9IGkwLCBpMCA9IGkxLCBpMSA9IHN0ZXA7XG4gICAgfVxuICAgIFxuICAgIHdoaWxlIChtYXhJdGVyLS0gPiAwKSB7XG4gICAgICBzdGVwID0gdGlja0luY3JlbWVudChzdGFydCwgc3RvcCwgY291bnQpO1xuICAgICAgaWYgKHN0ZXAgPT09IHByZXN0ZXApIHtcbiAgICAgICAgZFtpMF0gPSBzdGFydFxuICAgICAgICBkW2kxXSA9IHN0b3BcbiAgICAgICAgcmV0dXJuIGRvbWFpbihkKTtcbiAgICAgIH0gZWxzZSBpZiAoc3RlcCA+IDApIHtcbiAgICAgICAgc3RhcnQgPSBNYXRoLmZsb29yKHN0YXJ0IC8gc3RlcCkgKiBzdGVwO1xuICAgICAgICBzdG9wID0gTWF0aC5jZWlsKHN0b3AgLyBzdGVwKSAqIHN0ZXA7XG4gICAgICB9IGVsc2UgaWYgKHN0ZXAgPCAwKSB7XG4gICAgICAgIHN0YXJ0ID0gTWF0aC5jZWlsKHN0YXJ0ICogc3RlcCkgLyBzdGVwO1xuICAgICAgICBzdG9wID0gTWF0aC5mbG9vcihzdG9wICogc3RlcCkgLyBzdGVwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBwcmVzdGVwID0gc3RlcDtcbiAgICB9XG5cbiAgICByZXR1cm4gc2NhbGU7XG4gIH07XG5cbiAgcmV0dXJuIHNjYWxlO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBsaW5lYXIoKSB7XG4gIHZhciBzY2FsZSA9IGNvbnRpbnVvdXMoKTtcblxuICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGNvcHkoc2NhbGUsIGxpbmVhcigpKTtcbiAgfTtcblxuICBpbml0UmFuZ2UuYXBwbHkoc2NhbGUsIGFyZ3VtZW50cyk7XG5cbiAgcmV0dXJuIGxpbmVhcmlzaChzY2FsZSk7XG59XG4iLCJleHBvcnQgY29uc3QgZHVyYXRpb25TZWNvbmQgPSAxMDAwO1xuZXhwb3J0IGNvbnN0IGR1cmF0aW9uTWludXRlID0gZHVyYXRpb25TZWNvbmQgKiA2MDtcbmV4cG9ydCBjb25zdCBkdXJhdGlvbkhvdXIgPSBkdXJhdGlvbk1pbnV0ZSAqIDYwO1xuZXhwb3J0IGNvbnN0IGR1cmF0aW9uRGF5ID0gZHVyYXRpb25Ib3VyICogMjQ7XG5leHBvcnQgY29uc3QgZHVyYXRpb25XZWVrID0gZHVyYXRpb25EYXkgKiA3O1xuZXhwb3J0IGNvbnN0IGR1cmF0aW9uTW9udGggPSBkdXJhdGlvbkRheSAqIDMwO1xuZXhwb3J0IGNvbnN0IGR1cmF0aW9uWWVhciA9IGR1cmF0aW9uRGF5ICogMzY1O1xuIiwiY29uc3QgdDAgPSBuZXcgRGF0ZSwgdDEgPSBuZXcgRGF0ZTtcblxuZXhwb3J0IGZ1bmN0aW9uIHRpbWVJbnRlcnZhbChmbG9vcmksIG9mZnNldGksIGNvdW50LCBmaWVsZCkge1xuXG4gIGZ1bmN0aW9uIGludGVydmFsKGRhdGUpIHtcbiAgICByZXR1cm4gZmxvb3JpKGRhdGUgPSBhcmd1bWVudHMubGVuZ3RoID09PSAwID8gbmV3IERhdGUgOiBuZXcgRGF0ZSgrZGF0ZSkpLCBkYXRlO1xuICB9XG5cbiAgaW50ZXJ2YWwuZmxvb3IgPSAoZGF0ZSkgPT4ge1xuICAgIHJldHVybiBmbG9vcmkoZGF0ZSA9IG5ldyBEYXRlKCtkYXRlKSksIGRhdGU7XG4gIH07XG5cbiAgaW50ZXJ2YWwuY2VpbCA9IChkYXRlKSA9PiB7XG4gICAgcmV0dXJuIGZsb29yaShkYXRlID0gbmV3IERhdGUoZGF0ZSAtIDEpKSwgb2Zmc2V0aShkYXRlLCAxKSwgZmxvb3JpKGRhdGUpLCBkYXRlO1xuICB9O1xuXG4gIGludGVydmFsLnJvdW5kID0gKGRhdGUpID0+IHtcbiAgICBjb25zdCBkMCA9IGludGVydmFsKGRhdGUpLCBkMSA9IGludGVydmFsLmNlaWwoZGF0ZSk7XG4gICAgcmV0dXJuIGRhdGUgLSBkMCA8IGQxIC0gZGF0ZSA/IGQwIDogZDE7XG4gIH07XG5cbiAgaW50ZXJ2YWwub2Zmc2V0ID0gKGRhdGUsIHN0ZXApID0+IHtcbiAgICByZXR1cm4gb2Zmc2V0aShkYXRlID0gbmV3IERhdGUoK2RhdGUpLCBzdGVwID09IG51bGwgPyAxIDogTWF0aC5mbG9vcihzdGVwKSksIGRhdGU7XG4gIH07XG5cbiAgaW50ZXJ2YWwucmFuZ2UgPSAoc3RhcnQsIHN0b3AsIHN0ZXApID0+IHtcbiAgICBjb25zdCByYW5nZSA9IFtdO1xuICAgIHN0YXJ0ID0gaW50ZXJ2YWwuY2VpbChzdGFydCk7XG4gICAgc3RlcCA9IHN0ZXAgPT0gbnVsbCA/IDEgOiBNYXRoLmZsb29yKHN0ZXApO1xuICAgIGlmICghKHN0YXJ0IDwgc3RvcCkgfHwgIShzdGVwID4gMCkpIHJldHVybiByYW5nZTsgLy8gYWxzbyBoYW5kbGVzIEludmFsaWQgRGF0ZVxuICAgIGxldCBwcmV2aW91cztcbiAgICBkbyByYW5nZS5wdXNoKHByZXZpb3VzID0gbmV3IERhdGUoK3N0YXJ0KSksIG9mZnNldGkoc3RhcnQsIHN0ZXApLCBmbG9vcmkoc3RhcnQpO1xuICAgIHdoaWxlIChwcmV2aW91cyA8IHN0YXJ0ICYmIHN0YXJ0IDwgc3RvcCk7XG4gICAgcmV0dXJuIHJhbmdlO1xuICB9O1xuXG4gIGludGVydmFsLmZpbHRlciA9ICh0ZXN0KSA9PiB7XG4gICAgcmV0dXJuIHRpbWVJbnRlcnZhbCgoZGF0ZSkgPT4ge1xuICAgICAgaWYgKGRhdGUgPj0gZGF0ZSkgd2hpbGUgKGZsb29yaShkYXRlKSwgIXRlc3QoZGF0ZSkpIGRhdGUuc2V0VGltZShkYXRlIC0gMSk7XG4gICAgfSwgKGRhdGUsIHN0ZXApID0+IHtcbiAgICAgIGlmIChkYXRlID49IGRhdGUpIHtcbiAgICAgICAgaWYgKHN0ZXAgPCAwKSB3aGlsZSAoKytzdGVwIDw9IDApIHtcbiAgICAgICAgICB3aGlsZSAob2Zmc2V0aShkYXRlLCAtMSksICF0ZXN0KGRhdGUpKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWVtcHR5XG4gICAgICAgIH0gZWxzZSB3aGlsZSAoLS1zdGVwID49IDApIHtcbiAgICAgICAgICB3aGlsZSAob2Zmc2V0aShkYXRlLCArMSksICF0ZXN0KGRhdGUpKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWVtcHR5XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICBpZiAoY291bnQpIHtcbiAgICBpbnRlcnZhbC5jb3VudCA9IChzdGFydCwgZW5kKSA9PiB7XG4gICAgICB0MC5zZXRUaW1lKCtzdGFydCksIHQxLnNldFRpbWUoK2VuZCk7XG4gICAgICBmbG9vcmkodDApLCBmbG9vcmkodDEpO1xuICAgICAgcmV0dXJuIE1hdGguZmxvb3IoY291bnQodDAsIHQxKSk7XG4gICAgfTtcblxuICAgIGludGVydmFsLmV2ZXJ5ID0gKHN0ZXApID0+IHtcbiAgICAgIHN0ZXAgPSBNYXRoLmZsb29yKHN0ZXApO1xuICAgICAgcmV0dXJuICFpc0Zpbml0ZShzdGVwKSB8fCAhKHN0ZXAgPiAwKSA/IG51bGxcbiAgICAgICAgICA6ICEoc3RlcCA+IDEpID8gaW50ZXJ2YWxcbiAgICAgICAgICA6IGludGVydmFsLmZpbHRlcihmaWVsZFxuICAgICAgICAgICAgICA/IChkKSA9PiBmaWVsZChkKSAlIHN0ZXAgPT09IDBcbiAgICAgICAgICAgICAgOiAoZCkgPT4gaW50ZXJ2YWwuY291bnQoMCwgZCkgJSBzdGVwID09PSAwKTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIGludGVydmFsO1xufVxuIiwiaW1wb3J0IHt0aW1lSW50ZXJ2YWx9IGZyb20gXCIuL2ludGVydmFsLmpzXCI7XG5cbmV4cG9ydCBjb25zdCBtaWxsaXNlY29uZCA9IHRpbWVJbnRlcnZhbCgoKSA9PiB7XG4gIC8vIG5vb3Bcbn0sIChkYXRlLCBzdGVwKSA9PiB7XG4gIGRhdGUuc2V0VGltZSgrZGF0ZSArIHN0ZXApO1xufSwgKHN0YXJ0LCBlbmQpID0+IHtcbiAgcmV0dXJuIGVuZCAtIHN0YXJ0O1xufSk7XG5cbi8vIEFuIG9wdGltaXplZCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhpcyBzaW1wbGUgY2FzZS5cbm1pbGxpc2Vjb25kLmV2ZXJ5ID0gKGspID0+IHtcbiAgayA9IE1hdGguZmxvb3Ioayk7XG4gIGlmICghaXNGaW5pdGUoaykgfHwgIShrID4gMCkpIHJldHVybiBudWxsO1xuICBpZiAoIShrID4gMSkpIHJldHVybiBtaWxsaXNlY29uZDtcbiAgcmV0dXJuIHRpbWVJbnRlcnZhbCgoZGF0ZSkgPT4ge1xuICAgIGRhdGUuc2V0VGltZShNYXRoLmZsb29yKGRhdGUgLyBrKSAqIGspO1xuICB9LCAoZGF0ZSwgc3RlcCkgPT4ge1xuICAgIGRhdGUuc2V0VGltZSgrZGF0ZSArIHN0ZXAgKiBrKTtcbiAgfSwgKHN0YXJ0LCBlbmQpID0+IHtcbiAgICByZXR1cm4gKGVuZCAtIHN0YXJ0KSAvIGs7XG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IG1pbGxpc2Vjb25kcyA9IG1pbGxpc2Vjb25kLnJhbmdlO1xuIiwiaW1wb3J0IHt0aW1lSW50ZXJ2YWx9IGZyb20gXCIuL2ludGVydmFsLmpzXCI7XG5pbXBvcnQge2R1cmF0aW9uU2Vjb25kfSBmcm9tIFwiLi9kdXJhdGlvbi5qc1wiO1xuXG5leHBvcnQgY29uc3Qgc2Vjb25kID0gdGltZUludGVydmFsKChkYXRlKSA9PiB7XG4gIGRhdGUuc2V0VGltZShkYXRlIC0gZGF0ZS5nZXRNaWxsaXNlY29uZHMoKSk7XG59LCAoZGF0ZSwgc3RlcCkgPT4ge1xuICBkYXRlLnNldFRpbWUoK2RhdGUgKyBzdGVwICogZHVyYXRpb25TZWNvbmQpO1xufSwgKHN0YXJ0LCBlbmQpID0+IHtcbiAgcmV0dXJuIChlbmQgLSBzdGFydCkgLyBkdXJhdGlvblNlY29uZDtcbn0sIChkYXRlKSA9PiB7XG4gIHJldHVybiBkYXRlLmdldFVUQ1NlY29uZHMoKTtcbn0pO1xuXG5leHBvcnQgY29uc3Qgc2Vjb25kcyA9IHNlY29uZC5yYW5nZTtcbiIsImltcG9ydCB7dGltZUludGVydmFsfSBmcm9tIFwiLi9pbnRlcnZhbC5qc1wiO1xuaW1wb3J0IHtkdXJhdGlvbk1pbnV0ZSwgZHVyYXRpb25TZWNvbmR9IGZyb20gXCIuL2R1cmF0aW9uLmpzXCI7XG5cbmV4cG9ydCBjb25zdCB0aW1lTWludXRlID0gdGltZUludGVydmFsKChkYXRlKSA9PiB7XG4gIGRhdGUuc2V0VGltZShkYXRlIC0gZGF0ZS5nZXRNaWxsaXNlY29uZHMoKSAtIGRhdGUuZ2V0U2Vjb25kcygpICogZHVyYXRpb25TZWNvbmQpO1xufSwgKGRhdGUsIHN0ZXApID0+IHtcbiAgZGF0ZS5zZXRUaW1lKCtkYXRlICsgc3RlcCAqIGR1cmF0aW9uTWludXRlKTtcbn0sIChzdGFydCwgZW5kKSA9PiB7XG4gIHJldHVybiAoZW5kIC0gc3RhcnQpIC8gZHVyYXRpb25NaW51dGU7XG59LCAoZGF0ZSkgPT4ge1xuICByZXR1cm4gZGF0ZS5nZXRNaW51dGVzKCk7XG59KTtcblxuZXhwb3J0IGNvbnN0IHRpbWVNaW51dGVzID0gdGltZU1pbnV0ZS5yYW5nZTtcblxuZXhwb3J0IGNvbnN0IHV0Y01pbnV0ZSA9IHRpbWVJbnRlcnZhbCgoZGF0ZSkgPT4ge1xuICBkYXRlLnNldFVUQ1NlY29uZHMoMCwgMCk7XG59LCAoZGF0ZSwgc3RlcCkgPT4ge1xuICBkYXRlLnNldFRpbWUoK2RhdGUgKyBzdGVwICogZHVyYXRpb25NaW51dGUpO1xufSwgKHN0YXJ0LCBlbmQpID0+IHtcbiAgcmV0dXJuIChlbmQgLSBzdGFydCkgLyBkdXJhdGlvbk1pbnV0ZTtcbn0sIChkYXRlKSA9PiB7XG4gIHJldHVybiBkYXRlLmdldFVUQ01pbnV0ZXMoKTtcbn0pO1xuXG5leHBvcnQgY29uc3QgdXRjTWludXRlcyA9IHV0Y01pbnV0ZS5yYW5nZTtcbiIsImltcG9ydCB7dGltZUludGVydmFsfSBmcm9tIFwiLi9pbnRlcnZhbC5qc1wiO1xuaW1wb3J0IHtkdXJhdGlvbkhvdXIsIGR1cmF0aW9uTWludXRlLCBkdXJhdGlvblNlY29uZH0gZnJvbSBcIi4vZHVyYXRpb24uanNcIjtcblxuZXhwb3J0IGNvbnN0IHRpbWVIb3VyID0gdGltZUludGVydmFsKChkYXRlKSA9PiB7XG4gIGRhdGUuc2V0VGltZShkYXRlIC0gZGF0ZS5nZXRNaWxsaXNlY29uZHMoKSAtIGRhdGUuZ2V0U2Vjb25kcygpICogZHVyYXRpb25TZWNvbmQgLSBkYXRlLmdldE1pbnV0ZXMoKSAqIGR1cmF0aW9uTWludXRlKTtcbn0sIChkYXRlLCBzdGVwKSA9PiB7XG4gIGRhdGUuc2V0VGltZSgrZGF0ZSArIHN0ZXAgKiBkdXJhdGlvbkhvdXIpO1xufSwgKHN0YXJ0LCBlbmQpID0+IHtcbiAgcmV0dXJuIChlbmQgLSBzdGFydCkgLyBkdXJhdGlvbkhvdXI7XG59LCAoZGF0ZSkgPT4ge1xuICByZXR1cm4gZGF0ZS5nZXRIb3VycygpO1xufSk7XG5cbmV4cG9ydCBjb25zdCB0aW1lSG91cnMgPSB0aW1lSG91ci5yYW5nZTtcblxuZXhwb3J0IGNvbnN0IHV0Y0hvdXIgPSB0aW1lSW50ZXJ2YWwoKGRhdGUpID0+IHtcbiAgZGF0ZS5zZXRVVENNaW51dGVzKDAsIDAsIDApO1xufSwgKGRhdGUsIHN0ZXApID0+IHtcbiAgZGF0ZS5zZXRUaW1lKCtkYXRlICsgc3RlcCAqIGR1cmF0aW9uSG91cik7XG59LCAoc3RhcnQsIGVuZCkgPT4ge1xuICByZXR1cm4gKGVuZCAtIHN0YXJ0KSAvIGR1cmF0aW9uSG91cjtcbn0sIChkYXRlKSA9PiB7XG4gIHJldHVybiBkYXRlLmdldFVUQ0hvdXJzKCk7XG59KTtcblxuZXhwb3J0IGNvbnN0IHV0Y0hvdXJzID0gdXRjSG91ci5yYW5nZTtcbiIsImltcG9ydCB7dGltZUludGVydmFsfSBmcm9tIFwiLi9pbnRlcnZhbC5qc1wiO1xuaW1wb3J0IHtkdXJhdGlvbkRheSwgZHVyYXRpb25NaW51dGV9IGZyb20gXCIuL2R1cmF0aW9uLmpzXCI7XG5cbmV4cG9ydCBjb25zdCB0aW1lRGF5ID0gdGltZUludGVydmFsKFxuICBkYXRlID0+IGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCksXG4gIChkYXRlLCBzdGVwKSA9PiBkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgKyBzdGVwKSxcbiAgKHN0YXJ0LCBlbmQpID0+IChlbmQgLSBzdGFydCAtIChlbmQuZ2V0VGltZXpvbmVPZmZzZXQoKSAtIHN0YXJ0LmdldFRpbWV6b25lT2Zmc2V0KCkpICogZHVyYXRpb25NaW51dGUpIC8gZHVyYXRpb25EYXksXG4gIGRhdGUgPT4gZGF0ZS5nZXREYXRlKCkgLSAxXG4pO1xuXG5leHBvcnQgY29uc3QgdGltZURheXMgPSB0aW1lRGF5LnJhbmdlO1xuXG5leHBvcnQgY29uc3QgdXRjRGF5ID0gdGltZUludGVydmFsKChkYXRlKSA9PiB7XG4gIGRhdGUuc2V0VVRDSG91cnMoMCwgMCwgMCwgMCk7XG59LCAoZGF0ZSwgc3RlcCkgPT4ge1xuICBkYXRlLnNldFVUQ0RhdGUoZGF0ZS5nZXRVVENEYXRlKCkgKyBzdGVwKTtcbn0sIChzdGFydCwgZW5kKSA9PiB7XG4gIHJldHVybiAoZW5kIC0gc3RhcnQpIC8gZHVyYXRpb25EYXk7XG59LCAoZGF0ZSkgPT4ge1xuICByZXR1cm4gZGF0ZS5nZXRVVENEYXRlKCkgLSAxO1xufSk7XG5cbmV4cG9ydCBjb25zdCB1dGNEYXlzID0gdXRjRGF5LnJhbmdlO1xuXG5leHBvcnQgY29uc3QgdW5peERheSA9IHRpbWVJbnRlcnZhbCgoZGF0ZSkgPT4ge1xuICBkYXRlLnNldFVUQ0hvdXJzKDAsIDAsIDAsIDApO1xufSwgKGRhdGUsIHN0ZXApID0+IHtcbiAgZGF0ZS5zZXRVVENEYXRlKGRhdGUuZ2V0VVRDRGF0ZSgpICsgc3RlcCk7XG59LCAoc3RhcnQsIGVuZCkgPT4ge1xuICByZXR1cm4gKGVuZCAtIHN0YXJ0KSAvIGR1cmF0aW9uRGF5O1xufSwgKGRhdGUpID0+IHtcbiAgcmV0dXJuIE1hdGguZmxvb3IoZGF0ZSAvIGR1cmF0aW9uRGF5KTtcbn0pO1xuXG5leHBvcnQgY29uc3QgdW5peERheXMgPSB1bml4RGF5LnJhbmdlO1xuIiwiaW1wb3J0IHt0aW1lSW50ZXJ2YWx9IGZyb20gXCIuL2ludGVydmFsLmpzXCI7XG5pbXBvcnQge2R1cmF0aW9uTWludXRlLCBkdXJhdGlvbldlZWt9IGZyb20gXCIuL2R1cmF0aW9uLmpzXCI7XG5cbmZ1bmN0aW9uIHRpbWVXZWVrZGF5KGkpIHtcbiAgcmV0dXJuIHRpbWVJbnRlcnZhbCgoZGF0ZSkgPT4ge1xuICAgIGRhdGUuc2V0RGF0ZShkYXRlLmdldERhdGUoKSAtIChkYXRlLmdldERheSgpICsgNyAtIGkpICUgNyk7XG4gICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgfSwgKGRhdGUsIHN0ZXApID0+IHtcbiAgICBkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgKyBzdGVwICogNyk7XG4gIH0sIChzdGFydCwgZW5kKSA9PiB7XG4gICAgcmV0dXJuIChlbmQgLSBzdGFydCAtIChlbmQuZ2V0VGltZXpvbmVPZmZzZXQoKSAtIHN0YXJ0LmdldFRpbWV6b25lT2Zmc2V0KCkpICogZHVyYXRpb25NaW51dGUpIC8gZHVyYXRpb25XZWVrO1xuICB9KTtcbn1cblxuZXhwb3J0IGNvbnN0IHRpbWVTdW5kYXkgPSB0aW1lV2Vla2RheSgwKTtcbmV4cG9ydCBjb25zdCB0aW1lTW9uZGF5ID0gdGltZVdlZWtkYXkoMSk7XG5leHBvcnQgY29uc3QgdGltZVR1ZXNkYXkgPSB0aW1lV2Vla2RheSgyKTtcbmV4cG9ydCBjb25zdCB0aW1lV2VkbmVzZGF5ID0gdGltZVdlZWtkYXkoMyk7XG5leHBvcnQgY29uc3QgdGltZVRodXJzZGF5ID0gdGltZVdlZWtkYXkoNCk7XG5leHBvcnQgY29uc3QgdGltZUZyaWRheSA9IHRpbWVXZWVrZGF5KDUpO1xuZXhwb3J0IGNvbnN0IHRpbWVTYXR1cmRheSA9IHRpbWVXZWVrZGF5KDYpO1xuXG5leHBvcnQgY29uc3QgdGltZVN1bmRheXMgPSB0aW1lU3VuZGF5LnJhbmdlO1xuZXhwb3J0IGNvbnN0IHRpbWVNb25kYXlzID0gdGltZU1vbmRheS5yYW5nZTtcbmV4cG9ydCBjb25zdCB0aW1lVHVlc2RheXMgPSB0aW1lVHVlc2RheS5yYW5nZTtcbmV4cG9ydCBjb25zdCB0aW1lV2VkbmVzZGF5cyA9IHRpbWVXZWRuZXNkYXkucmFuZ2U7XG5leHBvcnQgY29uc3QgdGltZVRodXJzZGF5cyA9IHRpbWVUaHVyc2RheS5yYW5nZTtcbmV4cG9ydCBjb25zdCB0aW1lRnJpZGF5cyA9IHRpbWVGcmlkYXkucmFuZ2U7XG5leHBvcnQgY29uc3QgdGltZVNhdHVyZGF5cyA9IHRpbWVTYXR1cmRheS5yYW5nZTtcblxuZnVuY3Rpb24gdXRjV2Vla2RheShpKSB7XG4gIHJldHVybiB0aW1lSW50ZXJ2YWwoKGRhdGUpID0+IHtcbiAgICBkYXRlLnNldFVUQ0RhdGUoZGF0ZS5nZXRVVENEYXRlKCkgLSAoZGF0ZS5nZXRVVENEYXkoKSArIDcgLSBpKSAlIDcpO1xuICAgIGRhdGUuc2V0VVRDSG91cnMoMCwgMCwgMCwgMCk7XG4gIH0sIChkYXRlLCBzdGVwKSA9PiB7XG4gICAgZGF0ZS5zZXRVVENEYXRlKGRhdGUuZ2V0VVRDRGF0ZSgpICsgc3RlcCAqIDcpO1xuICB9LCAoc3RhcnQsIGVuZCkgPT4ge1xuICAgIHJldHVybiAoZW5kIC0gc3RhcnQpIC8gZHVyYXRpb25XZWVrO1xuICB9KTtcbn1cblxuZXhwb3J0IGNvbnN0IHV0Y1N1bmRheSA9IHV0Y1dlZWtkYXkoMCk7XG5leHBvcnQgY29uc3QgdXRjTW9uZGF5ID0gdXRjV2Vla2RheSgxKTtcbmV4cG9ydCBjb25zdCB1dGNUdWVzZGF5ID0gdXRjV2Vla2RheSgyKTtcbmV4cG9ydCBjb25zdCB1dGNXZWRuZXNkYXkgPSB1dGNXZWVrZGF5KDMpO1xuZXhwb3J0IGNvbnN0IHV0Y1RodXJzZGF5ID0gdXRjV2Vla2RheSg0KTtcbmV4cG9ydCBjb25zdCB1dGNGcmlkYXkgPSB1dGNXZWVrZGF5KDUpO1xuZXhwb3J0IGNvbnN0IHV0Y1NhdHVyZGF5ID0gdXRjV2Vla2RheSg2KTtcblxuZXhwb3J0IGNvbnN0IHV0Y1N1bmRheXMgPSB1dGNTdW5kYXkucmFuZ2U7XG5leHBvcnQgY29uc3QgdXRjTW9uZGF5cyA9IHV0Y01vbmRheS5yYW5nZTtcbmV4cG9ydCBjb25zdCB1dGNUdWVzZGF5cyA9IHV0Y1R1ZXNkYXkucmFuZ2U7XG5leHBvcnQgY29uc3QgdXRjV2VkbmVzZGF5cyA9IHV0Y1dlZG5lc2RheS5yYW5nZTtcbmV4cG9ydCBjb25zdCB1dGNUaHVyc2RheXMgPSB1dGNUaHVyc2RheS5yYW5nZTtcbmV4cG9ydCBjb25zdCB1dGNGcmlkYXlzID0gdXRjRnJpZGF5LnJhbmdlO1xuZXhwb3J0IGNvbnN0IHV0Y1NhdHVyZGF5cyA9IHV0Y1NhdHVyZGF5LnJhbmdlO1xuIiwiaW1wb3J0IHt0aW1lSW50ZXJ2YWx9IGZyb20gXCIuL2ludGVydmFsLmpzXCI7XG5cbmV4cG9ydCBjb25zdCB0aW1lTW9udGggPSB0aW1lSW50ZXJ2YWwoKGRhdGUpID0+IHtcbiAgZGF0ZS5zZXREYXRlKDEpO1xuICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xufSwgKGRhdGUsIHN0ZXApID0+IHtcbiAgZGF0ZS5zZXRNb250aChkYXRlLmdldE1vbnRoKCkgKyBzdGVwKTtcbn0sIChzdGFydCwgZW5kKSA9PiB7XG4gIHJldHVybiBlbmQuZ2V0TW9udGgoKSAtIHN0YXJ0LmdldE1vbnRoKCkgKyAoZW5kLmdldEZ1bGxZZWFyKCkgLSBzdGFydC5nZXRGdWxsWWVhcigpKSAqIDEyO1xufSwgKGRhdGUpID0+IHtcbiAgcmV0dXJuIGRhdGUuZ2V0TW9udGgoKTtcbn0pO1xuXG5leHBvcnQgY29uc3QgdGltZU1vbnRocyA9IHRpbWVNb250aC5yYW5nZTtcblxuZXhwb3J0IGNvbnN0IHV0Y01vbnRoID0gdGltZUludGVydmFsKChkYXRlKSA9PiB7XG4gIGRhdGUuc2V0VVRDRGF0ZSgxKTtcbiAgZGF0ZS5zZXRVVENIb3VycygwLCAwLCAwLCAwKTtcbn0sIChkYXRlLCBzdGVwKSA9PiB7XG4gIGRhdGUuc2V0VVRDTW9udGgoZGF0ZS5nZXRVVENNb250aCgpICsgc3RlcCk7XG59LCAoc3RhcnQsIGVuZCkgPT4ge1xuICByZXR1cm4gZW5kLmdldFVUQ01vbnRoKCkgLSBzdGFydC5nZXRVVENNb250aCgpICsgKGVuZC5nZXRVVENGdWxsWWVhcigpIC0gc3RhcnQuZ2V0VVRDRnVsbFllYXIoKSkgKiAxMjtcbn0sIChkYXRlKSA9PiB7XG4gIHJldHVybiBkYXRlLmdldFVUQ01vbnRoKCk7XG59KTtcblxuZXhwb3J0IGNvbnN0IHV0Y01vbnRocyA9IHV0Y01vbnRoLnJhbmdlO1xuIiwiaW1wb3J0IHt0aW1lSW50ZXJ2YWx9IGZyb20gXCIuL2ludGVydmFsLmpzXCI7XG5cbmV4cG9ydCBjb25zdCB0aW1lWWVhciA9IHRpbWVJbnRlcnZhbCgoZGF0ZSkgPT4ge1xuICBkYXRlLnNldE1vbnRoKDAsIDEpO1xuICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xufSwgKGRhdGUsIHN0ZXApID0+IHtcbiAgZGF0ZS5zZXRGdWxsWWVhcihkYXRlLmdldEZ1bGxZZWFyKCkgKyBzdGVwKTtcbn0sIChzdGFydCwgZW5kKSA9PiB7XG4gIHJldHVybiBlbmQuZ2V0RnVsbFllYXIoKSAtIHN0YXJ0LmdldEZ1bGxZZWFyKCk7XG59LCAoZGF0ZSkgPT4ge1xuICByZXR1cm4gZGF0ZS5nZXRGdWxsWWVhcigpO1xufSk7XG5cbi8vIEFuIG9wdGltaXplZCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhpcyBzaW1wbGUgY2FzZS5cbnRpbWVZZWFyLmV2ZXJ5ID0gKGspID0+IHtcbiAgcmV0dXJuICFpc0Zpbml0ZShrID0gTWF0aC5mbG9vcihrKSkgfHwgIShrID4gMCkgPyBudWxsIDogdGltZUludGVydmFsKChkYXRlKSA9PiB7XG4gICAgZGF0ZS5zZXRGdWxsWWVhcihNYXRoLmZsb29yKGRhdGUuZ2V0RnVsbFllYXIoKSAvIGspICogayk7XG4gICAgZGF0ZS5zZXRNb250aCgwLCAxKTtcbiAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICB9LCAoZGF0ZSwgc3RlcCkgPT4ge1xuICAgIGRhdGUuc2V0RnVsbFllYXIoZGF0ZS5nZXRGdWxsWWVhcigpICsgc3RlcCAqIGspO1xuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCB0aW1lWWVhcnMgPSB0aW1lWWVhci5yYW5nZTtcblxuZXhwb3J0IGNvbnN0IHV0Y1llYXIgPSB0aW1lSW50ZXJ2YWwoKGRhdGUpID0+IHtcbiAgZGF0ZS5zZXRVVENNb250aCgwLCAxKTtcbiAgZGF0ZS5zZXRVVENIb3VycygwLCAwLCAwLCAwKTtcbn0sIChkYXRlLCBzdGVwKSA9PiB7XG4gIGRhdGUuc2V0VVRDRnVsbFllYXIoZGF0ZS5nZXRVVENGdWxsWWVhcigpICsgc3RlcCk7XG59LCAoc3RhcnQsIGVuZCkgPT4ge1xuICByZXR1cm4gZW5kLmdldFVUQ0Z1bGxZZWFyKCkgLSBzdGFydC5nZXRVVENGdWxsWWVhcigpO1xufSwgKGRhdGUpID0+IHtcbiAgcmV0dXJuIGRhdGUuZ2V0VVRDRnVsbFllYXIoKTtcbn0pO1xuXG4vLyBBbiBvcHRpbWl6ZWQgaW1wbGVtZW50YXRpb24gZm9yIHRoaXMgc2ltcGxlIGNhc2UuXG51dGNZZWFyLmV2ZXJ5ID0gKGspID0+IHtcbiAgcmV0dXJuICFpc0Zpbml0ZShrID0gTWF0aC5mbG9vcihrKSkgfHwgIShrID4gMCkgPyBudWxsIDogdGltZUludGVydmFsKChkYXRlKSA9PiB7XG4gICAgZGF0ZS5zZXRVVENGdWxsWWVhcihNYXRoLmZsb29yKGRhdGUuZ2V0VVRDRnVsbFllYXIoKSAvIGspICogayk7XG4gICAgZGF0ZS5zZXRVVENNb250aCgwLCAxKTtcbiAgICBkYXRlLnNldFVUQ0hvdXJzKDAsIDAsIDAsIDApO1xuICB9LCAoZGF0ZSwgc3RlcCkgPT4ge1xuICAgIGRhdGUuc2V0VVRDRnVsbFllYXIoZGF0ZS5nZXRVVENGdWxsWWVhcigpICsgc3RlcCAqIGspO1xuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCB1dGNZZWFycyA9IHV0Y1llYXIucmFuZ2U7XG4iLCJpbXBvcnQge2Jpc2VjdG9yLCB0aWNrU3RlcH0gZnJvbSBcImQzLWFycmF5XCI7XG5pbXBvcnQge2R1cmF0aW9uRGF5LCBkdXJhdGlvbkhvdXIsIGR1cmF0aW9uTWludXRlLCBkdXJhdGlvbk1vbnRoLCBkdXJhdGlvblNlY29uZCwgZHVyYXRpb25XZWVrLCBkdXJhdGlvblllYXJ9IGZyb20gXCIuL2R1cmF0aW9uLmpzXCI7XG5pbXBvcnQge21pbGxpc2Vjb25kfSBmcm9tIFwiLi9taWxsaXNlY29uZC5qc1wiO1xuaW1wb3J0IHtzZWNvbmR9IGZyb20gXCIuL3NlY29uZC5qc1wiO1xuaW1wb3J0IHt0aW1lTWludXRlLCB1dGNNaW51dGV9IGZyb20gXCIuL21pbnV0ZS5qc1wiO1xuaW1wb3J0IHt0aW1lSG91ciwgdXRjSG91cn0gZnJvbSBcIi4vaG91ci5qc1wiO1xuaW1wb3J0IHt0aW1lRGF5LCB1bml4RGF5fSBmcm9tIFwiLi9kYXkuanNcIjtcbmltcG9ydCB7dGltZVN1bmRheSwgdXRjU3VuZGF5fSBmcm9tIFwiLi93ZWVrLmpzXCI7XG5pbXBvcnQge3RpbWVNb250aCwgdXRjTW9udGh9IGZyb20gXCIuL21vbnRoLmpzXCI7XG5pbXBvcnQge3RpbWVZZWFyLCB1dGNZZWFyfSBmcm9tIFwiLi95ZWFyLmpzXCI7XG5cbmZ1bmN0aW9uIHRpY2tlcih5ZWFyLCBtb250aCwgd2VlaywgZGF5LCBob3VyLCBtaW51dGUpIHtcblxuICBjb25zdCB0aWNrSW50ZXJ2YWxzID0gW1xuICAgIFtzZWNvbmQsICAxLCAgICAgIGR1cmF0aW9uU2Vjb25kXSxcbiAgICBbc2Vjb25kLCAgNSwgIDUgKiBkdXJhdGlvblNlY29uZF0sXG4gICAgW3NlY29uZCwgMTUsIDE1ICogZHVyYXRpb25TZWNvbmRdLFxuICAgIFtzZWNvbmQsIDMwLCAzMCAqIGR1cmF0aW9uU2Vjb25kXSxcbiAgICBbbWludXRlLCAgMSwgICAgICBkdXJhdGlvbk1pbnV0ZV0sXG4gICAgW21pbnV0ZSwgIDUsICA1ICogZHVyYXRpb25NaW51dGVdLFxuICAgIFttaW51dGUsIDE1LCAxNSAqIGR1cmF0aW9uTWludXRlXSxcbiAgICBbbWludXRlLCAzMCwgMzAgKiBkdXJhdGlvbk1pbnV0ZV0sXG4gICAgWyAgaG91ciwgIDEsICAgICAgZHVyYXRpb25Ib3VyICBdLFxuICAgIFsgIGhvdXIsICAzLCAgMyAqIGR1cmF0aW9uSG91ciAgXSxcbiAgICBbICBob3VyLCAgNiwgIDYgKiBkdXJhdGlvbkhvdXIgIF0sXG4gICAgWyAgaG91ciwgMTIsIDEyICogZHVyYXRpb25Ib3VyICBdLFxuICAgIFsgICBkYXksICAxLCAgICAgIGR1cmF0aW9uRGF5ICAgXSxcbiAgICBbICAgZGF5LCAgMiwgIDIgKiBkdXJhdGlvbkRheSAgIF0sXG4gICAgWyAgd2VlaywgIDEsICAgICAgZHVyYXRpb25XZWVrICBdLFxuICAgIFsgbW9udGgsICAxLCAgICAgIGR1cmF0aW9uTW9udGggXSxcbiAgICBbIG1vbnRoLCAgMywgIDMgKiBkdXJhdGlvbk1vbnRoIF0sXG4gICAgWyAgeWVhciwgIDEsICAgICAgZHVyYXRpb25ZZWFyICBdXG4gIF07XG5cbiAgZnVuY3Rpb24gdGlja3Moc3RhcnQsIHN0b3AsIGNvdW50KSB7XG4gICAgY29uc3QgcmV2ZXJzZSA9IHN0b3AgPCBzdGFydDtcbiAgICBpZiAocmV2ZXJzZSkgW3N0YXJ0LCBzdG9wXSA9IFtzdG9wLCBzdGFydF07XG4gICAgY29uc3QgaW50ZXJ2YWwgPSBjb3VudCAmJiB0eXBlb2YgY291bnQucmFuZ2UgPT09IFwiZnVuY3Rpb25cIiA/IGNvdW50IDogdGlja0ludGVydmFsKHN0YXJ0LCBzdG9wLCBjb3VudCk7XG4gICAgY29uc3QgdGlja3MgPSBpbnRlcnZhbCA/IGludGVydmFsLnJhbmdlKHN0YXJ0LCArc3RvcCArIDEpIDogW107IC8vIGluY2x1c2l2ZSBzdG9wXG4gICAgcmV0dXJuIHJldmVyc2UgPyB0aWNrcy5yZXZlcnNlKCkgOiB0aWNrcztcbiAgfVxuXG4gIGZ1bmN0aW9uIHRpY2tJbnRlcnZhbChzdGFydCwgc3RvcCwgY291bnQpIHtcbiAgICBjb25zdCB0YXJnZXQgPSBNYXRoLmFicyhzdG9wIC0gc3RhcnQpIC8gY291bnQ7XG4gICAgY29uc3QgaSA9IGJpc2VjdG9yKChbLCwgc3RlcF0pID0+IHN0ZXApLnJpZ2h0KHRpY2tJbnRlcnZhbHMsIHRhcmdldCk7XG4gICAgaWYgKGkgPT09IHRpY2tJbnRlcnZhbHMubGVuZ3RoKSByZXR1cm4geWVhci5ldmVyeSh0aWNrU3RlcChzdGFydCAvIGR1cmF0aW9uWWVhciwgc3RvcCAvIGR1cmF0aW9uWWVhciwgY291bnQpKTtcbiAgICBpZiAoaSA9PT0gMCkgcmV0dXJuIG1pbGxpc2Vjb25kLmV2ZXJ5KE1hdGgubWF4KHRpY2tTdGVwKHN0YXJ0LCBzdG9wLCBjb3VudCksIDEpKTtcbiAgICBjb25zdCBbdCwgc3RlcF0gPSB0aWNrSW50ZXJ2YWxzW3RhcmdldCAvIHRpY2tJbnRlcnZhbHNbaSAtIDFdWzJdIDwgdGlja0ludGVydmFsc1tpXVsyXSAvIHRhcmdldCA/IGkgLSAxIDogaV07XG4gICAgcmV0dXJuIHQuZXZlcnkoc3RlcCk7XG4gIH1cblxuICByZXR1cm4gW3RpY2tzLCB0aWNrSW50ZXJ2YWxdO1xufVxuXG5jb25zdCBbdXRjVGlja3MsIHV0Y1RpY2tJbnRlcnZhbF0gPSB0aWNrZXIodXRjWWVhciwgdXRjTW9udGgsIHV0Y1N1bmRheSwgdW5peERheSwgdXRjSG91ciwgdXRjTWludXRlKTtcbmNvbnN0IFt0aW1lVGlja3MsIHRpbWVUaWNrSW50ZXJ2YWxdID0gdGlja2VyKHRpbWVZZWFyLCB0aW1lTW9udGgsIHRpbWVTdW5kYXksIHRpbWVEYXksIHRpbWVIb3VyLCB0aW1lTWludXRlKTtcblxuZXhwb3J0IHt1dGNUaWNrcywgdXRjVGlja0ludGVydmFsLCB0aW1lVGlja3MsIHRpbWVUaWNrSW50ZXJ2YWx9O1xuIiwiaW1wb3J0IHtcbiAgdGltZURheSxcbiAgdGltZVN1bmRheSxcbiAgdGltZU1vbmRheSxcbiAgdGltZVRodXJzZGF5LFxuICB0aW1lWWVhcixcbiAgdXRjRGF5LFxuICB1dGNTdW5kYXksXG4gIHV0Y01vbmRheSxcbiAgdXRjVGh1cnNkYXksXG4gIHV0Y1llYXJcbn0gZnJvbSBcImQzLXRpbWVcIjtcblxuZnVuY3Rpb24gbG9jYWxEYXRlKGQpIHtcbiAgaWYgKDAgPD0gZC55ICYmIGQueSA8IDEwMCkge1xuICAgIHZhciBkYXRlID0gbmV3IERhdGUoLTEsIGQubSwgZC5kLCBkLkgsIGQuTSwgZC5TLCBkLkwpO1xuICAgIGRhdGUuc2V0RnVsbFllYXIoZC55KTtcbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxuICByZXR1cm4gbmV3IERhdGUoZC55LCBkLm0sIGQuZCwgZC5ILCBkLk0sIGQuUywgZC5MKTtcbn1cblxuZnVuY3Rpb24gdXRjRGF0ZShkKSB7XG4gIGlmICgwIDw9IGQueSAmJiBkLnkgPCAxMDApIHtcbiAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKERhdGUuVVRDKC0xLCBkLm0sIGQuZCwgZC5ILCBkLk0sIGQuUywgZC5MKSk7XG4gICAgZGF0ZS5zZXRVVENGdWxsWWVhcihkLnkpO1xuICAgIHJldHVybiBkYXRlO1xuICB9XG4gIHJldHVybiBuZXcgRGF0ZShEYXRlLlVUQyhkLnksIGQubSwgZC5kLCBkLkgsIGQuTSwgZC5TLCBkLkwpKTtcbn1cblxuZnVuY3Rpb24gbmV3RGF0ZSh5LCBtLCBkKSB7XG4gIHJldHVybiB7eTogeSwgbTogbSwgZDogZCwgSDogMCwgTTogMCwgUzogMCwgTDogMH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGZvcm1hdExvY2FsZShsb2NhbGUpIHtcbiAgdmFyIGxvY2FsZV9kYXRlVGltZSA9IGxvY2FsZS5kYXRlVGltZSxcbiAgICAgIGxvY2FsZV9kYXRlID0gbG9jYWxlLmRhdGUsXG4gICAgICBsb2NhbGVfdGltZSA9IGxvY2FsZS50aW1lLFxuICAgICAgbG9jYWxlX3BlcmlvZHMgPSBsb2NhbGUucGVyaW9kcyxcbiAgICAgIGxvY2FsZV93ZWVrZGF5cyA9IGxvY2FsZS5kYXlzLFxuICAgICAgbG9jYWxlX3Nob3J0V2Vla2RheXMgPSBsb2NhbGUuc2hvcnREYXlzLFxuICAgICAgbG9jYWxlX21vbnRocyA9IGxvY2FsZS5tb250aHMsXG4gICAgICBsb2NhbGVfc2hvcnRNb250aHMgPSBsb2NhbGUuc2hvcnRNb250aHM7XG5cbiAgdmFyIHBlcmlvZFJlID0gZm9ybWF0UmUobG9jYWxlX3BlcmlvZHMpLFxuICAgICAgcGVyaW9kTG9va3VwID0gZm9ybWF0TG9va3VwKGxvY2FsZV9wZXJpb2RzKSxcbiAgICAgIHdlZWtkYXlSZSA9IGZvcm1hdFJlKGxvY2FsZV93ZWVrZGF5cyksXG4gICAgICB3ZWVrZGF5TG9va3VwID0gZm9ybWF0TG9va3VwKGxvY2FsZV93ZWVrZGF5cyksXG4gICAgICBzaG9ydFdlZWtkYXlSZSA9IGZvcm1hdFJlKGxvY2FsZV9zaG9ydFdlZWtkYXlzKSxcbiAgICAgIHNob3J0V2Vla2RheUxvb2t1cCA9IGZvcm1hdExvb2t1cChsb2NhbGVfc2hvcnRXZWVrZGF5cyksXG4gICAgICBtb250aFJlID0gZm9ybWF0UmUobG9jYWxlX21vbnRocyksXG4gICAgICBtb250aExvb2t1cCA9IGZvcm1hdExvb2t1cChsb2NhbGVfbW9udGhzKSxcbiAgICAgIHNob3J0TW9udGhSZSA9IGZvcm1hdFJlKGxvY2FsZV9zaG9ydE1vbnRocyksXG4gICAgICBzaG9ydE1vbnRoTG9va3VwID0gZm9ybWF0TG9va3VwKGxvY2FsZV9zaG9ydE1vbnRocyk7XG5cbiAgdmFyIGZvcm1hdHMgPSB7XG4gICAgXCJhXCI6IGZvcm1hdFNob3J0V2Vla2RheSxcbiAgICBcIkFcIjogZm9ybWF0V2Vla2RheSxcbiAgICBcImJcIjogZm9ybWF0U2hvcnRNb250aCxcbiAgICBcIkJcIjogZm9ybWF0TW9udGgsXG4gICAgXCJjXCI6IG51bGwsXG4gICAgXCJkXCI6IGZvcm1hdERheU9mTW9udGgsXG4gICAgXCJlXCI6IGZvcm1hdERheU9mTW9udGgsXG4gICAgXCJmXCI6IGZvcm1hdE1pY3Jvc2Vjb25kcyxcbiAgICBcImdcIjogZm9ybWF0WWVhcklTTyxcbiAgICBcIkdcIjogZm9ybWF0RnVsbFllYXJJU08sXG4gICAgXCJIXCI6IGZvcm1hdEhvdXIyNCxcbiAgICBcIklcIjogZm9ybWF0SG91cjEyLFxuICAgIFwialwiOiBmb3JtYXREYXlPZlllYXIsXG4gICAgXCJMXCI6IGZvcm1hdE1pbGxpc2Vjb25kcyxcbiAgICBcIm1cIjogZm9ybWF0TW9udGhOdW1iZXIsXG4gICAgXCJNXCI6IGZvcm1hdE1pbnV0ZXMsXG4gICAgXCJwXCI6IGZvcm1hdFBlcmlvZCxcbiAgICBcInFcIjogZm9ybWF0UXVhcnRlcixcbiAgICBcIlFcIjogZm9ybWF0VW5peFRpbWVzdGFtcCxcbiAgICBcInNcIjogZm9ybWF0VW5peFRpbWVzdGFtcFNlY29uZHMsXG4gICAgXCJTXCI6IGZvcm1hdFNlY29uZHMsXG4gICAgXCJ1XCI6IGZvcm1hdFdlZWtkYXlOdW1iZXJNb25kYXksXG4gICAgXCJVXCI6IGZvcm1hdFdlZWtOdW1iZXJTdW5kYXksXG4gICAgXCJWXCI6IGZvcm1hdFdlZWtOdW1iZXJJU08sXG4gICAgXCJ3XCI6IGZvcm1hdFdlZWtkYXlOdW1iZXJTdW5kYXksXG4gICAgXCJXXCI6IGZvcm1hdFdlZWtOdW1iZXJNb25kYXksXG4gICAgXCJ4XCI6IG51bGwsXG4gICAgXCJYXCI6IG51bGwsXG4gICAgXCJ5XCI6IGZvcm1hdFllYXIsXG4gICAgXCJZXCI6IGZvcm1hdEZ1bGxZZWFyLFxuICAgIFwiWlwiOiBmb3JtYXRab25lLFxuICAgIFwiJVwiOiBmb3JtYXRMaXRlcmFsUGVyY2VudFxuICB9O1xuXG4gIHZhciB1dGNGb3JtYXRzID0ge1xuICAgIFwiYVwiOiBmb3JtYXRVVENTaG9ydFdlZWtkYXksXG4gICAgXCJBXCI6IGZvcm1hdFVUQ1dlZWtkYXksXG4gICAgXCJiXCI6IGZvcm1hdFVUQ1Nob3J0TW9udGgsXG4gICAgXCJCXCI6IGZvcm1hdFVUQ01vbnRoLFxuICAgIFwiY1wiOiBudWxsLFxuICAgIFwiZFwiOiBmb3JtYXRVVENEYXlPZk1vbnRoLFxuICAgIFwiZVwiOiBmb3JtYXRVVENEYXlPZk1vbnRoLFxuICAgIFwiZlwiOiBmb3JtYXRVVENNaWNyb3NlY29uZHMsXG4gICAgXCJnXCI6IGZvcm1hdFVUQ1llYXJJU08sXG4gICAgXCJHXCI6IGZvcm1hdFVUQ0Z1bGxZZWFySVNPLFxuICAgIFwiSFwiOiBmb3JtYXRVVENIb3VyMjQsXG4gICAgXCJJXCI6IGZvcm1hdFVUQ0hvdXIxMixcbiAgICBcImpcIjogZm9ybWF0VVRDRGF5T2ZZZWFyLFxuICAgIFwiTFwiOiBmb3JtYXRVVENNaWxsaXNlY29uZHMsXG4gICAgXCJtXCI6IGZvcm1hdFVUQ01vbnRoTnVtYmVyLFxuICAgIFwiTVwiOiBmb3JtYXRVVENNaW51dGVzLFxuICAgIFwicFwiOiBmb3JtYXRVVENQZXJpb2QsXG4gICAgXCJxXCI6IGZvcm1hdFVUQ1F1YXJ0ZXIsXG4gICAgXCJRXCI6IGZvcm1hdFVuaXhUaW1lc3RhbXAsXG4gICAgXCJzXCI6IGZvcm1hdFVuaXhUaW1lc3RhbXBTZWNvbmRzLFxuICAgIFwiU1wiOiBmb3JtYXRVVENTZWNvbmRzLFxuICAgIFwidVwiOiBmb3JtYXRVVENXZWVrZGF5TnVtYmVyTW9uZGF5LFxuICAgIFwiVVwiOiBmb3JtYXRVVENXZWVrTnVtYmVyU3VuZGF5LFxuICAgIFwiVlwiOiBmb3JtYXRVVENXZWVrTnVtYmVySVNPLFxuICAgIFwid1wiOiBmb3JtYXRVVENXZWVrZGF5TnVtYmVyU3VuZGF5LFxuICAgIFwiV1wiOiBmb3JtYXRVVENXZWVrTnVtYmVyTW9uZGF5LFxuICAgIFwieFwiOiBudWxsLFxuICAgIFwiWFwiOiBudWxsLFxuICAgIFwieVwiOiBmb3JtYXRVVENZZWFyLFxuICAgIFwiWVwiOiBmb3JtYXRVVENGdWxsWWVhcixcbiAgICBcIlpcIjogZm9ybWF0VVRDWm9uZSxcbiAgICBcIiVcIjogZm9ybWF0TGl0ZXJhbFBlcmNlbnRcbiAgfTtcblxuICB2YXIgcGFyc2VzID0ge1xuICAgIFwiYVwiOiBwYXJzZVNob3J0V2Vla2RheSxcbiAgICBcIkFcIjogcGFyc2VXZWVrZGF5LFxuICAgIFwiYlwiOiBwYXJzZVNob3J0TW9udGgsXG4gICAgXCJCXCI6IHBhcnNlTW9udGgsXG4gICAgXCJjXCI6IHBhcnNlTG9jYWxlRGF0ZVRpbWUsXG4gICAgXCJkXCI6IHBhcnNlRGF5T2ZNb250aCxcbiAgICBcImVcIjogcGFyc2VEYXlPZk1vbnRoLFxuICAgIFwiZlwiOiBwYXJzZU1pY3Jvc2Vjb25kcyxcbiAgICBcImdcIjogcGFyc2VZZWFyLFxuICAgIFwiR1wiOiBwYXJzZUZ1bGxZZWFyLFxuICAgIFwiSFwiOiBwYXJzZUhvdXIyNCxcbiAgICBcIklcIjogcGFyc2VIb3VyMjQsXG4gICAgXCJqXCI6IHBhcnNlRGF5T2ZZZWFyLFxuICAgIFwiTFwiOiBwYXJzZU1pbGxpc2Vjb25kcyxcbiAgICBcIm1cIjogcGFyc2VNb250aE51bWJlcixcbiAgICBcIk1cIjogcGFyc2VNaW51dGVzLFxuICAgIFwicFwiOiBwYXJzZVBlcmlvZCxcbiAgICBcInFcIjogcGFyc2VRdWFydGVyLFxuICAgIFwiUVwiOiBwYXJzZVVuaXhUaW1lc3RhbXAsXG4gICAgXCJzXCI6IHBhcnNlVW5peFRpbWVzdGFtcFNlY29uZHMsXG4gICAgXCJTXCI6IHBhcnNlU2Vjb25kcyxcbiAgICBcInVcIjogcGFyc2VXZWVrZGF5TnVtYmVyTW9uZGF5LFxuICAgIFwiVVwiOiBwYXJzZVdlZWtOdW1iZXJTdW5kYXksXG4gICAgXCJWXCI6IHBhcnNlV2Vla051bWJlcklTTyxcbiAgICBcIndcIjogcGFyc2VXZWVrZGF5TnVtYmVyU3VuZGF5LFxuICAgIFwiV1wiOiBwYXJzZVdlZWtOdW1iZXJNb25kYXksXG4gICAgXCJ4XCI6IHBhcnNlTG9jYWxlRGF0ZSxcbiAgICBcIlhcIjogcGFyc2VMb2NhbGVUaW1lLFxuICAgIFwieVwiOiBwYXJzZVllYXIsXG4gICAgXCJZXCI6IHBhcnNlRnVsbFllYXIsXG4gICAgXCJaXCI6IHBhcnNlWm9uZSxcbiAgICBcIiVcIjogcGFyc2VMaXRlcmFsUGVyY2VudFxuICB9O1xuXG4gIC8vIFRoZXNlIHJlY3Vyc2l2ZSBkaXJlY3RpdmUgZGVmaW5pdGlvbnMgbXVzdCBiZSBkZWZlcnJlZC5cbiAgZm9ybWF0cy54ID0gbmV3Rm9ybWF0KGxvY2FsZV9kYXRlLCBmb3JtYXRzKTtcbiAgZm9ybWF0cy5YID0gbmV3Rm9ybWF0KGxvY2FsZV90aW1lLCBmb3JtYXRzKTtcbiAgZm9ybWF0cy5jID0gbmV3Rm9ybWF0KGxvY2FsZV9kYXRlVGltZSwgZm9ybWF0cyk7XG4gIHV0Y0Zvcm1hdHMueCA9IG5ld0Zvcm1hdChsb2NhbGVfZGF0ZSwgdXRjRm9ybWF0cyk7XG4gIHV0Y0Zvcm1hdHMuWCA9IG5ld0Zvcm1hdChsb2NhbGVfdGltZSwgdXRjRm9ybWF0cyk7XG4gIHV0Y0Zvcm1hdHMuYyA9IG5ld0Zvcm1hdChsb2NhbGVfZGF0ZVRpbWUsIHV0Y0Zvcm1hdHMpO1xuXG4gIGZ1bmN0aW9uIG5ld0Zvcm1hdChzcGVjaWZpZXIsIGZvcm1hdHMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oZGF0ZSkge1xuICAgICAgdmFyIHN0cmluZyA9IFtdLFxuICAgICAgICAgIGkgPSAtMSxcbiAgICAgICAgICBqID0gMCxcbiAgICAgICAgICBuID0gc3BlY2lmaWVyLmxlbmd0aCxcbiAgICAgICAgICBjLFxuICAgICAgICAgIHBhZCxcbiAgICAgICAgICBmb3JtYXQ7XG5cbiAgICAgIGlmICghKGRhdGUgaW5zdGFuY2VvZiBEYXRlKSkgZGF0ZSA9IG5ldyBEYXRlKCtkYXRlKTtcblxuICAgICAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICAgICAgaWYgKHNwZWNpZmllci5jaGFyQ29kZUF0KGkpID09PSAzNykge1xuICAgICAgICAgIHN0cmluZy5wdXNoKHNwZWNpZmllci5zbGljZShqLCBpKSk7XG4gICAgICAgICAgaWYgKChwYWQgPSBwYWRzW2MgPSBzcGVjaWZpZXIuY2hhckF0KCsraSldKSAhPSBudWxsKSBjID0gc3BlY2lmaWVyLmNoYXJBdCgrK2kpO1xuICAgICAgICAgIGVsc2UgcGFkID0gYyA9PT0gXCJlXCIgPyBcIiBcIiA6IFwiMFwiO1xuICAgICAgICAgIGlmIChmb3JtYXQgPSBmb3JtYXRzW2NdKSBjID0gZm9ybWF0KGRhdGUsIHBhZCk7XG4gICAgICAgICAgc3RyaW5nLnB1c2goYyk7XG4gICAgICAgICAgaiA9IGkgKyAxO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHN0cmluZy5wdXNoKHNwZWNpZmllci5zbGljZShqLCBpKSk7XG4gICAgICByZXR1cm4gc3RyaW5nLmpvaW4oXCJcIik7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG5ld1BhcnNlKHNwZWNpZmllciwgWikge1xuICAgIHJldHVybiBmdW5jdGlvbihzdHJpbmcpIHtcbiAgICAgIHZhciBkID0gbmV3RGF0ZSgxOTAwLCB1bmRlZmluZWQsIDEpLFxuICAgICAgICAgIGkgPSBwYXJzZVNwZWNpZmllcihkLCBzcGVjaWZpZXIsIHN0cmluZyArPSBcIlwiLCAwKSxcbiAgICAgICAgICB3ZWVrLCBkYXk7XG4gICAgICBpZiAoaSAhPSBzdHJpbmcubGVuZ3RoKSByZXR1cm4gbnVsbDtcblxuICAgICAgLy8gSWYgYSBVTklYIHRpbWVzdGFtcCBpcyBzcGVjaWZpZWQsIHJldHVybiBpdC5cbiAgICAgIGlmIChcIlFcIiBpbiBkKSByZXR1cm4gbmV3IERhdGUoZC5RKTtcbiAgICAgIGlmIChcInNcIiBpbiBkKSByZXR1cm4gbmV3IERhdGUoZC5zICogMTAwMCArIChcIkxcIiBpbiBkID8gZC5MIDogMCkpO1xuXG4gICAgICAvLyBJZiB0aGlzIGlzIHV0Y1BhcnNlLCBuZXZlciB1c2UgdGhlIGxvY2FsIHRpbWV6b25lLlxuICAgICAgaWYgKFogJiYgIShcIlpcIiBpbiBkKSkgZC5aID0gMDtcblxuICAgICAgLy8gVGhlIGFtLXBtIGZsYWcgaXMgMCBmb3IgQU0sIGFuZCAxIGZvciBQTS5cbiAgICAgIGlmIChcInBcIiBpbiBkKSBkLkggPSBkLkggJSAxMiArIGQucCAqIDEyO1xuXG4gICAgICAvLyBJZiB0aGUgbW9udGggd2FzIG5vdCBzcGVjaWZpZWQsIGluaGVyaXQgZnJvbSB0aGUgcXVhcnRlci5cbiAgICAgIGlmIChkLm0gPT09IHVuZGVmaW5lZCkgZC5tID0gXCJxXCIgaW4gZCA/IGQucSA6IDA7XG5cbiAgICAgIC8vIENvbnZlcnQgZGF5LW9mLXdlZWsgYW5kIHdlZWstb2YteWVhciB0byBkYXktb2YteWVhci5cbiAgICAgIGlmIChcIlZcIiBpbiBkKSB7XG4gICAgICAgIGlmIChkLlYgPCAxIHx8IGQuViA+IDUzKSByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKCEoXCJ3XCIgaW4gZCkpIGQudyA9IDE7XG4gICAgICAgIGlmIChcIlpcIiBpbiBkKSB7XG4gICAgICAgICAgd2VlayA9IHV0Y0RhdGUobmV3RGF0ZShkLnksIDAsIDEpKSwgZGF5ID0gd2Vlay5nZXRVVENEYXkoKTtcbiAgICAgICAgICB3ZWVrID0gZGF5ID4gNCB8fCBkYXkgPT09IDAgPyB1dGNNb25kYXkuY2VpbCh3ZWVrKSA6IHV0Y01vbmRheSh3ZWVrKTtcbiAgICAgICAgICB3ZWVrID0gdXRjRGF5Lm9mZnNldCh3ZWVrLCAoZC5WIC0gMSkgKiA3KTtcbiAgICAgICAgICBkLnkgPSB3ZWVrLmdldFVUQ0Z1bGxZZWFyKCk7XG4gICAgICAgICAgZC5tID0gd2Vlay5nZXRVVENNb250aCgpO1xuICAgICAgICAgIGQuZCA9IHdlZWsuZ2V0VVRDRGF0ZSgpICsgKGQudyArIDYpICUgNztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB3ZWVrID0gbG9jYWxEYXRlKG5ld0RhdGUoZC55LCAwLCAxKSksIGRheSA9IHdlZWsuZ2V0RGF5KCk7XG4gICAgICAgICAgd2VlayA9IGRheSA+IDQgfHwgZGF5ID09PSAwID8gdGltZU1vbmRheS5jZWlsKHdlZWspIDogdGltZU1vbmRheSh3ZWVrKTtcbiAgICAgICAgICB3ZWVrID0gdGltZURheS5vZmZzZXQod2VlaywgKGQuViAtIDEpICogNyk7XG4gICAgICAgICAgZC55ID0gd2Vlay5nZXRGdWxsWWVhcigpO1xuICAgICAgICAgIGQubSA9IHdlZWsuZ2V0TW9udGgoKTtcbiAgICAgICAgICBkLmQgPSB3ZWVrLmdldERhdGUoKSArIChkLncgKyA2KSAlIDc7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoXCJXXCIgaW4gZCB8fCBcIlVcIiBpbiBkKSB7XG4gICAgICAgIGlmICghKFwid1wiIGluIGQpKSBkLncgPSBcInVcIiBpbiBkID8gZC51ICUgNyA6IFwiV1wiIGluIGQgPyAxIDogMDtcbiAgICAgICAgZGF5ID0gXCJaXCIgaW4gZCA/IHV0Y0RhdGUobmV3RGF0ZShkLnksIDAsIDEpKS5nZXRVVENEYXkoKSA6IGxvY2FsRGF0ZShuZXdEYXRlKGQueSwgMCwgMSkpLmdldERheSgpO1xuICAgICAgICBkLm0gPSAwO1xuICAgICAgICBkLmQgPSBcIldcIiBpbiBkID8gKGQudyArIDYpICUgNyArIGQuVyAqIDcgLSAoZGF5ICsgNSkgJSA3IDogZC53ICsgZC5VICogNyAtIChkYXkgKyA2KSAlIDc7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIGEgdGltZSB6b25lIGlzIHNwZWNpZmllZCwgYWxsIGZpZWxkcyBhcmUgaW50ZXJwcmV0ZWQgYXMgVVRDIGFuZCB0aGVuXG4gICAgICAvLyBvZmZzZXQgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgdGltZSB6b25lLlxuICAgICAgaWYgKFwiWlwiIGluIGQpIHtcbiAgICAgICAgZC5IICs9IGQuWiAvIDEwMCB8IDA7XG4gICAgICAgIGQuTSArPSBkLlogJSAxMDA7XG4gICAgICAgIHJldHVybiB1dGNEYXRlKGQpO1xuICAgICAgfVxuXG4gICAgICAvLyBPdGhlcndpc2UsIGFsbCBmaWVsZHMgYXJlIGluIGxvY2FsIHRpbWUuXG4gICAgICByZXR1cm4gbG9jYWxEYXRlKGQpO1xuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZVNwZWNpZmllcihkLCBzcGVjaWZpZXIsIHN0cmluZywgaikge1xuICAgIHZhciBpID0gMCxcbiAgICAgICAgbiA9IHNwZWNpZmllci5sZW5ndGgsXG4gICAgICAgIG0gPSBzdHJpbmcubGVuZ3RoLFxuICAgICAgICBjLFxuICAgICAgICBwYXJzZTtcblxuICAgIHdoaWxlIChpIDwgbikge1xuICAgICAgaWYgKGogPj0gbSkgcmV0dXJuIC0xO1xuICAgICAgYyA9IHNwZWNpZmllci5jaGFyQ29kZUF0KGkrKyk7XG4gICAgICBpZiAoYyA9PT0gMzcpIHtcbiAgICAgICAgYyA9IHNwZWNpZmllci5jaGFyQXQoaSsrKTtcbiAgICAgICAgcGFyc2UgPSBwYXJzZXNbYyBpbiBwYWRzID8gc3BlY2lmaWVyLmNoYXJBdChpKyspIDogY107XG4gICAgICAgIGlmICghcGFyc2UgfHwgKChqID0gcGFyc2UoZCwgc3RyaW5nLCBqKSkgPCAwKSkgcmV0dXJuIC0xO1xuICAgICAgfSBlbHNlIGlmIChjICE9IHN0cmluZy5jaGFyQ29kZUF0KGorKykpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBqO1xuICB9XG5cbiAgZnVuY3Rpb24gcGFyc2VQZXJpb2QoZCwgc3RyaW5nLCBpKSB7XG4gICAgdmFyIG4gPSBwZXJpb2RSZS5leGVjKHN0cmluZy5zbGljZShpKSk7XG4gICAgcmV0dXJuIG4gPyAoZC5wID0gcGVyaW9kTG9va3VwLmdldChuWzBdLnRvTG93ZXJDYXNlKCkpLCBpICsgblswXS5sZW5ndGgpIDogLTE7XG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZVNob3J0V2Vla2RheShkLCBzdHJpbmcsIGkpIHtcbiAgICB2YXIgbiA9IHNob3J0V2Vla2RheVJlLmV4ZWMoc3RyaW5nLnNsaWNlKGkpKTtcbiAgICByZXR1cm4gbiA/IChkLncgPSBzaG9ydFdlZWtkYXlMb29rdXAuZ2V0KG5bMF0udG9Mb3dlckNhc2UoKSksIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBhcnNlV2Vla2RheShkLCBzdHJpbmcsIGkpIHtcbiAgICB2YXIgbiA9IHdlZWtkYXlSZS5leGVjKHN0cmluZy5zbGljZShpKSk7XG4gICAgcmV0dXJuIG4gPyAoZC53ID0gd2Vla2RheUxvb2t1cC5nZXQoblswXS50b0xvd2VyQ2FzZSgpKSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xO1xuICB9XG5cbiAgZnVuY3Rpb24gcGFyc2VTaG9ydE1vbnRoKGQsIHN0cmluZywgaSkge1xuICAgIHZhciBuID0gc2hvcnRNb250aFJlLmV4ZWMoc3RyaW5nLnNsaWNlKGkpKTtcbiAgICByZXR1cm4gbiA/IChkLm0gPSBzaG9ydE1vbnRoTG9va3VwLmdldChuWzBdLnRvTG93ZXJDYXNlKCkpLCBpICsgblswXS5sZW5ndGgpIDogLTE7XG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZU1vbnRoKGQsIHN0cmluZywgaSkge1xuICAgIHZhciBuID0gbW9udGhSZS5leGVjKHN0cmluZy5zbGljZShpKSk7XG4gICAgcmV0dXJuIG4gPyAoZC5tID0gbW9udGhMb29rdXAuZ2V0KG5bMF0udG9Mb3dlckNhc2UoKSksIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBhcnNlTG9jYWxlRGF0ZVRpbWUoZCwgc3RyaW5nLCBpKSB7XG4gICAgcmV0dXJuIHBhcnNlU3BlY2lmaWVyKGQsIGxvY2FsZV9kYXRlVGltZSwgc3RyaW5nLCBpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBhcnNlTG9jYWxlRGF0ZShkLCBzdHJpbmcsIGkpIHtcbiAgICByZXR1cm4gcGFyc2VTcGVjaWZpZXIoZCwgbG9jYWxlX2RhdGUsIHN0cmluZywgaSk7XG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZUxvY2FsZVRpbWUoZCwgc3RyaW5nLCBpKSB7XG4gICAgcmV0dXJuIHBhcnNlU3BlY2lmaWVyKGQsIGxvY2FsZV90aW1lLCBzdHJpbmcsIGkpO1xuICB9XG5cbiAgZnVuY3Rpb24gZm9ybWF0U2hvcnRXZWVrZGF5KGQpIHtcbiAgICByZXR1cm4gbG9jYWxlX3Nob3J0V2Vla2RheXNbZC5nZXREYXkoKV07XG4gIH1cblxuICBmdW5jdGlvbiBmb3JtYXRXZWVrZGF5KGQpIHtcbiAgICByZXR1cm4gbG9jYWxlX3dlZWtkYXlzW2QuZ2V0RGF5KCldO1xuICB9XG5cbiAgZnVuY3Rpb24gZm9ybWF0U2hvcnRNb250aChkKSB7XG4gICAgcmV0dXJuIGxvY2FsZV9zaG9ydE1vbnRoc1tkLmdldE1vbnRoKCldO1xuICB9XG5cbiAgZnVuY3Rpb24gZm9ybWF0TW9udGgoZCkge1xuICAgIHJldHVybiBsb2NhbGVfbW9udGhzW2QuZ2V0TW9udGgoKV07XG4gIH1cblxuICBmdW5jdGlvbiBmb3JtYXRQZXJpb2QoZCkge1xuICAgIHJldHVybiBsb2NhbGVfcGVyaW9kc1srKGQuZ2V0SG91cnMoKSA+PSAxMildO1xuICB9XG5cbiAgZnVuY3Rpb24gZm9ybWF0UXVhcnRlcihkKSB7XG4gICAgcmV0dXJuIDEgKyB+fihkLmdldE1vbnRoKCkgLyAzKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZvcm1hdFVUQ1Nob3J0V2Vla2RheShkKSB7XG4gICAgcmV0dXJuIGxvY2FsZV9zaG9ydFdlZWtkYXlzW2QuZ2V0VVRDRGF5KCldO1xuICB9XG5cbiAgZnVuY3Rpb24gZm9ybWF0VVRDV2Vla2RheShkKSB7XG4gICAgcmV0dXJuIGxvY2FsZV93ZWVrZGF5c1tkLmdldFVUQ0RheSgpXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZvcm1hdFVUQ1Nob3J0TW9udGgoZCkge1xuICAgIHJldHVybiBsb2NhbGVfc2hvcnRNb250aHNbZC5nZXRVVENNb250aCgpXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZvcm1hdFVUQ01vbnRoKGQpIHtcbiAgICByZXR1cm4gbG9jYWxlX21vbnRoc1tkLmdldFVUQ01vbnRoKCldO1xuICB9XG5cbiAgZnVuY3Rpb24gZm9ybWF0VVRDUGVyaW9kKGQpIHtcbiAgICByZXR1cm4gbG9jYWxlX3BlcmlvZHNbKyhkLmdldFVUQ0hvdXJzKCkgPj0gMTIpXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZvcm1hdFVUQ1F1YXJ0ZXIoZCkge1xuICAgIHJldHVybiAxICsgfn4oZC5nZXRVVENNb250aCgpIC8gMyk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGZvcm1hdDogZnVuY3Rpb24oc3BlY2lmaWVyKSB7XG4gICAgICB2YXIgZiA9IG5ld0Zvcm1hdChzcGVjaWZpZXIgKz0gXCJcIiwgZm9ybWF0cyk7XG4gICAgICBmLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7IHJldHVybiBzcGVjaWZpZXI7IH07XG4gICAgICByZXR1cm4gZjtcbiAgICB9LFxuICAgIHBhcnNlOiBmdW5jdGlvbihzcGVjaWZpZXIpIHtcbiAgICAgIHZhciBwID0gbmV3UGFyc2Uoc3BlY2lmaWVyICs9IFwiXCIsIGZhbHNlKTtcbiAgICAgIHAudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsgcmV0dXJuIHNwZWNpZmllcjsgfTtcbiAgICAgIHJldHVybiBwO1xuICAgIH0sXG4gICAgdXRjRm9ybWF0OiBmdW5jdGlvbihzcGVjaWZpZXIpIHtcbiAgICAgIHZhciBmID0gbmV3Rm9ybWF0KHNwZWNpZmllciArPSBcIlwiLCB1dGNGb3JtYXRzKTtcbiAgICAgIGYudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsgcmV0dXJuIHNwZWNpZmllcjsgfTtcbiAgICAgIHJldHVybiBmO1xuICAgIH0sXG4gICAgdXRjUGFyc2U6IGZ1bmN0aW9uKHNwZWNpZmllcikge1xuICAgICAgdmFyIHAgPSBuZXdQYXJzZShzcGVjaWZpZXIgKz0gXCJcIiwgdHJ1ZSk7XG4gICAgICBwLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7IHJldHVybiBzcGVjaWZpZXI7IH07XG4gICAgICByZXR1cm4gcDtcbiAgICB9XG4gIH07XG59XG5cbnZhciBwYWRzID0ge1wiLVwiOiBcIlwiLCBcIl9cIjogXCIgXCIsIFwiMFwiOiBcIjBcIn0sXG4gICAgbnVtYmVyUmUgPSAvXlxccypcXGQrLywgLy8gbm90ZTogaWdub3JlcyBuZXh0IGRpcmVjdGl2ZVxuICAgIHBlcmNlbnRSZSA9IC9eJS8sXG4gICAgcmVxdW90ZVJlID0gL1tcXFxcXiQqKz98W1xcXSgpLnt9XS9nO1xuXG5mdW5jdGlvbiBwYWQodmFsdWUsIGZpbGwsIHdpZHRoKSB7XG4gIHZhciBzaWduID0gdmFsdWUgPCAwID8gXCItXCIgOiBcIlwiLFxuICAgICAgc3RyaW5nID0gKHNpZ24gPyAtdmFsdWUgOiB2YWx1ZSkgKyBcIlwiLFxuICAgICAgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aDtcbiAgcmV0dXJuIHNpZ24gKyAobGVuZ3RoIDwgd2lkdGggPyBuZXcgQXJyYXkod2lkdGggLSBsZW5ndGggKyAxKS5qb2luKGZpbGwpICsgc3RyaW5nIDogc3RyaW5nKTtcbn1cblxuZnVuY3Rpb24gcmVxdW90ZShzKSB7XG4gIHJldHVybiBzLnJlcGxhY2UocmVxdW90ZVJlLCBcIlxcXFwkJlwiKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0UmUobmFtZXMpIHtcbiAgcmV0dXJuIG5ldyBSZWdFeHAoXCJeKD86XCIgKyBuYW1lcy5tYXAocmVxdW90ZSkuam9pbihcInxcIikgKyBcIilcIiwgXCJpXCIpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRMb29rdXAobmFtZXMpIHtcbiAgcmV0dXJuIG5ldyBNYXAobmFtZXMubWFwKChuYW1lLCBpKSA9PiBbbmFtZS50b0xvd2VyQ2FzZSgpLCBpXSkpO1xufVxuXG5mdW5jdGlvbiBwYXJzZVdlZWtkYXlOdW1iZXJTdW5kYXkoZCwgc3RyaW5nLCBpKSB7XG4gIHZhciBuID0gbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDEpKTtcbiAgcmV0dXJuIG4gPyAoZC53ID0gK25bMF0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTtcbn1cblxuZnVuY3Rpb24gcGFyc2VXZWVrZGF5TnVtYmVyTW9uZGF5KGQsIHN0cmluZywgaSkge1xuICB2YXIgbiA9IG51bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyAxKSk7XG4gIHJldHVybiBuID8gKGQudSA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7XG59XG5cbmZ1bmN0aW9uIHBhcnNlV2Vla051bWJlclN1bmRheShkLCBzdHJpbmcsIGkpIHtcbiAgdmFyIG4gPSBudW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgMikpO1xuICByZXR1cm4gbiA/IChkLlUgPSArblswXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xO1xufVxuXG5mdW5jdGlvbiBwYXJzZVdlZWtOdW1iZXJJU08oZCwgc3RyaW5nLCBpKSB7XG4gIHZhciBuID0gbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDIpKTtcbiAgcmV0dXJuIG4gPyAoZC5WID0gK25bMF0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTtcbn1cblxuZnVuY3Rpb24gcGFyc2VXZWVrTnVtYmVyTW9uZGF5KGQsIHN0cmluZywgaSkge1xuICB2YXIgbiA9IG51bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyAyKSk7XG4gIHJldHVybiBuID8gKGQuVyA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7XG59XG5cbmZ1bmN0aW9uIHBhcnNlRnVsbFllYXIoZCwgc3RyaW5nLCBpKSB7XG4gIHZhciBuID0gbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDQpKTtcbiAgcmV0dXJuIG4gPyAoZC55ID0gK25bMF0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTtcbn1cblxuZnVuY3Rpb24gcGFyc2VZZWFyKGQsIHN0cmluZywgaSkge1xuICB2YXIgbiA9IG51bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyAyKSk7XG4gIHJldHVybiBuID8gKGQueSA9ICtuWzBdICsgKCtuWzBdID4gNjggPyAxOTAwIDogMjAwMCksIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTtcbn1cblxuZnVuY3Rpb24gcGFyc2Vab25lKGQsIHN0cmluZywgaSkge1xuICB2YXIgbiA9IC9eKFopfChbKy1dXFxkXFxkKSg/Ojo/KFxcZFxcZCkpPy8uZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDYpKTtcbiAgcmV0dXJuIG4gPyAoZC5aID0gblsxXSA/IDAgOiAtKG5bMl0gKyAoblszXSB8fCBcIjAwXCIpKSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xO1xufVxuXG5mdW5jdGlvbiBwYXJzZVF1YXJ0ZXIoZCwgc3RyaW5nLCBpKSB7XG4gIHZhciBuID0gbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDEpKTtcbiAgcmV0dXJuIG4gPyAoZC5xID0gblswXSAqIDMgLSAzLCBpICsgblswXS5sZW5ndGgpIDogLTE7XG59XG5cbmZ1bmN0aW9uIHBhcnNlTW9udGhOdW1iZXIoZCwgc3RyaW5nLCBpKSB7XG4gIHZhciBuID0gbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDIpKTtcbiAgcmV0dXJuIG4gPyAoZC5tID0gblswXSAtIDEsIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTtcbn1cblxuZnVuY3Rpb24gcGFyc2VEYXlPZk1vbnRoKGQsIHN0cmluZywgaSkge1xuICB2YXIgbiA9IG51bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyAyKSk7XG4gIHJldHVybiBuID8gKGQuZCA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7XG59XG5cbmZ1bmN0aW9uIHBhcnNlRGF5T2ZZZWFyKGQsIHN0cmluZywgaSkge1xuICB2YXIgbiA9IG51bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyAzKSk7XG4gIHJldHVybiBuID8gKGQubSA9IDAsIGQuZCA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7XG59XG5cbmZ1bmN0aW9uIHBhcnNlSG91cjI0KGQsIHN0cmluZywgaSkge1xuICB2YXIgbiA9IG51bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyAyKSk7XG4gIHJldHVybiBuID8gKGQuSCA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7XG59XG5cbmZ1bmN0aW9uIHBhcnNlTWludXRlcyhkLCBzdHJpbmcsIGkpIHtcbiAgdmFyIG4gPSBudW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgMikpO1xuICByZXR1cm4gbiA/IChkLk0gPSArblswXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xO1xufVxuXG5mdW5jdGlvbiBwYXJzZVNlY29uZHMoZCwgc3RyaW5nLCBpKSB7XG4gIHZhciBuID0gbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDIpKTtcbiAgcmV0dXJuIG4gPyAoZC5TID0gK25bMF0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTtcbn1cblxuZnVuY3Rpb24gcGFyc2VNaWxsaXNlY29uZHMoZCwgc3RyaW5nLCBpKSB7XG4gIHZhciBuID0gbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDMpKTtcbiAgcmV0dXJuIG4gPyAoZC5MID0gK25bMF0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTtcbn1cblxuZnVuY3Rpb24gcGFyc2VNaWNyb3NlY29uZHMoZCwgc3RyaW5nLCBpKSB7XG4gIHZhciBuID0gbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDYpKTtcbiAgcmV0dXJuIG4gPyAoZC5MID0gTWF0aC5mbG9vcihuWzBdIC8gMTAwMCksIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTtcbn1cblxuZnVuY3Rpb24gcGFyc2VMaXRlcmFsUGVyY2VudChkLCBzdHJpbmcsIGkpIHtcbiAgdmFyIG4gPSBwZXJjZW50UmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDEpKTtcbiAgcmV0dXJuIG4gPyBpICsgblswXS5sZW5ndGggOiAtMTtcbn1cblxuZnVuY3Rpb24gcGFyc2VVbml4VGltZXN0YW1wKGQsIHN0cmluZywgaSkge1xuICB2YXIgbiA9IG51bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGkpKTtcbiAgcmV0dXJuIG4gPyAoZC5RID0gK25bMF0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTtcbn1cblxuZnVuY3Rpb24gcGFyc2VVbml4VGltZXN0YW1wU2Vjb25kcyhkLCBzdHJpbmcsIGkpIHtcbiAgdmFyIG4gPSBudW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShpKSk7XG4gIHJldHVybiBuID8gKGQucyA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdERheU9mTW9udGgoZCwgcCkge1xuICByZXR1cm4gcGFkKGQuZ2V0RGF0ZSgpLCBwLCAyKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0SG91cjI0KGQsIHApIHtcbiAgcmV0dXJuIHBhZChkLmdldEhvdXJzKCksIHAsIDIpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRIb3VyMTIoZCwgcCkge1xuICByZXR1cm4gcGFkKGQuZ2V0SG91cnMoKSAlIDEyIHx8IDEyLCBwLCAyKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0RGF5T2ZZZWFyKGQsIHApIHtcbiAgcmV0dXJuIHBhZCgxICsgdGltZURheS5jb3VudCh0aW1lWWVhcihkKSwgZCksIHAsIDMpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRNaWxsaXNlY29uZHMoZCwgcCkge1xuICByZXR1cm4gcGFkKGQuZ2V0TWlsbGlzZWNvbmRzKCksIHAsIDMpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRNaWNyb3NlY29uZHMoZCwgcCkge1xuICByZXR1cm4gZm9ybWF0TWlsbGlzZWNvbmRzKGQsIHApICsgXCIwMDBcIjtcbn1cblxuZnVuY3Rpb24gZm9ybWF0TW9udGhOdW1iZXIoZCwgcCkge1xuICByZXR1cm4gcGFkKGQuZ2V0TW9udGgoKSArIDEsIHAsIDIpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRNaW51dGVzKGQsIHApIHtcbiAgcmV0dXJuIHBhZChkLmdldE1pbnV0ZXMoKSwgcCwgMik7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFNlY29uZHMoZCwgcCkge1xuICByZXR1cm4gcGFkKGQuZ2V0U2Vjb25kcygpLCBwLCAyKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0V2Vla2RheU51bWJlck1vbmRheShkKSB7XG4gIHZhciBkYXkgPSBkLmdldERheSgpO1xuICByZXR1cm4gZGF5ID09PSAwID8gNyA6IGRheTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0V2Vla051bWJlclN1bmRheShkLCBwKSB7XG4gIHJldHVybiBwYWQodGltZVN1bmRheS5jb3VudCh0aW1lWWVhcihkKSAtIDEsIGQpLCBwLCAyKTtcbn1cblxuZnVuY3Rpb24gZElTTyhkKSB7XG4gIHZhciBkYXkgPSBkLmdldERheSgpO1xuICByZXR1cm4gKGRheSA+PSA0IHx8IGRheSA9PT0gMCkgPyB0aW1lVGh1cnNkYXkoZCkgOiB0aW1lVGh1cnNkYXkuY2VpbChkKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0V2Vla051bWJlcklTTyhkLCBwKSB7XG4gIGQgPSBkSVNPKGQpO1xuICByZXR1cm4gcGFkKHRpbWVUaHVyc2RheS5jb3VudCh0aW1lWWVhcihkKSwgZCkgKyAodGltZVllYXIoZCkuZ2V0RGF5KCkgPT09IDQpLCBwLCAyKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0V2Vla2RheU51bWJlclN1bmRheShkKSB7XG4gIHJldHVybiBkLmdldERheSgpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRXZWVrTnVtYmVyTW9uZGF5KGQsIHApIHtcbiAgcmV0dXJuIHBhZCh0aW1lTW9uZGF5LmNvdW50KHRpbWVZZWFyKGQpIC0gMSwgZCksIHAsIDIpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRZZWFyKGQsIHApIHtcbiAgcmV0dXJuIHBhZChkLmdldEZ1bGxZZWFyKCkgJSAxMDAsIHAsIDIpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRZZWFySVNPKGQsIHApIHtcbiAgZCA9IGRJU08oZCk7XG4gIHJldHVybiBwYWQoZC5nZXRGdWxsWWVhcigpICUgMTAwLCBwLCAyKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0RnVsbFllYXIoZCwgcCkge1xuICByZXR1cm4gcGFkKGQuZ2V0RnVsbFllYXIoKSAlIDEwMDAwLCBwLCA0KTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0RnVsbFllYXJJU08oZCwgcCkge1xuICB2YXIgZGF5ID0gZC5nZXREYXkoKTtcbiAgZCA9IChkYXkgPj0gNCB8fCBkYXkgPT09IDApID8gdGltZVRodXJzZGF5KGQpIDogdGltZVRodXJzZGF5LmNlaWwoZCk7XG4gIHJldHVybiBwYWQoZC5nZXRGdWxsWWVhcigpICUgMTAwMDAsIHAsIDQpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRab25lKGQpIHtcbiAgdmFyIHogPSBkLmdldFRpbWV6b25lT2Zmc2V0KCk7XG4gIHJldHVybiAoeiA+IDAgPyBcIi1cIiA6ICh6ICo9IC0xLCBcIitcIikpXG4gICAgICArIHBhZCh6IC8gNjAgfCAwLCBcIjBcIiwgMilcbiAgICAgICsgcGFkKHogJSA2MCwgXCIwXCIsIDIpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRVVENEYXlPZk1vbnRoKGQsIHApIHtcbiAgcmV0dXJuIHBhZChkLmdldFVUQ0RhdGUoKSwgcCwgMik7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFVUQ0hvdXIyNChkLCBwKSB7XG4gIHJldHVybiBwYWQoZC5nZXRVVENIb3VycygpLCBwLCAyKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0VVRDSG91cjEyKGQsIHApIHtcbiAgcmV0dXJuIHBhZChkLmdldFVUQ0hvdXJzKCkgJSAxMiB8fCAxMiwgcCwgMik7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFVUQ0RheU9mWWVhcihkLCBwKSB7XG4gIHJldHVybiBwYWQoMSArIHV0Y0RheS5jb3VudCh1dGNZZWFyKGQpLCBkKSwgcCwgMyk7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFVUQ01pbGxpc2Vjb25kcyhkLCBwKSB7XG4gIHJldHVybiBwYWQoZC5nZXRVVENNaWxsaXNlY29uZHMoKSwgcCwgMyk7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFVUQ01pY3Jvc2Vjb25kcyhkLCBwKSB7XG4gIHJldHVybiBmb3JtYXRVVENNaWxsaXNlY29uZHMoZCwgcCkgKyBcIjAwMFwiO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRVVENNb250aE51bWJlcihkLCBwKSB7XG4gIHJldHVybiBwYWQoZC5nZXRVVENNb250aCgpICsgMSwgcCwgMik7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFVUQ01pbnV0ZXMoZCwgcCkge1xuICByZXR1cm4gcGFkKGQuZ2V0VVRDTWludXRlcygpLCBwLCAyKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0VVRDU2Vjb25kcyhkLCBwKSB7XG4gIHJldHVybiBwYWQoZC5nZXRVVENTZWNvbmRzKCksIHAsIDIpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRVVENXZWVrZGF5TnVtYmVyTW9uZGF5KGQpIHtcbiAgdmFyIGRvdyA9IGQuZ2V0VVRDRGF5KCk7XG4gIHJldHVybiBkb3cgPT09IDAgPyA3IDogZG93O1xufVxuXG5mdW5jdGlvbiBmb3JtYXRVVENXZWVrTnVtYmVyU3VuZGF5KGQsIHApIHtcbiAgcmV0dXJuIHBhZCh1dGNTdW5kYXkuY291bnQodXRjWWVhcihkKSAtIDEsIGQpLCBwLCAyKTtcbn1cblxuZnVuY3Rpb24gVVRDZElTTyhkKSB7XG4gIHZhciBkYXkgPSBkLmdldFVUQ0RheSgpO1xuICByZXR1cm4gKGRheSA+PSA0IHx8IGRheSA9PT0gMCkgPyB1dGNUaHVyc2RheShkKSA6IHV0Y1RodXJzZGF5LmNlaWwoZCk7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFVUQ1dlZWtOdW1iZXJJU08oZCwgcCkge1xuICBkID0gVVRDZElTTyhkKTtcbiAgcmV0dXJuIHBhZCh1dGNUaHVyc2RheS5jb3VudCh1dGNZZWFyKGQpLCBkKSArICh1dGNZZWFyKGQpLmdldFVUQ0RheSgpID09PSA0KSwgcCwgMik7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFVUQ1dlZWtkYXlOdW1iZXJTdW5kYXkoZCkge1xuICByZXR1cm4gZC5nZXRVVENEYXkoKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0VVRDV2Vla051bWJlck1vbmRheShkLCBwKSB7XG4gIHJldHVybiBwYWQodXRjTW9uZGF5LmNvdW50KHV0Y1llYXIoZCkgLSAxLCBkKSwgcCwgMik7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFVUQ1llYXIoZCwgcCkge1xuICByZXR1cm4gcGFkKGQuZ2V0VVRDRnVsbFllYXIoKSAlIDEwMCwgcCwgMik7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFVUQ1llYXJJU08oZCwgcCkge1xuICBkID0gVVRDZElTTyhkKTtcbiAgcmV0dXJuIHBhZChkLmdldFVUQ0Z1bGxZZWFyKCkgJSAxMDAsIHAsIDIpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRVVENGdWxsWWVhcihkLCBwKSB7XG4gIHJldHVybiBwYWQoZC5nZXRVVENGdWxsWWVhcigpICUgMTAwMDAsIHAsIDQpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRVVENGdWxsWWVhcklTTyhkLCBwKSB7XG4gIHZhciBkYXkgPSBkLmdldFVUQ0RheSgpO1xuICBkID0gKGRheSA+PSA0IHx8IGRheSA9PT0gMCkgPyB1dGNUaHVyc2RheShkKSA6IHV0Y1RodXJzZGF5LmNlaWwoZCk7XG4gIHJldHVybiBwYWQoZC5nZXRVVENGdWxsWWVhcigpICUgMTAwMDAsIHAsIDQpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRVVENab25lKCkge1xuICByZXR1cm4gXCIrMDAwMFwiO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRMaXRlcmFsUGVyY2VudCgpIHtcbiAgcmV0dXJuIFwiJVwiO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRVbml4VGltZXN0YW1wKGQpIHtcbiAgcmV0dXJuICtkO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRVbml4VGltZXN0YW1wU2Vjb25kcyhkKSB7XG4gIHJldHVybiBNYXRoLmZsb29yKCtkIC8gMTAwMCk7XG59XG4iLCJpbXBvcnQgZm9ybWF0TG9jYWxlIGZyb20gXCIuL2xvY2FsZS5qc1wiO1xuXG52YXIgbG9jYWxlO1xuZXhwb3J0IHZhciB0aW1lRm9ybWF0O1xuZXhwb3J0IHZhciB0aW1lUGFyc2U7XG5leHBvcnQgdmFyIHV0Y0Zvcm1hdDtcbmV4cG9ydCB2YXIgdXRjUGFyc2U7XG5cbmRlZmF1bHRMb2NhbGUoe1xuICBkYXRlVGltZTogXCIleCwgJVhcIixcbiAgZGF0ZTogXCIlLW0vJS1kLyVZXCIsXG4gIHRpbWU6IFwiJS1JOiVNOiVTICVwXCIsXG4gIHBlcmlvZHM6IFtcIkFNXCIsIFwiUE1cIl0sXG4gIGRheXM6IFtcIlN1bmRheVwiLCBcIk1vbmRheVwiLCBcIlR1ZXNkYXlcIiwgXCJXZWRuZXNkYXlcIiwgXCJUaHVyc2RheVwiLCBcIkZyaWRheVwiLCBcIlNhdHVyZGF5XCJdLFxuICBzaG9ydERheXM6IFtcIlN1blwiLCBcIk1vblwiLCBcIlR1ZVwiLCBcIldlZFwiLCBcIlRodVwiLCBcIkZyaVwiLCBcIlNhdFwiXSxcbiAgbW9udGhzOiBbXCJKYW51YXJ5XCIsIFwiRmVicnVhcnlcIiwgXCJNYXJjaFwiLCBcIkFwcmlsXCIsIFwiTWF5XCIsIFwiSnVuZVwiLCBcIkp1bHlcIiwgXCJBdWd1c3RcIiwgXCJTZXB0ZW1iZXJcIiwgXCJPY3RvYmVyXCIsIFwiTm92ZW1iZXJcIiwgXCJEZWNlbWJlclwiXSxcbiAgc2hvcnRNb250aHM6IFtcIkphblwiLCBcIkZlYlwiLCBcIk1hclwiLCBcIkFwclwiLCBcIk1heVwiLCBcIkp1blwiLCBcIkp1bFwiLCBcIkF1Z1wiLCBcIlNlcFwiLCBcIk9jdFwiLCBcIk5vdlwiLCBcIkRlY1wiXVxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRlZmF1bHRMb2NhbGUoZGVmaW5pdGlvbikge1xuICBsb2NhbGUgPSBmb3JtYXRMb2NhbGUoZGVmaW5pdGlvbik7XG4gIHRpbWVGb3JtYXQgPSBsb2NhbGUuZm9ybWF0O1xuICB0aW1lUGFyc2UgPSBsb2NhbGUucGFyc2U7XG4gIHV0Y0Zvcm1hdCA9IGxvY2FsZS51dGNGb3JtYXQ7XG4gIHV0Y1BhcnNlID0gbG9jYWxlLnV0Y1BhcnNlO1xuICByZXR1cm4gbG9jYWxlO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbmljZShkb21haW4sIGludGVydmFsKSB7XG4gIGRvbWFpbiA9IGRvbWFpbi5zbGljZSgpO1xuXG4gIHZhciBpMCA9IDAsXG4gICAgICBpMSA9IGRvbWFpbi5sZW5ndGggLSAxLFxuICAgICAgeDAgPSBkb21haW5baTBdLFxuICAgICAgeDEgPSBkb21haW5baTFdLFxuICAgICAgdDtcblxuICBpZiAoeDEgPCB4MCkge1xuICAgIHQgPSBpMCwgaTAgPSBpMSwgaTEgPSB0O1xuICAgIHQgPSB4MCwgeDAgPSB4MSwgeDEgPSB0O1xuICB9XG5cbiAgZG9tYWluW2kwXSA9IGludGVydmFsLmZsb29yKHgwKTtcbiAgZG9tYWluW2kxXSA9IGludGVydmFsLmNlaWwoeDEpO1xuICByZXR1cm4gZG9tYWluO1xufVxuIiwiaW1wb3J0IHt0aW1lWWVhciwgdGltZU1vbnRoLCB0aW1lV2VlaywgdGltZURheSwgdGltZUhvdXIsIHRpbWVNaW51dGUsIHRpbWVTZWNvbmQsIHRpbWVUaWNrcywgdGltZVRpY2tJbnRlcnZhbH0gZnJvbSBcImQzLXRpbWVcIjtcbmltcG9ydCB7dGltZUZvcm1hdH0gZnJvbSBcImQzLXRpbWUtZm9ybWF0XCI7XG5pbXBvcnQgY29udGludW91cywge2NvcHl9IGZyb20gXCIuL2NvbnRpbnVvdXMuanNcIjtcbmltcG9ydCB7aW5pdFJhbmdlfSBmcm9tIFwiLi9pbml0LmpzXCI7XG5pbXBvcnQgbmljZSBmcm9tIFwiLi9uaWNlLmpzXCI7XG5cbmZ1bmN0aW9uIGRhdGUodCkge1xuICByZXR1cm4gbmV3IERhdGUodCk7XG59XG5cbmZ1bmN0aW9uIG51bWJlcih0KSB7XG4gIHJldHVybiB0IGluc3RhbmNlb2YgRGF0ZSA/ICt0IDogK25ldyBEYXRlKCt0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhbGVuZGFyKHRpY2tzLCB0aWNrSW50ZXJ2YWwsIHllYXIsIG1vbnRoLCB3ZWVrLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBmb3JtYXQpIHtcbiAgdmFyIHNjYWxlID0gY29udGludW91cygpLFxuICAgICAgaW52ZXJ0ID0gc2NhbGUuaW52ZXJ0LFxuICAgICAgZG9tYWluID0gc2NhbGUuZG9tYWluO1xuXG4gIHZhciBmb3JtYXRNaWxsaXNlY29uZCA9IGZvcm1hdChcIi4lTFwiKSxcbiAgICAgIGZvcm1hdFNlY29uZCA9IGZvcm1hdChcIjolU1wiKSxcbiAgICAgIGZvcm1hdE1pbnV0ZSA9IGZvcm1hdChcIiVJOiVNXCIpLFxuICAgICAgZm9ybWF0SG91ciA9IGZvcm1hdChcIiVJICVwXCIpLFxuICAgICAgZm9ybWF0RGF5ID0gZm9ybWF0KFwiJWEgJWRcIiksXG4gICAgICBmb3JtYXRXZWVrID0gZm9ybWF0KFwiJWIgJWRcIiksXG4gICAgICBmb3JtYXRNb250aCA9IGZvcm1hdChcIiVCXCIpLFxuICAgICAgZm9ybWF0WWVhciA9IGZvcm1hdChcIiVZXCIpO1xuXG4gIGZ1bmN0aW9uIHRpY2tGb3JtYXQoZGF0ZSkge1xuICAgIHJldHVybiAoc2Vjb25kKGRhdGUpIDwgZGF0ZSA/IGZvcm1hdE1pbGxpc2Vjb25kXG4gICAgICAgIDogbWludXRlKGRhdGUpIDwgZGF0ZSA/IGZvcm1hdFNlY29uZFxuICAgICAgICA6IGhvdXIoZGF0ZSkgPCBkYXRlID8gZm9ybWF0TWludXRlXG4gICAgICAgIDogZGF5KGRhdGUpIDwgZGF0ZSA/IGZvcm1hdEhvdXJcbiAgICAgICAgOiBtb250aChkYXRlKSA8IGRhdGUgPyAod2VlayhkYXRlKSA8IGRhdGUgPyBmb3JtYXREYXkgOiBmb3JtYXRXZWVrKVxuICAgICAgICA6IHllYXIoZGF0ZSkgPCBkYXRlID8gZm9ybWF0TW9udGhcbiAgICAgICAgOiBmb3JtYXRZZWFyKShkYXRlKTtcbiAgfVxuXG4gIHNjYWxlLmludmVydCA9IGZ1bmN0aW9uKHkpIHtcbiAgICByZXR1cm4gbmV3IERhdGUoaW52ZXJ0KHkpKTtcbiAgfTtcblxuICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyBkb21haW4oQXJyYXkuZnJvbShfLCBudW1iZXIpKSA6IGRvbWFpbigpLm1hcChkYXRlKTtcbiAgfTtcblxuICBzY2FsZS50aWNrcyA9IGZ1bmN0aW9uKGludGVydmFsKSB7XG4gICAgdmFyIGQgPSBkb21haW4oKTtcbiAgICByZXR1cm4gdGlja3MoZFswXSwgZFtkLmxlbmd0aCAtIDFdLCBpbnRlcnZhbCA9PSBudWxsID8gMTAgOiBpbnRlcnZhbCk7XG4gIH07XG5cbiAgc2NhbGUudGlja0Zvcm1hdCA9IGZ1bmN0aW9uKGNvdW50LCBzcGVjaWZpZXIpIHtcbiAgICByZXR1cm4gc3BlY2lmaWVyID09IG51bGwgPyB0aWNrRm9ybWF0IDogZm9ybWF0KHNwZWNpZmllcik7XG4gIH07XG5cbiAgc2NhbGUubmljZSA9IGZ1bmN0aW9uKGludGVydmFsKSB7XG4gICAgdmFyIGQgPSBkb21haW4oKTtcbiAgICBpZiAoIWludGVydmFsIHx8IHR5cGVvZiBpbnRlcnZhbC5yYW5nZSAhPT0gXCJmdW5jdGlvblwiKSBpbnRlcnZhbCA9IHRpY2tJbnRlcnZhbChkWzBdLCBkW2QubGVuZ3RoIC0gMV0sIGludGVydmFsID09IG51bGwgPyAxMCA6IGludGVydmFsKTtcbiAgICByZXR1cm4gaW50ZXJ2YWwgPyBkb21haW4obmljZShkLCBpbnRlcnZhbCkpIDogc2NhbGU7XG4gIH07XG5cbiAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBjb3B5KHNjYWxlLCBjYWxlbmRhcih0aWNrcywgdGlja0ludGVydmFsLCB5ZWFyLCBtb250aCwgd2VlaywgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgZm9ybWF0KSk7XG4gIH07XG5cbiAgcmV0dXJuIHNjYWxlO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0aW1lKCkge1xuICByZXR1cm4gaW5pdFJhbmdlLmFwcGx5KGNhbGVuZGFyKHRpbWVUaWNrcywgdGltZVRpY2tJbnRlcnZhbCwgdGltZVllYXIsIHRpbWVNb250aCwgdGltZVdlZWssIHRpbWVEYXksIHRpbWVIb3VyLCB0aW1lTWludXRlLCB0aW1lU2Vjb25kLCB0aW1lRm9ybWF0KS5kb21haW4oW25ldyBEYXRlKDIwMDAsIDAsIDEpLCBuZXcgRGF0ZSgyMDAwLCAwLCAyKV0pLCBhcmd1bWVudHMpO1xufVxuIiwiaW1wb3J0IHtpbnRlcnBvbGF0ZSwgaW50ZXJwb2xhdGVSb3VuZH0gZnJvbSBcImQzLWludGVycG9sYXRlXCI7XG5pbXBvcnQge2lkZW50aXR5fSBmcm9tIFwiLi9jb250aW51b3VzLmpzXCI7XG5pbXBvcnQge2luaXRJbnRlcnBvbGF0b3J9IGZyb20gXCIuL2luaXQuanNcIjtcbmltcG9ydCB7bGluZWFyaXNofSBmcm9tIFwiLi9saW5lYXIuanNcIjtcbmltcG9ydCB7bG9nZ2lzaH0gZnJvbSBcIi4vbG9nLmpzXCI7XG5pbXBvcnQge3N5bWxvZ2lzaH0gZnJvbSBcIi4vc3ltbG9nLmpzXCI7XG5pbXBvcnQge3Bvd2lzaH0gZnJvbSBcIi4vcG93LmpzXCI7XG5cbmZ1bmN0aW9uIHRyYW5zZm9ybWVyKCkge1xuICB2YXIgeDAgPSAwLFxuICAgICAgeDEgPSAxLFxuICAgICAgdDAsXG4gICAgICB0MSxcbiAgICAgIGsxMCxcbiAgICAgIHRyYW5zZm9ybSxcbiAgICAgIGludGVycG9sYXRvciA9IGlkZW50aXR5LFxuICAgICAgY2xhbXAgPSBmYWxzZSxcbiAgICAgIHVua25vd247XG5cbiAgZnVuY3Rpb24gc2NhbGUoeCkge1xuICAgIHJldHVybiB4ID09IG51bGwgfHwgaXNOYU4oeCA9ICt4KSA/IHVua25vd24gOiBpbnRlcnBvbGF0b3IoazEwID09PSAwID8gMC41IDogKHggPSAodHJhbnNmb3JtKHgpIC0gdDApICogazEwLCBjbGFtcCA/IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIHgpKSA6IHgpKTtcbiAgfVxuXG4gIHNjYWxlLmRvbWFpbiA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChbeDAsIHgxXSA9IF8sIHQwID0gdHJhbnNmb3JtKHgwID0gK3gwKSwgdDEgPSB0cmFuc2Zvcm0oeDEgPSAreDEpLCBrMTAgPSB0MCA9PT0gdDEgPyAwIDogMSAvICh0MSAtIHQwKSwgc2NhbGUpIDogW3gwLCB4MV07XG4gIH07XG5cbiAgc2NhbGUuY2xhbXAgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoY2xhbXAgPSAhIV8sIHNjYWxlKSA6IGNsYW1wO1xuICB9O1xuXG4gIHNjYWxlLmludGVycG9sYXRvciA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChpbnRlcnBvbGF0b3IgPSBfLCBzY2FsZSkgOiBpbnRlcnBvbGF0b3I7XG4gIH07XG5cbiAgZnVuY3Rpb24gcmFuZ2UoaW50ZXJwb2xhdGUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oXykge1xuICAgICAgdmFyIHIwLCByMTtcbiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKFtyMCwgcjFdID0gXywgaW50ZXJwb2xhdG9yID0gaW50ZXJwb2xhdGUocjAsIHIxKSwgc2NhbGUpIDogW2ludGVycG9sYXRvcigwKSwgaW50ZXJwb2xhdG9yKDEpXTtcbiAgICB9O1xuICB9XG5cbiAgc2NhbGUucmFuZ2UgPSByYW5nZShpbnRlcnBvbGF0ZSk7XG5cbiAgc2NhbGUucmFuZ2VSb3VuZCA9IHJhbmdlKGludGVycG9sYXRlUm91bmQpO1xuXG4gIHNjYWxlLnVua25vd24gPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodW5rbm93biA9IF8sIHNjYWxlKSA6IHVua25vd247XG4gIH07XG5cbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICB0cmFuc2Zvcm0gPSB0LCB0MCA9IHQoeDApLCB0MSA9IHQoeDEpLCBrMTAgPSB0MCA9PT0gdDEgPyAwIDogMSAvICh0MSAtIHQwKTtcbiAgICByZXR1cm4gc2NhbGU7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb3B5KHNvdXJjZSwgdGFyZ2V0KSB7XG4gIHJldHVybiB0YXJnZXRcbiAgICAgIC5kb21haW4oc291cmNlLmRvbWFpbigpKVxuICAgICAgLmludGVycG9sYXRvcihzb3VyY2UuaW50ZXJwb2xhdG9yKCkpXG4gICAgICAuY2xhbXAoc291cmNlLmNsYW1wKCkpXG4gICAgICAudW5rbm93bihzb3VyY2UudW5rbm93bigpKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc2VxdWVudGlhbCgpIHtcbiAgdmFyIHNjYWxlID0gbGluZWFyaXNoKHRyYW5zZm9ybWVyKCkoaWRlbnRpdHkpKTtcblxuICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGNvcHkoc2NhbGUsIHNlcXVlbnRpYWwoKSk7XG4gIH07XG5cbiAgcmV0dXJuIGluaXRJbnRlcnBvbGF0b3IuYXBwbHkoc2NhbGUsIGFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXF1ZW50aWFsTG9nKCkge1xuICB2YXIgc2NhbGUgPSBsb2dnaXNoKHRyYW5zZm9ybWVyKCkpLmRvbWFpbihbMSwgMTBdKTtcblxuICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGNvcHkoc2NhbGUsIHNlcXVlbnRpYWxMb2coKSkuYmFzZShzY2FsZS5iYXNlKCkpO1xuICB9O1xuXG4gIHJldHVybiBpbml0SW50ZXJwb2xhdG9yLmFwcGx5KHNjYWxlLCBhcmd1bWVudHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VxdWVudGlhbFN5bWxvZygpIHtcbiAgdmFyIHNjYWxlID0gc3ltbG9naXNoKHRyYW5zZm9ybWVyKCkpO1xuXG4gIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gY29weShzY2FsZSwgc2VxdWVudGlhbFN5bWxvZygpKS5jb25zdGFudChzY2FsZS5jb25zdGFudCgpKTtcbiAgfTtcblxuICByZXR1cm4gaW5pdEludGVycG9sYXRvci5hcHBseShzY2FsZSwgYXJndW1lbnRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNlcXVlbnRpYWxQb3coKSB7XG4gIHZhciBzY2FsZSA9IHBvd2lzaCh0cmFuc2Zvcm1lcigpKTtcblxuICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGNvcHkoc2NhbGUsIHNlcXVlbnRpYWxQb3coKSkuZXhwb25lbnQoc2NhbGUuZXhwb25lbnQoKSk7XG4gIH07XG5cbiAgcmV0dXJuIGluaXRJbnRlcnBvbGF0b3IuYXBwbHkoc2NhbGUsIGFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXF1ZW50aWFsU3FydCgpIHtcbiAgcmV0dXJuIHNlcXVlbnRpYWxQb3cuYXBwbHkobnVsbCwgYXJndW1lbnRzKS5leHBvbmVudCgwLjUpO1xufVxuIiwiZXhwb3J0IHtcbiAgZGVmYXVsdCBhcyBzY2FsZUJhbmQsXG4gIHBvaW50IGFzIHNjYWxlUG9pbnRcbn0gZnJvbSBcIi4vYmFuZC5qc1wiO1xuXG5leHBvcnQge1xuICBkZWZhdWx0IGFzIHNjYWxlSWRlbnRpdHlcbn0gZnJvbSBcIi4vaWRlbnRpdHkuanNcIjtcblxuZXhwb3J0IHtcbiAgZGVmYXVsdCBhcyBzY2FsZUxpbmVhclxufSBmcm9tIFwiLi9saW5lYXIuanNcIjtcblxuZXhwb3J0IHtcbiAgZGVmYXVsdCBhcyBzY2FsZUxvZ1xufSBmcm9tIFwiLi9sb2cuanNcIjtcblxuZXhwb3J0IHtcbiAgZGVmYXVsdCBhcyBzY2FsZVN5bWxvZ1xufSBmcm9tIFwiLi9zeW1sb2cuanNcIjtcblxuZXhwb3J0IHtcbiAgZGVmYXVsdCBhcyBzY2FsZU9yZGluYWwsXG4gIGltcGxpY2l0IGFzIHNjYWxlSW1wbGljaXRcbn0gZnJvbSBcIi4vb3JkaW5hbC5qc1wiO1xuXG5leHBvcnQge1xuICBkZWZhdWx0IGFzIHNjYWxlUG93LFxuICBzcXJ0IGFzIHNjYWxlU3FydFxufSBmcm9tIFwiLi9wb3cuanNcIjtcblxuZXhwb3J0IHtcbiAgZGVmYXVsdCBhcyBzY2FsZVJhZGlhbFxufSBmcm9tIFwiLi9yYWRpYWwuanNcIjtcblxuZXhwb3J0IHtcbiAgZGVmYXVsdCBhcyBzY2FsZVF1YW50aWxlXG59IGZyb20gXCIuL3F1YW50aWxlLmpzXCI7XG5cbmV4cG9ydCB7XG4gIGRlZmF1bHQgYXMgc2NhbGVRdWFudGl6ZVxufSBmcm9tIFwiLi9xdWFudGl6ZS5qc1wiO1xuXG5leHBvcnQge1xuICBkZWZhdWx0IGFzIHNjYWxlVGhyZXNob2xkXG59IGZyb20gXCIuL3RocmVzaG9sZC5qc1wiO1xuXG5leHBvcnQge1xuICBkZWZhdWx0IGFzIHNjYWxlVGltZVxufSBmcm9tIFwiLi90aW1lLmpzXCI7XG5cbmV4cG9ydCB7XG4gIGRlZmF1bHQgYXMgc2NhbGVVdGNcbn0gZnJvbSBcIi4vdXRjVGltZS5qc1wiO1xuXG5leHBvcnQge1xuICBkZWZhdWx0IGFzIHNjYWxlU2VxdWVudGlhbCxcbiAgc2VxdWVudGlhbExvZyBhcyBzY2FsZVNlcXVlbnRpYWxMb2csXG4gIHNlcXVlbnRpYWxQb3cgYXMgc2NhbGVTZXF1ZW50aWFsUG93LFxuICBzZXF1ZW50aWFsU3FydCBhcyBzY2FsZVNlcXVlbnRpYWxTcXJ0LFxuICBzZXF1ZW50aWFsU3ltbG9nIGFzIHNjYWxlU2VxdWVudGlhbFN5bWxvZ1xufSBmcm9tIFwiLi9zZXF1ZW50aWFsLmpzXCI7XG5cbmV4cG9ydCB7XG4gIGRlZmF1bHQgYXMgc2NhbGVTZXF1ZW50aWFsUXVhbnRpbGVcbn0gZnJvbSBcIi4vc2VxdWVudGlhbFF1YW50aWxlLmpzXCI7XG5cbmV4cG9ydCB7XG4gIGRlZmF1bHQgYXMgc2NhbGVEaXZlcmdpbmcsXG4gIGRpdmVyZ2luZ0xvZyBhcyBzY2FsZURpdmVyZ2luZ0xvZyxcbiAgZGl2ZXJnaW5nUG93IGFzIHNjYWxlRGl2ZXJnaW5nUG93LFxuICBkaXZlcmdpbmdTcXJ0IGFzIHNjYWxlRGl2ZXJnaW5nU3FydCxcbiAgZGl2ZXJnaW5nU3ltbG9nIGFzIHNjYWxlRGl2ZXJnaW5nU3ltbG9nXG59IGZyb20gXCIuL2RpdmVyZ2luZy5qc1wiO1xuXG5leHBvcnQge1xuICBkZWZhdWx0IGFzIHRpY2tGb3JtYXRcbn0gZnJvbSBcIi4vdGlja0Zvcm1hdC5qc1wiO1xuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc3BlY2lmaWVyKSB7XG4gIHZhciBuID0gc3BlY2lmaWVyLmxlbmd0aCAvIDYgfCAwLCBjb2xvcnMgPSBuZXcgQXJyYXkobiksIGkgPSAwO1xuICB3aGlsZSAoaSA8IG4pIGNvbG9yc1tpXSA9IFwiI1wiICsgc3BlY2lmaWVyLnNsaWNlKGkgKiA2LCArK2kgKiA2KTtcbiAgcmV0dXJuIGNvbG9ycztcbn1cbiIsImltcG9ydCBjb2xvcnMgZnJvbSBcIi4uL2NvbG9ycy5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBjb2xvcnMoXCI0ZTc5YTdmMjhlMmNlMTU3NTk3NmI3YjI1OWExNGZlZGM5NDlhZjdhYTFmZjlkYTc5Yzc1NWZiYWIwYWJcIik7XG4iLCJpbXBvcnQge2ludGVycG9sYXRlUmdiQmFzaXN9IGZyb20gXCJkMy1pbnRlcnBvbGF0ZVwiO1xuXG5leHBvcnQgZGVmYXVsdCBzY2hlbWUgPT4gaW50ZXJwb2xhdGVSZ2JCYXNpcyhzY2hlbWVbc2NoZW1lLmxlbmd0aCAtIDFdKTtcbiIsImltcG9ydCBjb2xvcnMgZnJvbSBcIi4uL2NvbG9ycy5qc1wiO1xuaW1wb3J0IHJhbXAgZnJvbSBcIi4uL3JhbXAuanNcIjtcblxuZXhwb3J0IHZhciBzY2hlbWUgPSBuZXcgQXJyYXkoMykuY29uY2F0KFxuICBcImZjOGQ1OWZmZmZiZjk5ZDU5NFwiLFxuICBcImQ3MTkxY2ZkYWU2MWFiZGRhNDJiODNiYVwiLFxuICBcImQ3MTkxY2ZkYWU2MWZmZmZiZmFiZGRhNDJiODNiYVwiLFxuICBcImQ1M2U0ZmZjOGQ1OWZlZTA4YmU2ZjU5ODk5ZDU5NDMyODhiZFwiLFxuICBcImQ1M2U0ZmZjOGQ1OWZlZTA4YmZmZmZiZmU2ZjU5ODk5ZDU5NDMyODhiZFwiLFxuICBcImQ1M2U0ZmY0NmQ0M2ZkYWU2MWZlZTA4YmU2ZjU5OGFiZGRhNDY2YzJhNTMyODhiZFwiLFxuICBcImQ1M2U0ZmY0NmQ0M2ZkYWU2MWZlZTA4YmZmZmZiZmU2ZjU5OGFiZGRhNDY2YzJhNTMyODhiZFwiLFxuICBcIjllMDE0MmQ1M2U0ZmY0NmQ0M2ZkYWU2MWZlZTA4YmU2ZjU5OGFiZGRhNDY2YzJhNTMyODhiZDVlNGZhMlwiLFxuICBcIjllMDE0MmQ1M2U0ZmY0NmQ0M2ZkYWU2MWZlZTA4YmZmZmZiZmU2ZjU5OGFiZGRhNDY2YzJhNTMyODhiZDVlNGZhMlwiXG4pLm1hcChjb2xvcnMpO1xuXG5leHBvcnQgZGVmYXVsdCByYW1wKHNjaGVtZSk7XG4iLCJpbXBvcnQgY29sb3JzIGZyb20gXCIuLi9jb2xvcnMuanNcIjtcbmltcG9ydCByYW1wIGZyb20gXCIuLi9yYW1wLmpzXCI7XG5cbmV4cG9ydCB2YXIgc2NoZW1lID0gbmV3IEFycmF5KDMpLmNvbmNhdChcbiAgXCJlNWY1ZTBhMWQ5OWIzMWEzNTRcIixcbiAgXCJlZGY4ZTliYWU0YjM3NGM0NzYyMzhiNDVcIixcbiAgXCJlZGY4ZTliYWU0YjM3NGM0NzYzMWEzNTQwMDZkMmNcIixcbiAgXCJlZGY4ZTljN2U5YzBhMWQ5OWI3NGM0NzYzMWEzNTQwMDZkMmNcIixcbiAgXCJlZGY4ZTljN2U5YzBhMWQ5OWI3NGM0NzY0MWFiNWQyMzhiNDUwMDVhMzJcIixcbiAgXCJmN2ZjZjVlNWY1ZTBjN2U5YzBhMWQ5OWI3NGM0NzY0MWFiNWQyMzhiNDUwMDVhMzJcIixcbiAgXCJmN2ZjZjVlNWY1ZTBjN2U5YzBhMWQ5OWI3NGM0NzY0MWFiNWQyMzhiNDUwMDZkMmMwMDQ0MWJcIlxuKS5tYXAoY29sb3JzKTtcblxuZXhwb3J0IGRlZmF1bHQgcmFtcChzY2hlbWUpO1xuIiwiZXhwb3J0IHtkZWZhdWx0IGFzIHNjaGVtZUNhdGVnb3J5MTB9IGZyb20gXCIuL2NhdGVnb3JpY2FsL2NhdGVnb3J5MTAuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBzY2hlbWVBY2NlbnR9IGZyb20gXCIuL2NhdGVnb3JpY2FsL0FjY2VudC5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHNjaGVtZURhcmsyfSBmcm9tIFwiLi9jYXRlZ29yaWNhbC9EYXJrMi5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHNjaGVtZVBhaXJlZH0gZnJvbSBcIi4vY2F0ZWdvcmljYWwvUGFpcmVkLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgc2NoZW1lUGFzdGVsMX0gZnJvbSBcIi4vY2F0ZWdvcmljYWwvUGFzdGVsMS5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHNjaGVtZVBhc3RlbDJ9IGZyb20gXCIuL2NhdGVnb3JpY2FsL1Bhc3RlbDIuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBzY2hlbWVTZXQxfSBmcm9tIFwiLi9jYXRlZ29yaWNhbC9TZXQxLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgc2NoZW1lU2V0Mn0gZnJvbSBcIi4vY2F0ZWdvcmljYWwvU2V0Mi5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHNjaGVtZVNldDN9IGZyb20gXCIuL2NhdGVnb3JpY2FsL1NldDMuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBzY2hlbWVUYWJsZWF1MTB9IGZyb20gXCIuL2NhdGVnb3JpY2FsL1RhYmxlYXUxMC5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGludGVycG9sYXRlQnJCRywgc2NoZW1lIGFzIHNjaGVtZUJyQkd9IGZyb20gXCIuL2RpdmVyZ2luZy9CckJHLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgaW50ZXJwb2xhdGVQUkduLCBzY2hlbWUgYXMgc2NoZW1lUFJHbn0gZnJvbSBcIi4vZGl2ZXJnaW5nL1BSR24uanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBpbnRlcnBvbGF0ZVBpWUcsIHNjaGVtZSBhcyBzY2hlbWVQaVlHfSBmcm9tIFwiLi9kaXZlcmdpbmcvUGlZRy5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGludGVycG9sYXRlUHVPciwgc2NoZW1lIGFzIHNjaGVtZVB1T3J9IGZyb20gXCIuL2RpdmVyZ2luZy9QdU9yLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgaW50ZXJwb2xhdGVSZEJ1LCBzY2hlbWUgYXMgc2NoZW1lUmRCdX0gZnJvbSBcIi4vZGl2ZXJnaW5nL1JkQnUuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBpbnRlcnBvbGF0ZVJkR3ksIHNjaGVtZSBhcyBzY2hlbWVSZEd5fSBmcm9tIFwiLi9kaXZlcmdpbmcvUmRHeS5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGludGVycG9sYXRlUmRZbEJ1LCBzY2hlbWUgYXMgc2NoZW1lUmRZbEJ1fSBmcm9tIFwiLi9kaXZlcmdpbmcvUmRZbEJ1LmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgaW50ZXJwb2xhdGVSZFlsR24sIHNjaGVtZSBhcyBzY2hlbWVSZFlsR259IGZyb20gXCIuL2RpdmVyZ2luZy9SZFlsR24uanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBpbnRlcnBvbGF0ZVNwZWN0cmFsLCBzY2hlbWUgYXMgc2NoZW1lU3BlY3RyYWx9IGZyb20gXCIuL2RpdmVyZ2luZy9TcGVjdHJhbC5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGludGVycG9sYXRlQnVHbiwgc2NoZW1lIGFzIHNjaGVtZUJ1R259IGZyb20gXCIuL3NlcXVlbnRpYWwtbXVsdGkvQnVHbi5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGludGVycG9sYXRlQnVQdSwgc2NoZW1lIGFzIHNjaGVtZUJ1UHV9IGZyb20gXCIuL3NlcXVlbnRpYWwtbXVsdGkvQnVQdS5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGludGVycG9sYXRlR25CdSwgc2NoZW1lIGFzIHNjaGVtZUduQnV9IGZyb20gXCIuL3NlcXVlbnRpYWwtbXVsdGkvR25CdS5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGludGVycG9sYXRlT3JSZCwgc2NoZW1lIGFzIHNjaGVtZU9yUmR9IGZyb20gXCIuL3NlcXVlbnRpYWwtbXVsdGkvT3JSZC5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGludGVycG9sYXRlUHVCdUduLCBzY2hlbWUgYXMgc2NoZW1lUHVCdUdufSBmcm9tIFwiLi9zZXF1ZW50aWFsLW11bHRpL1B1QnVHbi5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGludGVycG9sYXRlUHVCdSwgc2NoZW1lIGFzIHNjaGVtZVB1QnV9IGZyb20gXCIuL3NlcXVlbnRpYWwtbXVsdGkvUHVCdS5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGludGVycG9sYXRlUHVSZCwgc2NoZW1lIGFzIHNjaGVtZVB1UmR9IGZyb20gXCIuL3NlcXVlbnRpYWwtbXVsdGkvUHVSZC5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGludGVycG9sYXRlUmRQdSwgc2NoZW1lIGFzIHNjaGVtZVJkUHV9IGZyb20gXCIuL3NlcXVlbnRpYWwtbXVsdGkvUmRQdS5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGludGVycG9sYXRlWWxHbkJ1LCBzY2hlbWUgYXMgc2NoZW1lWWxHbkJ1fSBmcm9tIFwiLi9zZXF1ZW50aWFsLW11bHRpL1lsR25CdS5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGludGVycG9sYXRlWWxHbiwgc2NoZW1lIGFzIHNjaGVtZVlsR259IGZyb20gXCIuL3NlcXVlbnRpYWwtbXVsdGkvWWxHbi5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGludGVycG9sYXRlWWxPckJyLCBzY2hlbWUgYXMgc2NoZW1lWWxPckJyfSBmcm9tIFwiLi9zZXF1ZW50aWFsLW11bHRpL1lsT3JCci5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGludGVycG9sYXRlWWxPclJkLCBzY2hlbWUgYXMgc2NoZW1lWWxPclJkfSBmcm9tIFwiLi9zZXF1ZW50aWFsLW11bHRpL1lsT3JSZC5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGludGVycG9sYXRlQmx1ZXMsIHNjaGVtZSBhcyBzY2hlbWVCbHVlc30gZnJvbSBcIi4vc2VxdWVudGlhbC1zaW5nbGUvQmx1ZXMuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBpbnRlcnBvbGF0ZUdyZWVucywgc2NoZW1lIGFzIHNjaGVtZUdyZWVuc30gZnJvbSBcIi4vc2VxdWVudGlhbC1zaW5nbGUvR3JlZW5zLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgaW50ZXJwb2xhdGVHcmV5cywgc2NoZW1lIGFzIHNjaGVtZUdyZXlzfSBmcm9tIFwiLi9zZXF1ZW50aWFsLXNpbmdsZS9HcmV5cy5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGludGVycG9sYXRlUHVycGxlcywgc2NoZW1lIGFzIHNjaGVtZVB1cnBsZXN9IGZyb20gXCIuL3NlcXVlbnRpYWwtc2luZ2xlL1B1cnBsZXMuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBpbnRlcnBvbGF0ZVJlZHMsIHNjaGVtZSBhcyBzY2hlbWVSZWRzfSBmcm9tIFwiLi9zZXF1ZW50aWFsLXNpbmdsZS9SZWRzLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgaW50ZXJwb2xhdGVPcmFuZ2VzLCBzY2hlbWUgYXMgc2NoZW1lT3Jhbmdlc30gZnJvbSBcIi4vc2VxdWVudGlhbC1zaW5nbGUvT3Jhbmdlcy5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGludGVycG9sYXRlQ2l2aWRpc30gZnJvbSBcIi4vc2VxdWVudGlhbC1tdWx0aS9jaXZpZGlzLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgaW50ZXJwb2xhdGVDdWJlaGVsaXhEZWZhdWx0fSBmcm9tIFwiLi9zZXF1ZW50aWFsLW11bHRpL2N1YmVoZWxpeC5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGludGVycG9sYXRlUmFpbmJvdywgd2FybSBhcyBpbnRlcnBvbGF0ZVdhcm0sIGNvb2wgYXMgaW50ZXJwb2xhdGVDb29sfSBmcm9tIFwiLi9zZXF1ZW50aWFsLW11bHRpL3JhaW5ib3cuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBpbnRlcnBvbGF0ZVNpbmVib3d9IGZyb20gXCIuL3NlcXVlbnRpYWwtbXVsdGkvc2luZWJvdy5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGludGVycG9sYXRlVHVyYm99IGZyb20gXCIuL3NlcXVlbnRpYWwtbXVsdGkvdHVyYm8uanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBpbnRlcnBvbGF0ZVZpcmlkaXMsIG1hZ21hIGFzIGludGVycG9sYXRlTWFnbWEsIGluZmVybm8gYXMgaW50ZXJwb2xhdGVJbmZlcm5vLCBwbGFzbWEgYXMgaW50ZXJwb2xhdGVQbGFzbWF9IGZyb20gXCIuL3NlcXVlbnRpYWwtbXVsdGkvdmlyaWRpcy5qc1wiO1xuIiwiaW1wb3J0IHtTZWxlY3Rpb24sIHJvb3R9IGZyb20gXCIuL3NlbGVjdGlvbi9pbmRleC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3Rvcikge1xuICByZXR1cm4gdHlwZW9mIHNlbGVjdG9yID09PSBcInN0cmluZ1wiXG4gICAgICA/IG5ldyBTZWxlY3Rpb24oW1tkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKV1dLCBbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XSlcbiAgICAgIDogbmV3IFNlbGVjdGlvbihbW3NlbGVjdG9yXV0sIHJvb3QpO1xufVxuIiwiZXhwb3J0IHtkZWZhdWx0IGFzIGNyZWF0ZX0gZnJvbSBcIi4vY3JlYXRlLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgY3JlYXRvcn0gZnJvbSBcIi4vY3JlYXRvci5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGxvY2FsfSBmcm9tIFwiLi9sb2NhbC5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIG1hdGNoZXJ9IGZyb20gXCIuL21hdGNoZXIuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBuYW1lc3BhY2V9IGZyb20gXCIuL25hbWVzcGFjZS5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIG5hbWVzcGFjZXN9IGZyb20gXCIuL25hbWVzcGFjZXMuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBwb2ludGVyfSBmcm9tIFwiLi9wb2ludGVyLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgcG9pbnRlcnN9IGZyb20gXCIuL3BvaW50ZXJzLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgc2VsZWN0fSBmcm9tIFwiLi9zZWxlY3QuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBzZWxlY3RBbGx9IGZyb20gXCIuL3NlbGVjdEFsbC5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHNlbGVjdGlvbn0gZnJvbSBcIi4vc2VsZWN0aW9uL2luZGV4LmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgc2VsZWN0b3J9IGZyb20gXCIuL3NlbGVjdG9yLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgc2VsZWN0b3JBbGx9IGZyb20gXCIuL3NlbGVjdG9yQWxsLmpzXCI7XG5leHBvcnQge3N0eWxlVmFsdWUgYXMgc3R5bGV9IGZyb20gXCIuL3NlbGVjdGlvbi9zdHlsZS5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHdpbmRvd30gZnJvbSBcIi4vd2luZG93LmpzXCI7XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4KSB7XG4gIHJldHVybiBmdW5jdGlvbiBjb25zdGFudCgpIHtcbiAgICByZXR1cm4geDtcbiAgfTtcbn1cbiIsImV4cG9ydCBjb25zdCBhYnMgPSBNYXRoLmFicztcbmV4cG9ydCBjb25zdCBhdGFuMiA9IE1hdGguYXRhbjI7XG5leHBvcnQgY29uc3QgY29zID0gTWF0aC5jb3M7XG5leHBvcnQgY29uc3QgbWF4ID0gTWF0aC5tYXg7XG5leHBvcnQgY29uc3QgbWluID0gTWF0aC5taW47XG5leHBvcnQgY29uc3Qgc2luID0gTWF0aC5zaW47XG5leHBvcnQgY29uc3Qgc3FydCA9IE1hdGguc3FydDtcblxuZXhwb3J0IGNvbnN0IGVwc2lsb24gPSAxZS0xMjtcbmV4cG9ydCBjb25zdCBwaSA9IE1hdGguUEk7XG5leHBvcnQgY29uc3QgaGFsZlBpID0gcGkgLyAyO1xuZXhwb3J0IGNvbnN0IHRhdSA9IDIgKiBwaTtcblxuZXhwb3J0IGZ1bmN0aW9uIGFjb3MoeCkge1xuICByZXR1cm4geCA+IDEgPyAwIDogeCA8IC0xID8gcGkgOiBNYXRoLmFjb3MoeCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc2luKHgpIHtcbiAgcmV0dXJuIHggPj0gMSA/IGhhbGZQaSA6IHggPD0gLTEgPyAtaGFsZlBpIDogTWF0aC5hc2luKHgpO1xufVxuIiwiY29uc3QgcGkgPSBNYXRoLlBJLFxuICAgIHRhdSA9IDIgKiBwaSxcbiAgICBlcHNpbG9uID0gMWUtNixcbiAgICB0YXVFcHNpbG9uID0gdGF1IC0gZXBzaWxvbjtcblxuZnVuY3Rpb24gYXBwZW5kKHN0cmluZ3MpIHtcbiAgdGhpcy5fICs9IHN0cmluZ3NbMF07XG4gIGZvciAobGV0IGkgPSAxLCBuID0gc3RyaW5ncy5sZW5ndGg7IGkgPCBuOyArK2kpIHtcbiAgICB0aGlzLl8gKz0gYXJndW1lbnRzW2ldICsgc3RyaW5nc1tpXTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhcHBlbmRSb3VuZChkaWdpdHMpIHtcbiAgbGV0IGQgPSBNYXRoLmZsb29yKGRpZ2l0cyk7XG4gIGlmICghKGQgPj0gMCkpIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBkaWdpdHM6ICR7ZGlnaXRzfWApO1xuICBpZiAoZCA+IDE1KSByZXR1cm4gYXBwZW5kO1xuICBjb25zdCBrID0gMTAgKiogZDtcbiAgcmV0dXJuIGZ1bmN0aW9uKHN0cmluZ3MpIHtcbiAgICB0aGlzLl8gKz0gc3RyaW5nc1swXTtcbiAgICBmb3IgKGxldCBpID0gMSwgbiA9IHN0cmluZ3MubGVuZ3RoOyBpIDwgbjsgKytpKSB7XG4gICAgICB0aGlzLl8gKz0gTWF0aC5yb3VuZChhcmd1bWVudHNbaV0gKiBrKSAvIGsgKyBzdHJpbmdzW2ldO1xuICAgIH1cbiAgfTtcbn1cblxuZXhwb3J0IGNsYXNzIFBhdGgge1xuICBjb25zdHJ1Y3RvcihkaWdpdHMpIHtcbiAgICB0aGlzLl94MCA9IHRoaXMuX3kwID0gLy8gc3RhcnQgb2YgY3VycmVudCBzdWJwYXRoXG4gICAgdGhpcy5feDEgPSB0aGlzLl95MSA9IG51bGw7IC8vIGVuZCBvZiBjdXJyZW50IHN1YnBhdGhcbiAgICB0aGlzLl8gPSBcIlwiO1xuICAgIHRoaXMuX2FwcGVuZCA9IGRpZ2l0cyA9PSBudWxsID8gYXBwZW5kIDogYXBwZW5kUm91bmQoZGlnaXRzKTtcbiAgfVxuICBtb3ZlVG8oeCwgeSkge1xuICAgIHRoaXMuX2FwcGVuZGBNJHt0aGlzLl94MCA9IHRoaXMuX3gxID0gK3h9LCR7dGhpcy5feTAgPSB0aGlzLl95MSA9ICt5fWA7XG4gIH1cbiAgY2xvc2VQYXRoKCkge1xuICAgIGlmICh0aGlzLl94MSAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5feDEgPSB0aGlzLl94MCwgdGhpcy5feTEgPSB0aGlzLl95MDtcbiAgICAgIHRoaXMuX2FwcGVuZGBaYDtcbiAgICB9XG4gIH1cbiAgbGluZVRvKHgsIHkpIHtcbiAgICB0aGlzLl9hcHBlbmRgTCR7dGhpcy5feDEgPSAreH0sJHt0aGlzLl95MSA9ICt5fWA7XG4gIH1cbiAgcXVhZHJhdGljQ3VydmVUbyh4MSwgeTEsIHgsIHkpIHtcbiAgICB0aGlzLl9hcHBlbmRgUSR7K3gxfSwkeyt5MX0sJHt0aGlzLl94MSA9ICt4fSwke3RoaXMuX3kxID0gK3l9YDtcbiAgfVxuICBiZXppZXJDdXJ2ZVRvKHgxLCB5MSwgeDIsIHkyLCB4LCB5KSB7XG4gICAgdGhpcy5fYXBwZW5kYEMkeyt4MX0sJHsreTF9LCR7K3gyfSwkeyt5Mn0sJHt0aGlzLl94MSA9ICt4fSwke3RoaXMuX3kxID0gK3l9YDtcbiAgfVxuICBhcmNUbyh4MSwgeTEsIHgyLCB5Miwgcikge1xuICAgIHgxID0gK3gxLCB5MSA9ICt5MSwgeDIgPSAreDIsIHkyID0gK3kyLCByID0gK3I7XG5cbiAgICAvLyBJcyB0aGUgcmFkaXVzIG5lZ2F0aXZlPyBFcnJvci5cbiAgICBpZiAociA8IDApIHRocm93IG5ldyBFcnJvcihgbmVnYXRpdmUgcmFkaXVzOiAke3J9YCk7XG5cbiAgICBsZXQgeDAgPSB0aGlzLl94MSxcbiAgICAgICAgeTAgPSB0aGlzLl95MSxcbiAgICAgICAgeDIxID0geDIgLSB4MSxcbiAgICAgICAgeTIxID0geTIgLSB5MSxcbiAgICAgICAgeDAxID0geDAgLSB4MSxcbiAgICAgICAgeTAxID0geTAgLSB5MSxcbiAgICAgICAgbDAxXzIgPSB4MDEgKiB4MDEgKyB5MDEgKiB5MDE7XG5cbiAgICAvLyBJcyB0aGlzIHBhdGggZW1wdHk/IE1vdmUgdG8gKHgxLHkxKS5cbiAgICBpZiAodGhpcy5feDEgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuX2FwcGVuZGBNJHt0aGlzLl94MSA9IHgxfSwke3RoaXMuX3kxID0geTF9YDtcbiAgICB9XG5cbiAgICAvLyBPciwgaXMgKHgxLHkxKSBjb2luY2lkZW50IHdpdGggKHgwLHkwKT8gRG8gbm90aGluZy5cbiAgICBlbHNlIGlmICghKGwwMV8yID4gZXBzaWxvbikpO1xuXG4gICAgLy8gT3IsIGFyZSAoeDAseTApLCAoeDEseTEpIGFuZCAoeDIseTIpIGNvbGxpbmVhcj9cbiAgICAvLyBFcXVpdmFsZW50bHksIGlzICh4MSx5MSkgY29pbmNpZGVudCB3aXRoICh4Mix5Mik/XG4gICAgLy8gT3IsIGlzIHRoZSByYWRpdXMgemVybz8gTGluZSB0byAoeDEseTEpLlxuICAgIGVsc2UgaWYgKCEoTWF0aC5hYnMoeTAxICogeDIxIC0geTIxICogeDAxKSA+IGVwc2lsb24pIHx8ICFyKSB7XG4gICAgICB0aGlzLl9hcHBlbmRgTCR7dGhpcy5feDEgPSB4MX0sJHt0aGlzLl95MSA9IHkxfWA7XG4gICAgfVxuXG4gICAgLy8gT3RoZXJ3aXNlLCBkcmF3IGFuIGFyYyFcbiAgICBlbHNlIHtcbiAgICAgIGxldCB4MjAgPSB4MiAtIHgwLFxuICAgICAgICAgIHkyMCA9IHkyIC0geTAsXG4gICAgICAgICAgbDIxXzIgPSB4MjEgKiB4MjEgKyB5MjEgKiB5MjEsXG4gICAgICAgICAgbDIwXzIgPSB4MjAgKiB4MjAgKyB5MjAgKiB5MjAsXG4gICAgICAgICAgbDIxID0gTWF0aC5zcXJ0KGwyMV8yKSxcbiAgICAgICAgICBsMDEgPSBNYXRoLnNxcnQobDAxXzIpLFxuICAgICAgICAgIGwgPSByICogTWF0aC50YW4oKHBpIC0gTWF0aC5hY29zKChsMjFfMiArIGwwMV8yIC0gbDIwXzIpIC8gKDIgKiBsMjEgKiBsMDEpKSkgLyAyKSxcbiAgICAgICAgICB0MDEgPSBsIC8gbDAxLFxuICAgICAgICAgIHQyMSA9IGwgLyBsMjE7XG5cbiAgICAgIC8vIElmIHRoZSBzdGFydCB0YW5nZW50IGlzIG5vdCBjb2luY2lkZW50IHdpdGggKHgwLHkwKSwgbGluZSB0by5cbiAgICAgIGlmIChNYXRoLmFicyh0MDEgLSAxKSA+IGVwc2lsb24pIHtcbiAgICAgICAgdGhpcy5fYXBwZW5kYEwke3gxICsgdDAxICogeDAxfSwke3kxICsgdDAxICogeTAxfWA7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2FwcGVuZGBBJHtyfSwke3J9LDAsMCwkeysoeTAxICogeDIwID4geDAxICogeTIwKX0sJHt0aGlzLl94MSA9IHgxICsgdDIxICogeDIxfSwke3RoaXMuX3kxID0geTEgKyB0MjEgKiB5MjF9YDtcbiAgICB9XG4gIH1cbiAgYXJjKHgsIHksIHIsIGEwLCBhMSwgY2N3KSB7XG4gICAgeCA9ICt4LCB5ID0gK3ksIHIgPSArciwgY2N3ID0gISFjY3c7XG5cbiAgICAvLyBJcyB0aGUgcmFkaXVzIG5lZ2F0aXZlPyBFcnJvci5cbiAgICBpZiAociA8IDApIHRocm93IG5ldyBFcnJvcihgbmVnYXRpdmUgcmFkaXVzOiAke3J9YCk7XG5cbiAgICBsZXQgZHggPSByICogTWF0aC5jb3MoYTApLFxuICAgICAgICBkeSA9IHIgKiBNYXRoLnNpbihhMCksXG4gICAgICAgIHgwID0geCArIGR4LFxuICAgICAgICB5MCA9IHkgKyBkeSxcbiAgICAgICAgY3cgPSAxIF4gY2N3LFxuICAgICAgICBkYSA9IGNjdyA/IGEwIC0gYTEgOiBhMSAtIGEwO1xuXG4gICAgLy8gSXMgdGhpcyBwYXRoIGVtcHR5PyBNb3ZlIHRvICh4MCx5MCkuXG4gICAgaWYgKHRoaXMuX3gxID09PSBudWxsKSB7XG4gICAgICB0aGlzLl9hcHBlbmRgTSR7eDB9LCR7eTB9YDtcbiAgICB9XG5cbiAgICAvLyBPciwgaXMgKHgwLHkwKSBub3QgY29pbmNpZGVudCB3aXRoIHRoZSBwcmV2aW91cyBwb2ludD8gTGluZSB0byAoeDAseTApLlxuICAgIGVsc2UgaWYgKE1hdGguYWJzKHRoaXMuX3gxIC0geDApID4gZXBzaWxvbiB8fCBNYXRoLmFicyh0aGlzLl95MSAtIHkwKSA+IGVwc2lsb24pIHtcbiAgICAgIHRoaXMuX2FwcGVuZGBMJHt4MH0sJHt5MH1gO1xuICAgIH1cblxuICAgIC8vIElzIHRoaXMgYXJjIGVtcHR5PyBXZeKAmXJlIGRvbmUuXG4gICAgaWYgKCFyKSByZXR1cm47XG5cbiAgICAvLyBEb2VzIHRoZSBhbmdsZSBnbyB0aGUgd3Jvbmcgd2F5PyBGbGlwIHRoZSBkaXJlY3Rpb24uXG4gICAgaWYgKGRhIDwgMCkgZGEgPSBkYSAlIHRhdSArIHRhdTtcblxuICAgIC8vIElzIHRoaXMgYSBjb21wbGV0ZSBjaXJjbGU/IERyYXcgdHdvIGFyY3MgdG8gY29tcGxldGUgdGhlIGNpcmNsZS5cbiAgICBpZiAoZGEgPiB0YXVFcHNpbG9uKSB7XG4gICAgICB0aGlzLl9hcHBlbmRgQSR7cn0sJHtyfSwwLDEsJHtjd30sJHt4IC0gZHh9LCR7eSAtIGR5fUEke3J9LCR7cn0sMCwxLCR7Y3d9LCR7dGhpcy5feDEgPSB4MH0sJHt0aGlzLl95MSA9IHkwfWA7XG4gICAgfVxuXG4gICAgLy8gSXMgdGhpcyBhcmMgbm9uLWVtcHR5PyBEcmF3IGFuIGFyYyFcbiAgICBlbHNlIGlmIChkYSA+IGVwc2lsb24pIHtcbiAgICAgIHRoaXMuX2FwcGVuZGBBJHtyfSwke3J9LDAsJHsrKGRhID49IHBpKX0sJHtjd30sJHt0aGlzLl94MSA9IHggKyByICogTWF0aC5jb3MoYTEpfSwke3RoaXMuX3kxID0geSArIHIgKiBNYXRoLnNpbihhMSl9YDtcbiAgICB9XG4gIH1cbiAgcmVjdCh4LCB5LCB3LCBoKSB7XG4gICAgdGhpcy5fYXBwZW5kYE0ke3RoaXMuX3gwID0gdGhpcy5feDEgPSAreH0sJHt0aGlzLl95MCA9IHRoaXMuX3kxID0gK3l9aCR7dyA9ICt3fXYkeytofWgkey13fVpgO1xuICB9XG4gIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLl87XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhdGgoKSB7XG4gIHJldHVybiBuZXcgUGF0aDtcbn1cblxuLy8gQWxsb3cgaW5zdGFuY2VvZiBkMy5wYXRoXG5wYXRoLnByb3RvdHlwZSA9IFBhdGgucHJvdG90eXBlO1xuXG5leHBvcnQgZnVuY3Rpb24gcGF0aFJvdW5kKGRpZ2l0cyA9IDMpIHtcbiAgcmV0dXJuIG5ldyBQYXRoKCtkaWdpdHMpO1xufVxuIiwiaW1wb3J0IHtQYXRofSBmcm9tIFwiZDMtcGF0aFwiO1xuXG5leHBvcnQgZnVuY3Rpb24gd2l0aFBhdGgoc2hhcGUpIHtcbiAgbGV0IGRpZ2l0cyA9IDM7XG5cbiAgc2hhcGUuZGlnaXRzID0gZnVuY3Rpb24oXykge1xuICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGRpZ2l0cztcbiAgICBpZiAoXyA9PSBudWxsKSB7XG4gICAgICBkaWdpdHMgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBkID0gTWF0aC5mbG9vcihfKTtcbiAgICAgIGlmICghKGQgPj0gMCkpIHRocm93IG5ldyBSYW5nZUVycm9yKGBpbnZhbGlkIGRpZ2l0czogJHtffWApO1xuICAgICAgZGlnaXRzID0gZDtcbiAgICB9XG4gICAgcmV0dXJuIHNoYXBlO1xuICB9O1xuXG4gIHJldHVybiAoKSA9PiBuZXcgUGF0aChkaWdpdHMpO1xufVxuIiwiaW1wb3J0IGNvbnN0YW50IGZyb20gXCIuL2NvbnN0YW50LmpzXCI7XG5pbXBvcnQge2FicywgYWNvcywgYXNpbiwgYXRhbjIsIGNvcywgZXBzaWxvbiwgaGFsZlBpLCBtYXgsIG1pbiwgcGksIHNpbiwgc3FydCwgdGF1fSBmcm9tIFwiLi9tYXRoLmpzXCI7XG5pbXBvcnQge3dpdGhQYXRofSBmcm9tIFwiLi9wYXRoLmpzXCI7XG5cbmZ1bmN0aW9uIGFyY0lubmVyUmFkaXVzKGQpIHtcbiAgcmV0dXJuIGQuaW5uZXJSYWRpdXM7XG59XG5cbmZ1bmN0aW9uIGFyY091dGVyUmFkaXVzKGQpIHtcbiAgcmV0dXJuIGQub3V0ZXJSYWRpdXM7XG59XG5cbmZ1bmN0aW9uIGFyY1N0YXJ0QW5nbGUoZCkge1xuICByZXR1cm4gZC5zdGFydEFuZ2xlO1xufVxuXG5mdW5jdGlvbiBhcmNFbmRBbmdsZShkKSB7XG4gIHJldHVybiBkLmVuZEFuZ2xlO1xufVxuXG5mdW5jdGlvbiBhcmNQYWRBbmdsZShkKSB7XG4gIHJldHVybiBkICYmIGQucGFkQW5nbGU7IC8vIE5vdGU6IG9wdGlvbmFsIVxufVxuXG5mdW5jdGlvbiBpbnRlcnNlY3QoeDAsIHkwLCB4MSwgeTEsIHgyLCB5MiwgeDMsIHkzKSB7XG4gIHZhciB4MTAgPSB4MSAtIHgwLCB5MTAgPSB5MSAtIHkwLFxuICAgICAgeDMyID0geDMgLSB4MiwgeTMyID0geTMgLSB5MixcbiAgICAgIHQgPSB5MzIgKiB4MTAgLSB4MzIgKiB5MTA7XG4gIGlmICh0ICogdCA8IGVwc2lsb24pIHJldHVybjtcbiAgdCA9ICh4MzIgKiAoeTAgLSB5MikgLSB5MzIgKiAoeDAgLSB4MikpIC8gdDtcbiAgcmV0dXJuIFt4MCArIHQgKiB4MTAsIHkwICsgdCAqIHkxMF07XG59XG5cbi8vIENvbXB1dGUgcGVycGVuZGljdWxhciBvZmZzZXQgbGluZSBvZiBsZW5ndGggcmMuXG4vLyBodHRwOi8vbWF0aHdvcmxkLndvbGZyYW0uY29tL0NpcmNsZS1MaW5lSW50ZXJzZWN0aW9uLmh0bWxcbmZ1bmN0aW9uIGNvcm5lclRhbmdlbnRzKHgwLCB5MCwgeDEsIHkxLCByMSwgcmMsIGN3KSB7XG4gIHZhciB4MDEgPSB4MCAtIHgxLFxuICAgICAgeTAxID0geTAgLSB5MSxcbiAgICAgIGxvID0gKGN3ID8gcmMgOiAtcmMpIC8gc3FydCh4MDEgKiB4MDEgKyB5MDEgKiB5MDEpLFxuICAgICAgb3ggPSBsbyAqIHkwMSxcbiAgICAgIG95ID0gLWxvICogeDAxLFxuICAgICAgeDExID0geDAgKyBveCxcbiAgICAgIHkxMSA9IHkwICsgb3ksXG4gICAgICB4MTAgPSB4MSArIG94LFxuICAgICAgeTEwID0geTEgKyBveSxcbiAgICAgIHgwMCA9ICh4MTEgKyB4MTApIC8gMixcbiAgICAgIHkwMCA9ICh5MTEgKyB5MTApIC8gMixcbiAgICAgIGR4ID0geDEwIC0geDExLFxuICAgICAgZHkgPSB5MTAgLSB5MTEsXG4gICAgICBkMiA9IGR4ICogZHggKyBkeSAqIGR5LFxuICAgICAgciA9IHIxIC0gcmMsXG4gICAgICBEID0geDExICogeTEwIC0geDEwICogeTExLFxuICAgICAgZCA9IChkeSA8IDAgPyAtMSA6IDEpICogc3FydChtYXgoMCwgciAqIHIgKiBkMiAtIEQgKiBEKSksXG4gICAgICBjeDAgPSAoRCAqIGR5IC0gZHggKiBkKSAvIGQyLFxuICAgICAgY3kwID0gKC1EICogZHggLSBkeSAqIGQpIC8gZDIsXG4gICAgICBjeDEgPSAoRCAqIGR5ICsgZHggKiBkKSAvIGQyLFxuICAgICAgY3kxID0gKC1EICogZHggKyBkeSAqIGQpIC8gZDIsXG4gICAgICBkeDAgPSBjeDAgLSB4MDAsXG4gICAgICBkeTAgPSBjeTAgLSB5MDAsXG4gICAgICBkeDEgPSBjeDEgLSB4MDAsXG4gICAgICBkeTEgPSBjeTEgLSB5MDA7XG5cbiAgLy8gUGljayB0aGUgY2xvc2VyIG9mIHRoZSB0d28gaW50ZXJzZWN0aW9uIHBvaW50cy5cbiAgLy8gVE9ETyBJcyB0aGVyZSBhIGZhc3RlciB3YXkgdG8gZGV0ZXJtaW5lIHdoaWNoIGludGVyc2VjdGlvbiB0byB1c2U/XG4gIGlmIChkeDAgKiBkeDAgKyBkeTAgKiBkeTAgPiBkeDEgKiBkeDEgKyBkeTEgKiBkeTEpIGN4MCA9IGN4MSwgY3kwID0gY3kxO1xuXG4gIHJldHVybiB7XG4gICAgY3g6IGN4MCxcbiAgICBjeTogY3kwLFxuICAgIHgwMTogLW94LFxuICAgIHkwMTogLW95LFxuICAgIHgxMTogY3gwICogKHIxIC8gciAtIDEpLFxuICAgIHkxMTogY3kwICogKHIxIC8gciAtIDEpXG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgaW5uZXJSYWRpdXMgPSBhcmNJbm5lclJhZGl1cyxcbiAgICAgIG91dGVyUmFkaXVzID0gYXJjT3V0ZXJSYWRpdXMsXG4gICAgICBjb3JuZXJSYWRpdXMgPSBjb25zdGFudCgwKSxcbiAgICAgIHBhZFJhZGl1cyA9IG51bGwsXG4gICAgICBzdGFydEFuZ2xlID0gYXJjU3RhcnRBbmdsZSxcbiAgICAgIGVuZEFuZ2xlID0gYXJjRW5kQW5nbGUsXG4gICAgICBwYWRBbmdsZSA9IGFyY1BhZEFuZ2xlLFxuICAgICAgY29udGV4dCA9IG51bGwsXG4gICAgICBwYXRoID0gd2l0aFBhdGgoYXJjKTtcblxuICBmdW5jdGlvbiBhcmMoKSB7XG4gICAgdmFyIGJ1ZmZlcixcbiAgICAgICAgcixcbiAgICAgICAgcjAgPSAraW5uZXJSYWRpdXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSxcbiAgICAgICAgcjEgPSArb3V0ZXJSYWRpdXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSxcbiAgICAgICAgYTAgPSBzdGFydEFuZ2xlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgLSBoYWxmUGksXG4gICAgICAgIGExID0gZW5kQW5nbGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSAtIGhhbGZQaSxcbiAgICAgICAgZGEgPSBhYnMoYTEgLSBhMCksXG4gICAgICAgIGN3ID0gYTEgPiBhMDtcblxuICAgIGlmICghY29udGV4dCkgY29udGV4dCA9IGJ1ZmZlciA9IHBhdGgoKTtcblxuICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBvdXRlciByYWRpdXMgaXMgYWx3YXlzIGxhcmdlciB0aGFuIHRoZSBpbm5lciByYWRpdXMuXG4gICAgaWYgKHIxIDwgcjApIHIgPSByMSwgcjEgPSByMCwgcjAgPSByO1xuXG4gICAgLy8gSXMgaXQgYSBwb2ludD9cbiAgICBpZiAoIShyMSA+IGVwc2lsb24pKSBjb250ZXh0Lm1vdmVUbygwLCAwKTtcblxuICAgIC8vIE9yIGlzIGl0IGEgY2lyY2xlIG9yIGFubnVsdXM/XG4gICAgZWxzZSBpZiAoZGEgPiB0YXUgLSBlcHNpbG9uKSB7XG4gICAgICBjb250ZXh0Lm1vdmVUbyhyMSAqIGNvcyhhMCksIHIxICogc2luKGEwKSk7XG4gICAgICBjb250ZXh0LmFyYygwLCAwLCByMSwgYTAsIGExLCAhY3cpO1xuICAgICAgaWYgKHIwID4gZXBzaWxvbikge1xuICAgICAgICBjb250ZXh0Lm1vdmVUbyhyMCAqIGNvcyhhMSksIHIwICogc2luKGExKSk7XG4gICAgICAgIGNvbnRleHQuYXJjKDAsIDAsIHIwLCBhMSwgYTAsIGN3KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBPciBpcyBpdCBhIGNpcmN1bGFyIG9yIGFubnVsYXIgc2VjdG9yP1xuICAgIGVsc2Uge1xuICAgICAgdmFyIGEwMSA9IGEwLFxuICAgICAgICAgIGExMSA9IGExLFxuICAgICAgICAgIGEwMCA9IGEwLFxuICAgICAgICAgIGExMCA9IGExLFxuICAgICAgICAgIGRhMCA9IGRhLFxuICAgICAgICAgIGRhMSA9IGRhLFxuICAgICAgICAgIGFwID0gcGFkQW5nbGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSAvIDIsXG4gICAgICAgICAgcnAgPSAoYXAgPiBlcHNpbG9uKSAmJiAocGFkUmFkaXVzID8gK3BhZFJhZGl1cy5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogc3FydChyMCAqIHIwICsgcjEgKiByMSkpLFxuICAgICAgICAgIHJjID0gbWluKGFicyhyMSAtIHIwKSAvIDIsICtjb3JuZXJSYWRpdXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSksXG4gICAgICAgICAgcmMwID0gcmMsXG4gICAgICAgICAgcmMxID0gcmMsXG4gICAgICAgICAgdDAsXG4gICAgICAgICAgdDE7XG5cbiAgICAgIC8vIEFwcGx5IHBhZGRpbmc/IE5vdGUgdGhhdCBzaW5jZSByMSDiiaUgcjAsIGRhMSDiiaUgZGEwLlxuICAgICAgaWYgKHJwID4gZXBzaWxvbikge1xuICAgICAgICB2YXIgcDAgPSBhc2luKHJwIC8gcjAgKiBzaW4oYXApKSxcbiAgICAgICAgICAgIHAxID0gYXNpbihycCAvIHIxICogc2luKGFwKSk7XG4gICAgICAgIGlmICgoZGEwIC09IHAwICogMikgPiBlcHNpbG9uKSBwMCAqPSAoY3cgPyAxIDogLTEpLCBhMDAgKz0gcDAsIGExMCAtPSBwMDtcbiAgICAgICAgZWxzZSBkYTAgPSAwLCBhMDAgPSBhMTAgPSAoYTAgKyBhMSkgLyAyO1xuICAgICAgICBpZiAoKGRhMSAtPSBwMSAqIDIpID4gZXBzaWxvbikgcDEgKj0gKGN3ID8gMSA6IC0xKSwgYTAxICs9IHAxLCBhMTEgLT0gcDE7XG4gICAgICAgIGVsc2UgZGExID0gMCwgYTAxID0gYTExID0gKGEwICsgYTEpIC8gMjtcbiAgICAgIH1cblxuICAgICAgdmFyIHgwMSA9IHIxICogY29zKGEwMSksXG4gICAgICAgICAgeTAxID0gcjEgKiBzaW4oYTAxKSxcbiAgICAgICAgICB4MTAgPSByMCAqIGNvcyhhMTApLFxuICAgICAgICAgIHkxMCA9IHIwICogc2luKGExMCk7XG5cbiAgICAgIC8vIEFwcGx5IHJvdW5kZWQgY29ybmVycz9cbiAgICAgIGlmIChyYyA+IGVwc2lsb24pIHtcbiAgICAgICAgdmFyIHgxMSA9IHIxICogY29zKGExMSksXG4gICAgICAgICAgICB5MTEgPSByMSAqIHNpbihhMTEpLFxuICAgICAgICAgICAgeDAwID0gcjAgKiBjb3MoYTAwKSxcbiAgICAgICAgICAgIHkwMCA9IHIwICogc2luKGEwMCksXG4gICAgICAgICAgICBvYztcblxuICAgICAgICAvLyBSZXN0cmljdCB0aGUgY29ybmVyIHJhZGl1cyBhY2NvcmRpbmcgdG8gdGhlIHNlY3RvciBhbmdsZS4gSWYgdGhpc1xuICAgICAgICAvLyBpbnRlcnNlY3Rpb24gZmFpbHMsIGl04oCZcyBwcm9iYWJseSBiZWNhdXNlIHRoZSBhcmMgaXMgdG9vIHNtYWxsLCBzb1xuICAgICAgICAvLyBkaXNhYmxlIHRoZSBjb3JuZXIgcmFkaXVzIGVudGlyZWx5LlxuICAgICAgICBpZiAoZGEgPCBwaSkge1xuICAgICAgICAgIGlmIChvYyA9IGludGVyc2VjdCh4MDEsIHkwMSwgeDAwLCB5MDAsIHgxMSwgeTExLCB4MTAsIHkxMCkpIHtcbiAgICAgICAgICAgIHZhciBheCA9IHgwMSAtIG9jWzBdLFxuICAgICAgICAgICAgICAgIGF5ID0geTAxIC0gb2NbMV0sXG4gICAgICAgICAgICAgICAgYnggPSB4MTEgLSBvY1swXSxcbiAgICAgICAgICAgICAgICBieSA9IHkxMSAtIG9jWzFdLFxuICAgICAgICAgICAgICAgIGtjID0gMSAvIHNpbihhY29zKChheCAqIGJ4ICsgYXkgKiBieSkgLyAoc3FydChheCAqIGF4ICsgYXkgKiBheSkgKiBzcXJ0KGJ4ICogYnggKyBieSAqIGJ5KSkpIC8gMiksXG4gICAgICAgICAgICAgICAgbGMgPSBzcXJ0KG9jWzBdICogb2NbMF0gKyBvY1sxXSAqIG9jWzFdKTtcbiAgICAgICAgICAgIHJjMCA9IG1pbihyYywgKHIwIC0gbGMpIC8gKGtjIC0gMSkpO1xuICAgICAgICAgICAgcmMxID0gbWluKHJjLCAocjEgLSBsYykgLyAoa2MgKyAxKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJjMCA9IHJjMSA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIElzIHRoZSBzZWN0b3IgY29sbGFwc2VkIHRvIGEgbGluZT9cbiAgICAgIGlmICghKGRhMSA+IGVwc2lsb24pKSBjb250ZXh0Lm1vdmVUbyh4MDEsIHkwMSk7XG5cbiAgICAgIC8vIERvZXMgdGhlIHNlY3RvcuKAmXMgb3V0ZXIgcmluZyBoYXZlIHJvdW5kZWQgY29ybmVycz9cbiAgICAgIGVsc2UgaWYgKHJjMSA+IGVwc2lsb24pIHtcbiAgICAgICAgdDAgPSBjb3JuZXJUYW5nZW50cyh4MDAsIHkwMCwgeDAxLCB5MDEsIHIxLCByYzEsIGN3KTtcbiAgICAgICAgdDEgPSBjb3JuZXJUYW5nZW50cyh4MTEsIHkxMSwgeDEwLCB5MTAsIHIxLCByYzEsIGN3KTtcblxuICAgICAgICBjb250ZXh0Lm1vdmVUbyh0MC5jeCArIHQwLngwMSwgdDAuY3kgKyB0MC55MDEpO1xuXG4gICAgICAgIC8vIEhhdmUgdGhlIGNvcm5lcnMgbWVyZ2VkP1xuICAgICAgICBpZiAocmMxIDwgcmMpIGNvbnRleHQuYXJjKHQwLmN4LCB0MC5jeSwgcmMxLCBhdGFuMih0MC55MDEsIHQwLngwMSksIGF0YW4yKHQxLnkwMSwgdDEueDAxKSwgIWN3KTtcblxuICAgICAgICAvLyBPdGhlcndpc2UsIGRyYXcgdGhlIHR3byBjb3JuZXJzIGFuZCB0aGUgcmluZy5cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgY29udGV4dC5hcmModDAuY3gsIHQwLmN5LCByYzEsIGF0YW4yKHQwLnkwMSwgdDAueDAxKSwgYXRhbjIodDAueTExLCB0MC54MTEpLCAhY3cpO1xuICAgICAgICAgIGNvbnRleHQuYXJjKDAsIDAsIHIxLCBhdGFuMih0MC5jeSArIHQwLnkxMSwgdDAuY3ggKyB0MC54MTEpLCBhdGFuMih0MS5jeSArIHQxLnkxMSwgdDEuY3ggKyB0MS54MTEpLCAhY3cpO1xuICAgICAgICAgIGNvbnRleHQuYXJjKHQxLmN4LCB0MS5jeSwgcmMxLCBhdGFuMih0MS55MTEsIHQxLngxMSksIGF0YW4yKHQxLnkwMSwgdDEueDAxKSwgIWN3KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBPciBpcyB0aGUgb3V0ZXIgcmluZyBqdXN0IGEgY2lyY3VsYXIgYXJjP1xuICAgICAgZWxzZSBjb250ZXh0Lm1vdmVUbyh4MDEsIHkwMSksIGNvbnRleHQuYXJjKDAsIDAsIHIxLCBhMDEsIGExMSwgIWN3KTtcblxuICAgICAgLy8gSXMgdGhlcmUgbm8gaW5uZXIgcmluZywgYW5kIGl04oCZcyBhIGNpcmN1bGFyIHNlY3Rvcj9cbiAgICAgIC8vIE9yIHBlcmhhcHMgaXTigJlzIGFuIGFubnVsYXIgc2VjdG9yIGNvbGxhcHNlZCBkdWUgdG8gcGFkZGluZz9cbiAgICAgIGlmICghKHIwID4gZXBzaWxvbikgfHwgIShkYTAgPiBlcHNpbG9uKSkgY29udGV4dC5saW5lVG8oeDEwLCB5MTApO1xuXG4gICAgICAvLyBEb2VzIHRoZSBzZWN0b3LigJlzIGlubmVyIHJpbmcgKG9yIHBvaW50KSBoYXZlIHJvdW5kZWQgY29ybmVycz9cbiAgICAgIGVsc2UgaWYgKHJjMCA+IGVwc2lsb24pIHtcbiAgICAgICAgdDAgPSBjb3JuZXJUYW5nZW50cyh4MTAsIHkxMCwgeDExLCB5MTEsIHIwLCAtcmMwLCBjdyk7XG4gICAgICAgIHQxID0gY29ybmVyVGFuZ2VudHMoeDAxLCB5MDEsIHgwMCwgeTAwLCByMCwgLXJjMCwgY3cpO1xuXG4gICAgICAgIGNvbnRleHQubGluZVRvKHQwLmN4ICsgdDAueDAxLCB0MC5jeSArIHQwLnkwMSk7XG5cbiAgICAgICAgLy8gSGF2ZSB0aGUgY29ybmVycyBtZXJnZWQ/XG4gICAgICAgIGlmIChyYzAgPCByYykgY29udGV4dC5hcmModDAuY3gsIHQwLmN5LCByYzAsIGF0YW4yKHQwLnkwMSwgdDAueDAxKSwgYXRhbjIodDEueTAxLCB0MS54MDEpLCAhY3cpO1xuXG4gICAgICAgIC8vIE90aGVyd2lzZSwgZHJhdyB0aGUgdHdvIGNvcm5lcnMgYW5kIHRoZSByaW5nLlxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBjb250ZXh0LmFyYyh0MC5jeCwgdDAuY3ksIHJjMCwgYXRhbjIodDAueTAxLCB0MC54MDEpLCBhdGFuMih0MC55MTEsIHQwLngxMSksICFjdyk7XG4gICAgICAgICAgY29udGV4dC5hcmMoMCwgMCwgcjAsIGF0YW4yKHQwLmN5ICsgdDAueTExLCB0MC5jeCArIHQwLngxMSksIGF0YW4yKHQxLmN5ICsgdDEueTExLCB0MS5jeCArIHQxLngxMSksIGN3KTtcbiAgICAgICAgICBjb250ZXh0LmFyYyh0MS5jeCwgdDEuY3ksIHJjMCwgYXRhbjIodDEueTExLCB0MS54MTEpLCBhdGFuMih0MS55MDEsIHQxLngwMSksICFjdyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gT3IgaXMgdGhlIGlubmVyIHJpbmcganVzdCBhIGNpcmN1bGFyIGFyYz9cbiAgICAgIGVsc2UgY29udGV4dC5hcmMoMCwgMCwgcjAsIGExMCwgYTAwLCBjdyk7XG4gICAgfVxuXG4gICAgY29udGV4dC5jbG9zZVBhdGgoKTtcblxuICAgIGlmIChidWZmZXIpIHJldHVybiBjb250ZXh0ID0gbnVsbCwgYnVmZmVyICsgXCJcIiB8fCBudWxsO1xuICB9XG5cbiAgYXJjLmNlbnRyb2lkID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHIgPSAoK2lubmVyUmFkaXVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgKyArb3V0ZXJSYWRpdXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSkgLyAyLFxuICAgICAgICBhID0gKCtzdGFydEFuZ2xlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgKyArZW5kQW5nbGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSkgLyAyIC0gcGkgLyAyO1xuICAgIHJldHVybiBbY29zKGEpICogciwgc2luKGEpICogcl07XG4gIH07XG5cbiAgYXJjLmlubmVyUmFkaXVzID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGlubmVyUmFkaXVzID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCgrXyksIGFyYykgOiBpbm5lclJhZGl1cztcbiAgfTtcblxuICBhcmMub3V0ZXJSYWRpdXMgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob3V0ZXJSYWRpdXMgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgYXJjKSA6IG91dGVyUmFkaXVzO1xuICB9O1xuXG4gIGFyYy5jb3JuZXJSYWRpdXMgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoY29ybmVyUmFkaXVzID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCgrXyksIGFyYykgOiBjb3JuZXJSYWRpdXM7XG4gIH07XG5cbiAgYXJjLnBhZFJhZGl1cyA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYWRSYWRpdXMgPSBfID09IG51bGwgPyBudWxsIDogdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCgrXyksIGFyYykgOiBwYWRSYWRpdXM7XG4gIH07XG5cbiAgYXJjLnN0YXJ0QW5nbGUgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3RhcnRBbmdsZSA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCBhcmMpIDogc3RhcnRBbmdsZTtcbiAgfTtcblxuICBhcmMuZW5kQW5nbGUgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZW5kQW5nbGUgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgYXJjKSA6IGVuZEFuZ2xlO1xuICB9O1xuXG4gIGFyYy5wYWRBbmdsZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYWRBbmdsZSA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCBhcmMpIDogcGFkQW5nbGU7XG4gIH07XG5cbiAgYXJjLmNvbnRleHQgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoKGNvbnRleHQgPSBfID09IG51bGwgPyBudWxsIDogXyksIGFyYykgOiBjb250ZXh0O1xuICB9O1xuXG4gIHJldHVybiBhcmM7XG59XG4iLCJleHBvcnQgdmFyIHNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4KSB7XG4gIHJldHVybiB0eXBlb2YgeCA9PT0gXCJvYmplY3RcIiAmJiBcImxlbmd0aFwiIGluIHhcbiAgICA/IHggLy8gQXJyYXksIFR5cGVkQXJyYXksIE5vZGVMaXN0LCBhcnJheS1saWtlXG4gICAgOiBBcnJheS5mcm9tKHgpOyAvLyBNYXAsIFNldCwgaXRlcmFibGUsIHN0cmluZywgb3IgYW55dGhpbmcgZWxzZVxufVxuIiwiZnVuY3Rpb24gTGluZWFyKGNvbnRleHQpIHtcbiAgdGhpcy5fY29udGV4dCA9IGNvbnRleHQ7XG59XG5cbkxpbmVhci5wcm90b3R5cGUgPSB7XG4gIGFyZWFTdGFydDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5fbGluZSA9IDA7XG4gIH0sXG4gIGFyZWFFbmQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX2xpbmUgPSBOYU47XG4gIH0sXG4gIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5fcG9pbnQgPSAwO1xuICB9LFxuICBsaW5lRW5kOiBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5fbGluZSB8fCAodGhpcy5fbGluZSAhPT0gMCAmJiB0aGlzLl9wb2ludCA9PT0gMSkpIHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7XG4gICAgdGhpcy5fbGluZSA9IDEgLSB0aGlzLl9saW5lO1xuICB9LFxuICBwb2ludDogZnVuY3Rpb24oeCwgeSkge1xuICAgIHggPSAreCwgeSA9ICt5O1xuICAgIHN3aXRjaCAodGhpcy5fcG9pbnQpIHtcbiAgICAgIGNhc2UgMDogdGhpcy5fcG9pbnQgPSAxOyB0aGlzLl9saW5lID8gdGhpcy5fY29udGV4dC5saW5lVG8oeCwgeSkgOiB0aGlzLl9jb250ZXh0Lm1vdmVUbyh4LCB5KTsgYnJlYWs7XG4gICAgICBjYXNlIDE6IHRoaXMuX3BvaW50ID0gMjsgLy8gZmFsbHMgdGhyb3VnaFxuICAgICAgZGVmYXVsdDogdGhpcy5fY29udGV4dC5saW5lVG8oeCwgeSk7IGJyZWFrO1xuICAgIH1cbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY29udGV4dCkge1xuICByZXR1cm4gbmV3IExpbmVhcihjb250ZXh0KTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiB4KHApIHtcbiAgcmV0dXJuIHBbMF07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB5KHApIHtcbiAgcmV0dXJuIHBbMV07XG59XG4iLCJpbXBvcnQgYXJyYXkgZnJvbSBcIi4vYXJyYXkuanNcIjtcbmltcG9ydCBjb25zdGFudCBmcm9tIFwiLi9jb25zdGFudC5qc1wiO1xuaW1wb3J0IGN1cnZlTGluZWFyIGZyb20gXCIuL2N1cnZlL2xpbmVhci5qc1wiO1xuaW1wb3J0IHt3aXRoUGF0aH0gZnJvbSBcIi4vcGF0aC5qc1wiO1xuaW1wb3J0IHt4IGFzIHBvaW50WCwgeSBhcyBwb2ludFl9IGZyb20gXCIuL3BvaW50LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgsIHkpIHtcbiAgdmFyIGRlZmluZWQgPSBjb25zdGFudCh0cnVlKSxcbiAgICAgIGNvbnRleHQgPSBudWxsLFxuICAgICAgY3VydmUgPSBjdXJ2ZUxpbmVhcixcbiAgICAgIG91dHB1dCA9IG51bGwsXG4gICAgICBwYXRoID0gd2l0aFBhdGgobGluZSk7XG5cbiAgeCA9IHR5cGVvZiB4ID09PSBcImZ1bmN0aW9uXCIgPyB4IDogKHggPT09IHVuZGVmaW5lZCkgPyBwb2ludFggOiBjb25zdGFudCh4KTtcbiAgeSA9IHR5cGVvZiB5ID09PSBcImZ1bmN0aW9uXCIgPyB5IDogKHkgPT09IHVuZGVmaW5lZCkgPyBwb2ludFkgOiBjb25zdGFudCh5KTtcblxuICBmdW5jdGlvbiBsaW5lKGRhdGEpIHtcbiAgICB2YXIgaSxcbiAgICAgICAgbiA9IChkYXRhID0gYXJyYXkoZGF0YSkpLmxlbmd0aCxcbiAgICAgICAgZCxcbiAgICAgICAgZGVmaW5lZDAgPSBmYWxzZSxcbiAgICAgICAgYnVmZmVyO1xuXG4gICAgaWYgKGNvbnRleHQgPT0gbnVsbCkgb3V0cHV0ID0gY3VydmUoYnVmZmVyID0gcGF0aCgpKTtcblxuICAgIGZvciAoaSA9IDA7IGkgPD0gbjsgKytpKSB7XG4gICAgICBpZiAoIShpIDwgbiAmJiBkZWZpbmVkKGQgPSBkYXRhW2ldLCBpLCBkYXRhKSkgPT09IGRlZmluZWQwKSB7XG4gICAgICAgIGlmIChkZWZpbmVkMCA9ICFkZWZpbmVkMCkgb3V0cHV0LmxpbmVTdGFydCgpO1xuICAgICAgICBlbHNlIG91dHB1dC5saW5lRW5kKCk7XG4gICAgICB9XG4gICAgICBpZiAoZGVmaW5lZDApIG91dHB1dC5wb2ludCgreChkLCBpLCBkYXRhKSwgK3koZCwgaSwgZGF0YSkpO1xuICAgIH1cblxuICAgIGlmIChidWZmZXIpIHJldHVybiBvdXRwdXQgPSBudWxsLCBidWZmZXIgKyBcIlwiIHx8IG51bGw7XG4gIH1cblxuICBsaW5lLnggPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeCA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCBsaW5lKSA6IHg7XG4gIH07XG5cbiAgbGluZS55ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHkgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgbGluZSkgOiB5O1xuICB9O1xuXG4gIGxpbmUuZGVmaW5lZCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkZWZpbmVkID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCghIV8pLCBsaW5lKSA6IGRlZmluZWQ7XG4gIH07XG5cbiAgbGluZS5jdXJ2ZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjdXJ2ZSA9IF8sIGNvbnRleHQgIT0gbnVsbCAmJiAob3V0cHV0ID0gY3VydmUoY29udGV4dCkpLCBsaW5lKSA6IGN1cnZlO1xuICB9O1xuXG4gIGxpbmUuY29udGV4dCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChfID09IG51bGwgPyBjb250ZXh0ID0gb3V0cHV0ID0gbnVsbCA6IG91dHB1dCA9IGN1cnZlKGNvbnRleHQgPSBfKSwgbGluZSkgOiBjb250ZXh0O1xuICB9O1xuXG4gIHJldHVybiBsaW5lO1xufVxuIiwiaW1wb3J0IGFycmF5IGZyb20gXCIuL2FycmF5LmpzXCI7XG5pbXBvcnQgY29uc3RhbnQgZnJvbSBcIi4vY29uc3RhbnQuanNcIjtcbmltcG9ydCBjdXJ2ZUxpbmVhciBmcm9tIFwiLi9jdXJ2ZS9saW5lYXIuanNcIjtcbmltcG9ydCBsaW5lIGZyb20gXCIuL2xpbmUuanNcIjtcbmltcG9ydCB7d2l0aFBhdGh9IGZyb20gXCIuL3BhdGguanNcIjtcbmltcG9ydCB7eCBhcyBwb2ludFgsIHkgYXMgcG9pbnRZfSBmcm9tIFwiLi9wb2ludC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4MCwgeTAsIHkxKSB7XG4gIHZhciB4MSA9IG51bGwsXG4gICAgICBkZWZpbmVkID0gY29uc3RhbnQodHJ1ZSksXG4gICAgICBjb250ZXh0ID0gbnVsbCxcbiAgICAgIGN1cnZlID0gY3VydmVMaW5lYXIsXG4gICAgICBvdXRwdXQgPSBudWxsLFxuICAgICAgcGF0aCA9IHdpdGhQYXRoKGFyZWEpO1xuXG4gIHgwID0gdHlwZW9mIHgwID09PSBcImZ1bmN0aW9uXCIgPyB4MCA6ICh4MCA9PT0gdW5kZWZpbmVkKSA/IHBvaW50WCA6IGNvbnN0YW50KCt4MCk7XG4gIHkwID0gdHlwZW9mIHkwID09PSBcImZ1bmN0aW9uXCIgPyB5MCA6ICh5MCA9PT0gdW5kZWZpbmVkKSA/IGNvbnN0YW50KDApIDogY29uc3RhbnQoK3kwKTtcbiAgeTEgPSB0eXBlb2YgeTEgPT09IFwiZnVuY3Rpb25cIiA/IHkxIDogKHkxID09PSB1bmRlZmluZWQpID8gcG9pbnRZIDogY29uc3RhbnQoK3kxKTtcblxuICBmdW5jdGlvbiBhcmVhKGRhdGEpIHtcbiAgICB2YXIgaSxcbiAgICAgICAgaixcbiAgICAgICAgayxcbiAgICAgICAgbiA9IChkYXRhID0gYXJyYXkoZGF0YSkpLmxlbmd0aCxcbiAgICAgICAgZCxcbiAgICAgICAgZGVmaW5lZDAgPSBmYWxzZSxcbiAgICAgICAgYnVmZmVyLFxuICAgICAgICB4MHogPSBuZXcgQXJyYXkobiksXG4gICAgICAgIHkweiA9IG5ldyBBcnJheShuKTtcblxuICAgIGlmIChjb250ZXh0ID09IG51bGwpIG91dHB1dCA9IGN1cnZlKGJ1ZmZlciA9IHBhdGgoKSk7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDw9IG47ICsraSkge1xuICAgICAgaWYgKCEoaSA8IG4gJiYgZGVmaW5lZChkID0gZGF0YVtpXSwgaSwgZGF0YSkpID09PSBkZWZpbmVkMCkge1xuICAgICAgICBpZiAoZGVmaW5lZDAgPSAhZGVmaW5lZDApIHtcbiAgICAgICAgICBqID0gaTtcbiAgICAgICAgICBvdXRwdXQuYXJlYVN0YXJ0KCk7XG4gICAgICAgICAgb3V0cHV0LmxpbmVTdGFydCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG91dHB1dC5saW5lRW5kKCk7XG4gICAgICAgICAgb3V0cHV0LmxpbmVTdGFydCgpO1xuICAgICAgICAgIGZvciAoayA9IGkgLSAxOyBrID49IGo7IC0taykge1xuICAgICAgICAgICAgb3V0cHV0LnBvaW50KHgweltrXSwgeTB6W2tdKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgb3V0cHV0LmxpbmVFbmQoKTtcbiAgICAgICAgICBvdXRwdXQuYXJlYUVuZCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZGVmaW5lZDApIHtcbiAgICAgICAgeDB6W2ldID0gK3gwKGQsIGksIGRhdGEpLCB5MHpbaV0gPSAreTAoZCwgaSwgZGF0YSk7XG4gICAgICAgIG91dHB1dC5wb2ludCh4MSA/ICt4MShkLCBpLCBkYXRhKSA6IHgweltpXSwgeTEgPyAreTEoZCwgaSwgZGF0YSkgOiB5MHpbaV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChidWZmZXIpIHJldHVybiBvdXRwdXQgPSBudWxsLCBidWZmZXIgKyBcIlwiIHx8IG51bGw7XG4gIH1cblxuICBmdW5jdGlvbiBhcmVhbGluZSgpIHtcbiAgICByZXR1cm4gbGluZSgpLmRlZmluZWQoZGVmaW5lZCkuY3VydmUoY3VydmUpLmNvbnRleHQoY29udGV4dCk7XG4gIH1cblxuICBhcmVhLnggPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeDAgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgeDEgPSBudWxsLCBhcmVhKSA6IHgwO1xuICB9O1xuXG4gIGFyZWEueDAgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeDAgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgYXJlYSkgOiB4MDtcbiAgfTtcblxuICBhcmVhLngxID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHgxID0gXyA9PSBudWxsID8gbnVsbCA6IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCBhcmVhKSA6IHgxO1xuICB9O1xuXG4gIGFyZWEueSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh5MCA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCB5MSA9IG51bGwsIGFyZWEpIDogeTA7XG4gIH07XG5cbiAgYXJlYS55MCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh5MCA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCBhcmVhKSA6IHkwO1xuICB9O1xuXG4gIGFyZWEueTEgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeTEgPSBfID09IG51bGwgPyBudWxsIDogdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCgrXyksIGFyZWEpIDogeTE7XG4gIH07XG5cbiAgYXJlYS5saW5lWDAgPVxuICBhcmVhLmxpbmVZMCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBhcmVhbGluZSgpLngoeDApLnkoeTApO1xuICB9O1xuXG4gIGFyZWEubGluZVkxID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGFyZWFsaW5lKCkueCh4MCkueSh5MSk7XG4gIH07XG5cbiAgYXJlYS5saW5lWDEgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gYXJlYWxpbmUoKS54KHgxKS55KHkwKTtcbiAgfTtcblxuICBhcmVhLmRlZmluZWQgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZGVmaW5lZCA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoISFfKSwgYXJlYSkgOiBkZWZpbmVkO1xuICB9O1xuXG4gIGFyZWEuY3VydmUgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoY3VydmUgPSBfLCBjb250ZXh0ICE9IG51bGwgJiYgKG91dHB1dCA9IGN1cnZlKGNvbnRleHQpKSwgYXJlYSkgOiBjdXJ2ZTtcbiAgfTtcblxuICBhcmVhLmNvbnRleHQgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoXyA9PSBudWxsID8gY29udGV4dCA9IG91dHB1dCA9IG51bGwgOiBvdXRwdXQgPSBjdXJ2ZShjb250ZXh0ID0gXyksIGFyZWEpIDogY29udGV4dDtcbiAgfTtcblxuICByZXR1cm4gYXJlYTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGEsIGIpIHtcbiAgcmV0dXJuIGIgPCBhID8gLTEgOiBiID4gYSA/IDEgOiBiID49IGEgPyAwIDogTmFOO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZCkge1xuICByZXR1cm4gZDtcbn1cbiIsImltcG9ydCBhcnJheSBmcm9tIFwiLi9hcnJheS5qc1wiO1xuaW1wb3J0IGNvbnN0YW50IGZyb20gXCIuL2NvbnN0YW50LmpzXCI7XG5pbXBvcnQgZGVzY2VuZGluZyBmcm9tIFwiLi9kZXNjZW5kaW5nLmpzXCI7XG5pbXBvcnQgaWRlbnRpdHkgZnJvbSBcIi4vaWRlbnRpdHkuanNcIjtcbmltcG9ydCB7dGF1fSBmcm9tIFwiLi9tYXRoLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgdmFsdWUgPSBpZGVudGl0eSxcbiAgICAgIHNvcnRWYWx1ZXMgPSBkZXNjZW5kaW5nLFxuICAgICAgc29ydCA9IG51bGwsXG4gICAgICBzdGFydEFuZ2xlID0gY29uc3RhbnQoMCksXG4gICAgICBlbmRBbmdsZSA9IGNvbnN0YW50KHRhdSksXG4gICAgICBwYWRBbmdsZSA9IGNvbnN0YW50KDApO1xuXG4gIGZ1bmN0aW9uIHBpZShkYXRhKSB7XG4gICAgdmFyIGksXG4gICAgICAgIG4gPSAoZGF0YSA9IGFycmF5KGRhdGEpKS5sZW5ndGgsXG4gICAgICAgIGosXG4gICAgICAgIGssXG4gICAgICAgIHN1bSA9IDAsXG4gICAgICAgIGluZGV4ID0gbmV3IEFycmF5KG4pLFxuICAgICAgICBhcmNzID0gbmV3IEFycmF5KG4pLFxuICAgICAgICBhMCA9ICtzdGFydEFuZ2xlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksXG4gICAgICAgIGRhID0gTWF0aC5taW4odGF1LCBNYXRoLm1heCgtdGF1LCBlbmRBbmdsZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIC0gYTApKSxcbiAgICAgICAgYTEsXG4gICAgICAgIHAgPSBNYXRoLm1pbihNYXRoLmFicyhkYSkgLyBuLCBwYWRBbmdsZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSxcbiAgICAgICAgcGEgPSBwICogKGRhIDwgMCA/IC0xIDogMSksXG4gICAgICAgIHY7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAoKHYgPSBhcmNzW2luZGV4W2ldID0gaV0gPSArdmFsdWUoZGF0YVtpXSwgaSwgZGF0YSkpID4gMCkge1xuICAgICAgICBzdW0gKz0gdjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBPcHRpb25hbGx5IHNvcnQgdGhlIGFyY3MgYnkgcHJldmlvdXNseS1jb21wdXRlZCB2YWx1ZXMgb3IgYnkgZGF0YS5cbiAgICBpZiAoc29ydFZhbHVlcyAhPSBudWxsKSBpbmRleC5zb3J0KGZ1bmN0aW9uKGksIGopIHsgcmV0dXJuIHNvcnRWYWx1ZXMoYXJjc1tpXSwgYXJjc1tqXSk7IH0pO1xuICAgIGVsc2UgaWYgKHNvcnQgIT0gbnVsbCkgaW5kZXguc29ydChmdW5jdGlvbihpLCBqKSB7IHJldHVybiBzb3J0KGRhdGFbaV0sIGRhdGFbal0pOyB9KTtcblxuICAgIC8vIENvbXB1dGUgdGhlIGFyY3MhIFRoZXkgYXJlIHN0b3JlZCBpbiB0aGUgb3JpZ2luYWwgZGF0YSdzIG9yZGVyLlxuICAgIGZvciAoaSA9IDAsIGsgPSBzdW0gPyAoZGEgLSBuICogcGEpIC8gc3VtIDogMDsgaSA8IG47ICsraSwgYTAgPSBhMSkge1xuICAgICAgaiA9IGluZGV4W2ldLCB2ID0gYXJjc1tqXSwgYTEgPSBhMCArICh2ID4gMCA/IHYgKiBrIDogMCkgKyBwYSwgYXJjc1tqXSA9IHtcbiAgICAgICAgZGF0YTogZGF0YVtqXSxcbiAgICAgICAgaW5kZXg6IGksXG4gICAgICAgIHZhbHVlOiB2LFxuICAgICAgICBzdGFydEFuZ2xlOiBhMCxcbiAgICAgICAgZW5kQW5nbGU6IGExLFxuICAgICAgICBwYWRBbmdsZTogcFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXJjcztcbiAgfVxuXG4gIHBpZS52YWx1ZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh2YWx1ZSA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCBwaWUpIDogdmFsdWU7XG4gIH07XG5cbiAgcGllLnNvcnRWYWx1ZXMgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc29ydFZhbHVlcyA9IF8sIHNvcnQgPSBudWxsLCBwaWUpIDogc29ydFZhbHVlcztcbiAgfTtcblxuICBwaWUuc29ydCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzb3J0ID0gXywgc29ydFZhbHVlcyA9IG51bGwsIHBpZSkgOiBzb3J0O1xuICB9O1xuXG4gIHBpZS5zdGFydEFuZ2xlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHN0YXJ0QW5nbGUgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgcGllKSA6IHN0YXJ0QW5nbGU7XG4gIH07XG5cbiAgcGllLmVuZEFuZ2xlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGVuZEFuZ2xlID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCgrXyksIHBpZSkgOiBlbmRBbmdsZTtcbiAgfTtcblxuICBwaWUucGFkQW5nbGUgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocGFkQW5nbGUgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgcGllKSA6IHBhZEFuZ2xlO1xuICB9O1xuXG4gIHJldHVybiBwaWU7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZXJpZXMsIG9yZGVyKSB7XG4gIGlmICghKChuID0gc2VyaWVzLmxlbmd0aCkgPiAxKSkgcmV0dXJuO1xuICBmb3IgKHZhciBpID0gMSwgaiwgczAsIHMxID0gc2VyaWVzW29yZGVyWzBdXSwgbiwgbSA9IHMxLmxlbmd0aDsgaSA8IG47ICsraSkge1xuICAgIHMwID0gczEsIHMxID0gc2VyaWVzW29yZGVyW2ldXTtcbiAgICBmb3IgKGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgICBzMVtqXVsxXSArPSBzMVtqXVswXSA9IGlzTmFOKHMwW2pdWzFdKSA/IHMwW2pdWzBdIDogczBbal1bMV07XG4gICAgfVxuICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZXJpZXMpIHtcbiAgdmFyIG4gPSBzZXJpZXMubGVuZ3RoLCBvID0gbmV3IEFycmF5KG4pO1xuICB3aGlsZSAoLS1uID49IDApIG9bbl0gPSBuO1xuICByZXR1cm4gbztcbn1cbiIsImltcG9ydCBhcnJheSBmcm9tIFwiLi9hcnJheS5qc1wiO1xuaW1wb3J0IGNvbnN0YW50IGZyb20gXCIuL2NvbnN0YW50LmpzXCI7XG5pbXBvcnQgb2Zmc2V0Tm9uZSBmcm9tIFwiLi9vZmZzZXQvbm9uZS5qc1wiO1xuaW1wb3J0IG9yZGVyTm9uZSBmcm9tIFwiLi9vcmRlci9ub25lLmpzXCI7XG5cbmZ1bmN0aW9uIHN0YWNrVmFsdWUoZCwga2V5KSB7XG4gIHJldHVybiBkW2tleV07XG59XG5cbmZ1bmN0aW9uIHN0YWNrU2VyaWVzKGtleSkge1xuICBjb25zdCBzZXJpZXMgPSBbXTtcbiAgc2VyaWVzLmtleSA9IGtleTtcbiAgcmV0dXJuIHNlcmllcztcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciBrZXlzID0gY29uc3RhbnQoW10pLFxuICAgICAgb3JkZXIgPSBvcmRlck5vbmUsXG4gICAgICBvZmZzZXQgPSBvZmZzZXROb25lLFxuICAgICAgdmFsdWUgPSBzdGFja1ZhbHVlO1xuXG4gIGZ1bmN0aW9uIHN0YWNrKGRhdGEpIHtcbiAgICB2YXIgc3ogPSBBcnJheS5mcm9tKGtleXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSwgc3RhY2tTZXJpZXMpLFxuICAgICAgICBpLCBuID0gc3oubGVuZ3RoLCBqID0gLTEsXG4gICAgICAgIG96O1xuXG4gICAgZm9yIChjb25zdCBkIG9mIGRhdGEpIHtcbiAgICAgIGZvciAoaSA9IDAsICsrajsgaSA8IG47ICsraSkge1xuICAgICAgICAoc3pbaV1bal0gPSBbMCwgK3ZhbHVlKGQsIHN6W2ldLmtleSwgaiwgZGF0YSldKS5kYXRhID0gZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGkgPSAwLCBveiA9IGFycmF5KG9yZGVyKHN6KSk7IGkgPCBuOyArK2kpIHtcbiAgICAgIHN6W296W2ldXS5pbmRleCA9IGk7XG4gICAgfVxuXG4gICAgb2Zmc2V0KHN6LCBveik7XG4gICAgcmV0dXJuIHN6O1xuICB9XG5cbiAgc3RhY2sua2V5cyA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChrZXlzID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudChBcnJheS5mcm9tKF8pKSwgc3RhY2spIDoga2V5cztcbiAgfTtcblxuICBzdGFjay52YWx1ZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh2YWx1ZSA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCBzdGFjaykgOiB2YWx1ZTtcbiAgfTtcblxuICBzdGFjay5vcmRlciA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChvcmRlciA9IF8gPT0gbnVsbCA/IG9yZGVyTm9uZSA6IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoQXJyYXkuZnJvbShfKSksIHN0YWNrKSA6IG9yZGVyO1xuICB9O1xuXG4gIHN0YWNrLm9mZnNldCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChvZmZzZXQgPSBfID09IG51bGwgPyBvZmZzZXROb25lIDogXywgc3RhY2spIDogb2Zmc2V0O1xuICB9O1xuXG4gIHJldHVybiBzdGFjaztcbn1cbiIsImV4cG9ydCB7ZGVmYXVsdCBhcyBhcmN9IGZyb20gXCIuL2FyYy5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGFyZWF9IGZyb20gXCIuL2FyZWEuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBsaW5lfSBmcm9tIFwiLi9saW5lLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgcGllfSBmcm9tIFwiLi9waWUuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBhcmVhUmFkaWFsLCBkZWZhdWx0IGFzIHJhZGlhbEFyZWF9IGZyb20gXCIuL2FyZWFSYWRpYWwuanNcIjsgLy8gTm90ZTogcmFkaWFsQXJlYSBpcyBkZXByZWNhdGVkIVxuZXhwb3J0IHtkZWZhdWx0IGFzIGxpbmVSYWRpYWwsIGRlZmF1bHQgYXMgcmFkaWFsTGluZX0gZnJvbSBcIi4vbGluZVJhZGlhbC5qc1wiOyAvLyBOb3RlOiByYWRpYWxMaW5lIGlzIGRlcHJlY2F0ZWQhXG5leHBvcnQge2RlZmF1bHQgYXMgcG9pbnRSYWRpYWx9IGZyb20gXCIuL3BvaW50UmFkaWFsLmpzXCI7XG5leHBvcnQge2xpbmssIGxpbmtIb3Jpem9udGFsLCBsaW5rVmVydGljYWwsIGxpbmtSYWRpYWx9IGZyb20gXCIuL2xpbmsuanNcIjtcblxuZXhwb3J0IHtkZWZhdWx0IGFzIHN5bWJvbCwgc3ltYm9sc1N0cm9rZSwgc3ltYm9sc0ZpbGwsIHN5bWJvbHNGaWxsIGFzIHN5bWJvbHN9IGZyb20gXCIuL3N5bWJvbC5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHN5bWJvbEFzdGVyaXNrfSBmcm9tIFwiLi9zeW1ib2wvYXN0ZXJpc2suanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBzeW1ib2xDaXJjbGV9IGZyb20gXCIuL3N5bWJvbC9jaXJjbGUuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBzeW1ib2xDcm9zc30gZnJvbSBcIi4vc3ltYm9sL2Nyb3NzLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgc3ltYm9sRGlhbW9uZH0gZnJvbSBcIi4vc3ltYm9sL2RpYW1vbmQuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBzeW1ib2xEaWFtb25kMn0gZnJvbSBcIi4vc3ltYm9sL2RpYW1vbmQyLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgc3ltYm9sUGx1c30gZnJvbSBcIi4vc3ltYm9sL3BsdXMuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBzeW1ib2xTcXVhcmV9IGZyb20gXCIuL3N5bWJvbC9zcXVhcmUuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBzeW1ib2xTcXVhcmUyfSBmcm9tIFwiLi9zeW1ib2wvc3F1YXJlMi5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHN5bWJvbFN0YXJ9IGZyb20gXCIuL3N5bWJvbC9zdGFyLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgc3ltYm9sVHJpYW5nbGV9IGZyb20gXCIuL3N5bWJvbC90cmlhbmdsZS5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHN5bWJvbFRyaWFuZ2xlMn0gZnJvbSBcIi4vc3ltYm9sL3RyaWFuZ2xlMi5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHN5bWJvbFd5ZX0gZnJvbSBcIi4vc3ltYm9sL3d5ZS5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHN5bWJvbFRpbWVzLCBkZWZhdWx0IGFzIHN5bWJvbFh9IGZyb20gXCIuL3N5bWJvbC90aW1lcy5qc1wiO1xuXG5leHBvcnQge2RlZmF1bHQgYXMgY3VydmVCYXNpc0Nsb3NlZH0gZnJvbSBcIi4vY3VydmUvYmFzaXNDbG9zZWQuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBjdXJ2ZUJhc2lzT3Blbn0gZnJvbSBcIi4vY3VydmUvYmFzaXNPcGVuLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgY3VydmVCYXNpc30gZnJvbSBcIi4vY3VydmUvYmFzaXMuanNcIjtcbmV4cG9ydCB7YnVtcFggYXMgY3VydmVCdW1wWCwgYnVtcFkgYXMgY3VydmVCdW1wWX0gZnJvbSBcIi4vY3VydmUvYnVtcC5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGN1cnZlQnVuZGxlfSBmcm9tIFwiLi9jdXJ2ZS9idW5kbGUuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBjdXJ2ZUNhcmRpbmFsQ2xvc2VkfSBmcm9tIFwiLi9jdXJ2ZS9jYXJkaW5hbENsb3NlZC5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGN1cnZlQ2FyZGluYWxPcGVufSBmcm9tIFwiLi9jdXJ2ZS9jYXJkaW5hbE9wZW4uanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBjdXJ2ZUNhcmRpbmFsfSBmcm9tIFwiLi9jdXJ2ZS9jYXJkaW5hbC5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGN1cnZlQ2F0bXVsbFJvbUNsb3NlZH0gZnJvbSBcIi4vY3VydmUvY2F0bXVsbFJvbUNsb3NlZC5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGN1cnZlQ2F0bXVsbFJvbU9wZW59IGZyb20gXCIuL2N1cnZlL2NhdG11bGxSb21PcGVuLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgY3VydmVDYXRtdWxsUm9tfSBmcm9tIFwiLi9jdXJ2ZS9jYXRtdWxsUm9tLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgY3VydmVMaW5lYXJDbG9zZWR9IGZyb20gXCIuL2N1cnZlL2xpbmVhckNsb3NlZC5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGN1cnZlTGluZWFyfSBmcm9tIFwiLi9jdXJ2ZS9saW5lYXIuanNcIjtcbmV4cG9ydCB7bW9ub3RvbmVYIGFzIGN1cnZlTW9ub3RvbmVYLCBtb25vdG9uZVkgYXMgY3VydmVNb25vdG9uZVl9IGZyb20gXCIuL2N1cnZlL21vbm90b25lLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgY3VydmVOYXR1cmFsfSBmcm9tIFwiLi9jdXJ2ZS9uYXR1cmFsLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgY3VydmVTdGVwLCBzdGVwQWZ0ZXIgYXMgY3VydmVTdGVwQWZ0ZXIsIHN0ZXBCZWZvcmUgYXMgY3VydmVTdGVwQmVmb3JlfSBmcm9tIFwiLi9jdXJ2ZS9zdGVwLmpzXCI7XG5cbmV4cG9ydCB7ZGVmYXVsdCBhcyBzdGFja30gZnJvbSBcIi4vc3RhY2suanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBzdGFja09mZnNldEV4cGFuZH0gZnJvbSBcIi4vb2Zmc2V0L2V4cGFuZC5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHN0YWNrT2Zmc2V0RGl2ZXJnaW5nfSBmcm9tIFwiLi9vZmZzZXQvZGl2ZXJnaW5nLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgc3RhY2tPZmZzZXROb25lfSBmcm9tIFwiLi9vZmZzZXQvbm9uZS5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHN0YWNrT2Zmc2V0U2lsaG91ZXR0ZX0gZnJvbSBcIi4vb2Zmc2V0L3NpbGhvdWV0dGUuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBzdGFja09mZnNldFdpZ2dsZX0gZnJvbSBcIi4vb2Zmc2V0L3dpZ2dsZS5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHN0YWNrT3JkZXJBcHBlYXJhbmNlfSBmcm9tIFwiLi9vcmRlci9hcHBlYXJhbmNlLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgc3RhY2tPcmRlckFzY2VuZGluZ30gZnJvbSBcIi4vb3JkZXIvYXNjZW5kaW5nLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgc3RhY2tPcmRlckRlc2NlbmRpbmd9IGZyb20gXCIuL29yZGVyL2Rlc2NlbmRpbmcuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBzdGFja09yZGVySW5zaWRlT3V0fSBmcm9tIFwiLi9vcmRlci9pbnNpZGVPdXQuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBzdGFja09yZGVyTm9uZX0gZnJvbSBcIi4vb3JkZXIvbm9uZS5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHN0YWNrT3JkZXJSZXZlcnNlfSBmcm9tIFwiLi9vcmRlci9yZXZlcnNlLmpzXCI7XG4iLCJleHBvcnQge2RlZmF1bHQgYXMgdGltZUZvcm1hdERlZmF1bHRMb2NhbGUsIHRpbWVGb3JtYXQsIHRpbWVQYXJzZSwgdXRjRm9ybWF0LCB1dGNQYXJzZX0gZnJvbSBcIi4vZGVmYXVsdExvY2FsZS5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHRpbWVGb3JtYXRMb2NhbGV9IGZyb20gXCIuL2xvY2FsZS5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGlzb0Zvcm1hdH0gZnJvbSBcIi4vaXNvRm9ybWF0LmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgaXNvUGFyc2V9IGZyb20gXCIuL2lzb1BhcnNlLmpzXCI7XG4iLCJleHBvcnQgZnVuY3Rpb24gVHJhbnNmb3JtKGssIHgsIHkpIHtcbiAgdGhpcy5rID0gaztcbiAgdGhpcy54ID0geDtcbiAgdGhpcy55ID0geTtcbn1cblxuVHJhbnNmb3JtLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IFRyYW5zZm9ybSxcbiAgc2NhbGU6IGZ1bmN0aW9uKGspIHtcbiAgICByZXR1cm4gayA9PT0gMSA/IHRoaXMgOiBuZXcgVHJhbnNmb3JtKHRoaXMuayAqIGssIHRoaXMueCwgdGhpcy55KTtcbiAgfSxcbiAgdHJhbnNsYXRlOiBmdW5jdGlvbih4LCB5KSB7XG4gICAgcmV0dXJuIHggPT09IDAgJiB5ID09PSAwID8gdGhpcyA6IG5ldyBUcmFuc2Zvcm0odGhpcy5rLCB0aGlzLnggKyB0aGlzLmsgKiB4LCB0aGlzLnkgKyB0aGlzLmsgKiB5KTtcbiAgfSxcbiAgYXBwbHk6IGZ1bmN0aW9uKHBvaW50KSB7XG4gICAgcmV0dXJuIFtwb2ludFswXSAqIHRoaXMuayArIHRoaXMueCwgcG9pbnRbMV0gKiB0aGlzLmsgKyB0aGlzLnldO1xuICB9LFxuICBhcHBseVg6IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4geCAqIHRoaXMuayArIHRoaXMueDtcbiAgfSxcbiAgYXBwbHlZOiBmdW5jdGlvbih5KSB7XG4gICAgcmV0dXJuIHkgKiB0aGlzLmsgKyB0aGlzLnk7XG4gIH0sXG4gIGludmVydDogZnVuY3Rpb24obG9jYXRpb24pIHtcbiAgICByZXR1cm4gWyhsb2NhdGlvblswXSAtIHRoaXMueCkgLyB0aGlzLmssIChsb2NhdGlvblsxXSAtIHRoaXMueSkgLyB0aGlzLmtdO1xuICB9LFxuICBpbnZlcnRYOiBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuICh4IC0gdGhpcy54KSAvIHRoaXMuaztcbiAgfSxcbiAgaW52ZXJ0WTogZnVuY3Rpb24oeSkge1xuICAgIHJldHVybiAoeSAtIHRoaXMueSkgLyB0aGlzLms7XG4gIH0sXG4gIHJlc2NhbGVYOiBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIHguY29weSgpLmRvbWFpbih4LnJhbmdlKCkubWFwKHRoaXMuaW52ZXJ0WCwgdGhpcykubWFwKHguaW52ZXJ0LCB4KSk7XG4gIH0sXG4gIHJlc2NhbGVZOiBmdW5jdGlvbih5KSB7XG4gICAgcmV0dXJuIHkuY29weSgpLmRvbWFpbih5LnJhbmdlKCkubWFwKHRoaXMuaW52ZXJ0WSwgdGhpcykubWFwKHkuaW52ZXJ0LCB5KSk7XG4gIH0sXG4gIHRvU3RyaW5nOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gXCJ0cmFuc2xhdGUoXCIgKyB0aGlzLnggKyBcIixcIiArIHRoaXMueSArIFwiKSBzY2FsZShcIiArIHRoaXMuayArIFwiKVwiO1xuICB9XG59O1xuXG5leHBvcnQgdmFyIGlkZW50aXR5ID0gbmV3IFRyYW5zZm9ybSgxLCAwLCAwKTtcblxudHJhbnNmb3JtLnByb3RvdHlwZSA9IFRyYW5zZm9ybS5wcm90b3R5cGU7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRyYW5zZm9ybShub2RlKSB7XG4gIHdoaWxlICghbm9kZS5fX3pvb20pIGlmICghKG5vZGUgPSBub2RlLnBhcmVudE5vZGUpKSByZXR1cm4gaWRlbnRpdHk7XG4gIHJldHVybiBub2RlLl9fem9vbTtcbn1cbiIsImltcG9ydCB7ZGlzcGF0Y2h9IGZyb20gXCJkMy1kaXNwYXRjaFwiO1xuaW1wb3J0IHtkcmFnRGlzYWJsZSwgZHJhZ0VuYWJsZX0gZnJvbSBcImQzLWRyYWdcIjtcbmltcG9ydCB7aW50ZXJwb2xhdGVab29tfSBmcm9tIFwiZDMtaW50ZXJwb2xhdGVcIjtcbmltcG9ydCB7c2VsZWN0LCBwb2ludGVyfSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQge2ludGVycnVwdH0gZnJvbSBcImQzLXRyYW5zaXRpb25cIjtcbmltcG9ydCBjb25zdGFudCBmcm9tIFwiLi9jb25zdGFudC5qc1wiO1xuaW1wb3J0IFpvb21FdmVudCBmcm9tIFwiLi9ldmVudC5qc1wiO1xuaW1wb3J0IHtUcmFuc2Zvcm0sIGlkZW50aXR5fSBmcm9tIFwiLi90cmFuc2Zvcm0uanNcIjtcbmltcG9ydCBub2V2ZW50LCB7bm9wcm9wYWdhdGlvbn0gZnJvbSBcIi4vbm9ldmVudC5qc1wiO1xuXG4vLyBJZ25vcmUgcmlnaHQtY2xpY2ssIHNpbmNlIHRoYXQgc2hvdWxkIG9wZW4gdGhlIGNvbnRleHQgbWVudS5cbi8vIGV4Y2VwdCBmb3IgcGluY2gtdG8tem9vbSwgd2hpY2ggaXMgc2VudCBhcyBhIHdoZWVsK2N0cmxLZXkgZXZlbnRcbmZ1bmN0aW9uIGRlZmF1bHRGaWx0ZXIoZXZlbnQpIHtcbiAgcmV0dXJuICghZXZlbnQuY3RybEtleSB8fCBldmVudC50eXBlID09PSAnd2hlZWwnKSAmJiAhZXZlbnQuYnV0dG9uO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0RXh0ZW50KCkge1xuICB2YXIgZSA9IHRoaXM7XG4gIGlmIChlIGluc3RhbmNlb2YgU1ZHRWxlbWVudCkge1xuICAgIGUgPSBlLm93bmVyU1ZHRWxlbWVudCB8fCBlO1xuICAgIGlmIChlLmhhc0F0dHJpYnV0ZShcInZpZXdCb3hcIikpIHtcbiAgICAgIGUgPSBlLnZpZXdCb3guYmFzZVZhbDtcbiAgICAgIHJldHVybiBbW2UueCwgZS55XSwgW2UueCArIGUud2lkdGgsIGUueSArIGUuaGVpZ2h0XV07XG4gICAgfVxuICAgIHJldHVybiBbWzAsIDBdLCBbZS53aWR0aC5iYXNlVmFsLnZhbHVlLCBlLmhlaWdodC5iYXNlVmFsLnZhbHVlXV07XG4gIH1cbiAgcmV0dXJuIFtbMCwgMF0sIFtlLmNsaWVudFdpZHRoLCBlLmNsaWVudEhlaWdodF1dO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0VHJhbnNmb3JtKCkge1xuICByZXR1cm4gdGhpcy5fX3pvb20gfHwgaWRlbnRpdHk7XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRXaGVlbERlbHRhKGV2ZW50KSB7XG4gIHJldHVybiAtZXZlbnQuZGVsdGFZICogKGV2ZW50LmRlbHRhTW9kZSA9PT0gMSA/IDAuMDUgOiBldmVudC5kZWx0YU1vZGUgPyAxIDogMC4wMDIpICogKGV2ZW50LmN0cmxLZXkgPyAxMCA6IDEpO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0VG91Y2hhYmxlKCkge1xuICByZXR1cm4gbmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzIHx8IChcIm9udG91Y2hzdGFydFwiIGluIHRoaXMpO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0Q29uc3RyYWluKHRyYW5zZm9ybSwgZXh0ZW50LCB0cmFuc2xhdGVFeHRlbnQpIHtcbiAgdmFyIGR4MCA9IHRyYW5zZm9ybS5pbnZlcnRYKGV4dGVudFswXVswXSkgLSB0cmFuc2xhdGVFeHRlbnRbMF1bMF0sXG4gICAgICBkeDEgPSB0cmFuc2Zvcm0uaW52ZXJ0WChleHRlbnRbMV1bMF0pIC0gdHJhbnNsYXRlRXh0ZW50WzFdWzBdLFxuICAgICAgZHkwID0gdHJhbnNmb3JtLmludmVydFkoZXh0ZW50WzBdWzFdKSAtIHRyYW5zbGF0ZUV4dGVudFswXVsxXSxcbiAgICAgIGR5MSA9IHRyYW5zZm9ybS5pbnZlcnRZKGV4dGVudFsxXVsxXSkgLSB0cmFuc2xhdGVFeHRlbnRbMV1bMV07XG4gIHJldHVybiB0cmFuc2Zvcm0udHJhbnNsYXRlKFxuICAgIGR4MSA+IGR4MCA/IChkeDAgKyBkeDEpIC8gMiA6IE1hdGgubWluKDAsIGR4MCkgfHwgTWF0aC5tYXgoMCwgZHgxKSxcbiAgICBkeTEgPiBkeTAgPyAoZHkwICsgZHkxKSAvIDIgOiBNYXRoLm1pbigwLCBkeTApIHx8IE1hdGgubWF4KDAsIGR5MSlcbiAgKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciBmaWx0ZXIgPSBkZWZhdWx0RmlsdGVyLFxuICAgICAgZXh0ZW50ID0gZGVmYXVsdEV4dGVudCxcbiAgICAgIGNvbnN0cmFpbiA9IGRlZmF1bHRDb25zdHJhaW4sXG4gICAgICB3aGVlbERlbHRhID0gZGVmYXVsdFdoZWVsRGVsdGEsXG4gICAgICB0b3VjaGFibGUgPSBkZWZhdWx0VG91Y2hhYmxlLFxuICAgICAgc2NhbGVFeHRlbnQgPSBbMCwgSW5maW5pdHldLFxuICAgICAgdHJhbnNsYXRlRXh0ZW50ID0gW1stSW5maW5pdHksIC1JbmZpbml0eV0sIFtJbmZpbml0eSwgSW5maW5pdHldXSxcbiAgICAgIGR1cmF0aW9uID0gMjUwLFxuICAgICAgaW50ZXJwb2xhdGUgPSBpbnRlcnBvbGF0ZVpvb20sXG4gICAgICBsaXN0ZW5lcnMgPSBkaXNwYXRjaChcInN0YXJ0XCIsIFwiem9vbVwiLCBcImVuZFwiKSxcbiAgICAgIHRvdWNoc3RhcnRpbmcsXG4gICAgICB0b3VjaGZpcnN0LFxuICAgICAgdG91Y2hlbmRpbmcsXG4gICAgICB0b3VjaERlbGF5ID0gNTAwLFxuICAgICAgd2hlZWxEZWxheSA9IDE1MCxcbiAgICAgIGNsaWNrRGlzdGFuY2UyID0gMCxcbiAgICAgIHRhcERpc3RhbmNlID0gMTA7XG5cbiAgZnVuY3Rpb24gem9vbShzZWxlY3Rpb24pIHtcbiAgICBzZWxlY3Rpb25cbiAgICAgICAgLnByb3BlcnR5KFwiX196b29tXCIsIGRlZmF1bHRUcmFuc2Zvcm0pXG4gICAgICAgIC5vbihcIndoZWVsLnpvb21cIiwgd2hlZWxlZCwge3Bhc3NpdmU6IGZhbHNlfSlcbiAgICAgICAgLm9uKFwibW91c2Vkb3duLnpvb21cIiwgbW91c2Vkb3duZWQpXG4gICAgICAgIC5vbihcImRibGNsaWNrLnpvb21cIiwgZGJsY2xpY2tlZClcbiAgICAgIC5maWx0ZXIodG91Y2hhYmxlKVxuICAgICAgICAub24oXCJ0b3VjaHN0YXJ0Lnpvb21cIiwgdG91Y2hzdGFydGVkKVxuICAgICAgICAub24oXCJ0b3VjaG1vdmUuem9vbVwiLCB0b3VjaG1vdmVkKVxuICAgICAgICAub24oXCJ0b3VjaGVuZC56b29tIHRvdWNoY2FuY2VsLnpvb21cIiwgdG91Y2hlbmRlZClcbiAgICAgICAgLnN0eWxlKFwiLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yXCIsIFwicmdiYSgwLDAsMCwwKVwiKTtcbiAgfVxuXG4gIHpvb20udHJhbnNmb3JtID0gZnVuY3Rpb24oY29sbGVjdGlvbiwgdHJhbnNmb3JtLCBwb2ludCwgZXZlbnQpIHtcbiAgICB2YXIgc2VsZWN0aW9uID0gY29sbGVjdGlvbi5zZWxlY3Rpb24gPyBjb2xsZWN0aW9uLnNlbGVjdGlvbigpIDogY29sbGVjdGlvbjtcbiAgICBzZWxlY3Rpb24ucHJvcGVydHkoXCJfX3pvb21cIiwgZGVmYXVsdFRyYW5zZm9ybSk7XG4gICAgaWYgKGNvbGxlY3Rpb24gIT09IHNlbGVjdGlvbikge1xuICAgICAgc2NoZWR1bGUoY29sbGVjdGlvbiwgdHJhbnNmb3JtLCBwb2ludCwgZXZlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZWxlY3Rpb24uaW50ZXJydXB0KCkuZWFjaChmdW5jdGlvbigpIHtcbiAgICAgICAgZ2VzdHVyZSh0aGlzLCBhcmd1bWVudHMpXG4gICAgICAgICAgLmV2ZW50KGV2ZW50KVxuICAgICAgICAgIC5zdGFydCgpXG4gICAgICAgICAgLnpvb20obnVsbCwgdHlwZW9mIHRyYW5zZm9ybSA9PT0gXCJmdW5jdGlvblwiID8gdHJhbnNmb3JtLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiB0cmFuc2Zvcm0pXG4gICAgICAgICAgLmVuZCgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIHpvb20uc2NhbGVCeSA9IGZ1bmN0aW9uKHNlbGVjdGlvbiwgaywgcCwgZXZlbnQpIHtcbiAgICB6b29tLnNjYWxlVG8oc2VsZWN0aW9uLCBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBrMCA9IHRoaXMuX196b29tLmssXG4gICAgICAgICAgazEgPSB0eXBlb2YgayA9PT0gXCJmdW5jdGlvblwiID8gay5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogaztcbiAgICAgIHJldHVybiBrMCAqIGsxO1xuICAgIH0sIHAsIGV2ZW50KTtcbiAgfTtcblxuICB6b29tLnNjYWxlVG8gPSBmdW5jdGlvbihzZWxlY3Rpb24sIGssIHAsIGV2ZW50KSB7XG4gICAgem9vbS50cmFuc2Zvcm0oc2VsZWN0aW9uLCBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBlID0gZXh0ZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksXG4gICAgICAgICAgdDAgPSB0aGlzLl9fem9vbSxcbiAgICAgICAgICBwMCA9IHAgPT0gbnVsbCA/IGNlbnRyb2lkKGUpIDogdHlwZW9mIHAgPT09IFwiZnVuY3Rpb25cIiA/IHAuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IHAsXG4gICAgICAgICAgcDEgPSB0MC5pbnZlcnQocDApLFxuICAgICAgICAgIGsxID0gdHlwZW9mIGsgPT09IFwiZnVuY3Rpb25cIiA/IGsuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IGs7XG4gICAgICByZXR1cm4gY29uc3RyYWluKHRyYW5zbGF0ZShzY2FsZSh0MCwgazEpLCBwMCwgcDEpLCBlLCB0cmFuc2xhdGVFeHRlbnQpO1xuICAgIH0sIHAsIGV2ZW50KTtcbiAgfTtcblxuICB6b29tLnRyYW5zbGF0ZUJ5ID0gZnVuY3Rpb24oc2VsZWN0aW9uLCB4LCB5LCBldmVudCkge1xuICAgIHpvb20udHJhbnNmb3JtKHNlbGVjdGlvbiwgZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gY29uc3RyYWluKHRoaXMuX196b29tLnRyYW5zbGF0ZShcbiAgICAgICAgdHlwZW9mIHggPT09IFwiZnVuY3Rpb25cIiA/IHguYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IHgsXG4gICAgICAgIHR5cGVvZiB5ID09PSBcImZ1bmN0aW9uXCIgPyB5LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiB5XG4gICAgICApLCBleHRlbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSwgdHJhbnNsYXRlRXh0ZW50KTtcbiAgICB9LCBudWxsLCBldmVudCk7XG4gIH07XG5cbiAgem9vbS50cmFuc2xhdGVUbyA9IGZ1bmN0aW9uKHNlbGVjdGlvbiwgeCwgeSwgcCwgZXZlbnQpIHtcbiAgICB6b29tLnRyYW5zZm9ybShzZWxlY3Rpb24sIGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGUgPSBleHRlbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSxcbiAgICAgICAgICB0ID0gdGhpcy5fX3pvb20sXG4gICAgICAgICAgcDAgPSBwID09IG51bGwgPyBjZW50cm9pZChlKSA6IHR5cGVvZiBwID09PSBcImZ1bmN0aW9uXCIgPyBwLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBwO1xuICAgICAgcmV0dXJuIGNvbnN0cmFpbihpZGVudGl0eS50cmFuc2xhdGUocDBbMF0sIHAwWzFdKS5zY2FsZSh0LmspLnRyYW5zbGF0ZShcbiAgICAgICAgdHlwZW9mIHggPT09IFwiZnVuY3Rpb25cIiA/IC14LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiAteCxcbiAgICAgICAgdHlwZW9mIHkgPT09IFwiZnVuY3Rpb25cIiA/IC15LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiAteVxuICAgICAgKSwgZSwgdHJhbnNsYXRlRXh0ZW50KTtcbiAgICB9LCBwLCBldmVudCk7XG4gIH07XG5cbiAgZnVuY3Rpb24gc2NhbGUodHJhbnNmb3JtLCBrKSB7XG4gICAgayA9IE1hdGgubWF4KHNjYWxlRXh0ZW50WzBdLCBNYXRoLm1pbihzY2FsZUV4dGVudFsxXSwgaykpO1xuICAgIHJldHVybiBrID09PSB0cmFuc2Zvcm0uayA/IHRyYW5zZm9ybSA6IG5ldyBUcmFuc2Zvcm0oaywgdHJhbnNmb3JtLngsIHRyYW5zZm9ybS55KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRyYW5zbGF0ZSh0cmFuc2Zvcm0sIHAwLCBwMSkge1xuICAgIHZhciB4ID0gcDBbMF0gLSBwMVswXSAqIHRyYW5zZm9ybS5rLCB5ID0gcDBbMV0gLSBwMVsxXSAqIHRyYW5zZm9ybS5rO1xuICAgIHJldHVybiB4ID09PSB0cmFuc2Zvcm0ueCAmJiB5ID09PSB0cmFuc2Zvcm0ueSA/IHRyYW5zZm9ybSA6IG5ldyBUcmFuc2Zvcm0odHJhbnNmb3JtLmssIHgsIHkpO1xuICB9XG5cbiAgZnVuY3Rpb24gY2VudHJvaWQoZXh0ZW50KSB7XG4gICAgcmV0dXJuIFsoK2V4dGVudFswXVswXSArICtleHRlbnRbMV1bMF0pIC8gMiwgKCtleHRlbnRbMF1bMV0gKyArZXh0ZW50WzFdWzFdKSAvIDJdO1xuICB9XG5cbiAgZnVuY3Rpb24gc2NoZWR1bGUodHJhbnNpdGlvbiwgdHJhbnNmb3JtLCBwb2ludCwgZXZlbnQpIHtcbiAgICB0cmFuc2l0aW9uXG4gICAgICAgIC5vbihcInN0YXJ0Lnpvb21cIiwgZnVuY3Rpb24oKSB7IGdlc3R1cmUodGhpcywgYXJndW1lbnRzKS5ldmVudChldmVudCkuc3RhcnQoKTsgfSlcbiAgICAgICAgLm9uKFwiaW50ZXJydXB0Lnpvb20gZW5kLnpvb21cIiwgZnVuY3Rpb24oKSB7IGdlc3R1cmUodGhpcywgYXJndW1lbnRzKS5ldmVudChldmVudCkuZW5kKCk7IH0pXG4gICAgICAgIC50d2VlbihcInpvb21cIiwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLFxuICAgICAgICAgICAgICBhcmdzID0gYXJndW1lbnRzLFxuICAgICAgICAgICAgICBnID0gZ2VzdHVyZSh0aGF0LCBhcmdzKS5ldmVudChldmVudCksXG4gICAgICAgICAgICAgIGUgPSBleHRlbnQuYXBwbHkodGhhdCwgYXJncyksXG4gICAgICAgICAgICAgIHAgPSBwb2ludCA9PSBudWxsID8gY2VudHJvaWQoZSkgOiB0eXBlb2YgcG9pbnQgPT09IFwiZnVuY3Rpb25cIiA/IHBvaW50LmFwcGx5KHRoYXQsIGFyZ3MpIDogcG9pbnQsXG4gICAgICAgICAgICAgIHcgPSBNYXRoLm1heChlWzFdWzBdIC0gZVswXVswXSwgZVsxXVsxXSAtIGVbMF1bMV0pLFxuICAgICAgICAgICAgICBhID0gdGhhdC5fX3pvb20sXG4gICAgICAgICAgICAgIGIgPSB0eXBlb2YgdHJhbnNmb3JtID09PSBcImZ1bmN0aW9uXCIgPyB0cmFuc2Zvcm0uYXBwbHkodGhhdCwgYXJncykgOiB0cmFuc2Zvcm0sXG4gICAgICAgICAgICAgIGkgPSBpbnRlcnBvbGF0ZShhLmludmVydChwKS5jb25jYXQodyAvIGEuayksIGIuaW52ZXJ0KHApLmNvbmNhdCh3IC8gYi5rKSk7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIGlmICh0ID09PSAxKSB0ID0gYjsgLy8gQXZvaWQgcm91bmRpbmcgZXJyb3Igb24gZW5kLlxuICAgICAgICAgICAgZWxzZSB7IHZhciBsID0gaSh0KSwgayA9IHcgLyBsWzJdOyB0ID0gbmV3IFRyYW5zZm9ybShrLCBwWzBdIC0gbFswXSAqIGssIHBbMV0gLSBsWzFdICogayk7IH1cbiAgICAgICAgICAgIGcuem9vbShudWxsLCB0KTtcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdlc3R1cmUodGhhdCwgYXJncywgY2xlYW4pIHtcbiAgICByZXR1cm4gKCFjbGVhbiAmJiB0aGF0Ll9fem9vbWluZykgfHwgbmV3IEdlc3R1cmUodGhhdCwgYXJncyk7XG4gIH1cblxuICBmdW5jdGlvbiBHZXN0dXJlKHRoYXQsIGFyZ3MpIHtcbiAgICB0aGlzLnRoYXQgPSB0aGF0O1xuICAgIHRoaXMuYXJncyA9IGFyZ3M7XG4gICAgdGhpcy5hY3RpdmUgPSAwO1xuICAgIHRoaXMuc291cmNlRXZlbnQgPSBudWxsO1xuICAgIHRoaXMuZXh0ZW50ID0gZXh0ZW50LmFwcGx5KHRoYXQsIGFyZ3MpO1xuICAgIHRoaXMudGFwcyA9IDA7XG4gIH1cblxuICBHZXN0dXJlLnByb3RvdHlwZSA9IHtcbiAgICBldmVudDogZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgIGlmIChldmVudCkgdGhpcy5zb3VyY2VFdmVudCA9IGV2ZW50O1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICBzdGFydDogZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoKyt0aGlzLmFjdGl2ZSA9PT0gMSkge1xuICAgICAgICB0aGlzLnRoYXQuX196b29taW5nID0gdGhpcztcbiAgICAgICAgdGhpcy5lbWl0KFwic3RhcnRcIik7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIHpvb206IGZ1bmN0aW9uKGtleSwgdHJhbnNmb3JtKSB7XG4gICAgICBpZiAodGhpcy5tb3VzZSAmJiBrZXkgIT09IFwibW91c2VcIikgdGhpcy5tb3VzZVsxXSA9IHRyYW5zZm9ybS5pbnZlcnQodGhpcy5tb3VzZVswXSk7XG4gICAgICBpZiAodGhpcy50b3VjaDAgJiYga2V5ICE9PSBcInRvdWNoXCIpIHRoaXMudG91Y2gwWzFdID0gdHJhbnNmb3JtLmludmVydCh0aGlzLnRvdWNoMFswXSk7XG4gICAgICBpZiAodGhpcy50b3VjaDEgJiYga2V5ICE9PSBcInRvdWNoXCIpIHRoaXMudG91Y2gxWzFdID0gdHJhbnNmb3JtLmludmVydCh0aGlzLnRvdWNoMVswXSk7XG4gICAgICB0aGlzLnRoYXQuX196b29tID0gdHJhbnNmb3JtO1xuICAgICAgdGhpcy5lbWl0KFwiem9vbVwiKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgZW5kOiBmdW5jdGlvbigpIHtcbiAgICAgIGlmICgtLXRoaXMuYWN0aXZlID09PSAwKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnRoYXQuX196b29taW5nO1xuICAgICAgICB0aGlzLmVtaXQoXCJlbmRcIik7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIGVtaXQ6IGZ1bmN0aW9uKHR5cGUpIHtcbiAgICAgIHZhciBkID0gc2VsZWN0KHRoaXMudGhhdCkuZGF0dW0oKTtcbiAgICAgIGxpc3RlbmVycy5jYWxsKFxuICAgICAgICB0eXBlLFxuICAgICAgICB0aGlzLnRoYXQsXG4gICAgICAgIG5ldyBab29tRXZlbnQodHlwZSwge1xuICAgICAgICAgIHNvdXJjZUV2ZW50OiB0aGlzLnNvdXJjZUV2ZW50LFxuICAgICAgICAgIHRhcmdldDogem9vbSxcbiAgICAgICAgICB0eXBlLFxuICAgICAgICAgIHRyYW5zZm9ybTogdGhpcy50aGF0Ll9fem9vbSxcbiAgICAgICAgICBkaXNwYXRjaDogbGlzdGVuZXJzXG4gICAgICAgIH0pLFxuICAgICAgICBkXG4gICAgICApO1xuICAgIH1cbiAgfTtcblxuICBmdW5jdGlvbiB3aGVlbGVkKGV2ZW50LCAuLi5hcmdzKSB7XG4gICAgaWYgKCFmaWx0ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSkgcmV0dXJuO1xuICAgIHZhciBnID0gZ2VzdHVyZSh0aGlzLCBhcmdzKS5ldmVudChldmVudCksXG4gICAgICAgIHQgPSB0aGlzLl9fem9vbSxcbiAgICAgICAgayA9IE1hdGgubWF4KHNjYWxlRXh0ZW50WzBdLCBNYXRoLm1pbihzY2FsZUV4dGVudFsxXSwgdC5rICogTWF0aC5wb3coMiwgd2hlZWxEZWx0YS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSkpLFxuICAgICAgICBwID0gcG9pbnRlcihldmVudCk7XG5cbiAgICAvLyBJZiB0aGUgbW91c2UgaXMgaW4gdGhlIHNhbWUgbG9jYXRpb24gYXMgYmVmb3JlLCByZXVzZSBpdC5cbiAgICAvLyBJZiB0aGVyZSB3ZXJlIHJlY2VudCB3aGVlbCBldmVudHMsIHJlc2V0IHRoZSB3aGVlbCBpZGxlIHRpbWVvdXQuXG4gICAgaWYgKGcud2hlZWwpIHtcbiAgICAgIGlmIChnLm1vdXNlWzBdWzBdICE9PSBwWzBdIHx8IGcubW91c2VbMF1bMV0gIT09IHBbMV0pIHtcbiAgICAgICAgZy5tb3VzZVsxXSA9IHQuaW52ZXJ0KGcubW91c2VbMF0gPSBwKTtcbiAgICAgIH1cbiAgICAgIGNsZWFyVGltZW91dChnLndoZWVsKTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGlzIHdoZWVsIGV2ZW50IHdvbuKAmXQgdHJpZ2dlciBhIHRyYW5zZm9ybSBjaGFuZ2UsIGlnbm9yZSBpdC5cbiAgICBlbHNlIGlmICh0LmsgPT09IGspIHJldHVybjtcblxuICAgIC8vIE90aGVyd2lzZSwgY2FwdHVyZSB0aGUgbW91c2UgcG9pbnQgYW5kIGxvY2F0aW9uIGF0IHRoZSBzdGFydC5cbiAgICBlbHNlIHtcbiAgICAgIGcubW91c2UgPSBbcCwgdC5pbnZlcnQocCldO1xuICAgICAgaW50ZXJydXB0KHRoaXMpO1xuICAgICAgZy5zdGFydCgpO1xuICAgIH1cblxuICAgIG5vZXZlbnQoZXZlbnQpO1xuICAgIGcud2hlZWwgPSBzZXRUaW1lb3V0KHdoZWVsaWRsZWQsIHdoZWVsRGVsYXkpO1xuICAgIGcuem9vbShcIm1vdXNlXCIsIGNvbnN0cmFpbih0cmFuc2xhdGUoc2NhbGUodCwgayksIGcubW91c2VbMF0sIGcubW91c2VbMV0pLCBnLmV4dGVudCwgdHJhbnNsYXRlRXh0ZW50KSk7XG5cbiAgICBmdW5jdGlvbiB3aGVlbGlkbGVkKCkge1xuICAgICAgZy53aGVlbCA9IG51bGw7XG4gICAgICBnLmVuZCgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG1vdXNlZG93bmVkKGV2ZW50LCAuLi5hcmdzKSB7XG4gICAgaWYgKHRvdWNoZW5kaW5nIHx8ICFmaWx0ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSkgcmV0dXJuO1xuICAgIHZhciBjdXJyZW50VGFyZ2V0ID0gZXZlbnQuY3VycmVudFRhcmdldCxcbiAgICAgICAgZyA9IGdlc3R1cmUodGhpcywgYXJncywgdHJ1ZSkuZXZlbnQoZXZlbnQpLFxuICAgICAgICB2ID0gc2VsZWN0KGV2ZW50LnZpZXcpLm9uKFwibW91c2Vtb3ZlLnpvb21cIiwgbW91c2Vtb3ZlZCwgdHJ1ZSkub24oXCJtb3VzZXVwLnpvb21cIiwgbW91c2V1cHBlZCwgdHJ1ZSksXG4gICAgICAgIHAgPSBwb2ludGVyKGV2ZW50LCBjdXJyZW50VGFyZ2V0KSxcbiAgICAgICAgeDAgPSBldmVudC5jbGllbnRYLFxuICAgICAgICB5MCA9IGV2ZW50LmNsaWVudFk7XG5cbiAgICBkcmFnRGlzYWJsZShldmVudC52aWV3KTtcbiAgICBub3Byb3BhZ2F0aW9uKGV2ZW50KTtcbiAgICBnLm1vdXNlID0gW3AsIHRoaXMuX196b29tLmludmVydChwKV07XG4gICAgaW50ZXJydXB0KHRoaXMpO1xuICAgIGcuc3RhcnQoKTtcblxuICAgIGZ1bmN0aW9uIG1vdXNlbW92ZWQoZXZlbnQpIHtcbiAgICAgIG5vZXZlbnQoZXZlbnQpO1xuICAgICAgaWYgKCFnLm1vdmVkKSB7XG4gICAgICAgIHZhciBkeCA9IGV2ZW50LmNsaWVudFggLSB4MCwgZHkgPSBldmVudC5jbGllbnRZIC0geTA7XG4gICAgICAgIGcubW92ZWQgPSBkeCAqIGR4ICsgZHkgKiBkeSA+IGNsaWNrRGlzdGFuY2UyO1xuICAgICAgfVxuICAgICAgZy5ldmVudChldmVudClcbiAgICAgICAuem9vbShcIm1vdXNlXCIsIGNvbnN0cmFpbih0cmFuc2xhdGUoZy50aGF0Ll9fem9vbSwgZy5tb3VzZVswXSA9IHBvaW50ZXIoZXZlbnQsIGN1cnJlbnRUYXJnZXQpLCBnLm1vdXNlWzFdKSwgZy5leHRlbnQsIHRyYW5zbGF0ZUV4dGVudCkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1vdXNldXBwZWQoZXZlbnQpIHtcbiAgICAgIHYub24oXCJtb3VzZW1vdmUuem9vbSBtb3VzZXVwLnpvb21cIiwgbnVsbCk7XG4gICAgICBkcmFnRW5hYmxlKGV2ZW50LnZpZXcsIGcubW92ZWQpO1xuICAgICAgbm9ldmVudChldmVudCk7XG4gICAgICBnLmV2ZW50KGV2ZW50KS5lbmQoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBkYmxjbGlja2VkKGV2ZW50LCAuLi5hcmdzKSB7XG4gICAgaWYgKCFmaWx0ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSkgcmV0dXJuO1xuICAgIHZhciB0MCA9IHRoaXMuX196b29tLFxuICAgICAgICBwMCA9IHBvaW50ZXIoZXZlbnQuY2hhbmdlZFRvdWNoZXMgPyBldmVudC5jaGFuZ2VkVG91Y2hlc1swXSA6IGV2ZW50LCB0aGlzKSxcbiAgICAgICAgcDEgPSB0MC5pbnZlcnQocDApLFxuICAgICAgICBrMSA9IHQwLmsgKiAoZXZlbnQuc2hpZnRLZXkgPyAwLjUgOiAyKSxcbiAgICAgICAgdDEgPSBjb25zdHJhaW4odHJhbnNsYXRlKHNjYWxlKHQwLCBrMSksIHAwLCBwMSksIGV4dGVudC5hcHBseSh0aGlzLCBhcmdzKSwgdHJhbnNsYXRlRXh0ZW50KTtcblxuICAgIG5vZXZlbnQoZXZlbnQpO1xuICAgIGlmIChkdXJhdGlvbiA+IDApIHNlbGVjdCh0aGlzKS50cmFuc2l0aW9uKCkuZHVyYXRpb24oZHVyYXRpb24pLmNhbGwoc2NoZWR1bGUsIHQxLCBwMCwgZXZlbnQpO1xuICAgIGVsc2Ugc2VsZWN0KHRoaXMpLmNhbGwoem9vbS50cmFuc2Zvcm0sIHQxLCBwMCwgZXZlbnQpO1xuICB9XG5cbiAgZnVuY3Rpb24gdG91Y2hzdGFydGVkKGV2ZW50LCAuLi5hcmdzKSB7XG4gICAgaWYgKCFmaWx0ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSkgcmV0dXJuO1xuICAgIHZhciB0b3VjaGVzID0gZXZlbnQudG91Y2hlcyxcbiAgICAgICAgbiA9IHRvdWNoZXMubGVuZ3RoLFxuICAgICAgICBnID0gZ2VzdHVyZSh0aGlzLCBhcmdzLCBldmVudC5jaGFuZ2VkVG91Y2hlcy5sZW5ndGggPT09IG4pLmV2ZW50KGV2ZW50KSxcbiAgICAgICAgc3RhcnRlZCwgaSwgdCwgcDtcblxuICAgIG5vcHJvcGFnYXRpb24oZXZlbnQpO1xuICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIHQgPSB0b3VjaGVzW2ldLCBwID0gcG9pbnRlcih0LCB0aGlzKTtcbiAgICAgIHAgPSBbcCwgdGhpcy5fX3pvb20uaW52ZXJ0KHApLCB0LmlkZW50aWZpZXJdO1xuICAgICAgaWYgKCFnLnRvdWNoMCkgZy50b3VjaDAgPSBwLCBzdGFydGVkID0gdHJ1ZSwgZy50YXBzID0gMSArICEhdG91Y2hzdGFydGluZztcbiAgICAgIGVsc2UgaWYgKCFnLnRvdWNoMSAmJiBnLnRvdWNoMFsyXSAhPT0gcFsyXSkgZy50b3VjaDEgPSBwLCBnLnRhcHMgPSAwO1xuICAgIH1cblxuICAgIGlmICh0b3VjaHN0YXJ0aW5nKSB0b3VjaHN0YXJ0aW5nID0gY2xlYXJUaW1lb3V0KHRvdWNoc3RhcnRpbmcpO1xuXG4gICAgaWYgKHN0YXJ0ZWQpIHtcbiAgICAgIGlmIChnLnRhcHMgPCAyKSB0b3VjaGZpcnN0ID0gcFswXSwgdG91Y2hzdGFydGluZyA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IHRvdWNoc3RhcnRpbmcgPSBudWxsOyB9LCB0b3VjaERlbGF5KTtcbiAgICAgIGludGVycnVwdCh0aGlzKTtcbiAgICAgIGcuc3RhcnQoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB0b3VjaG1vdmVkKGV2ZW50LCAuLi5hcmdzKSB7XG4gICAgaWYgKCF0aGlzLl9fem9vbWluZykgcmV0dXJuO1xuICAgIHZhciBnID0gZ2VzdHVyZSh0aGlzLCBhcmdzKS5ldmVudChldmVudCksXG4gICAgICAgIHRvdWNoZXMgPSBldmVudC5jaGFuZ2VkVG91Y2hlcyxcbiAgICAgICAgbiA9IHRvdWNoZXMubGVuZ3RoLCBpLCB0LCBwLCBsO1xuXG4gICAgbm9ldmVudChldmVudCk7XG4gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgdCA9IHRvdWNoZXNbaV0sIHAgPSBwb2ludGVyKHQsIHRoaXMpO1xuICAgICAgaWYgKGcudG91Y2gwICYmIGcudG91Y2gwWzJdID09PSB0LmlkZW50aWZpZXIpIGcudG91Y2gwWzBdID0gcDtcbiAgICAgIGVsc2UgaWYgKGcudG91Y2gxICYmIGcudG91Y2gxWzJdID09PSB0LmlkZW50aWZpZXIpIGcudG91Y2gxWzBdID0gcDtcbiAgICB9XG4gICAgdCA9IGcudGhhdC5fX3pvb207XG4gICAgaWYgKGcudG91Y2gxKSB7XG4gICAgICB2YXIgcDAgPSBnLnRvdWNoMFswXSwgbDAgPSBnLnRvdWNoMFsxXSxcbiAgICAgICAgICBwMSA9IGcudG91Y2gxWzBdLCBsMSA9IGcudG91Y2gxWzFdLFxuICAgICAgICAgIGRwID0gKGRwID0gcDFbMF0gLSBwMFswXSkgKiBkcCArIChkcCA9IHAxWzFdIC0gcDBbMV0pICogZHAsXG4gICAgICAgICAgZGwgPSAoZGwgPSBsMVswXSAtIGwwWzBdKSAqIGRsICsgKGRsID0gbDFbMV0gLSBsMFsxXSkgKiBkbDtcbiAgICAgIHQgPSBzY2FsZSh0LCBNYXRoLnNxcnQoZHAgLyBkbCkpO1xuICAgICAgcCA9IFsocDBbMF0gKyBwMVswXSkgLyAyLCAocDBbMV0gKyBwMVsxXSkgLyAyXTtcbiAgICAgIGwgPSBbKGwwWzBdICsgbDFbMF0pIC8gMiwgKGwwWzFdICsgbDFbMV0pIC8gMl07XG4gICAgfVxuICAgIGVsc2UgaWYgKGcudG91Y2gwKSBwID0gZy50b3VjaDBbMF0sIGwgPSBnLnRvdWNoMFsxXTtcbiAgICBlbHNlIHJldHVybjtcblxuICAgIGcuem9vbShcInRvdWNoXCIsIGNvbnN0cmFpbih0cmFuc2xhdGUodCwgcCwgbCksIGcuZXh0ZW50LCB0cmFuc2xhdGVFeHRlbnQpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRvdWNoZW5kZWQoZXZlbnQsIC4uLmFyZ3MpIHtcbiAgICBpZiAoIXRoaXMuX196b29taW5nKSByZXR1cm47XG4gICAgdmFyIGcgPSBnZXN0dXJlKHRoaXMsIGFyZ3MpLmV2ZW50KGV2ZW50KSxcbiAgICAgICAgdG91Y2hlcyA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzLFxuICAgICAgICBuID0gdG91Y2hlcy5sZW5ndGgsIGksIHQ7XG5cbiAgICBub3Byb3BhZ2F0aW9uKGV2ZW50KTtcbiAgICBpZiAodG91Y2hlbmRpbmcpIGNsZWFyVGltZW91dCh0b3VjaGVuZGluZyk7XG4gICAgdG91Y2hlbmRpbmcgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyB0b3VjaGVuZGluZyA9IG51bGw7IH0sIHRvdWNoRGVsYXkpO1xuICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIHQgPSB0b3VjaGVzW2ldO1xuICAgICAgaWYgKGcudG91Y2gwICYmIGcudG91Y2gwWzJdID09PSB0LmlkZW50aWZpZXIpIGRlbGV0ZSBnLnRvdWNoMDtcbiAgICAgIGVsc2UgaWYgKGcudG91Y2gxICYmIGcudG91Y2gxWzJdID09PSB0LmlkZW50aWZpZXIpIGRlbGV0ZSBnLnRvdWNoMTtcbiAgICB9XG4gICAgaWYgKGcudG91Y2gxICYmICFnLnRvdWNoMCkgZy50b3VjaDAgPSBnLnRvdWNoMSwgZGVsZXRlIGcudG91Y2gxO1xuICAgIGlmIChnLnRvdWNoMCkgZy50b3VjaDBbMV0gPSB0aGlzLl9fem9vbS5pbnZlcnQoZy50b3VjaDBbMF0pO1xuICAgIGVsc2Uge1xuICAgICAgZy5lbmQoKTtcbiAgICAgIC8vIElmIHRoaXMgd2FzIGEgZGJsdGFwLCByZXJvdXRlIHRvIHRoZSAob3B0aW9uYWwpIGRibGNsaWNrLnpvb20gaGFuZGxlci5cbiAgICAgIGlmIChnLnRhcHMgPT09IDIpIHtcbiAgICAgICAgdCA9IHBvaW50ZXIodCwgdGhpcyk7XG4gICAgICAgIGlmIChNYXRoLmh5cG90KHRvdWNoZmlyc3RbMF0gLSB0WzBdLCB0b3VjaGZpcnN0WzFdIC0gdFsxXSkgPCB0YXBEaXN0YW5jZSkge1xuICAgICAgICAgIHZhciBwID0gc2VsZWN0KHRoaXMpLm9uKFwiZGJsY2xpY2suem9vbVwiKTtcbiAgICAgICAgICBpZiAocCkgcC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgem9vbS53aGVlbERlbHRhID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHdoZWVsRGVsdGEgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgem9vbSkgOiB3aGVlbERlbHRhO1xuICB9O1xuXG4gIHpvb20uZmlsdGVyID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGZpbHRlciA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoISFfKSwgem9vbSkgOiBmaWx0ZXI7XG4gIH07XG5cbiAgem9vbS50b3VjaGFibGUgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodG91Y2hhYmxlID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCghIV8pLCB6b29tKSA6IHRvdWNoYWJsZTtcbiAgfTtcblxuICB6b29tLmV4dGVudCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChleHRlbnQgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KFtbK19bMF1bMF0sICtfWzBdWzFdXSwgWytfWzFdWzBdLCArX1sxXVsxXV1dKSwgem9vbSkgOiBleHRlbnQ7XG4gIH07XG5cbiAgem9vbS5zY2FsZUV4dGVudCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzY2FsZUV4dGVudFswXSA9ICtfWzBdLCBzY2FsZUV4dGVudFsxXSA9ICtfWzFdLCB6b29tKSA6IFtzY2FsZUV4dGVudFswXSwgc2NhbGVFeHRlbnRbMV1dO1xuICB9O1xuXG4gIHpvb20udHJhbnNsYXRlRXh0ZW50ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRyYW5zbGF0ZUV4dGVudFswXVswXSA9ICtfWzBdWzBdLCB0cmFuc2xhdGVFeHRlbnRbMV1bMF0gPSArX1sxXVswXSwgdHJhbnNsYXRlRXh0ZW50WzBdWzFdID0gK19bMF1bMV0sIHRyYW5zbGF0ZUV4dGVudFsxXVsxXSA9ICtfWzFdWzFdLCB6b29tKSA6IFtbdHJhbnNsYXRlRXh0ZW50WzBdWzBdLCB0cmFuc2xhdGVFeHRlbnRbMF1bMV1dLCBbdHJhbnNsYXRlRXh0ZW50WzFdWzBdLCB0cmFuc2xhdGVFeHRlbnRbMV1bMV1dXTtcbiAgfTtcblxuICB6b29tLmNvbnN0cmFpbiA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjb25zdHJhaW4gPSBfLCB6b29tKSA6IGNvbnN0cmFpbjtcbiAgfTtcblxuICB6b29tLmR1cmF0aW9uID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGR1cmF0aW9uID0gK18sIHpvb20pIDogZHVyYXRpb247XG4gIH07XG5cbiAgem9vbS5pbnRlcnBvbGF0ZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChpbnRlcnBvbGF0ZSA9IF8sIHpvb20pIDogaW50ZXJwb2xhdGU7XG4gIH07XG5cbiAgem9vbS5vbiA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciB2YWx1ZSA9IGxpc3RlbmVycy5vbi5hcHBseShsaXN0ZW5lcnMsIGFyZ3VtZW50cyk7XG4gICAgcmV0dXJuIHZhbHVlID09PSBsaXN0ZW5lcnMgPyB6b29tIDogdmFsdWU7XG4gIH07XG5cbiAgem9vbS5jbGlja0Rpc3RhbmNlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGNsaWNrRGlzdGFuY2UyID0gKF8gPSArXykgKiBfLCB6b29tKSA6IE1hdGguc3FydChjbGlja0Rpc3RhbmNlMik7XG4gIH07XG5cbiAgem9vbS50YXBEaXN0YW5jZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0YXBEaXN0YW5jZSA9ICtfLCB6b29tKSA6IHRhcERpc3RhbmNlO1xuICB9O1xuXG4gIHJldHVybiB6b29tO1xufVxuIiwiZXhwb3J0IHtkZWZhdWx0IGFzIHpvb219IGZyb20gXCIuL3pvb20uanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyB6b29tVHJhbnNmb3JtLCBpZGVudGl0eSBhcyB6b29tSWRlbnRpdHksIFRyYW5zZm9ybSBhcyBab29tVHJhbnNmb3JtfSBmcm9tIFwiLi90cmFuc2Zvcm0uanNcIjtcbiIsImV4cG9ydCAqIGZyb20gXCJkMy1hcnJheVwiO1xuZXhwb3J0ICogZnJvbSBcImQzLWF4aXNcIjtcbmV4cG9ydCAqIGZyb20gXCJkMy1icnVzaFwiO1xuZXhwb3J0ICogZnJvbSBcImQzLWNob3JkXCI7XG5leHBvcnQgKiBmcm9tIFwiZDMtY29sb3JcIjtcbmV4cG9ydCAqIGZyb20gXCJkMy1jb250b3VyXCI7XG5leHBvcnQgKiBmcm9tIFwiZDMtZGVsYXVuYXlcIjtcbmV4cG9ydCAqIGZyb20gXCJkMy1kaXNwYXRjaFwiO1xuZXhwb3J0ICogZnJvbSBcImQzLWRyYWdcIjtcbmV4cG9ydCAqIGZyb20gXCJkMy1kc3ZcIjtcbmV4cG9ydCAqIGZyb20gXCJkMy1lYXNlXCI7XG5leHBvcnQgKiBmcm9tIFwiZDMtZmV0Y2hcIjtcbmV4cG9ydCAqIGZyb20gXCJkMy1mb3JjZVwiO1xuZXhwb3J0ICogZnJvbSBcImQzLWZvcm1hdFwiO1xuZXhwb3J0ICogZnJvbSBcImQzLWdlb1wiO1xuZXhwb3J0ICogZnJvbSBcImQzLWhpZXJhcmNoeVwiO1xuZXhwb3J0ICogZnJvbSBcImQzLWludGVycG9sYXRlXCI7XG5leHBvcnQgKiBmcm9tIFwiZDMtcGF0aFwiO1xuZXhwb3J0ICogZnJvbSBcImQzLXBvbHlnb25cIjtcbmV4cG9ydCAqIGZyb20gXCJkMy1xdWFkdHJlZVwiO1xuZXhwb3J0ICogZnJvbSBcImQzLXJhbmRvbVwiO1xuZXhwb3J0ICogZnJvbSBcImQzLXNjYWxlXCI7XG5leHBvcnQgKiBmcm9tIFwiZDMtc2NhbGUtY2hyb21hdGljXCI7XG5leHBvcnQgKiBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5leHBvcnQgKiBmcm9tIFwiZDMtc2hhcGVcIjtcbmV4cG9ydCAqIGZyb20gXCJkMy10aW1lXCI7XG5leHBvcnQgKiBmcm9tIFwiZDMtdGltZS1mb3JtYXRcIjtcbmV4cG9ydCAqIGZyb20gXCJkMy10aW1lclwiO1xuZXhwb3J0ICogZnJvbSBcImQzLXRyYW5zaXRpb25cIjtcbmV4cG9ydCAqIGZyb20gXCJkMy16b29tXCI7XG4iLCJpbXBvcnQgKiBhcyBkMyBmcm9tIFwiZDNcIjtcblxuY29uc3QgQ09MT1JfUkFOR0VfMSA9IFtcbiAgXCJnb2xkXCIsXG4gIFwiYmx1ZVwiLFxuICBcImdyZWVuXCIsXG4gIFwieWVsbG93XCIsXG4gIFwiYmxhY2tcIixcbiAgXCJncmV5XCIsXG4gIFwiZGFya2dyZWVuXCIsXG4gIFwicGlua1wiLFxuICBcImJyb3duXCIsXG4gIFwic2xhdGVibHVlXCIsXG4gIFwiZ3JleTFcIixcbiAgXCJvcmFuZ2VcIixcbl07XG5jb25zdCBDT0xPUl9SQU5HRV8yID0gW1xuICBcIiMxZjc3YjRcIixcbiAgXCIjYWVjN2U4XCIsXG4gIFwiI2ZmN2YwZVwiLFxuICBcIiNmZmJiNzhcIixcbiAgXCIjMmNhMDJjXCIsXG4gIFwiIzk4ZGY4YVwiLFxuICBcIiNkNjI3MjhcIixcbiAgXCIjZmY5ODk2XCIsXG4gIFwiIzk0NjdiZFwiLFxuICBcIiNjNWIwZDVcIixcbiAgXCIjZTM3N2MyXCIsXG4gIFwiI2Y3YjZkMlwiLFxuICBcIiM3ZjdmN2ZcIixcbiAgXCIjYzdjN2M3XCIsXG4gIFwiI2JjYmQyMlwiLFxuICBcIiNkYmRiOGRcIixcbiAgXCIjMTdiZWNmXCIsXG4gIFwiIzllZGFlNVwiLFxuICBcInNhbG1vblwiLFxuICBcImxpZ2h0c2FsbW9uXCIsXG4gIFwibGlnaHRzdGVlbGJsdWVcIixcbiAgXCJzdGVlbGJsdWVcIixcbiAgXCJ5ZWxsb3dcIixcbiAgXCJvcmFuZ2VcIixcbiAgXCIjY2NjY2NjXCIsXG4gIFwiI2RkZGRkZFwiLFxuICBcIiNlZWVcIixcbiAgXCIjYWFhXCIsXG4gIFwiIzEyMzQ1NlwiLFxuICBcImJsYWNrXCIsXG5dO1xuXG5leHBvcnQgY2xhc3MgQmFzZUNoYXJ0V2lkZ2V0IHtcbiAgbWFyZ2luUmlnaHQgPSAxNTA7XG4gIG1hcmdpbkJvdHRvbSA9IDE1MDtcbiAgY29sb3JSYW5nZSA9IENPTE9SX1JBTkdFXzI7XG5cbiAgY29uc3RydWN0b3IodGl0bGUsIGRlc2NyaXB0aW9uLCBkYXRhLCBvcHRpb25zID0ge30pIHtcbiAgICB0aGlzLnRpdGxlID0gdGl0bGU7XG4gICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB0aGlzLmRhdGFJc1ZhbGlkID0gQXJyYXkuaXNBcnJheShkYXRhKSA/IGRhdGEubGVuZ3RoID4gMCA6ICEhZGF0YTtcblxuICAgIHRoaXMud3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgdGhpcy5zdmcgPSBkMy5zZWxlY3QodGhpcy53cmFwcGVyKS5hcHBlbmQoXCJzdmdcIik7XG4gIH1cblxuICBjbGVhckFuZFNjYWxlU3ZnKGRpdldpZHRoLCBkaXZIZWlnaHQsIHRyYW5zbGF0ZVggPSBudWxsLCB0cmFuc2xhdGVZID0gbnVsbCkge1xuICAgIGlmICh0aGlzLmcpIHRoaXMuZy5yZW1vdmUoKTtcbiAgICB0aGlzLnN2Zy5zZWxlY3RBbGwoXCIqXCIpLnJlbW92ZSgpO1xuXG4gICAgY29uc3QgeCA9IHRyYW5zbGF0ZVggPyB0cmFuc2xhdGVYIDogMTAwO1xuICAgIGNvbnN0IHkgPSB0cmFuc2xhdGVZID8gdHJhbnNsYXRlWSA6IDUwO1xuXG4gICAgY29uc3QgYmdfdHJhbnNsYXRlID0gdGhpcy50aXRsZSA/IFs1LCAzNV0gOiBbMCwgMF07XG4gICAgY29uc3QgYmcgPSB0aGlzLnN2Zy5hcHBlbmQoXCJyZWN0XCIpXG4gICAgICAgIC5hdHRyKFwid2lkdGhcIiwgdGhpcy50aXRsZSA/IGRpdldpZHRoIC0gMTAgOiBkaXZXaWR0aClcbiAgICAgICAgLmF0dHIoXCJoZWlnaHRcIiwgdGhpcy50aXRsZSA/IGRpdkhlaWdodCAtIDQwIDogZGl2SGVpZ2h0KVxuICAgICAgICAuYXR0cihcImZpbGxcIiwgXCJ3aGl0ZVwiKVxuICAgICAgICAuYXR0cihcInJ4XCIsIDMpXG4gICAgICAgIC5hdHRyKFwicnlcIiwgMylcbiAgICAgICAgLmF0dHIoXCJ0cmFuc2Zvcm1cIiwgYHRyYW5zbGF0ZSgke2JnX3RyYW5zbGF0ZVswXX0sJHtiZ190cmFuc2xhdGVbMV19KWApO1xuICAgIHRoaXMuZyA9IHRoaXMuc3ZnLmFwcGVuZChcImdcIikuYXR0cihcInRyYW5zZm9ybVwiLCBgdHJhbnNsYXRlKCR7eH0sJHt5fSlgKTtcblxuICAgIHRoaXMuc3ZnLmF0dHIoXCJoZWlnaHRcIiwgZGl2SGVpZ2h0KS5hdHRyKFwid2lkdGhcIiwgZGl2V2lkdGgpO1xuICAgIHRoaXMuc3ZnLmF0dHIoXCJzdHlsZVwiLCBcImJhY2tncm91bmQtY29sb3I6ICNmNWY1ZjVcIik7XG4gICAgY29uc3Qgd2lkdGggPSB0aGlzLnN2Zy5hdHRyKFwid2lkdGhcIikgLSB0aGlzLm1hcmdpblJpZ2h0O1xuICAgIGNvbnN0IGhlaWdodCA9IHRoaXMuc3ZnLmF0dHIoXCJoZWlnaHRcIikgLSB0aGlzLm1hcmdpbkJvdHRvbTtcblxuICAgIHJldHVybiBbd2lkdGgsIGhlaWdodF07XG4gIH1cblxuICBkcmF3VGl0bGUoKSB7XG4gICAgaWYgKHRoaXMudGl0bGUpXG4gICAgICB0aGlzLnN2Z1xuICAgICAgICAuYXBwZW5kKFwiZ1wiKVxuICAgICAgICAuYXR0cihcInRyYW5zZm9ybVwiLCBcInRyYW5zbGF0ZSgxMCwgMClcIilcbiAgICAgICAgLmFwcGVuZChcInRleHRcIilcbiAgICAgICAgLmF0dHIoXCJ0ZXh0LWFuY2hvclwiLCBcInN0YXJ0XCIpXG4gICAgICAgIC5hdHRyKFwieFwiLCAwKVxuICAgICAgICAuYXR0cihcInlcIiwgMjUpXG4gICAgICAgIC5hdHRyKFwiY2xhc3NcIiwgXCJjaGFydC10aXRsZVwiKVxuICAgICAgICAudGV4dCh0aGlzLnRpdGxlKTtcblxuICAgIGlmICh0aGlzLmRlc2NyaXB0aW9uKSB7XG4gICAgICBjb25zdCByYW5kb21JZCA9IERhdGUubm93KCk7XG4gICAgICB0aGlzLnN2Z1xuICAgICAgICAuYXBwZW5kKFwiZ1wiKVxuICAgICAgICAuYXR0cihcInRyYW5zZm9ybVwiLCBgdHJhbnNsYXRlKCR7dGhpcy5zdmcuYXR0cihcIndpZHRoXCIpIC0gNDB9LCA1KWApXG4gICAgICAgIC5hcHBlbmQoXCJwYXRoXCIpXG4gICAgICAgIC5hdHRyKFwiY2xhc3NcIiwgXCJxdWVzdGlvbi1tYXJrXCIpXG4gICAgICAgIC5hdHRyKFwiaWRcIiwgYGlkLSR7cmFuZG9tSWR9YClcbiAgICAgICAgLy8gRm9udCBBd2Vzb21lIFBybyA1LjE1LjQgYnkgQGZvbnRhd2Vzb21lIC0gaHR0cHM6Ly9mb250YXdlc29tZS5jb20gTGljZW5zZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tL2xpY2Vuc2UgKENvbW1lcmNpYWwgTGljZW5zZSlcbiAgICAgICAgLmF0dHIoXG4gICAgICAgICAgXCJkXCIsXG4gICAgICAgICAgXCJNMjU2IDhDMTE5LjA0MyA4IDggMTE5LjA4MyA4IDI1NmMwIDEzNi45OTcgMTExLjA0MyAyNDggMjQ4IDI0OHMyNDgtMTExLjAwMyAyNDgtMjQ4QzUwNCAxMTkuMDgzIDM5Mi45NTcgOCAyNTYgOHptMCA0NDhjLTExMC41MzIgMC0yMDAtODkuNDMxLTIwMC0yMDAgMC0xMTAuNDk1IDg5LjQ3Mi0yMDAgMjAwLTIwMCAxMTAuNDkxIDAgMjAwIDg5LjQ3MSAyMDAgMjAwIDAgMTEwLjUzLTg5LjQzMSAyMDAtMjAwIDIwMHptMTA3LjI0NC0yNTUuMmMwIDY3LjA1Mi03Mi40MjEgNjguMDg0LTcyLjQyMSA5Mi44NjNWMzAwYzAgNi42MjctNS4zNzMgMTItMTIgMTJoLTQ1LjY0N2MtNi42MjcgMC0xMi01LjM3My0xMi0xMnYtOC42NTljMC0zNS43NDUgMjcuMS01MC4wMzQgNDcuNTc5LTYxLjUxNiAxNy41NjEtOS44NDUgMjguMzI0LTE2LjU0MSAyOC4zMjQtMjkuNTc5IDAtMTcuMjQ2LTIxLjk5OS0yOC42OTMtMzkuNzg0LTI4LjY5My0yMy4xODkgMC0zMy44OTQgMTAuOTc3LTQ4Ljk0MiAyOS45NjktNC4wNTcgNS4xMi0xMS40NiA2LjA3MS0xNi42NjYgMi4xMjRsLTI3LjgyNC0yMS4wOThjLTUuMTA3LTMuODcyLTYuMjUxLTExLjA2Ni0yLjY0NC0xNi4zNjNDMTg0Ljg0NiAxMzEuNDkxIDIxNC45NCAxMTIgMjYxLjc5NCAxMTJjNDkuMDcxIDAgMTAxLjQ1IDM4LjMwNCAxMDEuNDUgODguOHpNMjk4IDM2OGMwIDIzLjE1OS0xOC44NDEgNDItNDIgNDJzLTQyLTE4Ljg0MS00Mi00MiAxOC44NDEtNDIgNDItNDIgNDIgMTguODQxIDQyIDQyelwiXG4gICAgICAgICk7XG5cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBjb25zdCB0YXJnZXRFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBpZC0ke3JhbmRvbUlkfWApO1xuICAgICAgICBpZiAodGFyZ2V0RWwpXG4gICAgICAgICAgdGFyZ2V0RWwuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLm9uU2hvd0Rlc2ModGhpcy5kZXNjcmlwdGlvbik7XG4gICAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBhcHBlbmRYQXhpcyh4LCBoZWlnaHQpIHtcbiAgICBjb25zdCB4QXhpcyA9IHRoaXMub3B0aW9ucy50aWNrc1xuICAgICAgPyBkMy5heGlzQm90dG9tKHgpLnRpY2tzKHRoaXMub3B0aW9ucy50aWNrcykudGlja0Zvcm1hdChkMy50aW1lRm9ybWF0KFwiJWQuJW0uJVkgJUg6JU1cIikpXG4gICAgICA6IGQzLmF4aXNCb3R0b20oeCkudGlja0Zvcm1hdChkMy50aW1lRm9ybWF0KFwiJWQuJW0uJVkgJUg6JU1cIikpO1xuXG4gICAgdGhpcy5nXG4gICAgICAuYXBwZW5kKFwiZ1wiKVxuICAgICAgLmF0dHIoXCJ0cmFuc2Zvcm1cIiwgXCJ0cmFuc2xhdGUoMCxcIiArIGhlaWdodCArIFwiKVwiKVxuICAgICAgLmNhbGwoeEF4aXMpO1xuICB9XG5cbiAgYXBwZW5kWEF4aXNMYWJlbCh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy54QXhpc0xhYmVsKVxuICAgICAgdGhpcy5nXG4gICAgICAgIC5hcHBlbmQoXCJnXCIpXG4gICAgICAgIC5hcHBlbmQoXCJ0ZXh0XCIpXG4gICAgICAgIC5hdHRyKFwieFwiLCB3aWR0aClcbiAgICAgICAgLmF0dHIoXCJ5XCIsIGhlaWdodCArIDUwKVxuICAgICAgICAuYXR0cihcInRleHQtYW5jaG9yXCIsIFwiZW5kXCIpXG4gICAgICAgIC5hdHRyKFwiZm9udC1zaXplXCIsIFwiMThweFwiKVxuICAgICAgICAuYXR0cihcImZpbGxcIiwgXCJibGFja1wiKVxuICAgICAgICAudGV4dCh0aGlzLm9wdGlvbnMueEF4aXNMYWJlbCk7XG4gIH1cblxuICBhcHBlbmRZQXhpc0xhYmVsKCkge1xuICAgIGlmICh0aGlzLm9wdGlvbnMueUF4aXNMYWJlbClcbiAgICAgIHRoaXMuZ1xuICAgICAgICAuYXBwZW5kKFwiZ1wiKVxuICAgICAgICAuYXBwZW5kKFwidGV4dFwiKVxuICAgICAgICAuYXR0cihcInRyYW5zZm9ybVwiLCBcInJvdGF0ZSgtOTApXCIpXG4gICAgICAgIC5hdHRyKFwieVwiLCA2KVxuICAgICAgICAuYXR0cihcImR5XCIsIFwiLTRlbVwiKVxuICAgICAgICAuYXR0cihcInRleHQtYW5jaG9yXCIsIFwiZW5kXCIpXG4gICAgICAgIC5hdHRyKFwiZm9udC1zaXplXCIsIFwiMThweFwiKVxuICAgICAgICAuYXR0cihcImZpbGxcIiwgXCJibGFja1wiKVxuICAgICAgICAudGV4dCh0aGlzLm9wdGlvbnMueUF4aXNMYWJlbCk7XG4gIH1cblxuICBzaG93RXJyb3JNZXNzYWdlKGRpdldpZHRoLCBkaXZIZWlnaHQpIHtcbiAgICB0aGlzLmdcbiAgICAgIC5hcHBlbmQoXCJnXCIpXG4gICAgICAuYXBwZW5kKFwidGV4dFwiKVxuICAgICAgLmF0dHIoXCJ4XCIsIGRpdldpZHRoIC8gMiAtIDE0MClcbiAgICAgIC5hdHRyKFwieVwiLCBkaXZIZWlnaHQgLyAyIC0gMjApXG4gICAgICAuYXR0cihcImNsYXNzXCIsIFwiY2hhcnQtZXJyb3ItbWVzc2FnZVwiKVxuICAgICAgLnRleHQoXCJObyBkYXRhIGF2YWlsYWJsZS5cIik7XG4gIH1cblxuICBzaG93TGVnZW5kKGtleXMsIGNvbG9yLCBkaXZXaWR0aCkge1xuICAgIHRoaXMuc3ZnXG4gICAgICAuYXBwZW5kKFwiZ1wiKVxuICAgICAgLnNlbGVjdEFsbChcImdcIilcbiAgICAgIC5kYXRhKGtleXMpXG4gICAgICAuZW50ZXIoKVxuICAgICAgLmFwcGVuZChcImNpcmNsZVwiKVxuICAgICAgLmF0dHIoXCJjeFwiLCBkaXZXaWR0aCAtIDEyMClcbiAgICAgIC5hdHRyKFwiY3lcIiwgZnVuY3Rpb24gKGQsIGkpIHtcbiAgICAgICAgcmV0dXJuIDI1ICsgaSAqIDI1O1xuICAgICAgfSlcbiAgICAgIC5hdHRyKFwiclwiLCA3KVxuICAgICAgLnN0eWxlKFwiZmlsbFwiLCBmdW5jdGlvbiAoZCkge1xuICAgICAgICByZXR1cm4gY29sb3IoZCk7XG4gICAgICB9KTtcblxuICAgIHRoaXMuc3ZnXG4gICAgICAuc2VsZWN0QWxsKFwibGFiZWxcIilcbiAgICAgIC5kYXRhKGtleXMpXG4gICAgICAuZW50ZXIoKVxuICAgICAgLmFwcGVuZChcInRleHRcIilcbiAgICAgIC5hdHRyKFwieFwiLCBkaXZXaWR0aCAtIDEwMClcbiAgICAgIC5hdHRyKFwieVwiLCBmdW5jdGlvbiAoZCwgaSkge1xuICAgICAgICByZXR1cm4gMjUgKyBpICogMjU7XG4gICAgICB9KVxuICAgICAgLnN0eWxlKFwiZmlsbFwiLCBmdW5jdGlvbiAoZCkge1xuICAgICAgICByZXR1cm4gY29sb3IoZCk7XG4gICAgICB9KVxuICAgICAgLnRleHQoZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgcmV0dXJuIGQ7XG4gICAgICB9KVxuICAgICAgLmF0dHIoXCJ0ZXh0LWFuY2hvclwiLCBcImxlZnRcIilcbiAgICAgIC5zdHlsZShcImFsaWdubWVudC1iYXNlbGluZVwiLCBcIm1pZGRsZVwiKTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgZDMgZnJvbSBcImQzXCI7XG5pbXBvcnQgeyBCYXNlQ2hhcnRXaWRnZXQgfSBmcm9tIFwiLi9iYXNlXCI7XG5cbmV4cG9ydCBjbGFzcyBMaW5lQ2hhcnRXaWRnZXQgZXh0ZW5kcyBCYXNlQ2hhcnRXaWRnZXQge1xuICBjb25zdHJ1Y3Rvcih0aXRsZSA9IFwiXCIsIGRlc2NyaXB0aW9uLCBkYXRhLCBvcHRpb25zID0ge30pIHtcbiAgICBpZiAob3B0aW9ucy50cmFuc2Zvcm0pIGRhdGEgPSAoZGF0YSA/PyBbXSkubWFwKG9wdGlvbnMudHJhbnNmb3JtKTtcblxuICAgIHN1cGVyKHRpdGxlLCBkZXNjcmlwdGlvbiwgZGF0YSwgb3B0aW9ucyk7XG4gIH1cblxuICBwbG90KGRpdldpZHRoLCBkaXZIZWlnaHQsIGVsKSB7XG4gICAgY29uc3QgW3dpZHRoLCBoZWlnaHRdID0gdGhpcy5jbGVhckFuZFNjYWxlU3ZnKGRpdldpZHRoLCBkaXZIZWlnaHQpO1xuICAgIHRoaXMuZHJhd1RpdGxlKCk7XG5cbiAgICBpZiAoIXRoaXMuZGF0YUlzVmFsaWQpIHtcbiAgICAgIHRoaXMuc2hvd0Vycm9yTWVzc2FnZShkaXZXaWR0aCwgZGl2SGVpZ2h0KTtcbiAgICAgIHJldHVybiB0aGlzLndyYXBwZXIuaW5uZXJIVE1MO1xuICAgIH1cblxuICAgIGNvbnN0IFt4TWluLCB4TWF4XSA9IGQzLmV4dGVudCh0aGlzLmRhdGEsIChkKSA9PiBkLmNvbHVtbjEpO1xuXG4gICAgbGV0IHhTY2FsZSA9IG51bGxcbiAgICBpZih0aGlzLm9wdGlvbnMudXNlVGltZVNjYWxlKVxuICAgIHtcbiAgICAgIHhTY2FsZSA9IGQzLnNjYWxlVGltZSgpLmRvbWFpbihbeE1pbiwgeE1heF0pLnJhbmdlKFswLCB3aWR0aF0pO1xuICAgIH1cbiAgICBlbHNlXG4gICAge1xuICAgICAgeFNjYWxlID0gZDMuc2NhbGVMaW5lYXIoKS5kb21haW4oW3hNaW4sIHhNYXhdKS5yYW5nZShbMCwgd2lkdGhdKTtcbiAgICB9XG5cbiAgICB0aGlzLmFwcGVuZFhBeGlzKHhTY2FsZSwgaGVpZ2h0KTtcbiAgICB0aGlzLmFwcGVuZFhBeGlzTGFiZWwod2lkdGgsIGhlaWdodCk7XG4gICAgdGhpcy5hcHBlbmRZQXhpc0xhYmVsKCk7XG5cbiAgICBjb25zdCB5TWF4ID0gZDMubWF4KHRoaXMuZGF0YSwgKGQpID0+ICtkLmNvbHVtbjIpO1xuXG4gICAgY29uc3QgeVNjYWxlID0gZDMuc2NhbGVMaW5lYXIoKS5kb21haW4oWzAsIHlNYXhdKS5yYW5nZShbaGVpZ2h0LCAwXSk7XG5cbiAgICB0aGlzLmcuYXBwZW5kKFwiZ1wiKS5jYWxsKGQzLmF4aXNMZWZ0KHlTY2FsZSkpO1xuXG4gICAgY29uc3QgY29sb3IgPSBkMy5zY2FsZU9yZGluYWwoKS5yYW5nZSh0aGlzLmNvbG9yUmFuZ2UpO1xuXG4gICAgdGhpcy5nXG4gICAgICAuYXBwZW5kKFwicGF0aFwiKVxuICAgICAgLmRhdHVtKHRoaXMuZGF0YSlcbiAgICAgIC5hdHRyKFwic3Ryb2tlXCIsIChkKSA9PiBjb2xvcihkLmNvbHVtbjIpKVxuICAgICAgLmF0dHIoXCJjbGFzc1wiLCBcImNoYXJ0LXBhdGhcIilcbiAgICAgIC5hdHRyKFxuICAgICAgICBcImRcIixcbiAgICAgICAgZDNcbiAgICAgICAgICAubGluZSgpXG4gICAgICAgICAgLngoKGQpID0+IHhTY2FsZShkLmNvbHVtbjEpKVxuICAgICAgICAgIC55KChkKSA9PiB5U2NhbGUoZC5jb2x1bW4yKSlcbiAgICAgICk7XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnNob3dMZWdlbmQpXG4gICAgICB0aGlzLnNob3dMZWdlbmQoXG4gICAgICAgIHRoaXMuZGF0YS5tYXAoKGUpID0+IGUuY29sdW1uMSksXG4gICAgICAgIGNvbG9yLFxuICAgICAgICBkaXZXaWR0aFxuICAgICAgKTtcblxuICAgIHJldHVybiB0aGlzLndyYXBwZXIuaW5uZXJIVE1MO1xuICB9XG5cbiAgYXBwZW5kWEF4aXMoeCwgaGVpZ2h0KSB7XG4gICAgY29uc3QgeEF4aXMgPSB0aGlzLm9wdGlvbnMudGlja3NcbiAgICAgICAgPyBkMy5heGlzQm90dG9tKHgpLnRpY2tzKHRoaXMub3B0aW9ucy50aWNrcylcbiAgICAgICAgOiBkMy5heGlzQm90dG9tKHgpO1xuICAgIGlmKHRoaXMub3B0aW9ucy51c2VUaW1lU2NhbGUpXG4gICAge1xuICAgICAgeEF4aXMudGlja0Zvcm1hdChkMy50aW1lRm9ybWF0KFwiJWQuJW0uJVkgJUg6JU1cIikpXG4gICAgfVxuXG4gICAgdGhpcy5nXG4gICAgICAgIC5hcHBlbmQoXCJnXCIpXG4gICAgICAgIC5hdHRyKFwidHJhbnNmb3JtXCIsIFwidHJhbnNsYXRlKDAsXCIgKyBoZWlnaHQgKyBcIilcIilcbiAgICAgICAgLmNhbGwoeEF4aXMpO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBkMyBmcm9tIFwiZDNcIjtcbmltcG9ydCB7IEJhc2VDaGFydFdpZGdldCB9IGZyb20gXCIuL2Jhc2VcIjtcblxuZXhwb3J0IGNsYXNzIEJhckNoYXJ0V2lkZ2V0IGV4dGVuZHMgQmFzZUNoYXJ0V2lkZ2V0IHtcbiAgY29uc3RydWN0b3IodGl0bGUsIGRlc2NyaXB0aW9uLCBkYXRhLCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMudHJhbnNmb3JtKSBkYXRhID0gKGRhdGEgPz8gW10pLm1hcChvcHRpb25zLnRyYW5zZm9ybSk7XG5cbiAgICBzdXBlcih0aXRsZSwgZGVzY3JpcHRpb24sIGRhdGEsIG9wdGlvbnMpO1xuICB9XG5cbiAgcGxvdChkaXZXaWR0aCwgZGl2SGVpZ2h0LCBlbCkge1xuICAgIGNvbnN0IFt3aWR0aCwgaGVpZ2h0XSA9IHRoaXMuY2xlYXJBbmRTY2FsZVN2ZyhkaXZXaWR0aCwgZGl2SGVpZ2h0KTtcbiAgICB0aGlzLmRyYXdUaXRsZSgpO1xuXG4gICAgaWYgKCF0aGlzLmRhdGFJc1ZhbGlkKSB7XG4gICAgICB0aGlzLnNob3dFcnJvck1lc3NhZ2UoZGl2V2lkdGgsIGRpdkhlaWdodCk7XG4gICAgICByZXR1cm4gdGhpcy53cmFwcGVyLmlubmVySFRNTDtcbiAgICB9XG5cbiAgICBjb25zdCB4U2NhbGUgPSBkMy5zY2FsZUJhbmQoKS5yYW5nZShbMCwgd2lkdGhdKS5wYWRkaW5nKDAuNCk7XG4gICAgY29uc3QgeVNjYWxlID0gZDMuc2NhbGVMaW5lYXIoKS5yYW5nZShbaGVpZ2h0LCAwXSk7XG5cbiAgICBjb25zdCBtYXggPSBkMy5tYXgodGhpcy5kYXRhLCAoZCkgPT4gZC5jb2x1bW4yKTtcblxuICAgIHhTY2FsZS5kb21haW4odGhpcy5kYXRhLm1hcCgoZCkgPT4gZC5jb2x1bW4xKSk7XG4gICAgeVNjYWxlLmRvbWFpbihbMCwgbWF4XSk7XG5cbiAgICB0aGlzLmFwcGVuZFhBeGlzKHhTY2FsZSwgaGVpZ2h0KTtcbiAgICB0aGlzLmFwcGVuZFhBeGlzTGFiZWwod2lkdGgsIGhlaWdodCk7XG4gICAgdGhpcy5hcHBlbmRZQXhpc0xhYmVsKCk7XG5cbiAgICB0aGlzLmcuYXBwZW5kKFwiZ1wiKS5hdHRyKFwidHJhbnNmb3JtXCIsIFwidHJhbnNsYXRlKDAsIDApXCIpLmNhbGwoZDMuYXhpc0xlZnQoeVNjYWxlKSk7XG5cbiAgICBjb25zdCBjb2xvciA9IGQzLnNjYWxlT3JkaW5hbCgpLnJhbmdlKHRoaXMuY29sb3JSYW5nZSk7XG5cbiAgICB0aGlzLmdcbiAgICAgIC5zZWxlY3RBbGwoXCIuYmFyXCIpXG4gICAgICAuZGF0YSh0aGlzLmRhdGEpXG4gICAgICAuZW50ZXIoKVxuICAgICAgLmFwcGVuZChcInJlY3RcIilcbiAgICAgIC5hdHRyKFwiZmlsbFwiLCAoZCkgPT4gY29sb3IoZC5jb2x1bW4yKSlcbiAgICAgIC5hdHRyKFwieFwiLCAoZCkgPT4geFNjYWxlKGQuY29sdW1uMSkpXG4gICAgICAuYXR0cihcInlcIiwgKGQpID0+IHlTY2FsZShkLmNvbHVtbjIpKVxuICAgICAgLmF0dHIoXCJ3aWR0aFwiLCB4U2NhbGUuYmFuZHdpZHRoKCkpXG4gICAgICAuYXR0cihcImhlaWdodFwiLCAoZCkgPT4gaGVpZ2h0IC0geVNjYWxlKGQuY29sdW1uMikpO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5zaG93TGVnZW5kKVxuICAgICAgdGhpcy5zaG93TGVnZW5kKFxuICAgICAgICB0aGlzLmRhdGEubWFwKChlKSA9PiBlLmNvbHVtbjEpLFxuICAgICAgICBjb2xvcixcbiAgICAgICAgZGl2V2lkdGhcbiAgICAgICk7XG5cbiAgICByZXR1cm4gdGhpcy53cmFwcGVyLmlubmVySFRNTDtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgZDMgZnJvbSBcImQzXCI7XG5pbXBvcnQgeyBCYXNlQ2hhcnRXaWRnZXQgfSBmcm9tIFwiLi9iYXNlXCI7XG5cbmV4cG9ydCBjbGFzcyBQaWVDaGFydFdpZGdldCBleHRlbmRzIEJhc2VDaGFydFdpZGdldCB7XG4gIGNvbnN0cnVjdG9yKHRpdGxlID0gXCJcIiwgZGVzY3JpcHRpb24sIGRhdGEsIG9wdGlvbnMgPSB7fSkge1xuICAgIGlmIChvcHRpb25zLnRyYW5zZm9ybSkgZGF0YSA9IChkYXRhID8/IFtdKS5tYXAob3B0aW9ucy50cmFuc2Zvcm0pO1xuXG4gICAgc3VwZXIodGl0bGUsIGRlc2NyaXB0aW9uLCBkYXRhLCBvcHRpb25zKTtcbiAgICB0aGlzLm1hcmdpblJpZ2h0ID0gMTAwXG4gICAgdGhpcy5tYXJnaW5Cb3R0b20gPSA2MFxuICB9XG5cbiAgcGxvdChkaXZXaWR0aCwgZGl2SGVpZ2h0LCBlbCkge1xuICAgIGNvbnN0IHRyYW5zbGF0ZVggPSBkaXZXaWR0aCAvIDIsXG4gICAgICB0cmFuc2xhdGVZID0gZGl2SGVpZ2h0IC8gMjtcblxuICAgIGlmICghdGhpcy5kYXRhSXNWYWxpZCkge1xuICAgICAgdGhpcy5jbGVhckFuZFNjYWxlU3ZnKGRpdldpZHRoLCBkaXZIZWlnaHQpO1xuICAgICAgdGhpcy5kcmF3VGl0bGUoKTtcbiAgICAgIHRoaXMuc2hvd0Vycm9yTWVzc2FnZShkaXZXaWR0aCwgZGl2SGVpZ2h0KTtcbiAgICAgIHJldHVybiB0aGlzLndyYXBwZXIuaW5uZXJIVE1MO1xuICAgIH1cbiAgICBjb25zdCBbd2lkdGgsIGhlaWdodF0gPSB0aGlzLmNsZWFyQW5kU2NhbGVTdmcoZGl2V2lkdGgsIGRpdkhlaWdodCwgdHJhbnNsYXRlWCwgdHJhbnNsYXRlWSk7XG4gICAgdGhpcy5kcmF3VGl0bGUoKTtcbiAgICBjb25zdCByYWRpdXMgPSBNYXRoLm1pbih3aWR0aCwgaGVpZ2h0KSAvIDEuNTtcblxuICAgIGNvbnN0IHBpZSA9IGQzLnBpZSgpLnZhbHVlKGZ1bmN0aW9uIChkKSB7XG4gICAgICByZXR1cm4gZC5jb2x1bW4yO1xuICAgIH0pO1xuXG4gICAgY29uc3QgcGF0aCA9IGQzXG4gICAgICAuYXJjKClcbiAgICAgIC5vdXRlclJhZGl1cyhyYWRpdXMgLSAxMClcbiAgICAgIC5pbm5lclJhZGl1cygwKTtcblxuICAgIGNvbnN0IGxhYmVsID0gZDNcbiAgICAgIC5hcmMoKVxuICAgICAgLm91dGVyUmFkaXVzKHJhZGl1cylcbiAgICAgIC5pbm5lclJhZGl1cyhyYWRpdXMgLSA4MCk7XG5cbiAgICBjb25zdCBhcmMgPSB0aGlzLmcuc2VsZWN0QWxsKFwiLmFyY1wiKS5kYXRhKHBpZSh0aGlzLmRhdGEpKS5lbnRlcigpLmFwcGVuZChcImdcIikuYXR0cihcImNsYXNzXCIsIFwiYXJjXCIpO1xuXG4gICAgY29uc3QgY29sb3IgPSBkMy5zY2FsZU9yZGluYWwoKS5kb21haW4odGhpcy5kYXRhKS5yYW5nZSh0aGlzLmNvbG9yUmFuZ2UpO1xuXG4gICAgYXJjXG4gICAgICAuYXBwZW5kKFwicGF0aFwiKVxuICAgICAgLmF0dHIoXCJkXCIsIHBhdGgpXG4gICAgICAuYXR0cihcImZpbGxcIiwgZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgcmV0dXJuIGNvbG9yKGQuZGF0YS5jb2x1bW4xKTtcbiAgICAgIH0pO1xuXG4gICAgYXJjXG4gICAgICAuYXBwZW5kKFwidGV4dFwiKVxuICAgICAgLmF0dHIoXCJ0cmFuc2Zvcm1cIiwgZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBcInRyYW5zbGF0ZShcIiArXG4gICAgICAgICAgKHJhZGl1cyArIDUwKSAqIE1hdGguc2luKChkLmVuZEFuZ2xlIC0gZC5zdGFydEFuZ2xlKSAvIDIgKyBkLnN0YXJ0QW5nbGUpICtcbiAgICAgICAgICBcIiwgXCIgK1xuICAgICAgICAgIC0xICogKHJhZGl1cyAtIDEwKSAqIE1hdGguY29zKChkLmVuZEFuZ2xlIC0gZC5zdGFydEFuZ2xlKSAvIDIgKyBkLnN0YXJ0QW5nbGUpICtcbiAgICAgICAgICBcIilcIlxuICAgICAgICApO1xuICAgICAgfSlcbiAgICAgIC5hdHRyKFwiZHlcIiwgXCIuNWVtXCIpXG4gICAgICAudGV4dChmdW5jdGlvbiAoZCkge1xuICAgICAgICByZXR1cm4gYCR7ZC5kYXRhLmNvbHVtbjJ9ICVgO1xuICAgICAgfSk7XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnNob3dMZWdlbmQpXG4gICAgICB0aGlzLnNob3dMZWdlbmQoXG4gICAgICAgIHRoaXMuZGF0YS5tYXAoKGUpID0+IGUuY29sdW1uMSksXG4gICAgICAgIGNvbG9yLFxuICAgICAgICBkaXZXaWR0aFxuICAgICAgKTtcblxuICAgIHJldHVybiB0aGlzLndyYXBwZXIuaW5uZXJIVE1MO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBkMyBmcm9tIFwiZDNcIjtcbmltcG9ydCB7IEJhc2VDaGFydFdpZGdldCB9IGZyb20gXCIuL2Jhc2VcIjtcblxuZXhwb3J0IGNsYXNzIEFyZWFDaGFydFdpZGdldCBleHRlbmRzIEJhc2VDaGFydFdpZGdldCB7XG4gIGNvbnN0cnVjdG9yKHRpdGxlID0gXCJcIiwgZGVzY3JpcHRpb24sIGRhdGEsIG9wdGlvbnMgPSB7fSkge1xuICAgIGlmIChvcHRpb25zLnRyYW5zZm9ybSkgZGF0YSA9IChkYXRhID8/IFtdKS5tYXAob3B0aW9ucy50cmFuc2Zvcm0pO1xuXG4gICAgc3VwZXIodGl0bGUsIGRlc2NyaXB0aW9uLCBkYXRhLCBvcHRpb25zKTtcbiAgfVxuXG4gIHBsb3QoZGl2V2lkdGgsIGRpdkhlaWdodCwgZWwpIHtcbiAgICBjb25zdCBbd2lkdGgsIGhlaWdodF0gPSB0aGlzLmNsZWFyQW5kU2NhbGVTdmcoZGl2V2lkdGgsIGRpdkhlaWdodCk7XG4gICAgdGhpcy5kcmF3VGl0bGUoKTtcblxuICAgIGlmICghdGhpcy5kYXRhSXNWYWxpZCkge1xuICAgICAgdGhpcy5zaG93RXJyb3JNZXNzYWdlKGRpdldpZHRoLCBkaXZIZWlnaHQpO1xuICAgICAgcmV0dXJuIHRoaXMud3JhcHBlci5pbm5lckhUTUw7XG4gICAgfVxuXG4gICAgY29uc3QgeCA9IGQzXG4gICAgICAuc2NhbGVUaW1lKClcbiAgICAgIC5kb21haW4oXG4gICAgICAgIGQzLmV4dGVudCh0aGlzLmRhdGEsIGZ1bmN0aW9uIChkKSB7XG4gICAgICAgICAgcmV0dXJuIGQuY29sdW1uMTtcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIC5yYW5nZShbMCwgd2lkdGhdKTtcblxuICAgIHRoaXMuYXBwZW5kWEF4aXMoeCwgaGVpZ2h0KTtcbiAgICB0aGlzLmFwcGVuZFhBeGlzTGFiZWwod2lkdGgsIGhlaWdodCk7XG4gICAgdGhpcy5hcHBlbmRZQXhpc0xhYmVsKCk7XG5cbiAgICBjb25zdCB5ID0gZDNcbiAgICAgIC5zY2FsZUxpbmVhcigpXG4gICAgICAuZG9tYWluKFtcbiAgICAgICAgMCxcbiAgICAgICAgZDMubWF4KHRoaXMuZGF0YSwgZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICByZXR1cm4gK2QuY29sdW1uMjtcbiAgICAgICAgfSksXG4gICAgICBdKVxuICAgICAgLnJhbmdlKFtoZWlnaHQsIDBdKTtcbiAgICB0aGlzLmcuYXBwZW5kKFwiZ1wiKS5jYWxsKGQzLmF4aXNMZWZ0KHkpKTtcblxuICAgIGNvbnN0IGNvbG9yID0gZDMuc2NhbGVPcmRpbmFsKCkucmFuZ2UodGhpcy5jb2xvclJhbmdlKTtcblxuICAgIC8vIEFkZCB0aGUgYXJlYVxuICAgIHRoaXMuZ1xuICAgICAgLmFwcGVuZChcInBhdGhcIilcbiAgICAgIC5kYXR1bSh0aGlzLmRhdGEpXG4gICAgICAuYXR0cihcImZpbGxcIiwgKGQpID0+IGNvbG9yKGQuY29sdW1uMikpXG4gICAgICAuYXR0cihcImNsYXNzXCIsIFwiY2hhcnQtYXJlYVwiKVxuICAgICAgLmF0dHIoXG4gICAgICAgIFwiZFwiLFxuICAgICAgICBkM1xuICAgICAgICAgIC5hcmVhKClcbiAgICAgICAgICAueChmdW5jdGlvbiAoZCkge1xuICAgICAgICAgICAgcmV0dXJuIHgoZC5jb2x1bW4xKTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC55MCh5KDApKVxuICAgICAgICAgIC55MShmdW5jdGlvbiAoZCkge1xuICAgICAgICAgICAgcmV0dXJuIHkoZC5jb2x1bW4yKTtcbiAgICAgICAgICB9KVxuICAgICAgKTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMuc2hvd0xlZ2VuZClcbiAgICAgIHRoaXMuc2hvd0xlZ2VuZChcbiAgICAgICAgdGhpcy5kYXRhLm1hcCgoZSkgPT4gZS5jb2x1bW4xKSxcbiAgICAgICAgY29sb3IsXG4gICAgICAgIGRpdldpZHRoXG4gICAgICApO1xuXG4gICAgcmV0dXJuIHRoaXMud3JhcHBlci5pbm5lckhUTUw7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIGQzIGZyb20gXCJkM1wiO1xuaW1wb3J0IHsgQmFzZUNoYXJ0V2lkZ2V0IH0gZnJvbSBcIi4vYmFzZVwiO1xuXG5leHBvcnQgY2xhc3MgU3RhY2tlZEJhckNoYXJ0V2lkZ2V0IGV4dGVuZHMgQmFzZUNoYXJ0V2lkZ2V0IHtcbiAgY29uc3RydWN0b3IodGl0bGUsIGRlc2NyaXB0aW9uLCBkYXRhLCBncm91cHMsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy50cmFuc2Zvcm0pIGRhdGEgPSAoZGF0YSA/PyBbXSkubWFwKG9wdGlvbnMudHJhbnNmb3JtKTtcblxuICAgIHN1cGVyKHRpdGxlLCBkZXNjcmlwdGlvbiwgZGF0YSwgb3B0aW9ucyk7XG4gICAgdGhpcy5ncm91cHMgPSBncm91cHM7XG4gIH1cblxuICBwbG90KGRpdldpZHRoLCBkaXZIZWlnaHQsIGVsKSB7XG4gICAgY29uc3QgW3dpZHRoLCBoZWlnaHRdID0gdGhpcy5jbGVhckFuZFNjYWxlU3ZnKGRpdldpZHRoLCBkaXZIZWlnaHQpO1xuICAgIHRoaXMuZHJhd1RpdGxlKCk7XG5cbiAgICBpZiAoIXRoaXMuZGF0YUlzVmFsaWQpIHtcbiAgICAgIHRoaXMuc2hvd0Vycm9yTWVzc2FnZShkaXZXaWR0aCwgZGl2SGVpZ2h0KTtcbiAgICAgIHJldHVybiB0aGlzLndyYXBwZXIuaW5uZXJIVE1MO1xuICAgIH1cblxuICAgIGNvbnN0IHN1Ymdyb3VwcyA9IE9iamVjdC5rZXlzKHRoaXMuZGF0YVtcIm92ZXJhbGxcIl1bMF0pO1xuICAgIGNvbnN0IGdyb3VwcyA9IE9iamVjdC5rZXlzKHRoaXMuZGF0YSk7XG5cbiAgICBjb25zdCBkYXRhID0gT2JqZWN0LmtleXModGhpcy5kYXRhKS5yZWR1Y2UoKGFjYywga2V5KSA9PiBbLi4uYWNjLCB7IC4uLnRoaXMuZGF0YVtrZXldWzBdLCBncm91cDoga2V5IH1dLCBbXSk7XG5cbiAgICBjb25zdCBzdGFja2VkRGF0YSA9IGQzLnN0YWNrKCkua2V5cyhzdWJncm91cHMpKGRhdGEpO1xuXG4gICAgY29uc3QgbWluID0gc3RhY2tlZERhdGFbMF1bMF1bMF07XG4gICAgY29uc3QgbWF4ID0gc3RhY2tlZERhdGFbc3RhY2tlZERhdGEubGVuZ3RoIC0gMV1bMF1bMV07XG5cbiAgICBjb25zdCB4ID0gZDMuc2NhbGVCYW5kKCkuZG9tYWluKGdyb3VwcykucmFuZ2UoWzAsIHdpZHRoXSkucGFkZGluZyhbMC4yXSk7XG4gICAgdGhpcy5nLmFwcGVuZChcImdcIikuYXR0cihcInRyYW5zZm9ybVwiLCBgdHJhbnNsYXRlKDAsICR7aGVpZ2h0fSlgKS5jYWxsKGQzLmF4aXNCb3R0b20oeCkudGlja1NpemVPdXRlcigwKSk7XG5cbiAgICBjb25zdCB5ID0gZDMuc2NhbGVMaW5lYXIoKS5kb21haW4oW21pbiwgbWF4XSkucmFuZ2UoW2hlaWdodCwgMF0pO1xuICAgIHRoaXMuZy5hcHBlbmQoXCJnXCIpLmNhbGwoZDMuYXhpc0xlZnQoeSkpO1xuXG4gICAgY29uc3QgY29sb3IgPSBkMy5zY2FsZU9yZGluYWwoKS5kb21haW4oW1wib3ZlcmFsbFwiXSkucmFuZ2UodGhpcy5jb2xvclJhbmdlKTtcblxuICAgIHRoaXMuZ1xuICAgICAgLmFwcGVuZChcImdcIilcbiAgICAgIC5zZWxlY3RBbGwoXCJnXCIpXG4gICAgICAuZGF0YShzdGFja2VkRGF0YSlcbiAgICAgIC5qb2luKFwiZ1wiKVxuICAgICAgLmF0dHIoXCJmaWxsXCIsIChkKSA9PiBjb2xvcihkLmtleSkpXG4gICAgICAuc2VsZWN0QWxsKFwicmVjdFwiKVxuICAgICAgLmRhdGEoKGQpID0+IGQpXG4gICAgICAuam9pbihcInJlY3RcIilcbiAgICAgIC5hdHRyKFwieFwiLCAoZCkgPT4ge1xuICAgICAgICByZXR1cm4geChkLmRhdGEuZ3JvdXApO1xuICAgICAgfSlcbiAgICAgIC5hdHRyKFwieFwiLCAoZCkgPT4geChkLmRhdGEuZ3JvdXApKVxuICAgICAgLmF0dHIoXCJ5XCIsIChkKSA9PiB5KGRbMV0pKVxuICAgICAgLmF0dHIoXCJoZWlnaHRcIiwgKGQpID0+IHkoZFswXSkgLSB5KGRbMV0pKVxuICAgICAgLmF0dHIoXCJ3aWR0aFwiLCB4LmJhbmR3aWR0aCgpKTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMuc2hvd0xlZ2VuZCkgdGhpcy5zaG93TGVnZW5kKHN1Ymdyb3VwcywgY29sb3IsIGRpdldpZHRoKTtcblxuICAgIHJldHVybiB0aGlzLndyYXBwZXIuaW5uZXJIVE1MO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBkMyBmcm9tIFwiZDNcIjtcbmltcG9ydCB7QmFzZUNoYXJ0V2lkZ2V0fSBmcm9tIFwiLi9iYXNlXCI7XG5cbi8vIENvcHlyaWdodCAyMDIxIE9ic2VydmFibGUsIEluYy5cbi8vIFJlbGVhc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZS5cbi8vIGh0dHBzOi8vb2JzZXJ2YWJsZWhxLmNvbS9AZDMvZ3JvdXBlZC1iYXItY2hhcnRcblxuXG5leHBvcnQgY2xhc3MgR3JvdXBlZEJhckNoYXJ0V2lkZ2V0IGV4dGVuZHMgQmFzZUNoYXJ0V2lkZ2V0IHtcblxuICBjb25zdHJ1Y3Rvcih0aXRsZVRleHQsIGRlc2NyaXB0aW9uLCBkYXRhLCB7XG4gICAgdHJhbnNmb3JtLCAvLyBkYXRhIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9uXG4gICAgeCA9IChkLCBpKSA9PiBpLCAvLyBnaXZlbiBkIGluIGRhdGEsIHJldHVybnMgdGhlIChvcmRpbmFsKSB4LXZhbHVlXG4gICAgeSA9IGQgPT4gZCwgLy8gZ2l2ZW4gZCBpbiBkYXRhLCByZXR1cm5zIHRoZSAocXVhbnRpdGF0aXZlKSB5LXZhbHVlXG4gICAgeiA9ICgpID0+IDEsIC8vIGdpdmVuIGQgaW4gZGF0YSwgcmV0dXJucyB0aGUgKGNhdGVnb3JpY2FsKSB6LXZhbHVlXG4gICAgdGl0bGUsIC8vIGdpdmVuIGQgaW4gZGF0YSwgcmV0dXJucyB0aGUgdGl0bGUgdGV4dFxuICAgIG1hcmdpblRvcCA9IDAsIC8vIHRvcCBtYXJnaW4sIGluIHBpeGVsc1xuICAgIG1hcmdpblJpZ2h0ID0gMCwgLy8gcmlnaHQgbWFyZ2luLCBpbiBwaXhlbHNcbiAgICBtYXJnaW5Cb3R0b20gPSAwLCAvLyBib3R0b20gbWFyZ2luLCBpbiBwaXhlbHNcbiAgICBtYXJnaW5MZWZ0ID0gNDAsIC8vIGxlZnQgbWFyZ2luLCBpbiBwaXhlbHNcbiAgICB3aWR0aCA9IDY0MCwgLy8gb3V0ZXIgd2lkdGgsIGluIHBpeGVsc1xuICAgIGhlaWdodCA9IDQwMCwgLy8gb3V0ZXIgaGVpZ2h0LCBpbiBwaXhlbHNcbiAgICB4RG9tYWluLCAvLyBhcnJheSBvZiB4LXZhbHVlc1xuICAgIHhSYW5nZSA9IFttYXJnaW5MZWZ0LCB3aWR0aCAtIG1hcmdpblJpZ2h0XSwgLy8gW3htaW4sIHhtYXhdXG4gICAgeFBhZGRpbmcgPSAwLjEsIC8vIGFtb3VudCBvZiB4LXJhbmdlIHRvIHJlc2VydmUgdG8gc2VwYXJhdGUgZ3JvdXBzXG4gICAgeVR5cGUgPSBkMy5zY2FsZUxpbmVhciwgLy8gdHlwZSBvZiB5LXNjYWxlXG4gICAgeURvbWFpbiwgLy8gW3ltaW4sIHltYXhdXG4gICAgeVJhbmdlID0gW2hlaWdodCAtIG1hcmdpbkJvdHRvbSwgbWFyZ2luVG9wXSwgLy8gW3ltaW4sIHltYXhdXG4gICAgekRvbWFpbiwgLy8gYXJyYXkgb2Ygei12YWx1ZXNcbiAgICB6UGFkZGluZyA9IDAuMDUsIC8vIGFtb3VudCBvZiB4LXJhbmdlIHRvIHJlc2VydmUgdG8gc2VwYXJhdGUgYmFyc1xuICAgIHlGb3JtYXQsIC8vIGEgZm9ybWF0IHNwZWNpZmllciBzdHJpbmcgZm9yIHRoZSB5LWF4aXNcbiAgICB5TGFiZWwsIC8vIGEgbGFiZWwgZm9yIHRoZSB5LWF4aXNcbiAgICBjb2xvcnMgPSBkMy5zY2hlbWVUYWJsZWF1MTAsIC8vIGFycmF5IG9mIGNvbG9yc1xuICAgIGRyYXdMZWdlbmQgPSB0cnVlXG4gIH0pIHtcblxuICAgIGlmICh0cmFuc2Zvcm0pXG4gICAgICBkYXRhID0gKGRhdGEgPz8gW10pLm1hcCh0cmFuc2Zvcm0pO1xuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIHRyYW5zZm9ybSxcbiAgICAgIHgsXG4gICAgICB5LFxuICAgICAgeixcbiAgICAgIHRpdGxlLFxuICAgICAgbWFyZ2luVG9wLFxuICAgICAgbWFyZ2luUmlnaHQsXG4gICAgICBtYXJnaW5Cb3R0b20sXG4gICAgICBtYXJnaW5MZWZ0LFxuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICB4RG9tYWluLFxuICAgICAgeFJhbmdlLFxuICAgICAgeFBhZGRpbmcsXG4gICAgICB5VHlwZSxcbiAgICAgIHlEb21haW4sXG4gICAgICB5UmFuZ2UsXG4gICAgICB6RG9tYWluLFxuICAgICAgelBhZGRpbmcsXG4gICAgICB5Rm9ybWF0LCAvLyBhIGZvcm1hdCBzcGVjaWZpZXIgc3RyaW5nIGZvciB0aGUgeS1heGlzXG4gICAgICB5TGFiZWwsIC8vIGEgbGFiZWwgZm9yIHRoZSB5LWF4aXNcbiAgICAgIGNvbG9ycyxcbiAgICAgIGRyYXdMZWdlbmRcbiAgICB9XG4gICAgc3VwZXIodGl0bGUsIGRlc2NyaXB0aW9uLCBkYXRhLCBvcHRpb25zKTtcblxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnNcbiAgICB0aGlzLmRhdGEgPSBkYXRhXG5cbiAgICB0aGlzLndyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIHRoaXMuc3ZnID0gZDMuc2VsZWN0KHRoaXMud3JhcHBlcikuYXBwZW5kKFwic3ZnXCIpO1xuICB9XG5cbiAgcGxvdChkaXZXaWR0aCwgZGl2SGVpZ2h0LCBlbCkge1xuICAgIGxldCBbdywgaF0gPSB0aGlzLmNsZWFyQW5kU2NhbGVTdmcoZGl2V2lkdGgsIGRpdkhlaWdodCk7XG4gICAvLyB0aGlzLmRyYXdUaXRsZSgpO1xuXG4gICAgbGV0IHtcbiAgICAgIHgsXG4gICAgICB5LFxuICAgICAgeixcbiAgICAgIHRpdGxlLFxuICAgICAgbWFyZ2luVG9wLFxuICAgICAgbWFyZ2luUmlnaHQsXG4gICAgICBtYXJnaW5Cb3R0b20sXG4gICAgICBtYXJnaW5MZWZ0LFxuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICB4RG9tYWluLFxuICAgICAgeFJhbmdlLFxuICAgICAgeFBhZGRpbmcsXG4gICAgICB5VHlwZSxcbiAgICAgIHlEb21haW4sXG4gICAgICB5UmFuZ2UsXG4gICAgICB6RG9tYWluLFxuICAgICAgelBhZGRpbmcsXG4gICAgICB5Rm9ybWF0LCAvLyBhIGZvcm1hdCBzcGVjaWZpZXIgc3RyaW5nIGZvciB0aGUgeS1heGlzXG4gICAgICB5TGFiZWwsIC8vIGEgbGFiZWwgZm9yIHRoZSB5LWF4aXNcbiAgICAgIGNvbG9ycyxcbiAgICAgIGRyYXdMZWdlbmRcbiAgICB9ID0gdGhpcy5vcHRpb25zXG5cbiAgICBjb25zdCBsYWJlbE9mZnNldCA9IDE1XG5cbiAgICAgd2lkdGggPSB3XG4gICAgIGhlaWdodCA9IGggKyAxNTBcbiAgICAgbWFyZ2luVG9wID0gbGFiZWxPZmZzZXQgKiAoekRvbWFpbj8/W10pLmxlbmd0aFxuICAgICBtYXJnaW5SaWdodCA9IHRoaXMubWFyZ2luUmlnaHRcbiAgICAgbWFyZ2luQm90dG9tID0gdGhpcy5tYXJnaW5Cb3R0b21cbiAgICAgeVJhbmdlID0gIFtoZWlnaHQgLSBtYXJnaW5Cb3R0b20sIG1hcmdpblRvcF1cbiAgICAgeFJhbmdlID0gIFttYXJnaW5MZWZ0LCB3aWR0aCAtIG1hcmdpblJpZ2h0XVxuXG4gICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YVxuICAgIGNvbnN0IFggPSBkMy5tYXAoZGF0YSwgeCk7XG4gICAgY29uc3QgWSA9IGQzLm1hcChkYXRhLCB5KTtcbiAgICBjb25zdCBaID0gZDMubWFwKGRhdGEsIHopO1xuXG4gICAgLy8gQ29tcHV0ZSBkZWZhdWx0IGRvbWFpbnMsIGFuZCB1bmlxdWUgdGhlIHgtIGFuZCB6LWRvbWFpbnMuXG4gICAgaWYgKHhEb21haW4gPT09IHVuZGVmaW5lZCkgeERvbWFpbiA9IFg7XG4gICAgaWYgKHlEb21haW4gPT09IHVuZGVmaW5lZCkgeURvbWFpbiA9IFswLCBkMy5tYXgoWSldO1xuICAgIGlmICh6RG9tYWluID09PSB1bmRlZmluZWQpIHpEb21haW4gPSBaO1xuICAgIHhEb21haW4gPSBuZXcgZDMuSW50ZXJuU2V0KHhEb21haW4pO1xuICAgIHpEb21haW4gPSBuZXcgZDMuSW50ZXJuU2V0KHpEb21haW4pO1xuXG4gICAgLy8gT21pdCBhbnkgZGF0YSBub3QgcHJlc2VudCBpbiBib3RoIHRoZSB4LSBhbmQgei1kb21haW4uXG4gICAgY29uc3QgSSA9IGQzLnJhbmdlKFgubGVuZ3RoKS5maWx0ZXIoaSA9PiB4RG9tYWluLmhhcyhYW2ldKSAmJiB6RG9tYWluLmhhcyhaW2ldKSk7XG5cbiAgICAvLyBDb25zdHJ1Y3Qgc2NhbGVzLCBheGVzLCBhbmQgZm9ybWF0cy5cbiAgICBjb25zdCB4U2NhbGUgPSBkMy5zY2FsZUJhbmQoeERvbWFpbiwgeFJhbmdlKS5wYWRkaW5nSW5uZXIoeFBhZGRpbmcpO1xuICAgIGNvbnN0IHh6U2NhbGUgPSBkMy5zY2FsZUJhbmQoekRvbWFpbiwgWzAsIHhTY2FsZS5iYW5kd2lkdGgoKV0pLnBhZGRpbmcoelBhZGRpbmcpO1xuICAgIGNvbnN0IHlTY2FsZSA9IHlUeXBlKHlEb21haW4sIHlSYW5nZSk7XG4gICAgY29uc3QgelNjYWxlID0gZDMuc2NhbGVPcmRpbmFsKHpEb21haW4sIGNvbG9ycyk7XG4gICAgY29uc3QgeEF4aXMgPSBkMy5heGlzQm90dG9tKHhTY2FsZSkudGlja1NpemVPdXRlcigwKTtcbiAgICBjb25zdCB5QXhpcyA9IGQzLmF4aXNMZWZ0KHlTY2FsZSkudGlja3MoaGVpZ2h0IC8gNjAsIHlGb3JtYXQpO1xuXG4gICAgLy8gQ29tcHV0ZSB0aXRsZXMuXG4gICAgaWYgKHRpdGxlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGZvcm1hdFZhbHVlID0geVNjYWxlLnRpY2tGb3JtYXQoMTAwLCB5Rm9ybWF0KTtcbiAgICAgIHRpdGxlID0gaSA9PiBgJHtYW2ldfVxcbiR7WltpXX1cXG4ke2Zvcm1hdFZhbHVlKFlbaV0pfWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IE8gPSBkMy5tYXAoZGF0YSwgZCA9PiBkKTtcbiAgICAgIGNvbnN0IFQgPSB0aXRsZTtcbiAgICAgIHRpdGxlID0gaSA9PiBUKE9baV0sIGksIGRhdGEpO1xuICAgIH1cblxuICAgIHRoaXMuZy5hcHBlbmQoXCJnXCIpXG4gICAgICAgIC5hdHRyKFwidHJhbnNmb3JtXCIsIGB0cmFuc2xhdGUoJHttYXJnaW5MZWZ0fSwwKWApXG4gICAgICAgIC5jYWxsKHlBeGlzKVxuICAgICAgICAuY2FsbChnID0+IGcuc2VsZWN0KFwiLmRvbWFpblwiKS5yZW1vdmUoKSlcbiAgICAgICAgLmNhbGwoZyA9PiBnLnNlbGVjdEFsbChcIi50aWNrIGxpbmVcIikuY2xvbmUoKVxuICAgICAgICAgICAgLmF0dHIoXCJ4MlwiLCB3aWR0aCAtIG1hcmdpbkxlZnQgLSBtYXJnaW5SaWdodClcbiAgICAgICAgICAgIC5hdHRyKFwic3Ryb2tlLW9wYWNpdHlcIiwgMC4xKSlcbiAgICAgICAgLmNhbGwoZyA9PiBnLmFwcGVuZChcInRleHRcIilcbiAgICAgICAgICAgIC5hdHRyKFwieFwiLCAtbWFyZ2luTGVmdClcbiAgICAgICAgICAgIC5hdHRyKFwieVwiLCAxMDApXG4gICAgICAgICAgICAuYXR0cihcImZpbGxcIiwgXCJjdXJyZW50Q29sb3JcIilcbiAgICAgICAgICAgIC5hdHRyKFwidGV4dC1hbmNob3JcIiwgXCJzdGFydFwiKVxuICAgICAgICAgICAgLnRleHQoeUxhYmVsKSk7XG5cbiAgICB0aGlzLmcuYXBwZW5kKFwiZ1wiKVxuICAgICAgICAuc2VsZWN0QWxsKFwicmVjdFwiKVxuICAgICAgICAuZGF0YShJKVxuICAgICAgICAuam9pbihcInJlY3RcIilcbiAgICAgICAgLmF0dHIoXCJ4XCIsIGkgPT4geFNjYWxlKFhbaV0pICsgeHpTY2FsZShaW2ldKSlcbiAgICAgICAgLmF0dHIoXCJ5XCIsIGkgPT4geVNjYWxlKFlbaV0pKVxuICAgICAgICAuYXR0cihcIndpZHRoXCIsIHh6U2NhbGUuYmFuZHdpZHRoKCkpXG4gICAgICAgIC5hdHRyKFwiaGVpZ2h0XCIsIGkgPT4geVNjYWxlKDApIC0geVNjYWxlKFlbaV0pKVxuICAgICAgICAuYXR0cihcImZpbGxcIiwgaSA9PiB6U2NhbGUoWltpXSkpXG5cbiAgICBpZihkcmF3TGVnZW5kKVxuICAgIHtcbiAgICAgIC8vIGN1c3RvbSBsZWdlbmRcbiAgICAgIGxldCBydW5uZXIgPSAyO1xuICAgICAgKHpEb21haW4/P1tdKS5mb3JFYWNoKCAoZWxlKSA9PiB7XG4gICAgICBydW5uZXIrPTFcbiAgICAgIGNvbnN0IGNvbG9yID0gelNjYWxlKGVsZSlcbiAgICAgIGNvbnN0IHlPZmZzZXQgPSAobGFiZWxPZmZzZXQgKiBydW5uZXIpICAvIDJcbiAgICAgIGNvbnN0IHhPZmZzZXQgPSBydW5uZXIlMj8gMCA6IDIwMFxuICAgICAgdGhpcy5nLmFwcGVuZChcImNpcmNsZVwiKS5hdHRyKFwiY3hcIix4T2Zmc2V0KS5hdHRyKFwiY3lcIix5T2Zmc2V0KS5hdHRyKFwiclwiLCA1KS5zdHlsZShcImZpbGxcIixjb2xvcilcbiAgICAgIHRoaXMuZy5hcHBlbmQoXCJ0ZXh0XCIpLmF0dHIoXCJ4XCIsIHhPZmZzZXQgKyAxMCkuYXR0cihcInlcIiwgeU9mZnNldCArNCkudGV4dChlbGUpLnN0eWxlKFwiZm9udC1zaXplXCIsIFwiMTVweFwiKS5hdHRyKFwiYWxpZ25tZW50LWJhc2VsaW5lXCIsXCJtaWRkbGVcIilcbiAgICAgIH0pXG4gICAgfVxuXG5cbiAgICBpZiAodGl0bGUpIHRoaXMuZy5hcHBlbmQoXCJ0aXRsZVwiKVxuICAgICAgICAudGV4dCh0aXRsZSk7XG5cbiAgICB0aGlzLmcuYXBwZW5kKFwiZ1wiKVxuICAgICAgICAuYXR0cihcInRyYW5zZm9ybVwiLCBgdHJhbnNsYXRlKDAsJHtoZWlnaHQgLSBtYXJnaW5Cb3R0b219KWApXG4gICAgICAgIC5jYWxsKHhBeGlzKTtcblxuICAgIHJldHVybiB0aGlzLndyYXBwZXIuaW5uZXJIVE1MO1xuXG4gIH1cblxufVxuIiwiaW1wb3J0ICogYXMgZDMgZnJvbSBcImQzXCI7XG5pbXBvcnQge0Jhc2VDaGFydFdpZGdldH0gZnJvbSBcIi4vYmFzZVwiO1xuXG4vLyBDb3B5cmlnaHQgMjAyMSBPYnNlcnZhYmxlLCBJbmMuXG4vLyBSZWxlYXNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UuXG4vLyBodHRwczovL29ic2VydmFibGVocS5jb20vQGQzL2dyb3VwZWQtYmFyLWNoYXJ0XG5cblxuZXhwb3J0IGNsYXNzIFNpbXBsZUdyb3VwZWRCYXJDaGFydFdpZGdldCBleHRlbmRzIEJhc2VDaGFydFdpZGdldCB7XG5cbiAgY29uc3RydWN0b3IodGl0bGVUZXh0LCBkZXNjcmlwdGlvbiwgZGljdCwge1xuICAgIHRpdGxlLCAvLyBnaXZlbiBkIGluIGRhdGEsIHJldHVybnMgdGhlIHRpdGxlIHRleHRcbiAgICBtYXJnaW5Ub3AgPSAwLCAvLyB0b3AgbWFyZ2luLCBpbiBwaXhlbHNcbiAgICBtYXJnaW5SaWdodCA9IDAsIC8vIHJpZ2h0IG1hcmdpbiwgaW4gcGl4ZWxzXG4gICAgbWFyZ2luQm90dG9tID0gMCwgLy8gYm90dG9tIG1hcmdpbiwgaW4gcGl4ZWxzXG4gICAgbWFyZ2luTGVmdCA9IDQwLCAvLyBsZWZ0IG1hcmdpbiwgaW4gcGl4ZWxzXG4gICAgd2lkdGggPSA2NDAsIC8vIG91dGVyIHdpZHRoLCBpbiBwaXhlbHNcbiAgICBoZWlnaHQgPSA0MDAsIC8vIG91dGVyIGhlaWdodCwgaW4gcGl4ZWxzXG4gICAgeERvbWFpbiwgLy8gYXJyYXkgb2YgeC12YWx1ZXNcbiAgICB4UmFuZ2UgPSBbbWFyZ2luTGVmdCwgd2lkdGggLSBtYXJnaW5SaWdodF0sIC8vIFt4bWluLCB4bWF4XVxuICAgIHhQYWRkaW5nID0gMC4xLCAvLyBhbW91bnQgb2YgeC1yYW5nZSB0byByZXNlcnZlIHRvIHNlcGFyYXRlIGdyb3Vwc1xuICAgIHlUeXBlID0gZDMuc2NhbGVMaW5lYXIsIC8vIHR5cGUgb2YgeS1zY2FsZVxuICAgIHlEb21haW4sIC8vIFt5bWluLCB5bWF4XVxuICAgIHlSYW5nZSA9IFtoZWlnaHQgLSBtYXJnaW5Cb3R0b20sIG1hcmdpblRvcF0sIC8vIFt5bWluLCB5bWF4XVxuICAgIHpEb21haW4sIC8vIGFycmF5IG9mIHotdmFsdWVzXG4gICAgelBhZGRpbmcgPSAwLjA1LCAvLyBhbW91bnQgb2YgeC1yYW5nZSB0byByZXNlcnZlIHRvIHNlcGFyYXRlIGJhcnNcbiAgICB5Rm9ybWF0LCAvLyBhIGZvcm1hdCBzcGVjaWZpZXIgc3RyaW5nIGZvciB0aGUgeS1heGlzXG4gICAgeUxhYmVsLCAvLyBhIGxhYmVsIGZvciB0aGUgeS1heGlzXG4gICAgY29sb3JzID0gZDMuc2NoZW1lVGFibGVhdTEwLCAvLyBhcnJheSBvZiBjb2xvcnNcbiAgICBkcmF3TGVnZW5kID0gdHJ1ZVxuICB9ID0ge30pIHtcblxuICAgIGNvbnN0IGRhdGEgPSBPYmplY3Qua2V5cyhkaWN0KS5yZWR1Y2UoIChhZ2csIGtleSkgPT4gWy4uLmFnZywgey4uLmRpY3Rba2V5XSwgbmFtZSA6IGtleX1dLCBbXSlcbiAgICBjb25zdCBjYXRlZ29yaWVzID0gQXJyYXkuZnJvbSggbmV3IFNldChcbiAgICAgICAgZGF0YS5mbGF0TWFwKFxuICAgICAgICAgICAgICBpdGVtID0+IE9iamVjdC5rZXlzKGl0ZW0pXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICApKS5maWx0ZXIocyA9PiBzICE9IFwibmFtZVwiKTtcblxuICAgIGNvbnN0IG5hbWVzID0gZGF0YS5yZWR1Y2UoIChhZ2csIGN1cnIpID0+IFsuLi5hZ2csIGN1cnJbXCJuYW1lXCJdXSwgW10pXG4gICAgY29uc3QgZGF0YUZsYXR0ZWQgPSBjYXRlZ29yaWVzLmZsYXRNYXAoY2F0ZWdvcnkgPT4gZGF0YS5tYXAoZCA9PiAoe25hbWUgOiBkLm5hbWUsIGNhdGVnb3J5IDogY2F0ZWdvcnksIHZhbHVlOiBkW2NhdGVnb3J5XX0pKSkgLy8gcGl2b3QgbG9uZ2VyXG5cbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgeDogZCA9PiBkLm5hbWUsXG4gICAgICB5OiBkID0+IGQudmFsdWUsXG4gICAgICB6OiBkID0+IGQuY2F0ZWdvcnksXG4gICAgICB0aXRsZSxcbiAgICAgIG1hcmdpblRvcCxcbiAgICAgIG1hcmdpblJpZ2h0LFxuICAgICAgbWFyZ2luQm90dG9tLFxuICAgICAgbWFyZ2luTGVmdCxcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgeFJhbmdlLFxuICAgICAgeFBhZGRpbmcsXG4gICAgICB5VHlwZSxcbiAgICAgIHlEb21haW4sXG4gICAgICB5UmFuZ2UsXG4gICAgICB6RG9tYWluLFxuICAgICAgelBhZGRpbmcsXG4gICAgICB5Rm9ybWF0LCAvLyBhIGZvcm1hdCBzcGVjaWZpZXIgc3RyaW5nIGZvciB0aGUgeS1heGlzXG4gICAgICB5TGFiZWwsIC8vIGEgbGFiZWwgZm9yIHRoZSB5LWF4aXNcbiAgICAgIGRyYXdMZWdlbmQsICAgICAgXG4gICAgICB4RG9tYWluOiBuYW1lcyxcbiAgICAgIC8veURvbWFpbiA6IFswLDQwXSxcbiAgICAgIHpEb21haW46IGNhdGVnb3JpZXMsXG4gICAgICBjb2xvcnM6IGQzLnNjaGVtZVNwZWN0cmFsW2NhdGVnb3JpZXMubGVuZ3RoIDwgMTAgPyAxMCA6IGNhdGVnb3JpZXMubGVuZ3RoXVxuICAgIH1cbiAgICBzdXBlcih0aXRsZSwgZGVzY3JpcHRpb24sIGRhdGFGbGF0dGVkLCBvcHRpb25zKTtcblxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnNcbiAgICB0aGlzLmRhdGFGbGF0dGVkID1kYXRhRmxhdHRlZFxuXG4gICAgdGhpcy53cmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICB0aGlzLnN2ZyA9IGQzLnNlbGVjdCh0aGlzLndyYXBwZXIpLmFwcGVuZChcInN2Z1wiKTtcbiAgfVxuXG4gIHBsb3QoZGl2V2lkdGgsIGRpdkhlaWdodCwgZWwpIHtcbiAgICBsZXQgW3csIGhdID0gdGhpcy5jbGVhckFuZFNjYWxlU3ZnKGRpdldpZHRoLCBkaXZIZWlnaHQpO1xuICAgLy8gdGhpcy5kcmF3VGl0bGUoKTtcblxuICAgIGxldCB7XG4gICAgICB4LFxuICAgICAgeSxcbiAgICAgIHosXG4gICAgICB0aXRsZSxcbiAgICAgIG1hcmdpblRvcCxcbiAgICAgIG1hcmdpblJpZ2h0LFxuICAgICAgbWFyZ2luQm90dG9tLFxuICAgICAgbWFyZ2luTGVmdCxcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgeERvbWFpbixcbiAgICAgIHhSYW5nZSxcbiAgICAgIHhQYWRkaW5nLFxuICAgICAgeVR5cGUsXG4gICAgICB5RG9tYWluLFxuICAgICAgeVJhbmdlLFxuICAgICAgekRvbWFpbixcbiAgICAgIHpQYWRkaW5nLFxuICAgICAgeUZvcm1hdCwgLy8gYSBmb3JtYXQgc3BlY2lmaWVyIHN0cmluZyBmb3IgdGhlIHktYXhpc1xuICAgICAgeUxhYmVsLCAvLyBhIGxhYmVsIGZvciB0aGUgeS1heGlzXG4gICAgICBjb2xvcnMsXG4gICAgICBkcmF3TGVnZW5kXG4gICAgfSA9IHRoaXMub3B0aW9uc1xuXG4gICAgY29uc3QgbGFiZWxPZmZzZXQgPSAxNVxuXG4gICAgIHdpZHRoID0gd1xuICAgICBoZWlnaHQgPSBoICsgMTUwXG4gICAgIG1hcmdpblRvcCA9IGxhYmVsT2Zmc2V0ICogKHpEb21haW4/P1tdKS5sZW5ndGhcbiAgICAgbWFyZ2luUmlnaHQgPSB0aGlzLm1hcmdpblJpZ2h0XG4gICAgIG1hcmdpbkJvdHRvbSA9IHRoaXMubWFyZ2luQm90dG9tXG4gICAgIHlSYW5nZSA9ICBbaGVpZ2h0IC0gbWFyZ2luQm90dG9tLCBtYXJnaW5Ub3BdXG4gICAgIHhSYW5nZSA9ICBbbWFyZ2luTGVmdCwgd2lkdGggLSBtYXJnaW5SaWdodF1cblxuICAgIGNvbnN0IGRhdGFGbGF0dGVkID0gdGhpcy5kYXRhRmxhdHRlZFxuICAgIGNvbnN0IFggPSBkMy5tYXAoZGF0YUZsYXR0ZWQsIHgpO1xuICAgIGNvbnN0IFkgPSBkMy5tYXAoZGF0YUZsYXR0ZWQsIHkpO1xuICAgIGNvbnN0IFogPSBkMy5tYXAoZGF0YUZsYXR0ZWQsIHopO1xuXG4gICAgLy8gQ29tcHV0ZSBkZWZhdWx0IGRvbWFpbnMsIGFuZCB1bmlxdWUgdGhlIHgtIGFuZCB6LWRvbWFpbnMuXG4gICAgaWYgKHhEb21haW4gPT09IHVuZGVmaW5lZCkgeERvbWFpbiA9IFg7XG4gICAgaWYgKHlEb21haW4gPT09IHVuZGVmaW5lZCkgeURvbWFpbiA9IFswLCBkMy5tYXgoWSldO1xuICAgIGlmICh6RG9tYWluID09PSB1bmRlZmluZWQpIHpEb21haW4gPSBaO1xuICAgIHhEb21haW4gPSBuZXcgZDMuSW50ZXJuU2V0KHhEb21haW4pO1xuICAgIHpEb21haW4gPSBuZXcgZDMuSW50ZXJuU2V0KHpEb21haW4pO1xuXG4gICAgLy8gT21pdCBhbnkgZGF0YSBub3QgcHJlc2VudCBpbiBib3RoIHRoZSB4LSBhbmQgei1kb21haW4uXG4gICAgY29uc3QgSSA9IGQzLnJhbmdlKFgubGVuZ3RoKS5maWx0ZXIoaSA9PiB4RG9tYWluLmhhcyhYW2ldKSAmJiB6RG9tYWluLmhhcyhaW2ldKSk7XG5cbiAgICAvLyBDb25zdHJ1Y3Qgc2NhbGVzLCBheGVzLCBhbmQgZm9ybWF0cy5cbiAgICBjb25zdCB4U2NhbGUgPSBkMy5zY2FsZUJhbmQoeERvbWFpbiwgeFJhbmdlKS5wYWRkaW5nSW5uZXIoeFBhZGRpbmcpO1xuICAgIGNvbnN0IHh6U2NhbGUgPSBkMy5zY2FsZUJhbmQoekRvbWFpbiwgWzAsIHhTY2FsZS5iYW5kd2lkdGgoKV0pLnBhZGRpbmcoelBhZGRpbmcpO1xuICAgIGNvbnN0IHlTY2FsZSA9IHlUeXBlKHlEb21haW4sIHlSYW5nZSk7XG4gICAgY29uc3QgelNjYWxlID0gZDMuc2NhbGVPcmRpbmFsKHpEb21haW4sIGNvbG9ycyk7XG4gICAgY29uc3QgeEF4aXMgPSBkMy5heGlzQm90dG9tKHhTY2FsZSkudGlja1NpemVPdXRlcigwKTtcbiAgICBjb25zdCB5QXhpcyA9IGQzLmF4aXNMZWZ0KHlTY2FsZSkudGlja3MoaGVpZ2h0IC8gNjAsIHlGb3JtYXQpO1xuXG4gICAgLy8gQ29tcHV0ZSB0aXRsZXMuXG4gICAgaWYgKHRpdGxlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGZvcm1hdFZhbHVlID0geVNjYWxlLnRpY2tGb3JtYXQoMTAwLCB5Rm9ybWF0KTtcbiAgICAgIHRpdGxlID0gaSA9PiBgJHtYW2ldfVxcbiR7WltpXX1cXG4ke2Zvcm1hdFZhbHVlKFlbaV0pfWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IE8gPSBkMy5tYXAoZGF0YUZsYXR0ZWQsIGQgPT4gZCk7XG4gICAgICBjb25zdCBUID0gdGl0bGU7XG4gICAgICB0aXRsZSA9IGkgPT4gVChPW2ldLCBpLCBkYXRhRmxhdHRlZCk7XG4gICAgfVxuXG4gICAgdGhpcy5nLmFwcGVuZChcImdcIilcbiAgICAgICAgLmF0dHIoXCJ0cmFuc2Zvcm1cIiwgYHRyYW5zbGF0ZSgke21hcmdpbkxlZnR9LDApYClcbiAgICAgICAgLmNhbGwoeUF4aXMpXG4gICAgICAgIC5jYWxsKGcgPT4gZy5zZWxlY3QoXCIuZG9tYWluXCIpLnJlbW92ZSgpKVxuICAgICAgICAuY2FsbChnID0+IGcuc2VsZWN0QWxsKFwiLnRpY2sgbGluZVwiKS5jbG9uZSgpXG4gICAgICAgICAgICAuYXR0cihcIngyXCIsIHdpZHRoIC0gbWFyZ2luTGVmdCAtIG1hcmdpblJpZ2h0KVxuICAgICAgICAgICAgLmF0dHIoXCJzdHJva2Utb3BhY2l0eVwiLCAwLjEpKVxuICAgICAgICAuY2FsbChnID0+IGcuYXBwZW5kKFwidGV4dFwiKVxuICAgICAgICAgICAgLmF0dHIoXCJ4XCIsIC1tYXJnaW5MZWZ0KVxuICAgICAgICAgICAgLmF0dHIoXCJ5XCIsIDEwMClcbiAgICAgICAgICAgIC5hdHRyKFwiZmlsbFwiLCBcImN1cnJlbnRDb2xvclwiKVxuICAgICAgICAgICAgLmF0dHIoXCJ0ZXh0LWFuY2hvclwiLCBcInN0YXJ0XCIpXG4gICAgICAgICAgICAudGV4dCh5TGFiZWwpKTtcblxuICAgIHRoaXMuZy5hcHBlbmQoXCJnXCIpXG4gICAgICAgIC5zZWxlY3RBbGwoXCJyZWN0XCIpXG4gICAgICAgIC5kYXRhKEkpXG4gICAgICAgIC5qb2luKFwicmVjdFwiKVxuICAgICAgICAuYXR0cihcInhcIiwgaSA9PiB4U2NhbGUoWFtpXSkgKyB4elNjYWxlKFpbaV0pKVxuICAgICAgICAuYXR0cihcInlcIiwgaSA9PiB5U2NhbGUoWVtpXSkpXG4gICAgICAgIC5hdHRyKFwid2lkdGhcIiwgeHpTY2FsZS5iYW5kd2lkdGgoKSlcbiAgICAgICAgLmF0dHIoXCJoZWlnaHRcIiwgaSA9PiB5U2NhbGUoMCkgLSB5U2NhbGUoWVtpXSkpXG4gICAgICAgIC5hdHRyKFwiZmlsbFwiLCBpID0+IHpTY2FsZShaW2ldKSlcblxuICAgIGlmKGRyYXdMZWdlbmQpXG4gICAge1xuICAgICAgLy8gY3VzdG9tIGxlZ2VuZFxuICAgICBsZXQgcnVubmVyID0gMjtcbiAgICAgICh6RG9tYWluPz9bXSkuZm9yRWFjaCggKGVsZSkgPT4ge1xuICAgICAgcnVubmVyKz0xXG4gICAgICBjb25zdCBjb2xvciA9IHpTY2FsZShlbGUpXG4gICAgICBjb25zdCB5T2Zmc2V0ID0gKGxhYmVsT2Zmc2V0ICogcnVubmVyKSAgLyAyXG4gICAgICBjb25zdCB4T2Zmc2V0ID0gcnVubmVyJTI/IDAgOiAyMDBcbiAgICAgIHRoaXMuZy5hcHBlbmQoXCJjaXJjbGVcIikuYXR0cihcImN4XCIseE9mZnNldCkuYXR0cihcImN5XCIseU9mZnNldCkuYXR0cihcInJcIiwgNSkuc3R5bGUoXCJmaWxsXCIsY29sb3IpXG4gICAgICB0aGlzLmcuYXBwZW5kKFwidGV4dFwiKS5hdHRyKFwieFwiLCB4T2Zmc2V0ICsgMTApLmF0dHIoXCJ5XCIsIHlPZmZzZXQgKzQpLnRleHQoZWxlKS5zdHlsZShcImZvbnQtc2l6ZVwiLCBcIjE1cHhcIikuYXR0cihcImFsaWdubWVudC1iYXNlbGluZVwiLFwibWlkZGxlXCIpXG4gICAgICB9KVxuICAgIH1cblxuXG4gICAgaWYgKHRpdGxlKSB0aGlzLmcuYXBwZW5kKFwidGl0bGVcIilcbiAgICAgICAgLnRleHQodGl0bGUpO1xuXG4gICAgdGhpcy5nLmFwcGVuZChcImdcIilcbiAgICAgICAgLmF0dHIoXCJ0cmFuc2Zvcm1cIiwgYHRyYW5zbGF0ZSgwLCR7aGVpZ2h0IC0gbWFyZ2luQm90dG9tfSlgKVxuICAgICAgICAuY2FsbCh4QXhpcyk7XG5cbiAgICByZXR1cm4gdGhpcy53cmFwcGVyLmlubmVySFRNTDtcblxuICB9XG5cbn1cbiIsIi8qIVxuICogQGt1cmtsZS9jb2xvciB2MC4zLjJcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9rdXJrbGUvY29sb3IjcmVhZG1lXG4gKiAoYykgMjAyMyBKdWtrYSBLdXJrZWxhXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2VcbiAqL1xuZnVuY3Rpb24gcm91bmQodikge1xuICByZXR1cm4gdiArIDAuNSB8IDA7XG59XG5jb25zdCBsaW0gPSAodiwgbCwgaCkgPT4gTWF0aC5tYXgoTWF0aC5taW4odiwgaCksIGwpO1xuZnVuY3Rpb24gcDJiKHYpIHtcbiAgcmV0dXJuIGxpbShyb3VuZCh2ICogMi41NSksIDAsIDI1NSk7XG59XG5mdW5jdGlvbiBiMnAodikge1xuICByZXR1cm4gbGltKHJvdW5kKHYgLyAyLjU1KSwgMCwgMTAwKTtcbn1cbmZ1bmN0aW9uIG4yYih2KSB7XG4gIHJldHVybiBsaW0ocm91bmQodiAqIDI1NSksIDAsIDI1NSk7XG59XG5mdW5jdGlvbiBiMm4odikge1xuICByZXR1cm4gbGltKHJvdW5kKHYgLyAyLjU1KSAvIDEwMCwgMCwgMSk7XG59XG5mdW5jdGlvbiBuMnAodikge1xuICByZXR1cm4gbGltKHJvdW5kKHYgKiAxMDApLCAwLCAxMDApO1xufVxuXG5jb25zdCBtYXAkMSA9IHswOiAwLCAxOiAxLCAyOiAyLCAzOiAzLCA0OiA0LCA1OiA1LCA2OiA2LCA3OiA3LCA4OiA4LCA5OiA5LCBBOiAxMCwgQjogMTEsIEM6IDEyLCBEOiAxMywgRTogMTQsIEY6IDE1LCBhOiAxMCwgYjogMTEsIGM6IDEyLCBkOiAxMywgZTogMTQsIGY6IDE1fTtcbmNvbnN0IGhleCA9IFsuLi4nMDEyMzQ1Njc4OUFCQ0RFRiddO1xuY29uc3QgaDEgPSBiID0+IGhleFtiICYgMHhGXTtcbmNvbnN0IGgyID0gYiA9PiBoZXhbKGIgJiAweEYwKSA+PiA0XSArIGhleFtiICYgMHhGXTtcbmNvbnN0IGVxID0gYiA9PiAoKGIgJiAweEYwKSA+PiA0KSA9PT0gKGIgJiAweEYpO1xuY29uc3QgaXNTaG9ydCA9IHYgPT4gZXEodi5yKSAmJiBlcSh2LmcpICYmIGVxKHYuYikgJiYgZXEodi5hKTtcbmZ1bmN0aW9uIGhleFBhcnNlKHN0cikge1xuICB2YXIgbGVuID0gc3RyLmxlbmd0aDtcbiAgdmFyIHJldDtcbiAgaWYgKHN0clswXSA9PT0gJyMnKSB7XG4gICAgaWYgKGxlbiA9PT0gNCB8fCBsZW4gPT09IDUpIHtcbiAgICAgIHJldCA9IHtcbiAgICAgICAgcjogMjU1ICYgbWFwJDFbc3RyWzFdXSAqIDE3LFxuICAgICAgICBnOiAyNTUgJiBtYXAkMVtzdHJbMl1dICogMTcsXG4gICAgICAgIGI6IDI1NSAmIG1hcCQxW3N0clszXV0gKiAxNyxcbiAgICAgICAgYTogbGVuID09PSA1ID8gbWFwJDFbc3RyWzRdXSAqIDE3IDogMjU1XG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAobGVuID09PSA3IHx8IGxlbiA9PT0gOSkge1xuICAgICAgcmV0ID0ge1xuICAgICAgICByOiBtYXAkMVtzdHJbMV1dIDw8IDQgfCBtYXAkMVtzdHJbMl1dLFxuICAgICAgICBnOiBtYXAkMVtzdHJbM11dIDw8IDQgfCBtYXAkMVtzdHJbNF1dLFxuICAgICAgICBiOiBtYXAkMVtzdHJbNV1dIDw8IDQgfCBtYXAkMVtzdHJbNl1dLFxuICAgICAgICBhOiBsZW4gPT09IDkgPyAobWFwJDFbc3RyWzddXSA8PCA0IHwgbWFwJDFbc3RyWzhdXSkgOiAyNTVcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIHJldHVybiByZXQ7XG59XG5jb25zdCBhbHBoYSA9IChhLCBmKSA9PiBhIDwgMjU1ID8gZihhKSA6ICcnO1xuZnVuY3Rpb24gaGV4U3RyaW5nKHYpIHtcbiAgdmFyIGYgPSBpc1Nob3J0KHYpID8gaDEgOiBoMjtcbiAgcmV0dXJuIHZcbiAgICA/ICcjJyArIGYodi5yKSArIGYodi5nKSArIGYodi5iKSArIGFscGhhKHYuYSwgZilcbiAgICA6IHVuZGVmaW5lZDtcbn1cblxuY29uc3QgSFVFX1JFID0gL14oaHNsYT98aHdifGhzdilcXChcXHMqKFstKy5lXFxkXSspKD86ZGVnKT9bXFxzLF0rKFstKy5lXFxkXSspJVtcXHMsXSsoWy0rLmVcXGRdKyklKD86W1xccyxdKyhbLSsuZVxcZF0rKSglKT8pP1xccypcXCkkLztcbmZ1bmN0aW9uIGhzbDJyZ2JuKGgsIHMsIGwpIHtcbiAgY29uc3QgYSA9IHMgKiBNYXRoLm1pbihsLCAxIC0gbCk7XG4gIGNvbnN0IGYgPSAobiwgayA9IChuICsgaCAvIDMwKSAlIDEyKSA9PiBsIC0gYSAqIE1hdGgubWF4KE1hdGgubWluKGsgLSAzLCA5IC0gaywgMSksIC0xKTtcbiAgcmV0dXJuIFtmKDApLCBmKDgpLCBmKDQpXTtcbn1cbmZ1bmN0aW9uIGhzdjJyZ2JuKGgsIHMsIHYpIHtcbiAgY29uc3QgZiA9IChuLCBrID0gKG4gKyBoIC8gNjApICUgNikgPT4gdiAtIHYgKiBzICogTWF0aC5tYXgoTWF0aC5taW4oaywgNCAtIGssIDEpLCAwKTtcbiAgcmV0dXJuIFtmKDUpLCBmKDMpLCBmKDEpXTtcbn1cbmZ1bmN0aW9uIGh3YjJyZ2JuKGgsIHcsIGIpIHtcbiAgY29uc3QgcmdiID0gaHNsMnJnYm4oaCwgMSwgMC41KTtcbiAgbGV0IGk7XG4gIGlmICh3ICsgYiA+IDEpIHtcbiAgICBpID0gMSAvICh3ICsgYik7XG4gICAgdyAqPSBpO1xuICAgIGIgKj0gaTtcbiAgfVxuICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7XG4gICAgcmdiW2ldICo9IDEgLSB3IC0gYjtcbiAgICByZ2JbaV0gKz0gdztcbiAgfVxuICByZXR1cm4gcmdiO1xufVxuZnVuY3Rpb24gaHVlVmFsdWUociwgZywgYiwgZCwgbWF4KSB7XG4gIGlmIChyID09PSBtYXgpIHtcbiAgICByZXR1cm4gKChnIC0gYikgLyBkKSArIChnIDwgYiA/IDYgOiAwKTtcbiAgfVxuICBpZiAoZyA9PT0gbWF4KSB7XG4gICAgcmV0dXJuIChiIC0gcikgLyBkICsgMjtcbiAgfVxuICByZXR1cm4gKHIgLSBnKSAvIGQgKyA0O1xufVxuZnVuY3Rpb24gcmdiMmhzbCh2KSB7XG4gIGNvbnN0IHJhbmdlID0gMjU1O1xuICBjb25zdCByID0gdi5yIC8gcmFuZ2U7XG4gIGNvbnN0IGcgPSB2LmcgLyByYW5nZTtcbiAgY29uc3QgYiA9IHYuYiAvIHJhbmdlO1xuICBjb25zdCBtYXggPSBNYXRoLm1heChyLCBnLCBiKTtcbiAgY29uc3QgbWluID0gTWF0aC5taW4ociwgZywgYik7XG4gIGNvbnN0IGwgPSAobWF4ICsgbWluKSAvIDI7XG4gIGxldCBoLCBzLCBkO1xuICBpZiAobWF4ICE9PSBtaW4pIHtcbiAgICBkID0gbWF4IC0gbWluO1xuICAgIHMgPSBsID4gMC41ID8gZCAvICgyIC0gbWF4IC0gbWluKSA6IGQgLyAobWF4ICsgbWluKTtcbiAgICBoID0gaHVlVmFsdWUociwgZywgYiwgZCwgbWF4KTtcbiAgICBoID0gaCAqIDYwICsgMC41O1xuICB9XG4gIHJldHVybiBbaCB8IDAsIHMgfHwgMCwgbF07XG59XG5mdW5jdGlvbiBjYWxsbihmLCBhLCBiLCBjKSB7XG4gIHJldHVybiAoXG4gICAgQXJyYXkuaXNBcnJheShhKVxuICAgICAgPyBmKGFbMF0sIGFbMV0sIGFbMl0pXG4gICAgICA6IGYoYSwgYiwgYylcbiAgKS5tYXAobjJiKTtcbn1cbmZ1bmN0aW9uIGhzbDJyZ2IoaCwgcywgbCkge1xuICByZXR1cm4gY2FsbG4oaHNsMnJnYm4sIGgsIHMsIGwpO1xufVxuZnVuY3Rpb24gaHdiMnJnYihoLCB3LCBiKSB7XG4gIHJldHVybiBjYWxsbihod2IycmdibiwgaCwgdywgYik7XG59XG5mdW5jdGlvbiBoc3YycmdiKGgsIHMsIHYpIHtcbiAgcmV0dXJuIGNhbGxuKGhzdjJyZ2JuLCBoLCBzLCB2KTtcbn1cbmZ1bmN0aW9uIGh1ZShoKSB7XG4gIHJldHVybiAoaCAlIDM2MCArIDM2MCkgJSAzNjA7XG59XG5mdW5jdGlvbiBodWVQYXJzZShzdHIpIHtcbiAgY29uc3QgbSA9IEhVRV9SRS5leGVjKHN0cik7XG4gIGxldCBhID0gMjU1O1xuICBsZXQgdjtcbiAgaWYgKCFtKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChtWzVdICE9PSB2KSB7XG4gICAgYSA9IG1bNl0gPyBwMmIoK21bNV0pIDogbjJiKCttWzVdKTtcbiAgfVxuICBjb25zdCBoID0gaHVlKCttWzJdKTtcbiAgY29uc3QgcDEgPSArbVszXSAvIDEwMDtcbiAgY29uc3QgcDIgPSArbVs0XSAvIDEwMDtcbiAgaWYgKG1bMV0gPT09ICdod2InKSB7XG4gICAgdiA9IGh3YjJyZ2IoaCwgcDEsIHAyKTtcbiAgfSBlbHNlIGlmIChtWzFdID09PSAnaHN2Jykge1xuICAgIHYgPSBoc3YycmdiKGgsIHAxLCBwMik7XG4gIH0gZWxzZSB7XG4gICAgdiA9IGhzbDJyZ2IoaCwgcDEsIHAyKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHI6IHZbMF0sXG4gICAgZzogdlsxXSxcbiAgICBiOiB2WzJdLFxuICAgIGE6IGFcbiAgfTtcbn1cbmZ1bmN0aW9uIHJvdGF0ZSh2LCBkZWcpIHtcbiAgdmFyIGggPSByZ2IyaHNsKHYpO1xuICBoWzBdID0gaHVlKGhbMF0gKyBkZWcpO1xuICBoID0gaHNsMnJnYihoKTtcbiAgdi5yID0gaFswXTtcbiAgdi5nID0gaFsxXTtcbiAgdi5iID0gaFsyXTtcbn1cbmZ1bmN0aW9uIGhzbFN0cmluZyh2KSB7XG4gIGlmICghdikge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBhID0gcmdiMmhzbCh2KTtcbiAgY29uc3QgaCA9IGFbMF07XG4gIGNvbnN0IHMgPSBuMnAoYVsxXSk7XG4gIGNvbnN0IGwgPSBuMnAoYVsyXSk7XG4gIHJldHVybiB2LmEgPCAyNTVcbiAgICA/IGBoc2xhKCR7aH0sICR7c30lLCAke2x9JSwgJHtiMm4odi5hKX0pYFxuICAgIDogYGhzbCgke2h9LCAke3N9JSwgJHtsfSUpYDtcbn1cblxuY29uc3QgbWFwID0ge1xuICB4OiAnZGFyaycsXG4gIFo6ICdsaWdodCcsXG4gIFk6ICdyZScsXG4gIFg6ICdibHUnLFxuICBXOiAnZ3InLFxuICBWOiAnbWVkaXVtJyxcbiAgVTogJ3NsYXRlJyxcbiAgQTogJ2VlJyxcbiAgVDogJ29sJyxcbiAgUzogJ29yJyxcbiAgQjogJ3JhJyxcbiAgQzogJ2xhdGVnJyxcbiAgRDogJ2lnaHRzJyxcbiAgUjogJ2luJyxcbiAgUTogJ3R1cnF1b2lzJyxcbiAgRTogJ2hpJyxcbiAgUDogJ3JvJyxcbiAgTzogJ2FsJyxcbiAgTjogJ2xlJyxcbiAgTTogJ2RlJyxcbiAgTDogJ3llbGxvJyxcbiAgRjogJ2VuJyxcbiAgSzogJ2NoJyxcbiAgRzogJ2Fya3MnLFxuICBIOiAnZWEnLFxuICBJOiAnaWdodGcnLFxuICBKOiAnd2gnXG59O1xuY29uc3QgbmFtZXMkMSA9IHtcbiAgT2ljZVhlOiAnZjBmOGZmJyxcbiAgYW50aXF1ZXdFdGU6ICdmYWViZDcnLFxuICBhcXVhOiAnZmZmZicsXG4gIGFxdWFtYXJSZTogJzdmZmZkNCcsXG4gIGF6dVk6ICdmMGZmZmYnLFxuICBiZWlnZTogJ2Y1ZjVkYycsXG4gIGJpc3F1ZTogJ2ZmZTRjNCcsXG4gIGJsYWNrOiAnMCcsXG4gIGJsYW5LZWRPbW9uZDogJ2ZmZWJjZCcsXG4gIFhlOiAnZmYnLFxuICBYZXZpVGV0OiAnOGEyYmUyJyxcbiAgYlB3bjogJ2E1MmEyYScsXG4gIGJ1cmx5d29vZDogJ2RlYjg4NycsXG4gIGNhTXRYZTogJzVmOWVhMCcsXG4gIEthcnRZdXNlOiAnN2ZmZjAwJyxcbiAgS29jVGF0ZTogJ2QyNjkxZScsXG4gIGNTTzogJ2ZmN2Y1MCcsXG4gIGNTbmZsb3dlclhlOiAnNjQ5NWVkJyxcbiAgY1Nuc2lsazogJ2ZmZjhkYycsXG4gIGNyaW1zb246ICdkYzE0M2MnLFxuICBjeWFuOiAnZmZmZicsXG4gIHhYZTogJzhiJyxcbiAgeGN5YW46ICc4YjhiJyxcbiAgeGdUTW5QZDogJ2I4ODYwYicsXG4gIHhXYXk6ICdhOWE5YTknLFxuICB4Z1lGOiAnNjQwMCcsXG4gIHhnWXk6ICdhOWE5YTknLFxuICB4a2hha2k6ICdiZGI3NmInLFxuICB4bWFnRnRhOiAnOGIwMDhiJyxcbiAgeFRpdmVnWUY6ICc1NTZiMmYnLFxuICB4U2FuZ2U6ICdmZjhjMDAnLFxuICB4U2NFZDogJzk5MzJjYycsXG4gIHhZZDogJzhiMDAwMCcsXG4gIHhzT21vbjogJ2U5OTY3YScsXG4gIHhzSGdZRjogJzhmYmM4ZicsXG4gIHhVWGU6ICc0ODNkOGInLFxuICB4VVdheTogJzJmNGY0ZicsXG4gIHhVZ1l5OiAnMmY0ZjRmJyxcbiAgeFFlOiAnY2VkMScsXG4gIHh2aVRldDogJzk0MDBkMycsXG4gIGRBcHBSazogJ2ZmMTQ5MycsXG4gIGRBcHNreVhlOiAnYmZmZicsXG4gIGRpbVdheTogJzY5Njk2OScsXG4gIGRpbWdZeTogJzY5Njk2OScsXG4gIGRvZGdlclhlOiAnMWU5MGZmJyxcbiAgZmlZYnJpY2s6ICdiMjIyMjInLFxuICBmbFNPd0V0ZTogJ2ZmZmFmMCcsXG4gIGZvWXN0V0FuOiAnMjI4YjIyJyxcbiAgZnVLc2lhOiAnZmYwMGZmJyxcbiAgZ2FSc2JTbzogJ2RjZGNkYycsXG4gIGdob3N0d0V0ZTogJ2Y4ZjhmZicsXG4gIGdUZDogJ2ZmZDcwMCcsXG4gIGdUTW5QZDogJ2RhYTUyMCcsXG4gIFdheTogJzgwODA4MCcsXG4gIGdZRjogJzgwMDAnLFxuICBnWUZMdzogJ2FkZmYyZicsXG4gIGdZeTogJzgwODA4MCcsXG4gIGhvbmV5TXc6ICdmMGZmZjAnLFxuICBob3RwUms6ICdmZjY5YjQnLFxuICBSZGlhbllkOiAnY2Q1YzVjJyxcbiAgUmRpZ286ICc0YjAwODInLFxuICBpdlN5OiAnZmZmZmYwJyxcbiAga2hha2k6ICdmMGU2OGMnLFxuICBsYXZGTXI6ICdlNmU2ZmEnLFxuICBsYXZGTXJYc2g6ICdmZmYwZjUnLFxuICBsYXduZ1lGOiAnN2NmYzAwJyxcbiAgTm1vbmNFZmZvbjogJ2ZmZmFjZCcsXG4gIFpYZTogJ2FkZDhlNicsXG4gIFpjU086ICdmMDgwODAnLFxuICBaY3lhbjogJ2UwZmZmZicsXG4gIFpnVE1uUGRMdzogJ2ZhZmFkMicsXG4gIFpXYXk6ICdkM2QzZDMnLFxuICBaZ1lGOiAnOTBlZTkwJyxcbiAgWmdZeTogJ2QzZDNkMycsXG4gIFpwUms6ICdmZmI2YzEnLFxuICBac09tb246ICdmZmEwN2EnLFxuICBac0hnWUY6ICcyMGIyYWEnLFxuICBac2t5WGU6ICc4N2NlZmEnLFxuICBaVVdheTogJzc3ODg5OScsXG4gIFpVZ1l5OiAnNzc4ODk5JyxcbiAgWnN0QWxYZTogJ2IwYzRkZScsXG4gIFpMdzogJ2ZmZmZlMCcsXG4gIGxpbWU6ICdmZjAwJyxcbiAgbGltZWdZRjogJzMyY2QzMicsXG4gIGxSRjogJ2ZhZjBlNicsXG4gIG1hZ0Z0YTogJ2ZmMDBmZicsXG4gIG1hUG9uOiAnODAwMDAwJyxcbiAgVmFxdWFtYXJSZTogJzY2Y2RhYScsXG4gIFZYZTogJ2NkJyxcbiAgVlNjRWQ6ICdiYTU1ZDMnLFxuICBWcHVycE46ICc5MzcwZGInLFxuICBWc0hnWUY6ICczY2IzNzEnLFxuICBWVVhlOiAnN2I2OGVlJyxcbiAgVnNwclJnZ1lGOiAnZmE5YScsXG4gIFZRZTogJzQ4ZDFjYycsXG4gIFZ2aVRldFlkOiAnYzcxNTg1JyxcbiAgbWlkbmlnaHRYZTogJzE5MTk3MCcsXG4gIG1SdGNZYW06ICdmNWZmZmEnLFxuICBtaXN0eVBzZTogJ2ZmZTRlMScsXG4gIG1vY2Nhc1I6ICdmZmU0YjUnLFxuICBuYXZham93RXRlOiAnZmZkZWFkJyxcbiAgbmF2eTogJzgwJyxcbiAgVGRsYWNlOiAnZmRmNWU2JyxcbiAgVGl2ZTogJzgwODAwMCcsXG4gIFRpdmVkQmI6ICc2YjhlMjMnLFxuICBTYW5nZTogJ2ZmYTUwMCcsXG4gIFNhbmdlWWQ6ICdmZjQ1MDAnLFxuICBTY0VkOiAnZGE3MGQ2JyxcbiAgcE9lZ1RNblBkOiAnZWVlOGFhJyxcbiAgcE9lZ1lGOiAnOThmYjk4JyxcbiAgcE9lUWU6ICdhZmVlZWUnLFxuICBwT2V2aVRldFlkOiAnZGI3MDkzJyxcbiAgcGFwYXlhd0VwOiAnZmZlZmQ1JyxcbiAgcEhLcHVmZjogJ2ZmZGFiOScsXG4gIHBlcnU6ICdjZDg1M2YnLFxuICBwUms6ICdmZmMwY2InLFxuICBwbHVtOiAnZGRhMGRkJyxcbiAgcG93TXJYZTogJ2IwZTBlNicsXG4gIHB1cnBOOiAnODAwMDgwJyxcbiAgWWJlY2NhcHVycE46ICc2NjMzOTknLFxuICBZZDogJ2ZmMDAwMCcsXG4gIFBzeWJyb3duOiAnYmM4ZjhmJyxcbiAgUHlPWGU6ICc0MTY5ZTEnLFxuICBzYWRkTmJQd246ICc4YjQ1MTMnLFxuICBzT21vbjogJ2ZhODA3MicsXG4gIHNhbmR5YlB3bjogJ2Y0YTQ2MCcsXG4gIHNIZ1lGOiAnMmU4YjU3JyxcbiAgc0hzaGVsbDogJ2ZmZjVlZScsXG4gIHNpRm5hOiAnYTA1MjJkJyxcbiAgc2lsdmVyOiAnYzBjMGMwJyxcbiAgc2t5WGU6ICc4N2NlZWInLFxuICBVWGU6ICc2YTVhY2QnLFxuICBVV2F5OiAnNzA4MDkwJyxcbiAgVWdZeTogJzcwODA5MCcsXG4gIHNub3c6ICdmZmZhZmEnLFxuICBzcHJSZ2dZRjogJ2ZmN2YnLFxuICBzdEFsWGU6ICc0NjgyYjQnLFxuICB0YW46ICdkMmI0OGMnLFxuICB0ZU86ICc4MDgwJyxcbiAgdEVzdE46ICdkOGJmZDgnLFxuICB0b21hdG86ICdmZjYzNDcnLFxuICBRZTogJzQwZTBkMCcsXG4gIHZpVGV0OiAnZWU4MmVlJyxcbiAgSkh0OiAnZjVkZWIzJyxcbiAgd0V0ZTogJ2ZmZmZmZicsXG4gIHdFdGVzbW9rZTogJ2Y1ZjVmNScsXG4gIEx3OiAnZmZmZjAwJyxcbiAgTHdnWUY6ICc5YWNkMzInXG59O1xuZnVuY3Rpb24gdW5wYWNrKCkge1xuICBjb25zdCB1bnBhY2tlZCA9IHt9O1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMobmFtZXMkMSk7XG4gIGNvbnN0IHRrZXlzID0gT2JqZWN0LmtleXMobWFwKTtcbiAgbGV0IGksIGosIGssIG9rLCBuaztcbiAgZm9yIChpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICBvayA9IG5rID0ga2V5c1tpXTtcbiAgICBmb3IgKGogPSAwOyBqIDwgdGtleXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIGsgPSB0a2V5c1tqXTtcbiAgICAgIG5rID0gbmsucmVwbGFjZShrLCBtYXBba10pO1xuICAgIH1cbiAgICBrID0gcGFyc2VJbnQobmFtZXMkMVtva10sIDE2KTtcbiAgICB1bnBhY2tlZFtua10gPSBbayA+PiAxNiAmIDB4RkYsIGsgPj4gOCAmIDB4RkYsIGsgJiAweEZGXTtcbiAgfVxuICByZXR1cm4gdW5wYWNrZWQ7XG59XG5cbmxldCBuYW1lcztcbmZ1bmN0aW9uIG5hbWVQYXJzZShzdHIpIHtcbiAgaWYgKCFuYW1lcykge1xuICAgIG5hbWVzID0gdW5wYWNrKCk7XG4gICAgbmFtZXMudHJhbnNwYXJlbnQgPSBbMCwgMCwgMCwgMF07XG4gIH1cbiAgY29uc3QgYSA9IG5hbWVzW3N0ci50b0xvd2VyQ2FzZSgpXTtcbiAgcmV0dXJuIGEgJiYge1xuICAgIHI6IGFbMF0sXG4gICAgZzogYVsxXSxcbiAgICBiOiBhWzJdLFxuICAgIGE6IGEubGVuZ3RoID09PSA0ID8gYVszXSA6IDI1NVxuICB9O1xufVxuXG5jb25zdCBSR0JfUkUgPSAvXnJnYmE/XFwoXFxzKihbLSsuXFxkXSspKCUpP1tcXHMsXSsoWy0rLmVcXGRdKykoJSk/W1xccyxdKyhbLSsuZVxcZF0rKSglKT8oPzpbXFxzLC9dKyhbLSsuZVxcZF0rKSglKT8pP1xccypcXCkkLztcbmZ1bmN0aW9uIHJnYlBhcnNlKHN0cikge1xuICBjb25zdCBtID0gUkdCX1JFLmV4ZWMoc3RyKTtcbiAgbGV0IGEgPSAyNTU7XG4gIGxldCByLCBnLCBiO1xuICBpZiAoIW0pIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKG1bN10gIT09IHIpIHtcbiAgICBjb25zdCB2ID0gK21bN107XG4gICAgYSA9IG1bOF0gPyBwMmIodikgOiBsaW0odiAqIDI1NSwgMCwgMjU1KTtcbiAgfVxuICByID0gK21bMV07XG4gIGcgPSArbVszXTtcbiAgYiA9ICttWzVdO1xuICByID0gMjU1ICYgKG1bMl0gPyBwMmIocikgOiBsaW0ociwgMCwgMjU1KSk7XG4gIGcgPSAyNTUgJiAobVs0XSA/IHAyYihnKSA6IGxpbShnLCAwLCAyNTUpKTtcbiAgYiA9IDI1NSAmIChtWzZdID8gcDJiKGIpIDogbGltKGIsIDAsIDI1NSkpO1xuICByZXR1cm4ge1xuICAgIHI6IHIsXG4gICAgZzogZyxcbiAgICBiOiBiLFxuICAgIGE6IGFcbiAgfTtcbn1cbmZ1bmN0aW9uIHJnYlN0cmluZyh2KSB7XG4gIHJldHVybiB2ICYmIChcbiAgICB2LmEgPCAyNTVcbiAgICAgID8gYHJnYmEoJHt2LnJ9LCAke3YuZ30sICR7di5ifSwgJHtiMm4odi5hKX0pYFxuICAgICAgOiBgcmdiKCR7di5yfSwgJHt2Lmd9LCAke3YuYn0pYFxuICApO1xufVxuXG5jb25zdCB0byA9IHYgPT4gdiA8PSAwLjAwMzEzMDggPyB2ICogMTIuOTIgOiBNYXRoLnBvdyh2LCAxLjAgLyAyLjQpICogMS4wNTUgLSAwLjA1NTtcbmNvbnN0IGZyb20gPSB2ID0+IHYgPD0gMC4wNDA0NSA/IHYgLyAxMi45MiA6IE1hdGgucG93KCh2ICsgMC4wNTUpIC8gMS4wNTUsIDIuNCk7XG5mdW5jdGlvbiBpbnRlcnBvbGF0ZShyZ2IxLCByZ2IyLCB0KSB7XG4gIGNvbnN0IHIgPSBmcm9tKGIybihyZ2IxLnIpKTtcbiAgY29uc3QgZyA9IGZyb20oYjJuKHJnYjEuZykpO1xuICBjb25zdCBiID0gZnJvbShiMm4ocmdiMS5iKSk7XG4gIHJldHVybiB7XG4gICAgcjogbjJiKHRvKHIgKyB0ICogKGZyb20oYjJuKHJnYjIucikpIC0gcikpKSxcbiAgICBnOiBuMmIodG8oZyArIHQgKiAoZnJvbShiMm4ocmdiMi5nKSkgLSBnKSkpLFxuICAgIGI6IG4yYih0byhiICsgdCAqIChmcm9tKGIybihyZ2IyLmIpKSAtIGIpKSksXG4gICAgYTogcmdiMS5hICsgdCAqIChyZ2IyLmEgLSByZ2IxLmEpXG4gIH07XG59XG5cbmZ1bmN0aW9uIG1vZEhTTCh2LCBpLCByYXRpbykge1xuICBpZiAodikge1xuICAgIGxldCB0bXAgPSByZ2IyaHNsKHYpO1xuICAgIHRtcFtpXSA9IE1hdGgubWF4KDAsIE1hdGgubWluKHRtcFtpXSArIHRtcFtpXSAqIHJhdGlvLCBpID09PSAwID8gMzYwIDogMSkpO1xuICAgIHRtcCA9IGhzbDJyZ2IodG1wKTtcbiAgICB2LnIgPSB0bXBbMF07XG4gICAgdi5nID0gdG1wWzFdO1xuICAgIHYuYiA9IHRtcFsyXTtcbiAgfVxufVxuZnVuY3Rpb24gY2xvbmUodiwgcHJvdG8pIHtcbiAgcmV0dXJuIHYgPyBPYmplY3QuYXNzaWduKHByb3RvIHx8IHt9LCB2KSA6IHY7XG59XG5mdW5jdGlvbiBmcm9tT2JqZWN0KGlucHV0KSB7XG4gIHZhciB2ID0ge3I6IDAsIGc6IDAsIGI6IDAsIGE6IDI1NX07XG4gIGlmIChBcnJheS5pc0FycmF5KGlucHV0KSkge1xuICAgIGlmIChpbnB1dC5sZW5ndGggPj0gMykge1xuICAgICAgdiA9IHtyOiBpbnB1dFswXSwgZzogaW5wdXRbMV0sIGI6IGlucHV0WzJdLCBhOiAyNTV9O1xuICAgICAgaWYgKGlucHV0Lmxlbmd0aCA+IDMpIHtcbiAgICAgICAgdi5hID0gbjJiKGlucHV0WzNdKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdiA9IGNsb25lKGlucHV0LCB7cjogMCwgZzogMCwgYjogMCwgYTogMX0pO1xuICAgIHYuYSA9IG4yYih2LmEpO1xuICB9XG4gIHJldHVybiB2O1xufVxuZnVuY3Rpb24gZnVuY3Rpb25QYXJzZShzdHIpIHtcbiAgaWYgKHN0ci5jaGFyQXQoMCkgPT09ICdyJykge1xuICAgIHJldHVybiByZ2JQYXJzZShzdHIpO1xuICB9XG4gIHJldHVybiBodWVQYXJzZShzdHIpO1xufVxuY2xhc3MgQ29sb3Ige1xuICBjb25zdHJ1Y3RvcihpbnB1dCkge1xuICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIENvbG9yKSB7XG4gICAgICByZXR1cm4gaW5wdXQ7XG4gICAgfVxuICAgIGNvbnN0IHR5cGUgPSB0eXBlb2YgaW5wdXQ7XG4gICAgbGV0IHY7XG4gICAgaWYgKHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICB2ID0gZnJvbU9iamVjdChpbnB1dCk7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgdiA9IGhleFBhcnNlKGlucHV0KSB8fCBuYW1lUGFyc2UoaW5wdXQpIHx8IGZ1bmN0aW9uUGFyc2UoaW5wdXQpO1xuICAgIH1cbiAgICB0aGlzLl9yZ2IgPSB2O1xuICAgIHRoaXMuX3ZhbGlkID0gISF2O1xuICB9XG4gIGdldCB2YWxpZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsaWQ7XG4gIH1cbiAgZ2V0IHJnYigpIHtcbiAgICB2YXIgdiA9IGNsb25lKHRoaXMuX3JnYik7XG4gICAgaWYgKHYpIHtcbiAgICAgIHYuYSA9IGIybih2LmEpO1xuICAgIH1cbiAgICByZXR1cm4gdjtcbiAgfVxuICBzZXQgcmdiKG9iaikge1xuICAgIHRoaXMuX3JnYiA9IGZyb21PYmplY3Qob2JqKTtcbiAgfVxuICByZ2JTdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbGlkID8gcmdiU3RyaW5nKHRoaXMuX3JnYikgOiB1bmRlZmluZWQ7XG4gIH1cbiAgaGV4U3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLl92YWxpZCA/IGhleFN0cmluZyh0aGlzLl9yZ2IpIDogdW5kZWZpbmVkO1xuICB9XG4gIGhzbFN0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsaWQgPyBoc2xTdHJpbmcodGhpcy5fcmdiKSA6IHVuZGVmaW5lZDtcbiAgfVxuICBtaXgoY29sb3IsIHdlaWdodCkge1xuICAgIGlmIChjb2xvcikge1xuICAgICAgY29uc3QgYzEgPSB0aGlzLnJnYjtcbiAgICAgIGNvbnN0IGMyID0gY29sb3IucmdiO1xuICAgICAgbGV0IHcyO1xuICAgICAgY29uc3QgcCA9IHdlaWdodCA9PT0gdzIgPyAwLjUgOiB3ZWlnaHQ7XG4gICAgICBjb25zdCB3ID0gMiAqIHAgLSAxO1xuICAgICAgY29uc3QgYSA9IGMxLmEgLSBjMi5hO1xuICAgICAgY29uc3QgdzEgPSAoKHcgKiBhID09PSAtMSA/IHcgOiAodyArIGEpIC8gKDEgKyB3ICogYSkpICsgMSkgLyAyLjA7XG4gICAgICB3MiA9IDEgLSB3MTtcbiAgICAgIGMxLnIgPSAweEZGICYgdzEgKiBjMS5yICsgdzIgKiBjMi5yICsgMC41O1xuICAgICAgYzEuZyA9IDB4RkYgJiB3MSAqIGMxLmcgKyB3MiAqIGMyLmcgKyAwLjU7XG4gICAgICBjMS5iID0gMHhGRiAmIHcxICogYzEuYiArIHcyICogYzIuYiArIDAuNTtcbiAgICAgIGMxLmEgPSBwICogYzEuYSArICgxIC0gcCkgKiBjMi5hO1xuICAgICAgdGhpcy5yZ2IgPSBjMTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgaW50ZXJwb2xhdGUoY29sb3IsIHQpIHtcbiAgICBpZiAoY29sb3IpIHtcbiAgICAgIHRoaXMuX3JnYiA9IGludGVycG9sYXRlKHRoaXMuX3JnYiwgY29sb3IuX3JnYiwgdCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGNsb25lKCkge1xuICAgIHJldHVybiBuZXcgQ29sb3IodGhpcy5yZ2IpO1xuICB9XG4gIGFscGhhKGEpIHtcbiAgICB0aGlzLl9yZ2IuYSA9IG4yYihhKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBjbGVhcmVyKHJhdGlvKSB7XG4gICAgY29uc3QgcmdiID0gdGhpcy5fcmdiO1xuICAgIHJnYi5hICo9IDEgLSByYXRpbztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBncmV5c2NhbGUoKSB7XG4gICAgY29uc3QgcmdiID0gdGhpcy5fcmdiO1xuICAgIGNvbnN0IHZhbCA9IHJvdW5kKHJnYi5yICogMC4zICsgcmdiLmcgKiAwLjU5ICsgcmdiLmIgKiAwLjExKTtcbiAgICByZ2IuciA9IHJnYi5nID0gcmdiLmIgPSB2YWw7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgb3BhcXVlcihyYXRpbykge1xuICAgIGNvbnN0IHJnYiA9IHRoaXMuX3JnYjtcbiAgICByZ2IuYSAqPSAxICsgcmF0aW87XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgbmVnYXRlKCkge1xuICAgIGNvbnN0IHYgPSB0aGlzLl9yZ2I7XG4gICAgdi5yID0gMjU1IC0gdi5yO1xuICAgIHYuZyA9IDI1NSAtIHYuZztcbiAgICB2LmIgPSAyNTUgLSB2LmI7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgbGlnaHRlbihyYXRpbykge1xuICAgIG1vZEhTTCh0aGlzLl9yZ2IsIDIsIHJhdGlvKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBkYXJrZW4ocmF0aW8pIHtcbiAgICBtb2RIU0wodGhpcy5fcmdiLCAyLCAtcmF0aW8pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIHNhdHVyYXRlKHJhdGlvKSB7XG4gICAgbW9kSFNMKHRoaXMuX3JnYiwgMSwgcmF0aW8pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGRlc2F0dXJhdGUocmF0aW8pIHtcbiAgICBtb2RIU0wodGhpcy5fcmdiLCAxLCAtcmF0aW8pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIHJvdGF0ZShkZWcpIHtcbiAgICByb3RhdGUodGhpcy5fcmdiLCBkZWcpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG5cbmZ1bmN0aW9uIGluZGV4X2VzbShpbnB1dCkge1xuICByZXR1cm4gbmV3IENvbG9yKGlucHV0KTtcbn1cblxuZXhwb3J0IHsgQ29sb3IsIGIybiwgYjJwLCBpbmRleF9lc20gYXMgZGVmYXVsdCwgaGV4UGFyc2UsIGhleFN0cmluZywgaHNsMnJnYiwgaHNsU3RyaW5nLCBoc3YycmdiLCBodWVQYXJzZSwgaHdiMnJnYiwgbGltLCBuMmIsIG4ycCwgbmFtZVBhcnNlLCBwMmIsIHJnYjJoc2wsIHJnYlBhcnNlLCByZ2JTdHJpbmcsIHJvdGF0ZSwgcm91bmQgfTtcbiIsIi8qIVxuICogQ2hhcnQuanMgdjQuNC4wXG4gKiBodHRwczovL3d3dy5jaGFydGpzLm9yZ1xuICogKGMpIDIwMjMgQ2hhcnQuanMgQ29udHJpYnV0b3JzXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2VcbiAqL1xuaW1wb3J0IHsgQ29sb3IgfSBmcm9tICdAa3Vya2xlL2NvbG9yJztcblxuLyoqXG4gKiBAbmFtZXNwYWNlIENoYXJ0LmhlbHBlcnNcbiAqLyAvKipcbiAqIEFuIGVtcHR5IGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQsIGZvciBleGFtcGxlLCBmb3Igb3B0aW9uYWwgY2FsbGJhY2suXG4gKi8gZnVuY3Rpb24gbm9vcCgpIHtcbi8qIG5vb3AgKi8gfVxuLyoqXG4gKiBSZXR1cm5zIGEgdW5pcXVlIGlkLCBzZXF1ZW50aWFsbHkgZ2VuZXJhdGVkIGZyb20gYSBnbG9iYWwgdmFyaWFibGUuXG4gKi8gY29uc3QgdWlkID0gKCgpPT57XG4gICAgbGV0IGlkID0gMDtcbiAgICByZXR1cm4gKCk9PmlkKys7XG59KSgpO1xuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgYHZhbHVlYCBpcyBuZWl0aGVyIG51bGwgbm9yIHVuZGVmaW5lZCwgZWxzZSByZXR1cm5zIGZhbHNlLlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIHRlc3QuXG4gKiBAc2luY2UgMi43LjBcbiAqLyBmdW5jdGlvbiBpc051bGxPclVuZGVmKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCc7XG59XG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBgdmFsdWVgIGlzIGFuIGFycmF5IChpbmNsdWRpbmcgdHlwZWQgYXJyYXlzKSwgZWxzZSByZXR1cm5zIGZhbHNlLlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIHRlc3QuXG4gKiBAZnVuY3Rpb25cbiAqLyBmdW5jdGlvbiBpc0FycmF5KHZhbHVlKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IHR5cGUgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpO1xuICAgIGlmICh0eXBlLnNsaWNlKDAsIDcpID09PSAnW29iamVjdCcgJiYgdHlwZS5zbGljZSgtNikgPT09ICdBcnJheV0nKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBgdmFsdWVgIGlzIGFuIG9iamVjdCAoZXhjbHVkaW5nIG51bGwpLCBlbHNlIHJldHVybnMgZmFsc2UuXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gdGVzdC5cbiAqIEBzaW5jZSAyLjcuMFxuICovIGZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IE9iamVjdF0nO1xufVxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgYHZhbHVlYCBpcyBhIGZpbml0ZSBudW1iZXIsIGVsc2UgcmV0dXJucyBmYWxzZVxuICogQHBhcmFtIHZhbHVlICAtIFRoZSB2YWx1ZSB0byB0ZXN0LlxuICovIGZ1bmN0aW9uIGlzTnVtYmVyRmluaXRlKHZhbHVlKSB7XG4gICAgcmV0dXJuICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8IHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyKSAmJiBpc0Zpbml0ZSgrdmFsdWUpO1xufVxuLyoqXG4gKiBSZXR1cm5zIGB2YWx1ZWAgaWYgZmluaXRlLCBlbHNlIHJldHVybnMgYGRlZmF1bHRWYWx1ZWAuXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gcmV0dXJuIGlmIGRlZmluZWQuXG4gKiBAcGFyYW0gZGVmYXVsdFZhbHVlIC0gVGhlIHZhbHVlIHRvIHJldHVybiBpZiBgdmFsdWVgIGlzIG5vdCBmaW5pdGUuXG4gKi8gZnVuY3Rpb24gZmluaXRlT3JEZWZhdWx0KHZhbHVlLCBkZWZhdWx0VmFsdWUpIHtcbiAgICByZXR1cm4gaXNOdW1iZXJGaW5pdGUodmFsdWUpID8gdmFsdWUgOiBkZWZhdWx0VmFsdWU7XG59XG4vKipcbiAqIFJldHVybnMgYHZhbHVlYCBpZiBkZWZpbmVkLCBlbHNlIHJldHVybnMgYGRlZmF1bHRWYWx1ZWAuXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gcmV0dXJuIGlmIGRlZmluZWQuXG4gKiBAcGFyYW0gZGVmYXVsdFZhbHVlIC0gVGhlIHZhbHVlIHRvIHJldHVybiBpZiBgdmFsdWVgIGlzIHVuZGVmaW5lZC5cbiAqLyBmdW5jdGlvbiB2YWx1ZU9yRGVmYXVsdCh2YWx1ZSwgZGVmYXVsdFZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcgPyBkZWZhdWx0VmFsdWUgOiB2YWx1ZTtcbn1cbmNvbnN0IHRvUGVyY2VudGFnZSA9ICh2YWx1ZSwgZGltZW5zaW9uKT0+dHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5lbmRzV2l0aCgnJScpID8gcGFyc2VGbG9hdCh2YWx1ZSkgLyAxMDAgOiArdmFsdWUgLyBkaW1lbnNpb247XG5jb25zdCB0b0RpbWVuc2lvbiA9ICh2YWx1ZSwgZGltZW5zaW9uKT0+dHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5lbmRzV2l0aCgnJScpID8gcGFyc2VGbG9hdCh2YWx1ZSkgLyAxMDAgKiBkaW1lbnNpb24gOiArdmFsdWU7XG4vKipcbiAqIENhbGxzIGBmbmAgd2l0aCB0aGUgZ2l2ZW4gYGFyZ3NgIGluIHRoZSBzY29wZSBkZWZpbmVkIGJ5IGB0aGlzQXJnYCBhbmQgcmV0dXJucyB0aGVcbiAqIHZhbHVlIHJldHVybmVkIGJ5IGBmbmAuIElmIGBmbmAgaXMgbm90IGEgZnVuY3Rpb24sIHRoaXMgbWV0aG9kIHJldHVybnMgdW5kZWZpbmVkLlxuICogQHBhcmFtIGZuIC0gVGhlIGZ1bmN0aW9uIHRvIGNhbGwuXG4gKiBAcGFyYW0gYXJncyAtIFRoZSBhcmd1bWVudHMgd2l0aCB3aGljaCBgZm5gIHNob3VsZCBiZSBjYWxsZWQuXG4gKiBAcGFyYW0gW3RoaXNBcmddIC0gVGhlIHZhbHVlIG9mIGB0aGlzYCBwcm92aWRlZCBmb3IgdGhlIGNhbGwgdG8gYGZuYC5cbiAqLyBmdW5jdGlvbiBjYWxsYmFjayhmbiwgYXJncywgdGhpc0FyZykge1xuICAgIGlmIChmbiAmJiB0eXBlb2YgZm4uY2FsbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gZm4uYXBwbHkodGhpc0FyZywgYXJncyk7XG4gICAgfVxufVxuZnVuY3Rpb24gZWFjaChsb29wYWJsZSwgZm4sIHRoaXNBcmcsIHJldmVyc2UpIHtcbiAgICBsZXQgaSwgbGVuLCBrZXlzO1xuICAgIGlmIChpc0FycmF5KGxvb3BhYmxlKSkge1xuICAgICAgICBsZW4gPSBsb29wYWJsZS5sZW5ndGg7XG4gICAgICAgIGlmIChyZXZlcnNlKSB7XG4gICAgICAgICAgICBmb3IoaSA9IGxlbiAtIDE7IGkgPj0gMDsgaS0tKXtcbiAgICAgICAgICAgICAgICBmbi5jYWxsKHRoaXNBcmcsIGxvb3BhYmxlW2ldLCBpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IGxlbjsgaSsrKXtcbiAgICAgICAgICAgICAgICBmbi5jYWxsKHRoaXNBcmcsIGxvb3BhYmxlW2ldLCBpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNPYmplY3QobG9vcGFibGUpKSB7XG4gICAgICAgIGtleXMgPSBPYmplY3Qua2V5cyhsb29wYWJsZSk7XG4gICAgICAgIGxlbiA9IGtleXMubGVuZ3RoO1xuICAgICAgICBmb3IoaSA9IDA7IGkgPCBsZW47IGkrKyl7XG4gICAgICAgICAgICBmbi5jYWxsKHRoaXNBcmcsIGxvb3BhYmxlW2tleXNbaV1dLCBrZXlzW2ldKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBgYTBgIGFuZCBgYTFgIGFycmF5cyBoYXZlIHRoZSBzYW1lIGNvbnRlbnQsIGVsc2UgcmV0dXJucyBmYWxzZS5cbiAqIEBwYXJhbSBhMCAtIFRoZSBhcnJheSB0byBjb21wYXJlXG4gKiBAcGFyYW0gYTEgLSBUaGUgYXJyYXkgdG8gY29tcGFyZVxuICogQHByaXZhdGVcbiAqLyBmdW5jdGlvbiBfZWxlbWVudHNFcXVhbChhMCwgYTEpIHtcbiAgICBsZXQgaSwgaWxlbiwgdjAsIHYxO1xuICAgIGlmICghYTAgfHwgIWExIHx8IGEwLmxlbmd0aCAhPT0gYTEubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZm9yKGkgPSAwLCBpbGVuID0gYTAubGVuZ3RoOyBpIDwgaWxlbjsgKytpKXtcbiAgICAgICAgdjAgPSBhMFtpXTtcbiAgICAgICAgdjEgPSBhMVtpXTtcbiAgICAgICAgaWYgKHYwLmRhdGFzZXRJbmRleCAhPT0gdjEuZGF0YXNldEluZGV4IHx8IHYwLmluZGV4ICE9PSB2MS5pbmRleCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuLyoqXG4gKiBSZXR1cm5zIGEgZGVlcCBjb3B5IG9mIGBzb3VyY2VgIHdpdGhvdXQga2VlcGluZyByZWZlcmVuY2VzIG9uIG9iamVjdHMgYW5kIGFycmF5cy5cbiAqIEBwYXJhbSBzb3VyY2UgLSBUaGUgdmFsdWUgdG8gY2xvbmUuXG4gKi8gZnVuY3Rpb24gY2xvbmUoc291cmNlKSB7XG4gICAgaWYgKGlzQXJyYXkoc291cmNlKSkge1xuICAgICAgICByZXR1cm4gc291cmNlLm1hcChjbG9uZSk7XG4gICAgfVxuICAgIGlmIChpc09iamVjdChzb3VyY2UpKSB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpO1xuICAgICAgICBjb25zdCBrbGVuID0ga2V5cy5sZW5ndGg7XG4gICAgICAgIGxldCBrID0gMDtcbiAgICAgICAgZm9yKDsgayA8IGtsZW47ICsrayl7XG4gICAgICAgICAgICB0YXJnZXRba2V5c1trXV0gPSBjbG9uZShzb3VyY2Vba2V5c1trXV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuICAgIHJldHVybiBzb3VyY2U7XG59XG5mdW5jdGlvbiBpc1ZhbGlkS2V5KGtleSkge1xuICAgIHJldHVybiBbXG4gICAgICAgICdfX3Byb3RvX18nLFxuICAgICAgICAncHJvdG90eXBlJyxcbiAgICAgICAgJ2NvbnN0cnVjdG9yJ1xuICAgIF0uaW5kZXhPZihrZXkpID09PSAtMTtcbn1cbi8qKlxuICogVGhlIGRlZmF1bHQgbWVyZ2VyIHdoZW4gQ2hhcnQuaGVscGVycy5tZXJnZSBpcyBjYWxsZWQgd2l0aG91dCBtZXJnZXIgb3B0aW9uLlxuICogTm90ZShTQik6IGFsc28gdXNlZCBieSBtZXJnZUNvbmZpZyBhbmQgbWVyZ2VTY2FsZUNvbmZpZyBhcyBmYWxsYmFjay5cbiAqIEBwcml2YXRlXG4gKi8gZnVuY3Rpb24gX21lcmdlcihrZXksIHRhcmdldCwgc291cmNlLCBvcHRpb25zKSB7XG4gICAgaWYgKCFpc1ZhbGlkS2V5KGtleSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0dmFsID0gdGFyZ2V0W2tleV07XG4gICAgY29uc3Qgc3ZhbCA9IHNvdXJjZVtrZXldO1xuICAgIGlmIChpc09iamVjdCh0dmFsKSAmJiBpc09iamVjdChzdmFsKSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgICAgIG1lcmdlKHR2YWwsIHN2YWwsIG9wdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRhcmdldFtrZXldID0gY2xvbmUoc3ZhbCk7XG4gICAgfVxufVxuZnVuY3Rpb24gbWVyZ2UodGFyZ2V0LCBzb3VyY2UsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBzb3VyY2VzID0gaXNBcnJheShzb3VyY2UpID8gc291cmNlIDogW1xuICAgICAgICBzb3VyY2VcbiAgICBdO1xuICAgIGNvbnN0IGlsZW4gPSBzb3VyY2VzLmxlbmd0aDtcbiAgICBpZiAoIWlzT2JqZWN0KHRhcmdldCkpIHtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgY29uc3QgbWVyZ2VyID0gb3B0aW9ucy5tZXJnZXIgfHwgX21lcmdlcjtcbiAgICBsZXQgY3VycmVudDtcbiAgICBmb3IobGV0IGkgPSAwOyBpIDwgaWxlbjsgKytpKXtcbiAgICAgICAgY3VycmVudCA9IHNvdXJjZXNbaV07XG4gICAgICAgIGlmICghaXNPYmplY3QoY3VycmVudCkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhjdXJyZW50KTtcbiAgICAgICAgZm9yKGxldCBrID0gMCwga2xlbiA9IGtleXMubGVuZ3RoOyBrIDwga2xlbjsgKytrKXtcbiAgICAgICAgICAgIG1lcmdlcihrZXlzW2tdLCB0YXJnZXQsIGN1cnJlbnQsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXQ7XG59XG5mdW5jdGlvbiBtZXJnZUlmKHRhcmdldCwgc291cmNlKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11c2UtYmVmb3JlLWRlZmluZVxuICAgIHJldHVybiBtZXJnZSh0YXJnZXQsIHNvdXJjZSwge1xuICAgICAgICBtZXJnZXI6IF9tZXJnZXJJZlxuICAgIH0pO1xufVxuLyoqXG4gKiBNZXJnZXMgc291cmNlW2tleV0gaW4gdGFyZ2V0W2tleV0gb25seSBpZiB0YXJnZXRba2V5XSBpcyB1bmRlZmluZWQuXG4gKiBAcHJpdmF0ZVxuICovIGZ1bmN0aW9uIF9tZXJnZXJJZihrZXksIHRhcmdldCwgc291cmNlKSB7XG4gICAgaWYgKCFpc1ZhbGlkS2V5KGtleSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0dmFsID0gdGFyZ2V0W2tleV07XG4gICAgY29uc3Qgc3ZhbCA9IHNvdXJjZVtrZXldO1xuICAgIGlmIChpc09iamVjdCh0dmFsKSAmJiBpc09iamVjdChzdmFsKSkge1xuICAgICAgICBtZXJnZUlmKHR2YWwsIHN2YWwpO1xuICAgIH0gZWxzZSBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0YXJnZXQsIGtleSkpIHtcbiAgICAgICAgdGFyZ2V0W2tleV0gPSBjbG9uZShzdmFsKTtcbiAgICB9XG59XG4vKipcbiAqIEBwcml2YXRlXG4gKi8gZnVuY3Rpb24gX2RlcHJlY2F0ZWQoc2NvcGUsIHZhbHVlLCBwcmV2aW91cywgY3VycmVudCkge1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihzY29wZSArICc6IFwiJyArIHByZXZpb3VzICsgJ1wiIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgXCInICsgY3VycmVudCArICdcIiBpbnN0ZWFkJyk7XG4gICAgfVxufVxuLy8gcmVzb2x2ZU9iamVjdEtleSByZXNvbHZlciBjYWNoZVxuY29uc3Qga2V5UmVzb2x2ZXJzID0ge1xuICAgIC8vIENoYXJ0LmhlbHBlcnMuY29yZSByZXNvbHZlT2JqZWN0S2V5IHNob3VsZCByZXNvbHZlIGVtcHR5IGtleSB0byByb290IG9iamVjdFxuICAgICcnOiAodik9PnYsXG4gICAgLy8gZGVmYXVsdCByZXNvbHZlcnNcbiAgICB4OiAobyk9Pm8ueCxcbiAgICB5OiAobyk9Pm8ueVxufTtcbi8qKlxuICogQHByaXZhdGVcbiAqLyBmdW5jdGlvbiBfc3BsaXRLZXkoa2V5KSB7XG4gICAgY29uc3QgcGFydHMgPSBrZXkuc3BsaXQoJy4nKTtcbiAgICBjb25zdCBrZXlzID0gW107XG4gICAgbGV0IHRtcCA9ICcnO1xuICAgIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cyl7XG4gICAgICAgIHRtcCArPSBwYXJ0O1xuICAgICAgICBpZiAodG1wLmVuZHNXaXRoKCdcXFxcJykpIHtcbiAgICAgICAgICAgIHRtcCA9IHRtcC5zbGljZSgwLCAtMSkgKyAnLic7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBrZXlzLnB1c2godG1wKTtcbiAgICAgICAgICAgIHRtcCA9ICcnO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBrZXlzO1xufVxuZnVuY3Rpb24gX2dldEtleVJlc29sdmVyKGtleSkge1xuICAgIGNvbnN0IGtleXMgPSBfc3BsaXRLZXkoa2V5KTtcbiAgICByZXR1cm4gKG9iaik9PntcbiAgICAgICAgZm9yIChjb25zdCBrIG9mIGtleXMpe1xuICAgICAgICAgICAgaWYgKGsgPT09ICcnKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvYmogPSBvYmogJiYgb2JqW2tdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIHJlc29sdmVPYmplY3RLZXkob2JqLCBrZXkpIHtcbiAgICBjb25zdCByZXNvbHZlciA9IGtleVJlc29sdmVyc1trZXldIHx8IChrZXlSZXNvbHZlcnNba2V5XSA9IF9nZXRLZXlSZXNvbHZlcihrZXkpKTtcbiAgICByZXR1cm4gcmVzb2x2ZXIob2JqKTtcbn1cbi8qKlxuICogQHByaXZhdGVcbiAqLyBmdW5jdGlvbiBfY2FwaXRhbGl6ZShzdHIpIHtcbiAgICByZXR1cm4gc3RyLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgc3RyLnNsaWNlKDEpO1xufVxuY29uc3QgZGVmaW5lZCA9ICh2YWx1ZSk9PnR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCc7XG5jb25zdCBpc0Z1bmN0aW9uID0gKHZhbHVlKT0+dHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nO1xuLy8gQWRhcHRlZCBmcm9tIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzMxMTI4ODU1L2NvbXBhcmluZy1lY21hNi1zZXRzLWZvci1lcXVhbGl0eSMzMTEyOTM4NFxuY29uc3Qgc2V0c0VxdWFsID0gKGEsIGIpPT57XG4gICAgaWYgKGEuc2l6ZSAhPT0gYi5zaXplKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGEpe1xuICAgICAgICBpZiAoIWIuaGFzKGl0ZW0pKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59O1xuLyoqXG4gKiBAcGFyYW0gZSAtIFRoZSBldmVudFxuICogQHByaXZhdGVcbiAqLyBmdW5jdGlvbiBfaXNDbGlja0V2ZW50KGUpIHtcbiAgICByZXR1cm4gZS50eXBlID09PSAnbW91c2V1cCcgfHwgZS50eXBlID09PSAnY2xpY2snIHx8IGUudHlwZSA9PT0gJ2NvbnRleHRtZW51Jztcbn1cblxuLyoqXG4gKiBAYWxpYXMgQ2hhcnQuaGVscGVycy5tYXRoXG4gKiBAbmFtZXNwYWNlXG4gKi8gY29uc3QgUEkgPSBNYXRoLlBJO1xuY29uc3QgVEFVID0gMiAqIFBJO1xuY29uc3QgUElUQVUgPSBUQVUgKyBQSTtcbmNvbnN0IElORklOSVRZID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuY29uc3QgUkFEX1BFUl9ERUcgPSBQSSAvIDE4MDtcbmNvbnN0IEhBTEZfUEkgPSBQSSAvIDI7XG5jb25zdCBRVUFSVEVSX1BJID0gUEkgLyA0O1xuY29uc3QgVFdPX1RISVJEU19QSSA9IFBJICogMiAvIDM7XG5jb25zdCBsb2cxMCA9IE1hdGgubG9nMTA7XG5jb25zdCBzaWduID0gTWF0aC5zaWduO1xuZnVuY3Rpb24gYWxtb3N0RXF1YWxzKHgsIHksIGVwc2lsb24pIHtcbiAgICByZXR1cm4gTWF0aC5hYnMoeCAtIHkpIDwgZXBzaWxvbjtcbn1cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIG5pY2UgbnVtYmVyIGFsZ29yaXRobSB1c2VkIGluIGRldGVybWluaW5nIHdoZXJlIGF4aXMgbGFiZWxzIHdpbGwgZ29cbiAqLyBmdW5jdGlvbiBuaWNlTnVtKHJhbmdlKSB7XG4gICAgY29uc3Qgcm91bmRlZFJhbmdlID0gTWF0aC5yb3VuZChyYW5nZSk7XG4gICAgcmFuZ2UgPSBhbG1vc3RFcXVhbHMocmFuZ2UsIHJvdW5kZWRSYW5nZSwgcmFuZ2UgLyAxMDAwKSA/IHJvdW5kZWRSYW5nZSA6IHJhbmdlO1xuICAgIGNvbnN0IG5pY2VSYW5nZSA9IE1hdGgucG93KDEwLCBNYXRoLmZsb29yKGxvZzEwKHJhbmdlKSkpO1xuICAgIGNvbnN0IGZyYWN0aW9uID0gcmFuZ2UgLyBuaWNlUmFuZ2U7XG4gICAgY29uc3QgbmljZUZyYWN0aW9uID0gZnJhY3Rpb24gPD0gMSA/IDEgOiBmcmFjdGlvbiA8PSAyID8gMiA6IGZyYWN0aW9uIDw9IDUgPyA1IDogMTA7XG4gICAgcmV0dXJuIG5pY2VGcmFjdGlvbiAqIG5pY2VSYW5nZTtcbn1cbi8qKlxuICogUmV0dXJucyBhbiBhcnJheSBvZiBmYWN0b3JzIHNvcnRlZCBmcm9tIDEgdG8gc3FydCh2YWx1ZSlcbiAqIEBwcml2YXRlXG4gKi8gZnVuY3Rpb24gX2ZhY3Rvcml6ZSh2YWx1ZSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgIGNvbnN0IHNxcnQgPSBNYXRoLnNxcnQodmFsdWUpO1xuICAgIGxldCBpO1xuICAgIGZvcihpID0gMTsgaSA8IHNxcnQ7IGkrKyl7XG4gICAgICAgIGlmICh2YWx1ZSAlIGkgPT09IDApIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGkpO1xuICAgICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUgLyBpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoc3FydCA9PT0gKHNxcnQgfCAwKSkge1xuICAgICAgICByZXN1bHQucHVzaChzcXJ0KTtcbiAgICB9XG4gICAgcmVzdWx0LnNvcnQoKGEsIGIpPT5hIC0gYikucG9wKCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGlzTnVtYmVyKG4pIHtcbiAgICByZXR1cm4gIWlzTmFOKHBhcnNlRmxvYXQobikpICYmIGlzRmluaXRlKG4pO1xufVxuZnVuY3Rpb24gYWxtb3N0V2hvbGUoeCwgZXBzaWxvbikge1xuICAgIGNvbnN0IHJvdW5kZWQgPSBNYXRoLnJvdW5kKHgpO1xuICAgIHJldHVybiByb3VuZGVkIC0gZXBzaWxvbiA8PSB4ICYmIHJvdW5kZWQgKyBlcHNpbG9uID49IHg7XG59XG4vKipcbiAqIEBwcml2YXRlXG4gKi8gZnVuY3Rpb24gX3NldE1pbkFuZE1heEJ5S2V5KGFycmF5LCB0YXJnZXQsIHByb3BlcnR5KSB7XG4gICAgbGV0IGksIGlsZW4sIHZhbHVlO1xuICAgIGZvcihpID0gMCwgaWxlbiA9IGFycmF5Lmxlbmd0aDsgaSA8IGlsZW47IGkrKyl7XG4gICAgICAgIHZhbHVlID0gYXJyYXlbaV1bcHJvcGVydHldO1xuICAgICAgICBpZiAoIWlzTmFOKHZhbHVlKSkge1xuICAgICAgICAgICAgdGFyZ2V0Lm1pbiA9IE1hdGgubWluKHRhcmdldC5taW4sIHZhbHVlKTtcbiAgICAgICAgICAgIHRhcmdldC5tYXggPSBNYXRoLm1heCh0YXJnZXQubWF4LCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiB0b1JhZGlhbnMoZGVncmVlcykge1xuICAgIHJldHVybiBkZWdyZWVzICogKFBJIC8gMTgwKTtcbn1cbmZ1bmN0aW9uIHRvRGVncmVlcyhyYWRpYW5zKSB7XG4gICAgcmV0dXJuIHJhZGlhbnMgKiAoMTgwIC8gUEkpO1xufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZGVjaW1hbCBwbGFjZXNcbiAqIGkuZS4gdGhlIG51bWJlciBvZiBkaWdpdHMgYWZ0ZXIgdGhlIGRlY2ltYWwgcG9pbnQsIG9mIHRoZSB2YWx1ZSBvZiB0aGlzIE51bWJlci5cbiAqIEBwYXJhbSB4IC0gQSBudW1iZXIuXG4gKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzLlxuICogQHByaXZhdGVcbiAqLyBmdW5jdGlvbiBfZGVjaW1hbFBsYWNlcyh4KSB7XG4gICAgaWYgKCFpc051bWJlckZpbml0ZSh4KSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBlID0gMTtcbiAgICBsZXQgcCA9IDA7XG4gICAgd2hpbGUoTWF0aC5yb3VuZCh4ICogZSkgLyBlICE9PSB4KXtcbiAgICAgICAgZSAqPSAxMDtcbiAgICAgICAgcCsrO1xuICAgIH1cbiAgICByZXR1cm4gcDtcbn1cbi8vIEdldHMgdGhlIGFuZ2xlIGZyb20gdmVydGljYWwgdXByaWdodCB0byB0aGUgcG9pbnQgYWJvdXQgYSBjZW50cmUuXG5mdW5jdGlvbiBnZXRBbmdsZUZyb21Qb2ludChjZW50cmVQb2ludCwgYW5nbGVQb2ludCkge1xuICAgIGNvbnN0IGRpc3RhbmNlRnJvbVhDZW50ZXIgPSBhbmdsZVBvaW50LnggLSBjZW50cmVQb2ludC54O1xuICAgIGNvbnN0IGRpc3RhbmNlRnJvbVlDZW50ZXIgPSBhbmdsZVBvaW50LnkgLSBjZW50cmVQb2ludC55O1xuICAgIGNvbnN0IHJhZGlhbERpc3RhbmNlRnJvbUNlbnRlciA9IE1hdGguc3FydChkaXN0YW5jZUZyb21YQ2VudGVyICogZGlzdGFuY2VGcm9tWENlbnRlciArIGRpc3RhbmNlRnJvbVlDZW50ZXIgKiBkaXN0YW5jZUZyb21ZQ2VudGVyKTtcbiAgICBsZXQgYW5nbGUgPSBNYXRoLmF0YW4yKGRpc3RhbmNlRnJvbVlDZW50ZXIsIGRpc3RhbmNlRnJvbVhDZW50ZXIpO1xuICAgIGlmIChhbmdsZSA8IC0wLjUgKiBQSSkge1xuICAgICAgICBhbmdsZSArPSBUQVU7IC8vIG1ha2Ugc3VyZSB0aGUgcmV0dXJuZWQgYW5nbGUgaXMgaW4gdGhlIHJhbmdlIG9mICgtUEkvMiwgM1BJLzJdXG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGFuZ2xlLFxuICAgICAgICBkaXN0YW5jZTogcmFkaWFsRGlzdGFuY2VGcm9tQ2VudGVyXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGRpc3RhbmNlQmV0d2VlblBvaW50cyhwdDEsIHB0Mikge1xuICAgIHJldHVybiBNYXRoLnNxcnQoTWF0aC5wb3cocHQyLnggLSBwdDEueCwgMikgKyBNYXRoLnBvdyhwdDIueSAtIHB0MS55LCAyKSk7XG59XG4vKipcbiAqIFNob3J0ZXN0IGRpc3RhbmNlIGJldHdlZW4gYW5nbGVzLCBpbiBlaXRoZXIgZGlyZWN0aW9uLlxuICogQHByaXZhdGVcbiAqLyBmdW5jdGlvbiBfYW5nbGVEaWZmKGEsIGIpIHtcbiAgICByZXR1cm4gKGEgLSBiICsgUElUQVUpICUgVEFVIC0gUEk7XG59XG4vKipcbiAqIE5vcm1hbGl6ZSBhbmdsZSB0byBiZSBiZXR3ZWVuIDAgYW5kIDIqUElcbiAqIEBwcml2YXRlXG4gKi8gZnVuY3Rpb24gX25vcm1hbGl6ZUFuZ2xlKGEpIHtcbiAgICByZXR1cm4gKGEgJSBUQVUgKyBUQVUpICUgVEFVO1xufVxuLyoqXG4gKiBAcHJpdmF0ZVxuICovIGZ1bmN0aW9uIF9hbmdsZUJldHdlZW4oYW5nbGUsIHN0YXJ0LCBlbmQsIHNhbWVBbmdsZUlzRnVsbENpcmNsZSkge1xuICAgIGNvbnN0IGEgPSBfbm9ybWFsaXplQW5nbGUoYW5nbGUpO1xuICAgIGNvbnN0IHMgPSBfbm9ybWFsaXplQW5nbGUoc3RhcnQpO1xuICAgIGNvbnN0IGUgPSBfbm9ybWFsaXplQW5nbGUoZW5kKTtcbiAgICBjb25zdCBhbmdsZVRvU3RhcnQgPSBfbm9ybWFsaXplQW5nbGUocyAtIGEpO1xuICAgIGNvbnN0IGFuZ2xlVG9FbmQgPSBfbm9ybWFsaXplQW5nbGUoZSAtIGEpO1xuICAgIGNvbnN0IHN0YXJ0VG9BbmdsZSA9IF9ub3JtYWxpemVBbmdsZShhIC0gcyk7XG4gICAgY29uc3QgZW5kVG9BbmdsZSA9IF9ub3JtYWxpemVBbmdsZShhIC0gZSk7XG4gICAgcmV0dXJuIGEgPT09IHMgfHwgYSA9PT0gZSB8fCBzYW1lQW5nbGVJc0Z1bGxDaXJjbGUgJiYgcyA9PT0gZSB8fCBhbmdsZVRvU3RhcnQgPiBhbmdsZVRvRW5kICYmIHN0YXJ0VG9BbmdsZSA8IGVuZFRvQW5nbGU7XG59XG4vKipcbiAqIExpbWl0IGB2YWx1ZWAgYmV0d2VlbiBgbWluYCBhbmQgYG1heGBcbiAqIEBwYXJhbSB2YWx1ZVxuICogQHBhcmFtIG1pblxuICogQHBhcmFtIG1heFxuICogQHByaXZhdGVcbiAqLyBmdW5jdGlvbiBfbGltaXRWYWx1ZSh2YWx1ZSwgbWluLCBtYXgpIHtcbiAgICByZXR1cm4gTWF0aC5tYXgobWluLCBNYXRoLm1pbihtYXgsIHZhbHVlKSk7XG59XG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZVxuICogQHByaXZhdGVcbiAqLyBmdW5jdGlvbiBfaW50MTZSYW5nZSh2YWx1ZSkge1xuICAgIHJldHVybiBfbGltaXRWYWx1ZSh2YWx1ZSwgLTMyNzY4LCAzMjc2Nyk7XG59XG4vKipcbiAqIEBwYXJhbSB2YWx1ZVxuICogQHBhcmFtIHN0YXJ0XG4gKiBAcGFyYW0gZW5kXG4gKiBAcGFyYW0gW2Vwc2lsb25dXG4gKiBAcHJpdmF0ZVxuICovIGZ1bmN0aW9uIF9pc0JldHdlZW4odmFsdWUsIHN0YXJ0LCBlbmQsIGVwc2lsb24gPSAxZS02KSB7XG4gICAgcmV0dXJuIHZhbHVlID49IE1hdGgubWluKHN0YXJ0LCBlbmQpIC0gZXBzaWxvbiAmJiB2YWx1ZSA8PSBNYXRoLm1heChzdGFydCwgZW5kKSArIGVwc2lsb247XG59XG5cbmZ1bmN0aW9uIF9sb29rdXAodGFibGUsIHZhbHVlLCBjbXApIHtcbiAgICBjbXAgPSBjbXAgfHwgKChpbmRleCk9PnRhYmxlW2luZGV4XSA8IHZhbHVlKTtcbiAgICBsZXQgaGkgPSB0YWJsZS5sZW5ndGggLSAxO1xuICAgIGxldCBsbyA9IDA7XG4gICAgbGV0IG1pZDtcbiAgICB3aGlsZShoaSAtIGxvID4gMSl7XG4gICAgICAgIG1pZCA9IGxvICsgaGkgPj4gMTtcbiAgICAgICAgaWYgKGNtcChtaWQpKSB7XG4gICAgICAgICAgICBsbyA9IG1pZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGhpID0gbWlkO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGxvLFxuICAgICAgICBoaVxuICAgIH07XG59XG4vKipcbiAqIEJpbmFyeSBzZWFyY2hcbiAqIEBwYXJhbSB0YWJsZSAtIHRoZSB0YWJsZSBzZWFyY2guIG11c3QgYmUgc29ydGVkIVxuICogQHBhcmFtIGtleSAtIHByb3BlcnR5IG5hbWUgZm9yIHRoZSB2YWx1ZSBpbiBlYWNoIGVudHJ5XG4gKiBAcGFyYW0gdmFsdWUgLSB2YWx1ZSB0byBmaW5kXG4gKiBAcGFyYW0gbGFzdCAtIGxvb2t1cCBsYXN0IGluZGV4XG4gKiBAcHJpdmF0ZVxuICovIGNvbnN0IF9sb29rdXBCeUtleSA9ICh0YWJsZSwga2V5LCB2YWx1ZSwgbGFzdCk9Pl9sb29rdXAodGFibGUsIHZhbHVlLCBsYXN0ID8gKGluZGV4KT0+e1xuICAgICAgICBjb25zdCB0aSA9IHRhYmxlW2luZGV4XVtrZXldO1xuICAgICAgICByZXR1cm4gdGkgPCB2YWx1ZSB8fCB0aSA9PT0gdmFsdWUgJiYgdGFibGVbaW5kZXggKyAxXVtrZXldID09PSB2YWx1ZTtcbiAgICB9IDogKGluZGV4KT0+dGFibGVbaW5kZXhdW2tleV0gPCB2YWx1ZSk7XG4vKipcbiAqIFJldmVyc2UgYmluYXJ5IHNlYXJjaFxuICogQHBhcmFtIHRhYmxlIC0gdGhlIHRhYmxlIHNlYXJjaC4gbXVzdCBiZSBzb3J0ZWQhXG4gKiBAcGFyYW0ga2V5IC0gcHJvcGVydHkgbmFtZSBmb3IgdGhlIHZhbHVlIGluIGVhY2ggZW50cnlcbiAqIEBwYXJhbSB2YWx1ZSAtIHZhbHVlIHRvIGZpbmRcbiAqIEBwcml2YXRlXG4gKi8gY29uc3QgX3Jsb29rdXBCeUtleSA9ICh0YWJsZSwga2V5LCB2YWx1ZSk9Pl9sb29rdXAodGFibGUsIHZhbHVlLCAoaW5kZXgpPT50YWJsZVtpbmRleF1ba2V5XSA+PSB2YWx1ZSk7XG4vKipcbiAqIFJldHVybiBzdWJzZXQgb2YgYHZhbHVlc2AgYmV0d2VlbiBgbWluYCBhbmQgYG1heGAgaW5jbHVzaXZlLlxuICogVmFsdWVzIGFyZSBhc3N1bWVkIHRvIGJlIGluIHNvcnRlZCBvcmRlci5cbiAqIEBwYXJhbSB2YWx1ZXMgLSBzb3J0ZWQgYXJyYXkgb2YgdmFsdWVzXG4gKiBAcGFyYW0gbWluIC0gbWluIHZhbHVlXG4gKiBAcGFyYW0gbWF4IC0gbWF4IHZhbHVlXG4gKi8gZnVuY3Rpb24gX2ZpbHRlckJldHdlZW4odmFsdWVzLCBtaW4sIG1heCkge1xuICAgIGxldCBzdGFydCA9IDA7XG4gICAgbGV0IGVuZCA9IHZhbHVlcy5sZW5ndGg7XG4gICAgd2hpbGUoc3RhcnQgPCBlbmQgJiYgdmFsdWVzW3N0YXJ0XSA8IG1pbil7XG4gICAgICAgIHN0YXJ0Kys7XG4gICAgfVxuICAgIHdoaWxlKGVuZCA+IHN0YXJ0ICYmIHZhbHVlc1tlbmQgLSAxXSA+IG1heCl7XG4gICAgICAgIGVuZC0tO1xuICAgIH1cbiAgICByZXR1cm4gc3RhcnQgPiAwIHx8IGVuZCA8IHZhbHVlcy5sZW5ndGggPyB2YWx1ZXMuc2xpY2Uoc3RhcnQsIGVuZCkgOiB2YWx1ZXM7XG59XG5jb25zdCBhcnJheUV2ZW50cyA9IFtcbiAgICAncHVzaCcsXG4gICAgJ3BvcCcsXG4gICAgJ3NoaWZ0JyxcbiAgICAnc3BsaWNlJyxcbiAgICAndW5zaGlmdCdcbl07XG5mdW5jdGlvbiBsaXN0ZW5BcnJheUV2ZW50cyhhcnJheSwgbGlzdGVuZXIpIHtcbiAgICBpZiAoYXJyYXkuX2NoYXJ0anMpIHtcbiAgICAgICAgYXJyYXkuX2NoYXJ0anMubGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhcnJheSwgJ19jaGFydGpzJywge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAgbGlzdGVuZXJzOiBbXG4gICAgICAgICAgICAgICAgbGlzdGVuZXJcbiAgICAgICAgICAgIF1cbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGFycmF5RXZlbnRzLmZvckVhY2goKGtleSk9PntcbiAgICAgICAgY29uc3QgbWV0aG9kID0gJ19vbkRhdGEnICsgX2NhcGl0YWxpemUoa2V5KTtcbiAgICAgICAgY29uc3QgYmFzZSA9IGFycmF5W2tleV07XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhcnJheSwga2V5LCB7XG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIHZhbHVlICguLi5hcmdzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzID0gYmFzZS5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgICAgICAgICBhcnJheS5fY2hhcnRqcy5saXN0ZW5lcnMuZm9yRWFjaCgob2JqZWN0KT0+e1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9iamVjdFttZXRob2RdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RbbWV0aG9kXSguLi5hcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gdW5saXN0ZW5BcnJheUV2ZW50cyhhcnJheSwgbGlzdGVuZXIpIHtcbiAgICBjb25zdCBzdHViID0gYXJyYXkuX2NoYXJ0anM7XG4gICAgaWYgKCFzdHViKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbGlzdGVuZXJzID0gc3R1Yi5saXN0ZW5lcnM7XG4gICAgY29uc3QgaW5kZXggPSBsaXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lcik7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICBsaXN0ZW5lcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG4gICAgaWYgKGxpc3RlbmVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXJyYXlFdmVudHMuZm9yRWFjaCgoa2V5KT0+e1xuICAgICAgICBkZWxldGUgYXJyYXlba2V5XTtcbiAgICB9KTtcbiAgICBkZWxldGUgYXJyYXkuX2NoYXJ0anM7XG59XG4vKipcbiAqIEBwYXJhbSBpdGVtc1xuICovIGZ1bmN0aW9uIF9hcnJheVVuaXF1ZShpdGVtcykge1xuICAgIGNvbnN0IHNldCA9IG5ldyBTZXQoaXRlbXMpO1xuICAgIGlmIChzZXQuc2l6ZSA9PT0gaXRlbXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBpdGVtcztcbiAgICB9XG4gICAgcmV0dXJuIEFycmF5LmZyb20oc2V0KTtcbn1cblxuZnVuY3Rpb24gZm9udFN0cmluZyhwaXhlbFNpemUsIGZvbnRTdHlsZSwgZm9udEZhbWlseSkge1xuICAgIHJldHVybiBmb250U3R5bGUgKyAnICcgKyBwaXhlbFNpemUgKyAncHggJyArIGZvbnRGYW1pbHk7XG59XG4vKipcbiogUmVxdWVzdCBhbmltYXRpb24gcG9seWZpbGxcbiovIGNvbnN0IHJlcXVlc3RBbmltRnJhbWUgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU7XG59KCk7XG4vKipcbiAqIFRocm90dGxlcyBjYWxsaW5nIGBmbmAgb25jZSBwZXIgYW5pbWF0aW9uIGZyYW1lXG4gKiBMYXRlc3QgYXJndW1lbnRzIGFyZSB1c2VkIG9uIHRoZSBhY3R1YWwgY2FsbFxuICovIGZ1bmN0aW9uIHRocm90dGxlZChmbiwgdGhpc0FyZykge1xuICAgIGxldCBhcmdzVG9Vc2UgPSBbXTtcbiAgICBsZXQgdGlja2luZyA9IGZhbHNlO1xuICAgIHJldHVybiBmdW5jdGlvbiguLi5hcmdzKSB7XG4gICAgICAgIC8vIFNhdmUgdGhlIGFyZ3MgZm9yIHVzZSBsYXRlclxuICAgICAgICBhcmdzVG9Vc2UgPSBhcmdzO1xuICAgICAgICBpZiAoIXRpY2tpbmcpIHtcbiAgICAgICAgICAgIHRpY2tpbmcgPSB0cnVlO1xuICAgICAgICAgICAgcmVxdWVzdEFuaW1GcmFtZS5jYWxsKHdpbmRvdywgKCk9PntcbiAgICAgICAgICAgICAgICB0aWNraW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgZm4uYXBwbHkodGhpc0FyZywgYXJnc1RvVXNlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbn1cbi8qKlxuICogRGVib3VuY2VzIGNhbGxpbmcgYGZuYCBmb3IgYGRlbGF5YCBtc1xuICovIGZ1bmN0aW9uIGRlYm91bmNlKGZuLCBkZWxheSkge1xuICAgIGxldCB0aW1lb3V0O1xuICAgIHJldHVybiBmdW5jdGlvbiguLi5hcmdzKSB7XG4gICAgICAgIGlmIChkZWxheSkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQoZm4sIGRlbGF5LCBhcmdzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZuLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWxheTtcbiAgICB9O1xufVxuLyoqXG4gKiBDb252ZXJ0cyAnc3RhcnQnIHRvICdsZWZ0JywgJ2VuZCcgdG8gJ3JpZ2h0JyBhbmQgb3RoZXJzIHRvICdjZW50ZXInXG4gKiBAcHJpdmF0ZVxuICovIGNvbnN0IF90b0xlZnRSaWdodENlbnRlciA9IChhbGlnbik9PmFsaWduID09PSAnc3RhcnQnID8gJ2xlZnQnIDogYWxpZ24gPT09ICdlbmQnID8gJ3JpZ2h0JyA6ICdjZW50ZXInO1xuLyoqXG4gKiBSZXR1cm5zIGBzdGFydGAsIGBlbmRgIG9yIGAoc3RhcnQgKyBlbmQpIC8gMmAgZGVwZW5kaW5nIG9uIGBhbGlnbmAuIERlZmF1bHRzIHRvIGBjZW50ZXJgXG4gKiBAcHJpdmF0ZVxuICovIGNvbnN0IF9hbGlnblN0YXJ0RW5kID0gKGFsaWduLCBzdGFydCwgZW5kKT0+YWxpZ24gPT09ICdzdGFydCcgPyBzdGFydCA6IGFsaWduID09PSAnZW5kJyA/IGVuZCA6IChzdGFydCArIGVuZCkgLyAyO1xuLyoqXG4gKiBSZXR1cm5zIGBsZWZ0YCwgYHJpZ2h0YCBvciBgKGxlZnQgKyByaWdodCkgLyAyYCBkZXBlbmRpbmcgb24gYGFsaWduYC4gRGVmYXVsdHMgdG8gYGxlZnRgXG4gKiBAcHJpdmF0ZVxuICovIGNvbnN0IF90ZXh0WCA9IChhbGlnbiwgbGVmdCwgcmlnaHQsIHJ0bCk9PntcbiAgICBjb25zdCBjaGVjayA9IHJ0bCA/ICdsZWZ0JyA6ICdyaWdodCc7XG4gICAgcmV0dXJuIGFsaWduID09PSBjaGVjayA/IHJpZ2h0IDogYWxpZ24gPT09ICdjZW50ZXInID8gKGxlZnQgKyByaWdodCkgLyAyIDogbGVmdDtcbn07XG4vKipcbiAqIFJldHVybiBzdGFydCBhbmQgY291bnQgb2YgdmlzaWJsZSBwb2ludHMuXG4gKiBAcHJpdmF0ZVxuICovIGZ1bmN0aW9uIF9nZXRTdGFydEFuZENvdW50T2ZWaXNpYmxlUG9pbnRzKG1ldGEsIHBvaW50cywgYW5pbWF0aW9uc0Rpc2FibGVkKSB7XG4gICAgY29uc3QgcG9pbnRDb3VudCA9IHBvaW50cy5sZW5ndGg7XG4gICAgbGV0IHN0YXJ0ID0gMDtcbiAgICBsZXQgY291bnQgPSBwb2ludENvdW50O1xuICAgIGlmIChtZXRhLl9zb3J0ZWQpIHtcbiAgICAgICAgY29uc3QgeyBpU2NhbGUgLCBfcGFyc2VkICB9ID0gbWV0YTtcbiAgICAgICAgY29uc3QgYXhpcyA9IGlTY2FsZS5heGlzO1xuICAgICAgICBjb25zdCB7IG1pbiAsIG1heCAsIG1pbkRlZmluZWQgLCBtYXhEZWZpbmVkICB9ID0gaVNjYWxlLmdldFVzZXJCb3VuZHMoKTtcbiAgICAgICAgaWYgKG1pbkRlZmluZWQpIHtcbiAgICAgICAgICAgIHN0YXJ0ID0gX2xpbWl0VmFsdWUoTWF0aC5taW4oLy8gQHRzLWV4cGVjdC1lcnJvciBOZWVkIHRvIHR5cGUgX3BhcnNlZFxuICAgICAgICAgICAgX2xvb2t1cEJ5S2V5KF9wYXJzZWQsIGF4aXMsIG1pbikubG8sIC8vIEB0cy1leHBlY3QtZXJyb3IgTmVlZCB0byBmaXggdHlwZXMgb24gX2xvb2t1cEJ5S2V5XG4gICAgICAgICAgICBhbmltYXRpb25zRGlzYWJsZWQgPyBwb2ludENvdW50IDogX2xvb2t1cEJ5S2V5KHBvaW50cywgYXhpcywgaVNjYWxlLmdldFBpeGVsRm9yVmFsdWUobWluKSkubG8pLCAwLCBwb2ludENvdW50IC0gMSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1heERlZmluZWQpIHtcbiAgICAgICAgICAgIGNvdW50ID0gX2xpbWl0VmFsdWUoTWF0aC5tYXgoLy8gQHRzLWV4cGVjdC1lcnJvciBOZWVkIHRvIHR5cGUgX3BhcnNlZFxuICAgICAgICAgICAgX2xvb2t1cEJ5S2V5KF9wYXJzZWQsIGlTY2FsZS5heGlzLCBtYXgsIHRydWUpLmhpICsgMSwgLy8gQHRzLWV4cGVjdC1lcnJvciBOZWVkIHRvIGZpeCB0eXBlcyBvbiBfbG9va3VwQnlLZXlcbiAgICAgICAgICAgIGFuaW1hdGlvbnNEaXNhYmxlZCA/IDAgOiBfbG9va3VwQnlLZXkocG9pbnRzLCBheGlzLCBpU2NhbGUuZ2V0UGl4ZWxGb3JWYWx1ZShtYXgpLCB0cnVlKS5oaSArIDEpLCBzdGFydCwgcG9pbnRDb3VudCkgLSBzdGFydDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvdW50ID0gcG9pbnRDb3VudCAtIHN0YXJ0O1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHN0YXJ0LFxuICAgICAgICBjb3VudFxuICAgIH07XG59XG4vKipcbiAqIENoZWNrcyBpZiB0aGUgc2NhbGUgcmFuZ2VzIGhhdmUgY2hhbmdlZC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBtZXRhIC0gZGF0YXNldCBtZXRhLlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKiBAcHJpdmF0ZVxuICovIGZ1bmN0aW9uIF9zY2FsZVJhbmdlc0NoYW5nZWQobWV0YSkge1xuICAgIGNvbnN0IHsgeFNjYWxlICwgeVNjYWxlICwgX3NjYWxlUmFuZ2VzICB9ID0gbWV0YTtcbiAgICBjb25zdCBuZXdSYW5nZXMgPSB7XG4gICAgICAgIHhtaW46IHhTY2FsZS5taW4sXG4gICAgICAgIHhtYXg6IHhTY2FsZS5tYXgsXG4gICAgICAgIHltaW46IHlTY2FsZS5taW4sXG4gICAgICAgIHltYXg6IHlTY2FsZS5tYXhcbiAgICB9O1xuICAgIGlmICghX3NjYWxlUmFuZ2VzKSB7XG4gICAgICAgIG1ldGEuX3NjYWxlUmFuZ2VzID0gbmV3UmFuZ2VzO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgY2hhbmdlZCA9IF9zY2FsZVJhbmdlcy54bWluICE9PSB4U2NhbGUubWluIHx8IF9zY2FsZVJhbmdlcy54bWF4ICE9PSB4U2NhbGUubWF4IHx8IF9zY2FsZVJhbmdlcy55bWluICE9PSB5U2NhbGUubWluIHx8IF9zY2FsZVJhbmdlcy55bWF4ICE9PSB5U2NhbGUubWF4O1xuICAgIE9iamVjdC5hc3NpZ24oX3NjYWxlUmFuZ2VzLCBuZXdSYW5nZXMpO1xuICAgIHJldHVybiBjaGFuZ2VkO1xufVxuXG5jb25zdCBhdEVkZ2UgPSAodCk9PnQgPT09IDAgfHwgdCA9PT0gMTtcbmNvbnN0IGVsYXN0aWNJbiA9ICh0LCBzLCBwKT0+LShNYXRoLnBvdygyLCAxMCAqICh0IC09IDEpKSAqIE1hdGguc2luKCh0IC0gcykgKiBUQVUgLyBwKSk7XG5jb25zdCBlbGFzdGljT3V0ID0gKHQsIHMsIHApPT5NYXRoLnBvdygyLCAtMTAgKiB0KSAqIE1hdGguc2luKCh0IC0gcykgKiBUQVUgLyBwKSArIDE7XG4vKipcbiAqIEVhc2luZyBmdW5jdGlvbnMgYWRhcHRlZCBmcm9tIFJvYmVydCBQZW5uZXIncyBlYXNpbmcgZXF1YXRpb25zLlxuICogQG5hbWVzcGFjZSBDaGFydC5oZWxwZXJzLmVhc2luZy5lZmZlY3RzXG4gKiBAc2VlIGh0dHA6Ly93d3cucm9iZXJ0cGVubmVyLmNvbS9lYXNpbmcvXG4gKi8gY29uc3QgZWZmZWN0cyA9IHtcbiAgICBsaW5lYXI6ICh0KT0+dCxcbiAgICBlYXNlSW5RdWFkOiAodCk9PnQgKiB0LFxuICAgIGVhc2VPdXRRdWFkOiAodCk9Pi10ICogKHQgLSAyKSxcbiAgICBlYXNlSW5PdXRRdWFkOiAodCk9Pih0IC89IDAuNSkgPCAxID8gMC41ICogdCAqIHQgOiAtMC41ICogKC0tdCAqICh0IC0gMikgLSAxKSxcbiAgICBlYXNlSW5DdWJpYzogKHQpPT50ICogdCAqIHQsXG4gICAgZWFzZU91dEN1YmljOiAodCk9Pih0IC09IDEpICogdCAqIHQgKyAxLFxuICAgIGVhc2VJbk91dEN1YmljOiAodCk9Pih0IC89IDAuNSkgPCAxID8gMC41ICogdCAqIHQgKiB0IDogMC41ICogKCh0IC09IDIpICogdCAqIHQgKyAyKSxcbiAgICBlYXNlSW5RdWFydDogKHQpPT50ICogdCAqIHQgKiB0LFxuICAgIGVhc2VPdXRRdWFydDogKHQpPT4tKCh0IC09IDEpICogdCAqIHQgKiB0IC0gMSksXG4gICAgZWFzZUluT3V0UXVhcnQ6ICh0KT0+KHQgLz0gMC41KSA8IDEgPyAwLjUgKiB0ICogdCAqIHQgKiB0IDogLTAuNSAqICgodCAtPSAyKSAqIHQgKiB0ICogdCAtIDIpLFxuICAgIGVhc2VJblF1aW50OiAodCk9PnQgKiB0ICogdCAqIHQgKiB0LFxuICAgIGVhc2VPdXRRdWludDogKHQpPT4odCAtPSAxKSAqIHQgKiB0ICogdCAqIHQgKyAxLFxuICAgIGVhc2VJbk91dFF1aW50OiAodCk9Pih0IC89IDAuNSkgPCAxID8gMC41ICogdCAqIHQgKiB0ICogdCAqIHQgOiAwLjUgKiAoKHQgLT0gMikgKiB0ICogdCAqIHQgKiB0ICsgMiksXG4gICAgZWFzZUluU2luZTogKHQpPT4tTWF0aC5jb3ModCAqIEhBTEZfUEkpICsgMSxcbiAgICBlYXNlT3V0U2luZTogKHQpPT5NYXRoLnNpbih0ICogSEFMRl9QSSksXG4gICAgZWFzZUluT3V0U2luZTogKHQpPT4tMC41ICogKE1hdGguY29zKFBJICogdCkgLSAxKSxcbiAgICBlYXNlSW5FeHBvOiAodCk9PnQgPT09IDAgPyAwIDogTWF0aC5wb3coMiwgMTAgKiAodCAtIDEpKSxcbiAgICBlYXNlT3V0RXhwbzogKHQpPT50ID09PSAxID8gMSA6IC1NYXRoLnBvdygyLCAtMTAgKiB0KSArIDEsXG4gICAgZWFzZUluT3V0RXhwbzogKHQpPT5hdEVkZ2UodCkgPyB0IDogdCA8IDAuNSA/IDAuNSAqIE1hdGgucG93KDIsIDEwICogKHQgKiAyIC0gMSkpIDogMC41ICogKC1NYXRoLnBvdygyLCAtMTAgKiAodCAqIDIgLSAxKSkgKyAyKSxcbiAgICBlYXNlSW5DaXJjOiAodCk9PnQgPj0gMSA/IHQgOiAtKE1hdGguc3FydCgxIC0gdCAqIHQpIC0gMSksXG4gICAgZWFzZU91dENpcmM6ICh0KT0+TWF0aC5zcXJ0KDEgLSAodCAtPSAxKSAqIHQpLFxuICAgIGVhc2VJbk91dENpcmM6ICh0KT0+KHQgLz0gMC41KSA8IDEgPyAtMC41ICogKE1hdGguc3FydCgxIC0gdCAqIHQpIC0gMSkgOiAwLjUgKiAoTWF0aC5zcXJ0KDEgLSAodCAtPSAyKSAqIHQpICsgMSksXG4gICAgZWFzZUluRWxhc3RpYzogKHQpPT5hdEVkZ2UodCkgPyB0IDogZWxhc3RpY0luKHQsIDAuMDc1LCAwLjMpLFxuICAgIGVhc2VPdXRFbGFzdGljOiAodCk9PmF0RWRnZSh0KSA/IHQgOiBlbGFzdGljT3V0KHQsIDAuMDc1LCAwLjMpLFxuICAgIGVhc2VJbk91dEVsYXN0aWMgKHQpIHtcbiAgICAgICAgY29uc3QgcyA9IDAuMTEyNTtcbiAgICAgICAgY29uc3QgcCA9IDAuNDU7XG4gICAgICAgIHJldHVybiBhdEVkZ2UodCkgPyB0IDogdCA8IDAuNSA/IDAuNSAqIGVsYXN0aWNJbih0ICogMiwgcywgcCkgOiAwLjUgKyAwLjUgKiBlbGFzdGljT3V0KHQgKiAyIC0gMSwgcywgcCk7XG4gICAgfSxcbiAgICBlYXNlSW5CYWNrICh0KSB7XG4gICAgICAgIGNvbnN0IHMgPSAxLjcwMTU4O1xuICAgICAgICByZXR1cm4gdCAqIHQgKiAoKHMgKyAxKSAqIHQgLSBzKTtcbiAgICB9LFxuICAgIGVhc2VPdXRCYWNrICh0KSB7XG4gICAgICAgIGNvbnN0IHMgPSAxLjcwMTU4O1xuICAgICAgICByZXR1cm4gKHQgLT0gMSkgKiB0ICogKChzICsgMSkgKiB0ICsgcykgKyAxO1xuICAgIH0sXG4gICAgZWFzZUluT3V0QmFjayAodCkge1xuICAgICAgICBsZXQgcyA9IDEuNzAxNTg7XG4gICAgICAgIGlmICgodCAvPSAwLjUpIDwgMSkge1xuICAgICAgICAgICAgcmV0dXJuIDAuNSAqICh0ICogdCAqICgoKHMgKj0gMS41MjUpICsgMSkgKiB0IC0gcykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAwLjUgKiAoKHQgLT0gMikgKiB0ICogKCgocyAqPSAxLjUyNSkgKyAxKSAqIHQgKyBzKSArIDIpO1xuICAgIH0sXG4gICAgZWFzZUluQm91bmNlOiAodCk9PjEgLSBlZmZlY3RzLmVhc2VPdXRCb3VuY2UoMSAtIHQpLFxuICAgIGVhc2VPdXRCb3VuY2UgKHQpIHtcbiAgICAgICAgY29uc3QgbSA9IDcuNTYyNTtcbiAgICAgICAgY29uc3QgZCA9IDIuNzU7XG4gICAgICAgIGlmICh0IDwgMSAvIGQpIHtcbiAgICAgICAgICAgIHJldHVybiBtICogdCAqIHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHQgPCAyIC8gZCkge1xuICAgICAgICAgICAgcmV0dXJuIG0gKiAodCAtPSAxLjUgLyBkKSAqIHQgKyAwLjc1O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0IDwgMi41IC8gZCkge1xuICAgICAgICAgICAgcmV0dXJuIG0gKiAodCAtPSAyLjI1IC8gZCkgKiB0ICsgMC45Mzc1O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtICogKHQgLT0gMi42MjUgLyBkKSAqIHQgKyAwLjk4NDM3NTtcbiAgICB9LFxuICAgIGVhc2VJbk91dEJvdW5jZTogKHQpPT50IDwgMC41ID8gZWZmZWN0cy5lYXNlSW5Cb3VuY2UodCAqIDIpICogMC41IDogZWZmZWN0cy5lYXNlT3V0Qm91bmNlKHQgKiAyIC0gMSkgKiAwLjUgKyAwLjVcbn07XG5cbmZ1bmN0aW9uIGlzUGF0dGVybk9yR3JhZGllbnQodmFsdWUpIHtcbiAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgICBjb25zdCB0eXBlID0gdmFsdWUudG9TdHJpbmcoKTtcbiAgICAgICAgcmV0dXJuIHR5cGUgPT09ICdbb2JqZWN0IENhbnZhc1BhdHRlcm5dJyB8fCB0eXBlID09PSAnW29iamVjdCBDYW52YXNHcmFkaWVudF0nO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBjb2xvcih2YWx1ZSkge1xuICAgIHJldHVybiBpc1BhdHRlcm5PckdyYWRpZW50KHZhbHVlKSA/IHZhbHVlIDogbmV3IENvbG9yKHZhbHVlKTtcbn1cbmZ1bmN0aW9uIGdldEhvdmVyQ29sb3IodmFsdWUpIHtcbiAgICByZXR1cm4gaXNQYXR0ZXJuT3JHcmFkaWVudCh2YWx1ZSkgPyB2YWx1ZSA6IG5ldyBDb2xvcih2YWx1ZSkuc2F0dXJhdGUoMC41KS5kYXJrZW4oMC4xKS5oZXhTdHJpbmcoKTtcbn1cblxuY29uc3QgbnVtYmVycyA9IFtcbiAgICAneCcsXG4gICAgJ3knLFxuICAgICdib3JkZXJXaWR0aCcsXG4gICAgJ3JhZGl1cycsXG4gICAgJ3RlbnNpb24nXG5dO1xuY29uc3QgY29sb3JzID0gW1xuICAgICdjb2xvcicsXG4gICAgJ2JvcmRlckNvbG9yJyxcbiAgICAnYmFja2dyb3VuZENvbG9yJ1xuXTtcbmZ1bmN0aW9uIGFwcGx5QW5pbWF0aW9uc0RlZmF1bHRzKGRlZmF1bHRzKSB7XG4gICAgZGVmYXVsdHMuc2V0KCdhbmltYXRpb24nLCB7XG4gICAgICAgIGRlbGF5OiB1bmRlZmluZWQsXG4gICAgICAgIGR1cmF0aW9uOiAxMDAwLFxuICAgICAgICBlYXNpbmc6ICdlYXNlT3V0UXVhcnQnLFxuICAgICAgICBmbjogdW5kZWZpbmVkLFxuICAgICAgICBmcm9tOiB1bmRlZmluZWQsXG4gICAgICAgIGxvb3A6IHVuZGVmaW5lZCxcbiAgICAgICAgdG86IHVuZGVmaW5lZCxcbiAgICAgICAgdHlwZTogdW5kZWZpbmVkXG4gICAgfSk7XG4gICAgZGVmYXVsdHMuZGVzY3JpYmUoJ2FuaW1hdGlvbicsIHtcbiAgICAgICAgX2ZhbGxiYWNrOiBmYWxzZSxcbiAgICAgICAgX2luZGV4YWJsZTogZmFsc2UsXG4gICAgICAgIF9zY3JpcHRhYmxlOiAobmFtZSk9Pm5hbWUgIT09ICdvblByb2dyZXNzJyAmJiBuYW1lICE9PSAnb25Db21wbGV0ZScgJiYgbmFtZSAhPT0gJ2ZuJ1xuICAgIH0pO1xuICAgIGRlZmF1bHRzLnNldCgnYW5pbWF0aW9ucycsIHtcbiAgICAgICAgY29sb3JzOiB7XG4gICAgICAgICAgICB0eXBlOiAnY29sb3InLFxuICAgICAgICAgICAgcHJvcGVydGllczogY29sb3JzXG4gICAgICAgIH0sXG4gICAgICAgIG51bWJlcnM6IHtcbiAgICAgICAgICAgIHR5cGU6ICdudW1iZXInLFxuICAgICAgICAgICAgcHJvcGVydGllczogbnVtYmVyc1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgZGVmYXVsdHMuZGVzY3JpYmUoJ2FuaW1hdGlvbnMnLCB7XG4gICAgICAgIF9mYWxsYmFjazogJ2FuaW1hdGlvbidcbiAgICB9KTtcbiAgICBkZWZhdWx0cy5zZXQoJ3RyYW5zaXRpb25zJywge1xuICAgICAgICBhY3RpdmU6IHtcbiAgICAgICAgICAgIGFuaW1hdGlvbjoge1xuICAgICAgICAgICAgICAgIGR1cmF0aW9uOiA0MDBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgcmVzaXplOiB7XG4gICAgICAgICAgICBhbmltYXRpb246IHtcbiAgICAgICAgICAgICAgICBkdXJhdGlvbjogMFxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBzaG93OiB7XG4gICAgICAgICAgICBhbmltYXRpb25zOiB7XG4gICAgICAgICAgICAgICAgY29sb3JzOiB7XG4gICAgICAgICAgICAgICAgICAgIGZyb206ICd0cmFuc3BhcmVudCdcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHZpc2libGU6IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogMFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgaGlkZToge1xuICAgICAgICAgICAgYW5pbWF0aW9uczoge1xuICAgICAgICAgICAgICAgIGNvbG9yczoge1xuICAgICAgICAgICAgICAgICAgICB0bzogJ3RyYW5zcGFyZW50J1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdmlzaWJsZToge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgICAgICAgICAgICAgIGVhc2luZzogJ2xpbmVhcicsXG4gICAgICAgICAgICAgICAgICAgIGZuOiAodik9PnYgfCAwXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGFwcGx5TGF5b3V0c0RlZmF1bHRzKGRlZmF1bHRzKSB7XG4gICAgZGVmYXVsdHMuc2V0KCdsYXlvdXQnLCB7XG4gICAgICAgIGF1dG9QYWRkaW5nOiB0cnVlLFxuICAgICAgICBwYWRkaW5nOiB7XG4gICAgICAgICAgICB0b3A6IDAsXG4gICAgICAgICAgICByaWdodDogMCxcbiAgICAgICAgICAgIGJvdHRvbTogMCxcbiAgICAgICAgICAgIGxlZnQ6IDBcbiAgICAgICAgfVxuICAgIH0pO1xufVxuXG5jb25zdCBpbnRsQ2FjaGUgPSBuZXcgTWFwKCk7XG5mdW5jdGlvbiBnZXROdW1iZXJGb3JtYXQobG9jYWxlLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgY29uc3QgY2FjaGVLZXkgPSBsb2NhbGUgKyBKU09OLnN0cmluZ2lmeShvcHRpb25zKTtcbiAgICBsZXQgZm9ybWF0dGVyID0gaW50bENhY2hlLmdldChjYWNoZUtleSk7XG4gICAgaWYgKCFmb3JtYXR0ZXIpIHtcbiAgICAgICAgZm9ybWF0dGVyID0gbmV3IEludGwuTnVtYmVyRm9ybWF0KGxvY2FsZSwgb3B0aW9ucyk7XG4gICAgICAgIGludGxDYWNoZS5zZXQoY2FjaGVLZXksIGZvcm1hdHRlcik7XG4gICAgfVxuICAgIHJldHVybiBmb3JtYXR0ZXI7XG59XG5mdW5jdGlvbiBmb3JtYXROdW1iZXIobnVtLCBsb2NhbGUsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gZ2V0TnVtYmVyRm9ybWF0KGxvY2FsZSwgb3B0aW9ucykuZm9ybWF0KG51bSk7XG59XG5cbmNvbnN0IGZvcm1hdHRlcnMgPSB7XG4gdmFsdWVzICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gaXNBcnJheSh2YWx1ZSkgPyAgdmFsdWUgOiAnJyArIHZhbHVlO1xuICAgIH0sXG4gbnVtZXJpYyAodGlja1ZhbHVlLCBpbmRleCwgdGlja3MpIHtcbiAgICAgICAgaWYgKHRpY2tWYWx1ZSA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuICcwJztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBsb2NhbGUgPSB0aGlzLmNoYXJ0Lm9wdGlvbnMubG9jYWxlO1xuICAgICAgICBsZXQgbm90YXRpb247XG4gICAgICAgIGxldCBkZWx0YSA9IHRpY2tWYWx1ZTtcbiAgICAgICAgaWYgKHRpY2tzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIGNvbnN0IG1heFRpY2sgPSBNYXRoLm1heChNYXRoLmFicyh0aWNrc1swXS52YWx1ZSksIE1hdGguYWJzKHRpY2tzW3RpY2tzLmxlbmd0aCAtIDFdLnZhbHVlKSk7XG4gICAgICAgICAgICBpZiAobWF4VGljayA8IDFlLTQgfHwgbWF4VGljayA+IDFlKzE1KSB7XG4gICAgICAgICAgICAgICAgbm90YXRpb24gPSAnc2NpZW50aWZpYyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWx0YSA9IGNhbGN1bGF0ZURlbHRhKHRpY2tWYWx1ZSwgdGlja3MpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxvZ0RlbHRhID0gbG9nMTAoTWF0aC5hYnMoZGVsdGEpKTtcbiAgICAgICAgY29uc3QgbnVtRGVjaW1hbCA9IGlzTmFOKGxvZ0RlbHRhKSA/IDEgOiBNYXRoLm1heChNYXRoLm1pbigtMSAqIE1hdGguZmxvb3IobG9nRGVsdGEpLCAyMCksIDApO1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbm90YXRpb24sXG4gICAgICAgICAgICBtaW5pbXVtRnJhY3Rpb25EaWdpdHM6IG51bURlY2ltYWwsXG4gICAgICAgICAgICBtYXhpbXVtRnJhY3Rpb25EaWdpdHM6IG51bURlY2ltYWxcbiAgICAgICAgfTtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihvcHRpb25zLCB0aGlzLm9wdGlvbnMudGlja3MuZm9ybWF0KTtcbiAgICAgICAgcmV0dXJuIGZvcm1hdE51bWJlcih0aWNrVmFsdWUsIGxvY2FsZSwgb3B0aW9ucyk7XG4gICAgfSxcbiBsb2dhcml0aG1pYyAodGlja1ZhbHVlLCBpbmRleCwgdGlja3MpIHtcbiAgICAgICAgaWYgKHRpY2tWYWx1ZSA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuICcwJztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZW1haW4gPSB0aWNrc1tpbmRleF0uc2lnbmlmaWNhbmQgfHwgdGlja1ZhbHVlIC8gTWF0aC5wb3coMTAsIE1hdGguZmxvb3IobG9nMTAodGlja1ZhbHVlKSkpO1xuICAgICAgICBpZiAoW1xuICAgICAgICAgICAgMSxcbiAgICAgICAgICAgIDIsXG4gICAgICAgICAgICAzLFxuICAgICAgICAgICAgNSxcbiAgICAgICAgICAgIDEwLFxuICAgICAgICAgICAgMTVcbiAgICAgICAgXS5pbmNsdWRlcyhyZW1haW4pIHx8IGluZGV4ID4gMC44ICogdGlja3MubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gZm9ybWF0dGVycy5udW1lcmljLmNhbGwodGhpcywgdGlja1ZhbHVlLCBpbmRleCwgdGlja3MpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG59O1xuZnVuY3Rpb24gY2FsY3VsYXRlRGVsdGEodGlja1ZhbHVlLCB0aWNrcykge1xuICAgIGxldCBkZWx0YSA9IHRpY2tzLmxlbmd0aCA+IDMgPyB0aWNrc1syXS52YWx1ZSAtIHRpY2tzWzFdLnZhbHVlIDogdGlja3NbMV0udmFsdWUgLSB0aWNrc1swXS52YWx1ZTtcbiAgICBpZiAoTWF0aC5hYnMoZGVsdGEpID49IDEgJiYgdGlja1ZhbHVlICE9PSBNYXRoLmZsb29yKHRpY2tWYWx1ZSkpIHtcbiAgICAgICAgZGVsdGEgPSB0aWNrVmFsdWUgLSBNYXRoLmZsb29yKHRpY2tWYWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiBkZWx0YTtcbn1cbiB2YXIgVGlja3MgPSB7XG4gICAgZm9ybWF0dGVyc1xufTtcblxuZnVuY3Rpb24gYXBwbHlTY2FsZURlZmF1bHRzKGRlZmF1bHRzKSB7XG4gICAgZGVmYXVsdHMuc2V0KCdzY2FsZScsIHtcbiAgICAgICAgZGlzcGxheTogdHJ1ZSxcbiAgICAgICAgb2Zmc2V0OiBmYWxzZSxcbiAgICAgICAgcmV2ZXJzZTogZmFsc2UsXG4gICAgICAgIGJlZ2luQXRaZXJvOiBmYWxzZSxcbiBib3VuZHM6ICd0aWNrcycsXG4gICAgICAgIGNsaXA6IHRydWUsXG4gZ3JhY2U6IDAsXG4gICAgICAgIGdyaWQ6IHtcbiAgICAgICAgICAgIGRpc3BsYXk6IHRydWUsXG4gICAgICAgICAgICBsaW5lV2lkdGg6IDEsXG4gICAgICAgICAgICBkcmF3T25DaGFydEFyZWE6IHRydWUsXG4gICAgICAgICAgICBkcmF3VGlja3M6IHRydWUsXG4gICAgICAgICAgICB0aWNrTGVuZ3RoOiA4LFxuICAgICAgICAgICAgdGlja1dpZHRoOiAoX2N0eCwgb3B0aW9ucyk9Pm9wdGlvbnMubGluZVdpZHRoLFxuICAgICAgICAgICAgdGlja0NvbG9yOiAoX2N0eCwgb3B0aW9ucyk9Pm9wdGlvbnMuY29sb3IsXG4gICAgICAgICAgICBvZmZzZXQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIGJvcmRlcjoge1xuICAgICAgICAgICAgZGlzcGxheTogdHJ1ZSxcbiAgICAgICAgICAgIGRhc2g6IFtdLFxuICAgICAgICAgICAgZGFzaE9mZnNldDogMC4wLFxuICAgICAgICAgICAgd2lkdGg6IDFcbiAgICAgICAgfSxcbiAgICAgICAgdGl0bGU6IHtcbiAgICAgICAgICAgIGRpc3BsYXk6IGZhbHNlLFxuICAgICAgICAgICAgdGV4dDogJycsXG4gICAgICAgICAgICBwYWRkaW5nOiB7XG4gICAgICAgICAgICAgICAgdG9wOiA0LFxuICAgICAgICAgICAgICAgIGJvdHRvbTogNFxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB0aWNrczoge1xuICAgICAgICAgICAgbWluUm90YXRpb246IDAsXG4gICAgICAgICAgICBtYXhSb3RhdGlvbjogNTAsXG4gICAgICAgICAgICBtaXJyb3I6IGZhbHNlLFxuICAgICAgICAgICAgdGV4dFN0cm9rZVdpZHRoOiAwLFxuICAgICAgICAgICAgdGV4dFN0cm9rZUNvbG9yOiAnJyxcbiAgICAgICAgICAgIHBhZGRpbmc6IDMsXG4gICAgICAgICAgICBkaXNwbGF5OiB0cnVlLFxuICAgICAgICAgICAgYXV0b1NraXA6IHRydWUsXG4gICAgICAgICAgICBhdXRvU2tpcFBhZGRpbmc6IDMsXG4gICAgICAgICAgICBsYWJlbE9mZnNldDogMCxcbiAgICAgICAgICAgIGNhbGxiYWNrOiBUaWNrcy5mb3JtYXR0ZXJzLnZhbHVlcyxcbiAgICAgICAgICAgIG1pbm9yOiB7fSxcbiAgICAgICAgICAgIG1ham9yOiB7fSxcbiAgICAgICAgICAgIGFsaWduOiAnY2VudGVyJyxcbiAgICAgICAgICAgIGNyb3NzQWxpZ246ICduZWFyJyxcbiAgICAgICAgICAgIHNob3dMYWJlbEJhY2tkcm9wOiBmYWxzZSxcbiAgICAgICAgICAgIGJhY2tkcm9wQ29sb3I6ICdyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNzUpJyxcbiAgICAgICAgICAgIGJhY2tkcm9wUGFkZGluZzogMlxuICAgICAgICB9XG4gICAgfSk7XG4gICAgZGVmYXVsdHMucm91dGUoJ3NjYWxlLnRpY2tzJywgJ2NvbG9yJywgJycsICdjb2xvcicpO1xuICAgIGRlZmF1bHRzLnJvdXRlKCdzY2FsZS5ncmlkJywgJ2NvbG9yJywgJycsICdib3JkZXJDb2xvcicpO1xuICAgIGRlZmF1bHRzLnJvdXRlKCdzY2FsZS5ib3JkZXInLCAnY29sb3InLCAnJywgJ2JvcmRlckNvbG9yJyk7XG4gICAgZGVmYXVsdHMucm91dGUoJ3NjYWxlLnRpdGxlJywgJ2NvbG9yJywgJycsICdjb2xvcicpO1xuICAgIGRlZmF1bHRzLmRlc2NyaWJlKCdzY2FsZScsIHtcbiAgICAgICAgX2ZhbGxiYWNrOiBmYWxzZSxcbiAgICAgICAgX3NjcmlwdGFibGU6IChuYW1lKT0+IW5hbWUuc3RhcnRzV2l0aCgnYmVmb3JlJykgJiYgIW5hbWUuc3RhcnRzV2l0aCgnYWZ0ZXInKSAmJiBuYW1lICE9PSAnY2FsbGJhY2snICYmIG5hbWUgIT09ICdwYXJzZXInLFxuICAgICAgICBfaW5kZXhhYmxlOiAobmFtZSk9Pm5hbWUgIT09ICdib3JkZXJEYXNoJyAmJiBuYW1lICE9PSAndGlja0JvcmRlckRhc2gnICYmIG5hbWUgIT09ICdkYXNoJ1xuICAgIH0pO1xuICAgIGRlZmF1bHRzLmRlc2NyaWJlKCdzY2FsZXMnLCB7XG4gICAgICAgIF9mYWxsYmFjazogJ3NjYWxlJ1xuICAgIH0pO1xuICAgIGRlZmF1bHRzLmRlc2NyaWJlKCdzY2FsZS50aWNrcycsIHtcbiAgICAgICAgX3NjcmlwdGFibGU6IChuYW1lKT0+bmFtZSAhPT0gJ2JhY2tkcm9wUGFkZGluZycgJiYgbmFtZSAhPT0gJ2NhbGxiYWNrJyxcbiAgICAgICAgX2luZGV4YWJsZTogKG5hbWUpPT5uYW1lICE9PSAnYmFja2Ryb3BQYWRkaW5nJ1xuICAgIH0pO1xufVxuXG5jb25zdCBvdmVycmlkZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuY29uc3QgZGVzY3JpcHRvcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIGZ1bmN0aW9uIGdldFNjb3BlJDEobm9kZSwga2V5KSB7XG4gICAgaWYgKCFrZXkpIHtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIGNvbnN0IGtleXMgPSBrZXkuc3BsaXQoJy4nKTtcbiAgICBmb3IobGV0IGkgPSAwLCBuID0ga2V5cy5sZW5ndGg7IGkgPCBuOyArK2kpe1xuICAgICAgICBjb25zdCBrID0ga2V5c1tpXTtcbiAgICAgICAgbm9kZSA9IG5vZGVba10gfHwgKG5vZGVba10gPSBPYmplY3QuY3JlYXRlKG51bGwpKTtcbiAgICB9XG4gICAgcmV0dXJuIG5vZGU7XG59XG5mdW5jdGlvbiBzZXQocm9vdCwgc2NvcGUsIHZhbHVlcykge1xuICAgIGlmICh0eXBlb2Ygc2NvcGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBtZXJnZShnZXRTY29wZSQxKHJvb3QsIHNjb3BlKSwgdmFsdWVzKTtcbiAgICB9XG4gICAgcmV0dXJuIG1lcmdlKGdldFNjb3BlJDEocm9vdCwgJycpLCBzY29wZSk7XG59XG4gY2xhc3MgRGVmYXVsdHMge1xuICAgIGNvbnN0cnVjdG9yKF9kZXNjcmlwdG9ycywgX2FwcGxpZXJzKXtcbiAgICAgICAgdGhpcy5hbmltYXRpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuYmFja2dyb3VuZENvbG9yID0gJ3JnYmEoMCwwLDAsMC4xKSc7XG4gICAgICAgIHRoaXMuYm9yZGVyQ29sb3IgPSAncmdiYSgwLDAsMCwwLjEpJztcbiAgICAgICAgdGhpcy5jb2xvciA9ICcjNjY2JztcbiAgICAgICAgdGhpcy5kYXRhc2V0cyA9IHt9O1xuICAgICAgICB0aGlzLmRldmljZVBpeGVsUmF0aW8gPSAoY29udGV4dCk9PmNvbnRleHQuY2hhcnQucGxhdGZvcm0uZ2V0RGV2aWNlUGl4ZWxSYXRpbygpO1xuICAgICAgICB0aGlzLmVsZW1lbnRzID0ge307XG4gICAgICAgIHRoaXMuZXZlbnRzID0gW1xuICAgICAgICAgICAgJ21vdXNlbW92ZScsXG4gICAgICAgICAgICAnbW91c2VvdXQnLFxuICAgICAgICAgICAgJ2NsaWNrJyxcbiAgICAgICAgICAgICd0b3VjaHN0YXJ0JyxcbiAgICAgICAgICAgICd0b3VjaG1vdmUnXG4gICAgICAgIF07XG4gICAgICAgIHRoaXMuZm9udCA9IHtcbiAgICAgICAgICAgIGZhbWlseTogXCInSGVsdmV0aWNhIE5ldWUnLCAnSGVsdmV0aWNhJywgJ0FyaWFsJywgc2Fucy1zZXJpZlwiLFxuICAgICAgICAgICAgc2l6ZTogMTIsXG4gICAgICAgICAgICBzdHlsZTogJ25vcm1hbCcsXG4gICAgICAgICAgICBsaW5lSGVpZ2h0OiAxLjIsXG4gICAgICAgICAgICB3ZWlnaHQ6IG51bGxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5ob3ZlciA9IHt9O1xuICAgICAgICB0aGlzLmhvdmVyQmFja2dyb3VuZENvbG9yID0gKGN0eCwgb3B0aW9ucyk9PmdldEhvdmVyQ29sb3Iob3B0aW9ucy5iYWNrZ3JvdW5kQ29sb3IpO1xuICAgICAgICB0aGlzLmhvdmVyQm9yZGVyQ29sb3IgPSAoY3R4LCBvcHRpb25zKT0+Z2V0SG92ZXJDb2xvcihvcHRpb25zLmJvcmRlckNvbG9yKTtcbiAgICAgICAgdGhpcy5ob3ZlckNvbG9yID0gKGN0eCwgb3B0aW9ucyk9PmdldEhvdmVyQ29sb3Iob3B0aW9ucy5jb2xvcik7XG4gICAgICAgIHRoaXMuaW5kZXhBeGlzID0gJ3gnO1xuICAgICAgICB0aGlzLmludGVyYWN0aW9uID0ge1xuICAgICAgICAgICAgbW9kZTogJ25lYXJlc3QnLFxuICAgICAgICAgICAgaW50ZXJzZWN0OiB0cnVlLFxuICAgICAgICAgICAgaW5jbHVkZUludmlzaWJsZTogZmFsc2VcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5tYWludGFpbkFzcGVjdFJhdGlvID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5vbkhvdmVyID0gbnVsbDtcbiAgICAgICAgdGhpcy5vbkNsaWNrID0gbnVsbDtcbiAgICAgICAgdGhpcy5wYXJzaW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5wbHVnaW5zID0ge307XG4gICAgICAgIHRoaXMucmVzcG9uc2l2ZSA9IHRydWU7XG4gICAgICAgIHRoaXMuc2NhbGUgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuc2NhbGVzID0ge307XG4gICAgICAgIHRoaXMuc2hvd0xpbmUgPSB0cnVlO1xuICAgICAgICB0aGlzLmRyYXdBY3RpdmVFbGVtZW50c09uVG9wID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kZXNjcmliZShfZGVzY3JpcHRvcnMpO1xuICAgICAgICB0aGlzLmFwcGx5KF9hcHBsaWVycyk7XG4gICAgfVxuIHNldChzY29wZSwgdmFsdWVzKSB7XG4gICAgICAgIHJldHVybiBzZXQodGhpcywgc2NvcGUsIHZhbHVlcyk7XG4gICAgfVxuIGdldChzY29wZSkge1xuICAgICAgICByZXR1cm4gZ2V0U2NvcGUkMSh0aGlzLCBzY29wZSk7XG4gICAgfVxuIGRlc2NyaWJlKHNjb3BlLCB2YWx1ZXMpIHtcbiAgICAgICAgcmV0dXJuIHNldChkZXNjcmlwdG9ycywgc2NvcGUsIHZhbHVlcyk7XG4gICAgfVxuICAgIG92ZXJyaWRlKHNjb3BlLCB2YWx1ZXMpIHtcbiAgICAgICAgcmV0dXJuIHNldChvdmVycmlkZXMsIHNjb3BlLCB2YWx1ZXMpO1xuICAgIH1cbiByb3V0ZShzY29wZSwgbmFtZSwgdGFyZ2V0U2NvcGUsIHRhcmdldE5hbWUpIHtcbiAgICAgICAgY29uc3Qgc2NvcGVPYmplY3QgPSBnZXRTY29wZSQxKHRoaXMsIHNjb3BlKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0U2NvcGVPYmplY3QgPSBnZXRTY29wZSQxKHRoaXMsIHRhcmdldFNjb3BlKTtcbiAgICAgICAgY29uc3QgcHJpdmF0ZU5hbWUgPSAnXycgKyBuYW1lO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhzY29wZU9iamVjdCwge1xuICAgICAgICAgICAgW3ByaXZhdGVOYW1lXToge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBzY29wZU9iamVjdFtuYW1lXSxcbiAgICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFtuYW1lXToge1xuICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgZ2V0ICgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9jYWwgPSB0aGlzW3ByaXZhdGVOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gdGFyZ2V0U2NvcGVPYmplY3RbdGFyZ2V0TmFtZV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc09iamVjdChsb2NhbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCB0YXJnZXQsIGxvY2FsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWVPckRlZmF1bHQobG9jYWwsIHRhcmdldCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzZXQgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNbcHJpdmF0ZU5hbWVdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXBwbHkoYXBwbGllcnMpIHtcbiAgICAgICAgYXBwbGllcnMuZm9yRWFjaCgoYXBwbHkpPT5hcHBseSh0aGlzKSk7XG4gICAgfVxufVxudmFyIGRlZmF1bHRzID0gLyogI19fUFVSRV9fICovIG5ldyBEZWZhdWx0cyh7XG4gICAgX3NjcmlwdGFibGU6IChuYW1lKT0+IW5hbWUuc3RhcnRzV2l0aCgnb24nKSxcbiAgICBfaW5kZXhhYmxlOiAobmFtZSk9Pm5hbWUgIT09ICdldmVudHMnLFxuICAgIGhvdmVyOiB7XG4gICAgICAgIF9mYWxsYmFjazogJ2ludGVyYWN0aW9uJ1xuICAgIH0sXG4gICAgaW50ZXJhY3Rpb246IHtcbiAgICAgICAgX3NjcmlwdGFibGU6IGZhbHNlLFxuICAgICAgICBfaW5kZXhhYmxlOiBmYWxzZVxuICAgIH1cbn0sIFtcbiAgICBhcHBseUFuaW1hdGlvbnNEZWZhdWx0cyxcbiAgICBhcHBseUxheW91dHNEZWZhdWx0cyxcbiAgICBhcHBseVNjYWxlRGVmYXVsdHNcbl0pO1xuXG4vKipcbiAqIENvbnZlcnRzIHRoZSBnaXZlbiBmb250IG9iamVjdCBpbnRvIGEgQ1NTIGZvbnQgc3RyaW5nLlxuICogQHBhcmFtIGZvbnQgLSBBIGZvbnQgb2JqZWN0LlxuICogQHJldHVybiBUaGUgQ1NTIGZvbnQgc3RyaW5nLiBTZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL2ZvbnRcbiAqIEBwcml2YXRlXG4gKi8gZnVuY3Rpb24gdG9Gb250U3RyaW5nKGZvbnQpIHtcbiAgICBpZiAoIWZvbnQgfHwgaXNOdWxsT3JVbmRlZihmb250LnNpemUpIHx8IGlzTnVsbE9yVW5kZWYoZm9udC5mYW1pbHkpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gKGZvbnQuc3R5bGUgPyBmb250LnN0eWxlICsgJyAnIDogJycpICsgKGZvbnQud2VpZ2h0ID8gZm9udC53ZWlnaHQgKyAnICcgOiAnJykgKyBmb250LnNpemUgKyAncHggJyArIGZvbnQuZmFtaWx5O1xufVxuLyoqXG4gKiBAcHJpdmF0ZVxuICovIGZ1bmN0aW9uIF9tZWFzdXJlVGV4dChjdHgsIGRhdGEsIGdjLCBsb25nZXN0LCBzdHJpbmcpIHtcbiAgICBsZXQgdGV4dFdpZHRoID0gZGF0YVtzdHJpbmddO1xuICAgIGlmICghdGV4dFdpZHRoKSB7XG4gICAgICAgIHRleHRXaWR0aCA9IGRhdGFbc3RyaW5nXSA9IGN0eC5tZWFzdXJlVGV4dChzdHJpbmcpLndpZHRoO1xuICAgICAgICBnYy5wdXNoKHN0cmluZyk7XG4gICAgfVxuICAgIGlmICh0ZXh0V2lkdGggPiBsb25nZXN0KSB7XG4gICAgICAgIGxvbmdlc3QgPSB0ZXh0V2lkdGg7XG4gICAgfVxuICAgIHJldHVybiBsb25nZXN0O1xufVxuLyoqXG4gKiBAcHJpdmF0ZVxuICovIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG5mdW5jdGlvbiBfbG9uZ2VzdFRleHQoY3R4LCBmb250LCBhcnJheU9mVGhpbmdzLCBjYWNoZSkge1xuICAgIGNhY2hlID0gY2FjaGUgfHwge307XG4gICAgbGV0IGRhdGEgPSBjYWNoZS5kYXRhID0gY2FjaGUuZGF0YSB8fCB7fTtcbiAgICBsZXQgZ2MgPSBjYWNoZS5nYXJiYWdlQ29sbGVjdCA9IGNhY2hlLmdhcmJhZ2VDb2xsZWN0IHx8IFtdO1xuICAgIGlmIChjYWNoZS5mb250ICE9PSBmb250KSB7XG4gICAgICAgIGRhdGEgPSBjYWNoZS5kYXRhID0ge307XG4gICAgICAgIGdjID0gY2FjaGUuZ2FyYmFnZUNvbGxlY3QgPSBbXTtcbiAgICAgICAgY2FjaGUuZm9udCA9IGZvbnQ7XG4gICAgfVxuICAgIGN0eC5zYXZlKCk7XG4gICAgY3R4LmZvbnQgPSBmb250O1xuICAgIGxldCBsb25nZXN0ID0gMDtcbiAgICBjb25zdCBpbGVuID0gYXJyYXlPZlRoaW5ncy5sZW5ndGg7XG4gICAgbGV0IGksIGosIGpsZW4sIHRoaW5nLCBuZXN0ZWRUaGluZztcbiAgICBmb3IoaSA9IDA7IGkgPCBpbGVuOyBpKyspe1xuICAgICAgICB0aGluZyA9IGFycmF5T2ZUaGluZ3NbaV07XG4gICAgICAgIC8vIFVuZGVmaW5lZCBzdHJpbmdzIGFuZCBhcnJheXMgc2hvdWxkIG5vdCBiZSBtZWFzdXJlZFxuICAgICAgICBpZiAodGhpbmcgIT09IHVuZGVmaW5lZCAmJiB0aGluZyAhPT0gbnVsbCAmJiAhaXNBcnJheSh0aGluZykpIHtcbiAgICAgICAgICAgIGxvbmdlc3QgPSBfbWVhc3VyZVRleHQoY3R4LCBkYXRhLCBnYywgbG9uZ2VzdCwgdGhpbmcpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzQXJyYXkodGhpbmcpKSB7XG4gICAgICAgICAgICAvLyBpZiBpdCBpcyBhbiBhcnJheSBsZXRzIG1lYXN1cmUgZWFjaCBlbGVtZW50XG4gICAgICAgICAgICAvLyB0byBkbyBtYXliZSBzaW1wbGlmeSB0aGlzIGZ1bmN0aW9uIGEgYml0IHNvIHdlIGNhbiBkbyB0aGlzIG1vcmUgcmVjdXJzaXZlbHk/XG4gICAgICAgICAgICBmb3IoaiA9IDAsIGpsZW4gPSB0aGluZy5sZW5ndGg7IGogPCBqbGVuOyBqKyspe1xuICAgICAgICAgICAgICAgIG5lc3RlZFRoaW5nID0gdGhpbmdbal07XG4gICAgICAgICAgICAgICAgLy8gVW5kZWZpbmVkIHN0cmluZ3MgYW5kIGFycmF5cyBzaG91bGQgbm90IGJlIG1lYXN1cmVkXG4gICAgICAgICAgICAgICAgaWYgKG5lc3RlZFRoaW5nICE9PSB1bmRlZmluZWQgJiYgbmVzdGVkVGhpbmcgIT09IG51bGwgJiYgIWlzQXJyYXkobmVzdGVkVGhpbmcpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvbmdlc3QgPSBfbWVhc3VyZVRleHQoY3R4LCBkYXRhLCBnYywgbG9uZ2VzdCwgbmVzdGVkVGhpbmcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBjdHgucmVzdG9yZSgpO1xuICAgIGNvbnN0IGdjTGVuID0gZ2MubGVuZ3RoIC8gMjtcbiAgICBpZiAoZ2NMZW4gPiBhcnJheU9mVGhpbmdzLmxlbmd0aCkge1xuICAgICAgICBmb3IoaSA9IDA7IGkgPCBnY0xlbjsgaSsrKXtcbiAgICAgICAgICAgIGRlbGV0ZSBkYXRhW2djW2ldXTtcbiAgICAgICAgfVxuICAgICAgICBnYy5zcGxpY2UoMCwgZ2NMZW4pO1xuICAgIH1cbiAgICByZXR1cm4gbG9uZ2VzdDtcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgYWxpZ25lZCBwaXhlbCB2YWx1ZSB0byBhdm9pZCBhbnRpLWFsaWFzaW5nIGJsdXJcbiAqIEBwYXJhbSBjaGFydCAtIFRoZSBjaGFydCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwaXhlbCAtIEEgcGl4ZWwgdmFsdWUuXG4gKiBAcGFyYW0gd2lkdGggLSBUaGUgd2lkdGggb2YgdGhlIGVsZW1lbnQuXG4gKiBAcmV0dXJucyBUaGUgYWxpZ25lZCBwaXhlbCB2YWx1ZS5cbiAqIEBwcml2YXRlXG4gKi8gZnVuY3Rpb24gX2FsaWduUGl4ZWwoY2hhcnQsIHBpeGVsLCB3aWR0aCkge1xuICAgIGNvbnN0IGRldmljZVBpeGVsUmF0aW8gPSBjaGFydC5jdXJyZW50RGV2aWNlUGl4ZWxSYXRpbztcbiAgICBjb25zdCBoYWxmV2lkdGggPSB3aWR0aCAhPT0gMCA/IE1hdGgubWF4KHdpZHRoIC8gMiwgMC41KSA6IDA7XG4gICAgcmV0dXJuIE1hdGgucm91bmQoKHBpeGVsIC0gaGFsZldpZHRoKSAqIGRldmljZVBpeGVsUmF0aW8pIC8gZGV2aWNlUGl4ZWxSYXRpbyArIGhhbGZXaWR0aDtcbn1cbi8qKlxuICogQ2xlYXJzIHRoZSBlbnRpcmUgY2FudmFzLlxuICovIGZ1bmN0aW9uIGNsZWFyQ2FudmFzKGNhbnZhcywgY3R4KSB7XG4gICAgY3R4ID0gY3R4IHx8IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgIGN0eC5zYXZlKCk7XG4gICAgLy8gY2FudmFzLndpZHRoIGFuZCBjYW52YXMuaGVpZ2h0IGRvIG5vdCBjb25zaWRlciB0aGUgY2FudmFzIHRyYW5zZm9ybSxcbiAgICAvLyB3aGlsZSBjbGVhclJlY3QgZG9lc1xuICAgIGN0eC5yZXNldFRyYW5zZm9ybSgpO1xuICAgIGN0eC5jbGVhclJlY3QoMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTtcbiAgICBjdHgucmVzdG9yZSgpO1xufVxuZnVuY3Rpb24gZHJhd1BvaW50KGN0eCwgb3B0aW9ucywgeCwgeSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgICBkcmF3UG9pbnRMZWdlbmQoY3R4LCBvcHRpb25zLCB4LCB5LCBudWxsKTtcbn1cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG5mdW5jdGlvbiBkcmF3UG9pbnRMZWdlbmQoY3R4LCBvcHRpb25zLCB4LCB5LCB3KSB7XG4gICAgbGV0IHR5cGUsIHhPZmZzZXQsIHlPZmZzZXQsIHNpemUsIGNvcm5lclJhZGl1cywgd2lkdGgsIHhPZmZzZXRXLCB5T2Zmc2V0VztcbiAgICBjb25zdCBzdHlsZSA9IG9wdGlvbnMucG9pbnRTdHlsZTtcbiAgICBjb25zdCByb3RhdGlvbiA9IG9wdGlvbnMucm90YXRpb247XG4gICAgY29uc3QgcmFkaXVzID0gb3B0aW9ucy5yYWRpdXM7XG4gICAgbGV0IHJhZCA9IChyb3RhdGlvbiB8fCAwKSAqIFJBRF9QRVJfREVHO1xuICAgIGlmIChzdHlsZSAmJiB0eXBlb2Ygc3R5bGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIHR5cGUgPSBzdHlsZS50b1N0cmluZygpO1xuICAgICAgICBpZiAodHlwZSA9PT0gJ1tvYmplY3QgSFRNTEltYWdlRWxlbWVudF0nIHx8IHR5cGUgPT09ICdbb2JqZWN0IEhUTUxDYW52YXNFbGVtZW50XScpIHtcbiAgICAgICAgICAgIGN0eC5zYXZlKCk7XG4gICAgICAgICAgICBjdHgudHJhbnNsYXRlKHgsIHkpO1xuICAgICAgICAgICAgY3R4LnJvdGF0ZShyYWQpO1xuICAgICAgICAgICAgY3R4LmRyYXdJbWFnZShzdHlsZSwgLXN0eWxlLndpZHRoIC8gMiwgLXN0eWxlLmhlaWdodCAvIDIsIHN0eWxlLndpZHRoLCBzdHlsZS5oZWlnaHQpO1xuICAgICAgICAgICAgY3R4LnJlc3RvcmUoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNOYU4ocmFkaXVzKSB8fCByYWRpdXMgPD0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICBzd2l0Y2goc3R5bGUpe1xuICAgICAgICAvLyBEZWZhdWx0IGluY2x1ZGVzIGNpcmNsZVxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgaWYgKHcpIHtcbiAgICAgICAgICAgICAgICBjdHguZWxsaXBzZSh4LCB5LCB3IC8gMiwgcmFkaXVzLCAwLCAwLCBUQVUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjdHguYXJjKHgsIHksIHJhZGl1cywgMCwgVEFVKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN0eC5jbG9zZVBhdGgoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd0cmlhbmdsZSc6XG4gICAgICAgICAgICB3aWR0aCA9IHcgPyB3IC8gMiA6IHJhZGl1cztcbiAgICAgICAgICAgIGN0eC5tb3ZlVG8oeCArIE1hdGguc2luKHJhZCkgKiB3aWR0aCwgeSAtIE1hdGguY29zKHJhZCkgKiByYWRpdXMpO1xuICAgICAgICAgICAgcmFkICs9IFRXT19USElSRFNfUEk7XG4gICAgICAgICAgICBjdHgubGluZVRvKHggKyBNYXRoLnNpbihyYWQpICogd2lkdGgsIHkgLSBNYXRoLmNvcyhyYWQpICogcmFkaXVzKTtcbiAgICAgICAgICAgIHJhZCArPSBUV09fVEhJUkRTX1BJO1xuICAgICAgICAgICAgY3R4LmxpbmVUbyh4ICsgTWF0aC5zaW4ocmFkKSAqIHdpZHRoLCB5IC0gTWF0aC5jb3MocmFkKSAqIHJhZGl1cyk7XG4gICAgICAgICAgICBjdHguY2xvc2VQYXRoKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncmVjdFJvdW5kZWQnOlxuICAgICAgICAgICAgLy8gTk9URTogdGhlIHJvdW5kZWQgcmVjdCBpbXBsZW1lbnRhdGlvbiBjaGFuZ2VkIHRvIHVzZSBgYXJjYCBpbnN0ZWFkIG9mXG4gICAgICAgICAgICAvLyBgcXVhZHJhdGljQ3VydmVUb2Agc2luY2UgaXQgZ2VuZXJhdGVzIGJldHRlciByZXN1bHRzIHdoZW4gcmVjdCBpc1xuICAgICAgICAgICAgLy8gYWxtb3N0IGEgY2lyY2xlLiAwLjUxNiAoaW5zdGVhZCBvZiAwLjUpIHByb2R1Y2VzIHJlc3VsdHMgd2l0aCB2aXN1YWxseVxuICAgICAgICAgICAgLy8gY2xvc2VyIHByb3BvcnRpb24gdG8gdGhlIHByZXZpb3VzIGltcGwgYW5kIGl0IGlzIGluc2NyaWJlZCBpbiB0aGVcbiAgICAgICAgICAgIC8vIGNpcmNsZSB3aXRoIGByYWRpdXNgLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgdGhlIGZvbGxvd2luZyBQUnM6XG4gICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vY2hhcnRqcy9DaGFydC5qcy9pc3N1ZXMvNTU5N1xuICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2NoYXJ0anMvQ2hhcnQuanMvaXNzdWVzLzU4NThcbiAgICAgICAgICAgIGNvcm5lclJhZGl1cyA9IHJhZGl1cyAqIDAuNTE2O1xuICAgICAgICAgICAgc2l6ZSA9IHJhZGl1cyAtIGNvcm5lclJhZGl1cztcbiAgICAgICAgICAgIHhPZmZzZXQgPSBNYXRoLmNvcyhyYWQgKyBRVUFSVEVSX1BJKSAqIHNpemU7XG4gICAgICAgICAgICB4T2Zmc2V0VyA9IE1hdGguY29zKHJhZCArIFFVQVJURVJfUEkpICogKHcgPyB3IC8gMiAtIGNvcm5lclJhZGl1cyA6IHNpemUpO1xuICAgICAgICAgICAgeU9mZnNldCA9IE1hdGguc2luKHJhZCArIFFVQVJURVJfUEkpICogc2l6ZTtcbiAgICAgICAgICAgIHlPZmZzZXRXID0gTWF0aC5zaW4ocmFkICsgUVVBUlRFUl9QSSkgKiAodyA/IHcgLyAyIC0gY29ybmVyUmFkaXVzIDogc2l6ZSk7XG4gICAgICAgICAgICBjdHguYXJjKHggLSB4T2Zmc2V0VywgeSAtIHlPZmZzZXQsIGNvcm5lclJhZGl1cywgcmFkIC0gUEksIHJhZCAtIEhBTEZfUEkpO1xuICAgICAgICAgICAgY3R4LmFyYyh4ICsgeU9mZnNldFcsIHkgLSB4T2Zmc2V0LCBjb3JuZXJSYWRpdXMsIHJhZCAtIEhBTEZfUEksIHJhZCk7XG4gICAgICAgICAgICBjdHguYXJjKHggKyB4T2Zmc2V0VywgeSArIHlPZmZzZXQsIGNvcm5lclJhZGl1cywgcmFkLCByYWQgKyBIQUxGX1BJKTtcbiAgICAgICAgICAgIGN0eC5hcmMoeCAtIHlPZmZzZXRXLCB5ICsgeE9mZnNldCwgY29ybmVyUmFkaXVzLCByYWQgKyBIQUxGX1BJLCByYWQgKyBQSSk7XG4gICAgICAgICAgICBjdHguY2xvc2VQYXRoKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncmVjdCc6XG4gICAgICAgICAgICBpZiAoIXJvdGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgc2l6ZSA9IE1hdGguU1FSVDFfMiAqIHJhZGl1cztcbiAgICAgICAgICAgICAgICB3aWR0aCA9IHcgPyB3IC8gMiA6IHNpemU7XG4gICAgICAgICAgICAgICAgY3R4LnJlY3QoeCAtIHdpZHRoLCB5IC0gc2l6ZSwgMiAqIHdpZHRoLCAyICogc2l6ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByYWQgKz0gUVVBUlRFUl9QSTtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqLyBjYXNlICdyZWN0Um90JzpcbiAgICAgICAgICAgIHhPZmZzZXRXID0gTWF0aC5jb3MocmFkKSAqICh3ID8gdyAvIDIgOiByYWRpdXMpO1xuICAgICAgICAgICAgeE9mZnNldCA9IE1hdGguY29zKHJhZCkgKiByYWRpdXM7XG4gICAgICAgICAgICB5T2Zmc2V0ID0gTWF0aC5zaW4ocmFkKSAqIHJhZGl1cztcbiAgICAgICAgICAgIHlPZmZzZXRXID0gTWF0aC5zaW4ocmFkKSAqICh3ID8gdyAvIDIgOiByYWRpdXMpO1xuICAgICAgICAgICAgY3R4Lm1vdmVUbyh4IC0geE9mZnNldFcsIHkgLSB5T2Zmc2V0KTtcbiAgICAgICAgICAgIGN0eC5saW5lVG8oeCArIHlPZmZzZXRXLCB5IC0geE9mZnNldCk7XG4gICAgICAgICAgICBjdHgubGluZVRvKHggKyB4T2Zmc2V0VywgeSArIHlPZmZzZXQpO1xuICAgICAgICAgICAgY3R4LmxpbmVUbyh4IC0geU9mZnNldFcsIHkgKyB4T2Zmc2V0KTtcbiAgICAgICAgICAgIGN0eC5jbG9zZVBhdGgoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdjcm9zc1JvdCc6XG4gICAgICAgICAgICByYWQgKz0gUVVBUlRFUl9QSTtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqLyBjYXNlICdjcm9zcyc6XG4gICAgICAgICAgICB4T2Zmc2V0VyA9IE1hdGguY29zKHJhZCkgKiAodyA/IHcgLyAyIDogcmFkaXVzKTtcbiAgICAgICAgICAgIHhPZmZzZXQgPSBNYXRoLmNvcyhyYWQpICogcmFkaXVzO1xuICAgICAgICAgICAgeU9mZnNldCA9IE1hdGguc2luKHJhZCkgKiByYWRpdXM7XG4gICAgICAgICAgICB5T2Zmc2V0VyA9IE1hdGguc2luKHJhZCkgKiAodyA/IHcgLyAyIDogcmFkaXVzKTtcbiAgICAgICAgICAgIGN0eC5tb3ZlVG8oeCAtIHhPZmZzZXRXLCB5IC0geU9mZnNldCk7XG4gICAgICAgICAgICBjdHgubGluZVRvKHggKyB4T2Zmc2V0VywgeSArIHlPZmZzZXQpO1xuICAgICAgICAgICAgY3R4Lm1vdmVUbyh4ICsgeU9mZnNldFcsIHkgLSB4T2Zmc2V0KTtcbiAgICAgICAgICAgIGN0eC5saW5lVG8oeCAtIHlPZmZzZXRXLCB5ICsgeE9mZnNldCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnc3Rhcic6XG4gICAgICAgICAgICB4T2Zmc2V0VyA9IE1hdGguY29zKHJhZCkgKiAodyA/IHcgLyAyIDogcmFkaXVzKTtcbiAgICAgICAgICAgIHhPZmZzZXQgPSBNYXRoLmNvcyhyYWQpICogcmFkaXVzO1xuICAgICAgICAgICAgeU9mZnNldCA9IE1hdGguc2luKHJhZCkgKiByYWRpdXM7XG4gICAgICAgICAgICB5T2Zmc2V0VyA9IE1hdGguc2luKHJhZCkgKiAodyA/IHcgLyAyIDogcmFkaXVzKTtcbiAgICAgICAgICAgIGN0eC5tb3ZlVG8oeCAtIHhPZmZzZXRXLCB5IC0geU9mZnNldCk7XG4gICAgICAgICAgICBjdHgubGluZVRvKHggKyB4T2Zmc2V0VywgeSArIHlPZmZzZXQpO1xuICAgICAgICAgICAgY3R4Lm1vdmVUbyh4ICsgeU9mZnNldFcsIHkgLSB4T2Zmc2V0KTtcbiAgICAgICAgICAgIGN0eC5saW5lVG8oeCAtIHlPZmZzZXRXLCB5ICsgeE9mZnNldCk7XG4gICAgICAgICAgICByYWQgKz0gUVVBUlRFUl9QSTtcbiAgICAgICAgICAgIHhPZmZzZXRXID0gTWF0aC5jb3MocmFkKSAqICh3ID8gdyAvIDIgOiByYWRpdXMpO1xuICAgICAgICAgICAgeE9mZnNldCA9IE1hdGguY29zKHJhZCkgKiByYWRpdXM7XG4gICAgICAgICAgICB5T2Zmc2V0ID0gTWF0aC5zaW4ocmFkKSAqIHJhZGl1cztcbiAgICAgICAgICAgIHlPZmZzZXRXID0gTWF0aC5zaW4ocmFkKSAqICh3ID8gdyAvIDIgOiByYWRpdXMpO1xuICAgICAgICAgICAgY3R4Lm1vdmVUbyh4IC0geE9mZnNldFcsIHkgLSB5T2Zmc2V0KTtcbiAgICAgICAgICAgIGN0eC5saW5lVG8oeCArIHhPZmZzZXRXLCB5ICsgeU9mZnNldCk7XG4gICAgICAgICAgICBjdHgubW92ZVRvKHggKyB5T2Zmc2V0VywgeSAtIHhPZmZzZXQpO1xuICAgICAgICAgICAgY3R4LmxpbmVUbyh4IC0geU9mZnNldFcsIHkgKyB4T2Zmc2V0KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdsaW5lJzpcbiAgICAgICAgICAgIHhPZmZzZXQgPSB3ID8gdyAvIDIgOiBNYXRoLmNvcyhyYWQpICogcmFkaXVzO1xuICAgICAgICAgICAgeU9mZnNldCA9IE1hdGguc2luKHJhZCkgKiByYWRpdXM7XG4gICAgICAgICAgICBjdHgubW92ZVRvKHggLSB4T2Zmc2V0LCB5IC0geU9mZnNldCk7XG4gICAgICAgICAgICBjdHgubGluZVRvKHggKyB4T2Zmc2V0LCB5ICsgeU9mZnNldCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZGFzaCc6XG4gICAgICAgICAgICBjdHgubW92ZVRvKHgsIHkpO1xuICAgICAgICAgICAgY3R4LmxpbmVUbyh4ICsgTWF0aC5jb3MocmFkKSAqICh3ID8gdyAvIDIgOiByYWRpdXMpLCB5ICsgTWF0aC5zaW4ocmFkKSAqIHJhZGl1cyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBmYWxzZTpcbiAgICAgICAgICAgIGN0eC5jbG9zZVBhdGgoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjdHguZmlsbCgpO1xuICAgIGlmIChvcHRpb25zLmJvcmRlcldpZHRoID4gMCkge1xuICAgICAgICBjdHguc3Ryb2tlKCk7XG4gICAgfVxufVxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIHBvaW50IGlzIGluc2lkZSB0aGUgcmVjdGFuZ2xlXG4gKiBAcGFyYW0gcG9pbnQgLSBUaGUgcG9pbnQgdG8gdGVzdFxuICogQHBhcmFtIGFyZWEgLSBUaGUgcmVjdGFuZ2xlXG4gKiBAcGFyYW0gbWFyZ2luIC0gYWxsb3dlZCBtYXJnaW5cbiAqIEBwcml2YXRlXG4gKi8gZnVuY3Rpb24gX2lzUG9pbnRJbkFyZWEocG9pbnQsIGFyZWEsIG1hcmdpbikge1xuICAgIG1hcmdpbiA9IG1hcmdpbiB8fCAwLjU7IC8vIG1hcmdpbiAtIGRlZmF1bHQgaXMgdG8gbWF0Y2ggcm91bmRlZCBkZWNpbWFsc1xuICAgIHJldHVybiAhYXJlYSB8fCBwb2ludCAmJiBwb2ludC54ID4gYXJlYS5sZWZ0IC0gbWFyZ2luICYmIHBvaW50LnggPCBhcmVhLnJpZ2h0ICsgbWFyZ2luICYmIHBvaW50LnkgPiBhcmVhLnRvcCAtIG1hcmdpbiAmJiBwb2ludC55IDwgYXJlYS5ib3R0b20gKyBtYXJnaW47XG59XG5mdW5jdGlvbiBjbGlwQXJlYShjdHgsIGFyZWEpIHtcbiAgICBjdHguc2F2ZSgpO1xuICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICBjdHgucmVjdChhcmVhLmxlZnQsIGFyZWEudG9wLCBhcmVhLnJpZ2h0IC0gYXJlYS5sZWZ0LCBhcmVhLmJvdHRvbSAtIGFyZWEudG9wKTtcbiAgICBjdHguY2xpcCgpO1xufVxuZnVuY3Rpb24gdW5jbGlwQXJlYShjdHgpIHtcbiAgICBjdHgucmVzdG9yZSgpO1xufVxuLyoqXG4gKiBAcHJpdmF0ZVxuICovIGZ1bmN0aW9uIF9zdGVwcGVkTGluZVRvKGN0eCwgcHJldmlvdXMsIHRhcmdldCwgZmxpcCwgbW9kZSkge1xuICAgIGlmICghcHJldmlvdXMpIHtcbiAgICAgICAgcmV0dXJuIGN0eC5saW5lVG8odGFyZ2V0LngsIHRhcmdldC55KTtcbiAgICB9XG4gICAgaWYgKG1vZGUgPT09ICdtaWRkbGUnKSB7XG4gICAgICAgIGNvbnN0IG1pZHBvaW50ID0gKHByZXZpb3VzLnggKyB0YXJnZXQueCkgLyAyLjA7XG4gICAgICAgIGN0eC5saW5lVG8obWlkcG9pbnQsIHByZXZpb3VzLnkpO1xuICAgICAgICBjdHgubGluZVRvKG1pZHBvaW50LCB0YXJnZXQueSk7XG4gICAgfSBlbHNlIGlmIChtb2RlID09PSAnYWZ0ZXInICE9PSAhIWZsaXApIHtcbiAgICAgICAgY3R4LmxpbmVUbyhwcmV2aW91cy54LCB0YXJnZXQueSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY3R4LmxpbmVUbyh0YXJnZXQueCwgcHJldmlvdXMueSk7XG4gICAgfVxuICAgIGN0eC5saW5lVG8odGFyZ2V0LngsIHRhcmdldC55KTtcbn1cbi8qKlxuICogQHByaXZhdGVcbiAqLyBmdW5jdGlvbiBfYmV6aWVyQ3VydmVUbyhjdHgsIHByZXZpb3VzLCB0YXJnZXQsIGZsaXApIHtcbiAgICBpZiAoIXByZXZpb3VzKSB7XG4gICAgICAgIHJldHVybiBjdHgubGluZVRvKHRhcmdldC54LCB0YXJnZXQueSk7XG4gICAgfVxuICAgIGN0eC5iZXppZXJDdXJ2ZVRvKGZsaXAgPyBwcmV2aW91cy5jcDF4IDogcHJldmlvdXMuY3AyeCwgZmxpcCA/IHByZXZpb3VzLmNwMXkgOiBwcmV2aW91cy5jcDJ5LCBmbGlwID8gdGFyZ2V0LmNwMnggOiB0YXJnZXQuY3AxeCwgZmxpcCA/IHRhcmdldC5jcDJ5IDogdGFyZ2V0LmNwMXksIHRhcmdldC54LCB0YXJnZXQueSk7XG59XG5mdW5jdGlvbiBzZXRSZW5kZXJPcHRzKGN0eCwgb3B0cykge1xuICAgIGlmIChvcHRzLnRyYW5zbGF0aW9uKSB7XG4gICAgICAgIGN0eC50cmFuc2xhdGUob3B0cy50cmFuc2xhdGlvblswXSwgb3B0cy50cmFuc2xhdGlvblsxXSk7XG4gICAgfVxuICAgIGlmICghaXNOdWxsT3JVbmRlZihvcHRzLnJvdGF0aW9uKSkge1xuICAgICAgICBjdHgucm90YXRlKG9wdHMucm90YXRpb24pO1xuICAgIH1cbiAgICBpZiAob3B0cy5jb2xvcikge1xuICAgICAgICBjdHguZmlsbFN0eWxlID0gb3B0cy5jb2xvcjtcbiAgICB9XG4gICAgaWYgKG9wdHMudGV4dEFsaWduKSB7XG4gICAgICAgIGN0eC50ZXh0QWxpZ24gPSBvcHRzLnRleHRBbGlnbjtcbiAgICB9XG4gICAgaWYgKG9wdHMudGV4dEJhc2VsaW5lKSB7XG4gICAgICAgIGN0eC50ZXh0QmFzZWxpbmUgPSBvcHRzLnRleHRCYXNlbGluZTtcbiAgICB9XG59XG5mdW5jdGlvbiBkZWNvcmF0ZVRleHQoY3R4LCB4LCB5LCBsaW5lLCBvcHRzKSB7XG4gICAgaWYgKG9wdHMuc3RyaWtldGhyb3VnaCB8fCBvcHRzLnVuZGVybGluZSkge1xuICAgICAgICAvKipcbiAgICAgKiBOb3cgdGhhdCBJRTExIHN1cHBvcnQgaGFzIGJlZW4gZHJvcHBlZCwgd2UgY2FuIHVzZSBtb3JlXG4gICAgICogb2YgdGhlIFRleHRNZXRyaWNzIG9iamVjdC4gVGhlIGFjdHVhbCBib3VuZGluZyBib3hlc1xuICAgICAqIGFyZSB1bmZsYWdnZWQgaW4gQ2hyb21lLCBGaXJlZm94LCBFZGdlLCBhbmQgU2FmYXJpIHNvIHRoZXlcbiAgICAgKiBjYW4gYmUgc2FmZWx5IHVzZWQuXG4gICAgICogU2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9UZXh0TWV0cmljcyNCcm93c2VyX2NvbXBhdGliaWxpdHlcbiAgICAgKi8gY29uc3QgbWV0cmljcyA9IGN0eC5tZWFzdXJlVGV4dChsaW5lKTtcbiAgICAgICAgY29uc3QgbGVmdCA9IHggLSBtZXRyaWNzLmFjdHVhbEJvdW5kaW5nQm94TGVmdDtcbiAgICAgICAgY29uc3QgcmlnaHQgPSB4ICsgbWV0cmljcy5hY3R1YWxCb3VuZGluZ0JveFJpZ2h0O1xuICAgICAgICBjb25zdCB0b3AgPSB5IC0gbWV0cmljcy5hY3R1YWxCb3VuZGluZ0JveEFzY2VudDtcbiAgICAgICAgY29uc3QgYm90dG9tID0geSArIG1ldHJpY3MuYWN0dWFsQm91bmRpbmdCb3hEZXNjZW50O1xuICAgICAgICBjb25zdCB5RGVjb3JhdGlvbiA9IG9wdHMuc3RyaWtldGhyb3VnaCA/ICh0b3AgKyBib3R0b20pIC8gMiA6IGJvdHRvbTtcbiAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gY3R4LmZpbGxTdHlsZTtcbiAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgICBjdHgubGluZVdpZHRoID0gb3B0cy5kZWNvcmF0aW9uV2lkdGggfHwgMjtcbiAgICAgICAgY3R4Lm1vdmVUbyhsZWZ0LCB5RGVjb3JhdGlvbik7XG4gICAgICAgIGN0eC5saW5lVG8ocmlnaHQsIHlEZWNvcmF0aW9uKTtcbiAgICAgICAgY3R4LnN0cm9rZSgpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGRyYXdCYWNrZHJvcChjdHgsIG9wdHMpIHtcbiAgICBjb25zdCBvbGRDb2xvciA9IGN0eC5maWxsU3R5bGU7XG4gICAgY3R4LmZpbGxTdHlsZSA9IG9wdHMuY29sb3I7XG4gICAgY3R4LmZpbGxSZWN0KG9wdHMubGVmdCwgb3B0cy50b3AsIG9wdHMud2lkdGgsIG9wdHMuaGVpZ2h0KTtcbiAgICBjdHguZmlsbFN0eWxlID0gb2xkQ29sb3I7XG59XG4vKipcbiAqIFJlbmRlciB0ZXh0IG9udG8gdGhlIGNhbnZhc1xuICovIGZ1bmN0aW9uIHJlbmRlclRleHQoY3R4LCB0ZXh0LCB4LCB5LCBmb250LCBvcHRzID0ge30pIHtcbiAgICBjb25zdCBsaW5lcyA9IGlzQXJyYXkodGV4dCkgPyB0ZXh0IDogW1xuICAgICAgICB0ZXh0XG4gICAgXTtcbiAgICBjb25zdCBzdHJva2UgPSBvcHRzLnN0cm9rZVdpZHRoID4gMCAmJiBvcHRzLnN0cm9rZUNvbG9yICE9PSAnJztcbiAgICBsZXQgaSwgbGluZTtcbiAgICBjdHguc2F2ZSgpO1xuICAgIGN0eC5mb250ID0gZm9udC5zdHJpbmc7XG4gICAgc2V0UmVuZGVyT3B0cyhjdHgsIG9wdHMpO1xuICAgIGZvcihpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgKytpKXtcbiAgICAgICAgbGluZSA9IGxpbmVzW2ldO1xuICAgICAgICBpZiAob3B0cy5iYWNrZHJvcCkge1xuICAgICAgICAgICAgZHJhd0JhY2tkcm9wKGN0eCwgb3B0cy5iYWNrZHJvcCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0cm9rZSkge1xuICAgICAgICAgICAgaWYgKG9wdHMuc3Ryb2tlQ29sb3IpIHtcbiAgICAgICAgICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSBvcHRzLnN0cm9rZUNvbG9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFpc051bGxPclVuZGVmKG9wdHMuc3Ryb2tlV2lkdGgpKSB7XG4gICAgICAgICAgICAgICAgY3R4LmxpbmVXaWR0aCA9IG9wdHMuc3Ryb2tlV2lkdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjdHguc3Ryb2tlVGV4dChsaW5lLCB4LCB5LCBvcHRzLm1heFdpZHRoKTtcbiAgICAgICAgfVxuICAgICAgICBjdHguZmlsbFRleHQobGluZSwgeCwgeSwgb3B0cy5tYXhXaWR0aCk7XG4gICAgICAgIGRlY29yYXRlVGV4dChjdHgsIHgsIHksIGxpbmUsIG9wdHMpO1xuICAgICAgICB5ICs9IE51bWJlcihmb250LmxpbmVIZWlnaHQpO1xuICAgIH1cbiAgICBjdHgucmVzdG9yZSgpO1xufVxuLyoqXG4gKiBBZGQgYSBwYXRoIG9mIGEgcmVjdGFuZ2xlIHdpdGggcm91bmRlZCBjb3JuZXJzIHRvIHRoZSBjdXJyZW50IHN1Yi1wYXRoXG4gKiBAcGFyYW0gY3R4IC0gQ29udGV4dFxuICogQHBhcmFtIHJlY3QgLSBCb3VuZGluZyByZWN0XG4gKi8gZnVuY3Rpb24gYWRkUm91bmRlZFJlY3RQYXRoKGN0eCwgcmVjdCkge1xuICAgIGNvbnN0IHsgeCAsIHkgLCB3ICwgaCAsIHJhZGl1cyAgfSA9IHJlY3Q7XG4gICAgLy8gdG9wIGxlZnQgYXJjXG4gICAgY3R4LmFyYyh4ICsgcmFkaXVzLnRvcExlZnQsIHkgKyByYWRpdXMudG9wTGVmdCwgcmFkaXVzLnRvcExlZnQsIDEuNSAqIFBJLCBQSSwgdHJ1ZSk7XG4gICAgLy8gbGluZSBmcm9tIHRvcCBsZWZ0IHRvIGJvdHRvbSBsZWZ0XG4gICAgY3R4LmxpbmVUbyh4LCB5ICsgaCAtIHJhZGl1cy5ib3R0b21MZWZ0KTtcbiAgICAvLyBib3R0b20gbGVmdCBhcmNcbiAgICBjdHguYXJjKHggKyByYWRpdXMuYm90dG9tTGVmdCwgeSArIGggLSByYWRpdXMuYm90dG9tTGVmdCwgcmFkaXVzLmJvdHRvbUxlZnQsIFBJLCBIQUxGX1BJLCB0cnVlKTtcbiAgICAvLyBsaW5lIGZyb20gYm90dG9tIGxlZnQgdG8gYm90dG9tIHJpZ2h0XG4gICAgY3R4LmxpbmVUbyh4ICsgdyAtIHJhZGl1cy5ib3R0b21SaWdodCwgeSArIGgpO1xuICAgIC8vIGJvdHRvbSByaWdodCBhcmNcbiAgICBjdHguYXJjKHggKyB3IC0gcmFkaXVzLmJvdHRvbVJpZ2h0LCB5ICsgaCAtIHJhZGl1cy5ib3R0b21SaWdodCwgcmFkaXVzLmJvdHRvbVJpZ2h0LCBIQUxGX1BJLCAwLCB0cnVlKTtcbiAgICAvLyBsaW5lIGZyb20gYm90dG9tIHJpZ2h0IHRvIHRvcCByaWdodFxuICAgIGN0eC5saW5lVG8oeCArIHcsIHkgKyByYWRpdXMudG9wUmlnaHQpO1xuICAgIC8vIHRvcCByaWdodCBhcmNcbiAgICBjdHguYXJjKHggKyB3IC0gcmFkaXVzLnRvcFJpZ2h0LCB5ICsgcmFkaXVzLnRvcFJpZ2h0LCByYWRpdXMudG9wUmlnaHQsIDAsIC1IQUxGX1BJLCB0cnVlKTtcbiAgICAvLyBsaW5lIGZyb20gdG9wIHJpZ2h0IHRvIHRvcCBsZWZ0XG4gICAgY3R4LmxpbmVUbyh4ICsgcmFkaXVzLnRvcExlZnQsIHkpO1xufVxuXG5jb25zdCBMSU5FX0hFSUdIVCA9IC9eKG5vcm1hbHwoXFxkKyg/OlxcLlxcZCspPykocHh8ZW18JSk/KSQvO1xuY29uc3QgRk9OVF9TVFlMRSA9IC9eKG5vcm1hbHxpdGFsaWN8aW5pdGlhbHxpbmhlcml0fHVuc2V0fChvYmxpcXVlKCAtP1swLTldP1swLTldZGVnKT8pKSQvO1xuLyoqXG4gKiBAYWxpYXMgQ2hhcnQuaGVscGVycy5vcHRpb25zXG4gKiBAbmFtZXNwYWNlXG4gKi8gLyoqXG4gKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gbGluZSBoZWlnaHQgYHZhbHVlYCBpbiBwaXhlbHMgZm9yIGEgc3BlY2lmaWMgZm9udCBgc2l6ZWAuXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgbGluZUhlaWdodCB0byBwYXJzZSAoZWcuIDEuNiwgJzE0cHgnLCAnNzUlJywgJzEuNmVtJykuXG4gKiBAcGFyYW0gc2l6ZSAtIFRoZSBmb250IHNpemUgKGluIHBpeGVscykgdXNlZCB0byByZXNvbHZlIHJlbGF0aXZlIGB2YWx1ZWAuXG4gKiBAcmV0dXJucyBUaGUgZWZmZWN0aXZlIGxpbmUgaGVpZ2h0IGluIHBpeGVscyAoc2l6ZSAqIDEuMiBpZiB2YWx1ZSBpcyBpbnZhbGlkKS5cbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL2xpbmUtaGVpZ2h0XG4gKiBAc2luY2UgMi43LjBcbiAqLyBmdW5jdGlvbiB0b0xpbmVIZWlnaHQodmFsdWUsIHNpemUpIHtcbiAgICBjb25zdCBtYXRjaGVzID0gKCcnICsgdmFsdWUpLm1hdGNoKExJTkVfSEVJR0hUKTtcbiAgICBpZiAoIW1hdGNoZXMgfHwgbWF0Y2hlc1sxXSA9PT0gJ25vcm1hbCcpIHtcbiAgICAgICAgcmV0dXJuIHNpemUgKiAxLjI7XG4gICAgfVxuICAgIHZhbHVlID0gK21hdGNoZXNbMl07XG4gICAgc3dpdGNoKG1hdGNoZXNbM10pe1xuICAgICAgICBjYXNlICdweCc6XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIGNhc2UgJyUnOlxuICAgICAgICAgICAgdmFsdWUgLz0gMTAwO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiBzaXplICogdmFsdWU7XG59XG5jb25zdCBudW1iZXJPclplcm8gPSAodik9Pit2IHx8IDA7XG5mdW5jdGlvbiBfcmVhZFZhbHVlVG9Qcm9wcyh2YWx1ZSwgcHJvcHMpIHtcbiAgICBjb25zdCByZXQgPSB7fTtcbiAgICBjb25zdCBvYmpQcm9wcyA9IGlzT2JqZWN0KHByb3BzKTtcbiAgICBjb25zdCBrZXlzID0gb2JqUHJvcHMgPyBPYmplY3Qua2V5cyhwcm9wcykgOiBwcm9wcztcbiAgICBjb25zdCByZWFkID0gaXNPYmplY3QodmFsdWUpID8gb2JqUHJvcHMgPyAocHJvcCk9PnZhbHVlT3JEZWZhdWx0KHZhbHVlW3Byb3BdLCB2YWx1ZVtwcm9wc1twcm9wXV0pIDogKHByb3ApPT52YWx1ZVtwcm9wXSA6ICgpPT52YWx1ZTtcbiAgICBmb3IgKGNvbnN0IHByb3Agb2Yga2V5cyl7XG4gICAgICAgIHJldFtwcm9wXSA9IG51bWJlck9yWmVybyhyZWFkKHByb3ApKTtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbn1cbi8qKlxuICogQ29udmVydHMgdGhlIGdpdmVuIHZhbHVlIGludG8gYSBUUkJMIG9iamVjdC5cbiAqIEBwYXJhbSB2YWx1ZSAtIElmIGEgbnVtYmVyLCBzZXQgdGhlIHZhbHVlIHRvIGFsbCBUUkJMIGNvbXBvbmVudCxcbiAqICBlbHNlLCBpZiBhbiBvYmplY3QsIHVzZSBkZWZpbmVkIHByb3BlcnRpZXMgYW5kIHNldHMgdW5kZWZpbmVkIG9uZXMgdG8gMC5cbiAqICB4IC8geSBhcmUgc2hvcnRoYW5kcyBmb3Igc2FtZSB2YWx1ZSBmb3IgbGVmdC9yaWdodCBhbmQgdG9wL2JvdHRvbS5cbiAqIEByZXR1cm5zIFRoZSBwYWRkaW5nIHZhbHVlcyAodG9wLCByaWdodCwgYm90dG9tLCBsZWZ0KVxuICogQHNpbmNlIDMuMC4wXG4gKi8gZnVuY3Rpb24gdG9UUkJMKHZhbHVlKSB7XG4gICAgcmV0dXJuIF9yZWFkVmFsdWVUb1Byb3BzKHZhbHVlLCB7XG4gICAgICAgIHRvcDogJ3knLFxuICAgICAgICByaWdodDogJ3gnLFxuICAgICAgICBib3R0b206ICd5JyxcbiAgICAgICAgbGVmdDogJ3gnXG4gICAgfSk7XG59XG4vKipcbiAqIENvbnZlcnRzIHRoZSBnaXZlbiB2YWx1ZSBpbnRvIGEgVFJCTCBjb3JuZXJzIG9iamVjdCAoc2ltaWxhciB3aXRoIGNzcyBib3JkZXItcmFkaXVzKS5cbiAqIEBwYXJhbSB2YWx1ZSAtIElmIGEgbnVtYmVyLCBzZXQgdGhlIHZhbHVlIHRvIGFsbCBUUkJMIGNvcm5lciBjb21wb25lbnRzLFxuICogIGVsc2UsIGlmIGFuIG9iamVjdCwgdXNlIGRlZmluZWQgcHJvcGVydGllcyBhbmQgc2V0cyB1bmRlZmluZWQgb25lcyB0byAwLlxuICogQHJldHVybnMgVGhlIFRSQkwgY29ybmVyIHZhbHVlcyAodG9wTGVmdCwgdG9wUmlnaHQsIGJvdHRvbUxlZnQsIGJvdHRvbVJpZ2h0KVxuICogQHNpbmNlIDMuMC4wXG4gKi8gZnVuY3Rpb24gdG9UUkJMQ29ybmVycyh2YWx1ZSkge1xuICAgIHJldHVybiBfcmVhZFZhbHVlVG9Qcm9wcyh2YWx1ZSwgW1xuICAgICAgICAndG9wTGVmdCcsXG4gICAgICAgICd0b3BSaWdodCcsXG4gICAgICAgICdib3R0b21MZWZ0JyxcbiAgICAgICAgJ2JvdHRvbVJpZ2h0J1xuICAgIF0pO1xufVxuLyoqXG4gKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gdmFsdWUgaW50byBhIHBhZGRpbmcgb2JqZWN0IHdpdGggcHJlLWNvbXB1dGVkIHdpZHRoL2hlaWdodC5cbiAqIEBwYXJhbSB2YWx1ZSAtIElmIGEgbnVtYmVyLCBzZXQgdGhlIHZhbHVlIHRvIGFsbCBUUkJMIGNvbXBvbmVudCxcbiAqICBlbHNlLCBpZiBhbiBvYmplY3QsIHVzZSBkZWZpbmVkIHByb3BlcnRpZXMgYW5kIHNldHMgdW5kZWZpbmVkIG9uZXMgdG8gMC5cbiAqICB4IC8geSBhcmUgc2hvcnRoYW5kcyBmb3Igc2FtZSB2YWx1ZSBmb3IgbGVmdC9yaWdodCBhbmQgdG9wL2JvdHRvbS5cbiAqIEByZXR1cm5zIFRoZSBwYWRkaW5nIHZhbHVlcyAodG9wLCByaWdodCwgYm90dG9tLCBsZWZ0LCB3aWR0aCwgaGVpZ2h0KVxuICogQHNpbmNlIDIuNy4wXG4gKi8gZnVuY3Rpb24gdG9QYWRkaW5nKHZhbHVlKSB7XG4gICAgY29uc3Qgb2JqID0gdG9UUkJMKHZhbHVlKTtcbiAgICBvYmoud2lkdGggPSBvYmoubGVmdCArIG9iai5yaWdodDtcbiAgICBvYmouaGVpZ2h0ID0gb2JqLnRvcCArIG9iai5ib3R0b207XG4gICAgcmV0dXJuIG9iajtcbn1cbi8qKlxuICogUGFyc2VzIGZvbnQgb3B0aW9ucyBhbmQgcmV0dXJucyB0aGUgZm9udCBvYmplY3QuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEEgb2JqZWN0IHRoYXQgY29udGFpbnMgZm9udCBvcHRpb25zIHRvIGJlIHBhcnNlZC5cbiAqIEBwYXJhbSBmYWxsYmFjayAtIEEgb2JqZWN0IHRoYXQgY29udGFpbnMgZmFsbGJhY2sgZm9udCBvcHRpb25zLlxuICogQHJldHVybiBUaGUgZm9udCBvYmplY3QuXG4gKiBAcHJpdmF0ZVxuICovIGZ1bmN0aW9uIHRvRm9udChvcHRpb25zLCBmYWxsYmFjaykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIGZhbGxiYWNrID0gZmFsbGJhY2sgfHwgZGVmYXVsdHMuZm9udDtcbiAgICBsZXQgc2l6ZSA9IHZhbHVlT3JEZWZhdWx0KG9wdGlvbnMuc2l6ZSwgZmFsbGJhY2suc2l6ZSk7XG4gICAgaWYgKHR5cGVvZiBzaXplID09PSAnc3RyaW5nJykge1xuICAgICAgICBzaXplID0gcGFyc2VJbnQoc2l6ZSwgMTApO1xuICAgIH1cbiAgICBsZXQgc3R5bGUgPSB2YWx1ZU9yRGVmYXVsdChvcHRpb25zLnN0eWxlLCBmYWxsYmFjay5zdHlsZSk7XG4gICAgaWYgKHN0eWxlICYmICEoJycgKyBzdHlsZSkubWF0Y2goRk9OVF9TVFlMRSkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdJbnZhbGlkIGZvbnQgc3R5bGUgc3BlY2lmaWVkOiBcIicgKyBzdHlsZSArICdcIicpO1xuICAgICAgICBzdHlsZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgZm9udCA9IHtcbiAgICAgICAgZmFtaWx5OiB2YWx1ZU9yRGVmYXVsdChvcHRpb25zLmZhbWlseSwgZmFsbGJhY2suZmFtaWx5KSxcbiAgICAgICAgbGluZUhlaWdodDogdG9MaW5lSGVpZ2h0KHZhbHVlT3JEZWZhdWx0KG9wdGlvbnMubGluZUhlaWdodCwgZmFsbGJhY2subGluZUhlaWdodCksIHNpemUpLFxuICAgICAgICBzaXplLFxuICAgICAgICBzdHlsZSxcbiAgICAgICAgd2VpZ2h0OiB2YWx1ZU9yRGVmYXVsdChvcHRpb25zLndlaWdodCwgZmFsbGJhY2sud2VpZ2h0KSxcbiAgICAgICAgc3RyaW5nOiAnJ1xuICAgIH07XG4gICAgZm9udC5zdHJpbmcgPSB0b0ZvbnRTdHJpbmcoZm9udCk7XG4gICAgcmV0dXJuIGZvbnQ7XG59XG4vKipcbiAqIEV2YWx1YXRlcyB0aGUgZ2l2ZW4gYGlucHV0c2Agc2VxdWVudGlhbGx5IGFuZCByZXR1cm5zIHRoZSBmaXJzdCBkZWZpbmVkIHZhbHVlLlxuICogQHBhcmFtIGlucHV0cyAtIEFuIGFycmF5IG9mIHZhbHVlcywgZmFsbGluZyBiYWNrIHRvIHRoZSBsYXN0IHZhbHVlLlxuICogQHBhcmFtIGNvbnRleHQgLSBJZiBkZWZpbmVkIGFuZCB0aGUgY3VycmVudCB2YWx1ZSBpcyBhIGZ1bmN0aW9uLCB0aGUgdmFsdWVcbiAqIGlzIGNhbGxlZCB3aXRoIGBjb250ZXh0YCBhcyBmaXJzdCBhcmd1bWVudCBhbmQgdGhlIHJlc3VsdCBiZWNvbWVzIHRoZSBuZXcgaW5wdXQuXG4gKiBAcGFyYW0gaW5kZXggLSBJZiBkZWZpbmVkIGFuZCB0aGUgY3VycmVudCB2YWx1ZSBpcyBhbiBhcnJheSwgdGhlIHZhbHVlXG4gKiBhdCBgaW5kZXhgIGJlY29tZSB0aGUgbmV3IGlucHV0LlxuICogQHBhcmFtIGluZm8gLSBvYmplY3QgdG8gcmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHJlc29sdXRpb24gaW5cbiAqIEBwYXJhbSBpbmZvLmNhY2hlYWJsZSAtIFdpbGwgYmUgc2V0IHRvIGBmYWxzZWAgaWYgb3B0aW9uIGlzIG5vdCBjYWNoZWFibGUuXG4gKiBAc2luY2UgMi43LjBcbiAqLyBmdW5jdGlvbiByZXNvbHZlKGlucHV0cywgY29udGV4dCwgaW5kZXgsIGluZm8pIHtcbiAgICBsZXQgY2FjaGVhYmxlID0gdHJ1ZTtcbiAgICBsZXQgaSwgaWxlbiwgdmFsdWU7XG4gICAgZm9yKGkgPSAwLCBpbGVuID0gaW5wdXRzLmxlbmd0aDsgaSA8IGlsZW47ICsraSl7XG4gICAgICAgIHZhbHVlID0gaW5wdXRzW2ldO1xuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbnRleHQgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUoY29udGV4dCk7XG4gICAgICAgICAgICBjYWNoZWFibGUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5kZXggIT09IHVuZGVmaW5lZCAmJiBpc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZVtpbmRleCAlIHZhbHVlLmxlbmd0aF07XG4gICAgICAgICAgICBjYWNoZWFibGUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaWYgKGluZm8gJiYgIWNhY2hlYWJsZSkge1xuICAgICAgICAgICAgICAgIGluZm8uY2FjaGVhYmxlID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIEBwYXJhbSBtaW5tYXhcbiAqIEBwYXJhbSBncmFjZVxuICogQHBhcmFtIGJlZ2luQXRaZXJvXG4gKiBAcHJpdmF0ZVxuICovIGZ1bmN0aW9uIF9hZGRHcmFjZShtaW5tYXgsIGdyYWNlLCBiZWdpbkF0WmVybykge1xuICAgIGNvbnN0IHsgbWluICwgbWF4ICB9ID0gbWlubWF4O1xuICAgIGNvbnN0IGNoYW5nZSA9IHRvRGltZW5zaW9uKGdyYWNlLCAobWF4IC0gbWluKSAvIDIpO1xuICAgIGNvbnN0IGtlZXBaZXJvID0gKHZhbHVlLCBhZGQpPT5iZWdpbkF0WmVybyAmJiB2YWx1ZSA9PT0gMCA/IDAgOiB2YWx1ZSArIGFkZDtcbiAgICByZXR1cm4ge1xuICAgICAgICBtaW46IGtlZXBaZXJvKG1pbiwgLU1hdGguYWJzKGNoYW5nZSkpLFxuICAgICAgICBtYXg6IGtlZXBaZXJvKG1heCwgY2hhbmdlKVxuICAgIH07XG59XG5mdW5jdGlvbiBjcmVhdGVDb250ZXh0KHBhcmVudENvbnRleHQsIGNvbnRleHQpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKHBhcmVudENvbnRleHQpLCBjb250ZXh0KTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgUHJveHkgZm9yIHJlc29sdmluZyByYXcgdmFsdWVzIGZvciBvcHRpb25zLlxuICogQHBhcmFtIHNjb3BlcyAtIFRoZSBvcHRpb24gc2NvcGVzIHRvIGxvb2sgZm9yIHZhbHVlcywgaW4gcmVzb2x1dGlvbiBvcmRlclxuICogQHBhcmFtIHByZWZpeGVzIC0gVGhlIHByZWZpeGVzIGZvciB2YWx1ZXMsIGluIHJlc29sdXRpb24gb3JkZXIuXG4gKiBAcGFyYW0gcm9vdFNjb3BlcyAtIFRoZSByb290IG9wdGlvbiBzY29wZXNcbiAqIEBwYXJhbSBmYWxsYmFjayAtIFBhcmVudCBzY29wZXMgZmFsbGJhY2tcbiAqIEBwYXJhbSBnZXRUYXJnZXQgLSBjYWxsYmFjayBmb3IgZ2V0dGluZyB0aGUgdGFyZ2V0IGZvciBjaGFuZ2VkIHZhbHVlc1xuICogQHJldHVybnMgUHJveHlcbiAqIEBwcml2YXRlXG4gKi8gZnVuY3Rpb24gX2NyZWF0ZVJlc29sdmVyKHNjb3BlcywgcHJlZml4ZXMgPSBbXG4gICAgJydcbl0sIHJvb3RTY29wZXMsIGZhbGxiYWNrLCBnZXRUYXJnZXQgPSAoKT0+c2NvcGVzWzBdKSB7XG4gICAgY29uc3QgZmluYWxSb290U2NvcGVzID0gcm9vdFNjb3BlcyB8fCBzY29wZXM7XG4gICAgaWYgKHR5cGVvZiBmYWxsYmFjayA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgZmFsbGJhY2sgPSBfcmVzb2x2ZSgnX2ZhbGxiYWNrJywgc2NvcGVzKTtcbiAgICB9XG4gICAgY29uc3QgY2FjaGUgPSB7XG4gICAgICAgIFtTeW1ib2wudG9TdHJpbmdUYWddOiAnT2JqZWN0JyxcbiAgICAgICAgX2NhY2hlYWJsZTogdHJ1ZSxcbiAgICAgICAgX3Njb3Blczogc2NvcGVzLFxuICAgICAgICBfcm9vdFNjb3BlczogZmluYWxSb290U2NvcGVzLFxuICAgICAgICBfZmFsbGJhY2s6IGZhbGxiYWNrLFxuICAgICAgICBfZ2V0VGFyZ2V0OiBnZXRUYXJnZXQsXG4gICAgICAgIG92ZXJyaWRlOiAoc2NvcGUpPT5fY3JlYXRlUmVzb2x2ZXIoW1xuICAgICAgICAgICAgICAgIHNjb3BlLFxuICAgICAgICAgICAgICAgIC4uLnNjb3Blc1xuICAgICAgICAgICAgXSwgcHJlZml4ZXMsIGZpbmFsUm9vdFNjb3BlcywgZmFsbGJhY2spXG4gICAgfTtcbiAgICByZXR1cm4gbmV3IFByb3h5KGNhY2hlLCB7XG4gICAgICAgIC8qKlxuICAgICAqIEEgdHJhcCBmb3IgdGhlIGRlbGV0ZSBvcGVyYXRvci5cbiAgICAgKi8gZGVsZXRlUHJvcGVydHkgKHRhcmdldCwgcHJvcCkge1xuICAgICAgICAgICAgZGVsZXRlIHRhcmdldFtwcm9wXTsgLy8gcmVtb3ZlIGZyb20gY2FjaGVcbiAgICAgICAgICAgIGRlbGV0ZSB0YXJnZXQuX2tleXM7IC8vIHJlbW92ZSBjYWNoZWQga2V5c1xuICAgICAgICAgICAgZGVsZXRlIHNjb3Blc1swXVtwcm9wXTsgLy8gcmVtb3ZlIGZyb20gdG9wIGxldmVsIHNjb3BlXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICogQSB0cmFwIGZvciBnZXR0aW5nIHByb3BlcnR5IHZhbHVlcy5cbiAgICAgKi8gZ2V0ICh0YXJnZXQsIHByb3ApIHtcbiAgICAgICAgICAgIHJldHVybiBfY2FjaGVkKHRhcmdldCwgcHJvcCwgKCk9Pl9yZXNvbHZlV2l0aFByZWZpeGVzKHByb3AsIHByZWZpeGVzLCBzY29wZXMsIHRhcmdldCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgKiBBIHRyYXAgZm9yIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuXG4gICAgICogQWxzbyB1c2VkIGJ5IE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5cbiAgICAgKi8gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yICh0YXJnZXQsIHByb3ApIHtcbiAgICAgICAgICAgIHJldHVybiBSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQuX3Njb3Blc1swXSwgcHJvcCk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAqIEEgdHJhcCBmb3IgT2JqZWN0LmdldFByb3RvdHlwZU9mLlxuICAgICAqLyBnZXRQcm90b3R5cGVPZiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXRQcm90b3R5cGVPZihzY29wZXNbMF0pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgKiBBIHRyYXAgZm9yIHRoZSBpbiBvcGVyYXRvci5cbiAgICAgKi8gaGFzICh0YXJnZXQsIHByb3ApIHtcbiAgICAgICAgICAgIHJldHVybiBnZXRLZXlzRnJvbUFsbFNjb3Blcyh0YXJnZXQpLmluY2x1ZGVzKHByb3ApO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgKiBBIHRyYXAgZm9yIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIGFuZCBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzLlxuICAgICAqLyBvd25LZXlzICh0YXJnZXQpIHtcbiAgICAgICAgICAgIHJldHVybiBnZXRLZXlzRnJvbUFsbFNjb3Blcyh0YXJnZXQpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgKiBBIHRyYXAgZm9yIHNldHRpbmcgcHJvcGVydHkgdmFsdWVzLlxuICAgICAqLyBzZXQgKHRhcmdldCwgcHJvcCwgdmFsdWUpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0b3JhZ2UgPSB0YXJnZXQuX3N0b3JhZ2UgfHwgKHRhcmdldC5fc3RvcmFnZSA9IGdldFRhcmdldCgpKTtcbiAgICAgICAgICAgIHRhcmdldFtwcm9wXSA9IHN0b3JhZ2VbcHJvcF0gPSB2YWx1ZTsgLy8gc2V0IHRvIHRvcCBsZXZlbCBzY29wZSArIGNhY2hlXG4gICAgICAgICAgICBkZWxldGUgdGFyZ2V0Ll9rZXlzOyAvLyByZW1vdmUgY2FjaGVkIGtleXNcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfSk7XG59XG4vKipcbiAqIFJldHVybnMgYW4gUHJveHkgZm9yIHJlc29sdmluZyBvcHRpb24gdmFsdWVzIHdpdGggY29udGV4dC5cbiAqIEBwYXJhbSBwcm94eSAtIFRoZSBQcm94eSByZXR1cm5lZCBieSBgX2NyZWF0ZVJlc29sdmVyYFxuICogQHBhcmFtIGNvbnRleHQgLSBDb250ZXh0IG9iamVjdCBmb3Igc2NyaXB0YWJsZS9pbmRleGFibGUgb3B0aW9uc1xuICogQHBhcmFtIHN1YlByb3h5IC0gVGhlIHByb3h5IHByb3ZpZGVkIGZvciBzY3JpcHRhYmxlIG9wdGlvbnNcbiAqIEBwYXJhbSBkZXNjcmlwdG9yRGVmYXVsdHMgLSBEZWZhdWx0cyBmb3IgZGVzY3JpcHRvcnNcbiAqIEBwcml2YXRlXG4gKi8gZnVuY3Rpb24gX2F0dGFjaENvbnRleHQocHJveHksIGNvbnRleHQsIHN1YlByb3h5LCBkZXNjcmlwdG9yRGVmYXVsdHMpIHtcbiAgICBjb25zdCBjYWNoZSA9IHtcbiAgICAgICAgX2NhY2hlYWJsZTogZmFsc2UsXG4gICAgICAgIF9wcm94eTogcHJveHksXG4gICAgICAgIF9jb250ZXh0OiBjb250ZXh0LFxuICAgICAgICBfc3ViUHJveHk6IHN1YlByb3h5LFxuICAgICAgICBfc3RhY2s6IG5ldyBTZXQoKSxcbiAgICAgICAgX2Rlc2NyaXB0b3JzOiBfZGVzY3JpcHRvcnMocHJveHksIGRlc2NyaXB0b3JEZWZhdWx0cyksXG4gICAgICAgIHNldENvbnRleHQ6IChjdHgpPT5fYXR0YWNoQ29udGV4dChwcm94eSwgY3R4LCBzdWJQcm94eSwgZGVzY3JpcHRvckRlZmF1bHRzKSxcbiAgICAgICAgb3ZlcnJpZGU6IChzY29wZSk9Pl9hdHRhY2hDb250ZXh0KHByb3h5Lm92ZXJyaWRlKHNjb3BlKSwgY29udGV4dCwgc3ViUHJveHksIGRlc2NyaXB0b3JEZWZhdWx0cylcbiAgICB9O1xuICAgIHJldHVybiBuZXcgUHJveHkoY2FjaGUsIHtcbiAgICAgICAgLyoqXG4gICAgICogQSB0cmFwIGZvciB0aGUgZGVsZXRlIG9wZXJhdG9yLlxuICAgICAqLyBkZWxldGVQcm9wZXJ0eSAodGFyZ2V0LCBwcm9wKSB7XG4gICAgICAgICAgICBkZWxldGUgdGFyZ2V0W3Byb3BdOyAvLyByZW1vdmUgZnJvbSBjYWNoZVxuICAgICAgICAgICAgZGVsZXRlIHByb3h5W3Byb3BdOyAvLyByZW1vdmUgZnJvbSBwcm94eVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAqIEEgdHJhcCBmb3IgZ2V0dGluZyBwcm9wZXJ0eSB2YWx1ZXMuXG4gICAgICovIGdldCAodGFyZ2V0LCBwcm9wLCByZWNlaXZlcikge1xuICAgICAgICAgICAgcmV0dXJuIF9jYWNoZWQodGFyZ2V0LCBwcm9wLCAoKT0+X3Jlc29sdmVXaXRoQ29udGV4dCh0YXJnZXQsIHByb3AsIHJlY2VpdmVyKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAqIEEgdHJhcCBmb3IgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvci5cbiAgICAgKiBBbHNvIHVzZWQgYnkgT2JqZWN0Lmhhc093blByb3BlcnR5LlxuICAgICAqLyBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgKHRhcmdldCwgcHJvcCkge1xuICAgICAgICAgICAgcmV0dXJuIHRhcmdldC5fZGVzY3JpcHRvcnMuYWxsS2V5cyA/IFJlZmxlY3QuaGFzKHByb3h5LCBwcm9wKSA/IHtcbiAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICAgICAgfSA6IHVuZGVmaW5lZCA6IFJlZmxlY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHByb3h5LCBwcm9wKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICogQSB0cmFwIGZvciBPYmplY3QuZ2V0UHJvdG90eXBlT2YuXG4gICAgICovIGdldFByb3RvdHlwZU9mICgpIHtcbiAgICAgICAgICAgIHJldHVybiBSZWZsZWN0LmdldFByb3RvdHlwZU9mKHByb3h5KTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICogQSB0cmFwIGZvciB0aGUgaW4gb3BlcmF0b3IuXG4gICAgICovIGhhcyAodGFyZ2V0LCBwcm9wKSB7XG4gICAgICAgICAgICByZXR1cm4gUmVmbGVjdC5oYXMocHJveHksIHByb3ApO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgKiBBIHRyYXAgZm9yIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIGFuZCBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzLlxuICAgICAqLyBvd25LZXlzICgpIHtcbiAgICAgICAgICAgIHJldHVybiBSZWZsZWN0Lm93bktleXMocHJveHkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgKiBBIHRyYXAgZm9yIHNldHRpbmcgcHJvcGVydHkgdmFsdWVzLlxuICAgICAqLyBzZXQgKHRhcmdldCwgcHJvcCwgdmFsdWUpIHtcbiAgICAgICAgICAgIHByb3h5W3Byb3BdID0gdmFsdWU7IC8vIHNldCB0byBwcm94eVxuICAgICAgICAgICAgZGVsZXRlIHRhcmdldFtwcm9wXTsgLy8gcmVtb3ZlIGZyb20gY2FjaGVcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfSk7XG59XG4vKipcbiAqIEBwcml2YXRlXG4gKi8gZnVuY3Rpb24gX2Rlc2NyaXB0b3JzKHByb3h5LCBkZWZhdWx0cyA9IHtcbiAgICBzY3JpcHRhYmxlOiB0cnVlLFxuICAgIGluZGV4YWJsZTogdHJ1ZVxufSkge1xuICAgIGNvbnN0IHsgX3NjcmlwdGFibGUgPWRlZmF1bHRzLnNjcmlwdGFibGUgLCBfaW5kZXhhYmxlID1kZWZhdWx0cy5pbmRleGFibGUgLCBfYWxsS2V5cyA9ZGVmYXVsdHMuYWxsS2V5cyAgfSA9IHByb3h5O1xuICAgIHJldHVybiB7XG4gICAgICAgIGFsbEtleXM6IF9hbGxLZXlzLFxuICAgICAgICBzY3JpcHRhYmxlOiBfc2NyaXB0YWJsZSxcbiAgICAgICAgaW5kZXhhYmxlOiBfaW5kZXhhYmxlLFxuICAgICAgICBpc1NjcmlwdGFibGU6IGlzRnVuY3Rpb24oX3NjcmlwdGFibGUpID8gX3NjcmlwdGFibGUgOiAoKT0+X3NjcmlwdGFibGUsXG4gICAgICAgIGlzSW5kZXhhYmxlOiBpc0Z1bmN0aW9uKF9pbmRleGFibGUpID8gX2luZGV4YWJsZSA6ICgpPT5faW5kZXhhYmxlXG4gICAgfTtcbn1cbmNvbnN0IHJlYWRLZXkgPSAocHJlZml4LCBuYW1lKT0+cHJlZml4ID8gcHJlZml4ICsgX2NhcGl0YWxpemUobmFtZSkgOiBuYW1lO1xuY29uc3QgbmVlZHNTdWJSZXNvbHZlciA9IChwcm9wLCB2YWx1ZSk9PmlzT2JqZWN0KHZhbHVlKSAmJiBwcm9wICE9PSAnYWRhcHRlcnMnICYmIChPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpID09PSBudWxsIHx8IHZhbHVlLmNvbnN0cnVjdG9yID09PSBPYmplY3QpO1xuZnVuY3Rpb24gX2NhY2hlZCh0YXJnZXQsIHByb3AsIHJlc29sdmUpIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRhcmdldCwgcHJvcCkpIHtcbiAgICAgICAgcmV0dXJuIHRhcmdldFtwcm9wXTtcbiAgICB9XG4gICAgY29uc3QgdmFsdWUgPSByZXNvbHZlKCk7XG4gICAgLy8gY2FjaGUgdGhlIHJlc29sdmVkIHZhbHVlXG4gICAgdGFyZ2V0W3Byb3BdID0gdmFsdWU7XG4gICAgcmV0dXJuIHZhbHVlO1xufVxuZnVuY3Rpb24gX3Jlc29sdmVXaXRoQ29udGV4dCh0YXJnZXQsIHByb3AsIHJlY2VpdmVyKSB7XG4gICAgY29uc3QgeyBfcHJveHkgLCBfY29udGV4dCAsIF9zdWJQcm94eSAsIF9kZXNjcmlwdG9yczogZGVzY3JpcHRvcnMgIH0gPSB0YXJnZXQ7XG4gICAgbGV0IHZhbHVlID0gX3Byb3h5W3Byb3BdOyAvLyByZXNvbHZlIGZyb20gcHJveHlcbiAgICAvLyByZXNvbHZlIHdpdGggY29udGV4dFxuICAgIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSAmJiBkZXNjcmlwdG9ycy5pc1NjcmlwdGFibGUocHJvcCkpIHtcbiAgICAgICAgdmFsdWUgPSBfcmVzb2x2ZVNjcmlwdGFibGUocHJvcCwgdmFsdWUsIHRhcmdldCwgcmVjZWl2ZXIpO1xuICAgIH1cbiAgICBpZiAoaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoKSB7XG4gICAgICAgIHZhbHVlID0gX3Jlc29sdmVBcnJheShwcm9wLCB2YWx1ZSwgdGFyZ2V0LCBkZXNjcmlwdG9ycy5pc0luZGV4YWJsZSk7XG4gICAgfVxuICAgIGlmIChuZWVkc1N1YlJlc29sdmVyKHByb3AsIHZhbHVlKSkge1xuICAgICAgICAvLyBpZiB0aGUgcmVzb2x2ZWQgdmFsdWUgaXMgYW4gb2JqZWN0LCBjcmVhdGUgYSBzdWIgcmVzb2x2ZXIgZm9yIGl0XG4gICAgICAgIHZhbHVlID0gX2F0dGFjaENvbnRleHQodmFsdWUsIF9jb250ZXh0LCBfc3ViUHJveHkgJiYgX3N1YlByb3h5W3Byb3BdLCBkZXNjcmlwdG9ycyk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbn1cbmZ1bmN0aW9uIF9yZXNvbHZlU2NyaXB0YWJsZShwcm9wLCBnZXRWYWx1ZSwgdGFyZ2V0LCByZWNlaXZlcikge1xuICAgIGNvbnN0IHsgX3Byb3h5ICwgX2NvbnRleHQgLCBfc3ViUHJveHkgLCBfc3RhY2sgIH0gPSB0YXJnZXQ7XG4gICAgaWYgKF9zdGFjay5oYXMocHJvcCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWN1cnNpb24gZGV0ZWN0ZWQ6ICcgKyBBcnJheS5mcm9tKF9zdGFjaykuam9pbignLT4nKSArICctPicgKyBwcm9wKTtcbiAgICB9XG4gICAgX3N0YWNrLmFkZChwcm9wKTtcbiAgICBsZXQgdmFsdWUgPSBnZXRWYWx1ZShfY29udGV4dCwgX3N1YlByb3h5IHx8IHJlY2VpdmVyKTtcbiAgICBfc3RhY2suZGVsZXRlKHByb3ApO1xuICAgIGlmIChuZWVkc1N1YlJlc29sdmVyKHByb3AsIHZhbHVlKSkge1xuICAgICAgICAvLyBXaGVuIHNjcmlwdGFibGUgb3B0aW9uIHJldHVybnMgYW4gb2JqZWN0LCBjcmVhdGUgYSByZXNvbHZlciBvbiB0aGF0LlxuICAgICAgICB2YWx1ZSA9IGNyZWF0ZVN1YlJlc29sdmVyKF9wcm94eS5fc2NvcGVzLCBfcHJveHksIHByb3AsIHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xufVxuZnVuY3Rpb24gX3Jlc29sdmVBcnJheShwcm9wLCB2YWx1ZSwgdGFyZ2V0LCBpc0luZGV4YWJsZSkge1xuICAgIGNvbnN0IHsgX3Byb3h5ICwgX2NvbnRleHQgLCBfc3ViUHJveHkgLCBfZGVzY3JpcHRvcnM6IGRlc2NyaXB0b3JzICB9ID0gdGFyZ2V0O1xuICAgIGlmICh0eXBlb2YgX2NvbnRleHQuaW5kZXggIT09ICd1bmRlZmluZWQnICYmIGlzSW5kZXhhYmxlKHByb3ApKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZVtfY29udGV4dC5pbmRleCAlIHZhbHVlLmxlbmd0aF07XG4gICAgfSBlbHNlIGlmIChpc09iamVjdCh2YWx1ZVswXSkpIHtcbiAgICAgICAgLy8gQXJyYXkgb2Ygb2JqZWN0cywgcmV0dXJuIGFycmF5IG9yIHJlc29sdmVyc1xuICAgICAgICBjb25zdCBhcnIgPSB2YWx1ZTtcbiAgICAgICAgY29uc3Qgc2NvcGVzID0gX3Byb3h5Ll9zY29wZXMuZmlsdGVyKChzKT0+cyAhPT0gYXJyKTtcbiAgICAgICAgdmFsdWUgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGFycil7XG4gICAgICAgICAgICBjb25zdCByZXNvbHZlciA9IGNyZWF0ZVN1YlJlc29sdmVyKHNjb3BlcywgX3Byb3h5LCBwcm9wLCBpdGVtKTtcbiAgICAgICAgICAgIHZhbHVlLnB1c2goX2F0dGFjaENvbnRleHQocmVzb2x2ZXIsIF9jb250ZXh0LCBfc3ViUHJveHkgJiYgX3N1YlByb3h5W3Byb3BdLCBkZXNjcmlwdG9ycykpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbn1cbmZ1bmN0aW9uIHJlc29sdmVGYWxsYmFjayhmYWxsYmFjaywgcHJvcCwgdmFsdWUpIHtcbiAgICByZXR1cm4gaXNGdW5jdGlvbihmYWxsYmFjaykgPyBmYWxsYmFjayhwcm9wLCB2YWx1ZSkgOiBmYWxsYmFjaztcbn1cbmNvbnN0IGdldFNjb3BlID0gKGtleSwgcGFyZW50KT0+a2V5ID09PSB0cnVlID8gcGFyZW50IDogdHlwZW9mIGtleSA9PT0gJ3N0cmluZycgPyByZXNvbHZlT2JqZWN0S2V5KHBhcmVudCwga2V5KSA6IHVuZGVmaW5lZDtcbmZ1bmN0aW9uIGFkZFNjb3BlcyhzZXQsIHBhcmVudFNjb3Blcywga2V5LCBwYXJlbnRGYWxsYmFjaywgdmFsdWUpIHtcbiAgICBmb3IgKGNvbnN0IHBhcmVudCBvZiBwYXJlbnRTY29wZXMpe1xuICAgICAgICBjb25zdCBzY29wZSA9IGdldFNjb3BlKGtleSwgcGFyZW50KTtcbiAgICAgICAgaWYgKHNjb3BlKSB7XG4gICAgICAgICAgICBzZXQuYWRkKHNjb3BlKTtcbiAgICAgICAgICAgIGNvbnN0IGZhbGxiYWNrID0gcmVzb2x2ZUZhbGxiYWNrKHNjb3BlLl9mYWxsYmFjaywga2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGZhbGxiYWNrICE9PSAndW5kZWZpbmVkJyAmJiBmYWxsYmFjayAhPT0ga2V5ICYmIGZhbGxiYWNrICE9PSBwYXJlbnRGYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIC8vIFdoZW4gd2UgcmVhY2ggdGhlIGRlc2NyaXB0b3IgdGhhdCBkZWZpbmVzIGEgbmV3IF9mYWxsYmFjaywgcmV0dXJuIHRoYXQuXG4gICAgICAgICAgICAgICAgLy8gVGhlIGZhbGxiYWNrIHdpbGwgcmVzdW1lIHRvIHRoYXQgbmV3IHNjb3BlLlxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxsYmFjaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChzY29wZSA9PT0gZmFsc2UgJiYgdHlwZW9mIHBhcmVudEZhbGxiYWNrICE9PSAndW5kZWZpbmVkJyAmJiBrZXkgIT09IHBhcmVudEZhbGxiYWNrKSB7XG4gICAgICAgICAgICAvLyBGYWxsYmFjayB0byBgZmFsc2VgIHJlc3VsdHMgdG8gYGZhbHNlYCwgd2hlbiBmYWxsaW5nIGJhY2sgdG8gZGlmZmVyZW50IGtleS5cbiAgICAgICAgICAgIC8vIEZvciBleGFtcGxlIGBpbnRlcmFjdGlvbmAgZnJvbSBgaG92ZXJgIG9yIGBwbHVnaW5zLnRvb2x0aXBgIGFuZCBgYW5pbWF0aW9uYCBmcm9tIGBhbmltYXRpb25zYFxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gY3JlYXRlU3ViUmVzb2x2ZXIocGFyZW50U2NvcGVzLCByZXNvbHZlciwgcHJvcCwgdmFsdWUpIHtcbiAgICBjb25zdCByb290U2NvcGVzID0gcmVzb2x2ZXIuX3Jvb3RTY29wZXM7XG4gICAgY29uc3QgZmFsbGJhY2sgPSByZXNvbHZlRmFsbGJhY2socmVzb2x2ZXIuX2ZhbGxiYWNrLCBwcm9wLCB2YWx1ZSk7XG4gICAgY29uc3QgYWxsU2NvcGVzID0gW1xuICAgICAgICAuLi5wYXJlbnRTY29wZXMsXG4gICAgICAgIC4uLnJvb3RTY29wZXNcbiAgICBdO1xuICAgIGNvbnN0IHNldCA9IG5ldyBTZXQoKTtcbiAgICBzZXQuYWRkKHZhbHVlKTtcbiAgICBsZXQga2V5ID0gYWRkU2NvcGVzRnJvbUtleShzZXQsIGFsbFNjb3BlcywgcHJvcCwgZmFsbGJhY2sgfHwgcHJvcCwgdmFsdWUpO1xuICAgIGlmIChrZXkgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGZhbGxiYWNrICE9PSAndW5kZWZpbmVkJyAmJiBmYWxsYmFjayAhPT0gcHJvcCkge1xuICAgICAgICBrZXkgPSBhZGRTY29wZXNGcm9tS2V5KHNldCwgYWxsU2NvcGVzLCBmYWxsYmFjaywga2V5LCB2YWx1ZSk7XG4gICAgICAgIGlmIChrZXkgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gX2NyZWF0ZVJlc29sdmVyKEFycmF5LmZyb20oc2V0KSwgW1xuICAgICAgICAnJ1xuICAgIF0sIHJvb3RTY29wZXMsIGZhbGxiYWNrLCAoKT0+c3ViR2V0VGFyZ2V0KHJlc29sdmVyLCBwcm9wLCB2YWx1ZSkpO1xufVxuZnVuY3Rpb24gYWRkU2NvcGVzRnJvbUtleShzZXQsIGFsbFNjb3Blcywga2V5LCBmYWxsYmFjaywgaXRlbSkge1xuICAgIHdoaWxlKGtleSl7XG4gICAgICAgIGtleSA9IGFkZFNjb3BlcyhzZXQsIGFsbFNjb3Blcywga2V5LCBmYWxsYmFjaywgaXRlbSk7XG4gICAgfVxuICAgIHJldHVybiBrZXk7XG59XG5mdW5jdGlvbiBzdWJHZXRUYXJnZXQocmVzb2x2ZXIsIHByb3AsIHZhbHVlKSB7XG4gICAgY29uc3QgcGFyZW50ID0gcmVzb2x2ZXIuX2dldFRhcmdldCgpO1xuICAgIGlmICghKHByb3AgaW4gcGFyZW50KSkge1xuICAgICAgICBwYXJlbnRbcHJvcF0gPSB7fTtcbiAgICB9XG4gICAgY29uc3QgdGFyZ2V0ID0gcGFyZW50W3Byb3BdO1xuICAgIGlmIChpc0FycmF5KHRhcmdldCkgJiYgaXNPYmplY3QodmFsdWUpKSB7XG4gICAgICAgIC8vIEZvciBhcnJheSBvZiBvYmplY3RzLCB0aGUgb2JqZWN0IGlzIHVzZWQgdG8gc3RvcmUgdXBkYXRlZCB2YWx1ZXNcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0IHx8IHt9O1xufVxuZnVuY3Rpb24gX3Jlc29sdmVXaXRoUHJlZml4ZXMocHJvcCwgcHJlZml4ZXMsIHNjb3BlcywgcHJveHkpIHtcbiAgICBsZXQgdmFsdWU7XG4gICAgZm9yIChjb25zdCBwcmVmaXggb2YgcHJlZml4ZXMpe1xuICAgICAgICB2YWx1ZSA9IF9yZXNvbHZlKHJlYWRLZXkocHJlZml4LCBwcm9wKSwgc2NvcGVzKTtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybiBuZWVkc1N1YlJlc29sdmVyKHByb3AsIHZhbHVlKSA/IGNyZWF0ZVN1YlJlc29sdmVyKHNjb3BlcywgcHJveHksIHByb3AsIHZhbHVlKSA6IHZhbHVlO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gX3Jlc29sdmUoa2V5LCBzY29wZXMpIHtcbiAgICBmb3IgKGNvbnN0IHNjb3BlIG9mIHNjb3Blcyl7XG4gICAgICAgIGlmICghc2NvcGUpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbHVlID0gc2NvcGVba2V5XTtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGdldEtleXNGcm9tQWxsU2NvcGVzKHRhcmdldCkge1xuICAgIGxldCBrZXlzID0gdGFyZ2V0Ll9rZXlzO1xuICAgIGlmICgha2V5cykge1xuICAgICAgICBrZXlzID0gdGFyZ2V0Ll9rZXlzID0gcmVzb2x2ZUtleXNGcm9tQWxsU2NvcGVzKHRhcmdldC5fc2NvcGVzKTtcbiAgICB9XG4gICAgcmV0dXJuIGtleXM7XG59XG5mdW5jdGlvbiByZXNvbHZlS2V5c0Zyb21BbGxTY29wZXMoc2NvcGVzKSB7XG4gICAgY29uc3Qgc2V0ID0gbmV3IFNldCgpO1xuICAgIGZvciAoY29uc3Qgc2NvcGUgb2Ygc2NvcGVzKXtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoc2NvcGUpLmZpbHRlcigoayk9PiFrLnN0YXJ0c1dpdGgoJ18nKSkpe1xuICAgICAgICAgICAgc2V0LmFkZChrZXkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBBcnJheS5mcm9tKHNldCk7XG59XG5mdW5jdGlvbiBfcGFyc2VPYmplY3REYXRhUmFkaWFsU2NhbGUobWV0YSwgZGF0YSwgc3RhcnQsIGNvdW50KSB7XG4gICAgY29uc3QgeyBpU2NhbGUgIH0gPSBtZXRhO1xuICAgIGNvbnN0IHsga2V5ID0ncicgIH0gPSB0aGlzLl9wYXJzaW5nO1xuICAgIGNvbnN0IHBhcnNlZCA9IG5ldyBBcnJheShjb3VudCk7XG4gICAgbGV0IGksIGlsZW4sIGluZGV4LCBpdGVtO1xuICAgIGZvcihpID0gMCwgaWxlbiA9IGNvdW50OyBpIDwgaWxlbjsgKytpKXtcbiAgICAgICAgaW5kZXggPSBpICsgc3RhcnQ7XG4gICAgICAgIGl0ZW0gPSBkYXRhW2luZGV4XTtcbiAgICAgICAgcGFyc2VkW2ldID0ge1xuICAgICAgICAgICAgcjogaVNjYWxlLnBhcnNlKHJlc29sdmVPYmplY3RLZXkoaXRlbSwga2V5KSwgaW5kZXgpXG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBwYXJzZWQ7XG59XG5cbmNvbnN0IEVQU0lMT04gPSBOdW1iZXIuRVBTSUxPTiB8fCAxZS0xNDtcbmNvbnN0IGdldFBvaW50ID0gKHBvaW50cywgaSk9PmkgPCBwb2ludHMubGVuZ3RoICYmICFwb2ludHNbaV0uc2tpcCAmJiBwb2ludHNbaV07XG5jb25zdCBnZXRWYWx1ZUF4aXMgPSAoaW5kZXhBeGlzKT0+aW5kZXhBeGlzID09PSAneCcgPyAneScgOiAneCc7XG5mdW5jdGlvbiBzcGxpbmVDdXJ2ZShmaXJzdFBvaW50LCBtaWRkbGVQb2ludCwgYWZ0ZXJQb2ludCwgdCkge1xuICAgIC8vIFByb3BzIHRvIFJvYiBTcGVuY2VyIGF0IHNjYWxlZCBpbm5vdmF0aW9uIGZvciBoaXMgcG9zdCBvbiBzcGxpbmluZyBiZXR3ZWVuIHBvaW50c1xuICAgIC8vIGh0dHA6Ly9zY2FsZWRpbm5vdmF0aW9uLmNvbS9hbmFseXRpY3Mvc3BsaW5lcy9hYm91dFNwbGluZXMuaHRtbFxuICAgIC8vIFRoaXMgZnVuY3Rpb24gbXVzdCBhbHNvIHJlc3BlY3QgXCJza2lwcGVkXCIgcG9pbnRzXG4gICAgY29uc3QgcHJldmlvdXMgPSBmaXJzdFBvaW50LnNraXAgPyBtaWRkbGVQb2ludCA6IGZpcnN0UG9pbnQ7XG4gICAgY29uc3QgY3VycmVudCA9IG1pZGRsZVBvaW50O1xuICAgIGNvbnN0IG5leHQgPSBhZnRlclBvaW50LnNraXAgPyBtaWRkbGVQb2ludCA6IGFmdGVyUG9pbnQ7XG4gICAgY29uc3QgZDAxID0gZGlzdGFuY2VCZXR3ZWVuUG9pbnRzKGN1cnJlbnQsIHByZXZpb3VzKTtcbiAgICBjb25zdCBkMTIgPSBkaXN0YW5jZUJldHdlZW5Qb2ludHMobmV4dCwgY3VycmVudCk7XG4gICAgbGV0IHMwMSA9IGQwMSAvIChkMDEgKyBkMTIpO1xuICAgIGxldCBzMTIgPSBkMTIgLyAoZDAxICsgZDEyKTtcbiAgICAvLyBJZiBhbGwgcG9pbnRzIGFyZSB0aGUgc2FtZSwgczAxICYgczAyIHdpbGwgYmUgaW5mXG4gICAgczAxID0gaXNOYU4oczAxKSA/IDAgOiBzMDE7XG4gICAgczEyID0gaXNOYU4oczEyKSA/IDAgOiBzMTI7XG4gICAgY29uc3QgZmEgPSB0ICogczAxOyAvLyBzY2FsaW5nIGZhY3RvciBmb3IgdHJpYW5nbGUgVGFcbiAgICBjb25zdCBmYiA9IHQgKiBzMTI7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcHJldmlvdXM6IHtcbiAgICAgICAgICAgIHg6IGN1cnJlbnQueCAtIGZhICogKG5leHQueCAtIHByZXZpb3VzLngpLFxuICAgICAgICAgICAgeTogY3VycmVudC55IC0gZmEgKiAobmV4dC55IC0gcHJldmlvdXMueSlcbiAgICAgICAgfSxcbiAgICAgICAgbmV4dDoge1xuICAgICAgICAgICAgeDogY3VycmVudC54ICsgZmIgKiAobmV4dC54IC0gcHJldmlvdXMueCksXG4gICAgICAgICAgICB5OiBjdXJyZW50LnkgKyBmYiAqIChuZXh0LnkgLSBwcmV2aW91cy55KVxuICAgICAgICB9XG4gICAgfTtcbn1cbi8qKlxuICogQWRqdXN0IHRhbmdlbnRzIHRvIGVuc3VyZSBtb25vdG9uaWMgcHJvcGVydGllc1xuICovIGZ1bmN0aW9uIG1vbm90b25lQWRqdXN0KHBvaW50cywgZGVsdGFLLCBtSykge1xuICAgIGNvbnN0IHBvaW50c0xlbiA9IHBvaW50cy5sZW5ndGg7XG4gICAgbGV0IGFscGhhSywgYmV0YUssIHRhdUssIHNxdWFyZWRNYWduaXR1ZGUsIHBvaW50Q3VycmVudDtcbiAgICBsZXQgcG9pbnRBZnRlciA9IGdldFBvaW50KHBvaW50cywgMCk7XG4gICAgZm9yKGxldCBpID0gMDsgaSA8IHBvaW50c0xlbiAtIDE7ICsraSl7XG4gICAgICAgIHBvaW50Q3VycmVudCA9IHBvaW50QWZ0ZXI7XG4gICAgICAgIHBvaW50QWZ0ZXIgPSBnZXRQb2ludChwb2ludHMsIGkgKyAxKTtcbiAgICAgICAgaWYgKCFwb2ludEN1cnJlbnQgfHwgIXBvaW50QWZ0ZXIpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhbG1vc3RFcXVhbHMoZGVsdGFLW2ldLCAwLCBFUFNJTE9OKSkge1xuICAgICAgICAgICAgbUtbaV0gPSBtS1tpICsgMV0gPSAwO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgYWxwaGFLID0gbUtbaV0gLyBkZWx0YUtbaV07XG4gICAgICAgIGJldGFLID0gbUtbaSArIDFdIC8gZGVsdGFLW2ldO1xuICAgICAgICBzcXVhcmVkTWFnbml0dWRlID0gTWF0aC5wb3coYWxwaGFLLCAyKSArIE1hdGgucG93KGJldGFLLCAyKTtcbiAgICAgICAgaWYgKHNxdWFyZWRNYWduaXR1ZGUgPD0gOSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdGF1SyA9IDMgLyBNYXRoLnNxcnQoc3F1YXJlZE1hZ25pdHVkZSk7XG4gICAgICAgIG1LW2ldID0gYWxwaGFLICogdGF1SyAqIGRlbHRhS1tpXTtcbiAgICAgICAgbUtbaSArIDFdID0gYmV0YUsgKiB0YXVLICogZGVsdGFLW2ldO1xuICAgIH1cbn1cbmZ1bmN0aW9uIG1vbm90b25lQ29tcHV0ZShwb2ludHMsIG1LLCBpbmRleEF4aXMgPSAneCcpIHtcbiAgICBjb25zdCB2YWx1ZUF4aXMgPSBnZXRWYWx1ZUF4aXMoaW5kZXhBeGlzKTtcbiAgICBjb25zdCBwb2ludHNMZW4gPSBwb2ludHMubGVuZ3RoO1xuICAgIGxldCBkZWx0YSwgcG9pbnRCZWZvcmUsIHBvaW50Q3VycmVudDtcbiAgICBsZXQgcG9pbnRBZnRlciA9IGdldFBvaW50KHBvaW50cywgMCk7XG4gICAgZm9yKGxldCBpID0gMDsgaSA8IHBvaW50c0xlbjsgKytpKXtcbiAgICAgICAgcG9pbnRCZWZvcmUgPSBwb2ludEN1cnJlbnQ7XG4gICAgICAgIHBvaW50Q3VycmVudCA9IHBvaW50QWZ0ZXI7XG4gICAgICAgIHBvaW50QWZ0ZXIgPSBnZXRQb2ludChwb2ludHMsIGkgKyAxKTtcbiAgICAgICAgaWYgKCFwb2ludEN1cnJlbnQpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlQaXhlbCA9IHBvaW50Q3VycmVudFtpbmRleEF4aXNdO1xuICAgICAgICBjb25zdCB2UGl4ZWwgPSBwb2ludEN1cnJlbnRbdmFsdWVBeGlzXTtcbiAgICAgICAgaWYgKHBvaW50QmVmb3JlKSB7XG4gICAgICAgICAgICBkZWx0YSA9IChpUGl4ZWwgLSBwb2ludEJlZm9yZVtpbmRleEF4aXNdKSAvIDM7XG4gICAgICAgICAgICBwb2ludEN1cnJlbnRbYGNwMSR7aW5kZXhBeGlzfWBdID0gaVBpeGVsIC0gZGVsdGE7XG4gICAgICAgICAgICBwb2ludEN1cnJlbnRbYGNwMSR7dmFsdWVBeGlzfWBdID0gdlBpeGVsIC0gZGVsdGEgKiBtS1tpXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocG9pbnRBZnRlcikge1xuICAgICAgICAgICAgZGVsdGEgPSAocG9pbnRBZnRlcltpbmRleEF4aXNdIC0gaVBpeGVsKSAvIDM7XG4gICAgICAgICAgICBwb2ludEN1cnJlbnRbYGNwMiR7aW5kZXhBeGlzfWBdID0gaVBpeGVsICsgZGVsdGE7XG4gICAgICAgICAgICBwb2ludEN1cnJlbnRbYGNwMiR7dmFsdWVBeGlzfWBdID0gdlBpeGVsICsgZGVsdGEgKiBtS1tpXTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIELDqXppZXIgY29udHJvbCBwb2ludHMgaW4gYSBzaW1pbGFyIHdheSB0aGFuIHxzcGxpbmVDdXJ2ZXwsXG4gKiBidXQgcHJlc2VydmVzIG1vbm90b25pY2l0eSBvZiB0aGUgcHJvdmlkZWQgZGF0YSBhbmQgZW5zdXJlcyBubyBsb2NhbCBleHRyZW11bXMgYXJlIGFkZGVkXG4gKiBiZXR3ZWVuIHRoZSBkYXRhc2V0IGRpc2NyZXRlIHBvaW50cyBkdWUgdG8gdGhlIGludGVycG9sYXRpb24uXG4gKiBTZWUgOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Nb25vdG9uZV9jdWJpY19pbnRlcnBvbGF0aW9uXG4gKi8gZnVuY3Rpb24gc3BsaW5lQ3VydmVNb25vdG9uZShwb2ludHMsIGluZGV4QXhpcyA9ICd4Jykge1xuICAgIGNvbnN0IHZhbHVlQXhpcyA9IGdldFZhbHVlQXhpcyhpbmRleEF4aXMpO1xuICAgIGNvbnN0IHBvaW50c0xlbiA9IHBvaW50cy5sZW5ndGg7XG4gICAgY29uc3QgZGVsdGFLID0gQXJyYXkocG9pbnRzTGVuKS5maWxsKDApO1xuICAgIGNvbnN0IG1LID0gQXJyYXkocG9pbnRzTGVuKTtcbiAgICAvLyBDYWxjdWxhdGUgc2xvcGVzIChkZWx0YUspIGFuZCBpbml0aWFsaXplIHRhbmdlbnRzIChtSylcbiAgICBsZXQgaSwgcG9pbnRCZWZvcmUsIHBvaW50Q3VycmVudDtcbiAgICBsZXQgcG9pbnRBZnRlciA9IGdldFBvaW50KHBvaW50cywgMCk7XG4gICAgZm9yKGkgPSAwOyBpIDwgcG9pbnRzTGVuOyArK2kpe1xuICAgICAgICBwb2ludEJlZm9yZSA9IHBvaW50Q3VycmVudDtcbiAgICAgICAgcG9pbnRDdXJyZW50ID0gcG9pbnRBZnRlcjtcbiAgICAgICAgcG9pbnRBZnRlciA9IGdldFBvaW50KHBvaW50cywgaSArIDEpO1xuICAgICAgICBpZiAoIXBvaW50Q3VycmVudCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBvaW50QWZ0ZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHNsb3BlRGVsdGEgPSBwb2ludEFmdGVyW2luZGV4QXhpc10gLSBwb2ludEN1cnJlbnRbaW5kZXhBeGlzXTtcbiAgICAgICAgICAgIC8vIEluIHRoZSBjYXNlIG9mIHR3byBwb2ludHMgdGhhdCBhcHBlYXIgYXQgdGhlIHNhbWUgeCBwaXhlbCwgc2xvcGVEZWx0YVggaXMgMFxuICAgICAgICAgICAgZGVsdGFLW2ldID0gc2xvcGVEZWx0YSAhPT0gMCA/IChwb2ludEFmdGVyW3ZhbHVlQXhpc10gLSBwb2ludEN1cnJlbnRbdmFsdWVBeGlzXSkgLyBzbG9wZURlbHRhIDogMDtcbiAgICAgICAgfVxuICAgICAgICBtS1tpXSA9ICFwb2ludEJlZm9yZSA/IGRlbHRhS1tpXSA6ICFwb2ludEFmdGVyID8gZGVsdGFLW2kgLSAxXSA6IHNpZ24oZGVsdGFLW2kgLSAxXSkgIT09IHNpZ24oZGVsdGFLW2ldKSA/IDAgOiAoZGVsdGFLW2kgLSAxXSArIGRlbHRhS1tpXSkgLyAyO1xuICAgIH1cbiAgICBtb25vdG9uZUFkanVzdChwb2ludHMsIGRlbHRhSywgbUspO1xuICAgIG1vbm90b25lQ29tcHV0ZShwb2ludHMsIG1LLCBpbmRleEF4aXMpO1xufVxuZnVuY3Rpb24gY2FwQ29udHJvbFBvaW50KHB0LCBtaW4sIG1heCkge1xuICAgIHJldHVybiBNYXRoLm1heChNYXRoLm1pbihwdCwgbWF4KSwgbWluKTtcbn1cbmZ1bmN0aW9uIGNhcEJlemllclBvaW50cyhwb2ludHMsIGFyZWEpIHtcbiAgICBsZXQgaSwgaWxlbiwgcG9pbnQsIGluQXJlYSwgaW5BcmVhUHJldjtcbiAgICBsZXQgaW5BcmVhTmV4dCA9IF9pc1BvaW50SW5BcmVhKHBvaW50c1swXSwgYXJlYSk7XG4gICAgZm9yKGkgPSAwLCBpbGVuID0gcG9pbnRzLmxlbmd0aDsgaSA8IGlsZW47ICsraSl7XG4gICAgICAgIGluQXJlYVByZXYgPSBpbkFyZWE7XG4gICAgICAgIGluQXJlYSA9IGluQXJlYU5leHQ7XG4gICAgICAgIGluQXJlYU5leHQgPSBpIDwgaWxlbiAtIDEgJiYgX2lzUG9pbnRJbkFyZWEocG9pbnRzW2kgKyAxXSwgYXJlYSk7XG4gICAgICAgIGlmICghaW5BcmVhKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBwb2ludCA9IHBvaW50c1tpXTtcbiAgICAgICAgaWYgKGluQXJlYVByZXYpIHtcbiAgICAgICAgICAgIHBvaW50LmNwMXggPSBjYXBDb250cm9sUG9pbnQocG9pbnQuY3AxeCwgYXJlYS5sZWZ0LCBhcmVhLnJpZ2h0KTtcbiAgICAgICAgICAgIHBvaW50LmNwMXkgPSBjYXBDb250cm9sUG9pbnQocG9pbnQuY3AxeSwgYXJlYS50b3AsIGFyZWEuYm90dG9tKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5BcmVhTmV4dCkge1xuICAgICAgICAgICAgcG9pbnQuY3AyeCA9IGNhcENvbnRyb2xQb2ludChwb2ludC5jcDJ4LCBhcmVhLmxlZnQsIGFyZWEucmlnaHQpO1xuICAgICAgICAgICAgcG9pbnQuY3AyeSA9IGNhcENvbnRyb2xQb2ludChwb2ludC5jcDJ5LCBhcmVhLnRvcCwgYXJlYS5ib3R0b20pO1xuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG4gKiBAcHJpdmF0ZVxuICovIGZ1bmN0aW9uIF91cGRhdGVCZXppZXJDb250cm9sUG9pbnRzKHBvaW50cywgb3B0aW9ucywgYXJlYSwgbG9vcCwgaW5kZXhBeGlzKSB7XG4gICAgbGV0IGksIGlsZW4sIHBvaW50LCBjb250cm9sUG9pbnRzO1xuICAgIC8vIE9ubHkgY29uc2lkZXIgcG9pbnRzIHRoYXQgYXJlIGRyYXduIGluIGNhc2UgdGhlIHNwYW5HYXBzIG9wdGlvbiBpcyB1c2VkXG4gICAgaWYgKG9wdGlvbnMuc3BhbkdhcHMpIHtcbiAgICAgICAgcG9pbnRzID0gcG9pbnRzLmZpbHRlcigocHQpPT4hcHQuc2tpcCk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmN1YmljSW50ZXJwb2xhdGlvbk1vZGUgPT09ICdtb25vdG9uZScpIHtcbiAgICAgICAgc3BsaW5lQ3VydmVNb25vdG9uZShwb2ludHMsIGluZGV4QXhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IHByZXYgPSBsb29wID8gcG9pbnRzW3BvaW50cy5sZW5ndGggLSAxXSA6IHBvaW50c1swXTtcbiAgICAgICAgZm9yKGkgPSAwLCBpbGVuID0gcG9pbnRzLmxlbmd0aDsgaSA8IGlsZW47ICsraSl7XG4gICAgICAgICAgICBwb2ludCA9IHBvaW50c1tpXTtcbiAgICAgICAgICAgIGNvbnRyb2xQb2ludHMgPSBzcGxpbmVDdXJ2ZShwcmV2LCBwb2ludCwgcG9pbnRzW01hdGgubWluKGkgKyAxLCBpbGVuIC0gKGxvb3AgPyAwIDogMSkpICUgaWxlbl0sIG9wdGlvbnMudGVuc2lvbik7XG4gICAgICAgICAgICBwb2ludC5jcDF4ID0gY29udHJvbFBvaW50cy5wcmV2aW91cy54O1xuICAgICAgICAgICAgcG9pbnQuY3AxeSA9IGNvbnRyb2xQb2ludHMucHJldmlvdXMueTtcbiAgICAgICAgICAgIHBvaW50LmNwMnggPSBjb250cm9sUG9pbnRzLm5leHQueDtcbiAgICAgICAgICAgIHBvaW50LmNwMnkgPSBjb250cm9sUG9pbnRzLm5leHQueTtcbiAgICAgICAgICAgIHByZXYgPSBwb2ludDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAob3B0aW9ucy5jYXBCZXppZXJQb2ludHMpIHtcbiAgICAgICAgY2FwQmV6aWVyUG9pbnRzKHBvaW50cywgYXJlYSk7XG4gICAgfVxufVxuXG4vKipcbiAqIE5vdGU6IHR5cGVkZWZzIGFyZSBhdXRvLWV4cG9ydGVkLCBzbyB1c2UgYSBtYWRlLXVwIGBkb21gIG5hbWVzcGFjZSB3aGVyZVxuICogbmVjZXNzYXJ5IHRvIGF2b2lkIGR1cGxpY2F0ZXMgd2l0aCBgZXhwb3J0ICogZnJvbSAnLi9oZWxwZXJzYDsgc2VlXG4gKiBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzQ2MDExXG4gKiBAdHlwZWRlZiB7IGltcG9ydCgnLi4vY29yZS9jb3JlLmNvbnRyb2xsZXIuanMnKS5kZWZhdWx0IH0gZG9tLkNoYXJ0XG4gKiBAdHlwZWRlZiB7IGltcG9ydCgnLi4vLi4vdHlwZXMnKS5DaGFydEV2ZW50IH0gQ2hhcnRFdmVudFxuICovIC8qKlxuICogQHByaXZhdGVcbiAqLyBmdW5jdGlvbiBfaXNEb21TdXBwb3J0ZWQoKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCc7XG59XG4vKipcbiAqIEBwcml2YXRlXG4gKi8gZnVuY3Rpb24gX2dldFBhcmVudE5vZGUoZG9tTm9kZSkge1xuICAgIGxldCBwYXJlbnQgPSBkb21Ob2RlLnBhcmVudE5vZGU7XG4gICAgaWYgKHBhcmVudCAmJiBwYXJlbnQudG9TdHJpbmcoKSA9PT0gJ1tvYmplY3QgU2hhZG93Um9vdF0nKSB7XG4gICAgICAgIHBhcmVudCA9IHBhcmVudC5ob3N0O1xuICAgIH1cbiAgICByZXR1cm4gcGFyZW50O1xufVxuLyoqXG4gKiBjb252ZXJ0IG1heC13aWR0aC9tYXgtaGVpZ2h0IHZhbHVlcyB0aGF0IG1heSBiZSBwZXJjZW50YWdlcyBpbnRvIGEgbnVtYmVyXG4gKiBAcHJpdmF0ZVxuICovIGZ1bmN0aW9uIHBhcnNlTWF4U3R5bGUoc3R5bGVWYWx1ZSwgbm9kZSwgcGFyZW50UHJvcGVydHkpIHtcbiAgICBsZXQgdmFsdWVJblBpeGVscztcbiAgICBpZiAodHlwZW9mIHN0eWxlVmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHZhbHVlSW5QaXhlbHMgPSBwYXJzZUludChzdHlsZVZhbHVlLCAxMCk7XG4gICAgICAgIGlmIChzdHlsZVZhbHVlLmluZGV4T2YoJyUnKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIC8vIHBlcmNlbnRhZ2UgKiBzaXplIGluIGRpbWVuc2lvblxuICAgICAgICAgICAgdmFsdWVJblBpeGVscyA9IHZhbHVlSW5QaXhlbHMgLyAxMDAgKiBub2RlLnBhcmVudE5vZGVbcGFyZW50UHJvcGVydHldO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWVJblBpeGVscyA9IHN0eWxlVmFsdWU7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZUluUGl4ZWxzO1xufVxuY29uc3QgZ2V0Q29tcHV0ZWRTdHlsZSA9IChlbGVtZW50KT0+ZWxlbWVudC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCwgbnVsbCk7XG5mdW5jdGlvbiBnZXRTdHlsZShlbCwgcHJvcGVydHkpIHtcbiAgICByZXR1cm4gZ2V0Q29tcHV0ZWRTdHlsZShlbCkuZ2V0UHJvcGVydHlWYWx1ZShwcm9wZXJ0eSk7XG59XG5jb25zdCBwb3NpdGlvbnMgPSBbXG4gICAgJ3RvcCcsXG4gICAgJ3JpZ2h0JyxcbiAgICAnYm90dG9tJyxcbiAgICAnbGVmdCdcbl07XG5mdW5jdGlvbiBnZXRQb3NpdGlvbmVkU3R5bGUoc3R5bGVzLCBzdHlsZSwgc3VmZml4KSB7XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgc3VmZml4ID0gc3VmZml4ID8gJy0nICsgc3VmZml4IDogJyc7XG4gICAgZm9yKGxldCBpID0gMDsgaSA8IDQ7IGkrKyl7XG4gICAgICAgIGNvbnN0IHBvcyA9IHBvc2l0aW9uc1tpXTtcbiAgICAgICAgcmVzdWx0W3Bvc10gPSBwYXJzZUZsb2F0KHN0eWxlc1tzdHlsZSArICctJyArIHBvcyArIHN1ZmZpeF0pIHx8IDA7XG4gICAgfVxuICAgIHJlc3VsdC53aWR0aCA9IHJlc3VsdC5sZWZ0ICsgcmVzdWx0LnJpZ2h0O1xuICAgIHJlc3VsdC5oZWlnaHQgPSByZXN1bHQudG9wICsgcmVzdWx0LmJvdHRvbTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuY29uc3QgdXNlT2Zmc2V0UG9zID0gKHgsIHksIHRhcmdldCk9Pih4ID4gMCB8fCB5ID4gMCkgJiYgKCF0YXJnZXQgfHwgIXRhcmdldC5zaGFkb3dSb290KTtcbi8qKlxuICogQHBhcmFtIGVcbiAqIEBwYXJhbSBjYW52YXNcbiAqIEByZXR1cm5zIENhbnZhcyBwb3NpdGlvblxuICovIGZ1bmN0aW9uIGdldENhbnZhc1Bvc2l0aW9uKGUsIGNhbnZhcykge1xuICAgIGNvbnN0IHRvdWNoZXMgPSBlLnRvdWNoZXM7XG4gICAgY29uc3Qgc291cmNlID0gdG91Y2hlcyAmJiB0b3VjaGVzLmxlbmd0aCA/IHRvdWNoZXNbMF0gOiBlO1xuICAgIGNvbnN0IHsgb2Zmc2V0WCAsIG9mZnNldFkgIH0gPSBzb3VyY2U7XG4gICAgbGV0IGJveCA9IGZhbHNlO1xuICAgIGxldCB4LCB5O1xuICAgIGlmICh1c2VPZmZzZXRQb3Mob2Zmc2V0WCwgb2Zmc2V0WSwgZS50YXJnZXQpKSB7XG4gICAgICAgIHggPSBvZmZzZXRYO1xuICAgICAgICB5ID0gb2Zmc2V0WTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByZWN0ID0gY2FudmFzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICB4ID0gc291cmNlLmNsaWVudFggLSByZWN0LmxlZnQ7XG4gICAgICAgIHkgPSBzb3VyY2UuY2xpZW50WSAtIHJlY3QudG9wO1xuICAgICAgICBib3ggPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICB4LFxuICAgICAgICB5LFxuICAgICAgICBib3hcbiAgICB9O1xufVxuLyoqXG4gKiBHZXRzIGFuIGV2ZW50J3MgeCwgeSBjb29yZGluYXRlcywgcmVsYXRpdmUgdG8gdGhlIGNoYXJ0IGFyZWFcbiAqIEBwYXJhbSBldmVudFxuICogQHBhcmFtIGNoYXJ0XG4gKiBAcmV0dXJucyB4IGFuZCB5IGNvb3JkaW5hdGVzIG9mIHRoZSBldmVudFxuICovIGZ1bmN0aW9uIGdldFJlbGF0aXZlUG9zaXRpb24oZXZlbnQsIGNoYXJ0KSB7XG4gICAgaWYgKCduYXRpdmUnIGluIGV2ZW50KSB7XG4gICAgICAgIHJldHVybiBldmVudDtcbiAgICB9XG4gICAgY29uc3QgeyBjYW52YXMgLCBjdXJyZW50RGV2aWNlUGl4ZWxSYXRpbyAgfSA9IGNoYXJ0O1xuICAgIGNvbnN0IHN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShjYW52YXMpO1xuICAgIGNvbnN0IGJvcmRlckJveCA9IHN0eWxlLmJveFNpemluZyA9PT0gJ2JvcmRlci1ib3gnO1xuICAgIGNvbnN0IHBhZGRpbmdzID0gZ2V0UG9zaXRpb25lZFN0eWxlKHN0eWxlLCAncGFkZGluZycpO1xuICAgIGNvbnN0IGJvcmRlcnMgPSBnZXRQb3NpdGlvbmVkU3R5bGUoc3R5bGUsICdib3JkZXInLCAnd2lkdGgnKTtcbiAgICBjb25zdCB7IHggLCB5ICwgYm94ICB9ID0gZ2V0Q2FudmFzUG9zaXRpb24oZXZlbnQsIGNhbnZhcyk7XG4gICAgY29uc3QgeE9mZnNldCA9IHBhZGRpbmdzLmxlZnQgKyAoYm94ICYmIGJvcmRlcnMubGVmdCk7XG4gICAgY29uc3QgeU9mZnNldCA9IHBhZGRpbmdzLnRvcCArIChib3ggJiYgYm9yZGVycy50b3ApO1xuICAgIGxldCB7IHdpZHRoICwgaGVpZ2h0ICB9ID0gY2hhcnQ7XG4gICAgaWYgKGJvcmRlckJveCkge1xuICAgICAgICB3aWR0aCAtPSBwYWRkaW5ncy53aWR0aCArIGJvcmRlcnMud2lkdGg7XG4gICAgICAgIGhlaWdodCAtPSBwYWRkaW5ncy5oZWlnaHQgKyBib3JkZXJzLmhlaWdodDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgeDogTWF0aC5yb3VuZCgoeCAtIHhPZmZzZXQpIC8gd2lkdGggKiBjYW52YXMud2lkdGggLyBjdXJyZW50RGV2aWNlUGl4ZWxSYXRpbyksXG4gICAgICAgIHk6IE1hdGgucm91bmQoKHkgLSB5T2Zmc2V0KSAvIGhlaWdodCAqIGNhbnZhcy5oZWlnaHQgLyBjdXJyZW50RGV2aWNlUGl4ZWxSYXRpbylcbiAgICB9O1xufVxuZnVuY3Rpb24gZ2V0Q29udGFpbmVyU2l6ZShjYW52YXMsIHdpZHRoLCBoZWlnaHQpIHtcbiAgICBsZXQgbWF4V2lkdGgsIG1heEhlaWdodDtcbiAgICBpZiAod2lkdGggPT09IHVuZGVmaW5lZCB8fCBoZWlnaHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBjb250YWluZXIgPSBfZ2V0UGFyZW50Tm9kZShjYW52YXMpO1xuICAgICAgICBpZiAoIWNvbnRhaW5lcikge1xuICAgICAgICAgICAgd2lkdGggPSBjYW52YXMuY2xpZW50V2lkdGg7XG4gICAgICAgICAgICBoZWlnaHQgPSBjYW52YXMuY2xpZW50SGVpZ2h0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcmVjdCA9IGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsgLy8gdGhpcyBpcyB0aGUgYm9yZGVyIGJveCBvZiB0aGUgY29udGFpbmVyXG4gICAgICAgICAgICBjb25zdCBjb250YWluZXJTdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoY29udGFpbmVyKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lckJvcmRlciA9IGdldFBvc2l0aW9uZWRTdHlsZShjb250YWluZXJTdHlsZSwgJ2JvcmRlcicsICd3aWR0aCcpO1xuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyUGFkZGluZyA9IGdldFBvc2l0aW9uZWRTdHlsZShjb250YWluZXJTdHlsZSwgJ3BhZGRpbmcnKTtcbiAgICAgICAgICAgIHdpZHRoID0gcmVjdC53aWR0aCAtIGNvbnRhaW5lclBhZGRpbmcud2lkdGggLSBjb250YWluZXJCb3JkZXIud2lkdGg7XG4gICAgICAgICAgICBoZWlnaHQgPSByZWN0LmhlaWdodCAtIGNvbnRhaW5lclBhZGRpbmcuaGVpZ2h0IC0gY29udGFpbmVyQm9yZGVyLmhlaWdodDtcbiAgICAgICAgICAgIG1heFdpZHRoID0gcGFyc2VNYXhTdHlsZShjb250YWluZXJTdHlsZS5tYXhXaWR0aCwgY29udGFpbmVyLCAnY2xpZW50V2lkdGgnKTtcbiAgICAgICAgICAgIG1heEhlaWdodCA9IHBhcnNlTWF4U3R5bGUoY29udGFpbmVyU3R5bGUubWF4SGVpZ2h0LCBjb250YWluZXIsICdjbGllbnRIZWlnaHQnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICB3aWR0aCxcbiAgICAgICAgaGVpZ2h0LFxuICAgICAgICBtYXhXaWR0aDogbWF4V2lkdGggfHwgSU5GSU5JVFksXG4gICAgICAgIG1heEhlaWdodDogbWF4SGVpZ2h0IHx8IElORklOSVRZXG4gICAgfTtcbn1cbmNvbnN0IHJvdW5kMSA9ICh2KT0+TWF0aC5yb3VuZCh2ICogMTApIC8gMTA7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuZnVuY3Rpb24gZ2V0TWF4aW11bVNpemUoY2FudmFzLCBiYldpZHRoLCBiYkhlaWdodCwgYXNwZWN0UmF0aW8pIHtcbiAgICBjb25zdCBzdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoY2FudmFzKTtcbiAgICBjb25zdCBtYXJnaW5zID0gZ2V0UG9zaXRpb25lZFN0eWxlKHN0eWxlLCAnbWFyZ2luJyk7XG4gICAgY29uc3QgbWF4V2lkdGggPSBwYXJzZU1heFN0eWxlKHN0eWxlLm1heFdpZHRoLCBjYW52YXMsICdjbGllbnRXaWR0aCcpIHx8IElORklOSVRZO1xuICAgIGNvbnN0IG1heEhlaWdodCA9IHBhcnNlTWF4U3R5bGUoc3R5bGUubWF4SGVpZ2h0LCBjYW52YXMsICdjbGllbnRIZWlnaHQnKSB8fCBJTkZJTklUWTtcbiAgICBjb25zdCBjb250YWluZXJTaXplID0gZ2V0Q29udGFpbmVyU2l6ZShjYW52YXMsIGJiV2lkdGgsIGJiSGVpZ2h0KTtcbiAgICBsZXQgeyB3aWR0aCAsIGhlaWdodCAgfSA9IGNvbnRhaW5lclNpemU7XG4gICAgaWYgKHN0eWxlLmJveFNpemluZyA9PT0gJ2NvbnRlbnQtYm94Jykge1xuICAgICAgICBjb25zdCBib3JkZXJzID0gZ2V0UG9zaXRpb25lZFN0eWxlKHN0eWxlLCAnYm9yZGVyJywgJ3dpZHRoJyk7XG4gICAgICAgIGNvbnN0IHBhZGRpbmdzID0gZ2V0UG9zaXRpb25lZFN0eWxlKHN0eWxlLCAncGFkZGluZycpO1xuICAgICAgICB3aWR0aCAtPSBwYWRkaW5ncy53aWR0aCArIGJvcmRlcnMud2lkdGg7XG4gICAgICAgIGhlaWdodCAtPSBwYWRkaW5ncy5oZWlnaHQgKyBib3JkZXJzLmhlaWdodDtcbiAgICB9XG4gICAgd2lkdGggPSBNYXRoLm1heCgwLCB3aWR0aCAtIG1hcmdpbnMud2lkdGgpO1xuICAgIGhlaWdodCA9IE1hdGgubWF4KDAsIGFzcGVjdFJhdGlvID8gd2lkdGggLyBhc3BlY3RSYXRpbyA6IGhlaWdodCAtIG1hcmdpbnMuaGVpZ2h0KTtcbiAgICB3aWR0aCA9IHJvdW5kMShNYXRoLm1pbih3aWR0aCwgbWF4V2lkdGgsIGNvbnRhaW5lclNpemUubWF4V2lkdGgpKTtcbiAgICBoZWlnaHQgPSByb3VuZDEoTWF0aC5taW4oaGVpZ2h0LCBtYXhIZWlnaHQsIGNvbnRhaW5lclNpemUubWF4SGVpZ2h0KSk7XG4gICAgaWYgKHdpZHRoICYmICFoZWlnaHQpIHtcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2NoYXJ0anMvQ2hhcnQuanMvaXNzdWVzLzQ2NTlcbiAgICAgICAgLy8gSWYgdGhlIGNhbnZhcyBoYXMgd2lkdGgsIGJ1dCBubyBoZWlnaHQsIGRlZmF1bHQgdG8gYXNwZWN0UmF0aW8gb2YgMiAoY2FudmFzIGRlZmF1bHQpXG4gICAgICAgIGhlaWdodCA9IHJvdW5kMSh3aWR0aCAvIDIpO1xuICAgIH1cbiAgICBjb25zdCBtYWludGFpbkhlaWdodCA9IGJiV2lkdGggIT09IHVuZGVmaW5lZCB8fCBiYkhlaWdodCAhPT0gdW5kZWZpbmVkO1xuICAgIGlmIChtYWludGFpbkhlaWdodCAmJiBhc3BlY3RSYXRpbyAmJiBjb250YWluZXJTaXplLmhlaWdodCAmJiBoZWlnaHQgPiBjb250YWluZXJTaXplLmhlaWdodCkge1xuICAgICAgICBoZWlnaHQgPSBjb250YWluZXJTaXplLmhlaWdodDtcbiAgICAgICAgd2lkdGggPSByb3VuZDEoTWF0aC5mbG9vcihoZWlnaHQgKiBhc3BlY3RSYXRpbykpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICB3aWR0aCxcbiAgICAgICAgaGVpZ2h0XG4gICAgfTtcbn1cbi8qKlxuICogQHBhcmFtIGNoYXJ0XG4gKiBAcGFyYW0gZm9yY2VSYXRpb1xuICogQHBhcmFtIGZvcmNlU3R5bGVcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGNhbnZhcyBjb250ZXh0IHNpemUgb3IgdHJhbnNmb3JtYXRpb24gaGFzIGNoYW5nZWQuXG4gKi8gZnVuY3Rpb24gcmV0aW5hU2NhbGUoY2hhcnQsIGZvcmNlUmF0aW8sIGZvcmNlU3R5bGUpIHtcbiAgICBjb25zdCBwaXhlbFJhdGlvID0gZm9yY2VSYXRpbyB8fCAxO1xuICAgIGNvbnN0IGRldmljZUhlaWdodCA9IE1hdGguZmxvb3IoY2hhcnQuaGVpZ2h0ICogcGl4ZWxSYXRpbyk7XG4gICAgY29uc3QgZGV2aWNlV2lkdGggPSBNYXRoLmZsb29yKGNoYXJ0LndpZHRoICogcGl4ZWxSYXRpbyk7XG4gICAgY2hhcnQuaGVpZ2h0ID0gTWF0aC5mbG9vcihjaGFydC5oZWlnaHQpO1xuICAgIGNoYXJ0LndpZHRoID0gTWF0aC5mbG9vcihjaGFydC53aWR0aCk7XG4gICAgY29uc3QgY2FudmFzID0gY2hhcnQuY2FudmFzO1xuICAgIC8vIElmIG5vIHN0eWxlIGhhcyBiZWVuIHNldCBvbiB0aGUgY2FudmFzLCB0aGUgcmVuZGVyIHNpemUgaXMgdXNlZCBhcyBkaXNwbGF5IHNpemUsXG4gICAgLy8gbWFraW5nIHRoZSBjaGFydCB2aXN1YWxseSBiaWdnZXIsIHNvIGxldCdzIGVuZm9yY2UgaXQgdG8gdGhlIFwiY29ycmVjdFwiIHZhbHVlcy5cbiAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2NoYXJ0anMvQ2hhcnQuanMvaXNzdWVzLzM1NzVcbiAgICBpZiAoY2FudmFzLnN0eWxlICYmIChmb3JjZVN0eWxlIHx8ICFjYW52YXMuc3R5bGUuaGVpZ2h0ICYmICFjYW52YXMuc3R5bGUud2lkdGgpKSB7XG4gICAgICAgIGNhbnZhcy5zdHlsZS5oZWlnaHQgPSBgJHtjaGFydC5oZWlnaHR9cHhgO1xuICAgICAgICBjYW52YXMuc3R5bGUud2lkdGggPSBgJHtjaGFydC53aWR0aH1weGA7XG4gICAgfVxuICAgIGlmIChjaGFydC5jdXJyZW50RGV2aWNlUGl4ZWxSYXRpbyAhPT0gcGl4ZWxSYXRpbyB8fCBjYW52YXMuaGVpZ2h0ICE9PSBkZXZpY2VIZWlnaHQgfHwgY2FudmFzLndpZHRoICE9PSBkZXZpY2VXaWR0aCkge1xuICAgICAgICBjaGFydC5jdXJyZW50RGV2aWNlUGl4ZWxSYXRpbyA9IHBpeGVsUmF0aW87XG4gICAgICAgIGNhbnZhcy5oZWlnaHQgPSBkZXZpY2VIZWlnaHQ7XG4gICAgICAgIGNhbnZhcy53aWR0aCA9IGRldmljZVdpZHRoO1xuICAgICAgICBjaGFydC5jdHguc2V0VHJhbnNmb3JtKHBpeGVsUmF0aW8sIDAsIDAsIHBpeGVsUmF0aW8sIDAsIDApO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuLyoqXG4gKiBEZXRlY3RzIHN1cHBvcnQgZm9yIG9wdGlvbnMgb2JqZWN0IGFyZ3VtZW50IGluIGFkZEV2ZW50TGlzdGVuZXIuXG4gKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRXZlbnRUYXJnZXQvYWRkRXZlbnRMaXN0ZW5lciNTYWZlbHlfZGV0ZWN0aW5nX29wdGlvbl9zdXBwb3J0XG4gKiBAcHJpdmF0ZVxuICovIGNvbnN0IHN1cHBvcnRzRXZlbnRMaXN0ZW5lck9wdGlvbnMgPSBmdW5jdGlvbigpIHtcbiAgICBsZXQgcGFzc2l2ZVN1cHBvcnRlZCA9IGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBnZXQgcGFzc2l2ZSAoKSB7XG4gICAgICAgICAgICAgICAgcGFzc2l2ZVN1cHBvcnRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndGVzdCcsIG51bGwsIG9wdGlvbnMpO1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigndGVzdCcsIG51bGwsIG9wdGlvbnMpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBjb250aW51ZSByZWdhcmRsZXNzIG9mIGVycm9yXG4gICAgfVxuICAgIHJldHVybiBwYXNzaXZlU3VwcG9ydGVkO1xufSgpO1xuLyoqXG4gKiBUaGUgXCJ1c2VkXCIgc2l6ZSBpcyB0aGUgZmluYWwgdmFsdWUgb2YgYSBkaW1lbnNpb24gcHJvcGVydHkgYWZ0ZXIgYWxsIGNhbGN1bGF0aW9ucyBoYXZlXG4gKiBiZWVuIHBlcmZvcm1lZC4gVGhpcyBtZXRob2QgdXNlcyB0aGUgY29tcHV0ZWQgc3R5bGUgb2YgYGVsZW1lbnRgIGJ1dCByZXR1cm5zIHVuZGVmaW5lZFxuICogaWYgdGhlIGNvbXB1dGVkIHN0eWxlIGlzIG5vdCBleHByZXNzZWQgaW4gcGl4ZWxzLiBUaGF0IGNhbiBoYXBwZW4gaW4gc29tZSBjYXNlcyB3aGVyZVxuICogYGVsZW1lbnRgIGhhcyBhIHNpemUgcmVsYXRpdmUgdG8gaXRzIHBhcmVudCBhbmQgdGhpcyBsYXN0IG9uZSBpcyBub3QgeWV0IGRpc3BsYXllZCxcbiAqIGZvciBleGFtcGxlIGJlY2F1c2Ugb2YgYGRpc3BsYXk6IG5vbmVgIG9uIGEgcGFyZW50IG5vZGUuXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy91c2VkX3ZhbHVlXG4gKiBAcmV0dXJucyBTaXplIGluIHBpeGVscyBvciB1bmRlZmluZWQgaWYgdW5rbm93bi5cbiAqLyBmdW5jdGlvbiByZWFkVXNlZFNpemUoZWxlbWVudCwgcHJvcGVydHkpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGdldFN0eWxlKGVsZW1lbnQsIHByb3BlcnR5KTtcbiAgICBjb25zdCBtYXRjaGVzID0gdmFsdWUgJiYgdmFsdWUubWF0Y2goL14oXFxkKykoXFwuXFxkKyk/cHgkLyk7XG4gICAgcmV0dXJuIG1hdGNoZXMgPyArbWF0Y2hlc1sxXSA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovIGZ1bmN0aW9uIF9wb2ludEluTGluZShwMSwgcDIsIHQsIG1vZGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB4OiBwMS54ICsgdCAqIChwMi54IC0gcDEueCksXG4gICAgICAgIHk6IHAxLnkgKyB0ICogKHAyLnkgLSBwMS55KVxuICAgIH07XG59XG4vKipcbiAqIEBwcml2YXRlXG4gKi8gZnVuY3Rpb24gX3N0ZXBwZWRJbnRlcnBvbGF0aW9uKHAxLCBwMiwgdCwgbW9kZSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHg6IHAxLnggKyB0ICogKHAyLnggLSBwMS54KSxcbiAgICAgICAgeTogbW9kZSA9PT0gJ21pZGRsZScgPyB0IDwgMC41ID8gcDEueSA6IHAyLnkgOiBtb2RlID09PSAnYWZ0ZXInID8gdCA8IDEgPyBwMS55IDogcDIueSA6IHQgPiAwID8gcDIueSA6IHAxLnlcbiAgICB9O1xufVxuLyoqXG4gKiBAcHJpdmF0ZVxuICovIGZ1bmN0aW9uIF9iZXppZXJJbnRlcnBvbGF0aW9uKHAxLCBwMiwgdCwgbW9kZSkge1xuICAgIGNvbnN0IGNwMSA9IHtcbiAgICAgICAgeDogcDEuY3AyeCxcbiAgICAgICAgeTogcDEuY3AyeVxuICAgIH07XG4gICAgY29uc3QgY3AyID0ge1xuICAgICAgICB4OiBwMi5jcDF4LFxuICAgICAgICB5OiBwMi5jcDF5XG4gICAgfTtcbiAgICBjb25zdCBhID0gX3BvaW50SW5MaW5lKHAxLCBjcDEsIHQpO1xuICAgIGNvbnN0IGIgPSBfcG9pbnRJbkxpbmUoY3AxLCBjcDIsIHQpO1xuICAgIGNvbnN0IGMgPSBfcG9pbnRJbkxpbmUoY3AyLCBwMiwgdCk7XG4gICAgY29uc3QgZCA9IF9wb2ludEluTGluZShhLCBiLCB0KTtcbiAgICBjb25zdCBlID0gX3BvaW50SW5MaW5lKGIsIGMsIHQpO1xuICAgIHJldHVybiBfcG9pbnRJbkxpbmUoZCwgZSwgdCk7XG59XG5cbmNvbnN0IGdldFJpZ2h0VG9MZWZ0QWRhcHRlciA9IGZ1bmN0aW9uKHJlY3RYLCB3aWR0aCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHggKHgpIHtcbiAgICAgICAgICAgIHJldHVybiByZWN0WCArIHJlY3RYICsgd2lkdGggLSB4O1xuICAgICAgICB9LFxuICAgICAgICBzZXRXaWR0aCAodykge1xuICAgICAgICAgICAgd2lkdGggPSB3O1xuICAgICAgICB9LFxuICAgICAgICB0ZXh0QWxpZ24gKGFsaWduKSB7XG4gICAgICAgICAgICBpZiAoYWxpZ24gPT09ICdjZW50ZXInKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFsaWduO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGFsaWduID09PSAncmlnaHQnID8gJ2xlZnQnIDogJ3JpZ2h0JztcbiAgICAgICAgfSxcbiAgICAgICAgeFBsdXMgKHgsIHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4geCAtIHZhbHVlO1xuICAgICAgICB9LFxuICAgICAgICBsZWZ0Rm9yTHRyICh4LCBpdGVtV2lkdGgpIHtcbiAgICAgICAgICAgIHJldHVybiB4IC0gaXRlbVdpZHRoO1xuICAgICAgICB9XG4gICAgfTtcbn07XG5jb25zdCBnZXRMZWZ0VG9SaWdodEFkYXB0ZXIgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB4ICh4KSB7XG4gICAgICAgICAgICByZXR1cm4geDtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0V2lkdGggKHcpIHt9LFxuICAgICAgICB0ZXh0QWxpZ24gKGFsaWduKSB7XG4gICAgICAgICAgICByZXR1cm4gYWxpZ247XG4gICAgICAgIH0sXG4gICAgICAgIHhQbHVzICh4LCB2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHggKyB2YWx1ZTtcbiAgICAgICAgfSxcbiAgICAgICAgbGVmdEZvckx0ciAoeCwgX2l0ZW1XaWR0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHg7XG4gICAgICAgIH1cbiAgICB9O1xufTtcbmZ1bmN0aW9uIGdldFJ0bEFkYXB0ZXIocnRsLCByZWN0WCwgd2lkdGgpIHtcbiAgICByZXR1cm4gcnRsID8gZ2V0UmlnaHRUb0xlZnRBZGFwdGVyKHJlY3RYLCB3aWR0aCkgOiBnZXRMZWZ0VG9SaWdodEFkYXB0ZXIoKTtcbn1cbmZ1bmN0aW9uIG92ZXJyaWRlVGV4dERpcmVjdGlvbihjdHgsIGRpcmVjdGlvbikge1xuICAgIGxldCBzdHlsZSwgb3JpZ2luYWw7XG4gICAgaWYgKGRpcmVjdGlvbiA9PT0gJ2x0cicgfHwgZGlyZWN0aW9uID09PSAncnRsJykge1xuICAgICAgICBzdHlsZSA9IGN0eC5jYW52YXMuc3R5bGU7XG4gICAgICAgIG9yaWdpbmFsID0gW1xuICAgICAgICAgICAgc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnZGlyZWN0aW9uJyksXG4gICAgICAgICAgICBzdHlsZS5nZXRQcm9wZXJ0eVByaW9yaXR5KCdkaXJlY3Rpb24nKVxuICAgICAgICBdO1xuICAgICAgICBzdHlsZS5zZXRQcm9wZXJ0eSgnZGlyZWN0aW9uJywgZGlyZWN0aW9uLCAnaW1wb3J0YW50Jyk7XG4gICAgICAgIGN0eC5wcmV2VGV4dERpcmVjdGlvbiA9IG9yaWdpbmFsO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHJlc3RvcmVUZXh0RGlyZWN0aW9uKGN0eCwgb3JpZ2luYWwpIHtcbiAgICBpZiAob3JpZ2luYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBkZWxldGUgY3R4LnByZXZUZXh0RGlyZWN0aW9uO1xuICAgICAgICBjdHguY2FudmFzLnN0eWxlLnNldFByb3BlcnR5KCdkaXJlY3Rpb24nLCBvcmlnaW5hbFswXSwgb3JpZ2luYWxbMV0pO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gcHJvcGVydHlGbihwcm9wZXJ0eSkge1xuICAgIGlmIChwcm9wZXJ0eSA9PT0gJ2FuZ2xlJykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYmV0d2VlbjogX2FuZ2xlQmV0d2VlbixcbiAgICAgICAgICAgIGNvbXBhcmU6IF9hbmdsZURpZmYsXG4gICAgICAgICAgICBub3JtYWxpemU6IF9ub3JtYWxpemVBbmdsZVxuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBiZXR3ZWVuOiBfaXNCZXR3ZWVuLFxuICAgICAgICBjb21wYXJlOiAoYSwgYik9PmEgLSBiLFxuICAgICAgICBub3JtYWxpemU6ICh4KT0+eFxuICAgIH07XG59XG5mdW5jdGlvbiBub3JtYWxpemVTZWdtZW50KHsgc3RhcnQgLCBlbmQgLCBjb3VudCAsIGxvb3AgLCBzdHlsZSAgfSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHN0YXJ0OiBzdGFydCAlIGNvdW50LFxuICAgICAgICBlbmQ6IGVuZCAlIGNvdW50LFxuICAgICAgICBsb29wOiBsb29wICYmIChlbmQgLSBzdGFydCArIDEpICUgY291bnQgPT09IDAsXG4gICAgICAgIHN0eWxlXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGdldFNlZ21lbnQoc2VnbWVudCwgcG9pbnRzLCBib3VuZHMpIHtcbiAgICBjb25zdCB7IHByb3BlcnR5ICwgc3RhcnQ6IHN0YXJ0Qm91bmQgLCBlbmQ6IGVuZEJvdW5kICB9ID0gYm91bmRzO1xuICAgIGNvbnN0IHsgYmV0d2VlbiAsIG5vcm1hbGl6ZSAgfSA9IHByb3BlcnR5Rm4ocHJvcGVydHkpO1xuICAgIGNvbnN0IGNvdW50ID0gcG9pbnRzLmxlbmd0aDtcbiAgICBsZXQgeyBzdGFydCAsIGVuZCAsIGxvb3AgIH0gPSBzZWdtZW50O1xuICAgIGxldCBpLCBpbGVuO1xuICAgIGlmIChsb29wKSB7XG4gICAgICAgIHN0YXJ0ICs9IGNvdW50O1xuICAgICAgICBlbmQgKz0gY291bnQ7XG4gICAgICAgIGZvcihpID0gMCwgaWxlbiA9IGNvdW50OyBpIDwgaWxlbjsgKytpKXtcbiAgICAgICAgICAgIGlmICghYmV0d2Vlbihub3JtYWxpemUocG9pbnRzW3N0YXJ0ICUgY291bnRdW3Byb3BlcnR5XSksIHN0YXJ0Qm91bmQsIGVuZEJvdW5kKSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RhcnQtLTtcbiAgICAgICAgICAgIGVuZC0tO1xuICAgICAgICB9XG4gICAgICAgIHN0YXJ0ICU9IGNvdW50O1xuICAgICAgICBlbmQgJT0gY291bnQ7XG4gICAgfVxuICAgIGlmIChlbmQgPCBzdGFydCkge1xuICAgICAgICBlbmQgKz0gY291bnQ7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHN0YXJ0LFxuICAgICAgICBlbmQsXG4gICAgICAgIGxvb3AsXG4gICAgICAgIHN0eWxlOiBzZWdtZW50LnN0eWxlXG4gICAgfTtcbn1cbiBmdW5jdGlvbiBfYm91bmRTZWdtZW50KHNlZ21lbnQsIHBvaW50cywgYm91bmRzKSB7XG4gICAgaWYgKCFib3VuZHMpIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIHNlZ21lbnRcbiAgICAgICAgXTtcbiAgICB9XG4gICAgY29uc3QgeyBwcm9wZXJ0eSAsIHN0YXJ0OiBzdGFydEJvdW5kICwgZW5kOiBlbmRCb3VuZCAgfSA9IGJvdW5kcztcbiAgICBjb25zdCBjb3VudCA9IHBvaW50cy5sZW5ndGg7XG4gICAgY29uc3QgeyBjb21wYXJlICwgYmV0d2VlbiAsIG5vcm1hbGl6ZSAgfSA9IHByb3BlcnR5Rm4ocHJvcGVydHkpO1xuICAgIGNvbnN0IHsgc3RhcnQgLCBlbmQgLCBsb29wICwgc3R5bGUgIH0gPSBnZXRTZWdtZW50KHNlZ21lbnQsIHBvaW50cywgYm91bmRzKTtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBsZXQgaW5zaWRlID0gZmFsc2U7XG4gICAgbGV0IHN1YlN0YXJ0ID0gbnVsbDtcbiAgICBsZXQgdmFsdWUsIHBvaW50LCBwcmV2VmFsdWU7XG4gICAgY29uc3Qgc3RhcnRJc0JlZm9yZSA9ICgpPT5iZXR3ZWVuKHN0YXJ0Qm91bmQsIHByZXZWYWx1ZSwgdmFsdWUpICYmIGNvbXBhcmUoc3RhcnRCb3VuZCwgcHJldlZhbHVlKSAhPT0gMDtcbiAgICBjb25zdCBlbmRJc0JlZm9yZSA9ICgpPT5jb21wYXJlKGVuZEJvdW5kLCB2YWx1ZSkgPT09IDAgfHwgYmV0d2VlbihlbmRCb3VuZCwgcHJldlZhbHVlLCB2YWx1ZSk7XG4gICAgY29uc3Qgc2hvdWxkU3RhcnQgPSAoKT0+aW5zaWRlIHx8IHN0YXJ0SXNCZWZvcmUoKTtcbiAgICBjb25zdCBzaG91bGRTdG9wID0gKCk9PiFpbnNpZGUgfHwgZW5kSXNCZWZvcmUoKTtcbiAgICBmb3IobGV0IGkgPSBzdGFydCwgcHJldiA9IHN0YXJ0OyBpIDw9IGVuZDsgKytpKXtcbiAgICAgICAgcG9pbnQgPSBwb2ludHNbaSAlIGNvdW50XTtcbiAgICAgICAgaWYgKHBvaW50LnNraXApIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlID0gbm9ybWFsaXplKHBvaW50W3Byb3BlcnR5XSk7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gcHJldlZhbHVlKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpbnNpZGUgPSBiZXR3ZWVuKHZhbHVlLCBzdGFydEJvdW5kLCBlbmRCb3VuZCk7XG4gICAgICAgIGlmIChzdWJTdGFydCA9PT0gbnVsbCAmJiBzaG91bGRTdGFydCgpKSB7XG4gICAgICAgICAgICBzdWJTdGFydCA9IGNvbXBhcmUodmFsdWUsIHN0YXJ0Qm91bmQpID09PSAwID8gaSA6IHByZXY7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN1YlN0YXJ0ICE9PSBudWxsICYmIHNob3VsZFN0b3AoKSkge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2gobm9ybWFsaXplU2VnbWVudCh7XG4gICAgICAgICAgICAgICAgc3RhcnQ6IHN1YlN0YXJ0LFxuICAgICAgICAgICAgICAgIGVuZDogaSxcbiAgICAgICAgICAgICAgICBsb29wLFxuICAgICAgICAgICAgICAgIGNvdW50LFxuICAgICAgICAgICAgICAgIHN0eWxlXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICBzdWJTdGFydCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcHJldiA9IGk7XG4gICAgICAgIHByZXZWYWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICBpZiAoc3ViU3RhcnQgIT09IG51bGwpIHtcbiAgICAgICAgcmVzdWx0LnB1c2gobm9ybWFsaXplU2VnbWVudCh7XG4gICAgICAgICAgICBzdGFydDogc3ViU3RhcnQsXG4gICAgICAgICAgICBlbmQsXG4gICAgICAgICAgICBsb29wLFxuICAgICAgICAgICAgY291bnQsXG4gICAgICAgICAgICBzdHlsZVxuICAgICAgICB9KSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4gZnVuY3Rpb24gX2JvdW5kU2VnbWVudHMobGluZSwgYm91bmRzKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgY29uc3Qgc2VnbWVudHMgPSBsaW5lLnNlZ21lbnRzO1xuICAgIGZvcihsZXQgaSA9IDA7IGkgPCBzZWdtZW50cy5sZW5ndGg7IGkrKyl7XG4gICAgICAgIGNvbnN0IHN1YiA9IF9ib3VuZFNlZ21lbnQoc2VnbWVudHNbaV0sIGxpbmUucG9pbnRzLCBib3VuZHMpO1xuICAgICAgICBpZiAoc3ViLmxlbmd0aCkge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goLi4uc3ViKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuIGZ1bmN0aW9uIGZpbmRTdGFydEFuZEVuZChwb2ludHMsIGNvdW50LCBsb29wLCBzcGFuR2Fwcykge1xuICAgIGxldCBzdGFydCA9IDA7XG4gICAgbGV0IGVuZCA9IGNvdW50IC0gMTtcbiAgICBpZiAobG9vcCAmJiAhc3BhbkdhcHMpIHtcbiAgICAgICAgd2hpbGUoc3RhcnQgPCBjb3VudCAmJiAhcG9pbnRzW3N0YXJ0XS5za2lwKXtcbiAgICAgICAgICAgIHN0YXJ0Kys7XG4gICAgICAgIH1cbiAgICB9XG4gICAgd2hpbGUoc3RhcnQgPCBjb3VudCAmJiBwb2ludHNbc3RhcnRdLnNraXApe1xuICAgICAgICBzdGFydCsrO1xuICAgIH1cbiAgICBzdGFydCAlPSBjb3VudDtcbiAgICBpZiAobG9vcCkge1xuICAgICAgICBlbmQgKz0gc3RhcnQ7XG4gICAgfVxuICAgIHdoaWxlKGVuZCA+IHN0YXJ0ICYmIHBvaW50c1tlbmQgJSBjb3VudF0uc2tpcCl7XG4gICAgICAgIGVuZC0tO1xuICAgIH1cbiAgICBlbmQgJT0gY291bnQ7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc3RhcnQsXG4gICAgICAgIGVuZFxuICAgIH07XG59XG4gZnVuY3Rpb24gc29saWRTZWdtZW50cyhwb2ludHMsIHN0YXJ0LCBtYXgsIGxvb3ApIHtcbiAgICBjb25zdCBjb3VudCA9IHBvaW50cy5sZW5ndGg7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgbGV0IGxhc3QgPSBzdGFydDtcbiAgICBsZXQgcHJldiA9IHBvaW50c1tzdGFydF07XG4gICAgbGV0IGVuZDtcbiAgICBmb3IoZW5kID0gc3RhcnQgKyAxOyBlbmQgPD0gbWF4OyArK2VuZCl7XG4gICAgICAgIGNvbnN0IGN1ciA9IHBvaW50c1tlbmQgJSBjb3VudF07XG4gICAgICAgIGlmIChjdXIuc2tpcCB8fCBjdXIuc3RvcCkge1xuICAgICAgICAgICAgaWYgKCFwcmV2LnNraXApIHtcbiAgICAgICAgICAgICAgICBsb29wID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBzdGFydDogc3RhcnQgJSBjb3VudCxcbiAgICAgICAgICAgICAgICAgICAgZW5kOiAoZW5kIC0gMSkgJSBjb3VudCxcbiAgICAgICAgICAgICAgICAgICAgbG9vcFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHN0YXJ0ID0gbGFzdCA9IGN1ci5zdG9wID8gZW5kIDogbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxhc3QgPSBlbmQ7XG4gICAgICAgICAgICBpZiAocHJldi5za2lwKSB7XG4gICAgICAgICAgICAgICAgc3RhcnQgPSBlbmQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcHJldiA9IGN1cjtcbiAgICB9XG4gICAgaWYgKGxhc3QgIT09IG51bGwpIHtcbiAgICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0ICUgY291bnQsXG4gICAgICAgICAgICBlbmQ6IGxhc3QgJSBjb3VudCxcbiAgICAgICAgICAgIGxvb3BcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4gZnVuY3Rpb24gX2NvbXB1dGVTZWdtZW50cyhsaW5lLCBzZWdtZW50T3B0aW9ucykge1xuICAgIGNvbnN0IHBvaW50cyA9IGxpbmUucG9pbnRzO1xuICAgIGNvbnN0IHNwYW5HYXBzID0gbGluZS5vcHRpb25zLnNwYW5HYXBzO1xuICAgIGNvbnN0IGNvdW50ID0gcG9pbnRzLmxlbmd0aDtcbiAgICBpZiAoIWNvdW50KSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgY29uc3QgbG9vcCA9ICEhbGluZS5fbG9vcDtcbiAgICBjb25zdCB7IHN0YXJ0ICwgZW5kICB9ID0gZmluZFN0YXJ0QW5kRW5kKHBvaW50cywgY291bnQsIGxvb3AsIHNwYW5HYXBzKTtcbiAgICBpZiAoc3BhbkdhcHMgPT09IHRydWUpIHtcbiAgICAgICAgcmV0dXJuIHNwbGl0QnlTdHlsZXMobGluZSwgW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHN0YXJ0LFxuICAgICAgICAgICAgICAgIGVuZCxcbiAgICAgICAgICAgICAgICBsb29wXG4gICAgICAgICAgICB9XG4gICAgICAgIF0sIHBvaW50cywgc2VnbWVudE9wdGlvbnMpO1xuICAgIH1cbiAgICBjb25zdCBtYXggPSBlbmQgPCBzdGFydCA/IGVuZCArIGNvdW50IDogZW5kO1xuICAgIGNvbnN0IGNvbXBsZXRlTG9vcCA9ICEhbGluZS5fZnVsbExvb3AgJiYgc3RhcnQgPT09IDAgJiYgZW5kID09PSBjb3VudCAtIDE7XG4gICAgcmV0dXJuIHNwbGl0QnlTdHlsZXMobGluZSwgc29saWRTZWdtZW50cyhwb2ludHMsIHN0YXJ0LCBtYXgsIGNvbXBsZXRlTG9vcCksIHBvaW50cywgc2VnbWVudE9wdGlvbnMpO1xufVxuIGZ1bmN0aW9uIHNwbGl0QnlTdHlsZXMobGluZSwgc2VnbWVudHMsIHBvaW50cywgc2VnbWVudE9wdGlvbnMpIHtcbiAgICBpZiAoIXNlZ21lbnRPcHRpb25zIHx8ICFzZWdtZW50T3B0aW9ucy5zZXRDb250ZXh0IHx8ICFwb2ludHMpIHtcbiAgICAgICAgcmV0dXJuIHNlZ21lbnRzO1xuICAgIH1cbiAgICByZXR1cm4gZG9TcGxpdEJ5U3R5bGVzKGxpbmUsIHNlZ21lbnRzLCBwb2ludHMsIHNlZ21lbnRPcHRpb25zKTtcbn1cbiBmdW5jdGlvbiBkb1NwbGl0QnlTdHlsZXMobGluZSwgc2VnbWVudHMsIHBvaW50cywgc2VnbWVudE9wdGlvbnMpIHtcbiAgICBjb25zdCBjaGFydENvbnRleHQgPSBsaW5lLl9jaGFydC5nZXRDb250ZXh0KCk7XG4gICAgY29uc3QgYmFzZVN0eWxlID0gcmVhZFN0eWxlKGxpbmUub3B0aW9ucyk7XG4gICAgY29uc3QgeyBfZGF0YXNldEluZGV4OiBkYXRhc2V0SW5kZXggLCBvcHRpb25zOiB7IHNwYW5HYXBzICB9ICB9ID0gbGluZTtcbiAgICBjb25zdCBjb3VudCA9IHBvaW50cy5sZW5ndGg7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgbGV0IHByZXZTdHlsZSA9IGJhc2VTdHlsZTtcbiAgICBsZXQgc3RhcnQgPSBzZWdtZW50c1swXS5zdGFydDtcbiAgICBsZXQgaSA9IHN0YXJ0O1xuICAgIGZ1bmN0aW9uIGFkZFN0eWxlKHMsIGUsIGwsIHN0KSB7XG4gICAgICAgIGNvbnN0IGRpciA9IHNwYW5HYXBzID8gLTEgOiAxO1xuICAgICAgICBpZiAocyA9PT0gZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHMgKz0gY291bnQ7XG4gICAgICAgIHdoaWxlKHBvaW50c1tzICUgY291bnRdLnNraXApe1xuICAgICAgICAgICAgcyAtPSBkaXI7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUocG9pbnRzW2UgJSBjb3VudF0uc2tpcCl7XG4gICAgICAgICAgICBlICs9IGRpcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocyAlIGNvdW50ICE9PSBlICUgY291bnQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgICAgICAgICBzdGFydDogcyAlIGNvdW50LFxuICAgICAgICAgICAgICAgIGVuZDogZSAlIGNvdW50LFxuICAgICAgICAgICAgICAgIGxvb3A6IGwsXG4gICAgICAgICAgICAgICAgc3R5bGU6IHN0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHByZXZTdHlsZSA9IHN0O1xuICAgICAgICAgICAgc3RhcnQgPSBlICUgY291bnQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBzZWdtZW50IG9mIHNlZ21lbnRzKXtcbiAgICAgICAgc3RhcnQgPSBzcGFuR2FwcyA/IHN0YXJ0IDogc2VnbWVudC5zdGFydDtcbiAgICAgICAgbGV0IHByZXYgPSBwb2ludHNbc3RhcnQgJSBjb3VudF07XG4gICAgICAgIGxldCBzdHlsZTtcbiAgICAgICAgZm9yKGkgPSBzdGFydCArIDE7IGkgPD0gc2VnbWVudC5lbmQ7IGkrKyl7XG4gICAgICAgICAgICBjb25zdCBwdCA9IHBvaW50c1tpICUgY291bnRdO1xuICAgICAgICAgICAgc3R5bGUgPSByZWFkU3R5bGUoc2VnbWVudE9wdGlvbnMuc2V0Q29udGV4dChjcmVhdGVDb250ZXh0KGNoYXJ0Q29udGV4dCwge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdzZWdtZW50JyxcbiAgICAgICAgICAgICAgICBwMDogcHJldixcbiAgICAgICAgICAgICAgICBwMTogcHQsXG4gICAgICAgICAgICAgICAgcDBEYXRhSW5kZXg6IChpIC0gMSkgJSBjb3VudCxcbiAgICAgICAgICAgICAgICBwMURhdGFJbmRleDogaSAlIGNvdW50LFxuICAgICAgICAgICAgICAgIGRhdGFzZXRJbmRleFxuICAgICAgICAgICAgfSkpKTtcbiAgICAgICAgICAgIGlmIChzdHlsZUNoYW5nZWQoc3R5bGUsIHByZXZTdHlsZSkpIHtcbiAgICAgICAgICAgICAgICBhZGRTdHlsZShzdGFydCwgaSAtIDEsIHNlZ21lbnQubG9vcCwgcHJldlN0eWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByZXYgPSBwdDtcbiAgICAgICAgICAgIHByZXZTdHlsZSA9IHN0eWxlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGFydCA8IGkgLSAxKSB7XG4gICAgICAgICAgICBhZGRTdHlsZShzdGFydCwgaSAtIDEsIHNlZ21lbnQubG9vcCwgcHJldlN0eWxlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gcmVhZFN0eWxlKG9wdGlvbnMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IG9wdGlvbnMuYmFja2dyb3VuZENvbG9yLFxuICAgICAgICBib3JkZXJDYXBTdHlsZTogb3B0aW9ucy5ib3JkZXJDYXBTdHlsZSxcbiAgICAgICAgYm9yZGVyRGFzaDogb3B0aW9ucy5ib3JkZXJEYXNoLFxuICAgICAgICBib3JkZXJEYXNoT2Zmc2V0OiBvcHRpb25zLmJvcmRlckRhc2hPZmZzZXQsXG4gICAgICAgIGJvcmRlckpvaW5TdHlsZTogb3B0aW9ucy5ib3JkZXJKb2luU3R5bGUsXG4gICAgICAgIGJvcmRlcldpZHRoOiBvcHRpb25zLmJvcmRlcldpZHRoLFxuICAgICAgICBib3JkZXJDb2xvcjogb3B0aW9ucy5ib3JkZXJDb2xvclxuICAgIH07XG59XG5mdW5jdGlvbiBzdHlsZUNoYW5nZWQoc3R5bGUsIHByZXZTdHlsZSkge1xuICAgIGlmICghcHJldlN0eWxlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgY2FjaGUgPSBbXTtcbiAgICBjb25zdCByZXBsYWNlciA9IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKCFpc1BhdHRlcm5PckdyYWRpZW50KHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY2FjaGUuaW5jbHVkZXModmFsdWUpKSB7XG4gICAgICAgICAgICBjYWNoZS5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2FjaGUuaW5kZXhPZih2YWx1ZSk7XG4gICAgfTtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoc3R5bGUsIHJlcGxhY2VyKSAhPT0gSlNPTi5zdHJpbmdpZnkocHJldlN0eWxlLCByZXBsYWNlcik7XG59XG5cbmV4cG9ydCB7IHVuY2xpcEFyZWEgYXMgJCwgX3Jsb29rdXBCeUtleSBhcyBBLCBfbG9va3VwQnlLZXkgYXMgQiwgX2lzUG9pbnRJbkFyZWEgYXMgQywgZ2V0QW5nbGVGcm9tUG9pbnQgYXMgRCwgdG9QYWRkaW5nIGFzIEUsIGVhY2ggYXMgRiwgZ2V0TWF4aW11bVNpemUgYXMgRywgSEFMRl9QSSBhcyBILCBfZ2V0UGFyZW50Tm9kZSBhcyBJLCByZWFkVXNlZFNpemUgYXMgSiwgc3VwcG9ydHNFdmVudExpc3RlbmVyT3B0aW9ucyBhcyBLLCB0aHJvdHRsZWQgYXMgTCwgX2lzRG9tU3VwcG9ydGVkIGFzIE0sIF9mYWN0b3JpemUgYXMgTiwgZmluaXRlT3JEZWZhdWx0IGFzIE8sIFBJIGFzIFAsIGNhbGxiYWNrIGFzIFEsIF9hZGRHcmFjZSBhcyBSLCBfbGltaXRWYWx1ZSBhcyBTLCBUQVUgYXMgVCwgdG9EZWdyZWVzIGFzIFUsIF9tZWFzdXJlVGV4dCBhcyBWLCBfaW50MTZSYW5nZSBhcyBXLCBfYWxpZ25QaXhlbCBhcyBYLCBjbGlwQXJlYSBhcyBZLCByZW5kZXJUZXh0IGFzIFosIF9hcnJheVVuaXF1ZSBhcyBfLCByZXNvbHZlIGFzIGEsIGZvbnRTdHJpbmcgYXMgYSQsIHRvRm9udCBhcyBhMCwgX3RvTGVmdFJpZ2h0Q2VudGVyIGFzIGExLCBfYWxpZ25TdGFydEVuZCBhcyBhMiwgb3ZlcnJpZGVzIGFzIGEzLCBtZXJnZSBhcyBhNCwgX2NhcGl0YWxpemUgYXMgYTUsIGRlc2NyaXB0b3JzIGFzIGE2LCBpc0Z1bmN0aW9uIGFzIGE3LCBfYXR0YWNoQ29udGV4dCBhcyBhOCwgX2NyZWF0ZVJlc29sdmVyIGFzIGE5LCBvdmVycmlkZVRleHREaXJlY3Rpb24gYXMgYUEsIF90ZXh0WCBhcyBhQiwgcmVzdG9yZVRleHREaXJlY3Rpb24gYXMgYUMsIGRyYXdQb2ludExlZ2VuZCBhcyBhRCwgZGlzdGFuY2VCZXR3ZWVuUG9pbnRzIGFzIGFFLCBub29wIGFzIGFGLCBfc2V0TWluQW5kTWF4QnlLZXkgYXMgYUcsIG5pY2VOdW0gYXMgYUgsIGFsbW9zdFdob2xlIGFzIGFJLCBhbG1vc3RFcXVhbHMgYXMgYUosIF9kZWNpbWFsUGxhY2VzIGFzIGFLLCBUaWNrcyBhcyBhTCwgbG9nMTAgYXMgYU0sIF9sb25nZXN0VGV4dCBhcyBhTiwgX2ZpbHRlckJldHdlZW4gYXMgYU8sIF9sb29rdXAgYXMgYVAsIGlzUGF0dGVybk9yR3JhZGllbnQgYXMgYVEsIGdldEhvdmVyQ29sb3IgYXMgYVIsIGNsb25lIGFzIGFTLCBfbWVyZ2VyIGFzIGFULCBfbWVyZ2VySWYgYXMgYVUsIF9kZXByZWNhdGVkIGFzIGFWLCBfc3BsaXRLZXkgYXMgYVcsIHRvRm9udFN0cmluZyBhcyBhWCwgc3BsaW5lQ3VydmUgYXMgYVksIHNwbGluZUN1cnZlTW9ub3RvbmUgYXMgYVosIGdldFN0eWxlIGFzIGFfLCBfZGVzY3JpcHRvcnMgYXMgYWEsIG1lcmdlSWYgYXMgYWIsIHVpZCBhcyBhYywgZGVib3VuY2UgYXMgYWQsIHJldGluYVNjYWxlIGFzIGFlLCBjbGVhckNhbnZhcyBhcyBhZiwgc2V0c0VxdWFsIGFzIGFnLCBfZWxlbWVudHNFcXVhbCBhcyBhaCwgX2lzQ2xpY2tFdmVudCBhcyBhaSwgX2lzQmV0d2VlbiBhcyBhaiwgX3JlYWRWYWx1ZVRvUHJvcHMgYXMgYWssIF91cGRhdGVCZXppZXJDb250cm9sUG9pbnRzIGFzIGFsLCBfY29tcHV0ZVNlZ21lbnRzIGFzIGFtLCBfYm91bmRTZWdtZW50cyBhcyBhbiwgX3N0ZXBwZWRJbnRlcnBvbGF0aW9uIGFzIGFvLCBfYmV6aWVySW50ZXJwb2xhdGlvbiBhcyBhcCwgX3BvaW50SW5MaW5lIGFzIGFxLCBfc3RlcHBlZExpbmVUbyBhcyBhciwgX2JlemllckN1cnZlVG8gYXMgYXMsIGRyYXdQb2ludCBhcyBhdCwgYWRkUm91bmRlZFJlY3RQYXRoIGFzIGF1LCB0b1RSQkwgYXMgYXYsIHRvVFJCTENvcm5lcnMgYXMgYXcsIF9ib3VuZFNlZ21lbnQgYXMgYXgsIF9ub3JtYWxpemVBbmdsZSBhcyBheSwgZ2V0UnRsQWRhcHRlciBhcyBheiwgaXNBcnJheSBhcyBiLCB0b0xpbmVIZWlnaHQgYXMgYjAsIFBJVEFVIGFzIGIxLCBJTkZJTklUWSBhcyBiMiwgUkFEX1BFUl9ERUcgYXMgYjMsIFFVQVJURVJfUEkgYXMgYjQsIFRXT19USElSRFNfUEkgYXMgYjUsIF9hbmdsZURpZmYgYXMgYjYsIGNvbG9yIGFzIGMsIGRlZmF1bHRzIGFzIGQsIGVmZmVjdHMgYXMgZSwgcmVzb2x2ZU9iamVjdEtleSBhcyBmLCBpc051bWJlckZpbml0ZSBhcyBnLCBkZWZpbmVkIGFzIGgsIGlzT2JqZWN0IGFzIGksIGNyZWF0ZUNvbnRleHQgYXMgaiwgaXNOdWxsT3JVbmRlZiBhcyBrLCBsaXN0ZW5BcnJheUV2ZW50cyBhcyBsLCB0b1BlcmNlbnRhZ2UgYXMgbSwgdG9EaW1lbnNpb24gYXMgbiwgZm9ybWF0TnVtYmVyIGFzIG8sIF9hbmdsZUJldHdlZW4gYXMgcCwgX2dldFN0YXJ0QW5kQ291bnRPZlZpc2libGVQb2ludHMgYXMgcSwgcmVxdWVzdEFuaW1GcmFtZSBhcyByLCBzaWduIGFzIHMsIHRvUmFkaWFucyBhcyB0LCB1bmxpc3RlbkFycmF5RXZlbnRzIGFzIHUsIHZhbHVlT3JEZWZhdWx0IGFzIHYsIF9zY2FsZVJhbmdlc0NoYW5nZWQgYXMgdywgaXNOdW1iZXIgYXMgeCwgX3BhcnNlT2JqZWN0RGF0YVJhZGlhbFNjYWxlIGFzIHksIGdldFJlbGF0aXZlUG9zaXRpb24gYXMgeiB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aGVscGVycy5zZWdtZW50LmpzLm1hcFxuIiwiLyohXG4gKiBDaGFydC5qcyB2NC40LjBcbiAqIGh0dHBzOi8vd3d3LmNoYXJ0anMub3JnXG4gKiAoYykgMjAyMyBDaGFydC5qcyBDb250cmlidXRvcnNcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZVxuICovXG5pbXBvcnQgeyByIGFzIHJlcXVlc3RBbmltRnJhbWUsIGEgYXMgcmVzb2x2ZSwgZSBhcyBlZmZlY3RzLCBjIGFzIGNvbG9yLCBpIGFzIGlzT2JqZWN0LCBkIGFzIGRlZmF1bHRzLCBiIGFzIGlzQXJyYXksIHYgYXMgdmFsdWVPckRlZmF1bHQsIHUgYXMgdW5saXN0ZW5BcnJheUV2ZW50cywgbCBhcyBsaXN0ZW5BcnJheUV2ZW50cywgZiBhcyByZXNvbHZlT2JqZWN0S2V5LCBnIGFzIGlzTnVtYmVyRmluaXRlLCBoIGFzIGRlZmluZWQsIHMgYXMgc2lnbiwgaiBhcyBjcmVhdGVDb250ZXh0LCBrIGFzIGlzTnVsbE9yVW5kZWYsIF8gYXMgX2FycmF5VW5pcXVlLCB0IGFzIHRvUmFkaWFucywgbSBhcyB0b1BlcmNlbnRhZ2UsIG4gYXMgdG9EaW1lbnNpb24sIFQgYXMgVEFVLCBvIGFzIGZvcm1hdE51bWJlciwgcCBhcyBfYW5nbGVCZXR3ZWVuLCBIIGFzIEhBTEZfUEksIFAgYXMgUEksIHEgYXMgX2dldFN0YXJ0QW5kQ291bnRPZlZpc2libGVQb2ludHMsIHcgYXMgX3NjYWxlUmFuZ2VzQ2hhbmdlZCwgeCBhcyBpc051bWJlciwgeSBhcyBfcGFyc2VPYmplY3REYXRhUmFkaWFsU2NhbGUsIHogYXMgZ2V0UmVsYXRpdmVQb3NpdGlvbiwgQSBhcyBfcmxvb2t1cEJ5S2V5LCBCIGFzIF9sb29rdXBCeUtleSwgQyBhcyBfaXNQb2ludEluQXJlYSwgRCBhcyBnZXRBbmdsZUZyb21Qb2ludCwgRSBhcyB0b1BhZGRpbmcsIEYgYXMgZWFjaCwgRyBhcyBnZXRNYXhpbXVtU2l6ZSwgSSBhcyBfZ2V0UGFyZW50Tm9kZSwgSiBhcyByZWFkVXNlZFNpemUsIEsgYXMgc3VwcG9ydHNFdmVudExpc3RlbmVyT3B0aW9ucywgTCBhcyB0aHJvdHRsZWQsIE0gYXMgX2lzRG9tU3VwcG9ydGVkLCBOIGFzIF9mYWN0b3JpemUsIE8gYXMgZmluaXRlT3JEZWZhdWx0LCBRIGFzIGNhbGxiYWNrLCBSIGFzIF9hZGRHcmFjZSwgUyBhcyBfbGltaXRWYWx1ZSwgVSBhcyB0b0RlZ3JlZXMsIFYgYXMgX21lYXN1cmVUZXh0LCBXIGFzIF9pbnQxNlJhbmdlLCBYIGFzIF9hbGlnblBpeGVsLCBZIGFzIGNsaXBBcmVhLCBaIGFzIHJlbmRlclRleHQsICQgYXMgdW5jbGlwQXJlYSwgYTAgYXMgdG9Gb250LCBhMSBhcyBfdG9MZWZ0UmlnaHRDZW50ZXIsIGEyIGFzIF9hbGlnblN0YXJ0RW5kLCBhMyBhcyBvdmVycmlkZXMsIGE0IGFzIG1lcmdlLCBhNSBhcyBfY2FwaXRhbGl6ZSwgYTYgYXMgZGVzY3JpcHRvcnMsIGE3IGFzIGlzRnVuY3Rpb24sIGE4IGFzIF9hdHRhY2hDb250ZXh0LCBhOSBhcyBfY3JlYXRlUmVzb2x2ZXIsIGFhIGFzIF9kZXNjcmlwdG9ycywgYWIgYXMgbWVyZ2VJZiwgYWMgYXMgdWlkLCBhZCBhcyBkZWJvdW5jZSwgYWUgYXMgcmV0aW5hU2NhbGUsIGFmIGFzIGNsZWFyQ2FudmFzLCBhZyBhcyBzZXRzRXF1YWwsIGFoIGFzIF9lbGVtZW50c0VxdWFsLCBhaSBhcyBfaXNDbGlja0V2ZW50LCBhaiBhcyBfaXNCZXR3ZWVuLCBhayBhcyBfcmVhZFZhbHVlVG9Qcm9wcywgYWwgYXMgX3VwZGF0ZUJlemllckNvbnRyb2xQb2ludHMsIGFtIGFzIF9jb21wdXRlU2VnbWVudHMsIGFuIGFzIF9ib3VuZFNlZ21lbnRzLCBhbyBhcyBfc3RlcHBlZEludGVycG9sYXRpb24sIGFwIGFzIF9iZXppZXJJbnRlcnBvbGF0aW9uLCBhcSBhcyBfcG9pbnRJbkxpbmUsIGFyIGFzIF9zdGVwcGVkTGluZVRvLCBhcyBhcyBfYmV6aWVyQ3VydmVUbywgYXQgYXMgZHJhd1BvaW50LCBhdSBhcyBhZGRSb3VuZGVkUmVjdFBhdGgsIGF2IGFzIHRvVFJCTCwgYXcgYXMgdG9UUkJMQ29ybmVycywgYXggYXMgX2JvdW5kU2VnbWVudCwgYXkgYXMgX25vcm1hbGl6ZUFuZ2xlLCBheiBhcyBnZXRSdGxBZGFwdGVyLCBhQSBhcyBvdmVycmlkZVRleHREaXJlY3Rpb24sIGFCIGFzIF90ZXh0WCwgYUMgYXMgcmVzdG9yZVRleHREaXJlY3Rpb24sIGFEIGFzIGRyYXdQb2ludExlZ2VuZCwgYUUgYXMgZGlzdGFuY2VCZXR3ZWVuUG9pbnRzLCBhRiBhcyBub29wLCBhRyBhcyBfc2V0TWluQW5kTWF4QnlLZXksIGFIIGFzIG5pY2VOdW0sIGFJIGFzIGFsbW9zdFdob2xlLCBhSiBhcyBhbG1vc3RFcXVhbHMsIGFLIGFzIF9kZWNpbWFsUGxhY2VzLCBhTCBhcyBUaWNrcywgYU0gYXMgbG9nMTAsIGFOIGFzIF9sb25nZXN0VGV4dCwgYU8gYXMgX2ZpbHRlckJldHdlZW4sIGFQIGFzIF9sb29rdXAgfSBmcm9tICcuL2NodW5rcy9oZWxwZXJzLnNlZ21lbnQuanMnO1xuaW1wb3J0ICdAa3Vya2xlL2NvbG9yJztcblxuY2xhc3MgQW5pbWF0b3Ige1xuICAgIGNvbnN0cnVjdG9yKCl7XG4gICAgICAgIHRoaXMuX3JlcXVlc3QgPSBudWxsO1xuICAgICAgICB0aGlzLl9jaGFydHMgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuX3J1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fbGFzdERhdGUgPSB1bmRlZmluZWQ7XG4gICAgfVxuIF9ub3RpZnkoY2hhcnQsIGFuaW1zLCBkYXRlLCB0eXBlKSB7XG4gICAgICAgIGNvbnN0IGNhbGxiYWNrcyA9IGFuaW1zLmxpc3RlbmVyc1t0eXBlXTtcbiAgICAgICAgY29uc3QgbnVtU3RlcHMgPSBhbmltcy5kdXJhdGlvbjtcbiAgICAgICAgY2FsbGJhY2tzLmZvckVhY2goKGZuKT0+Zm4oe1xuICAgICAgICAgICAgICAgIGNoYXJ0LFxuICAgICAgICAgICAgICAgIGluaXRpYWw6IGFuaW1zLmluaXRpYWwsXG4gICAgICAgICAgICAgICAgbnVtU3RlcHMsXG4gICAgICAgICAgICAgICAgY3VycmVudFN0ZXA6IE1hdGgubWluKGRhdGUgLSBhbmltcy5zdGFydCwgbnVtU3RlcHMpXG4gICAgICAgICAgICB9KSk7XG4gICAgfVxuIF9yZWZyZXNoKCkge1xuICAgICAgICBpZiAodGhpcy5fcmVxdWVzdCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3J1bm5pbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLl9yZXF1ZXN0ID0gcmVxdWVzdEFuaW1GcmFtZS5jYWxsKHdpbmRvdywgKCk9PntcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgICAgICAgICAgdGhpcy5fcmVxdWVzdCA9IG51bGw7XG4gICAgICAgICAgICBpZiAodGhpcy5fcnVubmluZykge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlZnJlc2goKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuIF91cGRhdGUoZGF0ZSA9IERhdGUubm93KCkpIHtcbiAgICAgICAgbGV0IHJlbWFpbmluZyA9IDA7XG4gICAgICAgIHRoaXMuX2NoYXJ0cy5mb3JFYWNoKChhbmltcywgY2hhcnQpPT57XG4gICAgICAgICAgICBpZiAoIWFuaW1zLnJ1bm5pbmcgfHwgIWFuaW1zLml0ZW1zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGl0ZW1zID0gYW5pbXMuaXRlbXM7XG4gICAgICAgICAgICBsZXQgaSA9IGl0ZW1zLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICBsZXQgZHJhdyA9IGZhbHNlO1xuICAgICAgICAgICAgbGV0IGl0ZW07XG4gICAgICAgICAgICBmb3IoOyBpID49IDA7IC0taSl7XG4gICAgICAgICAgICAgICAgaXRlbSA9IGl0ZW1zW2ldO1xuICAgICAgICAgICAgICAgIGlmIChpdGVtLl9hY3RpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0uX3RvdGFsID4gYW5pbXMuZHVyYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1zLmR1cmF0aW9uID0gaXRlbS5fdG90YWw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaXRlbS50aWNrKGRhdGUpO1xuICAgICAgICAgICAgICAgICAgICBkcmF3ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpdGVtc1tpXSA9IGl0ZW1zW2l0ZW1zLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgICAgICBpdGVtcy5wb3AoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZHJhdykge1xuICAgICAgICAgICAgICAgIGNoYXJ0LmRyYXcoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9ub3RpZnkoY2hhcnQsIGFuaW1zLCBkYXRlLCAncHJvZ3Jlc3MnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaXRlbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgYW5pbXMucnVubmluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmeShjaGFydCwgYW5pbXMsIGRhdGUsICdjb21wbGV0ZScpO1xuICAgICAgICAgICAgICAgIGFuaW1zLmluaXRpYWwgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlbWFpbmluZyArPSBpdGVtcy5sZW5ndGg7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9sYXN0RGF0ZSA9IGRhdGU7XG4gICAgICAgIGlmIChyZW1haW5pbmcgPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuX3J1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiBfZ2V0QW5pbXMoY2hhcnQpIHtcbiAgICAgICAgY29uc3QgY2hhcnRzID0gdGhpcy5fY2hhcnRzO1xuICAgICAgICBsZXQgYW5pbXMgPSBjaGFydHMuZ2V0KGNoYXJ0KTtcbiAgICAgICAgaWYgKCFhbmltcykge1xuICAgICAgICAgICAgYW5pbXMgPSB7XG4gICAgICAgICAgICAgICAgcnVubmluZzogZmFsc2UsXG4gICAgICAgICAgICAgICAgaW5pdGlhbDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBpdGVtczogW10sXG4gICAgICAgICAgICAgICAgbGlzdGVuZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3M6IFtdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNoYXJ0cy5zZXQoY2hhcnQsIGFuaW1zKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYW5pbXM7XG4gICAgfVxuIGxpc3RlbihjaGFydCwgZXZlbnQsIGNiKSB7XG4gICAgICAgIHRoaXMuX2dldEFuaW1zKGNoYXJ0KS5saXN0ZW5lcnNbZXZlbnRdLnB1c2goY2IpO1xuICAgIH1cbiBhZGQoY2hhcnQsIGl0ZW1zKSB7XG4gICAgICAgIGlmICghaXRlbXMgfHwgIWl0ZW1zLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2dldEFuaW1zKGNoYXJ0KS5pdGVtcy5wdXNoKC4uLml0ZW1zKTtcbiAgICB9XG4gaGFzKGNoYXJ0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRBbmltcyhjaGFydCkuaXRlbXMubGVuZ3RoID4gMDtcbiAgICB9XG4gc3RhcnQoY2hhcnQpIHtcbiAgICAgICAgY29uc3QgYW5pbXMgPSB0aGlzLl9jaGFydHMuZ2V0KGNoYXJ0KTtcbiAgICAgICAgaWYgKCFhbmltcykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGFuaW1zLnJ1bm5pbmcgPSB0cnVlO1xuICAgICAgICBhbmltcy5zdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgIGFuaW1zLmR1cmF0aW9uID0gYW5pbXMuaXRlbXMucmVkdWNlKChhY2MsIGN1cik9Pk1hdGgubWF4KGFjYywgY3VyLl9kdXJhdGlvbiksIDApO1xuICAgICAgICB0aGlzLl9yZWZyZXNoKCk7XG4gICAgfVxuICAgIHJ1bm5pbmcoY2hhcnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9ydW5uaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYW5pbXMgPSB0aGlzLl9jaGFydHMuZ2V0KGNoYXJ0KTtcbiAgICAgICAgaWYgKCFhbmltcyB8fCAhYW5pbXMucnVubmluZyB8fCAhYW5pbXMuaXRlbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuIHN0b3AoY2hhcnQpIHtcbiAgICAgICAgY29uc3QgYW5pbXMgPSB0aGlzLl9jaGFydHMuZ2V0KGNoYXJ0KTtcbiAgICAgICAgaWYgKCFhbmltcyB8fCAhYW5pbXMuaXRlbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXRlbXMgPSBhbmltcy5pdGVtcztcbiAgICAgICAgbGV0IGkgPSBpdGVtcy5sZW5ndGggLSAxO1xuICAgICAgICBmb3IoOyBpID49IDA7IC0taSl7XG4gICAgICAgICAgICBpdGVtc1tpXS5jYW5jZWwoKTtcbiAgICAgICAgfVxuICAgICAgICBhbmltcy5pdGVtcyA9IFtdO1xuICAgICAgICB0aGlzLl9ub3RpZnkoY2hhcnQsIGFuaW1zLCBEYXRlLm5vdygpLCAnY29tcGxldGUnKTtcbiAgICB9XG4gcmVtb3ZlKGNoYXJ0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jaGFydHMuZGVsZXRlKGNoYXJ0KTtcbiAgICB9XG59XG52YXIgYW5pbWF0b3IgPSAvKiAjX19QVVJFX18gKi8gbmV3IEFuaW1hdG9yKCk7XG5cbmNvbnN0IHRyYW5zcGFyZW50ID0gJ3RyYW5zcGFyZW50JztcbmNvbnN0IGludGVycG9sYXRvcnMgPSB7XG4gICAgYm9vbGVhbiAoZnJvbSwgdG8sIGZhY3Rvcikge1xuICAgICAgICByZXR1cm4gZmFjdG9yID4gMC41ID8gdG8gOiBmcm9tO1xuICAgIH0sXG4gY29sb3IgKGZyb20sIHRvLCBmYWN0b3IpIHtcbiAgICAgICAgY29uc3QgYzAgPSBjb2xvcihmcm9tIHx8IHRyYW5zcGFyZW50KTtcbiAgICAgICAgY29uc3QgYzEgPSBjMC52YWxpZCAmJiBjb2xvcih0byB8fCB0cmFuc3BhcmVudCk7XG4gICAgICAgIHJldHVybiBjMSAmJiBjMS52YWxpZCA/IGMxLm1peChjMCwgZmFjdG9yKS5oZXhTdHJpbmcoKSA6IHRvO1xuICAgIH0sXG4gICAgbnVtYmVyIChmcm9tLCB0bywgZmFjdG9yKSB7XG4gICAgICAgIHJldHVybiBmcm9tICsgKHRvIC0gZnJvbSkgKiBmYWN0b3I7XG4gICAgfVxufTtcbmNsYXNzIEFuaW1hdGlvbiB7XG4gICAgY29uc3RydWN0b3IoY2ZnLCB0YXJnZXQsIHByb3AsIHRvKXtcbiAgICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gdGFyZ2V0W3Byb3BdO1xuICAgICAgICB0byA9IHJlc29sdmUoW1xuICAgICAgICAgICAgY2ZnLnRvLFxuICAgICAgICAgICAgdG8sXG4gICAgICAgICAgICBjdXJyZW50VmFsdWUsXG4gICAgICAgICAgICBjZmcuZnJvbVxuICAgICAgICBdKTtcbiAgICAgICAgY29uc3QgZnJvbSA9IHJlc29sdmUoW1xuICAgICAgICAgICAgY2ZnLmZyb20sXG4gICAgICAgICAgICBjdXJyZW50VmFsdWUsXG4gICAgICAgICAgICB0b1xuICAgICAgICBdKTtcbiAgICAgICAgdGhpcy5fYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fZm4gPSBjZmcuZm4gfHwgaW50ZXJwb2xhdG9yc1tjZmcudHlwZSB8fCB0eXBlb2YgZnJvbV07XG4gICAgICAgIHRoaXMuX2Vhc2luZyA9IGVmZmVjdHNbY2ZnLmVhc2luZ10gfHwgZWZmZWN0cy5saW5lYXI7XG4gICAgICAgIHRoaXMuX3N0YXJ0ID0gTWF0aC5mbG9vcihEYXRlLm5vdygpICsgKGNmZy5kZWxheSB8fCAwKSk7XG4gICAgICAgIHRoaXMuX2R1cmF0aW9uID0gdGhpcy5fdG90YWwgPSBNYXRoLmZsb29yKGNmZy5kdXJhdGlvbik7XG4gICAgICAgIHRoaXMuX2xvb3AgPSAhIWNmZy5sb29wO1xuICAgICAgICB0aGlzLl90YXJnZXQgPSB0YXJnZXQ7XG4gICAgICAgIHRoaXMuX3Byb3AgPSBwcm9wO1xuICAgICAgICB0aGlzLl9mcm9tID0gZnJvbTtcbiAgICAgICAgdGhpcy5fdG8gPSB0bztcbiAgICAgICAgdGhpcy5fcHJvbWlzZXMgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGFjdGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZTtcbiAgICB9XG4gICAgdXBkYXRlKGNmZywgdG8sIGRhdGUpIHtcbiAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZSkge1xuICAgICAgICAgICAgdGhpcy5fbm90aWZ5KGZhbHNlKTtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHRoaXMuX3RhcmdldFt0aGlzLl9wcm9wXTtcbiAgICAgICAgICAgIGNvbnN0IGVsYXBzZWQgPSBkYXRlIC0gdGhpcy5fc3RhcnQ7XG4gICAgICAgICAgICBjb25zdCByZW1haW4gPSB0aGlzLl9kdXJhdGlvbiAtIGVsYXBzZWQ7XG4gICAgICAgICAgICB0aGlzLl9zdGFydCA9IGRhdGU7XG4gICAgICAgICAgICB0aGlzLl9kdXJhdGlvbiA9IE1hdGguZmxvb3IoTWF0aC5tYXgocmVtYWluLCBjZmcuZHVyYXRpb24pKTtcbiAgICAgICAgICAgIHRoaXMuX3RvdGFsICs9IGVsYXBzZWQ7XG4gICAgICAgICAgICB0aGlzLl9sb29wID0gISFjZmcubG9vcDtcbiAgICAgICAgICAgIHRoaXMuX3RvID0gcmVzb2x2ZShbXG4gICAgICAgICAgICAgICAgY2ZnLnRvLFxuICAgICAgICAgICAgICAgIHRvLFxuICAgICAgICAgICAgICAgIGN1cnJlbnRWYWx1ZSxcbiAgICAgICAgICAgICAgICBjZmcuZnJvbVxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICB0aGlzLl9mcm9tID0gcmVzb2x2ZShbXG4gICAgICAgICAgICAgICAgY2ZnLmZyb20sXG4gICAgICAgICAgICAgICAgY3VycmVudFZhbHVlLFxuICAgICAgICAgICAgICAgIHRvXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjYW5jZWwoKSB7XG4gICAgICAgIGlmICh0aGlzLl9hY3RpdmUpIHtcbiAgICAgICAgICAgIHRoaXMudGljayhEYXRlLm5vdygpKTtcbiAgICAgICAgICAgIHRoaXMuX2FjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5fbm90aWZ5KGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB0aWNrKGRhdGUpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZCA9IGRhdGUgLSB0aGlzLl9zdGFydDtcbiAgICAgICAgY29uc3QgZHVyYXRpb24gPSB0aGlzLl9kdXJhdGlvbjtcbiAgICAgICAgY29uc3QgcHJvcCA9IHRoaXMuX3Byb3A7XG4gICAgICAgIGNvbnN0IGZyb20gPSB0aGlzLl9mcm9tO1xuICAgICAgICBjb25zdCBsb29wID0gdGhpcy5fbG9vcDtcbiAgICAgICAgY29uc3QgdG8gPSB0aGlzLl90bztcbiAgICAgICAgbGV0IGZhY3RvcjtcbiAgICAgICAgdGhpcy5fYWN0aXZlID0gZnJvbSAhPT0gdG8gJiYgKGxvb3AgfHwgZWxhcHNlZCA8IGR1cmF0aW9uKTtcbiAgICAgICAgaWYgKCF0aGlzLl9hY3RpdmUpIHtcbiAgICAgICAgICAgIHRoaXMuX3RhcmdldFtwcm9wXSA9IHRvO1xuICAgICAgICAgICAgdGhpcy5fbm90aWZ5KHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbGFwc2VkIDwgMCkge1xuICAgICAgICAgICAgdGhpcy5fdGFyZ2V0W3Byb3BdID0gZnJvbTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBmYWN0b3IgPSBlbGFwc2VkIC8gZHVyYXRpb24gJSAyO1xuICAgICAgICBmYWN0b3IgPSBsb29wICYmIGZhY3RvciA+IDEgPyAyIC0gZmFjdG9yIDogZmFjdG9yO1xuICAgICAgICBmYWN0b3IgPSB0aGlzLl9lYXNpbmcoTWF0aC5taW4oMSwgTWF0aC5tYXgoMCwgZmFjdG9yKSkpO1xuICAgICAgICB0aGlzLl90YXJnZXRbcHJvcF0gPSB0aGlzLl9mbihmcm9tLCB0bywgZmFjdG9yKTtcbiAgICB9XG4gICAgd2FpdCgpIHtcbiAgICAgICAgY29uc3QgcHJvbWlzZXMgPSB0aGlzLl9wcm9taXNlcyB8fCAodGhpcy5fcHJvbWlzZXMgPSBbXSk7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzLCByZWopPT57XG4gICAgICAgICAgICBwcm9taXNlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICByZXMsXG4gICAgICAgICAgICAgICAgcmVqXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIF9ub3RpZnkocmVzb2x2ZWQpIHtcbiAgICAgICAgY29uc3QgbWV0aG9kID0gcmVzb2x2ZWQgPyAncmVzJyA6ICdyZWonO1xuICAgICAgICBjb25zdCBwcm9taXNlcyA9IHRoaXMuX3Byb21pc2VzIHx8IFtdO1xuICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgcHJvbWlzZXMubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgcHJvbWlzZXNbaV1bbWV0aG9kXSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5jbGFzcyBBbmltYXRpb25zIHtcbiAgICBjb25zdHJ1Y3RvcihjaGFydCwgY29uZmlnKXtcbiAgICAgICAgdGhpcy5fY2hhcnQgPSBjaGFydDtcbiAgICAgICAgdGhpcy5fcHJvcGVydGllcyA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5jb25maWd1cmUoY29uZmlnKTtcbiAgICB9XG4gICAgY29uZmlndXJlKGNvbmZpZykge1xuICAgICAgICBpZiAoIWlzT2JqZWN0KGNvbmZpZykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhbmltYXRpb25PcHRpb25zID0gT2JqZWN0LmtleXMoZGVmYXVsdHMuYW5pbWF0aW9uKTtcbiAgICAgICAgY29uc3QgYW5pbWF0ZWRQcm9wcyA9IHRoaXMuX3Byb3BlcnRpZXM7XG4gICAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGNvbmZpZykuZm9yRWFjaCgoa2V5KT0+e1xuICAgICAgICAgICAgY29uc3QgY2ZnID0gY29uZmlnW2tleV07XG4gICAgICAgICAgICBpZiAoIWlzT2JqZWN0KGNmZykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByZXNvbHZlZCA9IHt9O1xuICAgICAgICAgICAgZm9yIChjb25zdCBvcHRpb24gb2YgYW5pbWF0aW9uT3B0aW9ucyl7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZWRbb3B0aW9uXSA9IGNmZ1tvcHRpb25dO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgKGlzQXJyYXkoY2ZnLnByb3BlcnRpZXMpICYmIGNmZy5wcm9wZXJ0aWVzIHx8IFtcbiAgICAgICAgICAgICAgICBrZXlcbiAgICAgICAgICAgIF0pLmZvckVhY2goKHByb3ApPT57XG4gICAgICAgICAgICAgICAgaWYgKHByb3AgPT09IGtleSB8fCAhYW5pbWF0ZWRQcm9wcy5oYXMocHJvcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgYW5pbWF0ZWRQcm9wcy5zZXQocHJvcCwgcmVzb2x2ZWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gX2FuaW1hdGVPcHRpb25zKHRhcmdldCwgdmFsdWVzKSB7XG4gICAgICAgIGNvbnN0IG5ld09wdGlvbnMgPSB2YWx1ZXMub3B0aW9ucztcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHJlc29sdmVUYXJnZXRPcHRpb25zKHRhcmdldCwgbmV3T3B0aW9ucyk7XG4gICAgICAgIGlmICghb3B0aW9ucykge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFuaW1hdGlvbnMgPSB0aGlzLl9jcmVhdGVBbmltYXRpb25zKG9wdGlvbnMsIG5ld09wdGlvbnMpO1xuICAgICAgICBpZiAobmV3T3B0aW9ucy4kc2hhcmVkKSB7XG4gICAgICAgICAgICBhd2FpdEFsbCh0YXJnZXQub3B0aW9ucy4kYW5pbWF0aW9ucywgbmV3T3B0aW9ucykudGhlbigoKT0+e1xuICAgICAgICAgICAgICAgIHRhcmdldC5vcHRpb25zID0gbmV3T3B0aW9ucztcbiAgICAgICAgICAgIH0sICgpPT57XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYW5pbWF0aW9ucztcbiAgICB9XG4gX2NyZWF0ZUFuaW1hdGlvbnModGFyZ2V0LCB2YWx1ZXMpIHtcbiAgICAgICAgY29uc3QgYW5pbWF0ZWRQcm9wcyA9IHRoaXMuX3Byb3BlcnRpZXM7XG4gICAgICAgIGNvbnN0IGFuaW1hdGlvbnMgPSBbXTtcbiAgICAgICAgY29uc3QgcnVubmluZyA9IHRhcmdldC4kYW5pbWF0aW9ucyB8fCAodGFyZ2V0LiRhbmltYXRpb25zID0ge30pO1xuICAgICAgICBjb25zdCBwcm9wcyA9IE9iamVjdC5rZXlzKHZhbHVlcyk7XG4gICAgICAgIGNvbnN0IGRhdGUgPSBEYXRlLm5vdygpO1xuICAgICAgICBsZXQgaTtcbiAgICAgICAgZm9yKGkgPSBwcm9wcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSl7XG4gICAgICAgICAgICBjb25zdCBwcm9wID0gcHJvcHNbaV07XG4gICAgICAgICAgICBpZiAocHJvcC5jaGFyQXQoMCkgPT09ICckJykge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHByb3AgPT09ICdvcHRpb25zJykge1xuICAgICAgICAgICAgICAgIGFuaW1hdGlvbnMucHVzaCguLi50aGlzLl9hbmltYXRlT3B0aW9ucyh0YXJnZXQsIHZhbHVlcykpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB2YWx1ZXNbcHJvcF07XG4gICAgICAgICAgICBsZXQgYW5pbWF0aW9uID0gcnVubmluZ1twcm9wXTtcbiAgICAgICAgICAgIGNvbnN0IGNmZyA9IGFuaW1hdGVkUHJvcHMuZ2V0KHByb3ApO1xuICAgICAgICAgICAgaWYgKGFuaW1hdGlvbikge1xuICAgICAgICAgICAgICAgIGlmIChjZmcgJiYgYW5pbWF0aW9uLmFjdGl2ZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbi51cGRhdGUoY2ZnLCB2YWx1ZSwgZGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbi5jYW5jZWwoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWNmZyB8fCAhY2ZnLmR1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0W3Byb3BdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBydW5uaW5nW3Byb3BdID0gYW5pbWF0aW9uID0gbmV3IEFuaW1hdGlvbihjZmcsIHRhcmdldCwgcHJvcCwgdmFsdWUpO1xuICAgICAgICAgICAgYW5pbWF0aW9ucy5wdXNoKGFuaW1hdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFuaW1hdGlvbnM7XG4gICAgfVxuIHVwZGF0ZSh0YXJnZXQsIHZhbHVlcykge1xuICAgICAgICBpZiAodGhpcy5fcHJvcGVydGllcy5zaXplID09PSAwKSB7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHRhcmdldCwgdmFsdWVzKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhbmltYXRpb25zID0gdGhpcy5fY3JlYXRlQW5pbWF0aW9ucyh0YXJnZXQsIHZhbHVlcyk7XG4gICAgICAgIGlmIChhbmltYXRpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgYW5pbWF0b3IuYWRkKHRoaXMuX2NoYXJ0LCBhbmltYXRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gYXdhaXRBbGwoYW5pbWF0aW9ucywgcHJvcGVydGllcykge1xuICAgIGNvbnN0IHJ1bm5pbmcgPSBbXTtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMocHJvcGVydGllcyk7XG4gICAgZm9yKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspe1xuICAgICAgICBjb25zdCBhbmltID0gYW5pbWF0aW9uc1trZXlzW2ldXTtcbiAgICAgICAgaWYgKGFuaW0gJiYgYW5pbS5hY3RpdmUoKSkge1xuICAgICAgICAgICAgcnVubmluZy5wdXNoKGFuaW0ud2FpdCgpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5hbGwocnVubmluZyk7XG59XG5mdW5jdGlvbiByZXNvbHZlVGFyZ2V0T3B0aW9ucyh0YXJnZXQsIG5ld09wdGlvbnMpIHtcbiAgICBpZiAoIW5ld09wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgb3B0aW9ucyA9IHRhcmdldC5vcHRpb25zO1xuICAgIGlmICghb3B0aW9ucykge1xuICAgICAgICB0YXJnZXQub3B0aW9ucyA9IG5ld09wdGlvbnM7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuJHNoYXJlZCkge1xuICAgICAgICB0YXJnZXQub3B0aW9ucyA9IG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLCB7XG4gICAgICAgICAgICAkc2hhcmVkOiBmYWxzZSxcbiAgICAgICAgICAgICRhbmltYXRpb25zOiB7fVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIG9wdGlvbnM7XG59XG5cbmZ1bmN0aW9uIHNjYWxlQ2xpcChzY2FsZSwgYWxsb3dlZE92ZXJmbG93KSB7XG4gICAgY29uc3Qgb3B0cyA9IHNjYWxlICYmIHNjYWxlLm9wdGlvbnMgfHwge307XG4gICAgY29uc3QgcmV2ZXJzZSA9IG9wdHMucmV2ZXJzZTtcbiAgICBjb25zdCBtaW4gPSBvcHRzLm1pbiA9PT0gdW5kZWZpbmVkID8gYWxsb3dlZE92ZXJmbG93IDogMDtcbiAgICBjb25zdCBtYXggPSBvcHRzLm1heCA9PT0gdW5kZWZpbmVkID8gYWxsb3dlZE92ZXJmbG93IDogMDtcbiAgICByZXR1cm4ge1xuICAgICAgICBzdGFydDogcmV2ZXJzZSA/IG1heCA6IG1pbixcbiAgICAgICAgZW5kOiByZXZlcnNlID8gbWluIDogbWF4XG4gICAgfTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDbGlwKHhTY2FsZSwgeVNjYWxlLCBhbGxvd2VkT3ZlcmZsb3cpIHtcbiAgICBpZiAoYWxsb3dlZE92ZXJmbG93ID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHggPSBzY2FsZUNsaXAoeFNjYWxlLCBhbGxvd2VkT3ZlcmZsb3cpO1xuICAgIGNvbnN0IHkgPSBzY2FsZUNsaXAoeVNjYWxlLCBhbGxvd2VkT3ZlcmZsb3cpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHRvcDogeS5lbmQsXG4gICAgICAgIHJpZ2h0OiB4LmVuZCxcbiAgICAgICAgYm90dG9tOiB5LnN0YXJ0LFxuICAgICAgICBsZWZ0OiB4LnN0YXJ0XG4gICAgfTtcbn1cbmZ1bmN0aW9uIHRvQ2xpcCh2YWx1ZSkge1xuICAgIGxldCB0LCByLCBiLCBsO1xuICAgIGlmIChpc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgdCA9IHZhbHVlLnRvcDtcbiAgICAgICAgciA9IHZhbHVlLnJpZ2h0O1xuICAgICAgICBiID0gdmFsdWUuYm90dG9tO1xuICAgICAgICBsID0gdmFsdWUubGVmdDtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0ID0gciA9IGIgPSBsID0gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHRvcDogdCxcbiAgICAgICAgcmlnaHQ6IHIsXG4gICAgICAgIGJvdHRvbTogYixcbiAgICAgICAgbGVmdDogbCxcbiAgICAgICAgZGlzYWJsZWQ6IHZhbHVlID09PSBmYWxzZVxuICAgIH07XG59XG5mdW5jdGlvbiBnZXRTb3J0ZWREYXRhc2V0SW5kaWNlcyhjaGFydCwgZmlsdGVyVmlzaWJsZSkge1xuICAgIGNvbnN0IGtleXMgPSBbXTtcbiAgICBjb25zdCBtZXRhc2V0cyA9IGNoYXJ0Ll9nZXRTb3J0ZWREYXRhc2V0TWV0YXMoZmlsdGVyVmlzaWJsZSk7XG4gICAgbGV0IGksIGlsZW47XG4gICAgZm9yKGkgPSAwLCBpbGVuID0gbWV0YXNldHMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKXtcbiAgICAgICAga2V5cy5wdXNoKG1ldGFzZXRzW2ldLmluZGV4KTtcbiAgICB9XG4gICAgcmV0dXJuIGtleXM7XG59XG5mdW5jdGlvbiBhcHBseVN0YWNrKHN0YWNrLCB2YWx1ZSwgZHNJbmRleCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3Qga2V5cyA9IHN0YWNrLmtleXM7XG4gICAgY29uc3Qgc2luZ2xlTW9kZSA9IG9wdGlvbnMubW9kZSA9PT0gJ3NpbmdsZSc7XG4gICAgbGV0IGksIGlsZW4sIGRhdGFzZXRJbmRleCwgb3RoZXJWYWx1ZTtcbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IoaSA9IDAsIGlsZW4gPSBrZXlzLmxlbmd0aDsgaSA8IGlsZW47ICsraSl7XG4gICAgICAgIGRhdGFzZXRJbmRleCA9ICtrZXlzW2ldO1xuICAgICAgICBpZiAoZGF0YXNldEluZGV4ID09PSBkc0luZGV4KSB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5hbGwpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIG90aGVyVmFsdWUgPSBzdGFjay52YWx1ZXNbZGF0YXNldEluZGV4XTtcbiAgICAgICAgaWYgKGlzTnVtYmVyRmluaXRlKG90aGVyVmFsdWUpICYmIChzaW5nbGVNb2RlIHx8IHZhbHVlID09PSAwIHx8IHNpZ24odmFsdWUpID09PSBzaWduKG90aGVyVmFsdWUpKSkge1xuICAgICAgICAgICAgdmFsdWUgKz0gb3RoZXJWYWx1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59XG5mdW5jdGlvbiBjb252ZXJ0T2JqZWN0RGF0YVRvQXJyYXkoZGF0YSkge1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhkYXRhKTtcbiAgICBjb25zdCBhZGF0YSA9IG5ldyBBcnJheShrZXlzLmxlbmd0aCk7XG4gICAgbGV0IGksIGlsZW4sIGtleTtcbiAgICBmb3IoaSA9IDAsIGlsZW4gPSBrZXlzLmxlbmd0aDsgaSA8IGlsZW47ICsraSl7XG4gICAgICAgIGtleSA9IGtleXNbaV07XG4gICAgICAgIGFkYXRhW2ldID0ge1xuICAgICAgICAgICAgeDoga2V5LFxuICAgICAgICAgICAgeTogZGF0YVtrZXldXG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBhZGF0YTtcbn1cbmZ1bmN0aW9uIGlzU3RhY2tlZChzY2FsZSwgbWV0YSkge1xuICAgIGNvbnN0IHN0YWNrZWQgPSBzY2FsZSAmJiBzY2FsZS5vcHRpb25zLnN0YWNrZWQ7XG4gICAgcmV0dXJuIHN0YWNrZWQgfHwgc3RhY2tlZCA9PT0gdW5kZWZpbmVkICYmIG1ldGEuc3RhY2sgIT09IHVuZGVmaW5lZDtcbn1cbmZ1bmN0aW9uIGdldFN0YWNrS2V5KGluZGV4U2NhbGUsIHZhbHVlU2NhbGUsIG1ldGEpIHtcbiAgICByZXR1cm4gYCR7aW5kZXhTY2FsZS5pZH0uJHt2YWx1ZVNjYWxlLmlkfS4ke21ldGEuc3RhY2sgfHwgbWV0YS50eXBlfWA7XG59XG5mdW5jdGlvbiBnZXRVc2VyQm91bmRzKHNjYWxlKSB7XG4gICAgY29uc3QgeyBtaW4gLCBtYXggLCBtaW5EZWZpbmVkICwgbWF4RGVmaW5lZCAgfSA9IHNjYWxlLmdldFVzZXJCb3VuZHMoKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBtaW46IG1pbkRlZmluZWQgPyBtaW4gOiBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFksXG4gICAgICAgIG1heDogbWF4RGVmaW5lZCA/IG1heCA6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWVxuICAgIH07XG59XG5mdW5jdGlvbiBnZXRPckNyZWF0ZVN0YWNrKHN0YWNrcywgc3RhY2tLZXksIGluZGV4VmFsdWUpIHtcbiAgICBjb25zdCBzdWJTdGFjayA9IHN0YWNrc1tzdGFja0tleV0gfHwgKHN0YWNrc1tzdGFja0tleV0gPSB7fSk7XG4gICAgcmV0dXJuIHN1YlN0YWNrW2luZGV4VmFsdWVdIHx8IChzdWJTdGFja1tpbmRleFZhbHVlXSA9IHt9KTtcbn1cbmZ1bmN0aW9uIGdldExhc3RJbmRleEluU3RhY2soc3RhY2ssIHZTY2FsZSwgcG9zaXRpdmUsIHR5cGUpIHtcbiAgICBmb3IgKGNvbnN0IG1ldGEgb2YgdlNjYWxlLmdldE1hdGNoaW5nVmlzaWJsZU1ldGFzKHR5cGUpLnJldmVyc2UoKSl7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gc3RhY2tbbWV0YS5pbmRleF07XG4gICAgICAgIGlmIChwb3NpdGl2ZSAmJiB2YWx1ZSA+IDAgfHwgIXBvc2l0aXZlICYmIHZhbHVlIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIG1ldGEuaW5kZXg7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiB1cGRhdGVTdGFja3MoY29udHJvbGxlciwgcGFyc2VkKSB7XG4gICAgY29uc3QgeyBjaGFydCAsIF9jYWNoZWRNZXRhOiBtZXRhICB9ID0gY29udHJvbGxlcjtcbiAgICBjb25zdCBzdGFja3MgPSBjaGFydC5fc3RhY2tzIHx8IChjaGFydC5fc3RhY2tzID0ge30pO1xuICAgIGNvbnN0IHsgaVNjYWxlICwgdlNjYWxlICwgaW5kZXg6IGRhdGFzZXRJbmRleCAgfSA9IG1ldGE7XG4gICAgY29uc3QgaUF4aXMgPSBpU2NhbGUuYXhpcztcbiAgICBjb25zdCB2QXhpcyA9IHZTY2FsZS5heGlzO1xuICAgIGNvbnN0IGtleSA9IGdldFN0YWNrS2V5KGlTY2FsZSwgdlNjYWxlLCBtZXRhKTtcbiAgICBjb25zdCBpbGVuID0gcGFyc2VkLmxlbmd0aDtcbiAgICBsZXQgc3RhY2s7XG4gICAgZm9yKGxldCBpID0gMDsgaSA8IGlsZW47ICsraSl7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSBwYXJzZWRbaV07XG4gICAgICAgIGNvbnN0IHsgW2lBeGlzXTogaW5kZXggLCBbdkF4aXNdOiB2YWx1ZSAgfSA9IGl0ZW07XG4gICAgICAgIGNvbnN0IGl0ZW1TdGFja3MgPSBpdGVtLl9zdGFja3MgfHwgKGl0ZW0uX3N0YWNrcyA9IHt9KTtcbiAgICAgICAgc3RhY2sgPSBpdGVtU3RhY2tzW3ZBeGlzXSA9IGdldE9yQ3JlYXRlU3RhY2soc3RhY2tzLCBrZXksIGluZGV4KTtcbiAgICAgICAgc3RhY2tbZGF0YXNldEluZGV4XSA9IHZhbHVlO1xuICAgICAgICBzdGFjay5fdG9wID0gZ2V0TGFzdEluZGV4SW5TdGFjayhzdGFjaywgdlNjYWxlLCB0cnVlLCBtZXRhLnR5cGUpO1xuICAgICAgICBzdGFjay5fYm90dG9tID0gZ2V0TGFzdEluZGV4SW5TdGFjayhzdGFjaywgdlNjYWxlLCBmYWxzZSwgbWV0YS50eXBlKTtcbiAgICAgICAgY29uc3QgdmlzdWFsVmFsdWVzID0gc3RhY2suX3Zpc3VhbFZhbHVlcyB8fCAoc3RhY2suX3Zpc3VhbFZhbHVlcyA9IHt9KTtcbiAgICAgICAgdmlzdWFsVmFsdWVzW2RhdGFzZXRJbmRleF0gPSB2YWx1ZTtcbiAgICB9XG59XG5mdW5jdGlvbiBnZXRGaXJzdFNjYWxlSWQoY2hhcnQsIGF4aXMpIHtcbiAgICBjb25zdCBzY2FsZXMgPSBjaGFydC5zY2FsZXM7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHNjYWxlcykuZmlsdGVyKChrZXkpPT5zY2FsZXNba2V5XS5heGlzID09PSBheGlzKS5zaGlmdCgpO1xufVxuZnVuY3Rpb24gY3JlYXRlRGF0YXNldENvbnRleHQocGFyZW50LCBpbmRleCkge1xuICAgIHJldHVybiBjcmVhdGVDb250ZXh0KHBhcmVudCwge1xuICAgICAgICBhY3RpdmU6IGZhbHNlLFxuICAgICAgICBkYXRhc2V0OiB1bmRlZmluZWQsXG4gICAgICAgIGRhdGFzZXRJbmRleDogaW5kZXgsXG4gICAgICAgIGluZGV4LFxuICAgICAgICBtb2RlOiAnZGVmYXVsdCcsXG4gICAgICAgIHR5cGU6ICdkYXRhc2V0J1xuICAgIH0pO1xufVxuZnVuY3Rpb24gY3JlYXRlRGF0YUNvbnRleHQocGFyZW50LCBpbmRleCwgZWxlbWVudCkge1xuICAgIHJldHVybiBjcmVhdGVDb250ZXh0KHBhcmVudCwge1xuICAgICAgICBhY3RpdmU6IGZhbHNlLFxuICAgICAgICBkYXRhSW5kZXg6IGluZGV4LFxuICAgICAgICBwYXJzZWQ6IHVuZGVmaW5lZCxcbiAgICAgICAgcmF3OiB1bmRlZmluZWQsXG4gICAgICAgIGVsZW1lbnQsXG4gICAgICAgIGluZGV4LFxuICAgICAgICBtb2RlOiAnZGVmYXVsdCcsXG4gICAgICAgIHR5cGU6ICdkYXRhJ1xuICAgIH0pO1xufVxuZnVuY3Rpb24gY2xlYXJTdGFja3MobWV0YSwgaXRlbXMpIHtcbiAgICBjb25zdCBkYXRhc2V0SW5kZXggPSBtZXRhLmNvbnRyb2xsZXIuaW5kZXg7XG4gICAgY29uc3QgYXhpcyA9IG1ldGEudlNjYWxlICYmIG1ldGEudlNjYWxlLmF4aXM7XG4gICAgaWYgKCFheGlzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaXRlbXMgPSBpdGVtcyB8fCBtZXRhLl9wYXJzZWQ7XG4gICAgZm9yIChjb25zdCBwYXJzZWQgb2YgaXRlbXMpe1xuICAgICAgICBjb25zdCBzdGFja3MgPSBwYXJzZWQuX3N0YWNrcztcbiAgICAgICAgaWYgKCFzdGFja3MgfHwgc3RhY2tzW2F4aXNdID09PSB1bmRlZmluZWQgfHwgc3RhY2tzW2F4aXNdW2RhdGFzZXRJbmRleF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGRlbGV0ZSBzdGFja3NbYXhpc11bZGF0YXNldEluZGV4XTtcbiAgICAgICAgaWYgKHN0YWNrc1theGlzXS5fdmlzdWFsVmFsdWVzICE9PSB1bmRlZmluZWQgJiYgc3RhY2tzW2F4aXNdLl92aXN1YWxWYWx1ZXNbZGF0YXNldEluZGV4XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBkZWxldGUgc3RhY2tzW2F4aXNdLl92aXN1YWxWYWx1ZXNbZGF0YXNldEluZGV4XTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmNvbnN0IGlzRGlyZWN0VXBkYXRlTW9kZSA9IChtb2RlKT0+bW9kZSA9PT0gJ3Jlc2V0JyB8fCBtb2RlID09PSAnbm9uZSc7XG5jb25zdCBjbG9uZUlmTm90U2hhcmVkID0gKGNhY2hlZCwgc2hhcmVkKT0+c2hhcmVkID8gY2FjaGVkIDogT2JqZWN0LmFzc2lnbih7fSwgY2FjaGVkKTtcbmNvbnN0IGNyZWF0ZVN0YWNrID0gKGNhblN0YWNrLCBtZXRhLCBjaGFydCk9PmNhblN0YWNrICYmICFtZXRhLmhpZGRlbiAmJiBtZXRhLl9zdGFja2VkICYmIHtcbiAgICAgICAga2V5czogZ2V0U29ydGVkRGF0YXNldEluZGljZXMoY2hhcnQsIHRydWUpLFxuICAgICAgICB2YWx1ZXM6IG51bGxcbiAgICB9O1xuY2xhc3MgRGF0YXNldENvbnRyb2xsZXIge1xuIHN0YXRpYyBkZWZhdWx0cyA9IHt9O1xuIHN0YXRpYyBkYXRhc2V0RWxlbWVudFR5cGUgPSBudWxsO1xuIHN0YXRpYyBkYXRhRWxlbWVudFR5cGUgPSBudWxsO1xuIGNvbnN0cnVjdG9yKGNoYXJ0LCBkYXRhc2V0SW5kZXgpe1xuICAgICAgICB0aGlzLmNoYXJ0ID0gY2hhcnQ7XG4gICAgICAgIHRoaXMuX2N0eCA9IGNoYXJ0LmN0eDtcbiAgICAgICAgdGhpcy5pbmRleCA9IGRhdGFzZXRJbmRleDtcbiAgICAgICAgdGhpcy5fY2FjaGVkRGF0YU9wdHMgPSB7fTtcbiAgICAgICAgdGhpcy5fY2FjaGVkTWV0YSA9IHRoaXMuZ2V0TWV0YSgpO1xuICAgICAgICB0aGlzLl90eXBlID0gdGhpcy5fY2FjaGVkTWV0YS50eXBlO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgICAgICB0aGlzLl9wYXJzaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2RhdGEgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX29iamVjdERhdGEgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX3NoYXJlZE9wdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX2RyYXdTdGFydCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fZHJhd0NvdW50ID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmVuYWJsZU9wdGlvblNoYXJpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zdXBwb3J0c0RlY2ltYXRpb24gPSBmYWxzZTtcbiAgICAgICAgdGhpcy4kY29udGV4dCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fc3luY0xpc3QgPSBbXTtcbiAgICAgICAgdGhpcy5kYXRhc2V0RWxlbWVudFR5cGUgPSBuZXcudGFyZ2V0LmRhdGFzZXRFbGVtZW50VHlwZTtcbiAgICAgICAgdGhpcy5kYXRhRWxlbWVudFR5cGUgPSBuZXcudGFyZ2V0LmRhdGFFbGVtZW50VHlwZTtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplKCk7XG4gICAgfVxuICAgIGluaXRpYWxpemUoKSB7XG4gICAgICAgIGNvbnN0IG1ldGEgPSB0aGlzLl9jYWNoZWRNZXRhO1xuICAgICAgICB0aGlzLmNvbmZpZ3VyZSgpO1xuICAgICAgICB0aGlzLmxpbmtTY2FsZXMoKTtcbiAgICAgICAgbWV0YS5fc3RhY2tlZCA9IGlzU3RhY2tlZChtZXRhLnZTY2FsZSwgbWV0YSk7XG4gICAgICAgIHRoaXMuYWRkRWxlbWVudHMoKTtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5maWxsICYmICF0aGlzLmNoYXJ0LmlzUGx1Z2luRW5hYmxlZCgnZmlsbGVyJykpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcIlRyaWVkIHRvIHVzZSB0aGUgJ2ZpbGwnIG9wdGlvbiB3aXRob3V0IHRoZSAnRmlsbGVyJyBwbHVnaW4gZW5hYmxlZC4gUGxlYXNlIGltcG9ydCBhbmQgcmVnaXN0ZXIgdGhlICdGaWxsZXInIHBsdWdpbiBhbmQgbWFrZSBzdXJlIGl0IGlzIG5vdCBkaXNhYmxlZCBpbiB0aGUgb3B0aW9uc1wiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB1cGRhdGVJbmRleChkYXRhc2V0SW5kZXgpIHtcbiAgICAgICAgaWYgKHRoaXMuaW5kZXggIT09IGRhdGFzZXRJbmRleCkge1xuICAgICAgICAgICAgY2xlYXJTdGFja3ModGhpcy5fY2FjaGVkTWV0YSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbmRleCA9IGRhdGFzZXRJbmRleDtcbiAgICB9XG4gICAgbGlua1NjYWxlcygpIHtcbiAgICAgICAgY29uc3QgY2hhcnQgPSB0aGlzLmNoYXJ0O1xuICAgICAgICBjb25zdCBtZXRhID0gdGhpcy5fY2FjaGVkTWV0YTtcbiAgICAgICAgY29uc3QgZGF0YXNldCA9IHRoaXMuZ2V0RGF0YXNldCgpO1xuICAgICAgICBjb25zdCBjaG9vc2VJZCA9IChheGlzLCB4LCB5LCByKT0+YXhpcyA9PT0gJ3gnID8geCA6IGF4aXMgPT09ICdyJyA/IHIgOiB5O1xuICAgICAgICBjb25zdCB4aWQgPSBtZXRhLnhBeGlzSUQgPSB2YWx1ZU9yRGVmYXVsdChkYXRhc2V0LnhBeGlzSUQsIGdldEZpcnN0U2NhbGVJZChjaGFydCwgJ3gnKSk7XG4gICAgICAgIGNvbnN0IHlpZCA9IG1ldGEueUF4aXNJRCA9IHZhbHVlT3JEZWZhdWx0KGRhdGFzZXQueUF4aXNJRCwgZ2V0Rmlyc3RTY2FsZUlkKGNoYXJ0LCAneScpKTtcbiAgICAgICAgY29uc3QgcmlkID0gbWV0YS5yQXhpc0lEID0gdmFsdWVPckRlZmF1bHQoZGF0YXNldC5yQXhpc0lELCBnZXRGaXJzdFNjYWxlSWQoY2hhcnQsICdyJykpO1xuICAgICAgICBjb25zdCBpbmRleEF4aXMgPSBtZXRhLmluZGV4QXhpcztcbiAgICAgICAgY29uc3QgaWlkID0gbWV0YS5pQXhpc0lEID0gY2hvb3NlSWQoaW5kZXhBeGlzLCB4aWQsIHlpZCwgcmlkKTtcbiAgICAgICAgY29uc3QgdmlkID0gbWV0YS52QXhpc0lEID0gY2hvb3NlSWQoaW5kZXhBeGlzLCB5aWQsIHhpZCwgcmlkKTtcbiAgICAgICAgbWV0YS54U2NhbGUgPSB0aGlzLmdldFNjYWxlRm9ySWQoeGlkKTtcbiAgICAgICAgbWV0YS55U2NhbGUgPSB0aGlzLmdldFNjYWxlRm9ySWQoeWlkKTtcbiAgICAgICAgbWV0YS5yU2NhbGUgPSB0aGlzLmdldFNjYWxlRm9ySWQocmlkKTtcbiAgICAgICAgbWV0YS5pU2NhbGUgPSB0aGlzLmdldFNjYWxlRm9ySWQoaWlkKTtcbiAgICAgICAgbWV0YS52U2NhbGUgPSB0aGlzLmdldFNjYWxlRm9ySWQodmlkKTtcbiAgICB9XG4gICAgZ2V0RGF0YXNldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hhcnQuZGF0YS5kYXRhc2V0c1t0aGlzLmluZGV4XTtcbiAgICB9XG4gICAgZ2V0TWV0YSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hhcnQuZ2V0RGF0YXNldE1ldGEodGhpcy5pbmRleCk7XG4gICAgfVxuIGdldFNjYWxlRm9ySWQoc2NhbGVJRCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jaGFydC5zY2FsZXNbc2NhbGVJRF07XG4gICAgfVxuIF9nZXRPdGhlclNjYWxlKHNjYWxlKSB7XG4gICAgICAgIGNvbnN0IG1ldGEgPSB0aGlzLl9jYWNoZWRNZXRhO1xuICAgICAgICByZXR1cm4gc2NhbGUgPT09IG1ldGEuaVNjYWxlID8gbWV0YS52U2NhbGUgOiBtZXRhLmlTY2FsZTtcbiAgICB9XG4gICAgcmVzZXQoKSB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZSgncmVzZXQnKTtcbiAgICB9XG4gX2Rlc3Ryb3koKSB7XG4gICAgICAgIGNvbnN0IG1ldGEgPSB0aGlzLl9jYWNoZWRNZXRhO1xuICAgICAgICBpZiAodGhpcy5fZGF0YSkge1xuICAgICAgICAgICAgdW5saXN0ZW5BcnJheUV2ZW50cyh0aGlzLl9kYXRhLCB0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWV0YS5fc3RhY2tlZCkge1xuICAgICAgICAgICAgY2xlYXJTdGFja3MobWV0YSk7XG4gICAgICAgIH1cbiAgICB9XG4gX2RhdGFDaGVjaygpIHtcbiAgICAgICAgY29uc3QgZGF0YXNldCA9IHRoaXMuZ2V0RGF0YXNldCgpO1xuICAgICAgICBjb25zdCBkYXRhID0gZGF0YXNldC5kYXRhIHx8IChkYXRhc2V0LmRhdGEgPSBbXSk7XG4gICAgICAgIGNvbnN0IF9kYXRhID0gdGhpcy5fZGF0YTtcbiAgICAgICAgaWYgKGlzT2JqZWN0KGRhdGEpKSB7XG4gICAgICAgICAgICB0aGlzLl9kYXRhID0gY29udmVydE9iamVjdERhdGFUb0FycmF5KGRhdGEpO1xuICAgICAgICB9IGVsc2UgaWYgKF9kYXRhICE9PSBkYXRhKSB7XG4gICAgICAgICAgICBpZiAoX2RhdGEpIHtcbiAgICAgICAgICAgICAgICB1bmxpc3RlbkFycmF5RXZlbnRzKF9kYXRhLCB0aGlzKTtcbiAgICAgICAgICAgICAgICBjb25zdCBtZXRhID0gdGhpcy5fY2FjaGVkTWV0YTtcbiAgICAgICAgICAgICAgICBjbGVhclN0YWNrcyhtZXRhKTtcbiAgICAgICAgICAgICAgICBtZXRhLl9wYXJzZWQgPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkYXRhICYmIE9iamVjdC5pc0V4dGVuc2libGUoZGF0YSkpIHtcbiAgICAgICAgICAgICAgICBsaXN0ZW5BcnJheUV2ZW50cyhkYXRhLCB0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3N5bmNMaXN0ID0gW107XG4gICAgICAgICAgICB0aGlzLl9kYXRhID0gZGF0YTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhZGRFbGVtZW50cygpIHtcbiAgICAgICAgY29uc3QgbWV0YSA9IHRoaXMuX2NhY2hlZE1ldGE7XG4gICAgICAgIHRoaXMuX2RhdGFDaGVjaygpO1xuICAgICAgICBpZiAodGhpcy5kYXRhc2V0RWxlbWVudFR5cGUpIHtcbiAgICAgICAgICAgIG1ldGEuZGF0YXNldCA9IG5ldyB0aGlzLmRhdGFzZXRFbGVtZW50VHlwZSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGJ1aWxkT3JVcGRhdGVFbGVtZW50cyhyZXNldE5ld0VsZW1lbnRzKSB7XG4gICAgICAgIGNvbnN0IG1ldGEgPSB0aGlzLl9jYWNoZWRNZXRhO1xuICAgICAgICBjb25zdCBkYXRhc2V0ID0gdGhpcy5nZXREYXRhc2V0KCk7XG4gICAgICAgIGxldCBzdGFja0NoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fZGF0YUNoZWNrKCk7XG4gICAgICAgIGNvbnN0IG9sZFN0YWNrZWQgPSBtZXRhLl9zdGFja2VkO1xuICAgICAgICBtZXRhLl9zdGFja2VkID0gaXNTdGFja2VkKG1ldGEudlNjYWxlLCBtZXRhKTtcbiAgICAgICAgaWYgKG1ldGEuc3RhY2sgIT09IGRhdGFzZXQuc3RhY2spIHtcbiAgICAgICAgICAgIHN0YWNrQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICBjbGVhclN0YWNrcyhtZXRhKTtcbiAgICAgICAgICAgIG1ldGEuc3RhY2sgPSBkYXRhc2V0LnN0YWNrO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3Jlc3luY0VsZW1lbnRzKHJlc2V0TmV3RWxlbWVudHMpO1xuICAgICAgICBpZiAoc3RhY2tDaGFuZ2VkIHx8IG9sZFN0YWNrZWQgIT09IG1ldGEuX3N0YWNrZWQpIHtcbiAgICAgICAgICAgIHVwZGF0ZVN0YWNrcyh0aGlzLCBtZXRhLl9wYXJzZWQpO1xuICAgICAgICB9XG4gICAgfVxuIGNvbmZpZ3VyZSgpIHtcbiAgICAgICAgY29uc3QgY29uZmlnID0gdGhpcy5jaGFydC5jb25maWc7XG4gICAgICAgIGNvbnN0IHNjb3BlS2V5cyA9IGNvbmZpZy5kYXRhc2V0U2NvcGVLZXlzKHRoaXMuX3R5cGUpO1xuICAgICAgICBjb25zdCBzY29wZXMgPSBjb25maWcuZ2V0T3B0aW9uU2NvcGVzKHRoaXMuZ2V0RGF0YXNldCgpLCBzY29wZUtleXMsIHRydWUpO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBjb25maWcuY3JlYXRlUmVzb2x2ZXIoc2NvcGVzLCB0aGlzLmdldENvbnRleHQoKSk7XG4gICAgICAgIHRoaXMuX3BhcnNpbmcgPSB0aGlzLm9wdGlvbnMucGFyc2luZztcbiAgICAgICAgdGhpcy5fY2FjaGVkRGF0YU9wdHMgPSB7fTtcbiAgICB9XG4gcGFyc2Uoc3RhcnQsIGNvdW50KSB7XG4gICAgICAgIGNvbnN0IHsgX2NhY2hlZE1ldGE6IG1ldGEgLCBfZGF0YTogZGF0YSAgfSA9IHRoaXM7XG4gICAgICAgIGNvbnN0IHsgaVNjYWxlICwgX3N0YWNrZWQgIH0gPSBtZXRhO1xuICAgICAgICBjb25zdCBpQXhpcyA9IGlTY2FsZS5heGlzO1xuICAgICAgICBsZXQgc29ydGVkID0gc3RhcnQgPT09IDAgJiYgY291bnQgPT09IGRhdGEubGVuZ3RoID8gdHJ1ZSA6IG1ldGEuX3NvcnRlZDtcbiAgICAgICAgbGV0IHByZXYgPSBzdGFydCA+IDAgJiYgbWV0YS5fcGFyc2VkW3N0YXJ0IC0gMV07XG4gICAgICAgIGxldCBpLCBjdXIsIHBhcnNlZDtcbiAgICAgICAgaWYgKHRoaXMuX3BhcnNpbmcgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBtZXRhLl9wYXJzZWQgPSBkYXRhO1xuICAgICAgICAgICAgbWV0YS5fc29ydGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHBhcnNlZCA9IGRhdGE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoaXNBcnJheShkYXRhW3N0YXJ0XSkpIHtcbiAgICAgICAgICAgICAgICBwYXJzZWQgPSB0aGlzLnBhcnNlQXJyYXlEYXRhKG1ldGEsIGRhdGEsIHN0YXJ0LCBjb3VudCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KGRhdGFbc3RhcnRdKSkge1xuICAgICAgICAgICAgICAgIHBhcnNlZCA9IHRoaXMucGFyc2VPYmplY3REYXRhKG1ldGEsIGRhdGEsIHN0YXJ0LCBjb3VudCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHBhcnNlZCA9IHRoaXMucGFyc2VQcmltaXRpdmVEYXRhKG1ldGEsIGRhdGEsIHN0YXJ0LCBjb3VudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBpc05vdEluT3JkZXJDb21wYXJlZFRvUHJldiA9ICgpPT5jdXJbaUF4aXNdID09PSBudWxsIHx8IHByZXYgJiYgY3VyW2lBeGlzXSA8IHByZXZbaUF4aXNdO1xuICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgY291bnQ7ICsraSl7XG4gICAgICAgICAgICAgICAgbWV0YS5fcGFyc2VkW2kgKyBzdGFydF0gPSBjdXIgPSBwYXJzZWRbaV07XG4gICAgICAgICAgICAgICAgaWYgKHNvcnRlZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNOb3RJbk9yZGVyQ29tcGFyZWRUb1ByZXYoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc29ydGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcHJldiA9IGN1cjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBtZXRhLl9zb3J0ZWQgPSBzb3J0ZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKF9zdGFja2VkKSB7XG4gICAgICAgICAgICB1cGRhdGVTdGFja3ModGhpcywgcGFyc2VkKTtcbiAgICAgICAgfVxuICAgIH1cbiBwYXJzZVByaW1pdGl2ZURhdGEobWV0YSwgZGF0YSwgc3RhcnQsIGNvdW50KSB7XG4gICAgICAgIGNvbnN0IHsgaVNjYWxlICwgdlNjYWxlICB9ID0gbWV0YTtcbiAgICAgICAgY29uc3QgaUF4aXMgPSBpU2NhbGUuYXhpcztcbiAgICAgICAgY29uc3QgdkF4aXMgPSB2U2NhbGUuYXhpcztcbiAgICAgICAgY29uc3QgbGFiZWxzID0gaVNjYWxlLmdldExhYmVscygpO1xuICAgICAgICBjb25zdCBzaW5nbGVTY2FsZSA9IGlTY2FsZSA9PT0gdlNjYWxlO1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBuZXcgQXJyYXkoY291bnQpO1xuICAgICAgICBsZXQgaSwgaWxlbiwgaW5kZXg7XG4gICAgICAgIGZvcihpID0gMCwgaWxlbiA9IGNvdW50OyBpIDwgaWxlbjsgKytpKXtcbiAgICAgICAgICAgIGluZGV4ID0gaSArIHN0YXJ0O1xuICAgICAgICAgICAgcGFyc2VkW2ldID0ge1xuICAgICAgICAgICAgICAgIFtpQXhpc106IHNpbmdsZVNjYWxlIHx8IGlTY2FsZS5wYXJzZShsYWJlbHNbaW5kZXhdLCBpbmRleCksXG4gICAgICAgICAgICAgICAgW3ZBeGlzXTogdlNjYWxlLnBhcnNlKGRhdGFbaW5kZXhdLCBpbmRleClcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcnNlZDtcbiAgICB9XG4gcGFyc2VBcnJheURhdGEobWV0YSwgZGF0YSwgc3RhcnQsIGNvdW50KSB7XG4gICAgICAgIGNvbnN0IHsgeFNjYWxlICwgeVNjYWxlICB9ID0gbWV0YTtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gbmV3IEFycmF5KGNvdW50KTtcbiAgICAgICAgbGV0IGksIGlsZW4sIGluZGV4LCBpdGVtO1xuICAgICAgICBmb3IoaSA9IDAsIGlsZW4gPSBjb3VudDsgaSA8IGlsZW47ICsraSl7XG4gICAgICAgICAgICBpbmRleCA9IGkgKyBzdGFydDtcbiAgICAgICAgICAgIGl0ZW0gPSBkYXRhW2luZGV4XTtcbiAgICAgICAgICAgIHBhcnNlZFtpXSA9IHtcbiAgICAgICAgICAgICAgICB4OiB4U2NhbGUucGFyc2UoaXRlbVswXSwgaW5kZXgpLFxuICAgICAgICAgICAgICAgIHk6IHlTY2FsZS5wYXJzZShpdGVtWzFdLCBpbmRleClcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcnNlZDtcbiAgICB9XG4gcGFyc2VPYmplY3REYXRhKG1ldGEsIGRhdGEsIHN0YXJ0LCBjb3VudCkge1xuICAgICAgICBjb25zdCB7IHhTY2FsZSAsIHlTY2FsZSAgfSA9IG1ldGE7XG4gICAgICAgIGNvbnN0IHsgeEF4aXNLZXkgPSd4JyAsIHlBeGlzS2V5ID0neScgIH0gPSB0aGlzLl9wYXJzaW5nO1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBuZXcgQXJyYXkoY291bnQpO1xuICAgICAgICBsZXQgaSwgaWxlbiwgaW5kZXgsIGl0ZW07XG4gICAgICAgIGZvcihpID0gMCwgaWxlbiA9IGNvdW50OyBpIDwgaWxlbjsgKytpKXtcbiAgICAgICAgICAgIGluZGV4ID0gaSArIHN0YXJ0O1xuICAgICAgICAgICAgaXRlbSA9IGRhdGFbaW5kZXhdO1xuICAgICAgICAgICAgcGFyc2VkW2ldID0ge1xuICAgICAgICAgICAgICAgIHg6IHhTY2FsZS5wYXJzZShyZXNvbHZlT2JqZWN0S2V5KGl0ZW0sIHhBeGlzS2V5KSwgaW5kZXgpLFxuICAgICAgICAgICAgICAgIHk6IHlTY2FsZS5wYXJzZShyZXNvbHZlT2JqZWN0S2V5KGl0ZW0sIHlBeGlzS2V5KSwgaW5kZXgpXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJzZWQ7XG4gICAgfVxuIGdldFBhcnNlZChpbmRleCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2FjaGVkTWV0YS5fcGFyc2VkW2luZGV4XTtcbiAgICB9XG4gZ2V0RGF0YUVsZW1lbnQoaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlZE1ldGEuZGF0YVtpbmRleF07XG4gICAgfVxuIGFwcGx5U3RhY2soc2NhbGUsIHBhcnNlZCwgbW9kZSkge1xuICAgICAgICBjb25zdCBjaGFydCA9IHRoaXMuY2hhcnQ7XG4gICAgICAgIGNvbnN0IG1ldGEgPSB0aGlzLl9jYWNoZWRNZXRhO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHBhcnNlZFtzY2FsZS5heGlzXTtcbiAgICAgICAgY29uc3Qgc3RhY2sgPSB7XG4gICAgICAgICAgICBrZXlzOiBnZXRTb3J0ZWREYXRhc2V0SW5kaWNlcyhjaGFydCwgdHJ1ZSksXG4gICAgICAgICAgICB2YWx1ZXM6IHBhcnNlZC5fc3RhY2tzW3NjYWxlLmF4aXNdLl92aXN1YWxWYWx1ZXNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGFwcGx5U3RhY2soc3RhY2ssIHZhbHVlLCBtZXRhLmluZGV4LCB7XG4gICAgICAgICAgICBtb2RlXG4gICAgICAgIH0pO1xuICAgIH1cbiB1cGRhdGVSYW5nZUZyb21QYXJzZWQocmFuZ2UsIHNjYWxlLCBwYXJzZWQsIHN0YWNrKSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFZhbHVlID0gcGFyc2VkW3NjYWxlLmF4aXNdO1xuICAgICAgICBsZXQgdmFsdWUgPSBwYXJzZWRWYWx1ZSA9PT0gbnVsbCA/IE5hTiA6IHBhcnNlZFZhbHVlO1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSBzdGFjayAmJiBwYXJzZWQuX3N0YWNrc1tzY2FsZS5heGlzXTtcbiAgICAgICAgaWYgKHN0YWNrICYmIHZhbHVlcykge1xuICAgICAgICAgICAgc3RhY2sudmFsdWVzID0gdmFsdWVzO1xuICAgICAgICAgICAgdmFsdWUgPSBhcHBseVN0YWNrKHN0YWNrLCBwYXJzZWRWYWx1ZSwgdGhpcy5fY2FjaGVkTWV0YS5pbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgcmFuZ2UubWluID0gTWF0aC5taW4ocmFuZ2UubWluLCB2YWx1ZSk7XG4gICAgICAgIHJhbmdlLm1heCA9IE1hdGgubWF4KHJhbmdlLm1heCwgdmFsdWUpO1xuICAgIH1cbiBnZXRNaW5NYXgoc2NhbGUsIGNhblN0YWNrKSB7XG4gICAgICAgIGNvbnN0IG1ldGEgPSB0aGlzLl9jYWNoZWRNZXRhO1xuICAgICAgICBjb25zdCBfcGFyc2VkID0gbWV0YS5fcGFyc2VkO1xuICAgICAgICBjb25zdCBzb3J0ZWQgPSBtZXRhLl9zb3J0ZWQgJiYgc2NhbGUgPT09IG1ldGEuaVNjYWxlO1xuICAgICAgICBjb25zdCBpbGVuID0gX3BhcnNlZC5sZW5ndGg7XG4gICAgICAgIGNvbnN0IG90aGVyU2NhbGUgPSB0aGlzLl9nZXRPdGhlclNjYWxlKHNjYWxlKTtcbiAgICAgICAgY29uc3Qgc3RhY2sgPSBjcmVhdGVTdGFjayhjYW5TdGFjaywgbWV0YSwgdGhpcy5jaGFydCk7XG4gICAgICAgIGNvbnN0IHJhbmdlID0ge1xuICAgICAgICAgICAgbWluOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksXG4gICAgICAgICAgICBtYXg6IE51bWJlci5ORUdBVElWRV9JTkZJTklUWVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCB7IG1pbjogb3RoZXJNaW4gLCBtYXg6IG90aGVyTWF4ICB9ID0gZ2V0VXNlckJvdW5kcyhvdGhlclNjYWxlKTtcbiAgICAgICAgbGV0IGksIHBhcnNlZDtcbiAgICAgICAgZnVuY3Rpb24gX3NraXAoKSB7XG4gICAgICAgICAgICBwYXJzZWQgPSBfcGFyc2VkW2ldO1xuICAgICAgICAgICAgY29uc3Qgb3RoZXJWYWx1ZSA9IHBhcnNlZFtvdGhlclNjYWxlLmF4aXNdO1xuICAgICAgICAgICAgcmV0dXJuICFpc051bWJlckZpbml0ZShwYXJzZWRbc2NhbGUuYXhpc10pIHx8IG90aGVyTWluID4gb3RoZXJWYWx1ZSB8fCBvdGhlck1heCA8IG90aGVyVmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZm9yKGkgPSAwOyBpIDwgaWxlbjsgKytpKXtcbiAgICAgICAgICAgIGlmIChfc2tpcCgpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVJhbmdlRnJvbVBhcnNlZChyYW5nZSwgc2NhbGUsIHBhcnNlZCwgc3RhY2spO1xuICAgICAgICAgICAgaWYgKHNvcnRlZCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzb3J0ZWQpIHtcbiAgICAgICAgICAgIGZvcihpID0gaWxlbiAtIDE7IGkgPj0gMDsgLS1pKXtcbiAgICAgICAgICAgICAgICBpZiAoX3NraXAoKSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVSYW5nZUZyb21QYXJzZWQocmFuZ2UsIHNjYWxlLCBwYXJzZWQsIHN0YWNrKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmFuZ2U7XG4gICAgfVxuICAgIGdldEFsbFBhcnNlZFZhbHVlcyhzY2FsZSkge1xuICAgICAgICBjb25zdCBwYXJzZWQgPSB0aGlzLl9jYWNoZWRNZXRhLl9wYXJzZWQ7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IFtdO1xuICAgICAgICBsZXQgaSwgaWxlbiwgdmFsdWU7XG4gICAgICAgIGZvcihpID0gMCwgaWxlbiA9IHBhcnNlZC5sZW5ndGg7IGkgPCBpbGVuOyArK2kpe1xuICAgICAgICAgICAgdmFsdWUgPSBwYXJzZWRbaV1bc2NhbGUuYXhpc107XG4gICAgICAgICAgICBpZiAoaXNOdW1iZXJGaW5pdGUodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgdmFsdWVzLnB1c2godmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZXM7XG4gICAgfVxuIGdldE1heE92ZXJmbG93KCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuIGdldExhYmVsQW5kVmFsdWUoaW5kZXgpIHtcbiAgICAgICAgY29uc3QgbWV0YSA9IHRoaXMuX2NhY2hlZE1ldGE7XG4gICAgICAgIGNvbnN0IGlTY2FsZSA9IG1ldGEuaVNjYWxlO1xuICAgICAgICBjb25zdCB2U2NhbGUgPSBtZXRhLnZTY2FsZTtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gdGhpcy5nZXRQYXJzZWQoaW5kZXgpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGFiZWw6IGlTY2FsZSA/ICcnICsgaVNjYWxlLmdldExhYmVsRm9yVmFsdWUocGFyc2VkW2lTY2FsZS5heGlzXSkgOiAnJyxcbiAgICAgICAgICAgIHZhbHVlOiB2U2NhbGUgPyAnJyArIHZTY2FsZS5nZXRMYWJlbEZvclZhbHVlKHBhcnNlZFt2U2NhbGUuYXhpc10pIDogJydcbiAgICAgICAgfTtcbiAgICB9XG4gX3VwZGF0ZShtb2RlKSB7XG4gICAgICAgIGNvbnN0IG1ldGEgPSB0aGlzLl9jYWNoZWRNZXRhO1xuICAgICAgICB0aGlzLnVwZGF0ZShtb2RlIHx8ICdkZWZhdWx0Jyk7XG4gICAgICAgIG1ldGEuX2NsaXAgPSB0b0NsaXAodmFsdWVPckRlZmF1bHQodGhpcy5vcHRpb25zLmNsaXAsIGRlZmF1bHRDbGlwKG1ldGEueFNjYWxlLCBtZXRhLnlTY2FsZSwgdGhpcy5nZXRNYXhPdmVyZmxvdygpKSkpO1xuICAgIH1cbiB1cGRhdGUobW9kZSkge31cbiAgICBkcmF3KCkge1xuICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9jdHg7XG4gICAgICAgIGNvbnN0IGNoYXJ0ID0gdGhpcy5jaGFydDtcbiAgICAgICAgY29uc3QgbWV0YSA9IHRoaXMuX2NhY2hlZE1ldGE7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gbWV0YS5kYXRhIHx8IFtdO1xuICAgICAgICBjb25zdCBhcmVhID0gY2hhcnQuY2hhcnRBcmVhO1xuICAgICAgICBjb25zdCBhY3RpdmUgPSBbXTtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLl9kcmF3U3RhcnQgfHwgMDtcbiAgICAgICAgY29uc3QgY291bnQgPSB0aGlzLl9kcmF3Q291bnQgfHwgZWxlbWVudHMubGVuZ3RoIC0gc3RhcnQ7XG4gICAgICAgIGNvbnN0IGRyYXdBY3RpdmVFbGVtZW50c09uVG9wID0gdGhpcy5vcHRpb25zLmRyYXdBY3RpdmVFbGVtZW50c09uVG9wO1xuICAgICAgICBsZXQgaTtcbiAgICAgICAgaWYgKG1ldGEuZGF0YXNldCkge1xuICAgICAgICAgICAgbWV0YS5kYXRhc2V0LmRyYXcoY3R4LCBhcmVhLCBzdGFydCwgY291bnQpO1xuICAgICAgICB9XG4gICAgICAgIGZvcihpID0gc3RhcnQ7IGkgPCBzdGFydCArIGNvdW50OyArK2kpe1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGVsZW1lbnRzW2ldO1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQuaGlkZGVuKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZWxlbWVudC5hY3RpdmUgJiYgZHJhd0FjdGl2ZUVsZW1lbnRzT25Ub3ApIHtcbiAgICAgICAgICAgICAgICBhY3RpdmUucHVzaChlbGVtZW50KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5kcmF3KGN0eCwgYXJlYSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yKGkgPSAwOyBpIDwgYWN0aXZlLmxlbmd0aDsgKytpKXtcbiAgICAgICAgICAgIGFjdGl2ZVtpXS5kcmF3KGN0eCwgYXJlYSk7XG4gICAgICAgIH1cbiAgICB9XG4gZ2V0U3R5bGUoaW5kZXgsIGFjdGl2ZSkge1xuICAgICAgICBjb25zdCBtb2RlID0gYWN0aXZlID8gJ2FjdGl2ZScgOiAnZGVmYXVsdCc7XG4gICAgICAgIHJldHVybiBpbmRleCA9PT0gdW5kZWZpbmVkICYmIHRoaXMuX2NhY2hlZE1ldGEuZGF0YXNldCA/IHRoaXMucmVzb2x2ZURhdGFzZXRFbGVtZW50T3B0aW9ucyhtb2RlKSA6IHRoaXMucmVzb2x2ZURhdGFFbGVtZW50T3B0aW9ucyhpbmRleCB8fCAwLCBtb2RlKTtcbiAgICB9XG4gZ2V0Q29udGV4dChpbmRleCwgYWN0aXZlLCBtb2RlKSB7XG4gICAgICAgIGNvbnN0IGRhdGFzZXQgPSB0aGlzLmdldERhdGFzZXQoKTtcbiAgICAgICAgbGV0IGNvbnRleHQ7XG4gICAgICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgdGhpcy5fY2FjaGVkTWV0YS5kYXRhLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuX2NhY2hlZE1ldGEuZGF0YVtpbmRleF07XG4gICAgICAgICAgICBjb250ZXh0ID0gZWxlbWVudC4kY29udGV4dCB8fCAoZWxlbWVudC4kY29udGV4dCA9IGNyZWF0ZURhdGFDb250ZXh0KHRoaXMuZ2V0Q29udGV4dCgpLCBpbmRleCwgZWxlbWVudCkpO1xuICAgICAgICAgICAgY29udGV4dC5wYXJzZWQgPSB0aGlzLmdldFBhcnNlZChpbmRleCk7XG4gICAgICAgICAgICBjb250ZXh0LnJhdyA9IGRhdGFzZXQuZGF0YVtpbmRleF07XG4gICAgICAgICAgICBjb250ZXh0LmluZGV4ID0gY29udGV4dC5kYXRhSW5kZXggPSBpbmRleDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnRleHQgPSB0aGlzLiRjb250ZXh0IHx8ICh0aGlzLiRjb250ZXh0ID0gY3JlYXRlRGF0YXNldENvbnRleHQodGhpcy5jaGFydC5nZXRDb250ZXh0KCksIHRoaXMuaW5kZXgpKTtcbiAgICAgICAgICAgIGNvbnRleHQuZGF0YXNldCA9IGRhdGFzZXQ7XG4gICAgICAgICAgICBjb250ZXh0LmluZGV4ID0gY29udGV4dC5kYXRhc2V0SW5kZXggPSB0aGlzLmluZGV4O1xuICAgICAgICB9XG4gICAgICAgIGNvbnRleHQuYWN0aXZlID0gISFhY3RpdmU7XG4gICAgICAgIGNvbnRleHQubW9kZSA9IG1vZGU7XG4gICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgIH1cbiByZXNvbHZlRGF0YXNldEVsZW1lbnRPcHRpb25zKG1vZGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc29sdmVFbGVtZW50T3B0aW9ucyh0aGlzLmRhdGFzZXRFbGVtZW50VHlwZS5pZCwgbW9kZSk7XG4gICAgfVxuIHJlc29sdmVEYXRhRWxlbWVudE9wdGlvbnMoaW5kZXgsIG1vZGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc29sdmVFbGVtZW50T3B0aW9ucyh0aGlzLmRhdGFFbGVtZW50VHlwZS5pZCwgbW9kZSwgaW5kZXgpO1xuICAgIH1cbiBfcmVzb2x2ZUVsZW1lbnRPcHRpb25zKGVsZW1lbnRUeXBlLCBtb2RlID0gJ2RlZmF1bHQnLCBpbmRleCkge1xuICAgICAgICBjb25zdCBhY3RpdmUgPSBtb2RlID09PSAnYWN0aXZlJztcbiAgICAgICAgY29uc3QgY2FjaGUgPSB0aGlzLl9jYWNoZWREYXRhT3B0cztcbiAgICAgICAgY29uc3QgY2FjaGVLZXkgPSBlbGVtZW50VHlwZSArICctJyArIG1vZGU7XG4gICAgICAgIGNvbnN0IGNhY2hlZCA9IGNhY2hlW2NhY2hlS2V5XTtcbiAgICAgICAgY29uc3Qgc2hhcmluZyA9IHRoaXMuZW5hYmxlT3B0aW9uU2hhcmluZyAmJiBkZWZpbmVkKGluZGV4KTtcbiAgICAgICAgaWYgKGNhY2hlZCkge1xuICAgICAgICAgICAgcmV0dXJuIGNsb25lSWZOb3RTaGFyZWQoY2FjaGVkLCBzaGFyaW5nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb25maWcgPSB0aGlzLmNoYXJ0LmNvbmZpZztcbiAgICAgICAgY29uc3Qgc2NvcGVLZXlzID0gY29uZmlnLmRhdGFzZXRFbGVtZW50U2NvcGVLZXlzKHRoaXMuX3R5cGUsIGVsZW1lbnRUeXBlKTtcbiAgICAgICAgY29uc3QgcHJlZml4ZXMgPSBhY3RpdmUgPyBbXG4gICAgICAgICAgICBgJHtlbGVtZW50VHlwZX1Ib3ZlcmAsXG4gICAgICAgICAgICAnaG92ZXInLFxuICAgICAgICAgICAgZWxlbWVudFR5cGUsXG4gICAgICAgICAgICAnJ1xuICAgICAgICBdIDogW1xuICAgICAgICAgICAgZWxlbWVudFR5cGUsXG4gICAgICAgICAgICAnJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBzY29wZXMgPSBjb25maWcuZ2V0T3B0aW9uU2NvcGVzKHRoaXMuZ2V0RGF0YXNldCgpLCBzY29wZUtleXMpO1xuICAgICAgICBjb25zdCBuYW1lcyA9IE9iamVjdC5rZXlzKGRlZmF1bHRzLmVsZW1lbnRzW2VsZW1lbnRUeXBlXSk7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSAoKT0+dGhpcy5nZXRDb250ZXh0KGluZGV4LCBhY3RpdmUsIG1vZGUpO1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSBjb25maWcucmVzb2x2ZU5hbWVkT3B0aW9ucyhzY29wZXMsIG5hbWVzLCBjb250ZXh0LCBwcmVmaXhlcyk7XG4gICAgICAgIGlmICh2YWx1ZXMuJHNoYXJlZCkge1xuICAgICAgICAgICAgdmFsdWVzLiRzaGFyZWQgPSBzaGFyaW5nO1xuICAgICAgICAgICAgY2FjaGVbY2FjaGVLZXldID0gT2JqZWN0LmZyZWV6ZShjbG9uZUlmTm90U2hhcmVkKHZhbHVlcywgc2hhcmluZykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZXM7XG4gICAgfVxuIF9yZXNvbHZlQW5pbWF0aW9ucyhpbmRleCwgdHJhbnNpdGlvbiwgYWN0aXZlKSB7XG4gICAgICAgIGNvbnN0IGNoYXJ0ID0gdGhpcy5jaGFydDtcbiAgICAgICAgY29uc3QgY2FjaGUgPSB0aGlzLl9jYWNoZWREYXRhT3B0cztcbiAgICAgICAgY29uc3QgY2FjaGVLZXkgPSBgYW5pbWF0aW9uLSR7dHJhbnNpdGlvbn1gO1xuICAgICAgICBjb25zdCBjYWNoZWQgPSBjYWNoZVtjYWNoZUtleV07XG4gICAgICAgIGlmIChjYWNoZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG9wdGlvbnM7XG4gICAgICAgIGlmIChjaGFydC5vcHRpb25zLmFuaW1hdGlvbiAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY2hhcnQuY29uZmlnO1xuICAgICAgICAgICAgY29uc3Qgc2NvcGVLZXlzID0gY29uZmlnLmRhdGFzZXRBbmltYXRpb25TY29wZUtleXModGhpcy5fdHlwZSwgdHJhbnNpdGlvbik7XG4gICAgICAgICAgICBjb25zdCBzY29wZXMgPSBjb25maWcuZ2V0T3B0aW9uU2NvcGVzKHRoaXMuZ2V0RGF0YXNldCgpLCBzY29wZUtleXMpO1xuICAgICAgICAgICAgb3B0aW9ucyA9IGNvbmZpZy5jcmVhdGVSZXNvbHZlcihzY29wZXMsIHRoaXMuZ2V0Q29udGV4dChpbmRleCwgYWN0aXZlLCB0cmFuc2l0aW9uKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYW5pbWF0aW9ucyA9IG5ldyBBbmltYXRpb25zKGNoYXJ0LCBvcHRpb25zICYmIG9wdGlvbnMuYW5pbWF0aW9ucyk7XG4gICAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuX2NhY2hlYWJsZSkge1xuICAgICAgICAgICAgY2FjaGVbY2FjaGVLZXldID0gT2JqZWN0LmZyZWV6ZShhbmltYXRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYW5pbWF0aW9ucztcbiAgICB9XG4gZ2V0U2hhcmVkT3B0aW9ucyhvcHRpb25zKSB7XG4gICAgICAgIGlmICghb3B0aW9ucy4kc2hhcmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3NoYXJlZE9wdGlvbnMgfHwgKHRoaXMuX3NoYXJlZE9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zKSk7XG4gICAgfVxuIGluY2x1ZGVPcHRpb25zKG1vZGUsIHNoYXJlZE9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuICFzaGFyZWRPcHRpb25zIHx8IGlzRGlyZWN0VXBkYXRlTW9kZShtb2RlKSB8fCB0aGlzLmNoYXJ0Ll9hbmltYXRpb25zRGlzYWJsZWQ7XG4gICAgfVxuIF9nZXRTaGFyZWRPcHRpb25zKHN0YXJ0LCBtb2RlKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0T3B0cyA9IHRoaXMucmVzb2x2ZURhdGFFbGVtZW50T3B0aW9ucyhzdGFydCwgbW9kZSk7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzbHlTaGFyZWRPcHRpb25zID0gdGhpcy5fc2hhcmVkT3B0aW9ucztcbiAgICAgICAgY29uc3Qgc2hhcmVkT3B0aW9ucyA9IHRoaXMuZ2V0U2hhcmVkT3B0aW9ucyhmaXJzdE9wdHMpO1xuICAgICAgICBjb25zdCBpbmNsdWRlT3B0aW9ucyA9IHRoaXMuaW5jbHVkZU9wdGlvbnMobW9kZSwgc2hhcmVkT3B0aW9ucykgfHwgc2hhcmVkT3B0aW9ucyAhPT0gcHJldmlvdXNseVNoYXJlZE9wdGlvbnM7XG4gICAgICAgIHRoaXMudXBkYXRlU2hhcmVkT3B0aW9ucyhzaGFyZWRPcHRpb25zLCBtb2RlLCBmaXJzdE9wdHMpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc2hhcmVkT3B0aW9ucyxcbiAgICAgICAgICAgIGluY2x1ZGVPcHRpb25zXG4gICAgICAgIH07XG4gICAgfVxuIHVwZGF0ZUVsZW1lbnQoZWxlbWVudCwgaW5kZXgsIHByb3BlcnRpZXMsIG1vZGUpIHtcbiAgICAgICAgaWYgKGlzRGlyZWN0VXBkYXRlTW9kZShtb2RlKSkge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihlbGVtZW50LCBwcm9wZXJ0aWVzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3Jlc29sdmVBbmltYXRpb25zKGluZGV4LCBtb2RlKS51cGRhdGUoZWxlbWVudCwgcHJvcGVydGllcyk7XG4gICAgICAgIH1cbiAgICB9XG4gdXBkYXRlU2hhcmVkT3B0aW9ucyhzaGFyZWRPcHRpb25zLCBtb2RlLCBuZXdPcHRpb25zKSB7XG4gICAgICAgIGlmIChzaGFyZWRPcHRpb25zICYmICFpc0RpcmVjdFVwZGF0ZU1vZGUobW9kZSkpIHtcbiAgICAgICAgICAgIHRoaXMuX3Jlc29sdmVBbmltYXRpb25zKHVuZGVmaW5lZCwgbW9kZSkudXBkYXRlKHNoYXJlZE9wdGlvbnMsIG5ld09wdGlvbnMpO1xuICAgICAgICB9XG4gICAgfVxuIF9zZXRTdHlsZShlbGVtZW50LCBpbmRleCwgbW9kZSwgYWN0aXZlKSB7XG4gICAgICAgIGVsZW1lbnQuYWN0aXZlID0gYWN0aXZlO1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5nZXRTdHlsZShpbmRleCwgYWN0aXZlKTtcbiAgICAgICAgdGhpcy5fcmVzb2x2ZUFuaW1hdGlvbnMoaW5kZXgsIG1vZGUsIGFjdGl2ZSkudXBkYXRlKGVsZW1lbnQsIHtcbiAgICAgICAgICAgIG9wdGlvbnM6ICFhY3RpdmUgJiYgdGhpcy5nZXRTaGFyZWRPcHRpb25zKG9wdGlvbnMpIHx8IG9wdGlvbnNcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJlbW92ZUhvdmVyU3R5bGUoZWxlbWVudCwgZGF0YXNldEluZGV4LCBpbmRleCkge1xuICAgICAgICB0aGlzLl9zZXRTdHlsZShlbGVtZW50LCBpbmRleCwgJ2FjdGl2ZScsIGZhbHNlKTtcbiAgICB9XG4gICAgc2V0SG92ZXJTdHlsZShlbGVtZW50LCBkYXRhc2V0SW5kZXgsIGluZGV4KSB7XG4gICAgICAgIHRoaXMuX3NldFN0eWxlKGVsZW1lbnQsIGluZGV4LCAnYWN0aXZlJywgdHJ1ZSk7XG4gICAgfVxuIF9yZW1vdmVEYXRhc2V0SG92ZXJTdHlsZSgpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuX2NhY2hlZE1ldGEuZGF0YXNldDtcbiAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX3NldFN0eWxlKGVsZW1lbnQsIHVuZGVmaW5lZCwgJ2FjdGl2ZScsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH1cbiBfc2V0RGF0YXNldEhvdmVyU3R5bGUoKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLl9jYWNoZWRNZXRhLmRhdGFzZXQ7XG4gICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9zZXRTdHlsZShlbGVtZW50LCB1bmRlZmluZWQsICdhY3RpdmUnLCB0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cbiBfcmVzeW5jRWxlbWVudHMocmVzZXROZXdFbGVtZW50cykge1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5fZGF0YTtcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSB0aGlzLl9jYWNoZWRNZXRhLmRhdGE7XG4gICAgICAgIGZvciAoY29uc3QgW21ldGhvZCwgYXJnMSwgYXJnMl0gb2YgdGhpcy5fc3luY0xpc3Qpe1xuICAgICAgICAgICAgdGhpc1ttZXRob2RdKGFyZzEsIGFyZzIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3N5bmNMaXN0ID0gW107XG4gICAgICAgIGNvbnN0IG51bU1ldGEgPSBlbGVtZW50cy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IG51bURhdGEgPSBkYXRhLmxlbmd0aDtcbiAgICAgICAgY29uc3QgY291bnQgPSBNYXRoLm1pbihudW1EYXRhLCBudW1NZXRhKTtcbiAgICAgICAgaWYgKGNvdW50KSB7XG4gICAgICAgICAgICB0aGlzLnBhcnNlKDAsIGNvdW50KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobnVtRGF0YSA+IG51bU1ldGEpIHtcbiAgICAgICAgICAgIHRoaXMuX2luc2VydEVsZW1lbnRzKG51bU1ldGEsIG51bURhdGEgLSBudW1NZXRhLCByZXNldE5ld0VsZW1lbnRzKTtcbiAgICAgICAgfSBlbHNlIGlmIChudW1EYXRhIDwgbnVtTWV0YSkge1xuICAgICAgICAgICAgdGhpcy5fcmVtb3ZlRWxlbWVudHMobnVtRGF0YSwgbnVtTWV0YSAtIG51bURhdGEpO1xuICAgICAgICB9XG4gICAgfVxuIF9pbnNlcnRFbGVtZW50cyhzdGFydCwgY291bnQsIHJlc2V0TmV3RWxlbWVudHMgPSB0cnVlKSB7XG4gICAgICAgIGNvbnN0IG1ldGEgPSB0aGlzLl9jYWNoZWRNZXRhO1xuICAgICAgICBjb25zdCBkYXRhID0gbWV0YS5kYXRhO1xuICAgICAgICBjb25zdCBlbmQgPSBzdGFydCArIGNvdW50O1xuICAgICAgICBsZXQgaTtcbiAgICAgICAgY29uc3QgbW92ZSA9IChhcnIpPT57XG4gICAgICAgICAgICBhcnIubGVuZ3RoICs9IGNvdW50O1xuICAgICAgICAgICAgZm9yKGkgPSBhcnIubGVuZ3RoIC0gMTsgaSA+PSBlbmQ7IGktLSl7XG4gICAgICAgICAgICAgICAgYXJyW2ldID0gYXJyW2kgLSBjb3VudF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIG1vdmUoZGF0YSk7XG4gICAgICAgIGZvcihpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSl7XG4gICAgICAgICAgICBkYXRhW2ldID0gbmV3IHRoaXMuZGF0YUVsZW1lbnRUeXBlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3BhcnNpbmcpIHtcbiAgICAgICAgICAgIG1vdmUobWV0YS5fcGFyc2VkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBhcnNlKHN0YXJ0LCBjb3VudCk7XG4gICAgICAgIGlmIChyZXNldE5ld0VsZW1lbnRzKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUVsZW1lbnRzKGRhdGEsIHN0YXJ0LCBjb3VudCwgJ3Jlc2V0Jyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdXBkYXRlRWxlbWVudHMoZWxlbWVudCwgc3RhcnQsIGNvdW50LCBtb2RlKSB7fVxuIF9yZW1vdmVFbGVtZW50cyhzdGFydCwgY291bnQpIHtcbiAgICAgICAgY29uc3QgbWV0YSA9IHRoaXMuX2NhY2hlZE1ldGE7XG4gICAgICAgIGlmICh0aGlzLl9wYXJzaW5nKSB7XG4gICAgICAgICAgICBjb25zdCByZW1vdmVkID0gbWV0YS5fcGFyc2VkLnNwbGljZShzdGFydCwgY291bnQpO1xuICAgICAgICAgICAgaWYgKG1ldGEuX3N0YWNrZWQpIHtcbiAgICAgICAgICAgICAgICBjbGVhclN0YWNrcyhtZXRhLCByZW1vdmVkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBtZXRhLmRhdGEuc3BsaWNlKHN0YXJ0LCBjb3VudCk7XG4gICAgfVxuIF9zeW5jKGFyZ3MpIHtcbiAgICAgICAgaWYgKHRoaXMuX3BhcnNpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuX3N5bmNMaXN0LnB1c2goYXJncyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBbbWV0aG9kLCBhcmcxLCBhcmcyXSA9IGFyZ3M7XG4gICAgICAgICAgICB0aGlzW21ldGhvZF0oYXJnMSwgYXJnMik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jaGFydC5fZGF0YUNoYW5nZXMucHVzaChbXG4gICAgICAgICAgICB0aGlzLmluZGV4LFxuICAgICAgICAgICAgLi4uYXJnc1xuICAgICAgICBdKTtcbiAgICB9XG4gICAgX29uRGF0YVB1c2goKSB7XG4gICAgICAgIGNvbnN0IGNvdW50ID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICAgICAgdGhpcy5fc3luYyhbXG4gICAgICAgICAgICAnX2luc2VydEVsZW1lbnRzJyxcbiAgICAgICAgICAgIHRoaXMuZ2V0RGF0YXNldCgpLmRhdGEubGVuZ3RoIC0gY291bnQsXG4gICAgICAgICAgICBjb3VudFxuICAgICAgICBdKTtcbiAgICB9XG4gICAgX29uRGF0YVBvcCgpIHtcbiAgICAgICAgdGhpcy5fc3luYyhbXG4gICAgICAgICAgICAnX3JlbW92ZUVsZW1lbnRzJyxcbiAgICAgICAgICAgIHRoaXMuX2NhY2hlZE1ldGEuZGF0YS5sZW5ndGggLSAxLFxuICAgICAgICAgICAgMVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgX29uRGF0YVNoaWZ0KCkge1xuICAgICAgICB0aGlzLl9zeW5jKFtcbiAgICAgICAgICAgICdfcmVtb3ZlRWxlbWVudHMnLFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIDFcbiAgICAgICAgXSk7XG4gICAgfVxuICAgIF9vbkRhdGFTcGxpY2Uoc3RhcnQsIGNvdW50KSB7XG4gICAgICAgIGlmIChjb3VudCkge1xuICAgICAgICAgICAgdGhpcy5fc3luYyhbXG4gICAgICAgICAgICAgICAgJ19yZW1vdmVFbGVtZW50cycsXG4gICAgICAgICAgICAgICAgc3RhcnQsXG4gICAgICAgICAgICAgICAgY291bnRcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5ld0NvdW50ID0gYXJndW1lbnRzLmxlbmd0aCAtIDI7XG4gICAgICAgIGlmIChuZXdDb3VudCkge1xuICAgICAgICAgICAgdGhpcy5fc3luYyhbXG4gICAgICAgICAgICAgICAgJ19pbnNlcnRFbGVtZW50cycsXG4gICAgICAgICAgICAgICAgc3RhcnQsXG4gICAgICAgICAgICAgICAgbmV3Q291bnRcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIF9vbkRhdGFVbnNoaWZ0KCkge1xuICAgICAgICB0aGlzLl9zeW5jKFtcbiAgICAgICAgICAgICdfaW5zZXJ0RWxlbWVudHMnLFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgICAgXSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBnZXRBbGxTY2FsZVZhbHVlcyhzY2FsZSwgdHlwZSkge1xuICAgIGlmICghc2NhbGUuX2NhY2hlLiRiYXIpIHtcbiAgICAgICAgY29uc3QgdmlzaWJsZU1ldGFzID0gc2NhbGUuZ2V0TWF0Y2hpbmdWaXNpYmxlTWV0YXModHlwZSk7XG4gICAgICAgIGxldCB2YWx1ZXMgPSBbXTtcbiAgICAgICAgZm9yKGxldCBpID0gMCwgaWxlbiA9IHZpc2libGVNZXRhcy5sZW5ndGg7IGkgPCBpbGVuOyBpKyspe1xuICAgICAgICAgICAgdmFsdWVzID0gdmFsdWVzLmNvbmNhdCh2aXNpYmxlTWV0YXNbaV0uY29udHJvbGxlci5nZXRBbGxQYXJzZWRWYWx1ZXMoc2NhbGUpKTtcbiAgICAgICAgfVxuICAgICAgICBzY2FsZS5fY2FjaGUuJGJhciA9IF9hcnJheVVuaXF1ZSh2YWx1ZXMuc29ydCgoYSwgYik9PmEgLSBiKSk7XG4gICAgfVxuICAgIHJldHVybiBzY2FsZS5fY2FjaGUuJGJhcjtcbn1cbiBmdW5jdGlvbiBjb21wdXRlTWluU2FtcGxlU2l6ZShtZXRhKSB7XG4gICAgY29uc3Qgc2NhbGUgPSBtZXRhLmlTY2FsZTtcbiAgICBjb25zdCB2YWx1ZXMgPSBnZXRBbGxTY2FsZVZhbHVlcyhzY2FsZSwgbWV0YS50eXBlKTtcbiAgICBsZXQgbWluID0gc2NhbGUuX2xlbmd0aDtcbiAgICBsZXQgaSwgaWxlbiwgY3VyciwgcHJldjtcbiAgICBjb25zdCB1cGRhdGVNaW5BbmRQcmV2ID0gKCk9PntcbiAgICAgICAgaWYgKGN1cnIgPT09IDMyNzY3IHx8IGN1cnIgPT09IC0zMjc2OCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZWZpbmVkKHByZXYpKSB7XG4gICAgICAgICAgICBtaW4gPSBNYXRoLm1pbihtaW4sIE1hdGguYWJzKGN1cnIgLSBwcmV2KSB8fCBtaW4pO1xuICAgICAgICB9XG4gICAgICAgIHByZXYgPSBjdXJyO1xuICAgIH07XG4gICAgZm9yKGkgPSAwLCBpbGVuID0gdmFsdWVzLmxlbmd0aDsgaSA8IGlsZW47ICsraSl7XG4gICAgICAgIGN1cnIgPSBzY2FsZS5nZXRQaXhlbEZvclZhbHVlKHZhbHVlc1tpXSk7XG4gICAgICAgIHVwZGF0ZU1pbkFuZFByZXYoKTtcbiAgICB9XG4gICAgcHJldiA9IHVuZGVmaW5lZDtcbiAgICBmb3IoaSA9IDAsIGlsZW4gPSBzY2FsZS50aWNrcy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpe1xuICAgICAgICBjdXJyID0gc2NhbGUuZ2V0UGl4ZWxGb3JUaWNrKGkpO1xuICAgICAgICB1cGRhdGVNaW5BbmRQcmV2KCk7XG4gICAgfVxuICAgIHJldHVybiBtaW47XG59XG4gZnVuY3Rpb24gY29tcHV0ZUZpdENhdGVnb3J5VHJhaXRzKGluZGV4LCBydWxlciwgb3B0aW9ucywgc3RhY2tDb3VudCkge1xuICAgIGNvbnN0IHRoaWNrbmVzcyA9IG9wdGlvbnMuYmFyVGhpY2tuZXNzO1xuICAgIGxldCBzaXplLCByYXRpbztcbiAgICBpZiAoaXNOdWxsT3JVbmRlZih0aGlja25lc3MpKSB7XG4gICAgICAgIHNpemUgPSBydWxlci5taW4gKiBvcHRpb25zLmNhdGVnb3J5UGVyY2VudGFnZTtcbiAgICAgICAgcmF0aW8gPSBvcHRpb25zLmJhclBlcmNlbnRhZ2U7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgc2l6ZSA9IHRoaWNrbmVzcyAqIHN0YWNrQ291bnQ7XG4gICAgICAgIHJhdGlvID0gMTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY2h1bms6IHNpemUgLyBzdGFja0NvdW50LFxuICAgICAgICByYXRpbyxcbiAgICAgICAgc3RhcnQ6IHJ1bGVyLnBpeGVsc1tpbmRleF0gLSBzaXplIC8gMlxuICAgIH07XG59XG4gZnVuY3Rpb24gY29tcHV0ZUZsZXhDYXRlZ29yeVRyYWl0cyhpbmRleCwgcnVsZXIsIG9wdGlvbnMsIHN0YWNrQ291bnQpIHtcbiAgICBjb25zdCBwaXhlbHMgPSBydWxlci5waXhlbHM7XG4gICAgY29uc3QgY3VyciA9IHBpeGVsc1tpbmRleF07XG4gICAgbGV0IHByZXYgPSBpbmRleCA+IDAgPyBwaXhlbHNbaW5kZXggLSAxXSA6IG51bGw7XG4gICAgbGV0IG5leHQgPSBpbmRleCA8IHBpeGVscy5sZW5ndGggLSAxID8gcGl4ZWxzW2luZGV4ICsgMV0gOiBudWxsO1xuICAgIGNvbnN0IHBlcmNlbnQgPSBvcHRpb25zLmNhdGVnb3J5UGVyY2VudGFnZTtcbiAgICBpZiAocHJldiA9PT0gbnVsbCkge1xuICAgICAgICBwcmV2ID0gY3VyciAtIChuZXh0ID09PSBudWxsID8gcnVsZXIuZW5kIC0gcnVsZXIuc3RhcnQgOiBuZXh0IC0gY3Vycik7XG4gICAgfVxuICAgIGlmIChuZXh0ID09PSBudWxsKSB7XG4gICAgICAgIG5leHQgPSBjdXJyICsgY3VyciAtIHByZXY7XG4gICAgfVxuICAgIGNvbnN0IHN0YXJ0ID0gY3VyciAtIChjdXJyIC0gTWF0aC5taW4ocHJldiwgbmV4dCkpIC8gMiAqIHBlcmNlbnQ7XG4gICAgY29uc3Qgc2l6ZSA9IE1hdGguYWJzKG5leHQgLSBwcmV2KSAvIDIgKiBwZXJjZW50O1xuICAgIHJldHVybiB7XG4gICAgICAgIGNodW5rOiBzaXplIC8gc3RhY2tDb3VudCxcbiAgICAgICAgcmF0aW86IG9wdGlvbnMuYmFyUGVyY2VudGFnZSxcbiAgICAgICAgc3RhcnRcbiAgICB9O1xufVxuZnVuY3Rpb24gcGFyc2VGbG9hdEJhcihlbnRyeSwgaXRlbSwgdlNjYWxlLCBpKSB7XG4gICAgY29uc3Qgc3RhcnRWYWx1ZSA9IHZTY2FsZS5wYXJzZShlbnRyeVswXSwgaSk7XG4gICAgY29uc3QgZW5kVmFsdWUgPSB2U2NhbGUucGFyc2UoZW50cnlbMV0sIGkpO1xuICAgIGNvbnN0IG1pbiA9IE1hdGgubWluKHN0YXJ0VmFsdWUsIGVuZFZhbHVlKTtcbiAgICBjb25zdCBtYXggPSBNYXRoLm1heChzdGFydFZhbHVlLCBlbmRWYWx1ZSk7XG4gICAgbGV0IGJhclN0YXJ0ID0gbWluO1xuICAgIGxldCBiYXJFbmQgPSBtYXg7XG4gICAgaWYgKE1hdGguYWJzKG1pbikgPiBNYXRoLmFicyhtYXgpKSB7XG4gICAgICAgIGJhclN0YXJ0ID0gbWF4O1xuICAgICAgICBiYXJFbmQgPSBtaW47XG4gICAgfVxuICAgIGl0ZW1bdlNjYWxlLmF4aXNdID0gYmFyRW5kO1xuICAgIGl0ZW0uX2N1c3RvbSA9IHtcbiAgICAgICAgYmFyU3RhcnQsXG4gICAgICAgIGJhckVuZCxcbiAgICAgICAgc3RhcnQ6IHN0YXJ0VmFsdWUsXG4gICAgICAgIGVuZDogZW5kVmFsdWUsXG4gICAgICAgIG1pbixcbiAgICAgICAgbWF4XG4gICAgfTtcbn1cbmZ1bmN0aW9uIHBhcnNlVmFsdWUoZW50cnksIGl0ZW0sIHZTY2FsZSwgaSkge1xuICAgIGlmIChpc0FycmF5KGVudHJ5KSkge1xuICAgICAgICBwYXJzZUZsb2F0QmFyKGVudHJ5LCBpdGVtLCB2U2NhbGUsIGkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGl0ZW1bdlNjYWxlLmF4aXNdID0gdlNjYWxlLnBhcnNlKGVudHJ5LCBpKTtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW07XG59XG5mdW5jdGlvbiBwYXJzZUFycmF5T3JQcmltaXRpdmUobWV0YSwgZGF0YSwgc3RhcnQsIGNvdW50KSB7XG4gICAgY29uc3QgaVNjYWxlID0gbWV0YS5pU2NhbGU7XG4gICAgY29uc3QgdlNjYWxlID0gbWV0YS52U2NhbGU7XG4gICAgY29uc3QgbGFiZWxzID0gaVNjYWxlLmdldExhYmVscygpO1xuICAgIGNvbnN0IHNpbmdsZVNjYWxlID0gaVNjYWxlID09PSB2U2NhbGU7XG4gICAgY29uc3QgcGFyc2VkID0gW107XG4gICAgbGV0IGksIGlsZW4sIGl0ZW0sIGVudHJ5O1xuICAgIGZvcihpID0gc3RhcnQsIGlsZW4gPSBzdGFydCArIGNvdW50OyBpIDwgaWxlbjsgKytpKXtcbiAgICAgICAgZW50cnkgPSBkYXRhW2ldO1xuICAgICAgICBpdGVtID0ge307XG4gICAgICAgIGl0ZW1baVNjYWxlLmF4aXNdID0gc2luZ2xlU2NhbGUgfHwgaVNjYWxlLnBhcnNlKGxhYmVsc1tpXSwgaSk7XG4gICAgICAgIHBhcnNlZC5wdXNoKHBhcnNlVmFsdWUoZW50cnksIGl0ZW0sIHZTY2FsZSwgaSkpO1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VkO1xufVxuZnVuY3Rpb24gaXNGbG9hdEJhcihjdXN0b20pIHtcbiAgICByZXR1cm4gY3VzdG9tICYmIGN1c3RvbS5iYXJTdGFydCAhPT0gdW5kZWZpbmVkICYmIGN1c3RvbS5iYXJFbmQgIT09IHVuZGVmaW5lZDtcbn1cbmZ1bmN0aW9uIGJhclNpZ24oc2l6ZSwgdlNjYWxlLCBhY3R1YWxCYXNlKSB7XG4gICAgaWYgKHNpemUgIT09IDApIHtcbiAgICAgICAgcmV0dXJuIHNpZ24oc2l6ZSk7XG4gICAgfVxuICAgIHJldHVybiAodlNjYWxlLmlzSG9yaXpvbnRhbCgpID8gMSA6IC0xKSAqICh2U2NhbGUubWluID49IGFjdHVhbEJhc2UgPyAxIDogLTEpO1xufVxuZnVuY3Rpb24gYm9yZGVyUHJvcHMocHJvcGVydGllcykge1xuICAgIGxldCByZXZlcnNlLCBzdGFydCwgZW5kLCB0b3AsIGJvdHRvbTtcbiAgICBpZiAocHJvcGVydGllcy5ob3Jpem9udGFsKSB7XG4gICAgICAgIHJldmVyc2UgPSBwcm9wZXJ0aWVzLmJhc2UgPiBwcm9wZXJ0aWVzLng7XG4gICAgICAgIHN0YXJ0ID0gJ2xlZnQnO1xuICAgICAgICBlbmQgPSAncmlnaHQnO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldmVyc2UgPSBwcm9wZXJ0aWVzLmJhc2UgPCBwcm9wZXJ0aWVzLnk7XG4gICAgICAgIHN0YXJ0ID0gJ2JvdHRvbSc7XG4gICAgICAgIGVuZCA9ICd0b3AnO1xuICAgIH1cbiAgICBpZiAocmV2ZXJzZSkge1xuICAgICAgICB0b3AgPSAnZW5kJztcbiAgICAgICAgYm90dG9tID0gJ3N0YXJ0JztcbiAgICB9IGVsc2Uge1xuICAgICAgICB0b3AgPSAnc3RhcnQnO1xuICAgICAgICBib3R0b20gPSAnZW5kJztcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc3RhcnQsXG4gICAgICAgIGVuZCxcbiAgICAgICAgcmV2ZXJzZSxcbiAgICAgICAgdG9wLFxuICAgICAgICBib3R0b21cbiAgICB9O1xufVxuZnVuY3Rpb24gc2V0Qm9yZGVyU2tpcHBlZChwcm9wZXJ0aWVzLCBvcHRpb25zLCBzdGFjaywgaW5kZXgpIHtcbiAgICBsZXQgZWRnZSA9IG9wdGlvbnMuYm9yZGVyU2tpcHBlZDtcbiAgICBjb25zdCByZXMgPSB7fTtcbiAgICBpZiAoIWVkZ2UpIHtcbiAgICAgICAgcHJvcGVydGllcy5ib3JkZXJTa2lwcGVkID0gcmVzO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChlZGdlID09PSB0cnVlKSB7XG4gICAgICAgIHByb3BlcnRpZXMuYm9yZGVyU2tpcHBlZCA9IHtcbiAgICAgICAgICAgIHRvcDogdHJ1ZSxcbiAgICAgICAgICAgIHJpZ2h0OiB0cnVlLFxuICAgICAgICAgICAgYm90dG9tOiB0cnVlLFxuICAgICAgICAgICAgbGVmdDogdHJ1ZVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHsgc3RhcnQgLCBlbmQgLCByZXZlcnNlICwgdG9wICwgYm90dG9tICB9ID0gYm9yZGVyUHJvcHMocHJvcGVydGllcyk7XG4gICAgaWYgKGVkZ2UgPT09ICdtaWRkbGUnICYmIHN0YWNrKSB7XG4gICAgICAgIHByb3BlcnRpZXMuZW5hYmxlQm9yZGVyUmFkaXVzID0gdHJ1ZTtcbiAgICAgICAgaWYgKChzdGFjay5fdG9wIHx8IDApID09PSBpbmRleCkge1xuICAgICAgICAgICAgZWRnZSA9IHRvcDtcbiAgICAgICAgfSBlbHNlIGlmICgoc3RhY2suX2JvdHRvbSB8fCAwKSA9PT0gaW5kZXgpIHtcbiAgICAgICAgICAgIGVkZ2UgPSBib3R0b207XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNbcGFyc2VFZGdlKGJvdHRvbSwgc3RhcnQsIGVuZCwgcmV2ZXJzZSldID0gdHJ1ZTtcbiAgICAgICAgICAgIGVkZ2UgPSB0b3A7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVzW3BhcnNlRWRnZShlZGdlLCBzdGFydCwgZW5kLCByZXZlcnNlKV0gPSB0cnVlO1xuICAgIHByb3BlcnRpZXMuYm9yZGVyU2tpcHBlZCA9IHJlcztcbn1cbmZ1bmN0aW9uIHBhcnNlRWRnZShlZGdlLCBhLCBiLCByZXZlcnNlKSB7XG4gICAgaWYgKHJldmVyc2UpIHtcbiAgICAgICAgZWRnZSA9IHN3YXAoZWRnZSwgYSwgYik7XG4gICAgICAgIGVkZ2UgPSBzdGFydEVuZChlZGdlLCBiLCBhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBlZGdlID0gc3RhcnRFbmQoZWRnZSwgYSwgYik7XG4gICAgfVxuICAgIHJldHVybiBlZGdlO1xufVxuZnVuY3Rpb24gc3dhcChvcmlnLCB2MSwgdjIpIHtcbiAgICByZXR1cm4gb3JpZyA9PT0gdjEgPyB2MiA6IG9yaWcgPT09IHYyID8gdjEgOiBvcmlnO1xufVxuZnVuY3Rpb24gc3RhcnRFbmQodiwgc3RhcnQsIGVuZCkge1xuICAgIHJldHVybiB2ID09PSAnc3RhcnQnID8gc3RhcnQgOiB2ID09PSAnZW5kJyA/IGVuZCA6IHY7XG59XG5mdW5jdGlvbiBzZXRJbmZsYXRlQW1vdW50KHByb3BlcnRpZXMsIHsgaW5mbGF0ZUFtb3VudCAgfSwgcmF0aW8pIHtcbiAgICBwcm9wZXJ0aWVzLmluZmxhdGVBbW91bnQgPSBpbmZsYXRlQW1vdW50ID09PSAnYXV0bycgPyByYXRpbyA9PT0gMSA/IDAuMzMgOiAwIDogaW5mbGF0ZUFtb3VudDtcbn1cbmNsYXNzIEJhckNvbnRyb2xsZXIgZXh0ZW5kcyBEYXRhc2V0Q29udHJvbGxlciB7XG4gICAgc3RhdGljIGlkID0gJ2Jhcic7XG4gc3RhdGljIGRlZmF1bHRzID0ge1xuICAgICAgICBkYXRhc2V0RWxlbWVudFR5cGU6IGZhbHNlLFxuICAgICAgICBkYXRhRWxlbWVudFR5cGU6ICdiYXInLFxuICAgICAgICBjYXRlZ29yeVBlcmNlbnRhZ2U6IDAuOCxcbiAgICAgICAgYmFyUGVyY2VudGFnZTogMC45LFxuICAgICAgICBncm91cGVkOiB0cnVlLFxuICAgICAgICBhbmltYXRpb25zOiB7XG4gICAgICAgICAgICBudW1iZXJzOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICAgICAgICAgICAgcHJvcGVydGllczogW1xuICAgICAgICAgICAgICAgICAgICAneCcsXG4gICAgICAgICAgICAgICAgICAgICd5JyxcbiAgICAgICAgICAgICAgICAgICAgJ2Jhc2UnLFxuICAgICAgICAgICAgICAgICAgICAnd2lkdGgnLFxuICAgICAgICAgICAgICAgICAgICAnaGVpZ2h0J1xuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gc3RhdGljIG92ZXJyaWRlcyA9IHtcbiAgICAgICAgc2NhbGVzOiB7XG4gICAgICAgICAgICBfaW5kZXhfOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2NhdGVnb3J5JyxcbiAgICAgICAgICAgICAgICBvZmZzZXQ6IHRydWUsXG4gICAgICAgICAgICAgICAgZ3JpZDoge1xuICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgX3ZhbHVlXzoge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdsaW5lYXInLFxuICAgICAgICAgICAgICAgIGJlZ2luQXRaZXJvOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuIHBhcnNlUHJpbWl0aXZlRGF0YShtZXRhLCBkYXRhLCBzdGFydCwgY291bnQpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlQXJyYXlPclByaW1pdGl2ZShtZXRhLCBkYXRhLCBzdGFydCwgY291bnQpO1xuICAgIH1cbiBwYXJzZUFycmF5RGF0YShtZXRhLCBkYXRhLCBzdGFydCwgY291bnQpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlQXJyYXlPclByaW1pdGl2ZShtZXRhLCBkYXRhLCBzdGFydCwgY291bnQpO1xuICAgIH1cbiBwYXJzZU9iamVjdERhdGEobWV0YSwgZGF0YSwgc3RhcnQsIGNvdW50KSB7XG4gICAgICAgIGNvbnN0IHsgaVNjYWxlICwgdlNjYWxlICB9ID0gbWV0YTtcbiAgICAgICAgY29uc3QgeyB4QXhpc0tleSA9J3gnICwgeUF4aXNLZXkgPSd5JyAgfSA9IHRoaXMuX3BhcnNpbmc7XG4gICAgICAgIGNvbnN0IGlBeGlzS2V5ID0gaVNjYWxlLmF4aXMgPT09ICd4JyA/IHhBeGlzS2V5IDogeUF4aXNLZXk7XG4gICAgICAgIGNvbnN0IHZBeGlzS2V5ID0gdlNjYWxlLmF4aXMgPT09ICd4JyA/IHhBeGlzS2V5IDogeUF4aXNLZXk7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IFtdO1xuICAgICAgICBsZXQgaSwgaWxlbiwgaXRlbSwgb2JqO1xuICAgICAgICBmb3IoaSA9IHN0YXJ0LCBpbGVuID0gc3RhcnQgKyBjb3VudDsgaSA8IGlsZW47ICsraSl7XG4gICAgICAgICAgICBvYmogPSBkYXRhW2ldO1xuICAgICAgICAgICAgaXRlbSA9IHt9O1xuICAgICAgICAgICAgaXRlbVtpU2NhbGUuYXhpc10gPSBpU2NhbGUucGFyc2UocmVzb2x2ZU9iamVjdEtleShvYmosIGlBeGlzS2V5KSwgaSk7XG4gICAgICAgICAgICBwYXJzZWQucHVzaChwYXJzZVZhbHVlKHJlc29sdmVPYmplY3RLZXkob2JqLCB2QXhpc0tleSksIGl0ZW0sIHZTY2FsZSwgaSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJzZWQ7XG4gICAgfVxuIHVwZGF0ZVJhbmdlRnJvbVBhcnNlZChyYW5nZSwgc2NhbGUsIHBhcnNlZCwgc3RhY2spIHtcbiAgICAgICAgc3VwZXIudXBkYXRlUmFuZ2VGcm9tUGFyc2VkKHJhbmdlLCBzY2FsZSwgcGFyc2VkLCBzdGFjayk7XG4gICAgICAgIGNvbnN0IGN1c3RvbSA9IHBhcnNlZC5fY3VzdG9tO1xuICAgICAgICBpZiAoY3VzdG9tICYmIHNjYWxlID09PSB0aGlzLl9jYWNoZWRNZXRhLnZTY2FsZSkge1xuICAgICAgICAgICAgcmFuZ2UubWluID0gTWF0aC5taW4ocmFuZ2UubWluLCBjdXN0b20ubWluKTtcbiAgICAgICAgICAgIHJhbmdlLm1heCA9IE1hdGgubWF4KHJhbmdlLm1heCwgY3VzdG9tLm1heCk7XG4gICAgICAgIH1cbiAgICB9XG4gZ2V0TWF4T3ZlcmZsb3coKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiBnZXRMYWJlbEFuZFZhbHVlKGluZGV4KSB7XG4gICAgICAgIGNvbnN0IG1ldGEgPSB0aGlzLl9jYWNoZWRNZXRhO1xuICAgICAgICBjb25zdCB7IGlTY2FsZSAsIHZTY2FsZSAgfSA9IG1ldGE7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IHRoaXMuZ2V0UGFyc2VkKGluZGV4KTtcbiAgICAgICAgY29uc3QgY3VzdG9tID0gcGFyc2VkLl9jdXN0b207XG4gICAgICAgIGNvbnN0IHZhbHVlID0gaXNGbG9hdEJhcihjdXN0b20pID8gJ1snICsgY3VzdG9tLnN0YXJ0ICsgJywgJyArIGN1c3RvbS5lbmQgKyAnXScgOiAnJyArIHZTY2FsZS5nZXRMYWJlbEZvclZhbHVlKHBhcnNlZFt2U2NhbGUuYXhpc10pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGFiZWw6ICcnICsgaVNjYWxlLmdldExhYmVsRm9yVmFsdWUocGFyc2VkW2lTY2FsZS5heGlzXSksXG4gICAgICAgICAgICB2YWx1ZVxuICAgICAgICB9O1xuICAgIH1cbiAgICBpbml0aWFsaXplKCkge1xuICAgICAgICB0aGlzLmVuYWJsZU9wdGlvblNoYXJpbmcgPSB0cnVlO1xuICAgICAgICBzdXBlci5pbml0aWFsaXplKCk7XG4gICAgICAgIGNvbnN0IG1ldGEgPSB0aGlzLl9jYWNoZWRNZXRhO1xuICAgICAgICBtZXRhLnN0YWNrID0gdGhpcy5nZXREYXRhc2V0KCkuc3RhY2s7XG4gICAgfVxuICAgIHVwZGF0ZShtb2RlKSB7XG4gICAgICAgIGNvbnN0IG1ldGEgPSB0aGlzLl9jYWNoZWRNZXRhO1xuICAgICAgICB0aGlzLnVwZGF0ZUVsZW1lbnRzKG1ldGEuZGF0YSwgMCwgbWV0YS5kYXRhLmxlbmd0aCwgbW9kZSk7XG4gICAgfVxuICAgIHVwZGF0ZUVsZW1lbnRzKGJhcnMsIHN0YXJ0LCBjb3VudCwgbW9kZSkge1xuICAgICAgICBjb25zdCByZXNldCA9IG1vZGUgPT09ICdyZXNldCc7XG4gICAgICAgIGNvbnN0IHsgaW5kZXggLCBfY2FjaGVkTWV0YTogeyB2U2NhbGUgIH0gIH0gPSB0aGlzO1xuICAgICAgICBjb25zdCBiYXNlID0gdlNjYWxlLmdldEJhc2VQaXhlbCgpO1xuICAgICAgICBjb25zdCBob3Jpem9udGFsID0gdlNjYWxlLmlzSG9yaXpvbnRhbCgpO1xuICAgICAgICBjb25zdCBydWxlciA9IHRoaXMuX2dldFJ1bGVyKCk7XG4gICAgICAgIGNvbnN0IHsgc2hhcmVkT3B0aW9ucyAsIGluY2x1ZGVPcHRpb25zICB9ID0gdGhpcy5fZ2V0U2hhcmVkT3B0aW9ucyhzdGFydCwgbW9kZSk7XG4gICAgICAgIGZvcihsZXQgaSA9IHN0YXJ0OyBpIDwgc3RhcnQgKyBjb3VudDsgaSsrKXtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IHRoaXMuZ2V0UGFyc2VkKGkpO1xuICAgICAgICAgICAgY29uc3QgdnBpeGVscyA9IHJlc2V0IHx8IGlzTnVsbE9yVW5kZWYocGFyc2VkW3ZTY2FsZS5heGlzXSkgPyB7XG4gICAgICAgICAgICAgICAgYmFzZSxcbiAgICAgICAgICAgICAgICBoZWFkOiBiYXNlXG4gICAgICAgICAgICB9IDogdGhpcy5fY2FsY3VsYXRlQmFyVmFsdWVQaXhlbHMoaSk7XG4gICAgICAgICAgICBjb25zdCBpcGl4ZWxzID0gdGhpcy5fY2FsY3VsYXRlQmFySW5kZXhQaXhlbHMoaSwgcnVsZXIpO1xuICAgICAgICAgICAgY29uc3Qgc3RhY2sgPSAocGFyc2VkLl9zdGFja3MgfHwge30pW3ZTY2FsZS5heGlzXTtcbiAgICAgICAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSB7XG4gICAgICAgICAgICAgICAgaG9yaXpvbnRhbCxcbiAgICAgICAgICAgICAgICBiYXNlOiB2cGl4ZWxzLmJhc2UsXG4gICAgICAgICAgICAgICAgZW5hYmxlQm9yZGVyUmFkaXVzOiAhc3RhY2sgfHwgaXNGbG9hdEJhcihwYXJzZWQuX2N1c3RvbSkgfHwgaW5kZXggPT09IHN0YWNrLl90b3AgfHwgaW5kZXggPT09IHN0YWNrLl9ib3R0b20sXG4gICAgICAgICAgICAgICAgeDogaG9yaXpvbnRhbCA/IHZwaXhlbHMuaGVhZCA6IGlwaXhlbHMuY2VudGVyLFxuICAgICAgICAgICAgICAgIHk6IGhvcml6b250YWwgPyBpcGl4ZWxzLmNlbnRlciA6IHZwaXhlbHMuaGVhZCxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IGhvcml6b250YWwgPyBpcGl4ZWxzLnNpemUgOiBNYXRoLmFicyh2cGl4ZWxzLnNpemUpLFxuICAgICAgICAgICAgICAgIHdpZHRoOiBob3Jpem9udGFsID8gTWF0aC5hYnModnBpeGVscy5zaXplKSA6IGlwaXhlbHMuc2l6ZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChpbmNsdWRlT3B0aW9ucykge1xuICAgICAgICAgICAgICAgIHByb3BlcnRpZXMub3B0aW9ucyA9IHNoYXJlZE9wdGlvbnMgfHwgdGhpcy5yZXNvbHZlRGF0YUVsZW1lbnRPcHRpb25zKGksIGJhcnNbaV0uYWN0aXZlID8gJ2FjdGl2ZScgOiBtb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSBwcm9wZXJ0aWVzLm9wdGlvbnMgfHwgYmFyc1tpXS5vcHRpb25zO1xuICAgICAgICAgICAgc2V0Qm9yZGVyU2tpcHBlZChwcm9wZXJ0aWVzLCBvcHRpb25zLCBzdGFjaywgaW5kZXgpO1xuICAgICAgICAgICAgc2V0SW5mbGF0ZUFtb3VudChwcm9wZXJ0aWVzLCBvcHRpb25zLCBydWxlci5yYXRpbyk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUVsZW1lbnQoYmFyc1tpXSwgaSwgcHJvcGVydGllcywgbW9kZSk7XG4gICAgICAgIH1cbiAgICB9XG4gX2dldFN0YWNrcyhsYXN0LCBkYXRhSW5kZXgpIHtcbiAgICAgICAgY29uc3QgeyBpU2NhbGUgIH0gPSB0aGlzLl9jYWNoZWRNZXRhO1xuICAgICAgICBjb25zdCBtZXRhc2V0cyA9IGlTY2FsZS5nZXRNYXRjaGluZ1Zpc2libGVNZXRhcyh0aGlzLl90eXBlKS5maWx0ZXIoKG1ldGEpPT5tZXRhLmNvbnRyb2xsZXIub3B0aW9ucy5ncm91cGVkKTtcbiAgICAgICAgY29uc3Qgc3RhY2tlZCA9IGlTY2FsZS5vcHRpb25zLnN0YWNrZWQ7XG4gICAgICAgIGNvbnN0IHN0YWNrcyA9IFtdO1xuICAgICAgICBjb25zdCBza2lwTnVsbCA9IChtZXRhKT0+e1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gbWV0YS5jb250cm9sbGVyLmdldFBhcnNlZChkYXRhSW5kZXgpO1xuICAgICAgICAgICAgY29uc3QgdmFsID0gcGFyc2VkICYmIHBhcnNlZFttZXRhLnZTY2FsZS5heGlzXTtcbiAgICAgICAgICAgIGlmIChpc051bGxPclVuZGVmKHZhbCkgfHwgaXNOYU4odmFsKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBmb3IgKGNvbnN0IG1ldGEgb2YgbWV0YXNldHMpe1xuICAgICAgICAgICAgaWYgKGRhdGFJbmRleCAhPT0gdW5kZWZpbmVkICYmIHNraXBOdWxsKG1ldGEpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3RhY2tlZCA9PT0gZmFsc2UgfHwgc3RhY2tzLmluZGV4T2YobWV0YS5zdGFjaykgPT09IC0xIHx8IHN0YWNrZWQgPT09IHVuZGVmaW5lZCAmJiBtZXRhLnN0YWNrID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBzdGFja3MucHVzaChtZXRhLnN0YWNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtZXRhLmluZGV4ID09PSBsYXN0KSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzdGFja3MubGVuZ3RoKSB7XG4gICAgICAgICAgICBzdGFja3MucHVzaCh1bmRlZmluZWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdGFja3M7XG4gICAgfVxuIF9nZXRTdGFja0NvdW50KGluZGV4KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRTdGFja3ModW5kZWZpbmVkLCBpbmRleCkubGVuZ3RoO1xuICAgIH1cbiBfZ2V0U3RhY2tJbmRleChkYXRhc2V0SW5kZXgsIG5hbWUsIGRhdGFJbmRleCkge1xuICAgICAgICBjb25zdCBzdGFja3MgPSB0aGlzLl9nZXRTdGFja3MoZGF0YXNldEluZGV4LCBkYXRhSW5kZXgpO1xuICAgICAgICBjb25zdCBpbmRleCA9IG5hbWUgIT09IHVuZGVmaW5lZCA/IHN0YWNrcy5pbmRleE9mKG5hbWUpIDogLTE7XG4gICAgICAgIHJldHVybiBpbmRleCA9PT0gLTEgPyBzdGFja3MubGVuZ3RoIC0gMSA6IGluZGV4O1xuICAgIH1cbiBfZ2V0UnVsZXIoKSB7XG4gICAgICAgIGNvbnN0IG9wdHMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIGNvbnN0IG1ldGEgPSB0aGlzLl9jYWNoZWRNZXRhO1xuICAgICAgICBjb25zdCBpU2NhbGUgPSBtZXRhLmlTY2FsZTtcbiAgICAgICAgY29uc3QgcGl4ZWxzID0gW107XG4gICAgICAgIGxldCBpLCBpbGVuO1xuICAgICAgICBmb3IoaSA9IDAsIGlsZW4gPSBtZXRhLmRhdGEubGVuZ3RoOyBpIDwgaWxlbjsgKytpKXtcbiAgICAgICAgICAgIHBpeGVscy5wdXNoKGlTY2FsZS5nZXRQaXhlbEZvclZhbHVlKHRoaXMuZ2V0UGFyc2VkKGkpW2lTY2FsZS5heGlzXSwgaSkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJhclRoaWNrbmVzcyA9IG9wdHMuYmFyVGhpY2tuZXNzO1xuICAgICAgICBjb25zdCBtaW4gPSBiYXJUaGlja25lc3MgfHwgY29tcHV0ZU1pblNhbXBsZVNpemUobWV0YSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtaW4sXG4gICAgICAgICAgICBwaXhlbHMsXG4gICAgICAgICAgICBzdGFydDogaVNjYWxlLl9zdGFydFBpeGVsLFxuICAgICAgICAgICAgZW5kOiBpU2NhbGUuX2VuZFBpeGVsLFxuICAgICAgICAgICAgc3RhY2tDb3VudDogdGhpcy5fZ2V0U3RhY2tDb3VudCgpLFxuICAgICAgICAgICAgc2NhbGU6IGlTY2FsZSxcbiAgICAgICAgICAgIGdyb3VwZWQ6IG9wdHMuZ3JvdXBlZCxcbiAgICAgICAgICAgIHJhdGlvOiBiYXJUaGlja25lc3MgPyAxIDogb3B0cy5jYXRlZ29yeVBlcmNlbnRhZ2UgKiBvcHRzLmJhclBlcmNlbnRhZ2VcbiAgICAgICAgfTtcbiAgICB9XG4gX2NhbGN1bGF0ZUJhclZhbHVlUGl4ZWxzKGluZGV4KSB7XG4gICAgICAgIGNvbnN0IHsgX2NhY2hlZE1ldGE6IHsgdlNjYWxlICwgX3N0YWNrZWQgLCBpbmRleDogZGF0YXNldEluZGV4ICB9ICwgb3B0aW9uczogeyBiYXNlOiBiYXNlVmFsdWUgLCBtaW5CYXJMZW5ndGggIH0gIH0gPSB0aGlzO1xuICAgICAgICBjb25zdCBhY3R1YWxCYXNlID0gYmFzZVZhbHVlIHx8IDA7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IHRoaXMuZ2V0UGFyc2VkKGluZGV4KTtcbiAgICAgICAgY29uc3QgY3VzdG9tID0gcGFyc2VkLl9jdXN0b207XG4gICAgICAgIGNvbnN0IGZsb2F0aW5nID0gaXNGbG9hdEJhcihjdXN0b20pO1xuICAgICAgICBsZXQgdmFsdWUgPSBwYXJzZWRbdlNjYWxlLmF4aXNdO1xuICAgICAgICBsZXQgc3RhcnQgPSAwO1xuICAgICAgICBsZXQgbGVuZ3RoID0gX3N0YWNrZWQgPyB0aGlzLmFwcGx5U3RhY2sodlNjYWxlLCBwYXJzZWQsIF9zdGFja2VkKSA6IHZhbHVlO1xuICAgICAgICBsZXQgaGVhZCwgc2l6ZTtcbiAgICAgICAgaWYgKGxlbmd0aCAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgIHN0YXJ0ID0gbGVuZ3RoIC0gdmFsdWU7XG4gICAgICAgICAgICBsZW5ndGggPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmxvYXRpbmcpIHtcbiAgICAgICAgICAgIHZhbHVlID0gY3VzdG9tLmJhclN0YXJ0O1xuICAgICAgICAgICAgbGVuZ3RoID0gY3VzdG9tLmJhckVuZCAtIGN1c3RvbS5iYXJTdGFydDtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gMCAmJiBzaWduKHZhbHVlKSAhPT0gc2lnbihjdXN0b20uYmFyRW5kKSkge1xuICAgICAgICAgICAgICAgIHN0YXJ0ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0YXJ0ICs9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0YXJ0VmFsdWUgPSAhaXNOdWxsT3JVbmRlZihiYXNlVmFsdWUpICYmICFmbG9hdGluZyA/IGJhc2VWYWx1ZSA6IHN0YXJ0O1xuICAgICAgICBsZXQgYmFzZSA9IHZTY2FsZS5nZXRQaXhlbEZvclZhbHVlKHN0YXJ0VmFsdWUpO1xuICAgICAgICBpZiAodGhpcy5jaGFydC5nZXREYXRhVmlzaWJpbGl0eShpbmRleCkpIHtcbiAgICAgICAgICAgIGhlYWQgPSB2U2NhbGUuZ2V0UGl4ZWxGb3JWYWx1ZShzdGFydCArIGxlbmd0aCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBoZWFkID0gYmFzZTtcbiAgICAgICAgfVxuICAgICAgICBzaXplID0gaGVhZCAtIGJhc2U7XG4gICAgICAgIGlmIChNYXRoLmFicyhzaXplKSA8IG1pbkJhckxlbmd0aCkge1xuICAgICAgICAgICAgc2l6ZSA9IGJhclNpZ24oc2l6ZSwgdlNjYWxlLCBhY3R1YWxCYXNlKSAqIG1pbkJhckxlbmd0aDtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gYWN0dWFsQmFzZSkge1xuICAgICAgICAgICAgICAgIGJhc2UgLT0gc2l6ZSAvIDI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBzdGFydFBpeGVsID0gdlNjYWxlLmdldFBpeGVsRm9yRGVjaW1hbCgwKTtcbiAgICAgICAgICAgIGNvbnN0IGVuZFBpeGVsID0gdlNjYWxlLmdldFBpeGVsRm9yRGVjaW1hbCgxKTtcbiAgICAgICAgICAgIGNvbnN0IG1pbiA9IE1hdGgubWluKHN0YXJ0UGl4ZWwsIGVuZFBpeGVsKTtcbiAgICAgICAgICAgIGNvbnN0IG1heCA9IE1hdGgubWF4KHN0YXJ0UGl4ZWwsIGVuZFBpeGVsKTtcbiAgICAgICAgICAgIGJhc2UgPSBNYXRoLm1heChNYXRoLm1pbihiYXNlLCBtYXgpLCBtaW4pO1xuICAgICAgICAgICAgaGVhZCA9IGJhc2UgKyBzaXplO1xuICAgICAgICAgICAgaWYgKF9zdGFja2VkICYmICFmbG9hdGluZykge1xuICAgICAgICAgICAgICAgIHBhcnNlZC5fc3RhY2tzW3ZTY2FsZS5heGlzXS5fdmlzdWFsVmFsdWVzW2RhdGFzZXRJbmRleF0gPSB2U2NhbGUuZ2V0VmFsdWVGb3JQaXhlbChoZWFkKSAtIHZTY2FsZS5nZXRWYWx1ZUZvclBpeGVsKGJhc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChiYXNlID09PSB2U2NhbGUuZ2V0UGl4ZWxGb3JWYWx1ZShhY3R1YWxCYXNlKSkge1xuICAgICAgICAgICAgY29uc3QgaGFsZkdyaWQgPSBzaWduKHNpemUpICogdlNjYWxlLmdldExpbmVXaWR0aEZvclZhbHVlKGFjdHVhbEJhc2UpIC8gMjtcbiAgICAgICAgICAgIGJhc2UgKz0gaGFsZkdyaWQ7XG4gICAgICAgICAgICBzaXplIC09IGhhbGZHcmlkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzaXplLFxuICAgICAgICAgICAgYmFzZSxcbiAgICAgICAgICAgIGhlYWQsXG4gICAgICAgICAgICBjZW50ZXI6IGhlYWQgKyBzaXplIC8gMlxuICAgICAgICB9O1xuICAgIH1cbiBfY2FsY3VsYXRlQmFySW5kZXhQaXhlbHMoaW5kZXgsIHJ1bGVyKSB7XG4gICAgICAgIGNvbnN0IHNjYWxlID0gcnVsZXIuc2NhbGU7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIGNvbnN0IHNraXBOdWxsID0gb3B0aW9ucy5za2lwTnVsbDtcbiAgICAgICAgY29uc3QgbWF4QmFyVGhpY2tuZXNzID0gdmFsdWVPckRlZmF1bHQob3B0aW9ucy5tYXhCYXJUaGlja25lc3MsIEluZmluaXR5KTtcbiAgICAgICAgbGV0IGNlbnRlciwgc2l6ZTtcbiAgICAgICAgaWYgKHJ1bGVyLmdyb3VwZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YWNrQ291bnQgPSBza2lwTnVsbCA/IHRoaXMuX2dldFN0YWNrQ291bnQoaW5kZXgpIDogcnVsZXIuc3RhY2tDb3VudDtcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gb3B0aW9ucy5iYXJUaGlja25lc3MgPT09ICdmbGV4JyA/IGNvbXB1dGVGbGV4Q2F0ZWdvcnlUcmFpdHMoaW5kZXgsIHJ1bGVyLCBvcHRpb25zLCBzdGFja0NvdW50KSA6IGNvbXB1dGVGaXRDYXRlZ29yeVRyYWl0cyhpbmRleCwgcnVsZXIsIG9wdGlvbnMsIHN0YWNrQ291bnQpO1xuICAgICAgICAgICAgY29uc3Qgc3RhY2tJbmRleCA9IHRoaXMuX2dldFN0YWNrSW5kZXgodGhpcy5pbmRleCwgdGhpcy5fY2FjaGVkTWV0YS5zdGFjaywgc2tpcE51bGwgPyBpbmRleCA6IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICBjZW50ZXIgPSByYW5nZS5zdGFydCArIHJhbmdlLmNodW5rICogc3RhY2tJbmRleCArIHJhbmdlLmNodW5rIC8gMjtcbiAgICAgICAgICAgIHNpemUgPSBNYXRoLm1pbihtYXhCYXJUaGlja25lc3MsIHJhbmdlLmNodW5rICogcmFuZ2UucmF0aW8pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2VudGVyID0gc2NhbGUuZ2V0UGl4ZWxGb3JWYWx1ZSh0aGlzLmdldFBhcnNlZChpbmRleClbc2NhbGUuYXhpc10sIGluZGV4KTtcbiAgICAgICAgICAgIHNpemUgPSBNYXRoLm1pbihtYXhCYXJUaGlja25lc3MsIHJ1bGVyLm1pbiAqIHJ1bGVyLnJhdGlvKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYmFzZTogY2VudGVyIC0gc2l6ZSAvIDIsXG4gICAgICAgICAgICBoZWFkOiBjZW50ZXIgKyBzaXplIC8gMixcbiAgICAgICAgICAgIGNlbnRlcixcbiAgICAgICAgICAgIHNpemVcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZHJhdygpIHtcbiAgICAgICAgY29uc3QgbWV0YSA9IHRoaXMuX2NhY2hlZE1ldGE7XG4gICAgICAgIGNvbnN0IHZTY2FsZSA9IG1ldGEudlNjYWxlO1xuICAgICAgICBjb25zdCByZWN0cyA9IG1ldGEuZGF0YTtcbiAgICAgICAgY29uc3QgaWxlbiA9IHJlY3RzLmxlbmd0aDtcbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICBmb3IoOyBpIDwgaWxlbjsgKytpKXtcbiAgICAgICAgICAgIGlmICh0aGlzLmdldFBhcnNlZChpKVt2U2NhbGUuYXhpc10gIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZWN0c1tpXS5kcmF3KHRoaXMuX2N0eCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmNsYXNzIEJ1YmJsZUNvbnRyb2xsZXIgZXh0ZW5kcyBEYXRhc2V0Q29udHJvbGxlciB7XG4gICAgc3RhdGljIGlkID0gJ2J1YmJsZSc7XG4gc3RhdGljIGRlZmF1bHRzID0ge1xuICAgICAgICBkYXRhc2V0RWxlbWVudFR5cGU6IGZhbHNlLFxuICAgICAgICBkYXRhRWxlbWVudFR5cGU6ICdwb2ludCcsXG4gICAgICAgIGFuaW1hdGlvbnM6IHtcbiAgICAgICAgICAgIG51bWJlcnM6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiBbXG4gICAgICAgICAgICAgICAgICAgICd4JyxcbiAgICAgICAgICAgICAgICAgICAgJ3knLFxuICAgICAgICAgICAgICAgICAgICAnYm9yZGVyV2lkdGgnLFxuICAgICAgICAgICAgICAgICAgICAncmFkaXVzJ1xuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gc3RhdGljIG92ZXJyaWRlcyA9IHtcbiAgICAgICAgc2NhbGVzOiB7XG4gICAgICAgICAgICB4OiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2xpbmVhcidcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB5OiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2xpbmVhcidcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgaW5pdGlhbGl6ZSgpIHtcbiAgICAgICAgdGhpcy5lbmFibGVPcHRpb25TaGFyaW5nID0gdHJ1ZTtcbiAgICAgICAgc3VwZXIuaW5pdGlhbGl6ZSgpO1xuICAgIH1cbiBwYXJzZVByaW1pdGl2ZURhdGEobWV0YSwgZGF0YSwgc3RhcnQsIGNvdW50KSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IHN1cGVyLnBhcnNlUHJpbWl0aXZlRGF0YShtZXRhLCBkYXRhLCBzdGFydCwgY291bnQpO1xuICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgcGFyc2VkLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgIHBhcnNlZFtpXS5fY3VzdG9tID0gdGhpcy5yZXNvbHZlRGF0YUVsZW1lbnRPcHRpb25zKGkgKyBzdGFydCkucmFkaXVzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJzZWQ7XG4gICAgfVxuIHBhcnNlQXJyYXlEYXRhKG1ldGEsIGRhdGEsIHN0YXJ0LCBjb3VudCkge1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBzdXBlci5wYXJzZUFycmF5RGF0YShtZXRhLCBkYXRhLCBzdGFydCwgY291bnQpO1xuICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgcGFyc2VkLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBkYXRhW3N0YXJ0ICsgaV07XG4gICAgICAgICAgICBwYXJzZWRbaV0uX2N1c3RvbSA9IHZhbHVlT3JEZWZhdWx0KGl0ZW1bMl0sIHRoaXMucmVzb2x2ZURhdGFFbGVtZW50T3B0aW9ucyhpICsgc3RhcnQpLnJhZGl1cyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcnNlZDtcbiAgICB9XG4gcGFyc2VPYmplY3REYXRhKG1ldGEsIGRhdGEsIHN0YXJ0LCBjb3VudCkge1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBzdXBlci5wYXJzZU9iamVjdERhdGEobWV0YSwgZGF0YSwgc3RhcnQsIGNvdW50KTtcbiAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IHBhcnNlZC5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICBjb25zdCBpdGVtID0gZGF0YVtzdGFydCArIGldO1xuICAgICAgICAgICAgcGFyc2VkW2ldLl9jdXN0b20gPSB2YWx1ZU9yRGVmYXVsdChpdGVtICYmIGl0ZW0uciAmJiAraXRlbS5yLCB0aGlzLnJlc29sdmVEYXRhRWxlbWVudE9wdGlvbnMoaSArIHN0YXJ0KS5yYWRpdXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJzZWQ7XG4gICAgfVxuIGdldE1heE92ZXJmbG93KCkge1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5fY2FjaGVkTWV0YS5kYXRhO1xuICAgICAgICBsZXQgbWF4ID0gMDtcbiAgICAgICAgZm9yKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IC0taSl7XG4gICAgICAgICAgICBtYXggPSBNYXRoLm1heChtYXgsIGRhdGFbaV0uc2l6ZSh0aGlzLnJlc29sdmVEYXRhRWxlbWVudE9wdGlvbnMoaSkpIC8gMik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1heCA+IDAgJiYgbWF4O1xuICAgIH1cbiBnZXRMYWJlbEFuZFZhbHVlKGluZGV4KSB7XG4gICAgICAgIGNvbnN0IG1ldGEgPSB0aGlzLl9jYWNoZWRNZXRhO1xuICAgICAgICBjb25zdCBsYWJlbHMgPSB0aGlzLmNoYXJ0LmRhdGEubGFiZWxzIHx8IFtdO1xuICAgICAgICBjb25zdCB7IHhTY2FsZSAsIHlTY2FsZSAgfSA9IG1ldGE7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IHRoaXMuZ2V0UGFyc2VkKGluZGV4KTtcbiAgICAgICAgY29uc3QgeCA9IHhTY2FsZS5nZXRMYWJlbEZvclZhbHVlKHBhcnNlZC54KTtcbiAgICAgICAgY29uc3QgeSA9IHlTY2FsZS5nZXRMYWJlbEZvclZhbHVlKHBhcnNlZC55KTtcbiAgICAgICAgY29uc3QgciA9IHBhcnNlZC5fY3VzdG9tO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGFiZWw6IGxhYmVsc1tpbmRleF0gfHwgJycsXG4gICAgICAgICAgICB2YWx1ZTogJygnICsgeCArICcsICcgKyB5ICsgKHIgPyAnLCAnICsgciA6ICcnKSArICcpJ1xuICAgICAgICB9O1xuICAgIH1cbiAgICB1cGRhdGUobW9kZSkge1xuICAgICAgICBjb25zdCBwb2ludHMgPSB0aGlzLl9jYWNoZWRNZXRhLmRhdGE7XG4gICAgICAgIHRoaXMudXBkYXRlRWxlbWVudHMocG9pbnRzLCAwLCBwb2ludHMubGVuZ3RoLCBtb2RlKTtcbiAgICB9XG4gICAgdXBkYXRlRWxlbWVudHMocG9pbnRzLCBzdGFydCwgY291bnQsIG1vZGUpIHtcbiAgICAgICAgY29uc3QgcmVzZXQgPSBtb2RlID09PSAncmVzZXQnO1xuICAgICAgICBjb25zdCB7IGlTY2FsZSAsIHZTY2FsZSAgfSA9IHRoaXMuX2NhY2hlZE1ldGE7XG4gICAgICAgIGNvbnN0IHsgc2hhcmVkT3B0aW9ucyAsIGluY2x1ZGVPcHRpb25zICB9ID0gdGhpcy5fZ2V0U2hhcmVkT3B0aW9ucyhzdGFydCwgbW9kZSk7XG4gICAgICAgIGNvbnN0IGlBeGlzID0gaVNjYWxlLmF4aXM7XG4gICAgICAgIGNvbnN0IHZBeGlzID0gdlNjYWxlLmF4aXM7XG4gICAgICAgIGZvcihsZXQgaSA9IHN0YXJ0OyBpIDwgc3RhcnQgKyBjb3VudDsgaSsrKXtcbiAgICAgICAgICAgIGNvbnN0IHBvaW50ID0gcG9pbnRzW2ldO1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gIXJlc2V0ICYmIHRoaXMuZ2V0UGFyc2VkKGkpO1xuICAgICAgICAgICAgY29uc3QgcHJvcGVydGllcyA9IHt9O1xuICAgICAgICAgICAgY29uc3QgaVBpeGVsID0gcHJvcGVydGllc1tpQXhpc10gPSByZXNldCA/IGlTY2FsZS5nZXRQaXhlbEZvckRlY2ltYWwoMC41KSA6IGlTY2FsZS5nZXRQaXhlbEZvclZhbHVlKHBhcnNlZFtpQXhpc10pO1xuICAgICAgICAgICAgY29uc3QgdlBpeGVsID0gcHJvcGVydGllc1t2QXhpc10gPSByZXNldCA/IHZTY2FsZS5nZXRCYXNlUGl4ZWwoKSA6IHZTY2FsZS5nZXRQaXhlbEZvclZhbHVlKHBhcnNlZFt2QXhpc10pO1xuICAgICAgICAgICAgcHJvcGVydGllcy5za2lwID0gaXNOYU4oaVBpeGVsKSB8fCBpc05hTih2UGl4ZWwpO1xuICAgICAgICAgICAgaWYgKGluY2x1ZGVPcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgcHJvcGVydGllcy5vcHRpb25zID0gc2hhcmVkT3B0aW9ucyB8fCB0aGlzLnJlc29sdmVEYXRhRWxlbWVudE9wdGlvbnMoaSwgcG9pbnQuYWN0aXZlID8gJ2FjdGl2ZScgOiBtb2RlKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcy5vcHRpb25zLnJhZGl1cyA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy51cGRhdGVFbGVtZW50KHBvaW50LCBpLCBwcm9wZXJ0aWVzLCBtb2RlKTtcbiAgICAgICAgfVxuICAgIH1cbiByZXNvbHZlRGF0YUVsZW1lbnRPcHRpb25zKGluZGV4LCBtb2RlKSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IHRoaXMuZ2V0UGFyc2VkKGluZGV4KTtcbiAgICAgICAgbGV0IHZhbHVlcyA9IHN1cGVyLnJlc29sdmVEYXRhRWxlbWVudE9wdGlvbnMoaW5kZXgsIG1vZGUpO1xuICAgICAgICBpZiAodmFsdWVzLiRzaGFyZWQpIHtcbiAgICAgICAgICAgIHZhbHVlcyA9IE9iamVjdC5hc3NpZ24oe30sIHZhbHVlcywge1xuICAgICAgICAgICAgICAgICRzaGFyZWQ6IGZhbHNlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByYWRpdXMgPSB2YWx1ZXMucmFkaXVzO1xuICAgICAgICBpZiAobW9kZSAhPT0gJ2FjdGl2ZScpIHtcbiAgICAgICAgICAgIHZhbHVlcy5yYWRpdXMgPSAwO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlcy5yYWRpdXMgKz0gdmFsdWVPckRlZmF1bHQocGFyc2VkICYmIHBhcnNlZC5fY3VzdG9tLCByYWRpdXMpO1xuICAgICAgICByZXR1cm4gdmFsdWVzO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZ2V0UmF0aW9BbmRPZmZzZXQocm90YXRpb24sIGNpcmN1bWZlcmVuY2UsIGN1dG91dCkge1xuICAgIGxldCByYXRpb1ggPSAxO1xuICAgIGxldCByYXRpb1kgPSAxO1xuICAgIGxldCBvZmZzZXRYID0gMDtcbiAgICBsZXQgb2Zmc2V0WSA9IDA7XG4gICAgaWYgKGNpcmN1bWZlcmVuY2UgPCBUQVUpIHtcbiAgICAgICAgY29uc3Qgc3RhcnRBbmdsZSA9IHJvdGF0aW9uO1xuICAgICAgICBjb25zdCBlbmRBbmdsZSA9IHN0YXJ0QW5nbGUgKyBjaXJjdW1mZXJlbmNlO1xuICAgICAgICBjb25zdCBzdGFydFggPSBNYXRoLmNvcyhzdGFydEFuZ2xlKTtcbiAgICAgICAgY29uc3Qgc3RhcnRZID0gTWF0aC5zaW4oc3RhcnRBbmdsZSk7XG4gICAgICAgIGNvbnN0IGVuZFggPSBNYXRoLmNvcyhlbmRBbmdsZSk7XG4gICAgICAgIGNvbnN0IGVuZFkgPSBNYXRoLnNpbihlbmRBbmdsZSk7XG4gICAgICAgIGNvbnN0IGNhbGNNYXggPSAoYW5nbGUsIGEsIGIpPT5fYW5nbGVCZXR3ZWVuKGFuZ2xlLCBzdGFydEFuZ2xlLCBlbmRBbmdsZSwgdHJ1ZSkgPyAxIDogTWF0aC5tYXgoYSwgYSAqIGN1dG91dCwgYiwgYiAqIGN1dG91dCk7XG4gICAgICAgIGNvbnN0IGNhbGNNaW4gPSAoYW5nbGUsIGEsIGIpPT5fYW5nbGVCZXR3ZWVuKGFuZ2xlLCBzdGFydEFuZ2xlLCBlbmRBbmdsZSwgdHJ1ZSkgPyAtMSA6IE1hdGgubWluKGEsIGEgKiBjdXRvdXQsIGIsIGIgKiBjdXRvdXQpO1xuICAgICAgICBjb25zdCBtYXhYID0gY2FsY01heCgwLCBzdGFydFgsIGVuZFgpO1xuICAgICAgICBjb25zdCBtYXhZID0gY2FsY01heChIQUxGX1BJLCBzdGFydFksIGVuZFkpO1xuICAgICAgICBjb25zdCBtaW5YID0gY2FsY01pbihQSSwgc3RhcnRYLCBlbmRYKTtcbiAgICAgICAgY29uc3QgbWluWSA9IGNhbGNNaW4oUEkgKyBIQUxGX1BJLCBzdGFydFksIGVuZFkpO1xuICAgICAgICByYXRpb1ggPSAobWF4WCAtIG1pblgpIC8gMjtcbiAgICAgICAgcmF0aW9ZID0gKG1heFkgLSBtaW5ZKSAvIDI7XG4gICAgICAgIG9mZnNldFggPSAtKG1heFggKyBtaW5YKSAvIDI7XG4gICAgICAgIG9mZnNldFkgPSAtKG1heFkgKyBtaW5ZKSAvIDI7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHJhdGlvWCxcbiAgICAgICAgcmF0aW9ZLFxuICAgICAgICBvZmZzZXRYLFxuICAgICAgICBvZmZzZXRZXG4gICAgfTtcbn1cbmNsYXNzIERvdWdobnV0Q29udHJvbGxlciBleHRlbmRzIERhdGFzZXRDb250cm9sbGVyIHtcbiAgICBzdGF0aWMgaWQgPSAnZG91Z2hudXQnO1xuIHN0YXRpYyBkZWZhdWx0cyA9IHtcbiAgICAgICAgZGF0YXNldEVsZW1lbnRUeXBlOiBmYWxzZSxcbiAgICAgICAgZGF0YUVsZW1lbnRUeXBlOiAnYXJjJyxcbiAgICAgICAgYW5pbWF0aW9uOiB7XG4gICAgICAgICAgICBhbmltYXRlUm90YXRlOiB0cnVlLFxuICAgICAgICAgICAgYW5pbWF0ZVNjYWxlOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBhbmltYXRpb25zOiB7XG4gICAgICAgICAgICBudW1iZXJzOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICAgICAgICAgICAgcHJvcGVydGllczogW1xuICAgICAgICAgICAgICAgICAgICAnY2lyY3VtZmVyZW5jZScsXG4gICAgICAgICAgICAgICAgICAgICdlbmRBbmdsZScsXG4gICAgICAgICAgICAgICAgICAgICdpbm5lclJhZGl1cycsXG4gICAgICAgICAgICAgICAgICAgICdvdXRlclJhZGl1cycsXG4gICAgICAgICAgICAgICAgICAgICdzdGFydEFuZ2xlJyxcbiAgICAgICAgICAgICAgICAgICAgJ3gnLFxuICAgICAgICAgICAgICAgICAgICAneScsXG4gICAgICAgICAgICAgICAgICAgICdvZmZzZXQnLFxuICAgICAgICAgICAgICAgICAgICAnYm9yZGVyV2lkdGgnLFxuICAgICAgICAgICAgICAgICAgICAnc3BhY2luZydcbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGN1dG91dDogJzUwJScsXG4gICAgICAgIHJvdGF0aW9uOiAwLFxuICAgICAgICBjaXJjdW1mZXJlbmNlOiAzNjAsXG4gICAgICAgIHJhZGl1czogJzEwMCUnLFxuICAgICAgICBzcGFjaW5nOiAwLFxuICAgICAgICBpbmRleEF4aXM6ICdyJ1xuICAgIH07XG4gICAgc3RhdGljIGRlc2NyaXB0b3JzID0ge1xuICAgICAgICBfc2NyaXB0YWJsZTogKG5hbWUpPT5uYW1lICE9PSAnc3BhY2luZycsXG4gICAgICAgIF9pbmRleGFibGU6IChuYW1lKT0+bmFtZSAhPT0gJ3NwYWNpbmcnICYmICFuYW1lLnN0YXJ0c1dpdGgoJ2JvcmRlckRhc2gnKSAmJiAhbmFtZS5zdGFydHNXaXRoKCdob3ZlckJvcmRlckRhc2gnKVxuICAgIH07XG4gc3RhdGljIG92ZXJyaWRlcyA9IHtcbiAgICAgICAgYXNwZWN0UmF0aW86IDEsXG4gICAgICAgIHBsdWdpbnM6IHtcbiAgICAgICAgICAgIGxlZ2VuZDoge1xuICAgICAgICAgICAgICAgIGxhYmVsczoge1xuICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZUxhYmVscyAoY2hhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBjaGFydC5kYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEubGFiZWxzLmxlbmd0aCAmJiBkYXRhLmRhdGFzZXRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgbGFiZWxzOiB7IHBvaW50U3R5bGUgLCBjb2xvciAgfSAgfSA9IGNoYXJ0LmxlZ2VuZC5vcHRpb25zO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhLmxhYmVscy5tYXAoKGxhYmVsLCBpKT0+e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXRhID0gY2hhcnQuZ2V0RGF0YXNldE1ldGEoMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0eWxlID0gbWV0YS5jb250cm9sbGVyLmdldFN0eWxlKGkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogbGFiZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsU3R5bGU6IHN0eWxlLmJhY2tncm91bmRDb2xvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZVN0eWxlOiBzdHlsZS5ib3JkZXJDb2xvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRDb2xvcjogY29sb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lV2lkdGg6IHN0eWxlLmJvcmRlcldpZHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRTdHlsZTogcG9pbnRTdHlsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGRlbjogIWNoYXJ0LmdldERhdGFWaXNpYmlsaXR5KGkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgb25DbGljayAoZSwgbGVnZW5kSXRlbSwgbGVnZW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5jaGFydC50b2dnbGVEYXRhVmlzaWJpbGl0eShsZWdlbmRJdGVtLmluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgbGVnZW5kLmNoYXJ0LnVwZGF0ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgY29uc3RydWN0b3IoY2hhcnQsIGRhdGFzZXRJbmRleCl7XG4gICAgICAgIHN1cGVyKGNoYXJ0LCBkYXRhc2V0SW5kZXgpO1xuICAgICAgICB0aGlzLmVuYWJsZU9wdGlvblNoYXJpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLmlubmVyUmFkaXVzID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLm91dGVyUmFkaXVzID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLm9mZnNldFggPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMub2Zmc2V0WSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgbGlua1NjYWxlcygpIHt9XG4gcGFyc2Uoc3RhcnQsIGNvdW50KSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmdldERhdGFzZXQoKS5kYXRhO1xuICAgICAgICBjb25zdCBtZXRhID0gdGhpcy5fY2FjaGVkTWV0YTtcbiAgICAgICAgaWYgKHRoaXMuX3BhcnNpbmcgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBtZXRhLl9wYXJzZWQgPSBkYXRhO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGdldHRlciA9IChpKT0+K2RhdGFbaV07XG4gICAgICAgICAgICBpZiAoaXNPYmplY3QoZGF0YVtzdGFydF0pKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBrZXkgPSd2YWx1ZScgIH0gPSB0aGlzLl9wYXJzaW5nO1xuICAgICAgICAgICAgICAgIGdldHRlciA9IChpKT0+K3Jlc29sdmVPYmplY3RLZXkoZGF0YVtpXSwga2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBpLCBpbGVuO1xuICAgICAgICAgICAgZm9yKGkgPSBzdGFydCwgaWxlbiA9IHN0YXJ0ICsgY291bnQ7IGkgPCBpbGVuOyArK2kpe1xuICAgICAgICAgICAgICAgIG1ldGEuX3BhcnNlZFtpXSA9IGdldHRlcihpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiBfZ2V0Um90YXRpb24oKSB7XG4gICAgICAgIHJldHVybiB0b1JhZGlhbnModGhpcy5vcHRpb25zLnJvdGF0aW9uIC0gOTApO1xuICAgIH1cbiBfZ2V0Q2lyY3VtZmVyZW5jZSgpIHtcbiAgICAgICAgcmV0dXJuIHRvUmFkaWFucyh0aGlzLm9wdGlvbnMuY2lyY3VtZmVyZW5jZSk7XG4gICAgfVxuIF9nZXRSb3RhdGlvbkV4dGVudHMoKSB7XG4gICAgICAgIGxldCBtaW4gPSBUQVU7XG4gICAgICAgIGxldCBtYXggPSAtVEFVO1xuICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgdGhpcy5jaGFydC5kYXRhLmRhdGFzZXRzLmxlbmd0aDsgKytpKXtcbiAgICAgICAgICAgIGlmICh0aGlzLmNoYXJ0LmlzRGF0YXNldFZpc2libGUoaSkgJiYgdGhpcy5jaGFydC5nZXREYXRhc2V0TWV0YShpKS50eXBlID09PSB0aGlzLl90eXBlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udHJvbGxlciA9IHRoaXMuY2hhcnQuZ2V0RGF0YXNldE1ldGEoaSkuY29udHJvbGxlcjtcbiAgICAgICAgICAgICAgICBjb25zdCByb3RhdGlvbiA9IGNvbnRyb2xsZXIuX2dldFJvdGF0aW9uKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgY2lyY3VtZmVyZW5jZSA9IGNvbnRyb2xsZXIuX2dldENpcmN1bWZlcmVuY2UoKTtcbiAgICAgICAgICAgICAgICBtaW4gPSBNYXRoLm1pbihtaW4sIHJvdGF0aW9uKTtcbiAgICAgICAgICAgICAgICBtYXggPSBNYXRoLm1heChtYXgsIHJvdGF0aW9uICsgY2lyY3VtZmVyZW5jZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJvdGF0aW9uOiBtaW4sXG4gICAgICAgICAgICBjaXJjdW1mZXJlbmNlOiBtYXggLSBtaW5cbiAgICAgICAgfTtcbiAgICB9XG4gdXBkYXRlKG1vZGUpIHtcbiAgICAgICAgY29uc3QgY2hhcnQgPSB0aGlzLmNoYXJ0O1xuICAgICAgICBjb25zdCB7IGNoYXJ0QXJlYSAgfSA9IGNoYXJ0O1xuICAgICAgICBjb25zdCBtZXRhID0gdGhpcy5fY2FjaGVkTWV0YTtcbiAgICAgICAgY29uc3QgYXJjcyA9IG1ldGEuZGF0YTtcbiAgICAgICAgY29uc3Qgc3BhY2luZyA9IHRoaXMuZ2V0TWF4Qm9yZGVyV2lkdGgoKSArIHRoaXMuZ2V0TWF4T2Zmc2V0KGFyY3MpICsgdGhpcy5vcHRpb25zLnNwYWNpbmc7XG4gICAgICAgIGNvbnN0IG1heFNpemUgPSBNYXRoLm1heCgoTWF0aC5taW4oY2hhcnRBcmVhLndpZHRoLCBjaGFydEFyZWEuaGVpZ2h0KSAtIHNwYWNpbmcpIC8gMiwgMCk7XG4gICAgICAgIGNvbnN0IGN1dG91dCA9IE1hdGgubWluKHRvUGVyY2VudGFnZSh0aGlzLm9wdGlvbnMuY3V0b3V0LCBtYXhTaXplKSwgMSk7XG4gICAgICAgIGNvbnN0IGNoYXJ0V2VpZ2h0ID0gdGhpcy5fZ2V0UmluZ1dlaWdodCh0aGlzLmluZGV4KTtcbiAgICAgICAgY29uc3QgeyBjaXJjdW1mZXJlbmNlICwgcm90YXRpb24gIH0gPSB0aGlzLl9nZXRSb3RhdGlvbkV4dGVudHMoKTtcbiAgICAgICAgY29uc3QgeyByYXRpb1ggLCByYXRpb1kgLCBvZmZzZXRYICwgb2Zmc2V0WSAgfSA9IGdldFJhdGlvQW5kT2Zmc2V0KHJvdGF0aW9uLCBjaXJjdW1mZXJlbmNlLCBjdXRvdXQpO1xuICAgICAgICBjb25zdCBtYXhXaWR0aCA9IChjaGFydEFyZWEud2lkdGggLSBzcGFjaW5nKSAvIHJhdGlvWDtcbiAgICAgICAgY29uc3QgbWF4SGVpZ2h0ID0gKGNoYXJ0QXJlYS5oZWlnaHQgLSBzcGFjaW5nKSAvIHJhdGlvWTtcbiAgICAgICAgY29uc3QgbWF4UmFkaXVzID0gTWF0aC5tYXgoTWF0aC5taW4obWF4V2lkdGgsIG1heEhlaWdodCkgLyAyLCAwKTtcbiAgICAgICAgY29uc3Qgb3V0ZXJSYWRpdXMgPSB0b0RpbWVuc2lvbih0aGlzLm9wdGlvbnMucmFkaXVzLCBtYXhSYWRpdXMpO1xuICAgICAgICBjb25zdCBpbm5lclJhZGl1cyA9IE1hdGgubWF4KG91dGVyUmFkaXVzICogY3V0b3V0LCAwKTtcbiAgICAgICAgY29uc3QgcmFkaXVzTGVuZ3RoID0gKG91dGVyUmFkaXVzIC0gaW5uZXJSYWRpdXMpIC8gdGhpcy5fZ2V0VmlzaWJsZURhdGFzZXRXZWlnaHRUb3RhbCgpO1xuICAgICAgICB0aGlzLm9mZnNldFggPSBvZmZzZXRYICogb3V0ZXJSYWRpdXM7XG4gICAgICAgIHRoaXMub2Zmc2V0WSA9IG9mZnNldFkgKiBvdXRlclJhZGl1cztcbiAgICAgICAgbWV0YS50b3RhbCA9IHRoaXMuY2FsY3VsYXRlVG90YWwoKTtcbiAgICAgICAgdGhpcy5vdXRlclJhZGl1cyA9IG91dGVyUmFkaXVzIC0gcmFkaXVzTGVuZ3RoICogdGhpcy5fZ2V0UmluZ1dlaWdodE9mZnNldCh0aGlzLmluZGV4KTtcbiAgICAgICAgdGhpcy5pbm5lclJhZGl1cyA9IE1hdGgubWF4KHRoaXMub3V0ZXJSYWRpdXMgLSByYWRpdXNMZW5ndGggKiBjaGFydFdlaWdodCwgMCk7XG4gICAgICAgIHRoaXMudXBkYXRlRWxlbWVudHMoYXJjcywgMCwgYXJjcy5sZW5ndGgsIG1vZGUpO1xuICAgIH1cbiBfY2lyY3VtZmVyZW5jZShpLCByZXNldCkge1xuICAgICAgICBjb25zdCBvcHRzID0gdGhpcy5vcHRpb25zO1xuICAgICAgICBjb25zdCBtZXRhID0gdGhpcy5fY2FjaGVkTWV0YTtcbiAgICAgICAgY29uc3QgY2lyY3VtZmVyZW5jZSA9IHRoaXMuX2dldENpcmN1bWZlcmVuY2UoKTtcbiAgICAgICAgaWYgKHJlc2V0ICYmIG9wdHMuYW5pbWF0aW9uLmFuaW1hdGVSb3RhdGUgfHwgIXRoaXMuY2hhcnQuZ2V0RGF0YVZpc2liaWxpdHkoaSkgfHwgbWV0YS5fcGFyc2VkW2ldID09PSBudWxsIHx8IG1ldGEuZGF0YVtpXS5oaWRkZW4pIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGN1bGF0ZUNpcmN1bWZlcmVuY2UobWV0YS5fcGFyc2VkW2ldICogY2lyY3VtZmVyZW5jZSAvIFRBVSk7XG4gICAgfVxuICAgIHVwZGF0ZUVsZW1lbnRzKGFyY3MsIHN0YXJ0LCBjb3VudCwgbW9kZSkge1xuICAgICAgICBjb25zdCByZXNldCA9IG1vZGUgPT09ICdyZXNldCc7XG4gICAgICAgIGNvbnN0IGNoYXJ0ID0gdGhpcy5jaGFydDtcbiAgICAgICAgY29uc3QgY2hhcnRBcmVhID0gY2hhcnQuY2hhcnRBcmVhO1xuICAgICAgICBjb25zdCBvcHRzID0gY2hhcnQub3B0aW9ucztcbiAgICAgICAgY29uc3QgYW5pbWF0aW9uT3B0cyA9IG9wdHMuYW5pbWF0aW9uO1xuICAgICAgICBjb25zdCBjZW50ZXJYID0gKGNoYXJ0QXJlYS5sZWZ0ICsgY2hhcnRBcmVhLnJpZ2h0KSAvIDI7XG4gICAgICAgIGNvbnN0IGNlbnRlclkgPSAoY2hhcnRBcmVhLnRvcCArIGNoYXJ0QXJlYS5ib3R0b20pIC8gMjtcbiAgICAgICAgY29uc3QgYW5pbWF0ZVNjYWxlID0gcmVzZXQgJiYgYW5pbWF0aW9uT3B0cy5hbmltYXRlU2NhbGU7XG4gICAgICAgIGNvbnN0IGlubmVyUmFkaXVzID0gYW5pbWF0ZVNjYWxlID8gMCA6IHRoaXMuaW5uZXJSYWRpdXM7XG4gICAgICAgIGNvbnN0IG91dGVyUmFkaXVzID0gYW5pbWF0ZVNjYWxlID8gMCA6IHRoaXMub3V0ZXJSYWRpdXM7XG4gICAgICAgIGNvbnN0IHsgc2hhcmVkT3B0aW9ucyAsIGluY2x1ZGVPcHRpb25zICB9ID0gdGhpcy5fZ2V0U2hhcmVkT3B0aW9ucyhzdGFydCwgbW9kZSk7XG4gICAgICAgIGxldCBzdGFydEFuZ2xlID0gdGhpcy5fZ2V0Um90YXRpb24oKTtcbiAgICAgICAgbGV0IGk7XG4gICAgICAgIGZvcihpID0gMDsgaSA8IHN0YXJ0OyArK2kpe1xuICAgICAgICAgICAgc3RhcnRBbmdsZSArPSB0aGlzLl9jaXJjdW1mZXJlbmNlKGksIHJlc2V0KTtcbiAgICAgICAgfVxuICAgICAgICBmb3IoaSA9IHN0YXJ0OyBpIDwgc3RhcnQgKyBjb3VudDsgKytpKXtcbiAgICAgICAgICAgIGNvbnN0IGNpcmN1bWZlcmVuY2UgPSB0aGlzLl9jaXJjdW1mZXJlbmNlKGksIHJlc2V0KTtcbiAgICAgICAgICAgIGNvbnN0IGFyYyA9IGFyY3NbaV07XG4gICAgICAgICAgICBjb25zdCBwcm9wZXJ0aWVzID0ge1xuICAgICAgICAgICAgICAgIHg6IGNlbnRlclggKyB0aGlzLm9mZnNldFgsXG4gICAgICAgICAgICAgICAgeTogY2VudGVyWSArIHRoaXMub2Zmc2V0WSxcbiAgICAgICAgICAgICAgICBzdGFydEFuZ2xlLFxuICAgICAgICAgICAgICAgIGVuZEFuZ2xlOiBzdGFydEFuZ2xlICsgY2lyY3VtZmVyZW5jZSxcbiAgICAgICAgICAgICAgICBjaXJjdW1mZXJlbmNlLFxuICAgICAgICAgICAgICAgIG91dGVyUmFkaXVzLFxuICAgICAgICAgICAgICAgIGlubmVyUmFkaXVzXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKGluY2x1ZGVPcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgcHJvcGVydGllcy5vcHRpb25zID0gc2hhcmVkT3B0aW9ucyB8fCB0aGlzLnJlc29sdmVEYXRhRWxlbWVudE9wdGlvbnMoaSwgYXJjLmFjdGl2ZSA/ICdhY3RpdmUnIDogbW9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdGFydEFuZ2xlICs9IGNpcmN1bWZlcmVuY2U7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUVsZW1lbnQoYXJjLCBpLCBwcm9wZXJ0aWVzLCBtb2RlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjYWxjdWxhdGVUb3RhbCgpIHtcbiAgICAgICAgY29uc3QgbWV0YSA9IHRoaXMuX2NhY2hlZE1ldGE7XG4gICAgICAgIGNvbnN0IG1ldGFEYXRhID0gbWV0YS5kYXRhO1xuICAgICAgICBsZXQgdG90YWwgPSAwO1xuICAgICAgICBsZXQgaTtcbiAgICAgICAgZm9yKGkgPSAwOyBpIDwgbWV0YURhdGEubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBtZXRhLl9wYXJzZWRbaV07XG4gICAgICAgICAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgIWlzTmFOKHZhbHVlKSAmJiB0aGlzLmNoYXJ0LmdldERhdGFWaXNpYmlsaXR5KGkpICYmICFtZXRhRGF0YVtpXS5oaWRkZW4pIHtcbiAgICAgICAgICAgICAgICB0b3RhbCArPSBNYXRoLmFicyh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRvdGFsO1xuICAgIH1cbiAgICBjYWxjdWxhdGVDaXJjdW1mZXJlbmNlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IHRvdGFsID0gdGhpcy5fY2FjaGVkTWV0YS50b3RhbDtcbiAgICAgICAgaWYgKHRvdGFsID4gMCAmJiAhaXNOYU4odmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gVEFVICogKE1hdGguYWJzKHZhbHVlKSAvIHRvdGFsKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgZ2V0TGFiZWxBbmRWYWx1ZShpbmRleCkge1xuICAgICAgICBjb25zdCBtZXRhID0gdGhpcy5fY2FjaGVkTWV0YTtcbiAgICAgICAgY29uc3QgY2hhcnQgPSB0aGlzLmNoYXJ0O1xuICAgICAgICBjb25zdCBsYWJlbHMgPSBjaGFydC5kYXRhLmxhYmVscyB8fCBbXTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBmb3JtYXROdW1iZXIobWV0YS5fcGFyc2VkW2luZGV4XSwgY2hhcnQub3B0aW9ucy5sb2NhbGUpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGFiZWw6IGxhYmVsc1tpbmRleF0gfHwgJycsXG4gICAgICAgICAgICB2YWx1ZVxuICAgICAgICB9O1xuICAgIH1cbiAgICBnZXRNYXhCb3JkZXJXaWR0aChhcmNzKSB7XG4gICAgICAgIGxldCBtYXggPSAwO1xuICAgICAgICBjb25zdCBjaGFydCA9IHRoaXMuY2hhcnQ7XG4gICAgICAgIGxldCBpLCBpbGVuLCBtZXRhLCBjb250cm9sbGVyLCBvcHRpb25zO1xuICAgICAgICBpZiAoIWFyY3MpIHtcbiAgICAgICAgICAgIGZvcihpID0gMCwgaWxlbiA9IGNoYXJ0LmRhdGEuZGF0YXNldHMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKXtcbiAgICAgICAgICAgICAgICBpZiAoY2hhcnQuaXNEYXRhc2V0VmlzaWJsZShpKSkge1xuICAgICAgICAgICAgICAgICAgICBtZXRhID0gY2hhcnQuZ2V0RGF0YXNldE1ldGEoaSk7XG4gICAgICAgICAgICAgICAgICAgIGFyY3MgPSBtZXRhLmRhdGE7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIgPSBtZXRhLmNvbnRyb2xsZXI7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWFyY3MpIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIGZvcihpID0gMCwgaWxlbiA9IGFyY3MubGVuZ3RoOyBpIDwgaWxlbjsgKytpKXtcbiAgICAgICAgICAgIG9wdGlvbnMgPSBjb250cm9sbGVyLnJlc29sdmVEYXRhRWxlbWVudE9wdGlvbnMoaSk7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5ib3JkZXJBbGlnbiAhPT0gJ2lubmVyJykge1xuICAgICAgICAgICAgICAgIG1heCA9IE1hdGgubWF4KG1heCwgb3B0aW9ucy5ib3JkZXJXaWR0aCB8fCAwLCBvcHRpb25zLmhvdmVyQm9yZGVyV2lkdGggfHwgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1heDtcbiAgICB9XG4gICAgZ2V0TWF4T2Zmc2V0KGFyY3MpIHtcbiAgICAgICAgbGV0IG1heCA9IDA7XG4gICAgICAgIGZvcihsZXQgaSA9IDAsIGlsZW4gPSBhcmNzLmxlbmd0aDsgaSA8IGlsZW47ICsraSl7XG4gICAgICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5yZXNvbHZlRGF0YUVsZW1lbnRPcHRpb25zKGkpO1xuICAgICAgICAgICAgbWF4ID0gTWF0aC5tYXgobWF4LCBvcHRpb25zLm9mZnNldCB8fCAwLCBvcHRpb25zLmhvdmVyT2Zmc2V0IHx8IDApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXg7XG4gICAgfVxuIF9nZXRSaW5nV2VpZ2h0T2Zmc2V0KGRhdGFzZXRJbmRleCkge1xuICAgICAgICBsZXQgcmluZ1dlaWdodE9mZnNldCA9IDA7XG4gICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBkYXRhc2V0SW5kZXg7ICsraSl7XG4gICAgICAgICAgICBpZiAodGhpcy5jaGFydC5pc0RhdGFzZXRWaXNpYmxlKGkpKSB7XG4gICAgICAgICAgICAgICAgcmluZ1dlaWdodE9mZnNldCArPSB0aGlzLl9nZXRSaW5nV2VpZ2h0KGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByaW5nV2VpZ2h0T2Zmc2V0O1xuICAgIH1cbiBfZ2V0UmluZ1dlaWdodChkYXRhc2V0SW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KHZhbHVlT3JEZWZhdWx0KHRoaXMuY2hhcnQuZGF0YS5kYXRhc2V0c1tkYXRhc2V0SW5kZXhdLndlaWdodCwgMSksIDApO1xuICAgIH1cbiBfZ2V0VmlzaWJsZURhdGFzZXRXZWlnaHRUb3RhbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldFJpbmdXZWlnaHRPZmZzZXQodGhpcy5jaGFydC5kYXRhLmRhdGFzZXRzLmxlbmd0aCkgfHwgMTtcbiAgICB9XG59XG5cbmNsYXNzIExpbmVDb250cm9sbGVyIGV4dGVuZHMgRGF0YXNldENvbnRyb2xsZXIge1xuICAgIHN0YXRpYyBpZCA9ICdsaW5lJztcbiBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgICAgIGRhdGFzZXRFbGVtZW50VHlwZTogJ2xpbmUnLFxuICAgICAgICBkYXRhRWxlbWVudFR5cGU6ICdwb2ludCcsXG4gICAgICAgIHNob3dMaW5lOiB0cnVlLFxuICAgICAgICBzcGFuR2FwczogZmFsc2VcbiAgICB9O1xuIHN0YXRpYyBvdmVycmlkZXMgPSB7XG4gICAgICAgIHNjYWxlczoge1xuICAgICAgICAgICAgX2luZGV4Xzoge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdjYXRlZ29yeSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBfdmFsdWVfOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2xpbmVhcidcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgaW5pdGlhbGl6ZSgpIHtcbiAgICAgICAgdGhpcy5lbmFibGVPcHRpb25TaGFyaW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zdXBwb3J0c0RlY2ltYXRpb24gPSB0cnVlO1xuICAgICAgICBzdXBlci5pbml0aWFsaXplKCk7XG4gICAgfVxuICAgIHVwZGF0ZShtb2RlKSB7XG4gICAgICAgIGNvbnN0IG1ldGEgPSB0aGlzLl9jYWNoZWRNZXRhO1xuICAgICAgICBjb25zdCB7IGRhdGFzZXQ6IGxpbmUgLCBkYXRhOiBwb2ludHMgPSBbXSAsIF9kYXRhc2V0ICB9ID0gbWV0YTtcbiAgICAgICAgY29uc3QgYW5pbWF0aW9uc0Rpc2FibGVkID0gdGhpcy5jaGFydC5fYW5pbWF0aW9uc0Rpc2FibGVkO1xuICAgICAgICBsZXQgeyBzdGFydCAsIGNvdW50ICB9ID0gX2dldFN0YXJ0QW5kQ291bnRPZlZpc2libGVQb2ludHMobWV0YSwgcG9pbnRzLCBhbmltYXRpb25zRGlzYWJsZWQpO1xuICAgICAgICB0aGlzLl9kcmF3U3RhcnQgPSBzdGFydDtcbiAgICAgICAgdGhpcy5fZHJhd0NvdW50ID0gY291bnQ7XG4gICAgICAgIGlmIChfc2NhbGVSYW5nZXNDaGFuZ2VkKG1ldGEpKSB7XG4gICAgICAgICAgICBzdGFydCA9IDA7XG4gICAgICAgICAgICBjb3VudCA9IHBvaW50cy5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgbGluZS5fY2hhcnQgPSB0aGlzLmNoYXJ0O1xuICAgICAgICBsaW5lLl9kYXRhc2V0SW5kZXggPSB0aGlzLmluZGV4O1xuICAgICAgICBsaW5lLl9kZWNpbWF0ZWQgPSAhIV9kYXRhc2V0Ll9kZWNpbWF0ZWQ7XG4gICAgICAgIGxpbmUucG9pbnRzID0gcG9pbnRzO1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5yZXNvbHZlRGF0YXNldEVsZW1lbnRPcHRpb25zKG1vZGUpO1xuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5zaG93TGluZSkge1xuICAgICAgICAgICAgb3B0aW9ucy5ib3JkZXJXaWR0aCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgb3B0aW9ucy5zZWdtZW50ID0gdGhpcy5vcHRpb25zLnNlZ21lbnQ7XG4gICAgICAgIHRoaXMudXBkYXRlRWxlbWVudChsaW5lLCB1bmRlZmluZWQsIHtcbiAgICAgICAgICAgIGFuaW1hdGVkOiAhYW5pbWF0aW9uc0Rpc2FibGVkLFxuICAgICAgICAgICAgb3B0aW9uc1xuICAgICAgICB9LCBtb2RlKTtcbiAgICAgICAgdGhpcy51cGRhdGVFbGVtZW50cyhwb2ludHMsIHN0YXJ0LCBjb3VudCwgbW9kZSk7XG4gICAgfVxuICAgIHVwZGF0ZUVsZW1lbnRzKHBvaW50cywgc3RhcnQsIGNvdW50LCBtb2RlKSB7XG4gICAgICAgIGNvbnN0IHJlc2V0ID0gbW9kZSA9PT0gJ3Jlc2V0JztcbiAgICAgICAgY29uc3QgeyBpU2NhbGUgLCB2U2NhbGUgLCBfc3RhY2tlZCAsIF9kYXRhc2V0ICB9ID0gdGhpcy5fY2FjaGVkTWV0YTtcbiAgICAgICAgY29uc3QgeyBzaGFyZWRPcHRpb25zICwgaW5jbHVkZU9wdGlvbnMgIH0gPSB0aGlzLl9nZXRTaGFyZWRPcHRpb25zKHN0YXJ0LCBtb2RlKTtcbiAgICAgICAgY29uc3QgaUF4aXMgPSBpU2NhbGUuYXhpcztcbiAgICAgICAgY29uc3QgdkF4aXMgPSB2U2NhbGUuYXhpcztcbiAgICAgICAgY29uc3QgeyBzcGFuR2FwcyAsIHNlZ21lbnQgIH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIGNvbnN0IG1heEdhcExlbmd0aCA9IGlzTnVtYmVyKHNwYW5HYXBzKSA/IHNwYW5HYXBzIDogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuICAgICAgICBjb25zdCBkaXJlY3RVcGRhdGUgPSB0aGlzLmNoYXJ0Ll9hbmltYXRpb25zRGlzYWJsZWQgfHwgcmVzZXQgfHwgbW9kZSA9PT0gJ25vbmUnO1xuICAgICAgICBjb25zdCBlbmQgPSBzdGFydCArIGNvdW50O1xuICAgICAgICBjb25zdCBwb2ludHNDb3VudCA9IHBvaW50cy5sZW5ndGg7XG4gICAgICAgIGxldCBwcmV2UGFyc2VkID0gc3RhcnQgPiAwICYmIHRoaXMuZ2V0UGFyc2VkKHN0YXJ0IC0gMSk7XG4gICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBwb2ludHNDb3VudDsgKytpKXtcbiAgICAgICAgICAgIGNvbnN0IHBvaW50ID0gcG9pbnRzW2ldO1xuICAgICAgICAgICAgY29uc3QgcHJvcGVydGllcyA9IGRpcmVjdFVwZGF0ZSA/IHBvaW50IDoge307XG4gICAgICAgICAgICBpZiAoaSA8IHN0YXJ0IHx8IGkgPj0gZW5kKSB7XG4gICAgICAgICAgICAgICAgcHJvcGVydGllcy5za2lwID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IHRoaXMuZ2V0UGFyc2VkKGkpO1xuICAgICAgICAgICAgY29uc3QgbnVsbERhdGEgPSBpc051bGxPclVuZGVmKHBhcnNlZFt2QXhpc10pO1xuICAgICAgICAgICAgY29uc3QgaVBpeGVsID0gcHJvcGVydGllc1tpQXhpc10gPSBpU2NhbGUuZ2V0UGl4ZWxGb3JWYWx1ZShwYXJzZWRbaUF4aXNdLCBpKTtcbiAgICAgICAgICAgIGNvbnN0IHZQaXhlbCA9IHByb3BlcnRpZXNbdkF4aXNdID0gcmVzZXQgfHwgbnVsbERhdGEgPyB2U2NhbGUuZ2V0QmFzZVBpeGVsKCkgOiB2U2NhbGUuZ2V0UGl4ZWxGb3JWYWx1ZShfc3RhY2tlZCA/IHRoaXMuYXBwbHlTdGFjayh2U2NhbGUsIHBhcnNlZCwgX3N0YWNrZWQpIDogcGFyc2VkW3ZBeGlzXSwgaSk7XG4gICAgICAgICAgICBwcm9wZXJ0aWVzLnNraXAgPSBpc05hTihpUGl4ZWwpIHx8IGlzTmFOKHZQaXhlbCkgfHwgbnVsbERhdGE7XG4gICAgICAgICAgICBwcm9wZXJ0aWVzLnN0b3AgPSBpID4gMCAmJiBNYXRoLmFicyhwYXJzZWRbaUF4aXNdIC0gcHJldlBhcnNlZFtpQXhpc10pID4gbWF4R2FwTGVuZ3RoO1xuICAgICAgICAgICAgaWYgKHNlZ21lbnQpIHtcbiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLnBhcnNlZCA9IHBhcnNlZDtcbiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLnJhdyA9IF9kYXRhc2V0LmRhdGFbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaW5jbHVkZU9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLm9wdGlvbnMgPSBzaGFyZWRPcHRpb25zIHx8IHRoaXMucmVzb2x2ZURhdGFFbGVtZW50T3B0aW9ucyhpLCBwb2ludC5hY3RpdmUgPyAnYWN0aXZlJyA6IG1vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFkaXJlY3RVcGRhdGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUVsZW1lbnQocG9pbnQsIGksIHByb3BlcnRpZXMsIG1vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcHJldlBhcnNlZCA9IHBhcnNlZDtcbiAgICAgICAgfVxuICAgIH1cbiBnZXRNYXhPdmVyZmxvdygpIHtcbiAgICAgICAgY29uc3QgbWV0YSA9IHRoaXMuX2NhY2hlZE1ldGE7XG4gICAgICAgIGNvbnN0IGRhdGFzZXQgPSBtZXRhLmRhdGFzZXQ7XG4gICAgICAgIGNvbnN0IGJvcmRlciA9IGRhdGFzZXQub3B0aW9ucyAmJiBkYXRhc2V0Lm9wdGlvbnMuYm9yZGVyV2lkdGggfHwgMDtcbiAgICAgICAgY29uc3QgZGF0YSA9IG1ldGEuZGF0YSB8fCBbXTtcbiAgICAgICAgaWYgKCFkYXRhLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGJvcmRlcjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmaXJzdFBvaW50ID0gZGF0YVswXS5zaXplKHRoaXMucmVzb2x2ZURhdGFFbGVtZW50T3B0aW9ucygwKSk7XG4gICAgICAgIGNvbnN0IGxhc3RQb2ludCA9IGRhdGFbZGF0YS5sZW5ndGggLSAxXS5zaXplKHRoaXMucmVzb2x2ZURhdGFFbGVtZW50T3B0aW9ucyhkYXRhLmxlbmd0aCAtIDEpKTtcbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KGJvcmRlciwgZmlyc3RQb2ludCwgbGFzdFBvaW50KSAvIDI7XG4gICAgfVxuICAgIGRyYXcoKSB7XG4gICAgICAgIGNvbnN0IG1ldGEgPSB0aGlzLl9jYWNoZWRNZXRhO1xuICAgICAgICBtZXRhLmRhdGFzZXQudXBkYXRlQ29udHJvbFBvaW50cyh0aGlzLmNoYXJ0LmNoYXJ0QXJlYSwgbWV0YS5pU2NhbGUuYXhpcyk7XG4gICAgICAgIHN1cGVyLmRyYXcoKTtcbiAgICB9XG59XG5cbmNsYXNzIFBvbGFyQXJlYUNvbnRyb2xsZXIgZXh0ZW5kcyBEYXRhc2V0Q29udHJvbGxlciB7XG4gICAgc3RhdGljIGlkID0gJ3BvbGFyQXJlYSc7XG4gc3RhdGljIGRlZmF1bHRzID0ge1xuICAgICAgICBkYXRhRWxlbWVudFR5cGU6ICdhcmMnLFxuICAgICAgICBhbmltYXRpb246IHtcbiAgICAgICAgICAgIGFuaW1hdGVSb3RhdGU6IHRydWUsXG4gICAgICAgICAgICBhbmltYXRlU2NhbGU6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgYW5pbWF0aW9uczoge1xuICAgICAgICAgICAgbnVtYmVyczoge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdudW1iZXInLFxuICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgJ3gnLFxuICAgICAgICAgICAgICAgICAgICAneScsXG4gICAgICAgICAgICAgICAgICAgICdzdGFydEFuZ2xlJyxcbiAgICAgICAgICAgICAgICAgICAgJ2VuZEFuZ2xlJyxcbiAgICAgICAgICAgICAgICAgICAgJ2lubmVyUmFkaXVzJyxcbiAgICAgICAgICAgICAgICAgICAgJ291dGVyUmFkaXVzJ1xuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgaW5kZXhBeGlzOiAncicsXG4gICAgICAgIHN0YXJ0QW5nbGU6IDBcbiAgICB9O1xuIHN0YXRpYyBvdmVycmlkZXMgPSB7XG4gICAgICAgIGFzcGVjdFJhdGlvOiAxLFxuICAgICAgICBwbHVnaW5zOiB7XG4gICAgICAgICAgICBsZWdlbmQ6IHtcbiAgICAgICAgICAgICAgICBsYWJlbHM6IHtcbiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVMYWJlbHMgKGNoYXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gY2hhcnQuZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmxhYmVscy5sZW5ndGggJiYgZGF0YS5kYXRhc2V0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGxhYmVsczogeyBwb2ludFN0eWxlICwgY29sb3IgIH0gIH0gPSBjaGFydC5sZWdlbmQub3B0aW9ucztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YS5sYWJlbHMubWFwKChsYWJlbCwgaSk9PntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWV0YSA9IGNoYXJ0LmdldERhdGFzZXRNZXRhKDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHlsZSA9IG1ldGEuY29udHJvbGxlci5nZXRTdHlsZShpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IGxhYmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbFN0eWxlOiBzdHlsZS5iYWNrZ3JvdW5kQ29sb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2VTdHlsZTogc3R5bGUuYm9yZGVyQ29sb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250Q29sb3I6IGNvbG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZVdpZHRoOiBzdHlsZS5ib3JkZXJXaWR0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50U3R5bGU6IHBvaW50U3R5bGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRkZW46ICFjaGFydC5nZXREYXRhVmlzaWJpbGl0eShpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OiBpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG9uQ2xpY2sgKGUsIGxlZ2VuZEl0ZW0sIGxlZ2VuZCkge1xuICAgICAgICAgICAgICAgICAgICBsZWdlbmQuY2hhcnQudG9nZ2xlRGF0YVZpc2liaWxpdHkobGVnZW5kSXRlbS5pbmRleCk7XG4gICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5jaGFydC51cGRhdGUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHNjYWxlczoge1xuICAgICAgICAgICAgcjoge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdyYWRpYWxMaW5lYXInLFxuICAgICAgICAgICAgICAgIGFuZ2xlTGluZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogZmFsc2VcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGJlZ2luQXRaZXJvOiB0cnVlLFxuICAgICAgICAgICAgICAgIGdyaWQ6IHtcbiAgICAgICAgICAgICAgICAgICAgY2lyY3VsYXI6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHBvaW50TGFiZWxzOiB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGZhbHNlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzdGFydEFuZ2xlOiAwXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0cnVjdG9yKGNoYXJ0LCBkYXRhc2V0SW5kZXgpe1xuICAgICAgICBzdXBlcihjaGFydCwgZGF0YXNldEluZGV4KTtcbiAgICAgICAgdGhpcy5pbm5lclJhZGl1cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5vdXRlclJhZGl1cyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZ2V0TGFiZWxBbmRWYWx1ZShpbmRleCkge1xuICAgICAgICBjb25zdCBtZXRhID0gdGhpcy5fY2FjaGVkTWV0YTtcbiAgICAgICAgY29uc3QgY2hhcnQgPSB0aGlzLmNoYXJ0O1xuICAgICAgICBjb25zdCBsYWJlbHMgPSBjaGFydC5kYXRhLmxhYmVscyB8fCBbXTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBmb3JtYXROdW1iZXIobWV0YS5fcGFyc2VkW2luZGV4XS5yLCBjaGFydC5vcHRpb25zLmxvY2FsZSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsYWJlbDogbGFiZWxzW2luZGV4XSB8fCAnJyxcbiAgICAgICAgICAgIHZhbHVlXG4gICAgICAgIH07XG4gICAgfVxuICAgIHBhcnNlT2JqZWN0RGF0YShtZXRhLCBkYXRhLCBzdGFydCwgY291bnQpIHtcbiAgICAgICAgcmV0dXJuIF9wYXJzZU9iamVjdERhdGFSYWRpYWxTY2FsZS5iaW5kKHRoaXMpKG1ldGEsIGRhdGEsIHN0YXJ0LCBjb3VudCk7XG4gICAgfVxuICAgIHVwZGF0ZShtb2RlKSB7XG4gICAgICAgIGNvbnN0IGFyY3MgPSB0aGlzLl9jYWNoZWRNZXRhLmRhdGE7XG4gICAgICAgIHRoaXMuX3VwZGF0ZVJhZGl1cygpO1xuICAgICAgICB0aGlzLnVwZGF0ZUVsZW1lbnRzKGFyY3MsIDAsIGFyY3MubGVuZ3RoLCBtb2RlKTtcbiAgICB9XG4gZ2V0TWluTWF4KCkge1xuICAgICAgICBjb25zdCBtZXRhID0gdGhpcy5fY2FjaGVkTWV0YTtcbiAgICAgICAgY29uc3QgcmFuZ2UgPSB7XG4gICAgICAgICAgICBtaW46IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSxcbiAgICAgICAgICAgIG1heDogTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZXG4gICAgICAgIH07XG4gICAgICAgIG1ldGEuZGF0YS5mb3JFYWNoKChlbGVtZW50LCBpbmRleCk9PntcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IHRoaXMuZ2V0UGFyc2VkKGluZGV4KS5yO1xuICAgICAgICAgICAgaWYgKCFpc05hTihwYXJzZWQpICYmIHRoaXMuY2hhcnQuZ2V0RGF0YVZpc2liaWxpdHkoaW5kZXgpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnNlZCA8IHJhbmdlLm1pbikge1xuICAgICAgICAgICAgICAgICAgICByYW5nZS5taW4gPSBwYXJzZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChwYXJzZWQgPiByYW5nZS5tYXgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2UubWF4ID0gcGFyc2VkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByYW5nZTtcbiAgICB9XG4gX3VwZGF0ZVJhZGl1cygpIHtcbiAgICAgICAgY29uc3QgY2hhcnQgPSB0aGlzLmNoYXJ0O1xuICAgICAgICBjb25zdCBjaGFydEFyZWEgPSBjaGFydC5jaGFydEFyZWE7XG4gICAgICAgIGNvbnN0IG9wdHMgPSBjaGFydC5vcHRpb25zO1xuICAgICAgICBjb25zdCBtaW5TaXplID0gTWF0aC5taW4oY2hhcnRBcmVhLnJpZ2h0IC0gY2hhcnRBcmVhLmxlZnQsIGNoYXJ0QXJlYS5ib3R0b20gLSBjaGFydEFyZWEudG9wKTtcbiAgICAgICAgY29uc3Qgb3V0ZXJSYWRpdXMgPSBNYXRoLm1heChtaW5TaXplIC8gMiwgMCk7XG4gICAgICAgIGNvbnN0IGlubmVyUmFkaXVzID0gTWF0aC5tYXgob3B0cy5jdXRvdXRQZXJjZW50YWdlID8gb3V0ZXJSYWRpdXMgLyAxMDAgKiBvcHRzLmN1dG91dFBlcmNlbnRhZ2UgOiAxLCAwKTtcbiAgICAgICAgY29uc3QgcmFkaXVzTGVuZ3RoID0gKG91dGVyUmFkaXVzIC0gaW5uZXJSYWRpdXMpIC8gY2hhcnQuZ2V0VmlzaWJsZURhdGFzZXRDb3VudCgpO1xuICAgICAgICB0aGlzLm91dGVyUmFkaXVzID0gb3V0ZXJSYWRpdXMgLSByYWRpdXNMZW5ndGggKiB0aGlzLmluZGV4O1xuICAgICAgICB0aGlzLmlubmVyUmFkaXVzID0gdGhpcy5vdXRlclJhZGl1cyAtIHJhZGl1c0xlbmd0aDtcbiAgICB9XG4gICAgdXBkYXRlRWxlbWVudHMoYXJjcywgc3RhcnQsIGNvdW50LCBtb2RlKSB7XG4gICAgICAgIGNvbnN0IHJlc2V0ID0gbW9kZSA9PT0gJ3Jlc2V0JztcbiAgICAgICAgY29uc3QgY2hhcnQgPSB0aGlzLmNoYXJ0O1xuICAgICAgICBjb25zdCBvcHRzID0gY2hhcnQub3B0aW9ucztcbiAgICAgICAgY29uc3QgYW5pbWF0aW9uT3B0cyA9IG9wdHMuYW5pbWF0aW9uO1xuICAgICAgICBjb25zdCBzY2FsZSA9IHRoaXMuX2NhY2hlZE1ldGEuclNjYWxlO1xuICAgICAgICBjb25zdCBjZW50ZXJYID0gc2NhbGUueENlbnRlcjtcbiAgICAgICAgY29uc3QgY2VudGVyWSA9IHNjYWxlLnlDZW50ZXI7XG4gICAgICAgIGNvbnN0IGRhdGFzZXRTdGFydEFuZ2xlID0gc2NhbGUuZ2V0SW5kZXhBbmdsZSgwKSAtIDAuNSAqIFBJO1xuICAgICAgICBsZXQgYW5nbGUgPSBkYXRhc2V0U3RhcnRBbmdsZTtcbiAgICAgICAgbGV0IGk7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRBbmdsZSA9IDM2MCAvIHRoaXMuY291bnRWaXNpYmxlRWxlbWVudHMoKTtcbiAgICAgICAgZm9yKGkgPSAwOyBpIDwgc3RhcnQ7ICsraSl7XG4gICAgICAgICAgICBhbmdsZSArPSB0aGlzLl9jb21wdXRlQW5nbGUoaSwgbW9kZSwgZGVmYXVsdEFuZ2xlKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IoaSA9IHN0YXJ0OyBpIDwgc3RhcnQgKyBjb3VudDsgaSsrKXtcbiAgICAgICAgICAgIGNvbnN0IGFyYyA9IGFyY3NbaV07XG4gICAgICAgICAgICBsZXQgc3RhcnRBbmdsZSA9IGFuZ2xlO1xuICAgICAgICAgICAgbGV0IGVuZEFuZ2xlID0gYW5nbGUgKyB0aGlzLl9jb21wdXRlQW5nbGUoaSwgbW9kZSwgZGVmYXVsdEFuZ2xlKTtcbiAgICAgICAgICAgIGxldCBvdXRlclJhZGl1cyA9IGNoYXJ0LmdldERhdGFWaXNpYmlsaXR5KGkpID8gc2NhbGUuZ2V0RGlzdGFuY2VGcm9tQ2VudGVyRm9yVmFsdWUodGhpcy5nZXRQYXJzZWQoaSkucikgOiAwO1xuICAgICAgICAgICAgYW5nbGUgPSBlbmRBbmdsZTtcbiAgICAgICAgICAgIGlmIChyZXNldCkge1xuICAgICAgICAgICAgICAgIGlmIChhbmltYXRpb25PcHRzLmFuaW1hdGVTY2FsZSkge1xuICAgICAgICAgICAgICAgICAgICBvdXRlclJhZGl1cyA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChhbmltYXRpb25PcHRzLmFuaW1hdGVSb3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRBbmdsZSA9IGVuZEFuZ2xlID0gZGF0YXNldFN0YXJ0QW5nbGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcHJvcGVydGllcyA9IHtcbiAgICAgICAgICAgICAgICB4OiBjZW50ZXJYLFxuICAgICAgICAgICAgICAgIHk6IGNlbnRlclksXG4gICAgICAgICAgICAgICAgaW5uZXJSYWRpdXM6IDAsXG4gICAgICAgICAgICAgICAgb3V0ZXJSYWRpdXMsXG4gICAgICAgICAgICAgICAgc3RhcnRBbmdsZSxcbiAgICAgICAgICAgICAgICBlbmRBbmdsZSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiB0aGlzLnJlc29sdmVEYXRhRWxlbWVudE9wdGlvbnMoaSwgYXJjLmFjdGl2ZSA/ICdhY3RpdmUnIDogbW9kZSlcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUVsZW1lbnQoYXJjLCBpLCBwcm9wZXJ0aWVzLCBtb2RlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb3VudFZpc2libGVFbGVtZW50cygpIHtcbiAgICAgICAgY29uc3QgbWV0YSA9IHRoaXMuX2NhY2hlZE1ldGE7XG4gICAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICAgIG1ldGEuZGF0YS5mb3JFYWNoKChlbGVtZW50LCBpbmRleCk9PntcbiAgICAgICAgICAgIGlmICghaXNOYU4odGhpcy5nZXRQYXJzZWQoaW5kZXgpLnIpICYmIHRoaXMuY2hhcnQuZ2V0RGF0YVZpc2liaWxpdHkoaW5kZXgpKSB7XG4gICAgICAgICAgICAgICAgY291bnQrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjb3VudDtcbiAgICB9XG4gX2NvbXB1dGVBbmdsZShpbmRleCwgbW9kZSwgZGVmYXVsdEFuZ2xlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNoYXJ0LmdldERhdGFWaXNpYmlsaXR5KGluZGV4KSA/IHRvUmFkaWFucyh0aGlzLnJlc29sdmVEYXRhRWxlbWVudE9wdGlvbnMoaW5kZXgsIG1vZGUpLmFuZ2xlIHx8IGRlZmF1bHRBbmdsZSkgOiAwO1xuICAgIH1cbn1cblxuY2xhc3MgUGllQ29udHJvbGxlciBleHRlbmRzIERvdWdobnV0Q29udHJvbGxlciB7XG4gICAgc3RhdGljIGlkID0gJ3BpZSc7XG4gc3RhdGljIGRlZmF1bHRzID0ge1xuICAgICAgICBjdXRvdXQ6IDAsXG4gICAgICAgIHJvdGF0aW9uOiAwLFxuICAgICAgICBjaXJjdW1mZXJlbmNlOiAzNjAsXG4gICAgICAgIHJhZGl1czogJzEwMCUnXG4gICAgfTtcbn1cblxuY2xhc3MgUmFkYXJDb250cm9sbGVyIGV4dGVuZHMgRGF0YXNldENvbnRyb2xsZXIge1xuICAgIHN0YXRpYyBpZCA9ICdyYWRhcic7XG4gc3RhdGljIGRlZmF1bHRzID0ge1xuICAgICAgICBkYXRhc2V0RWxlbWVudFR5cGU6ICdsaW5lJyxcbiAgICAgICAgZGF0YUVsZW1lbnRUeXBlOiAncG9pbnQnLFxuICAgICAgICBpbmRleEF4aXM6ICdyJyxcbiAgICAgICAgc2hvd0xpbmU6IHRydWUsXG4gICAgICAgIGVsZW1lbnRzOiB7XG4gICAgICAgICAgICBsaW5lOiB7XG4gICAgICAgICAgICAgICAgZmlsbDogJ3N0YXJ0J1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiBzdGF0aWMgb3ZlcnJpZGVzID0ge1xuICAgICAgICBhc3BlY3RSYXRpbzogMSxcbiAgICAgICAgc2NhbGVzOiB7XG4gICAgICAgICAgICByOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ3JhZGlhbExpbmVhcidcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gZ2V0TGFiZWxBbmRWYWx1ZShpbmRleCkge1xuICAgICAgICBjb25zdCB2U2NhbGUgPSB0aGlzLl9jYWNoZWRNZXRhLnZTY2FsZTtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gdGhpcy5nZXRQYXJzZWQoaW5kZXgpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGFiZWw6IHZTY2FsZS5nZXRMYWJlbHMoKVtpbmRleF0sXG4gICAgICAgICAgICB2YWx1ZTogJycgKyB2U2NhbGUuZ2V0TGFiZWxGb3JWYWx1ZShwYXJzZWRbdlNjYWxlLmF4aXNdKVxuICAgICAgICB9O1xuICAgIH1cbiAgICBwYXJzZU9iamVjdERhdGEobWV0YSwgZGF0YSwgc3RhcnQsIGNvdW50KSB7XG4gICAgICAgIHJldHVybiBfcGFyc2VPYmplY3REYXRhUmFkaWFsU2NhbGUuYmluZCh0aGlzKShtZXRhLCBkYXRhLCBzdGFydCwgY291bnQpO1xuICAgIH1cbiAgICB1cGRhdGUobW9kZSkge1xuICAgICAgICBjb25zdCBtZXRhID0gdGhpcy5fY2FjaGVkTWV0YTtcbiAgICAgICAgY29uc3QgbGluZSA9IG1ldGEuZGF0YXNldDtcbiAgICAgICAgY29uc3QgcG9pbnRzID0gbWV0YS5kYXRhIHx8IFtdO1xuICAgICAgICBjb25zdCBsYWJlbHMgPSBtZXRhLmlTY2FsZS5nZXRMYWJlbHMoKTtcbiAgICAgICAgbGluZS5wb2ludHMgPSBwb2ludHM7XG4gICAgICAgIGlmIChtb2RlICE9PSAncmVzaXplJykge1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMucmVzb2x2ZURhdGFzZXRFbGVtZW50T3B0aW9ucyhtb2RlKTtcbiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnNob3dMaW5lKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5ib3JkZXJXaWR0aCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBwcm9wZXJ0aWVzID0ge1xuICAgICAgICAgICAgICAgIF9sb29wOiB0cnVlLFxuICAgICAgICAgICAgICAgIF9mdWxsTG9vcDogbGFiZWxzLmxlbmd0aCA9PT0gcG9pbnRzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICBvcHRpb25zXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy51cGRhdGVFbGVtZW50KGxpbmUsIHVuZGVmaW5lZCwgcHJvcGVydGllcywgbW9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVFbGVtZW50cyhwb2ludHMsIDAsIHBvaW50cy5sZW5ndGgsIG1vZGUpO1xuICAgIH1cbiAgICB1cGRhdGVFbGVtZW50cyhwb2ludHMsIHN0YXJ0LCBjb3VudCwgbW9kZSkge1xuICAgICAgICBjb25zdCBzY2FsZSA9IHRoaXMuX2NhY2hlZE1ldGEuclNjYWxlO1xuICAgICAgICBjb25zdCByZXNldCA9IG1vZGUgPT09ICdyZXNldCc7XG4gICAgICAgIGZvcihsZXQgaSA9IHN0YXJ0OyBpIDwgc3RhcnQgKyBjb3VudDsgaSsrKXtcbiAgICAgICAgICAgIGNvbnN0IHBvaW50ID0gcG9pbnRzW2ldO1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMucmVzb2x2ZURhdGFFbGVtZW50T3B0aW9ucyhpLCBwb2ludC5hY3RpdmUgPyAnYWN0aXZlJyA6IG1vZGUpO1xuICAgICAgICAgICAgY29uc3QgcG9pbnRQb3NpdGlvbiA9IHNjYWxlLmdldFBvaW50UG9zaXRpb25Gb3JWYWx1ZShpLCB0aGlzLmdldFBhcnNlZChpKS5yKTtcbiAgICAgICAgICAgIGNvbnN0IHggPSByZXNldCA/IHNjYWxlLnhDZW50ZXIgOiBwb2ludFBvc2l0aW9uLng7XG4gICAgICAgICAgICBjb25zdCB5ID0gcmVzZXQgPyBzY2FsZS55Q2VudGVyIDogcG9pbnRQb3NpdGlvbi55O1xuICAgICAgICAgICAgY29uc3QgcHJvcGVydGllcyA9IHtcbiAgICAgICAgICAgICAgICB4LFxuICAgICAgICAgICAgICAgIHksXG4gICAgICAgICAgICAgICAgYW5nbGU6IHBvaW50UG9zaXRpb24uYW5nbGUsXG4gICAgICAgICAgICAgICAgc2tpcDogaXNOYU4oeCkgfHwgaXNOYU4oeSksXG4gICAgICAgICAgICAgICAgb3B0aW9uc1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRWxlbWVudChwb2ludCwgaSwgcHJvcGVydGllcywgbW9kZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmNsYXNzIFNjYXR0ZXJDb250cm9sbGVyIGV4dGVuZHMgRGF0YXNldENvbnRyb2xsZXIge1xuICAgIHN0YXRpYyBpZCA9ICdzY2F0dGVyJztcbiBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgICAgIGRhdGFzZXRFbGVtZW50VHlwZTogZmFsc2UsXG4gICAgICAgIGRhdGFFbGVtZW50VHlwZTogJ3BvaW50JyxcbiAgICAgICAgc2hvd0xpbmU6IGZhbHNlLFxuICAgICAgICBmaWxsOiBmYWxzZVxuICAgIH07XG4gc3RhdGljIG92ZXJyaWRlcyA9IHtcbiAgICAgICAgaW50ZXJhY3Rpb246IHtcbiAgICAgICAgICAgIG1vZGU6ICdwb2ludCdcbiAgICAgICAgfSxcbiAgICAgICAgc2NhbGVzOiB7XG4gICAgICAgICAgICB4OiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2xpbmVhcidcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB5OiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2xpbmVhcidcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gZ2V0TGFiZWxBbmRWYWx1ZShpbmRleCkge1xuICAgICAgICBjb25zdCBtZXRhID0gdGhpcy5fY2FjaGVkTWV0YTtcbiAgICAgICAgY29uc3QgbGFiZWxzID0gdGhpcy5jaGFydC5kYXRhLmxhYmVscyB8fCBbXTtcbiAgICAgICAgY29uc3QgeyB4U2NhbGUgLCB5U2NhbGUgIH0gPSBtZXRhO1xuICAgICAgICBjb25zdCBwYXJzZWQgPSB0aGlzLmdldFBhcnNlZChpbmRleCk7XG4gICAgICAgIGNvbnN0IHggPSB4U2NhbGUuZ2V0TGFiZWxGb3JWYWx1ZShwYXJzZWQueCk7XG4gICAgICAgIGNvbnN0IHkgPSB5U2NhbGUuZ2V0TGFiZWxGb3JWYWx1ZShwYXJzZWQueSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsYWJlbDogbGFiZWxzW2luZGV4XSB8fCAnJyxcbiAgICAgICAgICAgIHZhbHVlOiAnKCcgKyB4ICsgJywgJyArIHkgKyAnKSdcbiAgICAgICAgfTtcbiAgICB9XG4gICAgdXBkYXRlKG1vZGUpIHtcbiAgICAgICAgY29uc3QgbWV0YSA9IHRoaXMuX2NhY2hlZE1ldGE7XG4gICAgICAgIGNvbnN0IHsgZGF0YTogcG9pbnRzID0gW10gIH0gPSBtZXRhO1xuICAgICAgICBjb25zdCBhbmltYXRpb25zRGlzYWJsZWQgPSB0aGlzLmNoYXJ0Ll9hbmltYXRpb25zRGlzYWJsZWQ7XG4gICAgICAgIGxldCB7IHN0YXJ0ICwgY291bnQgIH0gPSBfZ2V0U3RhcnRBbmRDb3VudE9mVmlzaWJsZVBvaW50cyhtZXRhLCBwb2ludHMsIGFuaW1hdGlvbnNEaXNhYmxlZCk7XG4gICAgICAgIHRoaXMuX2RyYXdTdGFydCA9IHN0YXJ0O1xuICAgICAgICB0aGlzLl9kcmF3Q291bnQgPSBjb3VudDtcbiAgICAgICAgaWYgKF9zY2FsZVJhbmdlc0NoYW5nZWQobWV0YSkpIHtcbiAgICAgICAgICAgIHN0YXJ0ID0gMDtcbiAgICAgICAgICAgIGNvdW50ID0gcG9pbnRzLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNob3dMaW5lKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZGF0YXNldEVsZW1lbnRUeXBlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRFbGVtZW50cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgeyBkYXRhc2V0OiBsaW5lICwgX2RhdGFzZXQgIH0gPSBtZXRhO1xuICAgICAgICAgICAgbGluZS5fY2hhcnQgPSB0aGlzLmNoYXJ0O1xuICAgICAgICAgICAgbGluZS5fZGF0YXNldEluZGV4ID0gdGhpcy5pbmRleDtcbiAgICAgICAgICAgIGxpbmUuX2RlY2ltYXRlZCA9ICEhX2RhdGFzZXQuX2RlY2ltYXRlZDtcbiAgICAgICAgICAgIGxpbmUucG9pbnRzID0gcG9pbnRzO1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMucmVzb2x2ZURhdGFzZXRFbGVtZW50T3B0aW9ucyhtb2RlKTtcbiAgICAgICAgICAgIG9wdGlvbnMuc2VnbWVudCA9IHRoaXMub3B0aW9ucy5zZWdtZW50O1xuICAgICAgICAgICAgdGhpcy51cGRhdGVFbGVtZW50KGxpbmUsIHVuZGVmaW5lZCwge1xuICAgICAgICAgICAgICAgIGFuaW1hdGVkOiAhYW5pbWF0aW9uc0Rpc2FibGVkLFxuICAgICAgICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgICAgIH0sIG1vZGUpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZGF0YXNldEVsZW1lbnRUeXBlKSB7XG4gICAgICAgICAgICBkZWxldGUgbWV0YS5kYXRhc2V0O1xuICAgICAgICAgICAgdGhpcy5kYXRhc2V0RWxlbWVudFR5cGUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZUVsZW1lbnRzKHBvaW50cywgc3RhcnQsIGNvdW50LCBtb2RlKTtcbiAgICB9XG4gICAgYWRkRWxlbWVudHMoKSB7XG4gICAgICAgIGNvbnN0IHsgc2hvd0xpbmUgIH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIGlmICghdGhpcy5kYXRhc2V0RWxlbWVudFR5cGUgJiYgc2hvd0xpbmUpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YXNldEVsZW1lbnRUeXBlID0gdGhpcy5jaGFydC5yZWdpc3RyeS5nZXRFbGVtZW50KCdsaW5lJyk7XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIuYWRkRWxlbWVudHMoKTtcbiAgICB9XG4gICAgdXBkYXRlRWxlbWVudHMocG9pbnRzLCBzdGFydCwgY291bnQsIG1vZGUpIHtcbiAgICAgICAgY29uc3QgcmVzZXQgPSBtb2RlID09PSAncmVzZXQnO1xuICAgICAgICBjb25zdCB7IGlTY2FsZSAsIHZTY2FsZSAsIF9zdGFja2VkICwgX2RhdGFzZXQgIH0gPSB0aGlzLl9jYWNoZWRNZXRhO1xuICAgICAgICBjb25zdCBmaXJzdE9wdHMgPSB0aGlzLnJlc29sdmVEYXRhRWxlbWVudE9wdGlvbnMoc3RhcnQsIG1vZGUpO1xuICAgICAgICBjb25zdCBzaGFyZWRPcHRpb25zID0gdGhpcy5nZXRTaGFyZWRPcHRpb25zKGZpcnN0T3B0cyk7XG4gICAgICAgIGNvbnN0IGluY2x1ZGVPcHRpb25zID0gdGhpcy5pbmNsdWRlT3B0aW9ucyhtb2RlLCBzaGFyZWRPcHRpb25zKTtcbiAgICAgICAgY29uc3QgaUF4aXMgPSBpU2NhbGUuYXhpcztcbiAgICAgICAgY29uc3QgdkF4aXMgPSB2U2NhbGUuYXhpcztcbiAgICAgICAgY29uc3QgeyBzcGFuR2FwcyAsIHNlZ21lbnQgIH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIGNvbnN0IG1heEdhcExlbmd0aCA9IGlzTnVtYmVyKHNwYW5HYXBzKSA/IHNwYW5HYXBzIDogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuICAgICAgICBjb25zdCBkaXJlY3RVcGRhdGUgPSB0aGlzLmNoYXJ0Ll9hbmltYXRpb25zRGlzYWJsZWQgfHwgcmVzZXQgfHwgbW9kZSA9PT0gJ25vbmUnO1xuICAgICAgICBsZXQgcHJldlBhcnNlZCA9IHN0YXJ0ID4gMCAmJiB0aGlzLmdldFBhcnNlZChzdGFydCAtIDEpO1xuICAgICAgICBmb3IobGV0IGkgPSBzdGFydDsgaSA8IHN0YXJ0ICsgY291bnQ7ICsraSl7XG4gICAgICAgICAgICBjb25zdCBwb2ludCA9IHBvaW50c1tpXTtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IHRoaXMuZ2V0UGFyc2VkKGkpO1xuICAgICAgICAgICAgY29uc3QgcHJvcGVydGllcyA9IGRpcmVjdFVwZGF0ZSA/IHBvaW50IDoge307XG4gICAgICAgICAgICBjb25zdCBudWxsRGF0YSA9IGlzTnVsbE9yVW5kZWYocGFyc2VkW3ZBeGlzXSk7XG4gICAgICAgICAgICBjb25zdCBpUGl4ZWwgPSBwcm9wZXJ0aWVzW2lBeGlzXSA9IGlTY2FsZS5nZXRQaXhlbEZvclZhbHVlKHBhcnNlZFtpQXhpc10sIGkpO1xuICAgICAgICAgICAgY29uc3QgdlBpeGVsID0gcHJvcGVydGllc1t2QXhpc10gPSByZXNldCB8fCBudWxsRGF0YSA/IHZTY2FsZS5nZXRCYXNlUGl4ZWwoKSA6IHZTY2FsZS5nZXRQaXhlbEZvclZhbHVlKF9zdGFja2VkID8gdGhpcy5hcHBseVN0YWNrKHZTY2FsZSwgcGFyc2VkLCBfc3RhY2tlZCkgOiBwYXJzZWRbdkF4aXNdLCBpKTtcbiAgICAgICAgICAgIHByb3BlcnRpZXMuc2tpcCA9IGlzTmFOKGlQaXhlbCkgfHwgaXNOYU4odlBpeGVsKSB8fCBudWxsRGF0YTtcbiAgICAgICAgICAgIHByb3BlcnRpZXMuc3RvcCA9IGkgPiAwICYmIE1hdGguYWJzKHBhcnNlZFtpQXhpc10gLSBwcmV2UGFyc2VkW2lBeGlzXSkgPiBtYXhHYXBMZW5ndGg7XG4gICAgICAgICAgICBpZiAoc2VnbWVudCkge1xuICAgICAgICAgICAgICAgIHByb3BlcnRpZXMucGFyc2VkID0gcGFyc2VkO1xuICAgICAgICAgICAgICAgIHByb3BlcnRpZXMucmF3ID0gX2RhdGFzZXQuZGF0YVtpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpbmNsdWRlT3B0aW9ucykge1xuICAgICAgICAgICAgICAgIHByb3BlcnRpZXMub3B0aW9ucyA9IHNoYXJlZE9wdGlvbnMgfHwgdGhpcy5yZXNvbHZlRGF0YUVsZW1lbnRPcHRpb25zKGksIHBvaW50LmFjdGl2ZSA/ICdhY3RpdmUnIDogbW9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWRpcmVjdFVwZGF0ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRWxlbWVudChwb2ludCwgaSwgcHJvcGVydGllcywgbW9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcmV2UGFyc2VkID0gcGFyc2VkO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlU2hhcmVkT3B0aW9ucyhzaGFyZWRPcHRpb25zLCBtb2RlLCBmaXJzdE9wdHMpO1xuICAgIH1cbiBnZXRNYXhPdmVyZmxvdygpIHtcbiAgICAgICAgY29uc3QgbWV0YSA9IHRoaXMuX2NhY2hlZE1ldGE7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBtZXRhLmRhdGEgfHwgW107XG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zLnNob3dMaW5lKSB7XG4gICAgICAgICAgICBsZXQgbWF4ID0gMDtcbiAgICAgICAgICAgIGZvcihsZXQgaSA9IGRhdGEubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpe1xuICAgICAgICAgICAgICAgIG1heCA9IE1hdGgubWF4KG1heCwgZGF0YVtpXS5zaXplKHRoaXMucmVzb2x2ZURhdGFFbGVtZW50T3B0aW9ucyhpKSkgLyAyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBtYXggPiAwICYmIG1heDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkYXRhc2V0ID0gbWV0YS5kYXRhc2V0O1xuICAgICAgICBjb25zdCBib3JkZXIgPSBkYXRhc2V0Lm9wdGlvbnMgJiYgZGF0YXNldC5vcHRpb25zLmJvcmRlcldpZHRoIHx8IDA7XG4gICAgICAgIGlmICghZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBib3JkZXI7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmlyc3RQb2ludCA9IGRhdGFbMF0uc2l6ZSh0aGlzLnJlc29sdmVEYXRhRWxlbWVudE9wdGlvbnMoMCkpO1xuICAgICAgICBjb25zdCBsYXN0UG9pbnQgPSBkYXRhW2RhdGEubGVuZ3RoIC0gMV0uc2l6ZSh0aGlzLnJlc29sdmVEYXRhRWxlbWVudE9wdGlvbnMoZGF0YS5sZW5ndGggLSAxKSk7XG4gICAgICAgIHJldHVybiBNYXRoLm1heChib3JkZXIsIGZpcnN0UG9pbnQsIGxhc3RQb2ludCkgLyAyO1xuICAgIH1cbn1cblxudmFyIGNvbnRyb2xsZXJzID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoe1xuX19wcm90b19fOiBudWxsLFxuQmFyQ29udHJvbGxlcjogQmFyQ29udHJvbGxlcixcbkJ1YmJsZUNvbnRyb2xsZXI6IEJ1YmJsZUNvbnRyb2xsZXIsXG5Eb3VnaG51dENvbnRyb2xsZXI6IERvdWdobnV0Q29udHJvbGxlcixcbkxpbmVDb250cm9sbGVyOiBMaW5lQ29udHJvbGxlcixcblBpZUNvbnRyb2xsZXI6IFBpZUNvbnRyb2xsZXIsXG5Qb2xhckFyZWFDb250cm9sbGVyOiBQb2xhckFyZWFDb250cm9sbGVyLFxuUmFkYXJDb250cm9sbGVyOiBSYWRhckNvbnRyb2xsZXIsXG5TY2F0dGVyQ29udHJvbGxlcjogU2NhdHRlckNvbnRyb2xsZXJcbn0pO1xuXG4vKipcbiAqIEBuYW1lc3BhY2UgQ2hhcnQuX2FkYXB0ZXJzXG4gKiBAc2luY2UgMi44LjBcbiAqIEBwcml2YXRlXG4gKi8gZnVuY3Rpb24gYWJzdHJhY3QoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQ6IENoZWNrIHRoYXQgYSBjb21wbGV0ZSBkYXRlIGFkYXB0ZXIgaXMgcHJvdmlkZWQuJyk7XG59XG4vKipcbiAqIERhdGUgYWRhcHRlciAoY3VycmVudCB1c2VkIGJ5IHRoZSB0aW1lIHNjYWxlKVxuICogQG5hbWVzcGFjZSBDaGFydC5fYWRhcHRlcnMuX2RhdGVcbiAqIEBtZW1iZXJvZiBDaGFydC5fYWRhcHRlcnNcbiAqIEBwcml2YXRlXG4gKi8gY2xhc3MgRGF0ZUFkYXB0ZXJCYXNlIHtcbiAgICAvKipcbiAgICogT3ZlcnJpZGUgZGVmYXVsdCBkYXRlIGFkYXB0ZXIgbWV0aG9kcy5cbiAgICogQWNjZXB0cyB0eXBlIHBhcmFtZXRlciB0byBkZWZpbmUgb3B0aW9ucyB0eXBlLlxuICAgKiBAZXhhbXBsZVxuICAgKiBDaGFydC5fYWRhcHRlcnMuX2RhdGUub3ZlcnJpZGU8e215QWRhcHRlck9wdGlvbjogc3RyaW5nfT4oe1xuICAgKiAgIGluaXQoKSB7XG4gICAqICAgICBjb25zb2xlLmxvZyh0aGlzLm9wdGlvbnMubXlBZGFwdGVyT3B0aW9uKTtcbiAgICogICB9XG4gICAqIH0pXG4gICAqLyBzdGF0aWMgb3ZlcnJpZGUobWVtYmVycykge1xuICAgICAgICBPYmplY3QuYXNzaWduKERhdGVBZGFwdGVyQmFzZS5wcm90b3R5cGUsIG1lbWJlcnMpO1xuICAgIH1cbiAgICBvcHRpb25zO1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpe1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gICAgaW5pdCgpIHt9XG4gICAgZm9ybWF0cygpIHtcbiAgICAgICAgcmV0dXJuIGFic3RyYWN0KCk7XG4gICAgfVxuICAgIHBhcnNlKCkge1xuICAgICAgICByZXR1cm4gYWJzdHJhY3QoKTtcbiAgICB9XG4gICAgZm9ybWF0KCkge1xuICAgICAgICByZXR1cm4gYWJzdHJhY3QoKTtcbiAgICB9XG4gICAgYWRkKCkge1xuICAgICAgICByZXR1cm4gYWJzdHJhY3QoKTtcbiAgICB9XG4gICAgZGlmZigpIHtcbiAgICAgICAgcmV0dXJuIGFic3RyYWN0KCk7XG4gICAgfVxuICAgIHN0YXJ0T2YoKSB7XG4gICAgICAgIHJldHVybiBhYnN0cmFjdCgpO1xuICAgIH1cbiAgICBlbmRPZigpIHtcbiAgICAgICAgcmV0dXJuIGFic3RyYWN0KCk7XG4gICAgfVxufVxudmFyIGFkYXB0ZXJzID0ge1xuICAgIF9kYXRlOiBEYXRlQWRhcHRlckJhc2Vcbn07XG5cbmZ1bmN0aW9uIGJpbmFyeVNlYXJjaChtZXRhc2V0LCBheGlzLCB2YWx1ZSwgaW50ZXJzZWN0KSB7XG4gICAgY29uc3QgeyBjb250cm9sbGVyICwgZGF0YSAsIF9zb3J0ZWQgIH0gPSBtZXRhc2V0O1xuICAgIGNvbnN0IGlTY2FsZSA9IGNvbnRyb2xsZXIuX2NhY2hlZE1ldGEuaVNjYWxlO1xuICAgIGlmIChpU2NhbGUgJiYgYXhpcyA9PT0gaVNjYWxlLmF4aXMgJiYgYXhpcyAhPT0gJ3InICYmIF9zb3J0ZWQgJiYgZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgbG9va3VwTWV0aG9kID0gaVNjYWxlLl9yZXZlcnNlUGl4ZWxzID8gX3Jsb29rdXBCeUtleSA6IF9sb29rdXBCeUtleTtcbiAgICAgICAgaWYgKCFpbnRlcnNlY3QpIHtcbiAgICAgICAgICAgIHJldHVybiBsb29rdXBNZXRob2QoZGF0YSwgYXhpcywgdmFsdWUpO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbnRyb2xsZXIuX3NoYXJlZE9wdGlvbnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsID0gZGF0YVswXTtcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gdHlwZW9mIGVsLmdldFJhbmdlID09PSAnZnVuY3Rpb24nICYmIGVsLmdldFJhbmdlKGF4aXMpO1xuICAgICAgICAgICAgaWYgKHJhbmdlKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBsb29rdXBNZXRob2QoZGF0YSwgYXhpcywgdmFsdWUgLSByYW5nZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZW5kID0gbG9va3VwTWV0aG9kKGRhdGEsIGF4aXMsIHZhbHVlICsgcmFuZ2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGxvOiBzdGFydC5sbyxcbiAgICAgICAgICAgICAgICAgICAgaGk6IGVuZC5oaVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbG86IDAsXG4gICAgICAgIGhpOiBkYXRhLmxlbmd0aCAtIDFcbiAgICB9O1xufVxuIGZ1bmN0aW9uIGV2YWx1YXRlSW50ZXJhY3Rpb25JdGVtcyhjaGFydCwgYXhpcywgcG9zaXRpb24sIGhhbmRsZXIsIGludGVyc2VjdCkge1xuICAgIGNvbnN0IG1ldGFzZXRzID0gY2hhcnQuZ2V0U29ydGVkVmlzaWJsZURhdGFzZXRNZXRhcygpO1xuICAgIGNvbnN0IHZhbHVlID0gcG9zaXRpb25bYXhpc107XG4gICAgZm9yKGxldCBpID0gMCwgaWxlbiA9IG1ldGFzZXRzLmxlbmd0aDsgaSA8IGlsZW47ICsraSl7XG4gICAgICAgIGNvbnN0IHsgaW5kZXggLCBkYXRhICB9ID0gbWV0YXNldHNbaV07XG4gICAgICAgIGNvbnN0IHsgbG8gLCBoaSAgfSA9IGJpbmFyeVNlYXJjaChtZXRhc2V0c1tpXSwgYXhpcywgdmFsdWUsIGludGVyc2VjdCk7XG4gICAgICAgIGZvcihsZXQgaiA9IGxvOyBqIDw9IGhpOyArK2ope1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGRhdGFbal07XG4gICAgICAgICAgICBpZiAoIWVsZW1lbnQuc2tpcCkge1xuICAgICAgICAgICAgICAgIGhhbmRsZXIoZWxlbWVudCwgaW5kZXgsIGopO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIGZ1bmN0aW9uIGdldERpc3RhbmNlTWV0cmljRm9yQXhpcyhheGlzKSB7XG4gICAgY29uc3QgdXNlWCA9IGF4aXMuaW5kZXhPZigneCcpICE9PSAtMTtcbiAgICBjb25zdCB1c2VZID0gYXhpcy5pbmRleE9mKCd5JykgIT09IC0xO1xuICAgIHJldHVybiBmdW5jdGlvbihwdDEsIHB0Mikge1xuICAgICAgICBjb25zdCBkZWx0YVggPSB1c2VYID8gTWF0aC5hYnMocHQxLnggLSBwdDIueCkgOiAwO1xuICAgICAgICBjb25zdCBkZWx0YVkgPSB1c2VZID8gTWF0aC5hYnMocHQxLnkgLSBwdDIueSkgOiAwO1xuICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KE1hdGgucG93KGRlbHRhWCwgMikgKyBNYXRoLnBvdyhkZWx0YVksIDIpKTtcbiAgICB9O1xufVxuIGZ1bmN0aW9uIGdldEludGVyc2VjdEl0ZW1zKGNoYXJ0LCBwb3NpdGlvbiwgYXhpcywgdXNlRmluYWxQb3NpdGlvbiwgaW5jbHVkZUludmlzaWJsZSkge1xuICAgIGNvbnN0IGl0ZW1zID0gW107XG4gICAgaWYgKCFpbmNsdWRlSW52aXNpYmxlICYmICFjaGFydC5pc1BvaW50SW5BcmVhKHBvc2l0aW9uKSkge1xuICAgICAgICByZXR1cm4gaXRlbXM7XG4gICAgfVxuICAgIGNvbnN0IGV2YWx1YXRpb25GdW5jID0gZnVuY3Rpb24oZWxlbWVudCwgZGF0YXNldEluZGV4LCBpbmRleCkge1xuICAgICAgICBpZiAoIWluY2x1ZGVJbnZpc2libGUgJiYgIV9pc1BvaW50SW5BcmVhKGVsZW1lbnQsIGNoYXJ0LmNoYXJ0QXJlYSwgMCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZWxlbWVudC5pblJhbmdlKHBvc2l0aW9uLngsIHBvc2l0aW9uLnksIHVzZUZpbmFsUG9zaXRpb24pKSB7XG4gICAgICAgICAgICBpdGVtcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgICAgICAgIGRhdGFzZXRJbmRleCxcbiAgICAgICAgICAgICAgICBpbmRleFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGV2YWx1YXRlSW50ZXJhY3Rpb25JdGVtcyhjaGFydCwgYXhpcywgcG9zaXRpb24sIGV2YWx1YXRpb25GdW5jLCB0cnVlKTtcbiAgICByZXR1cm4gaXRlbXM7XG59XG4gZnVuY3Rpb24gZ2V0TmVhcmVzdFJhZGlhbEl0ZW1zKGNoYXJ0LCBwb3NpdGlvbiwgYXhpcywgdXNlRmluYWxQb3NpdGlvbikge1xuICAgIGxldCBpdGVtcyA9IFtdO1xuICAgIGZ1bmN0aW9uIGV2YWx1YXRpb25GdW5jKGVsZW1lbnQsIGRhdGFzZXRJbmRleCwgaW5kZXgpIHtcbiAgICAgICAgY29uc3QgeyBzdGFydEFuZ2xlICwgZW5kQW5nbGUgIH0gPSBlbGVtZW50LmdldFByb3BzKFtcbiAgICAgICAgICAgICdzdGFydEFuZ2xlJyxcbiAgICAgICAgICAgICdlbmRBbmdsZSdcbiAgICAgICAgXSwgdXNlRmluYWxQb3NpdGlvbik7XG4gICAgICAgIGNvbnN0IHsgYW5nbGUgIH0gPSBnZXRBbmdsZUZyb21Qb2ludChlbGVtZW50LCB7XG4gICAgICAgICAgICB4OiBwb3NpdGlvbi54LFxuICAgICAgICAgICAgeTogcG9zaXRpb24ueVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKF9hbmdsZUJldHdlZW4oYW5nbGUsIHN0YXJ0QW5nbGUsIGVuZEFuZ2xlKSkge1xuICAgICAgICAgICAgaXRlbXMucHVzaCh7XG4gICAgICAgICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICAgICAgICBkYXRhc2V0SW5kZXgsXG4gICAgICAgICAgICAgICAgaW5kZXhcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGV2YWx1YXRlSW50ZXJhY3Rpb25JdGVtcyhjaGFydCwgYXhpcywgcG9zaXRpb24sIGV2YWx1YXRpb25GdW5jKTtcbiAgICByZXR1cm4gaXRlbXM7XG59XG4gZnVuY3Rpb24gZ2V0TmVhcmVzdENhcnRlc2lhbkl0ZW1zKGNoYXJ0LCBwb3NpdGlvbiwgYXhpcywgaW50ZXJzZWN0LCB1c2VGaW5hbFBvc2l0aW9uLCBpbmNsdWRlSW52aXNpYmxlKSB7XG4gICAgbGV0IGl0ZW1zID0gW107XG4gICAgY29uc3QgZGlzdGFuY2VNZXRyaWMgPSBnZXREaXN0YW5jZU1ldHJpY0ZvckF4aXMoYXhpcyk7XG4gICAgbGV0IG1pbkRpc3RhbmNlID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuICAgIGZ1bmN0aW9uIGV2YWx1YXRpb25GdW5jKGVsZW1lbnQsIGRhdGFzZXRJbmRleCwgaW5kZXgpIHtcbiAgICAgICAgY29uc3QgaW5SYW5nZSA9IGVsZW1lbnQuaW5SYW5nZShwb3NpdGlvbi54LCBwb3NpdGlvbi55LCB1c2VGaW5hbFBvc2l0aW9uKTtcbiAgICAgICAgaWYgKGludGVyc2VjdCAmJiAhaW5SYW5nZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNlbnRlciA9IGVsZW1lbnQuZ2V0Q2VudGVyUG9pbnQodXNlRmluYWxQb3NpdGlvbik7XG4gICAgICAgIGNvbnN0IHBvaW50SW5BcmVhID0gISFpbmNsdWRlSW52aXNpYmxlIHx8IGNoYXJ0LmlzUG9pbnRJbkFyZWEoY2VudGVyKTtcbiAgICAgICAgaWYgKCFwb2ludEluQXJlYSAmJiAhaW5SYW5nZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRpc3RhbmNlID0gZGlzdGFuY2VNZXRyaWMocG9zaXRpb24sIGNlbnRlcik7XG4gICAgICAgIGlmIChkaXN0YW5jZSA8IG1pbkRpc3RhbmNlKSB7XG4gICAgICAgICAgICBpdGVtcyA9IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIGRhdGFzZXRJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgaW5kZXhcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbWluRGlzdGFuY2UgPSBkaXN0YW5jZTtcbiAgICAgICAgfSBlbHNlIGlmIChkaXN0YW5jZSA9PT0gbWluRGlzdGFuY2UpIHtcbiAgICAgICAgICAgIGl0ZW1zLnB1c2goe1xuICAgICAgICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgICAgICAgZGF0YXNldEluZGV4LFxuICAgICAgICAgICAgICAgIGluZGV4XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBldmFsdWF0ZUludGVyYWN0aW9uSXRlbXMoY2hhcnQsIGF4aXMsIHBvc2l0aW9uLCBldmFsdWF0aW9uRnVuYyk7XG4gICAgcmV0dXJuIGl0ZW1zO1xufVxuIGZ1bmN0aW9uIGdldE5lYXJlc3RJdGVtcyhjaGFydCwgcG9zaXRpb24sIGF4aXMsIGludGVyc2VjdCwgdXNlRmluYWxQb3NpdGlvbiwgaW5jbHVkZUludmlzaWJsZSkge1xuICAgIGlmICghaW5jbHVkZUludmlzaWJsZSAmJiAhY2hhcnQuaXNQb2ludEluQXJlYShwb3NpdGlvbikpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICByZXR1cm4gYXhpcyA9PT0gJ3InICYmICFpbnRlcnNlY3QgPyBnZXROZWFyZXN0UmFkaWFsSXRlbXMoY2hhcnQsIHBvc2l0aW9uLCBheGlzLCB1c2VGaW5hbFBvc2l0aW9uKSA6IGdldE5lYXJlc3RDYXJ0ZXNpYW5JdGVtcyhjaGFydCwgcG9zaXRpb24sIGF4aXMsIGludGVyc2VjdCwgdXNlRmluYWxQb3NpdGlvbiwgaW5jbHVkZUludmlzaWJsZSk7XG59XG4gZnVuY3Rpb24gZ2V0QXhpc0l0ZW1zKGNoYXJ0LCBwb3NpdGlvbiwgYXhpcywgaW50ZXJzZWN0LCB1c2VGaW5hbFBvc2l0aW9uKSB7XG4gICAgY29uc3QgaXRlbXMgPSBbXTtcbiAgICBjb25zdCByYW5nZU1ldGhvZCA9IGF4aXMgPT09ICd4JyA/ICdpblhSYW5nZScgOiAnaW5ZUmFuZ2UnO1xuICAgIGxldCBpbnRlcnNlY3RzSXRlbSA9IGZhbHNlO1xuICAgIGV2YWx1YXRlSW50ZXJhY3Rpb25JdGVtcyhjaGFydCwgYXhpcywgcG9zaXRpb24sIChlbGVtZW50LCBkYXRhc2V0SW5kZXgsIGluZGV4KT0+e1xuICAgICAgICBpZiAoZWxlbWVudFtyYW5nZU1ldGhvZF0ocG9zaXRpb25bYXhpc10sIHVzZUZpbmFsUG9zaXRpb24pKSB7XG4gICAgICAgICAgICBpdGVtcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgICAgICAgIGRhdGFzZXRJbmRleCxcbiAgICAgICAgICAgICAgICBpbmRleFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpbnRlcnNlY3RzSXRlbSA9IGludGVyc2VjdHNJdGVtIHx8IGVsZW1lbnQuaW5SYW5nZShwb3NpdGlvbi54LCBwb3NpdGlvbi55LCB1c2VGaW5hbFBvc2l0aW9uKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChpbnRlcnNlY3QgJiYgIWludGVyc2VjdHNJdGVtKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW1zO1xufVxuIHZhciBJbnRlcmFjdGlvbiA9IHtcbiAgICBldmFsdWF0ZUludGVyYWN0aW9uSXRlbXMsXG4gICAgbW9kZXM6IHtcbiBpbmRleCAoY2hhcnQsIGUsIG9wdGlvbnMsIHVzZUZpbmFsUG9zaXRpb24pIHtcbiAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uID0gZ2V0UmVsYXRpdmVQb3NpdGlvbihlLCBjaGFydCk7XG4gICAgICAgICAgICBjb25zdCBheGlzID0gb3B0aW9ucy5heGlzIHx8ICd4JztcbiAgICAgICAgICAgIGNvbnN0IGluY2x1ZGVJbnZpc2libGUgPSBvcHRpb25zLmluY2x1ZGVJbnZpc2libGUgfHwgZmFsc2U7XG4gICAgICAgICAgICBjb25zdCBpdGVtcyA9IG9wdGlvbnMuaW50ZXJzZWN0ID8gZ2V0SW50ZXJzZWN0SXRlbXMoY2hhcnQsIHBvc2l0aW9uLCBheGlzLCB1c2VGaW5hbFBvc2l0aW9uLCBpbmNsdWRlSW52aXNpYmxlKSA6IGdldE5lYXJlc3RJdGVtcyhjaGFydCwgcG9zaXRpb24sIGF4aXMsIGZhbHNlLCB1c2VGaW5hbFBvc2l0aW9uLCBpbmNsdWRlSW52aXNpYmxlKTtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzID0gW107XG4gICAgICAgICAgICBpZiAoIWl0ZW1zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNoYXJ0LmdldFNvcnRlZFZpc2libGVEYXRhc2V0TWV0YXMoKS5mb3JFYWNoKChtZXRhKT0+e1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gaXRlbXNbMF0uaW5kZXg7XG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IG1ldGEuZGF0YVtpbmRleF07XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgJiYgIWVsZW1lbnQuc2tpcCkge1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50cy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhc2V0SW5kZXg6IG1ldGEuaW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50cztcbiAgICAgICAgfSxcbiBkYXRhc2V0IChjaGFydCwgZSwgb3B0aW9ucywgdXNlRmluYWxQb3NpdGlvbikge1xuICAgICAgICAgICAgY29uc3QgcG9zaXRpb24gPSBnZXRSZWxhdGl2ZVBvc2l0aW9uKGUsIGNoYXJ0KTtcbiAgICAgICAgICAgIGNvbnN0IGF4aXMgPSBvcHRpb25zLmF4aXMgfHwgJ3h5JztcbiAgICAgICAgICAgIGNvbnN0IGluY2x1ZGVJbnZpc2libGUgPSBvcHRpb25zLmluY2x1ZGVJbnZpc2libGUgfHwgZmFsc2U7XG4gICAgICAgICAgICBsZXQgaXRlbXMgPSBvcHRpb25zLmludGVyc2VjdCA/IGdldEludGVyc2VjdEl0ZW1zKGNoYXJ0LCBwb3NpdGlvbiwgYXhpcywgdXNlRmluYWxQb3NpdGlvbiwgaW5jbHVkZUludmlzaWJsZSkgOiBnZXROZWFyZXN0SXRlbXMoY2hhcnQsIHBvc2l0aW9uLCBheGlzLCBmYWxzZSwgdXNlRmluYWxQb3NpdGlvbiwgaW5jbHVkZUludmlzaWJsZSk7XG4gICAgICAgICAgICBpZiAoaXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFzZXRJbmRleCA9IGl0ZW1zWzBdLmRhdGFzZXRJbmRleDtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gY2hhcnQuZ2V0RGF0YXNldE1ldGEoZGF0YXNldEluZGV4KS5kYXRhO1xuICAgICAgICAgICAgICAgIGl0ZW1zID0gW107XG4gICAgICAgICAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyArK2kpe1xuICAgICAgICAgICAgICAgICAgICBpdGVtcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IGRhdGFbaV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhc2V0SW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogaVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaXRlbXM7XG4gICAgICAgIH0sXG4gcG9pbnQgKGNoYXJ0LCBlLCBvcHRpb25zLCB1c2VGaW5hbFBvc2l0aW9uKSB7XG4gICAgICAgICAgICBjb25zdCBwb3NpdGlvbiA9IGdldFJlbGF0aXZlUG9zaXRpb24oZSwgY2hhcnQpO1xuICAgICAgICAgICAgY29uc3QgYXhpcyA9IG9wdGlvbnMuYXhpcyB8fCAneHknO1xuICAgICAgICAgICAgY29uc3QgaW5jbHVkZUludmlzaWJsZSA9IG9wdGlvbnMuaW5jbHVkZUludmlzaWJsZSB8fCBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiBnZXRJbnRlcnNlY3RJdGVtcyhjaGFydCwgcG9zaXRpb24sIGF4aXMsIHVzZUZpbmFsUG9zaXRpb24sIGluY2x1ZGVJbnZpc2libGUpO1xuICAgICAgICB9LFxuIG5lYXJlc3QgKGNoYXJ0LCBlLCBvcHRpb25zLCB1c2VGaW5hbFBvc2l0aW9uKSB7XG4gICAgICAgICAgICBjb25zdCBwb3NpdGlvbiA9IGdldFJlbGF0aXZlUG9zaXRpb24oZSwgY2hhcnQpO1xuICAgICAgICAgICAgY29uc3QgYXhpcyA9IG9wdGlvbnMuYXhpcyB8fCAneHknO1xuICAgICAgICAgICAgY29uc3QgaW5jbHVkZUludmlzaWJsZSA9IG9wdGlvbnMuaW5jbHVkZUludmlzaWJsZSB8fCBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiBnZXROZWFyZXN0SXRlbXMoY2hhcnQsIHBvc2l0aW9uLCBheGlzLCBvcHRpb25zLmludGVyc2VjdCwgdXNlRmluYWxQb3NpdGlvbiwgaW5jbHVkZUludmlzaWJsZSk7XG4gICAgICAgIH0sXG4geCAoY2hhcnQsIGUsIG9wdGlvbnMsIHVzZUZpbmFsUG9zaXRpb24pIHtcbiAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uID0gZ2V0UmVsYXRpdmVQb3NpdGlvbihlLCBjaGFydCk7XG4gICAgICAgICAgICByZXR1cm4gZ2V0QXhpc0l0ZW1zKGNoYXJ0LCBwb3NpdGlvbiwgJ3gnLCBvcHRpb25zLmludGVyc2VjdCwgdXNlRmluYWxQb3NpdGlvbik7XG4gICAgICAgIH0sXG4geSAoY2hhcnQsIGUsIG9wdGlvbnMsIHVzZUZpbmFsUG9zaXRpb24pIHtcbiAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uID0gZ2V0UmVsYXRpdmVQb3NpdGlvbihlLCBjaGFydCk7XG4gICAgICAgICAgICByZXR1cm4gZ2V0QXhpc0l0ZW1zKGNoYXJ0LCBwb3NpdGlvbiwgJ3knLCBvcHRpb25zLmludGVyc2VjdCwgdXNlRmluYWxQb3NpdGlvbik7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5jb25zdCBTVEFUSUNfUE9TSVRJT05TID0gW1xuICAgICdsZWZ0JyxcbiAgICAndG9wJyxcbiAgICAncmlnaHQnLFxuICAgICdib3R0b20nXG5dO1xuZnVuY3Rpb24gZmlsdGVyQnlQb3NpdGlvbihhcnJheSwgcG9zaXRpb24pIHtcbiAgICByZXR1cm4gYXJyYXkuZmlsdGVyKCh2KT0+di5wb3MgPT09IHBvc2l0aW9uKTtcbn1cbmZ1bmN0aW9uIGZpbHRlckR5bmFtaWNQb3NpdGlvbkJ5QXhpcyhhcnJheSwgYXhpcykge1xuICAgIHJldHVybiBhcnJheS5maWx0ZXIoKHYpPT5TVEFUSUNfUE9TSVRJT05TLmluZGV4T2Yodi5wb3MpID09PSAtMSAmJiB2LmJveC5heGlzID09PSBheGlzKTtcbn1cbmZ1bmN0aW9uIHNvcnRCeVdlaWdodChhcnJheSwgcmV2ZXJzZSkge1xuICAgIHJldHVybiBhcnJheS5zb3J0KChhLCBiKT0+e1xuICAgICAgICBjb25zdCB2MCA9IHJldmVyc2UgPyBiIDogYTtcbiAgICAgICAgY29uc3QgdjEgPSByZXZlcnNlID8gYSA6IGI7XG4gICAgICAgIHJldHVybiB2MC53ZWlnaHQgPT09IHYxLndlaWdodCA/IHYwLmluZGV4IC0gdjEuaW5kZXggOiB2MC53ZWlnaHQgLSB2MS53ZWlnaHQ7XG4gICAgfSk7XG59XG5mdW5jdGlvbiB3cmFwQm94ZXMoYm94ZXMpIHtcbiAgICBjb25zdCBsYXlvdXRCb3hlcyA9IFtdO1xuICAgIGxldCBpLCBpbGVuLCBib3gsIHBvcywgc3RhY2ssIHN0YWNrV2VpZ2h0O1xuICAgIGZvcihpID0gMCwgaWxlbiA9IChib3hlcyB8fCBbXSkubGVuZ3RoOyBpIDwgaWxlbjsgKytpKXtcbiAgICAgICAgYm94ID0gYm94ZXNbaV07XG4gICAgICAgICh7IHBvc2l0aW9uOiBwb3MgLCBvcHRpb25zOiB7IHN0YWNrICwgc3RhY2tXZWlnaHQgPTEgIH0gIH0gPSBib3gpO1xuICAgICAgICBsYXlvdXRCb3hlcy5wdXNoKHtcbiAgICAgICAgICAgIGluZGV4OiBpLFxuICAgICAgICAgICAgYm94LFxuICAgICAgICAgICAgcG9zLFxuICAgICAgICAgICAgaG9yaXpvbnRhbDogYm94LmlzSG9yaXpvbnRhbCgpLFxuICAgICAgICAgICAgd2VpZ2h0OiBib3gud2VpZ2h0LFxuICAgICAgICAgICAgc3RhY2s6IHN0YWNrICYmIHBvcyArIHN0YWNrLFxuICAgICAgICAgICAgc3RhY2tXZWlnaHRcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBsYXlvdXRCb3hlcztcbn1cbmZ1bmN0aW9uIGJ1aWxkU3RhY2tzKGxheW91dHMpIHtcbiAgICBjb25zdCBzdGFja3MgPSB7fTtcbiAgICBmb3IgKGNvbnN0IHdyYXAgb2YgbGF5b3V0cyl7XG4gICAgICAgIGNvbnN0IHsgc3RhY2sgLCBwb3MgLCBzdGFja1dlaWdodCAgfSA9IHdyYXA7XG4gICAgICAgIGlmICghc3RhY2sgfHwgIVNUQVRJQ19QT1NJVElPTlMuaW5jbHVkZXMocG9zKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgX3N0YWNrID0gc3RhY2tzW3N0YWNrXSB8fCAoc3RhY2tzW3N0YWNrXSA9IHtcbiAgICAgICAgICAgIGNvdW50OiAwLFxuICAgICAgICAgICAgcGxhY2VkOiAwLFxuICAgICAgICAgICAgd2VpZ2h0OiAwLFxuICAgICAgICAgICAgc2l6ZTogMFxuICAgICAgICB9KTtcbiAgICAgICAgX3N0YWNrLmNvdW50Kys7XG4gICAgICAgIF9zdGFjay53ZWlnaHQgKz0gc3RhY2tXZWlnaHQ7XG4gICAgfVxuICAgIHJldHVybiBzdGFja3M7XG59XG4gZnVuY3Rpb24gc2V0TGF5b3V0RGltcyhsYXlvdXRzLCBwYXJhbXMpIHtcbiAgICBjb25zdCBzdGFja3MgPSBidWlsZFN0YWNrcyhsYXlvdXRzKTtcbiAgICBjb25zdCB7IHZCb3hNYXhXaWR0aCAsIGhCb3hNYXhIZWlnaHQgIH0gPSBwYXJhbXM7XG4gICAgbGV0IGksIGlsZW4sIGxheW91dDtcbiAgICBmb3IoaSA9IDAsIGlsZW4gPSBsYXlvdXRzLmxlbmd0aDsgaSA8IGlsZW47ICsraSl7XG4gICAgICAgIGxheW91dCA9IGxheW91dHNbaV07XG4gICAgICAgIGNvbnN0IHsgZnVsbFNpemUgIH0gPSBsYXlvdXQuYm94O1xuICAgICAgICBjb25zdCBzdGFjayA9IHN0YWNrc1tsYXlvdXQuc3RhY2tdO1xuICAgICAgICBjb25zdCBmYWN0b3IgPSBzdGFjayAmJiBsYXlvdXQuc3RhY2tXZWlnaHQgLyBzdGFjay53ZWlnaHQ7XG4gICAgICAgIGlmIChsYXlvdXQuaG9yaXpvbnRhbCkge1xuICAgICAgICAgICAgbGF5b3V0LndpZHRoID0gZmFjdG9yID8gZmFjdG9yICogdkJveE1heFdpZHRoIDogZnVsbFNpemUgJiYgcGFyYW1zLmF2YWlsYWJsZVdpZHRoO1xuICAgICAgICAgICAgbGF5b3V0LmhlaWdodCA9IGhCb3hNYXhIZWlnaHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsYXlvdXQud2lkdGggPSB2Qm94TWF4V2lkdGg7XG4gICAgICAgICAgICBsYXlvdXQuaGVpZ2h0ID0gZmFjdG9yID8gZmFjdG9yICogaEJveE1heEhlaWdodCA6IGZ1bGxTaXplICYmIHBhcmFtcy5hdmFpbGFibGVIZWlnaHQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN0YWNrcztcbn1cbmZ1bmN0aW9uIGJ1aWxkTGF5b3V0Qm94ZXMoYm94ZXMpIHtcbiAgICBjb25zdCBsYXlvdXRCb3hlcyA9IHdyYXBCb3hlcyhib3hlcyk7XG4gICAgY29uc3QgZnVsbFNpemUgPSBzb3J0QnlXZWlnaHQobGF5b3V0Qm94ZXMuZmlsdGVyKCh3cmFwKT0+d3JhcC5ib3guZnVsbFNpemUpLCB0cnVlKTtcbiAgICBjb25zdCBsZWZ0ID0gc29ydEJ5V2VpZ2h0KGZpbHRlckJ5UG9zaXRpb24obGF5b3V0Qm94ZXMsICdsZWZ0JyksIHRydWUpO1xuICAgIGNvbnN0IHJpZ2h0ID0gc29ydEJ5V2VpZ2h0KGZpbHRlckJ5UG9zaXRpb24obGF5b3V0Qm94ZXMsICdyaWdodCcpKTtcbiAgICBjb25zdCB0b3AgPSBzb3J0QnlXZWlnaHQoZmlsdGVyQnlQb3NpdGlvbihsYXlvdXRCb3hlcywgJ3RvcCcpLCB0cnVlKTtcbiAgICBjb25zdCBib3R0b20gPSBzb3J0QnlXZWlnaHQoZmlsdGVyQnlQb3NpdGlvbihsYXlvdXRCb3hlcywgJ2JvdHRvbScpKTtcbiAgICBjb25zdCBjZW50ZXJIb3Jpem9udGFsID0gZmlsdGVyRHluYW1pY1Bvc2l0aW9uQnlBeGlzKGxheW91dEJveGVzLCAneCcpO1xuICAgIGNvbnN0IGNlbnRlclZlcnRpY2FsID0gZmlsdGVyRHluYW1pY1Bvc2l0aW9uQnlBeGlzKGxheW91dEJveGVzLCAneScpO1xuICAgIHJldHVybiB7XG4gICAgICAgIGZ1bGxTaXplLFxuICAgICAgICBsZWZ0QW5kVG9wOiBsZWZ0LmNvbmNhdCh0b3ApLFxuICAgICAgICByaWdodEFuZEJvdHRvbTogcmlnaHQuY29uY2F0KGNlbnRlclZlcnRpY2FsKS5jb25jYXQoYm90dG9tKS5jb25jYXQoY2VudGVySG9yaXpvbnRhbCksXG4gICAgICAgIGNoYXJ0QXJlYTogZmlsdGVyQnlQb3NpdGlvbihsYXlvdXRCb3hlcywgJ2NoYXJ0QXJlYScpLFxuICAgICAgICB2ZXJ0aWNhbDogbGVmdC5jb25jYXQocmlnaHQpLmNvbmNhdChjZW50ZXJWZXJ0aWNhbCksXG4gICAgICAgIGhvcml6b250YWw6IHRvcC5jb25jYXQoYm90dG9tKS5jb25jYXQoY2VudGVySG9yaXpvbnRhbClcbiAgICB9O1xufVxuZnVuY3Rpb24gZ2V0Q29tYmluZWRNYXgobWF4UGFkZGluZywgY2hhcnRBcmVhLCBhLCBiKSB7XG4gICAgcmV0dXJuIE1hdGgubWF4KG1heFBhZGRpbmdbYV0sIGNoYXJ0QXJlYVthXSkgKyBNYXRoLm1heChtYXhQYWRkaW5nW2JdLCBjaGFydEFyZWFbYl0pO1xufVxuZnVuY3Rpb24gdXBkYXRlTWF4UGFkZGluZyhtYXhQYWRkaW5nLCBib3hQYWRkaW5nKSB7XG4gICAgbWF4UGFkZGluZy50b3AgPSBNYXRoLm1heChtYXhQYWRkaW5nLnRvcCwgYm94UGFkZGluZy50b3ApO1xuICAgIG1heFBhZGRpbmcubGVmdCA9IE1hdGgubWF4KG1heFBhZGRpbmcubGVmdCwgYm94UGFkZGluZy5sZWZ0KTtcbiAgICBtYXhQYWRkaW5nLmJvdHRvbSA9IE1hdGgubWF4KG1heFBhZGRpbmcuYm90dG9tLCBib3hQYWRkaW5nLmJvdHRvbSk7XG4gICAgbWF4UGFkZGluZy5yaWdodCA9IE1hdGgubWF4KG1heFBhZGRpbmcucmlnaHQsIGJveFBhZGRpbmcucmlnaHQpO1xufVxuZnVuY3Rpb24gdXBkYXRlRGltcyhjaGFydEFyZWEsIHBhcmFtcywgbGF5b3V0LCBzdGFja3MpIHtcbiAgICBjb25zdCB7IHBvcyAsIGJveCAgfSA9IGxheW91dDtcbiAgICBjb25zdCBtYXhQYWRkaW5nID0gY2hhcnRBcmVhLm1heFBhZGRpbmc7XG4gICAgaWYgKCFpc09iamVjdChwb3MpKSB7XG4gICAgICAgIGlmIChsYXlvdXQuc2l6ZSkge1xuICAgICAgICAgICAgY2hhcnRBcmVhW3Bvc10gLT0gbGF5b3V0LnNpemU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RhY2sgPSBzdGFja3NbbGF5b3V0LnN0YWNrXSB8fCB7XG4gICAgICAgICAgICBzaXplOiAwLFxuICAgICAgICAgICAgY291bnQ6IDFcbiAgICAgICAgfTtcbiAgICAgICAgc3RhY2suc2l6ZSA9IE1hdGgubWF4KHN0YWNrLnNpemUsIGxheW91dC5ob3Jpem9udGFsID8gYm94LmhlaWdodCA6IGJveC53aWR0aCk7XG4gICAgICAgIGxheW91dC5zaXplID0gc3RhY2suc2l6ZSAvIHN0YWNrLmNvdW50O1xuICAgICAgICBjaGFydEFyZWFbcG9zXSArPSBsYXlvdXQuc2l6ZTtcbiAgICB9XG4gICAgaWYgKGJveC5nZXRQYWRkaW5nKSB7XG4gICAgICAgIHVwZGF0ZU1heFBhZGRpbmcobWF4UGFkZGluZywgYm94LmdldFBhZGRpbmcoKSk7XG4gICAgfVxuICAgIGNvbnN0IG5ld1dpZHRoID0gTWF0aC5tYXgoMCwgcGFyYW1zLm91dGVyV2lkdGggLSBnZXRDb21iaW5lZE1heChtYXhQYWRkaW5nLCBjaGFydEFyZWEsICdsZWZ0JywgJ3JpZ2h0JykpO1xuICAgIGNvbnN0IG5ld0hlaWdodCA9IE1hdGgubWF4KDAsIHBhcmFtcy5vdXRlckhlaWdodCAtIGdldENvbWJpbmVkTWF4KG1heFBhZGRpbmcsIGNoYXJ0QXJlYSwgJ3RvcCcsICdib3R0b20nKSk7XG4gICAgY29uc3Qgd2lkdGhDaGFuZ2VkID0gbmV3V2lkdGggIT09IGNoYXJ0QXJlYS53O1xuICAgIGNvbnN0IGhlaWdodENoYW5nZWQgPSBuZXdIZWlnaHQgIT09IGNoYXJ0QXJlYS5oO1xuICAgIGNoYXJ0QXJlYS53ID0gbmV3V2lkdGg7XG4gICAgY2hhcnRBcmVhLmggPSBuZXdIZWlnaHQ7XG4gICAgcmV0dXJuIGxheW91dC5ob3Jpem9udGFsID8ge1xuICAgICAgICBzYW1lOiB3aWR0aENoYW5nZWQsXG4gICAgICAgIG90aGVyOiBoZWlnaHRDaGFuZ2VkXG4gICAgfSA6IHtcbiAgICAgICAgc2FtZTogaGVpZ2h0Q2hhbmdlZCxcbiAgICAgICAgb3RoZXI6IHdpZHRoQ2hhbmdlZFxuICAgIH07XG59XG5mdW5jdGlvbiBoYW5kbGVNYXhQYWRkaW5nKGNoYXJ0QXJlYSkge1xuICAgIGNvbnN0IG1heFBhZGRpbmcgPSBjaGFydEFyZWEubWF4UGFkZGluZztcbiAgICBmdW5jdGlvbiB1cGRhdGVQb3MocG9zKSB7XG4gICAgICAgIGNvbnN0IGNoYW5nZSA9IE1hdGgubWF4KG1heFBhZGRpbmdbcG9zXSAtIGNoYXJ0QXJlYVtwb3NdLCAwKTtcbiAgICAgICAgY2hhcnRBcmVhW3Bvc10gKz0gY2hhbmdlO1xuICAgICAgICByZXR1cm4gY2hhbmdlO1xuICAgIH1cbiAgICBjaGFydEFyZWEueSArPSB1cGRhdGVQb3MoJ3RvcCcpO1xuICAgIGNoYXJ0QXJlYS54ICs9IHVwZGF0ZVBvcygnbGVmdCcpO1xuICAgIHVwZGF0ZVBvcygncmlnaHQnKTtcbiAgICB1cGRhdGVQb3MoJ2JvdHRvbScpO1xufVxuZnVuY3Rpb24gZ2V0TWFyZ2lucyhob3Jpem9udGFsLCBjaGFydEFyZWEpIHtcbiAgICBjb25zdCBtYXhQYWRkaW5nID0gY2hhcnRBcmVhLm1heFBhZGRpbmc7XG4gICAgZnVuY3Rpb24gbWFyZ2luRm9yUG9zaXRpb25zKHBvc2l0aW9ucykge1xuICAgICAgICBjb25zdCBtYXJnaW4gPSB7XG4gICAgICAgICAgICBsZWZ0OiAwLFxuICAgICAgICAgICAgdG9wOiAwLFxuICAgICAgICAgICAgcmlnaHQ6IDAsXG4gICAgICAgICAgICBib3R0b206IDBcbiAgICAgICAgfTtcbiAgICAgICAgcG9zaXRpb25zLmZvckVhY2goKHBvcyk9PntcbiAgICAgICAgICAgIG1hcmdpbltwb3NdID0gTWF0aC5tYXgoY2hhcnRBcmVhW3Bvc10sIG1heFBhZGRpbmdbcG9zXSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbWFyZ2luO1xuICAgIH1cbiAgICByZXR1cm4gaG9yaXpvbnRhbCA/IG1hcmdpbkZvclBvc2l0aW9ucyhbXG4gICAgICAgICdsZWZ0JyxcbiAgICAgICAgJ3JpZ2h0J1xuICAgIF0pIDogbWFyZ2luRm9yUG9zaXRpb25zKFtcbiAgICAgICAgJ3RvcCcsXG4gICAgICAgICdib3R0b20nXG4gICAgXSk7XG59XG5mdW5jdGlvbiBmaXRCb3hlcyhib3hlcywgY2hhcnRBcmVhLCBwYXJhbXMsIHN0YWNrcykge1xuICAgIGNvbnN0IHJlZml0Qm94ZXMgPSBbXTtcbiAgICBsZXQgaSwgaWxlbiwgbGF5b3V0LCBib3gsIHJlZml0LCBjaGFuZ2VkO1xuICAgIGZvcihpID0gMCwgaWxlbiA9IGJveGVzLmxlbmd0aCwgcmVmaXQgPSAwOyBpIDwgaWxlbjsgKytpKXtcbiAgICAgICAgbGF5b3V0ID0gYm94ZXNbaV07XG4gICAgICAgIGJveCA9IGxheW91dC5ib3g7XG4gICAgICAgIGJveC51cGRhdGUobGF5b3V0LndpZHRoIHx8IGNoYXJ0QXJlYS53LCBsYXlvdXQuaGVpZ2h0IHx8IGNoYXJ0QXJlYS5oLCBnZXRNYXJnaW5zKGxheW91dC5ob3Jpem9udGFsLCBjaGFydEFyZWEpKTtcbiAgICAgICAgY29uc3QgeyBzYW1lICwgb3RoZXIgIH0gPSB1cGRhdGVEaW1zKGNoYXJ0QXJlYSwgcGFyYW1zLCBsYXlvdXQsIHN0YWNrcyk7XG4gICAgICAgIHJlZml0IHw9IHNhbWUgJiYgcmVmaXRCb3hlcy5sZW5ndGg7XG4gICAgICAgIGNoYW5nZWQgPSBjaGFuZ2VkIHx8IG90aGVyO1xuICAgICAgICBpZiAoIWJveC5mdWxsU2l6ZSkge1xuICAgICAgICAgICAgcmVmaXRCb3hlcy5wdXNoKGxheW91dCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlZml0ICYmIGZpdEJveGVzKHJlZml0Qm94ZXMsIGNoYXJ0QXJlYSwgcGFyYW1zLCBzdGFja3MpIHx8IGNoYW5nZWQ7XG59XG5mdW5jdGlvbiBzZXRCb3hEaW1zKGJveCwgbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0KSB7XG4gICAgYm94LnRvcCA9IHRvcDtcbiAgICBib3gubGVmdCA9IGxlZnQ7XG4gICAgYm94LnJpZ2h0ID0gbGVmdCArIHdpZHRoO1xuICAgIGJveC5ib3R0b20gPSB0b3AgKyBoZWlnaHQ7XG4gICAgYm94LndpZHRoID0gd2lkdGg7XG4gICAgYm94LmhlaWdodCA9IGhlaWdodDtcbn1cbmZ1bmN0aW9uIHBsYWNlQm94ZXMoYm94ZXMsIGNoYXJ0QXJlYSwgcGFyYW1zLCBzdGFja3MpIHtcbiAgICBjb25zdCB1c2VyUGFkZGluZyA9IHBhcmFtcy5wYWRkaW5nO1xuICAgIGxldCB7IHggLCB5ICB9ID0gY2hhcnRBcmVhO1xuICAgIGZvciAoY29uc3QgbGF5b3V0IG9mIGJveGVzKXtcbiAgICAgICAgY29uc3QgYm94ID0gbGF5b3V0LmJveDtcbiAgICAgICAgY29uc3Qgc3RhY2sgPSBzdGFja3NbbGF5b3V0LnN0YWNrXSB8fCB7XG4gICAgICAgICAgICBjb3VudDogMSxcbiAgICAgICAgICAgIHBsYWNlZDogMCxcbiAgICAgICAgICAgIHdlaWdodDogMVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCB3ZWlnaHQgPSBsYXlvdXQuc3RhY2tXZWlnaHQgLyBzdGFjay53ZWlnaHQgfHwgMTtcbiAgICAgICAgaWYgKGxheW91dC5ob3Jpem9udGFsKSB7XG4gICAgICAgICAgICBjb25zdCB3aWR0aCA9IGNoYXJ0QXJlYS53ICogd2VpZ2h0O1xuICAgICAgICAgICAgY29uc3QgaGVpZ2h0ID0gc3RhY2suc2l6ZSB8fCBib3guaGVpZ2h0O1xuICAgICAgICAgICAgaWYgKGRlZmluZWQoc3RhY2suc3RhcnQpKSB7XG4gICAgICAgICAgICAgICAgeSA9IHN0YWNrLnN0YXJ0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGJveC5mdWxsU2l6ZSkge1xuICAgICAgICAgICAgICAgIHNldEJveERpbXMoYm94LCB1c2VyUGFkZGluZy5sZWZ0LCB5LCBwYXJhbXMub3V0ZXJXaWR0aCAtIHVzZXJQYWRkaW5nLnJpZ2h0IC0gdXNlclBhZGRpbmcubGVmdCwgaGVpZ2h0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc2V0Qm94RGltcyhib3gsIGNoYXJ0QXJlYS5sZWZ0ICsgc3RhY2sucGxhY2VkLCB5LCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0YWNrLnN0YXJ0ID0geTtcbiAgICAgICAgICAgIHN0YWNrLnBsYWNlZCArPSB3aWR0aDtcbiAgICAgICAgICAgIHkgPSBib3guYm90dG9tO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgaGVpZ2h0ID0gY2hhcnRBcmVhLmggKiB3ZWlnaHQ7XG4gICAgICAgICAgICBjb25zdCB3aWR0aCA9IHN0YWNrLnNpemUgfHwgYm94LndpZHRoO1xuICAgICAgICAgICAgaWYgKGRlZmluZWQoc3RhY2suc3RhcnQpKSB7XG4gICAgICAgICAgICAgICAgeCA9IHN0YWNrLnN0YXJ0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGJveC5mdWxsU2l6ZSkge1xuICAgICAgICAgICAgICAgIHNldEJveERpbXMoYm94LCB4LCB1c2VyUGFkZGluZy50b3AsIHdpZHRoLCBwYXJhbXMub3V0ZXJIZWlnaHQgLSB1c2VyUGFkZGluZy5ib3R0b20gLSB1c2VyUGFkZGluZy50b3ApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzZXRCb3hEaW1zKGJveCwgeCwgY2hhcnRBcmVhLnRvcCArIHN0YWNrLnBsYWNlZCwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdGFjay5zdGFydCA9IHg7XG4gICAgICAgICAgICBzdGFjay5wbGFjZWQgKz0gaGVpZ2h0O1xuICAgICAgICAgICAgeCA9IGJveC5yaWdodDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjaGFydEFyZWEueCA9IHg7XG4gICAgY2hhcnRBcmVhLnkgPSB5O1xufVxudmFyIGxheW91dHMgPSB7XG4gYWRkQm94IChjaGFydCwgaXRlbSkge1xuICAgICAgICBpZiAoIWNoYXJ0LmJveGVzKSB7XG4gICAgICAgICAgICBjaGFydC5ib3hlcyA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGl0ZW0uZnVsbFNpemUgPSBpdGVtLmZ1bGxTaXplIHx8IGZhbHNlO1xuICAgICAgICBpdGVtLnBvc2l0aW9uID0gaXRlbS5wb3NpdGlvbiB8fCAndG9wJztcbiAgICAgICAgaXRlbS53ZWlnaHQgPSBpdGVtLndlaWdodCB8fCAwO1xuICAgICAgICBpdGVtLl9sYXllcnMgPSBpdGVtLl9sYXllcnMgfHwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgejogMCxcbiAgICAgICAgICAgICAgICAgICAgZHJhdyAoY2hhcnRBcmVhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmRyYXcoY2hhcnRBcmVhKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF07XG4gICAgICAgIH07XG4gICAgICAgIGNoYXJ0LmJveGVzLnB1c2goaXRlbSk7XG4gICAgfSxcbiByZW1vdmVCb3ggKGNoYXJ0LCBsYXlvdXRJdGVtKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gY2hhcnQuYm94ZXMgPyBjaGFydC5ib3hlcy5pbmRleE9mKGxheW91dEl0ZW0pIDogLTE7XG4gICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgIGNoYXJ0LmJveGVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICB9LFxuIGNvbmZpZ3VyZSAoY2hhcnQsIGl0ZW0sIG9wdGlvbnMpIHtcbiAgICAgICAgaXRlbS5mdWxsU2l6ZSA9IG9wdGlvbnMuZnVsbFNpemU7XG4gICAgICAgIGl0ZW0ucG9zaXRpb24gPSBvcHRpb25zLnBvc2l0aW9uO1xuICAgICAgICBpdGVtLndlaWdodCA9IG9wdGlvbnMud2VpZ2h0O1xuICAgIH0sXG4gdXBkYXRlIChjaGFydCwgd2lkdGgsIGhlaWdodCwgbWluUGFkZGluZykge1xuICAgICAgICBpZiAoIWNoYXJ0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFkZGluZyA9IHRvUGFkZGluZyhjaGFydC5vcHRpb25zLmxheW91dC5wYWRkaW5nKTtcbiAgICAgICAgY29uc3QgYXZhaWxhYmxlV2lkdGggPSBNYXRoLm1heCh3aWR0aCAtIHBhZGRpbmcud2lkdGgsIDApO1xuICAgICAgICBjb25zdCBhdmFpbGFibGVIZWlnaHQgPSBNYXRoLm1heChoZWlnaHQgLSBwYWRkaW5nLmhlaWdodCwgMCk7XG4gICAgICAgIGNvbnN0IGJveGVzID0gYnVpbGRMYXlvdXRCb3hlcyhjaGFydC5ib3hlcyk7XG4gICAgICAgIGNvbnN0IHZlcnRpY2FsQm94ZXMgPSBib3hlcy52ZXJ0aWNhbDtcbiAgICAgICAgY29uc3QgaG9yaXpvbnRhbEJveGVzID0gYm94ZXMuaG9yaXpvbnRhbDtcbiAgICAgICAgZWFjaChjaGFydC5ib3hlcywgKGJveCk9PntcbiAgICAgICAgICAgIGlmICh0eXBlb2YgYm94LmJlZm9yZUxheW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIGJveC5iZWZvcmVMYXlvdXQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHZpc2libGVWZXJ0aWNhbEJveENvdW50ID0gdmVydGljYWxCb3hlcy5yZWR1Y2UoKHRvdGFsLCB3cmFwKT0+d3JhcC5ib3gub3B0aW9ucyAmJiB3cmFwLmJveC5vcHRpb25zLmRpc3BsYXkgPT09IGZhbHNlID8gdG90YWwgOiB0b3RhbCArIDEsIDApIHx8IDE7XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgb3V0ZXJXaWR0aDogd2lkdGgsXG4gICAgICAgICAgICBvdXRlckhlaWdodDogaGVpZ2h0LFxuICAgICAgICAgICAgcGFkZGluZyxcbiAgICAgICAgICAgIGF2YWlsYWJsZVdpZHRoLFxuICAgICAgICAgICAgYXZhaWxhYmxlSGVpZ2h0LFxuICAgICAgICAgICAgdkJveE1heFdpZHRoOiBhdmFpbGFibGVXaWR0aCAvIDIgLyB2aXNpYmxlVmVydGljYWxCb3hDb3VudCxcbiAgICAgICAgICAgIGhCb3hNYXhIZWlnaHQ6IGF2YWlsYWJsZUhlaWdodCAvIDJcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IG1heFBhZGRpbmcgPSBPYmplY3QuYXNzaWduKHt9LCBwYWRkaW5nKTtcbiAgICAgICAgdXBkYXRlTWF4UGFkZGluZyhtYXhQYWRkaW5nLCB0b1BhZGRpbmcobWluUGFkZGluZykpO1xuICAgICAgICBjb25zdCBjaGFydEFyZWEgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgIG1heFBhZGRpbmcsXG4gICAgICAgICAgICB3OiBhdmFpbGFibGVXaWR0aCxcbiAgICAgICAgICAgIGg6IGF2YWlsYWJsZUhlaWdodCxcbiAgICAgICAgICAgIHg6IHBhZGRpbmcubGVmdCxcbiAgICAgICAgICAgIHk6IHBhZGRpbmcudG9wXG4gICAgICAgIH0sIHBhZGRpbmcpO1xuICAgICAgICBjb25zdCBzdGFja3MgPSBzZXRMYXlvdXREaW1zKHZlcnRpY2FsQm94ZXMuY29uY2F0KGhvcml6b250YWxCb3hlcyksIHBhcmFtcyk7XG4gICAgICAgIGZpdEJveGVzKGJveGVzLmZ1bGxTaXplLCBjaGFydEFyZWEsIHBhcmFtcywgc3RhY2tzKTtcbiAgICAgICAgZml0Qm94ZXModmVydGljYWxCb3hlcywgY2hhcnRBcmVhLCBwYXJhbXMsIHN0YWNrcyk7XG4gICAgICAgIGlmIChmaXRCb3hlcyhob3Jpem9udGFsQm94ZXMsIGNoYXJ0QXJlYSwgcGFyYW1zLCBzdGFja3MpKSB7XG4gICAgICAgICAgICBmaXRCb3hlcyh2ZXJ0aWNhbEJveGVzLCBjaGFydEFyZWEsIHBhcmFtcywgc3RhY2tzKTtcbiAgICAgICAgfVxuICAgICAgICBoYW5kbGVNYXhQYWRkaW5nKGNoYXJ0QXJlYSk7XG4gICAgICAgIHBsYWNlQm94ZXMoYm94ZXMubGVmdEFuZFRvcCwgY2hhcnRBcmVhLCBwYXJhbXMsIHN0YWNrcyk7XG4gICAgICAgIGNoYXJ0QXJlYS54ICs9IGNoYXJ0QXJlYS53O1xuICAgICAgICBjaGFydEFyZWEueSArPSBjaGFydEFyZWEuaDtcbiAgICAgICAgcGxhY2VCb3hlcyhib3hlcy5yaWdodEFuZEJvdHRvbSwgY2hhcnRBcmVhLCBwYXJhbXMsIHN0YWNrcyk7XG4gICAgICAgIGNoYXJ0LmNoYXJ0QXJlYSA9IHtcbiAgICAgICAgICAgIGxlZnQ6IGNoYXJ0QXJlYS5sZWZ0LFxuICAgICAgICAgICAgdG9wOiBjaGFydEFyZWEudG9wLFxuICAgICAgICAgICAgcmlnaHQ6IGNoYXJ0QXJlYS5sZWZ0ICsgY2hhcnRBcmVhLncsXG4gICAgICAgICAgICBib3R0b206IGNoYXJ0QXJlYS50b3AgKyBjaGFydEFyZWEuaCxcbiAgICAgICAgICAgIGhlaWdodDogY2hhcnRBcmVhLmgsXG4gICAgICAgICAgICB3aWR0aDogY2hhcnRBcmVhLndcbiAgICAgICAgfTtcbiAgICAgICAgZWFjaChib3hlcy5jaGFydEFyZWEsIChsYXlvdXQpPT57XG4gICAgICAgICAgICBjb25zdCBib3ggPSBsYXlvdXQuYm94O1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihib3gsIGNoYXJ0LmNoYXJ0QXJlYSk7XG4gICAgICAgICAgICBib3gudXBkYXRlKGNoYXJ0QXJlYS53LCBjaGFydEFyZWEuaCwge1xuICAgICAgICAgICAgICAgIGxlZnQ6IDAsXG4gICAgICAgICAgICAgICAgdG9wOiAwLFxuICAgICAgICAgICAgICAgIHJpZ2h0OiAwLFxuICAgICAgICAgICAgICAgIGJvdHRvbTogMFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn07XG5cbmNsYXNzIEJhc2VQbGF0Zm9ybSB7XG4gYWNxdWlyZUNvbnRleHQoY2FudmFzLCBhc3BlY3RSYXRpbykge31cbiByZWxlYXNlQ29udGV4dChjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gYWRkRXZlbnRMaXN0ZW5lcihjaGFydCwgdHlwZSwgbGlzdGVuZXIpIHt9XG4gcmVtb3ZlRXZlbnRMaXN0ZW5lcihjaGFydCwgdHlwZSwgbGlzdGVuZXIpIHt9XG4gZ2V0RGV2aWNlUGl4ZWxSYXRpbygpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgfVxuIGdldE1heGltdW1TaXplKGVsZW1lbnQsIHdpZHRoLCBoZWlnaHQsIGFzcGVjdFJhdGlvKSB7XG4gICAgICAgIHdpZHRoID0gTWF0aC5tYXgoMCwgd2lkdGggfHwgZWxlbWVudC53aWR0aCk7XG4gICAgICAgIGhlaWdodCA9IGhlaWdodCB8fCBlbGVtZW50LmhlaWdodDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHdpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiBNYXRoLm1heCgwLCBhc3BlY3RSYXRpbyA/IE1hdGguZmxvb3Iod2lkdGggLyBhc3BlY3RSYXRpbykgOiBoZWlnaHQpXG4gICAgICAgIH07XG4gICAgfVxuIGlzQXR0YWNoZWQoY2FudmFzKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiB1cGRhdGVDb25maWcoY29uZmlnKSB7XG4gICAgfVxufVxuXG5jbGFzcyBCYXNpY1BsYXRmb3JtIGV4dGVuZHMgQmFzZVBsYXRmb3JtIHtcbiAgICBhY3F1aXJlQ29udGV4dChpdGVtKSB7XG4gICAgICAgIHJldHVybiBpdGVtICYmIGl0ZW0uZ2V0Q29udGV4dCAmJiBpdGVtLmdldENvbnRleHQoJzJkJykgfHwgbnVsbDtcbiAgICB9XG4gICAgdXBkYXRlQ29uZmlnKGNvbmZpZykge1xuICAgICAgICBjb25maWcub3B0aW9ucy5hbmltYXRpb24gPSBmYWxzZTtcbiAgICB9XG59XG5cbmNvbnN0IEVYUEFORE9fS0VZID0gJyRjaGFydGpzJztcbiBjb25zdCBFVkVOVF9UWVBFUyA9IHtcbiAgICB0b3VjaHN0YXJ0OiAnbW91c2Vkb3duJyxcbiAgICB0b3VjaG1vdmU6ICdtb3VzZW1vdmUnLFxuICAgIHRvdWNoZW5kOiAnbW91c2V1cCcsXG4gICAgcG9pbnRlcmVudGVyOiAnbW91c2VlbnRlcicsXG4gICAgcG9pbnRlcmRvd246ICdtb3VzZWRvd24nLFxuICAgIHBvaW50ZXJtb3ZlOiAnbW91c2Vtb3ZlJyxcbiAgICBwb2ludGVydXA6ICdtb3VzZXVwJyxcbiAgICBwb2ludGVybGVhdmU6ICdtb3VzZW91dCcsXG4gICAgcG9pbnRlcm91dDogJ21vdXNlb3V0J1xufTtcbmNvbnN0IGlzTnVsbE9yRW1wdHkgPSAodmFsdWUpPT52YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gJyc7XG4gZnVuY3Rpb24gaW5pdENhbnZhcyhjYW52YXMsIGFzcGVjdFJhdGlvKSB7XG4gICAgY29uc3Qgc3R5bGUgPSBjYW52YXMuc3R5bGU7XG4gICAgY29uc3QgcmVuZGVySGVpZ2h0ID0gY2FudmFzLmdldEF0dHJpYnV0ZSgnaGVpZ2h0Jyk7XG4gICAgY29uc3QgcmVuZGVyV2lkdGggPSBjYW52YXMuZ2V0QXR0cmlidXRlKCd3aWR0aCcpO1xuICAgIGNhbnZhc1tFWFBBTkRPX0tFWV0gPSB7XG4gICAgICAgIGluaXRpYWw6IHtcbiAgICAgICAgICAgIGhlaWdodDogcmVuZGVySGVpZ2h0LFxuICAgICAgICAgICAgd2lkdGg6IHJlbmRlcldpZHRoLFxuICAgICAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiBzdHlsZS5kaXNwbGF5LFxuICAgICAgICAgICAgICAgIGhlaWdodDogc3R5bGUuaGVpZ2h0LFxuICAgICAgICAgICAgICAgIHdpZHRoOiBzdHlsZS53aWR0aFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBzdHlsZS5kaXNwbGF5ID0gc3R5bGUuZGlzcGxheSB8fCAnYmxvY2snO1xuICAgIHN0eWxlLmJveFNpemluZyA9IHN0eWxlLmJveFNpemluZyB8fCAnYm9yZGVyLWJveCc7XG4gICAgaWYgKGlzTnVsbE9yRW1wdHkocmVuZGVyV2lkdGgpKSB7XG4gICAgICAgIGNvbnN0IGRpc3BsYXlXaWR0aCA9IHJlYWRVc2VkU2l6ZShjYW52YXMsICd3aWR0aCcpO1xuICAgICAgICBpZiAoZGlzcGxheVdpZHRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNhbnZhcy53aWR0aCA9IGRpc3BsYXlXaWR0aDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNOdWxsT3JFbXB0eShyZW5kZXJIZWlnaHQpKSB7XG4gICAgICAgIGlmIChjYW52YXMuc3R5bGUuaGVpZ2h0ID09PSAnJykge1xuICAgICAgICAgICAgY2FudmFzLmhlaWdodCA9IGNhbnZhcy53aWR0aCAvIChhc3BlY3RSYXRpbyB8fCAyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGRpc3BsYXlIZWlnaHQgPSByZWFkVXNlZFNpemUoY2FudmFzLCAnaGVpZ2h0Jyk7XG4gICAgICAgICAgICBpZiAoZGlzcGxheUhlaWdodCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgY2FudmFzLmhlaWdodCA9IGRpc3BsYXlIZWlnaHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNhbnZhcztcbn1cbmNvbnN0IGV2ZW50TGlzdGVuZXJPcHRpb25zID0gc3VwcG9ydHNFdmVudExpc3RlbmVyT3B0aW9ucyA/IHtcbiAgICBwYXNzaXZlOiB0cnVlXG59IDogZmFsc2U7XG5mdW5jdGlvbiBhZGRMaXN0ZW5lcihub2RlLCB0eXBlLCBsaXN0ZW5lcikge1xuICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lciwgZXZlbnRMaXN0ZW5lck9wdGlvbnMpO1xufVxuZnVuY3Rpb24gcmVtb3ZlTGlzdGVuZXIoY2hhcnQsIHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgY2hhcnQuY2FudmFzLnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIGV2ZW50TGlzdGVuZXJPcHRpb25zKTtcbn1cbmZ1bmN0aW9uIGZyb21OYXRpdmVFdmVudChldmVudCwgY2hhcnQpIHtcbiAgICBjb25zdCB0eXBlID0gRVZFTlRfVFlQRVNbZXZlbnQudHlwZV0gfHwgZXZlbnQudHlwZTtcbiAgICBjb25zdCB7IHggLCB5ICB9ID0gZ2V0UmVsYXRpdmVQb3NpdGlvbihldmVudCwgY2hhcnQpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGUsXG4gICAgICAgIGNoYXJ0LFxuICAgICAgICBuYXRpdmU6IGV2ZW50LFxuICAgICAgICB4OiB4ICE9PSB1bmRlZmluZWQgPyB4IDogbnVsbCxcbiAgICAgICAgeTogeSAhPT0gdW5kZWZpbmVkID8geSA6IG51bGxcbiAgICB9O1xufVxuZnVuY3Rpb24gbm9kZUxpc3RDb250YWlucyhub2RlTGlzdCwgY2FudmFzKSB7XG4gICAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVMaXN0KXtcbiAgICAgICAgaWYgKG5vZGUgPT09IGNhbnZhcyB8fCBub2RlLmNvbnRhaW5zKGNhbnZhcykpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gY3JlYXRlQXR0YWNoT2JzZXJ2ZXIoY2hhcnQsIHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgY29uc3QgY2FudmFzID0gY2hhcnQuY2FudmFzO1xuICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKGVudHJpZXMpPT57XG4gICAgICAgIGxldCB0cmlnZ2VyID0gZmFsc2U7XG4gICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcyl7XG4gICAgICAgICAgICB0cmlnZ2VyID0gdHJpZ2dlciB8fCBub2RlTGlzdENvbnRhaW5zKGVudHJ5LmFkZGVkTm9kZXMsIGNhbnZhcyk7XG4gICAgICAgICAgICB0cmlnZ2VyID0gdHJpZ2dlciAmJiAhbm9kZUxpc3RDb250YWlucyhlbnRyeS5yZW1vdmVkTm9kZXMsIGNhbnZhcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyaWdnZXIpIHtcbiAgICAgICAgICAgIGxpc3RlbmVyKCk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LCB7XG4gICAgICAgIGNoaWxkTGlzdDogdHJ1ZSxcbiAgICAgICAgc3VidHJlZTogdHJ1ZVxuICAgIH0pO1xuICAgIHJldHVybiBvYnNlcnZlcjtcbn1cbmZ1bmN0aW9uIGNyZWF0ZURldGFjaE9ic2VydmVyKGNoYXJ0LCB0eXBlLCBsaXN0ZW5lcikge1xuICAgIGNvbnN0IGNhbnZhcyA9IGNoYXJ0LmNhbnZhcztcbiAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKChlbnRyaWVzKT0+e1xuICAgICAgICBsZXQgdHJpZ2dlciA9IGZhbHNlO1xuICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpe1xuICAgICAgICAgICAgdHJpZ2dlciA9IHRyaWdnZXIgfHwgbm9kZUxpc3RDb250YWlucyhlbnRyeS5yZW1vdmVkTm9kZXMsIGNhbnZhcyk7XG4gICAgICAgICAgICB0cmlnZ2VyID0gdHJpZ2dlciAmJiAhbm9kZUxpc3RDb250YWlucyhlbnRyeS5hZGRlZE5vZGVzLCBjYW52YXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cmlnZ2VyKSB7XG4gICAgICAgICAgICBsaXN0ZW5lcigpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudCwge1xuICAgICAgICBjaGlsZExpc3Q6IHRydWUsXG4gICAgICAgIHN1YnRyZWU6IHRydWVcbiAgICB9KTtcbiAgICByZXR1cm4gb2JzZXJ2ZXI7XG59XG5jb25zdCBkcnBMaXN0ZW5pbmdDaGFydHMgPSBuZXcgTWFwKCk7XG5sZXQgb2xkRGV2aWNlUGl4ZWxSYXRpbyA9IDA7XG5mdW5jdGlvbiBvbldpbmRvd1Jlc2l6ZSgpIHtcbiAgICBjb25zdCBkcHIgPSB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbztcbiAgICBpZiAoZHByID09PSBvbGREZXZpY2VQaXhlbFJhdGlvKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgb2xkRGV2aWNlUGl4ZWxSYXRpbyA9IGRwcjtcbiAgICBkcnBMaXN0ZW5pbmdDaGFydHMuZm9yRWFjaCgocmVzaXplLCBjaGFydCk9PntcbiAgICAgICAgaWYgKGNoYXJ0LmN1cnJlbnREZXZpY2VQaXhlbFJhdGlvICE9PSBkcHIpIHtcbiAgICAgICAgICAgIHJlc2l6ZSgpO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5mdW5jdGlvbiBsaXN0ZW5EZXZpY2VQaXhlbFJhdGlvQ2hhbmdlcyhjaGFydCwgcmVzaXplKSB7XG4gICAgaWYgKCFkcnBMaXN0ZW5pbmdDaGFydHMuc2l6ZSkge1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgb25XaW5kb3dSZXNpemUpO1xuICAgIH1cbiAgICBkcnBMaXN0ZW5pbmdDaGFydHMuc2V0KGNoYXJ0LCByZXNpemUpO1xufVxuZnVuY3Rpb24gdW5saXN0ZW5EZXZpY2VQaXhlbFJhdGlvQ2hhbmdlcyhjaGFydCkge1xuICAgIGRycExpc3RlbmluZ0NoYXJ0cy5kZWxldGUoY2hhcnQpO1xuICAgIGlmICghZHJwTGlzdGVuaW5nQ2hhcnRzLnNpemUpIHtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIG9uV2luZG93UmVzaXplKTtcbiAgICB9XG59XG5mdW5jdGlvbiBjcmVhdGVSZXNpemVPYnNlcnZlcihjaGFydCwgdHlwZSwgbGlzdGVuZXIpIHtcbiAgICBjb25zdCBjYW52YXMgPSBjaGFydC5jYW52YXM7XG4gICAgY29uc3QgY29udGFpbmVyID0gY2FudmFzICYmIF9nZXRQYXJlbnROb2RlKGNhbnZhcyk7XG4gICAgaWYgKCFjb250YWluZXIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCByZXNpemUgPSB0aHJvdHRsZWQoKHdpZHRoLCBoZWlnaHQpPT57XG4gICAgICAgIGNvbnN0IHcgPSBjb250YWluZXIuY2xpZW50V2lkdGg7XG4gICAgICAgIGxpc3RlbmVyKHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICBpZiAodyA8IGNvbnRhaW5lci5jbGllbnRXaWR0aCkge1xuICAgICAgICAgICAgbGlzdGVuZXIoKTtcbiAgICAgICAgfVxuICAgIH0sIHdpbmRvdyk7XG4gICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKGVudHJpZXMpPT57XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gZW50cmllc1swXTtcbiAgICAgICAgY29uc3Qgd2lkdGggPSBlbnRyeS5jb250ZW50UmVjdC53aWR0aDtcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gZW50cnkuY29udGVudFJlY3QuaGVpZ2h0O1xuICAgICAgICBpZiAod2lkdGggPT09IDAgJiYgaGVpZ2h0ID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVzaXplKHdpZHRoLCBoZWlnaHQpO1xuICAgIH0pO1xuICAgIG9ic2VydmVyLm9ic2VydmUoY29udGFpbmVyKTtcbiAgICBsaXN0ZW5EZXZpY2VQaXhlbFJhdGlvQ2hhbmdlcyhjaGFydCwgcmVzaXplKTtcbiAgICByZXR1cm4gb2JzZXJ2ZXI7XG59XG5mdW5jdGlvbiByZWxlYXNlT2JzZXJ2ZXIoY2hhcnQsIHR5cGUsIG9ic2VydmVyKSB7XG4gICAgaWYgKG9ic2VydmVyKSB7XG4gICAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09ICdyZXNpemUnKSB7XG4gICAgICAgIHVubGlzdGVuRGV2aWNlUGl4ZWxSYXRpb0NoYW5nZXMoY2hhcnQpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNyZWF0ZVByb3h5QW5kTGlzdGVuKGNoYXJ0LCB0eXBlLCBsaXN0ZW5lcikge1xuICAgIGNvbnN0IGNhbnZhcyA9IGNoYXJ0LmNhbnZhcztcbiAgICBjb25zdCBwcm94eSA9IHRocm90dGxlZCgoZXZlbnQpPT57XG4gICAgICAgIGlmIChjaGFydC5jdHggIT09IG51bGwpIHtcbiAgICAgICAgICAgIGxpc3RlbmVyKGZyb21OYXRpdmVFdmVudChldmVudCwgY2hhcnQpKTtcbiAgICAgICAgfVxuICAgIH0sIGNoYXJ0KTtcbiAgICBhZGRMaXN0ZW5lcihjYW52YXMsIHR5cGUsIHByb3h5KTtcbiAgICByZXR1cm4gcHJveHk7XG59XG4gY2xhc3MgRG9tUGxhdGZvcm0gZXh0ZW5kcyBCYXNlUGxhdGZvcm0ge1xuIGFjcXVpcmVDb250ZXh0KGNhbnZhcywgYXNwZWN0UmF0aW8pIHtcbiAgICAgICAgY29uc3QgY29udGV4dCA9IGNhbnZhcyAmJiBjYW52YXMuZ2V0Q29udGV4dCAmJiBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAgICAgaWYgKGNvbnRleHQgJiYgY29udGV4dC5jYW52YXMgPT09IGNhbnZhcykge1xuICAgICAgICAgICAgaW5pdENhbnZhcyhjYW52YXMsIGFzcGVjdFJhdGlvKTtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiByZWxlYXNlQ29udGV4dChjb250ZXh0KSB7XG4gICAgICAgIGNvbnN0IGNhbnZhcyA9IGNvbnRleHQuY2FudmFzO1xuICAgICAgICBpZiAoIWNhbnZhc1tFWFBBTkRPX0tFWV0pIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbml0aWFsID0gY2FudmFzW0VYUEFORE9fS0VZXS5pbml0aWFsO1xuICAgICAgICBbXG4gICAgICAgICAgICAnaGVpZ2h0JyxcbiAgICAgICAgICAgICd3aWR0aCdcbiAgICAgICAgXS5mb3JFYWNoKChwcm9wKT0+e1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBpbml0aWFsW3Byb3BdO1xuICAgICAgICAgICAgaWYgKGlzTnVsbE9yVW5kZWYodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgY2FudmFzLnJlbW92ZUF0dHJpYnV0ZShwcm9wKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY2FudmFzLnNldEF0dHJpYnV0ZShwcm9wLCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBzdHlsZSA9IGluaXRpYWwuc3R5bGUgfHwge307XG4gICAgICAgIE9iamVjdC5rZXlzKHN0eWxlKS5mb3JFYWNoKChrZXkpPT57XG4gICAgICAgICAgICBjYW52YXMuc3R5bGVba2V5XSA9IHN0eWxlW2tleV07XG4gICAgICAgIH0pO1xuICAgICAgICBjYW52YXMud2lkdGggPSBjYW52YXMud2lkdGg7XG4gICAgICAgIGRlbGV0ZSBjYW52YXNbRVhQQU5ET19LRVldO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gYWRkRXZlbnRMaXN0ZW5lcihjaGFydCwgdHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKGNoYXJ0LCB0eXBlKTtcbiAgICAgICAgY29uc3QgcHJveGllcyA9IGNoYXJ0LiRwcm94aWVzIHx8IChjaGFydC4kcHJveGllcyA9IHt9KTtcbiAgICAgICAgY29uc3QgaGFuZGxlcnMgPSB7XG4gICAgICAgICAgICBhdHRhY2g6IGNyZWF0ZUF0dGFjaE9ic2VydmVyLFxuICAgICAgICAgICAgZGV0YWNoOiBjcmVhdGVEZXRhY2hPYnNlcnZlcixcbiAgICAgICAgICAgIHJlc2l6ZTogY3JlYXRlUmVzaXplT2JzZXJ2ZXJcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IGhhbmRsZXJzW3R5cGVdIHx8IGNyZWF0ZVByb3h5QW5kTGlzdGVuO1xuICAgICAgICBwcm94aWVzW3R5cGVdID0gaGFuZGxlcihjaGFydCwgdHlwZSwgbGlzdGVuZXIpO1xuICAgIH1cbiByZW1vdmVFdmVudExpc3RlbmVyKGNoYXJ0LCB0eXBlKSB7XG4gICAgICAgIGNvbnN0IHByb3hpZXMgPSBjaGFydC4kcHJveGllcyB8fCAoY2hhcnQuJHByb3hpZXMgPSB7fSk7XG4gICAgICAgIGNvbnN0IHByb3h5ID0gcHJveGllc1t0eXBlXTtcbiAgICAgICAgaWYgKCFwcm94eSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGhhbmRsZXJzID0ge1xuICAgICAgICAgICAgYXR0YWNoOiByZWxlYXNlT2JzZXJ2ZXIsXG4gICAgICAgICAgICBkZXRhY2g6IHJlbGVhc2VPYnNlcnZlcixcbiAgICAgICAgICAgIHJlc2l6ZTogcmVsZWFzZU9ic2VydmVyXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSBoYW5kbGVyc1t0eXBlXSB8fCByZW1vdmVMaXN0ZW5lcjtcbiAgICAgICAgaGFuZGxlcihjaGFydCwgdHlwZSwgcHJveHkpO1xuICAgICAgICBwcm94aWVzW3R5cGVdID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBnZXREZXZpY2VQaXhlbFJhdGlvKCkge1xuICAgICAgICByZXR1cm4gd2luZG93LmRldmljZVBpeGVsUmF0aW87XG4gICAgfVxuIGdldE1heGltdW1TaXplKGNhbnZhcywgd2lkdGgsIGhlaWdodCwgYXNwZWN0UmF0aW8pIHtcbiAgICAgICAgcmV0dXJuIGdldE1heGltdW1TaXplKGNhbnZhcywgd2lkdGgsIGhlaWdodCwgYXNwZWN0UmF0aW8pO1xuICAgIH1cbiBpc0F0dGFjaGVkKGNhbnZhcykge1xuICAgICAgICBjb25zdCBjb250YWluZXIgPSBfZ2V0UGFyZW50Tm9kZShjYW52YXMpO1xuICAgICAgICByZXR1cm4gISEoY29udGFpbmVyICYmIGNvbnRhaW5lci5pc0Nvbm5lY3RlZCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBfZGV0ZWN0UGxhdGZvcm0oY2FudmFzKSB7XG4gICAgaWYgKCFfaXNEb21TdXBwb3J0ZWQoKSB8fCB0eXBlb2YgT2Zmc2NyZWVuQ2FudmFzICE9PSAndW5kZWZpbmVkJyAmJiBjYW52YXMgaW5zdGFuY2VvZiBPZmZzY3JlZW5DYW52YXMpIHtcbiAgICAgICAgcmV0dXJuIEJhc2ljUGxhdGZvcm07XG4gICAgfVxuICAgIHJldHVybiBEb21QbGF0Zm9ybTtcbn1cblxuY2xhc3MgRWxlbWVudCB7XG4gICAgc3RhdGljIGRlZmF1bHRzID0ge307XG4gICAgc3RhdGljIGRlZmF1bHRSb3V0ZXMgPSB1bmRlZmluZWQ7XG4gICAgeDtcbiAgICB5O1xuICAgIGFjdGl2ZSA9IGZhbHNlO1xuICAgIG9wdGlvbnM7XG4gICAgJGFuaW1hdGlvbnM7XG4gICAgdG9vbHRpcFBvc2l0aW9uKHVzZUZpbmFsUG9zaXRpb24pIHtcbiAgICAgICAgY29uc3QgeyB4ICwgeSAgfSA9IHRoaXMuZ2V0UHJvcHMoW1xuICAgICAgICAgICAgJ3gnLFxuICAgICAgICAgICAgJ3knXG4gICAgICAgIF0sIHVzZUZpbmFsUG9zaXRpb24pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeCxcbiAgICAgICAgICAgIHlcbiAgICAgICAgfTtcbiAgICB9XG4gICAgaGFzVmFsdWUoKSB7XG4gICAgICAgIHJldHVybiBpc051bWJlcih0aGlzLngpICYmIGlzTnVtYmVyKHRoaXMueSk7XG4gICAgfVxuICAgIGdldFByb3BzKHByb3BzLCBmaW5hbCkge1xuICAgICAgICBjb25zdCBhbmltcyA9IHRoaXMuJGFuaW1hdGlvbnM7XG4gICAgICAgIGlmICghZmluYWwgfHwgIWFuaW1zKSB7XG4gICAgICAgICAgICAvLyBsZXQncyBub3QgY3JlYXRlIGFuIG9iamVjdCwgaWYgbm90IG5lZWRlZFxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmV0ID0ge307XG4gICAgICAgIHByb3BzLmZvckVhY2goKHByb3ApPT57XG4gICAgICAgICAgICByZXRbcHJvcF0gPSBhbmltc1twcm9wXSAmJiBhbmltc1twcm9wXS5hY3RpdmUoKSA/IGFuaW1zW3Byb3BdLl90byA6IHRoaXNbcHJvcF07XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmV0O1xuICAgIH1cbn1cblxuZnVuY3Rpb24gYXV0b1NraXAoc2NhbGUsIHRpY2tzKSB7XG4gICAgY29uc3QgdGlja09wdHMgPSBzY2FsZS5vcHRpb25zLnRpY2tzO1xuICAgIGNvbnN0IGRldGVybWluZWRNYXhUaWNrcyA9IGRldGVybWluZU1heFRpY2tzKHNjYWxlKTtcbiAgICBjb25zdCB0aWNrc0xpbWl0ID0gTWF0aC5taW4odGlja09wdHMubWF4VGlja3NMaW1pdCB8fCBkZXRlcm1pbmVkTWF4VGlja3MsIGRldGVybWluZWRNYXhUaWNrcyk7XG4gICAgY29uc3QgbWFqb3JJbmRpY2VzID0gdGlja09wdHMubWFqb3IuZW5hYmxlZCA/IGdldE1ham9ySW5kaWNlcyh0aWNrcykgOiBbXTtcbiAgICBjb25zdCBudW1NYWpvckluZGljZXMgPSBtYWpvckluZGljZXMubGVuZ3RoO1xuICAgIGNvbnN0IGZpcnN0ID0gbWFqb3JJbmRpY2VzWzBdO1xuICAgIGNvbnN0IGxhc3QgPSBtYWpvckluZGljZXNbbnVtTWFqb3JJbmRpY2VzIC0gMV07XG4gICAgY29uc3QgbmV3VGlja3MgPSBbXTtcbiAgICBpZiAobnVtTWFqb3JJbmRpY2VzID4gdGlja3NMaW1pdCkge1xuICAgICAgICBza2lwTWFqb3JzKHRpY2tzLCBuZXdUaWNrcywgbWFqb3JJbmRpY2VzLCBudW1NYWpvckluZGljZXMgLyB0aWNrc0xpbWl0KTtcbiAgICAgICAgcmV0dXJuIG5ld1RpY2tzO1xuICAgIH1cbiAgICBjb25zdCBzcGFjaW5nID0gY2FsY3VsYXRlU3BhY2luZyhtYWpvckluZGljZXMsIHRpY2tzLCB0aWNrc0xpbWl0KTtcbiAgICBpZiAobnVtTWFqb3JJbmRpY2VzID4gMCkge1xuICAgICAgICBsZXQgaSwgaWxlbjtcbiAgICAgICAgY29uc3QgYXZnTWFqb3JTcGFjaW5nID0gbnVtTWFqb3JJbmRpY2VzID4gMSA/IE1hdGgucm91bmQoKGxhc3QgLSBmaXJzdCkgLyAobnVtTWFqb3JJbmRpY2VzIC0gMSkpIDogbnVsbDtcbiAgICAgICAgc2tpcCh0aWNrcywgbmV3VGlja3MsIHNwYWNpbmcsIGlzTnVsbE9yVW5kZWYoYXZnTWFqb3JTcGFjaW5nKSA/IDAgOiBmaXJzdCAtIGF2Z01ham9yU3BhY2luZywgZmlyc3QpO1xuICAgICAgICBmb3IoaSA9IDAsIGlsZW4gPSBudW1NYWpvckluZGljZXMgLSAxOyBpIDwgaWxlbjsgaSsrKXtcbiAgICAgICAgICAgIHNraXAodGlja3MsIG5ld1RpY2tzLCBzcGFjaW5nLCBtYWpvckluZGljZXNbaV0sIG1ham9ySW5kaWNlc1tpICsgMV0pO1xuICAgICAgICB9XG4gICAgICAgIHNraXAodGlja3MsIG5ld1RpY2tzLCBzcGFjaW5nLCBsYXN0LCBpc051bGxPclVuZGVmKGF2Z01ham9yU3BhY2luZykgPyB0aWNrcy5sZW5ndGggOiBsYXN0ICsgYXZnTWFqb3JTcGFjaW5nKTtcbiAgICAgICAgcmV0dXJuIG5ld1RpY2tzO1xuICAgIH1cbiAgICBza2lwKHRpY2tzLCBuZXdUaWNrcywgc3BhY2luZyk7XG4gICAgcmV0dXJuIG5ld1RpY2tzO1xufVxuZnVuY3Rpb24gZGV0ZXJtaW5lTWF4VGlja3Moc2NhbGUpIHtcbiAgICBjb25zdCBvZmZzZXQgPSBzY2FsZS5vcHRpb25zLm9mZnNldDtcbiAgICBjb25zdCB0aWNrTGVuZ3RoID0gc2NhbGUuX3RpY2tTaXplKCk7XG4gICAgY29uc3QgbWF4U2NhbGUgPSBzY2FsZS5fbGVuZ3RoIC8gdGlja0xlbmd0aCArIChvZmZzZXQgPyAwIDogMSk7XG4gICAgY29uc3QgbWF4Q2hhcnQgPSBzY2FsZS5fbWF4TGVuZ3RoIC8gdGlja0xlbmd0aDtcbiAgICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLm1pbihtYXhTY2FsZSwgbWF4Q2hhcnQpKTtcbn1cbiBmdW5jdGlvbiBjYWxjdWxhdGVTcGFjaW5nKG1ham9ySW5kaWNlcywgdGlja3MsIHRpY2tzTGltaXQpIHtcbiAgICBjb25zdCBldmVuTWFqb3JTcGFjaW5nID0gZ2V0RXZlblNwYWNpbmcobWFqb3JJbmRpY2VzKTtcbiAgICBjb25zdCBzcGFjaW5nID0gdGlja3MubGVuZ3RoIC8gdGlja3NMaW1pdDtcbiAgICBpZiAoIWV2ZW5NYWpvclNwYWNpbmcpIHtcbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KHNwYWNpbmcsIDEpO1xuICAgIH1cbiAgICBjb25zdCBmYWN0b3JzID0gX2ZhY3Rvcml6ZShldmVuTWFqb3JTcGFjaW5nKTtcbiAgICBmb3IobGV0IGkgPSAwLCBpbGVuID0gZmFjdG9ycy5sZW5ndGggLSAxOyBpIDwgaWxlbjsgaSsrKXtcbiAgICAgICAgY29uc3QgZmFjdG9yID0gZmFjdG9yc1tpXTtcbiAgICAgICAgaWYgKGZhY3RvciA+IHNwYWNpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWN0b3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIE1hdGgubWF4KHNwYWNpbmcsIDEpO1xufVxuIGZ1bmN0aW9uIGdldE1ham9ySW5kaWNlcyh0aWNrcykge1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgIGxldCBpLCBpbGVuO1xuICAgIGZvcihpID0gMCwgaWxlbiA9IHRpY2tzLmxlbmd0aDsgaSA8IGlsZW47IGkrKyl7XG4gICAgICAgIGlmICh0aWNrc1tpXS5tYWpvcikge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goaSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbiBmdW5jdGlvbiBza2lwTWFqb3JzKHRpY2tzLCBuZXdUaWNrcywgbWFqb3JJbmRpY2VzLCBzcGFjaW5nKSB7XG4gICAgbGV0IGNvdW50ID0gMDtcbiAgICBsZXQgbmV4dCA9IG1ham9ySW5kaWNlc1swXTtcbiAgICBsZXQgaTtcbiAgICBzcGFjaW5nID0gTWF0aC5jZWlsKHNwYWNpbmcpO1xuICAgIGZvcihpID0gMDsgaSA8IHRpY2tzLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgaWYgKGkgPT09IG5leHQpIHtcbiAgICAgICAgICAgIG5ld1RpY2tzLnB1c2godGlja3NbaV0pO1xuICAgICAgICAgICAgY291bnQrKztcbiAgICAgICAgICAgIG5leHQgPSBtYWpvckluZGljZXNbY291bnQgKiBzcGFjaW5nXTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiBmdW5jdGlvbiBza2lwKHRpY2tzLCBuZXdUaWNrcywgc3BhY2luZywgbWFqb3JTdGFydCwgbWFqb3JFbmQpIHtcbiAgICBjb25zdCBzdGFydCA9IHZhbHVlT3JEZWZhdWx0KG1ham9yU3RhcnQsIDApO1xuICAgIGNvbnN0IGVuZCA9IE1hdGgubWluKHZhbHVlT3JEZWZhdWx0KG1ham9yRW5kLCB0aWNrcy5sZW5ndGgpLCB0aWNrcy5sZW5ndGgpO1xuICAgIGxldCBjb3VudCA9IDA7XG4gICAgbGV0IGxlbmd0aCwgaSwgbmV4dDtcbiAgICBzcGFjaW5nID0gTWF0aC5jZWlsKHNwYWNpbmcpO1xuICAgIGlmIChtYWpvckVuZCkge1xuICAgICAgICBsZW5ndGggPSBtYWpvckVuZCAtIG1ham9yU3RhcnQ7XG4gICAgICAgIHNwYWNpbmcgPSBsZW5ndGggLyBNYXRoLmZsb29yKGxlbmd0aCAvIHNwYWNpbmcpO1xuICAgIH1cbiAgICBuZXh0ID0gc3RhcnQ7XG4gICAgd2hpbGUobmV4dCA8IDApe1xuICAgICAgICBjb3VudCsrO1xuICAgICAgICBuZXh0ID0gTWF0aC5yb3VuZChzdGFydCArIGNvdW50ICogc3BhY2luZyk7XG4gICAgfVxuICAgIGZvcihpID0gTWF0aC5tYXgoc3RhcnQsIDApOyBpIDwgZW5kOyBpKyspe1xuICAgICAgICBpZiAoaSA9PT0gbmV4dCkge1xuICAgICAgICAgICAgbmV3VGlja3MucHVzaCh0aWNrc1tpXSk7XG4gICAgICAgICAgICBjb3VudCsrO1xuICAgICAgICAgICAgbmV4dCA9IE1hdGgucm91bmQoc3RhcnQgKyBjb3VudCAqIHNwYWNpbmcpO1xuICAgICAgICB9XG4gICAgfVxufVxuIGZ1bmN0aW9uIGdldEV2ZW5TcGFjaW5nKGFycikge1xuICAgIGNvbnN0IGxlbiA9IGFyci5sZW5ndGg7XG4gICAgbGV0IGksIGRpZmY7XG4gICAgaWYgKGxlbiA8IDIpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBmb3IoZGlmZiA9IGFyclswXSwgaSA9IDE7IGkgPCBsZW47ICsraSl7XG4gICAgICAgIGlmIChhcnJbaV0gLSBhcnJbaSAtIDFdICE9PSBkaWZmKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRpZmY7XG59XG5cbmNvbnN0IHJldmVyc2VBbGlnbiA9IChhbGlnbik9PmFsaWduID09PSAnbGVmdCcgPyAncmlnaHQnIDogYWxpZ24gPT09ICdyaWdodCcgPyAnbGVmdCcgOiBhbGlnbjtcbmNvbnN0IG9mZnNldEZyb21FZGdlID0gKHNjYWxlLCBlZGdlLCBvZmZzZXQpPT5lZGdlID09PSAndG9wJyB8fCBlZGdlID09PSAnbGVmdCcgPyBzY2FsZVtlZGdlXSArIG9mZnNldCA6IHNjYWxlW2VkZ2VdIC0gb2Zmc2V0O1xuY29uc3QgZ2V0VGlja3NMaW1pdCA9ICh0aWNrc0xlbmd0aCwgbWF4VGlja3NMaW1pdCk9Pk1hdGgubWluKG1heFRpY2tzTGltaXQgfHwgdGlja3NMZW5ndGgsIHRpY2tzTGVuZ3RoKTtcbiBmdW5jdGlvbiBzYW1wbGUoYXJyLCBudW1JdGVtcykge1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgIGNvbnN0IGluY3JlbWVudCA9IGFyci5sZW5ndGggLyBudW1JdGVtcztcbiAgICBjb25zdCBsZW4gPSBhcnIubGVuZ3RoO1xuICAgIGxldCBpID0gMDtcbiAgICBmb3IoOyBpIDwgbGVuOyBpICs9IGluY3JlbWVudCl7XG4gICAgICAgIHJlc3VsdC5wdXNoKGFycltNYXRoLmZsb29yKGkpXSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4gZnVuY3Rpb24gZ2V0UGl4ZWxGb3JHcmlkTGluZShzY2FsZSwgaW5kZXgsIG9mZnNldEdyaWRMaW5lcykge1xuICAgIGNvbnN0IGxlbmd0aCA9IHNjYWxlLnRpY2tzLmxlbmd0aDtcbiAgICBjb25zdCB2YWxpZEluZGV4ID0gTWF0aC5taW4oaW5kZXgsIGxlbmd0aCAtIDEpO1xuICAgIGNvbnN0IHN0YXJ0ID0gc2NhbGUuX3N0YXJ0UGl4ZWw7XG4gICAgY29uc3QgZW5kID0gc2NhbGUuX2VuZFBpeGVsO1xuICAgIGNvbnN0IGVwc2lsb24gPSAxZS02O1xuICAgIGxldCBsaW5lVmFsdWUgPSBzY2FsZS5nZXRQaXhlbEZvclRpY2sodmFsaWRJbmRleCk7XG4gICAgbGV0IG9mZnNldDtcbiAgICBpZiAob2Zmc2V0R3JpZExpbmVzKSB7XG4gICAgICAgIGlmIChsZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIG9mZnNldCA9IE1hdGgubWF4KGxpbmVWYWx1ZSAtIHN0YXJ0LCBlbmQgLSBsaW5lVmFsdWUpO1xuICAgICAgICB9IGVsc2UgaWYgKGluZGV4ID09PSAwKSB7XG4gICAgICAgICAgICBvZmZzZXQgPSAoc2NhbGUuZ2V0UGl4ZWxGb3JUaWNrKDEpIC0gbGluZVZhbHVlKSAvIDI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvZmZzZXQgPSAobGluZVZhbHVlIC0gc2NhbGUuZ2V0UGl4ZWxGb3JUaWNrKHZhbGlkSW5kZXggLSAxKSkgLyAyO1xuICAgICAgICB9XG4gICAgICAgIGxpbmVWYWx1ZSArPSB2YWxpZEluZGV4IDwgaW5kZXggPyBvZmZzZXQgOiAtb2Zmc2V0O1xuICAgICAgICBpZiAobGluZVZhbHVlIDwgc3RhcnQgLSBlcHNpbG9uIHx8IGxpbmVWYWx1ZSA+IGVuZCArIGVwc2lsb24pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbGluZVZhbHVlO1xufVxuIGZ1bmN0aW9uIGdhcmJhZ2VDb2xsZWN0KGNhY2hlcywgbGVuZ3RoKSB7XG4gICAgZWFjaChjYWNoZXMsIChjYWNoZSk9PntcbiAgICAgICAgY29uc3QgZ2MgPSBjYWNoZS5nYztcbiAgICAgICAgY29uc3QgZ2NMZW4gPSBnYy5sZW5ndGggLyAyO1xuICAgICAgICBsZXQgaTtcbiAgICAgICAgaWYgKGdjTGVuID4gbGVuZ3RoKSB7XG4gICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCBnY0xlbjsgKytpKXtcbiAgICAgICAgICAgICAgICBkZWxldGUgY2FjaGUuZGF0YVtnY1tpXV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBnYy5zcGxpY2UoMCwgZ2NMZW4pO1xuICAgICAgICB9XG4gICAgfSk7XG59XG4gZnVuY3Rpb24gZ2V0VGlja01hcmtMZW5ndGgob3B0aW9ucykge1xuICAgIHJldHVybiBvcHRpb25zLmRyYXdUaWNrcyA/IG9wdGlvbnMudGlja0xlbmd0aCA6IDA7XG59XG4gZnVuY3Rpb24gZ2V0VGl0bGVIZWlnaHQob3B0aW9ucywgZmFsbGJhY2spIHtcbiAgICBpZiAoIW9wdGlvbnMuZGlzcGxheSkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgY29uc3QgZm9udCA9IHRvRm9udChvcHRpb25zLmZvbnQsIGZhbGxiYWNrKTtcbiAgICBjb25zdCBwYWRkaW5nID0gdG9QYWRkaW5nKG9wdGlvbnMucGFkZGluZyk7XG4gICAgY29uc3QgbGluZXMgPSBpc0FycmF5KG9wdGlvbnMudGV4dCkgPyBvcHRpb25zLnRleHQubGVuZ3RoIDogMTtcbiAgICByZXR1cm4gbGluZXMgKiBmb250LmxpbmVIZWlnaHQgKyBwYWRkaW5nLmhlaWdodDtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVNjYWxlQ29udGV4dChwYXJlbnQsIHNjYWxlKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUNvbnRleHQocGFyZW50LCB7XG4gICAgICAgIHNjYWxlLFxuICAgICAgICB0eXBlOiAnc2NhbGUnXG4gICAgfSk7XG59XG5mdW5jdGlvbiBjcmVhdGVUaWNrQ29udGV4dChwYXJlbnQsIGluZGV4LCB0aWNrKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUNvbnRleHQocGFyZW50LCB7XG4gICAgICAgIHRpY2ssXG4gICAgICAgIGluZGV4LFxuICAgICAgICB0eXBlOiAndGljaydcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIHRpdGxlQWxpZ24oYWxpZ24sIHBvc2l0aW9uLCByZXZlcnNlKSB7XG4gICAgIGxldCByZXQgPSBfdG9MZWZ0UmlnaHRDZW50ZXIoYWxpZ24pO1xuICAgIGlmIChyZXZlcnNlICYmIHBvc2l0aW9uICE9PSAncmlnaHQnIHx8ICFyZXZlcnNlICYmIHBvc2l0aW9uID09PSAncmlnaHQnKSB7XG4gICAgICAgIHJldCA9IHJldmVyc2VBbGlnbihyZXQpO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xufVxuZnVuY3Rpb24gdGl0bGVBcmdzKHNjYWxlLCBvZmZzZXQsIHBvc2l0aW9uLCBhbGlnbikge1xuICAgIGNvbnN0IHsgdG9wICwgbGVmdCAsIGJvdHRvbSAsIHJpZ2h0ICwgY2hhcnQgIH0gPSBzY2FsZTtcbiAgICBjb25zdCB7IGNoYXJ0QXJlYSAsIHNjYWxlcyAgfSA9IGNoYXJ0O1xuICAgIGxldCByb3RhdGlvbiA9IDA7XG4gICAgbGV0IG1heFdpZHRoLCB0aXRsZVgsIHRpdGxlWTtcbiAgICBjb25zdCBoZWlnaHQgPSBib3R0b20gLSB0b3A7XG4gICAgY29uc3Qgd2lkdGggPSByaWdodCAtIGxlZnQ7XG4gICAgaWYgKHNjYWxlLmlzSG9yaXpvbnRhbCgpKSB7XG4gICAgICAgIHRpdGxlWCA9IF9hbGlnblN0YXJ0RW5kKGFsaWduLCBsZWZ0LCByaWdodCk7XG4gICAgICAgIGlmIChpc09iamVjdChwb3NpdGlvbikpIHtcbiAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uQXhpc0lEID0gT2JqZWN0LmtleXMocG9zaXRpb24pWzBdO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBwb3NpdGlvbltwb3NpdGlvbkF4aXNJRF07XG4gICAgICAgICAgICB0aXRsZVkgPSBzY2FsZXNbcG9zaXRpb25BeGlzSURdLmdldFBpeGVsRm9yVmFsdWUodmFsdWUpICsgaGVpZ2h0IC0gb2Zmc2V0O1xuICAgICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uID09PSAnY2VudGVyJykge1xuICAgICAgICAgICAgdGl0bGVZID0gKGNoYXJ0QXJlYS5ib3R0b20gKyBjaGFydEFyZWEudG9wKSAvIDIgKyBoZWlnaHQgLSBvZmZzZXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aXRsZVkgPSBvZmZzZXRGcm9tRWRnZShzY2FsZSwgcG9zaXRpb24sIG9mZnNldCk7XG4gICAgICAgIH1cbiAgICAgICAgbWF4V2lkdGggPSByaWdodCAtIGxlZnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGlzT2JqZWN0KHBvc2l0aW9uKSkge1xuICAgICAgICAgICAgY29uc3QgcG9zaXRpb25BeGlzSUQgPSBPYmplY3Qua2V5cyhwb3NpdGlvbilbMF07XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHBvc2l0aW9uW3Bvc2l0aW9uQXhpc0lEXTtcbiAgICAgICAgICAgIHRpdGxlWCA9IHNjYWxlc1twb3NpdGlvbkF4aXNJRF0uZ2V0UGl4ZWxGb3JWYWx1ZSh2YWx1ZSkgLSB3aWR0aCArIG9mZnNldDtcbiAgICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbiA9PT0gJ2NlbnRlcicpIHtcbiAgICAgICAgICAgIHRpdGxlWCA9IChjaGFydEFyZWEubGVmdCArIGNoYXJ0QXJlYS5yaWdodCkgLyAyIC0gd2lkdGggKyBvZmZzZXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aXRsZVggPSBvZmZzZXRGcm9tRWRnZShzY2FsZSwgcG9zaXRpb24sIG9mZnNldCk7XG4gICAgICAgIH1cbiAgICAgICAgdGl0bGVZID0gX2FsaWduU3RhcnRFbmQoYWxpZ24sIGJvdHRvbSwgdG9wKTtcbiAgICAgICAgcm90YXRpb24gPSBwb3NpdGlvbiA9PT0gJ2xlZnQnID8gLUhBTEZfUEkgOiBIQUxGX1BJO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICB0aXRsZVgsXG4gICAgICAgIHRpdGxlWSxcbiAgICAgICAgbWF4V2lkdGgsXG4gICAgICAgIHJvdGF0aW9uXG4gICAgfTtcbn1cbmNsYXNzIFNjYWxlIGV4dGVuZHMgRWxlbWVudCB7XG4gICAgY29uc3RydWN0b3IoY2ZnKXtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgIHRoaXMuaWQgPSBjZmcuaWQ7XG4gICAgICAgICB0aGlzLnR5cGUgPSBjZmcudHlwZTtcbiAgICAgICAgIHRoaXMub3B0aW9ucyA9IHVuZGVmaW5lZDtcbiAgICAgICAgIHRoaXMuY3R4ID0gY2ZnLmN0eDtcbiAgICAgICAgIHRoaXMuY2hhcnQgPSBjZmcuY2hhcnQ7XG4gICAgICAgICB0aGlzLnRvcCA9IHVuZGVmaW5lZDtcbiAgICAgICAgIHRoaXMuYm90dG9tID0gdW5kZWZpbmVkO1xuICAgICAgICAgdGhpcy5sZWZ0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgdGhpcy5yaWdodCA9IHVuZGVmaW5lZDtcbiAgICAgICAgIHRoaXMud2lkdGggPSB1bmRlZmluZWQ7XG4gICAgICAgICB0aGlzLmhlaWdodCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fbWFyZ2lucyA9IHtcbiAgICAgICAgICAgIGxlZnQ6IDAsXG4gICAgICAgICAgICByaWdodDogMCxcbiAgICAgICAgICAgIHRvcDogMCxcbiAgICAgICAgICAgIGJvdHRvbTogMFxuICAgICAgICB9O1xuICAgICAgICAgdGhpcy5tYXhXaWR0aCA9IHVuZGVmaW5lZDtcbiAgICAgICAgIHRoaXMubWF4SGVpZ2h0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgdGhpcy5wYWRkaW5nVG9wID0gdW5kZWZpbmVkO1xuICAgICAgICAgdGhpcy5wYWRkaW5nQm90dG9tID0gdW5kZWZpbmVkO1xuICAgICAgICAgdGhpcy5wYWRkaW5nTGVmdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgIHRoaXMucGFkZGluZ1JpZ2h0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgdGhpcy5heGlzID0gdW5kZWZpbmVkO1xuICAgICAgICAgdGhpcy5sYWJlbFJvdGF0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLm1pbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5tYXggPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX3JhbmdlID0gdW5kZWZpbmVkO1xuICAgICAgICAgdGhpcy50aWNrcyA9IFtdO1xuICAgICAgICAgdGhpcy5fZ3JpZExpbmVJdGVtcyA9IG51bGw7XG4gICAgICAgICB0aGlzLl9sYWJlbEl0ZW1zID0gbnVsbDtcbiAgICAgICAgIHRoaXMuX2xhYmVsU2l6ZXMgPSBudWxsO1xuICAgICAgICB0aGlzLl9sZW5ndGggPSAwO1xuICAgICAgICB0aGlzLl9tYXhMZW5ndGggPSAwO1xuICAgICAgICB0aGlzLl9sb25nZXN0VGV4dENhY2hlID0ge307XG4gICAgICAgICB0aGlzLl9zdGFydFBpeGVsID0gdW5kZWZpbmVkO1xuICAgICAgICAgdGhpcy5fZW5kUGl4ZWwgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX3JldmVyc2VQaXhlbHMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fdXNlck1heCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fdXNlck1pbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fc3VnZ2VzdGVkTWF4ID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9zdWdnZXN0ZWRNaW4gPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX3RpY2tzTGVuZ3RoID0gMDtcbiAgICAgICAgdGhpcy5fYm9yZGVyVmFsdWUgPSAwO1xuICAgICAgICB0aGlzLl9jYWNoZSA9IHt9O1xuICAgICAgICB0aGlzLl9kYXRhTGltaXRzQ2FjaGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuJGNvbnRleHQgPSB1bmRlZmluZWQ7XG4gICAgfVxuIGluaXQob3B0aW9ucykge1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zLnNldENvbnRleHQodGhpcy5nZXRDb250ZXh0KCkpO1xuICAgICAgICB0aGlzLmF4aXMgPSBvcHRpb25zLmF4aXM7XG4gICAgICAgIHRoaXMuX3VzZXJNaW4gPSB0aGlzLnBhcnNlKG9wdGlvbnMubWluKTtcbiAgICAgICAgdGhpcy5fdXNlck1heCA9IHRoaXMucGFyc2Uob3B0aW9ucy5tYXgpO1xuICAgICAgICB0aGlzLl9zdWdnZXN0ZWRNaW4gPSB0aGlzLnBhcnNlKG9wdGlvbnMuc3VnZ2VzdGVkTWluKTtcbiAgICAgICAgdGhpcy5fc3VnZ2VzdGVkTWF4ID0gdGhpcy5wYXJzZShvcHRpb25zLnN1Z2dlc3RlZE1heCk7XG4gICAgfVxuIHBhcnNlKHJhdywgaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIHJhdztcbiAgICB9XG4gZ2V0VXNlckJvdW5kcygpIHtcbiAgICAgICAgbGV0IHsgX3VzZXJNaW4gLCBfdXNlck1heCAsIF9zdWdnZXN0ZWRNaW4gLCBfc3VnZ2VzdGVkTWF4ICB9ID0gdGhpcztcbiAgICAgICAgX3VzZXJNaW4gPSBmaW5pdGVPckRlZmF1bHQoX3VzZXJNaW4sIE51bWJlci5QT1NJVElWRV9JTkZJTklUWSk7XG4gICAgICAgIF91c2VyTWF4ID0gZmluaXRlT3JEZWZhdWx0KF91c2VyTWF4LCBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkpO1xuICAgICAgICBfc3VnZ2VzdGVkTWluID0gZmluaXRlT3JEZWZhdWx0KF9zdWdnZXN0ZWRNaW4sIE51bWJlci5QT1NJVElWRV9JTkZJTklUWSk7XG4gICAgICAgIF9zdWdnZXN0ZWRNYXggPSBmaW5pdGVPckRlZmF1bHQoX3N1Z2dlc3RlZE1heCwgTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG1pbjogZmluaXRlT3JEZWZhdWx0KF91c2VyTWluLCBfc3VnZ2VzdGVkTWluKSxcbiAgICAgICAgICAgIG1heDogZmluaXRlT3JEZWZhdWx0KF91c2VyTWF4LCBfc3VnZ2VzdGVkTWF4KSxcbiAgICAgICAgICAgIG1pbkRlZmluZWQ6IGlzTnVtYmVyRmluaXRlKF91c2VyTWluKSxcbiAgICAgICAgICAgIG1heERlZmluZWQ6IGlzTnVtYmVyRmluaXRlKF91c2VyTWF4KVxuICAgICAgICB9O1xuICAgIH1cbiBnZXRNaW5NYXgoY2FuU3RhY2spIHtcbiAgICAgICAgbGV0IHsgbWluICwgbWF4ICwgbWluRGVmaW5lZCAsIG1heERlZmluZWQgIH0gPSB0aGlzLmdldFVzZXJCb3VuZHMoKTtcbiAgICAgICAgbGV0IHJhbmdlO1xuICAgICAgICBpZiAobWluRGVmaW5lZCAmJiBtYXhEZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG1pbixcbiAgICAgICAgICAgICAgICBtYXhcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWV0YXMgPSB0aGlzLmdldE1hdGNoaW5nVmlzaWJsZU1ldGFzKCk7XG4gICAgICAgIGZvcihsZXQgaSA9IDAsIGlsZW4gPSBtZXRhcy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpe1xuICAgICAgICAgICAgcmFuZ2UgPSBtZXRhc1tpXS5jb250cm9sbGVyLmdldE1pbk1heCh0aGlzLCBjYW5TdGFjayk7XG4gICAgICAgICAgICBpZiAoIW1pbkRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBtaW4gPSBNYXRoLm1pbihtaW4sIHJhbmdlLm1pbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIW1heERlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBtYXggPSBNYXRoLm1heChtYXgsIHJhbmdlLm1heCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbWluID0gbWF4RGVmaW5lZCAmJiBtaW4gPiBtYXggPyBtYXggOiBtaW47XG4gICAgICAgIG1heCA9IG1pbkRlZmluZWQgJiYgbWluID4gbWF4ID8gbWluIDogbWF4O1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbWluOiBmaW5pdGVPckRlZmF1bHQobWluLCBmaW5pdGVPckRlZmF1bHQobWF4LCBtaW4pKSxcbiAgICAgICAgICAgIG1heDogZmluaXRlT3JEZWZhdWx0KG1heCwgZmluaXRlT3JEZWZhdWx0KG1pbiwgbWF4KSlcbiAgICAgICAgfTtcbiAgICB9XG4gZ2V0UGFkZGluZygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGxlZnQ6IHRoaXMucGFkZGluZ0xlZnQgfHwgMCxcbiAgICAgICAgICAgIHRvcDogdGhpcy5wYWRkaW5nVG9wIHx8IDAsXG4gICAgICAgICAgICByaWdodDogdGhpcy5wYWRkaW5nUmlnaHQgfHwgMCxcbiAgICAgICAgICAgIGJvdHRvbTogdGhpcy5wYWRkaW5nQm90dG9tIHx8IDBcbiAgICAgICAgfTtcbiAgICB9XG4gZ2V0VGlja3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRpY2tzO1xuICAgIH1cbiBnZXRMYWJlbHMoKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmNoYXJ0LmRhdGE7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWxzIHx8ICh0aGlzLmlzSG9yaXpvbnRhbCgpID8gZGF0YS54TGFiZWxzIDogZGF0YS55TGFiZWxzKSB8fCBkYXRhLmxhYmVscyB8fCBbXTtcbiAgICB9XG4gZ2V0TGFiZWxJdGVtcyhjaGFydEFyZWEgPSB0aGlzLmNoYXJ0LmNoYXJ0QXJlYSkge1xuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuX2xhYmVsSXRlbXMgfHwgKHRoaXMuX2xhYmVsSXRlbXMgPSB0aGlzLl9jb21wdXRlTGFiZWxJdGVtcyhjaGFydEFyZWEpKTtcbiAgICAgICAgcmV0dXJuIGl0ZW1zO1xuICAgIH1cbiAgICBiZWZvcmVMYXlvdXQoKSB7XG4gICAgICAgIHRoaXMuX2NhY2hlID0ge307XG4gICAgICAgIHRoaXMuX2RhdGFMaW1pdHNDYWNoZWQgPSBmYWxzZTtcbiAgICB9XG4gICAgYmVmb3JlVXBkYXRlKCkge1xuICAgICAgICBjYWxsYmFjayh0aGlzLm9wdGlvbnMuYmVmb3JlVXBkYXRlLCBbXG4gICAgICAgICAgICB0aGlzXG4gICAgICAgIF0pO1xuICAgIH1cbiB1cGRhdGUobWF4V2lkdGgsIG1heEhlaWdodCwgbWFyZ2lucykge1xuICAgICAgICBjb25zdCB7IGJlZ2luQXRaZXJvICwgZ3JhY2UgLCB0aWNrczogdGlja09wdHMgIH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIGNvbnN0IHNhbXBsZVNpemUgPSB0aWNrT3B0cy5zYW1wbGVTaXplO1xuICAgICAgICB0aGlzLmJlZm9yZVVwZGF0ZSgpO1xuICAgICAgICB0aGlzLm1heFdpZHRoID0gbWF4V2lkdGg7XG4gICAgICAgIHRoaXMubWF4SGVpZ2h0ID0gbWF4SGVpZ2h0O1xuICAgICAgICB0aGlzLl9tYXJnaW5zID0gbWFyZ2lucyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAgICAgbGVmdDogMCxcbiAgICAgICAgICAgIHJpZ2h0OiAwLFxuICAgICAgICAgICAgdG9wOiAwLFxuICAgICAgICAgICAgYm90dG9tOiAwXG4gICAgICAgIH0sIG1hcmdpbnMpO1xuICAgICAgICB0aGlzLnRpY2tzID0gbnVsbDtcbiAgICAgICAgdGhpcy5fbGFiZWxTaXplcyA9IG51bGw7XG4gICAgICAgIHRoaXMuX2dyaWRMaW5lSXRlbXMgPSBudWxsO1xuICAgICAgICB0aGlzLl9sYWJlbEl0ZW1zID0gbnVsbDtcbiAgICAgICAgdGhpcy5iZWZvcmVTZXREaW1lbnNpb25zKCk7XG4gICAgICAgIHRoaXMuc2V0RGltZW5zaW9ucygpO1xuICAgICAgICB0aGlzLmFmdGVyU2V0RGltZW5zaW9ucygpO1xuICAgICAgICB0aGlzLl9tYXhMZW5ndGggPSB0aGlzLmlzSG9yaXpvbnRhbCgpID8gdGhpcy53aWR0aCArIG1hcmdpbnMubGVmdCArIG1hcmdpbnMucmlnaHQgOiB0aGlzLmhlaWdodCArIG1hcmdpbnMudG9wICsgbWFyZ2lucy5ib3R0b207XG4gICAgICAgIGlmICghdGhpcy5fZGF0YUxpbWl0c0NhY2hlZCkge1xuICAgICAgICAgICAgdGhpcy5iZWZvcmVEYXRhTGltaXRzKCk7XG4gICAgICAgICAgICB0aGlzLmRldGVybWluZURhdGFMaW1pdHMoKTtcbiAgICAgICAgICAgIHRoaXMuYWZ0ZXJEYXRhTGltaXRzKCk7XG4gICAgICAgICAgICB0aGlzLl9yYW5nZSA9IF9hZGRHcmFjZSh0aGlzLCBncmFjZSwgYmVnaW5BdFplcm8pO1xuICAgICAgICAgICAgdGhpcy5fZGF0YUxpbWl0c0NhY2hlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5iZWZvcmVCdWlsZFRpY2tzKCk7XG4gICAgICAgIHRoaXMudGlja3MgPSB0aGlzLmJ1aWxkVGlja3MoKSB8fCBbXTtcbiAgICAgICAgdGhpcy5hZnRlckJ1aWxkVGlja3MoKTtcbiAgICAgICAgY29uc3Qgc2FtcGxpbmdFbmFibGVkID0gc2FtcGxlU2l6ZSA8IHRoaXMudGlja3MubGVuZ3RoO1xuICAgICAgICB0aGlzLl9jb252ZXJ0VGlja3NUb0xhYmVscyhzYW1wbGluZ0VuYWJsZWQgPyBzYW1wbGUodGhpcy50aWNrcywgc2FtcGxlU2l6ZSkgOiB0aGlzLnRpY2tzKTtcbiAgICAgICAgdGhpcy5jb25maWd1cmUoKTtcbiAgICAgICAgdGhpcy5iZWZvcmVDYWxjdWxhdGVMYWJlbFJvdGF0aW9uKCk7XG4gICAgICAgIHRoaXMuY2FsY3VsYXRlTGFiZWxSb3RhdGlvbigpO1xuICAgICAgICB0aGlzLmFmdGVyQ2FsY3VsYXRlTGFiZWxSb3RhdGlvbigpO1xuICAgICAgICBpZiAodGlja09wdHMuZGlzcGxheSAmJiAodGlja09wdHMuYXV0b1NraXAgfHwgdGlja09wdHMuc291cmNlID09PSAnYXV0bycpKSB7XG4gICAgICAgICAgICB0aGlzLnRpY2tzID0gYXV0b1NraXAodGhpcywgdGhpcy50aWNrcyk7XG4gICAgICAgICAgICB0aGlzLl9sYWJlbFNpemVzID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuYWZ0ZXJBdXRvU2tpcCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzYW1wbGluZ0VuYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbnZlcnRUaWNrc1RvTGFiZWxzKHRoaXMudGlja3MpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYmVmb3JlRml0KCk7XG4gICAgICAgIHRoaXMuZml0KCk7XG4gICAgICAgIHRoaXMuYWZ0ZXJGaXQoKTtcbiAgICAgICAgdGhpcy5hZnRlclVwZGF0ZSgpO1xuICAgIH1cbiBjb25maWd1cmUoKSB7XG4gICAgICAgIGxldCByZXZlcnNlUGl4ZWxzID0gdGhpcy5vcHRpb25zLnJldmVyc2U7XG4gICAgICAgIGxldCBzdGFydFBpeGVsLCBlbmRQaXhlbDtcbiAgICAgICAgaWYgKHRoaXMuaXNIb3Jpem9udGFsKCkpIHtcbiAgICAgICAgICAgIHN0YXJ0UGl4ZWwgPSB0aGlzLmxlZnQ7XG4gICAgICAgICAgICBlbmRQaXhlbCA9IHRoaXMucmlnaHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdGFydFBpeGVsID0gdGhpcy50b3A7XG4gICAgICAgICAgICBlbmRQaXhlbCA9IHRoaXMuYm90dG9tO1xuICAgICAgICAgICAgcmV2ZXJzZVBpeGVscyA9ICFyZXZlcnNlUGl4ZWxzO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3N0YXJ0UGl4ZWwgPSBzdGFydFBpeGVsO1xuICAgICAgICB0aGlzLl9lbmRQaXhlbCA9IGVuZFBpeGVsO1xuICAgICAgICB0aGlzLl9yZXZlcnNlUGl4ZWxzID0gcmV2ZXJzZVBpeGVscztcbiAgICAgICAgdGhpcy5fbGVuZ3RoID0gZW5kUGl4ZWwgLSBzdGFydFBpeGVsO1xuICAgICAgICB0aGlzLl9hbGlnblRvUGl4ZWxzID0gdGhpcy5vcHRpb25zLmFsaWduVG9QaXhlbHM7XG4gICAgfVxuICAgIGFmdGVyVXBkYXRlKCkge1xuICAgICAgICBjYWxsYmFjayh0aGlzLm9wdGlvbnMuYWZ0ZXJVcGRhdGUsIFtcbiAgICAgICAgICAgIHRoaXNcbiAgICAgICAgXSk7XG4gICAgfVxuICAgIGJlZm9yZVNldERpbWVuc2lvbnMoKSB7XG4gICAgICAgIGNhbGxiYWNrKHRoaXMub3B0aW9ucy5iZWZvcmVTZXREaW1lbnNpb25zLCBbXG4gICAgICAgICAgICB0aGlzXG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBzZXREaW1lbnNpb25zKCkge1xuICAgICAgICBpZiAodGhpcy5pc0hvcml6b250YWwoKSkge1xuICAgICAgICAgICAgdGhpcy53aWR0aCA9IHRoaXMubWF4V2lkdGg7XG4gICAgICAgICAgICB0aGlzLmxlZnQgPSAwO1xuICAgICAgICAgICAgdGhpcy5yaWdodCA9IHRoaXMud2lkdGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmhlaWdodCA9IHRoaXMubWF4SGVpZ2h0O1xuICAgICAgICAgICAgdGhpcy50b3AgPSAwO1xuICAgICAgICAgICAgdGhpcy5ib3R0b20gPSB0aGlzLmhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBhZGRpbmdMZWZ0ID0gMDtcbiAgICAgICAgdGhpcy5wYWRkaW5nVG9wID0gMDtcbiAgICAgICAgdGhpcy5wYWRkaW5nUmlnaHQgPSAwO1xuICAgICAgICB0aGlzLnBhZGRpbmdCb3R0b20gPSAwO1xuICAgIH1cbiAgICBhZnRlclNldERpbWVuc2lvbnMoKSB7XG4gICAgICAgIGNhbGxiYWNrKHRoaXMub3B0aW9ucy5hZnRlclNldERpbWVuc2lvbnMsIFtcbiAgICAgICAgICAgIHRoaXNcbiAgICAgICAgXSk7XG4gICAgfVxuICAgIF9jYWxsSG9va3MobmFtZSkge1xuICAgICAgICB0aGlzLmNoYXJ0Lm5vdGlmeVBsdWdpbnMobmFtZSwgdGhpcy5nZXRDb250ZXh0KCkpO1xuICAgICAgICBjYWxsYmFjayh0aGlzLm9wdGlvbnNbbmFtZV0sIFtcbiAgICAgICAgICAgIHRoaXNcbiAgICAgICAgXSk7XG4gICAgfVxuICAgIGJlZm9yZURhdGFMaW1pdHMoKSB7XG4gICAgICAgIHRoaXMuX2NhbGxIb29rcygnYmVmb3JlRGF0YUxpbWl0cycpO1xuICAgIH1cbiAgICBkZXRlcm1pbmVEYXRhTGltaXRzKCkge31cbiAgICBhZnRlckRhdGFMaW1pdHMoKSB7XG4gICAgICAgIHRoaXMuX2NhbGxIb29rcygnYWZ0ZXJEYXRhTGltaXRzJyk7XG4gICAgfVxuICAgIGJlZm9yZUJ1aWxkVGlja3MoKSB7XG4gICAgICAgIHRoaXMuX2NhbGxIb29rcygnYmVmb3JlQnVpbGRUaWNrcycpO1xuICAgIH1cbiBidWlsZFRpY2tzKCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGFmdGVyQnVpbGRUaWNrcygpIHtcbiAgICAgICAgdGhpcy5fY2FsbEhvb2tzKCdhZnRlckJ1aWxkVGlja3MnKTtcbiAgICB9XG4gICAgYmVmb3JlVGlja1RvTGFiZWxDb252ZXJzaW9uKCkge1xuICAgICAgICBjYWxsYmFjayh0aGlzLm9wdGlvbnMuYmVmb3JlVGlja1RvTGFiZWxDb252ZXJzaW9uLCBbXG4gICAgICAgICAgICB0aGlzXG4gICAgICAgIF0pO1xuICAgIH1cbiBnZW5lcmF0ZVRpY2tMYWJlbHModGlja3MpIHtcbiAgICAgICAgY29uc3QgdGlja09wdHMgPSB0aGlzLm9wdGlvbnMudGlja3M7XG4gICAgICAgIGxldCBpLCBpbGVuLCB0aWNrO1xuICAgICAgICBmb3IoaSA9IDAsIGlsZW4gPSB0aWNrcy5sZW5ndGg7IGkgPCBpbGVuOyBpKyspe1xuICAgICAgICAgICAgdGljayA9IHRpY2tzW2ldO1xuICAgICAgICAgICAgdGljay5sYWJlbCA9IGNhbGxiYWNrKHRpY2tPcHRzLmNhbGxiYWNrLCBbXG4gICAgICAgICAgICAgICAgdGljay52YWx1ZSxcbiAgICAgICAgICAgICAgICBpLFxuICAgICAgICAgICAgICAgIHRpY2tzXG4gICAgICAgICAgICBdLCB0aGlzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhZnRlclRpY2tUb0xhYmVsQ29udmVyc2lvbigpIHtcbiAgICAgICAgY2FsbGJhY2sodGhpcy5vcHRpb25zLmFmdGVyVGlja1RvTGFiZWxDb252ZXJzaW9uLCBbXG4gICAgICAgICAgICB0aGlzXG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBiZWZvcmVDYWxjdWxhdGVMYWJlbFJvdGF0aW9uKCkge1xuICAgICAgICBjYWxsYmFjayh0aGlzLm9wdGlvbnMuYmVmb3JlQ2FsY3VsYXRlTGFiZWxSb3RhdGlvbiwgW1xuICAgICAgICAgICAgdGhpc1xuICAgICAgICBdKTtcbiAgICB9XG4gICAgY2FsY3VsYXRlTGFiZWxSb3RhdGlvbigpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgY29uc3QgdGlja09wdHMgPSBvcHRpb25zLnRpY2tzO1xuICAgICAgICBjb25zdCBudW1UaWNrcyA9IGdldFRpY2tzTGltaXQodGhpcy50aWNrcy5sZW5ndGgsIG9wdGlvbnMudGlja3MubWF4VGlja3NMaW1pdCk7XG4gICAgICAgIGNvbnN0IG1pblJvdGF0aW9uID0gdGlja09wdHMubWluUm90YXRpb24gfHwgMDtcbiAgICAgICAgY29uc3QgbWF4Um90YXRpb24gPSB0aWNrT3B0cy5tYXhSb3RhdGlvbjtcbiAgICAgICAgbGV0IGxhYmVsUm90YXRpb24gPSBtaW5Sb3RhdGlvbjtcbiAgICAgICAgbGV0IHRpY2tXaWR0aCwgbWF4SGVpZ2h0LCBtYXhMYWJlbERpYWdvbmFsO1xuICAgICAgICBpZiAoIXRoaXMuX2lzVmlzaWJsZSgpIHx8ICF0aWNrT3B0cy5kaXNwbGF5IHx8IG1pblJvdGF0aW9uID49IG1heFJvdGF0aW9uIHx8IG51bVRpY2tzIDw9IDEgfHwgIXRoaXMuaXNIb3Jpem9udGFsKCkpIHtcbiAgICAgICAgICAgIHRoaXMubGFiZWxSb3RhdGlvbiA9IG1pblJvdGF0aW9uO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxhYmVsU2l6ZXMgPSB0aGlzLl9nZXRMYWJlbFNpemVzKCk7XG4gICAgICAgIGNvbnN0IG1heExhYmVsV2lkdGggPSBsYWJlbFNpemVzLndpZGVzdC53aWR0aDtcbiAgICAgICAgY29uc3QgbWF4TGFiZWxIZWlnaHQgPSBsYWJlbFNpemVzLmhpZ2hlc3QuaGVpZ2h0O1xuICAgICAgICBjb25zdCBtYXhXaWR0aCA9IF9saW1pdFZhbHVlKHRoaXMuY2hhcnQud2lkdGggLSBtYXhMYWJlbFdpZHRoLCAwLCB0aGlzLm1heFdpZHRoKTtcbiAgICAgICAgdGlja1dpZHRoID0gb3B0aW9ucy5vZmZzZXQgPyB0aGlzLm1heFdpZHRoIC8gbnVtVGlja3MgOiBtYXhXaWR0aCAvIChudW1UaWNrcyAtIDEpO1xuICAgICAgICBpZiAobWF4TGFiZWxXaWR0aCArIDYgPiB0aWNrV2lkdGgpIHtcbiAgICAgICAgICAgIHRpY2tXaWR0aCA9IG1heFdpZHRoIC8gKG51bVRpY2tzIC0gKG9wdGlvbnMub2Zmc2V0ID8gMC41IDogMSkpO1xuICAgICAgICAgICAgbWF4SGVpZ2h0ID0gdGhpcy5tYXhIZWlnaHQgLSBnZXRUaWNrTWFya0xlbmd0aChvcHRpb25zLmdyaWQpIC0gdGlja09wdHMucGFkZGluZyAtIGdldFRpdGxlSGVpZ2h0KG9wdGlvbnMudGl0bGUsIHRoaXMuY2hhcnQub3B0aW9ucy5mb250KTtcbiAgICAgICAgICAgIG1heExhYmVsRGlhZ29uYWwgPSBNYXRoLnNxcnQobWF4TGFiZWxXaWR0aCAqIG1heExhYmVsV2lkdGggKyBtYXhMYWJlbEhlaWdodCAqIG1heExhYmVsSGVpZ2h0KTtcbiAgICAgICAgICAgIGxhYmVsUm90YXRpb24gPSB0b0RlZ3JlZXMoTWF0aC5taW4oTWF0aC5hc2luKF9saW1pdFZhbHVlKChsYWJlbFNpemVzLmhpZ2hlc3QuaGVpZ2h0ICsgNikgLyB0aWNrV2lkdGgsIC0xLCAxKSksIE1hdGguYXNpbihfbGltaXRWYWx1ZShtYXhIZWlnaHQgLyBtYXhMYWJlbERpYWdvbmFsLCAtMSwgMSkpIC0gTWF0aC5hc2luKF9saW1pdFZhbHVlKG1heExhYmVsSGVpZ2h0IC8gbWF4TGFiZWxEaWFnb25hbCwgLTEsIDEpKSkpO1xuICAgICAgICAgICAgbGFiZWxSb3RhdGlvbiA9IE1hdGgubWF4KG1pblJvdGF0aW9uLCBNYXRoLm1pbihtYXhSb3RhdGlvbiwgbGFiZWxSb3RhdGlvbikpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubGFiZWxSb3RhdGlvbiA9IGxhYmVsUm90YXRpb247XG4gICAgfVxuICAgIGFmdGVyQ2FsY3VsYXRlTGFiZWxSb3RhdGlvbigpIHtcbiAgICAgICAgY2FsbGJhY2sodGhpcy5vcHRpb25zLmFmdGVyQ2FsY3VsYXRlTGFiZWxSb3RhdGlvbiwgW1xuICAgICAgICAgICAgdGhpc1xuICAgICAgICBdKTtcbiAgICB9XG4gICAgYWZ0ZXJBdXRvU2tpcCgpIHt9XG4gICAgYmVmb3JlRml0KCkge1xuICAgICAgICBjYWxsYmFjayh0aGlzLm9wdGlvbnMuYmVmb3JlRml0LCBbXG4gICAgICAgICAgICB0aGlzXG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBmaXQoKSB7XG4gICAgICAgIGNvbnN0IG1pblNpemUgPSB7XG4gICAgICAgICAgICB3aWR0aDogMCxcbiAgICAgICAgICAgIGhlaWdodDogMFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCB7IGNoYXJ0ICwgb3B0aW9uczogeyB0aWNrczogdGlja09wdHMgLCB0aXRsZTogdGl0bGVPcHRzICwgZ3JpZDogZ3JpZE9wdHMgIH0gIH0gPSB0aGlzO1xuICAgICAgICBjb25zdCBkaXNwbGF5ID0gdGhpcy5faXNWaXNpYmxlKCk7XG4gICAgICAgIGNvbnN0IGlzSG9yaXpvbnRhbCA9IHRoaXMuaXNIb3Jpem9udGFsKCk7XG4gICAgICAgIGlmIChkaXNwbGF5KSB7XG4gICAgICAgICAgICBjb25zdCB0aXRsZUhlaWdodCA9IGdldFRpdGxlSGVpZ2h0KHRpdGxlT3B0cywgY2hhcnQub3B0aW9ucy5mb250KTtcbiAgICAgICAgICAgIGlmIChpc0hvcml6b250YWwpIHtcbiAgICAgICAgICAgICAgICBtaW5TaXplLndpZHRoID0gdGhpcy5tYXhXaWR0aDtcbiAgICAgICAgICAgICAgICBtaW5TaXplLmhlaWdodCA9IGdldFRpY2tNYXJrTGVuZ3RoKGdyaWRPcHRzKSArIHRpdGxlSGVpZ2h0O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBtaW5TaXplLmhlaWdodCA9IHRoaXMubWF4SGVpZ2h0O1xuICAgICAgICAgICAgICAgIG1pblNpemUud2lkdGggPSBnZXRUaWNrTWFya0xlbmd0aChncmlkT3B0cykgKyB0aXRsZUhlaWdodDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aWNrT3B0cy5kaXNwbGF5ICYmIHRoaXMudGlja3MubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBmaXJzdCAsIGxhc3QgLCB3aWRlc3QgLCBoaWdoZXN0ICB9ID0gdGhpcy5fZ2V0TGFiZWxTaXplcygpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpY2tQYWRkaW5nID0gdGlja09wdHMucGFkZGluZyAqIDI7XG4gICAgICAgICAgICAgICAgY29uc3QgYW5nbGVSYWRpYW5zID0gdG9SYWRpYW5zKHRoaXMubGFiZWxSb3RhdGlvbik7XG4gICAgICAgICAgICAgICAgY29uc3QgY29zID0gTWF0aC5jb3MoYW5nbGVSYWRpYW5zKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzaW4gPSBNYXRoLnNpbihhbmdsZVJhZGlhbnMpO1xuICAgICAgICAgICAgICAgIGlmIChpc0hvcml6b250YWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFiZWxIZWlnaHQgPSB0aWNrT3B0cy5taXJyb3IgPyAwIDogc2luICogd2lkZXN0LndpZHRoICsgY29zICogaGlnaGVzdC5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgIG1pblNpemUuaGVpZ2h0ID0gTWF0aC5taW4odGhpcy5tYXhIZWlnaHQsIG1pblNpemUuaGVpZ2h0ICsgbGFiZWxIZWlnaHQgKyB0aWNrUGFkZGluZyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFiZWxXaWR0aCA9IHRpY2tPcHRzLm1pcnJvciA/IDAgOiBjb3MgKiB3aWRlc3Qud2lkdGggKyBzaW4gKiBoaWdoZXN0LmhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgbWluU2l6ZS53aWR0aCA9IE1hdGgubWluKHRoaXMubWF4V2lkdGgsIG1pblNpemUud2lkdGggKyBsYWJlbFdpZHRoICsgdGlja1BhZGRpbmcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLl9jYWxjdWxhdGVQYWRkaW5nKGZpcnN0LCBsYXN0LCBzaW4sIGNvcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5faGFuZGxlTWFyZ2lucygpO1xuICAgICAgICBpZiAoaXNIb3Jpem9udGFsKSB7XG4gICAgICAgICAgICB0aGlzLndpZHRoID0gdGhpcy5fbGVuZ3RoID0gY2hhcnQud2lkdGggLSB0aGlzLl9tYXJnaW5zLmxlZnQgLSB0aGlzLl9tYXJnaW5zLnJpZ2h0O1xuICAgICAgICAgICAgdGhpcy5oZWlnaHQgPSBtaW5TaXplLmhlaWdodDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMud2lkdGggPSBtaW5TaXplLndpZHRoO1xuICAgICAgICAgICAgdGhpcy5oZWlnaHQgPSB0aGlzLl9sZW5ndGggPSBjaGFydC5oZWlnaHQgLSB0aGlzLl9tYXJnaW5zLnRvcCAtIHRoaXMuX21hcmdpbnMuYm90dG9tO1xuICAgICAgICB9XG4gICAgfVxuICAgIF9jYWxjdWxhdGVQYWRkaW5nKGZpcnN0LCBsYXN0LCBzaW4sIGNvcykge1xuICAgICAgICBjb25zdCB7IHRpY2tzOiB7IGFsaWduICwgcGFkZGluZyAgfSAsIHBvc2l0aW9uICB9ID0gdGhpcy5vcHRpb25zO1xuICAgICAgICBjb25zdCBpc1JvdGF0ZWQgPSB0aGlzLmxhYmVsUm90YXRpb24gIT09IDA7XG4gICAgICAgIGNvbnN0IGxhYmVsc0JlbG93VGlja3MgPSBwb3NpdGlvbiAhPT0gJ3RvcCcgJiYgdGhpcy5heGlzID09PSAneCc7XG4gICAgICAgIGlmICh0aGlzLmlzSG9yaXpvbnRhbCgpKSB7XG4gICAgICAgICAgICBjb25zdCBvZmZzZXRMZWZ0ID0gdGhpcy5nZXRQaXhlbEZvclRpY2soMCkgLSB0aGlzLmxlZnQ7XG4gICAgICAgICAgICBjb25zdCBvZmZzZXRSaWdodCA9IHRoaXMucmlnaHQgLSB0aGlzLmdldFBpeGVsRm9yVGljayh0aGlzLnRpY2tzLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgbGV0IHBhZGRpbmdMZWZ0ID0gMDtcbiAgICAgICAgICAgIGxldCBwYWRkaW5nUmlnaHQgPSAwO1xuICAgICAgICAgICAgaWYgKGlzUm90YXRlZCkge1xuICAgICAgICAgICAgICAgIGlmIChsYWJlbHNCZWxvd1RpY2tzKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmdMZWZ0ID0gY29zICogZmlyc3Qud2lkdGg7XG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmdSaWdodCA9IHNpbiAqIGxhc3QuaGVpZ2h0O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmdMZWZ0ID0gc2luICogZmlyc3QuaGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICBwYWRkaW5nUmlnaHQgPSBjb3MgKiBsYXN0LndpZHRoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYWxpZ24gPT09ICdzdGFydCcpIHtcbiAgICAgICAgICAgICAgICBwYWRkaW5nUmlnaHQgPSBsYXN0LndpZHRoO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChhbGlnbiA9PT0gJ2VuZCcpIHtcbiAgICAgICAgICAgICAgICBwYWRkaW5nTGVmdCA9IGZpcnN0LndpZHRoO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChhbGlnbiAhPT0gJ2lubmVyJykge1xuICAgICAgICAgICAgICAgIHBhZGRpbmdMZWZ0ID0gZmlyc3Qud2lkdGggLyAyO1xuICAgICAgICAgICAgICAgIHBhZGRpbmdSaWdodCA9IGxhc3Qud2lkdGggLyAyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5wYWRkaW5nTGVmdCA9IE1hdGgubWF4KChwYWRkaW5nTGVmdCAtIG9mZnNldExlZnQgKyBwYWRkaW5nKSAqIHRoaXMud2lkdGggLyAodGhpcy53aWR0aCAtIG9mZnNldExlZnQpLCAwKTtcbiAgICAgICAgICAgIHRoaXMucGFkZGluZ1JpZ2h0ID0gTWF0aC5tYXgoKHBhZGRpbmdSaWdodCAtIG9mZnNldFJpZ2h0ICsgcGFkZGluZykgKiB0aGlzLndpZHRoIC8gKHRoaXMud2lkdGggLSBvZmZzZXRSaWdodCksIDApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHBhZGRpbmdUb3AgPSBsYXN0LmhlaWdodCAvIDI7XG4gICAgICAgICAgICBsZXQgcGFkZGluZ0JvdHRvbSA9IGZpcnN0LmhlaWdodCAvIDI7XG4gICAgICAgICAgICBpZiAoYWxpZ24gPT09ICdzdGFydCcpIHtcbiAgICAgICAgICAgICAgICBwYWRkaW5nVG9wID0gMDtcbiAgICAgICAgICAgICAgICBwYWRkaW5nQm90dG9tID0gZmlyc3QuaGVpZ2h0O1xuICAgICAgICAgICAgfSBlbHNlIGlmIChhbGlnbiA9PT0gJ2VuZCcpIHtcbiAgICAgICAgICAgICAgICBwYWRkaW5nVG9wID0gbGFzdC5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgcGFkZGluZ0JvdHRvbSA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnBhZGRpbmdUb3AgPSBwYWRkaW5nVG9wICsgcGFkZGluZztcbiAgICAgICAgICAgIHRoaXMucGFkZGluZ0JvdHRvbSA9IHBhZGRpbmdCb3R0b20gKyBwYWRkaW5nO1xuICAgICAgICB9XG4gICAgfVxuIF9oYW5kbGVNYXJnaW5zKCkge1xuICAgICAgICBpZiAodGhpcy5fbWFyZ2lucykge1xuICAgICAgICAgICAgdGhpcy5fbWFyZ2lucy5sZWZ0ID0gTWF0aC5tYXgodGhpcy5wYWRkaW5nTGVmdCwgdGhpcy5fbWFyZ2lucy5sZWZ0KTtcbiAgICAgICAgICAgIHRoaXMuX21hcmdpbnMudG9wID0gTWF0aC5tYXgodGhpcy5wYWRkaW5nVG9wLCB0aGlzLl9tYXJnaW5zLnRvcCk7XG4gICAgICAgICAgICB0aGlzLl9tYXJnaW5zLnJpZ2h0ID0gTWF0aC5tYXgodGhpcy5wYWRkaW5nUmlnaHQsIHRoaXMuX21hcmdpbnMucmlnaHQpO1xuICAgICAgICAgICAgdGhpcy5fbWFyZ2lucy5ib3R0b20gPSBNYXRoLm1heCh0aGlzLnBhZGRpbmdCb3R0b20sIHRoaXMuX21hcmdpbnMuYm90dG9tKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhZnRlckZpdCgpIHtcbiAgICAgICAgY2FsbGJhY2sodGhpcy5vcHRpb25zLmFmdGVyRml0LCBbXG4gICAgICAgICAgICB0aGlzXG4gICAgICAgIF0pO1xuICAgIH1cbiBpc0hvcml6b250YWwoKSB7XG4gICAgICAgIGNvbnN0IHsgYXhpcyAsIHBvc2l0aW9uICB9ID0gdGhpcy5vcHRpb25zO1xuICAgICAgICByZXR1cm4gcG9zaXRpb24gPT09ICd0b3AnIHx8IHBvc2l0aW9uID09PSAnYm90dG9tJyB8fCBheGlzID09PSAneCc7XG4gICAgfVxuIGlzRnVsbFNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZnVsbFNpemU7XG4gICAgfVxuIF9jb252ZXJ0VGlja3NUb0xhYmVscyh0aWNrcykge1xuICAgICAgICB0aGlzLmJlZm9yZVRpY2tUb0xhYmVsQ29udmVyc2lvbigpO1xuICAgICAgICB0aGlzLmdlbmVyYXRlVGlja0xhYmVscyh0aWNrcyk7XG4gICAgICAgIGxldCBpLCBpbGVuO1xuICAgICAgICBmb3IoaSA9IDAsIGlsZW4gPSB0aWNrcy5sZW5ndGg7IGkgPCBpbGVuOyBpKyspe1xuICAgICAgICAgICAgaWYgKGlzTnVsbE9yVW5kZWYodGlja3NbaV0ubGFiZWwpKSB7XG4gICAgICAgICAgICAgICAgdGlja3Muc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgIGlsZW4tLTtcbiAgICAgICAgICAgICAgICBpLS07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hZnRlclRpY2tUb0xhYmVsQ29udmVyc2lvbigpO1xuICAgIH1cbiBfZ2V0TGFiZWxTaXplcygpIHtcbiAgICAgICAgbGV0IGxhYmVsU2l6ZXMgPSB0aGlzLl9sYWJlbFNpemVzO1xuICAgICAgICBpZiAoIWxhYmVsU2l6ZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHNhbXBsZVNpemUgPSB0aGlzLm9wdGlvbnMudGlja3Muc2FtcGxlU2l6ZTtcbiAgICAgICAgICAgIGxldCB0aWNrcyA9IHRoaXMudGlja3M7XG4gICAgICAgICAgICBpZiAoc2FtcGxlU2l6ZSA8IHRpY2tzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRpY2tzID0gc2FtcGxlKHRpY2tzLCBzYW1wbGVTaXplKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2xhYmVsU2l6ZXMgPSBsYWJlbFNpemVzID0gdGhpcy5fY29tcHV0ZUxhYmVsU2l6ZXModGlja3MsIHRpY2tzLmxlbmd0aCwgdGhpcy5vcHRpb25zLnRpY2tzLm1heFRpY2tzTGltaXQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsYWJlbFNpemVzO1xuICAgIH1cbiBfY29tcHV0ZUxhYmVsU2l6ZXModGlja3MsIGxlbmd0aCwgbWF4VGlja3NMaW1pdCkge1xuICAgICAgICBjb25zdCB7IGN0eCAsIF9sb25nZXN0VGV4dENhY2hlOiBjYWNoZXMgIH0gPSB0aGlzO1xuICAgICAgICBjb25zdCB3aWR0aHMgPSBbXTtcbiAgICAgICAgY29uc3QgaGVpZ2h0cyA9IFtdO1xuICAgICAgICBjb25zdCBpbmNyZW1lbnQgPSBNYXRoLmZsb29yKGxlbmd0aCAvIGdldFRpY2tzTGltaXQobGVuZ3RoLCBtYXhUaWNrc0xpbWl0KSk7XG4gICAgICAgIGxldCB3aWRlc3RMYWJlbFNpemUgPSAwO1xuICAgICAgICBsZXQgaGlnaGVzdExhYmVsU2l6ZSA9IDA7XG4gICAgICAgIGxldCBpLCBqLCBqbGVuLCBsYWJlbCwgdGlja0ZvbnQsIGZvbnRTdHJpbmcsIGNhY2hlLCBsaW5lSGVpZ2h0LCB3aWR0aCwgaGVpZ2h0LCBuZXN0ZWRMYWJlbDtcbiAgICAgICAgZm9yKGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IGluY3JlbWVudCl7XG4gICAgICAgICAgICBsYWJlbCA9IHRpY2tzW2ldLmxhYmVsO1xuICAgICAgICAgICAgdGlja0ZvbnQgPSB0aGlzLl9yZXNvbHZlVGlja0ZvbnRPcHRpb25zKGkpO1xuICAgICAgICAgICAgY3R4LmZvbnQgPSBmb250U3RyaW5nID0gdGlja0ZvbnQuc3RyaW5nO1xuICAgICAgICAgICAgY2FjaGUgPSBjYWNoZXNbZm9udFN0cmluZ10gPSBjYWNoZXNbZm9udFN0cmluZ10gfHwge1xuICAgICAgICAgICAgICAgIGRhdGE6IHt9LFxuICAgICAgICAgICAgICAgIGdjOiBbXVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxpbmVIZWlnaHQgPSB0aWNrRm9udC5saW5lSGVpZ2h0O1xuICAgICAgICAgICAgd2lkdGggPSBoZWlnaHQgPSAwO1xuICAgICAgICAgICAgaWYgKCFpc051bGxPclVuZGVmKGxhYmVsKSAmJiAhaXNBcnJheShsYWJlbCkpIHtcbiAgICAgICAgICAgICAgICB3aWR0aCA9IF9tZWFzdXJlVGV4dChjdHgsIGNhY2hlLmRhdGEsIGNhY2hlLmdjLCB3aWR0aCwgbGFiZWwpO1xuICAgICAgICAgICAgICAgIGhlaWdodCA9IGxpbmVIZWlnaHQ7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzQXJyYXkobGFiZWwpKSB7XG4gICAgICAgICAgICAgICAgZm9yKGogPSAwLCBqbGVuID0gbGFiZWwubGVuZ3RoOyBqIDwgamxlbjsgKytqKXtcbiAgICAgICAgICAgICAgICAgICAgbmVzdGVkTGFiZWwgPSAgbGFiZWxbal07XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNOdWxsT3JVbmRlZihuZXN0ZWRMYWJlbCkgJiYgIWlzQXJyYXkobmVzdGVkTGFiZWwpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IF9tZWFzdXJlVGV4dChjdHgsIGNhY2hlLmRhdGEsIGNhY2hlLmdjLCB3aWR0aCwgbmVzdGVkTGFiZWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ICs9IGxpbmVIZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3aWR0aHMucHVzaCh3aWR0aCk7XG4gICAgICAgICAgICBoZWlnaHRzLnB1c2goaGVpZ2h0KTtcbiAgICAgICAgICAgIHdpZGVzdExhYmVsU2l6ZSA9IE1hdGgubWF4KHdpZHRoLCB3aWRlc3RMYWJlbFNpemUpO1xuICAgICAgICAgICAgaGlnaGVzdExhYmVsU2l6ZSA9IE1hdGgubWF4KGhlaWdodCwgaGlnaGVzdExhYmVsU2l6ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2FyYmFnZUNvbGxlY3QoY2FjaGVzLCBsZW5ndGgpO1xuICAgICAgICBjb25zdCB3aWRlc3QgPSB3aWR0aHMuaW5kZXhPZih3aWRlc3RMYWJlbFNpemUpO1xuICAgICAgICBjb25zdCBoaWdoZXN0ID0gaGVpZ2h0cy5pbmRleE9mKGhpZ2hlc3RMYWJlbFNpemUpO1xuICAgICAgICBjb25zdCB2YWx1ZUF0ID0gKGlkeCk9Pih7XG4gICAgICAgICAgICAgICAgd2lkdGg6IHdpZHRoc1tpZHhdIHx8IDAsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBoZWlnaHRzW2lkeF0gfHwgMFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBmaXJzdDogdmFsdWVBdCgwKSxcbiAgICAgICAgICAgIGxhc3Q6IHZhbHVlQXQobGVuZ3RoIC0gMSksXG4gICAgICAgICAgICB3aWRlc3Q6IHZhbHVlQXQod2lkZXN0KSxcbiAgICAgICAgICAgIGhpZ2hlc3Q6IHZhbHVlQXQoaGlnaGVzdCksXG4gICAgICAgICAgICB3aWR0aHMsXG4gICAgICAgICAgICBoZWlnaHRzXG4gICAgICAgIH07XG4gICAgfVxuIGdldExhYmVsRm9yVmFsdWUodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiBnZXRQaXhlbEZvclZhbHVlKHZhbHVlLCBpbmRleCkge1xuICAgICAgICByZXR1cm4gTmFOO1xuICAgIH1cbiBnZXRWYWx1ZUZvclBpeGVsKHBpeGVsKSB7fVxuIGdldFBpeGVsRm9yVGljayhpbmRleCkge1xuICAgICAgICBjb25zdCB0aWNrcyA9IHRoaXMudGlja3M7XG4gICAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPiB0aWNrcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5nZXRQaXhlbEZvclZhbHVlKHRpY2tzW2luZGV4XS52YWx1ZSk7XG4gICAgfVxuIGdldFBpeGVsRm9yRGVjaW1hbChkZWNpbWFsKSB7XG4gICAgICAgIGlmICh0aGlzLl9yZXZlcnNlUGl4ZWxzKSB7XG4gICAgICAgICAgICBkZWNpbWFsID0gMSAtIGRlY2ltYWw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGl4ZWwgPSB0aGlzLl9zdGFydFBpeGVsICsgZGVjaW1hbCAqIHRoaXMuX2xlbmd0aDtcbiAgICAgICAgcmV0dXJuIF9pbnQxNlJhbmdlKHRoaXMuX2FsaWduVG9QaXhlbHMgPyBfYWxpZ25QaXhlbCh0aGlzLmNoYXJ0LCBwaXhlbCwgMCkgOiBwaXhlbCk7XG4gICAgfVxuIGdldERlY2ltYWxGb3JQaXhlbChwaXhlbCkge1xuICAgICAgICBjb25zdCBkZWNpbWFsID0gKHBpeGVsIC0gdGhpcy5fc3RhcnRQaXhlbCkgLyB0aGlzLl9sZW5ndGg7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXZlcnNlUGl4ZWxzID8gMSAtIGRlY2ltYWwgOiBkZWNpbWFsO1xuICAgIH1cbiBnZXRCYXNlUGl4ZWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBpeGVsRm9yVmFsdWUodGhpcy5nZXRCYXNlVmFsdWUoKSk7XG4gICAgfVxuIGdldEJhc2VWYWx1ZSgpIHtcbiAgICAgICAgY29uc3QgeyBtaW4gLCBtYXggIH0gPSB0aGlzO1xuICAgICAgICByZXR1cm4gbWluIDwgMCAmJiBtYXggPCAwID8gbWF4IDogbWluID4gMCAmJiBtYXggPiAwID8gbWluIDogMDtcbiAgICB9XG4gZ2V0Q29udGV4dChpbmRleCkge1xuICAgICAgICBjb25zdCB0aWNrcyA9IHRoaXMudGlja3MgfHwgW107XG4gICAgICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgdGlja3MubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCB0aWNrID0gdGlja3NbaW5kZXhdO1xuICAgICAgICAgICAgcmV0dXJuIHRpY2suJGNvbnRleHQgfHwgKHRpY2suJGNvbnRleHQgPSBjcmVhdGVUaWNrQ29udGV4dCh0aGlzLmdldENvbnRleHQoKSwgaW5kZXgsIHRpY2spKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy4kY29udGV4dCB8fCAodGhpcy4kY29udGV4dCA9IGNyZWF0ZVNjYWxlQ29udGV4dCh0aGlzLmNoYXJ0LmdldENvbnRleHQoKSwgdGhpcykpO1xuICAgIH1cbiBfdGlja1NpemUoKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvblRpY2tzID0gdGhpcy5vcHRpb25zLnRpY2tzO1xuICAgICAgICBjb25zdCByb3QgPSB0b1JhZGlhbnModGhpcy5sYWJlbFJvdGF0aW9uKTtcbiAgICAgICAgY29uc3QgY29zID0gTWF0aC5hYnMoTWF0aC5jb3Mocm90KSk7XG4gICAgICAgIGNvbnN0IHNpbiA9IE1hdGguYWJzKE1hdGguc2luKHJvdCkpO1xuICAgICAgICBjb25zdCBsYWJlbFNpemVzID0gdGhpcy5fZ2V0TGFiZWxTaXplcygpO1xuICAgICAgICBjb25zdCBwYWRkaW5nID0gb3B0aW9uVGlja3MuYXV0b1NraXBQYWRkaW5nIHx8IDA7XG4gICAgICAgIGNvbnN0IHcgPSBsYWJlbFNpemVzID8gbGFiZWxTaXplcy53aWRlc3Qud2lkdGggKyBwYWRkaW5nIDogMDtcbiAgICAgICAgY29uc3QgaCA9IGxhYmVsU2l6ZXMgPyBsYWJlbFNpemVzLmhpZ2hlc3QuaGVpZ2h0ICsgcGFkZGluZyA6IDA7XG4gICAgICAgIHJldHVybiB0aGlzLmlzSG9yaXpvbnRhbCgpID8gaCAqIGNvcyA+IHcgKiBzaW4gPyB3IC8gY29zIDogaCAvIHNpbiA6IGggKiBzaW4gPCB3ICogY29zID8gaCAvIGNvcyA6IHcgLyBzaW47XG4gICAgfVxuIF9pc1Zpc2libGUoKSB7XG4gICAgICAgIGNvbnN0IGRpc3BsYXkgPSB0aGlzLm9wdGlvbnMuZGlzcGxheTtcbiAgICAgICAgaWYgKGRpc3BsYXkgIT09ICdhdXRvJykge1xuICAgICAgICAgICAgcmV0dXJuICEhZGlzcGxheTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5nZXRNYXRjaGluZ1Zpc2libGVNZXRhcygpLmxlbmd0aCA+IDA7XG4gICAgfVxuIF9jb21wdXRlR3JpZExpbmVJdGVtcyhjaGFydEFyZWEpIHtcbiAgICAgICAgY29uc3QgYXhpcyA9IHRoaXMuYXhpcztcbiAgICAgICAgY29uc3QgY2hhcnQgPSB0aGlzLmNoYXJ0O1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgICAgICBjb25zdCB7IGdyaWQgLCBwb3NpdGlvbiAsIGJvcmRlciAgfSA9IG9wdGlvbnM7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IGdyaWQub2Zmc2V0O1xuICAgICAgICBjb25zdCBpc0hvcml6b250YWwgPSB0aGlzLmlzSG9yaXpvbnRhbCgpO1xuICAgICAgICBjb25zdCB0aWNrcyA9IHRoaXMudGlja3M7XG4gICAgICAgIGNvbnN0IHRpY2tzTGVuZ3RoID0gdGlja3MubGVuZ3RoICsgKG9mZnNldCA/IDEgOiAwKTtcbiAgICAgICAgY29uc3QgdGwgPSBnZXRUaWNrTWFya0xlbmd0aChncmlkKTtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBbXTtcbiAgICAgICAgY29uc3QgYm9yZGVyT3B0cyA9IGJvcmRlci5zZXRDb250ZXh0KHRoaXMuZ2V0Q29udGV4dCgpKTtcbiAgICAgICAgY29uc3QgYXhpc1dpZHRoID0gYm9yZGVyT3B0cy5kaXNwbGF5ID8gYm9yZGVyT3B0cy53aWR0aCA6IDA7XG4gICAgICAgIGNvbnN0IGF4aXNIYWxmV2lkdGggPSBheGlzV2lkdGggLyAyO1xuICAgICAgICBjb25zdCBhbGlnbkJvcmRlclZhbHVlID0gZnVuY3Rpb24ocGl4ZWwpIHtcbiAgICAgICAgICAgIHJldHVybiBfYWxpZ25QaXhlbChjaGFydCwgcGl4ZWwsIGF4aXNXaWR0aCk7XG4gICAgICAgIH07XG4gICAgICAgIGxldCBib3JkZXJWYWx1ZSwgaSwgbGluZVZhbHVlLCBhbGlnbmVkTGluZVZhbHVlO1xuICAgICAgICBsZXQgdHgxLCB0eTEsIHR4MiwgdHkyLCB4MSwgeTEsIHgyLCB5MjtcbiAgICAgICAgaWYgKHBvc2l0aW9uID09PSAndG9wJykge1xuICAgICAgICAgICAgYm9yZGVyVmFsdWUgPSBhbGlnbkJvcmRlclZhbHVlKHRoaXMuYm90dG9tKTtcbiAgICAgICAgICAgIHR5MSA9IHRoaXMuYm90dG9tIC0gdGw7XG4gICAgICAgICAgICB0eTIgPSBib3JkZXJWYWx1ZSAtIGF4aXNIYWxmV2lkdGg7XG4gICAgICAgICAgICB5MSA9IGFsaWduQm9yZGVyVmFsdWUoY2hhcnRBcmVhLnRvcCkgKyBheGlzSGFsZldpZHRoO1xuICAgICAgICAgICAgeTIgPSBjaGFydEFyZWEuYm90dG9tO1xuICAgICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uID09PSAnYm90dG9tJykge1xuICAgICAgICAgICAgYm9yZGVyVmFsdWUgPSBhbGlnbkJvcmRlclZhbHVlKHRoaXMudG9wKTtcbiAgICAgICAgICAgIHkxID0gY2hhcnRBcmVhLnRvcDtcbiAgICAgICAgICAgIHkyID0gYWxpZ25Cb3JkZXJWYWx1ZShjaGFydEFyZWEuYm90dG9tKSAtIGF4aXNIYWxmV2lkdGg7XG4gICAgICAgICAgICB0eTEgPSBib3JkZXJWYWx1ZSArIGF4aXNIYWxmV2lkdGg7XG4gICAgICAgICAgICB0eTIgPSB0aGlzLnRvcCArIHRsO1xuICAgICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uID09PSAnbGVmdCcpIHtcbiAgICAgICAgICAgIGJvcmRlclZhbHVlID0gYWxpZ25Cb3JkZXJWYWx1ZSh0aGlzLnJpZ2h0KTtcbiAgICAgICAgICAgIHR4MSA9IHRoaXMucmlnaHQgLSB0bDtcbiAgICAgICAgICAgIHR4MiA9IGJvcmRlclZhbHVlIC0gYXhpc0hhbGZXaWR0aDtcbiAgICAgICAgICAgIHgxID0gYWxpZ25Cb3JkZXJWYWx1ZShjaGFydEFyZWEubGVmdCkgKyBheGlzSGFsZldpZHRoO1xuICAgICAgICAgICAgeDIgPSBjaGFydEFyZWEucmlnaHQ7XG4gICAgICAgIH0gZWxzZSBpZiAocG9zaXRpb24gPT09ICdyaWdodCcpIHtcbiAgICAgICAgICAgIGJvcmRlclZhbHVlID0gYWxpZ25Cb3JkZXJWYWx1ZSh0aGlzLmxlZnQpO1xuICAgICAgICAgICAgeDEgPSBjaGFydEFyZWEubGVmdDtcbiAgICAgICAgICAgIHgyID0gYWxpZ25Cb3JkZXJWYWx1ZShjaGFydEFyZWEucmlnaHQpIC0gYXhpc0hhbGZXaWR0aDtcbiAgICAgICAgICAgIHR4MSA9IGJvcmRlclZhbHVlICsgYXhpc0hhbGZXaWR0aDtcbiAgICAgICAgICAgIHR4MiA9IHRoaXMubGVmdCArIHRsO1xuICAgICAgICB9IGVsc2UgaWYgKGF4aXMgPT09ICd4Jykge1xuICAgICAgICAgICAgaWYgKHBvc2l0aW9uID09PSAnY2VudGVyJykge1xuICAgICAgICAgICAgICAgIGJvcmRlclZhbHVlID0gYWxpZ25Cb3JkZXJWYWx1ZSgoY2hhcnRBcmVhLnRvcCArIGNoYXJ0QXJlYS5ib3R0b20pIC8gMiArIDAuNSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KHBvc2l0aW9uKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uQXhpc0lEID0gT2JqZWN0LmtleXMocG9zaXRpb24pWzBdO1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcG9zaXRpb25bcG9zaXRpb25BeGlzSURdO1xuICAgICAgICAgICAgICAgIGJvcmRlclZhbHVlID0gYWxpZ25Cb3JkZXJWYWx1ZSh0aGlzLmNoYXJ0LnNjYWxlc1twb3NpdGlvbkF4aXNJRF0uZ2V0UGl4ZWxGb3JWYWx1ZSh2YWx1ZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgeTEgPSBjaGFydEFyZWEudG9wO1xuICAgICAgICAgICAgeTIgPSBjaGFydEFyZWEuYm90dG9tO1xuICAgICAgICAgICAgdHkxID0gYm9yZGVyVmFsdWUgKyBheGlzSGFsZldpZHRoO1xuICAgICAgICAgICAgdHkyID0gdHkxICsgdGw7XG4gICAgICAgIH0gZWxzZSBpZiAoYXhpcyA9PT0gJ3knKSB7XG4gICAgICAgICAgICBpZiAocG9zaXRpb24gPT09ICdjZW50ZXInKSB7XG4gICAgICAgICAgICAgICAgYm9yZGVyVmFsdWUgPSBhbGlnbkJvcmRlclZhbHVlKChjaGFydEFyZWEubGVmdCArIGNoYXJ0QXJlYS5yaWdodCkgLyAyKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNPYmplY3QocG9zaXRpb24pKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcG9zaXRpb25BeGlzSUQgPSBPYmplY3Qua2V5cyhwb3NpdGlvbilbMF07XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBwb3NpdGlvbltwb3NpdGlvbkF4aXNJRF07XG4gICAgICAgICAgICAgICAgYm9yZGVyVmFsdWUgPSBhbGlnbkJvcmRlclZhbHVlKHRoaXMuY2hhcnQuc2NhbGVzW3Bvc2l0aW9uQXhpc0lEXS5nZXRQaXhlbEZvclZhbHVlKHZhbHVlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0eDEgPSBib3JkZXJWYWx1ZSAtIGF4aXNIYWxmV2lkdGg7XG4gICAgICAgICAgICB0eDIgPSB0eDEgLSB0bDtcbiAgICAgICAgICAgIHgxID0gY2hhcnRBcmVhLmxlZnQ7XG4gICAgICAgICAgICB4MiA9IGNoYXJ0QXJlYS5yaWdodDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBsaW1pdCA9IHZhbHVlT3JEZWZhdWx0KG9wdGlvbnMudGlja3MubWF4VGlja3NMaW1pdCwgdGlja3NMZW5ndGgpO1xuICAgICAgICBjb25zdCBzdGVwID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKHRpY2tzTGVuZ3RoIC8gbGltaXQpKTtcbiAgICAgICAgZm9yKGkgPSAwOyBpIDwgdGlja3NMZW5ndGg7IGkgKz0gc3RlcCl7XG4gICAgICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5nZXRDb250ZXh0KGkpO1xuICAgICAgICAgICAgY29uc3Qgb3B0c0F0SW5kZXggPSBncmlkLnNldENvbnRleHQoY29udGV4dCk7XG4gICAgICAgICAgICBjb25zdCBvcHRzQXRJbmRleEJvcmRlciA9IGJvcmRlci5zZXRDb250ZXh0KGNvbnRleHQpO1xuICAgICAgICAgICAgY29uc3QgbGluZVdpZHRoID0gb3B0c0F0SW5kZXgubGluZVdpZHRoO1xuICAgICAgICAgICAgY29uc3QgbGluZUNvbG9yID0gb3B0c0F0SW5kZXguY29sb3I7XG4gICAgICAgICAgICBjb25zdCBib3JkZXJEYXNoID0gb3B0c0F0SW5kZXhCb3JkZXIuZGFzaCB8fCBbXTtcbiAgICAgICAgICAgIGNvbnN0IGJvcmRlckRhc2hPZmZzZXQgPSBvcHRzQXRJbmRleEJvcmRlci5kYXNoT2Zmc2V0O1xuICAgICAgICAgICAgY29uc3QgdGlja1dpZHRoID0gb3B0c0F0SW5kZXgudGlja1dpZHRoO1xuICAgICAgICAgICAgY29uc3QgdGlja0NvbG9yID0gb3B0c0F0SW5kZXgudGlja0NvbG9yO1xuICAgICAgICAgICAgY29uc3QgdGlja0JvcmRlckRhc2ggPSBvcHRzQXRJbmRleC50aWNrQm9yZGVyRGFzaCB8fCBbXTtcbiAgICAgICAgICAgIGNvbnN0IHRpY2tCb3JkZXJEYXNoT2Zmc2V0ID0gb3B0c0F0SW5kZXgudGlja0JvcmRlckRhc2hPZmZzZXQ7XG4gICAgICAgICAgICBsaW5lVmFsdWUgPSBnZXRQaXhlbEZvckdyaWRMaW5lKHRoaXMsIGksIG9mZnNldCk7XG4gICAgICAgICAgICBpZiAobGluZVZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFsaWduZWRMaW5lVmFsdWUgPSBfYWxpZ25QaXhlbChjaGFydCwgbGluZVZhbHVlLCBsaW5lV2lkdGgpO1xuICAgICAgICAgICAgaWYgKGlzSG9yaXpvbnRhbCkge1xuICAgICAgICAgICAgICAgIHR4MSA9IHR4MiA9IHgxID0geDIgPSBhbGlnbmVkTGluZVZhbHVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0eTEgPSB0eTIgPSB5MSA9IHkyID0gYWxpZ25lZExpbmVWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGl0ZW1zLnB1c2goe1xuICAgICAgICAgICAgICAgIHR4MSxcbiAgICAgICAgICAgICAgICB0eTEsXG4gICAgICAgICAgICAgICAgdHgyLFxuICAgICAgICAgICAgICAgIHR5MixcbiAgICAgICAgICAgICAgICB4MSxcbiAgICAgICAgICAgICAgICB5MSxcbiAgICAgICAgICAgICAgICB4MixcbiAgICAgICAgICAgICAgICB5MixcbiAgICAgICAgICAgICAgICB3aWR0aDogbGluZVdpZHRoLFxuICAgICAgICAgICAgICAgIGNvbG9yOiBsaW5lQ29sb3IsXG4gICAgICAgICAgICAgICAgYm9yZGVyRGFzaCxcbiAgICAgICAgICAgICAgICBib3JkZXJEYXNoT2Zmc2V0LFxuICAgICAgICAgICAgICAgIHRpY2tXaWR0aCxcbiAgICAgICAgICAgICAgICB0aWNrQ29sb3IsXG4gICAgICAgICAgICAgICAgdGlja0JvcmRlckRhc2gsXG4gICAgICAgICAgICAgICAgdGlja0JvcmRlckRhc2hPZmZzZXRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3RpY2tzTGVuZ3RoID0gdGlja3NMZW5ndGg7XG4gICAgICAgIHRoaXMuX2JvcmRlclZhbHVlID0gYm9yZGVyVmFsdWU7XG4gICAgICAgIHJldHVybiBpdGVtcztcbiAgICB9XG4gX2NvbXB1dGVMYWJlbEl0ZW1zKGNoYXJ0QXJlYSkge1xuICAgICAgICBjb25zdCBheGlzID0gdGhpcy5heGlzO1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgICAgICBjb25zdCB7IHBvc2l0aW9uICwgdGlja3M6IG9wdGlvblRpY2tzICB9ID0gb3B0aW9ucztcbiAgICAgICAgY29uc3QgaXNIb3Jpem9udGFsID0gdGhpcy5pc0hvcml6b250YWwoKTtcbiAgICAgICAgY29uc3QgdGlja3MgPSB0aGlzLnRpY2tzO1xuICAgICAgICBjb25zdCB7IGFsaWduICwgY3Jvc3NBbGlnbiAsIHBhZGRpbmcgLCBtaXJyb3IgIH0gPSBvcHRpb25UaWNrcztcbiAgICAgICAgY29uc3QgdGwgPSBnZXRUaWNrTWFya0xlbmd0aChvcHRpb25zLmdyaWQpO1xuICAgICAgICBjb25zdCB0aWNrQW5kUGFkZGluZyA9IHRsICsgcGFkZGluZztcbiAgICAgICAgY29uc3QgaFRpY2tBbmRQYWRkaW5nID0gbWlycm9yID8gLXBhZGRpbmcgOiB0aWNrQW5kUGFkZGluZztcbiAgICAgICAgY29uc3Qgcm90YXRpb24gPSAtdG9SYWRpYW5zKHRoaXMubGFiZWxSb3RhdGlvbik7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gW107XG4gICAgICAgIGxldCBpLCBpbGVuLCB0aWNrLCBsYWJlbCwgeCwgeSwgdGV4dEFsaWduLCBwaXhlbCwgZm9udCwgbGluZUhlaWdodCwgbGluZUNvdW50LCB0ZXh0T2Zmc2V0O1xuICAgICAgICBsZXQgdGV4dEJhc2VsaW5lID0gJ21pZGRsZSc7XG4gICAgICAgIGlmIChwb3NpdGlvbiA9PT0gJ3RvcCcpIHtcbiAgICAgICAgICAgIHkgPSB0aGlzLmJvdHRvbSAtIGhUaWNrQW5kUGFkZGluZztcbiAgICAgICAgICAgIHRleHRBbGlnbiA9IHRoaXMuX2dldFhBeGlzTGFiZWxBbGlnbm1lbnQoKTtcbiAgICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbiA9PT0gJ2JvdHRvbScpIHtcbiAgICAgICAgICAgIHkgPSB0aGlzLnRvcCArIGhUaWNrQW5kUGFkZGluZztcbiAgICAgICAgICAgIHRleHRBbGlnbiA9IHRoaXMuX2dldFhBeGlzTGFiZWxBbGlnbm1lbnQoKTtcbiAgICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbiA9PT0gJ2xlZnQnKSB7XG4gICAgICAgICAgICBjb25zdCByZXQgPSB0aGlzLl9nZXRZQXhpc0xhYmVsQWxpZ25tZW50KHRsKTtcbiAgICAgICAgICAgIHRleHRBbGlnbiA9IHJldC50ZXh0QWxpZ247XG4gICAgICAgICAgICB4ID0gcmV0Lng7XG4gICAgICAgIH0gZWxzZSBpZiAocG9zaXRpb24gPT09ICdyaWdodCcpIHtcbiAgICAgICAgICAgIGNvbnN0IHJldCA9IHRoaXMuX2dldFlBeGlzTGFiZWxBbGlnbm1lbnQodGwpO1xuICAgICAgICAgICAgdGV4dEFsaWduID0gcmV0LnRleHRBbGlnbjtcbiAgICAgICAgICAgIHggPSByZXQueDtcbiAgICAgICAgfSBlbHNlIGlmIChheGlzID09PSAneCcpIHtcbiAgICAgICAgICAgIGlmIChwb3NpdGlvbiA9PT0gJ2NlbnRlcicpIHtcbiAgICAgICAgICAgICAgICB5ID0gKGNoYXJ0QXJlYS50b3AgKyBjaGFydEFyZWEuYm90dG9tKSAvIDIgKyB0aWNrQW5kUGFkZGluZztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNPYmplY3QocG9zaXRpb24pKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcG9zaXRpb25BeGlzSUQgPSBPYmplY3Qua2V5cyhwb3NpdGlvbilbMF07XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBwb3NpdGlvbltwb3NpdGlvbkF4aXNJRF07XG4gICAgICAgICAgICAgICAgeSA9IHRoaXMuY2hhcnQuc2NhbGVzW3Bvc2l0aW9uQXhpc0lEXS5nZXRQaXhlbEZvclZhbHVlKHZhbHVlKSArIHRpY2tBbmRQYWRkaW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGV4dEFsaWduID0gdGhpcy5fZ2V0WEF4aXNMYWJlbEFsaWdubWVudCgpO1xuICAgICAgICB9IGVsc2UgaWYgKGF4aXMgPT09ICd5Jykge1xuICAgICAgICAgICAgaWYgKHBvc2l0aW9uID09PSAnY2VudGVyJykge1xuICAgICAgICAgICAgICAgIHggPSAoY2hhcnRBcmVhLmxlZnQgKyBjaGFydEFyZWEucmlnaHQpIC8gMiAtIHRpY2tBbmRQYWRkaW5nO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpc09iamVjdChwb3NpdGlvbikpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwb3NpdGlvbkF4aXNJRCA9IE9iamVjdC5rZXlzKHBvc2l0aW9uKVswXTtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHBvc2l0aW9uW3Bvc2l0aW9uQXhpc0lEXTtcbiAgICAgICAgICAgICAgICB4ID0gdGhpcy5jaGFydC5zY2FsZXNbcG9zaXRpb25BeGlzSURdLmdldFBpeGVsRm9yVmFsdWUodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGV4dEFsaWduID0gdGhpcy5fZ2V0WUF4aXNMYWJlbEFsaWdubWVudCh0bCkudGV4dEFsaWduO1xuICAgICAgICB9XG4gICAgICAgIGlmIChheGlzID09PSAneScpIHtcbiAgICAgICAgICAgIGlmIChhbGlnbiA9PT0gJ3N0YXJ0Jykge1xuICAgICAgICAgICAgICAgIHRleHRCYXNlbGluZSA9ICd0b3AnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChhbGlnbiA9PT0gJ2VuZCcpIHtcbiAgICAgICAgICAgICAgICB0ZXh0QmFzZWxpbmUgPSAnYm90dG9tJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBsYWJlbFNpemVzID0gdGhpcy5fZ2V0TGFiZWxTaXplcygpO1xuICAgICAgICBmb3IoaSA9IDAsIGlsZW4gPSB0aWNrcy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpe1xuICAgICAgICAgICAgdGljayA9IHRpY2tzW2ldO1xuICAgICAgICAgICAgbGFiZWwgPSB0aWNrLmxhYmVsO1xuICAgICAgICAgICAgY29uc3Qgb3B0c0F0SW5kZXggPSBvcHRpb25UaWNrcy5zZXRDb250ZXh0KHRoaXMuZ2V0Q29udGV4dChpKSk7XG4gICAgICAgICAgICBwaXhlbCA9IHRoaXMuZ2V0UGl4ZWxGb3JUaWNrKGkpICsgb3B0aW9uVGlja3MubGFiZWxPZmZzZXQ7XG4gICAgICAgICAgICBmb250ID0gdGhpcy5fcmVzb2x2ZVRpY2tGb250T3B0aW9ucyhpKTtcbiAgICAgICAgICAgIGxpbmVIZWlnaHQgPSBmb250LmxpbmVIZWlnaHQ7XG4gICAgICAgICAgICBsaW5lQ291bnQgPSBpc0FycmF5KGxhYmVsKSA/IGxhYmVsLmxlbmd0aCA6IDE7XG4gICAgICAgICAgICBjb25zdCBoYWxmQ291bnQgPSBsaW5lQ291bnQgLyAyO1xuICAgICAgICAgICAgY29uc3QgY29sb3IgPSBvcHRzQXRJbmRleC5jb2xvcjtcbiAgICAgICAgICAgIGNvbnN0IHN0cm9rZUNvbG9yID0gb3B0c0F0SW5kZXgudGV4dFN0cm9rZUNvbG9yO1xuICAgICAgICAgICAgY29uc3Qgc3Ryb2tlV2lkdGggPSBvcHRzQXRJbmRleC50ZXh0U3Ryb2tlV2lkdGg7XG4gICAgICAgICAgICBsZXQgdGlja1RleHRBbGlnbiA9IHRleHRBbGlnbjtcbiAgICAgICAgICAgIGlmIChpc0hvcml6b250YWwpIHtcbiAgICAgICAgICAgICAgICB4ID0gcGl4ZWw7XG4gICAgICAgICAgICAgICAgaWYgKHRleHRBbGlnbiA9PT0gJ2lubmVyJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gaWxlbiAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpY2tUZXh0QWxpZ24gPSAhdGhpcy5vcHRpb25zLnJldmVyc2UgPyAncmlnaHQnIDogJ2xlZnQnO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGkgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpY2tUZXh0QWxpZ24gPSAhdGhpcy5vcHRpb25zLnJldmVyc2UgPyAnbGVmdCcgOiAncmlnaHQnO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGlja1RleHRBbGlnbiA9ICdjZW50ZXInO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbiA9PT0gJ3RvcCcpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNyb3NzQWxpZ24gPT09ICduZWFyJyB8fCByb3RhdGlvbiAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dE9mZnNldCA9IC1saW5lQ291bnQgKiBsaW5lSGVpZ2h0ICsgbGluZUhlaWdodCAvIDI7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3Jvc3NBbGlnbiA9PT0gJ2NlbnRlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRPZmZzZXQgPSAtbGFiZWxTaXplcy5oaWdoZXN0LmhlaWdodCAvIDIgLSBoYWxmQ291bnQgKiBsaW5lSGVpZ2h0ICsgbGluZUhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRPZmZzZXQgPSAtbGFiZWxTaXplcy5oaWdoZXN0LmhlaWdodCArIGxpbmVIZWlnaHQgLyAyO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNyb3NzQWxpZ24gPT09ICduZWFyJyB8fCByb3RhdGlvbiAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dE9mZnNldCA9IGxpbmVIZWlnaHQgLyAyO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNyb3NzQWxpZ24gPT09ICdjZW50ZXInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0T2Zmc2V0ID0gbGFiZWxTaXplcy5oaWdoZXN0LmhlaWdodCAvIDIgLSBoYWxmQ291bnQgKiBsaW5lSGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dE9mZnNldCA9IGxhYmVsU2l6ZXMuaGlnaGVzdC5oZWlnaHQgLSBsaW5lQ291bnQgKiBsaW5lSGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChtaXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dE9mZnNldCAqPSAtMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJvdGF0aW9uICE9PSAwICYmICFvcHRzQXRJbmRleC5zaG93TGFiZWxCYWNrZHJvcCkge1xuICAgICAgICAgICAgICAgICAgICB4ICs9IGxpbmVIZWlnaHQgLyAyICogTWF0aC5zaW4ocm90YXRpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgeSA9IHBpeGVsO1xuICAgICAgICAgICAgICAgIHRleHRPZmZzZXQgPSAoMSAtIGxpbmVDb3VudCkgKiBsaW5lSGVpZ2h0IC8gMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBiYWNrZHJvcDtcbiAgICAgICAgICAgIGlmIChvcHRzQXRJbmRleC5zaG93TGFiZWxCYWNrZHJvcCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhYmVsUGFkZGluZyA9IHRvUGFkZGluZyhvcHRzQXRJbmRleC5iYWNrZHJvcFBhZGRpbmcpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGhlaWdodCA9IGxhYmVsU2l6ZXMuaGVpZ2h0c1tpXTtcbiAgICAgICAgICAgICAgICBjb25zdCB3aWR0aCA9IGxhYmVsU2l6ZXMud2lkdGhzW2ldO1xuICAgICAgICAgICAgICAgIGxldCB0b3AgPSB0ZXh0T2Zmc2V0IC0gbGFiZWxQYWRkaW5nLnRvcDtcbiAgICAgICAgICAgICAgICBsZXQgbGVmdCA9IDAgLSBsYWJlbFBhZGRpbmcubGVmdDtcbiAgICAgICAgICAgICAgICBzd2l0Y2godGV4dEJhc2VsaW5lKXtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnbWlkZGxlJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvcCAtPSBoZWlnaHQgLyAyO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgICAgICAgICAgICAgICAgICB0b3AgLT0gaGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN3aXRjaCh0ZXh0QWxpZ24pe1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdjZW50ZXInOlxuICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCAtPSB3aWR0aCAvIDI7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCAtPSB3aWR0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBiYWNrZHJvcCA9IHtcbiAgICAgICAgICAgICAgICAgICAgbGVmdCxcbiAgICAgICAgICAgICAgICAgICAgdG9wLFxuICAgICAgICAgICAgICAgICAgICB3aWR0aDogd2lkdGggKyBsYWJlbFBhZGRpbmcud2lkdGgsXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogaGVpZ2h0ICsgbGFiZWxQYWRkaW5nLmhlaWdodCxcbiAgICAgICAgICAgICAgICAgICAgY29sb3I6IG9wdHNBdEluZGV4LmJhY2tkcm9wQ29sb3JcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXRlbXMucHVzaCh7XG4gICAgICAgICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgICAgICAgZm9udCxcbiAgICAgICAgICAgICAgICB0ZXh0T2Zmc2V0LFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICAgICAgcm90YXRpb24sXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yLFxuICAgICAgICAgICAgICAgICAgICBzdHJva2VDb2xvcixcbiAgICAgICAgICAgICAgICAgICAgc3Ryb2tlV2lkdGgsXG4gICAgICAgICAgICAgICAgICAgIHRleHRBbGlnbjogdGlja1RleHRBbGlnbixcbiAgICAgICAgICAgICAgICAgICAgdGV4dEJhc2VsaW5lLFxuICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGlvbjogW1xuICAgICAgICAgICAgICAgICAgICAgICAgeCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHlcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgYmFja2Ryb3BcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlbXM7XG4gICAgfVxuICAgIF9nZXRYQXhpc0xhYmVsQWxpZ25tZW50KCkge1xuICAgICAgICBjb25zdCB7IHBvc2l0aW9uICwgdGlja3MgIH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIGNvbnN0IHJvdGF0aW9uID0gLXRvUmFkaWFucyh0aGlzLmxhYmVsUm90YXRpb24pO1xuICAgICAgICBpZiAocm90YXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBwb3NpdGlvbiA9PT0gJ3RvcCcgPyAnbGVmdCcgOiAncmlnaHQnO1xuICAgICAgICB9XG4gICAgICAgIGxldCBhbGlnbiA9ICdjZW50ZXInO1xuICAgICAgICBpZiAodGlja3MuYWxpZ24gPT09ICdzdGFydCcpIHtcbiAgICAgICAgICAgIGFsaWduID0gJ2xlZnQnO1xuICAgICAgICB9IGVsc2UgaWYgKHRpY2tzLmFsaWduID09PSAnZW5kJykge1xuICAgICAgICAgICAgYWxpZ24gPSAncmlnaHQnO1xuICAgICAgICB9IGVsc2UgaWYgKHRpY2tzLmFsaWduID09PSAnaW5uZXInKSB7XG4gICAgICAgICAgICBhbGlnbiA9ICdpbm5lcic7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFsaWduO1xuICAgIH1cbiAgICBfZ2V0WUF4aXNMYWJlbEFsaWdubWVudCh0bCkge1xuICAgICAgICBjb25zdCB7IHBvc2l0aW9uICwgdGlja3M6IHsgY3Jvc3NBbGlnbiAsIG1pcnJvciAsIHBhZGRpbmcgIH0gIH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIGNvbnN0IGxhYmVsU2l6ZXMgPSB0aGlzLl9nZXRMYWJlbFNpemVzKCk7XG4gICAgICAgIGNvbnN0IHRpY2tBbmRQYWRkaW5nID0gdGwgKyBwYWRkaW5nO1xuICAgICAgICBjb25zdCB3aWRlc3QgPSBsYWJlbFNpemVzLndpZGVzdC53aWR0aDtcbiAgICAgICAgbGV0IHRleHRBbGlnbjtcbiAgICAgICAgbGV0IHg7XG4gICAgICAgIGlmIChwb3NpdGlvbiA9PT0gJ2xlZnQnKSB7XG4gICAgICAgICAgICBpZiAobWlycm9yKSB7XG4gICAgICAgICAgICAgICAgeCA9IHRoaXMucmlnaHQgKyBwYWRkaW5nO1xuICAgICAgICAgICAgICAgIGlmIChjcm9zc0FsaWduID09PSAnbmVhcicpIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dEFsaWduID0gJ2xlZnQnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3Jvc3NBbGlnbiA9PT0gJ2NlbnRlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dEFsaWduID0gJ2NlbnRlcic7XG4gICAgICAgICAgICAgICAgICAgIHggKz0gd2lkZXN0IC8gMjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0QWxpZ24gPSAncmlnaHQnO1xuICAgICAgICAgICAgICAgICAgICB4ICs9IHdpZGVzdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHggPSB0aGlzLnJpZ2h0IC0gdGlja0FuZFBhZGRpbmc7XG4gICAgICAgICAgICAgICAgaWYgKGNyb3NzQWxpZ24gPT09ICduZWFyJykge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0QWxpZ24gPSAncmlnaHQnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3Jvc3NBbGlnbiA9PT0gJ2NlbnRlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dEFsaWduID0gJ2NlbnRlcic7XG4gICAgICAgICAgICAgICAgICAgIHggLT0gd2lkZXN0IC8gMjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0QWxpZ24gPSAnbGVmdCc7XG4gICAgICAgICAgICAgICAgICAgIHggPSB0aGlzLmxlZnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uID09PSAncmlnaHQnKSB7XG4gICAgICAgICAgICBpZiAobWlycm9yKSB7XG4gICAgICAgICAgICAgICAgeCA9IHRoaXMubGVmdCArIHBhZGRpbmc7XG4gICAgICAgICAgICAgICAgaWYgKGNyb3NzQWxpZ24gPT09ICduZWFyJykge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0QWxpZ24gPSAncmlnaHQnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3Jvc3NBbGlnbiA9PT0gJ2NlbnRlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dEFsaWduID0gJ2NlbnRlcic7XG4gICAgICAgICAgICAgICAgICAgIHggLT0gd2lkZXN0IC8gMjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0QWxpZ24gPSAnbGVmdCc7XG4gICAgICAgICAgICAgICAgICAgIHggLT0gd2lkZXN0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgeCA9IHRoaXMubGVmdCArIHRpY2tBbmRQYWRkaW5nO1xuICAgICAgICAgICAgICAgIGlmIChjcm9zc0FsaWduID09PSAnbmVhcicpIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dEFsaWduID0gJ2xlZnQnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3Jvc3NBbGlnbiA9PT0gJ2NlbnRlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dEFsaWduID0gJ2NlbnRlcic7XG4gICAgICAgICAgICAgICAgICAgIHggKz0gd2lkZXN0IC8gMjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0QWxpZ24gPSAncmlnaHQnO1xuICAgICAgICAgICAgICAgICAgICB4ID0gdGhpcy5yaWdodDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0ZXh0QWxpZ24gPSAncmlnaHQnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0ZXh0QWxpZ24sXG4gICAgICAgICAgICB4XG4gICAgICAgIH07XG4gICAgfVxuIF9jb21wdXRlTGFiZWxBcmVhKCkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnRpY2tzLm1pcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNoYXJ0ID0gdGhpcy5jaGFydDtcbiAgICAgICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLm9wdGlvbnMucG9zaXRpb247XG4gICAgICAgIGlmIChwb3NpdGlvbiA9PT0gJ2xlZnQnIHx8IHBvc2l0aW9uID09PSAncmlnaHQnKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHRvcDogMCxcbiAgICAgICAgICAgICAgICBsZWZ0OiB0aGlzLmxlZnQsXG4gICAgICAgICAgICAgICAgYm90dG9tOiBjaGFydC5oZWlnaHQsXG4gICAgICAgICAgICAgICAgcmlnaHQ6IHRoaXMucmlnaHRcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBvc2l0aW9uID09PSAndG9wJyB8fCBwb3NpdGlvbiA9PT0gJ2JvdHRvbScpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdG9wOiB0aGlzLnRvcCxcbiAgICAgICAgICAgICAgICBsZWZ0OiAwLFxuICAgICAgICAgICAgICAgIGJvdHRvbTogdGhpcy5ib3R0b20sXG4gICAgICAgICAgICAgICAgcmlnaHQ6IGNoYXJ0LndpZHRoXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuIGRyYXdCYWNrZ3JvdW5kKCkge1xuICAgICAgICBjb25zdCB7IGN0eCAsIG9wdGlvbnM6IHsgYmFja2dyb3VuZENvbG9yICB9ICwgbGVmdCAsIHRvcCAsIHdpZHRoICwgaGVpZ2h0ICB9ID0gdGhpcztcbiAgICAgICAgaWYgKGJhY2tncm91bmRDb2xvcikge1xuICAgICAgICAgICAgY3R4LnNhdmUoKTtcbiAgICAgICAgICAgIGN0eC5maWxsU3R5bGUgPSBiYWNrZ3JvdW5kQ29sb3I7XG4gICAgICAgICAgICBjdHguZmlsbFJlY3QobGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgICAgIGN0eC5yZXN0b3JlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0TGluZVdpZHRoRm9yVmFsdWUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgZ3JpZCA9IHRoaXMub3B0aW9ucy5ncmlkO1xuICAgICAgICBpZiAoIXRoaXMuX2lzVmlzaWJsZSgpIHx8ICFncmlkLmRpc3BsYXkpIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRpY2tzID0gdGhpcy50aWNrcztcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aWNrcy5maW5kSW5kZXgoKHQpPT50LnZhbHVlID09PSB2YWx1ZSk7XG4gICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBvcHRzID0gZ3JpZC5zZXRDb250ZXh0KHRoaXMuZ2V0Q29udGV4dChpbmRleCkpO1xuICAgICAgICAgICAgcmV0dXJuIG9wdHMubGluZVdpZHRoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiBkcmF3R3JpZChjaGFydEFyZWEpIHtcbiAgICAgICAgY29uc3QgZ3JpZCA9IHRoaXMub3B0aW9ucy5ncmlkO1xuICAgICAgICBjb25zdCBjdHggPSB0aGlzLmN0eDtcbiAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLl9ncmlkTGluZUl0ZW1zIHx8ICh0aGlzLl9ncmlkTGluZUl0ZW1zID0gdGhpcy5fY29tcHV0ZUdyaWRMaW5lSXRlbXMoY2hhcnRBcmVhKSk7XG4gICAgICAgIGxldCBpLCBpbGVuO1xuICAgICAgICBjb25zdCBkcmF3TGluZSA9IChwMSwgcDIsIHN0eWxlKT0+e1xuICAgICAgICAgICAgaWYgKCFzdHlsZS53aWR0aCB8fCAhc3R5bGUuY29sb3IpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjdHguc2F2ZSgpO1xuICAgICAgICAgICAgY3R4LmxpbmVXaWR0aCA9IHN0eWxlLndpZHRoO1xuICAgICAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gc3R5bGUuY29sb3I7XG4gICAgICAgICAgICBjdHguc2V0TGluZURhc2goc3R5bGUuYm9yZGVyRGFzaCB8fCBbXSk7XG4gICAgICAgICAgICBjdHgubGluZURhc2hPZmZzZXQgPSBzdHlsZS5ib3JkZXJEYXNoT2Zmc2V0O1xuICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgICAgICAgY3R4Lm1vdmVUbyhwMS54LCBwMS55KTtcbiAgICAgICAgICAgIGN0eC5saW5lVG8ocDIueCwgcDIueSk7XG4gICAgICAgICAgICBjdHguc3Ryb2tlKCk7XG4gICAgICAgICAgICBjdHgucmVzdG9yZSgpO1xuICAgICAgICB9O1xuICAgICAgICBpZiAoZ3JpZC5kaXNwbGF5KSB7XG4gICAgICAgICAgICBmb3IoaSA9IDAsIGlsZW4gPSBpdGVtcy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpe1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBpdGVtc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoZ3JpZC5kcmF3T25DaGFydEFyZWEpIHtcbiAgICAgICAgICAgICAgICAgICAgZHJhd0xpbmUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgeDogaXRlbS54MSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHk6IGl0ZW0ueTFcbiAgICAgICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgeDogaXRlbS54MixcbiAgICAgICAgICAgICAgICAgICAgICAgIHk6IGl0ZW0ueTJcbiAgICAgICAgICAgICAgICAgICAgfSwgaXRlbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChncmlkLmRyYXdUaWNrcykge1xuICAgICAgICAgICAgICAgICAgICBkcmF3TGluZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICB4OiBpdGVtLnR4MSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHk6IGl0ZW0udHkxXG4gICAgICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHg6IGl0ZW0udHgyLFxuICAgICAgICAgICAgICAgICAgICAgICAgeTogaXRlbS50eTJcbiAgICAgICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6IGl0ZW0udGlja0NvbG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGl0ZW0udGlja1dpZHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyRGFzaDogaXRlbS50aWNrQm9yZGVyRGFzaCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlckRhc2hPZmZzZXQ6IGl0ZW0udGlja0JvcmRlckRhc2hPZmZzZXRcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuIGRyYXdCb3JkZXIoKSB7XG4gICAgICAgIGNvbnN0IHsgY2hhcnQgLCBjdHggLCBvcHRpb25zOiB7IGJvcmRlciAsIGdyaWQgIH0gIH0gPSB0aGlzO1xuICAgICAgICBjb25zdCBib3JkZXJPcHRzID0gYm9yZGVyLnNldENvbnRleHQodGhpcy5nZXRDb250ZXh0KCkpO1xuICAgICAgICBjb25zdCBheGlzV2lkdGggPSBib3JkZXIuZGlzcGxheSA/IGJvcmRlck9wdHMud2lkdGggOiAwO1xuICAgICAgICBpZiAoIWF4aXNXaWR0aCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxhc3RMaW5lV2lkdGggPSBncmlkLnNldENvbnRleHQodGhpcy5nZXRDb250ZXh0KDApKS5saW5lV2lkdGg7XG4gICAgICAgIGNvbnN0IGJvcmRlclZhbHVlID0gdGhpcy5fYm9yZGVyVmFsdWU7XG4gICAgICAgIGxldCB4MSwgeDIsIHkxLCB5MjtcbiAgICAgICAgaWYgKHRoaXMuaXNIb3Jpem9udGFsKCkpIHtcbiAgICAgICAgICAgIHgxID0gX2FsaWduUGl4ZWwoY2hhcnQsIHRoaXMubGVmdCwgYXhpc1dpZHRoKSAtIGF4aXNXaWR0aCAvIDI7XG4gICAgICAgICAgICB4MiA9IF9hbGlnblBpeGVsKGNoYXJ0LCB0aGlzLnJpZ2h0LCBsYXN0TGluZVdpZHRoKSArIGxhc3RMaW5lV2lkdGggLyAyO1xuICAgICAgICAgICAgeTEgPSB5MiA9IGJvcmRlclZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgeTEgPSBfYWxpZ25QaXhlbChjaGFydCwgdGhpcy50b3AsIGF4aXNXaWR0aCkgLSBheGlzV2lkdGggLyAyO1xuICAgICAgICAgICAgeTIgPSBfYWxpZ25QaXhlbChjaGFydCwgdGhpcy5ib3R0b20sIGxhc3RMaW5lV2lkdGgpICsgbGFzdExpbmVXaWR0aCAvIDI7XG4gICAgICAgICAgICB4MSA9IHgyID0gYm9yZGVyVmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgY3R4LnNhdmUoKTtcbiAgICAgICAgY3R4LmxpbmVXaWR0aCA9IGJvcmRlck9wdHMud2lkdGg7XG4gICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IGJvcmRlck9wdHMuY29sb3I7XG4gICAgICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICAgICAgY3R4Lm1vdmVUbyh4MSwgeTEpO1xuICAgICAgICBjdHgubGluZVRvKHgyLCB5Mik7XG4gICAgICAgIGN0eC5zdHJva2UoKTtcbiAgICAgICAgY3R4LnJlc3RvcmUoKTtcbiAgICB9XG4gZHJhd0xhYmVscyhjaGFydEFyZWEpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9uVGlja3MgPSB0aGlzLm9wdGlvbnMudGlja3M7XG4gICAgICAgIGlmICghb3B0aW9uVGlja3MuZGlzcGxheSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuY3R4O1xuICAgICAgICBjb25zdCBhcmVhID0gdGhpcy5fY29tcHV0ZUxhYmVsQXJlYSgpO1xuICAgICAgICBpZiAoYXJlYSkge1xuICAgICAgICAgICAgY2xpcEFyZWEoY3R4LCBhcmVhKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0TGFiZWxJdGVtcyhjaGFydEFyZWEpO1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpe1xuICAgICAgICAgICAgY29uc3QgcmVuZGVyVGV4dE9wdGlvbnMgPSBpdGVtLm9wdGlvbnM7XG4gICAgICAgICAgICBjb25zdCB0aWNrRm9udCA9IGl0ZW0uZm9udDtcbiAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gaXRlbS5sYWJlbDtcbiAgICAgICAgICAgIGNvbnN0IHkgPSBpdGVtLnRleHRPZmZzZXQ7XG4gICAgICAgICAgICByZW5kZXJUZXh0KGN0eCwgbGFiZWwsIDAsIHksIHRpY2tGb250LCByZW5kZXJUZXh0T3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFyZWEpIHtcbiAgICAgICAgICAgIHVuY2xpcEFyZWEoY3R4KTtcbiAgICAgICAgfVxuICAgIH1cbiBkcmF3VGl0bGUoKSB7XG4gICAgICAgIGNvbnN0IHsgY3R4ICwgb3B0aW9uczogeyBwb3NpdGlvbiAsIHRpdGxlICwgcmV2ZXJzZSAgfSAgfSA9IHRoaXM7XG4gICAgICAgIGlmICghdGl0bGUuZGlzcGxheSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZvbnQgPSB0b0ZvbnQodGl0bGUuZm9udCk7XG4gICAgICAgIGNvbnN0IHBhZGRpbmcgPSB0b1BhZGRpbmcodGl0bGUucGFkZGluZyk7XG4gICAgICAgIGNvbnN0IGFsaWduID0gdGl0bGUuYWxpZ247XG4gICAgICAgIGxldCBvZmZzZXQgPSBmb250LmxpbmVIZWlnaHQgLyAyO1xuICAgICAgICBpZiAocG9zaXRpb24gPT09ICdib3R0b20nIHx8IHBvc2l0aW9uID09PSAnY2VudGVyJyB8fCBpc09iamVjdChwb3NpdGlvbikpIHtcbiAgICAgICAgICAgIG9mZnNldCArPSBwYWRkaW5nLmJvdHRvbTtcbiAgICAgICAgICAgIGlmIChpc0FycmF5KHRpdGxlLnRleHQpKSB7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGZvbnQubGluZUhlaWdodCAqICh0aXRsZS50ZXh0Lmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb2Zmc2V0ICs9IHBhZGRpbmcudG9wO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgdGl0bGVYICwgdGl0bGVZICwgbWF4V2lkdGggLCByb3RhdGlvbiAgfSA9IHRpdGxlQXJncyh0aGlzLCBvZmZzZXQsIHBvc2l0aW9uLCBhbGlnbik7XG4gICAgICAgIHJlbmRlclRleHQoY3R4LCB0aXRsZS50ZXh0LCAwLCAwLCBmb250LCB7XG4gICAgICAgICAgICBjb2xvcjogdGl0bGUuY29sb3IsXG4gICAgICAgICAgICBtYXhXaWR0aCxcbiAgICAgICAgICAgIHJvdGF0aW9uLFxuICAgICAgICAgICAgdGV4dEFsaWduOiB0aXRsZUFsaWduKGFsaWduLCBwb3NpdGlvbiwgcmV2ZXJzZSksXG4gICAgICAgICAgICB0ZXh0QmFzZWxpbmU6ICdtaWRkbGUnLFxuICAgICAgICAgICAgdHJhbnNsYXRpb246IFtcbiAgICAgICAgICAgICAgICB0aXRsZVgsXG4gICAgICAgICAgICAgICAgdGl0bGVZXG4gICAgICAgICAgICBdXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBkcmF3KGNoYXJ0QXJlYSkge1xuICAgICAgICBpZiAoIXRoaXMuX2lzVmlzaWJsZSgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kcmF3QmFja2dyb3VuZCgpO1xuICAgICAgICB0aGlzLmRyYXdHcmlkKGNoYXJ0QXJlYSk7XG4gICAgICAgIHRoaXMuZHJhd0JvcmRlcigpO1xuICAgICAgICB0aGlzLmRyYXdUaXRsZSgpO1xuICAgICAgICB0aGlzLmRyYXdMYWJlbHMoY2hhcnRBcmVhKTtcbiAgICB9XG4gX2xheWVycygpIHtcbiAgICAgICAgY29uc3Qgb3B0cyA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgY29uc3QgdHogPSBvcHRzLnRpY2tzICYmIG9wdHMudGlja3MueiB8fCAwO1xuICAgICAgICBjb25zdCBneiA9IHZhbHVlT3JEZWZhdWx0KG9wdHMuZ3JpZCAmJiBvcHRzLmdyaWQueiwgLTEpO1xuICAgICAgICBjb25zdCBieiA9IHZhbHVlT3JEZWZhdWx0KG9wdHMuYm9yZGVyICYmIG9wdHMuYm9yZGVyLnosIDApO1xuICAgICAgICBpZiAoIXRoaXMuX2lzVmlzaWJsZSgpIHx8IHRoaXMuZHJhdyAhPT0gU2NhbGUucHJvdG90eXBlLmRyYXcpIHtcbiAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB6OiB0eixcbiAgICAgICAgICAgICAgICAgICAgZHJhdzogKGNoYXJ0QXJlYSk9PntcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZHJhdyhjaGFydEFyZWEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHo6IGd6LFxuICAgICAgICAgICAgICAgIGRyYXc6IChjaGFydEFyZWEpPT57XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZHJhd0JhY2tncm91bmQoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmF3R3JpZChjaGFydEFyZWEpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyYXdUaXRsZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgejogYnosXG4gICAgICAgICAgICAgICAgZHJhdzogKCk9PntcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmF3Qm9yZGVyKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB6OiB0eixcbiAgICAgICAgICAgICAgICBkcmF3OiAoY2hhcnRBcmVhKT0+e1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyYXdMYWJlbHMoY2hhcnRBcmVhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIF07XG4gICAgfVxuIGdldE1hdGNoaW5nVmlzaWJsZU1ldGFzKHR5cGUpIHtcbiAgICAgICAgY29uc3QgbWV0YXMgPSB0aGlzLmNoYXJ0LmdldFNvcnRlZFZpc2libGVEYXRhc2V0TWV0YXMoKTtcbiAgICAgICAgY29uc3QgYXhpc0lEID0gdGhpcy5heGlzICsgJ0F4aXNJRCc7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgICAgICBsZXQgaSwgaWxlbjtcbiAgICAgICAgZm9yKGkgPSAwLCBpbGVuID0gbWV0YXMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKXtcbiAgICAgICAgICAgIGNvbnN0IG1ldGEgPSBtZXRhc1tpXTtcbiAgICAgICAgICAgIGlmIChtZXRhW2F4aXNJRF0gPT09IHRoaXMuaWQgJiYgKCF0eXBlIHx8IG1ldGEudHlwZSA9PT0gdHlwZSkpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChtZXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiBfcmVzb2x2ZVRpY2tGb250T3B0aW9ucyhpbmRleCkge1xuICAgICAgICBjb25zdCBvcHRzID0gdGhpcy5vcHRpb25zLnRpY2tzLnNldENvbnRleHQodGhpcy5nZXRDb250ZXh0KGluZGV4KSk7XG4gICAgICAgIHJldHVybiB0b0ZvbnQob3B0cy5mb250KTtcbiAgICB9XG4gX21heERpZ2l0cygpIHtcbiAgICAgICAgY29uc3QgZm9udFNpemUgPSB0aGlzLl9yZXNvbHZlVGlja0ZvbnRPcHRpb25zKDApLmxpbmVIZWlnaHQ7XG4gICAgICAgIHJldHVybiAodGhpcy5pc0hvcml6b250YWwoKSA/IHRoaXMud2lkdGggOiB0aGlzLmhlaWdodCkgLyBmb250U2l6ZTtcbiAgICB9XG59XG5cbmNsYXNzIFR5cGVkUmVnaXN0cnkge1xuICAgIGNvbnN0cnVjdG9yKHR5cGUsIHNjb3BlLCBvdmVycmlkZSl7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMuc2NvcGUgPSBzY29wZTtcbiAgICAgICAgdGhpcy5vdmVycmlkZSA9IG92ZXJyaWRlO1xuICAgICAgICB0aGlzLml0ZW1zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB9XG4gICAgaXNGb3JUeXBlKHR5cGUpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaXNQcm90b3R5cGVPZi5jYWxsKHRoaXMudHlwZS5wcm90b3R5cGUsIHR5cGUucHJvdG90eXBlKTtcbiAgICB9XG4gcmVnaXN0ZXIoaXRlbSkge1xuICAgICAgICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihpdGVtKTtcbiAgICAgICAgbGV0IHBhcmVudFNjb3BlO1xuICAgICAgICBpZiAoaXNJQ2hhcnRDb21wb25lbnQocHJvdG8pKSB7XG4gICAgICAgICAgICBwYXJlbnRTY29wZSA9IHRoaXMucmVnaXN0ZXIocHJvdG8pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5pdGVtcztcbiAgICAgICAgY29uc3QgaWQgPSBpdGVtLmlkO1xuICAgICAgICBjb25zdCBzY29wZSA9IHRoaXMuc2NvcGUgKyAnLicgKyBpZDtcbiAgICAgICAgaWYgKCFpZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjbGFzcyBkb2VzIG5vdCBoYXZlIGlkOiAnICsgaXRlbSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlkIGluIGl0ZW1zKSB7XG4gICAgICAgICAgICByZXR1cm4gc2NvcGU7XG4gICAgICAgIH1cbiAgICAgICAgaXRlbXNbaWRdID0gaXRlbTtcbiAgICAgICAgcmVnaXN0ZXJEZWZhdWx0cyhpdGVtLCBzY29wZSwgcGFyZW50U2NvcGUpO1xuICAgICAgICBpZiAodGhpcy5vdmVycmlkZSkge1xuICAgICAgICAgICAgZGVmYXVsdHMub3ZlcnJpZGUoaXRlbS5pZCwgaXRlbS5vdmVycmlkZXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzY29wZTtcbiAgICB9XG4gZ2V0KGlkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLml0ZW1zW2lkXTtcbiAgICB9XG4gdW5yZWdpc3RlcihpdGVtKSB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5pdGVtcztcbiAgICAgICAgY29uc3QgaWQgPSBpdGVtLmlkO1xuICAgICAgICBjb25zdCBzY29wZSA9IHRoaXMuc2NvcGU7XG4gICAgICAgIGlmIChpZCBpbiBpdGVtcykge1xuICAgICAgICAgICAgZGVsZXRlIGl0ZW1zW2lkXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2NvcGUgJiYgaWQgaW4gZGVmYXVsdHNbc2NvcGVdKSB7XG4gICAgICAgICAgICBkZWxldGUgZGVmYXVsdHNbc2NvcGVdW2lkXTtcbiAgICAgICAgICAgIGlmICh0aGlzLm92ZXJyaWRlKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIG92ZXJyaWRlc1tpZF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiByZWdpc3RlckRlZmF1bHRzKGl0ZW0sIHNjb3BlLCBwYXJlbnRTY29wZSkge1xuICAgIGNvbnN0IGl0ZW1EZWZhdWx0cyA9IG1lcmdlKE9iamVjdC5jcmVhdGUobnVsbCksIFtcbiAgICAgICAgcGFyZW50U2NvcGUgPyBkZWZhdWx0cy5nZXQocGFyZW50U2NvcGUpIDoge30sXG4gICAgICAgIGRlZmF1bHRzLmdldChzY29wZSksXG4gICAgICAgIGl0ZW0uZGVmYXVsdHNcbiAgICBdKTtcbiAgICBkZWZhdWx0cy5zZXQoc2NvcGUsIGl0ZW1EZWZhdWx0cyk7XG4gICAgaWYgKGl0ZW0uZGVmYXVsdFJvdXRlcykge1xuICAgICAgICByb3V0ZURlZmF1bHRzKHNjb3BlLCBpdGVtLmRlZmF1bHRSb3V0ZXMpO1xuICAgIH1cbiAgICBpZiAoaXRlbS5kZXNjcmlwdG9ycykge1xuICAgICAgICBkZWZhdWx0cy5kZXNjcmliZShzY29wZSwgaXRlbS5kZXNjcmlwdG9ycyk7XG4gICAgfVxufVxuZnVuY3Rpb24gcm91dGVEZWZhdWx0cyhzY29wZSwgcm91dGVzKSB7XG4gICAgT2JqZWN0LmtleXMocm91dGVzKS5mb3JFYWNoKChwcm9wZXJ0eSk9PntcbiAgICAgICAgY29uc3QgcHJvcGVydHlQYXJ0cyA9IHByb3BlcnR5LnNwbGl0KCcuJyk7XG4gICAgICAgIGNvbnN0IHNvdXJjZU5hbWUgPSBwcm9wZXJ0eVBhcnRzLnBvcCgpO1xuICAgICAgICBjb25zdCBzb3VyY2VTY29wZSA9IFtcbiAgICAgICAgICAgIHNjb3BlXG4gICAgICAgIF0uY29uY2F0KHByb3BlcnR5UGFydHMpLmpvaW4oJy4nKTtcbiAgICAgICAgY29uc3QgcGFydHMgPSByb3V0ZXNbcHJvcGVydHldLnNwbGl0KCcuJyk7XG4gICAgICAgIGNvbnN0IHRhcmdldE5hbWUgPSBwYXJ0cy5wb3AoKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0U2NvcGUgPSBwYXJ0cy5qb2luKCcuJyk7XG4gICAgICAgIGRlZmF1bHRzLnJvdXRlKHNvdXJjZVNjb3BlLCBzb3VyY2VOYW1lLCB0YXJnZXRTY29wZSwgdGFyZ2V0TmFtZSk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBpc0lDaGFydENvbXBvbmVudChwcm90bykge1xuICAgIHJldHVybiAnaWQnIGluIHByb3RvICYmICdkZWZhdWx0cycgaW4gcHJvdG87XG59XG5cbmNsYXNzIFJlZ2lzdHJ5IHtcbiAgICBjb25zdHJ1Y3Rvcigpe1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXJzID0gbmV3IFR5cGVkUmVnaXN0cnkoRGF0YXNldENvbnRyb2xsZXIsICdkYXRhc2V0cycsIHRydWUpO1xuICAgICAgICB0aGlzLmVsZW1lbnRzID0gbmV3IFR5cGVkUmVnaXN0cnkoRWxlbWVudCwgJ2VsZW1lbnRzJyk7XG4gICAgICAgIHRoaXMucGx1Z2lucyA9IG5ldyBUeXBlZFJlZ2lzdHJ5KE9iamVjdCwgJ3BsdWdpbnMnKTtcbiAgICAgICAgdGhpcy5zY2FsZXMgPSBuZXcgVHlwZWRSZWdpc3RyeShTY2FsZSwgJ3NjYWxlcycpO1xuICAgICAgICB0aGlzLl90eXBlZFJlZ2lzdHJpZXMgPSBbXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXJzLFxuICAgICAgICAgICAgdGhpcy5zY2FsZXMsXG4gICAgICAgICAgICB0aGlzLmVsZW1lbnRzXG4gICAgICAgIF07XG4gICAgfVxuIGFkZCguLi5hcmdzKSB7XG4gICAgICAgIHRoaXMuX2VhY2goJ3JlZ2lzdGVyJywgYXJncyk7XG4gICAgfVxuICAgIHJlbW92ZSguLi5hcmdzKSB7XG4gICAgICAgIHRoaXMuX2VhY2goJ3VucmVnaXN0ZXInLCBhcmdzKTtcbiAgICB9XG4gYWRkQ29udHJvbGxlcnMoLi4uYXJncykge1xuICAgICAgICB0aGlzLl9lYWNoKCdyZWdpc3RlcicsIGFyZ3MsIHRoaXMuY29udHJvbGxlcnMpO1xuICAgIH1cbiBhZGRFbGVtZW50cyguLi5hcmdzKSB7XG4gICAgICAgIHRoaXMuX2VhY2goJ3JlZ2lzdGVyJywgYXJncywgdGhpcy5lbGVtZW50cyk7XG4gICAgfVxuIGFkZFBsdWdpbnMoLi4uYXJncykge1xuICAgICAgICB0aGlzLl9lYWNoKCdyZWdpc3RlcicsIGFyZ3MsIHRoaXMucGx1Z2lucyk7XG4gICAgfVxuIGFkZFNjYWxlcyguLi5hcmdzKSB7XG4gICAgICAgIHRoaXMuX2VhY2goJ3JlZ2lzdGVyJywgYXJncywgdGhpcy5zY2FsZXMpO1xuICAgIH1cbiBnZXRDb250cm9sbGVyKGlkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXQoaWQsIHRoaXMuY29udHJvbGxlcnMsICdjb250cm9sbGVyJyk7XG4gICAgfVxuIGdldEVsZW1lbnQoaWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldChpZCwgdGhpcy5lbGVtZW50cywgJ2VsZW1lbnQnKTtcbiAgICB9XG4gZ2V0UGx1Z2luKGlkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXQoaWQsIHRoaXMucGx1Z2lucywgJ3BsdWdpbicpO1xuICAgIH1cbiBnZXRTY2FsZShpZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0KGlkLCB0aGlzLnNjYWxlcywgJ3NjYWxlJyk7XG4gICAgfVxuIHJlbW92ZUNvbnRyb2xsZXJzKC4uLmFyZ3MpIHtcbiAgICAgICAgdGhpcy5fZWFjaCgndW5yZWdpc3RlcicsIGFyZ3MsIHRoaXMuY29udHJvbGxlcnMpO1xuICAgIH1cbiByZW1vdmVFbGVtZW50cyguLi5hcmdzKSB7XG4gICAgICAgIHRoaXMuX2VhY2goJ3VucmVnaXN0ZXInLCBhcmdzLCB0aGlzLmVsZW1lbnRzKTtcbiAgICB9XG4gcmVtb3ZlUGx1Z2lucyguLi5hcmdzKSB7XG4gICAgICAgIHRoaXMuX2VhY2goJ3VucmVnaXN0ZXInLCBhcmdzLCB0aGlzLnBsdWdpbnMpO1xuICAgIH1cbiByZW1vdmVTY2FsZXMoLi4uYXJncykge1xuICAgICAgICB0aGlzLl9lYWNoKCd1bnJlZ2lzdGVyJywgYXJncywgdGhpcy5zY2FsZXMpO1xuICAgIH1cbiBfZWFjaChtZXRob2QsIGFyZ3MsIHR5cGVkUmVnaXN0cnkpIHtcbiAgICAgICAgW1xuICAgICAgICAgICAgLi4uYXJnc1xuICAgICAgICBdLmZvckVhY2goKGFyZyk9PntcbiAgICAgICAgICAgIGNvbnN0IHJlZyA9IHR5cGVkUmVnaXN0cnkgfHwgdGhpcy5fZ2V0UmVnaXN0cnlGb3JUeXBlKGFyZyk7XG4gICAgICAgICAgICBpZiAodHlwZWRSZWdpc3RyeSB8fCByZWcuaXNGb3JUeXBlKGFyZykgfHwgcmVnID09PSB0aGlzLnBsdWdpbnMgJiYgYXJnLmlkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZXhlYyhtZXRob2QsIHJlZywgYXJnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZWFjaChhcmcsIChpdGVtKT0+e1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtUmVnID0gdHlwZWRSZWdpc3RyeSB8fCB0aGlzLl9nZXRSZWdpc3RyeUZvclR5cGUoaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2V4ZWMobWV0aG9kLCBpdGVtUmVnLCBpdGVtKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuIF9leGVjKG1ldGhvZCwgcmVnaXN0cnksIGNvbXBvbmVudCkge1xuICAgICAgICBjb25zdCBjYW1lbE1ldGhvZCA9IF9jYXBpdGFsaXplKG1ldGhvZCk7XG4gICAgICAgIGNhbGxiYWNrKGNvbXBvbmVudFsnYmVmb3JlJyArIGNhbWVsTWV0aG9kXSwgW10sIGNvbXBvbmVudCk7XG4gICAgICAgIHJlZ2lzdHJ5W21ldGhvZF0oY29tcG9uZW50KTtcbiAgICAgICAgY2FsbGJhY2soY29tcG9uZW50WydhZnRlcicgKyBjYW1lbE1ldGhvZF0sIFtdLCBjb21wb25lbnQpO1xuICAgIH1cbiBfZ2V0UmVnaXN0cnlGb3JUeXBlKHR5cGUpIHtcbiAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IHRoaXMuX3R5cGVkUmVnaXN0cmllcy5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICBjb25zdCByZWcgPSB0aGlzLl90eXBlZFJlZ2lzdHJpZXNbaV07XG4gICAgICAgICAgICBpZiAocmVnLmlzRm9yVHlwZSh0eXBlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZWc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucGx1Z2lucztcbiAgICB9XG4gX2dldChpZCwgdHlwZWRSZWdpc3RyeSwgdHlwZSkge1xuICAgICAgICBjb25zdCBpdGVtID0gdHlwZWRSZWdpc3RyeS5nZXQoaWQpO1xuICAgICAgICBpZiAoaXRlbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1wiJyArIGlkICsgJ1wiIGlzIG5vdCBhIHJlZ2lzdGVyZWQgJyArIHR5cGUgKyAnLicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpdGVtO1xuICAgIH1cbn1cbnZhciByZWdpc3RyeSA9IC8qICNfX1BVUkVfXyAqLyBuZXcgUmVnaXN0cnkoKTtcblxuY2xhc3MgUGx1Z2luU2VydmljZSB7XG4gICAgY29uc3RydWN0b3IoKXtcbiAgICAgICAgdGhpcy5faW5pdCA9IFtdO1xuICAgIH1cbiBub3RpZnkoY2hhcnQsIGhvb2ssIGFyZ3MsIGZpbHRlcikge1xuICAgICAgICBpZiAoaG9vayA9PT0gJ2JlZm9yZUluaXQnKSB7XG4gICAgICAgICAgICB0aGlzLl9pbml0ID0gdGhpcy5fY3JlYXRlRGVzY3JpcHRvcnMoY2hhcnQsIHRydWUpO1xuICAgICAgICAgICAgdGhpcy5fbm90aWZ5KHRoaXMuX2luaXQsIGNoYXJ0LCAnaW5zdGFsbCcpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRlc2NyaXB0b3JzID0gZmlsdGVyID8gdGhpcy5fZGVzY3JpcHRvcnMoY2hhcnQpLmZpbHRlcihmaWx0ZXIpIDogdGhpcy5fZGVzY3JpcHRvcnMoY2hhcnQpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9ub3RpZnkoZGVzY3JpcHRvcnMsIGNoYXJ0LCBob29rLCBhcmdzKTtcbiAgICAgICAgaWYgKGhvb2sgPT09ICdhZnRlckRlc3Ryb3knKSB7XG4gICAgICAgICAgICB0aGlzLl9ub3RpZnkoZGVzY3JpcHRvcnMsIGNoYXJ0LCAnc3RvcCcpO1xuICAgICAgICAgICAgdGhpcy5fbm90aWZ5KHRoaXMuX2luaXQsIGNoYXJ0LCAndW5pbnN0YWxsJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gX25vdGlmeShkZXNjcmlwdG9ycywgY2hhcnQsIGhvb2ssIGFyZ3MpIHtcbiAgICAgICAgYXJncyA9IGFyZ3MgfHwge307XG4gICAgICAgIGZvciAoY29uc3QgZGVzY3JpcHRvciBvZiBkZXNjcmlwdG9ycyl7XG4gICAgICAgICAgICBjb25zdCBwbHVnaW4gPSBkZXNjcmlwdG9yLnBsdWdpbjtcbiAgICAgICAgICAgIGNvbnN0IG1ldGhvZCA9IHBsdWdpbltob29rXTtcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IFtcbiAgICAgICAgICAgICAgICBjaGFydCxcbiAgICAgICAgICAgICAgICBhcmdzLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0b3Iub3B0aW9uc1xuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGlmIChjYWxsYmFjayhtZXRob2QsIHBhcmFtcywgcGx1Z2luKSA9PT0gZmFsc2UgJiYgYXJncy5jYW5jZWxhYmxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpbnZhbGlkYXRlKCkge1xuICAgICAgICBpZiAoIWlzTnVsbE9yVW5kZWYodGhpcy5fY2FjaGUpKSB7XG4gICAgICAgICAgICB0aGlzLl9vbGRDYWNoZSA9IHRoaXMuX2NhY2hlO1xuICAgICAgICAgICAgdGhpcy5fY2FjaGUgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG4gX2Rlc2NyaXB0b3JzKGNoYXJ0KSB7XG4gICAgICAgIGlmICh0aGlzLl9jYWNoZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRlc2NyaXB0b3JzID0gdGhpcy5fY2FjaGUgPSB0aGlzLl9jcmVhdGVEZXNjcmlwdG9ycyhjaGFydCk7XG4gICAgICAgIHRoaXMuX25vdGlmeVN0YXRlQ2hhbmdlcyhjaGFydCk7XG4gICAgICAgIHJldHVybiBkZXNjcmlwdG9ycztcbiAgICB9XG4gICAgX2NyZWF0ZURlc2NyaXB0b3JzKGNoYXJ0LCBhbGwpIHtcbiAgICAgICAgY29uc3QgY29uZmlnID0gY2hhcnQgJiYgY2hhcnQuY29uZmlnO1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdmFsdWVPckRlZmF1bHQoY29uZmlnLm9wdGlvbnMgJiYgY29uZmlnLm9wdGlvbnMucGx1Z2lucywge30pO1xuICAgICAgICBjb25zdCBwbHVnaW5zID0gYWxsUGx1Z2lucyhjb25maWcpO1xuICAgICAgICByZXR1cm4gb3B0aW9ucyA9PT0gZmFsc2UgJiYgIWFsbCA/IFtdIDogY3JlYXRlRGVzY3JpcHRvcnMoY2hhcnQsIHBsdWdpbnMsIG9wdGlvbnMsIGFsbCk7XG4gICAgfVxuIF9ub3RpZnlTdGF0ZUNoYW5nZXMoY2hhcnQpIHtcbiAgICAgICAgY29uc3QgcHJldmlvdXNEZXNjcmlwdG9ycyA9IHRoaXMuX29sZENhY2hlIHx8IFtdO1xuICAgICAgICBjb25zdCBkZXNjcmlwdG9ycyA9IHRoaXMuX2NhY2hlO1xuICAgICAgICBjb25zdCBkaWZmID0gKGEsIGIpPT5hLmZpbHRlcigoeCk9PiFiLnNvbWUoKHkpPT54LnBsdWdpbi5pZCA9PT0geS5wbHVnaW4uaWQpKTtcbiAgICAgICAgdGhpcy5fbm90aWZ5KGRpZmYocHJldmlvdXNEZXNjcmlwdG9ycywgZGVzY3JpcHRvcnMpLCBjaGFydCwgJ3N0b3AnKTtcbiAgICAgICAgdGhpcy5fbm90aWZ5KGRpZmYoZGVzY3JpcHRvcnMsIHByZXZpb3VzRGVzY3JpcHRvcnMpLCBjaGFydCwgJ3N0YXJ0Jyk7XG4gICAgfVxufVxuIGZ1bmN0aW9uIGFsbFBsdWdpbnMoY29uZmlnKSB7XG4gICAgY29uc3QgbG9jYWxJZHMgPSB7fTtcbiAgICBjb25zdCBwbHVnaW5zID0gW107XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHJlZ2lzdHJ5LnBsdWdpbnMuaXRlbXMpO1xuICAgIGZvcihsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgcGx1Z2lucy5wdXNoKHJlZ2lzdHJ5LmdldFBsdWdpbihrZXlzW2ldKSk7XG4gICAgfVxuICAgIGNvbnN0IGxvY2FsID0gY29uZmlnLnBsdWdpbnMgfHwgW107XG4gICAgZm9yKGxldCBpID0gMDsgaSA8IGxvY2FsLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgY29uc3QgcGx1Z2luID0gbG9jYWxbaV07XG4gICAgICAgIGlmIChwbHVnaW5zLmluZGV4T2YocGx1Z2luKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHBsdWdpbnMucHVzaChwbHVnaW4pO1xuICAgICAgICAgICAgbG9jYWxJZHNbcGx1Z2luLmlkXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcGx1Z2lucyxcbiAgICAgICAgbG9jYWxJZHNcbiAgICB9O1xufVxuZnVuY3Rpb24gZ2V0T3B0cyhvcHRpb25zLCBhbGwpIHtcbiAgICBpZiAoIWFsbCAmJiBvcHRpb25zID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMgPT09IHRydWUpIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICByZXR1cm4gb3B0aW9ucztcbn1cbmZ1bmN0aW9uIGNyZWF0ZURlc2NyaXB0b3JzKGNoYXJ0LCB7IHBsdWdpbnMgLCBsb2NhbElkcyAgfSwgb3B0aW9ucywgYWxsKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgY29uc3QgY29udGV4dCA9IGNoYXJ0LmdldENvbnRleHQoKTtcbiAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiBwbHVnaW5zKXtcbiAgICAgICAgY29uc3QgaWQgPSBwbHVnaW4uaWQ7XG4gICAgICAgIGNvbnN0IG9wdHMgPSBnZXRPcHRzKG9wdGlvbnNbaWRdLCBhbGwpO1xuICAgICAgICBpZiAob3B0cyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICAgICAgcGx1Z2luLFxuICAgICAgICAgICAgb3B0aW9uczogcGx1Z2luT3B0cyhjaGFydC5jb25maWcsIHtcbiAgICAgICAgICAgICAgICBwbHVnaW4sXG4gICAgICAgICAgICAgICAgbG9jYWw6IGxvY2FsSWRzW2lkXVxuICAgICAgICAgICAgfSwgb3B0cywgY29udGV4dClcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBwbHVnaW5PcHRzKGNvbmZpZywgeyBwbHVnaW4gLCBsb2NhbCAgfSwgb3B0cywgY29udGV4dCkge1xuICAgIGNvbnN0IGtleXMgPSBjb25maWcucGx1Z2luU2NvcGVLZXlzKHBsdWdpbik7XG4gICAgY29uc3Qgc2NvcGVzID0gY29uZmlnLmdldE9wdGlvblNjb3BlcyhvcHRzLCBrZXlzKTtcbiAgICBpZiAobG9jYWwgJiYgcGx1Z2luLmRlZmF1bHRzKSB7XG4gICAgICAgIHNjb3Blcy5wdXNoKHBsdWdpbi5kZWZhdWx0cyk7XG4gICAgfVxuICAgIHJldHVybiBjb25maWcuY3JlYXRlUmVzb2x2ZXIoc2NvcGVzLCBjb250ZXh0LCBbXG4gICAgICAgICcnXG4gICAgXSwge1xuICAgICAgICBzY3JpcHRhYmxlOiBmYWxzZSxcbiAgICAgICAgaW5kZXhhYmxlOiBmYWxzZSxcbiAgICAgICAgYWxsS2V5czogdHJ1ZVxuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRJbmRleEF4aXModHlwZSwgb3B0aW9ucykge1xuICAgIGNvbnN0IGRhdGFzZXREZWZhdWx0cyA9IGRlZmF1bHRzLmRhdGFzZXRzW3R5cGVdIHx8IHt9O1xuICAgIGNvbnN0IGRhdGFzZXRPcHRpb25zID0gKG9wdGlvbnMuZGF0YXNldHMgfHwge30pW3R5cGVdIHx8IHt9O1xuICAgIHJldHVybiBkYXRhc2V0T3B0aW9ucy5pbmRleEF4aXMgfHwgb3B0aW9ucy5pbmRleEF4aXMgfHwgZGF0YXNldERlZmF1bHRzLmluZGV4QXhpcyB8fCAneCc7XG59XG5mdW5jdGlvbiBnZXRBeGlzRnJvbURlZmF1bHRTY2FsZUlEKGlkLCBpbmRleEF4aXMpIHtcbiAgICBsZXQgYXhpcyA9IGlkO1xuICAgIGlmIChpZCA9PT0gJ19pbmRleF8nKSB7XG4gICAgICAgIGF4aXMgPSBpbmRleEF4aXM7XG4gICAgfSBlbHNlIGlmIChpZCA9PT0gJ192YWx1ZV8nKSB7XG4gICAgICAgIGF4aXMgPSBpbmRleEF4aXMgPT09ICd4JyA/ICd5JyA6ICd4JztcbiAgICB9XG4gICAgcmV0dXJuIGF4aXM7XG59XG5mdW5jdGlvbiBnZXREZWZhdWx0U2NhbGVJREZyb21BeGlzKGF4aXMsIGluZGV4QXhpcykge1xuICAgIHJldHVybiBheGlzID09PSBpbmRleEF4aXMgPyAnX2luZGV4XycgOiAnX3ZhbHVlXyc7XG59XG5mdW5jdGlvbiBpZE1hdGNoZXNBeGlzKGlkKSB7XG4gICAgaWYgKGlkID09PSAneCcgfHwgaWQgPT09ICd5JyB8fCBpZCA9PT0gJ3InKSB7XG4gICAgICAgIHJldHVybiBpZDtcbiAgICB9XG59XG5mdW5jdGlvbiBheGlzRnJvbVBvc2l0aW9uKHBvc2l0aW9uKSB7XG4gICAgaWYgKHBvc2l0aW9uID09PSAndG9wJyB8fCBwb3NpdGlvbiA9PT0gJ2JvdHRvbScpIHtcbiAgICAgICAgcmV0dXJuICd4JztcbiAgICB9XG4gICAgaWYgKHBvc2l0aW9uID09PSAnbGVmdCcgfHwgcG9zaXRpb24gPT09ICdyaWdodCcpIHtcbiAgICAgICAgcmV0dXJuICd5JztcbiAgICB9XG59XG5mdW5jdGlvbiBkZXRlcm1pbmVBeGlzKGlkLCAuLi5zY2FsZU9wdGlvbnMpIHtcbiAgICBpZiAoaWRNYXRjaGVzQXhpcyhpZCkpIHtcbiAgICAgICAgcmV0dXJuIGlkO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IG9wdHMgb2Ygc2NhbGVPcHRpb25zKXtcbiAgICAgICAgY29uc3QgYXhpcyA9IG9wdHMuYXhpcyB8fCBheGlzRnJvbVBvc2l0aW9uKG9wdHMucG9zaXRpb24pIHx8IGlkLmxlbmd0aCA+IDEgJiYgaWRNYXRjaGVzQXhpcyhpZFswXS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgaWYgKGF4aXMpIHtcbiAgICAgICAgICAgIHJldHVybiBheGlzO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGRldGVybWluZSB0eXBlIG9mICcke2lkfScgYXhpcy4gUGxlYXNlIHByb3ZpZGUgJ2F4aXMnIG9yICdwb3NpdGlvbicgb3B0aW9uLmApO1xufVxuZnVuY3Rpb24gZ2V0QXhpc0Zyb21EYXRhc2V0KGlkLCBheGlzLCBkYXRhc2V0KSB7XG4gICAgaWYgKGRhdGFzZXRbYXhpcyArICdBeGlzSUQnXSA9PT0gaWQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGF4aXNcbiAgICAgICAgfTtcbiAgICB9XG59XG5mdW5jdGlvbiByZXRyaWV2ZUF4aXNGcm9tRGF0YXNldHMoaWQsIGNvbmZpZykge1xuICAgIGlmIChjb25maWcuZGF0YSAmJiBjb25maWcuZGF0YS5kYXRhc2V0cykge1xuICAgICAgICBjb25zdCBib3VuZERzID0gY29uZmlnLmRhdGEuZGF0YXNldHMuZmlsdGVyKChkKT0+ZC54QXhpc0lEID09PSBpZCB8fCBkLnlBeGlzSUQgPT09IGlkKTtcbiAgICAgICAgaWYgKGJvdW5kRHMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0QXhpc0Zyb21EYXRhc2V0KGlkLCAneCcsIGJvdW5kRHNbMF0pIHx8IGdldEF4aXNGcm9tRGF0YXNldChpZCwgJ3knLCBib3VuZERzWzBdKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge307XG59XG5mdW5jdGlvbiBtZXJnZVNjYWxlQ29uZmlnKGNvbmZpZywgb3B0aW9ucykge1xuICAgIGNvbnN0IGNoYXJ0RGVmYXVsdHMgPSBvdmVycmlkZXNbY29uZmlnLnR5cGVdIHx8IHtcbiAgICAgICAgc2NhbGVzOiB7fVxuICAgIH07XG4gICAgY29uc3QgY29uZmlnU2NhbGVzID0gb3B0aW9ucy5zY2FsZXMgfHwge307XG4gICAgY29uc3QgY2hhcnRJbmRleEF4aXMgPSBnZXRJbmRleEF4aXMoY29uZmlnLnR5cGUsIG9wdGlvbnMpO1xuICAgIGNvbnN0IHNjYWxlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgT2JqZWN0LmtleXMoY29uZmlnU2NhbGVzKS5mb3JFYWNoKChpZCk9PntcbiAgICAgICAgY29uc3Qgc2NhbGVDb25mID0gY29uZmlnU2NhbGVzW2lkXTtcbiAgICAgICAgaWYgKCFpc09iamVjdChzY2FsZUNvbmYpKSB7XG4gICAgICAgICAgICByZXR1cm4gY29uc29sZS5lcnJvcihgSW52YWxpZCBzY2FsZSBjb25maWd1cmF0aW9uIGZvciBzY2FsZTogJHtpZH1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2NhbGVDb25mLl9wcm94eSkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnNvbGUud2FybihgSWdub3JpbmcgcmVzb2x2ZXIgcGFzc2VkIGFzIG9wdGlvbnMgZm9yIHNjYWxlOiAke2lkfWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGF4aXMgPSBkZXRlcm1pbmVBeGlzKGlkLCBzY2FsZUNvbmYsIHJldHJpZXZlQXhpc0Zyb21EYXRhc2V0cyhpZCwgY29uZmlnKSwgZGVmYXVsdHMuc2NhbGVzW3NjYWxlQ29uZi50eXBlXSk7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRJZCA9IGdldERlZmF1bHRTY2FsZUlERnJvbUF4aXMoYXhpcywgY2hhcnRJbmRleEF4aXMpO1xuICAgICAgICBjb25zdCBkZWZhdWx0U2NhbGVPcHRpb25zID0gY2hhcnREZWZhdWx0cy5zY2FsZXMgfHwge307XG4gICAgICAgIHNjYWxlc1tpZF0gPSBtZXJnZUlmKE9iamVjdC5jcmVhdGUobnVsbCksIFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBheGlzXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2NhbGVDb25mLFxuICAgICAgICAgICAgZGVmYXVsdFNjYWxlT3B0aW9uc1theGlzXSxcbiAgICAgICAgICAgIGRlZmF1bHRTY2FsZU9wdGlvbnNbZGVmYXVsdElkXVxuICAgICAgICBdKTtcbiAgICB9KTtcbiAgICBjb25maWcuZGF0YS5kYXRhc2V0cy5mb3JFYWNoKChkYXRhc2V0KT0+e1xuICAgICAgICBjb25zdCB0eXBlID0gZGF0YXNldC50eXBlIHx8IGNvbmZpZy50eXBlO1xuICAgICAgICBjb25zdCBpbmRleEF4aXMgPSBkYXRhc2V0LmluZGV4QXhpcyB8fCBnZXRJbmRleEF4aXModHlwZSwgb3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGRhdGFzZXREZWZhdWx0cyA9IG92ZXJyaWRlc1t0eXBlXSB8fCB7fTtcbiAgICAgICAgY29uc3QgZGVmYXVsdFNjYWxlT3B0aW9ucyA9IGRhdGFzZXREZWZhdWx0cy5zY2FsZXMgfHwge307XG4gICAgICAgIE9iamVjdC5rZXlzKGRlZmF1bHRTY2FsZU9wdGlvbnMpLmZvckVhY2goKGRlZmF1bHRJRCk9PntcbiAgICAgICAgICAgIGNvbnN0IGF4aXMgPSBnZXRBeGlzRnJvbURlZmF1bHRTY2FsZUlEKGRlZmF1bHRJRCwgaW5kZXhBeGlzKTtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gZGF0YXNldFtheGlzICsgJ0F4aXNJRCddIHx8IGF4aXM7XG4gICAgICAgICAgICBzY2FsZXNbaWRdID0gc2NhbGVzW2lkXSB8fCBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgICAgbWVyZ2VJZihzY2FsZXNbaWRdLCBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBheGlzXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjb25maWdTY2FsZXNbaWRdLFxuICAgICAgICAgICAgICAgIGRlZmF1bHRTY2FsZU9wdGlvbnNbZGVmYXVsdElEXVxuICAgICAgICAgICAgXSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIE9iamVjdC5rZXlzKHNjYWxlcykuZm9yRWFjaCgoa2V5KT0+e1xuICAgICAgICBjb25zdCBzY2FsZSA9IHNjYWxlc1trZXldO1xuICAgICAgICBtZXJnZUlmKHNjYWxlLCBbXG4gICAgICAgICAgICBkZWZhdWx0cy5zY2FsZXNbc2NhbGUudHlwZV0sXG4gICAgICAgICAgICBkZWZhdWx0cy5zY2FsZVxuICAgICAgICBdKTtcbiAgICB9KTtcbiAgICByZXR1cm4gc2NhbGVzO1xufVxuZnVuY3Rpb24gaW5pdE9wdGlvbnMoY29uZmlnKSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IGNvbmZpZy5vcHRpb25zIHx8IChjb25maWcub3B0aW9ucyA9IHt9KTtcbiAgICBvcHRpb25zLnBsdWdpbnMgPSB2YWx1ZU9yRGVmYXVsdChvcHRpb25zLnBsdWdpbnMsIHt9KTtcbiAgICBvcHRpb25zLnNjYWxlcyA9IG1lcmdlU2NhbGVDb25maWcoY29uZmlnLCBvcHRpb25zKTtcbn1cbmZ1bmN0aW9uIGluaXREYXRhKGRhdGEpIHtcbiAgICBkYXRhID0gZGF0YSB8fCB7fTtcbiAgICBkYXRhLmRhdGFzZXRzID0gZGF0YS5kYXRhc2V0cyB8fCBbXTtcbiAgICBkYXRhLmxhYmVscyA9IGRhdGEubGFiZWxzIHx8IFtdO1xuICAgIHJldHVybiBkYXRhO1xufVxuZnVuY3Rpb24gaW5pdENvbmZpZyhjb25maWcpIHtcbiAgICBjb25maWcgPSBjb25maWcgfHwge307XG4gICAgY29uZmlnLmRhdGEgPSBpbml0RGF0YShjb25maWcuZGF0YSk7XG4gICAgaW5pdE9wdGlvbnMoY29uZmlnKTtcbiAgICByZXR1cm4gY29uZmlnO1xufVxuY29uc3Qga2V5Q2FjaGUgPSBuZXcgTWFwKCk7XG5jb25zdCBrZXlzQ2FjaGVkID0gbmV3IFNldCgpO1xuZnVuY3Rpb24gY2FjaGVkS2V5cyhjYWNoZUtleSwgZ2VuZXJhdGUpIHtcbiAgICBsZXQga2V5cyA9IGtleUNhY2hlLmdldChjYWNoZUtleSk7XG4gICAgaWYgKCFrZXlzKSB7XG4gICAgICAgIGtleXMgPSBnZW5lcmF0ZSgpO1xuICAgICAgICBrZXlDYWNoZS5zZXQoY2FjaGVLZXksIGtleXMpO1xuICAgICAgICBrZXlzQ2FjaGVkLmFkZChrZXlzKTtcbiAgICB9XG4gICAgcmV0dXJuIGtleXM7XG59XG5jb25zdCBhZGRJZkZvdW5kID0gKHNldCwgb2JqLCBrZXkpPT57XG4gICAgY29uc3Qgb3B0cyA9IHJlc29sdmVPYmplY3RLZXkob2JqLCBrZXkpO1xuICAgIGlmIChvcHRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc2V0LmFkZChvcHRzKTtcbiAgICB9XG59O1xuY2xhc3MgQ29uZmlnIHtcbiAgICBjb25zdHJ1Y3Rvcihjb25maWcpe1xuICAgICAgICB0aGlzLl9jb25maWcgPSBpbml0Q29uZmlnKGNvbmZpZyk7XG4gICAgICAgIHRoaXMuX3Njb3BlQ2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuX3Jlc29sdmVyQ2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgfVxuICAgIGdldCBwbGF0Zm9ybSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbmZpZy5wbGF0Zm9ybTtcbiAgICB9XG4gICAgZ2V0IHR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb25maWcudHlwZTtcbiAgICB9XG4gICAgc2V0IHR5cGUodHlwZSkge1xuICAgICAgICB0aGlzLl9jb25maWcudHlwZSA9IHR5cGU7XG4gICAgfVxuICAgIGdldCBkYXRhKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29uZmlnLmRhdGE7XG4gICAgfVxuICAgIHNldCBkYXRhKGRhdGEpIHtcbiAgICAgICAgdGhpcy5fY29uZmlnLmRhdGEgPSBpbml0RGF0YShkYXRhKTtcbiAgICB9XG4gICAgZ2V0IG9wdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb25maWcub3B0aW9ucztcbiAgICB9XG4gICAgc2V0IG9wdGlvbnMob3B0aW9ucykge1xuICAgICAgICB0aGlzLl9jb25maWcub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgfVxuICAgIGdldCBwbHVnaW5zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29uZmlnLnBsdWdpbnM7XG4gICAgfVxuICAgIHVwZGF0ZSgpIHtcbiAgICAgICAgY29uc3QgY29uZmlnID0gdGhpcy5fY29uZmlnO1xuICAgICAgICB0aGlzLmNsZWFyQ2FjaGUoKTtcbiAgICAgICAgaW5pdE9wdGlvbnMoY29uZmlnKTtcbiAgICB9XG4gICAgY2xlYXJDYWNoZSgpIHtcbiAgICAgICAgdGhpcy5fc2NvcGVDYWNoZS5jbGVhcigpO1xuICAgICAgICB0aGlzLl9yZXNvbHZlckNhY2hlLmNsZWFyKCk7XG4gICAgfVxuIGRhdGFzZXRTY29wZUtleXMoZGF0YXNldFR5cGUpIHtcbiAgICAgICAgcmV0dXJuIGNhY2hlZEtleXMoZGF0YXNldFR5cGUsICgpPT5bXG4gICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICBgZGF0YXNldHMuJHtkYXRhc2V0VHlwZX1gLFxuICAgICAgICAgICAgICAgICAgICAnJ1xuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIF0pO1xuICAgIH1cbiBkYXRhc2V0QW5pbWF0aW9uU2NvcGVLZXlzKGRhdGFzZXRUeXBlLCB0cmFuc2l0aW9uKSB7XG4gICAgICAgIHJldHVybiBjYWNoZWRLZXlzKGAke2RhdGFzZXRUeXBlfS50cmFuc2l0aW9uLiR7dHJhbnNpdGlvbn1gLCAoKT0+W1xuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgYGRhdGFzZXRzLiR7ZGF0YXNldFR5cGV9LnRyYW5zaXRpb25zLiR7dHJhbnNpdGlvbn1gLFxuICAgICAgICAgICAgICAgICAgICBgdHJhbnNpdGlvbnMuJHt0cmFuc2l0aW9ufWBcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgYGRhdGFzZXRzLiR7ZGF0YXNldFR5cGV9YCxcbiAgICAgICAgICAgICAgICAgICAgJydcbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICBdKTtcbiAgICB9XG4gZGF0YXNldEVsZW1lbnRTY29wZUtleXMoZGF0YXNldFR5cGUsIGVsZW1lbnRUeXBlKSB7XG4gICAgICAgIHJldHVybiBjYWNoZWRLZXlzKGAke2RhdGFzZXRUeXBlfS0ke2VsZW1lbnRUeXBlfWAsICgpPT5bXG4gICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICBgZGF0YXNldHMuJHtkYXRhc2V0VHlwZX0uZWxlbWVudHMuJHtlbGVtZW50VHlwZX1gLFxuICAgICAgICAgICAgICAgICAgICBgZGF0YXNldHMuJHtkYXRhc2V0VHlwZX1gLFxuICAgICAgICAgICAgICAgICAgICBgZWxlbWVudHMuJHtlbGVtZW50VHlwZX1gLFxuICAgICAgICAgICAgICAgICAgICAnJ1xuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIF0pO1xuICAgIH1cbiBwbHVnaW5TY29wZUtleXMocGx1Z2luKSB7XG4gICAgICAgIGNvbnN0IGlkID0gcGx1Z2luLmlkO1xuICAgICAgICBjb25zdCB0eXBlID0gdGhpcy50eXBlO1xuICAgICAgICByZXR1cm4gY2FjaGVkS2V5cyhgJHt0eXBlfS1wbHVnaW4tJHtpZH1gLCAoKT0+W1xuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgYHBsdWdpbnMuJHtpZH1gLFxuICAgICAgICAgICAgICAgICAgICAuLi5wbHVnaW4uYWRkaXRpb25hbE9wdGlvblNjb3BlcyB8fCBbXVxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIF0pO1xuICAgIH1cbiBfY2FjaGVkU2NvcGVzKG1haW5TY29wZSwgcmVzZXRDYWNoZSkge1xuICAgICAgICBjb25zdCBfc2NvcGVDYWNoZSA9IHRoaXMuX3Njb3BlQ2FjaGU7XG4gICAgICAgIGxldCBjYWNoZSA9IF9zY29wZUNhY2hlLmdldChtYWluU2NvcGUpO1xuICAgICAgICBpZiAoIWNhY2hlIHx8IHJlc2V0Q2FjaGUpIHtcbiAgICAgICAgICAgIGNhY2hlID0gbmV3IE1hcCgpO1xuICAgICAgICAgICAgX3Njb3BlQ2FjaGUuc2V0KG1haW5TY29wZSwgY2FjaGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYWNoZTtcbiAgICB9XG4gZ2V0T3B0aW9uU2NvcGVzKG1haW5TY29wZSwga2V5TGlzdHMsIHJlc2V0Q2FjaGUpIHtcbiAgICAgICAgY29uc3QgeyBvcHRpb25zICwgdHlwZSAgfSA9IHRoaXM7XG4gICAgICAgIGNvbnN0IGNhY2hlID0gdGhpcy5fY2FjaGVkU2NvcGVzKG1haW5TY29wZSwgcmVzZXRDYWNoZSk7XG4gICAgICAgIGNvbnN0IGNhY2hlZCA9IGNhY2hlLmdldChrZXlMaXN0cyk7XG4gICAgICAgIGlmIChjYWNoZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2NvcGVzID0gbmV3IFNldCgpO1xuICAgICAgICBrZXlMaXN0cy5mb3JFYWNoKChrZXlzKT0+e1xuICAgICAgICAgICAgaWYgKG1haW5TY29wZSkge1xuICAgICAgICAgICAgICAgIHNjb3Blcy5hZGQobWFpblNjb3BlKTtcbiAgICAgICAgICAgICAgICBrZXlzLmZvckVhY2goKGtleSk9PmFkZElmRm91bmQoc2NvcGVzLCBtYWluU2NvcGUsIGtleSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAga2V5cy5mb3JFYWNoKChrZXkpPT5hZGRJZkZvdW5kKHNjb3Blcywgb3B0aW9ucywga2V5KSk7XG4gICAgICAgICAgICBrZXlzLmZvckVhY2goKGtleSk9PmFkZElmRm91bmQoc2NvcGVzLCBvdmVycmlkZXNbdHlwZV0gfHwge30sIGtleSkpO1xuICAgICAgICAgICAga2V5cy5mb3JFYWNoKChrZXkpPT5hZGRJZkZvdW5kKHNjb3BlcywgZGVmYXVsdHMsIGtleSkpO1xuICAgICAgICAgICAga2V5cy5mb3JFYWNoKChrZXkpPT5hZGRJZkZvdW5kKHNjb3BlcywgZGVzY3JpcHRvcnMsIGtleSkpO1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgYXJyYXkgPSBBcnJheS5mcm9tKHNjb3Blcyk7XG4gICAgICAgIGlmIChhcnJheS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGFycmF5LnB1c2goT2JqZWN0LmNyZWF0ZShudWxsKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGtleXNDYWNoZWQuaGFzKGtleUxpc3RzKSkge1xuICAgICAgICAgICAgY2FjaGUuc2V0KGtleUxpc3RzLCBhcnJheSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFycmF5O1xuICAgIH1cbiBjaGFydE9wdGlvblNjb3BlcygpIHtcbiAgICAgICAgY29uc3QgeyBvcHRpb25zICwgdHlwZSAgfSA9IHRoaXM7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgb3ZlcnJpZGVzW3R5cGVdIHx8IHt9LFxuICAgICAgICAgICAgZGVmYXVsdHMuZGF0YXNldHNbdHlwZV0gfHwge30sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHlwZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRlZmF1bHRzLFxuICAgICAgICAgICAgZGVzY3JpcHRvcnNcbiAgICAgICAgXTtcbiAgICB9XG4gcmVzb2x2ZU5hbWVkT3B0aW9ucyhzY29wZXMsIG5hbWVzLCBjb250ZXh0LCBwcmVmaXhlcyA9IFtcbiAgICAgICAgJydcbiAgICBdKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgICRzaGFyZWQ6IHRydWVcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgeyByZXNvbHZlciAsIHN1YlByZWZpeGVzICB9ID0gZ2V0UmVzb2x2ZXIodGhpcy5fcmVzb2x2ZXJDYWNoZSwgc2NvcGVzLCBwcmVmaXhlcyk7XG4gICAgICAgIGxldCBvcHRpb25zID0gcmVzb2x2ZXI7XG4gICAgICAgIGlmIChuZWVkQ29udGV4dChyZXNvbHZlciwgbmFtZXMpKSB7XG4gICAgICAgICAgICByZXN1bHQuJHNoYXJlZCA9IGZhbHNlO1xuICAgICAgICAgICAgY29udGV4dCA9IGlzRnVuY3Rpb24oY29udGV4dCkgPyBjb250ZXh0KCkgOiBjb250ZXh0O1xuICAgICAgICAgICAgY29uc3Qgc3ViUmVzb2x2ZXIgPSB0aGlzLmNyZWF0ZVJlc29sdmVyKHNjb3BlcywgY29udGV4dCwgc3ViUHJlZml4ZXMpO1xuICAgICAgICAgICAgb3B0aW9ucyA9IF9hdHRhY2hDb250ZXh0KHJlc29sdmVyLCBjb250ZXh0LCBzdWJSZXNvbHZlcik7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBwcm9wIG9mIG5hbWVzKXtcbiAgICAgICAgICAgIHJlc3VsdFtwcm9wXSA9IG9wdGlvbnNbcHJvcF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gY3JlYXRlUmVzb2x2ZXIoc2NvcGVzLCBjb250ZXh0LCBwcmVmaXhlcyA9IFtcbiAgICAgICAgJydcbiAgICBdLCBkZXNjcmlwdG9yRGVmYXVsdHMpIHtcbiAgICAgICAgY29uc3QgeyByZXNvbHZlciAgfSA9IGdldFJlc29sdmVyKHRoaXMuX3Jlc29sdmVyQ2FjaGUsIHNjb3BlcywgcHJlZml4ZXMpO1xuICAgICAgICByZXR1cm4gaXNPYmplY3QoY29udGV4dCkgPyBfYXR0YWNoQ29udGV4dChyZXNvbHZlciwgY29udGV4dCwgdW5kZWZpbmVkLCBkZXNjcmlwdG9yRGVmYXVsdHMpIDogcmVzb2x2ZXI7XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0UmVzb2x2ZXIocmVzb2x2ZXJDYWNoZSwgc2NvcGVzLCBwcmVmaXhlcykge1xuICAgIGxldCBjYWNoZSA9IHJlc29sdmVyQ2FjaGUuZ2V0KHNjb3Blcyk7XG4gICAgaWYgKCFjYWNoZSkge1xuICAgICAgICBjYWNoZSA9IG5ldyBNYXAoKTtcbiAgICAgICAgcmVzb2x2ZXJDYWNoZS5zZXQoc2NvcGVzLCBjYWNoZSk7XG4gICAgfVxuICAgIGNvbnN0IGNhY2hlS2V5ID0gcHJlZml4ZXMuam9pbigpO1xuICAgIGxldCBjYWNoZWQgPSBjYWNoZS5nZXQoY2FjaGVLZXkpO1xuICAgIGlmICghY2FjaGVkKSB7XG4gICAgICAgIGNvbnN0IHJlc29sdmVyID0gX2NyZWF0ZVJlc29sdmVyKHNjb3BlcywgcHJlZml4ZXMpO1xuICAgICAgICBjYWNoZWQgPSB7XG4gICAgICAgICAgICByZXNvbHZlcixcbiAgICAgICAgICAgIHN1YlByZWZpeGVzOiBwcmVmaXhlcy5maWx0ZXIoKHApPT4hcC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdob3ZlcicpKVxuICAgICAgICB9O1xuICAgICAgICBjYWNoZS5zZXQoY2FjaGVLZXksIGNhY2hlZCk7XG4gICAgfVxuICAgIHJldHVybiBjYWNoZWQ7XG59XG5jb25zdCBoYXNGdW5jdGlvbiA9ICh2YWx1ZSk9PmlzT2JqZWN0KHZhbHVlKSAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh2YWx1ZSkucmVkdWNlKChhY2MsIGtleSk9PmFjYyB8fCBpc0Z1bmN0aW9uKHZhbHVlW2tleV0pLCBmYWxzZSk7XG5mdW5jdGlvbiBuZWVkQ29udGV4dChwcm94eSwgbmFtZXMpIHtcbiAgICBjb25zdCB7IGlzU2NyaXB0YWJsZSAsIGlzSW5kZXhhYmxlICB9ID0gX2Rlc2NyaXB0b3JzKHByb3h5KTtcbiAgICBmb3IgKGNvbnN0IHByb3Agb2YgbmFtZXMpe1xuICAgICAgICBjb25zdCBzY3JpcHRhYmxlID0gaXNTY3JpcHRhYmxlKHByb3ApO1xuICAgICAgICBjb25zdCBpbmRleGFibGUgPSBpc0luZGV4YWJsZShwcm9wKTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSAoaW5kZXhhYmxlIHx8IHNjcmlwdGFibGUpICYmIHByb3h5W3Byb3BdO1xuICAgICAgICBpZiAoc2NyaXB0YWJsZSAmJiAoaXNGdW5jdGlvbih2YWx1ZSkgfHwgaGFzRnVuY3Rpb24odmFsdWUpKSB8fCBpbmRleGFibGUgJiYgaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxudmFyIHZlcnNpb24gPSBcIjQuNC4wXCI7XG5cbmNvbnN0IEtOT1dOX1BPU0lUSU9OUyA9IFtcbiAgICAndG9wJyxcbiAgICAnYm90dG9tJyxcbiAgICAnbGVmdCcsXG4gICAgJ3JpZ2h0JyxcbiAgICAnY2hhcnRBcmVhJ1xuXTtcbmZ1bmN0aW9uIHBvc2l0aW9uSXNIb3Jpem9udGFsKHBvc2l0aW9uLCBheGlzKSB7XG4gICAgcmV0dXJuIHBvc2l0aW9uID09PSAndG9wJyB8fCBwb3NpdGlvbiA9PT0gJ2JvdHRvbScgfHwgS05PV05fUE9TSVRJT05TLmluZGV4T2YocG9zaXRpb24pID09PSAtMSAmJiBheGlzID09PSAneCc7XG59XG5mdW5jdGlvbiBjb21wYXJlMkxldmVsKGwxLCBsMikge1xuICAgIHJldHVybiBmdW5jdGlvbihhLCBiKSB7XG4gICAgICAgIHJldHVybiBhW2wxXSA9PT0gYltsMV0gPyBhW2wyXSAtIGJbbDJdIDogYVtsMV0gLSBiW2wxXTtcbiAgICB9O1xufVxuZnVuY3Rpb24gb25BbmltYXRpb25zQ29tcGxldGUoY29udGV4dCkge1xuICAgIGNvbnN0IGNoYXJ0ID0gY29udGV4dC5jaGFydDtcbiAgICBjb25zdCBhbmltYXRpb25PcHRpb25zID0gY2hhcnQub3B0aW9ucy5hbmltYXRpb247XG4gICAgY2hhcnQubm90aWZ5UGx1Z2lucygnYWZ0ZXJSZW5kZXInKTtcbiAgICBjYWxsYmFjayhhbmltYXRpb25PcHRpb25zICYmIGFuaW1hdGlvbk9wdGlvbnMub25Db21wbGV0ZSwgW1xuICAgICAgICBjb250ZXh0XG4gICAgXSwgY2hhcnQpO1xufVxuZnVuY3Rpb24gb25BbmltYXRpb25Qcm9ncmVzcyhjb250ZXh0KSB7XG4gICAgY29uc3QgY2hhcnQgPSBjb250ZXh0LmNoYXJ0O1xuICAgIGNvbnN0IGFuaW1hdGlvbk9wdGlvbnMgPSBjaGFydC5vcHRpb25zLmFuaW1hdGlvbjtcbiAgICBjYWxsYmFjayhhbmltYXRpb25PcHRpb25zICYmIGFuaW1hdGlvbk9wdGlvbnMub25Qcm9ncmVzcywgW1xuICAgICAgICBjb250ZXh0XG4gICAgXSwgY2hhcnQpO1xufVxuIGZ1bmN0aW9uIGdldENhbnZhcyhpdGVtKSB7XG4gICAgaWYgKF9pc0RvbVN1cHBvcnRlZCgpICYmIHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJykge1xuICAgICAgICBpdGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaXRlbSk7XG4gICAgfSBlbHNlIGlmIChpdGVtICYmIGl0ZW0ubGVuZ3RoKSB7XG4gICAgICAgIGl0ZW0gPSBpdGVtWzBdO1xuICAgIH1cbiAgICBpZiAoaXRlbSAmJiBpdGVtLmNhbnZhcykge1xuICAgICAgICBpdGVtID0gaXRlbS5jYW52YXM7XG4gICAgfVxuICAgIHJldHVybiBpdGVtO1xufVxuY29uc3QgaW5zdGFuY2VzID0ge307XG5jb25zdCBnZXRDaGFydCA9IChrZXkpPT57XG4gICAgY29uc3QgY2FudmFzID0gZ2V0Q2FudmFzKGtleSk7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXMoaW5zdGFuY2VzKS5maWx0ZXIoKGMpPT5jLmNhbnZhcyA9PT0gY2FudmFzKS5wb3AoKTtcbn07XG5mdW5jdGlvbiBtb3ZlTnVtZXJpY0tleXMob2JqLCBzdGFydCwgbW92ZSkge1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpe1xuICAgICAgICBjb25zdCBpbnRLZXkgPSAra2V5O1xuICAgICAgICBpZiAoaW50S2V5ID49IHN0YXJ0KSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IG9ialtrZXldO1xuICAgICAgICAgICAgZGVsZXRlIG9ialtrZXldO1xuICAgICAgICAgICAgaWYgKG1vdmUgPiAwIHx8IGludEtleSA+IHN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgb2JqW2ludEtleSArIG1vdmVdID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4gZnVuY3Rpb24gZGV0ZXJtaW5lTGFzdEV2ZW50KGUsIGxhc3RFdmVudCwgaW5DaGFydEFyZWEsIGlzQ2xpY2spIHtcbiAgICBpZiAoIWluQ2hhcnRBcmVhIHx8IGUudHlwZSA9PT0gJ21vdXNlb3V0Jykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKGlzQ2xpY2spIHtcbiAgICAgICAgcmV0dXJuIGxhc3RFdmVudDtcbiAgICB9XG4gICAgcmV0dXJuIGU7XG59XG5mdW5jdGlvbiBnZXRTaXplRm9yQXJlYShzY2FsZSwgY2hhcnRBcmVhLCBmaWVsZCkge1xuICAgIHJldHVybiBzY2FsZS5vcHRpb25zLmNsaXAgPyBzY2FsZVtmaWVsZF0gOiBjaGFydEFyZWFbZmllbGRdO1xufVxuZnVuY3Rpb24gZ2V0RGF0YXNldEFyZWEobWV0YSwgY2hhcnRBcmVhKSB7XG4gICAgY29uc3QgeyB4U2NhbGUgLCB5U2NhbGUgIH0gPSBtZXRhO1xuICAgIGlmICh4U2NhbGUgJiYgeVNjYWxlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsZWZ0OiBnZXRTaXplRm9yQXJlYSh4U2NhbGUsIGNoYXJ0QXJlYSwgJ2xlZnQnKSxcbiAgICAgICAgICAgIHJpZ2h0OiBnZXRTaXplRm9yQXJlYSh4U2NhbGUsIGNoYXJ0QXJlYSwgJ3JpZ2h0JyksXG4gICAgICAgICAgICB0b3A6IGdldFNpemVGb3JBcmVhKHlTY2FsZSwgY2hhcnRBcmVhLCAndG9wJyksXG4gICAgICAgICAgICBib3R0b206IGdldFNpemVGb3JBcmVhKHlTY2FsZSwgY2hhcnRBcmVhLCAnYm90dG9tJylcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIGNoYXJ0QXJlYTtcbn1cbmNsYXNzIENoYXJ0IHtcbiAgICBzdGF0aWMgZGVmYXVsdHMgPSBkZWZhdWx0cztcbiAgICBzdGF0aWMgaW5zdGFuY2VzID0gaW5zdGFuY2VzO1xuICAgIHN0YXRpYyBvdmVycmlkZXMgPSBvdmVycmlkZXM7XG4gICAgc3RhdGljIHJlZ2lzdHJ5ID0gcmVnaXN0cnk7XG4gICAgc3RhdGljIHZlcnNpb24gPSB2ZXJzaW9uO1xuICAgIHN0YXRpYyBnZXRDaGFydCA9IGdldENoYXJ0O1xuICAgIHN0YXRpYyByZWdpc3RlciguLi5pdGVtcykge1xuICAgICAgICByZWdpc3RyeS5hZGQoLi4uaXRlbXMpO1xuICAgICAgICBpbnZhbGlkYXRlUGx1Z2lucygpO1xuICAgIH1cbiAgICBzdGF0aWMgdW5yZWdpc3RlciguLi5pdGVtcykge1xuICAgICAgICByZWdpc3RyeS5yZW1vdmUoLi4uaXRlbXMpO1xuICAgICAgICBpbnZhbGlkYXRlUGx1Z2lucygpO1xuICAgIH1cbiAgICBjb25zdHJ1Y3RvcihpdGVtLCB1c2VyQ29uZmlnKXtcbiAgICAgICAgY29uc3QgY29uZmlnID0gdGhpcy5jb25maWcgPSBuZXcgQ29uZmlnKHVzZXJDb25maWcpO1xuICAgICAgICBjb25zdCBpbml0aWFsQ2FudmFzID0gZ2V0Q2FudmFzKGl0ZW0pO1xuICAgICAgICBjb25zdCBleGlzdGluZ0NoYXJ0ID0gZ2V0Q2hhcnQoaW5pdGlhbENhbnZhcyk7XG4gICAgICAgIGlmIChleGlzdGluZ0NoYXJ0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhbnZhcyBpcyBhbHJlYWR5IGluIHVzZS4gQ2hhcnQgd2l0aCBJRCBcXCcnICsgZXhpc3RpbmdDaGFydC5pZCArICdcXCcnICsgJyBtdXN0IGJlIGRlc3Ryb3llZCBiZWZvcmUgdGhlIGNhbnZhcyB3aXRoIElEIFxcJycgKyBleGlzdGluZ0NoYXJ0LmNhbnZhcy5pZCArICdcXCcgY2FuIGJlIHJldXNlZC4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcHRpb25zID0gY29uZmlnLmNyZWF0ZVJlc29sdmVyKGNvbmZpZy5jaGFydE9wdGlvblNjb3BlcygpLCB0aGlzLmdldENvbnRleHQoKSk7XG4gICAgICAgIHRoaXMucGxhdGZvcm0gPSBuZXcgKGNvbmZpZy5wbGF0Zm9ybSB8fCBfZGV0ZWN0UGxhdGZvcm0oaW5pdGlhbENhbnZhcykpKCk7XG4gICAgICAgIHRoaXMucGxhdGZvcm0udXBkYXRlQ29uZmlnKGNvbmZpZyk7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLnBsYXRmb3JtLmFjcXVpcmVDb250ZXh0KGluaXRpYWxDYW52YXMsIG9wdGlvbnMuYXNwZWN0UmF0aW8pO1xuICAgICAgICBjb25zdCBjYW52YXMgPSBjb250ZXh0ICYmIGNvbnRleHQuY2FudmFzO1xuICAgICAgICBjb25zdCBoZWlnaHQgPSBjYW52YXMgJiYgY2FudmFzLmhlaWdodDtcbiAgICAgICAgY29uc3Qgd2lkdGggPSBjYW52YXMgJiYgY2FudmFzLndpZHRoO1xuICAgICAgICB0aGlzLmlkID0gdWlkKCk7XG4gICAgICAgIHRoaXMuY3R4ID0gY29udGV4dDtcbiAgICAgICAgdGhpcy5jYW52YXMgPSBjYW52YXM7XG4gICAgICAgIHRoaXMud2lkdGggPSB3aWR0aDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICB0aGlzLl9hc3BlY3RSYXRpbyA9IHRoaXMuYXNwZWN0UmF0aW87XG4gICAgICAgIHRoaXMuX2xheWVycyA9IFtdO1xuICAgICAgICB0aGlzLl9tZXRhc2V0cyA9IFtdO1xuICAgICAgICB0aGlzLl9zdGFja3MgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuYm94ZXMgPSBbXTtcbiAgICAgICAgdGhpcy5jdXJyZW50RGV2aWNlUGl4ZWxSYXRpbyA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5jaGFydEFyZWEgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX2FjdGl2ZSA9IFtdO1xuICAgICAgICB0aGlzLl9sYXN0RXZlbnQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX2xpc3RlbmVycyA9IHt9O1xuICAgICAgICAgdGhpcy5fcmVzcG9uc2l2ZUxpc3RlbmVycyA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fc29ydGVkTWV0YXNldHMgPSBbXTtcbiAgICAgICAgdGhpcy5zY2FsZXMgPSB7fTtcbiAgICAgICAgdGhpcy5fcGx1Z2lucyA9IG5ldyBQbHVnaW5TZXJ2aWNlKCk7XG4gICAgICAgIHRoaXMuJHByb3hpZXMgPSB7fTtcbiAgICAgICAgdGhpcy5faGlkZGVuSW5kaWNlcyA9IHt9O1xuICAgICAgICB0aGlzLmF0dGFjaGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2FuaW1hdGlvbnNEaXNhYmxlZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy4kY29udGV4dCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fZG9SZXNpemUgPSBkZWJvdW5jZSgobW9kZSk9PnRoaXMudXBkYXRlKG1vZGUpLCBvcHRpb25zLnJlc2l6ZURlbGF5IHx8IDApO1xuICAgICAgICB0aGlzLl9kYXRhQ2hhbmdlcyA9IFtdO1xuICAgICAgICBpbnN0YW5jZXNbdGhpcy5pZF0gPSB0aGlzO1xuICAgICAgICBpZiAoIWNvbnRleHQgfHwgIWNhbnZhcykge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkZhaWxlZCB0byBjcmVhdGUgY2hhcnQ6IGNhbid0IGFjcXVpcmUgY29udGV4dCBmcm9tIHRoZSBnaXZlbiBpdGVtXCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGFuaW1hdG9yLmxpc3Rlbih0aGlzLCAnY29tcGxldGUnLCBvbkFuaW1hdGlvbnNDb21wbGV0ZSk7XG4gICAgICAgIGFuaW1hdG9yLmxpc3Rlbih0aGlzLCAncHJvZ3Jlc3MnLCBvbkFuaW1hdGlvblByb2dyZXNzKTtcbiAgICAgICAgdGhpcy5faW5pdGlhbGl6ZSgpO1xuICAgICAgICBpZiAodGhpcy5hdHRhY2hlZCkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgYXNwZWN0UmF0aW8oKSB7XG4gICAgICAgIGNvbnN0IHsgb3B0aW9uczogeyBhc3BlY3RSYXRpbyAsIG1haW50YWluQXNwZWN0UmF0aW8gIH0gLCB3aWR0aCAsIGhlaWdodCAsIF9hc3BlY3RSYXRpbyAgfSA9IHRoaXM7XG4gICAgICAgIGlmICghaXNOdWxsT3JVbmRlZihhc3BlY3RSYXRpbykpIHtcbiAgICAgICAgICAgIHJldHVybiBhc3BlY3RSYXRpbztcbiAgICAgICAgfVxuICAgICAgICBpZiAobWFpbnRhaW5Bc3BlY3RSYXRpbyAmJiBfYXNwZWN0UmF0aW8pIHtcbiAgICAgICAgICAgIHJldHVybiBfYXNwZWN0UmF0aW87XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhlaWdodCA/IHdpZHRoIC8gaGVpZ2h0IDogbnVsbDtcbiAgICB9XG4gICAgZ2V0IGRhdGEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbmZpZy5kYXRhO1xuICAgIH1cbiAgICBzZXQgZGF0YShkYXRhKSB7XG4gICAgICAgIHRoaXMuY29uZmlnLmRhdGEgPSBkYXRhO1xuICAgIH1cbiAgICBnZXQgb3B0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29wdGlvbnM7XG4gICAgfVxuICAgIHNldCBvcHRpb25zKG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgfVxuICAgIGdldCByZWdpc3RyeSgpIHtcbiAgICAgICAgcmV0dXJuIHJlZ2lzdHJ5O1xuICAgIH1cbiBfaW5pdGlhbGl6ZSgpIHtcbiAgICAgICAgdGhpcy5ub3RpZnlQbHVnaW5zKCdiZWZvcmVJbml0Jyk7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMucmVzcG9uc2l2ZSkge1xuICAgICAgICAgICAgdGhpcy5yZXNpemUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldGluYVNjYWxlKHRoaXMsIHRoaXMub3B0aW9ucy5kZXZpY2VQaXhlbFJhdGlvKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJpbmRFdmVudHMoKTtcbiAgICAgICAgdGhpcy5ub3RpZnlQbHVnaW5zKCdhZnRlckluaXQnKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGNsZWFyKCkge1xuICAgICAgICBjbGVhckNhbnZhcyh0aGlzLmNhbnZhcywgdGhpcy5jdHgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgc3RvcCgpIHtcbiAgICAgICAgYW5pbWF0b3Iuc3RvcCh0aGlzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuIHJlc2l6ZSh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICAgIGlmICghYW5pbWF0b3IucnVubmluZyh0aGlzKSkge1xuICAgICAgICAgICAgdGhpcy5fcmVzaXplKHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fcmVzaXplQmVmb3JlRHJhdyA9IHtcbiAgICAgICAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICAgICAgICBoZWlnaHRcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgX3Jlc2l6ZSh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIGNvbnN0IGNhbnZhcyA9IHRoaXMuY2FudmFzO1xuICAgICAgICBjb25zdCBhc3BlY3RSYXRpbyA9IG9wdGlvbnMubWFpbnRhaW5Bc3BlY3RSYXRpbyAmJiB0aGlzLmFzcGVjdFJhdGlvO1xuICAgICAgICBjb25zdCBuZXdTaXplID0gdGhpcy5wbGF0Zm9ybS5nZXRNYXhpbXVtU2l6ZShjYW52YXMsIHdpZHRoLCBoZWlnaHQsIGFzcGVjdFJhdGlvKTtcbiAgICAgICAgY29uc3QgbmV3UmF0aW8gPSBvcHRpb25zLmRldmljZVBpeGVsUmF0aW8gfHwgdGhpcy5wbGF0Zm9ybS5nZXREZXZpY2VQaXhlbFJhdGlvKCk7XG4gICAgICAgIGNvbnN0IG1vZGUgPSB0aGlzLndpZHRoID8gJ3Jlc2l6ZScgOiAnYXR0YWNoJztcbiAgICAgICAgdGhpcy53aWR0aCA9IG5ld1NpemUud2lkdGg7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gbmV3U2l6ZS5oZWlnaHQ7XG4gICAgICAgIHRoaXMuX2FzcGVjdFJhdGlvID0gdGhpcy5hc3BlY3RSYXRpbztcbiAgICAgICAgaWYgKCFyZXRpbmFTY2FsZSh0aGlzLCBuZXdSYXRpbywgdHJ1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5vdGlmeVBsdWdpbnMoJ3Jlc2l6ZScsIHtcbiAgICAgICAgICAgIHNpemU6IG5ld1NpemVcbiAgICAgICAgfSk7XG4gICAgICAgIGNhbGxiYWNrKG9wdGlvbnMub25SZXNpemUsIFtcbiAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICBuZXdTaXplXG4gICAgICAgIF0sIHRoaXMpO1xuICAgICAgICBpZiAodGhpcy5hdHRhY2hlZCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2RvUmVzaXplKG1vZGUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBlbnN1cmVTY2FsZXNIYXZlSURzKCkge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgICAgICBjb25zdCBzY2FsZXNPcHRpb25zID0gb3B0aW9ucy5zY2FsZXMgfHwge307XG4gICAgICAgIGVhY2goc2NhbGVzT3B0aW9ucywgKGF4aXNPcHRpb25zLCBheGlzSUQpPT57XG4gICAgICAgICAgICBheGlzT3B0aW9ucy5pZCA9IGF4aXNJRDtcbiAgICAgICAgfSk7XG4gICAgfVxuIGJ1aWxkT3JVcGRhdGVTY2FsZXMoKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIGNvbnN0IHNjYWxlT3B0cyA9IG9wdGlvbnMuc2NhbGVzO1xuICAgICAgICBjb25zdCBzY2FsZXMgPSB0aGlzLnNjYWxlcztcbiAgICAgICAgY29uc3QgdXBkYXRlZCA9IE9iamVjdC5rZXlzKHNjYWxlcykucmVkdWNlKChvYmosIGlkKT0+e1xuICAgICAgICAgICAgb2JqW2lkXSA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIG9iajtcbiAgICAgICAgfSwge30pO1xuICAgICAgICBsZXQgaXRlbXMgPSBbXTtcbiAgICAgICAgaWYgKHNjYWxlT3B0cykge1xuICAgICAgICAgICAgaXRlbXMgPSBpdGVtcy5jb25jYXQoT2JqZWN0LmtleXMoc2NhbGVPcHRzKS5tYXAoKGlkKT0+e1xuICAgICAgICAgICAgICAgIGNvbnN0IHNjYWxlT3B0aW9ucyA9IHNjYWxlT3B0c1tpZF07XG4gICAgICAgICAgICAgICAgY29uc3QgYXhpcyA9IGRldGVybWluZUF4aXMoaWQsIHNjYWxlT3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNSYWRpYWwgPSBheGlzID09PSAncic7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNIb3Jpem9udGFsID0gYXhpcyA9PT0gJ3gnO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IHNjYWxlT3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgZHBvc2l0aW9uOiBpc1JhZGlhbCA/ICdjaGFydEFyZWEnIDogaXNIb3Jpem9udGFsID8gJ2JvdHRvbScgOiAnbGVmdCcsXG4gICAgICAgICAgICAgICAgICAgIGR0eXBlOiBpc1JhZGlhbCA/ICdyYWRpYWxMaW5lYXInIDogaXNIb3Jpem9udGFsID8gJ2NhdGVnb3J5JyA6ICdsaW5lYXInXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBlYWNoKGl0ZW1zLCAoaXRlbSk9PntcbiAgICAgICAgICAgIGNvbnN0IHNjYWxlT3B0aW9ucyA9IGl0ZW0ub3B0aW9ucztcbiAgICAgICAgICAgIGNvbnN0IGlkID0gc2NhbGVPcHRpb25zLmlkO1xuICAgICAgICAgICAgY29uc3QgYXhpcyA9IGRldGVybWluZUF4aXMoaWQsIHNjYWxlT3B0aW9ucyk7XG4gICAgICAgICAgICBjb25zdCBzY2FsZVR5cGUgPSB2YWx1ZU9yRGVmYXVsdChzY2FsZU9wdGlvbnMudHlwZSwgaXRlbS5kdHlwZSk7XG4gICAgICAgICAgICBpZiAoc2NhbGVPcHRpb25zLnBvc2l0aW9uID09PSB1bmRlZmluZWQgfHwgcG9zaXRpb25Jc0hvcml6b250YWwoc2NhbGVPcHRpb25zLnBvc2l0aW9uLCBheGlzKSAhPT0gcG9zaXRpb25Jc0hvcml6b250YWwoaXRlbS5kcG9zaXRpb24pKSB7XG4gICAgICAgICAgICAgICAgc2NhbGVPcHRpb25zLnBvc2l0aW9uID0gaXRlbS5kcG9zaXRpb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB1cGRhdGVkW2lkXSA9IHRydWU7XG4gICAgICAgICAgICBsZXQgc2NhbGUgPSBudWxsO1xuICAgICAgICAgICAgaWYgKGlkIGluIHNjYWxlcyAmJiBzY2FsZXNbaWRdLnR5cGUgPT09IHNjYWxlVHlwZSkge1xuICAgICAgICAgICAgICAgIHNjYWxlID0gc2NhbGVzW2lkXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2NhbGVDbGFzcyA9IHJlZ2lzdHJ5LmdldFNjYWxlKHNjYWxlVHlwZSk7XG4gICAgICAgICAgICAgICAgc2NhbGUgPSBuZXcgc2NhbGVDbGFzcyh7XG4gICAgICAgICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBzY2FsZVR5cGUsXG4gICAgICAgICAgICAgICAgICAgIGN0eDogdGhpcy5jdHgsXG4gICAgICAgICAgICAgICAgICAgIGNoYXJ0OiB0aGlzXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgc2NhbGVzW3NjYWxlLmlkXSA9IHNjYWxlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2NhbGUuaW5pdChzY2FsZU9wdGlvbnMsIG9wdGlvbnMpO1xuICAgICAgICB9KTtcbiAgICAgICAgZWFjaCh1cGRhdGVkLCAoaGFzVXBkYXRlZCwgaWQpPT57XG4gICAgICAgICAgICBpZiAoIWhhc1VwZGF0ZWQpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgc2NhbGVzW2lkXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGVhY2goc2NhbGVzLCAoc2NhbGUpPT57XG4gICAgICAgICAgICBsYXlvdXRzLmNvbmZpZ3VyZSh0aGlzLCBzY2FsZSwgc2NhbGUub3B0aW9ucyk7XG4gICAgICAgICAgICBsYXlvdXRzLmFkZEJveCh0aGlzLCBzY2FsZSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiBfdXBkYXRlTWV0YXNldHMoKSB7XG4gICAgICAgIGNvbnN0IG1ldGFzZXRzID0gdGhpcy5fbWV0YXNldHM7XG4gICAgICAgIGNvbnN0IG51bURhdGEgPSB0aGlzLmRhdGEuZGF0YXNldHMubGVuZ3RoO1xuICAgICAgICBjb25zdCBudW1NZXRhID0gbWV0YXNldHMubGVuZ3RoO1xuICAgICAgICBtZXRhc2V0cy5zb3J0KChhLCBiKT0+YS5pbmRleCAtIGIuaW5kZXgpO1xuICAgICAgICBpZiAobnVtTWV0YSA+IG51bURhdGEpIHtcbiAgICAgICAgICAgIGZvcihsZXQgaSA9IG51bURhdGE7IGkgPCBudW1NZXRhOyArK2kpe1xuICAgICAgICAgICAgICAgIHRoaXMuX2Rlc3Ryb3lEYXRhc2V0TWV0YShpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1ldGFzZXRzLnNwbGljZShudW1EYXRhLCBudW1NZXRhIC0gbnVtRGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc29ydGVkTWV0YXNldHMgPSBtZXRhc2V0cy5zbGljZSgwKS5zb3J0KGNvbXBhcmUyTGV2ZWwoJ29yZGVyJywgJ2luZGV4JykpO1xuICAgIH1cbiBfcmVtb3ZlVW5yZWZlcmVuY2VkTWV0YXNldHMoKSB7XG4gICAgICAgIGNvbnN0IHsgX21ldGFzZXRzOiBtZXRhc2V0cyAsIGRhdGE6IHsgZGF0YXNldHMgIH0gIH0gPSB0aGlzO1xuICAgICAgICBpZiAobWV0YXNldHMubGVuZ3RoID4gZGF0YXNldHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fc3RhY2tzO1xuICAgICAgICB9XG4gICAgICAgIG1ldGFzZXRzLmZvckVhY2goKG1ldGEsIGluZGV4KT0+e1xuICAgICAgICAgICAgaWYgKGRhdGFzZXRzLmZpbHRlcigoeCk9PnggPT09IG1ldGEuX2RhdGFzZXQpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2Rlc3Ryb3lEYXRhc2V0TWV0YShpbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBidWlsZE9yVXBkYXRlQ29udHJvbGxlcnMoKSB7XG4gICAgICAgIGNvbnN0IG5ld0NvbnRyb2xsZXJzID0gW107XG4gICAgICAgIGNvbnN0IGRhdGFzZXRzID0gdGhpcy5kYXRhLmRhdGFzZXRzO1xuICAgICAgICBsZXQgaSwgaWxlbjtcbiAgICAgICAgdGhpcy5fcmVtb3ZlVW5yZWZlcmVuY2VkTWV0YXNldHMoKTtcbiAgICAgICAgZm9yKGkgPSAwLCBpbGVuID0gZGF0YXNldHMubGVuZ3RoOyBpIDwgaWxlbjsgaSsrKXtcbiAgICAgICAgICAgIGNvbnN0IGRhdGFzZXQgPSBkYXRhc2V0c1tpXTtcbiAgICAgICAgICAgIGxldCBtZXRhID0gdGhpcy5nZXREYXRhc2V0TWV0YShpKTtcbiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBkYXRhc2V0LnR5cGUgfHwgdGhpcy5jb25maWcudHlwZTtcbiAgICAgICAgICAgIGlmIChtZXRhLnR5cGUgJiYgbWV0YS50eXBlICE9PSB0eXBlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZGVzdHJveURhdGFzZXRNZXRhKGkpO1xuICAgICAgICAgICAgICAgIG1ldGEgPSB0aGlzLmdldERhdGFzZXRNZXRhKGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbWV0YS50eXBlID0gdHlwZTtcbiAgICAgICAgICAgIG1ldGEuaW5kZXhBeGlzID0gZGF0YXNldC5pbmRleEF4aXMgfHwgZ2V0SW5kZXhBeGlzKHR5cGUsIHRoaXMub3B0aW9ucyk7XG4gICAgICAgICAgICBtZXRhLm9yZGVyID0gZGF0YXNldC5vcmRlciB8fCAwO1xuICAgICAgICAgICAgbWV0YS5pbmRleCA9IGk7XG4gICAgICAgICAgICBtZXRhLmxhYmVsID0gJycgKyBkYXRhc2V0LmxhYmVsO1xuICAgICAgICAgICAgbWV0YS52aXNpYmxlID0gdGhpcy5pc0RhdGFzZXRWaXNpYmxlKGkpO1xuICAgICAgICAgICAgaWYgKG1ldGEuY29udHJvbGxlcikge1xuICAgICAgICAgICAgICAgIG1ldGEuY29udHJvbGxlci51cGRhdGVJbmRleChpKTtcbiAgICAgICAgICAgICAgICBtZXRhLmNvbnRyb2xsZXIubGlua1NjYWxlcygpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBDb250cm9sbGVyQ2xhc3MgPSByZWdpc3RyeS5nZXRDb250cm9sbGVyKHR5cGUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgZGF0YXNldEVsZW1lbnRUeXBlICwgZGF0YUVsZW1lbnRUeXBlICB9ID0gZGVmYXVsdHMuZGF0YXNldHNbdHlwZV07XG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihDb250cm9sbGVyQ2xhc3MsIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YUVsZW1lbnRUeXBlOiByZWdpc3RyeS5nZXRFbGVtZW50KGRhdGFFbGVtZW50VHlwZSksXG4gICAgICAgICAgICAgICAgICAgIGRhdGFzZXRFbGVtZW50VHlwZTogZGF0YXNldEVsZW1lbnRUeXBlICYmIHJlZ2lzdHJ5LmdldEVsZW1lbnQoZGF0YXNldEVsZW1lbnRUeXBlKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIG1ldGEuY29udHJvbGxlciA9IG5ldyBDb250cm9sbGVyQ2xhc3ModGhpcywgaSk7XG4gICAgICAgICAgICAgICAgbmV3Q29udHJvbGxlcnMucHVzaChtZXRhLmNvbnRyb2xsZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3VwZGF0ZU1ldGFzZXRzKCk7XG4gICAgICAgIHJldHVybiBuZXdDb250cm9sbGVycztcbiAgICB9XG4gX3Jlc2V0RWxlbWVudHMoKSB7XG4gICAgICAgIGVhY2godGhpcy5kYXRhLmRhdGFzZXRzLCAoZGF0YXNldCwgZGF0YXNldEluZGV4KT0+e1xuICAgICAgICAgICAgdGhpcy5nZXREYXRhc2V0TWV0YShkYXRhc2V0SW5kZXgpLmNvbnRyb2xsZXIucmVzZXQoKTtcbiAgICAgICAgfSwgdGhpcyk7XG4gICAgfVxuIHJlc2V0KCkge1xuICAgICAgICB0aGlzLl9yZXNldEVsZW1lbnRzKCk7XG4gICAgICAgIHRoaXMubm90aWZ5UGx1Z2lucygncmVzZXQnKTtcbiAgICB9XG4gICAgdXBkYXRlKG1vZGUpIHtcbiAgICAgICAgY29uc3QgY29uZmlnID0gdGhpcy5jb25maWc7XG4gICAgICAgIGNvbmZpZy51cGRhdGUoKTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuX29wdGlvbnMgPSBjb25maWcuY3JlYXRlUmVzb2x2ZXIoY29uZmlnLmNoYXJ0T3B0aW9uU2NvcGVzKCksIHRoaXMuZ2V0Q29udGV4dCgpKTtcbiAgICAgICAgY29uc3QgYW5pbXNEaXNhYmxlZCA9IHRoaXMuX2FuaW1hdGlvbnNEaXNhYmxlZCA9ICFvcHRpb25zLmFuaW1hdGlvbjtcbiAgICAgICAgdGhpcy5fdXBkYXRlU2NhbGVzKCk7XG4gICAgICAgIHRoaXMuX2NoZWNrRXZlbnRCaW5kaW5ncygpO1xuICAgICAgICB0aGlzLl91cGRhdGVIaWRkZW5JbmRpY2VzKCk7XG4gICAgICAgIHRoaXMuX3BsdWdpbnMuaW52YWxpZGF0ZSgpO1xuICAgICAgICBpZiAodGhpcy5ub3RpZnlQbHVnaW5zKCdiZWZvcmVVcGRhdGUnLCB7XG4gICAgICAgICAgICBtb2RlLFxuICAgICAgICAgICAgY2FuY2VsYWJsZTogdHJ1ZVxuICAgICAgICB9KSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXdDb250cm9sbGVycyA9IHRoaXMuYnVpbGRPclVwZGF0ZUNvbnRyb2xsZXJzKCk7XG4gICAgICAgIHRoaXMubm90aWZ5UGx1Z2lucygnYmVmb3JlRWxlbWVudHNVcGRhdGUnKTtcbiAgICAgICAgbGV0IG1pblBhZGRpbmcgPSAwO1xuICAgICAgICBmb3IobGV0IGkgPSAwLCBpbGVuID0gdGhpcy5kYXRhLmRhdGFzZXRzLmxlbmd0aDsgaSA8IGlsZW47IGkrKyl7XG4gICAgICAgICAgICBjb25zdCB7IGNvbnRyb2xsZXIgIH0gPSB0aGlzLmdldERhdGFzZXRNZXRhKGkpO1xuICAgICAgICAgICAgY29uc3QgcmVzZXQgPSAhYW5pbXNEaXNhYmxlZCAmJiBuZXdDb250cm9sbGVycy5pbmRleE9mKGNvbnRyb2xsZXIpID09PSAtMTtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuYnVpbGRPclVwZGF0ZUVsZW1lbnRzKHJlc2V0KTtcbiAgICAgICAgICAgIG1pblBhZGRpbmcgPSBNYXRoLm1heCgrY29udHJvbGxlci5nZXRNYXhPdmVyZmxvdygpLCBtaW5QYWRkaW5nKTtcbiAgICAgICAgfVxuICAgICAgICBtaW5QYWRkaW5nID0gdGhpcy5fbWluUGFkZGluZyA9IG9wdGlvbnMubGF5b3V0LmF1dG9QYWRkaW5nID8gbWluUGFkZGluZyA6IDA7XG4gICAgICAgIHRoaXMuX3VwZGF0ZUxheW91dChtaW5QYWRkaW5nKTtcbiAgICAgICAgaWYgKCFhbmltc0Rpc2FibGVkKSB7XG4gICAgICAgICAgICBlYWNoKG5ld0NvbnRyb2xsZXJzLCAoY29udHJvbGxlcik9PntcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLnJlc2V0KCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl91cGRhdGVEYXRhc2V0cyhtb2RlKTtcbiAgICAgICAgdGhpcy5ub3RpZnlQbHVnaW5zKCdhZnRlclVwZGF0ZScsIHtcbiAgICAgICAgICAgIG1vZGVcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX2xheWVycy5zb3J0KGNvbXBhcmUyTGV2ZWwoJ3onLCAnX2lkeCcpKTtcbiAgICAgICAgY29uc3QgeyBfYWN0aXZlICwgX2xhc3RFdmVudCAgfSA9IHRoaXM7XG4gICAgICAgIGlmIChfbGFzdEV2ZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9ldmVudEhhbmRsZXIoX2xhc3RFdmVudCwgdHJ1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoX2FjdGl2ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUhvdmVyU3R5bGVzKF9hY3RpdmUsIF9hY3RpdmUsIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVuZGVyKCk7XG4gICAgfVxuIF91cGRhdGVTY2FsZXMoKSB7XG4gICAgICAgIGVhY2godGhpcy5zY2FsZXMsIChzY2FsZSk9PntcbiAgICAgICAgICAgIGxheW91dHMucmVtb3ZlQm94KHRoaXMsIHNjYWxlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZW5zdXJlU2NhbGVzSGF2ZUlEcygpO1xuICAgICAgICB0aGlzLmJ1aWxkT3JVcGRhdGVTY2FsZXMoKTtcbiAgICB9XG4gX2NoZWNrRXZlbnRCaW5kaW5ncygpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgY29uc3QgZXhpc3RpbmdFdmVudHMgPSBuZXcgU2V0KE9iamVjdC5rZXlzKHRoaXMuX2xpc3RlbmVycykpO1xuICAgICAgICBjb25zdCBuZXdFdmVudHMgPSBuZXcgU2V0KG9wdGlvbnMuZXZlbnRzKTtcbiAgICAgICAgaWYgKCFzZXRzRXF1YWwoZXhpc3RpbmdFdmVudHMsIG5ld0V2ZW50cykgfHwgISF0aGlzLl9yZXNwb25zaXZlTGlzdGVuZXJzICE9PSBvcHRpb25zLnJlc3BvbnNpdmUpIHtcbiAgICAgICAgICAgIHRoaXMudW5iaW5kRXZlbnRzKCk7XG4gICAgICAgICAgICB0aGlzLmJpbmRFdmVudHMoKTtcbiAgICAgICAgfVxuICAgIH1cbiBfdXBkYXRlSGlkZGVuSW5kaWNlcygpIHtcbiAgICAgICAgY29uc3QgeyBfaGlkZGVuSW5kaWNlcyAgfSA9IHRoaXM7XG4gICAgICAgIGNvbnN0IGNoYW5nZXMgPSB0aGlzLl9nZXRVbmlmb3JtRGF0YUNoYW5nZXMoKSB8fCBbXTtcbiAgICAgICAgZm9yIChjb25zdCB7IG1ldGhvZCAsIHN0YXJ0ICwgY291bnQgIH0gb2YgY2hhbmdlcyl7XG4gICAgICAgICAgICBjb25zdCBtb3ZlID0gbWV0aG9kID09PSAnX3JlbW92ZUVsZW1lbnRzJyA/IC1jb3VudCA6IGNvdW50O1xuICAgICAgICAgICAgbW92ZU51bWVyaWNLZXlzKF9oaWRkZW5JbmRpY2VzLCBzdGFydCwgbW92ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gX2dldFVuaWZvcm1EYXRhQ2hhbmdlcygpIHtcbiAgICAgICAgY29uc3QgX2RhdGFDaGFuZ2VzID0gdGhpcy5fZGF0YUNoYW5nZXM7XG4gICAgICAgIGlmICghX2RhdGFDaGFuZ2VzIHx8ICFfZGF0YUNoYW5nZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZGF0YUNoYW5nZXMgPSBbXTtcbiAgICAgICAgY29uc3QgZGF0YXNldENvdW50ID0gdGhpcy5kYXRhLmRhdGFzZXRzLmxlbmd0aDtcbiAgICAgICAgY29uc3QgbWFrZVNldCA9IChpZHgpPT5uZXcgU2V0KF9kYXRhQ2hhbmdlcy5maWx0ZXIoKGMpPT5jWzBdID09PSBpZHgpLm1hcCgoYywgaSk9PmkgKyAnLCcgKyBjLnNwbGljZSgxKS5qb2luKCcsJykpKTtcbiAgICAgICAgY29uc3QgY2hhbmdlU2V0ID0gbWFrZVNldCgwKTtcbiAgICAgICAgZm9yKGxldCBpID0gMTsgaSA8IGRhdGFzZXRDb3VudDsgaSsrKXtcbiAgICAgICAgICAgIGlmICghc2V0c0VxdWFsKGNoYW5nZVNldCwgbWFrZVNldChpKSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oY2hhbmdlU2V0KS5tYXAoKGMpPT5jLnNwbGl0KCcsJykpLm1hcCgoYSk9Pih7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiBhWzFdLFxuICAgICAgICAgICAgICAgIHN0YXJ0OiArYVsyXSxcbiAgICAgICAgICAgICAgICBjb3VudDogK2FbM11cbiAgICAgICAgICAgIH0pKTtcbiAgICB9XG4gX3VwZGF0ZUxheW91dChtaW5QYWRkaW5nKSB7XG4gICAgICAgIGlmICh0aGlzLm5vdGlmeVBsdWdpbnMoJ2JlZm9yZUxheW91dCcsIHtcbiAgICAgICAgICAgIGNhbmNlbGFibGU6IHRydWVcbiAgICAgICAgfSkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGF5b3V0cy51cGRhdGUodGhpcywgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHQsIG1pblBhZGRpbmcpO1xuICAgICAgICBjb25zdCBhcmVhID0gdGhpcy5jaGFydEFyZWE7XG4gICAgICAgIGNvbnN0IG5vQXJlYSA9IGFyZWEud2lkdGggPD0gMCB8fCBhcmVhLmhlaWdodCA8PSAwO1xuICAgICAgICB0aGlzLl9sYXllcnMgPSBbXTtcbiAgICAgICAgZWFjaCh0aGlzLmJveGVzLCAoYm94KT0+e1xuICAgICAgICAgICAgaWYgKG5vQXJlYSAmJiBib3gucG9zaXRpb24gPT09ICdjaGFydEFyZWEnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGJveC5jb25maWd1cmUpIHtcbiAgICAgICAgICAgICAgICBib3guY29uZmlndXJlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9sYXllcnMucHVzaCguLi5ib3guX2xheWVycygpKTtcbiAgICAgICAgfSwgdGhpcyk7XG4gICAgICAgIHRoaXMuX2xheWVycy5mb3JFYWNoKChpdGVtLCBpbmRleCk9PntcbiAgICAgICAgICAgIGl0ZW0uX2lkeCA9IGluZGV4O1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5ub3RpZnlQbHVnaW5zKCdhZnRlckxheW91dCcpO1xuICAgIH1cbiBfdXBkYXRlRGF0YXNldHMobW9kZSkge1xuICAgICAgICBpZiAodGhpcy5ub3RpZnlQbHVnaW5zKCdiZWZvcmVEYXRhc2V0c1VwZGF0ZScsIHtcbiAgICAgICAgICAgIG1vZGUsXG4gICAgICAgICAgICBjYW5jZWxhYmxlOiB0cnVlXG4gICAgICAgIH0pID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZvcihsZXQgaSA9IDAsIGlsZW4gPSB0aGlzLmRhdGEuZGF0YXNldHMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKXtcbiAgICAgICAgICAgIHRoaXMuZ2V0RGF0YXNldE1ldGEoaSkuY29udHJvbGxlci5jb25maWd1cmUoKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IobGV0IGkgPSAwLCBpbGVuID0gdGhpcy5kYXRhLmRhdGFzZXRzLmxlbmd0aDsgaSA8IGlsZW47ICsraSl7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVEYXRhc2V0KGksIGlzRnVuY3Rpb24obW9kZSkgPyBtb2RlKHtcbiAgICAgICAgICAgICAgICBkYXRhc2V0SW5kZXg6IGlcbiAgICAgICAgICAgIH0pIDogbW9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ub3RpZnlQbHVnaW5zKCdhZnRlckRhdGFzZXRzVXBkYXRlJywge1xuICAgICAgICAgICAgbW9kZVxuICAgICAgICB9KTtcbiAgICB9XG4gX3VwZGF0ZURhdGFzZXQoaW5kZXgsIG1vZGUpIHtcbiAgICAgICAgY29uc3QgbWV0YSA9IHRoaXMuZ2V0RGF0YXNldE1ldGEoaW5kZXgpO1xuICAgICAgICBjb25zdCBhcmdzID0ge1xuICAgICAgICAgICAgbWV0YSxcbiAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgbW9kZSxcbiAgICAgICAgICAgIGNhbmNlbGFibGU6IHRydWVcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHRoaXMubm90aWZ5UGx1Z2lucygnYmVmb3JlRGF0YXNldFVwZGF0ZScsIGFyZ3MpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIG1ldGEuY29udHJvbGxlci5fdXBkYXRlKG1vZGUpO1xuICAgICAgICBhcmdzLmNhbmNlbGFibGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5ub3RpZnlQbHVnaW5zKCdhZnRlckRhdGFzZXRVcGRhdGUnLCBhcmdzKTtcbiAgICB9XG4gICAgcmVuZGVyKCkge1xuICAgICAgICBpZiAodGhpcy5ub3RpZnlQbHVnaW5zKCdiZWZvcmVSZW5kZXInLCB7XG4gICAgICAgICAgICBjYW5jZWxhYmxlOiB0cnVlXG4gICAgICAgIH0pID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhbmltYXRvci5oYXModGhpcykpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmF0dGFjaGVkICYmICFhbmltYXRvci5ydW5uaW5nKHRoaXMpKSB7XG4gICAgICAgICAgICAgICAgYW5pbWF0b3Iuc3RhcnQodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRyYXcoKTtcbiAgICAgICAgICAgIG9uQW5pbWF0aW9uc0NvbXBsZXRlKHtcbiAgICAgICAgICAgICAgICBjaGFydDogdGhpc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZHJhdygpIHtcbiAgICAgICAgbGV0IGk7XG4gICAgICAgIGlmICh0aGlzLl9yZXNpemVCZWZvcmVEcmF3KSB7XG4gICAgICAgICAgICBjb25zdCB7IHdpZHRoICwgaGVpZ2h0ICB9ID0gdGhpcy5fcmVzaXplQmVmb3JlRHJhdztcbiAgICAgICAgICAgIHRoaXMuX3Jlc2l6ZSh3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgICAgIHRoaXMuX3Jlc2l6ZUJlZm9yZURyYXcgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgICAgaWYgKHRoaXMud2lkdGggPD0gMCB8fCB0aGlzLmhlaWdodCA8PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubm90aWZ5UGx1Z2lucygnYmVmb3JlRHJhdycsIHtcbiAgICAgICAgICAgIGNhbmNlbGFibGU6IHRydWVcbiAgICAgICAgfSkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbGF5ZXJzID0gdGhpcy5fbGF5ZXJzO1xuICAgICAgICBmb3IoaSA9IDA7IGkgPCBsYXllcnMubGVuZ3RoICYmIGxheWVyc1tpXS56IDw9IDA7ICsraSl7XG4gICAgICAgICAgICBsYXllcnNbaV0uZHJhdyh0aGlzLmNoYXJ0QXJlYSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZHJhd0RhdGFzZXRzKCk7XG4gICAgICAgIGZvcig7IGkgPCBsYXllcnMubGVuZ3RoOyArK2kpe1xuICAgICAgICAgICAgbGF5ZXJzW2ldLmRyYXcodGhpcy5jaGFydEFyZWEpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubm90aWZ5UGx1Z2lucygnYWZ0ZXJEcmF3Jyk7XG4gICAgfVxuIF9nZXRTb3J0ZWREYXRhc2V0TWV0YXMoZmlsdGVyVmlzaWJsZSkge1xuICAgICAgICBjb25zdCBtZXRhc2V0cyA9IHRoaXMuX3NvcnRlZE1ldGFzZXRzO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAgICAgbGV0IGksIGlsZW47XG4gICAgICAgIGZvcihpID0gMCwgaWxlbiA9IG1ldGFzZXRzLmxlbmd0aDsgaSA8IGlsZW47ICsraSl7XG4gICAgICAgICAgICBjb25zdCBtZXRhID0gbWV0YXNldHNbaV07XG4gICAgICAgICAgICBpZiAoIWZpbHRlclZpc2libGUgfHwgbWV0YS52aXNpYmxlKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobWV0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gZ2V0U29ydGVkVmlzaWJsZURhdGFzZXRNZXRhcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldFNvcnRlZERhdGFzZXRNZXRhcyh0cnVlKTtcbiAgICB9XG4gX2RyYXdEYXRhc2V0cygpIHtcbiAgICAgICAgaWYgKHRoaXMubm90aWZ5UGx1Z2lucygnYmVmb3JlRGF0YXNldHNEcmF3Jywge1xuICAgICAgICAgICAgY2FuY2VsYWJsZTogdHJ1ZVxuICAgICAgICB9KSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtZXRhc2V0cyA9IHRoaXMuZ2V0U29ydGVkVmlzaWJsZURhdGFzZXRNZXRhcygpO1xuICAgICAgICBmb3IobGV0IGkgPSBtZXRhc2V0cy5sZW5ndGggLSAxOyBpID49IDA7IC0taSl7XG4gICAgICAgICAgICB0aGlzLl9kcmF3RGF0YXNldChtZXRhc2V0c1tpXSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ub3RpZnlQbHVnaW5zKCdhZnRlckRhdGFzZXRzRHJhdycpO1xuICAgIH1cbiBfZHJhd0RhdGFzZXQobWV0YSkge1xuICAgICAgICBjb25zdCBjdHggPSB0aGlzLmN0eDtcbiAgICAgICAgY29uc3QgY2xpcCA9IG1ldGEuX2NsaXA7XG4gICAgICAgIGNvbnN0IHVzZUNsaXAgPSAhY2xpcC5kaXNhYmxlZDtcbiAgICAgICAgY29uc3QgYXJlYSA9IGdldERhdGFzZXRBcmVhKG1ldGEsIHRoaXMuY2hhcnRBcmVhKTtcbiAgICAgICAgY29uc3QgYXJncyA9IHtcbiAgICAgICAgICAgIG1ldGEsXG4gICAgICAgICAgICBpbmRleDogbWV0YS5pbmRleCxcbiAgICAgICAgICAgIGNhbmNlbGFibGU6IHRydWVcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHRoaXMubm90aWZ5UGx1Z2lucygnYmVmb3JlRGF0YXNldERyYXcnLCBhcmdzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodXNlQ2xpcCkge1xuICAgICAgICAgICAgY2xpcEFyZWEoY3R4LCB7XG4gICAgICAgICAgICAgICAgbGVmdDogY2xpcC5sZWZ0ID09PSBmYWxzZSA/IDAgOiBhcmVhLmxlZnQgLSBjbGlwLmxlZnQsXG4gICAgICAgICAgICAgICAgcmlnaHQ6IGNsaXAucmlnaHQgPT09IGZhbHNlID8gdGhpcy53aWR0aCA6IGFyZWEucmlnaHQgKyBjbGlwLnJpZ2h0LFxuICAgICAgICAgICAgICAgIHRvcDogY2xpcC50b3AgPT09IGZhbHNlID8gMCA6IGFyZWEudG9wIC0gY2xpcC50b3AsXG4gICAgICAgICAgICAgICAgYm90dG9tOiBjbGlwLmJvdHRvbSA9PT0gZmFsc2UgPyB0aGlzLmhlaWdodCA6IGFyZWEuYm90dG9tICsgY2xpcC5ib3R0b21cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIG1ldGEuY29udHJvbGxlci5kcmF3KCk7XG4gICAgICAgIGlmICh1c2VDbGlwKSB7XG4gICAgICAgICAgICB1bmNsaXBBcmVhKGN0eCk7XG4gICAgICAgIH1cbiAgICAgICAgYXJncy5jYW5jZWxhYmxlID0gZmFsc2U7XG4gICAgICAgIHRoaXMubm90aWZ5UGx1Z2lucygnYWZ0ZXJEYXRhc2V0RHJhdycsIGFyZ3MpO1xuICAgIH1cbiBpc1BvaW50SW5BcmVhKHBvaW50KSB7XG4gICAgICAgIHJldHVybiBfaXNQb2ludEluQXJlYShwb2ludCwgdGhpcy5jaGFydEFyZWEsIHRoaXMuX21pblBhZGRpbmcpO1xuICAgIH1cbiAgICBnZXRFbGVtZW50c0F0RXZlbnRGb3JNb2RlKGUsIG1vZGUsIG9wdGlvbnMsIHVzZUZpbmFsUG9zaXRpb24pIHtcbiAgICAgICAgY29uc3QgbWV0aG9kID0gSW50ZXJhY3Rpb24ubW9kZXNbbW9kZV07XG4gICAgICAgIGlmICh0eXBlb2YgbWV0aG9kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gbWV0aG9kKHRoaXMsIGUsIG9wdGlvbnMsIHVzZUZpbmFsUG9zaXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgZ2V0RGF0YXNldE1ldGEoZGF0YXNldEluZGV4KSB7XG4gICAgICAgIGNvbnN0IGRhdGFzZXQgPSB0aGlzLmRhdGEuZGF0YXNldHNbZGF0YXNldEluZGV4XTtcbiAgICAgICAgY29uc3QgbWV0YXNldHMgPSB0aGlzLl9tZXRhc2V0cztcbiAgICAgICAgbGV0IG1ldGEgPSBtZXRhc2V0cy5maWx0ZXIoKHgpPT54ICYmIHguX2RhdGFzZXQgPT09IGRhdGFzZXQpLnBvcCgpO1xuICAgICAgICBpZiAoIW1ldGEpIHtcbiAgICAgICAgICAgIG1ldGEgPSB7XG4gICAgICAgICAgICAgICAgdHlwZTogbnVsbCxcbiAgICAgICAgICAgICAgICBkYXRhOiBbXSxcbiAgICAgICAgICAgICAgICBkYXRhc2V0OiBudWxsLFxuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXI6IG51bGwsXG4gICAgICAgICAgICAgICAgaGlkZGVuOiBudWxsLFxuICAgICAgICAgICAgICAgIHhBeGlzSUQ6IG51bGwsXG4gICAgICAgICAgICAgICAgeUF4aXNJRDogbnVsbCxcbiAgICAgICAgICAgICAgICBvcmRlcjogZGF0YXNldCAmJiBkYXRhc2V0Lm9yZGVyIHx8IDAsXG4gICAgICAgICAgICAgICAgaW5kZXg6IGRhdGFzZXRJbmRleCxcbiAgICAgICAgICAgICAgICBfZGF0YXNldDogZGF0YXNldCxcbiAgICAgICAgICAgICAgICBfcGFyc2VkOiBbXSxcbiAgICAgICAgICAgICAgICBfc29ydGVkOiBmYWxzZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIG1ldGFzZXRzLnB1c2gobWV0YSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1ldGE7XG4gICAgfVxuICAgIGdldENvbnRleHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiRjb250ZXh0IHx8ICh0aGlzLiRjb250ZXh0ID0gY3JlYXRlQ29udGV4dChudWxsLCB7XG4gICAgICAgICAgICBjaGFydDogdGhpcyxcbiAgICAgICAgICAgIHR5cGU6ICdjaGFydCdcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBnZXRWaXNpYmxlRGF0YXNldENvdW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRTb3J0ZWRWaXNpYmxlRGF0YXNldE1ldGFzKCkubGVuZ3RoO1xuICAgIH1cbiAgICBpc0RhdGFzZXRWaXNpYmxlKGRhdGFzZXRJbmRleCkge1xuICAgICAgICBjb25zdCBkYXRhc2V0ID0gdGhpcy5kYXRhLmRhdGFzZXRzW2RhdGFzZXRJbmRleF07XG4gICAgICAgIGlmICghZGF0YXNldCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1ldGEgPSB0aGlzLmdldERhdGFzZXRNZXRhKGRhdGFzZXRJbmRleCk7XG4gICAgICAgIHJldHVybiB0eXBlb2YgbWV0YS5oaWRkZW4gPT09ICdib29sZWFuJyA/ICFtZXRhLmhpZGRlbiA6ICFkYXRhc2V0LmhpZGRlbjtcbiAgICB9XG4gICAgc2V0RGF0YXNldFZpc2liaWxpdHkoZGF0YXNldEluZGV4LCB2aXNpYmxlKSB7XG4gICAgICAgIGNvbnN0IG1ldGEgPSB0aGlzLmdldERhdGFzZXRNZXRhKGRhdGFzZXRJbmRleCk7XG4gICAgICAgIG1ldGEuaGlkZGVuID0gIXZpc2libGU7XG4gICAgfVxuICAgIHRvZ2dsZURhdGFWaXNpYmlsaXR5KGluZGV4KSB7XG4gICAgICAgIHRoaXMuX2hpZGRlbkluZGljZXNbaW5kZXhdID0gIXRoaXMuX2hpZGRlbkluZGljZXNbaW5kZXhdO1xuICAgIH1cbiAgICBnZXREYXRhVmlzaWJpbGl0eShpbmRleCkge1xuICAgICAgICByZXR1cm4gIXRoaXMuX2hpZGRlbkluZGljZXNbaW5kZXhdO1xuICAgIH1cbiBfdXBkYXRlVmlzaWJpbGl0eShkYXRhc2V0SW5kZXgsIGRhdGFJbmRleCwgdmlzaWJsZSkge1xuICAgICAgICBjb25zdCBtb2RlID0gdmlzaWJsZSA/ICdzaG93JyA6ICdoaWRlJztcbiAgICAgICAgY29uc3QgbWV0YSA9IHRoaXMuZ2V0RGF0YXNldE1ldGEoZGF0YXNldEluZGV4KTtcbiAgICAgICAgY29uc3QgYW5pbXMgPSBtZXRhLmNvbnRyb2xsZXIuX3Jlc29sdmVBbmltYXRpb25zKHVuZGVmaW5lZCwgbW9kZSk7XG4gICAgICAgIGlmIChkZWZpbmVkKGRhdGFJbmRleCkpIHtcbiAgICAgICAgICAgIG1ldGEuZGF0YVtkYXRhSW5kZXhdLmhpZGRlbiA9ICF2aXNpYmxlO1xuICAgICAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2V0RGF0YXNldFZpc2liaWxpdHkoZGF0YXNldEluZGV4LCB2aXNpYmxlKTtcbiAgICAgICAgICAgIGFuaW1zLnVwZGF0ZShtZXRhLCB7XG4gICAgICAgICAgICAgICAgdmlzaWJsZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSgoY3R4KT0+Y3R4LmRhdGFzZXRJbmRleCA9PT0gZGF0YXNldEluZGV4ID8gbW9kZSA6IHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaGlkZShkYXRhc2V0SW5kZXgsIGRhdGFJbmRleCkge1xuICAgICAgICB0aGlzLl91cGRhdGVWaXNpYmlsaXR5KGRhdGFzZXRJbmRleCwgZGF0YUluZGV4LCBmYWxzZSk7XG4gICAgfVxuICAgIHNob3coZGF0YXNldEluZGV4LCBkYXRhSW5kZXgpIHtcbiAgICAgICAgdGhpcy5fdXBkYXRlVmlzaWJpbGl0eShkYXRhc2V0SW5kZXgsIGRhdGFJbmRleCwgdHJ1ZSk7XG4gICAgfVxuIF9kZXN0cm95RGF0YXNldE1ldGEoZGF0YXNldEluZGV4KSB7XG4gICAgICAgIGNvbnN0IG1ldGEgPSB0aGlzLl9tZXRhc2V0c1tkYXRhc2V0SW5kZXhdO1xuICAgICAgICBpZiAobWV0YSAmJiBtZXRhLmNvbnRyb2xsZXIpIHtcbiAgICAgICAgICAgIG1ldGEuY29udHJvbGxlci5fZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9tZXRhc2V0c1tkYXRhc2V0SW5kZXhdO1xuICAgIH1cbiAgICBfc3RvcCgpIHtcbiAgICAgICAgbGV0IGksIGlsZW47XG4gICAgICAgIHRoaXMuc3RvcCgpO1xuICAgICAgICBhbmltYXRvci5yZW1vdmUodGhpcyk7XG4gICAgICAgIGZvcihpID0gMCwgaWxlbiA9IHRoaXMuZGF0YS5kYXRhc2V0cy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpe1xuICAgICAgICAgICAgdGhpcy5fZGVzdHJveURhdGFzZXRNZXRhKGkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMubm90aWZ5UGx1Z2lucygnYmVmb3JlRGVzdHJveScpO1xuICAgICAgICBjb25zdCB7IGNhbnZhcyAsIGN0eCAgfSA9IHRoaXM7XG4gICAgICAgIHRoaXMuX3N0b3AoKTtcbiAgICAgICAgdGhpcy5jb25maWcuY2xlYXJDYWNoZSgpO1xuICAgICAgICBpZiAoY2FudmFzKSB7XG4gICAgICAgICAgICB0aGlzLnVuYmluZEV2ZW50cygpO1xuICAgICAgICAgICAgY2xlYXJDYW52YXMoY2FudmFzLCBjdHgpO1xuICAgICAgICAgICAgdGhpcy5wbGF0Zm9ybS5yZWxlYXNlQ29udGV4dChjdHgpO1xuICAgICAgICAgICAgdGhpcy5jYW52YXMgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5jdHggPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGRlbGV0ZSBpbnN0YW5jZXNbdGhpcy5pZF07XG4gICAgICAgIHRoaXMubm90aWZ5UGx1Z2lucygnYWZ0ZXJEZXN0cm95Jyk7XG4gICAgfVxuICAgIHRvQmFzZTY0SW1hZ2UoLi4uYXJncykge1xuICAgICAgICByZXR1cm4gdGhpcy5jYW52YXMudG9EYXRhVVJMKC4uLmFyZ3MpO1xuICAgIH1cbiBiaW5kRXZlbnRzKCkge1xuICAgICAgICB0aGlzLmJpbmRVc2VyRXZlbnRzKCk7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMucmVzcG9uc2l2ZSkge1xuICAgICAgICAgICAgdGhpcy5iaW5kUmVzcG9uc2l2ZUV2ZW50cygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hdHRhY2hlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gYmluZFVzZXJFdmVudHMoKSB7XG4gICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVycztcbiAgICAgICAgY29uc3QgcGxhdGZvcm0gPSB0aGlzLnBsYXRmb3JtO1xuICAgICAgICBjb25zdCBfYWRkID0gKHR5cGUsIGxpc3RlbmVyKT0+e1xuICAgICAgICAgICAgcGxhdGZvcm0uYWRkRXZlbnRMaXN0ZW5lcih0aGlzLCB0eXBlLCBsaXN0ZW5lcik7XG4gICAgICAgICAgICBsaXN0ZW5lcnNbdHlwZV0gPSBsaXN0ZW5lcjtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgbGlzdGVuZXIgPSAoZSwgeCwgeSk9PntcbiAgICAgICAgICAgIGUub2Zmc2V0WCA9IHg7XG4gICAgICAgICAgICBlLm9mZnNldFkgPSB5O1xuICAgICAgICAgICAgdGhpcy5fZXZlbnRIYW5kbGVyKGUpO1xuICAgICAgICB9O1xuICAgICAgICBlYWNoKHRoaXMub3B0aW9ucy5ldmVudHMsICh0eXBlKT0+X2FkZCh0eXBlLCBsaXN0ZW5lcikpO1xuICAgIH1cbiBiaW5kUmVzcG9uc2l2ZUV2ZW50cygpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9yZXNwb25zaXZlTGlzdGVuZXJzKSB7XG4gICAgICAgICAgICB0aGlzLl9yZXNwb25zaXZlTGlzdGVuZXJzID0ge307XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5fcmVzcG9uc2l2ZUxpc3RlbmVycztcbiAgICAgICAgY29uc3QgcGxhdGZvcm0gPSB0aGlzLnBsYXRmb3JtO1xuICAgICAgICBjb25zdCBfYWRkID0gKHR5cGUsIGxpc3RlbmVyKT0+e1xuICAgICAgICAgICAgcGxhdGZvcm0uYWRkRXZlbnRMaXN0ZW5lcih0aGlzLCB0eXBlLCBsaXN0ZW5lcik7XG4gICAgICAgICAgICBsaXN0ZW5lcnNbdHlwZV0gPSBsaXN0ZW5lcjtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgX3JlbW92ZSA9ICh0eXBlLCBsaXN0ZW5lcik9PntcbiAgICAgICAgICAgIGlmIChsaXN0ZW5lcnNbdHlwZV0pIHtcbiAgICAgICAgICAgICAgICBwbGF0Zm9ybS5yZW1vdmVFdmVudExpc3RlbmVyKHRoaXMsIHR5cGUsIGxpc3RlbmVyKTtcbiAgICAgICAgICAgICAgICBkZWxldGUgbGlzdGVuZXJzW3R5cGVdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBsaXN0ZW5lciA9ICh3aWR0aCwgaGVpZ2h0KT0+e1xuICAgICAgICAgICAgaWYgKHRoaXMuY2FudmFzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXNpemUod2lkdGgsIGhlaWdodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGxldCBkZXRhY2hlZDtcbiAgICAgICAgY29uc3QgYXR0YWNoZWQgPSAoKT0+e1xuICAgICAgICAgICAgX3JlbW92ZSgnYXR0YWNoJywgYXR0YWNoZWQpO1xuICAgICAgICAgICAgdGhpcy5hdHRhY2hlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnJlc2l6ZSgpO1xuICAgICAgICAgICAgX2FkZCgncmVzaXplJywgbGlzdGVuZXIpO1xuICAgICAgICAgICAgX2FkZCgnZGV0YWNoJywgZGV0YWNoZWQpO1xuICAgICAgICB9O1xuICAgICAgICBkZXRhY2hlZCA9ICgpPT57XG4gICAgICAgICAgICB0aGlzLmF0dGFjaGVkID0gZmFsc2U7XG4gICAgICAgICAgICBfcmVtb3ZlKCdyZXNpemUnLCBsaXN0ZW5lcik7XG4gICAgICAgICAgICB0aGlzLl9zdG9wKCk7XG4gICAgICAgICAgICB0aGlzLl9yZXNpemUoMCwgMCk7XG4gICAgICAgICAgICBfYWRkKCdhdHRhY2gnLCBhdHRhY2hlZCk7XG4gICAgICAgIH07XG4gICAgICAgIGlmIChwbGF0Zm9ybS5pc0F0dGFjaGVkKHRoaXMuY2FudmFzKSkge1xuICAgICAgICAgICAgYXR0YWNoZWQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRldGFjaGVkKCk7XG4gICAgICAgIH1cbiAgICB9XG4gdW5iaW5kRXZlbnRzKCkge1xuICAgICAgICBlYWNoKHRoaXMuX2xpc3RlbmVycywgKGxpc3RlbmVyLCB0eXBlKT0+e1xuICAgICAgICAgICAgdGhpcy5wbGF0Zm9ybS5yZW1vdmVFdmVudExpc3RlbmVyKHRoaXMsIHR5cGUsIGxpc3RlbmVyKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX2xpc3RlbmVycyA9IHt9O1xuICAgICAgICBlYWNoKHRoaXMuX3Jlc3BvbnNpdmVMaXN0ZW5lcnMsIChsaXN0ZW5lciwgdHlwZSk9PntcbiAgICAgICAgICAgIHRoaXMucGxhdGZvcm0ucmVtb3ZlRXZlbnRMaXN0ZW5lcih0aGlzLCB0eXBlLCBsaXN0ZW5lcik7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9yZXNwb25zaXZlTGlzdGVuZXJzID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICB1cGRhdGVIb3ZlclN0eWxlKGl0ZW1zLCBtb2RlLCBlbmFibGVkKSB7XG4gICAgICAgIGNvbnN0IHByZWZpeCA9IGVuYWJsZWQgPyAnc2V0JyA6ICdyZW1vdmUnO1xuICAgICAgICBsZXQgbWV0YSwgaXRlbSwgaSwgaWxlbjtcbiAgICAgICAgaWYgKG1vZGUgPT09ICdkYXRhc2V0Jykge1xuICAgICAgICAgICAgbWV0YSA9IHRoaXMuZ2V0RGF0YXNldE1ldGEoaXRlbXNbMF0uZGF0YXNldEluZGV4KTtcbiAgICAgICAgICAgIG1ldGEuY29udHJvbGxlclsnXycgKyBwcmVmaXggKyAnRGF0YXNldEhvdmVyU3R5bGUnXSgpO1xuICAgICAgICB9XG4gICAgICAgIGZvcihpID0gMCwgaWxlbiA9IGl0ZW1zLmxlbmd0aDsgaSA8IGlsZW47ICsraSl7XG4gICAgICAgICAgICBpdGVtID0gaXRlbXNbaV07XG4gICAgICAgICAgICBjb25zdCBjb250cm9sbGVyID0gaXRlbSAmJiB0aGlzLmdldERhdGFzZXRNZXRhKGl0ZW0uZGF0YXNldEluZGV4KS5jb250cm9sbGVyO1xuICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIpIHtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyW3ByZWZpeCArICdIb3ZlclN0eWxlJ10oaXRlbS5lbGVtZW50LCBpdGVtLmRhdGFzZXRJbmRleCwgaXRlbS5pbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gZ2V0QWN0aXZlRWxlbWVudHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hY3RpdmUgfHwgW107XG4gICAgfVxuIHNldEFjdGl2ZUVsZW1lbnRzKGFjdGl2ZUVsZW1lbnRzKSB7XG4gICAgICAgIGNvbnN0IGxhc3RBY3RpdmUgPSB0aGlzLl9hY3RpdmUgfHwgW107XG4gICAgICAgIGNvbnN0IGFjdGl2ZSA9IGFjdGl2ZUVsZW1lbnRzLm1hcCgoeyBkYXRhc2V0SW5kZXggLCBpbmRleCAgfSk9PntcbiAgICAgICAgICAgIGNvbnN0IG1ldGEgPSB0aGlzLmdldERhdGFzZXRNZXRhKGRhdGFzZXRJbmRleCk7XG4gICAgICAgICAgICBpZiAoIW1ldGEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGRhdGFzZXQgZm91bmQgYXQgaW5kZXggJyArIGRhdGFzZXRJbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGRhdGFzZXRJbmRleCxcbiAgICAgICAgICAgICAgICBlbGVtZW50OiBtZXRhLmRhdGFbaW5kZXhdLFxuICAgICAgICAgICAgICAgIGluZGV4XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgY2hhbmdlZCA9ICFfZWxlbWVudHNFcXVhbChhY3RpdmUsIGxhc3RBY3RpdmUpO1xuICAgICAgICBpZiAoY2hhbmdlZCkge1xuICAgICAgICAgICAgdGhpcy5fYWN0aXZlID0gYWN0aXZlO1xuICAgICAgICAgICAgdGhpcy5fbGFzdEV2ZW50ID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUhvdmVyU3R5bGVzKGFjdGl2ZSwgbGFzdEFjdGl2ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gbm90aWZ5UGx1Z2lucyhob29rLCBhcmdzLCBmaWx0ZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BsdWdpbnMubm90aWZ5KHRoaXMsIGhvb2ssIGFyZ3MsIGZpbHRlcik7XG4gICAgfVxuIGlzUGx1Z2luRW5hYmxlZChwbHVnaW5JZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGx1Z2lucy5fY2FjaGUuZmlsdGVyKChwKT0+cC5wbHVnaW4uaWQgPT09IHBsdWdpbklkKS5sZW5ndGggPT09IDE7XG4gICAgfVxuIF91cGRhdGVIb3ZlclN0eWxlcyhhY3RpdmUsIGxhc3RBY3RpdmUsIHJlcGxheSkge1xuICAgICAgICBjb25zdCBob3Zlck9wdGlvbnMgPSB0aGlzLm9wdGlvbnMuaG92ZXI7XG4gICAgICAgIGNvbnN0IGRpZmYgPSAoYSwgYik9PmEuZmlsdGVyKCh4KT0+IWIuc29tZSgoeSk9PnguZGF0YXNldEluZGV4ID09PSB5LmRhdGFzZXRJbmRleCAmJiB4LmluZGV4ID09PSB5LmluZGV4KSk7XG4gICAgICAgIGNvbnN0IGRlYWN0aXZhdGVkID0gZGlmZihsYXN0QWN0aXZlLCBhY3RpdmUpO1xuICAgICAgICBjb25zdCBhY3RpdmF0ZWQgPSByZXBsYXkgPyBhY3RpdmUgOiBkaWZmKGFjdGl2ZSwgbGFzdEFjdGl2ZSk7XG4gICAgICAgIGlmIChkZWFjdGl2YXRlZC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlSG92ZXJTdHlsZShkZWFjdGl2YXRlZCwgaG92ZXJPcHRpb25zLm1vZGUsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYWN0aXZhdGVkLmxlbmd0aCAmJiBob3Zlck9wdGlvbnMubW9kZSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVIb3ZlclN0eWxlKGFjdGl2YXRlZCwgaG92ZXJPcHRpb25zLm1vZGUsIHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuIF9ldmVudEhhbmRsZXIoZSwgcmVwbGF5KSB7XG4gICAgICAgIGNvbnN0IGFyZ3MgPSB7XG4gICAgICAgICAgICBldmVudDogZSxcbiAgICAgICAgICAgIHJlcGxheSxcbiAgICAgICAgICAgIGNhbmNlbGFibGU6IHRydWUsXG4gICAgICAgICAgICBpbkNoYXJ0QXJlYTogdGhpcy5pc1BvaW50SW5BcmVhKGUpXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGV2ZW50RmlsdGVyID0gKHBsdWdpbik9PihwbHVnaW4ub3B0aW9ucy5ldmVudHMgfHwgdGhpcy5vcHRpb25zLmV2ZW50cykuaW5jbHVkZXMoZS5uYXRpdmUudHlwZSk7XG4gICAgICAgIGlmICh0aGlzLm5vdGlmeVBsdWdpbnMoJ2JlZm9yZUV2ZW50JywgYXJncywgZXZlbnRGaWx0ZXIpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNoYW5nZWQgPSB0aGlzLl9oYW5kbGVFdmVudChlLCByZXBsYXksIGFyZ3MuaW5DaGFydEFyZWEpO1xuICAgICAgICBhcmdzLmNhbmNlbGFibGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5ub3RpZnlQbHVnaW5zKCdhZnRlckV2ZW50JywgYXJncywgZXZlbnRGaWx0ZXIpO1xuICAgICAgICBpZiAoY2hhbmdlZCB8fCBhcmdzLmNoYW5nZWQpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuIF9oYW5kbGVFdmVudChlLCByZXBsYXksIGluQ2hhcnRBcmVhKSB7XG4gICAgICAgIGNvbnN0IHsgX2FjdGl2ZTogbGFzdEFjdGl2ZSA9IFtdICwgb3B0aW9ucyAgfSA9IHRoaXM7XG4gICAgICAgIGNvbnN0IHVzZUZpbmFsUG9zaXRpb24gPSByZXBsYXk7XG4gICAgICAgIGNvbnN0IGFjdGl2ZSA9IHRoaXMuX2dldEFjdGl2ZUVsZW1lbnRzKGUsIGxhc3RBY3RpdmUsIGluQ2hhcnRBcmVhLCB1c2VGaW5hbFBvc2l0aW9uKTtcbiAgICAgICAgY29uc3QgaXNDbGljayA9IF9pc0NsaWNrRXZlbnQoZSk7XG4gICAgICAgIGNvbnN0IGxhc3RFdmVudCA9IGRldGVybWluZUxhc3RFdmVudChlLCB0aGlzLl9sYXN0RXZlbnQsIGluQ2hhcnRBcmVhLCBpc0NsaWNrKTtcbiAgICAgICAgaWYgKGluQ2hhcnRBcmVhKSB7XG4gICAgICAgICAgICB0aGlzLl9sYXN0RXZlbnQgPSBudWxsO1xuICAgICAgICAgICAgY2FsbGJhY2sob3B0aW9ucy5vbkhvdmVyLCBbXG4gICAgICAgICAgICAgICAgZSxcbiAgICAgICAgICAgICAgICBhY3RpdmUsXG4gICAgICAgICAgICAgICAgdGhpc1xuICAgICAgICAgICAgXSwgdGhpcyk7XG4gICAgICAgICAgICBpZiAoaXNDbGljaykge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKG9wdGlvbnMub25DbGljaywgW1xuICAgICAgICAgICAgICAgICAgICBlLFxuICAgICAgICAgICAgICAgICAgICBhY3RpdmUsXG4gICAgICAgICAgICAgICAgICAgIHRoaXNcbiAgICAgICAgICAgICAgICBdLCB0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjaGFuZ2VkID0gIV9lbGVtZW50c0VxdWFsKGFjdGl2ZSwgbGFzdEFjdGl2ZSk7XG4gICAgICAgIGlmIChjaGFuZ2VkIHx8IHJlcGxheSkge1xuICAgICAgICAgICAgdGhpcy5fYWN0aXZlID0gYWN0aXZlO1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlSG92ZXJTdHlsZXMoYWN0aXZlLCBsYXN0QWN0aXZlLCByZXBsYXkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2xhc3RFdmVudCA9IGxhc3RFdmVudDtcbiAgICAgICAgcmV0dXJuIGNoYW5nZWQ7XG4gICAgfVxuIF9nZXRBY3RpdmVFbGVtZW50cyhlLCBsYXN0QWN0aXZlLCBpbkNoYXJ0QXJlYSwgdXNlRmluYWxQb3NpdGlvbikge1xuICAgICAgICBpZiAoZS50eXBlID09PSAnbW91c2VvdXQnKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpbkNoYXJ0QXJlYSkge1xuICAgICAgICAgICAgcmV0dXJuIGxhc3RBY3RpdmU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaG92ZXJPcHRpb25zID0gdGhpcy5vcHRpb25zLmhvdmVyO1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRFbGVtZW50c0F0RXZlbnRGb3JNb2RlKGUsIGhvdmVyT3B0aW9ucy5tb2RlLCBob3Zlck9wdGlvbnMsIHVzZUZpbmFsUG9zaXRpb24pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGludmFsaWRhdGVQbHVnaW5zKCkge1xuICAgIHJldHVybiBlYWNoKENoYXJ0Lmluc3RhbmNlcywgKGNoYXJ0KT0+Y2hhcnQuX3BsdWdpbnMuaW52YWxpZGF0ZSgpKTtcbn1cblxuZnVuY3Rpb24gY2xpcEFyYyhjdHgsIGVsZW1lbnQsIGVuZEFuZ2xlKSB7XG4gICAgY29uc3QgeyBzdGFydEFuZ2xlICwgcGl4ZWxNYXJnaW4gLCB4ICwgeSAsIG91dGVyUmFkaXVzICwgaW5uZXJSYWRpdXMgIH0gPSBlbGVtZW50O1xuICAgIGxldCBhbmdsZU1hcmdpbiA9IHBpeGVsTWFyZ2luIC8gb3V0ZXJSYWRpdXM7XG4gICAgLy8gRHJhdyBhbiBpbm5lciBib3JkZXIgYnkgY2xpcHBpbmcgdGhlIGFyYyBhbmQgZHJhd2luZyBhIGRvdWJsZS13aWR0aCBib3JkZXJcbiAgICAvLyBFbmxhcmdlIHRoZSBjbGlwcGluZyBhcmMgYnkgMC4zMyBwaXhlbHMgdG8gZWxpbWluYXRlIGdsaXRjaGVzIGJldHdlZW4gYm9yZGVyc1xuICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICBjdHguYXJjKHgsIHksIG91dGVyUmFkaXVzLCBzdGFydEFuZ2xlIC0gYW5nbGVNYXJnaW4sIGVuZEFuZ2xlICsgYW5nbGVNYXJnaW4pO1xuICAgIGlmIChpbm5lclJhZGl1cyA+IHBpeGVsTWFyZ2luKSB7XG4gICAgICAgIGFuZ2xlTWFyZ2luID0gcGl4ZWxNYXJnaW4gLyBpbm5lclJhZGl1cztcbiAgICAgICAgY3R4LmFyYyh4LCB5LCBpbm5lclJhZGl1cywgZW5kQW5nbGUgKyBhbmdsZU1hcmdpbiwgc3RhcnRBbmdsZSAtIGFuZ2xlTWFyZ2luLCB0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBjdHguYXJjKHgsIHksIHBpeGVsTWFyZ2luLCBlbmRBbmdsZSArIEhBTEZfUEksIHN0YXJ0QW5nbGUgLSBIQUxGX1BJKTtcbiAgICB9XG4gICAgY3R4LmNsb3NlUGF0aCgpO1xuICAgIGN0eC5jbGlwKCk7XG59XG5mdW5jdGlvbiB0b1JhZGl1c0Nvcm5lcnModmFsdWUpIHtcbiAgICByZXR1cm4gX3JlYWRWYWx1ZVRvUHJvcHModmFsdWUsIFtcbiAgICAgICAgJ291dGVyU3RhcnQnLFxuICAgICAgICAnb3V0ZXJFbmQnLFxuICAgICAgICAnaW5uZXJTdGFydCcsXG4gICAgICAgICdpbm5lckVuZCdcbiAgICBdKTtcbn1cbi8qKlxuICogUGFyc2UgYm9yZGVyIHJhZGl1cyBmcm9tIHRoZSBwcm92aWRlZCBvcHRpb25zXG4gKi8gZnVuY3Rpb24gcGFyc2VCb3JkZXJSYWRpdXMkMShhcmMsIGlubmVyUmFkaXVzLCBvdXRlclJhZGl1cywgYW5nbGVEZWx0YSkge1xuICAgIGNvbnN0IG8gPSB0b1JhZGl1c0Nvcm5lcnMoYXJjLm9wdGlvbnMuYm9yZGVyUmFkaXVzKTtcbiAgICBjb25zdCBoYWxmVGhpY2tuZXNzID0gKG91dGVyUmFkaXVzIC0gaW5uZXJSYWRpdXMpIC8gMjtcbiAgICBjb25zdCBpbm5lckxpbWl0ID0gTWF0aC5taW4oaGFsZlRoaWNrbmVzcywgYW5nbGVEZWx0YSAqIGlubmVyUmFkaXVzIC8gMik7XG4gICAgLy8gT3V0ZXIgbGltaXRzIGFyZSBjb21wbGljYXRlZC4gV2Ugd2FudCB0byBjb21wdXRlIHRoZSBhdmFpbGFibGUgYW5ndWxhciBkaXN0YW5jZSBhdFxuICAgIC8vIGEgcmFkaXVzIG9mIG91dGVyUmFkaXVzIC0gYm9yZGVyUmFkaXVzIGJlY2F1c2UgZm9yIHNtYWxsIGFuZ3VsYXIgZGlzdGFuY2VzLCB0aGlzIHRlcm0gbGltaXRzLlxuICAgIC8vIFdlIGNvbXB1dGUgYXQgciA9IG91dGVyUmFkaXVzIC0gYm9yZGVyUmFkaXVzIGJlY2F1c2UgdGhpcyBjaXJjbGUgZGVmaW5lcyB0aGUgY2VudGVyIG9mIHRoZSBib3JkZXIgY29ybmVycy5cbiAgICAvL1xuICAgIC8vIElmIHRoZSBib3JkZXJSYWRpdXMgaXMgbGFyZ2UsIHRoYXQgdmFsdWUgY2FuIGJlY29tZSBuZWdhdGl2ZS5cbiAgICAvLyBUaGlzIGNhdXNlcyB0aGUgb3V0ZXIgYm9yZGVycyB0byBsb3NlIHRoZWlyIHJhZGl1cyBlbnRpcmVseSwgd2hpY2ggaXMgcmF0aGVyIHVuZXhwZWN0ZWQuIFRvIHNvbHZlIHRoYXQsIGlmIGJvcmRlclJhZGl1cyA+IG91dGVyUmFkaXVzXG4gICAgLy8gd2Uga25vdyB0aGF0IHRoZSB0aGlja25lc3MgdGVybSB3aWxsIGRvbWluYXRlIGFuZCBjb21wdXRlIHRoZSBsaW1pdHMgYXQgdGhhdCBwb2ludFxuICAgIGNvbnN0IGNvbXB1dGVPdXRlckxpbWl0ID0gKHZhbCk9PntcbiAgICAgICAgY29uc3Qgb3V0ZXJBcmNMaW1pdCA9IChvdXRlclJhZGl1cyAtIE1hdGgubWluKGhhbGZUaGlja25lc3MsIHZhbCkpICogYW5nbGVEZWx0YSAvIDI7XG4gICAgICAgIHJldHVybiBfbGltaXRWYWx1ZSh2YWwsIDAsIE1hdGgubWluKGhhbGZUaGlja25lc3MsIG91dGVyQXJjTGltaXQpKTtcbiAgICB9O1xuICAgIHJldHVybiB7XG4gICAgICAgIG91dGVyU3RhcnQ6IGNvbXB1dGVPdXRlckxpbWl0KG8ub3V0ZXJTdGFydCksXG4gICAgICAgIG91dGVyRW5kOiBjb21wdXRlT3V0ZXJMaW1pdChvLm91dGVyRW5kKSxcbiAgICAgICAgaW5uZXJTdGFydDogX2xpbWl0VmFsdWUoby5pbm5lclN0YXJ0LCAwLCBpbm5lckxpbWl0KSxcbiAgICAgICAgaW5uZXJFbmQ6IF9saW1pdFZhbHVlKG8uaW5uZXJFbmQsIDAsIGlubmVyTGltaXQpXG4gICAgfTtcbn1cbi8qKlxuICogQ29udmVydCAociwg8J2cgykgdG8gKHgsIHkpXG4gKi8gZnVuY3Rpb24gclRoZXRhVG9YWShyLCB0aGV0YSwgeCwgeSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHg6IHggKyByICogTWF0aC5jb3ModGhldGEpLFxuICAgICAgICB5OiB5ICsgciAqIE1hdGguc2luKHRoZXRhKVxuICAgIH07XG59XG4vKipcbiAqIFBhdGggdGhlIGFyYywgcmVzcGVjdGluZyBib3JkZXIgcmFkaXVzIGJ5IHNlcGFyYXRpbmcgaW50byBsZWZ0IGFuZCByaWdodCBoYWx2ZXMuXG4gKlxuICogICBTdGFydCAgICAgIEVuZFxuICpcbiAqICAgIDEtLS0+YS0tLT4yICAgIE91dGVyXG4gKiAgIC8gICAgICAgICAgIFxcXG4gKiAgIDggICAgICAgICAgIDNcbiAqICAgfCAgICAgICAgICAgfFxuICogICB8ICAgICAgICAgICB8XG4gKiAgIDcgICAgICAgICAgIDRcbiAqICAgXFwgICAgICAgICAgIC9cbiAqICAgIDY8LS0tYjwtLS01ICAgIElubmVyXG4gKi8gZnVuY3Rpb24gcGF0aEFyYyhjdHgsIGVsZW1lbnQsIG9mZnNldCwgc3BhY2luZywgZW5kLCBjaXJjdWxhcikge1xuICAgIGNvbnN0IHsgeCAsIHkgLCBzdGFydEFuZ2xlOiBzdGFydCAsIHBpeGVsTWFyZ2luICwgaW5uZXJSYWRpdXM6IGlubmVyUiAgfSA9IGVsZW1lbnQ7XG4gICAgY29uc3Qgb3V0ZXJSYWRpdXMgPSBNYXRoLm1heChlbGVtZW50Lm91dGVyUmFkaXVzICsgc3BhY2luZyArIG9mZnNldCAtIHBpeGVsTWFyZ2luLCAwKTtcbiAgICBjb25zdCBpbm5lclJhZGl1cyA9IGlubmVyUiA+IDAgPyBpbm5lclIgKyBzcGFjaW5nICsgb2Zmc2V0ICsgcGl4ZWxNYXJnaW4gOiAwO1xuICAgIGxldCBzcGFjaW5nT2Zmc2V0ID0gMDtcbiAgICBjb25zdCBhbHBoYSA9IGVuZCAtIHN0YXJ0O1xuICAgIGlmIChzcGFjaW5nKSB7XG4gICAgICAgIC8vIFdoZW4gc3BhY2luZyBpcyBwcmVzZW50LCBpdCBpcyB0aGUgc2FtZSBmb3IgYWxsIGl0ZW1zXG4gICAgICAgIC8vIFNvIHdlIGFkanVzdCB0aGUgc3RhcnQgYW5kIGVuZCBhbmdsZSBvZiB0aGUgYXJjIHN1Y2ggdGhhdFxuICAgICAgICAvLyB0aGUgZGlzdGFuY2UgaXMgdGhlIHNhbWUgYXMgaXQgd291bGQgYmUgd2l0aG91dCB0aGUgc3BhY2luZ1xuICAgICAgICBjb25zdCBub1NwYWNpbmdJbm5lclJhZGl1cyA9IGlubmVyUiA+IDAgPyBpbm5lclIgLSBzcGFjaW5nIDogMDtcbiAgICAgICAgY29uc3Qgbm9TcGFjaW5nT3V0ZXJSYWRpdXMgPSBvdXRlclJhZGl1cyA+IDAgPyBvdXRlclJhZGl1cyAtIHNwYWNpbmcgOiAwO1xuICAgICAgICBjb25zdCBhdk5vZ1NwYWNpbmdSYWRpdXMgPSAobm9TcGFjaW5nSW5uZXJSYWRpdXMgKyBub1NwYWNpbmdPdXRlclJhZGl1cykgLyAyO1xuICAgICAgICBjb25zdCBhZGp1c3RlZEFuZ2xlID0gYXZOb2dTcGFjaW5nUmFkaXVzICE9PSAwID8gYWxwaGEgKiBhdk5vZ1NwYWNpbmdSYWRpdXMgLyAoYXZOb2dTcGFjaW5nUmFkaXVzICsgc3BhY2luZykgOiBhbHBoYTtcbiAgICAgICAgc3BhY2luZ09mZnNldCA9IChhbHBoYSAtIGFkanVzdGVkQW5nbGUpIC8gMjtcbiAgICB9XG4gICAgY29uc3QgYmV0YSA9IE1hdGgubWF4KDAuMDAxLCBhbHBoYSAqIG91dGVyUmFkaXVzIC0gb2Zmc2V0IC8gUEkpIC8gb3V0ZXJSYWRpdXM7XG4gICAgY29uc3QgYW5nbGVPZmZzZXQgPSAoYWxwaGEgLSBiZXRhKSAvIDI7XG4gICAgY29uc3Qgc3RhcnRBbmdsZSA9IHN0YXJ0ICsgYW5nbGVPZmZzZXQgKyBzcGFjaW5nT2Zmc2V0O1xuICAgIGNvbnN0IGVuZEFuZ2xlID0gZW5kIC0gYW5nbGVPZmZzZXQgLSBzcGFjaW5nT2Zmc2V0O1xuICAgIGNvbnN0IHsgb3V0ZXJTdGFydCAsIG91dGVyRW5kICwgaW5uZXJTdGFydCAsIGlubmVyRW5kICB9ID0gcGFyc2VCb3JkZXJSYWRpdXMkMShlbGVtZW50LCBpbm5lclJhZGl1cywgb3V0ZXJSYWRpdXMsIGVuZEFuZ2xlIC0gc3RhcnRBbmdsZSk7XG4gICAgY29uc3Qgb3V0ZXJTdGFydEFkanVzdGVkUmFkaXVzID0gb3V0ZXJSYWRpdXMgLSBvdXRlclN0YXJ0O1xuICAgIGNvbnN0IG91dGVyRW5kQWRqdXN0ZWRSYWRpdXMgPSBvdXRlclJhZGl1cyAtIG91dGVyRW5kO1xuICAgIGNvbnN0IG91dGVyU3RhcnRBZGp1c3RlZEFuZ2xlID0gc3RhcnRBbmdsZSArIG91dGVyU3RhcnQgLyBvdXRlclN0YXJ0QWRqdXN0ZWRSYWRpdXM7XG4gICAgY29uc3Qgb3V0ZXJFbmRBZGp1c3RlZEFuZ2xlID0gZW5kQW5nbGUgLSBvdXRlckVuZCAvIG91dGVyRW5kQWRqdXN0ZWRSYWRpdXM7XG4gICAgY29uc3QgaW5uZXJTdGFydEFkanVzdGVkUmFkaXVzID0gaW5uZXJSYWRpdXMgKyBpbm5lclN0YXJ0O1xuICAgIGNvbnN0IGlubmVyRW5kQWRqdXN0ZWRSYWRpdXMgPSBpbm5lclJhZGl1cyArIGlubmVyRW5kO1xuICAgIGNvbnN0IGlubmVyU3RhcnRBZGp1c3RlZEFuZ2xlID0gc3RhcnRBbmdsZSArIGlubmVyU3RhcnQgLyBpbm5lclN0YXJ0QWRqdXN0ZWRSYWRpdXM7XG4gICAgY29uc3QgaW5uZXJFbmRBZGp1c3RlZEFuZ2xlID0gZW5kQW5nbGUgLSBpbm5lckVuZCAvIGlubmVyRW5kQWRqdXN0ZWRSYWRpdXM7XG4gICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgIGlmIChjaXJjdWxhcikge1xuICAgICAgICAvLyBUaGUgZmlyc3QgYXJjIHNlZ21lbnRzIGZyb20gcG9pbnQgMSB0byBwb2ludCBhIHRvIHBvaW50IDJcbiAgICAgICAgY29uc3Qgb3V0ZXJNaWRBZGp1c3RlZEFuZ2xlID0gKG91dGVyU3RhcnRBZGp1c3RlZEFuZ2xlICsgb3V0ZXJFbmRBZGp1c3RlZEFuZ2xlKSAvIDI7XG4gICAgICAgIGN0eC5hcmMoeCwgeSwgb3V0ZXJSYWRpdXMsIG91dGVyU3RhcnRBZGp1c3RlZEFuZ2xlLCBvdXRlck1pZEFkanVzdGVkQW5nbGUpO1xuICAgICAgICBjdHguYXJjKHgsIHksIG91dGVyUmFkaXVzLCBvdXRlck1pZEFkanVzdGVkQW5nbGUsIG91dGVyRW5kQWRqdXN0ZWRBbmdsZSk7XG4gICAgICAgIC8vIFRoZSBjb3JuZXIgc2VnbWVudCBmcm9tIHBvaW50IDIgdG8gcG9pbnQgM1xuICAgICAgICBpZiAob3V0ZXJFbmQgPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBwQ2VudGVyID0gclRoZXRhVG9YWShvdXRlckVuZEFkanVzdGVkUmFkaXVzLCBvdXRlckVuZEFkanVzdGVkQW5nbGUsIHgsIHkpO1xuICAgICAgICAgICAgY3R4LmFyYyhwQ2VudGVyLngsIHBDZW50ZXIueSwgb3V0ZXJFbmQsIG91dGVyRW5kQWRqdXN0ZWRBbmdsZSwgZW5kQW5nbGUgKyBIQUxGX1BJKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgbGluZSBmcm9tIHBvaW50IDMgdG8gcG9pbnQgNFxuICAgICAgICBjb25zdCBwNCA9IHJUaGV0YVRvWFkoaW5uZXJFbmRBZGp1c3RlZFJhZGl1cywgZW5kQW5nbGUsIHgsIHkpO1xuICAgICAgICBjdHgubGluZVRvKHA0LngsIHA0LnkpO1xuICAgICAgICAvLyBUaGUgY29ybmVyIHNlZ21lbnQgZnJvbSBwb2ludCA0IHRvIHBvaW50IDVcbiAgICAgICAgaWYgKGlubmVyRW5kID4gMCkge1xuICAgICAgICAgICAgY29uc3QgcENlbnRlciA9IHJUaGV0YVRvWFkoaW5uZXJFbmRBZGp1c3RlZFJhZGl1cywgaW5uZXJFbmRBZGp1c3RlZEFuZ2xlLCB4LCB5KTtcbiAgICAgICAgICAgIGN0eC5hcmMocENlbnRlci54LCBwQ2VudGVyLnksIGlubmVyRW5kLCBlbmRBbmdsZSArIEhBTEZfUEksIGlubmVyRW5kQWRqdXN0ZWRBbmdsZSArIE1hdGguUEkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRoZSBpbm5lciBhcmMgZnJvbSBwb2ludCA1IHRvIHBvaW50IGIgdG8gcG9pbnQgNlxuICAgICAgICBjb25zdCBpbm5lck1pZEFkanVzdGVkQW5nbGUgPSAoZW5kQW5nbGUgLSBpbm5lckVuZCAvIGlubmVyUmFkaXVzICsgKHN0YXJ0QW5nbGUgKyBpbm5lclN0YXJ0IC8gaW5uZXJSYWRpdXMpKSAvIDI7XG4gICAgICAgIGN0eC5hcmMoeCwgeSwgaW5uZXJSYWRpdXMsIGVuZEFuZ2xlIC0gaW5uZXJFbmQgLyBpbm5lclJhZGl1cywgaW5uZXJNaWRBZGp1c3RlZEFuZ2xlLCB0cnVlKTtcbiAgICAgICAgY3R4LmFyYyh4LCB5LCBpbm5lclJhZGl1cywgaW5uZXJNaWRBZGp1c3RlZEFuZ2xlLCBzdGFydEFuZ2xlICsgaW5uZXJTdGFydCAvIGlubmVyUmFkaXVzLCB0cnVlKTtcbiAgICAgICAgLy8gVGhlIGNvcm5lciBzZWdtZW50IGZyb20gcG9pbnQgNiB0byBwb2ludCA3XG4gICAgICAgIGlmIChpbm5lclN0YXJ0ID4gMCkge1xuICAgICAgICAgICAgY29uc3QgcENlbnRlciA9IHJUaGV0YVRvWFkoaW5uZXJTdGFydEFkanVzdGVkUmFkaXVzLCBpbm5lclN0YXJ0QWRqdXN0ZWRBbmdsZSwgeCwgeSk7XG4gICAgICAgICAgICBjdHguYXJjKHBDZW50ZXIueCwgcENlbnRlci55LCBpbm5lclN0YXJ0LCBpbm5lclN0YXJ0QWRqdXN0ZWRBbmdsZSArIE1hdGguUEksIHN0YXJ0QW5nbGUgLSBIQUxGX1BJKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgbGluZSBmcm9tIHBvaW50IDcgdG8gcG9pbnQgOFxuICAgICAgICBjb25zdCBwOCA9IHJUaGV0YVRvWFkob3V0ZXJTdGFydEFkanVzdGVkUmFkaXVzLCBzdGFydEFuZ2xlLCB4LCB5KTtcbiAgICAgICAgY3R4LmxpbmVUbyhwOC54LCBwOC55KTtcbiAgICAgICAgLy8gVGhlIGNvcm5lciBzZWdtZW50IGZyb20gcG9pbnQgOCB0byBwb2ludCAxXG4gICAgICAgIGlmIChvdXRlclN0YXJ0ID4gMCkge1xuICAgICAgICAgICAgY29uc3QgcENlbnRlciA9IHJUaGV0YVRvWFkob3V0ZXJTdGFydEFkanVzdGVkUmFkaXVzLCBvdXRlclN0YXJ0QWRqdXN0ZWRBbmdsZSwgeCwgeSk7XG4gICAgICAgICAgICBjdHguYXJjKHBDZW50ZXIueCwgcENlbnRlci55LCBvdXRlclN0YXJ0LCBzdGFydEFuZ2xlIC0gSEFMRl9QSSwgb3V0ZXJTdGFydEFkanVzdGVkQW5nbGUpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY3R4Lm1vdmVUbyh4LCB5KTtcbiAgICAgICAgY29uc3Qgb3V0ZXJTdGFydFggPSBNYXRoLmNvcyhvdXRlclN0YXJ0QWRqdXN0ZWRBbmdsZSkgKiBvdXRlclJhZGl1cyArIHg7XG4gICAgICAgIGNvbnN0IG91dGVyU3RhcnRZID0gTWF0aC5zaW4ob3V0ZXJTdGFydEFkanVzdGVkQW5nbGUpICogb3V0ZXJSYWRpdXMgKyB5O1xuICAgICAgICBjdHgubGluZVRvKG91dGVyU3RhcnRYLCBvdXRlclN0YXJ0WSk7XG4gICAgICAgIGNvbnN0IG91dGVyRW5kWCA9IE1hdGguY29zKG91dGVyRW5kQWRqdXN0ZWRBbmdsZSkgKiBvdXRlclJhZGl1cyArIHg7XG4gICAgICAgIGNvbnN0IG91dGVyRW5kWSA9IE1hdGguc2luKG91dGVyRW5kQWRqdXN0ZWRBbmdsZSkgKiBvdXRlclJhZGl1cyArIHk7XG4gICAgICAgIGN0eC5saW5lVG8ob3V0ZXJFbmRYLCBvdXRlckVuZFkpO1xuICAgIH1cbiAgICBjdHguY2xvc2VQYXRoKCk7XG59XG5mdW5jdGlvbiBkcmF3QXJjKGN0eCwgZWxlbWVudCwgb2Zmc2V0LCBzcGFjaW5nLCBjaXJjdWxhcikge1xuICAgIGNvbnN0IHsgZnVsbENpcmNsZXMgLCBzdGFydEFuZ2xlICwgY2lyY3VtZmVyZW5jZSAgfSA9IGVsZW1lbnQ7XG4gICAgbGV0IGVuZEFuZ2xlID0gZWxlbWVudC5lbmRBbmdsZTtcbiAgICBpZiAoZnVsbENpcmNsZXMpIHtcbiAgICAgICAgcGF0aEFyYyhjdHgsIGVsZW1lbnQsIG9mZnNldCwgc3BhY2luZywgZW5kQW5nbGUsIGNpcmN1bGFyKTtcbiAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IGZ1bGxDaXJjbGVzOyArK2kpe1xuICAgICAgICAgICAgY3R4LmZpbGwoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzTmFOKGNpcmN1bWZlcmVuY2UpKSB7XG4gICAgICAgICAgICBlbmRBbmdsZSA9IHN0YXJ0QW5nbGUgKyAoY2lyY3VtZmVyZW5jZSAlIFRBVSB8fCBUQVUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHBhdGhBcmMoY3R4LCBlbGVtZW50LCBvZmZzZXQsIHNwYWNpbmcsIGVuZEFuZ2xlLCBjaXJjdWxhcik7XG4gICAgY3R4LmZpbGwoKTtcbiAgICByZXR1cm4gZW5kQW5nbGU7XG59XG5mdW5jdGlvbiBkcmF3Qm9yZGVyKGN0eCwgZWxlbWVudCwgb2Zmc2V0LCBzcGFjaW5nLCBjaXJjdWxhcikge1xuICAgIGNvbnN0IHsgZnVsbENpcmNsZXMgLCBzdGFydEFuZ2xlICwgY2lyY3VtZmVyZW5jZSAsIG9wdGlvbnMgIH0gPSBlbGVtZW50O1xuICAgIGNvbnN0IHsgYm9yZGVyV2lkdGggLCBib3JkZXJKb2luU3R5bGUgLCBib3JkZXJEYXNoICwgYm9yZGVyRGFzaE9mZnNldCAgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgaW5uZXIgPSBvcHRpb25zLmJvcmRlckFsaWduID09PSAnaW5uZXInO1xuICAgIGlmICghYm9yZGVyV2lkdGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjdHguc2V0TGluZURhc2goYm9yZGVyRGFzaCB8fCBbXSk7XG4gICAgY3R4LmxpbmVEYXNoT2Zmc2V0ID0gYm9yZGVyRGFzaE9mZnNldDtcbiAgICBpZiAoaW5uZXIpIHtcbiAgICAgICAgY3R4LmxpbmVXaWR0aCA9IGJvcmRlcldpZHRoICogMjtcbiAgICAgICAgY3R4LmxpbmVKb2luID0gYm9yZGVySm9pblN0eWxlIHx8ICdyb3VuZCc7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY3R4LmxpbmVXaWR0aCA9IGJvcmRlcldpZHRoO1xuICAgICAgICBjdHgubGluZUpvaW4gPSBib3JkZXJKb2luU3R5bGUgfHwgJ2JldmVsJztcbiAgICB9XG4gICAgbGV0IGVuZEFuZ2xlID0gZWxlbWVudC5lbmRBbmdsZTtcbiAgICBpZiAoZnVsbENpcmNsZXMpIHtcbiAgICAgICAgcGF0aEFyYyhjdHgsIGVsZW1lbnQsIG9mZnNldCwgc3BhY2luZywgZW5kQW5nbGUsIGNpcmN1bGFyKTtcbiAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IGZ1bGxDaXJjbGVzOyArK2kpe1xuICAgICAgICAgICAgY3R4LnN0cm9rZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNOYU4oY2lyY3VtZmVyZW5jZSkpIHtcbiAgICAgICAgICAgIGVuZEFuZ2xlID0gc3RhcnRBbmdsZSArIChjaXJjdW1mZXJlbmNlICUgVEFVIHx8IFRBVSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlubmVyKSB7XG4gICAgICAgIGNsaXBBcmMoY3R4LCBlbGVtZW50LCBlbmRBbmdsZSk7XG4gICAgfVxuICAgIGlmICghZnVsbENpcmNsZXMpIHtcbiAgICAgICAgcGF0aEFyYyhjdHgsIGVsZW1lbnQsIG9mZnNldCwgc3BhY2luZywgZW5kQW5nbGUsIGNpcmN1bGFyKTtcbiAgICAgICAgY3R4LnN0cm9rZSgpO1xuICAgIH1cbn1cbmNsYXNzIEFyY0VsZW1lbnQgZXh0ZW5kcyBFbGVtZW50IHtcbiAgICBzdGF0aWMgaWQgPSAnYXJjJztcbiAgICBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgICAgIGJvcmRlckFsaWduOiAnY2VudGVyJyxcbiAgICAgICAgYm9yZGVyQ29sb3I6ICcjZmZmJyxcbiAgICAgICAgYm9yZGVyRGFzaDogW10sXG4gICAgICAgIGJvcmRlckRhc2hPZmZzZXQ6IDAsXG4gICAgICAgIGJvcmRlckpvaW5TdHlsZTogdW5kZWZpbmVkLFxuICAgICAgICBib3JkZXJSYWRpdXM6IDAsXG4gICAgICAgIGJvcmRlcldpZHRoOiAyLFxuICAgICAgICBvZmZzZXQ6IDAsXG4gICAgICAgIHNwYWNpbmc6IDAsXG4gICAgICAgIGFuZ2xlOiB1bmRlZmluZWQsXG4gICAgICAgIGNpcmN1bGFyOiB0cnVlXG4gICAgfTtcbiAgICBzdGF0aWMgZGVmYXVsdFJvdXRlcyA9IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiAnYmFja2dyb3VuZENvbG9yJ1xuICAgIH07XG4gICAgc3RhdGljIGRlc2NyaXB0b3JzID0ge1xuICAgICAgICBfc2NyaXB0YWJsZTogdHJ1ZSxcbiAgICAgICAgX2luZGV4YWJsZTogKG5hbWUpPT5uYW1lICE9PSAnYm9yZGVyRGFzaCdcbiAgICB9O1xuICAgIGNpcmN1bWZlcmVuY2U7XG4gICAgZW5kQW5nbGU7XG4gICAgZnVsbENpcmNsZXM7XG4gICAgaW5uZXJSYWRpdXM7XG4gICAgb3V0ZXJSYWRpdXM7XG4gICAgcGl4ZWxNYXJnaW47XG4gICAgc3RhcnRBbmdsZTtcbiAgICBjb25zdHJ1Y3RvcihjZmcpe1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuY2lyY3VtZmVyZW5jZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5zdGFydEFuZ2xlID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmVuZEFuZ2xlID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmlubmVyUmFkaXVzID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLm91dGVyUmFkaXVzID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLnBpeGVsTWFyZ2luID0gMDtcbiAgICAgICAgdGhpcy5mdWxsQ2lyY2xlcyA9IDA7XG4gICAgICAgIGlmIChjZmcpIHtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgY2ZnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpblJhbmdlKGNoYXJ0WCwgY2hhcnRZLCB1c2VGaW5hbFBvc2l0aW9uKSB7XG4gICAgICAgIGNvbnN0IHBvaW50ID0gdGhpcy5nZXRQcm9wcyhbXG4gICAgICAgICAgICAneCcsXG4gICAgICAgICAgICAneSdcbiAgICAgICAgXSwgdXNlRmluYWxQb3NpdGlvbik7XG4gICAgICAgIGNvbnN0IHsgYW5nbGUgLCBkaXN0YW5jZSAgfSA9IGdldEFuZ2xlRnJvbVBvaW50KHBvaW50LCB7XG4gICAgICAgICAgICB4OiBjaGFydFgsXG4gICAgICAgICAgICB5OiBjaGFydFlcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHsgc3RhcnRBbmdsZSAsIGVuZEFuZ2xlICwgaW5uZXJSYWRpdXMgLCBvdXRlclJhZGl1cyAsIGNpcmN1bWZlcmVuY2UgIH0gPSB0aGlzLmdldFByb3BzKFtcbiAgICAgICAgICAgICdzdGFydEFuZ2xlJyxcbiAgICAgICAgICAgICdlbmRBbmdsZScsXG4gICAgICAgICAgICAnaW5uZXJSYWRpdXMnLFxuICAgICAgICAgICAgJ291dGVyUmFkaXVzJyxcbiAgICAgICAgICAgICdjaXJjdW1mZXJlbmNlJ1xuICAgICAgICBdLCB1c2VGaW5hbFBvc2l0aW9uKTtcbiAgICAgICAgY29uc3QgckFkanVzdCA9ICh0aGlzLm9wdGlvbnMuc3BhY2luZyArIHRoaXMub3B0aW9ucy5ib3JkZXJXaWR0aCkgLyAyO1xuICAgICAgICBjb25zdCBfY2lyY3VtZmVyZW5jZSA9IHZhbHVlT3JEZWZhdWx0KGNpcmN1bWZlcmVuY2UsIGVuZEFuZ2xlIC0gc3RhcnRBbmdsZSk7XG4gICAgICAgIGNvbnN0IGJldHdlZW5BbmdsZXMgPSBfY2lyY3VtZmVyZW5jZSA+PSBUQVUgfHwgX2FuZ2xlQmV0d2VlbihhbmdsZSwgc3RhcnRBbmdsZSwgZW5kQW5nbGUpO1xuICAgICAgICBjb25zdCB3aXRoaW5SYWRpdXMgPSBfaXNCZXR3ZWVuKGRpc3RhbmNlLCBpbm5lclJhZGl1cyArIHJBZGp1c3QsIG91dGVyUmFkaXVzICsgckFkanVzdCk7XG4gICAgICAgIHJldHVybiBiZXR3ZWVuQW5nbGVzICYmIHdpdGhpblJhZGl1cztcbiAgICB9XG4gICAgZ2V0Q2VudGVyUG9pbnQodXNlRmluYWxQb3NpdGlvbikge1xuICAgICAgICBjb25zdCB7IHggLCB5ICwgc3RhcnRBbmdsZSAsIGVuZEFuZ2xlICwgaW5uZXJSYWRpdXMgLCBvdXRlclJhZGl1cyAgfSA9IHRoaXMuZ2V0UHJvcHMoW1xuICAgICAgICAgICAgJ3gnLFxuICAgICAgICAgICAgJ3knLFxuICAgICAgICAgICAgJ3N0YXJ0QW5nbGUnLFxuICAgICAgICAgICAgJ2VuZEFuZ2xlJyxcbiAgICAgICAgICAgICdpbm5lclJhZGl1cycsXG4gICAgICAgICAgICAnb3V0ZXJSYWRpdXMnXG4gICAgICAgIF0sIHVzZUZpbmFsUG9zaXRpb24pO1xuICAgICAgICBjb25zdCB7IG9mZnNldCAsIHNwYWNpbmcgIH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIGNvbnN0IGhhbGZBbmdsZSA9IChzdGFydEFuZ2xlICsgZW5kQW5nbGUpIC8gMjtcbiAgICAgICAgY29uc3QgaGFsZlJhZGl1cyA9IChpbm5lclJhZGl1cyArIG91dGVyUmFkaXVzICsgc3BhY2luZyArIG9mZnNldCkgLyAyO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeDogeCArIE1hdGguY29zKGhhbGZBbmdsZSkgKiBoYWxmUmFkaXVzLFxuICAgICAgICAgICAgeTogeSArIE1hdGguc2luKGhhbGZBbmdsZSkgKiBoYWxmUmFkaXVzXG4gICAgICAgIH07XG4gICAgfVxuICAgIHRvb2x0aXBQb3NpdGlvbih1c2VGaW5hbFBvc2l0aW9uKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldENlbnRlclBvaW50KHVzZUZpbmFsUG9zaXRpb24pO1xuICAgIH1cbiAgICBkcmF3KGN0eCkge1xuICAgICAgICBjb25zdCB7IG9wdGlvbnMgLCBjaXJjdW1mZXJlbmNlICB9ID0gdGhpcztcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gKG9wdGlvbnMub2Zmc2V0IHx8IDApIC8gNDtcbiAgICAgICAgY29uc3Qgc3BhY2luZyA9IChvcHRpb25zLnNwYWNpbmcgfHwgMCkgLyAyO1xuICAgICAgICBjb25zdCBjaXJjdWxhciA9IG9wdGlvbnMuY2lyY3VsYXI7XG4gICAgICAgIHRoaXMucGl4ZWxNYXJnaW4gPSBvcHRpb25zLmJvcmRlckFsaWduID09PSAnaW5uZXInID8gMC4zMyA6IDA7XG4gICAgICAgIHRoaXMuZnVsbENpcmNsZXMgPSBjaXJjdW1mZXJlbmNlID4gVEFVID8gTWF0aC5mbG9vcihjaXJjdW1mZXJlbmNlIC8gVEFVKSA6IDA7XG4gICAgICAgIGlmIChjaXJjdW1mZXJlbmNlID09PSAwIHx8IHRoaXMuaW5uZXJSYWRpdXMgPCAwIHx8IHRoaXMub3V0ZXJSYWRpdXMgPCAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY3R4LnNhdmUoKTtcbiAgICAgICAgY29uc3QgaGFsZkFuZ2xlID0gKHRoaXMuc3RhcnRBbmdsZSArIHRoaXMuZW5kQW5nbGUpIC8gMjtcbiAgICAgICAgY3R4LnRyYW5zbGF0ZShNYXRoLmNvcyhoYWxmQW5nbGUpICogb2Zmc2V0LCBNYXRoLnNpbihoYWxmQW5nbGUpICogb2Zmc2V0KTtcbiAgICAgICAgY29uc3QgZml4ID0gMSAtIE1hdGguc2luKE1hdGgubWluKFBJLCBjaXJjdW1mZXJlbmNlIHx8IDApKTtcbiAgICAgICAgY29uc3QgcmFkaXVzT2Zmc2V0ID0gb2Zmc2V0ICogZml4O1xuICAgICAgICBjdHguZmlsbFN0eWxlID0gb3B0aW9ucy5iYWNrZ3JvdW5kQ29sb3I7XG4gICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IG9wdGlvbnMuYm9yZGVyQ29sb3I7XG4gICAgICAgIGRyYXdBcmMoY3R4LCB0aGlzLCByYWRpdXNPZmZzZXQsIHNwYWNpbmcsIGNpcmN1bGFyKTtcbiAgICAgICAgZHJhd0JvcmRlcihjdHgsIHRoaXMsIHJhZGl1c09mZnNldCwgc3BhY2luZywgY2lyY3VsYXIpO1xuICAgICAgICBjdHgucmVzdG9yZSgpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gc2V0U3R5bGUoY3R4LCBvcHRpb25zLCBzdHlsZSA9IG9wdGlvbnMpIHtcbiAgICBjdHgubGluZUNhcCA9IHZhbHVlT3JEZWZhdWx0KHN0eWxlLmJvcmRlckNhcFN0eWxlLCBvcHRpb25zLmJvcmRlckNhcFN0eWxlKTtcbiAgICBjdHguc2V0TGluZURhc2godmFsdWVPckRlZmF1bHQoc3R5bGUuYm9yZGVyRGFzaCwgb3B0aW9ucy5ib3JkZXJEYXNoKSk7XG4gICAgY3R4LmxpbmVEYXNoT2Zmc2V0ID0gdmFsdWVPckRlZmF1bHQoc3R5bGUuYm9yZGVyRGFzaE9mZnNldCwgb3B0aW9ucy5ib3JkZXJEYXNoT2Zmc2V0KTtcbiAgICBjdHgubGluZUpvaW4gPSB2YWx1ZU9yRGVmYXVsdChzdHlsZS5ib3JkZXJKb2luU3R5bGUsIG9wdGlvbnMuYm9yZGVySm9pblN0eWxlKTtcbiAgICBjdHgubGluZVdpZHRoID0gdmFsdWVPckRlZmF1bHQoc3R5bGUuYm9yZGVyV2lkdGgsIG9wdGlvbnMuYm9yZGVyV2lkdGgpO1xuICAgIGN0eC5zdHJva2VTdHlsZSA9IHZhbHVlT3JEZWZhdWx0KHN0eWxlLmJvcmRlckNvbG9yLCBvcHRpb25zLmJvcmRlckNvbG9yKTtcbn1cbmZ1bmN0aW9uIGxpbmVUbyhjdHgsIHByZXZpb3VzLCB0YXJnZXQpIHtcbiAgICBjdHgubGluZVRvKHRhcmdldC54LCB0YXJnZXQueSk7XG59XG4gZnVuY3Rpb24gZ2V0TGluZU1ldGhvZChvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMuc3RlcHBlZCkge1xuICAgICAgICByZXR1cm4gX3N0ZXBwZWRMaW5lVG87XG4gICAgfVxuICAgIGlmIChvcHRpb25zLnRlbnNpb24gfHwgb3B0aW9ucy5jdWJpY0ludGVycG9sYXRpb25Nb2RlID09PSAnbW9ub3RvbmUnKSB7XG4gICAgICAgIHJldHVybiBfYmV6aWVyQ3VydmVUbztcbiAgICB9XG4gICAgcmV0dXJuIGxpbmVUbztcbn1cbmZ1bmN0aW9uIHBhdGhWYXJzKHBvaW50cywgc2VnbWVudCwgcGFyYW1zID0ge30pIHtcbiAgICBjb25zdCBjb3VudCA9IHBvaW50cy5sZW5ndGg7XG4gICAgY29uc3QgeyBzdGFydDogcGFyYW1zU3RhcnQgPSAwICwgZW5kOiBwYXJhbXNFbmQgPSBjb3VudCAtIDEgIH0gPSBwYXJhbXM7XG4gICAgY29uc3QgeyBzdGFydDogc2VnbWVudFN0YXJ0ICwgZW5kOiBzZWdtZW50RW5kICB9ID0gc2VnbWVudDtcbiAgICBjb25zdCBzdGFydCA9IE1hdGgubWF4KHBhcmFtc1N0YXJ0LCBzZWdtZW50U3RhcnQpO1xuICAgIGNvbnN0IGVuZCA9IE1hdGgubWluKHBhcmFtc0VuZCwgc2VnbWVudEVuZCk7XG4gICAgY29uc3Qgb3V0c2lkZSA9IHBhcmFtc1N0YXJ0IDwgc2VnbWVudFN0YXJ0ICYmIHBhcmFtc0VuZCA8IHNlZ21lbnRTdGFydCB8fCBwYXJhbXNTdGFydCA+IHNlZ21lbnRFbmQgJiYgcGFyYW1zRW5kID4gc2VnbWVudEVuZDtcbiAgICByZXR1cm4ge1xuICAgICAgICBjb3VudCxcbiAgICAgICAgc3RhcnQsXG4gICAgICAgIGxvb3A6IHNlZ21lbnQubG9vcCxcbiAgICAgICAgaWxlbjogZW5kIDwgc3RhcnQgJiYgIW91dHNpZGUgPyBjb3VudCArIGVuZCAtIHN0YXJ0IDogZW5kIC0gc3RhcnRcbiAgICB9O1xufVxuIGZ1bmN0aW9uIHBhdGhTZWdtZW50KGN0eCwgbGluZSwgc2VnbWVudCwgcGFyYW1zKSB7XG4gICAgY29uc3QgeyBwb2ludHMgLCBvcHRpb25zICB9ID0gbGluZTtcbiAgICBjb25zdCB7IGNvdW50ICwgc3RhcnQgLCBsb29wICwgaWxlbiAgfSA9IHBhdGhWYXJzKHBvaW50cywgc2VnbWVudCwgcGFyYW1zKTtcbiAgICBjb25zdCBsaW5lTWV0aG9kID0gZ2V0TGluZU1ldGhvZChvcHRpb25zKTtcbiAgICBsZXQgeyBtb3ZlID10cnVlICwgcmV2ZXJzZSAgfSA9IHBhcmFtcyB8fCB7fTtcbiAgICBsZXQgaSwgcG9pbnQsIHByZXY7XG4gICAgZm9yKGkgPSAwOyBpIDw9IGlsZW47ICsraSl7XG4gICAgICAgIHBvaW50ID0gcG9pbnRzWyhzdGFydCArIChyZXZlcnNlID8gaWxlbiAtIGkgOiBpKSkgJSBjb3VudF07XG4gICAgICAgIGlmIChwb2ludC5za2lwKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSBlbHNlIGlmIChtb3ZlKSB7XG4gICAgICAgICAgICBjdHgubW92ZVRvKHBvaW50LngsIHBvaW50LnkpO1xuICAgICAgICAgICAgbW92ZSA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGluZU1ldGhvZChjdHgsIHByZXYsIHBvaW50LCByZXZlcnNlLCBvcHRpb25zLnN0ZXBwZWQpO1xuICAgICAgICB9XG4gICAgICAgIHByZXYgPSBwb2ludDtcbiAgICB9XG4gICAgaWYgKGxvb3ApIHtcbiAgICAgICAgcG9pbnQgPSBwb2ludHNbKHN0YXJ0ICsgKHJldmVyc2UgPyBpbGVuIDogMCkpICUgY291bnRdO1xuICAgICAgICBsaW5lTWV0aG9kKGN0eCwgcHJldiwgcG9pbnQsIHJldmVyc2UsIG9wdGlvbnMuc3RlcHBlZCk7XG4gICAgfVxuICAgIHJldHVybiAhIWxvb3A7XG59XG4gZnVuY3Rpb24gZmFzdFBhdGhTZWdtZW50KGN0eCwgbGluZSwgc2VnbWVudCwgcGFyYW1zKSB7XG4gICAgY29uc3QgcG9pbnRzID0gbGluZS5wb2ludHM7XG4gICAgY29uc3QgeyBjb3VudCAsIHN0YXJ0ICwgaWxlbiAgfSA9IHBhdGhWYXJzKHBvaW50cywgc2VnbWVudCwgcGFyYW1zKTtcbiAgICBjb25zdCB7IG1vdmUgPXRydWUgLCByZXZlcnNlICB9ID0gcGFyYW1zIHx8IHt9O1xuICAgIGxldCBhdmdYID0gMDtcbiAgICBsZXQgY291bnRYID0gMDtcbiAgICBsZXQgaSwgcG9pbnQsIHByZXZYLCBtaW5ZLCBtYXhZLCBsYXN0WTtcbiAgICBjb25zdCBwb2ludEluZGV4ID0gKGluZGV4KT0+KHN0YXJ0ICsgKHJldmVyc2UgPyBpbGVuIC0gaW5kZXggOiBpbmRleCkpICUgY291bnQ7XG4gICAgY29uc3QgZHJhd1ggPSAoKT0+e1xuICAgICAgICBpZiAobWluWSAhPT0gbWF4WSkge1xuICAgICAgICAgICAgY3R4LmxpbmVUbyhhdmdYLCBtYXhZKTtcbiAgICAgICAgICAgIGN0eC5saW5lVG8oYXZnWCwgbWluWSk7XG4gICAgICAgICAgICBjdHgubGluZVRvKGF2Z1gsIGxhc3RZKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgaWYgKG1vdmUpIHtcbiAgICAgICAgcG9pbnQgPSBwb2ludHNbcG9pbnRJbmRleCgwKV07XG4gICAgICAgIGN0eC5tb3ZlVG8ocG9pbnQueCwgcG9pbnQueSk7XG4gICAgfVxuICAgIGZvcihpID0gMDsgaSA8PSBpbGVuOyArK2kpe1xuICAgICAgICBwb2ludCA9IHBvaW50c1twb2ludEluZGV4KGkpXTtcbiAgICAgICAgaWYgKHBvaW50LnNraXApIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHggPSBwb2ludC54O1xuICAgICAgICBjb25zdCB5ID0gcG9pbnQueTtcbiAgICAgICAgY29uc3QgdHJ1bmNYID0geCB8IDA7XG4gICAgICAgIGlmICh0cnVuY1ggPT09IHByZXZYKSB7XG4gICAgICAgICAgICBpZiAoeSA8IG1pblkpIHtcbiAgICAgICAgICAgICAgICBtaW5ZID0geTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoeSA+IG1heFkpIHtcbiAgICAgICAgICAgICAgICBtYXhZID0geTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF2Z1ggPSAoY291bnRYICogYXZnWCArIHgpIC8gKytjb3VudFg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkcmF3WCgpO1xuICAgICAgICAgICAgY3R4LmxpbmVUbyh4LCB5KTtcbiAgICAgICAgICAgIHByZXZYID0gdHJ1bmNYO1xuICAgICAgICAgICAgY291bnRYID0gMDtcbiAgICAgICAgICAgIG1pblkgPSBtYXhZID0geTtcbiAgICAgICAgfVxuICAgICAgICBsYXN0WSA9IHk7XG4gICAgfVxuICAgIGRyYXdYKCk7XG59XG4gZnVuY3Rpb24gX2dldFNlZ21lbnRNZXRob2QobGluZSkge1xuICAgIGNvbnN0IG9wdHMgPSBsaW5lLm9wdGlvbnM7XG4gICAgY29uc3QgYm9yZGVyRGFzaCA9IG9wdHMuYm9yZGVyRGFzaCAmJiBvcHRzLmJvcmRlckRhc2gubGVuZ3RoO1xuICAgIGNvbnN0IHVzZUZhc3RQYXRoID0gIWxpbmUuX2RlY2ltYXRlZCAmJiAhbGluZS5fbG9vcCAmJiAhb3B0cy50ZW5zaW9uICYmIG9wdHMuY3ViaWNJbnRlcnBvbGF0aW9uTW9kZSAhPT0gJ21vbm90b25lJyAmJiAhb3B0cy5zdGVwcGVkICYmICFib3JkZXJEYXNoO1xuICAgIHJldHVybiB1c2VGYXN0UGF0aCA/IGZhc3RQYXRoU2VnbWVudCA6IHBhdGhTZWdtZW50O1xufVxuIGZ1bmN0aW9uIF9nZXRJbnRlcnBvbGF0aW9uTWV0aG9kKG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy5zdGVwcGVkKSB7XG4gICAgICAgIHJldHVybiBfc3RlcHBlZEludGVycG9sYXRpb247XG4gICAgfVxuICAgIGlmIChvcHRpb25zLnRlbnNpb24gfHwgb3B0aW9ucy5jdWJpY0ludGVycG9sYXRpb25Nb2RlID09PSAnbW9ub3RvbmUnKSB7XG4gICAgICAgIHJldHVybiBfYmV6aWVySW50ZXJwb2xhdGlvbjtcbiAgICB9XG4gICAgcmV0dXJuIF9wb2ludEluTGluZTtcbn1cbmZ1bmN0aW9uIHN0cm9rZVBhdGhXaXRoQ2FjaGUoY3R4LCBsaW5lLCBzdGFydCwgY291bnQpIHtcbiAgICBsZXQgcGF0aCA9IGxpbmUuX3BhdGg7XG4gICAgaWYgKCFwYXRoKSB7XG4gICAgICAgIHBhdGggPSBsaW5lLl9wYXRoID0gbmV3IFBhdGgyRCgpO1xuICAgICAgICBpZiAobGluZS5wYXRoKHBhdGgsIHN0YXJ0LCBjb3VudCkpIHtcbiAgICAgICAgICAgIHBhdGguY2xvc2VQYXRoKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2V0U3R5bGUoY3R4LCBsaW5lLm9wdGlvbnMpO1xuICAgIGN0eC5zdHJva2UocGF0aCk7XG59XG5mdW5jdGlvbiBzdHJva2VQYXRoRGlyZWN0KGN0eCwgbGluZSwgc3RhcnQsIGNvdW50KSB7XG4gICAgY29uc3QgeyBzZWdtZW50cyAsIG9wdGlvbnMgIH0gPSBsaW5lO1xuICAgIGNvbnN0IHNlZ21lbnRNZXRob2QgPSBfZ2V0U2VnbWVudE1ldGhvZChsaW5lKTtcbiAgICBmb3IgKGNvbnN0IHNlZ21lbnQgb2Ygc2VnbWVudHMpe1xuICAgICAgICBzZXRTdHlsZShjdHgsIG9wdGlvbnMsIHNlZ21lbnQuc3R5bGUpO1xuICAgICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgICAgIGlmIChzZWdtZW50TWV0aG9kKGN0eCwgbGluZSwgc2VnbWVudCwge1xuICAgICAgICAgICAgc3RhcnQsXG4gICAgICAgICAgICBlbmQ6IHN0YXJ0ICsgY291bnQgLSAxXG4gICAgICAgIH0pKSB7XG4gICAgICAgICAgICBjdHguY2xvc2VQYXRoKCk7XG4gICAgICAgIH1cbiAgICAgICAgY3R4LnN0cm9rZSgpO1xuICAgIH1cbn1cbmNvbnN0IHVzZVBhdGgyRCA9IHR5cGVvZiBQYXRoMkQgPT09ICdmdW5jdGlvbic7XG5mdW5jdGlvbiBkcmF3KGN0eCwgbGluZSwgc3RhcnQsIGNvdW50KSB7XG4gICAgaWYgKHVzZVBhdGgyRCAmJiAhbGluZS5vcHRpb25zLnNlZ21lbnQpIHtcbiAgICAgICAgc3Ryb2tlUGF0aFdpdGhDYWNoZShjdHgsIGxpbmUsIHN0YXJ0LCBjb3VudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgc3Ryb2tlUGF0aERpcmVjdChjdHgsIGxpbmUsIHN0YXJ0LCBjb3VudCk7XG4gICAgfVxufVxuY2xhc3MgTGluZUVsZW1lbnQgZXh0ZW5kcyBFbGVtZW50IHtcbiAgICBzdGF0aWMgaWQgPSAnbGluZSc7XG4gc3RhdGljIGRlZmF1bHRzID0ge1xuICAgICAgICBib3JkZXJDYXBTdHlsZTogJ2J1dHQnLFxuICAgICAgICBib3JkZXJEYXNoOiBbXSxcbiAgICAgICAgYm9yZGVyRGFzaE9mZnNldDogMCxcbiAgICAgICAgYm9yZGVySm9pblN0eWxlOiAnbWl0ZXInLFxuICAgICAgICBib3JkZXJXaWR0aDogMyxcbiAgICAgICAgY2FwQmV6aWVyUG9pbnRzOiB0cnVlLFxuICAgICAgICBjdWJpY0ludGVycG9sYXRpb25Nb2RlOiAnZGVmYXVsdCcsXG4gICAgICAgIGZpbGw6IGZhbHNlLFxuICAgICAgICBzcGFuR2FwczogZmFsc2UsXG4gICAgICAgIHN0ZXBwZWQ6IGZhbHNlLFxuICAgICAgICB0ZW5zaW9uOiAwXG4gICAgfTtcbiBzdGF0aWMgZGVmYXVsdFJvdXRlcyA9IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiAnYmFja2dyb3VuZENvbG9yJyxcbiAgICAgICAgYm9yZGVyQ29sb3I6ICdib3JkZXJDb2xvcidcbiAgICB9O1xuICAgIHN0YXRpYyBkZXNjcmlwdG9ycyA9IHtcbiAgICAgICAgX3NjcmlwdGFibGU6IHRydWUsXG4gICAgICAgIF9pbmRleGFibGU6IChuYW1lKT0+bmFtZSAhPT0gJ2JvcmRlckRhc2gnICYmIG5hbWUgIT09ICdmaWxsJ1xuICAgIH07XG4gICAgY29uc3RydWN0b3IoY2ZnKXtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5hbmltYXRlZCA9IHRydWU7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fY2hhcnQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX2xvb3AgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX2Z1bGxMb29wID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9wYXRoID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9wb2ludHMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX3NlZ21lbnRzID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9kZWNpbWF0ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fcG9pbnRzVXBkYXRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9kYXRhc2V0SW5kZXggPSB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChjZmcpIHtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgY2ZnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB1cGRhdGVDb250cm9sUG9pbnRzKGNoYXJ0QXJlYSwgaW5kZXhBeGlzKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIGlmICgob3B0aW9ucy50ZW5zaW9uIHx8IG9wdGlvbnMuY3ViaWNJbnRlcnBvbGF0aW9uTW9kZSA9PT0gJ21vbm90b25lJykgJiYgIW9wdGlvbnMuc3RlcHBlZCAmJiAhdGhpcy5fcG9pbnRzVXBkYXRlZCkge1xuICAgICAgICAgICAgY29uc3QgbG9vcCA9IG9wdGlvbnMuc3BhbkdhcHMgPyB0aGlzLl9sb29wIDogdGhpcy5fZnVsbExvb3A7XG4gICAgICAgICAgICBfdXBkYXRlQmV6aWVyQ29udHJvbFBvaW50cyh0aGlzLl9wb2ludHMsIG9wdGlvbnMsIGNoYXJ0QXJlYSwgbG9vcCwgaW5kZXhBeGlzKTtcbiAgICAgICAgICAgIHRoaXMuX3BvaW50c1VwZGF0ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNldCBwb2ludHMocG9pbnRzKSB7XG4gICAgICAgIHRoaXMuX3BvaW50cyA9IHBvaW50cztcbiAgICAgICAgZGVsZXRlIHRoaXMuX3NlZ21lbnRzO1xuICAgICAgICBkZWxldGUgdGhpcy5fcGF0aDtcbiAgICAgICAgdGhpcy5fcG9pbnRzVXBkYXRlZCA9IGZhbHNlO1xuICAgIH1cbiAgICBnZXQgcG9pbnRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcG9pbnRzO1xuICAgIH1cbiAgICBnZXQgc2VnbWVudHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZWdtZW50cyB8fCAodGhpcy5fc2VnbWVudHMgPSBfY29tcHV0ZVNlZ21lbnRzKHRoaXMsIHRoaXMub3B0aW9ucy5zZWdtZW50KSk7XG4gICAgfVxuIGZpcnN0KCkge1xuICAgICAgICBjb25zdCBzZWdtZW50cyA9IHRoaXMuc2VnbWVudHM7XG4gICAgICAgIGNvbnN0IHBvaW50cyA9IHRoaXMucG9pbnRzO1xuICAgICAgICByZXR1cm4gc2VnbWVudHMubGVuZ3RoICYmIHBvaW50c1tzZWdtZW50c1swXS5zdGFydF07XG4gICAgfVxuIGxhc3QoKSB7XG4gICAgICAgIGNvbnN0IHNlZ21lbnRzID0gdGhpcy5zZWdtZW50cztcbiAgICAgICAgY29uc3QgcG9pbnRzID0gdGhpcy5wb2ludHM7XG4gICAgICAgIGNvbnN0IGNvdW50ID0gc2VnbWVudHMubGVuZ3RoO1xuICAgICAgICByZXR1cm4gY291bnQgJiYgcG9pbnRzW3NlZ21lbnRzW2NvdW50IC0gMV0uZW5kXTtcbiAgICB9XG4gaW50ZXJwb2xhdGUocG9pbnQsIHByb3BlcnR5KSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcG9pbnRbcHJvcGVydHldO1xuICAgICAgICBjb25zdCBwb2ludHMgPSB0aGlzLnBvaW50cztcbiAgICAgICAgY29uc3Qgc2VnbWVudHMgPSBfYm91bmRTZWdtZW50cyh0aGlzLCB7XG4gICAgICAgICAgICBwcm9wZXJ0eSxcbiAgICAgICAgICAgIHN0YXJ0OiB2YWx1ZSxcbiAgICAgICAgICAgIGVuZDogdmFsdWVcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghc2VnbWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgICAgIGNvbnN0IF9pbnRlcnBvbGF0ZSA9IF9nZXRJbnRlcnBvbGF0aW9uTWV0aG9kKG9wdGlvbnMpO1xuICAgICAgICBsZXQgaSwgaWxlbjtcbiAgICAgICAgZm9yKGkgPSAwLCBpbGVuID0gc2VnbWVudHMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKXtcbiAgICAgICAgICAgIGNvbnN0IHsgc3RhcnQgLCBlbmQgIH0gPSBzZWdtZW50c1tpXTtcbiAgICAgICAgICAgIGNvbnN0IHAxID0gcG9pbnRzW3N0YXJ0XTtcbiAgICAgICAgICAgIGNvbnN0IHAyID0gcG9pbnRzW2VuZF07XG4gICAgICAgICAgICBpZiAocDEgPT09IHAyKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gocDEpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdCA9IE1hdGguYWJzKCh2YWx1ZSAtIHAxW3Byb3BlcnR5XSkgLyAocDJbcHJvcGVydHldIC0gcDFbcHJvcGVydHldKSk7XG4gICAgICAgICAgICBjb25zdCBpbnRlcnBvbGF0ZWQgPSBfaW50ZXJwb2xhdGUocDEsIHAyLCB0LCBvcHRpb25zLnN0ZXBwZWQpO1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkW3Byb3BlcnR5XSA9IHBvaW50W3Byb3BlcnR5XTtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGludGVycG9sYXRlZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdC5sZW5ndGggPT09IDEgPyByZXN1bHRbMF0gOiByZXN1bHQ7XG4gICAgfVxuIHBhdGhTZWdtZW50KGN0eCwgc2VnbWVudCwgcGFyYW1zKSB7XG4gICAgICAgIGNvbnN0IHNlZ21lbnRNZXRob2QgPSBfZ2V0U2VnbWVudE1ldGhvZCh0aGlzKTtcbiAgICAgICAgcmV0dXJuIHNlZ21lbnRNZXRob2QoY3R4LCB0aGlzLCBzZWdtZW50LCBwYXJhbXMpO1xuICAgIH1cbiBwYXRoKGN0eCwgc3RhcnQsIGNvdW50KSB7XG4gICAgICAgIGNvbnN0IHNlZ21lbnRzID0gdGhpcy5zZWdtZW50cztcbiAgICAgICAgY29uc3Qgc2VnbWVudE1ldGhvZCA9IF9nZXRTZWdtZW50TWV0aG9kKHRoaXMpO1xuICAgICAgICBsZXQgbG9vcCA9IHRoaXMuX2xvb3A7XG4gICAgICAgIHN0YXJ0ID0gc3RhcnQgfHwgMDtcbiAgICAgICAgY291bnQgPSBjb3VudCB8fCB0aGlzLnBvaW50cy5sZW5ndGggLSBzdGFydDtcbiAgICAgICAgZm9yIChjb25zdCBzZWdtZW50IG9mIHNlZ21lbnRzKXtcbiAgICAgICAgICAgIGxvb3AgJj0gc2VnbWVudE1ldGhvZChjdHgsIHRoaXMsIHNlZ21lbnQsIHtcbiAgICAgICAgICAgICAgICBzdGFydCxcbiAgICAgICAgICAgICAgICBlbmQ6IHN0YXJ0ICsgY291bnQgLSAxXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gISFsb29wO1xuICAgIH1cbiBkcmF3KGN0eCwgY2hhcnRBcmVhLCBzdGFydCwgY291bnQpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9ucyB8fCB7fTtcbiAgICAgICAgY29uc3QgcG9pbnRzID0gdGhpcy5wb2ludHMgfHwgW107XG4gICAgICAgIGlmIChwb2ludHMubGVuZ3RoICYmIG9wdGlvbnMuYm9yZGVyV2lkdGgpIHtcbiAgICAgICAgICAgIGN0eC5zYXZlKCk7XG4gICAgICAgICAgICBkcmF3KGN0eCwgdGhpcywgc3RhcnQsIGNvdW50KTtcbiAgICAgICAgICAgIGN0eC5yZXN0b3JlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuYW5pbWF0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3BvaW50c1VwZGF0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuX3BhdGggPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIGluUmFuZ2UkMShlbCwgcG9zLCBheGlzLCB1c2VGaW5hbFBvc2l0aW9uKSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IGVsLm9wdGlvbnM7XG4gICAgY29uc3QgeyBbYXhpc106IHZhbHVlICB9ID0gZWwuZ2V0UHJvcHMoW1xuICAgICAgICBheGlzXG4gICAgXSwgdXNlRmluYWxQb3NpdGlvbik7XG4gICAgcmV0dXJuIE1hdGguYWJzKHBvcyAtIHZhbHVlKSA8IG9wdGlvbnMucmFkaXVzICsgb3B0aW9ucy5oaXRSYWRpdXM7XG59XG5jbGFzcyBQb2ludEVsZW1lbnQgZXh0ZW5kcyBFbGVtZW50IHtcbiAgICBzdGF0aWMgaWQgPSAncG9pbnQnO1xuICAgIHBhcnNlZDtcbiAgICBza2lwO1xuICAgIHN0b3A7XG4gICAgLyoqXG4gICAqIEB0eXBlIHthbnl9XG4gICAqLyBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgICAgIGJvcmRlcldpZHRoOiAxLFxuICAgICAgICBoaXRSYWRpdXM6IDEsXG4gICAgICAgIGhvdmVyQm9yZGVyV2lkdGg6IDEsXG4gICAgICAgIGhvdmVyUmFkaXVzOiA0LFxuICAgICAgICBwb2ludFN0eWxlOiAnY2lyY2xlJyxcbiAgICAgICAgcmFkaXVzOiAzLFxuICAgICAgICByb3RhdGlvbjogMFxuICAgIH07XG4gICAgLyoqXG4gICAqIEB0eXBlIHthbnl9XG4gICAqLyBzdGF0aWMgZGVmYXVsdFJvdXRlcyA9IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiAnYmFja2dyb3VuZENvbG9yJyxcbiAgICAgICAgYm9yZGVyQ29sb3I6ICdib3JkZXJDb2xvcidcbiAgICB9O1xuICAgIGNvbnN0cnVjdG9yKGNmZyl7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5wYXJzZWQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuc2tpcCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5zdG9wID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAoY2ZnKSB7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGNmZyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaW5SYW5nZShtb3VzZVgsIG1vdXNlWSwgdXNlRmluYWxQb3NpdGlvbikge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgICAgICBjb25zdCB7IHggLCB5ICB9ID0gdGhpcy5nZXRQcm9wcyhbXG4gICAgICAgICAgICAneCcsXG4gICAgICAgICAgICAneSdcbiAgICAgICAgXSwgdXNlRmluYWxQb3NpdGlvbik7XG4gICAgICAgIHJldHVybiBNYXRoLnBvdyhtb3VzZVggLSB4LCAyKSArIE1hdGgucG93KG1vdXNlWSAtIHksIDIpIDwgTWF0aC5wb3cob3B0aW9ucy5oaXRSYWRpdXMgKyBvcHRpb25zLnJhZGl1cywgMik7XG4gICAgfVxuICAgIGluWFJhbmdlKG1vdXNlWCwgdXNlRmluYWxQb3NpdGlvbikge1xuICAgICAgICByZXR1cm4gaW5SYW5nZSQxKHRoaXMsIG1vdXNlWCwgJ3gnLCB1c2VGaW5hbFBvc2l0aW9uKTtcbiAgICB9XG4gICAgaW5ZUmFuZ2UobW91c2VZLCB1c2VGaW5hbFBvc2l0aW9uKSB7XG4gICAgICAgIHJldHVybiBpblJhbmdlJDEodGhpcywgbW91c2VZLCAneScsIHVzZUZpbmFsUG9zaXRpb24pO1xuICAgIH1cbiAgICBnZXRDZW50ZXJQb2ludCh1c2VGaW5hbFBvc2l0aW9uKSB7XG4gICAgICAgIGNvbnN0IHsgeCAsIHkgIH0gPSB0aGlzLmdldFByb3BzKFtcbiAgICAgICAgICAgICd4JyxcbiAgICAgICAgICAgICd5J1xuICAgICAgICBdLCB1c2VGaW5hbFBvc2l0aW9uKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHgsXG4gICAgICAgICAgICB5XG4gICAgICAgIH07XG4gICAgfVxuICAgIHNpemUob3B0aW9ucykge1xuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB0aGlzLm9wdGlvbnMgfHwge307XG4gICAgICAgIGxldCByYWRpdXMgPSBvcHRpb25zLnJhZGl1cyB8fCAwO1xuICAgICAgICByYWRpdXMgPSBNYXRoLm1heChyYWRpdXMsIHJhZGl1cyAmJiBvcHRpb25zLmhvdmVyUmFkaXVzIHx8IDApO1xuICAgICAgICBjb25zdCBib3JkZXJXaWR0aCA9IHJhZGl1cyAmJiBvcHRpb25zLmJvcmRlcldpZHRoIHx8IDA7XG4gICAgICAgIHJldHVybiAocmFkaXVzICsgYm9yZGVyV2lkdGgpICogMjtcbiAgICB9XG4gICAgZHJhdyhjdHgsIGFyZWEpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgaWYgKHRoaXMuc2tpcCB8fCBvcHRpb25zLnJhZGl1cyA8IDAuMSB8fCAhX2lzUG9pbnRJbkFyZWEodGhpcywgYXJlYSwgdGhpcy5zaXplKG9wdGlvbnMpIC8gMikpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSBvcHRpb25zLmJvcmRlckNvbG9yO1xuICAgICAgICBjdHgubGluZVdpZHRoID0gb3B0aW9ucy5ib3JkZXJXaWR0aDtcbiAgICAgICAgY3R4LmZpbGxTdHlsZSA9IG9wdGlvbnMuYmFja2dyb3VuZENvbG9yO1xuICAgICAgICBkcmF3UG9pbnQoY3R4LCBvcHRpb25zLCB0aGlzLngsIHRoaXMueSk7XG4gICAgfVxuICAgIGdldFJhbmdlKCkge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zIHx8IHt9O1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIEZhbGxiYWNrcyBzaG91bGQgbmV2ZXIgYmUgaGl0IGluIHByYWN0aWNlXG4gICAgICAgIHJldHVybiBvcHRpb25zLnJhZGl1cyArIG9wdGlvbnMuaGl0UmFkaXVzO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZ2V0QmFyQm91bmRzKGJhciwgdXNlRmluYWxQb3NpdGlvbikge1xuICAgIGNvbnN0IHsgeCAsIHkgLCBiYXNlICwgd2lkdGggLCBoZWlnaHQgIH0gPSAgYmFyLmdldFByb3BzKFtcbiAgICAgICAgJ3gnLFxuICAgICAgICAneScsXG4gICAgICAgICdiYXNlJyxcbiAgICAgICAgJ3dpZHRoJyxcbiAgICAgICAgJ2hlaWdodCdcbiAgICBdLCB1c2VGaW5hbFBvc2l0aW9uKTtcbiAgICBsZXQgbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tLCBoYWxmO1xuICAgIGlmIChiYXIuaG9yaXpvbnRhbCkge1xuICAgICAgICBoYWxmID0gaGVpZ2h0IC8gMjtcbiAgICAgICAgbGVmdCA9IE1hdGgubWluKHgsIGJhc2UpO1xuICAgICAgICByaWdodCA9IE1hdGgubWF4KHgsIGJhc2UpO1xuICAgICAgICB0b3AgPSB5IC0gaGFsZjtcbiAgICAgICAgYm90dG9tID0geSArIGhhbGY7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgaGFsZiA9IHdpZHRoIC8gMjtcbiAgICAgICAgbGVmdCA9IHggLSBoYWxmO1xuICAgICAgICByaWdodCA9IHggKyBoYWxmO1xuICAgICAgICB0b3AgPSBNYXRoLm1pbih5LCBiYXNlKTtcbiAgICAgICAgYm90dG9tID0gTWF0aC5tYXgoeSwgYmFzZSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGxlZnQsXG4gICAgICAgIHRvcCxcbiAgICAgICAgcmlnaHQsXG4gICAgICAgIGJvdHRvbVxuICAgIH07XG59XG5mdW5jdGlvbiBza2lwT3JMaW1pdChza2lwLCB2YWx1ZSwgbWluLCBtYXgpIHtcbiAgICByZXR1cm4gc2tpcCA/IDAgOiBfbGltaXRWYWx1ZSh2YWx1ZSwgbWluLCBtYXgpO1xufVxuZnVuY3Rpb24gcGFyc2VCb3JkZXJXaWR0aChiYXIsIG1heFcsIG1heEgpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGJhci5vcHRpb25zLmJvcmRlcldpZHRoO1xuICAgIGNvbnN0IHNraXAgPSBiYXIuYm9yZGVyU2tpcHBlZDtcbiAgICBjb25zdCBvID0gdG9UUkJMKHZhbHVlKTtcbiAgICByZXR1cm4ge1xuICAgICAgICB0OiBza2lwT3JMaW1pdChza2lwLnRvcCwgby50b3AsIDAsIG1heEgpLFxuICAgICAgICByOiBza2lwT3JMaW1pdChza2lwLnJpZ2h0LCBvLnJpZ2h0LCAwLCBtYXhXKSxcbiAgICAgICAgYjogc2tpcE9yTGltaXQoc2tpcC5ib3R0b20sIG8uYm90dG9tLCAwLCBtYXhIKSxcbiAgICAgICAgbDogc2tpcE9yTGltaXQoc2tpcC5sZWZ0LCBvLmxlZnQsIDAsIG1heFcpXG4gICAgfTtcbn1cbmZ1bmN0aW9uIHBhcnNlQm9yZGVyUmFkaXVzKGJhciwgbWF4VywgbWF4SCkge1xuICAgIGNvbnN0IHsgZW5hYmxlQm9yZGVyUmFkaXVzICB9ID0gYmFyLmdldFByb3BzKFtcbiAgICAgICAgJ2VuYWJsZUJvcmRlclJhZGl1cydcbiAgICBdKTtcbiAgICBjb25zdCB2YWx1ZSA9IGJhci5vcHRpb25zLmJvcmRlclJhZGl1cztcbiAgICBjb25zdCBvID0gdG9UUkJMQ29ybmVycyh2YWx1ZSk7XG4gICAgY29uc3QgbWF4UiA9IE1hdGgubWluKG1heFcsIG1heEgpO1xuICAgIGNvbnN0IHNraXAgPSBiYXIuYm9yZGVyU2tpcHBlZDtcbiAgICBjb25zdCBlbmFibGVCb3JkZXIgPSBlbmFibGVCb3JkZXJSYWRpdXMgfHwgaXNPYmplY3QodmFsdWUpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHRvcExlZnQ6IHNraXBPckxpbWl0KCFlbmFibGVCb3JkZXIgfHwgc2tpcC50b3AgfHwgc2tpcC5sZWZ0LCBvLnRvcExlZnQsIDAsIG1heFIpLFxuICAgICAgICB0b3BSaWdodDogc2tpcE9yTGltaXQoIWVuYWJsZUJvcmRlciB8fCBza2lwLnRvcCB8fCBza2lwLnJpZ2h0LCBvLnRvcFJpZ2h0LCAwLCBtYXhSKSxcbiAgICAgICAgYm90dG9tTGVmdDogc2tpcE9yTGltaXQoIWVuYWJsZUJvcmRlciB8fCBza2lwLmJvdHRvbSB8fCBza2lwLmxlZnQsIG8uYm90dG9tTGVmdCwgMCwgbWF4UiksXG4gICAgICAgIGJvdHRvbVJpZ2h0OiBza2lwT3JMaW1pdCghZW5hYmxlQm9yZGVyIHx8IHNraXAuYm90dG9tIHx8IHNraXAucmlnaHQsIG8uYm90dG9tUmlnaHQsIDAsIG1heFIpXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGJvdW5kaW5nUmVjdHMoYmFyKSB7XG4gICAgY29uc3QgYm91bmRzID0gZ2V0QmFyQm91bmRzKGJhcik7XG4gICAgY29uc3Qgd2lkdGggPSBib3VuZHMucmlnaHQgLSBib3VuZHMubGVmdDtcbiAgICBjb25zdCBoZWlnaHQgPSBib3VuZHMuYm90dG9tIC0gYm91bmRzLnRvcDtcbiAgICBjb25zdCBib3JkZXIgPSBwYXJzZUJvcmRlcldpZHRoKGJhciwgd2lkdGggLyAyLCBoZWlnaHQgLyAyKTtcbiAgICBjb25zdCByYWRpdXMgPSBwYXJzZUJvcmRlclJhZGl1cyhiYXIsIHdpZHRoIC8gMiwgaGVpZ2h0IC8gMik7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgb3V0ZXI6IHtcbiAgICAgICAgICAgIHg6IGJvdW5kcy5sZWZ0LFxuICAgICAgICAgICAgeTogYm91bmRzLnRvcCxcbiAgICAgICAgICAgIHc6IHdpZHRoLFxuICAgICAgICAgICAgaDogaGVpZ2h0LFxuICAgICAgICAgICAgcmFkaXVzXG4gICAgICAgIH0sXG4gICAgICAgIGlubmVyOiB7XG4gICAgICAgICAgICB4OiBib3VuZHMubGVmdCArIGJvcmRlci5sLFxuICAgICAgICAgICAgeTogYm91bmRzLnRvcCArIGJvcmRlci50LFxuICAgICAgICAgICAgdzogd2lkdGggLSBib3JkZXIubCAtIGJvcmRlci5yLFxuICAgICAgICAgICAgaDogaGVpZ2h0IC0gYm9yZGVyLnQgLSBib3JkZXIuYixcbiAgICAgICAgICAgIHJhZGl1czoge1xuICAgICAgICAgICAgICAgIHRvcExlZnQ6IE1hdGgubWF4KDAsIHJhZGl1cy50b3BMZWZ0IC0gTWF0aC5tYXgoYm9yZGVyLnQsIGJvcmRlci5sKSksXG4gICAgICAgICAgICAgICAgdG9wUmlnaHQ6IE1hdGgubWF4KDAsIHJhZGl1cy50b3BSaWdodCAtIE1hdGgubWF4KGJvcmRlci50LCBib3JkZXIucikpLFxuICAgICAgICAgICAgICAgIGJvdHRvbUxlZnQ6IE1hdGgubWF4KDAsIHJhZGl1cy5ib3R0b21MZWZ0IC0gTWF0aC5tYXgoYm9yZGVyLmIsIGJvcmRlci5sKSksXG4gICAgICAgICAgICAgICAgYm90dG9tUmlnaHQ6IE1hdGgubWF4KDAsIHJhZGl1cy5ib3R0b21SaWdodCAtIE1hdGgubWF4KGJvcmRlci5iLCBib3JkZXIucikpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xufVxuZnVuY3Rpb24gaW5SYW5nZShiYXIsIHgsIHksIHVzZUZpbmFsUG9zaXRpb24pIHtcbiAgICBjb25zdCBza2lwWCA9IHggPT09IG51bGw7XG4gICAgY29uc3Qgc2tpcFkgPSB5ID09PSBudWxsO1xuICAgIGNvbnN0IHNraXBCb3RoID0gc2tpcFggJiYgc2tpcFk7XG4gICAgY29uc3QgYm91bmRzID0gYmFyICYmICFza2lwQm90aCAmJiBnZXRCYXJCb3VuZHMoYmFyLCB1c2VGaW5hbFBvc2l0aW9uKTtcbiAgICByZXR1cm4gYm91bmRzICYmIChza2lwWCB8fCBfaXNCZXR3ZWVuKHgsIGJvdW5kcy5sZWZ0LCBib3VuZHMucmlnaHQpKSAmJiAoc2tpcFkgfHwgX2lzQmV0d2Vlbih5LCBib3VuZHMudG9wLCBib3VuZHMuYm90dG9tKSk7XG59XG5mdW5jdGlvbiBoYXNSYWRpdXMocmFkaXVzKSB7XG4gICAgcmV0dXJuIHJhZGl1cy50b3BMZWZ0IHx8IHJhZGl1cy50b3BSaWdodCB8fCByYWRpdXMuYm90dG9tTGVmdCB8fCByYWRpdXMuYm90dG9tUmlnaHQ7XG59XG4gZnVuY3Rpb24gYWRkTm9ybWFsUmVjdFBhdGgoY3R4LCByZWN0KSB7XG4gICAgY3R4LnJlY3QocmVjdC54LCByZWN0LnksIHJlY3QudywgcmVjdC5oKTtcbn1cbmZ1bmN0aW9uIGluZmxhdGVSZWN0KHJlY3QsIGFtb3VudCwgcmVmUmVjdCA9IHt9KSB7XG4gICAgY29uc3QgeCA9IHJlY3QueCAhPT0gcmVmUmVjdC54ID8gLWFtb3VudCA6IDA7XG4gICAgY29uc3QgeSA9IHJlY3QueSAhPT0gcmVmUmVjdC55ID8gLWFtb3VudCA6IDA7XG4gICAgY29uc3QgdyA9IChyZWN0LnggKyByZWN0LncgIT09IHJlZlJlY3QueCArIHJlZlJlY3QudyA/IGFtb3VudCA6IDApIC0geDtcbiAgICBjb25zdCBoID0gKHJlY3QueSArIHJlY3QuaCAhPT0gcmVmUmVjdC55ICsgcmVmUmVjdC5oID8gYW1vdW50IDogMCkgLSB5O1xuICAgIHJldHVybiB7XG4gICAgICAgIHg6IHJlY3QueCArIHgsXG4gICAgICAgIHk6IHJlY3QueSArIHksXG4gICAgICAgIHc6IHJlY3QudyArIHcsXG4gICAgICAgIGg6IHJlY3QuaCArIGgsXG4gICAgICAgIHJhZGl1czogcmVjdC5yYWRpdXNcbiAgICB9O1xufVxuY2xhc3MgQmFyRWxlbWVudCBleHRlbmRzIEVsZW1lbnQge1xuICAgIHN0YXRpYyBpZCA9ICdiYXInO1xuIHN0YXRpYyBkZWZhdWx0cyA9IHtcbiAgICAgICAgYm9yZGVyU2tpcHBlZDogJ3N0YXJ0JyxcbiAgICAgICAgYm9yZGVyV2lkdGg6IDAsXG4gICAgICAgIGJvcmRlclJhZGl1czogMCxcbiAgICAgICAgaW5mbGF0ZUFtb3VudDogJ2F1dG8nLFxuICAgICAgICBwb2ludFN0eWxlOiB1bmRlZmluZWRcbiAgICB9O1xuIHN0YXRpYyBkZWZhdWx0Um91dGVzID0ge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICdiYWNrZ3JvdW5kQ29sb3InLFxuICAgICAgICBib3JkZXJDb2xvcjogJ2JvcmRlckNvbG9yJ1xuICAgIH07XG4gICAgY29uc3RydWN0b3IoY2ZnKXtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmhvcml6b250YWwgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuYmFzZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy53aWR0aCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuaW5mbGF0ZUFtb3VudCA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGNmZykge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBjZmcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRyYXcoY3R4KSB7XG4gICAgICAgIGNvbnN0IHsgaW5mbGF0ZUFtb3VudCAsIG9wdGlvbnM6IHsgYm9yZGVyQ29sb3IgLCBiYWNrZ3JvdW5kQ29sb3IgIH0gIH0gPSB0aGlzO1xuICAgICAgICBjb25zdCB7IGlubmVyICwgb3V0ZXIgIH0gPSBib3VuZGluZ1JlY3RzKHRoaXMpO1xuICAgICAgICBjb25zdCBhZGRSZWN0UGF0aCA9IGhhc1JhZGl1cyhvdXRlci5yYWRpdXMpID8gYWRkUm91bmRlZFJlY3RQYXRoIDogYWRkTm9ybWFsUmVjdFBhdGg7XG4gICAgICAgIGN0eC5zYXZlKCk7XG4gICAgICAgIGlmIChvdXRlci53ICE9PSBpbm5lci53IHx8IG91dGVyLmggIT09IGlubmVyLmgpIHtcbiAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICAgICAgICAgIGFkZFJlY3RQYXRoKGN0eCwgaW5mbGF0ZVJlY3Qob3V0ZXIsIGluZmxhdGVBbW91bnQsIGlubmVyKSk7XG4gICAgICAgICAgICBjdHguY2xpcCgpO1xuICAgICAgICAgICAgYWRkUmVjdFBhdGgoY3R4LCBpbmZsYXRlUmVjdChpbm5lciwgLWluZmxhdGVBbW91bnQsIG91dGVyKSk7XG4gICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gYm9yZGVyQ29sb3I7XG4gICAgICAgICAgICBjdHguZmlsbCgnZXZlbm9kZCcpO1xuICAgICAgICB9XG4gICAgICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICAgICAgYWRkUmVjdFBhdGgoY3R4LCBpbmZsYXRlUmVjdChpbm5lciwgaW5mbGF0ZUFtb3VudCkpO1xuICAgICAgICBjdHguZmlsbFN0eWxlID0gYmFja2dyb3VuZENvbG9yO1xuICAgICAgICBjdHguZmlsbCgpO1xuICAgICAgICBjdHgucmVzdG9yZSgpO1xuICAgIH1cbiAgICBpblJhbmdlKG1vdXNlWCwgbW91c2VZLCB1c2VGaW5hbFBvc2l0aW9uKSB7XG4gICAgICAgIHJldHVybiBpblJhbmdlKHRoaXMsIG1vdXNlWCwgbW91c2VZLCB1c2VGaW5hbFBvc2l0aW9uKTtcbiAgICB9XG4gICAgaW5YUmFuZ2UobW91c2VYLCB1c2VGaW5hbFBvc2l0aW9uKSB7XG4gICAgICAgIHJldHVybiBpblJhbmdlKHRoaXMsIG1vdXNlWCwgbnVsbCwgdXNlRmluYWxQb3NpdGlvbik7XG4gICAgfVxuICAgIGluWVJhbmdlKG1vdXNlWSwgdXNlRmluYWxQb3NpdGlvbikge1xuICAgICAgICByZXR1cm4gaW5SYW5nZSh0aGlzLCBudWxsLCBtb3VzZVksIHVzZUZpbmFsUG9zaXRpb24pO1xuICAgIH1cbiAgICBnZXRDZW50ZXJQb2ludCh1c2VGaW5hbFBvc2l0aW9uKSB7XG4gICAgICAgIGNvbnN0IHsgeCAsIHkgLCBiYXNlICwgaG9yaXpvbnRhbCAgfSA9ICB0aGlzLmdldFByb3BzKFtcbiAgICAgICAgICAgICd4JyxcbiAgICAgICAgICAgICd5JyxcbiAgICAgICAgICAgICdiYXNlJyxcbiAgICAgICAgICAgICdob3Jpem9udGFsJ1xuICAgICAgICBdLCB1c2VGaW5hbFBvc2l0aW9uKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHg6IGhvcml6b250YWwgPyAoeCArIGJhc2UpIC8gMiA6IHgsXG4gICAgICAgICAgICB5OiBob3Jpem9udGFsID8geSA6ICh5ICsgYmFzZSkgLyAyXG4gICAgICAgIH07XG4gICAgfVxuICAgIGdldFJhbmdlKGF4aXMpIHtcbiAgICAgICAgcmV0dXJuIGF4aXMgPT09ICd4JyA/IHRoaXMud2lkdGggLyAyIDogdGhpcy5oZWlnaHQgLyAyO1xuICAgIH1cbn1cblxudmFyIGVsZW1lbnRzID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoe1xuX19wcm90b19fOiBudWxsLFxuQXJjRWxlbWVudDogQXJjRWxlbWVudCxcbkJhckVsZW1lbnQ6IEJhckVsZW1lbnQsXG5MaW5lRWxlbWVudDogTGluZUVsZW1lbnQsXG5Qb2ludEVsZW1lbnQ6IFBvaW50RWxlbWVudFxufSk7XG5cbmNvbnN0IEJPUkRFUl9DT0xPUlMgPSBbXG4gICAgJ3JnYig1NCwgMTYyLCAyMzUpJyxcbiAgICAncmdiKDI1NSwgOTksIDEzMiknLFxuICAgICdyZ2IoMjU1LCAxNTksIDY0KScsXG4gICAgJ3JnYigyNTUsIDIwNSwgODYpJyxcbiAgICAncmdiKDc1LCAxOTIsIDE5MiknLFxuICAgICdyZ2IoMTUzLCAxMDIsIDI1NSknLFxuICAgICdyZ2IoMjAxLCAyMDMsIDIwNyknIC8vIGdyZXlcbl07XG4vLyBCb3JkZXIgY29sb3JzIHdpdGggNTAlIHRyYW5zcGFyZW5jeVxuY29uc3QgQkFDS0dST1VORF9DT0xPUlMgPSAvKiAjX19QVVJFX18gKi8gQk9SREVSX0NPTE9SUy5tYXAoKGNvbG9yKT0+Y29sb3IucmVwbGFjZSgncmdiKCcsICdyZ2JhKCcpLnJlcGxhY2UoJyknLCAnLCAwLjUpJykpO1xuZnVuY3Rpb24gZ2V0Qm9yZGVyQ29sb3IoaSkge1xuICAgIHJldHVybiBCT1JERVJfQ09MT1JTW2kgJSBCT1JERVJfQ09MT1JTLmxlbmd0aF07XG59XG5mdW5jdGlvbiBnZXRCYWNrZ3JvdW5kQ29sb3IoaSkge1xuICAgIHJldHVybiBCQUNLR1JPVU5EX0NPTE9SU1tpICUgQkFDS0dST1VORF9DT0xPUlMubGVuZ3RoXTtcbn1cbmZ1bmN0aW9uIGNvbG9yaXplRGVmYXVsdERhdGFzZXQoZGF0YXNldCwgaSkge1xuICAgIGRhdGFzZXQuYm9yZGVyQ29sb3IgPSBnZXRCb3JkZXJDb2xvcihpKTtcbiAgICBkYXRhc2V0LmJhY2tncm91bmRDb2xvciA9IGdldEJhY2tncm91bmRDb2xvcihpKTtcbiAgICByZXR1cm4gKytpO1xufVxuZnVuY3Rpb24gY29sb3JpemVEb3VnaG51dERhdGFzZXQoZGF0YXNldCwgaSkge1xuICAgIGRhdGFzZXQuYmFja2dyb3VuZENvbG9yID0gZGF0YXNldC5kYXRhLm1hcCgoKT0+Z2V0Qm9yZGVyQ29sb3IoaSsrKSk7XG4gICAgcmV0dXJuIGk7XG59XG5mdW5jdGlvbiBjb2xvcml6ZVBvbGFyQXJlYURhdGFzZXQoZGF0YXNldCwgaSkge1xuICAgIGRhdGFzZXQuYmFja2dyb3VuZENvbG9yID0gZGF0YXNldC5kYXRhLm1hcCgoKT0+Z2V0QmFja2dyb3VuZENvbG9yKGkrKykpO1xuICAgIHJldHVybiBpO1xufVxuZnVuY3Rpb24gZ2V0Q29sb3JpemVyKGNoYXJ0KSB7XG4gICAgbGV0IGkgPSAwO1xuICAgIHJldHVybiAoZGF0YXNldCwgZGF0YXNldEluZGV4KT0+e1xuICAgICAgICBjb25zdCBjb250cm9sbGVyID0gY2hhcnQuZ2V0RGF0YXNldE1ldGEoZGF0YXNldEluZGV4KS5jb250cm9sbGVyO1xuICAgICAgICBpZiAoY29udHJvbGxlciBpbnN0YW5jZW9mIERvdWdobnV0Q29udHJvbGxlcikge1xuICAgICAgICAgICAgaSA9IGNvbG9yaXplRG91Z2hudXREYXRhc2V0KGRhdGFzZXQsIGkpO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbnRyb2xsZXIgaW5zdGFuY2VvZiBQb2xhckFyZWFDb250cm9sbGVyKSB7XG4gICAgICAgICAgICBpID0gY29sb3JpemVQb2xhckFyZWFEYXRhc2V0KGRhdGFzZXQsIGkpO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbnRyb2xsZXIpIHtcbiAgICAgICAgICAgIGkgPSBjb2xvcml6ZURlZmF1bHREYXRhc2V0KGRhdGFzZXQsIGkpO1xuICAgICAgICB9XG4gICAgfTtcbn1cbmZ1bmN0aW9uIGNvbnRhaW5zQ29sb3JzRGVmaW5pdGlvbnMoZGVzY3JpcHRvcnMpIHtcbiAgICBsZXQgaztcbiAgICBmb3IoayBpbiBkZXNjcmlwdG9ycyl7XG4gICAgICAgIGlmIChkZXNjcmlwdG9yc1trXS5ib3JkZXJDb2xvciB8fCBkZXNjcmlwdG9yc1trXS5iYWNrZ3JvdW5kQ29sb3IpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGNvbnRhaW5zQ29sb3JzRGVmaW5pdGlvbihkZXNjcmlwdG9yKSB7XG4gICAgcmV0dXJuIGRlc2NyaXB0b3IgJiYgKGRlc2NyaXB0b3IuYm9yZGVyQ29sb3IgfHwgZGVzY3JpcHRvci5iYWNrZ3JvdW5kQ29sb3IpO1xufVxudmFyIHBsdWdpbl9jb2xvcnMgPSB7XG4gICAgaWQ6ICdjb2xvcnMnLFxuICAgIGRlZmF1bHRzOiB7XG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgIGZvcmNlT3ZlcnJpZGU6IGZhbHNlXG4gICAgfSxcbiAgICBiZWZvcmVMYXlvdXQgKGNoYXJ0LCBfYXJncywgb3B0aW9ucykge1xuICAgICAgICBpZiAoIW9wdGlvbnMuZW5hYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgZGF0YTogeyBkYXRhc2V0cyAgfSAsIG9wdGlvbnM6IGNoYXJ0T3B0aW9ucyAgfSA9IGNoYXJ0LmNvbmZpZztcbiAgICAgICAgY29uc3QgeyBlbGVtZW50cyAgfSA9IGNoYXJ0T3B0aW9ucztcbiAgICAgICAgaWYgKCFvcHRpb25zLmZvcmNlT3ZlcnJpZGUgJiYgKGNvbnRhaW5zQ29sb3JzRGVmaW5pdGlvbnMoZGF0YXNldHMpIHx8IGNvbnRhaW5zQ29sb3JzRGVmaW5pdGlvbihjaGFydE9wdGlvbnMpIHx8IGVsZW1lbnRzICYmIGNvbnRhaW5zQ29sb3JzRGVmaW5pdGlvbnMoZWxlbWVudHMpKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbG9yaXplciA9IGdldENvbG9yaXplcihjaGFydCk7XG4gICAgICAgIGRhdGFzZXRzLmZvckVhY2goY29sb3JpemVyKTtcbiAgICB9XG59O1xuXG5mdW5jdGlvbiBsdHRiRGVjaW1hdGlvbihkYXRhLCBzdGFydCwgY291bnQsIGF2YWlsYWJsZVdpZHRoLCBvcHRpb25zKSB7XG4gY29uc3Qgc2FtcGxlcyA9IG9wdGlvbnMuc2FtcGxlcyB8fCBhdmFpbGFibGVXaWR0aDtcbiAgICBpZiAoc2FtcGxlcyA+PSBjb3VudCkge1xuICAgICAgICByZXR1cm4gZGF0YS5zbGljZShzdGFydCwgc3RhcnQgKyBjb3VudCk7XG4gICAgfVxuICAgIGNvbnN0IGRlY2ltYXRlZCA9IFtdO1xuICAgIGNvbnN0IGJ1Y2tldFdpZHRoID0gKGNvdW50IC0gMikgLyAoc2FtcGxlcyAtIDIpO1xuICAgIGxldCBzYW1wbGVkSW5kZXggPSAwO1xuICAgIGNvbnN0IGVuZEluZGV4ID0gc3RhcnQgKyBjb3VudCAtIDE7XG4gICAgbGV0IGEgPSBzdGFydDtcbiAgICBsZXQgaSwgbWF4QXJlYVBvaW50LCBtYXhBcmVhLCBhcmVhLCBuZXh0QTtcbiAgICBkZWNpbWF0ZWRbc2FtcGxlZEluZGV4KytdID0gZGF0YVthXTtcbiAgICBmb3IoaSA9IDA7IGkgPCBzYW1wbGVzIC0gMjsgaSsrKXtcbiAgICAgICAgbGV0IGF2Z1ggPSAwO1xuICAgICAgICBsZXQgYXZnWSA9IDA7XG4gICAgICAgIGxldCBqO1xuICAgICAgICBjb25zdCBhdmdSYW5nZVN0YXJ0ID0gTWF0aC5mbG9vcigoaSArIDEpICogYnVja2V0V2lkdGgpICsgMSArIHN0YXJ0O1xuICAgICAgICBjb25zdCBhdmdSYW5nZUVuZCA9IE1hdGgubWluKE1hdGguZmxvb3IoKGkgKyAyKSAqIGJ1Y2tldFdpZHRoKSArIDEsIGNvdW50KSArIHN0YXJ0O1xuICAgICAgICBjb25zdCBhdmdSYW5nZUxlbmd0aCA9IGF2Z1JhbmdlRW5kIC0gYXZnUmFuZ2VTdGFydDtcbiAgICAgICAgZm9yKGogPSBhdmdSYW5nZVN0YXJ0OyBqIDwgYXZnUmFuZ2VFbmQ7IGorKyl7XG4gICAgICAgICAgICBhdmdYICs9IGRhdGFbal0ueDtcbiAgICAgICAgICAgIGF2Z1kgKz0gZGF0YVtqXS55O1xuICAgICAgICB9XG4gICAgICAgIGF2Z1ggLz0gYXZnUmFuZ2VMZW5ndGg7XG4gICAgICAgIGF2Z1kgLz0gYXZnUmFuZ2VMZW5ndGg7XG4gICAgICAgIGNvbnN0IHJhbmdlT2ZmcyA9IE1hdGguZmxvb3IoaSAqIGJ1Y2tldFdpZHRoKSArIDEgKyBzdGFydDtcbiAgICAgICAgY29uc3QgcmFuZ2VUbyA9IE1hdGgubWluKE1hdGguZmxvb3IoKGkgKyAxKSAqIGJ1Y2tldFdpZHRoKSArIDEsIGNvdW50KSArIHN0YXJ0O1xuICAgICAgICBjb25zdCB7IHg6IHBvaW50QXggLCB5OiBwb2ludEF5ICB9ID0gZGF0YVthXTtcbiAgICAgICAgbWF4QXJlYSA9IGFyZWEgPSAtMTtcbiAgICAgICAgZm9yKGogPSByYW5nZU9mZnM7IGogPCByYW5nZVRvOyBqKyspe1xuICAgICAgICAgICAgYXJlYSA9IDAuNSAqIE1hdGguYWJzKChwb2ludEF4IC0gYXZnWCkgKiAoZGF0YVtqXS55IC0gcG9pbnRBeSkgLSAocG9pbnRBeCAtIGRhdGFbal0ueCkgKiAoYXZnWSAtIHBvaW50QXkpKTtcbiAgICAgICAgICAgIGlmIChhcmVhID4gbWF4QXJlYSkge1xuICAgICAgICAgICAgICAgIG1heEFyZWEgPSBhcmVhO1xuICAgICAgICAgICAgICAgIG1heEFyZWFQb2ludCA9IGRhdGFbal07XG4gICAgICAgICAgICAgICAgbmV4dEEgPSBqO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGRlY2ltYXRlZFtzYW1wbGVkSW5kZXgrK10gPSBtYXhBcmVhUG9pbnQ7XG4gICAgICAgIGEgPSBuZXh0QTtcbiAgICB9XG4gICAgZGVjaW1hdGVkW3NhbXBsZWRJbmRleCsrXSA9IGRhdGFbZW5kSW5kZXhdO1xuICAgIHJldHVybiBkZWNpbWF0ZWQ7XG59XG5mdW5jdGlvbiBtaW5NYXhEZWNpbWF0aW9uKGRhdGEsIHN0YXJ0LCBjb3VudCwgYXZhaWxhYmxlV2lkdGgpIHtcbiAgICBsZXQgYXZnWCA9IDA7XG4gICAgbGV0IGNvdW50WCA9IDA7XG4gICAgbGV0IGksIHBvaW50LCB4LCB5LCBwcmV2WCwgbWluSW5kZXgsIG1heEluZGV4LCBzdGFydEluZGV4LCBtaW5ZLCBtYXhZO1xuICAgIGNvbnN0IGRlY2ltYXRlZCA9IFtdO1xuICAgIGNvbnN0IGVuZEluZGV4ID0gc3RhcnQgKyBjb3VudCAtIDE7XG4gICAgY29uc3QgeE1pbiA9IGRhdGFbc3RhcnRdLng7XG4gICAgY29uc3QgeE1heCA9IGRhdGFbZW5kSW5kZXhdLng7XG4gICAgY29uc3QgZHggPSB4TWF4IC0geE1pbjtcbiAgICBmb3IoaSA9IHN0YXJ0OyBpIDwgc3RhcnQgKyBjb3VudDsgKytpKXtcbiAgICAgICAgcG9pbnQgPSBkYXRhW2ldO1xuICAgICAgICB4ID0gKHBvaW50LnggLSB4TWluKSAvIGR4ICogYXZhaWxhYmxlV2lkdGg7XG4gICAgICAgIHkgPSBwb2ludC55O1xuICAgICAgICBjb25zdCB0cnVuY1ggPSB4IHwgMDtcbiAgICAgICAgaWYgKHRydW5jWCA9PT0gcHJldlgpIHtcbiAgICAgICAgICAgIGlmICh5IDwgbWluWSkge1xuICAgICAgICAgICAgICAgIG1pblkgPSB5O1xuICAgICAgICAgICAgICAgIG1pbkluZGV4ID0gaTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoeSA+IG1heFkpIHtcbiAgICAgICAgICAgICAgICBtYXhZID0geTtcbiAgICAgICAgICAgICAgICBtYXhJbmRleCA9IGk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhdmdYID0gKGNvdW50WCAqIGF2Z1ggKyBwb2ludC54KSAvICsrY291bnRYO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgbGFzdEluZGV4ID0gaSAtIDE7XG4gICAgICAgICAgICBpZiAoIWlzTnVsbE9yVW5kZWYobWluSW5kZXgpICYmICFpc051bGxPclVuZGVmKG1heEluZGV4KSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGludGVybWVkaWF0ZUluZGV4MSA9IE1hdGgubWluKG1pbkluZGV4LCBtYXhJbmRleCk7XG4gICAgICAgICAgICAgICAgY29uc3QgaW50ZXJtZWRpYXRlSW5kZXgyID0gTWF0aC5tYXgobWluSW5kZXgsIG1heEluZGV4KTtcbiAgICAgICAgICAgICAgICBpZiAoaW50ZXJtZWRpYXRlSW5kZXgxICE9PSBzdGFydEluZGV4ICYmIGludGVybWVkaWF0ZUluZGV4MSAhPT0gbGFzdEluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIGRlY2ltYXRlZC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLmRhdGFbaW50ZXJtZWRpYXRlSW5kZXgxXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHg6IGF2Z1hcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChpbnRlcm1lZGlhdGVJbmRleDIgIT09IHN0YXJ0SW5kZXggJiYgaW50ZXJtZWRpYXRlSW5kZXgyICE9PSBsYXN0SW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVjaW1hdGVkLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uZGF0YVtpbnRlcm1lZGlhdGVJbmRleDJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgeDogYXZnWFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaSA+IDAgJiYgbGFzdEluZGV4ICE9PSBzdGFydEluZGV4KSB7XG4gICAgICAgICAgICAgICAgZGVjaW1hdGVkLnB1c2goZGF0YVtsYXN0SW5kZXhdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlY2ltYXRlZC5wdXNoKHBvaW50KTtcbiAgICAgICAgICAgIHByZXZYID0gdHJ1bmNYO1xuICAgICAgICAgICAgY291bnRYID0gMDtcbiAgICAgICAgICAgIG1pblkgPSBtYXhZID0geTtcbiAgICAgICAgICAgIG1pbkluZGV4ID0gbWF4SW5kZXggPSBzdGFydEluZGV4ID0gaTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGVjaW1hdGVkO1xufVxuZnVuY3Rpb24gY2xlYW5EZWNpbWF0ZWREYXRhc2V0KGRhdGFzZXQpIHtcbiAgICBpZiAoZGF0YXNldC5fZGVjaW1hdGVkKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBkYXRhc2V0Ll9kYXRhO1xuICAgICAgICBkZWxldGUgZGF0YXNldC5fZGVjaW1hdGVkO1xuICAgICAgICBkZWxldGUgZGF0YXNldC5fZGF0YTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGRhdGFzZXQsICdkYXRhJywge1xuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IGRhdGFcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZnVuY3Rpb24gY2xlYW5EZWNpbWF0ZWREYXRhKGNoYXJ0KSB7XG4gICAgY2hhcnQuZGF0YS5kYXRhc2V0cy5mb3JFYWNoKChkYXRhc2V0KT0+e1xuICAgICAgICBjbGVhbkRlY2ltYXRlZERhdGFzZXQoZGF0YXNldCk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBnZXRTdGFydEFuZENvdW50T2ZWaXNpYmxlUG9pbnRzU2ltcGxpZmllZChtZXRhLCBwb2ludHMpIHtcbiAgICBjb25zdCBwb2ludENvdW50ID0gcG9pbnRzLmxlbmd0aDtcbiAgICBsZXQgc3RhcnQgPSAwO1xuICAgIGxldCBjb3VudDtcbiAgICBjb25zdCB7IGlTY2FsZSAgfSA9IG1ldGE7XG4gICAgY29uc3QgeyBtaW4gLCBtYXggLCBtaW5EZWZpbmVkICwgbWF4RGVmaW5lZCAgfSA9IGlTY2FsZS5nZXRVc2VyQm91bmRzKCk7XG4gICAgaWYgKG1pbkRlZmluZWQpIHtcbiAgICAgICAgc3RhcnQgPSBfbGltaXRWYWx1ZShfbG9va3VwQnlLZXkocG9pbnRzLCBpU2NhbGUuYXhpcywgbWluKS5sbywgMCwgcG9pbnRDb3VudCAtIDEpO1xuICAgIH1cbiAgICBpZiAobWF4RGVmaW5lZCkge1xuICAgICAgICBjb3VudCA9IF9saW1pdFZhbHVlKF9sb29rdXBCeUtleShwb2ludHMsIGlTY2FsZS5heGlzLCBtYXgpLmhpICsgMSwgc3RhcnQsIHBvaW50Q291bnQpIC0gc3RhcnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY291bnQgPSBwb2ludENvdW50IC0gc3RhcnQ7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHN0YXJ0LFxuICAgICAgICBjb3VudFxuICAgIH07XG59XG52YXIgcGx1Z2luX2RlY2ltYXRpb24gPSB7XG4gICAgaWQ6ICdkZWNpbWF0aW9uJyxcbiAgICBkZWZhdWx0czoge1xuICAgICAgICBhbGdvcml0aG06ICdtaW4tbWF4JyxcbiAgICAgICAgZW5hYmxlZDogZmFsc2VcbiAgICB9LFxuICAgIGJlZm9yZUVsZW1lbnRzVXBkYXRlOiAoY2hhcnQsIGFyZ3MsIG9wdGlvbnMpPT57XG4gICAgICAgIGlmICghb3B0aW9ucy5lbmFibGVkKSB7XG4gICAgICAgICAgICBjbGVhbkRlY2ltYXRlZERhdGEoY2hhcnQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGF2YWlsYWJsZVdpZHRoID0gY2hhcnQud2lkdGg7XG4gICAgICAgIGNoYXJ0LmRhdGEuZGF0YXNldHMuZm9yRWFjaCgoZGF0YXNldCwgZGF0YXNldEluZGV4KT0+e1xuICAgICAgICAgICAgY29uc3QgeyBfZGF0YSAsIGluZGV4QXhpcyAgfSA9IGRhdGFzZXQ7XG4gICAgICAgICAgICBjb25zdCBtZXRhID0gY2hhcnQuZ2V0RGF0YXNldE1ldGEoZGF0YXNldEluZGV4KTtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBfZGF0YSB8fCBkYXRhc2V0LmRhdGE7XG4gICAgICAgICAgICBpZiAocmVzb2x2ZShbXG4gICAgICAgICAgICAgICAgaW5kZXhBeGlzLFxuICAgICAgICAgICAgICAgIGNoYXJ0Lm9wdGlvbnMuaW5kZXhBeGlzXG4gICAgICAgICAgICBdKSA9PT0gJ3knKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFtZXRhLmNvbnRyb2xsZXIuc3VwcG9ydHNEZWNpbWF0aW9uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgeEF4aXMgPSBjaGFydC5zY2FsZXNbbWV0YS54QXhpc0lEXTtcbiAgICAgICAgICAgIGlmICh4QXhpcy50eXBlICE9PSAnbGluZWFyJyAmJiB4QXhpcy50eXBlICE9PSAndGltZScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY2hhcnQub3B0aW9ucy5wYXJzaW5nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHsgc3RhcnQgLCBjb3VudCAgfSA9IGdldFN0YXJ0QW5kQ291bnRPZlZpc2libGVQb2ludHNTaW1wbGlmaWVkKG1ldGEsIGRhdGEpO1xuICAgICAgICAgICAgY29uc3QgdGhyZXNob2xkID0gb3B0aW9ucy50aHJlc2hvbGQgfHwgNCAqIGF2YWlsYWJsZVdpZHRoO1xuICAgICAgICAgICAgaWYgKGNvdW50IDw9IHRocmVzaG9sZCkge1xuICAgICAgICAgICAgICAgIGNsZWFuRGVjaW1hdGVkRGF0YXNldChkYXRhc2V0KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNOdWxsT3JVbmRlZihfZGF0YSkpIHtcbiAgICAgICAgICAgICAgICBkYXRhc2V0Ll9kYXRhID0gZGF0YTtcbiAgICAgICAgICAgICAgICBkZWxldGUgZGF0YXNldC5kYXRhO1xuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkYXRhc2V0LCAnZGF0YScsIHtcbiAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RlY2ltYXRlZDtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbihkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9kYXRhID0gZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGRlY2ltYXRlZDtcbiAgICAgICAgICAgIHN3aXRjaChvcHRpb25zLmFsZ29yaXRobSl7XG4gICAgICAgICAgICAgICAgY2FzZSAnbHR0Yic6XG4gICAgICAgICAgICAgICAgICAgIGRlY2ltYXRlZCA9IGx0dGJEZWNpbWF0aW9uKGRhdGEsIHN0YXJ0LCBjb3VudCwgYXZhaWxhYmxlV2lkdGgsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdtaW4tbWF4JzpcbiAgICAgICAgICAgICAgICAgICAgZGVjaW1hdGVkID0gbWluTWF4RGVjaW1hdGlvbihkYXRhLCBzdGFydCwgY291bnQsIGF2YWlsYWJsZVdpZHRoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBkZWNpbWF0aW9uIGFsZ29yaXRobSAnJHtvcHRpb25zLmFsZ29yaXRobX0nYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkYXRhc2V0Ll9kZWNpbWF0ZWQgPSBkZWNpbWF0ZWQ7XG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgZGVzdHJveSAoY2hhcnQpIHtcbiAgICAgICAgY2xlYW5EZWNpbWF0ZWREYXRhKGNoYXJ0KTtcbiAgICB9XG59O1xuXG5mdW5jdGlvbiBfc2VnbWVudHMobGluZSwgdGFyZ2V0LCBwcm9wZXJ0eSkge1xuICAgIGNvbnN0IHNlZ21lbnRzID0gbGluZS5zZWdtZW50cztcbiAgICBjb25zdCBwb2ludHMgPSBsaW5lLnBvaW50cztcbiAgICBjb25zdCB0cG9pbnRzID0gdGFyZ2V0LnBvaW50cztcbiAgICBjb25zdCBwYXJ0cyA9IFtdO1xuICAgIGZvciAoY29uc3Qgc2VnbWVudCBvZiBzZWdtZW50cyl7XG4gICAgICAgIGxldCB7IHN0YXJ0ICwgZW5kICB9ID0gc2VnbWVudDtcbiAgICAgICAgZW5kID0gX2ZpbmRTZWdtZW50RW5kKHN0YXJ0LCBlbmQsIHBvaW50cyk7XG4gICAgICAgIGNvbnN0IGJvdW5kcyA9IF9nZXRCb3VuZHMocHJvcGVydHksIHBvaW50c1tzdGFydF0sIHBvaW50c1tlbmRdLCBzZWdtZW50Lmxvb3ApO1xuICAgICAgICBpZiAoIXRhcmdldC5zZWdtZW50cykge1xuICAgICAgICAgICAgcGFydHMucHVzaCh7XG4gICAgICAgICAgICAgICAgc291cmNlOiBzZWdtZW50LFxuICAgICAgICAgICAgICAgIHRhcmdldDogYm91bmRzLFxuICAgICAgICAgICAgICAgIHN0YXJ0OiBwb2ludHNbc3RhcnRdLFxuICAgICAgICAgICAgICAgIGVuZDogcG9pbnRzW2VuZF1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGFyZ2V0U2VnbWVudHMgPSBfYm91bmRTZWdtZW50cyh0YXJnZXQsIGJvdW5kcyk7XG4gICAgICAgIGZvciAoY29uc3QgdGd0IG9mIHRhcmdldFNlZ21lbnRzKXtcbiAgICAgICAgICAgIGNvbnN0IHN1YkJvdW5kcyA9IF9nZXRCb3VuZHMocHJvcGVydHksIHRwb2ludHNbdGd0LnN0YXJ0XSwgdHBvaW50c1t0Z3QuZW5kXSwgdGd0Lmxvb3ApO1xuICAgICAgICAgICAgY29uc3QgZmlsbFNvdXJjZXMgPSBfYm91bmRTZWdtZW50KHNlZ21lbnQsIHBvaW50cywgc3ViQm91bmRzKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZmlsbFNvdXJjZSBvZiBmaWxsU291cmNlcyl7XG4gICAgICAgICAgICAgICAgcGFydHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZTogZmlsbFNvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiB0Z3QsXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBbcHJvcGVydHldOiBfZ2V0RWRnZShib3VuZHMsIHN1YkJvdW5kcywgJ3N0YXJ0JywgTWF0aC5tYXgpXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGVuZDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgW3Byb3BlcnR5XTogX2dldEVkZ2UoYm91bmRzLCBzdWJCb3VuZHMsICdlbmQnLCBNYXRoLm1pbilcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwYXJ0cztcbn1cbmZ1bmN0aW9uIF9nZXRCb3VuZHMocHJvcGVydHksIGZpcnN0LCBsYXN0LCBsb29wKSB7XG4gICAgaWYgKGxvb3ApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgc3RhcnQgPSBmaXJzdFtwcm9wZXJ0eV07XG4gICAgbGV0IGVuZCA9IGxhc3RbcHJvcGVydHldO1xuICAgIGlmIChwcm9wZXJ0eSA9PT0gJ2FuZ2xlJykge1xuICAgICAgICBzdGFydCA9IF9ub3JtYWxpemVBbmdsZShzdGFydCk7XG4gICAgICAgIGVuZCA9IF9ub3JtYWxpemVBbmdsZShlbmQpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBwcm9wZXJ0eSxcbiAgICAgICAgc3RhcnQsXG4gICAgICAgIGVuZFxuICAgIH07XG59XG5mdW5jdGlvbiBfcG9pbnRzRnJvbVNlZ21lbnRzKGJvdW5kYXJ5LCBsaW5lKSB7XG4gICAgY29uc3QgeyB4ID1udWxsICwgeSA9bnVsbCAgfSA9IGJvdW5kYXJ5IHx8IHt9O1xuICAgIGNvbnN0IGxpbmVQb2ludHMgPSBsaW5lLnBvaW50cztcbiAgICBjb25zdCBwb2ludHMgPSBbXTtcbiAgICBsaW5lLnNlZ21lbnRzLmZvckVhY2goKHsgc3RhcnQgLCBlbmQgIH0pPT57XG4gICAgICAgIGVuZCA9IF9maW5kU2VnbWVudEVuZChzdGFydCwgZW5kLCBsaW5lUG9pbnRzKTtcbiAgICAgICAgY29uc3QgZmlyc3QgPSBsaW5lUG9pbnRzW3N0YXJ0XTtcbiAgICAgICAgY29uc3QgbGFzdCA9IGxpbmVQb2ludHNbZW5kXTtcbiAgICAgICAgaWYgKHkgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHBvaW50cy5wdXNoKHtcbiAgICAgICAgICAgICAgICB4OiBmaXJzdC54LFxuICAgICAgICAgICAgICAgIHlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcG9pbnRzLnB1c2goe1xuICAgICAgICAgICAgICAgIHg6IGxhc3QueCxcbiAgICAgICAgICAgICAgICB5XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmICh4ICE9PSBudWxsKSB7XG4gICAgICAgICAgICBwb2ludHMucHVzaCh7XG4gICAgICAgICAgICAgICAgeCxcbiAgICAgICAgICAgICAgICB5OiBmaXJzdC55XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHBvaW50cy5wdXNoKHtcbiAgICAgICAgICAgICAgICB4LFxuICAgICAgICAgICAgICAgIHk6IGxhc3QueVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcG9pbnRzO1xufVxuZnVuY3Rpb24gX2ZpbmRTZWdtZW50RW5kKHN0YXJ0LCBlbmQsIHBvaW50cykge1xuICAgIGZvcig7IGVuZCA+IHN0YXJ0OyBlbmQtLSl7XG4gICAgICAgIGNvbnN0IHBvaW50ID0gcG9pbnRzW2VuZF07XG4gICAgICAgIGlmICghaXNOYU4ocG9pbnQueCkgJiYgIWlzTmFOKHBvaW50LnkpKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZW5kO1xufVxuZnVuY3Rpb24gX2dldEVkZ2UoYSwgYiwgcHJvcCwgZm4pIHtcbiAgICBpZiAoYSAmJiBiKSB7XG4gICAgICAgIHJldHVybiBmbihhW3Byb3BdLCBiW3Byb3BdKTtcbiAgICB9XG4gICAgcmV0dXJuIGEgPyBhW3Byb3BdIDogYiA/IGJbcHJvcF0gOiAwO1xufVxuXG5mdW5jdGlvbiBfY3JlYXRlQm91bmRhcnlMaW5lKGJvdW5kYXJ5LCBsaW5lKSB7XG4gICAgbGV0IHBvaW50cyA9IFtdO1xuICAgIGxldCBfbG9vcCA9IGZhbHNlO1xuICAgIGlmIChpc0FycmF5KGJvdW5kYXJ5KSkge1xuICAgICAgICBfbG9vcCA9IHRydWU7XG4gICAgICAgIHBvaW50cyA9IGJvdW5kYXJ5O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHBvaW50cyA9IF9wb2ludHNGcm9tU2VnbWVudHMoYm91bmRhcnksIGxpbmUpO1xuICAgIH1cbiAgICByZXR1cm4gcG9pbnRzLmxlbmd0aCA/IG5ldyBMaW5lRWxlbWVudCh7XG4gICAgICAgIHBvaW50cyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgdGVuc2lvbjogMFxuICAgICAgICB9LFxuICAgICAgICBfbG9vcCxcbiAgICAgICAgX2Z1bGxMb29wOiBfbG9vcFxuICAgIH0pIDogbnVsbDtcbn1cbmZ1bmN0aW9uIF9zaG91bGRBcHBseUZpbGwoc291cmNlKSB7XG4gICAgcmV0dXJuIHNvdXJjZSAmJiBzb3VyY2UuZmlsbCAhPT0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIF9yZXNvbHZlVGFyZ2V0KHNvdXJjZXMsIGluZGV4LCBwcm9wYWdhdGUpIHtcbiAgICBjb25zdCBzb3VyY2UgPSBzb3VyY2VzW2luZGV4XTtcbiAgICBsZXQgZmlsbCA9IHNvdXJjZS5maWxsO1xuICAgIGNvbnN0IHZpc2l0ZWQgPSBbXG4gICAgICAgIGluZGV4XG4gICAgXTtcbiAgICBsZXQgdGFyZ2V0O1xuICAgIGlmICghcHJvcGFnYXRlKSB7XG4gICAgICAgIHJldHVybiBmaWxsO1xuICAgIH1cbiAgICB3aGlsZShmaWxsICE9PSBmYWxzZSAmJiB2aXNpdGVkLmluZGV4T2YoZmlsbCkgPT09IC0xKXtcbiAgICAgICAgaWYgKCFpc051bWJlckZpbml0ZShmaWxsKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZpbGw7XG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0ID0gc291cmNlc1tmaWxsXTtcbiAgICAgICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGFyZ2V0LnZpc2libGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmaWxsO1xuICAgICAgICB9XG4gICAgICAgIHZpc2l0ZWQucHVzaChmaWxsKTtcbiAgICAgICAgZmlsbCA9IHRhcmdldC5maWxsO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG4gZnVuY3Rpb24gX2RlY29kZUZpbGwobGluZSwgaW5kZXgsIGNvdW50KSB7XG4gICAgIGNvbnN0IGZpbGwgPSBwYXJzZUZpbGxPcHRpb24obGluZSk7XG4gICAgaWYgKGlzT2JqZWN0KGZpbGwpKSB7XG4gICAgICAgIHJldHVybiBpc05hTihmaWxsLnZhbHVlKSA/IGZhbHNlIDogZmlsbDtcbiAgICB9XG4gICAgbGV0IHRhcmdldCA9IHBhcnNlRmxvYXQoZmlsbCk7XG4gICAgaWYgKGlzTnVtYmVyRmluaXRlKHRhcmdldCkgJiYgTWF0aC5mbG9vcih0YXJnZXQpID09PSB0YXJnZXQpIHtcbiAgICAgICAgcmV0dXJuIGRlY29kZVRhcmdldEluZGV4KGZpbGxbMF0sIGluZGV4LCB0YXJnZXQsIGNvdW50KTtcbiAgICB9XG4gICAgcmV0dXJuIFtcbiAgICAgICAgJ29yaWdpbicsXG4gICAgICAgICdzdGFydCcsXG4gICAgICAgICdlbmQnLFxuICAgICAgICAnc3RhY2snLFxuICAgICAgICAnc2hhcGUnXG4gICAgXS5pbmRleE9mKGZpbGwpID49IDAgJiYgZmlsbDtcbn1cbmZ1bmN0aW9uIGRlY29kZVRhcmdldEluZGV4KGZpcnN0Q2gsIGluZGV4LCB0YXJnZXQsIGNvdW50KSB7XG4gICAgaWYgKGZpcnN0Q2ggPT09ICctJyB8fCBmaXJzdENoID09PSAnKycpIHtcbiAgICAgICAgdGFyZ2V0ID0gaW5kZXggKyB0YXJnZXQ7XG4gICAgfVxuICAgIGlmICh0YXJnZXQgPT09IGluZGV4IHx8IHRhcmdldCA8IDAgfHwgdGFyZ2V0ID49IGNvdW50KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbn1cbiBmdW5jdGlvbiBfZ2V0VGFyZ2V0UGl4ZWwoZmlsbCwgc2NhbGUpIHtcbiAgICBsZXQgcGl4ZWwgPSBudWxsO1xuICAgIGlmIChmaWxsID09PSAnc3RhcnQnKSB7XG4gICAgICAgIHBpeGVsID0gc2NhbGUuYm90dG9tO1xuICAgIH0gZWxzZSBpZiAoZmlsbCA9PT0gJ2VuZCcpIHtcbiAgICAgICAgcGl4ZWwgPSBzY2FsZS50b3A7XG4gICAgfSBlbHNlIGlmIChpc09iamVjdChmaWxsKSkge1xuICAgICAgICBwaXhlbCA9IHNjYWxlLmdldFBpeGVsRm9yVmFsdWUoZmlsbC52YWx1ZSk7XG4gICAgfSBlbHNlIGlmIChzY2FsZS5nZXRCYXNlUGl4ZWwpIHtcbiAgICAgICAgcGl4ZWwgPSBzY2FsZS5nZXRCYXNlUGl4ZWwoKTtcbiAgICB9XG4gICAgcmV0dXJuIHBpeGVsO1xufVxuIGZ1bmN0aW9uIF9nZXRUYXJnZXRWYWx1ZShmaWxsLCBzY2FsZSwgc3RhcnRWYWx1ZSkge1xuICAgIGxldCB2YWx1ZTtcbiAgICBpZiAoZmlsbCA9PT0gJ3N0YXJ0Jykge1xuICAgICAgICB2YWx1ZSA9IHN0YXJ0VmFsdWU7XG4gICAgfSBlbHNlIGlmIChmaWxsID09PSAnZW5kJykge1xuICAgICAgICB2YWx1ZSA9IHNjYWxlLm9wdGlvbnMucmV2ZXJzZSA/IHNjYWxlLm1pbiA6IHNjYWxlLm1heDtcbiAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KGZpbGwpKSB7XG4gICAgICAgIHZhbHVlID0gZmlsbC52YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZSA9IHNjYWxlLmdldEJhc2VWYWx1ZSgpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59XG4gZnVuY3Rpb24gcGFyc2VGaWxsT3B0aW9uKGxpbmUpIHtcbiAgICBjb25zdCBvcHRpb25zID0gbGluZS5vcHRpb25zO1xuICAgIGNvbnN0IGZpbGxPcHRpb24gPSBvcHRpb25zLmZpbGw7XG4gICAgbGV0IGZpbGwgPSB2YWx1ZU9yRGVmYXVsdChmaWxsT3B0aW9uICYmIGZpbGxPcHRpb24udGFyZ2V0LCBmaWxsT3B0aW9uKTtcbiAgICBpZiAoZmlsbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGZpbGwgPSAhIW9wdGlvbnMuYmFja2dyb3VuZENvbG9yO1xuICAgIH1cbiAgICBpZiAoZmlsbCA9PT0gZmFsc2UgfHwgZmlsbCA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChmaWxsID09PSB0cnVlKSB7XG4gICAgICAgIHJldHVybiAnb3JpZ2luJztcbiAgICB9XG4gICAgcmV0dXJuIGZpbGw7XG59XG5cbmZ1bmN0aW9uIF9idWlsZFN0YWNrTGluZShzb3VyY2UpIHtcbiAgICBjb25zdCB7IHNjYWxlICwgaW5kZXggLCBsaW5lICB9ID0gc291cmNlO1xuICAgIGNvbnN0IHBvaW50cyA9IFtdO1xuICAgIGNvbnN0IHNlZ21lbnRzID0gbGluZS5zZWdtZW50cztcbiAgICBjb25zdCBzb3VyY2VQb2ludHMgPSBsaW5lLnBvaW50cztcbiAgICBjb25zdCBsaW5lc0JlbG93ID0gZ2V0TGluZXNCZWxvdyhzY2FsZSwgaW5kZXgpO1xuICAgIGxpbmVzQmVsb3cucHVzaChfY3JlYXRlQm91bmRhcnlMaW5lKHtcbiAgICAgICAgeDogbnVsbCxcbiAgICAgICAgeTogc2NhbGUuYm90dG9tXG4gICAgfSwgbGluZSkpO1xuICAgIGZvcihsZXQgaSA9IDA7IGkgPCBzZWdtZW50cy5sZW5ndGg7IGkrKyl7XG4gICAgICAgIGNvbnN0IHNlZ21lbnQgPSBzZWdtZW50c1tpXTtcbiAgICAgICAgZm9yKGxldCBqID0gc2VnbWVudC5zdGFydDsgaiA8PSBzZWdtZW50LmVuZDsgaisrKXtcbiAgICAgICAgICAgIGFkZFBvaW50c0JlbG93KHBvaW50cywgc291cmNlUG9pbnRzW2pdLCBsaW5lc0JlbG93KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3IExpbmVFbGVtZW50KHtcbiAgICAgICAgcG9pbnRzLFxuICAgICAgICBvcHRpb25zOiB7fVxuICAgIH0pO1xufVxuIGZ1bmN0aW9uIGdldExpbmVzQmVsb3coc2NhbGUsIGluZGV4KSB7XG4gICAgY29uc3QgYmVsb3cgPSBbXTtcbiAgICBjb25zdCBtZXRhcyA9IHNjYWxlLmdldE1hdGNoaW5nVmlzaWJsZU1ldGFzKCdsaW5lJyk7XG4gICAgZm9yKGxldCBpID0gMDsgaSA8IG1ldGFzLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgY29uc3QgbWV0YSA9IG1ldGFzW2ldO1xuICAgICAgICBpZiAobWV0YS5pbmRleCA9PT0gaW5kZXgpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbWV0YS5oaWRkZW4pIHtcbiAgICAgICAgICAgIGJlbG93LnVuc2hpZnQobWV0YS5kYXRhc2V0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYmVsb3c7XG59XG4gZnVuY3Rpb24gYWRkUG9pbnRzQmVsb3cocG9pbnRzLCBzb3VyY2VQb2ludCwgbGluZXNCZWxvdykge1xuICAgIGNvbnN0IHBvc3Rwb25lZCA9IFtdO1xuICAgIGZvcihsZXQgaiA9IDA7IGogPCBsaW5lc0JlbG93Lmxlbmd0aDsgaisrKXtcbiAgICAgICAgY29uc3QgbGluZSA9IGxpbmVzQmVsb3dbal07XG4gICAgICAgIGNvbnN0IHsgZmlyc3QgLCBsYXN0ICwgcG9pbnQgIH0gPSBmaW5kUG9pbnQobGluZSwgc291cmNlUG9pbnQsICd4Jyk7XG4gICAgICAgIGlmICghcG9pbnQgfHwgZmlyc3QgJiYgbGFzdCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpcnN0KSB7XG4gICAgICAgICAgICBwb3N0cG9uZWQudW5zaGlmdChwb2ludCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwb2ludHMucHVzaChwb2ludCk7XG4gICAgICAgICAgICBpZiAoIWxhc3QpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBwb2ludHMucHVzaCguLi5wb3N0cG9uZWQpO1xufVxuIGZ1bmN0aW9uIGZpbmRQb2ludChsaW5lLCBzb3VyY2VQb2ludCwgcHJvcGVydHkpIHtcbiAgICBjb25zdCBwb2ludCA9IGxpbmUuaW50ZXJwb2xhdGUoc291cmNlUG9pbnQsIHByb3BlcnR5KTtcbiAgICBpZiAoIXBvaW50KSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgY29uc3QgcG9pbnRWYWx1ZSA9IHBvaW50W3Byb3BlcnR5XTtcbiAgICBjb25zdCBzZWdtZW50cyA9IGxpbmUuc2VnbWVudHM7XG4gICAgY29uc3QgbGluZVBvaW50cyA9IGxpbmUucG9pbnRzO1xuICAgIGxldCBmaXJzdCA9IGZhbHNlO1xuICAgIGxldCBsYXN0ID0gZmFsc2U7XG4gICAgZm9yKGxldCBpID0gMDsgaSA8IHNlZ21lbnRzLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgY29uc3Qgc2VnbWVudCA9IHNlZ21lbnRzW2ldO1xuICAgICAgICBjb25zdCBmaXJzdFZhbHVlID0gbGluZVBvaW50c1tzZWdtZW50LnN0YXJ0XVtwcm9wZXJ0eV07XG4gICAgICAgIGNvbnN0IGxhc3RWYWx1ZSA9IGxpbmVQb2ludHNbc2VnbWVudC5lbmRdW3Byb3BlcnR5XTtcbiAgICAgICAgaWYgKF9pc0JldHdlZW4ocG9pbnRWYWx1ZSwgZmlyc3RWYWx1ZSwgbGFzdFZhbHVlKSkge1xuICAgICAgICAgICAgZmlyc3QgPSBwb2ludFZhbHVlID09PSBmaXJzdFZhbHVlO1xuICAgICAgICAgICAgbGFzdCA9IHBvaW50VmFsdWUgPT09IGxhc3RWYWx1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGZpcnN0LFxuICAgICAgICBsYXN0LFxuICAgICAgICBwb2ludFxuICAgIH07XG59XG5cbmNsYXNzIHNpbXBsZUFyYyB7XG4gICAgY29uc3RydWN0b3Iob3B0cyl7XG4gICAgICAgIHRoaXMueCA9IG9wdHMueDtcbiAgICAgICAgdGhpcy55ID0gb3B0cy55O1xuICAgICAgICB0aGlzLnJhZGl1cyA9IG9wdHMucmFkaXVzO1xuICAgIH1cbiAgICBwYXRoU2VnbWVudChjdHgsIGJvdW5kcywgb3B0cykge1xuICAgICAgICBjb25zdCB7IHggLCB5ICwgcmFkaXVzICB9ID0gdGhpcztcbiAgICAgICAgYm91bmRzID0gYm91bmRzIHx8IHtcbiAgICAgICAgICAgIHN0YXJ0OiAwLFxuICAgICAgICAgICAgZW5kOiBUQVVcbiAgICAgICAgfTtcbiAgICAgICAgY3R4LmFyYyh4LCB5LCByYWRpdXMsIGJvdW5kcy5lbmQsIGJvdW5kcy5zdGFydCwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiAhb3B0cy5ib3VuZHM7XG4gICAgfVxuICAgIGludGVycG9sYXRlKHBvaW50KSB7XG4gICAgICAgIGNvbnN0IHsgeCAsIHkgLCByYWRpdXMgIH0gPSB0aGlzO1xuICAgICAgICBjb25zdCBhbmdsZSA9IHBvaW50LmFuZ2xlO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeDogeCArIE1hdGguY29zKGFuZ2xlKSAqIHJhZGl1cyxcbiAgICAgICAgICAgIHk6IHkgKyBNYXRoLnNpbihhbmdsZSkgKiByYWRpdXMsXG4gICAgICAgICAgICBhbmdsZVxuICAgICAgICB9O1xuICAgIH1cbn1cblxuZnVuY3Rpb24gX2dldFRhcmdldChzb3VyY2UpIHtcbiAgICBjb25zdCB7IGNoYXJ0ICwgZmlsbCAsIGxpbmUgIH0gPSBzb3VyY2U7XG4gICAgaWYgKGlzTnVtYmVyRmluaXRlKGZpbGwpKSB7XG4gICAgICAgIHJldHVybiBnZXRMaW5lQnlJbmRleChjaGFydCwgZmlsbCk7XG4gICAgfVxuICAgIGlmIChmaWxsID09PSAnc3RhY2snKSB7XG4gICAgICAgIHJldHVybiBfYnVpbGRTdGFja0xpbmUoc291cmNlKTtcbiAgICB9XG4gICAgaWYgKGZpbGwgPT09ICdzaGFwZScpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IGJvdW5kYXJ5ID0gY29tcHV0ZUJvdW5kYXJ5KHNvdXJjZSk7XG4gICAgaWYgKGJvdW5kYXJ5IGluc3RhbmNlb2Ygc2ltcGxlQXJjKSB7XG4gICAgICAgIHJldHVybiBib3VuZGFyeTtcbiAgICB9XG4gICAgcmV0dXJuIF9jcmVhdGVCb3VuZGFyeUxpbmUoYm91bmRhcnksIGxpbmUpO1xufVxuIGZ1bmN0aW9uIGdldExpbmVCeUluZGV4KGNoYXJ0LCBpbmRleCkge1xuICAgIGNvbnN0IG1ldGEgPSBjaGFydC5nZXREYXRhc2V0TWV0YShpbmRleCk7XG4gICAgY29uc3QgdmlzaWJsZSA9IG1ldGEgJiYgY2hhcnQuaXNEYXRhc2V0VmlzaWJsZShpbmRleCk7XG4gICAgcmV0dXJuIHZpc2libGUgPyBtZXRhLmRhdGFzZXQgOiBudWxsO1xufVxuZnVuY3Rpb24gY29tcHV0ZUJvdW5kYXJ5KHNvdXJjZSkge1xuICAgIGNvbnN0IHNjYWxlID0gc291cmNlLnNjYWxlIHx8IHt9O1xuICAgIGlmIChzY2FsZS5nZXRQb2ludFBvc2l0aW9uRm9yVmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGNvbXB1dGVDaXJjdWxhckJvdW5kYXJ5KHNvdXJjZSk7XG4gICAgfVxuICAgIHJldHVybiBjb21wdXRlTGluZWFyQm91bmRhcnkoc291cmNlKTtcbn1cbmZ1bmN0aW9uIGNvbXB1dGVMaW5lYXJCb3VuZGFyeShzb3VyY2UpIHtcbiAgICBjb25zdCB7IHNjYWxlID17fSAsIGZpbGwgIH0gPSBzb3VyY2U7XG4gICAgY29uc3QgcGl4ZWwgPSBfZ2V0VGFyZ2V0UGl4ZWwoZmlsbCwgc2NhbGUpO1xuICAgIGlmIChpc051bWJlckZpbml0ZShwaXhlbCkpIHtcbiAgICAgICAgY29uc3QgaG9yaXpvbnRhbCA9IHNjYWxlLmlzSG9yaXpvbnRhbCgpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeDogaG9yaXpvbnRhbCA/IHBpeGVsIDogbnVsbCxcbiAgICAgICAgICAgIHk6IGhvcml6b250YWwgPyBudWxsIDogcGl4ZWxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBjb21wdXRlQ2lyY3VsYXJCb3VuZGFyeShzb3VyY2UpIHtcbiAgICBjb25zdCB7IHNjYWxlICwgZmlsbCAgfSA9IHNvdXJjZTtcbiAgICBjb25zdCBvcHRpb25zID0gc2NhbGUub3B0aW9ucztcbiAgICBjb25zdCBsZW5ndGggPSBzY2FsZS5nZXRMYWJlbHMoKS5sZW5ndGg7XG4gICAgY29uc3Qgc3RhcnQgPSBvcHRpb25zLnJldmVyc2UgPyBzY2FsZS5tYXggOiBzY2FsZS5taW47XG4gICAgY29uc3QgdmFsdWUgPSBfZ2V0VGFyZ2V0VmFsdWUoZmlsbCwgc2NhbGUsIHN0YXJ0KTtcbiAgICBjb25zdCB0YXJnZXQgPSBbXTtcbiAgICBpZiAob3B0aW9ucy5ncmlkLmNpcmN1bGFyKSB7XG4gICAgICAgIGNvbnN0IGNlbnRlciA9IHNjYWxlLmdldFBvaW50UG9zaXRpb25Gb3JWYWx1ZSgwLCBzdGFydCk7XG4gICAgICAgIHJldHVybiBuZXcgc2ltcGxlQXJjKHtcbiAgICAgICAgICAgIHg6IGNlbnRlci54LFxuICAgICAgICAgICAgeTogY2VudGVyLnksXG4gICAgICAgICAgICByYWRpdXM6IHNjYWxlLmdldERpc3RhbmNlRnJvbUNlbnRlckZvclZhbHVlKHZhbHVlKVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZm9yKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKXtcbiAgICAgICAgdGFyZ2V0LnB1c2goc2NhbGUuZ2V0UG9pbnRQb3NpdGlvbkZvclZhbHVlKGksIHZhbHVlKSk7XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXQ7XG59XG5cbmZ1bmN0aW9uIF9kcmF3ZmlsbChjdHgsIHNvdXJjZSwgYXJlYSkge1xuICAgIGNvbnN0IHRhcmdldCA9IF9nZXRUYXJnZXQoc291cmNlKTtcbiAgICBjb25zdCB7IGxpbmUgLCBzY2FsZSAsIGF4aXMgIH0gPSBzb3VyY2U7XG4gICAgY29uc3QgbGluZU9wdHMgPSBsaW5lLm9wdGlvbnM7XG4gICAgY29uc3QgZmlsbE9wdGlvbiA9IGxpbmVPcHRzLmZpbGw7XG4gICAgY29uc3QgY29sb3IgPSBsaW5lT3B0cy5iYWNrZ3JvdW5kQ29sb3I7XG4gICAgY29uc3QgeyBhYm92ZSA9Y29sb3IgLCBiZWxvdyA9Y29sb3IgIH0gPSBmaWxsT3B0aW9uIHx8IHt9O1xuICAgIGlmICh0YXJnZXQgJiYgbGluZS5wb2ludHMubGVuZ3RoKSB7XG4gICAgICAgIGNsaXBBcmVhKGN0eCwgYXJlYSk7XG4gICAgICAgIGRvRmlsbChjdHgsIHtcbiAgICAgICAgICAgIGxpbmUsXG4gICAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgICBhYm92ZSxcbiAgICAgICAgICAgIGJlbG93LFxuICAgICAgICAgICAgYXJlYSxcbiAgICAgICAgICAgIHNjYWxlLFxuICAgICAgICAgICAgYXhpc1xuICAgICAgICB9KTtcbiAgICAgICAgdW5jbGlwQXJlYShjdHgpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGRvRmlsbChjdHgsIGNmZykge1xuICAgIGNvbnN0IHsgbGluZSAsIHRhcmdldCAsIGFib3ZlICwgYmVsb3cgLCBhcmVhICwgc2NhbGUgIH0gPSBjZmc7XG4gICAgY29uc3QgcHJvcGVydHkgPSBsaW5lLl9sb29wID8gJ2FuZ2xlJyA6IGNmZy5heGlzO1xuICAgIGN0eC5zYXZlKCk7XG4gICAgaWYgKHByb3BlcnR5ID09PSAneCcgJiYgYmVsb3cgIT09IGFib3ZlKSB7XG4gICAgICAgIGNsaXBWZXJ0aWNhbChjdHgsIHRhcmdldCwgYXJlYS50b3ApO1xuICAgICAgICBmaWxsKGN0eCwge1xuICAgICAgICAgICAgbGluZSxcbiAgICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICAgIGNvbG9yOiBhYm92ZSxcbiAgICAgICAgICAgIHNjYWxlLFxuICAgICAgICAgICAgcHJvcGVydHlcbiAgICAgICAgfSk7XG4gICAgICAgIGN0eC5yZXN0b3JlKCk7XG4gICAgICAgIGN0eC5zYXZlKCk7XG4gICAgICAgIGNsaXBWZXJ0aWNhbChjdHgsIHRhcmdldCwgYXJlYS5ib3R0b20pO1xuICAgIH1cbiAgICBmaWxsKGN0eCwge1xuICAgICAgICBsaW5lLFxuICAgICAgICB0YXJnZXQsXG4gICAgICAgIGNvbG9yOiBiZWxvdyxcbiAgICAgICAgc2NhbGUsXG4gICAgICAgIHByb3BlcnR5XG4gICAgfSk7XG4gICAgY3R4LnJlc3RvcmUoKTtcbn1cbmZ1bmN0aW9uIGNsaXBWZXJ0aWNhbChjdHgsIHRhcmdldCwgY2xpcFkpIHtcbiAgICBjb25zdCB7IHNlZ21lbnRzICwgcG9pbnRzICB9ID0gdGFyZ2V0O1xuICAgIGxldCBmaXJzdCA9IHRydWU7XG4gICAgbGV0IGxpbmVMb29wID0gZmFsc2U7XG4gICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgIGZvciAoY29uc3Qgc2VnbWVudCBvZiBzZWdtZW50cyl7XG4gICAgICAgIGNvbnN0IHsgc3RhcnQgLCBlbmQgIH0gPSBzZWdtZW50O1xuICAgICAgICBjb25zdCBmaXJzdFBvaW50ID0gcG9pbnRzW3N0YXJ0XTtcbiAgICAgICAgY29uc3QgbGFzdFBvaW50ID0gcG9pbnRzW19maW5kU2VnbWVudEVuZChzdGFydCwgZW5kLCBwb2ludHMpXTtcbiAgICAgICAgaWYgKGZpcnN0KSB7XG4gICAgICAgICAgICBjdHgubW92ZVRvKGZpcnN0UG9pbnQueCwgZmlyc3RQb2ludC55KTtcbiAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjdHgubGluZVRvKGZpcnN0UG9pbnQueCwgY2xpcFkpO1xuICAgICAgICAgICAgY3R4LmxpbmVUbyhmaXJzdFBvaW50LngsIGZpcnN0UG9pbnQueSk7XG4gICAgICAgIH1cbiAgICAgICAgbGluZUxvb3AgPSAhIXRhcmdldC5wYXRoU2VnbWVudChjdHgsIHNlZ21lbnQsIHtcbiAgICAgICAgICAgIG1vdmU6IGxpbmVMb29wXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAobGluZUxvb3ApIHtcbiAgICAgICAgICAgIGN0eC5jbG9zZVBhdGgoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGN0eC5saW5lVG8obGFzdFBvaW50LngsIGNsaXBZKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjdHgubGluZVRvKHRhcmdldC5maXJzdCgpLngsIGNsaXBZKTtcbiAgICBjdHguY2xvc2VQYXRoKCk7XG4gICAgY3R4LmNsaXAoKTtcbn1cbmZ1bmN0aW9uIGZpbGwoY3R4LCBjZmcpIHtcbiAgICBjb25zdCB7IGxpbmUgLCB0YXJnZXQgLCBwcm9wZXJ0eSAsIGNvbG9yICwgc2NhbGUgIH0gPSBjZmc7XG4gICAgY29uc3Qgc2VnbWVudHMgPSBfc2VnbWVudHMobGluZSwgdGFyZ2V0LCBwcm9wZXJ0eSk7XG4gICAgZm9yIChjb25zdCB7IHNvdXJjZTogc3JjICwgdGFyZ2V0OiB0Z3QgLCBzdGFydCAsIGVuZCAgfSBvZiBzZWdtZW50cyl7XG4gICAgICAgIGNvbnN0IHsgc3R5bGU6IHsgYmFja2dyb3VuZENvbG9yID1jb2xvciAgfSA9IHt9ICB9ID0gc3JjO1xuICAgICAgICBjb25zdCBub3RTaGFwZSA9IHRhcmdldCAhPT0gdHJ1ZTtcbiAgICAgICAgY3R4LnNhdmUoKTtcbiAgICAgICAgY3R4LmZpbGxTdHlsZSA9IGJhY2tncm91bmRDb2xvcjtcbiAgICAgICAgY2xpcEJvdW5kcyhjdHgsIHNjYWxlLCBub3RTaGFwZSAmJiBfZ2V0Qm91bmRzKHByb3BlcnR5LCBzdGFydCwgZW5kKSk7XG4gICAgICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICAgICAgY29uc3QgbGluZUxvb3AgPSAhIWxpbmUucGF0aFNlZ21lbnQoY3R4LCBzcmMpO1xuICAgICAgICBsZXQgbG9vcDtcbiAgICAgICAgaWYgKG5vdFNoYXBlKSB7XG4gICAgICAgICAgICBpZiAobGluZUxvb3ApIHtcbiAgICAgICAgICAgICAgICBjdHguY2xvc2VQYXRoKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGludGVycG9sYXRlZExpbmVUbyhjdHgsIHRhcmdldCwgZW5kLCBwcm9wZXJ0eSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB0YXJnZXRMb29wID0gISF0YXJnZXQucGF0aFNlZ21lbnQoY3R4LCB0Z3QsIHtcbiAgICAgICAgICAgICAgICBtb3ZlOiBsaW5lTG9vcCxcbiAgICAgICAgICAgICAgICByZXZlcnNlOiB0cnVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGxvb3AgPSBsaW5lTG9vcCAmJiB0YXJnZXRMb29wO1xuICAgICAgICAgICAgaWYgKCFsb29wKSB7XG4gICAgICAgICAgICAgICAgaW50ZXJwb2xhdGVkTGluZVRvKGN0eCwgdGFyZ2V0LCBzdGFydCwgcHJvcGVydHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGN0eC5jbG9zZVBhdGgoKTtcbiAgICAgICAgY3R4LmZpbGwobG9vcCA/ICdldmVub2RkJyA6ICdub256ZXJvJyk7XG4gICAgICAgIGN0eC5yZXN0b3JlKCk7XG4gICAgfVxufVxuZnVuY3Rpb24gY2xpcEJvdW5kcyhjdHgsIHNjYWxlLCBib3VuZHMpIHtcbiAgICBjb25zdCB7IHRvcCAsIGJvdHRvbSAgfSA9IHNjYWxlLmNoYXJ0LmNoYXJ0QXJlYTtcbiAgICBjb25zdCB7IHByb3BlcnR5ICwgc3RhcnQgLCBlbmQgIH0gPSBib3VuZHMgfHwge307XG4gICAgaWYgKHByb3BlcnR5ID09PSAneCcpIHtcbiAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgICBjdHgucmVjdChzdGFydCwgdG9wLCBlbmQgLSBzdGFydCwgYm90dG9tIC0gdG9wKTtcbiAgICAgICAgY3R4LmNsaXAoKTtcbiAgICB9XG59XG5mdW5jdGlvbiBpbnRlcnBvbGF0ZWRMaW5lVG8oY3R4LCB0YXJnZXQsIHBvaW50LCBwcm9wZXJ0eSkge1xuICAgIGNvbnN0IGludGVycG9sYXRlZFBvaW50ID0gdGFyZ2V0LmludGVycG9sYXRlKHBvaW50LCBwcm9wZXJ0eSk7XG4gICAgaWYgKGludGVycG9sYXRlZFBvaW50KSB7XG4gICAgICAgIGN0eC5saW5lVG8oaW50ZXJwb2xhdGVkUG9pbnQueCwgaW50ZXJwb2xhdGVkUG9pbnQueSk7XG4gICAgfVxufVxuXG52YXIgaW5kZXggPSB7XG4gICAgaWQ6ICdmaWxsZXInLFxuICAgIGFmdGVyRGF0YXNldHNVcGRhdGUgKGNoYXJ0LCBfYXJncywgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBjb3VudCA9IChjaGFydC5kYXRhLmRhdGFzZXRzIHx8IFtdKS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IHNvdXJjZXMgPSBbXTtcbiAgICAgICAgbGV0IG1ldGEsIGksIGxpbmUsIHNvdXJjZTtcbiAgICAgICAgZm9yKGkgPSAwOyBpIDwgY291bnQ7ICsraSl7XG4gICAgICAgICAgICBtZXRhID0gY2hhcnQuZ2V0RGF0YXNldE1ldGEoaSk7XG4gICAgICAgICAgICBsaW5lID0gbWV0YS5kYXRhc2V0O1xuICAgICAgICAgICAgc291cmNlID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChsaW5lICYmIGxpbmUub3B0aW9ucyAmJiBsaW5lIGluc3RhbmNlb2YgTGluZUVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBzb3VyY2UgPSB7XG4gICAgICAgICAgICAgICAgICAgIHZpc2libGU6IGNoYXJ0LmlzRGF0YXNldFZpc2libGUoaSksXG4gICAgICAgICAgICAgICAgICAgIGluZGV4OiBpLFxuICAgICAgICAgICAgICAgICAgICBmaWxsOiBfZGVjb2RlRmlsbChsaW5lLCBpLCBjb3VudCksXG4gICAgICAgICAgICAgICAgICAgIGNoYXJ0LFxuICAgICAgICAgICAgICAgICAgICBheGlzOiBtZXRhLmNvbnRyb2xsZXIub3B0aW9ucy5pbmRleEF4aXMsXG4gICAgICAgICAgICAgICAgICAgIHNjYWxlOiBtZXRhLnZTY2FsZSxcbiAgICAgICAgICAgICAgICAgICAgbGluZVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBtZXRhLiRmaWxsZXIgPSBzb3VyY2U7XG4gICAgICAgICAgICBzb3VyY2VzLnB1c2goc291cmNlKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IoaSA9IDA7IGkgPCBjb3VudDsgKytpKXtcbiAgICAgICAgICAgIHNvdXJjZSA9IHNvdXJjZXNbaV07XG4gICAgICAgICAgICBpZiAoIXNvdXJjZSB8fCBzb3VyY2UuZmlsbCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNvdXJjZS5maWxsID0gX3Jlc29sdmVUYXJnZXQoc291cmNlcywgaSwgb3B0aW9ucy5wcm9wYWdhdGUpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBiZWZvcmVEcmF3IChjaGFydCwgX2FyZ3MsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgZHJhdyA9IG9wdGlvbnMuZHJhd1RpbWUgPT09ICdiZWZvcmVEcmF3JztcbiAgICAgICAgY29uc3QgbWV0YXNldHMgPSBjaGFydC5nZXRTb3J0ZWRWaXNpYmxlRGF0YXNldE1ldGFzKCk7XG4gICAgICAgIGNvbnN0IGFyZWEgPSBjaGFydC5jaGFydEFyZWE7XG4gICAgICAgIGZvcihsZXQgaSA9IG1ldGFzZXRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKXtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IG1ldGFzZXRzW2ldLiRmaWxsZXI7XG4gICAgICAgICAgICBpZiAoIXNvdXJjZSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc291cmNlLmxpbmUudXBkYXRlQ29udHJvbFBvaW50cyhhcmVhLCBzb3VyY2UuYXhpcyk7XG4gICAgICAgICAgICBpZiAoZHJhdyAmJiBzb3VyY2UuZmlsbCkge1xuICAgICAgICAgICAgICAgIF9kcmF3ZmlsbChjaGFydC5jdHgsIHNvdXJjZSwgYXJlYSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuICAgIGJlZm9yZURhdGFzZXRzRHJhdyAoY2hhcnQsIF9hcmdzLCBvcHRpb25zKSB7XG4gICAgICAgIGlmIChvcHRpb25zLmRyYXdUaW1lICE9PSAnYmVmb3JlRGF0YXNldHNEcmF3Jykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1ldGFzZXRzID0gY2hhcnQuZ2V0U29ydGVkVmlzaWJsZURhdGFzZXRNZXRhcygpO1xuICAgICAgICBmb3IobGV0IGkgPSBtZXRhc2V0cy5sZW5ndGggLSAxOyBpID49IDA7IC0taSl7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2UgPSBtZXRhc2V0c1tpXS4kZmlsbGVyO1xuICAgICAgICAgICAgaWYgKF9zaG91bGRBcHBseUZpbGwoc291cmNlKSkge1xuICAgICAgICAgICAgICAgIF9kcmF3ZmlsbChjaGFydC5jdHgsIHNvdXJjZSwgY2hhcnQuY2hhcnRBcmVhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG4gICAgYmVmb3JlRGF0YXNldERyYXcgKGNoYXJ0LCBhcmdzLCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IGFyZ3MubWV0YS4kZmlsbGVyO1xuICAgICAgICBpZiAoIV9zaG91bGRBcHBseUZpbGwoc291cmNlKSB8fCBvcHRpb25zLmRyYXdUaW1lICE9PSAnYmVmb3JlRGF0YXNldERyYXcnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgX2RyYXdmaWxsKGNoYXJ0LmN0eCwgc291cmNlLCBjaGFydC5jaGFydEFyZWEpO1xuICAgIH0sXG4gICAgZGVmYXVsdHM6IHtcbiAgICAgICAgcHJvcGFnYXRlOiB0cnVlLFxuICAgICAgICBkcmF3VGltZTogJ2JlZm9yZURhdGFzZXREcmF3J1xuICAgIH1cbn07XG5cbmNvbnN0IGdldEJveFNpemUgPSAobGFiZWxPcHRzLCBmb250U2l6ZSk9PntcbiAgICBsZXQgeyBib3hIZWlnaHQgPWZvbnRTaXplICwgYm94V2lkdGggPWZvbnRTaXplICB9ID0gbGFiZWxPcHRzO1xuICAgIGlmIChsYWJlbE9wdHMudXNlUG9pbnRTdHlsZSkge1xuICAgICAgICBib3hIZWlnaHQgPSBNYXRoLm1pbihib3hIZWlnaHQsIGZvbnRTaXplKTtcbiAgICAgICAgYm94V2lkdGggPSBsYWJlbE9wdHMucG9pbnRTdHlsZVdpZHRoIHx8IE1hdGgubWluKGJveFdpZHRoLCBmb250U2l6ZSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGJveFdpZHRoLFxuICAgICAgICBib3hIZWlnaHQsXG4gICAgICAgIGl0ZW1IZWlnaHQ6IE1hdGgubWF4KGZvbnRTaXplLCBib3hIZWlnaHQpXG4gICAgfTtcbn07XG5jb25zdCBpdGVtc0VxdWFsID0gKGEsIGIpPT5hICE9PSBudWxsICYmIGIgIT09IG51bGwgJiYgYS5kYXRhc2V0SW5kZXggPT09IGIuZGF0YXNldEluZGV4ICYmIGEuaW5kZXggPT09IGIuaW5kZXg7XG5jbGFzcyBMZWdlbmQgZXh0ZW5kcyBFbGVtZW50IHtcbiBjb25zdHJ1Y3Rvcihjb25maWcpe1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLl9hZGRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmxlZ2VuZEhpdEJveGVzID0gW107XG4gdGhpcy5faG92ZXJlZEl0ZW0gPSBudWxsO1xuICAgICAgICB0aGlzLmRvdWdobnV0TW9kZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNoYXJ0ID0gY29uZmlnLmNoYXJ0O1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBjb25maWcub3B0aW9ucztcbiAgICAgICAgdGhpcy5jdHggPSBjb25maWcuY3R4O1xuICAgICAgICB0aGlzLmxlZ2VuZEl0ZW1zID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmNvbHVtblNpemVzID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmxpbmVXaWR0aHMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMubWF4SGVpZ2h0ID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLm1heFdpZHRoID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLnRvcCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5ib3R0b20gPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMubGVmdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5yaWdodCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMud2lkdGggPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX21hcmdpbnMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMucG9zaXRpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMud2VpZ2h0ID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmZ1bGxTaXplID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICB1cGRhdGUobWF4V2lkdGgsIG1heEhlaWdodCwgbWFyZ2lucykge1xuICAgICAgICB0aGlzLm1heFdpZHRoID0gbWF4V2lkdGg7XG4gICAgICAgIHRoaXMubWF4SGVpZ2h0ID0gbWF4SGVpZ2h0O1xuICAgICAgICB0aGlzLl9tYXJnaW5zID0gbWFyZ2lucztcbiAgICAgICAgdGhpcy5zZXREaW1lbnNpb25zKCk7XG4gICAgICAgIHRoaXMuYnVpbGRMYWJlbHMoKTtcbiAgICAgICAgdGhpcy5maXQoKTtcbiAgICB9XG4gICAgc2V0RGltZW5zaW9ucygpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNIb3Jpem9udGFsKCkpIHtcbiAgICAgICAgICAgIHRoaXMud2lkdGggPSB0aGlzLm1heFdpZHRoO1xuICAgICAgICAgICAgdGhpcy5sZWZ0ID0gdGhpcy5fbWFyZ2lucy5sZWZ0O1xuICAgICAgICAgICAgdGhpcy5yaWdodCA9IHRoaXMud2lkdGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmhlaWdodCA9IHRoaXMubWF4SGVpZ2h0O1xuICAgICAgICAgICAgdGhpcy50b3AgPSB0aGlzLl9tYXJnaW5zLnRvcDtcbiAgICAgICAgICAgIHRoaXMuYm90dG9tID0gdGhpcy5oZWlnaHQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYnVpbGRMYWJlbHMoKSB7XG4gICAgICAgIGNvbnN0IGxhYmVsT3B0cyA9IHRoaXMub3B0aW9ucy5sYWJlbHMgfHwge307XG4gICAgICAgIGxldCBsZWdlbmRJdGVtcyA9IGNhbGxiYWNrKGxhYmVsT3B0cy5nZW5lcmF0ZUxhYmVscywgW1xuICAgICAgICAgICAgdGhpcy5jaGFydFxuICAgICAgICBdLCB0aGlzKSB8fCBbXTtcbiAgICAgICAgaWYgKGxhYmVsT3B0cy5maWx0ZXIpIHtcbiAgICAgICAgICAgIGxlZ2VuZEl0ZW1zID0gbGVnZW5kSXRlbXMuZmlsdGVyKChpdGVtKT0+bGFiZWxPcHRzLmZpbHRlcihpdGVtLCB0aGlzLmNoYXJ0LmRhdGEpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGFiZWxPcHRzLnNvcnQpIHtcbiAgICAgICAgICAgIGxlZ2VuZEl0ZW1zID0gbGVnZW5kSXRlbXMuc29ydCgoYSwgYik9PmxhYmVsT3B0cy5zb3J0KGEsIGIsIHRoaXMuY2hhcnQuZGF0YSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMucmV2ZXJzZSkge1xuICAgICAgICAgICAgbGVnZW5kSXRlbXMucmV2ZXJzZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubGVnZW5kSXRlbXMgPSBsZWdlbmRJdGVtcztcbiAgICB9XG4gICAgZml0KCkge1xuICAgICAgICBjb25zdCB7IG9wdGlvbnMgLCBjdHggIH0gPSB0aGlzO1xuICAgICAgICBpZiAoIW9wdGlvbnMuZGlzcGxheSkge1xuICAgICAgICAgICAgdGhpcy53aWR0aCA9IHRoaXMuaGVpZ2h0ID0gMDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBsYWJlbE9wdHMgPSBvcHRpb25zLmxhYmVscztcbiAgICAgICAgY29uc3QgbGFiZWxGb250ID0gdG9Gb250KGxhYmVsT3B0cy5mb250KTtcbiAgICAgICAgY29uc3QgZm9udFNpemUgPSBsYWJlbEZvbnQuc2l6ZTtcbiAgICAgICAgY29uc3QgdGl0bGVIZWlnaHQgPSB0aGlzLl9jb21wdXRlVGl0bGVIZWlnaHQoKTtcbiAgICAgICAgY29uc3QgeyBib3hXaWR0aCAsIGl0ZW1IZWlnaHQgIH0gPSBnZXRCb3hTaXplKGxhYmVsT3B0cywgZm9udFNpemUpO1xuICAgICAgICBsZXQgd2lkdGgsIGhlaWdodDtcbiAgICAgICAgY3R4LmZvbnQgPSBsYWJlbEZvbnQuc3RyaW5nO1xuICAgICAgICBpZiAodGhpcy5pc0hvcml6b250YWwoKSkge1xuICAgICAgICAgICAgd2lkdGggPSB0aGlzLm1heFdpZHRoO1xuICAgICAgICAgICAgaGVpZ2h0ID0gdGhpcy5fZml0Um93cyh0aXRsZUhlaWdodCwgZm9udFNpemUsIGJveFdpZHRoLCBpdGVtSGVpZ2h0KSArIDEwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaGVpZ2h0ID0gdGhpcy5tYXhIZWlnaHQ7XG4gICAgICAgICAgICB3aWR0aCA9IHRoaXMuX2ZpdENvbHModGl0bGVIZWlnaHQsIGxhYmVsRm9udCwgYm94V2lkdGgsIGl0ZW1IZWlnaHQpICsgMTA7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy53aWR0aCA9IE1hdGgubWluKHdpZHRoLCBvcHRpb25zLm1heFdpZHRoIHx8IHRoaXMubWF4V2lkdGgpO1xuICAgICAgICB0aGlzLmhlaWdodCA9IE1hdGgubWluKGhlaWdodCwgb3B0aW9ucy5tYXhIZWlnaHQgfHwgdGhpcy5tYXhIZWlnaHQpO1xuICAgIH1cbiBfZml0Um93cyh0aXRsZUhlaWdodCwgZm9udFNpemUsIGJveFdpZHRoLCBpdGVtSGVpZ2h0KSB7XG4gICAgICAgIGNvbnN0IHsgY3R4ICwgbWF4V2lkdGggLCBvcHRpb25zOiB7IGxhYmVsczogeyBwYWRkaW5nICB9ICB9ICB9ID0gdGhpcztcbiAgICAgICAgY29uc3QgaGl0Ym94ZXMgPSB0aGlzLmxlZ2VuZEhpdEJveGVzID0gW107XG4gICAgICAgIGNvbnN0IGxpbmVXaWR0aHMgPSB0aGlzLmxpbmVXaWR0aHMgPSBbXG4gICAgICAgICAgICAwXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGxpbmVIZWlnaHQgPSBpdGVtSGVpZ2h0ICsgcGFkZGluZztcbiAgICAgICAgbGV0IHRvdGFsSGVpZ2h0ID0gdGl0bGVIZWlnaHQ7XG4gICAgICAgIGN0eC50ZXh0QWxpZ24gPSAnbGVmdCc7XG4gICAgICAgIGN0eC50ZXh0QmFzZWxpbmUgPSAnbWlkZGxlJztcbiAgICAgICAgbGV0IHJvdyA9IC0xO1xuICAgICAgICBsZXQgdG9wID0gLWxpbmVIZWlnaHQ7XG4gICAgICAgIHRoaXMubGVnZW5kSXRlbXMuZm9yRWFjaCgobGVnZW5kSXRlbSwgaSk9PntcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1XaWR0aCA9IGJveFdpZHRoICsgZm9udFNpemUgLyAyICsgY3R4Lm1lYXN1cmVUZXh0KGxlZ2VuZEl0ZW0udGV4dCkud2lkdGg7XG4gICAgICAgICAgICBpZiAoaSA9PT0gMCB8fCBsaW5lV2lkdGhzW2xpbmVXaWR0aHMubGVuZ3RoIC0gMV0gKyBpdGVtV2lkdGggKyAyICogcGFkZGluZyA+IG1heFdpZHRoKSB7XG4gICAgICAgICAgICAgICAgdG90YWxIZWlnaHQgKz0gbGluZUhlaWdodDtcbiAgICAgICAgICAgICAgICBsaW5lV2lkdGhzW2xpbmVXaWR0aHMubGVuZ3RoIC0gKGkgPiAwID8gMCA6IDEpXSA9IDA7XG4gICAgICAgICAgICAgICAgdG9wICs9IGxpbmVIZWlnaHQ7XG4gICAgICAgICAgICAgICAgcm93Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBoaXRib3hlc1tpXSA9IHtcbiAgICAgICAgICAgICAgICBsZWZ0OiAwLFxuICAgICAgICAgICAgICAgIHRvcCxcbiAgICAgICAgICAgICAgICByb3csXG4gICAgICAgICAgICAgICAgd2lkdGg6IGl0ZW1XaWR0aCxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IGl0ZW1IZWlnaHRcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBsaW5lV2lkdGhzW2xpbmVXaWR0aHMubGVuZ3RoIC0gMV0gKz0gaXRlbVdpZHRoICsgcGFkZGluZztcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0b3RhbEhlaWdodDtcbiAgICB9XG4gICAgX2ZpdENvbHModGl0bGVIZWlnaHQsIGxhYmVsRm9udCwgYm94V2lkdGgsIF9pdGVtSGVpZ2h0KSB7XG4gICAgICAgIGNvbnN0IHsgY3R4ICwgbWF4SGVpZ2h0ICwgb3B0aW9uczogeyBsYWJlbHM6IHsgcGFkZGluZyAgfSAgfSAgfSA9IHRoaXM7XG4gICAgICAgIGNvbnN0IGhpdGJveGVzID0gdGhpcy5sZWdlbmRIaXRCb3hlcyA9IFtdO1xuICAgICAgICBjb25zdCBjb2x1bW5TaXplcyA9IHRoaXMuY29sdW1uU2l6ZXMgPSBbXTtcbiAgICAgICAgY29uc3QgaGVpZ2h0TGltaXQgPSBtYXhIZWlnaHQgLSB0aXRsZUhlaWdodDtcbiAgICAgICAgbGV0IHRvdGFsV2lkdGggPSBwYWRkaW5nO1xuICAgICAgICBsZXQgY3VycmVudENvbFdpZHRoID0gMDtcbiAgICAgICAgbGV0IGN1cnJlbnRDb2xIZWlnaHQgPSAwO1xuICAgICAgICBsZXQgbGVmdCA9IDA7XG4gICAgICAgIGxldCBjb2wgPSAwO1xuICAgICAgICB0aGlzLmxlZ2VuZEl0ZW1zLmZvckVhY2goKGxlZ2VuZEl0ZW0sIGkpPT57XG4gICAgICAgICAgICBjb25zdCB7IGl0ZW1XaWR0aCAsIGl0ZW1IZWlnaHQgIH0gPSBjYWxjdWxhdGVJdGVtU2l6ZShib3hXaWR0aCwgbGFiZWxGb250LCBjdHgsIGxlZ2VuZEl0ZW0sIF9pdGVtSGVpZ2h0KTtcbiAgICAgICAgICAgIGlmIChpID4gMCAmJiBjdXJyZW50Q29sSGVpZ2h0ICsgaXRlbUhlaWdodCArIDIgKiBwYWRkaW5nID4gaGVpZ2h0TGltaXQpIHtcbiAgICAgICAgICAgICAgICB0b3RhbFdpZHRoICs9IGN1cnJlbnRDb2xXaWR0aCArIHBhZGRpbmc7XG4gICAgICAgICAgICAgICAgY29sdW1uU2l6ZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiBjdXJyZW50Q29sV2lkdGgsXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogY3VycmVudENvbEhlaWdodFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGxlZnQgKz0gY3VycmVudENvbFdpZHRoICsgcGFkZGluZztcbiAgICAgICAgICAgICAgICBjb2wrKztcbiAgICAgICAgICAgICAgICBjdXJyZW50Q29sV2lkdGggPSBjdXJyZW50Q29sSGVpZ2h0ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhpdGJveGVzW2ldID0ge1xuICAgICAgICAgICAgICAgIGxlZnQsXG4gICAgICAgICAgICAgICAgdG9wOiBjdXJyZW50Q29sSGVpZ2h0LFxuICAgICAgICAgICAgICAgIGNvbCxcbiAgICAgICAgICAgICAgICB3aWR0aDogaXRlbVdpZHRoLFxuICAgICAgICAgICAgICAgIGhlaWdodDogaXRlbUhlaWdodFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGN1cnJlbnRDb2xXaWR0aCA9IE1hdGgubWF4KGN1cnJlbnRDb2xXaWR0aCwgaXRlbVdpZHRoKTtcbiAgICAgICAgICAgIGN1cnJlbnRDb2xIZWlnaHQgKz0gaXRlbUhlaWdodCArIHBhZGRpbmc7XG4gICAgICAgIH0pO1xuICAgICAgICB0b3RhbFdpZHRoICs9IGN1cnJlbnRDb2xXaWR0aDtcbiAgICAgICAgY29sdW1uU2l6ZXMucHVzaCh7XG4gICAgICAgICAgICB3aWR0aDogY3VycmVudENvbFdpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiBjdXJyZW50Q29sSGVpZ2h0XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdG90YWxXaWR0aDtcbiAgICB9XG4gICAgYWRqdXN0SGl0Qm94ZXMoKSB7XG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zLmRpc3BsYXkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0aXRsZUhlaWdodCA9IHRoaXMuX2NvbXB1dGVUaXRsZUhlaWdodCgpO1xuICAgICAgICBjb25zdCB7IGxlZ2VuZEhpdEJveGVzOiBoaXRib3hlcyAsIG9wdGlvbnM6IHsgYWxpZ24gLCBsYWJlbHM6IHsgcGFkZGluZyAgfSAsIHJ0bCAgfSAgfSA9IHRoaXM7XG4gICAgICAgIGNvbnN0IHJ0bEhlbHBlciA9IGdldFJ0bEFkYXB0ZXIocnRsLCB0aGlzLmxlZnQsIHRoaXMud2lkdGgpO1xuICAgICAgICBpZiAodGhpcy5pc0hvcml6b250YWwoKSkge1xuICAgICAgICAgICAgbGV0IHJvdyA9IDA7XG4gICAgICAgICAgICBsZXQgbGVmdCA9IF9hbGlnblN0YXJ0RW5kKGFsaWduLCB0aGlzLmxlZnQgKyBwYWRkaW5nLCB0aGlzLnJpZ2h0IC0gdGhpcy5saW5lV2lkdGhzW3Jvd10pO1xuICAgICAgICAgICAgZm9yIChjb25zdCBoaXRib3ggb2YgaGl0Ym94ZXMpe1xuICAgICAgICAgICAgICAgIGlmIChyb3cgIT09IGhpdGJveC5yb3cpIHtcbiAgICAgICAgICAgICAgICAgICAgcm93ID0gaGl0Ym94LnJvdztcbiAgICAgICAgICAgICAgICAgICAgbGVmdCA9IF9hbGlnblN0YXJ0RW5kKGFsaWduLCB0aGlzLmxlZnQgKyBwYWRkaW5nLCB0aGlzLnJpZ2h0IC0gdGhpcy5saW5lV2lkdGhzW3Jvd10pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBoaXRib3gudG9wICs9IHRoaXMudG9wICsgdGl0bGVIZWlnaHQgKyBwYWRkaW5nO1xuICAgICAgICAgICAgICAgIGhpdGJveC5sZWZ0ID0gcnRsSGVscGVyLmxlZnRGb3JMdHIocnRsSGVscGVyLngobGVmdCksIGhpdGJveC53aWR0aCk7XG4gICAgICAgICAgICAgICAgbGVmdCArPSBoaXRib3gud2lkdGggKyBwYWRkaW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGNvbCA9IDA7XG4gICAgICAgICAgICBsZXQgdG9wID0gX2FsaWduU3RhcnRFbmQoYWxpZ24sIHRoaXMudG9wICsgdGl0bGVIZWlnaHQgKyBwYWRkaW5nLCB0aGlzLmJvdHRvbSAtIHRoaXMuY29sdW1uU2l6ZXNbY29sXS5oZWlnaHQpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBoaXRib3ggb2YgaGl0Ym94ZXMpe1xuICAgICAgICAgICAgICAgIGlmIChoaXRib3guY29sICE9PSBjb2wpIHtcbiAgICAgICAgICAgICAgICAgICAgY29sID0gaGl0Ym94LmNvbDtcbiAgICAgICAgICAgICAgICAgICAgdG9wID0gX2FsaWduU3RhcnRFbmQoYWxpZ24sIHRoaXMudG9wICsgdGl0bGVIZWlnaHQgKyBwYWRkaW5nLCB0aGlzLmJvdHRvbSAtIHRoaXMuY29sdW1uU2l6ZXNbY29sXS5oZWlnaHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBoaXRib3gudG9wID0gdG9wO1xuICAgICAgICAgICAgICAgIGhpdGJveC5sZWZ0ICs9IHRoaXMubGVmdCArIHBhZGRpbmc7XG4gICAgICAgICAgICAgICAgaGl0Ym94LmxlZnQgPSBydGxIZWxwZXIubGVmdEZvckx0cihydGxIZWxwZXIueChoaXRib3gubGVmdCksIGhpdGJveC53aWR0aCk7XG4gICAgICAgICAgICAgICAgdG9wICs9IGhpdGJveC5oZWlnaHQgKyBwYWRkaW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGlzSG9yaXpvbnRhbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5wb3NpdGlvbiA9PT0gJ3RvcCcgfHwgdGhpcy5vcHRpb25zLnBvc2l0aW9uID09PSAnYm90dG9tJztcbiAgICB9XG4gICAgZHJhdygpIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5kaXNwbGF5KSB7XG4gICAgICAgICAgICBjb25zdCBjdHggPSB0aGlzLmN0eDtcbiAgICAgICAgICAgIGNsaXBBcmVhKGN0eCwgdGhpcyk7XG4gICAgICAgICAgICB0aGlzLl9kcmF3KCk7XG4gICAgICAgICAgICB1bmNsaXBBcmVhKGN0eCk7XG4gICAgICAgIH1cbiAgICB9XG4gX2RyYXcoKSB7XG4gICAgICAgIGNvbnN0IHsgb3B0aW9uczogb3B0cyAsIGNvbHVtblNpemVzICwgbGluZVdpZHRocyAsIGN0eCAgfSA9IHRoaXM7XG4gICAgICAgIGNvbnN0IHsgYWxpZ24gLCBsYWJlbHM6IGxhYmVsT3B0cyAgfSA9IG9wdHM7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRDb2xvciA9IGRlZmF1bHRzLmNvbG9yO1xuICAgICAgICBjb25zdCBydGxIZWxwZXIgPSBnZXRSdGxBZGFwdGVyKG9wdHMucnRsLCB0aGlzLmxlZnQsIHRoaXMud2lkdGgpO1xuICAgICAgICBjb25zdCBsYWJlbEZvbnQgPSB0b0ZvbnQobGFiZWxPcHRzLmZvbnQpO1xuICAgICAgICBjb25zdCB7IHBhZGRpbmcgIH0gPSBsYWJlbE9wdHM7XG4gICAgICAgIGNvbnN0IGZvbnRTaXplID0gbGFiZWxGb250LnNpemU7XG4gICAgICAgIGNvbnN0IGhhbGZGb250U2l6ZSA9IGZvbnRTaXplIC8gMjtcbiAgICAgICAgbGV0IGN1cnNvcjtcbiAgICAgICAgdGhpcy5kcmF3VGl0bGUoKTtcbiAgICAgICAgY3R4LnRleHRBbGlnbiA9IHJ0bEhlbHBlci50ZXh0QWxpZ24oJ2xlZnQnKTtcbiAgICAgICAgY3R4LnRleHRCYXNlbGluZSA9ICdtaWRkbGUnO1xuICAgICAgICBjdHgubGluZVdpZHRoID0gMC41O1xuICAgICAgICBjdHguZm9udCA9IGxhYmVsRm9udC5zdHJpbmc7XG4gICAgICAgIGNvbnN0IHsgYm94V2lkdGggLCBib3hIZWlnaHQgLCBpdGVtSGVpZ2h0ICB9ID0gZ2V0Qm94U2l6ZShsYWJlbE9wdHMsIGZvbnRTaXplKTtcbiAgICAgICAgY29uc3QgZHJhd0xlZ2VuZEJveCA9IGZ1bmN0aW9uKHgsIHksIGxlZ2VuZEl0ZW0pIHtcbiAgICAgICAgICAgIGlmIChpc05hTihib3hXaWR0aCkgfHwgYm94V2lkdGggPD0gMCB8fCBpc05hTihib3hIZWlnaHQpIHx8IGJveEhlaWdodCA8IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjdHguc2F2ZSgpO1xuICAgICAgICAgICAgY29uc3QgbGluZVdpZHRoID0gdmFsdWVPckRlZmF1bHQobGVnZW5kSXRlbS5saW5lV2lkdGgsIDEpO1xuICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9IHZhbHVlT3JEZWZhdWx0KGxlZ2VuZEl0ZW0uZmlsbFN0eWxlLCBkZWZhdWx0Q29sb3IpO1xuICAgICAgICAgICAgY3R4LmxpbmVDYXAgPSB2YWx1ZU9yRGVmYXVsdChsZWdlbmRJdGVtLmxpbmVDYXAsICdidXR0Jyk7XG4gICAgICAgICAgICBjdHgubGluZURhc2hPZmZzZXQgPSB2YWx1ZU9yRGVmYXVsdChsZWdlbmRJdGVtLmxpbmVEYXNoT2Zmc2V0LCAwKTtcbiAgICAgICAgICAgIGN0eC5saW5lSm9pbiA9IHZhbHVlT3JEZWZhdWx0KGxlZ2VuZEl0ZW0ubGluZUpvaW4sICdtaXRlcicpO1xuICAgICAgICAgICAgY3R4LmxpbmVXaWR0aCA9IGxpbmVXaWR0aDtcbiAgICAgICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IHZhbHVlT3JEZWZhdWx0KGxlZ2VuZEl0ZW0uc3Ryb2tlU3R5bGUsIGRlZmF1bHRDb2xvcik7XG4gICAgICAgICAgICBjdHguc2V0TGluZURhc2godmFsdWVPckRlZmF1bHQobGVnZW5kSXRlbS5saW5lRGFzaCwgW10pKTtcbiAgICAgICAgICAgIGlmIChsYWJlbE9wdHMudXNlUG9pbnRTdHlsZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRyYXdPcHRpb25zID0ge1xuICAgICAgICAgICAgICAgICAgICByYWRpdXM6IGJveEhlaWdodCAqIE1hdGguU1FSVDIgLyAyLFxuICAgICAgICAgICAgICAgICAgICBwb2ludFN0eWxlOiBsZWdlbmRJdGVtLnBvaW50U3R5bGUsXG4gICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uOiBsZWdlbmRJdGVtLnJvdGF0aW9uLFxuICAgICAgICAgICAgICAgICAgICBib3JkZXJXaWR0aDogbGluZVdpZHRoXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCBjZW50ZXJYID0gcnRsSGVscGVyLnhQbHVzKHgsIGJveFdpZHRoIC8gMik7XG4gICAgICAgICAgICAgICAgY29uc3QgY2VudGVyWSA9IHkgKyBoYWxmRm9udFNpemU7XG4gICAgICAgICAgICAgICAgZHJhd1BvaW50TGVnZW5kKGN0eCwgZHJhd09wdGlvbnMsIGNlbnRlclgsIGNlbnRlclksIGxhYmVsT3B0cy5wb2ludFN0eWxlV2lkdGggJiYgYm94V2lkdGgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCB5Qm94VG9wID0geSArIE1hdGgubWF4KChmb250U2l6ZSAtIGJveEhlaWdodCkgLyAyLCAwKTtcbiAgICAgICAgICAgICAgICBjb25zdCB4Qm94TGVmdCA9IHJ0bEhlbHBlci5sZWZ0Rm9yTHRyKHgsIGJveFdpZHRoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBib3JkZXJSYWRpdXMgPSB0b1RSQkxDb3JuZXJzKGxlZ2VuZEl0ZW0uYm9yZGVyUmFkaXVzKTtcbiAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgICAgICAgICAgICAgaWYgKE9iamVjdC52YWx1ZXMoYm9yZGVyUmFkaXVzKS5zb21lKCh2KT0+diAhPT0gMCkpIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkUm91bmRlZFJlY3RQYXRoKGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgeDogeEJveExlZnQsXG4gICAgICAgICAgICAgICAgICAgICAgICB5OiB5Qm94VG9wLFxuICAgICAgICAgICAgICAgICAgICAgICAgdzogYm94V2lkdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBoOiBib3hIZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgICAgICByYWRpdXM6IGJvcmRlclJhZGl1c1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjdHgucmVjdCh4Qm94TGVmdCwgeUJveFRvcCwgYm94V2lkdGgsIGJveEhlaWdodCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGN0eC5maWxsKCk7XG4gICAgICAgICAgICAgICAgaWYgKGxpbmVXaWR0aCAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBjdHguc3Ryb2tlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3R4LnJlc3RvcmUoKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgZmlsbFRleHQgPSBmdW5jdGlvbih4LCB5LCBsZWdlbmRJdGVtKSB7XG4gICAgICAgICAgICByZW5kZXJUZXh0KGN0eCwgbGVnZW5kSXRlbS50ZXh0LCB4LCB5ICsgaXRlbUhlaWdodCAvIDIsIGxhYmVsRm9udCwge1xuICAgICAgICAgICAgICAgIHN0cmlrZXRocm91Z2g6IGxlZ2VuZEl0ZW0uaGlkZGVuLFxuICAgICAgICAgICAgICAgIHRleHRBbGlnbjogcnRsSGVscGVyLnRleHRBbGlnbihsZWdlbmRJdGVtLnRleHRBbGlnbilcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBpc0hvcml6b250YWwgPSB0aGlzLmlzSG9yaXpvbnRhbCgpO1xuICAgICAgICBjb25zdCB0aXRsZUhlaWdodCA9IHRoaXMuX2NvbXB1dGVUaXRsZUhlaWdodCgpO1xuICAgICAgICBpZiAoaXNIb3Jpem9udGFsKSB7XG4gICAgICAgICAgICBjdXJzb3IgPSB7XG4gICAgICAgICAgICAgICAgeDogX2FsaWduU3RhcnRFbmQoYWxpZ24sIHRoaXMubGVmdCArIHBhZGRpbmcsIHRoaXMucmlnaHQgLSBsaW5lV2lkdGhzWzBdKSxcbiAgICAgICAgICAgICAgICB5OiB0aGlzLnRvcCArIHBhZGRpbmcgKyB0aXRsZUhlaWdodCxcbiAgICAgICAgICAgICAgICBsaW5lOiAwXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY3Vyc29yID0ge1xuICAgICAgICAgICAgICAgIHg6IHRoaXMubGVmdCArIHBhZGRpbmcsXG4gICAgICAgICAgICAgICAgeTogX2FsaWduU3RhcnRFbmQoYWxpZ24sIHRoaXMudG9wICsgdGl0bGVIZWlnaHQgKyBwYWRkaW5nLCB0aGlzLmJvdHRvbSAtIGNvbHVtblNpemVzWzBdLmhlaWdodCksXG4gICAgICAgICAgICAgICAgbGluZTogMFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBvdmVycmlkZVRleHREaXJlY3Rpb24odGhpcy5jdHgsIG9wdHMudGV4dERpcmVjdGlvbik7XG4gICAgICAgIGNvbnN0IGxpbmVIZWlnaHQgPSBpdGVtSGVpZ2h0ICsgcGFkZGluZztcbiAgICAgICAgdGhpcy5sZWdlbmRJdGVtcy5mb3JFYWNoKChsZWdlbmRJdGVtLCBpKT0+e1xuICAgICAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gbGVnZW5kSXRlbS5mb250Q29sb3I7XG4gICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gbGVnZW5kSXRlbS5mb250Q29sb3I7XG4gICAgICAgICAgICBjb25zdCB0ZXh0V2lkdGggPSBjdHgubWVhc3VyZVRleHQobGVnZW5kSXRlbS50ZXh0KS53aWR0aDtcbiAgICAgICAgICAgIGNvbnN0IHRleHRBbGlnbiA9IHJ0bEhlbHBlci50ZXh0QWxpZ24obGVnZW5kSXRlbS50ZXh0QWxpZ24gfHwgKGxlZ2VuZEl0ZW0udGV4dEFsaWduID0gbGFiZWxPcHRzLnRleHRBbGlnbikpO1xuICAgICAgICAgICAgY29uc3Qgd2lkdGggPSBib3hXaWR0aCArIGhhbGZGb250U2l6ZSArIHRleHRXaWR0aDtcbiAgICAgICAgICAgIGxldCB4ID0gY3Vyc29yLng7XG4gICAgICAgICAgICBsZXQgeSA9IGN1cnNvci55O1xuICAgICAgICAgICAgcnRsSGVscGVyLnNldFdpZHRoKHRoaXMud2lkdGgpO1xuICAgICAgICAgICAgaWYgKGlzSG9yaXpvbnRhbCkge1xuICAgICAgICAgICAgICAgIGlmIChpID4gMCAmJiB4ICsgd2lkdGggKyBwYWRkaW5nID4gdGhpcy5yaWdodCkge1xuICAgICAgICAgICAgICAgICAgICB5ID0gY3Vyc29yLnkgKz0gbGluZUhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgY3Vyc29yLmxpbmUrKztcbiAgICAgICAgICAgICAgICAgICAgeCA9IGN1cnNvci54ID0gX2FsaWduU3RhcnRFbmQoYWxpZ24sIHRoaXMubGVmdCArIHBhZGRpbmcsIHRoaXMucmlnaHQgLSBsaW5lV2lkdGhzW2N1cnNvci5saW5lXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChpID4gMCAmJiB5ICsgbGluZUhlaWdodCA+IHRoaXMuYm90dG9tKSB7XG4gICAgICAgICAgICAgICAgeCA9IGN1cnNvci54ID0geCArIGNvbHVtblNpemVzW2N1cnNvci5saW5lXS53aWR0aCArIHBhZGRpbmc7XG4gICAgICAgICAgICAgICAgY3Vyc29yLmxpbmUrKztcbiAgICAgICAgICAgICAgICB5ID0gY3Vyc29yLnkgPSBfYWxpZ25TdGFydEVuZChhbGlnbiwgdGhpcy50b3AgKyB0aXRsZUhlaWdodCArIHBhZGRpbmcsIHRoaXMuYm90dG9tIC0gY29sdW1uU2l6ZXNbY3Vyc29yLmxpbmVdLmhlaWdodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByZWFsWCA9IHJ0bEhlbHBlci54KHgpO1xuICAgICAgICAgICAgZHJhd0xlZ2VuZEJveChyZWFsWCwgeSwgbGVnZW5kSXRlbSk7XG4gICAgICAgICAgICB4ID0gX3RleHRYKHRleHRBbGlnbiwgeCArIGJveFdpZHRoICsgaGFsZkZvbnRTaXplLCBpc0hvcml6b250YWwgPyB4ICsgd2lkdGggOiB0aGlzLnJpZ2h0LCBvcHRzLnJ0bCk7XG4gICAgICAgICAgICBmaWxsVGV4dChydGxIZWxwZXIueCh4KSwgeSwgbGVnZW5kSXRlbSk7XG4gICAgICAgICAgICBpZiAoaXNIb3Jpem9udGFsKSB7XG4gICAgICAgICAgICAgICAgY3Vyc29yLnggKz0gd2lkdGggKyBwYWRkaW5nO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbGVnZW5kSXRlbS50ZXh0ICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZvbnRMaW5lSGVpZ2h0ID0gbGFiZWxGb250LmxpbmVIZWlnaHQ7XG4gICAgICAgICAgICAgICAgY3Vyc29yLnkgKz0gY2FsY3VsYXRlTGVnZW5kSXRlbUhlaWdodChsZWdlbmRJdGVtLCBmb250TGluZUhlaWdodCkgKyBwYWRkaW5nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjdXJzb3IueSArPSBsaW5lSGVpZ2h0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmVzdG9yZVRleHREaXJlY3Rpb24odGhpcy5jdHgsIG9wdHMudGV4dERpcmVjdGlvbik7XG4gICAgfVxuIGRyYXdUaXRsZSgpIHtcbiAgICAgICAgY29uc3Qgb3B0cyA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgY29uc3QgdGl0bGVPcHRzID0gb3B0cy50aXRsZTtcbiAgICAgICAgY29uc3QgdGl0bGVGb250ID0gdG9Gb250KHRpdGxlT3B0cy5mb250KTtcbiAgICAgICAgY29uc3QgdGl0bGVQYWRkaW5nID0gdG9QYWRkaW5nKHRpdGxlT3B0cy5wYWRkaW5nKTtcbiAgICAgICAgaWYgKCF0aXRsZU9wdHMuZGlzcGxheSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJ0bEhlbHBlciA9IGdldFJ0bEFkYXB0ZXIob3B0cy5ydGwsIHRoaXMubGVmdCwgdGhpcy53aWR0aCk7XG4gICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuY3R4O1xuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IHRpdGxlT3B0cy5wb3NpdGlvbjtcbiAgICAgICAgY29uc3QgaGFsZkZvbnRTaXplID0gdGl0bGVGb250LnNpemUgLyAyO1xuICAgICAgICBjb25zdCB0b3BQYWRkaW5nUGx1c0hhbGZGb250U2l6ZSA9IHRpdGxlUGFkZGluZy50b3AgKyBoYWxmRm9udFNpemU7XG4gICAgICAgIGxldCB5O1xuICAgICAgICBsZXQgbGVmdCA9IHRoaXMubGVmdDtcbiAgICAgICAgbGV0IG1heFdpZHRoID0gdGhpcy53aWR0aDtcbiAgICAgICAgaWYgKHRoaXMuaXNIb3Jpem9udGFsKCkpIHtcbiAgICAgICAgICAgIG1heFdpZHRoID0gTWF0aC5tYXgoLi4udGhpcy5saW5lV2lkdGhzKTtcbiAgICAgICAgICAgIHkgPSB0aGlzLnRvcCArIHRvcFBhZGRpbmdQbHVzSGFsZkZvbnRTaXplO1xuICAgICAgICAgICAgbGVmdCA9IF9hbGlnblN0YXJ0RW5kKG9wdHMuYWxpZ24sIGxlZnQsIHRoaXMucmlnaHQgLSBtYXhXaWR0aCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBtYXhIZWlnaHQgPSB0aGlzLmNvbHVtblNpemVzLnJlZHVjZSgoYWNjLCBzaXplKT0+TWF0aC5tYXgoYWNjLCBzaXplLmhlaWdodCksIDApO1xuICAgICAgICAgICAgeSA9IHRvcFBhZGRpbmdQbHVzSGFsZkZvbnRTaXplICsgX2FsaWduU3RhcnRFbmQob3B0cy5hbGlnbiwgdGhpcy50b3AsIHRoaXMuYm90dG9tIC0gbWF4SGVpZ2h0IC0gb3B0cy5sYWJlbHMucGFkZGluZyAtIHRoaXMuX2NvbXB1dGVUaXRsZUhlaWdodCgpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB4ID0gX2FsaWduU3RhcnRFbmQocG9zaXRpb24sIGxlZnQsIGxlZnQgKyBtYXhXaWR0aCk7XG4gICAgICAgIGN0eC50ZXh0QWxpZ24gPSBydGxIZWxwZXIudGV4dEFsaWduKF90b0xlZnRSaWdodENlbnRlcihwb3NpdGlvbikpO1xuICAgICAgICBjdHgudGV4dEJhc2VsaW5lID0gJ21pZGRsZSc7XG4gICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IHRpdGxlT3B0cy5jb2xvcjtcbiAgICAgICAgY3R4LmZpbGxTdHlsZSA9IHRpdGxlT3B0cy5jb2xvcjtcbiAgICAgICAgY3R4LmZvbnQgPSB0aXRsZUZvbnQuc3RyaW5nO1xuICAgICAgICByZW5kZXJUZXh0KGN0eCwgdGl0bGVPcHRzLnRleHQsIHgsIHksIHRpdGxlRm9udCk7XG4gICAgfVxuIF9jb21wdXRlVGl0bGVIZWlnaHQoKSB7XG4gICAgICAgIGNvbnN0IHRpdGxlT3B0cyA9IHRoaXMub3B0aW9ucy50aXRsZTtcbiAgICAgICAgY29uc3QgdGl0bGVGb250ID0gdG9Gb250KHRpdGxlT3B0cy5mb250KTtcbiAgICAgICAgY29uc3QgdGl0bGVQYWRkaW5nID0gdG9QYWRkaW5nKHRpdGxlT3B0cy5wYWRkaW5nKTtcbiAgICAgICAgcmV0dXJuIHRpdGxlT3B0cy5kaXNwbGF5ID8gdGl0bGVGb250LmxpbmVIZWlnaHQgKyB0aXRsZVBhZGRpbmcuaGVpZ2h0IDogMDtcbiAgICB9XG4gX2dldExlZ2VuZEl0ZW1BdCh4LCB5KSB7XG4gICAgICAgIGxldCBpLCBoaXRCb3gsIGxoO1xuICAgICAgICBpZiAoX2lzQmV0d2Vlbih4LCB0aGlzLmxlZnQsIHRoaXMucmlnaHQpICYmIF9pc0JldHdlZW4oeSwgdGhpcy50b3AsIHRoaXMuYm90dG9tKSkge1xuICAgICAgICAgICAgbGggPSB0aGlzLmxlZ2VuZEhpdEJveGVzO1xuICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgbGgubGVuZ3RoOyArK2kpe1xuICAgICAgICAgICAgICAgIGhpdEJveCA9IGxoW2ldO1xuICAgICAgICAgICAgICAgIGlmIChfaXNCZXR3ZWVuKHgsIGhpdEJveC5sZWZ0LCBoaXRCb3gubGVmdCArIGhpdEJveC53aWR0aCkgJiYgX2lzQmV0d2Vlbih5LCBoaXRCb3gudG9wLCBoaXRCb3gudG9wICsgaGl0Qm94LmhlaWdodCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGVnZW5kSXRlbXNbaV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiBoYW5kbGVFdmVudChlKSB7XG4gICAgICAgIGNvbnN0IG9wdHMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIGlmICghaXNMaXN0ZW5lZChlLnR5cGUsIG9wdHMpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaG92ZXJlZEl0ZW0gPSB0aGlzLl9nZXRMZWdlbmRJdGVtQXQoZS54LCBlLnkpO1xuICAgICAgICBpZiAoZS50eXBlID09PSAnbW91c2Vtb3ZlJyB8fCBlLnR5cGUgPT09ICdtb3VzZW91dCcpIHtcbiAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzID0gdGhpcy5faG92ZXJlZEl0ZW07XG4gICAgICAgICAgICBjb25zdCBzYW1lSXRlbSA9IGl0ZW1zRXF1YWwocHJldmlvdXMsIGhvdmVyZWRJdGVtKTtcbiAgICAgICAgICAgIGlmIChwcmV2aW91cyAmJiAhc2FtZUl0ZW0pIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhvcHRzLm9uTGVhdmUsIFtcbiAgICAgICAgICAgICAgICAgICAgZSxcbiAgICAgICAgICAgICAgICAgICAgcHJldmlvdXMsXG4gICAgICAgICAgICAgICAgICAgIHRoaXNcbiAgICAgICAgICAgICAgICBdLCB0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2hvdmVyZWRJdGVtID0gaG92ZXJlZEl0ZW07XG4gICAgICAgICAgICBpZiAoaG92ZXJlZEl0ZW0gJiYgIXNhbWVJdGVtKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sob3B0cy5vbkhvdmVyLCBbXG4gICAgICAgICAgICAgICAgICAgIGUsXG4gICAgICAgICAgICAgICAgICAgIGhvdmVyZWRJdGVtLFxuICAgICAgICAgICAgICAgICAgICB0aGlzXG4gICAgICAgICAgICAgICAgXSwgdGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoaG92ZXJlZEl0ZW0pIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKG9wdHMub25DbGljaywgW1xuICAgICAgICAgICAgICAgIGUsXG4gICAgICAgICAgICAgICAgaG92ZXJlZEl0ZW0sXG4gICAgICAgICAgICAgICAgdGhpc1xuICAgICAgICAgICAgXSwgdGhpcyk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBjYWxjdWxhdGVJdGVtU2l6ZShib3hXaWR0aCwgbGFiZWxGb250LCBjdHgsIGxlZ2VuZEl0ZW0sIF9pdGVtSGVpZ2h0KSB7XG4gICAgY29uc3QgaXRlbVdpZHRoID0gY2FsY3VsYXRlSXRlbVdpZHRoKGxlZ2VuZEl0ZW0sIGJveFdpZHRoLCBsYWJlbEZvbnQsIGN0eCk7XG4gICAgY29uc3QgaXRlbUhlaWdodCA9IGNhbGN1bGF0ZUl0ZW1IZWlnaHQoX2l0ZW1IZWlnaHQsIGxlZ2VuZEl0ZW0sIGxhYmVsRm9udC5saW5lSGVpZ2h0KTtcbiAgICByZXR1cm4ge1xuICAgICAgICBpdGVtV2lkdGgsXG4gICAgICAgIGl0ZW1IZWlnaHRcbiAgICB9O1xufVxuZnVuY3Rpb24gY2FsY3VsYXRlSXRlbVdpZHRoKGxlZ2VuZEl0ZW0sIGJveFdpZHRoLCBsYWJlbEZvbnQsIGN0eCkge1xuICAgIGxldCBsZWdlbmRJdGVtVGV4dCA9IGxlZ2VuZEl0ZW0udGV4dDtcbiAgICBpZiAobGVnZW5kSXRlbVRleHQgJiYgdHlwZW9mIGxlZ2VuZEl0ZW1UZXh0ICE9PSAnc3RyaW5nJykge1xuICAgICAgICBsZWdlbmRJdGVtVGV4dCA9IGxlZ2VuZEl0ZW1UZXh0LnJlZHVjZSgoYSwgYik9PmEubGVuZ3RoID4gYi5sZW5ndGggPyBhIDogYik7XG4gICAgfVxuICAgIHJldHVybiBib3hXaWR0aCArIGxhYmVsRm9udC5zaXplIC8gMiArIGN0eC5tZWFzdXJlVGV4dChsZWdlbmRJdGVtVGV4dCkud2lkdGg7XG59XG5mdW5jdGlvbiBjYWxjdWxhdGVJdGVtSGVpZ2h0KF9pdGVtSGVpZ2h0LCBsZWdlbmRJdGVtLCBmb250TGluZUhlaWdodCkge1xuICAgIGxldCBpdGVtSGVpZ2h0ID0gX2l0ZW1IZWlnaHQ7XG4gICAgaWYgKHR5cGVvZiBsZWdlbmRJdGVtLnRleHQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGl0ZW1IZWlnaHQgPSBjYWxjdWxhdGVMZWdlbmRJdGVtSGVpZ2h0KGxlZ2VuZEl0ZW0sIGZvbnRMaW5lSGVpZ2h0KTtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW1IZWlnaHQ7XG59XG5mdW5jdGlvbiBjYWxjdWxhdGVMZWdlbmRJdGVtSGVpZ2h0KGxlZ2VuZEl0ZW0sIGZvbnRMaW5lSGVpZ2h0KSB7XG4gICAgY29uc3QgbGFiZWxIZWlnaHQgPSBsZWdlbmRJdGVtLnRleHQgPyBsZWdlbmRJdGVtLnRleHQubGVuZ3RoIDogMDtcbiAgICByZXR1cm4gZm9udExpbmVIZWlnaHQgKiBsYWJlbEhlaWdodDtcbn1cbmZ1bmN0aW9uIGlzTGlzdGVuZWQodHlwZSwgb3B0cykge1xuICAgIGlmICgodHlwZSA9PT0gJ21vdXNlbW92ZScgfHwgdHlwZSA9PT0gJ21vdXNlb3V0JykgJiYgKG9wdHMub25Ib3ZlciB8fCBvcHRzLm9uTGVhdmUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAob3B0cy5vbkNsaWNrICYmICh0eXBlID09PSAnY2xpY2snIHx8IHR5cGUgPT09ICdtb3VzZXVwJykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbnZhciBwbHVnaW5fbGVnZW5kID0ge1xuICAgIGlkOiAnbGVnZW5kJyxcbiBfZWxlbWVudDogTGVnZW5kLFxuICAgIHN0YXJ0IChjaGFydCwgX2FyZ3MsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgbGVnZW5kID0gY2hhcnQubGVnZW5kID0gbmV3IExlZ2VuZCh7XG4gICAgICAgICAgICBjdHg6IGNoYXJ0LmN0eCxcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICBjaGFydFxuICAgICAgICB9KTtcbiAgICAgICAgbGF5b3V0cy5jb25maWd1cmUoY2hhcnQsIGxlZ2VuZCwgb3B0aW9ucyk7XG4gICAgICAgIGxheW91dHMuYWRkQm94KGNoYXJ0LCBsZWdlbmQpO1xuICAgIH0sXG4gICAgc3RvcCAoY2hhcnQpIHtcbiAgICAgICAgbGF5b3V0cy5yZW1vdmVCb3goY2hhcnQsIGNoYXJ0LmxlZ2VuZCk7XG4gICAgICAgIGRlbGV0ZSBjaGFydC5sZWdlbmQ7XG4gICAgfSxcbiAgICBiZWZvcmVVcGRhdGUgKGNoYXJ0LCBfYXJncywgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBsZWdlbmQgPSBjaGFydC5sZWdlbmQ7XG4gICAgICAgIGxheW91dHMuY29uZmlndXJlKGNoYXJ0LCBsZWdlbmQsIG9wdGlvbnMpO1xuICAgICAgICBsZWdlbmQub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgfSxcbiAgICBhZnRlclVwZGF0ZSAoY2hhcnQpIHtcbiAgICAgICAgY29uc3QgbGVnZW5kID0gY2hhcnQubGVnZW5kO1xuICAgICAgICBsZWdlbmQuYnVpbGRMYWJlbHMoKTtcbiAgICAgICAgbGVnZW5kLmFkanVzdEhpdEJveGVzKCk7XG4gICAgfSxcbiAgICBhZnRlckV2ZW50IChjaGFydCwgYXJncykge1xuICAgICAgICBpZiAoIWFyZ3MucmVwbGF5KSB7XG4gICAgICAgICAgICBjaGFydC5sZWdlbmQuaGFuZGxlRXZlbnQoYXJncy5ldmVudCk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIGRlZmF1bHRzOiB7XG4gICAgICAgIGRpc3BsYXk6IHRydWUsXG4gICAgICAgIHBvc2l0aW9uOiAndG9wJyxcbiAgICAgICAgYWxpZ246ICdjZW50ZXInLFxuICAgICAgICBmdWxsU2l6ZTogdHJ1ZSxcbiAgICAgICAgcmV2ZXJzZTogZmFsc2UsXG4gICAgICAgIHdlaWdodDogMTAwMCxcbiAgICAgICAgb25DbGljayAoZSwgbGVnZW5kSXRlbSwgbGVnZW5kKSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IGxlZ2VuZEl0ZW0uZGF0YXNldEluZGV4O1xuICAgICAgICAgICAgY29uc3QgY2kgPSBsZWdlbmQuY2hhcnQ7XG4gICAgICAgICAgICBpZiAoY2kuaXNEYXRhc2V0VmlzaWJsZShpbmRleCkpIHtcbiAgICAgICAgICAgICAgICBjaS5oaWRlKGluZGV4KTtcbiAgICAgICAgICAgICAgICBsZWdlbmRJdGVtLmhpZGRlbiA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNpLnNob3coaW5kZXgpO1xuICAgICAgICAgICAgICAgIGxlZ2VuZEl0ZW0uaGlkZGVuID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG9uSG92ZXI6IG51bGwsXG4gICAgICAgIG9uTGVhdmU6IG51bGwsXG4gICAgICAgIGxhYmVsczoge1xuICAgICAgICAgICAgY29sb3I6IChjdHgpPT5jdHguY2hhcnQub3B0aW9ucy5jb2xvcixcbiAgICAgICAgICAgIGJveFdpZHRoOiA0MCxcbiAgICAgICAgICAgIHBhZGRpbmc6IDEwLFxuICAgICAgICAgICAgZ2VuZXJhdGVMYWJlbHMgKGNoYXJ0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YXNldHMgPSBjaGFydC5kYXRhLmRhdGFzZXRzO1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgbGFiZWxzOiB7IHVzZVBvaW50U3R5bGUgLCBwb2ludFN0eWxlICwgdGV4dEFsaWduICwgY29sb3IgLCB1c2VCb3JkZXJSYWRpdXMgLCBib3JkZXJSYWRpdXMgIH0gIH0gPSBjaGFydC5sZWdlbmQub3B0aW9ucztcbiAgICAgICAgICAgICAgICByZXR1cm4gY2hhcnQuX2dldFNvcnRlZERhdGFzZXRNZXRhcygpLm1hcCgobWV0YSk9PntcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3R5bGUgPSBtZXRhLmNvbnRyb2xsZXIuZ2V0U3R5bGUodXNlUG9pbnRTdHlsZSA/IDAgOiB1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBib3JkZXJXaWR0aCA9IHRvUGFkZGluZyhzdHlsZS5ib3JkZXJXaWR0aCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBkYXRhc2V0c1ttZXRhLmluZGV4XS5sYWJlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxTdHlsZTogc3R5bGUuYmFja2dyb3VuZENvbG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9udENvbG9yOiBjb2xvcixcbiAgICAgICAgICAgICAgICAgICAgICAgIGhpZGRlbjogIW1ldGEudmlzaWJsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVDYXA6IHN0eWxlLmJvcmRlckNhcFN0eWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGluZURhc2g6IHN0eWxlLmJvcmRlckRhc2gsXG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5lRGFzaE9mZnNldDogc3R5bGUuYm9yZGVyRGFzaE9mZnNldCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVKb2luOiBzdHlsZS5ib3JkZXJKb2luU3R5bGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5lV2lkdGg6IChib3JkZXJXaWR0aC53aWR0aCArIGJvcmRlcldpZHRoLmhlaWdodCkgLyA0LFxuICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlU3R5bGU6IHN0eWxlLmJvcmRlckNvbG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRTdHlsZTogcG9pbnRTdHlsZSB8fCBzdHlsZS5wb2ludFN0eWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRpb246IHN0eWxlLnJvdGF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEFsaWduOiB0ZXh0QWxpZ24gfHwgc3R5bGUudGV4dEFsaWduLFxuICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiB1c2VCb3JkZXJSYWRpdXMgJiYgKGJvcmRlclJhZGl1cyB8fCBzdHlsZS5ib3JkZXJSYWRpdXMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YXNldEluZGV4OiBtZXRhLmluZGV4XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfSwgdGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHRpdGxlOiB7XG4gICAgICAgICAgICBjb2xvcjogKGN0eCk9PmN0eC5jaGFydC5vcHRpb25zLmNvbG9yLFxuICAgICAgICAgICAgZGlzcGxheTogZmFsc2UsXG4gICAgICAgICAgICBwb3NpdGlvbjogJ2NlbnRlcicsXG4gICAgICAgICAgICB0ZXh0OiAnJ1xuICAgICAgICB9XG4gICAgfSxcbiAgICBkZXNjcmlwdG9yczoge1xuICAgICAgICBfc2NyaXB0YWJsZTogKG5hbWUpPT4hbmFtZS5zdGFydHNXaXRoKCdvbicpLFxuICAgICAgICBsYWJlbHM6IHtcbiAgICAgICAgICAgIF9zY3JpcHRhYmxlOiAobmFtZSk9PiFbXG4gICAgICAgICAgICAgICAgICAgICdnZW5lcmF0ZUxhYmVscycsXG4gICAgICAgICAgICAgICAgICAgICdmaWx0ZXInLFxuICAgICAgICAgICAgICAgICAgICAnc29ydCdcbiAgICAgICAgICAgICAgICBdLmluY2x1ZGVzKG5hbWUpXG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5jbGFzcyBUaXRsZSBleHRlbmRzIEVsZW1lbnQge1xuIGNvbnN0cnVjdG9yKGNvbmZpZyl7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuY2hhcnQgPSBjb25maWcuY2hhcnQ7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IGNvbmZpZy5vcHRpb25zO1xuICAgICAgICB0aGlzLmN0eCA9IGNvbmZpZy5jdHg7XG4gICAgICAgIHRoaXMuX3BhZGRpbmcgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMudG9wID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmJvdHRvbSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5sZWZ0ID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLnJpZ2h0ID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLndpZHRoID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmhlaWdodCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5wb3NpdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy53ZWlnaHQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuZnVsbFNpemUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHVwZGF0ZShtYXhXaWR0aCwgbWF4SGVpZ2h0KSB7XG4gICAgICAgIGNvbnN0IG9wdHMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIHRoaXMubGVmdCA9IDA7XG4gICAgICAgIHRoaXMudG9wID0gMDtcbiAgICAgICAgaWYgKCFvcHRzLmRpc3BsYXkpIHtcbiAgICAgICAgICAgIHRoaXMud2lkdGggPSB0aGlzLmhlaWdodCA9IHRoaXMucmlnaHQgPSB0aGlzLmJvdHRvbSA9IDA7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy53aWR0aCA9IHRoaXMucmlnaHQgPSBtYXhXaWR0aDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSB0aGlzLmJvdHRvbSA9IG1heEhlaWdodDtcbiAgICAgICAgY29uc3QgbGluZUNvdW50ID0gaXNBcnJheShvcHRzLnRleHQpID8gb3B0cy50ZXh0Lmxlbmd0aCA6IDE7XG4gICAgICAgIHRoaXMuX3BhZGRpbmcgPSB0b1BhZGRpbmcob3B0cy5wYWRkaW5nKTtcbiAgICAgICAgY29uc3QgdGV4dFNpemUgPSBsaW5lQ291bnQgKiB0b0ZvbnQob3B0cy5mb250KS5saW5lSGVpZ2h0ICsgdGhpcy5fcGFkZGluZy5oZWlnaHQ7XG4gICAgICAgIGlmICh0aGlzLmlzSG9yaXpvbnRhbCgpKSB7XG4gICAgICAgICAgICB0aGlzLmhlaWdodCA9IHRleHRTaXplO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy53aWR0aCA9IHRleHRTaXplO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlzSG9yaXpvbnRhbCgpIHtcbiAgICAgICAgY29uc3QgcG9zID0gdGhpcy5vcHRpb25zLnBvc2l0aW9uO1xuICAgICAgICByZXR1cm4gcG9zID09PSAndG9wJyB8fCBwb3MgPT09ICdib3R0b20nO1xuICAgIH1cbiAgICBfZHJhd0FyZ3Mob2Zmc2V0KSB7XG4gICAgICAgIGNvbnN0IHsgdG9wICwgbGVmdCAsIGJvdHRvbSAsIHJpZ2h0ICwgb3B0aW9ucyAgfSA9IHRoaXM7XG4gICAgICAgIGNvbnN0IGFsaWduID0gb3B0aW9ucy5hbGlnbjtcbiAgICAgICAgbGV0IHJvdGF0aW9uID0gMDtcbiAgICAgICAgbGV0IG1heFdpZHRoLCB0aXRsZVgsIHRpdGxlWTtcbiAgICAgICAgaWYgKHRoaXMuaXNIb3Jpem9udGFsKCkpIHtcbiAgICAgICAgICAgIHRpdGxlWCA9IF9hbGlnblN0YXJ0RW5kKGFsaWduLCBsZWZ0LCByaWdodCk7XG4gICAgICAgICAgICB0aXRsZVkgPSB0b3AgKyBvZmZzZXQ7XG4gICAgICAgICAgICBtYXhXaWR0aCA9IHJpZ2h0IC0gbGVmdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLnBvc2l0aW9uID09PSAnbGVmdCcpIHtcbiAgICAgICAgICAgICAgICB0aXRsZVggPSBsZWZ0ICsgb2Zmc2V0O1xuICAgICAgICAgICAgICAgIHRpdGxlWSA9IF9hbGlnblN0YXJ0RW5kKGFsaWduLCBib3R0b20sIHRvcCk7XG4gICAgICAgICAgICAgICAgcm90YXRpb24gPSBQSSAqIC0wLjU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRpdGxlWCA9IHJpZ2h0IC0gb2Zmc2V0O1xuICAgICAgICAgICAgICAgIHRpdGxlWSA9IF9hbGlnblN0YXJ0RW5kKGFsaWduLCB0b3AsIGJvdHRvbSk7XG4gICAgICAgICAgICAgICAgcm90YXRpb24gPSBQSSAqIDAuNTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1heFdpZHRoID0gYm90dG9tIC0gdG9wO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0aXRsZVgsXG4gICAgICAgICAgICB0aXRsZVksXG4gICAgICAgICAgICBtYXhXaWR0aCxcbiAgICAgICAgICAgIHJvdGF0aW9uXG4gICAgICAgIH07XG4gICAgfVxuICAgIGRyYXcoKSB7XG4gICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuY3R4O1xuICAgICAgICBjb25zdCBvcHRzID0gdGhpcy5vcHRpb25zO1xuICAgICAgICBpZiAoIW9wdHMuZGlzcGxheSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZvbnRPcHRzID0gdG9Gb250KG9wdHMuZm9udCk7XG4gICAgICAgIGNvbnN0IGxpbmVIZWlnaHQgPSBmb250T3B0cy5saW5lSGVpZ2h0O1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBsaW5lSGVpZ2h0IC8gMiArIHRoaXMuX3BhZGRpbmcudG9wO1xuICAgICAgICBjb25zdCB7IHRpdGxlWCAsIHRpdGxlWSAsIG1heFdpZHRoICwgcm90YXRpb24gIH0gPSB0aGlzLl9kcmF3QXJncyhvZmZzZXQpO1xuICAgICAgICByZW5kZXJUZXh0KGN0eCwgb3B0cy50ZXh0LCAwLCAwLCBmb250T3B0cywge1xuICAgICAgICAgICAgY29sb3I6IG9wdHMuY29sb3IsXG4gICAgICAgICAgICBtYXhXaWR0aCxcbiAgICAgICAgICAgIHJvdGF0aW9uLFxuICAgICAgICAgICAgdGV4dEFsaWduOiBfdG9MZWZ0UmlnaHRDZW50ZXIob3B0cy5hbGlnbiksXG4gICAgICAgICAgICB0ZXh0QmFzZWxpbmU6ICdtaWRkbGUnLFxuICAgICAgICAgICAgdHJhbnNsYXRpb246IFtcbiAgICAgICAgICAgICAgICB0aXRsZVgsXG4gICAgICAgICAgICAgICAgdGl0bGVZXG4gICAgICAgICAgICBdXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNyZWF0ZVRpdGxlKGNoYXJ0LCB0aXRsZU9wdHMpIHtcbiAgICBjb25zdCB0aXRsZSA9IG5ldyBUaXRsZSh7XG4gICAgICAgIGN0eDogY2hhcnQuY3R4LFxuICAgICAgICBvcHRpb25zOiB0aXRsZU9wdHMsXG4gICAgICAgIGNoYXJ0XG4gICAgfSk7XG4gICAgbGF5b3V0cy5jb25maWd1cmUoY2hhcnQsIHRpdGxlLCB0aXRsZU9wdHMpO1xuICAgIGxheW91dHMuYWRkQm94KGNoYXJ0LCB0aXRsZSk7XG4gICAgY2hhcnQudGl0bGVCbG9jayA9IHRpdGxlO1xufVxudmFyIHBsdWdpbl90aXRsZSA9IHtcbiAgICBpZDogJ3RpdGxlJyxcbiBfZWxlbWVudDogVGl0bGUsXG4gICAgc3RhcnQgKGNoYXJ0LCBfYXJncywgb3B0aW9ucykge1xuICAgICAgICBjcmVhdGVUaXRsZShjaGFydCwgb3B0aW9ucyk7XG4gICAgfSxcbiAgICBzdG9wIChjaGFydCkge1xuICAgICAgICBjb25zdCB0aXRsZUJsb2NrID0gY2hhcnQudGl0bGVCbG9jaztcbiAgICAgICAgbGF5b3V0cy5yZW1vdmVCb3goY2hhcnQsIHRpdGxlQmxvY2spO1xuICAgICAgICBkZWxldGUgY2hhcnQudGl0bGVCbG9jaztcbiAgICB9LFxuICAgIGJlZm9yZVVwZGF0ZSAoY2hhcnQsIF9hcmdzLCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHRpdGxlID0gY2hhcnQudGl0bGVCbG9jaztcbiAgICAgICAgbGF5b3V0cy5jb25maWd1cmUoY2hhcnQsIHRpdGxlLCBvcHRpb25zKTtcbiAgICAgICAgdGl0bGUub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgfSxcbiAgICBkZWZhdWx0czoge1xuICAgICAgICBhbGlnbjogJ2NlbnRlcicsXG4gICAgICAgIGRpc3BsYXk6IGZhbHNlLFxuICAgICAgICBmb250OiB7XG4gICAgICAgICAgICB3ZWlnaHQ6ICdib2xkJ1xuICAgICAgICB9LFxuICAgICAgICBmdWxsU2l6ZTogdHJ1ZSxcbiAgICAgICAgcGFkZGluZzogMTAsXG4gICAgICAgIHBvc2l0aW9uOiAndG9wJyxcbiAgICAgICAgdGV4dDogJycsXG4gICAgICAgIHdlaWdodDogMjAwMFxuICAgIH0sXG4gICAgZGVmYXVsdFJvdXRlczoge1xuICAgICAgICBjb2xvcjogJ2NvbG9yJ1xuICAgIH0sXG4gICAgZGVzY3JpcHRvcnM6IHtcbiAgICAgICAgX3NjcmlwdGFibGU6IHRydWUsXG4gICAgICAgIF9pbmRleGFibGU6IGZhbHNlXG4gICAgfVxufTtcblxuY29uc3QgbWFwID0gbmV3IFdlYWtNYXAoKTtcbnZhciBwbHVnaW5fc3VidGl0bGUgPSB7XG4gICAgaWQ6ICdzdWJ0aXRsZScsXG4gICAgc3RhcnQgKGNoYXJ0LCBfYXJncywgb3B0aW9ucykge1xuICAgICAgICBjb25zdCB0aXRsZSA9IG5ldyBUaXRsZSh7XG4gICAgICAgICAgICBjdHg6IGNoYXJ0LmN0eCxcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICBjaGFydFxuICAgICAgICB9KTtcbiAgICAgICAgbGF5b3V0cy5jb25maWd1cmUoY2hhcnQsIHRpdGxlLCBvcHRpb25zKTtcbiAgICAgICAgbGF5b3V0cy5hZGRCb3goY2hhcnQsIHRpdGxlKTtcbiAgICAgICAgbWFwLnNldChjaGFydCwgdGl0bGUpO1xuICAgIH0sXG4gICAgc3RvcCAoY2hhcnQpIHtcbiAgICAgICAgbGF5b3V0cy5yZW1vdmVCb3goY2hhcnQsIG1hcC5nZXQoY2hhcnQpKTtcbiAgICAgICAgbWFwLmRlbGV0ZShjaGFydCk7XG4gICAgfSxcbiAgICBiZWZvcmVVcGRhdGUgKGNoYXJ0LCBfYXJncywgb3B0aW9ucykge1xuICAgICAgICBjb25zdCB0aXRsZSA9IG1hcC5nZXQoY2hhcnQpO1xuICAgICAgICBsYXlvdXRzLmNvbmZpZ3VyZShjaGFydCwgdGl0bGUsIG9wdGlvbnMpO1xuICAgICAgICB0aXRsZS5vcHRpb25zID0gb3B0aW9ucztcbiAgICB9LFxuICAgIGRlZmF1bHRzOiB7XG4gICAgICAgIGFsaWduOiAnY2VudGVyJyxcbiAgICAgICAgZGlzcGxheTogZmFsc2UsXG4gICAgICAgIGZvbnQ6IHtcbiAgICAgICAgICAgIHdlaWdodDogJ25vcm1hbCdcbiAgICAgICAgfSxcbiAgICAgICAgZnVsbFNpemU6IHRydWUsXG4gICAgICAgIHBhZGRpbmc6IDAsXG4gICAgICAgIHBvc2l0aW9uOiAndG9wJyxcbiAgICAgICAgdGV4dDogJycsXG4gICAgICAgIHdlaWdodDogMTUwMFxuICAgIH0sXG4gICAgZGVmYXVsdFJvdXRlczoge1xuICAgICAgICBjb2xvcjogJ2NvbG9yJ1xuICAgIH0sXG4gICAgZGVzY3JpcHRvcnM6IHtcbiAgICAgICAgX3NjcmlwdGFibGU6IHRydWUsXG4gICAgICAgIF9pbmRleGFibGU6IGZhbHNlXG4gICAgfVxufTtcblxuY29uc3QgcG9zaXRpb25lcnMgPSB7XG4gYXZlcmFnZSAoaXRlbXMpIHtcbiAgICAgICAgaWYgKCFpdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaSwgbGVuO1xuICAgICAgICBsZXQgeCA9IDA7XG4gICAgICAgIGxldCB5ID0gMDtcbiAgICAgICAgbGV0IGNvdW50ID0gMDtcbiAgICAgICAgZm9yKGkgPSAwLCBsZW4gPSBpdGVtcy5sZW5ndGg7IGkgPCBsZW47ICsraSl7XG4gICAgICAgICAgICBjb25zdCBlbCA9IGl0ZW1zW2ldLmVsZW1lbnQ7XG4gICAgICAgICAgICBpZiAoZWwgJiYgZWwuaGFzVmFsdWUoKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBvcyA9IGVsLnRvb2x0aXBQb3NpdGlvbigpO1xuICAgICAgICAgICAgICAgIHggKz0gcG9zLng7XG4gICAgICAgICAgICAgICAgeSArPSBwb3MueTtcbiAgICAgICAgICAgICAgICArK2NvdW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4OiB4IC8gY291bnQsXG4gICAgICAgICAgICB5OiB5IC8gY291bnRcbiAgICAgICAgfTtcbiAgICB9LFxuIG5lYXJlc3QgKGl0ZW1zLCBldmVudFBvc2l0aW9uKSB7XG4gICAgICAgIGlmICghaXRlbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHggPSBldmVudFBvc2l0aW9uLng7XG4gICAgICAgIGxldCB5ID0gZXZlbnRQb3NpdGlvbi55O1xuICAgICAgICBsZXQgbWluRGlzdGFuY2UgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gICAgICAgIGxldCBpLCBsZW4sIG5lYXJlc3RFbGVtZW50O1xuICAgICAgICBmb3IoaSA9IDAsIGxlbiA9IGl0ZW1zLmxlbmd0aDsgaSA8IGxlbjsgKytpKXtcbiAgICAgICAgICAgIGNvbnN0IGVsID0gaXRlbXNbaV0uZWxlbWVudDtcbiAgICAgICAgICAgIGlmIChlbCAmJiBlbC5oYXNWYWx1ZSgpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2VudGVyID0gZWwuZ2V0Q2VudGVyUG9pbnQoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkID0gZGlzdGFuY2VCZXR3ZWVuUG9pbnRzKGV2ZW50UG9zaXRpb24sIGNlbnRlcik7XG4gICAgICAgICAgICAgICAgaWYgKGQgPCBtaW5EaXN0YW5jZSkge1xuICAgICAgICAgICAgICAgICAgICBtaW5EaXN0YW5jZSA9IGQ7XG4gICAgICAgICAgICAgICAgICAgIG5lYXJlc3RFbGVtZW50ID0gZWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChuZWFyZXN0RWxlbWVudCkge1xuICAgICAgICAgICAgY29uc3QgdHAgPSBuZWFyZXN0RWxlbWVudC50b29sdGlwUG9zaXRpb24oKTtcbiAgICAgICAgICAgIHggPSB0cC54O1xuICAgICAgICAgICAgeSA9IHRwLnk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHgsXG4gICAgICAgICAgICB5XG4gICAgICAgIH07XG4gICAgfVxufTtcbmZ1bmN0aW9uIHB1c2hPckNvbmNhdChiYXNlLCB0b1B1c2gpIHtcbiAgICBpZiAodG9QdXNoKSB7XG4gICAgICAgIGlmIChpc0FycmF5KHRvUHVzaCkpIHtcbiAgICAgICAgICAgIEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGJhc2UsIHRvUHVzaCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBiYXNlLnB1c2godG9QdXNoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYmFzZTtcbn1cbiBmdW5jdGlvbiBzcGxpdE5ld2xpbmVzKHN0cikge1xuICAgIGlmICgodHlwZW9mIHN0ciA9PT0gJ3N0cmluZycgfHwgc3RyIGluc3RhbmNlb2YgU3RyaW5nKSAmJiBzdHIuaW5kZXhPZignXFxuJykgPiAtMSkge1xuICAgICAgICByZXR1cm4gc3RyLnNwbGl0KCdcXG4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0cjtcbn1cbiBmdW5jdGlvbiBjcmVhdGVUb29sdGlwSXRlbShjaGFydCwgaXRlbSkge1xuICAgIGNvbnN0IHsgZWxlbWVudCAsIGRhdGFzZXRJbmRleCAsIGluZGV4ICB9ID0gaXRlbTtcbiAgICBjb25zdCBjb250cm9sbGVyID0gY2hhcnQuZ2V0RGF0YXNldE1ldGEoZGF0YXNldEluZGV4KS5jb250cm9sbGVyO1xuICAgIGNvbnN0IHsgbGFiZWwgLCB2YWx1ZSAgfSA9IGNvbnRyb2xsZXIuZ2V0TGFiZWxBbmRWYWx1ZShpbmRleCk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY2hhcnQsXG4gICAgICAgIGxhYmVsLFxuICAgICAgICBwYXJzZWQ6IGNvbnRyb2xsZXIuZ2V0UGFyc2VkKGluZGV4KSxcbiAgICAgICAgcmF3OiBjaGFydC5kYXRhLmRhdGFzZXRzW2RhdGFzZXRJbmRleF0uZGF0YVtpbmRleF0sXG4gICAgICAgIGZvcm1hdHRlZFZhbHVlOiB2YWx1ZSxcbiAgICAgICAgZGF0YXNldDogY29udHJvbGxlci5nZXREYXRhc2V0KCksXG4gICAgICAgIGRhdGFJbmRleDogaW5kZXgsXG4gICAgICAgIGRhdGFzZXRJbmRleCxcbiAgICAgICAgZWxlbWVudFxuICAgIH07XG59XG4gZnVuY3Rpb24gZ2V0VG9vbHRpcFNpemUodG9vbHRpcCwgb3B0aW9ucykge1xuICAgIGNvbnN0IGN0eCA9IHRvb2x0aXAuY2hhcnQuY3R4O1xuICAgIGNvbnN0IHsgYm9keSAsIGZvb3RlciAsIHRpdGxlICB9ID0gdG9vbHRpcDtcbiAgICBjb25zdCB7IGJveFdpZHRoICwgYm94SGVpZ2h0ICB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBib2R5Rm9udCA9IHRvRm9udChvcHRpb25zLmJvZHlGb250KTtcbiAgICBjb25zdCB0aXRsZUZvbnQgPSB0b0ZvbnQob3B0aW9ucy50aXRsZUZvbnQpO1xuICAgIGNvbnN0IGZvb3RlckZvbnQgPSB0b0ZvbnQob3B0aW9ucy5mb290ZXJGb250KTtcbiAgICBjb25zdCB0aXRsZUxpbmVDb3VudCA9IHRpdGxlLmxlbmd0aDtcbiAgICBjb25zdCBmb290ZXJMaW5lQ291bnQgPSBmb290ZXIubGVuZ3RoO1xuICAgIGNvbnN0IGJvZHlMaW5lSXRlbUNvdW50ID0gYm9keS5sZW5ndGg7XG4gICAgY29uc3QgcGFkZGluZyA9IHRvUGFkZGluZyhvcHRpb25zLnBhZGRpbmcpO1xuICAgIGxldCBoZWlnaHQgPSBwYWRkaW5nLmhlaWdodDtcbiAgICBsZXQgd2lkdGggPSAwO1xuICAgIGxldCBjb21iaW5lZEJvZHlMZW5ndGggPSBib2R5LnJlZHVjZSgoY291bnQsIGJvZHlJdGVtKT0+Y291bnQgKyBib2R5SXRlbS5iZWZvcmUubGVuZ3RoICsgYm9keUl0ZW0ubGluZXMubGVuZ3RoICsgYm9keUl0ZW0uYWZ0ZXIubGVuZ3RoLCAwKTtcbiAgICBjb21iaW5lZEJvZHlMZW5ndGggKz0gdG9vbHRpcC5iZWZvcmVCb2R5Lmxlbmd0aCArIHRvb2x0aXAuYWZ0ZXJCb2R5Lmxlbmd0aDtcbiAgICBpZiAodGl0bGVMaW5lQ291bnQpIHtcbiAgICAgICAgaGVpZ2h0ICs9IHRpdGxlTGluZUNvdW50ICogdGl0bGVGb250LmxpbmVIZWlnaHQgKyAodGl0bGVMaW5lQ291bnQgLSAxKSAqIG9wdGlvbnMudGl0bGVTcGFjaW5nICsgb3B0aW9ucy50aXRsZU1hcmdpbkJvdHRvbTtcbiAgICB9XG4gICAgaWYgKGNvbWJpbmVkQm9keUxlbmd0aCkge1xuICAgICAgICBjb25zdCBib2R5TGluZUhlaWdodCA9IG9wdGlvbnMuZGlzcGxheUNvbG9ycyA/IE1hdGgubWF4KGJveEhlaWdodCwgYm9keUZvbnQubGluZUhlaWdodCkgOiBib2R5Rm9udC5saW5lSGVpZ2h0O1xuICAgICAgICBoZWlnaHQgKz0gYm9keUxpbmVJdGVtQ291bnQgKiBib2R5TGluZUhlaWdodCArIChjb21iaW5lZEJvZHlMZW5ndGggLSBib2R5TGluZUl0ZW1Db3VudCkgKiBib2R5Rm9udC5saW5lSGVpZ2h0ICsgKGNvbWJpbmVkQm9keUxlbmd0aCAtIDEpICogb3B0aW9ucy5ib2R5U3BhY2luZztcbiAgICB9XG4gICAgaWYgKGZvb3RlckxpbmVDb3VudCkge1xuICAgICAgICBoZWlnaHQgKz0gb3B0aW9ucy5mb290ZXJNYXJnaW5Ub3AgKyBmb290ZXJMaW5lQ291bnQgKiBmb290ZXJGb250LmxpbmVIZWlnaHQgKyAoZm9vdGVyTGluZUNvdW50IC0gMSkgKiBvcHRpb25zLmZvb3RlclNwYWNpbmc7XG4gICAgfVxuICAgIGxldCB3aWR0aFBhZGRpbmcgPSAwO1xuICAgIGNvbnN0IG1heExpbmVXaWR0aCA9IGZ1bmN0aW9uKGxpbmUpIHtcbiAgICAgICAgd2lkdGggPSBNYXRoLm1heCh3aWR0aCwgY3R4Lm1lYXN1cmVUZXh0KGxpbmUpLndpZHRoICsgd2lkdGhQYWRkaW5nKTtcbiAgICB9O1xuICAgIGN0eC5zYXZlKCk7XG4gICAgY3R4LmZvbnQgPSB0aXRsZUZvbnQuc3RyaW5nO1xuICAgIGVhY2godG9vbHRpcC50aXRsZSwgbWF4TGluZVdpZHRoKTtcbiAgICBjdHguZm9udCA9IGJvZHlGb250LnN0cmluZztcbiAgICBlYWNoKHRvb2x0aXAuYmVmb3JlQm9keS5jb25jYXQodG9vbHRpcC5hZnRlckJvZHkpLCBtYXhMaW5lV2lkdGgpO1xuICAgIHdpZHRoUGFkZGluZyA9IG9wdGlvbnMuZGlzcGxheUNvbG9ycyA/IGJveFdpZHRoICsgMiArIG9wdGlvbnMuYm94UGFkZGluZyA6IDA7XG4gICAgZWFjaChib2R5LCAoYm9keUl0ZW0pPT57XG4gICAgICAgIGVhY2goYm9keUl0ZW0uYmVmb3JlLCBtYXhMaW5lV2lkdGgpO1xuICAgICAgICBlYWNoKGJvZHlJdGVtLmxpbmVzLCBtYXhMaW5lV2lkdGgpO1xuICAgICAgICBlYWNoKGJvZHlJdGVtLmFmdGVyLCBtYXhMaW5lV2lkdGgpO1xuICAgIH0pO1xuICAgIHdpZHRoUGFkZGluZyA9IDA7XG4gICAgY3R4LmZvbnQgPSBmb290ZXJGb250LnN0cmluZztcbiAgICBlYWNoKHRvb2x0aXAuZm9vdGVyLCBtYXhMaW5lV2lkdGgpO1xuICAgIGN0eC5yZXN0b3JlKCk7XG4gICAgd2lkdGggKz0gcGFkZGluZy53aWR0aDtcbiAgICByZXR1cm4ge1xuICAgICAgICB3aWR0aCxcbiAgICAgICAgaGVpZ2h0XG4gICAgfTtcbn1cbmZ1bmN0aW9uIGRldGVybWluZVlBbGlnbihjaGFydCwgc2l6ZSkge1xuICAgIGNvbnN0IHsgeSAsIGhlaWdodCAgfSA9IHNpemU7XG4gICAgaWYgKHkgPCBoZWlnaHQgLyAyKSB7XG4gICAgICAgIHJldHVybiAndG9wJztcbiAgICB9IGVsc2UgaWYgKHkgPiBjaGFydC5oZWlnaHQgLSBoZWlnaHQgLyAyKSB7XG4gICAgICAgIHJldHVybiAnYm90dG9tJztcbiAgICB9XG4gICAgcmV0dXJuICdjZW50ZXInO1xufVxuZnVuY3Rpb24gZG9lc05vdEZpdFdpdGhBbGlnbih4QWxpZ24sIGNoYXJ0LCBvcHRpb25zLCBzaXplKSB7XG4gICAgY29uc3QgeyB4ICwgd2lkdGggIH0gPSBzaXplO1xuICAgIGNvbnN0IGNhcmV0ID0gb3B0aW9ucy5jYXJldFNpemUgKyBvcHRpb25zLmNhcmV0UGFkZGluZztcbiAgICBpZiAoeEFsaWduID09PSAnbGVmdCcgJiYgeCArIHdpZHRoICsgY2FyZXQgPiBjaGFydC53aWR0aCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHhBbGlnbiA9PT0gJ3JpZ2h0JyAmJiB4IC0gd2lkdGggLSBjYXJldCA8IDApIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxufVxuZnVuY3Rpb24gZGV0ZXJtaW5lWEFsaWduKGNoYXJ0LCBvcHRpb25zLCBzaXplLCB5QWxpZ24pIHtcbiAgICBjb25zdCB7IHggLCB3aWR0aCAgfSA9IHNpemU7XG4gICAgY29uc3QgeyB3aWR0aDogY2hhcnRXaWR0aCAsIGNoYXJ0QXJlYTogeyBsZWZ0ICwgcmlnaHQgIH0gIH0gPSBjaGFydDtcbiAgICBsZXQgeEFsaWduID0gJ2NlbnRlcic7XG4gICAgaWYgKHlBbGlnbiA9PT0gJ2NlbnRlcicpIHtcbiAgICAgICAgeEFsaWduID0geCA8PSAobGVmdCArIHJpZ2h0KSAvIDIgPyAnbGVmdCcgOiAncmlnaHQnO1xuICAgIH0gZWxzZSBpZiAoeCA8PSB3aWR0aCAvIDIpIHtcbiAgICAgICAgeEFsaWduID0gJ2xlZnQnO1xuICAgIH0gZWxzZSBpZiAoeCA+PSBjaGFydFdpZHRoIC0gd2lkdGggLyAyKSB7XG4gICAgICAgIHhBbGlnbiA9ICdyaWdodCc7XG4gICAgfVxuICAgIGlmIChkb2VzTm90Rml0V2l0aEFsaWduKHhBbGlnbiwgY2hhcnQsIG9wdGlvbnMsIHNpemUpKSB7XG4gICAgICAgIHhBbGlnbiA9ICdjZW50ZXInO1xuICAgIH1cbiAgICByZXR1cm4geEFsaWduO1xufVxuIGZ1bmN0aW9uIGRldGVybWluZUFsaWdubWVudChjaGFydCwgb3B0aW9ucywgc2l6ZSkge1xuICAgIGNvbnN0IHlBbGlnbiA9IHNpemUueUFsaWduIHx8IG9wdGlvbnMueUFsaWduIHx8IGRldGVybWluZVlBbGlnbihjaGFydCwgc2l6ZSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgeEFsaWduOiBzaXplLnhBbGlnbiB8fCBvcHRpb25zLnhBbGlnbiB8fCBkZXRlcm1pbmVYQWxpZ24oY2hhcnQsIG9wdGlvbnMsIHNpemUsIHlBbGlnbiksXG4gICAgICAgIHlBbGlnblxuICAgIH07XG59XG5mdW5jdGlvbiBhbGlnblgoc2l6ZSwgeEFsaWduKSB7XG4gICAgbGV0IHsgeCAsIHdpZHRoICB9ID0gc2l6ZTtcbiAgICBpZiAoeEFsaWduID09PSAncmlnaHQnKSB7XG4gICAgICAgIHggLT0gd2lkdGg7XG4gICAgfSBlbHNlIGlmICh4QWxpZ24gPT09ICdjZW50ZXInKSB7XG4gICAgICAgIHggLT0gd2lkdGggLyAyO1xuICAgIH1cbiAgICByZXR1cm4geDtcbn1cbmZ1bmN0aW9uIGFsaWduWShzaXplLCB5QWxpZ24sIHBhZGRpbmdBbmRTaXplKSB7XG4gICAgbGV0IHsgeSAsIGhlaWdodCAgfSA9IHNpemU7XG4gICAgaWYgKHlBbGlnbiA9PT0gJ3RvcCcpIHtcbiAgICAgICAgeSArPSBwYWRkaW5nQW5kU2l6ZTtcbiAgICB9IGVsc2UgaWYgKHlBbGlnbiA9PT0gJ2JvdHRvbScpIHtcbiAgICAgICAgeSAtPSBoZWlnaHQgKyBwYWRkaW5nQW5kU2l6ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB5IC09IGhlaWdodCAvIDI7XG4gICAgfVxuICAgIHJldHVybiB5O1xufVxuIGZ1bmN0aW9uIGdldEJhY2tncm91bmRQb2ludChvcHRpb25zLCBzaXplLCBhbGlnbm1lbnQsIGNoYXJ0KSB7XG4gICAgY29uc3QgeyBjYXJldFNpemUgLCBjYXJldFBhZGRpbmcgLCBjb3JuZXJSYWRpdXMgIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IHsgeEFsaWduICwgeUFsaWduICB9ID0gYWxpZ25tZW50O1xuICAgIGNvbnN0IHBhZGRpbmdBbmRTaXplID0gY2FyZXRTaXplICsgY2FyZXRQYWRkaW5nO1xuICAgIGNvbnN0IHsgdG9wTGVmdCAsIHRvcFJpZ2h0ICwgYm90dG9tTGVmdCAsIGJvdHRvbVJpZ2h0ICB9ID0gdG9UUkJMQ29ybmVycyhjb3JuZXJSYWRpdXMpO1xuICAgIGxldCB4ID0gYWxpZ25YKHNpemUsIHhBbGlnbik7XG4gICAgY29uc3QgeSA9IGFsaWduWShzaXplLCB5QWxpZ24sIHBhZGRpbmdBbmRTaXplKTtcbiAgICBpZiAoeUFsaWduID09PSAnY2VudGVyJykge1xuICAgICAgICBpZiAoeEFsaWduID09PSAnbGVmdCcpIHtcbiAgICAgICAgICAgIHggKz0gcGFkZGluZ0FuZFNpemU7XG4gICAgICAgIH0gZWxzZSBpZiAoeEFsaWduID09PSAncmlnaHQnKSB7XG4gICAgICAgICAgICB4IC09IHBhZGRpbmdBbmRTaXplO1xuICAgICAgICB9XG4gICAgfSBlbHNlIGlmICh4QWxpZ24gPT09ICdsZWZ0Jykge1xuICAgICAgICB4IC09IE1hdGgubWF4KHRvcExlZnQsIGJvdHRvbUxlZnQpICsgY2FyZXRTaXplO1xuICAgIH0gZWxzZSBpZiAoeEFsaWduID09PSAncmlnaHQnKSB7XG4gICAgICAgIHggKz0gTWF0aC5tYXgodG9wUmlnaHQsIGJvdHRvbVJpZ2h0KSArIGNhcmV0U2l6ZTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgeDogX2xpbWl0VmFsdWUoeCwgMCwgY2hhcnQud2lkdGggLSBzaXplLndpZHRoKSxcbiAgICAgICAgeTogX2xpbWl0VmFsdWUoeSwgMCwgY2hhcnQuaGVpZ2h0IC0gc2l6ZS5oZWlnaHQpXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGdldEFsaWduZWRYKHRvb2x0aXAsIGFsaWduLCBvcHRpb25zKSB7XG4gICAgY29uc3QgcGFkZGluZyA9IHRvUGFkZGluZyhvcHRpb25zLnBhZGRpbmcpO1xuICAgIHJldHVybiBhbGlnbiA9PT0gJ2NlbnRlcicgPyB0b29sdGlwLnggKyB0b29sdGlwLndpZHRoIC8gMiA6IGFsaWduID09PSAncmlnaHQnID8gdG9vbHRpcC54ICsgdG9vbHRpcC53aWR0aCAtIHBhZGRpbmcucmlnaHQgOiB0b29sdGlwLnggKyBwYWRkaW5nLmxlZnQ7XG59XG4gZnVuY3Rpb24gZ2V0QmVmb3JlQWZ0ZXJCb2R5TGluZXMoY2FsbGJhY2spIHtcbiAgICByZXR1cm4gcHVzaE9yQ29uY2F0KFtdLCBzcGxpdE5ld2xpbmVzKGNhbGxiYWNrKSk7XG59XG5mdW5jdGlvbiBjcmVhdGVUb29sdGlwQ29udGV4dChwYXJlbnQsIHRvb2x0aXAsIHRvb2x0aXBJdGVtcykge1xuICAgIHJldHVybiBjcmVhdGVDb250ZXh0KHBhcmVudCwge1xuICAgICAgICB0b29sdGlwLFxuICAgICAgICB0b29sdGlwSXRlbXMsXG4gICAgICAgIHR5cGU6ICd0b29sdGlwJ1xuICAgIH0pO1xufVxuZnVuY3Rpb24gb3ZlcnJpZGVDYWxsYmFja3MoY2FsbGJhY2tzLCBjb250ZXh0KSB7XG4gICAgY29uc3Qgb3ZlcnJpZGUgPSBjb250ZXh0ICYmIGNvbnRleHQuZGF0YXNldCAmJiBjb250ZXh0LmRhdGFzZXQudG9vbHRpcCAmJiBjb250ZXh0LmRhdGFzZXQudG9vbHRpcC5jYWxsYmFja3M7XG4gICAgcmV0dXJuIG92ZXJyaWRlID8gY2FsbGJhY2tzLm92ZXJyaWRlKG92ZXJyaWRlKSA6IGNhbGxiYWNrcztcbn1cbmNvbnN0IGRlZmF1bHRDYWxsYmFja3MgPSB7XG4gICAgYmVmb3JlVGl0bGU6IG5vb3AsXG4gICAgdGl0bGUgKHRvb2x0aXBJdGVtcykge1xuICAgICAgICBpZiAodG9vbHRpcEl0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSB0b29sdGlwSXRlbXNbMF07XG4gICAgICAgICAgICBjb25zdCBsYWJlbHMgPSBpdGVtLmNoYXJ0LmRhdGEubGFiZWxzO1xuICAgICAgICAgICAgY29uc3QgbGFiZWxDb3VudCA9IGxhYmVscyA/IGxhYmVscy5sZW5ndGggOiAwO1xuICAgICAgICAgICAgaWYgKHRoaXMgJiYgdGhpcy5vcHRpb25zICYmIHRoaXMub3B0aW9ucy5tb2RlID09PSAnZGF0YXNldCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS5kYXRhc2V0LmxhYmVsIHx8ICcnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0ubGFiZWw7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxhYmVsQ291bnQgPiAwICYmIGl0ZW0uZGF0YUluZGV4IDwgbGFiZWxDb3VudCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBsYWJlbHNbaXRlbS5kYXRhSW5kZXhdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9LFxuICAgIGFmdGVyVGl0bGU6IG5vb3AsXG4gICAgYmVmb3JlQm9keTogbm9vcCxcbiAgICBiZWZvcmVMYWJlbDogbm9vcCxcbiAgICBsYWJlbCAodG9vbHRpcEl0ZW0pIHtcbiAgICAgICAgaWYgKHRoaXMgJiYgdGhpcy5vcHRpb25zICYmIHRoaXMub3B0aW9ucy5tb2RlID09PSAnZGF0YXNldCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0b29sdGlwSXRlbS5sYWJlbCArICc6ICcgKyB0b29sdGlwSXRlbS5mb3JtYXR0ZWRWYWx1ZSB8fCB0b29sdGlwSXRlbS5mb3JtYXR0ZWRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbGFiZWwgPSB0b29sdGlwSXRlbS5kYXRhc2V0LmxhYmVsIHx8ICcnO1xuICAgICAgICBpZiAobGFiZWwpIHtcbiAgICAgICAgICAgIGxhYmVsICs9ICc6ICc7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsdWUgPSB0b29sdGlwSXRlbS5mb3JtYXR0ZWRWYWx1ZTtcbiAgICAgICAgaWYgKCFpc051bGxPclVuZGVmKHZhbHVlKSkge1xuICAgICAgICAgICAgbGFiZWwgKz0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxhYmVsO1xuICAgIH0sXG4gICAgbGFiZWxDb2xvciAodG9vbHRpcEl0ZW0pIHtcbiAgICAgICAgY29uc3QgbWV0YSA9IHRvb2x0aXBJdGVtLmNoYXJ0LmdldERhdGFzZXRNZXRhKHRvb2x0aXBJdGVtLmRhdGFzZXRJbmRleCk7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBtZXRhLmNvbnRyb2xsZXIuZ2V0U3R5bGUodG9vbHRpcEl0ZW0uZGF0YUluZGV4KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGJvcmRlckNvbG9yOiBvcHRpb25zLmJvcmRlckNvbG9yLFxuICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBvcHRpb25zLmJhY2tncm91bmRDb2xvcixcbiAgICAgICAgICAgIGJvcmRlcldpZHRoOiBvcHRpb25zLmJvcmRlcldpZHRoLFxuICAgICAgICAgICAgYm9yZGVyRGFzaDogb3B0aW9ucy5ib3JkZXJEYXNoLFxuICAgICAgICAgICAgYm9yZGVyRGFzaE9mZnNldDogb3B0aW9ucy5ib3JkZXJEYXNoT2Zmc2V0LFxuICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiAwXG4gICAgICAgIH07XG4gICAgfSxcbiAgICBsYWJlbFRleHRDb2xvciAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMuYm9keUNvbG9yO1xuICAgIH0sXG4gICAgbGFiZWxQb2ludFN0eWxlICh0b29sdGlwSXRlbSkge1xuICAgICAgICBjb25zdCBtZXRhID0gdG9vbHRpcEl0ZW0uY2hhcnQuZ2V0RGF0YXNldE1ldGEodG9vbHRpcEl0ZW0uZGF0YXNldEluZGV4KTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IG1ldGEuY29udHJvbGxlci5nZXRTdHlsZSh0b29sdGlwSXRlbS5kYXRhSW5kZXgpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcG9pbnRTdHlsZTogb3B0aW9ucy5wb2ludFN0eWxlLFxuICAgICAgICAgICAgcm90YXRpb246IG9wdGlvbnMucm90YXRpb25cbiAgICAgICAgfTtcbiAgICB9LFxuICAgIGFmdGVyTGFiZWw6IG5vb3AsXG4gICAgYWZ0ZXJCb2R5OiBub29wLFxuICAgIGJlZm9yZUZvb3Rlcjogbm9vcCxcbiAgICBmb290ZXI6IG5vb3AsXG4gICAgYWZ0ZXJGb290ZXI6IG5vb3Bcbn07XG4gZnVuY3Rpb24gaW52b2tlQ2FsbGJhY2tXaXRoRmFsbGJhY2soY2FsbGJhY2tzLCBuYW1lLCBjdHgsIGFyZykge1xuICAgIGNvbnN0IHJlc3VsdCA9IGNhbGxiYWNrc1tuYW1lXS5jYWxsKGN0eCwgYXJnKTtcbiAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIGRlZmF1bHRDYWxsYmFja3NbbmFtZV0uY2FsbChjdHgsIGFyZyk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5jbGFzcyBUb29sdGlwIGV4dGVuZHMgRWxlbWVudCB7XG4gc3RhdGljIHBvc2l0aW9uZXJzID0gcG9zaXRpb25lcnM7XG4gICAgY29uc3RydWN0b3IoY29uZmlnKXtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5vcGFjaXR5ID0gMDtcbiAgICAgICAgdGhpcy5fYWN0aXZlID0gW107XG4gICAgICAgIHRoaXMuX2V2ZW50UG9zaXRpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX3NpemUgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX2NhY2hlZEFuaW1hdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX3Rvb2x0aXBJdGVtcyA9IFtdO1xuICAgICAgICB0aGlzLiRhbmltYXRpb25zID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLiRjb250ZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmNoYXJ0ID0gY29uZmlnLmNoYXJ0O1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBjb25maWcub3B0aW9ucztcbiAgICAgICAgdGhpcy5kYXRhUG9pbnRzID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLnRpdGxlID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmJlZm9yZUJvZHkgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuYm9keSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5hZnRlckJvZHkgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuZm9vdGVyID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLnhBbGlnbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy55QWxpZ24gPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMueCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy55ID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmhlaWdodCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy53aWR0aCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5jYXJldFggPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuY2FyZXRZID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmxhYmVsQ29sb3JzID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmxhYmVsUG9pbnRTdHlsZXMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMubGFiZWxUZXh0Q29sb3JzID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpbml0aWFsaXplKG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgdGhpcy5fY2FjaGVkQW5pbWF0aW9ucyA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy4kY29udGV4dCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gX3Jlc29sdmVBbmltYXRpb25zKCkge1xuICAgICAgICBjb25zdCBjYWNoZWQgPSB0aGlzLl9jYWNoZWRBbmltYXRpb25zO1xuICAgICAgICBpZiAoY2FjaGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNoYXJ0ID0gdGhpcy5jaGFydDtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9ucy5zZXRDb250ZXh0KHRoaXMuZ2V0Q29udGV4dCgpKTtcbiAgICAgICAgY29uc3Qgb3B0cyA9IG9wdGlvbnMuZW5hYmxlZCAmJiBjaGFydC5vcHRpb25zLmFuaW1hdGlvbiAmJiBvcHRpb25zLmFuaW1hdGlvbnM7XG4gICAgICAgIGNvbnN0IGFuaW1hdGlvbnMgPSBuZXcgQW5pbWF0aW9ucyh0aGlzLmNoYXJ0LCBvcHRzKTtcbiAgICAgICAgaWYgKG9wdHMuX2NhY2hlYWJsZSkge1xuICAgICAgICAgICAgdGhpcy5fY2FjaGVkQW5pbWF0aW9ucyA9IE9iamVjdC5mcmVlemUoYW5pbWF0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFuaW1hdGlvbnM7XG4gICAgfVxuIGdldENvbnRleHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiRjb250ZXh0IHx8ICh0aGlzLiRjb250ZXh0ID0gY3JlYXRlVG9vbHRpcENvbnRleHQodGhpcy5jaGFydC5nZXRDb250ZXh0KCksIHRoaXMsIHRoaXMuX3Rvb2x0aXBJdGVtcykpO1xuICAgIH1cbiAgICBnZXRUaXRsZShjb250ZXh0LCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHsgY2FsbGJhY2tzICB9ID0gb3B0aW9ucztcbiAgICAgICAgY29uc3QgYmVmb3JlVGl0bGUgPSBpbnZva2VDYWxsYmFja1dpdGhGYWxsYmFjayhjYWxsYmFja3MsICdiZWZvcmVUaXRsZScsIHRoaXMsIGNvbnRleHQpO1xuICAgICAgICBjb25zdCB0aXRsZSA9IGludm9rZUNhbGxiYWNrV2l0aEZhbGxiYWNrKGNhbGxiYWNrcywgJ3RpdGxlJywgdGhpcywgY29udGV4dCk7XG4gICAgICAgIGNvbnN0IGFmdGVyVGl0bGUgPSBpbnZva2VDYWxsYmFja1dpdGhGYWxsYmFjayhjYWxsYmFja3MsICdhZnRlclRpdGxlJywgdGhpcywgY29udGV4dCk7XG4gICAgICAgIGxldCBsaW5lcyA9IFtdO1xuICAgICAgICBsaW5lcyA9IHB1c2hPckNvbmNhdChsaW5lcywgc3BsaXROZXdsaW5lcyhiZWZvcmVUaXRsZSkpO1xuICAgICAgICBsaW5lcyA9IHB1c2hPckNvbmNhdChsaW5lcywgc3BsaXROZXdsaW5lcyh0aXRsZSkpO1xuICAgICAgICBsaW5lcyA9IHB1c2hPckNvbmNhdChsaW5lcywgc3BsaXROZXdsaW5lcyhhZnRlclRpdGxlKSk7XG4gICAgICAgIHJldHVybiBsaW5lcztcbiAgICB9XG4gICAgZ2V0QmVmb3JlQm9keSh0b29sdGlwSXRlbXMsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIGdldEJlZm9yZUFmdGVyQm9keUxpbmVzKGludm9rZUNhbGxiYWNrV2l0aEZhbGxiYWNrKG9wdGlvbnMuY2FsbGJhY2tzLCAnYmVmb3JlQm9keScsIHRoaXMsIHRvb2x0aXBJdGVtcykpO1xuICAgIH1cbiAgICBnZXRCb2R5KHRvb2x0aXBJdGVtcywgb3B0aW9ucykge1xuICAgICAgICBjb25zdCB7IGNhbGxiYWNrcyAgfSA9IG9wdGlvbnM7XG4gICAgICAgIGNvbnN0IGJvZHlJdGVtcyA9IFtdO1xuICAgICAgICBlYWNoKHRvb2x0aXBJdGVtcywgKGNvbnRleHQpPT57XG4gICAgICAgICAgICBjb25zdCBib2R5SXRlbSA9IHtcbiAgICAgICAgICAgICAgICBiZWZvcmU6IFtdLFxuICAgICAgICAgICAgICAgIGxpbmVzOiBbXSxcbiAgICAgICAgICAgICAgICBhZnRlcjogW11cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCBzY29wZWQgPSBvdmVycmlkZUNhbGxiYWNrcyhjYWxsYmFja3MsIGNvbnRleHQpO1xuICAgICAgICAgICAgcHVzaE9yQ29uY2F0KGJvZHlJdGVtLmJlZm9yZSwgc3BsaXROZXdsaW5lcyhpbnZva2VDYWxsYmFja1dpdGhGYWxsYmFjayhzY29wZWQsICdiZWZvcmVMYWJlbCcsIHRoaXMsIGNvbnRleHQpKSk7XG4gICAgICAgICAgICBwdXNoT3JDb25jYXQoYm9keUl0ZW0ubGluZXMsIGludm9rZUNhbGxiYWNrV2l0aEZhbGxiYWNrKHNjb3BlZCwgJ2xhYmVsJywgdGhpcywgY29udGV4dCkpO1xuICAgICAgICAgICAgcHVzaE9yQ29uY2F0KGJvZHlJdGVtLmFmdGVyLCBzcGxpdE5ld2xpbmVzKGludm9rZUNhbGxiYWNrV2l0aEZhbGxiYWNrKHNjb3BlZCwgJ2FmdGVyTGFiZWwnLCB0aGlzLCBjb250ZXh0KSkpO1xuICAgICAgICAgICAgYm9keUl0ZW1zLnB1c2goYm9keUl0ZW0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGJvZHlJdGVtcztcbiAgICB9XG4gICAgZ2V0QWZ0ZXJCb2R5KHRvb2x0aXBJdGVtcywgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gZ2V0QmVmb3JlQWZ0ZXJCb2R5TGluZXMoaW52b2tlQ2FsbGJhY2tXaXRoRmFsbGJhY2sob3B0aW9ucy5jYWxsYmFja3MsICdhZnRlckJvZHknLCB0aGlzLCB0b29sdGlwSXRlbXMpKTtcbiAgICB9XG4gICAgZ2V0Rm9vdGVyKHRvb2x0aXBJdGVtcywgb3B0aW9ucykge1xuICAgICAgICBjb25zdCB7IGNhbGxiYWNrcyAgfSA9IG9wdGlvbnM7XG4gICAgICAgIGNvbnN0IGJlZm9yZUZvb3RlciA9IGludm9rZUNhbGxiYWNrV2l0aEZhbGxiYWNrKGNhbGxiYWNrcywgJ2JlZm9yZUZvb3RlcicsIHRoaXMsIHRvb2x0aXBJdGVtcyk7XG4gICAgICAgIGNvbnN0IGZvb3RlciA9IGludm9rZUNhbGxiYWNrV2l0aEZhbGxiYWNrKGNhbGxiYWNrcywgJ2Zvb3RlcicsIHRoaXMsIHRvb2x0aXBJdGVtcyk7XG4gICAgICAgIGNvbnN0IGFmdGVyRm9vdGVyID0gaW52b2tlQ2FsbGJhY2tXaXRoRmFsbGJhY2soY2FsbGJhY2tzLCAnYWZ0ZXJGb290ZXInLCB0aGlzLCB0b29sdGlwSXRlbXMpO1xuICAgICAgICBsZXQgbGluZXMgPSBbXTtcbiAgICAgICAgbGluZXMgPSBwdXNoT3JDb25jYXQobGluZXMsIHNwbGl0TmV3bGluZXMoYmVmb3JlRm9vdGVyKSk7XG4gICAgICAgIGxpbmVzID0gcHVzaE9yQ29uY2F0KGxpbmVzLCBzcGxpdE5ld2xpbmVzKGZvb3RlcikpO1xuICAgICAgICBsaW5lcyA9IHB1c2hPckNvbmNhdChsaW5lcywgc3BsaXROZXdsaW5lcyhhZnRlckZvb3RlcikpO1xuICAgICAgICByZXR1cm4gbGluZXM7XG4gICAgfVxuIF9jcmVhdGVJdGVtcyhvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGFjdGl2ZSA9IHRoaXMuX2FjdGl2ZTtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuY2hhcnQuZGF0YTtcbiAgICAgICAgY29uc3QgbGFiZWxDb2xvcnMgPSBbXTtcbiAgICAgICAgY29uc3QgbGFiZWxQb2ludFN0eWxlcyA9IFtdO1xuICAgICAgICBjb25zdCBsYWJlbFRleHRDb2xvcnMgPSBbXTtcbiAgICAgICAgbGV0IHRvb2x0aXBJdGVtcyA9IFtdO1xuICAgICAgICBsZXQgaSwgbGVuO1xuICAgICAgICBmb3IoaSA9IDAsIGxlbiA9IGFjdGl2ZS5sZW5ndGg7IGkgPCBsZW47ICsraSl7XG4gICAgICAgICAgICB0b29sdGlwSXRlbXMucHVzaChjcmVhdGVUb29sdGlwSXRlbSh0aGlzLmNoYXJ0LCBhY3RpdmVbaV0pKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5maWx0ZXIpIHtcbiAgICAgICAgICAgIHRvb2x0aXBJdGVtcyA9IHRvb2x0aXBJdGVtcy5maWx0ZXIoKGVsZW1lbnQsIGluZGV4LCBhcnJheSk9Pm9wdGlvbnMuZmlsdGVyKGVsZW1lbnQsIGluZGV4LCBhcnJheSwgZGF0YSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLml0ZW1Tb3J0KSB7XG4gICAgICAgICAgICB0b29sdGlwSXRlbXMgPSB0b29sdGlwSXRlbXMuc29ydCgoYSwgYik9Pm9wdGlvbnMuaXRlbVNvcnQoYSwgYiwgZGF0YSkpO1xuICAgICAgICB9XG4gICAgICAgIGVhY2godG9vbHRpcEl0ZW1zLCAoY29udGV4dCk9PntcbiAgICAgICAgICAgIGNvbnN0IHNjb3BlZCA9IG92ZXJyaWRlQ2FsbGJhY2tzKG9wdGlvbnMuY2FsbGJhY2tzLCBjb250ZXh0KTtcbiAgICAgICAgICAgIGxhYmVsQ29sb3JzLnB1c2goaW52b2tlQ2FsbGJhY2tXaXRoRmFsbGJhY2soc2NvcGVkLCAnbGFiZWxDb2xvcicsIHRoaXMsIGNvbnRleHQpKTtcbiAgICAgICAgICAgIGxhYmVsUG9pbnRTdHlsZXMucHVzaChpbnZva2VDYWxsYmFja1dpdGhGYWxsYmFjayhzY29wZWQsICdsYWJlbFBvaW50U3R5bGUnLCB0aGlzLCBjb250ZXh0KSk7XG4gICAgICAgICAgICBsYWJlbFRleHRDb2xvcnMucHVzaChpbnZva2VDYWxsYmFja1dpdGhGYWxsYmFjayhzY29wZWQsICdsYWJlbFRleHRDb2xvcicsIHRoaXMsIGNvbnRleHQpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubGFiZWxDb2xvcnMgPSBsYWJlbENvbG9ycztcbiAgICAgICAgdGhpcy5sYWJlbFBvaW50U3R5bGVzID0gbGFiZWxQb2ludFN0eWxlcztcbiAgICAgICAgdGhpcy5sYWJlbFRleHRDb2xvcnMgPSBsYWJlbFRleHRDb2xvcnM7XG4gICAgICAgIHRoaXMuZGF0YVBvaW50cyA9IHRvb2x0aXBJdGVtcztcbiAgICAgICAgcmV0dXJuIHRvb2x0aXBJdGVtcztcbiAgICB9XG4gICAgdXBkYXRlKGNoYW5nZWQsIHJlcGxheSkge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zLnNldENvbnRleHQodGhpcy5nZXRDb250ZXh0KCkpO1xuICAgICAgICBjb25zdCBhY3RpdmUgPSB0aGlzLl9hY3RpdmU7XG4gICAgICAgIGxldCBwcm9wZXJ0aWVzO1xuICAgICAgICBsZXQgdG9vbHRpcEl0ZW1zID0gW107XG4gICAgICAgIGlmICghYWN0aXZlLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKHRoaXMub3BhY2l0eSAhPT0gMCkge1xuICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgPSB7XG4gICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6IDBcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcG9zaXRpb24gPSBwb3NpdGlvbmVyc1tvcHRpb25zLnBvc2l0aW9uXS5jYWxsKHRoaXMsIGFjdGl2ZSwgdGhpcy5fZXZlbnRQb3NpdGlvbik7XG4gICAgICAgICAgICB0b29sdGlwSXRlbXMgPSB0aGlzLl9jcmVhdGVJdGVtcyhvcHRpb25zKTtcbiAgICAgICAgICAgIHRoaXMudGl0bGUgPSB0aGlzLmdldFRpdGxlKHRvb2x0aXBJdGVtcywgb3B0aW9ucyk7XG4gICAgICAgICAgICB0aGlzLmJlZm9yZUJvZHkgPSB0aGlzLmdldEJlZm9yZUJvZHkodG9vbHRpcEl0ZW1zLCBvcHRpb25zKTtcbiAgICAgICAgICAgIHRoaXMuYm9keSA9IHRoaXMuZ2V0Qm9keSh0b29sdGlwSXRlbXMsIG9wdGlvbnMpO1xuICAgICAgICAgICAgdGhpcy5hZnRlckJvZHkgPSB0aGlzLmdldEFmdGVyQm9keSh0b29sdGlwSXRlbXMsIG9wdGlvbnMpO1xuICAgICAgICAgICAgdGhpcy5mb290ZXIgPSB0aGlzLmdldEZvb3Rlcih0b29sdGlwSXRlbXMsIG9wdGlvbnMpO1xuICAgICAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMuX3NpemUgPSBnZXRUb29sdGlwU2l6ZSh0aGlzLCBvcHRpb25zKTtcbiAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uQW5kU2l6ZSA9IE9iamVjdC5hc3NpZ24oe30sIHBvc2l0aW9uLCBzaXplKTtcbiAgICAgICAgICAgIGNvbnN0IGFsaWdubWVudCA9IGRldGVybWluZUFsaWdubWVudCh0aGlzLmNoYXJ0LCBvcHRpb25zLCBwb3NpdGlvbkFuZFNpemUpO1xuICAgICAgICAgICAgY29uc3QgYmFja2dyb3VuZFBvaW50ID0gZ2V0QmFja2dyb3VuZFBvaW50KG9wdGlvbnMsIHBvc2l0aW9uQW5kU2l6ZSwgYWxpZ25tZW50LCB0aGlzLmNoYXJ0KTtcbiAgICAgICAgICAgIHRoaXMueEFsaWduID0gYWxpZ25tZW50LnhBbGlnbjtcbiAgICAgICAgICAgIHRoaXMueUFsaWduID0gYWxpZ25tZW50LnlBbGlnbjtcbiAgICAgICAgICAgIHByb3BlcnRpZXMgPSB7XG4gICAgICAgICAgICAgICAgb3BhY2l0eTogMSxcbiAgICAgICAgICAgICAgICB4OiBiYWNrZ3JvdW5kUG9pbnQueCxcbiAgICAgICAgICAgICAgICB5OiBiYWNrZ3JvdW5kUG9pbnQueSxcbiAgICAgICAgICAgICAgICB3aWR0aDogc2l6ZS53aWR0aCxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IHNpemUuaGVpZ2h0LFxuICAgICAgICAgICAgICAgIGNhcmV0WDogcG9zaXRpb24ueCxcbiAgICAgICAgICAgICAgICBjYXJldFk6IHBvc2l0aW9uLnlcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdG9vbHRpcEl0ZW1zID0gdG9vbHRpcEl0ZW1zO1xuICAgICAgICB0aGlzLiRjb250ZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAocHJvcGVydGllcykge1xuICAgICAgICAgICAgdGhpcy5fcmVzb2x2ZUFuaW1hdGlvbnMoKS51cGRhdGUodGhpcywgcHJvcGVydGllcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoYW5nZWQgJiYgb3B0aW9ucy5leHRlcm5hbCkge1xuICAgICAgICAgICAgb3B0aW9ucy5leHRlcm5hbC5jYWxsKHRoaXMsIHtcbiAgICAgICAgICAgICAgICBjaGFydDogdGhpcy5jaGFydCxcbiAgICAgICAgICAgICAgICB0b29sdGlwOiB0aGlzLFxuICAgICAgICAgICAgICAgIHJlcGxheVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZHJhd0NhcmV0KHRvb2x0aXBQb2ludCwgY3R4LCBzaXplLCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGNhcmV0UG9zaXRpb24gPSB0aGlzLmdldENhcmV0UG9zaXRpb24odG9vbHRpcFBvaW50LCBzaXplLCBvcHRpb25zKTtcbiAgICAgICAgY3R4LmxpbmVUbyhjYXJldFBvc2l0aW9uLngxLCBjYXJldFBvc2l0aW9uLnkxKTtcbiAgICAgICAgY3R4LmxpbmVUbyhjYXJldFBvc2l0aW9uLngyLCBjYXJldFBvc2l0aW9uLnkyKTtcbiAgICAgICAgY3R4LmxpbmVUbyhjYXJldFBvc2l0aW9uLngzLCBjYXJldFBvc2l0aW9uLnkzKTtcbiAgICB9XG4gICAgZ2V0Q2FyZXRQb3NpdGlvbih0b29sdGlwUG9pbnQsIHNpemUsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgeyB4QWxpZ24gLCB5QWxpZ24gIH0gPSB0aGlzO1xuICAgICAgICBjb25zdCB7IGNhcmV0U2l6ZSAsIGNvcm5lclJhZGl1cyAgfSA9IG9wdGlvbnM7XG4gICAgICAgIGNvbnN0IHsgdG9wTGVmdCAsIHRvcFJpZ2h0ICwgYm90dG9tTGVmdCAsIGJvdHRvbVJpZ2h0ICB9ID0gdG9UUkJMQ29ybmVycyhjb3JuZXJSYWRpdXMpO1xuICAgICAgICBjb25zdCB7IHg6IHB0WCAsIHk6IHB0WSAgfSA9IHRvb2x0aXBQb2ludDtcbiAgICAgICAgY29uc3QgeyB3aWR0aCAsIGhlaWdodCAgfSA9IHNpemU7XG4gICAgICAgIGxldCB4MSwgeDIsIHgzLCB5MSwgeTIsIHkzO1xuICAgICAgICBpZiAoeUFsaWduID09PSAnY2VudGVyJykge1xuICAgICAgICAgICAgeTIgPSBwdFkgKyBoZWlnaHQgLyAyO1xuICAgICAgICAgICAgaWYgKHhBbGlnbiA9PT0gJ2xlZnQnKSB7XG4gICAgICAgICAgICAgICAgeDEgPSBwdFg7XG4gICAgICAgICAgICAgICAgeDIgPSB4MSAtIGNhcmV0U2l6ZTtcbiAgICAgICAgICAgICAgICB5MSA9IHkyICsgY2FyZXRTaXplO1xuICAgICAgICAgICAgICAgIHkzID0geTIgLSBjYXJldFNpemU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHgxID0gcHRYICsgd2lkdGg7XG4gICAgICAgICAgICAgICAgeDIgPSB4MSArIGNhcmV0U2l6ZTtcbiAgICAgICAgICAgICAgICB5MSA9IHkyIC0gY2FyZXRTaXplO1xuICAgICAgICAgICAgICAgIHkzID0geTIgKyBjYXJldFNpemU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB4MyA9IHgxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHhBbGlnbiA9PT0gJ2xlZnQnKSB7XG4gICAgICAgICAgICAgICAgeDIgPSBwdFggKyBNYXRoLm1heCh0b3BMZWZ0LCBib3R0b21MZWZ0KSArIGNhcmV0U2l6ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoeEFsaWduID09PSAncmlnaHQnKSB7XG4gICAgICAgICAgICAgICAgeDIgPSBwdFggKyB3aWR0aCAtIE1hdGgubWF4KHRvcFJpZ2h0LCBib3R0b21SaWdodCkgLSBjYXJldFNpemU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHgyID0gdGhpcy5jYXJldFg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoeUFsaWduID09PSAndG9wJykge1xuICAgICAgICAgICAgICAgIHkxID0gcHRZO1xuICAgICAgICAgICAgICAgIHkyID0geTEgLSBjYXJldFNpemU7XG4gICAgICAgICAgICAgICAgeDEgPSB4MiAtIGNhcmV0U2l6ZTtcbiAgICAgICAgICAgICAgICB4MyA9IHgyICsgY2FyZXRTaXplO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB5MSA9IHB0WSArIGhlaWdodDtcbiAgICAgICAgICAgICAgICB5MiA9IHkxICsgY2FyZXRTaXplO1xuICAgICAgICAgICAgICAgIHgxID0geDIgKyBjYXJldFNpemU7XG4gICAgICAgICAgICAgICAgeDMgPSB4MiAtIGNhcmV0U2l6ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHkzID0geTE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHgxLFxuICAgICAgICAgICAgeDIsXG4gICAgICAgICAgICB4MyxcbiAgICAgICAgICAgIHkxLFxuICAgICAgICAgICAgeTIsXG4gICAgICAgICAgICB5M1xuICAgICAgICB9O1xuICAgIH1cbiAgICBkcmF3VGl0bGUocHQsIGN0eCwgb3B0aW9ucykge1xuICAgICAgICBjb25zdCB0aXRsZSA9IHRoaXMudGl0bGU7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IHRpdGxlLmxlbmd0aDtcbiAgICAgICAgbGV0IHRpdGxlRm9udCwgdGl0bGVTcGFjaW5nLCBpO1xuICAgICAgICBpZiAobGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBydGxIZWxwZXIgPSBnZXRSdGxBZGFwdGVyKG9wdGlvbnMucnRsLCB0aGlzLngsIHRoaXMud2lkdGgpO1xuICAgICAgICAgICAgcHQueCA9IGdldEFsaWduZWRYKHRoaXMsIG9wdGlvbnMudGl0bGVBbGlnbiwgb3B0aW9ucyk7XG4gICAgICAgICAgICBjdHgudGV4dEFsaWduID0gcnRsSGVscGVyLnRleHRBbGlnbihvcHRpb25zLnRpdGxlQWxpZ24pO1xuICAgICAgICAgICAgY3R4LnRleHRCYXNlbGluZSA9ICdtaWRkbGUnO1xuICAgICAgICAgICAgdGl0bGVGb250ID0gdG9Gb250KG9wdGlvbnMudGl0bGVGb250KTtcbiAgICAgICAgICAgIHRpdGxlU3BhY2luZyA9IG9wdGlvbnMudGl0bGVTcGFjaW5nO1xuICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9IG9wdGlvbnMudGl0bGVDb2xvcjtcbiAgICAgICAgICAgIGN0eC5mb250ID0gdGl0bGVGb250LnN0cmluZztcbiAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IGxlbmd0aDsgKytpKXtcbiAgICAgICAgICAgICAgICBjdHguZmlsbFRleHQodGl0bGVbaV0sIHJ0bEhlbHBlci54KHB0LngpLCBwdC55ICsgdGl0bGVGb250LmxpbmVIZWlnaHQgLyAyKTtcbiAgICAgICAgICAgICAgICBwdC55ICs9IHRpdGxlRm9udC5saW5lSGVpZ2h0ICsgdGl0bGVTcGFjaW5nO1xuICAgICAgICAgICAgICAgIGlmIChpICsgMSA9PT0gbGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHB0LnkgKz0gb3B0aW9ucy50aXRsZU1hcmdpbkJvdHRvbSAtIHRpdGxlU3BhY2luZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gX2RyYXdDb2xvckJveChjdHgsIHB0LCBpLCBydGxIZWxwZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgbGFiZWxDb2xvciA9IHRoaXMubGFiZWxDb2xvcnNbaV07XG4gICAgICAgIGNvbnN0IGxhYmVsUG9pbnRTdHlsZSA9IHRoaXMubGFiZWxQb2ludFN0eWxlc1tpXTtcbiAgICAgICAgY29uc3QgeyBib3hIZWlnaHQgLCBib3hXaWR0aCAgfSA9IG9wdGlvbnM7XG4gICAgICAgIGNvbnN0IGJvZHlGb250ID0gdG9Gb250KG9wdGlvbnMuYm9keUZvbnQpO1xuICAgICAgICBjb25zdCBjb2xvclggPSBnZXRBbGlnbmVkWCh0aGlzLCAnbGVmdCcsIG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBydGxDb2xvclggPSBydGxIZWxwZXIueChjb2xvclgpO1xuICAgICAgICBjb25zdCB5T2ZmU2V0ID0gYm94SGVpZ2h0IDwgYm9keUZvbnQubGluZUhlaWdodCA/IChib2R5Rm9udC5saW5lSGVpZ2h0IC0gYm94SGVpZ2h0KSAvIDIgOiAwO1xuICAgICAgICBjb25zdCBjb2xvclkgPSBwdC55ICsgeU9mZlNldDtcbiAgICAgICAgaWYgKG9wdGlvbnMudXNlUG9pbnRTdHlsZSkge1xuICAgICAgICAgICAgY29uc3QgZHJhd09wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgcmFkaXVzOiBNYXRoLm1pbihib3hXaWR0aCwgYm94SGVpZ2h0KSAvIDIsXG4gICAgICAgICAgICAgICAgcG9pbnRTdHlsZTogbGFiZWxQb2ludFN0eWxlLnBvaW50U3R5bGUsXG4gICAgICAgICAgICAgICAgcm90YXRpb246IGxhYmVsUG9pbnRTdHlsZS5yb3RhdGlvbixcbiAgICAgICAgICAgICAgICBib3JkZXJXaWR0aDogMVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IGNlbnRlclggPSBydGxIZWxwZXIubGVmdEZvckx0cihydGxDb2xvclgsIGJveFdpZHRoKSArIGJveFdpZHRoIC8gMjtcbiAgICAgICAgICAgIGNvbnN0IGNlbnRlclkgPSBjb2xvclkgKyBib3hIZWlnaHQgLyAyO1xuICAgICAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gb3B0aW9ucy5tdWx0aUtleUJhY2tncm91bmQ7XG4gICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gb3B0aW9ucy5tdWx0aUtleUJhY2tncm91bmQ7XG4gICAgICAgICAgICBkcmF3UG9pbnQoY3R4LCBkcmF3T3B0aW9ucywgY2VudGVyWCwgY2VudGVyWSk7XG4gICAgICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSBsYWJlbENvbG9yLmJvcmRlckNvbG9yO1xuICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9IGxhYmVsQ29sb3IuYmFja2dyb3VuZENvbG9yO1xuICAgICAgICAgICAgZHJhd1BvaW50KGN0eCwgZHJhd09wdGlvbnMsIGNlbnRlclgsIGNlbnRlclkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY3R4LmxpbmVXaWR0aCA9IGlzT2JqZWN0KGxhYmVsQ29sb3IuYm9yZGVyV2lkdGgpID8gTWF0aC5tYXgoLi4uT2JqZWN0LnZhbHVlcyhsYWJlbENvbG9yLmJvcmRlcldpZHRoKSkgOiBsYWJlbENvbG9yLmJvcmRlcldpZHRoIHx8IDE7XG4gICAgICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSBsYWJlbENvbG9yLmJvcmRlckNvbG9yO1xuICAgICAgICAgICAgY3R4LnNldExpbmVEYXNoKGxhYmVsQ29sb3IuYm9yZGVyRGFzaCB8fCBbXSk7XG4gICAgICAgICAgICBjdHgubGluZURhc2hPZmZzZXQgPSBsYWJlbENvbG9yLmJvcmRlckRhc2hPZmZzZXQgfHwgMDtcbiAgICAgICAgICAgIGNvbnN0IG91dGVyWCA9IHJ0bEhlbHBlci5sZWZ0Rm9yTHRyKHJ0bENvbG9yWCwgYm94V2lkdGgpO1xuICAgICAgICAgICAgY29uc3QgaW5uZXJYID0gcnRsSGVscGVyLmxlZnRGb3JMdHIocnRsSGVscGVyLnhQbHVzKHJ0bENvbG9yWCwgMSksIGJveFdpZHRoIC0gMik7XG4gICAgICAgICAgICBjb25zdCBib3JkZXJSYWRpdXMgPSB0b1RSQkxDb3JuZXJzKGxhYmVsQ29sb3IuYm9yZGVyUmFkaXVzKTtcbiAgICAgICAgICAgIGlmIChPYmplY3QudmFsdWVzKGJvcmRlclJhZGl1cykuc29tZSgodik9PnYgIT09IDApKSB7XG4gICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgICAgICAgICAgIGN0eC5maWxsU3R5bGUgPSBvcHRpb25zLm11bHRpS2V5QmFja2dyb3VuZDtcbiAgICAgICAgICAgICAgICBhZGRSb3VuZGVkUmVjdFBhdGgoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgIHg6IG91dGVyWCxcbiAgICAgICAgICAgICAgICAgICAgeTogY29sb3JZLFxuICAgICAgICAgICAgICAgICAgICB3OiBib3hXaWR0aCxcbiAgICAgICAgICAgICAgICAgICAgaDogYm94SGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICByYWRpdXM6IGJvcmRlclJhZGl1c1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGN0eC5maWxsKCk7XG4gICAgICAgICAgICAgICAgY3R4LnN0cm9rZSgpO1xuICAgICAgICAgICAgICAgIGN0eC5maWxsU3R5bGUgPSBsYWJlbENvbG9yLmJhY2tncm91bmRDb2xvcjtcbiAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgICAgICAgICAgICAgYWRkUm91bmRlZFJlY3RQYXRoKGN0eCwge1xuICAgICAgICAgICAgICAgICAgICB4OiBpbm5lclgsXG4gICAgICAgICAgICAgICAgICAgIHk6IGNvbG9yWSArIDEsXG4gICAgICAgICAgICAgICAgICAgIHc6IGJveFdpZHRoIC0gMixcbiAgICAgICAgICAgICAgICAgICAgaDogYm94SGVpZ2h0IC0gMixcbiAgICAgICAgICAgICAgICAgICAgcmFkaXVzOiBib3JkZXJSYWRpdXNcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjdHguZmlsbCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gb3B0aW9ucy5tdWx0aUtleUJhY2tncm91bmQ7XG4gICAgICAgICAgICAgICAgY3R4LmZpbGxSZWN0KG91dGVyWCwgY29sb3JZLCBib3hXaWR0aCwgYm94SGVpZ2h0KTtcbiAgICAgICAgICAgICAgICBjdHguc3Ryb2tlUmVjdChvdXRlclgsIGNvbG9yWSwgYm94V2lkdGgsIGJveEhlaWdodCk7XG4gICAgICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9IGxhYmVsQ29sb3IuYmFja2dyb3VuZENvbG9yO1xuICAgICAgICAgICAgICAgIGN0eC5maWxsUmVjdChpbm5lclgsIGNvbG9yWSArIDEsIGJveFdpZHRoIC0gMiwgYm94SGVpZ2h0IC0gMik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY3R4LmZpbGxTdHlsZSA9IHRoaXMubGFiZWxUZXh0Q29sb3JzW2ldO1xuICAgIH1cbiAgICBkcmF3Qm9keShwdCwgY3R4LCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHsgYm9keSAgfSA9IHRoaXM7XG4gICAgICAgIGNvbnN0IHsgYm9keVNwYWNpbmcgLCBib2R5QWxpZ24gLCBkaXNwbGF5Q29sb3JzICwgYm94SGVpZ2h0ICwgYm94V2lkdGggLCBib3hQYWRkaW5nICB9ID0gb3B0aW9ucztcbiAgICAgICAgY29uc3QgYm9keUZvbnQgPSB0b0ZvbnQob3B0aW9ucy5ib2R5Rm9udCk7XG4gICAgICAgIGxldCBib2R5TGluZUhlaWdodCA9IGJvZHlGb250LmxpbmVIZWlnaHQ7XG4gICAgICAgIGxldCB4TGluZVBhZGRpbmcgPSAwO1xuICAgICAgICBjb25zdCBydGxIZWxwZXIgPSBnZXRSdGxBZGFwdGVyKG9wdGlvbnMucnRsLCB0aGlzLngsIHRoaXMud2lkdGgpO1xuICAgICAgICBjb25zdCBmaWxsTGluZU9mVGV4dCA9IGZ1bmN0aW9uKGxpbmUpIHtcbiAgICAgICAgICAgIGN0eC5maWxsVGV4dChsaW5lLCBydGxIZWxwZXIueChwdC54ICsgeExpbmVQYWRkaW5nKSwgcHQueSArIGJvZHlMaW5lSGVpZ2h0IC8gMik7XG4gICAgICAgICAgICBwdC55ICs9IGJvZHlMaW5lSGVpZ2h0ICsgYm9keVNwYWNpbmc7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGJvZHlBbGlnbkZvckNhbGN1bGF0aW9uID0gcnRsSGVscGVyLnRleHRBbGlnbihib2R5QWxpZ24pO1xuICAgICAgICBsZXQgYm9keUl0ZW0sIHRleHRDb2xvciwgbGluZXMsIGksIGosIGlsZW4sIGpsZW47XG4gICAgICAgIGN0eC50ZXh0QWxpZ24gPSBib2R5QWxpZ247XG4gICAgICAgIGN0eC50ZXh0QmFzZWxpbmUgPSAnbWlkZGxlJztcbiAgICAgICAgY3R4LmZvbnQgPSBib2R5Rm9udC5zdHJpbmc7XG4gICAgICAgIHB0LnggPSBnZXRBbGlnbmVkWCh0aGlzLCBib2R5QWxpZ25Gb3JDYWxjdWxhdGlvbiwgb3B0aW9ucyk7XG4gICAgICAgIGN0eC5maWxsU3R5bGUgPSBvcHRpb25zLmJvZHlDb2xvcjtcbiAgICAgICAgZWFjaCh0aGlzLmJlZm9yZUJvZHksIGZpbGxMaW5lT2ZUZXh0KTtcbiAgICAgICAgeExpbmVQYWRkaW5nID0gZGlzcGxheUNvbG9ycyAmJiBib2R5QWxpZ25Gb3JDYWxjdWxhdGlvbiAhPT0gJ3JpZ2h0JyA/IGJvZHlBbGlnbiA9PT0gJ2NlbnRlcicgPyBib3hXaWR0aCAvIDIgKyBib3hQYWRkaW5nIDogYm94V2lkdGggKyAyICsgYm94UGFkZGluZyA6IDA7XG4gICAgICAgIGZvcihpID0gMCwgaWxlbiA9IGJvZHkubGVuZ3RoOyBpIDwgaWxlbjsgKytpKXtcbiAgICAgICAgICAgIGJvZHlJdGVtID0gYm9keVtpXTtcbiAgICAgICAgICAgIHRleHRDb2xvciA9IHRoaXMubGFiZWxUZXh0Q29sb3JzW2ldO1xuICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9IHRleHRDb2xvcjtcbiAgICAgICAgICAgIGVhY2goYm9keUl0ZW0uYmVmb3JlLCBmaWxsTGluZU9mVGV4dCk7XG4gICAgICAgICAgICBsaW5lcyA9IGJvZHlJdGVtLmxpbmVzO1xuICAgICAgICAgICAgaWYgKGRpc3BsYXlDb2xvcnMgJiYgbGluZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZHJhd0NvbG9yQm94KGN0eCwgcHQsIGksIHJ0bEhlbHBlciwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgYm9keUxpbmVIZWlnaHQgPSBNYXRoLm1heChib2R5Rm9udC5saW5lSGVpZ2h0LCBib3hIZWlnaHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yKGogPSAwLCBqbGVuID0gbGluZXMubGVuZ3RoOyBqIDwgamxlbjsgKytqKXtcbiAgICAgICAgICAgICAgICBmaWxsTGluZU9mVGV4dChsaW5lc1tqXSk7XG4gICAgICAgICAgICAgICAgYm9keUxpbmVIZWlnaHQgPSBib2R5Rm9udC5saW5lSGVpZ2h0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWFjaChib2R5SXRlbS5hZnRlciwgZmlsbExpbmVPZlRleHQpO1xuICAgICAgICB9XG4gICAgICAgIHhMaW5lUGFkZGluZyA9IDA7XG4gICAgICAgIGJvZHlMaW5lSGVpZ2h0ID0gYm9keUZvbnQubGluZUhlaWdodDtcbiAgICAgICAgZWFjaCh0aGlzLmFmdGVyQm9keSwgZmlsbExpbmVPZlRleHQpO1xuICAgICAgICBwdC55IC09IGJvZHlTcGFjaW5nO1xuICAgIH1cbiAgICBkcmF3Rm9vdGVyKHB0LCBjdHgsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgZm9vdGVyID0gdGhpcy5mb290ZXI7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IGZvb3Rlci5sZW5ndGg7XG4gICAgICAgIGxldCBmb290ZXJGb250LCBpO1xuICAgICAgICBpZiAobGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBydGxIZWxwZXIgPSBnZXRSdGxBZGFwdGVyKG9wdGlvbnMucnRsLCB0aGlzLngsIHRoaXMud2lkdGgpO1xuICAgICAgICAgICAgcHQueCA9IGdldEFsaWduZWRYKHRoaXMsIG9wdGlvbnMuZm9vdGVyQWxpZ24sIG9wdGlvbnMpO1xuICAgICAgICAgICAgcHQueSArPSBvcHRpb25zLmZvb3Rlck1hcmdpblRvcDtcbiAgICAgICAgICAgIGN0eC50ZXh0QWxpZ24gPSBydGxIZWxwZXIudGV4dEFsaWduKG9wdGlvbnMuZm9vdGVyQWxpZ24pO1xuICAgICAgICAgICAgY3R4LnRleHRCYXNlbGluZSA9ICdtaWRkbGUnO1xuICAgICAgICAgICAgZm9vdGVyRm9udCA9IHRvRm9udChvcHRpb25zLmZvb3RlckZvbnQpO1xuICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9IG9wdGlvbnMuZm9vdGVyQ29sb3I7XG4gICAgICAgICAgICBjdHguZm9udCA9IGZvb3RlckZvbnQuc3RyaW5nO1xuICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpe1xuICAgICAgICAgICAgICAgIGN0eC5maWxsVGV4dChmb290ZXJbaV0sIHJ0bEhlbHBlci54KHB0LngpLCBwdC55ICsgZm9vdGVyRm9udC5saW5lSGVpZ2h0IC8gMik7XG4gICAgICAgICAgICAgICAgcHQueSArPSBmb290ZXJGb250LmxpbmVIZWlnaHQgKyBvcHRpb25zLmZvb3RlclNwYWNpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZHJhd0JhY2tncm91bmQocHQsIGN0eCwgdG9vbHRpcFNpemUsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgeyB4QWxpZ24gLCB5QWxpZ24gIH0gPSB0aGlzO1xuICAgICAgICBjb25zdCB7IHggLCB5ICB9ID0gcHQ7XG4gICAgICAgIGNvbnN0IHsgd2lkdGggLCBoZWlnaHQgIH0gPSB0b29sdGlwU2l6ZTtcbiAgICAgICAgY29uc3QgeyB0b3BMZWZ0ICwgdG9wUmlnaHQgLCBib3R0b21MZWZ0ICwgYm90dG9tUmlnaHQgIH0gPSB0b1RSQkxDb3JuZXJzKG9wdGlvbnMuY29ybmVyUmFkaXVzKTtcbiAgICAgICAgY3R4LmZpbGxTdHlsZSA9IG9wdGlvbnMuYmFja2dyb3VuZENvbG9yO1xuICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSBvcHRpb25zLmJvcmRlckNvbG9yO1xuICAgICAgICBjdHgubGluZVdpZHRoID0gb3B0aW9ucy5ib3JkZXJXaWR0aDtcbiAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgICBjdHgubW92ZVRvKHggKyB0b3BMZWZ0LCB5KTtcbiAgICAgICAgaWYgKHlBbGlnbiA9PT0gJ3RvcCcpIHtcbiAgICAgICAgICAgIHRoaXMuZHJhd0NhcmV0KHB0LCBjdHgsIHRvb2x0aXBTaXplLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBjdHgubGluZVRvKHggKyB3aWR0aCAtIHRvcFJpZ2h0LCB5KTtcbiAgICAgICAgY3R4LnF1YWRyYXRpY0N1cnZlVG8oeCArIHdpZHRoLCB5LCB4ICsgd2lkdGgsIHkgKyB0b3BSaWdodCk7XG4gICAgICAgIGlmICh5QWxpZ24gPT09ICdjZW50ZXInICYmIHhBbGlnbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgICAgdGhpcy5kcmF3Q2FyZXQocHQsIGN0eCwgdG9vbHRpcFNpemUsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGN0eC5saW5lVG8oeCArIHdpZHRoLCB5ICsgaGVpZ2h0IC0gYm90dG9tUmlnaHQpO1xuICAgICAgICBjdHgucXVhZHJhdGljQ3VydmVUbyh4ICsgd2lkdGgsIHkgKyBoZWlnaHQsIHggKyB3aWR0aCAtIGJvdHRvbVJpZ2h0LCB5ICsgaGVpZ2h0KTtcbiAgICAgICAgaWYgKHlBbGlnbiA9PT0gJ2JvdHRvbScpIHtcbiAgICAgICAgICAgIHRoaXMuZHJhd0NhcmV0KHB0LCBjdHgsIHRvb2x0aXBTaXplLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBjdHgubGluZVRvKHggKyBib3R0b21MZWZ0LCB5ICsgaGVpZ2h0KTtcbiAgICAgICAgY3R4LnF1YWRyYXRpY0N1cnZlVG8oeCwgeSArIGhlaWdodCwgeCwgeSArIGhlaWdodCAtIGJvdHRvbUxlZnQpO1xuICAgICAgICBpZiAoeUFsaWduID09PSAnY2VudGVyJyAmJiB4QWxpZ24gPT09ICdsZWZ0Jykge1xuICAgICAgICAgICAgdGhpcy5kcmF3Q2FyZXQocHQsIGN0eCwgdG9vbHRpcFNpemUsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGN0eC5saW5lVG8oeCwgeSArIHRvcExlZnQpO1xuICAgICAgICBjdHgucXVhZHJhdGljQ3VydmVUbyh4LCB5LCB4ICsgdG9wTGVmdCwgeSk7XG4gICAgICAgIGN0eC5jbG9zZVBhdGgoKTtcbiAgICAgICAgY3R4LmZpbGwoKTtcbiAgICAgICAgaWYgKG9wdGlvbnMuYm9yZGVyV2lkdGggPiAwKSB7XG4gICAgICAgICAgICBjdHguc3Ryb2tlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gX3VwZGF0ZUFuaW1hdGlvblRhcmdldChvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGNoYXJ0ID0gdGhpcy5jaGFydDtcbiAgICAgICAgY29uc3QgYW5pbXMgPSB0aGlzLiRhbmltYXRpb25zO1xuICAgICAgICBjb25zdCBhbmltWCA9IGFuaW1zICYmIGFuaW1zLng7XG4gICAgICAgIGNvbnN0IGFuaW1ZID0gYW5pbXMgJiYgYW5pbXMueTtcbiAgICAgICAgaWYgKGFuaW1YIHx8IGFuaW1ZKSB7XG4gICAgICAgICAgICBjb25zdCBwb3NpdGlvbiA9IHBvc2l0aW9uZXJzW29wdGlvbnMucG9zaXRpb25dLmNhbGwodGhpcywgdGhpcy5fYWN0aXZlLCB0aGlzLl9ldmVudFBvc2l0aW9uKTtcbiAgICAgICAgICAgIGlmICghcG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBzaXplID0gdGhpcy5fc2l6ZSA9IGdldFRvb2x0aXBTaXplKHRoaXMsIG9wdGlvbnMpO1xuICAgICAgICAgICAgY29uc3QgcG9zaXRpb25BbmRTaXplID0gT2JqZWN0LmFzc2lnbih7fSwgcG9zaXRpb24sIHRoaXMuX3NpemUpO1xuICAgICAgICAgICAgY29uc3QgYWxpZ25tZW50ID0gZGV0ZXJtaW5lQWxpZ25tZW50KGNoYXJ0LCBvcHRpb25zLCBwb3NpdGlvbkFuZFNpemUpO1xuICAgICAgICAgICAgY29uc3QgcG9pbnQgPSBnZXRCYWNrZ3JvdW5kUG9pbnQob3B0aW9ucywgcG9zaXRpb25BbmRTaXplLCBhbGlnbm1lbnQsIGNoYXJ0KTtcbiAgICAgICAgICAgIGlmIChhbmltWC5fdG8gIT09IHBvaW50LnggfHwgYW5pbVkuX3RvICE9PSBwb2ludC55KSB7XG4gICAgICAgICAgICAgICAgdGhpcy54QWxpZ24gPSBhbGlnbm1lbnQueEFsaWduO1xuICAgICAgICAgICAgICAgIHRoaXMueUFsaWduID0gYWxpZ25tZW50LnlBbGlnbjtcbiAgICAgICAgICAgICAgICB0aGlzLndpZHRoID0gc2l6ZS53aWR0aDtcbiAgICAgICAgICAgICAgICB0aGlzLmhlaWdodCA9IHNpemUuaGVpZ2h0O1xuICAgICAgICAgICAgICAgIHRoaXMuY2FyZXRYID0gcG9zaXRpb24ueDtcbiAgICAgICAgICAgICAgICB0aGlzLmNhcmV0WSA9IHBvc2l0aW9uLnk7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVzb2x2ZUFuaW1hdGlvbnMoKS51cGRhdGUodGhpcywgcG9pbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuIF93aWxsUmVuZGVyKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLm9wYWNpdHk7XG4gICAgfVxuICAgIGRyYXcoY3R4KSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMuc2V0Q29udGV4dCh0aGlzLmdldENvbnRleHQoKSk7XG4gICAgICAgIGxldCBvcGFjaXR5ID0gdGhpcy5vcGFjaXR5O1xuICAgICAgICBpZiAoIW9wYWNpdHkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl91cGRhdGVBbmltYXRpb25UYXJnZXQob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IHRvb2x0aXBTaXplID0ge1xuICAgICAgICAgICAgd2lkdGg6IHRoaXMud2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IHRoaXMuaGVpZ2h0XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHB0ID0ge1xuICAgICAgICAgICAgeDogdGhpcy54LFxuICAgICAgICAgICAgeTogdGhpcy55XG4gICAgICAgIH07XG4gICAgICAgIG9wYWNpdHkgPSBNYXRoLmFicyhvcGFjaXR5KSA8IDFlLTMgPyAwIDogb3BhY2l0eTtcbiAgICAgICAgY29uc3QgcGFkZGluZyA9IHRvUGFkZGluZyhvcHRpb25zLnBhZGRpbmcpO1xuICAgICAgICBjb25zdCBoYXNUb29sdGlwQ29udGVudCA9IHRoaXMudGl0bGUubGVuZ3RoIHx8IHRoaXMuYmVmb3JlQm9keS5sZW5ndGggfHwgdGhpcy5ib2R5Lmxlbmd0aCB8fCB0aGlzLmFmdGVyQm9keS5sZW5ndGggfHwgdGhpcy5mb290ZXIubGVuZ3RoO1xuICAgICAgICBpZiAob3B0aW9ucy5lbmFibGVkICYmIGhhc1Rvb2x0aXBDb250ZW50KSB7XG4gICAgICAgICAgICBjdHguc2F2ZSgpO1xuICAgICAgICAgICAgY3R4Lmdsb2JhbEFscGhhID0gb3BhY2l0eTtcbiAgICAgICAgICAgIHRoaXMuZHJhd0JhY2tncm91bmQocHQsIGN0eCwgdG9vbHRpcFNpemUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgb3ZlcnJpZGVUZXh0RGlyZWN0aW9uKGN0eCwgb3B0aW9ucy50ZXh0RGlyZWN0aW9uKTtcbiAgICAgICAgICAgIHB0LnkgKz0gcGFkZGluZy50b3A7XG4gICAgICAgICAgICB0aGlzLmRyYXdUaXRsZShwdCwgY3R4LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHRoaXMuZHJhd0JvZHkocHQsIGN0eCwgb3B0aW9ucyk7XG4gICAgICAgICAgICB0aGlzLmRyYXdGb290ZXIocHQsIGN0eCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXN0b3JlVGV4dERpcmVjdGlvbihjdHgsIG9wdGlvbnMudGV4dERpcmVjdGlvbik7XG4gICAgICAgICAgICBjdHgucmVzdG9yZSgpO1xuICAgICAgICB9XG4gICAgfVxuIGdldEFjdGl2ZUVsZW1lbnRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWN0aXZlIHx8IFtdO1xuICAgIH1cbiBzZXRBY3RpdmVFbGVtZW50cyhhY3RpdmVFbGVtZW50cywgZXZlbnRQb3NpdGlvbikge1xuICAgICAgICBjb25zdCBsYXN0QWN0aXZlID0gdGhpcy5fYWN0aXZlO1xuICAgICAgICBjb25zdCBhY3RpdmUgPSBhY3RpdmVFbGVtZW50cy5tYXAoKHsgZGF0YXNldEluZGV4ICwgaW5kZXggIH0pPT57XG4gICAgICAgICAgICBjb25zdCBtZXRhID0gdGhpcy5jaGFydC5nZXREYXRhc2V0TWV0YShkYXRhc2V0SW5kZXgpO1xuICAgICAgICAgICAgaWYgKCFtZXRhKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZmluZCBhIGRhdGFzZXQgYXQgaW5kZXggJyArIGRhdGFzZXRJbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGRhdGFzZXRJbmRleCxcbiAgICAgICAgICAgICAgICBlbGVtZW50OiBtZXRhLmRhdGFbaW5kZXhdLFxuICAgICAgICAgICAgICAgIGluZGV4XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgY2hhbmdlZCA9ICFfZWxlbWVudHNFcXVhbChsYXN0QWN0aXZlLCBhY3RpdmUpO1xuICAgICAgICBjb25zdCBwb3NpdGlvbkNoYW5nZWQgPSB0aGlzLl9wb3NpdGlvbkNoYW5nZWQoYWN0aXZlLCBldmVudFBvc2l0aW9uKTtcbiAgICAgICAgaWYgKGNoYW5nZWQgfHwgcG9zaXRpb25DaGFuZ2VkKSB7XG4gICAgICAgICAgICB0aGlzLl9hY3RpdmUgPSBhY3RpdmU7XG4gICAgICAgICAgICB0aGlzLl9ldmVudFBvc2l0aW9uID0gZXZlbnRQb3NpdGlvbjtcbiAgICAgICAgICAgIHRoaXMuX2lnbm9yZVJlcGxheUV2ZW50cyA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSh0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cbiBoYW5kbGVFdmVudChlLCByZXBsYXksIGluQ2hhcnRBcmVhID0gdHJ1ZSkge1xuICAgICAgICBpZiAocmVwbGF5ICYmIHRoaXMuX2lnbm9yZVJlcGxheUV2ZW50cykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2lnbm9yZVJlcGxheUV2ZW50cyA9IGZhbHNlO1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgICAgICBjb25zdCBsYXN0QWN0aXZlID0gdGhpcy5fYWN0aXZlIHx8IFtdO1xuICAgICAgICBjb25zdCBhY3RpdmUgPSB0aGlzLl9nZXRBY3RpdmVFbGVtZW50cyhlLCBsYXN0QWN0aXZlLCByZXBsYXksIGluQ2hhcnRBcmVhKTtcbiAgICAgICAgY29uc3QgcG9zaXRpb25DaGFuZ2VkID0gdGhpcy5fcG9zaXRpb25DaGFuZ2VkKGFjdGl2ZSwgZSk7XG4gICAgICAgIGNvbnN0IGNoYW5nZWQgPSByZXBsYXkgfHwgIV9lbGVtZW50c0VxdWFsKGFjdGl2ZSwgbGFzdEFjdGl2ZSkgfHwgcG9zaXRpb25DaGFuZ2VkO1xuICAgICAgICBpZiAoY2hhbmdlZCkge1xuICAgICAgICAgICAgdGhpcy5fYWN0aXZlID0gYWN0aXZlO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuZW5hYmxlZCB8fCBvcHRpb25zLmV4dGVybmFsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZXZlbnRQb3NpdGlvbiA9IHtcbiAgICAgICAgICAgICAgICAgICAgeDogZS54LFxuICAgICAgICAgICAgICAgICAgICB5OiBlLnlcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlKHRydWUsIHJlcGxheSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNoYW5nZWQ7XG4gICAgfVxuIF9nZXRBY3RpdmVFbGVtZW50cyhlLCBsYXN0QWN0aXZlLCByZXBsYXksIGluQ2hhcnRBcmVhKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIGlmIChlLnR5cGUgPT09ICdtb3VzZW91dCcpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWluQ2hhcnRBcmVhKSB7XG4gICAgICAgICAgICByZXR1cm4gbGFzdEFjdGl2ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhY3RpdmUgPSB0aGlzLmNoYXJ0LmdldEVsZW1lbnRzQXRFdmVudEZvck1vZGUoZSwgb3B0aW9ucy5tb2RlLCBvcHRpb25zLCByZXBsYXkpO1xuICAgICAgICBpZiAob3B0aW9ucy5yZXZlcnNlKSB7XG4gICAgICAgICAgICBhY3RpdmUucmV2ZXJzZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY3RpdmU7XG4gICAgfVxuIF9wb3NpdGlvbkNoYW5nZWQoYWN0aXZlLCBlKSB7XG4gICAgICAgIGNvbnN0IHsgY2FyZXRYICwgY2FyZXRZICwgb3B0aW9ucyAgfSA9IHRoaXM7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gcG9zaXRpb25lcnNbb3B0aW9ucy5wb3NpdGlvbl0uY2FsbCh0aGlzLCBhY3RpdmUsIGUpO1xuICAgICAgICByZXR1cm4gcG9zaXRpb24gIT09IGZhbHNlICYmIChjYXJldFggIT09IHBvc2l0aW9uLnggfHwgY2FyZXRZICE9PSBwb3NpdGlvbi55KTtcbiAgICB9XG59XG52YXIgcGx1Z2luX3Rvb2x0aXAgPSB7XG4gICAgaWQ6ICd0b29sdGlwJyxcbiAgICBfZWxlbWVudDogVG9vbHRpcCxcbiAgICBwb3NpdGlvbmVycyxcbiAgICBhZnRlckluaXQgKGNoYXJ0LCBfYXJncywgb3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucykge1xuICAgICAgICAgICAgY2hhcnQudG9vbHRpcCA9IG5ldyBUb29sdGlwKHtcbiAgICAgICAgICAgICAgICBjaGFydCxcbiAgICAgICAgICAgICAgICBvcHRpb25zXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgYmVmb3JlVXBkYXRlIChjaGFydCwgX2FyZ3MsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKGNoYXJ0LnRvb2x0aXApIHtcbiAgICAgICAgICAgIGNoYXJ0LnRvb2x0aXAuaW5pdGlhbGl6ZShvcHRpb25zKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcmVzZXQgKGNoYXJ0LCBfYXJncywgb3B0aW9ucykge1xuICAgICAgICBpZiAoY2hhcnQudG9vbHRpcCkge1xuICAgICAgICAgICAgY2hhcnQudG9vbHRpcC5pbml0aWFsaXplKG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBhZnRlckRyYXcgKGNoYXJ0KSB7XG4gICAgICAgIGNvbnN0IHRvb2x0aXAgPSBjaGFydC50b29sdGlwO1xuICAgICAgICBpZiAodG9vbHRpcCAmJiB0b29sdGlwLl93aWxsUmVuZGVyKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGFyZ3MgPSB7XG4gICAgICAgICAgICAgICAgdG9vbHRpcFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChjaGFydC5ub3RpZnlQbHVnaW5zKCdiZWZvcmVUb29sdGlwRHJhdycsIHtcbiAgICAgICAgICAgICAgICAuLi5hcmdzLFxuICAgICAgICAgICAgICAgIGNhbmNlbGFibGU6IHRydWVcbiAgICAgICAgICAgIH0pID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRvb2x0aXAuZHJhdyhjaGFydC5jdHgpO1xuICAgICAgICAgICAgY2hhcnQubm90aWZ5UGx1Z2lucygnYWZ0ZXJUb29sdGlwRHJhdycsIGFyZ3MpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBhZnRlckV2ZW50IChjaGFydCwgYXJncykge1xuICAgICAgICBpZiAoY2hhcnQudG9vbHRpcCkge1xuICAgICAgICAgICAgY29uc3QgdXNlRmluYWxQb3NpdGlvbiA9IGFyZ3MucmVwbGF5O1xuICAgICAgICAgICAgaWYgKGNoYXJ0LnRvb2x0aXAuaGFuZGxlRXZlbnQoYXJncy5ldmVudCwgdXNlRmluYWxQb3NpdGlvbiwgYXJncy5pbkNoYXJ0QXJlYSkpIHtcbiAgICAgICAgICAgICAgICBhcmdzLmNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcbiAgICBkZWZhdWx0czoge1xuICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICBleHRlcm5hbDogbnVsbCxcbiAgICAgICAgcG9zaXRpb246ICdhdmVyYWdlJyxcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiAncmdiYSgwLDAsMCwwLjgpJyxcbiAgICAgICAgdGl0bGVDb2xvcjogJyNmZmYnLFxuICAgICAgICB0aXRsZUZvbnQ6IHtcbiAgICAgICAgICAgIHdlaWdodDogJ2JvbGQnXG4gICAgICAgIH0sXG4gICAgICAgIHRpdGxlU3BhY2luZzogMixcbiAgICAgICAgdGl0bGVNYXJnaW5Cb3R0b206IDYsXG4gICAgICAgIHRpdGxlQWxpZ246ICdsZWZ0JyxcbiAgICAgICAgYm9keUNvbG9yOiAnI2ZmZicsXG4gICAgICAgIGJvZHlTcGFjaW5nOiAyLFxuICAgICAgICBib2R5Rm9udDoge30sXG4gICAgICAgIGJvZHlBbGlnbjogJ2xlZnQnLFxuICAgICAgICBmb290ZXJDb2xvcjogJyNmZmYnLFxuICAgICAgICBmb290ZXJTcGFjaW5nOiAyLFxuICAgICAgICBmb290ZXJNYXJnaW5Ub3A6IDYsXG4gICAgICAgIGZvb3RlckZvbnQ6IHtcbiAgICAgICAgICAgIHdlaWdodDogJ2JvbGQnXG4gICAgICAgIH0sXG4gICAgICAgIGZvb3RlckFsaWduOiAnbGVmdCcsXG4gICAgICAgIHBhZGRpbmc6IDYsXG4gICAgICAgIGNhcmV0UGFkZGluZzogMixcbiAgICAgICAgY2FyZXRTaXplOiA1LFxuICAgICAgICBjb3JuZXJSYWRpdXM6IDYsXG4gICAgICAgIGJveEhlaWdodDogKGN0eCwgb3B0cyk9Pm9wdHMuYm9keUZvbnQuc2l6ZSxcbiAgICAgICAgYm94V2lkdGg6IChjdHgsIG9wdHMpPT5vcHRzLmJvZHlGb250LnNpemUsXG4gICAgICAgIG11bHRpS2V5QmFja2dyb3VuZDogJyNmZmYnLFxuICAgICAgICBkaXNwbGF5Q29sb3JzOiB0cnVlLFxuICAgICAgICBib3hQYWRkaW5nOiAwLFxuICAgICAgICBib3JkZXJDb2xvcjogJ3JnYmEoMCwwLDAsMCknLFxuICAgICAgICBib3JkZXJXaWR0aDogMCxcbiAgICAgICAgYW5pbWF0aW9uOiB7XG4gICAgICAgICAgICBkdXJhdGlvbjogNDAwLFxuICAgICAgICAgICAgZWFzaW5nOiAnZWFzZU91dFF1YXJ0J1xuICAgICAgICB9LFxuICAgICAgICBhbmltYXRpb25zOiB7XG4gICAgICAgICAgICBudW1iZXJzOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICAgICAgICAgICAgcHJvcGVydGllczogW1xuICAgICAgICAgICAgICAgICAgICAneCcsXG4gICAgICAgICAgICAgICAgICAgICd5JyxcbiAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJyxcbiAgICAgICAgICAgICAgICAgICAgJ2hlaWdodCcsXG4gICAgICAgICAgICAgICAgICAgICdjYXJldFgnLFxuICAgICAgICAgICAgICAgICAgICAnY2FyZXRZJ1xuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvcGFjaXR5OiB7XG4gICAgICAgICAgICAgICAgZWFzaW5nOiAnbGluZWFyJyxcbiAgICAgICAgICAgICAgICBkdXJhdGlvbjogMjAwXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNhbGxiYWNrczogZGVmYXVsdENhbGxiYWNrc1xuICAgIH0sXG4gICAgZGVmYXVsdFJvdXRlczoge1xuICAgICAgICBib2R5Rm9udDogJ2ZvbnQnLFxuICAgICAgICBmb290ZXJGb250OiAnZm9udCcsXG4gICAgICAgIHRpdGxlRm9udDogJ2ZvbnQnXG4gICAgfSxcbiAgICBkZXNjcmlwdG9yczoge1xuICAgICAgICBfc2NyaXB0YWJsZTogKG5hbWUpPT5uYW1lICE9PSAnZmlsdGVyJyAmJiBuYW1lICE9PSAnaXRlbVNvcnQnICYmIG5hbWUgIT09ICdleHRlcm5hbCcsXG4gICAgICAgIF9pbmRleGFibGU6IGZhbHNlLFxuICAgICAgICBjYWxsYmFja3M6IHtcbiAgICAgICAgICAgIF9zY3JpcHRhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIF9pbmRleGFibGU6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIGFuaW1hdGlvbjoge1xuICAgICAgICAgICAgX2ZhbGxiYWNrOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBhbmltYXRpb25zOiB7XG4gICAgICAgICAgICBfZmFsbGJhY2s6ICdhbmltYXRpb24nXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGFkZGl0aW9uYWxPcHRpb25TY29wZXM6IFtcbiAgICAgICAgJ2ludGVyYWN0aW9uJ1xuICAgIF1cbn07XG5cbnZhciBwbHVnaW5zID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoe1xuX19wcm90b19fOiBudWxsLFxuQ29sb3JzOiBwbHVnaW5fY29sb3JzLFxuRGVjaW1hdGlvbjogcGx1Z2luX2RlY2ltYXRpb24sXG5GaWxsZXI6IGluZGV4LFxuTGVnZW5kOiBwbHVnaW5fbGVnZW5kLFxuU3ViVGl0bGU6IHBsdWdpbl9zdWJ0aXRsZSxcblRpdGxlOiBwbHVnaW5fdGl0bGUsXG5Ub29sdGlwOiBwbHVnaW5fdG9vbHRpcFxufSk7XG5cbmNvbnN0IGFkZElmU3RyaW5nID0gKGxhYmVscywgcmF3LCBpbmRleCwgYWRkZWRMYWJlbHMpPT57XG4gICAgaWYgKHR5cGVvZiByYXcgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGluZGV4ID0gbGFiZWxzLnB1c2gocmF3KSAtIDE7XG4gICAgICAgIGFkZGVkTGFiZWxzLnVuc2hpZnQoe1xuICAgICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgICBsYWJlbDogcmF3XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoaXNOYU4ocmF3KSkge1xuICAgICAgICBpbmRleCA9IG51bGw7XG4gICAgfVxuICAgIHJldHVybiBpbmRleDtcbn07XG5mdW5jdGlvbiBmaW5kT3JBZGRMYWJlbChsYWJlbHMsIHJhdywgaW5kZXgsIGFkZGVkTGFiZWxzKSB7XG4gICAgY29uc3QgZmlyc3QgPSBsYWJlbHMuaW5kZXhPZihyYXcpO1xuICAgIGlmIChmaXJzdCA9PT0gLTEpIHtcbiAgICAgICAgcmV0dXJuIGFkZElmU3RyaW5nKGxhYmVscywgcmF3LCBpbmRleCwgYWRkZWRMYWJlbHMpO1xuICAgIH1cbiAgICBjb25zdCBsYXN0ID0gbGFiZWxzLmxhc3RJbmRleE9mKHJhdyk7XG4gICAgcmV0dXJuIGZpcnN0ICE9PSBsYXN0ID8gaW5kZXggOiBmaXJzdDtcbn1cbmNvbnN0IHZhbGlkSW5kZXggPSAoaW5kZXgsIG1heCk9PmluZGV4ID09PSBudWxsID8gbnVsbCA6IF9saW1pdFZhbHVlKE1hdGgucm91bmQoaW5kZXgpLCAwLCBtYXgpO1xuZnVuY3Rpb24gX2dldExhYmVsRm9yVmFsdWUodmFsdWUpIHtcbiAgICBjb25zdCBsYWJlbHMgPSB0aGlzLmdldExhYmVscygpO1xuICAgIGlmICh2YWx1ZSA+PSAwICYmIHZhbHVlIDwgbGFiZWxzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gbGFiZWxzW3ZhbHVlXTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xufVxuY2xhc3MgQ2F0ZWdvcnlTY2FsZSBleHRlbmRzIFNjYWxlIHtcbiAgICBzdGF0aWMgaWQgPSAnY2F0ZWdvcnknO1xuIHN0YXRpYyBkZWZhdWx0cyA9IHtcbiAgICAgICAgdGlja3M6IHtcbiAgICAgICAgICAgIGNhbGxiYWNrOiBfZ2V0TGFiZWxGb3JWYWx1ZVxuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25zdHJ1Y3RvcihjZmcpe1xuICAgICAgICBzdXBlcihjZmcpO1xuICAgICAgICAgdGhpcy5fc3RhcnRWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fdmFsdWVSYW5nZSA9IDA7XG4gICAgICAgIHRoaXMuX2FkZGVkTGFiZWxzID0gW107XG4gICAgfVxuICAgIGluaXQoc2NhbGVPcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGFkZGVkID0gdGhpcy5fYWRkZWRMYWJlbHM7XG4gICAgICAgIGlmIChhZGRlZC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGxhYmVscyA9IHRoaXMuZ2V0TGFiZWxzKCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHsgaW5kZXggLCBsYWJlbCAgfSBvZiBhZGRlZCl7XG4gICAgICAgICAgICAgICAgaWYgKGxhYmVsc1tpbmRleF0gPT09IGxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVscy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2FkZGVkTGFiZWxzID0gW107XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIuaW5pdChzY2FsZU9wdGlvbnMpO1xuICAgIH1cbiAgICBwYXJzZShyYXcsIGluZGV4KSB7XG4gICAgICAgIGlmIChpc051bGxPclVuZGVmKHJhdykpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxhYmVscyA9IHRoaXMuZ2V0TGFiZWxzKCk7XG4gICAgICAgIGluZGV4ID0gaXNGaW5pdGUoaW5kZXgpICYmIGxhYmVsc1tpbmRleF0gPT09IHJhdyA/IGluZGV4IDogZmluZE9yQWRkTGFiZWwobGFiZWxzLCByYXcsIHZhbHVlT3JEZWZhdWx0KGluZGV4LCByYXcpLCB0aGlzLl9hZGRlZExhYmVscyk7XG4gICAgICAgIHJldHVybiB2YWxpZEluZGV4KGluZGV4LCBsYWJlbHMubGVuZ3RoIC0gMSk7XG4gICAgfVxuICAgIGRldGVybWluZURhdGFMaW1pdHMoKSB7XG4gICAgICAgIGNvbnN0IHsgbWluRGVmaW5lZCAsIG1heERlZmluZWQgIH0gPSB0aGlzLmdldFVzZXJCb3VuZHMoKTtcbiAgICAgICAgbGV0IHsgbWluICwgbWF4ICB9ID0gdGhpcy5nZXRNaW5NYXgodHJ1ZSk7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYm91bmRzID09PSAndGlja3MnKSB7XG4gICAgICAgICAgICBpZiAoIW1pbkRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBtaW4gPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFtYXhEZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgbWF4ID0gdGhpcy5nZXRMYWJlbHMoKS5sZW5ndGggLSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMubWluID0gbWluO1xuICAgICAgICB0aGlzLm1heCA9IG1heDtcbiAgICB9XG4gICAgYnVpbGRUaWNrcygpIHtcbiAgICAgICAgY29uc3QgbWluID0gdGhpcy5taW47XG4gICAgICAgIGNvbnN0IG1heCA9IHRoaXMubWF4O1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLm9wdGlvbnMub2Zmc2V0O1xuICAgICAgICBjb25zdCB0aWNrcyA9IFtdO1xuICAgICAgICBsZXQgbGFiZWxzID0gdGhpcy5nZXRMYWJlbHMoKTtcbiAgICAgICAgbGFiZWxzID0gbWluID09PSAwICYmIG1heCA9PT0gbGFiZWxzLmxlbmd0aCAtIDEgPyBsYWJlbHMgOiBsYWJlbHMuc2xpY2UobWluLCBtYXggKyAxKTtcbiAgICAgICAgdGhpcy5fdmFsdWVSYW5nZSA9IE1hdGgubWF4KGxhYmVscy5sZW5ndGggLSAob2Zmc2V0ID8gMCA6IDEpLCAxKTtcbiAgICAgICAgdGhpcy5fc3RhcnRWYWx1ZSA9IHRoaXMubWluIC0gKG9mZnNldCA/IDAuNSA6IDApO1xuICAgICAgICBmb3IobGV0IHZhbHVlID0gbWluOyB2YWx1ZSA8PSBtYXg7IHZhbHVlKyspe1xuICAgICAgICAgICAgdGlja3MucHVzaCh7XG4gICAgICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aWNrcztcbiAgICB9XG4gICAgZ2V0TGFiZWxGb3JWYWx1ZSh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gX2dldExhYmVsRm9yVmFsdWUuY2FsbCh0aGlzLCB2YWx1ZSk7XG4gICAgfVxuIGNvbmZpZ3VyZSgpIHtcbiAgICAgICAgc3VwZXIuY29uZmlndXJlKCk7XG4gICAgICAgIGlmICghdGhpcy5pc0hvcml6b250YWwoKSkge1xuICAgICAgICAgICAgdGhpcy5fcmV2ZXJzZVBpeGVscyA9ICF0aGlzLl9yZXZlcnNlUGl4ZWxzO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldFBpeGVsRm9yVmFsdWUodmFsdWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHZhbHVlID0gdGhpcy5wYXJzZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSBudWxsID8gTmFOIDogdGhpcy5nZXRQaXhlbEZvckRlY2ltYWwoKHZhbHVlIC0gdGhpcy5fc3RhcnRWYWx1ZSkgLyB0aGlzLl92YWx1ZVJhbmdlKTtcbiAgICB9XG4gICAgZ2V0UGl4ZWxGb3JUaWNrKGluZGV4KSB7XG4gICAgICAgIGNvbnN0IHRpY2tzID0gdGhpcy50aWNrcztcbiAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+IHRpY2tzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBpeGVsRm9yVmFsdWUodGlja3NbaW5kZXhdLnZhbHVlKTtcbiAgICB9XG4gICAgZ2V0VmFsdWVGb3JQaXhlbChwaXhlbCkge1xuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZCh0aGlzLl9zdGFydFZhbHVlICsgdGhpcy5nZXREZWNpbWFsRm9yUGl4ZWwocGl4ZWwpICogdGhpcy5fdmFsdWVSYW5nZSk7XG4gICAgfVxuICAgIGdldEJhc2VQaXhlbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYm90dG9tO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVUaWNrcyQxKGdlbmVyYXRpb25PcHRpb25zLCBkYXRhUmFuZ2UpIHtcbiAgICBjb25zdCB0aWNrcyA9IFtdO1xuICAgIGNvbnN0IE1JTl9TUEFDSU5HID0gMWUtMTQ7XG4gICAgY29uc3QgeyBib3VuZHMgLCBzdGVwICwgbWluICwgbWF4ICwgcHJlY2lzaW9uICwgY291bnQgLCBtYXhUaWNrcyAsIG1heERpZ2l0cyAsIGluY2x1ZGVCb3VuZHMgIH0gPSBnZW5lcmF0aW9uT3B0aW9ucztcbiAgICBjb25zdCB1bml0ID0gc3RlcCB8fCAxO1xuICAgIGNvbnN0IG1heFNwYWNlcyA9IG1heFRpY2tzIC0gMTtcbiAgICBjb25zdCB7IG1pbjogcm1pbiAsIG1heDogcm1heCAgfSA9IGRhdGFSYW5nZTtcbiAgICBjb25zdCBtaW5EZWZpbmVkID0gIWlzTnVsbE9yVW5kZWYobWluKTtcbiAgICBjb25zdCBtYXhEZWZpbmVkID0gIWlzTnVsbE9yVW5kZWYobWF4KTtcbiAgICBjb25zdCBjb3VudERlZmluZWQgPSAhaXNOdWxsT3JVbmRlZihjb3VudCk7XG4gICAgY29uc3QgbWluU3BhY2luZyA9IChybWF4IC0gcm1pbikgLyAobWF4RGlnaXRzICsgMSk7XG4gICAgbGV0IHNwYWNpbmcgPSBuaWNlTnVtKChybWF4IC0gcm1pbikgLyBtYXhTcGFjZXMgLyB1bml0KSAqIHVuaXQ7XG4gICAgbGV0IGZhY3RvciwgbmljZU1pbiwgbmljZU1heCwgbnVtU3BhY2VzO1xuICAgIGlmIChzcGFjaW5nIDwgTUlOX1NQQUNJTkcgJiYgIW1pbkRlZmluZWQgJiYgIW1heERlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogcm1pblxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogcm1heFxuICAgICAgICAgICAgfVxuICAgICAgICBdO1xuICAgIH1cbiAgICBudW1TcGFjZXMgPSBNYXRoLmNlaWwocm1heCAvIHNwYWNpbmcpIC0gTWF0aC5mbG9vcihybWluIC8gc3BhY2luZyk7XG4gICAgaWYgKG51bVNwYWNlcyA+IG1heFNwYWNlcykge1xuICAgICAgICBzcGFjaW5nID0gbmljZU51bShudW1TcGFjZXMgKiBzcGFjaW5nIC8gbWF4U3BhY2VzIC8gdW5pdCkgKiB1bml0O1xuICAgIH1cbiAgICBpZiAoIWlzTnVsbE9yVW5kZWYocHJlY2lzaW9uKSkge1xuICAgICAgICBmYWN0b3IgPSBNYXRoLnBvdygxMCwgcHJlY2lzaW9uKTtcbiAgICAgICAgc3BhY2luZyA9IE1hdGguY2VpbChzcGFjaW5nICogZmFjdG9yKSAvIGZhY3RvcjtcbiAgICB9XG4gICAgaWYgKGJvdW5kcyA9PT0gJ3RpY2tzJykge1xuICAgICAgICBuaWNlTWluID0gTWF0aC5mbG9vcihybWluIC8gc3BhY2luZykgKiBzcGFjaW5nO1xuICAgICAgICBuaWNlTWF4ID0gTWF0aC5jZWlsKHJtYXggLyBzcGFjaW5nKSAqIHNwYWNpbmc7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbmljZU1pbiA9IHJtaW47XG4gICAgICAgIG5pY2VNYXggPSBybWF4O1xuICAgIH1cbiAgICBpZiAobWluRGVmaW5lZCAmJiBtYXhEZWZpbmVkICYmIHN0ZXAgJiYgYWxtb3N0V2hvbGUoKG1heCAtIG1pbikgLyBzdGVwLCBzcGFjaW5nIC8gMTAwMCkpIHtcbiAgICAgICAgbnVtU3BhY2VzID0gTWF0aC5yb3VuZChNYXRoLm1pbigobWF4IC0gbWluKSAvIHNwYWNpbmcsIG1heFRpY2tzKSk7XG4gICAgICAgIHNwYWNpbmcgPSAobWF4IC0gbWluKSAvIG51bVNwYWNlcztcbiAgICAgICAgbmljZU1pbiA9IG1pbjtcbiAgICAgICAgbmljZU1heCA9IG1heDtcbiAgICB9IGVsc2UgaWYgKGNvdW50RGVmaW5lZCkge1xuICAgICAgICBuaWNlTWluID0gbWluRGVmaW5lZCA/IG1pbiA6IG5pY2VNaW47XG4gICAgICAgIG5pY2VNYXggPSBtYXhEZWZpbmVkID8gbWF4IDogbmljZU1heDtcbiAgICAgICAgbnVtU3BhY2VzID0gY291bnQgLSAxO1xuICAgICAgICBzcGFjaW5nID0gKG5pY2VNYXggLSBuaWNlTWluKSAvIG51bVNwYWNlcztcbiAgICB9IGVsc2Uge1xuICAgICAgICBudW1TcGFjZXMgPSAobmljZU1heCAtIG5pY2VNaW4pIC8gc3BhY2luZztcbiAgICAgICAgaWYgKGFsbW9zdEVxdWFscyhudW1TcGFjZXMsIE1hdGgucm91bmQobnVtU3BhY2VzKSwgc3BhY2luZyAvIDEwMDApKSB7XG4gICAgICAgICAgICBudW1TcGFjZXMgPSBNYXRoLnJvdW5kKG51bVNwYWNlcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBudW1TcGFjZXMgPSBNYXRoLmNlaWwobnVtU3BhY2VzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBkZWNpbWFsUGxhY2VzID0gTWF0aC5tYXgoX2RlY2ltYWxQbGFjZXMoc3BhY2luZyksIF9kZWNpbWFsUGxhY2VzKG5pY2VNaW4pKTtcbiAgICBmYWN0b3IgPSBNYXRoLnBvdygxMCwgaXNOdWxsT3JVbmRlZihwcmVjaXNpb24pID8gZGVjaW1hbFBsYWNlcyA6IHByZWNpc2lvbik7XG4gICAgbmljZU1pbiA9IE1hdGgucm91bmQobmljZU1pbiAqIGZhY3RvcikgLyBmYWN0b3I7XG4gICAgbmljZU1heCA9IE1hdGgucm91bmQobmljZU1heCAqIGZhY3RvcikgLyBmYWN0b3I7XG4gICAgbGV0IGogPSAwO1xuICAgIGlmIChtaW5EZWZpbmVkKSB7XG4gICAgICAgIGlmIChpbmNsdWRlQm91bmRzICYmIG5pY2VNaW4gIT09IG1pbikge1xuICAgICAgICAgICAgdGlja3MucHVzaCh7XG4gICAgICAgICAgICAgICAgdmFsdWU6IG1pblxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAobmljZU1pbiA8IG1pbikge1xuICAgICAgICAgICAgICAgIGorKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhbG1vc3RFcXVhbHMoTWF0aC5yb3VuZCgobmljZU1pbiArIGogKiBzcGFjaW5nKSAqIGZhY3RvcikgLyBmYWN0b3IsIG1pbiwgcmVsYXRpdmVMYWJlbFNpemUobWluLCBtaW5TcGFjaW5nLCBnZW5lcmF0aW9uT3B0aW9ucykpKSB7XG4gICAgICAgICAgICAgICAgaisrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKG5pY2VNaW4gPCBtaW4pIHtcbiAgICAgICAgICAgIGorKztcbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IoOyBqIDwgbnVtU3BhY2VzOyArK2ope1xuICAgICAgICBjb25zdCB0aWNrVmFsdWUgPSBNYXRoLnJvdW5kKChuaWNlTWluICsgaiAqIHNwYWNpbmcpICogZmFjdG9yKSAvIGZhY3RvcjtcbiAgICAgICAgaWYgKG1heERlZmluZWQgJiYgdGlja1ZhbHVlID4gbWF4KSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICB0aWNrcy5wdXNoKHtcbiAgICAgICAgICAgIHZhbHVlOiB0aWNrVmFsdWVcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChtYXhEZWZpbmVkICYmIGluY2x1ZGVCb3VuZHMgJiYgbmljZU1heCAhPT0gbWF4KSB7XG4gICAgICAgIGlmICh0aWNrcy5sZW5ndGggJiYgYWxtb3N0RXF1YWxzKHRpY2tzW3RpY2tzLmxlbmd0aCAtIDFdLnZhbHVlLCBtYXgsIHJlbGF0aXZlTGFiZWxTaXplKG1heCwgbWluU3BhY2luZywgZ2VuZXJhdGlvbk9wdGlvbnMpKSkge1xuICAgICAgICAgICAgdGlja3NbdGlja3MubGVuZ3RoIC0gMV0udmFsdWUgPSBtYXg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aWNrcy5wdXNoKHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogbWF4XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIW1heERlZmluZWQgfHwgbmljZU1heCA9PT0gbWF4KSB7XG4gICAgICAgIHRpY2tzLnB1c2goe1xuICAgICAgICAgICAgdmFsdWU6IG5pY2VNYXhcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aWNrcztcbn1cbmZ1bmN0aW9uIHJlbGF0aXZlTGFiZWxTaXplKHZhbHVlLCBtaW5TcGFjaW5nLCB7IGhvcml6b250YWwgLCBtaW5Sb3RhdGlvbiAgfSkge1xuICAgIGNvbnN0IHJhZCA9IHRvUmFkaWFucyhtaW5Sb3RhdGlvbik7XG4gICAgY29uc3QgcmF0aW8gPSAoaG9yaXpvbnRhbCA/IE1hdGguc2luKHJhZCkgOiBNYXRoLmNvcyhyYWQpKSB8fCAwLjAwMTtcbiAgICBjb25zdCBsZW5ndGggPSAwLjc1ICogbWluU3BhY2luZyAqICgnJyArIHZhbHVlKS5sZW5ndGg7XG4gICAgcmV0dXJuIE1hdGgubWluKG1pblNwYWNpbmcgLyByYXRpbywgbGVuZ3RoKTtcbn1cbmNsYXNzIExpbmVhclNjYWxlQmFzZSBleHRlbmRzIFNjYWxlIHtcbiAgICBjb25zdHJ1Y3RvcihjZmcpe1xuICAgICAgICBzdXBlcihjZmcpO1xuICAgICAgICAgdGhpcy5zdGFydCA9IHVuZGVmaW5lZDtcbiAgICAgICAgIHRoaXMuZW5kID0gdW5kZWZpbmVkO1xuICAgICAgICAgdGhpcy5fc3RhcnRWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgIHRoaXMuX2VuZFZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl92YWx1ZVJhbmdlID0gMDtcbiAgICB9XG4gICAgcGFyc2UocmF3LCBpbmRleCkge1xuICAgICAgICBpZiAoaXNOdWxsT3JVbmRlZihyYXcpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKHR5cGVvZiByYXcgPT09ICdudW1iZXInIHx8IHJhdyBpbnN0YW5jZW9mIE51bWJlcikgJiYgIWlzRmluaXRlKCtyYXcpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gK3JhdztcbiAgICB9XG4gICAgaGFuZGxlVGlja1JhbmdlT3B0aW9ucygpIHtcbiAgICAgICAgY29uc3QgeyBiZWdpbkF0WmVybyAgfSA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgY29uc3QgeyBtaW5EZWZpbmVkICwgbWF4RGVmaW5lZCAgfSA9IHRoaXMuZ2V0VXNlckJvdW5kcygpO1xuICAgICAgICBsZXQgeyBtaW4gLCBtYXggIH0gPSB0aGlzO1xuICAgICAgICBjb25zdCBzZXRNaW4gPSAodik9Pm1pbiA9IG1pbkRlZmluZWQgPyBtaW4gOiB2O1xuICAgICAgICBjb25zdCBzZXRNYXggPSAodik9Pm1heCA9IG1heERlZmluZWQgPyBtYXggOiB2O1xuICAgICAgICBpZiAoYmVnaW5BdFplcm8pIHtcbiAgICAgICAgICAgIGNvbnN0IG1pblNpZ24gPSBzaWduKG1pbik7XG4gICAgICAgICAgICBjb25zdCBtYXhTaWduID0gc2lnbihtYXgpO1xuICAgICAgICAgICAgaWYgKG1pblNpZ24gPCAwICYmIG1heFNpZ24gPCAwKSB7XG4gICAgICAgICAgICAgICAgc2V0TWF4KDApO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtaW5TaWduID4gMCAmJiBtYXhTaWduID4gMCkge1xuICAgICAgICAgICAgICAgIHNldE1pbigwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobWluID09PSBtYXgpIHtcbiAgICAgICAgICAgIGxldCBvZmZzZXQgPSBtYXggPT09IDAgPyAxIDogTWF0aC5hYnMobWF4ICogMC4wNSk7XG4gICAgICAgICAgICBzZXRNYXgobWF4ICsgb2Zmc2V0KTtcbiAgICAgICAgICAgIGlmICghYmVnaW5BdFplcm8pIHtcbiAgICAgICAgICAgICAgICBzZXRNaW4obWluIC0gb2Zmc2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1pbiA9IG1pbjtcbiAgICAgICAgdGhpcy5tYXggPSBtYXg7XG4gICAgfVxuICAgIGdldFRpY2tMaW1pdCgpIHtcbiAgICAgICAgY29uc3QgdGlja09wdHMgPSB0aGlzLm9wdGlvbnMudGlja3M7XG4gICAgICAgIGxldCB7IG1heFRpY2tzTGltaXQgLCBzdGVwU2l6ZSAgfSA9IHRpY2tPcHRzO1xuICAgICAgICBsZXQgbWF4VGlja3M7XG4gICAgICAgIGlmIChzdGVwU2l6ZSkge1xuICAgICAgICAgICAgbWF4VGlja3MgPSBNYXRoLmNlaWwodGhpcy5tYXggLyBzdGVwU2l6ZSkgLSBNYXRoLmZsb29yKHRoaXMubWluIC8gc3RlcFNpemUpICsgMTtcbiAgICAgICAgICAgIGlmIChtYXhUaWNrcyA+IDEwMDApIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYHNjYWxlcy4ke3RoaXMuaWR9LnRpY2tzLnN0ZXBTaXplOiAke3N0ZXBTaXplfSB3b3VsZCByZXN1bHQgZ2VuZXJhdGluZyB1cCB0byAke21heFRpY2tzfSB0aWNrcy4gTGltaXRpbmcgdG8gMTAwMC5gKTtcbiAgICAgICAgICAgICAgICBtYXhUaWNrcyA9IDEwMDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtYXhUaWNrcyA9IHRoaXMuY29tcHV0ZVRpY2tMaW1pdCgpO1xuICAgICAgICAgICAgbWF4VGlja3NMaW1pdCA9IG1heFRpY2tzTGltaXQgfHwgMTE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1heFRpY2tzTGltaXQpIHtcbiAgICAgICAgICAgIG1heFRpY2tzID0gTWF0aC5taW4obWF4VGlja3NMaW1pdCwgbWF4VGlja3MpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXhUaWNrcztcbiAgICB9XG4gY29tcHV0ZVRpY2tMaW1pdCgpIHtcbiAgICAgICAgcmV0dXJuIE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgICB9XG4gICAgYnVpbGRUaWNrcygpIHtcbiAgICAgICAgY29uc3Qgb3B0cyA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgY29uc3QgdGlja09wdHMgPSBvcHRzLnRpY2tzO1xuICAgICAgICBsZXQgbWF4VGlja3MgPSB0aGlzLmdldFRpY2tMaW1pdCgpO1xuICAgICAgICBtYXhUaWNrcyA9IE1hdGgubWF4KDIsIG1heFRpY2tzKTtcbiAgICAgICAgY29uc3QgbnVtZXJpY0dlbmVyYXRvck9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtYXhUaWNrcyxcbiAgICAgICAgICAgIGJvdW5kczogb3B0cy5ib3VuZHMsXG4gICAgICAgICAgICBtaW46IG9wdHMubWluLFxuICAgICAgICAgICAgbWF4OiBvcHRzLm1heCxcbiAgICAgICAgICAgIHByZWNpc2lvbjogdGlja09wdHMucHJlY2lzaW9uLFxuICAgICAgICAgICAgc3RlcDogdGlja09wdHMuc3RlcFNpemUsXG4gICAgICAgICAgICBjb3VudDogdGlja09wdHMuY291bnQsXG4gICAgICAgICAgICBtYXhEaWdpdHM6IHRoaXMuX21heERpZ2l0cygpLFxuICAgICAgICAgICAgaG9yaXpvbnRhbDogdGhpcy5pc0hvcml6b250YWwoKSxcbiAgICAgICAgICAgIG1pblJvdGF0aW9uOiB0aWNrT3B0cy5taW5Sb3RhdGlvbiB8fCAwLFxuICAgICAgICAgICAgaW5jbHVkZUJvdW5kczogdGlja09wdHMuaW5jbHVkZUJvdW5kcyAhPT0gZmFsc2VcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgZGF0YVJhbmdlID0gdGhpcy5fcmFuZ2UgfHwgdGhpcztcbiAgICAgICAgY29uc3QgdGlja3MgPSBnZW5lcmF0ZVRpY2tzJDEobnVtZXJpY0dlbmVyYXRvck9wdGlvbnMsIGRhdGFSYW5nZSk7XG4gICAgICAgIGlmIChvcHRzLmJvdW5kcyA9PT0gJ3RpY2tzJykge1xuICAgICAgICAgICAgX3NldE1pbkFuZE1heEJ5S2V5KHRpY2tzLCB0aGlzLCAndmFsdWUnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0cy5yZXZlcnNlKSB7XG4gICAgICAgICAgICB0aWNrcy5yZXZlcnNlKCk7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0ID0gdGhpcy5tYXg7XG4gICAgICAgICAgICB0aGlzLmVuZCA9IHRoaXMubWluO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zdGFydCA9IHRoaXMubWluO1xuICAgICAgICAgICAgdGhpcy5lbmQgPSB0aGlzLm1heDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGlja3M7XG4gICAgfVxuIGNvbmZpZ3VyZSgpIHtcbiAgICAgICAgY29uc3QgdGlja3MgPSB0aGlzLnRpY2tzO1xuICAgICAgICBsZXQgc3RhcnQgPSB0aGlzLm1pbjtcbiAgICAgICAgbGV0IGVuZCA9IHRoaXMubWF4O1xuICAgICAgICBzdXBlci5jb25maWd1cmUoKTtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5vZmZzZXQgJiYgdGlja3MubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBvZmZzZXQgPSAoZW5kIC0gc3RhcnQpIC8gTWF0aC5tYXgodGlja3MubGVuZ3RoIC0gMSwgMSkgLyAyO1xuICAgICAgICAgICAgc3RhcnQgLT0gb2Zmc2V0O1xuICAgICAgICAgICAgZW5kICs9IG9mZnNldDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zdGFydFZhbHVlID0gc3RhcnQ7XG4gICAgICAgIHRoaXMuX2VuZFZhbHVlID0gZW5kO1xuICAgICAgICB0aGlzLl92YWx1ZVJhbmdlID0gZW5kIC0gc3RhcnQ7XG4gICAgfVxuICAgIGdldExhYmVsRm9yVmFsdWUodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGZvcm1hdE51bWJlcih2YWx1ZSwgdGhpcy5jaGFydC5vcHRpb25zLmxvY2FsZSwgdGhpcy5vcHRpb25zLnRpY2tzLmZvcm1hdCk7XG4gICAgfVxufVxuXG5jbGFzcyBMaW5lYXJTY2FsZSBleHRlbmRzIExpbmVhclNjYWxlQmFzZSB7XG4gICAgc3RhdGljIGlkID0gJ2xpbmVhcic7XG4gc3RhdGljIGRlZmF1bHRzID0ge1xuICAgICAgICB0aWNrczoge1xuICAgICAgICAgICAgY2FsbGJhY2s6IFRpY2tzLmZvcm1hdHRlcnMubnVtZXJpY1xuICAgICAgICB9XG4gICAgfTtcbiAgICBkZXRlcm1pbmVEYXRhTGltaXRzKCkge1xuICAgICAgICBjb25zdCB7IG1pbiAsIG1heCAgfSA9IHRoaXMuZ2V0TWluTWF4KHRydWUpO1xuICAgICAgICB0aGlzLm1pbiA9IGlzTnVtYmVyRmluaXRlKG1pbikgPyBtaW4gOiAwO1xuICAgICAgICB0aGlzLm1heCA9IGlzTnVtYmVyRmluaXRlKG1heCkgPyBtYXggOiAxO1xuICAgICAgICB0aGlzLmhhbmRsZVRpY2tSYW5nZU9wdGlvbnMoKTtcbiAgICB9XG4gY29tcHV0ZVRpY2tMaW1pdCgpIHtcbiAgICAgICAgY29uc3QgaG9yaXpvbnRhbCA9IHRoaXMuaXNIb3Jpem9udGFsKCk7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IGhvcml6b250YWwgPyB0aGlzLndpZHRoIDogdGhpcy5oZWlnaHQ7XG4gICAgICAgIGNvbnN0IG1pblJvdGF0aW9uID0gdG9SYWRpYW5zKHRoaXMub3B0aW9ucy50aWNrcy5taW5Sb3RhdGlvbik7XG4gICAgICAgIGNvbnN0IHJhdGlvID0gKGhvcml6b250YWwgPyBNYXRoLnNpbihtaW5Sb3RhdGlvbikgOiBNYXRoLmNvcyhtaW5Sb3RhdGlvbikpIHx8IDAuMDAxO1xuICAgICAgICBjb25zdCB0aWNrRm9udCA9IHRoaXMuX3Jlc29sdmVUaWNrRm9udE9wdGlvbnMoMCk7XG4gICAgICAgIHJldHVybiBNYXRoLmNlaWwobGVuZ3RoIC8gTWF0aC5taW4oNDAsIHRpY2tGb250LmxpbmVIZWlnaHQgLyByYXRpbykpO1xuICAgIH1cbiAgICBnZXRQaXhlbEZvclZhbHVlKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gbnVsbCA/IE5hTiA6IHRoaXMuZ2V0UGl4ZWxGb3JEZWNpbWFsKCh2YWx1ZSAtIHRoaXMuX3N0YXJ0VmFsdWUpIC8gdGhpcy5fdmFsdWVSYW5nZSk7XG4gICAgfVxuICAgIGdldFZhbHVlRm9yUGl4ZWwocGl4ZWwpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXJ0VmFsdWUgKyB0aGlzLmdldERlY2ltYWxGb3JQaXhlbChwaXhlbCkgKiB0aGlzLl92YWx1ZVJhbmdlO1xuICAgIH1cbn1cblxuY29uc3QgbG9nMTBGbG9vciA9ICh2KT0+TWF0aC5mbG9vcihsb2cxMCh2KSk7XG5jb25zdCBjaGFuZ2VFeHBvbmVudCA9ICh2LCBtKT0+TWF0aC5wb3coMTAsIGxvZzEwRmxvb3IodikgKyBtKTtcbmZ1bmN0aW9uIGlzTWFqb3IodGlja1ZhbCkge1xuICAgIGNvbnN0IHJlbWFpbiA9IHRpY2tWYWwgLyBNYXRoLnBvdygxMCwgbG9nMTBGbG9vcih0aWNrVmFsKSk7XG4gICAgcmV0dXJuIHJlbWFpbiA9PT0gMTtcbn1cbmZ1bmN0aW9uIHN0ZXBzKG1pbiwgbWF4LCByYW5nZUV4cCkge1xuICAgIGNvbnN0IHJhbmdlU3RlcCA9IE1hdGgucG93KDEwLCByYW5nZUV4cCk7XG4gICAgY29uc3Qgc3RhcnQgPSBNYXRoLmZsb29yKG1pbiAvIHJhbmdlU3RlcCk7XG4gICAgY29uc3QgZW5kID0gTWF0aC5jZWlsKG1heCAvIHJhbmdlU3RlcCk7XG4gICAgcmV0dXJuIGVuZCAtIHN0YXJ0O1xufVxuZnVuY3Rpb24gc3RhcnRFeHAobWluLCBtYXgpIHtcbiAgICBjb25zdCByYW5nZSA9IG1heCAtIG1pbjtcbiAgICBsZXQgcmFuZ2VFeHAgPSBsb2cxMEZsb29yKHJhbmdlKTtcbiAgICB3aGlsZShzdGVwcyhtaW4sIG1heCwgcmFuZ2VFeHApID4gMTApe1xuICAgICAgICByYW5nZUV4cCsrO1xuICAgIH1cbiAgICB3aGlsZShzdGVwcyhtaW4sIG1heCwgcmFuZ2VFeHApIDwgMTApe1xuICAgICAgICByYW5nZUV4cC0tO1xuICAgIH1cbiAgICByZXR1cm4gTWF0aC5taW4ocmFuZ2VFeHAsIGxvZzEwRmxvb3IobWluKSk7XG59XG4gZnVuY3Rpb24gZ2VuZXJhdGVUaWNrcyhnZW5lcmF0aW9uT3B0aW9ucywgeyBtaW4gLCBtYXggIH0pIHtcbiAgICBtaW4gPSBmaW5pdGVPckRlZmF1bHQoZ2VuZXJhdGlvbk9wdGlvbnMubWluLCBtaW4pO1xuICAgIGNvbnN0IHRpY2tzID0gW107XG4gICAgY29uc3QgbWluRXhwID0gbG9nMTBGbG9vcihtaW4pO1xuICAgIGxldCBleHAgPSBzdGFydEV4cChtaW4sIG1heCk7XG4gICAgbGV0IHByZWNpc2lvbiA9IGV4cCA8IDAgPyBNYXRoLnBvdygxMCwgTWF0aC5hYnMoZXhwKSkgOiAxO1xuICAgIGNvbnN0IHN0ZXBTaXplID0gTWF0aC5wb3coMTAsIGV4cCk7XG4gICAgY29uc3QgYmFzZSA9IG1pbkV4cCA+IGV4cCA/IE1hdGgucG93KDEwLCBtaW5FeHApIDogMDtcbiAgICBjb25zdCBzdGFydCA9IE1hdGgucm91bmQoKG1pbiAtIGJhc2UpICogcHJlY2lzaW9uKSAvIHByZWNpc2lvbjtcbiAgICBjb25zdCBvZmZzZXQgPSBNYXRoLmZsb29yKChtaW4gLSBiYXNlKSAvIHN0ZXBTaXplIC8gMTApICogc3RlcFNpemUgKiAxMDtcbiAgICBsZXQgc2lnbmlmaWNhbmQgPSBNYXRoLmZsb29yKChzdGFydCAtIG9mZnNldCkgLyBNYXRoLnBvdygxMCwgZXhwKSk7XG4gICAgbGV0IHZhbHVlID0gZmluaXRlT3JEZWZhdWx0KGdlbmVyYXRpb25PcHRpb25zLm1pbiwgTWF0aC5yb3VuZCgoYmFzZSArIG9mZnNldCArIHNpZ25pZmljYW5kICogTWF0aC5wb3coMTAsIGV4cCkpICogcHJlY2lzaW9uKSAvIHByZWNpc2lvbik7XG4gICAgd2hpbGUodmFsdWUgPCBtYXgpe1xuICAgICAgICB0aWNrcy5wdXNoKHtcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgbWFqb3I6IGlzTWFqb3IodmFsdWUpLFxuICAgICAgICAgICAgc2lnbmlmaWNhbmRcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChzaWduaWZpY2FuZCA+PSAxMCkge1xuICAgICAgICAgICAgc2lnbmlmaWNhbmQgPSBzaWduaWZpY2FuZCA8IDE1ID8gMTUgOiAyMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNpZ25pZmljYW5kKys7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNpZ25pZmljYW5kID49IDIwKSB7XG4gICAgICAgICAgICBleHArKztcbiAgICAgICAgICAgIHNpZ25pZmljYW5kID0gMjtcbiAgICAgICAgICAgIHByZWNpc2lvbiA9IGV4cCA+PSAwID8gMSA6IHByZWNpc2lvbjtcbiAgICAgICAgfVxuICAgICAgICB2YWx1ZSA9IE1hdGgucm91bmQoKGJhc2UgKyBvZmZzZXQgKyBzaWduaWZpY2FuZCAqIE1hdGgucG93KDEwLCBleHApKSAqIHByZWNpc2lvbikgLyBwcmVjaXNpb247XG4gICAgfVxuICAgIGNvbnN0IGxhc3RUaWNrID0gZmluaXRlT3JEZWZhdWx0KGdlbmVyYXRpb25PcHRpb25zLm1heCwgdmFsdWUpO1xuICAgIHRpY2tzLnB1c2goe1xuICAgICAgICB2YWx1ZTogbGFzdFRpY2ssXG4gICAgICAgIG1ham9yOiBpc01ham9yKGxhc3RUaWNrKSxcbiAgICAgICAgc2lnbmlmaWNhbmRcbiAgICB9KTtcbiAgICByZXR1cm4gdGlja3M7XG59XG5jbGFzcyBMb2dhcml0aG1pY1NjYWxlIGV4dGVuZHMgU2NhbGUge1xuICAgIHN0YXRpYyBpZCA9ICdsb2dhcml0aG1pYyc7XG4gc3RhdGljIGRlZmF1bHRzID0ge1xuICAgICAgICB0aWNrczoge1xuICAgICAgICAgICAgY2FsbGJhY2s6IFRpY2tzLmZvcm1hdHRlcnMubG9nYXJpdGhtaWMsXG4gICAgICAgICAgICBtYWpvcjoge1xuICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgY29uc3RydWN0b3IoY2ZnKXtcbiAgICAgICAgc3VwZXIoY2ZnKTtcbiAgICAgICAgIHRoaXMuc3RhcnQgPSB1bmRlZmluZWQ7XG4gICAgICAgICB0aGlzLmVuZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgIHRoaXMuX3N0YXJ0VmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX3ZhbHVlUmFuZ2UgPSAwO1xuICAgIH1cbiAgICBwYXJzZShyYXcsIGluZGV4KSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gTGluZWFyU2NhbGVCYXNlLnByb3RvdHlwZS5wYXJzZS5hcHBseSh0aGlzLCBbXG4gICAgICAgICAgICByYXcsXG4gICAgICAgICAgICBpbmRleFxuICAgICAgICBdKTtcbiAgICAgICAgaWYgKHZhbHVlID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLl96ZXJvID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzTnVtYmVyRmluaXRlKHZhbHVlKSAmJiB2YWx1ZSA+IDAgPyB2YWx1ZSA6IG51bGw7XG4gICAgfVxuICAgIGRldGVybWluZURhdGFMaW1pdHMoKSB7XG4gICAgICAgIGNvbnN0IHsgbWluICwgbWF4ICB9ID0gdGhpcy5nZXRNaW5NYXgodHJ1ZSk7XG4gICAgICAgIHRoaXMubWluID0gaXNOdW1iZXJGaW5pdGUobWluKSA/IE1hdGgubWF4KDAsIG1pbikgOiBudWxsO1xuICAgICAgICB0aGlzLm1heCA9IGlzTnVtYmVyRmluaXRlKG1heCkgPyBNYXRoLm1heCgwLCBtYXgpIDogbnVsbDtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5iZWdpbkF0WmVybykge1xuICAgICAgICAgICAgdGhpcy5femVybyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3plcm8gJiYgdGhpcy5taW4gIT09IHRoaXMuX3N1Z2dlc3RlZE1pbiAmJiAhaXNOdW1iZXJGaW5pdGUodGhpcy5fdXNlck1pbikpIHtcbiAgICAgICAgICAgIHRoaXMubWluID0gbWluID09PSBjaGFuZ2VFeHBvbmVudCh0aGlzLm1pbiwgMCkgPyBjaGFuZ2VFeHBvbmVudCh0aGlzLm1pbiwgLTEpIDogY2hhbmdlRXhwb25lbnQodGhpcy5taW4sIDApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaGFuZGxlVGlja1JhbmdlT3B0aW9ucygpO1xuICAgIH1cbiAgICBoYW5kbGVUaWNrUmFuZ2VPcHRpb25zKCkge1xuICAgICAgICBjb25zdCB7IG1pbkRlZmluZWQgLCBtYXhEZWZpbmVkICB9ID0gdGhpcy5nZXRVc2VyQm91bmRzKCk7XG4gICAgICAgIGxldCBtaW4gPSB0aGlzLm1pbjtcbiAgICAgICAgbGV0IG1heCA9IHRoaXMubWF4O1xuICAgICAgICBjb25zdCBzZXRNaW4gPSAodik9Pm1pbiA9IG1pbkRlZmluZWQgPyBtaW4gOiB2O1xuICAgICAgICBjb25zdCBzZXRNYXggPSAodik9Pm1heCA9IG1heERlZmluZWQgPyBtYXggOiB2O1xuICAgICAgICBpZiAobWluID09PSBtYXgpIHtcbiAgICAgICAgICAgIGlmIChtaW4gPD0gMCkge1xuICAgICAgICAgICAgICAgIHNldE1pbigxKTtcbiAgICAgICAgICAgICAgICBzZXRNYXgoMTApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzZXRNaW4oY2hhbmdlRXhwb25lbnQobWluLCAtMSkpO1xuICAgICAgICAgICAgICAgIHNldE1heChjaGFuZ2VFeHBvbmVudChtYXgsICsxKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1pbiA8PSAwKSB7XG4gICAgICAgICAgICBzZXRNaW4oY2hhbmdlRXhwb25lbnQobWF4LCAtMSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYXggPD0gMCkge1xuICAgICAgICAgICAgc2V0TWF4KGNoYW5nZUV4cG9uZW50KG1pbiwgKzEpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1pbiA9IG1pbjtcbiAgICAgICAgdGhpcy5tYXggPSBtYXg7XG4gICAgfVxuICAgIGJ1aWxkVGlja3MoKSB7XG4gICAgICAgIGNvbnN0IG9wdHMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIGNvbnN0IGdlbmVyYXRpb25PcHRpb25zID0ge1xuICAgICAgICAgICAgbWluOiB0aGlzLl91c2VyTWluLFxuICAgICAgICAgICAgbWF4OiB0aGlzLl91c2VyTWF4XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHRpY2tzID0gZ2VuZXJhdGVUaWNrcyhnZW5lcmF0aW9uT3B0aW9ucywgdGhpcyk7XG4gICAgICAgIGlmIChvcHRzLmJvdW5kcyA9PT0gJ3RpY2tzJykge1xuICAgICAgICAgICAgX3NldE1pbkFuZE1heEJ5S2V5KHRpY2tzLCB0aGlzLCAndmFsdWUnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0cy5yZXZlcnNlKSB7XG4gICAgICAgICAgICB0aWNrcy5yZXZlcnNlKCk7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0ID0gdGhpcy5tYXg7XG4gICAgICAgICAgICB0aGlzLmVuZCA9IHRoaXMubWluO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zdGFydCA9IHRoaXMubWluO1xuICAgICAgICAgICAgdGhpcy5lbmQgPSB0aGlzLm1heDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGlja3M7XG4gICAgfVxuIGdldExhYmVsRm9yVmFsdWUodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgPyAnMCcgOiBmb3JtYXROdW1iZXIodmFsdWUsIHRoaXMuY2hhcnQub3B0aW9ucy5sb2NhbGUsIHRoaXMub3B0aW9ucy50aWNrcy5mb3JtYXQpO1xuICAgIH1cbiBjb25maWd1cmUoKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5taW47XG4gICAgICAgIHN1cGVyLmNvbmZpZ3VyZSgpO1xuICAgICAgICB0aGlzLl9zdGFydFZhbHVlID0gbG9nMTAoc3RhcnQpO1xuICAgICAgICB0aGlzLl92YWx1ZVJhbmdlID0gbG9nMTAodGhpcy5tYXgpIC0gbG9nMTAoc3RhcnQpO1xuICAgIH1cbiAgICBnZXRQaXhlbEZvclZhbHVlKHZhbHVlKSB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSAwKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHRoaXMubWluO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCBpc05hTih2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBOYU47XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGl4ZWxGb3JEZWNpbWFsKHZhbHVlID09PSB0aGlzLm1pbiA/IDAgOiAobG9nMTAodmFsdWUpIC0gdGhpcy5fc3RhcnRWYWx1ZSkgLyB0aGlzLl92YWx1ZVJhbmdlKTtcbiAgICB9XG4gICAgZ2V0VmFsdWVGb3JQaXhlbChwaXhlbCkge1xuICAgICAgICBjb25zdCBkZWNpbWFsID0gdGhpcy5nZXREZWNpbWFsRm9yUGl4ZWwocGl4ZWwpO1xuICAgICAgICByZXR1cm4gTWF0aC5wb3coMTAsIHRoaXMuX3N0YXJ0VmFsdWUgKyBkZWNpbWFsICogdGhpcy5fdmFsdWVSYW5nZSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBnZXRUaWNrQmFja2Ryb3BIZWlnaHQob3B0cykge1xuICAgIGNvbnN0IHRpY2tPcHRzID0gb3B0cy50aWNrcztcbiAgICBpZiAodGlja09wdHMuZGlzcGxheSAmJiBvcHRzLmRpc3BsYXkpIHtcbiAgICAgICAgY29uc3QgcGFkZGluZyA9IHRvUGFkZGluZyh0aWNrT3B0cy5iYWNrZHJvcFBhZGRpbmcpO1xuICAgICAgICByZXR1cm4gdmFsdWVPckRlZmF1bHQodGlja09wdHMuZm9udCAmJiB0aWNrT3B0cy5mb250LnNpemUsIGRlZmF1bHRzLmZvbnQuc2l6ZSkgKyBwYWRkaW5nLmhlaWdodDtcbiAgICB9XG4gICAgcmV0dXJuIDA7XG59XG5mdW5jdGlvbiBtZWFzdXJlTGFiZWxTaXplKGN0eCwgZm9udCwgbGFiZWwpIHtcbiAgICBsYWJlbCA9IGlzQXJyYXkobGFiZWwpID8gbGFiZWwgOiBbXG4gICAgICAgIGxhYmVsXG4gICAgXTtcbiAgICByZXR1cm4ge1xuICAgICAgICB3OiBfbG9uZ2VzdFRleHQoY3R4LCBmb250LnN0cmluZywgbGFiZWwpLFxuICAgICAgICBoOiBsYWJlbC5sZW5ndGggKiBmb250LmxpbmVIZWlnaHRcbiAgICB9O1xufVxuZnVuY3Rpb24gZGV0ZXJtaW5lTGltaXRzKGFuZ2xlLCBwb3MsIHNpemUsIG1pbiwgbWF4KSB7XG4gICAgaWYgKGFuZ2xlID09PSBtaW4gfHwgYW5nbGUgPT09IG1heCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3RhcnQ6IHBvcyAtIHNpemUgLyAyLFxuICAgICAgICAgICAgZW5kOiBwb3MgKyBzaXplIC8gMlxuICAgICAgICB9O1xuICAgIH0gZWxzZSBpZiAoYW5nbGUgPCBtaW4gfHwgYW5nbGUgPiBtYXgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN0YXJ0OiBwb3MgLSBzaXplLFxuICAgICAgICAgICAgZW5kOiBwb3NcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc3RhcnQ6IHBvcyxcbiAgICAgICAgZW5kOiBwb3MgKyBzaXplXG4gICAgfTtcbn1cbiBmdW5jdGlvbiBmaXRXaXRoUG9pbnRMYWJlbHMoc2NhbGUpIHtcbiAgICBjb25zdCBvcmlnID0ge1xuICAgICAgICBsOiBzY2FsZS5sZWZ0ICsgc2NhbGUuX3BhZGRpbmcubGVmdCxcbiAgICAgICAgcjogc2NhbGUucmlnaHQgLSBzY2FsZS5fcGFkZGluZy5yaWdodCxcbiAgICAgICAgdDogc2NhbGUudG9wICsgc2NhbGUuX3BhZGRpbmcudG9wLFxuICAgICAgICBiOiBzY2FsZS5ib3R0b20gLSBzY2FsZS5fcGFkZGluZy5ib3R0b21cbiAgICB9O1xuICAgIGNvbnN0IGxpbWl0cyA9IE9iamVjdC5hc3NpZ24oe30sIG9yaWcpO1xuICAgIGNvbnN0IGxhYmVsU2l6ZXMgPSBbXTtcbiAgICBjb25zdCBwYWRkaW5nID0gW107XG4gICAgY29uc3QgdmFsdWVDb3VudCA9IHNjYWxlLl9wb2ludExhYmVscy5sZW5ndGg7XG4gICAgY29uc3QgcG9pbnRMYWJlbE9wdHMgPSBzY2FsZS5vcHRpb25zLnBvaW50TGFiZWxzO1xuICAgIGNvbnN0IGFkZGl0aW9uYWxBbmdsZSA9IHBvaW50TGFiZWxPcHRzLmNlbnRlclBvaW50TGFiZWxzID8gUEkgLyB2YWx1ZUNvdW50IDogMDtcbiAgICBmb3IobGV0IGkgPSAwOyBpIDwgdmFsdWVDb3VudDsgaSsrKXtcbiAgICAgICAgY29uc3Qgb3B0cyA9IHBvaW50TGFiZWxPcHRzLnNldENvbnRleHQoc2NhbGUuZ2V0UG9pbnRMYWJlbENvbnRleHQoaSkpO1xuICAgICAgICBwYWRkaW5nW2ldID0gb3B0cy5wYWRkaW5nO1xuICAgICAgICBjb25zdCBwb2ludFBvc2l0aW9uID0gc2NhbGUuZ2V0UG9pbnRQb3NpdGlvbihpLCBzY2FsZS5kcmF3aW5nQXJlYSArIHBhZGRpbmdbaV0sIGFkZGl0aW9uYWxBbmdsZSk7XG4gICAgICAgIGNvbnN0IHBsRm9udCA9IHRvRm9udChvcHRzLmZvbnQpO1xuICAgICAgICBjb25zdCB0ZXh0U2l6ZSA9IG1lYXN1cmVMYWJlbFNpemUoc2NhbGUuY3R4LCBwbEZvbnQsIHNjYWxlLl9wb2ludExhYmVsc1tpXSk7XG4gICAgICAgIGxhYmVsU2l6ZXNbaV0gPSB0ZXh0U2l6ZTtcbiAgICAgICAgY29uc3QgYW5nbGVSYWRpYW5zID0gX25vcm1hbGl6ZUFuZ2xlKHNjYWxlLmdldEluZGV4QW5nbGUoaSkgKyBhZGRpdGlvbmFsQW5nbGUpO1xuICAgICAgICBjb25zdCBhbmdsZSA9IE1hdGgucm91bmQodG9EZWdyZWVzKGFuZ2xlUmFkaWFucykpO1xuICAgICAgICBjb25zdCBoTGltaXRzID0gZGV0ZXJtaW5lTGltaXRzKGFuZ2xlLCBwb2ludFBvc2l0aW9uLngsIHRleHRTaXplLncsIDAsIDE4MCk7XG4gICAgICAgIGNvbnN0IHZMaW1pdHMgPSBkZXRlcm1pbmVMaW1pdHMoYW5nbGUsIHBvaW50UG9zaXRpb24ueSwgdGV4dFNpemUuaCwgOTAsIDI3MCk7XG4gICAgICAgIHVwZGF0ZUxpbWl0cyhsaW1pdHMsIG9yaWcsIGFuZ2xlUmFkaWFucywgaExpbWl0cywgdkxpbWl0cyk7XG4gICAgfVxuICAgIHNjYWxlLnNldENlbnRlclBvaW50KG9yaWcubCAtIGxpbWl0cy5sLCBsaW1pdHMuciAtIG9yaWcuciwgb3JpZy50IC0gbGltaXRzLnQsIGxpbWl0cy5iIC0gb3JpZy5iKTtcbiAgICBzY2FsZS5fcG9pbnRMYWJlbEl0ZW1zID0gYnVpbGRQb2ludExhYmVsSXRlbXMoc2NhbGUsIGxhYmVsU2l6ZXMsIHBhZGRpbmcpO1xufVxuZnVuY3Rpb24gdXBkYXRlTGltaXRzKGxpbWl0cywgb3JpZywgYW5nbGUsIGhMaW1pdHMsIHZMaW1pdHMpIHtcbiAgICBjb25zdCBzaW4gPSBNYXRoLmFicyhNYXRoLnNpbihhbmdsZSkpO1xuICAgIGNvbnN0IGNvcyA9IE1hdGguYWJzKE1hdGguY29zKGFuZ2xlKSk7XG4gICAgbGV0IHggPSAwO1xuICAgIGxldCB5ID0gMDtcbiAgICBpZiAoaExpbWl0cy5zdGFydCA8IG9yaWcubCkge1xuICAgICAgICB4ID0gKG9yaWcubCAtIGhMaW1pdHMuc3RhcnQpIC8gc2luO1xuICAgICAgICBsaW1pdHMubCA9IE1hdGgubWluKGxpbWl0cy5sLCBvcmlnLmwgLSB4KTtcbiAgICB9IGVsc2UgaWYgKGhMaW1pdHMuZW5kID4gb3JpZy5yKSB7XG4gICAgICAgIHggPSAoaExpbWl0cy5lbmQgLSBvcmlnLnIpIC8gc2luO1xuICAgICAgICBsaW1pdHMuciA9IE1hdGgubWF4KGxpbWl0cy5yLCBvcmlnLnIgKyB4KTtcbiAgICB9XG4gICAgaWYgKHZMaW1pdHMuc3RhcnQgPCBvcmlnLnQpIHtcbiAgICAgICAgeSA9IChvcmlnLnQgLSB2TGltaXRzLnN0YXJ0KSAvIGNvcztcbiAgICAgICAgbGltaXRzLnQgPSBNYXRoLm1pbihsaW1pdHMudCwgb3JpZy50IC0geSk7XG4gICAgfSBlbHNlIGlmICh2TGltaXRzLmVuZCA+IG9yaWcuYikge1xuICAgICAgICB5ID0gKHZMaW1pdHMuZW5kIC0gb3JpZy5iKSAvIGNvcztcbiAgICAgICAgbGltaXRzLmIgPSBNYXRoLm1heChsaW1pdHMuYiwgb3JpZy5iICsgeSk7XG4gICAgfVxufVxuZnVuY3Rpb24gY3JlYXRlUG9pbnRMYWJlbEl0ZW0oc2NhbGUsIGluZGV4LCBpdGVtT3B0cykge1xuICAgIGNvbnN0IG91dGVyRGlzdGFuY2UgPSBzY2FsZS5kcmF3aW5nQXJlYTtcbiAgICBjb25zdCB7IGV4dHJhICwgYWRkaXRpb25hbEFuZ2xlICwgcGFkZGluZyAsIHNpemUgIH0gPSBpdGVtT3B0cztcbiAgICBjb25zdCBwb2ludExhYmVsUG9zaXRpb24gPSBzY2FsZS5nZXRQb2ludFBvc2l0aW9uKGluZGV4LCBvdXRlckRpc3RhbmNlICsgZXh0cmEgKyBwYWRkaW5nLCBhZGRpdGlvbmFsQW5nbGUpO1xuICAgIGNvbnN0IGFuZ2xlID0gTWF0aC5yb3VuZCh0b0RlZ3JlZXMoX25vcm1hbGl6ZUFuZ2xlKHBvaW50TGFiZWxQb3NpdGlvbi5hbmdsZSArIEhBTEZfUEkpKSk7XG4gICAgY29uc3QgeSA9IHlGb3JBbmdsZShwb2ludExhYmVsUG9zaXRpb24ueSwgc2l6ZS5oLCBhbmdsZSk7XG4gICAgY29uc3QgdGV4dEFsaWduID0gZ2V0VGV4dEFsaWduRm9yQW5nbGUoYW5nbGUpO1xuICAgIGNvbnN0IGxlZnQgPSBsZWZ0Rm9yVGV4dEFsaWduKHBvaW50TGFiZWxQb3NpdGlvbi54LCBzaXplLncsIHRleHRBbGlnbik7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdmlzaWJsZTogdHJ1ZSxcbiAgICAgICAgeDogcG9pbnRMYWJlbFBvc2l0aW9uLngsXG4gICAgICAgIHksXG4gICAgICAgIHRleHRBbGlnbixcbiAgICAgICAgbGVmdCxcbiAgICAgICAgdG9wOiB5LFxuICAgICAgICByaWdodDogbGVmdCArIHNpemUudyxcbiAgICAgICAgYm90dG9tOiB5ICsgc2l6ZS5oXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGlzTm90T3ZlcmxhcHBlZChpdGVtLCBhcmVhKSB7XG4gICAgaWYgKCFhcmVhKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCB7IGxlZnQgLCB0b3AgLCByaWdodCAsIGJvdHRvbSAgfSA9IGl0ZW07XG4gICAgY29uc3QgYXBleGVzSW5BcmVhID0gX2lzUG9pbnRJbkFyZWEoe1xuICAgICAgICB4OiBsZWZ0LFxuICAgICAgICB5OiB0b3BcbiAgICB9LCBhcmVhKSB8fCBfaXNQb2ludEluQXJlYSh7XG4gICAgICAgIHg6IGxlZnQsXG4gICAgICAgIHk6IGJvdHRvbVxuICAgIH0sIGFyZWEpIHx8IF9pc1BvaW50SW5BcmVhKHtcbiAgICAgICAgeDogcmlnaHQsXG4gICAgICAgIHk6IHRvcFxuICAgIH0sIGFyZWEpIHx8IF9pc1BvaW50SW5BcmVhKHtcbiAgICAgICAgeDogcmlnaHQsXG4gICAgICAgIHk6IGJvdHRvbVxuICAgIH0sIGFyZWEpO1xuICAgIHJldHVybiAhYXBleGVzSW5BcmVhO1xufVxuZnVuY3Rpb24gYnVpbGRQb2ludExhYmVsSXRlbXMoc2NhbGUsIGxhYmVsU2l6ZXMsIHBhZGRpbmcpIHtcbiAgICBjb25zdCBpdGVtcyA9IFtdO1xuICAgIGNvbnN0IHZhbHVlQ291bnQgPSBzY2FsZS5fcG9pbnRMYWJlbHMubGVuZ3RoO1xuICAgIGNvbnN0IG9wdHMgPSBzY2FsZS5vcHRpb25zO1xuICAgIGNvbnN0IHsgY2VudGVyUG9pbnRMYWJlbHMgLCBkaXNwbGF5ICB9ID0gb3B0cy5wb2ludExhYmVscztcbiAgICBjb25zdCBpdGVtT3B0cyA9IHtcbiAgICAgICAgZXh0cmE6IGdldFRpY2tCYWNrZHJvcEhlaWdodChvcHRzKSAvIDIsXG4gICAgICAgIGFkZGl0aW9uYWxBbmdsZTogY2VudGVyUG9pbnRMYWJlbHMgPyBQSSAvIHZhbHVlQ291bnQgOiAwXG4gICAgfTtcbiAgICBsZXQgYXJlYTtcbiAgICBmb3IobGV0IGkgPSAwOyBpIDwgdmFsdWVDb3VudDsgaSsrKXtcbiAgICAgICAgaXRlbU9wdHMucGFkZGluZyA9IHBhZGRpbmdbaV07XG4gICAgICAgIGl0ZW1PcHRzLnNpemUgPSBsYWJlbFNpemVzW2ldO1xuICAgICAgICBjb25zdCBpdGVtID0gY3JlYXRlUG9pbnRMYWJlbEl0ZW0oc2NhbGUsIGksIGl0ZW1PcHRzKTtcbiAgICAgICAgaXRlbXMucHVzaChpdGVtKTtcbiAgICAgICAgaWYgKGRpc3BsYXkgPT09ICdhdXRvJykge1xuICAgICAgICAgICAgaXRlbS52aXNpYmxlID0gaXNOb3RPdmVybGFwcGVkKGl0ZW0sIGFyZWEpO1xuICAgICAgICAgICAgaWYgKGl0ZW0udmlzaWJsZSkge1xuICAgICAgICAgICAgICAgIGFyZWEgPSBpdGVtO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpdGVtcztcbn1cbmZ1bmN0aW9uIGdldFRleHRBbGlnbkZvckFuZ2xlKGFuZ2xlKSB7XG4gICAgaWYgKGFuZ2xlID09PSAwIHx8IGFuZ2xlID09PSAxODApIHtcbiAgICAgICAgcmV0dXJuICdjZW50ZXInO1xuICAgIH0gZWxzZSBpZiAoYW5nbGUgPCAxODApIHtcbiAgICAgICAgcmV0dXJuICdsZWZ0JztcbiAgICB9XG4gICAgcmV0dXJuICdyaWdodCc7XG59XG5mdW5jdGlvbiBsZWZ0Rm9yVGV4dEFsaWduKHgsIHcsIGFsaWduKSB7XG4gICAgaWYgKGFsaWduID09PSAncmlnaHQnKSB7XG4gICAgICAgIHggLT0gdztcbiAgICB9IGVsc2UgaWYgKGFsaWduID09PSAnY2VudGVyJykge1xuICAgICAgICB4IC09IHcgLyAyO1xuICAgIH1cbiAgICByZXR1cm4geDtcbn1cbmZ1bmN0aW9uIHlGb3JBbmdsZSh5LCBoLCBhbmdsZSkge1xuICAgIGlmIChhbmdsZSA9PT0gOTAgfHwgYW5nbGUgPT09IDI3MCkge1xuICAgICAgICB5IC09IGggLyAyO1xuICAgIH0gZWxzZSBpZiAoYW5nbGUgPiAyNzAgfHwgYW5nbGUgPCA5MCkge1xuICAgICAgICB5IC09IGg7XG4gICAgfVxuICAgIHJldHVybiB5O1xufVxuZnVuY3Rpb24gZHJhd1BvaW50TGFiZWxCb3goY3R4LCBvcHRzLCBpdGVtKSB7XG4gICAgY29uc3QgeyBsZWZ0ICwgdG9wICwgcmlnaHQgLCBib3R0b20gIH0gPSBpdGVtO1xuICAgIGNvbnN0IHsgYmFja2Ryb3BDb2xvciAgfSA9IG9wdHM7XG4gICAgaWYgKCFpc051bGxPclVuZGVmKGJhY2tkcm9wQ29sb3IpKSB7XG4gICAgICAgIGNvbnN0IGJvcmRlclJhZGl1cyA9IHRvVFJCTENvcm5lcnMob3B0cy5ib3JkZXJSYWRpdXMpO1xuICAgICAgICBjb25zdCBwYWRkaW5nID0gdG9QYWRkaW5nKG9wdHMuYmFja2Ryb3BQYWRkaW5nKTtcbiAgICAgICAgY3R4LmZpbGxTdHlsZSA9IGJhY2tkcm9wQ29sb3I7XG4gICAgICAgIGNvbnN0IGJhY2tkcm9wTGVmdCA9IGxlZnQgLSBwYWRkaW5nLmxlZnQ7XG4gICAgICAgIGNvbnN0IGJhY2tkcm9wVG9wID0gdG9wIC0gcGFkZGluZy50b3A7XG4gICAgICAgIGNvbnN0IGJhY2tkcm9wV2lkdGggPSByaWdodCAtIGxlZnQgKyBwYWRkaW5nLndpZHRoO1xuICAgICAgICBjb25zdCBiYWNrZHJvcEhlaWdodCA9IGJvdHRvbSAtIHRvcCArIHBhZGRpbmcuaGVpZ2h0O1xuICAgICAgICBpZiAoT2JqZWN0LnZhbHVlcyhib3JkZXJSYWRpdXMpLnNvbWUoKHYpPT52ICE9PSAwKSkge1xuICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgICAgICAgYWRkUm91bmRlZFJlY3RQYXRoKGN0eCwge1xuICAgICAgICAgICAgICAgIHg6IGJhY2tkcm9wTGVmdCxcbiAgICAgICAgICAgICAgICB5OiBiYWNrZHJvcFRvcCxcbiAgICAgICAgICAgICAgICB3OiBiYWNrZHJvcFdpZHRoLFxuICAgICAgICAgICAgICAgIGg6IGJhY2tkcm9wSGVpZ2h0LFxuICAgICAgICAgICAgICAgIHJhZGl1czogYm9yZGVyUmFkaXVzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGN0eC5maWxsKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjdHguZmlsbFJlY3QoYmFja2Ryb3BMZWZ0LCBiYWNrZHJvcFRvcCwgYmFja2Ryb3BXaWR0aCwgYmFja2Ryb3BIZWlnaHQpO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gZHJhd1BvaW50TGFiZWxzKHNjYWxlLCBsYWJlbENvdW50KSB7XG4gICAgY29uc3QgeyBjdHggLCBvcHRpb25zOiB7IHBvaW50TGFiZWxzICB9ICB9ID0gc2NhbGU7XG4gICAgZm9yKGxldCBpID0gbGFiZWxDb3VudCAtIDE7IGkgPj0gMDsgaS0tKXtcbiAgICAgICAgY29uc3QgaXRlbSA9IHNjYWxlLl9wb2ludExhYmVsSXRlbXNbaV07XG4gICAgICAgIGlmICghaXRlbS52aXNpYmxlKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcHRzQXRJbmRleCA9IHBvaW50TGFiZWxzLnNldENvbnRleHQoc2NhbGUuZ2V0UG9pbnRMYWJlbENvbnRleHQoaSkpO1xuICAgICAgICBkcmF3UG9pbnRMYWJlbEJveChjdHgsIG9wdHNBdEluZGV4LCBpdGVtKTtcbiAgICAgICAgY29uc3QgcGxGb250ID0gdG9Gb250KG9wdHNBdEluZGV4LmZvbnQpO1xuICAgICAgICBjb25zdCB7IHggLCB5ICwgdGV4dEFsaWduICB9ID0gaXRlbTtcbiAgICAgICAgcmVuZGVyVGV4dChjdHgsIHNjYWxlLl9wb2ludExhYmVsc1tpXSwgeCwgeSArIHBsRm9udC5saW5lSGVpZ2h0IC8gMiwgcGxGb250LCB7XG4gICAgICAgICAgICBjb2xvcjogb3B0c0F0SW5kZXguY29sb3IsXG4gICAgICAgICAgICB0ZXh0QWxpZ246IHRleHRBbGlnbixcbiAgICAgICAgICAgIHRleHRCYXNlbGluZTogJ21pZGRsZSdcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZnVuY3Rpb24gcGF0aFJhZGl1c0xpbmUoc2NhbGUsIHJhZGl1cywgY2lyY3VsYXIsIGxhYmVsQ291bnQpIHtcbiAgICBjb25zdCB7IGN0eCAgfSA9IHNjYWxlO1xuICAgIGlmIChjaXJjdWxhcikge1xuICAgICAgICBjdHguYXJjKHNjYWxlLnhDZW50ZXIsIHNjYWxlLnlDZW50ZXIsIHJhZGl1cywgMCwgVEFVKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgcG9pbnRQb3NpdGlvbiA9IHNjYWxlLmdldFBvaW50UG9zaXRpb24oMCwgcmFkaXVzKTtcbiAgICAgICAgY3R4Lm1vdmVUbyhwb2ludFBvc2l0aW9uLngsIHBvaW50UG9zaXRpb24ueSk7XG4gICAgICAgIGZvcihsZXQgaSA9IDE7IGkgPCBsYWJlbENvdW50OyBpKyspe1xuICAgICAgICAgICAgcG9pbnRQb3NpdGlvbiA9IHNjYWxlLmdldFBvaW50UG9zaXRpb24oaSwgcmFkaXVzKTtcbiAgICAgICAgICAgIGN0eC5saW5lVG8ocG9pbnRQb3NpdGlvbi54LCBwb2ludFBvc2l0aW9uLnkpO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gZHJhd1JhZGl1c0xpbmUoc2NhbGUsIGdyaWRMaW5lT3B0cywgcmFkaXVzLCBsYWJlbENvdW50LCBib3JkZXJPcHRzKSB7XG4gICAgY29uc3QgY3R4ID0gc2NhbGUuY3R4O1xuICAgIGNvbnN0IGNpcmN1bGFyID0gZ3JpZExpbmVPcHRzLmNpcmN1bGFyO1xuICAgIGNvbnN0IHsgY29sb3IgLCBsaW5lV2lkdGggIH0gPSBncmlkTGluZU9wdHM7XG4gICAgaWYgKCFjaXJjdWxhciAmJiAhbGFiZWxDb3VudCB8fCAhY29sb3IgfHwgIWxpbmVXaWR0aCB8fCByYWRpdXMgPCAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY3R4LnNhdmUoKTtcbiAgICBjdHguc3Ryb2tlU3R5bGUgPSBjb2xvcjtcbiAgICBjdHgubGluZVdpZHRoID0gbGluZVdpZHRoO1xuICAgIGN0eC5zZXRMaW5lRGFzaChib3JkZXJPcHRzLmRhc2gpO1xuICAgIGN0eC5saW5lRGFzaE9mZnNldCA9IGJvcmRlck9wdHMuZGFzaE9mZnNldDtcbiAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgcGF0aFJhZGl1c0xpbmUoc2NhbGUsIHJhZGl1cywgY2lyY3VsYXIsIGxhYmVsQ291bnQpO1xuICAgIGN0eC5jbG9zZVBhdGgoKTtcbiAgICBjdHguc3Ryb2tlKCk7XG4gICAgY3R4LnJlc3RvcmUoKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVBvaW50TGFiZWxDb250ZXh0KHBhcmVudCwgaW5kZXgsIGxhYmVsKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUNvbnRleHQocGFyZW50LCB7XG4gICAgICAgIGxhYmVsLFxuICAgICAgICBpbmRleCxcbiAgICAgICAgdHlwZTogJ3BvaW50TGFiZWwnXG4gICAgfSk7XG59XG5jbGFzcyBSYWRpYWxMaW5lYXJTY2FsZSBleHRlbmRzIExpbmVhclNjYWxlQmFzZSB7XG4gICAgc3RhdGljIGlkID0gJ3JhZGlhbExpbmVhcic7XG4gc3RhdGljIGRlZmF1bHRzID0ge1xuICAgICAgICBkaXNwbGF5OiB0cnVlLFxuICAgICAgICBhbmltYXRlOiB0cnVlLFxuICAgICAgICBwb3NpdGlvbjogJ2NoYXJ0QXJlYScsXG4gICAgICAgIGFuZ2xlTGluZXM6IHtcbiAgICAgICAgICAgIGRpc3BsYXk6IHRydWUsXG4gICAgICAgICAgICBsaW5lV2lkdGg6IDEsXG4gICAgICAgICAgICBib3JkZXJEYXNoOiBbXSxcbiAgICAgICAgICAgIGJvcmRlckRhc2hPZmZzZXQ6IDAuMFxuICAgICAgICB9LFxuICAgICAgICBncmlkOiB7XG4gICAgICAgICAgICBjaXJjdWxhcjogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgc3RhcnRBbmdsZTogMCxcbiAgICAgICAgdGlja3M6IHtcbiAgICAgICAgICAgIHNob3dMYWJlbEJhY2tkcm9wOiB0cnVlLFxuICAgICAgICAgICAgY2FsbGJhY2s6IFRpY2tzLmZvcm1hdHRlcnMubnVtZXJpY1xuICAgICAgICB9LFxuICAgICAgICBwb2ludExhYmVsczoge1xuICAgICAgICAgICAgYmFja2Ryb3BDb2xvcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgYmFja2Ryb3BQYWRkaW5nOiAyLFxuICAgICAgICAgICAgZGlzcGxheTogdHJ1ZSxcbiAgICAgICAgICAgIGZvbnQ6IHtcbiAgICAgICAgICAgICAgICBzaXplOiAxMFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNhbGxiYWNrIChsYWJlbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBsYWJlbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwYWRkaW5nOiA1LFxuICAgICAgICAgICAgY2VudGVyUG9pbnRMYWJlbHM6IGZhbHNlXG4gICAgICAgIH1cbiAgICB9O1xuICAgIHN0YXRpYyBkZWZhdWx0Um91dGVzID0ge1xuICAgICAgICAnYW5nbGVMaW5lcy5jb2xvcic6ICdib3JkZXJDb2xvcicsXG4gICAgICAgICdwb2ludExhYmVscy5jb2xvcic6ICdjb2xvcicsXG4gICAgICAgICd0aWNrcy5jb2xvcic6ICdjb2xvcidcbiAgICB9O1xuICAgIHN0YXRpYyBkZXNjcmlwdG9ycyA9IHtcbiAgICAgICAgYW5nbGVMaW5lczoge1xuICAgICAgICAgICAgX2ZhbGxiYWNrOiAnZ3JpZCdcbiAgICAgICAgfVxuICAgIH07XG4gICAgY29uc3RydWN0b3IoY2ZnKXtcbiAgICAgICAgc3VwZXIoY2ZnKTtcbiAgICAgICAgIHRoaXMueENlbnRlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgIHRoaXMueUNlbnRlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgIHRoaXMuZHJhd2luZ0FyZWEgPSB1bmRlZmluZWQ7XG4gICAgICAgICB0aGlzLl9wb2ludExhYmVscyA9IFtdO1xuICAgICAgICB0aGlzLl9wb2ludExhYmVsSXRlbXMgPSBbXTtcbiAgICB9XG4gICAgc2V0RGltZW5zaW9ucygpIHtcbiAgICAgICAgY29uc3QgcGFkZGluZyA9IHRoaXMuX3BhZGRpbmcgPSB0b1BhZGRpbmcoZ2V0VGlja0JhY2tkcm9wSGVpZ2h0KHRoaXMub3B0aW9ucykgLyAyKTtcbiAgICAgICAgY29uc3QgdyA9IHRoaXMud2lkdGggPSB0aGlzLm1heFdpZHRoIC0gcGFkZGluZy53aWR0aDtcbiAgICAgICAgY29uc3QgaCA9IHRoaXMuaGVpZ2h0ID0gdGhpcy5tYXhIZWlnaHQgLSBwYWRkaW5nLmhlaWdodDtcbiAgICAgICAgdGhpcy54Q2VudGVyID0gTWF0aC5mbG9vcih0aGlzLmxlZnQgKyB3IC8gMiArIHBhZGRpbmcubGVmdCk7XG4gICAgICAgIHRoaXMueUNlbnRlciA9IE1hdGguZmxvb3IodGhpcy50b3AgKyBoIC8gMiArIHBhZGRpbmcudG9wKTtcbiAgICAgICAgdGhpcy5kcmF3aW5nQXJlYSA9IE1hdGguZmxvb3IoTWF0aC5taW4odywgaCkgLyAyKTtcbiAgICB9XG4gICAgZGV0ZXJtaW5lRGF0YUxpbWl0cygpIHtcbiAgICAgICAgY29uc3QgeyBtaW4gLCBtYXggIH0gPSB0aGlzLmdldE1pbk1heChmYWxzZSk7XG4gICAgICAgIHRoaXMubWluID0gaXNOdW1iZXJGaW5pdGUobWluKSAmJiAhaXNOYU4obWluKSA/IG1pbiA6IDA7XG4gICAgICAgIHRoaXMubWF4ID0gaXNOdW1iZXJGaW5pdGUobWF4KSAmJiAhaXNOYU4obWF4KSA/IG1heCA6IDA7XG4gICAgICAgIHRoaXMuaGFuZGxlVGlja1JhbmdlT3B0aW9ucygpO1xuICAgIH1cbiBjb21wdXRlVGlja0xpbWl0KCkge1xuICAgICAgICByZXR1cm4gTWF0aC5jZWlsKHRoaXMuZHJhd2luZ0FyZWEgLyBnZXRUaWNrQmFja2Ryb3BIZWlnaHQodGhpcy5vcHRpb25zKSk7XG4gICAgfVxuICAgIGdlbmVyYXRlVGlja0xhYmVscyh0aWNrcykge1xuICAgICAgICBMaW5lYXJTY2FsZUJhc2UucHJvdG90eXBlLmdlbmVyYXRlVGlja0xhYmVscy5jYWxsKHRoaXMsIHRpY2tzKTtcbiAgICAgICAgdGhpcy5fcG9pbnRMYWJlbHMgPSB0aGlzLmdldExhYmVscygpLm1hcCgodmFsdWUsIGluZGV4KT0+e1xuICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBjYWxsYmFjayh0aGlzLm9wdGlvbnMucG9pbnRMYWJlbHMuY2FsbGJhY2ssIFtcbiAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICBpbmRleFxuICAgICAgICAgICAgXSwgdGhpcyk7XG4gICAgICAgICAgICByZXR1cm4gbGFiZWwgfHwgbGFiZWwgPT09IDAgPyBsYWJlbCA6ICcnO1xuICAgICAgICB9KS5maWx0ZXIoKHYsIGkpPT50aGlzLmNoYXJ0LmdldERhdGFWaXNpYmlsaXR5KGkpKTtcbiAgICB9XG4gICAgZml0KCkge1xuICAgICAgICBjb25zdCBvcHRzID0gdGhpcy5vcHRpb25zO1xuICAgICAgICBpZiAob3B0cy5kaXNwbGF5ICYmIG9wdHMucG9pbnRMYWJlbHMuZGlzcGxheSkge1xuICAgICAgICAgICAgZml0V2l0aFBvaW50TGFiZWxzKHRoaXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZXRDZW50ZXJQb2ludCgwLCAwLCAwLCAwKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRDZW50ZXJQb2ludChsZWZ0TW92ZW1lbnQsIHJpZ2h0TW92ZW1lbnQsIHRvcE1vdmVtZW50LCBib3R0b21Nb3ZlbWVudCkge1xuICAgICAgICB0aGlzLnhDZW50ZXIgKz0gTWF0aC5mbG9vcigobGVmdE1vdmVtZW50IC0gcmlnaHRNb3ZlbWVudCkgLyAyKTtcbiAgICAgICAgdGhpcy55Q2VudGVyICs9IE1hdGguZmxvb3IoKHRvcE1vdmVtZW50IC0gYm90dG9tTW92ZW1lbnQpIC8gMik7XG4gICAgICAgIHRoaXMuZHJhd2luZ0FyZWEgLT0gTWF0aC5taW4odGhpcy5kcmF3aW5nQXJlYSAvIDIsIE1hdGgubWF4KGxlZnRNb3ZlbWVudCwgcmlnaHRNb3ZlbWVudCwgdG9wTW92ZW1lbnQsIGJvdHRvbU1vdmVtZW50KSk7XG4gICAgfVxuICAgIGdldEluZGV4QW5nbGUoaW5kZXgpIHtcbiAgICAgICAgY29uc3QgYW5nbGVNdWx0aXBsaWVyID0gVEFVIC8gKHRoaXMuX3BvaW50TGFiZWxzLmxlbmd0aCB8fCAxKTtcbiAgICAgICAgY29uc3Qgc3RhcnRBbmdsZSA9IHRoaXMub3B0aW9ucy5zdGFydEFuZ2xlIHx8IDA7XG4gICAgICAgIHJldHVybiBfbm9ybWFsaXplQW5nbGUoaW5kZXggKiBhbmdsZU11bHRpcGxpZXIgKyB0b1JhZGlhbnMoc3RhcnRBbmdsZSkpO1xuICAgIH1cbiAgICBnZXREaXN0YW5jZUZyb21DZW50ZXJGb3JWYWx1ZSh2YWx1ZSkge1xuICAgICAgICBpZiAoaXNOdWxsT3JVbmRlZih2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBOYU47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2NhbGluZ0ZhY3RvciA9IHRoaXMuZHJhd2luZ0FyZWEgLyAodGhpcy5tYXggLSB0aGlzLm1pbik7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMucmV2ZXJzZSkge1xuICAgICAgICAgICAgcmV0dXJuICh0aGlzLm1heCAtIHZhbHVlKSAqIHNjYWxpbmdGYWN0b3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICh2YWx1ZSAtIHRoaXMubWluKSAqIHNjYWxpbmdGYWN0b3I7XG4gICAgfVxuICAgIGdldFZhbHVlRm9yRGlzdGFuY2VGcm9tQ2VudGVyKGRpc3RhbmNlKSB7XG4gICAgICAgIGlmIChpc051bGxPclVuZGVmKGRpc3RhbmNlKSkge1xuICAgICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzY2FsZWREaXN0YW5jZSA9IGRpc3RhbmNlIC8gKHRoaXMuZHJhd2luZ0FyZWEgLyAodGhpcy5tYXggLSB0aGlzLm1pbikpO1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLnJldmVyc2UgPyB0aGlzLm1heCAtIHNjYWxlZERpc3RhbmNlIDogdGhpcy5taW4gKyBzY2FsZWREaXN0YW5jZTtcbiAgICB9XG4gICAgZ2V0UG9pbnRMYWJlbENvbnRleHQoaW5kZXgpIHtcbiAgICAgICAgY29uc3QgcG9pbnRMYWJlbHMgPSB0aGlzLl9wb2ludExhYmVscyB8fCBbXTtcbiAgICAgICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCBwb2ludExhYmVscy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IHBvaW50TGFiZWwgPSBwb2ludExhYmVsc1tpbmRleF07XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUG9pbnRMYWJlbENvbnRleHQodGhpcy5nZXRDb250ZXh0KCksIGluZGV4LCBwb2ludExhYmVsKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXRQb2ludFBvc2l0aW9uKGluZGV4LCBkaXN0YW5jZUZyb21DZW50ZXIsIGFkZGl0aW9uYWxBbmdsZSA9IDApIHtcbiAgICAgICAgY29uc3QgYW5nbGUgPSB0aGlzLmdldEluZGV4QW5nbGUoaW5kZXgpIC0gSEFMRl9QSSArIGFkZGl0aW9uYWxBbmdsZTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHg6IE1hdGguY29zKGFuZ2xlKSAqIGRpc3RhbmNlRnJvbUNlbnRlciArIHRoaXMueENlbnRlcixcbiAgICAgICAgICAgIHk6IE1hdGguc2luKGFuZ2xlKSAqIGRpc3RhbmNlRnJvbUNlbnRlciArIHRoaXMueUNlbnRlcixcbiAgICAgICAgICAgIGFuZ2xlXG4gICAgICAgIH07XG4gICAgfVxuICAgIGdldFBvaW50UG9zaXRpb25Gb3JWYWx1ZShpbmRleCwgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UG9pbnRQb3NpdGlvbihpbmRleCwgdGhpcy5nZXREaXN0YW5jZUZyb21DZW50ZXJGb3JWYWx1ZSh2YWx1ZSkpO1xuICAgIH1cbiAgICBnZXRCYXNlUG9zaXRpb24oaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UG9pbnRQb3NpdGlvbkZvclZhbHVlKGluZGV4IHx8IDAsIHRoaXMuZ2V0QmFzZVZhbHVlKCkpO1xuICAgIH1cbiAgICBnZXRQb2ludExhYmVsUG9zaXRpb24oaW5kZXgpIHtcbiAgICAgICAgY29uc3QgeyBsZWZ0ICwgdG9wICwgcmlnaHQgLCBib3R0b20gIH0gPSB0aGlzLl9wb2ludExhYmVsSXRlbXNbaW5kZXhdO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGVmdCxcbiAgICAgICAgICAgIHRvcCxcbiAgICAgICAgICAgIHJpZ2h0LFxuICAgICAgICAgICAgYm90dG9tXG4gICAgICAgIH07XG4gICAgfVxuIGRyYXdCYWNrZ3JvdW5kKCkge1xuICAgICAgICBjb25zdCB7IGJhY2tncm91bmRDb2xvciAsIGdyaWQ6IHsgY2lyY3VsYXIgIH0gIH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIGlmIChiYWNrZ3JvdW5kQ29sb3IpIHtcbiAgICAgICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuY3R4O1xuICAgICAgICAgICAgY3R4LnNhdmUoKTtcbiAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICAgICAgICAgIHBhdGhSYWRpdXNMaW5lKHRoaXMsIHRoaXMuZ2V0RGlzdGFuY2VGcm9tQ2VudGVyRm9yVmFsdWUodGhpcy5fZW5kVmFsdWUpLCBjaXJjdWxhciwgdGhpcy5fcG9pbnRMYWJlbHMubGVuZ3RoKTtcbiAgICAgICAgICAgIGN0eC5jbG9zZVBhdGgoKTtcbiAgICAgICAgICAgIGN0eC5maWxsU3R5bGUgPSBiYWNrZ3JvdW5kQ29sb3I7XG4gICAgICAgICAgICBjdHguZmlsbCgpO1xuICAgICAgICAgICAgY3R4LnJlc3RvcmUoKTtcbiAgICAgICAgfVxuICAgIH1cbiBkcmF3R3JpZCgpIHtcbiAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5jdHg7XG4gICAgICAgIGNvbnN0IG9wdHMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIGNvbnN0IHsgYW5nbGVMaW5lcyAsIGdyaWQgLCBib3JkZXIgIH0gPSBvcHRzO1xuICAgICAgICBjb25zdCBsYWJlbENvdW50ID0gdGhpcy5fcG9pbnRMYWJlbHMubGVuZ3RoO1xuICAgICAgICBsZXQgaSwgb2Zmc2V0LCBwb3NpdGlvbjtcbiAgICAgICAgaWYgKG9wdHMucG9pbnRMYWJlbHMuZGlzcGxheSkge1xuICAgICAgICAgICAgZHJhd1BvaW50TGFiZWxzKHRoaXMsIGxhYmVsQ291bnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChncmlkLmRpc3BsYXkpIHtcbiAgICAgICAgICAgIHRoaXMudGlja3MuZm9yRWFjaCgodGljaywgaW5kZXgpPT57XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHRoaXMuZ2V0RGlzdGFuY2VGcm9tQ2VudGVyRm9yVmFsdWUodGljay52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmdldENvbnRleHQoaW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvcHRzQXRJbmRleCA9IGdyaWQuc2V0Q29udGV4dChjb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3B0c0F0SW5kZXhCb3JkZXIgPSBib3JkZXIuc2V0Q29udGV4dChjb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgZHJhd1JhZGl1c0xpbmUodGhpcywgb3B0c0F0SW5kZXgsIG9mZnNldCwgbGFiZWxDb3VudCwgb3B0c0F0SW5kZXhCb3JkZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhbmdsZUxpbmVzLmRpc3BsYXkpIHtcbiAgICAgICAgICAgIGN0eC5zYXZlKCk7XG4gICAgICAgICAgICBmb3IoaSA9IGxhYmVsQ291bnQgLSAxOyBpID49IDA7IGktLSl7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3B0c0F0SW5kZXggPSBhbmdsZUxpbmVzLnNldENvbnRleHQodGhpcy5nZXRQb2ludExhYmVsQ29udGV4dChpKSk7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBjb2xvciAsIGxpbmVXaWR0aCAgfSA9IG9wdHNBdEluZGV4O1xuICAgICAgICAgICAgICAgIGlmICghbGluZVdpZHRoIHx8ICFjb2xvcikge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY3R4LmxpbmVXaWR0aCA9IGxpbmVXaWR0aDtcbiAgICAgICAgICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSBjb2xvcjtcbiAgICAgICAgICAgICAgICBjdHguc2V0TGluZURhc2gob3B0c0F0SW5kZXguYm9yZGVyRGFzaCk7XG4gICAgICAgICAgICAgICAgY3R4LmxpbmVEYXNoT2Zmc2V0ID0gb3B0c0F0SW5kZXguYm9yZGVyRGFzaE9mZnNldDtcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSB0aGlzLmdldERpc3RhbmNlRnJvbUNlbnRlckZvclZhbHVlKG9wdHMudGlja3MucmV2ZXJzZSA/IHRoaXMubWluIDogdGhpcy5tYXgpO1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gdGhpcy5nZXRQb2ludFBvc2l0aW9uKGksIG9mZnNldCk7XG4gICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8odGhpcy54Q2VudGVyLCB0aGlzLnlDZW50ZXIpO1xuICAgICAgICAgICAgICAgIGN0eC5saW5lVG8ocG9zaXRpb24ueCwgcG9zaXRpb24ueSk7XG4gICAgICAgICAgICAgICAgY3R4LnN0cm9rZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3R4LnJlc3RvcmUoKTtcbiAgICAgICAgfVxuICAgIH1cbiBkcmF3Qm9yZGVyKCkge31cbiBkcmF3TGFiZWxzKCkge1xuICAgICAgICBjb25zdCBjdHggPSB0aGlzLmN0eDtcbiAgICAgICAgY29uc3Qgb3B0cyA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgY29uc3QgdGlja09wdHMgPSBvcHRzLnRpY2tzO1xuICAgICAgICBpZiAoIXRpY2tPcHRzLmRpc3BsYXkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdGFydEFuZ2xlID0gdGhpcy5nZXRJbmRleEFuZ2xlKDApO1xuICAgICAgICBsZXQgb2Zmc2V0LCB3aWR0aDtcbiAgICAgICAgY3R4LnNhdmUoKTtcbiAgICAgICAgY3R4LnRyYW5zbGF0ZSh0aGlzLnhDZW50ZXIsIHRoaXMueUNlbnRlcik7XG4gICAgICAgIGN0eC5yb3RhdGUoc3RhcnRBbmdsZSk7XG4gICAgICAgIGN0eC50ZXh0QWxpZ24gPSAnY2VudGVyJztcbiAgICAgICAgY3R4LnRleHRCYXNlbGluZSA9ICdtaWRkbGUnO1xuICAgICAgICB0aGlzLnRpY2tzLmZvckVhY2goKHRpY2ssIGluZGV4KT0+e1xuICAgICAgICAgICAgaWYgKGluZGV4ID09PSAwICYmICFvcHRzLnJldmVyc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBvcHRzQXRJbmRleCA9IHRpY2tPcHRzLnNldENvbnRleHQodGhpcy5nZXRDb250ZXh0KGluZGV4KSk7XG4gICAgICAgICAgICBjb25zdCB0aWNrRm9udCA9IHRvRm9udChvcHRzQXRJbmRleC5mb250KTtcbiAgICAgICAgICAgIG9mZnNldCA9IHRoaXMuZ2V0RGlzdGFuY2VGcm9tQ2VudGVyRm9yVmFsdWUodGhpcy50aWNrc1tpbmRleF0udmFsdWUpO1xuICAgICAgICAgICAgaWYgKG9wdHNBdEluZGV4LnNob3dMYWJlbEJhY2tkcm9wKSB7XG4gICAgICAgICAgICAgICAgY3R4LmZvbnQgPSB0aWNrRm9udC5zdHJpbmc7XG4gICAgICAgICAgICAgICAgd2lkdGggPSBjdHgubWVhc3VyZVRleHQodGljay5sYWJlbCkud2lkdGg7XG4gICAgICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9IG9wdHNBdEluZGV4LmJhY2tkcm9wQ29sb3I7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFkZGluZyA9IHRvUGFkZGluZyhvcHRzQXRJbmRleC5iYWNrZHJvcFBhZGRpbmcpO1xuICAgICAgICAgICAgICAgIGN0eC5maWxsUmVjdCgtd2lkdGggLyAyIC0gcGFkZGluZy5sZWZ0LCAtb2Zmc2V0IC0gdGlja0ZvbnQuc2l6ZSAvIDIgLSBwYWRkaW5nLnRvcCwgd2lkdGggKyBwYWRkaW5nLndpZHRoLCB0aWNrRm9udC5zaXplICsgcGFkZGluZy5oZWlnaHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVuZGVyVGV4dChjdHgsIHRpY2subGFiZWwsIDAsIC1vZmZzZXQsIHRpY2tGb250LCB7XG4gICAgICAgICAgICAgICAgY29sb3I6IG9wdHNBdEluZGV4LmNvbG9yLFxuICAgICAgICAgICAgICAgIHN0cm9rZUNvbG9yOiBvcHRzQXRJbmRleC50ZXh0U3Ryb2tlQ29sb3IsXG4gICAgICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IG9wdHNBdEluZGV4LnRleHRTdHJva2VXaWR0aFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBjdHgucmVzdG9yZSgpO1xuICAgIH1cbiBkcmF3VGl0bGUoKSB7fVxufVxuXG5jb25zdCBJTlRFUlZBTFMgPSB7XG4gICAgbWlsbGlzZWNvbmQ6IHtcbiAgICAgICAgY29tbW9uOiB0cnVlLFxuICAgICAgICBzaXplOiAxLFxuICAgICAgICBzdGVwczogMTAwMFxuICAgIH0sXG4gICAgc2Vjb25kOiB7XG4gICAgICAgIGNvbW1vbjogdHJ1ZSxcbiAgICAgICAgc2l6ZTogMTAwMCxcbiAgICAgICAgc3RlcHM6IDYwXG4gICAgfSxcbiAgICBtaW51dGU6IHtcbiAgICAgICAgY29tbW9uOiB0cnVlLFxuICAgICAgICBzaXplOiA2MDAwMCxcbiAgICAgICAgc3RlcHM6IDYwXG4gICAgfSxcbiAgICBob3VyOiB7XG4gICAgICAgIGNvbW1vbjogdHJ1ZSxcbiAgICAgICAgc2l6ZTogMzYwMDAwMCxcbiAgICAgICAgc3RlcHM6IDI0XG4gICAgfSxcbiAgICBkYXk6IHtcbiAgICAgICAgY29tbW9uOiB0cnVlLFxuICAgICAgICBzaXplOiA4NjQwMDAwMCxcbiAgICAgICAgc3RlcHM6IDMwXG4gICAgfSxcbiAgICB3ZWVrOiB7XG4gICAgICAgIGNvbW1vbjogZmFsc2UsXG4gICAgICAgIHNpemU6IDYwNDgwMDAwMCxcbiAgICAgICAgc3RlcHM6IDRcbiAgICB9LFxuICAgIG1vbnRoOiB7XG4gICAgICAgIGNvbW1vbjogdHJ1ZSxcbiAgICAgICAgc2l6ZTogMi42MjhlOSxcbiAgICAgICAgc3RlcHM6IDEyXG4gICAgfSxcbiAgICBxdWFydGVyOiB7XG4gICAgICAgIGNvbW1vbjogZmFsc2UsXG4gICAgICAgIHNpemU6IDcuODg0ZTksXG4gICAgICAgIHN0ZXBzOiA0XG4gICAgfSxcbiAgICB5ZWFyOiB7XG4gICAgICAgIGNvbW1vbjogdHJ1ZSxcbiAgICAgICAgc2l6ZTogMy4xNTRlMTBcbiAgICB9XG59O1xuIGNvbnN0IFVOSVRTID0gIC8qICNfX1BVUkVfXyAqLyBPYmplY3Qua2V5cyhJTlRFUlZBTFMpO1xuIGZ1bmN0aW9uIHNvcnRlcihhLCBiKSB7XG4gICAgcmV0dXJuIGEgLSBiO1xufVxuIGZ1bmN0aW9uIHBhcnNlKHNjYWxlLCBpbnB1dCkge1xuICAgIGlmIChpc051bGxPclVuZGVmKGlucHV0KSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgYWRhcHRlciA9IHNjYWxlLl9hZGFwdGVyO1xuICAgIGNvbnN0IHsgcGFyc2VyICwgcm91bmQgLCBpc29XZWVrZGF5ICB9ID0gc2NhbGUuX3BhcnNlT3B0cztcbiAgICBsZXQgdmFsdWUgPSBpbnB1dDtcbiAgICBpZiAodHlwZW9mIHBhcnNlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB2YWx1ZSA9IHBhcnNlcih2YWx1ZSk7XG4gICAgfVxuICAgIGlmICghaXNOdW1iZXJGaW5pdGUodmFsdWUpKSB7XG4gICAgICAgIHZhbHVlID0gdHlwZW9mIHBhcnNlciA9PT0gJ3N0cmluZycgPyBhZGFwdGVyLnBhcnNlKHZhbHVlLCAgcGFyc2VyKSA6IGFkYXB0ZXIucGFyc2UodmFsdWUpO1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmIChyb3VuZCkge1xuICAgICAgICB2YWx1ZSA9IHJvdW5kID09PSAnd2VlaycgJiYgKGlzTnVtYmVyKGlzb1dlZWtkYXkpIHx8IGlzb1dlZWtkYXkgPT09IHRydWUpID8gYWRhcHRlci5zdGFydE9mKHZhbHVlLCAnaXNvV2VlaycsIGlzb1dlZWtkYXkpIDogYWRhcHRlci5zdGFydE9mKHZhbHVlLCByb3VuZCk7XG4gICAgfVxuICAgIHJldHVybiArdmFsdWU7XG59XG4gZnVuY3Rpb24gZGV0ZXJtaW5lVW5pdEZvckF1dG9UaWNrcyhtaW5Vbml0LCBtaW4sIG1heCwgY2FwYWNpdHkpIHtcbiAgICBjb25zdCBpbGVuID0gVU5JVFMubGVuZ3RoO1xuICAgIGZvcihsZXQgaSA9IFVOSVRTLmluZGV4T2YobWluVW5pdCk7IGkgPCBpbGVuIC0gMTsgKytpKXtcbiAgICAgICAgY29uc3QgaW50ZXJ2YWwgPSBJTlRFUlZBTFNbVU5JVFNbaV1dO1xuICAgICAgICBjb25zdCBmYWN0b3IgPSBpbnRlcnZhbC5zdGVwcyA/IGludGVydmFsLnN0ZXBzIDogTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVI7XG4gICAgICAgIGlmIChpbnRlcnZhbC5jb21tb24gJiYgTWF0aC5jZWlsKChtYXggLSBtaW4pIC8gKGZhY3RvciAqIGludGVydmFsLnNpemUpKSA8PSBjYXBhY2l0eSkge1xuICAgICAgICAgICAgcmV0dXJuIFVOSVRTW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBVTklUU1tpbGVuIC0gMV07XG59XG4gZnVuY3Rpb24gZGV0ZXJtaW5lVW5pdEZvckZvcm1hdHRpbmcoc2NhbGUsIG51bVRpY2tzLCBtaW5Vbml0LCBtaW4sIG1heCkge1xuICAgIGZvcihsZXQgaSA9IFVOSVRTLmxlbmd0aCAtIDE7IGkgPj0gVU5JVFMuaW5kZXhPZihtaW5Vbml0KTsgaS0tKXtcbiAgICAgICAgY29uc3QgdW5pdCA9IFVOSVRTW2ldO1xuICAgICAgICBpZiAoSU5URVJWQUxTW3VuaXRdLmNvbW1vbiAmJiBzY2FsZS5fYWRhcHRlci5kaWZmKG1heCwgbWluLCB1bml0KSA+PSBudW1UaWNrcyAtIDEpIHtcbiAgICAgICAgICAgIHJldHVybiB1bml0O1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBVTklUU1ttaW5Vbml0ID8gVU5JVFMuaW5kZXhPZihtaW5Vbml0KSA6IDBdO1xufVxuIGZ1bmN0aW9uIGRldGVybWluZU1ham9yVW5pdCh1bml0KSB7XG4gICAgZm9yKGxldCBpID0gVU5JVFMuaW5kZXhPZih1bml0KSArIDEsIGlsZW4gPSBVTklUUy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpe1xuICAgICAgICBpZiAoSU5URVJWQUxTW1VOSVRTW2ldXS5jb21tb24pIHtcbiAgICAgICAgICAgIHJldHVybiBVTklUU1tpXTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiBmdW5jdGlvbiBhZGRUaWNrKHRpY2tzLCB0aW1lLCB0aW1lc3RhbXBzKSB7XG4gICAgaWYgKCF0aW1lc3RhbXBzKSB7XG4gICAgICAgIHRpY2tzW3RpbWVdID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHRpbWVzdGFtcHMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHsgbG8gLCBoaSAgfSA9IF9sb29rdXAodGltZXN0YW1wcywgdGltZSk7XG4gICAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IHRpbWVzdGFtcHNbbG9dID49IHRpbWUgPyB0aW1lc3RhbXBzW2xvXSA6IHRpbWVzdGFtcHNbaGldO1xuICAgICAgICB0aWNrc1t0aW1lc3RhbXBdID0gdHJ1ZTtcbiAgICB9XG59XG4gZnVuY3Rpb24gc2V0TWFqb3JUaWNrcyhzY2FsZSwgdGlja3MsIG1hcCwgbWFqb3JVbml0KSB7XG4gICAgY29uc3QgYWRhcHRlciA9IHNjYWxlLl9hZGFwdGVyO1xuICAgIGNvbnN0IGZpcnN0ID0gK2FkYXB0ZXIuc3RhcnRPZih0aWNrc1swXS52YWx1ZSwgbWFqb3JVbml0KTtcbiAgICBjb25zdCBsYXN0ID0gdGlja3NbdGlja3MubGVuZ3RoIC0gMV0udmFsdWU7XG4gICAgbGV0IG1ham9yLCBpbmRleDtcbiAgICBmb3IobWFqb3IgPSBmaXJzdDsgbWFqb3IgPD0gbGFzdDsgbWFqb3IgPSArYWRhcHRlci5hZGQobWFqb3IsIDEsIG1ham9yVW5pdCkpe1xuICAgICAgICBpbmRleCA9IG1hcFttYWpvcl07XG4gICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgICB0aWNrc1tpbmRleF0ubWFqb3IgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aWNrcztcbn1cbiBmdW5jdGlvbiB0aWNrc0Zyb21UaW1lc3RhbXBzKHNjYWxlLCB2YWx1ZXMsIG1ham9yVW5pdCkge1xuICAgIGNvbnN0IHRpY2tzID0gW107XG4gICAgIGNvbnN0IG1hcCA9IHt9O1xuICAgIGNvbnN0IGlsZW4gPSB2YWx1ZXMubGVuZ3RoO1xuICAgIGxldCBpLCB2YWx1ZTtcbiAgICBmb3IoaSA9IDA7IGkgPCBpbGVuOyArK2kpe1xuICAgICAgICB2YWx1ZSA9IHZhbHVlc1tpXTtcbiAgICAgICAgbWFwW3ZhbHVlXSA9IGk7XG4gICAgICAgIHRpY2tzLnB1c2goe1xuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICBtYWpvcjogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBpbGVuID09PSAwIHx8ICFtYWpvclVuaXQgPyB0aWNrcyA6IHNldE1ham9yVGlja3Moc2NhbGUsIHRpY2tzLCBtYXAsIG1ham9yVW5pdCk7XG59XG5jbGFzcyBUaW1lU2NhbGUgZXh0ZW5kcyBTY2FsZSB7XG4gICAgc3RhdGljIGlkID0gJ3RpbWUnO1xuIHN0YXRpYyBkZWZhdWx0cyA9IHtcbiBib3VuZHM6ICdkYXRhJyxcbiAgICAgICAgYWRhcHRlcnM6IHt9LFxuICAgICAgICB0aW1lOiB7XG4gICAgICAgICAgICBwYXJzZXI6IGZhbHNlLFxuICAgICAgICAgICAgdW5pdDogZmFsc2UsXG4gICAgICAgICAgICByb3VuZDogZmFsc2UsXG4gICAgICAgICAgICBpc29XZWVrZGF5OiBmYWxzZSxcbiAgICAgICAgICAgIG1pblVuaXQ6ICdtaWxsaXNlY29uZCcsXG4gICAgICAgICAgICBkaXNwbGF5Rm9ybWF0czoge31cbiAgICAgICAgfSxcbiAgICAgICAgdGlja3M6IHtcbiBzb3VyY2U6ICdhdXRvJyxcbiAgICAgICAgICAgIGNhbGxiYWNrOiBmYWxzZSxcbiAgICAgICAgICAgIG1ham9yOiB7XG4gICAgICAgICAgICAgICAgZW5hYmxlZDogZmFsc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gY29uc3RydWN0b3IocHJvcHMpe1xuICAgICAgICBzdXBlcihwcm9wcyk7XG4gICAgICAgICB0aGlzLl9jYWNoZSA9IHtcbiAgICAgICAgICAgIGRhdGE6IFtdLFxuICAgICAgICAgICAgbGFiZWxzOiBbXSxcbiAgICAgICAgICAgIGFsbDogW11cbiAgICAgICAgfTtcbiAgICAgICAgIHRoaXMuX3VuaXQgPSAnZGF5JztcbiAgICAgICAgIHRoaXMuX21ham9yVW5pdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fb2Zmc2V0cyA9IHt9O1xuICAgICAgICB0aGlzLl9ub3JtYWxpemVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3BhcnNlT3B0cyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaW5pdChzY2FsZU9wdHMsIG9wdHMgPSB7fSkge1xuICAgICAgICBjb25zdCB0aW1lID0gc2NhbGVPcHRzLnRpbWUgfHwgKHNjYWxlT3B0cy50aW1lID0ge30pO1xuICAgICAgICAgY29uc3QgYWRhcHRlciA9IHRoaXMuX2FkYXB0ZXIgPSBuZXcgYWRhcHRlcnMuX2RhdGUoc2NhbGVPcHRzLmFkYXB0ZXJzLmRhdGUpO1xuICAgICAgICBhZGFwdGVyLmluaXQob3B0cyk7XG4gICAgICAgIG1lcmdlSWYodGltZS5kaXNwbGF5Rm9ybWF0cywgYWRhcHRlci5mb3JtYXRzKCkpO1xuICAgICAgICB0aGlzLl9wYXJzZU9wdHMgPSB7XG4gICAgICAgICAgICBwYXJzZXI6IHRpbWUucGFyc2VyLFxuICAgICAgICAgICAgcm91bmQ6IHRpbWUucm91bmQsXG4gICAgICAgICAgICBpc29XZWVrZGF5OiB0aW1lLmlzb1dlZWtkYXlcbiAgICAgICAgfTtcbiAgICAgICAgc3VwZXIuaW5pdChzY2FsZU9wdHMpO1xuICAgICAgICB0aGlzLl9ub3JtYWxpemVkID0gb3B0cy5ub3JtYWxpemVkO1xuICAgIH1cbiBwYXJzZShyYXcsIGluZGV4KSB7XG4gICAgICAgIGlmIChyYXcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcnNlKHRoaXMsIHJhdyk7XG4gICAgfVxuICAgIGJlZm9yZUxheW91dCgpIHtcbiAgICAgICAgc3VwZXIuYmVmb3JlTGF5b3V0KCk7XG4gICAgICAgIHRoaXMuX2NhY2hlID0ge1xuICAgICAgICAgICAgZGF0YTogW10sXG4gICAgICAgICAgICBsYWJlbHM6IFtdLFxuICAgICAgICAgICAgYWxsOiBbXVxuICAgICAgICB9O1xuICAgIH1cbiAgICBkZXRlcm1pbmVEYXRhTGltaXRzKCkge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgICAgICBjb25zdCBhZGFwdGVyID0gdGhpcy5fYWRhcHRlcjtcbiAgICAgICAgY29uc3QgdW5pdCA9IG9wdGlvbnMudGltZS51bml0IHx8ICdkYXknO1xuICAgICAgICBsZXQgeyBtaW4gLCBtYXggLCBtaW5EZWZpbmVkICwgbWF4RGVmaW5lZCAgfSA9IHRoaXMuZ2V0VXNlckJvdW5kcygpO1xuIGZ1bmN0aW9uIF9hcHBseUJvdW5kcyhib3VuZHMpIHtcbiAgICAgICAgICAgIGlmICghbWluRGVmaW5lZCAmJiAhaXNOYU4oYm91bmRzLm1pbikpIHtcbiAgICAgICAgICAgICAgICBtaW4gPSBNYXRoLm1pbihtaW4sIGJvdW5kcy5taW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFtYXhEZWZpbmVkICYmICFpc05hTihib3VuZHMubWF4KSkge1xuICAgICAgICAgICAgICAgIG1heCA9IE1hdGgubWF4KG1heCwgYm91bmRzLm1heCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFtaW5EZWZpbmVkIHx8ICFtYXhEZWZpbmVkKSB7XG4gICAgICAgICAgICBfYXBwbHlCb3VuZHModGhpcy5fZ2V0TGFiZWxCb3VuZHMoKSk7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5ib3VuZHMgIT09ICd0aWNrcycgfHwgb3B0aW9ucy50aWNrcy5zb3VyY2UgIT09ICdsYWJlbHMnKSB7XG4gICAgICAgICAgICAgICAgX2FwcGx5Qm91bmRzKHRoaXMuZ2V0TWluTWF4KGZhbHNlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbWluID0gaXNOdW1iZXJGaW5pdGUobWluKSAmJiAhaXNOYU4obWluKSA/IG1pbiA6ICthZGFwdGVyLnN0YXJ0T2YoRGF0ZS5ub3coKSwgdW5pdCk7XG4gICAgICAgIG1heCA9IGlzTnVtYmVyRmluaXRlKG1heCkgJiYgIWlzTmFOKG1heCkgPyBtYXggOiArYWRhcHRlci5lbmRPZihEYXRlLm5vdygpLCB1bml0KSArIDE7XG4gICAgICAgIHRoaXMubWluID0gTWF0aC5taW4obWluLCBtYXggLSAxKTtcbiAgICAgICAgdGhpcy5tYXggPSBNYXRoLm1heChtaW4gKyAxLCBtYXgpO1xuICAgIH1cbiBfZ2V0TGFiZWxCb3VuZHMoKSB7XG4gICAgICAgIGNvbnN0IGFyciA9IHRoaXMuZ2V0TGFiZWxUaW1lc3RhbXBzKCk7XG4gICAgICAgIGxldCBtaW4gPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gICAgICAgIGxldCBtYXggPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7XG4gICAgICAgIGlmIChhcnIubGVuZ3RoKSB7XG4gICAgICAgICAgICBtaW4gPSBhcnJbMF07XG4gICAgICAgICAgICBtYXggPSBhcnJbYXJyLmxlbmd0aCAtIDFdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtaW4sXG4gICAgICAgICAgICBtYXhcbiAgICAgICAgfTtcbiAgICB9XG4gYnVpbGRUaWNrcygpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgY29uc3QgdGltZU9wdHMgPSBvcHRpb25zLnRpbWU7XG4gICAgICAgIGNvbnN0IHRpY2tPcHRzID0gb3B0aW9ucy50aWNrcztcbiAgICAgICAgY29uc3QgdGltZXN0YW1wcyA9IHRpY2tPcHRzLnNvdXJjZSA9PT0gJ2xhYmVscycgPyB0aGlzLmdldExhYmVsVGltZXN0YW1wcygpIDogdGhpcy5fZ2VuZXJhdGUoKTtcbiAgICAgICAgaWYgKG9wdGlvbnMuYm91bmRzID09PSAndGlja3MnICYmIHRpbWVzdGFtcHMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLm1pbiA9IHRoaXMuX3VzZXJNaW4gfHwgdGltZXN0YW1wc1swXTtcbiAgICAgICAgICAgIHRoaXMubWF4ID0gdGhpcy5fdXNlck1heCB8fCB0aW1lc3RhbXBzW3RpbWVzdGFtcHMubGVuZ3RoIC0gMV07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWluID0gdGhpcy5taW47XG4gICAgICAgIGNvbnN0IG1heCA9IHRoaXMubWF4O1xuICAgICAgICBjb25zdCB0aWNrcyA9IF9maWx0ZXJCZXR3ZWVuKHRpbWVzdGFtcHMsIG1pbiwgbWF4KTtcbiAgICAgICAgdGhpcy5fdW5pdCA9IHRpbWVPcHRzLnVuaXQgfHwgKHRpY2tPcHRzLmF1dG9Ta2lwID8gZGV0ZXJtaW5lVW5pdEZvckF1dG9UaWNrcyh0aW1lT3B0cy5taW5Vbml0LCB0aGlzLm1pbiwgdGhpcy5tYXgsIHRoaXMuX2dldExhYmVsQ2FwYWNpdHkobWluKSkgOiBkZXRlcm1pbmVVbml0Rm9yRm9ybWF0dGluZyh0aGlzLCB0aWNrcy5sZW5ndGgsIHRpbWVPcHRzLm1pblVuaXQsIHRoaXMubWluLCB0aGlzLm1heCkpO1xuICAgICAgICB0aGlzLl9tYWpvclVuaXQgPSAhdGlja09wdHMubWFqb3IuZW5hYmxlZCB8fCB0aGlzLl91bml0ID09PSAneWVhcicgPyB1bmRlZmluZWQgOiBkZXRlcm1pbmVNYWpvclVuaXQodGhpcy5fdW5pdCk7XG4gICAgICAgIHRoaXMuaW5pdE9mZnNldHModGltZXN0YW1wcyk7XG4gICAgICAgIGlmIChvcHRpb25zLnJldmVyc2UpIHtcbiAgICAgICAgICAgIHRpY2tzLnJldmVyc2UoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGlja3NGcm9tVGltZXN0YW1wcyh0aGlzLCB0aWNrcywgdGhpcy5fbWFqb3JVbml0KTtcbiAgICB9XG4gICAgYWZ0ZXJBdXRvU2tpcCgpIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5vZmZzZXRBZnRlckF1dG9za2lwKSB7XG4gICAgICAgICAgICB0aGlzLmluaXRPZmZzZXRzKHRoaXMudGlja3MubWFwKCh0aWNrKT0+K3RpY2sudmFsdWUpKTtcbiAgICAgICAgfVxuICAgIH1cbiBpbml0T2Zmc2V0cyh0aW1lc3RhbXBzID0gW10pIHtcbiAgICAgICAgbGV0IHN0YXJ0ID0gMDtcbiAgICAgICAgbGV0IGVuZCA9IDA7XG4gICAgICAgIGxldCBmaXJzdCwgbGFzdDtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5vZmZzZXQgJiYgdGltZXN0YW1wcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGZpcnN0ID0gdGhpcy5nZXREZWNpbWFsRm9yVmFsdWUodGltZXN0YW1wc1swXSk7XG4gICAgICAgICAgICBpZiAodGltZXN0YW1wcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICBzdGFydCA9IDEgLSBmaXJzdDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc3RhcnQgPSAodGhpcy5nZXREZWNpbWFsRm9yVmFsdWUodGltZXN0YW1wc1sxXSkgLSBmaXJzdCkgLyAyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGFzdCA9IHRoaXMuZ2V0RGVjaW1hbEZvclZhbHVlKHRpbWVzdGFtcHNbdGltZXN0YW1wcy5sZW5ndGggLSAxXSk7XG4gICAgICAgICAgICBpZiAodGltZXN0YW1wcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICBlbmQgPSBsYXN0O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBlbmQgPSAobGFzdCAtIHRoaXMuZ2V0RGVjaW1hbEZvclZhbHVlKHRpbWVzdGFtcHNbdGltZXN0YW1wcy5sZW5ndGggLSAyXSkpIC8gMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBsaW1pdCA9IHRpbWVzdGFtcHMubGVuZ3RoIDwgMyA/IDAuNSA6IDAuMjU7XG4gICAgICAgIHN0YXJ0ID0gX2xpbWl0VmFsdWUoc3RhcnQsIDAsIGxpbWl0KTtcbiAgICAgICAgZW5kID0gX2xpbWl0VmFsdWUoZW5kLCAwLCBsaW1pdCk7XG4gICAgICAgIHRoaXMuX29mZnNldHMgPSB7XG4gICAgICAgICAgICBzdGFydCxcbiAgICAgICAgICAgIGVuZCxcbiAgICAgICAgICAgIGZhY3RvcjogMSAvIChzdGFydCArIDEgKyBlbmQpXG4gICAgICAgIH07XG4gICAgfVxuIF9nZW5lcmF0ZSgpIHtcbiAgICAgICAgY29uc3QgYWRhcHRlciA9IHRoaXMuX2FkYXB0ZXI7XG4gICAgICAgIGNvbnN0IG1pbiA9IHRoaXMubWluO1xuICAgICAgICBjb25zdCBtYXggPSB0aGlzLm1heDtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgY29uc3QgdGltZU9wdHMgPSBvcHRpb25zLnRpbWU7XG4gICAgICAgIGNvbnN0IG1pbm9yID0gdGltZU9wdHMudW5pdCB8fCBkZXRlcm1pbmVVbml0Rm9yQXV0b1RpY2tzKHRpbWVPcHRzLm1pblVuaXQsIG1pbiwgbWF4LCB0aGlzLl9nZXRMYWJlbENhcGFjaXR5KG1pbikpO1xuICAgICAgICBjb25zdCBzdGVwU2l6ZSA9IHZhbHVlT3JEZWZhdWx0KG9wdGlvbnMudGlja3Muc3RlcFNpemUsIDEpO1xuICAgICAgICBjb25zdCB3ZWVrZGF5ID0gbWlub3IgPT09ICd3ZWVrJyA/IHRpbWVPcHRzLmlzb1dlZWtkYXkgOiBmYWxzZTtcbiAgICAgICAgY29uc3QgaGFzV2Vla2RheSA9IGlzTnVtYmVyKHdlZWtkYXkpIHx8IHdlZWtkYXkgPT09IHRydWU7XG4gICAgICAgIGNvbnN0IHRpY2tzID0ge307XG4gICAgICAgIGxldCBmaXJzdCA9IG1pbjtcbiAgICAgICAgbGV0IHRpbWUsIGNvdW50O1xuICAgICAgICBpZiAoaGFzV2Vla2RheSkge1xuICAgICAgICAgICAgZmlyc3QgPSArYWRhcHRlci5zdGFydE9mKGZpcnN0LCAnaXNvV2VlaycsIHdlZWtkYXkpO1xuICAgICAgICB9XG4gICAgICAgIGZpcnN0ID0gK2FkYXB0ZXIuc3RhcnRPZihmaXJzdCwgaGFzV2Vla2RheSA/ICdkYXknIDogbWlub3IpO1xuICAgICAgICBpZiAoYWRhcHRlci5kaWZmKG1heCwgbWluLCBtaW5vcikgPiAxMDAwMDAgKiBzdGVwU2l6ZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1pbiArICcgYW5kICcgKyBtYXggKyAnIGFyZSB0b28gZmFyIGFwYXJ0IHdpdGggc3RlcFNpemUgb2YgJyArIHN0ZXBTaXplICsgJyAnICsgbWlub3IpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRpbWVzdGFtcHMgPSBvcHRpb25zLnRpY2tzLnNvdXJjZSA9PT0gJ2RhdGEnICYmIHRoaXMuZ2V0RGF0YVRpbWVzdGFtcHMoKTtcbiAgICAgICAgZm9yKHRpbWUgPSBmaXJzdCwgY291bnQgPSAwOyB0aW1lIDwgbWF4OyB0aW1lID0gK2FkYXB0ZXIuYWRkKHRpbWUsIHN0ZXBTaXplLCBtaW5vciksIGNvdW50Kyspe1xuICAgICAgICAgICAgYWRkVGljayh0aWNrcywgdGltZSwgdGltZXN0YW1wcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRpbWUgPT09IG1heCB8fCBvcHRpb25zLmJvdW5kcyA9PT0gJ3RpY2tzJyB8fCBjb3VudCA9PT0gMSkge1xuICAgICAgICAgICAgYWRkVGljayh0aWNrcywgdGltZSwgdGltZXN0YW1wcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRpY2tzKS5zb3J0KHNvcnRlcikubWFwKCh4KT0+K3gpO1xuICAgIH1cbiBnZXRMYWJlbEZvclZhbHVlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGFkYXB0ZXIgPSB0aGlzLl9hZGFwdGVyO1xuICAgICAgICBjb25zdCB0aW1lT3B0cyA9IHRoaXMub3B0aW9ucy50aW1lO1xuICAgICAgICBpZiAodGltZU9wdHMudG9vbHRpcEZvcm1hdCkge1xuICAgICAgICAgICAgcmV0dXJuIGFkYXB0ZXIuZm9ybWF0KHZhbHVlLCB0aW1lT3B0cy50b29sdGlwRm9ybWF0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWRhcHRlci5mb3JtYXQodmFsdWUsIHRpbWVPcHRzLmRpc3BsYXlGb3JtYXRzLmRhdGV0aW1lKTtcbiAgICB9XG4gZm9ybWF0KHZhbHVlLCBmb3JtYXQpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgY29uc3QgZm9ybWF0cyA9IG9wdGlvbnMudGltZS5kaXNwbGF5Rm9ybWF0cztcbiAgICAgICAgY29uc3QgdW5pdCA9IHRoaXMuX3VuaXQ7XG4gICAgICAgIGNvbnN0IGZtdCA9IGZvcm1hdCB8fCBmb3JtYXRzW3VuaXRdO1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRhcHRlci5mb3JtYXQodmFsdWUsIGZtdCk7XG4gICAgfVxuIF90aWNrRm9ybWF0RnVuY3Rpb24odGltZSwgaW5kZXgsIHRpY2tzLCBmb3JtYXQpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgY29uc3QgZm9ybWF0dGVyID0gb3B0aW9ucy50aWNrcy5jYWxsYmFjaztcbiAgICAgICAgaWYgKGZvcm1hdHRlcikge1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGZvcm1hdHRlciwgW1xuICAgICAgICAgICAgICAgIHRpbWUsXG4gICAgICAgICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgICAgICAgdGlja3NcbiAgICAgICAgICAgIF0sIHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZvcm1hdHMgPSBvcHRpb25zLnRpbWUuZGlzcGxheUZvcm1hdHM7XG4gICAgICAgIGNvbnN0IHVuaXQgPSB0aGlzLl91bml0O1xuICAgICAgICBjb25zdCBtYWpvclVuaXQgPSB0aGlzLl9tYWpvclVuaXQ7XG4gICAgICAgIGNvbnN0IG1pbm9yRm9ybWF0ID0gdW5pdCAmJiBmb3JtYXRzW3VuaXRdO1xuICAgICAgICBjb25zdCBtYWpvckZvcm1hdCA9IG1ham9yVW5pdCAmJiBmb3JtYXRzW21ham9yVW5pdF07XG4gICAgICAgIGNvbnN0IHRpY2sgPSB0aWNrc1tpbmRleF07XG4gICAgICAgIGNvbnN0IG1ham9yID0gbWFqb3JVbml0ICYmIG1ham9yRm9ybWF0ICYmIHRpY2sgJiYgdGljay5tYWpvcjtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkYXB0ZXIuZm9ybWF0KHRpbWUsIGZvcm1hdCB8fCAobWFqb3IgPyBtYWpvckZvcm1hdCA6IG1pbm9yRm9ybWF0KSk7XG4gICAgfVxuIGdlbmVyYXRlVGlja0xhYmVscyh0aWNrcykge1xuICAgICAgICBsZXQgaSwgaWxlbiwgdGljaztcbiAgICAgICAgZm9yKGkgPSAwLCBpbGVuID0gdGlja3MubGVuZ3RoOyBpIDwgaWxlbjsgKytpKXtcbiAgICAgICAgICAgIHRpY2sgPSB0aWNrc1tpXTtcbiAgICAgICAgICAgIHRpY2subGFiZWwgPSB0aGlzLl90aWNrRm9ybWF0RnVuY3Rpb24odGljay52YWx1ZSwgaSwgdGlja3MpO1xuICAgICAgICB9XG4gICAgfVxuIGdldERlY2ltYWxGb3JWYWx1ZSh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdmFsdWUgPT09IG51bGwgPyBOYU4gOiAodmFsdWUgLSB0aGlzLm1pbikgLyAodGhpcy5tYXggLSB0aGlzLm1pbik7XG4gICAgfVxuIGdldFBpeGVsRm9yVmFsdWUodmFsdWUpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0cyA9IHRoaXMuX29mZnNldHM7XG4gICAgICAgIGNvbnN0IHBvcyA9IHRoaXMuZ2V0RGVjaW1hbEZvclZhbHVlKHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGl4ZWxGb3JEZWNpbWFsKChvZmZzZXRzLnN0YXJ0ICsgcG9zKSAqIG9mZnNldHMuZmFjdG9yKTtcbiAgICB9XG4gZ2V0VmFsdWVGb3JQaXhlbChwaXhlbCkge1xuICAgICAgICBjb25zdCBvZmZzZXRzID0gdGhpcy5fb2Zmc2V0cztcbiAgICAgICAgY29uc3QgcG9zID0gdGhpcy5nZXREZWNpbWFsRm9yUGl4ZWwocGl4ZWwpIC8gb2Zmc2V0cy5mYWN0b3IgLSBvZmZzZXRzLmVuZDtcbiAgICAgICAgcmV0dXJuIHRoaXMubWluICsgcG9zICogKHRoaXMubWF4IC0gdGhpcy5taW4pO1xuICAgIH1cbiBfZ2V0TGFiZWxTaXplKGxhYmVsKSB7XG4gICAgICAgIGNvbnN0IHRpY2tzT3B0cyA9IHRoaXMub3B0aW9ucy50aWNrcztcbiAgICAgICAgY29uc3QgdGlja0xhYmVsV2lkdGggPSB0aGlzLmN0eC5tZWFzdXJlVGV4dChsYWJlbCkud2lkdGg7XG4gICAgICAgIGNvbnN0IGFuZ2xlID0gdG9SYWRpYW5zKHRoaXMuaXNIb3Jpem9udGFsKCkgPyB0aWNrc09wdHMubWF4Um90YXRpb24gOiB0aWNrc09wdHMubWluUm90YXRpb24pO1xuICAgICAgICBjb25zdCBjb3NSb3RhdGlvbiA9IE1hdGguY29zKGFuZ2xlKTtcbiAgICAgICAgY29uc3Qgc2luUm90YXRpb24gPSBNYXRoLnNpbihhbmdsZSk7XG4gICAgICAgIGNvbnN0IHRpY2tGb250U2l6ZSA9IHRoaXMuX3Jlc29sdmVUaWNrRm9udE9wdGlvbnMoMCkuc2l6ZTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHc6IHRpY2tMYWJlbFdpZHRoICogY29zUm90YXRpb24gKyB0aWNrRm9udFNpemUgKiBzaW5Sb3RhdGlvbixcbiAgICAgICAgICAgIGg6IHRpY2tMYWJlbFdpZHRoICogc2luUm90YXRpb24gKyB0aWNrRm9udFNpemUgKiBjb3NSb3RhdGlvblxuICAgICAgICB9O1xuICAgIH1cbiBfZ2V0TGFiZWxDYXBhY2l0eShleGFtcGxlVGltZSkge1xuICAgICAgICBjb25zdCB0aW1lT3B0cyA9IHRoaXMub3B0aW9ucy50aW1lO1xuICAgICAgICBjb25zdCBkaXNwbGF5Rm9ybWF0cyA9IHRpbWVPcHRzLmRpc3BsYXlGb3JtYXRzO1xuICAgICAgICBjb25zdCBmb3JtYXQgPSBkaXNwbGF5Rm9ybWF0c1t0aW1lT3B0cy51bml0XSB8fCBkaXNwbGF5Rm9ybWF0cy5taWxsaXNlY29uZDtcbiAgICAgICAgY29uc3QgZXhhbXBsZUxhYmVsID0gdGhpcy5fdGlja0Zvcm1hdEZ1bmN0aW9uKGV4YW1wbGVUaW1lLCAwLCB0aWNrc0Zyb21UaW1lc3RhbXBzKHRoaXMsIFtcbiAgICAgICAgICAgIGV4YW1wbGVUaW1lXG4gICAgICAgIF0sIHRoaXMuX21ham9yVW5pdCksIGZvcm1hdCk7XG4gICAgICAgIGNvbnN0IHNpemUgPSB0aGlzLl9nZXRMYWJlbFNpemUoZXhhbXBsZUxhYmVsKTtcbiAgICAgICAgY29uc3QgY2FwYWNpdHkgPSBNYXRoLmZsb29yKHRoaXMuaXNIb3Jpem9udGFsKCkgPyB0aGlzLndpZHRoIC8gc2l6ZS53IDogdGhpcy5oZWlnaHQgLyBzaXplLmgpIC0gMTtcbiAgICAgICAgcmV0dXJuIGNhcGFjaXR5ID4gMCA/IGNhcGFjaXR5IDogMTtcbiAgICB9XG4gZ2V0RGF0YVRpbWVzdGFtcHMoKSB7XG4gICAgICAgIGxldCB0aW1lc3RhbXBzID0gdGhpcy5fY2FjaGUuZGF0YSB8fCBbXTtcbiAgICAgICAgbGV0IGksIGlsZW47XG4gICAgICAgIGlmICh0aW1lc3RhbXBzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHRpbWVzdGFtcHM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWV0YXMgPSB0aGlzLmdldE1hdGNoaW5nVmlzaWJsZU1ldGFzKCk7XG4gICAgICAgIGlmICh0aGlzLl9ub3JtYWxpemVkICYmIG1ldGFzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlLmRhdGEgPSBtZXRhc1swXS5jb250cm9sbGVyLmdldEFsbFBhcnNlZFZhbHVlcyh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IoaSA9IDAsIGlsZW4gPSBtZXRhcy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpe1xuICAgICAgICAgICAgdGltZXN0YW1wcyA9IHRpbWVzdGFtcHMuY29uY2F0KG1ldGFzW2ldLmNvbnRyb2xsZXIuZ2V0QWxsUGFyc2VkVmFsdWVzKHRoaXMpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fY2FjaGUuZGF0YSA9IHRoaXMubm9ybWFsaXplKHRpbWVzdGFtcHMpO1xuICAgIH1cbiBnZXRMYWJlbFRpbWVzdGFtcHMoKSB7XG4gICAgICAgIGNvbnN0IHRpbWVzdGFtcHMgPSB0aGlzLl9jYWNoZS5sYWJlbHMgfHwgW107XG4gICAgICAgIGxldCBpLCBpbGVuO1xuICAgICAgICBpZiAodGltZXN0YW1wcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aW1lc3RhbXBzO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxhYmVscyA9IHRoaXMuZ2V0TGFiZWxzKCk7XG4gICAgICAgIGZvcihpID0gMCwgaWxlbiA9IGxhYmVscy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpe1xuICAgICAgICAgICAgdGltZXN0YW1wcy5wdXNoKHBhcnNlKHRoaXMsIGxhYmVsc1tpXSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9jYWNoZS5sYWJlbHMgPSB0aGlzLl9ub3JtYWxpemVkID8gdGltZXN0YW1wcyA6IHRoaXMubm9ybWFsaXplKHRpbWVzdGFtcHMpO1xuICAgIH1cbiBub3JtYWxpemUodmFsdWVzKSB7XG4gICAgICAgIHJldHVybiBfYXJyYXlVbmlxdWUodmFsdWVzLnNvcnQoc29ydGVyKSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBpbnRlcnBvbGF0ZSh0YWJsZSwgdmFsLCByZXZlcnNlKSB7XG4gICAgbGV0IGxvID0gMDtcbiAgICBsZXQgaGkgPSB0YWJsZS5sZW5ndGggLSAxO1xuICAgIGxldCBwcmV2U291cmNlLCBuZXh0U291cmNlLCBwcmV2VGFyZ2V0LCBuZXh0VGFyZ2V0O1xuICAgIGlmIChyZXZlcnNlKSB7XG4gICAgICAgIGlmICh2YWwgPj0gdGFibGVbbG9dLnBvcyAmJiB2YWwgPD0gdGFibGVbaGldLnBvcykge1xuICAgICAgICAgICAgKHsgbG8gLCBoaSAgfSA9IF9sb29rdXBCeUtleSh0YWJsZSwgJ3BvcycsIHZhbCkpO1xuICAgICAgICB9XG4gICAgICAgICh7IHBvczogcHJldlNvdXJjZSAsIHRpbWU6IHByZXZUYXJnZXQgIH0gPSB0YWJsZVtsb10pO1xuICAgICAgICAoeyBwb3M6IG5leHRTb3VyY2UgLCB0aW1lOiBuZXh0VGFyZ2V0ICB9ID0gdGFibGVbaGldKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodmFsID49IHRhYmxlW2xvXS50aW1lICYmIHZhbCA8PSB0YWJsZVtoaV0udGltZSkge1xuICAgICAgICAgICAgKHsgbG8gLCBoaSAgfSA9IF9sb29rdXBCeUtleSh0YWJsZSwgJ3RpbWUnLCB2YWwpKTtcbiAgICAgICAgfVxuICAgICAgICAoeyB0aW1lOiBwcmV2U291cmNlICwgcG9zOiBwcmV2VGFyZ2V0ICB9ID0gdGFibGVbbG9dKTtcbiAgICAgICAgKHsgdGltZTogbmV4dFNvdXJjZSAsIHBvczogbmV4dFRhcmdldCAgfSA9IHRhYmxlW2hpXSk7XG4gICAgfVxuICAgIGNvbnN0IHNwYW4gPSBuZXh0U291cmNlIC0gcHJldlNvdXJjZTtcbiAgICByZXR1cm4gc3BhbiA/IHByZXZUYXJnZXQgKyAobmV4dFRhcmdldCAtIHByZXZUYXJnZXQpICogKHZhbCAtIHByZXZTb3VyY2UpIC8gc3BhbiA6IHByZXZUYXJnZXQ7XG59XG5jbGFzcyBUaW1lU2VyaWVzU2NhbGUgZXh0ZW5kcyBUaW1lU2NhbGUge1xuICAgIHN0YXRpYyBpZCA9ICd0aW1lc2VyaWVzJztcbiBzdGF0aWMgZGVmYXVsdHMgPSBUaW1lU2NhbGUuZGVmYXVsdHM7XG4gY29uc3RydWN0b3IocHJvcHMpe1xuICAgICAgICBzdXBlcihwcm9wcyk7XG4gICAgICAgICB0aGlzLl90YWJsZSA9IFtdO1xuICAgICAgICAgdGhpcy5fbWluUG9zID0gdW5kZWZpbmVkO1xuICAgICAgICAgdGhpcy5fdGFibGVSYW5nZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gaW5pdE9mZnNldHMoKSB7XG4gICAgICAgIGNvbnN0IHRpbWVzdGFtcHMgPSB0aGlzLl9nZXRUaW1lc3RhbXBzRm9yVGFibGUoKTtcbiAgICAgICAgY29uc3QgdGFibGUgPSB0aGlzLl90YWJsZSA9IHRoaXMuYnVpbGRMb29rdXBUYWJsZSh0aW1lc3RhbXBzKTtcbiAgICAgICAgdGhpcy5fbWluUG9zID0gaW50ZXJwb2xhdGUodGFibGUsIHRoaXMubWluKTtcbiAgICAgICAgdGhpcy5fdGFibGVSYW5nZSA9IGludGVycG9sYXRlKHRhYmxlLCB0aGlzLm1heCkgLSB0aGlzLl9taW5Qb3M7XG4gICAgICAgIHN1cGVyLmluaXRPZmZzZXRzKHRpbWVzdGFtcHMpO1xuICAgIH1cbiBidWlsZExvb2t1cFRhYmxlKHRpbWVzdGFtcHMpIHtcbiAgICAgICAgY29uc3QgeyBtaW4gLCBtYXggIH0gPSB0aGlzO1xuICAgICAgICBjb25zdCBpdGVtcyA9IFtdO1xuICAgICAgICBjb25zdCB0YWJsZSA9IFtdO1xuICAgICAgICBsZXQgaSwgaWxlbiwgcHJldiwgY3VyciwgbmV4dDtcbiAgICAgICAgZm9yKGkgPSAwLCBpbGVuID0gdGltZXN0YW1wcy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpe1xuICAgICAgICAgICAgY3VyciA9IHRpbWVzdGFtcHNbaV07XG4gICAgICAgICAgICBpZiAoY3VyciA+PSBtaW4gJiYgY3VyciA8PSBtYXgpIHtcbiAgICAgICAgICAgICAgICBpdGVtcy5wdXNoKGN1cnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpdGVtcy5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGltZTogbWluLFxuICAgICAgICAgICAgICAgICAgICBwb3M6IDBcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGltZTogbWF4LFxuICAgICAgICAgICAgICAgICAgICBwb3M6IDFcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdO1xuICAgICAgICB9XG4gICAgICAgIGZvcihpID0gMCwgaWxlbiA9IGl0ZW1zLmxlbmd0aDsgaSA8IGlsZW47ICsraSl7XG4gICAgICAgICAgICBuZXh0ID0gaXRlbXNbaSArIDFdO1xuICAgICAgICAgICAgcHJldiA9IGl0ZW1zW2kgLSAxXTtcbiAgICAgICAgICAgIGN1cnIgPSBpdGVtc1tpXTtcbiAgICAgICAgICAgIGlmIChNYXRoLnJvdW5kKChuZXh0ICsgcHJldikgLyAyKSAhPT0gY3Vycikge1xuICAgICAgICAgICAgICAgIHRhYmxlLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICB0aW1lOiBjdXJyLFxuICAgICAgICAgICAgICAgICAgICBwb3M6IGkgLyAoaWxlbiAtIDEpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRhYmxlO1xuICAgIH1cbiBfZ2VuZXJhdGUoKSB7XG4gICAgICAgIGNvbnN0IG1pbiA9IHRoaXMubWluO1xuICAgICAgICBjb25zdCBtYXggPSB0aGlzLm1heDtcbiAgICAgICAgbGV0IHRpbWVzdGFtcHMgPSBzdXBlci5nZXREYXRhVGltZXN0YW1wcygpO1xuICAgICAgICBpZiAoIXRpbWVzdGFtcHMuaW5jbHVkZXMobWluKSB8fCAhdGltZXN0YW1wcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRpbWVzdGFtcHMuc3BsaWNlKDAsIDAsIG1pbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aW1lc3RhbXBzLmluY2x1ZGVzKG1heCkgfHwgdGltZXN0YW1wcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHRpbWVzdGFtcHMucHVzaChtYXgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aW1lc3RhbXBzLnNvcnQoKGEsIGIpPT5hIC0gYik7XG4gICAgfVxuIF9nZXRUaW1lc3RhbXBzRm9yVGFibGUoKSB7XG4gICAgICAgIGxldCB0aW1lc3RhbXBzID0gdGhpcy5fY2FjaGUuYWxsIHx8IFtdO1xuICAgICAgICBpZiAodGltZXN0YW1wcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aW1lc3RhbXBzO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmdldERhdGFUaW1lc3RhbXBzKCk7XG4gICAgICAgIGNvbnN0IGxhYmVsID0gdGhpcy5nZXRMYWJlbFRpbWVzdGFtcHMoKTtcbiAgICAgICAgaWYgKGRhdGEubGVuZ3RoICYmIGxhYmVsLmxlbmd0aCkge1xuICAgICAgICAgICAgdGltZXN0YW1wcyA9IHRoaXMubm9ybWFsaXplKGRhdGEuY29uY2F0KGxhYmVsKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aW1lc3RhbXBzID0gZGF0YS5sZW5ndGggPyBkYXRhIDogbGFiZWw7XG4gICAgICAgIH1cbiAgICAgICAgdGltZXN0YW1wcyA9IHRoaXMuX2NhY2hlLmFsbCA9IHRpbWVzdGFtcHM7XG4gICAgICAgIHJldHVybiB0aW1lc3RhbXBzO1xuICAgIH1cbiBnZXREZWNpbWFsRm9yVmFsdWUodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIChpbnRlcnBvbGF0ZSh0aGlzLl90YWJsZSwgdmFsdWUpIC0gdGhpcy5fbWluUG9zKSAvIHRoaXMuX3RhYmxlUmFuZ2U7XG4gICAgfVxuIGdldFZhbHVlRm9yUGl4ZWwocGl4ZWwpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0cyA9IHRoaXMuX29mZnNldHM7XG4gICAgICAgIGNvbnN0IGRlY2ltYWwgPSB0aGlzLmdldERlY2ltYWxGb3JQaXhlbChwaXhlbCkgLyBvZmZzZXRzLmZhY3RvciAtIG9mZnNldHMuZW5kO1xuICAgICAgICByZXR1cm4gaW50ZXJwb2xhdGUodGhpcy5fdGFibGUsIGRlY2ltYWwgKiB0aGlzLl90YWJsZVJhbmdlICsgdGhpcy5fbWluUG9zLCB0cnVlKTtcbiAgICB9XG59XG5cbnZhciBzY2FsZXMgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7XG5fX3Byb3RvX186IG51bGwsXG5DYXRlZ29yeVNjYWxlOiBDYXRlZ29yeVNjYWxlLFxuTGluZWFyU2NhbGU6IExpbmVhclNjYWxlLFxuTG9nYXJpdGhtaWNTY2FsZTogTG9nYXJpdGhtaWNTY2FsZSxcblJhZGlhbExpbmVhclNjYWxlOiBSYWRpYWxMaW5lYXJTY2FsZSxcblRpbWVTY2FsZTogVGltZVNjYWxlLFxuVGltZVNlcmllc1NjYWxlOiBUaW1lU2VyaWVzU2NhbGVcbn0pO1xuXG5jb25zdCByZWdpc3RlcmFibGVzID0gW1xuICAgIGNvbnRyb2xsZXJzLFxuICAgIGVsZW1lbnRzLFxuICAgIHBsdWdpbnMsXG4gICAgc2NhbGVzXG5dO1xuXG5leHBvcnQgeyBBbmltYXRpb24sIEFuaW1hdGlvbnMsIEFyY0VsZW1lbnQsIEJhckNvbnRyb2xsZXIsIEJhckVsZW1lbnQsIEJhc2VQbGF0Zm9ybSwgQmFzaWNQbGF0Zm9ybSwgQnViYmxlQ29udHJvbGxlciwgQ2F0ZWdvcnlTY2FsZSwgQ2hhcnQsIHBsdWdpbl9jb2xvcnMgYXMgQ29sb3JzLCBEYXRhc2V0Q29udHJvbGxlciwgcGx1Z2luX2RlY2ltYXRpb24gYXMgRGVjaW1hdGlvbiwgRG9tUGxhdGZvcm0sIERvdWdobnV0Q29udHJvbGxlciwgRWxlbWVudCwgaW5kZXggYXMgRmlsbGVyLCBJbnRlcmFjdGlvbiwgcGx1Z2luX2xlZ2VuZCBhcyBMZWdlbmQsIExpbmVDb250cm9sbGVyLCBMaW5lRWxlbWVudCwgTGluZWFyU2NhbGUsIExvZ2FyaXRobWljU2NhbGUsIFBpZUNvbnRyb2xsZXIsIFBvaW50RWxlbWVudCwgUG9sYXJBcmVhQ29udHJvbGxlciwgUmFkYXJDb250cm9sbGVyLCBSYWRpYWxMaW5lYXJTY2FsZSwgU2NhbGUsIFNjYXR0ZXJDb250cm9sbGVyLCBwbHVnaW5fc3VidGl0bGUgYXMgU3ViVGl0bGUsIFRpY2tzLCBUaW1lU2NhbGUsIFRpbWVTZXJpZXNTY2FsZSwgcGx1Z2luX3RpdGxlIGFzIFRpdGxlLCBwbHVnaW5fdG9vbHRpcCBhcyBUb29sdGlwLCBhZGFwdGVycyBhcyBfYWRhcHRlcnMsIF9kZXRlY3RQbGF0Zm9ybSwgYW5pbWF0b3IsIGNvbnRyb2xsZXJzLCBkZWZhdWx0cywgZWxlbWVudHMsIGxheW91dHMsIHBsdWdpbnMsIHJlZ2lzdGVyYWJsZXMsIHJlZ2lzdHJ5LCBzY2FsZXMgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNoYXJ0LmpzLm1hcFxuIiwiaW1wb3J0IHtDaGFydCwgcmVnaXN0ZXJhYmxlc30gZnJvbSAnLi4vZGlzdC9jaGFydC5qcyc7XG5cbkNoYXJ0LnJlZ2lzdGVyKC4uLnJlZ2lzdGVyYWJsZXMpO1xuXG5leHBvcnQgKiBmcm9tICcuLi9kaXN0L2NoYXJ0LmpzJztcbmV4cG9ydCBkZWZhdWx0IENoYXJ0O1xuIiwiY29uc3QgcmFuZG9tVVVJRCA9IHR5cGVvZiBjcnlwdG8gIT09ICd1bmRlZmluZWQnICYmIGNyeXB0by5yYW5kb21VVUlEICYmIGNyeXB0by5yYW5kb21VVUlELmJpbmQoY3J5cHRvKTtcbmV4cG9ydCBkZWZhdWx0IHtcbiAgcmFuZG9tVVVJRFxufTsiLCIvLyBVbmlxdWUgSUQgY3JlYXRpb24gcmVxdWlyZXMgYSBoaWdoIHF1YWxpdHkgcmFuZG9tICMgZ2VuZXJhdG9yLiBJbiB0aGUgYnJvd3NlciB3ZSB0aGVyZWZvcmVcbi8vIHJlcXVpcmUgdGhlIGNyeXB0byBBUEkgYW5kIGRvIG5vdCBzdXBwb3J0IGJ1aWx0LWluIGZhbGxiYWNrIHRvIGxvd2VyIHF1YWxpdHkgcmFuZG9tIG51bWJlclxuLy8gZ2VuZXJhdG9ycyAobGlrZSBNYXRoLnJhbmRvbSgpKS5cbmxldCBnZXRSYW5kb21WYWx1ZXM7XG5jb25zdCBybmRzOCA9IG5ldyBVaW50OEFycmF5KDE2KTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJuZygpIHtcbiAgLy8gbGF6eSBsb2FkIHNvIHRoYXQgZW52aXJvbm1lbnRzIHRoYXQgbmVlZCB0byBwb2x5ZmlsbCBoYXZlIGEgY2hhbmNlIHRvIGRvIHNvXG4gIGlmICghZ2V0UmFuZG9tVmFsdWVzKSB7XG4gICAgLy8gZ2V0UmFuZG9tVmFsdWVzIG5lZWRzIHRvIGJlIGludm9rZWQgaW4gYSBjb250ZXh0IHdoZXJlIFwidGhpc1wiIGlzIGEgQ3J5cHRvIGltcGxlbWVudGF0aW9uLlxuICAgIGdldFJhbmRvbVZhbHVlcyA9IHR5cGVvZiBjcnlwdG8gIT09ICd1bmRlZmluZWQnICYmIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMgJiYgY3J5cHRvLmdldFJhbmRvbVZhbHVlcy5iaW5kKGNyeXB0byk7XG5cbiAgICBpZiAoIWdldFJhbmRvbVZhbHVlcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKCkgbm90IHN1cHBvcnRlZC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS91dWlkanMvdXVpZCNnZXRyYW5kb212YWx1ZXMtbm90LXN1cHBvcnRlZCcpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBnZXRSYW5kb21WYWx1ZXMocm5kczgpO1xufSIsImltcG9ydCB2YWxpZGF0ZSBmcm9tICcuL3ZhbGlkYXRlLmpzJztcbi8qKlxuICogQ29udmVydCBhcnJheSBvZiAxNiBieXRlIHZhbHVlcyB0byBVVUlEIHN0cmluZyBmb3JtYXQgb2YgdGhlIGZvcm06XG4gKiBYWFhYWFhYWC1YWFhYLVhYWFgtWFhYWC1YWFhYWFhYWFhYWFhcbiAqL1xuXG5jb25zdCBieXRlVG9IZXggPSBbXTtcblxuZm9yIChsZXQgaSA9IDA7IGkgPCAyNTY7ICsraSkge1xuICBieXRlVG9IZXgucHVzaCgoaSArIDB4MTAwKS50b1N0cmluZygxNikuc2xpY2UoMSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdW5zYWZlU3RyaW5naWZ5KGFyciwgb2Zmc2V0ID0gMCkge1xuICAvLyBOb3RlOiBCZSBjYXJlZnVsIGVkaXRpbmcgdGhpcyBjb2RlISAgSXQncyBiZWVuIHR1bmVkIGZvciBwZXJmb3JtYW5jZVxuICAvLyBhbmQgd29ya3MgaW4gd2F5cyB5b3UgbWF5IG5vdCBleHBlY3QuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdXVpZGpzL3V1aWQvcHVsbC80MzRcbiAgcmV0dXJuIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDJdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgM11dICsgJy0nICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA0XV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDVdXSArICctJyArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgNl1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA3XV0gKyAnLScgKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDhdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgOV1dICsgJy0nICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxMF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxMV1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxMl1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxM11dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxNF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxNV1dO1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnkoYXJyLCBvZmZzZXQgPSAwKSB7XG4gIGNvbnN0IHV1aWQgPSB1bnNhZmVTdHJpbmdpZnkoYXJyLCBvZmZzZXQpOyAvLyBDb25zaXN0ZW5jeSBjaGVjayBmb3IgdmFsaWQgVVVJRC4gIElmIHRoaXMgdGhyb3dzLCBpdCdzIGxpa2VseSBkdWUgdG8gb25lXG4gIC8vIG9mIHRoZSBmb2xsb3dpbmc6XG4gIC8vIC0gT25lIG9yIG1vcmUgaW5wdXQgYXJyYXkgdmFsdWVzIGRvbid0IG1hcCB0byBhIGhleCBvY3RldCAobGVhZGluZyB0b1xuICAvLyBcInVuZGVmaW5lZFwiIGluIHRoZSB1dWlkKVxuICAvLyAtIEludmFsaWQgaW5wdXQgdmFsdWVzIGZvciB0aGUgUkZDIGB2ZXJzaW9uYCBvciBgdmFyaWFudGAgZmllbGRzXG5cbiAgaWYgKCF2YWxpZGF0ZSh1dWlkKSkge1xuICAgIHRocm93IFR5cGVFcnJvcignU3RyaW5naWZpZWQgVVVJRCBpcyBpbnZhbGlkJyk7XG4gIH1cblxuICByZXR1cm4gdXVpZDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgc3RyaW5naWZ5OyIsImltcG9ydCBuYXRpdmUgZnJvbSAnLi9uYXRpdmUuanMnO1xuaW1wb3J0IHJuZyBmcm9tICcuL3JuZy5qcyc7XG5pbXBvcnQgeyB1bnNhZmVTdHJpbmdpZnkgfSBmcm9tICcuL3N0cmluZ2lmeS5qcyc7XG5cbmZ1bmN0aW9uIHY0KG9wdGlvbnMsIGJ1Ziwgb2Zmc2V0KSB7XG4gIGlmIChuYXRpdmUucmFuZG9tVVVJRCAmJiAhYnVmICYmICFvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5hdGl2ZS5yYW5kb21VVUlEKCk7XG4gIH1cblxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgY29uc3Qgcm5kcyA9IG9wdGlvbnMucmFuZG9tIHx8IChvcHRpb25zLnJuZyB8fCBybmcpKCk7IC8vIFBlciA0LjQsIHNldCBiaXRzIGZvciB2ZXJzaW9uIGFuZCBgY2xvY2tfc2VxX2hpX2FuZF9yZXNlcnZlZGBcblxuICBybmRzWzZdID0gcm5kc1s2XSAmIDB4MGYgfCAweDQwO1xuICBybmRzWzhdID0gcm5kc1s4XSAmIDB4M2YgfCAweDgwOyAvLyBDb3B5IGJ5dGVzIHRvIGJ1ZmZlciwgaWYgcHJvdmlkZWRcblxuICBpZiAoYnVmKSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0IHx8IDA7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDE2OyArK2kpIHtcbiAgICAgIGJ1ZltvZmZzZXQgKyBpXSA9IHJuZHNbaV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ1ZjtcbiAgfVxuXG4gIHJldHVybiB1bnNhZmVTdHJpbmdpZnkocm5kcyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHY0OyIsImltcG9ydCBDaGFydCBmcm9tICdjaGFydC5qcy9hdXRvJztcbmltcG9ydCB7IHY0IGFzIHV1aWR2NCB9IGZyb20gJ3V1aWQnO1xuXG5leHBvcnQgY2xhc3MgQ2hhcnRKU1dpZGdldCB7XG4gICAgY29uc3RydWN0b3IodGl0bGUsIGRlc2NyaXB0aW9uLCBkYXRhLCBvcHRpb25zID0ge30sIHR5cGU9XCJiYXJcIikge1xuICAgIHRoaXMudGl0bGUgPSB0aXRsZTtcbiAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICB0aGlzLmRhdGFJc1ZhbGlkID0gQXJyYXkuaXNBcnJheShkYXRhKSA/IGRhdGEubGVuZ3RoID4gMCA6ICEhZGF0YTtcbiAgfVxuXG5cbiAgcGxvdChkaXZXaWR0aCwgZGl2SGVpZ2h0LCBlbGVtZW50KSB7XG4gICAgICBlbGVtZW50LnN0eWxlID0gXCJiYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNWY1OyBwYWRkaW5nOiA1cHg7XCI7XG5cbiAgICAgIGNvbnN0IHRpdGxlX2VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgdGl0bGVfZWxlbWVudC5jbGFzc05hbWUgPSBcImNoYXJ0LXRpdGxlIGdyaWQtdGl0bGVcIjtcbiAgICAgIHRpdGxlX2VsZW1lbnQuaW5uZXJIVE1MID0gdGhpcy50aXRsZTtcbiAgICAgIHRpdGxlX2VsZW1lbnQuc3R5bGUgPSBcIm1hcmdpbi1ib3R0b206IDVweFwiO1xuICAgICAgaWYgKHRoaXMuZGVzY3JpcHRpb24pIHtcbiAgICAgICAgICBjb25zdCBxdWVzdGlvbl9tYXJrX2VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgIHF1ZXN0aW9uX21hcmtfZWxlbWVudC5jbGFzc05hbWUgPSBcInF1ZXN0aW9uLW1hcmstbGVnYWN5XCI7XG4gICAgICAgICAgcXVlc3Rpb25fbWFya19lbGVtZW50LmlubmVySFRNTCA9IFwiP1wiO1xuICAgICAgICAgIGNvbnN0IHJhbmRvbUlkID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICBxdWVzdGlvbl9tYXJrX2VsZW1lbnQuaWQgPSBgaWQtJHtyYW5kb21JZH1gO1xuICAgICAgICAgIHRpdGxlX2VsZW1lbnQuYXBwZW5kQ2hpbGQocXVlc3Rpb25fbWFya19lbGVtZW50KTtcblxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCB0YXJnZXRFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBpZC0ke3JhbmRvbUlkfWApO1xuICAgICAgICAgICAgICBpZiAodGFyZ2V0RWwpXG4gICAgICAgICAgICAgICAgICB0YXJnZXRFbC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLm9uU2hvd0Rlc2ModGhpcy5kZXNjcmlwdGlvbik7XG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQodGl0bGVfZWxlbWVudCk7XG5cbiAgICAgIGNvbnN0IGNhcmRfZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICBjYXJkX2VsZW1lbnQuY2xhc3NOYW1lID0gXCJjYXJkXCJcbiAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoY2FyZF9lbGVtZW50KTtcblxuICAgICAgdGhpcy5jYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICAgICAgdGhpcy5jYW52YXMuaWQgPSB1dWlkdjQoKTtcbiAgICAgIGNhcmRfZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLmNhbnZhcyk7XG4gICAgICB0aGlzLmNhbnZhcy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAnI2ZmZic7XG5cbiAgICAgIHRoaXMuY2hhcnQgPSBuZXcgQ2hhcnQodGhpcy5jYW52YXMuaWQsIHtcbiAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgICBkYXRhOiB0aGlzLmRhdGEsXG4gICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucy5jaGFydGpzX29wdGlvbnNcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG59XG4iLCJpbXBvcnQgKiBhcyBkMyBmcm9tIFwiZDNcIjtcbmltcG9ydCB7IEJhc2VDaGFydFdpZGdldCB9IGZyb20gXCIuL2Jhc2VcIjtcbi8vaW1wb3J0IHsgaW50ZXJwb2xhdGVHcmVlbnMgfSBmcm9tIFwiZDMtc2NhbGUtY2hyb21hdGljXCI7XG5cbmV4cG9ydCBjbGFzcyBIZWF0TWFwV2lkZ2V0IGV4dGVuZHMgQmFzZUNoYXJ0V2lkZ2V0IHtcbiAgY29uc3RydWN0b3IodGl0bGUsIGRlc2NyaXB0aW9uLCBkYXRhLCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMudHJhbnNmb3JtKSBkYXRhID0gKGRhdGEgPz8gW10pLm1hcChvcHRpb25zLnRyYW5zZm9ybSk7XG5cbiAgICBzdXBlcih0aXRsZSwgZGVzY3JpcHRpb24sIGRhdGEsIG9wdGlvbnMpO1xuICB9XG5cbiAgcGxvdChkaXZXaWR0aCwgZGl2SGVpZ2h0LCBlbCkge1xuICAgIHRoaXMubWFyZ2luUmlnaHQgPSA0MFxuICAgIHRoaXMubWFyZ2luQm90dG9tID0gNDBcbiAgICBjb25zdCBbd2lkdGgsIGhlaWdodF0gPSB0aGlzLmNsZWFyQW5kU2NhbGVTdmcoZGl2V2lkdGgsIGRpdkhlaWdodCwyMCwyMCk7XG4gICAgdGhpcy5kcmF3VGl0bGUoKTtcblxuICAgIGlmICghdGhpcy5kYXRhSXNWYWxpZCkge1xuICAgICAgdGhpcy5zaG93RXJyb3JNZXNzYWdlKGRpdldpZHRoLCBkaXZIZWlnaHQpO1xuICAgICAgcmV0dXJuIHRoaXMud3JhcHBlci5pbm5lckhUTUw7XG4gICAgfVxuICAgIGNvbnN0IGdyb3VwcyA9IGQzLm1hcCh0aGlzLmRhdGEsIGZ1bmN0aW9uKGQpe3JldHVybiBkLmdyb3VwO30pXG4gICAgY29uc3QgdmFycyA9IGQzLm1hcCh0aGlzLmRhdGEsIGZ1bmN0aW9uKGQpe3JldHVybiBkLnZhcmlhYmxlO30pXG5cbiAgICBjb25zdCB4U2NhbGUgPSBkMy5zY2FsZUJhbmQoKS5yYW5nZShbMCwgd2lkdGhdKS5wYWRkaW5nKDAuMSk7XG4gICAgY29uc3QgeVNjYWxlID0gZDMuc2NhbGVCYW5kKCkucmFuZ2UoW2hlaWdodCwgMF0pLnBhZGRpbmcoMC4xKTtcblxuICAgIHhTY2FsZS5kb21haW4oZ3JvdXBzKTtcbiAgICB5U2NhbGUuZG9tYWluKHZhcnMpO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5zaG93TGVnZW5kKVxuICAgIHtcbiAgICAgIHRoaXMuZy5hcHBlbmQoXCJnXCIpXG4gICAgICAuc3R5bGUoXCJmb250LXNpemVcIiwgMTUpXG4gICAgICAuYXR0cihcInRyYW5zZm9ybVwiLCBcInRyYW5zbGF0ZSgwLFwiICsgaGVpZ2h0ICsgXCIpXCIpXG4gICAgICAuY2FsbChkMy5heGlzQm90dG9tKHhTY2FsZSkudGlja1NpemUoMCkpXG4gICAgICAuc2VsZWN0KFwiLmRvbWFpblwiKS5yZW1vdmUoKTtcblxuICAgICAgdGhpcy5nLmFwcGVuZChcImdcIilcbiAgICAgIC5zdHlsZShcImZvbnQtc2l6ZVwiLCAxNSlcbiAgICAgIC5jYWxsKGQzLmF4aXNMZWZ0KHlTY2FsZSkudGlja1NpemUoMCkpXG4gICAgICAuc2VsZWN0KFwiLmRvbWFpblwiKS5yZW1vdmUoKVxuICAgIH1cblxuICAgIGNvbnN0IG1heCA9IGQzLm1heCh0aGlzLmRhdGEsIChkKSA9PiBkLnZhbHVlKTtcblxuICAgIGNvbnN0IGNvbG9yU2NhbGUgPSBkMy5zY2FsZVNlcXVlbnRpYWwoKS5pbnRlcnBvbGF0b3IoZDMuaW50ZXJwb2xhdGVHcmVlbnMpLmRvbWFpbihbMCxtYXhdKVxuXG4gICAgdGhpcy5nLnNlbGVjdEFsbCgpXG4gICAgLmRhdGEodGhpcy5kYXRhLCBmdW5jdGlvbihkKSB7cmV0dXJuIGQuZ3JvdXArJzonK2QudmFyaWFibGU7fSlcbiAgICAuZW50ZXIoKVxuICAgIC5hcHBlbmQoXCJyZWN0XCIpXG4gICAgICAuYXR0cihcInhcIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4geFNjYWxlKGQuZ3JvdXApIH0pXG4gICAgICAuYXR0cihcInlcIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4geVNjYWxlKGQudmFyaWFibGUpIH0pXG4gICAgICAuYXR0cihcInJ4XCIsIDQpXG4gICAgICAuYXR0cihcInJ5XCIsIDQpXG4gICAgICAuYXR0cihcIndpZHRoXCIsIHhTY2FsZS5iYW5kd2lkdGgoKSApXG4gICAgICAuYXR0cihcImhlaWdodFwiLCB5U2NhbGUuYmFuZHdpZHRoKCkgKVxuICAgICAgLnN0eWxlKFwiZmlsbFwiLCBmdW5jdGlvbihkKSB7IHJldHVybiBjb2xvclNjYWxlKGQudmFsdWUpfSApXG4gICAgICAuc3R5bGUoXCJzdHJva2Utd2lkdGhcIiwgNClcbiAgICAgIC5zdHlsZShcInN0cm9rZVwiLCBcIm5vbmVcIilcbiAgICAgIC5zdHlsZShcIm9wYWNpdHlcIiwgMC44KTtcblxuICAgIHJldHVybiB0aGlzLndyYXBwZXIuaW5uZXJIVE1MO1xuICB9XG59XG4iLCJcblxuZXhwb3J0IGNsYXNzIEJhc2VFbGVtZW50IHtcblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMgPSB7fSkge1xuXG4gICAgfVxuXG4gICAgcGxvdChkaXZXaWR0aCwgZGl2SGVpZ2h0LCBlbGVtZW50KSB7XG5cbiAgICB9XG59IiwiaW1wb3J0IHtCYXNlRWxlbWVudH0gZnJvbSBcIi4vYmFzZV9lbGVtZW50XCI7XG5cbmV4cG9ydCBjbGFzcyBUZXh0RWxlbWVudCBleHRlbmRzIEJhc2VFbGVtZW50IHtcblxuICAgIGNvbnN0cnVjdG9yKHRleHQsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBzdXBlcihvcHRpb25zKTtcbiAgICAgICAgdGhpcy50ZXh0ID0gdGV4dDtcbiAgICB9XG5cbiAgICBwbG90KGRpdldpZHRoLCBkaXZIZWlnaHQsIGVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgdGl0bGVfZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHRpdGxlX2VsZW1lbnQuaW5uZXJIVE1MID0gdGhpcy50ZXh0O1xuICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKHRpdGxlX2VsZW1lbnQpO1xuICAgIH1cbn0iLCJpbXBvcnQge0Jhc2VFbGVtZW50fSBmcm9tIFwiLi9iYXNlX2VsZW1lbnRcIjtcblxuZXhwb3J0IGNsYXNzIFRleHRBcmVhRWxlbWVudCBleHRlbmRzIEJhc2VFbGVtZW50IHtcblxuICAgIGNvbnN0cnVjdG9yKHRleHQsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBzdXBlcihvcHRpb25zKTtcbiAgICAgICAgdGhpcy50ZXh0ID0gdGV4dDtcbiAgICB9XG5cbiAgICBwbG90KGRpdldpZHRoLCBkaXZIZWlnaHQsIGVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgdGl0bGVfZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZXh0YXJlYVwiKTtcbiAgICAgICAgdGl0bGVfZWxlbWVudC5wbGFjZWhvbGRlciA9IHRoaXMudGV4dDtcbiAgICAgICAgdGl0bGVfZWxlbWVudC5yb3dzID0gZGl2SGVpZ2h0IC8gMjQ7XG4gICAgICAgIHRpdGxlX2VsZW1lbnQuaGVpZ2h0ID0gZGl2SGVpZ2h0O1xuICAgICAgICB0aXRsZV9lbGVtZW50LmNsYXNzTmFtZSA9IFwiZm9ybS1jb250cm9sXCI7XG4gICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQodGl0bGVfZWxlbWVudCk7XG4gICAgfVxufSIsImltcG9ydCAqIGFzIGQzIGZyb20gXCJkM1wiO1xuaW1wb3J0IHsgQmFzZUNoYXJ0V2lkZ2V0IH0gZnJvbSBcIi4vYmFzZVwiO1xuXG4vLyBvcHRpb25zLmhpZ2hsaWdodCAtPiB7Y29sdW1uMSwgY29sdW1uMn1cblxuZXhwb3J0IGNsYXNzIFNjYXR0ZXJDaGFydFdpZGdldCBleHRlbmRzIEJhc2VDaGFydFdpZGdldCB7XG4gIGNvbnN0cnVjdG9yKHRpdGxlLCBkZXNjcmlwdGlvbiwgZGF0YSwgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLnRyYW5zZm9ybSkgZGF0YSA9IChkYXRhID8/IFtdKS5tYXAob3B0aW9ucy50cmFuc2Zvcm0pO1xuXG4gICAgc3VwZXIodGl0bGUsIGRlc2NyaXB0aW9uLCBkYXRhLCBvcHRpb25zKTtcbiAgfVxuXG4gIHBsb3QoZGl2V2lkdGgsIGRpdkhlaWdodCwgZWwpIHtcbiAgICB0aGlzLm1hcmdpblJpZ2h0ID0gNTA7XG4gICAgdGhpcy5tYXJnaW5Cb3R0b20gPSA1MDtcbiAgICBjb25zdCBbd2lkdGgsIGhlaWdodF0gPSB0aGlzLmNsZWFyQW5kU2NhbGVTdmcoZGl2V2lkdGgsIGRpdkhlaWdodCwyMCw0MCk7XG4gICAgdGhpcy5kcmF3VGl0bGUoKTtcblxuICAgIGlmICghdGhpcy5kYXRhSXNWYWxpZCkge1xuICAgICAgdGhpcy5zaG93RXJyb3JNZXNzYWdlKGRpdldpZHRoLCBkaXZIZWlnaHQpO1xuICAgICAgcmV0dXJuIHRoaXMud3JhcHBlci5pbm5lckhUTUw7XG4gICAgfVxuXG4gICAgY29uc3QgY2lyY2xlX2NvbG9yID0gXCJjb2xvclwiIGluIHRoaXMub3B0aW9ucyA/IHRoaXMub3B0aW9ucy5jb2xvciA6IFwiIzAwMTEyMlwiO1xuICAgIGNvbnN0IGhpZ2hsaWdodF9jb2xvciA9IFwiaGlnaGxpZ2h0X2NvbG9yXCIgaW4gdGhpcy5vcHRpb25zID8gdGhpcy5vcHRpb25zLmhpZ2hsaWdodF9jb2xvciA6IFwiIzAwQUE0NFwiO1xuXG4gICAgY29uc3QgeG1heCA9IFwieG1heFwiIGluIHRoaXMub3B0aW9ucyA/IHRoaXMub3B0aW9ucy54bWF4IDogZDMubWF4KHRoaXMuZGF0YSwgKGQpID0+IGQuY29sdW1uMSk7XG4gICAgY29uc3QgeW1heCA9IFwieW1heFwiIGluIHRoaXMub3B0aW9ucyA/IHRoaXMub3B0aW9ucy55bWF4IDogZDMubWF4KHRoaXMuZGF0YSwgKGQpID0+IGQuY29sdW1uMik7XG5cbiAgICBjb25zdCB4U2NhbGUgPSBkMy5zY2FsZUxpbmVhcigpLnJhbmdlKFswLCB3aWR0aF0pO1xuICAgIGNvbnN0IHlTY2FsZSA9IGQzLnNjYWxlTGluZWFyKCkucmFuZ2UoWzAsIGhlaWdodF0pO1xuXG4gICAgeFNjYWxlLmRvbWFpbihbMCwgeG1heF0pO1xuICAgIHlTY2FsZS5kb21haW4oWzAsIHltYXhdKTtcblxuICAgIGNvbnN0IHNob3dBeGVzID0gXCJzaG93QXhlc1wiIGluIHRoaXMub3B0aW9ucyA/IHRoaXMub3B0aW9ucy5zaG93QXhlcyA6IHRydWU7XG4gICAgaWYoc2hvd0F4ZXMpIHtcbiAgICAgIHRoaXMuYXBwZW5kWEF4aXMoeFNjYWxlLCBoZWlnaHQpO1xuICAgICAgdGhpcy5hcHBlbmRYQXhpc0xhYmVsKHdpZHRoLCBoZWlnaHQpO1xuICAgICAgdGhpcy5hcHBlbmRZQXhpc0xhYmVsKCk7XG4gICAgICB0aGlzLmcuYXBwZW5kKFwiZ1wiKS5hdHRyKFwidHJhbnNmb3JtXCIsIFwidHJhbnNsYXRlKDAsIDApXCIpLmNhbGwoZDMuYXhpc0xlZnQoeVNjYWxlKSk7XG4gICAgfVxuXG4gICAgdGhpcy5nLmFwcGVuZCgnZycpXG4gICAgLnNlbGVjdEFsbChcImRvdFwiKVxuICAgIC5kYXRhKHRoaXMuZGF0YSlcbiAgICAuZW50ZXIoKVxuICAgIC5hcHBlbmQoXCJjaXJjbGVcIilcbiAgICAgIC5hdHRyKFwiY3hcIiwgZnVuY3Rpb24gKGQpIHsgcmV0dXJuIHhTY2FsZShkLmNvbHVtbjEpOyB9IClcbiAgICAgIC5hdHRyKFwiY3lcIiwgZnVuY3Rpb24gKGQpIHsgcmV0dXJuIHlTY2FsZShkLmNvbHVtbjIpOyB9IClcbiAgICAgIC5hdHRyKFwiclwiLCAyLjUpXG4gICAgICAuc3R5bGUoXCJmaWxsXCIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIFwiaGlnaGxpZ2h0XCIgaW4gZCA/IChkLmhpZ2hsaWdodCA/IGhpZ2hsaWdodF9jb2xvciA6IGNpcmNsZV9jb2xvcikgOiBjaXJjbGVfY29sb3J9IClcblxuICAgIHJldHVybiB0aGlzLndyYXBwZXIuaW5uZXJIVE1MO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBkMyBmcm9tIFwiZDNcIjtcbmltcG9ydCB7IEJhc2VDaGFydFdpZGdldCB9IGZyb20gXCIuL2Jhc2VcIjtcblxuLypcbmRhdGEgPSB7XG4gICAgbWluOiAwLFxuICAgIG1heDogMTAwLFxuICAgIHExOiAxMixcbiAgICBtZWRpYW46IDM1LFxuICAgIHEzOiA2Nyxcbn1cblxuICovXG5cbmV4cG9ydCBjbGFzcyBCb3hQbG90V2lkZ2V0IGV4dGVuZHMgQmFzZUNoYXJ0V2lkZ2V0IHtcbiAgICBjb25zdHJ1Y3Rvcih0aXRsZSwgZGVzY3JpcHRpb24sIGRhdGEsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMudHJhbnNmb3JtKSBkYXRhID0gKGRhdGEgPz8gW10pLm1hcChvcHRpb25zLnRyYW5zZm9ybSk7XG5cbiAgICAgICAgc3VwZXIodGl0bGUsIGRlc2NyaXB0aW9uLCBkYXRhLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5tYXJnaW5SaWdodCA9IDEwXG4gICAgICAgIHRoaXMubWFyZ2luQm90dG9tID0gMjBcbiAgICB9XG5cbiAgICBwbG90KGRpdldpZHRoLCBkaXZIZWlnaHQsIGVsKSB7XG4gICAgICAgIGNvbnN0IFt3aWR0aCwgaGVpZ2h0XSA9IHRoaXMuY2xlYXJBbmRTY2FsZVN2ZyhkaXZXaWR0aCwgZGl2SGVpZ2h0LCA1LCAxMCk7XG5cbiAgICAgICAgdGhpcy5kcmF3VGl0bGUoKTtcblxuICAgICAgICAvKmlmICghdGhpcy5kYXRhSXNWYWxpZCkge1xuICAgICAgICAgICAgdGhpcy5zaG93RXJyb3JNZXNzYWdlKGRpdldpZHRoLCBkaXZIZWlnaHQpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMud3JhcHBlci5pbm5lckhUTUw7XG4gICAgICAgIH0qLyAvLyBUT0RPXG5cblxuICAgICAgICBjb25zdCB4U2NhbGUgPSBkMy5zY2FsZUxpbmVhcigpXG4gICAgICAgICAgICAuZG9tYWluKFt0aGlzLmRhdGEubWluLHRoaXMuZGF0YS5tYXhdKVxuICAgICAgICAgICAgLnJhbmdlKFt3aWR0aCwgMF0pO1xuXG4gICAgICAgIGxldCBjZW50ZXIgPSBoZWlnaHQgLyAyLjA7XG5cbiAgICAgICAgLy8gU2hvdyB0aGUgbWFpbiBob3Jpem9udGFsIGxpbmVcbiAgICAgICAgdGhpcy5nXG4gICAgICAgICAgICAuYXBwZW5kKFwibGluZVwiKVxuICAgICAgICAgICAgLmF0dHIoXCJ4MVwiLCB4U2NhbGUodGhpcy5kYXRhLm1pbikpXG4gICAgICAgICAgICAuYXR0cihcIngyXCIsIHhTY2FsZSh0aGlzLmRhdGEubWF4KSlcbiAgICAgICAgICAgIC5hdHRyKFwieTFcIiwgY2VudGVyIClcbiAgICAgICAgICAgIC5hdHRyKFwieTJcIiwgY2VudGVyIClcbiAgICAgICAgICAgIC5hdHRyKFwic3Ryb2tlXCIsIFwiYmxhY2tcIilcblxuICAgICAgICAvLyBTaG93IHRoZSBib3hcbiAgICAgICAgdGhpcy5nXG4gICAgICAgICAgICAuYXBwZW5kKFwicmVjdFwiKVxuICAgICAgICAgICAgLmF0dHIoXCJ4XCIsIHhTY2FsZSh0aGlzLmRhdGEucTMpKVxuICAgICAgICAgICAgLmF0dHIoXCJ5XCIsIGNlbnRlciAtIGhlaWdodCAvIDIpXG4gICAgICAgICAgICAuYXR0cihcImhlaWdodFwiLCBoZWlnaHQpXG4gICAgICAgICAgICAuYXR0cihcIndpZHRoXCIsIHhTY2FsZSh0aGlzLmRhdGEucTEpIC0geFNjYWxlKHRoaXMuZGF0YS5xMykpXG4gICAgICAgICAgICAuYXR0cihcInN0cm9rZVwiLCBcImJsYWNrXCIpXG4gICAgICAgICAgICAuc3R5bGUoXCJmaWxsXCIsIFwiIzY5YjNhMlwiKVxuXG4gICAgICAgIC8vIHNob3cgbWVkaWFuLCBtaW4gYW5kIG1heCBob3Jpem9udGFsIGxpbmVzXG4gICAgICAgIHRoaXMuZ1xuICAgICAgICAgICAgLnNlbGVjdEFsbChcInRvdG9cIilcbiAgICAgICAgICAgIC5kYXRhKFt0aGlzLmRhdGEubWluLCB0aGlzLmRhdGEubWVkaWFuLCB0aGlzLmRhdGEubWF4XSlcbiAgICAgICAgICAgIC5lbnRlcigpXG4gICAgICAgICAgICAuYXBwZW5kKFwibGluZVwiKVxuICAgICAgICAgICAgLmF0dHIoXCJ4MVwiLCBmdW5jdGlvbihkKXsgcmV0dXJuKHhTY2FsZShkKSl9KVxuICAgICAgICAgICAgLmF0dHIoXCJ4MlwiLCBmdW5jdGlvbihkKXsgcmV0dXJuKHhTY2FsZShkKSl9KVxuICAgICAgICAgICAgLmF0dHIoXCJ5MVwiLCBjZW50ZXIgLSBoZWlnaHQgLyAyIClcbiAgICAgICAgICAgIC5hdHRyKFwieTJcIiwgY2VudGVyICsgaGVpZ2h0IC8gMiApXG4gICAgICAgICAgICAuYXR0cihcInN0cm9rZVwiLCBcImJsYWNrXCIpXG5cbiAgICAgICAgcmV0dXJuIHRoaXMud3JhcHBlci5pbm5lckhUTUw7XG4gICAgfVxufVxuIiwiaW1wb3J0ICogYXMgZDMgZnJvbSBcImQzXCI7XG5pbXBvcnQgeyBCYXNlQ2hhcnRXaWRnZXQgfSBmcm9tIFwiLi9iYXNlXCI7XG5cbmltcG9ydCB7IEFyZWFDaGFydFdpZGdldCB9IGZyb20gXCIuL2FyZWFjaGFydFwiO1xuaW1wb3J0IHsgQmFyQ2hhcnRXaWRnZXQgfSBmcm9tIFwiLi9iYXJjaGFydFwiO1xuaW1wb3J0IHsgQ2hhcnRKU1dpZGdldCB9IGZyb20gXCIuL2NoYXJ0anNcIjtcbmltcG9ydCB7IEdyb3VwZWRCYXJDaGFydFdpZGdldCB9IGZyb20gXCIuL2dyb3VwZWRfYmFyY2hhcnRcIjtcbmltcG9ydCB7IEhlYXRNYXBXaWRnZXQgfSBmcm9tIFwiLi9oZWF0bWFwXCI7XG5pbXBvcnQgeyBMaW5lQ2hhcnRXaWRnZXQgfSBmcm9tIFwiLi9saW5lY2hhcnRcIjtcbmltcG9ydCB7IFBpZUNoYXJ0V2lkZ2V0IH0gZnJvbSBcIi4vcGllY2hhcnRcIjtcbmltcG9ydCB7IFNpbXBsZUdyb3VwZWRCYXJDaGFydFdpZGdldCB9IGZyb20gXCIuL3NpbXBsZV9ncm91cGVkX2JhcmNoYXJ0XCI7XG5pbXBvcnQgeyBTdGFja2VkQmFyQ2hhcnRXaWRnZXQgfSBmcm9tIFwiLi9zdGFja2VkX2JhcmNoYXJ0XCI7XG5pbXBvcnQge1RleHRFbGVtZW50fSBmcm9tIFwiLi4vZWxlbWVudHMvdGV4dGVsZW1lbnRcIjtcbmltcG9ydCB7VGV4dEFyZWFFbGVtZW50fSBmcm9tIFwiLi4vZWxlbWVudHMvdGV4dGFyZWFlbGVtZW50XCI7XG5pbXBvcnQgeyBTY2F0dGVyQ2hhcnRXaWRnZXQgfSBmcm9tIFwiLi9zY2F0dGVyY2hhcnRcIjtcbmltcG9ydCB7Qm94UGxvdFdpZGdldH0gZnJvbSBcIi4vYm94cGxvdFwiO1xuXG5cbmNvbnN0IGNoYXJ0X3R5cGVzID0gW1xuICBcImFyZWFjaGFydFwiLFxuICBcImJhcmNoYXJ0XCIsXG4gIFwiY2hhcnRqc1wiLFxuICBcImdyb3VwZWRfYmFyY2hhcnRcIixcbiAgXCJoZWF0bWFwXCIsXG4gIFwibGluZWNoYXJ0XCIsXG4gIFwicGllY2hhcnRcIixcbiAgXCJzaW1wbGVfZ3JvdXBlZF9iYXJjaGFydFwiLFxuICBcInN0YWNrZWRfYmFyY2hhcnRcIixcbiAgXCJzY2F0dGVyY2hhcnRcIlxuXVxuXG5cbi8qXG4gKiAvLyBjb25maWc6IHJvdyBvZGVyIGNvbHVtblxuICBbXG4gICAgICB7dHlwZTogXCJcIiwgbmFtZTogXCJcIiwgb3B0aW9uczoge30sIGRhdGE6IFtdfSxcbiAgICAgIC4uLlxuICBdXG4gKlxuICpcbiAqL1xuXG5leHBvcnQgY2xhc3MgR3JpZFdpZGdldCBleHRlbmRzIEJhc2VDaGFydFdpZGdldCB7XG4gIGNvbnN0cnVjdG9yKHRpdGxlLCBkZXNjcmlwdGlvbiwgZGF0YSwgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLnRyYW5zZm9ybSkgZGF0YSA9IChkYXRhID8/IFtdKS5tYXAob3B0aW9ucy50cmFuc2Zvcm0pO1xuXG4gICAgc3VwZXIodGl0bGUsIGRlc2NyaXB0aW9uLCBkYXRhLCBvcHRpb25zKTtcblxuICAgIHRoaXMuc3ZnLnJlbW92ZSgpO1xuICAgIGRlbGV0ZSB0aGlzLnN2ZztcbiAgICBkZWxldGUgdGhpcy53cmFwcGVyO1xuICB9XG5cbiAgcGxvdChkaXZXaWR0aCwgZGl2SGVpZ2h0LCBlbCkge1xuICAgIC8vY29uc3QgW3dpZHRoLCBoZWlnaHRdID0gdGhpcy5jbGVhckFuZFNjYWxlU3ZnKGRpdldpZHRoLCBkaXZIZWlnaHQpO1xuICAgIC8vdGhpcy5kcmF3VGl0bGUoKTsgLy8gVE9ETzogb3ZlcnJpZGUhXG5cbiAgICBpZiAoIXRoaXMuZGF0YUlzVmFsaWQpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3I6IEdyaWQgZGF0YSBpbnZhbGlkXCIpXG4gICAgICAvL3RoaXMuc2hvd0Vycm9yTWVzc2FnZShkaXZXaWR0aCwgZGl2SGVpZ2h0KTsgLy8gVE9ETzogbWFrZXMgbm8gc2Vuc2UgaGVyZSwgZGlzcGxheSBlcnJvciBhbm90aGVyIHdheVxuICAgICAgcmV0dXJuIFwiXCI7Ly8gdGhpcy53cmFwcGVyLmlubmVySFRNTDtcbiAgICB9XG5cbiAgICBjb25zdCB0aXRsZV9lbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICB0aXRsZV9lbGVtZW50LmNsYXNzTmFtZSA9IFwiY2hhcnQtdGl0bGUgZ3JpZC10aXRsZVwiO1xuICAgIHRpdGxlX2VsZW1lbnQuaW5uZXJIVE1MID0gdGhpcy50aXRsZTtcbiAgICBpZiAodGhpcy5kZXNjcmlwdGlvbikge1xuICAgICAgY29uc3QgcXVlc3Rpb25fbWFya19lbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgIHF1ZXN0aW9uX21hcmtfZWxlbWVudC5jbGFzc05hbWUgPSBcInF1ZXN0aW9uLW1hcmstbGVnYWN5XCI7XG4gICAgICBxdWVzdGlvbl9tYXJrX2VsZW1lbnQuaW5uZXJIVE1MID0gXCI/XCI7XG4gICAgICBjb25zdCByYW5kb21JZCA9IERhdGUubm93KCk7XG4gICAgICBxdWVzdGlvbl9tYXJrX2VsZW1lbnQuaWQgPSBgaWQtJHtyYW5kb21JZH1gO1xuICAgICAgdGl0bGVfZWxlbWVudC5hcHBlbmRDaGlsZChxdWVzdGlvbl9tYXJrX2VsZW1lbnQpO1xuXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgaWQtJHtyYW5kb21JZH1gKTtcbiAgICAgICAgaWYgKHRhcmdldEVsKVxuICAgICAgICAgIHRhcmdldEVsLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5vblNob3dEZXNjKHRoaXMuZGVzY3JpcHRpb24pO1xuICAgICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICB9XG4gICAgZWwuYXBwZW5kQ2hpbGQodGl0bGVfZWxlbWVudCk7XG4gICAgZWwuc3R5bGUgPSBcImJhY2tncm91bmQtY29sb3I6ICNmNWY1ZjVcIjtcblxuICAgIGxldCB3aWR0aCA9IGRpdldpZHRoO1xuICAgIGxldCBoZWlnaHQgPSBkaXZIZWlnaHQ7XG5cbiAgICBjb25zdCBjYXJkSG9sZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBjYXJkSG9sZGVyLmNsYXNzTmFtZSA9IFwiY2FyZFwiO1xuICAgIGNhcmRIb2xkZXIuc3R5bGUgPSBcIm1hcmdpbjogNXB4XCI7XG5cbiAgICBjb25zdCB3aWRnZXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIHdpZGdldC5zdHlsZS5kaXNwbGF5ID0gXCJmbGV4XCI7XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmRpcmVjdGlvbikge1xuICAgICAgd2lkZ2V0LnN0eWxlLmZsZXhEaXJlY3Rpb24gPSB0aGlzLm9wdGlvbnMuZGlyZWN0aW9uOyAvLyByb3csIGNvbHVtblxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHdpZGdldC5zdHlsZS5mbGV4RGlyZWN0aW9uID0gXCJyb3dcIjsgLy8gZGVmYXVsdFxuICAgIH1cblxuICAgIGxldCB0ZW1wX3N1YnRpdGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICB0ZW1wX3N1YnRpdGxlLmNsYXNzTmFtZSA9IFwiY2hhcnQtc3VidGl0bGVcIjtcbiAgICB0ZW1wX3N1YnRpdGxlLmlubmVySFRNTCA9IFwidGVtcFwiO1xuICAgIGVsLmFwcGVuZENoaWxkKHRlbXBfc3VidGl0bGUpO1xuICAgIGhlaWdodCAtPSB0aXRsZV9lbGVtZW50Lm9mZnNldEhlaWdodDtcbiAgICBoZWlnaHQgLT0gdGVtcF9zdWJ0aXRsZS5vZmZzZXRIZWlnaHQ7XG4gICAgaGVpZ2h0IC09IDEyOyAvLyBtYXJnaW5cbiAgICBlbC5yZW1vdmVDaGlsZCh0ZW1wX3N1YnRpdGxlKTtcblxuICAgIGNhcmRIb2xkZXIuYXBwZW5kQ2hpbGQod2lkZ2V0KVxuICAgIGVsLmFwcGVuZENoaWxkKGNhcmRIb2xkZXIpO1xuXG4gICAgaWYod2lkZ2V0LnN0eWxlLmZsZXhEaXJlY3Rpb24gPT0gXCJyb3dcIikge1xuICAgICAgd2lkdGggLT0gMTI7IC8vIFRPRE8gUGFkZGluZyAvIE1hcmdpbnMga29ycmVrdCBlaW5iZXJlY2huZW5cbiAgICAgIHdpZHRoIC89IHRoaXMuZGF0YS5sZW5ndGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIGhlaWdodCAtPSB0aGlzLmRhdGEuZmlsdGVyKCh3aWRnZXQpID0+IHdpZGdldC5uYW1lICE9IFwiXCIpLmxlbmd0aCAqIDE2O1xuICAgICAgaGVpZ2h0IC89IHRoaXMuZGF0YS5sZW5ndGg7XG4gICAgICB3aWR0aCAtPSAxMjtcbiAgICB9XG5cbiAgICBsZXQgZmlyc3RDb2x1bW4gPSB0cnVlO1xuICAgIGZvcihjb25zdCBjaGFydCBvZiB0aGlzLmRhdGEpXG4gICAge1xuICAgICAgbGV0IHN1YndpZGdldF9kaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgaWYoIWZpcnN0Q29sdW1uICYmIHRoaXMub3B0aW9ucy5kaXJlY3Rpb24gIT09IFwiY29sdW1uXCIpXG4gICAgICAgIHN1YndpZGdldF9kaXYuc3R5bGUgPSBcImJvcmRlci1sZWZ0OiAxcHggc29saWQgZ3JleVwiO1xuICAgICAgd2lkZ2V0LmFwcGVuZENoaWxkKHN1YndpZGdldF9kaXYpO1xuXG4gICAgICBsZXQgc3Vid2lkZ2V0ID0gbnVsbDtcbiAgICAgIHN3aXRjaChjaGFydC50eXBlKVxuICAgICAge1xuICAgICAgICBjYXNlIFwidGV4dEFyZWFFbGVtZW50XCI6XG4gICAgICAgICAgc3Vid2lkZ2V0ID0gbmV3IFRleHRBcmVhRWxlbWVudChcbiAgICAgICAgICAgICAgY2hhcnQuZGF0YS50ZXh0LFxuICAgICAgICAgICAgICBjaGFydC5vcHRpb25zXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcInRleHRFbGVtZW50XCI6XG4gICAgICAgICAgc3Vid2lkZ2V0ID0gbmV3IFRleHRFbGVtZW50KFxuICAgICAgICAgICAgICBjaGFydC5kYXRhLnRleHQsXG4gICAgICAgICAgICAgIGNoYXJ0Lm9wdGlvbnNcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiYXJlYWNoYXJ0XCI6XG4gICAgICAgICAgc3Vid2lkZ2V0ID0gbmV3IEFyZWFDaGFydFdpZGdldChcbiAgICAgICAgICAgIFwiXCIsXG4gICAgICAgICAgICBcIlwiLFxuICAgICAgICAgICAgY2hhcnQuZGF0YSxcbiAgICAgICAgICAgIGNoYXJ0Lm9wdGlvbnNcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiYmFyY2hhcnRcIjpcbiAgICAgICAgICBzdWJ3aWRnZXQgPSBuZXcgQmFyQ2hhcnRXaWRnZXQoXG4gICAgICAgICAgICBcIlwiLFxuICAgICAgICAgICAgXCJcIixcbiAgICAgICAgICAgIGNoYXJ0LmRhdGEsXG4gICAgICAgICAgICBjaGFydC5vcHRpb25zXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImJveHBsb3RcIjpcbiAgICAgICAgICBzdWJ3aWRnZXQgPSBuZXcgQm94UGxvdFdpZGdldChcbiAgICAgICAgICAgICAgXCJcIixcbiAgICAgICAgICAgICAgXCJcIixcbiAgICAgICAgICAgICAgY2hhcnQuZGF0YSxcbiAgICAgICAgICAgICAgY2hhcnQub3B0aW9uc1xuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJjaGFydGpzXCI6XG4gICAgICAgICAgc3Vid2lkZ2V0ID0gbmV3IENoYXJ0SlNXaWRnZXQoXG4gICAgICAgICAgICBcIlwiLFxuICAgICAgICAgICAgXCJcIixcbiAgICAgICAgICAgIGNoYXJ0LmRhdGEsXG4gICAgICAgICAgICBjaGFydC5vcHRpb25zXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImdyaWRcIjpcbiAgICAgICAgICBzdWJ3aWRnZXQgPSBuZXcgR3JpZFdpZGdldChcbiAgICAgICAgICAgICAgXCJcIixcbiAgICAgICAgICAgICAgXCJcIixcbiAgICAgICAgICAgICAgY2hhcnQuZGF0YSxcbiAgICAgICAgICAgICAgY2hhcnQub3B0aW9uc1xuICAgICAgICAgIClcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImdyb3VwZWRfYmFyY2hhcnRcIjpcbiAgICAgICAgICBzdWJ3aWRnZXQgPSBuZXcgR3JvdXBlZEJhckNoYXJ0V2lkZ2V0KFxuICAgICAgICAgICAgXCJcIixcbiAgICAgICAgICAgIFwiXCIsXG4gICAgICAgICAgICBjaGFydC5kYXRhLFxuICAgICAgICAgICAgY2hhcnQub3B0aW9uc1xuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJoZWF0bWFwXCI6XG4gICAgICAgICAgc3Vid2lkZ2V0ID0gbmV3IEhlYXRNYXBXaWRnZXQoXG4gICAgICAgICAgICBcIlwiLFxuICAgICAgICAgICAgXCJcIixcbiAgICAgICAgICAgIGNoYXJ0LmRhdGEsXG4gICAgICAgICAgICBjaGFydC5vcHRpb25zXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImxpbmVjaGFydFwiOlxuICAgICAgICAgIHN1YndpZGdldCA9IG5ldyBMaW5lQ2hhcnRXaWRnZXQoXG4gICAgICAgICAgICBcIlwiLFxuICAgICAgICAgICAgXCJcIixcbiAgICAgICAgICAgIGNoYXJ0LmRhdGEsXG4gICAgICAgICAgICBjaGFydC5vcHRpb25zXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcInBpZWNoYXJ0XCI6XG4gICAgICAgICAgc3Vid2lkZ2V0ID0gbmV3IFBpZUNoYXJ0V2lkZ2V0KFxuICAgICAgICAgICAgXCJcIixcbiAgICAgICAgICAgIFwiXCIsXG4gICAgICAgICAgICBjaGFydC5kYXRhLFxuICAgICAgICAgICAgY2hhcnQub3B0aW9uc1xuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJzaW1wbGVfZ3JvdXBlZF9iYXJjaGFydFwiOlxuICAgICAgICAgIHN1YndpZGdldCA9IG5ldyBTaW1wbGVHcm91cGVkQmFyQ2hhcnRXaWRnZXQoXG4gICAgICAgICAgICBcIlwiLFxuICAgICAgICAgICAgXCJcIixcbiAgICAgICAgICAgIGNoYXJ0LmRhdGEsXG4gICAgICAgICAgICBjaGFydC5vcHRpb25zXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcInN0YWNrZWRfYmFyY2hhcnRcIjpcbiAgICAgICAgICBzdWJ3aWRnZXQgPSBuZXcgU3RhY2tlZEJhckNoYXJ0V2lkZ2V0KFxuICAgICAgICAgICAgXCJcIixcbiAgICAgICAgICAgIFwiXCIsXG4gICAgICAgICAgICBjaGFydC5kYXRhLFxuICAgICAgICAgICAgY2hhcnQub3B0aW9uc1xuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJzY2F0dGVyY2hhcnRcIjpcbiAgICAgICAgICBzdWJ3aWRnZXQgPSBuZXcgU2NhdHRlckNoYXJ0V2lkZ2V0KFxuICAgICAgICAgICAgXCJcIixcbiAgICAgICAgICAgIFwiXCIsXG4gICAgICAgICAgICBjaGFydC5kYXRhLFxuICAgICAgICAgICAgY2hhcnQub3B0aW9uc1xuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6IC8vIHVua25vd24gLT4gcmVuZGVyIG5vdGhpbmdcbiAgICAgICAgICB3aWRnZXQucmVtb3ZlQ2hpbGQoc3Vid2lkZ2V0X2Rpdik7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmKHRoaXMub3B0aW9ucy5kaXJlY3Rpb24gPT09IFwiY29sdW1uXCIpIHtcblxuICAgICAgICBzdWJ3aWRnZXRfZGl2LnF1ZXJ5U2VsZWN0b3IoJy5jaGFydC10aXRsZScpPy5wYXJlbnRFbGVtZW50LnJlbW92ZSgpO1xuICAgICAgICBzdWJ3aWRnZXRfZGl2LnF1ZXJ5U2VsZWN0b3IoJy5xdWVzdGlvbi1tYXJrJyk/LnBhcmVudEVsZW1lbnQucmVtb3ZlKCk7XG4gICAgICAgIC8vIFRPRE8gcGFpbnQgYXhlcyB5ZXMgLyBubyA/XG5cbiAgICAgICAgY29uc3Qgc3Vid2lkZ2V0X3RpdGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgc3Vid2lkZ2V0X3RpdGxlLmNsYXNzTmFtZSA9IFwiY2hhcnQtc3VidGl0bGUgY29sdW1uXCI7XG4gICAgICAgIHN1YndpZGdldF90aXRsZS5pbm5lckhUTUwgPSBjaGFydC5uYW1lO1xuICAgICAgICBzdWJ3aWRnZXRfZGl2LmFwcGVuZENoaWxkKHN1YndpZGdldF90aXRsZSk7XG5cbiAgICAgICAgY29uc3QgZ2VuZXJhdGVkID0gc3Vid2lkZ2V0LnBsb3Qod2lkdGgsIGhlaWdodCwgc3Vid2lkZ2V0X2Rpdik7XG4gICAgICAgIGlmIChnZW5lcmF0ZWQgIT0gbnVsbCkge1xuICAgICAgICAgIHN1YndpZGdldF9kaXYuaW5uZXJIVE1MID0gc3Vid2lkZ2V0X2Rpdi5pbm5lckhUTUwgKyBnZW5lcmF0ZWQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgc3Vid2lkZ2V0X2Rpdi5xdWVyeVNlbGVjdG9yKCcuY2hhcnQtdGl0bGUnKT8ucGFyZW50RWxlbWVudC5yZW1vdmUoKTtcbiAgICAgICAgc3Vid2lkZ2V0X2Rpdi5xdWVyeVNlbGVjdG9yKCcucXVlc3Rpb24tbWFyaycpPy5wYXJlbnRFbGVtZW50LnJlbW92ZSgpO1xuICAgICAgICAvLyBUT0RPIHBhaW50IGF4ZXMgeWVzIC8gbm8gP1xuXG4gICAgICAgIGNvbnN0IHN1YndpZGdldF90aXRsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHN1YndpZGdldF90aXRsZS5jbGFzc05hbWUgPSBcImNoYXJ0LXN1YnRpdGxlXCI7XG4gICAgICAgIHN1YndpZGdldF90aXRsZS5pbm5lckhUTUwgPSBjaGFydC5uYW1lO1xuICAgICAgICBzdWJ3aWRnZXRfZGl2LmFwcGVuZENoaWxkKHN1YndpZGdldF90aXRsZSk7XG5cbiAgICAgICAgY29uc3QgZ2VuZXJhdGVkID0gc3Vid2lkZ2V0LnBsb3Qod2lkdGgsIGhlaWdodCwgc3Vid2lkZ2V0X2Rpdik7XG4gICAgICAgIGlmIChnZW5lcmF0ZWQgIT0gbnVsbCkge1xuICAgICAgICAgIHN1YndpZGdldF9kaXYuaW5uZXJIVE1MID0gc3Vid2lkZ2V0X2Rpdi5pbm5lckhUTUwgKyBnZW5lcmF0ZWQ7XG4gICAgICAgIH1cblxuICAgICAgfVxuICAgICAgZmlyc3RDb2x1bW4gPSBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7IC8vIHdlIHdyaXRlIGRpcmVjdGx5IHRvIHRoZSBET00sIHRodXMgcmV0dXJuIG51bGxcbiAgfVxufVxuIiwiaW1wb3J0IFwiLi9zcmMvY3NzL3N0eWxlcy5zY3NzXCJcbmltcG9ydCB7IHBvbGFyaXNEYXNoYm9hcmQgfSBmcm9tIFwiLi9zcmMvanMvZGFzaGJvYXJkXCI7XG5pbXBvcnQgeyBnZXRSZXN1bHQsIGluaXRHcmlkIH0gZnJvbSBcIi4vc3JjL2pzL3V0aWxzXCI7XG5pbXBvcnQgeyBCYXNlQ2hhcnRXaWRnZXQgfSBmcm9tIFwiLi9zcmMvanMvY2hhcnRzL2Jhc2VcIjtcbmltcG9ydCB7IExpbmVDaGFydFdpZGdldCB9IGZyb21cIi4vc3JjL2pzL2NoYXJ0cy9saW5lY2hhcnRcIjtcbmltcG9ydCB7IEJhckNoYXJ0V2lkZ2V0IH0gZnJvbSBcIi4vc3JjL2pzL2NoYXJ0cy9iYXJjaGFydFwiO1xuaW1wb3J0IHsgUGllQ2hhcnRXaWRnZXQgfSBmcm9tIFwiLi9zcmMvanMvY2hhcnRzL3BpZWNoYXJ0XCI7XG5pbXBvcnQgeyBBcmVhQ2hhcnRXaWRnZXQgfSBmcm9tIFwiLi9zcmMvanMvY2hhcnRzL2FyZWFjaGFydFwiO1xuaW1wb3J0IHsgU3RhY2tlZEJhckNoYXJ0V2lkZ2V0IH0gZnJvbSBcIi4vc3JjL2pzL2NoYXJ0cy9zdGFja2VkX2JhcmNoYXJ0XCI7XG5pbXBvcnQgeyBHcm91cGVkQmFyQ2hhcnRXaWRnZXQgfSBmcm9tIFwiLi9zcmMvanMvY2hhcnRzL2dyb3VwZWRfYmFyY2hhcnRcIjtcbmltcG9ydCB7IFNpbXBsZUdyb3VwZWRCYXJDaGFydFdpZGdldCB9IGZyb20gXCIuL3NyYy9qcy9jaGFydHMvc2ltcGxlX2dyb3VwZWRfYmFyY2hhcnRcIjtcbmltcG9ydCB7IENoYXJ0SlNXaWRnZXQgfSBmcm9tIFwiLi9zcmMvanMvY2hhcnRzL2NoYXJ0anNcIjtcbmltcG9ydCB7IEhlYXRNYXBXaWRnZXQgfSBmcm9tIFwiLi9zcmMvanMvY2hhcnRzL2hlYXRtYXBcIjtcbmltcG9ydCB7IEdyaWRXaWRnZXQgfSBmcm9tIFwiLi9zcmMvanMvY2hhcnRzL2dyaWRcIjtcbmltcG9ydCB7IEJveFBsb3RXaWRnZXQgfSBmcm9tIFwiLi9zcmMvanMvY2hhcnRzL2JveHBsb3RcIjtcbmltcG9ydCB7IFRleHRFbGVtZW50fSBmcm9tIFwiLi9zcmMvanMvZWxlbWVudHMvdGV4dGVsZW1lbnRcIjtcbmltcG9ydCB7IFRleHRBcmVhRWxlbWVudCB9IGZyb20gXCIuL3NyYy9qcy9lbGVtZW50cy90ZXh0YXJlYWVsZW1lbnRcIjtcblxuZXhwb3J0IHtcbiAgZ2V0UmVzdWx0LFxuICBpbml0R3JpZCxcbiAgcG9sYXJpc0Rhc2hib2FyZCxcbiAgTGluZUNoYXJ0V2lkZ2V0LFxuICBCYXJDaGFydFdpZGdldCxcbiAgQXJlYUNoYXJ0V2lkZ2V0LFxuICBQaWVDaGFydFdpZGdldCxcbiAgU3RhY2tlZEJhckNoYXJ0V2lkZ2V0LFxuICBCYXNlQ2hhcnRXaWRnZXQsXG4gIEdyb3VwZWRCYXJDaGFydFdpZGdldCxcbiAgU2ltcGxlR3JvdXBlZEJhckNoYXJ0V2lkZ2V0LFxuICBDaGFydEpTV2lkZ2V0LFxuICBIZWF0TWFwV2lkZ2V0LFxuICBHcmlkV2lkZ2V0LFxuICBCb3hQbG90V2lkZ2V0LFxuICBUZXh0RWxlbWVudCxcbiAgVGV4dEFyZWFFbGVtZW50XG59O1xuIiwiaW1wb3J0IHsgQmFyQ2hhcnRXaWRnZXQsIENoYXJ0SlNXaWRnZXQgfSBmcm9tIFwiQHBvbGFyaXMvZGFzaGJvYXJkLXNka1wiO1xuXG5jb25zdCBkaWN0ID0ge1xuICAgIFwiYWNjZXNzZWRcIjogOTgsXG4gICAgXCJzdGFydGVkXCI6IDcsXG4gICAgXCJncmFkZWRcIjogNyxcbiAgICBcInN1Ym1pdHRlZFwiOiA3LFxuICAgIFwiYW5zd2VyZWRcIjogMzgsXG4gICAgXCJsZWZ0VW5hbnN3ZXJlZFwiOiA0XG59XG5jb25zdCBkYXRhID0gT2JqZWN0LmtleXMoZGljdCkubWFwKGtleSA9PiAoe2NvbHVtbjE6IGtleSwgY29sdW1uMjogZGljdFtrZXldfSkpO1xuXG5leHBvcnQgY29uc3QgbW9ja0JhckNoYXJ0ID0geyBcImJhcmNoYXJ0LXdpZGdldFwiIDpcbiAgICAgICAgbmV3IEJhckNoYXJ0V2lkZ2V0KFxuICAgICAgICAgICAgXCJLdXJzbnV0enVuZ1wiLFxuICAgICAgICAgICAgXCJEYXJzdGVsbHVuZyBkZXMgRm9ydHNjaHJpdHRzIGRlciBUZWlsbmVobWVyIGFuaGFuZCBkZXIgTnV0enVuZyBkZXIgTGVybmluaGFsdGVcIixcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc2hvd0xlZ2VuZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB4QXhpc0xhYmVsOiBcIlN0YXR1c1wiLFxuICAgICAgICAgICAgICAgIHlBeGlzTGFiZWw6IFwiQW56YWhsXCJcbiAgICAgICAgICAgIH0pXG59XG5cblxuY29uc3QgY2hhcnRqc19kYXRhID0ge2RhdGFzZXRzOiBbe2RhdGE6IE9iamVjdC5rZXlzKGRpY3QpLm1hcChrZXkgPT4gZGljdFtrZXldKX1dLCBsYWJlbHM6IE9iamVjdC5rZXlzKGRpY3QpfTtcblxuZXhwb3J0IGZ1bmN0aW9uIG1vY2tDaGFydEpTQmFyQ2hhcnQob25TaG93RGVzYylcbntcbiAgICByZXR1cm4geyBcImNoYXJ0anMtYmFyY2hhcnQtd2lkZ2V0XCIgOlxuICAgICAgICAgICAgbmV3IENoYXJ0SlNXaWRnZXQoXG4gICAgICAgICAgICAgICAgXCJLdXJzbnV0enVuZ1wiLFxuICAgICAgICAgICAgICAgIFwiRGFyc3RlbGx1bmcgZGVzIEZvcnRzY2hyaXR0cyBkZXIgVGVpbG5laG1lciBhbmhhbmQgZGVyIE51dHp1bmcgZGVyIExlcm5pbmhhbHRlXCIsXG4gICAgICAgICAgICAgICAgY2hhcnRqc19kYXRhLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhcnRqc19vcHRpb25zOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzY2FsZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogXCJTdGF0dXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogXCJBbnphaGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgb25TaG93RGVzYzogb25TaG93RGVzY1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIClcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBHcmlkV2lkZ2V0IH0gZnJvbSBcIkBwb2xhcmlzL2Rhc2hib2FyZC1zZGtcIjtcblxuY29uc3QgZGF0YSA9IFtcbiAgICB7XG4gICAgICAgIHR5cGU6IFwiaGVhdG1hcFwiLFxuICAgICAgICBuYW1lOiBcIkJsb2NrIDFcIixcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgc2hvd0xlZ2VuZDogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICAgIGRhdGE6XG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBncm91cDogXCJBXCIsXG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlOiBcInYxXCIsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiAxMlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBncm91cDogXCJBXCIsXG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlOiBcInYyXCIsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiAxXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGdyb3VwOiBcIkFcIixcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGU6IFwidjNcIixcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IDI2XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGdyb3VwOiBcIkFcIixcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGU6IFwidjRcIixcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IDg2XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGdyb3VwOiBcIkFcIixcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGU6IFwidjVcIixcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IDEwXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGdyb3VwOiBcIkJcIixcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGU6IFwidjFcIixcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IDgyXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGdyb3VwOiBcIkJcIixcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGU6IFwidjJcIixcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IDY1XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGdyb3VwOiBcIkJcIixcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGU6IFwidjNcIixcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IDUxXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGdyb3VwOiBcIkJcIixcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGU6IFwidjRcIixcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IDJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXA6IFwiQlwiLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogXCJ2NVwiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogMTVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXA6IFwiQ1wiLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogXCJ2MVwiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogMjNcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXA6IFwiQ1wiLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogXCJ2MlwiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogMzVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXA6IFwiQ1wiLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogXCJ2M1wiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogNDVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXA6IFwiQ1wiLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogXCJ2NFwiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogMzZcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXA6IFwiQ1wiLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogXCJ2NVwiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogMTlcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXA6IFwiRFwiLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogXCJ2MVwiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogODlcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXA6IFwiRFwiLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogXCJ2MlwiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogNjRcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXA6IFwiRFwiLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogXCJ2M1wiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogNFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBncm91cDogXCJEXCIsXG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlOiBcInY0XCIsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiAzOVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBncm91cDogXCJEXCIsXG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlOiBcInY1XCIsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiA3NVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdXG4gICAgfSxcbiAgICB7XG4gICAgICAgIHR5cGU6IFwiaGVhdG1hcFwiLFxuICAgICAgICBuYW1lOiBcIkJsb2NrIDJcIixcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgc2hvd0xlZ2VuZDogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICAgIGRhdGE6XG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBncm91cDogXCJBXCIsXG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlOiBcInYxXCIsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiAxMlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBncm91cDogXCJBXCIsXG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlOiBcInYyXCIsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiAxXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGdyb3VwOiBcIkFcIixcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGU6IFwidjNcIixcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IDI2XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGdyb3VwOiBcIkFcIixcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGU6IFwidjRcIixcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IDg2XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGdyb3VwOiBcIkFcIixcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGU6IFwidjVcIixcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IDEwXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGdyb3VwOiBcIkJcIixcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGU6IFwidjFcIixcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IDgyXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGdyb3VwOiBcIkJcIixcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGU6IFwidjJcIixcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IDY1XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGdyb3VwOiBcIkJcIixcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGU6IFwidjNcIixcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IDUxXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGdyb3VwOiBcIkJcIixcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGU6IFwidjRcIixcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IDJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXA6IFwiQlwiLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogXCJ2NVwiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogMTVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXA6IFwiQ1wiLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogXCJ2MVwiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogMjNcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXA6IFwiQ1wiLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogXCJ2MlwiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogMzVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXA6IFwiQ1wiLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogXCJ2M1wiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogNDVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXA6IFwiQ1wiLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogXCJ2NFwiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogMzZcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXA6IFwiQ1wiLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogXCJ2NVwiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogMTlcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXA6IFwiRFwiLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogXCJ2MVwiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogODlcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXA6IFwiRFwiLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogXCJ2MlwiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogNjRcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXA6IFwiRFwiLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogXCJ2M1wiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogNFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBncm91cDogXCJEXCIsXG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlOiBcInY0XCIsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiAzOVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBncm91cDogXCJEXCIsXG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlOiBcInY1XCIsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiA3NVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdXG4gICAgfSxcbiAgICB7XG4gICAgICAgIHR5cGU6IFwiaGVhdG1hcFwiLFxuICAgICAgICBuYW1lOiBcIkJsb2NrIDNcIixcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgc2hvd0xlZ2VuZDogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICAgIGRhdGE6XG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBncm91cDogXCJBXCIsXG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlOiBcInYxXCIsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiAxMlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBncm91cDogXCJBXCIsXG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlOiBcInYyXCIsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiAxXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGdyb3VwOiBcIkFcIixcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGU6IFwidjNcIixcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IDI2XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGdyb3VwOiBcIkFcIixcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGU6IFwidjRcIixcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IDg2XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGdyb3VwOiBcIkFcIixcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGU6IFwidjVcIixcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IDEwXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGdyb3VwOiBcIkJcIixcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGU6IFwidjFcIixcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IDgyXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGdyb3VwOiBcIkJcIixcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGU6IFwidjJcIixcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IDY1XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGdyb3VwOiBcIkJcIixcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGU6IFwidjNcIixcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IDUxXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGdyb3VwOiBcIkJcIixcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGU6IFwidjRcIixcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IDJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXA6IFwiQlwiLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogXCJ2NVwiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogMTVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXA6IFwiQ1wiLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogXCJ2MVwiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogMjNcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXA6IFwiQ1wiLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogXCJ2MlwiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogMzVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXA6IFwiQ1wiLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogXCJ2M1wiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogNDVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXA6IFwiQ1wiLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogXCJ2NFwiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogMzZcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXA6IFwiQ1wiLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogXCJ2NVwiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogMTlcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXA6IFwiRFwiLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogXCJ2MVwiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogODlcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXA6IFwiRFwiLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogXCJ2MlwiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogNjRcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXA6IFwiRFwiLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogXCJ2M1wiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogNFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBncm91cDogXCJEXCIsXG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlOiBcInY0XCIsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiAzOVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBncm91cDogXCJEXCIsXG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlOiBcInY1XCIsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiA3NVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdXG4gICAgfVxuXVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBtb2NrR3JpZChvblNob3dEZXNjKVxue1xuICAgIHJldHVybiB7IFwiZ3JpZC13aWRnZXRcIiA6XG4gICAgICAgICAgICBuZXcgR3JpZFdpZGdldChcbiAgICAgICAgICAgICAgICBcIkt1cnNudXR6dW5nIGluIEJsb2Nrc1wiLFxuICAgICAgICAgICAgICAgIFwiVmVydGVpbHVuZyBkZXIgTnV0enVuZ3Nha3Rpdml0w6R0IMO8YmVyIGRpZSBlaW56ZWxuZW4gTGVybi1CbG9ja3NcIixcbiAgICAgICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uOiBcInJvd1wiLFxuICAgICAgICAgICAgICAgICAgICBvblNob3dEZXNjOiBvblNob3dEZXNjXG4gICAgICAgICAgICAgICAgfSlcbiAgICB9XG59XG5cbiIsImltcG9ydCB7IEdyaWRXaWRnZXQgfSBmcm9tIFwiQHBvbGFyaXMvZGFzaGJvYXJkLXNka1wiO1xuXG5jb25zdCBkYXRhID0gW1xuICAgIHtcbiAgICAgICAgdHlwZTogXCJzY2F0dGVyY2hhcnRcIixcbiAgICAgICAgbmFtZTogXCIwLTI1JVwiLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICBzaG93TGVnZW5kOiBmYWxzZSxcbiAgICAgICAgICAgIHNob3dBeGVzOiBmYWxzZSxcbiAgICAgICAgICAgIHhtYXg6IDEwLFxuICAgICAgICAgICAgeW1heDogMTAwXG4gICAgICAgIH0sXG4gICAgICAgIGRhdGE6XG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAge2NvbHVtbjE6IDAsIGNvbHVtbjI6IDQwLCBoaWdobGlnaHQ6IGZhbHNlfSxcbiAgICAgICAgICAgICAgICB7Y29sdW1uMTogMiwgY29sdW1uMjogMjYsIGhpZ2hsaWdodDogZmFsc2V9LFxuICAgICAgICAgICAgICAgIHtjb2x1bW4xOiA1LCBjb2x1bW4yOiAyOCwgaGlnaGxpZ2h0OiBmYWxzZX0sXG4gICAgICAgICAgICAgICAge2NvbHVtbjE6IDcsIGNvbHVtbjI6IDE3LCBoaWdobGlnaHQ6IGZhbHNlfSxcbiAgICAgICAgICAgICAgICB7Y29sdW1uMTogOSwgY29sdW1uMjogMzksIGhpZ2hsaWdodDogZmFsc2V9LFxuICAgICAgICAgICAgICAgIHtjb2x1bW4xOiAxMCwgY29sdW1uMjogNjAsIGhpZ2hsaWdodDogZmFsc2V9LFxuICAgICAgICAgICAgICAgIHtjb2x1bW4xOiA4LCBjb2x1bW4yOiA3OCwgaGlnaGxpZ2h0OiBmYWxzZX0sXG4gICAgICAgICAgICAgICAge2NvbHVtbjE6IDYsIGNvbHVtbjI6IDE1LCBoaWdobGlnaHQ6IGZhbHNlfSxcbiAgICAgICAgICAgICAgICB7Y29sdW1uMTogNCwgY29sdW1uMjogNCwgaGlnaGxpZ2h0OiBmYWxzZX0sXG4gICAgICAgICAgICBdXG4gICAgfSxcbiAgICB7XG4gICAgICAgIHR5cGU6IFwic2NhdHRlcmNoYXJ0XCIsXG4gICAgICAgIG5hbWU6IFwiMjYtNTAlXCIsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgIHNob3dMZWdlbmQ6IGZhbHNlLFxuICAgICAgICAgICAgc2hvd0F4ZXM6IGZhbHNlLFxuICAgICAgICAgICAgeG1heDogMTAsXG4gICAgICAgICAgICB5bWF4OiAxMDBcbiAgICAgICAgfSxcbiAgICAgICAgZGF0YTpcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICB7Y29sdW1uMTogMSwgY29sdW1uMjogNDIsIGhpZ2hsaWdodDogZmFsc2V9LFxuICAgICAgICAgICAgICAgIHtjb2x1bW4xOiAyLCBjb2x1bW4yOiA1NCwgaGlnaGxpZ2h0OiBmYWxzZX0sXG4gICAgICAgICAgICAgICAge2NvbHVtbjE6IDMsIGNvbHVtbjI6IDg3LCBoaWdobGlnaHQ6IGZhbHNlfSxcbiAgICAgICAgICAgICAgICB7Y29sdW1uMTogNCwgY29sdW1uMjogNjUsIGhpZ2hsaWdodDogZmFsc2V9LFxuICAgICAgICAgICAgICAgIHtjb2x1bW4xOiA1LCBjb2x1bW4yOiA3OCwgaGlnaGxpZ2h0OiBmYWxzZX0sXG4gICAgICAgICAgICAgICAge2NvbHVtbjE6IDYsIGNvbHVtbjI6IDkyLCBoaWdobGlnaHQ6IGZhbHNlfSxcbiAgICAgICAgICAgICAgICB7Y29sdW1uMTogNywgY29sdW1uMjogMTIsIGhpZ2hsaWdodDogZmFsc2V9LFxuICAgICAgICAgICAgICAgIHtjb2x1bW4xOiA4LCBjb2x1bW4yOiA1NCwgaGlnaGxpZ2h0OiBmYWxzZX0sXG4gICAgICAgICAgICAgICAge2NvbHVtbjE6IDksIGNvbHVtbjI6IDM0LCBoaWdobGlnaHQ6IGZhbHNlfSxcbiAgICAgICAgICAgICAgICB7Y29sdW1uMTogMTAsIGNvbHVtbjI6IDQyLCBoaWdobGlnaHQ6IGZhbHNlfSxcbiAgICAgICAgICAgICAgICB7Y29sdW1uMTogMSwgY29sdW1uMjogMjcsIGhpZ2hsaWdodDogZmFsc2V9LFxuICAgICAgICAgICAgICAgIHtjb2x1bW4xOiAyLCBjb2x1bW4yOiAyOSwgaGlnaGxpZ2h0OiBmYWxzZX0sXG4gICAgICAgICAgICAgICAge2NvbHVtbjE6IDMsIGNvbHVtbjI6IDExLCBoaWdobGlnaHQ6IGZhbHNlfSxcbiAgICAgICAgICAgICAgICB7Y29sdW1uMTogNCwgY29sdW1uMjogMzcsIGhpZ2hsaWdodDogZmFsc2V9LFxuICAgICAgICAgICAgICAgIHtjb2x1bW4xOiA1LCBjb2x1bW4yOiAxMCwgaGlnaGxpZ2h0OiBmYWxzZX0sXG4gICAgICAgICAgICAgICAge2NvbHVtbjE6IDYsIGNvbHVtbjI6IDE4LCBoaWdobGlnaHQ6IGZhbHNlfSxcbiAgICAgICAgICAgICAgICB7Y29sdW1uMTogNywgY29sdW1uMjogOTUsIGhpZ2hsaWdodDogZmFsc2V9LFxuICAgICAgICAgICAgICAgIHtjb2x1bW4xOiA4LCBjb2x1bW4yOiAyLCBoaWdobGlnaHQ6IGZhbHNlfSxcbiAgICAgICAgICAgIF1cbiAgICB9LFxuICAgIHtcbiAgICAgICAgdHlwZTogXCJzY2F0dGVyY2hhcnRcIixcbiAgICAgICAgbmFtZTogXCI1MS03NSVcIixcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgc2hvd0xlZ2VuZDogZmFsc2UsXG4gICAgICAgICAgICBzaG93QXhlczogZmFsc2UsXG4gICAgICAgICAgICB4bWF4OiAxMCxcbiAgICAgICAgICAgIHltYXg6IDEwMFxuICAgICAgICB9LFxuICAgICAgICBkYXRhOlxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIHtjb2x1bW4xOiAxLCBjb2x1bW4yOiAzMiwgaGlnaGxpZ2h0OiBmYWxzZX0sXG4gICAgICAgICAgICAgICAge2NvbHVtbjE6IDIsIGNvbHVtbjI6IDM0LCBoaWdobGlnaHQ6IGZhbHNlfSxcbiAgICAgICAgICAgICAgICB7Y29sdW1uMTogMywgY29sdW1uMjogMjcsIGhpZ2hsaWdodDogZmFsc2V9LFxuICAgICAgICAgICAgICAgIHtjb2x1bW4xOiA0LCBjb2x1bW4yOiA0NSwgaGlnaGxpZ2h0OiBmYWxzZX0sXG4gICAgICAgICAgICAgICAge2NvbHVtbjE6IDUsIGNvbHVtbjI6IDU4LCBoaWdobGlnaHQ6IGZhbHNlfSxcbiAgICAgICAgICAgICAgICB7Y29sdW1uMTogNiwgY29sdW1uMjogNzIsIGhpZ2hsaWdodDogZmFsc2V9LFxuICAgICAgICAgICAgICAgIHtjb2x1bW4xOiA3LCBjb2x1bW4yOiA4NywgaGlnaGxpZ2h0OiBmYWxzZX0sXG4gICAgICAgICAgICAgICAge2NvbHVtbjE6IDgsIGNvbHVtbjI6IDgwLCBoaWdobGlnaHQ6IGZhbHNlfSxcbiAgICAgICAgICAgICAgICB7Y29sdW1uMTogOSwgY29sdW1uMjogMTgsIGhpZ2hsaWdodDogZmFsc2V9LFxuICAgICAgICAgICAgICAgIHtjb2x1bW4xOiAxMCwgY29sdW1uMjogMjUsIGhpZ2hsaWdodDogZmFsc2V9LFxuICAgICAgICAgICAgICAgIHtjb2x1bW4xOiAxLCBjb2x1bW4yOiAzNCwgaGlnaGxpZ2h0OiBmYWxzZX0sXG4gICAgICAgICAgICAgICAge2NvbHVtbjE6IDIsIGNvbHVtbjI6IDQ2LCBoaWdobGlnaHQ6IGZhbHNlfSxcbiAgICAgICAgICAgICAgICB7Y29sdW1uMTogMywgY29sdW1uMjogNTgsIGhpZ2hsaWdodDogZmFsc2V9LFxuICAgICAgICAgICAgICAgIHtjb2x1bW4xOiA0LCBjb2x1bW4yOiAzNywgaGlnaGxpZ2h0OiBmYWxzZX0sXG4gICAgICAgICAgICAgICAge2NvbHVtbjE6IDUsIGNvbHVtbjI6IDksIGhpZ2hsaWdodDogZmFsc2V9LFxuICAgICAgICAgICAgICAgIHtjb2x1bW4xOiA2LCBjb2x1bW4yOiAxMCwgaGlnaGxpZ2h0OiBmYWxzZX0sXG4gICAgICAgICAgICBdXG4gICAgfSxcbiAgICB7XG4gICAgICAgIHR5cGU6IFwic2NhdHRlcmNoYXJ0XCIsXG4gICAgICAgIG5hbWU6IFwiNzYtMTAwJVwiLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICBzaG93TGVnZW5kOiBmYWxzZSxcbiAgICAgICAgICAgIHNob3dBeGVzOiBmYWxzZSxcbiAgICAgICAgICAgIHhtYXg6IDEwLFxuICAgICAgICAgICAgeW1heDogMTAwXG4gICAgICAgIH0sXG4gICAgICAgIGRhdGE6XG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAge2NvbHVtbjE6IDEsIGNvbHVtbjI6IDMyLCBoaWdobGlnaHQ6IGZhbHNlfSxcbiAgICAgICAgICAgICAgICB7Y29sdW1uMTogMiwgY29sdW1uMjogMzQsIGhpZ2hsaWdodDogZmFsc2V9LFxuICAgICAgICAgICAgICAgIHtjb2x1bW4xOiAzLCBjb2x1bW4yOiAyNywgaGlnaGxpZ2h0OiBmYWxzZX0sXG4gICAgICAgICAgICAgICAge2NvbHVtbjE6IDQsIGNvbHVtbjI6IDc1LCBoaWdobGlnaHQ6IGZhbHNlfSxcbiAgICAgICAgICAgICAgICB7Y29sdW1uMTogNSwgY29sdW1uMjogOTgsIGhpZ2hsaWdodDogZmFsc2V9LFxuICAgICAgICAgICAgICAgIHtjb2x1bW4xOiA2LCBjb2x1bW4yOiA2MiwgaGlnaGxpZ2h0OiBmYWxzZX0sXG4gICAgICAgICAgICAgICAge2NvbHVtbjE6IDcsIGNvbHVtbjI6IDcyLCBoaWdobGlnaHQ6IGZhbHNlfSxcbiAgICAgICAgICAgICAgICB7Y29sdW1uMTogOCwgY29sdW1uMjogMjQsIGhpZ2hsaWdodDogZmFsc2V9LFxuICAgICAgICAgICAgICAgIHtjb2x1bW4xOiA5LCBjb2x1bW4yOiAzNCwgaGlnaGxpZ2h0OiB0cnVlfSxcbiAgICAgICAgICAgICAgICB7Y29sdW1uMTogMTAsIGNvbHVtbjI6IDQ0LCBoaWdobGlnaHQ6IGZhbHNlfSxcbiAgICAgICAgICAgICAgICB7Y29sdW1uMTogMSwgY29sdW1uMjogNjcsIGhpZ2hsaWdodDogZmFsc2V9LFxuICAgICAgICAgICAgICAgIHtjb2x1bW4xOiAyLCBjb2x1bW4yOiA4OSwgaGlnaGxpZ2h0OiBmYWxzZX0sXG4gICAgICAgICAgICAgICAge2NvbHVtbjE6IDMsIGNvbHVtbjI6IDIxLCBoaWdobGlnaHQ6IGZhbHNlfSxcbiAgICAgICAgICAgICAgICB7Y29sdW1uMTogNCwgY29sdW1uMjogMTcsIGhpZ2hsaWdodDogZmFsc2V9LFxuICAgICAgICAgICAgICAgIHtjb2x1bW4xOiA1LCBjb2x1bW4yOiA4MCwgaGlnaGxpZ2h0OiBmYWxzZX0sXG4gICAgICAgICAgICAgICAge2NvbHVtbjE6IDYsIGNvbHVtbjI6IDY4LCBoaWdobGlnaHQ6IGZhbHNlfSxcbiAgICAgICAgICAgICAgICB7Y29sdW1uMTogNywgY29sdW1uMjogNDUsIGhpZ2hsaWdodDogZmFsc2V9LFxuICAgICAgICAgICAgICAgIHtjb2x1bW4xOiA4LCBjb2x1bW4yOiA0NCwgaGlnaGxpZ2h0OiBmYWxzZX0sXG4gICAgICAgICAgICAgICAge2NvbHVtbjE6IDksIGNvbHVtbjI6IDI2LCBoaWdobGlnaHQ6IGZhbHNlfSxcbiAgICAgICAgICAgICAgICB7Y29sdW1uMTogMTAsIGNvbHVtbjI6IDI4LCBoaWdobGlnaHQ6IGZhbHNlfSxcbiAgICAgICAgICAgICAgICB7Y29sdW1uMTogMSwgY29sdW1uMjogMTcsIGhpZ2hsaWdodDogZmFsc2V9LFxuICAgICAgICAgICAgICAgIHtjb2x1bW4xOiAyLCBjb2x1bW4yOiA5LCBoaWdobGlnaHQ6IGZhbHNlfSxcbiAgICAgICAgICAgICAgICB7Y29sdW1uMTogMywgY29sdW1uMjogNiwgaGlnaGxpZ2h0OiBmYWxzZX0sXG4gICAgICAgICAgICBdXG4gICAgfVxuXVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBtb2NrU2NhdHRlckdyaWQob25TaG93RGVzYylcbntcbiAgICByZXR1cm4geyBcInNjYXR0ZXItZ3JpZC13aWRnZXRcIiA6XG4gICAgICAgICAgICBuZXcgR3JpZFdpZGdldChcbiAgICAgICAgICAgICAgICBcIkt1cnN2ZXJnbGVpY2hcIixcbiAgICAgICAgICAgICAgICBcIlZlcmdsZWljaCBtaXQgYW5kZXJlbiBTdHVkaWVyZW5kZW5cIixcbiAgICAgICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uOiBcInJvd1wiLFxuICAgICAgICAgICAgICAgICAgICBvblNob3dEZXNjOiBvblNob3dEZXNjXG4gICAgICAgICAgICAgICAgfSlcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBHcmlkV2lkZ2V0IH0gZnJvbSBcIkBwb2xhcmlzL2Rhc2hib2FyZC1zZGtcIjtcblxuY29uc3QgZGF0YSA9IFtcbiAgICB7XG4gICAgICAgIHR5cGU6IFwiZ3JpZFwiLFxuICAgICAgICBuYW1lOiBcIkJsb2NrIDFcIixcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgZGlyZWN0aW9uOiBcImNvbHVtblwiLFxuICAgICAgICB9LFxuICAgICAgICBkYXRhOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJwaWVjaGFydFwiLFxuICAgICAgICAgICAgICAgIG5hbWU6IFwiXCIsXG4gICAgICAgICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgICAgICAgICBzaG93TGVnZW5kOiBmYWxzZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZGF0YTpcbiAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAge2NvbHVtbjE6IFwiYmVzdGFuZGVuXCIsIGNvbHVtbjI6IDc1fSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtjb2x1bW4xOiBcImR1cmNoZ2VmYWxsZW5cIiwgY29sdW1uMjogMjV9LFxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHR5cGU6IFwicGllY2hhcnRcIixcbiAgICAgICAgICAgICAgICBuYW1lOiBcIlwiLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICAgICAgc2hvd0xlZ2VuZDogZmFsc2VcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGRhdGE6XG4gICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtjb2x1bW4xOiBcImJlc3RhbmRlblwiLCBjb2x1bW4yOiA2OH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7Y29sdW1uMTogXCJkdXJjaGdlZmFsbGVuXCIsIGNvbHVtbjI6IDMyfSxcbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcInBpZWNoYXJ0XCIsXG4gICAgICAgICAgICAgICAgbmFtZTogXCJcIixcbiAgICAgICAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICAgICAgICAgIHNob3dMZWdlbmQ6IGZhbHNlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBkYXRhOlxuICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7Y29sdW1uMTogXCJiZXN0YW5kZW5cIiwgY29sdW1uMjogOTF9LFxuICAgICAgICAgICAgICAgICAgICAgICAge2NvbHVtbjE6IFwiZHVyY2hnZWZhbGxlblwiLCBjb2x1bW4yOiA5fSxcbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSxcbiAgICB7XG4gICAgICAgIHR5cGU6IFwiZ3JpZFwiLFxuICAgICAgICBuYW1lOiBcIkJsb2NrIDJcIixcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgZGlyZWN0aW9uOiBcImNvbHVtblwiLFxuICAgICAgICB9LFxuICAgICAgICBkYXRhOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJwaWVjaGFydFwiLFxuICAgICAgICAgICAgICAgIG5hbWU6IFwiXCIsXG4gICAgICAgICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgICAgICAgICBzaG93TGVnZW5kOiBmYWxzZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZGF0YTpcbiAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAge2NvbHVtbjE6IFwiYmVzdGFuZGVuXCIsIGNvbHVtbjI6IDgzfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtjb2x1bW4xOiBcImR1cmNoZ2VmYWxsZW5cIiwgY29sdW1uMjogMTd9LFxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHR5cGU6IFwicGllY2hhcnRcIixcbiAgICAgICAgICAgICAgICBuYW1lOiBcIlwiLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICAgICAgc2hvd0xlZ2VuZDogZmFsc2VcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGRhdGE6XG4gICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtjb2x1bW4xOiBcImJlc3RhbmRlblwiLCBjb2x1bW4yOiA5MX0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7Y29sdW1uMTogXCJkdXJjaGdlZmFsbGVuXCIsIGNvbHVtbjI6IDl9LFxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHR5cGU6IFwicGllY2hhcnRcIixcbiAgICAgICAgICAgICAgICBuYW1lOiBcIlwiLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICAgICAgc2hvd0xlZ2VuZDogZmFsc2VcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGRhdGE6XG4gICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtjb2x1bW4xOiBcImJlc3RhbmRlblwiLCBjb2x1bW4yOiA3Nn0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7Y29sdW1uMTogXCJkdXJjaGdlZmFsbGVuXCIsIGNvbHVtbjI6IDI0fSxcbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSxcbiAgICB7XG4gICAgICAgIHR5cGU6IFwiZ3JpZFwiLFxuICAgICAgICBuYW1lOiBcIkJsb2NrIDJcIixcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgZGlyZWN0aW9uOiBcImNvbHVtblwiLFxuICAgICAgICB9LFxuICAgICAgICBkYXRhOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJwaWVjaGFydFwiLFxuICAgICAgICAgICAgICAgIG5hbWU6IFwiXCIsXG4gICAgICAgICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgICAgICAgICBzaG93TGVnZW5kOiBmYWxzZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZGF0YTpcbiAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAge2NvbHVtbjE6IFwiYmVzdGFuZGVuXCIsIGNvbHVtbjI6IDk1fSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtjb2x1bW4xOiBcImR1cmNoZ2VmYWxsZW5cIiwgY29sdW1uMjogNX0sXG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJwaWVjaGFydFwiLFxuICAgICAgICAgICAgICAgIG5hbWU6IFwiXCIsXG4gICAgICAgICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgICAgICAgICBzaG93TGVnZW5kOiBmYWxzZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZGF0YTpcbiAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAge2NvbHVtbjE6IFwiYmVzdGFuZGVuXCIsIGNvbHVtbjI6IDM1fSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtjb2x1bW4xOiBcImR1cmNoZ2VmYWxsZW5cIiwgY29sdW1uMjogNjV9LFxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHR5cGU6IFwicGllY2hhcnRcIixcbiAgICAgICAgICAgICAgICBuYW1lOiBcIlwiLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICAgICAgc2hvd0xlZ2VuZDogZmFsc2VcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGRhdGE6XG4gICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtjb2x1bW4xOiBcImJlc3RhbmRlblwiLCBjb2x1bW4yOiA0NX0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7Y29sdW1uMTogXCJkdXJjaGdlZmFsbGVuXCIsIGNvbHVtbjI6IDU1fSxcbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfVxuXVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBtb2NrUGllR3JpZChvblNob3dEZXNjKVxue1xuICAgIHJldHVybiB7IFwibWMtcGllLWdyaWQtd2lkZ2V0XCIgOlxuICAgICAgICAgICAgbmV3IEdyaWRXaWRnZXQoXG4gICAgICAgICAgICAgICAgXCJNQy1UZXN0c1wiLFxuICAgICAgICAgICAgICAgIFwiVmVyZ2xlaWNoIHZvbiBNdWx0aXBsZS1DaG9pY2UgRWxlbWVudGVuXCIsXG4gICAgICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbjogXCJyb3dcIixcbiAgICAgICAgICAgICAgICAgICAgb25TaG93RGVzYzogb25TaG93RGVzY1xuICAgICAgICAgICAgICAgIH0pXG4gICAgfVxufSIsImltcG9ydCB7IEdyaWRXaWRnZXQgfSBmcm9tIFwiQHBvbGFyaXMvZGFzaGJvYXJkLXNka1wiO1xuXG5jb25zdCBkYXRhID0gW1xuICAgIHtcbiAgICAgICAgdHlwZTogXCJ0ZXh0RWxlbWVudFwiLFxuICAgICAgICBuYW1lOiBcIkJsb2NrIDFcIixcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgc2hvd0xlZ2VuZDogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIHRleHQ6IFwiMDAuMDAuMDAgLSBub2NoIC4uLiBUYWdlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAge1xuICAgICAgICB0eXBlOiBcInRleHRFbGVtZW50XCIsXG4gICAgICAgIG5hbWU6IFwiQmxvY2sgMlwiLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICBzaG93TGVnZW5kOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgdGV4dDogXCIwMC4wMC4wMCAtIG5vY2ggLi4uIFRhZ2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICB7XG4gICAgICAgIHR5cGU6IFwidGV4dEVsZW1lbnRcIixcbiAgICAgICAgbmFtZTogXCJCbG9jayAzXCIsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgIHNob3dMZWdlbmQ6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICB0ZXh0OiBcIjAwLjAwLjAwIC0gbm9jaCAuLi4gVGFnZVwiXG4gICAgICAgIH1cbiAgICB9LFxuXVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBtb2NrRGVhZGxpbmVzKG9uU2hvd0Rlc2MpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBcImRlYWRsaW5lcy1ncmlkLXdpZGdldFwiOlxuICAgICAgICAgICAgbmV3IEdyaWRXaWRnZXQoXG4gICAgICAgICAgICAgICAgXCJEZWFkbGluZXNcIixcbiAgICAgICAgICAgICAgICBcIkRlYWRsaW5lcyB2ZXJzY2hpZWRlbmVyIEJsw7Zja2VcIixcbiAgICAgICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uOiBcImNvbHVtblwiLFxuICAgICAgICAgICAgICAgICAgICBvblNob3dEZXNjOiBvblNob3dEZXNjXG4gICAgICAgICAgICAgICAgfSlcbiAgICB9XG59IiwiaW1wb3J0IHsgR3JpZFdpZGdldCB9IGZyb20gXCJAcG9sYXJpcy9kYXNoYm9hcmQtc2RrXCI7XG5cbmNvbnN0IGRhdGEgPSBbXG4gICAge1xuICAgICAgICB0eXBlOiBcImhlYXRtYXBcIixcbiAgICAgICAgbmFtZTogXCJCbG9jayAxXCIsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgIHNob3dMZWdlbmQ6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgICBkYXRhOlxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXA6IFwiQVwiLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogXCJ2MVwiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogMTJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXA6IFwiQlwiLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogXCJ2MVwiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogODJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXA6IFwiQ1wiLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogXCJ2MVwiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogMjNcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXA6IFwiRFwiLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogXCJ2MVwiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogODlcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXA6IFwiRVwiLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogXCJ2MVwiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogNzVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXA6IFwiRlwiLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogXCJ2MVwiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogMzhcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXA6IFwiR1wiLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogXCJ2MVwiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogMjVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXVxuICAgIH0sXG4gICAge1xuICAgICAgICB0eXBlOiBcImhlYXRtYXBcIixcbiAgICAgICAgbmFtZTogXCJCbG9jayAyXCIsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgIHNob3dMZWdlbmQ6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgICBkYXRhOlxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXA6IFwiQVwiLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogXCJ2MVwiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogMTJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXA6IFwiQlwiLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogXCJ2MVwiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogODJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXA6IFwiQ1wiLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogXCJ2MVwiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogMjNcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXA6IFwiRFwiLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogXCJ2MVwiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogODlcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXA6IFwiRVwiLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogXCJ2MVwiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogNzVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXA6IFwiRlwiLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogXCJ2MVwiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogMzhcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXA6IFwiR1wiLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogXCJ2MVwiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogMjVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXVxuICAgIH0sXG4gICAge1xuICAgICAgICB0eXBlOiBcImhlYXRtYXBcIixcbiAgICAgICAgbmFtZTogXCJCbG9jayAzXCIsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgIHNob3dMZWdlbmQ6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgICBkYXRhOlxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXA6IFwiQVwiLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogXCJ2MVwiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogMTJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXA6IFwiQlwiLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogXCJ2MVwiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogODJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXA6IFwiQ1wiLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogXCJ2MVwiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogMjNcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXA6IFwiRFwiLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogXCJ2MVwiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogODlcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXA6IFwiRVwiLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogXCJ2MVwiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogNzVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXA6IFwiRlwiLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogXCJ2MVwiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogMzhcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXA6IFwiR1wiLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogXCJ2MVwiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogMjVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXVxuICAgIH1cbl1cblxuXG5leHBvcnQgZnVuY3Rpb24gbW9ja1Byb2dyZXNzSGVhdChvblNob3dEZXNjKSB7XG4gICAgcmV0dXJuIHsgXCJoZWF0LXByb2dyZXNzLXdpZGdldFwiIDpcbiAgICAgICAgICAgIG5ldyBHcmlkV2lkZ2V0KFxuICAgICAgICAgICAgICAgIFwiS3Vyc2ZvcnRzY2hyaXR0XCIsXG4gICAgICAgICAgICAgICAgXCJGb3J0c2Nocml0dCBpbiBkZW4gZWluemVsbmVuIEt1cnNibMO2Y2tlblwiLFxuICAgICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb246IFwiY29sdW1uXCIsXG4gICAgICAgICAgICAgICAgICAgIG9uU2hvd0Rlc2M6IG9uU2hvd0Rlc2NcbiAgICAgICAgICAgICAgICB9KVxuICAgIH1cbn1cbiIsImltcG9ydCB7IEdyaWRXaWRnZXQgfSBmcm9tIFwiQHBvbGFyaXMvZGFzaGJvYXJkLXNka1wiO1xuaW1wb3J0IHsgQm94UGxvdFdpZGdldCB9IGZyb20gXCJAcG9sYXJpcy9kYXNoYm9hcmQtc2RrXCI7XG5cbmNvbnN0IGRhdGEgPSBbXG4gICAge1xuICAgICAgICB0eXBlOiBcImJveHBsb3RcIixcbiAgICAgICAgbmFtZTogXCJCbG9jayAxXCIsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgIHNob3dMZWdlbmQ6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgICBkYXRhOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG1pbjogMCxcbiAgICAgICAgICAgICAgICBtYXg6IDEwMCxcbiAgICAgICAgICAgICAgICBxMTogMzQuOCxcbiAgICAgICAgICAgICAgICBtZWRpYW46IDM1LFxuICAgICAgICAgICAgICAgIHEzOiAzNS4yLFxuICAgICAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgdHlwZTogXCJib3hwbG90XCIsXG4gICAgICAgIG5hbWU6IFwiQmxvY2sgMlwiLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICBzaG93TGVnZW5kOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgICAgZGF0YTpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBtaW46IDAsXG4gICAgICAgICAgICAgICAgbWF4OiAxMDAsXG4gICAgICAgICAgICAgICAgcTE6IDY3LjgsXG4gICAgICAgICAgICAgICAgbWVkaWFuOiA2OCxcbiAgICAgICAgICAgICAgICBxMzogNjguMixcbiAgICAgICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIHR5cGU6IFwiYm94cGxvdFwiLFxuICAgICAgICBuYW1lOiBcIkJsb2NrIDNcIixcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgc2hvd0xlZ2VuZDogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICAgIGRhdGE6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbWluOiAwLFxuICAgICAgICAgICAgICAgIG1heDogMTAwLFxuICAgICAgICAgICAgICAgIHExOiA2NC44LFxuICAgICAgICAgICAgICAgIG1lZGlhbjogNjUsXG4gICAgICAgICAgICAgICAgcTM6IDY1LjIsXG4gICAgICAgICAgICB9LFxuICAgIH1cbl1cblxuXG5leHBvcnQgZnVuY3Rpb24gbW9ja1Byb2dyZXNzQm94KG9uU2hvd0Rlc2MpIHtcbiAgICByZXR1cm4geyBcImJveC1wcm9ncmVzcy13aWRnZXRcIiA6XG4gICAgICAgICAgICBuZXcgR3JpZFdpZGdldChcbiAgICAgICAgICAgICAgICBcIkt1cnNmb3J0c2Nocml0dFwiLFxuICAgICAgICAgICAgICAgIFwiRm9ydHNjaHJpdHQgaW4gZGVuIGVpbnplbG5lbiBLdXJzYmzDtmNrZW5cIixcbiAgICAgICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uOiBcImNvbHVtblwiLFxuICAgICAgICAgICAgICAgICAgICBvblNob3dEZXNjOiBvblNob3dEZXNjXG4gICAgICAgICAgICAgICAgfSlcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBHcmlkV2lkZ2V0IH0gZnJvbSBcIkBwb2xhcmlzL2Rhc2hib2FyZC1zZGtcIjtcblxuY29uc3QgZGF0YSA9IFtcbiAgICB7XG4gICAgICAgIHR5cGU6IFwidGV4dEFyZWFFbGVtZW50XCIsXG4gICAgICAgIG5hbWU6IFwiXCIsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgIHNob3dMZWdlbmQ6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICB0ZXh0OiBcIkdpYiBoaWVyIGRlaW4gRmVlZGJhY2sgZWluXCIsXG4gICAgICAgIH1cbiAgICB9XG5dXG5cblxuZXhwb3J0IGZ1bmN0aW9uIG1vY2tGZWVkYmFjayhvblNob3dEZXNjKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgXCJmZWVkYmFjay1ncmlkLXdpZGdldFwiOlxuICAgICAgICAgICAgbmV3IEdyaWRXaWRnZXQoXG4gICAgICAgICAgICAgICAgXCJGZWVkYmFja1wiLFxuICAgICAgICAgICAgICAgIFwiRmVlZGJhY2sgRWxlbWVudFwiLFxuICAgICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb246IFwiY29sdW1uXCIsXG4gICAgICAgICAgICAgICAgICAgIG9uU2hvd0Rlc2M6IG9uU2hvd0Rlc2NcbiAgICAgICAgICAgICAgICB9KVxuICAgIH1cbn1cbiIsImltcG9ydCB7IExpbmVDaGFydFdpZGdldCB9IGZyb20gXCJAcG9sYXJpcy9kYXNoYm9hcmQtc2RrXCI7XG5cbmNvbnN0IGRhdGEgPSBbXG4gICAge2NvbHVtbjE6IDAsIGNvbHVtbjI6IDgwfSxcbiAgICB7Y29sdW1uMTogMTAsIGNvbHVtbjI6IDYwfSxcbiAgICB7Y29sdW1uMTogMjAsIGNvbHVtbjI6IDcwfSxcbiAgICB7Y29sdW1uMTogMzAsIGNvbHVtbjI6IDIwfSxcbiAgICB7Y29sdW1uMTogNDAsIGNvbHVtbjI6IDB9LFxuICAgIHtjb2x1bW4xOiA1MCwgY29sdW1uMjogNjB9LFxuICAgIHtjb2x1bW4xOiA2MCwgY29sdW1uMjogNzB9LFxuICAgIHtjb2x1bW4xOiA3MCwgY29sdW1uMjogODB9LFxuICAgIHtjb2x1bW4xOiA4MCwgY29sdW1uMjogNzZ9LFxuICAgIHtjb2x1bW4xOiA5MCwgY29sdW1uMjogNjB9LFxuICAgIHtjb2x1bW4xOiAxMDAsIGNvbHVtbjI6IDcwfSxcbl1cblxuZXhwb3J0IGZ1bmN0aW9uIG1vY2tMaW5lQ2hhcnQob25TaG93RGVzYykge1xuICAgIHJldHVybiB7IFwibGluZS1jaGFydC13aWRnZXRcIiA6XG4gICAgICAgICAgICBuZXcgTGluZUNoYXJ0V2lkZ2V0KFxuICAgICAgICAgICAgICAgIFwiS3Vyc251dHp1bmdcIixcbiAgICAgICAgICAgICAgICBcIkR1cmNoc2Nobml0dGxpY2hlIEt1cnNudXR6dW5nIG5hY2ggQmzDtmNrZW5cIixcbiAgICAgICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgc2hvd0xlZ2VuZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIHhBeGlzTGFiZWw6IFwiQmzDtmNrZVwiLFxuICAgICAgICAgICAgICAgICAgICB5QXhpc0xhYmVsOiBcIlRlaWxuYWhtZVwiLFxuICAgICAgICAgICAgICAgICAgICBvblNob3dEZXNjOiBvblNob3dEZXNjXG4gICAgICAgICAgICAgICAgfSlcbiAgICB9XG59IiwiaW1wb3J0IFJlYWN0LCB7IHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7bW9ja0JhckNoYXJ0LCBtb2NrQ2hhcnRKU0JhckNoYXJ0fSBmcm9tIFwiLi4vLi4vbW9ja19jaGFydHMvbW9ja19iYXJfY2hhcnRcIjtcbmltcG9ydCB7bW9ja0dyaWR9IGZyb20gXCIuLi8uLi9tb2NrX2NoYXJ0cy9tb2NrX2dyaWRcIjtcbmltcG9ydCB7bW9ja1NjYXR0ZXJHcmlkfSBmcm9tIFwiLi4vLi4vbW9ja19jaGFydHMvbW9ja19zY2F0dGVyX2dyaWRcIjtcbmltcG9ydCB7bW9ja1BpZUdyaWR9IGZyb20gXCIuLi8uLi9tb2NrX2NoYXJ0cy9tb2NrX3BpZV9ncmlkXCI7XG5pbXBvcnQge21vY2tEZWFkbGluZXN9IGZyb20gXCIuLi8uLi9tb2NrX2NoYXJ0cy9tb2NrX2RlYWRsaW5lc1wiO1xuaW1wb3J0IHttb2NrUHJvZ3Jlc3NIZWF0fSBmcm9tIFwiLi4vLi4vbW9ja19jaGFydHMvbW9ja19wcm9ncmVzc19oZWF0XCI7XG5pbXBvcnQge21vY2tQcm9ncmVzc0JveH0gZnJvbSBcIi4uLy4uL21vY2tfY2hhcnRzL21vY2tfcHJvZ3Jlc3NfYm94XCI7XG5pbXBvcnQge21vY2tGZWVkYmFja30gZnJvbSBcIi4uLy4uL21vY2tfY2hhcnRzL21vY2tfZmVlZGJhY2tcIjtcbmltcG9ydCB7bW9ja0xpbmVDaGFydH0gZnJvbSBcIi4uLy4uL21vY2tfY2hhcnRzL21vY2tfbGluZV9jaGFydFwiO1xuaW1wb3J0IHsgaW5pdEdyaWQgfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMvanMvdXRpbHMnO1xuXG5cbmNvbnN0IHdpZGdldHNfY29uZmlnID0gW1xuICAgIHtcbiAgICAgICAgeDogMCxcbiAgICAgICAgeTogMCxcbiAgICAgICAgdzogNCxcbiAgICAgICAgaDogNixcbiAgICAgICAgd2lkZ2V0SWQ6IFwic2NhdHRlci1ncmlkLXdpZGdldFwiLFxuICAgIH0sXG4gICAge1xuICAgICAgICB4OiA0LFxuICAgICAgICB5OiAwLFxuICAgICAgICB3OiA0LFxuICAgICAgICBoOiA2LFxuICAgICAgICB3aWRnZXRJZDogXCJncmlkLXdpZGdldFwiLFxuICAgIH0sXG4gICAge1xuICAgICAgICB4OiA4LFxuICAgICAgICB5OiAwLFxuICAgICAgICB3OiA0LFxuICAgICAgICBoOiA3LFxuICAgICAgICB3aWRnZXRJZDogXCJjaGFydGpzLWJhcmNoYXJ0LXdpZGdldFwiLFxuICAgIH0sXG5cbiAgICB7XG4gICAgICAgIHg6IDAsXG4gICAgICAgIHk6IDYsXG4gICAgICAgIHc6IDIsXG4gICAgICAgIGg6IDUsXG4gICAgICAgIHdpZGdldElkOiBcImhlYXQtcHJvZ3Jlc3Mtd2lkZ2V0XCIsXG4gICAgfSxcbiAgICB7XG4gICAgICAgIHg6IDIsXG4gICAgICAgIHk6IDYsXG4gICAgICAgIHc6IDIsXG4gICAgICAgIGg6IDUsXG4gICAgICAgIHdpZGdldElkOiBcImJveC1wcm9ncmVzcy13aWRnZXRcIlxuICAgIH0sXG4gICAge1xuICAgICAgICB4OiAwLFxuICAgICAgICB5OiAxMSxcbiAgICAgICAgaDogNixcbiAgICAgICAgdzogNCxcbiAgICAgICAgd2lkZ2V0SWQ6IFwibGluZS1jaGFydC13aWRnZXRcIlxuICAgIH0sXG4gICAge1xuICAgICAgICB4OiA0LFxuICAgICAgICB5OiA2LFxuICAgICAgICB3OiA0LFxuICAgICAgICBoOiA4LFxuICAgICAgICB3aWRnZXRJZDogXCJtYy1waWUtZ3JpZC13aWRnZXRcIixcbiAgICB9LFxuICAgIHtcbiAgICAgICAgeDogOCxcbiAgICAgICAgeTogNixcbiAgICAgICAgdzogNCxcbiAgICAgICAgaDogMyxcbiAgICAgICAgd2lkZ2V0SWQ6IFwiZGVhZGxpbmVzLWdyaWQtd2lkZ2V0XCIsXG4gICAgfSxcbiAgICB7XG4gICAgICAgIHg6IDgsXG4gICAgICAgIHk6IDksXG4gICAgICAgIHc6IDQsXG4gICAgICAgIGg6IDUsXG4gICAgICAgIHdpZGdldElkOiBcImZlZWRiYWNrLWdyaWQtd2lkZ2V0XCIsXG4gICAgfVxuXTtcblxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBEYXNoYm9hcmQoKSB7XG5cbiAgICBjb25zdCBvblNob3dEZXNjID0gKGRlc2MpID0+IHtcbiAgICBjb25zdCBtb2RhbENvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIm1vZGFsLWNvbnRlbnQtYm9keVwiKTtcbiAgICBtb2RhbENvbnRlbnQuaW5uZXJUZXh0ID0gZGVzYztcbiAgICBjb25zdCBtb2RhbCA9IG5ldyBib290c3RyYXAuTW9kYWwoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJteU1vZGFsXCIpLCB7fSk7XG4gICAgbW9kYWwuc2hvdygpO1xufTtcblxuLyoqXG4gKiBPcGVucyBib290c3RyYXAgZXJyb3IgbW9kYWwuXG4gKiBAcGFyYW0geyp9IG1lc3NhZ2VcbiAqL1xuY29uc3Qgc2hvd0Vycm9yTW9kYWwgPSAobWVzc2FnZSkgPT4ge1xuICAgIGNvbnN0IG1vZGFsQ29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiZXJyb3ItbW9kYWwtY29udGVudC1ib2R5XCIpO1xuICAgIG1vZGFsQ29udGVudC5pbm5lclRleHQgPSBtZXNzYWdlO1xuICAgIGNvbnN0IG1vZGFsID0gbmV3IGJvb3RzdHJhcC5Nb2RhbChkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIm15RXJyb3JNb2RhbFwiKSwge30pO1xuICAgIG1vZGFsLnNob3coKTtcbn07XG5cbiAgICBjb25zdCBidWlsZFdpZGdldHMgPSAoZGF0YSkgPT4ge1xuICAgICAgICBjb25zdCB3aWRnZXRzID0ge1xuICAgICAgICAgICAgLy8uLi5tb2NrQmFyQ2hhcnQsXG4gICAgICAgICAgICAuLi5tb2NrQ2hhcnRKU0JhckNoYXJ0KG9uU2hvd0Rlc2MpLFxuICAgICAgICAgICAgLi4ubW9ja0dyaWQob25TaG93RGVzYyksXG4gICAgICAgICAgICAuLi5tb2NrU2NhdHRlckdyaWQob25TaG93RGVzYyksXG4gICAgICAgICAgICAuLi5tb2NrUGllR3JpZChvblNob3dEZXNjKSxcbiAgICAgICAgICAgIC4uLm1vY2tEZWFkbGluZXMob25TaG93RGVzYyksXG4gICAgICAgICAgICAuLi5tb2NrUHJvZ3Jlc3NIZWF0KG9uU2hvd0Rlc2MpLFxuICAgICAgICAgICAgLi4ubW9ja1Byb2dyZXNzQm94KG9uU2hvd0Rlc2MpLFxuICAgICAgICAgICAgLi4ubW9ja0ZlZWRiYWNrKG9uU2hvd0Rlc2MpLFxuICAgICAgICAgICAgLi4ubW9ja0xpbmVDaGFydChvblNob3dEZXNjKVxuICAgICAgICB9O1xuICAgIFxuICAgICAgICByZXR1cm4gd2lkZ2V0cztcbiAgICB9O1xuXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgY29uc3Qgd2lkZ2V0cyA9IGJ1aWxkV2lkZ2V0cyhbXSk7XG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBncmlkIHdpdGggd2lkZ2V0cyBhdCBjb25maWd1cmVkIHBvc2l0aW9uc1xuICAgICAgICBsZXQgZ3JpZCA9IGluaXRHcmlkKHdpZGdldHMsIHdpZGdldHNfY29uZmlnKTtcbiAgICB9LCBbXSlcblxuICAgIHJldHVybiA8ZGl2IGNsYXNzPVwiZ3JpZFwiPlxuICAgIDxkaXYgY2xhc3M9XCJncmlkLXN0YWNrXCI+PC9kaXY+XG4gIDwvZGl2PlxufSIsImZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkge1xuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7XG5cbiAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTtcbiAgICBlbnVtZXJhYmxlT25seSAmJiAoc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHtcbiAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlO1xuICAgIH0pKSwga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpO1xuICB9XG5cbiAgcmV0dXJuIGtleXM7XG59XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQyKHRhcmdldCkge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzb3VyY2UgPSBudWxsICE9IGFyZ3VtZW50c1tpXSA/IGFyZ3VtZW50c1tpXSA6IHt9O1xuICAgIGkgJSAyID8gb3duS2V5cyhPYmplY3Qoc291cmNlKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7XG4gICAgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSkgOiBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuZnVuY3Rpb24gX3R5cGVvZihvYmopIHtcbiAgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiO1xuXG4gIHJldHVybiBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG9iaikge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqO1xuICB9IDogZnVuY3Rpb24gKG9iaikge1xuICAgIHJldHVybiBvYmogJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7XG4gIH0sIF90eXBlb2Yob2JqKTtcbn1cblxuZnVuY3Rpb24gX3dyYXBSZWdFeHAoKSB7XG4gIF93cmFwUmVnRXhwID0gZnVuY3Rpb24gKHJlLCBncm91cHMpIHtcbiAgICByZXR1cm4gbmV3IEJhYmVsUmVnRXhwKHJlLCB2b2lkIDAsIGdyb3Vwcyk7XG4gIH07XG5cbiAgdmFyIF9zdXBlciA9IFJlZ0V4cC5wcm90b3R5cGUsXG4gICAgICBfZ3JvdXBzID0gbmV3IFdlYWtNYXAoKTtcblxuICBmdW5jdGlvbiBCYWJlbFJlZ0V4cChyZSwgZmxhZ3MsIGdyb3Vwcykge1xuICAgIHZhciBfdGhpcyA9IG5ldyBSZWdFeHAocmUsIGZsYWdzKTtcblxuICAgIHJldHVybiBfZ3JvdXBzLnNldChfdGhpcywgZ3JvdXBzIHx8IF9ncm91cHMuZ2V0KHJlKSksIF9zZXRQcm90b3R5cGVPZihfdGhpcywgQmFiZWxSZWdFeHAucHJvdG90eXBlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGJ1aWxkR3JvdXBzKHJlc3VsdCwgcmUpIHtcbiAgICB2YXIgZyA9IF9ncm91cHMuZ2V0KHJlKTtcblxuICAgIHJldHVybiBPYmplY3Qua2V5cyhnKS5yZWR1Y2UoZnVuY3Rpb24gKGdyb3VwcywgbmFtZSkge1xuICAgICAgcmV0dXJuIGdyb3Vwc1tuYW1lXSA9IHJlc3VsdFtnW25hbWVdXSwgZ3JvdXBzO1xuICAgIH0sIE9iamVjdC5jcmVhdGUobnVsbCkpO1xuICB9XG5cbiAgcmV0dXJuIF9pbmhlcml0cyhCYWJlbFJlZ0V4cCwgUmVnRXhwKSwgQmFiZWxSZWdFeHAucHJvdG90eXBlLmV4ZWMgPSBmdW5jdGlvbiAoc3RyKSB7XG4gICAgdmFyIHJlc3VsdCA9IF9zdXBlci5leGVjLmNhbGwodGhpcywgc3RyKTtcblxuICAgIHJldHVybiByZXN1bHQgJiYgKHJlc3VsdC5ncm91cHMgPSBidWlsZEdyb3VwcyhyZXN1bHQsIHRoaXMpKSwgcmVzdWx0O1xuICB9LCBCYWJlbFJlZ0V4cC5wcm90b3R5cGVbU3ltYm9sLnJlcGxhY2VdID0gZnVuY3Rpb24gKHN0ciwgc3Vic3RpdHV0aW9uKSB7XG4gICAgaWYgKFwic3RyaW5nXCIgPT0gdHlwZW9mIHN1YnN0aXR1dGlvbikge1xuICAgICAgdmFyIGdyb3VwcyA9IF9ncm91cHMuZ2V0KHRoaXMpO1xuXG4gICAgICByZXR1cm4gX3N1cGVyW1N5bWJvbC5yZXBsYWNlXS5jYWxsKHRoaXMsIHN0ciwgc3Vic3RpdHV0aW9uLnJlcGxhY2UoL1xcJDwoW14+XSspPi9nLCBmdW5jdGlvbiAoXywgbmFtZSkge1xuICAgICAgICByZXR1cm4gXCIkXCIgKyBncm91cHNbbmFtZV07XG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgaWYgKFwiZnVuY3Rpb25cIiA9PSB0eXBlb2Ygc3Vic3RpdHV0aW9uKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICByZXR1cm4gX3N1cGVyW1N5bWJvbC5yZXBsYWNlXS5jYWxsKHRoaXMsIHN0ciwgZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICAgICAgcmV0dXJuIFwib2JqZWN0XCIgIT0gdHlwZW9mIGFyZ3NbYXJncy5sZW5ndGggLSAxXSAmJiAoYXJncyA9IFtdLnNsaWNlLmNhbGwoYXJncykpLnB1c2goYnVpbGRHcm91cHMoYXJncywgX3RoaXMpKSwgc3Vic3RpdHV0aW9uLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIF9zdXBlcltTeW1ib2wucmVwbGFjZV0uY2FsbCh0aGlzLCBzdHIsIHN1YnN0aXR1dGlvbik7XG4gIH0sIF93cmFwUmVnRXhwLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHtcbiAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07XG4gICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7XG4gIGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpO1xuICBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb25zdHJ1Y3RvciwgXCJwcm90b3R5cGVcIiwge1xuICAgIHdyaXRhYmxlOiBmYWxzZVxuICB9KTtcbiAgcmV0dXJuIENvbnN0cnVjdG9yO1xufVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7XG4gIGlmIChrZXkgaW4gb2JqKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBvYmpba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIG9iajtcbn1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7XG4gIGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7XG4gIH1cblxuICBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHtcbiAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgdmFsdWU6IHN1YkNsYXNzLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9XG4gIH0pO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc3ViQ2xhc3MsIFwicHJvdG90eXBlXCIsIHtcbiAgICB3cml0YWJsZTogZmFsc2VcbiAgfSk7XG4gIGlmIChzdXBlckNsYXNzKSBfc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpO1xufVxuXG5mdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkge1xuICBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHtcbiAgICBvLl9fcHJvdG9fXyA9IHA7XG4gICAgcmV0dXJuIG87XG4gIH07XG5cbiAgcmV0dXJuIF9zZXRQcm90b3R5cGVPZihvLCBwKTtcbn1cblxuZnVuY3Rpb24gX3NsaWNlZFRvQXJyYXkoYXJyLCBpKSB7XG4gIHJldHVybiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB8fCBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyLCBpKSB8fCBfbm9uSXRlcmFibGVSZXN0KCk7XG59XG5cbmZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHtcbiAgcmV0dXJuIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBfbm9uSXRlcmFibGVTcHJlYWQoKTtcbn1cblxuZnVuY3Rpb24gX2FycmF5V2l0aG91dEhvbGVzKGFycikge1xuICBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkoYXJyKTtcbn1cblxuZnVuY3Rpb24gX2FycmF5V2l0aEhvbGVzKGFycikge1xuICBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gYXJyO1xufVxuXG5mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5KGl0ZXIpIHtcbiAgaWYgKHR5cGVvZiBTeW1ib2wgIT09IFwidW5kZWZpbmVkXCIgJiYgaXRlcltTeW1ib2wuaXRlcmF0b3JdICE9IG51bGwgfHwgaXRlcltcIkBAaXRlcmF0b3JcIl0gIT0gbnVsbCkgcmV0dXJuIEFycmF5LmZyb20oaXRlcik7XG59XG5cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHtcbiAgdmFyIF9pID0gYXJyID09IG51bGwgPyBudWxsIDogdHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBhcnJbU3ltYm9sLml0ZXJhdG9yXSB8fCBhcnJbXCJAQGl0ZXJhdG9yXCJdO1xuXG4gIGlmIChfaSA9PSBudWxsKSByZXR1cm47XG4gIHZhciBfYXJyID0gW107XG4gIHZhciBfbiA9IHRydWU7XG4gIHZhciBfZCA9IGZhbHNlO1xuXG4gIHZhciBfcywgX2U7XG5cbiAgdHJ5IHtcbiAgICBmb3IgKF9pID0gX2kuY2FsbChhcnIpOyAhKF9uID0gKF9zID0gX2kubmV4dCgpKS5kb25lKTsgX24gPSB0cnVlKSB7XG4gICAgICBfYXJyLnB1c2goX3MudmFsdWUpO1xuXG4gICAgICBpZiAoaSAmJiBfYXJyLmxlbmd0aCA9PT0gaSkgYnJlYWs7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBfZCA9IHRydWU7XG4gICAgX2UgPSBlcnI7XG4gIH0gZmluYWxseSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghX24gJiYgX2lbXCJyZXR1cm5cIl0gIT0gbnVsbCkgX2lbXCJyZXR1cm5cIl0oKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKF9kKSB0aHJvdyBfZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gX2Fycjtcbn1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikge1xuICBpZiAoIW8pIHJldHVybjtcbiAgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTtcbiAgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpO1xuICBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lO1xuICBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTtcbiAgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pO1xufVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikge1xuICBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDtcblxuICBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIGFycjJbaV0gPSBhcnJbaV07XG5cbiAgcmV0dXJuIGFycjI7XG59XG5cbmZ1bmN0aW9uIF9ub25JdGVyYWJsZVNwcmVhZCgpIHtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7XG59XG5cbmZ1bmN0aW9uIF9ub25JdGVyYWJsZVJlc3QoKSB7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7XG59XG5cbnZhciBub29wID0gZnVuY3Rpb24gbm9vcCgpIHt9O1xuXG52YXIgX1dJTkRPVyA9IHt9O1xudmFyIF9ET0NVTUVOVCA9IHt9O1xudmFyIF9NVVRBVElPTl9PQlNFUlZFUiA9IG51bGw7XG52YXIgX1BFUkZPUk1BTkNFID0ge1xuICBtYXJrOiBub29wLFxuICBtZWFzdXJlOiBub29wXG59O1xuXG50cnkge1xuICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIF9XSU5ET1cgPSB3aW5kb3c7XG4gIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnKSBfRE9DVU1FTlQgPSBkb2N1bWVudDtcbiAgaWYgKHR5cGVvZiBNdXRhdGlvbk9ic2VydmVyICE9PSAndW5kZWZpbmVkJykgX01VVEFUSU9OX09CU0VSVkVSID0gTXV0YXRpb25PYnNlcnZlcjtcbiAgaWYgKHR5cGVvZiBwZXJmb3JtYW5jZSAhPT0gJ3VuZGVmaW5lZCcpIF9QRVJGT1JNQU5DRSA9IHBlcmZvcm1hbmNlO1xufSBjYXRjaCAoZSkge31cblxudmFyIF9yZWYgPSBfV0lORE9XLm5hdmlnYXRvciB8fCB7fSxcbiAgICBfcmVmJHVzZXJBZ2VudCA9IF9yZWYudXNlckFnZW50LFxuICAgIHVzZXJBZ2VudCA9IF9yZWYkdXNlckFnZW50ID09PSB2b2lkIDAgPyAnJyA6IF9yZWYkdXNlckFnZW50O1xudmFyIFdJTkRPVyA9IF9XSU5ET1c7XG52YXIgRE9DVU1FTlQgPSBfRE9DVU1FTlQ7XG52YXIgTVVUQVRJT05fT0JTRVJWRVIgPSBfTVVUQVRJT05fT0JTRVJWRVI7XG52YXIgUEVSRk9STUFOQ0UgPSBfUEVSRk9STUFOQ0U7XG52YXIgSVNfQlJPV1NFUiA9ICEhV0lORE9XLmRvY3VtZW50O1xudmFyIElTX0RPTSA9ICEhRE9DVU1FTlQuZG9jdW1lbnRFbGVtZW50ICYmICEhRE9DVU1FTlQuaGVhZCAmJiB0eXBlb2YgRE9DVU1FTlQuYWRkRXZlbnRMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgRE9DVU1FTlQuY3JlYXRlRWxlbWVudCA9PT0gJ2Z1bmN0aW9uJztcbnZhciBJU19JRSA9IH51c2VyQWdlbnQuaW5kZXhPZignTVNJRScpIHx8IH51c2VyQWdlbnQuaW5kZXhPZignVHJpZGVudC8nKTtcblxudmFyIF9mYW1pbHlQcm94eSwgX2ZhbWlseVByb3h5MiwgX2ZhbWlseVByb3h5MywgX2ZhbWlseVByb3h5NCwgX2ZhbWlseVByb3h5NTtcblxudmFyIE5BTUVTUEFDRV9JREVOVElGSUVSID0gJ19fX0ZPTlRfQVdFU09NRV9fXyc7XG52YXIgVU5JVFNfSU5fR1JJRCA9IDE2O1xudmFyIERFRkFVTFRfQ1NTX1BSRUZJWCA9ICdmYSc7XG52YXIgREVGQVVMVF9SRVBMQUNFTUVOVF9DTEFTUyA9ICdzdmctaW5saW5lLS1mYSc7XG52YXIgREFUQV9GQV9JMlNWRyA9ICdkYXRhLWZhLWkyc3ZnJztcbnZhciBEQVRBX0ZBX1BTRVVET19FTEVNRU5UID0gJ2RhdGEtZmEtcHNldWRvLWVsZW1lbnQnO1xudmFyIERBVEFfRkFfUFNFVURPX0VMRU1FTlRfUEVORElORyA9ICdkYXRhLWZhLXBzZXVkby1lbGVtZW50LXBlbmRpbmcnO1xudmFyIERBVEFfUFJFRklYID0gJ2RhdGEtcHJlZml4JztcbnZhciBEQVRBX0lDT04gPSAnZGF0YS1pY29uJztcbnZhciBIVE1MX0NMQVNTX0kyU1ZHX0JBU0VfQ0xBU1MgPSAnZm9udGF3ZXNvbWUtaTJzdmcnO1xudmFyIE1VVEFUSU9OX0FQUFJPQUNIX0FTWU5DID0gJ2FzeW5jJztcbnZhciBUQUdOQU1FU19UT19TS0lQX0ZPUl9QU0VVRE9FTEVNRU5UUyA9IFsnSFRNTCcsICdIRUFEJywgJ1NUWUxFJywgJ1NDUklQVCddO1xudmFyIFBST0RVQ1RJT04gPSBmdW5jdGlvbiAoKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbic7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn0oKTtcbnZhciBGQU1JTFlfQ0xBU1NJQyA9ICdjbGFzc2ljJztcbnZhciBGQU1JTFlfU0hBUlAgPSAnc2hhcnAnO1xudmFyIEZBTUlMSUVTID0gW0ZBTUlMWV9DTEFTU0lDLCBGQU1JTFlfU0hBUlBdO1xuXG5mdW5jdGlvbiBmYW1pbHlQcm94eShvYmopIHtcbiAgLy8gRGVmYXVsdHMgdG8gdGhlIGNsYXNzaWMgZmFtaWx5IGlmIGZhbWlseSBpcyBub3QgYXZhaWxhYmxlXG4gIHJldHVybiBuZXcgUHJveHkob2JqLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQodGFyZ2V0LCBwcm9wKSB7XG4gICAgICByZXR1cm4gcHJvcCBpbiB0YXJnZXQgPyB0YXJnZXRbcHJvcF0gOiB0YXJnZXRbRkFNSUxZX0NMQVNTSUNdO1xuICAgIH1cbiAgfSk7XG59XG52YXIgUFJFRklYX1RPX1NUWUxFID0gZmFtaWx5UHJveHkoKF9mYW1pbHlQcm94eSA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2ZhbWlseVByb3h5LCBGQU1JTFlfQ0xBU1NJQywge1xuICAnZmEnOiAnc29saWQnLFxuICAnZmFzJzogJ3NvbGlkJyxcbiAgJ2ZhLXNvbGlkJzogJ3NvbGlkJyxcbiAgJ2Zhcic6ICdyZWd1bGFyJyxcbiAgJ2ZhLXJlZ3VsYXInOiAncmVndWxhcicsXG4gICdmYWwnOiAnbGlnaHQnLFxuICAnZmEtbGlnaHQnOiAnbGlnaHQnLFxuICAnZmF0JzogJ3RoaW4nLFxuICAnZmEtdGhpbic6ICd0aGluJyxcbiAgJ2ZhZCc6ICdkdW90b25lJyxcbiAgJ2ZhLWR1b3RvbmUnOiAnZHVvdG9uZScsXG4gICdmYWInOiAnYnJhbmRzJyxcbiAgJ2ZhLWJyYW5kcyc6ICdicmFuZHMnLFxuICAnZmFrJzogJ2tpdCcsXG4gICdmYWtkJzogJ2tpdCcsXG4gICdmYS1raXQnOiAna2l0JyxcbiAgJ2ZhLWtpdC1kdW90b25lJzogJ2tpdCdcbn0pLCBfZGVmaW5lUHJvcGVydHkoX2ZhbWlseVByb3h5LCBGQU1JTFlfU0hBUlAsIHtcbiAgJ2ZhJzogJ3NvbGlkJyxcbiAgJ2Zhc3MnOiAnc29saWQnLFxuICAnZmEtc29saWQnOiAnc29saWQnLFxuICAnZmFzcic6ICdyZWd1bGFyJyxcbiAgJ2ZhLXJlZ3VsYXInOiAncmVndWxhcicsXG4gICdmYXNsJzogJ2xpZ2h0JyxcbiAgJ2ZhLWxpZ2h0JzogJ2xpZ2h0JyxcbiAgJ2Zhc3QnOiAndGhpbicsXG4gICdmYS10aGluJzogJ3RoaW4nXG59KSwgX2ZhbWlseVByb3h5KSk7XG52YXIgU1RZTEVfVE9fUFJFRklYID0gZmFtaWx5UHJveHkoKF9mYW1pbHlQcm94eTIgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9mYW1pbHlQcm94eTIsIEZBTUlMWV9DTEFTU0lDLCB7XG4gIHNvbGlkOiAnZmFzJyxcbiAgcmVndWxhcjogJ2ZhcicsXG4gIGxpZ2h0OiAnZmFsJyxcbiAgdGhpbjogJ2ZhdCcsXG4gIGR1b3RvbmU6ICdmYWQnLFxuICBicmFuZHM6ICdmYWInLFxuICBraXQ6ICdmYWsnXG59KSwgX2RlZmluZVByb3BlcnR5KF9mYW1pbHlQcm94eTIsIEZBTUlMWV9TSEFSUCwge1xuICBzb2xpZDogJ2Zhc3MnLFxuICByZWd1bGFyOiAnZmFzcicsXG4gIGxpZ2h0OiAnZmFzbCcsXG4gIHRoaW46ICdmYXN0J1xufSksIF9mYW1pbHlQcm94eTIpKTtcbnZhciBQUkVGSVhfVE9fTE9OR19TVFlMRSA9IGZhbWlseVByb3h5KChfZmFtaWx5UHJveHkzID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfZmFtaWx5UHJveHkzLCBGQU1JTFlfQ0xBU1NJQywge1xuICBmYWI6ICdmYS1icmFuZHMnLFxuICBmYWQ6ICdmYS1kdW90b25lJyxcbiAgZmFrOiAnZmEta2l0JyxcbiAgZmFsOiAnZmEtbGlnaHQnLFxuICBmYXI6ICdmYS1yZWd1bGFyJyxcbiAgZmFzOiAnZmEtc29saWQnLFxuICBmYXQ6ICdmYS10aGluJ1xufSksIF9kZWZpbmVQcm9wZXJ0eShfZmFtaWx5UHJveHkzLCBGQU1JTFlfU0hBUlAsIHtcbiAgZmFzczogJ2ZhLXNvbGlkJyxcbiAgZmFzcjogJ2ZhLXJlZ3VsYXInLFxuICBmYXNsOiAnZmEtbGlnaHQnLFxuICBmYXN0OiAnZmEtdGhpbidcbn0pLCBfZmFtaWx5UHJveHkzKSk7XG52YXIgTE9OR19TVFlMRV9UT19QUkVGSVggPSBmYW1pbHlQcm94eSgoX2ZhbWlseVByb3h5NCA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2ZhbWlseVByb3h5NCwgRkFNSUxZX0NMQVNTSUMsIHtcbiAgJ2ZhLWJyYW5kcyc6ICdmYWInLFxuICAnZmEtZHVvdG9uZSc6ICdmYWQnLFxuICAnZmEta2l0JzogJ2ZhaycsXG4gICdmYS1saWdodCc6ICdmYWwnLFxuICAnZmEtcmVndWxhcic6ICdmYXInLFxuICAnZmEtc29saWQnOiAnZmFzJyxcbiAgJ2ZhLXRoaW4nOiAnZmF0J1xufSksIF9kZWZpbmVQcm9wZXJ0eShfZmFtaWx5UHJveHk0LCBGQU1JTFlfU0hBUlAsIHtcbiAgJ2ZhLXNvbGlkJzogJ2Zhc3MnLFxuICAnZmEtcmVndWxhcic6ICdmYXNyJyxcbiAgJ2ZhLWxpZ2h0JzogJ2Zhc2wnLFxuICAnZmEtdGhpbic6ICdmYXN0J1xufSksIF9mYW1pbHlQcm94eTQpKTtcbnZhciBJQ09OX1NFTEVDVElPTl9TWU5UQVhfUEFUVEVSTiA9IC9mYShzfHJ8bHx0fGR8YnxrfHNzfHNyfHNsfHN0KT9bXFwtXFwgXS87IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdXNlbGVzcy1lc2NhcGVcblxudmFyIExBWUVSU19URVhUX0NMQVNTTkFNRSA9ICdmYS1sYXllcnMtdGV4dCc7XG52YXIgRk9OVF9GQU1JTFlfUEFUVEVSTiA9IC9Gb250ID9Bd2Vzb21lID8oWzU2IF0qKShTb2xpZHxSZWd1bGFyfExpZ2h0fFRoaW58RHVvdG9uZXxCcmFuZHN8RnJlZXxQcm98U2hhcnB8S2l0KT8uKi9pO1xudmFyIEZPTlRfV0VJR0hUX1RPX1BSRUZJWCA9IGZhbWlseVByb3h5KChfZmFtaWx5UHJveHk1ID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfZmFtaWx5UHJveHk1LCBGQU1JTFlfQ0xBU1NJQywge1xuICA5MDA6ICdmYXMnLFxuICA0MDA6ICdmYXInLFxuICBub3JtYWw6ICdmYXInLFxuICAzMDA6ICdmYWwnLFxuICAxMDA6ICdmYXQnXG59KSwgX2RlZmluZVByb3BlcnR5KF9mYW1pbHlQcm94eTUsIEZBTUlMWV9TSEFSUCwge1xuICA5MDA6ICdmYXNzJyxcbiAgNDAwOiAnZmFzcicsXG4gIDMwMDogJ2Zhc2wnLFxuICAxMDA6ICdmYXN0J1xufSksIF9mYW1pbHlQcm94eTUpKTtcbnZhciBvbmVUb1RlbiA9IFsxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMF07XG52YXIgb25lVG9Ud2VudHkgPSBvbmVUb1Rlbi5jb25jYXQoWzExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIwXSk7XG52YXIgQVRUUklCVVRFU19XQVRDSEVEX0ZPUl9NVVRBVElPTiA9IFsnY2xhc3MnLCAnZGF0YS1wcmVmaXgnLCAnZGF0YS1pY29uJywgJ2RhdGEtZmEtdHJhbnNmb3JtJywgJ2RhdGEtZmEtbWFzayddO1xudmFyIERVT1RPTkVfQ0xBU1NFUyA9IHtcbiAgR1JPVVA6ICdkdW90b25lLWdyb3VwJyxcbiAgU1dBUF9PUEFDSVRZOiAnc3dhcC1vcGFjaXR5JyxcbiAgUFJJTUFSWTogJ3ByaW1hcnknLFxuICBTRUNPTkRBUlk6ICdzZWNvbmRhcnknXG59O1xudmFyIHByZWZpeGVzID0gbmV3IFNldCgpO1xuT2JqZWN0LmtleXMoU1RZTEVfVE9fUFJFRklYW0ZBTUlMWV9DTEFTU0lDXSkubWFwKHByZWZpeGVzLmFkZC5iaW5kKHByZWZpeGVzKSk7XG5PYmplY3Qua2V5cyhTVFlMRV9UT19QUkVGSVhbRkFNSUxZX1NIQVJQXSkubWFwKHByZWZpeGVzLmFkZC5iaW5kKHByZWZpeGVzKSk7XG52YXIgUkVTRVJWRURfQ0xBU1NFUyA9IFtdLmNvbmNhdChGQU1JTElFUywgX3RvQ29uc3VtYWJsZUFycmF5KHByZWZpeGVzKSwgWycyeHMnLCAneHMnLCAnc20nLCAnbGcnLCAneGwnLCAnMnhsJywgJ2JlYXQnLCAnYm9yZGVyJywgJ2ZhZGUnLCAnYmVhdC1mYWRlJywgJ2JvdW5jZScsICdmbGlwLWJvdGgnLCAnZmxpcC1ob3Jpem9udGFsJywgJ2ZsaXAtdmVydGljYWwnLCAnZmxpcCcsICdmdycsICdpbnZlcnNlJywgJ2xheWVycy1jb3VudGVyJywgJ2xheWVycy10ZXh0JywgJ2xheWVycycsICdsaScsICdwdWxsLWxlZnQnLCAncHVsbC1yaWdodCcsICdwdWxzZScsICdyb3RhdGUtMTgwJywgJ3JvdGF0ZS0yNzAnLCAncm90YXRlLTkwJywgJ3JvdGF0ZS1ieScsICdzaGFrZScsICdzcGluLXB1bHNlJywgJ3NwaW4tcmV2ZXJzZScsICdzcGluJywgJ3N0YWNrLTF4JywgJ3N0YWNrLTJ4JywgJ3N0YWNrJywgJ3VsJywgRFVPVE9ORV9DTEFTU0VTLkdST1VQLCBEVU9UT05FX0NMQVNTRVMuU1dBUF9PUEFDSVRZLCBEVU9UT05FX0NMQVNTRVMuUFJJTUFSWSwgRFVPVE9ORV9DTEFTU0VTLlNFQ09OREFSWV0pLmNvbmNhdChvbmVUb1Rlbi5tYXAoZnVuY3Rpb24gKG4pIHtcbiAgcmV0dXJuIFwiXCIuY29uY2F0KG4sIFwieFwiKTtcbn0pKS5jb25jYXQob25lVG9Ud2VudHkubWFwKGZ1bmN0aW9uIChuKSB7XG4gIHJldHVybiBcInctXCIuY29uY2F0KG4pO1xufSkpO1xuXG52YXIgaW5pdGlhbCA9IFdJTkRPVy5Gb250QXdlc29tZUNvbmZpZyB8fCB7fTtcblxuZnVuY3Rpb24gZ2V0QXR0ckNvbmZpZyhhdHRyKSB7XG4gIHZhciBlbGVtZW50ID0gRE9DVU1FTlQucXVlcnlTZWxlY3Rvcignc2NyaXB0WycgKyBhdHRyICsgJ10nKTtcblxuICBpZiAoZWxlbWVudCkge1xuICAgIHJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZShhdHRyKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb2VyY2UodmFsKSB7XG4gIC8vIEdldHRpbmcgYW4gZW1wdHkgc3RyaW5nIHdpbGwgb2NjdXIgaWYgdGhlIGF0dHJpYnV0ZSBpcyBzZXQgb24gdGhlIEhUTUwgdGFnIGJ1dCB3aXRob3V0IGEgdmFsdWVcbiAgLy8gV2UnbGwgYXNzdW1lIHRoYXQgdGhpcyBpcyBhbiBpbmRpY2F0aW9uIHRoYXQgaXQgc2hvdWxkIGJlIHRvZ2dsZWQgdG8gdHJ1ZVxuICBpZiAodmFsID09PSAnJykgcmV0dXJuIHRydWU7XG4gIGlmICh2YWwgPT09ICdmYWxzZScpIHJldHVybiBmYWxzZTtcbiAgaWYgKHZhbCA9PT0gJ3RydWUnKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIHZhbDtcbn1cblxuaWYgKERPQ1VNRU5UICYmIHR5cGVvZiBET0NVTUVOVC5xdWVyeVNlbGVjdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gIHZhciBhdHRycyA9IFtbJ2RhdGEtZmFtaWx5LXByZWZpeCcsICdmYW1pbHlQcmVmaXgnXSwgWydkYXRhLWNzcy1wcmVmaXgnLCAnY3NzUHJlZml4J10sIFsnZGF0YS1mYW1pbHktZGVmYXVsdCcsICdmYW1pbHlEZWZhdWx0J10sIFsnZGF0YS1zdHlsZS1kZWZhdWx0JywgJ3N0eWxlRGVmYXVsdCddLCBbJ2RhdGEtcmVwbGFjZW1lbnQtY2xhc3MnLCAncmVwbGFjZW1lbnRDbGFzcyddLCBbJ2RhdGEtYXV0by1yZXBsYWNlLXN2ZycsICdhdXRvUmVwbGFjZVN2ZyddLCBbJ2RhdGEtYXV0by1hZGQtY3NzJywgJ2F1dG9BZGRDc3MnXSwgWydkYXRhLWF1dG8tYTExeScsICdhdXRvQTExeSddLCBbJ2RhdGEtc2VhcmNoLXBzZXVkby1lbGVtZW50cycsICdzZWFyY2hQc2V1ZG9FbGVtZW50cyddLCBbJ2RhdGEtb2JzZXJ2ZS1tdXRhdGlvbnMnLCAnb2JzZXJ2ZU11dGF0aW9ucyddLCBbJ2RhdGEtbXV0YXRlLWFwcHJvYWNoJywgJ211dGF0ZUFwcHJvYWNoJ10sIFsnZGF0YS1rZWVwLW9yaWdpbmFsLXNvdXJjZScsICdrZWVwT3JpZ2luYWxTb3VyY2UnXSwgWydkYXRhLW1lYXN1cmUtcGVyZm9ybWFuY2UnLCAnbWVhc3VyZVBlcmZvcm1hbmNlJ10sIFsnZGF0YS1zaG93LW1pc3NpbmctaWNvbnMnLCAnc2hvd01pc3NpbmdJY29ucyddXTtcbiAgYXR0cnMuZm9yRWFjaChmdW5jdGlvbiAoX3JlZikge1xuICAgIHZhciBfcmVmMiA9IF9zbGljZWRUb0FycmF5KF9yZWYsIDIpLFxuICAgICAgICBhdHRyID0gX3JlZjJbMF0sXG4gICAgICAgIGtleSA9IF9yZWYyWzFdO1xuXG4gICAgdmFyIHZhbCA9IGNvZXJjZShnZXRBdHRyQ29uZmlnKGF0dHIpKTtcblxuICAgIGlmICh2YWwgIT09IHVuZGVmaW5lZCAmJiB2YWwgIT09IG51bGwpIHtcbiAgICAgIGluaXRpYWxba2V5XSA9IHZhbDtcbiAgICB9XG4gIH0pO1xufVxuXG52YXIgX2RlZmF1bHQgPSB7XG4gIHN0eWxlRGVmYXVsdDogJ3NvbGlkJyxcbiAgZmFtaWx5RGVmYXVsdDogJ2NsYXNzaWMnLFxuICBjc3NQcmVmaXg6IERFRkFVTFRfQ1NTX1BSRUZJWCxcbiAgcmVwbGFjZW1lbnRDbGFzczogREVGQVVMVF9SRVBMQUNFTUVOVF9DTEFTUyxcbiAgYXV0b1JlcGxhY2VTdmc6IHRydWUsXG4gIGF1dG9BZGRDc3M6IHRydWUsXG4gIGF1dG9BMTF5OiB0cnVlLFxuICBzZWFyY2hQc2V1ZG9FbGVtZW50czogZmFsc2UsXG4gIG9ic2VydmVNdXRhdGlvbnM6IHRydWUsXG4gIG11dGF0ZUFwcHJvYWNoOiAnYXN5bmMnLFxuICBrZWVwT3JpZ2luYWxTb3VyY2U6IHRydWUsXG4gIG1lYXN1cmVQZXJmb3JtYW5jZTogZmFsc2UsXG4gIHNob3dNaXNzaW5nSWNvbnM6IHRydWVcbn07IC8vIGZhbWlseVByZWZpeCBpcyBkZXByZWNhdGVkIGJ1dCB3ZSBtdXN0IHN0aWxsIHN1cHBvcnQgaXQgaWYgcHJlc2VudFxuXG5pZiAoaW5pdGlhbC5mYW1pbHlQcmVmaXgpIHtcbiAgaW5pdGlhbC5jc3NQcmVmaXggPSBpbml0aWFsLmZhbWlseVByZWZpeDtcbn1cblxudmFyIF9jb25maWcgPSBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgX2RlZmF1bHQpLCBpbml0aWFsKTtcblxuaWYgKCFfY29uZmlnLmF1dG9SZXBsYWNlU3ZnKSBfY29uZmlnLm9ic2VydmVNdXRhdGlvbnMgPSBmYWxzZTtcbnZhciBjb25maWcgPSB7fTtcbk9iamVjdC5rZXlzKF9kZWZhdWx0KS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbmZpZywga2V5LCB7XG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldCh2YWwpIHtcbiAgICAgIF9jb25maWdba2V5XSA9IHZhbDtcblxuICAgICAgX29uQ2hhbmdlQ2IuZm9yRWFjaChmdW5jdGlvbiAoY2IpIHtcbiAgICAgICAgcmV0dXJuIGNiKGNvbmZpZyk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIF9jb25maWdba2V5XTtcbiAgICB9XG4gIH0pO1xufSk7IC8vIGZhbWlseVByZWZpeCBpcyBkZXByZWNhdGVkIGFzIG9mIDYuMi4wIGFuZCBzaG91bGQgYmUgcmVtb3ZlZCBpbiA3LjAuMFxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoY29uZmlnLCAnZmFtaWx5UHJlZml4Jywge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBzZXQ6IGZ1bmN0aW9uIHNldCh2YWwpIHtcbiAgICBfY29uZmlnLmNzc1ByZWZpeCA9IHZhbDtcblxuICAgIF9vbkNoYW5nZUNiLmZvckVhY2goZnVuY3Rpb24gKGNiKSB7XG4gICAgICByZXR1cm4gY2IoY29uZmlnKTtcbiAgICB9KTtcbiAgfSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9jb25maWcuY3NzUHJlZml4O1xuICB9XG59KTtcbldJTkRPVy5Gb250QXdlc29tZUNvbmZpZyA9IGNvbmZpZztcbnZhciBfb25DaGFuZ2VDYiA9IFtdO1xuZnVuY3Rpb24gb25DaGFuZ2UoY2IpIHtcbiAgX29uQ2hhbmdlQ2IucHVzaChjYik7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBfb25DaGFuZ2VDYi5zcGxpY2UoX29uQ2hhbmdlQ2IuaW5kZXhPZihjYiksIDEpO1xuICB9O1xufVxuXG52YXIgZCA9IFVOSVRTX0lOX0dSSUQ7XG52YXIgbWVhbmluZ2xlc3NUcmFuc2Zvcm0gPSB7XG4gIHNpemU6IDE2LFxuICB4OiAwLFxuICB5OiAwLFxuICByb3RhdGU6IDAsXG4gIGZsaXBYOiBmYWxzZSxcbiAgZmxpcFk6IGZhbHNlXG59O1xuZnVuY3Rpb24gaW5zZXJ0Q3NzKGNzcykge1xuICBpZiAoIWNzcyB8fCAhSVNfRE9NKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHN0eWxlID0gRE9DVU1FTlQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgc3R5bGUuc2V0QXR0cmlidXRlKCd0eXBlJywgJ3RleHQvY3NzJyk7XG4gIHN0eWxlLmlubmVySFRNTCA9IGNzcztcbiAgdmFyIGhlYWRDaGlsZHJlbiA9IERPQ1VNRU5ULmhlYWQuY2hpbGROb2RlcztcbiAgdmFyIGJlZm9yZUNoaWxkID0gbnVsbDtcblxuICBmb3IgKHZhciBpID0gaGVhZENoaWxkcmVuLmxlbmd0aCAtIDE7IGkgPiAtMTsgaS0tKSB7XG4gICAgdmFyIGNoaWxkID0gaGVhZENoaWxkcmVuW2ldO1xuICAgIHZhciB0YWdOYW1lID0gKGNoaWxkLnRhZ05hbWUgfHwgJycpLnRvVXBwZXJDYXNlKCk7XG5cbiAgICBpZiAoWydTVFlMRScsICdMSU5LJ10uaW5kZXhPZih0YWdOYW1lKSA+IC0xKSB7XG4gICAgICBiZWZvcmVDaGlsZCA9IGNoaWxkO1xuICAgIH1cbiAgfVxuXG4gIERPQ1VNRU5ULmhlYWQuaW5zZXJ0QmVmb3JlKHN0eWxlLCBiZWZvcmVDaGlsZCk7XG4gIHJldHVybiBjc3M7XG59XG52YXIgaWRQb29sID0gJzAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJztcbmZ1bmN0aW9uIG5leHRVbmlxdWVJZCgpIHtcbiAgdmFyIHNpemUgPSAxMjtcbiAgdmFyIGlkID0gJyc7XG5cbiAgd2hpbGUgKHNpemUtLSA+IDApIHtcbiAgICBpZCArPSBpZFBvb2xbTWF0aC5yYW5kb20oKSAqIDYyIHwgMF07XG4gIH1cblxuICByZXR1cm4gaWQ7XG59XG5mdW5jdGlvbiB0b0FycmF5KG9iaikge1xuICB2YXIgYXJyYXkgPSBbXTtcblxuICBmb3IgKHZhciBpID0gKG9iaiB8fCBbXSkubGVuZ3RoID4+PiAwOyBpLS07KSB7XG4gICAgYXJyYXlbaV0gPSBvYmpbaV07XG4gIH1cblxuICByZXR1cm4gYXJyYXk7XG59XG5mdW5jdGlvbiBjbGFzc0FycmF5KG5vZGUpIHtcbiAgaWYgKG5vZGUuY2xhc3NMaXN0KSB7XG4gICAgcmV0dXJuIHRvQXJyYXkobm9kZS5jbGFzc0xpc3QpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiAobm9kZS5nZXRBdHRyaWJ1dGUoJ2NsYXNzJykgfHwgJycpLnNwbGl0KCcgJykuZmlsdGVyKGZ1bmN0aW9uIChpKSB7XG4gICAgICByZXR1cm4gaTtcbiAgICB9KTtcbiAgfVxufVxuZnVuY3Rpb24gaHRtbEVzY2FwZShzdHIpIHtcbiAgcmV0dXJuIFwiXCIuY29uY2F0KHN0cikucmVwbGFjZSgvJi9nLCAnJmFtcDsnKS5yZXBsYWNlKC9cIi9nLCAnJnF1b3Q7JykucmVwbGFjZSgvJy9nLCAnJiMzOTsnKS5yZXBsYWNlKC88L2csICcmbHQ7JykucmVwbGFjZSgvPi9nLCAnJmd0OycpO1xufVxuZnVuY3Rpb24gam9pbkF0dHJpYnV0ZXMoYXR0cmlidXRlcykge1xuICByZXR1cm4gT2JqZWN0LmtleXMoYXR0cmlidXRlcyB8fCB7fSkucmVkdWNlKGZ1bmN0aW9uIChhY2MsIGF0dHJpYnV0ZU5hbWUpIHtcbiAgICByZXR1cm4gYWNjICsgXCJcIi5jb25jYXQoYXR0cmlidXRlTmFtZSwgXCI9XFxcIlwiKS5jb25jYXQoaHRtbEVzY2FwZShhdHRyaWJ1dGVzW2F0dHJpYnV0ZU5hbWVdKSwgXCJcXFwiIFwiKTtcbiAgfSwgJycpLnRyaW0oKTtcbn1cbmZ1bmN0aW9uIGpvaW5TdHlsZXMoc3R5bGVzKSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhzdHlsZXMgfHwge30pLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBzdHlsZU5hbWUpIHtcbiAgICByZXR1cm4gYWNjICsgXCJcIi5jb25jYXQoc3R5bGVOYW1lLCBcIjogXCIpLmNvbmNhdChzdHlsZXNbc3R5bGVOYW1lXS50cmltKCksIFwiO1wiKTtcbiAgfSwgJycpO1xufVxuZnVuY3Rpb24gdHJhbnNmb3JtSXNNZWFuaW5nZnVsKHRyYW5zZm9ybSkge1xuICByZXR1cm4gdHJhbnNmb3JtLnNpemUgIT09IG1lYW5pbmdsZXNzVHJhbnNmb3JtLnNpemUgfHwgdHJhbnNmb3JtLnggIT09IG1lYW5pbmdsZXNzVHJhbnNmb3JtLnggfHwgdHJhbnNmb3JtLnkgIT09IG1lYW5pbmdsZXNzVHJhbnNmb3JtLnkgfHwgdHJhbnNmb3JtLnJvdGF0ZSAhPT0gbWVhbmluZ2xlc3NUcmFuc2Zvcm0ucm90YXRlIHx8IHRyYW5zZm9ybS5mbGlwWCB8fCB0cmFuc2Zvcm0uZmxpcFk7XG59XG5mdW5jdGlvbiB0cmFuc2Zvcm1Gb3JTdmcoX3JlZikge1xuICB2YXIgdHJhbnNmb3JtID0gX3JlZi50cmFuc2Zvcm0sXG4gICAgICBjb250YWluZXJXaWR0aCA9IF9yZWYuY29udGFpbmVyV2lkdGgsXG4gICAgICBpY29uV2lkdGggPSBfcmVmLmljb25XaWR0aDtcbiAgdmFyIG91dGVyID0ge1xuICAgIHRyYW5zZm9ybTogXCJ0cmFuc2xhdGUoXCIuY29uY2F0KGNvbnRhaW5lcldpZHRoIC8gMiwgXCIgMjU2KVwiKVxuICB9O1xuICB2YXIgaW5uZXJUcmFuc2xhdGUgPSBcInRyYW5zbGF0ZShcIi5jb25jYXQodHJhbnNmb3JtLnggKiAzMiwgXCIsIFwiKS5jb25jYXQodHJhbnNmb3JtLnkgKiAzMiwgXCIpIFwiKTtcbiAgdmFyIGlubmVyU2NhbGUgPSBcInNjYWxlKFwiLmNvbmNhdCh0cmFuc2Zvcm0uc2l6ZSAvIDE2ICogKHRyYW5zZm9ybS5mbGlwWCA/IC0xIDogMSksIFwiLCBcIikuY29uY2F0KHRyYW5zZm9ybS5zaXplIC8gMTYgKiAodHJhbnNmb3JtLmZsaXBZID8gLTEgOiAxKSwgXCIpIFwiKTtcbiAgdmFyIGlubmVyUm90YXRlID0gXCJyb3RhdGUoXCIuY29uY2F0KHRyYW5zZm9ybS5yb3RhdGUsIFwiIDAgMClcIik7XG4gIHZhciBpbm5lciA9IHtcbiAgICB0cmFuc2Zvcm06IFwiXCIuY29uY2F0KGlubmVyVHJhbnNsYXRlLCBcIiBcIikuY29uY2F0KGlubmVyU2NhbGUsIFwiIFwiKS5jb25jYXQoaW5uZXJSb3RhdGUpXG4gIH07XG4gIHZhciBwYXRoID0ge1xuICAgIHRyYW5zZm9ybTogXCJ0cmFuc2xhdGUoXCIuY29uY2F0KGljb25XaWR0aCAvIDIgKiAtMSwgXCIgLTI1NilcIilcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBvdXRlcjogb3V0ZXIsXG4gICAgaW5uZXI6IGlubmVyLFxuICAgIHBhdGg6IHBhdGhcbiAgfTtcbn1cbmZ1bmN0aW9uIHRyYW5zZm9ybUZvckNzcyhfcmVmMikge1xuICB2YXIgdHJhbnNmb3JtID0gX3JlZjIudHJhbnNmb3JtLFxuICAgICAgX3JlZjIkd2lkdGggPSBfcmVmMi53aWR0aCxcbiAgICAgIHdpZHRoID0gX3JlZjIkd2lkdGggPT09IHZvaWQgMCA/IFVOSVRTX0lOX0dSSUQgOiBfcmVmMiR3aWR0aCxcbiAgICAgIF9yZWYyJGhlaWdodCA9IF9yZWYyLmhlaWdodCxcbiAgICAgIGhlaWdodCA9IF9yZWYyJGhlaWdodCA9PT0gdm9pZCAwID8gVU5JVFNfSU5fR1JJRCA6IF9yZWYyJGhlaWdodCxcbiAgICAgIF9yZWYyJHN0YXJ0Q2VudGVyZWQgPSBfcmVmMi5zdGFydENlbnRlcmVkLFxuICAgICAgc3RhcnRDZW50ZXJlZCA9IF9yZWYyJHN0YXJ0Q2VudGVyZWQgPT09IHZvaWQgMCA/IGZhbHNlIDogX3JlZjIkc3RhcnRDZW50ZXJlZDtcbiAgdmFyIHZhbCA9ICcnO1xuXG4gIGlmIChzdGFydENlbnRlcmVkICYmIElTX0lFKSB7XG4gICAgdmFsICs9IFwidHJhbnNsYXRlKFwiLmNvbmNhdCh0cmFuc2Zvcm0ueCAvIGQgLSB3aWR0aCAvIDIsIFwiZW0sIFwiKS5jb25jYXQodHJhbnNmb3JtLnkgLyBkIC0gaGVpZ2h0IC8gMiwgXCJlbSkgXCIpO1xuICB9IGVsc2UgaWYgKHN0YXJ0Q2VudGVyZWQpIHtcbiAgICB2YWwgKz0gXCJ0cmFuc2xhdGUoY2FsYygtNTAlICsgXCIuY29uY2F0KHRyYW5zZm9ybS54IC8gZCwgXCJlbSksIGNhbGMoLTUwJSArIFwiKS5jb25jYXQodHJhbnNmb3JtLnkgLyBkLCBcImVtKSkgXCIpO1xuICB9IGVsc2Uge1xuICAgIHZhbCArPSBcInRyYW5zbGF0ZShcIi5jb25jYXQodHJhbnNmb3JtLnggLyBkLCBcImVtLCBcIikuY29uY2F0KHRyYW5zZm9ybS55IC8gZCwgXCJlbSkgXCIpO1xuICB9XG5cbiAgdmFsICs9IFwic2NhbGUoXCIuY29uY2F0KHRyYW5zZm9ybS5zaXplIC8gZCAqICh0cmFuc2Zvcm0uZmxpcFggPyAtMSA6IDEpLCBcIiwgXCIpLmNvbmNhdCh0cmFuc2Zvcm0uc2l6ZSAvIGQgKiAodHJhbnNmb3JtLmZsaXBZID8gLTEgOiAxKSwgXCIpIFwiKTtcbiAgdmFsICs9IFwicm90YXRlKFwiLmNvbmNhdCh0cmFuc2Zvcm0ucm90YXRlLCBcImRlZykgXCIpO1xuICByZXR1cm4gdmFsO1xufVxuXG52YXIgYmFzZVN0eWxlcyA9IFwiOnJvb3QsIDpob3N0IHtcXG4gIC0tZmEtZm9udC1zb2xpZDogbm9ybWFsIDkwMCAxZW0vMSBcXFwiRm9udCBBd2Vzb21lIDYgU29saWRcXFwiO1xcbiAgLS1mYS1mb250LXJlZ3VsYXI6IG5vcm1hbCA0MDAgMWVtLzEgXFxcIkZvbnQgQXdlc29tZSA2IFJlZ3VsYXJcXFwiO1xcbiAgLS1mYS1mb250LWxpZ2h0OiBub3JtYWwgMzAwIDFlbS8xIFxcXCJGb250IEF3ZXNvbWUgNiBMaWdodFxcXCI7XFxuICAtLWZhLWZvbnQtdGhpbjogbm9ybWFsIDEwMCAxZW0vMSBcXFwiRm9udCBBd2Vzb21lIDYgVGhpblxcXCI7XFxuICAtLWZhLWZvbnQtZHVvdG9uZTogbm9ybWFsIDkwMCAxZW0vMSBcXFwiRm9udCBBd2Vzb21lIDYgRHVvdG9uZVxcXCI7XFxuICAtLWZhLWZvbnQtc2hhcnAtc29saWQ6IG5vcm1hbCA5MDAgMWVtLzEgXFxcIkZvbnQgQXdlc29tZSA2IFNoYXJwXFxcIjtcXG4gIC0tZmEtZm9udC1zaGFycC1yZWd1bGFyOiBub3JtYWwgNDAwIDFlbS8xIFxcXCJGb250IEF3ZXNvbWUgNiBTaGFycFxcXCI7XFxuICAtLWZhLWZvbnQtc2hhcnAtbGlnaHQ6IG5vcm1hbCAzMDAgMWVtLzEgXFxcIkZvbnQgQXdlc29tZSA2IFNoYXJwXFxcIjtcXG4gIC0tZmEtZm9udC1zaGFycC10aGluOiBub3JtYWwgMTAwIDFlbS8xIFxcXCJGb250IEF3ZXNvbWUgNiBTaGFycFxcXCI7XFxuICAtLWZhLWZvbnQtYnJhbmRzOiBub3JtYWwgNDAwIDFlbS8xIFxcXCJGb250IEF3ZXNvbWUgNiBCcmFuZHNcXFwiO1xcbn1cXG5cXG5zdmc6bm90KDpyb290KS5zdmctaW5saW5lLS1mYSwgc3ZnOm5vdCg6aG9zdCkuc3ZnLWlubGluZS0tZmEge1xcbiAgb3ZlcmZsb3c6IHZpc2libGU7XFxuICBib3gtc2l6aW5nOiBjb250ZW50LWJveDtcXG59XFxuXFxuLnN2Zy1pbmxpbmUtLWZhIHtcXG4gIGRpc3BsYXk6IHZhcigtLWZhLWRpc3BsYXksIGlubGluZS1ibG9jayk7XFxuICBoZWlnaHQ6IDFlbTtcXG4gIG92ZXJmbG93OiB2aXNpYmxlO1xcbiAgdmVydGljYWwtYWxpZ246IC0wLjEyNWVtO1xcbn1cXG4uc3ZnLWlubGluZS0tZmEuZmEtMnhzIHtcXG4gIHZlcnRpY2FsLWFsaWduOiAwLjFlbTtcXG59XFxuLnN2Zy1pbmxpbmUtLWZhLmZhLXhzIHtcXG4gIHZlcnRpY2FsLWFsaWduOiAwZW07XFxufVxcbi5zdmctaW5saW5lLS1mYS5mYS1zbSB7XFxuICB2ZXJ0aWNhbC1hbGlnbjogLTAuMDcxNDI4NTcwNWVtO1xcbn1cXG4uc3ZnLWlubGluZS0tZmEuZmEtbGcge1xcbiAgdmVydGljYWwtYWxpZ246IC0wLjJlbTtcXG59XFxuLnN2Zy1pbmxpbmUtLWZhLmZhLXhsIHtcXG4gIHZlcnRpY2FsLWFsaWduOiAtMC4yNWVtO1xcbn1cXG4uc3ZnLWlubGluZS0tZmEuZmEtMnhsIHtcXG4gIHZlcnRpY2FsLWFsaWduOiAtMC4zMTI1ZW07XFxufVxcbi5zdmctaW5saW5lLS1mYS5mYS1wdWxsLWxlZnQge1xcbiAgbWFyZ2luLXJpZ2h0OiB2YXIoLS1mYS1wdWxsLW1hcmdpbiwgMC4zZW0pO1xcbiAgd2lkdGg6IGF1dG87XFxufVxcbi5zdmctaW5saW5lLS1mYS5mYS1wdWxsLXJpZ2h0IHtcXG4gIG1hcmdpbi1sZWZ0OiB2YXIoLS1mYS1wdWxsLW1hcmdpbiwgMC4zZW0pO1xcbiAgd2lkdGg6IGF1dG87XFxufVxcbi5zdmctaW5saW5lLS1mYS5mYS1saSB7XFxuICB3aWR0aDogdmFyKC0tZmEtbGktd2lkdGgsIDJlbSk7XFxuICB0b3A6IDAuMjVlbTtcXG59XFxuLnN2Zy1pbmxpbmUtLWZhLmZhLWZ3IHtcXG4gIHdpZHRoOiB2YXIoLS1mYS1mdy13aWR0aCwgMS4yNWVtKTtcXG59XFxuXFxuLmZhLWxheWVycyBzdmcuc3ZnLWlubGluZS0tZmEge1xcbiAgYm90dG9tOiAwO1xcbiAgbGVmdDogMDtcXG4gIG1hcmdpbjogYXV0bztcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIHJpZ2h0OiAwO1xcbiAgdG9wOiAwO1xcbn1cXG5cXG4uZmEtbGF5ZXJzLWNvdW50ZXIsIC5mYS1sYXllcnMtdGV4dCB7XFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxufVxcblxcbi5mYS1sYXllcnMge1xcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgaGVpZ2h0OiAxZW07XFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICB2ZXJ0aWNhbC1hbGlnbjogLTAuMTI1ZW07XFxuICB3aWR0aDogMWVtO1xcbn1cXG4uZmEtbGF5ZXJzIHN2Zy5zdmctaW5saW5lLS1mYSB7XFxuICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IGNlbnRlciBjZW50ZXI7XFxuICAgICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IGNlbnRlciBjZW50ZXI7XFxufVxcblxcbi5mYS1sYXllcnMtdGV4dCB7XFxuICBsZWZ0OiA1MCU7XFxuICB0b3A6IDUwJTtcXG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XFxuICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xcbiAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiBjZW50ZXIgY2VudGVyO1xcbiAgICAgICAgICB0cmFuc2Zvcm0tb3JpZ2luOiBjZW50ZXIgY2VudGVyO1xcbn1cXG5cXG4uZmEtbGF5ZXJzLWNvdW50ZXIge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmEtY291bnRlci1iYWNrZ3JvdW5kLWNvbG9yLCAjZmYyNTNhKTtcXG4gIGJvcmRlci1yYWRpdXM6IHZhcigtLWZhLWNvdW50ZXItYm9yZGVyLXJhZGl1cywgMWVtKTtcXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxuICBjb2xvcjogdmFyKC0tZmEtaW52ZXJzZSwgI2ZmZik7XFxuICBsaW5lLWhlaWdodDogdmFyKC0tZmEtY291bnRlci1saW5lLWhlaWdodCwgMSk7XFxuICBtYXgtd2lkdGg6IHZhcigtLWZhLWNvdW50ZXItbWF4LXdpZHRoLCA1ZW0pO1xcbiAgbWluLXdpZHRoOiB2YXIoLS1mYS1jb3VudGVyLW1pbi13aWR0aCwgMS41ZW0pO1xcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcXG4gIHBhZGRpbmc6IHZhcigtLWZhLWNvdW50ZXItcGFkZGluZywgMC4yNWVtIDAuNWVtKTtcXG4gIHJpZ2h0OiB2YXIoLS1mYS1yaWdodCwgMCk7XFxuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcXG4gIHRvcDogdmFyKC0tZmEtdG9wLCAwKTtcXG4gIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSh2YXIoLS1mYS1jb3VudGVyLXNjYWxlLCAwLjI1KSk7XFxuICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUodmFyKC0tZmEtY291bnRlci1zY2FsZSwgMC4yNSkpO1xcbiAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiB0b3AgcmlnaHQ7XFxuICAgICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IHRvcCByaWdodDtcXG59XFxuXFxuLmZhLWxheWVycy1ib3R0b20tcmlnaHQge1xcbiAgYm90dG9tOiB2YXIoLS1mYS1ib3R0b20sIDApO1xcbiAgcmlnaHQ6IHZhcigtLWZhLXJpZ2h0LCAwKTtcXG4gIHRvcDogYXV0bztcXG4gIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSh2YXIoLS1mYS1sYXllcnMtc2NhbGUsIDAuMjUpKTtcXG4gICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSh2YXIoLS1mYS1sYXllcnMtc2NhbGUsIDAuMjUpKTtcXG4gIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogYm90dG9tIHJpZ2h0O1xcbiAgICAgICAgICB0cmFuc2Zvcm0tb3JpZ2luOiBib3R0b20gcmlnaHQ7XFxufVxcblxcbi5mYS1sYXllcnMtYm90dG9tLWxlZnQge1xcbiAgYm90dG9tOiB2YXIoLS1mYS1ib3R0b20sIDApO1xcbiAgbGVmdDogdmFyKC0tZmEtbGVmdCwgMCk7XFxuICByaWdodDogYXV0bztcXG4gIHRvcDogYXV0bztcXG4gIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSh2YXIoLS1mYS1sYXllcnMtc2NhbGUsIDAuMjUpKTtcXG4gICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSh2YXIoLS1mYS1sYXllcnMtc2NhbGUsIDAuMjUpKTtcXG4gIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogYm90dG9tIGxlZnQ7XFxuICAgICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IGJvdHRvbSBsZWZ0O1xcbn1cXG5cXG4uZmEtbGF5ZXJzLXRvcC1yaWdodCB7XFxuICB0b3A6IHZhcigtLWZhLXRvcCwgMCk7XFxuICByaWdodDogdmFyKC0tZmEtcmlnaHQsIDApO1xcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKHZhcigtLWZhLWxheWVycy1zY2FsZSwgMC4yNSkpO1xcbiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKHZhcigtLWZhLWxheWVycy1zY2FsZSwgMC4yNSkpO1xcbiAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiB0b3AgcmlnaHQ7XFxuICAgICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IHRvcCByaWdodDtcXG59XFxuXFxuLmZhLWxheWVycy10b3AtbGVmdCB7XFxuICBsZWZ0OiB2YXIoLS1mYS1sZWZ0LCAwKTtcXG4gIHJpZ2h0OiBhdXRvO1xcbiAgdG9wOiB2YXIoLS1mYS10b3AsIDApO1xcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKHZhcigtLWZhLWxheWVycy1zY2FsZSwgMC4yNSkpO1xcbiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKHZhcigtLWZhLWxheWVycy1zY2FsZSwgMC4yNSkpO1xcbiAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiB0b3AgbGVmdDtcXG4gICAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogdG9wIGxlZnQ7XFxufVxcblxcbi5mYS0xeCB7XFxuICBmb250LXNpemU6IDFlbTtcXG59XFxuXFxuLmZhLTJ4IHtcXG4gIGZvbnQtc2l6ZTogMmVtO1xcbn1cXG5cXG4uZmEtM3gge1xcbiAgZm9udC1zaXplOiAzZW07XFxufVxcblxcbi5mYS00eCB7XFxuICBmb250LXNpemU6IDRlbTtcXG59XFxuXFxuLmZhLTV4IHtcXG4gIGZvbnQtc2l6ZTogNWVtO1xcbn1cXG5cXG4uZmEtNngge1xcbiAgZm9udC1zaXplOiA2ZW07XFxufVxcblxcbi5mYS03eCB7XFxuICBmb250LXNpemU6IDdlbTtcXG59XFxuXFxuLmZhLTh4IHtcXG4gIGZvbnQtc2l6ZTogOGVtO1xcbn1cXG5cXG4uZmEtOXgge1xcbiAgZm9udC1zaXplOiA5ZW07XFxufVxcblxcbi5mYS0xMHgge1xcbiAgZm9udC1zaXplOiAxMGVtO1xcbn1cXG5cXG4uZmEtMnhzIHtcXG4gIGZvbnQtc2l6ZTogMC42MjVlbTtcXG4gIGxpbmUtaGVpZ2h0OiAwLjFlbTtcXG4gIHZlcnRpY2FsLWFsaWduOiAwLjIyNWVtO1xcbn1cXG5cXG4uZmEteHMge1xcbiAgZm9udC1zaXplOiAwLjc1ZW07XFxuICBsaW5lLWhlaWdodDogMC4wODMzMzMzMzM3ZW07XFxuICB2ZXJ0aWNhbC1hbGlnbjogMC4xMjVlbTtcXG59XFxuXFxuLmZhLXNtIHtcXG4gIGZvbnQtc2l6ZTogMC44NzVlbTtcXG4gIGxpbmUtaGVpZ2h0OiAwLjA3MTQyODU3MThlbTtcXG4gIHZlcnRpY2FsLWFsaWduOiAwLjA1MzU3MTQyOTVlbTtcXG59XFxuXFxuLmZhLWxnIHtcXG4gIGZvbnQtc2l6ZTogMS4yNWVtO1xcbiAgbGluZS1oZWlnaHQ6IDAuMDVlbTtcXG4gIHZlcnRpY2FsLWFsaWduOiAtMC4wNzVlbTtcXG59XFxuXFxuLmZhLXhsIHtcXG4gIGZvbnQtc2l6ZTogMS41ZW07XFxuICBsaW5lLWhlaWdodDogMC4wNDE2NjY2NjgyZW07XFxuICB2ZXJ0aWNhbC1hbGlnbjogLTAuMTI1ZW07XFxufVxcblxcbi5mYS0yeGwge1xcbiAgZm9udC1zaXplOiAyZW07XFxuICBsaW5lLWhlaWdodDogMC4wMzEyNWVtO1xcbiAgdmVydGljYWwtYWxpZ246IC0wLjE4NzVlbTtcXG59XFxuXFxuLmZhLWZ3IHtcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gIHdpZHRoOiAxLjI1ZW07XFxufVxcblxcbi5mYS11bCB7XFxuICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7XFxuICBtYXJnaW4tbGVmdDogdmFyKC0tZmEtbGktbWFyZ2luLCAyLjVlbSk7XFxuICBwYWRkaW5nLWxlZnQ6IDA7XFxufVxcbi5mYS11bCA+IGxpIHtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG59XFxuXFxuLmZhLWxpIHtcXG4gIGxlZnQ6IGNhbGModmFyKC0tZmEtbGktd2lkdGgsIDJlbSkgKiAtMSk7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICB3aWR0aDogdmFyKC0tZmEtbGktd2lkdGgsIDJlbSk7XFxuICBsaW5lLWhlaWdodDogaW5oZXJpdDtcXG59XFxuXFxuLmZhLWJvcmRlciB7XFxuICBib3JkZXItY29sb3I6IHZhcigtLWZhLWJvcmRlci1jb2xvciwgI2VlZSk7XFxuICBib3JkZXItcmFkaXVzOiB2YXIoLS1mYS1ib3JkZXItcmFkaXVzLCAwLjFlbSk7XFxuICBib3JkZXItc3R5bGU6IHZhcigtLWZhLWJvcmRlci1zdHlsZSwgc29saWQpO1xcbiAgYm9yZGVyLXdpZHRoOiB2YXIoLS1mYS1ib3JkZXItd2lkdGgsIDAuMDhlbSk7XFxuICBwYWRkaW5nOiB2YXIoLS1mYS1ib3JkZXItcGFkZGluZywgMC4yZW0gMC4yNWVtIDAuMTVlbSk7XFxufVxcblxcbi5mYS1wdWxsLWxlZnQge1xcbiAgZmxvYXQ6IGxlZnQ7XFxuICBtYXJnaW4tcmlnaHQ6IHZhcigtLWZhLXB1bGwtbWFyZ2luLCAwLjNlbSk7XFxufVxcblxcbi5mYS1wdWxsLXJpZ2h0IHtcXG4gIGZsb2F0OiByaWdodDtcXG4gIG1hcmdpbi1sZWZ0OiB2YXIoLS1mYS1wdWxsLW1hcmdpbiwgMC4zZW0pO1xcbn1cXG5cXG4uZmEtYmVhdCB7XFxuICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBmYS1iZWF0O1xcbiAgICAgICAgICBhbmltYXRpb24tbmFtZTogZmEtYmVhdDtcXG4gIC13ZWJraXQtYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1mYS1hbmltYXRpb24tZGVsYXksIDBzKTtcXG4gICAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1mYS1hbmltYXRpb24tZGVsYXksIDBzKTtcXG4gIC13ZWJraXQtYW5pbWF0aW9uLWRpcmVjdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWRpcmVjdGlvbiwgbm9ybWFsKTtcXG4gICAgICAgICAgYW5pbWF0aW9uLWRpcmVjdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWRpcmVjdGlvbiwgbm9ybWFsKTtcXG4gIC13ZWJraXQtYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZHVyYXRpb24sIDFzKTtcXG4gICAgICAgICAgYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZHVyYXRpb24sIDFzKTtcXG4gIC13ZWJraXQtYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogdmFyKC0tZmEtYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudCwgaW5maW5pdGUpO1xcbiAgICAgICAgICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiB2YXIoLS1mYS1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50LCBpbmZpbml0ZSk7XFxuICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi10aW1pbmcsIGVhc2UtaW4tb3V0KTtcXG4gICAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLXRpbWluZywgZWFzZS1pbi1vdXQpO1xcbn1cXG5cXG4uZmEtYm91bmNlIHtcXG4gIC13ZWJraXQtYW5pbWF0aW9uLW5hbWU6IGZhLWJvdW5jZTtcXG4gICAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGZhLWJvdW5jZTtcXG4gIC13ZWJraXQtYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1mYS1hbmltYXRpb24tZGVsYXksIDBzKTtcXG4gICAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1mYS1hbmltYXRpb24tZGVsYXksIDBzKTtcXG4gIC13ZWJraXQtYW5pbWF0aW9uLWRpcmVjdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWRpcmVjdGlvbiwgbm9ybWFsKTtcXG4gICAgICAgICAgYW5pbWF0aW9uLWRpcmVjdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWRpcmVjdGlvbiwgbm9ybWFsKTtcXG4gIC13ZWJraXQtYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZHVyYXRpb24sIDFzKTtcXG4gICAgICAgICAgYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZHVyYXRpb24sIDFzKTtcXG4gIC13ZWJraXQtYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogdmFyKC0tZmEtYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudCwgaW5maW5pdGUpO1xcbiAgICAgICAgICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiB2YXIoLS1mYS1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50LCBpbmZpbml0ZSk7XFxuICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi10aW1pbmcsIGN1YmljLWJlemllcigwLjI4LCAwLjg0LCAwLjQyLCAxKSk7XFxuICAgICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi10aW1pbmcsIGN1YmljLWJlemllcigwLjI4LCAwLjg0LCAwLjQyLCAxKSk7XFxufVxcblxcbi5mYS1mYWRlIHtcXG4gIC13ZWJraXQtYW5pbWF0aW9uLW5hbWU6IGZhLWZhZGU7XFxuICAgICAgICAgIGFuaW1hdGlvbi1uYW1lOiBmYS1mYWRlO1xcbiAgLXdlYmtpdC1hbmltYXRpb24tZGVsYXk6IHZhcigtLWZhLWFuaW1hdGlvbi1kZWxheSwgMHMpO1xcbiAgICAgICAgICBhbmltYXRpb24tZGVsYXk6IHZhcigtLWZhLWFuaW1hdGlvbi1kZWxheSwgMHMpO1xcbiAgLXdlYmtpdC1hbmltYXRpb24tZGlyZWN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZGlyZWN0aW9uLCBub3JtYWwpO1xcbiAgICAgICAgICBhbmltYXRpb24tZGlyZWN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZGlyZWN0aW9uLCBub3JtYWwpO1xcbiAgLXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246IHZhcigtLWZhLWFuaW1hdGlvbi1kdXJhdGlvbiwgMXMpO1xcbiAgICAgICAgICBhbmltYXRpb24tZHVyYXRpb246IHZhcigtLWZhLWFuaW1hdGlvbi1kdXJhdGlvbiwgMXMpO1xcbiAgLXdlYmtpdC1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiB2YXIoLS1mYS1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50LCBpbmZpbml0ZSk7XFxuICAgICAgICAgIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IHZhcigtLWZhLWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQsIGluZmluaXRlKTtcXG4gIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLXRpbWluZywgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC42LCAxKSk7XFxuICAgICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi10aW1pbmcsIGN1YmljLWJlemllcigwLjQsIDAsIDAuNiwgMSkpO1xcbn1cXG5cXG4uZmEtYmVhdC1mYWRlIHtcXG4gIC13ZWJraXQtYW5pbWF0aW9uLW5hbWU6IGZhLWJlYXQtZmFkZTtcXG4gICAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGZhLWJlYXQtZmFkZTtcXG4gIC13ZWJraXQtYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1mYS1hbmltYXRpb24tZGVsYXksIDBzKTtcXG4gICAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1mYS1hbmltYXRpb24tZGVsYXksIDBzKTtcXG4gIC13ZWJraXQtYW5pbWF0aW9uLWRpcmVjdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWRpcmVjdGlvbiwgbm9ybWFsKTtcXG4gICAgICAgICAgYW5pbWF0aW9uLWRpcmVjdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWRpcmVjdGlvbiwgbm9ybWFsKTtcXG4gIC13ZWJraXQtYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZHVyYXRpb24sIDFzKTtcXG4gICAgICAgICAgYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZHVyYXRpb24sIDFzKTtcXG4gIC13ZWJraXQtYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogdmFyKC0tZmEtYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudCwgaW5maW5pdGUpO1xcbiAgICAgICAgICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiB2YXIoLS1mYS1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50LCBpbmZpbml0ZSk7XFxuICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi10aW1pbmcsIGN1YmljLWJlemllcigwLjQsIDAsIDAuNiwgMSkpO1xcbiAgICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tdGltaW5nLCBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjYsIDEpKTtcXG59XFxuXFxuLmZhLWZsaXAge1xcbiAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogZmEtZmxpcDtcXG4gICAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGZhLWZsaXA7XFxuICAtd2Via2l0LWFuaW1hdGlvbi1kZWxheTogdmFyKC0tZmEtYW5pbWF0aW9uLWRlbGF5LCAwcyk7XFxuICAgICAgICAgIGFuaW1hdGlvbi1kZWxheTogdmFyKC0tZmEtYW5pbWF0aW9uLWRlbGF5LCAwcyk7XFxuICAtd2Via2l0LWFuaW1hdGlvbi1kaXJlY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi1kaXJlY3Rpb24sIG5vcm1hbCk7XFxuICAgICAgICAgIGFuaW1hdGlvbi1kaXJlY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi1kaXJlY3Rpb24sIG5vcm1hbCk7XFxuICAtd2Via2l0LWFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWR1cmF0aW9uLCAxcyk7XFxuICAgICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWR1cmF0aW9uLCAxcyk7XFxuICAtd2Via2l0LWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IHZhcigtLWZhLWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQsIGluZmluaXRlKTtcXG4gICAgICAgICAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogdmFyKC0tZmEtYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudCwgaW5maW5pdGUpO1xcbiAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tdGltaW5nLCBlYXNlLWluLW91dCk7XFxuICAgICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi10aW1pbmcsIGVhc2UtaW4tb3V0KTtcXG59XFxuXFxuLmZhLXNoYWtlIHtcXG4gIC13ZWJraXQtYW5pbWF0aW9uLW5hbWU6IGZhLXNoYWtlO1xcbiAgICAgICAgICBhbmltYXRpb24tbmFtZTogZmEtc2hha2U7XFxuICAtd2Via2l0LWFuaW1hdGlvbi1kZWxheTogdmFyKC0tZmEtYW5pbWF0aW9uLWRlbGF5LCAwcyk7XFxuICAgICAgICAgIGFuaW1hdGlvbi1kZWxheTogdmFyKC0tZmEtYW5pbWF0aW9uLWRlbGF5LCAwcyk7XFxuICAtd2Via2l0LWFuaW1hdGlvbi1kaXJlY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi1kaXJlY3Rpb24sIG5vcm1hbCk7XFxuICAgICAgICAgIGFuaW1hdGlvbi1kaXJlY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi1kaXJlY3Rpb24sIG5vcm1hbCk7XFxuICAtd2Via2l0LWFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWR1cmF0aW9uLCAxcyk7XFxuICAgICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWR1cmF0aW9uLCAxcyk7XFxuICAtd2Via2l0LWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IHZhcigtLWZhLWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQsIGluZmluaXRlKTtcXG4gICAgICAgICAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogdmFyKC0tZmEtYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudCwgaW5maW5pdGUpO1xcbiAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tdGltaW5nLCBsaW5lYXIpO1xcbiAgICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tdGltaW5nLCBsaW5lYXIpO1xcbn1cXG5cXG4uZmEtc3BpbiB7XFxuICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBmYS1zcGluO1xcbiAgICAgICAgICBhbmltYXRpb24tbmFtZTogZmEtc3BpbjtcXG4gIC13ZWJraXQtYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1mYS1hbmltYXRpb24tZGVsYXksIDBzKTtcXG4gICAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1mYS1hbmltYXRpb24tZGVsYXksIDBzKTtcXG4gIC13ZWJraXQtYW5pbWF0aW9uLWRpcmVjdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWRpcmVjdGlvbiwgbm9ybWFsKTtcXG4gICAgICAgICAgYW5pbWF0aW9uLWRpcmVjdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWRpcmVjdGlvbiwgbm9ybWFsKTtcXG4gIC13ZWJraXQtYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZHVyYXRpb24sIDJzKTtcXG4gICAgICAgICAgYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZHVyYXRpb24sIDJzKTtcXG4gIC13ZWJraXQtYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogdmFyKC0tZmEtYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudCwgaW5maW5pdGUpO1xcbiAgICAgICAgICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiB2YXIoLS1mYS1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50LCBpbmZpbml0ZSk7XFxuICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi10aW1pbmcsIGxpbmVhcik7XFxuICAgICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi10aW1pbmcsIGxpbmVhcik7XFxufVxcblxcbi5mYS1zcGluLXJldmVyc2Uge1xcbiAgLS1mYS1hbmltYXRpb24tZGlyZWN0aW9uOiByZXZlcnNlO1xcbn1cXG5cXG4uZmEtcHVsc2UsXFxuLmZhLXNwaW4tcHVsc2Uge1xcbiAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogZmEtc3BpbjtcXG4gICAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGZhLXNwaW47XFxuICAtd2Via2l0LWFuaW1hdGlvbi1kaXJlY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi1kaXJlY3Rpb24sIG5vcm1hbCk7XFxuICAgICAgICAgIGFuaW1hdGlvbi1kaXJlY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi1kaXJlY3Rpb24sIG5vcm1hbCk7XFxuICAtd2Via2l0LWFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWR1cmF0aW9uLCAxcyk7XFxuICAgICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWR1cmF0aW9uLCAxcyk7XFxuICAtd2Via2l0LWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IHZhcigtLWZhLWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQsIGluZmluaXRlKTtcXG4gICAgICAgICAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogdmFyKC0tZmEtYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudCwgaW5maW5pdGUpO1xcbiAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tdGltaW5nLCBzdGVwcyg4KSk7XFxuICAgICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi10aW1pbmcsIHN0ZXBzKDgpKTtcXG59XFxuXFxuQG1lZGlhIChwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2UpIHtcXG4gIC5mYS1iZWF0LFxcbi5mYS1ib3VuY2UsXFxuLmZhLWZhZGUsXFxuLmZhLWJlYXQtZmFkZSxcXG4uZmEtZmxpcCxcXG4uZmEtcHVsc2UsXFxuLmZhLXNoYWtlLFxcbi5mYS1zcGluLFxcbi5mYS1zcGluLXB1bHNlIHtcXG4gICAgLXdlYmtpdC1hbmltYXRpb24tZGVsYXk6IC0xbXM7XFxuICAgICAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiAtMW1zO1xcbiAgICAtd2Via2l0LWFuaW1hdGlvbi1kdXJhdGlvbjogMW1zO1xcbiAgICAgICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogMW1zO1xcbiAgICAtd2Via2l0LWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IDE7XFxuICAgICAgICAgICAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogMTtcXG4gICAgLXdlYmtpdC10cmFuc2l0aW9uLWRlbGF5OiAwcztcXG4gICAgICAgICAgICB0cmFuc2l0aW9uLWRlbGF5OiAwcztcXG4gICAgLXdlYmtpdC10cmFuc2l0aW9uLWR1cmF0aW9uOiAwcztcXG4gICAgICAgICAgICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAwcztcXG4gIH1cXG59XFxuQC13ZWJraXQta2V5ZnJhbWVzIGZhLWJlYXQge1xcbiAgMCUsIDkwJSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxKTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xcbiAgfVxcbiAgNDUlIHtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKHZhcigtLWZhLWJlYXQtc2NhbGUsIDEuMjUpKTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKHZhcigtLWZhLWJlYXQtc2NhbGUsIDEuMjUpKTtcXG4gIH1cXG59XFxuQGtleWZyYW1lcyBmYS1iZWF0IHtcXG4gIDAlLCA5MCUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxKTtcXG4gIH1cXG4gIDQ1JSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSh2YXIoLS1mYS1iZWF0LXNjYWxlLCAxLjI1KSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSh2YXIoLS1mYS1iZWF0LXNjYWxlLCAxLjI1KSk7XFxuICB9XFxufVxcbkAtd2Via2l0LWtleWZyYW1lcyBmYS1ib3VuY2Uge1xcbiAgMCUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMSwgMSkgdHJhbnNsYXRlWSgwKTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEsIDEpIHRyYW5zbGF0ZVkoMCk7XFxuICB9XFxuICAxMCUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUodmFyKC0tZmEtYm91bmNlLXN0YXJ0LXNjYWxlLXgsIDEuMSksIHZhcigtLWZhLWJvdW5jZS1zdGFydC1zY2FsZS15LCAwLjkpKSB0cmFuc2xhdGVZKDApO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUodmFyKC0tZmEtYm91bmNlLXN0YXJ0LXNjYWxlLXgsIDEuMSksIHZhcigtLWZhLWJvdW5jZS1zdGFydC1zY2FsZS15LCAwLjkpKSB0cmFuc2xhdGVZKDApO1xcbiAgfVxcbiAgMzAlIHtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKHZhcigtLWZhLWJvdW5jZS1qdW1wLXNjYWxlLXgsIDAuOSksIHZhcigtLWZhLWJvdW5jZS1qdW1wLXNjYWxlLXksIDEuMSkpIHRyYW5zbGF0ZVkodmFyKC0tZmEtYm91bmNlLWhlaWdodCwgLTAuNWVtKSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSh2YXIoLS1mYS1ib3VuY2UtanVtcC1zY2FsZS14LCAwLjkpLCB2YXIoLS1mYS1ib3VuY2UtanVtcC1zY2FsZS15LCAxLjEpKSB0cmFuc2xhdGVZKHZhcigtLWZhLWJvdW5jZS1oZWlnaHQsIC0wLjVlbSkpO1xcbiAgfVxcbiAgNTAlIHtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKHZhcigtLWZhLWJvdW5jZS1sYW5kLXNjYWxlLXgsIDEuMDUpLCB2YXIoLS1mYS1ib3VuY2UtbGFuZC1zY2FsZS15LCAwLjk1KSkgdHJhbnNsYXRlWSgwKTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKHZhcigtLWZhLWJvdW5jZS1sYW5kLXNjYWxlLXgsIDEuMDUpLCB2YXIoLS1mYS1ib3VuY2UtbGFuZC1zY2FsZS15LCAwLjk1KSkgdHJhbnNsYXRlWSgwKTtcXG4gIH1cXG4gIDU3JSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxLCAxKSB0cmFuc2xhdGVZKHZhcigtLWZhLWJvdW5jZS1yZWJvdW5kLCAtMC4xMjVlbSkpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMSwgMSkgdHJhbnNsYXRlWSh2YXIoLS1mYS1ib3VuY2UtcmVib3VuZCwgLTAuMTI1ZW0pKTtcXG4gIH1cXG4gIDY0JSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxLCAxKSB0cmFuc2xhdGVZKDApO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMSwgMSkgdHJhbnNsYXRlWSgwKTtcXG4gIH1cXG4gIDEwMCUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMSwgMSkgdHJhbnNsYXRlWSgwKTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEsIDEpIHRyYW5zbGF0ZVkoMCk7XFxuICB9XFxufVxcbkBrZXlmcmFtZXMgZmEtYm91bmNlIHtcXG4gIDAlIHtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEsIDEpIHRyYW5zbGF0ZVkoMCk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxLCAxKSB0cmFuc2xhdGVZKDApO1xcbiAgfVxcbiAgMTAlIHtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKHZhcigtLWZhLWJvdW5jZS1zdGFydC1zY2FsZS14LCAxLjEpLCB2YXIoLS1mYS1ib3VuY2Utc3RhcnQtc2NhbGUteSwgMC45KSkgdHJhbnNsYXRlWSgwKTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKHZhcigtLWZhLWJvdW5jZS1zdGFydC1zY2FsZS14LCAxLjEpLCB2YXIoLS1mYS1ib3VuY2Utc3RhcnQtc2NhbGUteSwgMC45KSkgdHJhbnNsYXRlWSgwKTtcXG4gIH1cXG4gIDMwJSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSh2YXIoLS1mYS1ib3VuY2UtanVtcC1zY2FsZS14LCAwLjkpLCB2YXIoLS1mYS1ib3VuY2UtanVtcC1zY2FsZS15LCAxLjEpKSB0cmFuc2xhdGVZKHZhcigtLWZhLWJvdW5jZS1oZWlnaHQsIC0wLjVlbSkpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUodmFyKC0tZmEtYm91bmNlLWp1bXAtc2NhbGUteCwgMC45KSwgdmFyKC0tZmEtYm91bmNlLWp1bXAtc2NhbGUteSwgMS4xKSkgdHJhbnNsYXRlWSh2YXIoLS1mYS1ib3VuY2UtaGVpZ2h0LCAtMC41ZW0pKTtcXG4gIH1cXG4gIDUwJSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSh2YXIoLS1mYS1ib3VuY2UtbGFuZC1zY2FsZS14LCAxLjA1KSwgdmFyKC0tZmEtYm91bmNlLWxhbmQtc2NhbGUteSwgMC45NSkpIHRyYW5zbGF0ZVkoMCk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSh2YXIoLS1mYS1ib3VuY2UtbGFuZC1zY2FsZS14LCAxLjA1KSwgdmFyKC0tZmEtYm91bmNlLWxhbmQtc2NhbGUteSwgMC45NSkpIHRyYW5zbGF0ZVkoMCk7XFxuICB9XFxuICA1NyUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMSwgMSkgdHJhbnNsYXRlWSh2YXIoLS1mYS1ib3VuY2UtcmVib3VuZCwgLTAuMTI1ZW0pKTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEsIDEpIHRyYW5zbGF0ZVkodmFyKC0tZmEtYm91bmNlLXJlYm91bmQsIC0wLjEyNWVtKSk7XFxuICB9XFxuICA2NCUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMSwgMSkgdHJhbnNsYXRlWSgwKTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEsIDEpIHRyYW5zbGF0ZVkoMCk7XFxuICB9XFxuICAxMDAlIHtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEsIDEpIHRyYW5zbGF0ZVkoMCk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxLCAxKSB0cmFuc2xhdGVZKDApO1xcbiAgfVxcbn1cXG5ALXdlYmtpdC1rZXlmcmFtZXMgZmEtZmFkZSB7XFxuICA1MCUge1xcbiAgICBvcGFjaXR5OiB2YXIoLS1mYS1mYWRlLW9wYWNpdHksIDAuNCk7XFxuICB9XFxufVxcbkBrZXlmcmFtZXMgZmEtZmFkZSB7XFxuICA1MCUge1xcbiAgICBvcGFjaXR5OiB2YXIoLS1mYS1mYWRlLW9wYWNpdHksIDAuNCk7XFxuICB9XFxufVxcbkAtd2Via2l0LWtleWZyYW1lcyBmYS1iZWF0LWZhZGUge1xcbiAgMCUsIDEwMCUge1xcbiAgICBvcGFjaXR5OiB2YXIoLS1mYS1iZWF0LWZhZGUtb3BhY2l0eSwgMC40KTtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7XFxuICB9XFxuICA1MCUge1xcbiAgICBvcGFjaXR5OiAxO1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUodmFyKC0tZmEtYmVhdC1mYWRlLXNjYWxlLCAxLjEyNSkpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUodmFyKC0tZmEtYmVhdC1mYWRlLXNjYWxlLCAxLjEyNSkpO1xcbiAgfVxcbn1cXG5Aa2V5ZnJhbWVzIGZhLWJlYXQtZmFkZSB7XFxuICAwJSwgMTAwJSB7XFxuICAgIG9wYWNpdHk6IHZhcigtLWZhLWJlYXQtZmFkZS1vcGFjaXR5LCAwLjQpO1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxKTtcXG4gIH1cXG4gIDUwJSB7XFxuICAgIG9wYWNpdHk6IDE7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSh2YXIoLS1mYS1iZWF0LWZhZGUtc2NhbGUsIDEuMTI1KSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSh2YXIoLS1mYS1iZWF0LWZhZGUtc2NhbGUsIDEuMTI1KSk7XFxuICB9XFxufVxcbkAtd2Via2l0LWtleWZyYW1lcyBmYS1mbGlwIHtcXG4gIDUwJSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUzZCh2YXIoLS1mYS1mbGlwLXgsIDApLCB2YXIoLS1mYS1mbGlwLXksIDEpLCB2YXIoLS1mYS1mbGlwLXosIDApLCB2YXIoLS1mYS1mbGlwLWFuZ2xlLCAtMTgwZGVnKSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUzZCh2YXIoLS1mYS1mbGlwLXgsIDApLCB2YXIoLS1mYS1mbGlwLXksIDEpLCB2YXIoLS1mYS1mbGlwLXosIDApLCB2YXIoLS1mYS1mbGlwLWFuZ2xlLCAtMTgwZGVnKSk7XFxuICB9XFxufVxcbkBrZXlmcmFtZXMgZmEtZmxpcCB7XFxuICA1MCUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlM2QodmFyKC0tZmEtZmxpcC14LCAwKSwgdmFyKC0tZmEtZmxpcC15LCAxKSwgdmFyKC0tZmEtZmxpcC16LCAwKSwgdmFyKC0tZmEtZmxpcC1hbmdsZSwgLTE4MGRlZykpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlM2QodmFyKC0tZmEtZmxpcC14LCAwKSwgdmFyKC0tZmEtZmxpcC15LCAxKSwgdmFyKC0tZmEtZmxpcC16LCAwKSwgdmFyKC0tZmEtZmxpcC1hbmdsZSwgLTE4MGRlZykpO1xcbiAgfVxcbn1cXG5ALXdlYmtpdC1rZXlmcmFtZXMgZmEtc2hha2Uge1xcbiAgMCUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKC0xNWRlZyk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoLTE1ZGVnKTtcXG4gIH1cXG4gIDQlIHtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgxNWRlZyk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMTVkZWcpO1xcbiAgfVxcbiAgOCUsIDI0JSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoLTE4ZGVnKTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgtMThkZWcpO1xcbiAgfVxcbiAgMTIlLCAyOCUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDE4ZGVnKTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxOGRlZyk7XFxuICB9XFxuICAxNiUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKC0yMmRlZyk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoLTIyZGVnKTtcXG4gIH1cXG4gIDIwJSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMjJkZWcpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDIyZGVnKTtcXG4gIH1cXG4gIDMyJSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoLTEyZGVnKTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgtMTJkZWcpO1xcbiAgfVxcbiAgMzYlIHtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgxMmRlZyk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMTJkZWcpO1xcbiAgfVxcbiAgNDAlLCAxMDAlIHtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTtcXG4gIH1cXG59XFxuQGtleWZyYW1lcyBmYS1zaGFrZSB7XFxuICAwJSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoLTE1ZGVnKTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgtMTVkZWcpO1xcbiAgfVxcbiAgNCUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDE1ZGVnKTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxNWRlZyk7XFxuICB9XFxuICA4JSwgMjQlIHtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgtMThkZWcpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKC0xOGRlZyk7XFxuICB9XFxuICAxMiUsIDI4JSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMThkZWcpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDE4ZGVnKTtcXG4gIH1cXG4gIDE2JSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoLTIyZGVnKTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgtMjJkZWcpO1xcbiAgfVxcbiAgMjAlIHtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgyMmRlZyk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMjJkZWcpO1xcbiAgfVxcbiAgMzIlIHtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgtMTJkZWcpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKC0xMmRlZyk7XFxuICB9XFxuICAzNiUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDEyZGVnKTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxMmRlZyk7XFxuICB9XFxuICA0MCUsIDEwMCUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDBkZWcpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpO1xcbiAgfVxcbn1cXG5ALXdlYmtpdC1rZXlmcmFtZXMgZmEtc3BpbiB7XFxuICAwJSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7XFxuICB9XFxuICAxMDAlIHtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7XFxuICB9XFxufVxcbkBrZXlmcmFtZXMgZmEtc3BpbiB7XFxuICAwJSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7XFxuICB9XFxuICAxMDAlIHtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7XFxuICB9XFxufVxcbi5mYS1yb3RhdGUtOTAge1xcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSg5MGRlZyk7XFxuICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTtcXG59XFxuXFxuLmZhLXJvdGF0ZS0xODAge1xcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcbiAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcbn1cXG5cXG4uZmEtcm90YXRlLTI3MCB7XFxuICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDI3MGRlZyk7XFxuICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDI3MGRlZyk7XFxufVxcblxcbi5mYS1mbGlwLWhvcml6b250YWwge1xcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKC0xLCAxKTtcXG4gICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgtMSwgMSk7XFxufVxcblxcbi5mYS1mbGlwLXZlcnRpY2FsIHtcXG4gIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxLCAtMSk7XFxuICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMSwgLTEpO1xcbn1cXG5cXG4uZmEtZmxpcC1ib3RoLFxcbi5mYS1mbGlwLWhvcml6b250YWwuZmEtZmxpcC12ZXJ0aWNhbCB7XFxuICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoLTEsIC0xKTtcXG4gICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgtMSwgLTEpO1xcbn1cXG5cXG4uZmEtcm90YXRlLWJ5IHtcXG4gIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUodmFyKC0tZmEtcm90YXRlLWFuZ2xlLCBub25lKSk7XFxuICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKHZhcigtLWZhLXJvdGF0ZS1hbmdsZSwgbm9uZSkpO1xcbn1cXG5cXG4uZmEtc3RhY2sge1xcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcXG4gIGhlaWdodDogMmVtO1xcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgd2lkdGg6IDIuNWVtO1xcbn1cXG5cXG4uZmEtc3RhY2stMXgsXFxuLmZhLXN0YWNrLTJ4IHtcXG4gIGJvdHRvbTogMDtcXG4gIGxlZnQ6IDA7XFxuICBtYXJnaW46IGF1dG87XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICByaWdodDogMDtcXG4gIHRvcDogMDtcXG4gIHotaW5kZXg6IHZhcigtLWZhLXN0YWNrLXotaW5kZXgsIGF1dG8pO1xcbn1cXG5cXG4uc3ZnLWlubGluZS0tZmEuZmEtc3RhY2stMXgge1xcbiAgaGVpZ2h0OiAxZW07XFxuICB3aWR0aDogMS4yNWVtO1xcbn1cXG4uc3ZnLWlubGluZS0tZmEuZmEtc3RhY2stMngge1xcbiAgaGVpZ2h0OiAyZW07XFxuICB3aWR0aDogMi41ZW07XFxufVxcblxcbi5mYS1pbnZlcnNlIHtcXG4gIGNvbG9yOiB2YXIoLS1mYS1pbnZlcnNlLCAjZmZmKTtcXG59XFxuXFxuLnNyLW9ubHksXFxuLmZhLXNyLW9ubHkge1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgd2lkdGg6IDFweDtcXG4gIGhlaWdodDogMXB4O1xcbiAgcGFkZGluZzogMDtcXG4gIG1hcmdpbjogLTFweDtcXG4gIG92ZXJmbG93OiBoaWRkZW47XFxuICBjbGlwOiByZWN0KDAsIDAsIDAsIDApO1xcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcXG4gIGJvcmRlci13aWR0aDogMDtcXG59XFxuXFxuLnNyLW9ubHktZm9jdXNhYmxlOm5vdCg6Zm9jdXMpLFxcbi5mYS1zci1vbmx5LWZvY3VzYWJsZTpub3QoOmZvY3VzKSB7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICB3aWR0aDogMXB4O1xcbiAgaGVpZ2h0OiAxcHg7XFxuICBwYWRkaW5nOiAwO1xcbiAgbWFyZ2luOiAtMXB4O1xcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcXG4gIGNsaXA6IHJlY3QoMCwgMCwgMCwgMCk7XFxuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xcbiAgYm9yZGVyLXdpZHRoOiAwO1xcbn1cXG5cXG4uc3ZnLWlubGluZS0tZmEgLmZhLXByaW1hcnkge1xcbiAgZmlsbDogdmFyKC0tZmEtcHJpbWFyeS1jb2xvciwgY3VycmVudENvbG9yKTtcXG4gIG9wYWNpdHk6IHZhcigtLWZhLXByaW1hcnktb3BhY2l0eSwgMSk7XFxufVxcblxcbi5zdmctaW5saW5lLS1mYSAuZmEtc2Vjb25kYXJ5IHtcXG4gIGZpbGw6IHZhcigtLWZhLXNlY29uZGFyeS1jb2xvciwgY3VycmVudENvbG9yKTtcXG4gIG9wYWNpdHk6IHZhcigtLWZhLXNlY29uZGFyeS1vcGFjaXR5LCAwLjQpO1xcbn1cXG5cXG4uc3ZnLWlubGluZS0tZmEuZmEtc3dhcC1vcGFjaXR5IC5mYS1wcmltYXJ5IHtcXG4gIG9wYWNpdHk6IHZhcigtLWZhLXNlY29uZGFyeS1vcGFjaXR5LCAwLjQpO1xcbn1cXG5cXG4uc3ZnLWlubGluZS0tZmEuZmEtc3dhcC1vcGFjaXR5IC5mYS1zZWNvbmRhcnkge1xcbiAgb3BhY2l0eTogdmFyKC0tZmEtcHJpbWFyeS1vcGFjaXR5LCAxKTtcXG59XFxuXFxuLnN2Zy1pbmxpbmUtLWZhIG1hc2sgLmZhLXByaW1hcnksXFxuLnN2Zy1pbmxpbmUtLWZhIG1hc2sgLmZhLXNlY29uZGFyeSB7XFxuICBmaWxsOiBibGFjaztcXG59XFxuXFxuLmZhZC5mYS1pbnZlcnNlLFxcbi5mYS1kdW90b25lLmZhLWludmVyc2Uge1xcbiAgY29sb3I6IHZhcigtLWZhLWludmVyc2UsICNmZmYpO1xcbn1cIjtcblxuZnVuY3Rpb24gY3NzKCkge1xuICB2YXIgZGNwID0gREVGQVVMVF9DU1NfUFJFRklYO1xuICB2YXIgZHJjID0gREVGQVVMVF9SRVBMQUNFTUVOVF9DTEFTUztcbiAgdmFyIGZwID0gY29uZmlnLmNzc1ByZWZpeDtcbiAgdmFyIHJjID0gY29uZmlnLnJlcGxhY2VtZW50Q2xhc3M7XG4gIHZhciBzID0gYmFzZVN0eWxlcztcblxuICBpZiAoZnAgIT09IGRjcCB8fCByYyAhPT0gZHJjKSB7XG4gICAgdmFyIGRQYXR0ID0gbmV3IFJlZ0V4cChcIlxcXFwuXCIuY29uY2F0KGRjcCwgXCJcXFxcLVwiKSwgJ2cnKTtcbiAgICB2YXIgY3VzdG9tUHJvcFBhdHQgPSBuZXcgUmVnRXhwKFwiXFxcXC0tXCIuY29uY2F0KGRjcCwgXCJcXFxcLVwiKSwgJ2cnKTtcbiAgICB2YXIgclBhdHQgPSBuZXcgUmVnRXhwKFwiXFxcXC5cIi5jb25jYXQoZHJjKSwgJ2cnKTtcbiAgICBzID0gcy5yZXBsYWNlKGRQYXR0LCBcIi5cIi5jb25jYXQoZnAsIFwiLVwiKSkucmVwbGFjZShjdXN0b21Qcm9wUGF0dCwgXCItLVwiLmNvbmNhdChmcCwgXCItXCIpKS5yZXBsYWNlKHJQYXR0LCBcIi5cIi5jb25jYXQocmMpKTtcbiAgfVxuXG4gIHJldHVybiBzO1xufVxuXG52YXIgX2Nzc0luc2VydGVkID0gZmFsc2U7XG5cbmZ1bmN0aW9uIGVuc3VyZUNzcygpIHtcbiAgaWYgKGNvbmZpZy5hdXRvQWRkQ3NzICYmICFfY3NzSW5zZXJ0ZWQpIHtcbiAgICBpbnNlcnRDc3MoY3NzKCkpO1xuICAgIF9jc3NJbnNlcnRlZCA9IHRydWU7XG4gIH1cbn1cblxudmFyIEluamVjdENTUyA9IHtcbiAgbWl4b3V0OiBmdW5jdGlvbiBtaXhvdXQoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRvbToge1xuICAgICAgICBjc3M6IGNzcyxcbiAgICAgICAgaW5zZXJ0Q3NzOiBlbnN1cmVDc3NcbiAgICAgIH1cbiAgICB9O1xuICB9LFxuICBob29rczogZnVuY3Rpb24gaG9va3MoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGJlZm9yZURPTUVsZW1lbnRDcmVhdGlvbjogZnVuY3Rpb24gYmVmb3JlRE9NRWxlbWVudENyZWF0aW9uKCkge1xuICAgICAgICBlbnN1cmVDc3MoKTtcbiAgICAgIH0sXG4gICAgICBiZWZvcmVJMnN2ZzogZnVuY3Rpb24gYmVmb3JlSTJzdmcoKSB7XG4gICAgICAgIGVuc3VyZUNzcygpO1xuICAgICAgfVxuICAgIH07XG4gIH1cbn07XG5cbnZhciB3ID0gV0lORE9XIHx8IHt9O1xuaWYgKCF3W05BTUVTUEFDRV9JREVOVElGSUVSXSkgd1tOQU1FU1BBQ0VfSURFTlRJRklFUl0gPSB7fTtcbmlmICghd1tOQU1FU1BBQ0VfSURFTlRJRklFUl0uc3R5bGVzKSB3W05BTUVTUEFDRV9JREVOVElGSUVSXS5zdHlsZXMgPSB7fTtcbmlmICghd1tOQU1FU1BBQ0VfSURFTlRJRklFUl0uaG9va3MpIHdbTkFNRVNQQUNFX0lERU5USUZJRVJdLmhvb2tzID0ge307XG5pZiAoIXdbTkFNRVNQQUNFX0lERU5USUZJRVJdLnNoaW1zKSB3W05BTUVTUEFDRV9JREVOVElGSUVSXS5zaGltcyA9IFtdO1xudmFyIG5hbWVzcGFjZSA9IHdbTkFNRVNQQUNFX0lERU5USUZJRVJdO1xuXG52YXIgZnVuY3Rpb25zID0gW107XG5cbnZhciBsaXN0ZW5lciA9IGZ1bmN0aW9uIGxpc3RlbmVyKCkge1xuICBET0NVTUVOVC5yZW1vdmVFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgbGlzdGVuZXIpO1xuICBsb2FkZWQgPSAxO1xuICBmdW5jdGlvbnMubWFwKGZ1bmN0aW9uIChmbikge1xuICAgIHJldHVybiBmbigpO1xuICB9KTtcbn07XG5cbnZhciBsb2FkZWQgPSBmYWxzZTtcblxuaWYgKElTX0RPTSkge1xuICBsb2FkZWQgPSAoRE9DVU1FTlQuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsID8gL15sb2FkZWR8XmMvIDogL15sb2FkZWR8Xml8XmMvKS50ZXN0KERPQ1VNRU5ULnJlYWR5U3RhdGUpO1xuICBpZiAoIWxvYWRlZCkgRE9DVU1FTlQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGxpc3RlbmVyKTtcbn1cblxuZnVuY3Rpb24gZG9tcmVhZHkgKGZuKSB7XG4gIGlmICghSVNfRE9NKSByZXR1cm47XG4gIGxvYWRlZCA/IHNldFRpbWVvdXQoZm4sIDApIDogZnVuY3Rpb25zLnB1c2goZm4pO1xufVxuXG5mdW5jdGlvbiB0b0h0bWwoYWJzdHJhY3ROb2Rlcykge1xuICB2YXIgdGFnID0gYWJzdHJhY3ROb2Rlcy50YWcsXG4gICAgICBfYWJzdHJhY3ROb2RlcyRhdHRyaWIgPSBhYnN0cmFjdE5vZGVzLmF0dHJpYnV0ZXMsXG4gICAgICBhdHRyaWJ1dGVzID0gX2Fic3RyYWN0Tm9kZXMkYXR0cmliID09PSB2b2lkIDAgPyB7fSA6IF9hYnN0cmFjdE5vZGVzJGF0dHJpYixcbiAgICAgIF9hYnN0cmFjdE5vZGVzJGNoaWxkciA9IGFic3RyYWN0Tm9kZXMuY2hpbGRyZW4sXG4gICAgICBjaGlsZHJlbiA9IF9hYnN0cmFjdE5vZGVzJGNoaWxkciA9PT0gdm9pZCAwID8gW10gOiBfYWJzdHJhY3ROb2RlcyRjaGlsZHI7XG5cbiAgaWYgKHR5cGVvZiBhYnN0cmFjdE5vZGVzID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBodG1sRXNjYXBlKGFic3RyYWN0Tm9kZXMpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBcIjxcIi5jb25jYXQodGFnLCBcIiBcIikuY29uY2F0KGpvaW5BdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpLCBcIj5cIikuY29uY2F0KGNoaWxkcmVuLm1hcCh0b0h0bWwpLmpvaW4oJycpLCBcIjwvXCIpLmNvbmNhdCh0YWcsIFwiPlwiKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpY29uRnJvbU1hcHBpbmcobWFwcGluZywgcHJlZml4LCBpY29uTmFtZSkge1xuICBpZiAobWFwcGluZyAmJiBtYXBwaW5nW3ByZWZpeF0gJiYgbWFwcGluZ1twcmVmaXhdW2ljb25OYW1lXSkge1xuICAgIHJldHVybiB7XG4gICAgICBwcmVmaXg6IHByZWZpeCxcbiAgICAgIGljb25OYW1lOiBpY29uTmFtZSxcbiAgICAgIGljb246IG1hcHBpbmdbcHJlZml4XVtpY29uTmFtZV1cbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogSW50ZXJuYWwgaGVscGVyIHRvIGJpbmQgYSBmdW5jdGlvbiBrbm93biB0byBoYXZlIDQgYXJndW1lbnRzXG4gKiB0byBhIGdpdmVuIGNvbnRleHQuXG4gKi9cblxudmFyIGJpbmRJbnRlcm5hbDQgPSBmdW5jdGlvbiBiaW5kSW50ZXJuYWw0KGZ1bmMsIHRoaXNDb250ZXh0KSB7XG4gIHJldHVybiBmdW5jdGlvbiAoYSwgYiwgYywgZCkge1xuICAgIHJldHVybiBmdW5jLmNhbGwodGhpc0NvbnRleHQsIGEsIGIsIGMsIGQpO1xuICB9O1xufTtcblxuLyoqXG4gKiAjIFJlZHVjZVxuICpcbiAqIEEgZmFzdCBvYmplY3QgYC5yZWR1Y2UoKWAgaW1wbGVtZW50YXRpb24uXG4gKlxuICogQHBhcmFtICB7T2JqZWN0fSAgIHN1YmplY3QgICAgICBUaGUgb2JqZWN0IHRvIHJlZHVjZSBvdmVyLlxuICogQHBhcmFtICB7RnVuY3Rpb259IGZuICAgICAgICAgICBUaGUgcmVkdWNlciBmdW5jdGlvbi5cbiAqIEBwYXJhbSAge21peGVkfSAgICBpbml0aWFsVmFsdWUgVGhlIGluaXRpYWwgdmFsdWUgZm9yIHRoZSByZWR1Y2VyLCBkZWZhdWx0cyB0byBzdWJqZWN0WzBdLlxuICogQHBhcmFtICB7T2JqZWN0fSAgIHRoaXNDb250ZXh0ICBUaGUgY29udGV4dCBmb3IgdGhlIHJlZHVjZXIuXG4gKiBAcmV0dXJuIHttaXhlZH0gICAgICAgICAgICAgICAgIFRoZSBmaW5hbCByZXN1bHQuXG4gKi9cblxuXG52YXIgcmVkdWNlID0gZnVuY3Rpb24gZmFzdFJlZHVjZU9iamVjdChzdWJqZWN0LCBmbiwgaW5pdGlhbFZhbHVlLCB0aGlzQ29udGV4dCkge1xuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHN1YmplY3QpLFxuICAgICAgbGVuZ3RoID0ga2V5cy5sZW5ndGgsXG4gICAgICBpdGVyYXRvciA9IHRoaXNDb250ZXh0ICE9PSB1bmRlZmluZWQgPyBiaW5kSW50ZXJuYWw0KGZuLCB0aGlzQ29udGV4dCkgOiBmbixcbiAgICAgIGksXG4gICAgICBrZXksXG4gICAgICByZXN1bHQ7XG5cbiAgaWYgKGluaXRpYWxWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgaSA9IDE7XG4gICAgcmVzdWx0ID0gc3ViamVjdFtrZXlzWzBdXTtcbiAgfSBlbHNlIHtcbiAgICBpID0gMDtcbiAgICByZXN1bHQgPSBpbml0aWFsVmFsdWU7XG4gIH1cblxuICBmb3IgKDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAga2V5ID0ga2V5c1tpXTtcbiAgICByZXN1bHQgPSBpdGVyYXRvcihyZXN1bHQsIHN1YmplY3Rba2V5XSwga2V5LCBzdWJqZWN0KTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIHVjczJkZWNvZGUoKSBhbmQgY29kZVBvaW50QXQoKSBhcmUgYm90aCB3b3JrcyBvZiBNYXRoaWFzIEJ5bmVucyBhbmQgbGljZW5zZWQgdW5kZXIgTUlUXG4gKlxuICogQ29weXJpZ2h0IE1hdGhpYXMgQnluZW5zIDxodHRwczovL21hdGhpYXNieW5lbnMuYmUvPlxuXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmdcbiAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuICogXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4gKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4gKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG9cbiAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0b1xuICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZVxuICogaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG5cbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsXG4gKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0ZcbiAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EXG4gKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFXG4gKiBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OXG4gKiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT05cbiAqIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuICovXG5mdW5jdGlvbiB1Y3MyZGVjb2RlKHN0cmluZykge1xuICB2YXIgb3V0cHV0ID0gW107XG4gIHZhciBjb3VudGVyID0gMDtcbiAgdmFyIGxlbmd0aCA9IHN0cmluZy5sZW5ndGg7XG5cbiAgd2hpbGUgKGNvdW50ZXIgPCBsZW5ndGgpIHtcbiAgICB2YXIgdmFsdWUgPSBzdHJpbmcuY2hhckNvZGVBdChjb3VudGVyKyspO1xuXG4gICAgaWYgKHZhbHVlID49IDB4RDgwMCAmJiB2YWx1ZSA8PSAweERCRkYgJiYgY291bnRlciA8IGxlbmd0aCkge1xuICAgICAgdmFyIGV4dHJhID0gc3RyaW5nLmNoYXJDb2RlQXQoY291bnRlcisrKTtcblxuICAgICAgaWYgKChleHRyYSAmIDB4RkMwMCkgPT0gMHhEQzAwKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZXFlcWVxXG4gICAgICAgIG91dHB1dC5wdXNoKCgodmFsdWUgJiAweDNGRikgPDwgMTApICsgKGV4dHJhICYgMHgzRkYpICsgMHgxMDAwMCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXRwdXQucHVzaCh2YWx1ZSk7XG4gICAgICAgIGNvdW50ZXItLTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgb3V0cHV0LnB1c2godmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvdXRwdXQ7XG59XG5cbmZ1bmN0aW9uIHRvSGV4KHVuaWNvZGUpIHtcbiAgdmFyIGRlY29kZWQgPSB1Y3MyZGVjb2RlKHVuaWNvZGUpO1xuICByZXR1cm4gZGVjb2RlZC5sZW5ndGggPT09IDEgPyBkZWNvZGVkWzBdLnRvU3RyaW5nKDE2KSA6IG51bGw7XG59XG5mdW5jdGlvbiBjb2RlUG9pbnRBdChzdHJpbmcsIGluZGV4KSB7XG4gIHZhciBzaXplID0gc3RyaW5nLmxlbmd0aDtcbiAgdmFyIGZpcnN0ID0gc3RyaW5nLmNoYXJDb2RlQXQoaW5kZXgpO1xuICB2YXIgc2Vjb25kO1xuXG4gIGlmIChmaXJzdCA+PSAweEQ4MDAgJiYgZmlyc3QgPD0gMHhEQkZGICYmIHNpemUgPiBpbmRleCArIDEpIHtcbiAgICBzZWNvbmQgPSBzdHJpbmcuY2hhckNvZGVBdChpbmRleCArIDEpO1xuXG4gICAgaWYgKHNlY29uZCA+PSAweERDMDAgJiYgc2Vjb25kIDw9IDB4REZGRikge1xuICAgICAgcmV0dXJuIChmaXJzdCAtIDB4RDgwMCkgKiAweDQwMCArIHNlY29uZCAtIDB4REMwMCArIDB4MTAwMDA7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZpcnN0O1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVJY29ucyhpY29ucykge1xuICByZXR1cm4gT2JqZWN0LmtleXMoaWNvbnMpLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBpY29uTmFtZSkge1xuICAgIHZhciBpY29uID0gaWNvbnNbaWNvbk5hbWVdO1xuICAgIHZhciBleHBhbmRlZCA9ICEhaWNvbi5pY29uO1xuXG4gICAgaWYgKGV4cGFuZGVkKSB7XG4gICAgICBhY2NbaWNvbi5pY29uTmFtZV0gPSBpY29uLmljb247XG4gICAgfSBlbHNlIHtcbiAgICAgIGFjY1tpY29uTmFtZV0gPSBpY29uO1xuICAgIH1cblxuICAgIHJldHVybiBhY2M7XG4gIH0sIHt9KTtcbn1cblxuZnVuY3Rpb24gZGVmaW5lSWNvbnMocHJlZml4LCBpY29ucykge1xuICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcbiAgdmFyIF9wYXJhbXMkc2tpcEhvb2tzID0gcGFyYW1zLnNraXBIb29rcyxcbiAgICAgIHNraXBIb29rcyA9IF9wYXJhbXMkc2tpcEhvb2tzID09PSB2b2lkIDAgPyBmYWxzZSA6IF9wYXJhbXMkc2tpcEhvb2tzO1xuICB2YXIgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZUljb25zKGljb25zKTtcblxuICBpZiAodHlwZW9mIG5hbWVzcGFjZS5ob29rcy5hZGRQYWNrID09PSAnZnVuY3Rpb24nICYmICFza2lwSG9va3MpIHtcbiAgICBuYW1lc3BhY2UuaG9va3MuYWRkUGFjayhwcmVmaXgsIG5vcm1hbGl6ZUljb25zKGljb25zKSk7XG4gIH0gZWxzZSB7XG4gICAgbmFtZXNwYWNlLnN0eWxlc1twcmVmaXhdID0gX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIG5hbWVzcGFjZS5zdHlsZXNbcHJlZml4XSB8fCB7fSksIG5vcm1hbGl6ZWQpO1xuICB9XG4gIC8qKlxuICAgKiBGb250IEF3ZXNvbWUgNCB1c2VkIHRoZSBwcmVmaXggb2YgYGZhYCBmb3IgYWxsIGljb25zLiBXaXRoIHRoZSBpbnRyb2R1Y3Rpb25cbiAgICogb2YgbmV3IHN0eWxlcyB3ZSBuZWVkZWQgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIHRoZW0uIFByZWZpeCBgZmFgIGlzIG5vdyBhbiBhbGlhc1xuICAgKiBmb3IgYGZhc2Agc28gd2UnbGwgZWFzZSB0aGUgdXBncmFkZSBwcm9jZXNzIGZvciBvdXIgdXNlcnMgYnkgYXV0b21hdGljYWxseSBkZWZpbmluZ1xuICAgKiB0aGlzIGFzIHdlbGwuXG4gICAqL1xuXG5cbiAgaWYgKHByZWZpeCA9PT0gJ2ZhcycpIHtcbiAgICBkZWZpbmVJY29ucygnZmEnLCBpY29ucyk7XG4gIH1cbn1cblxudmFyIGR1b3RvbmVQYXRoUmUgPSBbLyojX19QVVJFX18qL193cmFwUmVnRXhwKC9wYXRoIGQ9XCIoKD86KD8hXCIpW1xcc1xcU10pKylcIi4qcGF0aCBkPVwiKCg/Oig/IVwiKVtcXHNcXFNdKSspXCIvLCB7XG4gIGQxOiAxLFxuICBkMjogMlxufSksIC8qI19fUFVSRV9fKi9fd3JhcFJlZ0V4cCgvcGF0aCBjbGFzcz1cIigoPzooPyFcIilbXFxzXFxTXSkrKVwiLipkPVwiKCg/Oig/IVwiKVtcXHNcXFNdKSspXCIuKnBhdGggY2xhc3M9XCIoKD86KD8hXCIpW1xcc1xcU10pKylcIi4qZD1cIigoPzooPyFcIilbXFxzXFxTXSkrKVwiLywge1xuICBjbHMxOiAxLFxuICBkMTogMixcbiAgY2xzMjogMyxcbiAgZDI6IDRcbn0pLCAvKiNfX1BVUkVfXyovX3dyYXBSZWdFeHAoL3BhdGggY2xhc3M9XCIoKD86KD8hXCIpW1xcc1xcU10pKylcIi4qZD1cIigoPzooPyFcIilbXFxzXFxTXSkrKVwiLywge1xuICBjbHMxOiAxLFxuICBkMTogMlxufSldO1xuXG52YXIgX0xPTkdfU1RZTEUsIF9QUkVGSVhFUywgX1BSRUZJWEVTX0ZPUl9GQU1JTFk7XG52YXIgc3R5bGVzID0gbmFtZXNwYWNlLnN0eWxlcyxcbiAgICBzaGltcyA9IG5hbWVzcGFjZS5zaGltcztcbnZhciBMT05HX1NUWUxFID0gKF9MT05HX1NUWUxFID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfTE9OR19TVFlMRSwgRkFNSUxZX0NMQVNTSUMsIE9iamVjdC52YWx1ZXMoUFJFRklYX1RPX0xPTkdfU1RZTEVbRkFNSUxZX0NMQVNTSUNdKSksIF9kZWZpbmVQcm9wZXJ0eShfTE9OR19TVFlMRSwgRkFNSUxZX1NIQVJQLCBPYmplY3QudmFsdWVzKFBSRUZJWF9UT19MT05HX1NUWUxFW0ZBTUlMWV9TSEFSUF0pKSwgX0xPTkdfU1RZTEUpO1xudmFyIF9kZWZhdWx0VXNhYmxlUHJlZml4ID0gbnVsbDtcbnZhciBfYnlVbmljb2RlID0ge307XG52YXIgX2J5TGlnYXR1cmUgPSB7fTtcbnZhciBfYnlPbGROYW1lID0ge307XG52YXIgX2J5T2xkVW5pY29kZSA9IHt9O1xudmFyIF9ieUFsaWFzID0ge307XG52YXIgUFJFRklYRVMgPSAoX1BSRUZJWEVTID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfUFJFRklYRVMsIEZBTUlMWV9DTEFTU0lDLCBPYmplY3Qua2V5cyhQUkVGSVhfVE9fU1RZTEVbRkFNSUxZX0NMQVNTSUNdKSksIF9kZWZpbmVQcm9wZXJ0eShfUFJFRklYRVMsIEZBTUlMWV9TSEFSUCwgT2JqZWN0LmtleXMoUFJFRklYX1RPX1NUWUxFW0ZBTUlMWV9TSEFSUF0pKSwgX1BSRUZJWEVTKTtcblxuZnVuY3Rpb24gaXNSZXNlcnZlZChuYW1lKSB7XG4gIHJldHVybiB+UkVTRVJWRURfQ0xBU1NFUy5pbmRleE9mKG5hbWUpO1xufVxuXG5mdW5jdGlvbiBnZXRJY29uTmFtZShjc3NQcmVmaXgsIGNscykge1xuICB2YXIgcGFydHMgPSBjbHMuc3BsaXQoJy0nKTtcbiAgdmFyIHByZWZpeCA9IHBhcnRzWzBdO1xuICB2YXIgaWNvbk5hbWUgPSBwYXJ0cy5zbGljZSgxKS5qb2luKCctJyk7XG5cbiAgaWYgKHByZWZpeCA9PT0gY3NzUHJlZml4ICYmIGljb25OYW1lICE9PSAnJyAmJiAhaXNSZXNlcnZlZChpY29uTmFtZSkpIHtcbiAgICByZXR1cm4gaWNvbk5hbWU7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbnZhciBidWlsZCA9IGZ1bmN0aW9uIGJ1aWxkKCkge1xuICB2YXIgbG9va3VwID0gZnVuY3Rpb24gbG9va3VwKHJlZHVjZXIpIHtcbiAgICByZXR1cm4gcmVkdWNlKHN0eWxlcywgZnVuY3Rpb24gKG8sIHN0eWxlLCBwcmVmaXgpIHtcbiAgICAgIG9bcHJlZml4XSA9IHJlZHVjZShzdHlsZSwgcmVkdWNlciwge30pO1xuICAgICAgcmV0dXJuIG87XG4gICAgfSwge30pO1xuICB9O1xuXG4gIF9ieVVuaWNvZGUgPSBsb29rdXAoZnVuY3Rpb24gKGFjYywgaWNvbiwgaWNvbk5hbWUpIHtcbiAgICBpZiAoaWNvblszXSkge1xuICAgICAgYWNjW2ljb25bM11dID0gaWNvbk5hbWU7XG4gICAgfVxuXG4gICAgaWYgKGljb25bMl0pIHtcbiAgICAgIHZhciBhbGlhc2VzID0gaWNvblsyXS5maWx0ZXIoZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBhID09PSAnbnVtYmVyJztcbiAgICAgIH0pO1xuICAgICAgYWxpYXNlcy5mb3JFYWNoKGZ1bmN0aW9uIChhbGlhcykge1xuICAgICAgICBhY2NbYWxpYXMudG9TdHJpbmcoMTYpXSA9IGljb25OYW1lO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFjYztcbiAgfSk7XG4gIF9ieUxpZ2F0dXJlID0gbG9va3VwKGZ1bmN0aW9uIChhY2MsIGljb24sIGljb25OYW1lKSB7XG4gICAgYWNjW2ljb25OYW1lXSA9IGljb25OYW1lO1xuXG4gICAgaWYgKGljb25bMl0pIHtcbiAgICAgIHZhciBhbGlhc2VzID0gaWNvblsyXS5maWx0ZXIoZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBhID09PSAnc3RyaW5nJztcbiAgICAgIH0pO1xuICAgICAgYWxpYXNlcy5mb3JFYWNoKGZ1bmN0aW9uIChhbGlhcykge1xuICAgICAgICBhY2NbYWxpYXNdID0gaWNvbk5hbWU7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWNjO1xuICB9KTtcbiAgX2J5QWxpYXMgPSBsb29rdXAoZnVuY3Rpb24gKGFjYywgaWNvbiwgaWNvbk5hbWUpIHtcbiAgICB2YXIgYWxpYXNlcyA9IGljb25bMl07XG4gICAgYWNjW2ljb25OYW1lXSA9IGljb25OYW1lO1xuICAgIGFsaWFzZXMuZm9yRWFjaChmdW5jdGlvbiAoYWxpYXMpIHtcbiAgICAgIGFjY1thbGlhc10gPSBpY29uTmFtZTtcbiAgICB9KTtcbiAgICByZXR1cm4gYWNjO1xuICB9KTsgLy8gSWYgd2UgaGF2ZSBhIEtpdCwgd2UgY2FuJ3QgZGV0ZXJtaW5lIGlmIHJlZ3VsYXIgaXMgYXZhaWxhYmxlIHNpbmNlIHdlXG4gIC8vIGNvdWxkIGJlIGF1dG8tZmV0Y2hpbmcgaXQuIFdlJ2xsIGhhdmUgdG8gYXNzdW1lIHRoYXQgaXQgaXMgYXZhaWxhYmxlLlxuXG4gIHZhciBoYXNSZWd1bGFyID0gJ2ZhcicgaW4gc3R5bGVzIHx8IGNvbmZpZy5hdXRvRmV0Y2hTdmc7XG4gIHZhciBzaGltTG9va3VwcyA9IHJlZHVjZShzaGltcywgZnVuY3Rpb24gKGFjYywgc2hpbSkge1xuICAgIHZhciBtYXliZU5hbWVNYXliZVVuaWNvZGUgPSBzaGltWzBdO1xuICAgIHZhciBwcmVmaXggPSBzaGltWzFdO1xuICAgIHZhciBpY29uTmFtZSA9IHNoaW1bMl07XG5cbiAgICBpZiAocHJlZml4ID09PSAnZmFyJyAmJiAhaGFzUmVndWxhcikge1xuICAgICAgcHJlZml4ID0gJ2Zhcyc7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBtYXliZU5hbWVNYXliZVVuaWNvZGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBhY2MubmFtZXNbbWF5YmVOYW1lTWF5YmVVbmljb2RlXSA9IHtcbiAgICAgICAgcHJlZml4OiBwcmVmaXgsXG4gICAgICAgIGljb25OYW1lOiBpY29uTmFtZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG1heWJlTmFtZU1heWJlVW5pY29kZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIGFjYy51bmljb2Rlc1ttYXliZU5hbWVNYXliZVVuaWNvZGUudG9TdHJpbmcoMTYpXSA9IHtcbiAgICAgICAgcHJlZml4OiBwcmVmaXgsXG4gICAgICAgIGljb25OYW1lOiBpY29uTmFtZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWNjO1xuICB9LCB7XG4gICAgbmFtZXM6IHt9LFxuICAgIHVuaWNvZGVzOiB7fVxuICB9KTtcbiAgX2J5T2xkTmFtZSA9IHNoaW1Mb29rdXBzLm5hbWVzO1xuICBfYnlPbGRVbmljb2RlID0gc2hpbUxvb2t1cHMudW5pY29kZXM7XG4gIF9kZWZhdWx0VXNhYmxlUHJlZml4ID0gZ2V0Q2Fub25pY2FsUHJlZml4KGNvbmZpZy5zdHlsZURlZmF1bHQsIHtcbiAgICBmYW1pbHk6IGNvbmZpZy5mYW1pbHlEZWZhdWx0XG4gIH0pO1xufTtcbm9uQ2hhbmdlKGZ1bmN0aW9uIChjKSB7XG4gIF9kZWZhdWx0VXNhYmxlUHJlZml4ID0gZ2V0Q2Fub25pY2FsUHJlZml4KGMuc3R5bGVEZWZhdWx0LCB7XG4gICAgZmFtaWx5OiBjb25maWcuZmFtaWx5RGVmYXVsdFxuICB9KTtcbn0pO1xuYnVpbGQoKTtcbmZ1bmN0aW9uIGJ5VW5pY29kZShwcmVmaXgsIHVuaWNvZGUpIHtcbiAgcmV0dXJuIChfYnlVbmljb2RlW3ByZWZpeF0gfHwge30pW3VuaWNvZGVdO1xufVxuZnVuY3Rpb24gYnlMaWdhdHVyZShwcmVmaXgsIGxpZ2F0dXJlKSB7XG4gIHJldHVybiAoX2J5TGlnYXR1cmVbcHJlZml4XSB8fCB7fSlbbGlnYXR1cmVdO1xufVxuZnVuY3Rpb24gYnlBbGlhcyhwcmVmaXgsIGFsaWFzKSB7XG4gIHJldHVybiAoX2J5QWxpYXNbcHJlZml4XSB8fCB7fSlbYWxpYXNdO1xufVxuZnVuY3Rpb24gYnlPbGROYW1lKG5hbWUpIHtcbiAgcmV0dXJuIF9ieU9sZE5hbWVbbmFtZV0gfHwge1xuICAgIHByZWZpeDogbnVsbCxcbiAgICBpY29uTmFtZTogbnVsbFxuICB9O1xufVxuZnVuY3Rpb24gYnlPbGRVbmljb2RlKHVuaWNvZGUpIHtcbiAgdmFyIG9sZFVuaWNvZGUgPSBfYnlPbGRVbmljb2RlW3VuaWNvZGVdO1xuICB2YXIgbmV3VW5pY29kZSA9IGJ5VW5pY29kZSgnZmFzJywgdW5pY29kZSk7XG4gIHJldHVybiBvbGRVbmljb2RlIHx8IChuZXdVbmljb2RlID8ge1xuICAgIHByZWZpeDogJ2ZhcycsXG4gICAgaWNvbk5hbWU6IG5ld1VuaWNvZGVcbiAgfSA6IG51bGwpIHx8IHtcbiAgICBwcmVmaXg6IG51bGwsXG4gICAgaWNvbk5hbWU6IG51bGxcbiAgfTtcbn1cbmZ1bmN0aW9uIGdldERlZmF1bHRVc2FibGVQcmVmaXgoKSB7XG4gIHJldHVybiBfZGVmYXVsdFVzYWJsZVByZWZpeDtcbn1cbnZhciBlbXB0eUNhbm9uaWNhbEljb24gPSBmdW5jdGlvbiBlbXB0eUNhbm9uaWNhbEljb24oKSB7XG4gIHJldHVybiB7XG4gICAgcHJlZml4OiBudWxsLFxuICAgIGljb25OYW1lOiBudWxsLFxuICAgIHJlc3Q6IFtdXG4gIH07XG59O1xuZnVuY3Rpb24gZ2V0Q2Fub25pY2FsUHJlZml4KHN0eWxlT3JQcmVmaXgpIHtcbiAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gIHZhciBfcGFyYW1zJGZhbWlseSA9IHBhcmFtcy5mYW1pbHksXG4gICAgICBmYW1pbHkgPSBfcGFyYW1zJGZhbWlseSA9PT0gdm9pZCAwID8gRkFNSUxZX0NMQVNTSUMgOiBfcGFyYW1zJGZhbWlseTtcbiAgdmFyIHN0eWxlID0gUFJFRklYX1RPX1NUWUxFW2ZhbWlseV1bc3R5bGVPclByZWZpeF07XG4gIHZhciBwcmVmaXggPSBTVFlMRV9UT19QUkVGSVhbZmFtaWx5XVtzdHlsZU9yUHJlZml4XSB8fCBTVFlMRV9UT19QUkVGSVhbZmFtaWx5XVtzdHlsZV07XG4gIHZhciBkZWZpbmVkID0gc3R5bGVPclByZWZpeCBpbiBuYW1lc3BhY2Uuc3R5bGVzID8gc3R5bGVPclByZWZpeCA6IG51bGw7XG4gIHJldHVybiBwcmVmaXggfHwgZGVmaW5lZCB8fCBudWxsO1xufVxudmFyIFBSRUZJWEVTX0ZPUl9GQU1JTFkgPSAoX1BSRUZJWEVTX0ZPUl9GQU1JTFkgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9QUkVGSVhFU19GT1JfRkFNSUxZLCBGQU1JTFlfQ0xBU1NJQywgT2JqZWN0LmtleXMoUFJFRklYX1RPX0xPTkdfU1RZTEVbRkFNSUxZX0NMQVNTSUNdKSksIF9kZWZpbmVQcm9wZXJ0eShfUFJFRklYRVNfRk9SX0ZBTUlMWSwgRkFNSUxZX1NIQVJQLCBPYmplY3Qua2V5cyhQUkVGSVhfVE9fTE9OR19TVFlMRVtGQU1JTFlfU0hBUlBdKSksIF9QUkVGSVhFU19GT1JfRkFNSUxZKTtcbmZ1bmN0aW9uIGdldENhbm9uaWNhbEljb24odmFsdWVzKSB7XG4gIHZhciBfZmFtUHJvcHM7XG5cbiAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gIHZhciBfcGFyYW1zJHNraXBMb29rdXBzID0gcGFyYW1zLnNraXBMb29rdXBzLFxuICAgICAgc2tpcExvb2t1cHMgPSBfcGFyYW1zJHNraXBMb29rdXBzID09PSB2b2lkIDAgPyBmYWxzZSA6IF9wYXJhbXMkc2tpcExvb2t1cHM7XG4gIHZhciBmYW1Qcm9wcyA9IChfZmFtUHJvcHMgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9mYW1Qcm9wcywgRkFNSUxZX0NMQVNTSUMsIFwiXCIuY29uY2F0KGNvbmZpZy5jc3NQcmVmaXgsIFwiLVwiKS5jb25jYXQoRkFNSUxZX0NMQVNTSUMpKSwgX2RlZmluZVByb3BlcnR5KF9mYW1Qcm9wcywgRkFNSUxZX1NIQVJQLCBcIlwiLmNvbmNhdChjb25maWcuY3NzUHJlZml4LCBcIi1cIikuY29uY2F0KEZBTUlMWV9TSEFSUCkpLCBfZmFtUHJvcHMpO1xuICB2YXIgZ2l2ZW5QcmVmaXggPSBudWxsO1xuICB2YXIgZmFtaWx5ID0gRkFNSUxZX0NMQVNTSUM7XG5cbiAgaWYgKHZhbHVlcy5pbmNsdWRlcyhmYW1Qcm9wc1tGQU1JTFlfQ0xBU1NJQ10pIHx8IHZhbHVlcy5zb21lKGZ1bmN0aW9uICh2KSB7XG4gICAgcmV0dXJuIFBSRUZJWEVTX0ZPUl9GQU1JTFlbRkFNSUxZX0NMQVNTSUNdLmluY2x1ZGVzKHYpO1xuICB9KSkge1xuICAgIGZhbWlseSA9IEZBTUlMWV9DTEFTU0lDO1xuICB9XG5cbiAgaWYgKHZhbHVlcy5pbmNsdWRlcyhmYW1Qcm9wc1tGQU1JTFlfU0hBUlBdKSB8fCB2YWx1ZXMuc29tZShmdW5jdGlvbiAodikge1xuICAgIHJldHVybiBQUkVGSVhFU19GT1JfRkFNSUxZW0ZBTUlMWV9TSEFSUF0uaW5jbHVkZXModik7XG4gIH0pKSB7XG4gICAgZmFtaWx5ID0gRkFNSUxZX1NIQVJQO1xuICB9XG5cbiAgdmFyIGNhbm9uaWNhbCA9IHZhbHVlcy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgY2xzKSB7XG4gICAgdmFyIGljb25OYW1lID0gZ2V0SWNvbk5hbWUoY29uZmlnLmNzc1ByZWZpeCwgY2xzKTtcblxuICAgIGlmIChzdHlsZXNbY2xzXSkge1xuICAgICAgY2xzID0gTE9OR19TVFlMRVtmYW1pbHldLmluY2x1ZGVzKGNscykgPyBMT05HX1NUWUxFX1RPX1BSRUZJWFtmYW1pbHldW2Nsc10gOiBjbHM7XG4gICAgICBnaXZlblByZWZpeCA9IGNscztcbiAgICAgIGFjYy5wcmVmaXggPSBjbHM7XG4gICAgfSBlbHNlIGlmIChQUkVGSVhFU1tmYW1pbHldLmluZGV4T2YoY2xzKSA+IC0xKSB7XG4gICAgICBnaXZlblByZWZpeCA9IGNscztcbiAgICAgIGFjYy5wcmVmaXggPSBnZXRDYW5vbmljYWxQcmVmaXgoY2xzLCB7XG4gICAgICAgIGZhbWlseTogZmFtaWx5XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGljb25OYW1lKSB7XG4gICAgICBhY2MuaWNvbk5hbWUgPSBpY29uTmFtZTtcbiAgICB9IGVsc2UgaWYgKGNscyAhPT0gY29uZmlnLnJlcGxhY2VtZW50Q2xhc3MgJiYgY2xzICE9PSBmYW1Qcm9wc1tGQU1JTFlfQ0xBU1NJQ10gJiYgY2xzICE9PSBmYW1Qcm9wc1tGQU1JTFlfU0hBUlBdKSB7XG4gICAgICBhY2MucmVzdC5wdXNoKGNscyk7XG4gICAgfVxuXG4gICAgaWYgKCFza2lwTG9va3VwcyAmJiBhY2MucHJlZml4ICYmIGFjYy5pY29uTmFtZSkge1xuICAgICAgdmFyIHNoaW0gPSBnaXZlblByZWZpeCA9PT0gJ2ZhJyA/IGJ5T2xkTmFtZShhY2MuaWNvbk5hbWUpIDoge307XG4gICAgICB2YXIgYWxpYXNJY29uTmFtZSA9IGJ5QWxpYXMoYWNjLnByZWZpeCwgYWNjLmljb25OYW1lKTtcblxuICAgICAgaWYgKHNoaW0ucHJlZml4KSB7XG4gICAgICAgIGdpdmVuUHJlZml4ID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgYWNjLmljb25OYW1lID0gc2hpbS5pY29uTmFtZSB8fCBhbGlhc0ljb25OYW1lIHx8IGFjYy5pY29uTmFtZTtcbiAgICAgIGFjYy5wcmVmaXggPSBzaGltLnByZWZpeCB8fCBhY2MucHJlZml4O1xuXG4gICAgICBpZiAoYWNjLnByZWZpeCA9PT0gJ2ZhcicgJiYgIXN0eWxlc1snZmFyJ10gJiYgc3R5bGVzWydmYXMnXSAmJiAhY29uZmlnLmF1dG9GZXRjaFN2Zykge1xuICAgICAgICAvLyBBbGxvdyBhIGZhbGxiYWNrIGZyb20gdGhlIHJlZ3VsYXIgc3R5bGUgdG8gc29saWQgaWYgcmVndWxhciBpcyBub3QgYXZhaWxhYmxlXG4gICAgICAgIC8vIGJ1dCBvbmx5IGlmIHdlIGFyZW4ndCBhdXRvLWZldGNoaW5nIFNWR3NcbiAgICAgICAgYWNjLnByZWZpeCA9ICdmYXMnO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBhY2M7XG4gIH0sIGVtcHR5Q2Fub25pY2FsSWNvbigpKTtcblxuICBpZiAodmFsdWVzLmluY2x1ZGVzKCdmYS1icmFuZHMnKSB8fCB2YWx1ZXMuaW5jbHVkZXMoJ2ZhYicpKSB7XG4gICAgY2Fub25pY2FsLnByZWZpeCA9ICdmYWInO1xuICB9XG5cbiAgaWYgKHZhbHVlcy5pbmNsdWRlcygnZmEtZHVvdG9uZScpIHx8IHZhbHVlcy5pbmNsdWRlcygnZmFkJykpIHtcbiAgICBjYW5vbmljYWwucHJlZml4ID0gJ2ZhZCc7XG4gIH1cblxuICBpZiAoIWNhbm9uaWNhbC5wcmVmaXggJiYgZmFtaWx5ID09PSBGQU1JTFlfU0hBUlAgJiYgKHN0eWxlc1snZmFzcyddIHx8IGNvbmZpZy5hdXRvRmV0Y2hTdmcpKSB7XG4gICAgY2Fub25pY2FsLnByZWZpeCA9ICdmYXNzJztcbiAgICBjYW5vbmljYWwuaWNvbk5hbWUgPSBieUFsaWFzKGNhbm9uaWNhbC5wcmVmaXgsIGNhbm9uaWNhbC5pY29uTmFtZSkgfHwgY2Fub25pY2FsLmljb25OYW1lO1xuICB9XG5cbiAgaWYgKGNhbm9uaWNhbC5wcmVmaXggPT09ICdmYScgfHwgZ2l2ZW5QcmVmaXggPT09ICdmYScpIHtcbiAgICAvLyBUaGUgZmEgcHJlZml4IGlzIG5vdCBjYW5vbmljYWwuIFNvIGlmIGl0IGhhcyBtYWRlIGl0IHRocm91Z2ggdW50aWwgdGhpcyBwb2ludFxuICAgIC8vIHdlIHdpbGwgc2hpZnQgaXQgdG8gdGhlIGNvcnJlY3QgcHJlZml4LlxuICAgIGNhbm9uaWNhbC5wcmVmaXggPSBnZXREZWZhdWx0VXNhYmxlUHJlZml4KCkgfHwgJ2Zhcyc7XG4gIH1cblxuICByZXR1cm4gY2Fub25pY2FsO1xufVxuXG52YXIgTGlicmFyeSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIExpYnJhcnkoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIExpYnJhcnkpO1xuXG4gICAgdGhpcy5kZWZpbml0aW9ucyA9IHt9O1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKExpYnJhcnksIFt7XG4gICAga2V5OiBcImFkZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGQoKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgZGVmaW5pdGlvbnMgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgIGRlZmluaXRpb25zW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgfVxuXG4gICAgICB2YXIgYWRkaXRpb25zID0gZGVmaW5pdGlvbnMucmVkdWNlKHRoaXMuX3B1bGxEZWZpbml0aW9ucywge30pO1xuICAgICAgT2JqZWN0LmtleXMoYWRkaXRpb25zKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgX3RoaXMuZGVmaW5pdGlvbnNba2V5XSA9IF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBfdGhpcy5kZWZpbml0aW9uc1trZXldIHx8IHt9KSwgYWRkaXRpb25zW2tleV0pO1xuICAgICAgICBkZWZpbmVJY29ucyhrZXksIGFkZGl0aW9uc1trZXldKTsgLy8gVE9ETyBjYW4gd2Ugc3RvcCBkb2luZyB0aGlzPyBXZSBjYW4ndCBnZXQgdGhlIGljb25zIGJ5ICdmYS1zb2xpZCcgYW55IGxvbmdlciBzbyB0aGlzIHByb2JhYmx5IG5lZWRzIHRvIGNoYW5nZVxuXG4gICAgICAgIHZhciBsb25nUHJlZml4ID0gUFJFRklYX1RPX0xPTkdfU1RZTEVbRkFNSUxZX0NMQVNTSUNdW2tleV07XG4gICAgICAgIGlmIChsb25nUHJlZml4KSBkZWZpbmVJY29ucyhsb25nUHJlZml4LCBhZGRpdGlvbnNba2V5XSk7XG4gICAgICAgIGJ1aWxkKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVzZXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVzZXQoKSB7XG4gICAgICB0aGlzLmRlZmluaXRpb25zID0ge307XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9wdWxsRGVmaW5pdGlvbnNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX3B1bGxEZWZpbml0aW9ucyhhZGRpdGlvbnMsIGRlZmluaXRpb24pIHtcbiAgICAgIHZhciBub3JtYWxpemVkID0gZGVmaW5pdGlvbi5wcmVmaXggJiYgZGVmaW5pdGlvbi5pY29uTmFtZSAmJiBkZWZpbml0aW9uLmljb24gPyB7XG4gICAgICAgIDA6IGRlZmluaXRpb25cbiAgICAgIH0gOiBkZWZpbml0aW9uO1xuICAgICAgT2JqZWN0LmtleXMobm9ybWFsaXplZCkubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgdmFyIF9ub3JtYWxpemVkJGtleSA9IG5vcm1hbGl6ZWRba2V5XSxcbiAgICAgICAgICAgIHByZWZpeCA9IF9ub3JtYWxpemVkJGtleS5wcmVmaXgsXG4gICAgICAgICAgICBpY29uTmFtZSA9IF9ub3JtYWxpemVkJGtleS5pY29uTmFtZSxcbiAgICAgICAgICAgIGljb24gPSBfbm9ybWFsaXplZCRrZXkuaWNvbjtcbiAgICAgICAgdmFyIGFsaWFzZXMgPSBpY29uWzJdO1xuICAgICAgICBpZiAoIWFkZGl0aW9uc1twcmVmaXhdKSBhZGRpdGlvbnNbcHJlZml4XSA9IHt9O1xuXG4gICAgICAgIGlmIChhbGlhc2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBhbGlhc2VzLmZvckVhY2goZnVuY3Rpb24gKGFsaWFzKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGFsaWFzID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICBhZGRpdGlvbnNbcHJlZml4XVthbGlhc10gPSBpY29uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgYWRkaXRpb25zW3ByZWZpeF1baWNvbk5hbWVdID0gaWNvbjtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGFkZGl0aW9ucztcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gTGlicmFyeTtcbn0oKTtcblxudmFyIF9wbHVnaW5zID0gW107XG52YXIgX2hvb2tzID0ge307XG52YXIgcHJvdmlkZXJzID0ge307XG52YXIgZGVmYXVsdFByb3ZpZGVyS2V5cyA9IE9iamVjdC5rZXlzKHByb3ZpZGVycyk7XG5mdW5jdGlvbiByZWdpc3RlclBsdWdpbnMobmV4dFBsdWdpbnMsIF9yZWYpIHtcbiAgdmFyIG9iaiA9IF9yZWYubWl4b3V0c1RvO1xuICBfcGx1Z2lucyA9IG5leHRQbHVnaW5zO1xuICBfaG9va3MgPSB7fTtcbiAgT2JqZWN0LmtleXMocHJvdmlkZXJzKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7XG4gICAgaWYgKGRlZmF1bHRQcm92aWRlcktleXMuaW5kZXhPZihrKSA9PT0gLTEpIHtcbiAgICAgIGRlbGV0ZSBwcm92aWRlcnNba107XG4gICAgfVxuICB9KTtcblxuICBfcGx1Z2lucy5mb3JFYWNoKGZ1bmN0aW9uIChwbHVnaW4pIHtcbiAgICB2YXIgbWl4b3V0ID0gcGx1Z2luLm1peG91dCA/IHBsdWdpbi5taXhvdXQoKSA6IHt9O1xuICAgIE9iamVjdC5rZXlzKG1peG91dCkuZm9yRWFjaChmdW5jdGlvbiAodGspIHtcbiAgICAgIGlmICh0eXBlb2YgbWl4b3V0W3RrXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBvYmpbdGtdID0gbWl4b3V0W3RrXTtcbiAgICAgIH1cblxuICAgICAgaWYgKF90eXBlb2YobWl4b3V0W3RrXSkgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIE9iamVjdC5rZXlzKG1peG91dFt0a10pLmZvckVhY2goZnVuY3Rpb24gKHNrKSB7XG4gICAgICAgICAgaWYgKCFvYmpbdGtdKSB7XG4gICAgICAgICAgICBvYmpbdGtdID0ge307XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgb2JqW3RrXVtza10gPSBtaXhvdXRbdGtdW3NrXTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAocGx1Z2luLmhvb2tzKSB7XG4gICAgICB2YXIgaG9va3MgPSBwbHVnaW4uaG9va3MoKTtcbiAgICAgIE9iamVjdC5rZXlzKGhvb2tzKS5mb3JFYWNoKGZ1bmN0aW9uIChob29rKSB7XG4gICAgICAgIGlmICghX2hvb2tzW2hvb2tdKSB7XG4gICAgICAgICAgX2hvb2tzW2hvb2tdID0gW107XG4gICAgICAgIH1cblxuICAgICAgICBfaG9va3NbaG9va10ucHVzaChob29rc1tob29rXSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAocGx1Z2luLnByb3ZpZGVzKSB7XG4gICAgICBwbHVnaW4ucHJvdmlkZXMocHJvdmlkZXJzKTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBvYmo7XG59XG5mdW5jdGlvbiBjaGFpbkhvb2tzKGhvb2ssIGFjY3VtdWxhdG9yKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4gPiAyID8gX2xlbiAtIDIgOiAwKSwgX2tleSA9IDI7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBhcmdzW19rZXkgLSAyXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIHZhciBob29rRm5zID0gX2hvb2tzW2hvb2tdIHx8IFtdO1xuICBob29rRm5zLmZvckVhY2goZnVuY3Rpb24gKGhvb2tGbikge1xuICAgIGFjY3VtdWxhdG9yID0gaG9va0ZuLmFwcGx5KG51bGwsIFthY2N1bXVsYXRvcl0uY29uY2F0KGFyZ3MpKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11c2VsZXNzLWNhbGxcbiAgfSk7XG4gIHJldHVybiBhY2N1bXVsYXRvcjtcbn1cbmZ1bmN0aW9uIGNhbGxIb29rcyhob29rKSB7XG4gIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuMiA+IDEgPyBfbGVuMiAtIDEgOiAwKSwgX2tleTIgPSAxOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgYXJnc1tfa2V5MiAtIDFdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgfVxuXG4gIHZhciBob29rRm5zID0gX2hvb2tzW2hvb2tdIHx8IFtdO1xuICBob29rRm5zLmZvckVhY2goZnVuY3Rpb24gKGhvb2tGbikge1xuICAgIGhvb2tGbi5hcHBseShudWxsLCBhcmdzKTtcbiAgfSk7XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5mdW5jdGlvbiBjYWxsUHJvdmlkZWQoKSB7XG4gIHZhciBob29rID0gYXJndW1lbnRzWzBdO1xuICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gIHJldHVybiBwcm92aWRlcnNbaG9va10gPyBwcm92aWRlcnNbaG9va10uYXBwbHkobnVsbCwgYXJncykgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGZpbmRJY29uRGVmaW5pdGlvbihpY29uTG9va3VwKSB7XG4gIGlmIChpY29uTG9va3VwLnByZWZpeCA9PT0gJ2ZhJykge1xuICAgIGljb25Mb29rdXAucHJlZml4ID0gJ2Zhcyc7XG4gIH1cblxuICB2YXIgaWNvbk5hbWUgPSBpY29uTG9va3VwLmljb25OYW1lO1xuICB2YXIgcHJlZml4ID0gaWNvbkxvb2t1cC5wcmVmaXggfHwgZ2V0RGVmYXVsdFVzYWJsZVByZWZpeCgpO1xuICBpZiAoIWljb25OYW1lKSByZXR1cm47XG4gIGljb25OYW1lID0gYnlBbGlhcyhwcmVmaXgsIGljb25OYW1lKSB8fCBpY29uTmFtZTtcbiAgcmV0dXJuIGljb25Gcm9tTWFwcGluZyhsaWJyYXJ5LmRlZmluaXRpb25zLCBwcmVmaXgsIGljb25OYW1lKSB8fCBpY29uRnJvbU1hcHBpbmcobmFtZXNwYWNlLnN0eWxlcywgcHJlZml4LCBpY29uTmFtZSk7XG59XG52YXIgbGlicmFyeSA9IG5ldyBMaWJyYXJ5KCk7XG52YXIgbm9BdXRvID0gZnVuY3Rpb24gbm9BdXRvKCkge1xuICBjb25maWcuYXV0b1JlcGxhY2VTdmcgPSBmYWxzZTtcbiAgY29uZmlnLm9ic2VydmVNdXRhdGlvbnMgPSBmYWxzZTtcbiAgY2FsbEhvb2tzKCdub0F1dG8nKTtcbn07XG52YXIgZG9tID0ge1xuICBpMnN2ZzogZnVuY3Rpb24gaTJzdmcoKSB7XG4gICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICBpZiAoSVNfRE9NKSB7XG4gICAgICBjYWxsSG9va3MoJ2JlZm9yZUkyc3ZnJywgcGFyYW1zKTtcbiAgICAgIGNhbGxQcm92aWRlZCgncHNldWRvRWxlbWVudHMyc3ZnJywgcGFyYW1zKTtcbiAgICAgIHJldHVybiBjYWxsUHJvdmlkZWQoJ2kyc3ZnJywgcGFyYW1zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KCdPcGVyYXRpb24gcmVxdWlyZXMgYSBET00gb2Ygc29tZSBraW5kLicpO1xuICAgIH1cbiAgfSxcbiAgd2F0Y2g6IGZ1bmN0aW9uIHdhdGNoKCkge1xuICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgIHZhciBhdXRvUmVwbGFjZVN2Z1Jvb3QgPSBwYXJhbXMuYXV0b1JlcGxhY2VTdmdSb290O1xuXG4gICAgaWYgKGNvbmZpZy5hdXRvUmVwbGFjZVN2ZyA9PT0gZmFsc2UpIHtcbiAgICAgIGNvbmZpZy5hdXRvUmVwbGFjZVN2ZyA9IHRydWU7XG4gICAgfVxuXG4gICAgY29uZmlnLm9ic2VydmVNdXRhdGlvbnMgPSB0cnVlO1xuICAgIGRvbXJlYWR5KGZ1bmN0aW9uICgpIHtcbiAgICAgIGF1dG9SZXBsYWNlKHtcbiAgICAgICAgYXV0b1JlcGxhY2VTdmdSb290OiBhdXRvUmVwbGFjZVN2Z1Jvb3RcbiAgICAgIH0pO1xuICAgICAgY2FsbEhvb2tzKCd3YXRjaCcsIHBhcmFtcyk7XG4gICAgfSk7XG4gIH1cbn07XG52YXIgcGFyc2UgPSB7XG4gIGljb246IGZ1bmN0aW9uIGljb24oX2ljb24pIHtcbiAgICBpZiAoX2ljb24gPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChfdHlwZW9mKF9pY29uKSA9PT0gJ29iamVjdCcgJiYgX2ljb24ucHJlZml4ICYmIF9pY29uLmljb25OYW1lKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwcmVmaXg6IF9pY29uLnByZWZpeCxcbiAgICAgICAgaWNvbk5hbWU6IGJ5QWxpYXMoX2ljb24ucHJlZml4LCBfaWNvbi5pY29uTmFtZSkgfHwgX2ljb24uaWNvbk5hbWVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoX2ljb24pICYmIF9pY29uLmxlbmd0aCA9PT0gMikge1xuICAgICAgdmFyIGljb25OYW1lID0gX2ljb25bMV0uaW5kZXhPZignZmEtJykgPT09IDAgPyBfaWNvblsxXS5zbGljZSgzKSA6IF9pY29uWzFdO1xuICAgICAgdmFyIHByZWZpeCA9IGdldENhbm9uaWNhbFByZWZpeChfaWNvblswXSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwcmVmaXg6IHByZWZpeCxcbiAgICAgICAgaWNvbk5hbWU6IGJ5QWxpYXMocHJlZml4LCBpY29uTmFtZSkgfHwgaWNvbk5hbWVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBfaWNvbiA9PT0gJ3N0cmluZycgJiYgKF9pY29uLmluZGV4T2YoXCJcIi5jb25jYXQoY29uZmlnLmNzc1ByZWZpeCwgXCItXCIpKSA+IC0xIHx8IF9pY29uLm1hdGNoKElDT05fU0VMRUNUSU9OX1NZTlRBWF9QQVRURVJOKSkpIHtcbiAgICAgIHZhciBjYW5vbmljYWxJY29uID0gZ2V0Q2Fub25pY2FsSWNvbihfaWNvbi5zcGxpdCgnICcpLCB7XG4gICAgICAgIHNraXBMb29rdXBzOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHByZWZpeDogY2Fub25pY2FsSWNvbi5wcmVmaXggfHwgZ2V0RGVmYXVsdFVzYWJsZVByZWZpeCgpLFxuICAgICAgICBpY29uTmFtZTogYnlBbGlhcyhjYW5vbmljYWxJY29uLnByZWZpeCwgY2Fub25pY2FsSWNvbi5pY29uTmFtZSkgfHwgY2Fub25pY2FsSWNvbi5pY29uTmFtZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIF9pY29uID09PSAnc3RyaW5nJykge1xuICAgICAgdmFyIF9wcmVmaXggPSBnZXREZWZhdWx0VXNhYmxlUHJlZml4KCk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHByZWZpeDogX3ByZWZpeCxcbiAgICAgICAgaWNvbk5hbWU6IGJ5QWxpYXMoX3ByZWZpeCwgX2ljb24pIHx8IF9pY29uXG4gICAgICB9O1xuICAgIH1cbiAgfVxufTtcbnZhciBhcGkgPSB7XG4gIG5vQXV0bzogbm9BdXRvLFxuICBjb25maWc6IGNvbmZpZyxcbiAgZG9tOiBkb20sXG4gIHBhcnNlOiBwYXJzZSxcbiAgbGlicmFyeTogbGlicmFyeSxcbiAgZmluZEljb25EZWZpbml0aW9uOiBmaW5kSWNvbkRlZmluaXRpb24sXG4gIHRvSHRtbDogdG9IdG1sXG59O1xuXG52YXIgYXV0b1JlcGxhY2UgPSBmdW5jdGlvbiBhdXRvUmVwbGFjZSgpIHtcbiAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gIHZhciBfcGFyYW1zJGF1dG9SZXBsYWNlU3YgPSBwYXJhbXMuYXV0b1JlcGxhY2VTdmdSb290LFxuICAgICAgYXV0b1JlcGxhY2VTdmdSb290ID0gX3BhcmFtcyRhdXRvUmVwbGFjZVN2ID09PSB2b2lkIDAgPyBET0NVTUVOVCA6IF9wYXJhbXMkYXV0b1JlcGxhY2VTdjtcbiAgaWYgKChPYmplY3Qua2V5cyhuYW1lc3BhY2Uuc3R5bGVzKS5sZW5ndGggPiAwIHx8IGNvbmZpZy5hdXRvRmV0Y2hTdmcpICYmIElTX0RPTSAmJiBjb25maWcuYXV0b1JlcGxhY2VTdmcpIGFwaS5kb20uaTJzdmcoe1xuICAgIG5vZGU6IGF1dG9SZXBsYWNlU3ZnUm9vdFxuICB9KTtcbn07XG5cbmZ1bmN0aW9uIGRvbVZhcmlhbnRzKHZhbCwgYWJzdHJhY3RDcmVhdG9yKSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh2YWwsICdhYnN0cmFjdCcsIHtcbiAgICBnZXQ6IGFic3RyYWN0Q3JlYXRvclxuICB9KTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHZhbCwgJ2h0bWwnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdmFsLmFic3RyYWN0Lm1hcChmdW5jdGlvbiAoYSkge1xuICAgICAgICByZXR1cm4gdG9IdG1sKGEpO1xuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHZhbCwgJ25vZGUnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICBpZiAoIUlTX0RPTSkgcmV0dXJuO1xuICAgICAgdmFyIGNvbnRhaW5lciA9IERPQ1VNRU5ULmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IHZhbC5odG1sO1xuICAgICAgcmV0dXJuIGNvbnRhaW5lci5jaGlsZHJlbjtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gdmFsO1xufVxuXG5mdW5jdGlvbiBhc0ljb24gKF9yZWYpIHtcbiAgdmFyIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbixcbiAgICAgIG1haW4gPSBfcmVmLm1haW4sXG4gICAgICBtYXNrID0gX3JlZi5tYXNrLFxuICAgICAgYXR0cmlidXRlcyA9IF9yZWYuYXR0cmlidXRlcyxcbiAgICAgIHN0eWxlcyA9IF9yZWYuc3R5bGVzLFxuICAgICAgdHJhbnNmb3JtID0gX3JlZi50cmFuc2Zvcm07XG5cbiAgaWYgKHRyYW5zZm9ybUlzTWVhbmluZ2Z1bCh0cmFuc2Zvcm0pICYmIG1haW4uZm91bmQgJiYgIW1hc2suZm91bmQpIHtcbiAgICB2YXIgd2lkdGggPSBtYWluLndpZHRoLFxuICAgICAgICBoZWlnaHQgPSBtYWluLmhlaWdodDtcbiAgICB2YXIgb2Zmc2V0ID0ge1xuICAgICAgeDogd2lkdGggLyBoZWlnaHQgLyAyLFxuICAgICAgeTogMC41XG4gICAgfTtcbiAgICBhdHRyaWJ1dGVzWydzdHlsZSddID0gam9pblN0eWxlcyhfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgc3R5bGVzKSwge30sIHtcbiAgICAgICd0cmFuc2Zvcm0tb3JpZ2luJzogXCJcIi5jb25jYXQob2Zmc2V0LnggKyB0cmFuc2Zvcm0ueCAvIDE2LCBcImVtIFwiKS5jb25jYXQob2Zmc2V0LnkgKyB0cmFuc2Zvcm0ueSAvIDE2LCBcImVtXCIpXG4gICAgfSkpO1xuICB9XG5cbiAgcmV0dXJuIFt7XG4gICAgdGFnOiAnc3ZnJyxcbiAgICBhdHRyaWJ1dGVzOiBhdHRyaWJ1dGVzLFxuICAgIGNoaWxkcmVuOiBjaGlsZHJlblxuICB9XTtcbn1cblxuZnVuY3Rpb24gYXNTeW1ib2wgKF9yZWYpIHtcbiAgdmFyIHByZWZpeCA9IF9yZWYucHJlZml4LFxuICAgICAgaWNvbk5hbWUgPSBfcmVmLmljb25OYW1lLFxuICAgICAgY2hpbGRyZW4gPSBfcmVmLmNoaWxkcmVuLFxuICAgICAgYXR0cmlidXRlcyA9IF9yZWYuYXR0cmlidXRlcyxcbiAgICAgIHN5bWJvbCA9IF9yZWYuc3ltYm9sO1xuICB2YXIgaWQgPSBzeW1ib2wgPT09IHRydWUgPyBcIlwiLmNvbmNhdChwcmVmaXgsIFwiLVwiKS5jb25jYXQoY29uZmlnLmNzc1ByZWZpeCwgXCItXCIpLmNvbmNhdChpY29uTmFtZSkgOiBzeW1ib2w7XG4gIHJldHVybiBbe1xuICAgIHRhZzogJ3N2ZycsXG4gICAgYXR0cmlidXRlczoge1xuICAgICAgc3R5bGU6ICdkaXNwbGF5OiBub25lOydcbiAgICB9LFxuICAgIGNoaWxkcmVuOiBbe1xuICAgICAgdGFnOiAnc3ltYm9sJyxcbiAgICAgIGF0dHJpYnV0ZXM6IF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBhdHRyaWJ1dGVzKSwge30sIHtcbiAgICAgICAgaWQ6IGlkXG4gICAgICB9KSxcbiAgICAgIGNoaWxkcmVuOiBjaGlsZHJlblxuICAgIH1dXG4gIH1dO1xufVxuXG5mdW5jdGlvbiBtYWtlSW5saW5lU3ZnQWJzdHJhY3QocGFyYW1zKSB7XG4gIHZhciBfcGFyYW1zJGljb25zID0gcGFyYW1zLmljb25zLFxuICAgICAgbWFpbiA9IF9wYXJhbXMkaWNvbnMubWFpbixcbiAgICAgIG1hc2sgPSBfcGFyYW1zJGljb25zLm1hc2ssXG4gICAgICBwcmVmaXggPSBwYXJhbXMucHJlZml4LFxuICAgICAgaWNvbk5hbWUgPSBwYXJhbXMuaWNvbk5hbWUsXG4gICAgICB0cmFuc2Zvcm0gPSBwYXJhbXMudHJhbnNmb3JtLFxuICAgICAgc3ltYm9sID0gcGFyYW1zLnN5bWJvbCxcbiAgICAgIHRpdGxlID0gcGFyYW1zLnRpdGxlLFxuICAgICAgbWFza0lkID0gcGFyYW1zLm1hc2tJZCxcbiAgICAgIHRpdGxlSWQgPSBwYXJhbXMudGl0bGVJZCxcbiAgICAgIGV4dHJhID0gcGFyYW1zLmV4dHJhLFxuICAgICAgX3BhcmFtcyR3YXRjaGFibGUgPSBwYXJhbXMud2F0Y2hhYmxlLFxuICAgICAgd2F0Y2hhYmxlID0gX3BhcmFtcyR3YXRjaGFibGUgPT09IHZvaWQgMCA/IGZhbHNlIDogX3BhcmFtcyR3YXRjaGFibGU7XG5cbiAgdmFyIF9yZWYgPSBtYXNrLmZvdW5kID8gbWFzayA6IG1haW4sXG4gICAgICB3aWR0aCA9IF9yZWYud2lkdGgsXG4gICAgICBoZWlnaHQgPSBfcmVmLmhlaWdodDtcblxuICB2YXIgaXNVcGxvYWRlZEljb24gPSBwcmVmaXggPT09ICdmYWsnO1xuICB2YXIgYXR0ckNsYXNzID0gW2NvbmZpZy5yZXBsYWNlbWVudENsYXNzLCBpY29uTmFtZSA/IFwiXCIuY29uY2F0KGNvbmZpZy5jc3NQcmVmaXgsIFwiLVwiKS5jb25jYXQoaWNvbk5hbWUpIDogJyddLmZpbHRlcihmdW5jdGlvbiAoYykge1xuICAgIHJldHVybiBleHRyYS5jbGFzc2VzLmluZGV4T2YoYykgPT09IC0xO1xuICB9KS5maWx0ZXIoZnVuY3Rpb24gKGMpIHtcbiAgICByZXR1cm4gYyAhPT0gJycgfHwgISFjO1xuICB9KS5jb25jYXQoZXh0cmEuY2xhc3Nlcykuam9pbignICcpO1xuICB2YXIgY29udGVudCA9IHtcbiAgICBjaGlsZHJlbjogW10sXG4gICAgYXR0cmlidXRlczogX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIGV4dHJhLmF0dHJpYnV0ZXMpLCB7fSwge1xuICAgICAgJ2RhdGEtcHJlZml4JzogcHJlZml4LFxuICAgICAgJ2RhdGEtaWNvbic6IGljb25OYW1lLFxuICAgICAgJ2NsYXNzJzogYXR0ckNsYXNzLFxuICAgICAgJ3JvbGUnOiBleHRyYS5hdHRyaWJ1dGVzLnJvbGUgfHwgJ2ltZycsXG4gICAgICAneG1sbnMnOiAnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLFxuICAgICAgJ3ZpZXdCb3gnOiBcIjAgMCBcIi5jb25jYXQod2lkdGgsIFwiIFwiKS5jb25jYXQoaGVpZ2h0KVxuICAgIH0pXG4gIH07XG4gIHZhciB1cGxvYWRlZEljb25XaWR0aFN0eWxlID0gaXNVcGxvYWRlZEljb24gJiYgIX5leHRyYS5jbGFzc2VzLmluZGV4T2YoJ2ZhLWZ3JykgPyB7XG4gICAgd2lkdGg6IFwiXCIuY29uY2F0KHdpZHRoIC8gaGVpZ2h0ICogMTYgKiAwLjA2MjUsIFwiZW1cIilcbiAgfSA6IHt9O1xuXG4gIGlmICh3YXRjaGFibGUpIHtcbiAgICBjb250ZW50LmF0dHJpYnV0ZXNbREFUQV9GQV9JMlNWR10gPSAnJztcbiAgfVxuXG4gIGlmICh0aXRsZSkge1xuICAgIGNvbnRlbnQuY2hpbGRyZW4ucHVzaCh7XG4gICAgICB0YWc6ICd0aXRsZScsXG4gICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgIGlkOiBjb250ZW50LmF0dHJpYnV0ZXNbJ2FyaWEtbGFiZWxsZWRieSddIHx8IFwidGl0bGUtXCIuY29uY2F0KHRpdGxlSWQgfHwgbmV4dFVuaXF1ZUlkKCkpXG4gICAgICB9LFxuICAgICAgY2hpbGRyZW46IFt0aXRsZV1cbiAgICB9KTtcbiAgICBkZWxldGUgY29udGVudC5hdHRyaWJ1dGVzLnRpdGxlO1xuICB9XG5cbiAgdmFyIGFyZ3MgPSBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgY29udGVudCksIHt9LCB7XG4gICAgcHJlZml4OiBwcmVmaXgsXG4gICAgaWNvbk5hbWU6IGljb25OYW1lLFxuICAgIG1haW46IG1haW4sXG4gICAgbWFzazogbWFzayxcbiAgICBtYXNrSWQ6IG1hc2tJZCxcbiAgICB0cmFuc2Zvcm06IHRyYW5zZm9ybSxcbiAgICBzeW1ib2w6IHN5bWJvbCxcbiAgICBzdHlsZXM6IF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCB1cGxvYWRlZEljb25XaWR0aFN0eWxlKSwgZXh0cmEuc3R5bGVzKVxuICB9KTtcblxuICB2YXIgX3JlZjIgPSBtYXNrLmZvdW5kICYmIG1haW4uZm91bmQgPyBjYWxsUHJvdmlkZWQoJ2dlbmVyYXRlQWJzdHJhY3RNYXNrJywgYXJncykgfHwge1xuICAgIGNoaWxkcmVuOiBbXSxcbiAgICBhdHRyaWJ1dGVzOiB7fVxuICB9IDogY2FsbFByb3ZpZGVkKCdnZW5lcmF0ZUFic3RyYWN0SWNvbicsIGFyZ3MpIHx8IHtcbiAgICBjaGlsZHJlbjogW10sXG4gICAgYXR0cmlidXRlczoge31cbiAgfSxcbiAgICAgIGNoaWxkcmVuID0gX3JlZjIuY2hpbGRyZW4sXG4gICAgICBhdHRyaWJ1dGVzID0gX3JlZjIuYXR0cmlidXRlcztcblxuICBhcmdzLmNoaWxkcmVuID0gY2hpbGRyZW47XG4gIGFyZ3MuYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7XG5cbiAgaWYgKHN5bWJvbCkge1xuICAgIHJldHVybiBhc1N5bWJvbChhcmdzKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYXNJY29uKGFyZ3MpO1xuICB9XG59XG5mdW5jdGlvbiBtYWtlTGF5ZXJzVGV4dEFic3RyYWN0KHBhcmFtcykge1xuICB2YXIgY29udGVudCA9IHBhcmFtcy5jb250ZW50LFxuICAgICAgd2lkdGggPSBwYXJhbXMud2lkdGgsXG4gICAgICBoZWlnaHQgPSBwYXJhbXMuaGVpZ2h0LFxuICAgICAgdHJhbnNmb3JtID0gcGFyYW1zLnRyYW5zZm9ybSxcbiAgICAgIHRpdGxlID0gcGFyYW1zLnRpdGxlLFxuICAgICAgZXh0cmEgPSBwYXJhbXMuZXh0cmEsXG4gICAgICBfcGFyYW1zJHdhdGNoYWJsZTIgPSBwYXJhbXMud2F0Y2hhYmxlLFxuICAgICAgd2F0Y2hhYmxlID0gX3BhcmFtcyR3YXRjaGFibGUyID09PSB2b2lkIDAgPyBmYWxzZSA6IF9wYXJhbXMkd2F0Y2hhYmxlMjtcblxuICB2YXIgYXR0cmlidXRlcyA9IF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBleHRyYS5hdHRyaWJ1dGVzKSwgdGl0bGUgPyB7XG4gICAgJ3RpdGxlJzogdGl0bGVcbiAgfSA6IHt9KSwge30sIHtcbiAgICAnY2xhc3MnOiBleHRyYS5jbGFzc2VzLmpvaW4oJyAnKVxuICB9KTtcblxuICBpZiAod2F0Y2hhYmxlKSB7XG4gICAgYXR0cmlidXRlc1tEQVRBX0ZBX0kyU1ZHXSA9ICcnO1xuICB9XG5cbiAgdmFyIHN0eWxlcyA9IF9vYmplY3RTcHJlYWQyKHt9LCBleHRyYS5zdHlsZXMpO1xuXG4gIGlmICh0cmFuc2Zvcm1Jc01lYW5pbmdmdWwodHJhbnNmb3JtKSkge1xuICAgIHN0eWxlc1sndHJhbnNmb3JtJ10gPSB0cmFuc2Zvcm1Gb3JDc3Moe1xuICAgICAgdHJhbnNmb3JtOiB0cmFuc2Zvcm0sXG4gICAgICBzdGFydENlbnRlcmVkOiB0cnVlLFxuICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgaGVpZ2h0OiBoZWlnaHRcbiAgICB9KTtcbiAgICBzdHlsZXNbJy13ZWJraXQtdHJhbnNmb3JtJ10gPSBzdHlsZXNbJ3RyYW5zZm9ybSddO1xuICB9XG5cbiAgdmFyIHN0eWxlU3RyaW5nID0gam9pblN0eWxlcyhzdHlsZXMpO1xuXG4gIGlmIChzdHlsZVN0cmluZy5sZW5ndGggPiAwKSB7XG4gICAgYXR0cmlidXRlc1snc3R5bGUnXSA9IHN0eWxlU3RyaW5nO1xuICB9XG5cbiAgdmFyIHZhbCA9IFtdO1xuICB2YWwucHVzaCh7XG4gICAgdGFnOiAnc3BhbicsXG4gICAgYXR0cmlidXRlczogYXR0cmlidXRlcyxcbiAgICBjaGlsZHJlbjogW2NvbnRlbnRdXG4gIH0pO1xuXG4gIGlmICh0aXRsZSkge1xuICAgIHZhbC5wdXNoKHtcbiAgICAgIHRhZzogJ3NwYW4nLFxuICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICBjbGFzczogJ3NyLW9ubHknXG4gICAgICB9LFxuICAgICAgY2hpbGRyZW46IFt0aXRsZV1cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB2YWw7XG59XG5mdW5jdGlvbiBtYWtlTGF5ZXJzQ291bnRlckFic3RyYWN0KHBhcmFtcykge1xuICB2YXIgY29udGVudCA9IHBhcmFtcy5jb250ZW50LFxuICAgICAgdGl0bGUgPSBwYXJhbXMudGl0bGUsXG4gICAgICBleHRyYSA9IHBhcmFtcy5leHRyYTtcblxuICB2YXIgYXR0cmlidXRlcyA9IF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBleHRyYS5hdHRyaWJ1dGVzKSwgdGl0bGUgPyB7XG4gICAgJ3RpdGxlJzogdGl0bGVcbiAgfSA6IHt9KSwge30sIHtcbiAgICAnY2xhc3MnOiBleHRyYS5jbGFzc2VzLmpvaW4oJyAnKVxuICB9KTtcblxuICB2YXIgc3R5bGVTdHJpbmcgPSBqb2luU3R5bGVzKGV4dHJhLnN0eWxlcyk7XG5cbiAgaWYgKHN0eWxlU3RyaW5nLmxlbmd0aCA+IDApIHtcbiAgICBhdHRyaWJ1dGVzWydzdHlsZSddID0gc3R5bGVTdHJpbmc7XG4gIH1cblxuICB2YXIgdmFsID0gW107XG4gIHZhbC5wdXNoKHtcbiAgICB0YWc6ICdzcGFuJyxcbiAgICBhdHRyaWJ1dGVzOiBhdHRyaWJ1dGVzLFxuICAgIGNoaWxkcmVuOiBbY29udGVudF1cbiAgfSk7XG5cbiAgaWYgKHRpdGxlKSB7XG4gICAgdmFsLnB1c2goe1xuICAgICAgdGFnOiAnc3BhbicsXG4gICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgIGNsYXNzOiAnc3Itb25seSdcbiAgICAgIH0sXG4gICAgICBjaGlsZHJlbjogW3RpdGxlXVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHZhbDtcbn1cblxudmFyIHN0eWxlcyQxID0gbmFtZXNwYWNlLnN0eWxlcztcbmZ1bmN0aW9uIGFzRm91bmRJY29uKGljb24pIHtcbiAgdmFyIHdpZHRoID0gaWNvblswXTtcbiAgdmFyIGhlaWdodCA9IGljb25bMV07XG5cbiAgdmFyIF9pY29uJHNsaWNlID0gaWNvbi5zbGljZSg0KSxcbiAgICAgIF9pY29uJHNsaWNlMiA9IF9zbGljZWRUb0FycmF5KF9pY29uJHNsaWNlLCAxKSxcbiAgICAgIHZlY3RvckRhdGEgPSBfaWNvbiRzbGljZTJbMF07XG5cbiAgdmFyIGVsZW1lbnQgPSBudWxsO1xuXG4gIGlmIChBcnJheS5pc0FycmF5KHZlY3RvckRhdGEpKSB7XG4gICAgZWxlbWVudCA9IHtcbiAgICAgIHRhZzogJ2cnLFxuICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICBjbGFzczogXCJcIi5jb25jYXQoY29uZmlnLmNzc1ByZWZpeCwgXCItXCIpLmNvbmNhdChEVU9UT05FX0NMQVNTRVMuR1JPVVApXG4gICAgICB9LFxuICAgICAgY2hpbGRyZW46IFt7XG4gICAgICAgIHRhZzogJ3BhdGgnLFxuICAgICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgY2xhc3M6IFwiXCIuY29uY2F0KGNvbmZpZy5jc3NQcmVmaXgsIFwiLVwiKS5jb25jYXQoRFVPVE9ORV9DTEFTU0VTLlNFQ09OREFSWSksXG4gICAgICAgICAgZmlsbDogJ2N1cnJlbnRDb2xvcicsXG4gICAgICAgICAgZDogdmVjdG9yRGF0YVswXVxuICAgICAgICB9XG4gICAgICB9LCB7XG4gICAgICAgIHRhZzogJ3BhdGgnLFxuICAgICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgY2xhc3M6IFwiXCIuY29uY2F0KGNvbmZpZy5jc3NQcmVmaXgsIFwiLVwiKS5jb25jYXQoRFVPVE9ORV9DTEFTU0VTLlBSSU1BUlkpLFxuICAgICAgICAgIGZpbGw6ICdjdXJyZW50Q29sb3InLFxuICAgICAgICAgIGQ6IHZlY3RvckRhdGFbMV1cbiAgICAgICAgfVxuICAgICAgfV1cbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIGVsZW1lbnQgPSB7XG4gICAgICB0YWc6ICdwYXRoJyxcbiAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgZmlsbDogJ2N1cnJlbnRDb2xvcicsXG4gICAgICAgIGQ6IHZlY3RvckRhdGFcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBmb3VuZDogdHJ1ZSxcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgaWNvbjogZWxlbWVudFxuICB9O1xufVxudmFyIG1pc3NpbmdJY29uUmVzb2x1dGlvbk1peGluID0ge1xuICBmb3VuZDogZmFsc2UsXG4gIHdpZHRoOiA1MTIsXG4gIGhlaWdodDogNTEyXG59O1xuXG5mdW5jdGlvbiBtYXliZU5vdGlmeU1pc3NpbmcoaWNvbk5hbWUsIHByZWZpeCkge1xuICBpZiAoIVBST0RVQ1RJT04gJiYgIWNvbmZpZy5zaG93TWlzc2luZ0ljb25zICYmIGljb25OYW1lKSB7XG4gICAgY29uc29sZS5lcnJvcihcIkljb24gd2l0aCBuYW1lIFxcXCJcIi5jb25jYXQoaWNvbk5hbWUsIFwiXFxcIiBhbmQgcHJlZml4IFxcXCJcIikuY29uY2F0KHByZWZpeCwgXCJcXFwiIGlzIG1pc3NpbmcuXCIpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kSWNvbihpY29uTmFtZSwgcHJlZml4KSB7XG4gIHZhciBnaXZlblByZWZpeCA9IHByZWZpeDtcblxuICBpZiAocHJlZml4ID09PSAnZmEnICYmIGNvbmZpZy5zdHlsZURlZmF1bHQgIT09IG51bGwpIHtcbiAgICBwcmVmaXggPSBnZXREZWZhdWx0VXNhYmxlUHJlZml4KCk7XG4gIH1cblxuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgIHZhciB2YWwgPSB7XG4gICAgICBmb3VuZDogZmFsc2UsXG4gICAgICB3aWR0aDogNTEyLFxuICAgICAgaGVpZ2h0OiA1MTIsXG4gICAgICBpY29uOiBjYWxsUHJvdmlkZWQoJ21pc3NpbmdJY29uQWJzdHJhY3QnKSB8fCB7fVxuICAgIH07XG5cbiAgICBpZiAoZ2l2ZW5QcmVmaXggPT09ICdmYScpIHtcbiAgICAgIHZhciBzaGltID0gYnlPbGROYW1lKGljb25OYW1lKSB8fCB7fTtcbiAgICAgIGljb25OYW1lID0gc2hpbS5pY29uTmFtZSB8fCBpY29uTmFtZTtcbiAgICAgIHByZWZpeCA9IHNoaW0ucHJlZml4IHx8IHByZWZpeDtcbiAgICB9XG5cbiAgICBpZiAoaWNvbk5hbWUgJiYgcHJlZml4ICYmIHN0eWxlcyQxW3ByZWZpeF0gJiYgc3R5bGVzJDFbcHJlZml4XVtpY29uTmFtZV0pIHtcbiAgICAgIHZhciBpY29uID0gc3R5bGVzJDFbcHJlZml4XVtpY29uTmFtZV07XG4gICAgICByZXR1cm4gcmVzb2x2ZShhc0ZvdW5kSWNvbihpY29uKSk7XG4gICAgfVxuXG4gICAgbWF5YmVOb3RpZnlNaXNzaW5nKGljb25OYW1lLCBwcmVmaXgpO1xuICAgIHJlc29sdmUoX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIG1pc3NpbmdJY29uUmVzb2x1dGlvbk1peGluKSwge30sIHtcbiAgICAgIGljb246IGNvbmZpZy5zaG93TWlzc2luZ0ljb25zICYmIGljb25OYW1lID8gY2FsbFByb3ZpZGVkKCdtaXNzaW5nSWNvbkFic3RyYWN0JykgfHwge30gOiB7fVxuICAgIH0pKTtcbiAgfSk7XG59XG5cbnZhciBub29wJDEgPSBmdW5jdGlvbiBub29wKCkge307XG5cbnZhciBwID0gY29uZmlnLm1lYXN1cmVQZXJmb3JtYW5jZSAmJiBQRVJGT1JNQU5DRSAmJiBQRVJGT1JNQU5DRS5tYXJrICYmIFBFUkZPUk1BTkNFLm1lYXN1cmUgPyBQRVJGT1JNQU5DRSA6IHtcbiAgbWFyazogbm9vcCQxLFxuICBtZWFzdXJlOiBub29wJDFcbn07XG52YXIgcHJlYW1ibGUgPSBcIkZBIFxcXCI2LjUuMVxcXCJcIjtcblxudmFyIGJlZ2luID0gZnVuY3Rpb24gYmVnaW4obmFtZSkge1xuICBwLm1hcmsoXCJcIi5jb25jYXQocHJlYW1ibGUsIFwiIFwiKS5jb25jYXQobmFtZSwgXCIgYmVnaW5zXCIpKTtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZW5kKG5hbWUpO1xuICB9O1xufTtcblxudmFyIGVuZCA9IGZ1bmN0aW9uIGVuZChuYW1lKSB7XG4gIHAubWFyayhcIlwiLmNvbmNhdChwcmVhbWJsZSwgXCIgXCIpLmNvbmNhdChuYW1lLCBcIiBlbmRzXCIpKTtcbiAgcC5tZWFzdXJlKFwiXCIuY29uY2F0KHByZWFtYmxlLCBcIiBcIikuY29uY2F0KG5hbWUpLCBcIlwiLmNvbmNhdChwcmVhbWJsZSwgXCIgXCIpLmNvbmNhdChuYW1lLCBcIiBiZWdpbnNcIiksIFwiXCIuY29uY2F0KHByZWFtYmxlLCBcIiBcIikuY29uY2F0KG5hbWUsIFwiIGVuZHNcIikpO1xufTtcblxudmFyIHBlcmYgPSB7XG4gIGJlZ2luOiBiZWdpbixcbiAgZW5kOiBlbmRcbn07XG5cbnZhciBub29wJDIgPSBmdW5jdGlvbiBub29wKCkge307XG5cbmZ1bmN0aW9uIGlzV2F0Y2hlZChub2RlKSB7XG4gIHZhciBpMnN2ZyA9IG5vZGUuZ2V0QXR0cmlidXRlID8gbm9kZS5nZXRBdHRyaWJ1dGUoREFUQV9GQV9JMlNWRykgOiBudWxsO1xuICByZXR1cm4gdHlwZW9mIGkyc3ZnID09PSAnc3RyaW5nJztcbn1cblxuZnVuY3Rpb24gaGFzUHJlZml4QW5kSWNvbihub2RlKSB7XG4gIHZhciBwcmVmaXggPSBub2RlLmdldEF0dHJpYnV0ZSA/IG5vZGUuZ2V0QXR0cmlidXRlKERBVEFfUFJFRklYKSA6IG51bGw7XG4gIHZhciBpY29uID0gbm9kZS5nZXRBdHRyaWJ1dGUgPyBub2RlLmdldEF0dHJpYnV0ZShEQVRBX0lDT04pIDogbnVsbDtcbiAgcmV0dXJuIHByZWZpeCAmJiBpY29uO1xufVxuXG5mdW5jdGlvbiBoYXNCZWVuUmVwbGFjZWQobm9kZSkge1xuICByZXR1cm4gbm9kZSAmJiBub2RlLmNsYXNzTGlzdCAmJiBub2RlLmNsYXNzTGlzdC5jb250YWlucyAmJiBub2RlLmNsYXNzTGlzdC5jb250YWlucyhjb25maWcucmVwbGFjZW1lbnRDbGFzcyk7XG59XG5cbmZ1bmN0aW9uIGdldE11dGF0b3IoKSB7XG4gIGlmIChjb25maWcuYXV0b1JlcGxhY2VTdmcgPT09IHRydWUpIHtcbiAgICByZXR1cm4gbXV0YXRvcnMucmVwbGFjZTtcbiAgfVxuXG4gIHZhciBtdXRhdG9yID0gbXV0YXRvcnNbY29uZmlnLmF1dG9SZXBsYWNlU3ZnXTtcbiAgcmV0dXJuIG11dGF0b3IgfHwgbXV0YXRvcnMucmVwbGFjZTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRWxlbWVudE5TKHRhZykge1xuICByZXR1cm4gRE9DVU1FTlQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsIHRhZyk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQodGFnKSB7XG4gIHJldHVybiBET0NVTUVOVC5jcmVhdGVFbGVtZW50KHRhZyk7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRTVkcoYWJzdHJhY3RPYmopIHtcbiAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gIHZhciBfcGFyYW1zJGNlRm4gPSBwYXJhbXMuY2VGbixcbiAgICAgIGNlRm4gPSBfcGFyYW1zJGNlRm4gPT09IHZvaWQgMCA/IGFic3RyYWN0T2JqLnRhZyA9PT0gJ3N2ZycgPyBjcmVhdGVFbGVtZW50TlMgOiBjcmVhdGVFbGVtZW50IDogX3BhcmFtcyRjZUZuO1xuXG4gIGlmICh0eXBlb2YgYWJzdHJhY3RPYmogPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIERPQ1VNRU5ULmNyZWF0ZVRleHROb2RlKGFic3RyYWN0T2JqKTtcbiAgfVxuXG4gIHZhciB0YWcgPSBjZUZuKGFic3RyYWN0T2JqLnRhZyk7XG4gIE9iamVjdC5rZXlzKGFic3RyYWN0T2JqLmF0dHJpYnV0ZXMgfHwgW10pLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIHRhZy5zZXRBdHRyaWJ1dGUoa2V5LCBhYnN0cmFjdE9iai5hdHRyaWJ1dGVzW2tleV0pO1xuICB9KTtcbiAgdmFyIGNoaWxkcmVuID0gYWJzdHJhY3RPYmouY2hpbGRyZW4gfHwgW107XG4gIGNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgdGFnLmFwcGVuZENoaWxkKGNvbnZlcnRTVkcoY2hpbGQsIHtcbiAgICAgIGNlRm46IGNlRm5cbiAgICB9KSk7XG4gIH0pO1xuICByZXR1cm4gdGFnO1xufVxuXG5mdW5jdGlvbiBub2RlQXNDb21tZW50KG5vZGUpIHtcbiAgdmFyIGNvbW1lbnQgPSBcIiBcIi5jb25jYXQobm9kZS5vdXRlckhUTUwsIFwiIFwiKTtcbiAgLyogQkVHSU4uQVRUUklCVVRJT04gKi9cblxuICBjb21tZW50ID0gXCJcIi5jb25jYXQoY29tbWVudCwgXCJGb250IEF3ZXNvbWUgZm9udGF3ZXNvbWUuY29tIFwiKTtcbiAgLyogRU5ELkFUVFJJQlVUSU9OICovXG5cbiAgcmV0dXJuIGNvbW1lbnQ7XG59XG5cbnZhciBtdXRhdG9ycyA9IHtcbiAgcmVwbGFjZTogZnVuY3Rpb24gcmVwbGFjZShtdXRhdGlvbikge1xuICAgIHZhciBub2RlID0gbXV0YXRpb25bMF07XG5cbiAgICBpZiAobm9kZS5wYXJlbnROb2RlKSB7XG4gICAgICBtdXRhdGlvblsxXS5mb3JFYWNoKGZ1bmN0aW9uIChfYWJzdHJhY3QpIHtcbiAgICAgICAgbm9kZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShjb252ZXJ0U1ZHKF9hYnN0cmFjdCksIG5vZGUpO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChub2RlLmdldEF0dHJpYnV0ZShEQVRBX0ZBX0kyU1ZHKSA9PT0gbnVsbCAmJiBjb25maWcua2VlcE9yaWdpbmFsU291cmNlKSB7XG4gICAgICAgIHZhciBjb21tZW50ID0gRE9DVU1FTlQuY3JlYXRlQ29tbWVudChub2RlQXNDb21tZW50KG5vZGUpKTtcbiAgICAgICAgbm9kZS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChjb21tZW50LCBub2RlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5vZGUucmVtb3ZlKCk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBuZXN0OiBmdW5jdGlvbiBuZXN0KG11dGF0aW9uKSB7XG4gICAgdmFyIG5vZGUgPSBtdXRhdGlvblswXTtcbiAgICB2YXIgX2Fic3RyYWN0MiA9IG11dGF0aW9uWzFdOyAvLyBJZiB3ZSBhbHJlYWR5IGhhdmUgYSByZXBsYWNlZCBub2RlIHdlIGRvIG5vdCB3YW50IHRvIGNvbnRpbnVlIG5lc3Rpbmcgd2l0aGluIGl0LlxuICAgIC8vIFNob3J0LWNpcmN1aXQgdG8gdGhlIHN0YW5kYXJkIHJlcGxhY2VtZW50XG5cbiAgICBpZiAofmNsYXNzQXJyYXkobm9kZSkuaW5kZXhPZihjb25maWcucmVwbGFjZW1lbnRDbGFzcykpIHtcbiAgICAgIHJldHVybiBtdXRhdG9ycy5yZXBsYWNlKG11dGF0aW9uKTtcbiAgICB9XG5cbiAgICB2YXIgZm9yU3ZnID0gbmV3IFJlZ0V4cChcIlwiLmNvbmNhdChjb25maWcuY3NzUHJlZml4LCBcIi0uKlwiKSk7XG4gICAgZGVsZXRlIF9hYnN0cmFjdDJbMF0uYXR0cmlidXRlcy5pZDtcblxuICAgIGlmIChfYWJzdHJhY3QyWzBdLmF0dHJpYnV0ZXMuY2xhc3MpIHtcbiAgICAgIHZhciBzcGxpdENsYXNzZXMgPSBfYWJzdHJhY3QyWzBdLmF0dHJpYnV0ZXMuY2xhc3Muc3BsaXQoJyAnKS5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgY2xzKSB7XG4gICAgICAgIGlmIChjbHMgPT09IGNvbmZpZy5yZXBsYWNlbWVudENsYXNzIHx8IGNscy5tYXRjaChmb3JTdmcpKSB7XG4gICAgICAgICAgYWNjLnRvU3ZnLnB1c2goY2xzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhY2MudG9Ob2RlLnB1c2goY2xzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCB7XG4gICAgICAgIHRvTm9kZTogW10sXG4gICAgICAgIHRvU3ZnOiBbXVxuICAgICAgfSk7XG5cbiAgICAgIF9hYnN0cmFjdDJbMF0uYXR0cmlidXRlcy5jbGFzcyA9IHNwbGl0Q2xhc3Nlcy50b1N2Zy5qb2luKCcgJyk7XG5cbiAgICAgIGlmIChzcGxpdENsYXNzZXMudG9Ob2RlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZSgnY2xhc3MnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKCdjbGFzcycsIHNwbGl0Q2xhc3Nlcy50b05vZGUuam9pbignICcpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgbmV3SW5uZXJIVE1MID0gX2Fic3RyYWN0Mi5tYXAoZnVuY3Rpb24gKGEpIHtcbiAgICAgIHJldHVybiB0b0h0bWwoYSk7XG4gICAgfSkuam9pbignXFxuJyk7XG5cbiAgICBub2RlLnNldEF0dHJpYnV0ZShEQVRBX0ZBX0kyU1ZHLCAnJyk7XG4gICAgbm9kZS5pbm5lckhUTUwgPSBuZXdJbm5lckhUTUw7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIHBlcmZvcm1PcGVyYXRpb25TeW5jKG9wKSB7XG4gIG9wKCk7XG59XG5cbmZ1bmN0aW9uIHBlcmZvcm0obXV0YXRpb25zLCBjYWxsYmFjaykge1xuICB2YXIgY2FsbGJhY2tGdW5jdGlvbiA9IHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJyA/IGNhbGxiYWNrIDogbm9vcCQyO1xuXG4gIGlmIChtdXRhdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgY2FsbGJhY2tGdW5jdGlvbigpO1xuICB9IGVsc2Uge1xuICAgIHZhciBmcmFtZSA9IHBlcmZvcm1PcGVyYXRpb25TeW5jO1xuXG4gICAgaWYgKGNvbmZpZy5tdXRhdGVBcHByb2FjaCA9PT0gTVVUQVRJT05fQVBQUk9BQ0hfQVNZTkMpIHtcbiAgICAgIGZyYW1lID0gV0lORE9XLnJlcXVlc3RBbmltYXRpb25GcmFtZSB8fCBwZXJmb3JtT3BlcmF0aW9uU3luYztcbiAgICB9XG5cbiAgICBmcmFtZShmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgbXV0YXRvciA9IGdldE11dGF0b3IoKTtcbiAgICAgIHZhciBtYXJrID0gcGVyZi5iZWdpbignbXV0YXRlJyk7XG4gICAgICBtdXRhdGlvbnMubWFwKG11dGF0b3IpO1xuICAgICAgbWFyaygpO1xuICAgICAgY2FsbGJhY2tGdW5jdGlvbigpO1xuICAgIH0pO1xuICB9XG59XG52YXIgZGlzYWJsZWQgPSBmYWxzZTtcbmZ1bmN0aW9uIGRpc2FibGVPYnNlcnZhdGlvbigpIHtcbiAgZGlzYWJsZWQgPSB0cnVlO1xufVxuZnVuY3Rpb24gZW5hYmxlT2JzZXJ2YXRpb24oKSB7XG4gIGRpc2FibGVkID0gZmFsc2U7XG59XG52YXIgbW8gPSBudWxsO1xuZnVuY3Rpb24gb2JzZXJ2ZShvcHRpb25zKSB7XG4gIGlmICghTVVUQVRJT05fT0JTRVJWRVIpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIWNvbmZpZy5vYnNlcnZlTXV0YXRpb25zKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIF9vcHRpb25zJHRyZWVDYWxsYmFjayA9IG9wdGlvbnMudHJlZUNhbGxiYWNrLFxuICAgICAgdHJlZUNhbGxiYWNrID0gX29wdGlvbnMkdHJlZUNhbGxiYWNrID09PSB2b2lkIDAgPyBub29wJDIgOiBfb3B0aW9ucyR0cmVlQ2FsbGJhY2ssXG4gICAgICBfb3B0aW9ucyRub2RlQ2FsbGJhY2sgPSBvcHRpb25zLm5vZGVDYWxsYmFjayxcbiAgICAgIG5vZGVDYWxsYmFjayA9IF9vcHRpb25zJG5vZGVDYWxsYmFjayA9PT0gdm9pZCAwID8gbm9vcCQyIDogX29wdGlvbnMkbm9kZUNhbGxiYWNrLFxuICAgICAgX29wdGlvbnMkcHNldWRvRWxlbWVuID0gb3B0aW9ucy5wc2V1ZG9FbGVtZW50c0NhbGxiYWNrLFxuICAgICAgcHNldWRvRWxlbWVudHNDYWxsYmFjayA9IF9vcHRpb25zJHBzZXVkb0VsZW1lbiA9PT0gdm9pZCAwID8gbm9vcCQyIDogX29wdGlvbnMkcHNldWRvRWxlbWVuLFxuICAgICAgX29wdGlvbnMkb2JzZXJ2ZU11dGF0ID0gb3B0aW9ucy5vYnNlcnZlTXV0YXRpb25zUm9vdCxcbiAgICAgIG9ic2VydmVNdXRhdGlvbnNSb290ID0gX29wdGlvbnMkb2JzZXJ2ZU11dGF0ID09PSB2b2lkIDAgPyBET0NVTUVOVCA6IF9vcHRpb25zJG9ic2VydmVNdXRhdDtcbiAgbW8gPSBuZXcgTVVUQVRJT05fT0JTRVJWRVIoZnVuY3Rpb24gKG9iamVjdHMpIHtcbiAgICBpZiAoZGlzYWJsZWQpIHJldHVybjtcbiAgICB2YXIgZGVmYXVsdFByZWZpeCA9IGdldERlZmF1bHRVc2FibGVQcmVmaXgoKTtcbiAgICB0b0FycmF5KG9iamVjdHMpLmZvckVhY2goZnVuY3Rpb24gKG11dGF0aW9uUmVjb3JkKSB7XG4gICAgICBpZiAobXV0YXRpb25SZWNvcmQudHlwZSA9PT0gJ2NoaWxkTGlzdCcgJiYgbXV0YXRpb25SZWNvcmQuYWRkZWROb2Rlcy5sZW5ndGggPiAwICYmICFpc1dhdGNoZWQobXV0YXRpb25SZWNvcmQuYWRkZWROb2Rlc1swXSkpIHtcbiAgICAgICAgaWYgKGNvbmZpZy5zZWFyY2hQc2V1ZG9FbGVtZW50cykge1xuICAgICAgICAgIHBzZXVkb0VsZW1lbnRzQ2FsbGJhY2sobXV0YXRpb25SZWNvcmQudGFyZ2V0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyZWVDYWxsYmFjayhtdXRhdGlvblJlY29yZC50YXJnZXQpO1xuICAgICAgfVxuXG4gICAgICBpZiAobXV0YXRpb25SZWNvcmQudHlwZSA9PT0gJ2F0dHJpYnV0ZXMnICYmIG11dGF0aW9uUmVjb3JkLnRhcmdldC5wYXJlbnROb2RlICYmIGNvbmZpZy5zZWFyY2hQc2V1ZG9FbGVtZW50cykge1xuICAgICAgICBwc2V1ZG9FbGVtZW50c0NhbGxiYWNrKG11dGF0aW9uUmVjb3JkLnRhcmdldC5wYXJlbnROb2RlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG11dGF0aW9uUmVjb3JkLnR5cGUgPT09ICdhdHRyaWJ1dGVzJyAmJiBpc1dhdGNoZWQobXV0YXRpb25SZWNvcmQudGFyZ2V0KSAmJiB+QVRUUklCVVRFU19XQVRDSEVEX0ZPUl9NVVRBVElPTi5pbmRleE9mKG11dGF0aW9uUmVjb3JkLmF0dHJpYnV0ZU5hbWUpKSB7XG4gICAgICAgIGlmIChtdXRhdGlvblJlY29yZC5hdHRyaWJ1dGVOYW1lID09PSAnY2xhc3MnICYmIGhhc1ByZWZpeEFuZEljb24obXV0YXRpb25SZWNvcmQudGFyZ2V0KSkge1xuICAgICAgICAgIHZhciBfZ2V0Q2Fub25pY2FsSWNvbiA9IGdldENhbm9uaWNhbEljb24oY2xhc3NBcnJheShtdXRhdGlvblJlY29yZC50YXJnZXQpKSxcbiAgICAgICAgICAgICAgcHJlZml4ID0gX2dldENhbm9uaWNhbEljb24ucHJlZml4LFxuICAgICAgICAgICAgICBpY29uTmFtZSA9IF9nZXRDYW5vbmljYWxJY29uLmljb25OYW1lO1xuXG4gICAgICAgICAgbXV0YXRpb25SZWNvcmQudGFyZ2V0LnNldEF0dHJpYnV0ZShEQVRBX1BSRUZJWCwgcHJlZml4IHx8IGRlZmF1bHRQcmVmaXgpO1xuICAgICAgICAgIGlmIChpY29uTmFtZSkgbXV0YXRpb25SZWNvcmQudGFyZ2V0LnNldEF0dHJpYnV0ZShEQVRBX0lDT04sIGljb25OYW1lKTtcbiAgICAgICAgfSBlbHNlIGlmIChoYXNCZWVuUmVwbGFjZWQobXV0YXRpb25SZWNvcmQudGFyZ2V0KSkge1xuICAgICAgICAgIG5vZGVDYWxsYmFjayhtdXRhdGlvblJlY29yZC50YXJnZXQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuICBpZiAoIUlTX0RPTSkgcmV0dXJuO1xuICBtby5vYnNlcnZlKG9ic2VydmVNdXRhdGlvbnNSb290LCB7XG4gICAgY2hpbGRMaXN0OiB0cnVlLFxuICAgIGF0dHJpYnV0ZXM6IHRydWUsXG4gICAgY2hhcmFjdGVyRGF0YTogdHJ1ZSxcbiAgICBzdWJ0cmVlOiB0cnVlXG4gIH0pO1xufVxuZnVuY3Rpb24gZGlzY29ubmVjdCgpIHtcbiAgaWYgKCFtbykgcmV0dXJuO1xuICBtby5kaXNjb25uZWN0KCk7XG59XG5cbmZ1bmN0aW9uIHN0eWxlUGFyc2VyIChub2RlKSB7XG4gIHZhciBzdHlsZSA9IG5vZGUuZ2V0QXR0cmlidXRlKCdzdHlsZScpO1xuICB2YXIgdmFsID0gW107XG5cbiAgaWYgKHN0eWxlKSB7XG4gICAgdmFsID0gc3R5bGUuc3BsaXQoJzsnKS5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgc3R5bGUpIHtcbiAgICAgIHZhciBzdHlsZXMgPSBzdHlsZS5zcGxpdCgnOicpO1xuICAgICAgdmFyIHByb3AgPSBzdHlsZXNbMF07XG4gICAgICB2YXIgdmFsdWUgPSBzdHlsZXMuc2xpY2UoMSk7XG5cbiAgICAgIGlmIChwcm9wICYmIHZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYWNjW3Byb3BdID0gdmFsdWUuam9pbignOicpLnRyaW0oKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSk7XG4gIH1cblxuICByZXR1cm4gdmFsO1xufVxuXG5mdW5jdGlvbiBjbGFzc1BhcnNlciAobm9kZSkge1xuICB2YXIgZXhpc3RpbmdQcmVmaXggPSBub2RlLmdldEF0dHJpYnV0ZSgnZGF0YS1wcmVmaXgnKTtcbiAgdmFyIGV4aXN0aW5nSWNvbk5hbWUgPSBub2RlLmdldEF0dHJpYnV0ZSgnZGF0YS1pY29uJyk7XG4gIHZhciBpbm5lclRleHQgPSBub2RlLmlubmVyVGV4dCAhPT0gdW5kZWZpbmVkID8gbm9kZS5pbm5lclRleHQudHJpbSgpIDogJyc7XG4gIHZhciB2YWwgPSBnZXRDYW5vbmljYWxJY29uKGNsYXNzQXJyYXkobm9kZSkpO1xuXG4gIGlmICghdmFsLnByZWZpeCkge1xuICAgIHZhbC5wcmVmaXggPSBnZXREZWZhdWx0VXNhYmxlUHJlZml4KCk7XG4gIH1cblxuICBpZiAoZXhpc3RpbmdQcmVmaXggJiYgZXhpc3RpbmdJY29uTmFtZSkge1xuICAgIHZhbC5wcmVmaXggPSBleGlzdGluZ1ByZWZpeDtcbiAgICB2YWwuaWNvbk5hbWUgPSBleGlzdGluZ0ljb25OYW1lO1xuICB9XG5cbiAgaWYgKHZhbC5pY29uTmFtZSAmJiB2YWwucHJlZml4KSB7XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuXG4gIGlmICh2YWwucHJlZml4ICYmIGlubmVyVGV4dC5sZW5ndGggPiAwKSB7XG4gICAgdmFsLmljb25OYW1lID0gYnlMaWdhdHVyZSh2YWwucHJlZml4LCBub2RlLmlubmVyVGV4dCkgfHwgYnlVbmljb2RlKHZhbC5wcmVmaXgsIHRvSGV4KG5vZGUuaW5uZXJUZXh0KSk7XG4gIH1cblxuICBpZiAoIXZhbC5pY29uTmFtZSAmJiBjb25maWcuYXV0b0ZldGNoU3ZnICYmIG5vZGUuZmlyc3RDaGlsZCAmJiBub2RlLmZpcnN0Q2hpbGQubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgdmFsLmljb25OYW1lID0gbm9kZS5maXJzdENoaWxkLmRhdGE7XG4gIH1cblxuICByZXR1cm4gdmFsO1xufVxuXG5mdW5jdGlvbiBhdHRyaWJ1dGVzUGFyc2VyIChub2RlKSB7XG4gIHZhciBleHRyYUF0dHJpYnV0ZXMgPSB0b0FycmF5KG5vZGUuYXR0cmlidXRlcykucmVkdWNlKGZ1bmN0aW9uIChhY2MsIGF0dHIpIHtcbiAgICBpZiAoYWNjLm5hbWUgIT09ICdjbGFzcycgJiYgYWNjLm5hbWUgIT09ICdzdHlsZScpIHtcbiAgICAgIGFjY1thdHRyLm5hbWVdID0gYXR0ci52YWx1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWNjO1xuICB9LCB7fSk7XG4gIHZhciB0aXRsZSA9IG5vZGUuZ2V0QXR0cmlidXRlKCd0aXRsZScpO1xuICB2YXIgdGl0bGVJZCA9IG5vZGUuZ2V0QXR0cmlidXRlKCdkYXRhLWZhLXRpdGxlLWlkJyk7XG5cbiAgaWYgKGNvbmZpZy5hdXRvQTExeSkge1xuICAgIGlmICh0aXRsZSkge1xuICAgICAgZXh0cmFBdHRyaWJ1dGVzWydhcmlhLWxhYmVsbGVkYnknXSA9IFwiXCIuY29uY2F0KGNvbmZpZy5yZXBsYWNlbWVudENsYXNzLCBcIi10aXRsZS1cIikuY29uY2F0KHRpdGxlSWQgfHwgbmV4dFVuaXF1ZUlkKCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBleHRyYUF0dHJpYnV0ZXNbJ2FyaWEtaGlkZGVuJ10gPSAndHJ1ZSc7XG4gICAgICBleHRyYUF0dHJpYnV0ZXNbJ2ZvY3VzYWJsZSddID0gJ2ZhbHNlJztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZXh0cmFBdHRyaWJ1dGVzO1xufVxuXG5mdW5jdGlvbiBibGFua01ldGEoKSB7XG4gIHJldHVybiB7XG4gICAgaWNvbk5hbWU6IG51bGwsXG4gICAgdGl0bGU6IG51bGwsXG4gICAgdGl0bGVJZDogbnVsbCxcbiAgICBwcmVmaXg6IG51bGwsXG4gICAgdHJhbnNmb3JtOiBtZWFuaW5nbGVzc1RyYW5zZm9ybSxcbiAgICBzeW1ib2w6IGZhbHNlLFxuICAgIG1hc2s6IHtcbiAgICAgIGljb25OYW1lOiBudWxsLFxuICAgICAgcHJlZml4OiBudWxsLFxuICAgICAgcmVzdDogW11cbiAgICB9LFxuICAgIG1hc2tJZDogbnVsbCxcbiAgICBleHRyYToge1xuICAgICAgY2xhc3NlczogW10sXG4gICAgICBzdHlsZXM6IHt9LFxuICAgICAgYXR0cmlidXRlczoge31cbiAgICB9XG4gIH07XG59XG5mdW5jdGlvbiBwYXJzZU1ldGEobm9kZSkge1xuICB2YXIgcGFyc2VyID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7XG4gICAgc3R5bGVQYXJzZXI6IHRydWVcbiAgfTtcblxuICB2YXIgX2NsYXNzUGFyc2VyID0gY2xhc3NQYXJzZXIobm9kZSksXG4gICAgICBpY29uTmFtZSA9IF9jbGFzc1BhcnNlci5pY29uTmFtZSxcbiAgICAgIHByZWZpeCA9IF9jbGFzc1BhcnNlci5wcmVmaXgsXG4gICAgICBleHRyYUNsYXNzZXMgPSBfY2xhc3NQYXJzZXIucmVzdDtcblxuICB2YXIgZXh0cmFBdHRyaWJ1dGVzID0gYXR0cmlidXRlc1BhcnNlcihub2RlKTtcbiAgdmFyIHBsdWdpbk1ldGEgPSBjaGFpbkhvb2tzKCdwYXJzZU5vZGVBdHRyaWJ1dGVzJywge30sIG5vZGUpO1xuICB2YXIgZXh0cmFTdHlsZXMgPSBwYXJzZXIuc3R5bGVQYXJzZXIgPyBzdHlsZVBhcnNlcihub2RlKSA6IFtdO1xuICByZXR1cm4gX29iamVjdFNwcmVhZDIoe1xuICAgIGljb25OYW1lOiBpY29uTmFtZSxcbiAgICB0aXRsZTogbm9kZS5nZXRBdHRyaWJ1dGUoJ3RpdGxlJyksXG4gICAgdGl0bGVJZDogbm9kZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtZmEtdGl0bGUtaWQnKSxcbiAgICBwcmVmaXg6IHByZWZpeCxcbiAgICB0cmFuc2Zvcm06IG1lYW5pbmdsZXNzVHJhbnNmb3JtLFxuICAgIG1hc2s6IHtcbiAgICAgIGljb25OYW1lOiBudWxsLFxuICAgICAgcHJlZml4OiBudWxsLFxuICAgICAgcmVzdDogW11cbiAgICB9LFxuICAgIG1hc2tJZDogbnVsbCxcbiAgICBzeW1ib2w6IGZhbHNlLFxuICAgIGV4dHJhOiB7XG4gICAgICBjbGFzc2VzOiBleHRyYUNsYXNzZXMsXG4gICAgICBzdHlsZXM6IGV4dHJhU3R5bGVzLFxuICAgICAgYXR0cmlidXRlczogZXh0cmFBdHRyaWJ1dGVzXG4gICAgfVxuICB9LCBwbHVnaW5NZXRhKTtcbn1cblxudmFyIHN0eWxlcyQyID0gbmFtZXNwYWNlLnN0eWxlcztcblxuZnVuY3Rpb24gZ2VuZXJhdGVNdXRhdGlvbihub2RlKSB7XG4gIHZhciBub2RlTWV0YSA9IGNvbmZpZy5hdXRvUmVwbGFjZVN2ZyA9PT0gJ25lc3QnID8gcGFyc2VNZXRhKG5vZGUsIHtcbiAgICBzdHlsZVBhcnNlcjogZmFsc2VcbiAgfSkgOiBwYXJzZU1ldGEobm9kZSk7XG5cbiAgaWYgKH5ub2RlTWV0YS5leHRyYS5jbGFzc2VzLmluZGV4T2YoTEFZRVJTX1RFWFRfQ0xBU1NOQU1FKSkge1xuICAgIHJldHVybiBjYWxsUHJvdmlkZWQoJ2dlbmVyYXRlTGF5ZXJzVGV4dCcsIG5vZGUsIG5vZGVNZXRhKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gY2FsbFByb3ZpZGVkKCdnZW5lcmF0ZVN2Z1JlcGxhY2VtZW50TXV0YXRpb24nLCBub2RlLCBub2RlTWV0YSk7XG4gIH1cbn1cblxudmFyIGtub3duUHJlZml4ZXMgPSBuZXcgU2V0KCk7XG5GQU1JTElFUy5tYXAoZnVuY3Rpb24gKGZhbWlseSkge1xuICBrbm93blByZWZpeGVzLmFkZChcImZhLVwiLmNvbmNhdChmYW1pbHkpKTtcbn0pO1xuT2JqZWN0LmtleXMoUFJFRklYX1RPX1NUWUxFW0ZBTUlMWV9DTEFTU0lDXSkubWFwKGtub3duUHJlZml4ZXMuYWRkLmJpbmQoa25vd25QcmVmaXhlcykpO1xuT2JqZWN0LmtleXMoUFJFRklYX1RPX1NUWUxFW0ZBTUlMWV9TSEFSUF0pLm1hcChrbm93blByZWZpeGVzLmFkZC5iaW5kKGtub3duUHJlZml4ZXMpKTtcbmtub3duUHJlZml4ZXMgPSBfdG9Db25zdW1hYmxlQXJyYXkoa25vd25QcmVmaXhlcyk7XG5cbmZ1bmN0aW9uIG9uVHJlZShyb290KSB7XG4gIHZhciBjYWxsYmFjayA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogbnVsbDtcbiAgaWYgKCFJU19ET00pIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgdmFyIGh0bWxDbGFzc0xpc3QgPSBET0NVTUVOVC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0O1xuXG4gIHZhciBoY2xBZGQgPSBmdW5jdGlvbiBoY2xBZGQoc3VmZml4KSB7XG4gICAgcmV0dXJuIGh0bWxDbGFzc0xpc3QuYWRkKFwiXCIuY29uY2F0KEhUTUxfQ0xBU1NfSTJTVkdfQkFTRV9DTEFTUywgXCItXCIpLmNvbmNhdChzdWZmaXgpKTtcbiAgfTtcblxuICB2YXIgaGNsUmVtb3ZlID0gZnVuY3Rpb24gaGNsUmVtb3ZlKHN1ZmZpeCkge1xuICAgIHJldHVybiBodG1sQ2xhc3NMaXN0LnJlbW92ZShcIlwiLmNvbmNhdChIVE1MX0NMQVNTX0kyU1ZHX0JBU0VfQ0xBU1MsIFwiLVwiKS5jb25jYXQoc3VmZml4KSk7XG4gIH07XG5cbiAgdmFyIHByZWZpeGVzID0gY29uZmlnLmF1dG9GZXRjaFN2ZyA/IGtub3duUHJlZml4ZXMgOiBGQU1JTElFUy5tYXAoZnVuY3Rpb24gKGYpIHtcbiAgICByZXR1cm4gXCJmYS1cIi5jb25jYXQoZik7XG4gIH0pLmNvbmNhdChPYmplY3Qua2V5cyhzdHlsZXMkMikpO1xuXG4gIGlmICghcHJlZml4ZXMuaW5jbHVkZXMoJ2ZhJykpIHtcbiAgICBwcmVmaXhlcy5wdXNoKCdmYScpO1xuICB9XG5cbiAgdmFyIHByZWZpeGVzRG9tUXVlcnkgPSBbXCIuXCIuY29uY2F0KExBWUVSU19URVhUX0NMQVNTTkFNRSwgXCI6bm90KFtcIikuY29uY2F0KERBVEFfRkFfSTJTVkcsIFwiXSlcIildLmNvbmNhdChwcmVmaXhlcy5tYXAoZnVuY3Rpb24gKHApIHtcbiAgICByZXR1cm4gXCIuXCIuY29uY2F0KHAsIFwiOm5vdChbXCIpLmNvbmNhdChEQVRBX0ZBX0kyU1ZHLCBcIl0pXCIpO1xuICB9KSkuam9pbignLCAnKTtcblxuICBpZiAocHJlZml4ZXNEb21RdWVyeS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cblxuICB2YXIgY2FuZGlkYXRlcyA9IFtdO1xuXG4gIHRyeSB7XG4gICAgY2FuZGlkYXRlcyA9IHRvQXJyYXkocm9vdC5xdWVyeVNlbGVjdG9yQWxsKHByZWZpeGVzRG9tUXVlcnkpKTtcbiAgfSBjYXRjaCAoZSkgey8vIG5vb3BcbiAgfVxuXG4gIGlmIChjYW5kaWRhdGVzLmxlbmd0aCA+IDApIHtcbiAgICBoY2xBZGQoJ3BlbmRpbmcnKTtcbiAgICBoY2xSZW1vdmUoJ2NvbXBsZXRlJyk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG5cbiAgdmFyIG1hcmsgPSBwZXJmLmJlZ2luKCdvblRyZWUnKTtcbiAgdmFyIG11dGF0aW9ucyA9IGNhbmRpZGF0ZXMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIG5vZGUpIHtcbiAgICB0cnkge1xuICAgICAgdmFyIG11dGF0aW9uID0gZ2VuZXJhdGVNdXRhdGlvbihub2RlKTtcblxuICAgICAgaWYgKG11dGF0aW9uKSB7XG4gICAgICAgIGFjYy5wdXNoKG11dGF0aW9uKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoIVBST0RVQ1RJT04pIHtcbiAgICAgICAgaWYgKGUubmFtZSA9PT0gJ01pc3NpbmdJY29uJykge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYWNjO1xuICB9LCBbXSk7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgUHJvbWlzZS5hbGwobXV0YXRpb25zKS50aGVuKGZ1bmN0aW9uIChyZXNvbHZlZE11dGF0aW9ucykge1xuICAgICAgcGVyZm9ybShyZXNvbHZlZE11dGF0aW9ucywgZnVuY3Rpb24gKCkge1xuICAgICAgICBoY2xBZGQoJ2FjdGl2ZScpO1xuICAgICAgICBoY2xBZGQoJ2NvbXBsZXRlJyk7XG4gICAgICAgIGhjbFJlbW92ZSgncGVuZGluZycpO1xuICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSBjYWxsYmFjaygpO1xuICAgICAgICBtYXJrKCk7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0pO1xuICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlKSB7XG4gICAgICBtYXJrKCk7XG4gICAgICByZWplY3QoZSk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBvbk5vZGUobm9kZSkge1xuICB2YXIgY2FsbGJhY2sgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IG51bGw7XG4gIGdlbmVyYXRlTXV0YXRpb24obm9kZSkudGhlbihmdW5jdGlvbiAobXV0YXRpb24pIHtcbiAgICBpZiAobXV0YXRpb24pIHtcbiAgICAgIHBlcmZvcm0oW211dGF0aW9uXSwgY2FsbGJhY2spO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVJY29ucyhuZXh0KSB7XG4gIHJldHVybiBmdW5jdGlvbiAobWF5YmVJY29uRGVmaW5pdGlvbikge1xuICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICAgIHZhciBpY29uRGVmaW5pdGlvbiA9IChtYXliZUljb25EZWZpbml0aW9uIHx8IHt9KS5pY29uID8gbWF5YmVJY29uRGVmaW5pdGlvbiA6IGZpbmRJY29uRGVmaW5pdGlvbihtYXliZUljb25EZWZpbml0aW9uIHx8IHt9KTtcbiAgICB2YXIgbWFzayA9IHBhcmFtcy5tYXNrO1xuXG4gICAgaWYgKG1hc2spIHtcbiAgICAgIG1hc2sgPSAobWFzayB8fCB7fSkuaWNvbiA/IG1hc2sgOiBmaW5kSWNvbkRlZmluaXRpb24obWFzayB8fCB7fSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5leHQoaWNvbkRlZmluaXRpb24sIF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBwYXJhbXMpLCB7fSwge1xuICAgICAgbWFzazogbWFza1xuICAgIH0pKTtcbiAgfTtcbn1cblxudmFyIHJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcihpY29uRGVmaW5pdGlvbikge1xuICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgdmFyIF9wYXJhbXMkdHJhbnNmb3JtID0gcGFyYW1zLnRyYW5zZm9ybSxcbiAgICAgIHRyYW5zZm9ybSA9IF9wYXJhbXMkdHJhbnNmb3JtID09PSB2b2lkIDAgPyBtZWFuaW5nbGVzc1RyYW5zZm9ybSA6IF9wYXJhbXMkdHJhbnNmb3JtLFxuICAgICAgX3BhcmFtcyRzeW1ib2wgPSBwYXJhbXMuc3ltYm9sLFxuICAgICAgc3ltYm9sID0gX3BhcmFtcyRzeW1ib2wgPT09IHZvaWQgMCA/IGZhbHNlIDogX3BhcmFtcyRzeW1ib2wsXG4gICAgICBfcGFyYW1zJG1hc2sgPSBwYXJhbXMubWFzayxcbiAgICAgIG1hc2sgPSBfcGFyYW1zJG1hc2sgPT09IHZvaWQgMCA/IG51bGwgOiBfcGFyYW1zJG1hc2ssXG4gICAgICBfcGFyYW1zJG1hc2tJZCA9IHBhcmFtcy5tYXNrSWQsXG4gICAgICBtYXNrSWQgPSBfcGFyYW1zJG1hc2tJZCA9PT0gdm9pZCAwID8gbnVsbCA6IF9wYXJhbXMkbWFza0lkLFxuICAgICAgX3BhcmFtcyR0aXRsZSA9IHBhcmFtcy50aXRsZSxcbiAgICAgIHRpdGxlID0gX3BhcmFtcyR0aXRsZSA9PT0gdm9pZCAwID8gbnVsbCA6IF9wYXJhbXMkdGl0bGUsXG4gICAgICBfcGFyYW1zJHRpdGxlSWQgPSBwYXJhbXMudGl0bGVJZCxcbiAgICAgIHRpdGxlSWQgPSBfcGFyYW1zJHRpdGxlSWQgPT09IHZvaWQgMCA/IG51bGwgOiBfcGFyYW1zJHRpdGxlSWQsXG4gICAgICBfcGFyYW1zJGNsYXNzZXMgPSBwYXJhbXMuY2xhc3NlcyxcbiAgICAgIGNsYXNzZXMgPSBfcGFyYW1zJGNsYXNzZXMgPT09IHZvaWQgMCA/IFtdIDogX3BhcmFtcyRjbGFzc2VzLFxuICAgICAgX3BhcmFtcyRhdHRyaWJ1dGVzID0gcGFyYW1zLmF0dHJpYnV0ZXMsXG4gICAgICBhdHRyaWJ1dGVzID0gX3BhcmFtcyRhdHRyaWJ1dGVzID09PSB2b2lkIDAgPyB7fSA6IF9wYXJhbXMkYXR0cmlidXRlcyxcbiAgICAgIF9wYXJhbXMkc3R5bGVzID0gcGFyYW1zLnN0eWxlcyxcbiAgICAgIHN0eWxlcyA9IF9wYXJhbXMkc3R5bGVzID09PSB2b2lkIDAgPyB7fSA6IF9wYXJhbXMkc3R5bGVzO1xuICBpZiAoIWljb25EZWZpbml0aW9uKSByZXR1cm47XG4gIHZhciBwcmVmaXggPSBpY29uRGVmaW5pdGlvbi5wcmVmaXgsXG4gICAgICBpY29uTmFtZSA9IGljb25EZWZpbml0aW9uLmljb25OYW1lLFxuICAgICAgaWNvbiA9IGljb25EZWZpbml0aW9uLmljb247XG4gIHJldHVybiBkb21WYXJpYW50cyhfb2JqZWN0U3ByZWFkMih7XG4gICAgdHlwZTogJ2ljb24nXG4gIH0sIGljb25EZWZpbml0aW9uKSwgZnVuY3Rpb24gKCkge1xuICAgIGNhbGxIb29rcygnYmVmb3JlRE9NRWxlbWVudENyZWF0aW9uJywge1xuICAgICAgaWNvbkRlZmluaXRpb246IGljb25EZWZpbml0aW9uLFxuICAgICAgcGFyYW1zOiBwYXJhbXNcbiAgICB9KTtcblxuICAgIGlmIChjb25maWcuYXV0b0ExMXkpIHtcbiAgICAgIGlmICh0aXRsZSkge1xuICAgICAgICBhdHRyaWJ1dGVzWydhcmlhLWxhYmVsbGVkYnknXSA9IFwiXCIuY29uY2F0KGNvbmZpZy5yZXBsYWNlbWVudENsYXNzLCBcIi10aXRsZS1cIikuY29uY2F0KHRpdGxlSWQgfHwgbmV4dFVuaXF1ZUlkKCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXR0cmlidXRlc1snYXJpYS1oaWRkZW4nXSA9ICd0cnVlJztcbiAgICAgICAgYXR0cmlidXRlc1snZm9jdXNhYmxlJ10gPSAnZmFsc2UnO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtYWtlSW5saW5lU3ZnQWJzdHJhY3Qoe1xuICAgICAgaWNvbnM6IHtcbiAgICAgICAgbWFpbjogYXNGb3VuZEljb24oaWNvbiksXG4gICAgICAgIG1hc2s6IG1hc2sgPyBhc0ZvdW5kSWNvbihtYXNrLmljb24pIDoge1xuICAgICAgICAgIGZvdW5kOiBmYWxzZSxcbiAgICAgICAgICB3aWR0aDogbnVsbCxcbiAgICAgICAgICBoZWlnaHQ6IG51bGwsXG4gICAgICAgICAgaWNvbjoge31cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHByZWZpeDogcHJlZml4LFxuICAgICAgaWNvbk5hbWU6IGljb25OYW1lLFxuICAgICAgdHJhbnNmb3JtOiBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgbWVhbmluZ2xlc3NUcmFuc2Zvcm0pLCB0cmFuc2Zvcm0pLFxuICAgICAgc3ltYm9sOiBzeW1ib2wsXG4gICAgICB0aXRsZTogdGl0bGUsXG4gICAgICBtYXNrSWQ6IG1hc2tJZCxcbiAgICAgIHRpdGxlSWQ6IHRpdGxlSWQsXG4gICAgICBleHRyYToge1xuICAgICAgICBhdHRyaWJ1dGVzOiBhdHRyaWJ1dGVzLFxuICAgICAgICBzdHlsZXM6IHN0eWxlcyxcbiAgICAgICAgY2xhc3NlczogY2xhc3Nlc1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn07XG52YXIgUmVwbGFjZUVsZW1lbnRzID0ge1xuICBtaXhvdXQ6IGZ1bmN0aW9uIG1peG91dCgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWNvbjogcmVzb2x2ZUljb25zKHJlbmRlcilcbiAgICB9O1xuICB9LFxuICBob29rczogZnVuY3Rpb24gaG9va3MoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG11dGF0aW9uT2JzZXJ2ZXJDYWxsYmFja3M6IGZ1bmN0aW9uIG11dGF0aW9uT2JzZXJ2ZXJDYWxsYmFja3MoYWNjdW11bGF0b3IpIHtcbiAgICAgICAgYWNjdW11bGF0b3IudHJlZUNhbGxiYWNrID0gb25UcmVlO1xuICAgICAgICBhY2N1bXVsYXRvci5ub2RlQ2FsbGJhY2sgPSBvbk5vZGU7XG4gICAgICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgICAgIH1cbiAgICB9O1xuICB9LFxuICBwcm92aWRlczogZnVuY3Rpb24gcHJvdmlkZXMocHJvdmlkZXJzJCQxKSB7XG4gICAgcHJvdmlkZXJzJCQxLmkyc3ZnID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgdmFyIF9wYXJhbXMkbm9kZSA9IHBhcmFtcy5ub2RlLFxuICAgICAgICAgIG5vZGUgPSBfcGFyYW1zJG5vZGUgPT09IHZvaWQgMCA/IERPQ1VNRU5UIDogX3BhcmFtcyRub2RlLFxuICAgICAgICAgIF9wYXJhbXMkY2FsbGJhY2sgPSBwYXJhbXMuY2FsbGJhY2ssXG4gICAgICAgICAgY2FsbGJhY2sgPSBfcGFyYW1zJGNhbGxiYWNrID09PSB2b2lkIDAgPyBmdW5jdGlvbiAoKSB7fSA6IF9wYXJhbXMkY2FsbGJhY2s7XG4gICAgICByZXR1cm4gb25UcmVlKG5vZGUsIGNhbGxiYWNrKTtcbiAgICB9O1xuXG4gICAgcHJvdmlkZXJzJCQxLmdlbmVyYXRlU3ZnUmVwbGFjZW1lbnRNdXRhdGlvbiA9IGZ1bmN0aW9uIChub2RlLCBub2RlTWV0YSkge1xuICAgICAgdmFyIGljb25OYW1lID0gbm9kZU1ldGEuaWNvbk5hbWUsXG4gICAgICAgICAgdGl0bGUgPSBub2RlTWV0YS50aXRsZSxcbiAgICAgICAgICB0aXRsZUlkID0gbm9kZU1ldGEudGl0bGVJZCxcbiAgICAgICAgICBwcmVmaXggPSBub2RlTWV0YS5wcmVmaXgsXG4gICAgICAgICAgdHJhbnNmb3JtID0gbm9kZU1ldGEudHJhbnNmb3JtLFxuICAgICAgICAgIHN5bWJvbCA9IG5vZGVNZXRhLnN5bWJvbCxcbiAgICAgICAgICBtYXNrID0gbm9kZU1ldGEubWFzayxcbiAgICAgICAgICBtYXNrSWQgPSBub2RlTWV0YS5tYXNrSWQsXG4gICAgICAgICAgZXh0cmEgPSBub2RlTWV0YS5leHRyYTtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIFByb21pc2UuYWxsKFtmaW5kSWNvbihpY29uTmFtZSwgcHJlZml4KSwgbWFzay5pY29uTmFtZSA/IGZpbmRJY29uKG1hc2suaWNvbk5hbWUsIG1hc2sucHJlZml4KSA6IFByb21pc2UucmVzb2x2ZSh7XG4gICAgICAgICAgZm91bmQ6IGZhbHNlLFxuICAgICAgICAgIHdpZHRoOiA1MTIsXG4gICAgICAgICAgaGVpZ2h0OiA1MTIsXG4gICAgICAgICAgaWNvbjoge31cbiAgICAgICAgfSldKS50aGVuKGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgICAgICAgdmFyIF9yZWYyID0gX3NsaWNlZFRvQXJyYXkoX3JlZiwgMiksXG4gICAgICAgICAgICAgIG1haW4gPSBfcmVmMlswXSxcbiAgICAgICAgICAgICAgbWFzayA9IF9yZWYyWzFdO1xuXG4gICAgICAgICAgcmVzb2x2ZShbbm9kZSwgbWFrZUlubGluZVN2Z0Fic3RyYWN0KHtcbiAgICAgICAgICAgIGljb25zOiB7XG4gICAgICAgICAgICAgIG1haW46IG1haW4sXG4gICAgICAgICAgICAgIG1hc2s6IG1hc2tcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwcmVmaXg6IHByZWZpeCxcbiAgICAgICAgICAgIGljb25OYW1lOiBpY29uTmFtZSxcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNmb3JtLFxuICAgICAgICAgICAgc3ltYm9sOiBzeW1ib2wsXG4gICAgICAgICAgICBtYXNrSWQ6IG1hc2tJZCxcbiAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcbiAgICAgICAgICAgIHRpdGxlSWQ6IHRpdGxlSWQsXG4gICAgICAgICAgICBleHRyYTogZXh0cmEsXG4gICAgICAgICAgICB3YXRjaGFibGU6IHRydWVcbiAgICAgICAgICB9KV0pO1xuICAgICAgICB9KS5jYXRjaChyZWplY3QpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHByb3ZpZGVycyQkMS5nZW5lcmF0ZUFic3RyYWN0SWNvbiA9IGZ1bmN0aW9uIChfcmVmMykge1xuICAgICAgdmFyIGNoaWxkcmVuID0gX3JlZjMuY2hpbGRyZW4sXG4gICAgICAgICAgYXR0cmlidXRlcyA9IF9yZWYzLmF0dHJpYnV0ZXMsXG4gICAgICAgICAgbWFpbiA9IF9yZWYzLm1haW4sXG4gICAgICAgICAgdHJhbnNmb3JtID0gX3JlZjMudHJhbnNmb3JtLFxuICAgICAgICAgIHN0eWxlcyA9IF9yZWYzLnN0eWxlcztcbiAgICAgIHZhciBzdHlsZVN0cmluZyA9IGpvaW5TdHlsZXMoc3R5bGVzKTtcblxuICAgICAgaWYgKHN0eWxlU3RyaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYXR0cmlidXRlc1snc3R5bGUnXSA9IHN0eWxlU3RyaW5nO1xuICAgICAgfVxuXG4gICAgICB2YXIgbmV4dENoaWxkO1xuXG4gICAgICBpZiAodHJhbnNmb3JtSXNNZWFuaW5nZnVsKHRyYW5zZm9ybSkpIHtcbiAgICAgICAgbmV4dENoaWxkID0gY2FsbFByb3ZpZGVkKCdnZW5lcmF0ZUFic3RyYWN0VHJhbnNmb3JtR3JvdXBpbmcnLCB7XG4gICAgICAgICAgbWFpbjogbWFpbixcbiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zZm9ybSxcbiAgICAgICAgICBjb250YWluZXJXaWR0aDogbWFpbi53aWR0aCxcbiAgICAgICAgICBpY29uV2lkdGg6IG1haW4ud2lkdGhcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGNoaWxkcmVuLnB1c2gobmV4dENoaWxkIHx8IG1haW4uaWNvbik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjaGlsZHJlbjogY2hpbGRyZW4sXG4gICAgICAgIGF0dHJpYnV0ZXM6IGF0dHJpYnV0ZXNcbiAgICAgIH07XG4gICAgfTtcbiAgfVxufTtcblxudmFyIExheWVycyA9IHtcbiAgbWl4b3V0OiBmdW5jdGlvbiBtaXhvdXQoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxheWVyOiBmdW5jdGlvbiBsYXllcihhc3NlbWJsZXIpIHtcbiAgICAgICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gICAgICAgIHZhciBfcGFyYW1zJGNsYXNzZXMgPSBwYXJhbXMuY2xhc3NlcyxcbiAgICAgICAgICAgIGNsYXNzZXMgPSBfcGFyYW1zJGNsYXNzZXMgPT09IHZvaWQgMCA/IFtdIDogX3BhcmFtcyRjbGFzc2VzO1xuICAgICAgICByZXR1cm4gZG9tVmFyaWFudHMoe1xuICAgICAgICAgIHR5cGU6ICdsYXllcidcbiAgICAgICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNhbGxIb29rcygnYmVmb3JlRE9NRWxlbWVudENyZWF0aW9uJywge1xuICAgICAgICAgICAgYXNzZW1ibGVyOiBhc3NlbWJsZXIsXG4gICAgICAgICAgICBwYXJhbXM6IHBhcmFtc1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHZhciBjaGlsZHJlbiA9IFtdO1xuICAgICAgICAgIGFzc2VtYmxlcihmdW5jdGlvbiAoYXJncykge1xuICAgICAgICAgICAgQXJyYXkuaXNBcnJheShhcmdzKSA/IGFyZ3MubWFwKGZ1bmN0aW9uIChhKSB7XG4gICAgICAgICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4uY29uY2F0KGEuYWJzdHJhY3QpO1xuICAgICAgICAgICAgfSkgOiBjaGlsZHJlbiA9IGNoaWxkcmVuLmNvbmNhdChhcmdzLmFic3RyYWN0KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gW3tcbiAgICAgICAgICAgIHRhZzogJ3NwYW4nLFxuICAgICAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgICAgICBjbGFzczogW1wiXCIuY29uY2F0KGNvbmZpZy5jc3NQcmVmaXgsIFwiLWxheWVyc1wiKV0uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShjbGFzc2VzKSkuam9pbignICcpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2hpbGRyZW46IGNoaWxkcmVuXG4gICAgICAgICAgfV07XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG4gIH1cbn07XG5cbnZhciBMYXllcnNDb3VudGVyID0ge1xuICBtaXhvdXQ6IGZ1bmN0aW9uIG1peG91dCgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY291bnRlcjogZnVuY3Rpb24gY291bnRlcihjb250ZW50KSB7XG4gICAgICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICAgICAgICB2YXIgX3BhcmFtcyR0aXRsZSA9IHBhcmFtcy50aXRsZSxcbiAgICAgICAgICAgIHRpdGxlID0gX3BhcmFtcyR0aXRsZSA9PT0gdm9pZCAwID8gbnVsbCA6IF9wYXJhbXMkdGl0bGUsXG4gICAgICAgICAgICBfcGFyYW1zJGNsYXNzZXMgPSBwYXJhbXMuY2xhc3NlcyxcbiAgICAgICAgICAgIGNsYXNzZXMgPSBfcGFyYW1zJGNsYXNzZXMgPT09IHZvaWQgMCA/IFtdIDogX3BhcmFtcyRjbGFzc2VzLFxuICAgICAgICAgICAgX3BhcmFtcyRhdHRyaWJ1dGVzID0gcGFyYW1zLmF0dHJpYnV0ZXMsXG4gICAgICAgICAgICBhdHRyaWJ1dGVzID0gX3BhcmFtcyRhdHRyaWJ1dGVzID09PSB2b2lkIDAgPyB7fSA6IF9wYXJhbXMkYXR0cmlidXRlcyxcbiAgICAgICAgICAgIF9wYXJhbXMkc3R5bGVzID0gcGFyYW1zLnN0eWxlcyxcbiAgICAgICAgICAgIHN0eWxlcyA9IF9wYXJhbXMkc3R5bGVzID09PSB2b2lkIDAgPyB7fSA6IF9wYXJhbXMkc3R5bGVzO1xuICAgICAgICByZXR1cm4gZG9tVmFyaWFudHMoe1xuICAgICAgICAgIHR5cGU6ICdjb3VudGVyJyxcbiAgICAgICAgICBjb250ZW50OiBjb250ZW50XG4gICAgICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjYWxsSG9va3MoJ2JlZm9yZURPTUVsZW1lbnRDcmVhdGlvbicsIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IGNvbnRlbnQsXG4gICAgICAgICAgICBwYXJhbXM6IHBhcmFtc1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBtYWtlTGF5ZXJzQ291bnRlckFic3RyYWN0KHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IGNvbnRlbnQudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcbiAgICAgICAgICAgIGV4dHJhOiB7XG4gICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IGF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgIHN0eWxlczogc3R5bGVzLFxuICAgICAgICAgICAgICBjbGFzc2VzOiBbXCJcIi5jb25jYXQoY29uZmlnLmNzc1ByZWZpeCwgXCItbGF5ZXJzLWNvdW50ZXJcIildLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoY2xhc3NlcykpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG4gIH1cbn07XG5cbnZhciBMYXllcnNUZXh0ID0ge1xuICBtaXhvdXQ6IGZ1bmN0aW9uIG1peG91dCgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdGV4dDogZnVuY3Rpb24gdGV4dChjb250ZW50KSB7XG4gICAgICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICAgICAgICB2YXIgX3BhcmFtcyR0cmFuc2Zvcm0gPSBwYXJhbXMudHJhbnNmb3JtLFxuICAgICAgICAgICAgdHJhbnNmb3JtID0gX3BhcmFtcyR0cmFuc2Zvcm0gPT09IHZvaWQgMCA/IG1lYW5pbmdsZXNzVHJhbnNmb3JtIDogX3BhcmFtcyR0cmFuc2Zvcm0sXG4gICAgICAgICAgICBfcGFyYW1zJHRpdGxlID0gcGFyYW1zLnRpdGxlLFxuICAgICAgICAgICAgdGl0bGUgPSBfcGFyYW1zJHRpdGxlID09PSB2b2lkIDAgPyBudWxsIDogX3BhcmFtcyR0aXRsZSxcbiAgICAgICAgICAgIF9wYXJhbXMkY2xhc3NlcyA9IHBhcmFtcy5jbGFzc2VzLFxuICAgICAgICAgICAgY2xhc3NlcyA9IF9wYXJhbXMkY2xhc3NlcyA9PT0gdm9pZCAwID8gW10gOiBfcGFyYW1zJGNsYXNzZXMsXG4gICAgICAgICAgICBfcGFyYW1zJGF0dHJpYnV0ZXMgPSBwYXJhbXMuYXR0cmlidXRlcyxcbiAgICAgICAgICAgIGF0dHJpYnV0ZXMgPSBfcGFyYW1zJGF0dHJpYnV0ZXMgPT09IHZvaWQgMCA/IHt9IDogX3BhcmFtcyRhdHRyaWJ1dGVzLFxuICAgICAgICAgICAgX3BhcmFtcyRzdHlsZXMgPSBwYXJhbXMuc3R5bGVzLFxuICAgICAgICAgICAgc3R5bGVzID0gX3BhcmFtcyRzdHlsZXMgPT09IHZvaWQgMCA/IHt9IDogX3BhcmFtcyRzdHlsZXM7XG4gICAgICAgIHJldHVybiBkb21WYXJpYW50cyh7XG4gICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgIGNvbnRlbnQ6IGNvbnRlbnRcbiAgICAgICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNhbGxIb29rcygnYmVmb3JlRE9NRWxlbWVudENyZWF0aW9uJywge1xuICAgICAgICAgICAgY29udGVudDogY29udGVudCxcbiAgICAgICAgICAgIHBhcmFtczogcGFyYW1zXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIG1ha2VMYXllcnNUZXh0QWJzdHJhY3Qoe1xuICAgICAgICAgICAgY29udGVudDogY29udGVudCxcbiAgICAgICAgICAgIHRyYW5zZm9ybTogX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIG1lYW5pbmdsZXNzVHJhbnNmb3JtKSwgdHJhbnNmb3JtKSxcbiAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcbiAgICAgICAgICAgIGV4dHJhOiB7XG4gICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IGF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgIHN0eWxlczogc3R5bGVzLFxuICAgICAgICAgICAgICBjbGFzc2VzOiBbXCJcIi5jb25jYXQoY29uZmlnLmNzc1ByZWZpeCwgXCItbGF5ZXJzLXRleHRcIildLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoY2xhc3NlcykpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG4gIH0sXG4gIHByb3ZpZGVzOiBmdW5jdGlvbiBwcm92aWRlcyhwcm92aWRlcnMkJDEpIHtcbiAgICBwcm92aWRlcnMkJDEuZ2VuZXJhdGVMYXllcnNUZXh0ID0gZnVuY3Rpb24gKG5vZGUsIG5vZGVNZXRhKSB7XG4gICAgICB2YXIgdGl0bGUgPSBub2RlTWV0YS50aXRsZSxcbiAgICAgICAgICB0cmFuc2Zvcm0gPSBub2RlTWV0YS50cmFuc2Zvcm0sXG4gICAgICAgICAgZXh0cmEgPSBub2RlTWV0YS5leHRyYTtcbiAgICAgIHZhciB3aWR0aCA9IG51bGw7XG4gICAgICB2YXIgaGVpZ2h0ID0gbnVsbDtcblxuICAgICAgaWYgKElTX0lFKSB7XG4gICAgICAgIHZhciBjb21wdXRlZEZvbnRTaXplID0gcGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZShub2RlKS5mb250U2l6ZSwgMTApO1xuICAgICAgICB2YXIgYm91bmRpbmdDbGllbnRSZWN0ID0gbm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgd2lkdGggPSBib3VuZGluZ0NsaWVudFJlY3Qud2lkdGggLyBjb21wdXRlZEZvbnRTaXplO1xuICAgICAgICBoZWlnaHQgPSBib3VuZGluZ0NsaWVudFJlY3QuaGVpZ2h0IC8gY29tcHV0ZWRGb250U2l6ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5hdXRvQTExeSAmJiAhdGl0bGUpIHtcbiAgICAgICAgZXh0cmEuYXR0cmlidXRlc1snYXJpYS1oaWRkZW4nXSA9ICd0cnVlJztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShbbm9kZSwgbWFrZUxheWVyc1RleHRBYnN0cmFjdCh7XG4gICAgICAgIGNvbnRlbnQ6IG5vZGUuaW5uZXJIVE1MLFxuICAgICAgICB3aWR0aDogd2lkdGgsXG4gICAgICAgIGhlaWdodDogaGVpZ2h0LFxuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zZm9ybSxcbiAgICAgICAgdGl0bGU6IHRpdGxlLFxuICAgICAgICBleHRyYTogZXh0cmEsXG4gICAgICAgIHdhdGNoYWJsZTogdHJ1ZVxuICAgICAgfSldKTtcbiAgICB9O1xuICB9XG59O1xuXG52YXIgQ0xFQU5fQ09OVEVOVF9QQVRURVJOID0gbmV3IFJlZ0V4cChcIlxcXCJcIiwgJ3VnJyk7XG52YXIgU0VDT05EQVJZX1VOSUNPREVfUkFOR0UgPSBbMTEwNTkyMCwgMTExMjMxOV07XG5mdW5jdGlvbiBoZXhWYWx1ZUZyb21Db250ZW50KGNvbnRlbnQpIHtcbiAgdmFyIGNsZWFuZWQgPSBjb250ZW50LnJlcGxhY2UoQ0xFQU5fQ09OVEVOVF9QQVRURVJOLCAnJyk7XG4gIHZhciBjb2RlUG9pbnQgPSBjb2RlUG9pbnRBdChjbGVhbmVkLCAwKTtcbiAgdmFyIGlzUHJlcGVuZFRlbiA9IGNvZGVQb2ludCA+PSBTRUNPTkRBUllfVU5JQ09ERV9SQU5HRVswXSAmJiBjb2RlUG9pbnQgPD0gU0VDT05EQVJZX1VOSUNPREVfUkFOR0VbMV07XG4gIHZhciBpc0RvdWJsZWQgPSBjbGVhbmVkLmxlbmd0aCA9PT0gMiA/IGNsZWFuZWRbMF0gPT09IGNsZWFuZWRbMV0gOiBmYWxzZTtcbiAgcmV0dXJuIHtcbiAgICB2YWx1ZTogaXNEb3VibGVkID8gdG9IZXgoY2xlYW5lZFswXSkgOiB0b0hleChjbGVhbmVkKSxcbiAgICBpc1NlY29uZGFyeTogaXNQcmVwZW5kVGVuIHx8IGlzRG91YmxlZFxuICB9O1xufVxuXG5mdW5jdGlvbiByZXBsYWNlRm9yUG9zaXRpb24obm9kZSwgcG9zaXRpb24pIHtcbiAgdmFyIHBlbmRpbmdBdHRyaWJ1dGUgPSBcIlwiLmNvbmNhdChEQVRBX0ZBX1BTRVVET19FTEVNRU5UX1BFTkRJTkcpLmNvbmNhdChwb3NpdGlvbi5yZXBsYWNlKCc6JywgJy0nKSk7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgaWYgKG5vZGUuZ2V0QXR0cmlidXRlKHBlbmRpbmdBdHRyaWJ1dGUpICE9PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIG5vZGUgaXMgYWxyZWFkeSBiZWluZyBwcm9jZXNzZWRcbiAgICAgIHJldHVybiByZXNvbHZlKCk7XG4gICAgfVxuXG4gICAgdmFyIGNoaWxkcmVuID0gdG9BcnJheShub2RlLmNoaWxkcmVuKTtcbiAgICB2YXIgYWxyZWFkeVByb2Nlc3NlZFBzZXVkb0VsZW1lbnQgPSBjaGlsZHJlbi5maWx0ZXIoZnVuY3Rpb24gKGMpIHtcbiAgICAgIHJldHVybiBjLmdldEF0dHJpYnV0ZShEQVRBX0ZBX1BTRVVET19FTEVNRU5UKSA9PT0gcG9zaXRpb247XG4gICAgfSlbMF07XG4gICAgdmFyIHN0eWxlcyA9IFdJTkRPVy5nZXRDb21wdXRlZFN0eWxlKG5vZGUsIHBvc2l0aW9uKTtcbiAgICB2YXIgZm9udEZhbWlseSA9IHN0eWxlcy5nZXRQcm9wZXJ0eVZhbHVlKCdmb250LWZhbWlseScpLm1hdGNoKEZPTlRfRkFNSUxZX1BBVFRFUk4pO1xuICAgIHZhciBmb250V2VpZ2h0ID0gc3R5bGVzLmdldFByb3BlcnR5VmFsdWUoJ2ZvbnQtd2VpZ2h0Jyk7XG4gICAgdmFyIGNvbnRlbnQgPSBzdHlsZXMuZ2V0UHJvcGVydHlWYWx1ZSgnY29udGVudCcpO1xuXG4gICAgaWYgKGFscmVhZHlQcm9jZXNzZWRQc2V1ZG9FbGVtZW50ICYmICFmb250RmFtaWx5KSB7XG4gICAgICAvLyBJZiB3ZSd2ZSBhbHJlYWR5IHByb2Nlc3NlZCBpdCBidXQgdGhlIGN1cnJlbnQgY29tcHV0ZWQgc3R5bGUgZG9lcyBub3QgcmVzdWx0IGluIGEgZm9udC1mYW1pbHksXG4gICAgICAvLyB0aGF0IHByb2JhYmx5IG1lYW5zIHRoYXQgYSBjbGFzcyBuYW1lIHRoYXQgd2FzIHByZXZpb3VzbHkgcHJlc2VudCB0byBtYWtlIHRoZSBpY29uIGhhcyBiZWVuXG4gICAgICAvLyByZW1vdmVkLiBTbyB3ZSBub3cgc2hvdWxkIGRlbGV0ZSB0aGUgaWNvbi5cbiAgICAgIG5vZGUucmVtb3ZlQ2hpbGQoYWxyZWFkeVByb2Nlc3NlZFBzZXVkb0VsZW1lbnQpO1xuICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICB9IGVsc2UgaWYgKGZvbnRGYW1pbHkgJiYgY29udGVudCAhPT0gJ25vbmUnICYmIGNvbnRlbnQgIT09ICcnKSB7XG4gICAgICB2YXIgX2NvbnRlbnQgPSBzdHlsZXMuZ2V0UHJvcGVydHlWYWx1ZSgnY29udGVudCcpO1xuXG4gICAgICB2YXIgZmFtaWx5ID0gflsnU2hhcnAnXS5pbmRleE9mKGZvbnRGYW1pbHlbMl0pID8gRkFNSUxZX1NIQVJQIDogRkFNSUxZX0NMQVNTSUM7XG4gICAgICB2YXIgcHJlZml4ID0gflsnU29saWQnLCAnUmVndWxhcicsICdMaWdodCcsICdUaGluJywgJ0R1b3RvbmUnLCAnQnJhbmRzJywgJ0tpdCddLmluZGV4T2YoZm9udEZhbWlseVsyXSkgPyBTVFlMRV9UT19QUkVGSVhbZmFtaWx5XVtmb250RmFtaWx5WzJdLnRvTG93ZXJDYXNlKCldIDogRk9OVF9XRUlHSFRfVE9fUFJFRklYW2ZhbWlseV1bZm9udFdlaWdodF07XG5cbiAgICAgIHZhciBfaGV4VmFsdWVGcm9tQ29udGVudCA9IGhleFZhbHVlRnJvbUNvbnRlbnQoX2NvbnRlbnQpLFxuICAgICAgICAgIGhleFZhbHVlID0gX2hleFZhbHVlRnJvbUNvbnRlbnQudmFsdWUsXG4gICAgICAgICAgaXNTZWNvbmRhcnkgPSBfaGV4VmFsdWVGcm9tQ29udGVudC5pc1NlY29uZGFyeTtcblxuICAgICAgdmFyIGlzVjQgPSBmb250RmFtaWx5WzBdLnN0YXJ0c1dpdGgoJ0ZvbnRBd2Vzb21lJyk7XG4gICAgICB2YXIgaWNvbk5hbWUgPSBieVVuaWNvZGUocHJlZml4LCBoZXhWYWx1ZSk7XG4gICAgICB2YXIgaWNvbklkZW50aWZpZXIgPSBpY29uTmFtZTtcblxuICAgICAgaWYgKGlzVjQpIHtcbiAgICAgICAgdmFyIGljb25OYW1lNCA9IGJ5T2xkVW5pY29kZShoZXhWYWx1ZSk7XG5cbiAgICAgICAgaWYgKGljb25OYW1lNC5pY29uTmFtZSAmJiBpY29uTmFtZTQucHJlZml4KSB7XG4gICAgICAgICAgaWNvbk5hbWUgPSBpY29uTmFtZTQuaWNvbk5hbWU7XG4gICAgICAgICAgcHJlZml4ID0gaWNvbk5hbWU0LnByZWZpeDtcbiAgICAgICAgfVxuICAgICAgfSAvLyBPbmx5IGNvbnZlcnQgdGhlIHBzZXVkbyBlbGVtZW50IGluIHRoaXMgOjpiZWZvcmUvOjphZnRlciBwb3NpdGlvbiBpbnRvIGFuIGljb24gaWYgd2UgaGF2ZW4ndFxuICAgICAgLy8gYWxyZWFkeSBkb25lIHNvIHdpdGggdGhlIHNhbWUgcHJlZml4IGFuZCBpY29uTmFtZVxuXG5cbiAgICAgIGlmIChpY29uTmFtZSAmJiAhaXNTZWNvbmRhcnkgJiYgKCFhbHJlYWR5UHJvY2Vzc2VkUHNldWRvRWxlbWVudCB8fCBhbHJlYWR5UHJvY2Vzc2VkUHNldWRvRWxlbWVudC5nZXRBdHRyaWJ1dGUoREFUQV9QUkVGSVgpICE9PSBwcmVmaXggfHwgYWxyZWFkeVByb2Nlc3NlZFBzZXVkb0VsZW1lbnQuZ2V0QXR0cmlidXRlKERBVEFfSUNPTikgIT09IGljb25JZGVudGlmaWVyKSkge1xuICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShwZW5kaW5nQXR0cmlidXRlLCBpY29uSWRlbnRpZmllcik7XG5cbiAgICAgICAgaWYgKGFscmVhZHlQcm9jZXNzZWRQc2V1ZG9FbGVtZW50KSB7XG4gICAgICAgICAgLy8gRGVsZXRlIHRoZSBvbGQgb25lLCBzaW5jZSB3ZSdyZSByZXBsYWNpbmcgaXQgd2l0aCBhIG5ldyBvbmVcbiAgICAgICAgICBub2RlLnJlbW92ZUNoaWxkKGFscmVhZHlQcm9jZXNzZWRQc2V1ZG9FbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBtZXRhID0gYmxhbmtNZXRhKCk7XG4gICAgICAgIHZhciBleHRyYSA9IG1ldGEuZXh0cmE7XG4gICAgICAgIGV4dHJhLmF0dHJpYnV0ZXNbREFUQV9GQV9QU0VVRE9fRUxFTUVOVF0gPSBwb3NpdGlvbjtcbiAgICAgICAgZmluZEljb24oaWNvbk5hbWUsIHByZWZpeCkudGhlbihmdW5jdGlvbiAobWFpbikge1xuICAgICAgICAgIHZhciBfYWJzdHJhY3QgPSBtYWtlSW5saW5lU3ZnQWJzdHJhY3QoX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIG1ldGEpLCB7fSwge1xuICAgICAgICAgICAgaWNvbnM6IHtcbiAgICAgICAgICAgICAgbWFpbjogbWFpbixcbiAgICAgICAgICAgICAgbWFzazogZW1wdHlDYW5vbmljYWxJY29uKClcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwcmVmaXg6IHByZWZpeCxcbiAgICAgICAgICAgIGljb25OYW1lOiBpY29uSWRlbnRpZmllcixcbiAgICAgICAgICAgIGV4dHJhOiBleHRyYSxcbiAgICAgICAgICAgIHdhdGNoYWJsZTogdHJ1ZVxuICAgICAgICAgIH0pKTtcblxuICAgICAgICAgIHZhciBlbGVtZW50ID0gRE9DVU1FTlQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdzdmcnKTtcblxuICAgICAgICAgIGlmIChwb3NpdGlvbiA9PT0gJzo6YmVmb3JlJykge1xuICAgICAgICAgICAgbm9kZS5pbnNlcnRCZWZvcmUoZWxlbWVudCwgbm9kZS5maXJzdENoaWxkKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbm9kZS5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBlbGVtZW50Lm91dGVySFRNTCA9IF9hYnN0cmFjdC5tYXAoZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgICAgIHJldHVybiB0b0h0bWwoYSk7XG4gICAgICAgICAgfSkuam9pbignXFxuJyk7XG4gICAgICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUocGVuZGluZ0F0dHJpYnV0ZSk7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9KS5jYXRjaChyZWplY3QpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gcmVwbGFjZShub2RlKSB7XG4gIHJldHVybiBQcm9taXNlLmFsbChbcmVwbGFjZUZvclBvc2l0aW9uKG5vZGUsICc6OmJlZm9yZScpLCByZXBsYWNlRm9yUG9zaXRpb24obm9kZSwgJzo6YWZ0ZXInKV0pO1xufVxuXG5mdW5jdGlvbiBwcm9jZXNzYWJsZShub2RlKSB7XG4gIHJldHVybiBub2RlLnBhcmVudE5vZGUgIT09IGRvY3VtZW50LmhlYWQgJiYgIX5UQUdOQU1FU19UT19TS0lQX0ZPUl9QU0VVRE9FTEVNRU5UUy5pbmRleE9mKG5vZGUudGFnTmFtZS50b1VwcGVyQ2FzZSgpKSAmJiAhbm9kZS5nZXRBdHRyaWJ1dGUoREFUQV9GQV9QU0VVRE9fRUxFTUVOVCkgJiYgKCFub2RlLnBhcmVudE5vZGUgfHwgbm9kZS5wYXJlbnROb2RlLnRhZ05hbWUgIT09ICdzdmcnKTtcbn1cblxuZnVuY3Rpb24gc2VhcmNoUHNldWRvRWxlbWVudHMocm9vdCkge1xuICBpZiAoIUlTX0RPTSkgcmV0dXJuO1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgIHZhciBvcGVyYXRpb25zID0gdG9BcnJheShyb290LnF1ZXJ5U2VsZWN0b3JBbGwoJyonKSkuZmlsdGVyKHByb2Nlc3NhYmxlKS5tYXAocmVwbGFjZSk7XG4gICAgdmFyIGVuZCA9IHBlcmYuYmVnaW4oJ3NlYXJjaFBzZXVkb0VsZW1lbnRzJyk7XG4gICAgZGlzYWJsZU9ic2VydmF0aW9uKCk7XG4gICAgUHJvbWlzZS5hbGwob3BlcmF0aW9ucykudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICBlbmQoKTtcbiAgICAgIGVuYWJsZU9ic2VydmF0aW9uKCk7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSkuY2F0Y2goZnVuY3Rpb24gKCkge1xuICAgICAgZW5kKCk7XG4gICAgICBlbmFibGVPYnNlcnZhdGlvbigpO1xuICAgICAgcmVqZWN0KCk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG52YXIgUHNldWRvRWxlbWVudHMgPSB7XG4gIGhvb2tzOiBmdW5jdGlvbiBob29rcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbXV0YXRpb25PYnNlcnZlckNhbGxiYWNrczogZnVuY3Rpb24gbXV0YXRpb25PYnNlcnZlckNhbGxiYWNrcyhhY2N1bXVsYXRvcikge1xuICAgICAgICBhY2N1bXVsYXRvci5wc2V1ZG9FbGVtZW50c0NhbGxiYWNrID0gc2VhcmNoUHNldWRvRWxlbWVudHM7XG4gICAgICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgICAgIH1cbiAgICB9O1xuICB9LFxuICBwcm92aWRlczogZnVuY3Rpb24gcHJvdmlkZXMocHJvdmlkZXJzJCQxKSB7XG4gICAgcHJvdmlkZXJzJCQxLnBzZXVkb0VsZW1lbnRzMnN2ZyA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgIHZhciBfcGFyYW1zJG5vZGUgPSBwYXJhbXMubm9kZSxcbiAgICAgICAgICBub2RlID0gX3BhcmFtcyRub2RlID09PSB2b2lkIDAgPyBET0NVTUVOVCA6IF9wYXJhbXMkbm9kZTtcblxuICAgICAgaWYgKGNvbmZpZy5zZWFyY2hQc2V1ZG9FbGVtZW50cykge1xuICAgICAgICBzZWFyY2hQc2V1ZG9FbGVtZW50cyhub2RlKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG59O1xuXG52YXIgX3Vud2F0Y2hlZCA9IGZhbHNlO1xudmFyIE11dGF0aW9uT2JzZXJ2ZXIkMSA9IHtcbiAgbWl4b3V0OiBmdW5jdGlvbiBtaXhvdXQoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRvbToge1xuICAgICAgICB1bndhdGNoOiBmdW5jdGlvbiB1bndhdGNoKCkge1xuICAgICAgICAgIGRpc2FibGVPYnNlcnZhdGlvbigpO1xuICAgICAgICAgIF91bndhdGNoZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfSxcbiAgaG9va3M6IGZ1bmN0aW9uIGhvb2tzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBib290c3RyYXA6IGZ1bmN0aW9uIGJvb3RzdHJhcCgpIHtcbiAgICAgICAgb2JzZXJ2ZShjaGFpbkhvb2tzKCdtdXRhdGlvbk9ic2VydmVyQ2FsbGJhY2tzJywge30pKTtcbiAgICAgIH0sXG4gICAgICBub0F1dG86IGZ1bmN0aW9uIG5vQXV0bygpIHtcbiAgICAgICAgZGlzY29ubmVjdCgpO1xuICAgICAgfSxcbiAgICAgIHdhdGNoOiBmdW5jdGlvbiB3YXRjaChwYXJhbXMpIHtcbiAgICAgICAgdmFyIG9ic2VydmVNdXRhdGlvbnNSb290ID0gcGFyYW1zLm9ic2VydmVNdXRhdGlvbnNSb290O1xuXG4gICAgICAgIGlmIChfdW53YXRjaGVkKSB7XG4gICAgICAgICAgZW5hYmxlT2JzZXJ2YXRpb24oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvYnNlcnZlKGNoYWluSG9va3MoJ211dGF0aW9uT2JzZXJ2ZXJDYWxsYmFja3MnLCB7XG4gICAgICAgICAgICBvYnNlcnZlTXV0YXRpb25zUm9vdDogb2JzZXJ2ZU11dGF0aW9uc1Jvb3RcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG59O1xuXG52YXIgcGFyc2VUcmFuc2Zvcm1TdHJpbmcgPSBmdW5jdGlvbiBwYXJzZVRyYW5zZm9ybVN0cmluZyh0cmFuc2Zvcm1TdHJpbmcpIHtcbiAgdmFyIHRyYW5zZm9ybSA9IHtcbiAgICBzaXplOiAxNixcbiAgICB4OiAwLFxuICAgIHk6IDAsXG4gICAgZmxpcFg6IGZhbHNlLFxuICAgIGZsaXBZOiBmYWxzZSxcbiAgICByb3RhdGU6IDBcbiAgfTtcbiAgcmV0dXJuIHRyYW5zZm9ybVN0cmluZy50b0xvd2VyQ2FzZSgpLnNwbGl0KCcgJykucmVkdWNlKGZ1bmN0aW9uIChhY2MsIG4pIHtcbiAgICB2YXIgcGFydHMgPSBuLnRvTG93ZXJDYXNlKCkuc3BsaXQoJy0nKTtcbiAgICB2YXIgZmlyc3QgPSBwYXJ0c1swXTtcbiAgICB2YXIgcmVzdCA9IHBhcnRzLnNsaWNlKDEpLmpvaW4oJy0nKTtcblxuICAgIGlmIChmaXJzdCAmJiByZXN0ID09PSAnaCcpIHtcbiAgICAgIGFjYy5mbGlwWCA9IHRydWU7XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH1cblxuICAgIGlmIChmaXJzdCAmJiByZXN0ID09PSAndicpIHtcbiAgICAgIGFjYy5mbGlwWSA9IHRydWU7XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH1cblxuICAgIHJlc3QgPSBwYXJzZUZsb2F0KHJlc3QpO1xuXG4gICAgaWYgKGlzTmFOKHJlc3QpKSB7XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH1cblxuICAgIHN3aXRjaCAoZmlyc3QpIHtcbiAgICAgIGNhc2UgJ2dyb3cnOlxuICAgICAgICBhY2Muc2l6ZSA9IGFjYy5zaXplICsgcmVzdDtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3Nocmluayc6XG4gICAgICAgIGFjYy5zaXplID0gYWNjLnNpemUgLSByZXN0O1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICAgIGFjYy54ID0gYWNjLnggLSByZXN0O1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgICBhY2MueCA9IGFjYy54ICsgcmVzdDtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3VwJzpcbiAgICAgICAgYWNjLnkgPSBhY2MueSAtIHJlc3Q7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdkb3duJzpcbiAgICAgICAgYWNjLnkgPSBhY2MueSArIHJlc3Q7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdyb3RhdGUnOlxuICAgICAgICBhY2Mucm90YXRlID0gYWNjLnJvdGF0ZSArIHJlc3Q7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiBhY2M7XG4gIH0sIHRyYW5zZm9ybSk7XG59O1xudmFyIFBvd2VyVHJhbnNmb3JtcyA9IHtcbiAgbWl4b3V0OiBmdW5jdGlvbiBtaXhvdXQoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhcnNlOiB7XG4gICAgICAgIHRyYW5zZm9ybTogZnVuY3Rpb24gdHJhbnNmb3JtKHRyYW5zZm9ybVN0cmluZykge1xuICAgICAgICAgIHJldHVybiBwYXJzZVRyYW5zZm9ybVN0cmluZyh0cmFuc2Zvcm1TdHJpbmcpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfSxcbiAgaG9va3M6IGZ1bmN0aW9uIGhvb2tzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBwYXJzZU5vZGVBdHRyaWJ1dGVzOiBmdW5jdGlvbiBwYXJzZU5vZGVBdHRyaWJ1dGVzKGFjY3VtdWxhdG9yLCBub2RlKSB7XG4gICAgICAgIHZhciB0cmFuc2Zvcm1TdHJpbmcgPSBub2RlLmdldEF0dHJpYnV0ZSgnZGF0YS1mYS10cmFuc2Zvcm0nKTtcblxuICAgICAgICBpZiAodHJhbnNmb3JtU3RyaW5nKSB7XG4gICAgICAgICAgYWNjdW11bGF0b3IudHJhbnNmb3JtID0gcGFyc2VUcmFuc2Zvcm1TdHJpbmcodHJhbnNmb3JtU3RyaW5nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgICAgIH1cbiAgICB9O1xuICB9LFxuICBwcm92aWRlczogZnVuY3Rpb24gcHJvdmlkZXMocHJvdmlkZXJzKSB7XG4gICAgcHJvdmlkZXJzLmdlbmVyYXRlQWJzdHJhY3RUcmFuc2Zvcm1Hcm91cGluZyA9IGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgICB2YXIgbWFpbiA9IF9yZWYubWFpbixcbiAgICAgICAgICB0cmFuc2Zvcm0gPSBfcmVmLnRyYW5zZm9ybSxcbiAgICAgICAgICBjb250YWluZXJXaWR0aCA9IF9yZWYuY29udGFpbmVyV2lkdGgsXG4gICAgICAgICAgaWNvbldpZHRoID0gX3JlZi5pY29uV2lkdGg7XG4gICAgICB2YXIgb3V0ZXIgPSB7XG4gICAgICAgIHRyYW5zZm9ybTogXCJ0cmFuc2xhdGUoXCIuY29uY2F0KGNvbnRhaW5lcldpZHRoIC8gMiwgXCIgMjU2KVwiKVxuICAgICAgfTtcbiAgICAgIHZhciBpbm5lclRyYW5zbGF0ZSA9IFwidHJhbnNsYXRlKFwiLmNvbmNhdCh0cmFuc2Zvcm0ueCAqIDMyLCBcIiwgXCIpLmNvbmNhdCh0cmFuc2Zvcm0ueSAqIDMyLCBcIikgXCIpO1xuICAgICAgdmFyIGlubmVyU2NhbGUgPSBcInNjYWxlKFwiLmNvbmNhdCh0cmFuc2Zvcm0uc2l6ZSAvIDE2ICogKHRyYW5zZm9ybS5mbGlwWCA/IC0xIDogMSksIFwiLCBcIikuY29uY2F0KHRyYW5zZm9ybS5zaXplIC8gMTYgKiAodHJhbnNmb3JtLmZsaXBZID8gLTEgOiAxKSwgXCIpIFwiKTtcbiAgICAgIHZhciBpbm5lclJvdGF0ZSA9IFwicm90YXRlKFwiLmNvbmNhdCh0cmFuc2Zvcm0ucm90YXRlLCBcIiAwIDApXCIpO1xuICAgICAgdmFyIGlubmVyID0ge1xuICAgICAgICB0cmFuc2Zvcm06IFwiXCIuY29uY2F0KGlubmVyVHJhbnNsYXRlLCBcIiBcIikuY29uY2F0KGlubmVyU2NhbGUsIFwiIFwiKS5jb25jYXQoaW5uZXJSb3RhdGUpXG4gICAgICB9O1xuICAgICAgdmFyIHBhdGggPSB7XG4gICAgICAgIHRyYW5zZm9ybTogXCJ0cmFuc2xhdGUoXCIuY29uY2F0KGljb25XaWR0aCAvIDIgKiAtMSwgXCIgLTI1NilcIilcbiAgICAgIH07XG4gICAgICB2YXIgb3BlcmF0aW9ucyA9IHtcbiAgICAgICAgb3V0ZXI6IG91dGVyLFxuICAgICAgICBpbm5lcjogaW5uZXIsXG4gICAgICAgIHBhdGg6IHBhdGhcbiAgICAgIH07XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0YWc6ICdnJyxcbiAgICAgICAgYXR0cmlidXRlczogX29iamVjdFNwcmVhZDIoe30sIG9wZXJhdGlvbnMub3V0ZXIpLFxuICAgICAgICBjaGlsZHJlbjogW3tcbiAgICAgICAgICB0YWc6ICdnJyxcbiAgICAgICAgICBhdHRyaWJ1dGVzOiBfb2JqZWN0U3ByZWFkMih7fSwgb3BlcmF0aW9ucy5pbm5lciksXG4gICAgICAgICAgY2hpbGRyZW46IFt7XG4gICAgICAgICAgICB0YWc6IG1haW4uaWNvbi50YWcsXG4gICAgICAgICAgICBjaGlsZHJlbjogbWFpbi5pY29uLmNoaWxkcmVuLFxuICAgICAgICAgICAgYXR0cmlidXRlczogX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIG1haW4uaWNvbi5hdHRyaWJ1dGVzKSwgb3BlcmF0aW9ucy5wYXRoKVxuICAgICAgICAgIH1dXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH07XG4gIH1cbn07XG5cbnZhciBBTExfU1BBQ0UgPSB7XG4gIHg6IDAsXG4gIHk6IDAsXG4gIHdpZHRoOiAnMTAwJScsXG4gIGhlaWdodDogJzEwMCUnXG59O1xuXG5mdW5jdGlvbiBmaWxsQmxhY2soX2Fic3RyYWN0KSB7XG4gIHZhciBmb3JjZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogdHJ1ZTtcblxuICBpZiAoX2Fic3RyYWN0LmF0dHJpYnV0ZXMgJiYgKF9hYnN0cmFjdC5hdHRyaWJ1dGVzLmZpbGwgfHwgZm9yY2UpKSB7XG4gICAgX2Fic3RyYWN0LmF0dHJpYnV0ZXMuZmlsbCA9ICdibGFjayc7XG4gIH1cblxuICByZXR1cm4gX2Fic3RyYWN0O1xufVxuXG5mdW5jdGlvbiBkZUdyb3VwKF9hYnN0cmFjdDIpIHtcbiAgaWYgKF9hYnN0cmFjdDIudGFnID09PSAnZycpIHtcbiAgICByZXR1cm4gX2Fic3RyYWN0Mi5jaGlsZHJlbjtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gW19hYnN0cmFjdDJdO1xuICB9XG59XG5cbnZhciBNYXNrcyA9IHtcbiAgaG9va3M6IGZ1bmN0aW9uIGhvb2tzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBwYXJzZU5vZGVBdHRyaWJ1dGVzOiBmdW5jdGlvbiBwYXJzZU5vZGVBdHRyaWJ1dGVzKGFjY3VtdWxhdG9yLCBub2RlKSB7XG4gICAgICAgIHZhciBtYXNrRGF0YSA9IG5vZGUuZ2V0QXR0cmlidXRlKCdkYXRhLWZhLW1hc2snKTtcbiAgICAgICAgdmFyIG1hc2sgPSAhbWFza0RhdGEgPyBlbXB0eUNhbm9uaWNhbEljb24oKSA6IGdldENhbm9uaWNhbEljb24obWFza0RhdGEuc3BsaXQoJyAnKS5tYXAoZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgICByZXR1cm4gaS50cmltKCk7XG4gICAgICAgIH0pKTtcblxuICAgICAgICBpZiAoIW1hc2sucHJlZml4KSB7XG4gICAgICAgICAgbWFzay5wcmVmaXggPSBnZXREZWZhdWx0VXNhYmxlUHJlZml4KCk7XG4gICAgICAgIH1cblxuICAgICAgICBhY2N1bXVsYXRvci5tYXNrID0gbWFzaztcbiAgICAgICAgYWNjdW11bGF0b3IubWFza0lkID0gbm9kZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtZmEtbWFzay1pZCcpO1xuICAgICAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gICAgICB9XG4gICAgfTtcbiAgfSxcbiAgcHJvdmlkZXM6IGZ1bmN0aW9uIHByb3ZpZGVzKHByb3ZpZGVycykge1xuICAgIHByb3ZpZGVycy5nZW5lcmF0ZUFic3RyYWN0TWFzayA9IGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgICB2YXIgY2hpbGRyZW4gPSBfcmVmLmNoaWxkcmVuLFxuICAgICAgICAgIGF0dHJpYnV0ZXMgPSBfcmVmLmF0dHJpYnV0ZXMsXG4gICAgICAgICAgbWFpbiA9IF9yZWYubWFpbixcbiAgICAgICAgICBtYXNrID0gX3JlZi5tYXNrLFxuICAgICAgICAgIGV4cGxpY2l0TWFza0lkID0gX3JlZi5tYXNrSWQsXG4gICAgICAgICAgdHJhbnNmb3JtID0gX3JlZi50cmFuc2Zvcm07XG4gICAgICB2YXIgbWFpbldpZHRoID0gbWFpbi53aWR0aCxcbiAgICAgICAgICBtYWluUGF0aCA9IG1haW4uaWNvbjtcbiAgICAgIHZhciBtYXNrV2lkdGggPSBtYXNrLndpZHRoLFxuICAgICAgICAgIG1hc2tQYXRoID0gbWFzay5pY29uO1xuICAgICAgdmFyIHRyYW5zID0gdHJhbnNmb3JtRm9yU3ZnKHtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2Zvcm0sXG4gICAgICAgIGNvbnRhaW5lcldpZHRoOiBtYXNrV2lkdGgsXG4gICAgICAgIGljb25XaWR0aDogbWFpbldpZHRoXG4gICAgICB9KTtcbiAgICAgIHZhciBtYXNrUmVjdCA9IHtcbiAgICAgICAgdGFnOiAncmVjdCcsXG4gICAgICAgIGF0dHJpYnV0ZXM6IF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBBTExfU1BBQ0UpLCB7fSwge1xuICAgICAgICAgIGZpbGw6ICd3aGl0ZSdcbiAgICAgICAgfSlcbiAgICAgIH07XG4gICAgICB2YXIgbWFza0lubmVyR3JvdXBDaGlsZHJlbk1peGluID0gbWFpblBhdGguY2hpbGRyZW4gPyB7XG4gICAgICAgIGNoaWxkcmVuOiBtYWluUGF0aC5jaGlsZHJlbi5tYXAoZmlsbEJsYWNrKVxuICAgICAgfSA6IHt9O1xuICAgICAgdmFyIG1hc2tJbm5lckdyb3VwID0ge1xuICAgICAgICB0YWc6ICdnJyxcbiAgICAgICAgYXR0cmlidXRlczogX29iamVjdFNwcmVhZDIoe30sIHRyYW5zLmlubmVyKSxcbiAgICAgICAgY2hpbGRyZW46IFtmaWxsQmxhY2soX29iamVjdFNwcmVhZDIoe1xuICAgICAgICAgIHRhZzogbWFpblBhdGgudGFnLFxuICAgICAgICAgIGF0dHJpYnV0ZXM6IF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBtYWluUGF0aC5hdHRyaWJ1dGVzKSwgdHJhbnMucGF0aClcbiAgICAgICAgfSwgbWFza0lubmVyR3JvdXBDaGlsZHJlbk1peGluKSldXG4gICAgICB9O1xuICAgICAgdmFyIG1hc2tPdXRlckdyb3VwID0ge1xuICAgICAgICB0YWc6ICdnJyxcbiAgICAgICAgYXR0cmlidXRlczogX29iamVjdFNwcmVhZDIoe30sIHRyYW5zLm91dGVyKSxcbiAgICAgICAgY2hpbGRyZW46IFttYXNrSW5uZXJHcm91cF1cbiAgICAgIH07XG4gICAgICB2YXIgbWFza0lkID0gXCJtYXNrLVwiLmNvbmNhdChleHBsaWNpdE1hc2tJZCB8fCBuZXh0VW5pcXVlSWQoKSk7XG4gICAgICB2YXIgY2xpcElkID0gXCJjbGlwLVwiLmNvbmNhdChleHBsaWNpdE1hc2tJZCB8fCBuZXh0VW5pcXVlSWQoKSk7XG4gICAgICB2YXIgbWFza1RhZyA9IHtcbiAgICAgICAgdGFnOiAnbWFzaycsXG4gICAgICAgIGF0dHJpYnV0ZXM6IF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBBTExfU1BBQ0UpLCB7fSwge1xuICAgICAgICAgIGlkOiBtYXNrSWQsXG4gICAgICAgICAgbWFza1VuaXRzOiAndXNlclNwYWNlT25Vc2UnLFxuICAgICAgICAgIG1hc2tDb250ZW50VW5pdHM6ICd1c2VyU3BhY2VPblVzZSdcbiAgICAgICAgfSksXG4gICAgICAgIGNoaWxkcmVuOiBbbWFza1JlY3QsIG1hc2tPdXRlckdyb3VwXVxuICAgICAgfTtcbiAgICAgIHZhciBkZWZzID0ge1xuICAgICAgICB0YWc6ICdkZWZzJyxcbiAgICAgICAgY2hpbGRyZW46IFt7XG4gICAgICAgICAgdGFnOiAnY2xpcFBhdGgnLFxuICAgICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICAgIGlkOiBjbGlwSWRcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNoaWxkcmVuOiBkZUdyb3VwKG1hc2tQYXRoKVxuICAgICAgICB9LCBtYXNrVGFnXVxuICAgICAgfTtcbiAgICAgIGNoaWxkcmVuLnB1c2goZGVmcywge1xuICAgICAgICB0YWc6ICdyZWN0JyxcbiAgICAgICAgYXR0cmlidXRlczogX29iamVjdFNwcmVhZDIoe1xuICAgICAgICAgIGZpbGw6ICdjdXJyZW50Q29sb3InLFxuICAgICAgICAgICdjbGlwLXBhdGgnOiBcInVybCgjXCIuY29uY2F0KGNsaXBJZCwgXCIpXCIpLFxuICAgICAgICAgIG1hc2s6IFwidXJsKCNcIi5jb25jYXQobWFza0lkLCBcIilcIilcbiAgICAgICAgfSwgQUxMX1NQQUNFKVxuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjaGlsZHJlbjogY2hpbGRyZW4sXG4gICAgICAgIGF0dHJpYnV0ZXM6IGF0dHJpYnV0ZXNcbiAgICAgIH07XG4gICAgfTtcbiAgfVxufTtcblxudmFyIE1pc3NpbmdJY29uSW5kaWNhdG9yID0ge1xuICBwcm92aWRlczogZnVuY3Rpb24gcHJvdmlkZXMocHJvdmlkZXJzKSB7XG4gICAgdmFyIHJlZHVjZU1vdGlvbiA9IGZhbHNlO1xuXG4gICAgaWYgKFdJTkRPVy5tYXRjaE1lZGlhKSB7XG4gICAgICByZWR1Y2VNb3Rpb24gPSBXSU5ET1cubWF0Y2hNZWRpYSgnKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZSknKS5tYXRjaGVzO1xuICAgIH1cblxuICAgIHByb3ZpZGVycy5taXNzaW5nSWNvbkFic3RyYWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGdDaGlsZHJlbiA9IFtdO1xuICAgICAgdmFyIEZJTEwgPSB7XG4gICAgICAgIGZpbGw6ICdjdXJyZW50Q29sb3InXG4gICAgICB9O1xuICAgICAgdmFyIEFOSU1BVElPTl9CQVNFID0ge1xuICAgICAgICBhdHRyaWJ1dGVUeXBlOiAnWE1MJyxcbiAgICAgICAgcmVwZWF0Q291bnQ6ICdpbmRlZmluaXRlJyxcbiAgICAgICAgZHVyOiAnMnMnXG4gICAgICB9OyAvLyBSaW5nXG5cbiAgICAgIGdDaGlsZHJlbi5wdXNoKHtcbiAgICAgICAgdGFnOiAncGF0aCcsXG4gICAgICAgIGF0dHJpYnV0ZXM6IF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBGSUxMKSwge30sIHtcbiAgICAgICAgICBkOiAnTTE1Ni41LDQ0Ny43bC0xMi42LDI5LjVjLTE4LjctOS41LTM1LjktMjEuMi01MS41LTM0LjlsMjIuNy0yMi43QzEyNy42LDQzMC41LDE0MS41LDQ0MCwxNTYuNSw0NDcuN3ogTTQwLjYsMjcySDguNSBjMS40LDIxLjIsNS40LDQxLjcsMTEuNyw2MS4xTDUwLDMyMS4yQzQ1LjEsMzA1LjUsNDEuOCwyODksNDAuNiwyNzJ6IE00MC42LDI0MGMxLjQtMTguOCw1LjItMzcsMTEuMS01NC4xbC0yOS41LTEyLjYgQzE0LjcsMTk0LjMsMTAsMjE2LjcsOC41LDI0MEg0MC42eiBNNjQuMywxNTYuNWM3LjgtMTQuOSwxNy4yLTI4LjgsMjguMS00MS41TDY5LjcsOTIuM2MtMTMuNywxNS42LTI1LjUsMzIuOC0zNC45LDUxLjUgTDY0LjMsMTU2LjV6IE0zOTcsNDE5LjZjLTEzLjksMTItMjkuNCwyMi4zLTQ2LjEsMzAuNGwxMS45LDI5LjhjMjAuNy05LjksMzkuOC0yMi42LDU2LjktMzcuNkwzOTcsNDE5LjZ6IE0xMTUsOTIuNCBjMTMuOS0xMiwyOS40LTIyLjMsNDYuMS0zMC40bC0xMS45LTI5LjhjLTIwLjcsOS45LTM5LjgsMjIuNi01Ni44LDM3LjZMMTE1LDkyLjR6IE00NDcuNywzNTUuNWMtNy44LDE0LjktMTcuMiwyOC44LTI4LjEsNDEuNSBsMjIuNywyMi43YzEzLjctMTUuNiwyNS41LTMyLjksMzQuOS01MS41TDQ0Ny43LDM1NS41eiBNNDcxLjQsMjcyYy0xLjQsMTguOC01LjIsMzctMTEuMSw1NC4xbDI5LjUsMTIuNiBjNy41LTIxLjEsMTIuMi00My41LDEzLjYtNjYuOEg0NzEuNHogTTMyMS4yLDQ2MmMtMTUuNyw1LTMyLjIsOC4yLTQ5LjIsOS40djMyLjFjMjEuMi0xLjQsNDEuNy01LjQsNjEuMS0xMS43TDMyMS4yLDQ2MnogTTI0MCw0NzEuNGMtMTguOC0xLjQtMzctNS4yLTU0LjEtMTEuMWwtMTIuNiwyOS41YzIxLjEsNy41LDQzLjUsMTIuMiw2Ni44LDEzLjZWNDcxLjR6IE00NjIsMTkwLjhjNSwxNS43LDguMiwzMi4yLDkuNCw0OS4yaDMyLjEgYy0xLjQtMjEuMi01LjQtNDEuNy0xMS43LTYxLjFMNDYyLDE5MC44eiBNOTIuNCwzOTdjLTEyLTEzLjktMjIuMy0yOS40LTMwLjQtNDYuMWwtMjkuOCwxMS45YzkuOSwyMC43LDIyLjYsMzkuOCwzNy42LDU2LjkgTDkyLjQsMzk3eiBNMjcyLDQwLjZjMTguOCwxLjQsMzYuOSw1LjIsNTQuMSwxMS4xbDEyLjYtMjkuNUMzMTcuNywxNC43LDI5NS4zLDEwLDI3Miw4LjVWNDAuNnogTTE5MC44LDUwIGMxNS43LTUsMzIuMi04LjIsNDkuMi05LjRWOC41Yy0yMS4yLDEuNC00MS43LDUuNC02MS4xLDExLjdMMTkwLjgsNTB6IE00NDIuMyw5Mi4zTDQxOS42LDExNWMxMiwxMy45LDIyLjMsMjkuNCwzMC41LDQ2LjEgbDI5LjgtMTEuOUM0NzAsMTI4LjUsNDU3LjMsMTA5LjQsNDQyLjMsOTIuM3ogTTM5Nyw5Mi40bDIyLjctMjIuN2MtMTUuNi0xMy43LTMyLjgtMjUuNS01MS41LTM0LjlsLTEyLjYsMjkuNSBDMzcwLjQsNzIuMSwzODQuNCw4MS41LDM5Nyw5Mi40eidcbiAgICAgICAgfSlcbiAgICAgIH0pO1xuXG4gICAgICB2YXIgT1BBQ0lUWV9BTklNQVRFID0gX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIEFOSU1BVElPTl9CQVNFKSwge30sIHtcbiAgICAgICAgYXR0cmlidXRlTmFtZTogJ29wYWNpdHknXG4gICAgICB9KTtcblxuICAgICAgdmFyIGRvdCA9IHtcbiAgICAgICAgdGFnOiAnY2lyY2xlJyxcbiAgICAgICAgYXR0cmlidXRlczogX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIEZJTEwpLCB7fSwge1xuICAgICAgICAgIGN4OiAnMjU2JyxcbiAgICAgICAgICBjeTogJzM2NCcsXG4gICAgICAgICAgcjogJzI4J1xuICAgICAgICB9KSxcbiAgICAgICAgY2hpbGRyZW46IFtdXG4gICAgICB9O1xuXG4gICAgICBpZiAoIXJlZHVjZU1vdGlvbikge1xuICAgICAgICBkb3QuY2hpbGRyZW4ucHVzaCh7XG4gICAgICAgICAgdGFnOiAnYW5pbWF0ZScsXG4gICAgICAgICAgYXR0cmlidXRlczogX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIEFOSU1BVElPTl9CQVNFKSwge30sIHtcbiAgICAgICAgICAgIGF0dHJpYnV0ZU5hbWU6ICdyJyxcbiAgICAgICAgICAgIHZhbHVlczogJzI4OzE0OzI4OzI4OzE0OzI4OydcbiAgICAgICAgICB9KVxuICAgICAgICB9LCB7XG4gICAgICAgICAgdGFnOiAnYW5pbWF0ZScsXG4gICAgICAgICAgYXR0cmlidXRlczogX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIE9QQUNJVFlfQU5JTUFURSksIHt9LCB7XG4gICAgICAgICAgICB2YWx1ZXM6ICcxOzA7MTsxOzA7MTsnXG4gICAgICAgICAgfSlcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGdDaGlsZHJlbi5wdXNoKGRvdCk7XG4gICAgICBnQ2hpbGRyZW4ucHVzaCh7XG4gICAgICAgIHRhZzogJ3BhdGgnLFxuICAgICAgICBhdHRyaWJ1dGVzOiBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgRklMTCksIHt9LCB7XG4gICAgICAgICAgb3BhY2l0eTogJzEnLFxuICAgICAgICAgIGQ6ICdNMjYzLjcsMzEyaC0xNmMtNi42LDAtMTItNS40LTEyLTEyYzAtNzEsNzcuNC02My45LDc3LjQtMTA3LjhjMC0yMC0xNy44LTQwLjItNTcuNC00MC4yYy0yOS4xLDAtNDQuMyw5LjYtNTkuMiwyOC43IGMtMy45LDUtMTEuMSw2LTE2LjIsMi40bC0xMy4xLTkuMmMtNS42LTMuOS02LjktMTEuOC0yLjYtMTcuMmMyMS4yLTI3LjIsNDYuNC00NC43LDkxLjItNDQuN2M1Mi4zLDAsOTcuNCwyOS44LDk3LjQsODAuMiBjMCw2Ny42LTc3LjQsNjMuNS03Ny40LDEwNy44QzI3NS43LDMwNi42LDI3MC4zLDMxMiwyNjMuNywzMTJ6J1xuICAgICAgICB9KSxcbiAgICAgICAgY2hpbGRyZW46IHJlZHVjZU1vdGlvbiA/IFtdIDogW3tcbiAgICAgICAgICB0YWc6ICdhbmltYXRlJyxcbiAgICAgICAgICBhdHRyaWJ1dGVzOiBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgT1BBQ0lUWV9BTklNQVRFKSwge30sIHtcbiAgICAgICAgICAgIHZhbHVlczogJzE7MDswOzA7MDsxOydcbiAgICAgICAgICB9KVxuICAgICAgICB9XVxuICAgICAgfSk7XG5cbiAgICAgIGlmICghcmVkdWNlTW90aW9uKSB7XG4gICAgICAgIC8vIEV4Y2xhbWF0aW9uXG4gICAgICAgIGdDaGlsZHJlbi5wdXNoKHtcbiAgICAgICAgICB0YWc6ICdwYXRoJyxcbiAgICAgICAgICBhdHRyaWJ1dGVzOiBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgRklMTCksIHt9LCB7XG4gICAgICAgICAgICBvcGFjaXR5OiAnMCcsXG4gICAgICAgICAgICBkOiAnTTIzMi41LDEzNC41bDcsMTY4YzAuMyw2LjQsNS42LDExLjUsMTIsMTEuNWg5YzYuNCwwLDExLjctNS4xLDEyLTExLjVsNy0xNjhjMC4zLTYuOC01LjItMTIuNS0xMi0xMi41aC0yMyBDMjM3LjcsMTIyLDIzMi4yLDEyNy43LDIzMi41LDEzNC41eidcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBjaGlsZHJlbjogW3tcbiAgICAgICAgICAgIHRhZzogJ2FuaW1hdGUnLFxuICAgICAgICAgICAgYXR0cmlidXRlczogX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIE9QQUNJVFlfQU5JTUFURSksIHt9LCB7XG4gICAgICAgICAgICAgIHZhbHVlczogJzA7MDsxOzE7MDswOydcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfV1cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRhZzogJ2cnLFxuICAgICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgJ2NsYXNzJzogJ21pc3NpbmcnXG4gICAgICAgIH0sXG4gICAgICAgIGNoaWxkcmVuOiBnQ2hpbGRyZW5cbiAgICAgIH07XG4gICAgfTtcbiAgfVxufTtcblxudmFyIFN2Z1N5bWJvbHMgPSB7XG4gIGhvb2tzOiBmdW5jdGlvbiBob29rcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcGFyc2VOb2RlQXR0cmlidXRlczogZnVuY3Rpb24gcGFyc2VOb2RlQXR0cmlidXRlcyhhY2N1bXVsYXRvciwgbm9kZSkge1xuICAgICAgICB2YXIgc3ltYm9sRGF0YSA9IG5vZGUuZ2V0QXR0cmlidXRlKCdkYXRhLWZhLXN5bWJvbCcpO1xuICAgICAgICB2YXIgc3ltYm9sID0gc3ltYm9sRGF0YSA9PT0gbnVsbCA/IGZhbHNlIDogc3ltYm9sRGF0YSA9PT0gJycgPyB0cnVlIDogc3ltYm9sRGF0YTtcbiAgICAgICAgYWNjdW11bGF0b3JbJ3N5bWJvbCddID0gc3ltYm9sO1xuICAgICAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gICAgICB9XG4gICAgfTtcbiAgfVxufTtcblxudmFyIHBsdWdpbnMgPSBbSW5qZWN0Q1NTLCBSZXBsYWNlRWxlbWVudHMsIExheWVycywgTGF5ZXJzQ291bnRlciwgTGF5ZXJzVGV4dCwgUHNldWRvRWxlbWVudHMsIE11dGF0aW9uT2JzZXJ2ZXIkMSwgUG93ZXJUcmFuc2Zvcm1zLCBNYXNrcywgTWlzc2luZ0ljb25JbmRpY2F0b3IsIFN2Z1N5bWJvbHNdO1xuXG5yZWdpc3RlclBsdWdpbnMocGx1Z2lucywge1xuICBtaXhvdXRzVG86IGFwaVxufSk7XG52YXIgbm9BdXRvJDEgPSBhcGkubm9BdXRvO1xudmFyIGNvbmZpZyQxID0gYXBpLmNvbmZpZztcbnZhciBsaWJyYXJ5JDEgPSBhcGkubGlicmFyeTtcbnZhciBkb20kMSA9IGFwaS5kb207XG52YXIgcGFyc2UkMSA9IGFwaS5wYXJzZTtcbnZhciBmaW5kSWNvbkRlZmluaXRpb24kMSA9IGFwaS5maW5kSWNvbkRlZmluaXRpb247XG52YXIgdG9IdG1sJDEgPSBhcGkudG9IdG1sO1xudmFyIGljb24gPSBhcGkuaWNvbjtcbnZhciBsYXllciA9IGFwaS5sYXllcjtcbnZhciB0ZXh0ID0gYXBpLnRleHQ7XG52YXIgY291bnRlciA9IGFwaS5jb3VudGVyO1xuXG5leHBvcnQgeyBub0F1dG8kMSBhcyBub0F1dG8sIGNvbmZpZyQxIGFzIGNvbmZpZywgbGlicmFyeSQxIGFzIGxpYnJhcnksIGRvbSQxIGFzIGRvbSwgcGFyc2UkMSBhcyBwYXJzZSwgZmluZEljb25EZWZpbml0aW9uJDEgYXMgZmluZEljb25EZWZpbml0aW9uLCB0b0h0bWwkMSBhcyB0b0h0bWwsIGljb24sIGxheWVyLCB0ZXh0LCBjb3VudGVyLCBhcGkgfTtcbiIsImltcG9ydCB7IHBhcnNlLCBpY29uIH0gZnJvbSAnQGZvcnRhd2Vzb21lL2ZvbnRhd2Vzb21lLXN2Zy1jb3JlJztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHtcbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpO1xuXG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7XG4gICAgZW51bWVyYWJsZU9ubHkgJiYgKHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTtcbiAgICB9KSksIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTtcbiAgfVxuXG4gIHJldHVybiBrZXlzO1xufVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkMih0YXJnZXQpIHtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc291cmNlID0gbnVsbCAhPSBhcmd1bWVudHNbaV0gPyBhcmd1bWVudHNbaV0gOiB7fTtcbiAgICBpICUgMiA/IG93bktleXMoT2JqZWN0KHNvdXJjZSksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pO1xuICAgIH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpIDogb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbmZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7XG4gIFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjtcblxuICByZXR1cm4gX3R5cGVvZiA9IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIFwic3ltYm9sXCIgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChvYmopIHtcbiAgICByZXR1cm4gdHlwZW9mIG9iajtcbiAgfSA6IGZ1bmN0aW9uIChvYmopIHtcbiAgICByZXR1cm4gb2JqICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqO1xuICB9LCBfdHlwZW9mKG9iaik7XG59XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHtcbiAgaWYgKGtleSBpbiBvYmopIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG9ialtrZXldID0gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gb2JqO1xufVxuXG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKSB7XG4gIGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9O1xuICB2YXIgdGFyZ2V0ID0ge307XG4gIHZhciBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTtcbiAgdmFyIGtleSwgaTtcblxuICBmb3IgKGkgPSAwOyBpIDwgc291cmNlS2V5cy5sZW5ndGg7IGkrKykge1xuICAgIGtleSA9IHNvdXJjZUtleXNbaV07XG4gICAgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTtcbiAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHNvdXJjZSwgZXhjbHVkZWQpIHtcbiAgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307XG5cbiAgdmFyIHRhcmdldCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpO1xuXG4gIHZhciBrZXksIGk7XG5cbiAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICB2YXIgc291cmNlU3ltYm9sS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlKTtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBzb3VyY2VTeW1ib2xLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBrZXkgPSBzb3VyY2VTeW1ib2xLZXlzW2ldO1xuICAgICAgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTtcbiAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHNvdXJjZSwga2V5KSkgY29udGludWU7XG4gICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbmZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHtcbiAgcmV0dXJuIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBfbm9uSXRlcmFibGVTcHJlYWQoKTtcbn1cblxuZnVuY3Rpb24gX2FycmF5V2l0aG91dEhvbGVzKGFycikge1xuICBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkoYXJyKTtcbn1cblxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheShpdGVyKSB7XG4gIGlmICh0eXBlb2YgU3ltYm9sICE9PSBcInVuZGVmaW5lZFwiICYmIGl0ZXJbU3ltYm9sLml0ZXJhdG9yXSAhPSBudWxsIHx8IGl0ZXJbXCJAQGl0ZXJhdG9yXCJdICE9IG51bGwpIHJldHVybiBBcnJheS5mcm9tKGl0ZXIpO1xufVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7XG4gIGlmICghbykgcmV0dXJuO1xuICBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pO1xuICB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7XG4gIGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7XG4gIGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pO1xuICBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7XG59XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7XG4gIGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoO1xuXG4gIGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgYXJyMltpXSA9IGFycltpXTtcblxuICByZXR1cm4gYXJyMjtcbn1cblxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlU3ByZWFkKCkge1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTtcbn1cblxuLy8gR2V0IENTUyBjbGFzcyBsaXN0IGZyb20gYSBwcm9wcyBvYmplY3RcbmZ1bmN0aW9uIGNsYXNzTGlzdChwcm9wcykge1xuICB2YXIgX2NsYXNzZXM7XG5cbiAgdmFyIGJlYXQgPSBwcm9wcy5iZWF0LFxuICAgICAgZmFkZSA9IHByb3BzLmZhZGUsXG4gICAgICBiZWF0RmFkZSA9IHByb3BzLmJlYXRGYWRlLFxuICAgICAgYm91bmNlID0gcHJvcHMuYm91bmNlLFxuICAgICAgc2hha2UgPSBwcm9wcy5zaGFrZSxcbiAgICAgIGZsYXNoID0gcHJvcHMuZmxhc2gsXG4gICAgICBzcGluID0gcHJvcHMuc3BpbixcbiAgICAgIHNwaW5QdWxzZSA9IHByb3BzLnNwaW5QdWxzZSxcbiAgICAgIHNwaW5SZXZlcnNlID0gcHJvcHMuc3BpblJldmVyc2UsXG4gICAgICBwdWxzZSA9IHByb3BzLnB1bHNlLFxuICAgICAgZml4ZWRXaWR0aCA9IHByb3BzLmZpeGVkV2lkdGgsXG4gICAgICBpbnZlcnNlID0gcHJvcHMuaW52ZXJzZSxcbiAgICAgIGJvcmRlciA9IHByb3BzLmJvcmRlcixcbiAgICAgIGxpc3RJdGVtID0gcHJvcHMubGlzdEl0ZW0sXG4gICAgICBmbGlwID0gcHJvcHMuZmxpcCxcbiAgICAgIHNpemUgPSBwcm9wcy5zaXplLFxuICAgICAgcm90YXRpb24gPSBwcm9wcy5yb3RhdGlvbixcbiAgICAgIHB1bGwgPSBwcm9wcy5wdWxsOyAvLyBtYXAgb2YgQ1NTIGNsYXNzIG5hbWVzIHRvIHByb3BlcnRpZXNcblxuICB2YXIgY2xhc3NlcyA9IChfY2xhc3NlcyA9IHtcbiAgICAnZmEtYmVhdCc6IGJlYXQsXG4gICAgJ2ZhLWZhZGUnOiBmYWRlLFxuICAgICdmYS1iZWF0LWZhZGUnOiBiZWF0RmFkZSxcbiAgICAnZmEtYm91bmNlJzogYm91bmNlLFxuICAgICdmYS1zaGFrZSc6IHNoYWtlLFxuICAgICdmYS1mbGFzaCc6IGZsYXNoLFxuICAgICdmYS1zcGluJzogc3BpbixcbiAgICAnZmEtc3Bpbi1yZXZlcnNlJzogc3BpblJldmVyc2UsXG4gICAgJ2ZhLXNwaW4tcHVsc2UnOiBzcGluUHVsc2UsXG4gICAgJ2ZhLXB1bHNlJzogcHVsc2UsXG4gICAgJ2ZhLWZ3JzogZml4ZWRXaWR0aCxcbiAgICAnZmEtaW52ZXJzZSc6IGludmVyc2UsXG4gICAgJ2ZhLWJvcmRlcic6IGJvcmRlcixcbiAgICAnZmEtbGknOiBsaXN0SXRlbSxcbiAgICAnZmEtZmxpcCc6IGZsaXAgPT09IHRydWUsXG4gICAgJ2ZhLWZsaXAtaG9yaXpvbnRhbCc6IGZsaXAgPT09ICdob3Jpem9udGFsJyB8fCBmbGlwID09PSAnYm90aCcsXG4gICAgJ2ZhLWZsaXAtdmVydGljYWwnOiBmbGlwID09PSAndmVydGljYWwnIHx8IGZsaXAgPT09ICdib3RoJ1xuICB9LCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzZXMsIFwiZmEtXCIuY29uY2F0KHNpemUpLCB0eXBlb2Ygc2l6ZSAhPT0gJ3VuZGVmaW5lZCcgJiYgc2l6ZSAhPT0gbnVsbCksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NlcywgXCJmYS1yb3RhdGUtXCIuY29uY2F0KHJvdGF0aW9uKSwgdHlwZW9mIHJvdGF0aW9uICE9PSAndW5kZWZpbmVkJyAmJiByb3RhdGlvbiAhPT0gbnVsbCAmJiByb3RhdGlvbiAhPT0gMCksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NlcywgXCJmYS1wdWxsLVwiLmNvbmNhdChwdWxsKSwgdHlwZW9mIHB1bGwgIT09ICd1bmRlZmluZWQnICYmIHB1bGwgIT09IG51bGwpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzZXMsICdmYS1zd2FwLW9wYWNpdHknLCBwcm9wcy5zd2FwT3BhY2l0eSksIF9jbGFzc2VzKTsgLy8gbWFwIG92ZXIgYWxsIHRoZSBrZXlzIGluIHRoZSBjbGFzc2VzIG9iamVjdFxuICAvLyByZXR1cm4gYW4gYXJyYXkgb2YgdGhlIGtleXMgd2hlcmUgdGhlIHZhbHVlIGZvciB0aGUga2V5IGlzIG5vdCBudWxsXG5cbiAgcmV0dXJuIE9iamVjdC5rZXlzKGNsYXNzZXMpLm1hcChmdW5jdGlvbiAoa2V5KSB7XG4gICAgcmV0dXJuIGNsYXNzZXNba2V5XSA/IGtleSA6IG51bGw7XG4gIH0pLmZpbHRlcihmdW5jdGlvbiAoa2V5KSB7XG4gICAgcmV0dXJuIGtleTtcbiAgfSk7XG59XG5cbi8vIENhbWVsaXplIHRha2VuIGZyb20gaHVtcHNcbi8vIGh1bXBzIGlzIGNvcHlyaWdodCDCqSAyMDEyKyBEb20gQ2hyaXN0aWVcbi8vIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbi8vIFBlcmZvcm1hbnQgd2F5IHRvIGRldGVybWluZSBpZiBvYmplY3QgY29lcmNlcyB0byBhIG51bWJlclxuZnVuY3Rpb24gX2lzTnVtZXJpY2FsKG9iaikge1xuICBvYmogPSBvYmogLSAwOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG5cbiAgcmV0dXJuIG9iaiA9PT0gb2JqO1xufVxuXG5mdW5jdGlvbiBjYW1lbGl6ZShzdHJpbmcpIHtcbiAgaWYgKF9pc051bWVyaWNhbChzdHJpbmcpKSB7XG4gICAgcmV0dXJuIHN0cmluZztcbiAgfSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlbGVzcy1lc2NhcGVcblxuXG4gIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKC9bXFwtX1xcc10rKC4pPy9nLCBmdW5jdGlvbiAobWF0Y2gsIGNocikge1xuICAgIHJldHVybiBjaHIgPyBjaHIudG9VcHBlckNhc2UoKSA6ICcnO1xuICB9KTsgLy8gRW5zdXJlIDFzdCBjaGFyIGlzIGFsd2F5cyBsb3dlcmNhc2VcblxuICByZXR1cm4gc3RyaW5nLnN1YnN0cigwLCAxKS50b0xvd2VyQ2FzZSgpICsgc3RyaW5nLnN1YnN0cigxKTtcbn1cblxudmFyIF9leGNsdWRlZCA9IFtcInN0eWxlXCJdO1xuXG5mdW5jdGlvbiBjYXBpdGFsaXplKHZhbCkge1xuICByZXR1cm4gdmFsLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdmFsLnNsaWNlKDEpO1xufVxuXG5mdW5jdGlvbiBzdHlsZVRvT2JqZWN0KHN0eWxlKSB7XG4gIHJldHVybiBzdHlsZS5zcGxpdCgnOycpLm1hcChmdW5jdGlvbiAocykge1xuICAgIHJldHVybiBzLnRyaW0oKTtcbiAgfSkuZmlsdGVyKGZ1bmN0aW9uIChzKSB7XG4gICAgcmV0dXJuIHM7XG4gIH0pLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBwYWlyKSB7XG4gICAgdmFyIGkgPSBwYWlyLmluZGV4T2YoJzonKTtcbiAgICB2YXIgcHJvcCA9IGNhbWVsaXplKHBhaXIuc2xpY2UoMCwgaSkpO1xuICAgIHZhciB2YWx1ZSA9IHBhaXIuc2xpY2UoaSArIDEpLnRyaW0oKTtcbiAgICBwcm9wLnN0YXJ0c1dpdGgoJ3dlYmtpdCcpID8gYWNjW2NhcGl0YWxpemUocHJvcCldID0gdmFsdWUgOiBhY2NbcHJvcF0gPSB2YWx1ZTtcbiAgICByZXR1cm4gYWNjO1xuICB9LCB7fSk7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnQoY3JlYXRlRWxlbWVudCwgZWxlbWVudCkge1xuICB2YXIgZXh0cmFQcm9wcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG5cbiAgaWYgKHR5cGVvZiBlbGVtZW50ID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBlbGVtZW50O1xuICB9XG5cbiAgdmFyIGNoaWxkcmVuID0gKGVsZW1lbnQuY2hpbGRyZW4gfHwgW10pLm1hcChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICByZXR1cm4gY29udmVydChjcmVhdGVFbGVtZW50LCBjaGlsZCk7XG4gIH0pO1xuICAvKiBlc2xpbnQtZGlzYWJsZSBkb3Qtbm90YXRpb24gKi9cblxuICB2YXIgbWl4aW5zID0gT2JqZWN0LmtleXMoZWxlbWVudC5hdHRyaWJ1dGVzIHx8IHt9KS5yZWR1Y2UoZnVuY3Rpb24gKGFjYywga2V5KSB7XG4gICAgdmFyIHZhbCA9IGVsZW1lbnQuYXR0cmlidXRlc1trZXldO1xuXG4gICAgc3dpdGNoIChrZXkpIHtcbiAgICAgIGNhc2UgJ2NsYXNzJzpcbiAgICAgICAgYWNjLmF0dHJzWydjbGFzc05hbWUnXSA9IHZhbDtcbiAgICAgICAgZGVsZXRlIGVsZW1lbnQuYXR0cmlidXRlc1snY2xhc3MnXTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3N0eWxlJzpcbiAgICAgICAgYWNjLmF0dHJzWydzdHlsZSddID0gc3R5bGVUb09iamVjdCh2YWwpO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGtleS5pbmRleE9mKCdhcmlhLScpID09PSAwIHx8IGtleS5pbmRleE9mKCdkYXRhLScpID09PSAwKSB7XG4gICAgICAgICAgYWNjLmF0dHJzW2tleS50b0xvd2VyQ2FzZSgpXSA9IHZhbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhY2MuYXR0cnNbY2FtZWxpemUoa2V5KV0gPSB2YWw7XG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIHJldHVybiBhY2M7XG4gIH0sIHtcbiAgICBhdHRyczoge31cbiAgfSk7XG5cbiAgdmFyIF9leHRyYVByb3BzJHN0eWxlID0gZXh0cmFQcm9wcy5zdHlsZSxcbiAgICAgIGV4aXN0aW5nU3R5bGUgPSBfZXh0cmFQcm9wcyRzdHlsZSA9PT0gdm9pZCAwID8ge30gOiBfZXh0cmFQcm9wcyRzdHlsZSxcbiAgICAgIHJlbWFpbmluZyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhleHRyYVByb3BzLCBfZXhjbHVkZWQpO1xuXG4gIG1peGlucy5hdHRyc1snc3R5bGUnXSA9IF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBtaXhpbnMuYXR0cnNbJ3N0eWxlJ10pLCBleGlzdGluZ1N0eWxlKTtcbiAgLyogZXNsaW50LWVuYWJsZSAqL1xuXG4gIHJldHVybiBjcmVhdGVFbGVtZW50LmFwcGx5KHZvaWQgMCwgW2VsZW1lbnQudGFnLCBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgbWl4aW5zLmF0dHJzKSwgcmVtYWluaW5nKV0uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShjaGlsZHJlbikpKTtcbn1cblxudmFyIFBST0RVQ1RJT04gPSBmYWxzZTtcblxudHJ5IHtcbiAgUFJPRFVDVElPTiA9IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbic7XG59IGNhdGNoIChlKSB7fVxuXG5mdW5jdGlvbiBsb2cgKCkge1xuICBpZiAoIVBST0RVQ1RJT04gJiYgY29uc29sZSAmJiB0eXBlb2YgY29uc29sZS5lcnJvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciBfY29uc29sZTtcblxuICAgIChfY29uc29sZSA9IGNvbnNvbGUpLmVycm9yLmFwcGx5KF9jb25zb2xlLCBhcmd1bWVudHMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUljb25BcmdzKGljb24pIHtcbiAgLy8gdGhpcyBoYXMgZXZlcnl0aGluZyB0aGF0IGl0IG5lZWRzIHRvIGJlIHJlbmRlcmVkIHdoaWNoIG1lYW5zIGl0IHdhcyBwcm9iYWJseSBpbXBvcnRlZFxuICAvLyBkaXJlY3RseSBmcm9tIGFuIGljb24gc3ZnIHBhY2thZ2VcbiAgaWYgKGljb24gJiYgX3R5cGVvZihpY29uKSA9PT0gJ29iamVjdCcgJiYgaWNvbi5wcmVmaXggJiYgaWNvbi5pY29uTmFtZSAmJiBpY29uLmljb24pIHtcbiAgICByZXR1cm4gaWNvbjtcbiAgfVxuXG4gIGlmIChwYXJzZS5pY29uKSB7XG4gICAgcmV0dXJuIHBhcnNlLmljb24oaWNvbik7XG4gIH0gLy8gaWYgdGhlIGljb24gaXMgbnVsbCwgdGhlcmUncyBub3RoaW5nIHRvIGRvXG5cblxuICBpZiAoaWNvbiA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9IC8vIGlmIHRoZSBpY29uIGlzIGFuIG9iamVjdCBhbmQgaGFzIGEgcHJlZml4IGFuZCBhbiBpY29uIG5hbWUsIHJldHVybiBpdFxuXG5cbiAgaWYgKGljb24gJiYgX3R5cGVvZihpY29uKSA9PT0gJ29iamVjdCcgJiYgaWNvbi5wcmVmaXggJiYgaWNvbi5pY29uTmFtZSkge1xuICAgIHJldHVybiBpY29uO1xuICB9IC8vIGlmIGl0J3MgYW4gYXJyYXkgd2l0aCBsZW5ndGggb2YgdHdvXG5cblxuICBpZiAoQXJyYXkuaXNBcnJheShpY29uKSAmJiBpY29uLmxlbmd0aCA9PT0gMikge1xuICAgIC8vIHVzZSB0aGUgZmlyc3QgaXRlbSBhcyBwcmVmaXgsIHNlY29uZCBhcyBpY29uIG5hbWVcbiAgICByZXR1cm4ge1xuICAgICAgcHJlZml4OiBpY29uWzBdLFxuICAgICAgaWNvbk5hbWU6IGljb25bMV1cbiAgICB9O1xuICB9IC8vIGlmIGl0J3MgYSBzdHJpbmcsIHVzZSBpdCBhcyB0aGUgaWNvbiBuYW1lXG5cblxuICBpZiAodHlwZW9mIGljb24gPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHByZWZpeDogJ2ZhcycsXG4gICAgICBpY29uTmFtZTogaWNvblxuICAgIH07XG4gIH1cbn1cblxuLy8gY3JlYXRlcyBhbiBvYmplY3Qgd2l0aCBhIGtleSBvZiBrZXlcbi8vIGFuZCBhIHZhbHVlIG9mIHZhbHVlXG4vLyBpZiBjZXJ0YWluIGNvbmRpdGlvbnMgYXJlIG1ldFxuZnVuY3Rpb24gb2JqZWN0V2l0aEtleShrZXksIHZhbHVlKSB7XG4gIC8vIGlmIHRoZSB2YWx1ZSBpcyBhIG5vbi1lbXB0eSBhcnJheVxuICAvLyBvciBpdCdzIG5vdCBhbiBhcnJheSBidXQgaXQgaXMgdHJ1dGh5XG4gIC8vIHRoZW4gY3JlYXRlIHRoZSBvYmplY3Qgd2l0aCB0aGUga2V5IGFuZCB0aGUgdmFsdWVcbiAgLy8gaWYgbm90LCByZXR1cm4gYW4gZW1wdHkgYXJyYXlcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA+IDAgfHwgIUFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlID8gX2RlZmluZVByb3BlcnR5KHt9LCBrZXksIHZhbHVlKSA6IHt9O1xufVxuXG52YXIgRm9udEF3ZXNvbWVJY29uID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gKHByb3BzLCByZWYpIHtcbiAgdmFyIGljb25BcmdzID0gcHJvcHMuaWNvbixcbiAgICAgIG1hc2tBcmdzID0gcHJvcHMubWFzayxcbiAgICAgIHN5bWJvbCA9IHByb3BzLnN5bWJvbCxcbiAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIHRpdGxlID0gcHJvcHMudGl0bGUsXG4gICAgICB0aXRsZUlkID0gcHJvcHMudGl0bGVJZCxcbiAgICAgIG1hc2tJZCA9IHByb3BzLm1hc2tJZDtcbiAgdmFyIGljb25Mb29rdXAgPSBub3JtYWxpemVJY29uQXJncyhpY29uQXJncyk7XG4gIHZhciBjbGFzc2VzID0gb2JqZWN0V2l0aEtleSgnY2xhc3NlcycsIFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoY2xhc3NMaXN0KHByb3BzKSksIF90b0NvbnN1bWFibGVBcnJheShjbGFzc05hbWUuc3BsaXQoJyAnKSkpKTtcbiAgdmFyIHRyYW5zZm9ybSA9IG9iamVjdFdpdGhLZXkoJ3RyYW5zZm9ybScsIHR5cGVvZiBwcm9wcy50cmFuc2Zvcm0gPT09ICdzdHJpbmcnID8gcGFyc2UudHJhbnNmb3JtKHByb3BzLnRyYW5zZm9ybSkgOiBwcm9wcy50cmFuc2Zvcm0pO1xuICB2YXIgbWFzayA9IG9iamVjdFdpdGhLZXkoJ21hc2snLCBub3JtYWxpemVJY29uQXJncyhtYXNrQXJncykpO1xuICB2YXIgcmVuZGVyZWRJY29uID0gaWNvbihpY29uTG9va3VwLCBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgY2xhc3NlcyksIHRyYW5zZm9ybSksIG1hc2spLCB7fSwge1xuICAgIHN5bWJvbDogc3ltYm9sLFxuICAgIHRpdGxlOiB0aXRsZSxcbiAgICB0aXRsZUlkOiB0aXRsZUlkLFxuICAgIG1hc2tJZDogbWFza0lkXG4gIH0pKTtcblxuICBpZiAoIXJlbmRlcmVkSWNvbikge1xuICAgIGxvZygnQ291bGQgbm90IGZpbmQgaWNvbicsIGljb25Mb29rdXApO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIGFic3RyYWN0ID0gcmVuZGVyZWRJY29uLmFic3RyYWN0O1xuICB2YXIgZXh0cmFQcm9wcyA9IHtcbiAgICByZWY6IHJlZlxuICB9O1xuICBPYmplY3Qua2V5cyhwcm9wcykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgIGlmICghRm9udEF3ZXNvbWVJY29uLmRlZmF1bHRQcm9wcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICBleHRyYVByb3BzW2tleV0gPSBwcm9wc1trZXldO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBjb252ZXJ0Q3VycnkoYWJzdHJhY3RbMF0sIGV4dHJhUHJvcHMpO1xufSk7XG5Gb250QXdlc29tZUljb24uZGlzcGxheU5hbWUgPSAnRm9udEF3ZXNvbWVJY29uJztcbkZvbnRBd2Vzb21lSWNvbi5wcm9wVHlwZXMgPSB7XG4gIGJlYXQ6IFByb3BUeXBlcy5ib29sLFxuICBib3JkZXI6IFByb3BUeXBlcy5ib29sLFxuICBiZWF0RmFkZTogUHJvcFR5cGVzLmJvb2wsXG4gIGJvdW5jZTogUHJvcFR5cGVzLmJvb2wsXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgZmFkZTogUHJvcFR5cGVzLmJvb2wsXG4gIGZsYXNoOiBQcm9wVHlwZXMuYm9vbCxcbiAgbWFzazogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm9iamVjdCwgUHJvcFR5cGVzLmFycmF5LCBQcm9wVHlwZXMuc3RyaW5nXSksXG4gIG1hc2tJZDogUHJvcFR5cGVzLnN0cmluZyxcbiAgZml4ZWRXaWR0aDogUHJvcFR5cGVzLmJvb2wsXG4gIGludmVyc2U6IFByb3BUeXBlcy5ib29sLFxuICBmbGlwOiBQcm9wVHlwZXMub25lT2YoW3RydWUsIGZhbHNlLCAnaG9yaXpvbnRhbCcsICd2ZXJ0aWNhbCcsICdib3RoJ10pLFxuICBpY29uOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMub2JqZWN0LCBQcm9wVHlwZXMuYXJyYXksIFByb3BUeXBlcy5zdHJpbmddKSxcbiAgbGlzdEl0ZW06IFByb3BUeXBlcy5ib29sLFxuICBwdWxsOiBQcm9wVHlwZXMub25lT2YoWydyaWdodCcsICdsZWZ0J10pLFxuICBwdWxzZTogUHJvcFR5cGVzLmJvb2wsXG4gIHJvdGF0aW9uOiBQcm9wVHlwZXMub25lT2YoWzAsIDkwLCAxODAsIDI3MF0pLFxuICBzaGFrZTogUHJvcFR5cGVzLmJvb2wsXG4gIHNpemU6IFByb3BUeXBlcy5vbmVPZihbJzJ4cycsICd4cycsICdzbScsICdsZycsICd4bCcsICcyeGwnLCAnMXgnLCAnMngnLCAnM3gnLCAnNHgnLCAnNXgnLCAnNngnLCAnN3gnLCAnOHgnLCAnOXgnLCAnMTB4J10pLFxuICBzcGluOiBQcm9wVHlwZXMuYm9vbCxcbiAgc3BpblB1bHNlOiBQcm9wVHlwZXMuYm9vbCxcbiAgc3BpblJldmVyc2U6IFByb3BUeXBlcy5ib29sLFxuICBzeW1ib2w6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5ib29sLCBQcm9wVHlwZXMuc3RyaW5nXSksXG4gIHRpdGxlOiBQcm9wVHlwZXMuc3RyaW5nLFxuICB0aXRsZUlkOiBQcm9wVHlwZXMuc3RyaW5nLFxuICB0cmFuc2Zvcm06IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5zdHJpbmcsIFByb3BUeXBlcy5vYmplY3RdKSxcbiAgc3dhcE9wYWNpdHk6IFByb3BUeXBlcy5ib29sXG59O1xuRm9udEF3ZXNvbWVJY29uLmRlZmF1bHRQcm9wcyA9IHtcbiAgYm9yZGVyOiBmYWxzZSxcbiAgY2xhc3NOYW1lOiAnJyxcbiAgbWFzazogbnVsbCxcbiAgbWFza0lkOiBudWxsLFxuICBmaXhlZFdpZHRoOiBmYWxzZSxcbiAgaW52ZXJzZTogZmFsc2UsXG4gIGZsaXA6IGZhbHNlLFxuICBpY29uOiBudWxsLFxuICBsaXN0SXRlbTogZmFsc2UsXG4gIHB1bGw6IG51bGwsXG4gIHB1bHNlOiBmYWxzZSxcbiAgcm90YXRpb246IG51bGwsXG4gIHNpemU6IG51bGwsXG4gIHNwaW46IGZhbHNlLFxuICBzcGluUHVsc2U6IGZhbHNlLFxuICBzcGluUmV2ZXJzZTogZmFsc2UsXG4gIGJlYXQ6IGZhbHNlLFxuICBmYWRlOiBmYWxzZSxcbiAgYmVhdEZhZGU6IGZhbHNlLFxuICBib3VuY2U6IGZhbHNlLFxuICBzaGFrZTogZmFsc2UsXG4gIHN5bWJvbDogZmFsc2UsXG4gIHRpdGxlOiAnJyxcbiAgdGl0bGVJZDogbnVsbCxcbiAgdHJhbnNmb3JtOiBudWxsLFxuICBzd2FwT3BhY2l0eTogZmFsc2Vcbn07XG52YXIgY29udmVydEN1cnJ5ID0gY29udmVydC5iaW5kKG51bGwsIFJlYWN0LmNyZWF0ZUVsZW1lbnQpO1xuXG5leHBvcnQgeyBGb250QXdlc29tZUljb24gfTtcbiIsIlwidXNlIGNsaWVudFwiO1xuXG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUJvb3RzdHJhcFByZWZpeCwgdXNlQm9vdHN0cmFwQnJlYWtwb2ludHMsIHVzZUJvb3RzdHJhcE1pbkJyZWFrcG9pbnQgfSBmcm9tICcuL1RoZW1lUHJvdmlkZXInO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmNvbnN0IFJvdyA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKCh7XG4gIGJzUHJlZml4LFxuICBjbGFzc05hbWUsXG4gIC8vIE5lZWQgdG8gZGVmaW5lIHRoZSBkZWZhdWx0IFwiYXNcIiBkdXJpbmcgcHJvcCBkZXN0cnVjdHVyaW5nIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBzdHlsZWQtY29tcG9uZW50cyBnaXRodWIuY29tL3JlYWN0LWJvb3RzdHJhcC9yZWFjdC1ib290c3RyYXAvaXNzdWVzLzM1OTVcbiAgYXM6IENvbXBvbmVudCA9ICdkaXYnLFxuICAuLi5wcm9wc1xufSwgcmVmKSA9PiB7XG4gIGNvbnN0IGRlY29yYXRlZEJzUHJlZml4ID0gdXNlQm9vdHN0cmFwUHJlZml4KGJzUHJlZml4LCAncm93Jyk7XG4gIGNvbnN0IGJyZWFrcG9pbnRzID0gdXNlQm9vdHN0cmFwQnJlYWtwb2ludHMoKTtcbiAgY29uc3QgbWluQnJlYWtwb2ludCA9IHVzZUJvb3RzdHJhcE1pbkJyZWFrcG9pbnQoKTtcbiAgY29uc3Qgc2l6ZVByZWZpeCA9IGAke2RlY29yYXRlZEJzUHJlZml4fS1jb2xzYDtcbiAgY29uc3QgY2xhc3NlcyA9IFtdO1xuICBicmVha3BvaW50cy5mb3JFYWNoKGJya1BvaW50ID0+IHtcbiAgICBjb25zdCBwcm9wVmFsdWUgPSBwcm9wc1ticmtQb2ludF07XG4gICAgZGVsZXRlIHByb3BzW2Jya1BvaW50XTtcbiAgICBsZXQgY29scztcbiAgICBpZiAocHJvcFZhbHVlICE9IG51bGwgJiYgdHlwZW9mIHByb3BWYWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICh7XG4gICAgICAgIGNvbHNcbiAgICAgIH0gPSBwcm9wVmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb2xzID0gcHJvcFZhbHVlO1xuICAgIH1cbiAgICBjb25zdCBpbmZpeCA9IGJya1BvaW50ICE9PSBtaW5CcmVha3BvaW50ID8gYC0ke2Jya1BvaW50fWAgOiAnJztcbiAgICBpZiAoY29scyAhPSBudWxsKSBjbGFzc2VzLnB1c2goYCR7c2l6ZVByZWZpeH0ke2luZml4fS0ke2NvbHN9YCk7XG4gIH0pO1xuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goQ29tcG9uZW50LCB7XG4gICAgcmVmOiByZWYsXG4gICAgLi4ucHJvcHMsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGNsYXNzTmFtZSwgZGVjb3JhdGVkQnNQcmVmaXgsIC4uLmNsYXNzZXMpXG4gIH0pO1xufSk7XG5Sb3cuZGlzcGxheU5hbWUgPSAnUm93JztcbmV4cG9ydCBkZWZhdWx0IFJvdzsiLCJcInVzZSBjbGllbnRcIjtcblxuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VCb290c3RyYXBQcmVmaXgsIHVzZUJvb3RzdHJhcEJyZWFrcG9pbnRzLCB1c2VCb290c3RyYXBNaW5CcmVha3BvaW50IH0gZnJvbSAnLi9UaGVtZVByb3ZpZGVyJztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5leHBvcnQgZnVuY3Rpb24gdXNlQ29sKHtcbiAgYXMsXG4gIGJzUHJlZml4LFxuICBjbGFzc05hbWUsXG4gIC4uLnByb3BzXG59KSB7XG4gIGJzUHJlZml4ID0gdXNlQm9vdHN0cmFwUHJlZml4KGJzUHJlZml4LCAnY29sJyk7XG4gIGNvbnN0IGJyZWFrcG9pbnRzID0gdXNlQm9vdHN0cmFwQnJlYWtwb2ludHMoKTtcbiAgY29uc3QgbWluQnJlYWtwb2ludCA9IHVzZUJvb3RzdHJhcE1pbkJyZWFrcG9pbnQoKTtcbiAgY29uc3Qgc3BhbnMgPSBbXTtcbiAgY29uc3QgY2xhc3NlcyA9IFtdO1xuICBicmVha3BvaW50cy5mb3JFYWNoKGJya1BvaW50ID0+IHtcbiAgICBjb25zdCBwcm9wVmFsdWUgPSBwcm9wc1ticmtQb2ludF07XG4gICAgZGVsZXRlIHByb3BzW2Jya1BvaW50XTtcbiAgICBsZXQgc3BhbjtcbiAgICBsZXQgb2Zmc2V0O1xuICAgIGxldCBvcmRlcjtcbiAgICBpZiAodHlwZW9mIHByb3BWYWx1ZSA9PT0gJ29iamVjdCcgJiYgcHJvcFZhbHVlICE9IG51bGwpIHtcbiAgICAgICh7XG4gICAgICAgIHNwYW4sXG4gICAgICAgIG9mZnNldCxcbiAgICAgICAgb3JkZXJcbiAgICAgIH0gPSBwcm9wVmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzcGFuID0gcHJvcFZhbHVlO1xuICAgIH1cbiAgICBjb25zdCBpbmZpeCA9IGJya1BvaW50ICE9PSBtaW5CcmVha3BvaW50ID8gYC0ke2Jya1BvaW50fWAgOiAnJztcbiAgICBpZiAoc3Bhbikgc3BhbnMucHVzaChzcGFuID09PSB0cnVlID8gYCR7YnNQcmVmaXh9JHtpbmZpeH1gIDogYCR7YnNQcmVmaXh9JHtpbmZpeH0tJHtzcGFufWApO1xuICAgIGlmIChvcmRlciAhPSBudWxsKSBjbGFzc2VzLnB1c2goYG9yZGVyJHtpbmZpeH0tJHtvcmRlcn1gKTtcbiAgICBpZiAob2Zmc2V0ICE9IG51bGwpIGNsYXNzZXMucHVzaChgb2Zmc2V0JHtpbmZpeH0tJHtvZmZzZXR9YCk7XG4gIH0pO1xuICByZXR1cm4gW3tcbiAgICAuLi5wcm9wcyxcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoY2xhc3NOYW1lLCAuLi5zcGFucywgLi4uY2xhc3NlcylcbiAgfSwge1xuICAgIGFzLFxuICAgIGJzUHJlZml4LFxuICAgIHNwYW5zXG4gIH1dO1xufVxuY29uc3QgQ29sID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoXG4vLyBOZWVkIHRvIGRlZmluZSB0aGUgZGVmYXVsdCBcImFzXCIgZHVyaW5nIHByb3AgZGVzdHJ1Y3R1cmluZyB0byBiZSBjb21wYXRpYmxlIHdpdGggc3R5bGVkLWNvbXBvbmVudHMgZ2l0aHViLmNvbS9yZWFjdC1ib290c3RyYXAvcmVhY3QtYm9vdHN0cmFwL2lzc3Vlcy8zNTk1XG4ocHJvcHMsIHJlZikgPT4ge1xuICBjb25zdCBbe1xuICAgIGNsYXNzTmFtZSxcbiAgICAuLi5jb2xQcm9wc1xuICB9LCB7XG4gICAgYXM6IENvbXBvbmVudCA9ICdkaXYnLFxuICAgIGJzUHJlZml4LFxuICAgIHNwYW5zXG4gIH1dID0gdXNlQ29sKHByb3BzKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KENvbXBvbmVudCwge1xuICAgIC4uLmNvbFByb3BzLFxuICAgIHJlZjogcmVmLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjbGFzc05hbWUsICFzcGFucy5sZW5ndGggJiYgYnNQcmVmaXgpXG4gIH0pO1xufSk7XG5Db2wuZGlzcGxheU5hbWUgPSAnQ29sJztcbmV4cG9ydCBkZWZhdWx0IENvbDsiLCJpbXBvcnQgeyBGb250QXdlc29tZUljb24gfSBmcm9tIFwiQGZvcnRhd2Vzb21lL3JlYWN0LWZvbnRhd2Vzb21lXCI7XG5pbXBvcnQgUmVhY3QsIHsgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IEJ1dHRvbiwgQ29sLCBSb3cgfSBmcm9tIFwicmVhY3QtYm9vdHN0cmFwXCI7XG5cbmltcG9ydCBDb3ZlckltYWdlIGZyb20gXCIuL2F1cm9yYS1ib3JlYWxpcy1za3kuanBnXCJcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gTG9naW4oKSB7XG5cblxuICAgIGNvbnN0IFt1c2VybmFtZSwgc2V0VXNlcm5hbWVdID0gdXNlU3RhdGUoXCJcIilcbiAgICBjb25zdCBbcGFzc3dvcmQsIHNldFBhc3N3b3JkXSA9IHVzZVN0YXRlKFwiXCIpXG4gICAgY29uc3QgW2lzTG9hZGluZywgc2V0SXNMb2FkaW5nXSA9IHVzZVN0YXRlKGZhbHNlKVxuXG4gICAgY29uc3QgbG9naW4gPSAgKCkgPT4ge1xuICAgIH1cblxuICAgIGNvbnN0IG9uS2V5RG93biA9IChldmVudCkgPT4ge1xuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSBcIkVudGVyXCIpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBsb2dpbigpXG4gICAgICAgIH1cbiAgICB9XG5cblxuXG5cbiAgICByZXR1cm4gICAgPFJvdz5cbiAgICA8Q29sIG1kPXs0fSBsZz17Nn0geGw9ezh9IGNsYXNzTmFtZT17XCJkLW5vbmUgZC1tZC1ibG9jayB2aWRlby1jb250YWluZXJcIn0+XG4gICAgICAgIDx2aWRlbyBhdXRvUGxheSBtdXRlZCBsb29wPlxuICAgICAgICAgICAgPHNvdXJjZSBzcmM9XCIvYXNzZXRzL2NvdmVyLm1wNFwiXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ2aWRlby9tcDRcIi8+XG4gICAgICAgIDwvdmlkZW8+XG4gICAgPC9Db2w+XG4gICAgPENvbCBtZD17OH0gbGc9ezZ9IHhsPXs0fT5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb3JtLWxlZnQgcHgtNVwiPlxuICAgICAgICAgICAgPGRpdiAgY2xhc3NOYW1lPVwicm93IGctNFwiICBzdHlsZT17e21hcmdpblRvcDogXCI1MHB4XCJ9fT5cbiAgICAgICAgICAgICAgIDxpbWcgc3JjPXtDb3ZlckltYWdlfSBzdHlsZT17e2hlaWdodDogXCI1MHB4XCIsIHdpZHRoOiBcImF1dG9cIn19Lz4gIDxoMz5Qb2xhcmlzPC9oMz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiAgY2xhc3NOYW1lPVwicm93IGctNCBtdC0yXCIgIHN0eWxlPXt7Ym9yZGVyTGVmdDogXCI0cHggc29saWQgIzNmNTFiNVwifX0+XG4gICAgICAgICAgICAgICAgPGg0IGNsYXNzTmFtZT17XCJcIn0+Qml0dGUgbWVsZGVuIFNpZSBzaWNoIGFuLjwvaDQ+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb2wtMTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPk51dHplcm5hbWU8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LWRhbmdlclwiPio8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJpbnB1dC1ncm91cFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJpbnB1dC1ncm91cC10ZXh0XCI+PEZvbnRBd2Vzb21lSWNvbiBpY29uPXtcInVzZXJcIn0vPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG9uS2V5RG93bj17b25LZXlEb3dufSBvbkNoYW5nZT17KGUpID0+IHNldFVzZXJuYW1lKGUudGFyZ2V0LnZhbHVlKX0gdmFsdWU9e3VzZXJuYW1lfSB0eXBlPVwidGV4dFwiIGNsYXNzTmFtZT1cImZvcm0tY29udHJvbFwiIHBsYWNlaG9sZGVyPVwiRS1NYWlsIEFkcmVzc2VcIi8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb2wtMTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlBhc3N3b3J0PHNwYW4gY2xhc3NOYW1lPVwidGV4dC1kYW5nZXJcIj4qPC9zcGFuPjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaW5wdXQtZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaW5wdXQtZ3JvdXAtdGV4dFwiPjxGb250QXdlc29tZUljb24gaWNvbj17XCJrZXlcIn0vPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG9uS2V5RG93bj17b25LZXlEb3dufSBvbkNoYW5nZT17KGUpID0+IHNldFBhc3N3b3JkKGUudGFyZ2V0LnZhbHVlKX0gdmFsdWU9e3Bhc3N3b3JkfSB0eXBlPVwicGFzc3dvcmRcIiBjbGFzc05hbWU9XCJmb3JtLWNvbnRyb2xcIiBwbGFjZWhvbGRlcj1cIkJpdHRlIGdlYmVuIFNpZSBJaHIgUGFzc3dvcnQgZWluXCIvPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29sLXNtLTZcIiBzdHlsZT17e21hcmdpblRvcCA6IFwiMHB4XCIsIH19PlxuICAgICAgICAgICAgICAgICAgICA8YSBzdHlsZT17e2N1cnNvciA6IFwicG9pbnRlclwifX0gb25DbGljaz17KCkgPT4gc2V0UGFzc3dvcmRNb2RhbE9wZW4odHJ1ZSl9IGNsYXNzTmFtZT1cInRleHQtcHJpbWFyeVwiPlBhc3N3b3J0IHZlcmdlc3Nlbj88L2E+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbC1zbS02XCI+XG4gICAgICAgICAgICAgICAgICAgIDxCdXR0b24gb25DbGljaz17KCkgPT4gbG9naW4oKX0gY2xhc3NOYW1lPVwiYnRuIGJ0bi1wcmltYXJ5IHB4LTQgZmxvYXQtZW5kXCI+PEZvbnRBd2Vzb21lSWNvbiBpY29uPVwic2lnbi1pblwiLz4gQW5tZWxkZW4gPC9CdXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtcInRleHQtY2VudGVyIHRleHQtbXV0ZWRcIn0+XG4gICAgICAgICAgICAgICAgSW1wcmVzc3VtIOKAoiBEYXRlbnNjaHV0elxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvQ29sPlxuPC9Sb3c+XG59IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNyZWF0ZVJvb3QgfSBmcm9tICdyZWFjdC1kb20vY2xpZW50JztcbmltcG9ydCB7XG4gICAgY3JlYXRlQnJvd3NlclJvdXRlcixcbiAgICBSb3V0ZXJQcm92aWRlcixcbiAgfSBmcm9tIFwicmVhY3Qtcm91dGVyLWRvbVwiO1xuaW1wb3J0ICcuL2luZGV4LnNjc3MnO1xuaW1wb3J0IExheW91dCBmcm9tICcuL2FwcC9sYXlvdXQvbGF5b3V0JztcbmltcG9ydCBFcnJvclBhZ2UgZnJvbSAnLi9hcHAvbGF5b3V0L2Vycm9ycGFnZSc7XG5pbXBvcnQgRGFzaGJvYXJkIGZyb20gJy4vYXBwL3BhZ2VzL2Rhc2hib2FyZCc7XG5pbXBvcnQgTG9naW4gZnJvbSAnLi9hcHAvcGFnZXMvbG9naW4nO1xuXG4vLyBDbGVhciB0aGUgZXhpc3RpbmcgSFRNTCBjb250ZW50XG5kb2N1bWVudC5ib2R5LmlubmVySFRNTCA9ICc8ZGl2IGlkPVwiYXBwXCI+PC9kaXY+JztcblxuXG5jb25zdCByb3V0ZXIgPSBjcmVhdGVCcm93c2VyUm91dGVyKFtcbiAgICB7XG4gICAgICAgIHBhdGg6IFwiL1wiLFxuICAgICAgICBlbGVtZW50OiA8TGF5b3V0IC8+LFxuICAgICAgICBlcnJvckVsZW1lbnQ6IDxFcnJvclBhZ2UgLz4sXG4gICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHBhdGg6IFwiZGFzaGJvYXJkLzpkYXNoYm9hcmRJZFwiLFxuICAgICAgICAgICAgICBlbGVtZW50OiA8RGFzaGJvYXJkIC8+LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgIH0sXG4gICAge1xuICAgICAgICBwYXRoOiBcIi9sb2dpblwiLFxuICAgICAgICBlbGVtZW50OiA8TG9naW4gLz4sXG4gICAgICAgIGVycm9yRWxlbWVudDogPEVycm9yUGFnZSAvPlxuICAgIH0sXG4gIF0pO1xuXG4vLyBSZW5kZXIgeW91ciBSZWFjdCBjb21wb25lbnQgaW5zdGVhZFxuY29uc3Qgcm9vdCA9IGNyZWF0ZVJvb3QoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FwcCcpKTtcbnJvb3QucmVuZGVyKFxuICA8UmVhY3QuU3RyaWN0TW9kZT5cbiAgICA8Um91dGVyUHJvdmlkZXIgcm91dGVyPXtyb3V0ZXJ9IC8+XG4gIDwvUmVhY3QuU3RyaWN0TW9kZT5cbik7XG4iXSwibmFtZXMiOlsiUmVhY3QiLCJDb250YWluZXIiLCJOYXYiLCJOYXZEcm9wZG93biIsIk5hdmJhciIsIk91dGxldCIsIkxheW91dCIsImNyZWF0ZUVsZW1lbnQiLCJGcmFnbWVudCIsImV4cGFuZCIsImJnIiwiZmx1aWQiLCJCcmFuZCIsImhyZWYiLCJUb2dnbGUiLCJDb2xsYXBzZSIsImlkIiwiY2xhc3NOYW1lIiwiTGluayIsInRpdGxlIiwiSXRlbSIsInVzZVJvdXRlRXJyb3IiLCJFcnJvclBhZ2UiLCJlcnJvciIsImNvbnNvbGUiLCJzdGF0dXNUZXh0IiwibWVzc2FnZSIsInhBcGkiLCJwb2xhcmlzX2F1dGhvcml0eSIsInBvbGFyaXNEYXNoYm9hcmQiLCJ1c2VybmFtZSIsImRhc2hib2FyZElkIiwiZ3JpZCIsImdlbmVyYXRleEFQSVN0YXRlbWVudCIsImFyZ3VtZW50cyIsImxlbmd0aCIsInVuZGVmaW5lZCIsInhhcGlDYWxsYmFjayIsIklGSSIsImFjY291bnQiLCJuYW1lIiwiaG9tZVBhZ2UiLCJvbiIsImV2ZW50IiwiaXRlbXMiLCJsb2ciLCJzdGF0ZW1lbnQiLCJwb2xhcmlzIiwiY29tcGxldGVkIiwiYWN0b3IiLCJnZXRTdGF0ZW1lbnQiLCJyZXNpemVkIiwiYXV0aG9yaXR5IiwiX3JlZ2VuZXJhdG9yUnVudGltZSIsImUiLCJ0IiwiciIsIk9iamVjdCIsInByb3RvdHlwZSIsIm4iLCJoYXNPd25Qcm9wZXJ0eSIsIm8iLCJkZWZpbmVQcm9wZXJ0eSIsInZhbHVlIiwiaSIsIlN5bWJvbCIsImEiLCJpdGVyYXRvciIsImMiLCJhc3luY0l0ZXJhdG9yIiwidSIsInRvU3RyaW5nVGFnIiwiZGVmaW5lIiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwid3JhcCIsIkdlbmVyYXRvciIsImNyZWF0ZSIsIkNvbnRleHQiLCJtYWtlSW52b2tlTWV0aG9kIiwidHJ5Q2F0Y2giLCJ0eXBlIiwiYXJnIiwiY2FsbCIsImgiLCJsIiwiZiIsInMiLCJ5IiwiR2VuZXJhdG9yRnVuY3Rpb24iLCJHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSIsInAiLCJkIiwiZ2V0UHJvdG90eXBlT2YiLCJ2IiwidmFsdWVzIiwiZyIsImRlZmluZUl0ZXJhdG9yTWV0aG9kcyIsImZvckVhY2giLCJfaW52b2tlIiwiQXN5bmNJdGVyYXRvciIsImludm9rZSIsIl90eXBlb2YiLCJyZXNvbHZlIiwiX19hd2FpdCIsInRoZW4iLCJjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZyIsIkVycm9yIiwiZG9uZSIsIm1ldGhvZCIsImRlbGVnYXRlIiwibWF5YmVJbnZva2VEZWxlZ2F0ZSIsInNlbnQiLCJfc2VudCIsImRpc3BhdGNoRXhjZXB0aW9uIiwiYWJydXB0IiwiVHlwZUVycm9yIiwicmVzdWx0TmFtZSIsIm5leHQiLCJuZXh0TG9jIiwicHVzaFRyeUVudHJ5IiwidHJ5TG9jIiwiY2F0Y2hMb2MiLCJmaW5hbGx5TG9jIiwiYWZ0ZXJMb2MiLCJ0cnlFbnRyaWVzIiwicHVzaCIsInJlc2V0VHJ5RW50cnkiLCJjb21wbGV0aW9uIiwicmVzZXQiLCJpc05hTiIsImRpc3BsYXlOYW1lIiwiaXNHZW5lcmF0b3JGdW5jdGlvbiIsImNvbnN0cnVjdG9yIiwibWFyayIsInNldFByb3RvdHlwZU9mIiwiX19wcm90b19fIiwiYXdyYXAiLCJhc3luYyIsIlByb21pc2UiLCJrZXlzIiwicmV2ZXJzZSIsInBvcCIsInByZXYiLCJjaGFyQXQiLCJzbGljZSIsInN0b3AiLCJydmFsIiwiaGFuZGxlIiwiY29tcGxldGUiLCJmaW5pc2giLCJfY2F0Y2giLCJkZWxlZ2F0ZVlpZWxkIiwiX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIiLCJhbGxvd0FycmF5TGlrZSIsIml0IiwiQXJyYXkiLCJpc0FycmF5IiwiX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5IiwiRiIsIl9lIiwibm9ybWFsQ29tcGxldGlvbiIsImRpZEVyciIsImVyciIsInN0ZXAiLCJfZTIiLCJtaW5MZW4iLCJfYXJyYXlMaWtlVG9BcnJheSIsInRvU3RyaW5nIiwiZnJvbSIsInRlc3QiLCJhcnIiLCJsZW4iLCJhcnIyIiwiYXN5bmNHZW5lcmF0b3JTdGVwIiwiZ2VuIiwicmVqZWN0IiwiX25leHQiLCJfdGhyb3ciLCJrZXkiLCJpbmZvIiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJmbiIsInNlbGYiLCJhcmdzIiwiYXBwbHkiLCJHcmlkU3RhY2siLCJnZXRSZXN1bHQiLCJfeCIsIl94MiIsIl9nZXRSZXN1bHQiLCJfY2FsbGVlIiwidG9rZW4iLCJ1cmwiLCJyZXNwb25zZSIsImRhdGEiLCJfY2FsbGVlJCIsIl9jb250ZXh0IiwiZmV0Y2giLCJoZWFkZXJzIiwiQXV0aG9yaXphdGlvbiIsImNvbmNhdCIsImpzb24iLCJzdGF0dXMiLCJwbG90V2lkZ2V0cyIsIm5vZGVzIiwid2lkZ2V0cyIsIl9pdGVyYXRvciIsIl9zdGVwIiwibm9kZSIsInN1YkdyaWQiLCJlbmdpbmUiLCJ3aWRnZXQiLCJ3aWRnZXRJZCIsInBsb3QiLCJlbCIsImdldEF0dHJpYnV0ZSIsImNvbnRlbnQiLCJxdWVyeVNlbGVjdG9yIiwiaW5uZXJIVE1MIiwid2lkdGgiLCJvZmZzZXRXaWR0aCIsImhlaWdodCIsIm9mZnNldEhlaWdodCIsImdlbmVyYXRlZCIsImNyZWF0ZUF2V2lkZ2V0UGxhY2Vob2xkZXIiLCJkcmF3QXZhaWxhYmxlV2lkZ2V0cyIsImF2YWlsYWJsZVdpZGdldHMiLCJkb2N1bWVudCIsImdldEVsZW1lbnRCeUlkIiwiX2kiLCJfT2JqZWN0JGtleXMiLCJkaXYiLCJhcHBlbmRDaGlsZCIsImhhbmRsZU5ld1dpZGdldERyYWdJbiIsInBhcmVudFdpdGhDbGFzcyIsInNyY0VsZW1lbnQiLCJjbG9zZXN0IiwidGFyZ2V0RWwiLCJjbG9uZU5vZGUiLCJzdHlsZSIsInJlbW92ZVByb3BlcnR5IiwicmVtb3ZlQWxsQ2hpbGROb2RlcyIsInBhcmVudCIsImZpcnN0Q2hpbGQiLCJyZW1vdmVDaGlsZCIsImluaXRHcmlkIiwiaW5pdGlhbFdpZGdldHMiLCJpbml0IiwiY2VsbEhlaWdodCIsImFjY2VwdFdpZGdldHMiLCJyZW1vdmFibGUiLCJtaW5Sb3ciLCJkaXNhYmxlT25lQ29sdW1uTW9kZSIsIm1hcmdpbiIsImxvY2tlZCIsIm5vUmVzaXplIiwibm9Nb3ZlIiwic3ViR3JpZER5bmFtaWMiLCJlbmFibGVXaWRnZXRNb3ZlQW5kUmVzaXplIiwiZW5hYmxlUmVzaXplIiwiZW5hYmxlTW92ZSIsIm1hcCIsImRpc2FibGVXaWRnZXRNb3ZlQW5kUmVzaXplIiwibG9hZCIsInNldEFuaW1hdGlvbiIsImFkZFJlc2l6ZUxpc3RlbmVyIiwid2luZG93IiwiYWRkRXZlbnRMaXN0ZW5lciIsInRvZ2dsZVNpZGViYXIiLCJzaWRlYmFyIiwiaXNWaXNpYmxlIiwiYXZXaWRnZXRzIiwic2V0dXBEcmFnSW4iLCJyZXZlcnQiLCJzY3JvbGwiLCJhcHBlbmRUbyIsImhlbHBlciIsInNhdmUiLCJvbGRHcmlkIiwiaXRlbSIsIngiLCJ3IiwiY2hpbGRyZW4iLCJyZW1vdmVBbGwiLCJyZWZyZXNoV2lkZ2V0cyIsIm5ld1dpZGdldHMiLCJkMyIsIkNPTE9SX1JBTkdFXzEiLCJDT0xPUl9SQU5HRV8yIiwiQmFzZUNoYXJ0V2lkZ2V0IiwiZGVzY3JpcHRpb24iLCJvcHRpb25zIiwiX2NsYXNzQ2FsbENoZWNrIiwiX2RlZmluZVByb3BlcnR5IiwiZGF0YUlzVmFsaWQiLCJ3cmFwcGVyIiwic3ZnIiwic2VsZWN0IiwiYXBwZW5kIiwiX2NyZWF0ZUNsYXNzIiwiY2xlYXJBbmRTY2FsZVN2ZyIsImRpdldpZHRoIiwiZGl2SGVpZ2h0IiwidHJhbnNsYXRlWCIsInRyYW5zbGF0ZVkiLCJyZW1vdmUiLCJzZWxlY3RBbGwiLCJiZ190cmFuc2xhdGUiLCJhdHRyIiwibWFyZ2luUmlnaHQiLCJtYXJnaW5Cb3R0b20iLCJkcmF3VGl0bGUiLCJfdGhpcyIsInRleHQiLCJyYW5kb21JZCIsIkRhdGUiLCJub3ciLCJzZXRUaW1lb3V0Iiwib25TaG93RGVzYyIsImFwcGVuZFhBeGlzIiwieEF4aXMiLCJ0aWNrcyIsImF4aXNCb3R0b20iLCJ0aWNrRm9ybWF0IiwidGltZUZvcm1hdCIsImFwcGVuZFhBeGlzTGFiZWwiLCJ4QXhpc0xhYmVsIiwiYXBwZW5kWUF4aXNMYWJlbCIsInlBeGlzTGFiZWwiLCJzaG93RXJyb3JNZXNzYWdlIiwic2hvd0xlZ2VuZCIsImNvbG9yIiwiZW50ZXIiLCJMaW5lQ2hhcnRXaWRnZXQiLCJfQmFzZUNoYXJ0V2lkZ2V0IiwiX2luaGVyaXRzIiwiX3N1cGVyIiwiX2NyZWF0ZVN1cGVyIiwiX2RhdGEiLCJ0cmFuc2Zvcm0iLCJfdGhpcyRjbGVhckFuZFNjYWxlU3YiLCJfdGhpcyRjbGVhckFuZFNjYWxlU3YyIiwiX3NsaWNlZFRvQXJyYXkiLCJfZDMkZXh0ZW50IiwiZXh0ZW50IiwiY29sdW1uMSIsIl9kMyRleHRlbnQyIiwieE1pbiIsInhNYXgiLCJ4U2NhbGUiLCJ1c2VUaW1lU2NhbGUiLCJzY2FsZVRpbWUiLCJkb21haW4iLCJyYW5nZSIsInNjYWxlTGluZWFyIiwieU1heCIsIm1heCIsImNvbHVtbjIiLCJ5U2NhbGUiLCJheGlzTGVmdCIsInNjYWxlT3JkaW5hbCIsImNvbG9yUmFuZ2UiLCJkYXR1bSIsImxpbmUiLCJCYXJDaGFydFdpZGdldCIsInNjYWxlQmFuZCIsInBhZGRpbmciLCJiYW5kd2lkdGgiLCJQaWVDaGFydFdpZGdldCIsInJhZGl1cyIsIk1hdGgiLCJtaW4iLCJwaWUiLCJwYXRoIiwiYXJjIiwib3V0ZXJSYWRpdXMiLCJpbm5lclJhZGl1cyIsImxhYmVsIiwic2luIiwiZW5kQW5nbGUiLCJzdGFydEFuZ2xlIiwiY29zIiwiQXJlYUNoYXJ0V2lkZ2V0IiwiYXJlYSIsInkwIiwieTEiLCJTdGFja2VkQmFyQ2hhcnRXaWRnZXQiLCJncm91cHMiLCJfdGhpczIiLCJzdWJncm91cHMiLCJyZWR1Y2UiLCJhY2MiLCJfdG9Db25zdW1hYmxlQXJyYXkiLCJfb2JqZWN0U3ByZWFkIiwiZ3JvdXAiLCJzdGFja2VkRGF0YSIsInN0YWNrIiwidGlja1NpemVPdXRlciIsImpvaW4iLCJHcm91cGVkQmFyQ2hhcnRXaWRnZXQiLCJ0aXRsZVRleHQiLCJfcmVmIiwiX3JlZiR4IiwiX3JlZiR5IiwiX3JlZiR6IiwieiIsIl9yZWYkbWFyZ2luVG9wIiwibWFyZ2luVG9wIiwiX3JlZiRtYXJnaW5SaWdodCIsIl9yZWYkbWFyZ2luQm90dG9tIiwiX3JlZiRtYXJnaW5MZWZ0IiwibWFyZ2luTGVmdCIsIl9yZWYkd2lkdGgiLCJfcmVmJGhlaWdodCIsInhEb21haW4iLCJfcmVmJHhSYW5nZSIsInhSYW5nZSIsIl9yZWYkeFBhZGRpbmciLCJ4UGFkZGluZyIsIl9yZWYkeVR5cGUiLCJ5VHlwZSIsInlEb21haW4iLCJfcmVmJHlSYW5nZSIsInlSYW5nZSIsInpEb21haW4iLCJfcmVmJHpQYWRkaW5nIiwielBhZGRpbmciLCJ5Rm9ybWF0IiwieUxhYmVsIiwiX3JlZiRjb2xvcnMiLCJjb2xvcnMiLCJzY2hlbWVUYWJsZWF1MTAiLCJfcmVmJGRyYXdMZWdlbmQiLCJkcmF3TGVnZW5kIiwiX3pEb21haW4iLCJfdGhpcyRvcHRpb25zIiwibGFiZWxPZmZzZXQiLCJYIiwiWSIsIloiLCJJbnRlcm5TZXQiLCJJIiwiZmlsdGVyIiwiaGFzIiwicGFkZGluZ0lubmVyIiwieHpTY2FsZSIsInpTY2FsZSIsInlBeGlzIiwiZm9ybWF0VmFsdWUiLCJPIiwiVCIsImNsb25lIiwiX3pEb21haW4yIiwicnVubmVyIiwiZWxlIiwieU9mZnNldCIsInhPZmZzZXQiLCJTaW1wbGVHcm91cGVkQmFyQ2hhcnRXaWRnZXQiLCJkaWN0IiwiYWdnIiwiY2F0ZWdvcmllcyIsIlNldCIsImZsYXRNYXAiLCJuYW1lcyIsImN1cnIiLCJkYXRhRmxhdHRlZCIsImNhdGVnb3J5Iiwic2NoZW1lU3BlY3RyYWwiLCJDaGFydCIsInY0IiwidXVpZHY0IiwiQ2hhcnRKU1dpZGdldCIsImVsZW1lbnQiLCJ0aXRsZV9lbGVtZW50IiwicXVlc3Rpb25fbWFya19lbGVtZW50IiwiY2FyZF9lbGVtZW50IiwiY2FudmFzIiwiYmFja2dyb3VuZENvbG9yIiwiY2hhcnQiLCJjaGFydGpzX29wdGlvbnMiLCJIZWF0TWFwV2lkZ2V0IiwidmFycyIsInZhcmlhYmxlIiwidGlja1NpemUiLCJjb2xvclNjYWxlIiwic2NhbGVTZXF1ZW50aWFsIiwiaW50ZXJwb2xhdG9yIiwiaW50ZXJwb2xhdGVHcmVlbnMiLCJCYXNlRWxlbWVudCIsIlRleHRFbGVtZW50IiwiX0Jhc2VFbGVtZW50IiwiVGV4dEFyZWFFbGVtZW50IiwicGxhY2Vob2xkZXIiLCJyb3dzIiwiU2NhdHRlckNoYXJ0V2lkZ2V0IiwiY2lyY2xlX2NvbG9yIiwiaGlnaGxpZ2h0X2NvbG9yIiwieG1heCIsInltYXgiLCJzaG93QXhlcyIsImhpZ2hsaWdodCIsIkJveFBsb3RXaWRnZXQiLCJjZW50ZXIiLCJxMyIsInExIiwibWVkaWFuIiwiY2hhcnRfdHlwZXMiLCJHcmlkV2lkZ2V0IiwiY2FyZEhvbGRlciIsImRpc3BsYXkiLCJkaXJlY3Rpb24iLCJmbGV4RGlyZWN0aW9uIiwidGVtcF9zdWJ0aXRsZSIsImZpcnN0Q29sdW1uIiwic3Vid2lkZ2V0X2RpdiIsInN1YndpZGdldCIsIl9zdWJ3aWRnZXRfZGl2JHF1ZXJ5UyIsIl9zdWJ3aWRnZXRfZGl2JHF1ZXJ5UzIiLCJwYXJlbnRFbGVtZW50Iiwic3Vid2lkZ2V0X3RpdGxlIiwiX3N1YndpZGdldF9kaXYkcXVlcnlTMyIsIl9zdWJ3aWRnZXRfZGl2JHF1ZXJ5UzQiLCJtb2NrQmFyQ2hhcnQiLCJjaGFydGpzX2RhdGEiLCJkYXRhc2V0cyIsImxhYmVscyIsIm1vY2tDaGFydEpTQmFyQ2hhcnQiLCJzY2FsZXMiLCJwbHVnaW5zIiwibGVnZW5kIiwibW9ja0dyaWQiLCJtb2NrU2NhdHRlckdyaWQiLCJtb2NrUGllR3JpZCIsIm1vY2tEZWFkbGluZXMiLCJtb2NrUHJvZ3Jlc3NIZWF0IiwibW9ja1Byb2dyZXNzQm94IiwibW9ja0ZlZWRiYWNrIiwibW9ja0xpbmVDaGFydCIsInVzZUVmZmVjdCIsIndpZGdldHNfY29uZmlnIiwiRGFzaGJvYXJkIiwiZGVzYyIsIm1vZGFsQ29udGVudCIsImlubmVyVGV4dCIsIm1vZGFsIiwiYm9vdHN0cmFwIiwiTW9kYWwiLCJzaG93Iiwic2hvd0Vycm9yTW9kYWwiLCJidWlsZFdpZGdldHMiLCJGb250QXdlc29tZUljb24iLCJ1c2VTdGF0ZSIsIkJ1dHRvbiIsIkNvbCIsIlJvdyIsIkNvdmVySW1hZ2UiLCJMb2dpbiIsIl91c2VTdGF0ZSIsIl91c2VTdGF0ZTIiLCJzZXRVc2VybmFtZSIsIl91c2VTdGF0ZTMiLCJfdXNlU3RhdGU0IiwicGFzc3dvcmQiLCJzZXRQYXNzd29yZCIsIl91c2VTdGF0ZTUiLCJfdXNlU3RhdGU2IiwiaXNMb2FkaW5nIiwic2V0SXNMb2FkaW5nIiwibG9naW4iLCJvbktleURvd24iLCJwcmV2ZW50RGVmYXVsdCIsIm1kIiwibGciLCJ4bCIsImF1dG9QbGF5IiwibXV0ZWQiLCJsb29wIiwic3JjIiwiYm9yZGVyTGVmdCIsImljb24iLCJvbkNoYW5nZSIsInRhcmdldCIsImN1cnNvciIsIm9uQ2xpY2siLCJzZXRQYXNzd29yZE1vZGFsT3BlbiIsImNyZWF0ZVJvb3QiLCJjcmVhdGVCcm93c2VyUm91dGVyIiwiUm91dGVyUHJvdmlkZXIiLCJib2R5Iiwicm91dGVyIiwiZXJyb3JFbGVtZW50Iiwicm9vdCIsInJlbmRlciIsIlN0cmljdE1vZGUiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///8054\n')},8190:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var IFI = __webpack_require__(9182);\nvar polaris = __webpack_require__(8366);\nvar xApi = {\n IFI: IFI,\n polaris: polaris\n};\nmodule.exports = xApi;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODE5MC5qcyIsIm1hcHBpbmdzIjoiQUFBQSxJQUFNQSxHQUFHLEdBQUdDLG1CQUFPLENBQUMsSUFBWSxDQUFDO0FBQ2pDLElBQU1DLE9BQU8sR0FBR0QsbUJBQU8sQ0FBQyxJQUFnQixDQUFDO0FBRXpDLElBQU1FLElBQUksR0FBRztFQUNUSCxHQUFHLEVBQUhBLEdBQUc7RUFDSEUsT0FBTyxFQUFQQTtBQUNKLENBQUM7QUFDREUsTUFBTSxDQUFDQyxPQUFPLEdBQUdGLElBQUkiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vc3JjL2pzL3hhcGkuanM/MjdlOCJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBJRkkgPSByZXF1aXJlKCcuL3hhcGkvSUZJJyk7XG5jb25zdCBwb2xhcmlzID0gcmVxdWlyZSgnLi94YXBpL3BvbGFyaXMnKTtcblxuY29uc3QgeEFwaSA9IHtcbiAgICBJRkksXG4gICAgcG9sYXJpcyxcbn07XG5tb2R1bGUuZXhwb3J0cyA9IHhBcGk7Il0sIm5hbWVzIjpbIklGSSIsInJlcXVpcmUiLCJwb2xhcmlzIiwieEFwaSIsIm1vZHVsZSIsImV4cG9ydHMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///8190\n")},7024:module=>{eval("var account = function account(_ref) {\n var name = _ref.name,\n homePage = _ref.homePage;\n return {\n key: 'account',\n getStatement: function getStatement() {\n return {\n name: name,\n homePage: homePage\n };\n }\n };\n};\nmodule.exports = account;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzAyNC5qcyIsIm5hbWVzIjpbImFjY291bnQiLCJfcmVmIiwibmFtZSIsImhvbWVQYWdlIiwia2V5IiwiZ2V0U3RhdGVtZW50IiwibW9kdWxlIiwiZXhwb3J0cyJdLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL3NyYy9qcy94YXBpL0lGSS9hY2NvdW50LmpzPzg1NTQiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgYWNjb3VudCA9ICh7bmFtZSwgaG9tZVBhZ2V9KSA9PiAoe1xuICAgIGtleTogJ2FjY291bnQnLFxuICAgIGdldFN0YXRlbWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHtuYW1lLCBob21lUGFnZX1cbiAgICB9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBhY2NvdW50OyJdLCJtYXBwaW5ncyI6IkFBQUEsSUFBTUEsT0FBTyxHQUFHLFNBQVZBLE9BQU9BLENBQUFDLElBQUE7RUFBQSxJQUFLQyxJQUFJLEdBQUFELElBQUEsQ0FBSkMsSUFBSTtJQUFFQyxRQUFRLEdBQUFGLElBQUEsQ0FBUkUsUUFBUTtFQUFBLE9BQU87SUFDbkNDLEdBQUcsRUFBRSxTQUFTO0lBQ2RDLFlBQVksV0FBQUEsYUFBQSxFQUFHO01BQ1gsT0FBTztRQUFDSCxJQUFJLEVBQUpBLElBQUk7UUFBRUMsUUFBUSxFQUFSQTtNQUFRLENBQUM7SUFDM0I7RUFDSixDQUFDO0FBQUEsQ0FBQztBQUVGRyxNQUFNLENBQUNDLE9BQU8sR0FBR1AsT0FBTyJ9\n//# sourceURL=webpack-internal:///7024\n")},2071:module=>{eval('function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }\nfunction _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }\nvar choice = function choice(id, description) {\n var lang = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : \'en-US\';\n return {\n "id": id.toString(),\n "description": _defineProperty({}, lang, description)\n };\n};\nmodule.exports = choice;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjA3MS5qcyIsIm5hbWVzIjpbImNob2ljZSIsImlkIiwiZGVzY3JpcHRpb24iLCJsYW5nIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwidW5kZWZpbmVkIiwidG9TdHJpbmciLCJfZGVmaW5lUHJvcGVydHkiLCJtb2R1bGUiLCJleHBvcnRzIl0sInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vc3JjL2pzL3hhcGkvSUZJL2Nob2ljZS5qcz9hYmNjIl0sInNvdXJjZXNDb250ZW50IjpbImNvbnN0IGNob2ljZSA9IChpZCwgZGVzY3JpcHRpb24sIGxhbmc9J2VuLVVTJykgPT4ge1xuICAgIHJldHVybiB7XG5cdFwiaWRcIjogaWQudG9TdHJpbmcoKSxcblx0XCJkZXNjcmlwdGlvblwiOiB7XG5cdCAgICBbbGFuZ106IGRlc2NyaXB0aW9uXG5cdH1cbiAgICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNob2ljZTtcbiJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLElBQU1BLE1BQU0sR0FBRyxTQUFUQSxNQUFNQSxDQUFJQyxFQUFFLEVBQUVDLFdBQVcsRUFBbUI7RUFBQSxJQUFqQkMsSUFBSSxHQUFBQyxTQUFBLENBQUFDLE1BQUEsUUFBQUQsU0FBQSxRQUFBRSxTQUFBLEdBQUFGLFNBQUEsTUFBQyxPQUFPO0VBQ3pDLE9BQU87SUFDVixJQUFJLEVBQUVILEVBQUUsQ0FBQ00sUUFBUSxDQUFDLENBQUM7SUFDbkIsYUFBYSxFQUFBQyxlQUFBLEtBQ1JMLElBQUksRUFBR0QsV0FBVztFQUVwQixDQUFDO0FBQ0wsQ0FBQztBQUVETyxNQUFNLENBQUNDLE9BQU8sR0FBR1YsTUFBTSJ9\n//# sourceURL=webpack-internal:///2071\n')},9182:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var account = __webpack_require__(7024);\nvar mbox = __webpack_require__(603);\nvar opeinId = __webpack_require__(9309);\nvar choice = __webpack_require__(2071);\nvar IFI = {\n account: account,\n mbox: mbox,\n opeinId: opeinId,\n choice: choice\n};\nmodule.exports = IFI;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTE4Mi5qcyIsIm1hcHBpbmdzIjoiQUFBQSxJQUFNQSxPQUFPLEdBQUdDLG1CQUFPLENBQUMsSUFBVyxDQUFDO0FBQ3BDLElBQU1DLElBQUksR0FBR0QsbUJBQU8sQ0FBQyxHQUFRLENBQUM7QUFDOUIsSUFBTUUsT0FBTyxHQUFHRixtQkFBTyxDQUFDLElBQVUsQ0FBQztBQUNuQyxJQUFNRyxNQUFNLEdBQUdILG1CQUFPLENBQUMsSUFBVSxDQUFDO0FBRWxDLElBQU1JLEdBQUcsR0FBRztFQUFDTCxPQUFPLEVBQVBBLE9BQU87RUFBRUUsSUFBSSxFQUFKQSxJQUFJO0VBQUVDLE9BQU8sRUFBUEEsT0FBTztFQUFFQyxNQUFNLEVBQU5BO0FBQU0sQ0FBQztBQUU1Q0UsTUFBTSxDQUFDQyxPQUFPLEdBQUdGLEdBQUciLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vc3JjL2pzL3hhcGkvSUZJL2luZGV4LmpzP2RhMTgiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgYWNjb3VudCA9IHJlcXVpcmUoJy4vYWNjb3VudCcpO1xuY29uc3QgbWJveCA9IHJlcXVpcmUoJy4vbWJveCcpO1xuY29uc3Qgb3BlaW5JZCA9IHJlcXVpcmUoJy4vb3BlbklkJyk7XG5jb25zdCBjaG9pY2UgPSByZXF1aXJlKCcuL2Nob2ljZScpO1xuXG5jb25zdCBJRkkgPSB7YWNjb3VudCwgbWJveCwgb3BlaW5JZCwgY2hvaWNlfTtcblxubW9kdWxlLmV4cG9ydHMgPSBJRkk7XG4iXSwibmFtZXMiOlsiYWNjb3VudCIsInJlcXVpcmUiLCJtYm94Iiwib3BlaW5JZCIsImNob2ljZSIsIklGSSIsIm1vZHVsZSIsImV4cG9ydHMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///9182\n")},603:module=>{eval("var mbox = function mbox(_mbox) {\n var isHash = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n return {\n key: isHash ? 'mbox_sha1sum' : 'mbox',\n getStatement: function getStatement() {\n return _mbox;\n }\n };\n};\nmodule.exports = mbox;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjAzLmpzIiwibmFtZXMiOlsibWJveCIsImlzSGFzaCIsImFyZ3VtZW50cyIsImxlbmd0aCIsInVuZGVmaW5lZCIsImtleSIsImdldFN0YXRlbWVudCIsIm1vZHVsZSIsImV4cG9ydHMiXSwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9zcmMvanMveGFwaS9JRkkvbWJveC5qcz8yODVhIl0sInNvdXJjZXNDb250ZW50IjpbImNvbnN0IG1ib3ggPSAobWJveCwgaXNIYXNoID0gZmFsc2UpID0+ICh7XG4gICAga2V5OiBpc0hhc2ggPyAnbWJveF9zaGExc3VtJyA6ICdtYm94JyxcbiAgICBnZXRTdGF0ZW1lbnQoKSB7XG4gICAgICAgIHJldHVybiBtYm94XG4gICAgfVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gbWJveDsiXSwibWFwcGluZ3MiOiJBQUFBLElBQU1BLElBQUksR0FBRyxTQUFBQSxLQUFDQSxLQUFJO0VBQUEsSUFBRUMsTUFBTSxHQUFBQyxTQUFBLENBQUFDLE1BQUEsUUFBQUQsU0FBQSxRQUFBRSxTQUFBLEdBQUFGLFNBQUEsTUFBRyxLQUFLO0VBQUEsT0FBTTtJQUNwQ0csR0FBRyxFQUFFSixNQUFNLEdBQUcsY0FBYyxHQUFHLE1BQU07SUFDckNLLFlBQVksV0FBQUEsYUFBQSxFQUFHO01BQ1gsT0FBT04sS0FBSTtJQUNmO0VBQ0osQ0FBQztBQUFBLENBQUM7QUFFRk8sTUFBTSxDQUFDQyxPQUFPLEdBQUdSLElBQUkifQ==\n//# sourceURL=webpack-internal:///603\n")},9309:module=>{eval("var openId = function openId(openid) {\n return {\n key: 'openid',\n getStatement: function getStatement() {\n return openid;\n }\n };\n};\nmodule.exports = openId;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTMwOS5qcyIsIm5hbWVzIjpbIm9wZW5JZCIsIm9wZW5pZCIsImtleSIsImdldFN0YXRlbWVudCIsIm1vZHVsZSIsImV4cG9ydHMiXSwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9zcmMvanMveGFwaS9JRkkvb3BlbklkLmpzP2YyODQiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3Qgb3BlbklkID0gb3BlbmlkID0+ICh7XG4gICAga2V5OiAnb3BlbmlkJyxcbiAgICBnZXRTdGF0ZW1lbnQoKSB7XG4gICAgICAgIHJldHVybiBvcGVuaWRcbiAgICB9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBvcGVuSWQ7Il0sIm1hcHBpbmdzIjoiQUFBQSxJQUFNQSxNQUFNLEdBQUcsU0FBVEEsTUFBTUEsQ0FBR0MsTUFBTTtFQUFBLE9BQUs7SUFDdEJDLEdBQUcsRUFBRSxRQUFRO0lBQ2JDLFlBQVksV0FBQUEsYUFBQSxFQUFHO01BQ1gsT0FBT0YsTUFBTTtJQUNqQjtFQUNKLENBQUM7QUFBQSxDQUFDO0FBRUZHLE1BQU0sQ0FBQ0MsT0FBTyxHQUFHTCxNQUFNIn0=\n//# sourceURL=webpack-internal:///9309\n")},5660:module=>{eval('function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }\nfunction _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }\nvar actor = function actor(account) {\n if (account.key !== \'account\') {\n throw new Error(\'Actor must be identified by account https://github.com/AICC/CMI-5_Spec_Current/blob/quartz/cmi5_spec.md#92-actor\');\n }\n var state = _defineProperty({\n objectType: "Agent"\n }, account.key, account.getStatement());\n return {\n key: \'actor\',\n name: function name(_name) {\n state = _objectSpread(_objectSpread({}, state), {}, {\n name: _name\n });\n return this;\n },\n getStatement: function getStatement() {\n return state;\n }\n };\n};\nmodule.exports = actor;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTY2MC5qcyIsIm5hbWVzIjpbImFjdG9yIiwiYWNjb3VudCIsImtleSIsIkVycm9yIiwic3RhdGUiLCJfZGVmaW5lUHJvcGVydHkiLCJvYmplY3RUeXBlIiwiZ2V0U3RhdGVtZW50IiwibmFtZSIsIl9vYmplY3RTcHJlYWQiLCJtb2R1bGUiLCJleHBvcnRzIl0sInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vc3JjL2pzL3hhcGkvcG9sYXJpcy9hY3Rvci5qcz8xYjAxIl0sInNvdXJjZXNDb250ZW50IjpbImNvbnN0IGFjdG9yID0gKGFjY291bnQpID0+IHtcblxuICAgIGlmIChhY2NvdW50LmtleSAhPT0gJ2FjY291bnQnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQWN0b3IgbXVzdCBiZSBpZGVudGlmaWVkIGJ5IGFjY291bnQgaHR0cHM6Ly9naXRodWIuY29tL0FJQ0MvQ01JLTVfU3BlY19DdXJyZW50L2Jsb2IvcXVhcnR6L2NtaTVfc3BlYy5tZCM5Mi1hY3RvcicpXG4gICAgfVxuXG4gICAgbGV0IHN0YXRlID0ge1xuICAgICAgICBvYmplY3RUeXBlOiBcIkFnZW50XCIsXG4gICAgICAgIFthY2NvdW50LmtleV06IGFjY291bnQuZ2V0U3RhdGVtZW50KCksXG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIGtleTogJ2FjdG9yJyxcbiAgICAgICAgbmFtZSAobmFtZSkge1xuICAgICAgICAgICAgc3RhdGUgPSB7Li4uc3RhdGUsIG5hbWV9O1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0sXG4gICAgICAgIGdldFN0YXRlbWVudCAoKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RhdGVcbiAgICAgICAgfSxcbiAgICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGFjdG9yOyJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsSUFBTUEsS0FBSyxHQUFHLFNBQVJBLEtBQUtBLENBQUlDLE9BQU8sRUFBSztFQUV2QixJQUFJQSxPQUFPLENBQUNDLEdBQUcsS0FBSyxTQUFTLEVBQUU7SUFDM0IsTUFBTSxJQUFJQyxLQUFLLENBQUMsa0hBQWtILENBQUM7RUFDdkk7RUFFQSxJQUFJQyxLQUFLLEdBQUFDLGVBQUE7SUFDTEMsVUFBVSxFQUFFO0VBQU8sR0FDbEJMLE9BQU8sQ0FBQ0MsR0FBRyxFQUFHRCxPQUFPLENBQUNNLFlBQVksQ0FBQyxDQUFDLENBQ3hDO0VBRUQsT0FBTztJQUNITCxHQUFHLEVBQUUsT0FBTztJQUNaTSxJQUFJLFdBQUFBLEtBQUVBLEtBQUksRUFBRTtNQUNSSixLQUFLLEdBQUFLLGFBQUEsQ0FBQUEsYUFBQSxLQUFPTCxLQUFLO1FBQUVJLElBQUksRUFBSkE7TUFBSSxFQUFDO01BQ3hCLE9BQU8sSUFBSTtJQUNmLENBQUM7SUFDREQsWUFBWSxXQUFBQSxhQUFBLEVBQUk7TUFDWixPQUFPSCxLQUFLO0lBQ2hCO0VBQ0osQ0FBQztBQUNMLENBQUM7QUFFRE0sTUFBTSxDQUFDQyxPQUFPLEdBQUdYLEtBQUsifQ==\n//# sourceURL=webpack-internal:///5660\n')},8366:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var actor = __webpack_require__(5660);\nvar answered = __webpack_require__(7470);\nvar completed = __webpack_require__(1564);\nvar failed = __webpack_require__(1541);\nvar initialized = __webpack_require__(740);\nvar passed = __webpack_require__(3300);\nvar registered = __webpack_require__(3539);\nvar terminated = __webpack_require__(7127);\nvar resized = __webpack_require__(2249);\nvar polaris = {\n actor: actor,\n answered: answered,\n completed: completed,\n failed: failed,\n initialized: initialized,\n passed: passed,\n registered: registered,\n terminated: terminated,\n resized: resized\n};\nmodule.exports = polaris;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODM2Ni5qcyIsIm1hcHBpbmdzIjoiQUFBQSxJQUFNQSxLQUFLLEdBQUdDLG1CQUFPLENBQUMsSUFBUyxDQUFDO0FBQ2hDLElBQU1DLFFBQVEsR0FBR0QsbUJBQU8sQ0FBQyxJQUFpQixDQUFDO0FBQzNDLElBQU1FLFNBQVMsR0FBR0YsbUJBQU8sQ0FBQyxJQUFrQixDQUFDO0FBQzdDLElBQU1HLE1BQU0sR0FBR0gsbUJBQU8sQ0FBQyxJQUFlLENBQUM7QUFDdkMsSUFBTUksV0FBVyxHQUFHSixtQkFBTyxDQUFDLEdBQW9CLENBQUM7QUFDakQsSUFBTUssTUFBTSxHQUFHTCxtQkFBTyxDQUFDLElBQWUsQ0FBQztBQUN2QyxJQUFNTSxVQUFVLEdBQUdOLG1CQUFPLENBQUMsSUFBbUIsQ0FBQztBQUMvQyxJQUFNTyxVQUFVLEdBQUdQLG1CQUFPLENBQUMsSUFBbUIsQ0FBQztBQUMvQyxJQUFNUSxPQUFPLEdBQUdSLG1CQUFPLENBQUMsSUFBZ0IsQ0FBQztBQUV6QyxJQUFNUyxPQUFPLEdBQUc7RUFDWlYsS0FBSyxFQUFMQSxLQUFLO0VBQ0xFLFFBQVEsRUFBUkEsUUFBUTtFQUNSQyxTQUFTLEVBQVRBLFNBQVM7RUFDVEMsTUFBTSxFQUFOQSxNQUFNO0VBQ05DLFdBQVcsRUFBWEEsV0FBVztFQUNYQyxNQUFNLEVBQU5BLE1BQU07RUFDTkMsVUFBVSxFQUFWQSxVQUFVO0VBQ1ZDLFVBQVUsRUFBVkEsVUFBVTtFQUNWQyxPQUFPLEVBQVBBO0FBQ0osQ0FBQztBQUVERSxNQUFNLENBQUNDLE9BQU8sR0FBR0YsT0FBTyIsInNvdXJjZXMiOlsid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9zcmMvanMveGFwaS9wb2xhcmlzL2luZGV4LmpzP2NmOGUiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgYWN0b3IgPSByZXF1aXJlKCcuL2FjdG9yJyk7XG5jb25zdCBhbnN3ZXJlZCA9IHJlcXVpcmUoJy4vdmVyYi9hbnN3ZXJlZCcpO1xuY29uc3QgY29tcGxldGVkID0gcmVxdWlyZSgnLi92ZXJiL2NvbXBsZXRlZCcpO1xuY29uc3QgZmFpbGVkID0gcmVxdWlyZSgnLi92ZXJiL2ZhaWxlZCcpO1xuY29uc3QgaW5pdGlhbGl6ZWQgPSByZXF1aXJlKCcuL3ZlcmIvaW5pdGlhbGl6ZWQnKTtcbmNvbnN0IHBhc3NlZCA9IHJlcXVpcmUoJy4vdmVyYi9wYXNzZWQnKTtcbmNvbnN0IHJlZ2lzdGVyZWQgPSByZXF1aXJlKCcuL3ZlcmIvcmVnaXN0ZXJlZCcpO1xuY29uc3QgdGVybWluYXRlZCA9IHJlcXVpcmUoJy4vdmVyYi90ZXJtaW5hdGVkJyk7XG5jb25zdCByZXNpemVkID0gcmVxdWlyZSgnLi92ZXJiL3Jlc2l6ZWQnKTtcblxuY29uc3QgcG9sYXJpcyA9IHtcbiAgICBhY3RvcixcbiAgICBhbnN3ZXJlZCxcbiAgICBjb21wbGV0ZWQsXG4gICAgZmFpbGVkLFxuICAgIGluaXRpYWxpemVkLFxuICAgIHBhc3NlZCxcbiAgICByZWdpc3RlcmVkLFxuICAgIHRlcm1pbmF0ZWQsXG4gICAgcmVzaXplZFxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBwb2xhcmlzO1xuIl0sIm5hbWVzIjpbImFjdG9yIiwicmVxdWlyZSIsImFuc3dlcmVkIiwiY29tcGxldGVkIiwiZmFpbGVkIiwiaW5pdGlhbGl6ZWQiLCJwYXNzZWQiLCJyZWdpc3RlcmVkIiwidGVybWluYXRlZCIsInJlc2l6ZWQiLCJwb2xhcmlzIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///8366\n")},7470:(module,__unused_webpack_exports,__webpack_require__)=>{eval('function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }\nfunction _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }\nvar statement = __webpack_require__(664);\nvar _require = __webpack_require__(9071),\n cmi5 = _require.cmi5;\nvar answered = function answered() {\n var state = {};\n var baseStatement = statement(cmi5.answered);\n return _objectSpread(_objectSpread({}, baseStatement), {}, {\n result: function result(score, success, completion, duration, response, progress) {\n state = {\n result: {\n "score": score,\n "success": success,\n "completion": completion,\n "duration": duration,\n "response": response,\n "extensions": {\n "https://w3id.org/xapi/cmi5/result/extensions/progress": progress\n }\n }\n };\n return this;\n },\n getStatement: function getStatement() {\n return _objectSpread(_objectSpread({}, baseStatement.getStatement()), state);\n }\n });\n};\nmodule.exports = answered;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzQ3MC5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxJQUFNQSxTQUFTLEdBQUdDLG1CQUFPLENBQUMsR0FBaUIsQ0FBQztBQUM1QyxJQUFBQyxRQUFBLEdBQWVELG1CQUFPLENBQUMsSUFBZ0IsQ0FBQztFQUFqQ0UsSUFBSSxHQUFBRCxRQUFBLENBQUpDLElBQUk7QUFFWCxJQUFNQyxRQUFRLEdBQUcsU0FBWEEsUUFBUUEsQ0FBQSxFQUFTO0VBQ25CLElBQUlDLEtBQUssR0FBRyxDQUFDLENBQUM7RUFDZCxJQUFNQyxhQUFhLEdBQUdOLFNBQVMsQ0FBQ0csSUFBSSxDQUFDQyxRQUFRLENBQUM7RUFFOUMsT0FBQUcsYUFBQSxDQUFBQSxhQUFBLEtBQ09ELGFBQWE7SUFDaEJFLE1BQU0sV0FBQUEsT0FBQ0MsS0FBSyxFQUFFQyxPQUFPLEVBQUVDLFVBQVUsRUFBRUMsUUFBUSxFQUFFQyxRQUFRLEVBQUVDLFFBQVEsRUFBRTtNQUM3RFQsS0FBSyxHQUFHO1FBQ0pHLE1BQU0sRUFBRTtVQUNsQixPQUFPLEVBQUVDLEtBQUs7VUFDZCxTQUFTLEVBQUVDLE9BQU87VUFDSixZQUFZLEVBQUVDLFVBQVU7VUFDeEIsVUFBVSxFQUFFQyxRQUFRO1VBQ2xDLFVBQVUsRUFBRUMsUUFBUTtVQUNOLFlBQVksRUFBRTtZQUNWLHVEQUF1RCxFQUFFQztVQUM3RDtRQUNKO01BQ0osQ0FBQztNQUNELE9BQU8sSUFBSTtJQUNmLENBQUM7SUFDREMsWUFBWSxXQUFBQSxhQUFBLEVBQUc7TUFDWCxPQUFBUixhQUFBLENBQUFBLGFBQUEsS0FDT0QsYUFBYSxDQUFDUyxZQUFZLENBQUMsQ0FBQyxHQUM1QlYsS0FBSztJQUVoQjtFQUFDO0FBRVQsQ0FBQztBQUVEVyxNQUFNLENBQUNDLE9BQU8sR0FBR2IsUUFBUSIsInNvdXJjZXMiOlsid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9zcmMvanMveGFwaS9wb2xhcmlzL3ZlcmIvYW5zd2VyZWQuanM/Yjg2ZSJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBzdGF0ZW1lbnQgPSByZXF1aXJlKCcuLi8uLi9zdGF0ZW1lbnQnKTtcbmNvbnN0IHtjbWk1fSA9IHJlcXVpcmUoJy4uLy4uL3Byb2ZpbGVzJyk7XG5cbmNvbnN0IGFuc3dlcmVkID0gKCkgPT4ge1xuICAgIGxldCBzdGF0ZSA9IHt9O1xuICAgIGNvbnN0IGJhc2VTdGF0ZW1lbnQgPSBzdGF0ZW1lbnQoY21pNS5hbnN3ZXJlZCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICAuLi5iYXNlU3RhdGVtZW50LFxuICAgICAgICByZXN1bHQoc2NvcmUsIHN1Y2Nlc3MsIGNvbXBsZXRpb24sIGR1cmF0aW9uLCByZXNwb25zZSwgcHJvZ3Jlc3MpIHtcbiAgICAgICAgICAgIHN0YXRlID0ge1xuICAgICAgICAgICAgICAgIHJlc3VsdDoge1xuXHRcdCAgICBcInNjb3JlXCI6IHNjb3JlLFxuXHRcdCAgICBcInN1Y2Nlc3NcIjogc3VjY2VzcyxcbiAgICAgICAgICAgICAgICAgICAgXCJjb21wbGV0aW9uXCI6IGNvbXBsZXRpb24sXG4gICAgICAgICAgICAgICAgICAgIFwiZHVyYXRpb25cIjogZHVyYXRpb24sXG5cdFx0ICAgIFwicmVzcG9uc2VcIjogcmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgICAgIFwiZXh0ZW5zaW9uc1wiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBcImh0dHBzOi8vdzNpZC5vcmcveGFwaS9jbWk1L3Jlc3VsdC9leHRlbnNpb25zL3Byb2dyZXNzXCI6IHByb2dyZXNzXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0sXG4gICAgICAgIGdldFN0YXRlbWVudCgpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4uYmFzZVN0YXRlbWVudC5nZXRTdGF0ZW1lbnQoKSxcbiAgICAgICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGFuc3dlcmVkO1xuIl0sIm5hbWVzIjpbInN0YXRlbWVudCIsInJlcXVpcmUiLCJfcmVxdWlyZSIsImNtaTUiLCJhbnN3ZXJlZCIsInN0YXRlIiwiYmFzZVN0YXRlbWVudCIsIl9vYmplY3RTcHJlYWQiLCJyZXN1bHQiLCJzY29yZSIsInN1Y2Nlc3MiLCJjb21wbGV0aW9uIiwiZHVyYXRpb24iLCJyZXNwb25zZSIsInByb2dyZXNzIiwiZ2V0U3RhdGVtZW50IiwibW9kdWxlIiwiZXhwb3J0cyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///7470\n')},1564:(module,__unused_webpack_exports,__webpack_require__)=>{eval('function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }\nfunction _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }\nvar statement = __webpack_require__(664);\nvar _require = __webpack_require__(9071),\n cmi5 = _require.cmi5;\nvar completed = function completed() {\n var state = {};\n var baseStatement = statement(cmi5.completed);\n return _objectSpread(_objectSpread({}, baseStatement), {}, {\n result: function result(duration) {\n state = {\n result: {\n completion: true,\n duration: duration,\n extensions: {\n "https://w3id.org/xapi/cmi5/result/extensions/progress": 100\n }\n }\n };\n return this;\n },\n getStatement: function getStatement() {\n return _objectSpread(_objectSpread({}, baseStatement.getStatement()), state);\n }\n });\n};\nmodule.exports = completed;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTU2NC5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxJQUFNQSxTQUFTLEdBQUdDLG1CQUFPLENBQUMsR0FBaUIsQ0FBQztBQUM1QyxJQUFBQyxRQUFBLEdBQWVELG1CQUFPLENBQUMsSUFBZ0IsQ0FBQztFQUFqQ0UsSUFBSSxHQUFBRCxRQUFBLENBQUpDLElBQUk7QUFFWCxJQUFNQyxTQUFTLEdBQUcsU0FBWkEsU0FBU0EsQ0FBQSxFQUFTO0VBQ3BCLElBQUlDLEtBQUssR0FBRyxDQUFDLENBQUM7RUFDZCxJQUFNQyxhQUFhLEdBQUdOLFNBQVMsQ0FBQ0csSUFBSSxDQUFDQyxTQUFTLENBQUM7RUFFL0MsT0FBQUcsYUFBQSxDQUFBQSxhQUFBLEtBQ09ELGFBQWE7SUFDaEJFLE1BQU0sV0FBQUEsT0FBQ0MsUUFBUSxFQUFFO01BQ2JKLEtBQUssR0FBRztRQUNKRyxNQUFNLEVBQUU7VUFDSkUsVUFBVSxFQUFFLElBQUk7VUFDaEJELFFBQVEsRUFBUkEsUUFBUTtVQUNSRSxVQUFVLEVBQUU7WUFDUix1REFBdUQsRUFBRTtVQUM3RDtRQUNKO01BQ0osQ0FBQztNQUNELE9BQU8sSUFBSTtJQUNmLENBQUM7SUFDREMsWUFBWSxXQUFBQSxhQUFBLEVBQUc7TUFDWCxPQUFBTCxhQUFBLENBQUFBLGFBQUEsS0FDT0QsYUFBYSxDQUFDTSxZQUFZLENBQUMsQ0FBQyxHQUM1QlAsS0FBSztJQUVoQjtFQUFDO0FBRVQsQ0FBQztBQUVEUSxNQUFNLENBQUNDLE9BQU8sR0FBR1YsU0FBUyIsInNvdXJjZXMiOlsid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9zcmMvanMveGFwaS9wb2xhcmlzL3ZlcmIvY29tcGxldGVkLmpzP2QyMGEiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3Qgc3RhdGVtZW50ID0gcmVxdWlyZSgnLi4vLi4vc3RhdGVtZW50Jyk7XG5jb25zdCB7Y21pNX0gPSByZXF1aXJlKCcuLi8uLi9wcm9maWxlcycpO1xuXG5jb25zdCBjb21wbGV0ZWQgPSAoKSA9PiB7XG4gICAgbGV0IHN0YXRlID0ge307XG4gICAgY29uc3QgYmFzZVN0YXRlbWVudCA9IHN0YXRlbWVudChjbWk1LmNvbXBsZXRlZCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICAuLi5iYXNlU3RhdGVtZW50LFxuICAgICAgICByZXN1bHQoZHVyYXRpb24pIHtcbiAgICAgICAgICAgIHN0YXRlID0ge1xuICAgICAgICAgICAgICAgIHJlc3VsdDoge1xuICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJodHRwczovL3czaWQub3JnL3hhcGkvY21pNS9yZXN1bHQvZXh0ZW5zaW9ucy9wcm9ncmVzc1wiOiAxMDBcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0U3RhdGVtZW50KCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAuLi5iYXNlU3RhdGVtZW50LmdldFN0YXRlbWVudCgpLFxuICAgICAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gY29tcGxldGVkOyJdLCJuYW1lcyI6WyJzdGF0ZW1lbnQiLCJyZXF1aXJlIiwiX3JlcXVpcmUiLCJjbWk1IiwiY29tcGxldGVkIiwic3RhdGUiLCJiYXNlU3RhdGVtZW50IiwiX29iamVjdFNwcmVhZCIsInJlc3VsdCIsImR1cmF0aW9uIiwiY29tcGxldGlvbiIsImV4dGVuc2lvbnMiLCJnZXRTdGF0ZW1lbnQiLCJtb2R1bGUiLCJleHBvcnRzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///1564\n')},1541:(module,__unused_webpack_exports,__webpack_require__)=>{eval('function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }\nfunction _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }\nvar statement = __webpack_require__(664);\nvar _require = __webpack_require__(9071),\n cmi5 = _require.cmi5;\nvar failed = function failed() {\n var state = {};\n var baseStatement = statement(cmi5.failed);\n return _objectSpread(_objectSpread({}, baseStatement), {}, {\n result: function result(score, duration, progress) {\n state = {\n result: {\n "score": score,\n "success": false,\n "completion": true,\n "duration": duration,\n "extensions": {\n "https://w3id.org/xapi/cmi5/result/extensions/progress": progress\n }\n }\n };\n return this;\n },\n getStatement: function getStatement() {\n return _objectSpread(_objectSpread({}, baseStatement.getStatement()), state);\n }\n });\n};\nmodule.exports = failed;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTU0MS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxJQUFNQSxTQUFTLEdBQUdDLG1CQUFPLENBQUMsR0FBaUIsQ0FBQztBQUM1QyxJQUFBQyxRQUFBLEdBQWVELG1CQUFPLENBQUMsSUFBZ0IsQ0FBQztFQUFqQ0UsSUFBSSxHQUFBRCxRQUFBLENBQUpDLElBQUk7QUFFWCxJQUFNQyxNQUFNLEdBQUcsU0FBVEEsTUFBTUEsQ0FBQSxFQUFTO0VBQ2pCLElBQUlDLEtBQUssR0FBRyxDQUFDLENBQUM7RUFDZCxJQUFNQyxhQUFhLEdBQUdOLFNBQVMsQ0FBQ0csSUFBSSxDQUFDQyxNQUFNLENBQUM7RUFFNUMsT0FBQUcsYUFBQSxDQUFBQSxhQUFBLEtBQ09ELGFBQWE7SUFDaEJFLE1BQU0sV0FBQUEsT0FBQ0MsS0FBSyxFQUFFQyxRQUFRLEVBQUVDLFFBQVEsRUFBRTtNQUM5Qk4sS0FBSyxHQUFHO1FBQ0pHLE1BQU0sRUFBRTtVQUNsQixPQUFPLEVBQUVDLEtBQUs7VUFDZCxTQUFTLEVBQUUsS0FBSztVQUNGLFlBQVksRUFBRSxJQUFJO1VBQ2xCLFVBQVUsRUFBRUMsUUFBUTtVQUNwQixZQUFZLEVBQUU7WUFDVix1REFBdUQsRUFBRUM7VUFDN0Q7UUFDSjtNQUNKLENBQUM7TUFDRCxPQUFPLElBQUk7SUFDZixDQUFDO0lBQ0RDLFlBQVksV0FBQUEsYUFBQSxFQUFHO01BQ1gsT0FBQUwsYUFBQSxDQUFBQSxhQUFBLEtBQ09ELGFBQWEsQ0FBQ00sWUFBWSxDQUFDLENBQUMsR0FDNUJQLEtBQUs7SUFFaEI7RUFBQztBQUVULENBQUM7QUFFRFEsTUFBTSxDQUFDQyxPQUFPLEdBQUdWLE1BQU0iLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vc3JjL2pzL3hhcGkvcG9sYXJpcy92ZXJiL2ZhaWxlZC5qcz80MGUwIl0sInNvdXJjZXNDb250ZW50IjpbImNvbnN0IHN0YXRlbWVudCA9IHJlcXVpcmUoJy4uLy4uL3N0YXRlbWVudCcpO1xuY29uc3Qge2NtaTV9ID0gcmVxdWlyZSgnLi4vLi4vcHJvZmlsZXMnKTtcblxuY29uc3QgZmFpbGVkID0gKCkgPT4ge1xuICAgIGxldCBzdGF0ZSA9IHt9O1xuICAgIGNvbnN0IGJhc2VTdGF0ZW1lbnQgPSBzdGF0ZW1lbnQoY21pNS5mYWlsZWQpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgLi4uYmFzZVN0YXRlbWVudCxcbiAgICAgICAgcmVzdWx0KHNjb3JlLCBkdXJhdGlvbiwgcHJvZ3Jlc3MpIHtcbiAgICAgICAgICAgIHN0YXRlID0ge1xuICAgICAgICAgICAgICAgIHJlc3VsdDoge1xuXHRcdCAgICBcInNjb3JlXCI6IHNjb3JlLFxuXHRcdCAgICBcInN1Y2Nlc3NcIjogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIFwiY29tcGxldGlvblwiOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBcImR1cmF0aW9uXCI6IGR1cmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICBcImV4dGVuc2lvbnNcIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJodHRwczovL3czaWQub3JnL3hhcGkvY21pNS9yZXN1bHQvZXh0ZW5zaW9ucy9wcm9ncmVzc1wiOiBwcm9ncmVzc1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9LFxuICAgICAgICBnZXRTdGF0ZW1lbnQoKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC4uLmJhc2VTdGF0ZW1lbnQuZ2V0U3RhdGVtZW50KCksXG4gICAgICAgICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmYWlsZWQ7XG4iXSwibmFtZXMiOlsic3RhdGVtZW50IiwicmVxdWlyZSIsIl9yZXF1aXJlIiwiY21pNSIsImZhaWxlZCIsInN0YXRlIiwiYmFzZVN0YXRlbWVudCIsIl9vYmplY3RTcHJlYWQiLCJyZXN1bHQiLCJzY29yZSIsImR1cmF0aW9uIiwicHJvZ3Jlc3MiLCJnZXRTdGF0ZW1lbnQiLCJtb2R1bGUiLCJleHBvcnRzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///1541\n')},740:(module,__unused_webpack_exports,__webpack_require__)=>{eval('function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }\nfunction _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }\nvar statement = __webpack_require__(664);\nvar _require = __webpack_require__(9071),\n cmi5 = _require.cmi5;\nvar initialized = function initialized() {\n var state = _objectSpread({}, cmi5.initialized);\n return _objectSpread({}, statement(state));\n};\nmodule.exports = initialized;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzQwLmpzIiwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLElBQU1BLFNBQVMsR0FBR0MsbUJBQU8sQ0FBQyxHQUFpQixDQUFDO0FBQzVDLElBQUFDLFFBQUEsR0FBZUQsbUJBQU8sQ0FBQyxJQUFnQixDQUFDO0VBQWpDRSxJQUFJLEdBQUFELFFBQUEsQ0FBSkMsSUFBSTtBQUVYLElBQU1DLFdBQVcsR0FBRyxTQUFkQSxXQUFXQSxDQUFBLEVBQVM7RUFDdEIsSUFBSUMsS0FBSyxHQUFBQyxhQUFBLEtBQ0ZILElBQUksQ0FBQ0MsV0FBVyxDQUN0QjtFQUVELE9BQUFFLGFBQUEsS0FDT04sU0FBUyxDQUFDSyxLQUFLLENBQUM7QUFFM0IsQ0FBQztBQUVERSxNQUFNLENBQUNDLE9BQU8sR0FBR0osV0FBVyIsInNvdXJjZXMiOlsid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9zcmMvanMveGFwaS9wb2xhcmlzL3ZlcmIvaW5pdGlhbGl6ZWQuanM/ZWQ0YiJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBzdGF0ZW1lbnQgPSByZXF1aXJlKCcuLi8uLi9zdGF0ZW1lbnQnKTtcbmNvbnN0IHtjbWk1fSA9IHJlcXVpcmUoJy4uLy4uL3Byb2ZpbGVzJyk7XG5cbmNvbnN0IGluaXRpYWxpemVkID0gKCkgPT4ge1xuICAgIGxldCBzdGF0ZSA9IHtcbiAgICAgICAgLi4uY21pNS5pbml0aWFsaXplZCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgLi4uc3RhdGVtZW50KHN0YXRlKSxcbiAgICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBpbml0aWFsaXplZDtcbiJdLCJuYW1lcyI6WyJzdGF0ZW1lbnQiLCJyZXF1aXJlIiwiX3JlcXVpcmUiLCJjbWk1IiwiaW5pdGlhbGl6ZWQiLCJzdGF0ZSIsIl9vYmplY3RTcHJlYWQiLCJtb2R1bGUiLCJleHBvcnRzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///740\n')},3300:(module,__unused_webpack_exports,__webpack_require__)=>{eval('function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }\nfunction _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }\nvar statement = __webpack_require__(664);\nvar _require = __webpack_require__(9071),\n cmi5 = _require.cmi5;\nvar passed = function passed() {\n var state = {};\n var baseStatement = statement(cmi5.passed);\n return _objectSpread(_objectSpread({}, baseStatement), {}, {\n result: function result(score, duration, progress) {\n state = {\n result: {\n "score": score,\n "success": true,\n "completion": true,\n "duration": duration,\n "extensions": {\n "https://w3id.org/xapi/cmi5/result/extensions/progress": progress\n }\n }\n };\n return this;\n },\n getStatement: function getStatement() {\n return _objectSpread(_objectSpread({}, baseStatement.getStatement()), state);\n }\n });\n};\nmodule.exports = passed;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzMwMC5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxJQUFNQSxTQUFTLEdBQUdDLG1CQUFPLENBQUMsR0FBaUIsQ0FBQztBQUM1QyxJQUFBQyxRQUFBLEdBQWVELG1CQUFPLENBQUMsSUFBZ0IsQ0FBQztFQUFqQ0UsSUFBSSxHQUFBRCxRQUFBLENBQUpDLElBQUk7QUFFWCxJQUFNQyxNQUFNLEdBQUcsU0FBVEEsTUFBTUEsQ0FBQSxFQUFTO0VBQ2pCLElBQUlDLEtBQUssR0FBRyxDQUFDLENBQUM7RUFDZCxJQUFNQyxhQUFhLEdBQUdOLFNBQVMsQ0FBQ0csSUFBSSxDQUFDQyxNQUFNLENBQUM7RUFFNUMsT0FBQUcsYUFBQSxDQUFBQSxhQUFBLEtBQ09ELGFBQWE7SUFDaEJFLE1BQU0sV0FBQUEsT0FBQ0MsS0FBSyxFQUFFQyxRQUFRLEVBQUVDLFFBQVEsRUFBRTtNQUM5Qk4sS0FBSyxHQUFHO1FBQ0pHLE1BQU0sRUFBRTtVQUNsQixPQUFPLEVBQUVDLEtBQUs7VUFDZCxTQUFTLEVBQUUsSUFBSTtVQUNELFlBQVksRUFBRSxJQUFJO1VBQ2xCLFVBQVUsRUFBRUMsUUFBUTtVQUNwQixZQUFZLEVBQUU7WUFDVix1REFBdUQsRUFBRUM7VUFDN0Q7UUFDSjtNQUNKLENBQUM7TUFDRCxPQUFPLElBQUk7SUFDZixDQUFDO0lBQ0RDLFlBQVksV0FBQUEsYUFBQSxFQUFHO01BQ1gsT0FBQUwsYUFBQSxDQUFBQSxhQUFBLEtBQ09ELGFBQWEsQ0FBQ00sWUFBWSxDQUFDLENBQUMsR0FDNUJQLEtBQUs7SUFFaEI7RUFBQztBQUVULENBQUM7QUFFRFEsTUFBTSxDQUFDQyxPQUFPLEdBQUdWLE1BQU0iLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vc3JjL2pzL3hhcGkvcG9sYXJpcy92ZXJiL3Bhc3NlZC5qcz9lZWQxIl0sInNvdXJjZXNDb250ZW50IjpbImNvbnN0IHN0YXRlbWVudCA9IHJlcXVpcmUoJy4uLy4uL3N0YXRlbWVudCcpO1xuY29uc3Qge2NtaTV9ID0gcmVxdWlyZSgnLi4vLi4vcHJvZmlsZXMnKTtcblxuY29uc3QgcGFzc2VkID0gKCkgPT4ge1xuICAgIGxldCBzdGF0ZSA9IHt9O1xuICAgIGNvbnN0IGJhc2VTdGF0ZW1lbnQgPSBzdGF0ZW1lbnQoY21pNS5wYXNzZWQpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgLi4uYmFzZVN0YXRlbWVudCxcbiAgICAgICAgcmVzdWx0KHNjb3JlLCBkdXJhdGlvbiwgcHJvZ3Jlc3MpIHtcbiAgICAgICAgICAgIHN0YXRlID0ge1xuICAgICAgICAgICAgICAgIHJlc3VsdDoge1xuXHRcdCAgICBcInNjb3JlXCI6IHNjb3JlLFxuXHRcdCAgICBcInN1Y2Nlc3NcIjogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgXCJjb21wbGV0aW9uXCI6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIFwiZHVyYXRpb25cIjogZHVyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgIFwiZXh0ZW5zaW9uc1wiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBcImh0dHBzOi8vdzNpZC5vcmcveGFwaS9jbWk1L3Jlc3VsdC9leHRlbnNpb25zL3Byb2dyZXNzXCI6IHByb2dyZXNzXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0sXG4gICAgICAgIGdldFN0YXRlbWVudCgpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4uYmFzZVN0YXRlbWVudC5nZXRTdGF0ZW1lbnQoKSxcbiAgICAgICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhc3NlZDtcbiJdLCJuYW1lcyI6WyJzdGF0ZW1lbnQiLCJyZXF1aXJlIiwiX3JlcXVpcmUiLCJjbWk1IiwicGFzc2VkIiwic3RhdGUiLCJiYXNlU3RhdGVtZW50IiwiX29iamVjdFNwcmVhZCIsInJlc3VsdCIsInNjb3JlIiwiZHVyYXRpb24iLCJwcm9ncmVzcyIsImdldFN0YXRlbWVudCIsIm1vZHVsZSIsImV4cG9ydHMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///3300\n')},3539:(module,__unused_webpack_exports,__webpack_require__)=>{eval('function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }\nfunction _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }\nvar statement = __webpack_require__(664);\nvar _require = __webpack_require__(9071),\n cmi5 = _require.cmi5;\nvar registered = function registered() {\n var state = _objectSpread({}, cmi5.registered);\n return _objectSpread({}, statement(state));\n};\nmodule.exports = registered;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzUzOS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxJQUFNQSxTQUFTLEdBQUdDLG1CQUFPLENBQUMsR0FBaUIsQ0FBQztBQUM1QyxJQUFBQyxRQUFBLEdBQWVELG1CQUFPLENBQUMsSUFBZ0IsQ0FBQztFQUFqQ0UsSUFBSSxHQUFBRCxRQUFBLENBQUpDLElBQUk7QUFFWCxJQUFNQyxVQUFVLEdBQUcsU0FBYkEsVUFBVUEsQ0FBQSxFQUFTO0VBQ3JCLElBQUlDLEtBQUssR0FBQUMsYUFBQSxLQUNGSCxJQUFJLENBQUNDLFVBQVUsQ0FDckI7RUFFRCxPQUFBRSxhQUFBLEtBQ09OLFNBQVMsQ0FBQ0ssS0FBSyxDQUFDO0FBRTNCLENBQUM7QUFFREUsTUFBTSxDQUFDQyxPQUFPLEdBQUdKLFVBQVUiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vc3JjL2pzL3hhcGkvcG9sYXJpcy92ZXJiL3JlZ2lzdGVyZWQuanM/OWM2OSJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBzdGF0ZW1lbnQgPSByZXF1aXJlKCcuLi8uLi9zdGF0ZW1lbnQnKTtcbmNvbnN0IHtjbWk1fSA9IHJlcXVpcmUoJy4uLy4uL3Byb2ZpbGVzJyk7XG5cbmNvbnN0IHJlZ2lzdGVyZWQgPSAoKSA9PiB7XG4gICAgbGV0IHN0YXRlID0ge1xuICAgICAgICAuLi5jbWk1LnJlZ2lzdGVyZWQsXG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YXRlbWVudChzdGF0ZSksXG4gICAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gcmVnaXN0ZXJlZDsiXSwibmFtZXMiOlsic3RhdGVtZW50IiwicmVxdWlyZSIsIl9yZXF1aXJlIiwiY21pNSIsInJlZ2lzdGVyZWQiLCJzdGF0ZSIsIl9vYmplY3RTcHJlYWQiLCJtb2R1bGUiLCJleHBvcnRzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///3539\n')},2249:(module,__unused_webpack_exports,__webpack_require__)=>{eval('function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }\nfunction _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }\nvar statement = __webpack_require__(664);\nvar _require = __webpack_require__(9071),\n polaris = _require.polaris;\nvar resized = function resized() {\n var state = {};\n var baseStatement = statement(polaris.resized);\n return _objectSpread(_objectSpread({}, baseStatement), {}, {\n getStatement: function getStatement() {\n return _objectSpread(_objectSpread({}, baseStatement.getStatement()), state);\n }\n });\n};\nmodule.exports = resized;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjI0OS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxJQUFNQSxTQUFTLEdBQUdDLG1CQUFPLENBQUMsR0FBaUIsQ0FBQztBQUM1QyxJQUFBQyxRQUFBLEdBQW1CRCxtQkFBTyxDQUFDLElBQWdCLENBQUM7RUFBcENFLE9BQU8sR0FBQUQsUUFBQSxDQUFQQyxPQUFPO0FBRWYsSUFBTUMsT0FBTyxHQUFHLFNBQVZBLE9BQU9BLENBQUEsRUFBUztFQUNsQixJQUFJQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO0VBQ2QsSUFBTUMsYUFBYSxHQUFHTixTQUFTLENBQUNHLE9BQU8sQ0FBQ0MsT0FBTyxDQUFDO0VBRWhELE9BQUFHLGFBQUEsQ0FBQUEsYUFBQSxLQUNPRCxhQUFhO0lBQ2hCRSxZQUFZLFdBQUFBLGFBQUEsRUFBRztNQUNYLE9BQUFELGFBQUEsQ0FBQUEsYUFBQSxLQUNPRCxhQUFhLENBQUNFLFlBQVksQ0FBQyxDQUFDLEdBQzVCSCxLQUFLO0lBRWhCO0VBQUM7QUFFVCxDQUFDO0FBRURJLE1BQU0sQ0FBQ0MsT0FBTyxHQUFHTixPQUFPIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL3NyYy9qcy94YXBpL3BvbGFyaXMvdmVyYi9yZXNpemVkLmpzP2Y5Y2QiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3Qgc3RhdGVtZW50ID0gcmVxdWlyZSgnLi4vLi4vc3RhdGVtZW50Jyk7XG5jb25zdCB7IHBvbGFyaXN9ID0gcmVxdWlyZSgnLi4vLi4vcHJvZmlsZXMnKTtcblxuY29uc3QgcmVzaXplZCA9ICgpID0+IHtcbiAgICBsZXQgc3RhdGUgPSB7fTtcbiAgICBjb25zdCBiYXNlU3RhdGVtZW50ID0gc3RhdGVtZW50KHBvbGFyaXMucmVzaXplZCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICAuLi5iYXNlU3RhdGVtZW50LFxuICAgICAgICBnZXRTdGF0ZW1lbnQoKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC4uLmJhc2VTdGF0ZW1lbnQuZ2V0U3RhdGVtZW50KCksXG4gICAgICAgICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSByZXNpemVkOyJdLCJuYW1lcyI6WyJzdGF0ZW1lbnQiLCJyZXF1aXJlIiwiX3JlcXVpcmUiLCJwb2xhcmlzIiwicmVzaXplZCIsInN0YXRlIiwiYmFzZVN0YXRlbWVudCIsIl9vYmplY3RTcHJlYWQiLCJnZXRTdGF0ZW1lbnQiLCJtb2R1bGUiLCJleHBvcnRzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///2249\n')},7127:(module,__unused_webpack_exports,__webpack_require__)=>{eval('function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }\nfunction _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }\nvar statement = __webpack_require__(664);\nvar _require = __webpack_require__(9071),\n cmi5 = _require.cmi5;\nvar terminated = function terminated() {\n var state = _objectSpread({}, cmi5.terminated);\n return _objectSpread({}, statement(state));\n};\nmodule.exports = terminated;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzEyNy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxJQUFNQSxTQUFTLEdBQUdDLG1CQUFPLENBQUMsR0FBaUIsQ0FBQztBQUM1QyxJQUFBQyxRQUFBLEdBQWVELG1CQUFPLENBQUMsSUFBZ0IsQ0FBQztFQUFqQ0UsSUFBSSxHQUFBRCxRQUFBLENBQUpDLElBQUk7QUFFWCxJQUFNQyxVQUFVLEdBQUcsU0FBYkEsVUFBVUEsQ0FBQSxFQUFTO0VBQ3JCLElBQUlDLEtBQUssR0FBQUMsYUFBQSxLQUNGSCxJQUFJLENBQUNDLFVBQVUsQ0FDckI7RUFFRCxPQUFBRSxhQUFBLEtBQ09OLFNBQVMsQ0FBQ0ssS0FBSyxDQUFDO0FBRTNCLENBQUM7QUFFREUsTUFBTSxDQUFDQyxPQUFPLEdBQUdKLFVBQVUiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vc3JjL2pzL3hhcGkvcG9sYXJpcy92ZXJiL3Rlcm1pbmF0ZWQuanM/MTZiMCJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBzdGF0ZW1lbnQgPSByZXF1aXJlKCcuLi8uLi9zdGF0ZW1lbnQnKTtcbmNvbnN0IHtjbWk1fSA9IHJlcXVpcmUoJy4uLy4uL3Byb2ZpbGVzJyk7XG5cbmNvbnN0IHRlcm1pbmF0ZWQgPSAoKSA9PiB7XG4gICAgbGV0IHN0YXRlID0ge1xuICAgICAgICAuLi5jbWk1LnRlcm1pbmF0ZWQsXG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YXRlbWVudChzdGF0ZSksXG4gICAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gdGVybWluYXRlZDtcbiJdLCJuYW1lcyI6WyJzdGF0ZW1lbnQiLCJyZXF1aXJlIiwiX3JlcXVpcmUiLCJjbWk1IiwidGVybWluYXRlZCIsInN0YXRlIiwiX29iamVjdFNwcmVhZCIsIm1vZHVsZSIsImV4cG9ydHMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///7127\n')},9071:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var verbs = __webpack_require__(2360);\nmodule.exports = {\n polaris: {\n resized: {\n object: {\n objectType: 'Activity',\n definition: {\n type: 'http://polaris.io/xapi/activities/polaris.dashboard.widget'\n }\n },\n verb: verbs.resize\n }\n },\n cmi5: {\n answered: {\n object: {\n objectType: 'Activity',\n definition: {\n type: 'http://adlnet.gov/expapi/activities/cmi.interaction'\n }\n },\n verb: verbs.answered\n },\n completed: {\n object: {\n objectType: 'Activity',\n definition: {\n type: 'http://adlnet.gov/expapi/activities/cmi.interaction'\n }\n },\n verb: verbs.completed\n },\n failed: {\n object: {\n objectType: 'Activity',\n definition: {\n type: 'http://adlnet.gov/expapi/activities/cmi.interaction'\n }\n },\n verb: verbs.failed\n },\n initialized: {\n object: {\n objectType: 'Activity',\n definition: {\n type: 'http://adlnet.gov/expapi/activities/cmi.interaction'\n }\n },\n verb: verbs.initialized\n },\n passed: {\n object: {\n objectType: 'Activity',\n definition: {\n type: 'http://adlnet.gov/expapi/activities/cmi.interaction'\n }\n },\n verb: verbs.passed\n },\n registered: {\n object: {\n objectType: 'Activity',\n definition: {\n type: 'http://adlnet.gov/expapi/activities/cmi.interaction'\n }\n },\n verb: verbs.registered\n },\n terminated: {\n object: {\n objectType: 'Activity',\n definition: {\n type: 'http://adlnet.gov/expapi/activities/cmi.interaction'\n }\n },\n verb: verbs.terminated\n }\n },\n link: {\n registered: {\n object: {\n objectType: 'Activity',\n definition: {\n type: 'http://adlnet.gov/expapi/activities/link'\n }\n },\n verb: verbs.registered\n }\n }\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTA3MS5qcyIsIm1hcHBpbmdzIjoiQUFBQSxJQUFNQSxLQUFLLEdBQUdDLG1CQUFPLENBQUMsSUFBUyxDQUFDO0FBRWhDQyxNQUFNLENBQUNDLE9BQU8sR0FBRztFQUViQyxPQUFPLEVBQUc7SUFDTkMsT0FBTyxFQUFFO01BQ0xDLE1BQU0sRUFBRTtRQUNKQyxVQUFVLEVBQUUsVUFBVTtRQUNwQ0MsVUFBVSxFQUFFO1VBQ01DLElBQUksRUFBRTtRQUN4QjtNQUNVLENBQUM7TUFDREMsSUFBSSxFQUFFVixLQUFLLENBQUNXO0lBQ2hCO0VBQ0osQ0FBQztFQUNEQyxJQUFJLEVBQUU7SUFDRkMsUUFBUSxFQUFFO01BQ05QLE1BQU0sRUFBRTtRQUNKQyxVQUFVLEVBQUUsVUFBVTtRQUNwQ0MsVUFBVSxFQUFFO1VBQ01DLElBQUksRUFBRTtRQUN4QjtNQUNVLENBQUM7TUFDREMsSUFBSSxFQUFFVixLQUFLLENBQUNhO0lBQ2hCLENBQUM7SUFDREMsU0FBUyxFQUFFO01BQ1BSLE1BQU0sRUFBRTtRQUNKQyxVQUFVLEVBQUUsVUFBVTtRQUNwQ0MsVUFBVSxFQUFFO1VBQ01DLElBQUksRUFBRTtRQUN4QjtNQUNVLENBQUM7TUFDREMsSUFBSSxFQUFFVixLQUFLLENBQUNjO0lBQ2hCLENBQUM7SUFDREMsTUFBTSxFQUFFO01BQ0pULE1BQU0sRUFBRTtRQUNKQyxVQUFVLEVBQUUsVUFBVTtRQUNwQ0MsVUFBVSxFQUFFO1VBQ01DLElBQUksRUFBRTtRQUN4QjtNQUNVLENBQUM7TUFDREMsSUFBSSxFQUFFVixLQUFLLENBQUNlO0lBQ2hCLENBQUM7SUFDREMsV0FBVyxFQUFFO01BQ1RWLE1BQU0sRUFBRTtRQUNKQyxVQUFVLEVBQUUsVUFBVTtRQUNwQ0MsVUFBVSxFQUFFO1VBQ01DLElBQUksRUFBRTtRQUN4QjtNQUNVLENBQUM7TUFDREMsSUFBSSxFQUFFVixLQUFLLENBQUNnQjtJQUNoQixDQUFDO0lBQ0RDLE1BQU0sRUFBRTtNQUNKWCxNQUFNLEVBQUU7UUFDSkMsVUFBVSxFQUFFLFVBQVU7UUFDcENDLFVBQVUsRUFBRTtVQUNNQyxJQUFJLEVBQUU7UUFDeEI7TUFDVSxDQUFDO01BQ0RDLElBQUksRUFBRVYsS0FBSyxDQUFDaUI7SUFDaEIsQ0FBQztJQUNEQyxVQUFVLEVBQUU7TUFDUlosTUFBTSxFQUFFO1FBQ0pDLFVBQVUsRUFBRSxVQUFVO1FBQ3BDQyxVQUFVLEVBQUU7VUFDTUMsSUFBSSxFQUFFO1FBQ3hCO01BQ1UsQ0FBQztNQUNEQyxJQUFJLEVBQUVWLEtBQUssQ0FBQ2tCO0lBQ2hCLENBQUM7SUFDREMsVUFBVSxFQUFFO01BQ1JiLE1BQU0sRUFBRTtRQUNKQyxVQUFVLEVBQUUsVUFBVTtRQUNwQ0MsVUFBVSxFQUFFO1VBQ01DLElBQUksRUFBRTtRQUN4QjtNQUNVLENBQUM7TUFDREMsSUFBSSxFQUFFVixLQUFLLENBQUNtQjtJQUNoQjtFQUNKLENBQUM7RUFDREMsSUFBSSxFQUFFO0lBQ0ZGLFVBQVUsRUFBRTtNQUNSWixNQUFNLEVBQUU7UUFDSkMsVUFBVSxFQUFFLFVBQVU7UUFDcENDLFVBQVUsRUFBRTtVQUNNQyxJQUFJLEVBQUU7UUFDeEI7TUFDVSxDQUFDO01BQ0RDLElBQUksRUFBRVYsS0FBSyxDQUFDa0I7SUFDaEI7RUFDSjtBQUNKLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vc3JjL2pzL3hhcGkvcHJvZmlsZXMuanM/NWU1OSJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCB2ZXJicyA9IHJlcXVpcmUoJy4vdmVyYnMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cbiAgICBwb2xhcmlzIDoge1xuICAgICAgICByZXNpemVkOiB7XG4gICAgICAgICAgICBvYmplY3Q6IHtcbiAgICAgICAgICAgICAgICBvYmplY3RUeXBlOiAnQWN0aXZpdHknLFxuXHRcdGRlZmluaXRpb246IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2h0dHA6Ly9wb2xhcmlzLmlvL3hhcGkvYWN0aXZpdGllcy9wb2xhcmlzLmRhc2hib2FyZC53aWRnZXQnXG5cdFx0fVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcmI6IHZlcmJzLnJlc2l6ZVxuICAgICAgICB9LFxuICAgIH0sXG4gICAgY21pNToge1xuICAgICAgICBhbnN3ZXJlZDoge1xuICAgICAgICAgICAgb2JqZWN0OiB7XG4gICAgICAgICAgICAgICAgb2JqZWN0VHlwZTogJ0FjdGl2aXR5Jyxcblx0XHRkZWZpbml0aW9uOiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdodHRwOi8vYWRsbmV0Lmdvdi9leHBhcGkvYWN0aXZpdGllcy9jbWkuaW50ZXJhY3Rpb24nXG5cdFx0fVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcmI6IHZlcmJzLmFuc3dlcmVkXG4gICAgICAgIH0sXG4gICAgICAgIGNvbXBsZXRlZDoge1xuICAgICAgICAgICAgb2JqZWN0OiB7XG4gICAgICAgICAgICAgICAgb2JqZWN0VHlwZTogJ0FjdGl2aXR5Jyxcblx0XHRkZWZpbml0aW9uOiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdodHRwOi8vYWRsbmV0Lmdvdi9leHBhcGkvYWN0aXZpdGllcy9jbWkuaW50ZXJhY3Rpb24nXG5cdFx0fVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcmI6IHZlcmJzLmNvbXBsZXRlZFxuICAgICAgICB9LFxuICAgICAgICBmYWlsZWQ6IHtcbiAgICAgICAgICAgIG9iamVjdDoge1xuICAgICAgICAgICAgICAgIG9iamVjdFR5cGU6ICdBY3Rpdml0eScsXG5cdFx0ZGVmaW5pdGlvbjoge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnaHR0cDovL2FkbG5ldC5nb3YvZXhwYXBpL2FjdGl2aXRpZXMvY21pLmludGVyYWN0aW9uJ1xuXHRcdH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJiOiB2ZXJicy5mYWlsZWRcbiAgICAgICAgfSxcbiAgICAgICAgaW5pdGlhbGl6ZWQ6IHtcbiAgICAgICAgICAgIG9iamVjdDoge1xuICAgICAgICAgICAgICAgIG9iamVjdFR5cGU6ICdBY3Rpdml0eScsXG5cdFx0ZGVmaW5pdGlvbjoge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnaHR0cDovL2FkbG5ldC5nb3YvZXhwYXBpL2FjdGl2aXRpZXMvY21pLmludGVyYWN0aW9uJ1xuXHRcdH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJiOiB2ZXJicy5pbml0aWFsaXplZFxuICAgICAgICB9LFxuICAgICAgICBwYXNzZWQ6IHtcbiAgICAgICAgICAgIG9iamVjdDoge1xuICAgICAgICAgICAgICAgIG9iamVjdFR5cGU6ICdBY3Rpdml0eScsXG5cdFx0ZGVmaW5pdGlvbjoge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnaHR0cDovL2FkbG5ldC5nb3YvZXhwYXBpL2FjdGl2aXRpZXMvY21pLmludGVyYWN0aW9uJ1xuXHRcdH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJiOiB2ZXJicy5wYXNzZWRcbiAgICAgICAgfSxcbiAgICAgICAgcmVnaXN0ZXJlZDoge1xuICAgICAgICAgICAgb2JqZWN0OiB7XG4gICAgICAgICAgICAgICAgb2JqZWN0VHlwZTogJ0FjdGl2aXR5Jyxcblx0XHRkZWZpbml0aW9uOiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdodHRwOi8vYWRsbmV0Lmdvdi9leHBhcGkvYWN0aXZpdGllcy9jbWkuaW50ZXJhY3Rpb24nXG5cdFx0fVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcmI6IHZlcmJzLnJlZ2lzdGVyZWRcbiAgICAgICAgfSxcbiAgICAgICAgdGVybWluYXRlZDoge1xuICAgICAgICAgICAgb2JqZWN0OiB7XG4gICAgICAgICAgICAgICAgb2JqZWN0VHlwZTogJ0FjdGl2aXR5Jyxcblx0XHRkZWZpbml0aW9uOiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdodHRwOi8vYWRsbmV0Lmdvdi9leHBhcGkvYWN0aXZpdGllcy9jbWkuaW50ZXJhY3Rpb24nXG5cdFx0fVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcmI6IHZlcmJzLnRlcm1pbmF0ZWRcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIGxpbms6IHtcbiAgICAgICAgcmVnaXN0ZXJlZDoge1xuICAgICAgICAgICAgb2JqZWN0OiB7XG4gICAgICAgICAgICAgICAgb2JqZWN0VHlwZTogJ0FjdGl2aXR5Jyxcblx0XHRkZWZpbml0aW9uOiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdodHRwOi8vYWRsbmV0Lmdvdi9leHBhcGkvYWN0aXZpdGllcy9saW5rJ1xuXHRcdH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJiOiB2ZXJicy5yZWdpc3RlcmVkLFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuIl0sIm5hbWVzIjpbInZlcmJzIiwicmVxdWlyZSIsIm1vZHVsZSIsImV4cG9ydHMiLCJwb2xhcmlzIiwicmVzaXplZCIsIm9iamVjdCIsIm9iamVjdFR5cGUiLCJkZWZpbml0aW9uIiwidHlwZSIsInZlcmIiLCJyZXNpemUiLCJjbWk1IiwiYW5zd2VyZWQiLCJjb21wbGV0ZWQiLCJmYWlsZWQiLCJpbml0aWFsaXplZCIsInBhc3NlZCIsInJlZ2lzdGVyZWQiLCJ0ZXJtaW5hdGVkIiwibGluayJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///9071\n")},664:module=>{eval('function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }\nfunction _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }\nfunction addLocalizedField(state, field, locale, value) {\n return _objectSpread(_objectSpread({}, state), {}, _defineProperty({}, field, _defineProperty({}, locale, value)));\n}\nvar statement = function statement(state) {\n return {\n actor: function actor(_actor) {\n state = _objectSpread(_objectSpread({}, state), {}, {\n actor: _actor.getStatement()\n });\n return this;\n },\n when: function when(_when) {\n state = _objectSpread(_objectSpread({}, state), {}, {\n timestamp: _when\n });\n return this;\n },\n activityId: function activityId(id) {\n state = _objectSpread(_objectSpread({}, state), {}, {\n object: _objectSpread(_objectSpread({}, state.object), {}, {\n id: id\n })\n });\n return this;\n },\n activityName: function activityName(_ref) {\n var value = _ref.value,\n _ref$locale = _ref.locale,\n locale = _ref$locale === void 0 ? \'en-US\' : _ref$locale;\n state = _objectSpread(_objectSpread({}, state), {}, {\n object: _objectSpread(_objectSpread({}, state.object), {}, {\n definition: _objectSpread({}, addLocalizedField(state.object ? state.object.definition : {}, \'name\', locale, value))\n })\n });\n return this;\n },\n activityDescription: function activityDescription(_ref2) {\n var value = _ref2.value,\n _ref2$locale = _ref2.locale,\n locale = _ref2$locale === void 0 ? \'en-US\' : _ref2$locale;\n state = _objectSpread(_objectSpread({}, state), {}, {\n object: _objectSpread(_objectSpread({}, state.object), {}, {\n definition: _objectSpread({}, addLocalizedField(state.object ? state.object.definition : {}, \'description\', locale, value))\n })\n });\n return this;\n },\n interactionType: function interactionType(type) {\n state = _objectSpread(_objectSpread({}, state), {}, {\n object: _objectSpread(_objectSpread({}, state.object), {}, {\n definition: _objectSpread(_objectSpread({}, state.object.definition), {}, {\n interactionType: type\n })\n })\n });\n return this;\n },\n correctResponsesPattern: function correctResponsesPattern(responsesArray) {\n state = _objectSpread(_objectSpread({}, state), {}, {\n object: _objectSpread(_objectSpread({}, state.object), {}, {\n definition: _objectSpread(_objectSpread({}, state.object.definition), {}, {\n correctResponsesPattern: [responsesArray]\n })\n })\n });\n return this;\n },\n choices: function choices(choicesArray) {\n state = _objectSpread(_objectSpread({}, state), {}, {\n object: _objectSpread(_objectSpread({}, state.object), {}, {\n definition: _objectSpread(_objectSpread({}, state.object.definition), {}, {\n choices: choicesArray\n })\n })\n });\n return this;\n },\n authority: function authority(_ref3) {\n var name = _ref3.name,\n IFI = _ref3.IFI;\n state = _objectSpread(_objectSpread({}, state), {}, {\n authority: _defineProperty(_defineProperty({\n objectType: \'Agent\'\n }, IFI.key, IFI.getStatement()), "name", name)\n });\n return this;\n },\n getStatement: function getStatement() {\n return _objectSpread({\n version: \'1.0.0\'\n }, state);\n }\n };\n};\nmodule.exports = statement;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjY0LmpzIiwibmFtZXMiOlsiYWRkTG9jYWxpemVkRmllbGQiLCJzdGF0ZSIsImZpZWxkIiwibG9jYWxlIiwidmFsdWUiLCJfb2JqZWN0U3ByZWFkIiwiX2RlZmluZVByb3BlcnR5Iiwic3RhdGVtZW50IiwiYWN0b3IiLCJnZXRTdGF0ZW1lbnQiLCJ3aGVuIiwidGltZXN0YW1wIiwiYWN0aXZpdHlJZCIsImlkIiwib2JqZWN0IiwiYWN0aXZpdHlOYW1lIiwiX3JlZiIsIl9yZWYkbG9jYWxlIiwiZGVmaW5pdGlvbiIsImFjdGl2aXR5RGVzY3JpcHRpb24iLCJfcmVmMiIsIl9yZWYyJGxvY2FsZSIsImludGVyYWN0aW9uVHlwZSIsInR5cGUiLCJjb3JyZWN0UmVzcG9uc2VzUGF0dGVybiIsInJlc3BvbnNlc0FycmF5IiwiY2hvaWNlcyIsImNob2ljZXNBcnJheSIsImF1dGhvcml0eSIsIl9yZWYzIiwibmFtZSIsIklGSSIsIm9iamVjdFR5cGUiLCJrZXkiLCJ2ZXJzaW9uIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL3NyYy9qcy94YXBpL3N0YXRlbWVudC5qcz8yMWM5Il0sInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIGFkZExvY2FsaXplZEZpZWxkKHN0YXRlLCBmaWVsZCwgbG9jYWxlLCB2YWx1ZSkge1xuICAgIHJldHVybiB7Li4uc3RhdGUsIFtmaWVsZF06IHtbbG9jYWxlXTogdmFsdWV9fVxufVxuXG5jb25zdCBzdGF0ZW1lbnQgPSAoc3RhdGUpID0+IHtcblxuICAgIHJldHVybiB7XG4gICAgICAgIGFjdG9yKGFjdG9yKSB7XG4gICAgICAgICAgICBzdGF0ZSA9IHtcbiAgICAgICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgICAgICBhY3RvcjogYWN0b3IuZ2V0U3RhdGVtZW50KCksXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSxcbiAgICAgICAgd2hlbih3aGVuKXtcbiAgICAgICAgICAgIHN0YXRlID0gey4uLnN0YXRlLCB0aW1lc3RhbXA6IHdoZW59O1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0sXG4gICAgICAgIGFjdGl2aXR5SWQoaWQpIHtcbiAgICAgICAgICAgIHN0YXRlID0ge1xuICAgICAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgICAgIG9iamVjdDoge1xuICAgICAgICAgICAgICAgICAgICAuLi5zdGF0ZS5vYmplY3QsXG4gICAgICAgICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSxcbiAgICAgICAgYWN0aXZpdHlOYW1lKHt2YWx1ZSwgbG9jYWxlID0gJ2VuLVVTJ30pIHtcbiAgICAgICAgICAgIHN0YXRlID0ge1xuICAgICAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgICAgIG9iamVjdDoge1xuICAgICAgICAgICAgICAgICAgICAuLi5zdGF0ZS5vYmplY3QsXG4gICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLmFkZExvY2FsaXplZEZpZWxkKHN0YXRlLm9iamVjdCA/IHN0YXRlLm9iamVjdC5kZWZpbml0aW9uIDoge30sICduYW1lJywgbG9jYWxlLCB2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9LFxuICAgICAgICBhY3Rpdml0eURlc2NyaXB0aW9uKHt2YWx1ZSwgbG9jYWxlID0gJ2VuLVVTJ30pIHtcbiAgICAgICAgICAgIHN0YXRlID0ge1xuICAgICAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgICAgIG9iamVjdDoge1xuICAgICAgICAgICAgICAgICAgICAuLi5zdGF0ZS5vYmplY3QsXG4gICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLmFkZExvY2FsaXplZEZpZWxkKHN0YXRlLm9iamVjdCA/IHN0YXRlLm9iamVjdC5kZWZpbml0aW9uIDoge30sICdkZXNjcmlwdGlvbicsIGxvY2FsZSwgdmFsdWUpXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSxcblx0aW50ZXJhY3Rpb25UeXBlKHR5cGUpIHtcblx0ICAgIHN0YXRlID0ge1xuXHRcdC4uLnN0YXRlLFxuICAgICAgICAgICAgICAgIG9iamVjdDoge1xuICAgICAgICAgICAgICAgICAgICAuLi5zdGF0ZS5vYmplY3QsXG5cdFx0ICAgIGRlZmluaXRpb246IHtcblx0XHRcdC4uLnN0YXRlLm9iamVjdC5kZWZpbml0aW9uLFxuXHRcdFx0aW50ZXJhY3Rpb25UeXBlOiB0eXBlXG5cdFx0ICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgcmV0dXJuIHRoaXM7XG5cdH0sXG5cdGNvcnJlY3RSZXNwb25zZXNQYXR0ZXJuKHJlc3BvbnNlc0FycmF5KSB7XG5cdCAgICBzdGF0ZSA9IHtcblx0XHQuLi5zdGF0ZSxcbiAgICAgICAgICAgICAgICBvYmplY3Q6IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uc3RhdGUub2JqZWN0LFxuXHRcdCAgICBkZWZpbml0aW9uOiB7XG5cdFx0XHQuLi5zdGF0ZS5vYmplY3QuZGVmaW5pdGlvbixcblx0XHRcdGNvcnJlY3RSZXNwb25zZXNQYXR0ZXJuOiBbcmVzcG9uc2VzQXJyYXldXG5cdFx0ICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgcmV0dXJuIHRoaXM7XG5cdH0sXG5cdGNob2ljZXMoY2hvaWNlc0FycmF5KSB7XG5cdCAgICBzdGF0ZSA9IHtcblx0XHQuLi5zdGF0ZSxcbiAgICAgICAgICAgICAgICBvYmplY3Q6IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uc3RhdGUub2JqZWN0LFxuXHRcdCAgICBkZWZpbml0aW9uOiB7XG5cdFx0XHQuLi5zdGF0ZS5vYmplY3QuZGVmaW5pdGlvbixcblx0XHRcdGNob2ljZXM6IGNob2ljZXNBcnJheVxuXHRcdCAgICB9XG4gICAgICAgICAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIHJldHVybiB0aGlzO1xuXHR9LFxuICAgICAgICBhdXRob3JpdHkoe25hbWUsIElGSX0pIHtcbiAgICAgICAgICAgIHN0YXRlID0ge1xuICAgICAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgICAgIGF1dGhvcml0eToge1xuICAgICAgICAgICAgICAgICAgICBvYmplY3RUeXBlOiAnQWdlbnQnLFxuICAgICAgICAgICAgICAgICAgICBbSUZJLmtleV06IElGSS5nZXRTdGF0ZW1lbnQoKSxcbiAgICAgICAgICAgICAgICAgICAgbmFtZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9LFxuICAgICAgICBnZXRTdGF0ZW1lbnQoKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHZlcnNpb246ICcxLjAuMCcsXG4gICAgICAgICAgICAgICAgLi4uc3RhdGVcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBzdGF0ZW1lbnQ7XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLFNBQVNBLGlCQUFpQkEsQ0FBQ0MsS0FBSyxFQUFFQyxLQUFLLEVBQUVDLE1BQU0sRUFBRUMsS0FBSyxFQUFFO0VBQ3BELE9BQUFDLGFBQUEsQ0FBQUEsYUFBQSxLQUFXSixLQUFL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\n//# sourceURL=webpack-internal:///664\n')},2360:module=>{eval('module.exports = {\n "answered": {\n "id": "http://adlnet.gov/expapi/verbs/answered",\n "display": {\n "en-US": "answered"\n }\n },\n "attempted": {\n "id": "http://adlnet.gov/expapi/verbs/attempted",\n "display": {\n "en-US": "attempted"\n }\n },\n "attended": {\n "id": "http://adlnet.gov/expapi/verbs/attended",\n "display": {\n "en-US": "attended"\n }\n },\n "commented": {\n "id": "http://adlnet.gov/expapi/verbs/commented",\n "display": {\n "en-US": "commented"\n }\n },\n "completed": {\n "id": "http://adlnet.gov/expapi/verbs/completed",\n "display": {\n "en-US": "completed"\n }\n },\n "failed": {\n "id": "http://adlnet.gov/expapi/verbs/failed",\n "display": {\n "en-US": "failed"\n }\n },\n "initialized": {\n "id": "http://adlnet.gov/expapi/verbs/initialized",\n "display": {\n "en-US": "initialized"\n }\n },\n "interacted": {\n "id": "http://adlnet.gov/expapi/verbs/interacted",\n "display": {\n "en-US": "interacted"\n }\n },\n "launched": {\n "id": "http://adlnet.gov/expapi/verbs/launched",\n "display": {\n "en-US": "launched"\n }\n },\n "mastered": {\n "id": "http://adlnet.gov/expapi/verbs/mastered",\n "display": {\n "en-US": "mastered"\n }\n },\n "passed": {\n "id": "http://adlnet.gov/expapi/verbs/passed",\n "display": {\n "en-US": "passed"\n }\n },\n "progressed": {\n "id": "http://adlnet.gov/expapi/verbs/progressed",\n "display": {\n "en-US": "progressed"\n }\n },\n "registered": {\n "id": "http://adlnet.gov/expapi/verbs/registered",\n "display": {\n "en-US": "registered"\n }\n },\n "resumed": {\n "id": "http://adlnet.gov/expapi/verbs/resumed",\n "display": {\n "en-US": "resumed"\n }\n },\n "scored": {\n "id": "http://adlnet.gov/expapi/verbs/scored",\n "display": {\n "en-US": "scored"\n }\n },\n "shared": {\n "id": "http://adlnet.gov/expapi/verbs/shared",\n "display": {\n "en-US": "shared"\n }\n },\n "suspended": {\n "id": "http://adlnet.gov/expapi/verbs/suspended",\n "display": {\n "en-US": "suspended"\n }\n },\n "terminated": {\n "id": "http://adlnet.gov/expapi/verbs/terminated",\n "display": {\n "en-US": "terminated"\n }\n },\n "voided": {\n "id": "http://adlnet.gov/expapi/verbs/voided",\n "display": {\n "en-US": "voided"\n }\n },\n "resize": {\n "id": "http://polaris.io/xapi/verbs/polaris.dashboard.resize",\n "display": {\n "en-US": "resize"\n }\n },\n "drag": {\n "id": "http://polaris.io/xapi/verbs/polaris.dashboard.drag",\n "display": {\n "en-US": "drag"\n }\n },\n "add": {\n "id": "http://polaris.io/xapi/verbs/polaris.dashboard.add",\n "display": {\n "en-US": "add"\n }\n },\n "evaluate": {\n "id": "http://polaris.io/xapi/verbs/polaris.dashboard.evaluate",\n "display": {\n "en-US": "evaluate"\n }\n }\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjM2MC5qcyIsIm5hbWVzIjpbIm1vZHVsZSIsImV4cG9ydHMiXSwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9zcmMvanMveGFwaS92ZXJicy5qcz9hZGVkIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0ge1xuICAgIFwiYW5zd2VyZWRcIjoge1xuICAgICAgICBcImlkXCI6IFwiaHR0cDovL2FkbG5ldC5nb3YvZXhwYXBpL3ZlcmJzL2Fuc3dlcmVkXCIsXG4gICAgICAgIFwiZGlzcGxheVwiOiB7XG4gICAgICAgICAgICBcImVuLVVTXCI6IFwiYW5zd2VyZWRcIixcbiAgICAgICAgfVxuICAgIH0sXG4gICAgXCJhdHRlbXB0ZWRcIjoge1xuICAgICAgICBcImlkXCI6IFwiaHR0cDovL2FkbG5ldC5nb3YvZXhwYXBpL3ZlcmJzL2F0dGVtcHRlZFwiLFxuICAgICAgICBcImRpc3BsYXlcIjoge1xuICAgICAgICAgICAgXCJlbi1VU1wiOiBcImF0dGVtcHRlZFwiLFxuICAgICAgICB9XG4gICAgfSxcbiAgICBcImF0dGVuZGVkXCI6IHtcbiAgICAgICAgXCJpZFwiOiBcImh0dHA6Ly9hZGxuZXQuZ292L2V4cGFwaS92ZXJicy9hdHRlbmRlZFwiLFxuICAgICAgICBcImRpc3BsYXlcIjoge1xuICAgICAgICAgICAgXCJlbi1VU1wiOiBcImF0dGVuZGVkXCIsXG4gICAgICAgIH1cbiAgICB9LFxuICAgIFwiY29tbWVudGVkXCI6IHtcbiAgICAgICAgXCJpZFwiOiBcImh0dHA6Ly9hZGxuZXQuZ292L2V4cGFwaS92ZXJicy9jb21tZW50ZWRcIixcbiAgICAgICAgXCJkaXNwbGF5XCI6IHtcbiAgICAgICAgICAgIFwiZW4tVVNcIjogXCJjb21tZW50ZWRcIixcbiAgICAgICAgfVxuICAgIH0sXG4gICAgXCJjb21wbGV0ZWRcIjoge1xuICAgICAgICBcImlkXCI6IFwiaHR0cDovL2FkbG5ldC5nb3YvZXhwYXBpL3ZlcmJzL2NvbXBsZXRlZFwiLFxuICAgICAgICBcImRpc3BsYXlcIjoge1xuICAgICAgICAgICAgXCJlbi1VU1wiOiBcImNvbXBsZXRlZFwiLFxuICAgICAgICB9XG4gICAgfSxcbiAgICBcImZhaWxlZFwiOiB7XG4gICAgICAgIFwiaWRcIjogXCJodHRwOi8vYWRsbmV0Lmdvdi9leHBhcGkvdmVyYnMvZmFpbGVkXCIsXG4gICAgICAgIFwiZGlzcGxheVwiOiB7XG4gICAgICAgICAgICBcImVuLVVTXCI6IFwiZmFpbGVkXCIsXG4gICAgICAgIH1cbiAgICB9LFxuICAgIFwiaW5pdGlhbGl6ZWRcIjoge1xuICAgICAgICBcImlkXCI6IFwiaHR0cDovL2FkbG5ldC5nb3YvZXhwYXBpL3ZlcmJzL2luaXRpYWxpemVkXCIsXG4gICAgICAgIFwiZGlzcGxheVwiOiB7XG4gICAgICAgICAgICBcImVuLVVTXCI6IFwiaW5pdGlhbGl6ZWRcIixcbiAgICAgICAgfVxuICAgIH0sXG4gICAgXCJpbnRlcmFjdGVkXCI6IHtcbiAgICAgICAgXCJpZFwiOiBcImh0dHA6Ly9hZGxuZXQuZ292L2V4cGFwaS92ZXJicy9pbnRlcmFjdGVkXCIsXG4gICAgICAgIFwiZGlzcGxheVwiOiB7XG4gICAgICAgICAgICBcImVuLVVTXCI6IFwiaW50ZXJhY3RlZFwiLFxuICAgICAgICB9XG4gICAgfSxcbiAgICBcImxhdW5jaGVkXCI6IHtcbiAgICAgICAgXCJpZFwiOiBcImh0dHA6Ly9hZGxuZXQuZ292L2V4cGFwaS92ZXJicy9sYXVuY2hlZFwiLFxuICAgICAgICBcImRpc3BsYXlcIjoge1xuICAgICAgICAgICAgXCJlbi1VU1wiOiBcImxhdW5jaGVkXCIsXG4gICAgICAgIH1cbiAgICB9LFxuICAgIFwibWFzdGVyZWRcIjoge1xuICAgICAgICBcImlkXCI6IFwiaHR0cDovL2FkbG5ldC5nb3YvZXhwYXBpL3ZlcmJzL21hc3RlcmVkXCIsXG4gICAgICAgIFwiZGlzcGxheVwiOiB7XG4gICAgICAgICAgICBcImVuLVVTXCI6IFwibWFzdGVyZWRcIixcbiAgICAgICAgfVxuICAgIH0sXG4gICAgXCJwYXNzZWRcIjoge1xuICAgICAgICBcImlkXCI6IFwiaHR0cDovL2FkbG5ldC5nb3YvZXhwYXBpL3ZlcmJzL3Bhc3NlZFwiLFxuICAgICAgICBcImRpc3BsYXlcIjoge1xuICAgICAgICAgICAgXCJlbi1VU1wiOiBcInBhc3NlZFwiLFxuICAgICAgICB9XG4gICAgfSxcbiAgICBcInByb2dyZXNzZWRcIjoge1xuICAgICAgICBcImlkXCI6IFwiaHR0cDovL2FkbG5ldC5nb3YvZXhwYXBpL3ZlcmJzL3Byb2dyZXNzZWRcIixcbiAgICAgICAgXCJkaXNwbGF5XCI6IHtcbiAgICAgICAgICAgIFwiZW4tVVNcIjogXCJwcm9ncmVzc2VkXCIsXG4gICAgICAgIH1cbiAgICB9LFxuICAgIFwicmVnaXN0ZXJlZFwiOiB7XG4gICAgICAgIFwiaWRcIjogXCJodHRwOi8vYWRsbmV0Lmdvdi9leHBhcGkvdmVyYnMvcmVnaXN0ZXJlZFwiLFxuICAgICAgICBcImRpc3BsYXlcIjoge1xuICAgICAgICAgICAgXCJlbi1VU1wiOiBcInJlZ2lzdGVyZWRcIixcbiAgICAgICAgfVxuICAgIH0sXG4gICAgXCJyZXN1bWVkXCI6IHtcbiAgICAgICAgXCJpZFwiOiBcImh0dHA6Ly9hZGxuZXQuZ292L2V4cGFwaS92ZXJicy9yZXN1bWVkXCIsXG4gICAgICAgIFwiZGlzcGxheVwiOiB7XG4gICAgICAgICAgICBcImVuLVVTXCI6IFwicmVzdW1lZFwiLFxuICAgICAgICB9XG4gICAgfSxcbiAgICBcInNjb3JlZFwiOiB7XG4gICAgICAgIFwiaWRcIjogXCJodHRwOi8vYWRsbmV0Lmdvdi9leHBhcGkvdmVyYnMvc2NvcmVkXCIsXG4gICAgICAgIFwiZGlzcGxheVwiOiB7XG4gICAgICAgICAgICBcImVuLVVTXCI6IFwic2NvcmVkXCIsXG4gICAgICAgIH1cbiAgICB9LFxuICAgIFwic2hhcmVkXCI6IHtcbiAgICAgICAgXCJpZFwiOiBcImh0dHA6Ly9hZGxuZXQuZ292L2V4cGFwaS92ZXJicy9zaGFyZWRcIixcbiAgICAgICAgXCJkaXNwbGF5XCI6IHtcbiAgICAgICAgICAgIFwiZW4tVVNcIjogXCJzaGFyZWRcIixcbiAgICAgICAgfVxuICAgIH0sXG4gICAgXCJzdXNwZW5kZWRcIjoge1xuICAgICAgICBcImlkXCI6IFwiaHR0cDovL2FkbG5ldC5nb3YvZXhwYXBpL3ZlcmJzL3N1c3BlbmRlZFwiLFxuICAgICAgICBcImRpc3BsYXlcIjoge1xuICAgICAgICAgICAgXCJlbi1VU1wiOiBcInN1c3BlbmRlZFwiLFxuICAgICAgICB9XG4gICAgfSxcbiAgICBcInRlcm1pbmF0ZWRcIjoge1xuICAgICAgICBcImlkXCI6IFwiaHR0cDovL2FkbG5ldC5nb3YvZXhwYXBpL3ZlcmJzL3Rlcm1pbmF0ZWRcIixcbiAgICAgICAgXCJkaXNwbGF5XCI6IHtcbiAgICAgICAgICAgIFwiZW4tVVNcIjogXCJ0ZXJtaW5hdGVkXCIsXG4gICAgICAgIH1cbiAgICB9LFxuICAgIFwidm9pZGVkXCI6IHtcbiAgICAgICAgXCJpZFwiOiBcImh0dHA6Ly9hZGxuZXQuZ292L2V4cGFwaS92ZXJicy92b2lkZWRcIixcbiAgICAgICAgXCJkaXNwbGF5XCI6IHtcbiAgICAgICAgICAgIFwiZW4tVVNcIjogXCJ2b2lkZWRcIixcbiAgICAgICAgfVxuICAgIH0sXG4gICAgXCJyZXNpemVcIjoge1xuICAgICAgICBcImlkXCI6IFwiaHR0cDovL3BvbGFyaXMuaW8veGFwaS92ZXJicy9wb2xhcmlzLmRhc2hib2FyZC5yZXNpemVcIixcbiAgICAgICAgXCJkaXNwbGF5XCI6IHtcbiAgICAgICAgICAgIFwiZW4tVVNcIjogXCJyZXNpemVcIixcbiAgICAgICAgfVxuICAgIH0sXG4gICAgXCJkcmFnXCI6IHtcbiAgICAgICAgXCJpZFwiOiBcImh0dHA6Ly9wb2xhcmlzLmlvL3hhcGkvdmVyYnMvcG9sYXJpcy5kYXNoYm9hcmQuZHJhZ1wiLFxuICAgICAgICBcImRpc3BsYXlcIjoge1xuICAgICAgICAgICAgXCJlbi1VU1wiOiBcImRyYWdcIixcbiAgICAgICAgfVxuICAgIH0sXG4gICAgXCJhZGRcIjoge1xuICAgICAgICBcImlkXCI6IFwiaHR0cDovL3BvbGFyaXMuaW8veGFwaS92ZXJicy9wb2xhcmlzLmRhc2hib2FyZC5hZGRcIixcbiAgICAgICAgXCJkaXNwbGF5XCI6IHtcbiAgICAgICAgICAgIFwiZW4tVVNcIjogXCJhZGRcIixcbiAgICAgICAgfVxuICAgIH0sXG4gICAgXCJldmFsdWF0ZVwiOiB7XG4gICAgICAgIFwiaWRcIjogXCJodHRwOi8vcG9sYXJpcy5pby94YXBpL3ZlcmJzL3BvbGFyaXMuZGFzaGJvYXJkLmV2YWx1YXRlXCIsXG4gICAgICAgIFwiZGlzcGxheVwiOiB7XG4gICAgICAgICAgICBcImVuLVVTXCI6IFwiZXZhbHVhdGVcIixcbiAgICAgICAgfVxuICAgIH0sXG59OyJdLCJtYXBwaW5ncyI6IkFBQUFBLE1BQU0sQ0FBQ0MsT0FBTyxHQUFHO0VBQ2IsVUFBVSxFQUFFO0lBQ1IsSUFBSSxFQUFFLHlDQUF5QztJQUMvQyxTQUFTLEVBQUU7TUFDUCxPQUFPLEVBQUU7SUFDYjtFQUNKLENBQUM7RUFDRCxXQUFXLEVBQUU7SUFDVCxJQUFJLEVBQUUsMENBQTBDO0lBQ2hELFNBQVMsRUFBRTtNQUNQLE9BQU8sRUFBRTtJQUNiO0VBQ0osQ0FBQztFQUNELFVBQVUsRUFBRTtJQUNSLElBQUksRUFBRSx5Q0FBeUM7SUFDL0MsU0FBUyxFQUFFO01BQ1AsT0FBTyxFQUFFO0lBQ2I7RUFDSixDQUFDO0VBQ0QsV0FBVyxFQUFFO0lBQ1QsSUFBSSxFQUFFLDBDQUEwQztJQUNoRCxTQUFTLEVBQUU7TUFDUCxPQUFPLEVBQUU7SUFDYjtFQUNKLENBQUM7RUFDRCxXQUFXLEVBQUU7SUFDVCxJQUFJLEVBQUUsMENBQTBDO0lBQ2hELFNBQVMsRUFBRTtNQUNQLE9BQU8sRUFBRTtJQUNiO0VBQ0osQ0FBQztFQUNELFFBQVEsRUFBRTtJQUNOLElBQUksRUFBRSx1Q0FBdUM7SUFDN0MsU0FBUyxFQUFFO01BQ1AsT0FBTyxFQUFFO0lBQ2I7RUFDSixDQUFDO0VBQ0QsYUFBYSxFQUFFO0lBQ1gsSUFBSSxFQUFFLDRDQUE0QztJQUNsRCxTQUFTLEVBQUU7TUFDUCxPQUFPLEVBQUU7SUFDYjtFQUNKLENBQUM7RUFDRCxZQUFZLEVBQUU7SUFDVixJQUFJLEVBQUUsMkNBQTJDO0lBQ2pELFNBQVMsRUFBRTtNQUNQLE9BQU8sRUFBRTtJQUNiO0VBQ0osQ0FBQztFQUNELFVBQVUsRUFBRTtJQUNSLElBQUksRUFBRSx5Q0FBeUM7SUFDL0MsU0FBUyxFQUFFO01BQ1AsT0FBTyxFQUFFO0lBQ2I7RUFDSixDQUFDO0VBQ0QsVUFBVSxFQUFFO0lBQ1IsSUFBSSxFQUFFLHlDQUF5QztJQUMvQyxTQUFTLEVBQUU7TUFDUCxPQUFPLEVBQUU7SUFDYjtFQUNKLENBQUM7RUFDRCxRQUFRLEVBQUU7SUFDTixJQUFJLEVBQUUsdUNBQXVDO0lBQzdDLFNBQVMsRUFBRTtNQUNQLE9BQU8sRUFBRTtJQUNiO0VBQ0osQ0FBQztFQUNELFlBQVksRUFBRTtJQUNWLElBQUksRUFBRSwyQ0FBMkM7SUFDakQsU0FBUyxFQUFFO01BQ1AsT0FBTyxFQUFFO0lBQ2I7RUFDSixDQUFDO0VBQ0QsWUFBWSxFQUFFO0lBQ1YsSUFBSSxFQUFFLDJDQUEyQztJQUNqRCxTQUFTLEVBQUU7TUFDUCxPQUFPLEVBQUU7SUFDYjtFQUNKLENBQUM7RUFDRCxTQUFTLEVBQUU7SUFDUCxJQUFJLEVBQUUsd0NBQXdDO0lBQzlDLFNBQVMsRUFBRTtNQUNQLE9BQU8sRUFBRTtJQUNiO0VBQ0osQ0FBQztFQUNELFFBQVEsRUFBRTtJQUNOLElBQUksRUFBRSx1Q0FBdUM7SUFDN0MsU0FBUyxFQUFFO01BQ1AsT0FBTyxFQUFFO0lBQ2I7RUFDSixDQUFDO0VBQ0QsUUFBUSxFQUFFO0lBQ04sSUFBSSxFQUFFLHVDQUF1QztJQUM3QyxTQUFTLEVBQUU7TUFDUCxPQUFPLEVBQUU7SUFDYjtFQUNKLENBQUM7RUFDRCxXQUFXLEVBQUU7SUFDVCxJQUFJLEVBQUUsMENBQTBDO0lBQ2hELFNBQVMsRUFBRTtNQUNQLE9BQU8sRUFBRTtJQUNiO0VBQ0osQ0FBQztFQUNELFlBQVksRUFBRTtJQUNWLElBQUksRUFBRSwyQ0FBMkM7SUFDakQsU0FBUyxFQUFFO01BQ1AsT0FBTyxFQUFFO0lBQ2I7RUFDSixDQUFDO0VBQ0QsUUFBUSxFQUFFO0lBQ04sSUFBSSxFQUFFLHVDQUF1QztJQUM3QyxTQUFTLEVBQUU7TUFDUCxPQUFPLEVBQUU7SUFDYjtFQUNKLENBQUM7RUFDRCxRQUFRLEVBQUU7SUFDTixJQUFJLEVBQUUsdURBQXVEO0lBQzdELFNBQVMsRUFBRTtNQUNQLE9BQU8sRUFBRTtJQUNiO0VBQ0osQ0FBQztFQUNELE1BQU0sRUFBRTtJQUNKLElBQUksRUFBRSxxREFBcUQ7SUFDM0QsU0FBUyxFQUFFO01BQ1AsT0FBTyxFQUFFO0lBQ2I7RUFDSixDQUFDO0VBQ0QsS0FBSyxFQUFFO0lBQ0gsSUFBSSxFQUFFLG9EQUFvRDtJQUMxRCxTQUFTLEVBQUU7TUFDUCxPQUFPLEVBQUU7SUFDYjtFQUNKLENBQUM7RUFDRCxVQUFVLEVBQUU7SUFDUixJQUFJLEVBQUUseURBQXlEO0lBQy9ELFNBQVMsRUFBRTtNQUNQLE9BQU8sRUFBRTtJQUNiO0VBQ0o7QUFDSixDQUFDIn0=\n//# sourceURL=webpack-internal:///2360\n')},4184:(module,exports)=>{eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\n\tCopyright (c) 2018 Jed Watson.\n\tLicensed under the MIT License (MIT), see\n\thttp://jedwatson.github.io/classnames\n*/\n/* global define */\n\n(function () {\n\t'use strict';\n\n\tvar hasOwn = {}.hasOwnProperty;\n\tvar nativeCodeString = '[native code]';\n\n\tfunction classNames() {\n\t\tvar classes = [];\n\n\t\tfor (var i = 0; i < arguments.length; i++) {\n\t\t\tvar arg = arguments[i];\n\t\t\tif (!arg) continue;\n\n\t\t\tvar argType = typeof arg;\n\n\t\t\tif (argType === 'string' || argType === 'number') {\n\t\t\t\tclasses.push(arg);\n\t\t\t} else if (Array.isArray(arg)) {\n\t\t\t\tif (arg.length) {\n\t\t\t\t\tvar inner = classNames.apply(null, arg);\n\t\t\t\t\tif (inner) {\n\t\t\t\t\t\tclasses.push(inner);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (argType === 'object') {\n\t\t\t\tif (arg.toString !== Object.prototype.toString && !arg.toString.toString().includes('[native code]')) {\n\t\t\t\t\tclasses.push(arg.toString());\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tfor (var key in arg) {\n\t\t\t\t\tif (hasOwn.call(arg, key) && arg[key]) {\n\t\t\t\t\t\tclasses.push(key);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn classes.join(' ');\n\t}\n\n\tif ( true && module.exports) {\n\t\tclassNames.default = classNames;\n\t\tmodule.exports = classNames;\n\t} else if (true) {\n\t\t// register as 'classnames', consistent with npm package name\n\t\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = (function () {\n\t\t\treturn classNames;\n\t\t}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t} else {}\n}());\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDE4NC5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxnQkFBZ0I7QUFDaEI7O0FBRUE7QUFDQTs7QUFFQSxrQkFBa0Isc0JBQXNCO0FBQ3hDO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxLQUFLLEtBQTZCO0FBQ2xDO0FBQ0E7QUFDQSxHQUFHLFNBQVMsSUFBNEU7QUFDeEY7QUFDQSxFQUFFLGlDQUFxQixFQUFFLG1DQUFFO0FBQzNCO0FBQ0EsR0FBRztBQUFBLGtHQUFDO0FBQ0osR0FBRyxLQUFLLEVBRU47QUFDRixDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL2NsYXNzbmFtZXMvaW5kZXguanM/NGQyNiJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcblx0Q29weXJpZ2h0IChjKSAyMDE4IEplZCBXYXRzb24uXG5cdExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZSAoTUlUKSwgc2VlXG5cdGh0dHA6Ly9qZWR3YXRzb24uZ2l0aHViLmlvL2NsYXNzbmFtZXNcbiovXG4vKiBnbG9iYWwgZGVmaW5lICovXG5cbihmdW5jdGlvbiAoKSB7XG5cdCd1c2Ugc3RyaWN0JztcblxuXHR2YXIgaGFzT3duID0ge30uaGFzT3duUHJvcGVydHk7XG5cdHZhciBuYXRpdmVDb2RlU3RyaW5nID0gJ1tuYXRpdmUgY29kZV0nO1xuXG5cdGZ1bmN0aW9uIGNsYXNzTmFtZXMoKSB7XG5cdFx0dmFyIGNsYXNzZXMgPSBbXTtcblxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgYXJnID0gYXJndW1lbnRzW2ldO1xuXHRcdFx0aWYgKCFhcmcpIGNvbnRpbnVlO1xuXG5cdFx0XHR2YXIgYXJnVHlwZSA9IHR5cGVvZiBhcmc7XG5cblx0XHRcdGlmIChhcmdUeXBlID09PSAnc3RyaW5nJyB8fCBhcmdUeXBlID09PSAnbnVtYmVyJykge1xuXHRcdFx0XHRjbGFzc2VzLnB1c2goYXJnKTtcblx0XHRcdH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShhcmcpKSB7XG5cdFx0XHRcdGlmIChhcmcubGVuZ3RoKSB7XG5cdFx0XHRcdFx0dmFyIGlubmVyID0gY2xhc3NOYW1lcy5hcHBseShudWxsLCBhcmcpO1xuXHRcdFx0XHRcdGlmIChpbm5lcikge1xuXHRcdFx0XHRcdFx0Y2xhc3Nlcy5wdXNoKGlubmVyKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoYXJnVHlwZSA9PT0gJ29iamVjdCcpIHtcblx0XHRcdFx0aWYgKGFyZy50b1N0cmluZyAhPT0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyAmJiAhYXJnLnRvU3RyaW5nLnRvU3RyaW5nKCkuaW5jbHVkZXMoJ1tuYXRpdmUgY29kZV0nKSkge1xuXHRcdFx0XHRcdGNsYXNzZXMucHVzaChhcmcudG9TdHJpbmcoKSk7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRmb3IgKHZhciBrZXkgaW4gYXJnKSB7XG5cdFx0XHRcdFx0aWYgKGhhc093bi5jYWxsKGFyZywga2V5KSAmJiBhcmdba2V5XSkge1xuXHRcdFx0XHRcdFx0Y2xhc3Nlcy5wdXNoKGtleSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNsYXNzZXMuam9pbignICcpO1xuXHR9XG5cblx0aWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzKSB7XG5cdFx0Y2xhc3NOYW1lcy5kZWZhdWx0ID0gY2xhc3NOYW1lcztcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGNsYXNzTmFtZXM7XG5cdH0gZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgZGVmaW5lLmFtZCA9PT0gJ29iamVjdCcgJiYgZGVmaW5lLmFtZCkge1xuXHRcdC8vIHJlZ2lzdGVyIGFzICdjbGFzc25hbWVzJywgY29uc2lzdGVudCB3aXRoIG5wbSBwYWNrYWdlIG5hbWVcblx0XHRkZWZpbmUoJ2NsYXNzbmFtZXMnLCBbXSwgZnVuY3Rpb24gKCkge1xuXHRcdFx0cmV0dXJuIGNsYXNzTmFtZXM7XG5cdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0d2luZG93LmNsYXNzTmFtZXMgPSBjbGFzc05hbWVzO1xuXHR9XG59KCkpO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///4184\n")},4800:(module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Z: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7537);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(3645);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(1667);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2__);\n// Imports\n\n\n\nvar ___CSS_LOADER_URL_IMPORT_0___ = new URL(/* asset import */ __webpack_require__(6770), __webpack_require__.b);\nvar ___CSS_LOADER_URL_IMPORT_1___ = new URL(/* asset import */ __webpack_require__(6711), __webpack_require__.b);\nvar ___CSS_LOADER_URL_IMPORT_2___ = new URL(/* asset import */ __webpack_require__(6199), __webpack_require__.b);\nvar ___CSS_LOADER_URL_IMPORT_3___ = new URL(/* asset import */ __webpack_require__(2204), __webpack_require__.b);\nvar ___CSS_LOADER_URL_IMPORT_4___ = new URL(/* asset import */ __webpack_require__(8931), __webpack_require__.b);\nvar ___CSS_LOADER_URL_IMPORT_5___ = new URL(/* asset import */ __webpack_require__(5296), __webpack_require__.b);\nvar ___CSS_LOADER_URL_IMPORT_6___ = new URL(/* asset import */ __webpack_require__(9609), __webpack_require__.b);\nvar ___CSS_LOADER_URL_IMPORT_7___ = new URL(/* asset import */ __webpack_require__(2469), __webpack_require__.b);\nvar ___CSS_LOADER_URL_IMPORT_8___ = new URL(/* asset import */ __webpack_require__(6774), __webpack_require__.b);\nvar ___CSS_LOADER_URL_IMPORT_9___ = new URL(/* asset import */ __webpack_require__(5122), __webpack_require__.b);\nvar ___CSS_LOADER_URL_IMPORT_10___ = new URL(/* asset import */ __webpack_require__(4144), __webpack_require__.b);\nvar ___CSS_LOADER_URL_IMPORT_11___ = new URL(/* asset import */ __webpack_require__(5120), __webpack_require__.b);\nvar ___CSS_LOADER_URL_IMPORT_12___ = new URL(/* asset import */ __webpack_require__(5851), __webpack_require__.b);\nvar ___CSS_LOADER_URL_IMPORT_13___ = new URL(/* asset import */ __webpack_require__(3460), __webpack_require__.b);\nvar ___CSS_LOADER_URL_IMPORT_14___ = new URL(/* asset import */ __webpack_require__(5321), __webpack_require__.b);\nvar ___CSS_LOADER_URL_IMPORT_15___ = new URL(/* asset import */ __webpack_require__(1281), __webpack_require__.b);\nvar ___CSS_LOADER_URL_IMPORT_16___ = new URL(/* asset import */ __webpack_require__(6254), __webpack_require__.b);\nvar ___CSS_LOADER_URL_IMPORT_17___ = new URL(/* asset import */ __webpack_require__(5647), __webpack_require__.b);\nvar ___CSS_LOADER_URL_IMPORT_18___ = new URL(/* asset import */ __webpack_require__(1692), __webpack_require__.b);\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\nvar ___CSS_LOADER_URL_REPLACEMENT_0___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_0___);\nvar ___CSS_LOADER_URL_REPLACEMENT_1___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_1___);\nvar ___CSS_LOADER_URL_REPLACEMENT_2___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_2___);\nvar ___CSS_LOADER_URL_REPLACEMENT_3___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_3___);\nvar ___CSS_LOADER_URL_REPLACEMENT_4___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_4___);\nvar ___CSS_LOADER_URL_REPLACEMENT_5___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_5___);\nvar ___CSS_LOADER_URL_REPLACEMENT_6___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_6___);\nvar ___CSS_LOADER_URL_REPLACEMENT_7___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_7___);\nvar ___CSS_LOADER_URL_REPLACEMENT_8___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_8___);\nvar ___CSS_LOADER_URL_REPLACEMENT_9___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_9___);\nvar ___CSS_LOADER_URL_REPLACEMENT_10___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_10___);\nvar ___CSS_LOADER_URL_REPLACEMENT_11___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_11___);\nvar ___CSS_LOADER_URL_REPLACEMENT_12___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_12___);\nvar ___CSS_LOADER_URL_REPLACEMENT_13___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_13___);\nvar ___CSS_LOADER_URL_REPLACEMENT_14___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_14___);\nvar ___CSS_LOADER_URL_REPLACEMENT_15___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_15___);\nvar ___CSS_LOADER_URL_REPLACEMENT_16___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_16___);\nvar ___CSS_LOADER_URL_REPLACEMENT_17___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_17___);\nvar ___CSS_LOADER_URL_REPLACEMENT_18___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_18___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.grid-title{margin-left:5px;margin-top:2px}*,*::before,*::after{box-sizing:border-box}.card{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,0.125);border-radius:0.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:0.25rem;border-top-right-radius:0.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:0.25rem;border-bottom-left-radius:0.25rem}.card-body{-ms-flex:1 1 auto;flex:1 1 auto;min-height:1px;padding:1.25rem}.card-title{margin-bottom:0.75rem}.card-subtitle{margin-top:-0.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:0.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,0.03);border-bottom:1px solid rgba(0,0,0,0.125)}.card-header:first-child{border-radius:calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:0.75rem 1.25rem;background-color:rgba(0,0,0,0.03);border-top:1px solid rgba(0,0,0,0.125)}.card-footer:last-child{border-radius:0 0 calc(0.25rem - 1px) calc(0.25rem - 1px)}.card-header-tabs{margin-right:-0.625rem;margin-bottom:-0.75rem;margin-left:-0.625rem;border-bottom:0}.card-header-pills{margin-right:-0.625rem;margin-left:-0.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img,.card-img-top,.card-img-bottom{-ms-flex-negative:0;flex-shrink:0;width:100%}.card-img,.card-img-top{border-top-left-radius:calc(0.25rem - 1px);border-top-right-radius:calc(0.25rem - 1px)}.card-img,.card-img-bottom{border-bottom-right-radius:calc(0.25rem - 1px);border-bottom-left-radius:calc(0.25rem - 1px)}.card-deck .card{margin-bottom:15px}@media (min-width: 576px){.card-deck{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{-ms-flex:1 0 0%;flex:1 0 0%;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group>.card{margin-bottom:15px}@media (min-width: 576px){.card-group{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-img-top,.card-group>.card:not(:last-child) .card-header{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-img-bottom,.card-group>.card:not(:last-child) .card-footer{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-img-top,.card-group>.card:not(:first-child) .card-header{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-img-bottom,.card-group>.card:not(:first-child) .card-footer{border-bottom-left-radius:0}}.form-control{display:block;width:100%;height:calc(1.5em + 0.75rem + 2px);padding:0.375rem 0.75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:0.25rem;transition:border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:-moz-focusring{color:transparent;text-shadow:0 0 0 #495057}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 0.2rem rgba(0,123,255,0.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}textarea.form-control{height:auto}/*!\n * Bootstrap v5.3.2 (https://getbootstrap.com/)\n * Copyright 2011-2023 The Bootstrap Authors\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */:root,[data-bs-theme="light"]{--bs-blue: #0d6efd;--bs-indigo: #6610f2;--bs-purple: #6f42c1;--bs-pink: #d63384;--bs-red: #dc3545;--bs-orange: #fd7e14;--bs-yellow: #ffc107;--bs-green: #198754;--bs-teal: #20c997;--bs-cyan: #0dcaf0;--bs-black: #000;--bs-white: #fff;--bs-gray: #6c757d;--bs-gray-dark: #343a40;--bs-gray-100: #f8f9fa;--bs-gray-200: #e9ecef;--bs-gray-300: #dee2e6;--bs-gray-400: #ced4da;--bs-gray-500: #adb5bd;--bs-gray-600: #6c757d;--bs-gray-700: #495057;--bs-gray-800: #343a40;--bs-gray-900: #212529;--bs-primary: #3f51b5;--bs-primary-rgb: 63,81,181;--bs-primary-text-emphasis: #052c65;--bs-secondary-text-emphasis: #2b2f32;--bs-success-text-emphasis: #0a3622;--bs-info-text-emphasis: #055160;--bs-warning-text-emphasis: #664d03;--bs-danger-text-emphasis: #58151c;--bs-light-text-emphasis: #495057;--bs-dark-text-emphasis: #495057;--bs-primary-bg-subtle: #cfe2ff;--bs-secondary-bg-subtle: #e2e3e5;--bs-success-bg-subtle: #d1e7dd;--bs-info-bg-subtle: #cff4fc;--bs-warning-bg-subtle: #fff3cd;--bs-danger-bg-subtle: #f8d7da;--bs-light-bg-subtle: #fcfcfd;--bs-dark-bg-subtle: #ced4da;--bs-primary-border-subtle: #9ec5fe;--bs-secondary-border-subtle: #c4c8cb;--bs-success-border-subtle: #a3cfbb;--bs-info-border-subtle: #9eeaf9;--bs-warning-border-subtle: #ffe69c;--bs-danger-border-subtle: #f1aeb5;--bs-light-border-subtle: #e9ecef;--bs-dark-border-subtle: #adb5bd;--bs-white-rgb: 255,255,255;--bs-black-rgb: 0,0,0;--bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--bs-gradient: linear-gradient(180deg, rgba(255,255,255,0.15), rgba(255,255,255,0));--bs-body-font-family: var(--bs-font-sans-serif);--bs-body-font-size:1rem;--bs-body-font-weight: 400;--bs-body-line-height: 1.5;--bs-body-color: #212529;--bs-body-color-rgb: 33,37,41;--bs-body-bg: #fff;--bs-body-bg-rgb: 255,255,255;--bs-emphasis-color: #000;--bs-emphasis-color-rgb: 0,0,0;--bs-secondary-color: rgba(33,37,41,0.75);--bs-secondary-color-rgb: 33,37,41;--bs-secondary-bg: #e9ecef;--bs-secondary-bg-rgb: 233,236,239;--bs-tertiary-color: rgba(33,37,41,0.5);--bs-tertiary-color-rgb: 33,37,41;--bs-tertiary-bg: #f8f9fa;--bs-tertiary-bg-rgb: 248,249,250;--bs-heading-color: inherit;--bs-link-color: #0d6efd;--bs-link-color-rgb: 13,110,253;--bs-link-decoration: underline;--bs-link-hover-color: #0a58ca;--bs-link-hover-color-rgb: 10,88,202;--bs-code-color: #d63384;--bs-highlight-color: #212529;--bs-highlight-bg: #fff3cd;--bs-border-width: 1px;--bs-border-style: solid;--bs-border-color: #dee2e6;--bs-border-color-translucent: rgba(0,0,0,0.175);--bs-border-radius: .375rem;--bs-border-radius-sm: .25rem;--bs-border-radius-lg: .5rem;--bs-border-radius-xl: 1rem;--bs-border-radius-xxl: 2rem;--bs-border-radius-2xl: var(--bs-border-radius-xxl);--bs-border-radius-pill: 50rem;--bs-box-shadow: 0 0.5rem 1rem rgba(0,0,0,0.15);--bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0,0,0,0.075);--bs-box-shadow-lg: 0 1rem 3rem rgba(0,0,0,0.175);--bs-box-shadow-inset: inset 0 1px 2px rgba(0,0,0,0.075);--bs-focus-ring-width: .25rem;--bs-focus-ring-opacity: .25;--bs-focus-ring-color: rgba(13,110,253,0.25);--bs-form-valid-color: #198754;--bs-form-valid-border-color: #198754;--bs-form-invalid-color: #dc3545;--bs-form-invalid-border-color: #dc3545}[data-bs-theme="dark"]{color-scheme:dark;--bs-body-color: #dee2e6;--bs-body-color-rgb: 222,226,230;--bs-body-bg: #212529;--bs-body-bg-rgb: 33,37,41;--bs-emphasis-color: #fff;--bs-emphasis-color-rgb: 255,255,255;--bs-secondary-color: rgba(222,226,230,0.75);--bs-secondary-color-rgb: 222,226,230;--bs-secondary-bg: #343a40;--bs-secondary-bg-rgb: 52,58,64;--bs-tertiary-color: rgba(222,226,230,0.5);--bs-tertiary-color-rgb: 222,226,230;--bs-tertiary-bg: #2b3035;--bs-tertiary-bg-rgb: 43,48,53;--bs-primary-text-emphasis: #6ea8fe;--bs-secondary-text-emphasis: #a7acb1;--bs-success-text-emphasis: #75b798;--bs-info-text-emphasis: #6edff6;--bs-warning-text-emphasis: #ffda6a;--bs-danger-text-emphasis: #ea868f;--bs-light-text-emphasis: #f8f9fa;--bs-dark-text-emphasis: #dee2e6;--bs-primary-bg-subtle: #031633;--bs-secondary-bg-subtle: #161719;--bs-success-bg-subtle: #051b11;--bs-info-bg-subtle: #032830;--bs-warning-bg-subtle: #332701;--bs-danger-bg-subtle: #2c0b0e;--bs-light-bg-subtle: #343a40;--bs-dark-bg-subtle: #1a1d20;--bs-primary-border-subtle: #084298;--bs-secondary-border-subtle: #41464b;--bs-success-border-subtle: #0f5132;--bs-info-border-subtle: #087990;--bs-warning-border-subtle: #997404;--bs-danger-border-subtle: #842029;--bs-light-border-subtle: #495057;--bs-dark-border-subtle: #343a40;--bs-heading-color: inherit;--bs-link-color: #6ea8fe;--bs-link-hover-color: #8bb9fe;--bs-link-color-rgb: 110,168,254;--bs-link-hover-color-rgb: 139,185,254;--bs-code-color: #e685b5;--bs-highlight-color: #dee2e6;--bs-highlight-bg: #664d03;--bs-border-color: #495057;--bs-border-color-translucent: rgba(255,255,255,0.15);--bs-form-valid-color: #75b798;--bs-form-valid-border-color: #75b798;--bs-form-invalid-color: #ea868f;--bs-form-invalid-border-color: #ea868f}*,*::before,*::after{box-sizing:border-box}@media (prefers-reduced-motion: no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}hr{margin:1rem 0;color:inherit;border:0;border-top:var(--bs-border-width) solid;opacity:.25}h1,.h1,h2,.h2,h3,.h3,h4,.h4,h5,.h5,h6,.h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2;color:var(--bs-heading-color)}h1,.h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width: 1200px){h1,.h1{font-size:2.5rem}}h2,.h2{font-size:calc(1.325rem + .9vw)}@media (min-width: 1200px){h2,.h2{font-size:2rem}}h3,.h3{font-size:calc(1.3rem + .6vw)}@media (min-width: 1200px){h3,.h3{font-size:1.75rem}}h4,.h4{font-size:calc(1.275rem + .3vw)}@media (min-width: 1200px){h4,.h4{font-size:1.5rem}}h5,.h5{font-size:1.25rem}h6,.h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[title]{text-decoration:underline dotted;cursor:help;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small,.small{font-size:.875em}mark,.mark{padding:.1875em;color:var(--bs-highlight-color);background-color:var(--bs-highlight-bg)}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1));text-decoration:underline}a:hover{--bs-link-color-rgb: var(--bs-link-hover-color-rgb)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}pre,code,kbd,samp{font-family:var(--bs-font-monospace);font-size:1em}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:var(--bs-code-color);word-wrap:break-word}a>code{color:inherit}kbd{padding:.1875rem .375rem;font-size:.875em;color:var(--bs-body-bg);background-color:var(--bs-body-color);border-radius:.25rem}kbd kbd{padding:0;font-size:1em}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-secondary-color);text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}thead,tbody,tfoot,tr,td,th{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}input,button,select,optgroup,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role="button"]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]:not([type="date"]):not([type="datetime-local"]):not([type="month"]):not([type="week"]):not([type="time"])::-webkit-calendar-picker-indicator{display:none !important}button,[type="button"],[type="reset"],[type="submit"]{-webkit-appearance:button}button:not(:disabled),[type="button"]:not(:disabled),[type="reset"]:not(:disabled),[type="submit"]:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width: 1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-text,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type="search"]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none !important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media (min-width: 1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media (min-width: 1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media (min-width: 1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media (min-width: 1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media (min-width: 1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media (min-width: 1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:.875em;color:#6c757d}.blockquote-footer::before{content:"\\\\2014\\\\00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:var(--bs-body-bg);border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:.875em;color:var(--bs-secondary-color)}.container,.container-fluid,.container-sm,.container-md,.container-lg,.container-xl,.container-xxl{--bs-gutter-x: 1.5rem;--bs-gutter-y: 0;width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-right:auto;margin-left:auto}@media (min-width: 576px){.container,.container-sm{max-width:540px}}@media (min-width: 768px){.container,.container-sm,.container-md{max-width:720px}}@media (min-width: 992px){.container,.container-sm,.container-md,.container-lg{max-width:960px}}@media (min-width: 1200px){.container,.container-sm,.container-md,.container-lg,.container-xl{max-width:1140px}}@media (min-width: 1400px){.container,.container-sm,.container-md,.container-lg,.container-xl,.container-xxl{max-width:1320px}}:root{--bs-breakpoint-xs: 0;--bs-breakpoint-sm: 576px;--bs-breakpoint-md: 768px;--bs-breakpoint-lg: 992px;--bs-breakpoint-xl: 1200px;--bs-breakpoint-xxl: 1400px}.row{--bs-gutter-x: 1.5rem;--bs-gutter-y: 0;display:flex;flex-wrap:wrap;margin-top:calc(-1 * var(--bs-gutter-y));margin-right:calc(-.5 * var(--bs-gutter-x));margin-left:calc(-.5 * var(--bs-gutter-x))}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-top:var(--bs-gutter-y)}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.33333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.66667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333%}.col-2{flex:0 0 auto;width:16.66667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333%}.col-5{flex:0 0 auto;width:41.66667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333%}.col-8{flex:0 0 auto;width:66.66667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333%}.col-11{flex:0 0 auto;width:91.66667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-left:8.33333%}.offset-2{margin-left:16.66667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333%}.offset-5{margin-left:41.66667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333%}.offset-8{margin-left:66.66667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333%}.offset-11{margin-left:91.66667%}.g-0,.gx-0{--bs-gutter-x: 0}.g-0,.gy-0{--bs-gutter-y: 0}.g-1,.gx-1{--bs-gutter-x: .25rem}.g-1,.gy-1{--bs-gutter-y: .25rem}.g-2,.gx-2{--bs-gutter-x: .5rem}.g-2,.gy-2{--bs-gutter-y: .5rem}.g-3,.gx-3{--bs-gutter-x: 1rem}.g-3,.gy-3{--bs-gutter-y: 1rem}.g-4,.gx-4{--bs-gutter-x: 1.5rem}.g-4,.gy-4{--bs-gutter-y: 1.5rem}.g-5,.gx-5{--bs-gutter-x: 3rem}.g-5,.gy-5{--bs-gutter-y: 3rem}@media (min-width: 576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.33333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.66667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333%}.col-sm-2{flex:0 0 auto;width:16.66667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333%}.col-sm-5{flex:0 0 auto;width:41.66667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333%}.col-sm-8{flex:0 0 auto;width:66.66667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333%}.col-sm-11{flex:0 0 auto;width:91.66667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333%}.offset-sm-2{margin-left:16.66667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333%}.offset-sm-5{margin-left:41.66667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333%}.offset-sm-8{margin-left:66.66667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333%}.offset-sm-11{margin-left:91.66667%}.g-sm-0,.gx-sm-0{--bs-gutter-x: 0}.g-sm-0,.gy-sm-0{--bs-gutter-y: 0}.g-sm-1,.gx-sm-1{--bs-gutter-x: .25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y: .25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x: .5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y: .5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x: 1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y: 1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x: 1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y: 1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x: 3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y: 3rem}}@media (min-width: 768px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.33333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.66667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333%}.col-md-2{flex:0 0 auto;width:16.66667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333%}.col-md-5{flex:0 0 auto;width:41.66667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333%}.col-md-8{flex:0 0 auto;width:66.66667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333%}.col-md-11{flex:0 0 auto;width:91.66667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333%}.offset-md-2{margin-left:16.66667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333%}.offset-md-5{margin-left:41.66667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333%}.offset-md-8{margin-left:66.66667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333%}.offset-md-11{margin-left:91.66667%}.g-md-0,.gx-md-0{--bs-gutter-x: 0}.g-md-0,.gy-md-0{--bs-gutter-y: 0}.g-md-1,.gx-md-1{--bs-gutter-x: .25rem}.g-md-1,.gy-md-1{--bs-gutter-y: .25rem}.g-md-2,.gx-md-2{--bs-gutter-x: .5rem}.g-md-2,.gy-md-2{--bs-gutter-y: .5rem}.g-md-3,.gx-md-3{--bs-gutter-x: 1rem}.g-md-3,.gy-md-3{--bs-gutter-y: 1rem}.g-md-4,.gx-md-4{--bs-gutter-x: 1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y: 1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x: 3rem}.g-md-5,.gy-md-5{--bs-gutter-y: 3rem}}@media (min-width: 992px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.33333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.66667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333%}.col-lg-2{flex:0 0 auto;width:16.66667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333%}.col-lg-5{flex:0 0 auto;width:41.66667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333%}.col-lg-8{flex:0 0 auto;width:66.66667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333%}.col-lg-11{flex:0 0 auto;width:91.66667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333%}.offset-lg-2{margin-left:16.66667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333%}.offset-lg-5{margin-left:41.66667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333%}.offset-lg-8{margin-left:66.66667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333%}.offset-lg-11{margin-left:91.66667%}.g-lg-0,.gx-lg-0{--bs-gutter-x: 0}.g-lg-0,.gy-lg-0{--bs-gutter-y: 0}.g-lg-1,.gx-lg-1{--bs-gutter-x: .25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y: .25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x: .5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y: .5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x: 1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y: 1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x: 1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y: 1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x: 3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y: 3rem}}@media (min-width: 1200px){.col-xl{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.33333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.66667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333%}.col-xl-2{flex:0 0 auto;width:16.66667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333%}.col-xl-5{flex:0 0 auto;width:41.66667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333%}.col-xl-8{flex:0 0 auto;width:66.66667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333%}.col-xl-11{flex:0 0 auto;width:91.66667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333%}.offset-xl-2{margin-left:16.66667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333%}.offset-xl-5{margin-left:41.66667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333%}.offset-xl-8{margin-left:66.66667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333%}.offset-xl-11{margin-left:91.66667%}.g-xl-0,.gx-xl-0{--bs-gutter-x: 0}.g-xl-0,.gy-xl-0{--bs-gutter-y: 0}.g-xl-1,.gx-xl-1{--bs-gutter-x: .25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y: .25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x: .5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y: .5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x: 1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y: 1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x: 1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y: 1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x: 3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y: 3rem}}@media (min-width: 1400px){.col-xxl{flex:1 0 0%}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.33333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.66667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333%}.col-xxl-2{flex:0 0 auto;width:16.66667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333%}.col-xxl-5{flex:0 0 auto;width:41.66667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333%}.col-xxl-8{flex:0 0 auto;width:66.66667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333%}.col-xxl-11{flex:0 0 auto;width:91.66667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333%}.offset-xxl-2{margin-left:16.66667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333%}.offset-xxl-5{margin-left:41.66667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333%}.offset-xxl-8{margin-left:66.66667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333%}.offset-xxl-11{margin-left:91.66667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x: 0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y: 0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x: .25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y: .25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x: .5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y: .5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x: 1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y: 1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x: 1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y: 1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x: 3rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y: 3rem}}.table{--bs-table-color-type: initial;--bs-table-bg-type: initial;--bs-table-color-state: initial;--bs-table-bg-state: initial;--bs-table-color: var(--bs-emphasis-color);--bs-table-bg: var(--bs-body-bg);--bs-table-border-color: var(--bs-border-color);--bs-table-accent-bg: rgba(0,0,0,0);--bs-table-striped-color: var(--bs-emphasis-color);--bs-table-striped-bg: rgba(var(--bs-emphasis-color-rgb), 0.05);--bs-table-active-color: var(--bs-emphasis-color);--bs-table-active-bg: rgba(var(--bs-emphasis-color-rgb), 0.1);--bs-table-hover-color: var(--bs-emphasis-color);--bs-table-hover-bg: rgba(var(--bs-emphasis-color-rgb), 0.075);width:100%;margin-bottom:1rem;vertical-align:top;border-color:var(--bs-table-border-color)}.table>:not(caption)>*>*{padding:.5rem .5rem;color:var(--bs-table-color-state, var(--bs-table-color-type, var(--bs-table-color)));background-color:var(--bs-table-bg);border-bottom-width:var(--bs-border-width);box-shadow:inset 0 0 0 9999px var(--bs-table-bg-state, var(--bs-table-bg-type, var(--bs-table-accent-bg)))}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table-group-divider{border-top:calc(var(--bs-border-width) * 2) solid currentcolor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:var(--bs-border-width) 0}.table-bordered>:not(caption)>*>*{border-width:0 var(--bs-border-width)}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped>tbody>tr:nth-of-type(odd)>*{--bs-table-color-type: var(--bs-table-striped-color);--bs-table-bg-type: var(--bs-table-striped-bg)}.table-striped-columns>:not(caption)>tr>:nth-child(even){--bs-table-color-type: var(--bs-table-striped-color);--bs-table-bg-type: var(--bs-table-striped-bg)}.table-active{--bs-table-color-state: var(--bs-table-active-color);--bs-table-bg-state: var(--bs-table-active-bg)}.table-hover>tbody>tr:hover>*{--bs-table-color-state: var(--bs-table-hover-color);--bs-table-bg-state: var(--bs-table-hover-bg)}.table-primary{--bs-table-color: #000;--bs-table-bg: #cfe2ff;--bs-table-border-color: #a6b5cc;--bs-table-striped-bg: #c5d7f2;--bs-table-striped-color: #000;--bs-table-active-bg: #bacbe6;--bs-table-active-color: #000;--bs-table-hover-bg: #bfd1ec;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-secondary{--bs-table-color: #000;--bs-table-bg: #e2e3e5;--bs-table-border-color: #b5b6b7;--bs-table-striped-bg: #d7d8da;--bs-table-striped-color: #000;--bs-table-active-bg: #cbccce;--bs-table-active-color: #000;--bs-table-hover-bg: #d1d2d4;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-success{--bs-table-color: #000;--bs-table-bg: #d1e7dd;--bs-table-border-color: #a7b9b1;--bs-table-striped-bg: #c7dbd2;--bs-table-striped-color: #000;--bs-table-active-bg: #bcd0c7;--bs-table-active-color: #000;--bs-table-hover-bg: #c1d6cc;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-info{--bs-table-color: #000;--bs-table-bg: #cff4fc;--bs-table-border-color: #a6c3ca;--bs-table-striped-bg: #c5e8ef;--bs-table-striped-color: #000;--bs-table-active-bg: #badce3;--bs-table-active-color: #000;--bs-table-hover-bg: #bfe2e9;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-warning{--bs-table-color: #000;--bs-table-bg: #fff3cd;--bs-table-border-color: #ccc2a4;--bs-table-striped-bg: #f2e7c3;--bs-table-striped-color: #000;--bs-table-active-bg: #e6dbb9;--bs-table-active-color: #000;--bs-table-hover-bg: #ece1be;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-danger{--bs-table-color: #000;--bs-table-bg: #f8d7da;--bs-table-border-color: #c6acae;--bs-table-striped-bg: #eccccf;--bs-table-striped-color: #000;--bs-table-active-bg: #dfc2c4;--bs-table-active-color: #000;--bs-table-hover-bg: #e5c7ca;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-light{--bs-table-color: #000;--bs-table-bg: #f8f9fa;--bs-table-border-color: #c6c7c8;--bs-table-striped-bg: #ecedee;--bs-table-striped-color: #000;--bs-table-active-bg: #dfe0e1;--bs-table-active-color: #000;--bs-table-hover-bg: #e5e6e7;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-dark{--bs-table-color: #fff;--bs-table-bg: #212529;--bs-table-border-color: #4d5154;--bs-table-striped-bg: #2c3034;--bs-table-striped-color: #fff;--bs-table-active-bg: #373b3e;--bs-table-active-color: #fff;--bs-table-hover-bg: #323539;--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media (max-width: 575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width: 767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width: 991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width: 1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width: 1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(.375rem + var(--bs-border-width));padding-bottom:calc(.375rem + var(--bs-border-width));margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + var(--bs-border-width));padding-bottom:calc(.5rem + var(--bs-border-width));font-size:1.25rem}.col-form-label-sm{padding-top:calc(.25rem + var(--bs-border-width));padding-bottom:calc(.25rem + var(--bs-border-width));font-size:.875rem}.form-text{margin-top:.25rem;font-size:.875em;color:var(--bs-secondary-color)}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);appearance:none;background-color:var(--bs-body-bg);background-clip:padding-box;border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);transition:border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.form-control{transition:none}}.form-control[type="file"]{overflow:hidden}.form-control[type="file"]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:var(--bs-body-color);background-color:var(--bs-body-bg);border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,0.25)}.form-control::-webkit-date-and-time-value{min-width:85px;height:1.5em;margin:0}.form-control::-webkit-datetime-edit{display:block;padding:0}.form-control::placeholder{color:var(--bs-secondary-color);opacity:1}.form-control:disabled{background-color:var(--bs-secondary-bg);opacity:1}.form-control::file-selector-button{padding:.375rem .75rem;margin:-.375rem -.75rem;margin-inline-end:.75rem;color:var(--bs-body-color);background-color:var(--bs-tertiary-bg);pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:var(--bs-border-width);border-radius:0;transition:color 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:var(--bs-secondary-bg)}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:var(--bs-body-color);background-color:transparent;border:solid transparent;border-width:var(--bs-border-width) 0}.form-control-plaintext:focus{outline:0}.form-control-plaintext.form-control-sm,.form-control-plaintext.form-control-lg{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + .5rem + calc(var(--bs-border-width) * 2));padding:.25rem .5rem;font-size:.875rem;border-radius:var(--bs-border-radius-sm)}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-.25rem -.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + calc(var(--bs-border-width) * 2));padding:.5rem 1rem;font-size:1.25rem;border-radius:var(--bs-border-radius-lg)}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-.5rem -1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + .75rem + calc(var(--bs-border-width) * 2))}textarea.form-control-sm{min-height:calc(1.5em + .5rem + calc(var(--bs-border-width) * 2))}textarea.form-control-lg{min-height:calc(1.5em + 1rem + calc(var(--bs-border-width) * 2))}.form-control-color{width:3rem;height:calc(1.5em + .75rem + calc(var(--bs-border-width) * 2));padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{border:0 !important;border-radius:var(--bs-border-radius)}.form-control-color::-webkit-color-swatch{border:0 !important;border-radius:var(--bs-border-radius)}.form-control-color.form-control-sm{height:calc(1.5em + .5rem + calc(var(--bs-border-width) * 2))}.form-control-color.form-control-lg{height:calc(1.5em + 1rem + calc(var(--bs-border-width) * 2))}.form-select{--bs-form-select-bg-img: url(${___CSS_LOADER_URL_REPLACEMENT_0___});display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);appearance:none;background-color:var(--bs-body-bg);background-image:var(--bs-form-select-bg-img),var(--bs-form-select-bg-icon, none);background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);transition:border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.form-select{transition:none}}.form-select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,0.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{background-color:var(--bs-secondary-bg)}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 var(--bs-body-color)}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem;border-radius:var(--bs-border-radius-sm)}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem;border-radius:var(--bs-border-radius-lg)}[data-bs-theme="dark"] .form-select{--bs-form-select-bg-img: url(${___CSS_LOADER_URL_REPLACEMENT_1___})}.form-check{display:block;min-height:1.5rem;padding-left:1.5em;margin-bottom:.125rem}.form-check .form-check-input{float:left;margin-left:-1.5em}.form-check-reverse{padding-right:1.5em;padding-left:0;text-align:right}.form-check-reverse .form-check-input{float:right;margin-right:-1.5em;margin-left:0}.form-check-input{--bs-form-check-bg: var(--bs-body-bg);flex-shrink:0;width:1em;height:1em;margin-top:.25em;vertical-align:top;appearance:none;background-color:var(--bs-form-check-bg);background-image:var(--bs-form-check-bg-image);background-repeat:no-repeat;background-position:center;background-size:contain;border:var(--bs-border-width) solid var(--bs-border-color);print-color-adjust:exact}.form-check-input[type="checkbox"]{border-radius:.25em}.form-check-input[type="radio"]{border-radius:50%}.form-check-input:active{filter:brightness(90%)}.form-check-input:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,0.25)}.form-check-input:checked{background-color:#0d6efd;border-color:#0d6efd}.form-check-input:checked[type="checkbox"]{--bs-form-check-bg-image: url(${___CSS_LOADER_URL_REPLACEMENT_2___})}.form-check-input:checked[type="radio"]{--bs-form-check-bg-image: url(${___CSS_LOADER_URL_REPLACEMENT_3___})}.form-check-input[type="checkbox"]:indeterminate{background-color:#0d6efd;border-color:#0d6efd;--bs-form-check-bg-image: url(${___CSS_LOADER_URL_REPLACEMENT_4___})}.form-check-input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input[disabled] ~ .form-check-label,.form-check-input:disabled ~ .form-check-label{cursor:default;opacity:.5}.form-switch{padding-left:2.5em}.form-switch .form-check-input{--bs-form-switch-bg: url(${___CSS_LOADER_URL_REPLACEMENT_5___});width:2em;margin-left:-2.5em;background-image:var(--bs-form-switch-bg);background-position:left center;border-radius:2em;transition:background-position 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{--bs-form-switch-bg: url(${___CSS_LOADER_URL_REPLACEMENT_6___})}.form-switch .form-check-input:checked{background-position:right center;--bs-form-switch-bg: url(${___CSS_LOADER_URL_REPLACEMENT_7___})}.form-switch.form-check-reverse{padding-right:2.5em;padding-left:0}.form-switch.form-check-reverse .form-check-input{margin-right:-2.5em;margin-left:0}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.btn-check[disabled]+.btn,.btn-check:disabled+.btn{pointer-events:none;filter:none;opacity:.65}[data-bs-theme="dark"] .form-switch .form-check-input:not(:checked):not(:focus){--bs-form-switch-bg: url(${___CSS_LOADER_URL_REPLACEMENT_8___})}.form-range{width:100%;height:1.5rem;padding:0;appearance:none;background-color:transparent}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,0.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,0.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;appearance:none;background-color:#0d6efd;border:0;border-radius:1rem;transition:background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.form-range::-webkit-slider-thumb{transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#b6d4fe}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:var(--bs-secondary-bg);border-color:transparent;border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;appearance:none;background-color:#0d6efd;border:0;border-radius:1rem;transition:background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.form-range::-moz-range-thumb{transition:none}}.form-range::-moz-range-thumb:active{background-color:#b6d4fe}.form-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:var(--bs-secondary-bg);border-color:transparent;border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:var(--bs-secondary-color)}.form-range:disabled::-moz-range-thumb{background-color:var(--bs-secondary-color)}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-control-plaintext,.form-floating>.form-select{height:calc(3.5rem + calc(var(--bs-border-width) * 2));min-height:calc(3.5rem + calc(var(--bs-border-width) * 2));line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;z-index:2;height:100%;padding:1rem .75rem;overflow:hidden;text-align:start;text-overflow:ellipsis;white-space:nowrap;pointer-events:none;border:var(--bs-border-width) solid transparent;transform-origin:0 0;transition:opacity 0.1s ease-in-out,transform 0.1s ease-in-out}@media (prefers-reduced-motion: reduce){.form-floating>label{transition:none}}.form-floating>.form-control,.form-floating>.form-control-plaintext{padding:1rem .75rem}.form-floating>.form-control::placeholder,.form-floating>.form-control-plaintext::placeholder{color:transparent}.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown),.form-floating>.form-control-plaintext:focus,.form-floating>.form-control-plaintext:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:-webkit-autofill,.form-floating>.form-control-plaintext:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:focus ~ label,.form-floating>.form-control:not(:placeholder-shown) ~ label,.form-floating>.form-control-plaintext ~ label,.form-floating>.form-select ~ label{color:rgba(var(--bs-body-color-rgb), .65);transform:scale(0.85) translateY(-0.5rem) translateX(0.15rem)}.form-floating>.form-control:focus ~ label::after,.form-floating>.form-control:not(:placeholder-shown) ~ label::after,.form-floating>.form-control-plaintext ~ label::after,.form-floating>.form-select ~ label::after{position:absolute;inset:1rem .375rem;z-index:-1;height:1.5em;content:"";background-color:var(--bs-body-bg);border-radius:var(--bs-border-radius)}.form-floating>.form-control:-webkit-autofill ~ label{color:rgba(var(--bs-body-color-rgb), .65);transform:scale(0.85) translateY(-0.5rem) translateX(0.15rem)}.form-floating>.form-control-plaintext ~ label{border-width:var(--bs-border-width) 0}.form-floating>:disabled ~ label,.form-floating>.form-control:disabled ~ label{color:#6c757d}.form-floating>:disabled ~ label::after,.form-floating>.form-control:disabled ~ label::after{background-color:var(--bs-secondary-bg)}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-select,.input-group>.form-floating{position:relative;flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-select:focus,.input-group>.form-floating:focus-within{z-index:5}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:5}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);text-align:center;white-space:nowrap;background-color:var(--bs-tertiary-bg);border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius)}.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text,.input-group-lg>.btn{padding:.5rem 1rem;font-size:1.25rem;border-radius:var(--bs-border-radius-lg)}.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text,.input-group-sm>.btn{padding:.25rem .5rem;font-size:.875rem;border-radius:var(--bs-border-radius-sm)}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-control,.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-select{border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-control,.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-select{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:calc(var(--bs-border-width) * -1);border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.form-floating:not(:first-child)>.form-control,.input-group>.form-floating:not(:first-child)>.form-select{border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:var(--bs-form-valid-color)}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:var(--bs-success);border-radius:var(--bs-border-radius)}.was-validated :valid ~ .valid-feedback,.was-validated :valid ~ .valid-tooltip,.is-valid ~ .valid-feedback,.is-valid ~ .valid-tooltip{display:block}.was-validated .form-control:valid,.form-control.is-valid{border-color:var(--bs-form-valid-border-color);padding-right:calc(1.5em + .75rem);background-image:url(${___CSS_LOADER_URL_REPLACEMENT_9___});background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.was-validated .form-control:valid:focus,.form-control.is-valid:focus{border-color:var(--bs-form-valid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb), 0.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.was-validated .form-select:valid,.form-select.is-valid{border-color:var(--bs-form-valid-border-color)}.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"],.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"]{--bs-form-select-bg-icon: url(${___CSS_LOADER_URL_REPLACEMENT_9___});padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.was-validated .form-select:valid:focus,.form-select.is-valid:focus{border-color:var(--bs-form-valid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb), 0.25)}.was-validated .form-control-color:valid,.form-control-color.is-valid{width:calc(3rem + calc(1.5em + .75rem))}.was-validated .form-check-input:valid,.form-check-input.is-valid{border-color:var(--bs-form-valid-border-color)}.was-validated .form-check-input:valid:checked,.form-check-input.is-valid:checked{background-color:var(--bs-form-valid-color)}.was-validated .form-check-input:valid:focus,.form-check-input.is-valid:focus{box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb), 0.25)}.was-validated .form-check-input:valid ~ .form-check-label,.form-check-input.is-valid ~ .form-check-label{color:var(--bs-form-valid-color)}.form-check-inline .form-check-input ~ .valid-feedback{margin-left:.5em}.was-validated .input-group>.form-control:not(:focus):valid,.input-group>.form-control:not(:focus).is-valid,.was-validated .input-group>.form-select:not(:focus):valid,.input-group>.form-select:not(:focus).is-valid,.was-validated .input-group>.form-floating:not(:focus-within):valid,.input-group>.form-floating:not(:focus-within).is-valid{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:var(--bs-form-invalid-color)}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:var(--bs-danger);border-radius:var(--bs-border-radius)}.was-validated :invalid ~ .invalid-feedback,.was-validated :invalid ~ .invalid-tooltip,.is-invalid ~ .invalid-feedback,.is-invalid ~ .invalid-tooltip{display:block}.was-validated .form-control:invalid,.form-control.is-invalid{border-color:var(--bs-form-invalid-border-color);padding-right:calc(1.5em + .75rem);background-image:url(${___CSS_LOADER_URL_REPLACEMENT_10___});background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.was-validated .form-control:invalid:focus,.form-control.is-invalid:focus{border-color:var(--bs-form-invalid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb), 0.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.was-validated .form-select:invalid,.form-select.is-invalid{border-color:var(--bs-form-invalid-border-color)}.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"],.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"]{--bs-form-select-bg-icon: url(${___CSS_LOADER_URL_REPLACEMENT_10___});padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.was-validated .form-select:invalid:focus,.form-select.is-invalid:focus{border-color:var(--bs-form-invalid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb), 0.25)}.was-validated .form-control-color:invalid,.form-control-color.is-invalid{width:calc(3rem + calc(1.5em + .75rem))}.was-validated .form-check-input:invalid,.form-check-input.is-invalid{border-color:var(--bs-form-invalid-border-color)}.was-validated .form-check-input:invalid:checked,.form-check-input.is-invalid:checked{background-color:var(--bs-form-invalid-color)}.was-validated .form-check-input:invalid:focus,.form-check-input.is-invalid:focus{box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb), 0.25)}.was-validated .form-check-input:invalid ~ .form-check-label,.form-check-input.is-invalid ~ .form-check-label{color:var(--bs-form-invalid-color)}.form-check-inline .form-check-input ~ .invalid-feedback{margin-left:.5em}.was-validated .input-group>.form-control:not(:focus):invalid,.input-group>.form-control:not(:focus).is-invalid,.was-validated .input-group>.form-select:not(:focus):invalid,.input-group>.form-select:not(:focus).is-invalid,.was-validated .input-group>.form-floating:not(:focus-within):invalid,.input-group>.form-floating:not(:focus-within).is-invalid{z-index:4}.btn{--bs-btn-padding-x: .75rem;--bs-btn-padding-y: .375rem;--bs-btn-font-family: ;--bs-btn-font-size:1rem;--bs-btn-font-weight: 400;--bs-btn-line-height: 1.5;--bs-btn-color: var(--bs-body-color);--bs-btn-bg: transparent;--bs-btn-border-width: var(--bs-border-width);--bs-btn-border-color: transparent;--bs-btn-border-radius: var(--bs-border-radius);--bs-btn-hover-border-color: transparent;--bs-btn-box-shadow: inset 0 1px 0 rgba(255,255,255,0.15),0 1px 1px rgba(0,0,0,0.075);--bs-btn-disabled-opacity: .65;--bs-btn-focus-box-shadow: 0 0 0 .25rem rgba(var(--bs-btn-focus-shadow-rgb), .5);display:inline-block;padding:var(--bs-btn-padding-y) var(--bs-btn-padding-x);font-family:var(--bs-btn-font-family);font-size:var(--bs-btn-font-size);font-weight:var(--bs-btn-font-weight);line-height:var(--bs-btn-line-height);color:var(--bs-btn-color);text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;user-select:none;border:var(--bs-btn-border-width) solid var(--bs-btn-border-color);border-radius:var(--bs-btn-border-radius);background-color:var(--bs-btn-bg);transition:color 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.btn{transition:none}}.btn:hover{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color)}.btn-check+.btn:hover{color:var(--bs-btn-color);background-color:var(--bs-btn-bg);border-color:var(--bs-btn-border-color)}.btn:focus-visible{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:focus-visible+.btn{border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:checked+.btn,:not(.btn-check)+.btn:active,.btn:first-child:active,.btn.active,.btn.show{color:var(--bs-btn-active-color);background-color:var(--bs-btn-active-bg);border-color:var(--bs-btn-active-border-color)}.btn-check:checked+.btn:focus-visible,:not(.btn-check)+.btn:active:focus-visible,.btn:first-child:active:focus-visible,.btn.active:focus-visible,.btn.show:focus-visible{box-shadow:var(--bs-btn-focus-box-shadow)}.btn:disabled,.btn.disabled,fieldset:disabled .btn{color:var(--bs-btn-disabled-color);pointer-events:none;background-color:var(--bs-btn-disabled-bg);border-color:var(--bs-btn-disabled-border-color);opacity:var(--bs-btn-disabled-opacity)}.btn-primary{--bs-btn-color: #fff;--bs-btn-bg: #3f51b5;--bs-btn-border-color: #3f51b5;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #36459a;--bs-btn-hover-border-color: #324191;--bs-btn-focus-shadow-rgb: 92,107,192;--bs-btn-active-color: #fff;--bs-btn-active-bg: #324191;--bs-btn-active-border-color: #2f3d88;--bs-btn-active-shadow: inset 0 3px 5px rgba(0,0,0,0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #3f51b5;--bs-btn-disabled-border-color: #3f51b5}.btn-outline-primary{--bs-btn-color: #3f51b5;--bs-btn-border-color: #3f51b5;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #3f51b5;--bs-btn-hover-border-color: #3f51b5;--bs-btn-focus-shadow-rgb: 63,81,181;--bs-btn-active-color: #fff;--bs-btn-active-bg: #3f51b5;--bs-btn-active-border-color: #3f51b5;--bs-btn-active-shadow: inset 0 3px 5px rgba(0,0,0,0.125);--bs-btn-disabled-color: #3f51b5;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #3f51b5;--bs-gradient: none}.btn-link{--bs-btn-font-weight: 400;--bs-btn-color: var(--bs-link-color);--bs-btn-bg: transparent;--bs-btn-border-color: transparent;--bs-btn-hover-color: var(--bs-link-hover-color);--bs-btn-hover-border-color: transparent;--bs-btn-active-color: var(--bs-link-hover-color);--bs-btn-active-border-color: transparent;--bs-btn-disabled-color: #6c757d;--bs-btn-disabled-border-color: transparent;--bs-btn-box-shadow: 0 0 0 #000;--bs-btn-focus-shadow-rgb: 49,132,253;text-decoration:underline}.btn-link:focus-visible{color:var(--bs-btn-color)}.btn-link:hover{color:var(--bs-btn-hover-color)}.btn-lg,.btn-group-lg>.btn{--bs-btn-padding-y: .5rem;--bs-btn-padding-x: 1rem;--bs-btn-font-size:1.25rem;--bs-btn-border-radius: var(--bs-border-radius-lg)}.btn-sm,.btn-group-sm>.btn{--bs-btn-padding-y: .25rem;--bs-btn-padding-x: .5rem;--bs-btn-font-size:.875rem;--bs-btn-border-radius: var(--bs-border-radius-sm)}.fade{transition:opacity 0.15s linear}@media (prefers-reduced-motion: reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height 0.35s ease}@media (prefers-reduced-motion: reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width 0.35s ease}@media (prefers-reduced-motion: reduce){.collapsing.collapse-horizontal{transition:none}}.dropup,.dropend,.dropdown,.dropstart,.dropup-center,.dropdown-center{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{--bs-dropdown-zindex: 1000;--bs-dropdown-min-width: 10rem;--bs-dropdown-padding-x: 0;--bs-dropdown-padding-y: .5rem;--bs-dropdown-spacer: .125rem;--bs-dropdown-font-size:1rem;--bs-dropdown-color: var(--bs-body-color);--bs-dropdown-bg: var(--bs-body-bg);--bs-dropdown-border-color: var(--bs-border-color-translucent);--bs-dropdown-border-radius: var(--bs-border-radius);--bs-dropdown-border-width: var(--bs-border-width);--bs-dropdown-inner-border-radius: calc(var(--bs-border-radius) - var(--bs-border-width));--bs-dropdown-divider-bg: var(--bs-border-color-translucent);--bs-dropdown-divider-margin-y: .5rem;--bs-dropdown-box-shadow: var(--bs-box-shadow);--bs-dropdown-link-color: var(--bs-body-color);--bs-dropdown-link-hover-color: var(--bs-body-color);--bs-dropdown-link-hover-bg: var(--bs-tertiary-bg);--bs-dropdown-link-active-color: #fff;--bs-dropdown-link-active-bg: #0d6efd;--bs-dropdown-link-disabled-color: var(--bs-tertiary-color);--bs-dropdown-item-padding-x: 1rem;--bs-dropdown-item-padding-y: .25rem;--bs-dropdown-header-color: #6c757d;--bs-dropdown-header-padding-x: 1rem;--bs-dropdown-header-padding-y: .5rem;position:absolute;z-index:var(--bs-dropdown-zindex);display:none;min-width:var(--bs-dropdown-min-width);padding:var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x);margin:0;font-size:var(--bs-dropdown-font-size);color:var(--bs-dropdown-color);text-align:left;list-style:none;background-color:var(--bs-dropdown-bg);background-clip:padding-box;border:var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color);border-radius:var(--bs-dropdown-border-radius)}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:var(--bs-dropdown-spacer)}.dropdown-menu-start{--bs-position: start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position: end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media (min-width: 576px){.dropdown-menu-sm-start{--bs-position: start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position: end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media (min-width: 768px){.dropdown-menu-md-start{--bs-position: start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position: end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media (min-width: 992px){.dropdown-menu-lg-start{--bs-position: start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position: end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media (min-width: 1200px){.dropdown-menu-xl-start{--bs-position: start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position: end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media (min-width: 1400px){.dropdown-menu-xxl-start{--bs-position: start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position: end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:var(--bs-dropdown-spacer)}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:var(--bs-dropdown-spacer)}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:var(--bs-dropdown-spacer)}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:var(--bs-dropdown-divider-margin-y) 0;overflow:hidden;border-top:1px solid var(--bs-dropdown-divider-bg);opacity:1}.dropdown-item{display:block;width:100%;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);clear:both;font-weight:400;color:var(--bs-dropdown-link-color);text-align:inherit;text-decoration:none;white-space:nowrap;background-color:transparent;border:0;border-radius:var(--bs-dropdown-item-border-radius, 0)}.dropdown-item:hover,.dropdown-item:focus{color:var(--bs-dropdown-link-hover-color);background-color:var(--bs-dropdown-link-hover-bg)}.dropdown-item.active,.dropdown-item:active{color:var(--bs-dropdown-link-active-color);text-decoration:none;background-color:var(--bs-dropdown-link-active-bg)}.dropdown-item.disabled,.dropdown-item:disabled{color:var(--bs-dropdown-link-disabled-color);pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x);margin-bottom:0;font-size:.875rem;color:var(--bs-dropdown-header-color);white-space:nowrap}.dropdown-item-text{display:block;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);color:var(--bs-dropdown-link-color)}.dropdown-menu-dark{--bs-dropdown-color: #dee2e6;--bs-dropdown-bg: #343a40;--bs-dropdown-border-color: var(--bs-border-color-translucent);--bs-dropdown-box-shadow: ;--bs-dropdown-link-color: #dee2e6;--bs-dropdown-link-hover-color: #fff;--bs-dropdown-divider-bg: var(--bs-border-color-translucent);--bs-dropdown-link-hover-bg: rgba(255,255,255,0.15);--bs-dropdown-link-active-color: #fff;--bs-dropdown-link-active-bg: #0d6efd;--bs-dropdown-link-disabled-color: #adb5bd;--bs-dropdown-header-color: #adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;flex:1 1 auto}.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn:hover,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group{border-radius:var(--bs-border-radius)}.btn-group>:not(.btn-check:first-child)+.btn,.btn-group>.btn-group:not(:first-child){margin-left:calc(var(--bs-border-width) * -1)}.btn-group>.btn:not(:last-child):not(.dropdown-toggle),.btn-group>.btn.dropdown-toggle-split:first-child,.btn-group>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn,.btn-group>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-sm+.dropdown-toggle-split,.btn-group-sm>.btn+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-lg+.dropdown-toggle-split,.btn-group-lg>.btn+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child){margin-top:calc(var(--bs-border-width) * -1)}.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle),.btn-group-vertical>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn ~ .btn,.btn-group-vertical>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{--bs-nav-link-padding-x: 1rem;--bs-nav-link-padding-y: .5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color: var(--bs-link-color);--bs-nav-link-hover-color: var(--bs-link-hover-color);--bs-nav-link-disabled-color: var(--bs-secondary-color);display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);font-size:var(--bs-nav-link-font-size);font-weight:var(--bs-nav-link-font-weight);color:var(--bs-nav-link-color);text-decoration:none;background:none;border:0;transition:color 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.nav-link{transition:none}}.nav-link:hover,.nav-link:focus{color:var(--bs-nav-link-hover-color)}.nav-link:focus-visible{outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,0.25)}.nav-link.disabled,.nav-link:disabled{color:var(--bs-nav-link-disabled-color);pointer-events:none;cursor:default}.nav-tabs{--bs-nav-tabs-border-width: var(--bs-border-width);--bs-nav-tabs-border-color: var(--bs-border-color);--bs-nav-tabs-border-radius: var(--bs-border-radius);--bs-nav-tabs-link-hover-border-color: var(--bs-secondary-bg) var(--bs-secondary-bg) var(--bs-border-color);--bs-nav-tabs-link-active-color: var(--bs-emphasis-color);--bs-nav-tabs-link-active-bg: var(--bs-body-bg);--bs-nav-tabs-link-active-border-color: var(--bs-border-color) var(--bs-border-color) var(--bs-body-bg);border-bottom:var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color)}.nav-tabs .nav-link{margin-bottom:calc(-1 * var(--bs-nav-tabs-border-width));border:var(--bs-nav-tabs-border-width) solid transparent;border-top-left-radius:var(--bs-nav-tabs-border-radius);border-top-right-radius:var(--bs-nav-tabs-border-radius)}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{isolation:isolate;border-color:var(--bs-nav-tabs-link-hover-border-color)}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:var(--bs-nav-tabs-link-active-color);background-color:var(--bs-nav-tabs-link-active-bg);border-color:var(--bs-nav-tabs-link-active-border-color)}.nav-tabs .dropdown-menu{margin-top:calc(-1 * var(--bs-nav-tabs-border-width));border-top-left-radius:0;border-top-right-radius:0}.nav-pills{--bs-nav-pills-border-radius: var(--bs-border-radius);--bs-nav-pills-link-active-color: #fff;--bs-nav-pills-link-active-bg: #0d6efd}.nav-pills .nav-link{border-radius:var(--bs-nav-pills-border-radius)}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:var(--bs-nav-pills-link-active-color);background-color:var(--bs-nav-pills-link-active-bg)}.nav-underline{--bs-nav-underline-gap: 1rem;--bs-nav-underline-border-width: .125rem;--bs-nav-underline-link-active-color: var(--bs-emphasis-color);gap:var(--bs-nav-underline-gap)}.nav-underline .nav-link{padding-right:0;padding-left:0;border-bottom:var(--bs-nav-underline-border-width) solid transparent}.nav-underline .nav-link:hover,.nav-underline .nav-link:focus{border-bottom-color:currentcolor}.nav-underline .nav-link.active,.nav-underline .show>.nav-link{font-weight:700;color:var(--bs-nav-underline-link-active-color);border-bottom-color:currentcolor}.nav-fill>.nav-link,.nav-fill .nav-item{flex:1 1 auto;text-align:center}.nav-justified>.nav-link,.nav-justified .nav-item{flex-basis:0;flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{--bs-navbar-padding-x: 0;--bs-navbar-padding-y: .5rem;--bs-navbar-color: rgba(var(--bs-emphasis-color-rgb), 0.65);--bs-navbar-hover-color: rgba(var(--bs-emphasis-color-rgb), 0.8);--bs-navbar-disabled-color: rgba(var(--bs-emphasis-color-rgb), 0.3);--bs-navbar-active-color: rgba(var(--bs-emphasis-color-rgb), 1);--bs-navbar-brand-padding-y: .3125rem;--bs-navbar-brand-margin-end: 1rem;--bs-navbar-brand-font-size: 1.25rem;--bs-navbar-brand-color: rgba(var(--bs-emphasis-color-rgb), 1);--bs-navbar-brand-hover-color: rgba(var(--bs-emphasis-color-rgb), 1);--bs-navbar-nav-link-padding-x: .5rem;--bs-navbar-toggler-padding-y: .25rem;--bs-navbar-toggler-padding-x: .75rem;--bs-navbar-toggler-font-size: 1.25rem;--bs-navbar-toggler-icon-bg: url(${___CSS_LOADER_URL_REPLACEMENT_11___});--bs-navbar-toggler-border-color: rgba(var(--bs-emphasis-color-rgb), 0.15);--bs-navbar-toggler-border-radius: var(--bs-border-radius);--bs-navbar-toggler-focus-width: .25rem;--bs-navbar-toggler-transition: box-shadow 0.15s ease-in-out;position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding:var(--bs-navbar-padding-y) var(--bs-navbar-padding-x)}.navbar>.container,.navbar>.container-fluid,.navbar>.container-sm,.navbar>.container-md,.navbar>.container-lg,.navbar>.container-xl,.navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-brand{padding-top:var(--bs-navbar-brand-padding-y);padding-bottom:var(--bs-navbar-brand-padding-y);margin-right:var(--bs-navbar-brand-margin-end);font-size:var(--bs-navbar-brand-font-size);color:var(--bs-navbar-brand-color);text-decoration:none;white-space:nowrap}.navbar-brand:hover,.navbar-brand:focus{color:var(--bs-navbar-brand-hover-color)}.navbar-nav{--bs-nav-link-padding-x: 0;--bs-nav-link-padding-y: .5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color: var(--bs-navbar-color);--bs-nav-link-hover-color: var(--bs-navbar-hover-color);--bs-nav-link-disabled-color: var(--bs-navbar-disabled-color);display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link.active,.navbar-nav .nav-link.show{color:var(--bs-navbar-active-color)}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-navbar-color)}.navbar-text a,.navbar-text a:hover,.navbar-text a:focus{color:var(--bs-navbar-active-color)}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x);font-size:var(--bs-navbar-toggler-font-size);line-height:1;color:var(--bs-navbar-color);background-color:transparent;border:var(--bs-border-width) solid var(--bs-navbar-toggler-border-color);border-radius:var(--bs-navbar-toggler-border-radius);transition:var(--bs-navbar-toggler-transition)}@media (prefers-reduced-motion: reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 var(--bs-navbar-toggler-focus-width)}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-image:var(--bs-navbar-toggler-icon-bg);background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height, 75vh);overflow-y:auto}@media (min-width: 576px){.navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:transparent !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-sm .offcanvas .offcanvas-header{display:none}.navbar-expand-sm .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width: 768px){.navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:transparent !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-md .offcanvas .offcanvas-header{display:none}.navbar-expand-md .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width: 992px){.navbar-expand-lg{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:transparent !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-lg .offcanvas .offcanvas-header{display:none}.navbar-expand-lg .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width: 1200px){.navbar-expand-xl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:transparent !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-xl .offcanvas .offcanvas-header{display:none}.navbar-expand-xl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width: 1400px){.navbar-expand-xxl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:transparent !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-xxl .offcanvas .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:transparent !important;border:0 !important;transform:none !important;transition:none}.navbar-expand .offcanvas .offcanvas-header{display:none}.navbar-expand .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}.navbar-dark,.navbar[data-bs-theme="dark"]{--bs-navbar-color: rgba(255,255,255,0.55);--bs-navbar-hover-color: rgba(255,255,255,0.75);--bs-navbar-disabled-color: rgba(255,255,255,0.25);--bs-navbar-active-color: #fff;--bs-navbar-brand-color: #fff;--bs-navbar-brand-hover-color: #fff;--bs-navbar-toggler-border-color: rgba(255,255,255,0.1);--bs-navbar-toggler-icon-bg: url(${___CSS_LOADER_URL_REPLACEMENT_12___})}[data-bs-theme="dark"] .navbar-toggler-icon{--bs-navbar-toggler-icon-bg: url(${___CSS_LOADER_URL_REPLACEMENT_12___})}.card{--bs-card-spacer-y: 1rem;--bs-card-spacer-x: 1rem;--bs-card-title-spacer-y: .5rem;--bs-card-title-color: ;--bs-card-subtitle-color: ;--bs-card-border-width: var(--bs-border-width);--bs-card-border-color: var(--bs-border-color-translucent);--bs-card-border-radius: var(--bs-border-radius);--bs-card-box-shadow: ;--bs-card-inner-border-radius: calc(var(--bs-border-radius) - (var(--bs-border-width)));--bs-card-cap-padding-y: .5rem;--bs-card-cap-padding-x: 1rem;--bs-card-cap-bg: rgba(var(--bs-body-color-rgb), 0.03);--bs-card-cap-color: ;--bs-card-height: ;--bs-card-color: ;--bs-card-bg: var(--bs-body-bg);--bs-card-img-overlay-padding: 1rem;--bs-card-group-margin: .75rem;position:relative;display:flex;flex-direction:column;min-width:0;height:var(--bs-card-height);color:var(--bs-body-color);word-wrap:break-word;background-color:var(--bs-card-bg);background-clip:border-box;border:var(--bs-card-border-width) solid var(--bs-card-border-color);border-radius:var(--bs-card-border-radius)}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;padding:var(--bs-card-spacer-y) var(--bs-card-spacer-x);color:var(--bs-card-color)}.card-title{margin-bottom:var(--bs-card-title-spacer-y);color:var(--bs-card-title-color)}.card-subtitle{margin-top:calc(-.5 * var(--bs-card-title-spacer-y));margin-bottom:0;color:var(--bs-card-subtitle-color)}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:var(--bs-card-spacer-x)}.card-header{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);margin-bottom:0;color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-bottom:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-header:first-child{border-radius:var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) 0 0}.card-footer{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-top:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-footer:last-child{border-radius:0 0 var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius)}.card-header-tabs{margin-right:calc(-.5 * var(--bs-card-cap-padding-x));margin-bottom:calc(-1 * var(--bs-card-cap-padding-y));margin-left:calc(-.5 * var(--bs-card-cap-padding-x));border-bottom:0}.card-header-tabs .nav-link.active{background-color:var(--bs-card-bg);border-bottom-color:var(--bs-card-bg)}.card-header-pills{margin-right:calc(-.5 * var(--bs-card-cap-padding-x));margin-left:calc(-.5 * var(--bs-card-cap-padding-x))}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:var(--bs-card-img-overlay-padding);border-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-top,.card-img-bottom{width:100%}.card-img,.card-img-top{border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-bottom{border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card-group>.card{margin-bottom:var(--bs-card-group-margin)}@media (min-width: 576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-img-top,.card-group>.card:not(:last-child) .card-header{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-img-bottom,.card-group>.card:not(:last-child) .card-footer{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-img-top,.card-group>.card:not(:first-child) .card-header{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-img-bottom,.card-group>.card:not(:first-child) .card-footer{border-bottom-left-radius:0}}.accordion{--bs-accordion-color: var(--bs-body-color);--bs-accordion-bg: var(--bs-body-bg);--bs-accordion-transition: color 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out,border-radius 0.15s ease;--bs-accordion-border-color: var(--bs-border-color);--bs-accordion-border-width: var(--bs-border-width);--bs-accordion-border-radius: var(--bs-border-radius);--bs-accordion-inner-border-radius: calc(var(--bs-border-radius) - (var(--bs-border-width)));--bs-accordion-btn-padding-x: 1.25rem;--bs-accordion-btn-padding-y: 1rem;--bs-accordion-btn-color: var(--bs-body-color);--bs-accordion-btn-bg: var(--bs-accordion-bg);--bs-accordion-btn-icon: url(${___CSS_LOADER_URL_REPLACEMENT_13___});--bs-accordion-btn-icon-width: 1.25rem;--bs-accordion-btn-icon-transform: rotate(-180deg);--bs-accordion-btn-icon-transition: transform 0.2s ease-in-out;--bs-accordion-btn-active-icon: url(${___CSS_LOADER_URL_REPLACEMENT_14___});--bs-accordion-btn-focus-border-color: #86b7fe;--bs-accordion-btn-focus-box-shadow: 0 0 0 .25rem rgba(13,110,253,0.25);--bs-accordion-body-padding-x: 1.25rem;--bs-accordion-body-padding-y: 1rem;--bs-accordion-active-color: var(--bs-primary-text-emphasis);--bs-accordion-active-bg: var(--bs-primary-bg-subtle)}.accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x);font-size:1rem;color:var(--bs-accordion-btn-color);text-align:left;background-color:var(--bs-accordion-btn-bg);border:0;border-radius:0;overflow-anchor:none;transition:var(--bs-accordion-transition)}@media (prefers-reduced-motion: reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:var(--bs-accordion-active-color);background-color:var(--bs-accordion-active-bg);box-shadow:inset 0 calc(-1 * var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color)}.accordion-button:not(.collapsed)::after{background-image:var(--bs-accordion-btn-active-icon);transform:var(--bs-accordion-btn-icon-transform)}.accordion-button::after{flex-shrink:0;width:var(--bs-accordion-btn-icon-width);height:var(--bs-accordion-btn-icon-width);margin-left:auto;content:"";background-image:var(--bs-accordion-btn-icon);background-repeat:no-repeat;background-size:var(--bs-accordion-btn-icon-width);transition:var(--bs-accordion-btn-icon-transition)}@media (prefers-reduced-motion: reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:var(--bs-accordion-btn-focus-border-color);outline:0;box-shadow:var(--bs-accordion-btn-focus-box-shadow)}.accordion-header{margin-bottom:0}.accordion-item{color:var(--bs-accordion-color);background-color:var(--bs-accordion-bg);border:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.accordion-item:first-of-type{border-top-left-radius:var(--bs-accordion-border-radius);border-top-right-radius:var(--bs-accordion-border-radius)}.accordion-item:first-of-type .accordion-button{border-top-left-radius:var(--bs-accordion-inner-border-radius);border-top-right-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-item:last-of-type .accordion-button.collapsed{border-bottom-right-radius:var(--bs-accordion-inner-border-radius);border-bottom-left-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:last-of-type .accordion-collapse{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-body{padding:var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x)}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item{border-right:0;border-left:0;border-radius:0}.accordion-flush .accordion-item:first-child{border-top:0}.accordion-flush .accordion-item:last-child{border-bottom:0}.accordion-flush .accordion-item .accordion-button,.accordion-flush .accordion-item .accordion-button.collapsed{border-radius:0}[data-bs-theme="dark"] .accordion-button::after{--bs-accordion-btn-icon: url(${___CSS_LOADER_URL_REPLACEMENT_15___});--bs-accordion-btn-active-icon: url(${___CSS_LOADER_URL_REPLACEMENT_15___})}.breadcrumb{--bs-breadcrumb-padding-x: 0;--bs-breadcrumb-padding-y: 0;--bs-breadcrumb-margin-bottom: 1rem;--bs-breadcrumb-bg: ;--bs-breadcrumb-border-radius: ;--bs-breadcrumb-divider-color: var(--bs-secondary-color);--bs-breadcrumb-item-padding-x: .5rem;--bs-breadcrumb-item-active-color: var(--bs-secondary-color);display:flex;flex-wrap:wrap;padding:var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x);margin-bottom:var(--bs-breadcrumb-margin-bottom);font-size:var(--bs-breadcrumb-font-size);list-style:none;background-color:var(--bs-breadcrumb-bg);border-radius:var(--bs-breadcrumb-border-radius)}.breadcrumb-item+.breadcrumb-item{padding-left:var(--bs-breadcrumb-item-padding-x)}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:var(--bs-breadcrumb-item-padding-x);color:var(--bs-breadcrumb-divider-color);content:var(--bs-breadcrumb-divider, "/") /* rtl: var(--bs-breadcrumb-divider, "/") */}.breadcrumb-item.active{color:var(--bs-breadcrumb-item-active-color)}.pagination{--bs-pagination-padding-x: .75rem;--bs-pagination-padding-y: .375rem;--bs-pagination-font-size:1rem;--bs-pagination-color: var(--bs-link-color);--bs-pagination-bg: var(--bs-body-bg);--bs-pagination-border-width: var(--bs-border-width);--bs-pagination-border-color: var(--bs-border-color);--bs-pagination-border-radius: var(--bs-border-radius);--bs-pagination-hover-color: var(--bs-link-hover-color);--bs-pagination-hover-bg: var(--bs-tertiary-bg);--bs-pagination-hover-border-color: var(--bs-border-color);--bs-pagination-focus-color: var(--bs-link-hover-color);--bs-pagination-focus-bg: var(--bs-secondary-bg);--bs-pagination-focus-box-shadow: 0 0 0 .25rem rgba(13,110,253,0.25);--bs-pagination-active-color: #fff;--bs-pagination-active-bg: #0d6efd;--bs-pagination-active-border-color: #0d6efd;--bs-pagination-disabled-color: var(--bs-secondary-color);--bs-pagination-disabled-bg: var(--bs-secondary-bg);--bs-pagination-disabled-border-color: var(--bs-border-color);display:flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;padding:var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);font-size:var(--bs-pagination-font-size);color:var(--bs-pagination-color);text-decoration:none;background-color:var(--bs-pagination-bg);border:var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);transition:color 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:var(--bs-pagination-hover-color);background-color:var(--bs-pagination-hover-bg);border-color:var(--bs-pagination-hover-border-color)}.page-link:focus{z-index:3;color:var(--bs-pagination-focus-color);background-color:var(--bs-pagination-focus-bg);outline:0;box-shadow:var(--bs-pagination-focus-box-shadow)}.page-link.active,.active>.page-link{z-index:3;color:var(--bs-pagination-active-color);background-color:var(--bs-pagination-active-bg);border-color:var(--bs-pagination-active-border-color)}.page-link.disabled,.disabled>.page-link{color:var(--bs-pagination-disabled-color);pointer-events:none;background-color:var(--bs-pagination-disabled-bg);border-color:var(--bs-pagination-disabled-border-color)}.page-item:not(:first-child) .page-link{margin-left:calc(var(--bs-border-width) * -1)}.page-item:first-child .page-link{border-top-left-radius:var(--bs-pagination-border-radius);border-bottom-left-radius:var(--bs-pagination-border-radius)}.page-item:last-child .page-link{border-top-right-radius:var(--bs-pagination-border-radius);border-bottom-right-radius:var(--bs-pagination-border-radius)}.pagination-lg{--bs-pagination-padding-x: 1.5rem;--bs-pagination-padding-y: .75rem;--bs-pagination-font-size:1.25rem;--bs-pagination-border-radius: var(--bs-border-radius-lg)}.pagination-sm{--bs-pagination-padding-x: .5rem;--bs-pagination-padding-y: .25rem;--bs-pagination-font-size:.875rem;--bs-pagination-border-radius: var(--bs-border-radius-sm)}.badge{--bs-badge-padding-x: .65em;--bs-badge-padding-y: .35em;--bs-badge-font-size:.75em;--bs-badge-font-weight: 700;--bs-badge-color: #fff;--bs-badge-border-radius: var(--bs-border-radius);display:inline-block;padding:var(--bs-badge-padding-y) var(--bs-badge-padding-x);font-size:var(--bs-badge-font-size);font-weight:var(--bs-badge-font-weight);line-height:1;color:var(--bs-badge-color);text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:var(--bs-badge-border-radius)}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{--bs-alert-bg: transparent;--bs-alert-padding-x: 1rem;--bs-alert-padding-y: 1rem;--bs-alert-margin-bottom: 1rem;--bs-alert-color: inherit;--bs-alert-border-color: transparent;--bs-alert-border: var(--bs-border-width) solid var(--bs-alert-border-color);--bs-alert-border-radius: var(--bs-border-radius);--bs-alert-link-color: inherit;position:relative;padding:var(--bs-alert-padding-y) var(--bs-alert-padding-x);margin-bottom:var(--bs-alert-margin-bottom);color:var(--bs-alert-color);background-color:var(--bs-alert-bg);border:var(--bs-alert-border);border-radius:var(--bs-alert-border-radius)}.alert-heading{color:inherit}.alert-link{font-weight:700;color:var(--bs-alert-link-color)}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-primary{--bs-alert-color: var(--bs-primary-text-emphasis);--bs-alert-bg: var(--bs-primary-bg-subtle);--bs-alert-border-color: var(--bs-primary-border-subtle);--bs-alert-link-color: var(--bs-primary-text-emphasis)}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress,.progress-stacked{--bs-progress-height: 1rem;--bs-progress-font-size:.75rem;--bs-progress-bg: var(--bs-secondary-bg);--bs-progress-border-radius: var(--bs-border-radius);--bs-progress-box-shadow: var(--bs-box-shadow-inset);--bs-progress-bar-color: #fff;--bs-progress-bar-bg: #0d6efd;--bs-progress-bar-transition: width 0.6s ease;display:flex;height:var(--bs-progress-height);overflow:hidden;font-size:var(--bs-progress-font-size);background-color:var(--bs-progress-bg);border-radius:var(--bs-progress-border-radius)}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:var(--bs-progress-bar-color);text-align:center;white-space:nowrap;background-color:var(--bs-progress-bar-bg);transition:var(--bs-progress-bar-transition)}@media (prefers-reduced-motion: reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-size:var(--bs-progress-height) var(--bs-progress-height)}.progress-stacked>.progress{overflow:visible}.progress-stacked>.progress>.progress-bar{width:100%}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion: reduce){.progress-bar-animated{animation:none}}.list-group{--bs-list-group-color: var(--bs-body-color);--bs-list-group-bg: var(--bs-body-bg);--bs-list-group-border-color: var(--bs-border-color);--bs-list-group-border-width: var(--bs-border-width);--bs-list-group-border-radius: var(--bs-border-radius);--bs-list-group-item-padding-x: 1rem;--bs-list-group-item-padding-y: .5rem;--bs-list-group-action-color: var(--bs-secondary-color);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-tertiary-bg);--bs-list-group-action-active-color: var(--bs-body-color);--bs-list-group-action-active-bg: var(--bs-secondary-bg);--bs-list-group-disabled-color: var(--bs-secondary-color);--bs-list-group-disabled-bg: var(--bs-body-bg);--bs-list-group-active-color: #fff;--bs-list-group-active-bg: #0d6efd;--bs-list-group-active-border-color: #0d6efd;display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:var(--bs-list-group-border-radius)}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>.list-group-item::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:var(--bs-list-group-action-color);text-align:inherit}.list-group-item-action:hover,.list-group-item-action:focus{z-index:1;color:var(--bs-list-group-action-hover-color);text-decoration:none;background-color:var(--bs-list-group-action-hover-bg)}.list-group-item-action:active{color:var(--bs-list-group-action-active-color);background-color:var(--bs-list-group-action-active-bg)}.list-group-item{position:relative;display:block;padding:var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x);color:var(--bs-list-group-color);text-decoration:none;background-color:var(--bs-list-group-bg);border:var(--bs-list-group-border-width) solid var(--bs-list-group-border-color)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:var(--bs-list-group-disabled-color);pointer-events:none;background-color:var(--bs-list-group-disabled-bg)}.list-group-item.active{z-index:2;color:var(--bs-list-group-active-color);background-color:var(--bs-list-group-active-bg);border-color:var(--bs-list-group-active-border-color)}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:calc(-1 * var(--bs-list-group-border-width));border-top-width:var(--bs-list-group-border-width)}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}@media (min-width: 576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width: 768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width: 992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width: 1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width: 1400px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 var(--bs-list-group-border-width)}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{--bs-list-group-color: var(--bs-primary-text-emphasis);--bs-list-group-bg: var(--bs-primary-bg-subtle);--bs-list-group-border-color: var(--bs-primary-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-primary-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-primary-border-subtle);--bs-list-group-active-color: var(--bs-primary-bg-subtle);--bs-list-group-active-bg: var(--bs-primary-text-emphasis);--bs-list-group-active-border-color: var(--bs-primary-text-emphasis)}.btn-close{--bs-btn-close-color: #000;--bs-btn-close-bg: url(${___CSS_LOADER_URL_REPLACEMENT_16___});--bs-btn-close-opacity: .5;--bs-btn-close-hover-opacity: .75;--bs-btn-close-focus-shadow: 0 0 0 .25rem rgba(13,110,253,0.25);--bs-btn-close-focus-opacity: 1;--bs-btn-close-disabled-opacity: .25;--bs-btn-close-white-filter: invert(1) grayscale(100%) brightness(200%);box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:var(--bs-btn-close-color);background:transparent var(--bs-btn-close-bg) center/1em auto no-repeat;border:0;border-radius:.375rem;opacity:var(--bs-btn-close-opacity)}.btn-close:hover{color:var(--bs-btn-close-color);text-decoration:none;opacity:var(--bs-btn-close-hover-opacity)}.btn-close:focus{outline:0;box-shadow:var(--bs-btn-close-focus-shadow);opacity:var(--bs-btn-close-focus-opacity)}.btn-close:disabled,.btn-close.disabled{pointer-events:none;user-select:none;opacity:var(--bs-btn-close-disabled-opacity)}.btn-close-white{filter:var(--bs-btn-close-white-filter)}[data-bs-theme="dark"] .btn-close{filter:var(--bs-btn-close-white-filter)}.toast{--bs-toast-zindex: 1090;--bs-toast-padding-x: .75rem;--bs-toast-padding-y: .5rem;--bs-toast-spacing: 1.5rem;--bs-toast-max-width: 350px;--bs-toast-font-size:.875rem;--bs-toast-color: ;--bs-toast-bg: rgba(var(--bs-body-bg-rgb), 0.85);--bs-toast-border-width: var(--bs-border-width);--bs-toast-border-color: var(--bs-border-color-translucent);--bs-toast-border-radius: var(--bs-border-radius);--bs-toast-box-shadow: var(--bs-box-shadow);--bs-toast-header-color: var(--bs-secondary-color);--bs-toast-header-bg: rgba(var(--bs-body-bg-rgb), 0.85);--bs-toast-header-border-color: var(--bs-border-color-translucent);width:var(--bs-toast-max-width);max-width:100%;font-size:var(--bs-toast-font-size);color:var(--bs-toast-color);pointer-events:auto;background-color:var(--bs-toast-bg);background-clip:padding-box;border:var(--bs-toast-border-width) solid var(--bs-toast-border-color);box-shadow:var(--bs-toast-box-shadow);border-radius:var(--bs-toast-border-radius)}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{--bs-toast-zindex: 1090;position:absolute;z-index:var(--bs-toast-zindex);width:max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:var(--bs-toast-spacing)}.toast-header{display:flex;align-items:center;padding:var(--bs-toast-padding-y) var(--bs-toast-padding-x);color:var(--bs-toast-header-color);background-color:var(--bs-toast-header-bg);background-clip:padding-box;border-bottom:var(--bs-toast-border-width) solid var(--bs-toast-header-border-color);border-top-left-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));border-top-right-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width))}.toast-header .btn-close{margin-right:calc(-.5 * var(--bs-toast-padding-x));margin-left:var(--bs-toast-padding-x)}.toast-body{padding:var(--bs-toast-padding-x);word-wrap:break-word}.modal{--bs-modal-zindex: 1055;--bs-modal-width: 500px;--bs-modal-padding: 1rem;--bs-modal-margin: .5rem;--bs-modal-color: ;--bs-modal-bg: var(--bs-body-bg);--bs-modal-border-color: var(--bs-border-color-translucent);--bs-modal-border-width: var(--bs-border-width);--bs-modal-border-radius: var(--bs-border-radius-lg);--bs-modal-box-shadow: var(--bs-box-shadow-sm);--bs-modal-inner-border-radius: calc(var(--bs-border-radius-lg) - (var(--bs-border-width)));--bs-modal-header-padding-x: 1rem;--bs-modal-header-padding-y: 1rem;--bs-modal-header-padding: 1rem 1rem;--bs-modal-header-border-color: var(--bs-border-color);--bs-modal-header-border-width: var(--bs-border-width);--bs-modal-title-line-height: 1.5;--bs-modal-footer-gap: .5rem;--bs-modal-footer-bg: ;--bs-modal-footer-border-color: var(--bs-border-color);--bs-modal-footer-border-width: var(--bs-border-width);position:fixed;top:0;left:0;z-index:var(--bs-modal-zindex);display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:var(--bs-modal-margin);pointer-events:none}.modal.fade .modal-dialog{transition:transform 0.3s ease-out;transform:translate(0, -50px)}@media (prefers-reduced-motion: reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - var(--bs-modal-margin) * 2)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - var(--bs-modal-margin) * 2)}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;color:var(--bs-modal-color);pointer-events:auto;background-color:var(--bs-modal-bg);background-clip:padding-box;border:var(--bs-modal-border-width) solid var(--bs-modal-border-color);border-radius:var(--bs-modal-border-radius);outline:0}.modal-backdrop{--bs-backdrop-zindex: 1050;--bs-backdrop-bg: #000;--bs-backdrop-opacity: .5;position:fixed;top:0;left:0;z-index:var(--bs-backdrop-zindex);width:100vw;height:100vh;background-color:var(--bs-backdrop-bg)}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:var(--bs-backdrop-opacity)}.modal-header{display:flex;flex-shrink:0;align-items:center;justify-content:space-between;padding:var(--bs-modal-header-padding);border-bottom:var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color);border-top-left-radius:var(--bs-modal-inner-border-radius);border-top-right-radius:var(--bs-modal-inner-border-radius)}.modal-header .btn-close{padding:calc(var(--bs-modal-header-padding-y) * .5) calc(var(--bs-modal-header-padding-x) * .5);margin:calc(-.5 * var(--bs-modal-header-padding-y)) calc(-.5 * var(--bs-modal-header-padding-x)) calc(-.5 * var(--bs-modal-header-padding-y)) auto}.modal-title{margin-bottom:0;line-height:var(--bs-modal-title-line-height)}.modal-body{position:relative;flex:1 1 auto;padding:var(--bs-modal-padding)}.modal-footer{display:flex;flex-shrink:0;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap) * .5);background-color:var(--bs-modal-footer-bg);border-top:var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color);border-bottom-right-radius:var(--bs-modal-inner-border-radius);border-bottom-left-radius:var(--bs-modal-inner-border-radius)}.modal-footer>*{margin:calc(var(--bs-modal-footer-gap) * .5)}@media (min-width: 576px){.modal{--bs-modal-margin: 1.75rem;--bs-modal-box-shadow: var(--bs-box-shadow)}.modal-dialog{max-width:var(--bs-modal-width);margin-right:auto;margin-left:auto}.modal-sm{--bs-modal-width: 300px}}@media (min-width: 992px){.modal-lg,.modal-xl{--bs-modal-width: 800px}}@media (min-width: 1200px){.modal-xl{--bs-modal-width: 1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-header,.modal-fullscreen .modal-footer{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}@media (max-width: 575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-header,.modal-fullscreen-sm-down .modal-footer{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}}@media (max-width: 767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-header,.modal-fullscreen-md-down .modal-footer{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}}@media (max-width: 991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-header,.modal-fullscreen-lg-down .modal-footer{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}}@media (max-width: 1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-header,.modal-fullscreen-xl-down .modal-footer{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}}@media (max-width: 1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-header,.modal-fullscreen-xxl-down .modal-footer{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}}.tooltip{--bs-tooltip-zindex: 1080;--bs-tooltip-max-width: 200px;--bs-tooltip-padding-x: .5rem;--bs-tooltip-padding-y: .25rem;--bs-tooltip-margin: ;--bs-tooltip-font-size:.875rem;--bs-tooltip-color: var(--bs-body-bg);--bs-tooltip-bg: var(--bs-emphasis-color);--bs-tooltip-border-radius: var(--bs-border-radius);--bs-tooltip-opacity: .9;--bs-tooltip-arrow-width: .8rem;--bs-tooltip-arrow-height: .4rem;z-index:var(--bs-tooltip-zindex);display:block;margin:var(--bs-tooltip-margin);font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-tooltip-font-size);word-wrap:break-word;opacity:0}.tooltip.show{opacity:var(--bs-tooltip-opacity)}.tooltip .tooltip-arrow{display:block;width:var(--bs-tooltip-arrow-width);height:var(--bs-tooltip-arrow-height)}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-top .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^="top"] .tooltip-arrow{bottom:calc(-1 * var(--bs-tooltip-arrow-height))}.bs-tooltip-top .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^="top"] .tooltip-arrow::before{top:-1px;border-width:var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * .5) 0;border-top-color:var(--bs-tooltip-bg)}.bs-tooltip-end .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^="right"] .tooltip-arrow{left:calc(-1 * var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-end .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^="right"] .tooltip-arrow::before{right:-1px;border-width:calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * .5) 0;border-right-color:var(--bs-tooltip-bg)}.bs-tooltip-bottom .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^="bottom"] .tooltip-arrow{top:calc(-1 * var(--bs-tooltip-arrow-height))}.bs-tooltip-bottom .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^="bottom"] .tooltip-arrow::before{bottom:-1px;border-width:0 calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height);border-bottom-color:var(--bs-tooltip-bg)}.bs-tooltip-start .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^="left"] .tooltip-arrow{right:calc(-1 * var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-start .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^="left"] .tooltip-arrow::before{left:-1px;border-width:calc(var(--bs-tooltip-arrow-width) * .5) 0 calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height);border-left-color:var(--bs-tooltip-bg)}.tooltip-inner{max-width:var(--bs-tooltip-max-width);padding:var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x);color:var(--bs-tooltip-color);text-align:center;background-color:var(--bs-tooltip-bg);border-radius:var(--bs-tooltip-border-radius)}.popover{--bs-popover-zindex: 1070;--bs-popover-max-width: 276px;--bs-popover-font-size:.875rem;--bs-popover-bg: var(--bs-body-bg);--bs-popover-border-width: var(--bs-border-width);--bs-popover-border-color: var(--bs-border-color-translucent);--bs-popover-border-radius: var(--bs-border-radius-lg);--bs-popover-inner-border-radius: calc(var(--bs-border-radius-lg) - var(--bs-border-width));--bs-popover-box-shadow: var(--bs-box-shadow);--bs-popover-header-padding-x: 1rem;--bs-popover-header-padding-y: .5rem;--bs-popover-header-font-size:1rem;--bs-popover-header-color: inherit;--bs-popover-header-bg: var(--bs-secondary-bg);--bs-popover-body-padding-x: 1rem;--bs-popover-body-padding-y: 1rem;--bs-popover-body-color: var(--bs-body-color);--bs-popover-arrow-width: 1rem;--bs-popover-arrow-height: .5rem;--bs-popover-arrow-border: var(--bs-popover-border-color);z-index:var(--bs-popover-zindex);display:block;max-width:var(--bs-popover-max-width);font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-popover-font-size);word-wrap:break-word;background-color:var(--bs-popover-bg);background-clip:padding-box;border:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-radius:var(--bs-popover-border-radius)}.popover .popover-arrow{display:block;width:var(--bs-popover-arrow-width);height:var(--bs-popover-arrow-height)}.popover .popover-arrow::before,.popover .popover-arrow::after{position:absolute;display:block;content:"";border-color:transparent;border-style:solid;border-width:0}.bs-popover-top>.popover-arrow,.bs-popover-auto[data-popper-placement^="top"]>.popover-arrow{bottom:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-top>.popover-arrow::before,.bs-popover-auto[data-popper-placement^="top"]>.popover-arrow::before,.bs-popover-top>.popover-arrow::after,.bs-popover-auto[data-popper-placement^="top"]>.popover-arrow::after{border-width:var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * .5) 0}.bs-popover-top>.popover-arrow::before,.bs-popover-auto[data-popper-placement^="top"]>.popover-arrow::before{bottom:0;border-top-color:var(--bs-popover-arrow-border)}.bs-popover-top>.popover-arrow::after,.bs-popover-auto[data-popper-placement^="top"]>.popover-arrow::after{bottom:var(--bs-popover-border-width);border-top-color:var(--bs-popover-bg)}.bs-popover-end>.popover-arrow,.bs-popover-auto[data-popper-placement^="right"]>.popover-arrow{left:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-end>.popover-arrow::before,.bs-popover-auto[data-popper-placement^="right"]>.popover-arrow::before,.bs-popover-end>.popover-arrow::after,.bs-popover-auto[data-popper-placement^="right"]>.popover-arrow::after{border-width:calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * .5) 0}.bs-popover-end>.popover-arrow::before,.bs-popover-auto[data-popper-placement^="right"]>.popover-arrow::before{left:0;border-right-color:var(--bs-popover-arrow-border)}.bs-popover-end>.popover-arrow::after,.bs-popover-auto[data-popper-placement^="right"]>.popover-arrow::after{left:var(--bs-popover-border-width);border-right-color:var(--bs-popover-bg)}.bs-popover-bottom>.popover-arrow,.bs-popover-auto[data-popper-placement^="bottom"]>.popover-arrow{top:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-bottom>.popover-arrow::before,.bs-popover-auto[data-popper-placement^="bottom"]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::after,.bs-popover-auto[data-popper-placement^="bottom"]>.popover-arrow::after{border-width:0 calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height)}.bs-popover-bottom>.popover-arrow::before,.bs-popover-auto[data-popper-placement^="bottom"]>.popover-arrow::before{top:0;border-bottom-color:var(--bs-popover-arrow-border)}.bs-popover-bottom>.popover-arrow::after,.bs-popover-auto[data-popper-placement^="bottom"]>.popover-arrow::after{top:var(--bs-popover-border-width);border-bottom-color:var(--bs-popover-bg)}.bs-popover-bottom .popover-header::before,.bs-popover-auto[data-popper-placement^="bottom"] .popover-header::before{position:absolute;top:0;left:50%;display:block;width:var(--bs-popover-arrow-width);margin-left:calc(-.5 * var(--bs-popover-arrow-width));content:"";border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-header-bg)}.bs-popover-start>.popover-arrow,.bs-popover-auto[data-popper-placement^="left"]>.popover-arrow{right:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-start>.popover-arrow::before,.bs-popover-auto[data-popper-placement^="left"]>.popover-arrow::before,.bs-popover-start>.popover-arrow::after,.bs-popover-auto[data-popper-placement^="left"]>.popover-arrow::after{border-width:calc(var(--bs-popover-arrow-width) * .5) 0 calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height)}.bs-popover-start>.popover-arrow::before,.bs-popover-auto[data-popper-placement^="left"]>.popover-arrow::before{right:0;border-left-color:var(--bs-popover-arrow-border)}.bs-popover-start>.popover-arrow::after,.bs-popover-auto[data-popper-placement^="left"]>.popover-arrow::after{right:var(--bs-popover-border-width);border-left-color:var(--bs-popover-bg)}.popover-header{padding:var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x);margin-bottom:0;font-size:var(--bs-popover-header-font-size);color:var(--bs-popover-header-color);background-color:var(--bs-popover-header-bg);border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-top-left-radius:var(--bs-popover-inner-border-radius);border-top-right-radius:var(--bs-popover-inner-border-radius)}.popover-header:empty{display:none}.popover-body{padding:var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x);color:var(--bs-popover-body-color)}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;backface-visibility:hidden;transition:transform .6s ease-in-out}@media (prefers-reduced-motion: reduce){.carousel-item{transition:none}}.carousel-item.active,.carousel-item-next,.carousel-item-prev{display:block}.carousel-item-next:not(.carousel-item-start),.active.carousel-item-end{transform:translateX(100%)}.carousel-item-prev:not(.carousel-item-end),.active.carousel-item-start{transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item.active,.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end{z-index:1;opacity:1}.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion: reduce){.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{transition:none}}.carousel-control-prev,.carousel-control-next{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:none;border:0;opacity:.5;transition:opacity 0.15s ease}@media (prefers-reduced-motion: reduce){.carousel-control-prev,.carousel-control-next{transition:none}}.carousel-control-prev:hover,.carousel-control-prev:focus,.carousel-control-next:hover,.carousel-control-next:focus{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-prev-icon,.carousel-control-next-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url(${___CSS_LOADER_URL_REPLACEMENT_17___})}.carousel-control-next-icon{background-image:url(${___CSS_LOADER_URL_REPLACEMENT_18___})}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity 0.6s ease}@media (prefers-reduced-motion: reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-prev-icon,.carousel-dark .carousel-control-next-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}[data-bs-theme="dark"] .carousel .carousel-control-prev-icon,[data-bs-theme="dark"] .carousel .carousel-control-next-icon,[data-bs-theme="dark"].carousel .carousel-control-prev-icon,[data-bs-theme="dark"].carousel .carousel-control-next-icon{filter:invert(1) grayscale(100)}[data-bs-theme="dark"] .carousel .carousel-indicators [data-bs-target],[data-bs-theme="dark"].carousel .carousel-indicators [data-bs-target]{background-color:#000}[data-bs-theme="dark"] .carousel .carousel-caption,[data-bs-theme="dark"].carousel .carousel-caption{color:#000}.spinner-grow,.spinner-border{display:inline-block;width:var(--bs-spinner-width);height:var(--bs-spinner-height);vertical-align:var(--bs-spinner-vertical-align);border-radius:50%;animation:var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name)}@keyframes spinner-border{to{transform:rotate(360deg) /* rtl:ignore */}}.spinner-border{--bs-spinner-width: 2rem;--bs-spinner-height: 2rem;--bs-spinner-vertical-align: -.125em;--bs-spinner-border-width: .25em;--bs-spinner-animation-speed: .75s;--bs-spinner-animation-name: spinner-border;border:var(--bs-spinner-border-width) solid currentcolor;border-right-color:transparent}.spinner-border-sm{--bs-spinner-width: 1rem;--bs-spinner-height: 1rem;--bs-spinner-border-width: .2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{--bs-spinner-width: 2rem;--bs-spinner-height: 2rem;--bs-spinner-vertical-align: -.125em;--bs-spinner-animation-speed: .75s;--bs-spinner-animation-name: spinner-grow;background-color:currentcolor;opacity:0}.spinner-grow-sm{--bs-spinner-width: 1rem;--bs-spinner-height: 1rem}@media (prefers-reduced-motion: reduce){.spinner-border,.spinner-grow{--bs-spinner-animation-speed: 1.5s}}.offcanvas-sm,.offcanvas-md,.offcanvas-lg,.offcanvas-xl,.offcanvas-xxl,.offcanvas{--bs-offcanvas-zindex: 1045;--bs-offcanvas-width: 400px;--bs-offcanvas-height: 30vh;--bs-offcanvas-padding-x: 1rem;--bs-offcanvas-padding-y: 1rem;--bs-offcanvas-color: var(--bs-body-color);--bs-offcanvas-bg: var(--bs-body-bg);--bs-offcanvas-border-width: var(--bs-border-width);--bs-offcanvas-border-color: var(--bs-border-color-translucent);--bs-offcanvas-box-shadow: var(--bs-box-shadow-sm);--bs-offcanvas-transition: transform .3s ease-in-out;--bs-offcanvas-title-line-height: 1.5}@media (max-width: 575.98px){.offcanvas-sm{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width: 575.98px) and (prefers-reduced-motion: reduce){.offcanvas-sm{transition:none}}@media (max-width: 575.98px){.offcanvas-sm.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-sm.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-sm.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-sm.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-sm.showing,.offcanvas-sm.show:not(.hiding){transform:none}.offcanvas-sm.showing,.offcanvas-sm.hiding,.offcanvas-sm.show{visibility:visible}}@media (min-width: 576px){.offcanvas-sm{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:transparent !important}.offcanvas-sm .offcanvas-header{display:none}.offcanvas-sm .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent !important}}@media (max-width: 767.98px){.offcanvas-md{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width: 767.98px) and (prefers-reduced-motion: reduce){.offcanvas-md{transition:none}}@media (max-width: 767.98px){.offcanvas-md.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-md.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-md.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-md.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-md.showing,.offcanvas-md.show:not(.hiding){transform:none}.offcanvas-md.showing,.offcanvas-md.hiding,.offcanvas-md.show{visibility:visible}}@media (min-width: 768px){.offcanvas-md{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:transparent !important}.offcanvas-md .offcanvas-header{display:none}.offcanvas-md .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent !important}}@media (max-width: 991.98px){.offcanvas-lg{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width: 991.98px) and (prefers-reduced-motion: reduce){.offcanvas-lg{transition:none}}@media (max-width: 991.98px){.offcanvas-lg.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-lg.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-lg.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-lg.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-lg.showing,.offcanvas-lg.show:not(.hiding){transform:none}.offcanvas-lg.showing,.offcanvas-lg.hiding,.offcanvas-lg.show{visibility:visible}}@media (min-width: 992px){.offcanvas-lg{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:transparent !important}.offcanvas-lg .offcanvas-header{display:none}.offcanvas-lg .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent !important}}@media (max-width: 1199.98px){.offcanvas-xl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width: 1199.98px) and (prefers-reduced-motion: reduce){.offcanvas-xl{transition:none}}@media (max-width: 1199.98px){.offcanvas-xl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xl.showing,.offcanvas-xl.show:not(.hiding){transform:none}.offcanvas-xl.showing,.offcanvas-xl.hiding,.offcanvas-xl.show{visibility:visible}}@media (min-width: 1200px){.offcanvas-xl{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:transparent !important}.offcanvas-xl .offcanvas-header{display:none}.offcanvas-xl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent !important}}@media (max-width: 1399.98px){.offcanvas-xxl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width: 1399.98px) and (prefers-reduced-motion: reduce){.offcanvas-xxl{transition:none}}@media (max-width: 1399.98px){.offcanvas-xxl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xxl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xxl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xxl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xxl.showing,.offcanvas-xxl.show:not(.hiding){transform:none}.offcanvas-xxl.showing,.offcanvas-xxl.hiding,.offcanvas-xxl.show{visibility:visible}}@media (min-width: 1400px){.offcanvas-xxl{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:transparent !important}.offcanvas-xxl .offcanvas-header{display:none}.offcanvas-xxl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent !important}}.offcanvas{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}@media (prefers-reduced-motion: reduce){.offcanvas{transition:none}}.offcanvas.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas.showing,.offcanvas.show:not(.hiding){transform:none}.offcanvas.showing,.offcanvas.hiding,.offcanvas.show{visibility:visible}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{display:flex;align-items:center;justify-content:space-between;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x)}.offcanvas-header .btn-close{padding:calc(var(--bs-offcanvas-padding-y) * .5) calc(var(--bs-offcanvas-padding-x) * .5);margin-top:calc(-.5 * var(--bs-offcanvas-padding-y));margin-right:calc(-.5 * var(--bs-offcanvas-padding-x));margin-bottom:calc(-.5 * var(--bs-offcanvas-padding-y))}.offcanvas-title{margin-bottom:0;line-height:var(--bs-offcanvas-title-line-height)}.offcanvas-body{flex-grow:1;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);overflow-y:auto}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentcolor;opacity:.5}.placeholder.btn::before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{animation:placeholder-glow 2s ease-in-out infinite}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{mask-image:linear-gradient(130deg, #000 55%, rgba(0,0,0,0.8) 75%, #000 95%);mask-size:200% 100%;animation:placeholder-wave 2s linear infinite}@keyframes placeholder-wave{100%{mask-position:-200% 0%}}.clearfix::after{display:block;clear:both;content:""}.text-bg-primary{color:#fff !important;background-color:RGBA(var(--bs-primary-rgb), var(--bs-bg-opacity, 1)) !important}.link-primary{color:RGBA(var(--bs-primary-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-primary-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-primary:hover,.link-primary:focus{color:RGBA(50,65,145, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(50,65,145, var(--bs-link-underline-opacity, 1)) !important}.link-body-emphasis{color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-body-emphasis:hover,.link-body-emphasis:focus{color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 0.75)) !important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 0.75)) !important}.focus-ring:focus{outline:0;box-shadow:var(--bs-focus-ring-x, 0) var(--bs-focus-ring-y, 0) var(--bs-focus-ring-blur, 0) var(--bs-focus-ring-width) var(--bs-focus-ring-color)}.icon-link{display:inline-flex;gap:.375rem;align-items:center;text-decoration-color:rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 0.5));text-underline-offset:.25em;backface-visibility:hidden}.icon-link>.bi{flex-shrink:0;width:1em;height:1em;fill:currentcolor;transition:0.2s ease-in-out transform}@media (prefers-reduced-motion: reduce){.icon-link>.bi{transition:none}}.icon-link-hover:hover>.bi,.icon-link-hover:focus-visible>.bi{transform:var(--bs-icon-link-transform, translate3d(0.25em, 0, 0))}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio: 100%}.ratio-4x3{--bs-aspect-ratio: calc(3 / 4 * 100%)}.ratio-16x9{--bs-aspect-ratio: calc(9 / 16 * 100%)}.ratio-21x9{--bs-aspect-ratio: calc(9 / 21 * 100%)}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:sticky;top:0;z-index:1020}.sticky-bottom{position:sticky;bottom:0;z-index:1020}@media (min-width: 576px){.sticky-sm-top{position:sticky;top:0;z-index:1020}.sticky-sm-bottom{position:sticky;bottom:0;z-index:1020}}@media (min-width: 768px){.sticky-md-top{position:sticky;top:0;z-index:1020}.sticky-md-bottom{position:sticky;bottom:0;z-index:1020}}@media (min-width: 992px){.sticky-lg-top{position:sticky;top:0;z-index:1020}.sticky-lg-bottom{position:sticky;bottom:0;z-index:1020}}@media (min-width: 1200px){.sticky-xl-top{position:sticky;top:0;z-index:1020}.sticky-xl-bottom{position:sticky;bottom:0;z-index:1020}}@media (min-width: 1400px){.sticky-xxl-top{position:sticky;top:0;z-index:1020}.sticky-xxl-bottom{position:sticky;bottom:0;z-index:1020}}.hstack{display:flex;flex-direction:row;align-items:center;align-self:stretch}.vstack{display:flex;flex:1 1 auto;flex-direction:column;align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){width:1px !important;height:1px !important;padding:0 !important;margin:-1px !important;overflow:hidden !important;clip:rect(0, 0, 0, 0) !important;white-space:nowrap !important;border:0 !important}.visually-hidden:not(caption),.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption){position:absolute !important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;width:var(--bs-border-width);min-height:1em;background-color:currentcolor;opacity:.25}.align-baseline{vertical-align:baseline !important}.align-top{vertical-align:top !important}.align-middle{vertical-align:middle !important}.align-bottom{vertical-align:bottom !important}.align-text-bottom{vertical-align:text-bottom !important}.align-text-top{vertical-align:text-top !important}.float-start{float:left !important}.float-end{float:right !important}.float-none{float:none !important}.object-fit-contain{object-fit:contain !important}.object-fit-cover{object-fit:cover !important}.object-fit-fill{object-fit:fill !important}.object-fit-scale{object-fit:scale-down !important}.object-fit-none{object-fit:none !important}.opacity-0{opacity:0 !important}.opacity-25{opacity:.25 !important}.opacity-50{opacity:.5 !important}.opacity-75{opacity:.75 !important}.opacity-100{opacity:1 !important}.overflow-auto{overflow:auto !important}.overflow-hidden{overflow:hidden !important}.overflow-visible{overflow:visible !important}.overflow-scroll{overflow:scroll !important}.overflow-x-auto{overflow-x:auto !important}.overflow-x-hidden{overflow-x:hidden !important}.overflow-x-visible{overflow-x:visible !important}.overflow-x-scroll{overflow-x:scroll !important}.overflow-y-auto{overflow-y:auto !important}.overflow-y-hidden{overflow-y:hidden !important}.overflow-y-visible{overflow-y:visible !important}.overflow-y-scroll{overflow-y:scroll !important}.d-inline{display:inline !important}.d-inline-block{display:inline-block !important}.d-block{display:block !important}.d-grid{display:grid !important}.d-inline-grid{display:inline-grid !important}.d-table{display:table !important}.d-table-row{display:table-row !important}.d-table-cell{display:table-cell !important}.d-flex{display:flex !important}.d-inline-flex{display:inline-flex !important}.d-none{display:none !important}.shadow{box-shadow:var(--bs-box-shadow) !important}.shadow-sm{box-shadow:var(--bs-box-shadow-sm) !important}.shadow-lg{box-shadow:var(--bs-box-shadow-lg) !important}.shadow-none{box-shadow:none !important}.focus-ring-primary{--bs-focus-ring-color: rgba(var(--bs-primary-rgb), var(--bs-focus-ring-opacity))}.position-static{position:static !important}.position-relative{position:relative !important}.position-absolute{position:absolute !important}.position-fixed{position:fixed !important}.position-sticky{position:sticky !important}.top-0{top:0 !important}.top-50{top:50% !important}.top-100{top:100% !important}.bottom-0{bottom:0 !important}.bottom-50{bottom:50% !important}.bottom-100{bottom:100% !important}.start-0{left:0 !important}.start-50{left:50% !important}.start-100{left:100% !important}.end-0{right:0 !important}.end-50{right:50% !important}.end-100{right:100% !important}.translate-middle{transform:translate(-50%, -50%) !important}.translate-middle-x{transform:translateX(-50%) !important}.translate-middle-y{transform:translateY(-50%) !important}.border{border:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-0{border:0 !important}.border-top{border-top:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-top-0{border-top:0 !important}.border-end{border-right:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-end-0{border-right:0 !important}.border-bottom{border-bottom:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-bottom-0{border-bottom:0 !important}.border-start{border-left:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-start-0{border-left:0 !important}.border-primary{--bs-border-opacity: 1;border-color:rgba(var(--bs-primary-rgb), var(--bs-border-opacity)) !important}.border-black{--bs-border-opacity: 1;border-color:rgba(var(--bs-black-rgb), var(--bs-border-opacity)) !important}.border-white{--bs-border-opacity: 1;border-color:rgba(var(--bs-white-rgb), var(--bs-border-opacity)) !important}.border-primary-subtle{border-color:var(--bs-primary-border-subtle) !important}.border-secondary-subtle{border-color:var(--bs-secondary-border-subtle) !important}.border-success-subtle{border-color:var(--bs-success-border-subtle) !important}.border-info-subtle{border-color:var(--bs-info-border-subtle) !important}.border-warning-subtle{border-color:var(--bs-warning-border-subtle) !important}.border-danger-subtle{border-color:var(--bs-danger-border-subtle) !important}.border-light-subtle{border-color:var(--bs-light-border-subtle) !important}.border-dark-subtle{border-color:var(--bs-dark-border-subtle) !important}.border-1{border-width:1px !important}.border-2{border-width:2px !important}.border-3{border-width:3px !important}.border-4{border-width:4px !important}.border-5{border-width:5px !important}.border-opacity-10{--bs-border-opacity: .1}.border-opacity-25{--bs-border-opacity: .25}.border-opacity-50{--bs-border-opacity: .5}.border-opacity-75{--bs-border-opacity: .75}.border-opacity-100{--bs-border-opacity: 1}.w-25{width:25% !important}.w-50{width:50% !important}.w-75{width:75% !important}.w-100{width:100% !important}.w-auto{width:auto !important}.mw-100{max-width:100% !important}.vw-100{width:100vw !important}.min-vw-100{min-width:100vw !important}.h-25{height:25% !important}.h-50{height:50% !important}.h-75{height:75% !important}.h-100{height:100% !important}.h-auto{height:auto !important}.mh-100{max-height:100% !important}.vh-100{height:100vh !important}.min-vh-100{min-height:100vh !important}.flex-fill{flex:1 1 auto !important}.flex-row{flex-direction:row !important}.flex-column{flex-direction:column !important}.flex-row-reverse{flex-direction:row-reverse !important}.flex-column-reverse{flex-direction:column-reverse !important}.flex-grow-0{flex-grow:0 !important}.flex-grow-1{flex-grow:1 !important}.flex-shrink-0{flex-shrink:0 !important}.flex-shrink-1{flex-shrink:1 !important}.flex-wrap{flex-wrap:wrap !important}.flex-nowrap{flex-wrap:nowrap !important}.flex-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-start{justify-content:flex-start !important}.justify-content-end{justify-content:flex-end !important}.justify-content-center{justify-content:center !important}.justify-content-between{justify-content:space-between !important}.justify-content-around{justify-content:space-around !important}.justify-content-evenly{justify-content:space-evenly !important}.align-items-start{align-items:flex-start !important}.align-items-end{align-items:flex-end !important}.align-items-center{align-items:center !important}.align-items-baseline{align-items:baseline !important}.align-items-stretch{align-items:stretch !important}.align-content-start{align-content:flex-start !important}.align-content-end{align-content:flex-end !important}.align-content-center{align-content:center !important}.align-content-between{align-content:space-between !important}.align-content-around{align-content:space-around !important}.align-content-stretch{align-content:stretch !important}.align-self-auto{align-self:auto !important}.align-self-start{align-self:flex-start !important}.align-self-end{align-self:flex-end !important}.align-self-center{align-self:center !important}.align-self-baseline{align-self:baseline !important}.align-self-stretch{align-self:stretch !important}.order-first{order:-1 !important}.order-0{order:0 !important}.order-1{order:1 !important}.order-2{order:2 !important}.order-3{order:3 !important}.order-4{order:4 !important}.order-5{order:5 !important}.order-last{order:6 !important}.m-0{margin:0 !important}.m-1{margin:.25rem !important}.m-2{margin:.5rem !important}.m-3{margin:1rem !important}.m-4{margin:1.5rem !important}.m-5{margin:3rem !important}.m-auto{margin:auto !important}.mx-0{margin-right:0 !important;margin-left:0 !important}.mx-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-3{margin-right:1rem !important;margin-left:1rem !important}.mx-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-5{margin-right:3rem !important;margin-left:3rem !important}.mx-auto{margin-right:auto !important;margin-left:auto !important}.my-0{margin-top:0 !important;margin-bottom:0 !important}.my-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-0{margin-top:0 !important}.mt-1{margin-top:.25rem !important}.mt-2{margin-top:.5rem !important}.mt-3{margin-top:1rem !important}.mt-4{margin-top:1.5rem !important}.mt-5{margin-top:3rem !important}.mt-auto{margin-top:auto !important}.me-0{margin-right:0 !important}.me-1{margin-right:.25rem !important}.me-2{margin-right:.5rem !important}.me-3{margin-right:1rem !important}.me-4{margin-right:1.5rem !important}.me-5{margin-right:3rem !important}.me-auto{margin-right:auto !important}.mb-0{margin-bottom:0 !important}.mb-1{margin-bottom:.25rem !important}.mb-2{margin-bottom:.5rem !important}.mb-3{margin-bottom:1rem !important}.mb-4{margin-bottom:1.5rem !important}.mb-5{margin-bottom:3rem !important}.mb-auto{margin-bottom:auto !important}.ms-0{margin-left:0 !important}.ms-1{margin-left:.25rem !important}.ms-2{margin-left:.5rem !important}.ms-3{margin-left:1rem !important}.ms-4{margin-left:1.5rem !important}.ms-5{margin-left:3rem !important}.ms-auto{margin-left:auto !important}.p-0{padding:0 !important}.p-1{padding:.25rem !important}.p-2{padding:.5rem !important}.p-3{padding:1rem !important}.p-4{padding:1.5rem !important}.p-5{padding:3rem !important}.px-0{padding-right:0 !important;padding-left:0 !important}.px-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-3{padding-right:1rem !important;padding-left:1rem !important}.px-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-5{padding-right:3rem !important;padding-left:3rem !important}.py-0{padding-top:0 !important;padding-bottom:0 !important}.py-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-0{padding-top:0 !important}.pt-1{padding-top:.25rem !important}.pt-2{padding-top:.5rem !important}.pt-3{padding-top:1rem !important}.pt-4{padding-top:1.5rem !important}.pt-5{padding-top:3rem !important}.pe-0{padding-right:0 !important}.pe-1{padding-right:.25rem !important}.pe-2{padding-right:.5rem !important}.pe-3{padding-right:1rem !important}.pe-4{padding-right:1.5rem !important}.pe-5{padding-right:3rem !important}.pb-0{padding-bottom:0 !important}.pb-1{padding-bottom:.25rem !important}.pb-2{padding-bottom:.5rem !important}.pb-3{padding-bottom:1rem !important}.pb-4{padding-bottom:1.5rem !important}.pb-5{padding-bottom:3rem !important}.ps-0{padding-left:0 !important}.ps-1{padding-left:.25rem !important}.ps-2{padding-left:.5rem !important}.ps-3{padding-left:1rem !important}.ps-4{padding-left:1.5rem !important}.ps-5{padding-left:3rem !important}.gap-0{gap:0 !important}.gap-1{gap:.25rem !important}.gap-2{gap:.5rem !important}.gap-3{gap:1rem !important}.gap-4{gap:1.5rem !important}.gap-5{gap:3rem !important}.row-gap-0{row-gap:0 !important}.row-gap-1{row-gap:.25rem !important}.row-gap-2{row-gap:.5rem !important}.row-gap-3{row-gap:1rem !important}.row-gap-4{row-gap:1.5rem !important}.row-gap-5{row-gap:3rem !important}.column-gap-0{column-gap:0 !important}.column-gap-1{column-gap:.25rem !important}.column-gap-2{column-gap:.5rem !important}.column-gap-3{column-gap:1rem !important}.column-gap-4{column-gap:1.5rem !important}.column-gap-5{column-gap:3rem !important}.font-monospace{font-family:var(--bs-font-monospace) !important}.fs-1{font-size:calc(1.375rem + 1.5vw) !important}.fs-2{font-size:calc(1.325rem + .9vw) !important}.fs-3{font-size:calc(1.3rem + .6vw) !important}.fs-4{font-size:calc(1.275rem + .3vw) !important}.fs-5{font-size:1.25rem !important}.fs-6{font-size:1rem !important}.fst-italic{font-style:italic !important}.fst-normal{font-style:normal !important}.fw-lighter{font-weight:lighter !important}.fw-light{font-weight:300 !important}.fw-normal{font-weight:400 !important}.fw-medium{font-weight:500 !important}.fw-semibold{font-weight:600 !important}.fw-bold{font-weight:700 !important}.fw-bolder{font-weight:bolder !important}.lh-1{line-height:1 !important}.lh-sm{line-height:1.25 !important}.lh-base{line-height:1.5 !important}.lh-lg{line-height:2 !important}.text-start{text-align:left !important}.text-end{text-align:right !important}.text-center{text-align:center !important}.text-decoration-none{text-decoration:none !important}.text-decoration-underline{text-decoration:underline !important}.text-decoration-line-through{text-decoration:line-through !important}.text-lowercase{text-transform:lowercase !important}.text-uppercase{text-transform:uppercase !important}.text-capitalize{text-transform:capitalize !important}.text-wrap{white-space:normal !important}.text-nowrap{white-space:nowrap !important}.text-break{word-wrap:break-word !important;word-break:break-word !important}.text-primary{--bs-text-opacity: 1;color:rgba(var(--bs-primary-rgb), var(--bs-text-opacity)) !important}.text-black{--bs-text-opacity: 1;color:rgba(var(--bs-black-rgb), var(--bs-text-opacity)) !important}.text-white{--bs-text-opacity: 1;color:rgba(var(--bs-white-rgb), var(--bs-text-opacity)) !important}.text-body{--bs-text-opacity: 1;color:rgba(var(--bs-body-color-rgb), var(--bs-text-opacity)) !important}.text-muted{--bs-text-opacity: 1;color:var(--bs-secondary-color) !important}.text-black-50{--bs-text-opacity: 1;color:rgba(0,0,0,0.5) !important}.text-white-50{--bs-text-opacity: 1;color:rgba(255,255,255,0.5) !important}.text-body-secondary{--bs-text-opacity: 1;color:var(--bs-secondary-color) !important}.text-body-tertiary{--bs-text-opacity: 1;color:var(--bs-tertiary-color) !important}.text-body-emphasis{--bs-text-opacity: 1;color:var(--bs-emphasis-color) !important}.text-reset{--bs-text-opacity: 1;color:inherit !important}.text-opacity-25{--bs-text-opacity: .25}.text-opacity-50{--bs-text-opacity: .5}.text-opacity-75{--bs-text-opacity: .75}.text-opacity-100{--bs-text-opacity: 1}.text-primary-emphasis{color:var(--bs-primary-text-emphasis) !important}.text-secondary-emphasis{color:var(--bs-secondary-text-emphasis) !important}.text-success-emphasis{color:var(--bs-success-text-emphasis) !important}.text-info-emphasis{color:var(--bs-info-text-emphasis) !important}.text-warning-emphasis{color:var(--bs-warning-text-emphasis) !important}.text-danger-emphasis{color:var(--bs-danger-text-emphasis) !important}.text-light-emphasis{color:var(--bs-light-text-emphasis) !important}.text-dark-emphasis{color:var(--bs-dark-text-emphasis) !important}.link-opacity-10{--bs-link-opacity: .1}.link-opacity-10-hover:hover{--bs-link-opacity: .1}.link-opacity-25{--bs-link-opacity: .25}.link-opacity-25-hover:hover{--bs-link-opacity: .25}.link-opacity-50{--bs-link-opacity: .5}.link-opacity-50-hover:hover{--bs-link-opacity: .5}.link-opacity-75{--bs-link-opacity: .75}.link-opacity-75-hover:hover{--bs-link-opacity: .75}.link-opacity-100{--bs-link-opacity: 1}.link-opacity-100-hover:hover{--bs-link-opacity: 1}.link-offset-1{text-underline-offset:.125em !important}.link-offset-1-hover:hover{text-underline-offset:.125em !important}.link-offset-2{text-underline-offset:.25em !important}.link-offset-2-hover:hover{text-underline-offset:.25em !important}.link-offset-3{text-underline-offset:.375em !important}.link-offset-3-hover:hover{text-underline-offset:.375em !important}.link-underline-primary{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-primary-rgb), var(--bs-link-underline-opacity)) !important}.link-underline{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-link-color-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-underline-opacity-0{--bs-link-underline-opacity: 0}.link-underline-opacity-0-hover:hover{--bs-link-underline-opacity: 0}.link-underline-opacity-10{--bs-link-underline-opacity: .1}.link-underline-opacity-10-hover:hover{--bs-link-underline-opacity: .1}.link-underline-opacity-25{--bs-link-underline-opacity: .25}.link-underline-opacity-25-hover:hover{--bs-link-underline-opacity: .25}.link-underline-opacity-50{--bs-link-underline-opacity: .5}.link-underline-opacity-50-hover:hover{--bs-link-underline-opacity: .5}.link-underline-opacity-75{--bs-link-underline-opacity: .75}.link-underline-opacity-75-hover:hover{--bs-link-underline-opacity: .75}.link-underline-opacity-100{--bs-link-underline-opacity: 1}.link-underline-opacity-100-hover:hover{--bs-link-underline-opacity: 1}.bg-primary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important}.bg-black{--bs-bg-opacity: 1;background-color:rgba(var(--bs-black-rgb), var(--bs-bg-opacity)) !important}.bg-white{--bs-bg-opacity: 1;background-color:rgba(var(--bs-white-rgb), var(--bs-bg-opacity)) !important}.bg-body{--bs-bg-opacity: 1;background-color:rgba(var(--bs-body-bg-rgb), var(--bs-bg-opacity)) !important}.bg-transparent{--bs-bg-opacity: 1;background-color:rgba(0,0,0,0) !important}.bg-body-secondary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-secondary-bg-rgb), var(--bs-bg-opacity)) !important}.bg-body-tertiary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-tertiary-bg-rgb), var(--bs-bg-opacity)) !important}.bg-opacity-10{--bs-bg-opacity: .1}.bg-opacity-25{--bs-bg-opacity: .25}.bg-opacity-50{--bs-bg-opacity: .5}.bg-opacity-75{--bs-bg-opacity: .75}.bg-opacity-100{--bs-bg-opacity: 1}.bg-primary-subtle{background-color:var(--bs-primary-bg-subtle) !important}.bg-secondary-subtle{background-color:var(--bs-secondary-bg-subtle) !important}.bg-success-subtle{background-color:var(--bs-success-bg-subtle) !important}.bg-info-subtle{background-color:var(--bs-info-bg-subtle) !important}.bg-warning-subtle{background-color:var(--bs-warning-bg-subtle) !important}.bg-danger-subtle{background-color:var(--bs-danger-bg-subtle) !important}.bg-light-subtle{background-color:var(--bs-light-bg-subtle) !important}.bg-dark-subtle{background-color:var(--bs-dark-bg-subtle) !important}.bg-gradient{background-image:var(--bs-gradient) !important}.user-select-all{user-select:all !important}.user-select-auto{user-select:auto !important}.user-select-none{user-select:none !important}.pe-none{pointer-events:none !important}.pe-auto{pointer-events:auto !important}.rounded{border-radius:var(--bs-border-radius) !important}.rounded-0{border-radius:0 !important}.rounded-1{border-radius:var(--bs-border-radius-sm) !important}.rounded-2{border-radius:var(--bs-border-radius) !important}.rounded-3{border-radius:var(--bs-border-radius-lg) !important}.rounded-4{border-radius:var(--bs-border-radius-xl) !important}.rounded-5{border-radius:var(--bs-border-radius-xxl) !important}.rounded-circle{border-radius:50% !important}.rounded-pill{border-radius:var(--bs-border-radius-pill) !important}.rounded-top{border-top-left-radius:var(--bs-border-radius) !important;border-top-right-radius:var(--bs-border-radius) !important}.rounded-top-0{border-top-left-radius:0 !important;border-top-right-radius:0 !important}.rounded-top-1{border-top-left-radius:var(--bs-border-radius-sm) !important;border-top-right-radius:var(--bs-border-radius-sm) !important}.rounded-top-2{border-top-left-radius:var(--bs-border-radius) !important;border-top-right-radius:var(--bs-border-radius) !important}.rounded-top-3{border-top-left-radius:var(--bs-border-radius-lg) !important;border-top-right-radius:var(--bs-border-radius-lg) !important}.rounded-top-4{border-top-left-radius:var(--bs-border-radius-xl) !important;border-top-right-radius:var(--bs-border-radius-xl) !important}.rounded-top-5{border-top-left-radius:var(--bs-border-radius-xxl) !important;border-top-right-radius:var(--bs-border-radius-xxl) !important}.rounded-top-circle{border-top-left-radius:50% !important;border-top-right-radius:50% !important}.rounded-top-pill{border-top-left-radius:var(--bs-border-radius-pill) !important;border-top-right-radius:var(--bs-border-radius-pill) !important}.rounded-end{border-top-right-radius:var(--bs-border-radius) !important;border-bottom-right-radius:var(--bs-border-radius) !important}.rounded-end-0{border-top-right-radius:0 !important;border-bottom-right-radius:0 !important}.rounded-end-1{border-top-right-radius:var(--bs-border-radius-sm) !important;border-bottom-right-radius:var(--bs-border-radius-sm) !important}.rounded-end-2{border-top-right-radius:var(--bs-border-radius) !important;border-bottom-right-radius:var(--bs-border-radius) !important}.rounded-end-3{border-top-right-radius:var(--bs-border-radius-lg) !important;border-bottom-right-radius:var(--bs-border-radius-lg) !important}.rounded-end-4{border-top-right-radius:var(--bs-border-radius-xl) !important;border-bottom-right-radius:var(--bs-border-radius-xl) !important}.rounded-end-5{border-top-right-radius:var(--bs-border-radius-xxl) !important;border-bottom-right-radius:var(--bs-border-radius-xxl) !important}.rounded-end-circle{border-top-right-radius:50% !important;border-bottom-right-radius:50% !important}.rounded-end-pill{border-top-right-radius:var(--bs-border-radius-pill) !important;border-bottom-right-radius:var(--bs-border-radius-pill) !important}.rounded-bottom{border-bottom-right-radius:var(--bs-border-radius) !important;border-bottom-left-radius:var(--bs-border-radius) !important}.rounded-bottom-0{border-bottom-right-radius:0 !important;border-bottom-left-radius:0 !important}.rounded-bottom-1{border-bottom-right-radius:var(--bs-border-radius-sm) !important;border-bottom-left-radius:var(--bs-border-radius-sm) !important}.rounded-bottom-2{border-bottom-right-radius:var(--bs-border-radius) !important;border-bottom-left-radius:var(--bs-border-radius) !important}.rounded-bottom-3{border-bottom-right-radius:var(--bs-border-radius-lg) !important;border-bottom-left-radius:var(--bs-border-radius-lg) !important}.rounded-bottom-4{border-bottom-right-radius:var(--bs-border-radius-xl) !important;border-bottom-left-radius:var(--bs-border-radius-xl) !important}.rounded-bottom-5{border-bottom-right-radius:var(--bs-border-radius-xxl) !important;border-bottom-left-radius:var(--bs-border-radius-xxl) !important}.rounded-bottom-circle{border-bottom-right-radius:50% !important;border-bottom-left-radius:50% !important}.rounded-bottom-pill{border-bottom-right-radius:var(--bs-border-radius-pill) !important;border-bottom-left-radius:var(--bs-border-radius-pill) !important}.rounded-start{border-bottom-left-radius:var(--bs-border-radius) !important;border-top-left-radius:var(--bs-border-radius) !important}.rounded-start-0{border-bottom-left-radius:0 !important;border-top-left-radius:0 !important}.rounded-start-1{border-bottom-left-radius:var(--bs-border-radius-sm) !important;border-top-left-radius:var(--bs-border-radius-sm) !important}.rounded-start-2{border-bottom-left-radius:var(--bs-border-radius) !important;border-top-left-radius:var(--bs-border-radius) !important}.rounded-start-3{border-bottom-left-radius:var(--bs-border-radius-lg) !important;border-top-left-radius:var(--bs-border-radius-lg) !important}.rounded-start-4{border-bottom-left-radius:var(--bs-border-radius-xl) !important;border-top-left-radius:var(--bs-border-radius-xl) !important}.rounded-start-5{border-bottom-left-radius:var(--bs-border-radius-xxl) !important;border-top-left-radius:var(--bs-border-radius-xxl) !important}.rounded-start-circle{border-bottom-left-radius:50% !important;border-top-left-radius:50% !important}.rounded-start-pill{border-bottom-left-radius:var(--bs-border-radius-pill) !important;border-top-left-radius:var(--bs-border-radius-pill) !important}.visible{visibility:visible !important}.invisible{visibility:hidden !important}.z-n1{z-index:-1 !important}.z-0{z-index:0 !important}.z-1{z-index:1 !important}.z-2{z-index:2 !important}.z-3{z-index:3 !important}@media (min-width: 576px){.float-sm-start{float:left !important}.float-sm-end{float:right !important}.float-sm-none{float:none !important}.object-fit-sm-contain{object-fit:contain !important}.object-fit-sm-cover{object-fit:cover !important}.object-fit-sm-fill{object-fit:fill !important}.object-fit-sm-scale{object-fit:scale-down !important}.object-fit-sm-none{object-fit:none !important}.d-sm-inline{display:inline !important}.d-sm-inline-block{display:inline-block !important}.d-sm-block{display:block !important}.d-sm-grid{display:grid !important}.d-sm-inline-grid{display:inline-grid !important}.d-sm-table{display:table !important}.d-sm-table-row{display:table-row !important}.d-sm-table-cell{display:table-cell !important}.d-sm-flex{display:flex !important}.d-sm-inline-flex{display:inline-flex !important}.d-sm-none{display:none !important}.flex-sm-fill{flex:1 1 auto !important}.flex-sm-row{flex-direction:row !important}.flex-sm-column{flex-direction:column !important}.flex-sm-row-reverse{flex-direction:row-reverse !important}.flex-sm-column-reverse{flex-direction:column-reverse !important}.flex-sm-grow-0{flex-grow:0 !important}.flex-sm-grow-1{flex-grow:1 !important}.flex-sm-shrink-0{flex-shrink:0 !important}.flex-sm-shrink-1{flex-shrink:1 !important}.flex-sm-wrap{flex-wrap:wrap !important}.flex-sm-nowrap{flex-wrap:nowrap !important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-sm-start{justify-content:flex-start !important}.justify-content-sm-end{justify-content:flex-end !important}.justify-content-sm-center{justify-content:center !important}.justify-content-sm-between{justify-content:space-between !important}.justify-content-sm-around{justify-content:space-around !important}.justify-content-sm-evenly{justify-content:space-evenly !important}.align-items-sm-start{align-items:flex-start !important}.align-items-sm-end{align-items:flex-end !important}.align-items-sm-center{align-items:center !important}.align-items-sm-baseline{align-items:baseline !important}.align-items-sm-stretch{align-items:stretch !important}.align-content-sm-start{align-content:flex-start !important}.align-content-sm-end{align-content:flex-end !important}.align-content-sm-center{align-content:center !important}.align-content-sm-between{align-content:space-between !important}.align-content-sm-around{align-content:space-around !important}.align-content-sm-stretch{align-content:stretch !important}.align-self-sm-auto{align-self:auto !important}.align-self-sm-start{align-self:flex-start !important}.align-self-sm-end{align-self:flex-end !important}.align-self-sm-center{align-self:center !important}.align-self-sm-baseline{align-self:baseline !important}.align-self-sm-stretch{align-self:stretch !important}.order-sm-first{order:-1 !important}.order-sm-0{order:0 !important}.order-sm-1{order:1 !important}.order-sm-2{order:2 !important}.order-sm-3{order:3 !important}.order-sm-4{order:4 !important}.order-sm-5{order:5 !important}.order-sm-last{order:6 !important}.m-sm-0{margin:0 !important}.m-sm-1{margin:.25rem !important}.m-sm-2{margin:.5rem !important}.m-sm-3{margin:1rem !important}.m-sm-4{margin:1.5rem !important}.m-sm-5{margin:3rem !important}.m-sm-auto{margin:auto !important}.mx-sm-0{margin-right:0 !important;margin-left:0 !important}.mx-sm-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-sm-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-sm-3{margin-right:1rem !important;margin-left:1rem !important}.mx-sm-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-sm-5{margin-right:3rem !important;margin-left:3rem !important}.mx-sm-auto{margin-right:auto !important;margin-left:auto !important}.my-sm-0{margin-top:0 !important;margin-bottom:0 !important}.my-sm-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-sm-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-sm-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-sm-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-sm-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-sm-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-sm-0{margin-top:0 !important}.mt-sm-1{margin-top:.25rem !important}.mt-sm-2{margin-top:.5rem !important}.mt-sm-3{margin-top:1rem !important}.mt-sm-4{margin-top:1.5rem !important}.mt-sm-5{margin-top:3rem !important}.mt-sm-auto{margin-top:auto !important}.me-sm-0{margin-right:0 !important}.me-sm-1{margin-right:.25rem !important}.me-sm-2{margin-right:.5rem !important}.me-sm-3{margin-right:1rem !important}.me-sm-4{margin-right:1.5rem !important}.me-sm-5{margin-right:3rem !important}.me-sm-auto{margin-right:auto !important}.mb-sm-0{margin-bottom:0 !important}.mb-sm-1{margin-bottom:.25rem !important}.mb-sm-2{margin-bottom:.5rem !important}.mb-sm-3{margin-bottom:1rem !important}.mb-sm-4{margin-bottom:1.5rem !important}.mb-sm-5{margin-bottom:3rem !important}.mb-sm-auto{margin-bottom:auto !important}.ms-sm-0{margin-left:0 !important}.ms-sm-1{margin-left:.25rem !important}.ms-sm-2{margin-left:.5rem !important}.ms-sm-3{margin-left:1rem !important}.ms-sm-4{margin-left:1.5rem !important}.ms-sm-5{margin-left:3rem !important}.ms-sm-auto{margin-left:auto !important}.p-sm-0{padding:0 !important}.p-sm-1{padding:.25rem !important}.p-sm-2{padding:.5rem !important}.p-sm-3{padding:1rem !important}.p-sm-4{padding:1.5rem !important}.p-sm-5{padding:3rem !important}.px-sm-0{padding-right:0 !important;padding-left:0 !important}.px-sm-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-sm-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-sm-3{padding-right:1rem !important;padding-left:1rem !important}.px-sm-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-sm-5{padding-right:3rem !important;padding-left:3rem !important}.py-sm-0{padding-top:0 !important;padding-bottom:0 !important}.py-sm-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-sm-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-sm-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-sm-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-sm-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-sm-0{padding-top:0 !important}.pt-sm-1{padding-top:.25rem !important}.pt-sm-2{padding-top:.5rem !important}.pt-sm-3{padding-top:1rem !important}.pt-sm-4{padding-top:1.5rem !important}.pt-sm-5{padding-top:3rem !important}.pe-sm-0{padding-right:0 !important}.pe-sm-1{padding-right:.25rem !important}.pe-sm-2{padding-right:.5rem !important}.pe-sm-3{padding-right:1rem !important}.pe-sm-4{padding-right:1.5rem !important}.pe-sm-5{padding-right:3rem !important}.pb-sm-0{padding-bottom:0 !important}.pb-sm-1{padding-bottom:.25rem !important}.pb-sm-2{padding-bottom:.5rem !important}.pb-sm-3{padding-bottom:1rem !important}.pb-sm-4{padding-bottom:1.5rem !important}.pb-sm-5{padding-bottom:3rem !important}.ps-sm-0{padding-left:0 !important}.ps-sm-1{padding-left:.25rem !important}.ps-sm-2{padding-left:.5rem !important}.ps-sm-3{padding-left:1rem !important}.ps-sm-4{padding-left:1.5rem !important}.ps-sm-5{padding-left:3rem !important}.gap-sm-0{gap:0 !important}.gap-sm-1{gap:.25rem !important}.gap-sm-2{gap:.5rem !important}.gap-sm-3{gap:1rem !important}.gap-sm-4{gap:1.5rem !important}.gap-sm-5{gap:3rem !important}.row-gap-sm-0{row-gap:0 !important}.row-gap-sm-1{row-gap:.25rem !important}.row-gap-sm-2{row-gap:.5rem !important}.row-gap-sm-3{row-gap:1rem !important}.row-gap-sm-4{row-gap:1.5rem !important}.row-gap-sm-5{row-gap:3rem !important}.column-gap-sm-0{column-gap:0 !important}.column-gap-sm-1{column-gap:.25rem !important}.column-gap-sm-2{column-gap:.5rem !important}.column-gap-sm-3{column-gap:1rem !important}.column-gap-sm-4{column-gap:1.5rem !important}.column-gap-sm-5{column-gap:3rem !important}.text-sm-start{text-align:left !important}.text-sm-end{text-align:right !important}.text-sm-center{text-align:center !important}}@media (min-width: 768px){.float-md-start{float:left !important}.float-md-end{float:right !important}.float-md-none{float:none !important}.object-fit-md-contain{object-fit:contain !important}.object-fit-md-cover{object-fit:cover !important}.object-fit-md-fill{object-fit:fill !important}.object-fit-md-scale{object-fit:scale-down !important}.object-fit-md-none{object-fit:none !important}.d-md-inline{display:inline !important}.d-md-inline-block{display:inline-block !important}.d-md-block{display:block !important}.d-md-grid{display:grid !important}.d-md-inline-grid{display:inline-grid !important}.d-md-table{display:table !important}.d-md-table-row{display:table-row !important}.d-md-table-cell{display:table-cell !important}.d-md-flex{display:flex !important}.d-md-inline-flex{display:inline-flex !important}.d-md-none{display:none !important}.flex-md-fill{flex:1 1 auto !important}.flex-md-row{flex-direction:row !important}.flex-md-column{flex-direction:column !important}.flex-md-row-reverse{flex-direction:row-reverse !important}.flex-md-column-reverse{flex-direction:column-reverse !important}.flex-md-grow-0{flex-grow:0 !important}.flex-md-grow-1{flex-grow:1 !important}.flex-md-shrink-0{flex-shrink:0 !important}.flex-md-shrink-1{flex-shrink:1 !important}.flex-md-wrap{flex-wrap:wrap !important}.flex-md-nowrap{flex-wrap:nowrap !important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-md-start{justify-content:flex-start !important}.justify-content-md-end{justify-content:flex-end !important}.justify-content-md-center{justify-content:center !important}.justify-content-md-between{justify-content:space-between !important}.justify-content-md-around{justify-content:space-around !important}.justify-content-md-evenly{justify-content:space-evenly !important}.align-items-md-start{align-items:flex-start !important}.align-items-md-end{align-items:flex-end !important}.align-items-md-center{align-items:center !important}.align-items-md-baseline{align-items:baseline !important}.align-items-md-stretch{align-items:stretch !important}.align-content-md-start{align-content:flex-start !important}.align-content-md-end{align-content:flex-end !important}.align-content-md-center{align-content:center !important}.align-content-md-between{align-content:space-between !important}.align-content-md-around{align-content:space-around !important}.align-content-md-stretch{align-content:stretch !important}.align-self-md-auto{align-self:auto !important}.align-self-md-start{align-self:flex-start !important}.align-self-md-end{align-self:flex-end !important}.align-self-md-center{align-self:center !important}.align-self-md-baseline{align-self:baseline !important}.align-self-md-stretch{align-self:stretch !important}.order-md-first{order:-1 !important}.order-md-0{order:0 !important}.order-md-1{order:1 !important}.order-md-2{order:2 !important}.order-md-3{order:3 !important}.order-md-4{order:4 !important}.order-md-5{order:5 !important}.order-md-last{order:6 !important}.m-md-0{margin:0 !important}.m-md-1{margin:.25rem !important}.m-md-2{margin:.5rem !important}.m-md-3{margin:1rem !important}.m-md-4{margin:1.5rem !important}.m-md-5{margin:3rem !important}.m-md-auto{margin:auto !important}.mx-md-0{margin-right:0 !important;margin-left:0 !important}.mx-md-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-md-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-md-3{margin-right:1rem !important;margin-left:1rem !important}.mx-md-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-md-5{margin-right:3rem !important;margin-left:3rem !important}.mx-md-auto{margin-right:auto !important;margin-left:auto !important}.my-md-0{margin-top:0 !important;margin-bottom:0 !important}.my-md-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-md-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-md-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-md-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-md-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-md-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-md-0{margin-top:0 !important}.mt-md-1{margin-top:.25rem !important}.mt-md-2{margin-top:.5rem !important}.mt-md-3{margin-top:1rem !important}.mt-md-4{margin-top:1.5rem !important}.mt-md-5{margin-top:3rem !important}.mt-md-auto{margin-top:auto !important}.me-md-0{margin-right:0 !important}.me-md-1{margin-right:.25rem !important}.me-md-2{margin-right:.5rem !important}.me-md-3{margin-right:1rem !important}.me-md-4{margin-right:1.5rem !important}.me-md-5{margin-right:3rem !important}.me-md-auto{margin-right:auto !important}.mb-md-0{margin-bottom:0 !important}.mb-md-1{margin-bottom:.25rem !important}.mb-md-2{margin-bottom:.5rem !important}.mb-md-3{margin-bottom:1rem !important}.mb-md-4{margin-bottom:1.5rem !important}.mb-md-5{margin-bottom:3rem !important}.mb-md-auto{margin-bottom:auto !important}.ms-md-0{margin-left:0 !important}.ms-md-1{margin-left:.25rem !important}.ms-md-2{margin-left:.5rem !important}.ms-md-3{margin-left:1rem !important}.ms-md-4{margin-left:1.5rem !important}.ms-md-5{margin-left:3rem !important}.ms-md-auto{margin-left:auto !important}.p-md-0{padding:0 !important}.p-md-1{padding:.25rem !important}.p-md-2{padding:.5rem !important}.p-md-3{padding:1rem !important}.p-md-4{padding:1.5rem !important}.p-md-5{padding:3rem !important}.px-md-0{padding-right:0 !important;padding-left:0 !important}.px-md-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-md-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-md-3{padding-right:1rem !important;padding-left:1rem !important}.px-md-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-md-5{padding-right:3rem !important;padding-left:3rem !important}.py-md-0{padding-top:0 !important;padding-bottom:0 !important}.py-md-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-md-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-md-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-md-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-md-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-md-0{padding-top:0 !important}.pt-md-1{padding-top:.25rem !important}.pt-md-2{padding-top:.5rem !important}.pt-md-3{padding-top:1rem !important}.pt-md-4{padding-top:1.5rem !important}.pt-md-5{padding-top:3rem !important}.pe-md-0{padding-right:0 !important}.pe-md-1{padding-right:.25rem !important}.pe-md-2{padding-right:.5rem !important}.pe-md-3{padding-right:1rem !important}.pe-md-4{padding-right:1.5rem !important}.pe-md-5{padding-right:3rem !important}.pb-md-0{padding-bottom:0 !important}.pb-md-1{padding-bottom:.25rem !important}.pb-md-2{padding-bottom:.5rem !important}.pb-md-3{padding-bottom:1rem !important}.pb-md-4{padding-bottom:1.5rem !important}.pb-md-5{padding-bottom:3rem !important}.ps-md-0{padding-left:0 !important}.ps-md-1{padding-left:.25rem !important}.ps-md-2{padding-left:.5rem !important}.ps-md-3{padding-left:1rem !important}.ps-md-4{padding-left:1.5rem !important}.ps-md-5{padding-left:3rem !important}.gap-md-0{gap:0 !important}.gap-md-1{gap:.25rem !important}.gap-md-2{gap:.5rem !important}.gap-md-3{gap:1rem !important}.gap-md-4{gap:1.5rem !important}.gap-md-5{gap:3rem !important}.row-gap-md-0{row-gap:0 !important}.row-gap-md-1{row-gap:.25rem !important}.row-gap-md-2{row-gap:.5rem !important}.row-gap-md-3{row-gap:1rem !important}.row-gap-md-4{row-gap:1.5rem !important}.row-gap-md-5{row-gap:3rem !important}.column-gap-md-0{column-gap:0 !important}.column-gap-md-1{column-gap:.25rem !important}.column-gap-md-2{column-gap:.5rem !important}.column-gap-md-3{column-gap:1rem !important}.column-gap-md-4{column-gap:1.5rem !important}.column-gap-md-5{column-gap:3rem !important}.text-md-start{text-align:left !important}.text-md-end{text-align:right !important}.text-md-center{text-align:center !important}}@media (min-width: 992px){.float-lg-start{float:left !important}.float-lg-end{float:right !important}.float-lg-none{float:none !important}.object-fit-lg-contain{object-fit:contain !important}.object-fit-lg-cover{object-fit:cover !important}.object-fit-lg-fill{object-fit:fill !important}.object-fit-lg-scale{object-fit:scale-down !important}.object-fit-lg-none{object-fit:none !important}.d-lg-inline{display:inline !important}.d-lg-inline-block{display:inline-block !important}.d-lg-block{display:block !important}.d-lg-grid{display:grid !important}.d-lg-inline-grid{display:inline-grid !important}.d-lg-table{display:table !important}.d-lg-table-row{display:table-row !important}.d-lg-table-cell{display:table-cell !important}.d-lg-flex{display:flex !important}.d-lg-inline-flex{display:inline-flex !important}.d-lg-none{display:none !important}.flex-lg-fill{flex:1 1 auto !important}.flex-lg-row{flex-direction:row !important}.flex-lg-column{flex-direction:column !important}.flex-lg-row-reverse{flex-direction:row-reverse !important}.flex-lg-column-reverse{flex-direction:column-reverse !important}.flex-lg-grow-0{flex-grow:0 !important}.flex-lg-grow-1{flex-grow:1 !important}.flex-lg-shrink-0{flex-shrink:0 !important}.flex-lg-shrink-1{flex-shrink:1 !important}.flex-lg-wrap{flex-wrap:wrap !important}.flex-lg-nowrap{flex-wrap:nowrap !important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-lg-start{justify-content:flex-start !important}.justify-content-lg-end{justify-content:flex-end !important}.justify-content-lg-center{justify-content:center !important}.justify-content-lg-between{justify-content:space-between !important}.justify-content-lg-around{justify-content:space-around !important}.justify-content-lg-evenly{justify-content:space-evenly !important}.align-items-lg-start{align-items:flex-start !important}.align-items-lg-end{align-items:flex-end !important}.align-items-lg-center{align-items:center !important}.align-items-lg-baseline{align-items:baseline !important}.align-items-lg-stretch{align-items:stretch !important}.align-content-lg-start{align-content:flex-start !important}.align-content-lg-end{align-content:flex-end !important}.align-content-lg-center{align-content:center !important}.align-content-lg-between{align-content:space-between !important}.align-content-lg-around{align-content:space-around !important}.align-content-lg-stretch{align-content:stretch !important}.align-self-lg-auto{align-self:auto !important}.align-self-lg-start{align-self:flex-start !important}.align-self-lg-end{align-self:flex-end !important}.align-self-lg-center{align-self:center !important}.align-self-lg-baseline{align-self:baseline !important}.align-self-lg-stretch{align-self:stretch !important}.order-lg-first{order:-1 !important}.order-lg-0{order:0 !important}.order-lg-1{order:1 !important}.order-lg-2{order:2 !important}.order-lg-3{order:3 !important}.order-lg-4{order:4 !important}.order-lg-5{order:5 !important}.order-lg-last{order:6 !important}.m-lg-0{margin:0 !important}.m-lg-1{margin:.25rem !important}.m-lg-2{margin:.5rem !important}.m-lg-3{margin:1rem !important}.m-lg-4{margin:1.5rem !important}.m-lg-5{margin:3rem !important}.m-lg-auto{margin:auto !important}.mx-lg-0{margin-right:0 !important;margin-left:0 !important}.mx-lg-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-lg-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-lg-3{margin-right:1rem !important;margin-left:1rem !important}.mx-lg-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-lg-5{margin-right:3rem !important;margin-left:3rem !important}.mx-lg-auto{margin-right:auto !important;margin-left:auto !important}.my-lg-0{margin-top:0 !important;margin-bottom:0 !important}.my-lg-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-lg-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-lg-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-lg-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-lg-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-lg-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-lg-0{margin-top:0 !important}.mt-lg-1{margin-top:.25rem !important}.mt-lg-2{margin-top:.5rem !important}.mt-lg-3{margin-top:1rem !important}.mt-lg-4{margin-top:1.5rem !important}.mt-lg-5{margin-top:3rem !important}.mt-lg-auto{margin-top:auto !important}.me-lg-0{margin-right:0 !important}.me-lg-1{margin-right:.25rem !important}.me-lg-2{margin-right:.5rem !important}.me-lg-3{margin-right:1rem !important}.me-lg-4{margin-right:1.5rem !important}.me-lg-5{margin-right:3rem !important}.me-lg-auto{margin-right:auto !important}.mb-lg-0{margin-bottom:0 !important}.mb-lg-1{margin-bottom:.25rem !important}.mb-lg-2{margin-bottom:.5rem !important}.mb-lg-3{margin-bottom:1rem !important}.mb-lg-4{margin-bottom:1.5rem !important}.mb-lg-5{margin-bottom:3rem !important}.mb-lg-auto{margin-bottom:auto !important}.ms-lg-0{margin-left:0 !important}.ms-lg-1{margin-left:.25rem !important}.ms-lg-2{margin-left:.5rem !important}.ms-lg-3{margin-left:1rem !important}.ms-lg-4{margin-left:1.5rem !important}.ms-lg-5{margin-left:3rem !important}.ms-lg-auto{margin-left:auto !important}.p-lg-0{padding:0 !important}.p-lg-1{padding:.25rem !important}.p-lg-2{padding:.5rem !important}.p-lg-3{padding:1rem !important}.p-lg-4{padding:1.5rem !important}.p-lg-5{padding:3rem !important}.px-lg-0{padding-right:0 !important;padding-left:0 !important}.px-lg-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-lg-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-lg-3{padding-right:1rem !important;padding-left:1rem !important}.px-lg-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-lg-5{padding-right:3rem !important;padding-left:3rem !important}.py-lg-0{padding-top:0 !important;padding-bottom:0 !important}.py-lg-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-lg-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-lg-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-lg-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-lg-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-lg-0{padding-top:0 !important}.pt-lg-1{padding-top:.25rem !important}.pt-lg-2{padding-top:.5rem !important}.pt-lg-3{padding-top:1rem !important}.pt-lg-4{padding-top:1.5rem !important}.pt-lg-5{padding-top:3rem !important}.pe-lg-0{padding-right:0 !important}.pe-lg-1{padding-right:.25rem !important}.pe-lg-2{padding-right:.5rem !important}.pe-lg-3{padding-right:1rem !important}.pe-lg-4{padding-right:1.5rem !important}.pe-lg-5{padding-right:3rem !important}.pb-lg-0{padding-bottom:0 !important}.pb-lg-1{padding-bottom:.25rem !important}.pb-lg-2{padding-bottom:.5rem !important}.pb-lg-3{padding-bottom:1rem !important}.pb-lg-4{padding-bottom:1.5rem !important}.pb-lg-5{padding-bottom:3rem !important}.ps-lg-0{padding-left:0 !important}.ps-lg-1{padding-left:.25rem !important}.ps-lg-2{padding-left:.5rem !important}.ps-lg-3{padding-left:1rem !important}.ps-lg-4{padding-left:1.5rem !important}.ps-lg-5{padding-left:3rem !important}.gap-lg-0{gap:0 !important}.gap-lg-1{gap:.25rem !important}.gap-lg-2{gap:.5rem !important}.gap-lg-3{gap:1rem !important}.gap-lg-4{gap:1.5rem !important}.gap-lg-5{gap:3rem !important}.row-gap-lg-0{row-gap:0 !important}.row-gap-lg-1{row-gap:.25rem !important}.row-gap-lg-2{row-gap:.5rem !important}.row-gap-lg-3{row-gap:1rem !important}.row-gap-lg-4{row-gap:1.5rem !important}.row-gap-lg-5{row-gap:3rem !important}.column-gap-lg-0{column-gap:0 !important}.column-gap-lg-1{column-gap:.25rem !important}.column-gap-lg-2{column-gap:.5rem !important}.column-gap-lg-3{column-gap:1rem !important}.column-gap-lg-4{column-gap:1.5rem !important}.column-gap-lg-5{column-gap:3rem !important}.text-lg-start{text-align:left !important}.text-lg-end{text-align:right !important}.text-lg-center{text-align:center !important}}@media (min-width: 1200px){.float-xl-start{float:left !important}.float-xl-end{float:right !important}.float-xl-none{float:none !important}.object-fit-xl-contain{object-fit:contain !important}.object-fit-xl-cover{object-fit:cover !important}.object-fit-xl-fill{object-fit:fill !important}.object-fit-xl-scale{object-fit:scale-down !important}.object-fit-xl-none{object-fit:none !important}.d-xl-inline{display:inline !important}.d-xl-inline-block{display:inline-block !important}.d-xl-block{display:block !important}.d-xl-grid{display:grid !important}.d-xl-inline-grid{display:inline-grid !important}.d-xl-table{display:table !important}.d-xl-table-row{display:table-row !important}.d-xl-table-cell{display:table-cell !important}.d-xl-flex{display:flex !important}.d-xl-inline-flex{display:inline-flex !important}.d-xl-none{display:none !important}.flex-xl-fill{flex:1 1 auto !important}.flex-xl-row{flex-direction:row !important}.flex-xl-column{flex-direction:column !important}.flex-xl-row-reverse{flex-direction:row-reverse !important}.flex-xl-column-reverse{flex-direction:column-reverse !important}.flex-xl-grow-0{flex-grow:0 !important}.flex-xl-grow-1{flex-grow:1 !important}.flex-xl-shrink-0{flex-shrink:0 !important}.flex-xl-shrink-1{flex-shrink:1 !important}.flex-xl-wrap{flex-wrap:wrap !important}.flex-xl-nowrap{flex-wrap:nowrap !important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-xl-start{justify-content:flex-start !important}.justify-content-xl-end{justify-content:flex-end !important}.justify-content-xl-center{justify-content:center !important}.justify-content-xl-between{justify-content:space-between !important}.justify-content-xl-around{justify-content:space-around !important}.justify-content-xl-evenly{justify-content:space-evenly !important}.align-items-xl-start{align-items:flex-start !important}.align-items-xl-end{align-items:flex-end !important}.align-items-xl-center{align-items:center !important}.align-items-xl-baseline{align-items:baseline !important}.align-items-xl-stretch{align-items:stretch !important}.align-content-xl-start{align-content:flex-start !important}.align-content-xl-end{align-content:flex-end !important}.align-content-xl-center{align-content:center !important}.align-content-xl-between{align-content:space-between !important}.align-content-xl-around{align-content:space-around !important}.align-content-xl-stretch{align-content:stretch !important}.align-self-xl-auto{align-self:auto !important}.align-self-xl-start{align-self:flex-start !important}.align-self-xl-end{align-self:flex-end !important}.align-self-xl-center{align-self:center !important}.align-self-xl-baseline{align-self:baseline !important}.align-self-xl-stretch{align-self:stretch !important}.order-xl-first{order:-1 !important}.order-xl-0{order:0 !important}.order-xl-1{order:1 !important}.order-xl-2{order:2 !important}.order-xl-3{order:3 !important}.order-xl-4{order:4 !important}.order-xl-5{order:5 !important}.order-xl-last{order:6 !important}.m-xl-0{margin:0 !important}.m-xl-1{margin:.25rem !important}.m-xl-2{margin:.5rem !important}.m-xl-3{margin:1rem !important}.m-xl-4{margin:1.5rem !important}.m-xl-5{margin:3rem !important}.m-xl-auto{margin:auto !important}.mx-xl-0{margin-right:0 !important;margin-left:0 !important}.mx-xl-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-xl-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-xl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xl-5{margin-right:3rem !important;margin-left:3rem !important}.mx-xl-auto{margin-right:auto !important;margin-left:auto !important}.my-xl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xl-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-xl-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-xl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xl-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-xl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xl-0{margin-top:0 !important}.mt-xl-1{margin-top:.25rem !important}.mt-xl-2{margin-top:.5rem !important}.mt-xl-3{margin-top:1rem !important}.mt-xl-4{margin-top:1.5rem !important}.mt-xl-5{margin-top:3rem !important}.mt-xl-auto{margin-top:auto !important}.me-xl-0{margin-right:0 !important}.me-xl-1{margin-right:.25rem !important}.me-xl-2{margin-right:.5rem !important}.me-xl-3{margin-right:1rem !important}.me-xl-4{margin-right:1.5rem !important}.me-xl-5{margin-right:3rem !important}.me-xl-auto{margin-right:auto !important}.mb-xl-0{margin-bottom:0 !important}.mb-xl-1{margin-bottom:.25rem !important}.mb-xl-2{margin-bottom:.5rem !important}.mb-xl-3{margin-bottom:1rem !important}.mb-xl-4{margin-bottom:1.5rem !important}.mb-xl-5{margin-bottom:3rem !important}.mb-xl-auto{margin-bottom:auto !important}.ms-xl-0{margin-left:0 !important}.ms-xl-1{margin-left:.25rem !important}.ms-xl-2{margin-left:.5rem !important}.ms-xl-3{margin-left:1rem !important}.ms-xl-4{margin-left:1.5rem !important}.ms-xl-5{margin-left:3rem !important}.ms-xl-auto{margin-left:auto !important}.p-xl-0{padding:0 !important}.p-xl-1{padding:.25rem !important}.p-xl-2{padding:.5rem !important}.p-xl-3{padding:1rem !important}.p-xl-4{padding:1.5rem !important}.p-xl-5{padding:3rem !important}.px-xl-0{padding-right:0 !important;padding-left:0 !important}.px-xl-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-xl-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-xl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xl-5{padding-right:3rem !important;padding-left:3rem !important}.py-xl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xl-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-xl-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-xl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xl-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-xl-0{padding-top:0 !important}.pt-xl-1{padding-top:.25rem !important}.pt-xl-2{padding-top:.5rem !important}.pt-xl-3{padding-top:1rem !important}.pt-xl-4{padding-top:1.5rem !important}.pt-xl-5{padding-top:3rem !important}.pe-xl-0{padding-right:0 !important}.pe-xl-1{padding-right:.25rem !important}.pe-xl-2{padding-right:.5rem !important}.pe-xl-3{padding-right:1rem !important}.pe-xl-4{padding-right:1.5rem !important}.pe-xl-5{padding-right:3rem !important}.pb-xl-0{padding-bottom:0 !important}.pb-xl-1{padding-bottom:.25rem !important}.pb-xl-2{padding-bottom:.5rem !important}.pb-xl-3{padding-bottom:1rem !important}.pb-xl-4{padding-bottom:1.5rem !important}.pb-xl-5{padding-bottom:3rem !important}.ps-xl-0{padding-left:0 !important}.ps-xl-1{padding-left:.25rem !important}.ps-xl-2{padding-left:.5rem !important}.ps-xl-3{padding-left:1rem !important}.ps-xl-4{padding-left:1.5rem !important}.ps-xl-5{padding-left:3rem !important}.gap-xl-0{gap:0 !important}.gap-xl-1{gap:.25rem !important}.gap-xl-2{gap:.5rem !important}.gap-xl-3{gap:1rem !important}.gap-xl-4{gap:1.5rem !important}.gap-xl-5{gap:3rem !important}.row-gap-xl-0{row-gap:0 !important}.row-gap-xl-1{row-gap:.25rem !important}.row-gap-xl-2{row-gap:.5rem !important}.row-gap-xl-3{row-gap:1rem !important}.row-gap-xl-4{row-gap:1.5rem !important}.row-gap-xl-5{row-gap:3rem !important}.column-gap-xl-0{column-gap:0 !important}.column-gap-xl-1{column-gap:.25rem !important}.column-gap-xl-2{column-gap:.5rem !important}.column-gap-xl-3{column-gap:1rem !important}.column-gap-xl-4{column-gap:1.5rem !important}.column-gap-xl-5{column-gap:3rem !important}.text-xl-start{text-align:left !important}.text-xl-end{text-align:right !important}.text-xl-center{text-align:center !important}}@media (min-width: 1400px){.float-xxl-start{float:left !important}.float-xxl-end{float:right !important}.float-xxl-none{float:none !important}.object-fit-xxl-contain{object-fit:contain !important}.object-fit-xxl-cover{object-fit:cover !important}.object-fit-xxl-fill{object-fit:fill !important}.object-fit-xxl-scale{object-fit:scale-down !important}.object-fit-xxl-none{object-fit:none !important}.d-xxl-inline{display:inline !important}.d-xxl-inline-block{display:inline-block !important}.d-xxl-block{display:block !important}.d-xxl-grid{display:grid !important}.d-xxl-inline-grid{display:inline-grid !important}.d-xxl-table{display:table !important}.d-xxl-table-row{display:table-row !important}.d-xxl-table-cell{display:table-cell !important}.d-xxl-flex{display:flex !important}.d-xxl-inline-flex{display:inline-flex !important}.d-xxl-none{display:none !important}.flex-xxl-fill{flex:1 1 auto !important}.flex-xxl-row{flex-direction:row !important}.flex-xxl-column{flex-direction:column !important}.flex-xxl-row-reverse{flex-direction:row-reverse !important}.flex-xxl-column-reverse{flex-direction:column-reverse !important}.flex-xxl-grow-0{flex-grow:0 !important}.flex-xxl-grow-1{flex-grow:1 !important}.flex-xxl-shrink-0{flex-shrink:0 !important}.flex-xxl-shrink-1{flex-shrink:1 !important}.flex-xxl-wrap{flex-wrap:wrap !important}.flex-xxl-nowrap{flex-wrap:nowrap !important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-xxl-start{justify-content:flex-start !important}.justify-content-xxl-end{justify-content:flex-end !important}.justify-content-xxl-center{justify-content:center !important}.justify-content-xxl-between{justify-content:space-between !important}.justify-content-xxl-around{justify-content:space-around !important}.justify-content-xxl-evenly{justify-content:space-evenly !important}.align-items-xxl-start{align-items:flex-start !important}.align-items-xxl-end{align-items:flex-end !important}.align-items-xxl-center{align-items:center !important}.align-items-xxl-baseline{align-items:baseline !important}.align-items-xxl-stretch{align-items:stretch !important}.align-content-xxl-start{align-content:flex-start !important}.align-content-xxl-end{align-content:flex-end !important}.align-content-xxl-center{align-content:center !important}.align-content-xxl-between{align-content:space-between !important}.align-content-xxl-around{align-content:space-around !important}.align-content-xxl-stretch{align-content:stretch !important}.align-self-xxl-auto{align-self:auto !important}.align-self-xxl-start{align-self:flex-start !important}.align-self-xxl-end{align-self:flex-end !important}.align-self-xxl-center{align-self:center !important}.align-self-xxl-baseline{align-self:baseline !important}.align-self-xxl-stretch{align-self:stretch !important}.order-xxl-first{order:-1 !important}.order-xxl-0{order:0 !important}.order-xxl-1{order:1 !important}.order-xxl-2{order:2 !important}.order-xxl-3{order:3 !important}.order-xxl-4{order:4 !important}.order-xxl-5{order:5 !important}.order-xxl-last{order:6 !important}.m-xxl-0{margin:0 !important}.m-xxl-1{margin:.25rem !important}.m-xxl-2{margin:.5rem !important}.m-xxl-3{margin:1rem !important}.m-xxl-4{margin:1.5rem !important}.m-xxl-5{margin:3rem !important}.m-xxl-auto{margin:auto !important}.mx-xxl-0{margin-right:0 !important;margin-left:0 !important}.mx-xxl-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-xxl-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-xxl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xxl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xxl-5{margin-right:3rem !important;margin-left:3rem !important}.mx-xxl-auto{margin-right:auto !important;margin-left:auto !important}.my-xxl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xxl-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-xxl-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-xxl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xxl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xxl-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-xxl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xxl-0{margin-top:0 !important}.mt-xxl-1{margin-top:.25rem !important}.mt-xxl-2{margin-top:.5rem !important}.mt-xxl-3{margin-top:1rem !important}.mt-xxl-4{margin-top:1.5rem !important}.mt-xxl-5{margin-top:3rem !important}.mt-xxl-auto{margin-top:auto !important}.me-xxl-0{margin-right:0 !important}.me-xxl-1{margin-right:.25rem !important}.me-xxl-2{margin-right:.5rem !important}.me-xxl-3{margin-right:1rem !important}.me-xxl-4{margin-right:1.5rem !important}.me-xxl-5{margin-right:3rem !important}.me-xxl-auto{margin-right:auto !important}.mb-xxl-0{margin-bottom:0 !important}.mb-xxl-1{margin-bottom:.25rem !important}.mb-xxl-2{margin-bottom:.5rem !important}.mb-xxl-3{margin-bottom:1rem !important}.mb-xxl-4{margin-bottom:1.5rem !important}.mb-xxl-5{margin-bottom:3rem !important}.mb-xxl-auto{margin-bottom:auto !important}.ms-xxl-0{margin-left:0 !important}.ms-xxl-1{margin-left:.25rem !important}.ms-xxl-2{margin-left:.5rem !important}.ms-xxl-3{margin-left:1rem !important}.ms-xxl-4{margin-left:1.5rem !important}.ms-xxl-5{margin-left:3rem !important}.ms-xxl-auto{margin-left:auto !important}.p-xxl-0{padding:0 !important}.p-xxl-1{padding:.25rem !important}.p-xxl-2{padding:.5rem !important}.p-xxl-3{padding:1rem !important}.p-xxl-4{padding:1.5rem !important}.p-xxl-5{padding:3rem !important}.px-xxl-0{padding-right:0 !important;padding-left:0 !important}.px-xxl-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-xxl-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-xxl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xxl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xxl-5{padding-right:3rem !important;padding-left:3rem !important}.py-xxl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xxl-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-xxl-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-xxl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xxl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xxl-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-xxl-0{padding-top:0 !important}.pt-xxl-1{padding-top:.25rem !important}.pt-xxl-2{padding-top:.5rem !important}.pt-xxl-3{padding-top:1rem !important}.pt-xxl-4{padding-top:1.5rem !important}.pt-xxl-5{padding-top:3rem !important}.pe-xxl-0{padding-right:0 !important}.pe-xxl-1{padding-right:.25rem !important}.pe-xxl-2{padding-right:.5rem !important}.pe-xxl-3{padding-right:1rem !important}.pe-xxl-4{padding-right:1.5rem !important}.pe-xxl-5{padding-right:3rem !important}.pb-xxl-0{padding-bottom:0 !important}.pb-xxl-1{padding-bottom:.25rem !important}.pb-xxl-2{padding-bottom:.5rem !important}.pb-xxl-3{padding-bottom:1rem !important}.pb-xxl-4{padding-bottom:1.5rem !important}.pb-xxl-5{padding-bottom:3rem !important}.ps-xxl-0{padding-left:0 !important}.ps-xxl-1{padding-left:.25rem !important}.ps-xxl-2{padding-left:.5rem !important}.ps-xxl-3{padding-left:1rem !important}.ps-xxl-4{padding-left:1.5rem !important}.ps-xxl-5{padding-left:3rem !important}.gap-xxl-0{gap:0 !important}.gap-xxl-1{gap:.25rem !important}.gap-xxl-2{gap:.5rem !important}.gap-xxl-3{gap:1rem !important}.gap-xxl-4{gap:1.5rem !important}.gap-xxl-5{gap:3rem !important}.row-gap-xxl-0{row-gap:0 !important}.row-gap-xxl-1{row-gap:.25rem !important}.row-gap-xxl-2{row-gap:.5rem !important}.row-gap-xxl-3{row-gap:1rem !important}.row-gap-xxl-4{row-gap:1.5rem !important}.row-gap-xxl-5{row-gap:3rem !important}.column-gap-xxl-0{column-gap:0 !important}.column-gap-xxl-1{column-gap:.25rem !important}.column-gap-xxl-2{column-gap:.5rem !important}.column-gap-xxl-3{column-gap:1rem !important}.column-gap-xxl-4{column-gap:1.5rem !important}.column-gap-xxl-5{column-gap:3rem !important}.text-xxl-start{text-align:left !important}.text-xxl-end{text-align:right !important}.text-xxl-center{text-align:center !important}}@media (min-width: 1200px){.fs-1{font-size:2.5rem !important}.fs-2{font-size:2rem !important}.fs-3{font-size:1.75rem !important}.fs-4{font-size:1.5rem !important}}@media print{.d-print-inline{display:inline !important}.d-print-inline-block{display:inline-block !important}.d-print-block{display:block !important}.d-print-grid{display:grid !important}.d-print-inline-grid{display:inline-grid !important}.d-print-table{display:table !important}.d-print-table-row{display:table-row !important}.d-print-table-cell{display:table-cell !important}.d-print-flex{display:flex !important}.d-print-inline-flex{display:inline-flex !important}.d-print-none{display:none !important}}\n`, "",{"version":3,"sources":["webpack://./src/index.scss","webpack://./node_modules/bootstrap/scss/mixins/_banner.scss","webpack://./node_modules/bootstrap/scss/_root.scss","webpack://./node_modules/bootstrap/scss/vendor/_rfs.scss","webpack://./node_modules/bootstrap/scss/_reboot.scss","webpack://./node_modules/bootstrap/scss/_variables.scss","webpack://./node_modules/bootstrap/scss/mixins/_border-radius.scss","webpack://./node_modules/bootstrap/scss/_type.scss","webpack://./node_modules/bootstrap/scss/mixins/_lists.scss","webpack://./node_modules/bootstrap/scss/mixins/_image.scss","webpack://./node_modules/bootstrap/scss/_images.scss","webpack://./node_modules/bootstrap/scss/mixins/_container.scss","webpack://./node_modules/bootstrap/scss/mixins/_breakpoints.scss","webpack://./node_modules/bootstrap/scss/_containers.scss","webpack://./node_modules/bootstrap/scss/_grid.scss","webpack://./node_modules/bootstrap/scss/mixins/_grid.scss","webpack://./node_modules/bootstrap/scss/_tables.scss","webpack://./node_modules/bootstrap/scss/mixins/_table-variants.scss","webpack://./node_modules/bootstrap/scss/forms/_labels.scss","webpack://./node_modules/bootstrap/scss/_functions.scss","webpack://./node_modules/bootstrap/scss/forms/_form-text.scss","webpack://./node_modules/bootstrap/scss/forms/_form-control.scss","webpack://./node_modules/bootstrap/scss/mixins/_transition.scss","webpack://./node_modules/bootstrap/scss/mixins/_gradients.scss","webpack://./node_modules/bootstrap/scss/forms/_form-select.scss","webpack://./node_modules/bootstrap/scss/forms/_form-check.scss","webpack://./node_modules/bootstrap/scss/forms/_form-range.scss","webpack://./node_modules/bootstrap/scss/forms/_floating-labels.scss","webpack://./node_modules/bootstrap/scss/forms/_input-group.scss","webpack://./node_modules/bootstrap/scss/mixins/_forms.scss","webpack://./node_modules/bootstrap/scss/_buttons.scss","webpack://./node_modules/bootstrap/scss/mixins/_buttons.scss","webpack://./node_modules/bootstrap/scss/_transitions.scss","webpack://./node_modules/bootstrap/scss/_dropdown.scss","webpack://./node_modules/bootstrap/scss/mixins/_caret.scss","webpack://./node_modules/bootstrap/scss/_button-group.scss","webpack://./node_modules/bootstrap/scss/_nav.scss","webpack://./node_modules/bootstrap/scss/_navbar.scss","webpack://./node_modules/bootstrap/scss/_card.scss","webpack://./node_modules/bootstrap/scss/_accordion.scss","webpack://./node_modules/bootstrap/scss/_breadcrumb.scss","webpack://./node_modules/bootstrap/scss/_pagination.scss","webpack://./node_modules/bootstrap/scss/mixins/_pagination.scss","webpack://./node_modules/bootstrap/scss/_badge.scss","webpack://./node_modules/bootstrap/scss/_alert.scss","webpack://./node_modules/bootstrap/scss/_progress.scss","webpack://./node_modules/bootstrap/scss/_list-group.scss","webpack://./node_modules/bootstrap/scss/_close.scss","webpack://./node_modules/bootstrap/scss/_toasts.scss","webpack://./node_modules/bootstrap/scss/_modal.scss","webpack://./node_modules/bootstrap/scss/mixins/_backdrop.scss","webpack://./node_modules/bootstrap/scss/_tooltip.scss","webpack://./node_modules/bootstrap/scss/mixins/_reset-text.scss","webpack://./node_modules/bootstrap/scss/_popover.scss","webpack://./node_modules/bootstrap/scss/_carousel.scss","webpack://./node_modules/bootstrap/scss/mixins/_clearfix.scss","webpack://./node_modules/bootstrap/scss/_spinners.scss","webpack://./node_modules/bootstrap/scss/_offcanvas.scss","webpack://./node_modules/bootstrap/scss/_placeholders.scss","webpack://./node_modules/bootstrap/scss/helpers/_color-bg.scss","webpack://./node_modules/bootstrap/scss/helpers/_colored-links.scss","webpack://./node_modules/bootstrap/scss/helpers/_focus-ring.scss","webpack://./node_modules/bootstrap/scss/helpers/_icon-link.scss","webpack://./node_modules/bootstrap/scss/helpers/_ratio.scss","webpack://./node_modules/bootstrap/scss/helpers/_position.scss","webpack://./node_modules/bootstrap/scss/helpers/_stacks.scss","webpack://./node_modules/bootstrap/scss/mixins/_visually-hidden.scss","webpack://./node_modules/bootstrap/scss/helpers/_stretched-link.scss","webpack://./node_modules/bootstrap/scss/mixins/_text-truncate.scss","webpack://./node_modules/bootstrap/scss/helpers/_text-truncation.scss","webpack://./node_modules/bootstrap/scss/helpers/_vr.scss","webpack://./node_modules/bootstrap/scss/mixins/_utilities.scss","webpack://./node_modules/bootstrap/scss/utilities/_api.scss"],"names":[],"mappings":"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Cd,SAAU,CrBiMd,2BqB5LI,+BhB40BqF,CgB10BrF,SAAU,CAzEd,uBAmFI,uChB8yB+E,CgB3yB/E,SAAU,CAtFd,oCA2FI,sBhBsrBgC,CgBrrBhC,uBhBqrBgC,CgBprBhC,wBhBorBgC,CgBnrBhC,0BhBsyB2E,CkBp4B7E,sClBqiCyE,CgBr8BvE,mBAAoB,CACpB,oBAAqB,CACrB,kBAAmB,CACnB,cAAe,CACf,8ChBgsBqE,CgB/rBrE,eAAgB,CCzFd,iIjBo0B6I,CiBh0B7I,wCDhBN,oCCiBQ,eAAgB,CDsFrB,CAvGH,yEA0GI,uChB47ByE,CgB37B1E,wBASD,aAAc,CACd,UAAW,CACX,iBAA2B,CAC3B,eAAgB,CAChB,ehBwf+B,CgBvf/B,0BhB2xB6E,CgB1xB7E,4BAA6B,CAC7B,wBAAyB,CACzB,qCAAmC,CATrC,8BAYI,SAAU,CAZd,gFAiBI,eAAgB,CAChB,cAAe,CAChB,iBAWD,iEFqF8D,CEpF9D,oBhB2oBiC,CFlgB7B,iBAnE+B,CGzMjC,wCD23BuF,CgB1vB3F,uCAOI,oBhBsoB+B,CgBroB/B,qBhBqoB+B,CgBpoB/B,uBhBooB+B,CgBnoBhC,iBAID,gEFwE8D,CEvE9D,kBhBkoBgC,CFtgB5B,iBAnE+B,CGzMjC,wCD43BuF,CgB9uB3F,uCAOI,kBhB6nB8B,CgB5nB9B,mBhB4nB8B,CgB3nB9B,sBhB2nB8B,CL1gBlC,sBqBxGI,kEFuD4D,CEzDhE,yBAMI,iEFmD4D,CEzDhE,yBAUI,gEF+C4D,CE9C7D,oBAKD,UhBquB0C,CgBpuB1C,8DFwC8D,CEvC9D,ehBilBmC,CgBplBrC,mDAMI,cAAe,CANnB,uCAUI,mBAAoB,CfvLpB,qCD03BiF,CgB7sBrF,0CAeI,mBAAoB,Cf5LpB,qCD03BiF,CgB7sBrF,oCAmBsB,6DFuB0C,CE1ChE,oCAoBsB,4DFsB0C,CEtBd,aG9MhD,gEAAmD,CAEnD,aAAc,CACd,UAAW,CACX,sCnB2wBkC,CFtf9B,cAnE+B,CqB/MnC,enB+lB+B,CmB9lB/B,enBsmB+B,CmBrmB/B,0BnBy3B6E,CmBx3B7E,eAAgB,CAChB,kCnBk3BuE,CmBj3BvE,iFAA0I,CAC1I,2BAA4B,CAC5B,uCnB+9BqE,CmB99BrE,yBnB+9B2C,CmB99B3C,0DnBm3BiF,CCt3B/E,qCD03BiF,CiB73B/E,sEjBo5B4F,CiBh5B5F,wCEfN,aFgBQ,eAAgB,CEkCvB,CAlDD,mBAuBI,oBLkLiC,CKjLjC,SAAU,CAKR,6CnBIW,CmBjCjB,0DAmCI,oBnB6uBgC,CmB5uBhC,qBAAsB,CApC1B,sBAyCI,uCnBu1B+E,CmBh4BnF,4BA+CI,iBAAkB,CAClB,sCnBm1B2E,CmBl1B5E,gBAID,kBnBsuBkC,CmBruBlC,qBnBquBkC,CmBpuBlC,kBnBquBiC,CFlgB7B,iBAnE+B,CGzMjC,wCD23BuF,CmB/0B1F,gBAGC,iBnBkuBiC,CmBjuBjC,oBnBiuBiC,CmBhuBjC,iBnBiuBgC,CFtgB5B,iBAnE+B,CGzMjC,wCD43BuF,CmBx0B1F,oCAKK,gEAAmD,CACpD,YCxEH,aAAc,CACd,iBpBq6B2E,CoBp6B3E,kBpBq6BsE,CoBp6BtE,qBpBq6B+C,CoBz6BjD,8BAOI,UAAW,CACX,kBAA2C,CAC5C,oBAID,mBpB25BsE,CoB15BtE,cAAe,CACf,gBAAiB,CAHnB,sCAMI,WAAY,CACZ,mBAA4C,CAC5C,aAAc,CACf,kBAID,qCAAyC,CAEzC,aAAc,CACd,SpB04B2C,CoBz4B3C,UpBy4B2C,CoBx4B3C,gBAA8D,CAC9D,kBAAmB,CACnB,eAAgB,CAChB,wCAA+D,CAC/D,8CAA2E,CAC3E,2BAA4B,CAC5B,0BAA2B,CAC3B,uBAAwB,CACxB,0DpB24BqI,CoB14BrI,wBAAyB,CAf3B,mCnBTI,mBDm6B2C,CoB15B/C,gCAwBI,iBpBm4ByC,CoB35B7C,yBA4BI,sBpB03BqD,CoBt5BzD,wBAgCI,oBNkJiC,CMjJjC,SAAU,CACV,6CpBxBa,CoBVjB,0BAsCI,wBpB5Ba,CoB6Bb,oBpB7Ba,CoBVjB,2CA6CQ,iEAAqD,CA7C7D,wCAqDQ,iEAAqD,CArD7D,iDA2DI,wBpBjDa,CoBkDb,oBpBlDa,CoBuDX,iEAAqD,CAjE3D,2BAsEI,mBAAoB,CACpB,WAAY,CACZ,UpBk2ByC,CoB16B7C,+FAgFM,cAAe,CACf,UpBy1BuC,CoBx1BxC,aAcH,kBpBo1ByD,CoBr1B3D,+BAII,4DAA2C,CAE3C,SpB80BiC,CoB70BjC,kBAA4C,CAC5C,yCAAiE,CACjE,+BAAgC,CnBjHhC,iBD47BiC,CiB/7B/B,gDjBm8BgE,CiB/7BhE,wCGuGN,+BHtGQ,eAAgB,CGgIrB,CA1BH,qCAcM,4DAA2C,CAdjD,uCAkBM,gCpB60BwC,CoBx0BtC,4DAA2C,CAvBnD,gCA6BI,mBpBwzBuD,CoBvzBvD,cAAe,CA9BnB,kDAiCM,mBAA6C,CAC7C,aAAc,CACf,mBAKH,oBAAqB,CACrB,iBpBsyBoC,CoBryBrC,WAGC,iBAAkB,CAClB,qBAAsB,CACtB,mBAAoB,CAHtB,mDAQM,mBAAoB,CACpB,WAAY,CACZ,WpBspB2B,CoBrpB5B,gFAOC,4DAA2C,CAC5C,YCnLH,UAAW,CACX,aP+N2B,CO9N3B,SAAU,CACV,eAAgB,CAChB,4BAA6B,CAL/B,kBAQI,SAAU,CARd,wCAY8B,4DrBoBb,CqBhCjB,oCAa8B,4DrBmBb,CqBhCjB,8BAiBI,QAAS,CAjBb,kCAqBI,UrB+/B2C,CqB9/B3C,WrB8/B2C,CqB7/B3C,kBAAsE,CACtE,eAAgB,CH1BlB,wBlBkCe,CqBNb,QrB6/BwC,CC1gCxC,kBD2gC2C,CiB9gCzC,yGjBohCkI,CiBhhClI,wCIdN,kCJeQ,eAAgB,CImBrB,CAlCH,yCHFE,wBJ0MmC,COxMrC,2CAqCI,UrBw+BkC,CqBv+BlC,YrBw+BmC,CqBv+BnC,iBAAkB,CAClB,crBu+BqC,CqBt+BrC,uCrBu+ByE,CqBt+BzE,wBAAyB,CpB7BzB,kBDogCkC,CqBjhCtC,8BAgDI,UrBo+B2C,CqBn+B3C,WrBm+B2C,CqBl+B3C,eAAgB,CHpDlB,wBlBkCe,CqBoBb,QrBm+BwC,CC1gCxC,kBD2gC2C,CiB9gCzC,yGjBohCkI,CiBhhClI,wCIdN,8BJeQ,eAAgB,CI6CrB,CA5DH,qCHFE,wBJ0MmC,COxMrC,8BA+DI,UrB88BkC,CqB78BlC,YrB88BmC,CqB78BnC,iBAAkB,CAClB,crB68BqC,CqB58BrC,uCrB68ByE,CqB58BzE,wBAAyB,CpBvDzB,kBDogCkC,CqBjhCtC,qBA0EI,mBAAoB,CA1ExB,2CA6EM,0CrBg9BsF,CqB7hC5F,uCAiFM,0CrB48BsF,CqB38BvF,eCvFH,iBAAkB,CADpB,gGAMI,sDRoO4D,CQnO5D,0DRmO4D,CQlO5D,gBtBuiCwC,CsB/iC5C,qBAYI,iBAAkB,CAClB,KAAM,CACN,MAAO,CACP,SAAU,CACV,WAAY,CACZ,mBtBowBgC,CsBnwBhC,eAAgB,CAChB,gBAAiB,CACjB,sBAAuB,CACvB,kBAAmB,CACnB,mBAAoB,CACpB,+CAA6C,CAC7C,oBAAqB,CLRnB,8DjBwiCoF,CiBpiCpF,wCKpBN,qBLqBQ,eAAgB,CKKrB,CA1BH,oEA8BI,mBtBuvBgC,CsBrxBpC,8FAiCM,iBAAkB,CAjCxB,oMAsCM,oBtB4gC0C,CsB3gC1C,sBtB4gCyC,CsBnjC/C,sGA2CM,oBtBugC0C,CsBtgC1C,sBtBugCyC,CsBnjC/C,4BAiDI,oBtBigC4C,CsBhgC5C,sBtBigC2C,CsBnjC/C,2LA0DM,yCAA6F,CAC7F,6DtB2/BkF,CsBtjCxF,uNA8DQ,iBAAkB,CAClB,kBAA+D,CAC/D,UAAW,CACX,YtBm/BqC,CsBl/BrC,UAAW,CACX,kCtBg0BiE,CCh3BrE,qCD03BiF,CsB74BrF,sDA2EM,yCAA6F,CAC7F,6DtB0+BkF,CsBtjCxF,+CAkFM,qCAAmC,CAlFzC,+EAwFI,atB1Ec,CsBdlB,6FA2FM,uCtB0yB6E,CsBzyB9E,aCvFH,iBAAkB,CAClB,YAAa,CACb,cAAe,CACf,mBAAoB,CACpB,UAAW,CALb,iFAUI,iBAAkB,CAClB,aAAc,CACd,QAAS,CACT,WAAY,CAbhB,0GAoBI,SAAU,CApBd,kBA2BI,iBAAkB,CAClB,SAAU,CA5Bd,wBA+BM,SAAU,CACX,kBAWH,YAAa,CACb,kBAAmB,CACnB,sBvBouBkC,CFtf9B,cAnE+B,CyBzKnC,evByjB+B,CuBxjB/B,evBgkB+B,CuB/jB/B,0BvBm1B6E,CuBl1B7E,iBAAkB,CAClB,kBAAmB,CACnB,sCvB06B+E,CuBz6B/E,0DvBg1BiF,CCt3B/E,qCD03BiF,CuBl1BpF,kHAYC,kBvB8tBgC,CFtgB5B,iBAnE+B,CGzMjC,wCD43BuF,CuBr0B1F,kHAMC,oBvBitBiC,CFlgB7B,iBAnE+B,CGzMjC,wCD23BuF,CuB3zB1F,0DAIC,kBAAsE,CACvE,wVtBrDG,yBsBqE8B,CtBpE9B,4BsBoE8B,CANlC,yUtB/DI,yBsB8E8B,CtB7E9B,4BsB6E8B,CAflC,0IAyBI,6CAA8C,CtB1E9C,wBsB2E8B,CtB1E9B,2BsB0E8B,CA1BlC,uHtBjDI,wBsBgF8B,CtB/E9B,2BsB+E8B,CAP4B,gBC/F1D,YAAa,CACb,UAAW,CACX,iBxBu0B0C,CFrkBxC,gBAnE+B,C0B5LjC,gCxBojC4D,CwBnjC7D,eAGC,iBAAkB,CAClB,QAAS,CACT,SAAU,CACV,YAAa,CACb,cAAe,CACf,oBxBu1C4C,CwBt1C5C,gBAAiB,C1BqPf,iBAnE+B,C0B/KjC,UxByiCqB,CwBxiCrB,kCxByiCqD,CCpkCrD,qCD02C6E,CwBv3C7E,sIA+CE,aAAc,CA/ChB,0DAqDE,8CxB8hC+E,CwB3hC7E,kCV4KwD,CU3KxD,wDVwE0E,CUvE1E,2BAA4B,CAC5B,wDAA6D,CAC7D,2DVwKwD,CUpO5D,sEAgEI,8CxBmhC6E,CwBlhC7E,yDxBihC4I,CwBllChJ,0EA0EI,kCV0JwD,CUzJxD,6EVyJwD,CUpO5D,wDAkFE,8CxBigC+E,CwBnlCjF,4NAuFM,iEAAqD,CACrD,sBxB05B2F,CwBz5B3F,4DxB44BoD,CwB34BpD,qEV0IsD,CUpO5D,oEA+FI,8CxBo/B6E,CwBn/B7E,yDxBk/B4I,CwBllChJ,sEAwGI,uCV4HwD,CUpO5D,kEA+GE,8CxBo+B+E,CwBnlCjF,kFAkHI,2CxB49BwD,CwB9kC5D,8EAsHI,yDxB49B4I,CwBllChJ,0GA0HI,gCxBo9BwD,CwBn9BzD,uDAKD,gBAAiB,CAhInB,kVA0IM,SAAU,CAvIf,kBAkBD,YAAa,CACb,UAAW,CACX,iBxBu0B0C,CFrkBxC,gBAnE+B,C0B5LjC,kCxB4jCgE,CwB3jCjE,iBAGC,iBAAkB,CAClB,QAAS,CACT,SAAU,CACV,YAAa,CACb,cAAe,CACf,oBxBu1C4C,CwBt1C5C,gBAAiB,C1BqPf,iBAnE+B,C0B/KjC,UxBijCqB,CwBhjCrB,iCxBijCmD,CC5kCnD,qCD02C6E,CwBv3C7E,sJA+CE,aAAc,CA/ChB,8DAqDE,gDxBsiCmF,CwBniCjF,kCV4KwD,CU3KxD,yDVwE0E,CUvE1E,2BAA4B,CAC5B,wDAA6D,CAC7D,2DVwKwD,CUpO5D,0EAgEI,gDxB2hCiF,CwB1hCjF,wDxByhC0I,CwB1lC9I,8EA0EI,kCV0JwD,CUzJxD,6EVyJwD,CUpO5D,4DAkFE,gDxBygCmF,CwB3lCrF,oOAuFM,kEAAqD,CACrD,sBxB05B2F,CwBz5B3F,4DxB44BoD,CwB34BpD,qEV0IsD,CUpO5D,wEA+FI,gDxB4/BiF,CwB3/BjF,wDxB0/B0I,CwB1lC9I,0EAwGI,uCV4HwD,CUpO5D,sEA+GE,gDxB4+BmF,CwB3lCrF,sFAkHI,6CxBo+B4D,CwBtlChE,kFAsHI,wDxBo+B0I,CwB1lC9I,8GA0HI,kCxB49B4D,CwB39B7D,yDAKD,gBAAiB,CAhInB,8VA4IM,SAAU,CAzIf,KCHH,0BAAyC,CACzC,2BAAyC,CACzC,sBAA6C,C3BuRzC,uBAnE+B,C2BlNnC,yBAA6C,CAC7C,yBAA6C,CAC7C,oCAAiC,CACjC,wBAA2B,CAC3B,6CAA+C,CAC/C,kCAA+C,CAC/C,+CAAiD,CACjD,wCAA2D,CAC3D,qFAA2C,CAC3C,8BAAuD,CACvD,gFAAuD,CAGvD,oBAAqB,CACrB,uDAAoG,CACpG,qCAA8D,C3BsQ1D,iCAnE+B,C2BjMnC,qCAA8D,CAC9D,qCAA8D,CAC9D,yBAA4C,CAC5C,iBAAkB,CAClB,oBAAwD,CAExD,qBAAsB,CACtB,cAA2C,CAC3C,gBAAiB,CACjB,kEAAqH,CxBjBnH,yCwBkB0E,CPjC5E,iCOkCoD,CRtBhD,iIjBo0B6I,CiBh0B7I,wCQhBN,KRiBQ,eAAgB,CQ4FvB,CA7GD,WAuCI,+BAAwD,CAExD,uCAA6D,CAC7D,6CAA6E,CAC9E,sBAIC,yBAA4C,CAC5C,iCAAiD,CACjD,uCAAiE,CAjDrE,mBAqDI,+BAAwD,CPrD1D,uCOsDkE,CAChE,6CAA6E,CAC7E,SAAU,CAKR,yCAAuE,CAE1E,8BAGC,6CAA6E,CAC7E,SAAU,CAKR,yCAAuE,CAE1E,mGAOC,gCAA0D,CAC1D,wCAA+D,CAG/D,8CAA+E,CATjF,yKAiBM,yCAAuE,CA7F/E,mDAqGI,kCAA8D,CAC9D,mBAAoB,CACpB,0CAAmE,CAEnE,gDAAmF,CACnF,sCAAoE,CAErE,aC5FD,oBAAiC,CACjC,oBAA2B,CAC3B,8BAA+C,CAC/C,0BAA6C,CAC7C,0BAAuC,CACvC,oCAA2D,CAC3D,qCAAuD,CACvD,2BAA+C,CAC/C,2BAAyC,CACzC,qCAA6D,CAC7D,yDAAiD,CACjD,6BAAmD,CACnD,6BAA6C,CAC7C,uCAAiE,CD+GhE,qBCnGD,uBAAiC,CACjC,8BAA+C,CAC/C,0BAA6C,CAC7C,0BAAuC,CACvC,oCAA2D,CAC3D,oCAAuD,CACvD,2BAA+C,CAC/C,2BAAyC,CACzC,qCAA6D,CAC7D,yDAAiD,CACjD,gCAAmD,CACnD,iCAA6C,CAC7C,uCAAiE,CACjE,mBAA+B,CD4F9B,UAWD,yBAA6C,CAC7C,oCAAiC,CACjC,wBAA2B,CAC3B,kCAA+C,CAC/C,gDAA6C,CAC7C,wCAA2D,CAC3D,iDAA+C,CAC/C,yCAA6D,CAC7D,gCAAmD,CACnD,2CAAiE,CACjE,+BAA2C,CAC3C,qCAAuD,CAEvD,yBzBuRiD,CyBrSnD,wBAyBI,yBAA4C,CAzBhD,gBA6BI,+BAAwD,CACzD,2BC9HD,yBAAyC,CACzC,wBAAyC,C5B8NrC,0BAnE+B,C4BzJnC,kDAAiD,CDuIlD,2BC1IC,0BAAyC,CACzC,yBAAyC,C5B8NrC,0BAnE+B,C4BzJnC,kDAAiD,CD2IlD,MR9LK,+BjBsjB2C,CiBljB3C,wCUpBN,MVqBQ,eAAgB,CUfvB,CAND,iBAII,SAAU,CACX,qBAMC,YAAa,CACd,YAID,QAAS,CACT,eAAgB,CVDZ,4BjBwjBwC,CiBpjBxC,wCULN,YVMQ,eAAgB,CUIvB,CAVD,gCAMI,OAAQ,CACR,WAAY,CVNV,2BjByjBuC,CiBrjBvC,wCULN,gCVMQ,eAAgB,CUGrB,CCvBH,sEAME,iBAAkB,CL6FG,iBKzFrB,kBAAmB,CCwBjB,wBACE,oBAAqB,CACrB,kB7B6hB0C,C6B5hB1C,qB7B2hB0C,C6B1hB1C,UAAW,CArCf,qBAAwB,CACxB,mCAAsC,CACtC,eAAgB,CAChB,kCAAqC,CA0ClC,8BAiBC,aAAc,CACf,eD7CH,0BAA6C,CAC7C,8BAAmD,CACnD,0BAAmD,CACnD,8BAAmD,CACnD,6BAA6C,C9BuQzC,4BAnE+B,C8BlMnC,yCAA2C,CAC3C,mCAAqC,CACrC,8DAAyD,CACzD,oDAA2D,CAC3D,kDAAyD,CACzD,yFAAuE,CACvE,4DAAqD,CACrD,qCAAiE,CACjE,8CAAqD,CACrD,8CAAqD,CACrD,oDAAiE,CACjE,kDAA2D,CAC3D,qCAAmE,CACnE,qCAA6D,CAC7D,2DAAuE,CACvE,kCAA6D,CAC7D,oCAA6D,CAC7D,mCAAyD,CACzD,oCAAiE,CACjE,qCAAiE,CAGjE,iBAAkB,CAClB,iCAA0D,CAC1D,YAAa,CACb,sCAAkE,CAClE,iEAAwH,CACxH,QAAS,C9B0OL,sCAnE+B,C8BrKnC,8BAAsD,CACtD,eAAgB,CAChB,eAAgB,CAChB,sCAA2D,CAC3D,2BAA4B,CAC5B,4EAAyI,C3BzCvI,8C2B0CoF,CA3CxF,+BA+CI,QAAS,CACT,MAAO,CACP,oCAA6D,CAC9D,qBAwBG,oBAAc,CADhB,qCAII,UAAW,CACX,MAAO,CACR,mBAID,kBAAc,CADhB,mCAII,OAAQ,CACR,SAAU,CrB1Cd,0BqB4BA,wBACE,oBAAc,CADhB,wCAII,UAAW,CACX,MAAO,CACR,sBAID,kBAAc,CADhB,sCAII,OAAQ,CACR,SAAU,CACX,CrB3CH,0BqB4BA,wBACE,oBAAc,CADhB,wCAII,UAAW,CACX,MAAO,CACR,sBAID,kBAAc,CADhB,sCAII,OAAQ,CACR,SAAU,CACX,CrB3CH,0BqB4BA,wBACE,oBAAc,CADhB,wCAII,UAAW,CACX,MAAO,CACR,sBAID,kBAAc,CADhB,sCAII,OAAQ,CACR,SAAU,CACX,CrB3CH,2BqB4BA,wBACE,oBAAc,CADhB,wCAII,UAAW,CACX,MAAO,CACR,sBAID,kBAAc,CADhB,sCAII,OAAQ,CACR,SAAU,CACX,CrB3CH,2BqB4BA,yBACE,oBAAc,CADhB,yCAII,UAAW,CACX,MAAO,CACR,uBAID,kBAAc,CADhB,uCAII,OAAQ,CACR,SAAU,CACX,CAQP,uCAEI,QAAS,CACT,WAAY,CACZ,YAAa,CACb,uCAAgE,CCpFhE,gCACE,oBAAqB,CACrB,kB7B6hB0C,C6B5hB1C,qB7B2hB0C,C6B1hB1C,UAAW,CA9Bf,YAAa,CACb,mCAAsC,CACtC,wBAA2B,CAC3B,kCAAqC,CAmClC,sCAiBC,aAAc,CACf,wCDgED,KAAM,CACN,UAAW,CACX,SAAU,CACV,YAAa,CACb,qCAA8D,CClG9D,iCACE,oBAAqB,CACrB,kB7B6hB0C,C6B5hB1C,qB7B2hB0C,C6B1hB1C,UAAW,CAvBf,iCAAoC,CACpC,cAAe,CACf,oCAAuC,CACvC,sBAAyB,CA4BtB,uCAiBC,aAAc,CA7BhB,iCDwGE,gBAAiB,CAClB,0CAMD,KAAM,CACN,UAAW,CACX,SAAU,CACV,YAAa,CACb,sCAA+D,CCnH/D,mCACE,oBAAqB,CACrB,kB7B6hB0C,C6B5hB1C,qB7B2hB0C,C6B1hB1C,UAAW,CAJb,mCAgBI,YAAa,CACd,oCAGC,oBAAqB,CACrB,mB7B0gBwC,C6BzgBxC,qB7BwgBwC,C6BvgBxC,UAAW,CAnCjB,iCAAoC,CACpC,uBAA0B,CAC1B,oCAAuC,CAmClC,yCAID,aAAc,CAVd,oCDsGA,gBAAiB,CAClB,kBAOH,QAAS,CACT,4CAA+E,CAC/E,eAAgB,CAChB,kDAA+E,CAC/E,SAAU,CACX,eAMC,aAAc,CACd,UAAW,CACX,2EAA4I,CAC5I,UAAW,CACX,e5Byb+B,C4Bxb/B,mCAAgE,CAChE,kBAAmB,CACnB,oBAAwD,CACxD,kBAAmB,CACnB,4BAA6B,CAC7B,QAAS,C3BtKP,sD2BuKiG,CAZrG,0CAgBI,yCAA4E,CV1L9E,iDU4LsF,CAlBxF,4CAuBI,0CAA8E,CAC9E,oBAAqB,CVlMvB,kDUmMwF,CAzB1F,gDA8BI,4CAAkF,CAClF,mBAAoB,CACpB,4BAA6B,CAG9B,oBAID,aAAc,CACf,iBAIC,aAAc,CACd,+EAAoJ,CACpJ,eAAgB,C9BmEZ,iBAnE+B,C8BEnC,qCAAoE,CACpE,kBAAmB,CACpB,oBAIC,aAAc,CACd,2EAA4I,CAC5I,mCAAgE,CACjE,oBAKC,4BAA2C,CAC3C,yBAAqC,CACrC,8DAAyD,CACzD,0BAAqD,CACrD,iCAAqD,CACrD,oCAAiE,CACjE,4DAAqD,CACrD,mDAA2D,CAC3D,qCAAmE,CACnE,qCAA6D,CAC7D,0CAAuE,CACvE,mCAAyD,CAE1D,+BEtPC,iBAAkB,CAClB,mBAAoB,CACpB,qBAAsB,CAJxB,yCAOI,iBAAkB,CAClB,aAAc,CARlB,kXAmBI,SAAU,CACX,aAKD,YAAa,CACb,cAAe,CACf,0BAA2B,CAH7B,0BAMI,UAAW,CACZ,W7BbC,qCD6zBuE,C8B7yB3E,qFAMI,6CAA4C,CANhD,qJ7BAI,yB6Ba4B,C7BZ5B,4B6BY4B,CAbhC,6G7BcI,wB6BS8B,C7BR9B,2B6BQ8B,CAC/B,uBAgBD,sBAAmC,CACnC,qBAAkC,CAFpC,2GAOI,aAAc,CACf,0CAGC,cAAe,CAChB,yEAID,qBAAsC,CACtC,oBAAqC,CACtC,yEAGC,oBAAsC,CACtC,mBAAqC,CACtC,oBAoBC,qBAAsB,CACtB,sBAAuB,CACvB,sBAAuB,CAHzB,wDAOI,UAAW,CAPf,4FAYI,4CAA2C,CAZ/C,qH7B1EI,4B6B4F+B,C7B3F/B,2B6B2F+B,CAlBnC,sF7BxFI,wB6B+G4B,C7B9G5B,yB6B8G4B,CAC7B,KCrID,6BAAmD,CACnD,8BAAmD,CAEnD,2BAAuD,CACvD,yCAA2C,CAC3C,qDAAuD,CACvD,uDAA6D,CAG7D,YAAa,CACb,cAAe,CACf,cAAe,CACf,eAAgB,CAChB,eAAgB,CACjB,UAGC,aAAc,CACd,iEAAwH,CjCsQpH,sCAnE+B,CiCjMnC,0CAAwE,CACxE,8BAAsD,CACtD,oBAAwD,CACxD,eAAgB,CAChB,QAAS,CdfL,oGjB4nCsH,CiBxnCtH,wCcGN,UdFQ,eAAgB,Cc+BvB,CA7BD,gCAaI,oCAAkE,CAbtE,wBAkBI,SAAU,CACV,6C/BJa,C+BfjB,sCAyBI,uCAAwE,CACxE,mBAAoB,CACpB,cAAe,CAChB,UASD,kDAAyD,CACzD,kDAAyD,CACzD,oDAA2D,CAC3D,2GAA+E,CAC/E,yDAAmE,CACnE,+CAA6D,CAC7D,uGAAiF,CAGjF,mFAAgJ,CAXlJ,oBAcI,wDAAuF,CACvF,wDAAuF,C9B7CvF,uD8B8C0F,C9B7C1F,wD8B6C0F,CAhB9F,oDAqBM,iBAAkB,CAClB,uDAAiG,CAtBvG,8DA4BI,0CAA8E,CAC9E,kDAAmF,CACnF,wDAAmG,CA9BvG,yBAmCI,qDAAoF,C9BjEpF,wB8BmE4B,C9BlE5B,yB8BkE4B,CAC7B,WAUD,qDAA6D,CAC7D,sCAAqE,CACrE,sCAA+D,CAJjE,qB9BrFI,+C8B6FwF,CAR5F,uDAaI,2CAAgF,CbjHlF,mDakH0F,CACzF,eAUD,4BAAiD,CACjD,wCAAmE,CACnE,8DAA6E,CAG7E,+BAA0D,CAP5D,yBAUI,eAAgB,CAChB,cAAe,CACf,oEAAwG,CAZ5G,8DAgBM,gCAAiC,CAhBvC,+DAsBI,e/B0d6B,C+Bzd7B,+CAAwF,CACxF,gCAAiC,CAClC,wCAWC,aAAc,CACd,iBAAkB,CACnB,kDAMC,YAAa,CACb,WAAY,CACZ,iBAAkB,CACnB,iEAMC,UAAW,CACZ,uBAUC,YAAa,CAFjB,qBAKI,aAAc,CACf,QC5LD,wBAA+C,CAC/C,4BAA+C,CAC/C,2DAAuC,CACvC,gEAAmD,CACnD,mEAAyD,CACzD,+DAAqD,CACrD,qCAA2D,CAC3D,kCAA6D,CAC7D,oCAA2D,CAC3D,8DAAmD,CACnD,oEAA+D,CAC/D,qCAAiE,CACjE,qCAA+D,CAC/D,qCAA+D,CAC/D,sCAA+D,CAC/D,qEAA2D,CAC3D,0EAAqE,CACrE,0DAAuE,CACvE,uCAAmE,CACnE,4DAAiE,CAGjE,iBAAkB,CAClB,YAAa,CACb,cAAe,CACf,kBAAmB,CACnB,6BAA8B,CAC9B,6DAAgH,CA7BlH,2JAoCI,YAAa,CACb,iBAAkB,CAClB,kBAAmB,CACnB,6BAA8B,CAC/B,cAoBD,4CAA4E,CAC5E,+CAA+E,CAC/E,8CAA+E,ClC4N3E,0CAnE+B,CkCvJnC,kCAA8D,CAC9D,oBAAwD,CACxD,kBAAmB,CAPrB,wCAWI,wCAA0E,CAE3E,YAUD,0BAAmD,CACnD,8BAAmD,CAEnD,2BAAuD,CACvD,2CAA2C,CAC3C,uDAAuD,CACvD,6DAA6D,CAG7D,YAAa,CACb,qBAAsB,CACtB,cAAe,CACf,eAAgB,CAChB,eAAgB,CAflB,wDAoBM,mCAAgE,CApBtE,2BAyBI,eAAgB,CACjB,aASD,iBhC8gCuC,CgC7gCvC,oBhC6gCuC,CgC5gCvC,4BAAkD,CAHpD,yDAQI,mCAAgE,CACjE,iBAaD,eAAgB,CAChB,WAAY,CAGZ,kBAAmB,CACpB,gBAIC,6EAAgJ,ClCyI5I,4CAnE+B,CkCpEnC,aAAc,CACd,4BAAkD,CAClD,4BAA6B,CAC7B,yEAAmI,C/BxIjI,oD+ByIgG,Cf5I9F,8Ce6IqF,CfzIrF,wCeiIN,gBfhIQ,eAAgB,CemJvB,CAnBD,sBAWI,oBAAqB,CAXzB,sBAeI,oBAAqB,CACrB,SAAU,CACV,qDAAyF,CAC1F,qBAMD,oBAAqB,CACrB,WAAY,CACZ,YAAa,CACb,qBAAsB,CACtB,iDAAiF,CACjF,2BAA4B,CAC5B,0BAA2B,CAC3B,oBAAqB,CACtB,mBAGC,wCAA+D,CAC/D,eAAgB,CzB1Hd,0ByBsIA,kBAEI,gBAAiB,CACjB,0BAA2B,CAH9B,8BAMK,kBAAmB,CANxB,6CASO,iBAAkB,CATzB,wCAaO,iDAAoF,CACpF,gDAAmF,CAd1F,qCAmBK,gBAAiB,CAnBtB,mCAuBK,uBAAwB,CACxB,eAAgB,CAxBrB,kCA4BK,YAAa,CA5BlB,6BAiCK,eAAgB,CAChB,YAAa,CACb,WAAY,CACZ,qBAAsB,CACtB,sBAAuB,CACvB,6BAA8B,CAC9B,uCAAwC,CACxC,mBAAoB,CACpB,yBAA0B,Cf9N9B,eegO4B,CA3C7B,+CA+CO,YAAa,CA/CpB,6CAmDO,YAAa,CACb,WAAY,CACZ,SAAU,CACV,kBAAmB,CACpB,CzB7LP,0ByBsIA,kBAEI,gBAAiB,CACjB,0BAA2B,CAH9B,8BAMK,kBAAmB,CANxB,6CASO,iBAAkB,CATzB,wCAaO,iDAAoF,CACpF,gDAAmF,CAd1F,qCAmBK,gBAAiB,CAnBtB,mCAuBK,uBAAwB,CACxB,eAAgB,CAxBrB,kCA4BK,YAAa,CA5BlB,6BAiCK,eAAgB,CAChB,YAAa,CACb,WAAY,CACZ,qBAAsB,CACtB,sBAAuB,CACvB,6BAA8B,CAC9B,uCAAwC,CACxC,mBAAoB,CACpB,yBAA0B,Cf9N9B,eegO4B,CA3C7B,+CA+CO,YAAa,CA/CpB,6CAmDO,YAAa,CACb,WAAY,CACZ,SAAU,CACV,kBAAmB,CACpB,CzB7LP,0ByBsIA,kBAEI,gBAAiB,CACjB,0BAA2B,CAH9B,8BAMK,kBAAmB,CANxB,6CASO,iBAAkB,CATzB,wCAaO,iDAAoF,CACpF,gDAAmF,CAd1F,qCAmBK,gBAAiB,CAnBtB,mCAuBK,uBAAwB,CACxB,eAAgB,CAxBrB,kCA4BK,YAAa,CA5BlB,6BAiCK,eAAgB,CAChB,YAAa,CACb,WAAY,CACZ,qBAAsB,CACtB,sBAAuB,CACvB,6BAA8B,CAC9B,uCAAwC,CACxC,mBAAoB,CACpB,yBAA0B,Cf9N9B,eegO4B,CA3C7B,+CA+CO,YAAa,CA/CpB,6CAmDO,YAAa,CACb,WAAY,CACZ,SAAU,CACV,kBAAmB,CACpB,CzB7LP,2ByBsIA,kBAEI,gBAAiB,CACjB,0BAA2B,CAH9B,8BAMK,kBAAmB,CANxB,6CASO,iBAAkB,CATzB,wCAaO,iDAAoF,CACpF,gDAAmF,CAd1F,qCAmBK,gBAAiB,CAnBtB,mCAuBK,uBAAwB,CACxB,eAAgB,CAxBrB,kCA4BK,YAAa,CA5BlB,6BAiCK,eAAgB,CAChB,YAAa,CACb,WAAY,CACZ,qBAAsB,CACtB,sBAAuB,CACvB,6BAA8B,CAC9B,uCAAwC,CACxC,mBAAoB,CACpB,yBAA0B,Cf9N9B,eegO4B,CA3C7B,+CA+CO,YAAa,CA/CpB,6CAmDO,YAAa,CACb,WAAY,CACZ,SAAU,CACV,kBAAmB,CACpB,CzB7LP,2ByBsIA,mBAEI,gBAAiB,CACjB,0BAA2B,CAH9B,+BAMK,kBAAmB,CANxB,8CASO,iBAAkB,CATzB,yCAaO,iDAAoF,CACpF,gDAAmF,CAd1F,sCAmBK,gBAAiB,CAnBtB,oCAuBK,uBAAwB,CACxB,eAAgB,CAxBrB,mCA4BK,YAAa,CA5BlB,8BAiCK,eAAgB,CAChB,YAAa,CACb,WAAY,CACZ,qBAAsB,CACtB,sBAAuB,CACvB,6BAA8B,CAC9B,uCAAwC,CACxC,mBAAoB,CACpB,yBAA0B,Cf9N9B,eegO4B,CA3C7B,gDA+CO,YAAa,CA/CpB,8CAmDO,YAAa,CACb,WAAY,CACZ,SAAU,CACV,kBAAmB,CACpB,CA7DX,eAQQ,gBAAiB,CACjB,0BAA2B,CATnC,2BAYU,kBAAmB,CAZ7B,0CAeY,iBAAkB,CAf9B,qCAmBY,iDAAoF,CACpF,gDAAmF,CApB/F,kCAyBU,gBAAiB,CAzB3B,gCA6BU,uBAAwB,CACxB,eAAgB,CA9B1B,+BAkCU,YAAa,CAlCvB,0BAuCU,eAAgB,CAChB,YAAa,CACb,WAAY,CACZ,qBAAsB,CACtB,sBAAuB,CACvB,6BAA8B,CAC9B,uCAAwC,CACxC,mBAAoB,CACpB,yBAA0B,Cf9N9B,eegO4B,CAjDlC,4CAqDY,YAAa,CArDzB,0CAyDY,YAAa,CACb,WAAY,CACZ,SAAU,CACV,kBAAmB,CACpB,2CAmBT,yCAAuC,CACvC,+CAAmD,CACnD,kDAAyD,CACzD,8BAAqD,CACrD,6BAAmD,CACnD,mCAA+D,CAC/D,uDAAqE,CACrE,qEAA2D,CAE5D,4CAKK,qEAA2D,CrCjRjE,MsCNE,wBAAyC,CACzC,wBAAyC,CACzC,+BAAqD,CACrD,uBAA+C,CAC/C,0BAAqD,CACrD,8CAAiD,CACjD,0DAAiD,CACjD,gDAAmD,CACnD,sBAA6C,CAC7C,uFAA+D,CAC/D,8BAAmD,CACnD,6BAAmD,CACnD,sDAAqC,CACrC,qBAA2C,CAC3C,kBAAqC,CACrC,iBAAmC,CACnC,+BAA6B,CAC7B,mCAA+D,CAC/D,8BAAiD,CAGjD,iBAAkB,CAClB,YAAa,CACb,qBAAsB,CACtB,WAAY,CACZ,4BAAiD,CACjD,0BAA8C,CAC9C,oBAAqB,CACrB,kCAAmD,CACnD,0BAA2B,CAC3B,oEAAyH,ChCjBvH,0CgCkB4E,CtCXhF,SsCeI,cAAe,CACf,aAAc,CAtClB,kBA0CI,kBAAmB,CACnB,qBAAsB,CA3C1B,8BA8CM,kBAAmB,ChCtBrB,yDgCuBgG,ChCtBhG,0DgCsBgG,CA/CpG,6BAmDM,qBAAsB,ChCbxB,6DgCcmG,ChCbnG,4DgCamG,CApDvG,8DA4DI,YAAa,CtCvBjB,WsC8BE,aAAc,CACd,uDAAoG,CACpG,0BAA8C,CtCzBhD,YsC6BE,2CAAwE,CACxE,gCAA0D,CtC1B5D,esC8BE,oDAAiF,CACjF,eAAgB,CAChB,mCAAgE,CtC3BlE,sBsC+BE,eAAgB,CtCvBlB,sBsCgCI,mCAA0D,CtC5B9D,asCqCE,iEAAwH,CACxH,eAAgB,CAChB,8BAAsD,CACtD,sCAA2D,CAC3D,2EAAgI,CtClClI,yBMzDI,uFgC8FkK,CtC7BtK,asCkCE,iEAAwH,CACxH,8BAAsD,CACtD,sCAA2D,CAC3D,wEAA6H,CtC/B/H,wBMvEI,uFgCyGkK,CtC9BtK,kBsCwCE,qDAAiF,CACjF,qDAAiF,CACjF,oDAAgF,CAChF,eAAgB,CAJlB,mCAOI,kCAAmD,CACnD,qCAAsD,CtCxC1D,mBsC6CE,qDAAiF,CACjF,oDAAgF,CtCzClF,kBsC8CE,iBAAkB,CAClB,KAAM,CACN,OAAQ,CACR,QAAS,CACT,MAAO,CACP,0CAA4E,ChC1I1E,gDgC2IwF,CtC3C5F,yCsCiDE,UAAW,CtCzCb,wBM/FI,yDgC6I4F,ChC5I5F,0DgC4I4F,CtCxChG,2BMvFI,6DgCoI+F,ChCnI/F,4DgCmI+F,CtCjBnG,kBsC6BI,yCAAoE,C1B3HpE,0BZmGA,YsC4BA,YAAa,CACb,kBAAmB,CtClCvB,kBsCuCM,WAAY,CACZ,eAAgB,CtCxBlB,wBsC2BI,aAAc,CACd,aAAc,CtCxBlB,mCM9IA,yBgC4KkC,ChC3KlC,4BgC2KkC,CtC1BlC,iGsC+BQ,yBAA0B,CtC3BlC,oGsCgCQ,4BAA6B,CtC5BrC,oCM5IA,wBgC6KoC,ChC5KpC,2BgC4KoC,CtC7BpC,mGsCkCQ,wBAAyB,CtC9BjC,sGsCmCQ,2BAA4B,CAC7B,CCrOX,WAEE,0CAA6C,CAC7C,oCAAuC,CACvC,0KAAuD,CACvD,mDAA2D,CAC3D,mDAA2D,CAC3D,qDAA6D,CAC7D,4FAAyE,CACzE,qCAA6D,CAC7D,kCAA6D,CAC7D,8CAAqD,CACrD,6CAA+C,CAC/C,iEAAmD,CACnD,sCAA+D,CAC/D,kDAAuE,CACvE,8DAAyE,CACzE,wEAAiE,CACjE,8CAA+E,CAC/E,uEAA2E,CAC3E,sCAA+D,CAC/D,mCAA+D,CAC/D,4DAA2D,CAC3D,qDAAqD,CAEtD,kBAGC,iBAAkB,CAClB,YAAa,CACb,kBAAmB,CACnB,UAAW,CACX,2EAA4I,CpC2PxI,cAnE+B,CoCtLnC,mCAAgE,CAChE,eAAgB,CAChB,2CAAqE,CACrE,QAAS,CjCtBP,eiCuBsB,CACxB,oBAAqB,CjB3BjB,yCiB4B2E,CjBxB3E,wCiBWN,kBjBVQ,eAAgB,CiB2DvB,CAjDD,kCAgBI,sCAAsE,CACtE,8CAA2E,CAC3E,iGAAgK,CAlBpK,yCAqBM,oDAAuF,CACvF,gDAAsF,CAtB5F,yBA4BI,aAAc,CACd,wCAA0E,CAC1E,yCAA2E,CAC3E,gBAAiB,CACjB,UAAW,CACX,6CAAyE,CACzE,2BAA4B,CAC5B,kDAAoF,CjBlDlF,kDiBmD+F,CjB/C/F,wCiBWN,yBjBVQ,eAAgB,CiB+CrB,CArCH,wBAwCI,SAAU,CAxCd,wBA4CI,SAAU,CACV,uDAAiG,CACjG,SAAU,CACV,mDAA2F,CAC5F,kBAID,eAAgB,CACjB,gBAGC,+BAAwD,CACxD,uCAA6D,CAC7D,8EAA6I,CAH/I,8BjC1DI,wDiCgE4F,CjC/D5F,yDiC+D4F,CANhG,gDjC1DI,8DiCmE0G,CjClE1G,+DiCkE0G,CAT9G,oCAcI,YAAa,CAdjB,6BjC5CI,4DiC+D+F,CjC9D/F,2DiC8D+F,CAnBnG,yDjC5CI,kEiCmE+G,CjClE/G,iEiCkE+G,CAvBnH,iDjC5CI,4DiCwEiG,CjCvEjG,2DiCuEiG,CAChG,gBAKH,6EAAgJ,CACjJ,qCASG,cAAe,CAFnB,iCAMI,cAAe,CACf,aAAc,CjCpHd,eiCqHwB,CAR5B,6CAUoB,YAAa,CAVjC,4CAWmB,eAAgB,CAXnC,gHjC7GI,eiC6H4B,CACzB,gDAQD,iEAAmD,CACnD,wEAAiE,CAClE,YCzJH,4BAAuD,CACvD,4BAAuD,CACvD,mCAA+D,CAE/D,oBAAyC,CACzC,+BAA+D,CAC/D,wDAA+D,CAC/D,qCAAiE,CACjE,4DAAuE,CAGvE,YAAa,CACb,cAAe,CACf,qEAAgI,CAChI,gDAAkF,CrC+Q9E,wCAnE+B,CqC1MnC,eAAgB,CAChB,wCAA+D,ClCA7D,gDkCCwF,CAC3F,kCAKG,gDAAmF,CAHvF,0CAMM,UAAW,CACX,iDAAoF,CACpF,wCAA0E,CAC1E,wCAAS,EAAyF,2CAA8G,CAAO,CAT7N,wBAcI,4CAAkF,CACnF,YCpCD,iCAAuD,CACvD,kCAAuD,CtC4RnD,8BAnE+B,CsCvNnC,2CAA+C,CAC/C,qCAAyC,CACzC,oDAA6D,CAC7D,oDAA6D,CAC7D,sDAA+D,CAC/D,uDAA2D,CAC3D,+CAAqD,CACrD,0DAAyE,CACzE,uDAA2D,CAC3D,gDAAqD,CACrD,oEAAqE,CACrE,kCAA6D,CAC7D,kCAAuD,CACvD,4CAA2E,CAC3E,yDAAiE,CACjE,mDAA2D,CAC3D,6DAA+E,CAG/E,YAAa,CjCpBb,cAAe,CACf,eAAgB,CiCqBjB,WAGC,iBAAkB,CAClB,aAAc,CACd,qEAAgI,CtCgQ5H,wCAnE+B,CsC3LnC,gCAA0D,CAC1D,oBAAwD,CACxD,wCAA+D,CAC/D,gFAAiJ,CnBpB7I,iIjB4xCoJ,CiBxxCpJ,wCmBQN,WnBPQ,eAAgB,CmBiDvB,CA1CD,iBAYI,SAAU,CACV,sCAAsE,CAEtE,8CAA2E,CAC3E,oDAA2F,CAhB/F,iBAoBI,SAAU,CACV,sCAAsE,CACtE,8CAA2E,CAC3E,SpC2uCiC,CoC1uCjC,gDAAqF,CAxBzF,qCA6BI,SAAU,CACV,uCAAwE,ClBtD1E,+CkBuDkF,CAChF,qDAA6F,CAhCjG,yCAqCI,yCAA4E,CAC5E,mBAAoB,CACpB,iDAAiF,CACjF,uDAAiG,CAClG,wCAKC,6CpC8sCsE,CoChtC1E,kCnCvBI,yDmC+BoG,CnC9BpG,4DmC8BoG,CARxG,iCnCrCI,0DmCmDkG,CnClDlG,6DmCkDkG,CAC/F,eCnFL,iCAAuD,CACvD,iCAAuD,CvC0RnD,iCAnE+B,CuCrNnC,yDAA+D,CDiGhE,eCpGC,gCAAuD,CACvD,iCAAuD,CvC0RnD,iCAnE+B,CuCrNnC,yDAA+D,CDqGhE,OErGC,2BAA6C,CAC7C,2BAA6C,CxCuRzC,0BAnE+B,CwClNnC,2BAAiD,CACjD,sBAAqC,CACrC,iDAAqD,CAGrD,oBAAqB,CACrB,2DAA4G,CxC+QxG,mCAnE+B,CwC1MnC,uCAAkE,CAClE,aAAc,CACd,2BAAgD,CAChD,iBAAkB,CAClB,kBAAmB,CACnB,uBAAwB,CrCJtB,2CqCK8E,CAnBlF,aAwBI,YAAa,CACd,YAKD,iBAAkB,CAClB,QAAS,CACV,OC/BC,0BAA+B,CAC/B,0BAA6C,CAC7C,0BAA6C,CAC7C,8BAAqD,CACrD,yBAAqC,CACrC,oCAAmD,CACnD,4EAAuC,CACvC,iDAAqD,CACrD,8BAA+C,CAG/C,iBAAkB,CAClB,2DAA4G,CAC5G,2CAAwE,CACxE,2BAAgD,CAChD,mCAAqD,CACrD,6BAAmD,CtCHjD,2CsCI8E,CACjF,eAKC,aAAc,CACf,YAIC,evC6kB+B,CuC5kB/B,gCAA0D,CAC3D,mBAQC,kBvCo+CkD,CuCr+CpD,8BAKI,iBAAkB,CAClB,KAAM,CACN,OAAQ,CACR,SvCwZuC,CuCvZvC,oBvCqWS,CuCpWV,eAQC,iDAAqC,CACrC,0CAA+B,CAC/B,wDAAmD,CACnD,sDAA+C,CAChD,gCC5DC,GAAK,0BxCuhD+B,CAAA,CwClhDxC,4BAGE,0BAA6C,C1CkRzC,8BAnE+B,C0C7MnC,wCAAqC,CACrC,oDAA2D,CAC3D,oDAAqD,CACrD,6BAAmD,CACnD,6BAA6C,CAC7C,6CAA6D,CAG7D,YAAa,CACb,gCAAyD,CACzD,eAAgB,C1CsQZ,sCAnE+B,C0CjMnC,sCAA2D,CvCRzD,8CuCSoF,CAEvF,cAGC,YAAa,CACb,qBAAsB,CACtB,sBAAuB,CACvB,eAAgB,CAChB,kCAA8D,CAC9D,iBAAkB,CAClB,kBAAmB,CACnB,0CAAmE,CvBxB/D,4CuByBiF,CvBrBjF,wCuBYN,cvBXQ,eAAgB,CuBqBvB,CAED,sBtBAE,2LAA6I,CsBE7I,mEAAoH,CACrH,4BAGC,gBAAiB,CAClB,0CAGC,UAAW,CACZ,uBAIG,iDAA8D,CAG5D,wCAJJ,uBAKM,cAAe,CAGpB,CC9DH,YAEE,2CAA+C,CAC/C,qCAAyC,CACzC,oDAA6D,CAC7D,oDAA6D,CAC7D,sDAA+D,CAC/D,oCAAiE,CACjE,qCAAiE,CACjE,uDAA6D,CAC7D,4DAAyE,CACzE,sDAAmE,CACnE,yDAA2E,CAC3E,wDAAqE,CACrE,yDAAiE,CACjE,8CAA2D,CAC3D,kCAA6D,CAC7D,kCAAuD,CACvD,4CAA2E,CAG3E,YAAa,CACb,qBAAsB,CAGtB,cAAe,CACf,eAAgB,CxCXd,gDwCYwF,CAC3F,qBAGC,oBAAqB,CACrB,qBAAsB,CAFxB,8CAMI,mCAAoC,CACpC,yBAA0B,CAC3B,wBASD,UAAW,CACX,uCAAwE,CACxE,kBAAmB,CAHrB,4DAQI,SAAU,CACV,6CAAoF,CACpF,oBAAqB,CACrB,qDAAyF,CAX7F,+BAeI,8CAAsF,CACtF,sDAA2F,CAC5F,iBAQD,iBAAkB,CAClB,aAAc,CACd,+EAAoJ,CACpJ,gCAA0D,CAC1D,oBAAwD,CACxD,wCAA+D,CAC/D,gFAAiJ,CAPnJ,6BxC9CI,8BwCwDkC,CxCvDlC,+BwCuDkC,CAVtC,4BxChCI,kCwC8CqC,CxC7CrC,iCwC6CqC,CAdzC,oDAmBI,yCAA4E,CAC5E,mBAAoB,CACpB,iDAAiF,CArBrF,wBA0BI,SAAU,CACV,uCAAwE,CACxE,+CAA6E,CAC7E,qDAA6F,CA7BjG,kCAkCI,kBAAmB,CAlCvB,yCAqCM,uDAAwF,CACxF,kDAAmF,CACpF,uBAaC,kBAAmB,CADrB,qExCnDA,4DwCwD6G,CxCpE7G,yBwCqEsC,CANtC,qExC/DA,0DwCyEwG,CxC7DxG,2BwC8D2C,CAX3C,+CAeM,YAAa,CAfnB,yDAmBM,kDAAmF,CACnF,mBAAoB,CApB1B,gEAuBQ,wDAAyF,CACzF,mDAAoF,ClCtF5F,0BkC8DA,0BACE,kBAAmB,CADrB,wExCnDA,4DwCwD6G,CxCpE7G,yBwCqEsC,CANtC,wExC/DA,0DwCyEwG,CxC7DxG,2BwC8D2C,CAX3C,kDAeM,YAAa,CAfnB,4DAmBM,kDAAmF,CACnF,mBAAoB,CApB1B,mEAuBQ,wDAAyF,CACzF,mDAAoF,CACrF,ClCvFP,0BkC8DA,0BACE,kBAAmB,CADrB,wExCnDA,4DwCwD6G,CxCpE7G,yBwCqEsC,CANtC,wExC/DA,0DwCyEwG,CxC7DxG,2BwC8D2C,CAX3C,kDAeM,YAAa,CAfnB,4DAmBM,kDAAmF,CACnF,mBAAoB,CApB1B,mEAuBQ,wDAAyF,CACzF,mDAAoF,CACrF,ClCvFP,0BkC8DA,0BACE,kBAAmB,CADrB,wExCnDA,4DwCwD6G,CxCpE7G,yBwCqEsC,CANtC,wExC/DA,0DwCyEwG,CxC7DxG,2BwC8D2C,CAX3C,kDAeM,YAAa,CAfnB,4DAmBM,kDAAmF,CACnF,mBAAoB,CApB1B,mEAuBQ,wDAAyF,CACzF,mDAAoF,CACrF,ClCvFP,2BkC8DA,0BACE,kBAAmB,CADrB,wExCnDA,4DwCwD6G,CxCpE7G,yBwCqEsC,CANtC,wExC/DA,0DwCyEwG,CxC7DxG,2BwC8D2C,CAX3C,kDAeM,YAAa,CAfnB,4DAmBM,kDAAmF,CACnF,mBAAoB,CApB1B,mEAuBQ,wDAAyF,CACzF,mDAAoF,CACrF,ClCvFP,2BkC8DA,2BACE,kBAAmB,CADrB,yExCnDA,4DwCwD6G,CxCpE7G,yBwCqEsC,CANtC,yExC/DA,0DwCyEwG,CxC7DxG,2BwC8D2C,CAX3C,mDAeM,YAAa,CAfnB,6DAmBM,kDAAmF,CACnF,mBAAoB,CApB1B,oEAuBQ,wDAAyF,CACzF,mDAAoF,CACrF,CAaX,kBxChJI,ewCiJsB,CAD1B,mCAII,kDAAmF,CAJvF,8CAOM,qBAAsB,CACvB,yBAaD,sDAA+C,CAC/C,+CAAyC,CACzC,6DAA6D,CAC7D,4DAAyE,CACzE,gEAAmE,CACnE,6DAA2E,CAC3E,iEAAqE,CACrE,yDAA6D,CAC7D,0DAAuD,CACvD,oEAA2E,CAC5E,WC3LD,0BAA6C,CAC7C,2DAAuC,CACvC,0BAAiD,CACjD,iCAA6D,CAC7D,+DAA2D,CAC3D,+BAA6D,CAC7D,oCAAmE,CACnE,uEAA2D,CAG3D,sBAAuB,CACvB,S1CmpD8B,C0ClpD9B,U1CkpD8B,C0CjpD9B,mB1CmpDgC,C0ClpDhC,+BAAwD,CACxD,uEAA4G,CAC5G,QAAS,CzCJP,qBD+gBiC,C0CzgBnC,mCAA8D,CApBhE,iBAwBI,+BAAwD,CACxD,oBAAqB,CACrB,yCAA0E,CA1B9E,iBA8BI,SAAU,CACV,2CAA2E,CAC3E,yCAA0E,CAhC9E,wCAqCI,mBAAoB,CACpB,gBAAiB,CACjB,4CAAgF,CACjF,iBAID,uCAAuE,CAKxE,kCALC,uCAAuE,CAWpE,OC1DH,uBAAuC,CACvC,4BAA6C,CAC7C,2BAA6C,CAC7C,0BAAyC,CACzC,2BAA6C,C7CyRzC,4BAnE+B,C6CpNnC,kBAAqC,CACrC,gDAA+B,CAC/B,+CAAmD,CACnD,2DAAmD,CACnD,iDAAqD,CACrD,2CAA+C,CAC/C,kDAAmD,CACnD,uDAA6C,CAC7C,kEAAiE,CAGjE,+BAAwD,CACxD,cAAe,C7C2QX,mCAnE+B,C6CtMnC,2BAAgD,CAChD,mBAAoB,CACpB,mCAAqD,CACrD,2BAA4B,CAC5B,sEAA6H,CAC7H,qCAA+D,C1CR7D,2C0CS8E,CA5BlF,eA+BI,SAAU,CA/Bd,kBAmCI,YAAa,CACd,iBAID,uBAAuC,CAEvC,iBAAkB,CAClB,8BAAoD,CACpD,iBAAkB,CAClB,cAAe,CACf,mBAAoB,CAPtB,mCAUI,qCAA4D,CAC7D,cAID,YAAa,CACb,kBAAmB,CACnB,2DAA4G,CAC5G,kCAA8D,CAC9D,0CAAmE,CACnE,2BAA4B,CAC5B,oFAAkJ,C1ChChJ,yF0CiCkJ,C1ChClJ,0F0CgCkJ,CARtJ,yBAWI,kDAA2E,CAC3E,qCAA8D,CAC/D,YAID,iCAA0D,CAC1D,oBAAqB,CACtB,OC7DC,uBAAuC,CACvC,uBAAqC,CACrC,wBAAyC,CACzC,wBAAuC,CACvC,kBAAqC,CACrC,gCAA+B,CAC/B,2DAAmD,CACnD,+CAAmD,CACnD,oDAAqD,CACrD,8CAA+C,CAC/C,2FAAiE,CACjE,iCAA2D,CAC3D,iCAA2D,CAC3D,oCAAuD,CACvD,sDAAiE,CACjE,sDAAiE,CACjE,iCAA6D,CAC7D,4BAA+C,CAC/C,sBAA6C,CAC7C,sDAAiE,CACjE,sDAAiE,CAGjE,cAAe,CACf,KAAM,CACN,MAAO,CACP,8BAAoD,CACpD,YAAa,CACb,UAAW,CACX,WAAY,CACZ,iBAAkB,CAClB,eAAgB,CAGhB,SAAU,CAIX,cAIC,iBAAkB,CAClB,UAAW,CACX,6BAAmD,CAEnD,mBAAoB,CAGpB,0B3B5CI,kCjBg/CoD,C4Cl8CtD,6B5Cg8CmD,CiB1+CjD,wC2BwCJ,0B3BvCM,eAAgB,C2B0CrB,CACD,0BACE,c5C87CoC,C4C77CrC,kCAIC,qB5C27C2C,C4C17C5C,yBAID,8CAAoE,CADtE,wCAII,eAAgB,CAChB,eAAgB,CALpB,qCASI,eAAgB,CACjB,uBAID,YAAa,CACb,kBAAmB,CACnB,kDAAwE,CACzE,eAIC,iBAAkB,CAClB,YAAa,CACb,qBAAsB,CACtB,UAAW,CAEX,2BAAgD,CAChD,mBAAoB,CACpB,mCAAqD,CACrD,2BAA4B,CAC5B,sEAA6H,C3CrF3H,2C2CsF8E,CAGhF,SAAU,CACX,gBAKC,0BAA6C,CAC7C,sBAAqC,CACrC,yBAA+C,CClH/C,cAAe,CACf,KAAM,CACN,MAAO,CACP,iCDkH2E,CCjH3E,WAAY,CACZ,YAAa,CACb,sCD+GsH,CC5GtH,qBAAS,SAAU,CAAI,qBACd,kCD2GkK,CC3GpI,cDiHvC,YAAa,CACb,aAAc,CACd,kBAAmB,CACnB,6BAA8B,CAC9B,sCAAoE,CACpE,2FAAgK,C3CtG9J,0D2CuG8F,C3CtG9F,2D2CsG8F,CAPlG,yBAUI,+FAA8J,CAC9J,kJAAgP,CACjP,aAKD,eAAgB,CAChB,6CAA8E,CAC/E,YAKC,iBAAkB,CAGlB,aAAc,CACd,+BAAsD,CACvD,cAIC,YAAa,CACb,aAAc,CACd,cAAe,CACf,kBAAmB,CACnB,wBAAyB,CACzB,uEAAuH,CACvH,0CAAmE,CACnE,wFAA6J,C3C1H3J,8D2C2HiG,C3C1HjG,6D2C0HiG,CATrG,gBAeI,4CAAsE,CrC5GtE,0BqCtDJ,OAyKI,0BAAuC,CACvC,2CAA+C,CA/HnD,cAoII,+BAAoD,CACpD,iBAAkB,CAClB,gBAAiB,CAClB,UAGC,uBAAqC,CACtC,CrChIC,0BqCoIF,oBAEE,uBAAqC,CACtC,CrCvIC,2BqC2IF,UACE,wBAAqC,CACtC,CASC,kBACE,WAAY,CACZ,cAAe,CACf,WAAY,CACZ,QAAS,CAJX,iCAOI,WAAY,CACZ,QAAS,C3C1Mb,e2C2M4B,CAT5B,gE3ClMA,e2CgN4B,CAd5B,8BAkBI,eAAgB,CrC3JpB,6BqCyIA,0BACE,WAAY,CACZ,cAAe,CACf,WAAY,CACZ,QAAS,CAJX,yCAOI,WAAY,CACZ,QAAS,C3C1Mb,e2C2M4B,CAT5B,gF3ClMA,e2CgN4B,CAd5B,sCAkBI,eAAgB,CACjB,CrC5JH,6BqCyIA,0BACE,WAAY,CACZ,cAAe,CACf,WAAY,CACZ,QAAS,CAJX,yCAOI,WAAY,CACZ,QAAS,C3C1Mb,e2C2M4B,CAT5B,gF3ClMA,e2CgN4B,CAd5B,sCAkBI,eAAgB,CACjB,CrC5JH,6BqCyIA,0BACE,WAAY,CACZ,cAAe,CACf,WAAY,CACZ,QAAS,CAJX,yCAOI,WAAY,CACZ,QAAS,C3C1Mb,e2C2M4B,CAT5B,gF3ClMA,e2CgN4B,CAd5B,sCAkBI,eAAgB,CACjB,CrC5JH,8BqCyIA,0BACE,WAAY,CACZ,cAAe,CACf,WAAY,CACZ,QAAS,CAJX,yCAOI,WAAY,CACZ,QAAS,C3C1Mb,e2C2M4B,CAT5B,gF3ClMA,e2CgN4B,CAd5B,sCAkBI,eAAgB,CACjB,CrC5JH,8BqCyIA,2BACE,WAAY,CACZ,cAAe,CACf,WAAY,CACZ,QAAS,CAJX,0CAOI,WAAY,CACZ,QAAS,C3C1Mb,e2C2M4B,CAT5B,kF3ClMA,e2CgN4B,CAd5B,uCAkBI,eAAgB,CACjB,CEvOP,SAEE,yBAA2C,CAC3C,6BAAiD,CACjD,6BAAiD,CACjD,8BAAiD,CACjD,qBAA2C,ChDwRvC,8BAnE+B,CgDnNnC,qCAAyC,CACzC,yCAAmC,CACnC,mDAAyD,CACzD,wBAA6C,CAC7C,+BAAqD,CACrD,gCAAuD,CAGvD,gCAAwD,CACxD,aAAc,CACd,+BAAuD,CClBvD,qC/C+lB6E,C+C7lB7E,iBAAkB,CAClB,e/CwmB+B,C+CvmB/B,e/C+mB+B,C+C9mB/B,eAAgB,CAChB,gBAAiB,CACjB,oBAAqB,CACrB,gBAAiB,CACjB,mBAAoB,CACpB,qBAAsB,CACtB,iBAAkB,CAClB,kBAAmB,CACnB,mBAAoB,CACpB,eAAgB,CjDgRZ,qCAnE+B,CgDlMnC,oBAAqB,CACrB,SAAU,CA1BZ,cA4BW,iCAA0D,CA5BrE,wBA+BI,aAAc,CACd,mCAAgE,CAChE,qCAAmE,CAjCvE,gCAoCM,iBAAkB,CAClB,UAAW,CACX,wBAAyB,CACzB,kBAAmB,CACpB,6FAKH,gDAA8E,CADhF,6GAII,QAAS,CACT,sFAAgJ,CAChJ,qCAAyD,CAC1D,+FAKD,8CAA4E,CAC5E,oCAAkE,CAClE,oCAAiE,CAHnE,+GAMI,UAAW,CACX,+HAAqN,CACrN,uCAA2D,CAC5D,mGAMD,6CAA2E,CAD7E,mHAII,WAAY,CACZ,sFAAgJ,CAChJ,wCAA4D,CAC7D,gGAKD,+CAA6E,CAC7E,oCAAkE,CAClE,oCAAiE,CAHnE,gHAMI,SAAU,CACV,+HAAqN,CACrN,sCAA0D,CAC3D,eAsBD,qCAAgE,CAChE,+DAAoH,CACpH,6BAAoD,CACpD,iBAAkB,CAClB,qCAAyD,C7CjGvD,6C6CkGkF,CACrF,SEpHC,yBAA2C,CAC3C,6BAAiD,ClD4R7C,8BAnE+B,CkDvNnC,kCAAmC,CACnC,iDAAuD,CACvD,6DAAuD,CACvD,sDAAyD,CACzD,2FAAqE,CACrE,6CAAmD,CACnD,mCAA+D,CAC/D,oCAA+D,ClDmR3D,kCAnE+B,CkD9MnC,kCAAuD,CACvD,8CAAiD,CACjD,iCAA2D,CAC3D,iCAA2D,CAC3D,6CAAmD,CACnD,8BAAqD,CACrD,gCAAuD,CACvD,yDAAuD,CAGvD,gCAAwD,CACxD,aAAc,CACd,qCAAgE,CDzBhE,qC/C+lB6E,C+C7lB7E,iBAAkB,CAClB,e/CwmB+B,C+CvmB/B,e/C+mB+B,C+C9mB/B,eAAgB,CAChB,gBAAiB,CACjB,oBAAqB,CACrB,gBAAiB,CACjB,mBAAoB,CACpB,qBAAsB,CACtB,iBAAkB,CAClB,kBAAmB,CACnB,mBAAoB,CACpB,eAAgB,CjDgRZ,qCAnE+B,CkD5LnC,oBAAqB,CACrB,qCAAyD,CACzD,2BAA4B,CAC5B,0EAAqI,C/ChBnI,6C+CiBkF,CApCtF,wBAwCI,aAAc,CACd,mCAAgE,CAChE,qCAAmE,CA1CvE,+DA8CM,iBAAkB,CAClB,aAAc,CACd,UAAW,CACX,wBAAyB,CACzB,kBAAmB,CACnB,cAAe,CAChB,6FAMD,mFAA8I,CAFlJ,wNAMM,sFAAgJ,CANtJ,6GAUM,QAAS,CACT,+CAA6E,CAXnF,2GAeM,qCAAmE,CACnE,qCAAyD,CAC1D,+FAOD,iFAA4I,CAC5I,oCAAkE,CAClE,oCAAiE,CAJrE,4NAQM,+HAAqN,CAR3N,+GAYM,MAAO,CACP,iDAA+E,CAbrF,6GAiBM,mCAAiE,CACjE,uCAA2D,CAC5D,mGAQD,gFAA2I,CAF/I,oOAMM,sFAAgJ,CANtJ,mHAUM,KAAM,CACN,kDAAgF,CAXtF,iHAeM,kCAAgE,CAChE,wCAA4D,CAhBlE,qHAsBI,iBAAkB,CAClB,KAAM,CACN,QAAS,CACT,aAAc,CACd,mCAAgE,CAChE,qDAAkF,CAClF,UAAW,CACX,8EAAsI,CACvI,gGAMC,kFAA6I,CAC7I,oCAAkE,CAClE,oCAAiE,CAJrE,8NAQM,+HAAqN,CAR3N,gHAYM,OAAQ,CACR,gDAA8E,CAbpF,8GAiBM,oCAAkE,CAClE,sCAA0D,CAC3D,gBAuBH,6EAAgJ,CAChJ,eAAgB,ClD2GZ,4CAnE+B,CkDtCnC,oCAAkE,CAClE,4CAAuE,CACvE,iFAA4I,C/C5J1I,4D+C6JkG,C/C5JlG,6D+C4JkG,CAPtG,sBAUI,YAAa,CACd,cAID,yEAAwI,CACxI,kCAA8D,CAC/D,UCrLC,iBAAkB,CACnB,wBAGC,kBAAmB,CACpB,gBAGC,iBAAkB,CAClB,UAAW,CACX,eAAgB,CCtBhB,uBACE,aAAc,CACd,UAAW,CACX,UAAW,CACZ,eDuBD,iBAAkB,CAClB,YAAa,CACb,UAAW,CACX,UAAW,CACX,kBAAmB,CACnB,0BAA2B,ChClBvB,oCjBynDkF,CiBrnDlF,wCgCQN,ehCPQ,eAAgB,CgCevB,CAED,8DAGE,aAAc,CACf,wEAIC,0BAA2B,CAC5B,wEAIC,2BAA4B,CAC7B,8BASG,SAAU,CACV,2BAA4B,CAC5B,cAAe,CAJnB,iJAUI,SAAU,CACV,SAAU,CAXd,oFAgBI,SAAU,CACV,SAAU,ChC5DR,yBjBwnDkC,CiBpnDlC,wCgCuCN,oFhCtCQ,eAAgB,CgCyDrB,CAQH,8CAEE,iBAAkB,CAClB,KAAM,CACN,QAAS,CACT,SAAU,CAEV,YAAa,CACb,kBAAmB,CACnB,sBAAuB,CACvB,SjDghDsC,CiD/gDtC,SAAU,CACV,UjD1Fa,CiD2Fb,iBAAkB,CAClB,eAAgB,CAChB,QAAS,CACT,UjD2gDqC,CiBjmDjC,6BjBmmDgD,CiB/lDhD,wCgCkEN,8ChCjEQ,eAAgB,CgC4FvB,CA3BD,oHAsBI,UjDpGW,CiDqGX,oBAAqB,CACrB,SAAU,CACV,UjDmgDmC,CiDlgDpC,uBAGD,MAAO,CAER,uBAEC,OAAQ,CAET,wDAKC,oBAAqB,CACrB,UjDogDuC,CiDngDvC,WjDmgDuC,CiDlgDvC,2BAA4B,CAC5B,uBAAwB,CACxB,yBAA0B,CAC3B,4BAWC,yDnCRgF,CmCSjF,4BAEC,yDnCXgF,CmCYjF,qBAQC,iBAAkB,CAClB,OAAQ,CACR,QAAS,CACT,MAAO,CACP,SAAU,CACV,YAAa,CACb,sBAAuB,CACvB,SAAU,CAEV,gBjD48CsC,CiD38CtC,kBAAmB,CACnB,ejD08CsC,CiDt9CxC,sCAeI,sBAAuB,CACvB,aAAc,CACd,UjD08CqC,CiDz8CrC,UjD08CoC,CiDz8CpC,SAAU,CACV,gBjD08CoC,CiDz8CpC,ejDy8CoC,CiDx8CpC,kBAAmB,CACnB,cAAe,CACf,qBjD1KW,CiD2KX,2BAA4B,CAC5B,QAAS,CAET,iCAAiE,CACjE,oCAAoE,CACpE,UjDi8CmC,CiBzmDjC,4BjB4mD+C,CiBxmD/C,wCgCsIN,sChCrIQ,eAAgB,CgCqKrB,CAhCH,6BAmCI,SjD87CkC,CiD77CnC,kBASD,iBAAkB,CAClB,SAA4C,CAC5C,cjDw7C0C,CiDv7C1C,QAA2C,CAC3C,mBjDq7C0C,CiDp7C1C,sBjDo7C0C,CiDn7C1C,UjDrMa,CiDsMb,iBAAkB,CACnB,sFAOG,+BjDy7CyD,CiDx7C1D,qDAGC,qBjDxMW,CiDyMZ,iCAGC,UjD5MW,CiD6MZ,kPATC,+BjDy7CyD,CiDx7C1D,6IAGC,qBjDxMW,CiDyMZ,qGAGC,UjD5MW,CiD6MZ,8BEzND,oBAAqB,CACrB,6BAAoD,CACpD,+BAAuD,CACvD,+CAA+E,CAE/E,iBAAkB,CAClB,4FAA4J,CAC7J,0BAIC,GAAK,uBAAW,EAAe,eAAA,CAAqB,CAAA,CAItD,gBAEE,wBAAyC,CACzC,yBAA2C,CAC3C,oCAA2D,CAC3D,gCAAuD,CACvD,kCAA6D,CAC7D,2CAA2D,CAG3D,wDAAsF,CACtF,8BAA+B,CAChC,mBAIC,wBAAyC,CACzC,yBAA2C,CAC3C,+BAAuD,CAExD,wBAQC,GACE,kBAAmB,CAErB,IACE,SAAU,CACV,cAAe,CAAA,CAKnB,cAEE,wBAAyC,CACzC,yBAA2C,CAC3C,oCAA2D,CAC3D,kCAA6D,CAC7D,yCAA2D,CAG3D,6BAA8B,CAC9B,SAAU,CACX,iBAGC,wBAAyC,CACzC,yBAA2C,CAC5C,wCAIG,8BAEE,kCAA6D,CAC9D,CChFL,kFAEE,2BAA+C,CAC/C,2BAA6C,CAC7C,2BAA+C,CAC/C,8BAAqD,CACrD,8BAAqD,CACrD,0CAA6C,CAC7C,oCAAuC,CACvC,mDAA2D,CAC3D,+DAA2D,CAC3D,kDAAuD,CACvD,oDAAuD,CACvD,qCAAqE,C7C6DnE,6B6C5CF,cAEI,cAAe,CACf,QAAS,CACT,kCAA4D,CAC5D,YAAa,CACb,qBAAsB,CACtB,cAAe,CACf,+BAAwD,CACxD,iBAAkB,CAClB,uCAA6D,CAC7D,2BAA4B,CAC5B,SAAU,CnC5BV,yCmC8B+E,CAqElF,CnC/FG,kEmCYJ,cnCXM,eAAgB,CmC8FrB,C7CvCC,6B6C5CF,8BAiBM,KAAM,CACN,MAAO,CACP,+BAAwD,CACxD,oFAAmJ,CACnJ,2BAA4B,CArBlC,4BAyBM,KAAM,CACN,OAAQ,CACR,+BAAwD,CACxD,mFAAkJ,CAClJ,0BAA2B,CA7BjC,4BAiCM,KAAM,CACN,OAAQ,CACR,MAAO,CACP,iCAA2D,CAC3D,eAAgB,CAChB,qFAAoJ,CACpJ,2BAA4B,CAvClC,+BA2CM,OAAQ,CACR,MAAO,CACP,iCAA2D,CAC3D,eAAgB,CAChB,kFAAiJ,CACjJ,0BAA2B,CAhDjC,sDAqDM,cAAe,CArDrB,8DA2DM,kBAAmB,CACpB,C7C7BH,0B6C/BF,cAiEM,2BAA+C,CAC/C,8BAA2D,CAC3D,uCAAwC,CAnE9C,gCAsEQ,YAAa,CAtErB,8BA0EQ,YAAa,CACb,WAAY,CACZ,SAAU,CACV,kBAAmB,CAEnB,uCAAwC,CACzC,C7CpCL,6B6C5CF,cAEI,cAAe,CACf,QAAS,CACT,kCAA4D,CAC5D,YAAa,CACb,qBAAsB,CACtB,cAAe,CACf,+BAAwD,CACxD,iBAAkB,CAClB,uCAA6D,CAC7D,2BAA4B,CAC5B,SAAU,CnC5BV,yCmC8B+E,CAqElF,CnC/FG,kEmCYJ,cnCXM,eAAgB,CmC8FrB,C7CvCC,6B6C5CF,8BAiBM,KAAM,CACN,MAAO,CACP,+BAAwD,CACxD,oFAAmJ,CACnJ,2BAA4B,CArBlC,4BAyBM,KAAM,CACN,OAAQ,CACR,+BAAwD,CACxD,mFAAkJ,CAClJ,0BAA2B,CA7BjC,4BAiCM,KAAM,CACN,OAAQ,CACR,MAAO,CACP,iCAA2D,CAC3D,eAAgB,CAChB,qFAAoJ,CACpJ,2BAA4B,CAvClC,+BA2CM,OAAQ,CACR,MAAO,CACP,iCAA2D,CAC3D,eAAgB,CAChB,kFAAiJ,CACjJ,0BAA2B,CAhDjC,sDAqDM,cAAe,CArDrB,8DA2DM,kBAAmB,CACpB,C7C7BH,0B6C/BF,cAiEM,2BAA+C,CAC/C,8BAA2D,CAC3D,uCAAwC,CAnE9C,gCAsEQ,YAAa,CAtErB,8BA0EQ,YAAa,CACb,WAAY,CACZ,SAAU,CACV,kBAAmB,CAEnB,uCAAwC,CACzC,C7CpCL,6B6C5CF,cAEI,cAAe,CACf,QAAS,CACT,kCAA4D,CAC5D,YAAa,CACb,qBAAsB,CACtB,cAAe,CACf,+BAAwD,CACxD,iBAAkB,CAClB,uCAA6D,CAC7D,2BAA4B,CAC5B,SAAU,CnC5BV,yCmC8B+E,CAqElF,CnC/FG,kEmCYJ,cnCXM,eAAgB,CmC8FrB,C7CvCC,6B6C5CF,8BAiBM,KAAM,CACN,MAAO,CACP,+BAAwD,CACxD,oFAAmJ,CACnJ,2BAA4B,CArBlC,4BAyBM,KAAM,CACN,OAAQ,CACR,+BAAwD,CACxD,mFAAkJ,CAClJ,0BAA2B,CA7BjC,4BAiCM,KAAM,CACN,OAAQ,CACR,MAAO,CACP,iCAA2D,CAC3D,eAAgB,CAChB,qFAAoJ,CACpJ,2BAA4B,CAvClC,+BA2CM,OAAQ,CACR,MAAO,CACP,iCAA2D,CAC3D,eAAgB,CAChB,kFAAiJ,CACjJ,0BAA2B,CAhDjC,sDAqDM,cAAe,CArDrB,8DA2DM,kBAAmB,CACpB,C7C7BH,0B6C/BF,cAiEM,2BAA+C,CAC/C,8BAA2D,CAC3D,uCAAwC,CAnE9C,gCAsEQ,YAAa,CAtErB,8BA0EQ,YAAa,CACb,WAAY,CACZ,SAAU,CACV,kBAAmB,CAEnB,uCAAwC,CACzC,C7CpCL,8B6C5CF,cAEI,cAAe,CACf,QAAS,CACT,kCAA4D,CAC5D,YAAa,CACb,qBAAsB,CACtB,cAAe,CACf,+BAAwD,CACxD,iBAAkB,CAClB,uCAA6D,CAC7D,2BAA4B,CAC5B,SAAU,CnC5BV,yCmC8B+E,CAqElF,CnC/FG,mEmCYJ,cnCXM,eAAgB,CmC8FrB,C7CvCC,8B6C5CF,8BAiBM,KAAM,CACN,MAAO,CACP,+BAAwD,CACxD,oFAAmJ,CACnJ,2BAA4B,CArBlC,4BAyBM,KAAM,CACN,OAAQ,CACR,+BAAwD,CACxD,mFAAkJ,CAClJ,0BAA2B,CA7BjC,4BAiCM,KAAM,CACN,OAAQ,CACR,MAAO,CACP,iCAA2D,CAC3D,eAAgB,CAChB,qFAAoJ,CACpJ,2BAA4B,CAvClC,+BA2CM,OAAQ,CACR,MAAO,CACP,iCAA2D,CAC3D,eAAgB,CAChB,kFAAiJ,CACjJ,0BAA2B,CAhDjC,sDAqDM,cAAe,CArDrB,8DA2DM,kBAAmB,CACpB,C7C7BH,2B6C/BF,cAiEM,2BAA+C,CAC/C,8BAA2D,CAC3D,uCAAwC,CAnE9C,gCAsEQ,YAAa,CAtErB,8BA0EQ,YAAa,CACb,WAAY,CACZ,SAAU,CACV,kBAAmB,CAEnB,uCAAwC,CACzC,C7CpCL,8B6C5CF,eAEI,cAAe,CACf,QAAS,CACT,kCAA4D,CAC5D,YAAa,CACb,qBAAsB,CACtB,cAAe,CACf,+BAAwD,CACxD,iBAAkB,CAClB,uCAA6D,CAC7D,2BAA4B,CAC5B,SAAU,CnC5BV,yCmC8B+E,CAqElF,CnC/FG,mEmCYJ,enCXM,eAAgB,CmC8FrB,C7CvCC,8B6C5CF,+BAiBM,KAAM,CACN,MAAO,CACP,+BAAwD,CACxD,oFAAmJ,CACnJ,2BAA4B,CArBlC,6BAyBM,KAAM,CACN,OAAQ,CACR,+BAAwD,CACxD,mFAAkJ,CAClJ,0BAA2B,CA7BjC,6BAiCM,KAAM,CACN,OAAQ,CACR,MAAO,CACP,iCAA2D,CAC3D,eAAgB,CAChB,qFAAoJ,CACpJ,2BAA4B,CAvClC,gCA2CM,OAAQ,CACR,MAAO,CACP,iCAA2D,CAC3D,eAAgB,CAChB,kFAAiJ,CACjJ,0BAA2B,CAhDjC,wDAqDM,cAAe,CArDrB,iEA2DM,kBAAmB,CACpB,C7C7BH,2B6C/BF,eAiEM,2BAA+C,CAC/C,8BAA2D,CAC3D,uCAAwC,CAnE9C,iCAsEQ,YAAa,CAtErB,+BA0EQ,YAAa,CACb,WAAY,CACZ,SAAU,CACV,kBAAmB,CAEnB,uCAAwC,CACzC,CAhFP,WAEI,cAAe,CACf,QAAS,CACT,kCAA4D,CAC5D,YAAa,CACb,qBAAsB,CACtB,cAAe,CACf,+BAAwD,CACxD,iBAAkB,CAClB,uCAA6D,CAC7D,2BAA4B,CAC5B,SAAU,CnC5BV,yCmC8B+E,CnC1B/E,wCmCYJ,WnCXM,eAAgB,CmC8FrB,CAnFD,2BAiBM,KAAM,CACN,MAAO,CACP,+BAAwD,CACxD,oFAAmJ,CACnJ,2BAA4B,CArBlC,yBAyBM,KAAM,CACN,OAAQ,CACR,+BAAwD,CACxD,mFAAkJ,CAClJ,0BAA2B,CA7BjC,yBAiCM,KAAM,CACN,OAAQ,CACR,MAAO,CACP,iCAA2D,CAC3D,eAAgB,CAChB,qFAAoJ,CACpJ,2BAA4B,CAvClC,4BA2CM,OAAQ,CACR,MAAO,CACP,iCAA2D,CAC3D,eAAgB,CAChB,kFAAiJ,CACjJ,0BAA2B,CAhDjC,gDAqDM,cAAe,CArDrB,qDA2DM,kBAAmB,CACpB,oBP1FL,cAAe,CACf,KAAM,CACN,MAAO,CACP,Y7C0mCsC,C6CzmCtC,WAAY,CACZ,YAAa,CACb,qB7CUa,C6CPb,yBAAS,SAAU,CAAI,yBACd,U7Ci+C2B,C6Cj+CG,kBO+GvC,YAAa,CACb,kBAAmB,CACnB,6BAA8B,CAC9B,mEAA4H,CAJ9H,6BAOI,yFAAkJ,CAClJ,oDAAiF,CACjF,sDAAmF,CACnF,uDAAoF,CACrF,iBAID,eAAgB,CAChB,iDAAsF,CACvF,gBAGC,WAAY,CACZ,mEAA4H,CAC5H,eAAgB,CACjB,aChJC,oBAAqB,CACrB,cAAe,CACf,qBAAsB,CACtB,WAAY,CACZ,6BAA8B,CAC9B,UrDgzCoC,CqDtzCtC,yBASI,oBAAqB,CACrB,UAAW,CACZ,gBAKD,eAAgB,CACjB,gBAGC,eAAgB,CACjB,gBAGC,gBAAiB,CAClB,+BAKG,kDAAmD,CACpD,4BAID,IACE,UrDmxCkC,CAAA,CqD/wCtC,kBACE,2EAA8G,CAC9G,mBAAoB,CACpB,6CAA8C,CAC/C,4BAGC,KACE,sBAAuB,CAAA,CH9CzB,iBACE,aAAc,CACd,UAAW,CACX,UAAW,CACZ,iBIHC,qBAAwE,CACxE,gFAAmJ,CACpJ,cCFC,uEAA4I,CAC5I,iGAAgL,CAFlL,wCAQM,2DAA+H,CAC/H,qFAAgK,CACjK,oBAOL,8EAA+J,CAC/J,wGAAmM,CAFrM,oDAOM,iFAAiK,CACjK,2GAAqM,CACtM,kBC1BH,SAAU,CAEV,iJAAsQ,CACvQ,WCHC,mBAAoB,CACpB,WzD6cmC,CyD5cnC,kBAAmB,CACnB,iFAA6H,CAC7H,2BzD2ciC,CyD1cjC,0BAA2B,CAN7B,eASI,aAAc,CACd,SzDuc6B,CyDtc7B,UzDsc6B,CyDrc7B,iBAAkB,CxCIhB,qCjBkciD,CiB9bjD,wCwCpBN,exCqBQ,eAAgB,CwCPrB,CAGH,8DAIM,kEAA+F,CAChG,OCnBH,iBAAkB,CAClB,UAAW,CAFb,eAKI,aAAc,CACd,kCAAwD,CACxD,UAAW,CAPf,SAWI,iBAAkB,CAClB,KAAM,CACN,MAAO,CACP,UAAW,CACX,WAAY,CACb,WAKC,uBAAuC,CADzC,WACE,qCAAuC,CADzC,YACE,sCAAuC,CADzC,YACE,sCAAuC,CACxC,WCrBD,cAAe,CACf,KAAM,CACN,OAAQ,CACR,MAAO,CACP,Y3DumCsC,C2DtmCvC,cAGC,cAAe,CACf,OAAQ,CACR,QAAS,CACT,MAAO,CACP,Y3D+lCsC,C2D9lCvC,YAQK,eAAgB,CAChB,KAAM,CACN,Y3DmlCkC,C2DllCnC,eAGC,eAAgB,CAChB,QAAS,CACT,Y3D6kCkC,CO9iCpC,0BoDxCA,eACE,eAAgB,CAChB,KAAM,CACN,Y3DmlCkC,C2DllCnC,kBAGC,eAAgB,CAChB,QAAS,CACT,Y3D6kCkC,C2D5kCnC,CpD8BD,0BoDxCA,eACE,eAAgB,CAChB,KAAM,CACN,Y3DmlCkC,C2DllCnC,kBAGC,eAAgB,CAChB,QAAS,CACT,Y3D6kCkC,C2D5kCnC,CpD8BD,0BoDxCA,eACE,eAAgB,CAChB,KAAM,CACN,Y3DmlCkC,C2DllCnC,kBAGC,eAAgB,CAChB,QAAS,CACT,Y3D6kCkC,C2D5kCnC,CpD8BD,2BoDxCA,eACE,eAAgB,CAChB,KAAM,CACN,Y3DmlCkC,C2DllCnC,kBAGC,eAAgB,CAChB,QAAS,CACT,Y3D6kCkC,C2D5kCnC,CpD8BD,2BoDxCA,gBACE,eAAgB,CAChB,KAAM,CACN,Y3DmlCkC,C2DllCnC,mBAGC,eAAgB,CAChB,QAAS,CACT,Y3D6kCkC,C2D5kCnC,CChCL,QACE,YAAa,CACb,kBAAmB,CACnB,kBAAmB,CACnB,kBAAmB,CACpB,QAGC,YAAa,CACb,aAAc,CACd,qBAAsB,CACtB,kBAAmB,CACpB,2ECLC,oBAAqB,CACrB,qBAAsB,CACtB,oBAAqB,CACrB,sBAAuB,CACvB,0BAA2B,CAC3B,gCAAiC,CACjC,6BAA8B,CAC9B,mBAAoB,CAGpB,qGACE,4BAA6B,CAC9B,uBCdC,iBAAkB,CAClB,KAAM,CACN,OAAQ,CACR,QAAS,CACT,MAAO,CACP,S9DgcuC,C8D/bvC,UAAW,CACZ,eCTD,eAAgB,CAChB,sBAAuB,CACvB,kBAAmB,CCApB,ICLC,oBAAqB,CACrB,kBAAmB,CACnB,4BjEisBuE,CiEhsBvE,cAAe,CACf,6BAA8B,CAC9B,WjE2rB+B,CkE/nBzB,gBAOI,kCAA+D,CAPnE,WAOI,6BAA+D,CAPnE,cAOI,gCAA+D,CAPnE,cAOI,gCAA+D,CAPnE,mBAOI,qCAA+D,CAPnE,gBAOI,kCAA+D,CAPnE,aAOI,qBAA+D,CAPnE,WAOI,sBAA+D,CAPnE,YAOI,qBAA+D,CAPnE,oBAOI,6BAA+D,CAPnE,kBAOI,2BAA+D,CAPnE,iBAOI,0BAA+D,CAPnE,kBAOI,gCAA+D,CAPnE,iBAOI,0BAA+D,CAPnE,WAOI,oBAA+D,CAPnE,YAOI,sBAA+D,CAPnE,YAOI,qBAA+D,CAPnE,YAOI,sBAA+D,CAPnE,aAOI,oBAA+D,CAPnE,eAOI,wBAA+D,CAPnE,iBAOI,0BAA+D,CAPnE,kBAOI,2BAA+D,CAPnE,iBAOI,0BAA+D,CAPnE,iBAOI,0BAA+D,CAPnE,mBAOI,4BAA+D,CAPnE,oBAOI,6BAA+D,CAPnE,mBAOI,4BAA+D,CAPnE,iBAOI,0BAA+D,CAPnE,mBAOI,4BAA+D,CAPnE,oBAOI,6BAA+D,CAPnE,mBAOI,4BAA+D,CAPnE,UAOI,yBAA+D,CAPnE,gBAOI,+BAA+D,CAPnE,SAOI,wBAA+D,CAPnE,QAOI,uBAA+D,CAPnE,eAOI,8BAA+D,CAPnE,SAOI,wBAA+D,CAPnE,aAOI,4BAA+D,CAPnE,cAOI,6BAA+D,CAPnE,QAOI,uBAA+D,CAPnE,eAOI,8BAA+D,CAPnE,QAOI,uBAA+D,CAPnE,QAOI,0CAA+D,CAPnE,WAOI,6CAA+D,CAPnE,WAOI,6CAA+D,CAPnE,aAOI,0BAA+D,CAjBnE,oBACE,gFAAoC,CACrC,iBAeG,0BAA+D,CAPnE,mBAOI,4BAA+D,CAPnE,mBAOI,4BAA+D,CAPnE,gBAOI,yBAA+D,CAPnE,iBAOI,0BAA+D,CAPnE,OAOI,gBAA+D,CAPnE,QAOI,kBAA+D,CAPnE,SAOI,mBAA+D,CAPnE,UAOI,mBAA+D,CAPnE,WAOI,qBAA+D,CAPnE,YAOI,sBAA+D,CAPnE,SAOI,iBAA+D,CAPnE,UAOI,mBAA+D,CAPnE,WAOI,oBAA+D,CAPnE,OAOI,kBAA+D,CAPnE,QAOI,oBAA+D,CAPnE,SAOI,qBAA+D,CAPnE,kBAOI,0CAA+D,CAPnE,oBAOI,qCAA+D,CAPnE,oBAOI,qCAA+D,CAPnE,QAOI,sFAA+D,CAPnE,UAOI,mBAA+D,CAPnE,YAOI,0FAA+D,CAPnE,cAOI,uBAA+D,CAPnE,YAOI,4FAA+D,CAPnE,cAOI,yBAA+D,CAPnE,eAOI,6FAA+D,CAPnE,iBAOI,0BAA+D,CAPnE,cAOI,2FAA+D,CAPnE,gBAOI,wBAA+D,CAPnE,gBAIQ,sBAA4B,CAGhC,6EAA+D,CAPnE,cAIQ,sBAA4B,CAGhC,2EAA+D,CAPnE,cAIQ,sBAA4B,CAGhC,2EAA+D,CAPnE,uBAOI,uDAA+D,CAPnE,yBAOI,yDAA+D,CAPnE,uBAOI,uDAA+D,CAPnE,oBAOI,oDAA+D,CAPnE,uBAOI,uDAA+D,CAPnE,sBAOI,sDAA+D,CAPnE,qBAOI,qDAA+D,CAPnE,oBAOI,oDAA+D,CAPnE,UAOI,2BAA+D,CAPnE,UAOI,2BAA+D,CAPnE,UAOI,2BAA+D,CAPnE,UAOI,2BAA+D,CAPnE,UAOI,2BAA+D,CAjBnE,mBACE,uBAAoC,CADtC,mBACE,wBAAoC,CADtC,mBACE,uBAAoC,CADtC,mBACE,wBAAoC,CADtC,oBACE,sBAAoC,CACrC,MAeG,oBAA+D,CAPnE,MAOI,oBAA+D,CAPnE,MAOI,oBAA+D,CAPnE,OAOI,qBAA+D,CAPnE,QAOI,qBAA+D,CAPnE,QAOI,yBAA+D,CAPnE,QAOI,sBAA+D,CAPnE,YAOI,0BAA+D,CAPnE,MAOI,qBAA+D,CAPnE,MAOI,qBAA+D,CAPnE,MAOI,qBAA+D,CAPnE,OAOI,sBAA+D,CAPnE,QAOI,sBAA+D,CAPnE,QAOI,0BAA+D,CAPnE,QAOI,uBAA+D,CAPnE,YAOI,2BAA+D,CAPnE,WAOI,wBAA+D,CAPnE,UAOI,6BAA+D,CAPnE,aAOI,gCAA+D,CAPnE,kBAOI,qCAA+D,CAPnE,qBAOI,wCAA+D,CAPnE,aAOI,sBAA+D,CAPnE,aAOI,sBAA+D,CAPnE,eAOI,wBAA+D,CAPnE,eAOI,wBAA+D,CAPnE,WAOI,yBAA+D,CAPnE,aAOI,2BAA+D,CAPnE,mBAOI,iCAA+D,CAPnE,uBAOI,qCAA+D,CAPnE,qBAOI,mCAA+D,CAPnE,wBAOI,iCAA+D,CAPnE,yBAOI,wCAA+D,CAPnE,wBAOI,uCAA+D,CAPnE,wBAOI,uCAA+D,CAPnE,mBAOI,iCAA+D,CAPnE,iBAOI,+BAA+D,CAPnE,oBAOI,6BAA+D,CAPnE,sBAOI,+BAA+D,CAPnE,qBAOI,8BAA+D,CAPnE,qBAOI,mCAA+D,CAPnE,mBAOI,iCAA+D,CAPnE,sBAOI,+BAA+D,CAPnE,uBAOI,sCAA+D,CAPnE,sBAOI,qCAA+D,CAPnE,uBAOI,gCAA+D,CAPnE,iBAOI,0BAA+D,CAPnE,kBAOI,gCAA+D,CAPnE,gBAOI,8BAA+D,CAPnE,mBAOI,4BAA+D,CAPnE,qBAOI,8BAA+D,CAPnE,oBAOI,6BAA+D,CAPnE,aAOI,mBAA+D,CAPnE,SAOI,kBAA+D,CAPnE,SAOI,kBAA+D,CAPnE,SAOI,kBAA+D,CAPnE,SAOI,kBAA+D,CAPnE,SAOI,kBAA+D,CAPnE,SAOI,kBAA+D,CAPnE,YAOI,kBAA+D,CAPnE,KAOI,mBAA+D,CAPnE,KAOI,wBAA+D,CAPnE,KAOI,uBAA+D,CAPnE,KAOI,sBAA+D,CAPnE,KAOI,wBAA+D,CAPnE,KAOI,sBAA+D,CAPnE,QAOI,sBAA+D,CAPnE,MAOI,yBAA+D,CAA/D,wBAA+D,CAPnE,MAOI,8BAA+D,CAA/D,6BAA+D,CAPnE,MAOI,6BAA+D,CAA/D,4BAA+D,CAPnE,MAOI,4BAA+D,CAA/D,2BAA+D,CAPnE,MAOI,8BAA+D,CAA/D,6BAA+D,CAPnE,MAOI,4BAA+D,CAA/D,2BAA+D,CAPnE,SAOI,4BAA+D,CAA/D,2BAA+D,CAPnE,MAOI,uBAA+D,CAA/D,0BAA+D,CAPnE,MAOI,4BAA+D,CAA/D,+BAA+D,CAPnE,MAOI,2BAA+D,CAA/D,8BAA+D,CAPnE,MAOI,0BAA+D,CAA/D,6BAA+D,CAPnE,MAOI,4BAA+D,CAA/D,+BAA+D,CAPnE,MAOI,0BAA+D,CAA/D,6BAA+D,CAPnE,SAOI,0BAA+D,CAA/D,6BAA+D,CAPnE,MAOI,uBAA+D,CAPnE,MAOI,4BAA+D,CAPnE,MAOI,2BAA+D,CAPnE,MAOI,0BAA+D,CAPnE,MAOI,4BAA+D,CAPnE,MAOI,0BAA+D,CAPnE,SAOI,0BAA+D,CAPnE,MAOI,yBAA+D,CAPnE,MAOI,8BAA+D,CAPnE,MAOI,6BAA+D,CAPnE,MAOI,4BAA+D,CAPnE,MAOI,8BAA+D,CAPnE,MAOI,4BAA+D,CAPnE,SAOI,4BAA+D,CAPnE,MAOI,0BAA+D,CAPnE,MAOI,+BAA+D,CAPnE,MAOI,8BAA+D,CAPnE,MAOI,6BAA+D,CAPnE,MAOI,+BAA+D,CAPnE,MAOI,6BAA+D,CAPnE,SAOI,6BAA+D,CAPnE,MAOI,wBAA+D,CAPnE,MAOI,6BAA+D,CAPnE,MAOI,4BAA+D,CAPnE,MAOI,2BAA+D,CAPnE,MAOI,6BAA+D,CAPnE,MAOI,2BAA+D,CAPnE,SAOI,2BAA+D,CAPnE,KAOI,oBAA+D,CAPnE,KAOI,yBAA+D,CAPnE,KAOI,wBAA+D,CAPnE,KAOI,uBAA+D,CAPnE,KAOI,yBAA+D,CAPnE,KAOI,uBAA+D,CAPnE,MAOI,0BAA+D,CAA/D,yBAA+D,CAPnE,MAOI,+BAA+D,CAA/D,8BAA+D,CAPnE,MAOI,8BAA+D,CAA/D,6BAA+D,CAPnE,MAOI,6BAA+D,CAA/D,4BAA+D,CAPnE,MAOI,+BAA+D,CAA/D,8BAA+D,CAPnE,MAOI,6BAA+D,CAA/D,4BAA+D,CAPnE,MAOI,wBAA+D,CAA/D,2BAA+D,CAPnE,MAOI,6BAA+D,CAA/D,gCAA+D,CAPnE,MAOI,4BAA+D,CAA/D,+BAA+D,CAPnE,MAOI,2BAA+D,CAA/D,8BAA+D,CAPnE,MAOI,6BAA+D,CAA/D,gCAA+D,CAPnE,MAOI,2BAA+D,CAA/D,8BAA+D,CAPnE,MAOI,wBAA+D,CAPnE,MAOI,6BAA+D,CAPnE,MAOI,4BAA+D,CAPnE,MAOI,2BAA+D,CAPnE,MAOI,6BAA+D,CAPnE,MAOI,2BAA+D,CAPnE,MAOI,0BAA+D,CAPnE,MAOI,+BAA+D,CAPnE,MAOI,8BAA+D,CAPnE,MAOI,6BAA+D,CAPnE,MAOI,+BAA+D,CAPnE,MAOI,6BAA+D,CAPnE,MAOI,2BAA+D,CAPnE,MAOI,gCAA+D,CAPnE,MAOI,+BAA+D,CAPnE,MAOI,8BAA+D,CAPnE,MAOI,gCAA+D,CAPnE,MAOI,8BAA+D,CAPnE,MAOI,yBAA+D,CAPnE,MAOI,8BAA+D,CAPnE,MAOI,6BAA+D,CAPnE,MAOI,4BAA+D,CAPnE,MAOI,8BAA+D,CAPnE,MAOI,4BAA+D,CAPnE,OAOI,gBAA+D,CAPnE,OAOI,qBAA+D,CAPnE,OAOI,oBAA+D,CAPnE,OAOI,mBAA+D,CAPnE,OAOI,qBAA+D,CAPnE,OAOI,mBAA+D,CAPnE,WAOI,oBAA+D,CAPnE,WAOI,yBAA+D,CAPnE,WAOI,wBAA+D,CAPnE,WAOI,uBAA+D,CAPnE,WAOI,yBAA+D,CAPnE,WAOI,uBAA+D,CAPnE,cAOI,uBAA+D,CAPnE,cAOI,4BAA+D,CAPnE,cAOI,2BAA+D,CAPnE,cAOI,0BAA+D,CAPnE,cAOI,4BAA+D,CAPnE,cAOI,0BAA+D,CAPnE,gBAOI,+CAA+D,CAPnE,MAOI,2CAA+D,CAPnE,MAOI,0CAA+D,CAPnE,MAOI,wCAA+D,CAPnE,MAOI,0CAA+D,CAPnE,MAOI,4BAA+D,CAPnE,MAOI,yBAA+D,CAPnE,YAOI,4BAA+D,CAPnE,YAOI,4BAA+D,CAPnE,YAOI,8BAA+D,CAPnE,UAOI,0BAA+D,CAPnE,WAOI,0BAA+D,CAPnE,WAOI,0BAA+D,CAPnE,aAOI,0BAA+D,CAPnE,SAOI,0BAA+D,CAPnE,WAOI,6BAA+D,CAPnE,MAOI,wBAA+D,CAPnE,OAOI,2BAA+D,CAPnE,SAOI,0BAA+D,CAPnE,OAOI,wBAA+D,CAPnE,YAOI,0BAA+D,CAPnE,UAOI,2BAA+D,CAPnE,aAOI,4BAA+D,CAPnE,sBAOI,+BAA+D,CAPnE,2BAOI,oCAA+D,CAPnE,8BAOI,uCAA+D,CAPnE,gBAOI,mCAA+D,CAPnE,gBAOI,mCAA+D,CAPnE,iBAOI,oCAA+D,CAPnE,WAOI,6BAA+D,CAPnE,aAOI,6BAA+D,CAPnE,YAOI,+BAA+D,CAA/D,gCAA+D,CAPnE,cAIQ,oBAA4B,CAGhC,oEAA+D,CAPnE,YAIQ,oBAA4B,CAGhC,kEAA+D,CAPnE,YAIQ,oBAA4B,CAGhC,kEAA+D,CAPnE,WAIQ,oBAA4B,CAGhC,uEAA+D,CAPnE,YAIQ,oBAA4B,CAGhC,0CAA+D,CAPnE,eAIQ,oBAA4B,CAGhC,gCAA+D,CAPnE,eAIQ,oBAA4B,CAGhC,sCAA+D,CAPnE,qBAIQ,oBAA4B,CAGhC,0CAA+D,CAPnE,oBAIQ,oBAA4B,CAGhC,yCAA+D,CAPnE,oBAIQ,oBAA4B,CAGhC,yCAA+D,CAPnE,YAIQ,oBAA4B,CAGhC,wBAA+D,CAjBnE,iBACE,sBAAoC,CADtC,iBACE,qBAAoC,CADtC,iBACE,sBAAoC,CADtC,kBACE,oBAAoC,CACrC,uBAeG,gDAA+D,CAPnE,yBAOI,kDAA+D,CAPnE,uBAOI,gDAA+D,CAPnE,oBAOI,6CAA+D,CAPnE,uBAOI,gDAA+D,CAPnE,sBAOI,+CAA+D,CAPnE,qBAOI,8CAA+D,CAPnE,oBAOI,6CAA+D,CAjBnE,iBACE,qBAAoC,CACrC,6BAIG,qBAAoC,CANxC,iBACE,sBAAoC,CACrC,6BAIG,sBAAoC,CANxC,iBACE,qBAAoC,CACrC,6BAIG,qBAAoC,CANxC,iBACE,sBAAoC,CACrC,6BAIG,sBAAoC,CANxC,kBACE,oBAAoC,CACrC,8BAIG,oBAAoC,CACrC,eAUC,uCAA+D,CAElE,2BAUK,uCAA+D,CAnBrE,eAOI,sCAA+D,CAElE,2BAUK,sCAA+D,CAnBrE,eAOI,uCAA+D,CAElE,2BAUK,uCAA+D,CAnBrE,wBAIQ,8BAA4B,CAGhC,8FAA+D,CAPnE,gBAIQ,8BAA4B,CAGhC,oGAA+D,CAjBnE,0BACE,8BAAoC,CACrC,sCAIG,8BAAoC,CANxC,2BACE,+BAAoC,CACrC,uCAIG,+BAAoC,CANxC,2BACE,gCAAoC,CACrC,uCAIG,gCAAoC,CANxC,2BACE,+BAAoC,CACrC,uCAIG,+BAAoC,CANxC,2BACE,gCAAoC,CACrC,uCAIG,gCAAoC,CANxC,4BACE,8BAAoC,CACrC,wCAIG,8BAAoC,CACrC,YAOK,kBAA4B,CAGhC,6EAA+D,CAPnE,UAIQ,kBAA4B,CAGhC,2EAA+D,CAPnE,UAIQ,kBAA4B,CAGhC,2EAA+D,CAPnE,SAIQ,kBAA4B,CAGhC,6EAA+D,CAPnE,gBAIQ,kBAA4B,CAGhC,yCAA+D,CAPnE,mBAIQ,kBAA4B,CAGhC,kFAA+D,CAPnE,kBAIQ,kBAA4B,CAGhC,iFAA+D,CAjBnE,eACE,mBAAoC,CADtC,eACE,oBAAoC,CADtC,eACE,mBAAoC,CADtC,eACE,oBAAoC,CADtC,gBACE,kBAAoC,CACrC,mBAeG,uDAA+D,CAPnE,qBAOI,yDAA+D,CAPnE,mBAOI,uDAA+D,CAPnE,gBAOI,oDAA+D,CAPnE,mBAOI,uDAA+D,CAPnE,kBAOI,sDAA+D,CAPnE,iBAOI,qDAA+D,CAPnE,gBAOI,oDAA+D,CAPnE,aAOI,8CAA+D,CAPnE,iBAOI,0BAA+D,CAPnE,kBAOI,2BAA+D,CAPnE,kBAOI,2BAA+D,CAPnE,SAOI,8BAA+D,CAPnE,SAOI,8BAA+D,CAPnE,SAOI,gDAA+D,CAPnE,WAOI,0BAA+D,CAPnE,WAOI,mDAA+D,CAPnE,WAOI,gDAA+D,CAPnE,WAOI,mDAA+D,CAPnE,WAOI,mDAA+D,CAPnE,WAOI,oDAA+D,CAPnE,gBAOI,4BAA+D,CAPnE,cAOI,qDAA+D,CAPnE,aAOI,yDAA+D,CAA/D,0DAA+D,CAPnE,eAOI,mCAA+D,CAA/D,oCAA+D,CAPnE,eAOI,4DAA+D,CAA/D,6DAA+D,CAPnE,eAOI,yDAA+D,CAA/D,0DAA+D,CAPnE,eAOI,4DAA+D,CAA/D,6DAA+D,CAPnE,eAOI,4DAA+D,CAA/D,6DAA+D,CAPnE,eAOI,6DAA+D,CAA/D,8DAA+D,CAPnE,oBAOI,qCAA+D,CAA/D,sCAA+D,CAPnE,kBAOI,8DAA+D,CAA/D,+DAA+D,CAPnE,aAOI,0DAA+D,CAA/D,6DAA+D,CAPnE,eAOI,oCAA+D,CAA/D,uCAA+D,CAPnE,eAOI,6DAA+D,CAA/D,gEAA+D,CAPnE,eAOI,0DAA+D,CAA/D,6DAA+D,CAPnE,eAOI,6DAA+D,CAA/D,gEAA+D,CAPnE,eAOI,6DAA+D,CAA/D,gEAA+D,CAPnE,eAOI,8DAA+D,CAA/D,iEAA+D,CAPnE,oBAOI,sCAA+D,CAA/D,yCAA+D,CAPnE,kBAOI,+DAA+D,CAA/D,kEAA+D,CAPnE,gBAOI,6DAA+D,CAA/D,4DAA+D,CAPnE,kBAOI,uCAA+D,CAA/D,sCAA+D,CAPnE,kBAOI,gEAA+D,CAA/D,+DAA+D,CAPnE,kBAOI,6DAA+D,CAA/D,4DAA+D,CAPnE,kBAOI,gEAA+D,CAA/D,+DAA+D,CAPnE,kBAOI,gEAA+D,CAA/D,+DAA+D,CAPnE,kBAOI,iEAA+D,CAA/D,gEAA+D,CAPnE,uBAOI,yCAA+D,CAA/D,wCAA+D,CAPnE,qBAOI,kEAA+D,CAA/D,iEAA+D,CAPnE,eAOI,4DAA+D,CAA/D,yDAA+D,CAPnE,iBAOI,sCAA+D,CAA/D,mCAA+D,CAPnE,iBAOI,+DAA+D,CAA/D,4DAA+D,CAPnE,iBAOI,4DAA+D,CAA/D,yDAA+D,CAPnE,iBAOI,+DAA+D,CAA/D,4DAA+D,CAPnE,iBAOI,+DAA+D,CAA/D,4DAA+D,CAPnE,iBAOI,gEAA+D,CAA/D,6DAA+D,CAPnE,sBAOI,wCAA+D,CAA/D,qCAA+D,CAPnE,oBAOI,iEAA+D,CAA/D,8DAA+D,CAPnE,SAOI,6BAA+D,CAPnE,WAOI,4BAA+D,CAPnE,MAOI,qBAA+D,CAPnE,KAOI,oBAA+D,CAPnE,KAOI,oBAA+D,CAPnE,KAOI,oBAA+D,CAPnE,KAOI,oBAA+D,C3DVvE,0B2DGI,gBAOI,qBAA+D,CAPnE,cAOI,sBAA+D,CAPnE,eAOI,qBAA+D,CAPnE,uBAOI,6BAA+D,CAPnE,qBAOI,2BAA+D,CAPnE,oBAOI,0BAA+D,CAPnE,qBAOI,gCAA+D,CAPnE,oBAOI,0BAA+D,CAPnE,aAOI,yBAA+D,CAPnE,mBAOI,+BAA+D,CAPnE,YAOI,wBAA+D,CAPnE,WAOI,uBAA+D,CAPnE,kBAOI,8BAA+D,CAPnE,YAOI,wBAA+D,CAPnE,gBAOI,4BAA+D,CAPnE,iBAOI,6BAA+D,CAPnE,WAOI,uBAA+D,CAPnE,kBAOI,8BAA+D,CAPnE,WAOI,uBAA+D,CAPnE,cAOI,wBAA+D,CAPnE,aAOI,6BAA+D,CAPnE,gBAOI,gCAA+D,CAPnE,qBAOI,qCAA+D,CAPnE,wBAOI,wCAA+D,CAPnE,gBAOI,sBAA+D,CAPnE,gBAOI,sBAA+D,CAPnE,kBAOI,wBAA+D,CAPnE,kBAOI,wBAA+D,CAPnE,cAOI,yBAA+D,CAPnE,gBAOI,2BAA+D,CAPnE,sBAOI,iCAA+D,CAPnE,0BAOI,qCAA+D,CAPnE,wBAOI,mCAA+D,CAPnE,2BAOI,iCAA+D,CAPnE,4BAOI,wCAA+D,CAPnE,2BAOI,uCAA+D,CAPnE,2BAOI,uCAA+D,CAPnE,sBAOI,iCAA+D,CAPnE,oBAOI,+BAA+D,CAPnE,uBAOI,6BAA+D,CAPnE,yBAOI,+BAA+D,CAPnE,wBAOI,8BAA+D,CAPnE,wBAOI,mCAA+D,CAPnE,sBAOI,iCAA+D,CAPnE,yBAOI,+BAA+D,CAPnE,0BAOI,sCAA+D,CAPnE,yBAOI,qCAA+D,CAPnE,0BAOI,gCAA+D,CAPnE,oBAOI,0BAA+D,CAPnE,qBAOI,gCAA+D,CAPnE,mBAOI,8BAA+D,CAPnE,sBAOI,4BAA+D,CAPnE,wBAOI,8BAA+D,CAPnE,uBAOI,6BAA+D,CAPnE,gBAOI,mBAA+D,CAPnE,YAOI,kBAA+D,CAPnE,YAOI,kBAA+D,CAPnE,YAOI,kBAA+D,CAPnE,YAOI,kBAA+D,CAPnE,YAOI,kBAA+D,CAPnE,YAOI,kBAA+D,CAPnE,eAOI,kBAA+D,CAPnE,QAOI,mBAA+D,CAPnE,QAOI,wBAA+D,CAPnE,QAOI,uBAA+D,CAPnE,QAOI,sBAA+D,CAPnE,QAOI,wBAA+D,CAPnE,QAOI,sBAA+D,CAPnE,WAOI,sBAA+D,CAPnE,SAOI,yBAA+D,CAA/D,wBAA+D,CAPnE,SAOI,8BAA+D,CAA/D,6BAA+D,CAPnE,SAOI,6BAA+D,CAA/D,4BAA+D,CAPnE,SAOI,4BAA+D,CAA/D,2BAA+D,CAPnE,SAOI,8BAA+D,CAA/D,6BAA+D,CAPnE,SAOI,4BAA+D,CAA/D,2BAA+D,CAPnE,YAOI,4BAA+D,CAA/D,2BAA+D,CAPnE,SAOI,uBAA+D,CAA/D,0BAA+D,CAPnE,SAOI,4BAA+D,CAA/D,+BAA+D,CAPnE,SAOI,2BAA+D,CAA/D,8BAA+D,CAPnE,SAOI,0BAA+D,CAA/D,6BAA+D,CAPnE,SAOI,4BAA+D,CAA/D,+BAA+D,CAPnE,SAOI,0BAA+D,CAA/D,6BAA+D,CAPnE,YAOI,0BAA+D,CAA/D,6BAA+D,CAPnE,SAOI,uBAA+D,CAPnE,SAOI,4BAA+D,CAPnE,SAOI,2BAA+D,CAPnE,SAOI,0BAA+D,CAPnE,SAOI,4BAA+D,CAPnE,SAOI,0BAA+D,CAPnE,YAOI,0BAA+D,CAPnE,SAOI,yBAA+D,CAPnE,SAOI,8BAA+D,CAPnE,SAOI,6BAA+D,CAPnE,SAOI,4BAA+D,CAPnE,SAOI,8BAA+D,CAPnE,SAOI,4BAA+D,CAPnE,YAOI,4BAA+D,CAPnE,SAOI,0BAA+D,CAPnE,SAOI,+BAA+D,CAPnE,SAOI,8BAA+D,CAPnE,SAOI,6BAA+D,CAPnE,SAOI,+BAA+D,CAPnE,SAOI,6BAA+D,CAPnE,YAOI,6BAA+D,CAPnE,SAOI,wBAA+D,CAPnE,SAOI,6BAA+D,CAPnE,SAOI,4BAA+D,CAPnE,SAOI,2BAA+D,CAPnE,SAOI,6BAA+D,CAPnE,SAOI,2BAA+D,CAPnE,YAOI,2BAA+D,CAPnE,QAOI,oBAA+D,CAPnE,QAOI,yBAA+D,CAPnE,QAOI,wBAA+D,CAPnE,QAOI,uBAA+D,CAPnE,QAOI,yBAA+D,CAPnE,QAOI,uBAA+D,CAPnE,SAOI,0BAA+D,CAA/D,yBAA+D,CAPnE,SAOI,+BAA+D,CAA/D,8BAA+D,CAPnE,SAOI,8BAA+D,CAA/D,6BAA+D,CAPnE,SAOI,6BAA+D,CAA/D,4BAA+D,CAPnE,SAOI,+BAA+D,CAA/D,8BAA+D,CAPnE,SAOI,6BAA+D,CAA/D,4BAA+D,CAPnE,SAOI,wBAA+D,CAA/D,2BAA+D,CAPnE,SAOI,6BAA+D,CAA/D,gCAA+D,CAPnE,SAOI,4BAA+D,CAA/D,+BAA+D,CAPnE,SAOI,2BAA+D,CAA/D,8BAA+D,CAPnE,SAOI,6BAA+D,CAA/D,gCAA+D,CAPnE,SAOI,2BAA+D,CAA/D,8BAA+D,CAPnE,SAOI,wBAA+D,CAPnE,SAOI,6BAA+D,CAPnE,SAOI,4BAA+D,CAPnE,SAOI,2BAA+D,CAPnE,SAOI,6BAA+D,CAPnE,SAOI,2BAA+D,CAPnE,SAOI,0BAA+D,CAPnE,SAOI,+BAA+D,CAPnE,SAOI,8BAA+D,CAPnE,SAOI,6BAA+D,CAPnE,SAOI,+BAA+D,CAPnE,SAOI,6BAA+D,CAPnE,SAOI,2BAA+D,CAPnE,SAOI,gCAA+D,CAPnE,SAOI,+BAA+D,CAPnE,SAOI,8BAA+D,CAPnE,SAOI,gCAA+D,CAPnE,SAOI,8BAA+D,CAPnE,SAOI,yBAA+D,CAPnE,SAOI,8BAA+D,CAPnE,SAOI,6BAA+D,CAPnE,SAOI,4BAA+D,CAPnE,SAOI,8BAA+D,CAPnE,SAOI,4BAA+D,CAPnE,UAOI,gBAA+D,CAPnE,UAOI,qBAA+D,CAPnE,UAOI,oBAA+D,CAPnE,UAOI,mBAA+D,CAPnE,UAOI,qBAA+D,CAPnE,UAOI,mBAA+D,CAPnE,cAOI,oBAA+D,CAPnE,cAOI,yBAA+D,CAPnE,cAOI,wBAA+D,CAPnE,cAOI,uBAA+D,CAPnE,cAOI,yBAA+D,CAPnE,cAOI,uBAA+D,CAPnE,iBAOI,uBAA+D,CAPnE,iBAOI,4BAA+D,CAPnE,iBAOI,2BAA+D,CAPnE,iBAOI,0BAA+D,CAPnE,iBAOI,4BAA+D,CAPnE,iBAOI,0BAA+D,CAPnE,eAOI,0BAA+D,CAPnE,aAOI,2BAA+D,CAPnE,gBAOI,4BAA+D,CAElE,C3DZL,0B2DGI,gBAOI,qBAA+D,CAPnE,cAOI,sBAA+D,CAPnE,eAOI,qBAA+D,CAPnE,uBAOI,6BAA+D,CAPnE,qBAOI,2BAA+D,CAPnE,oBAOI,0BAA+D,CAPnE,qBAOI,gCAA+D,CAPnE,oBAOI,0BAA+D,CAPnE,aAOI,yBAA+D,CAPnE,mBAOI,+BAA+D,CAPnE,YAOI,wBAA+D,CAPnE,WAOI,uBAA+D,CAPnE,kBAOI,8BAA+D,CAPnE,YAOI,wBAA+D,CAPnE,gBAOI,4BAA+D,CAPnE,iBAOI,6BAA+D,CAPnE,WAOI,uBAA+D,CAPnE,kBAOI,8BAA+D,CAPnE,WAOI,uBAA+D,CAPnE,cAOI,wBAA+D,CAPnE,aAOI,6BAA+D,CAPnE,gBAOI,gCAA+D,CAPnE,qBAOI,qCAA+D,CAPnE,wBAOI,wCAA+D,CAPnE,gBAOI,sBAA+D,CAPnE,gBAOI,sBAA+D,CAPnE,kBAOI,wBAA+D,CAPnE,kBAOI,wBAA+D,CAPnE,cAOI,yBAA+D,CAPnE,gBAOI,2BAA+D,CAPnE,sBAOI,iCAA+D,CAPnE,0BAOI,qCAA+D,CAPnE,wBAOI,mCAA+D,CAPnE,2BAOI,iCAA+D,CAPnE,4BAOI,wCAA+D,CAPnE,2BAOI,uCAA+D,CAPnE,2BAOI,uCAA+D,CAPnE,sBAOI,iCAA+D,CAPnE,oBAOI,+BAA+D,CAPnE,uBAOI,6BAA+D,CAPnE,yBAOI,+BAA+D,CAPnE,wBAOI,8BAA+D,CAPnE,wBAOI,mCAA+D,CAPnE,sBAOI,iCAA+D,CAPnE,yBAOI,+BAA+D,CAPnE,0BAOI,sCAA+D,CAPnE,yBAOI,qCAA+D,CAPnE,0BAOI,gCAA+D,CAPnE,oBAOI,0BAA+D,CAPnE,qBAOI,gCAA+D,CAPnE,mBAOI,8BAA+D,CAPnE,sBAOI,4BAA+D,CAPnE,wBAOI,8BAA+D,CAPnE,uBAOI,6BAA+D,CAPnE,gBAOI,mBAA+D,CAPnE,YAOI,kBAA+D,CAPnE,YAOI,kBAA+D,CAPnE,YAOI,kBAA+D,CAPnE,YAOI,kBAA+D,CAPnE,YAOI,kBAA+D,CAPnE,YAOI,kBAA+D,CAPnE,eAOI,kBAA+D,CAPnE,QAOI,mBAA+D,CAPnE,QAOI,wBAA+D,CAPnE,QAOI,uBAA+D,CAPnE,QAOI,sBAA+D,CAPnE,QAOI,wBAA+D,CAPnE,QAOI,sBAA+D,CAPnE,WAOI,sBAA+D,CAPnE,SAOI,yBAA+D,CAA/D,wBAA+D,CAPnE,SAOI,8BAA+D,CAA/D,6BAA+D,CAPnE,SAOI,6BAA+D,CAA/D,4BAA+D,CAPnE,SAOI,4BAA+D,CAA/D,2BAA+D,CAPnE,SAOI,8BAA+D,CAA/D,6BAA+D,CAPnE,SAOI,4BAA+D,CAA/D,2BAA+D,CAPnE,YAOI,4BAA+D,CAA/D,2BAA+D,CAPnE,SAOI,uBAA+D,CAA/D,0BAA+D,CAPnE,SAOI,4BAA+D,CAA/D,+BAA+D,CAPnE,SAOI,2BAA+D,CAA/D,8BAA+D,CAPnE,SAOI,0BAA+D,CAA/D,6BAA+D,CAPnE,SAOI,4BAA+D,CAA/D,+BAA+D,CAPnE,SAOI,0BAA+D,CAA/D,6BAA+D,CAPnE,YAOI,0BAA+D,CAA/D,6BAA+D,CAPnE,SAOI,uBAA+D,CAPnE,SAOI,4BAA+D,CAPnE,SAOI,2BAA+D,CAPnE,SAOI,0BAA+D,CAPnE,SAOI,4BAA+D,CAPnE,SAOI,0BAA+D,CAPnE,YAOI,0BAA+D,CAPnE,SAOI,yBAA+D,CAPnE,SAOI,8BAA+D,CAPnE,SAOI,6BAA+D,CAPnE,SAOI,4BAA+D,CAPnE,SAOI,8BAA+D,CAPnE,SAOI,4BAA+D,CAPnE,YAOI,4BAA+D,CAPnE,SAOI,0BAA+D,CAPnE,SAOI,+BAA+D,CAPnE,SAOI,8BAA+D,CAPnE,SAOI,6BAA+D,CAPnE,SAOI,+BAA+D,CAPnE,SAOI,6BAA+D,CAPnE,YAOI,6BAA+D,CAPnE,SAOI,wBAA+D,CAPnE,SAOI,6BAA+D,CAPnE,SAOI,4BAA+D,CAPnE,SAOI,2BAA+D,CAPnE,SAOI,6BAA+D,CAPnE,SAOI,2BAA+D,CAPnE,YAOI,2BAA+D,CAPnE,QAOI,oBAA+D,CAPnE,QAOI,yBAA+D,CAPnE,QAOI,wBAA+D,CAPnE,QAOI,uBAA+D,CAPnE,QAOI,yBAA+D,CAPnE,QAOI,uBAA+D,CAPnE,SAOI,0BAA+D,CAA/D,yBAA+D,CAPnE,SAOI,+BAA+D,CAA/D,8BAA+D,CAPnE,SAOI,8BAA+D,CAA/D,6BAA+D,CAPnE,SAOI,6BAA+D,CAA/D,4BAA+D,CAPnE,SAOI,+BAA+D,CAA/D,8BAA+D,CAPnE,SAOI,6BAA+D,CAA/D,4BAA+D,CAPnE,SAOI,wBAA+D,CAA/D,2BAA+D,CAPnE,SAOI,6BAA+D,CAA/D,gCAA+D,CAPnE,SAOI,4BAA+D,CAA/D,+BAA+D,CAPnE,SAOI,2BAA+D,CAA/D,8BAA+D,CAPnE,SAOI,6BAA+D,CAA/D,gCAA+D,CAPnE,SAOI,2BAA+D,CAA/D,8BAA+D,CAPnE,SAOI,wBAA+D,CAPnE,SAOI,6BAA+D,CAPnE,SAOI,4BAA+D,CAPnE,SAOI,2BAA+D,CAPnE,SAOI,6BAA+D,CAPnE,SAOI,2BAA+D,CAPnE,SAOI,0BAA+D,CAPnE,SAOI,+BAA+D,CAPnE,SAOI,8BAA+D,CAPnE,SAOI,6BAA+D,CAPnE,SAOI,+BAA+D,CAPnE,SAOI,6BAA+D,CAPnE,SAOI,2BAA+D,CAPnE,SAOI,gCAA+D,CAPnE,SAOI,+BAA+D,CAPnE,SAOI,8BAA+D,CAPnE,SAOI,gCAA+D,CAPnE,SAOI,8BAA+D,CAPnE,SAOI,yBAA+D,CAPnE,SAOI,8BAA+D,CAPnE,SAOI,6BAA+D,CAPnE,SAOI,4BAA+D,CAPnE,SAOI,8BAA+D,CAPnE,SAOI,4BAA+D,CAPnE,UAOI,gBAA+D,CAPnE,UAOI,qBAA+D,CAPnE,UAOI,oBAA+D,CAPnE,UAOI,mBAA+D,CAPnE,UAOI,qBAA+D,CAPnE,UAOI,mBAA+D,CAPnE,cAOI,oBAA+D,CAPnE,cAOI,yBAA+D,CAPnE,cAOI,wBAA+D,CAPnE,cAOI,uBAA+D,CAPnE,cAOI,yBAA+D,CAPnE,cAOI,uBAA+D,CAPnE,iBAOI,uBAA+D,CAPnE,iBAOI,4BAA+D,CAPnE,iBAOI,2BAA+D,CAPnE,iBAOI,0BAA+D,CAPnE,iBAOI,4BAA+D,CAPnE,iBAOI,0BAA+D,CAPnE,eAOI,0BAA+D,CAPnE,aAOI,2BAA+D,CAPnE,gBAOI,4BAA+D,CAElE,C3DZL,0B2DGI,gBAOI,qBAA+D,CAPnE,cAOI,sBAA+D,CAPnE,eAOI,qBAA+D,CAPnE,uBAOI,6BAA+D,CAPnE,qBAOI,2BAA+D,CAPnE,oBAOI,0BAA+D,CAPnE,qBAOI,gCAA+D,CAPnE,oBAOI,0BAA+D,CAPnE,aAOI,yBAA+D,CAPnE,mBAOI,+BAA+D,CAPnE,YAOI,wBAA+D,CAPnE,WAOI,uBAA+D,CAPnE,kBAOI,8BAA+D,CAPnE,YAOI,wBAA+D,CAPnE,gBAOI,4BAA+D,CAPnE,iBAOI,6BAA+D,CAPnE,WAOI,uBAA+D,CAPnE,kBAOI,8BAA+D,CAPnE,WAOI,uBAA+D,CAPnE,cAOI,wBAA+D,CAPnE,aAOI,6BAA+D,CAPnE,gBAOI,gCAA+D,CAPnE,qBAOI,qCAA+D,CAPnE,wBAOI,wCAA+D,CAPnE,gBAOI,sBAA+D,CAPnE,gBAOI,sBAA+D,CAPnE,kBAOI,wBAA+D,CAPnE,kBAOI,wBAA+D,CAPnE,cAOI,yBAA+D,CAPnE,gBAOI,2BAA+D,CAPnE,sBAOI,iCAA+D,CAPnE,0BAOI,qCAA+D,CAPnE,wBAOI,mCAA+D,CAPnE,2BAOI,iCAA+D,CAPnE,4BAOI,wCAA+D,CAPnE,2BAOI,uCAA+D,CAPnE,2BAOI,uCAA+D,CAPnE,sBAOI,iCAA+D,CAPnE,oBAOI,+BAA+D,CAPnE,uBAOI,6BAA+D,CAPnE,yBAOI,+BAA+D,CAPnE,wBAOI,8BAA+D,CAPnE,wBAOI,mCAA+D,CAPnE,sBAOI,iCAA+D,CAPnE,yBAOI,+BAA+D,CAPnE,0BAOI,sCAA+D,CAPnE,yBAOI,qCAA+D,CAPnE,0BAOI,gCAA+D,CAPnE,oBAOI,0BAA+D,CAPnE,qBAOI,gCAA+D,CAPnE,mBAOI,8BAA+D,CAPnE,sBAOI,4BAA+D,CAPnE,wBAOI,8BAA+D,CAPnE,uBAOI,6BAA+D,CAPnE,gBAOI,mBAA+D,CAPnE,YAOI,kBAA+D,CAPnE,YAOI,kBAA+D,CAPnE,YAOI,kBAA+D,CAPnE,YAOI,kBAA+D,CAPnE,YAOI,kBAA+D,CAPnE,YAOI,kBAA+D,CAPnE,eAOI,kBAA+D,CAPnE,QAOI,mBAA+D,CAPnE,QAOI,wBAA+D,CAPnE,QAOI,uBAA+D,CAPnE,QAOI,sBAA+D,CAPnE,QAOI,wBAA+D,CAPnE,QAOI,sBAA+D,CAPnE,WAOI,sBAA+D,CAPnE,SAOI,yBAA+D,CAA/D,wBAA+D,CAPnE,SAOI,8BAA+D,CAA/D,6BAA+D,CAPnE,SAOI,6BAA+D,CAA/D,4BAA+D,CAPnE,SAOI,4BAA+D,CAA/D,2BAA+D,CAPnE,SAOI,8BAA+D,CAA/D,6BAA+D,CAPnE,SAOI,4BAA+D,CAA/D,2BAA+D,CAPnE,YAOI,4BAA+D,CAA/D,2BAA+D,CAPnE,SAOI,uBAA+D,CAA/D,0BAA+D,CAPnE,SAOI,4BAA+D,CAA/D,+BAA+D,CAPnE,SAOI,2BAA+D,CAA/D,8BAA+D,CAPnE,SAOI,0BAA+D,CAA/D,6BAA+D,CAPnE,SAOI,4BAA+D,CAA/D,+BAA+D,CAPnE,SAOI,0BAA+D,CAA/D,6BAA+D,CAPnE,YAOI,0BAA+D,CAA/D,6BAA+D,CAPnE,SAOI,uBAA+D,CAPnE,SAOI,4BAA+D,CAPnE,SAOI,2BAA+D,CAPnE,SAOI,0BAA+D,CAPnE,SAOI,4BAA+D,CAPnE,SAOI,0BAA+D,CAPnE,YAOI,0BAA+D,CAPnE,SAOI,yBAA+D,CAPnE,SAOI,8BAA+D,CAPnE,SAOI,6BAA+D,CAPnE,SAOI,4BAA+D,CAPnE,SAOI,8BAA+D,CAPnE,SAOI,4BAA+D,CAPnE,YAOI,4BAA+D,CAPnE,SAOI,0BAA+D,CAPnE,SAOI,+BAA+D,CAPnE,SAOI,8BAA+D,CAPnE,SAOI,6BAA+D,CAPnE,SAOI,+BAA+D,CAPnE,SAOI,6BAA+D,CAPnE,YAOI,6BAA+D,CAPnE,SAOI,wBAA+D,CAPnE,SAOI,6BAA+D,CAPnE,SAOI,4BAA+D,CAPnE,SAOI,2BAA+D,CAPnE,SAOI,6BAA+D,CAPnE,SAOI,2BAA+D,CAPnE,YAOI,2BAA+D,CAPnE,QAOI,oBAA+D,CAPnE,QAOI,yBAA+D,CAPnE,QAOI,wBAA+D,CAPnE,QAOI,uBAA+D,CAPnE,QAOI,yBAA+D,CAPnE,QAOI,uBAA+D,CAPnE,SAOI,0BAA+D,CAA/D,yBAA+D,CAPnE,SAOI,+BAA+D,CAA/D,8BAA+D,CAPnE,SAOI,8BAA+D,CAA/D,6BAA+D,CAPnE,SAOI,6BAA+D,CAA/D,4BAA+D,CAPnE,SAOI,+BAA+D,CAA/D,8BAA+D,CAPnE,SAOI,6BAA+D,CAA/D,4BAA+D,CAPnE,SAOI,wBAA+D,CAA/D,2BAA+D,CAPnE,SAOI,6BAA+D,CAA/D,gCAA+D,CAPnE,SAOI,4BAA+D,CAA/D,+BAA+D,CAPnE,SAOI,2BAA+D,CAA/D,8BAA+D,CAPnE,SAOI,6BAA+D,CAA/D,gCAA+D,CAPnE,SAOI,2BAA+D,CAA/D,8BAA+D,CAPnE,SAOI,wBAA+D,CAPnE,SAOI,6BAA+D,CAPnE,SAOI,4BAA+D,CAPnE,SAOI,2BAA+D,CAPnE,SAOI,6BAA+D,CAPnE,SAOI,2BAA+D,CAPnE,SAOI,0BAA+D,CAPnE,SAOI,+BAA+D,CAPnE,SAOI,8BAA+D,CAPnE,SAOI,6BAA+D,CAPnE,SAOI,+BAA+D,CAPnE,SAOI,6BAA+D,CAPnE,SAOI,2BAA+D,CAPnE,SAOI,gCAA+D,CAPnE,SAOI,+BAA+D,CAPnE,SAOI,8BAA+D,CAPnE,SAOI,gCAA+D,CAPnE,SAOI,8BAA+D,CAPnE,SAOI,yBAA+D,CAPnE,SAOI,8BAA+D,CAPnE,SAOI,6BAA+D,CAPnE,SAOI,4BAA+D,CAPnE,SAOI,8BAA+D,CAPnE,SAOI,4BAA+D,CAPnE,UAOI,gBAA+D,CAPnE,UAOI,qBAA+D,CAPnE,UAOI,oBAA+D,CAPnE,UAOI,mBAA+D,CAPnE,UAOI,qBAA+D,CAPnE,UAOI,mBAA+D,CAPnE,cAOI,oBAA+D,CAPnE,cAOI,yBAA+D,CAPnE,cAOI,wBAA+D,CAPnE,cAOI,uBAA+D,CAPnE,cAOI,yBAA+D,CAPnE,cAOI,uBAA+D,CAPnE,iBAOI,uBAA+D,CAPnE,iBAOI,4BAA+D,CAPnE,iBAOI,2BAA+D,CAPnE,iBAOI,0BAA+D,CAPnE,iBAOI,4BAA+D,CAPnE,iBAOI,0BAA+D,CAPnE,eAOI,0BAA+D,CAPnE,aAOI,2BAA+D,CAPnE,gBAOI,4BAA+D,CAElE,C3DZL,2B2DGI,gBAOI,qBAA+D,CAPnE,cAOI,sBAA+D,CAPnE,eAOI,qBAA+D,CAPnE,uBAOI,6BAA+D,CAPnE,qBAOI,2BAA+D,CAPnE,oBAOI,0BAA+D,CAPnE,qBAOI,gCAA+D,CAPnE,oBAOI,0BAA+D,CAPnE,aAOI,yBAA+D,CAPnE,mBAOI,+BAA+D,CAPnE,YAOI,wBAA+D,CAPnE,WAOI,uBAA+D,CAPnE,kBAOI,8BAA+D,CAPnE,YAOI,wBAA+D,CAPnE,gBAOI,4BAA+D,CAPnE,iBAOI,6BAA+D,CAPnE,WAOI,uBAA+D,CAPnE,kBAOI,8BAA+D,CAPnE,WAOI,uBAA+D,CAPnE,cAOI,wBAA+D,CAPnE,aAOI,6BAA+D,CAPnE,gBAOI,gCAA+D,CAPnE,qBAOI,qCAA+D,CAPnE,wBAOI,wCAA+D,CAPnE,gBAOI,sBAA+D,CAPnE,gBAOI,sBAA+D,CAPnE,kBAOI,wBAA+D,CAPnE,kBAOI,wBAA+D,CAPnE,cAOI,yBAA+D,CAPnE,gBAOI,2BAA+D,CAPnE,sBAOI,iCAA+D,CAPnE,0BAOI,qCAA+D,CAPnE,wBAOI,mCAA+D,CAPnE,2BAOI,iCAA+D,CAPnE,4BAOI,wCAA+D,CAPnE,2BAOI,uCAA+D,CAPnE,2BAOI,uCAA+D,CAPnE,sBAOI,iCAA+D,CAPnE,oBAOI,+BAA+D,CAPnE,uBAOI,6BAA+D,CAPnE,yBAOI,+BAA+D,CAPnE,wBAOI,8BAA+D,CAPnE,wBAOI,mCAA+D,CAPnE,sBAOI,iCAA+D,CAPnE,yBAOI,+BAA+D,CAPnE,0BAOI,sCAA+D,CAPnE,yBAOI,qCAA+D,CAPnE,0BAOI,gCAA+D,CAPnE,oBAOI,0BAA+D,CAPnE,qBAOI,gCAA+D,CAPnE,mBAOI,8BAA+D,CAPnE,sBAOI,4BAA+D,CAPnE,wBAOI,8BAA+D,CAPnE,uBAOI,6BAA+D,CAPnE,gBAOI,mBAA+D,CAPnE,YAOI,kBAA+D,CAPnE,YAOI,kBAA+D,CAPnE,YAOI,kBAA+D,CAPnE,YAOI,kBAA+D,CAPnE,YAOI,kBAA+D,CAPnE,YAOI,kBAA+D,CAPnE,eAOI,kBAA+D,CAPnE,QAOI,mBAA+D,CAPnE,QAOI,wBAA+D,CAPnE,QAOI,uBAA+D,CAPnE,QAOI,sBAA+D,CAPnE,QAOI,wBAA+D,CAPnE,QAOI,sBAA+D,CAPnE,WAOI,sBAA+D,CAPnE,SAOI,yBAA+D,CAA/D,wBAA+D,CAPnE,SAOI,8BAA+D,CAA/D,6BAA+D,CAPnE,SAOI,6BAA+D,CAA/D,4BAA+D,CAPnE,SAOI,4BAA+D,CAA/D,2BAA+D,CAPnE,SAOI,8BAA+D,CAA/D,6BAA+D,CAPnE,SAOI,4BAA+D,CAA/D,2BAA+D,CAPnE,YAOI,4BAA+D,CAA/D,2BAA+D,CAPnE,SAOI,uBAA+D,CAA/D,0BAA+D,CAPnE,SAOI,4BAA+D,CAA/D,+BAA+D,CAPnE,SAOI,2BAA+D,CAA/D,8BAA+D,CAPnE,SAOI,0BAA+D,CAA/D,6BAA+D,CAPnE,SAOI,4BAA+D,CAA/D,+BAA+D,CAPnE,SAOI,0BAA+D,CAA/D,6BAA+D,CAPnE,YAOI,0BAA+D,CAA/D,6BAA+D,CAPnE,SAOI,uBAA+D,CAPnE,SAOI,4BAA+D,CAPnE,SAOI,2BAA+D,CAPnE,SAOI,0BAA+D,CAPnE,SAOI,4BAA+D,CAPnE,SAOI,0BAA+D,CAPnE,YAOI,0BAA+D,CAPnE,SAOI,yBAA+D,CAPnE,SAOI,8BAA+D,CAPnE,SAOI,6BAA+D,CAPnE,SAOI,4BAA+D,CAPnE,SAOI,8BAA+D,CAPnE,SAOI,4BAA+D,CAPnE,YAOI,4BAA+D,CAPnE,SAOI,0BAA+D,CAPnE,SAOI,+BAA+D,CAPnE,SAOI,8BAA+D,CAPnE,SAOI,6BAA+D,CAPnE,SAOI,+BAA+D,CAPnE,SAOI,6BAA+D,CAPnE,YAOI,6BAA+D,CAPnE,SAOI,wBAA+D,CAPnE,SAOI,6BAA+D,CAPnE,SAOI,4BAA+D,CAPnE,SAOI,2BAA+D,CAPnE,SAOI,6BAA+D,CAPnE,SAOI,2BAA+D,CAPnE,YAOI,2BAA+D,CAPnE,QAOI,oBAA+D,CAPnE,QAOI,yBAA+D,CAPnE,QAOI,wBAA+D,CAPnE,QAOI,uBAA+D,CAPnE,QAOI,yBAA+D,CAPnE,QAOI,uBAA+D,CAPnE,SAOI,0BAA+D,CAA/D,yBAA+D,CAPnE,SAOI,+BAA+D,CAA/D,8BAA+D,CAPnE,SAOI,8BAA+D,CAA/D,6BAA+D,CAPnE,SAOI,6BAA+D,CAA/D,4BAA+D,CAPnE,SAOI,+BAA+D,CAA/D,8BAA+D,CAPnE,SAOI,6BAA+D,CAA/D,4BAA+D,CAPnE,SAOI,wBAA+D,CAA/D,2BAA+D,CAPnE,SAOI,6BAA+D,CAA/D,gCAA+D,CAPnE,SAOI,4BAA+D,CAA/D,+BAA+D,CAPnE,SAOI,2BAA+D,CAA/D,8BAA+D,CAPnE,SAOI,6BAA+D,CAA/D,gCAA+D,CAPnE,SAOI,2BAA+D,CAA/D,8BAA+D,CAPnE,SAOI,wBAA+D,CAPnE,SAOI,6BAA+D,CAPnE,SAOI,4BAA+D,CAPnE,SAOI,2BAA+D,CAPnE,SAOI,6BAA+D,CAPnE,SAOI,2BAA+D,CAPnE,SAOI,0BAA+D,CAPnE,SAOI,+BAA+D,CAPnE,SAOI,8BAA+D,CAPnE,SAOI,6BAA+D,CAPnE,SAOI,+BAA+D,CAPnE,SAOI,6BAA+D,CAPnE,SAOI,2BAA+D,CAPnE,SAOI,gCAA+D,CAPnE,SAOI,+BAA+D,CAPnE,SAOI,8BAA+D,CAPnE,SAOI,gCAA+D,CAPnE,SAOI,8BAA+D,CAPnE,SAOI,yBAA+D,CAPnE,SAOI,8BAA+D,CAPnE,SAOI,6BAA+D,CAPnE,SAOI,4BAA+D,CAPnE,SAOI,8BAA+D,CAPnE,SAOI,4BAA+D,CAPnE,UAOI,gBAA+D,CAPnE,UAOI,qBAA+D,CAPnE,UAOI,oBAA+D,CAPnE,UAOI,mBAA+D,CAPnE,UAOI,qBAA+D,CAPnE,UAOI,mBAA+D,CAPnE,cAOI,oBAA+D,CAPnE,cAOI,yBAA+D,CAPnE,cAOI,wBAA+D,CAPnE,cAOI,uBAA+D,CAPnE,cAOI,yBAA+D,CAPnE,cAOI,uBAA+D,CAPnE,iBAOI,uBAA+D,CAPnE,iBAOI,4BAA+D,CAPnE,iBAOI,2BAA+D,CAPnE,iBAOI,0BAA+D,CAPnE,iBAOI,4BAA+D,CAPnE,iBAOI,0BAA+D,CAPnE,eAOI,0BAA+D,CAPnE,aAOI,2BAA+D,CAPnE,gBAOI,4BAA+D,CAElE,C3DZL,2B2DGI,iBAOI,qBAA+D,CAPnE,eAOI,sBAA+D,CAPnE,gBAOI,qBAA+D,CAPnE,wBAOI,6BAA+D,CAPnE,sBAOI,2BAA+D,CAPnE,qBAOI,0BAA+D,CAPnE,sBAOI,gCAA+D,CAPnE,qBAOI,0BAA+D,CAPnE,cAOI,yBAA+D,CAPnE,oBAOI,+BAA+D,CAPnE,aAOI,wBAA+D,CAPnE,YAOI,uBAA+D,CAPnE,mBAOI,8BAA+D,CAPnE,aAOI,wBAA+D,CAPnE,iBAOI,4BAA+D,CAPnE,kBAOI,6BAA+D,CAPnE,YAOI,uBAA+D,CAPnE,mBAOI,8BAA+D,CAPnE,YAOI,uBAA+D,CAPnE,eAOI,wBAA+D,CAPnE,cAOI,6BAA+D,CAPnE,iBAOI,gCAA+D,CAPnE,sBAOI,qCAA+D,CAPnE,yBAOI,wCAA+D,CAPnE,iBAOI,sBAA+D,CAPnE,iBAOI,sBAA+D,CAPnE,mBAOI,wBAA+D,CAPnE,mBAOI,wBAA+D,CAPnE,eAOI,yBAA+D,CAPnE,iBAOI,2BAA+D,CAPnE,uBAOI,iCAA+D,CAPnE,2BAOI,qCAA+D,CAPnE,yBAOI,mCAA+D,CAPnE,4BAOI,iCAA+D,CAPnE,6BAOI,wCAA+D,CAPnE,4BAOI,uCAA+D,CAPnE,4BAOI,uCAA+D,CAPnE,uBAOI,iCAA+D,CAPnE,qBAOI,+BAA+D,CAPnE,wBAOI,6BAA+D,CAPnE,0BAOI,+BAA+D,CAPnE,yBAOI,8BAA+D,CAPnE,yBAOI,mCAA+D,CAPnE,uBAOI,iCAA+D,CAPnE,0BAOI,+BAA+D,CAPnE,2BAOI,sCAA+D,CAPnE,0BAOI,qCAA+D,CAPnE,2BAOI,gCAA+D,CAPnE,qBAOI,0BAA+D,CAPnE,sBAOI,gCAA+D,CAPnE,oBAOI,8BAA+D,CAPnE,uBAOI,4BAA+D,CAPnE,yBAOI,8BAA+D,CAPnE,wBAOI,6BAA+D,CAPnE,iBAOI,mBAA+D,CAPnE,aAOI,kBAA+D,CAPnE,aAOI,kBAA+D,CAPnE,aAOI,kBAA+D,CAPnE,aAOI,kBAA+D,CAPnE,aAOI,kBAA+D,CAPnE,aAOI,kBAA+D,CAPnE,gBAOI,kBAA+D,CAPnE,SAOI,mBAA+D,CAPnE,SAOI,wBAA+D,CAPnE,SAOI,uBAA+D,CAPnE,SAOI,sBAA+D,CAPnE,SAOI,wBAA+D,CAPnE,SAOI,sBAA+D,CAPnE,YAOI,sBAA+D,CAPnE,UAOI,yBAA+D,CAA/D,wBAA+D,CAPnE,UAOI,8BAA+D,CAA/D,6BAA+D,CAPnE,UAOI,6BAA+D,CAA/D,4BAA+D,CAPnE,UAOI,4BAA+D,CAA/D,2BAA+D,CAPnE,UAOI,8BAA+D,CAA/D,6BAA+D,CAPnE,UAOI,4BAA+D,CAA/D,2BAA+D,CAPnE,aAOI,4BAA+D,CAA/D,2BAA+D,CAPnE,UAOI,uBAA+D,CAA/D,0BAA+D,CAPnE,UAOI,4BAA+D,CAA/D,+BAA+D,CAPnE,UAOI,2BAA+D,CAA/D,8BAA+D,CAPnE,UAOI,0BAA+D,CAA/D,6BAA+D,CAPnE,UAOI,4BAA+D,CAA/D,+BAA+D,CAPnE,UAOI,0BAA+D,CAA/D,6BAA+D,CAPnE,aAOI,0BAA+D,CAA/D,6BAA+D,CAPnE,UAOI,uBAA+D,CAPnE,UAOI,4BAA+D,CAPnE,UAOI,2BAA+D,CAPnE,UAOI,0BAA+D,CAPnE,UAOI,4BAA+D,CAPnE,UAOI,0BAA+D,CAPnE,aAOI,0BAA+D,CAPnE,UAOI,yBAA+D,CAPnE,UAOI,8BAA+D,CAPnE,UAOI,6BAA+D,CAPnE,UAOI,4BAA+D,CAPnE,UAOI,8BAA+D,CAPnE,UAOI,4BAA+D,CAPnE,aAOI,4BAA+D,CAPnE,UAOI,0BAA+D,CAPnE,UAOI,+BAA+D,CAPnE,UAOI,8BAA+D,CAPnE,UAOI,6BAA+D,CAPnE,UAOI,+BAA+D,CAPnE,UAOI,6BAA+D,CAPnE,aAOI,6BAA+D,CAPnE,UAOI,wBAA+D,CAPnE,UAOI,6BAA+D,CAPnE,UAOI,4BAA+D,CAPnE,UAOI,2BAA+D,CAPnE,UAOI,6BAA+D,CAPnE,UAOI,2BAA+D,CAPnE,aAOI,2BAA+D,CAPnE,SAOI,oBAA+D,CAPnE,SAOI,yBAA+D,CAPnE,SAOI,wBAA+D,CAPnE,SAOI,uBAA+D,CAPnE,SAOI,yBAA+D,CAPnE,SAOI,uBAA+D,CAPnE,UAOI,0BAA+D,CAA/D,yBAA+D,CAPnE,UAOI,+BAA+D,CAA/D,8BAA+D,CAPnE,UAOI,8BAA+D,CAA/D,6BAA+D,CAPnE,UAOI,6BAA+D,CAA/D,4BAA+D,CAPnE,UAOI,+BAA+D,CAA/D,8BAA+D,CAPnE,UAOI,6BAA+D,CAA/D,4BAA+D,CAPnE,UAOI,wBAA+D,CAA/D,2BAA+D,CAPnE,UAOI,6BAA+D,CAA/D,gCAA+D,CAPnE,UAOI,4BAA+D,CAA/D,+BAA+D,CAPnE,UAOI,2BAA+D,CAA/D,8BAA+D,CAPnE,UAOI,6BAA+D,CAA/D,gCAA+D,CAPnE,UAOI,2BAA+D,CAA/D,8BAA+D,CAPnE,UAOI,wBAA+D,CAPnE,UAOI,6BAA+D,CAPnE,UAOI,4BAA+D,CAPnE,UAOI,2BAA+D,CAPnE,UAOI,6BAA+D,CAPnE,UAOI,2BAA+D,CAPnE,UAOI,0BAA+D,CAPnE,UAOI,+BAA+D,CAPnE,UAOI,8BAA+D,CAPnE,UAOI,6BAA+D,CAPnE,UAOI,+BAA+D,CAPnE,UAOI,6BAA+D,CAPnE,UAOI,2BAA+D,CAPnE,UAOI,gCAA+D,CAPnE,UAOI,+BAA+D,CAPnE,UAOI,8BAA+D,CAPnE,UAOI,gCAA+D,CAPnE,UAOI,8BAA+D,CAPnE,UAOI,yBAA+D,CAPnE,UAOI,8BAA+D,CAPnE,UAOI,6BAA+D,CAPnE,UAOI,4BAA+D,CAPnE,UAOI,8BAA+D,CAPnE,UAOI,4BAA+D,CAPnE,WAOI,gBAA+D,CAPnE,WAOI,qBAA+D,CAPnE,WAOI,oBAA+D,CAPnE,WAOI,mBAA+D,CAPnE,WAOI,qBAA+D,CAPnE,WAOI,mBAA+D,CAPnE,eAOI,oBAA+D,CAPnE,eAOI,yBAA+D,CAPnE,eAOI,wBAA+D,CAPnE,eAOI,uBAA+D,CAPnE,eAOI,yBAA+D,CAPnE,eAOI,uBAA+D,CAPnE,kBAOI,uBAA+D,CAPnE,kBAOI,4BAA+D,CAPnE,kBAOI,2BAA+D,CAPnE,kBAOI,0BAA+D,CAPnE,kBAOI,4BAA+D,CAPnE,kBAOI,0BAA+D,CAPnE,gBAOI,0BAA+D,CAPnE,cAOI,2BAA+D,CAPnE,iBAOI,4BAA+D,CAElE,CCxDT,2BD+CQ,MAOI,2BAA+D,CAPnE,MAOI,yBAA+D,CAPnE,MAOI,4BAA+D,CAPnE,MAOI,2BAA+D,CAElE,CCrCT,aD4BQ,gBAOI,yBAA+D,CAPnE,sBAOI,+BAA+D,CAPnE,eAOI,wBAA+D,CAPnE,cAOI,uBAA+D,CAPnE,qBAOI,8BAA+D,CAPnE,eAOI,wBAA+D,CAPnE,mBAOI,4BAA+D,CAPnE,oBAOI,6BAA+D,CAPnE,cAOI,uBAA+D,CAPnE,qBAOI,8BAA+D,CAPnE,cAOI,uBAA+D,CAElE","sourcesContent":[".grid-title {\\n margin-left: 5px;\\n margin-top: 2px;\\n}\\n\\n\\n*,\\n*::before,\\n*::after {\\n box-sizing: border-box;\\n}\\n\\n.card {\\n position: relative;\\n display: -ms-flexbox;\\n display: flex;\\n -ms-flex-direction: column;\\n flex-direction: column;\\n min-width: 0;\\n word-wrap: break-word;\\n background-color: #fff;\\n background-clip: border-box;\\n border: 1px solid rgba(0, 0, 0, 0.125);\\n border-radius: 0.25rem;\\n}\\n\\n.card > hr {\\n margin-right: 0;\\n margin-left: 0;\\n}\\n\\n.card > .list-group:first-child .list-group-item:first-child {\\n border-top-left-radius: 0.25rem;\\n border-top-right-radius: 0.25rem;\\n}\\n\\n.card > .list-group:last-child .list-group-item:last-child {\\n border-bottom-right-radius: 0.25rem;\\n border-bottom-left-radius: 0.25rem;\\n}\\n\\n.card-body {\\n -ms-flex: 1 1 auto;\\n flex: 1 1 auto;\\n min-height: 1px;\\n padding: 1.25rem;\\n}\\n\\n.card-title {\\n margin-bottom: 0.75rem;\\n}\\n\\n.card-subtitle {\\n margin-top: -0.375rem;\\n margin-bottom: 0;\\n}\\n\\n.card-text:last-child {\\n margin-bottom: 0;\\n}\\n\\n.card-link:hover {\\n text-decoration: none;\\n}\\n\\n.card-link + .card-link {\\n margin-left: 1.25rem;\\n}\\n\\n.card-header {\\n padding: 0.75rem 1.25rem;\\n margin-bottom: 0;\\n background-color: rgba(0, 0, 0, 0.03);\\n border-bottom: 1px solid rgba(0, 0, 0, 0.125);\\n}\\n\\n.card-header:first-child {\\n border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0;\\n}\\n\\n.card-header + .list-group .list-group-item:first-child {\\n border-top: 0;\\n}\\n\\n.card-footer {\\n padding: 0.75rem 1.25rem;\\n background-color: rgba(0, 0, 0, 0.03);\\n border-top: 1px solid rgba(0, 0, 0, 0.125);\\n}\\n\\n.card-footer:last-child {\\n border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px);\\n}\\n\\n.card-header-tabs {\\n margin-right: -0.625rem;\\n margin-bottom: -0.75rem;\\n margin-left: -0.625rem;\\n border-bottom: 0;\\n}\\n\\n.card-header-pills {\\n margin-right: -0.625rem;\\n margin-left: -0.625rem;\\n}\\n\\n.card-img-overlay {\\n position: absolute;\\n top: 0;\\n right: 0;\\n bottom: 0;\\n left: 0;\\n padding: 1.25rem;\\n}\\n\\n.card-img,\\n.card-img-top,\\n.card-img-bottom {\\n -ms-flex-negative: 0;\\n flex-shrink: 0;\\n width: 100%;\\n}\\n\\n.card-img,\\n.card-img-top {\\n border-top-left-radius: calc(0.25rem - 1px);\\n border-top-right-radius: calc(0.25rem - 1px);\\n}\\n\\n.card-img,\\n.card-img-bottom {\\n border-bottom-right-radius: calc(0.25rem - 1px);\\n border-bottom-left-radius: calc(0.25rem - 1px);\\n}\\n\\n.card-deck .card {\\n margin-bottom: 15px;\\n}\\n\\n@media (min-width: 576px) {\\n .card-deck {\\n display: -ms-flexbox;\\n display: flex;\\n -ms-flex-flow: row wrap;\\n flex-flow: row wrap;\\n margin-right: -15px;\\n margin-left: -15px;\\n }\\n .card-deck .card {\\n -ms-flex: 1 0 0%;\\n flex: 1 0 0%;\\n margin-right: 15px;\\n margin-bottom: 0;\\n margin-left: 15px;\\n }\\n}\\n\\n.card-group > .card {\\n margin-bottom: 15px;\\n}\\n\\n@media (min-width: 576px) {\\n .card-group {\\n display: -ms-flexbox;\\n display: flex;\\n -ms-flex-flow: row wrap;\\n flex-flow: row wrap;\\n }\\n .card-group > .card {\\n -ms-flex: 1 0 0%;\\n flex: 1 0 0%;\\n margin-bottom: 0;\\n }\\n .card-group > .card + .card {\\n margin-left: 0;\\n border-left: 0;\\n }\\n .card-group > .card:not(:last-child) {\\n border-top-right-radius: 0;\\n border-bottom-right-radius: 0;\\n }\\n .card-group > .card:not(:last-child) .card-img-top,\\n .card-group > .card:not(:last-child) .card-header {\\n border-top-right-radius: 0;\\n }\\n .card-group > .card:not(:last-child) .card-img-bottom,\\n .card-group > .card:not(:last-child) .card-footer {\\n border-bottom-right-radius: 0;\\n }\\n .card-group > .card:not(:first-child) {\\n border-top-left-radius: 0;\\n border-bottom-left-radius: 0;\\n }\\n .card-group > .card:not(:first-child) .card-img-top,\\n .card-group > .card:not(:first-child) .card-header {\\n border-top-left-radius: 0;\\n }\\n .card-group > .card:not(:first-child) .card-img-bottom,\\n .card-group > .card:not(:first-child) .card-footer {\\n border-bottom-left-radius: 0;\\n }\\n}\\n\\n.form-control {\\n display: block;\\n width: 100%;\\n height: calc(1.5em + 0.75rem + 2px);\\n padding: 0.375rem 0.75rem;\\n font-size: 1rem;\\n font-weight: 400;\\n line-height: 1.5;\\n color: #495057;\\n background-color: #fff;\\n background-clip: padding-box;\\n border: 1px solid #ced4da;\\n border-radius: 0.25rem;\\n transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\\n}\\n\\n@media (prefers-reduced-motion: reduce) {\\n .form-control {\\n transition: none;\\n }\\n}\\n\\n.form-control::-ms-expand {\\n background-color: transparent;\\n border: 0;\\n}\\n\\n.form-control:-moz-focusring {\\n color: transparent;\\n text-shadow: 0 0 0 #495057;\\n}\\n\\n.form-control:focus {\\n color: #495057;\\n background-color: #fff;\\n border-color: #80bdff;\\n outline: 0;\\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\\n}\\n\\n.form-control::-webkit-input-placeholder {\\n color: #6c757d;\\n opacity: 1;\\n}\\n\\n.form-control::-moz-placeholder {\\n color: #6c757d;\\n opacity: 1;\\n}\\n\\n.form-control:-ms-input-placeholder {\\n color: #6c757d;\\n opacity: 1;\\n}\\n\\n.form-control::-ms-input-placeholder {\\n color: #6c757d;\\n opacity: 1;\\n}\\n\\n.form-control::placeholder {\\n color: #6c757d;\\n opacity: 1;\\n}\\n\\n.form-control:disabled, .form-control[readonly] {\\n background-color: #e9ecef;\\n opacity: 1;\\n}\\n\\nselect.form-control:focus::-ms-value {\\n color: #495057;\\n background-color: #fff;\\n}\\n\\n.form-control-file,\\n.form-control-range {\\n display: block;\\n width: 100%;\\n}\\ntextarea.form-control {\\n height: auto;\\n}\\n$theme-colors: (\\n \'primary\': #3f51b5\\n);\\n\\n\\n@import \'~bootstrap/scss/bootstrap\';\\n","@mixin bsBanner($file) {\\n /*!\\n * Bootstrap #{$file} v5.3.2 (https://getbootstrap.com/)\\n * Copyright 2011-2023 The Bootstrap Authors\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\\n */\\n}\\n",":root,\\n[data-bs-theme=\\"light\\"] {\\n // Note: Custom variable values only support SassScript inside `#{}`.\\n\\n // Colors\\n //\\n // Generate palettes for full colors, grays, and theme colors.\\n\\n @each $color, $value in $colors {\\n --#{$prefix}#{$color}: #{$value};\\n }\\n\\n @each $color, $value in $grays {\\n --#{$prefix}gray-#{$color}: #{$value};\\n }\\n\\n @each $color, $value in $theme-colors {\\n --#{$prefix}#{$color}: #{$value};\\n }\\n\\n @each $color, $value in $theme-colors-rgb {\\n --#{$prefix}#{$color}-rgb: #{$value};\\n }\\n\\n @each $color, $value in $theme-colors-text {\\n --#{$prefix}#{$color}-text-emphasis: #{$value};\\n }\\n\\n @each $color, $value in $theme-colors-bg-subtle {\\n --#{$prefix}#{$color}-bg-subtle: #{$value};\\n }\\n\\n @each $color, $value in $theme-colors-border-subtle {\\n --#{$prefix}#{$color}-border-subtle: #{$value};\\n }\\n\\n --#{$prefix}white-rgb: #{to-rgb($white)};\\n --#{$prefix}black-rgb: #{to-rgb($black)};\\n\\n // Fonts\\n\\n // Note: Use `inspect` for lists so that quoted items keep the quotes.\\n // See https://github.com/sass/sass/issues/2383#issuecomment-336349172\\n --#{$prefix}font-sans-serif: #{inspect($font-family-sans-serif)};\\n --#{$prefix}font-monospace: #{inspect($font-family-monospace)};\\n --#{$prefix}gradient: #{$gradient};\\n\\n // Root and body\\n // scss-docs-start root-body-variables\\n @if $font-size-root != null {\\n --#{$prefix}root-font-size: #{$font-size-root};\\n }\\n --#{$prefix}body-font-family: #{inspect($font-family-base)};\\n @include rfs($font-size-base, --#{$prefix}body-font-size);\\n --#{$prefix}body-font-weight: #{$font-weight-base};\\n --#{$prefix}body-line-height: #{$line-height-base};\\n @if $body-text-align != null {\\n --#{$prefix}body-text-align: #{$body-text-align};\\n }\\n\\n --#{$prefix}body-color: #{$body-color};\\n --#{$prefix}body-color-rgb: #{to-rgb($body-color)};\\n --#{$prefix}body-bg: #{$body-bg};\\n --#{$prefix}body-bg-rgb: #{to-rgb($body-bg)};\\n\\n --#{$prefix}emphasis-color: #{$body-emphasis-color};\\n --#{$prefix}emphasis-color-rgb: #{to-rgb($body-emphasis-color)};\\n\\n --#{$prefix}secondary-color: #{$body-secondary-color};\\n --#{$prefix}secondary-color-rgb: #{to-rgb($body-secondary-color)};\\n --#{$prefix}secondary-bg: #{$body-secondary-bg};\\n --#{$prefix}secondary-bg-rgb: #{to-rgb($body-secondary-bg)};\\n\\n --#{$prefix}tertiary-color: #{$body-tertiary-color};\\n --#{$prefix}tertiary-color-rgb: #{to-rgb($body-tertiary-color)};\\n --#{$prefix}tertiary-bg: #{$body-tertiary-bg};\\n --#{$prefix}tertiary-bg-rgb: #{to-rgb($body-tertiary-bg)};\\n // scss-docs-end root-body-variables\\n\\n --#{$prefix}heading-color: #{$headings-color};\\n\\n --#{$prefix}link-color: #{$link-color};\\n --#{$prefix}link-color-rgb: #{to-rgb($link-color)};\\n --#{$prefix}link-decoration: #{$link-decoration};\\n\\n --#{$prefix}link-hover-color: #{$link-hover-color};\\n --#{$prefix}link-hover-color-rgb: #{to-rgb($link-hover-color)};\\n\\n @if $link-hover-decoration != null {\\n --#{$prefix}link-hover-decoration: #{$link-hover-decoration};\\n }\\n\\n --#{$prefix}code-color: #{$code-color};\\n --#{$prefix}highlight-color: #{$mark-color};\\n --#{$prefix}highlight-bg: #{$mark-bg};\\n\\n // scss-docs-start root-border-var\\n --#{$prefix}border-width: #{$border-width};\\n --#{$prefix}border-style: #{$border-style};\\n --#{$prefix}border-color: #{$border-color};\\n --#{$prefix}border-color-translucent: #{$border-color-translucent};\\n\\n --#{$prefix}border-radius: #{$border-radius};\\n --#{$prefix}border-radius-sm: #{$border-radius-sm};\\n --#{$prefix}border-radius-lg: #{$border-radius-lg};\\n --#{$prefix}border-radius-xl: #{$border-radius-xl};\\n --#{$prefix}border-radius-xxl: #{$border-radius-xxl};\\n --#{$prefix}border-radius-2xl: var(--#{$prefix}border-radius-xxl); // Deprecated in v5.3.0 for consistency\\n --#{$prefix}border-radius-pill: #{$border-radius-pill};\\n // scss-docs-end root-border-var\\n\\n --#{$prefix}box-shadow: #{$box-shadow};\\n --#{$prefix}box-shadow-sm: #{$box-shadow-sm};\\n --#{$prefix}box-shadow-lg: #{$box-shadow-lg};\\n --#{$prefix}box-shadow-inset: #{$box-shadow-inset};\\n\\n // Focus styles\\n // scss-docs-start root-focus-variables\\n --#{$prefix}focus-ring-width: #{$focus-ring-width};\\n --#{$prefix}focus-ring-opacity: #{$focus-ring-opacity};\\n --#{$prefix}focus-ring-color: #{$focus-ring-color};\\n // scss-docs-end root-focus-variables\\n\\n // scss-docs-start root-form-validation-variables\\n --#{$prefix}form-valid-color: #{$form-valid-color};\\n --#{$prefix}form-valid-border-color: #{$form-valid-border-color};\\n --#{$prefix}form-invalid-color: #{$form-invalid-color};\\n --#{$prefix}form-invalid-border-color: #{$form-invalid-border-color};\\n // scss-docs-end root-form-validation-variables\\n}\\n\\n@if $enable-dark-mode {\\n @include color-mode(dark, true) {\\n color-scheme: dark;\\n\\n // scss-docs-start root-dark-mode-vars\\n --#{$prefix}body-color: #{$body-color-dark};\\n --#{$prefix}body-color-rgb: #{to-rgb($body-color-dark)};\\n --#{$prefix}body-bg: #{$body-bg-dark};\\n --#{$prefix}body-bg-rgb: #{to-rgb($body-bg-dark)};\\n\\n --#{$prefix}emphasis-color: #{$body-emphasis-color-dark};\\n --#{$prefix}emphasis-color-rgb: #{to-rgb($body-emphasis-color-dark)};\\n\\n --#{$prefix}secondary-color: #{$body-secondary-color-dark};\\n --#{$prefix}secondary-color-rgb: #{to-rgb($body-secondary-color-dark)};\\n --#{$prefix}secondary-bg: #{$body-secondary-bg-dark};\\n --#{$prefix}secondary-bg-rgb: #{to-rgb($body-secondary-bg-dark)};\\n\\n --#{$prefix}tertiary-color: #{$body-tertiary-color-dark};\\n --#{$prefix}tertiary-color-rgb: #{to-rgb($body-tertiary-color-dark)};\\n --#{$prefix}tertiary-bg: #{$body-tertiary-bg-dark};\\n --#{$prefix}tertiary-bg-rgb: #{to-rgb($body-tertiary-bg-dark)};\\n\\n @each $color, $value in $theme-colors-text-dark {\\n --#{$prefix}#{$color}-text-emphasis: #{$value};\\n }\\n\\n @each $color, $value in $theme-colors-bg-subtle-dark {\\n --#{$prefix}#{$color}-bg-subtle: #{$value};\\n }\\n\\n @each $color, $value in $theme-colors-border-subtle-dark {\\n --#{$prefix}#{$color}-border-subtle: #{$value};\\n }\\n\\n --#{$prefix}heading-color: #{$headings-color-dark};\\n\\n --#{$prefix}link-color: #{$link-color-dark};\\n --#{$prefix}link-hover-color: #{$link-hover-color-dark};\\n --#{$prefix}link-color-rgb: #{to-rgb($link-color-dark)};\\n --#{$prefix}link-hover-color-rgb: #{to-rgb($link-hover-color-dark)};\\n\\n --#{$prefix}code-color: #{$code-color-dark};\\n --#{$prefix}highlight-color: #{$mark-color-dark};\\n --#{$prefix}highlight-bg: #{$mark-bg-dark};\\n\\n --#{$prefix}border-color: #{$border-color-dark};\\n --#{$prefix}border-color-translucent: #{$border-color-translucent-dark};\\n\\n --#{$prefix}form-valid-color: #{$form-valid-color-dark};\\n --#{$prefix}form-valid-border-color: #{$form-valid-border-color-dark};\\n --#{$prefix}form-invalid-color: #{$form-invalid-color-dark};\\n --#{$prefix}form-invalid-border-color: #{$form-invalid-border-color-dark};\\n // scss-docs-end root-dark-mode-vars\\n }\\n}\\n","// stylelint-disable scss/dimension-no-non-numeric-values\\n\\n// SCSS RFS mixin\\n//\\n// Automated responsive values for font sizes, paddings, margins and much more\\n//\\n// Licensed under MIT (https://github.com/twbs/rfs/blob/main/LICENSE)\\n\\n// Configuration\\n\\n// Base value\\n$rfs-base-value: 1.25rem !default;\\n$rfs-unit: rem !default;\\n\\n@if $rfs-unit != rem and $rfs-unit != px {\\n @error \\"`#{$rfs-unit}` is not a valid unit for $rfs-unit. Use `px` or `rem`.\\";\\n}\\n\\n// Breakpoint at where values start decreasing if screen width is smaller\\n$rfs-breakpoint: 1200px !default;\\n$rfs-breakpoint-unit: px !default;\\n\\n@if $rfs-breakpoint-unit != px and $rfs-breakpoint-unit != em and $rfs-breakpoint-unit != rem {\\n @error \\"`#{$rfs-breakpoint-unit}` is not a valid unit for $rfs-breakpoint-unit. Use `px`, `em` or `rem`.\\";\\n}\\n\\n// Resize values based on screen height and width\\n$rfs-two-dimensional: false !default;\\n\\n// Factor of decrease\\n$rfs-factor: 10 !default;\\n\\n@if type-of($rfs-factor) != number or $rfs-factor <= 1 {\\n @error \\"`#{$rfs-factor}` is not a valid $rfs-factor, it must be greater than 1.\\";\\n}\\n\\n// Mode. Possibilities: \\"min-media-query\\", \\"max-media-query\\"\\n$rfs-mode: min-media-query !default;\\n\\n// Generate enable or disable classes. Possibilities: false, \\"enable\\" or \\"disable\\"\\n$rfs-class: false !default;\\n\\n// 1 rem = $rfs-rem-value px\\n$rfs-rem-value: 16 !default;\\n\\n// Safari iframe resize bug: https://github.com/twbs/rfs/issues/14\\n$rfs-safari-iframe-resize-bug-fix: false !default;\\n\\n// Disable RFS by setting $enable-rfs to false\\n$enable-rfs: true !default;\\n\\n// Cache $rfs-base-value unit\\n$rfs-base-value-unit: unit($rfs-base-value);\\n\\n@function divide($dividend, $divisor, $precision: 10) {\\n $sign: if($dividend > 0 and $divisor > 0 or $dividend < 0 and $divisor < 0, 1, -1);\\n $dividend: abs($dividend);\\n $divisor: abs($divisor);\\n @if $dividend == 0 {\\n @return 0;\\n }\\n @if $divisor == 0 {\\n @error \\"Cannot divide by 0\\";\\n }\\n $remainder: $dividend;\\n $result: 0;\\n $factor: 10;\\n @while ($remainder > 0 and $precision >= 0) {\\n $quotient: 0;\\n @while ($remainder >= $divisor) {\\n $remainder: $remainder - $divisor;\\n $quotient: $quotient + 1;\\n }\\n $result: $result * 10 + $quotient;\\n $factor: $factor * .1;\\n $remainder: $remainder * 10;\\n $precision: $precision - 1;\\n @if ($precision < 0 and $remainder >= $divisor * 5) {\\n $result: $result + 1;\\n }\\n }\\n $result: $result * $factor * $sign;\\n $dividend-unit: unit($dividend);\\n $divisor-unit: unit($divisor);\\n $unit-map: (\\n \\"px\\": 1px,\\n \\"rem\\": 1rem,\\n \\"em\\": 1em,\\n \\"%\\": 1%\\n );\\n @if ($dividend-unit != $divisor-unit and map-has-key($unit-map, $dividend-unit)) {\\n $result: $result * map-get($unit-map, $dividend-unit);\\n }\\n @return $result;\\n}\\n\\n// Remove px-unit from $rfs-base-value for calculations\\n@if $rfs-base-value-unit == px {\\n $rfs-base-value: divide($rfs-base-value, $rfs-base-value * 0 + 1);\\n}\\n@else if $rfs-base-value-unit == rem {\\n $rfs-base-value: divide($rfs-base-value, divide($rfs-base-value * 0 + 1, $rfs-rem-value));\\n}\\n\\n// Cache $rfs-breakpoint unit to prevent multiple calls\\n$rfs-breakpoint-unit-cache: unit($rfs-breakpoint);\\n\\n// Remove unit from $rfs-breakpoint for calculations\\n@if $rfs-breakpoint-unit-cache == px {\\n $rfs-breakpoint: divide($rfs-breakpoint, $rfs-breakpoint * 0 + 1);\\n}\\n@else if $rfs-breakpoint-unit-cache == rem or $rfs-breakpoint-unit-cache == \\"em\\" {\\n $rfs-breakpoint: divide($rfs-breakpoint, divide($rfs-breakpoint * 0 + 1, $rfs-rem-value));\\n}\\n\\n// Calculate the media query value\\n$rfs-mq-value: if($rfs-breakpoint-unit == px, #{$rfs-breakpoint}px, #{divide($rfs-breakpoint, $rfs-rem-value)}#{$rfs-breakpoint-unit});\\n$rfs-mq-property-width: if($rfs-mode == max-media-query, max-width, min-width);\\n$rfs-mq-property-height: if($rfs-mode == max-media-query, max-height, min-height);\\n\\n// Internal mixin used to determine which media query needs to be used\\n@mixin _rfs-media-query {\\n @if $rfs-two-dimensional {\\n @if $rfs-mode == max-media-query {\\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}), (#{$rfs-mq-property-height}: #{$rfs-mq-value}) {\\n @content;\\n }\\n }\\n @else {\\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}) and (#{$rfs-mq-property-height}: #{$rfs-mq-value}) {\\n @content;\\n }\\n }\\n }\\n @else {\\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}) {\\n @content;\\n }\\n }\\n}\\n\\n// Internal mixin that adds disable classes to the selector if needed.\\n@mixin _rfs-rule {\\n @if $rfs-class == disable and $rfs-mode == max-media-query {\\n // Adding an extra class increases specificity, which prevents the media query to override the property\\n &,\\n .disable-rfs &,\\n &.disable-rfs {\\n @content;\\n }\\n }\\n @else if $rfs-class == enable and $rfs-mode == min-media-query {\\n .enable-rfs &,\\n &.enable-rfs {\\n @content;\\n }\\n } @else {\\n @content;\\n }\\n}\\n\\n// Internal mixin that adds enable classes to the selector if needed.\\n@mixin _rfs-media-query-rule {\\n\\n @if $rfs-class == enable {\\n @if $rfs-mode == min-media-query {\\n @content;\\n }\\n\\n @include _rfs-media-query () {\\n .enable-rfs &,\\n &.enable-rfs {\\n @content;\\n }\\n }\\n }\\n @else {\\n @if $rfs-class == disable and $rfs-mode == min-media-query {\\n .disable-rfs &,\\n &.disable-rfs {\\n @content;\\n }\\n }\\n @include _rfs-media-query () {\\n @content;\\n }\\n }\\n}\\n\\n// Helper function to get the formatted non-responsive value\\n@function rfs-value($values) {\\n // Convert to list\\n $values: if(type-of($values) != list, ($values,), $values);\\n\\n $val: \\"\\";\\n\\n // Loop over each value and calculate value\\n @each $value in $values {\\n @if $value == 0 {\\n $val: $val + \\" 0\\";\\n }\\n @else {\\n // Cache $value unit\\n $unit: if(type-of($value) == \\"number\\", unit($value), false);\\n\\n @if $unit == px {\\n // Convert to rem if needed\\n $val: $val + \\" \\" + if($rfs-unit == rem, #{divide($value, $value * 0 + $rfs-rem-value)}rem, $value);\\n }\\n @else if $unit == rem {\\n // Convert to px if needed\\n $val: $val + \\" \\" + if($rfs-unit == px, #{divide($value, $value * 0 + 1) * $rfs-rem-value}px, $value);\\n } @else {\\n // If $value isn\'t a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\\n $val: $val + \\" \\" + $value;\\n }\\n }\\n }\\n\\n // Remove first space\\n @return unquote(str-slice($val, 2));\\n}\\n\\n// Helper function to get the responsive value calculated by RFS\\n@function rfs-fluid-value($values) {\\n // Convert to list\\n $values: if(type-of($values) != list, ($values,), $values);\\n\\n $val: \\"\\";\\n\\n // Loop over each value and calculate value\\n @each $value in $values {\\n @if $value == 0 {\\n $val: $val + \\" 0\\";\\n } @else {\\n // Cache $value unit\\n $unit: if(type-of($value) == \\"number\\", unit($value), false);\\n\\n // If $value isn\'t a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\\n @if not $unit or $unit != px and $unit != rem {\\n $val: $val + \\" \\" + $value;\\n } @else {\\n // Remove unit from $value for calculations\\n $value: divide($value, $value * 0 + if($unit == px, 1, divide(1, $rfs-rem-value)));\\n\\n // Only add the media query if the value is greater than the minimum value\\n @if abs($value) <= $rfs-base-value or not $enable-rfs {\\n $val: $val + \\" \\" + if($rfs-unit == rem, #{divide($value, $rfs-rem-value)}rem, #{$value}px);\\n }\\n @else {\\n // Calculate the minimum value\\n $value-min: $rfs-base-value + divide(abs($value) - $rfs-base-value, $rfs-factor);\\n\\n // Calculate difference between $value and the minimum value\\n $value-diff: abs($value) - $value-min;\\n\\n // Base value formatting\\n $min-width: if($rfs-unit == rem, #{divide($value-min, $rfs-rem-value)}rem, #{$value-min}px);\\n\\n // Use negative value if needed\\n $min-width: if($value < 0, -$min-width, $min-width);\\n\\n // Use `vmin` if two-dimensional is enabled\\n $variable-unit: if($rfs-two-dimensional, vmin, vw);\\n\\n // Calculate the variable width between 0 and $rfs-breakpoint\\n $variable-width: #{divide($value-diff * 100, $rfs-breakpoint)}#{$variable-unit};\\n\\n // Return the calculated value\\n $val: $val + \\" calc(\\" + $min-width + if($value < 0, \\" - \\", \\" + \\") + $variable-width + \\")\\";\\n }\\n }\\n }\\n }\\n\\n // Remove first space\\n @return unquote(str-slice($val, 2));\\n}\\n\\n// RFS mixin\\n@mixin rfs($values, $property: font-size) {\\n @if $values != null {\\n $val: rfs-value($values);\\n $fluid-val: rfs-fluid-value($values);\\n\\n // Do not print the media query if responsive & non-responsive values are the same\\n @if $val == $fluid-val {\\n #{$property}: $val;\\n }\\n @else {\\n @include _rfs-rule () {\\n #{$property}: if($rfs-mode == max-media-query, $val, $fluid-val);\\n\\n // Include safari iframe resize fix if needed\\n min-width: if($rfs-safari-iframe-resize-bug-fix, (0 * 1vw), null);\\n }\\n\\n @include _rfs-media-query-rule () {\\n #{$property}: if($rfs-mode == max-media-query, $fluid-val, $val);\\n }\\n }\\n }\\n}\\n\\n// Shorthand helper mixins\\n@mixin font-size($value) {\\n @include rfs($value);\\n}\\n\\n@mixin padding($value) {\\n @include rfs($value, padding);\\n}\\n\\n@mixin padding-top($value) {\\n @include rfs($value, padding-top);\\n}\\n\\n@mixin padding-right($value) {\\n @include rfs($value, padding-right);\\n}\\n\\n@mixin padding-bottom($value) {\\n @include rfs($value, padding-bottom);\\n}\\n\\n@mixin padding-left($value) {\\n @include rfs($value, padding-left);\\n}\\n\\n@mixin margin($value) {\\n @include rfs($value, margin);\\n}\\n\\n@mixin margin-top($value) {\\n @include rfs($value, margin-top);\\n}\\n\\n@mixin margin-right($value) {\\n @include rfs($value, margin-right);\\n}\\n\\n@mixin margin-bottom($value) {\\n @include rfs($value, margin-bottom);\\n}\\n\\n@mixin margin-left($value) {\\n @include rfs($value, margin-left);\\n}\\n","// stylelint-disable declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\\n\\n\\n// Reboot\\n//\\n// Normalization of HTML elements, manually forked from Normalize.css to remove\\n// styles targeting irrelevant browsers while applying new styles.\\n//\\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\\n\\n\\n// Document\\n//\\n// Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\\n\\n*,\\n*::before,\\n*::after {\\n box-sizing: border-box;\\n}\\n\\n\\n// Root\\n//\\n// Ability to the value of the root font sizes, affecting the value of `rem`.\\n// null by default, thus nothing is generated.\\n\\n:root {\\n @if $font-size-root != null {\\n @include font-size(var(--#{$prefix}root-font-size));\\n }\\n\\n @if $enable-smooth-scroll {\\n @media (prefers-reduced-motion: no-preference) {\\n scroll-behavior: smooth;\\n }\\n }\\n}\\n\\n\\n// Body\\n//\\n// 1. Remove the margin in all browsers.\\n// 2. As a best practice, apply a default `background-color`.\\n// 3. Prevent adjustments of font size after orientation changes in iOS.\\n// 4. Change the default tap highlight to be completely transparent in iOS.\\n\\n// scss-docs-start reboot-body-rules\\nbody {\\n margin: 0; // 1\\n font-family: var(--#{$prefix}body-font-family);\\n @include font-size(var(--#{$prefix}body-font-size));\\n font-weight: var(--#{$prefix}body-font-weight);\\n line-height: var(--#{$prefix}body-line-height);\\n color: var(--#{$prefix}body-color);\\n text-align: var(--#{$prefix}body-text-align);\\n background-color: var(--#{$prefix}body-bg); // 2\\n -webkit-text-size-adjust: 100%; // 3\\n -webkit-tap-highlight-color: rgba($black, 0); // 4\\n}\\n// scss-docs-end reboot-body-rules\\n\\n\\n// Content grouping\\n//\\n// 1. Reset Firefox\'s gray color\\n\\nhr {\\n margin: $hr-margin-y 0;\\n color: $hr-color; // 1\\n border: 0;\\n border-top: $hr-border-width solid $hr-border-color;\\n opacity: $hr-opacity;\\n}\\n\\n\\n// Typography\\n//\\n// 1. Remove top margins from headings\\n// By default, `<h1>`-`<h6>` all receive top and bottom margins. We nuke the top\\n// margin for easier control within type scales as it avoids margin collapsing.\\n\\n%heading {\\n margin-top: 0; // 1\\n margin-bottom: $headings-margin-bottom;\\n font-family: $headings-font-family;\\n font-style: $headings-font-style;\\n font-weight: $headings-font-weight;\\n line-height: $headings-line-height;\\n color: var(--#{$prefix}heading-color);\\n}\\n\\nh1 {\\n @extend %heading;\\n @include font-size($h1-font-size);\\n}\\n\\nh2 {\\n @extend %heading;\\n @include font-size($h2-font-size);\\n}\\n\\nh3 {\\n @extend %heading;\\n @include font-size($h3-font-size);\\n}\\n\\nh4 {\\n @extend %heading;\\n @include font-size($h4-font-size);\\n}\\n\\nh5 {\\n @extend %heading;\\n @include font-size($h5-font-size);\\n}\\n\\nh6 {\\n @extend %heading;\\n @include font-size($h6-font-size);\\n}\\n\\n\\n// Reset margins on paragraphs\\n//\\n// Similarly, the top margin on `<p>`s get reset. However, we also reset the\\n// bottom margin to use `rem` units instead of `em`.\\n\\np {\\n margin-top: 0;\\n margin-bottom: $paragraph-margin-bottom;\\n}\\n\\n\\n// Abbreviations\\n//\\n// 1. Add the correct text decoration in Chrome, Edge, Opera, and Safari.\\n// 2. Add explicit cursor to indicate changed behavior.\\n// 3. Prevent the text-decoration to be skipped.\\n\\nabbr[title] {\\n text-decoration: underline dotted; // 1\\n cursor: help; // 2\\n text-decoration-skip-ink: none; // 3\\n}\\n\\n\\n// Address\\n\\naddress {\\n margin-bottom: 1rem;\\n font-style: normal;\\n line-height: inherit;\\n}\\n\\n\\n// Lists\\n\\nol,\\nul {\\n padding-left: 2rem;\\n}\\n\\nol,\\nul,\\ndl {\\n margin-top: 0;\\n margin-bottom: 1rem;\\n}\\n\\nol ol,\\nul ul,\\nol ul,\\nul ol {\\n margin-bottom: 0;\\n}\\n\\ndt {\\n font-weight: $dt-font-weight;\\n}\\n\\n// 1. Undo browser default\\n\\ndd {\\n margin-bottom: .5rem;\\n margin-left: 0; // 1\\n}\\n\\n\\n// Blockquote\\n\\nblockquote {\\n margin: 0 0 1rem;\\n}\\n\\n\\n// Strong\\n//\\n// Add the correct font weight in Chrome, Edge, and Safari\\n\\nb,\\nstrong {\\n font-weight: $font-weight-bolder;\\n}\\n\\n\\n// Small\\n//\\n// Add the correct font size in all browsers\\n\\nsmall {\\n @include font-size($small-font-size);\\n}\\n\\n\\n// Mark\\n\\nmark {\\n padding: $mark-padding;\\n color: var(--#{$prefix}highlight-color);\\n background-color: var(--#{$prefix}highlight-bg);\\n}\\n\\n\\n// Sub and Sup\\n//\\n// Prevent `sub` and `sup` elements from affecting the line height in\\n// all browsers.\\n\\nsub,\\nsup {\\n position: relative;\\n @include font-size($sub-sup-font-size);\\n line-height: 0;\\n vertical-align: baseline;\\n}\\n\\nsub { bottom: -.25em; }\\nsup { top: -.5em; }\\n\\n\\n// Links\\n\\na {\\n color: rgba(var(--#{$prefix}link-color-rgb), var(--#{$prefix}link-opacity, 1));\\n text-decoration: $link-decoration;\\n\\n &:hover {\\n --#{$prefix}link-color-rgb: var(--#{$prefix}link-hover-color-rgb);\\n text-decoration: $link-hover-decoration;\\n }\\n}\\n\\n// And undo these styles for placeholder links/named anchors (without href).\\n// It would be more straightforward to just use a[href] in previous block, but that\\n// causes specificity issues in many other styles that are too complex to fix.\\n// See https://github.com/twbs/bootstrap/issues/19402\\n\\na:not([href]):not([class]) {\\n &,\\n &:hover {\\n color: inherit;\\n text-decoration: none;\\n }\\n}\\n\\n\\n// Code\\n\\npre,\\ncode,\\nkbd,\\nsamp {\\n font-family: $font-family-code;\\n @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\\n}\\n\\n// 1. Remove browser default top margin\\n// 2. Reset browser default of `1em` to use `rem`s\\n// 3. Don\'t allow content to break outside\\n\\npre {\\n display: block;\\n margin-top: 0; // 1\\n margin-bottom: 1rem; // 2\\n overflow: auto; // 3\\n @include font-size($code-font-size);\\n color: $pre-color;\\n\\n // Account for some code outputs that place code tags in pre tags\\n code {\\n @include font-size(inherit);\\n color: inherit;\\n word-break: normal;\\n }\\n}\\n\\ncode {\\n @include font-size($code-font-size);\\n color: var(--#{$prefix}code-color);\\n word-wrap: break-word;\\n\\n // Streamline the style when inside anchors to avoid broken underline and more\\n a > & {\\n color: inherit;\\n }\\n}\\n\\nkbd {\\n padding: $kbd-padding-y $kbd-padding-x;\\n @include font-size($kbd-font-size);\\n color: $kbd-color;\\n background-color: $kbd-bg;\\n @include border-radius($border-radius-sm);\\n\\n kbd {\\n padding: 0;\\n @include font-size(1em);\\n font-weight: $nested-kbd-font-weight;\\n }\\n}\\n\\n\\n// Figures\\n//\\n// Apply a consistent margin strategy (matches our type styles).\\n\\nfigure {\\n margin: 0 0 1rem;\\n}\\n\\n\\n// Images and content\\n\\nimg,\\nsvg {\\n vertical-align: middle;\\n}\\n\\n\\n// Tables\\n//\\n// Prevent double borders\\n\\ntable {\\n caption-side: bottom;\\n border-collapse: collapse;\\n}\\n\\ncaption {\\n padding-top: $table-cell-padding-y;\\n padding-bottom: $table-cell-padding-y;\\n color: $table-caption-color;\\n text-align: left;\\n}\\n\\n// 1. Removes font-weight bold by inheriting\\n// 2. Matches default `<td>` alignment by inheriting `text-align`.\\n// 3. Fix alignment for Safari\\n\\nth {\\n font-weight: $table-th-font-weight; // 1\\n text-align: inherit; // 2\\n text-align: -webkit-match-parent; // 3\\n}\\n\\nthead,\\ntbody,\\ntfoot,\\ntr,\\ntd,\\nth {\\n border-color: inherit;\\n border-style: solid;\\n border-width: 0;\\n}\\n\\n\\n// Forms\\n//\\n// 1. Allow labels to use `margin` for spacing.\\n\\nlabel {\\n display: inline-block; // 1\\n}\\n\\n// Remove the default `border-radius` that macOS Chrome adds.\\n// See https://github.com/twbs/bootstrap/issues/24093\\n\\nbutton {\\n // stylelint-disable-next-line property-disallowed-list\\n border-radius: 0;\\n}\\n\\n// Explicitly remove focus outline in Chromium when it shouldn\'t be\\n// visible (e.g. as result of mouse click or touch tap). It already\\n// should be doing this automatically, but seems to currently be\\n// confused and applies its very visible two-tone outline anyway.\\n\\nbutton:focus:not(:focus-visible) {\\n outline: 0;\\n}\\n\\n// 1. Remove the margin in Firefox and Safari\\n\\ninput,\\nbutton,\\nselect,\\noptgroup,\\ntextarea {\\n margin: 0; // 1\\n font-family: inherit;\\n @include font-size(inherit);\\n line-height: inherit;\\n}\\n\\n// Remove the inheritance of text transform in Firefox\\nbutton,\\nselect {\\n text-transform: none;\\n}\\n// Set the cursor for non-`<button>` buttons\\n//\\n// Details at https://github.com/twbs/bootstrap/pull/30562\\n[role=\\"button\\"] {\\n cursor: pointer;\\n}\\n\\nselect {\\n // Remove the inheritance of word-wrap in Safari.\\n // See https://github.com/twbs/bootstrap/issues/24990\\n word-wrap: normal;\\n\\n // Undo the opacity change from Chrome\\n &:disabled {\\n opacity: 1;\\n }\\n}\\n\\n// Remove the dropdown arrow only from text type inputs built with datalists in Chrome.\\n// See https://stackoverflow.com/a/54997118\\n\\n[list]:not([type=\\"date\\"]):not([type=\\"datetime-local\\"]):not([type=\\"month\\"]):not([type=\\"week\\"]):not([type=\\"time\\"])::-webkit-calendar-picker-indicator {\\n display: none !important;\\n}\\n\\n// 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`\\n// controls in Android 4.\\n// 2. Correct the inability to style clickable types in iOS and Safari.\\n// 3. Opinionated: add \\"hand\\" cursor to non-disabled button elements.\\n\\nbutton,\\n[type=\\"button\\"], // 1\\n[type=\\"reset\\"],\\n[type=\\"submit\\"] {\\n -webkit-appearance: button; // 2\\n\\n @if $enable-button-pointers {\\n &:not(:disabled) {\\n cursor: pointer; // 3\\n }\\n }\\n}\\n\\n// Remove inner border and padding from Firefox, but don\'t restore the outline like Normalize.\\n\\n::-moz-focus-inner {\\n padding: 0;\\n border-style: none;\\n}\\n\\n// 1. Textareas should really only resize vertically so they don\'t break their (horizontal) containers.\\n\\ntextarea {\\n resize: vertical; // 1\\n}\\n\\n// 1. Browsers set a default `min-width: min-content;` on fieldsets,\\n// unlike e.g. `<div>`s, which have `min-width: 0;` by default.\\n// So we reset that to ensure fieldsets behave more like a standard block element.\\n// See https://github.com/twbs/bootstrap/issues/12359\\n// and https://html.spec.whatwg.org/multipage/#the-fieldset-and-legend-elements\\n// 2. Reset the default outline behavior of fieldsets so they don\'t affect page layout.\\n\\nfieldset {\\n min-width: 0; // 1\\n padding: 0; // 2\\n margin: 0; // 2\\n border: 0; // 2\\n}\\n\\n// 1. By using `float: left`, the legend will behave like a block element.\\n// This way the border of a fieldset wraps around the legend if present.\\n// 2. Fix wrapping bug.\\n// See https://github.com/twbs/bootstrap/issues/29712\\n\\nlegend {\\n float: left; // 1\\n width: 100%;\\n padding: 0;\\n margin-bottom: $legend-margin-bottom;\\n @include font-size($legend-font-size);\\n font-weight: $legend-font-weight;\\n line-height: inherit;\\n\\n + * {\\n clear: left; // 2\\n }\\n}\\n\\n// Fix height of inputs with a type of datetime-local, date, month, week, or time\\n// See https://github.com/twbs/bootstrap/issues/18842\\n\\n::-webkit-datetime-edit-fields-wrapper,\\n::-webkit-datetime-edit-text,\\n::-webkit-datetime-edit-minute,\\n::-webkit-datetime-edit-hour-field,\\n::-webkit-datetime-edit-day-field,\\n::-webkit-datetime-edit-month-field,\\n::-webkit-datetime-edit-year-field {\\n padding: 0;\\n}\\n\\n::-webkit-inner-spin-button {\\n height: auto;\\n}\\n\\n// 1. This overrides the extra rounded corners on search inputs in iOS so that our\\n// `.form-control` class can properly style them. Note that this cannot simply\\n// be added to `.form-control` as it\'s not specific enough. For details, see\\n// https://github.com/twbs/bootstrap/issues/11586.\\n// 2. Correct the outline style in Safari.\\n\\n[type=\\"search\\"] {\\n -webkit-appearance: textfield; // 1\\n outline-offset: -2px; // 2\\n}\\n\\n// 1. A few input types should stay LTR\\n// See https://rtlstyling.com/posts/rtl-styling#form-inputs\\n// 2. RTL only output\\n// See https://rtlcss.com/learn/usage-guide/control-directives/#raw\\n\\n/* rtl:raw:\\n[type=\\"tel\\"],\\n[type=\\"url\\"],\\n[type=\\"email\\"],\\n[type=\\"number\\"] {\\n direction: ltr;\\n}\\n*/\\n\\n// Remove the inner padding in Chrome and Safari on macOS.\\n\\n::-webkit-search-decoration {\\n -webkit-appearance: none;\\n}\\n\\n// Remove padding around color pickers in webkit browsers\\n\\n::-webkit-color-swatch-wrapper {\\n padding: 0;\\n}\\n\\n\\n// 1. Inherit font family and line height for file input buttons\\n// 2. Correct the inability to style clickable types in iOS and Safari.\\n\\n::file-selector-button {\\n font: inherit; // 1\\n -webkit-appearance: button; // 2\\n}\\n\\n// Correct element displays\\n\\noutput {\\n display: inline-block;\\n}\\n\\n// Remove border from iframe\\n\\niframe {\\n border: 0;\\n}\\n\\n// Summary\\n//\\n// 1. Add the correct display in all browsers\\n\\nsummary {\\n display: list-item; // 1\\n cursor: pointer;\\n}\\n\\n\\n// Progress\\n//\\n// Add the correct vertical alignment in Chrome, Firefox, and Opera.\\n\\nprogress {\\n vertical-align: baseline;\\n}\\n\\n\\n// Hidden attribute\\n//\\n// Always hide an element with the `hidden` HTML attribute.\\n\\n[hidden] {\\n display: none !important;\\n}\\n","// Variables\\n//\\n// Variables should follow the `$component-state-property-size` formula for\\n// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs.\\n\\n// Color system\\n\\n// scss-docs-start gray-color-variables\\n$white: #fff !default;\\n$gray-100: #f8f9fa !default;\\n$gray-200: #e9ecef !default;\\n$gray-300: #dee2e6 !default;\\n$gray-400: #ced4da !default;\\n$gray-500: #adb5bd !default;\\n$gray-600: #6c757d !default;\\n$gray-700: #495057 !default;\\n$gray-800: #343a40 !default;\\n$gray-900: #212529 !default;\\n$black: #000 !default;\\n// scss-docs-end gray-color-variables\\n\\n// fusv-disable\\n// scss-docs-start gray-colors-map\\n$grays: (\\n \\"100\\": $gray-100,\\n \\"200\\": $gray-200,\\n \\"300\\": $gray-300,\\n \\"400\\": $gray-400,\\n \\"500\\": $gray-500,\\n \\"600\\": $gray-600,\\n \\"700\\": $gray-700,\\n \\"800\\": $gray-800,\\n \\"900\\": $gray-900\\n) !default;\\n// scss-docs-end gray-colors-map\\n// fusv-enable\\n\\n// scss-docs-start color-variables\\n$blue: #0d6efd !default;\\n$indigo: #6610f2 !default;\\n$purple: #6f42c1 !default;\\n$pink: #d63384 !default;\\n$red: #dc3545 !default;\\n$orange: #fd7e14 !default;\\n$yellow: #ffc107 !default;\\n$green: #198754 !default;\\n$teal: #20c997 !default;\\n$cyan: #0dcaf0 !default;\\n// scss-docs-end color-variables\\n\\n// scss-docs-start colors-map\\n$colors: (\\n \\"blue\\": $blue,\\n \\"indigo\\": $indigo,\\n \\"purple\\": $purple,\\n \\"pink\\": $pink,\\n \\"red\\": $red,\\n \\"orange\\": $orange,\\n \\"yellow\\": $yellow,\\n \\"green\\": $green,\\n \\"teal\\": $teal,\\n \\"cyan\\": $cyan,\\n \\"black\\": $black,\\n \\"white\\": $white,\\n \\"gray\\": $gray-600,\\n \\"gray-dark\\": $gray-800\\n) !default;\\n// scss-docs-end colors-map\\n\\n// The contrast ratio to reach against white, to determine if color changes from \\"light\\" to \\"dark\\". Acceptable values for WCAG 2.0 are 3, 4.5 and 7.\\n// See https://www.w3.org/TR/WCAG20/#visual-audio-contrast-contrast\\n$min-contrast-ratio: 4.5 !default;\\n\\n// Customize the light and dark text colors for use in our color contrast function.\\n$color-contrast-dark: $black !default;\\n$color-contrast-light: $white !default;\\n\\n// fusv-disable\\n$blue-100: tint-color($blue, 80%) !default;\\n$blue-200: tint-color($blue, 60%) !default;\\n$blue-300: tint-color($blue, 40%) !default;\\n$blue-400: tint-color($blue, 20%) !default;\\n$blue-500: $blue !default;\\n$blue-600: shade-color($blue, 20%) !default;\\n$blue-700: shade-color($blue, 40%) !default;\\n$blue-800: shade-color($blue, 60%) !default;\\n$blue-900: shade-color($blue, 80%) !default;\\n\\n$indigo-100: tint-color($indigo, 80%) !default;\\n$indigo-200: tint-color($indigo, 60%) !default;\\n$indigo-300: tint-color($indigo, 40%) !default;\\n$indigo-400: tint-color($indigo, 20%) !default;\\n$indigo-500: $indigo !default;\\n$indigo-600: shade-color($indigo, 20%) !default;\\n$indigo-700: shade-color($indigo, 40%) !default;\\n$indigo-800: shade-color($indigo, 60%) !default;\\n$indigo-900: shade-color($indigo, 80%) !default;\\n\\n$purple-100: tint-color($purple, 80%) !default;\\n$purple-200: tint-color($purple, 60%) !default;\\n$purple-300: tint-color($purple, 40%) !default;\\n$purple-400: tint-color($purple, 20%) !default;\\n$purple-500: $purple !default;\\n$purple-600: shade-color($purple, 20%) !default;\\n$purple-700: shade-color($purple, 40%) !default;\\n$purple-800: shade-color($purple, 60%) !default;\\n$purple-900: shade-color($purple, 80%) !default;\\n\\n$pink-100: tint-color($pink, 80%) !default;\\n$pink-200: tint-color($pink, 60%) !default;\\n$pink-300: tint-color($pink, 40%) !default;\\n$pink-400: tint-color($pink, 20%) !default;\\n$pink-500: $pink !default;\\n$pink-600: shade-color($pink, 20%) !default;\\n$pink-700: shade-color($pink, 40%) !default;\\n$pink-800: shade-color($pink, 60%) !default;\\n$pink-900: shade-color($pink, 80%) !default;\\n\\n$red-100: tint-color($red, 80%) !default;\\n$red-200: tint-color($red, 60%) !default;\\n$red-300: tint-color($red, 40%) !default;\\n$red-400: tint-color($red, 20%) !default;\\n$red-500: $red !default;\\n$red-600: shade-color($red, 20%) !default;\\n$red-700: shade-color($red, 40%) !default;\\n$red-800: shade-color($red, 60%) !default;\\n$red-900: shade-color($red, 80%) !default;\\n\\n$orange-100: tint-color($orange, 80%) !default;\\n$orange-200: tint-color($orange, 60%) !default;\\n$orange-300: tint-color($orange, 40%) !default;\\n$orange-400: tint-color($orange, 20%) !default;\\n$orange-500: $orange !default;\\n$orange-600: shade-color($orange, 20%) !default;\\n$orange-700: shade-color($orange, 40%) !default;\\n$orange-800: shade-color($orange, 60%) !default;\\n$orange-900: shade-color($orange, 80%) !default;\\n\\n$yellow-100: tint-color($yellow, 80%) !default;\\n$yellow-200: tint-color($yellow, 60%) !default;\\n$yellow-300: tint-color($yellow, 40%) !default;\\n$yellow-400: tint-color($yellow, 20%) !default;\\n$yellow-500: $yellow !default;\\n$yellow-600: shade-color($yellow, 20%) !default;\\n$yellow-700: shade-color($yellow, 40%) !default;\\n$yellow-800: shade-color($yellow, 60%) !default;\\n$yellow-900: shade-color($yellow, 80%) !default;\\n\\n$green-100: tint-color($green, 80%) !default;\\n$green-200: tint-color($green, 60%) !default;\\n$green-300: tint-color($green, 40%) !default;\\n$green-400: tint-color($green, 20%) !default;\\n$green-500: $green !default;\\n$green-600: shade-color($green, 20%) !default;\\n$green-700: shade-color($green, 40%) !default;\\n$green-800: shade-color($green, 60%) !default;\\n$green-900: shade-color($green, 80%) !default;\\n\\n$teal-100: tint-color($teal, 80%) !default;\\n$teal-200: tint-color($teal, 60%) !default;\\n$teal-300: tint-color($teal, 40%) !default;\\n$teal-400: tint-color($teal, 20%) !default;\\n$teal-500: $teal !default;\\n$teal-600: shade-color($teal, 20%) !default;\\n$teal-700: shade-color($teal, 40%) !default;\\n$teal-800: shade-color($teal, 60%) !default;\\n$teal-900: shade-color($teal, 80%) !default;\\n\\n$cyan-100: tint-color($cyan, 80%) !default;\\n$cyan-200: tint-color($cyan, 60%) !default;\\n$cyan-300: tint-color($cyan, 40%) !default;\\n$cyan-400: tint-color($cyan, 20%) !default;\\n$cyan-500: $cyan !default;\\n$cyan-600: shade-color($cyan, 20%) !default;\\n$cyan-700: shade-color($cyan, 40%) !default;\\n$cyan-800: shade-color($cyan, 60%) !default;\\n$cyan-900: shade-color($cyan, 80%) !default;\\n\\n$blues: (\\n \\"blue-100\\": $blue-100,\\n \\"blue-200\\": $blue-200,\\n \\"blue-300\\": $blue-300,\\n \\"blue-400\\": $blue-400,\\n \\"blue-500\\": $blue-500,\\n \\"blue-600\\": $blue-600,\\n \\"blue-700\\": $blue-700,\\n \\"blue-800\\": $blue-800,\\n \\"blue-900\\": $blue-900\\n) !default;\\n\\n$indigos: (\\n \\"indigo-100\\": $indigo-100,\\n \\"indigo-200\\": $indigo-200,\\n \\"indigo-300\\": $indigo-300,\\n \\"indigo-400\\": $indigo-400,\\n \\"indigo-500\\": $indigo-500,\\n \\"indigo-600\\": $indigo-600,\\n \\"indigo-700\\": $indigo-700,\\n \\"indigo-800\\": $indigo-800,\\n \\"indigo-900\\": $indigo-900\\n) !default;\\n\\n$purples: (\\n \\"purple-100\\": $purple-100,\\n \\"purple-200\\": $purple-200,\\n \\"purple-300\\": $purple-300,\\n \\"purple-400\\": $purple-400,\\n \\"purple-500\\": $purple-500,\\n \\"purple-600\\": $purple-600,\\n \\"purple-700\\": $purple-700,\\n \\"purple-800\\": $purple-800,\\n \\"purple-900\\": $purple-900\\n) !default;\\n\\n$pinks: (\\n \\"pink-100\\": $pink-100,\\n \\"pink-200\\": $pink-200,\\n \\"pink-300\\": $pink-300,\\n \\"pink-400\\": $pink-400,\\n \\"pink-500\\": $pink-500,\\n \\"pink-600\\": $pink-600,\\n \\"pink-700\\": $pink-700,\\n \\"pink-800\\": $pink-800,\\n \\"pink-900\\": $pink-900\\n) !default;\\n\\n$reds: (\\n \\"red-100\\": $red-100,\\n \\"red-200\\": $red-200,\\n \\"red-300\\": $red-300,\\n \\"red-400\\": $red-400,\\n \\"red-500\\": $red-500,\\n \\"red-600\\": $red-600,\\n \\"red-700\\": $red-700,\\n \\"red-800\\": $red-800,\\n \\"red-900\\": $red-900\\n) !default;\\n\\n$oranges: (\\n \\"orange-100\\": $orange-100,\\n \\"orange-200\\": $orange-200,\\n \\"orange-300\\": $orange-300,\\n \\"orange-400\\": $orange-400,\\n \\"orange-500\\": $orange-500,\\n \\"orange-600\\": $orange-600,\\n \\"orange-700\\": $orange-700,\\n \\"orange-800\\": $orange-800,\\n \\"orange-900\\": $orange-900\\n) !default;\\n\\n$yellows: (\\n \\"yellow-100\\": $yellow-100,\\n \\"yellow-200\\": $yellow-200,\\n \\"yellow-300\\": $yellow-300,\\n \\"yellow-400\\": $yellow-400,\\n \\"yellow-500\\": $yellow-500,\\n \\"yellow-600\\": $yellow-600,\\n \\"yellow-700\\": $yellow-700,\\n \\"yellow-800\\": $yellow-800,\\n \\"yellow-900\\": $yellow-900\\n) !default;\\n\\n$greens: (\\n \\"green-100\\": $green-100,\\n \\"green-200\\": $green-200,\\n \\"green-300\\": $green-300,\\n \\"green-400\\": $green-400,\\n \\"green-500\\": $green-500,\\n \\"green-600\\": $green-600,\\n \\"green-700\\": $green-700,\\n \\"green-800\\": $green-800,\\n \\"green-900\\": $green-900\\n) !default;\\n\\n$teals: (\\n \\"teal-100\\": $teal-100,\\n \\"teal-200\\": $teal-200,\\n \\"teal-300\\": $teal-300,\\n \\"teal-400\\": $teal-400,\\n \\"teal-500\\": $teal-500,\\n \\"teal-600\\": $teal-600,\\n \\"teal-700\\": $teal-700,\\n \\"teal-800\\": $teal-800,\\n \\"teal-900\\": $teal-900\\n) !default;\\n\\n$cyans: (\\n \\"cyan-100\\": $cyan-100,\\n \\"cyan-200\\": $cyan-200,\\n \\"cyan-300\\": $cyan-300,\\n \\"cyan-400\\": $cyan-400,\\n \\"cyan-500\\": $cyan-500,\\n \\"cyan-600\\": $cyan-600,\\n \\"cyan-700\\": $cyan-700,\\n \\"cyan-800\\": $cyan-800,\\n \\"cyan-900\\": $cyan-900\\n) !default;\\n// fusv-enable\\n\\n// scss-docs-start theme-color-variables\\n$primary: $blue !default;\\n$secondary: $gray-600 !default;\\n$success: $green !default;\\n$info: $cyan !default;\\n$warning: $yellow !default;\\n$danger: $red !default;\\n$light: $gray-100 !default;\\n$dark: $gray-900 !default;\\n// scss-docs-end theme-color-variables\\n\\n// scss-docs-start theme-colors-map\\n$theme-colors: (\\n \\"primary\\": $primary,\\n \\"secondary\\": $secondary,\\n \\"success\\": $success,\\n \\"info\\": $info,\\n \\"warning\\": $warning,\\n \\"danger\\": $danger,\\n \\"light\\": $light,\\n \\"dark\\": $dark\\n) !default;\\n// scss-docs-end theme-colors-map\\n\\n// scss-docs-start theme-text-variables\\n$primary-text-emphasis: shade-color($primary, 60%) !default;\\n$secondary-text-emphasis: shade-color($secondary, 60%) !default;\\n$success-text-emphasis: shade-color($success, 60%) !default;\\n$info-text-emphasis: shade-color($info, 60%) !default;\\n$warning-text-emphasis: shade-color($warning, 60%) !default;\\n$danger-text-emphasis: shade-color($danger, 60%) !default;\\n$light-text-emphasis: $gray-700 !default;\\n$dark-text-emphasis: $gray-700 !default;\\n// scss-docs-end theme-text-variables\\n\\n// scss-docs-start theme-bg-subtle-variables\\n$primary-bg-subtle: tint-color($primary, 80%) !default;\\n$secondary-bg-subtle: tint-color($secondary, 80%) !default;\\n$success-bg-subtle: tint-color($success, 80%) !default;\\n$info-bg-subtle: tint-color($info, 80%) !default;\\n$warning-bg-subtle: tint-color($warning, 80%) !default;\\n$danger-bg-subtle: tint-color($danger, 80%) !default;\\n$light-bg-subtle: mix($gray-100, $white) !default;\\n$dark-bg-subtle: $gray-400 !default;\\n// scss-docs-end theme-bg-subtle-variables\\n\\n// scss-docs-start theme-border-subtle-variables\\n$primary-border-subtle: tint-color($primary, 60%) !default;\\n$secondary-border-subtle: tint-color($secondary, 60%) !default;\\n$success-border-subtle: tint-color($success, 60%) !default;\\n$info-border-subtle: tint-color($info, 60%) !default;\\n$warning-border-subtle: tint-color($warning, 60%) !default;\\n$danger-border-subtle: tint-color($danger, 60%) !default;\\n$light-border-subtle: $gray-200 !default;\\n$dark-border-subtle: $gray-500 !default;\\n// scss-docs-end theme-border-subtle-variables\\n\\n// Characters which are escaped by the escape-svg function\\n$escaped-characters: (\\n (\\"<\\", \\"%3c\\"),\\n (\\">\\", \\"%3e\\"),\\n (\\"#\\", \\"%23\\"),\\n (\\"(\\", \\"%28\\"),\\n (\\")\\", \\"%29\\"),\\n) !default;\\n\\n// Options\\n//\\n// Quickly modify global styling by enabling or disabling optional features.\\n\\n$enable-caret: true !default;\\n$enable-rounded: true !default;\\n$enable-shadows: false !default;\\n$enable-gradients: false !default;\\n$enable-transitions: true !default;\\n$enable-reduced-motion: true !default;\\n$enable-smooth-scroll: true !default;\\n$enable-grid-classes: true !default;\\n$enable-container-classes: true !default;\\n$enable-cssgrid: false !default;\\n$enable-button-pointers: true !default;\\n$enable-rfs: true !default;\\n$enable-validation-icons: true !default;\\n$enable-negative-margins: false !default;\\n$enable-deprecation-messages: true !default;\\n$enable-important-utilities: true !default;\\n\\n$enable-dark-mode: true !default;\\n$color-mode-type: data !default; // `data` or `media-query`\\n\\n// Prefix for :root CSS variables\\n\\n$variable-prefix: bs- !default; // Deprecated in v5.2.0 for the shorter `$prefix`\\n$prefix: $variable-prefix !default;\\n\\n// Gradient\\n//\\n// The gradient which is added to components if `$enable-gradients` is `true`\\n// This gradient is also added to elements with `.bg-gradient`\\n// scss-docs-start variable-gradient\\n$gradient: linear-gradient(180deg, rgba($white, .15), rgba($white, 0)) !default;\\n// scss-docs-end variable-gradient\\n\\n// Spacing\\n//\\n// Control the default styling of most Bootstrap elements by modifying these\\n// variables. Mostly focused on spacing.\\n// You can add more entries to the $spacers map, should you need more variation.\\n\\n// scss-docs-start spacer-variables-maps\\n$spacer: 1rem !default;\\n$spacers: (\\n 0: 0,\\n 1: $spacer * .25,\\n 2: $spacer * .5,\\n 3: $spacer,\\n 4: $spacer * 1.5,\\n 5: $spacer * 3,\\n) !default;\\n// scss-docs-end spacer-variables-maps\\n\\n// Position\\n//\\n// Define the edge positioning anchors of the position utilities.\\n\\n// scss-docs-start position-map\\n$position-values: (\\n 0: 0,\\n 50: 50%,\\n 100: 100%\\n) !default;\\n// scss-docs-end position-map\\n\\n// Body\\n//\\n// Settings for the `<body>` element.\\n\\n$body-text-align: null !default;\\n$body-color: $gray-900 !default;\\n$body-bg: $white !default;\\n\\n$body-secondary-color: rgba($body-color, .75) !default;\\n$body-secondary-bg: $gray-200 !default;\\n\\n$body-tertiary-color: rgba($body-color, .5) !default;\\n$body-tertiary-bg: $gray-100 !default;\\n\\n$body-emphasis-color: $black !default;\\n\\n// Links\\n//\\n// Style anchor elements.\\n\\n$link-color: $primary !default;\\n$link-decoration: underline !default;\\n$link-shade-percentage: 20% !default;\\n$link-hover-color: shift-color($link-color, $link-shade-percentage) !default;\\n$link-hover-decoration: null !default;\\n\\n$stretched-link-pseudo-element: after !default;\\n$stretched-link-z-index: 1 !default;\\n\\n// Icon links\\n// scss-docs-start icon-link-variables\\n$icon-link-gap: .375rem !default;\\n$icon-link-underline-offset: .25em !default;\\n$icon-link-icon-size: 1em !default;\\n$icon-link-icon-transition: .2s ease-in-out transform !default;\\n$icon-link-icon-transform: translate3d(.25em, 0, 0) !default;\\n// scss-docs-end icon-link-variables\\n\\n// Paragraphs\\n//\\n// Style p element.\\n\\n$paragraph-margin-bottom: 1rem !default;\\n\\n\\n// Grid breakpoints\\n//\\n// Define the minimum dimensions at which your layout will change,\\n// adapting to different screen sizes, for use in media queries.\\n\\n// scss-docs-start grid-breakpoints\\n$grid-breakpoints: (\\n xs: 0,\\n sm: 576px,\\n md: 768px,\\n lg: 992px,\\n xl: 1200px,\\n xxl: 1400px\\n) !default;\\n// scss-docs-end grid-breakpoints\\n\\n@include _assert-ascending($grid-breakpoints, \\"$grid-breakpoints\\");\\n@include _assert-starts-at-zero($grid-breakpoints, \\"$grid-breakpoints\\");\\n\\n\\n// Grid containers\\n//\\n// Define the maximum width of `.container` for different screen sizes.\\n\\n// scss-docs-start container-max-widths\\n$container-max-widths: (\\n sm: 540px,\\n md: 720px,\\n lg: 960px,\\n xl: 1140px,\\n xxl: 1320px\\n) !default;\\n// scss-docs-end container-max-widths\\n\\n@include _assert-ascending($container-max-widths, \\"$container-max-widths\\");\\n\\n\\n// Grid columns\\n//\\n// Set the number of columns and specify the width of the gutters.\\n\\n$grid-columns: 12 !default;\\n$grid-gutter-width: 1.5rem !default;\\n$grid-row-columns: 6 !default;\\n\\n// Container padding\\n\\n$container-padding-x: $grid-gutter-width !default;\\n\\n\\n// Components\\n//\\n// Define common padding and border radius sizes and more.\\n\\n// scss-docs-start border-variables\\n$border-width: 1px !default;\\n$border-widths: (\\n 1: 1px,\\n 2: 2px,\\n 3: 3px,\\n 4: 4px,\\n 5: 5px\\n) !default;\\n$border-style: solid !default;\\n$border-color: $gray-300 !default;\\n$border-color-translucent: rgba($black, .175) !default;\\n// scss-docs-end border-variables\\n\\n// scss-docs-start border-radius-variables\\n$border-radius: .375rem !default;\\n$border-radius-sm: .25rem !default;\\n$border-radius-lg: .5rem !default;\\n$border-radius-xl: 1rem !default;\\n$border-radius-xxl: 2rem !default;\\n$border-radius-pill: 50rem !default;\\n// scss-docs-end border-radius-variables\\n// fusv-disable\\n$border-radius-2xl: $border-radius-xxl !default; // Deprecated in v5.3.0\\n// fusv-enable\\n\\n// scss-docs-start box-shadow-variables\\n$box-shadow: 0 .5rem 1rem rgba($black, .15) !default;\\n$box-shadow-sm: 0 .125rem .25rem rgba($black, .075) !default;\\n$box-shadow-lg: 0 1rem 3rem rgba($black, .175) !default;\\n$box-shadow-inset: inset 0 1px 2px rgba($black, .075) !default;\\n// scss-docs-end box-shadow-variables\\n\\n$component-active-color: $white !default;\\n$component-active-bg: $primary !default;\\n\\n// scss-docs-start focus-ring-variables\\n$focus-ring-width: .25rem !default;\\n$focus-ring-opacity: .25 !default;\\n$focus-ring-color: rgba($primary, $focus-ring-opacity) !default;\\n$focus-ring-blur: 0 !default;\\n$focus-ring-box-shadow: 0 0 $focus-ring-blur $focus-ring-width $focus-ring-color !default;\\n// scss-docs-end focus-ring-variables\\n\\n// scss-docs-start caret-variables\\n$caret-width: .3em !default;\\n$caret-vertical-align: $caret-width * .85 !default;\\n$caret-spacing: $caret-width * .85 !default;\\n// scss-docs-end caret-variables\\n\\n$transition-base: all .2s ease-in-out !default;\\n$transition-fade: opacity .15s linear !default;\\n// scss-docs-start collapse-transition\\n$transition-collapse: height .35s ease !default;\\n$transition-collapse-width: width .35s ease !default;\\n// scss-docs-end collapse-transition\\n\\n// stylelint-disable function-disallowed-list\\n// scss-docs-start aspect-ratios\\n$aspect-ratios: (\\n \\"1x1\\": 100%,\\n \\"4x3\\": calc(3 / 4 * 100%),\\n \\"16x9\\": calc(9 / 16 * 100%),\\n \\"21x9\\": calc(9 / 21 * 100%)\\n) !default;\\n// scss-docs-end aspect-ratios\\n// stylelint-enable function-disallowed-list\\n\\n// Typography\\n//\\n// Font, line-height, and color for body text, headings, and more.\\n\\n// scss-docs-start font-variables\\n// stylelint-disable value-keyword-case\\n$font-family-sans-serif: system-ui, -apple-system, \\"Segoe UI\\", Roboto, \\"Helvetica Neue\\", \\"Noto Sans\\", \\"Liberation Sans\\", Arial, sans-serif, \\"Apple Color Emoji\\", \\"Segoe UI Emoji\\", \\"Segoe UI Symbol\\", \\"Noto Color Emoji\\" !default;\\n$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \\"Liberation Mono\\", \\"Courier New\\", monospace !default;\\n// stylelint-enable value-keyword-case\\n$font-family-base: var(--#{$prefix}font-sans-serif) !default;\\n$font-family-code: var(--#{$prefix}font-monospace) !default;\\n\\n// $font-size-root affects the value of `rem`, which is used for as well font sizes, paddings, and margins\\n// $font-size-base affects the font size of the body text\\n$font-size-root: null !default;\\n$font-size-base: 1rem !default; // Assumes the browser default, typically `16px`\\n$font-size-sm: $font-size-base * .875 !default;\\n$font-size-lg: $font-size-base * 1.25 !default;\\n\\n$font-weight-lighter: lighter !default;\\n$font-weight-light: 300 !default;\\n$font-weight-normal: 400 !default;\\n$font-weight-medium: 500 !default;\\n$font-weight-semibold: 600 !default;\\n$font-weight-bold: 700 !default;\\n$font-weight-bolder: bolder !default;\\n\\n$font-weight-base: $font-weight-normal !default;\\n\\n$line-height-base: 1.5 !default;\\n$line-height-sm: 1.25 !default;\\n$line-height-lg: 2 !default;\\n\\n$h1-font-size: $font-size-base * 2.5 !default;\\n$h2-font-size: $font-size-base * 2 !default;\\n$h3-font-size: $font-size-base * 1.75 !default;\\n$h4-font-size: $font-size-base * 1.5 !default;\\n$h5-font-size: $font-size-base * 1.25 !default;\\n$h6-font-size: $font-size-base !default;\\n// scss-docs-end font-variables\\n\\n// scss-docs-start font-sizes\\n$font-sizes: (\\n 1: $h1-font-size,\\n 2: $h2-font-size,\\n 3: $h3-font-size,\\n 4: $h4-font-size,\\n 5: $h5-font-size,\\n 6: $h6-font-size\\n) !default;\\n// scss-docs-end font-sizes\\n\\n// scss-docs-start headings-variables\\n$headings-margin-bottom: $spacer * .5 !default;\\n$headings-font-family: null !default;\\n$headings-font-style: null !default;\\n$headings-font-weight: 500 !default;\\n$headings-line-height: 1.2 !default;\\n$headings-color: inherit !default;\\n// scss-docs-end headings-variables\\n\\n// scss-docs-start display-headings\\n$display-font-sizes: (\\n 1: 5rem,\\n 2: 4.5rem,\\n 3: 4rem,\\n 4: 3.5rem,\\n 5: 3rem,\\n 6: 2.5rem\\n) !default;\\n\\n$display-font-family: null !default;\\n$display-font-style: null !default;\\n$display-font-weight: 300 !default;\\n$display-line-height: $headings-line-height !default;\\n// scss-docs-end display-headings\\n\\n// scss-docs-start type-variables\\n$lead-font-size: $font-size-base * 1.25 !default;\\n$lead-font-weight: 300 !default;\\n\\n$small-font-size: .875em !default;\\n\\n$sub-sup-font-size: .75em !default;\\n\\n// fusv-disable\\n$text-muted: var(--#{$prefix}secondary-color) !default; // Deprecated in 5.3.0\\n// fusv-enable\\n\\n$initialism-font-size: $small-font-size !default;\\n\\n$blockquote-margin-y: $spacer !default;\\n$blockquote-font-size: $font-size-base * 1.25 !default;\\n$blockquote-footer-color: $gray-600 !default;\\n$blockquote-footer-font-size: $small-font-size !default;\\n\\n$hr-margin-y: $spacer !default;\\n$hr-color: inherit !default;\\n\\n// fusv-disable\\n$hr-bg-color: null !default; // Deprecated in v5.2.0\\n$hr-height: null !default; // Deprecated in v5.2.0\\n// fusv-enable\\n\\n$hr-border-color: null !default; // Allows for inherited colors\\n$hr-border-width: var(--#{$prefix}border-width) !default;\\n$hr-opacity: .25 !default;\\n\\n// scss-docs-start vr-variables\\n$vr-border-width: var(--#{$prefix}border-width) !default;\\n// scss-docs-end vr-variables\\n\\n$legend-margin-bottom: .5rem !default;\\n$legend-font-size: 1.5rem !default;\\n$legend-font-weight: null !default;\\n\\n$dt-font-weight: $font-weight-bold !default;\\n\\n$list-inline-padding: .5rem !default;\\n\\n$mark-padding: .1875em !default;\\n$mark-color: $body-color !default;\\n$mark-bg: $yellow-100 !default;\\n// scss-docs-end type-variables\\n\\n\\n// Tables\\n//\\n// Customizes the `.table` component with basic values, each used across all table variations.\\n\\n// scss-docs-start table-variables\\n$table-cell-padding-y: .5rem !default;\\n$table-cell-padding-x: .5rem !default;\\n$table-cell-padding-y-sm: .25rem !default;\\n$table-cell-padding-x-sm: .25rem !default;\\n\\n$table-cell-vertical-align: top !default;\\n\\n$table-color: var(--#{$prefix}emphasis-color) !default;\\n$table-bg: var(--#{$prefix}body-bg) !default;\\n$table-accent-bg: transparent !default;\\n\\n$table-th-font-weight: null !default;\\n\\n$table-striped-color: $table-color !default;\\n$table-striped-bg-factor: .05 !default;\\n$table-striped-bg: rgba(var(--#{$prefix}emphasis-color-rgb), $table-striped-bg-factor) !default;\\n\\n$table-active-color: $table-color !default;\\n$table-active-bg-factor: .1 !default;\\n$table-active-bg: rgba(var(--#{$prefix}emphasis-color-rgb), $table-active-bg-factor) !default;\\n\\n$table-hover-color: $table-color !default;\\n$table-hover-bg-factor: .075 !default;\\n$table-hover-bg: rgba(var(--#{$prefix}emphasis-color-rgb), $table-hover-bg-factor) !default;\\n\\n$table-border-factor: .2 !default;\\n$table-border-width: var(--#{$prefix}border-width) !default;\\n$table-border-color: var(--#{$prefix}border-color) !default;\\n\\n$table-striped-order: odd !default;\\n$table-striped-columns-order: even !default;\\n\\n$table-group-separator-color: currentcolor !default;\\n\\n$table-caption-color: var(--#{$prefix}secondary-color) !default;\\n\\n$table-bg-scale: -80% !default;\\n// scss-docs-end table-variables\\n\\n// scss-docs-start table-loop\\n$table-variants: (\\n \\"primary\\": shift-color($primary, $table-bg-scale),\\n \\"secondary\\": shift-color($secondary, $table-bg-scale),\\n \\"success\\": shift-color($success, $table-bg-scale),\\n \\"info\\": shift-color($info, $table-bg-scale),\\n \\"warning\\": shift-color($warning, $table-bg-scale),\\n \\"danger\\": shift-color($danger, $table-bg-scale),\\n \\"light\\": $light,\\n \\"dark\\": $dark,\\n) !default;\\n// scss-docs-end table-loop\\n\\n\\n// Buttons + Forms\\n//\\n// Shared variables that are reassigned to `$input-` and `$btn-` specific variables.\\n\\n// scss-docs-start input-btn-variables\\n$input-btn-padding-y: .375rem !default;\\n$input-btn-padding-x: .75rem !default;\\n$input-btn-font-family: null !default;\\n$input-btn-font-size: $font-size-base !default;\\n$input-btn-line-height: $line-height-base !default;\\n\\n$input-btn-focus-width: $focus-ring-width !default;\\n$input-btn-focus-color-opacity: $focus-ring-opacity !default;\\n$input-btn-focus-color: $focus-ring-color !default;\\n$input-btn-focus-blur: $focus-ring-blur !default;\\n$input-btn-focus-box-shadow: $focus-ring-box-shadow !default;\\n\\n$input-btn-padding-y-sm: .25rem !default;\\n$input-btn-padding-x-sm: .5rem !default;\\n$input-btn-font-size-sm: $font-size-sm !default;\\n\\n$input-btn-padding-y-lg: .5rem !default;\\n$input-btn-padding-x-lg: 1rem !default;\\n$input-btn-font-size-lg: $font-size-lg !default;\\n\\n$input-btn-border-width: var(--#{$prefix}border-width) !default;\\n// scss-docs-end input-btn-variables\\n\\n\\n// Buttons\\n//\\n// For each of Bootstrap\'s buttons, define text, background, and border color.\\n\\n// scss-docs-start btn-variables\\n$btn-color: var(--#{$prefix}body-color) !default;\\n$btn-padding-y: $input-btn-padding-y !default;\\n$btn-padding-x: $input-btn-padding-x !default;\\n$btn-font-family: $input-btn-font-family !default;\\n$btn-font-size: $input-btn-font-size !default;\\n$btn-line-height: $input-btn-line-height !default;\\n$btn-white-space: null !default; // Set to `nowrap` to prevent text wrapping\\n\\n$btn-padding-y-sm: $input-btn-padding-y-sm !default;\\n$btn-padding-x-sm: $input-btn-padding-x-sm !default;\\n$btn-font-size-sm: $input-btn-font-size-sm !default;\\n\\n$btn-padding-y-lg: $input-btn-padding-y-lg !default;\\n$btn-padding-x-lg: $input-btn-padding-x-lg !default;\\n$btn-font-size-lg: $input-btn-font-size-lg !default;\\n\\n$btn-border-width: $input-btn-border-width !default;\\n\\n$btn-font-weight: $font-weight-normal !default;\\n$btn-box-shadow: inset 0 1px 0 rgba($white, .15), 0 1px 1px rgba($black, .075) !default;\\n$btn-focus-width: $input-btn-focus-width !default;\\n$btn-focus-box-shadow: $input-btn-focus-box-shadow !default;\\n$btn-disabled-opacity: .65 !default;\\n$btn-active-box-shadow: inset 0 3px 5px rgba($black, .125) !default;\\n\\n$btn-link-color: var(--#{$prefix}link-color) !default;\\n$btn-link-hover-color: var(--#{$prefix}link-hover-color) !default;\\n$btn-link-disabled-color: $gray-600 !default;\\n$btn-link-focus-shadow-rgb: to-rgb(mix(color-contrast($link-color), $link-color, 15%)) !default;\\n\\n// Allows for customizing button radius independently from global border radius\\n$btn-border-radius: var(--#{$prefix}border-radius) !default;\\n$btn-border-radius-sm: var(--#{$prefix}border-radius-sm) !default;\\n$btn-border-radius-lg: var(--#{$prefix}border-radius-lg) !default;\\n\\n$btn-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\\n\\n$btn-hover-bg-shade-amount: 15% !default;\\n$btn-hover-bg-tint-amount: 15% !default;\\n$btn-hover-border-shade-amount: 20% !default;\\n$btn-hover-border-tint-amount: 10% !default;\\n$btn-active-bg-shade-amount: 20% !default;\\n$btn-active-bg-tint-amount: 20% !default;\\n$btn-active-border-shade-amount: 25% !default;\\n$btn-active-border-tint-amount: 10% !default;\\n// scss-docs-end btn-variables\\n\\n\\n// Forms\\n\\n// scss-docs-start form-text-variables\\n$form-text-margin-top: .25rem !default;\\n$form-text-font-size: $small-font-size !default;\\n$form-text-font-style: null !default;\\n$form-text-font-weight: null !default;\\n$form-text-color: var(--#{$prefix}secondary-color) !default;\\n// scss-docs-end form-text-variables\\n\\n// scss-docs-start form-label-variables\\n$form-label-margin-bottom: .5rem !default;\\n$form-label-font-size: null !default;\\n$form-label-font-style: null !default;\\n$form-label-font-weight: null !default;\\n$form-label-color: null !default;\\n// scss-docs-end form-label-variables\\n\\n// scss-docs-start form-input-variables\\n$input-padding-y: $input-btn-padding-y !default;\\n$input-padding-x: $input-btn-padding-x !default;\\n$input-font-family: $input-btn-font-family !default;\\n$input-font-size: $input-btn-font-size !default;\\n$input-font-weight: $font-weight-base !default;\\n$input-line-height: $input-btn-line-height !default;\\n\\n$input-padding-y-sm: $input-btn-padding-y-sm !default;\\n$input-padding-x-sm: $input-btn-padding-x-sm !default;\\n$input-font-size-sm: $input-btn-font-size-sm !default;\\n\\n$input-padding-y-lg: $input-btn-padding-y-lg !default;\\n$input-padding-x-lg: $input-btn-padding-x-lg !default;\\n$input-font-size-lg: $input-btn-font-size-lg !default;\\n\\n$input-bg: var(--#{$prefix}body-bg) !default;\\n$input-disabled-color: null !default;\\n$input-disabled-bg: var(--#{$prefix}secondary-bg) !default;\\n$input-disabled-border-color: null !default;\\n\\n$input-color: var(--#{$prefix}body-color) !default;\\n$input-border-color: var(--#{$prefix}border-color) !default;\\n$input-border-width: $input-btn-border-width !default;\\n$input-box-shadow: var(--#{$prefix}box-shadow-inset) !default;\\n\\n$input-border-radius: var(--#{$prefix}border-radius) !default;\\n$input-border-radius-sm: var(--#{$prefix}border-radius-sm) !default;\\n$input-border-radius-lg: var(--#{$prefix}border-radius-lg) !default;\\n\\n$input-focus-bg: $input-bg !default;\\n$input-focus-border-color: tint-color($component-active-bg, 50%) !default;\\n$input-focus-color: $input-color !default;\\n$input-focus-width: $input-btn-focus-width !default;\\n$input-focus-box-shadow: $input-btn-focus-box-shadow !default;\\n\\n$input-placeholder-color: var(--#{$prefix}secondary-color) !default;\\n$input-plaintext-color: var(--#{$prefix}body-color) !default;\\n\\n$input-height-border: calc(#{$input-border-width} * 2) !default; // stylelint-disable-line function-disallowed-list\\n\\n$input-height-inner: add($input-line-height * 1em, $input-padding-y * 2) !default;\\n$input-height-inner-half: add($input-line-height * .5em, $input-padding-y) !default;\\n$input-height-inner-quarter: add($input-line-height * .25em, $input-padding-y * .5) !default;\\n\\n$input-height: add($input-line-height * 1em, add($input-padding-y * 2, $input-height-border, false)) !default;\\n$input-height-sm: add($input-line-height * 1em, add($input-padding-y-sm * 2, $input-height-border, false)) !default;\\n$input-height-lg: add($input-line-height * 1em, add($input-padding-y-lg * 2, $input-height-border, false)) !default;\\n\\n$input-transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\\n\\n$form-color-width: 3rem !default;\\n// scss-docs-end form-input-variables\\n\\n// scss-docs-start form-check-variables\\n$form-check-input-width: 1em !default;\\n$form-check-min-height: $font-size-base * $line-height-base !default;\\n$form-check-padding-start: $form-check-input-width + .5em !default;\\n$form-check-margin-bottom: .125rem !default;\\n$form-check-label-color: null !default;\\n$form-check-label-cursor: null !default;\\n$form-check-transition: null !default;\\n\\n$form-check-input-active-filter: brightness(90%) !default;\\n\\n$form-check-input-bg: $input-bg !default;\\n$form-check-input-border: var(--#{$prefix}border-width) solid var(--#{$prefix}border-color) !default;\\n$form-check-input-border-radius: .25em !default;\\n$form-check-radio-border-radius: 50% !default;\\n$form-check-input-focus-border: $input-focus-border-color !default;\\n$form-check-input-focus-box-shadow: $focus-ring-box-shadow !default;\\n\\n$form-check-input-checked-color: $component-active-color !default;\\n$form-check-input-checked-bg-color: $component-active-bg !default;\\n$form-check-input-checked-border-color: $form-check-input-checked-bg-color !default;\\n$form-check-input-checked-bg-image: url(\\"data:image/svg+xml,<svg xmlns=\'http://www.w3.org/2000/svg\' viewBox=\'0 0 20 20\'><path fill=\'none\' stroke=\'#{$form-check-input-checked-color}\' stroke-linecap=\'round\' stroke-linejoin=\'round\' stroke-width=\'3\' d=\'m6 10 3 3 6-6\'/></svg>\\") !default;\\n$form-check-radio-checked-bg-image: url(\\"data:image/svg+xml,<svg xmlns=\'http://www.w3.org/2000/svg\' viewBox=\'-4 -4 8 8\'><circle r=\'2\' fill=\'#{$form-check-input-checked-color}\'/></svg>\\") !default;\\n\\n$form-check-input-indeterminate-color: $component-active-color !default;\\n$form-check-input-indeterminate-bg-color: $component-active-bg !default;\\n$form-check-input-indeterminate-border-color: $form-check-input-indeterminate-bg-color !default;\\n$form-check-input-indeterminate-bg-image: url(\\"data:image/svg+xml,<svg xmlns=\'http://www.w3.org/2000/svg\' viewBox=\'0 0 20 20\'><path fill=\'none\' stroke=\'#{$form-check-input-indeterminate-color}\' stroke-linecap=\'round\' stroke-linejoin=\'round\' stroke-width=\'3\' d=\'M6 10h8\'/></svg>\\") !default;\\n\\n$form-check-input-disabled-opacity: .5 !default;\\n$form-check-label-disabled-opacity: $form-check-input-disabled-opacity !default;\\n$form-check-btn-check-disabled-opacity: $btn-disabled-opacity !default;\\n\\n$form-check-inline-margin-end: 1rem !default;\\n// scss-docs-end form-check-variables\\n\\n// scss-docs-start form-switch-variables\\n$form-switch-color: rgba($black, .25) !default;\\n$form-switch-width: 2em !default;\\n$form-switch-padding-start: $form-switch-width + .5em !default;\\n$form-switch-bg-image: url(\\"data:image/svg+xml,<svg xmlns=\'http://www.w3.org/2000/svg\' viewBox=\'-4 -4 8 8\'><circle r=\'3\' fill=\'#{$form-switch-color}\'/></svg>\\") !default;\\n$form-switch-border-radius: $form-switch-width !default;\\n$form-switch-transition: background-position .15s ease-in-out !default;\\n\\n$form-switch-focus-color: $input-focus-border-color !default;\\n$form-switch-focus-bg-image: url(\\"data:image/svg+xml,<svg xmlns=\'http://www.w3.org/2000/svg\' viewBox=\'-4 -4 8 8\'><circle r=\'3\' fill=\'#{$form-switch-focus-color}\'/></svg>\\") !default;\\n\\n$form-switch-checked-color: $component-active-color !default;\\n$form-switch-checked-bg-image: url(\\"data:image/svg+xml,<svg xmlns=\'http://www.w3.org/2000/svg\' viewBox=\'-4 -4 8 8\'><circle r=\'3\' fill=\'#{$form-switch-checked-color}\'/></svg>\\") !default;\\n$form-switch-checked-bg-position: right center !default;\\n// scss-docs-end form-switch-variables\\n\\n// scss-docs-start input-group-variables\\n$input-group-addon-padding-y: $input-padding-y !default;\\n$input-group-addon-padding-x: $input-padding-x !default;\\n$input-group-addon-font-weight: $input-font-weight !default;\\n$input-group-addon-color: $input-color !default;\\n$input-group-addon-bg: var(--#{$prefix}tertiary-bg) !default;\\n$input-group-addon-border-color: $input-border-color !default;\\n// scss-docs-end input-group-variables\\n\\n// scss-docs-start form-select-variables\\n$form-select-padding-y: $input-padding-y !default;\\n$form-select-padding-x: $input-padding-x !default;\\n$form-select-font-family: $input-font-family !default;\\n$form-select-font-size: $input-font-size !default;\\n$form-select-indicator-padding: $form-select-padding-x * 3 !default; // Extra padding for background-image\\n$form-select-font-weight: $input-font-weight !default;\\n$form-select-line-height: $input-line-height !default;\\n$form-select-color: $input-color !default;\\n$form-select-bg: $input-bg !default;\\n$form-select-disabled-color: null !default;\\n$form-select-disabled-bg: $input-disabled-bg !default;\\n$form-select-disabled-border-color: $input-disabled-border-color !default;\\n$form-select-bg-position: right $form-select-padding-x center !default;\\n$form-select-bg-size: 16px 12px !default; // In pixels because image dimensions\\n$form-select-indicator-color: $gray-800 !default;\\n$form-select-indicator: url(\\"data:image/svg+xml,<svg xmlns=\'http://www.w3.org/2000/svg\' viewBox=\'0 0 16 16\'><path fill=\'none\' stroke=\'#{$form-select-indicator-color}\' stroke-linecap=\'round\' stroke-linejoin=\'round\' stroke-width=\'2\' d=\'m2 5 6 6 6-6\'/></svg>\\") !default;\\n\\n$form-select-feedback-icon-padding-end: $form-select-padding-x * 2.5 + $form-select-indicator-padding !default;\\n$form-select-feedback-icon-position: center right $form-select-indicator-padding !default;\\n$form-select-feedback-icon-size: $input-height-inner-half $input-height-inner-half !default;\\n\\n$form-select-border-width: $input-border-width !default;\\n$form-select-border-color: $input-border-color !default;\\n$form-select-border-radius: $input-border-radius !default;\\n$form-select-box-shadow: var(--#{$prefix}box-shadow-inset) !default;\\n\\n$form-select-focus-border-color: $input-focus-border-color !default;\\n$form-select-focus-width: $input-focus-width !default;\\n$form-select-focus-box-shadow: 0 0 0 $form-select-focus-width $input-btn-focus-color !default;\\n\\n$form-select-padding-y-sm: $input-padding-y-sm !default;\\n$form-select-padding-x-sm: $input-padding-x-sm !default;\\n$form-select-font-size-sm: $input-font-size-sm !default;\\n$form-select-border-radius-sm: $input-border-radius-sm !default;\\n\\n$form-select-padding-y-lg: $input-padding-y-lg !default;\\n$form-select-padding-x-lg: $input-padding-x-lg !default;\\n$form-select-font-size-lg: $input-font-size-lg !default;\\n$form-select-border-radius-lg: $input-border-radius-lg !default;\\n\\n$form-select-transition: $input-transition !default;\\n// scss-docs-end form-select-variables\\n\\n// scss-docs-start form-range-variables\\n$form-range-track-width: 100% !default;\\n$form-range-track-height: .5rem !default;\\n$form-range-track-cursor: pointer !default;\\n$form-range-track-bg: var(--#{$prefix}secondary-bg) !default;\\n$form-range-track-border-radius: 1rem !default;\\n$form-range-track-box-shadow: var(--#{$prefix}box-shadow-inset) !default;\\n\\n$form-range-thumb-width: 1rem !default;\\n$form-range-thumb-height: $form-range-thumb-width !default;\\n$form-range-thumb-bg: $component-active-bg !default;\\n$form-range-thumb-border: 0 !default;\\n$form-range-thumb-border-radius: 1rem !default;\\n$form-range-thumb-box-shadow: 0 .1rem .25rem rgba($black, .1) !default;\\n$form-range-thumb-focus-box-shadow: 0 0 0 1px $body-bg, $input-focus-box-shadow !default;\\n$form-range-thumb-focus-box-shadow-width: $input-focus-width !default; // For focus box shadow issue in Edge\\n$form-range-thumb-active-bg: tint-color($component-active-bg, 70%) !default;\\n$form-range-thumb-disabled-bg: var(--#{$prefix}secondary-color) !default;\\n$form-range-thumb-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\\n// scss-docs-end form-range-variables\\n\\n// scss-docs-start form-file-variables\\n$form-file-button-color: $input-color !default;\\n$form-file-button-bg: var(--#{$prefix}tertiary-bg) !default;\\n$form-file-button-hover-bg: var(--#{$prefix}secondary-bg) !default;\\n// scss-docs-end form-file-variables\\n\\n// scss-docs-start form-floating-variables\\n$form-floating-height: add(3.5rem, $input-height-border) !default;\\n$form-floating-line-height: 1.25 !default;\\n$form-floating-padding-x: $input-padding-x !default;\\n$form-floating-padding-y: 1rem !default;\\n$form-floating-input-padding-t: 1.625rem !default;\\n$form-floating-input-padding-b: .625rem !default;\\n$form-floating-label-height: 1.5em !default;\\n$form-floating-label-opacity: .65 !default;\\n$form-floating-label-transform: scale(.85) translateY(-.5rem) translateX(.15rem) !default;\\n$form-floating-label-disabled-color: $gray-600 !default;\\n$form-floating-transition: opacity .1s ease-in-out, transform .1s ease-in-out !default;\\n// scss-docs-end form-floating-variables\\n\\n// Form validation\\n\\n// scss-docs-start form-feedback-variables\\n$form-feedback-margin-top: $form-text-margin-top !default;\\n$form-feedback-font-size: $form-text-font-size !default;\\n$form-feedback-font-style: $form-text-font-style !default;\\n$form-feedback-valid-color: $success !default;\\n$form-feedback-invalid-color: $danger !default;\\n\\n$form-feedback-icon-valid-color: $form-feedback-valid-color !default;\\n$form-feedback-icon-valid: url(\\"data:image/svg+xml,<svg xmlns=\'http://www.w3.org/2000/svg\' viewBox=\'0 0 8 8\'><path fill=\'#{$form-feedback-icon-valid-color}\' d=\'M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z\'/></svg>\\") !default;\\n$form-feedback-icon-invalid-color: $form-feedback-invalid-color !default;\\n$form-feedback-icon-invalid: url(\\"data:image/svg+xml,<svg xmlns=\'http://www.w3.org/2000/svg\' viewBox=\'0 0 12 12\' width=\'12\' height=\'12\' fill=\'none\' stroke=\'#{$form-feedback-icon-invalid-color}\'><circle cx=\'6\' cy=\'6\' r=\'4.5\'/><path stroke-linejoin=\'round\' d=\'M5.8 3.6h.4L6 6.5z\'/><circle cx=\'6\' cy=\'8.2\' r=\'.6\' fill=\'#{$form-feedback-icon-invalid-color}\' stroke=\'none\'/></svg>\\") !default;\\n// scss-docs-end form-feedback-variables\\n\\n// scss-docs-start form-validation-colors\\n$form-valid-color: $form-feedback-valid-color !default;\\n$form-valid-border-color: $form-feedback-valid-color !default;\\n$form-invalid-color: $form-feedback-invalid-color !default;\\n$form-invalid-border-color: $form-feedback-invalid-color !default;\\n// scss-docs-end form-validation-colors\\n\\n// scss-docs-start form-validation-states\\n$form-validation-states: (\\n \\"valid\\": (\\n \\"color\\": var(--#{$prefix}form-valid-color),\\n \\"icon\\": $form-feedback-icon-valid,\\n \\"tooltip-color\\": #fff,\\n \\"tooltip-bg-color\\": var(--#{$prefix}success),\\n \\"focus-box-shadow\\": 0 0 $input-btn-focus-blur $input-focus-width rgba(var(--#{$prefix}success-rgb), $input-btn-focus-color-opacity),\\n \\"border-color\\": var(--#{$prefix}form-valid-border-color),\\n ),\\n \\"invalid\\": (\\n \\"color\\": var(--#{$prefix}form-invalid-color),\\n \\"icon\\": $form-feedback-icon-invalid,\\n \\"tooltip-color\\": #fff,\\n \\"tooltip-bg-color\\": var(--#{$prefix}danger),\\n \\"focus-box-shadow\\": 0 0 $input-btn-focus-blur $input-focus-width rgba(var(--#{$prefix}danger-rgb), $input-btn-focus-color-opacity),\\n \\"border-color\\": var(--#{$prefix}form-invalid-border-color),\\n )\\n) !default;\\n// scss-docs-end form-validation-states\\n\\n// Z-index master list\\n//\\n// Warning: Avoid customizing these values. They\'re used for a bird\'s eye view\\n// of components dependent on the z-axis and are designed to all work together.\\n\\n// scss-docs-start zindex-stack\\n$zindex-dropdown: 1000 !default;\\n$zindex-sticky: 1020 !default;\\n$zindex-fixed: 1030 !default;\\n$zindex-offcanvas-backdrop: 1040 !default;\\n$zindex-offcanvas: 1045 !default;\\n$zindex-modal-backdrop: 1050 !default;\\n$zindex-modal: 1055 !default;\\n$zindex-popover: 1070 !default;\\n$zindex-tooltip: 1080 !default;\\n$zindex-toast: 1090 !default;\\n// scss-docs-end zindex-stack\\n\\n// scss-docs-start zindex-levels-map\\n$zindex-levels: (\\n n1: -1,\\n 0: 0,\\n 1: 1,\\n 2: 2,\\n 3: 3\\n) !default;\\n// scss-docs-end zindex-levels-map\\n\\n\\n// Navs\\n\\n// scss-docs-start nav-variables\\n$nav-link-padding-y: .5rem !default;\\n$nav-link-padding-x: 1rem !default;\\n$nav-link-font-size: null !default;\\n$nav-link-font-weight: null !default;\\n$nav-link-color: var(--#{$prefix}link-color) !default;\\n$nav-link-hover-color: var(--#{$prefix}link-hover-color) !default;\\n$nav-link-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out !default;\\n$nav-link-disabled-color: var(--#{$prefix}secondary-color) !default;\\n$nav-link-focus-box-shadow: $focus-ring-box-shadow !default;\\n\\n$nav-tabs-border-color: var(--#{$prefix}border-color) !default;\\n$nav-tabs-border-width: var(--#{$prefix}border-width) !default;\\n$nav-tabs-border-radius: var(--#{$prefix}border-radius) !default;\\n$nav-tabs-link-hover-border-color: var(--#{$prefix}secondary-bg) var(--#{$prefix}secondary-bg) $nav-tabs-border-color !default;\\n$nav-tabs-link-active-color: var(--#{$prefix}emphasis-color) !default;\\n$nav-tabs-link-active-bg: var(--#{$prefix}body-bg) !default;\\n$nav-tabs-link-active-border-color: var(--#{$prefix}border-color) var(--#{$prefix}border-color) $nav-tabs-link-active-bg !default;\\n\\n$nav-pills-border-radius: var(--#{$prefix}border-radius) !default;\\n$nav-pills-link-active-color: $component-active-color !default;\\n$nav-pills-link-active-bg: $component-active-bg !default;\\n\\n$nav-underline-gap: 1rem !default;\\n$nav-underline-border-width: .125rem !default;\\n$nav-underline-link-active-color: var(--#{$prefix}emphasis-color) !default;\\n// scss-docs-end nav-variables\\n\\n\\n// Navbar\\n\\n// scss-docs-start navbar-variables\\n$navbar-padding-y: $spacer * .5 !default;\\n$navbar-padding-x: null !default;\\n\\n$navbar-nav-link-padding-x: .5rem !default;\\n\\n$navbar-brand-font-size: $font-size-lg !default;\\n// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link\\n$nav-link-height: $font-size-base * $line-height-base + $nav-link-padding-y * 2 !default;\\n$navbar-brand-height: $navbar-brand-font-size * $line-height-base !default;\\n$navbar-brand-padding-y: ($nav-link-height - $navbar-brand-height) * .5 !default;\\n$navbar-brand-margin-end: 1rem !default;\\n\\n$navbar-toggler-padding-y: .25rem !default;\\n$navbar-toggler-padding-x: .75rem !default;\\n$navbar-toggler-font-size: $font-size-lg !default;\\n$navbar-toggler-border-radius: $btn-border-radius !default;\\n$navbar-toggler-focus-width: $btn-focus-width !default;\\n$navbar-toggler-transition: box-shadow .15s ease-in-out !default;\\n\\n$navbar-light-color: rgba(var(--#{$prefix}emphasis-color-rgb), .65) !default;\\n$navbar-light-hover-color: rgba(var(--#{$prefix}emphasis-color-rgb), .8) !default;\\n$navbar-light-active-color: rgba(var(--#{$prefix}emphasis-color-rgb), 1) !default;\\n$navbar-light-disabled-color: rgba(var(--#{$prefix}emphasis-color-rgb), .3) !default;\\n$navbar-light-icon-color: rgba($body-color, .75) !default;\\n$navbar-light-toggler-icon-bg: url(\\"data:image/svg+xml,<svg xmlns=\'http://www.w3.org/2000/svg\' viewBox=\'0 0 30 30\'><path stroke=\'#{$navbar-light-icon-color}\' stroke-linecap=\'round\' stroke-miterlimit=\'10\' stroke-width=\'2\' d=\'M4 7h22M4 15h22M4 23h22\'/></svg>\\") !default;\\n$navbar-light-toggler-border-color: rgba(var(--#{$prefix}emphasis-color-rgb), .15) !default;\\n$navbar-light-brand-color: $navbar-light-active-color !default;\\n$navbar-light-brand-hover-color: $navbar-light-active-color !default;\\n// scss-docs-end navbar-variables\\n\\n// scss-docs-start navbar-dark-variables\\n$navbar-dark-color: rgba($white, .55) !default;\\n$navbar-dark-hover-color: rgba($white, .75) !default;\\n$navbar-dark-active-color: $white !default;\\n$navbar-dark-disabled-color: rgba($white, .25) !default;\\n$navbar-dark-icon-color: $navbar-dark-color !default;\\n$navbar-dark-toggler-icon-bg: url(\\"data:image/svg+xml,<svg xmlns=\'http://www.w3.org/2000/svg\' viewBox=\'0 0 30 30\'><path stroke=\'#{$navbar-dark-icon-color}\' stroke-linecap=\'round\' stroke-miterlimit=\'10\' stroke-width=\'2\' d=\'M4 7h22M4 15h22M4 23h22\'/></svg>\\") !default;\\n$navbar-dark-toggler-border-color: rgba($white, .1) !default;\\n$navbar-dark-brand-color: $navbar-dark-active-color !default;\\n$navbar-dark-brand-hover-color: $navbar-dark-active-color !default;\\n// scss-docs-end navbar-dark-variables\\n\\n\\n// Dropdowns\\n//\\n// Dropdown menu container and contents.\\n\\n// scss-docs-start dropdown-variables\\n$dropdown-min-width: 10rem !default;\\n$dropdown-padding-x: 0 !default;\\n$dropdown-padding-y: .5rem !default;\\n$dropdown-spacer: .125rem !default;\\n$dropdown-font-size: $font-size-base !default;\\n$dropdown-color: var(--#{$prefix}body-color) !default;\\n$dropdown-bg: var(--#{$prefix}body-bg) !default;\\n$dropdown-border-color: var(--#{$prefix}border-color-translucent) !default;\\n$dropdown-border-radius: var(--#{$prefix}border-radius) !default;\\n$dropdown-border-width: var(--#{$prefix}border-width) !default;\\n$dropdown-inner-border-radius: calc(#{$dropdown-border-radius} - #{$dropdown-border-width}) !default; // stylelint-disable-line function-disallowed-list\\n$dropdown-divider-bg: $dropdown-border-color !default;\\n$dropdown-divider-margin-y: $spacer * .5 !default;\\n$dropdown-box-shadow: var(--#{$prefix}box-shadow) !default;\\n\\n$dropdown-link-color: var(--#{$prefix}body-color) !default;\\n$dropdown-link-hover-color: $dropdown-link-color !default;\\n$dropdown-link-hover-bg: var(--#{$prefix}tertiary-bg) !default;\\n\\n$dropdown-link-active-color: $component-active-color !default;\\n$dropdown-link-active-bg: $component-active-bg !default;\\n\\n$dropdown-link-disabled-color: var(--#{$prefix}tertiary-color) !default;\\n\\n$dropdown-item-padding-y: $spacer * .25 !default;\\n$dropdown-item-padding-x: $spacer !default;\\n\\n$dropdown-header-color: $gray-600 !default;\\n$dropdown-header-padding-x: $dropdown-item-padding-x !default;\\n$dropdown-header-padding-y: $dropdown-padding-y !default;\\n// fusv-disable\\n$dropdown-header-padding: $dropdown-header-padding-y $dropdown-header-padding-x !default; // Deprecated in v5.2.0\\n// fusv-enable\\n// scss-docs-end dropdown-variables\\n\\n// scss-docs-start dropdown-dark-variables\\n$dropdown-dark-color: $gray-300 !default;\\n$dropdown-dark-bg: $gray-800 !default;\\n$dropdown-dark-border-color: $dropdown-border-color !default;\\n$dropdown-dark-divider-bg: $dropdown-divider-bg !default;\\n$dropdown-dark-box-shadow: null !default;\\n$dropdown-dark-link-color: $dropdown-dark-color !default;\\n$dropdown-dark-link-hover-color: $white !default;\\n$dropdown-dark-link-hover-bg: rgba($white, .15) !default;\\n$dropdown-dark-link-active-color: $dropdown-link-active-color !default;\\n$dropdown-dark-link-active-bg: $dropdown-link-active-bg !default;\\n$dropdown-dark-link-disabled-color: $gray-500 !default;\\n$dropdown-dark-header-color: $gray-500 !default;\\n// scss-docs-end dropdown-dark-variables\\n\\n\\n// Pagination\\n\\n// scss-docs-start pagination-variables\\n$pagination-padding-y: .375rem !default;\\n$pagination-padding-x: .75rem !default;\\n$pagination-padding-y-sm: .25rem !default;\\n$pagination-padding-x-sm: .5rem !default;\\n$pagination-padding-y-lg: .75rem !default;\\n$pagination-padding-x-lg: 1.5rem !default;\\n\\n$pagination-font-size: $font-size-base !default;\\n\\n$pagination-color: var(--#{$prefix}link-color) !default;\\n$pagination-bg: var(--#{$prefix}body-bg) !default;\\n$pagination-border-radius: var(--#{$prefix}border-radius) !default;\\n$pagination-border-width: var(--#{$prefix}border-width) !default;\\n$pagination-margin-start: calc(#{$pagination-border-width} * -1) !default; // stylelint-disable-line function-disallowed-list\\n$pagination-border-color: var(--#{$prefix}border-color) !default;\\n\\n$pagination-focus-color: var(--#{$prefix}link-hover-color) !default;\\n$pagination-focus-bg: var(--#{$prefix}secondary-bg) !default;\\n$pagination-focus-box-shadow: $focus-ring-box-shadow !default;\\n$pagination-focus-outline: 0 !default;\\n\\n$pagination-hover-color: var(--#{$prefix}link-hover-color) !default;\\n$pagination-hover-bg: var(--#{$prefix}tertiary-bg) !default;\\n$pagination-hover-border-color: var(--#{$prefix}border-color) !default; // Todo in v6: remove this?\\n\\n$pagination-active-color: $component-active-color !default;\\n$pagination-active-bg: $component-active-bg !default;\\n$pagination-active-border-color: $component-active-bg !default;\\n\\n$pagination-disabled-color: var(--#{$prefix}secondary-color) !default;\\n$pagination-disabled-bg: var(--#{$prefix}secondary-bg) !default;\\n$pagination-disabled-border-color: var(--#{$prefix}border-color) !default;\\n\\n$pagination-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\\n\\n$pagination-border-radius-sm: var(--#{$prefix}border-radius-sm) !default;\\n$pagination-border-radius-lg: var(--#{$prefix}border-radius-lg) !default;\\n// scss-docs-end pagination-variables\\n\\n\\n// Placeholders\\n\\n// scss-docs-start placeholders\\n$placeholder-opacity-max: .5 !default;\\n$placeholder-opacity-min: .2 !default;\\n// scss-docs-end placeholders\\n\\n// Cards\\n\\n// scss-docs-start card-variables\\n$card-spacer-y: $spacer !default;\\n$card-spacer-x: $spacer !default;\\n$card-title-spacer-y: $spacer * .5 !default;\\n$card-title-color: null !default;\\n$card-subtitle-color: null !default;\\n$card-border-width: var(--#{$prefix}border-width) !default;\\n$card-border-color: var(--#{$prefix}border-color-translucent) !default;\\n$card-border-radius: var(--#{$prefix}border-radius) !default;\\n$card-box-shadow: null !default;\\n$card-inner-border-radius: subtract($card-border-radius, $card-border-width) !default;\\n$card-cap-padding-y: $card-spacer-y * .5 !default;\\n$card-cap-padding-x: $card-spacer-x !default;\\n$card-cap-bg: rgba(var(--#{$prefix}body-color-rgb), .03) !default;\\n$card-cap-color: null !default;\\n$card-height: null !default;\\n$card-color: null !default;\\n$card-bg: var(--#{$prefix}body-bg) !default;\\n$card-img-overlay-padding: $spacer !default;\\n$card-group-margin: $grid-gutter-width * .5 !default;\\n// scss-docs-end card-variables\\n\\n// Accordion\\n\\n// scss-docs-start accordion-variables\\n$accordion-padding-y: 1rem !default;\\n$accordion-padding-x: 1.25rem !default;\\n$accordion-color: var(--#{$prefix}body-color) !default;\\n$accordion-bg: var(--#{$prefix}body-bg) !default;\\n$accordion-border-width: var(--#{$prefix}border-width) !default;\\n$accordion-border-color: var(--#{$prefix}border-color) !default;\\n$accordion-border-radius: var(--#{$prefix}border-radius) !default;\\n$accordion-inner-border-radius: subtract($accordion-border-radius, $accordion-border-width) !default;\\n\\n$accordion-body-padding-y: $accordion-padding-y !default;\\n$accordion-body-padding-x: $accordion-padding-x !default;\\n\\n$accordion-button-padding-y: $accordion-padding-y !default;\\n$accordion-button-padding-x: $accordion-padding-x !default;\\n$accordion-button-color: var(--#{$prefix}body-color) !default;\\n$accordion-button-bg: var(--#{$prefix}accordion-bg) !default;\\n$accordion-transition: $btn-transition, border-radius .15s ease !default;\\n$accordion-button-active-bg: var(--#{$prefix}primary-bg-subtle) !default;\\n$accordion-button-active-color: var(--#{$prefix}primary-text-emphasis) !default;\\n\\n$accordion-button-focus-border-color: $input-focus-border-color !default;\\n$accordion-button-focus-box-shadow: $btn-focus-box-shadow !default;\\n\\n$accordion-icon-width: 1.25rem !default;\\n$accordion-icon-color: $body-color !default;\\n$accordion-icon-active-color: $primary-text-emphasis !default;\\n$accordion-icon-transition: transform .2s ease-in-out !default;\\n$accordion-icon-transform: rotate(-180deg) !default;\\n\\n$accordion-button-icon: url(\\"data:image/svg+xml,<svg xmlns=\'http://www.w3.org/2000/svg\' viewBox=\'0 0 16 16\' fill=\'#{$accordion-icon-color}\'><path fill-rule=\'evenodd\' d=\'M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z\'/></svg>\\") !default;\\n$accordion-button-active-icon: url(\\"data:image/svg+xml,<svg xmlns=\'http://www.w3.org/2000/svg\' viewBox=\'0 0 16 16\' fill=\'#{$accordion-icon-active-color}\'><path fill-rule=\'evenodd\' d=\'M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z\'/></svg>\\") !default;\\n// scss-docs-end accordion-variables\\n\\n// Tooltips\\n\\n// scss-docs-start tooltip-variables\\n$tooltip-font-size: $font-size-sm !default;\\n$tooltip-max-width: 200px !default;\\n$tooltip-color: var(--#{$prefix}body-bg) !default;\\n$tooltip-bg: var(--#{$prefix}emphasis-color) !default;\\n$tooltip-border-radius: var(--#{$prefix}border-radius) !default;\\n$tooltip-opacity: .9 !default;\\n$tooltip-padding-y: $spacer * .25 !default;\\n$tooltip-padding-x: $spacer * .5 !default;\\n$tooltip-margin: null !default; // TODO: remove this in v6\\n\\n$tooltip-arrow-width: .8rem !default;\\n$tooltip-arrow-height: .4rem !default;\\n// fusv-disable\\n$tooltip-arrow-color: null !default; // Deprecated in Bootstrap 5.2.0 for CSS variables\\n// fusv-enable\\n// scss-docs-end tooltip-variables\\n\\n// Form tooltips must come after regular tooltips\\n// scss-docs-start tooltip-feedback-variables\\n$form-feedback-tooltip-padding-y: $tooltip-padding-y !default;\\n$form-feedback-tooltip-padding-x: $tooltip-padding-x !default;\\n$form-feedback-tooltip-font-size: $tooltip-font-size !default;\\n$form-feedback-tooltip-line-height: null !default;\\n$form-feedback-tooltip-opacity: $tooltip-opacity !default;\\n$form-feedback-tooltip-border-radius: $tooltip-border-radius !default;\\n// scss-docs-end tooltip-feedback-variables\\n\\n\\n// Popovers\\n\\n// scss-docs-start popover-variables\\n$popover-font-size: $font-size-sm !default;\\n$popover-bg: var(--#{$prefix}body-bg) !default;\\n$popover-max-width: 276px !default;\\n$popover-border-width: var(--#{$prefix}border-width) !default;\\n$popover-border-color: var(--#{$prefix}border-color-translucent) !default;\\n$popover-border-radius: var(--#{$prefix}border-radius-lg) !default;\\n$popover-inner-border-radius: calc(#{$popover-border-radius} - #{$popover-border-width}) !default; // stylelint-disable-line function-disallowed-list\\n$popover-box-shadow: var(--#{$prefix}box-shadow) !default;\\n\\n$popover-header-font-size: $font-size-base !default;\\n$popover-header-bg: var(--#{$prefix}secondary-bg) !default;\\n$popover-header-color: $headings-color !default;\\n$popover-header-padding-y: .5rem !default;\\n$popover-header-padding-x: $spacer !default;\\n\\n$popover-body-color: var(--#{$prefix}body-color) !default;\\n$popover-body-padding-y: $spacer !default;\\n$popover-body-padding-x: $spacer !default;\\n\\n$popover-arrow-width: 1rem !default;\\n$popover-arrow-height: .5rem !default;\\n// scss-docs-end popover-variables\\n\\n// fusv-disable\\n// Deprecated in Bootstrap 5.2.0 for CSS variables\\n$popover-arrow-color: $popover-bg !default;\\n$popover-arrow-outer-color: var(--#{$prefix}border-color-translucent) !default;\\n// fusv-enable\\n\\n\\n// Toasts\\n\\n// scss-docs-start toast-variables\\n$toast-max-width: 350px !default;\\n$toast-padding-x: .75rem !default;\\n$toast-padding-y: .5rem !default;\\n$toast-font-size: .875rem !default;\\n$toast-color: null !default;\\n$toast-background-color: rgba(var(--#{$prefix}body-bg-rgb), .85) !default;\\n$toast-border-width: var(--#{$prefix}border-width) !default;\\n$toast-border-color: var(--#{$prefix}border-color-translucent) !default;\\n$toast-border-radius: var(--#{$prefix}border-radius) !default;\\n$toast-box-shadow: var(--#{$prefix}box-shadow) !default;\\n$toast-spacing: $container-padding-x !default;\\n\\n$toast-header-color: var(--#{$prefix}secondary-color) !default;\\n$toast-header-background-color: rgba(var(--#{$prefix}body-bg-rgb), .85) !default;\\n$toast-header-border-color: $toast-border-color !default;\\n// scss-docs-end toast-variables\\n\\n\\n// Badges\\n\\n// scss-docs-start badge-variables\\n$badge-font-size: .75em !default;\\n$badge-font-weight: $font-weight-bold !default;\\n$badge-color: $white !default;\\n$badge-padding-y: .35em !default;\\n$badge-padding-x: .65em !default;\\n$badge-border-radius: var(--#{$prefix}border-radius) !default;\\n// scss-docs-end badge-variables\\n\\n\\n// Modals\\n\\n// scss-docs-start modal-variables\\n$modal-inner-padding: $spacer !default;\\n\\n$modal-footer-margin-between: .5rem !default;\\n\\n$modal-dialog-margin: .5rem !default;\\n$modal-dialog-margin-y-sm-up: 1.75rem !default;\\n\\n$modal-title-line-height: $line-height-base !default;\\n\\n$modal-content-color: null !default;\\n$modal-content-bg: var(--#{$prefix}body-bg) !default;\\n$modal-content-border-color: var(--#{$prefix}border-color-translucent) !default;\\n$modal-content-border-width: var(--#{$prefix}border-width) !default;\\n$modal-content-border-radius: var(--#{$prefix}border-radius-lg) !default;\\n$modal-content-inner-border-radius: subtract($modal-content-border-radius, $modal-content-border-width) !default;\\n$modal-content-box-shadow-xs: var(--#{$prefix}box-shadow-sm) !default;\\n$modal-content-box-shadow-sm-up: var(--#{$prefix}box-shadow) !default;\\n\\n$modal-backdrop-bg: $black !default;\\n$modal-backdrop-opacity: .5 !default;\\n\\n$modal-header-border-color: var(--#{$prefix}border-color) !default;\\n$modal-header-border-width: $modal-content-border-width !default;\\n$modal-header-padding-y: $modal-inner-padding !default;\\n$modal-header-padding-x: $modal-inner-padding !default;\\n$modal-header-padding: $modal-header-padding-y $modal-header-padding-x !default; // Keep this for backwards compatibility\\n\\n$modal-footer-bg: null !default;\\n$modal-footer-border-color: $modal-header-border-color !default;\\n$modal-footer-border-width: $modal-header-border-width !default;\\n\\n$modal-sm: 300px !default;\\n$modal-md: 500px !default;\\n$modal-lg: 800px !default;\\n$modal-xl: 1140px !default;\\n\\n$modal-fade-transform: translate(0, -50px) !default;\\n$modal-show-transform: none !default;\\n$modal-transition: transform .3s ease-out !default;\\n$modal-scale-transform: scale(1.02) !default;\\n// scss-docs-end modal-variables\\n\\n\\n// Alerts\\n//\\n// Define alert colors, border radius, and padding.\\n\\n// scss-docs-start alert-variables\\n$alert-padding-y: $spacer !default;\\n$alert-padding-x: $spacer !default;\\n$alert-margin-bottom: 1rem !default;\\n$alert-border-radius: var(--#{$prefix}border-radius) !default;\\n$alert-link-font-weight: $font-weight-bold !default;\\n$alert-border-width: var(--#{$prefix}border-width) !default;\\n$alert-dismissible-padding-r: $alert-padding-x * 3 !default; // 3x covers width of x plus default padding on either side\\n// scss-docs-end alert-variables\\n\\n// fusv-disable\\n$alert-bg-scale: -80% !default; // Deprecated in v5.2.0, to be removed in v6\\n$alert-border-scale: -70% !default; // Deprecated in v5.2.0, to be removed in v6\\n$alert-color-scale: 40% !default; // Deprecated in v5.2.0, to be removed in v6\\n// fusv-enable\\n\\n// Progress bars\\n\\n// scss-docs-start progress-variables\\n$progress-height: 1rem !default;\\n$progress-font-size: $font-size-base * .75 !default;\\n$progress-bg: var(--#{$prefix}secondary-bg) !default;\\n$progress-border-radius: var(--#{$prefix}border-radius) !default;\\n$progress-box-shadow: var(--#{$prefix}box-shadow-inset) !default;\\n$progress-bar-color: $white !default;\\n$progress-bar-bg: $primary !default;\\n$progress-bar-animation-timing: 1s linear infinite !default;\\n$progress-bar-transition: width .6s ease !default;\\n// scss-docs-end progress-variables\\n\\n\\n// List group\\n\\n// scss-docs-start list-group-variables\\n$list-group-color: var(--#{$prefix}body-color) !default;\\n$list-group-bg: var(--#{$prefix}body-bg) !default;\\n$list-group-border-color: var(--#{$prefix}border-color) !default;\\n$list-group-border-width: var(--#{$prefix}border-width) !default;\\n$list-group-border-radius: var(--#{$prefix}border-radius) !default;\\n\\n$list-group-item-padding-y: $spacer * .5 !default;\\n$list-group-item-padding-x: $spacer !default;\\n// fusv-disable\\n$list-group-item-bg-scale: -80% !default; // Deprecated in v5.3.0\\n$list-group-item-color-scale: 40% !default; // Deprecated in v5.3.0\\n// fusv-enable\\n\\n$list-group-hover-bg: var(--#{$prefix}tertiary-bg) !default;\\n$list-group-active-color: $component-active-color !default;\\n$list-group-active-bg: $component-active-bg !default;\\n$list-group-active-border-color: $list-group-active-bg !default;\\n\\n$list-group-disabled-color: var(--#{$prefix}secondary-color) !default;\\n$list-group-disabled-bg: $list-group-bg !default;\\n\\n$list-group-action-color: var(--#{$prefix}secondary-color) !default;\\n$list-group-action-hover-color: var(--#{$prefix}emphasis-color) !default;\\n\\n$list-group-action-active-color: var(--#{$prefix}body-color) !default;\\n$list-group-action-active-bg: var(--#{$prefix}secondary-bg) !default;\\n// scss-docs-end list-group-variables\\n\\n\\n// Image thumbnails\\n\\n// scss-docs-start thumbnail-variables\\n$thumbnail-padding: .25rem !default;\\n$thumbnail-bg: var(--#{$prefix}body-bg) !default;\\n$thumbnail-border-width: var(--#{$prefix}border-width) !default;\\n$thumbnail-border-color: var(--#{$prefix}border-color) !default;\\n$thumbnail-border-radius: var(--#{$prefix}border-radius) !default;\\n$thumbnail-box-shadow: var(--#{$prefix}box-shadow-sm) !default;\\n// scss-docs-end thumbnail-variables\\n\\n\\n// Figures\\n\\n// scss-docs-start figure-variables\\n$figure-caption-font-size: $small-font-size !default;\\n$figure-caption-color: var(--#{$prefix}secondary-color) !default;\\n// scss-docs-end figure-variables\\n\\n\\n// Breadcrumbs\\n\\n// scss-docs-start breadcrumb-variables\\n$breadcrumb-font-size: null !default;\\n$breadcrumb-padding-y: 0 !default;\\n$breadcrumb-padding-x: 0 !default;\\n$breadcrumb-item-padding-x: .5rem !default;\\n$breadcrumb-margin-bottom: 1rem !default;\\n$breadcrumb-bg: null !default;\\n$breadcrumb-divider-color: var(--#{$prefix}secondary-color) !default;\\n$breadcrumb-active-color: var(--#{$prefix}secondary-color) !default;\\n$breadcrumb-divider: quote(\\"/\\") !default;\\n$breadcrumb-divider-flipped: $breadcrumb-divider !default;\\n$breadcrumb-border-radius: null !default;\\n// scss-docs-end breadcrumb-variables\\n\\n// Carousel\\n\\n// scss-docs-start carousel-variables\\n$carousel-control-color: $white !default;\\n$carousel-control-width: 15% !default;\\n$carousel-control-opacity: .5 !default;\\n$carousel-control-hover-opacity: .9 !default;\\n$carousel-control-transition: opacity .15s ease !default;\\n\\n$carousel-indicator-width: 30px !default;\\n$carousel-indicator-height: 3px !default;\\n$carousel-indicator-hit-area-height: 10px !default;\\n$carousel-indicator-spacer: 3px !default;\\n$carousel-indicator-opacity: .5 !default;\\n$carousel-indicator-active-bg: $white !default;\\n$carousel-indicator-active-opacity: 1 !default;\\n$carousel-indicator-transition: opacity .6s ease !default;\\n\\n$carousel-caption-width: 70% !default;\\n$carousel-caption-color: $white !default;\\n$carousel-caption-padding-y: 1.25rem !default;\\n$carousel-caption-spacer: 1.25rem !default;\\n\\n$carousel-control-icon-width: 2rem !default;\\n\\n$carousel-control-prev-icon-bg: url(\\"data:image/svg+xml,<svg xmlns=\'http://www.w3.org/2000/svg\' viewBox=\'0 0 16 16\' fill=\'#{$carousel-control-color}\'><path d=\'M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z\'/></svg>\\") !default;\\n$carousel-control-next-icon-bg: url(\\"data:image/svg+xml,<svg xmlns=\'http://www.w3.org/2000/svg\' viewBox=\'0 0 16 16\' fill=\'#{$carousel-control-color}\'><path d=\'M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z\'/></svg>\\") !default;\\n\\n$carousel-transition-duration: .6s !default;\\n$carousel-transition: transform $carousel-transition-duration ease-in-out !default; // Define transform transition first if using multiple transitions (e.g., `transform 2s ease, opacity .5s ease-out`)\\n// scss-docs-end carousel-variables\\n\\n// scss-docs-start carousel-dark-variables\\n$carousel-dark-indicator-active-bg: $black !default;\\n$carousel-dark-caption-color: $black !default;\\n$carousel-dark-control-icon-filter: invert(1) grayscale(100) !default;\\n// scss-docs-end carousel-dark-variables\\n\\n\\n// Spinners\\n\\n// scss-docs-start spinner-variables\\n$spinner-width: 2rem !default;\\n$spinner-height: $spinner-width !default;\\n$spinner-vertical-align: -.125em !default;\\n$spinner-border-width: .25em !default;\\n$spinner-animation-speed: .75s !default;\\n\\n$spinner-width-sm: 1rem !default;\\n$spinner-height-sm: $spinner-width-sm !default;\\n$spinner-border-width-sm: .2em !default;\\n// scss-docs-end spinner-variables\\n\\n\\n// Close\\n\\n// scss-docs-start close-variables\\n$btn-close-width: 1em !default;\\n$btn-close-height: $btn-close-width !default;\\n$btn-close-padding-x: .25em !default;\\n$btn-close-padding-y: $btn-close-padding-x !default;\\n$btn-close-color: $black !default;\\n$btn-close-bg: url(\\"data:image/svg+xml,<svg xmlns=\'http://www.w3.org/2000/svg\' viewBox=\'0 0 16 16\' fill=\'#{$btn-close-color}\'><path d=\'M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z\'/></svg>\\") !default;\\n$btn-close-focus-shadow: $focus-ring-box-shadow !default;\\n$btn-close-opacity: .5 !default;\\n$btn-close-hover-opacity: .75 !default;\\n$btn-close-focus-opacity: 1 !default;\\n$btn-close-disabled-opacity: .25 !default;\\n$btn-close-white-filter: invert(1) grayscale(100%) brightness(200%) !default;\\n// scss-docs-end close-variables\\n\\n\\n// Offcanvas\\n\\n// scss-docs-start offcanvas-variables\\n$offcanvas-padding-y: $modal-inner-padding !default;\\n$offcanvas-padding-x: $modal-inner-padding !default;\\n$offcanvas-horizontal-width: 400px !default;\\n$offcanvas-vertical-height: 30vh !default;\\n$offcanvas-transition-duration: .3s !default;\\n$offcanvas-border-color: $modal-content-border-color !default;\\n$offcanvas-border-width: $modal-content-border-width !default;\\n$offcanvas-title-line-height: $modal-title-line-height !default;\\n$offcanvas-bg-color: var(--#{$prefix}body-bg) !default;\\n$offcanvas-color: var(--#{$prefix}body-color) !default;\\n$offcanvas-box-shadow: $modal-content-box-shadow-xs !default;\\n$offcanvas-backdrop-bg: $modal-backdrop-bg !default;\\n$offcanvas-backdrop-opacity: $modal-backdrop-opacity !default;\\n// scss-docs-end offcanvas-variables\\n\\n// Code\\n\\n$code-font-size: $small-font-size !default;\\n$code-color: $pink !default;\\n\\n$kbd-padding-y: .1875rem !default;\\n$kbd-padding-x: .375rem !default;\\n$kbd-font-size: $code-font-size !default;\\n$kbd-color: var(--#{$prefix}body-bg) !default;\\n$kbd-bg: var(--#{$prefix}body-color) !default;\\n$nested-kbd-font-weight: null !default; // Deprecated in v5.2.0, removing in v6\\n\\n$pre-color: null !default;\\n","// stylelint-disable property-disallowed-list\\n// Single side border-radius\\n\\n// Helper function to replace negative values with 0\\n@function valid-radius($radius) {\\n $return: ();\\n @each $value in $radius {\\n @if type-of($value) == number {\\n $return: append($return, max($value, 0));\\n } @else {\\n $return: append($return, $value);\\n }\\n }\\n @return $return;\\n}\\n\\n// scss-docs-start border-radius-mixins\\n@mixin border-radius($radius: $border-radius, $fallback-border-radius: false) {\\n @if $enable-rounded {\\n border-radius: valid-radius($radius);\\n }\\n @else if $fallback-border-radius != false {\\n border-radius: $fallback-border-radius;\\n }\\n}\\n\\n@mixin border-top-radius($radius: $border-radius) {\\n @if $enable-rounded {\\n border-top-left-radius: valid-radius($radius);\\n border-top-right-radius: valid-radius($radius);\\n }\\n}\\n\\n@mixin border-end-radius($radius: $border-radius) {\\n @if $enable-rounded {\\n border-top-right-radius: valid-radius($radius);\\n border-bottom-right-radius: valid-radius($radius);\\n }\\n}\\n\\n@mixin border-bottom-radius($radius: $border-radius) {\\n @if $enable-rounded {\\n border-bottom-right-radius: valid-radius($radius);\\n border-bottom-left-radius: valid-radius($radius);\\n }\\n}\\n\\n@mixin border-start-radius($radius: $border-radius) {\\n @if $enable-rounded {\\n border-top-left-radius: valid-radius($radius);\\n border-bottom-left-radius: valid-radius($radius);\\n }\\n}\\n\\n@mixin border-top-start-radius($radius: $border-radius) {\\n @if $enable-rounded {\\n border-top-left-radius: valid-radius($radius);\\n }\\n}\\n\\n@mixin border-top-end-radius($radius: $border-radius) {\\n @if $enable-rounded {\\n border-top-right-radius: valid-radius($radius);\\n }\\n}\\n\\n@mixin border-bottom-end-radius($radius: $border-radius) {\\n @if $enable-rounded {\\n border-bottom-right-radius: valid-radius($radius);\\n }\\n}\\n\\n@mixin border-bottom-start-radius($radius: $border-radius) {\\n @if $enable-rounded {\\n border-bottom-left-radius: valid-radius($radius);\\n }\\n}\\n// scss-docs-end border-radius-mixins\\n","//\\n// Headings\\n//\\n.h1 {\\n @extend h1;\\n}\\n\\n.h2 {\\n @extend h2;\\n}\\n\\n.h3 {\\n @extend h3;\\n}\\n\\n.h4 {\\n @extend h4;\\n}\\n\\n.h5 {\\n @extend h5;\\n}\\n\\n.h6 {\\n @extend h6;\\n}\\n\\n\\n.lead {\\n @include font-size($lead-font-size);\\n font-weight: $lead-font-weight;\\n}\\n\\n// Type display classes\\n@each $display, $font-size in $display-font-sizes {\\n .display-#{$display} {\\n @include font-size($font-size);\\n font-family: $display-font-family;\\n font-style: $display-font-style;\\n font-weight: $display-font-weight;\\n line-height: $display-line-height;\\n }\\n}\\n\\n//\\n// Emphasis\\n//\\n.small {\\n @extend small;\\n}\\n\\n.mark {\\n @extend mark;\\n}\\n\\n//\\n// Lists\\n//\\n\\n.list-unstyled {\\n @include list-unstyled();\\n}\\n\\n// Inline turns list items into inline-block\\n.list-inline {\\n @include list-unstyled();\\n}\\n.list-inline-item {\\n display: inline-block;\\n\\n &:not(:last-child) {\\n margin-right: $list-inline-padding;\\n }\\n}\\n\\n\\n//\\n// Misc\\n//\\n\\n// Builds on `abbr`\\n.initialism {\\n @include font-size($initialism-font-size);\\n text-transform: uppercase;\\n}\\n\\n// Blockquotes\\n.blockquote {\\n margin-bottom: $blockquote-margin-y;\\n @include font-size($blockquote-font-size);\\n\\n > :last-child {\\n margin-bottom: 0;\\n }\\n}\\n\\n.blockquote-footer {\\n margin-top: -$blockquote-margin-y;\\n margin-bottom: $blockquote-margin-y;\\n @include font-size($blockquote-footer-font-size);\\n color: $blockquote-footer-color;\\n\\n &::before {\\n content: \\"\\\\2014\\\\00A0\\"; // em dash, nbsp\\n }\\n}\\n","// Lists\\n\\n// Unstyled keeps list items block level, just removes default browser padding and list-style\\n@mixin list-unstyled {\\n padding-left: 0;\\n list-style: none;\\n}\\n","// Image Mixins\\n// - Responsive image\\n// - Retina image\\n\\n\\n// Responsive image\\n//\\n// Keep images from scaling beyond the width of their parents.\\n\\n@mixin img-fluid {\\n // Part 1: Set a maximum relative to the parent\\n max-width: 100%;\\n // Part 2: Override the height to auto, otherwise images will be stretched\\n // when setting a width and height attribute on the img element.\\n height: auto;\\n}\\n","// Responsive images (ensure images don\'t scale beyond their parents)\\n//\\n// This is purposefully opt-in via an explicit class rather than being the default for all `<img>`s.\\n// We previously tried the \\"images are responsive by default\\" approach in Bootstrap v2,\\n// and abandoned it in Bootstrap v3 because it breaks lots of third-party widgets (including Google Maps)\\n// which weren\'t expecting the images within themselves to be involuntarily resized.\\n// See also https://github.com/twbs/bootstrap/issues/18178\\n.img-fluid {\\n @include img-fluid();\\n}\\n\\n\\n// Image thumbnails\\n.img-thumbnail {\\n padding: $thumbnail-padding;\\n background-color: $thumbnail-bg;\\n border: $thumbnail-border-width solid $thumbnail-border-color;\\n @include border-radius($thumbnail-border-radius);\\n @include box-shadow($thumbnail-box-shadow);\\n\\n // Keep them at most 100% wide\\n @include img-fluid();\\n}\\n\\n//\\n// Figures\\n//\\n\\n.figure {\\n // Ensures the caption\'s text aligns with the image.\\n display: inline-block;\\n}\\n\\n.figure-img {\\n margin-bottom: $spacer * .5;\\n line-height: 1;\\n}\\n\\n.figure-caption {\\n @include font-size($figure-caption-font-size);\\n color: $figure-caption-color;\\n}\\n","// Container mixins\\n\\n@mixin make-container($gutter: $container-padding-x) {\\n --#{$prefix}gutter-x: #{$gutter};\\n --#{$prefix}gutter-y: 0;\\n width: 100%;\\n padding-right: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\\n padding-left: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\\n margin-right: auto;\\n margin-left: auto;\\n}\\n","// Breakpoint viewport sizes and media queries.\\n//\\n// Breakpoints are defined as a map of (name: minimum width), order from small to large:\\n//\\n// (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px)\\n//\\n// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.\\n\\n// Name of the next breakpoint, or null for the last breakpoint.\\n//\\n// >> breakpoint-next(sm)\\n// md\\n// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\\n// md\\n// >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl xxl))\\n// md\\n@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {\\n $n: index($breakpoint-names, $name);\\n @if not $n {\\n @error \\"breakpoint `#{$name}` not found in `#{$breakpoints}`\\";\\n }\\n @return if($n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);\\n}\\n\\n// Minimum breakpoint width. Null for the smallest (first) breakpoint.\\n//\\n// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\\n// 576px\\n@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {\\n $min: map-get($breakpoints, $name);\\n @return if($min != 0, $min, null);\\n}\\n\\n// Maximum breakpoint width.\\n// The maximum value is reduced by 0.02px to work around the limitations of\\n// `min-` and `max-` prefixes and viewports with fractional widths.\\n// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max\\n// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.\\n// See https://bugs.webkit.org/show_bug.cgi?id=178261\\n//\\n// >> breakpoint-max(md, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\\n// 767.98px\\n@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {\\n $max: map-get($breakpoints, $name);\\n @return if($max and $max > 0, $max - .02, null);\\n}\\n\\n// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front.\\n// Useful for making responsive utilities.\\n//\\n// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\\n// \\"\\" (Returns a blank string)\\n// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\\n// \\"-sm\\"\\n@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {\\n @return if(breakpoint-min($name, $breakpoints) == null, \\"\\", \\"-#{$name}\\");\\n}\\n\\n// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.\\n// Makes the @content apply to the given breakpoint and wider.\\n@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {\\n $min: breakpoint-min($name, $breakpoints);\\n @if $min {\\n @media (min-width: $min) {\\n @content;\\n }\\n } @else {\\n @content;\\n }\\n}\\n\\n// Media of at most the maximum breakpoint width. No query for the largest breakpoint.\\n// Makes the @content apply to the given breakpoint and narrower.\\n@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {\\n $max: breakpoint-max($name, $breakpoints);\\n @if $max {\\n @media (max-width: $max) {\\n @content;\\n }\\n } @else {\\n @content;\\n }\\n}\\n\\n// Media that spans multiple breakpoint widths.\\n// Makes the @content apply between the min and max breakpoints\\n@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {\\n $min: breakpoint-min($lower, $breakpoints);\\n $max: breakpoint-max($upper, $breakpoints);\\n\\n @if $min != null and $max != null {\\n @media (min-width: $min) and (max-width: $max) {\\n @content;\\n }\\n } @else if $max == null {\\n @include media-breakpoint-up($lower, $breakpoints) {\\n @content;\\n }\\n } @else if $min == null {\\n @include media-breakpoint-down($upper, $breakpoints) {\\n @content;\\n }\\n }\\n}\\n\\n// Media between the breakpoint\'s minimum and maximum widths.\\n// No minimum for the smallest breakpoint, and no maximum for the largest one.\\n// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.\\n@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {\\n $min: breakpoint-min($name, $breakpoints);\\n $next: breakpoint-next($name, $breakpoints);\\n $max: breakpoint-max($next, $breakpoints);\\n\\n @if $min != null and $max != null {\\n @media (min-width: $min) and (max-width: $max) {\\n @content;\\n }\\n } @else if $max == null {\\n @include media-breakpoint-up($name, $breakpoints) {\\n @content;\\n }\\n } @else if $min == null {\\n @include media-breakpoint-down($next, $breakpoints) {\\n @content;\\n }\\n }\\n}\\n","// Container widths\\n//\\n// Set the container width, and override it for fixed navbars in media queries.\\n\\n@if $enable-container-classes {\\n // Single container class with breakpoint max-widths\\n .container,\\n // 100% wide container at all breakpoints\\n .container-fluid {\\n @include make-container();\\n }\\n\\n // Responsive containers that are 100% wide until a breakpoint\\n @each $breakpoint, $container-max-width in $container-max-widths {\\n .container-#{$breakpoint} {\\n @extend .container-fluid;\\n }\\n\\n @include media-breakpoint-up($breakpoint, $grid-breakpoints) {\\n %responsive-container-#{$breakpoint} {\\n max-width: $container-max-width;\\n }\\n\\n // Extend each breakpoint which is smaller or equal to the current breakpoint\\n $extend-breakpoint: true;\\n\\n @each $name, $width in $grid-breakpoints {\\n @if ($extend-breakpoint) {\\n .container#{breakpoint-infix($name, $grid-breakpoints)} {\\n @extend %responsive-container-#{$breakpoint};\\n }\\n\\n // Once the current breakpoint is reached, stop extending\\n @if ($breakpoint == $name) {\\n $extend-breakpoint: false;\\n }\\n }\\n }\\n }\\n }\\n}\\n","// Row\\n//\\n// Rows contain your columns.\\n\\n:root {\\n @each $name, $value in $grid-breakpoints {\\n --#{$prefix}breakpoint-#{$name}: #{$value};\\n }\\n}\\n\\n@if $enable-grid-classes {\\n .row {\\n @include make-row();\\n\\n > * {\\n @include make-col-ready();\\n }\\n }\\n}\\n\\n@if $enable-cssgrid {\\n .grid {\\n display: grid;\\n grid-template-rows: repeat(var(--#{$prefix}rows, 1), 1fr);\\n grid-template-columns: repeat(var(--#{$prefix}columns, #{$grid-columns}), 1fr);\\n gap: var(--#{$prefix}gap, #{$grid-gutter-width});\\n\\n @include make-cssgrid();\\n }\\n}\\n\\n\\n// Columns\\n//\\n// Common styles for small and large grid columns\\n\\n@if $enable-grid-classes {\\n @include make-grid-columns();\\n}\\n","// Grid system\\n//\\n// Generate semantic grid columns with these mixins.\\n\\n@mixin make-row($gutter: $grid-gutter-width) {\\n --#{$prefix}gutter-x: #{$gutter};\\n --#{$prefix}gutter-y: 0;\\n display: flex;\\n flex-wrap: wrap;\\n // TODO: Revisit calc order after https://github.com/react-bootstrap/react-bootstrap/issues/6039 is fixed\\n margin-top: calc(-1 * var(--#{$prefix}gutter-y)); // stylelint-disable-line function-disallowed-list\\n margin-right: calc(-.5 * var(--#{$prefix}gutter-x)); // stylelint-disable-line function-disallowed-list\\n margin-left: calc(-.5 * var(--#{$prefix}gutter-x)); // stylelint-disable-line function-disallowed-list\\n}\\n\\n@mixin make-col-ready() {\\n // Add box sizing if only the grid is loaded\\n box-sizing: if(variable-exists(include-column-box-sizing) and $include-column-box-sizing, border-box, null);\\n // Prevent columns from becoming too narrow when at smaller grid tiers by\\n // always setting `width: 100%;`. This works because we set the width\\n // later on to override this initial width.\\n flex-shrink: 0;\\n width: 100%;\\n max-width: 100%; // Prevent `.col-auto`, `.col` (& responsive variants) from breaking out the grid\\n padding-right: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\\n padding-left: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\\n margin-top: var(--#{$prefix}gutter-y);\\n}\\n\\n@mixin make-col($size: false, $columns: $grid-columns) {\\n @if $size {\\n flex: 0 0 auto;\\n width: percentage(divide($size, $columns));\\n\\n } @else {\\n flex: 1 1 0;\\n max-width: 100%;\\n }\\n}\\n\\n@mixin make-col-auto() {\\n flex: 0 0 auto;\\n width: auto;\\n}\\n\\n@mixin make-col-offset($size, $columns: $grid-columns) {\\n $num: divide($size, $columns);\\n margin-left: if($num == 0, 0, percentage($num));\\n}\\n\\n// Row columns\\n//\\n// Specify on a parent element(e.g., .row) to force immediate children into NN\\n// number of columns. Supports wrapping to new lines, but does not do a Masonry\\n// style grid.\\n@mixin row-cols($count) {\\n > * {\\n flex: 0 0 auto;\\n width: percentage(divide(1, $count));\\n }\\n}\\n\\n// Framework grid generation\\n//\\n// Used only by Bootstrap to generate the correct number of grid classes given\\n// any value of `$grid-columns`.\\n\\n@mixin make-grid-columns($columns: $grid-columns, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) {\\n @each $breakpoint in map-keys($breakpoints) {\\n $infix: breakpoint-infix($breakpoint, $breakpoints);\\n\\n @include media-breakpoint-up($breakpoint, $breakpoints) {\\n // Provide basic `.col-{bp}` classes for equal-width flexbox columns\\n .col#{$infix} {\\n flex: 1 0 0%; // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4\\n }\\n\\n .row-cols#{$infix}-auto > * {\\n @include make-col-auto();\\n }\\n\\n @if $grid-row-columns > 0 {\\n @for $i from 1 through $grid-row-columns {\\n .row-cols#{$infix}-#{$i} {\\n @include row-cols($i);\\n }\\n }\\n }\\n\\n .col#{$infix}-auto {\\n @include make-col-auto();\\n }\\n\\n @if $columns > 0 {\\n @for $i from 1 through $columns {\\n .col#{$infix}-#{$i} {\\n @include make-col($i, $columns);\\n }\\n }\\n\\n // `$columns - 1` because offsetting by the width of an entire row isn\'t possible\\n @for $i from 0 through ($columns - 1) {\\n @if not ($infix == \\"\\" and $i == 0) { // Avoid emitting useless .offset-0\\n .offset#{$infix}-#{$i} {\\n @include make-col-offset($i, $columns);\\n }\\n }\\n }\\n }\\n\\n // Gutters\\n //\\n // Make use of `.g-*`, `.gx-*` or `.gy-*` utilities to change spacing between the columns.\\n @each $key, $value in $gutters {\\n .g#{$infix}-#{$key},\\n .gx#{$infix}-#{$key} {\\n --#{$prefix}gutter-x: #{$value};\\n }\\n\\n .g#{$infix}-#{$key},\\n .gy#{$infix}-#{$key} {\\n --#{$prefix}gutter-y: #{$value};\\n }\\n }\\n }\\n }\\n}\\n\\n@mixin make-cssgrid($columns: $grid-columns, $breakpoints: $grid-breakpoints) {\\n @each $breakpoint in map-keys($breakpoints) {\\n $infix: breakpoint-infix($breakpoint, $breakpoints);\\n\\n @include media-breakpoint-up($breakpoint, $breakpoints) {\\n @if $columns > 0 {\\n @for $i from 1 through $columns {\\n .g-col#{$infix}-#{$i} {\\n grid-column: auto / span $i;\\n }\\n }\\n\\n // Start with `1` because `0` is and invalid value.\\n // Ends with `$columns - 1` because offsetting by the width of an entire row isn\'t possible.\\n @for $i from 1 through ($columns - 1) {\\n .g-start#{$infix}-#{$i} {\\n grid-column-start: $i;\\n }\\n }\\n }\\n }\\n }\\n}\\n","//\\n// Basic Bootstrap table\\n//\\n\\n.table {\\n // Reset needed for nesting tables\\n --#{$prefix}table-color-type: initial;\\n --#{$prefix}table-bg-type: initial;\\n --#{$prefix}table-color-state: initial;\\n --#{$prefix}table-bg-state: initial;\\n // End of reset\\n --#{$prefix}table-color: #{$table-color};\\n --#{$prefix}table-bg: #{$table-bg};\\n --#{$prefix}table-border-color: #{$table-border-color};\\n --#{$prefix}table-accent-bg: #{$table-accent-bg};\\n --#{$prefix}table-striped-color: #{$table-striped-color};\\n --#{$prefix}table-striped-bg: #{$table-striped-bg};\\n --#{$prefix}table-active-color: #{$table-active-color};\\n --#{$prefix}table-active-bg: #{$table-active-bg};\\n --#{$prefix}table-hover-color: #{$table-hover-color};\\n --#{$prefix}table-hover-bg: #{$table-hover-bg};\\n\\n width: 100%;\\n margin-bottom: $spacer;\\n vertical-align: $table-cell-vertical-align;\\n border-color: var(--#{$prefix}table-border-color);\\n\\n // Target th & td\\n // We need the child combinator to prevent styles leaking to nested tables which doesn\'t have a `.table` class.\\n // We use the universal selectors here to simplify the selector (else we would need 6 different selectors).\\n // Another advantage is that this generates less code and makes the selector less specific making it easier to override.\\n // stylelint-disable-next-line selector-max-universal\\n > :not(caption) > * > * {\\n padding: $table-cell-padding-y $table-cell-padding-x;\\n // Following the precept of cascades: https://codepen.io/miriamsuzanne/full/vYNgodb\\n color: var(--#{$prefix}table-color-state, var(--#{$prefix}table-color-type, var(--#{$prefix}table-color)));\\n background-color: var(--#{$prefix}table-bg);\\n border-bottom-width: $table-border-width;\\n box-shadow: inset 0 0 0 9999px var(--#{$prefix}table-bg-state, var(--#{$prefix}table-bg-type, var(--#{$prefix}table-accent-bg)));\\n }\\n\\n > tbody {\\n vertical-align: inherit;\\n }\\n\\n > thead {\\n vertical-align: bottom;\\n }\\n}\\n\\n.table-group-divider {\\n border-top: calc(#{$table-border-width} * 2) solid $table-group-separator-color; // stylelint-disable-line function-disallowed-list\\n}\\n\\n//\\n// Change placement of captions with a class\\n//\\n\\n.caption-top {\\n caption-side: top;\\n}\\n\\n\\n//\\n// Condensed table w/ half padding\\n//\\n\\n.table-sm {\\n // stylelint-disable-next-line selector-max-universal\\n > :not(caption) > * > * {\\n padding: $table-cell-padding-y-sm $table-cell-padding-x-sm;\\n }\\n}\\n\\n\\n// Border versions\\n//\\n// Add or remove borders all around the table and between all the columns.\\n//\\n// When borders are added on all sides of the cells, the corners can render odd when\\n// these borders do not have the same color or if they are semi-transparent.\\n// Therefor we add top and border bottoms to the `tr`s and left and right borders\\n// to the `td`s or `th`s\\n\\n.table-bordered {\\n > :not(caption) > * {\\n border-width: $table-border-width 0;\\n\\n // stylelint-disable-next-line selector-max-universal\\n > * {\\n border-width: 0 $table-border-width;\\n }\\n }\\n}\\n\\n.table-borderless {\\n // stylelint-disable-next-line selector-max-universal\\n > :not(caption) > * > * {\\n border-bottom-width: 0;\\n }\\n\\n > :not(:first-child) {\\n border-top-width: 0;\\n }\\n}\\n\\n// Zebra-striping\\n//\\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\\n\\n// For rows\\n.table-striped {\\n > tbody > tr:nth-of-type(#{$table-striped-order}) > * {\\n --#{$prefix}table-color-type: var(--#{$prefix}table-striped-color);\\n --#{$prefix}table-bg-type: var(--#{$prefix}table-striped-bg);\\n }\\n}\\n\\n// For columns\\n.table-striped-columns {\\n > :not(caption) > tr > :nth-child(#{$table-striped-columns-order}) {\\n --#{$prefix}table-color-type: var(--#{$prefix}table-striped-color);\\n --#{$prefix}table-bg-type: var(--#{$prefix}table-striped-bg);\\n }\\n}\\n\\n// Active table\\n//\\n// The `.table-active` class can be added to highlight rows or cells\\n\\n.table-active {\\n --#{$prefix}table-color-state: var(--#{$prefix}table-active-color);\\n --#{$prefix}table-bg-state: var(--#{$prefix}table-active-bg);\\n}\\n\\n// Hover effect\\n//\\n// Placed here since it has to come after the potential zebra striping\\n\\n.table-hover {\\n > tbody > tr:hover > * {\\n --#{$prefix}table-color-state: var(--#{$prefix}table-hover-color);\\n --#{$prefix}table-bg-state: var(--#{$prefix}table-hover-bg);\\n }\\n}\\n\\n\\n// Table variants\\n//\\n// Table variants set the table cell backgrounds, border colors\\n// and the colors of the striped, hovered & active tables\\n\\n@each $color, $value in $table-variants {\\n @include table-variant($color, $value);\\n}\\n\\n// Responsive tables\\n//\\n// Generate series of `.table-responsive-*` classes for configuring the screen\\n// size of where your table will overflow.\\n\\n@each $breakpoint in map-keys($grid-breakpoints) {\\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\\n\\n @include media-breakpoint-down($breakpoint) {\\n .table-responsive#{$infix} {\\n overflow-x: auto;\\n -webkit-overflow-scrolling: touch;\\n }\\n }\\n}\\n","// scss-docs-start table-variant\\n@mixin table-variant($state, $background) {\\n .table-#{$state} {\\n $color: color-contrast(opaque($body-bg, $background));\\n $hover-bg: mix($color, $background, percentage($table-hover-bg-factor));\\n $striped-bg: mix($color, $background, percentage($table-striped-bg-factor));\\n $active-bg: mix($color, $background, percentage($table-active-bg-factor));\\n $table-border-color: mix($color, $background, percentage($table-border-factor));\\n\\n --#{$prefix}table-color: #{$color};\\n --#{$prefix}table-bg: #{$background};\\n --#{$prefix}table-border-color: #{$table-border-color};\\n --#{$prefix}table-striped-bg: #{$striped-bg};\\n --#{$prefix}table-striped-color: #{color-contrast($striped-bg)};\\n --#{$prefix}table-active-bg: #{$active-bg};\\n --#{$prefix}table-active-color: #{color-contrast($active-bg)};\\n --#{$prefix}table-hover-bg: #{$hover-bg};\\n --#{$prefix}table-hover-color: #{color-contrast($hover-bg)};\\n\\n color: var(--#{$prefix}table-color);\\n border-color: var(--#{$prefix}table-border-color);\\n }\\n}\\n// scss-docs-end table-variant\\n","//\\n// Labels\\n//\\n\\n.form-label {\\n margin-bottom: $form-label-margin-bottom;\\n @include font-size($form-label-font-size);\\n font-style: $form-label-font-style;\\n font-weight: $form-label-font-weight;\\n color: $form-label-color;\\n}\\n\\n// For use with horizontal and inline forms, when you need the label (or legend)\\n// text to align with the form controls.\\n.col-form-label {\\n padding-top: add($input-padding-y, $input-border-width);\\n padding-bottom: add($input-padding-y, $input-border-width);\\n margin-bottom: 0; // Override the `<legend>` default\\n @include font-size(inherit); // Override the `<legend>` default\\n font-style: $form-label-font-style;\\n font-weight: $form-label-font-weight;\\n line-height: $input-line-height;\\n color: $form-label-color;\\n}\\n\\n.col-form-label-lg {\\n padding-top: add($input-padding-y-lg, $input-border-width);\\n padding-bottom: add($input-padding-y-lg, $input-border-width);\\n @include font-size($input-font-size-lg);\\n}\\n\\n.col-form-label-sm {\\n padding-top: add($input-padding-y-sm, $input-border-width);\\n padding-bottom: add($input-padding-y-sm, $input-border-width);\\n @include font-size($input-font-size-sm);\\n}\\n","// Bootstrap functions\\n//\\n// Utility mixins and functions for evaluating source code across our variables, maps, and mixins.\\n\\n// Ascending\\n// Used to evaluate Sass maps like our grid breakpoints.\\n@mixin _assert-ascending($map, $map-name) {\\n $prev-key: null;\\n $prev-num: null;\\n @each $key, $num in $map {\\n @if $prev-num == null or unit($num) == \\"%\\" or unit($prev-num) == \\"%\\" {\\n // Do nothing\\n } @else if not comparable($prev-num, $num) {\\n @warn \\"Potentially invalid value for #{$map-name}: This map must be in ascending order, but key \'#{$key}\' has value #{$num} whose unit makes it incomparable to #{$prev-num}, the value of the previous key \'#{$prev-key}\' !\\";\\n } @else if $prev-num >= $num {\\n @warn \\"Invalid value for #{$map-name}: This map must be in ascending order, but key \'#{$key}\' has value #{$num} which isn\'t greater than #{$prev-num}, the value of the previous key \'#{$prev-key}\' !\\";\\n }\\n $prev-key: $key;\\n $prev-num: $num;\\n }\\n}\\n\\n// Starts at zero\\n// Used to ensure the min-width of the lowest breakpoint starts at 0.\\n@mixin _assert-starts-at-zero($map, $map-name: \\"$grid-breakpoints\\") {\\n @if length($map) > 0 {\\n $values: map-values($map);\\n $first-value: nth($values, 1);\\n @if $first-value != 0 {\\n @warn \\"First breakpoint in #{$map-name} must start at 0, but starts at #{$first-value}.\\";\\n }\\n }\\n}\\n\\n// Colors\\n@function to-rgb($value) {\\n @return red($value), green($value), blue($value);\\n}\\n\\n// stylelint-disable scss/dollar-variable-pattern\\n@function rgba-css-var($identifier, $target) {\\n @if $identifier == \\"body\\" and $target == \\"bg\\" {\\n @return rgba(var(--#{$prefix}#{$identifier}-bg-rgb), var(--#{$prefix}#{$target}-opacity));\\n } @if $identifier == \\"body\\" and $target == \\"text\\" {\\n @return rgba(var(--#{$prefix}#{$identifier}-color-rgb), var(--#{$prefix}#{$target}-opacity));\\n } @else {\\n @return rgba(var(--#{$prefix}#{$identifier}-rgb), var(--#{$prefix}#{$target}-opacity));\\n }\\n}\\n\\n@function map-loop($map, $func, $args...) {\\n $_map: ();\\n\\n @each $key, $value in $map {\\n // allow to pass the $key and $value of the map as an function argument\\n $_args: ();\\n @each $arg in $args {\\n $_args: append($_args, if($arg == \\"$key\\", $key, if($arg == \\"$value\\", $value, $arg)));\\n }\\n\\n $_map: map-merge($_map, ($key: call(get-function($func), $_args...)));\\n }\\n\\n @return $_map;\\n}\\n// stylelint-enable scss/dollar-variable-pattern\\n\\n@function varify($list) {\\n $result: null;\\n @each $entry in $list {\\n $result: append($result, var(--#{$prefix}#{$entry}), space);\\n }\\n @return $result;\\n}\\n\\n// Internal Bootstrap function to turn maps into its negative variant.\\n// It prefixes the keys with `n` and makes the value negative.\\n@function negativify-map($map) {\\n $result: ();\\n @each $key, $value in $map {\\n @if $key != 0 {\\n $result: map-merge($result, (\\"n\\" + $key: (-$value)));\\n }\\n }\\n @return $result;\\n}\\n\\n// Get multiple keys from a sass map\\n@function map-get-multiple($map, $values) {\\n $result: ();\\n @each $key, $value in $map {\\n @if (index($values, $key) != null) {\\n $result: map-merge($result, ($key: $value));\\n }\\n }\\n @return $result;\\n}\\n\\n// Merge multiple maps\\n@function map-merge-multiple($maps...) {\\n $merged-maps: ();\\n\\n @each $map in $maps {\\n $merged-maps: map-merge($merged-maps, $map);\\n }\\n @return $merged-maps;\\n}\\n\\n// Replace `$search` with `$replace` in `$string`\\n// Used on our SVG icon backgrounds for custom forms.\\n//\\n// @author Kitty Giraudel\\n// @param {String} $string - Initial string\\n// @param {String} $search - Substring to replace\\n// @param {String} $replace (\'\') - New value\\n// @return {String} - Updated string\\n@function str-replace($string, $search, $replace: \\"\\") {\\n $index: str-index($string, $search);\\n\\n @if $index {\\n @return str-slice($string, 1, $index - 1) + $replace + str-replace(str-slice($string, $index + str-length($search)), $search, $replace);\\n }\\n\\n @return $string;\\n}\\n\\n// See https://codepen.io/kevinweber/pen/dXWoRw\\n//\\n// Requires the use of quotes around data URIs.\\n\\n@function escape-svg($string) {\\n @if str-index($string, \\"data:image/svg+xml\\") {\\n @each $char, $encoded in $escaped-characters {\\n // Do not escape the url brackets\\n @if str-index($string, \\"url(\\") == 1 {\\n $string: url(\\"#{str-replace(str-slice($string, 6, -3), $char, $encoded)}\\");\\n } @else {\\n $string: str-replace($string, $char, $encoded);\\n }\\n }\\n }\\n\\n @return $string;\\n}\\n\\n// Color contrast\\n// See https://github.com/twbs/bootstrap/pull/30168\\n\\n// A list of pre-calculated numbers of pow(divide((divide($value, 255) + .055), 1.055), 2.4). (from 0 to 255)\\n// stylelint-disable-next-line scss/dollar-variable-default, scss/dollar-variable-pattern\\n$_luminance-list: .0008 .001 .0011 .0013 .0015 .0017 .002 .0022 .0025 .0027 .003 .0033 .0037 .004 .0044 .0048 .0052 .0056 .006 .0065 .007 .0075 .008 .0086 .0091 .0097 .0103 .011 .0116 .0123 .013 .0137 .0144 .0152 .016 .0168 .0176 .0185 .0194 .0203 .0212 .0222 .0232 .0242 .0252 .0262 .0273 .0284 .0296 .0307 .0319 .0331 .0343 .0356 .0369 .0382 .0395 .0409 .0423 .0437 .0452 .0467 .0482 .0497 .0513 .0529 .0545 .0561 .0578 .0595 .0612 .063 .0648 .0666 .0685 .0704 .0723 .0742 .0762 .0782 .0802 .0823 .0844 .0865 .0887 .0908 .0931 .0953 .0976 .0999 .1022 .1046 .107 .1095 .1119 .1144 .117 .1195 .1221 .1248 .1274 .1301 .1329 .1356 .1384 .1413 .1441 .147 .15 .1529 .1559 .159 .162 .1651 .1683 .1714 .1746 .1779 .1812 .1845 .1878 .1912 .1946 .1981 .2016 .2051 .2086 .2122 .2159 .2195 .2232 .227 .2307 .2346 .2384 .2423 .2462 .2502 .2542 .2582 .2623 .2664 .2705 .2747 .2789 .2831 .2874 .2918 .2961 .3005 .305 .3095 .314 .3185 .3231 .3278 .3325 .3372 .3419 .3467 .3515 .3564 .3613 .3663 .3712 .3763 .3813 .3864 .3916 .3968 .402 .4072 .4125 .4179 .4233 .4287 .4342 .4397 .4452 .4508 .4564 .4621 .4678 .4735 .4793 .4851 .491 .4969 .5029 .5089 .5149 .521 .5271 .5333 .5395 .5457 .552 .5583 .5647 .5711 .5776 .5841 .5906 .5972 .6038 .6105 .6172 .624 .6308 .6376 .6445 .6514 .6584 .6654 .6724 .6795 .6867 .6939 .7011 .7084 .7157 .7231 .7305 .7379 .7454 .7529 .7605 .7682 .7758 .7835 .7913 .7991 .807 .8148 .8228 .8308 .8388 .8469 .855 .8632 .8714 .8796 .8879 .8963 .9047 .9131 .9216 .9301 .9387 .9473 .956 .9647 .9734 .9823 .9911 1;\\n\\n@function color-contrast($background, $color-contrast-dark: $color-contrast-dark, $color-contrast-light: $color-contrast-light, $min-contrast-ratio: $min-contrast-ratio) {\\n $foregrounds: $color-contrast-light, $color-contrast-dark, $white, $black;\\n $max-ratio: 0;\\n $max-ratio-color: null;\\n\\n @each $color in $foregrounds {\\n $contrast-ratio: contrast-ratio($background, $color);\\n @if $contrast-ratio > $min-contrast-ratio {\\n @return $color;\\n } @else if $contrast-ratio > $max-ratio {\\n $max-ratio: $contrast-ratio;\\n $max-ratio-color: $color;\\n }\\n }\\n\\n @warn \\"Found no color leading to #{$min-contrast-ratio}:1 contrast ratio against #{$background}...\\";\\n\\n @return $max-ratio-color;\\n}\\n\\n@function contrast-ratio($background, $foreground: $color-contrast-light) {\\n $l1: luminance($background);\\n $l2: luminance(opaque($background, $foreground));\\n\\n @return if($l1 > $l2, divide($l1 + .05, $l2 + .05), divide($l2 + .05, $l1 + .05));\\n}\\n\\n// Return WCAG2.1 relative luminance\\n// See https://www.w3.org/TR/WCAG/#dfn-relative-luminance\\n// See https://www.w3.org/TR/WCAG/#dfn-contrast-ratio\\n@function luminance($color) {\\n $rgb: (\\n \\"r\\": red($color),\\n \\"g\\": green($color),\\n \\"b\\": blue($color)\\n );\\n\\n @each $name, $value in $rgb {\\n $value: if(divide($value, 255) < .04045, divide(divide($value, 255), 12.92), nth($_luminance-list, $value + 1));\\n $rgb: map-merge($rgb, ($name: $value));\\n }\\n\\n @return (map-get($rgb, \\"r\\") * .2126) + (map-get($rgb, \\"g\\") * .7152) + (map-get($rgb, \\"b\\") * .0722);\\n}\\n\\n// Return opaque color\\n// opaque(#fff, rgba(0, 0, 0, .5)) => #808080\\n@function opaque($background, $foreground) {\\n @return mix(rgba($foreground, 1), $background, opacity($foreground) * 100%);\\n}\\n\\n// scss-docs-start color-functions\\n// Tint a color: mix a color with white\\n@function tint-color($color, $weight) {\\n @return mix(white, $color, $weight);\\n}\\n\\n// Shade a color: mix a color with black\\n@function shade-color($color, $weight) {\\n @return mix(black, $color, $weight);\\n}\\n\\n// Shade the color if the weight is positive, else tint it\\n@function shift-color($color, $weight) {\\n @return if($weight > 0, shade-color($color, $weight), tint-color($color, -$weight));\\n}\\n// scss-docs-end color-functions\\n\\n// Return valid calc\\n@function add($value1, $value2, $return-calc: true) {\\n @if $value1 == null {\\n @return $value2;\\n }\\n\\n @if $value2 == null {\\n @return $value1;\\n }\\n\\n @if type-of($value1) == number and type-of($value2) == number and comparable($value1, $value2) {\\n @return $value1 + $value2;\\n }\\n\\n @return if($return-calc == true, calc(#{$value1} + #{$value2}), $value1 + unquote(\\" + \\") + $value2);\\n}\\n\\n@function subtract($value1, $value2, $return-calc: true) {\\n @if $value1 == null and $value2 == null {\\n @return null;\\n }\\n\\n @if $value1 == null {\\n @return -$value2;\\n }\\n\\n @if $value2 == null {\\n @return $value1;\\n }\\n\\n @if type-of($value1) == number and type-of($value2) == number and comparable($value1, $value2) {\\n @return $value1 - $value2;\\n }\\n\\n @if type-of($value2) != number {\\n $value2: unquote(\\"(\\") + $value2 + unquote(\\")\\");\\n }\\n\\n @return if($return-calc == true, calc(#{$value1} - #{$value2}), $value1 + unquote(\\" - \\") + $value2);\\n}\\n\\n@function divide($dividend, $divisor, $precision: 10) {\\n $sign: if($dividend > 0 and $divisor > 0 or $dividend < 0 and $divisor < 0, 1, -1);\\n $dividend: abs($dividend);\\n $divisor: abs($divisor);\\n @if $dividend == 0 {\\n @return 0;\\n }\\n @if $divisor == 0 {\\n @error \\"Cannot divide by 0\\";\\n }\\n $remainder: $dividend;\\n $result: 0;\\n $factor: 10;\\n @while ($remainder > 0 and $precision >= 0) {\\n $quotient: 0;\\n @while ($remainder >= $divisor) {\\n $remainder: $remainder - $divisor;\\n $quotient: $quotient + 1;\\n }\\n $result: $result * 10 + $quotient;\\n $factor: $factor * .1;\\n $remainder: $remainder * 10;\\n $precision: $precision - 1;\\n @if ($precision < 0 and $remainder >= $divisor * 5) {\\n $result: $result + 1;\\n }\\n }\\n $result: $result * $factor * $sign;\\n $dividend-unit: unit($dividend);\\n $divisor-unit: unit($divisor);\\n $unit-map: (\\n \\"px\\": 1px,\\n \\"rem\\": 1rem,\\n \\"em\\": 1em,\\n \\"%\\": 1%\\n );\\n @if ($dividend-unit != $divisor-unit and map-has-key($unit-map, $dividend-unit)) {\\n $result: $result * map-get($unit-map, $dividend-unit);\\n }\\n @return $result;\\n}\\n","//\\n// Form text\\n//\\n\\n.form-text {\\n margin-top: $form-text-margin-top;\\n @include font-size($form-text-font-size);\\n font-style: $form-text-font-style;\\n font-weight: $form-text-font-weight;\\n color: $form-text-color;\\n}\\n","//\\n// General form controls (plus a few specific high-level interventions)\\n//\\n\\n.form-control {\\n display: block;\\n width: 100%;\\n padding: $input-padding-y $input-padding-x;\\n font-family: $input-font-family;\\n @include font-size($input-font-size);\\n font-weight: $input-font-weight;\\n line-height: $input-line-height;\\n color: $input-color;\\n appearance: none; // Fix appearance for date inputs in Safari\\n background-color: $input-bg;\\n background-clip: padding-box;\\n border: $input-border-width solid $input-border-color;\\n\\n // Note: This has no effect on <select>s in some browsers, due to the limited stylability of `<select>`s in CSS.\\n @include border-radius($input-border-radius, 0);\\n\\n @include box-shadow($input-box-shadow);\\n @include transition($input-transition);\\n\\n &[type=\\"file\\"] {\\n overflow: hidden; // prevent pseudo element button overlap\\n\\n &:not(:disabled):not([readonly]) {\\n cursor: pointer;\\n }\\n }\\n\\n // Customize the `:focus` state to imitate native WebKit styles.\\n &:focus {\\n color: $input-focus-color;\\n background-color: $input-focus-bg;\\n border-color: $input-focus-border-color;\\n outline: 0;\\n @if $enable-shadows {\\n @include box-shadow($input-box-shadow, $input-focus-box-shadow);\\n } @else {\\n // Avoid using mixin so we can pass custom focus shadow properly\\n box-shadow: $input-focus-box-shadow;\\n }\\n }\\n\\n &::-webkit-date-and-time-value {\\n // On Android Chrome, form-control\'s \\"width: 100%\\" makes the input width too small\\n // Tested under Android 11 / Chrome 89, Android 12 / Chrome 100, Android 13 / Chrome 109\\n //\\n // On iOS Safari, form-control\'s \\"appearance: none\\" + \\"width: 100%\\" makes the input width too small\\n // Tested under iOS 16.2 / Safari 16.2\\n min-width: 85px; // Seems to be a good minimum safe width\\n\\n // Add some height to date inputs on iOS\\n // https://github.com/twbs/bootstrap/issues/23307\\n // TODO: we can remove this workaround once https://bugs.webkit.org/show_bug.cgi?id=198959 is resolved\\n // Multiply line-height by 1em if it has no unit\\n height: if(unit($input-line-height) == \\"\\", $input-line-height * 1em, $input-line-height);\\n\\n // Android Chrome type=\\"date\\" is taller than the other inputs\\n // because of \\"margin: 1px 24px 1px 4px\\" inside the shadow DOM\\n // Tested under Android 11 / Chrome 89, Android 12 / Chrome 100, Android 13 / Chrome 109\\n margin: 0;\\n }\\n\\n // Prevent excessive date input height in Webkit\\n // https://github.com/twbs/bootstrap/issues/34433\\n &::-webkit-datetime-edit {\\n display: block;\\n padding: 0;\\n }\\n\\n // Placeholder\\n &::placeholder {\\n color: $input-placeholder-color;\\n // Override Firefox\'s unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526.\\n opacity: 1;\\n }\\n\\n // Disabled inputs\\n //\\n // HTML5 says that controls under a fieldset > legend:first-child won\'t be\\n // disabled if the fieldset is disabled. Due to implementation difficulty, we\\n // don\'t honor that edge case; we style them as disabled anyway.\\n &:disabled {\\n color: $input-disabled-color;\\n background-color: $input-disabled-bg;\\n border-color: $input-disabled-border-color;\\n // iOS fix for unreadable disabled content; see https://github.com/twbs/bootstrap/issues/11655.\\n opacity: 1;\\n }\\n\\n // File input buttons theming\\n &::file-selector-button {\\n padding: $input-padding-y $input-padding-x;\\n margin: (-$input-padding-y) (-$input-padding-x);\\n margin-inline-end: $input-padding-x;\\n color: $form-file-button-color;\\n @include gradient-bg($form-file-button-bg);\\n pointer-events: none;\\n border-color: inherit;\\n border-style: solid;\\n border-width: 0;\\n border-inline-end-width: $input-border-width;\\n border-radius: 0; // stylelint-disable-line property-disallowed-list\\n @include transition($btn-transition);\\n }\\n\\n &:hover:not(:disabled):not([readonly])::file-selector-button {\\n background-color: $form-file-button-hover-bg;\\n }\\n}\\n\\n// Readonly controls as plain text\\n//\\n// Apply class to a readonly input to make it appear like regular plain\\n// text (without any border, background color, focus indicator)\\n\\n.form-control-plaintext {\\n display: block;\\n width: 100%;\\n padding: $input-padding-y 0;\\n margin-bottom: 0; // match inputs if this class comes on inputs with default margins\\n line-height: $input-line-height;\\n color: $input-plaintext-color;\\n background-color: transparent;\\n border: solid transparent;\\n border-width: $input-border-width 0;\\n\\n &:focus {\\n outline: 0;\\n }\\n\\n &.form-control-sm,\\n &.form-control-lg {\\n padding-right: 0;\\n padding-left: 0;\\n }\\n}\\n\\n// Form control sizing\\n//\\n// Build on `.form-control` with modifier classes to decrease or increase the\\n// height and font-size of form controls.\\n//\\n// Repeated in `_input_group.scss` to avoid Sass extend issues.\\n\\n.form-control-sm {\\n min-height: $input-height-sm;\\n padding: $input-padding-y-sm $input-padding-x-sm;\\n @include font-size($input-font-size-sm);\\n @include border-radius($input-border-radius-sm);\\n\\n &::file-selector-button {\\n padding: $input-padding-y-sm $input-padding-x-sm;\\n margin: (-$input-padding-y-sm) (-$input-padding-x-sm);\\n margin-inline-end: $input-padding-x-sm;\\n }\\n}\\n\\n.form-control-lg {\\n min-height: $input-height-lg;\\n padding: $input-padding-y-lg $input-padding-x-lg;\\n @include font-size($input-font-size-lg);\\n @include border-radius($input-border-radius-lg);\\n\\n &::file-selector-button {\\n padding: $input-padding-y-lg $input-padding-x-lg;\\n margin: (-$input-padding-y-lg) (-$input-padding-x-lg);\\n margin-inline-end: $input-padding-x-lg;\\n }\\n}\\n\\n// Make sure textareas don\'t shrink too much when resized\\n// https://github.com/twbs/bootstrap/pull/29124\\n// stylelint-disable selector-no-qualifying-type\\ntextarea {\\n &.form-control {\\n min-height: $input-height;\\n }\\n\\n &.form-control-sm {\\n min-height: $input-height-sm;\\n }\\n\\n &.form-control-lg {\\n min-height: $input-height-lg;\\n }\\n}\\n// stylelint-enable selector-no-qualifying-type\\n\\n.form-control-color {\\n width: $form-color-width;\\n height: $input-height;\\n padding: $input-padding-y;\\n\\n &:not(:disabled):not([readonly]) {\\n cursor: pointer;\\n }\\n\\n &::-moz-color-swatch {\\n border: 0 !important; // stylelint-disable-line declaration-no-important\\n @include border-radius($input-border-radius);\\n }\\n\\n &::-webkit-color-swatch {\\n border: 0 !important; // stylelint-disable-line declaration-no-important\\n @include border-radius($input-border-radius);\\n }\\n\\n &.form-control-sm { height: $input-height-sm; }\\n &.form-control-lg { height: $input-height-lg; }\\n}\\n","// stylelint-disable property-disallowed-list\\n@mixin transition($transition...) {\\n @if length($transition) == 0 {\\n $transition: $transition-base;\\n }\\n\\n @if length($transition) > 1 {\\n @each $value in $transition {\\n @if $value == null or $value == none {\\n @warn \\"The keyword \'none\' or \'null\' must be used as a single argument.\\";\\n }\\n }\\n }\\n\\n @if $enable-transitions {\\n @if nth($transition, 1) != null {\\n transition: $transition;\\n }\\n\\n @if $enable-reduced-motion and nth($transition, 1) != null and nth($transition, 1) != none {\\n @media (prefers-reduced-motion: reduce) {\\n transition: none;\\n }\\n }\\n }\\n}\\n","// Gradients\\n\\n// scss-docs-start gradient-bg-mixin\\n@mixin gradient-bg($color: null) {\\n background-color: $color;\\n\\n @if $enable-gradients {\\n background-image: var(--#{$prefix}gradient);\\n }\\n}\\n// scss-docs-end gradient-bg-mixin\\n\\n// scss-docs-start gradient-mixins\\n// Horizontal gradient, from left to right\\n//\\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\\n@mixin gradient-x($start-color: $gray-700, $end-color: $gray-800, $start-percent: 0%, $end-percent: 100%) {\\n background-image: linear-gradient(to right, $start-color $start-percent, $end-color $end-percent);\\n}\\n\\n// Vertical gradient, from top to bottom\\n//\\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\\n@mixin gradient-y($start-color: $gray-700, $end-color: $gray-800, $start-percent: null, $end-percent: null) {\\n background-image: linear-gradient(to bottom, $start-color $start-percent, $end-color $end-percent);\\n}\\n\\n@mixin gradient-directional($start-color: $gray-700, $end-color: $gray-800, $deg: 45deg) {\\n background-image: linear-gradient($deg, $start-color, $end-color);\\n}\\n\\n@mixin gradient-x-three-colors($start-color: $blue, $mid-color: $purple, $color-stop: 50%, $end-color: $red) {\\n background-image: linear-gradient(to right, $start-color, $mid-color $color-stop, $end-color);\\n}\\n\\n@mixin gradient-y-three-colors($start-color: $blue, $mid-color: $purple, $color-stop: 50%, $end-color: $red) {\\n background-image: linear-gradient($start-color, $mid-color $color-stop, $end-color);\\n}\\n\\n@mixin gradient-radial($inner-color: $gray-700, $outer-color: $gray-800) {\\n background-image: radial-gradient(circle, $inner-color, $outer-color);\\n}\\n\\n@mixin gradient-striped($color: rgba($white, .15), $angle: 45deg) {\\n background-image: linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);\\n}\\n// scss-docs-end gradient-mixins\\n","// Select\\n//\\n// Replaces the browser default select with a custom one, mostly pulled from\\n// https://primer.github.io/.\\n\\n.form-select {\\n --#{$prefix}form-select-bg-img: #{escape-svg($form-select-indicator)};\\n\\n display: block;\\n width: 100%;\\n padding: $form-select-padding-y $form-select-indicator-padding $form-select-padding-y $form-select-padding-x;\\n font-family: $form-select-font-family;\\n @include font-size($form-select-font-size);\\n font-weight: $form-select-font-weight;\\n line-height: $form-select-line-height;\\n color: $form-select-color;\\n appearance: none;\\n background-color: $form-select-bg;\\n background-image: var(--#{$prefix}form-select-bg-img), var(--#{$prefix}form-select-bg-icon, none);\\n background-repeat: no-repeat;\\n background-position: $form-select-bg-position;\\n background-size: $form-select-bg-size;\\n border: $form-select-border-width solid $form-select-border-color;\\n @include border-radius($form-select-border-radius, 0);\\n @include box-shadow($form-select-box-shadow);\\n @include transition($form-select-transition);\\n\\n &:focus {\\n border-color: $form-select-focus-border-color;\\n outline: 0;\\n @if $enable-shadows {\\n @include box-shadow($form-select-box-shadow, $form-select-focus-box-shadow);\\n } @else {\\n // Avoid using mixin so we can pass custom focus shadow properly\\n box-shadow: $form-select-focus-box-shadow;\\n }\\n }\\n\\n &[multiple],\\n &[size]:not([size=\\"1\\"]) {\\n padding-right: $form-select-padding-x;\\n background-image: none;\\n }\\n\\n &:disabled {\\n color: $form-select-disabled-color;\\n background-color: $form-select-disabled-bg;\\n border-color: $form-select-disabled-border-color;\\n }\\n\\n // Remove outline from select box in FF\\n &:-moz-focusring {\\n color: transparent;\\n text-shadow: 0 0 0 $form-select-color;\\n }\\n}\\n\\n.form-select-sm {\\n padding-top: $form-select-padding-y-sm;\\n padding-bottom: $form-select-padding-y-sm;\\n padding-left: $form-select-padding-x-sm;\\n @include font-size($form-select-font-size-sm);\\n @include border-radius($form-select-border-radius-sm);\\n}\\n\\n.form-select-lg {\\n padding-top: $form-select-padding-y-lg;\\n padding-bottom: $form-select-padding-y-lg;\\n padding-left: $form-select-padding-x-lg;\\n @include font-size($form-select-font-size-lg);\\n @include border-radius($form-select-border-radius-lg);\\n}\\n\\n@if $enable-dark-mode {\\n @include color-mode(dark) {\\n .form-select {\\n --#{$prefix}form-select-bg-img: #{escape-svg($form-select-indicator-dark)};\\n }\\n }\\n}\\n","//\\n// Check/radio\\n//\\n\\n.form-check {\\n display: block;\\n min-height: $form-check-min-height;\\n padding-left: $form-check-padding-start;\\n margin-bottom: $form-check-margin-bottom;\\n\\n .form-check-input {\\n float: left;\\n margin-left: $form-check-padding-start * -1;\\n }\\n}\\n\\n.form-check-reverse {\\n padding-right: $form-check-padding-start;\\n padding-left: 0;\\n text-align: right;\\n\\n .form-check-input {\\n float: right;\\n margin-right: $form-check-padding-start * -1;\\n margin-left: 0;\\n }\\n}\\n\\n.form-check-input {\\n --#{$prefix}form-check-bg: #{$form-check-input-bg};\\n\\n flex-shrink: 0;\\n width: $form-check-input-width;\\n height: $form-check-input-width;\\n margin-top: ($line-height-base - $form-check-input-width) * .5; // line-height minus check height\\n vertical-align: top;\\n appearance: none;\\n background-color: var(--#{$prefix}form-check-bg);\\n background-image: var(--#{$prefix}form-check-bg-image);\\n background-repeat: no-repeat;\\n background-position: center;\\n background-size: contain;\\n border: $form-check-input-border;\\n print-color-adjust: exact; // Keep themed appearance for print\\n @include transition($form-check-transition);\\n\\n &[type=\\"checkbox\\"] {\\n @include border-radius($form-check-input-border-radius);\\n }\\n\\n &[type=\\"radio\\"] {\\n // stylelint-disable-next-line property-disallowed-list\\n border-radius: $form-check-radio-border-radius;\\n }\\n\\n &:active {\\n filter: $form-check-input-active-filter;\\n }\\n\\n &:focus {\\n border-color: $form-check-input-focus-border;\\n outline: 0;\\n box-shadow: $form-check-input-focus-box-shadow;\\n }\\n\\n &:checked {\\n background-color: $form-check-input-checked-bg-color;\\n border-color: $form-check-input-checked-border-color;\\n\\n &[type=\\"checkbox\\"] {\\n @if $enable-gradients {\\n --#{$prefix}form-check-bg-image: #{escape-svg($form-check-input-checked-bg-image)}, var(--#{$prefix}gradient);\\n } @else {\\n --#{$prefix}form-check-bg-image: #{escape-svg($form-check-input-checked-bg-image)};\\n }\\n }\\n\\n &[type=\\"radio\\"] {\\n @if $enable-gradients {\\n --#{$prefix}form-check-bg-image: #{escape-svg($form-check-radio-checked-bg-image)}, var(--#{$prefix}gradient);\\n } @else {\\n --#{$prefix}form-check-bg-image: #{escape-svg($form-check-radio-checked-bg-image)};\\n }\\n }\\n }\\n\\n &[type=\\"checkbox\\"]:indeterminate {\\n background-color: $form-check-input-indeterminate-bg-color;\\n border-color: $form-check-input-indeterminate-border-color;\\n\\n @if $enable-gradients {\\n --#{$prefix}form-check-bg-image: #{escape-svg($form-check-input-indeterminate-bg-image)}, var(--#{$prefix}gradient);\\n } @else {\\n --#{$prefix}form-check-bg-image: #{escape-svg($form-check-input-indeterminate-bg-image)};\\n }\\n }\\n\\n &:disabled {\\n pointer-events: none;\\n filter: none;\\n opacity: $form-check-input-disabled-opacity;\\n }\\n\\n // Use disabled attribute in addition of :disabled pseudo-class\\n // See: https://github.com/twbs/bootstrap/issues/28247\\n &[disabled],\\n &:disabled {\\n ~ .form-check-label {\\n cursor: default;\\n opacity: $form-check-label-disabled-opacity;\\n }\\n }\\n}\\n\\n.form-check-label {\\n color: $form-check-label-color;\\n cursor: $form-check-label-cursor;\\n}\\n\\n//\\n// Switch\\n//\\n\\n.form-switch {\\n padding-left: $form-switch-padding-start;\\n\\n .form-check-input {\\n --#{$prefix}form-switch-bg: #{escape-svg($form-switch-bg-image)};\\n\\n width: $form-switch-width;\\n margin-left: $form-switch-padding-start * -1;\\n background-image: var(--#{$prefix}form-switch-bg);\\n background-position: left center;\\n @include border-radius($form-switch-border-radius);\\n @include transition($form-switch-transition);\\n\\n &:focus {\\n --#{$prefix}form-switch-bg: #{escape-svg($form-switch-focus-bg-image)};\\n }\\n\\n &:checked {\\n background-position: $form-switch-checked-bg-position;\\n\\n @if $enable-gradients {\\n --#{$prefix}form-switch-bg: #{escape-svg($form-switch-checked-bg-image)}, var(--#{$prefix}gradient);\\n } @else {\\n --#{$prefix}form-switch-bg: #{escape-svg($form-switch-checked-bg-image)};\\n }\\n }\\n }\\n\\n &.form-check-reverse {\\n padding-right: $form-switch-padding-start;\\n padding-left: 0;\\n\\n .form-check-input {\\n margin-right: $form-switch-padding-start * -1;\\n margin-left: 0;\\n }\\n }\\n}\\n\\n.form-check-inline {\\n display: inline-block;\\n margin-right: $form-check-inline-margin-end;\\n}\\n\\n.btn-check {\\n position: absolute;\\n clip: rect(0, 0, 0, 0);\\n pointer-events: none;\\n\\n &[disabled],\\n &:disabled {\\n + .btn {\\n pointer-events: none;\\n filter: none;\\n opacity: $form-check-btn-check-disabled-opacity;\\n }\\n }\\n}\\n\\n@if $enable-dark-mode {\\n @include color-mode(dark) {\\n .form-switch .form-check-input:not(:checked):not(:focus) {\\n --#{$prefix}form-switch-bg: #{escape-svg($form-switch-bg-image-dark)};\\n }\\n }\\n}\\n","// Range\\n//\\n// Style range inputs the same across browsers. Vendor-specific rules for pseudo\\n// elements cannot be mixed. As such, there are no shared styles for focus or\\n// active states on prefixed selectors.\\n\\n.form-range {\\n width: 100%;\\n height: add($form-range-thumb-height, $form-range-thumb-focus-box-shadow-width * 2);\\n padding: 0; // Need to reset padding\\n appearance: none;\\n background-color: transparent;\\n\\n &:focus {\\n outline: 0;\\n\\n // Pseudo-elements must be split across multiple rulesets to have an effect.\\n // No box-shadow() mixin for focus accessibility.\\n &::-webkit-slider-thumb { box-shadow: $form-range-thumb-focus-box-shadow; }\\n &::-moz-range-thumb { box-shadow: $form-range-thumb-focus-box-shadow; }\\n }\\n\\n &::-moz-focus-outer {\\n border: 0;\\n }\\n\\n &::-webkit-slider-thumb {\\n width: $form-range-thumb-width;\\n height: $form-range-thumb-height;\\n margin-top: ($form-range-track-height - $form-range-thumb-height) * .5; // Webkit specific\\n appearance: none;\\n @include gradient-bg($form-range-thumb-bg);\\n border: $form-range-thumb-border;\\n @include border-radius($form-range-thumb-border-radius);\\n @include box-shadow($form-range-thumb-box-shadow);\\n @include transition($form-range-thumb-transition);\\n\\n &:active {\\n @include gradient-bg($form-range-thumb-active-bg);\\n }\\n }\\n\\n &::-webkit-slider-runnable-track {\\n width: $form-range-track-width;\\n height: $form-range-track-height;\\n color: transparent; // Why?\\n cursor: $form-range-track-cursor;\\n background-color: $form-range-track-bg;\\n border-color: transparent;\\n @include border-radius($form-range-track-border-radius);\\n @include box-shadow($form-range-track-box-shadow);\\n }\\n\\n &::-moz-range-thumb {\\n width: $form-range-thumb-width;\\n height: $form-range-thumb-height;\\n appearance: none;\\n @include gradient-bg($form-range-thumb-bg);\\n border: $form-range-thumb-border;\\n @include border-radius($form-range-thumb-border-radius);\\n @include box-shadow($form-range-thumb-box-shadow);\\n @include transition($form-range-thumb-transition);\\n\\n &:active {\\n @include gradient-bg($form-range-thumb-active-bg);\\n }\\n }\\n\\n &::-moz-range-track {\\n width: $form-range-track-width;\\n height: $form-range-track-height;\\n color: transparent;\\n cursor: $form-range-track-cursor;\\n background-color: $form-range-track-bg;\\n border-color: transparent; // Firefox specific?\\n @include border-radius($form-range-track-border-radius);\\n @include box-shadow($form-range-track-box-shadow);\\n }\\n\\n &:disabled {\\n pointer-events: none;\\n\\n &::-webkit-slider-thumb {\\n background-color: $form-range-thumb-disabled-bg;\\n }\\n\\n &::-moz-range-thumb {\\n background-color: $form-range-thumb-disabled-bg;\\n }\\n }\\n}\\n",".form-floating {\\n position: relative;\\n\\n > .form-control,\\n > .form-control-plaintext,\\n > .form-select {\\n height: $form-floating-height;\\n min-height: $form-floating-height;\\n line-height: $form-floating-line-height;\\n }\\n\\n > label {\\n position: absolute;\\n top: 0;\\n left: 0;\\n z-index: 2;\\n height: 100%; // allow textareas\\n padding: $form-floating-padding-y $form-floating-padding-x;\\n overflow: hidden;\\n text-align: start;\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n pointer-events: none;\\n border: $input-border-width solid transparent; // Required for aligning label\'s text with the input as it affects inner box model\\n transform-origin: 0 0;\\n @include transition($form-floating-transition);\\n }\\n\\n > .form-control,\\n > .form-control-plaintext {\\n padding: $form-floating-padding-y $form-floating-padding-x;\\n\\n &::placeholder {\\n color: transparent;\\n }\\n\\n &:focus,\\n &:not(:placeholder-shown) {\\n padding-top: $form-floating-input-padding-t;\\n padding-bottom: $form-floating-input-padding-b;\\n }\\n // Duplicated because `:-webkit-autofill` invalidates other selectors when grouped\\n &:-webkit-autofill {\\n padding-top: $form-floating-input-padding-t;\\n padding-bottom: $form-floating-input-padding-b;\\n }\\n }\\n\\n > .form-select {\\n padding-top: $form-floating-input-padding-t;\\n padding-bottom: $form-floating-input-padding-b;\\n }\\n\\n > .form-control:focus,\\n > .form-control:not(:placeholder-shown),\\n > .form-control-plaintext,\\n > .form-select {\\n ~ label {\\n color: rgba(var(--#{$prefix}body-color-rgb), #{$form-floating-label-opacity});\\n transform: $form-floating-label-transform;\\n\\n &::after {\\n position: absolute;\\n inset: $form-floating-padding-y ($form-floating-padding-x * .5);\\n z-index: -1;\\n height: $form-floating-label-height;\\n content: \\"\\";\\n background-color: $input-bg;\\n @include border-radius($input-border-radius);\\n }\\n }\\n }\\n // Duplicated because `:-webkit-autofill` invalidates other selectors when grouped\\n > .form-control:-webkit-autofill {\\n ~ label {\\n color: rgba(var(--#{$prefix}body-color-rgb), #{$form-floating-label-opacity});\\n transform: $form-floating-label-transform;\\n }\\n }\\n\\n > .form-control-plaintext {\\n ~ label {\\n border-width: $input-border-width 0; // Required to properly position label text - as explained above\\n }\\n }\\n\\n > :disabled ~ label,\\n > .form-control:disabled ~ label { // Required for `.form-control`s because of specificity\\n color: $form-floating-label-disabled-color;\\n\\n &::after {\\n background-color: $input-disabled-bg;\\n }\\n }\\n}\\n","//\\n// Base styles\\n//\\n\\n.input-group {\\n position: relative;\\n display: flex;\\n flex-wrap: wrap; // For form validation feedback\\n align-items: stretch;\\n width: 100%;\\n\\n > .form-control,\\n > .form-select,\\n > .form-floating {\\n position: relative; // For focus state\'s z-index\\n flex: 1 1 auto;\\n width: 1%;\\n min-width: 0; // https://stackoverflow.com/questions/36247140/why-dont-flex-items-shrink-past-content-size\\n }\\n\\n // Bring the \\"active\\" form control to the top of surrounding elements\\n > .form-control:focus,\\n > .form-select:focus,\\n > .form-floating:focus-within {\\n z-index: 5;\\n }\\n\\n // Ensure buttons are always above inputs for more visually pleasing borders.\\n // This isn\'t needed for `.input-group-text` since it shares the same border-color\\n // as our inputs.\\n .btn {\\n position: relative;\\n z-index: 2;\\n\\n &:focus {\\n z-index: 5;\\n }\\n }\\n}\\n\\n\\n// Textual addons\\n//\\n// Serves as a catch-all element for any text or radio/checkbox input you wish\\n// to prepend or append to an input.\\n\\n.input-group-text {\\n display: flex;\\n align-items: center;\\n padding: $input-group-addon-padding-y $input-group-addon-padding-x;\\n @include font-size($input-font-size); // Match inputs\\n font-weight: $input-group-addon-font-weight;\\n line-height: $input-line-height;\\n color: $input-group-addon-color;\\n text-align: center;\\n white-space: nowrap;\\n background-color: $input-group-addon-bg;\\n border: $input-border-width solid $input-group-addon-border-color;\\n @include border-radius($input-border-radius);\\n}\\n\\n\\n// Sizing\\n//\\n// Remix the default form control sizing classes into new ones for easier\\n// manipulation.\\n\\n.input-group-lg > .form-control,\\n.input-group-lg > .form-select,\\n.input-group-lg > .input-group-text,\\n.input-group-lg > .btn {\\n padding: $input-padding-y-lg $input-padding-x-lg;\\n @include font-size($input-font-size-lg);\\n @include border-radius($input-border-radius-lg);\\n}\\n\\n.input-group-sm > .form-control,\\n.input-group-sm > .form-select,\\n.input-group-sm > .input-group-text,\\n.input-group-sm > .btn {\\n padding: $input-padding-y-sm $input-padding-x-sm;\\n @include font-size($input-font-size-sm);\\n @include border-radius($input-border-radius-sm);\\n}\\n\\n.input-group-lg > .form-select,\\n.input-group-sm > .form-select {\\n padding-right: $form-select-padding-x + $form-select-indicator-padding;\\n}\\n\\n\\n// Rounded corners\\n//\\n// These rulesets must come after the sizing ones to properly override sm and lg\\n// border-radius values when extending. They\'re more specific than we\'d like\\n// with the `.input-group >` part, but without it, we cannot override the sizing.\\n\\n// stylelint-disable-next-line no-duplicate-selectors\\n.input-group {\\n &:not(.has-validation) {\\n > :not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),\\n > .dropdown-toggle:nth-last-child(n + 3),\\n > .form-floating:not(:last-child) > .form-control,\\n > .form-floating:not(:last-child) > .form-select {\\n @include border-end-radius(0);\\n }\\n }\\n\\n &.has-validation {\\n > :nth-last-child(n + 3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),\\n > .dropdown-toggle:nth-last-child(n + 4),\\n > .form-floating:nth-last-child(n + 3) > .form-control,\\n > .form-floating:nth-last-child(n + 3) > .form-select {\\n @include border-end-radius(0);\\n }\\n }\\n\\n $validation-messages: \\"\\";\\n @each $state in map-keys($form-validation-states) {\\n $validation-messages: $validation-messages + \\":not(.\\" + unquote($state) + \\"-tooltip)\\" + \\":not(.\\" + unquote($state) + \\"-feedback)\\";\\n }\\n\\n > :not(:first-child):not(.dropdown-menu)#{$validation-messages} {\\n margin-left: calc(#{$input-border-width} * -1); // stylelint-disable-line function-disallowed-list\\n @include border-start-radius(0);\\n }\\n\\n > .form-floating:not(:first-child) > .form-control,\\n > .form-floating:not(:first-child) > .form-select {\\n @include border-start-radius(0);\\n }\\n}\\n","// This mixin uses an `if()` technique to be compatible with Dart Sass\\n// See https://github.com/sass/sass/issues/1873#issuecomment-152293725 for more details\\n\\n// scss-docs-start form-validation-mixins\\n@mixin form-validation-state-selector($state) {\\n @if ($state == \\"valid\\" or $state == \\"invalid\\") {\\n .was-validated #{if(&, \\"&\\", \\"\\")}:#{$state},\\n #{if(&, \\"&\\", \\"\\")}.is-#{$state} {\\n @content;\\n }\\n } @else {\\n #{if(&, \\"&\\", \\"\\")}.is-#{$state} {\\n @content;\\n }\\n }\\n}\\n\\n@mixin form-validation-state(\\n $state,\\n $color,\\n $icon,\\n $tooltip-color: color-contrast($color),\\n $tooltip-bg-color: rgba($color, $form-feedback-tooltip-opacity),\\n $focus-box-shadow: 0 0 $input-btn-focus-blur $input-focus-width rgba($color, $input-btn-focus-color-opacity),\\n $border-color: $color\\n) {\\n .#{$state}-feedback {\\n display: none;\\n width: 100%;\\n margin-top: $form-feedback-margin-top;\\n @include font-size($form-feedback-font-size);\\n font-style: $form-feedback-font-style;\\n color: $color;\\n }\\n\\n .#{$state}-tooltip {\\n position: absolute;\\n top: 100%;\\n z-index: 5;\\n display: none;\\n max-width: 100%; // Contain to parent when possible\\n padding: $form-feedback-tooltip-padding-y $form-feedback-tooltip-padding-x;\\n margin-top: .1rem;\\n @include font-size($form-feedback-tooltip-font-size);\\n line-height: $form-feedback-tooltip-line-height;\\n color: $tooltip-color;\\n background-color: $tooltip-bg-color;\\n @include border-radius($form-feedback-tooltip-border-radius);\\n }\\n\\n @include form-validation-state-selector($state) {\\n ~ .#{$state}-feedback,\\n ~ .#{$state}-tooltip {\\n display: block;\\n }\\n }\\n\\n .form-control {\\n @include form-validation-state-selector($state) {\\n border-color: $border-color;\\n\\n @if $enable-validation-icons {\\n padding-right: $input-height-inner;\\n background-image: escape-svg($icon);\\n background-repeat: no-repeat;\\n background-position: right $input-height-inner-quarter center;\\n background-size: $input-height-inner-half $input-height-inner-half;\\n }\\n\\n &:focus {\\n border-color: $border-color;\\n box-shadow: $focus-box-shadow;\\n }\\n }\\n }\\n\\n // stylelint-disable-next-line selector-no-qualifying-type\\n textarea.form-control {\\n @include form-validation-state-selector($state) {\\n @if $enable-validation-icons {\\n padding-right: $input-height-inner;\\n background-position: top $input-height-inner-quarter right $input-height-inner-quarter;\\n }\\n }\\n }\\n\\n .form-select {\\n @include form-validation-state-selector($state) {\\n border-color: $border-color;\\n\\n @if $enable-validation-icons {\\n &:not([multiple]):not([size]),\\n &:not([multiple])[size=\\"1\\"] {\\n --#{$prefix}form-select-bg-icon: #{escape-svg($icon)};\\n padding-right: $form-select-feedback-icon-padding-end;\\n background-position: $form-select-bg-position, $form-select-feedback-icon-position;\\n background-size: $form-select-bg-size, $form-select-feedback-icon-size;\\n }\\n }\\n\\n &:focus {\\n border-color: $border-color;\\n box-shadow: $focus-box-shadow;\\n }\\n }\\n }\\n\\n .form-control-color {\\n @include form-validation-state-selector($state) {\\n @if $enable-validation-icons {\\n width: add($form-color-width, $input-height-inner);\\n }\\n }\\n }\\n\\n .form-check-input {\\n @include form-validation-state-selector($state) {\\n border-color: $border-color;\\n\\n &:checked {\\n background-color: $color;\\n }\\n\\n &:focus {\\n box-shadow: $focus-box-shadow;\\n }\\n\\n ~ .form-check-label {\\n color: $color;\\n }\\n }\\n }\\n .form-check-inline .form-check-input {\\n ~ .#{$state}-feedback {\\n margin-left: .5em;\\n }\\n }\\n\\n .input-group {\\n > .form-control:not(:focus),\\n > .form-select:not(:focus),\\n > .form-floating:not(:focus-within) {\\n @include form-validation-state-selector($state) {\\n @if $state == \\"valid\\" {\\n z-index: 3;\\n } @else if $state == \\"invalid\\" {\\n z-index: 4;\\n }\\n }\\n }\\n }\\n}\\n// scss-docs-end form-validation-mixins\\n","//\\n// Base styles\\n//\\n\\n.btn {\\n // scss-docs-start btn-css-vars\\n --#{$prefix}btn-padding-x: #{$btn-padding-x};\\n --#{$prefix}btn-padding-y: #{$btn-padding-y};\\n --#{$prefix}btn-font-family: #{$btn-font-family};\\n @include rfs($btn-font-size, --#{$prefix}btn-font-size);\\n --#{$prefix}btn-font-weight: #{$btn-font-weight};\\n --#{$prefix}btn-line-height: #{$btn-line-height};\\n --#{$prefix}btn-color: #{$btn-color};\\n --#{$prefix}btn-bg: transparent;\\n --#{$prefix}btn-border-width: #{$btn-border-width};\\n --#{$prefix}btn-border-color: transparent;\\n --#{$prefix}btn-border-radius: #{$btn-border-radius};\\n --#{$prefix}btn-hover-border-color: transparent;\\n --#{$prefix}btn-box-shadow: #{$btn-box-shadow};\\n --#{$prefix}btn-disabled-opacity: #{$btn-disabled-opacity};\\n --#{$prefix}btn-focus-box-shadow: 0 0 0 #{$btn-focus-width} rgba(var(--#{$prefix}btn-focus-shadow-rgb), .5);\\n // scss-docs-end btn-css-vars\\n\\n display: inline-block;\\n padding: var(--#{$prefix}btn-padding-y) var(--#{$prefix}btn-padding-x);\\n font-family: var(--#{$prefix}btn-font-family);\\n @include font-size(var(--#{$prefix}btn-font-size));\\n font-weight: var(--#{$prefix}btn-font-weight);\\n line-height: var(--#{$prefix}btn-line-height);\\n color: var(--#{$prefix}btn-color);\\n text-align: center;\\n text-decoration: if($link-decoration == none, null, none);\\n white-space: $btn-white-space;\\n vertical-align: middle;\\n cursor: if($enable-button-pointers, pointer, null);\\n user-select: none;\\n border: var(--#{$prefix}btn-border-width) solid var(--#{$prefix}btn-border-color);\\n @include border-radius(var(--#{$prefix}btn-border-radius));\\n @include gradient-bg(var(--#{$prefix}btn-bg));\\n @include box-shadow(var(--#{$prefix}btn-box-shadow));\\n @include transition($btn-transition);\\n\\n &:hover {\\n color: var(--#{$prefix}btn-hover-color);\\n text-decoration: if($link-hover-decoration == underline, none, null);\\n background-color: var(--#{$prefix}btn-hover-bg);\\n border-color: var(--#{$prefix}btn-hover-border-color);\\n }\\n\\n .btn-check + &:hover {\\n // override for the checkbox/radio buttons\\n color: var(--#{$prefix}btn-color);\\n background-color: var(--#{$prefix}btn-bg);\\n border-color: var(--#{$prefix}btn-border-color);\\n }\\n\\n &:focus-visible {\\n color: var(--#{$prefix}btn-hover-color);\\n @include gradient-bg(var(--#{$prefix}btn-hover-bg));\\n border-color: var(--#{$prefix}btn-hover-border-color);\\n outline: 0;\\n // Avoid using mixin so we can pass custom focus shadow properly\\n @if $enable-shadows {\\n box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow);\\n } @else {\\n box-shadow: var(--#{$prefix}btn-focus-box-shadow);\\n }\\n }\\n\\n .btn-check:focus-visible + & {\\n border-color: var(--#{$prefix}btn-hover-border-color);\\n outline: 0;\\n // Avoid using mixin so we can pass custom focus shadow properly\\n @if $enable-shadows {\\n box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow);\\n } @else {\\n box-shadow: var(--#{$prefix}btn-focus-box-shadow);\\n }\\n }\\n\\n .btn-check:checked + &,\\n :not(.btn-check) + &:active,\\n &:first-child:active,\\n &.active,\\n &.show {\\n color: var(--#{$prefix}btn-active-color);\\n background-color: var(--#{$prefix}btn-active-bg);\\n // Remove CSS gradients if they\'re enabled\\n background-image: if($enable-gradients, none, null);\\n border-color: var(--#{$prefix}btn-active-border-color);\\n @include box-shadow(var(--#{$prefix}btn-active-shadow));\\n\\n &:focus-visible {\\n // Avoid using mixin so we can pass custom focus shadow properly\\n @if $enable-shadows {\\n box-shadow: var(--#{$prefix}btn-active-shadow), var(--#{$prefix}btn-focus-box-shadow);\\n } @else {\\n box-shadow: var(--#{$prefix}btn-focus-box-shadow);\\n }\\n }\\n }\\n\\n &:disabled,\\n &.disabled,\\n fieldset:disabled & {\\n color: var(--#{$prefix}btn-disabled-color);\\n pointer-events: none;\\n background-color: var(--#{$prefix}btn-disabled-bg);\\n background-image: if($enable-gradients, none, null);\\n border-color: var(--#{$prefix}btn-disabled-border-color);\\n opacity: var(--#{$prefix}btn-disabled-opacity);\\n @include box-shadow(none);\\n }\\n}\\n\\n\\n//\\n// Alternate buttons\\n//\\n\\n// scss-docs-start btn-variant-loops\\n@each $color, $value in $theme-colors {\\n .btn-#{$color} {\\n @if $color == \\"light\\" {\\n @include button-variant(\\n $value,\\n $value,\\n $hover-background: shade-color($value, $btn-hover-bg-shade-amount),\\n $hover-border: shade-color($value, $btn-hover-border-shade-amount),\\n $active-background: shade-color($value, $btn-active-bg-shade-amount),\\n $active-border: shade-color($value, $btn-active-border-shade-amount)\\n );\\n } @else if $color == \\"dark\\" {\\n @include button-variant(\\n $value,\\n $value,\\n $hover-background: tint-color($value, $btn-hover-bg-tint-amount),\\n $hover-border: tint-color($value, $btn-hover-border-tint-amount),\\n $active-background: tint-color($value, $btn-active-bg-tint-amount),\\n $active-border: tint-color($value, $btn-active-border-tint-amount)\\n );\\n } @else {\\n @include button-variant($value, $value);\\n }\\n }\\n}\\n\\n@each $color, $value in $theme-colors {\\n .btn-outline-#{$color} {\\n @include button-outline-variant($value);\\n }\\n}\\n// scss-docs-end btn-variant-loops\\n\\n\\n//\\n// Link buttons\\n//\\n\\n// Make a button look and behave like a link\\n.btn-link {\\n --#{$prefix}btn-font-weight: #{$font-weight-normal};\\n --#{$prefix}btn-color: #{$btn-link-color};\\n --#{$prefix}btn-bg: transparent;\\n --#{$prefix}btn-border-color: transparent;\\n --#{$prefix}btn-hover-color: #{$btn-link-hover-color};\\n --#{$prefix}btn-hover-border-color: transparent;\\n --#{$prefix}btn-active-color: #{$btn-link-hover-color};\\n --#{$prefix}btn-active-border-color: transparent;\\n --#{$prefix}btn-disabled-color: #{$btn-link-disabled-color};\\n --#{$prefix}btn-disabled-border-color: transparent;\\n --#{$prefix}btn-box-shadow: 0 0 0 #000; // Can\'t use `none` as keyword negates all values when used with multiple shadows\\n --#{$prefix}btn-focus-shadow-rgb: #{$btn-link-focus-shadow-rgb};\\n\\n text-decoration: $link-decoration;\\n @if $enable-gradients {\\n background-image: none;\\n }\\n\\n &:hover,\\n &:focus-visible {\\n text-decoration: $link-hover-decoration;\\n }\\n\\n &:focus-visible {\\n color: var(--#{$prefix}btn-color);\\n }\\n\\n &:hover {\\n color: var(--#{$prefix}btn-hover-color);\\n }\\n\\n // No need for an active state here\\n}\\n\\n\\n//\\n// Button Sizes\\n//\\n\\n.btn-lg {\\n @include button-size($btn-padding-y-lg, $btn-padding-x-lg, $btn-font-size-lg, $btn-border-radius-lg);\\n}\\n\\n.btn-sm {\\n @include button-size($btn-padding-y-sm, $btn-padding-x-sm, $btn-font-size-sm, $btn-border-radius-sm);\\n}\\n","// Button variants\\n//\\n// Easily pump out default styles, as well as :hover, :focus, :active,\\n// and disabled options for all buttons\\n\\n// scss-docs-start btn-variant-mixin\\n@mixin button-variant(\\n $background,\\n $border,\\n $color: color-contrast($background),\\n $hover-background: if($color == $color-contrast-light, shade-color($background, $btn-hover-bg-shade-amount), tint-color($background, $btn-hover-bg-tint-amount)),\\n $hover-border: if($color == $color-contrast-light, shade-color($border, $btn-hover-border-shade-amount), tint-color($border, $btn-hover-border-tint-amount)),\\n $hover-color: color-contrast($hover-background),\\n $active-background: if($color == $color-contrast-light, shade-color($background, $btn-active-bg-shade-amount), tint-color($background, $btn-active-bg-tint-amount)),\\n $active-border: if($color == $color-contrast-light, shade-color($border, $btn-active-border-shade-amount), tint-color($border, $btn-active-border-tint-amount)),\\n $active-color: color-contrast($active-background),\\n $disabled-background: $background,\\n $disabled-border: $border,\\n $disabled-color: color-contrast($disabled-background)\\n) {\\n --#{$prefix}btn-color: #{$color};\\n --#{$prefix}btn-bg: #{$background};\\n --#{$prefix}btn-border-color: #{$border};\\n --#{$prefix}btn-hover-color: #{$hover-color};\\n --#{$prefix}btn-hover-bg: #{$hover-background};\\n --#{$prefix}btn-hover-border-color: #{$hover-border};\\n --#{$prefix}btn-focus-shadow-rgb: #{to-rgb(mix($color, $border, 15%))};\\n --#{$prefix}btn-active-color: #{$active-color};\\n --#{$prefix}btn-active-bg: #{$active-background};\\n --#{$prefix}btn-active-border-color: #{$active-border};\\n --#{$prefix}btn-active-shadow: #{$btn-active-box-shadow};\\n --#{$prefix}btn-disabled-color: #{$disabled-color};\\n --#{$prefix}btn-disabled-bg: #{$disabled-background};\\n --#{$prefix}btn-disabled-border-color: #{$disabled-border};\\n}\\n// scss-docs-end btn-variant-mixin\\n\\n// scss-docs-start btn-outline-variant-mixin\\n@mixin button-outline-variant(\\n $color,\\n $color-hover: color-contrast($color),\\n $active-background: $color,\\n $active-border: $color,\\n $active-color: color-contrast($active-background)\\n) {\\n --#{$prefix}btn-color: #{$color};\\n --#{$prefix}btn-border-color: #{$color};\\n --#{$prefix}btn-hover-color: #{$color-hover};\\n --#{$prefix}btn-hover-bg: #{$active-background};\\n --#{$prefix}btn-hover-border-color: #{$active-border};\\n --#{$prefix}btn-focus-shadow-rgb: #{to-rgb($color)};\\n --#{$prefix}btn-active-color: #{$active-color};\\n --#{$prefix}btn-active-bg: #{$active-background};\\n --#{$prefix}btn-active-border-color: #{$active-border};\\n --#{$prefix}btn-active-shadow: #{$btn-active-box-shadow};\\n --#{$prefix}btn-disabled-color: #{$color};\\n --#{$prefix}btn-disabled-bg: transparent;\\n --#{$prefix}btn-disabled-border-color: #{$color};\\n --#{$prefix}gradient: none;\\n}\\n// scss-docs-end btn-outline-variant-mixin\\n\\n// scss-docs-start btn-size-mixin\\n@mixin button-size($padding-y, $padding-x, $font-size, $border-radius) {\\n --#{$prefix}btn-padding-y: #{$padding-y};\\n --#{$prefix}btn-padding-x: #{$padding-x};\\n @include rfs($font-size, --#{$prefix}btn-font-size);\\n --#{$prefix}btn-border-radius: #{$border-radius};\\n}\\n// scss-docs-end btn-size-mixin\\n",".fade {\\n @include transition($transition-fade);\\n\\n &:not(.show) {\\n opacity: 0;\\n }\\n}\\n\\n// scss-docs-start collapse-classes\\n.collapse {\\n &:not(.show) {\\n display: none;\\n }\\n}\\n\\n.collapsing {\\n height: 0;\\n overflow: hidden;\\n @include transition($transition-collapse);\\n\\n &.collapse-horizontal {\\n width: 0;\\n height: auto;\\n @include transition($transition-collapse-width);\\n }\\n}\\n// scss-docs-end collapse-classes\\n","// The dropdown wrapper (`<div>`)\\n.dropup,\\n.dropend,\\n.dropdown,\\n.dropstart,\\n.dropup-center,\\n.dropdown-center {\\n position: relative;\\n}\\n\\n.dropdown-toggle {\\n white-space: nowrap;\\n\\n // Generate the caret automatically\\n @include caret();\\n}\\n\\n// The dropdown menu\\n.dropdown-menu {\\n // scss-docs-start dropdown-css-vars\\n --#{$prefix}dropdown-zindex: #{$zindex-dropdown};\\n --#{$prefix}dropdown-min-width: #{$dropdown-min-width};\\n --#{$prefix}dropdown-padding-x: #{$dropdown-padding-x};\\n --#{$prefix}dropdown-padding-y: #{$dropdown-padding-y};\\n --#{$prefix}dropdown-spacer: #{$dropdown-spacer};\\n @include rfs($dropdown-font-size, --#{$prefix}dropdown-font-size);\\n --#{$prefix}dropdown-color: #{$dropdown-color};\\n --#{$prefix}dropdown-bg: #{$dropdown-bg};\\n --#{$prefix}dropdown-border-color: #{$dropdown-border-color};\\n --#{$prefix}dropdown-border-radius: #{$dropdown-border-radius};\\n --#{$prefix}dropdown-border-width: #{$dropdown-border-width};\\n --#{$prefix}dropdown-inner-border-radius: #{$dropdown-inner-border-radius};\\n --#{$prefix}dropdown-divider-bg: #{$dropdown-divider-bg};\\n --#{$prefix}dropdown-divider-margin-y: #{$dropdown-divider-margin-y};\\n --#{$prefix}dropdown-box-shadow: #{$dropdown-box-shadow};\\n --#{$prefix}dropdown-link-color: #{$dropdown-link-color};\\n --#{$prefix}dropdown-link-hover-color: #{$dropdown-link-hover-color};\\n --#{$prefix}dropdown-link-hover-bg: #{$dropdown-link-hover-bg};\\n --#{$prefix}dropdown-link-active-color: #{$dropdown-link-active-color};\\n --#{$prefix}dropdown-link-active-bg: #{$dropdown-link-active-bg};\\n --#{$prefix}dropdown-link-disabled-color: #{$dropdown-link-disabled-color};\\n --#{$prefix}dropdown-item-padding-x: #{$dropdown-item-padding-x};\\n --#{$prefix}dropdown-item-padding-y: #{$dropdown-item-padding-y};\\n --#{$prefix}dropdown-header-color: #{$dropdown-header-color};\\n --#{$prefix}dropdown-header-padding-x: #{$dropdown-header-padding-x};\\n --#{$prefix}dropdown-header-padding-y: #{$dropdown-header-padding-y};\\n // scss-docs-end dropdown-css-vars\\n\\n position: absolute;\\n z-index: var(--#{$prefix}dropdown-zindex);\\n display: none; // none by default, but block on \\"open\\" of the menu\\n min-width: var(--#{$prefix}dropdown-min-width);\\n padding: var(--#{$prefix}dropdown-padding-y) var(--#{$prefix}dropdown-padding-x);\\n margin: 0; // Override default margin of ul\\n @include font-size(var(--#{$prefix}dropdown-font-size));\\n color: var(--#{$prefix}dropdown-color);\\n text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)\\n list-style: none;\\n background-color: var(--#{$prefix}dropdown-bg);\\n background-clip: padding-box;\\n border: var(--#{$prefix}dropdown-border-width) solid var(--#{$prefix}dropdown-border-color);\\n @include border-radius(var(--#{$prefix}dropdown-border-radius));\\n @include box-shadow(var(--#{$prefix}dropdown-box-shadow));\\n\\n &[data-bs-popper] {\\n top: 100%;\\n left: 0;\\n margin-top: var(--#{$prefix}dropdown-spacer);\\n }\\n\\n @if $dropdown-padding-y == 0 {\\n > .dropdown-item:first-child,\\n > li:first-child .dropdown-item {\\n @include border-top-radius(var(--#{$prefix}dropdown-inner-border-radius));\\n }\\n > .dropdown-item:last-child,\\n > li:last-child .dropdown-item {\\n @include border-bottom-radius(var(--#{$prefix}dropdown-inner-border-radius));\\n }\\n\\n }\\n}\\n\\n// scss-docs-start responsive-breakpoints\\n// We deliberately hardcode the `bs-` prefix because we check\\n// this custom property in JS to determine Popper\'s positioning\\n\\n@each $breakpoint in map-keys($grid-breakpoints) {\\n @include media-breakpoint-up($breakpoint) {\\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\\n\\n .dropdown-menu#{$infix}-start {\\n --bs-position: start;\\n\\n &[data-bs-popper] {\\n right: auto;\\n left: 0;\\n }\\n }\\n\\n .dropdown-menu#{$infix}-end {\\n --bs-position: end;\\n\\n &[data-bs-popper] {\\n right: 0;\\n left: auto;\\n }\\n }\\n }\\n}\\n// scss-docs-end responsive-breakpoints\\n\\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\\n// Just add .dropup after the standard .dropdown class and you\'re set.\\n.dropup {\\n .dropdown-menu[data-bs-popper] {\\n top: auto;\\n bottom: 100%;\\n margin-top: 0;\\n margin-bottom: var(--#{$prefix}dropdown-spacer);\\n }\\n\\n .dropdown-toggle {\\n @include caret(up);\\n }\\n}\\n\\n.dropend {\\n .dropdown-menu[data-bs-popper] {\\n top: 0;\\n right: auto;\\n left: 100%;\\n margin-top: 0;\\n margin-left: var(--#{$prefix}dropdown-spacer);\\n }\\n\\n .dropdown-toggle {\\n @include caret(end);\\n &::after {\\n vertical-align: 0;\\n }\\n }\\n}\\n\\n.dropstart {\\n .dropdown-menu[data-bs-popper] {\\n top: 0;\\n right: 100%;\\n left: auto;\\n margin-top: 0;\\n margin-right: var(--#{$prefix}dropdown-spacer);\\n }\\n\\n .dropdown-toggle {\\n @include caret(start);\\n &::before {\\n vertical-align: 0;\\n }\\n }\\n}\\n\\n\\n// Dividers (basically an `<hr>`) within the dropdown\\n.dropdown-divider {\\n height: 0;\\n margin: var(--#{$prefix}dropdown-divider-margin-y) 0;\\n overflow: hidden;\\n border-top: 1px solid var(--#{$prefix}dropdown-divider-bg);\\n opacity: 1; // Revisit in v6 to de-dupe styles that conflict with <hr> element\\n}\\n\\n// Links, buttons, and more within the dropdown menu\\n//\\n// `<button>`-specific styles are denoted with `// For <button>s`\\n.dropdown-item {\\n display: block;\\n width: 100%; // For `<button>`s\\n padding: var(--#{$prefix}dropdown-item-padding-y) var(--#{$prefix}dropdown-item-padding-x);\\n clear: both;\\n font-weight: $font-weight-normal;\\n color: var(--#{$prefix}dropdown-link-color);\\n text-align: inherit; // For `<button>`s\\n text-decoration: if($link-decoration == none, null, none);\\n white-space: nowrap; // prevent links from randomly breaking onto new lines\\n background-color: transparent; // For `<button>`s\\n border: 0; // For `<button>`s\\n @include border-radius(var(--#{$prefix}dropdown-item-border-radius, 0));\\n\\n &:hover,\\n &:focus {\\n color: var(--#{$prefix}dropdown-link-hover-color);\\n text-decoration: if($link-hover-decoration == underline, none, null);\\n @include gradient-bg(var(--#{$prefix}dropdown-link-hover-bg));\\n }\\n\\n &.active,\\n &:active {\\n color: var(--#{$prefix}dropdown-link-active-color);\\n text-decoration: none;\\n @include gradient-bg(var(--#{$prefix}dropdown-link-active-bg));\\n }\\n\\n &.disabled,\\n &:disabled {\\n color: var(--#{$prefix}dropdown-link-disabled-color);\\n pointer-events: none;\\n background-color: transparent;\\n // Remove CSS gradients if they\'re enabled\\n background-image: if($enable-gradients, none, null);\\n }\\n}\\n\\n.dropdown-menu.show {\\n display: block;\\n}\\n\\n// Dropdown section headers\\n.dropdown-header {\\n display: block;\\n padding: var(--#{$prefix}dropdown-header-padding-y) var(--#{$prefix}dropdown-header-padding-x);\\n margin-bottom: 0; // for use with heading elements\\n @include font-size($font-size-sm);\\n color: var(--#{$prefix}dropdown-header-color);\\n white-space: nowrap; // as with > li > a\\n}\\n\\n// Dropdown text\\n.dropdown-item-text {\\n display: block;\\n padding: var(--#{$prefix}dropdown-item-padding-y) var(--#{$prefix}dropdown-item-padding-x);\\n color: var(--#{$prefix}dropdown-link-color);\\n}\\n\\n// Dark dropdowns\\n.dropdown-menu-dark {\\n // scss-docs-start dropdown-dark-css-vars\\n --#{$prefix}dropdown-color: #{$dropdown-dark-color};\\n --#{$prefix}dropdown-bg: #{$dropdown-dark-bg};\\n --#{$prefix}dropdown-border-color: #{$dropdown-dark-border-color};\\n --#{$prefix}dropdown-box-shadow: #{$dropdown-dark-box-shadow};\\n --#{$prefix}dropdown-link-color: #{$dropdown-dark-link-color};\\n --#{$prefix}dropdown-link-hover-color: #{$dropdown-dark-link-hover-color};\\n --#{$prefix}dropdown-divider-bg: #{$dropdown-dark-divider-bg};\\n --#{$prefix}dropdown-link-hover-bg: #{$dropdown-dark-link-hover-bg};\\n --#{$prefix}dropdown-link-active-color: #{$dropdown-dark-link-active-color};\\n --#{$prefix}dropdown-link-active-bg: #{$dropdown-dark-link-active-bg};\\n --#{$prefix}dropdown-link-disabled-color: #{$dropdown-dark-link-disabled-color};\\n --#{$prefix}dropdown-header-color: #{$dropdown-dark-header-color};\\n // scss-docs-end dropdown-dark-css-vars\\n}\\n","// scss-docs-start caret-mixins\\n@mixin caret-down($width: $caret-width) {\\n border-top: $width solid;\\n border-right: $width solid transparent;\\n border-bottom: 0;\\n border-left: $width solid transparent;\\n}\\n\\n@mixin caret-up($width: $caret-width) {\\n border-top: 0;\\n border-right: $width solid transparent;\\n border-bottom: $width solid;\\n border-left: $width solid transparent;\\n}\\n\\n@mixin caret-end($width: $caret-width) {\\n border-top: $width solid transparent;\\n border-right: 0;\\n border-bottom: $width solid transparent;\\n border-left: $width solid;\\n}\\n\\n@mixin caret-start($width: $caret-width) {\\n border-top: $width solid transparent;\\n border-right: $width solid;\\n border-bottom: $width solid transparent;\\n}\\n\\n@mixin caret(\\n $direction: down,\\n $width: $caret-width,\\n $spacing: $caret-spacing,\\n $vertical-align: $caret-vertical-align\\n) {\\n @if $enable-caret {\\n &::after {\\n display: inline-block;\\n margin-left: $spacing;\\n vertical-align: $vertical-align;\\n content: \\"\\";\\n @if $direction == down {\\n @include caret-down($width);\\n } @else if $direction == up {\\n @include caret-up($width);\\n } @else if $direction == end {\\n @include caret-end($width);\\n }\\n }\\n\\n @if $direction == start {\\n &::after {\\n display: none;\\n }\\n\\n &::before {\\n display: inline-block;\\n margin-right: $spacing;\\n vertical-align: $vertical-align;\\n content: \\"\\";\\n @include caret-start($width);\\n }\\n }\\n\\n &:empty::after {\\n margin-left: 0;\\n }\\n }\\n}\\n// scss-docs-end caret-mixins\\n","// Make the div behave like a button\\n.btn-group,\\n.btn-group-vertical {\\n position: relative;\\n display: inline-flex;\\n vertical-align: middle; // match .btn alignment given font-size hack above\\n\\n > .btn {\\n position: relative;\\n flex: 1 1 auto;\\n }\\n\\n // Bring the hover, focused, and \\"active\\" buttons to the front to overlay\\n // the borders properly\\n > .btn-check:checked + .btn,\\n > .btn-check:focus + .btn,\\n > .btn:hover,\\n > .btn:focus,\\n > .btn:active,\\n > .btn.active {\\n z-index: 1;\\n }\\n}\\n\\n// Optional: Group multiple button groups together for a toolbar\\n.btn-toolbar {\\n display: flex;\\n flex-wrap: wrap;\\n justify-content: flex-start;\\n\\n .input-group {\\n width: auto;\\n }\\n}\\n\\n.btn-group {\\n @include border-radius($btn-border-radius);\\n\\n // Prevent double borders when buttons are next to each other\\n > :not(.btn-check:first-child) + .btn,\\n > .btn-group:not(:first-child) {\\n margin-left: calc(#{$btn-border-width} * -1); // stylelint-disable-line function-disallowed-list\\n }\\n\\n // Reset rounded corners\\n > .btn:not(:last-child):not(.dropdown-toggle),\\n > .btn.dropdown-toggle-split:first-child,\\n > .btn-group:not(:last-child) > .btn {\\n @include border-end-radius(0);\\n }\\n\\n // The left radius should be 0 if the button is:\\n // - the \\"third or more\\" child\\n // - the second child and the previous element isn\'t `.btn-check` (making it the first child visually)\\n // - part of a btn-group which isn\'t the first child\\n > .btn:nth-child(n + 3),\\n > :not(.btn-check) + .btn,\\n > .btn-group:not(:first-child) > .btn {\\n @include border-start-radius(0);\\n }\\n}\\n\\n// Sizing\\n//\\n// Remix the default button sizing classes into new ones for easier manipulation.\\n\\n.btn-group-sm > .btn { @extend .btn-sm; }\\n.btn-group-lg > .btn { @extend .btn-lg; }\\n\\n\\n//\\n// Split button dropdowns\\n//\\n\\n.dropdown-toggle-split {\\n padding-right: $btn-padding-x * .75;\\n padding-left: $btn-padding-x * .75;\\n\\n &::after,\\n .dropup &::after,\\n .dropend &::after {\\n margin-left: 0;\\n }\\n\\n .dropstart &::before {\\n margin-right: 0;\\n }\\n}\\n\\n.btn-sm + .dropdown-toggle-split {\\n padding-right: $btn-padding-x-sm * .75;\\n padding-left: $btn-padding-x-sm * .75;\\n}\\n\\n.btn-lg + .dropdown-toggle-split {\\n padding-right: $btn-padding-x-lg * .75;\\n padding-left: $btn-padding-x-lg * .75;\\n}\\n\\n\\n// The clickable button for toggling the menu\\n// Set the same inset shadow as the :active state\\n.btn-group.show .dropdown-toggle {\\n @include box-shadow($btn-active-box-shadow);\\n\\n // Show no shadow for `.btn-link` since it has no other button styles.\\n &.btn-link {\\n @include box-shadow(none);\\n }\\n}\\n\\n\\n//\\n// Vertical button groups\\n//\\n\\n.btn-group-vertical {\\n flex-direction: column;\\n align-items: flex-start;\\n justify-content: center;\\n\\n > .btn,\\n > .btn-group {\\n width: 100%;\\n }\\n\\n > .btn:not(:first-child),\\n > .btn-group:not(:first-child) {\\n margin-top: calc(#{$btn-border-width} * -1); // stylelint-disable-line function-disallowed-list\\n }\\n\\n // Reset rounded corners\\n > .btn:not(:last-child):not(.dropdown-toggle),\\n > .btn-group:not(:last-child) > .btn {\\n @include border-bottom-radius(0);\\n }\\n\\n > .btn ~ .btn,\\n > .btn-group:not(:first-child) > .btn {\\n @include border-top-radius(0);\\n }\\n}\\n","// Base class\\n//\\n// Kickstart any navigation component with a set of style resets. Works with\\n// `<nav>`s, `<ul>`s or `<ol>`s.\\n\\n.nav {\\n // scss-docs-start nav-css-vars\\n --#{$prefix}nav-link-padding-x: #{$nav-link-padding-x};\\n --#{$prefix}nav-link-padding-y: #{$nav-link-padding-y};\\n @include rfs($nav-link-font-size, --#{$prefix}nav-link-font-size);\\n --#{$prefix}nav-link-font-weight: #{$nav-link-font-weight};\\n --#{$prefix}nav-link-color: #{$nav-link-color};\\n --#{$prefix}nav-link-hover-color: #{$nav-link-hover-color};\\n --#{$prefix}nav-link-disabled-color: #{$nav-link-disabled-color};\\n // scss-docs-end nav-css-vars\\n\\n display: flex;\\n flex-wrap: wrap;\\n padding-left: 0;\\n margin-bottom: 0;\\n list-style: none;\\n}\\n\\n.nav-link {\\n display: block;\\n padding: var(--#{$prefix}nav-link-padding-y) var(--#{$prefix}nav-link-padding-x);\\n @include font-size(var(--#{$prefix}nav-link-font-size));\\n font-weight: var(--#{$prefix}nav-link-font-weight);\\n color: var(--#{$prefix}nav-link-color);\\n text-decoration: if($link-decoration == none, null, none);\\n background: none;\\n border: 0;\\n @include transition($nav-link-transition);\\n\\n &:hover,\\n &:focus {\\n color: var(--#{$prefix}nav-link-hover-color);\\n text-decoration: if($link-hover-decoration == underline, none, null);\\n }\\n\\n &:focus-visible {\\n outline: 0;\\n box-shadow: $nav-link-focus-box-shadow;\\n }\\n\\n // Disabled state lightens text\\n &.disabled,\\n &:disabled {\\n color: var(--#{$prefix}nav-link-disabled-color);\\n pointer-events: none;\\n cursor: default;\\n }\\n}\\n\\n//\\n// Tabs\\n//\\n\\n.nav-tabs {\\n // scss-docs-start nav-tabs-css-vars\\n --#{$prefix}nav-tabs-border-width: #{$nav-tabs-border-width};\\n --#{$prefix}nav-tabs-border-color: #{$nav-tabs-border-color};\\n --#{$prefix}nav-tabs-border-radius: #{$nav-tabs-border-radius};\\n --#{$prefix}nav-tabs-link-hover-border-color: #{$nav-tabs-link-hover-border-color};\\n --#{$prefix}nav-tabs-link-active-color: #{$nav-tabs-link-active-color};\\n --#{$prefix}nav-tabs-link-active-bg: #{$nav-tabs-link-active-bg};\\n --#{$prefix}nav-tabs-link-active-border-color: #{$nav-tabs-link-active-border-color};\\n // scss-docs-end nav-tabs-css-vars\\n\\n border-bottom: var(--#{$prefix}nav-tabs-border-width) solid var(--#{$prefix}nav-tabs-border-color);\\n\\n .nav-link {\\n margin-bottom: calc(-1 * var(--#{$prefix}nav-tabs-border-width)); // stylelint-disable-line function-disallowed-list\\n border: var(--#{$prefix}nav-tabs-border-width) solid transparent;\\n @include border-top-radius(var(--#{$prefix}nav-tabs-border-radius));\\n\\n &:hover,\\n &:focus {\\n // Prevents active .nav-link tab overlapping focus outline of previous/next .nav-link\\n isolation: isolate;\\n border-color: var(--#{$prefix}nav-tabs-link-hover-border-color);\\n }\\n }\\n\\n .nav-link.active,\\n .nav-item.show .nav-link {\\n color: var(--#{$prefix}nav-tabs-link-active-color);\\n background-color: var(--#{$prefix}nav-tabs-link-active-bg);\\n border-color: var(--#{$prefix}nav-tabs-link-active-border-color);\\n }\\n\\n .dropdown-menu {\\n // Make dropdown border overlap tab border\\n margin-top: calc(-1 * var(--#{$prefix}nav-tabs-border-width)); // stylelint-disable-line function-disallowed-list\\n // Remove the top rounded corners here since there is a hard edge above the menu\\n @include border-top-radius(0);\\n }\\n}\\n\\n\\n//\\n// Pills\\n//\\n\\n.nav-pills {\\n // scss-docs-start nav-pills-css-vars\\n --#{$prefix}nav-pills-border-radius: #{$nav-pills-border-radius};\\n --#{$prefix}nav-pills-link-active-color: #{$nav-pills-link-active-color};\\n --#{$prefix}nav-pills-link-active-bg: #{$nav-pills-link-active-bg};\\n // scss-docs-end nav-pills-css-vars\\n\\n .nav-link {\\n @include border-radius(var(--#{$prefix}nav-pills-border-radius));\\n }\\n\\n .nav-link.active,\\n .show > .nav-link {\\n color: var(--#{$prefix}nav-pills-link-active-color);\\n @include gradient-bg(var(--#{$prefix}nav-pills-link-active-bg));\\n }\\n}\\n\\n\\n//\\n// Underline\\n//\\n\\n.nav-underline {\\n // scss-docs-start nav-underline-css-vars\\n --#{$prefix}nav-underline-gap: #{$nav-underline-gap};\\n --#{$prefix}nav-underline-border-width: #{$nav-underline-border-width};\\n --#{$prefix}nav-underline-link-active-color: #{$nav-underline-link-active-color};\\n // scss-docs-end nav-underline-css-vars\\n\\n gap: var(--#{$prefix}nav-underline-gap);\\n\\n .nav-link {\\n padding-right: 0;\\n padding-left: 0;\\n border-bottom: var(--#{$prefix}nav-underline-border-width) solid transparent;\\n\\n &:hover,\\n &:focus {\\n border-bottom-color: currentcolor;\\n }\\n }\\n\\n .nav-link.active,\\n .show > .nav-link {\\n font-weight: $font-weight-bold;\\n color: var(--#{$prefix}nav-underline-link-active-color);\\n border-bottom-color: currentcolor;\\n }\\n}\\n\\n\\n//\\n// Justified variants\\n//\\n\\n.nav-fill {\\n > .nav-link,\\n .nav-item {\\n flex: 1 1 auto;\\n text-align: center;\\n }\\n}\\n\\n.nav-justified {\\n > .nav-link,\\n .nav-item {\\n flex-basis: 0;\\n flex-grow: 1;\\n text-align: center;\\n }\\n}\\n\\n.nav-fill,\\n.nav-justified {\\n .nav-item .nav-link {\\n width: 100%; // Make sure button will grow\\n }\\n}\\n\\n\\n// Tabbable tabs\\n//\\n// Hide tabbable panes to start, show them when `.active`\\n\\n.tab-content {\\n > .tab-pane {\\n display: none;\\n }\\n > .active {\\n display: block;\\n }\\n}\\n","// Navbar\\n//\\n// Provide a static navbar from which we expand to create full-width, fixed, and\\n// other navbar variations.\\n\\n.navbar {\\n // scss-docs-start navbar-css-vars\\n --#{$prefix}navbar-padding-x: #{if($navbar-padding-x == null, 0, $navbar-padding-x)};\\n --#{$prefix}navbar-padding-y: #{$navbar-padding-y};\\n --#{$prefix}navbar-color: #{$navbar-light-color};\\n --#{$prefix}navbar-hover-color: #{$navbar-light-hover-color};\\n --#{$prefix}navbar-disabled-color: #{$navbar-light-disabled-color};\\n --#{$prefix}navbar-active-color: #{$navbar-light-active-color};\\n --#{$prefix}navbar-brand-padding-y: #{$navbar-brand-padding-y};\\n --#{$prefix}navbar-brand-margin-end: #{$navbar-brand-margin-end};\\n --#{$prefix}navbar-brand-font-size: #{$navbar-brand-font-size};\\n --#{$prefix}navbar-brand-color: #{$navbar-light-brand-color};\\n --#{$prefix}navbar-brand-hover-color: #{$navbar-light-brand-hover-color};\\n --#{$prefix}navbar-nav-link-padding-x: #{$navbar-nav-link-padding-x};\\n --#{$prefix}navbar-toggler-padding-y: #{$navbar-toggler-padding-y};\\n --#{$prefix}navbar-toggler-padding-x: #{$navbar-toggler-padding-x};\\n --#{$prefix}navbar-toggler-font-size: #{$navbar-toggler-font-size};\\n --#{$prefix}navbar-toggler-icon-bg: #{escape-svg($navbar-light-toggler-icon-bg)};\\n --#{$prefix}navbar-toggler-border-color: #{$navbar-light-toggler-border-color};\\n --#{$prefix}navbar-toggler-border-radius: #{$navbar-toggler-border-radius};\\n --#{$prefix}navbar-toggler-focus-width: #{$navbar-toggler-focus-width};\\n --#{$prefix}navbar-toggler-transition: #{$navbar-toggler-transition};\\n // scss-docs-end navbar-css-vars\\n\\n position: relative;\\n display: flex;\\n flex-wrap: wrap; // allow us to do the line break for collapsing content\\n align-items: center;\\n justify-content: space-between; // space out brand from logo\\n padding: var(--#{$prefix}navbar-padding-y) var(--#{$prefix}navbar-padding-x);\\n @include gradient-bg();\\n\\n // Because flex properties aren\'t inherited, we need to redeclare these first\\n // few properties so that content nested within behave properly.\\n // The `flex-wrap` property is inherited to simplify the expanded navbars\\n %container-flex-properties {\\n display: flex;\\n flex-wrap: inherit;\\n align-items: center;\\n justify-content: space-between;\\n }\\n\\n > .container,\\n > .container-fluid {\\n @extend %container-flex-properties;\\n }\\n\\n @each $breakpoint, $container-max-width in $container-max-widths {\\n > .container#{breakpoint-infix($breakpoint, $container-max-widths)} {\\n @extend %container-flex-properties;\\n }\\n }\\n}\\n\\n\\n// Navbar brand\\n//\\n// Used for brand, project, or site names.\\n\\n.navbar-brand {\\n padding-top: var(--#{$prefix}navbar-brand-padding-y);\\n padding-bottom: var(--#{$prefix}navbar-brand-padding-y);\\n margin-right: var(--#{$prefix}navbar-brand-margin-end);\\n @include font-size(var(--#{$prefix}navbar-brand-font-size));\\n color: var(--#{$prefix}navbar-brand-color);\\n text-decoration: if($link-decoration == none, null, none);\\n white-space: nowrap;\\n\\n &:hover,\\n &:focus {\\n color: var(--#{$prefix}navbar-brand-hover-color);\\n text-decoration: if($link-hover-decoration == underline, none, null);\\n }\\n}\\n\\n\\n// Navbar nav\\n//\\n// Custom navbar navigation (doesn\'t require `.nav`, but does make use of `.nav-link`).\\n\\n.navbar-nav {\\n // scss-docs-start navbar-nav-css-vars\\n --#{$prefix}nav-link-padding-x: 0;\\n --#{$prefix}nav-link-padding-y: #{$nav-link-padding-y};\\n @include rfs($nav-link-font-size, --#{$prefix}nav-link-font-size);\\n --#{$prefix}nav-link-font-weight: #{$nav-link-font-weight};\\n --#{$prefix}nav-link-color: var(--#{$prefix}navbar-color);\\n --#{$prefix}nav-link-hover-color: var(--#{$prefix}navbar-hover-color);\\n --#{$prefix}nav-link-disabled-color: var(--#{$prefix}navbar-disabled-color);\\n // scss-docs-end navbar-nav-css-vars\\n\\n display: flex;\\n flex-direction: column; // cannot use `inherit` to get the `.navbar`s value\\n padding-left: 0;\\n margin-bottom: 0;\\n list-style: none;\\n\\n .nav-link {\\n &.active,\\n &.show {\\n color: var(--#{$prefix}navbar-active-color);\\n }\\n }\\n\\n .dropdown-menu {\\n position: static;\\n }\\n}\\n\\n\\n// Navbar text\\n//\\n//\\n\\n.navbar-text {\\n padding-top: $nav-link-padding-y;\\n padding-bottom: $nav-link-padding-y;\\n color: var(--#{$prefix}navbar-color);\\n\\n a,\\n a:hover,\\n a:focus {\\n color: var(--#{$prefix}navbar-active-color);\\n }\\n}\\n\\n\\n// Responsive navbar\\n//\\n// Custom styles for responsive collapsing and toggling of navbar contents.\\n// Powered by the collapse Bootstrap JavaScript plugin.\\n\\n// When collapsed, prevent the toggleable navbar contents from appearing in\\n// the default flexbox row orientation. Requires the use of `flex-wrap: wrap`\\n// on the `.navbar` parent.\\n.navbar-collapse {\\n flex-basis: 100%;\\n flex-grow: 1;\\n // For always expanded or extra full navbars, ensure content aligns itself\\n // properly vertically. Can be easily overridden with flex utilities.\\n align-items: center;\\n}\\n\\n// Button for toggling the navbar when in its collapsed state\\n.navbar-toggler {\\n padding: var(--#{$prefix}navbar-toggler-padding-y) var(--#{$prefix}navbar-toggler-padding-x);\\n @include font-size(var(--#{$prefix}navbar-toggler-font-size));\\n line-height: 1;\\n color: var(--#{$prefix}navbar-color);\\n background-color: transparent; // remove default button style\\n border: var(--#{$prefix}border-width) solid var(--#{$prefix}navbar-toggler-border-color); // remove default button style\\n @include border-radius(var(--#{$prefix}navbar-toggler-border-radius));\\n @include transition(var(--#{$prefix}navbar-toggler-transition));\\n\\n &:hover {\\n text-decoration: none;\\n }\\n\\n &:focus {\\n text-decoration: none;\\n outline: 0;\\n box-shadow: 0 0 0 var(--#{$prefix}navbar-toggler-focus-width);\\n }\\n}\\n\\n// Keep as a separate element so folks can easily override it with another icon\\n// or image file as needed.\\n.navbar-toggler-icon {\\n display: inline-block;\\n width: 1.5em;\\n height: 1.5em;\\n vertical-align: middle;\\n background-image: var(--#{$prefix}navbar-toggler-icon-bg);\\n background-repeat: no-repeat;\\n background-position: center;\\n background-size: 100%;\\n}\\n\\n.navbar-nav-scroll {\\n max-height: var(--#{$prefix}scroll-height, 75vh);\\n overflow-y: auto;\\n}\\n\\n// scss-docs-start navbar-expand-loop\\n// Generate series of `.navbar-expand-*` responsive classes for configuring\\n// where your navbar collapses.\\n.navbar-expand {\\n @each $breakpoint in map-keys($grid-breakpoints) {\\n $next: breakpoint-next($breakpoint, $grid-breakpoints);\\n $infix: breakpoint-infix($next, $grid-breakpoints);\\n\\n // stylelint-disable-next-line scss/selector-no-union-class-name\\n &#{$infix} {\\n @include media-breakpoint-up($next) {\\n flex-wrap: nowrap;\\n justify-content: flex-start;\\n\\n .navbar-nav {\\n flex-direction: row;\\n\\n .dropdown-menu {\\n position: absolute;\\n }\\n\\n .nav-link {\\n padding-right: var(--#{$prefix}navbar-nav-link-padding-x);\\n padding-left: var(--#{$prefix}navbar-nav-link-padding-x);\\n }\\n }\\n\\n .navbar-nav-scroll {\\n overflow: visible;\\n }\\n\\n .navbar-collapse {\\n display: flex !important; // stylelint-disable-line declaration-no-important\\n flex-basis: auto;\\n }\\n\\n .navbar-toggler {\\n display: none;\\n }\\n\\n .offcanvas {\\n // stylelint-disable declaration-no-important\\n position: static;\\n z-index: auto;\\n flex-grow: 1;\\n width: auto !important;\\n height: auto !important;\\n visibility: visible !important;\\n background-color: transparent !important;\\n border: 0 !important;\\n transform: none !important;\\n @include box-shadow(none);\\n @include transition(none);\\n // stylelint-enable declaration-no-important\\n\\n .offcanvas-header {\\n display: none;\\n }\\n\\n .offcanvas-body {\\n display: flex;\\n flex-grow: 0;\\n padding: 0;\\n overflow-y: visible;\\n }\\n }\\n }\\n }\\n }\\n}\\n// scss-docs-end navbar-expand-loop\\n\\n// Navbar themes\\n//\\n// Styles for switching between navbars with light or dark background.\\n\\n.navbar-light {\\n @include deprecate(\\"`.navbar-light`\\", \\"v5.2.0\\", \\"v6.0.0\\", true);\\n}\\n\\n.navbar-dark,\\n.navbar[data-bs-theme=\\"dark\\"] {\\n // scss-docs-start navbar-dark-css-vars\\n --#{$prefix}navbar-color: #{$navbar-dark-color};\\n --#{$prefix}navbar-hover-color: #{$navbar-dark-hover-color};\\n --#{$prefix}navbar-disabled-color: #{$navbar-dark-disabled-color};\\n --#{$prefix}navbar-active-color: #{$navbar-dark-active-color};\\n --#{$prefix}navbar-brand-color: #{$navbar-dark-brand-color};\\n --#{$prefix}navbar-brand-hover-color: #{$navbar-dark-brand-hover-color};\\n --#{$prefix}navbar-toggler-border-color: #{$navbar-dark-toggler-border-color};\\n --#{$prefix}navbar-toggler-icon-bg: #{escape-svg($navbar-dark-toggler-icon-bg)};\\n // scss-docs-end navbar-dark-css-vars\\n}\\n\\n@if $enable-dark-mode {\\n @include color-mode(dark) {\\n .navbar-toggler-icon {\\n --#{$prefix}navbar-toggler-icon-bg: #{escape-svg($navbar-dark-toggler-icon-bg)};\\n }\\n }\\n}\\n","//\\n// Base styles\\n//\\n\\n.card {\\n // scss-docs-start card-css-vars\\n --#{$prefix}card-spacer-y: #{$card-spacer-y};\\n --#{$prefix}card-spacer-x: #{$card-spacer-x};\\n --#{$prefix}card-title-spacer-y: #{$card-title-spacer-y};\\n --#{$prefix}card-title-color: #{$card-title-color};\\n --#{$prefix}card-subtitle-color: #{$card-subtitle-color};\\n --#{$prefix}card-border-width: #{$card-border-width};\\n --#{$prefix}card-border-color: #{$card-border-color};\\n --#{$prefix}card-border-radius: #{$card-border-radius};\\n --#{$prefix}card-box-shadow: #{$card-box-shadow};\\n --#{$prefix}card-inner-border-radius: #{$card-inner-border-radius};\\n --#{$prefix}card-cap-padding-y: #{$card-cap-padding-y};\\n --#{$prefix}card-cap-padding-x: #{$card-cap-padding-x};\\n --#{$prefix}card-cap-bg: #{$card-cap-bg};\\n --#{$prefix}card-cap-color: #{$card-cap-color};\\n --#{$prefix}card-height: #{$card-height};\\n --#{$prefix}card-color: #{$card-color};\\n --#{$prefix}card-bg: #{$card-bg};\\n --#{$prefix}card-img-overlay-padding: #{$card-img-overlay-padding};\\n --#{$prefix}card-group-margin: #{$card-group-margin};\\n // scss-docs-end card-css-vars\\n\\n position: relative;\\n display: flex;\\n flex-direction: column;\\n min-width: 0; // See https://github.com/twbs/bootstrap/pull/22740#issuecomment-305868106\\n height: var(--#{$prefix}card-height);\\n color: var(--#{$prefix}body-color);\\n word-wrap: break-word;\\n background-color: var(--#{$prefix}card-bg);\\n background-clip: border-box;\\n border: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color);\\n @include border-radius(var(--#{$prefix}card-border-radius));\\n @include box-shadow(var(--#{$prefix}card-box-shadow));\\n\\n > hr {\\n margin-right: 0;\\n margin-left: 0;\\n }\\n\\n > .list-group {\\n border-top: inherit;\\n border-bottom: inherit;\\n\\n &:first-child {\\n border-top-width: 0;\\n @include border-top-radius(var(--#{$prefix}card-inner-border-radius));\\n }\\n\\n &:last-child {\\n border-bottom-width: 0;\\n @include border-bottom-radius(var(--#{$prefix}card-inner-border-radius));\\n }\\n }\\n\\n // Due to specificity of the above selector (`.card > .list-group`), we must\\n // use a child selector here to prevent double borders.\\n > .card-header + .list-group,\\n > .list-group + .card-footer {\\n border-top: 0;\\n }\\n}\\n\\n.card-body {\\n // Enable `flex-grow: 1` for decks and groups so that card blocks take up\\n // as much space as possible, ensuring footers are aligned to the bottom.\\n flex: 1 1 auto;\\n padding: var(--#{$prefix}card-spacer-y) var(--#{$prefix}card-spacer-x);\\n color: var(--#{$prefix}card-color);\\n}\\n\\n.card-title {\\n margin-bottom: var(--#{$prefix}card-title-spacer-y);\\n color: var(--#{$prefix}card-title-color);\\n}\\n\\n.card-subtitle {\\n margin-top: calc(-.5 * var(--#{$prefix}card-title-spacer-y)); // stylelint-disable-line function-disallowed-list\\n margin-bottom: 0;\\n color: var(--#{$prefix}card-subtitle-color);\\n}\\n\\n.card-text:last-child {\\n margin-bottom: 0;\\n}\\n\\n.card-link {\\n &:hover {\\n text-decoration: if($link-hover-decoration == underline, none, null);\\n }\\n\\n + .card-link {\\n margin-left: var(--#{$prefix}card-spacer-x);\\n }\\n}\\n\\n//\\n// Optional textual caps\\n//\\n\\n.card-header {\\n padding: var(--#{$prefix}card-cap-padding-y) var(--#{$prefix}card-cap-padding-x);\\n margin-bottom: 0; // Removes the default margin-bottom of <hN>\\n color: var(--#{$prefix}card-cap-color);\\n background-color: var(--#{$prefix}card-cap-bg);\\n border-bottom: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color);\\n\\n &:first-child {\\n @include border-radius(var(--#{$prefix}card-inner-border-radius) var(--#{$prefix}card-inner-border-radius) 0 0);\\n }\\n}\\n\\n.card-footer {\\n padding: var(--#{$prefix}card-cap-padding-y) var(--#{$prefix}card-cap-padding-x);\\n color: var(--#{$prefix}card-cap-color);\\n background-color: var(--#{$prefix}card-cap-bg);\\n border-top: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color);\\n\\n &:last-child {\\n @include border-radius(0 0 var(--#{$prefix}card-inner-border-radius) var(--#{$prefix}card-inner-border-radius));\\n }\\n}\\n\\n\\n//\\n// Header navs\\n//\\n\\n.card-header-tabs {\\n margin-right: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list\\n margin-bottom: calc(-1 * var(--#{$prefix}card-cap-padding-y)); // stylelint-disable-line function-disallowed-list\\n margin-left: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list\\n border-bottom: 0;\\n\\n .nav-link.active {\\n background-color: var(--#{$prefix}card-bg);\\n border-bottom-color: var(--#{$prefix}card-bg);\\n }\\n}\\n\\n.card-header-pills {\\n margin-right: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list\\n margin-left: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list\\n}\\n\\n// Card image\\n.card-img-overlay {\\n position: absolute;\\n top: 0;\\n right: 0;\\n bottom: 0;\\n left: 0;\\n padding: var(--#{$prefix}card-img-overlay-padding);\\n @include border-radius(var(--#{$prefix}card-inner-border-radius));\\n}\\n\\n.card-img,\\n.card-img-top,\\n.card-img-bottom {\\n width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch\\n}\\n\\n.card-img,\\n.card-img-top {\\n @include border-top-radius(var(--#{$prefix}card-inner-border-radius));\\n}\\n\\n.card-img,\\n.card-img-bottom {\\n @include border-bottom-radius(var(--#{$prefix}card-inner-border-radius));\\n}\\n\\n\\n//\\n// Card groups\\n//\\n\\n.card-group {\\n // The child selector allows nested `.card` within `.card-group`\\n // to display properly.\\n > .card {\\n margin-bottom: var(--#{$prefix}card-group-margin);\\n }\\n\\n @include media-breakpoint-up(sm) {\\n display: flex;\\n flex-flow: row wrap;\\n // The child selector allows nested `.card` within `.card-group`\\n // to display properly.\\n > .card {\\n // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4\\n flex: 1 0 0%;\\n margin-bottom: 0;\\n\\n + .card {\\n margin-left: 0;\\n border-left: 0;\\n }\\n\\n // Handle rounded corners\\n @if $enable-rounded {\\n &:not(:last-child) {\\n @include border-end-radius(0);\\n\\n .card-img-top,\\n .card-header {\\n // stylelint-disable-next-line property-disallowed-list\\n border-top-right-radius: 0;\\n }\\n .card-img-bottom,\\n .card-footer {\\n // stylelint-disable-next-line property-disallowed-list\\n border-bottom-right-radius: 0;\\n }\\n }\\n\\n &:not(:first-child) {\\n @include border-start-radius(0);\\n\\n .card-img-top,\\n .card-header {\\n // stylelint-disable-next-line property-disallowed-list\\n border-top-left-radius: 0;\\n }\\n .card-img-bottom,\\n .card-footer {\\n // stylelint-disable-next-line property-disallowed-list\\n border-bottom-left-radius: 0;\\n }\\n }\\n }\\n }\\n }\\n}\\n","//\\n// Base styles\\n//\\n\\n.accordion {\\n // scss-docs-start accordion-css-vars\\n --#{$prefix}accordion-color: #{$accordion-color};\\n --#{$prefix}accordion-bg: #{$accordion-bg};\\n --#{$prefix}accordion-transition: #{$accordion-transition};\\n --#{$prefix}accordion-border-color: #{$accordion-border-color};\\n --#{$prefix}accordion-border-width: #{$accordion-border-width};\\n --#{$prefix}accordion-border-radius: #{$accordion-border-radius};\\n --#{$prefix}accordion-inner-border-radius: #{$accordion-inner-border-radius};\\n --#{$prefix}accordion-btn-padding-x: #{$accordion-button-padding-x};\\n --#{$prefix}accordion-btn-padding-y: #{$accordion-button-padding-y};\\n --#{$prefix}accordion-btn-color: #{$accordion-button-color};\\n --#{$prefix}accordion-btn-bg: #{$accordion-button-bg};\\n --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon)};\\n --#{$prefix}accordion-btn-icon-width: #{$accordion-icon-width};\\n --#{$prefix}accordion-btn-icon-transform: #{$accordion-icon-transform};\\n --#{$prefix}accordion-btn-icon-transition: #{$accordion-icon-transition};\\n --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon)};\\n --#{$prefix}accordion-btn-focus-border-color: #{$accordion-button-focus-border-color};\\n --#{$prefix}accordion-btn-focus-box-shadow: #{$accordion-button-focus-box-shadow};\\n --#{$prefix}accordion-body-padding-x: #{$accordion-body-padding-x};\\n --#{$prefix}accordion-body-padding-y: #{$accordion-body-padding-y};\\n --#{$prefix}accordion-active-color: #{$accordion-button-active-color};\\n --#{$prefix}accordion-active-bg: #{$accordion-button-active-bg};\\n // scss-docs-end accordion-css-vars\\n}\\n\\n.accordion-button {\\n position: relative;\\n display: flex;\\n align-items: center;\\n width: 100%;\\n padding: var(--#{$prefix}accordion-btn-padding-y) var(--#{$prefix}accordion-btn-padding-x);\\n @include font-size($font-size-base);\\n color: var(--#{$prefix}accordion-btn-color);\\n text-align: left; // Reset button style\\n background-color: var(--#{$prefix}accordion-btn-bg);\\n border: 0;\\n @include border-radius(0);\\n overflow-anchor: none;\\n @include transition(var(--#{$prefix}accordion-transition));\\n\\n &:not(.collapsed) {\\n color: var(--#{$prefix}accordion-active-color);\\n background-color: var(--#{$prefix}accordion-active-bg);\\n box-shadow: inset 0 calc(-1 * var(--#{$prefix}accordion-border-width)) 0 var(--#{$prefix}accordion-border-color); // stylelint-disable-line function-disallowed-list\\n\\n &::after {\\n background-image: var(--#{$prefix}accordion-btn-active-icon);\\n transform: var(--#{$prefix}accordion-btn-icon-transform);\\n }\\n }\\n\\n // Accordion icon\\n &::after {\\n flex-shrink: 0;\\n width: var(--#{$prefix}accordion-btn-icon-width);\\n height: var(--#{$prefix}accordion-btn-icon-width);\\n margin-left: auto;\\n content: \\"\\";\\n background-image: var(--#{$prefix}accordion-btn-icon);\\n background-repeat: no-repeat;\\n background-size: var(--#{$prefix}accordion-btn-icon-width);\\n @include transition(var(--#{$prefix}accordion-btn-icon-transition));\\n }\\n\\n &:hover {\\n z-index: 2;\\n }\\n\\n &:focus {\\n z-index: 3;\\n border-color: var(--#{$prefix}accordion-btn-focus-border-color);\\n outline: 0;\\n box-shadow: var(--#{$prefix}accordion-btn-focus-box-shadow);\\n }\\n}\\n\\n.accordion-header {\\n margin-bottom: 0;\\n}\\n\\n.accordion-item {\\n color: var(--#{$prefix}accordion-color);\\n background-color: var(--#{$prefix}accordion-bg);\\n border: var(--#{$prefix}accordion-border-width) solid var(--#{$prefix}accordion-border-color);\\n\\n &:first-of-type {\\n @include border-top-radius(var(--#{$prefix}accordion-border-radius));\\n\\n .accordion-button {\\n @include border-top-radius(var(--#{$prefix}accordion-inner-border-radius));\\n }\\n }\\n\\n &:not(:first-of-type) {\\n border-top: 0;\\n }\\n\\n // Only set a border-radius on the last item if the accordion is collapsed\\n &:last-of-type {\\n @include border-bottom-radius(var(--#{$prefix}accordion-border-radius));\\n\\n .accordion-button {\\n &.collapsed {\\n @include border-bottom-radius(var(--#{$prefix}accordion-inner-border-radius));\\n }\\n }\\n\\n .accordion-collapse {\\n @include border-bottom-radius(var(--#{$prefix}accordion-border-radius));\\n }\\n }\\n}\\n\\n.accordion-body {\\n padding: var(--#{$prefix}accordion-body-padding-y) var(--#{$prefix}accordion-body-padding-x);\\n}\\n\\n\\n// Flush accordion items\\n//\\n// Remove borders and border-radius to keep accordion items edge-to-edge.\\n\\n.accordion-flush {\\n .accordion-collapse {\\n border-width: 0;\\n }\\n\\n .accordion-item {\\n border-right: 0;\\n border-left: 0;\\n @include border-radius(0);\\n\\n &:first-child { border-top: 0; }\\n &:last-child { border-bottom: 0; }\\n\\n .accordion-button {\\n &,\\n &.collapsed {\\n @include border-radius(0);\\n }\\n }\\n }\\n}\\n\\n@if $enable-dark-mode {\\n @include color-mode(dark) {\\n .accordion-button::after {\\n --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon-dark)};\\n --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon-dark)};\\n }\\n }\\n}\\n",".breadcrumb {\\n // scss-docs-start breadcrumb-css-vars\\n --#{$prefix}breadcrumb-padding-x: #{$breadcrumb-padding-x};\\n --#{$prefix}breadcrumb-padding-y: #{$breadcrumb-padding-y};\\n --#{$prefix}breadcrumb-margin-bottom: #{$breadcrumb-margin-bottom};\\n @include rfs($breadcrumb-font-size, --#{$prefix}breadcrumb-font-size);\\n --#{$prefix}breadcrumb-bg: #{$breadcrumb-bg};\\n --#{$prefix}breadcrumb-border-radius: #{$breadcrumb-border-radius};\\n --#{$prefix}breadcrumb-divider-color: #{$breadcrumb-divider-color};\\n --#{$prefix}breadcrumb-item-padding-x: #{$breadcrumb-item-padding-x};\\n --#{$prefix}breadcrumb-item-active-color: #{$breadcrumb-active-color};\\n // scss-docs-end breadcrumb-css-vars\\n\\n display: flex;\\n flex-wrap: wrap;\\n padding: var(--#{$prefix}breadcrumb-padding-y) var(--#{$prefix}breadcrumb-padding-x);\\n margin-bottom: var(--#{$prefix}breadcrumb-margin-bottom);\\n @include font-size(var(--#{$prefix}breadcrumb-font-size));\\n list-style: none;\\n background-color: var(--#{$prefix}breadcrumb-bg);\\n @include border-radius(var(--#{$prefix}breadcrumb-border-radius));\\n}\\n\\n.breadcrumb-item {\\n // The separator between breadcrumbs (by default, a forward-slash: \\"/\\")\\n + .breadcrumb-item {\\n padding-left: var(--#{$prefix}breadcrumb-item-padding-x);\\n\\n &::before {\\n float: left; // Suppress inline spacings and underlining of the separator\\n padding-right: var(--#{$prefix}breadcrumb-item-padding-x);\\n color: var(--#{$prefix}breadcrumb-divider-color);\\n content: var(--#{$prefix}breadcrumb-divider, escape-svg($breadcrumb-divider)) #{\\"/* rtl:\\"} var(--#{$prefix}breadcrumb-divider, escape-svg($breadcrumb-divider-flipped)) #{\\"*/\\"};\\n }\\n }\\n\\n &.active {\\n color: var(--#{$prefix}breadcrumb-item-active-color);\\n }\\n}\\n",".pagination {\\n // scss-docs-start pagination-css-vars\\n --#{$prefix}pagination-padding-x: #{$pagination-padding-x};\\n --#{$prefix}pagination-padding-y: #{$pagination-padding-y};\\n @include rfs($pagination-font-size, --#{$prefix}pagination-font-size);\\n --#{$prefix}pagination-color: #{$pagination-color};\\n --#{$prefix}pagination-bg: #{$pagination-bg};\\n --#{$prefix}pagination-border-width: #{$pagination-border-width};\\n --#{$prefix}pagination-border-color: #{$pagination-border-color};\\n --#{$prefix}pagination-border-radius: #{$pagination-border-radius};\\n --#{$prefix}pagination-hover-color: #{$pagination-hover-color};\\n --#{$prefix}pagination-hover-bg: #{$pagination-hover-bg};\\n --#{$prefix}pagination-hover-border-color: #{$pagination-hover-border-color};\\n --#{$prefix}pagination-focus-color: #{$pagination-focus-color};\\n --#{$prefix}pagination-focus-bg: #{$pagination-focus-bg};\\n --#{$prefix}pagination-focus-box-shadow: #{$pagination-focus-box-shadow};\\n --#{$prefix}pagination-active-color: #{$pagination-active-color};\\n --#{$prefix}pagination-active-bg: #{$pagination-active-bg};\\n --#{$prefix}pagination-active-border-color: #{$pagination-active-border-color};\\n --#{$prefix}pagination-disabled-color: #{$pagination-disabled-color};\\n --#{$prefix}pagination-disabled-bg: #{$pagination-disabled-bg};\\n --#{$prefix}pagination-disabled-border-color: #{$pagination-disabled-border-color};\\n // scss-docs-end pagination-css-vars\\n\\n display: flex;\\n @include list-unstyled();\\n}\\n\\n.page-link {\\n position: relative;\\n display: block;\\n padding: var(--#{$prefix}pagination-padding-y) var(--#{$prefix}pagination-padding-x);\\n @include font-size(var(--#{$prefix}pagination-font-size));\\n color: var(--#{$prefix}pagination-color);\\n text-decoration: if($link-decoration == none, null, none);\\n background-color: var(--#{$prefix}pagination-bg);\\n border: var(--#{$prefix}pagination-border-width) solid var(--#{$prefix}pagination-border-color);\\n @include transition($pagination-transition);\\n\\n &:hover {\\n z-index: 2;\\n color: var(--#{$prefix}pagination-hover-color);\\n text-decoration: if($link-hover-decoration == underline, none, null);\\n background-color: var(--#{$prefix}pagination-hover-bg);\\n border-color: var(--#{$prefix}pagination-hover-border-color);\\n }\\n\\n &:focus {\\n z-index: 3;\\n color: var(--#{$prefix}pagination-focus-color);\\n background-color: var(--#{$prefix}pagination-focus-bg);\\n outline: $pagination-focus-outline;\\n box-shadow: var(--#{$prefix}pagination-focus-box-shadow);\\n }\\n\\n &.active,\\n .active > & {\\n z-index: 3;\\n color: var(--#{$prefix}pagination-active-color);\\n @include gradient-bg(var(--#{$prefix}pagination-active-bg));\\n border-color: var(--#{$prefix}pagination-active-border-color);\\n }\\n\\n &.disabled,\\n .disabled > & {\\n color: var(--#{$prefix}pagination-disabled-color);\\n pointer-events: none;\\n background-color: var(--#{$prefix}pagination-disabled-bg);\\n border-color: var(--#{$prefix}pagination-disabled-border-color);\\n }\\n}\\n\\n.page-item {\\n &:not(:first-child) .page-link {\\n margin-left: $pagination-margin-start;\\n }\\n\\n @if $pagination-margin-start == calc(#{$pagination-border-width} * -1) {\\n &:first-child {\\n .page-link {\\n @include border-start-radius(var(--#{$prefix}pagination-border-radius));\\n }\\n }\\n\\n &:last-child {\\n .page-link {\\n @include border-end-radius(var(--#{$prefix}pagination-border-radius));\\n }\\n }\\n } @else {\\n // Add border-radius to all pageLinks in case they have left margin\\n .page-link {\\n @include border-radius(var(--#{$prefix}pagination-border-radius));\\n }\\n }\\n}\\n\\n\\n//\\n// Sizing\\n//\\n\\n.pagination-lg {\\n @include pagination-size($pagination-padding-y-lg, $pagination-padding-x-lg, $font-size-lg, $pagination-border-radius-lg);\\n}\\n\\n.pagination-sm {\\n @include pagination-size($pagination-padding-y-sm, $pagination-padding-x-sm, $font-size-sm, $pagination-border-radius-sm);\\n}\\n","// Pagination\\n\\n// scss-docs-start pagination-mixin\\n@mixin pagination-size($padding-y, $padding-x, $font-size, $border-radius) {\\n --#{$prefix}pagination-padding-x: #{$padding-x};\\n --#{$prefix}pagination-padding-y: #{$padding-y};\\n @include rfs($font-size, --#{$prefix}pagination-font-size);\\n --#{$prefix}pagination-border-radius: #{$border-radius};\\n}\\n// scss-docs-end pagination-mixin\\n","// Base class\\n//\\n// Requires one of the contextual, color modifier classes for `color` and\\n// `background-color`.\\n\\n.badge {\\n // scss-docs-start badge-css-vars\\n --#{$prefix}badge-padding-x: #{$badge-padding-x};\\n --#{$prefix}badge-padding-y: #{$badge-padding-y};\\n @include rfs($badge-font-size, --#{$prefix}badge-font-size);\\n --#{$prefix}badge-font-weight: #{$badge-font-weight};\\n --#{$prefix}badge-color: #{$badge-color};\\n --#{$prefix}badge-border-radius: #{$badge-border-radius};\\n // scss-docs-end badge-css-vars\\n\\n display: inline-block;\\n padding: var(--#{$prefix}badge-padding-y) var(--#{$prefix}badge-padding-x);\\n @include font-size(var(--#{$prefix}badge-font-size));\\n font-weight: var(--#{$prefix}badge-font-weight);\\n line-height: 1;\\n color: var(--#{$prefix}badge-color);\\n text-align: center;\\n white-space: nowrap;\\n vertical-align: baseline;\\n @include border-radius(var(--#{$prefix}badge-border-radius));\\n @include gradient-bg();\\n\\n // Empty badges collapse automatically\\n &:empty {\\n display: none;\\n }\\n}\\n\\n// Quick fix for badges in buttons\\n.btn .badge {\\n position: relative;\\n top: -1px;\\n}\\n","//\\n// Base styles\\n//\\n\\n.alert {\\n // scss-docs-start alert-css-vars\\n --#{$prefix}alert-bg: transparent;\\n --#{$prefix}alert-padding-x: #{$alert-padding-x};\\n --#{$prefix}alert-padding-y: #{$alert-padding-y};\\n --#{$prefix}alert-margin-bottom: #{$alert-margin-bottom};\\n --#{$prefix}alert-color: inherit;\\n --#{$prefix}alert-border-color: transparent;\\n --#{$prefix}alert-border: #{$alert-border-width} solid var(--#{$prefix}alert-border-color);\\n --#{$prefix}alert-border-radius: #{$alert-border-radius};\\n --#{$prefix}alert-link-color: inherit;\\n // scss-docs-end alert-css-vars\\n\\n position: relative;\\n padding: var(--#{$prefix}alert-padding-y) var(--#{$prefix}alert-padding-x);\\n margin-bottom: var(--#{$prefix}alert-margin-bottom);\\n color: var(--#{$prefix}alert-color);\\n background-color: var(--#{$prefix}alert-bg);\\n border: var(--#{$prefix}alert-border);\\n @include border-radius(var(--#{$prefix}alert-border-radius));\\n}\\n\\n// Headings for larger alerts\\n.alert-heading {\\n // Specified to prevent conflicts of changing $headings-color\\n color: inherit;\\n}\\n\\n// Provide class for links that match alerts\\n.alert-link {\\n font-weight: $alert-link-font-weight;\\n color: var(--#{$prefix}alert-link-color);\\n}\\n\\n\\n// Dismissible alerts\\n//\\n// Expand the right padding and account for the close button\'s positioning.\\n\\n.alert-dismissible {\\n padding-right: $alert-dismissible-padding-r;\\n\\n // Adjust close link position\\n .btn-close {\\n position: absolute;\\n top: 0;\\n right: 0;\\n z-index: $stretched-link-z-index + 1;\\n padding: $alert-padding-y * 1.25 $alert-padding-x;\\n }\\n}\\n\\n\\n// scss-docs-start alert-modifiers\\n// Generate contextual modifier classes for colorizing the alert\\n@each $state in map-keys($theme-colors) {\\n .alert-#{$state} {\\n --#{$prefix}alert-color: var(--#{$prefix}#{$state}-text-emphasis);\\n --#{$prefix}alert-bg: var(--#{$prefix}#{$state}-bg-subtle);\\n --#{$prefix}alert-border-color: var(--#{$prefix}#{$state}-border-subtle);\\n --#{$prefix}alert-link-color: var(--#{$prefix}#{$state}-text-emphasis);\\n }\\n}\\n// scss-docs-end alert-modifiers\\n","// Disable animation if transitions are disabled\\n\\n// scss-docs-start progress-keyframes\\n@if $enable-transitions {\\n @keyframes progress-bar-stripes {\\n 0% { background-position-x: $progress-height; }\\n }\\n}\\n// scss-docs-end progress-keyframes\\n\\n.progress,\\n.progress-stacked {\\n // scss-docs-start progress-css-vars\\n --#{$prefix}progress-height: #{$progress-height};\\n @include rfs($progress-font-size, --#{$prefix}progress-font-size);\\n --#{$prefix}progress-bg: #{$progress-bg};\\n --#{$prefix}progress-border-radius: #{$progress-border-radius};\\n --#{$prefix}progress-box-shadow: #{$progress-box-shadow};\\n --#{$prefix}progress-bar-color: #{$progress-bar-color};\\n --#{$prefix}progress-bar-bg: #{$progress-bar-bg};\\n --#{$prefix}progress-bar-transition: #{$progress-bar-transition};\\n // scss-docs-end progress-css-vars\\n\\n display: flex;\\n height: var(--#{$prefix}progress-height);\\n overflow: hidden; // force rounded corners by cropping it\\n @include font-size(var(--#{$prefix}progress-font-size));\\n background-color: var(--#{$prefix}progress-bg);\\n @include border-radius(var(--#{$prefix}progress-border-radius));\\n @include box-shadow(var(--#{$prefix}progress-box-shadow));\\n}\\n\\n.progress-bar {\\n display: flex;\\n flex-direction: column;\\n justify-content: center;\\n overflow: hidden;\\n color: var(--#{$prefix}progress-bar-color);\\n text-align: center;\\n white-space: nowrap;\\n background-color: var(--#{$prefix}progress-bar-bg);\\n @include transition(var(--#{$prefix}progress-bar-transition));\\n}\\n\\n.progress-bar-striped {\\n @include gradient-striped();\\n background-size: var(--#{$prefix}progress-height) var(--#{$prefix}progress-height);\\n}\\n\\n.progress-stacked > .progress {\\n overflow: visible;\\n}\\n\\n.progress-stacked > .progress > .progress-bar {\\n width: 100%;\\n}\\n\\n@if $enable-transitions {\\n .progress-bar-animated {\\n animation: $progress-bar-animation-timing progress-bar-stripes;\\n\\n @if $enable-reduced-motion {\\n @media (prefers-reduced-motion: reduce) {\\n animation: none;\\n }\\n }\\n }\\n}\\n","// Base class\\n//\\n// Easily usable on <ul>, <ol>, or <div>.\\n\\n.list-group {\\n // scss-docs-start list-group-css-vars\\n --#{$prefix}list-group-color: #{$list-group-color};\\n --#{$prefix}list-group-bg: #{$list-group-bg};\\n --#{$prefix}list-group-border-color: #{$list-group-border-color};\\n --#{$prefix}list-group-border-width: #{$list-group-border-width};\\n --#{$prefix}list-group-border-radius: #{$list-group-border-radius};\\n --#{$prefix}list-group-item-padding-x: #{$list-group-item-padding-x};\\n --#{$prefix}list-group-item-padding-y: #{$list-group-item-padding-y};\\n --#{$prefix}list-group-action-color: #{$list-group-action-color};\\n --#{$prefix}list-group-action-hover-color: #{$list-group-action-hover-color};\\n --#{$prefix}list-group-action-hover-bg: #{$list-group-hover-bg};\\n --#{$prefix}list-group-action-active-color: #{$list-group-action-active-color};\\n --#{$prefix}list-group-action-active-bg: #{$list-group-action-active-bg};\\n --#{$prefix}list-group-disabled-color: #{$list-group-disabled-color};\\n --#{$prefix}list-group-disabled-bg: #{$list-group-disabled-bg};\\n --#{$prefix}list-group-active-color: #{$list-group-active-color};\\n --#{$prefix}list-group-active-bg: #{$list-group-active-bg};\\n --#{$prefix}list-group-active-border-color: #{$list-group-active-border-color};\\n // scss-docs-end list-group-css-vars\\n\\n display: flex;\\n flex-direction: column;\\n\\n // No need to set list-style: none; since .list-group-item is block level\\n padding-left: 0; // reset padding because ul and ol\\n margin-bottom: 0;\\n @include border-radius(var(--#{$prefix}list-group-border-radius));\\n}\\n\\n.list-group-numbered {\\n list-style-type: none;\\n counter-reset: section;\\n\\n > .list-group-item::before {\\n // Increments only this instance of the section counter\\n content: counters(section, \\".\\") \\". \\";\\n counter-increment: section;\\n }\\n}\\n\\n// Interactive list items\\n//\\n// Use anchor or button elements instead of `li`s or `div`s to create interactive\\n// list items. Includes an extra `.active` modifier class for selected items.\\n\\n.list-group-item-action {\\n width: 100%; // For `<button>`s (anchors become 100% by default though)\\n color: var(--#{$prefix}list-group-action-color);\\n text-align: inherit; // For `<button>`s (anchors inherit)\\n\\n // Hover state\\n &:hover,\\n &:focus {\\n z-index: 1; // Place hover/focus items above their siblings for proper border styling\\n color: var(--#{$prefix}list-group-action-hover-color);\\n text-decoration: none;\\n background-color: var(--#{$prefix}list-group-action-hover-bg);\\n }\\n\\n &:active {\\n color: var(--#{$prefix}list-group-action-active-color);\\n background-color: var(--#{$prefix}list-group-action-active-bg);\\n }\\n}\\n\\n// Individual list items\\n//\\n// Use on `li`s or `div`s within the `.list-group` parent.\\n\\n.list-group-item {\\n position: relative;\\n display: block;\\n padding: var(--#{$prefix}list-group-item-padding-y) var(--#{$prefix}list-group-item-padding-x);\\n color: var(--#{$prefix}list-group-color);\\n text-decoration: if($link-decoration == none, null, none);\\n background-color: var(--#{$prefix}list-group-bg);\\n border: var(--#{$prefix}list-group-border-width) solid var(--#{$prefix}list-group-border-color);\\n\\n &:first-child {\\n @include border-top-radius(inherit);\\n }\\n\\n &:last-child {\\n @include border-bottom-radius(inherit);\\n }\\n\\n &.disabled,\\n &:disabled {\\n color: var(--#{$prefix}list-group-disabled-color);\\n pointer-events: none;\\n background-color: var(--#{$prefix}list-group-disabled-bg);\\n }\\n\\n // Include both here for `<a>`s and `<button>`s\\n &.active {\\n z-index: 2; // Place active items above their siblings for proper border styling\\n color: var(--#{$prefix}list-group-active-color);\\n background-color: var(--#{$prefix}list-group-active-bg);\\n border-color: var(--#{$prefix}list-group-active-border-color);\\n }\\n\\n // stylelint-disable-next-line scss/selector-no-redundant-nesting-selector\\n & + .list-group-item {\\n border-top-width: 0;\\n\\n &.active {\\n margin-top: calc(-1 * var(--#{$prefix}list-group-border-width)); // stylelint-disable-line function-disallowed-list\\n border-top-width: var(--#{$prefix}list-group-border-width);\\n }\\n }\\n}\\n\\n// Horizontal\\n//\\n// Change the layout of list group items from vertical (default) to horizontal.\\n\\n@each $breakpoint in map-keys($grid-breakpoints) {\\n @include media-breakpoint-up($breakpoint) {\\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\\n\\n .list-group-horizontal#{$infix} {\\n flex-direction: row;\\n\\n > .list-group-item {\\n &:first-child:not(:last-child) {\\n @include border-bottom-start-radius(var(--#{$prefix}list-group-border-radius));\\n @include border-top-end-radius(0);\\n }\\n\\n &:last-child:not(:first-child) {\\n @include border-top-end-radius(var(--#{$prefix}list-group-border-radius));\\n @include border-bottom-start-radius(0);\\n }\\n\\n &.active {\\n margin-top: 0;\\n }\\n\\n + .list-group-item {\\n border-top-width: var(--#{$prefix}list-group-border-width);\\n border-left-width: 0;\\n\\n &.active {\\n margin-left: calc(-1 * var(--#{$prefix}list-group-border-width)); // stylelint-disable-line function-disallowed-list\\n border-left-width: var(--#{$prefix}list-group-border-width);\\n }\\n }\\n }\\n }\\n }\\n}\\n\\n\\n// Flush list items\\n//\\n// Remove borders and border-radius to keep list group items edge-to-edge. Most\\n// useful within other components (e.g., cards).\\n\\n.list-group-flush {\\n @include border-radius(0);\\n\\n > .list-group-item {\\n border-width: 0 0 var(--#{$prefix}list-group-border-width);\\n\\n &:last-child {\\n border-bottom-width: 0;\\n }\\n }\\n}\\n\\n\\n// scss-docs-start list-group-modifiers\\n// List group contextual variants\\n//\\n// Add modifier classes to change text and background color on individual items.\\n// Organizationally, this must come after the `:hover` states.\\n\\n@each $state in map-keys($theme-colors) {\\n .list-group-item-#{$state} {\\n --#{$prefix}list-group-color: var(--#{$prefix}#{$state}-text-emphasis);\\n --#{$prefix}list-group-bg: var(--#{$prefix}#{$state}-bg-subtle);\\n --#{$prefix}list-group-border-color: var(--#{$prefix}#{$state}-border-subtle);\\n --#{$prefix}list-group-action-hover-color: var(--#{$prefix}emphasis-color);\\n --#{$prefix}list-group-action-hover-bg: var(--#{$prefix}#{$state}-border-subtle);\\n --#{$prefix}list-group-action-active-color: var(--#{$prefix}emphasis-color);\\n --#{$prefix}list-group-action-active-bg: var(--#{$prefix}#{$state}-border-subtle);\\n --#{$prefix}list-group-active-color: var(--#{$prefix}#{$state}-bg-subtle);\\n --#{$prefix}list-group-active-bg: var(--#{$prefix}#{$state}-text-emphasis);\\n --#{$prefix}list-group-active-border-color: var(--#{$prefix}#{$state}-text-emphasis);\\n }\\n}\\n// scss-docs-end list-group-modifiers\\n","// Transparent background and border properties included for button version.\\n// iOS requires the button element instead of an anchor tag.\\n// If you want the anchor version, it requires `href=\\"#\\"`.\\n// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\\n\\n.btn-close {\\n // scss-docs-start close-css-vars\\n --#{$prefix}btn-close-color: #{$btn-close-color};\\n --#{$prefix}btn-close-bg: #{ escape-svg($btn-close-bg) };\\n --#{$prefix}btn-close-opacity: #{$btn-close-opacity};\\n --#{$prefix}btn-close-hover-opacity: #{$btn-close-hover-opacity};\\n --#{$prefix}btn-close-focus-shadow: #{$btn-close-focus-shadow};\\n --#{$prefix}btn-close-focus-opacity: #{$btn-close-focus-opacity};\\n --#{$prefix}btn-close-disabled-opacity: #{$btn-close-disabled-opacity};\\n --#{$prefix}btn-close-white-filter: #{$btn-close-white-filter};\\n // scss-docs-end close-css-vars\\n\\n box-sizing: content-box;\\n width: $btn-close-width;\\n height: $btn-close-height;\\n padding: $btn-close-padding-y $btn-close-padding-x;\\n color: var(--#{$prefix}btn-close-color);\\n background: transparent var(--#{$prefix}btn-close-bg) center / $btn-close-width auto no-repeat; // include transparent for button elements\\n border: 0; // for button elements\\n @include border-radius();\\n opacity: var(--#{$prefix}btn-close-opacity);\\n\\n // Override <a>\'s hover style\\n &:hover {\\n color: var(--#{$prefix}btn-close-color);\\n text-decoration: none;\\n opacity: var(--#{$prefix}btn-close-hover-opacity);\\n }\\n\\n &:focus {\\n outline: 0;\\n box-shadow: var(--#{$prefix}btn-close-focus-shadow);\\n opacity: var(--#{$prefix}btn-close-focus-opacity);\\n }\\n\\n &:disabled,\\n &.disabled {\\n pointer-events: none;\\n user-select: none;\\n opacity: var(--#{$prefix}btn-close-disabled-opacity);\\n }\\n}\\n\\n@mixin btn-close-white() {\\n filter: var(--#{$prefix}btn-close-white-filter);\\n}\\n\\n.btn-close-white {\\n @include btn-close-white();\\n}\\n\\n@if $enable-dark-mode {\\n @include color-mode(dark) {\\n .btn-close {\\n @include btn-close-white();\\n }\\n }\\n}\\n",".toast {\\n // scss-docs-start toast-css-vars\\n --#{$prefix}toast-zindex: #{$zindex-toast};\\n --#{$prefix}toast-padding-x: #{$toast-padding-x};\\n --#{$prefix}toast-padding-y: #{$toast-padding-y};\\n --#{$prefix}toast-spacing: #{$toast-spacing};\\n --#{$prefix}toast-max-width: #{$toast-max-width};\\n @include rfs($toast-font-size, --#{$prefix}toast-font-size);\\n --#{$prefix}toast-color: #{$toast-color};\\n --#{$prefix}toast-bg: #{$toast-background-color};\\n --#{$prefix}toast-border-width: #{$toast-border-width};\\n --#{$prefix}toast-border-color: #{$toast-border-color};\\n --#{$prefix}toast-border-radius: #{$toast-border-radius};\\n --#{$prefix}toast-box-shadow: #{$toast-box-shadow};\\n --#{$prefix}toast-header-color: #{$toast-header-color};\\n --#{$prefix}toast-header-bg: #{$toast-header-background-color};\\n --#{$prefix}toast-header-border-color: #{$toast-header-border-color};\\n // scss-docs-end toast-css-vars\\n\\n width: var(--#{$prefix}toast-max-width);\\n max-width: 100%;\\n @include font-size(var(--#{$prefix}toast-font-size));\\n color: var(--#{$prefix}toast-color);\\n pointer-events: auto;\\n background-color: var(--#{$prefix}toast-bg);\\n background-clip: padding-box;\\n border: var(--#{$prefix}toast-border-width) solid var(--#{$prefix}toast-border-color);\\n box-shadow: var(--#{$prefix}toast-box-shadow);\\n @include border-radius(var(--#{$prefix}toast-border-radius));\\n\\n &.showing {\\n opacity: 0;\\n }\\n\\n &:not(.show) {\\n display: none;\\n }\\n}\\n\\n.toast-container {\\n --#{$prefix}toast-zindex: #{$zindex-toast};\\n\\n position: absolute;\\n z-index: var(--#{$prefix}toast-zindex);\\n width: max-content;\\n max-width: 100%;\\n pointer-events: none;\\n\\n > :not(:last-child) {\\n margin-bottom: var(--#{$prefix}toast-spacing);\\n }\\n}\\n\\n.toast-header {\\n display: flex;\\n align-items: center;\\n padding: var(--#{$prefix}toast-padding-y) var(--#{$prefix}toast-padding-x);\\n color: var(--#{$prefix}toast-header-color);\\n background-color: var(--#{$prefix}toast-header-bg);\\n background-clip: padding-box;\\n border-bottom: var(--#{$prefix}toast-border-width) solid var(--#{$prefix}toast-header-border-color);\\n @include border-top-radius(calc(var(--#{$prefix}toast-border-radius) - var(--#{$prefix}toast-border-width)));\\n\\n .btn-close {\\n margin-right: calc(-.5 * var(--#{$prefix}toast-padding-x)); // stylelint-disable-line function-disallowed-list\\n margin-left: var(--#{$prefix}toast-padding-x);\\n }\\n}\\n\\n.toast-body {\\n padding: var(--#{$prefix}toast-padding-x);\\n word-wrap: break-word;\\n}\\n","// stylelint-disable function-disallowed-list\\n\\n// .modal-open - body class for killing the scroll\\n// .modal - container to scroll within\\n// .modal-dialog - positioning shell for the actual modal\\n// .modal-content - actual modal w/ bg and corners and stuff\\n\\n\\n// Container that the modal scrolls within\\n.modal {\\n // scss-docs-start modal-css-vars\\n --#{$prefix}modal-zindex: #{$zindex-modal};\\n --#{$prefix}modal-width: #{$modal-md};\\n --#{$prefix}modal-padding: #{$modal-inner-padding};\\n --#{$prefix}modal-margin: #{$modal-dialog-margin};\\n --#{$prefix}modal-color: #{$modal-content-color};\\n --#{$prefix}modal-bg: #{$modal-content-bg};\\n --#{$prefix}modal-border-color: #{$modal-content-border-color};\\n --#{$prefix}modal-border-width: #{$modal-content-border-width};\\n --#{$prefix}modal-border-radius: #{$modal-content-border-radius};\\n --#{$prefix}modal-box-shadow: #{$modal-content-box-shadow-xs};\\n --#{$prefix}modal-inner-border-radius: #{$modal-content-inner-border-radius};\\n --#{$prefix}modal-header-padding-x: #{$modal-header-padding-x};\\n --#{$prefix}modal-header-padding-y: #{$modal-header-padding-y};\\n --#{$prefix}modal-header-padding: #{$modal-header-padding}; // Todo in v6: Split this padding into x and y\\n --#{$prefix}modal-header-border-color: #{$modal-header-border-color};\\n --#{$prefix}modal-header-border-width: #{$modal-header-border-width};\\n --#{$prefix}modal-title-line-height: #{$modal-title-line-height};\\n --#{$prefix}modal-footer-gap: #{$modal-footer-margin-between};\\n --#{$prefix}modal-footer-bg: #{$modal-footer-bg};\\n --#{$prefix}modal-footer-border-color: #{$modal-footer-border-color};\\n --#{$prefix}modal-footer-border-width: #{$modal-footer-border-width};\\n // scss-docs-end modal-css-vars\\n\\n position: fixed;\\n top: 0;\\n left: 0;\\n z-index: var(--#{$prefix}modal-zindex);\\n display: none;\\n width: 100%;\\n height: 100%;\\n overflow-x: hidden;\\n overflow-y: auto;\\n // Prevent Chrome on Windows from adding a focus outline. For details, see\\n // https://github.com/twbs/bootstrap/pull/10951.\\n outline: 0;\\n // We deliberately don\'t use `-webkit-overflow-scrolling: touch;` due to a\\n // gnarly iOS Safari bug: https://bugs.webkit.org/show_bug.cgi?id=158342\\n // See also https://github.com/twbs/bootstrap/issues/17695\\n}\\n\\n// Shell div to position the modal with bottom padding\\n.modal-dialog {\\n position: relative;\\n width: auto;\\n margin: var(--#{$prefix}modal-margin);\\n // allow clicks to pass through for custom click handling to close modal\\n pointer-events: none;\\n\\n // When fading in the modal, animate it to slide down\\n .modal.fade & {\\n @include transition($modal-transition);\\n transform: $modal-fade-transform;\\n }\\n .modal.show & {\\n transform: $modal-show-transform;\\n }\\n\\n // When trying to close, animate focus to scale\\n .modal.modal-static & {\\n transform: $modal-scale-transform;\\n }\\n}\\n\\n.modal-dialog-scrollable {\\n height: calc(100% - var(--#{$prefix}modal-margin) * 2);\\n\\n .modal-content {\\n max-height: 100%;\\n overflow: hidden;\\n }\\n\\n .modal-body {\\n overflow-y: auto;\\n }\\n}\\n\\n.modal-dialog-centered {\\n display: flex;\\n align-items: center;\\n min-height: calc(100% - var(--#{$prefix}modal-margin) * 2);\\n}\\n\\n// Actual modal\\n.modal-content {\\n position: relative;\\n display: flex;\\n flex-direction: column;\\n width: 100%; // Ensure `.modal-content` extends the full width of the parent `.modal-dialog`\\n // counteract the pointer-events: none; in the .modal-dialog\\n color: var(--#{$prefix}modal-color);\\n pointer-events: auto;\\n background-color: var(--#{$prefix}modal-bg);\\n background-clip: padding-box;\\n border: var(--#{$prefix}modal-border-width) solid var(--#{$prefix}modal-border-color);\\n @include border-radius(var(--#{$prefix}modal-border-radius));\\n @include box-shadow(var(--#{$prefix}modal-box-shadow));\\n // Remove focus outline from opened modal\\n outline: 0;\\n}\\n\\n// Modal background\\n.modal-backdrop {\\n // scss-docs-start modal-backdrop-css-vars\\n --#{$prefix}backdrop-zindex: #{$zindex-modal-backdrop};\\n --#{$prefix}backdrop-bg: #{$modal-backdrop-bg};\\n --#{$prefix}backdrop-opacity: #{$modal-backdrop-opacity};\\n // scss-docs-end modal-backdrop-css-vars\\n\\n @include overlay-backdrop(var(--#{$prefix}backdrop-zindex), var(--#{$prefix}backdrop-bg), var(--#{$prefix}backdrop-opacity));\\n}\\n\\n// Modal header\\n// Top section of the modal w/ title and dismiss\\n.modal-header {\\n display: flex;\\n flex-shrink: 0;\\n align-items: center;\\n justify-content: space-between; // Put modal header elements (title and dismiss) on opposite ends\\n padding: var(--#{$prefix}modal-header-padding);\\n border-bottom: var(--#{$prefix}modal-header-border-width) solid var(--#{$prefix}modal-header-border-color);\\n @include border-top-radius(var(--#{$prefix}modal-inner-border-radius));\\n\\n .btn-close {\\n padding: calc(var(--#{$prefix}modal-header-padding-y) * .5) calc(var(--#{$prefix}modal-header-padding-x) * .5);\\n margin: calc(-.5 * var(--#{$prefix}modal-header-padding-y)) calc(-.5 * var(--#{$prefix}modal-header-padding-x)) calc(-.5 * var(--#{$prefix}modal-header-padding-y)) auto;\\n }\\n}\\n\\n// Title text within header\\n.modal-title {\\n margin-bottom: 0;\\n line-height: var(--#{$prefix}modal-title-line-height);\\n}\\n\\n// Modal body\\n// Where all modal content resides (sibling of .modal-header and .modal-footer)\\n.modal-body {\\n position: relative;\\n // Enable `flex-grow: 1` so that the body take up as much space as possible\\n // when there should be a fixed height on `.modal-dialog`.\\n flex: 1 1 auto;\\n padding: var(--#{$prefix}modal-padding);\\n}\\n\\n// Footer (for actions)\\n.modal-footer {\\n display: flex;\\n flex-shrink: 0;\\n flex-wrap: wrap;\\n align-items: center; // vertically center\\n justify-content: flex-end; // Right align buttons with flex property because text-align doesn\'t work on flex items\\n padding: calc(var(--#{$prefix}modal-padding) - var(--#{$prefix}modal-footer-gap) * .5);\\n background-color: var(--#{$prefix}modal-footer-bg);\\n border-top: var(--#{$prefix}modal-footer-border-width) solid var(--#{$prefix}modal-footer-border-color);\\n @include border-bottom-radius(var(--#{$prefix}modal-inner-border-radius));\\n\\n // Place margin between footer elements\\n // This solution is far from ideal because of the universal selector usage,\\n // but is needed to fix https://github.com/twbs/bootstrap/issues/24800\\n > * {\\n margin: calc(var(--#{$prefix}modal-footer-gap) * .5); // Todo in v6: replace with gap on parent class\\n }\\n}\\n\\n// Scale up the modal\\n@include media-breakpoint-up(sm) {\\n .modal {\\n --#{$prefix}modal-margin: #{$modal-dialog-margin-y-sm-up};\\n --#{$prefix}modal-box-shadow: #{$modal-content-box-shadow-sm-up};\\n }\\n\\n // Automatically set modal\'s width for larger viewports\\n .modal-dialog {\\n max-width: var(--#{$prefix}modal-width);\\n margin-right: auto;\\n margin-left: auto;\\n }\\n\\n .modal-sm {\\n --#{$prefix}modal-width: #{$modal-sm};\\n }\\n}\\n\\n@include media-breakpoint-up(lg) {\\n .modal-lg,\\n .modal-xl {\\n --#{$prefix}modal-width: #{$modal-lg};\\n }\\n}\\n\\n@include media-breakpoint-up(xl) {\\n .modal-xl {\\n --#{$prefix}modal-width: #{$modal-xl};\\n }\\n}\\n\\n// scss-docs-start modal-fullscreen-loop\\n@each $breakpoint in map-keys($grid-breakpoints) {\\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\\n $postfix: if($infix != \\"\\", $infix + \\"-down\\", \\"\\");\\n\\n @include media-breakpoint-down($breakpoint) {\\n .modal-fullscreen#{$postfix} {\\n width: 100vw;\\n max-width: none;\\n height: 100%;\\n margin: 0;\\n\\n .modal-content {\\n height: 100%;\\n border: 0;\\n @include border-radius(0);\\n }\\n\\n .modal-header,\\n .modal-footer {\\n @include border-radius(0);\\n }\\n\\n .modal-body {\\n overflow-y: auto;\\n }\\n }\\n }\\n}\\n// scss-docs-end modal-fullscreen-loop\\n","// Shared between modals and offcanvases\\n@mixin overlay-backdrop($zindex, $backdrop-bg, $backdrop-opacity) {\\n position: fixed;\\n top: 0;\\n left: 0;\\n z-index: $zindex;\\n width: 100vw;\\n height: 100vh;\\n background-color: $backdrop-bg;\\n\\n // Fade for backdrop\\n &.fade { opacity: 0; }\\n &.show { opacity: $backdrop-opacity; }\\n}\\n","// Base class\\n.tooltip {\\n // scss-docs-start tooltip-css-vars\\n --#{$prefix}tooltip-zindex: #{$zindex-tooltip};\\n --#{$prefix}tooltip-max-width: #{$tooltip-max-width};\\n --#{$prefix}tooltip-padding-x: #{$tooltip-padding-x};\\n --#{$prefix}tooltip-padding-y: #{$tooltip-padding-y};\\n --#{$prefix}tooltip-margin: #{$tooltip-margin};\\n @include rfs($tooltip-font-size, --#{$prefix}tooltip-font-size);\\n --#{$prefix}tooltip-color: #{$tooltip-color};\\n --#{$prefix}tooltip-bg: #{$tooltip-bg};\\n --#{$prefix}tooltip-border-radius: #{$tooltip-border-radius};\\n --#{$prefix}tooltip-opacity: #{$tooltip-opacity};\\n --#{$prefix}tooltip-arrow-width: #{$tooltip-arrow-width};\\n --#{$prefix}tooltip-arrow-height: #{$tooltip-arrow-height};\\n // scss-docs-end tooltip-css-vars\\n\\n z-index: var(--#{$prefix}tooltip-zindex);\\n display: block;\\n margin: var(--#{$prefix}tooltip-margin);\\n @include deprecate(\\"`$tooltip-margin`\\", \\"v5\\", \\"v5.x\\", true);\\n // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.\\n // So reset our font and text properties to avoid inheriting weird values.\\n @include reset-text();\\n @include font-size(var(--#{$prefix}tooltip-font-size));\\n // Allow breaking very long words so they don\'t overflow the tooltip\'s bounds\\n word-wrap: break-word;\\n opacity: 0;\\n\\n &.show { opacity: var(--#{$prefix}tooltip-opacity); }\\n\\n .tooltip-arrow {\\n display: block;\\n width: var(--#{$prefix}tooltip-arrow-width);\\n height: var(--#{$prefix}tooltip-arrow-height);\\n\\n &::before {\\n position: absolute;\\n content: \\"\\";\\n border-color: transparent;\\n border-style: solid;\\n }\\n }\\n}\\n\\n.bs-tooltip-top .tooltip-arrow {\\n bottom: calc(-1 * var(--#{$prefix}tooltip-arrow-height)); // stylelint-disable-line function-disallowed-list\\n\\n &::before {\\n top: -1px;\\n border-width: var(--#{$prefix}tooltip-arrow-height) calc(var(--#{$prefix}tooltip-arrow-width) * .5) 0; // stylelint-disable-line function-disallowed-list\\n border-top-color: var(--#{$prefix}tooltip-bg);\\n }\\n}\\n\\n/* rtl:begin:ignore */\\n.bs-tooltip-end .tooltip-arrow {\\n left: calc(-1 * var(--#{$prefix}tooltip-arrow-height)); // stylelint-disable-line function-disallowed-list\\n width: var(--#{$prefix}tooltip-arrow-height);\\n height: var(--#{$prefix}tooltip-arrow-width);\\n\\n &::before {\\n right: -1px;\\n border-width: calc(var(--#{$prefix}tooltip-arrow-width) * .5) var(--#{$prefix}tooltip-arrow-height) calc(var(--#{$prefix}tooltip-arrow-width) * .5) 0; // stylelint-disable-line function-disallowed-list\\n border-right-color: var(--#{$prefix}tooltip-bg);\\n }\\n}\\n\\n/* rtl:end:ignore */\\n\\n.bs-tooltip-bottom .tooltip-arrow {\\n top: calc(-1 * var(--#{$prefix}tooltip-arrow-height)); // stylelint-disable-line function-disallowed-list\\n\\n &::before {\\n bottom: -1px;\\n border-width: 0 calc(var(--#{$prefix}tooltip-arrow-width) * .5) var(--#{$prefix}tooltip-arrow-height); // stylelint-disable-line function-disallowed-list\\n border-bottom-color: var(--#{$prefix}tooltip-bg);\\n }\\n}\\n\\n/* rtl:begin:ignore */\\n.bs-tooltip-start .tooltip-arrow {\\n right: calc(-1 * var(--#{$prefix}tooltip-arrow-height)); // stylelint-disable-line function-disallowed-list\\n width: var(--#{$prefix}tooltip-arrow-height);\\n height: var(--#{$prefix}tooltip-arrow-width);\\n\\n &::before {\\n left: -1px;\\n border-width: calc(var(--#{$prefix}tooltip-arrow-width) * .5) 0 calc(var(--#{$prefix}tooltip-arrow-width) * .5) var(--#{$prefix}tooltip-arrow-height); // stylelint-disable-line function-disallowed-list\\n border-left-color: var(--#{$prefix}tooltip-bg);\\n }\\n}\\n\\n/* rtl:end:ignore */\\n\\n.bs-tooltip-auto {\\n &[data-popper-placement^=\\"top\\"] {\\n @extend .bs-tooltip-top;\\n }\\n &[data-popper-placement^=\\"right\\"] {\\n @extend .bs-tooltip-end;\\n }\\n &[data-popper-placement^=\\"bottom\\"] {\\n @extend .bs-tooltip-bottom;\\n }\\n &[data-popper-placement^=\\"left\\"] {\\n @extend .bs-tooltip-start;\\n }\\n}\\n\\n// Wrapper for the tooltip content\\n.tooltip-inner {\\n max-width: var(--#{$prefix}tooltip-max-width);\\n padding: var(--#{$prefix}tooltip-padding-y) var(--#{$prefix}tooltip-padding-x);\\n color: var(--#{$prefix}tooltip-color);\\n text-align: center;\\n background-color: var(--#{$prefix}tooltip-bg);\\n @include border-radius(var(--#{$prefix}tooltip-border-radius));\\n}\\n","@mixin reset-text {\\n font-family: $font-family-base;\\n // We deliberately do NOT reset font-size or overflow-wrap / word-wrap.\\n font-style: normal;\\n font-weight: $font-weight-normal;\\n line-height: $line-height-base;\\n text-align: left; // Fallback for where `start` is not supported\\n text-align: start;\\n text-decoration: none;\\n text-shadow: none;\\n text-transform: none;\\n letter-spacing: normal;\\n word-break: normal;\\n white-space: normal;\\n word-spacing: normal;\\n line-break: auto;\\n}\\n",".popover {\\n // scss-docs-start popover-css-vars\\n --#{$prefix}popover-zindex: #{$zindex-popover};\\n --#{$prefix}popover-max-width: #{$popover-max-width};\\n @include rfs($popover-font-size, --#{$prefix}popover-font-size);\\n --#{$prefix}popover-bg: #{$popover-bg};\\n --#{$prefix}popover-border-width: #{$popover-border-width};\\n --#{$prefix}popover-border-color: #{$popover-border-color};\\n --#{$prefix}popover-border-radius: #{$popover-border-radius};\\n --#{$prefix}popover-inner-border-radius: #{$popover-inner-border-radius};\\n --#{$prefix}popover-box-shadow: #{$popover-box-shadow};\\n --#{$prefix}popover-header-padding-x: #{$popover-header-padding-x};\\n --#{$prefix}popover-header-padding-y: #{$popover-header-padding-y};\\n @include rfs($popover-header-font-size, --#{$prefix}popover-header-font-size);\\n --#{$prefix}popover-header-color: #{$popover-header-color};\\n --#{$prefix}popover-header-bg: #{$popover-header-bg};\\n --#{$prefix}popover-body-padding-x: #{$popover-body-padding-x};\\n --#{$prefix}popover-body-padding-y: #{$popover-body-padding-y};\\n --#{$prefix}popover-body-color: #{$popover-body-color};\\n --#{$prefix}popover-arrow-width: #{$popover-arrow-width};\\n --#{$prefix}popover-arrow-height: #{$popover-arrow-height};\\n --#{$prefix}popover-arrow-border: var(--#{$prefix}popover-border-color);\\n // scss-docs-end popover-css-vars\\n\\n z-index: var(--#{$prefix}popover-zindex);\\n display: block;\\n max-width: var(--#{$prefix}popover-max-width);\\n // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.\\n // So reset our font and text properties to avoid inheriting weird values.\\n @include reset-text();\\n @include font-size(var(--#{$prefix}popover-font-size));\\n // Allow breaking very long words so they don\'t overflow the popover\'s bounds\\n word-wrap: break-word;\\n background-color: var(--#{$prefix}popover-bg);\\n background-clip: padding-box;\\n border: var(--#{$prefix}popover-border-width) solid var(--#{$prefix}popover-border-color);\\n @include border-radius(var(--#{$prefix}popover-border-radius));\\n @include box-shadow(var(--#{$prefix}popover-box-shadow));\\n\\n .popover-arrow {\\n display: block;\\n width: var(--#{$prefix}popover-arrow-width);\\n height: var(--#{$prefix}popover-arrow-height);\\n\\n &::before,\\n &::after {\\n position: absolute;\\n display: block;\\n content: \\"\\";\\n border-color: transparent;\\n border-style: solid;\\n border-width: 0;\\n }\\n }\\n}\\n\\n.bs-popover-top {\\n > .popover-arrow {\\n bottom: calc(-1 * (var(--#{$prefix}popover-arrow-height)) - var(--#{$prefix}popover-border-width)); // stylelint-disable-line function-disallowed-list\\n\\n &::before,\\n &::after {\\n border-width: var(--#{$prefix}popover-arrow-height) calc(var(--#{$prefix}popover-arrow-width) * .5) 0; // stylelint-disable-line function-disallowed-list\\n }\\n\\n &::before {\\n bottom: 0;\\n border-top-color: var(--#{$prefix}popover-arrow-border);\\n }\\n\\n &::after {\\n bottom: var(--#{$prefix}popover-border-width);\\n border-top-color: var(--#{$prefix}popover-bg);\\n }\\n }\\n}\\n\\n/* rtl:begin:ignore */\\n.bs-popover-end {\\n > .popover-arrow {\\n left: calc(-1 * (var(--#{$prefix}popover-arrow-height)) - var(--#{$prefix}popover-border-width)); // stylelint-disable-line function-disallowed-list\\n width: var(--#{$prefix}popover-arrow-height);\\n height: var(--#{$prefix}popover-arrow-width);\\n\\n &::before,\\n &::after {\\n border-width: calc(var(--#{$prefix}popover-arrow-width) * .5) var(--#{$prefix}popover-arrow-height) calc(var(--#{$prefix}popover-arrow-width) * .5) 0; // stylelint-disable-line function-disallowed-list\\n }\\n\\n &::before {\\n left: 0;\\n border-right-color: var(--#{$prefix}popover-arrow-border);\\n }\\n\\n &::after {\\n left: var(--#{$prefix}popover-border-width);\\n border-right-color: var(--#{$prefix}popover-bg);\\n }\\n }\\n}\\n\\n/* rtl:end:ignore */\\n\\n.bs-popover-bottom {\\n > .popover-arrow {\\n top: calc(-1 * (var(--#{$prefix}popover-arrow-height)) - var(--#{$prefix}popover-border-width)); // stylelint-disable-line function-disallowed-list\\n\\n &::before,\\n &::after {\\n border-width: 0 calc(var(--#{$prefix}popover-arrow-width) * .5) var(--#{$prefix}popover-arrow-height); // stylelint-disable-line function-disallowed-list\\n }\\n\\n &::before {\\n top: 0;\\n border-bottom-color: var(--#{$prefix}popover-arrow-border);\\n }\\n\\n &::after {\\n top: var(--#{$prefix}popover-border-width);\\n border-bottom-color: var(--#{$prefix}popover-bg);\\n }\\n }\\n\\n // This will remove the popover-header\'s border just below the arrow\\n .popover-header::before {\\n position: absolute;\\n top: 0;\\n left: 50%;\\n display: block;\\n width: var(--#{$prefix}popover-arrow-width);\\n margin-left: calc(-.5 * var(--#{$prefix}popover-arrow-width)); // stylelint-disable-line function-disallowed-list\\n content: \\"\\";\\n border-bottom: var(--#{$prefix}popover-border-width) solid var(--#{$prefix}popover-header-bg);\\n }\\n}\\n\\n/* rtl:begin:ignore */\\n.bs-popover-start {\\n > .popover-arrow {\\n right: calc(-1 * (var(--#{$prefix}popover-arrow-height)) - var(--#{$prefix}popover-border-width)); // stylelint-disable-line function-disallowed-list\\n width: var(--#{$prefix}popover-arrow-height);\\n height: var(--#{$prefix}popover-arrow-width);\\n\\n &::before,\\n &::after {\\n border-width: calc(var(--#{$prefix}popover-arrow-width) * .5) 0 calc(var(--#{$prefix}popover-arrow-width) * .5) var(--#{$prefix}popover-arrow-height); // stylelint-disable-line function-disallowed-list\\n }\\n\\n &::before {\\n right: 0;\\n border-left-color: var(--#{$prefix}popover-arrow-border);\\n }\\n\\n &::after {\\n right: var(--#{$prefix}popover-border-width);\\n border-left-color: var(--#{$prefix}popover-bg);\\n }\\n }\\n}\\n\\n/* rtl:end:ignore */\\n\\n.bs-popover-auto {\\n &[data-popper-placement^=\\"top\\"] {\\n @extend .bs-popover-top;\\n }\\n &[data-popper-placement^=\\"right\\"] {\\n @extend .bs-popover-end;\\n }\\n &[data-popper-placement^=\\"bottom\\"] {\\n @extend .bs-popover-bottom;\\n }\\n &[data-popper-placement^=\\"left\\"] {\\n @extend .bs-popover-start;\\n }\\n}\\n\\n// Offset the popover to account for the popover arrow\\n.popover-header {\\n padding: var(--#{$prefix}popover-header-padding-y) var(--#{$prefix}popover-header-padding-x);\\n margin-bottom: 0; // Reset the default from Reboot\\n @include font-size(var(--#{$prefix}popover-header-font-size));\\n color: var(--#{$prefix}popover-header-color);\\n background-color: var(--#{$prefix}popover-header-bg);\\n border-bottom: var(--#{$prefix}popover-border-width) solid var(--#{$prefix}popover-border-color);\\n @include border-top-radius(var(--#{$prefix}popover-inner-border-radius));\\n\\n &:empty {\\n display: none;\\n }\\n}\\n\\n.popover-body {\\n padding: var(--#{$prefix}popover-body-padding-y) var(--#{$prefix}popover-body-padding-x);\\n color: var(--#{$prefix}popover-body-color);\\n}\\n","// Notes on the classes:\\n//\\n// 1. .carousel.pointer-event should ideally be pan-y (to allow for users to scroll vertically)\\n// even when their scroll action started on a carousel, but for compatibility (with Firefox)\\n// we\'re preventing all actions instead\\n// 2. The .carousel-item-start and .carousel-item-end is used to indicate where\\n// the active slide is heading.\\n// 3. .active.carousel-item is the current slide.\\n// 4. .active.carousel-item-start and .active.carousel-item-end is the current\\n// slide in its in-transition state. Only one of these occurs at a time.\\n// 5. .carousel-item-next.carousel-item-start and .carousel-item-prev.carousel-item-end\\n// is the upcoming slide in transition.\\n\\n.carousel {\\n position: relative;\\n}\\n\\n.carousel.pointer-event {\\n touch-action: pan-y;\\n}\\n\\n.carousel-inner {\\n position: relative;\\n width: 100%;\\n overflow: hidden;\\n @include clearfix();\\n}\\n\\n.carousel-item {\\n position: relative;\\n display: none;\\n float: left;\\n width: 100%;\\n margin-right: -100%;\\n backface-visibility: hidden;\\n @include transition($carousel-transition);\\n}\\n\\n.carousel-item.active,\\n.carousel-item-next,\\n.carousel-item-prev {\\n display: block;\\n}\\n\\n.carousel-item-next:not(.carousel-item-start),\\n.active.carousel-item-end {\\n transform: translateX(100%);\\n}\\n\\n.carousel-item-prev:not(.carousel-item-end),\\n.active.carousel-item-start {\\n transform: translateX(-100%);\\n}\\n\\n\\n//\\n// Alternate transitions\\n//\\n\\n.carousel-fade {\\n .carousel-item {\\n opacity: 0;\\n transition-property: opacity;\\n transform: none;\\n }\\n\\n .carousel-item.active,\\n .carousel-item-next.carousel-item-start,\\n .carousel-item-prev.carousel-item-end {\\n z-index: 1;\\n opacity: 1;\\n }\\n\\n .active.carousel-item-start,\\n .active.carousel-item-end {\\n z-index: 0;\\n opacity: 0;\\n @include transition(opacity 0s $carousel-transition-duration);\\n }\\n}\\n\\n\\n//\\n// Left/right controls for nav\\n//\\n\\n.carousel-control-prev,\\n.carousel-control-next {\\n position: absolute;\\n top: 0;\\n bottom: 0;\\n z-index: 1;\\n // Use flex for alignment (1-3)\\n display: flex; // 1. allow flex styles\\n align-items: center; // 2. vertically center contents\\n justify-content: center; // 3. horizontally center contents\\n width: $carousel-control-width;\\n padding: 0;\\n color: $carousel-control-color;\\n text-align: center;\\n background: none;\\n border: 0;\\n opacity: $carousel-control-opacity;\\n @include transition($carousel-control-transition);\\n\\n // Hover/focus state\\n &:hover,\\n &:focus {\\n color: $carousel-control-color;\\n text-decoration: none;\\n outline: 0;\\n opacity: $carousel-control-hover-opacity;\\n }\\n}\\n.carousel-control-prev {\\n left: 0;\\n background-image: if($enable-gradients, linear-gradient(90deg, rgba($black, .25), rgba($black, .001)), null);\\n}\\n.carousel-control-next {\\n right: 0;\\n background-image: if($enable-gradients, linear-gradient(270deg, rgba($black, .25), rgba($black, .001)), null);\\n}\\n\\n// Icons for within\\n.carousel-control-prev-icon,\\n.carousel-control-next-icon {\\n display: inline-block;\\n width: $carousel-control-icon-width;\\n height: $carousel-control-icon-width;\\n background-repeat: no-repeat;\\n background-position: 50%;\\n background-size: 100% 100%;\\n}\\n\\n/* rtl:options: {\\n \\"autoRename\\": true,\\n \\"stringMap\\":[ {\\n \\"name\\" : \\"prev-next\\",\\n \\"search\\" : \\"prev\\",\\n \\"replace\\" : \\"next\\"\\n } ]\\n} */\\n.carousel-control-prev-icon {\\n background-image: escape-svg($carousel-control-prev-icon-bg);\\n}\\n.carousel-control-next-icon {\\n background-image: escape-svg($carousel-control-next-icon-bg);\\n}\\n\\n// Optional indicator pips/controls\\n//\\n// Add a container (such as a list) with the following class and add an item (ideally a focusable control,\\n// like a button) with data-bs-target for each slide your carousel holds.\\n\\n.carousel-indicators {\\n position: absolute;\\n right: 0;\\n bottom: 0;\\n left: 0;\\n z-index: 2;\\n display: flex;\\n justify-content: center;\\n padding: 0;\\n // Use the .carousel-control\'s width as margin so we don\'t overlay those\\n margin-right: $carousel-control-width;\\n margin-bottom: 1rem;\\n margin-left: $carousel-control-width;\\n\\n [data-bs-target] {\\n box-sizing: content-box;\\n flex: 0 1 auto;\\n width: $carousel-indicator-width;\\n height: $carousel-indicator-height;\\n padding: 0;\\n margin-right: $carousel-indicator-spacer;\\n margin-left: $carousel-indicator-spacer;\\n text-indent: -999px;\\n cursor: pointer;\\n background-color: $carousel-indicator-active-bg;\\n background-clip: padding-box;\\n border: 0;\\n // Use transparent borders to increase the hit area by 10px on top and bottom.\\n border-top: $carousel-indicator-hit-area-height solid transparent;\\n border-bottom: $carousel-indicator-hit-area-height solid transparent;\\n opacity: $carousel-indicator-opacity;\\n @include transition($carousel-indicator-transition);\\n }\\n\\n .active {\\n opacity: $carousel-indicator-active-opacity;\\n }\\n}\\n\\n\\n// Optional captions\\n//\\n//\\n\\n.carousel-caption {\\n position: absolute;\\n right: (100% - $carousel-caption-width) * .5;\\n bottom: $carousel-caption-spacer;\\n left: (100% - $carousel-caption-width) * .5;\\n padding-top: $carousel-caption-padding-y;\\n padding-bottom: $carousel-caption-padding-y;\\n color: $carousel-caption-color;\\n text-align: center;\\n}\\n\\n// Dark mode carousel\\n\\n@mixin carousel-dark() {\\n .carousel-control-prev-icon,\\n .carousel-control-next-icon {\\n filter: $carousel-dark-control-icon-filter;\\n }\\n\\n .carousel-indicators [data-bs-target] {\\n background-color: $carousel-dark-indicator-active-bg;\\n }\\n\\n .carousel-caption {\\n color: $carousel-dark-caption-color;\\n }\\n}\\n\\n.carousel-dark {\\n @include carousel-dark();\\n}\\n\\n@if $enable-dark-mode {\\n @include color-mode(dark) {\\n @if $color-mode-type == \\"media-query\\" {\\n .carousel {\\n @include carousel-dark();\\n }\\n } @else {\\n .carousel,\\n &.carousel {\\n @include carousel-dark();\\n }\\n }\\n }\\n}\\n","// scss-docs-start clearfix\\n@mixin clearfix() {\\n &::after {\\n display: block;\\n clear: both;\\n content: \\"\\";\\n }\\n}\\n// scss-docs-end clearfix\\n","//\\n// Rotating border\\n//\\n\\n.spinner-grow,\\n.spinner-border {\\n display: inline-block;\\n width: var(--#{$prefix}spinner-width);\\n height: var(--#{$prefix}spinner-height);\\n vertical-align: var(--#{$prefix}spinner-vertical-align);\\n // stylelint-disable-next-line property-disallowed-list\\n border-radius: 50%;\\n animation: var(--#{$prefix}spinner-animation-speed) linear infinite var(--#{$prefix}spinner-animation-name);\\n}\\n\\n// scss-docs-start spinner-border-keyframes\\n@keyframes spinner-border {\\n to { transform: rotate(360deg) #{\\"/* rtl:ignore */\\"}; }\\n}\\n// scss-docs-end spinner-border-keyframes\\n\\n.spinner-border {\\n // scss-docs-start spinner-border-css-vars\\n --#{$prefix}spinner-width: #{$spinner-width};\\n --#{$prefix}spinner-height: #{$spinner-height};\\n --#{$prefix}spinner-vertical-align: #{$spinner-vertical-align};\\n --#{$prefix}spinner-border-width: #{$spinner-border-width};\\n --#{$prefix}spinner-animation-speed: #{$spinner-animation-speed};\\n --#{$prefix}spinner-animation-name: spinner-border;\\n // scss-docs-end spinner-border-css-vars\\n\\n border: var(--#{$prefix}spinner-border-width) solid currentcolor;\\n border-right-color: transparent;\\n}\\n\\n.spinner-border-sm {\\n // scss-docs-start spinner-border-sm-css-vars\\n --#{$prefix}spinner-width: #{$spinner-width-sm};\\n --#{$prefix}spinner-height: #{$spinner-height-sm};\\n --#{$prefix}spinner-border-width: #{$spinner-border-width-sm};\\n // scss-docs-end spinner-border-sm-css-vars\\n}\\n\\n//\\n// Growing circle\\n//\\n\\n// scss-docs-start spinner-grow-keyframes\\n@keyframes spinner-grow {\\n 0% {\\n transform: scale(0);\\n }\\n 50% {\\n opacity: 1;\\n transform: none;\\n }\\n}\\n// scss-docs-end spinner-grow-keyframes\\n\\n.spinner-grow {\\n // scss-docs-start spinner-grow-css-vars\\n --#{$prefix}spinner-width: #{$spinner-width};\\n --#{$prefix}spinner-height: #{$spinner-height};\\n --#{$prefix}spinner-vertical-align: #{$spinner-vertical-align};\\n --#{$prefix}spinner-animation-speed: #{$spinner-animation-speed};\\n --#{$prefix}spinner-animation-name: spinner-grow;\\n // scss-docs-end spinner-grow-css-vars\\n\\n background-color: currentcolor;\\n opacity: 0;\\n}\\n\\n.spinner-grow-sm {\\n --#{$prefix}spinner-width: #{$spinner-width-sm};\\n --#{$prefix}spinner-height: #{$spinner-height-sm};\\n}\\n\\n@if $enable-reduced-motion {\\n @media (prefers-reduced-motion: reduce) {\\n .spinner-border,\\n .spinner-grow {\\n --#{$prefix}spinner-animation-speed: #{$spinner-animation-speed * 2};\\n }\\n }\\n}\\n","// stylelint-disable function-disallowed-list\\n\\n%offcanvas-css-vars {\\n // scss-docs-start offcanvas-css-vars\\n --#{$prefix}offcanvas-zindex: #{$zindex-offcanvas};\\n --#{$prefix}offcanvas-width: #{$offcanvas-horizontal-width};\\n --#{$prefix}offcanvas-height: #{$offcanvas-vertical-height};\\n --#{$prefix}offcanvas-padding-x: #{$offcanvas-padding-x};\\n --#{$prefix}offcanvas-padding-y: #{$offcanvas-padding-y};\\n --#{$prefix}offcanvas-color: #{$offcanvas-color};\\n --#{$prefix}offcanvas-bg: #{$offcanvas-bg-color};\\n --#{$prefix}offcanvas-border-width: #{$offcanvas-border-width};\\n --#{$prefix}offcanvas-border-color: #{$offcanvas-border-color};\\n --#{$prefix}offcanvas-box-shadow: #{$offcanvas-box-shadow};\\n --#{$prefix}offcanvas-transition: #{transform $offcanvas-transition-duration ease-in-out};\\n --#{$prefix}offcanvas-title-line-height: #{$offcanvas-title-line-height};\\n // scss-docs-end offcanvas-css-vars\\n}\\n\\n@each $breakpoint in map-keys($grid-breakpoints) {\\n $next: breakpoint-next($breakpoint, $grid-breakpoints);\\n $infix: breakpoint-infix($next, $grid-breakpoints);\\n\\n .offcanvas#{$infix} {\\n @extend %offcanvas-css-vars;\\n }\\n}\\n\\n@each $breakpoint in map-keys($grid-breakpoints) {\\n $next: breakpoint-next($breakpoint, $grid-breakpoints);\\n $infix: breakpoint-infix($next, $grid-breakpoints);\\n\\n .offcanvas#{$infix} {\\n @include media-breakpoint-down($next) {\\n position: fixed;\\n bottom: 0;\\n z-index: var(--#{$prefix}offcanvas-zindex);\\n display: flex;\\n flex-direction: column;\\n max-width: 100%;\\n color: var(--#{$prefix}offcanvas-color);\\n visibility: hidden;\\n background-color: var(--#{$prefix}offcanvas-bg);\\n background-clip: padding-box;\\n outline: 0;\\n @include box-shadow(var(--#{$prefix}offcanvas-box-shadow));\\n @include transition(var(--#{$prefix}offcanvas-transition));\\n\\n &.offcanvas-start {\\n top: 0;\\n left: 0;\\n width: var(--#{$prefix}offcanvas-width);\\n border-right: var(--#{$prefix}offcanvas-border-width) solid var(--#{$prefix}offcanvas-border-color);\\n transform: translateX(-100%);\\n }\\n\\n &.offcanvas-end {\\n top: 0;\\n right: 0;\\n width: var(--#{$prefix}offcanvas-width);\\n border-left: var(--#{$prefix}offcanvas-border-width) solid var(--#{$prefix}offcanvas-border-color);\\n transform: translateX(100%);\\n }\\n\\n &.offcanvas-top {\\n top: 0;\\n right: 0;\\n left: 0;\\n height: var(--#{$prefix}offcanvas-height);\\n max-height: 100%;\\n border-bottom: var(--#{$prefix}offcanvas-border-width) solid var(--#{$prefix}offcanvas-border-color);\\n transform: translateY(-100%);\\n }\\n\\n &.offcanvas-bottom {\\n right: 0;\\n left: 0;\\n height: var(--#{$prefix}offcanvas-height);\\n max-height: 100%;\\n border-top: var(--#{$prefix}offcanvas-border-width) solid var(--#{$prefix}offcanvas-border-color);\\n transform: translateY(100%);\\n }\\n\\n &.showing,\\n &.show:not(.hiding) {\\n transform: none;\\n }\\n\\n &.showing,\\n &.hiding,\\n &.show {\\n visibility: visible;\\n }\\n }\\n\\n @if not ($infix == \\"\\") {\\n @include media-breakpoint-up($next) {\\n --#{$prefix}offcanvas-height: auto;\\n --#{$prefix}offcanvas-border-width: 0;\\n background-color: transparent !important; // stylelint-disable-line declaration-no-important\\n\\n .offcanvas-header {\\n display: none;\\n }\\n\\n .offcanvas-body {\\n display: flex;\\n flex-grow: 0;\\n padding: 0;\\n overflow-y: visible;\\n // Reset `background-color` in case `.bg-*` classes are used in offcanvas\\n background-color: transparent !important; // stylelint-disable-line declaration-no-important\\n }\\n }\\n }\\n }\\n}\\n\\n.offcanvas-backdrop {\\n @include overlay-backdrop($zindex-offcanvas-backdrop, $offcanvas-backdrop-bg, $offcanvas-backdrop-opacity);\\n}\\n\\n.offcanvas-header {\\n display: flex;\\n align-items: center;\\n justify-content: space-between;\\n padding: var(--#{$prefix}offcanvas-padding-y) var(--#{$prefix}offcanvas-padding-x);\\n\\n .btn-close {\\n padding: calc(var(--#{$prefix}offcanvas-padding-y) * .5) calc(var(--#{$prefix}offcanvas-padding-x) * .5);\\n margin-top: calc(-.5 * var(--#{$prefix}offcanvas-padding-y));\\n margin-right: calc(-.5 * var(--#{$prefix}offcanvas-padding-x));\\n margin-bottom: calc(-.5 * var(--#{$prefix}offcanvas-padding-y));\\n }\\n}\\n\\n.offcanvas-title {\\n margin-bottom: 0;\\n line-height: var(--#{$prefix}offcanvas-title-line-height);\\n}\\n\\n.offcanvas-body {\\n flex-grow: 1;\\n padding: var(--#{$prefix}offcanvas-padding-y) var(--#{$prefix}offcanvas-padding-x);\\n overflow-y: auto;\\n}\\n",".placeholder {\\n display: inline-block;\\n min-height: 1em;\\n vertical-align: middle;\\n cursor: wait;\\n background-color: currentcolor;\\n opacity: $placeholder-opacity-max;\\n\\n &.btn::before {\\n display: inline-block;\\n content: \\"\\";\\n }\\n}\\n\\n// Sizing\\n.placeholder-xs {\\n min-height: .6em;\\n}\\n\\n.placeholder-sm {\\n min-height: .8em;\\n}\\n\\n.placeholder-lg {\\n min-height: 1.2em;\\n}\\n\\n// Animation\\n.placeholder-glow {\\n .placeholder {\\n animation: placeholder-glow 2s ease-in-out infinite;\\n }\\n}\\n\\n@keyframes placeholder-glow {\\n 50% {\\n opacity: $placeholder-opacity-min;\\n }\\n}\\n\\n.placeholder-wave {\\n mask-image: linear-gradient(130deg, $black 55%, rgba(0, 0, 0, (1 - $placeholder-opacity-min)) 75%, $black 95%);\\n mask-size: 200% 100%;\\n animation: placeholder-wave 2s linear infinite;\\n}\\n\\n@keyframes placeholder-wave {\\n 100% {\\n mask-position: -200% 0%;\\n }\\n}\\n","// All-caps `RGBA()` function used because of this Sass bug: https://github.com/sass/node-sass/issues/2251\\n@each $color, $value in $theme-colors {\\n .text-bg-#{$color} {\\n color: color-contrast($value) if($enable-important-utilities, !important, null);\\n background-color: RGBA(var(--#{$prefix}#{$color}-rgb), var(--#{$prefix}bg-opacity, 1)) if($enable-important-utilities, !important, null);\\n }\\n}\\n","// All-caps `RGBA()` function used because of this Sass bug: https://github.com/sass/node-sass/issues/2251\\n@each $color, $value in $theme-colors {\\n .link-#{$color} {\\n color: RGBA(var(--#{$prefix}#{$color}-rgb), var(--#{$prefix}link-opacity, 1)) if($enable-important-utilities, !important, null);\\n text-decoration-color: RGBA(var(--#{$prefix}#{$color}-rgb), var(--#{$prefix}link-underline-opacity, 1)) if($enable-important-utilities, !important, null);\\n\\n @if $link-shade-percentage != 0 {\\n &:hover,\\n &:focus {\\n $hover-color: if(color-contrast($value) == $color-contrast-light, shade-color($value, $link-shade-percentage), tint-color($value, $link-shade-percentage));\\n color: RGBA(#{to-rgb($hover-color)}, var(--#{$prefix}link-opacity, 1)) if($enable-important-utilities, !important, null);\\n text-decoration-color: RGBA(to-rgb($hover-color), var(--#{$prefix}link-underline-opacity, 1)) if($enable-important-utilities, !important, null);\\n }\\n }\\n }\\n}\\n\\n// One-off special link helper as a bridge until v6\\n.link-body-emphasis {\\n color: RGBA(var(--#{$prefix}emphasis-color-rgb), var(--#{$prefix}link-opacity, 1)) if($enable-important-utilities, !important, null);\\n text-decoration-color: RGBA(var(--#{$prefix}emphasis-color-rgb), var(--#{$prefix}link-underline-opacity, 1)) if($enable-important-utilities, !important, null);\\n\\n @if $link-shade-percentage != 0 {\\n &:hover,\\n &:focus {\\n color: RGBA(var(--#{$prefix}emphasis-color-rgb), var(--#{$prefix}link-opacity, .75)) if($enable-important-utilities, !important, null);\\n text-decoration-color: RGBA(var(--#{$prefix}emphasis-color-rgb), var(--#{$prefix}link-underline-opacity, .75)) if($enable-important-utilities, !important, null);\\n }\\n }\\n}\\n",".focus-ring:focus {\\n outline: 0;\\n // By default, there is no `--bs-focus-ring-x`, `--bs-focus-ring-y`, or `--bs-focus-ring-blur`, but we provide CSS variables with fallbacks to initial `0` values\\n box-shadow: var(--#{$prefix}focus-ring-x, 0) var(--#{$prefix}focus-ring-y, 0) var(--#{$prefix}focus-ring-blur, 0) var(--#{$prefix}focus-ring-width) var(--#{$prefix}focus-ring-color);\\n}\\n",".icon-link {\\n display: inline-flex;\\n gap: $icon-link-gap;\\n align-items: center;\\n text-decoration-color: rgba(var(--#{$prefix}link-color-rgb), var(--#{$prefix}link-opacity, .5));\\n text-underline-offset: $icon-link-underline-offset;\\n backface-visibility: hidden;\\n\\n > .bi {\\n flex-shrink: 0;\\n width: $icon-link-icon-size;\\n height: $icon-link-icon-size;\\n fill: currentcolor;\\n @include transition($icon-link-icon-transition);\\n }\\n}\\n\\n.icon-link-hover {\\n &:hover,\\n &:focus-visible {\\n > .bi {\\n transform: var(--#{$prefix}icon-link-transform, $icon-link-icon-transform);\\n }\\n }\\n}\\n","// Credit: Nicolas Gallagher and SUIT CSS.\\n\\n.ratio {\\n position: relative;\\n width: 100%;\\n\\n &::before {\\n display: block;\\n padding-top: var(--#{$prefix}aspect-ratio);\\n content: \\"\\";\\n }\\n\\n > * {\\n position: absolute;\\n top: 0;\\n left: 0;\\n width: 100%;\\n height: 100%;\\n }\\n}\\n\\n@each $key, $ratio in $aspect-ratios {\\n .ratio-#{$key} {\\n --#{$prefix}aspect-ratio: #{$ratio};\\n }\\n}\\n","// Shorthand\\n\\n.fixed-top {\\n position: fixed;\\n top: 0;\\n right: 0;\\n left: 0;\\n z-index: $zindex-fixed;\\n}\\n\\n.fixed-bottom {\\n position: fixed;\\n right: 0;\\n bottom: 0;\\n left: 0;\\n z-index: $zindex-fixed;\\n}\\n\\n// Responsive sticky top and bottom\\n@each $breakpoint in map-keys($grid-breakpoints) {\\n @include media-breakpoint-up($breakpoint) {\\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\\n\\n .sticky#{$infix}-top {\\n position: sticky;\\n top: 0;\\n z-index: $zindex-sticky;\\n }\\n\\n .sticky#{$infix}-bottom {\\n position: sticky;\\n bottom: 0;\\n z-index: $zindex-sticky;\\n }\\n }\\n}\\n","// scss-docs-start stacks\\n.hstack {\\n display: flex;\\n flex-direction: row;\\n align-items: center;\\n align-self: stretch;\\n}\\n\\n.vstack {\\n display: flex;\\n flex: 1 1 auto;\\n flex-direction: column;\\n align-self: stretch;\\n}\\n// scss-docs-end stacks\\n","// stylelint-disable declaration-no-important\\n\\n// Hide content visually while keeping it accessible to assistive technologies\\n//\\n// See: https://www.a11yproject.com/posts/2013-01-11-how-to-hide-content/\\n// See: https://kittygiraudel.com/2016/10/13/css-hide-and-seek/\\n\\n@mixin visually-hidden() {\\n width: 1px !important;\\n height: 1px !important;\\n padding: 0 !important;\\n margin: -1px !important; // Fix for https://github.com/twbs/bootstrap/issues/25686\\n overflow: hidden !important;\\n clip: rect(0, 0, 0, 0) !important;\\n white-space: nowrap !important;\\n border: 0 !important;\\n\\n // Fix for positioned table caption that could become anonymous cells\\n &:not(caption) {\\n position: absolute !important;\\n }\\n}\\n\\n// Use to only display content when it\'s focused, or one of its child elements is focused\\n// (i.e. when focus is within the element/container that the class was applied to)\\n//\\n// Useful for \\"Skip to main content\\" links; see https://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\\n\\n@mixin visually-hidden-focusable() {\\n &:not(:focus):not(:focus-within) {\\n @include visually-hidden();\\n }\\n}\\n","//\\n// Stretched link\\n//\\n\\n.stretched-link {\\n &::#{$stretched-link-pseudo-element} {\\n position: absolute;\\n top: 0;\\n right: 0;\\n bottom: 0;\\n left: 0;\\n z-index: $stretched-link-z-index;\\n content: \\"\\";\\n }\\n}\\n","// Text truncate\\n// Requires inline-block or block for proper styling\\n\\n@mixin text-truncate() {\\n overflow: hidden;\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n}\\n","//\\n// Text truncation\\n//\\n\\n.text-truncate {\\n @include text-truncate();\\n}\\n",".vr {\\n display: inline-block;\\n align-self: stretch;\\n width: $vr-border-width;\\n min-height: 1em;\\n background-color: currentcolor;\\n opacity: $hr-opacity;\\n}\\n","// Utility generator\\n// Used to generate utilities & print utilities\\n@mixin generate-utility($utility, $infix: \\"\\", $is-rfs-media-query: false) {\\n $values: map-get($utility, values);\\n\\n // If the values are a list or string, convert it into a map\\n @if type-of($values) == \\"string\\" or type-of(nth($values, 1)) != \\"list\\" {\\n $values: zip($values, $values);\\n }\\n\\n @each $key, $value in $values {\\n $properties: map-get($utility, property);\\n\\n // Multiple properties are possible, for example with vertical or horizontal margins or paddings\\n @if type-of($properties) == \\"string\\" {\\n $properties: append((), $properties);\\n }\\n\\n // Use custom class if present\\n $property-class: if(map-has-key($utility, class), map-get($utility, class), nth($properties, 1));\\n $property-class: if($property-class == null, \\"\\", $property-class);\\n\\n // Use custom CSS variable name if present, otherwise default to `class`\\n $css-variable-name: if(map-has-key($utility, css-variable-name), map-get($utility, css-variable-name), map-get($utility, class));\\n\\n // State params to generate pseudo-classes\\n $state: if(map-has-key($utility, state), map-get($utility, state), ());\\n\\n $infix: if($property-class == \\"\\" and str-slice($infix, 1, 1) == \\"-\\", str-slice($infix, 2), $infix);\\n\\n // Don\'t prefix if value key is null (e.g. with shadow class)\\n $property-class-modifier: if($key, if($property-class == \\"\\" and $infix == \\"\\", \\"\\", \\"-\\") + $key, \\"\\");\\n\\n @if map-get($utility, rfs) {\\n // Inside the media query\\n @if $is-rfs-media-query {\\n $val: rfs-value($value);\\n\\n // Do not render anything if fluid and non fluid values are the same\\n $value: if($val == rfs-fluid-value($value), null, $val);\\n }\\n @else {\\n $value: rfs-fluid-value($value);\\n }\\n }\\n\\n $is-css-var: map-get($utility, css-var);\\n $is-local-vars: map-get($utility, local-vars);\\n $is-rtl: map-get($utility, rtl);\\n\\n @if $value != null {\\n @if $is-rtl == false {\\n /* rtl:begin:remove */\\n }\\n\\n @if $is-css-var {\\n .#{$property-class + $infix + $property-class-modifier} {\\n --#{$prefix}#{$css-variable-name}: #{$value};\\n }\\n\\n @each $pseudo in $state {\\n .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {\\n --#{$prefix}#{$css-variable-name}: #{$value};\\n }\\n }\\n } @else {\\n .#{$property-class + $infix + $property-class-modifier} {\\n @each $property in $properties {\\n @if $is-local-vars {\\n @each $local-var, $variable in $is-local-vars {\\n --#{$prefix}#{$local-var}: #{$variable};\\n }\\n }\\n #{$property}: $value if($enable-important-utilities, !important, null);\\n }\\n }\\n\\n @each $pseudo in $state {\\n .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {\\n @each $property in $properties {\\n @if $is-local-vars {\\n @each $local-var, $variable in $is-local-vars {\\n --#{$prefix}#{$local-var}: #{$variable};\\n }\\n }\\n #{$property}: $value if($enable-important-utilities, !important, null);\\n }\\n }\\n }\\n }\\n\\n @if $is-rtl == false {\\n /* rtl:end:remove */\\n }\\n }\\n }\\n}\\n","// Loop over each breakpoint\\n@each $breakpoint in map-keys($grid-breakpoints) {\\n\\n // Generate media query if needed\\n @include media-breakpoint-up($breakpoint) {\\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\\n\\n // Loop over each utility property\\n @each $key, $utility in $utilities {\\n // The utility can be disabled with `false`, thus check if the utility is a map first\\n // Only proceed if responsive media queries are enabled or if it\'s the base media query\\n @if type-of($utility) == \\"map\\" and (map-get($utility, responsive) or $infix == \\"\\") {\\n @include generate-utility($utility, $infix);\\n }\\n }\\n }\\n}\\n\\n// RFS rescaling\\n@media (min-width: $rfs-mq-value) {\\n @each $breakpoint in map-keys($grid-breakpoints) {\\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\\n\\n @if (map-get($grid-breakpoints, $breakpoint) < $rfs-breakpoint) {\\n // Loop over each utility property\\n @each $key, $utility in $utilities {\\n // The utility can be disabled with `false`, thus check if the utility is a map first\\n // Only proceed if responsive media queries are enabled or if it\'s the base media query\\n @if type-of($utility) == \\"map\\" and map-get($utility, rfs) and (map-get($utility, responsive) or $infix == \\"\\") {\\n @include generate-utility($utility, $infix, true);\\n }\\n }\\n }\\n }\\n}\\n\\n\\n// Print utilities\\n@media print {\\n @each $key, $utility in $utilities {\\n // The utility can be disabled with `false`, thus check if the utility is a map first\\n // Then check if the utility needs print styles\\n @if type-of($utility) == \\"map\\" and map-get($utility, print) == true {\\n @include generate-utility($utility, \\"-print\\");\\n }\\n }\\n}\\n"],"sourceRoot":""}]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFXLGNBQWMsZ0JBQWdCLFdBQVcsY0FBYyxXQUFXLGFBQWEsY0FBYyxhQUFhLHFCQUFxQixhQUFhLHNCQUFzQixhQUFhLGdCQUFnQixhQUFhLHNCQUFzQixhQUFhLHNCQUFzQixhQUFhLGdCQUFnQixhQUFhLHNCQUFzQixhQUFhLHNCQUFzQixhQUFhLGdCQUFnQixjQUFjLHNCQUFzQixjQUFjLHNCQUFzQixpQkFBaUIsaUJBQWlCLGlCQUFpQixpQkFBaUIsaUJBQWlCLHNCQUFzQixpQkFBaUIsc0JBQXNCLGlCQUFpQixxQkFBcUIsaUJBQWlCLHFCQUFxQixpQkFBaUIsb0JBQW9CLGlCQUFpQixvQkFBb0IsaUJBQWlCLHNCQUFzQixpQkFBaUIsc0JBQXNCLGlCQUFpQixvQkFBb0IsaUJBQWlCLHFCQUFxQiwwQkFBMEIsUUFBUSxZQUFZLG9CQUFvQixjQUFjLFdBQVcsaUJBQWlCLGNBQWMsV0FBVyxpQkFBaUIsY0FBYyxVQUFVLGlCQUFpQixjQUFjLGdCQUFnQixpQkFBaUIsY0FBYyxVQUFVLGlCQUFpQixjQUFjLFVBQVUsaUJBQWlCLGNBQWMsZ0JBQWdCLGFBQWEsY0FBYyxXQUFXLFVBQVUsY0FBYyxlQUFlLFVBQVUsY0FBYyxnQkFBZ0IsVUFBVSxjQUFjLFVBQVUsVUFBVSxjQUFjLGdCQUFnQixVQUFVLGNBQWMsZ0JBQWdCLFVBQVUsY0FBYyxVQUFVLFVBQVUsY0FBYyxnQkFBZ0IsVUFBVSxjQUFjLGdCQUFnQixVQUFVLGNBQWMsVUFBVSxXQUFXLGNBQWMsZ0JBQWdCLFdBQVcsY0FBYyxnQkFBZ0IsV0FBVyxjQUFjLFdBQVcsYUFBYSxjQUFjLGFBQWEscUJBQXFCLGFBQWEsc0JBQXNCLGFBQWEsZ0JBQWdCLGFBQWEsc0JBQXNCLGFBQWEsc0JBQXNCLGFBQWEsZ0JBQWdCLGFBQWEsc0JBQXNCLGFBQWEsc0JBQXNCLGFBQWEsZ0JBQWdCLGNBQWMsc0JBQXNCLGNBQWMsc0JBQXNCLGlCQUFpQixpQkFBaUIsaUJBQWlCLGlCQUFpQixpQkFBaUIsc0JBQXNCLGlCQUFpQixzQkFBc0IsaUJBQWlCLHFCQUFx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SSxXQUFXLGlCQUFpQixlQUFlLGdCQUFnQixVQUFVLDJEQUEyRCxhQUFhLFdBQVcscUNBQXFDLGVBQWUsb0RBQW9ELEdBQUcsUUFBUSxHQUFHLFVBQVUsOENBQThDLG9DQUFvQyxpRUFBaUUsd0JBQXdCLFFBQVEsRUFBRSxXQUFXLElBQUksV0FBVyxtQkFBbUIsaUJBQWlCLGtCQUFrQixVQUFVLDJEQUEyRCxlQUFlLGFBQWEsV0FBVyxTQUFTLGdDQUFnQyx1Q0FBdUMsT0FBTyxLQUFLLEdBQUcscUZBQXFGLHNGQUFzRiwrREFBK0Qsb0ZBQW9GLDRSQUE0UixzREFBc0QsU0FBUyxPQUFPLEtBQUssR0FBRyx5REFBeUQsc0RBQXNELCtEQUErRCx5RUFBeUUsc0ZBQXNGLDZUQUE2VCw4REFBOEQsV0FBVyxTQUFTLE9BQU8sS0FBSyxHQUFHLHdDQUF3Qyx3Q0FBd0MsNk5BQTZOLHdEQUF3RCxPQUFPLEtBQUssR0FBRyxxQkFBcUI7QUFDNW43WDtBQUNBLGlFQUFlLHVCQUF1QixFQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vc3JjL2luZGV4LnNjc3M/NTNjZSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fIGZyb20gXCIuLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvZ2V0VXJsLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzBfX18gPSBuZXcgVVJMKFwiZGF0YTppbWFnZS9zdmcreG1sLCUzY3N2ZyB4bWxucz0lMjdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyUyNyB2aWV3Qm94PSUyNzAgMCAxNiAxNiUyNyUzZSUzY3BhdGggZmlsbD0lMjdub25lJTI3IHN0cm9rZT0lMjclMjMzNDNhNDAlMjcgc3Ryb2tlLWxpbmVjYXA9JTI3cm91bmQlMjcgc3Ryb2tlLWxpbmVqb2luPSUyN3JvdW5kJTI3IHN0cm9rZS13aWR0aD0lMjcyJTI3IGQ9JTI3bTIgNSA2IDYgNi02JTI3LyUzZSUzYy9zdmclM2VcIiwgaW1wb3J0Lm1ldGEudXJsKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfMV9fXyA9IG5ldyBVUkwoXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNjc3ZnIHhtbG5zPSUyN2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJTI3IHZpZXdCb3g9JTI3MCAwIDE2IDE2JTI3JTNlJTNjcGF0aCBmaWxsPSUyN25vbmUlMjcgc3Ryb2tlPSUyNyUyM2RlZTJlNiUyNyBzdHJva2UtbGluZWNhcD0lMjdyb3VuZCUyNyBzdHJva2UtbGluZWpvaW49JTI3cm91bmQlMjcgc3Ryb2tlLXdpZHRoPSUyNzIlMjcgZD0lMjdtMiA1IDYgNiA2LTYlMjcvJTNlJTNjL3N2ZyUzZVwiLCBpbXBvcnQubWV0YS51cmwpO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8yX19fID0gbmV3IFVSTChcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM2NzdmcgeG1sbnM9JTI3aHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmclMjcgdmlld0JveD0lMjcwIDAgMjAgMjAlMjclM2UlM2NwYXRoIGZpbGw9JTI3bm9uZSUyNyBzdHJva2U9JTI3JTIzZmZmJTI3IHN0cm9rZS1saW5lY2FwPSUyN3JvdW5kJTI3IHN0cm9rZS1saW5lam9pbj0lMjdyb3VuZCUyNyBzdHJva2Utd2lkdGg9JTI3MyUyNyBkPSUyN202IDEwIDMgMyA2LTYlMjcvJTNlJTNjL3N2ZyUzZVwiLCBpbXBvcnQubWV0YS51cmwpO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8zX19fID0gbmV3IFVSTChcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM2NzdmcgeG1sbnM9JTI3aHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmclMjcgdmlld0JveD0lMjctNCAtNCA4IDglMjclM2UlM2NjaXJjbGUgcj0lMjcyJTI3IGZpbGw9JTI3JTIzZmZmJTI3LyUzZSUzYy9zdmclM2VcIiwgaW1wb3J0Lm1ldGEudXJsKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfNF9fXyA9IG5ldyBVUkwoXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNjc3ZnIHhtbG5zPSUyN2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJTI3IHZpZXdCb3g9JTI3MCAwIDIwIDIwJTI3JTNlJTNjcGF0aCBmaWxsPSUyN25vbmUlMjcgc3Ryb2tlPSUyNyUyM2ZmZiUyNyBzdHJva2UtbGluZWNhcD0lMjdyb3VuZCUyNyBzdHJva2UtbGluZWpvaW49JTI3cm91bmQlMjcgc3Ryb2tlLXdpZHRoPSUyNzMlMjcgZD0lMjdNNiAxMGg4JTI3LyUzZSUzYy9zdmclM2VcIiwgaW1wb3J0Lm1ldGEudXJsKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfNV9fXyA9IG5ldyBVUkwoXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNjc3ZnIHhtbG5zPSUyN2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJTI3IHZpZXdCb3g9JTI3LTQgLTQgOCA4JTI3JTNlJTNjY2lyY2xlIHI9JTI3MyUyNyBmaWxsPSUyN3JnYmElMjgwLDAsMCwwLjI1JTI5JTI3LyUzZSUzYy9zdmclM2VcIiwgaW1wb3J0Lm1ldGEudXJsKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfNl9fXyA9IG5ldyBVUkwoXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNjc3ZnIHhtbG5zPSUyN2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJTI3IHZpZXdCb3g9JTI3LTQgLTQgOCA4JTI3JTNlJTNjY2lyY2xlIHI9JTI3MyUyNyBmaWxsPSUyNyUyMzg2YjdmZSUyNy8lM2UlM2Mvc3ZnJTNlXCIsIGltcG9ydC5tZXRhLnVybCk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzdfX18gPSBuZXcgVVJMKFwiZGF0YTppbWFnZS9zdmcreG1sLCUzY3N2ZyB4bWxucz0lMjdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyUyNyB2aWV3Qm94PSUyNy00IC00IDggOCUyNyUzZSUzY2NpcmNsZSByPSUyNzMlMjcgZmlsbD0lMjclMjNmZmYlMjcvJTNlJTNjL3N2ZyUzZVwiLCBpbXBvcnQubWV0YS51cmwpO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF84X19fID0gbmV3IFVSTChcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM2NzdmcgeG1sbnM9JTI3aHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmclMjcgdmlld0JveD0lMjctNCAtNCA4IDglMjclM2UlM2NjaXJjbGUgcj0lMjczJTI3IGZpbGw9JTI3cmdiYSUyODI1NSwyNTUsMjU1LDAuMjUlMjklMjcvJTNlJTNjL3N2ZyUzZVwiLCBpbXBvcnQubWV0YS51cmwpO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF85X19fID0gbmV3IFVSTChcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM2NzdmcgeG1sbnM9JTI3aHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmclMjcgdmlld0JveD0lMjcwIDAgOCA4JTI3JTNlJTNjcGF0aCBmaWxsPSUyNyUyMzE5ODc1NCUyNyBkPSUyN00yLjMgNi43My42IDQuNTNjLS40LTEuMDQuNDYtMS40IDEuMS0uOGwxLjEgMS40IDMuNC0zLjhjLjYtLjYzIDEuNi0uMjcgMS4yLjdsLTQgNC42Yy0uNDMuNS0uOC40LTEuMS4xeiUyNy8lM2UlM2Mvc3ZnJTNlXCIsIGltcG9ydC5tZXRhLnVybCk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzEwX19fID0gbmV3IFVSTChcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM2NzdmcgeG1sbnM9JTI3aHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmclMjcgdmlld0JveD0lMjcwIDAgMTIgMTIlMjcgd2lkdGg9JTI3MTIlMjcgaGVpZ2h0PSUyNzEyJTI3IGZpbGw9JTI3bm9uZSUyNyBzdHJva2U9JTI3JTIzZGMzNTQ1JTI3JTNlJTNjY2lyY2xlIGN4PSUyNzYlMjcgY3k9JTI3NiUyNyByPSUyNzQuNSUyNy8lM2UlM2NwYXRoIHN0cm9rZS1saW5lam9pbj0lMjdyb3VuZCUyNyBkPSUyN001LjggMy42aC40TDYgNi41eiUyNy8lM2UlM2NjaXJjbGUgY3g9JTI3NiUyNyBjeT0lMjc4LjIlMjcgcj0lMjcuNiUyNyBmaWxsPSUyNyUyM2RjMzU0NSUyNyBzdHJva2U9JTI3bm9uZSUyNy8lM2UlM2Mvc3ZnJTNlXCIsIGltcG9ydC5tZXRhLnVybCk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzExX19fID0gbmV3IFVSTChcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM2NzdmcgeG1sbnM9JTI3aHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmclMjcgdmlld0JveD0lMjcwIDAgMzAgMzAlMjclM2UlM2NwYXRoIHN0cm9rZT0lMjdyZ2JhJTI4MzMsMzcsNDEsMC43NSUyOSUyNyBzdHJva2UtbGluZWNhcD0lMjdyb3VuZCUyNyBzdHJva2UtbWl0ZXJsaW1pdD0lMjcxMCUyNyBzdHJva2Utd2lkdGg9JTI3MiUyNyBkPSUyN000IDdoMjJNNCAxNWgyMk00IDIzaDIyJTI3LyUzZSUzYy9zdmclM2VcIiwgaW1wb3J0Lm1ldGEudXJsKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfMTJfX18gPSBuZXcgVVJMKFwiZGF0YTppbWFnZS9zdmcreG1sLCUzY3N2ZyB4bWxucz0lMjdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyUyNyB2aWV3Qm94PSUyNzAgMCAzMCAzMCUyNyUzZSUzY3BhdGggc3Ryb2tlPSUyN3JnYmElMjgyNTUsMjU1LDI1NSwwLjU1JTI5JTI3IHN0cm9rZS1saW5lY2FwPSUyN3JvdW5kJTI3IHN0cm9rZS1taXRlcmxpbWl0PSUyNzEwJTI3IHN0cm9rZS13aWR0aD0lMjcyJTI3IGQ9JTI3TTQgN2gyMk00IDE1aDIyTTQgMjNoMjIlMjcvJTNlJTNjL3N2ZyUzZVwiLCBpbXBvcnQubWV0YS51cmwpO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8xM19fXyA9IG5ldyBVUkwoXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNjc3ZnIHhtbG5zPSUyN2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJTI3IHZpZXdCb3g9JTI3MCAwIDE2IDE2JTI3IGZpbGw9JTI3JTIzMjEyNTI5JTI3JTNlJTNjcGF0aCBmaWxsLXJ1bGU9JTI3ZXZlbm9kZCUyNyBkPSUyN00xLjY0NiA0LjY0NmEuNS41IDAgMCAxIC43MDggMEw4IDEwLjI5M2w1LjY0Ni01LjY0N2EuNS41IDAgMCAxIC43MDguNzA4bC02IDZhLjUuNSAwIDAgMS0uNzA4IDBsLTYtNmEuNS41IDAgMCAxIDAtLjcwOHolMjcvJTNlJTNjL3N2ZyUzZVwiLCBpbXBvcnQubWV0YS51cmwpO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8xNF9fXyA9IG5ldyBVUkwoXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNjc3ZnIHhtbG5zPSUyN2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJTI3IHZpZXdCb3g9JTI3MCAwIDE2IDE2JTI3IGZpbGw9JTI3JTIzMDUyYzY1JTI3JTNlJTNjcGF0aCBmaWxsLXJ1bGU9JTI3ZXZlbm9kZCUyNyBkPSUyN00xLjY0NiA0LjY0NmEuNS41IDAgMCAxIC43MDggMEw4IDEwLjI5M2w1LjY0Ni01LjY0N2EuNS41IDAgMCAxIC43MDguNzA4bC02IDZhLjUuNSAwIDAgMS0uNzA4IDBsLTYtNmEuNS41IDAgMCAxIDAtLjcwOHolMjcvJTNlJTNjL3N2ZyUzZVwiLCBpbXBvcnQubWV0YS51cmwpO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8xNV9fXyA9IG5ldyBVUkwoXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNjc3ZnIHhtbG5zPSUyN2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJTI3IHZpZXdCb3g9JTI3MCAwIDE2IDE2JTI3IGZpbGw9JTI3JTIzNmVhOGZlJTI3JTNlJTNjcGF0aCBmaWxsLXJ1bGU9JTI3ZXZlbm9kZCUyNyBkPSUyN00xLjY0NiA0LjY0NmEuNS41IDAgMCAxIC43MDggMEw4IDEwLjI5M2w1LjY0Ni01LjY0N2EuNS41IDAgMCAxIC43MDguNzA4bC02IDZhLjUuNSAwIDAgMS0uNzA4IDBsLTYtNmEuNS41IDAgMCAxIDAtLjcwOHolMjcvJTNlJTNjL3N2ZyUzZVwiLCBpbXBvcnQubWV0YS51cmwpO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8xNl9fXyA9IG5ldyBVUkwoXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNjc3ZnIHhtbG5zPSUyN2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJTI3IHZpZXdCb3g9JTI3MCAwIDE2IDE2JTI3IGZpbGw9JTI3JTIzMDAwJTI3JTNlJTNjcGF0aCBkPSUyN00uMjkzLjI5M2ExIDEgMCAwIDEgMS40MTQgMEw4IDYuNTg2IDE0LjI5My4yOTNhMSAxIDAgMSAxIDEuNDE0IDEuNDE0TDkuNDE0IDhsNi4yOTMgNi4yOTNhMSAxIDAgMCAxLTEuNDE0IDEuNDE0TDggOS40MTRsLTYuMjkzIDYuMjkzYTEgMSAwIDAgMS0xLjQxNC0xLjQxNEw2LjU4NiA4IC4yOTMgMS43MDdhMSAxIDAgMCAxIDAtMS40MTR6JTI3LyUzZSUzYy9zdmclM2VcIiwgaW1wb3J0Lm1ldGEudXJsKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfMTdfX18gPSBuZXcgVVJMKFwiZGF0YTppbWFnZS9zdmcreG1sLCUzY3N2ZyB4bWxucz0lMjdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyUyNyB2aWV3Qm94PSUyNzAgMCAxNiAxNiUyNyBmaWxsPSUyNyUyM2ZmZiUyNyUzZSUzY3BhdGggZD0lMjdNMTEuMzU0IDEuNjQ2YS41LjUgMCAwIDEgMCAuNzA4TDUuNzA3IDhsNS42NDcgNS42NDZhLjUuNSAwIDAgMS0uNzA4LjcwOGwtNi02YS41LjUgMCAwIDEgMC0uNzA4bDYtNmEuNS41IDAgMCAxIC43MDggMHolMjcvJTNlJTNjL3N2ZyUzZVwiLCBpbXBvcnQubWV0YS51cmwpO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8xOF9fXyA9IG5ldyBVUkwoXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNjc3ZnIHhtbG5zPSUyN2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJTI3IHZpZXdCb3g9JTI3MCAwIDE2IDE2JTI3IGZpbGw9JTI3JTIzZmZmJTI3JTNlJTNjcGF0aCBkPSUyN000LjY0NiAxLjY0NmEuNS41IDAgMCAxIC43MDggMGw2IDZhLjUuNSAwIDAgMSAwIC43MDhsLTYgNmEuNS41IDAgMCAxLS43MDgtLjcwOEwxMC4yOTMgOCA0LjY0NiAyLjM1NGEuNS41IDAgMCAxIDAtLjcwOHolMjcvJTNlJTNjL3N2ZyUzZVwiLCBpbXBvcnQubWV0YS51cmwpO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzBfX18gPSBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8wX19fKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8xX19fID0gX19fQ1NTX0xPQURFUl9HRVRfVVJMX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfMV9fXyk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMl9fXyA9IF9fX0NTU19MT0FERVJfR0VUX1VSTF9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzJfX18pO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzNfX18gPSBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8zX19fKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF80X19fID0gX19fQ1NTX0xPQURFUl9HRVRfVVJMX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfNF9fXyk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfNV9fXyA9IF9fX0NTU19MT0FERVJfR0VUX1VSTF9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzVfX18pO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzZfX18gPSBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF82X19fKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF83X19fID0gX19fQ1NTX0xPQURFUl9HRVRfVVJMX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfN19fXyk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfOF9fXyA9IF9fX0NTU19MT0FERVJfR0VUX1VSTF9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzhfX18pO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzlfX18gPSBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF85X19fKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8xMF9fXyA9IF9fX0NTU19MT0FERVJfR0VUX1VSTF9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzEwX19fKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8xMV9fXyA9IF9fX0NTU19MT0FERVJfR0VUX1VSTF9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzExX19fKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8xMl9fXyA9IF9fX0NTU19MT0FERVJfR0VUX1VSTF9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzEyX19fKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8xM19fXyA9IF9fX0NTU19MT0FERVJfR0VUX1VSTF9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzEzX19fKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8xNF9fXyA9IF9fX0NTU19MT0FERVJfR0VUX1VSTF9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzE0X19fKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8xNV9fXyA9IF9fX0NTU19MT0FERVJfR0VUX1VSTF9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzE1X19fKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8xNl9fXyA9IF9fX0NTU19MT0FERVJfR0VUX1VSTF9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzE2X19fKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8xN19fXyA9IF9fX0NTU19MT0FERVJfR0VUX1VSTF9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzE3X19fKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8xOF9fXyA9IF9fX0NTU19MT0FERVJfR0VUX1VSTF9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzE4X19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgLmdyaWQtdGl0bGV7bWFyZ2luLWxlZnQ6NXB4O21hcmdpbi10b3A6MnB4fSosKjo6YmVmb3JlLCo6OmFmdGVye2JveC1zaXppbmc6Ym9yZGVyLWJveH0uY2FyZHtwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5Oi1tcy1mbGV4Ym94O2Rpc3BsYXk6ZmxleDstbXMtZmxleC1kaXJlY3Rpb246Y29sdW1uO2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttaW4td2lkdGg6MDt3b3JkLXdyYXA6YnJlYWstd29yZDtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7YmFja2dyb3VuZC1jbGlwOmJvcmRlci1ib3g7Ym9yZGVyOjFweCBzb2xpZCByZ2JhKDAsMCwwLDAuMTI1KTtib3JkZXItcmFkaXVzOjAuMjVyZW19LmNhcmQ+aHJ7bWFyZ2luLXJpZ2h0OjA7bWFyZ2luLWxlZnQ6MH0uY2FyZD4ubGlzdC1ncm91cDpmaXJzdC1jaGlsZCAubGlzdC1ncm91cC1pdGVtOmZpcnN0LWNoaWxke2JvcmRlci10b3AtbGVmdC1yYWRpdXM6MC4yNXJlbTtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czowLjI1cmVtfS5jYXJkPi5saXN0LWdyb3VwOmxhc3QtY2hpbGQgLmxpc3QtZ3JvdXAtaXRlbTpsYXN0LWNoaWxke2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjAuMjVyZW07Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czowLjI1cmVtfS5jYXJkLWJvZHl7LW1zLWZsZXg6MSAxIGF1dG87ZmxleDoxIDEgYXV0bzttaW4taGVpZ2h0OjFweDtwYWRkaW5nOjEuMjVyZW19LmNhcmQtdGl0bGV7bWFyZ2luLWJvdHRvbTowLjc1cmVtfS5jYXJkLXN1YnRpdGxle21hcmdpbi10b3A6LTAuMzc1cmVtO21hcmdpbi1ib3R0b206MH0uY2FyZC10ZXh0Omxhc3QtY2hpbGR7bWFyZ2luLWJvdHRvbTowfS5jYXJkLWxpbms6aG92ZXJ7dGV4dC1kZWNvcmF0aW9uOm5vbmV9LmNhcmQtbGluaysuY2FyZC1saW5re21hcmdpbi1sZWZ0OjEuMjVyZW19LmNhcmQtaGVhZGVye3BhZGRpbmc6MC43NXJlbSAxLjI1cmVtO21hcmdpbi1ib3R0b206MDtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsMC4wMyk7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgcmdiYSgwLDAsMCwwLjEyNSl9LmNhcmQtaGVhZGVyOmZpcnN0LWNoaWxke2JvcmRlci1yYWRpdXM6Y2FsYygwLjI1cmVtIC0gMXB4KSBjYWxjKDAuMjVyZW0gLSAxcHgpIDAgMH0uY2FyZC1oZWFkZXIrLmxpc3QtZ3JvdXAgLmxpc3QtZ3JvdXAtaXRlbTpmaXJzdC1jaGlsZHtib3JkZXItdG9wOjB9LmNhcmQtZm9vdGVye3BhZGRpbmc6MC43NXJlbSAxLjI1cmVtO2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwwLjAzKTtib3JkZXItdG9wOjFweCBzb2xpZCByZ2JhKDAsMCwwLDAuMTI1KX0uY2FyZC1mb290ZXI6bGFzdC1jaGlsZHtib3JkZXItcmFkaXVzOjAgMCBjYWxjKDAuMjVyZW0gLSAxcHgpIGNhbGMoMC4yNXJlbSAtIDFweCl9LmNhcmQtaGVhZGVyLXRhYnN7bWFyZ2luLXJpZ2h0Oi0wLjYyNXJlbTttYXJnaW4tYm90dG9tOi0wLjc1cmVtO21hcmdpbi1sZWZ0Oi0wLjYyNXJlbTtib3JkZXItYm90dG9tOjB9LmNhcmQtaGVhZGVyLXBpbGxze21hcmdpbi1yaWdodDotMC42MjVyZW07bWFyZ2luLWxlZnQ6LTAuNjI1cmVtfS5jYXJkLWltZy1vdmVybGF5e3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO3JpZ2h0OjA7Ym90dG9tOjA7bGVmdDowO3BhZGRpbmc6MS4yNXJlbX0uY2FyZC1pbWcsLmNhcmQtaW1nLXRvcCwuY2FyZC1pbWctYm90dG9tey1tcy1mbGV4LW5lZ2F0aXZlOjA7ZmxleC1zaHJpbms6MDt3aWR0aDoxMDAlfS5jYXJkLWltZywuY2FyZC1pbWctdG9we2JvcmRlci10b3AtbGVmdC1yYWRpdXM6Y2FsYygwLjI1cmVtIC0gMXB4KTtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czpjYWxjKDAuMjVyZW0gLSAxcHgpfS5jYXJkLWltZywuY2FyZC1pbWctYm90dG9te2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOmNhbGMoMC4yNXJlbSAtIDFweCk7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czpjYWxjKDAuMjVyZW0gLSAxcHgpfS5jYXJkLWRlY2sgLmNhcmR7bWFyZ2luLWJvdHRvbToxNXB4fUBtZWRpYSAobWluLXdpZHRoOiA1NzZweCl7LmNhcmQtZGVja3tkaXNwbGF5Oi1tcy1mbGV4Ym94O2Rpc3BsYXk6ZmxleDstbXMtZmxleC1mbG93OnJvdyB3cmFwO2ZsZXgtZmxvdzpyb3cgd3JhcDttYXJnaW4tcmlnaHQ6LTE1cHg7bWFyZ2luLWxlZnQ6LTE1cHh9LmNhcmQtZGVjayAuY2FyZHstbXMtZmxleDoxIDAgMCU7ZmxleDoxIDAgMCU7bWFyZ2luLXJpZ2h0OjE1cHg7bWFyZ2luLWJvdHRvbTowO21hcmdpbi1sZWZ0OjE1cHh9fS5jYXJkLWdyb3VwPi5jYXJke21hcmdpbi1ib3R0b206MTVweH1AbWVkaWEgKG1pbi13aWR0aDogNTc2cHgpey5jYXJkLWdyb3Vwe2Rpc3BsYXk6LW1zLWZsZXhib3g7ZGlzcGxheTpmbGV4Oy1tcy1mbGV4LWZsb3c6cm93IHdyYXA7ZmxleC1mbG93OnJvdyB3cmFwfS5jYXJkLWdyb3VwPi5jYXJkey1tcy1mbGV4OjEgMCAwJTtmbGV4OjEgMCAwJTttYXJnaW4tYm90dG9tOjB9LmNhcmQtZ3JvdXA+LmNhcmQrLmNhcmR7bWFyZ2luLWxlZnQ6MDtib3JkZXItbGVmdDowfS5jYXJkLWdyb3VwPi5jYXJkOm5vdCg6bGFzdC1jaGlsZCl7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6MDtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czowfS5jYXJkLWdyb3VwPi5jYXJkOm5vdCg6bGFzdC1jaGlsZCkgLmNhcmQtaW1nLXRvcCwuY2FyZC1ncm91cD4uY2FyZDpub3QoOmxhc3QtY2hpbGQpIC5jYXJkLWhlYWRlcntib3JkZXItdG9wLXJpZ2h0LXJhZGl1czowfS5jYXJkLWdyb3VwPi5jYXJkOm5vdCg6bGFzdC1jaGlsZCkgLmNhcmQtaW1nLWJvdHRvbSwuY2FyZC1ncm91cD4uY2FyZDpub3QoOmxhc3QtY2hpbGQpIC5jYXJkLWZvb3Rlcntib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czowfS5jYXJkLWdyb3VwPi5jYXJkOm5vdCg6Zmlyc3QtY2hpbGQpe2JvcmRlci10b3AtbGVmdC1yYWRpdXM6MDtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjB9LmNhcmQtZ3JvdXA+LmNhcmQ6bm90KDpmaXJzdC1jaGlsZCkgLmNhcmQtaW1nLXRvcCwuY2FyZC1ncm91cD4uY2FyZDpub3QoOmZpcnN0LWNoaWxkKSAuY2FyZC1oZWFkZXJ7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czowfS5jYXJkLWdyb3VwPi5jYXJkOm5vdCg6Zmlyc3QtY2hpbGQpIC5jYXJkLWltZy1ib3R0b20sLmNhcmQtZ3JvdXA+LmNhcmQ6bm90KDpmaXJzdC1jaGlsZCkgLmNhcmQtZm9vdGVye2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6MH19LmZvcm0tY29udHJvbHtkaXNwbGF5OmJsb2NrO3dpZHRoOjEwMCU7aGVpZ2h0OmNhbGMoMS41ZW0gKyAwLjc1cmVtICsgMnB4KTtwYWRkaW5nOjAuMzc1cmVtIDAuNzVyZW07Zm9udC1zaXplOjFyZW07Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuNTtjb2xvcjojNDk1MDU3O2JhY2tncm91bmQtY29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNsaXA6cGFkZGluZy1ib3g7Ym9yZGVyOjFweCBzb2xpZCAjY2VkNGRhO2JvcmRlci1yYWRpdXM6MC4yNXJlbTt0cmFuc2l0aW9uOmJvcmRlci1jb2xvciAwLjE1cyBlYXNlLWluLW91dCwgYm94LXNoYWRvdyAwLjE1cyBlYXNlLWluLW91dH1AbWVkaWEgKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZSl7LmZvcm0tY29udHJvbHt0cmFuc2l0aW9uOm5vbmV9fS5mb3JtLWNvbnRyb2w6Oi1tcy1leHBhbmR7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDtib3JkZXI6MH0uZm9ybS1jb250cm9sOi1tb3otZm9jdXNyaW5ne2NvbG9yOnRyYW5zcGFyZW50O3RleHQtc2hhZG93OjAgMCAwICM0OTUwNTd9LmZvcm0tY29udHJvbDpmb2N1c3tjb2xvcjojNDk1MDU3O2JhY2tncm91bmQtY29sb3I6I2ZmZjtib3JkZXItY29sb3I6IzgwYmRmZjtvdXRsaW5lOjA7Ym94LXNoYWRvdzowIDAgMCAwLjJyZW0gcmdiYSgwLDEyMywyNTUsMC4yNSl9LmZvcm0tY29udHJvbDo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlcntjb2xvcjojNmM3NTdkO29wYWNpdHk6MX0uZm9ybS1jb250cm9sOjotbW96LXBsYWNlaG9sZGVye2NvbG9yOiM2Yzc1N2Q7b3BhY2l0eToxfS5mb3JtLWNvbnRyb2w6LW1zLWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOiM2Yzc1N2Q7b3BhY2l0eToxfS5mb3JtLWNvbnRyb2w6Oi1tcy1pbnB1dC1wbGFjZWhvbGRlcntjb2xvcjojNmM3NTdkO29wYWNpdHk6MX0uZm9ybS1jb250cm9sOjpwbGFjZWhvbGRlcntjb2xvcjojNmM3NTdkO29wYWNpdHk6MX0uZm9ybS1jb250cm9sOmRpc2FibGVkLC5mb3JtLWNvbnRyb2xbcmVhZG9ubHlde2JhY2tncm91bmQtY29sb3I6I2U5ZWNlZjtvcGFjaXR5OjF9c2VsZWN0LmZvcm0tY29udHJvbDpmb2N1czo6LW1zLXZhbHVle2NvbG9yOiM0OTUwNTc7YmFja2dyb3VuZC1jb2xvcjojZmZmfS5mb3JtLWNvbnRyb2wtZmlsZSwuZm9ybS1jb250cm9sLXJhbmdle2Rpc3BsYXk6YmxvY2s7d2lkdGg6MTAwJX10ZXh0YXJlYS5mb3JtLWNvbnRyb2x7aGVpZ2h0OmF1dG99LyohXG4gICAqIEJvb3RzdHJhcCAgdjUuMy4yIChodHRwczovL2dldGJvb3RzdHJhcC5jb20vKVxuICAgKiBDb3B5cmlnaHQgMjAxMS0yMDIzIFRoZSBCb290c3RyYXAgQXV0aG9yc1xuICAgKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAgICovOnJvb3QsW2RhdGEtYnMtdGhlbWU9XCJsaWdodFwiXXstLWJzLWJsdWU6ICMwZDZlZmQ7LS1icy1pbmRpZ286ICM2NjEwZjI7LS1icy1wdXJwbGU6ICM2ZjQyYzE7LS1icy1waW5rOiAjZDYzMzg0Oy0tYnMtcmVkOiAjZGMzNTQ1Oy0tYnMtb3JhbmdlOiAjZmQ3ZTE0Oy0tYnMteWVsbG93OiAjZmZjMTA3Oy0tYnMtZ3JlZW46ICMxOTg3NTQ7LS1icy10ZWFsOiAjMjBjOTk3Oy0tYnMtY3lhbjogIzBkY2FmMDstLWJzLWJsYWNrOiAjMDAwOy0tYnMtd2hpdGU6ICNmZmY7LS1icy1ncmF5OiAjNmM3NTdkOy0tYnMtZ3JheS1kYXJrOiAjMzQzYTQwOy0tYnMtZ3JheS0xMDA6ICNmOGY5ZmE7LS1icy1ncmF5LTIwMDogI2U5ZWNlZjstLWJzLWdyYXktMzAwOiAjZGVlMmU2Oy0tYnMtZ3JheS00MDA6ICNjZWQ0ZGE7LS1icy1ncmF5LTUwMDogI2FkYjViZDstLWJzLWdyYXktNjAwOiAjNmM3NTdkOy0tYnMtZ3JheS03MDA6ICM0OTUwNTc7LS1icy1ncmF5LTgwMDogIzM0M2E0MDstLWJzLWdyYXktOTAwOiAjMjEyNTI5Oy0tYnMtcHJpbWFyeTogIzNmNTFiNTstLWJzLXByaW1hcnktcmdiOiA2Myw4MSwxODE7LS1icy1wcmltYXJ5LXRleHQtZW1waGFzaXM6ICMwNTJjNjU7LS1icy1zZWNvbmRhcnktdGV4dC1lbXBoYXNpczogIzJiMmYzMjstLWJzLXN1Y2Nlc3MtdGV4dC1lbXBoYXNpczogIzBhMzYyMjstLWJzLWluZm8tdGV4dC1lbXBoYXNpczogIzA1NTE2MDstLWJzLXdhcm5pbmctdGV4dC1lbXBoYXNpczogIzY2NGQwMzstLWJzLWRhbmdlci10ZXh0LWVtcGhhc2lzOiAjNTgxNTFjOy0tYnMtbGlnaHQtdGV4dC1lbXBoYXNpczogIzQ5NTA1NzstLWJzLWRhcmstdGV4dC1lbXBoYXNpczogIzQ5NTA1NzstLWJzLXByaW1hcnktYmctc3VidGxlOiAjY2ZlMmZmOy0tYnMtc2Vjb25kYXJ5LWJnLXN1YnRsZTogI2UyZTNlNTstLWJzLXN1Y2Nlc3MtYmctc3VidGxlOiAjZDFlN2RkOy0tYnMtaW5mby1iZy1zdWJ0bGU6ICNjZmY0ZmM7LS1icy13YXJuaW5nLWJnLXN1YnRsZTogI2ZmZjNjZDstLWJzLWRhbmdlci1iZy1zdWJ0bGU6ICNmOGQ3ZGE7LS1icy1saWdodC1iZy1zdWJ0bGU6ICNmY2ZjZmQ7LS1icy1kYXJrLWJnLXN1YnRsZTogI2NlZDRkYTstLWJzLXByaW1hcnktYm9yZGVyLXN1YnRsZTogIzllYzVmZTstLWJzLXNlY29uZGFyeS1ib3JkZXItc3VidGxlOiAjYzRjOGNiOy0tYnMtc3VjY2Vzcy1ib3JkZXItc3VidGxlOiAjYTNjZmJiOy0tYnMtaW5mby1ib3JkZXItc3VidGxlOiAjOWVlYWY5Oy0tYnMtd2FybmluZy1ib3JkZXItc3VidGxlOiAjZmZlNjljOy0tYnMtZGFuZ2VyLWJvcmRlci1zdWJ0bGU6ICNmMWFlYjU7LS1icy1saWdodC1ib3JkZXItc3VidGxlOiAjZTllY2VmOy0tYnMtZGFyay1ib3JkZXItc3VidGxlOiAjYWRiNWJkOy0tYnMtd2hpdGUtcmdiOiAyNTUsMjU1LDI1NTstLWJzLWJsYWNrLXJnYjogMCwwLDA7LS1icy1mb250LXNhbnMtc2VyaWY6IHN5c3RlbS11aSwgLWFwcGxlLXN5c3RlbSwgXCJTZWdvZSBVSVwiLCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgXCJOb3RvIFNhbnNcIiwgXCJMaWJlcmF0aW9uIFNhbnNcIiwgQXJpYWwsIHNhbnMtc2VyaWYsIFwiQXBwbGUgQ29sb3IgRW1vamlcIiwgXCJTZWdvZSBVSSBFbW9qaVwiLCBcIlNlZ29lIFVJIFN5bWJvbFwiLCBcIk5vdG8gQ29sb3IgRW1vamlcIjstLWJzLWZvbnQtbW9ub3NwYWNlOiBTRk1vbm8tUmVndWxhciwgTWVubG8sIE1vbmFjbywgQ29uc29sYXMsIFwiTGliZXJhdGlvbiBNb25vXCIsIFwiQ291cmllciBOZXdcIiwgbW9ub3NwYWNlOy0tYnMtZ3JhZGllbnQ6IGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMjU1LDI1NSwyNTUsMC4xNSksIHJnYmEoMjU1LDI1NSwyNTUsMCkpOy0tYnMtYm9keS1mb250LWZhbWlseTogdmFyKC0tYnMtZm9udC1zYW5zLXNlcmlmKTstLWJzLWJvZHktZm9udC1zaXplOjFyZW07LS1icy1ib2R5LWZvbnQtd2VpZ2h0OiA0MDA7LS1icy1ib2R5LWxpbmUtaGVpZ2h0OiAxLjU7LS1icy1ib2R5LWNvbG9yOiAjMjEyNTI5Oy0tYnMtYm9keS1jb2xvci1yZ2I6IDMzLDM3LDQxOy0tYnMtYm9keS1iZzogI2ZmZjstLWJzLWJvZHktYmctcmdiOiAyNTUsMjU1LDI1NTstLWJzLWVtcGhhc2lzLWNvbG9yOiAjMDAwOy0tYnMtZW1waGFzaXMtY29sb3ItcmdiOiAwLDAsMDstLWJzLXNlY29uZGFyeS1jb2xvcjogcmdiYSgzMywzNyw0MSwwLjc1KTstLWJzLXNlY29uZGFyeS1jb2xvci1yZ2I6IDMzLDM3LDQxOy0tYnMtc2Vjb25kYXJ5LWJnOiAjZTllY2VmOy0tYnMtc2Vjb25kYXJ5LWJnLXJnYjogMjMzLDIzNiwyMzk7LS1icy10ZXJ0aWFyeS1jb2xvcjogcmdiYSgzMywzNyw0MSwwLjUpOy0tYnMtdGVydGlhcnktY29sb3ItcmdiOiAzMywzNyw0MTstLWJzLXRlcnRpYXJ5LWJnOiAjZjhmOWZhOy0tYnMtdGVydGlhcnktYmctcmdiOiAyNDgsMjQ5LDI1MDstLWJzLWhlYWRpbmctY29sb3I6IGluaGVyaXQ7LS1icy1saW5rLWNvbG9yOiAjMGQ2ZWZkOy0tYnMtbGluay1jb2xvci1yZ2I6IDEzLDExMCwyNTM7LS1icy1saW5rLWRlY29yYXRpb246IHVuZGVybGluZTstLWJzLWxpbmstaG92ZXItY29sb3I6ICMwYTU4Y2E7LS1icy1saW5rLWhvdmVyLWNvbG9yLXJnYjogMTAsODgsMjAyOy0tYnMtY29kZS1jb2xvcjogI2Q2MzM4NDstLWJzLWhpZ2hsaWdodC1jb2xvcjogIzIxMjUyOTstLWJzLWhpZ2hsaWdodC1iZzogI2ZmZjNjZDstLWJzLWJvcmRlci13aWR0aDogMXB4Oy0tYnMtYm9yZGVyLXN0eWxlOiBzb2xpZDstLWJzLWJvcmRlci1jb2xvcjogI2RlZTJlNjstLWJzLWJvcmRlci1jb2xvci10cmFuc2x1Y2VudDogcmdiYSgwLDAsMCwwLjE3NSk7LS1icy1ib3JkZXItcmFkaXVzOiAuMzc1cmVtOy0tYnMtYm9yZGVyLXJhZGl1cy1zbTogLjI1cmVtOy0tYnMtYm9yZGVyLXJhZGl1cy1sZzogLjVyZW07LS1icy1ib3JkZXItcmFkaXVzLXhsOiAxcmVtOy0tYnMtYm9yZGVyLXJhZGl1cy14eGw6IDJyZW07LS1icy1ib3JkZXItcmFkaXVzLTJ4bDogdmFyKC0tYnMtYm9yZGVyLXJhZGl1cy14eGwpOy0tYnMtYm9yZGVyLXJhZGl1cy1waWxsOiA1MHJlbTstLWJzLWJveC1zaGFkb3c6IDAgMC41cmVtIDFyZW0gcmdiYSgwLDAsMCwwLjE1KTstLWJzLWJveC1zaGFkb3ctc206IDAgMC4xMjVyZW0gMC4yNXJlbSByZ2JhKDAsMCwwLDAuMDc1KTstLWJzLWJveC1zaGFkb3ctbGc6IDAgMXJlbSAzcmVtIHJnYmEoMCwwLDAsMC4xNzUpOy0tYnMtYm94LXNoYWRvdy1pbnNldDogaW5zZXQgMCAxcHggMnB4IHJnYmEoMCwwLDAsMC4wNzUpOy0tYnMtZm9jdXMtcmluZy13aWR0aDogLjI1cmVtOy0tYnMtZm9jdXMtcmluZy1vcGFjaXR5OiAuMjU7LS1icy1mb2N1cy1yaW5nLWNvbG9yOiByZ2JhKDEzLDExMCwyNTMsMC4yNSk7LS1icy1mb3JtLXZhbGlkLWNvbG9yOiAjMTk4NzU0Oy0tYnMtZm9ybS12YWxpZC1ib3JkZXItY29sb3I6ICMxOTg3NTQ7LS1icy1mb3JtLWludmFsaWQtY29sb3I6ICNkYzM1NDU7LS1icy1mb3JtLWludmFsaWQtYm9yZGVyLWNvbG9yOiAjZGMzNTQ1fVtkYXRhLWJzLXRoZW1lPVwiZGFya1wiXXtjb2xvci1zY2hlbWU6ZGFyazstLWJzLWJvZHktY29sb3I6ICNkZWUyZTY7LS1icy1ib2R5LWNvbG9yLXJnYjogMjIyLDIyNiwyMzA7LS1icy1ib2R5LWJnOiAjMjEyNTI5Oy0tYnMtYm9keS1iZy1yZ2I6IDMzLDM3LDQxOy0tYnMtZW1waGFzaXMtY29sb3I6ICNmZmY7LS1icy1lbXBoYXNpcy1jb2xvci1yZ2I6IDI1NSwyNTUsMjU1Oy0tYnMtc2Vjb25kYXJ5LWNvbG9yOiByZ2JhKDIyMiwyMjYsMjMwLDAuNzUpOy0tYnMtc2Vjb25kYXJ5LWNvbG9yLXJnYjogMjIyLDIyNiwyMzA7LS1icy1zZWNvbmRhcnktYmc6ICMzNDNhNDA7LS1icy1zZWNvbmRhcnktYmctcmdiOiA1Miw1OCw2NDstLWJzLXRlcnRpYXJ5LWNvbG9yOiByZ2JhKDIyMiwyMjYsMjMwLDAuNSk7LS1icy10ZXJ0aWFyeS1jb2xvci1yZ2I6IDIyMiwyMjYsMjMwOy0tYnMtdGVydGlhcnktYmc6ICMyYjMwMzU7LS1icy10ZXJ0aWFyeS1iZy1yZ2I6IDQzLDQ4LDUzOy0tYnMtcHJpbWFyeS10ZXh0LWVtcGhhc2lzOiAjNmVhOGZlOy0tYnMtc2Vjb25kYXJ5LXRleHQtZW1waGFzaXM6ICNhN2FjYjE7LS1icy1zdWNjZXNzLXRleHQtZW1waGFzaXM6ICM3NWI3OTg7LS1icy1pbmZvLXRleHQtZW1waGFzaXM6ICM2ZWRmZjY7LS1icy13YXJuaW5nLXRleHQtZW1waGFzaXM6ICNmZmRhNmE7LS1icy1kYW5nZXItdGV4dC1lbXBoYXNpczogI2VhODY4ZjstLWJzLWxpZ2h0LXRleHQtZW1waGFzaXM6ICNmOGY5ZmE7LS1icy1kYXJrLXRleHQtZW1waGFzaXM6ICNkZWUyZTY7LS1icy1wcmltYXJ5LWJnLXN1YnRsZTogIzAzMTYzMzstLWJzLXNlY29uZGFyeS1iZy1zdWJ0bGU6ICMxNjE3MTk7LS1icy1zdWNjZXNzLWJnLXN1YnRsZTogIzA1MWIxMTstLWJzLWluZm8tYmctc3VidGxlOiAjMDMyODMwOy0tYnMtd2FybmluZy1iZy1zdWJ0bGU6ICMzMzI3MDE7LS1icy1kYW5nZXItYmctc3VidGxlOiAjMmMwYjBlOy0tYnMtbGlnaHQtYmctc3VidGxlOiAjMzQzYTQwOy0tYnMtZGFyay1iZy1zdWJ0bGU6ICMxYTFkMjA7LS1icy1wcmltYXJ5LWJvcmRlci1zdWJ0bGU6ICMwODQyOTg7LS1icy1zZWNvbmRhcnktYm9yZGVyLXN1YnRsZTogIzQxNDY0YjstLWJzLXN1Y2Nlc3MtYm9yZGVyLXN1YnRsZTogIzBmNTEzMjstLWJzLWluZm8tYm9yZGVyLXN1YnRsZTogIzA4Nzk5MDstLWJzLXdhcm5pbmctYm9yZGVyLXN1YnRsZTogIzk5NzQwNDstLWJzLWRhbmdlci1ib3JkZXItc3VidGxlOiAjODQyMDI5Oy0tYnMtbGlnaHQtYm9yZGVyLXN1YnRsZTogIzQ5NTA1NzstLWJzLWRhcmstYm9yZGVyLXN1YnRsZTogIzM0M2E0MDstLWJzLWhlYWRpbmctY29sb3I6IGluaGVyaXQ7LS1icy1saW5rLWNvbG9yOiAjNmVhOGZlOy0tYnMtbGluay1ob3Zlci1jb2xvcjogIzhiYjlmZTstLWJzLWxpbmstY29sb3ItcmdiOiAxMTAsMTY4LDI1NDstLWJzLWxpbmstaG92ZXItY29sb3ItcmdiOiAxMzksMTg1LDI1NDstLWJzLWNvZGUtY29sb3I6ICNlNjg1YjU7LS1icy1oaWdobGlnaHQtY29sb3I6ICNkZWUyZTY7LS1icy1oaWdobGlnaHQtYmc6ICM2NjRkMDM7LS1icy1ib3JkZXItY29sb3I6ICM0OTUwNTc7LS1icy1ib3JkZXItY29sb3ItdHJhbnNsdWNlbnQ6IHJnYmEoMjU1LDI1NSwyNTUsMC4xNSk7LS1icy1mb3JtLXZhbGlkLWNvbG9yOiAjNzViNzk4Oy0tYnMtZm9ybS12YWxpZC1ib3JkZXItY29sb3I6ICM3NWI3OTg7LS1icy1mb3JtLWludmFsaWQtY29sb3I6ICNlYTg2OGY7LS1icy1mb3JtLWludmFsaWQtYm9yZGVyLWNvbG9yOiAjZWE4NjhmfSosKjo6YmVmb3JlLCo6OmFmdGVye2JveC1zaXppbmc6Ym9yZGVyLWJveH1AbWVkaWEgKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IG5vLXByZWZlcmVuY2Upezpyb290e3Njcm9sbC1iZWhhdmlvcjpzbW9vdGh9fWJvZHl7bWFyZ2luOjA7Zm9udC1mYW1pbHk6dmFyKC0tYnMtYm9keS1mb250LWZhbWlseSk7Zm9udC1zaXplOnZhcigtLWJzLWJvZHktZm9udC1zaXplKTtmb250LXdlaWdodDp2YXIoLS1icy1ib2R5LWZvbnQtd2VpZ2h0KTtsaW5lLWhlaWdodDp2YXIoLS1icy1ib2R5LWxpbmUtaGVpZ2h0KTtjb2xvcjp2YXIoLS1icy1ib2R5LWNvbG9yKTt0ZXh0LWFsaWduOnZhcigtLWJzLWJvZHktdGV4dC1hbGlnbik7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1icy1ib2R5LWJnKTstd2Via2l0LXRleHQtc2l6ZS1hZGp1c3Q6MTAwJTstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6cmdiYSgwLDAsMCwwKX1ocnttYXJnaW46MXJlbSAwO2NvbG9yOmluaGVyaXQ7Ym9yZGVyOjA7Ym9yZGVyLXRvcDp2YXIoLS1icy1ib3JkZXItd2lkdGgpIHNvbGlkO29wYWNpdHk6LjI1fWgxLC5oMSxoMiwuaDIsaDMsLmgzLGg0LC5oNCxoNSwuaDUsaDYsLmg2e21hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOi41cmVtO2ZvbnQtd2VpZ2h0OjUwMDtsaW5lLWhlaWdodDoxLjI7Y29sb3I6dmFyKC0tYnMtaGVhZGluZy1jb2xvcil9aDEsLmgxe2ZvbnQtc2l6ZTpjYWxjKDEuMzc1cmVtICsgMS41dncpfUBtZWRpYSAobWluLXdpZHRoOiAxMjAwcHgpe2gxLC5oMXtmb250LXNpemU6Mi41cmVtfX1oMiwuaDJ7Zm9udC1zaXplOmNhbGMoMS4zMjVyZW0gKyAuOXZ3KX1AbWVkaWEgKG1pbi13aWR0aDogMTIwMHB4KXtoMiwuaDJ7Zm9udC1zaXplOjJyZW19fWgzLC5oM3tmb250LXNpemU6Y2FsYygxLjNyZW0gKyAuNnZ3KX1AbWVkaWEgKG1pbi13aWR0aDogMTIwMHB4KXtoMywuaDN7Zm9udC1zaXplOjEuNzVyZW19fWg0LC5oNHtmb250LXNpemU6Y2FsYygxLjI3NXJlbSArIC4zdncpfUBtZWRpYSAobWluLXdpZHRoOiAxMjAwcHgpe2g0LC5oNHtmb250LXNpemU6MS41cmVtfX1oNSwuaDV7Zm9udC1zaXplOjEuMjVyZW19aDYsLmg2e2ZvbnQtc2l6ZToxcmVtfXB7bWFyZ2luLXRvcDowO21hcmdpbi1ib3R0b206MXJlbX1hYmJyW3RpdGxlXXt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lIGRvdHRlZDtjdXJzb3I6aGVscDt0ZXh0LWRlY29yYXRpb24tc2tpcC1pbms6bm9uZX1hZGRyZXNze21hcmdpbi1ib3R0b206MXJlbTtmb250LXN0eWxlOm5vcm1hbDtsaW5lLWhlaWdodDppbmhlcml0fW9sLHVse3BhZGRpbmctbGVmdDoycmVtfW9sLHVsLGRse21hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjFyZW19b2wgb2wsdWwgdWwsb2wgdWwsdWwgb2x7bWFyZ2luLWJvdHRvbTowfWR0e2ZvbnQtd2VpZ2h0OjcwMH1kZHttYXJnaW4tYm90dG9tOi41cmVtO21hcmdpbi1sZWZ0OjB9YmxvY2txdW90ZXttYXJnaW46MCAwIDFyZW19YixzdHJvbmd7Zm9udC13ZWlnaHQ6Ym9sZGVyfXNtYWxsLC5zbWFsbHtmb250LXNpemU6Ljg3NWVtfW1hcmssLm1hcmt7cGFkZGluZzouMTg3NWVtO2NvbG9yOnZhcigtLWJzLWhpZ2hsaWdodC1jb2xvcik7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1icy1oaWdobGlnaHQtYmcpfXN1YixzdXB7cG9zaXRpb246cmVsYXRpdmU7Zm9udC1zaXplOi43NWVtO2xpbmUtaGVpZ2h0OjA7dmVydGljYWwtYWxpZ246YmFzZWxpbmV9c3Vie2JvdHRvbTotLjI1ZW19c3Vwe3RvcDotLjVlbX1he2NvbG9yOnJnYmEodmFyKC0tYnMtbGluay1jb2xvci1yZ2IpLCB2YXIoLS1icy1saW5rLW9wYWNpdHksIDEpKTt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lfWE6aG92ZXJ7LS1icy1saW5rLWNvbG9yLXJnYjogdmFyKC0tYnMtbGluay1ob3Zlci1jb2xvci1yZ2IpfWE6bm90KFtocmVmXSk6bm90KFtjbGFzc10pLGE6bm90KFtocmVmXSk6bm90KFtjbGFzc10pOmhvdmVye2NvbG9yOmluaGVyaXQ7dGV4dC1kZWNvcmF0aW9uOm5vbmV9cHJlLGNvZGUsa2JkLHNhbXB7Zm9udC1mYW1pbHk6dmFyKC0tYnMtZm9udC1tb25vc3BhY2UpO2ZvbnQtc2l6ZToxZW19cHJle2Rpc3BsYXk6YmxvY2s7bWFyZ2luLXRvcDowO21hcmdpbi1ib3R0b206MXJlbTtvdmVyZmxvdzphdXRvO2ZvbnQtc2l6ZTouODc1ZW19cHJlIGNvZGV7Zm9udC1zaXplOmluaGVyaXQ7Y29sb3I6aW5oZXJpdDt3b3JkLWJyZWFrOm5vcm1hbH1jb2Rle2ZvbnQtc2l6ZTouODc1ZW07Y29sb3I6dmFyKC0tYnMtY29kZS1jb2xvcik7d29yZC13cmFwOmJyZWFrLXdvcmR9YT5jb2Rle2NvbG9yOmluaGVyaXR9a2Jke3BhZGRpbmc6LjE4NzVyZW0gLjM3NXJlbTtmb250LXNpemU6Ljg3NWVtO2NvbG9yOnZhcigtLWJzLWJvZHktYmcpO2JhY2tncm91bmQtY29sb3I6dmFyKC0tYnMtYm9keS1jb2xvcik7Ym9yZGVyLXJhZGl1czouMjVyZW19a2JkIGtiZHtwYWRkaW5nOjA7Zm9udC1zaXplOjFlbX1maWd1cmV7bWFyZ2luOjAgMCAxcmVtfWltZyxzdmd7dmVydGljYWwtYWxpZ246bWlkZGxlfXRhYmxle2NhcHRpb24tc2lkZTpib3R0b207Ym9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlfWNhcHRpb257cGFkZGluZy10b3A6LjVyZW07cGFkZGluZy1ib3R0b206LjVyZW07Y29sb3I6dmFyKC0tYnMtc2Vjb25kYXJ5LWNvbG9yKTt0ZXh0LWFsaWduOmxlZnR9dGh7dGV4dC1hbGlnbjppbmhlcml0O3RleHQtYWxpZ246LXdlYmtpdC1tYXRjaC1wYXJlbnR9dGhlYWQsdGJvZHksdGZvb3QsdHIsdGQsdGh7Ym9yZGVyLWNvbG9yOmluaGVyaXQ7Ym9yZGVyLXN0eWxlOnNvbGlkO2JvcmRlci13aWR0aDowfWxhYmVse2Rpc3BsYXk6aW5saW5lLWJsb2NrfWJ1dHRvbntib3JkZXItcmFkaXVzOjB9YnV0dG9uOmZvY3VzOm5vdCg6Zm9jdXMtdmlzaWJsZSl7b3V0bGluZTowfWlucHV0LGJ1dHRvbixzZWxlY3Qsb3B0Z3JvdXAsdGV4dGFyZWF7bWFyZ2luOjA7Zm9udC1mYW1pbHk6aW5oZXJpdDtmb250LXNpemU6aW5oZXJpdDtsaW5lLWhlaWdodDppbmhlcml0fWJ1dHRvbixzZWxlY3R7dGV4dC10cmFuc2Zvcm06bm9uZX1bcm9sZT1cImJ1dHRvblwiXXtjdXJzb3I6cG9pbnRlcn1zZWxlY3R7d29yZC13cmFwOm5vcm1hbH1zZWxlY3Q6ZGlzYWJsZWR7b3BhY2l0eToxfVtsaXN0XTpub3QoW3R5cGU9XCJkYXRlXCJdKTpub3QoW3R5cGU9XCJkYXRldGltZS1sb2NhbFwiXSk6bm90KFt0eXBlPVwibW9udGhcIl0pOm5vdChbdHlwZT1cIndlZWtcIl0pOm5vdChbdHlwZT1cInRpbWVcIl0pOjotd2Via2l0LWNhbGVuZGFyLXBpY2tlci1pbmRpY2F0b3J7ZGlzcGxheTpub25lICFpbXBvcnRhbnR9YnV0dG9uLFt0eXBlPVwiYnV0dG9uXCJdLFt0eXBlPVwicmVzZXRcIl0sW3R5cGU9XCJzdWJtaXRcIl17LXdlYmtpdC1hcHBlYXJhbmNlOmJ1dHRvbn1idXR0b246bm90KDpkaXNhYmxlZCksW3R5cGU9XCJidXR0b25cIl06bm90KDpkaXNhYmxlZCksW3R5cGU9XCJyZXNldFwiXTpub3QoOmRpc2FibGVkKSxbdHlwZT1cInN1Ym1pdFwiXTpub3QoOmRpc2FibGVkKXtjdXJzb3I6cG9pbnRlcn06Oi1tb3otZm9jdXMtaW5uZXJ7cGFkZGluZzowO2JvcmRlci1zdHlsZTpub25lfXRleHRhcmVhe3Jlc2l6ZTp2ZXJ0aWNhbH1maWVsZHNldHttaW4td2lkdGg6MDtwYWRkaW5nOjA7bWFyZ2luOjA7Ym9yZGVyOjB9bGVnZW5ke2Zsb2F0OmxlZnQ7d2lkdGg6MTAwJTtwYWRkaW5nOjA7bWFyZ2luLWJvdHRvbTouNXJlbTtmb250LXNpemU6Y2FsYygxLjI3NXJlbSArIC4zdncpO2xpbmUtaGVpZ2h0OmluaGVyaXR9QG1lZGlhIChtaW4td2lkdGg6IDEyMDBweCl7bGVnZW5ke2ZvbnQtc2l6ZToxLjVyZW19fWxlZ2VuZCsqe2NsZWFyOmxlZnR9Ojotd2Via2l0LWRhdGV0aW1lLWVkaXQtZmllbGRzLXdyYXBwZXIsOjotd2Via2l0LWRhdGV0aW1lLWVkaXQtdGV4dCw6Oi13ZWJraXQtZGF0ZXRpbWUtZWRpdC1taW51dGUsOjotd2Via2l0LWRhdGV0aW1lLWVkaXQtaG91ci1maWVsZCw6Oi13ZWJraXQtZGF0ZXRpbWUtZWRpdC1kYXktZmllbGQsOjotd2Via2l0LWRhdGV0aW1lLWVkaXQtbW9udGgtZmllbGQsOjotd2Via2l0LWRhdGV0aW1lLWVkaXQteWVhci1maWVsZHtwYWRkaW5nOjB9Ojotd2Via2l0LWlubmVyLXNwaW4tYnV0dG9ue2hlaWdodDphdXRvfVt0eXBlPVwic2VhcmNoXCJdey13ZWJraXQtYXBwZWFyYW5jZTp0ZXh0ZmllbGQ7b3V0bGluZS1vZmZzZXQ6LTJweH06Oi13ZWJraXQtc2VhcmNoLWRlY29yYXRpb257LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmV9Ojotd2Via2l0LWNvbG9yLXN3YXRjaC13cmFwcGVye3BhZGRpbmc6MH06OmZpbGUtc2VsZWN0b3ItYnV0dG9ue2ZvbnQ6aW5oZXJpdDstd2Via2l0LWFwcGVhcmFuY2U6YnV0dG9ufW91dHB1dHtkaXNwbGF5OmlubGluZS1ibG9ja31pZnJhbWV7Ym9yZGVyOjB9c3VtbWFyeXtkaXNwbGF5Omxpc3QtaXRlbTtjdXJzb3I6cG9pbnRlcn1wcm9ncmVzc3t2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZX1baGlkZGVuXXtkaXNwbGF5Om5vbmUgIWltcG9ydGFudH0ubGVhZHtmb250LXNpemU6MS4yNXJlbTtmb250LXdlaWdodDozMDB9LmRpc3BsYXktMXtmb250LXNpemU6Y2FsYygxLjYyNXJlbSArIDQuNXZ3KTtmb250LXdlaWdodDozMDA7bGluZS1oZWlnaHQ6MS4yfUBtZWRpYSAobWluLXdpZHRoOiAxMjAwcHgpey5kaXNwbGF5LTF7Zm9udC1zaXplOjVyZW19fS5kaXNwbGF5LTJ7Zm9udC1zaXplOmNhbGMoMS41NzVyZW0gKyAzLjl2dyk7Zm9udC13ZWlnaHQ6MzAwO2xpbmUtaGVpZ2h0OjEuMn1AbWVkaWEgKG1pbi13aWR0aDogMTIwMHB4KXsuZGlzcGxheS0ye2ZvbnQtc2l6ZTo0LjVyZW19fS5kaXNwbGF5LTN7Zm9udC1zaXplOmNhbGMoMS41MjVyZW0gKyAzLjN2dyk7Zm9udC13ZWlnaHQ6MzAwO2xpbmUtaGVpZ2h0OjEuMn1AbWVkaWEgKG1pbi13aWR0aDogMTIwMHB4KXsuZGlzcGxheS0ze2ZvbnQtc2l6ZTo0cmVtfX0uZGlzcGxheS00e2ZvbnQtc2l6ZTpjYWxjKDEuNDc1cmVtICsgMi43dncpO2ZvbnQtd2VpZ2h0OjMwMDtsaW5lLWhlaWdodDoxLjJ9QG1lZGlhIChtaW4td2lkdGg6IDEyMDBweCl7LmRpc3BsYXktNHtmb250LXNpemU6My41cmVtfX0uZGlzcGxheS01e2ZvbnQtc2l6ZTpjYWxjKDEuNDI1cmVtICsgMi4xdncpO2ZvbnQtd2VpZ2h0OjMwMDtsaW5lLWhlaWdodDoxLjJ9QG1lZGlhIChtaW4td2lkdGg6IDEyMDBweCl7LmRpc3BsYXktNXtmb250LXNpemU6M3JlbX19LmRpc3BsYXktNntmb250LXNpemU6Y2FsYygxLjM3NXJlbSArIDEuNXZ3KTtmb250LXdlaWdodDozMDA7bGluZS1oZWlnaHQ6MS4yfUBtZWRpYSAobWluLXdpZHRoOiAxMjAwcHgpey5kaXNwbGF5LTZ7Zm9udC1zaXplOjIuNXJlbX19Lmxpc3QtdW5zdHlsZWR7cGFkZGluZy1sZWZ0OjA7bGlzdC1zdHlsZTpub25lfS5saXN0LWlubGluZXtwYWRkaW5nLWxlZnQ6MDtsaXN0LXN0eWxlOm5vbmV9Lmxpc3QtaW5saW5lLWl0ZW17ZGlzcGxheTppbmxpbmUtYmxvY2t9Lmxpc3QtaW5saW5lLWl0ZW06bm90KDpsYXN0LWNoaWxkKXttYXJnaW4tcmlnaHQ6LjVyZW19LmluaXRpYWxpc217Zm9udC1zaXplOi44NzVlbTt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2V9LmJsb2NrcXVvdGV7bWFyZ2luLWJvdHRvbToxcmVtO2ZvbnQtc2l6ZToxLjI1cmVtfS5ibG9ja3F1b3RlPjpsYXN0LWNoaWxke21hcmdpbi1ib3R0b206MH0uYmxvY2txdW90ZS1mb290ZXJ7bWFyZ2luLXRvcDotMXJlbTttYXJnaW4tYm90dG9tOjFyZW07Zm9udC1zaXplOi44NzVlbTtjb2xvcjojNmM3NTdkfS5ibG9ja3F1b3RlLWZvb3Rlcjo6YmVmb3Jle2NvbnRlbnQ6XCJcXFxcMjAxNFxcXFwwMEEwXCJ9LmltZy1mbHVpZHttYXgtd2lkdGg6MTAwJTtoZWlnaHQ6YXV0b30uaW1nLXRodW1ibmFpbHtwYWRkaW5nOi4yNXJlbTtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWJzLWJvZHktYmcpO2JvcmRlcjp2YXIoLS1icy1ib3JkZXItd2lkdGgpIHNvbGlkIHZhcigtLWJzLWJvcmRlci1jb2xvcik7Ym9yZGVyLXJhZGl1czp2YXIoLS1icy1ib3JkZXItcmFkaXVzKTttYXgtd2lkdGg6MTAwJTtoZWlnaHQ6YXV0b30uZmlndXJle2Rpc3BsYXk6aW5saW5lLWJsb2NrfS5maWd1cmUtaW1ne21hcmdpbi1ib3R0b206LjVyZW07bGluZS1oZWlnaHQ6MX0uZmlndXJlLWNhcHRpb257Zm9udC1zaXplOi44NzVlbTtjb2xvcjp2YXIoLS1icy1zZWNvbmRhcnktY29sb3IpfS5jb250YWluZXIsLmNvbnRhaW5lci1mbHVpZCwuY29udGFpbmVyLXNtLC5jb250YWluZXItbWQsLmNvbnRhaW5lci1sZywuY29udGFpbmVyLXhsLC5jb250YWluZXIteHhsey0tYnMtZ3V0dGVyLXg6IDEuNXJlbTstLWJzLWd1dHRlci15OiAwO3dpZHRoOjEwMCU7cGFkZGluZy1yaWdodDpjYWxjKHZhcigtLWJzLWd1dHRlci14KSAqIC41KTtwYWRkaW5nLWxlZnQ6Y2FsYyh2YXIoLS1icy1ndXR0ZXIteCkgKiAuNSk7bWFyZ2luLXJpZ2h0OmF1dG87bWFyZ2luLWxlZnQ6YXV0b31AbWVkaWEgKG1pbi13aWR0aDogNTc2cHgpey5jb250YWluZXIsLmNvbnRhaW5lci1zbXttYXgtd2lkdGg6NTQwcHh9fUBtZWRpYSAobWluLXdpZHRoOiA3NjhweCl7LmNvbnRhaW5lciwuY29udGFpbmVyLXNtLC5jb250YWluZXItbWR7bWF4LXdpZHRoOjcyMHB4fX1AbWVkaWEgKG1pbi13aWR0aDogOTkycHgpey5jb250YWluZXIsLmNvbnRhaW5lci1zbSwuY29udGFpbmVyLW1kLC5jb250YWluZXItbGd7bWF4LXdpZHRoOjk2MHB4fX1AbWVkaWEgKG1pbi13aWR0aDogMTIwMHB4KXsuY29udGFpbmVyLC5jb250YWluZXItc20sLmNvbnRhaW5lci1tZCwuY29udGFpbmVyLWxnLC5jb250YWluZXIteGx7bWF4LXdpZHRoOjExNDBweH19QG1lZGlhIChtaW4td2lkdGg6IDE0MDBweCl7LmNvbnRhaW5lciwuY29udGFpbmVyLXNtLC5jb250YWluZXItbWQsLmNvbnRhaW5lci1sZywuY29udGFpbmVyLXhsLC5jb250YWluZXIteHhse21heC13aWR0aDoxMzIwcHh9fTpyb290ey0tYnMtYnJlYWtwb2ludC14czogMDstLWJzLWJyZWFrcG9pbnQtc206IDU3NnB4Oy0tYnMtYnJlYWtwb2ludC1tZDogNzY4cHg7LS1icy1icmVha3BvaW50LWxnOiA5OTJweDstLWJzLWJyZWFrcG9pbnQteGw6IDEyMDBweDstLWJzLWJyZWFrcG9pbnQteHhsOiAxNDAwcHh9LnJvd3stLWJzLWd1dHRlci14OiAxLjVyZW07LS1icy1ndXR0ZXIteTogMDtkaXNwbGF5OmZsZXg7ZmxleC13cmFwOndyYXA7bWFyZ2luLXRvcDpjYWxjKC0xICogdmFyKC0tYnMtZ3V0dGVyLXkpKTttYXJnaW4tcmlnaHQ6Y2FsYygtLjUgKiB2YXIoLS1icy1ndXR0ZXIteCkpO21hcmdpbi1sZWZ0OmNhbGMoLS41ICogdmFyKC0tYnMtZ3V0dGVyLXgpKX0ucm93Pip7ZmxleC1zaHJpbms6MDt3aWR0aDoxMDAlO21heC13aWR0aDoxMDAlO3BhZGRpbmctcmlnaHQ6Y2FsYyh2YXIoLS1icy1ndXR0ZXIteCkgKiAuNSk7cGFkZGluZy1sZWZ0OmNhbGModmFyKC0tYnMtZ3V0dGVyLXgpICogLjUpO21hcmdpbi10b3A6dmFyKC0tYnMtZ3V0dGVyLXkpfS5jb2x7ZmxleDoxIDAgMCV9LnJvdy1jb2xzLWF1dG8+KntmbGV4OjAgMCBhdXRvO3dpZHRoOmF1dG99LnJvdy1jb2xzLTE+KntmbGV4OjAgMCBhdXRvO3dpZHRoOjEwMCV9LnJvdy1jb2xzLTI+KntmbGV4OjAgMCBhdXRvO3dpZHRoOjUwJX0ucm93LWNvbHMtMz4qe2ZsZXg6MCAwIGF1dG87d2lkdGg6MzMuMzMzMzMlfS5yb3ctY29scy00Pip7ZmxleDowIDAgYXV0bzt3aWR0aDoyNSV9LnJvdy1jb2xzLTU+KntmbGV4OjAgMCBhdXRvO3dpZHRoOjIwJX0ucm93LWNvbHMtNj4qe2ZsZXg6MCAwIGF1dG87d2lkdGg6MTYuNjY2NjclfS5jb2wtYXV0b3tmbGV4OjAgMCBhdXRvO3dpZHRoOmF1dG99LmNvbC0xe2ZsZXg6MCAwIGF1dG87d2lkdGg6OC4zMzMzMyV9LmNvbC0ye2ZsZXg6MCAwIGF1dG87d2lkdGg6MTYuNjY2NjclfS5jb2wtM3tmbGV4OjAgMCBhdXRvO3dpZHRoOjI1JX0uY29sLTR7ZmxleDowIDAgYXV0bzt3aWR0aDozMy4zMzMzMyV9LmNvbC01e2ZsZXg6MCAwIGF1dG87d2lkdGg6NDEuNjY2NjclfS5jb2wtNntmbGV4OjAgMCBhdXRvO3dpZHRoOjUwJX0uY29sLTd7ZmxleDowIDAgYXV0bzt3aWR0aDo1OC4zMzMzMyV9LmNvbC04e2ZsZXg6MCAwIGF1dG87d2lkdGg6NjYuNjY2NjclfS5jb2wtOXtmbGV4OjAgMCBhdXRvO3dpZHRoOjc1JX0uY29sLTEwe2ZsZXg6MCAwIGF1dG87d2lkdGg6ODMuMzMzMzMlfS5jb2wtMTF7ZmxleDowIDAgYXV0bzt3aWR0aDo5MS42NjY2NyV9LmNvbC0xMntmbGV4OjAgMCBhdXRvO3dpZHRoOjEwMCV9Lm9mZnNldC0xe21hcmdpbi1sZWZ0OjguMzMzMzMlfS5vZmZzZXQtMnttYXJnaW4tbGVmdDoxNi42NjY2NyV9Lm9mZnNldC0ze21hcmdpbi1sZWZ0OjI1JX0ub2Zmc2V0LTR7bWFyZ2luLWxlZnQ6MzMuMzMzMzMlfS5vZmZzZXQtNXttYXJnaW4tbGVmdDo0MS42NjY2NyV9Lm9mZnNldC02e21hcmdpbi1sZWZ0OjUwJX0ub2Zmc2V0LTd7bWFyZ2luLWxlZnQ6NTguMzMzMzMlfS5vZmZzZXQtOHttYXJnaW4tbGVmdDo2Ni42NjY2NyV9Lm9mZnNldC05e21hcmdpbi1sZWZ0Ojc1JX0ub2Zmc2V0LTEwe21hcmdpbi1sZWZ0OjgzLjMzMzMzJX0ub2Zmc2V0LTExe21hcmdpbi1sZWZ0OjkxLjY2NjY3JX0uZy0wLC5neC0wey0tYnMtZ3V0dGVyLXg6IDB9LmctMCwuZ3ktMHstLWJzLWd1dHRlci15OiAwfS5nLTEsLmd4LTF7LS1icy1ndXR0ZXIteDogLjI1cmVtfS5nLTEsLmd5LTF7LS1icy1ndXR0ZXIteTogLjI1cmVtfS5nLTIsLmd4LTJ7LS1icy1ndXR0ZXIteDogLjVyZW19LmctMiwuZ3ktMnstLWJzLWd1dHRlci15OiAuNXJlbX0uZy0zLC5neC0zey0tYnMtZ3V0dGVyLXg6IDFyZW19LmctMywuZ3ktM3stLWJzLWd1dHRlci15OiAxcmVtfS5nLTQsLmd4LTR7LS1icy1ndXR0ZXIteDogMS41cmVtfS5nLTQsLmd5LTR7LS1icy1ndXR0ZXIteTogMS41cmVtfS5nLTUsLmd4LTV7LS1icy1ndXR0ZXIteDogM3JlbX0uZy01LC5neS01ey0tYnMtZ3V0dGVyLXk6IDNyZW19QG1lZGlhIChtaW4td2lkdGg6IDU3NnB4KXsuY29sLXNte2ZsZXg6MSAwIDAlfS5yb3ctY29scy1zbS1hdXRvPip7ZmxleDowIDAgYXV0bzt3aWR0aDphdXRvfS5yb3ctY29scy1zbS0xPip7ZmxleDowIDAgYXV0bzt3aWR0aDoxMDAlfS5yb3ctY29scy1zbS0yPip7ZmxleDowIDAgYXV0bzt3aWR0aDo1MCV9LnJvdy1jb2xzLXNtLTM+KntmbGV4OjAgMCBhdXRvO3dpZHRoOjMzLjMzMzMzJX0ucm93LWNvbHMtc20tND4qe2ZsZXg6MCAwIGF1dG87d2lkdGg6MjUlfS5yb3ctY29scy1zbS01Pip7ZmxleDowIDAgYXV0bzt3aWR0aDoyMCV9LnJvdy1jb2xzLXNtLTY+KntmbGV4OjAgMCBhdXRvO3dpZHRoOjE2LjY2NjY3JX0uY29sLXNtLWF1dG97ZmxleDowIDAgYXV0bzt3aWR0aDphdXRvfS5jb2wtc20tMXtmbGV4OjAgMCBhdXRvO3dpZHRoOjguMzMzMzMlfS5jb2wtc20tMntmbGV4OjAgMCBhdXRvO3dpZHRoOjE2LjY2NjY3JX0uY29sLXNtLTN7ZmxleDowIDAgYXV0bzt3aWR0aDoyNSV9LmNvbC1zbS00e2ZsZXg6MCAwIGF1dG87d2lkdGg6MzMuMzMzMzMlfS5jb2wtc20tNXtmbGV4OjAgMCBhdXRvO3dpZHRoOjQxLjY2NjY3JX0uY29sLXNtLTZ7ZmxleDowIDAgYXV0bzt3aWR0aDo1MCV9LmNvbC1zbS03e2ZsZXg6MCAwIGF1dG87d2lkdGg6NTguMzMzMzMlfS5jb2wtc20tOHtmbGV4OjAgMCBhdXRvO3dpZHRoOjY2LjY2NjY3JX0uY29sLXNtLTl7ZmxleDowIDAgYXV0bzt3aWR0aDo3NSV9LmNvbC1zbS0xMHtmbGV4OjAgMCBhdXRvO3dpZHRoOjgzLjMzMzMzJX0uY29sLXNtLTExe2ZsZXg6MCAwIGF1dG87d2lkdGg6OTEuNjY2NjclfS5jb2wtc20tMTJ7ZmxleDowIDAgYXV0bzt3aWR0aDoxMDAlfS5vZmZzZXQtc20tMHttYXJnaW4tbGVmdDowfS5vZmZzZXQtc20tMXttYXJnaW4tbGVmdDo4LjMzMzMzJX0ub2Zmc2V0LXNtLTJ7bWFyZ2luLWxlZnQ6MTYuNjY2NjclfS5vZmZzZXQtc20tM3ttYXJnaW4tbGVmdDoyNSV9Lm9mZnNldC1zbS00e21hcmdpbi1sZWZ0OjMzLjMzMzMzJX0ub2Zmc2V0LXNtLTV7bWFyZ2luLWxlZnQ6NDEuNjY2NjclfS5vZmZzZXQtc20tNnttYXJnaW4tbGVmdDo1MCV9Lm9mZnNldC1zbS03e21hcmdpbi1sZWZ0OjU4LjMzMzMzJX0ub2Zmc2V0LXNtLTh7bWFyZ2luLWxlZnQ6NjYuNjY2NjclfS5vZmZzZXQtc20tOXttYXJnaW4tbGVmdDo3NSV9Lm9mZnNldC1zbS0xMHttYXJnaW4tbGVmdDo4My4zMzMzMyV9Lm9mZnNldC1zbS0xMXttYXJnaW4tbGVmdDo5MS42NjY2NyV9Lmctc20tMCwuZ3gtc20tMHstLWJzLWd1dHRlci14OiAwfS5nLXNtLTAsLmd5LXNtLTB7LS1icy1ndXR0ZXIteTogMH0uZy1zbS0xLC5neC1zbS0xey0tYnMtZ3V0dGVyLXg6IC4yNXJlbX0uZy1zbS0xLC5neS1zbS0xey0tYnMtZ3V0dGVyLXk6IC4yNXJlbX0uZy1zbS0yLC5neC1zbS0yey0tYnMtZ3V0dGVyLXg6IC41cmVtfS5nLXNtLTIsLmd5LXNtLTJ7LS1icy1ndXR0ZXIteTogLjVyZW19Lmctc20tMywuZ3gtc20tM3stLWJzLWd1dHRlci14OiAxcmVtfS5nLXNtLTMsLmd5LXNtLTN7LS1icy1ndXR0ZXIteTogMXJlbX0uZy1zbS00LC5neC1zbS00ey0tYnMtZ3V0dGVyLXg6IDEuNXJlbX0uZy1zbS00LC5neS1zbS00ey0tYnMtZ3V0dGVyLXk6IDEuNXJlbX0uZy1zbS01LC5neC1zbS01ey0tYnMtZ3V0dGVyLXg6IDNyZW19Lmctc20tNSwuZ3ktc20tNXstLWJzLWd1dHRlci15OiAzcmVtfX1AbWVkaWEgKG1pbi13aWR0aDogNzY4cHgpey5jb2wtbWR7ZmxleDoxIDAgMCV9LnJvdy1jb2xzLW1kLWF1dG8+KntmbGV4OjAgMCBhdXRvO3dpZHRoOmF1dG99LnJvdy1jb2xzLW1kLTE+KntmbGV4OjAgMCBhdXRvO3dpZHRoOjEwMCV9LnJvdy1jb2xzLW1kLTI+KntmbGV4OjAgMCBhdXRvO3dpZHRoOjUwJX0ucm93LWNvbHMtbWQtMz4qe2ZsZXg6MCAwIGF1dG87d2lkdGg6MzMuMzMzMzMlfS5yb3ctY29scy1tZC00Pip7ZmxleDowIDAgYXV0bzt3aWR0aDoyNSV9LnJvdy1jb2xzLW1kLTU+KntmbGV4OjAgMCBhdXRvO3dpZHRoOjIwJX0ucm93LWNvbHMtbWQtNj4qe2ZsZXg6MCAwIGF1dG87d2lkdGg6MTYuNjY2NjclfS5jb2wtbWQtYXV0b3tmbGV4OjAgMCBhdXRvO3dpZHRoOmF1dG99LmNvbC1tZC0xe2ZsZXg6MCAwIGF1dG87d2lkdGg6OC4zMzMzMyV9LmNvbC1tZC0ye2ZsZXg6MCAwIGF1dG87d2lkdGg6MTYuNjY2NjclfS5jb2wtbWQtM3tmbGV4OjAgMCBhdXRvO3dpZHRoOjI1JX0uY29sLW1kLTR7ZmxleDowIDAgYXV0bzt3aWR0aDozMy4zMzMzMyV9LmNvbC1tZC01e2ZsZXg6MCAwIGF1dG87d2lkdGg6NDEuNjY2NjclfS5jb2wtbWQtNntmbGV4OjAgMCBhdXRvO3dpZHRoOjUwJX0uY29sLW1kLTd7ZmxleDowIDAgYXV0bzt3aWR0aDo1OC4zMzMzMyV9LmNvbC1tZC04e2ZsZXg6MCAwIGF1dG87d2lkdGg6NjYuNjY2NjclfS5jb2wtbWQtOXtmbGV4OjAgMCBhdXRvO3dpZHRoOjc1JX0uY29sLW1kLTEwe2ZsZXg6MCAwIGF1dG87d2lkdGg6ODMuMzMzMzMlfS5jb2wtbWQtMTF7ZmxleDowIDAgYXV0bzt3aWR0aDo5MS42NjY2NyV9LmNvbC1tZC0xMntmbGV4OjAgMCBhdXRvO3dpZHRoOjEwMCV9Lm9mZnNldC1tZC0we21hcmdpbi1sZWZ0OjB9Lm9mZnNldC1tZC0xe21hcmdpbi1sZWZ0OjguMzMzMzMlfS5vZmZzZXQtbWQtMnttYXJnaW4tbGVmdDoxNi42NjY2NyV9Lm9mZnNldC1tZC0ze21hcmdpbi1sZWZ0OjI1JX0ub2Zmc2V0LW1kLTR7bWFyZ2luLWxlZnQ6MzMuMzMzMzMlfS5vZmZzZXQtbWQtNXttYXJnaW4tbGVmdDo0MS42NjY2NyV9Lm9mZnNldC1tZC02e21hcmdpbi1sZWZ0OjUwJX0ub2Zmc2V0LW1kLTd7bWFyZ2luLWxlZnQ6NTguMzMzMzMlfS5vZmZzZXQtbWQtOHttYXJnaW4tbGVmdDo2Ni42NjY2NyV9Lm9mZnNldC1tZC05e21hcmdpbi1sZWZ0Ojc1JX0ub2Zmc2V0LW1kLTEwe21hcmdpbi1sZWZ0OjgzLjMzMzMzJX0ub2Zmc2V0LW1kLTExe21hcmdpbi1sZWZ0OjkxLjY2NjY3JX0uZy1tZC0wLC5neC1tZC0wey0tYnMtZ3V0dGVyLXg6IDB9LmctbWQtMCwuZ3ktbWQtMHstLWJzLWd1dHRlci15OiAwfS5nLW1kLTEsLmd4LW1kLTF7LS1icy1ndXR0ZXIteDogLjI1cmVtfS5nLW1kLTEsLmd5LW1kLTF7LS1icy1ndXR0ZXIteTogLjI1cmVtfS5nLW1kLTIsLmd4LW1kLTJ7LS1icy1ndXR0ZXIteDogLjVyZW19LmctbWQtMiwuZ3ktbWQtMnstLWJzLWd1dHRlci15OiAuNXJlbX0uZy1tZC0zLC5neC1tZC0zey0tYnMtZ3V0dGVyLXg6IDFyZW19LmctbWQtMywuZ3ktbWQtM3stLWJzLWd1dHRlci15OiAxcmVtfS5nLW1kLTQsLmd4LW1kLTR7LS1icy1ndXR0ZXIteDogMS41cmVtfS5nLW1kLTQsLmd5LW1kLTR7LS1icy1ndXR0ZXIteTogMS41cmVtfS5nLW1kLTUsLmd4LW1kLTV7LS1icy1ndXR0ZXIteDogM3JlbX0uZy1tZC01LC5neS1tZC01ey0tYnMtZ3V0dGVyLXk6IDNyZW19fUBtZWRpYSAobWluLXdpZHRoOiA5OTJweCl7LmNvbC1sZ3tmbGV4OjEgMCAwJX0ucm93LWNvbHMtbGctYXV0bz4qe2ZsZXg6MCAwIGF1dG87d2lkdGg6YXV0b30ucm93LWNvbHMtbGctMT4qe2ZsZXg6MCAwIGF1dG87d2lkdGg6MTAwJX0ucm93LWNvbHMtbGctMj4qe2ZsZXg6MCAwIGF1dG87d2lkdGg6NTAlfS5yb3ctY29scy1sZy0zPip7ZmxleDowIDAgYXV0bzt3aWR0aDozMy4zMzMzMyV9LnJvdy1jb2xzLWxnLTQ+KntmbGV4OjAgMCBhdXRvO3dpZHRoOjI1JX0ucm93LWNvbHMtbGctNT4qe2ZsZXg6MCAwIGF1dG87d2lkdGg6MjAlfS5yb3ctY29scy1sZy02Pip7ZmxleDowIDAgYXV0bzt3aWR0aDoxNi42NjY2NyV9LmNvbC1sZy1hdXRve2ZsZXg6MCAwIGF1dG87d2lkdGg6YXV0b30uY29sLWxnLTF7ZmxleDowIDAgYXV0bzt3aWR0aDo4LjMzMzMzJX0uY29sLWxnLTJ7ZmxleDowIDAgYXV0bzt3aWR0aDoxNi42NjY2NyV9LmNvbC1sZy0ze2ZsZXg6MCAwIGF1dG87d2lkdGg6MjUlfS5jb2wtbGctNHtmbGV4OjAgMCBhdXRvO3dpZHRoOjMzLjMzMzMzJX0uY29sLWxnLTV7ZmxleDowIDAgYXV0bzt3aWR0aDo0MS42NjY2NyV9LmNvbC1sZy02e2ZsZXg6MCAwIGF1dG87d2lkdGg6NTAlfS5jb2wtbGctN3tmbGV4OjAgMCBhdXRvO3dpZHRoOjU4LjMzMzMzJX0uY29sLWxnLTh7ZmxleDowIDAgYXV0bzt3aWR0aDo2Ni42NjY2NyV9LmNvbC1sZy05e2ZsZXg6MCAwIGF1dG87d2lkdGg6NzUlfS5jb2wtbGctMTB7ZmxleDowIDAgYXV0bzt3aWR0aDo4My4zMzMzMyV9LmNvbC1sZy0xMXtmbGV4OjAgMCBhdXRvO3dpZHRoOjkxLjY2NjY3JX0uY29sLWxnLTEye2ZsZXg6MCAwIGF1dG87d2lkdGg6MTAwJX0ub2Zmc2V0LWxnLTB7bWFyZ2luLWxlZnQ6MH0ub2Zmc2V0LWxnLTF7bWFyZ2luLWxlZnQ6OC4zMzMzMyV9Lm9mZnNldC1sZy0ye21hcmdpbi1sZWZ0OjE2LjY2NjY3JX0ub2Zmc2V0LWxnLTN7bWFyZ2luLWxlZnQ6MjUlfS5vZmZzZXQtbGctNHttYXJnaW4tbGVmdDozMy4zMzMzMyV9Lm9mZnNldC1sZy01e21hcmdpbi1sZWZ0OjQxLjY2NjY3JX0ub2Zmc2V0LWxnLTZ7bWFyZ2luLWxlZnQ6NTAlfS5vZmZzZXQtbGctN3ttYXJnaW4tbGVmdDo1OC4zMzMzMyV9Lm9mZnNldC1sZy04e21hcmdpbi1sZWZ0OjY2LjY2NjY3JX0ub2Zmc2V0LWxnLTl7bWFyZ2luLWxlZnQ6NzUlfS5vZmZzZXQtbGctMTB7bWFyZ2luLWxlZnQ6ODMuMzMzMzMlfS5vZmZzZXQtbGctMTF7bWFyZ2luLWxlZnQ6OTEuNjY2NjclfS5nLWxnLTAsLmd4LWxnLTB7LS1icy1ndXR0ZXIteDogMH0uZy1sZy0wLC5neS1sZy0wey0tYnMtZ3V0dGVyLXk6IDB9LmctbGctMSwuZ3gtbGctMXstLWJzLWd1dHRlci14OiAuMjVyZW19LmctbGctMSwuZ3ktbGctMXstLWJzLWd1dHRlci15OiAuMjVyZW19LmctbGctMiwuZ3gtbGctMnstLWJzLWd1dHRlci14OiAuNXJlbX0uZy1sZy0yLC5neS1sZy0yey0tYnMtZ3V0dGVyLXk6IC41cmVtfS5nLWxnLTMsLmd4LWxnLTN7LS1icy1ndXR0ZXIteDogMXJlbX0uZy1sZy0zLC5neS1sZy0zey0tYnMtZ3V0dGVyLXk6IDFyZW19LmctbGctNCwuZ3gtbGctNHstLWJzLWd1dHRlci14OiAxLjVyZW19LmctbGctNCwuZ3ktbGctNHstLWJzLWd1dHRlci15OiAxLjVyZW19LmctbGctNSwuZ3gtbGctNXstLWJzLWd1dHRlci14OiAzcmVtfS5nLWxnLTUsLmd5LWxnLTV7LS1icy1ndXR0ZXIteTogM3JlbX19QG1lZGlhIChtaW4td2lkdGg6IDEyMDBweCl7LmNvbC14bHtmbGV4OjEgMCAwJX0ucm93LWNvbHMteGwtYXV0bz4qe2ZsZXg6MCAwIGF1dG87d2lkdGg6YXV0b30ucm93LWNvbHMteGwtMT4qe2ZsZXg6MCAwIGF1dG87d2lkdGg6MTAwJX0ucm93LWNvbHMteGwtMj4qe2ZsZXg6MCAwIGF1dG87d2lkdGg6NTAlfS5yb3ctY29scy14bC0zPip7ZmxleDowIDAgYXV0bzt3aWR0aDozMy4zMzMzMyV9LnJvdy1jb2xzLXhsLTQ+KntmbGV4OjAgMCBhdXRvO3dpZHRoOjI1JX0ucm93LWNvbHMteGwtNT4qe2ZsZXg6MCAwIGF1dG87d2lkdGg6MjAlfS5yb3ctY29scy14bC02Pip7ZmxleDowIDAgYXV0bzt3aWR0aDoxNi42NjY2NyV9LmNvbC14bC1hdXRve2ZsZXg6MCAwIGF1dG87d2lkdGg6YXV0b30uY29sLXhsLTF7ZmxleDowIDAgYXV0bzt3aWR0aDo4LjMzMzMzJX0uY29sLXhsLTJ7ZmxleDowIDAgYXV0bzt3aWR0aDoxNi42NjY2NyV9LmNvbC14bC0ze2ZsZXg6MCAwIGF1dG87d2lkdGg6MjUlfS5jb2wteGwtNHtmbGV4OjAgMCBhdXRvO3dpZHRoOjMzLjMzMzMzJX0uY29sLXhsLTV7ZmxleDowIDAgYXV0bzt3aWR0aDo0MS42NjY2NyV9LmNvbC14bC02e2ZsZXg6MCAwIGF1dG87d2lkdGg6NTAlfS5jb2wteGwtN3tmbGV4OjAgMCBhdXRvO3dpZHRoOjU4LjMzMzMzJX0uY29sLXhsLTh7ZmxleDowIDAgYXV0bzt3aWR0aDo2Ni42NjY2NyV9LmNvbC14bC05e2ZsZXg6MCAwIGF1dG87d2lkdGg6NzUlfS5jb2wteGwtMTB7ZmxleDowIDAgYXV0bzt3aWR0aDo4My4zMzMzMyV9LmNvbC14bC0xMXtmbGV4OjAgMCBhdXRvO3dpZHRoOjkxLjY2NjY3JX0uY29sLXhsLTEye2ZsZXg6MCAwIGF1dG87d2lkdGg6MTAwJX0ub2Zmc2V0LXhsLTB7bWFyZ2luLWxlZnQ6MH0ub2Zmc2V0LXhsLTF7bWFyZ2luLWxlZnQ6OC4zMzMzMyV9Lm9mZnNldC14bC0ye21hcmdpbi1sZWZ0OjE2LjY2NjY3JX0ub2Zmc2V0LXhsLTN7bWFyZ2luLWxlZnQ6MjUlfS5vZmZzZXQteGwtNHttYXJnaW4tbGVmdDozMy4zMzMzMyV9Lm9mZnNldC14bC01e21hcmdpbi1sZWZ0OjQxLjY2NjY3JX0ub2Zmc2V0LXhsLTZ7bWFyZ2luLWxlZnQ6NTAlfS5vZmZzZXQteGwtN3ttYXJnaW4tbGVmdDo1OC4zMzMzMyV9Lm9mZnNldC14bC04e21hcmdpbi1sZWZ0OjY2LjY2NjY3JX0ub2Zmc2V0LXhsLTl7bWFyZ2luLWxlZnQ6NzUlfS5vZmZzZXQteGwtMTB7bWFyZ2luLWxlZnQ6ODMuMzMzMzMlfS5vZmZzZXQteGwtMTF7bWFyZ2luLWxlZnQ6OTEuNjY2NjclfS5nLXhsLTAsLmd4LXhsLTB7LS1icy1ndXR0ZXIteDogMH0uZy14bC0wLC5neS14bC0wey0tYnMtZ3V0dGVyLXk6IDB9LmcteGwtMSwuZ3gteGwtMXstLWJzLWd1dHRlci14OiAuMjVyZW19LmcteGwtMSwuZ3kteGwtMXstLWJzLWd1dHRlci15OiAuMjVyZW19LmcteGwtMiwuZ3gteGwtMnstLWJzLWd1dHRlci14OiAuNXJlbX0uZy14bC0yLC5neS14bC0yey0tYnMtZ3V0dGVyLXk6IC41cmVtfS5nLXhsLTMsLmd4LXhsLTN7LS1icy1ndXR0ZXIteDogMXJlbX0uZy14bC0zLC5neS14bC0zey0tYnMtZ3V0dGVyLXk6IDFyZW19LmcteGwtNCwuZ3gteGwtNHstLWJzLWd1dHRlci14OiAxLjVyZW19LmcteGwtNCwuZ3kteGwtNHstLWJzLWd1dHRlci15OiAxLjVyZW19LmcteGwtNSwuZ3gteGwtNXstLWJzLWd1dHRlci14OiAzcmVtfS5nLXhsLTUsLmd5LXhsLTV7LS1icy1ndXR0ZXIteTogM3JlbX19QG1lZGlhIChtaW4td2lkdGg6IDE0MDBweCl7LmNvbC14eGx7ZmxleDoxIDAgMCV9LnJvdy1jb2xzLXh4bC1hdXRvPip7ZmxleDowIDAgYXV0bzt3aWR0aDphdXRvfS5yb3ctY29scy14eGwtMT4qe2ZsZXg6MCAwIGF1dG87d2lkdGg6MTAwJX0ucm93LWNvbHMteHhsLTI+KntmbGV4OjAgMCBhdXRvO3dpZHRoOjUwJX0ucm93LWNvbHMteHhsLTM+KntmbGV4OjAgMCBhdXRvO3dpZHRoOjMzLjMzMzMzJX0ucm93LWNvbHMteHhsLTQ+KntmbGV4OjAgMCBhdXRvO3dpZHRoOjI1JX0ucm93LWNvbHMteHhsLTU+KntmbGV4OjAgMCBhdXRvO3dpZHRoOjIwJX0ucm93LWNvbHMteHhsLTY+KntmbGV4OjAgMCBhdXRvO3dpZHRoOjE2LjY2NjY3JX0uY29sLXh4bC1hdXRve2ZsZXg6MCAwIGF1dG87d2lkdGg6YXV0b30uY29sLXh4bC0xe2ZsZXg6MCAwIGF1dG87d2lkdGg6OC4zMzMzMyV9LmNvbC14eGwtMntmbGV4OjAgMCBhdXRvO3dpZHRoOjE2LjY2NjY3JX0uY29sLXh4bC0ze2ZsZXg6MCAwIGF1dG87d2lkdGg6MjUlfS5jb2wteHhsLTR7ZmxleDowIDAgYXV0bzt3aWR0aDozMy4zMzMzMyV9LmNvbC14eGwtNXtmbGV4OjAgMCBhdXRvO3dpZHRoOjQxLjY2NjY3JX0uY29sLXh4bC02e2ZsZXg6MCAwIGF1dG87d2lkdGg6NTAlfS5jb2wteHhsLTd7ZmxleDowIDAgYXV0bzt3aWR0aDo1OC4zMzMzMyV9LmNvbC14eGwtOHtmbGV4OjAgMCBhdXRvO3dpZHRoOjY2LjY2NjY3JX0uY29sLXh4bC05e2ZsZXg6MCAwIGF1dG87d2lkdGg6NzUlfS5jb2wteHhsLTEwe2ZsZXg6MCAwIGF1dG87d2lkdGg6ODMuMzMzMzMlfS5jb2wteHhsLTExe2ZsZXg6MCAwIGF1dG87d2lkdGg6OTEuNjY2NjclfS5jb2wteHhsLTEye2ZsZXg6MCAwIGF1dG87d2lkdGg6MTAwJX0ub2Zmc2V0LXh4bC0we21hcmdpbi1sZWZ0OjB9Lm9mZnNldC14eGwtMXttYXJnaW4tbGVmdDo4LjMzMzMzJX0ub2Zmc2V0LXh4bC0ye21hcmdpbi1sZWZ0OjE2LjY2NjY3JX0ub2Zmc2V0LXh4bC0ze21hcmdpbi1sZWZ0OjI1JX0ub2Zmc2V0LXh4bC00e21hcmdpbi1sZWZ0OjMzLjMzMzMzJX0ub2Zmc2V0LXh4bC01e21hcmdpbi1sZWZ0OjQxLjY2NjY3JX0ub2Zmc2V0LXh4bC02e21hcmdpbi1sZWZ0OjUwJX0ub2Zmc2V0LXh4bC03e21hcmdpbi1sZWZ0OjU4LjMzMzMzJX0ub2Zmc2V0LXh4bC04e21hcmdpbi1sZWZ0OjY2LjY2NjY3JX0ub2Zmc2V0LXh4bC05e21hcmdpbi1sZWZ0Ojc1JX0ub2Zmc2V0LXh4bC0xMHttYXJnaW4tbGVmdDo4My4zMzMzMyV9Lm9mZnNldC14eGwtMTF7bWFyZ2luLWxlZnQ6OTEuNjY2NjclfS5nLXh4bC0wLC5neC14eGwtMHstLWJzLWd1dHRlci14OiAwfS5nLXh4bC0wLC5neS14eGwtMHstLWJzLWd1dHRlci15OiAwfS5nLXh4bC0xLC5neC14eGwtMXstLWJzLWd1dHRlci14OiAuMjVyZW19LmcteHhsLTEsLmd5LXh4bC0xey0tYnMtZ3V0dGVyLXk6IC4yNXJlbX0uZy14eGwtMiwuZ3gteHhsLTJ7LS1icy1ndXR0ZXIteDogLjVyZW19LmcteHhsLTIsLmd5LXh4bC0yey0tYnMtZ3V0dGVyLXk6IC41cmVtfS5nLXh4bC0zLC5neC14eGwtM3stLWJzLWd1dHRlci14OiAxcmVtfS5nLXh4bC0zLC5neS14eGwtM3stLWJzLWd1dHRlci15OiAxcmVtfS5nLXh4bC00LC5neC14eGwtNHstLWJzLWd1dHRlci14OiAxLjVyZW19LmcteHhsLTQsLmd5LXh4bC00ey0tYnMtZ3V0dGVyLXk6IDEuNXJlbX0uZy14eGwtNSwuZ3gteHhsLTV7LS1icy1ndXR0ZXIteDogM3JlbX0uZy14eGwtNSwuZ3kteHhsLTV7LS1icy1ndXR0ZXIteTogM3JlbX19LnRhYmxley0tYnMtdGFibGUtY29sb3ItdHlwZTogaW5pdGlhbDstLWJzLXRhYmxlLWJnLXR5cGU6IGluaXRpYWw7LS1icy10YWJsZS1jb2xvci1zdGF0ZTogaW5pdGlhbDstLWJzLXRhYmxlLWJnLXN0YXRlOiBpbml0aWFsOy0tYnMtdGFibGUtY29sb3I6IHZhcigtLWJzLWVtcGhhc2lzLWNvbG9yKTstLWJzLXRhYmxlLWJnOiB2YXIoLS1icy1ib2R5LWJnKTstLWJzLXRhYmxlLWJvcmRlci1jb2xvcjogdmFyKC0tYnMtYm9yZGVyLWNvbG9yKTstLWJzLXRhYmxlLWFjY2VudC1iZzogcmdiYSgwLDAsMCwwKTstLWJzLXRhYmxlLXN0cmlwZWQtY29sb3I6IHZhcigtLWJzLWVtcGhhc2lzLWNvbG9yKTstLWJzLXRhYmxlLXN0cmlwZWQtYmc6IHJnYmEodmFyKC0tYnMtZW1waGFzaXMtY29sb3ItcmdiKSwgMC4wNSk7LS1icy10YWJsZS1hY3RpdmUtY29sb3I6IHZhcigtLWJzLWVtcGhhc2lzLWNvbG9yKTstLWJzLXRhYmxlLWFjdGl2ZS1iZzogcmdiYSh2YXIoLS1icy1lbXBoYXNpcy1jb2xvci1yZ2IpLCAwLjEpOy0tYnMtdGFibGUtaG92ZXItY29sb3I6IHZhcigtLWJzLWVtcGhhc2lzLWNvbG9yKTstLWJzLXRhYmxlLWhvdmVyLWJnOiByZ2JhKHZhcigtLWJzLWVtcGhhc2lzLWNvbG9yLXJnYiksIDAuMDc1KTt3aWR0aDoxMDAlO21hcmdpbi1ib3R0b206MXJlbTt2ZXJ0aWNhbC1hbGlnbjp0b3A7Ym9yZGVyLWNvbG9yOnZhcigtLWJzLXRhYmxlLWJvcmRlci1jb2xvcil9LnRhYmxlPjpub3QoY2FwdGlvbik+Kj4qe3BhZGRpbmc6LjVyZW0gLjVyZW07Y29sb3I6dmFyKC0tYnMtdGFibGUtY29sb3Itc3RhdGUsIHZhcigtLWJzLXRhYmxlLWNvbG9yLXR5cGUsIHZhcigtLWJzLXRhYmxlLWNvbG9yKSkpO2JhY2tncm91bmQtY29sb3I6dmFyKC0tYnMtdGFibGUtYmcpO2JvcmRlci1ib3R0b20td2lkdGg6dmFyKC0tYnMtYm9yZGVyLXdpZHRoKTtib3gtc2hhZG93Omluc2V0IDAgMCAwIDk5OTlweCB2YXIoLS1icy10YWJsZS1iZy1zdGF0ZSwgdmFyKC0tYnMtdGFibGUtYmctdHlwZSwgdmFyKC0tYnMtdGFibGUtYWNjZW50LWJnKSkpfS50YWJsZT50Ym9keXt2ZXJ0aWNhbC1hbGlnbjppbmhlcml0fS50YWJsZT50aGVhZHt2ZXJ0aWNhbC1hbGlnbjpib3R0b219LnRhYmxlLWdyb3VwLWRpdmlkZXJ7Ym9yZGVyLXRvcDpjYWxjKHZhcigtLWJzLWJvcmRlci13aWR0aCkgKiAyKSBzb2xpZCBjdXJyZW50Y29sb3J9LmNhcHRpb24tdG9we2NhcHRpb24tc2lkZTp0b3B9LnRhYmxlLXNtPjpub3QoY2FwdGlvbik+Kj4qe3BhZGRpbmc6LjI1cmVtIC4yNXJlbX0udGFibGUtYm9yZGVyZWQ+Om5vdChjYXB0aW9uKT4qe2JvcmRlci13aWR0aDp2YXIoLS1icy1ib3JkZXItd2lkdGgpIDB9LnRhYmxlLWJvcmRlcmVkPjpub3QoY2FwdGlvbik+Kj4qe2JvcmRlci13aWR0aDowIHZhcigtLWJzLWJvcmRlci13aWR0aCl9LnRhYmxlLWJvcmRlcmxlc3M+Om5vdChjYXB0aW9uKT4qPip7Ym9yZGVyLWJvdHRvbS13aWR0aDowfS50YWJsZS1ib3JkZXJsZXNzPjpub3QoOmZpcnN0LWNoaWxkKXtib3JkZXItdG9wLXdpZHRoOjB9LnRhYmxlLXN0cmlwZWQ+dGJvZHk+dHI6bnRoLW9mLXR5cGUob2RkKT4qey0tYnMtdGFibGUtY29sb3ItdHlwZTogdmFyKC0tYnMtdGFibGUtc3RyaXBlZC1jb2xvcik7LS1icy10YWJsZS1iZy10eXBlOiB2YXIoLS1icy10YWJsZS1zdHJpcGVkLWJnKX0udGFibGUtc3RyaXBlZC1jb2x1bW5zPjpub3QoY2FwdGlvbik+dHI+Om50aC1jaGlsZChldmVuKXstLWJzLXRhYmxlLWNvbG9yLXR5cGU6IHZhcigtLWJzLXRhYmxlLXN0cmlwZWQtY29sb3IpOy0tYnMtdGFibGUtYmctdHlwZTogdmFyKC0tYnMtdGFibGUtc3RyaXBlZC1iZyl9LnRhYmxlLWFjdGl2ZXstLWJzLXRhYmxlLWNvbG9yLXN0YXRlOiB2YXIoLS1icy10YWJsZS1hY3RpdmUtY29sb3IpOy0tYnMtdGFibGUtYmctc3RhdGU6IHZhcigtLWJzLXRhYmxlLWFjdGl2ZS1iZyl9LnRhYmxlLWhvdmVyPnRib2R5PnRyOmhvdmVyPip7LS1icy10YWJsZS1jb2xvci1zdGF0ZTogdmFyKC0tYnMtdGFibGUtaG92ZXItY29sb3IpOy0tYnMtdGFibGUtYmctc3RhdGU6IHZhcigtLWJzLXRhYmxlLWhvdmVyLWJnKX0udGFibGUtcHJpbWFyeXstLWJzLXRhYmxlLWNvbG9yOiAjMDAwOy0tYnMtdGFibGUtYmc6ICNjZmUyZmY7LS1icy10YWJsZS1ib3JkZXItY29sb3I6ICNhNmI1Y2M7LS1icy10YWJsZS1zdHJpcGVkLWJnOiAjYzVkN2YyOy0tYnMtdGFibGUtc3RyaXBlZC1jb2xvcjogIzAwMDstLWJzLXRhYmxlLWFjdGl2ZS1iZzogI2JhY2JlNjstLWJzLXRhYmxlLWFjdGl2ZS1jb2xvcjogIzAwMDstLWJzLXRhYmxlLWhvdmVyLWJnOiAjYmZkMWVjOy0tYnMtdGFibGUtaG92ZXItY29sb3I6ICMwMDA7Y29sb3I6dmFyKC0tYnMtdGFibGUtY29sb3IpO2JvcmRlci1jb2xvcjp2YXIoLS1icy10YWJsZS1ib3JkZXItY29sb3IpfS50YWJsZS1zZWNvbmRhcnl7LS1icy10YWJsZS1jb2xvcjogIzAwMDstLWJzLXRhYmxlLWJnOiAjZTJlM2U1Oy0tYnMtdGFibGUtYm9yZGVyLWNvbG9yOiAjYjViNmI3Oy0tYnMtdGFibGUtc3RyaXBlZC1iZzogI2Q3ZDhkYTstLWJzLXRhYmxlLXN0cmlwZWQtY29sb3I6ICMwMDA7LS1icy10YWJsZS1hY3RpdmUtYmc6ICNjYmNjY2U7LS1icy10YWJsZS1hY3RpdmUtY29sb3I6ICMwMDA7LS1icy10YWJsZS1ob3Zlci1iZzogI2QxZDJkNDstLWJzLXRhYmxlLWhvdmVyLWNvbG9yOiAjMDAwO2NvbG9yOnZhcigtLWJzLXRhYmxlLWNvbG9yKTtib3JkZXItY29sb3I6dmFyKC0tYnMtdGFibGUtYm9yZGVyLWNvbG9yKX0udGFibGUtc3VjY2Vzc3stLWJzLXRhYmxlLWNvbG9yOiAjMDAwOy0tYnMtdGFibGUtYmc6ICNkMWU3ZGQ7LS1icy10YWJsZS1ib3JkZXItY29sb3I6ICNhN2I5YjE7LS1icy10YWJsZS1zdHJpcGVkLWJnOiAjYzdkYmQyOy0tYnMtdGFibGUtc3RyaXBlZC1jb2xvcjogIzAwMDstLWJzLXRhYmxlLWFjdGl2ZS1iZzogI2JjZDBjNzstLWJzLXRhYmxlLWFjdGl2ZS1jb2xvcjogIzAwMDstLWJzLXRhYmxlLWhvdmVyLWJnOiAjYzFkNmNjOy0tYnMtdGFibGUtaG92ZXItY29sb3I6ICMwMDA7Y29sb3I6dmFyKC0tYnMtdGFibGUtY29sb3IpO2JvcmRlci1jb2xvcjp2YXIoLS1icy10YWJsZS1ib3JkZXItY29sb3IpfS50YWJsZS1pbmZvey0tYnMtdGFibGUtY29sb3I6ICMwMDA7LS1icy10YWJsZS1iZzogI2NmZjRmYzstLWJzLXRhYmxlLWJvcmRlci1jb2xvcjogI2E2YzNjYTstLWJzLXRhYmxlLXN0cmlwZWQtYmc6ICNjNWU4ZWY7LS1icy10YWJsZS1zdHJpcGVkLWNvbG9yOiAjMDAwOy0tYnMtdGFibGUtYWN0aXZlLWJnOiAjYmFkY2UzOy0tYnMtdGFibGUtYWN0aXZlLWNvbG9yOiAjMDAwOy0tYnMtdGFibGUtaG92ZXItYmc6ICNiZmUyZTk7LS1icy10YWJsZS1ob3Zlci1jb2xvcjogIzAwMDtjb2xvcjp2YXIoLS1icy10YWJsZS1jb2xvcik7Ym9yZGVyLWNvbG9yOnZhcigtLWJzLXRhYmxlLWJvcmRlci1jb2xvcil9LnRhYmxlLXdhcm5pbmd7LS1icy10YWJsZS1jb2xvcjogIzAwMDstLWJzLXRhYmxlLWJnOiAjZmZmM2NkOy0tYnMtdGFibGUtYm9yZGVyLWNvbG9yOiAjY2NjMmE0Oy0tYnMtdGFibGUtc3RyaXBlZC1iZzogI2YyZTdjMzstLWJzLXRhYmxlLXN0cmlwZWQtY29sb3I6ICMwMDA7LS1icy10YWJsZS1hY3RpdmUtYmc6ICNlNmRiYjk7LS1icy10YWJsZS1hY3RpdmUtY29sb3I6ICMwMDA7LS1icy10YWJsZS1ob3Zlci1iZzogI2VjZTFiZTstLWJzLXRhYmxlLWhvdmVyLWNvbG9yOiAjMDAwO2NvbG9yOnZhcigtLWJzLXRhYmxlLWNvbG9yKTtib3JkZXItY29sb3I6dmFyKC0tYnMtdGFibGUtYm9yZGVyLWNvbG9yKX0udGFibGUtZGFuZ2Vyey0tYnMtdGFibGUtY29sb3I6ICMwMDA7LS1icy10YWJsZS1iZzogI2Y4ZDdkYTstLWJzLXRhYmxlLWJvcmRlci1jb2xvcjogI2M2YWNhZTstLWJzLXRhYmxlLXN0cmlwZWQtYmc6ICNlY2NjY2Y7LS1icy10YWJsZS1zdHJpcGVkLWNvbG9yOiAjMDAwOy0tYnMtdGFibGUtYWN0aXZlLWJnOiAjZGZjMmM0Oy0tYnMtdGFibGUtYWN0aXZlLWNvbG9yOiAjMDAwOy0tYnMtdGFibGUtaG92ZXItYmc6ICNlNWM3Y2E7LS1icy10YWJsZS1ob3Zlci1jb2xvcjogIzAwMDtjb2xvcjp2YXIoLS1icy10YWJsZS1jb2xvcik7Ym9yZGVyLWNvbG9yOnZhcigtLWJzLXRhYmxlLWJvcmRlci1jb2xvcil9LnRhYmxlLWxpZ2h0ey0tYnMtdGFibGUtY29sb3I6ICMwMDA7LS1icy10YWJsZS1iZzogI2Y4ZjlmYTstLWJzLXRhYmxlLWJvcmRlci1jb2xvcjogI2M2YzdjODstLWJzLXRhYmxlLXN0cmlwZWQtYmc6ICNlY2VkZWU7LS1icy10YWJsZS1zdHJpcGVkLWNvbG9yOiAjMDAwOy0tYnMtdGFibGUtYWN0aXZlLWJnOiAjZGZlMGUxOy0tYnMtdGFibGUtYWN0aXZlLWNvbG9yOiAjMDAwOy0tYnMtdGFibGUtaG92ZXItYmc6ICNlNWU2ZTc7LS1icy10YWJsZS1ob3Zlci1jb2xvcjogIzAwMDtjb2xvcjp2YXIoLS1icy10YWJsZS1jb2xvcik7Ym9yZGVyLWNvbG9yOnZhcigtLWJzLXRhYmxlLWJvcmRlci1jb2xvcil9LnRhYmxlLWRhcmt7LS1icy10YWJsZS1jb2xvcjogI2ZmZjstLWJzLXRhYmxlLWJnOiAjMjEyNTI5Oy0tYnMtdGFibGUtYm9yZGVyLWNvbG9yOiAjNGQ1MTU0Oy0tYnMtdGFibGUtc3RyaXBlZC1iZzogIzJjMzAzNDstLWJzLXRhYmxlLXN0cmlwZWQtY29sb3I6ICNmZmY7LS1icy10YWJsZS1hY3RpdmUtYmc6ICMzNzNiM2U7LS1icy10YWJsZS1hY3RpdmUtY29sb3I6ICNmZmY7LS1icy10YWJsZS1ob3Zlci1iZzogIzMyMzUzOTstLWJzLXRhYmxlLWhvdmVyLWNvbG9yOiAjZmZmO2NvbG9yOnZhcigtLWJzLXRhYmxlLWNvbG9yKTtib3JkZXItY29sb3I6dmFyKC0tYnMtdGFibGUtYm9yZGVyLWNvbG9yKX0udGFibGUtcmVzcG9uc2l2ZXtvdmVyZmxvdy14OmF1dG87LXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6dG91Y2h9QG1lZGlhIChtYXgtd2lkdGg6IDU3NS45OHB4KXsudGFibGUtcmVzcG9uc2l2ZS1zbXtvdmVyZmxvdy14OmF1dG87LXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6dG91Y2h9fUBtZWRpYSAobWF4LXdpZHRoOiA3NjcuOThweCl7LnRhYmxlLXJlc3BvbnNpdmUtbWR7b3ZlcmZsb3cteDphdXRvOy13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOnRvdWNofX1AbWVkaWEgKG1heC13aWR0aDogOTkxLjk4cHgpey50YWJsZS1yZXNwb25zaXZlLWxne292ZXJmbG93LXg6YXV0bzstd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzp0b3VjaH19QG1lZGlhIChtYXgtd2lkdGg6IDExOTkuOThweCl7LnRhYmxlLXJlc3BvbnNpdmUteGx7b3ZlcmZsb3cteDphdXRvOy13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOnRvdWNofX1AbWVkaWEgKG1heC13aWR0aDogMTM5OS45OHB4KXsudGFibGUtcmVzcG9uc2l2ZS14eGx7b3ZlcmZsb3cteDphdXRvOy13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOnRvdWNofX0uZm9ybS1sYWJlbHttYXJnaW4tYm90dG9tOi41cmVtfS5jb2wtZm9ybS1sYWJlbHtwYWRkaW5nLXRvcDpjYWxjKC4zNzVyZW0gKyB2YXIoLS1icy1ib3JkZXItd2lkdGgpKTtwYWRkaW5nLWJvdHRvbTpjYWxjKC4zNzVyZW0gKyB2YXIoLS1icy1ib3JkZXItd2lkdGgpKTttYXJnaW4tYm90dG9tOjA7Zm9udC1zaXplOmluaGVyaXQ7bGluZS1oZWlnaHQ6MS41fS5jb2wtZm9ybS1sYWJlbC1sZ3twYWRkaW5nLXRvcDpjYWxjKC41cmVtICsgdmFyKC0tYnMtYm9yZGVyLXdpZHRoKSk7cGFkZGluZy1ib3R0b206Y2FsYyguNXJlbSArIHZhcigtLWJzLWJvcmRlci13aWR0aCkpO2ZvbnQtc2l6ZToxLjI1cmVtfS5jb2wtZm9ybS1sYWJlbC1zbXtwYWRkaW5nLXRvcDpjYWxjKC4yNXJlbSArIHZhcigtLWJzLWJvcmRlci13aWR0aCkpO3BhZGRpbmctYm90dG9tOmNhbGMoLjI1cmVtICsgdmFyKC0tYnMtYm9yZGVyLXdpZHRoKSk7Zm9udC1zaXplOi44NzVyZW19LmZvcm0tdGV4dHttYXJnaW4tdG9wOi4yNXJlbTtmb250LXNpemU6Ljg3NWVtO2NvbG9yOnZhcigtLWJzLXNlY29uZGFyeS1jb2xvcil9LmZvcm0tY29udHJvbHtkaXNwbGF5OmJsb2NrO3dpZHRoOjEwMCU7cGFkZGluZzouMzc1cmVtIC43NXJlbTtmb250LXNpemU6MXJlbTtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS41O2NvbG9yOnZhcigtLWJzLWJvZHktY29sb3IpO2FwcGVhcmFuY2U6bm9uZTtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWJzLWJvZHktYmcpO2JhY2tncm91bmQtY2xpcDpwYWRkaW5nLWJveDtib3JkZXI6dmFyKC0tYnMtYm9yZGVyLXdpZHRoKSBzb2xpZCB2YXIoLS1icy1ib3JkZXItY29sb3IpO2JvcmRlci1yYWRpdXM6dmFyKC0tYnMtYm9yZGVyLXJhZGl1cyk7dHJhbnNpdGlvbjpib3JkZXItY29sb3IgMC4xNXMgZWFzZS1pbi1vdXQsYm94LXNoYWRvdyAwLjE1cyBlYXNlLWluLW91dH1AbWVkaWEgKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZSl7LmZvcm0tY29udHJvbHt0cmFuc2l0aW9uOm5vbmV9fS5mb3JtLWNvbnRyb2xbdHlwZT1cImZpbGVcIl17b3ZlcmZsb3c6aGlkZGVufS5mb3JtLWNvbnRyb2xbdHlwZT1cImZpbGVcIl06bm90KDpkaXNhYmxlZCk6bm90KFtyZWFkb25seV0pe2N1cnNvcjpwb2ludGVyfS5mb3JtLWNvbnRyb2w6Zm9jdXN7Y29sb3I6dmFyKC0tYnMtYm9keS1jb2xvcik7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1icy1ib2R5LWJnKTtib3JkZXItY29sb3I6Izg2YjdmZTtvdXRsaW5lOjA7Ym94LXNoYWRvdzowIDAgMCAuMjVyZW0gcmdiYSgxMywxMTAsMjUzLDAuMjUpfS5mb3JtLWNvbnRyb2w6Oi13ZWJraXQtZGF0ZS1hbmQtdGltZS12YWx1ZXttaW4td2lkdGg6ODVweDtoZWlnaHQ6MS41ZW07bWFyZ2luOjB9LmZvcm0tY29udHJvbDo6LXdlYmtpdC1kYXRldGltZS1lZGl0e2Rpc3BsYXk6YmxvY2s7cGFkZGluZzowfS5mb3JtLWNvbnRyb2w6OnBsYWNlaG9sZGVye2NvbG9yOnZhcigtLWJzLXNlY29uZGFyeS1jb2xvcik7b3BhY2l0eToxfS5mb3JtLWNvbnRyb2w6ZGlzYWJsZWR7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1icy1zZWNvbmRhcnktYmcpO29wYWNpdHk6MX0uZm9ybS1jb250cm9sOjpmaWxlLXNlbGVjdG9yLWJ1dHRvbntwYWRkaW5nOi4zNzVyZW0gLjc1cmVtO21hcmdpbjotLjM3NXJlbSAtLjc1cmVtO21hcmdpbi1pbmxpbmUtZW5kOi43NXJlbTtjb2xvcjp2YXIoLS1icy1ib2R5LWNvbG9yKTtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWJzLXRlcnRpYXJ5LWJnKTtwb2ludGVyLWV2ZW50czpub25lO2JvcmRlci1jb2xvcjppbmhlcml0O2JvcmRlci1zdHlsZTpzb2xpZDtib3JkZXItd2lkdGg6MDtib3JkZXItaW5saW5lLWVuZC13aWR0aDp2YXIoLS1icy1ib3JkZXItd2lkdGgpO2JvcmRlci1yYWRpdXM6MDt0cmFuc2l0aW9uOmNvbG9yIDAuMTVzIGVhc2UtaW4tb3V0LGJhY2tncm91bmQtY29sb3IgMC4xNXMgZWFzZS1pbi1vdXQsYm9yZGVyLWNvbG9yIDAuMTVzIGVhc2UtaW4tb3V0LGJveC1zaGFkb3cgMC4xNXMgZWFzZS1pbi1vdXR9QG1lZGlhIChwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2Upey5mb3JtLWNvbnRyb2w6OmZpbGUtc2VsZWN0b3ItYnV0dG9ue3RyYW5zaXRpb246bm9uZX19LmZvcm0tY29udHJvbDpob3Zlcjpub3QoOmRpc2FibGVkKTpub3QoW3JlYWRvbmx5XSk6OmZpbGUtc2VsZWN0b3ItYnV0dG9ue2JhY2tncm91bmQtY29sb3I6dmFyKC0tYnMtc2Vjb25kYXJ5LWJnKX0uZm9ybS1jb250cm9sLXBsYWludGV4dHtkaXNwbGF5OmJsb2NrO3dpZHRoOjEwMCU7cGFkZGluZzouMzc1cmVtIDA7bWFyZ2luLWJvdHRvbTowO2xpbmUtaGVpZ2h0OjEuNTtjb2xvcjp2YXIoLS1icy1ib2R5LWNvbG9yKTtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O2JvcmRlcjpzb2xpZCB0cmFuc3BhcmVudDtib3JkZXItd2lkdGg6dmFyKC0tYnMtYm9yZGVyLXdpZHRoKSAwfS5mb3JtLWNvbnRyb2wtcGxhaW50ZXh0OmZvY3Vze291dGxpbmU6MH0uZm9ybS1jb250cm9sLXBsYWludGV4dC5mb3JtLWNvbnRyb2wtc20sLmZvcm0tY29udHJvbC1wbGFpbnRleHQuZm9ybS1jb250cm9sLWxne3BhZGRpbmctcmlnaHQ6MDtwYWRkaW5nLWxlZnQ6MH0uZm9ybS1jb250cm9sLXNte21pbi1oZWlnaHQ6Y2FsYygxLjVlbSArIC41cmVtICsgY2FsYyh2YXIoLS1icy1ib3JkZXItd2lkdGgpICogMikpO3BhZGRpbmc6LjI1cmVtIC41cmVtO2ZvbnQtc2l6ZTouODc1cmVtO2JvcmRlci1yYWRpdXM6dmFyKC0tYnMtYm9yZGVyLXJhZGl1cy1zbSl9LmZvcm0tY29udHJvbC1zbTo6ZmlsZS1zZWxlY3Rvci1idXR0b257cGFkZGluZzouMjVyZW0gLjVyZW07bWFyZ2luOi0uMjVyZW0gLS41cmVtO21hcmdpbi1pbmxpbmUtZW5kOi41cmVtfS5mb3JtLWNvbnRyb2wtbGd7bWluLWhlaWdodDpjYWxjKDEuNWVtICsgMXJlbSArIGNhbGModmFyKC0tYnMtYm9yZGVyLXdpZHRoKSAqIDIpKTtwYWRkaW5nOi41cmVtIDFyZW07Zm9udC1zaXplOjEuMjVyZW07Ym9yZGVyLXJhZGl1czp2YXIoLS1icy1ib3JkZXItcmFkaXVzLWxnKX0uZm9ybS1jb250cm9sLWxnOjpmaWxlLXNlbGVjdG9yLWJ1dHRvbntwYWRkaW5nOi41cmVtIDFyZW07bWFyZ2luOi0uNXJlbSAtMXJlbTttYXJnaW4taW5saW5lLWVuZDoxcmVtfXRleHRhcmVhLmZvcm0tY29udHJvbHttaW4taGVpZ2h0OmNhbGMoMS41ZW0gKyAuNzVyZW0gKyBjYWxjKHZhcigtLWJzLWJvcmRlci13aWR0aCkgKiAyKSl9dGV4dGFyZWEuZm9ybS1jb250cm9sLXNte21pbi1oZWlnaHQ6Y2FsYygxLjVlbSArIC41cmVtICsgY2FsYyh2YXIoLS1icy1ib3JkZXItd2lkdGgpICogMikpfXRleHRhcmVhLmZvcm0tY29udHJvbC1sZ3ttaW4taGVpZ2h0OmNhbGMoMS41ZW0gKyAxcmVtICsgY2FsYyh2YXIoLS1icy1ib3JkZXItd2lkdGgpICogMikpfS5mb3JtLWNvbnRyb2wtY29sb3J7d2lkdGg6M3JlbTtoZWlnaHQ6Y2FsYygxLjVlbSArIC43NXJlbSArIGNhbGModmFyKC0tYnMtYm9yZGVyLXdpZHRoKSAqIDIpKTtwYWRkaW5nOi4zNzVyZW19LmZvcm0tY29udHJvbC1jb2xvcjpub3QoOmRpc2FibGVkKTpub3QoW3JlYWRvbmx5XSl7Y3Vyc29yOnBvaW50ZXJ9LmZvcm0tY29udHJvbC1jb2xvcjo6LW1vei1jb2xvci1zd2F0Y2h7Ym9yZGVyOjAgIWltcG9ydGFudDtib3JkZXItcmFkaXVzOnZhcigtLWJzLWJvcmRlci1yYWRpdXMpfS5mb3JtLWNvbnRyb2wtY29sb3I6Oi13ZWJraXQtY29sb3Itc3dhdGNoe2JvcmRlcjowICFpbXBvcnRhbnQ7Ym9yZGVyLXJhZGl1czp2YXIoLS1icy1ib3JkZXItcmFkaXVzKX0uZm9ybS1jb250cm9sLWNvbG9yLmZvcm0tY29udHJvbC1zbXtoZWlnaHQ6Y2FsYygxLjVlbSArIC41cmVtICsgY2FsYyh2YXIoLS1icy1ib3JkZXItd2lkdGgpICogMikpfS5mb3JtLWNvbnRyb2wtY29sb3IuZm9ybS1jb250cm9sLWxne2hlaWdodDpjYWxjKDEuNWVtICsgMXJlbSArIGNhbGModmFyKC0tYnMtYm9yZGVyLXdpZHRoKSAqIDIpKX0uZm9ybS1zZWxlY3R7LS1icy1mb3JtLXNlbGVjdC1iZy1pbWc6IHVybCgke19fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzBfX199KTtkaXNwbGF5OmJsb2NrO3dpZHRoOjEwMCU7cGFkZGluZzouMzc1cmVtIDIuMjVyZW0gLjM3NXJlbSAuNzVyZW07Zm9udC1zaXplOjFyZW07Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuNTtjb2xvcjp2YXIoLS1icy1ib2R5LWNvbG9yKTthcHBlYXJhbmNlOm5vbmU7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1icy1ib2R5LWJnKTtiYWNrZ3JvdW5kLWltYWdlOnZhcigtLWJzLWZvcm0tc2VsZWN0LWJnLWltZyksdmFyKC0tYnMtZm9ybS1zZWxlY3QtYmctaWNvbiwgbm9uZSk7YmFja2dyb3VuZC1yZXBlYXQ6bm8tcmVwZWF0O2JhY2tncm91bmQtcG9zaXRpb246cmlnaHQgLjc1cmVtIGNlbnRlcjtiYWNrZ3JvdW5kLXNpemU6MTZweCAxMnB4O2JvcmRlcjp2YXIoLS1icy1ib3JkZXItd2lkdGgpIHNvbGlkIHZhcigtLWJzLWJvcmRlci1jb2xvcik7Ym9yZGVyLXJhZGl1czp2YXIoLS1icy1ib3JkZXItcmFkaXVzKTt0cmFuc2l0aW9uOmJvcmRlci1jb2xvciAwLjE1cyBlYXNlLWluLW91dCxib3gtc2hhZG93IDAuMTVzIGVhc2UtaW4tb3V0fUBtZWRpYSAocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogcmVkdWNlKXsuZm9ybS1zZWxlY3R7dHJhbnNpdGlvbjpub25lfX0uZm9ybS1zZWxlY3Q6Zm9jdXN7Ym9yZGVyLWNvbG9yOiM4NmI3ZmU7b3V0bGluZTowO2JveC1zaGFkb3c6MCAwIDAgLjI1cmVtIHJnYmEoMTMsMTEwLDI1MywwLjI1KX0uZm9ybS1zZWxlY3RbbXVsdGlwbGVdLC5mb3JtLXNlbGVjdFtzaXplXTpub3QoW3NpemU9XCIxXCJdKXtwYWRkaW5nLXJpZ2h0Oi43NXJlbTtiYWNrZ3JvdW5kLWltYWdlOm5vbmV9LmZvcm0tc2VsZWN0OmRpc2FibGVke2JhY2tncm91bmQtY29sb3I6dmFyKC0tYnMtc2Vjb25kYXJ5LWJnKX0uZm9ybS1zZWxlY3Q6LW1vei1mb2N1c3Jpbmd7Y29sb3I6dHJhbnNwYXJlbnQ7dGV4dC1zaGFkb3c6MCAwIDAgdmFyKC0tYnMtYm9keS1jb2xvcil9LmZvcm0tc2VsZWN0LXNte3BhZGRpbmctdG9wOi4yNXJlbTtwYWRkaW5nLWJvdHRvbTouMjVyZW07cGFkZGluZy1sZWZ0Oi41cmVtO2ZvbnQtc2l6ZTouODc1cmVtO2JvcmRlci1yYWRpdXM6dmFyKC0tYnMtYm9yZGVyLXJhZGl1cy1zbSl9LmZvcm0tc2VsZWN0LWxne3BhZGRpbmctdG9wOi41cmVtO3BhZGRpbmctYm90dG9tOi41cmVtO3BhZGRpbmctbGVmdDoxcmVtO2ZvbnQtc2l6ZToxLjI1cmVtO2JvcmRlci1yYWRpdXM6dmFyKC0tYnMtYm9yZGVyLXJhZGl1cy1sZyl9W2RhdGEtYnMtdGhlbWU9XCJkYXJrXCJdIC5mb3JtLXNlbGVjdHstLWJzLWZvcm0tc2VsZWN0LWJnLWltZzogdXJsKCR7X19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMV9fX30pfS5mb3JtLWNoZWNre2Rpc3BsYXk6YmxvY2s7bWluLWhlaWdodDoxLjVyZW07cGFkZGluZy1sZWZ0OjEuNWVtO21hcmdpbi1ib3R0b206LjEyNXJlbX0uZm9ybS1jaGVjayAuZm9ybS1jaGVjay1pbnB1dHtmbG9hdDpsZWZ0O21hcmdpbi1sZWZ0Oi0xLjVlbX0uZm9ybS1jaGVjay1yZXZlcnNle3BhZGRpbmctcmlnaHQ6MS41ZW07cGFkZGluZy1sZWZ0OjA7dGV4dC1hbGlnbjpyaWdodH0uZm9ybS1jaGVjay1yZXZlcnNlIC5mb3JtLWNoZWNrLWlucHV0e2Zsb2F0OnJpZ2h0O21hcmdpbi1yaWdodDotMS41ZW07bWFyZ2luLWxlZnQ6MH0uZm9ybS1jaGVjay1pbnB1dHstLWJzLWZvcm0tY2hlY2stYmc6IHZhcigtLWJzLWJvZHktYmcpO2ZsZXgtc2hyaW5rOjA7d2lkdGg6MWVtO2hlaWdodDoxZW07bWFyZ2luLXRvcDouMjVlbTt2ZXJ0aWNhbC1hbGlnbjp0b3A7YXBwZWFyYW5jZTpub25lO2JhY2tncm91bmQtY29sb3I6dmFyKC0tYnMtZm9ybS1jaGVjay1iZyk7YmFja2dyb3VuZC1pbWFnZTp2YXIoLS1icy1mb3JtLWNoZWNrLWJnLWltYWdlKTtiYWNrZ3JvdW5kLXJlcGVhdDpuby1yZXBlYXQ7YmFja2dyb3VuZC1wb3NpdGlvbjpjZW50ZXI7YmFja2dyb3VuZC1zaXplOmNvbnRhaW47Ym9yZGVyOnZhcigtLWJzLWJvcmRlci13aWR0aCkgc29saWQgdmFyKC0tYnMtYm9yZGVyLWNvbG9yKTtwcmludC1jb2xvci1hZGp1c3Q6ZXhhY3R9LmZvcm0tY2hlY2staW5wdXRbdHlwZT1cImNoZWNrYm94XCJde2JvcmRlci1yYWRpdXM6LjI1ZW19LmZvcm0tY2hlY2staW5wdXRbdHlwZT1cInJhZGlvXCJde2JvcmRlci1yYWRpdXM6NTAlfS5mb3JtLWNoZWNrLWlucHV0OmFjdGl2ZXtmaWx0ZXI6YnJpZ2h0bmVzcyg5MCUpfS5mb3JtLWNoZWNrLWlucHV0OmZvY3Vze2JvcmRlci1jb2xvcjojODZiN2ZlO291dGxpbmU6MDtib3gtc2hhZG93OjAgMCAwIC4yNXJlbSByZ2JhKDEzLDExMCwyNTMsMC4yNSl9LmZvcm0tY2hlY2staW5wdXQ6Y2hlY2tlZHtiYWNrZ3JvdW5kLWNvbG9yOiMwZDZlZmQ7Ym9yZGVyLWNvbG9yOiMwZDZlZmR9LmZvcm0tY2hlY2staW5wdXQ6Y2hlY2tlZFt0eXBlPVwiY2hlY2tib3hcIl17LS1icy1mb3JtLWNoZWNrLWJnLWltYWdlOiB1cmwoJHtfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8yX19ffSl9LmZvcm0tY2hlY2staW5wdXQ6Y2hlY2tlZFt0eXBlPVwicmFkaW9cIl17LS1icy1mb3JtLWNoZWNrLWJnLWltYWdlOiB1cmwoJHtfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8zX19ffSl9LmZvcm0tY2hlY2staW5wdXRbdHlwZT1cImNoZWNrYm94XCJdOmluZGV0ZXJtaW5hdGV7YmFja2dyb3VuZC1jb2xvcjojMGQ2ZWZkO2JvcmRlci1jb2xvcjojMGQ2ZWZkOy0tYnMtZm9ybS1jaGVjay1iZy1pbWFnZTogdXJsKCR7X19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfNF9fX30pfS5mb3JtLWNoZWNrLWlucHV0OmRpc2FibGVke3BvaW50ZXItZXZlbnRzOm5vbmU7ZmlsdGVyOm5vbmU7b3BhY2l0eTouNX0uZm9ybS1jaGVjay1pbnB1dFtkaXNhYmxlZF0gfiAuZm9ybS1jaGVjay1sYWJlbCwuZm9ybS1jaGVjay1pbnB1dDpkaXNhYmxlZCB+IC5mb3JtLWNoZWNrLWxhYmVse2N1cnNvcjpkZWZhdWx0O29wYWNpdHk6LjV9LmZvcm0tc3dpdGNoe3BhZGRpbmctbGVmdDoyLjVlbX0uZm9ybS1zd2l0Y2ggLmZvcm0tY2hlY2staW5wdXR7LS1icy1mb3JtLXN3aXRjaC1iZzogdXJsKCR7X19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfNV9fX30pO3dpZHRoOjJlbTttYXJnaW4tbGVmdDotMi41ZW07YmFja2dyb3VuZC1pbWFnZTp2YXIoLS1icy1mb3JtLXN3aXRjaC1iZyk7YmFja2dyb3VuZC1wb3NpdGlvbjpsZWZ0IGNlbnRlcjtib3JkZXItcmFkaXVzOjJlbTt0cmFuc2l0aW9uOmJhY2tncm91bmQtcG9zaXRpb24gMC4xNXMgZWFzZS1pbi1vdXR9QG1lZGlhIChwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2Upey5mb3JtLXN3aXRjaCAuZm9ybS1jaGVjay1pbnB1dHt0cmFuc2l0aW9uOm5vbmV9fS5mb3JtLXN3aXRjaCAuZm9ybS1jaGVjay1pbnB1dDpmb2N1c3stLWJzLWZvcm0tc3dpdGNoLWJnOiB1cmwoJHtfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF82X19ffSl9LmZvcm0tc3dpdGNoIC5mb3JtLWNoZWNrLWlucHV0OmNoZWNrZWR7YmFja2dyb3VuZC1wb3NpdGlvbjpyaWdodCBjZW50ZXI7LS1icy1mb3JtLXN3aXRjaC1iZzogdXJsKCR7X19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfN19fX30pfS5mb3JtLXN3aXRjaC5mb3JtLWNoZWNrLXJldmVyc2V7cGFkZGluZy1yaWdodDoyLjVlbTtwYWRkaW5nLWxlZnQ6MH0uZm9ybS1zd2l0Y2guZm9ybS1jaGVjay1yZXZlcnNlIC5mb3JtLWNoZWNrLWlucHV0e21hcmdpbi1yaWdodDotMi41ZW07bWFyZ2luLWxlZnQ6MH0uZm9ybS1jaGVjay1pbmxpbmV7ZGlzcGxheTppbmxpbmUtYmxvY2s7bWFyZ2luLXJpZ2h0OjFyZW19LmJ0bi1jaGVja3twb3NpdGlvbjphYnNvbHV0ZTtjbGlwOnJlY3QoMCwgMCwgMCwgMCk7cG9pbnRlci1ldmVudHM6bm9uZX0uYnRuLWNoZWNrW2Rpc2FibGVkXSsuYnRuLC5idG4tY2hlY2s6ZGlzYWJsZWQrLmJ0bntwb2ludGVyLWV2ZW50czpub25lO2ZpbHRlcjpub25lO29wYWNpdHk6LjY1fVtkYXRhLWJzLXRoZW1lPVwiZGFya1wiXSAuZm9ybS1zd2l0Y2ggLmZvcm0tY2hlY2staW5wdXQ6bm90KDpjaGVja2VkKTpub3QoOmZvY3VzKXstLWJzLWZvcm0tc3dpdGNoLWJnOiB1cmwoJHtfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF84X19ffSl9LmZvcm0tcmFuZ2V7d2lkdGg6MTAwJTtoZWlnaHQ6MS41cmVtO3BhZGRpbmc6MDthcHBlYXJhbmNlOm5vbmU7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0uZm9ybS1yYW5nZTpmb2N1c3tvdXRsaW5lOjB9LmZvcm0tcmFuZ2U6Zm9jdXM6Oi13ZWJraXQtc2xpZGVyLXRodW1ie2JveC1zaGFkb3c6MCAwIDAgMXB4ICNmZmYsMCAwIDAgLjI1cmVtIHJnYmEoMTMsMTEwLDI1MywwLjI1KX0uZm9ybS1yYW5nZTpmb2N1czo6LW1vei1yYW5nZS10aHVtYntib3gtc2hhZG93OjAgMCAwIDFweCAjZmZmLDAgMCAwIC4yNXJlbSByZ2JhKDEzLDExMCwyNTMsMC4yNSl9LmZvcm0tcmFuZ2U6Oi1tb3otZm9jdXMtb3V0ZXJ7Ym9yZGVyOjB9LmZvcm0tcmFuZ2U6Oi13ZWJraXQtc2xpZGVyLXRodW1ie3dpZHRoOjFyZW07aGVpZ2h0OjFyZW07bWFyZ2luLXRvcDotLjI1cmVtO2FwcGVhcmFuY2U6bm9uZTtiYWNrZ3JvdW5kLWNvbG9yOiMwZDZlZmQ7Ym9yZGVyOjA7Ym9yZGVyLXJhZGl1czoxcmVtO3RyYW5zaXRpb246YmFja2dyb3VuZC1jb2xvciAwLjE1cyBlYXNlLWluLW91dCxib3JkZXItY29sb3IgMC4xNXMgZWFzZS1pbi1vdXQsYm94LXNoYWRvdyAwLjE1cyBlYXNlLWluLW91dH1AbWVkaWEgKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZSl7LmZvcm0tcmFuZ2U6Oi13ZWJraXQtc2xpZGVyLXRodW1ie3RyYW5zaXRpb246bm9uZX19LmZvcm0tcmFuZ2U6Oi13ZWJraXQtc2xpZGVyLXRodW1iOmFjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOiNiNmQ0ZmV9LmZvcm0tcmFuZ2U6Oi13ZWJraXQtc2xpZGVyLXJ1bm5hYmxlLXRyYWNre3dpZHRoOjEwMCU7aGVpZ2h0Oi41cmVtO2NvbG9yOnRyYW5zcGFyZW50O2N1cnNvcjpwb2ludGVyO2JhY2tncm91bmQtY29sb3I6dmFyKC0tYnMtc2Vjb25kYXJ5LWJnKTtib3JkZXItY29sb3I6dHJhbnNwYXJlbnQ7Ym9yZGVyLXJhZGl1czoxcmVtfS5mb3JtLXJhbmdlOjotbW96LXJhbmdlLXRodW1ie3dpZHRoOjFyZW07aGVpZ2h0OjFyZW07YXBwZWFyYW5jZTpub25lO2JhY2tncm91bmQtY29sb3I6IzBkNmVmZDtib3JkZXI6MDtib3JkZXItcmFkaXVzOjFyZW07dHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIDAuMTVzIGVhc2UtaW4tb3V0LGJvcmRlci1jb2xvciAwLjE1cyBlYXNlLWluLW91dCxib3gtc2hhZG93IDAuMTVzIGVhc2UtaW4tb3V0fUBtZWRpYSAocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogcmVkdWNlKXsuZm9ybS1yYW5nZTo6LW1vei1yYW5nZS10aHVtYnt0cmFuc2l0aW9uOm5vbmV9fS5mb3JtLXJhbmdlOjotbW96LXJhbmdlLXRodW1iOmFjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOiNiNmQ0ZmV9LmZvcm0tcmFuZ2U6Oi1tb3otcmFuZ2UtdHJhY2t7d2lkdGg6MTAwJTtoZWlnaHQ6LjVyZW07Y29sb3I6dHJhbnNwYXJlbnQ7Y3Vyc29yOnBvaW50ZXI7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1icy1zZWNvbmRhcnktYmcpO2JvcmRlci1jb2xvcjp0cmFuc3BhcmVudDtib3JkZXItcmFkaXVzOjFyZW19LmZvcm0tcmFuZ2U6ZGlzYWJsZWR7cG9pbnRlci1ldmVudHM6bm9uZX0uZm9ybS1yYW5nZTpkaXNhYmxlZDo6LXdlYmtpdC1zbGlkZXItdGh1bWJ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1icy1zZWNvbmRhcnktY29sb3IpfS5mb3JtLXJhbmdlOmRpc2FibGVkOjotbW96LXJhbmdlLXRodW1ie2JhY2tncm91bmQtY29sb3I6dmFyKC0tYnMtc2Vjb25kYXJ5LWNvbG9yKX0uZm9ybS1mbG9hdGluZ3twb3NpdGlvbjpyZWxhdGl2ZX0uZm9ybS1mbG9hdGluZz4uZm9ybS1jb250cm9sLC5mb3JtLWZsb2F0aW5nPi5mb3JtLWNvbnRyb2wtcGxhaW50ZXh0LC5mb3JtLWZsb2F0aW5nPi5mb3JtLXNlbGVjdHtoZWlnaHQ6Y2FsYygzLjVyZW0gKyBjYWxjKHZhcigtLWJzLWJvcmRlci13aWR0aCkgKiAyKSk7bWluLWhlaWdodDpjYWxjKDMuNXJlbSArIGNhbGModmFyKC0tYnMtYm9yZGVyLXdpZHRoKSAqIDIpKTtsaW5lLWhlaWdodDoxLjI1fS5mb3JtLWZsb2F0aW5nPmxhYmVse3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDt6LWluZGV4OjI7aGVpZ2h0OjEwMCU7cGFkZGluZzoxcmVtIC43NXJlbTtvdmVyZmxvdzpoaWRkZW47dGV4dC1hbGlnbjpzdGFydDt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO3doaXRlLXNwYWNlOm5vd3JhcDtwb2ludGVyLWV2ZW50czpub25lO2JvcmRlcjp2YXIoLS1icy1ib3JkZXItd2lkdGgpIHNvbGlkIHRyYW5zcGFyZW50O3RyYW5zZm9ybS1vcmlnaW46MCAwO3RyYW5zaXRpb246b3BhY2l0eSAwLjFzIGVhc2UtaW4tb3V0LHRyYW5zZm9ybSAwLjFzIGVhc2UtaW4tb3V0fUBtZWRpYSAocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogcmVkdWNlKXsuZm9ybS1mbG9hdGluZz5sYWJlbHt0cmFuc2l0aW9uOm5vbmV9fS5mb3JtLWZsb2F0aW5nPi5mb3JtLWNvbnRyb2wsLmZvcm0tZmxvYXRpbmc+LmZvcm0tY29udHJvbC1wbGFpbnRleHR7cGFkZGluZzoxcmVtIC43NXJlbX0uZm9ybS1mbG9hdGluZz4uZm9ybS1jb250cm9sOjpwbGFjZWhvbGRlciwuZm9ybS1mbG9hdGluZz4uZm9ybS1jb250cm9sLXBsYWludGV4dDo6cGxhY2Vob2xkZXJ7Y29sb3I6dHJhbnNwYXJlbnR9LmZvcm0tZmxvYXRpbmc+LmZvcm0tY29udHJvbDpmb2N1cywuZm9ybS1mbG9hdGluZz4uZm9ybS1jb250cm9sOm5vdCg6cGxhY2Vob2xkZXItc2hvd24pLC5mb3JtLWZsb2F0aW5nPi5mb3JtLWNvbnRyb2wtcGxhaW50ZXh0OmZvY3VzLC5mb3JtLWZsb2F0aW5nPi5mb3JtLWNvbnRyb2wtcGxhaW50ZXh0Om5vdCg6cGxhY2Vob2xkZXItc2hvd24pe3BhZGRpbmctdG9wOjEuNjI1cmVtO3BhZGRpbmctYm90dG9tOi42MjVyZW19LmZvcm0tZmxvYXRpbmc+LmZvcm0tY29udHJvbDotd2Via2l0LWF1dG9maWxsLC5mb3JtLWZsb2F0aW5nPi5mb3JtLWNvbnRyb2wtcGxhaW50ZXh0Oi13ZWJraXQtYXV0b2ZpbGx7cGFkZGluZy10b3A6MS42MjVyZW07cGFkZGluZy1ib3R0b206LjYyNXJlbX0uZm9ybS1mbG9hdGluZz4uZm9ybS1zZWxlY3R7cGFkZGluZy10b3A6MS42MjVyZW07cGFkZGluZy1ib3R0b206LjYyNXJlbX0uZm9ybS1mbG9hdGluZz4uZm9ybS1jb250cm9sOmZvY3VzIH4gbGFiZWwsLmZvcm0tZmxvYXRpbmc+LmZvcm0tY29udHJvbDpub3QoOnBsYWNlaG9sZGVyLXNob3duKSB+IGxhYmVsLC5mb3JtLWZsb2F0aW5nPi5mb3JtLWNvbnRyb2wtcGxhaW50ZXh0IH4gbGFiZWwsLmZvcm0tZmxvYXRpbmc+LmZvcm0tc2VsZWN0IH4gbGFiZWx7Y29sb3I6cmdiYSh2YXIoLS1icy1ib2R5LWNvbG9yLXJnYiksIC42NSk7dHJhbnNmb3JtOnNjYWxlKDAuODUpIHRyYW5zbGF0ZVkoLTAuNXJlbSkgdHJhbnNsYXRlWCgwLjE1cmVtKX0uZm9ybS1mbG9hdGluZz4uZm9ybS1jb250cm9sOmZvY3VzIH4gbGFiZWw6OmFmdGVyLC5mb3JtLWZsb2F0aW5nPi5mb3JtLWNvbnRyb2w6bm90KDpwbGFjZWhvbGRlci1zaG93bikgfiBsYWJlbDo6YWZ0ZXIsLmZvcm0tZmxvYXRpbmc+LmZvcm0tY29udHJvbC1wbGFpbnRleHQgfiBsYWJlbDo6YWZ0ZXIsLmZvcm0tZmxvYXRpbmc+LmZvcm0tc2VsZWN0IH4gbGFiZWw6OmFmdGVye3Bvc2l0aW9uOmFic29sdXRlO2luc2V0OjFyZW0gLjM3NXJlbTt6LWluZGV4Oi0xO2hlaWdodDoxLjVlbTtjb250ZW50OlwiXCI7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1icy1ib2R5LWJnKTtib3JkZXItcmFkaXVzOnZhcigtLWJzLWJvcmRlci1yYWRpdXMpfS5mb3JtLWZsb2F0aW5nPi5mb3JtLWNvbnRyb2w6LXdlYmtpdC1hdXRvZmlsbCB+IGxhYmVse2NvbG9yOnJnYmEodmFyKC0tYnMtYm9keS1jb2xvci1yZ2IpLCAuNjUpO3RyYW5zZm9ybTpzY2FsZSgwLjg1KSB0cmFuc2xhdGVZKC0wLjVyZW0pIHRyYW5zbGF0ZVgoMC4xNXJlbSl9LmZvcm0tZmxvYXRpbmc+LmZvcm0tY29udHJvbC1wbGFpbnRleHQgfiBsYWJlbHtib3JkZXItd2lkdGg6dmFyKC0tYnMtYm9yZGVyLXdpZHRoKSAwfS5mb3JtLWZsb2F0aW5nPjpkaXNhYmxlZCB+IGxhYmVsLC5mb3JtLWZsb2F0aW5nPi5mb3JtLWNvbnRyb2w6ZGlzYWJsZWQgfiBsYWJlbHtjb2xvcjojNmM3NTdkfS5mb3JtLWZsb2F0aW5nPjpkaXNhYmxlZCB+IGxhYmVsOjphZnRlciwuZm9ybS1mbG9hdGluZz4uZm9ybS1jb250cm9sOmRpc2FibGVkIH4gbGFiZWw6OmFmdGVye2JhY2tncm91bmQtY29sb3I6dmFyKC0tYnMtc2Vjb25kYXJ5LWJnKX0uaW5wdXQtZ3JvdXB7cG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTpmbGV4O2ZsZXgtd3JhcDp3cmFwO2FsaWduLWl0ZW1zOnN0cmV0Y2g7d2lkdGg6MTAwJX0uaW5wdXQtZ3JvdXA+LmZvcm0tY29udHJvbCwuaW5wdXQtZ3JvdXA+LmZvcm0tc2VsZWN0LC5pbnB1dC1ncm91cD4uZm9ybS1mbG9hdGluZ3twb3NpdGlvbjpyZWxhdGl2ZTtmbGV4OjEgMSBhdXRvO3dpZHRoOjElO21pbi13aWR0aDowfS5pbnB1dC1ncm91cD4uZm9ybS1jb250cm9sOmZvY3VzLC5pbnB1dC1ncm91cD4uZm9ybS1zZWxlY3Q6Zm9jdXMsLmlucHV0LWdyb3VwPi5mb3JtLWZsb2F0aW5nOmZvY3VzLXdpdGhpbnt6LWluZGV4OjV9LmlucHV0LWdyb3VwIC5idG57cG9zaXRpb246cmVsYXRpdmU7ei1pbmRleDoyfS5pbnB1dC1ncm91cCAuYnRuOmZvY3Vze3otaW5kZXg6NX0uaW5wdXQtZ3JvdXAtdGV4dHtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO3BhZGRpbmc6LjM3NXJlbSAuNzVyZW07Zm9udC1zaXplOjFyZW07Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuNTtjb2xvcjp2YXIoLS1icy1ib2R5LWNvbG9yKTt0ZXh0LWFsaWduOmNlbnRlcjt3aGl0ZS1zcGFjZTpub3dyYXA7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1icy10ZXJ0aWFyeS1iZyk7Ym9yZGVyOnZhcigtLWJzLWJvcmRlci13aWR0aCkgc29saWQgdmFyKC0tYnMtYm9yZGVyLWNvbG9yKTtib3JkZXItcmFkaXVzOnZhcigtLWJzLWJvcmRlci1yYWRpdXMpfS5pbnB1dC1ncm91cC1sZz4uZm9ybS1jb250cm9sLC5pbnB1dC1ncm91cC1sZz4uZm9ybS1zZWxlY3QsLmlucHV0LWdyb3VwLWxnPi5pbnB1dC1ncm91cC10ZXh0LC5pbnB1dC1ncm91cC1sZz4uYnRue3BhZGRpbmc6LjVyZW0gMXJlbTtmb250LXNpemU6MS4yNXJlbTtib3JkZXItcmFkaXVzOnZhcigtLWJzLWJvcmRlci1yYWRpdXMtbGcpfS5pbnB1dC1ncm91cC1zbT4uZm9ybS1jb250cm9sLC5pbnB1dC1ncm91cC1zbT4uZm9ybS1zZWxlY3QsLmlucHV0LWdyb3VwLXNtPi5pbnB1dC1ncm91cC10ZXh0LC5pbnB1dC1ncm91cC1zbT4uYnRue3BhZGRpbmc6LjI1cmVtIC41cmVtO2ZvbnQtc2l6ZTouODc1cmVtO2JvcmRlci1yYWRpdXM6dmFyKC0tYnMtYm9yZGVyLXJhZGl1cy1zbSl9LmlucHV0LWdyb3VwLWxnPi5mb3JtLXNlbGVjdCwuaW5wdXQtZ3JvdXAtc20+LmZvcm0tc2VsZWN0e3BhZGRpbmctcmlnaHQ6M3JlbX0uaW5wdXQtZ3JvdXA6bm90KC5oYXMtdmFsaWRhdGlvbik+Om5vdCg6bGFzdC1jaGlsZCk6bm90KC5kcm9wZG93bi10b2dnbGUpOm5vdCguZHJvcGRvd24tbWVudSk6bm90KC5mb3JtLWZsb2F0aW5nKSwuaW5wdXQtZ3JvdXA6bm90KC5oYXMtdmFsaWRhdGlvbik+LmRyb3Bkb3duLXRvZ2dsZTpudGgtbGFzdC1jaGlsZChuKzMpLC5pbnB1dC1ncm91cDpub3QoLmhhcy12YWxpZGF0aW9uKT4uZm9ybS1mbG9hdGluZzpub3QoOmxhc3QtY2hpbGQpPi5mb3JtLWNvbnRyb2wsLmlucHV0LWdyb3VwOm5vdCguaGFzLXZhbGlkYXRpb24pPi5mb3JtLWZsb2F0aW5nOm5vdCg6bGFzdC1jaGlsZCk+LmZvcm0tc2VsZWN0e2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOjA7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6MH0uaW5wdXQtZ3JvdXAuaGFzLXZhbGlkYXRpb24+Om50aC1sYXN0LWNoaWxkKG4rMyk6bm90KC5kcm9wZG93bi10b2dnbGUpOm5vdCguZHJvcGRvd24tbWVudSk6bm90KC5mb3JtLWZsb2F0aW5nKSwuaW5wdXQtZ3JvdXAuaGFzLXZhbGlkYXRpb24+LmRyb3Bkb3duLXRvZ2dsZTpudGgtbGFzdC1jaGlsZChuKzQpLC5pbnB1dC1ncm91cC5oYXMtdmFsaWRhdGlvbj4uZm9ybS1mbG9hdGluZzpudGgtbGFzdC1jaGlsZChuKzMpPi5mb3JtLWNvbnRyb2wsLmlucHV0LWdyb3VwLmhhcy12YWxpZGF0aW9uPi5mb3JtLWZsb2F0aW5nOm50aC1sYXN0LWNoaWxkKG4rMyk+LmZvcm0tc2VsZWN0e2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOjA7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6MH0uaW5wdXQtZ3JvdXA+Om5vdCg6Zmlyc3QtY2hpbGQpOm5vdCguZHJvcGRvd24tbWVudSk6bm90KC52YWxpZC10b29sdGlwKTpub3QoLnZhbGlkLWZlZWRiYWNrKTpub3QoLmludmFsaWQtdG9vbHRpcCk6bm90KC5pbnZhbGlkLWZlZWRiYWNrKXttYXJnaW4tbGVmdDpjYWxjKHZhcigtLWJzLWJvcmRlci13aWR0aCkgKiAtMSk7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czowO2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6MH0uaW5wdXQtZ3JvdXA+LmZvcm0tZmxvYXRpbmc6bm90KDpmaXJzdC1jaGlsZCk+LmZvcm0tY29udHJvbCwuaW5wdXQtZ3JvdXA+LmZvcm0tZmxvYXRpbmc6bm90KDpmaXJzdC1jaGlsZCk+LmZvcm0tc2VsZWN0e2JvcmRlci10b3AtbGVmdC1yYWRpdXM6MDtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjB9LnZhbGlkLWZlZWRiYWNre2Rpc3BsYXk6bm9uZTt3aWR0aDoxMDAlO21hcmdpbi10b3A6LjI1cmVtO2ZvbnQtc2l6ZTouODc1ZW07Y29sb3I6dmFyKC0tYnMtZm9ybS12YWxpZC1jb2xvcil9LnZhbGlkLXRvb2x0aXB7cG9zaXRpb246YWJzb2x1dGU7dG9wOjEwMCU7ei1pbmRleDo1O2Rpc3BsYXk6bm9uZTttYXgtd2lkdGg6MTAwJTtwYWRkaW5nOi4yNXJlbSAuNXJlbTttYXJnaW4tdG9wOi4xcmVtO2ZvbnQtc2l6ZTouODc1cmVtO2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1icy1zdWNjZXNzKTtib3JkZXItcmFkaXVzOnZhcigtLWJzLWJvcmRlci1yYWRpdXMpfS53YXMtdmFsaWRhdGVkIDp2YWxpZCB+IC52YWxpZC1mZWVkYmFjaywud2FzLXZhbGlkYXRlZCA6dmFsaWQgfiAudmFsaWQtdG9vbHRpcCwuaXMtdmFsaWQgfiAudmFsaWQtZmVlZGJhY2ssLmlzLXZhbGlkIH4gLnZhbGlkLXRvb2x0aXB7ZGlzcGxheTpibG9ja30ud2FzLXZhbGlkYXRlZCAuZm9ybS1jb250cm9sOnZhbGlkLC5mb3JtLWNvbnRyb2wuaXMtdmFsaWR7Ym9yZGVyLWNvbG9yOnZhcigtLWJzLWZvcm0tdmFsaWQtYm9yZGVyLWNvbG9yKTtwYWRkaW5nLXJpZ2h0OmNhbGMoMS41ZW0gKyAuNzVyZW0pO2JhY2tncm91bmQtaW1hZ2U6dXJsKCR7X19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfOV9fX30pO2JhY2tncm91bmQtcmVwZWF0Om5vLXJlcGVhdDtiYWNrZ3JvdW5kLXBvc2l0aW9uOnJpZ2h0IGNhbGMoLjM3NWVtICsgLjE4NzVyZW0pIGNlbnRlcjtiYWNrZ3JvdW5kLXNpemU6Y2FsYyguNzVlbSArIC4zNzVyZW0pIGNhbGMoLjc1ZW0gKyAuMzc1cmVtKX0ud2FzLXZhbGlkYXRlZCAuZm9ybS1jb250cm9sOnZhbGlkOmZvY3VzLC5mb3JtLWNvbnRyb2wuaXMtdmFsaWQ6Zm9jdXN7Ym9yZGVyLWNvbG9yOnZhcigtLWJzLWZvcm0tdmFsaWQtYm9yZGVyLWNvbG9yKTtib3gtc2hhZG93OjAgMCAwIC4yNXJlbSByZ2JhKHZhcigtLWJzLXN1Y2Nlc3MtcmdiKSwgMC4yNSl9Lndhcy12YWxpZGF0ZWQgdGV4dGFyZWEuZm9ybS1jb250cm9sOnZhbGlkLHRleHRhcmVhLmZvcm0tY29udHJvbC5pcy12YWxpZHtwYWRkaW5nLXJpZ2h0OmNhbGMoMS41ZW0gKyAuNzVyZW0pO2JhY2tncm91bmQtcG9zaXRpb246dG9wIGNhbGMoLjM3NWVtICsgLjE4NzVyZW0pIHJpZ2h0IGNhbGMoLjM3NWVtICsgLjE4NzVyZW0pfS53YXMtdmFsaWRhdGVkIC5mb3JtLXNlbGVjdDp2YWxpZCwuZm9ybS1zZWxlY3QuaXMtdmFsaWR7Ym9yZGVyLWNvbG9yOnZhcigtLWJzLWZvcm0tdmFsaWQtYm9yZGVyLWNvbG9yKX0ud2FzLXZhbGlkYXRlZCAuZm9ybS1zZWxlY3Q6dmFsaWQ6bm90KFttdWx0aXBsZV0pOm5vdChbc2l6ZV0pLC53YXMtdmFsaWRhdGVkIC5mb3JtLXNlbGVjdDp2YWxpZDpub3QoW211bHRpcGxlXSlbc2l6ZT1cIjFcIl0sLmZvcm0tc2VsZWN0LmlzLXZhbGlkOm5vdChbbXVsdGlwbGVdKTpub3QoW3NpemVdKSwuZm9ybS1zZWxlY3QuaXMtdmFsaWQ6bm90KFttdWx0aXBsZV0pW3NpemU9XCIxXCJdey0tYnMtZm9ybS1zZWxlY3QtYmctaWNvbjogdXJsKCR7X19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfOV9fX30pO3BhZGRpbmctcmlnaHQ6NC4xMjVyZW07YmFja2dyb3VuZC1wb3NpdGlvbjpyaWdodCAuNzVyZW0gY2VudGVyLGNlbnRlciByaWdodCAyLjI1cmVtO2JhY2tncm91bmQtc2l6ZToxNnB4IDEycHgsY2FsYyguNzVlbSArIC4zNzVyZW0pIGNhbGMoLjc1ZW0gKyAuMzc1cmVtKX0ud2FzLXZhbGlkYXRlZCAuZm9ybS1zZWxlY3Q6dmFsaWQ6Zm9jdXMsLmZvcm0tc2VsZWN0LmlzLXZhbGlkOmZvY3Vze2JvcmRlci1jb2xvcjp2YXIoLS1icy1mb3JtLXZhbGlkLWJvcmRlci1jb2xvcik7Ym94LXNoYWRvdzowIDAgMCAuMjVyZW0gcmdiYSh2YXIoLS1icy1zdWNjZXNzLXJnYiksIDAuMjUpfS53YXMtdmFsaWRhdGVkIC5mb3JtLWNvbnRyb2wtY29sb3I6dmFsaWQsLmZvcm0tY29udHJvbC1jb2xvci5pcy12YWxpZHt3aWR0aDpjYWxjKDNyZW0gKyBjYWxjKDEuNWVtICsgLjc1cmVtKSl9Lndhcy12YWxpZGF0ZWQgLmZvcm0tY2hlY2staW5wdXQ6dmFsaWQsLmZvcm0tY2hlY2staW5wdXQuaXMtdmFsaWR7Ym9yZGVyLWNvbG9yOnZhcigtLWJzLWZvcm0tdmFsaWQtYm9yZGVyLWNvbG9yKX0ud2FzLXZhbGlkYXRlZCAuZm9ybS1jaGVjay1pbnB1dDp2YWxpZDpjaGVja2VkLC5mb3JtLWNoZWNrLWlucHV0LmlzLXZhbGlkOmNoZWNrZWR7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1icy1mb3JtLXZhbGlkLWNvbG9yKX0ud2FzLXZhbGlkYXRlZCAuZm9ybS1jaGVjay1pbnB1dDp2YWxpZDpmb2N1cywuZm9ybS1jaGVjay1pbnB1dC5pcy12YWxpZDpmb2N1c3tib3gtc2hhZG93OjAgMCAwIC4yNXJlbSByZ2JhKHZhcigtLWJzLXN1Y2Nlc3MtcmdiKSwgMC4yNSl9Lndhcy12YWxpZGF0ZWQgLmZvcm0tY2hlY2staW5wdXQ6dmFsaWQgfiAuZm9ybS1jaGVjay1sYWJlbCwuZm9ybS1jaGVjay1pbnB1dC5pcy12YWxpZCB+IC5mb3JtLWNoZWNrLWxhYmVse2NvbG9yOnZhcigtLWJzLWZvcm0tdmFsaWQtY29sb3IpfS5mb3JtLWNoZWNrLWlubGluZSAuZm9ybS1jaGVjay1pbnB1dCB+IC52YWxpZC1mZWVkYmFja3ttYXJnaW4tbGVmdDouNWVtfS53YXMtdmFsaWRhdGVkIC5pbnB1dC1ncm91cD4uZm9ybS1jb250cm9sOm5vdCg6Zm9jdXMpOnZhbGlkLC5pbnB1dC1ncm91cD4uZm9ybS1jb250cm9sOm5vdCg6Zm9jdXMpLmlzLXZhbGlkLC53YXMtdmFsaWRhdGVkIC5pbnB1dC1ncm91cD4uZm9ybS1zZWxlY3Q6bm90KDpmb2N1cyk6dmFsaWQsLmlucHV0LWdyb3VwPi5mb3JtLXNlbGVjdDpub3QoOmZvY3VzKS5pcy12YWxpZCwud2FzLXZhbGlkYXRlZCAuaW5wdXQtZ3JvdXA+LmZvcm0tZmxvYXRpbmc6bm90KDpmb2N1cy13aXRoaW4pOnZhbGlkLC5pbnB1dC1ncm91cD4uZm9ybS1mbG9hdGluZzpub3QoOmZvY3VzLXdpdGhpbikuaXMtdmFsaWR7ei1pbmRleDozfS5pbnZhbGlkLWZlZWRiYWNre2Rpc3BsYXk6bm9uZTt3aWR0aDoxMDAlO21hcmdpbi10b3A6LjI1cmVtO2ZvbnQtc2l6ZTouODc1ZW07Y29sb3I6dmFyKC0tYnMtZm9ybS1pbnZhbGlkLWNvbG9yKX0uaW52YWxpZC10b29sdGlwe3Bvc2l0aW9uOmFic29sdXRlO3RvcDoxMDAlO3otaW5kZXg6NTtkaXNwbGF5Om5vbmU7bWF4LXdpZHRoOjEwMCU7cGFkZGluZzouMjVyZW0gLjVyZW07bWFyZ2luLXRvcDouMXJlbTtmb250LXNpemU6Ljg3NXJlbTtjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6dmFyKC0tYnMtZGFuZ2VyKTtib3JkZXItcmFkaXVzOnZhcigtLWJzLWJvcmRlci1yYWRpdXMpfS53YXMtdmFsaWRhdGVkIDppbnZhbGlkIH4gLmludmFsaWQtZmVlZGJhY2ssLndhcy12YWxpZGF0ZWQgOmludmFsaWQgfiAuaW52YWxpZC10b29sdGlwLC5pcy1pbnZhbGlkIH4gLmludmFsaWQtZmVlZGJhY2ssLmlzLWludmFsaWQgfiAuaW52YWxpZC10b29sdGlwe2Rpc3BsYXk6YmxvY2t9Lndhcy12YWxpZGF0ZWQgLmZvcm0tY29udHJvbDppbnZhbGlkLC5mb3JtLWNvbnRyb2wuaXMtaW52YWxpZHtib3JkZXItY29sb3I6dmFyKC0tYnMtZm9ybS1pbnZhbGlkLWJvcmRlci1jb2xvcik7cGFkZGluZy1yaWdodDpjYWxjKDEuNWVtICsgLjc1cmVtKTtiYWNrZ3JvdW5kLWltYWdlOnVybCgke19fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzEwX19ffSk7YmFja2dyb3VuZC1yZXBlYXQ6bm8tcmVwZWF0O2JhY2tncm91bmQtcG9zaXRpb246cmlnaHQgY2FsYyguMzc1ZW0gKyAuMTg3NXJlbSkgY2VudGVyO2JhY2tncm91bmQtc2l6ZTpjYWxjKC43NWVtICsgLjM3NXJlbSkgY2FsYyguNzVlbSArIC4zNzVyZW0pfS53YXMtdmFsaWRhdGVkIC5mb3JtLWNvbnRyb2w6aW52YWxpZDpmb2N1cywuZm9ybS1jb250cm9sLmlzLWludmFsaWQ6Zm9jdXN7Ym9yZGVyLWNvbG9yOnZhcigtLWJzLWZvcm0taW52YWxpZC1ib3JkZXItY29sb3IpO2JveC1zaGFkb3c6MCAwIDAgLjI1cmVtIHJnYmEodmFyKC0tYnMtZGFuZ2VyLXJnYiksIDAuMjUpfS53YXMtdmFsaWRhdGVkIHRleHRhcmVhLmZvcm0tY29udHJvbDppbnZhbGlkLHRleHRhcmVhLmZvcm0tY29udHJvbC5pcy1pbnZhbGlke3BhZGRpbmctcmlnaHQ6Y2FsYygxLjVlbSArIC43NXJlbSk7YmFja2dyb3VuZC1wb3NpdGlvbjp0b3AgY2FsYyguMzc1ZW0gKyAuMTg3NXJlbSkgcmlnaHQgY2FsYyguMzc1ZW0gKyAuMTg3NXJlbSl9Lndhcy12YWxpZGF0ZWQgLmZvcm0tc2VsZWN0OmludmFsaWQsLmZvcm0tc2VsZWN0LmlzLWludmFsaWR7Ym9yZGVyLWNvbG9yOnZhcigtLWJzLWZvcm0taW52YWxpZC1ib3JkZXItY29sb3IpfS53YXMtdmFsaWRhdGVkIC5mb3JtLXNlbGVjdDppbnZhbGlkOm5vdChbbXVsdGlwbGVdKTpub3QoW3NpemVdKSwud2FzLXZhbGlkYXRlZCAuZm9ybS1zZWxlY3Q6aW52YWxpZDpub3QoW211bHRpcGxlXSlbc2l6ZT1cIjFcIl0sLmZvcm0tc2VsZWN0LmlzLWludmFsaWQ6bm90KFttdWx0aXBsZV0pOm5vdChbc2l6ZV0pLC5mb3JtLXNlbGVjdC5pcy1pbnZhbGlkOm5vdChbbXVsdGlwbGVdKVtzaXplPVwiMVwiXXstLWJzLWZvcm0tc2VsZWN0LWJnLWljb246IHVybCgke19fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzEwX19ffSk7cGFkZGluZy1yaWdodDo0LjEyNXJlbTtiYWNrZ3JvdW5kLXBvc2l0aW9uOnJpZ2h0IC43NXJlbSBjZW50ZXIsY2VudGVyIHJpZ2h0IDIuMjVyZW07YmFja2dyb3VuZC1zaXplOjE2cHggMTJweCxjYWxjKC43NWVtICsgLjM3NXJlbSkgY2FsYyguNzVlbSArIC4zNzVyZW0pfS53YXMtdmFsaWRhdGVkIC5mb3JtLXNlbGVjdDppbnZhbGlkOmZvY3VzLC5mb3JtLXNlbGVjdC5pcy1pbnZhbGlkOmZvY3Vze2JvcmRlci1jb2xvcjp2YXIoLS1icy1mb3JtLWludmFsaWQtYm9yZGVyLWNvbG9yKTtib3gtc2hhZG93OjAgMCAwIC4yNXJlbSByZ2JhKHZhcigtLWJzLWRhbmdlci1yZ2IpLCAwLjI1KX0ud2FzLXZhbGlkYXRlZCAuZm9ybS1jb250cm9sLWNvbG9yOmludmFsaWQsLmZvcm0tY29udHJvbC1jb2xvci5pcy1pbnZhbGlke3dpZHRoOmNhbGMoM3JlbSArIGNhbGMoMS41ZW0gKyAuNzVyZW0pKX0ud2FzLXZhbGlkYXRlZCAuZm9ybS1jaGVjay1pbnB1dDppbnZhbGlkLC5mb3JtLWNoZWNrLWlucHV0LmlzLWludmFsaWR7Ym9yZGVyLWNvbG9yOnZhcigtLWJzLWZvcm0taW52YWxpZC1ib3JkZXItY29sb3IpfS53YXMtdmFsaWRhdGVkIC5mb3JtLWNoZWNrLWlucHV0OmludmFsaWQ6Y2hlY2tlZCwuZm9ybS1jaGVjay1pbnB1dC5pcy1pbnZhbGlkOmNoZWNrZWR7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1icy1mb3JtLWludmFsaWQtY29sb3IpfS53YXMtdmFsaWRhdGVkIC5mb3JtLWNoZWNrLWlucHV0OmludmFsaWQ6Zm9jdXMsLmZvcm0tY2hlY2staW5wdXQuaXMtaW52YWxpZDpmb2N1c3tib3gtc2hhZG93OjAgMCAwIC4yNXJlbSByZ2JhKHZhcigtLWJzLWRhbmdlci1yZ2IpLCAwLjI1KX0ud2FzLXZhbGlkYXRlZCAuZm9ybS1jaGVjay1pbnB1dDppbnZhbGlkIH4gLmZvcm0tY2hlY2stbGFiZWwsLmZvcm0tY2hlY2staW5wdXQuaXMtaW52YWxpZCB+IC5mb3JtLWNoZWNrLWxhYmVse2NvbG9yOnZhcigtLWJzLWZvcm0taW52YWxpZC1jb2xvcil9LmZvcm0tY2hlY2staW5saW5lIC5mb3JtLWNoZWNrLWlucHV0IH4gLmludmFsaWQtZmVlZGJhY2t7bWFyZ2luLWxlZnQ6LjVlbX0ud2FzLXZhbGlkYXRlZCAuaW5wdXQtZ3JvdXA+LmZvcm0tY29udHJvbDpub3QoOmZvY3VzKTppbnZhbGlkLC5pbnB1dC1ncm91cD4uZm9ybS1jb250cm9sOm5vdCg6Zm9jdXMpLmlzLWludmFsaWQsLndhcy12YWxpZGF0ZWQgLmlucHV0LWdyb3VwPi5mb3JtLXNlbGVjdDpub3QoOmZvY3VzKTppbnZhbGlkLC5pbnB1dC1ncm91cD4uZm9ybS1zZWxlY3Q6bm90KDpmb2N1cykuaXMtaW52YWxpZCwud2FzLXZhbGlkYXRlZCAuaW5wdXQtZ3JvdXA+LmZvcm0tZmxvYXRpbmc6bm90KDpmb2N1cy13aXRoaW4pOmludmFsaWQsLmlucHV0LWdyb3VwPi5mb3JtLWZsb2F0aW5nOm5vdCg6Zm9jdXMtd2l0aGluKS5pcy1pbnZhbGlke3otaW5kZXg6NH0uYnRuey0tYnMtYnRuLXBhZGRpbmcteDogLjc1cmVtOy0tYnMtYnRuLXBhZGRpbmcteTogLjM3NXJlbTstLWJzLWJ0bi1mb250LWZhbWlseTogOy0tYnMtYnRuLWZvbnQtc2l6ZToxcmVtOy0tYnMtYnRuLWZvbnQtd2VpZ2h0OiA0MDA7LS1icy1idG4tbGluZS1oZWlnaHQ6IDEuNTstLWJzLWJ0bi1jb2xvcjogdmFyKC0tYnMtYm9keS1jb2xvcik7LS1icy1idG4tYmc6IHRyYW5zcGFyZW50Oy0tYnMtYnRuLWJvcmRlci13aWR0aDogdmFyKC0tYnMtYm9yZGVyLXdpZHRoKTstLWJzLWJ0bi1ib3JkZXItY29sb3I6IHRyYW5zcGFyZW50Oy0tYnMtYnRuLWJvcmRlci1yYWRpdXM6IHZhcigtLWJzLWJvcmRlci1yYWRpdXMpOy0tYnMtYnRuLWhvdmVyLWJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQ7LS1icy1idG4tYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwyNTUsMjU1LDAuMTUpLDAgMXB4IDFweCByZ2JhKDAsMCwwLDAuMDc1KTstLWJzLWJ0bi1kaXNhYmxlZC1vcGFjaXR5OiAuNjU7LS1icy1idG4tZm9jdXMtYm94LXNoYWRvdzogMCAwIDAgLjI1cmVtIHJnYmEodmFyKC0tYnMtYnRuLWZvY3VzLXNoYWRvdy1yZ2IpLCAuNSk7ZGlzcGxheTppbmxpbmUtYmxvY2s7cGFkZGluZzp2YXIoLS1icy1idG4tcGFkZGluZy15KSB2YXIoLS1icy1idG4tcGFkZGluZy14KTtmb250LWZhbWlseTp2YXIoLS1icy1idG4tZm9udC1mYW1pbHkpO2ZvbnQtc2l6ZTp2YXIoLS1icy1idG4tZm9udC1zaXplKTtmb250LXdlaWdodDp2YXIoLS1icy1idG4tZm9udC13ZWlnaHQpO2xpbmUtaGVpZ2h0OnZhcigtLWJzLWJ0bi1saW5lLWhlaWdodCk7Y29sb3I6dmFyKC0tYnMtYnRuLWNvbG9yKTt0ZXh0LWFsaWduOmNlbnRlcjt0ZXh0LWRlY29yYXRpb246bm9uZTt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7Y3Vyc29yOnBvaW50ZXI7dXNlci1zZWxlY3Q6bm9uZTtib3JkZXI6dmFyKC0tYnMtYnRuLWJvcmRlci13aWR0aCkgc29saWQgdmFyKC0tYnMtYnRuLWJvcmRlci1jb2xvcik7Ym9yZGVyLXJhZGl1czp2YXIoLS1icy1idG4tYm9yZGVyLXJhZGl1cyk7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1icy1idG4tYmcpO3RyYW5zaXRpb246Y29sb3IgMC4xNXMgZWFzZS1pbi1vdXQsYmFja2dyb3VuZC1jb2xvciAwLjE1cyBlYXNlLWluLW91dCxib3JkZXItY29sb3IgMC4xNXMgZWFzZS1pbi1vdXQsYm94LXNoYWRvdyAwLjE1cyBlYXNlLWluLW91dH1AbWVkaWEgKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZSl7LmJ0bnt0cmFuc2l0aW9uOm5vbmV9fS5idG46aG92ZXJ7Y29sb3I6dmFyKC0tYnMtYnRuLWhvdmVyLWNvbG9yKTtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWJzLWJ0bi1ob3Zlci1iZyk7Ym9yZGVyLWNvbG9yOnZhcigtLWJzLWJ0bi1ob3Zlci1ib3JkZXItY29sb3IpfS5idG4tY2hlY2srLmJ0bjpob3Zlcntjb2xvcjp2YXIoLS1icy1idG4tY29sb3IpO2JhY2tncm91bmQtY29sb3I6dmFyKC0tYnMtYnRuLWJnKTtib3JkZXItY29sb3I6dmFyKC0tYnMtYnRuLWJvcmRlci1jb2xvcil9LmJ0bjpmb2N1cy12aXNpYmxle2NvbG9yOnZhcigtLWJzLWJ0bi1ob3Zlci1jb2xvcik7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1icy1idG4taG92ZXItYmcpO2JvcmRlci1jb2xvcjp2YXIoLS1icy1idG4taG92ZXItYm9yZGVyLWNvbG9yKTtvdXRsaW5lOjA7Ym94LXNoYWRvdzp2YXIoLS1icy1idG4tZm9jdXMtYm94LXNoYWRvdyl9LmJ0bi1jaGVjazpmb2N1cy12aXNpYmxlKy5idG57Ym9yZGVyLWNvbG9yOnZhcigtLWJzLWJ0bi1ob3Zlci1ib3JkZXItY29sb3IpO291dGxpbmU6MDtib3gtc2hhZG93OnZhcigtLWJzLWJ0bi1mb2N1cy1ib3gtc2hhZG93KX0uYnRuLWNoZWNrOmNoZWNrZWQrLmJ0biw6bm90KC5idG4tY2hlY2spKy5idG46YWN0aXZlLC5idG46Zmlyc3QtY2hpbGQ6YWN0aXZlLC5idG4uYWN0aXZlLC5idG4uc2hvd3tjb2xvcjp2YXIoLS1icy1idG4tYWN0aXZlLWNvbG9yKTtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWJzLWJ0bi1hY3RpdmUtYmcpO2JvcmRlci1jb2xvcjp2YXIoLS1icy1idG4tYWN0aXZlLWJvcmRlci1jb2xvcil9LmJ0bi1jaGVjazpjaGVja2VkKy5idG46Zm9jdXMtdmlzaWJsZSw6bm90KC5idG4tY2hlY2spKy5idG46YWN0aXZlOmZvY3VzLXZpc2libGUsLmJ0bjpmaXJzdC1jaGlsZDphY3RpdmU6Zm9jdXMtdmlzaWJsZSwuYnRuLmFjdGl2ZTpmb2N1cy12aXNpYmxlLC5idG4uc2hvdzpmb2N1cy12aXNpYmxle2JveC1zaGFkb3c6dmFyKC0tYnMtYnRuLWZvY3VzLWJveC1zaGFkb3cpfS5idG46ZGlzYWJsZWQsLmJ0bi5kaXNhYmxlZCxmaWVsZHNldDpkaXNhYmxlZCAuYnRue2NvbG9yOnZhcigtLWJzLWJ0bi1kaXNhYmxlZC1jb2xvcik7cG9pbnRlci1ldmVudHM6bm9uZTtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWJzLWJ0bi1kaXNhYmxlZC1iZyk7Ym9yZGVyLWNvbG9yOnZhcigtLWJzLWJ0bi1kaXNhYmxlZC1ib3JkZXItY29sb3IpO29wYWNpdHk6dmFyKC0tYnMtYnRuLWRpc2FibGVkLW9wYWNpdHkpfS5idG4tcHJpbWFyeXstLWJzLWJ0bi1jb2xvcjogI2ZmZjstLWJzLWJ0bi1iZzogIzNmNTFiNTstLWJzLWJ0bi1ib3JkZXItY29sb3I6ICMzZjUxYjU7LS1icy1idG4taG92ZXItY29sb3I6ICNmZmY7LS1icy1idG4taG92ZXItYmc6ICMzNjQ1OWE7LS1icy1idG4taG92ZXItYm9yZGVyLWNvbG9yOiAjMzI0MTkxOy0tYnMtYnRuLWZvY3VzLXNoYWRvdy1yZ2I6IDkyLDEwNywxOTI7LS1icy1idG4tYWN0aXZlLWNvbG9yOiAjZmZmOy0tYnMtYnRuLWFjdGl2ZS1iZzogIzMyNDE5MTstLWJzLWJ0bi1hY3RpdmUtYm9yZGVyLWNvbG9yOiAjMmYzZDg4Oy0tYnMtYnRuLWFjdGl2ZS1zaGFkb3c6IGluc2V0IDAgM3B4IDVweCByZ2JhKDAsMCwwLDAuMTI1KTstLWJzLWJ0bi1kaXNhYmxlZC1jb2xvcjogI2ZmZjstLWJzLWJ0bi1kaXNhYmxlZC1iZzogIzNmNTFiNTstLWJzLWJ0bi1kaXNhYmxlZC1ib3JkZXItY29sb3I6ICMzZjUxYjV9LmJ0bi1vdXRsaW5lLXByaW1hcnl7LS1icy1idG4tY29sb3I6ICMzZjUxYjU7LS1icy1idG4tYm9yZGVyLWNvbG9yOiAjM2Y1MWI1Oy0tYnMtYnRuLWhvdmVyLWNvbG9yOiAjZmZmOy0tYnMtYnRuLWhvdmVyLWJnOiAjM2Y1MWI1Oy0tYnMtYnRuLWhvdmVyLWJvcmRlci1jb2xvcjogIzNmNTFiNTstLWJzLWJ0bi1mb2N1cy1zaGFkb3ctcmdiOiA2Myw4MSwxODE7LS1icy1idG4tYWN0aXZlLWNvbG9yOiAjZmZmOy0tYnMtYnRuLWFjdGl2ZS1iZzogIzNmNTFiNTstLWJzLWJ0bi1hY3RpdmUtYm9yZGVyLWNvbG9yOiAjM2Y1MWI1Oy0tYnMtYnRuLWFjdGl2ZS1zaGFkb3c6IGluc2V0IDAgM3B4IDVweCByZ2JhKDAsMCwwLDAuMTI1KTstLWJzLWJ0bi1kaXNhYmxlZC1jb2xvcjogIzNmNTFiNTstLWJzLWJ0bi1kaXNhYmxlZC1iZzogdHJhbnNwYXJlbnQ7LS1icy1idG4tZGlzYWJsZWQtYm9yZGVyLWNvbG9yOiAjM2Y1MWI1Oy0tYnMtZ3JhZGllbnQ6IG5vbmV9LmJ0bi1saW5rey0tYnMtYnRuLWZvbnQtd2VpZ2h0OiA0MDA7LS1icy1idG4tY29sb3I6IHZhcigtLWJzLWxpbmstY29sb3IpOy0tYnMtYnRuLWJnOiB0cmFuc3BhcmVudDstLWJzLWJ0bi1ib3JkZXItY29sb3I6IHRyYW5zcGFyZW50Oy0tYnMtYnRuLWhvdmVyLWNvbG9yOiB2YXIoLS1icy1saW5rLWhvdmVyLWNvbG9yKTstLWJzLWJ0bi1ob3Zlci1ib3JkZXItY29sb3I6IHRyYW5zcGFyZW50Oy0tYnMtYnRuLWFjdGl2ZS1jb2xvcjogdmFyKC0tYnMtbGluay1ob3Zlci1jb2xvcik7LS1icy1idG4tYWN0aXZlLWJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQ7LS1icy1idG4tZGlzYWJsZWQtY29sb3I6ICM2Yzc1N2Q7LS1icy1idG4tZGlzYWJsZWQtYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDstLWJzLWJ0bi1ib3gtc2hhZG93OiAwIDAgMCAjMDAwOy0tYnMtYnRuLWZvY3VzLXNoYWRvdy1yZ2I6IDQ5LDEzMiwyNTM7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZX0uYnRuLWxpbms6Zm9jdXMtdmlzaWJsZXtjb2xvcjp2YXIoLS1icy1idG4tY29sb3IpfS5idG4tbGluazpob3Zlcntjb2xvcjp2YXIoLS1icy1idG4taG92ZXItY29sb3IpfS5idG4tbGcsLmJ0bi1ncm91cC1sZz4uYnRuey0tYnMtYnRuLXBhZGRpbmcteTogLjVyZW07LS1icy1idG4tcGFkZGluZy14OiAxcmVtOy0tYnMtYnRuLWZvbnQtc2l6ZToxLjI1cmVtOy0tYnMtYnRuLWJvcmRlci1yYWRpdXM6IHZhcigtLWJzLWJvcmRlci1yYWRpdXMtbGcpfS5idG4tc20sLmJ0bi1ncm91cC1zbT4uYnRuey0tYnMtYnRuLXBhZGRpbmcteTogLjI1cmVtOy0tYnMtYnRuLXBhZGRpbmcteDogLjVyZW07LS1icy1idG4tZm9udC1zaXplOi44NzVyZW07LS1icy1idG4tYm9yZGVyLXJhZGl1czogdmFyKC0tYnMtYm9yZGVyLXJhZGl1cy1zbSl9LmZhZGV7dHJhbnNpdGlvbjpvcGFjaXR5IDAuMTVzIGxpbmVhcn1AbWVkaWEgKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZSl7LmZhZGV7dHJhbnNpdGlvbjpub25lfX0uZmFkZTpub3QoLnNob3cpe29wYWNpdHk6MH0uY29sbGFwc2U6bm90KC5zaG93KXtkaXNwbGF5Om5vbmV9LmNvbGxhcHNpbmd7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVuO3RyYW5zaXRpb246aGVpZ2h0IDAuMzVzIGVhc2V9QG1lZGlhIChwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2Upey5jb2xsYXBzaW5ne3RyYW5zaXRpb246bm9uZX19LmNvbGxhcHNpbmcuY29sbGFwc2UtaG9yaXpvbnRhbHt3aWR0aDowO2hlaWdodDphdXRvO3RyYW5zaXRpb246d2lkdGggMC4zNXMgZWFzZX1AbWVkaWEgKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZSl7LmNvbGxhcHNpbmcuY29sbGFwc2UtaG9yaXpvbnRhbHt0cmFuc2l0aW9uOm5vbmV9fS5kcm9wdXAsLmRyb3BlbmQsLmRyb3Bkb3duLC5kcm9wc3RhcnQsLmRyb3B1cC1jZW50ZXIsLmRyb3Bkb3duLWNlbnRlcntwb3NpdGlvbjpyZWxhdGl2ZX0uZHJvcGRvd24tdG9nZ2xle3doaXRlLXNwYWNlOm5vd3JhcH0uZHJvcGRvd24tdG9nZ2xlOjphZnRlcntkaXNwbGF5OmlubGluZS1ibG9jazttYXJnaW4tbGVmdDouMjU1ZW07dmVydGljYWwtYWxpZ246LjI1NWVtO2NvbnRlbnQ6XCJcIjtib3JkZXItdG9wOi4zZW0gc29saWQ7Ym9yZGVyLXJpZ2h0Oi4zZW0gc29saWQgdHJhbnNwYXJlbnQ7Ym9yZGVyLWJvdHRvbTowO2JvcmRlci1sZWZ0Oi4zZW0gc29saWQgdHJhbnNwYXJlbnR9LmRyb3Bkb3duLXRvZ2dsZTplbXB0eTo6YWZ0ZXJ7bWFyZ2luLWxlZnQ6MH0uZHJvcGRvd24tbWVudXstLWJzLWRyb3Bkb3duLXppbmRleDogMTAwMDstLWJzLWRyb3Bkb3duLW1pbi13aWR0aDogMTByZW07LS1icy1kcm9wZG93bi1wYWRkaW5nLXg6IDA7LS1icy1kcm9wZG93bi1wYWRkaW5nLXk6IC41cmVtOy0tYnMtZHJvcGRvd24tc3BhY2VyOiAuMTI1cmVtOy0tYnMtZHJvcGRvd24tZm9udC1zaXplOjFyZW07LS1icy1kcm9wZG93bi1jb2xvcjogdmFyKC0tYnMtYm9keS1jb2xvcik7LS1icy1kcm9wZG93bi1iZzogdmFyKC0tYnMtYm9keS1iZyk7LS1icy1kcm9wZG93bi1ib3JkZXItY29sb3I6IHZhcigtLWJzLWJvcmRlci1jb2xvci10cmFuc2x1Y2VudCk7LS1icy1kcm9wZG93bi1ib3JkZXItcmFkaXVzOiB2YXIoLS1icy1ib3JkZXItcmFkaXVzKTstLWJzLWRyb3Bkb3duLWJvcmRlci13aWR0aDogdmFyKC0tYnMtYm9yZGVyLXdpZHRoKTstLWJzLWRyb3Bkb3duLWlubmVyLWJvcmRlci1yYWRpdXM6IGNhbGModmFyKC0tYnMtYm9yZGVyLXJhZGl1cykgLSB2YXIoLS1icy1ib3JkZXItd2lkdGgpKTstLWJzLWRyb3Bkb3duLWRpdmlkZXItYmc6IHZhcigtLWJzLWJvcmRlci1jb2xvci10cmFuc2x1Y2VudCk7LS1icy1kcm9wZG93bi1kaXZpZGVyLW1hcmdpbi15OiAuNXJlbTstLWJzLWRyb3Bkb3duLWJveC1zaGFkb3c6IHZhcigtLWJzLWJveC1zaGFkb3cpOy0tYnMtZHJvcGRvd24tbGluay1jb2xvcjogdmFyKC0tYnMtYm9keS1jb2xvcik7LS1icy1kcm9wZG93bi1saW5rLWhvdmVyLWNvbG9yOiB2YXIoLS1icy1ib2R5LWNvbG9yKTstLWJzLWRyb3Bkb3duLWxpbmstaG92ZXItYmc6IHZhcigtLWJzLXRlcnRpYXJ5LWJnKTstLWJzLWRyb3Bkb3duLWxpbmstYWN0aXZlLWNvbG9yOiAjZmZmOy0tYnMtZHJvcGRvd24tbGluay1hY3RpdmUtYmc6ICMwZDZlZmQ7LS1icy1kcm9wZG93bi1saW5rLWRpc2FibGVkLWNvbG9yOiB2YXIoLS1icy10ZXJ0aWFyeS1jb2xvcik7LS1icy1kcm9wZG93bi1pdGVtLXBhZGRpbmcteDogMXJlbTstLWJzLWRyb3Bkb3duLWl0ZW0tcGFkZGluZy15OiAuMjVyZW07LS1icy1kcm9wZG93bi1oZWFkZXItY29sb3I6ICM2Yzc1N2Q7LS1icy1kcm9wZG93bi1oZWFkZXItcGFkZGluZy14OiAxcmVtOy0tYnMtZHJvcGRvd24taGVhZGVyLXBhZGRpbmcteTogLjVyZW07cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDp2YXIoLS1icy1kcm9wZG93bi16aW5kZXgpO2Rpc3BsYXk6bm9uZTttaW4td2lkdGg6dmFyKC0tYnMtZHJvcGRvd24tbWluLXdpZHRoKTtwYWRkaW5nOnZhcigtLWJzLWRyb3Bkb3duLXBhZGRpbmcteSkgdmFyKC0tYnMtZHJvcGRvd24tcGFkZGluZy14KTttYXJnaW46MDtmb250LXNpemU6dmFyKC0tYnMtZHJvcGRvd24tZm9udC1zaXplKTtjb2xvcjp2YXIoLS1icy1kcm9wZG93bi1jb2xvcik7dGV4dC1hbGlnbjpsZWZ0O2xpc3Qtc3R5bGU6bm9uZTtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWJzLWRyb3Bkb3duLWJnKTtiYWNrZ3JvdW5kLWNsaXA6cGFkZGluZy1ib3g7Ym9yZGVyOnZhcigtLWJzLWRyb3Bkb3duLWJvcmRlci13aWR0aCkgc29saWQgdmFyKC0tYnMtZHJvcGRvd24tYm9yZGVyLWNvbG9yKTtib3JkZXItcmFkaXVzOnZhcigtLWJzLWRyb3Bkb3duLWJvcmRlci1yYWRpdXMpfS5kcm9wZG93bi1tZW51W2RhdGEtYnMtcG9wcGVyXXt0b3A6MTAwJTtsZWZ0OjA7bWFyZ2luLXRvcDp2YXIoLS1icy1kcm9wZG93bi1zcGFjZXIpfS5kcm9wZG93bi1tZW51LXN0YXJ0ey0tYnMtcG9zaXRpb246IHN0YXJ0fS5kcm9wZG93bi1tZW51LXN0YXJ0W2RhdGEtYnMtcG9wcGVyXXtyaWdodDphdXRvO2xlZnQ6MH0uZHJvcGRvd24tbWVudS1lbmR7LS1icy1wb3NpdGlvbjogZW5kfS5kcm9wZG93bi1tZW51LWVuZFtkYXRhLWJzLXBvcHBlcl17cmlnaHQ6MDtsZWZ0OmF1dG99QG1lZGlhIChtaW4td2lkdGg6IDU3NnB4KXsuZHJvcGRvd24tbWVudS1zbS1zdGFydHstLWJzLXBvc2l0aW9uOiBzdGFydH0uZHJvcGRvd24tbWVudS1zbS1zdGFydFtkYXRhLWJzLXBvcHBlcl17cmlnaHQ6YXV0bztsZWZ0OjB9LmRyb3Bkb3duLW1lbnUtc20tZW5key0tYnMtcG9zaXRpb246IGVuZH0uZHJvcGRvd24tbWVudS1zbS1lbmRbZGF0YS1icy1wb3BwZXJde3JpZ2h0OjA7bGVmdDphdXRvfX1AbWVkaWEgKG1pbi13aWR0aDogNzY4cHgpey5kcm9wZG93bi1tZW51LW1kLXN0YXJ0ey0tYnMtcG9zaXRpb246IHN0YXJ0fS5kcm9wZG93bi1tZW51LW1kLXN0YXJ0W2RhdGEtYnMtcG9wcGVyXXtyaWdodDphdXRvO2xlZnQ6MH0uZHJvcGRvd24tbWVudS1tZC1lbmR7LS1icy1wb3NpdGlvbjogZW5kfS5kcm9wZG93bi1tZW51LW1kLWVuZFtkYXRhLWJzLXBvcHBlcl17cmlnaHQ6MDtsZWZ0OmF1dG99fUBtZWRpYSAobWluLXdpZHRoOiA5OTJweCl7LmRyb3Bkb3duLW1lbnUtbGctc3RhcnR7LS1icy1wb3NpdGlvbjogc3RhcnR9LmRyb3Bkb3duLW1lbnUtbGctc3RhcnRbZGF0YS1icy1wb3BwZXJde3JpZ2h0OmF1dG87bGVmdDowfS5kcm9wZG93bi1tZW51LWxnLWVuZHstLWJzLXBvc2l0aW9uOiBlbmR9LmRyb3Bkb3duLW1lbnUtbGctZW5kW2RhdGEtYnMtcG9wcGVyXXtyaWdodDowO2xlZnQ6YXV0b319QG1lZGlhIChtaW4td2lkdGg6IDEyMDBweCl7LmRyb3Bkb3duLW1lbnUteGwtc3RhcnR7LS1icy1wb3NpdGlvbjogc3RhcnR9LmRyb3Bkb3duLW1lbnUteGwtc3RhcnRbZGF0YS1icy1wb3BwZXJde3JpZ2h0OmF1dG87bGVmdDowfS5kcm9wZG93bi1tZW51LXhsLWVuZHstLWJzLXBvc2l0aW9uOiBlbmR9LmRyb3Bkb3duLW1lbnUteGwtZW5kW2RhdGEtYnMtcG9wcGVyXXtyaWdodDowO2xlZnQ6YXV0b319QG1lZGlhIChtaW4td2lkdGg6IDE0MDBweCl7LmRyb3Bkb3duLW1lbnUteHhsLXN0YXJ0ey0tYnMtcG9zaXRpb246IHN0YXJ0fS5kcm9wZG93bi1tZW51LXh4bC1zdGFydFtkYXRhLWJzLXBvcHBlcl17cmlnaHQ6YXV0bztsZWZ0OjB9LmRyb3Bkb3duLW1lbnUteHhsLWVuZHstLWJzLXBvc2l0aW9uOiBlbmR9LmRyb3Bkb3duLW1lbnUteHhsLWVuZFtkYXRhLWJzLXBvcHBlcl17cmlnaHQ6MDtsZWZ0OmF1dG99fS5kcm9wdXAgLmRyb3Bkb3duLW1lbnVbZGF0YS1icy1wb3BwZXJde3RvcDphdXRvO2JvdHRvbToxMDAlO21hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOnZhcigtLWJzLWRyb3Bkb3duLXNwYWNlcil9LmRyb3B1cCAuZHJvcGRvd24tdG9nZ2xlOjphZnRlcntkaXNwbGF5OmlubGluZS1ibG9jazttYXJnaW4tbGVmdDouMjU1ZW07dmVydGljYWwtYWxpZ246LjI1NWVtO2NvbnRlbnQ6XCJcIjtib3JkZXItdG9wOjA7Ym9yZGVyLXJpZ2h0Oi4zZW0gc29saWQgdHJhbnNwYXJlbnQ7Ym9yZGVyLWJvdHRvbTouM2VtIHNvbGlkO2JvcmRlci1sZWZ0Oi4zZW0gc29saWQgdHJhbnNwYXJlbnR9LmRyb3B1cCAuZHJvcGRvd24tdG9nZ2xlOmVtcHR5OjphZnRlcnttYXJnaW4tbGVmdDowfS5kcm9wZW5kIC5kcm9wZG93bi1tZW51W2RhdGEtYnMtcG9wcGVyXXt0b3A6MDtyaWdodDphdXRvO2xlZnQ6MTAwJTttYXJnaW4tdG9wOjA7bWFyZ2luLWxlZnQ6dmFyKC0tYnMtZHJvcGRvd24tc3BhY2VyKX0uZHJvcGVuZCAuZHJvcGRvd24tdG9nZ2xlOjphZnRlcntkaXNwbGF5OmlubGluZS1ibG9jazttYXJnaW4tbGVmdDouMjU1ZW07dmVydGljYWwtYWxpZ246LjI1NWVtO2NvbnRlbnQ6XCJcIjtib3JkZXItdG9wOi4zZW0gc29saWQgdHJhbnNwYXJlbnQ7Ym9yZGVyLXJpZ2h0OjA7Ym9yZGVyLWJvdHRvbTouM2VtIHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci1sZWZ0Oi4zZW0gc29saWR9LmRyb3BlbmQgLmRyb3Bkb3duLXRvZ2dsZTplbXB0eTo6YWZ0ZXJ7bWFyZ2luLWxlZnQ6MH0uZHJvcGVuZCAuZHJvcGRvd24tdG9nZ2xlOjphZnRlcnt2ZXJ0aWNhbC1hbGlnbjowfS5kcm9wc3RhcnQgLmRyb3Bkb3duLW1lbnVbZGF0YS1icy1wb3BwZXJde3RvcDowO3JpZ2h0OjEwMCU7bGVmdDphdXRvO21hcmdpbi10b3A6MDttYXJnaW4tcmlnaHQ6dmFyKC0tYnMtZHJvcGRvd24tc3BhY2VyKX0uZHJvcHN0YXJ0IC5kcm9wZG93bi10b2dnbGU6OmFmdGVye2Rpc3BsYXk6aW5saW5lLWJsb2NrO21hcmdpbi1sZWZ0Oi4yNTVlbTt2ZXJ0aWNhbC1hbGlnbjouMjU1ZW07Y29udGVudDpcIlwifS5kcm9wc3RhcnQgLmRyb3Bkb3duLXRvZ2dsZTo6YWZ0ZXJ7ZGlzcGxheTpub25lfS5kcm9wc3RhcnQgLmRyb3Bkb3duLXRvZ2dsZTo6YmVmb3Jle2Rpc3BsYXk6aW5saW5lLWJsb2NrO21hcmdpbi1yaWdodDouMjU1ZW07dmVydGljYWwtYWxpZ246LjI1NWVtO2NvbnRlbnQ6XCJcIjtib3JkZXItdG9wOi4zZW0gc29saWQgdHJhbnNwYXJlbnQ7Ym9yZGVyLXJpZ2h0Oi4zZW0gc29saWQ7Ym9yZGVyLWJvdHRvbTouM2VtIHNvbGlkIHRyYW5zcGFyZW50fS5kcm9wc3RhcnQgLmRyb3Bkb3duLXRvZ2dsZTplbXB0eTo6YWZ0ZXJ7bWFyZ2luLWxlZnQ6MH0uZHJvcHN0YXJ0IC5kcm9wZG93bi10b2dnbGU6OmJlZm9yZXt2ZXJ0aWNhbC1hbGlnbjowfS5kcm9wZG93bi1kaXZpZGVye2hlaWdodDowO21hcmdpbjp2YXIoLS1icy1kcm9wZG93bi1kaXZpZGVyLW1hcmdpbi15KSAwO292ZXJmbG93OmhpZGRlbjtib3JkZXItdG9wOjFweCBzb2xpZCB2YXIoLS1icy1kcm9wZG93bi1kaXZpZGVyLWJnKTtvcGFjaXR5OjF9LmRyb3Bkb3duLWl0ZW17ZGlzcGxheTpibG9jazt3aWR0aDoxMDAlO3BhZGRpbmc6dmFyKC0tYnMtZHJvcGRvd24taXRlbS1wYWRkaW5nLXkpIHZhcigtLWJzLWRyb3Bkb3duLWl0ZW0tcGFkZGluZy14KTtjbGVhcjpib3RoO2ZvbnQtd2VpZ2h0OjQwMDtjb2xvcjp2YXIoLS1icy1kcm9wZG93bi1saW5rLWNvbG9yKTt0ZXh0LWFsaWduOmluaGVyaXQ7dGV4dC1kZWNvcmF0aW9uOm5vbmU7d2hpdGUtc3BhY2U6bm93cmFwO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7Ym9yZGVyOjA7Ym9yZGVyLXJhZGl1czp2YXIoLS1icy1kcm9wZG93bi1pdGVtLWJvcmRlci1yYWRpdXMsIDApfS5kcm9wZG93bi1pdGVtOmhvdmVyLC5kcm9wZG93bi1pdGVtOmZvY3Vze2NvbG9yOnZhcigtLWJzLWRyb3Bkb3duLWxpbmstaG92ZXItY29sb3IpO2JhY2tncm91bmQtY29sb3I6dmFyKC0tYnMtZHJvcGRvd24tbGluay1ob3Zlci1iZyl9LmRyb3Bkb3duLWl0ZW0uYWN0aXZlLC5kcm9wZG93bi1pdGVtOmFjdGl2ZXtjb2xvcjp2YXIoLS1icy1kcm9wZG93bi1saW5rLWFjdGl2ZS1jb2xvcik7dGV4dC1kZWNvcmF0aW9uOm5vbmU7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1icy1kcm9wZG93bi1saW5rLWFjdGl2ZS1iZyl9LmRyb3Bkb3duLWl0ZW0uZGlzYWJsZWQsLmRyb3Bkb3duLWl0ZW06ZGlzYWJsZWR7Y29sb3I6dmFyKC0tYnMtZHJvcGRvd24tbGluay1kaXNhYmxlZC1jb2xvcik7cG9pbnRlci1ldmVudHM6bm9uZTtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5kcm9wZG93bi1tZW51LnNob3d7ZGlzcGxheTpibG9ja30uZHJvcGRvd24taGVhZGVye2Rpc3BsYXk6YmxvY2s7cGFkZGluZzp2YXIoLS1icy1kcm9wZG93bi1oZWFkZXItcGFkZGluZy15KSB2YXIoLS1icy1kcm9wZG93bi1oZWFkZXItcGFkZGluZy14KTttYXJnaW4tYm90dG9tOjA7Zm9udC1zaXplOi44NzVyZW07Y29sb3I6dmFyKC0tYnMtZHJvcGRvd24taGVhZGVyLWNvbG9yKTt3aGl0ZS1zcGFjZTpub3dyYXB9LmRyb3Bkb3duLWl0ZW0tdGV4dHtkaXNwbGF5OmJsb2NrO3BhZGRpbmc6dmFyKC0tYnMtZHJvcGRvd24taXRlbS1wYWRkaW5nLXkpIHZhcigtLWJzLWRyb3Bkb3duLWl0ZW0tcGFkZGluZy14KTtjb2xvcjp2YXIoLS1icy1kcm9wZG93bi1saW5rLWNvbG9yKX0uZHJvcGRvd24tbWVudS1kYXJrey0tYnMtZHJvcGRvd24tY29sb3I6ICNkZWUyZTY7LS1icy1kcm9wZG93bi1iZzogIzM0M2E0MDstLWJzLWRyb3Bkb3duLWJvcmRlci1jb2xvcjogdmFyKC0tYnMtYm9yZGVyLWNvbG9yLXRyYW5zbHVjZW50KTstLWJzLWRyb3Bkb3duLWJveC1zaGFkb3c6IDstLWJzLWRyb3Bkb3duLWxpbmstY29sb3I6ICNkZWUyZTY7LS1icy1kcm9wZG93bi1saW5rLWhvdmVyLWNvbG9yOiAjZmZmOy0tYnMtZHJvcGRvd24tZGl2aWRlci1iZzogdmFyKC0tYnMtYm9yZGVyLWNvbG9yLXRyYW5zbHVjZW50KTstLWJzLWRyb3Bkb3duLWxpbmstaG92ZXItYmc6IHJnYmEoMjU1LDI1NSwyNTUsMC4xNSk7LS1icy1kcm9wZG93bi1saW5rLWFjdGl2ZS1jb2xvcjogI2ZmZjstLWJzLWRyb3Bkb3duLWxpbmstYWN0aXZlLWJnOiAjMGQ2ZWZkOy0tYnMtZHJvcGRvd24tbGluay1kaXNhYmxlZC1jb2xvcjogI2FkYjViZDstLWJzLWRyb3Bkb3duLWhlYWRlci1jb2xvcjogI2FkYjViZH0uYnRuLWdyb3VwLC5idG4tZ3JvdXAtdmVydGljYWx7cG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTppbmxpbmUtZmxleDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9LmJ0bi1ncm91cD4uYnRuLC5idG4tZ3JvdXAtdmVydGljYWw+LmJ0bntwb3NpdGlvbjpyZWxhdGl2ZTtmbGV4OjEgMSBhdXRvfS5idG4tZ3JvdXA+LmJ0bi1jaGVjazpjaGVja2VkKy5idG4sLmJ0bi1ncm91cD4uYnRuLWNoZWNrOmZvY3VzKy5idG4sLmJ0bi1ncm91cD4uYnRuOmhvdmVyLC5idG4tZ3JvdXA+LmJ0bjpmb2N1cywuYnRuLWdyb3VwPi5idG46YWN0aXZlLC5idG4tZ3JvdXA+LmJ0bi5hY3RpdmUsLmJ0bi1ncm91cC12ZXJ0aWNhbD4uYnRuLWNoZWNrOmNoZWNrZWQrLmJ0biwuYnRuLWdyb3VwLXZlcnRpY2FsPi5idG4tY2hlY2s6Zm9jdXMrLmJ0biwuYnRuLWdyb3VwLXZlcnRpY2FsPi5idG46aG92ZXIsLmJ0bi1ncm91cC12ZXJ0aWNhbD4uYnRuOmZvY3VzLC5idG4tZ3JvdXAtdmVydGljYWw+LmJ0bjphY3RpdmUsLmJ0bi1ncm91cC12ZXJ0aWNhbD4uYnRuLmFjdGl2ZXt6LWluZGV4OjF9LmJ0bi10b29sYmFye2Rpc3BsYXk6ZmxleDtmbGV4LXdyYXA6d3JhcDtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1zdGFydH0uYnRuLXRvb2xiYXIgLmlucHV0LWdyb3Vwe3dpZHRoOmF1dG99LmJ0bi1ncm91cHtib3JkZXItcmFkaXVzOnZhcigtLWJzLWJvcmRlci1yYWRpdXMpfS5idG4tZ3JvdXA+Om5vdCguYnRuLWNoZWNrOmZpcnN0LWNoaWxkKSsuYnRuLC5idG4tZ3JvdXA+LmJ0bi1ncm91cDpub3QoOmZpcnN0LWNoaWxkKXttYXJnaW4tbGVmdDpjYWxjKHZhcigtLWJzLWJvcmRlci13aWR0aCkgKiAtMSl9LmJ0bi1ncm91cD4uYnRuOm5vdCg6bGFzdC1jaGlsZCk6bm90KC5kcm9wZG93bi10b2dnbGUpLC5idG4tZ3JvdXA+LmJ0bi5kcm9wZG93bi10b2dnbGUtc3BsaXQ6Zmlyc3QtY2hpbGQsLmJ0bi1ncm91cD4uYnRuLWdyb3VwOm5vdCg6bGFzdC1jaGlsZCk+LmJ0bntib3JkZXItdG9wLXJpZ2h0LXJhZGl1czowO2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjB9LmJ0bi1ncm91cD4uYnRuOm50aC1jaGlsZChuKzMpLC5idG4tZ3JvdXA+Om5vdCguYnRuLWNoZWNrKSsuYnRuLC5idG4tZ3JvdXA+LmJ0bi1ncm91cDpub3QoOmZpcnN0LWNoaWxkKT4uYnRue2JvcmRlci10b3AtbGVmdC1yYWRpdXM6MDtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjB9LmRyb3Bkb3duLXRvZ2dsZS1zcGxpdHtwYWRkaW5nLXJpZ2h0Oi41NjI1cmVtO3BhZGRpbmctbGVmdDouNTYyNXJlbX0uZHJvcGRvd24tdG9nZ2xlLXNwbGl0OjphZnRlciwuZHJvcHVwIC5kcm9wZG93bi10b2dnbGUtc3BsaXQ6OmFmdGVyLC5kcm9wZW5kIC5kcm9wZG93bi10b2dnbGUtc3BsaXQ6OmFmdGVye21hcmdpbi1sZWZ0OjB9LmRyb3BzdGFydCAuZHJvcGRvd24tdG9nZ2xlLXNwbGl0OjpiZWZvcmV7bWFyZ2luLXJpZ2h0OjB9LmJ0bi1zbSsuZHJvcGRvd24tdG9nZ2xlLXNwbGl0LC5idG4tZ3JvdXAtc20+LmJ0bisuZHJvcGRvd24tdG9nZ2xlLXNwbGl0e3BhZGRpbmctcmlnaHQ6LjM3NXJlbTtwYWRkaW5nLWxlZnQ6LjM3NXJlbX0uYnRuLWxnKy5kcm9wZG93bi10b2dnbGUtc3BsaXQsLmJ0bi1ncm91cC1sZz4uYnRuKy5kcm9wZG93bi10b2dnbGUtc3BsaXR7cGFkZGluZy1yaWdodDouNzVyZW07cGFkZGluZy1sZWZ0Oi43NXJlbX0uYnRuLWdyb3VwLXZlcnRpY2Fse2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjthbGlnbi1pdGVtczpmbGV4LXN0YXJ0O2p1c3RpZnktY29udGVudDpjZW50ZXJ9LmJ0bi1ncm91cC12ZXJ0aWNhbD4uYnRuLC5idG4tZ3JvdXAtdmVydGljYWw+LmJ0bi1ncm91cHt3aWR0aDoxMDAlfS5idG4tZ3JvdXAtdmVydGljYWw+LmJ0bjpub3QoOmZpcnN0LWNoaWxkKSwuYnRuLWdyb3VwLXZlcnRpY2FsPi5idG4tZ3JvdXA6bm90KDpmaXJzdC1jaGlsZCl7bWFyZ2luLXRvcDpjYWxjKHZhcigtLWJzLWJvcmRlci13aWR0aCkgKiAtMSl9LmJ0bi1ncm91cC12ZXJ0aWNhbD4uYnRuOm5vdCg6bGFzdC1jaGlsZCk6bm90KC5kcm9wZG93bi10b2dnbGUpLC5idG4tZ3JvdXAtdmVydGljYWw+LmJ0bi1ncm91cDpub3QoOmxhc3QtY2hpbGQpPi5idG57Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6MDtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjB9LmJ0bi1ncm91cC12ZXJ0aWNhbD4uYnRuIH4gLmJ0biwuYnRuLWdyb3VwLXZlcnRpY2FsPi5idG4tZ3JvdXA6bm90KDpmaXJzdC1jaGlsZCk+LmJ0bntib3JkZXItdG9wLWxlZnQtcmFkaXVzOjA7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6MH0ubmF2ey0tYnMtbmF2LWxpbmstcGFkZGluZy14OiAxcmVtOy0tYnMtbmF2LWxpbmstcGFkZGluZy15OiAuNXJlbTstLWJzLW5hdi1saW5rLWZvbnQtd2VpZ2h0OiA7LS1icy1uYXYtbGluay1jb2xvcjogdmFyKC0tYnMtbGluay1jb2xvcik7LS1icy1uYXYtbGluay1ob3Zlci1jb2xvcjogdmFyKC0tYnMtbGluay1ob3Zlci1jb2xvcik7LS1icy1uYXYtbGluay1kaXNhYmxlZC1jb2xvcjogdmFyKC0tYnMtc2Vjb25kYXJ5LWNvbG9yKTtkaXNwbGF5OmZsZXg7ZmxleC13cmFwOndyYXA7cGFkZGluZy1sZWZ0OjA7bWFyZ2luLWJvdHRvbTowO2xpc3Qtc3R5bGU6bm9uZX0ubmF2LWxpbmt7ZGlzcGxheTpibG9jaztwYWRkaW5nOnZhcigtLWJzLW5hdi1saW5rLXBhZGRpbmcteSkgdmFyKC0tYnMtbmF2LWxpbmstcGFkZGluZy14KTtmb250LXNpemU6dmFyKC0tYnMtbmF2LWxpbmstZm9udC1zaXplKTtmb250LXdlaWdodDp2YXIoLS1icy1uYXYtbGluay1mb250LXdlaWdodCk7Y29sb3I6dmFyKC0tYnMtbmF2LWxpbmstY29sb3IpO3RleHQtZGVjb3JhdGlvbjpub25lO2JhY2tncm91bmQ6bm9uZTtib3JkZXI6MDt0cmFuc2l0aW9uOmNvbG9yIDAuMTVzIGVhc2UtaW4tb3V0LGJhY2tncm91bmQtY29sb3IgMC4xNXMgZWFzZS1pbi1vdXQsYm9yZGVyLWNvbG9yIDAuMTVzIGVhc2UtaW4tb3V0fUBtZWRpYSAocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogcmVkdWNlKXsubmF2LWxpbmt7dHJhbnNpdGlvbjpub25lfX0ubmF2LWxpbms6aG92ZXIsLm5hdi1saW5rOmZvY3Vze2NvbG9yOnZhcigtLWJzLW5hdi1saW5rLWhvdmVyLWNvbG9yKX0ubmF2LWxpbms6Zm9jdXMtdmlzaWJsZXtvdXRsaW5lOjA7Ym94LXNoYWRvdzowIDAgMCAuMjVyZW0gcmdiYSgxMywxMTAsMjUzLDAuMjUpfS5uYXYtbGluay5kaXNhYmxlZCwubmF2LWxpbms6ZGlzYWJsZWR7Y29sb3I6dmFyKC0tYnMtbmF2LWxpbmstZGlzYWJsZWQtY29sb3IpO3BvaW50ZXItZXZlbnRzOm5vbmU7Y3Vyc29yOmRlZmF1bHR9Lm5hdi10YWJzey0tYnMtbmF2LXRhYnMtYm9yZGVyLXdpZHRoOiB2YXIoLS1icy1ib3JkZXItd2lkdGgpOy0tYnMtbmF2LXRhYnMtYm9yZGVyLWNvbG9yOiB2YXIoLS1icy1ib3JkZXItY29sb3IpOy0tYnMtbmF2LXRhYnMtYm9yZGVyLXJhZGl1czogdmFyKC0tYnMtYm9yZGVyLXJhZGl1cyk7LS1icy1uYXYtdGFicy1saW5rLWhvdmVyLWJvcmRlci1jb2xvcjogdmFyKC0tYnMtc2Vjb25kYXJ5LWJnKSB2YXIoLS1icy1zZWNvbmRhcnktYmcpIHZhcigtLWJzLWJvcmRlci1jb2xvcik7LS1icy1uYXYtdGFicy1saW5rLWFjdGl2ZS1jb2xvcjogdmFyKC0tYnMtZW1waGFzaXMtY29sb3IpOy0tYnMtbmF2LXRhYnMtbGluay1hY3RpdmUtYmc6IHZhcigtLWJzLWJvZHktYmcpOy0tYnMtbmF2LXRhYnMtbGluay1hY3RpdmUtYm9yZGVyLWNvbG9yOiB2YXIoLS1icy1ib3JkZXItY29sb3IpIHZhcigtLWJzLWJvcmRlci1jb2xvcikgdmFyKC0tYnMtYm9keS1iZyk7Ym9yZGVyLWJvdHRvbTp2YXIoLS1icy1uYXYtdGFicy1ib3JkZXItd2lkdGgpIHNvbGlkIHZhcigtLWJzLW5hdi10YWJzLWJvcmRlci1jb2xvcil9Lm5hdi10YWJzIC5uYXYtbGlua3ttYXJnaW4tYm90dG9tOmNhbGMoLTEgKiB2YXIoLS1icy1uYXYtdGFicy1ib3JkZXItd2lkdGgpKTtib3JkZXI6dmFyKC0tYnMtbmF2LXRhYnMtYm9yZGVyLXdpZHRoKSBzb2xpZCB0cmFuc3BhcmVudDtib3JkZXItdG9wLWxlZnQtcmFkaXVzOnZhcigtLWJzLW5hdi10YWJzLWJvcmRlci1yYWRpdXMpO2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOnZhcigtLWJzLW5hdi10YWJzLWJvcmRlci1yYWRpdXMpfS5uYXYtdGFicyAubmF2LWxpbms6aG92ZXIsLm5hdi10YWJzIC5uYXYtbGluazpmb2N1c3tpc29sYXRpb246aXNvbGF0ZTtib3JkZXItY29sb3I6dmFyKC0tYnMtbmF2LXRhYnMtbGluay1ob3Zlci1ib3JkZXItY29sb3IpfS5uYXYtdGFicyAubmF2LWxpbmsuYWN0aXZlLC5uYXYtdGFicyAubmF2LWl0ZW0uc2hvdyAubmF2LWxpbmt7Y29sb3I6dmFyKC0tYnMtbmF2LXRhYnMtbGluay1hY3RpdmUtY29sb3IpO2JhY2tncm91bmQtY29sb3I6dmFyKC0tYnMtbmF2LXRhYnMtbGluay1hY3RpdmUtYmcpO2JvcmRlci1jb2xvcjp2YXIoLS1icy1uYXYtdGFicy1saW5rLWFjdGl2ZS1ib3JkZXItY29sb3IpfS5uYXYtdGFicyAuZHJvcGRvd24tbWVudXttYXJnaW4tdG9wOmNhbGMoLTEgKiB2YXIoLS1icy1uYXYtdGFicy1ib3JkZXItd2lkdGgpKTtib3JkZXItdG9wLWxlZnQtcmFkaXVzOjA7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6MH0ubmF2LXBpbGxzey0tYnMtbmF2LXBpbGxzLWJvcmRlci1yYWRpdXM6IHZhcigtLWJzLWJvcmRlci1yYWRpdXMpOy0tYnMtbmF2LXBpbGxzLWxpbmstYWN0aXZlLWNvbG9yOiAjZmZmOy0tYnMtbmF2LXBpbGxzLWxpbmstYWN0aXZlLWJnOiAjMGQ2ZWZkfS5uYXYtcGlsbHMgLm5hdi1saW5re2JvcmRlci1yYWRpdXM6dmFyKC0tYnMtbmF2LXBpbGxzLWJvcmRlci1yYWRpdXMpfS5uYXYtcGlsbHMgLm5hdi1saW5rLmFjdGl2ZSwubmF2LXBpbGxzIC5zaG93Pi5uYXYtbGlua3tjb2xvcjp2YXIoLS1icy1uYXYtcGlsbHMtbGluay1hY3RpdmUtY29sb3IpO2JhY2tncm91bmQtY29sb3I6dmFyKC0tYnMtbmF2LXBpbGxzLWxpbmstYWN0aXZlLWJnKX0ubmF2LXVuZGVybGluZXstLWJzLW5hdi11bmRlcmxpbmUtZ2FwOiAxcmVtOy0tYnMtbmF2LXVuZGVybGluZS1ib3JkZXItd2lkdGg6IC4xMjVyZW07LS1icy1uYXYtdW5kZXJsaW5lLWxpbmstYWN0aXZlLWNvbG9yOiB2YXIoLS1icy1lbXBoYXNpcy1jb2xvcik7Z2FwOnZhcigtLWJzLW5hdi11bmRlcmxpbmUtZ2FwKX0ubmF2LXVuZGVybGluZSAubmF2LWxpbmt7cGFkZGluZy1yaWdodDowO3BhZGRpbmctbGVmdDowO2JvcmRlci1ib3R0b206dmFyKC0tYnMtbmF2LXVuZGVybGluZS1ib3JkZXItd2lkdGgpIHNvbGlkIHRyYW5zcGFyZW50fS5uYXYtdW5kZXJsaW5lIC5uYXYtbGluazpob3ZlciwubmF2LXVuZGVybGluZSAubmF2LWxpbms6Zm9jdXN7Ym9yZGVyLWJvdHRvbS1jb2xvcjpjdXJyZW50Y29sb3J9Lm5hdi11bmRlcmxpbmUgLm5hdi1saW5rLmFjdGl2ZSwubmF2LXVuZGVybGluZSAuc2hvdz4ubmF2LWxpbmt7Zm9udC13ZWlnaHQ6NzAwO2NvbG9yOnZhcigtLWJzLW5hdi11bmRlcmxpbmUtbGluay1hY3RpdmUtY29sb3IpO2JvcmRlci1ib3R0b20tY29sb3I6Y3VycmVudGNvbG9yfS5uYXYtZmlsbD4ubmF2LWxpbmssLm5hdi1maWxsIC5uYXYtaXRlbXtmbGV4OjEgMSBhdXRvO3RleHQtYWxpZ246Y2VudGVyfS5uYXYtanVzdGlmaWVkPi5uYXYtbGluaywubmF2LWp1c3RpZmllZCAubmF2LWl0ZW17ZmxleC1iYXNpczowO2ZsZXgtZ3JvdzoxO3RleHQtYWxpZ246Y2VudGVyfS5uYXYtZmlsbCAubmF2LWl0ZW0gLm5hdi1saW5rLC5uYXYtanVzdGlmaWVkIC5uYXYtaXRlbSAubmF2LWxpbmt7d2lkdGg6MTAwJX0udGFiLWNvbnRlbnQ+LnRhYi1wYW5le2Rpc3BsYXk6bm9uZX0udGFiLWNvbnRlbnQ+LmFjdGl2ZXtkaXNwbGF5OmJsb2NrfS5uYXZiYXJ7LS1icy1uYXZiYXItcGFkZGluZy14OiAwOy0tYnMtbmF2YmFyLXBhZGRpbmcteTogLjVyZW07LS1icy1uYXZiYXItY29sb3I6IHJnYmEodmFyKC0tYnMtZW1waGFzaXMtY29sb3ItcmdiKSwgMC42NSk7LS1icy1uYXZiYXItaG92ZXItY29sb3I6IHJnYmEodmFyKC0tYnMtZW1waGFzaXMtY29sb3ItcmdiKSwgMC44KTstLWJzLW5hdmJhci1kaXNhYmxlZC1jb2xvcjogcmdiYSh2YXIoLS1icy1lbXBoYXNpcy1jb2xvci1yZ2IpLCAwLjMpOy0tYnMtbmF2YmFyLWFjdGl2ZS1jb2xvcjogcmdiYSh2YXIoLS1icy1lbXBoYXNpcy1jb2xvci1yZ2IpLCAxKTstLWJzLW5hdmJhci1icmFuZC1wYWRkaW5nLXk6IC4zMTI1cmVtOy0tYnMtbmF2YmFyLWJyYW5kLW1hcmdpbi1lbmQ6IDFyZW07LS1icy1uYXZiYXItYnJhbmQtZm9udC1zaXplOiAxLjI1cmVtOy0tYnMtbmF2YmFyLWJyYW5kLWNvbG9yOiByZ2JhKHZhcigtLWJzLWVtcGhhc2lzLWNvbG9yLXJnYiksIDEpOy0tYnMtbmF2YmFyLWJyYW5kLWhvdmVyLWNvbG9yOiByZ2JhKHZhcigtLWJzLWVtcGhhc2lzLWNvbG9yLXJnYiksIDEpOy0tYnMtbmF2YmFyLW5hdi1saW5rLXBhZGRpbmcteDogLjVyZW07LS1icy1uYXZiYXItdG9nZ2xlci1wYWRkaW5nLXk6IC4yNXJlbTstLWJzLW5hdmJhci10b2dnbGVyLXBhZGRpbmcteDogLjc1cmVtOy0tYnMtbmF2YmFyLXRvZ2dsZXItZm9udC1zaXplOiAxLjI1cmVtOy0tYnMtbmF2YmFyLXRvZ2dsZXItaWNvbi1iZzogdXJsKCR7X19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMTFfX199KTstLWJzLW5hdmJhci10b2dnbGVyLWJvcmRlci1jb2xvcjogcmdiYSh2YXIoLS1icy1lbXBoYXNpcy1jb2xvci1yZ2IpLCAwLjE1KTstLWJzLW5hdmJhci10b2dnbGVyLWJvcmRlci1yYWRpdXM6IHZhcigtLWJzLWJvcmRlci1yYWRpdXMpOy0tYnMtbmF2YmFyLXRvZ2dsZXItZm9jdXMtd2lkdGg6IC4yNXJlbTstLWJzLW5hdmJhci10b2dnbGVyLXRyYW5zaXRpb246IGJveC1zaGFkb3cgMC4xNXMgZWFzZS1pbi1vdXQ7cG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTpmbGV4O2ZsZXgtd3JhcDp3cmFwO2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2VlbjtwYWRkaW5nOnZhcigtLWJzLW5hdmJhci1wYWRkaW5nLXkpIHZhcigtLWJzLW5hdmJhci1wYWRkaW5nLXgpfS5uYXZiYXI+LmNvbnRhaW5lciwubmF2YmFyPi5jb250YWluZXItZmx1aWQsLm5hdmJhcj4uY29udGFpbmVyLXNtLC5uYXZiYXI+LmNvbnRhaW5lci1tZCwubmF2YmFyPi5jb250YWluZXItbGcsLm5hdmJhcj4uY29udGFpbmVyLXhsLC5uYXZiYXI+LmNvbnRhaW5lci14eGx7ZGlzcGxheTpmbGV4O2ZsZXgtd3JhcDppbmhlcml0O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2Vlbn0ubmF2YmFyLWJyYW5ke3BhZGRpbmctdG9wOnZhcigtLWJzLW5hdmJhci1icmFuZC1wYWRkaW5nLXkpO3BhZGRpbmctYm90dG9tOnZhcigtLWJzLW5hdmJhci1icmFuZC1wYWRkaW5nLXkpO21hcmdpbi1yaWdodDp2YXIoLS1icy1uYXZiYXItYnJhbmQtbWFyZ2luLWVuZCk7Zm9udC1zaXplOnZhcigtLWJzLW5hdmJhci1icmFuZC1mb250LXNpemUpO2NvbG9yOnZhcigtLWJzLW5hdmJhci1icmFuZC1jb2xvcik7dGV4dC1kZWNvcmF0aW9uOm5vbmU7d2hpdGUtc3BhY2U6bm93cmFwfS5uYXZiYXItYnJhbmQ6aG92ZXIsLm5hdmJhci1icmFuZDpmb2N1c3tjb2xvcjp2YXIoLS1icy1uYXZiYXItYnJhbmQtaG92ZXItY29sb3IpfS5uYXZiYXItbmF2ey0tYnMtbmF2LWxpbmstcGFkZGluZy14OiAwOy0tYnMtbmF2LWxpbmstcGFkZGluZy15OiAuNXJlbTstLWJzLW5hdi1saW5rLWZvbnQtd2VpZ2h0OiA7LS1icy1uYXYtbGluay1jb2xvcjogdmFyKC0tYnMtbmF2YmFyLWNvbG9yKTstLWJzLW5hdi1saW5rLWhvdmVyLWNvbG9yOiB2YXIoLS1icy1uYXZiYXItaG92ZXItY29sb3IpOy0tYnMtbmF2LWxpbmstZGlzYWJsZWQtY29sb3I6IHZhcigtLWJzLW5hdmJhci1kaXNhYmxlZC1jb2xvcik7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtwYWRkaW5nLWxlZnQ6MDttYXJnaW4tYm90dG9tOjA7bGlzdC1zdHlsZTpub25lfS5uYXZiYXItbmF2IC5uYXYtbGluay5hY3RpdmUsLm5hdmJhci1uYXYgLm5hdi1saW5rLnNob3d7Y29sb3I6dmFyKC0tYnMtbmF2YmFyLWFjdGl2ZS1jb2xvcil9Lm5hdmJhci1uYXYgLmRyb3Bkb3duLW1lbnV7cG9zaXRpb246c3RhdGljfS5uYXZiYXItdGV4dHtwYWRkaW5nLXRvcDouNXJlbTtwYWRkaW5nLWJvdHRvbTouNXJlbTtjb2xvcjp2YXIoLS1icy1uYXZiYXItY29sb3IpfS5uYXZiYXItdGV4dCBhLC5uYXZiYXItdGV4dCBhOmhvdmVyLC5uYXZiYXItdGV4dCBhOmZvY3Vze2NvbG9yOnZhcigtLWJzLW5hdmJhci1hY3RpdmUtY29sb3IpfS5uYXZiYXItY29sbGFwc2V7ZmxleC1iYXNpczoxMDAlO2ZsZXgtZ3JvdzoxO2FsaWduLWl0ZW1zOmNlbnRlcn0ubmF2YmFyLXRvZ2dsZXJ7cGFkZGluZzp2YXIoLS1icy1uYXZiYXItdG9nZ2xlci1wYWRkaW5nLXkpIHZhcigtLWJzLW5hdmJhci10b2dnbGVyLXBhZGRpbmcteCk7Zm9udC1zaXplOnZhcigtLWJzLW5hdmJhci10b2dnbGVyLWZvbnQtc2l6ZSk7bGluZS1oZWlnaHQ6MTtjb2xvcjp2YXIoLS1icy1uYXZiYXItY29sb3IpO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7Ym9yZGVyOnZhcigtLWJzLWJvcmRlci13aWR0aCkgc29saWQgdmFyKC0tYnMtbmF2YmFyLXRvZ2dsZXItYm9yZGVyLWNvbG9yKTtib3JkZXItcmFkaXVzOnZhcigtLWJzLW5hdmJhci10b2dnbGVyLWJvcmRlci1yYWRpdXMpO3RyYW5zaXRpb246dmFyKC0tYnMtbmF2YmFyLXRvZ2dsZXItdHJhbnNpdGlvbil9QG1lZGlhIChwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2Upey5uYXZiYXItdG9nZ2xlcnt0cmFuc2l0aW9uOm5vbmV9fS5uYXZiYXItdG9nZ2xlcjpob3Zlcnt0ZXh0LWRlY29yYXRpb246bm9uZX0ubmF2YmFyLXRvZ2dsZXI6Zm9jdXN7dGV4dC1kZWNvcmF0aW9uOm5vbmU7b3V0bGluZTowO2JveC1zaGFkb3c6MCAwIDAgdmFyKC0tYnMtbmF2YmFyLXRvZ2dsZXItZm9jdXMtd2lkdGgpfS5uYXZiYXItdG9nZ2xlci1pY29ue2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjEuNWVtO2hlaWdodDoxLjVlbTt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7YmFja2dyb3VuZC1pbWFnZTp2YXIoLS1icy1uYXZiYXItdG9nZ2xlci1pY29uLWJnKTtiYWNrZ3JvdW5kLXJlcGVhdDpuby1yZXBlYXQ7YmFja2dyb3VuZC1wb3NpdGlvbjpjZW50ZXI7YmFja2dyb3VuZC1zaXplOjEwMCV9Lm5hdmJhci1uYXYtc2Nyb2xse21heC1oZWlnaHQ6dmFyKC0tYnMtc2Nyb2xsLWhlaWdodCwgNzV2aCk7b3ZlcmZsb3cteTphdXRvfUBtZWRpYSAobWluLXdpZHRoOiA1NzZweCl7Lm5hdmJhci1leHBhbmQtc217ZmxleC13cmFwOm5vd3JhcDtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1zdGFydH0ubmF2YmFyLWV4cGFuZC1zbSAubmF2YmFyLW5hdntmbGV4LWRpcmVjdGlvbjpyb3d9Lm5hdmJhci1leHBhbmQtc20gLm5hdmJhci1uYXYgLmRyb3Bkb3duLW1lbnV7cG9zaXRpb246YWJzb2x1dGV9Lm5hdmJhci1leHBhbmQtc20gLm5hdmJhci1uYXYgLm5hdi1saW5re3BhZGRpbmctcmlnaHQ6dmFyKC0tYnMtbmF2YmFyLW5hdi1saW5rLXBhZGRpbmcteCk7cGFkZGluZy1sZWZ0OnZhcigtLWJzLW5hdmJhci1uYXYtbGluay1wYWRkaW5nLXgpfS5uYXZiYXItZXhwYW5kLXNtIC5uYXZiYXItbmF2LXNjcm9sbHtvdmVyZmxvdzp2aXNpYmxlfS5uYXZiYXItZXhwYW5kLXNtIC5uYXZiYXItY29sbGFwc2V7ZGlzcGxheTpmbGV4ICFpbXBvcnRhbnQ7ZmxleC1iYXNpczphdXRvfS5uYXZiYXItZXhwYW5kLXNtIC5uYXZiYXItdG9nZ2xlcntkaXNwbGF5Om5vbmV9Lm5hdmJhci1leHBhbmQtc20gLm9mZmNhbnZhc3twb3NpdGlvbjpzdGF0aWM7ei1pbmRleDphdXRvO2ZsZXgtZ3JvdzoxO3dpZHRoOmF1dG8gIWltcG9ydGFudDtoZWlnaHQ6YXV0byAhaW1wb3J0YW50O3Zpc2liaWxpdHk6dmlzaWJsZSAhaW1wb3J0YW50O2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQgIWltcG9ydGFudDtib3JkZXI6MCAhaW1wb3J0YW50O3RyYW5zZm9ybTpub25lICFpbXBvcnRhbnQ7dHJhbnNpdGlvbjpub25lfS5uYXZiYXItZXhwYW5kLXNtIC5vZmZjYW52YXMgLm9mZmNhbnZhcy1oZWFkZXJ7ZGlzcGxheTpub25lfS5uYXZiYXItZXhwYW5kLXNtIC5vZmZjYW52YXMgLm9mZmNhbnZhcy1ib2R5e2Rpc3BsYXk6ZmxleDtmbGV4LWdyb3c6MDtwYWRkaW5nOjA7b3ZlcmZsb3cteTp2aXNpYmxlfX1AbWVkaWEgKG1pbi13aWR0aDogNzY4cHgpey5uYXZiYXItZXhwYW5kLW1ke2ZsZXgtd3JhcDpub3dyYXA7anVzdGlmeS1jb250ZW50OmZsZXgtc3RhcnR9Lm5hdmJhci1leHBhbmQtbWQgLm5hdmJhci1uYXZ7ZmxleC1kaXJlY3Rpb246cm93fS5uYXZiYXItZXhwYW5kLW1kIC5uYXZiYXItbmF2IC5kcm9wZG93bi1tZW51e3Bvc2l0aW9uOmFic29sdXRlfS5uYXZiYXItZXhwYW5kLW1kIC5uYXZiYXItbmF2IC5uYXYtbGlua3twYWRkaW5nLXJpZ2h0OnZhcigtLWJzLW5hdmJhci1uYXYtbGluay1wYWRkaW5nLXgpO3BhZGRpbmctbGVmdDp2YXIoLS1icy1uYXZiYXItbmF2LWxpbmstcGFkZGluZy14KX0ubmF2YmFyLWV4cGFuZC1tZCAubmF2YmFyLW5hdi1zY3JvbGx7b3ZlcmZsb3c6dmlzaWJsZX0ubmF2YmFyLWV4cGFuZC1tZCAubmF2YmFyLWNvbGxhcHNle2Rpc3BsYXk6ZmxleCAhaW1wb3J0YW50O2ZsZXgtYmFzaXM6YXV0b30ubmF2YmFyLWV4cGFuZC1tZCAubmF2YmFyLXRvZ2dsZXJ7ZGlzcGxheTpub25lfS5uYXZiYXItZXhwYW5kLW1kIC5vZmZjYW52YXN7cG9zaXRpb246c3RhdGljO3otaW5kZXg6YXV0bztmbGV4LWdyb3c6MTt3aWR0aDphdXRvICFpbXBvcnRhbnQ7aGVpZ2h0OmF1dG8gIWltcG9ydGFudDt2aXNpYmlsaXR5OnZpc2libGUgIWltcG9ydGFudDtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7Ym9yZGVyOjAgIWltcG9ydGFudDt0cmFuc2Zvcm06bm9uZSAhaW1wb3J0YW50O3RyYW5zaXRpb246bm9uZX0ubmF2YmFyLWV4cGFuZC1tZCAub2ZmY2FudmFzIC5vZmZjYW52YXMtaGVhZGVye2Rpc3BsYXk6bm9uZX0ubmF2YmFyLWV4cGFuZC1tZCAub2ZmY2FudmFzIC5vZmZjYW52YXMtYm9keXtkaXNwbGF5OmZsZXg7ZmxleC1ncm93OjA7cGFkZGluZzowO292ZXJmbG93LXk6dmlzaWJsZX19QG1lZGlhIChtaW4td2lkdGg6IDk5MnB4KXsubmF2YmFyLWV4cGFuZC1sZ3tmbGV4LXdyYXA6bm93cmFwO2p1c3RpZnktY29udGVudDpmbGV4LXN0YXJ0fS5uYXZiYXItZXhwYW5kLWxnIC5uYXZiYXItbmF2e2ZsZXgtZGlyZWN0aW9uOnJvd30ubmF2YmFyLWV4cGFuZC1sZyAubmF2YmFyLW5hdiAuZHJvcGRvd24tbWVudXtwb3NpdGlvbjphYnNvbHV0ZX0ubmF2YmFyLWV4cGFuZC1sZyAubmF2YmFyLW5hdiAubmF2LWxpbmt7cGFkZGluZy1yaWdodDp2YXIoLS1icy1uYXZiYXItbmF2LWxpbmstcGFkZGluZy14KTtwYWRkaW5nLWxlZnQ6dmFyKC0tYnMtbmF2YmFyLW5hdi1saW5rLXBhZGRpbmcteCl9Lm5hdmJhci1leHBhbmQtbGcgLm5hdmJhci1uYXYtc2Nyb2xse292ZXJmbG93OnZpc2libGV9Lm5hdmJhci1leHBhbmQtbGcgLm5hdmJhci1jb2xsYXBzZXtkaXNwbGF5OmZsZXggIWltcG9ydGFudDtmbGV4LWJhc2lzOmF1dG99Lm5hdmJhci1leHBhbmQtbGcgLm5hdmJhci10b2dnbGVye2Rpc3BsYXk6bm9uZX0ubmF2YmFyLWV4cGFuZC1sZyAub2ZmY2FudmFze3Bvc2l0aW9uOnN0YXRpYzt6LWluZGV4OmF1dG87ZmxleC1ncm93OjE7d2lkdGg6YXV0byAhaW1wb3J0YW50O2hlaWdodDphdXRvICFpbXBvcnRhbnQ7dmlzaWJpbGl0eTp2aXNpYmxlICFpbXBvcnRhbnQ7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCAhaW1wb3J0YW50O2JvcmRlcjowICFpbXBvcnRhbnQ7dHJhbnNmb3JtOm5vbmUgIWltcG9ydGFudDt0cmFuc2l0aW9uOm5vbmV9Lm5hdmJhci1leHBhbmQtbGcgLm9mZmNhbnZhcyAub2ZmY2FudmFzLWhlYWRlcntkaXNwbGF5Om5vbmV9Lm5hdmJhci1leHBhbmQtbGcgLm9mZmNhbnZhcyAub2ZmY2FudmFzLWJvZHl7ZGlzcGxheTpmbGV4O2ZsZXgtZ3JvdzowO3BhZGRpbmc6MDtvdmVyZmxvdy15OnZpc2libGV9fUBtZWRpYSAobWluLXdpZHRoOiAxMjAwcHgpey5uYXZiYXItZXhwYW5kLXhse2ZsZXgtd3JhcDpub3dyYXA7anVzdGlmeS1jb250ZW50OmZsZXgtc3RhcnR9Lm5hdmJhci1leHBhbmQteGwgLm5hdmJhci1uYXZ7ZmxleC1kaXJlY3Rpb246cm93fS5uYXZiYXItZXhwYW5kLXhsIC5uYXZiYXItbmF2IC5kcm9wZG93bi1tZW51e3Bvc2l0aW9uOmFic29sdXRlfS5uYXZiYXItZXhwYW5kLXhsIC5uYXZiYXItbmF2IC5uYXYtbGlua3twYWRkaW5nLXJpZ2h0OnZhcigtLWJzLW5hdmJhci1uYXYtbGluay1wYWRkaW5nLXgpO3BhZGRpbmctbGVmdDp2YXIoLS1icy1uYXZiYXItbmF2LWxpbmstcGFkZGluZy14KX0ubmF2YmFyLWV4cGFuZC14bCAubmF2YmFyLW5hdi1zY3JvbGx7b3ZlcmZsb3c6dmlzaWJsZX0ubmF2YmFyLWV4cGFuZC14bCAubmF2YmFyLWNvbGxhcHNle2Rpc3BsYXk6ZmxleCAhaW1wb3J0YW50O2ZsZXgtYmFzaXM6YXV0b30ubmF2YmFyLWV4cGFuZC14bCAubmF2YmFyLXRvZ2dsZXJ7ZGlzcGxheTpub25lfS5uYXZiYXItZXhwYW5kLXhsIC5vZmZjYW52YXN7cG9zaXRpb246c3RhdGljO3otaW5kZXg6YXV0bztmbGV4LWdyb3c6MTt3aWR0aDphdXRvICFpbXBvcnRhbnQ7aGVpZ2h0OmF1dG8gIWltcG9ydGFudDt2aXNpYmlsaXR5OnZpc2libGUgIWltcG9ydGFudDtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7Ym9yZGVyOjAgIWltcG9ydGFudDt0cmFuc2Zvcm06bm9uZSAhaW1wb3J0YW50O3RyYW5zaXRpb246bm9uZX0ubmF2YmFyLWV4cGFuZC14bCAub2ZmY2FudmFzIC5vZmZjYW52YXMtaGVhZGVye2Rpc3BsYXk6bm9uZX0ubmF2YmFyLWV4cGFuZC14bCAub2ZmY2FudmFzIC5vZmZjYW52YXMtYm9keXtkaXNwbGF5OmZsZXg7ZmxleC1ncm93OjA7cGFkZGluZzowO292ZXJmbG93LXk6dmlzaWJsZX19QG1lZGlhIChtaW4td2lkdGg6IDE0MDBweCl7Lm5hdmJhci1leHBhbmQteHhse2ZsZXgtd3JhcDpub3dyYXA7anVzdGlmeS1jb250ZW50OmZsZXgtc3RhcnR9Lm5hdmJhci1leHBhbmQteHhsIC5uYXZiYXItbmF2e2ZsZXgtZGlyZWN0aW9uOnJvd30ubmF2YmFyLWV4cGFuZC14eGwgLm5hdmJhci1uYXYgLmRyb3Bkb3duLW1lbnV7cG9zaXRpb246YWJzb2x1dGV9Lm5hdmJhci1leHBhbmQteHhsIC5uYXZiYXItbmF2IC5uYXYtbGlua3twYWRkaW5nLXJpZ2h0OnZhcigtLWJzLW5hdmJhci1uYXYtbGluay1wYWRkaW5nLXgpO3BhZGRpbmctbGVmdDp2YXIoLS1icy1uYXZiYXItbmF2LWxpbmstcGFkZGluZy14KX0ubmF2YmFyLWV4cGFuZC14eGwgLm5hdmJhci1uYXYtc2Nyb2xse292ZXJmbG93OnZpc2libGV9Lm5hdmJhci1leHBhbmQteHhsIC5uYXZiYXItY29sbGFwc2V7ZGlzcGxheTpmbGV4ICFpbXBvcnRhbnQ7ZmxleC1iYXNpczphdXRvfS5uYXZiYXItZXhwYW5kLXh4bCAubmF2YmFyLXRvZ2dsZXJ7ZGlzcGxheTpub25lfS5uYXZiYXItZXhwYW5kLXh4bCAub2ZmY2FudmFze3Bvc2l0aW9uOnN0YXRpYzt6LWluZGV4OmF1dG87ZmxleC1ncm93OjE7d2lkdGg6YXV0byAhaW1wb3J0YW50O2hlaWdodDphdXRvICFpbXBvcnRhbnQ7dmlzaWJpbGl0eTp2aXNpYmxlICFpbXBvcnRhbnQ7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCAhaW1wb3J0YW50O2JvcmRlcjowICFpbXBvcnRhbnQ7dHJhbnNmb3JtOm5vbmUgIWltcG9ydGFudDt0cmFuc2l0aW9uOm5vbmV9Lm5hdmJhci1leHBhbmQteHhsIC5vZmZjYW52YXMgLm9mZmNhbnZhcy1oZWFkZXJ7ZGlzcGxheTpub25lfS5uYXZiYXItZXhwYW5kLXh4bCAub2ZmY2FudmFzIC5vZmZjYW52YXMtYm9keXtkaXNwbGF5OmZsZXg7ZmxleC1ncm93OjA7cGFkZGluZzowO292ZXJmbG93LXk6dmlzaWJsZX19Lm5hdmJhci1leHBhbmR7ZmxleC13cmFwOm5vd3JhcDtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1zdGFydH0ubmF2YmFyLWV4cGFuZCAubmF2YmFyLW5hdntmbGV4LWRpcmVjdGlvbjpyb3d9Lm5hdmJhci1leHBhbmQgLm5hdmJhci1uYXYgLmRyb3Bkb3duLW1lbnV7cG9zaXRpb246YWJzb2x1dGV9Lm5hdmJhci1leHBhbmQgLm5hdmJhci1uYXYgLm5hdi1saW5re3BhZGRpbmctcmlnaHQ6dmFyKC0tYnMtbmF2YmFyLW5hdi1saW5rLXBhZGRpbmcteCk7cGFkZGluZy1sZWZ0OnZhcigtLWJzLW5hdmJhci1uYXYtbGluay1wYWRkaW5nLXgpfS5uYXZiYXItZXhwYW5kIC5uYXZiYXItbmF2LXNjcm9sbHtvdmVyZmxvdzp2aXNpYmxlfS5uYXZiYXItZXhwYW5kIC5uYXZiYXItY29sbGFwc2V7ZGlzcGxheTpmbGV4ICFpbXBvcnRhbnQ7ZmxleC1iYXNpczphdXRvfS5uYXZiYXItZXhwYW5kIC5uYXZiYXItdG9nZ2xlcntkaXNwbGF5Om5vbmV9Lm5hdmJhci1leHBhbmQgLm9mZmNhbnZhc3twb3NpdGlvbjpzdGF0aWM7ei1pbmRleDphdXRvO2ZsZXgtZ3JvdzoxO3dpZHRoOmF1dG8gIWltcG9ydGFudDtoZWlnaHQ6YXV0byAhaW1wb3J0YW50O3Zpc2liaWxpdHk6dmlzaWJsZSAhaW1wb3J0YW50O2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQgIWltcG9ydGFudDtib3JkZXI6MCAhaW1wb3J0YW50O3RyYW5zZm9ybTpub25lICFpbXBvcnRhbnQ7dHJhbnNpdGlvbjpub25lfS5uYXZiYXItZXhwYW5kIC5vZmZjYW52YXMgLm9mZmNhbnZhcy1oZWFkZXJ7ZGlzcGxheTpub25lfS5uYXZiYXItZXhwYW5kIC5vZmZjYW52YXMgLm9mZmNhbnZhcy1ib2R5e2Rpc3BsYXk6ZmxleDtmbGV4LWdyb3c6MDtwYWRkaW5nOjA7b3ZlcmZsb3cteTp2aXNpYmxlfS5uYXZiYXItZGFyaywubmF2YmFyW2RhdGEtYnMtdGhlbWU9XCJkYXJrXCJdey0tYnMtbmF2YmFyLWNvbG9yOiByZ2JhKDI1NSwyNTUsMjU1LDAuNTUpOy0tYnMtbmF2YmFyLWhvdmVyLWNvbG9yOiByZ2JhKDI1NSwyNTUsMjU1LDAuNzUpOy0tYnMtbmF2YmFyLWRpc2FibGVkLWNvbG9yOiByZ2JhKDI1NSwyNTUsMjU1LDAuMjUpOy0tYnMtbmF2YmFyLWFjdGl2ZS1jb2xvcjogI2ZmZjstLWJzLW5hdmJhci1icmFuZC1jb2xvcjogI2ZmZjstLWJzLW5hdmJhci1icmFuZC1ob3Zlci1jb2xvcjogI2ZmZjstLWJzLW5hdmJhci10b2dnbGVyLWJvcmRlci1jb2xvcjogcmdiYSgyNTUsMjU1LDI1NSwwLjEpOy0tYnMtbmF2YmFyLXRvZ2dsZXItaWNvbi1iZzogdXJsKCR7X19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMTJfX199KX1bZGF0YS1icy10aGVtZT1cImRhcmtcIl0gLm5hdmJhci10b2dnbGVyLWljb257LS1icy1uYXZiYXItdG9nZ2xlci1pY29uLWJnOiB1cmwoJHtfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8xMl9fX30pfS5jYXJkey0tYnMtY2FyZC1zcGFjZXIteTogMXJlbTstLWJzLWNhcmQtc3BhY2VyLXg6IDFyZW07LS1icy1jYXJkLXRpdGxlLXNwYWNlci15OiAuNXJlbTstLWJzLWNhcmQtdGl0bGUtY29sb3I6IDstLWJzLWNhcmQtc3VidGl0bGUtY29sb3I6IDstLWJzLWNhcmQtYm9yZGVyLXdpZHRoOiB2YXIoLS1icy1ib3JkZXItd2lkdGgpOy0tYnMtY2FyZC1ib3JkZXItY29sb3I6IHZhcigtLWJzLWJvcmRlci1jb2xvci10cmFuc2x1Y2VudCk7LS1icy1jYXJkLWJvcmRlci1yYWRpdXM6IHZhcigtLWJzLWJvcmRlci1yYWRpdXMpOy0tYnMtY2FyZC1ib3gtc2hhZG93OiA7LS1icy1jYXJkLWlubmVyLWJvcmRlci1yYWRpdXM6IGNhbGModmFyKC0tYnMtYm9yZGVyLXJhZGl1cykgLSAodmFyKC0tYnMtYm9yZGVyLXdpZHRoKSkpOy0tYnMtY2FyZC1jYXAtcGFkZGluZy15OiAuNXJlbTstLWJzLWNhcmQtY2FwLXBhZGRpbmcteDogMXJlbTstLWJzLWNhcmQtY2FwLWJnOiByZ2JhKHZhcigtLWJzLWJvZHktY29sb3ItcmdiKSwgMC4wMyk7LS1icy1jYXJkLWNhcC1jb2xvcjogOy0tYnMtY2FyZC1oZWlnaHQ6IDstLWJzLWNhcmQtY29sb3I6IDstLWJzLWNhcmQtYmc6IHZhcigtLWJzLWJvZHktYmcpOy0tYnMtY2FyZC1pbWctb3ZlcmxheS1wYWRkaW5nOiAxcmVtOy0tYnMtY2FyZC1ncm91cC1tYXJnaW46IC43NXJlbTtwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO21pbi13aWR0aDowO2hlaWdodDp2YXIoLS1icy1jYXJkLWhlaWdodCk7Y29sb3I6dmFyKC0tYnMtYm9keS1jb2xvcik7d29yZC13cmFwOmJyZWFrLXdvcmQ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1icy1jYXJkLWJnKTtiYWNrZ3JvdW5kLWNsaXA6Ym9yZGVyLWJveDtib3JkZXI6dmFyKC0tYnMtY2FyZC1ib3JkZXItd2lkdGgpIHNvbGlkIHZhcigtLWJzLWNhcmQtYm9yZGVyLWNvbG9yKTtib3JkZXItcmFkaXVzOnZhcigtLWJzLWNhcmQtYm9yZGVyLXJhZGl1cyl9LmNhcmQ+aHJ7bWFyZ2luLXJpZ2h0OjA7bWFyZ2luLWxlZnQ6MH0uY2FyZD4ubGlzdC1ncm91cHtib3JkZXItdG9wOmluaGVyaXQ7Ym9yZGVyLWJvdHRvbTppbmhlcml0fS5jYXJkPi5saXN0LWdyb3VwOmZpcnN0LWNoaWxke2JvcmRlci10b3Atd2lkdGg6MDtib3JkZXItdG9wLWxlZnQtcmFkaXVzOnZhcigtLWJzLWNhcmQtaW5uZXItYm9yZGVyLXJhZGl1cyk7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6dmFyKC0tYnMtY2FyZC1pbm5lci1ib3JkZXItcmFkaXVzKX0uY2FyZD4ubGlzdC1ncm91cDpsYXN0LWNoaWxke2JvcmRlci1ib3R0b20td2lkdGg6MDtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czp2YXIoLS1icy1jYXJkLWlubmVyLWJvcmRlci1yYWRpdXMpO2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6dmFyKC0tYnMtY2FyZC1pbm5lci1ib3JkZXItcmFkaXVzKX0uY2FyZD4uY2FyZC1oZWFkZXIrLmxpc3QtZ3JvdXAsLmNhcmQ+Lmxpc3QtZ3JvdXArLmNhcmQtZm9vdGVye2JvcmRlci10b3A6MH0uY2FyZC1ib2R5e2ZsZXg6MSAxIGF1dG87cGFkZGluZzp2YXIoLS1icy1jYXJkLXNwYWNlci15KSB2YXIoLS1icy1jYXJkLXNwYWNlci14KTtjb2xvcjp2YXIoLS1icy1jYXJkLWNvbG9yKX0uY2FyZC10aXRsZXttYXJnaW4tYm90dG9tOnZhcigtLWJzLWNhcmQtdGl0bGUtc3BhY2VyLXkpO2NvbG9yOnZhcigtLWJzLWNhcmQtdGl0bGUtY29sb3IpfS5jYXJkLXN1YnRpdGxle21hcmdpbi10b3A6Y2FsYygtLjUgKiB2YXIoLS1icy1jYXJkLXRpdGxlLXNwYWNlci15KSk7bWFyZ2luLWJvdHRvbTowO2NvbG9yOnZhcigtLWJzLWNhcmQtc3VidGl0bGUtY29sb3IpfS5jYXJkLXRleHQ6bGFzdC1jaGlsZHttYXJnaW4tYm90dG9tOjB9LmNhcmQtbGluaysuY2FyZC1saW5re21hcmdpbi1sZWZ0OnZhcigtLWJzLWNhcmQtc3BhY2VyLXgpfS5jYXJkLWhlYWRlcntwYWRkaW5nOnZhcigtLWJzLWNhcmQtY2FwLXBhZGRpbmcteSkgdmFyKC0tYnMtY2FyZC1jYXAtcGFkZGluZy14KTttYXJnaW4tYm90dG9tOjA7Y29sb3I6dmFyKC0tYnMtY2FyZC1jYXAtY29sb3IpO2JhY2tncm91bmQtY29sb3I6dmFyKC0tYnMtY2FyZC1jYXAtYmcpO2JvcmRlci1ib3R0b206dmFyKC0tYnMtY2FyZC1ib3JkZXItd2lkdGgpIHNvbGlkIHZhcigtLWJzLWNhcmQtYm9yZGVyLWNvbG9yKX0uY2FyZC1oZWFkZXI6Zmlyc3QtY2hpbGR7Ym9yZGVyLXJhZGl1czp2YXIoLS1icy1jYXJkLWlubmVyLWJvcmRlci1yYWRpdXMpIHZhcigtLWJzLWNhcmQtaW5uZXItYm9yZGVyLXJhZGl1cykgMCAwfS5jYXJkLWZvb3RlcntwYWRkaW5nOnZhcigtLWJzLWNhcmQtY2FwLXBhZGRpbmcteSkgdmFyKC0tYnMtY2FyZC1jYXAtcGFkZGluZy14KTtjb2xvcjp2YXIoLS1icy1jYXJkLWNhcC1jb2xvcik7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1icy1jYXJkLWNhcC1iZyk7Ym9yZGVyLXRvcDp2YXIoLS1icy1jYXJkLWJvcmRlci13aWR0aCkgc29saWQgdmFyKC0tYnMtY2FyZC1ib3JkZXItY29sb3IpfS5jYXJkLWZvb3RlcjpsYXN0LWNoaWxke2JvcmRlci1yYWRpdXM6MCAwIHZhcigtLWJzLWNhcmQtaW5uZXItYm9yZGVyLXJhZGl1cykgdmFyKC0tYnMtY2FyZC1pbm5lci1ib3JkZXItcmFkaXVzKX0uY2FyZC1oZWFkZXItdGFic3ttYXJnaW4tcmlnaHQ6Y2FsYygtLjUgKiB2YXIoLS1icy1jYXJkLWNhcC1wYWRkaW5nLXgpKTttYXJnaW4tYm90dG9tOmNhbGMoLTEgKiB2YXIoLS1icy1jYXJkLWNhcC1wYWRkaW5nLXkpKTttYXJnaW4tbGVmdDpjYWxjKC0uNSAqIHZhcigtLWJzLWNhcmQtY2FwLXBhZGRpbmcteCkpO2JvcmRlci1ib3R0b206MH0uY2FyZC1oZWFkZXItdGFicyAubmF2LWxpbmsuYWN0aXZle2JhY2tncm91bmQtY29sb3I6dmFyKC0tYnMtY2FyZC1iZyk7Ym9yZGVyLWJvdHRvbS1jb2xvcjp2YXIoLS1icy1jYXJkLWJnKX0uY2FyZC1oZWFkZXItcGlsbHN7bWFyZ2luLXJpZ2h0OmNhbGMoLS41ICogdmFyKC0tYnMtY2FyZC1jYXAtcGFkZGluZy14KSk7bWFyZ2luLWxlZnQ6Y2FsYygtLjUgKiB2YXIoLS1icy1jYXJkLWNhcC1wYWRkaW5nLXgpKX0uY2FyZC1pbWctb3ZlcmxheXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtyaWdodDowO2JvdHRvbTowO2xlZnQ6MDtwYWRkaW5nOnZhcigtLWJzLWNhcmQtaW1nLW92ZXJsYXktcGFkZGluZyk7Ym9yZGVyLXJhZGl1czp2YXIoLS1icy1jYXJkLWlubmVyLWJvcmRlci1yYWRpdXMpfS5jYXJkLWltZywuY2FyZC1pbWctdG9wLC5jYXJkLWltZy1ib3R0b217d2lkdGg6MTAwJX0uY2FyZC1pbWcsLmNhcmQtaW1nLXRvcHtib3JkZXItdG9wLWxlZnQtcmFkaXVzOnZhcigtLWJzLWNhcmQtaW5uZXItYm9yZGVyLXJhZGl1cyk7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6dmFyKC0tYnMtY2FyZC1pbm5lci1ib3JkZXItcmFkaXVzKX0uY2FyZC1pbWcsLmNhcmQtaW1nLWJvdHRvbXtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czp2YXIoLS1icy1jYXJkLWlubmVyLWJvcmRlci1yYWRpdXMpO2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6dmFyKC0tYnMtY2FyZC1pbm5lci1ib3JkZXItcmFkaXVzKX0uY2FyZC1ncm91cD4uY2FyZHttYXJnaW4tYm90dG9tOnZhcigtLWJzLWNhcmQtZ3JvdXAtbWFyZ2luKX1AbWVkaWEgKG1pbi13aWR0aDogNTc2cHgpey5jYXJkLWdyb3Vwe2Rpc3BsYXk6ZmxleDtmbGV4LWZsb3c6cm93IHdyYXB9LmNhcmQtZ3JvdXA+LmNhcmR7ZmxleDoxIDAgMCU7bWFyZ2luLWJvdHRvbTowfS5jYXJkLWdyb3VwPi5jYXJkKy5jYXJke21hcmdpbi1sZWZ0OjA7Ym9yZGVyLWxlZnQ6MH0uY2FyZC1ncm91cD4uY2FyZDpub3QoOmxhc3QtY2hpbGQpe2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOjA7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6MH0uY2FyZC1ncm91cD4uY2FyZDpub3QoOmxhc3QtY2hpbGQpIC5jYXJkLWltZy10b3AsLmNhcmQtZ3JvdXA+LmNhcmQ6bm90KDpsYXN0LWNoaWxkKSAuY2FyZC1oZWFkZXJ7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6MH0uY2FyZC1ncm91cD4uY2FyZDpub3QoOmxhc3QtY2hpbGQpIC5jYXJkLWltZy1ib3R0b20sLmNhcmQtZ3JvdXA+LmNhcmQ6bm90KDpsYXN0LWNoaWxkKSAuY2FyZC1mb290ZXJ7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6MH0uY2FyZC1ncm91cD4uY2FyZDpub3QoOmZpcnN0LWNoaWxkKXtib3JkZXItdG9wLWxlZnQtcmFkaXVzOjA7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czowfS5jYXJkLWdyb3VwPi5jYXJkOm5vdCg6Zmlyc3QtY2hpbGQpIC5jYXJkLWltZy10b3AsLmNhcmQtZ3JvdXA+LmNhcmQ6bm90KDpmaXJzdC1jaGlsZCkgLmNhcmQtaGVhZGVye2JvcmRlci10b3AtbGVmdC1yYWRpdXM6MH0uY2FyZC1ncm91cD4uY2FyZDpub3QoOmZpcnN0LWNoaWxkKSAuY2FyZC1pbWctYm90dG9tLC5jYXJkLWdyb3VwPi5jYXJkOm5vdCg6Zmlyc3QtY2hpbGQpIC5jYXJkLWZvb3Rlcntib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjB9fS5hY2NvcmRpb257LS1icy1hY2NvcmRpb24tY29sb3I6IHZhcigtLWJzLWJvZHktY29sb3IpOy0tYnMtYWNjb3JkaW9uLWJnOiB2YXIoLS1icy1ib2R5LWJnKTstLWJzLWFjY29yZGlvbi10cmFuc2l0aW9uOiBjb2xvciAwLjE1cyBlYXNlLWluLW91dCxiYWNrZ3JvdW5kLWNvbG9yIDAuMTVzIGVhc2UtaW4tb3V0LGJvcmRlci1jb2xvciAwLjE1cyBlYXNlLWluLW91dCxib3gtc2hhZG93IDAuMTVzIGVhc2UtaW4tb3V0LGJvcmRlci1yYWRpdXMgMC4xNXMgZWFzZTstLWJzLWFjY29yZGlvbi1ib3JkZXItY29sb3I6IHZhcigtLWJzLWJvcmRlci1jb2xvcik7LS1icy1hY2NvcmRpb24tYm9yZGVyLXdpZHRoOiB2YXIoLS1icy1ib3JkZXItd2lkdGgpOy0tYnMtYWNjb3JkaW9uLWJvcmRlci1yYWRpdXM6IHZhcigtLWJzLWJvcmRlci1yYWRpdXMpOy0tYnMtYWNjb3JkaW9uLWlubmVyLWJvcmRlci1yYWRpdXM6IGNhbGModmFyKC0tYnMtYm9yZGVyLXJhZGl1cykgLSAodmFyKC0tYnMtYm9yZGVyLXdpZHRoKSkpOy0tYnMtYWNjb3JkaW9uLWJ0bi1wYWRkaW5nLXg6IDEuMjVyZW07LS1icy1hY2NvcmRpb24tYnRuLXBhZGRpbmcteTogMXJlbTstLWJzLWFjY29yZGlvbi1idG4tY29sb3I6IHZhcigtLWJzLWJvZHktY29sb3IpOy0tYnMtYWNjb3JkaW9uLWJ0bi1iZzogdmFyKC0tYnMtYWNjb3JkaW9uLWJnKTstLWJzLWFjY29yZGlvbi1idG4taWNvbjogdXJsKCR7X19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMTNfX199KTstLWJzLWFjY29yZGlvbi1idG4taWNvbi13aWR0aDogMS4yNXJlbTstLWJzLWFjY29yZGlvbi1idG4taWNvbi10cmFuc2Zvcm06IHJvdGF0ZSgtMTgwZGVnKTstLWJzLWFjY29yZGlvbi1idG4taWNvbi10cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4ycyBlYXNlLWluLW91dDstLWJzLWFjY29yZGlvbi1idG4tYWN0aXZlLWljb246IHVybCgke19fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzE0X19ffSk7LS1icy1hY2NvcmRpb24tYnRuLWZvY3VzLWJvcmRlci1jb2xvcjogIzg2YjdmZTstLWJzLWFjY29yZGlvbi1idG4tZm9jdXMtYm94LXNoYWRvdzogMCAwIDAgLjI1cmVtIHJnYmEoMTMsMTEwLDI1MywwLjI1KTstLWJzLWFjY29yZGlvbi1ib2R5LXBhZGRpbmcteDogMS4yNXJlbTstLWJzLWFjY29yZGlvbi1ib2R5LXBhZGRpbmcteTogMXJlbTstLWJzLWFjY29yZGlvbi1hY3RpdmUtY29sb3I6IHZhcigtLWJzLXByaW1hcnktdGV4dC1lbXBoYXNpcyk7LS1icy1hY2NvcmRpb24tYWN0aXZlLWJnOiB2YXIoLS1icy1wcmltYXJ5LWJnLXN1YnRsZSl9LmFjY29yZGlvbi1idXR0b257cG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjt3aWR0aDoxMDAlO3BhZGRpbmc6dmFyKC0tYnMtYWNjb3JkaW9uLWJ0bi1wYWRkaW5nLXkpIHZhcigtLWJzLWFjY29yZGlvbi1idG4tcGFkZGluZy14KTtmb250LXNpemU6MXJlbTtjb2xvcjp2YXIoLS1icy1hY2NvcmRpb24tYnRuLWNvbG9yKTt0ZXh0LWFsaWduOmxlZnQ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1icy1hY2NvcmRpb24tYnRuLWJnKTtib3JkZXI6MDtib3JkZXItcmFkaXVzOjA7b3ZlcmZsb3ctYW5jaG9yOm5vbmU7dHJhbnNpdGlvbjp2YXIoLS1icy1hY2NvcmRpb24tdHJhbnNpdGlvbil9QG1lZGlhIChwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2Upey5hY2NvcmRpb24tYnV0dG9ue3RyYW5zaXRpb246bm9uZX19LmFjY29yZGlvbi1idXR0b246bm90KC5jb2xsYXBzZWQpe2NvbG9yOnZhcigtLWJzLWFjY29yZGlvbi1hY3RpdmUtY29sb3IpO2JhY2tncm91bmQtY29sb3I6dmFyKC0tYnMtYWNjb3JkaW9uLWFjdGl2ZS1iZyk7Ym94LXNoYWRvdzppbnNldCAwIGNhbGMoLTEgKiB2YXIoLS1icy1hY2NvcmRpb24tYm9yZGVyLXdpZHRoKSkgMCB2YXIoLS1icy1hY2NvcmRpb24tYm9yZGVyLWNvbG9yKX0uYWNjb3JkaW9uLWJ1dHRvbjpub3QoLmNvbGxhcHNlZCk6OmFmdGVye2JhY2tncm91bmQtaW1hZ2U6dmFyKC0tYnMtYWNjb3JkaW9uLWJ0bi1hY3RpdmUtaWNvbik7dHJhbnNmb3JtOnZhcigtLWJzLWFjY29yZGlvbi1idG4taWNvbi10cmFuc2Zvcm0pfS5hY2NvcmRpb24tYnV0dG9uOjphZnRlcntmbGV4LXNocmluazowO3dpZHRoOnZhcigtLWJzLWFjY29yZGlvbi1idG4taWNvbi13aWR0aCk7aGVpZ2h0OnZhcigtLWJzLWFjY29yZGlvbi1idG4taWNvbi13aWR0aCk7bWFyZ2luLWxlZnQ6YXV0bztjb250ZW50OlwiXCI7YmFja2dyb3VuZC1pbWFnZTp2YXIoLS1icy1hY2NvcmRpb24tYnRuLWljb24pO2JhY2tncm91bmQtcmVwZWF0Om5vLXJlcGVhdDtiYWNrZ3JvdW5kLXNpemU6dmFyKC0tYnMtYWNjb3JkaW9uLWJ0bi1pY29uLXdpZHRoKTt0cmFuc2l0aW9uOnZhcigtLWJzLWFjY29yZGlvbi1idG4taWNvbi10cmFuc2l0aW9uKX1AbWVkaWEgKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZSl7LmFjY29yZGlvbi1idXR0b246OmFmdGVye3RyYW5zaXRpb246bm9uZX19LmFjY29yZGlvbi1idXR0b246aG92ZXJ7ei1pbmRleDoyfS5hY2NvcmRpb24tYnV0dG9uOmZvY3Vze3otaW5kZXg6Mztib3JkZXItY29sb3I6dmFyKC0tYnMtYWNjb3JkaW9uLWJ0bi1mb2N1cy1ib3JkZXItY29sb3IpO291dGxpbmU6MDtib3gtc2hhZG93OnZhcigtLWJzLWFjY29yZGlvbi1idG4tZm9jdXMtYm94LXNoYWRvdyl9LmFjY29yZGlvbi1oZWFkZXJ7bWFyZ2luLWJvdHRvbTowfS5hY2NvcmRpb24taXRlbXtjb2xvcjp2YXIoLS1icy1hY2NvcmRpb24tY29sb3IpO2JhY2tncm91bmQtY29sb3I6dmFyKC0tYnMtYWNjb3JkaW9uLWJnKTtib3JkZXI6dmFyKC0tYnMtYWNjb3JkaW9uLWJvcmRlci13aWR0aCkgc29saWQgdmFyKC0tYnMtYWNjb3JkaW9uLWJvcmRlci1jb2xvcil9LmFjY29yZGlvbi1pdGVtOmZpcnN0LW9mLXR5cGV7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czp2YXIoLS1icy1hY2NvcmRpb24tYm9yZGVyLXJhZGl1cyk7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6dmFyKC0tYnMtYWNjb3JkaW9uLWJvcmRlci1yYWRpdXMpfS5hY2NvcmRpb24taXRlbTpmaXJzdC1vZi10eXBlIC5hY2NvcmRpb24tYnV0dG9ue2JvcmRlci10b3AtbGVmdC1yYWRpdXM6dmFyKC0tYnMtYWNjb3JkaW9uLWlubmVyLWJvcmRlci1yYWRpdXMpO2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOnZhcigtLWJzLWFjY29yZGlvbi1pbm5lci1ib3JkZXItcmFkaXVzKX0uYWNjb3JkaW9uLWl0ZW06bm90KDpmaXJzdC1vZi10eXBlKXtib3JkZXItdG9wOjB9LmFjY29yZGlvbi1pdGVtOmxhc3Qtb2YtdHlwZXtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czp2YXIoLS1icy1hY2NvcmRpb24tYm9yZGVyLXJhZGl1cyk7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czp2YXIoLS1icy1hY2NvcmRpb24tYm9yZGVyLXJhZGl1cyl9LmFjY29yZGlvbi1pdGVtOmxhc3Qtb2YtdHlwZSAuYWNjb3JkaW9uLWJ1dHRvbi5jb2xsYXBzZWR7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6dmFyKC0tYnMtYWNjb3JkaW9uLWlubmVyLWJvcmRlci1yYWRpdXMpO2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6dmFyKC0tYnMtYWNjb3JkaW9uLWlubmVyLWJvcmRlci1yYWRpdXMpfS5hY2NvcmRpb24taXRlbTpsYXN0LW9mLXR5cGUgLmFjY29yZGlvbi1jb2xsYXBzZXtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czp2YXIoLS1icy1hY2NvcmRpb24tYm9yZGVyLXJhZGl1cyk7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czp2YXIoLS1icy1hY2NvcmRpb24tYm9yZGVyLXJhZGl1cyl9LmFjY29yZGlvbi1ib2R5e3BhZGRpbmc6dmFyKC0tYnMtYWNjb3JkaW9uLWJvZHktcGFkZGluZy15KSB2YXIoLS1icy1hY2NvcmRpb24tYm9keS1wYWRkaW5nLXgpfS5hY2NvcmRpb24tZmx1c2ggLmFjY29yZGlvbi1jb2xsYXBzZXtib3JkZXItd2lkdGg6MH0uYWNjb3JkaW9uLWZsdXNoIC5hY2NvcmRpb24taXRlbXtib3JkZXItcmlnaHQ6MDtib3JkZXItbGVmdDowO2JvcmRlci1yYWRpdXM6MH0uYWNjb3JkaW9uLWZsdXNoIC5hY2NvcmRpb24taXRlbTpmaXJzdC1jaGlsZHtib3JkZXItdG9wOjB9LmFjY29yZGlvbi1mbHVzaCAuYWNjb3JkaW9uLWl0ZW06bGFzdC1jaGlsZHtib3JkZXItYm90dG9tOjB9LmFjY29yZGlvbi1mbHVzaCAuYWNjb3JkaW9uLWl0ZW0gLmFjY29yZGlvbi1idXR0b24sLmFjY29yZGlvbi1mbHVzaCAuYWNjb3JkaW9uLWl0ZW0gLmFjY29yZGlvbi1idXR0b24uY29sbGFwc2Vke2JvcmRlci1yYWRpdXM6MH1bZGF0YS1icy10aGVtZT1cImRhcmtcIl0gLmFjY29yZGlvbi1idXR0b246OmFmdGVyey0tYnMtYWNjb3JkaW9uLWJ0bi1pY29uOiB1cmwoJHtfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8xNV9fX30pOy0tYnMtYWNjb3JkaW9uLWJ0bi1hY3RpdmUtaWNvbjogdXJsKCR7X19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMTVfX199KX0uYnJlYWRjcnVtYnstLWJzLWJyZWFkY3J1bWItcGFkZGluZy14OiAwOy0tYnMtYnJlYWRjcnVtYi1wYWRkaW5nLXk6IDA7LS1icy1icmVhZGNydW1iLW1hcmdpbi1ib3R0b206IDFyZW07LS1icy1icmVhZGNydW1iLWJnOiA7LS1icy1icmVhZGNydW1iLWJvcmRlci1yYWRpdXM6IDstLWJzLWJyZWFkY3J1bWItZGl2aWRlci1jb2xvcjogdmFyKC0tYnMtc2Vjb25kYXJ5LWNvbG9yKTstLWJzLWJyZWFkY3J1bWItaXRlbS1wYWRkaW5nLXg6IC41cmVtOy0tYnMtYnJlYWRjcnVtYi1pdGVtLWFjdGl2ZS1jb2xvcjogdmFyKC0tYnMtc2Vjb25kYXJ5LWNvbG9yKTtkaXNwbGF5OmZsZXg7ZmxleC13cmFwOndyYXA7cGFkZGluZzp2YXIoLS1icy1icmVhZGNydW1iLXBhZGRpbmcteSkgdmFyKC0tYnMtYnJlYWRjcnVtYi1wYWRkaW5nLXgpO21hcmdpbi1ib3R0b206dmFyKC0tYnMtYnJlYWRjcnVtYi1tYXJnaW4tYm90dG9tKTtmb250LXNpemU6dmFyKC0tYnMtYnJlYWRjcnVtYi1mb250LXNpemUpO2xpc3Qtc3R5bGU6bm9uZTtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWJzLWJyZWFkY3J1bWItYmcpO2JvcmRlci1yYWRpdXM6dmFyKC0tYnMtYnJlYWRjcnVtYi1ib3JkZXItcmFkaXVzKX0uYnJlYWRjcnVtYi1pdGVtKy5icmVhZGNydW1iLWl0ZW17cGFkZGluZy1sZWZ0OnZhcigtLWJzLWJyZWFkY3J1bWItaXRlbS1wYWRkaW5nLXgpfS5icmVhZGNydW1iLWl0ZW0rLmJyZWFkY3J1bWItaXRlbTo6YmVmb3Jle2Zsb2F0OmxlZnQ7cGFkZGluZy1yaWdodDp2YXIoLS1icy1icmVhZGNydW1iLWl0ZW0tcGFkZGluZy14KTtjb2xvcjp2YXIoLS1icy1icmVhZGNydW1iLWRpdmlkZXItY29sb3IpO2NvbnRlbnQ6dmFyKC0tYnMtYnJlYWRjcnVtYi1kaXZpZGVyLCBcIi9cIikgLyogcnRsOiB2YXIoLS1icy1icmVhZGNydW1iLWRpdmlkZXIsIFwiL1wiKSAqL30uYnJlYWRjcnVtYi1pdGVtLmFjdGl2ZXtjb2xvcjp2YXIoLS1icy1icmVhZGNydW1iLWl0ZW0tYWN0aXZlLWNvbG9yKX0ucGFnaW5hdGlvbnstLWJzLXBhZ2luYXRpb24tcGFkZGluZy14OiAuNzVyZW07LS1icy1wYWdpbmF0aW9uLXBhZGRpbmcteTogLjM3NXJlbTstLWJzLXBhZ2luYXRpb24tZm9udC1zaXplOjFyZW07LS1icy1wYWdpbmF0aW9uLWNvbG9yOiB2YXIoLS1icy1saW5rLWNvbG9yKTstLWJzLXBhZ2luYXRpb24tYmc6IHZhcigtLWJzLWJvZHktYmcpOy0tYnMtcGFnaW5hdGlvbi1ib3JkZXItd2lkdGg6IHZhcigtLWJzLWJvcmRlci13aWR0aCk7LS1icy1wYWdpbmF0aW9uLWJvcmRlci1jb2xvcjogdmFyKC0tYnMtYm9yZGVyLWNvbG9yKTstLWJzLXBhZ2luYXRpb24tYm9yZGVyLXJhZGl1czogdmFyKC0tYnMtYm9yZGVyLXJhZGl1cyk7LS1icy1wYWdpbmF0aW9uLWhvdmVyLWNvbG9yOiB2YXIoLS1icy1saW5rLWhvdmVyLWNvbG9yKTstLWJzLXBhZ2luYXRpb24taG92ZXItYmc6IHZhcigtLWJzLXRlcnRpYXJ5LWJnKTstLWJzLXBhZ2luYXRpb24taG92ZXItYm9yZGVyLWNvbG9yOiB2YXIoLS1icy1ib3JkZXItY29sb3IpOy0tYnMtcGFnaW5hdGlvbi1mb2N1cy1jb2xvcjogdmFyKC0tYnMtbGluay1ob3Zlci1jb2xvcik7LS1icy1wYWdpbmF0aW9uLWZvY3VzLWJnOiB2YXIoLS1icy1zZWNvbmRhcnktYmcpOy0tYnMtcGFnaW5hdGlvbi1mb2N1cy1ib3gtc2hhZG93OiAwIDAgMCAuMjVyZW0gcmdiYSgxMywxMTAsMjUzLDAuMjUpOy0tYnMtcGFnaW5hdGlvbi1hY3RpdmUtY29sb3I6ICNmZmY7LS1icy1wYWdpbmF0aW9uLWFjdGl2ZS1iZzogIzBkNmVmZDstLWJzLXBhZ2luYXRpb24tYWN0aXZlLWJvcmRlci1jb2xvcjogIzBkNmVmZDstLWJzLXBhZ2luYXRpb24tZGlzYWJsZWQtY29sb3I6IHZhcigtLWJzLXNlY29uZGFyeS1jb2xvcik7LS1icy1wYWdpbmF0aW9uLWRpc2FibGVkLWJnOiB2YXIoLS1icy1zZWNvbmRhcnktYmcpOy0tYnMtcGFnaW5hdGlvbi1kaXNhYmxlZC1ib3JkZXItY29sb3I6IHZhcigtLWJzLWJvcmRlci1jb2xvcik7ZGlzcGxheTpmbGV4O3BhZGRpbmctbGVmdDowO2xpc3Qtc3R5bGU6bm9uZX0ucGFnZS1saW5re3Bvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6YmxvY2s7cGFkZGluZzp2YXIoLS1icy1wYWdpbmF0aW9uLXBhZGRpbmcteSkgdmFyKC0tYnMtcGFnaW5hdGlvbi1wYWRkaW5nLXgpO2ZvbnQtc2l6ZTp2YXIoLS1icy1wYWdpbmF0aW9uLWZvbnQtc2l6ZSk7Y29sb3I6dmFyKC0tYnMtcGFnaW5hdGlvbi1jb2xvcik7dGV4dC1kZWNvcmF0aW9uOm5vbmU7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1icy1wYWdpbmF0aW9uLWJnKTtib3JkZXI6dmFyKC0tYnMtcGFnaW5hdGlvbi1ib3JkZXItd2lkdGgpIHNvbGlkIHZhcigtLWJzLXBhZ2luYXRpb24tYm9yZGVyLWNvbG9yKTt0cmFuc2l0aW9uOmNvbG9yIDAuMTVzIGVhc2UtaW4tb3V0LGJhY2tncm91bmQtY29sb3IgMC4xNXMgZWFzZS1pbi1vdXQsYm9yZGVyLWNvbG9yIDAuMTVzIGVhc2UtaW4tb3V0LGJveC1zaGFkb3cgMC4xNXMgZWFzZS1pbi1vdXR9QG1lZGlhIChwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2Upey5wYWdlLWxpbmt7dHJhbnNpdGlvbjpub25lfX0ucGFnZS1saW5rOmhvdmVye3otaW5kZXg6Mjtjb2xvcjp2YXIoLS1icy1wYWdpbmF0aW9uLWhvdmVyLWNvbG9yKTtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWJzLXBhZ2luYXRpb24taG92ZXItYmcpO2JvcmRlci1jb2xvcjp2YXIoLS1icy1wYWdpbmF0aW9uLWhvdmVyLWJvcmRlci1jb2xvcil9LnBhZ2UtbGluazpmb2N1c3t6LWluZGV4OjM7Y29sb3I6dmFyKC0tYnMtcGFnaW5hdGlvbi1mb2N1cy1jb2xvcik7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1icy1wYWdpbmF0aW9uLWZvY3VzLWJnKTtvdXRsaW5lOjA7Ym94LXNoYWRvdzp2YXIoLS1icy1wYWdpbmF0aW9uLWZvY3VzLWJveC1zaGFkb3cpfS5wYWdlLWxpbmsuYWN0aXZlLC5hY3RpdmU+LnBhZ2UtbGlua3t6LWluZGV4OjM7Y29sb3I6dmFyKC0tYnMtcGFnaW5hdGlvbi1hY3RpdmUtY29sb3IpO2JhY2tncm91bmQtY29sb3I6dmFyKC0tYnMtcGFnaW5hdGlvbi1hY3RpdmUtYmcpO2JvcmRlci1jb2xvcjp2YXIoLS1icy1wYWdpbmF0aW9uLWFjdGl2ZS1ib3JkZXItY29sb3IpfS5wYWdlLWxpbmsuZGlzYWJsZWQsLmRpc2FibGVkPi5wYWdlLWxpbmt7Y29sb3I6dmFyKC0tYnMtcGFnaW5hdGlvbi1kaXNhYmxlZC1jb2xvcik7cG9pbnRlci1ldmVudHM6bm9uZTtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWJzLXBhZ2luYXRpb24tZGlzYWJsZWQtYmcpO2JvcmRlci1jb2xvcjp2YXIoLS1icy1wYWdpbmF0aW9uLWRpc2FibGVkLWJvcmRlci1jb2xvcil9LnBhZ2UtaXRlbTpub3QoOmZpcnN0LWNoaWxkKSAucGFnZS1saW5re21hcmdpbi1sZWZ0OmNhbGModmFyKC0tYnMtYm9yZGVyLXdpZHRoKSAqIC0xKX0ucGFnZS1pdGVtOmZpcnN0LWNoaWxkIC5wYWdlLWxpbmt7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czp2YXIoLS1icy1wYWdpbmF0aW9uLWJvcmRlci1yYWRpdXMpO2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6dmFyKC0tYnMtcGFnaW5hdGlvbi1ib3JkZXItcmFkaXVzKX0ucGFnZS1pdGVtOmxhc3QtY2hpbGQgLnBhZ2UtbGlua3tib3JkZXItdG9wLXJpZ2h0LXJhZGl1czp2YXIoLS1icy1wYWdpbmF0aW9uLWJvcmRlci1yYWRpdXMpO2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOnZhcigtLWJzLXBhZ2luYXRpb24tYm9yZGVyLXJhZGl1cyl9LnBhZ2luYXRpb24tbGd7LS1icy1wYWdpbmF0aW9uLXBhZGRpbmcteDogMS41cmVtOy0tYnMtcGFnaW5hdGlvbi1wYWRkaW5nLXk6IC43NXJlbTstLWJzLXBhZ2luYXRpb24tZm9udC1zaXplOjEuMjVyZW07LS1icy1wYWdpbmF0aW9uLWJvcmRlci1yYWRpdXM6IHZhcigtLWJzLWJvcmRlci1yYWRpdXMtbGcpfS5wYWdpbmF0aW9uLXNtey0tYnMtcGFnaW5hdGlvbi1wYWRkaW5nLXg6IC41cmVtOy0tYnMtcGFnaW5hdGlvbi1wYWRkaW5nLXk6IC4yNXJlbTstLWJzLXBhZ2luYXRpb24tZm9udC1zaXplOi44NzVyZW07LS1icy1wYWdpbmF0aW9uLWJvcmRlci1yYWRpdXM6IHZhcigtLWJzLWJvcmRlci1yYWRpdXMtc20pfS5iYWRnZXstLWJzLWJhZGdlLXBhZGRpbmcteDogLjY1ZW07LS1icy1iYWRnZS1wYWRkaW5nLXk6IC4zNWVtOy0tYnMtYmFkZ2UtZm9udC1zaXplOi43NWVtOy0tYnMtYmFkZ2UtZm9udC13ZWlnaHQ6IDcwMDstLWJzLWJhZGdlLWNvbG9yOiAjZmZmOy0tYnMtYmFkZ2UtYm9yZGVyLXJhZGl1czogdmFyKC0tYnMtYm9yZGVyLXJhZGl1cyk7ZGlzcGxheTppbmxpbmUtYmxvY2s7cGFkZGluZzp2YXIoLS1icy1iYWRnZS1wYWRkaW5nLXkpIHZhcigtLWJzLWJhZGdlLXBhZGRpbmcteCk7Zm9udC1zaXplOnZhcigtLWJzLWJhZGdlLWZvbnQtc2l6ZSk7Zm9udC13ZWlnaHQ6dmFyKC0tYnMtYmFkZ2UtZm9udC13ZWlnaHQpO2xpbmUtaGVpZ2h0OjE7Y29sb3I6dmFyKC0tYnMtYmFkZ2UtY29sb3IpO3RleHQtYWxpZ246Y2VudGVyO3doaXRlLXNwYWNlOm5vd3JhcDt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZTtib3JkZXItcmFkaXVzOnZhcigtLWJzLWJhZGdlLWJvcmRlci1yYWRpdXMpfS5iYWRnZTplbXB0eXtkaXNwbGF5Om5vbmV9LmJ0biAuYmFkZ2V7cG9zaXRpb246cmVsYXRpdmU7dG9wOi0xcHh9LmFsZXJ0ey0tYnMtYWxlcnQtYmc6IHRyYW5zcGFyZW50Oy0tYnMtYWxlcnQtcGFkZGluZy14OiAxcmVtOy0tYnMtYWxlcnQtcGFkZGluZy15OiAxcmVtOy0tYnMtYWxlcnQtbWFyZ2luLWJvdHRvbTogMXJlbTstLWJzLWFsZXJ0LWNvbG9yOiBpbmhlcml0Oy0tYnMtYWxlcnQtYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDstLWJzLWFsZXJ0LWJvcmRlcjogdmFyKC0tYnMtYm9yZGVyLXdpZHRoKSBzb2xpZCB2YXIoLS1icy1hbGVydC1ib3JkZXItY29sb3IpOy0tYnMtYWxlcnQtYm9yZGVyLXJhZGl1czogdmFyKC0tYnMtYm9yZGVyLXJhZGl1cyk7LS1icy1hbGVydC1saW5rLWNvbG9yOiBpbmhlcml0O3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6dmFyKC0tYnMtYWxlcnQtcGFkZGluZy15KSB2YXIoLS1icy1hbGVydC1wYWRkaW5nLXgpO21hcmdpbi1ib3R0b206dmFyKC0tYnMtYWxlcnQtbWFyZ2luLWJvdHRvbSk7Y29sb3I6dmFyKC0tYnMtYWxlcnQtY29sb3IpO2JhY2tncm91bmQtY29sb3I6dmFyKC0tYnMtYWxlcnQtYmcpO2JvcmRlcjp2YXIoLS1icy1hbGVydC1ib3JkZXIpO2JvcmRlci1yYWRpdXM6dmFyKC0tYnMtYWxlcnQtYm9yZGVyLXJhZGl1cyl9LmFsZXJ0LWhlYWRpbmd7Y29sb3I6aW5oZXJpdH0uYWxlcnQtbGlua3tmb250LXdlaWdodDo3MDA7Y29sb3I6dmFyKC0tYnMtYWxlcnQtbGluay1jb2xvcil9LmFsZXJ0LWRpc21pc3NpYmxle3BhZGRpbmctcmlnaHQ6M3JlbX0uYWxlcnQtZGlzbWlzc2libGUgLmJ0bi1jbG9zZXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtyaWdodDowO3otaW5kZXg6MjtwYWRkaW5nOjEuMjVyZW0gMXJlbX0uYWxlcnQtcHJpbWFyeXstLWJzLWFsZXJ0LWNvbG9yOiB2YXIoLS1icy1wcmltYXJ5LXRleHQtZW1waGFzaXMpOy0tYnMtYWxlcnQtYmc6IHZhcigtLWJzLXByaW1hcnktYmctc3VidGxlKTstLWJzLWFsZXJ0LWJvcmRlci1jb2xvcjogdmFyKC0tYnMtcHJpbWFyeS1ib3JkZXItc3VidGxlKTstLWJzLWFsZXJ0LWxpbmstY29sb3I6IHZhcigtLWJzLXByaW1hcnktdGV4dC1lbXBoYXNpcyl9QGtleWZyYW1lcyBwcm9ncmVzcy1iYXItc3RyaXBlc3swJXtiYWNrZ3JvdW5kLXBvc2l0aW9uLXg6MXJlbX19LnByb2dyZXNzLC5wcm9ncmVzcy1zdGFja2Vkey0tYnMtcHJvZ3Jlc3MtaGVpZ2h0OiAxcmVtOy0tYnMtcHJvZ3Jlc3MtZm9udC1zaXplOi43NXJlbTstLWJzLXByb2dyZXNzLWJnOiB2YXIoLS1icy1zZWNvbmRhcnktYmcpOy0tYnMtcHJvZ3Jlc3MtYm9yZGVyLXJhZGl1czogdmFyKC0tYnMtYm9yZGVyLXJhZGl1cyk7LS1icy1wcm9ncmVzcy1ib3gtc2hhZG93OiB2YXIoLS1icy1ib3gtc2hhZG93LWluc2V0KTstLWJzLXByb2dyZXNzLWJhci1jb2xvcjogI2ZmZjstLWJzLXByb2dyZXNzLWJhci1iZzogIzBkNmVmZDstLWJzLXByb2dyZXNzLWJhci10cmFuc2l0aW9uOiB3aWR0aCAwLjZzIGVhc2U7ZGlzcGxheTpmbGV4O2hlaWdodDp2YXIoLS1icy1wcm9ncmVzcy1oZWlnaHQpO292ZXJmbG93OmhpZGRlbjtmb250LXNpemU6dmFyKC0tYnMtcHJvZ3Jlc3MtZm9udC1zaXplKTtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWJzLXByb2dyZXNzLWJnKTtib3JkZXItcmFkaXVzOnZhcigtLWJzLXByb2dyZXNzLWJvcmRlci1yYWRpdXMpfS5wcm9ncmVzcy1iYXJ7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO292ZXJmbG93OmhpZGRlbjtjb2xvcjp2YXIoLS1icy1wcm9ncmVzcy1iYXItY29sb3IpO3RleHQtYWxpZ246Y2VudGVyO3doaXRlLXNwYWNlOm5vd3JhcDtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWJzLXByb2dyZXNzLWJhci1iZyk7dHJhbnNpdGlvbjp2YXIoLS1icy1wcm9ncmVzcy1iYXItdHJhbnNpdGlvbil9QG1lZGlhIChwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2Upey5wcm9ncmVzcy1iYXJ7dHJhbnNpdGlvbjpub25lfX0ucHJvZ3Jlc3MtYmFyLXN0cmlwZWR7YmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQoNDVkZWcsIHJnYmEoMjU1LDI1NSwyNTUsMC4xNSkgMjUlLCB0cmFuc3BhcmVudCAyNSUsIHRyYW5zcGFyZW50IDUwJSwgcmdiYSgyNTUsMjU1LDI1NSwwLjE1KSA1MCUsIHJnYmEoMjU1LDI1NSwyNTUsMC4xNSkgNzUlLCB0cmFuc3BhcmVudCA3NSUsIHRyYW5zcGFyZW50KTtiYWNrZ3JvdW5kLXNpemU6dmFyKC0tYnMtcHJvZ3Jlc3MtaGVpZ2h0KSB2YXIoLS1icy1wcm9ncmVzcy1oZWlnaHQpfS5wcm9ncmVzcy1zdGFja2VkPi5wcm9ncmVzc3tvdmVyZmxvdzp2aXNpYmxlfS5wcm9ncmVzcy1zdGFja2VkPi5wcm9ncmVzcz4ucHJvZ3Jlc3MtYmFye3dpZHRoOjEwMCV9LnByb2dyZXNzLWJhci1hbmltYXRlZHthbmltYXRpb246MXMgbGluZWFyIGluZmluaXRlIHByb2dyZXNzLWJhci1zdHJpcGVzfUBtZWRpYSAocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogcmVkdWNlKXsucHJvZ3Jlc3MtYmFyLWFuaW1hdGVke2FuaW1hdGlvbjpub25lfX0ubGlzdC1ncm91cHstLWJzLWxpc3QtZ3JvdXAtY29sb3I6IHZhcigtLWJzLWJvZHktY29sb3IpOy0tYnMtbGlzdC1ncm91cC1iZzogdmFyKC0tYnMtYm9keS1iZyk7LS1icy1saXN0LWdyb3VwLWJvcmRlci1jb2xvcjogdmFyKC0tYnMtYm9yZGVyLWNvbG9yKTstLWJzLWxpc3QtZ3JvdXAtYm9yZGVyLXdpZHRoOiB2YXIoLS1icy1ib3JkZXItd2lkdGgpOy0tYnMtbGlzdC1ncm91cC1ib3JkZXItcmFkaXVzOiB2YXIoLS1icy1ib3JkZXItcmFkaXVzKTstLWJzLWxpc3QtZ3JvdXAtaXRlbS1wYWRkaW5nLXg6IDFyZW07LS1icy1saXN0LWdyb3VwLWl0ZW0tcGFkZGluZy15OiAuNXJlbTstLWJzLWxpc3QtZ3JvdXAtYWN0aW9uLWNvbG9yOiB2YXIoLS1icy1zZWNvbmRhcnktY29sb3IpOy0tYnMtbGlzdC1ncm91cC1hY3Rpb24taG92ZXItY29sb3I6IHZhcigtLWJzLWVtcGhhc2lzLWNvbG9yKTstLWJzLWxpc3QtZ3JvdXAtYWN0aW9uLWhvdmVyLWJnOiB2YXIoLS1icy10ZXJ0aWFyeS1iZyk7LS1icy1saXN0LWdyb3VwLWFjdGlvbi1hY3RpdmUtY29sb3I6IHZhcigtLWJzLWJvZHktY29sb3IpOy0tYnMtbGlzdC1ncm91cC1hY3Rpb24tYWN0aXZlLWJnOiB2YXIoLS1icy1zZWNvbmRhcnktYmcpOy0tYnMtbGlzdC1ncm91cC1kaXNhYmxlZC1jb2xvcjogdmFyKC0tYnMtc2Vjb25kYXJ5LWNvbG9yKTstLWJzLWxpc3QtZ3JvdXAtZGlzYWJsZWQtYmc6IHZhcigtLWJzLWJvZHktYmcpOy0tYnMtbGlzdC1ncm91cC1hY3RpdmUtY29sb3I6ICNmZmY7LS1icy1saXN0LWdyb3VwLWFjdGl2ZS1iZzogIzBkNmVmZDstLWJzLWxpc3QtZ3JvdXAtYWN0aXZlLWJvcmRlci1jb2xvcjogIzBkNmVmZDtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO3BhZGRpbmctbGVmdDowO21hcmdpbi1ib3R0b206MDtib3JkZXItcmFkaXVzOnZhcigtLWJzLWxpc3QtZ3JvdXAtYm9yZGVyLXJhZGl1cyl9Lmxpc3QtZ3JvdXAtbnVtYmVyZWR7bGlzdC1zdHlsZS10eXBlOm5vbmU7Y291bnRlci1yZXNldDpzZWN0aW9ufS5saXN0LWdyb3VwLW51bWJlcmVkPi5saXN0LWdyb3VwLWl0ZW06OmJlZm9yZXtjb250ZW50OmNvdW50ZXJzKHNlY3Rpb24sIFwiLlwiKSBcIi4gXCI7Y291bnRlci1pbmNyZW1lbnQ6c2VjdGlvbn0ubGlzdC1ncm91cC1pdGVtLWFjdGlvbnt3aWR0aDoxMDAlO2NvbG9yOnZhcigtLWJzLWxpc3QtZ3JvdXAtYWN0aW9uLWNvbG9yKTt0ZXh0LWFsaWduOmluaGVyaXR9Lmxpc3QtZ3JvdXAtaXRlbS1hY3Rpb246aG92ZXIsLmxpc3QtZ3JvdXAtaXRlbS1hY3Rpb246Zm9jdXN7ei1pbmRleDoxO2NvbG9yOnZhcigtLWJzLWxpc3QtZ3JvdXAtYWN0aW9uLWhvdmVyLWNvbG9yKTt0ZXh0LWRlY29yYXRpb246bm9uZTtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWJzLWxpc3QtZ3JvdXAtYWN0aW9uLWhvdmVyLWJnKX0ubGlzdC1ncm91cC1pdGVtLWFjdGlvbjphY3RpdmV7Y29sb3I6dmFyKC0tYnMtbGlzdC1ncm91cC1hY3Rpb24tYWN0aXZlLWNvbG9yKTtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWJzLWxpc3QtZ3JvdXAtYWN0aW9uLWFjdGl2ZS1iZyl9Lmxpc3QtZ3JvdXAtaXRlbXtwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmJsb2NrO3BhZGRpbmc6dmFyKC0tYnMtbGlzdC1ncm91cC1pdGVtLXBhZGRpbmcteSkgdmFyKC0tYnMtbGlzdC1ncm91cC1pdGVtLXBhZGRpbmcteCk7Y29sb3I6dmFyKC0tYnMtbGlzdC1ncm91cC1jb2xvcik7dGV4dC1kZWNvcmF0aW9uOm5vbmU7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1icy1saXN0LWdyb3VwLWJnKTtib3JkZXI6dmFyKC0tYnMtbGlzdC1ncm91cC1ib3JkZXItd2lkdGgpIHNvbGlkIHZhcigtLWJzLWxpc3QtZ3JvdXAtYm9yZGVyLWNvbG9yKX0ubGlzdC1ncm91cC1pdGVtOmZpcnN0LWNoaWxke2JvcmRlci10b3AtbGVmdC1yYWRpdXM6aW5oZXJpdDtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czppbmhlcml0fS5saXN0LWdyb3VwLWl0ZW06bGFzdC1jaGlsZHtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czppbmhlcml0O2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6aW5oZXJpdH0ubGlzdC1ncm91cC1pdGVtLmRpc2FibGVkLC5saXN0LWdyb3VwLWl0ZW06ZGlzYWJsZWR7Y29sb3I6dmFyKC0tYnMtbGlzdC1ncm91cC1kaXNhYmxlZC1jb2xvcik7cG9pbnRlci1ldmVudHM6bm9uZTtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWJzLWxpc3QtZ3JvdXAtZGlzYWJsZWQtYmcpfS5saXN0LWdyb3VwLWl0ZW0uYWN0aXZle3otaW5kZXg6Mjtjb2xvcjp2YXIoLS1icy1saXN0LWdyb3VwLWFjdGl2ZS1jb2xvcik7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1icy1saXN0LWdyb3VwLWFjdGl2ZS1iZyk7Ym9yZGVyLWNvbG9yOnZhcigtLWJzLWxpc3QtZ3JvdXAtYWN0aXZlLWJvcmRlci1jb2xvcil9Lmxpc3QtZ3JvdXAtaXRlbSsubGlzdC1ncm91cC1pdGVte2JvcmRlci10b3Atd2lkdGg6MH0ubGlzdC1ncm91cC1pdGVtKy5saXN0LWdyb3VwLWl0ZW0uYWN0aXZle21hcmdpbi10b3A6Y2FsYygtMSAqIHZhcigtLWJzLWxpc3QtZ3JvdXAtYm9yZGVyLXdpZHRoKSk7Ym9yZGVyLXRvcC13aWR0aDp2YXIoLS1icy1saXN0LWdyb3VwLWJvcmRlci13aWR0aCl9Lmxpc3QtZ3JvdXAtaG9yaXpvbnRhbHtmbGV4LWRpcmVjdGlvbjpyb3d9Lmxpc3QtZ3JvdXAtaG9yaXpvbnRhbD4ubGlzdC1ncm91cC1pdGVtOmZpcnN0LWNoaWxkOm5vdCg6bGFzdC1jaGlsZCl7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czp2YXIoLS1icy1saXN0LWdyb3VwLWJvcmRlci1yYWRpdXMpO2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOjB9Lmxpc3QtZ3JvdXAtaG9yaXpvbnRhbD4ubGlzdC1ncm91cC1pdGVtOmxhc3QtY2hpbGQ6bm90KDpmaXJzdC1jaGlsZCl7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6dmFyKC0tYnMtbGlzdC1ncm91cC1ib3JkZXItcmFkaXVzKTtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjB9Lmxpc3QtZ3JvdXAtaG9yaXpvbnRhbD4ubGlzdC1ncm91cC1pdGVtLmFjdGl2ZXttYXJnaW4tdG9wOjB9Lmxpc3QtZ3JvdXAtaG9yaXpvbnRhbD4ubGlzdC1ncm91cC1pdGVtKy5saXN0LWdyb3VwLWl0ZW17Ym9yZGVyLXRvcC13aWR0aDp2YXIoLS1icy1saXN0LWdyb3VwLWJvcmRlci13aWR0aCk7Ym9yZGVyLWxlZnQtd2lkdGg6MH0ubGlzdC1ncm91cC1ob3Jpem9udGFsPi5saXN0LWdyb3VwLWl0ZW0rLmxpc3QtZ3JvdXAtaXRlbS5hY3RpdmV7bWFyZ2luLWxlZnQ6Y2FsYygtMSAqIHZhcigtLWJzLWxpc3QtZ3JvdXAtYm9yZGVyLXdpZHRoKSk7Ym9yZGVyLWxlZnQtd2lkdGg6dmFyKC0tYnMtbGlzdC1ncm91cC1ib3JkZXItd2lkdGgpfUBtZWRpYSAobWluLXdpZHRoOiA1NzZweCl7Lmxpc3QtZ3JvdXAtaG9yaXpvbnRhbC1zbXtmbGV4LWRpcmVjdGlvbjpyb3d9Lmxpc3QtZ3JvdXAtaG9yaXpvbnRhbC1zbT4ubGlzdC1ncm91cC1pdGVtOmZpcnN0LWNoaWxkOm5vdCg6bGFzdC1jaGlsZCl7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czp2YXIoLS1icy1saXN0LWdyb3VwLWJvcmRlci1yYWRpdXMpO2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOjB9Lmxpc3QtZ3JvdXAtaG9yaXpvbnRhbC1zbT4ubGlzdC1ncm91cC1pdGVtOmxhc3QtY2hpbGQ6bm90KDpmaXJzdC1jaGlsZCl7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6dmFyKC0tYnMtbGlzdC1ncm91cC1ib3JkZXItcmFkaXVzKTtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjB9Lmxpc3QtZ3JvdXAtaG9yaXpvbnRhbC1zbT4ubGlzdC1ncm91cC1pdGVtLmFjdGl2ZXttYXJnaW4tdG9wOjB9Lmxpc3QtZ3JvdXAtaG9yaXpvbnRhbC1zbT4ubGlzdC1ncm91cC1pdGVtKy5saXN0LWdyb3VwLWl0ZW17Ym9yZGVyLXRvcC13aWR0aDp2YXIoLS1icy1saXN0LWdyb3VwLWJvcmRlci13aWR0aCk7Ym9yZGVyLWxlZnQtd2lkdGg6MH0ubGlzdC1ncm91cC1ob3Jpem9udGFsLXNtPi5saXN0LWdyb3VwLWl0ZW0rLmxpc3QtZ3JvdXAtaXRlbS5hY3RpdmV7bWFyZ2luLWxlZnQ6Y2FsYygtMSAqIHZhcigtLWJzLWxpc3QtZ3JvdXAtYm9yZGVyLXdpZHRoKSk7Ym9yZGVyLWxlZnQtd2lkdGg6dmFyKC0tYnMtbGlzdC1ncm91cC1ib3JkZXItd2lkdGgpfX1AbWVkaWEgKG1pbi13aWR0aDogNzY4cHgpey5saXN0LWdyb3VwLWhvcml6b250YWwtbWR7ZmxleC1kaXJlY3Rpb246cm93fS5saXN0LWdyb3VwLWhvcml6b250YWwtbWQ+Lmxpc3QtZ3JvdXAtaXRlbTpmaXJzdC1jaGlsZDpub3QoOmxhc3QtY2hpbGQpe2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6dmFyKC0tYnMtbGlzdC1ncm91cC1ib3JkZXItcmFkaXVzKTtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czowfS5saXN0LWdyb3VwLWhvcml6b250YWwtbWQ+Lmxpc3QtZ3JvdXAtaXRlbTpsYXN0LWNoaWxkOm5vdCg6Zmlyc3QtY2hpbGQpe2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOnZhcigtLWJzLWxpc3QtZ3JvdXAtYm9yZGVyLXJhZGl1cyk7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czowfS5saXN0LWdyb3VwLWhvcml6b250YWwtbWQ+Lmxpc3QtZ3JvdXAtaXRlbS5hY3RpdmV7bWFyZ2luLXRvcDowfS5saXN0LWdyb3VwLWhvcml6b250YWwtbWQ+Lmxpc3QtZ3JvdXAtaXRlbSsubGlzdC1ncm91cC1pdGVte2JvcmRlci10b3Atd2lkdGg6dmFyKC0tYnMtbGlzdC1ncm91cC1ib3JkZXItd2lkdGgpO2JvcmRlci1sZWZ0LXdpZHRoOjB9Lmxpc3QtZ3JvdXAtaG9yaXpvbnRhbC1tZD4ubGlzdC1ncm91cC1pdGVtKy5saXN0LWdyb3VwLWl0ZW0uYWN0aXZle21hcmdpbi1sZWZ0OmNhbGMoLTEgKiB2YXIoLS1icy1saXN0LWdyb3VwLWJvcmRlci13aWR0aCkpO2JvcmRlci1sZWZ0LXdpZHRoOnZhcigtLWJzLWxpc3QtZ3JvdXAtYm9yZGVyLXdpZHRoKX19QG1lZGlhIChtaW4td2lkdGg6IDk5MnB4KXsubGlzdC1ncm91cC1ob3Jpem9udGFsLWxne2ZsZXgtZGlyZWN0aW9uOnJvd30ubGlzdC1ncm91cC1ob3Jpem9udGFsLWxnPi5saXN0LWdyb3VwLWl0ZW06Zmlyc3QtY2hpbGQ6bm90KDpsYXN0LWNoaWxkKXtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOnZhcigtLWJzLWxpc3QtZ3JvdXAtYm9yZGVyLXJhZGl1cyk7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6MH0ubGlzdC1ncm91cC1ob3Jpem9udGFsLWxnPi5saXN0LWdyb3VwLWl0ZW06bGFzdC1jaGlsZDpub3QoOmZpcnN0LWNoaWxkKXtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czp2YXIoLS1icy1saXN0LWdyb3VwLWJvcmRlci1yYWRpdXMpO2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6MH0ubGlzdC1ncm91cC1ob3Jpem9udGFsLWxnPi5saXN0LWdyb3VwLWl0ZW0uYWN0aXZle21hcmdpbi10b3A6MH0ubGlzdC1ncm91cC1ob3Jpem9udGFsLWxnPi5saXN0LWdyb3VwLWl0ZW0rLmxpc3QtZ3JvdXAtaXRlbXtib3JkZXItdG9wLXdpZHRoOnZhcigtLWJzLWxpc3QtZ3JvdXAtYm9yZGVyLXdpZHRoKTtib3JkZXItbGVmdC13aWR0aDowfS5saXN0LWdyb3VwLWhvcml6b250YWwtbGc+Lmxpc3QtZ3JvdXAtaXRlbSsubGlzdC1ncm91cC1pdGVtLmFjdGl2ZXttYXJnaW4tbGVmdDpjYWxjKC0xICogdmFyKC0tYnMtbGlzdC1ncm91cC1ib3JkZXItd2lkdGgpKTtib3JkZXItbGVmdC13aWR0aDp2YXIoLS1icy1saXN0LWdyb3VwLWJvcmRlci13aWR0aCl9fUBtZWRpYSAobWluLXdpZHRoOiAxMjAwcHgpey5saXN0LWdyb3VwLWhvcml6b250YWwteGx7ZmxleC1kaXJlY3Rpb246cm93fS5saXN0LWdyb3VwLWhvcml6b250YWwteGw+Lmxpc3QtZ3JvdXAtaXRlbTpmaXJzdC1jaGlsZDpub3QoOmxhc3QtY2hpbGQpe2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6dmFyKC0tYnMtbGlzdC1ncm91cC1ib3JkZXItcmFkaXVzKTtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czowfS5saXN0LWdyb3VwLWhvcml6b250YWwteGw+Lmxpc3QtZ3JvdXAtaXRlbTpsYXN0LWNoaWxkOm5vdCg6Zmlyc3QtY2hpbGQpe2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOnZhcigtLWJzLWxpc3QtZ3JvdXAtYm9yZGVyLXJhZGl1cyk7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czowfS5saXN0LWdyb3VwLWhvcml6b250YWwteGw+Lmxpc3QtZ3JvdXAtaXRlbS5hY3RpdmV7bWFyZ2luLXRvcDowfS5saXN0LWdyb3VwLWhvcml6b250YWwteGw+Lmxpc3QtZ3JvdXAtaXRlbSsubGlzdC1ncm91cC1pdGVte2JvcmRlci10b3Atd2lkdGg6dmFyKC0tYnMtbGlzdC1ncm91cC1ib3JkZXItd2lkdGgpO2JvcmRlci1sZWZ0LXdpZHRoOjB9Lmxpc3QtZ3JvdXAtaG9yaXpvbnRhbC14bD4ubGlzdC1ncm91cC1pdGVtKy5saXN0LWdyb3VwLWl0ZW0uYWN0aXZle21hcmdpbi1sZWZ0OmNhbGMoLTEgKiB2YXIoLS1icy1saXN0LWdyb3VwLWJvcmRlci13aWR0aCkpO2JvcmRlci1sZWZ0LXdpZHRoOnZhcigtLWJzLWxpc3QtZ3JvdXAtYm9yZGVyLXdpZHRoKX19QG1lZGlhIChtaW4td2lkdGg6IDE0MDBweCl7Lmxpc3QtZ3JvdXAtaG9yaXpvbnRhbC14eGx7ZmxleC1kaXJlY3Rpb246cm93fS5saXN0LWdyb3VwLWhvcml6b250YWwteHhsPi5saXN0LWdyb3VwLWl0ZW06Zmlyc3QtY2hpbGQ6bm90KDpsYXN0LWNoaWxkKXtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOnZhcigtLWJzLWxpc3QtZ3JvdXAtYm9yZGVyLXJhZGl1cyk7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6MH0ubGlzdC1ncm91cC1ob3Jpem9udGFsLXh4bD4ubGlzdC1ncm91cC1pdGVtOmxhc3QtY2hpbGQ6bm90KDpmaXJzdC1jaGlsZCl7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6dmFyKC0tYnMtbGlzdC1ncm91cC1ib3JkZXItcmFkaXVzKTtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjB9Lmxpc3QtZ3JvdXAtaG9yaXpvbnRhbC14eGw+Lmxpc3QtZ3JvdXAtaXRlbS5hY3RpdmV7bWFyZ2luLXRvcDowfS5saXN0LWdyb3VwLWhvcml6b250YWwteHhsPi5saXN0LWdyb3VwLWl0ZW0rLmxpc3QtZ3JvdXAtaXRlbXtib3JkZXItdG9wLXdpZHRoOnZhcigtLWJzLWxpc3QtZ3JvdXAtYm9yZGVyLXdpZHRoKTtib3JkZXItbGVmdC13aWR0aDowfS5saXN0LWdyb3VwLWhvcml6b250YWwteHhsPi5saXN0LWdyb3VwLWl0ZW0rLmxpc3QtZ3JvdXAtaXRlbS5hY3RpdmV7bWFyZ2luLWxlZnQ6Y2FsYygtMSAqIHZhcigtLWJzLWxpc3QtZ3JvdXAtYm9yZGVyLXdpZHRoKSk7Ym9yZGVyLWxlZnQtd2lkdGg6dmFyKC0tYnMtbGlzdC1ncm91cC1ib3JkZXItd2lkdGgpfX0ubGlzdC1ncm91cC1mbHVzaHtib3JkZXItcmFkaXVzOjB9Lmxpc3QtZ3JvdXAtZmx1c2g+Lmxpc3QtZ3JvdXAtaXRlbXtib3JkZXItd2lkdGg6MCAwIHZhcigtLWJzLWxpc3QtZ3JvdXAtYm9yZGVyLXdpZHRoKX0ubGlzdC1ncm91cC1mbHVzaD4ubGlzdC1ncm91cC1pdGVtOmxhc3QtY2hpbGR7Ym9yZGVyLWJvdHRvbS13aWR0aDowfS5saXN0LWdyb3VwLWl0ZW0tcHJpbWFyeXstLWJzLWxpc3QtZ3JvdXAtY29sb3I6IHZhcigtLWJzLXByaW1hcnktdGV4dC1lbXBoYXNpcyk7LS1icy1saXN0LWdyb3VwLWJnOiB2YXIoLS1icy1wcmltYXJ5LWJnLXN1YnRsZSk7LS1icy1saXN0LWdyb3VwLWJvcmRlci1jb2xvcjogdmFyKC0tYnMtcHJpbWFyeS1ib3JkZXItc3VidGxlKTstLWJzLWxpc3QtZ3JvdXAtYWN0aW9uLWhvdmVyLWNvbG9yOiB2YXIoLS1icy1lbXBoYXNpcy1jb2xvcik7LS1icy1saXN0LWdyb3VwLWFjdGlvbi1ob3Zlci1iZzogdmFyKC0tYnMtcHJpbWFyeS1ib3JkZXItc3VidGxlKTstLWJzLWxpc3QtZ3JvdXAtYWN0aW9uLWFjdGl2ZS1jb2xvcjogdmFyKC0tYnMtZW1waGFzaXMtY29sb3IpOy0tYnMtbGlzdC1ncm91cC1hY3Rpb24tYWN0aXZlLWJnOiB2YXIoLS1icy1wcmltYXJ5LWJvcmRlci1zdWJ0bGUpOy0tYnMtbGlzdC1ncm91cC1hY3RpdmUtY29sb3I6IHZhcigtLWJzLXByaW1hcnktYmctc3VidGxlKTstLWJzLWxpc3QtZ3JvdXAtYWN0aXZlLWJnOiB2YXIoLS1icy1wcmltYXJ5LXRleHQtZW1waGFzaXMpOy0tYnMtbGlzdC1ncm91cC1hY3RpdmUtYm9yZGVyLWNvbG9yOiB2YXIoLS1icy1wcmltYXJ5LXRleHQtZW1waGFzaXMpfS5idG4tY2xvc2V7LS1icy1idG4tY2xvc2UtY29sb3I6ICMwMDA7LS1icy1idG4tY2xvc2UtYmc6IHVybCgke19fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzE2X19ffSk7LS1icy1idG4tY2xvc2Utb3BhY2l0eTogLjU7LS1icy1idG4tY2xvc2UtaG92ZXItb3BhY2l0eTogLjc1Oy0tYnMtYnRuLWNsb3NlLWZvY3VzLXNoYWRvdzogMCAwIDAgLjI1cmVtIHJnYmEoMTMsMTEwLDI1MywwLjI1KTstLWJzLWJ0bi1jbG9zZS1mb2N1cy1vcGFjaXR5OiAxOy0tYnMtYnRuLWNsb3NlLWRpc2FibGVkLW9wYWNpdHk6IC4yNTstLWJzLWJ0bi1jbG9zZS13aGl0ZS1maWx0ZXI6IGludmVydCgxKSBncmF5c2NhbGUoMTAwJSkgYnJpZ2h0bmVzcygyMDAlKTtib3gtc2l6aW5nOmNvbnRlbnQtYm94O3dpZHRoOjFlbTtoZWlnaHQ6MWVtO3BhZGRpbmc6LjI1ZW0gLjI1ZW07Y29sb3I6dmFyKC0tYnMtYnRuLWNsb3NlLWNvbG9yKTtiYWNrZ3JvdW5kOnRyYW5zcGFyZW50IHZhcigtLWJzLWJ0bi1jbG9zZS1iZykgY2VudGVyLzFlbSBhdXRvIG5vLXJlcGVhdDtib3JkZXI6MDtib3JkZXItcmFkaXVzOi4zNzVyZW07b3BhY2l0eTp2YXIoLS1icy1idG4tY2xvc2Utb3BhY2l0eSl9LmJ0bi1jbG9zZTpob3Zlcntjb2xvcjp2YXIoLS1icy1idG4tY2xvc2UtY29sb3IpO3RleHQtZGVjb3JhdGlvbjpub25lO29wYWNpdHk6dmFyKC0tYnMtYnRuLWNsb3NlLWhvdmVyLW9wYWNpdHkpfS5idG4tY2xvc2U6Zm9jdXN7b3V0bGluZTowO2JveC1zaGFkb3c6dmFyKC0tYnMtYnRuLWNsb3NlLWZvY3VzLXNoYWRvdyk7b3BhY2l0eTp2YXIoLS1icy1idG4tY2xvc2UtZm9jdXMtb3BhY2l0eSl9LmJ0bi1jbG9zZTpkaXNhYmxlZCwuYnRuLWNsb3NlLmRpc2FibGVke3BvaW50ZXItZXZlbnRzOm5vbmU7dXNlci1zZWxlY3Q6bm9uZTtvcGFjaXR5OnZhcigtLWJzLWJ0bi1jbG9zZS1kaXNhYmxlZC1vcGFjaXR5KX0uYnRuLWNsb3NlLXdoaXRle2ZpbHRlcjp2YXIoLS1icy1idG4tY2xvc2Utd2hpdGUtZmlsdGVyKX1bZGF0YS1icy10aGVtZT1cImRhcmtcIl0gLmJ0bi1jbG9zZXtmaWx0ZXI6dmFyKC0tYnMtYnRuLWNsb3NlLXdoaXRlLWZpbHRlcil9LnRvYXN0ey0tYnMtdG9hc3QtemluZGV4OiAxMDkwOy0tYnMtdG9hc3QtcGFkZGluZy14OiAuNzVyZW07LS1icy10b2FzdC1wYWRkaW5nLXk6IC41cmVtOy0tYnMtdG9hc3Qtc3BhY2luZzogMS41cmVtOy0tYnMtdG9hc3QtbWF4LXdpZHRoOiAzNTBweDstLWJzLXRvYXN0LWZvbnQtc2l6ZTouODc1cmVtOy0tYnMtdG9hc3QtY29sb3I6IDstLWJzLXRvYXN0LWJnOiByZ2JhKHZhcigtLWJzLWJvZHktYmctcmdiKSwgMC44NSk7LS1icy10b2FzdC1ib3JkZXItd2lkdGg6IHZhcigtLWJzLWJvcmRlci13aWR0aCk7LS1icy10b2FzdC1ib3JkZXItY29sb3I6IHZhcigtLWJzLWJvcmRlci1jb2xvci10cmFuc2x1Y2VudCk7LS1icy10b2FzdC1ib3JkZXItcmFkaXVzOiB2YXIoLS1icy1ib3JkZXItcmFkaXVzKTstLWJzLXRvYXN0LWJveC1zaGFkb3c6IHZhcigtLWJzLWJveC1zaGFkb3cpOy0tYnMtdG9hc3QtaGVhZGVyLWNvbG9yOiB2YXIoLS1icy1zZWNvbmRhcnktY29sb3IpOy0tYnMtdG9hc3QtaGVhZGVyLWJnOiByZ2JhKHZhcigtLWJzLWJvZHktYmctcmdiKSwgMC44NSk7LS1icy10b2FzdC1oZWFkZXItYm9yZGVyLWNvbG9yOiB2YXIoLS1icy1ib3JkZXItY29sb3ItdHJhbnNsdWNlbnQpO3dpZHRoOnZhcigtLWJzLXRvYXN0LW1heC13aWR0aCk7bWF4LXdpZHRoOjEwMCU7Zm9udC1zaXplOnZhcigtLWJzLXRvYXN0LWZvbnQtc2l6ZSk7Y29sb3I6dmFyKC0tYnMtdG9hc3QtY29sb3IpO3BvaW50ZXItZXZlbnRzOmF1dG87YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1icy10b2FzdC1iZyk7YmFja2dyb3VuZC1jbGlwOnBhZGRpbmctYm94O2JvcmRlcjp2YXIoLS1icy10b2FzdC1ib3JkZXItd2lkdGgpIHNvbGlkIHZhcigtLWJzLXRvYXN0LWJvcmRlci1jb2xvcik7Ym94LXNoYWRvdzp2YXIoLS1icy10b2FzdC1ib3gtc2hhZG93KTtib3JkZXItcmFkaXVzOnZhcigtLWJzLXRvYXN0LWJvcmRlci1yYWRpdXMpfS50b2FzdC5zaG93aW5ne29wYWNpdHk6MH0udG9hc3Q6bm90KC5zaG93KXtkaXNwbGF5Om5vbmV9LnRvYXN0LWNvbnRhaW5lcnstLWJzLXRvYXN0LXppbmRleDogMTA5MDtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OnZhcigtLWJzLXRvYXN0LXppbmRleCk7d2lkdGg6bWF4LWNvbnRlbnQ7bWF4LXdpZHRoOjEwMCU7cG9pbnRlci1ldmVudHM6bm9uZX0udG9hc3QtY29udGFpbmVyPjpub3QoOmxhc3QtY2hpbGQpe21hcmdpbi1ib3R0b206dmFyKC0tYnMtdG9hc3Qtc3BhY2luZyl9LnRvYXN0LWhlYWRlcntkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO3BhZGRpbmc6dmFyKC0tYnMtdG9hc3QtcGFkZGluZy15KSB2YXIoLS1icy10b2FzdC1wYWRkaW5nLXgpO2NvbG9yOnZhcigtLWJzLXRvYXN0LWhlYWRlci1jb2xvcik7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1icy10b2FzdC1oZWFkZXItYmcpO2JhY2tncm91bmQtY2xpcDpwYWRkaW5nLWJveDtib3JkZXItYm90dG9tOnZhcigtLWJzLXRvYXN0LWJvcmRlci13aWR0aCkgc29saWQgdmFyKC0tYnMtdG9hc3QtaGVhZGVyLWJvcmRlci1jb2xvcik7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czpjYWxjKHZhcigtLWJzLXRvYXN0LWJvcmRlci1yYWRpdXMpIC0gdmFyKC0tYnMtdG9hc3QtYm9yZGVyLXdpZHRoKSk7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6Y2FsYyh2YXIoLS1icy10b2FzdC1ib3JkZXItcmFkaXVzKSAtIHZhcigtLWJzLXRvYXN0LWJvcmRlci13aWR0aCkpfS50b2FzdC1oZWFkZXIgLmJ0bi1jbG9zZXttYXJnaW4tcmlnaHQ6Y2FsYygtLjUgKiB2YXIoLS1icy10b2FzdC1wYWRkaW5nLXgpKTttYXJnaW4tbGVmdDp2YXIoLS1icy10b2FzdC1wYWRkaW5nLXgpfS50b2FzdC1ib2R5e3BhZGRpbmc6dmFyKC0tYnMtdG9hc3QtcGFkZGluZy14KTt3b3JkLXdyYXA6YnJlYWstd29yZH0ubW9kYWx7LS1icy1tb2RhbC16aW5kZXg6IDEwNTU7LS1icy1tb2RhbC13aWR0aDogNTAwcHg7LS1icy1tb2RhbC1wYWRkaW5nOiAxcmVtOy0tYnMtbW9kYWwtbWFyZ2luOiAuNXJlbTstLWJzLW1vZGFsLWNvbG9yOiA7LS1icy1tb2RhbC1iZzogdmFyKC0tYnMtYm9keS1iZyk7LS1icy1tb2RhbC1ib3JkZXItY29sb3I6IHZhcigtLWJzLWJvcmRlci1jb2xvci10cmFuc2x1Y2VudCk7LS1icy1tb2RhbC1ib3JkZXItd2lkdGg6IHZhcigtLWJzLWJvcmRlci13aWR0aCk7LS1icy1tb2RhbC1ib3JkZXItcmFkaXVzOiB2YXIoLS1icy1ib3JkZXItcmFkaXVzLWxnKTstLWJzLW1vZGFsLWJveC1zaGFkb3c6IHZhcigtLWJzLWJveC1zaGFkb3ctc20pOy0tYnMtbW9kYWwtaW5uZXItYm9yZGVyLXJhZGl1czogY2FsYyh2YXIoLS1icy1ib3JkZXItcmFkaXVzLWxnKSAtICh2YXIoLS1icy1ib3JkZXItd2lkdGgpKSk7LS1icy1tb2RhbC1oZWFkZXItcGFkZGluZy14OiAxcmVtOy0tYnMtbW9kYWwtaGVhZGVyLXBhZGRpbmcteTogMXJlbTstLWJzLW1vZGFsLWhlYWRlci1wYWRkaW5nOiAxcmVtIDFyZW07LS1icy1tb2RhbC1oZWFkZXItYm9yZGVyLWNvbG9yOiB2YXIoLS1icy1ib3JkZXItY29sb3IpOy0tYnMtbW9kYWwtaGVhZGVyLWJvcmRlci13aWR0aDogdmFyKC0tYnMtYm9yZGVyLXdpZHRoKTstLWJzLW1vZGFsLXRpdGxlLWxpbmUtaGVpZ2h0OiAxLjU7LS1icy1tb2RhbC1mb290ZXItZ2FwOiAuNXJlbTstLWJzLW1vZGFsLWZvb3Rlci1iZzogOy0tYnMtbW9kYWwtZm9vdGVyLWJvcmRlci1jb2xvcjogdmFyKC0tYnMtYm9yZGVyLWNvbG9yKTstLWJzLW1vZGFsLWZvb3Rlci1ib3JkZXItd2lkdGg6IHZhcigtLWJzLWJvcmRlci13aWR0aCk7cG9zaXRpb246Zml4ZWQ7dG9wOjA7bGVmdDowO3otaW5kZXg6dmFyKC0tYnMtbW9kYWwtemluZGV4KTtkaXNwbGF5Om5vbmU7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtvdmVyZmxvdy14OmhpZGRlbjtvdmVyZmxvdy15OmF1dG87b3V0bGluZTowfS5tb2RhbC1kaWFsb2d7cG9zaXRpb246cmVsYXRpdmU7d2lkdGg6YXV0bzttYXJnaW46dmFyKC0tYnMtbW9kYWwtbWFyZ2luKTtwb2ludGVyLWV2ZW50czpub25lfS5tb2RhbC5mYWRlIC5tb2RhbC1kaWFsb2d7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gMC4zcyBlYXNlLW91dDt0cmFuc2Zvcm06dHJhbnNsYXRlKDAsIC01MHB4KX1AbWVkaWEgKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZSl7Lm1vZGFsLmZhZGUgLm1vZGFsLWRpYWxvZ3t0cmFuc2l0aW9uOm5vbmV9fS5tb2RhbC5zaG93IC5tb2RhbC1kaWFsb2d7dHJhbnNmb3JtOm5vbmV9Lm1vZGFsLm1vZGFsLXN0YXRpYyAubW9kYWwtZGlhbG9ne3RyYW5zZm9ybTpzY2FsZSgxLjAyKX0ubW9kYWwtZGlhbG9nLXNjcm9sbGFibGV7aGVpZ2h0OmNhbGMoMTAwJSAtIHZhcigtLWJzLW1vZGFsLW1hcmdpbikgKiAyKX0ubW9kYWwtZGlhbG9nLXNjcm9sbGFibGUgLm1vZGFsLWNvbnRlbnR7bWF4LWhlaWdodDoxMDAlO292ZXJmbG93OmhpZGRlbn0ubW9kYWwtZGlhbG9nLXNjcm9sbGFibGUgLm1vZGFsLWJvZHl7b3ZlcmZsb3cteTphdXRvfS5tb2RhbC1kaWFsb2ctY2VudGVyZWR7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjttaW4taGVpZ2h0OmNhbGMoMTAwJSAtIHZhcigtLWJzLW1vZGFsLW1hcmdpbikgKiAyKX0ubW9kYWwtY29udGVudHtwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO3dpZHRoOjEwMCU7Y29sb3I6dmFyKC0tYnMtbW9kYWwtY29sb3IpO3BvaW50ZXItZXZlbnRzOmF1dG87YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1icy1tb2RhbC1iZyk7YmFja2dyb3VuZC1jbGlwOnBhZGRpbmctYm94O2JvcmRlcjp2YXIoLS1icy1tb2RhbC1ib3JkZXItd2lkdGgpIHNvbGlkIHZhcigtLWJzLW1vZGFsLWJvcmRlci1jb2xvcik7Ym9yZGVyLXJhZGl1czp2YXIoLS1icy1tb2RhbC1ib3JkZXItcmFkaXVzKTtvdXRsaW5lOjB9Lm1vZGFsLWJhY2tkcm9wey0tYnMtYmFja2Ryb3AtemluZGV4OiAxMDUwOy0tYnMtYmFja2Ryb3AtYmc6ICMwMDA7LS1icy1iYWNrZHJvcC1vcGFjaXR5OiAuNTtwb3NpdGlvbjpmaXhlZDt0b3A6MDtsZWZ0OjA7ei1pbmRleDp2YXIoLS1icy1iYWNrZHJvcC16aW5kZXgpO3dpZHRoOjEwMHZ3O2hlaWdodDoxMDB2aDtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWJzLWJhY2tkcm9wLWJnKX0ubW9kYWwtYmFja2Ryb3AuZmFkZXtvcGFjaXR5OjB9Lm1vZGFsLWJhY2tkcm9wLnNob3d7b3BhY2l0eTp2YXIoLS1icy1iYWNrZHJvcC1vcGFjaXR5KX0ubW9kYWwtaGVhZGVye2Rpc3BsYXk6ZmxleDtmbGV4LXNocmluazowO2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2VlbjtwYWRkaW5nOnZhcigtLWJzLW1vZGFsLWhlYWRlci1wYWRkaW5nKTtib3JkZXItYm90dG9tOnZhcigtLWJzLW1vZGFsLWhlYWRlci1ib3JkZXItd2lkdGgpIHNvbGlkIHZhcigtLWJzLW1vZGFsLWhlYWRlci1ib3JkZXItY29sb3IpO2JvcmRlci10b3AtbGVmdC1yYWRpdXM6dmFyKC0tYnMtbW9kYWwtaW5uZXItYm9yZGVyLXJhZGl1cyk7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6dmFyKC0tYnMtbW9kYWwtaW5uZXItYm9yZGVyLXJhZGl1cyl9Lm1vZGFsLWhlYWRlciAuYnRuLWNsb3Nle3BhZGRpbmc6Y2FsYyh2YXIoLS1icy1tb2RhbC1oZWFkZXItcGFkZGluZy15KSAqIC41KSBjYWxjKHZhcigtLWJzLW1vZGFsLWhlYWRlci1wYWRkaW5nLXgpICogLjUpO21hcmdpbjpjYWxjKC0uNSAqIHZhcigtLWJzLW1vZGFsLWhlYWRlci1wYWRkaW5nLXkpKSBjYWxjKC0uNSAqIHZhcigtLWJzLW1vZGFsLWhlYWRlci1wYWRkaW5nLXgpKSBjYWxjKC0uNSAqIHZhcigtLWJzLW1vZGFsLWhlYWRlci1wYWRkaW5nLXkpKSBhdXRvfS5tb2RhbC10aXRsZXttYXJnaW4tYm90dG9tOjA7bGluZS1oZWlnaHQ6dmFyKC0tYnMtbW9kYWwtdGl0bGUtbGluZS1oZWlnaHQpfS5tb2RhbC1ib2R5e3Bvc2l0aW9uOnJlbGF0aXZlO2ZsZXg6MSAxIGF1dG87cGFkZGluZzp2YXIoLS1icy1tb2RhbC1wYWRkaW5nKX0ubW9kYWwtZm9vdGVye2Rpc3BsYXk6ZmxleDtmbGV4LXNocmluazowO2ZsZXgtd3JhcDp3cmFwO2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmQ7cGFkZGluZzpjYWxjKHZhcigtLWJzLW1vZGFsLXBhZGRpbmcpIC0gdmFyKC0tYnMtbW9kYWwtZm9vdGVyLWdhcCkgKiAuNSk7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1icy1tb2RhbC1mb290ZXItYmcpO2JvcmRlci10b3A6dmFyKC0tYnMtbW9kYWwtZm9vdGVyLWJvcmRlci13aWR0aCkgc29saWQgdmFyKC0tYnMtbW9kYWwtZm9vdGVyLWJvcmRlci1jb2xvcik7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6dmFyKC0tYnMtbW9kYWwtaW5uZXItYm9yZGVyLXJhZGl1cyk7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czp2YXIoLS1icy1tb2RhbC1pbm5lci1ib3JkZXItcmFkaXVzKX0ubW9kYWwtZm9vdGVyPip7bWFyZ2luOmNhbGModmFyKC0tYnMtbW9kYWwtZm9vdGVyLWdhcCkgKiAuNSl9QG1lZGlhIChtaW4td2lkdGg6IDU3NnB4KXsubW9kYWx7LS1icy1tb2RhbC1tYXJnaW46IDEuNzVyZW07LS1icy1tb2RhbC1ib3gtc2hhZG93OiB2YXIoLS1icy1ib3gtc2hhZG93KX0ubW9kYWwtZGlhbG9ne21heC13aWR0aDp2YXIoLS1icy1tb2RhbC13aWR0aCk7bWFyZ2luLXJpZ2h0OmF1dG87bWFyZ2luLWxlZnQ6YXV0b30ubW9kYWwtc217LS1icy1tb2RhbC13aWR0aDogMzAwcHh9fUBtZWRpYSAobWluLXdpZHRoOiA5OTJweCl7Lm1vZGFsLWxnLC5tb2RhbC14bHstLWJzLW1vZGFsLXdpZHRoOiA4MDBweH19QG1lZGlhIChtaW4td2lkdGg6IDEyMDBweCl7Lm1vZGFsLXhsey0tYnMtbW9kYWwtd2lkdGg6IDExNDBweH19Lm1vZGFsLWZ1bGxzY3JlZW57d2lkdGg6MTAwdnc7bWF4LXdpZHRoOm5vbmU7aGVpZ2h0OjEwMCU7bWFyZ2luOjB9Lm1vZGFsLWZ1bGxzY3JlZW4gLm1vZGFsLWNvbnRlbnR7aGVpZ2h0OjEwMCU7Ym9yZGVyOjA7Ym9yZGVyLXJhZGl1czowfS5tb2RhbC1mdWxsc2NyZWVuIC5tb2RhbC1oZWFkZXIsLm1vZGFsLWZ1bGxzY3JlZW4gLm1vZGFsLWZvb3Rlcntib3JkZXItcmFkaXVzOjB9Lm1vZGFsLWZ1bGxzY3JlZW4gLm1vZGFsLWJvZHl7b3ZlcmZsb3cteTphdXRvfUBtZWRpYSAobWF4LXdpZHRoOiA1NzUuOThweCl7Lm1vZGFsLWZ1bGxzY3JlZW4tc20tZG93bnt3aWR0aDoxMDB2dzttYXgtd2lkdGg6bm9uZTtoZWlnaHQ6MTAwJTttYXJnaW46MH0ubW9kYWwtZnVsbHNjcmVlbi1zbS1kb3duIC5tb2RhbC1jb250ZW50e2hlaWdodDoxMDAlO2JvcmRlcjowO2JvcmRlci1yYWRpdXM6MH0ubW9kYWwtZnVsbHNjcmVlbi1zbS1kb3duIC5tb2RhbC1oZWFkZXIsLm1vZGFsLWZ1bGxzY3JlZW4tc20tZG93biAubW9kYWwtZm9vdGVye2JvcmRlci1yYWRpdXM6MH0ubW9kYWwtZnVsbHNjcmVlbi1zbS1kb3duIC5tb2RhbC1ib2R5e292ZXJmbG93LXk6YXV0b319QG1lZGlhIChtYXgtd2lkdGg6IDc2Ny45OHB4KXsubW9kYWwtZnVsbHNjcmVlbi1tZC1kb3due3dpZHRoOjEwMHZ3O21heC13aWR0aDpub25lO2hlaWdodDoxMDAlO21hcmdpbjowfS5tb2RhbC1mdWxsc2NyZWVuLW1kLWRvd24gLm1vZGFsLWNvbnRlbnR7aGVpZ2h0OjEwMCU7Ym9yZGVyOjA7Ym9yZGVyLXJhZGl1czowfS5tb2RhbC1mdWxsc2NyZWVuLW1kLWRvd24gLm1vZGFsLWhlYWRlciwubW9kYWwtZnVsbHNjcmVlbi1tZC1kb3duIC5tb2RhbC1mb290ZXJ7Ym9yZGVyLXJhZGl1czowfS5tb2RhbC1mdWxsc2NyZWVuLW1kLWRvd24gLm1vZGFsLWJvZHl7b3ZlcmZsb3cteTphdXRvfX1AbWVkaWEgKG1heC13aWR0aDogOTkxLjk4cHgpey5tb2RhbC1mdWxsc2NyZWVuLWxnLWRvd257d2lkdGg6MTAwdnc7bWF4LXdpZHRoOm5vbmU7aGVpZ2h0OjEwMCU7bWFyZ2luOjB9Lm1vZGFsLWZ1bGxzY3JlZW4tbGctZG93biAubW9kYWwtY29udGVudHtoZWlnaHQ6MTAwJTtib3JkZXI6MDtib3JkZXItcmFkaXVzOjB9Lm1vZGFsLWZ1bGxzY3JlZW4tbGctZG93biAubW9kYWwtaGVhZGVyLC5tb2RhbC1mdWxsc2NyZWVuLWxnLWRvd24gLm1vZGFsLWZvb3Rlcntib3JkZXItcmFkaXVzOjB9Lm1vZGFsLWZ1bGxzY3JlZW4tbGctZG93biAubW9kYWwtYm9keXtvdmVyZmxvdy15OmF1dG99fUBtZWRpYSAobWF4LXdpZHRoOiAxMTk5Ljk4cHgpey5tb2RhbC1mdWxsc2NyZWVuLXhsLWRvd257d2lkdGg6MTAwdnc7bWF4LXdpZHRoOm5vbmU7aGVpZ2h0OjEwMCU7bWFyZ2luOjB9Lm1vZGFsLWZ1bGxzY3JlZW4teGwtZG93biAubW9kYWwtY29udGVudHtoZWlnaHQ6MTAwJTtib3JkZXI6MDtib3JkZXItcmFkaXVzOjB9Lm1vZGFsLWZ1bGxzY3JlZW4teGwtZG93biAubW9kYWwtaGVhZGVyLC5tb2RhbC1mdWxsc2NyZWVuLXhsLWRvd24gLm1vZGFsLWZvb3Rlcntib3JkZXItcmFkaXVzOjB9Lm1vZGFsLWZ1bGxzY3JlZW4teGwtZG93biAubW9kYWwtYm9keXtvdmVyZmxvdy15OmF1dG99fUBtZWRpYSAobWF4LXdpZHRoOiAxMzk5Ljk4cHgpey5tb2RhbC1mdWxsc2NyZWVuLXh4bC1kb3due3dpZHRoOjEwMHZ3O21heC13aWR0aDpub25lO2hlaWdodDoxMDAlO21hcmdpbjowfS5tb2RhbC1mdWxsc2NyZWVuLXh4bC1kb3duIC5tb2RhbC1jb250ZW50e2hlaWdodDoxMDAlO2JvcmRlcjowO2JvcmRlci1yYWRpdXM6MH0ubW9kYWwtZnVsbHNjcmVlbi14eGwtZG93biAubW9kYWwtaGVhZGVyLC5tb2RhbC1mdWxsc2NyZWVuLXh4bC1kb3duIC5tb2RhbC1mb290ZXJ7Ym9yZGVyLXJhZGl1czowfS5tb2RhbC1mdWxsc2NyZWVuLXh4bC1kb3duIC5tb2RhbC1ib2R5e292ZXJmbG93LXk6YXV0b319LnRvb2x0aXB7LS1icy10b29sdGlwLXppbmRleDogMTA4MDstLWJzLXRvb2x0aXAtbWF4LXdpZHRoOiAyMDBweDstLWJzLXRvb2x0aXAtcGFkZGluZy14OiAuNXJlbTstLWJzLXRvb2x0aXAtcGFkZGluZy15OiAuMjVyZW07LS1icy10b29sdGlwLW1hcmdpbjogOy0tYnMtdG9vbHRpcC1mb250LXNpemU6Ljg3NXJlbTstLWJzLXRvb2x0aXAtY29sb3I6IHZhcigtLWJzLWJvZHktYmcpOy0tYnMtdG9vbHRpcC1iZzogdmFyKC0tYnMtZW1waGFzaXMtY29sb3IpOy0tYnMtdG9vbHRpcC1ib3JkZXItcmFkaXVzOiB2YXIoLS1icy1ib3JkZXItcmFkaXVzKTstLWJzLXRvb2x0aXAtb3BhY2l0eTogLjk7LS1icy10b29sdGlwLWFycm93LXdpZHRoOiAuOHJlbTstLWJzLXRvb2x0aXAtYXJyb3ctaGVpZ2h0OiAuNHJlbTt6LWluZGV4OnZhcigtLWJzLXRvb2x0aXAtemluZGV4KTtkaXNwbGF5OmJsb2NrO21hcmdpbjp2YXIoLS1icy10b29sdGlwLW1hcmdpbik7Zm9udC1mYW1pbHk6dmFyKC0tYnMtZm9udC1zYW5zLXNlcmlmKTtmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS41O3RleHQtYWxpZ246bGVmdDt0ZXh0LWFsaWduOnN0YXJ0O3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtc2hhZG93Om5vbmU7dGV4dC10cmFuc2Zvcm06bm9uZTtsZXR0ZXItc3BhY2luZzpub3JtYWw7d29yZC1icmVhazpub3JtYWw7d2hpdGUtc3BhY2U6bm9ybWFsO3dvcmQtc3BhY2luZzpub3JtYWw7bGluZS1icmVhazphdXRvO2ZvbnQtc2l6ZTp2YXIoLS1icy10b29sdGlwLWZvbnQtc2l6ZSk7d29yZC13cmFwOmJyZWFrLXdvcmQ7b3BhY2l0eTowfS50b29sdGlwLnNob3d7b3BhY2l0eTp2YXIoLS1icy10b29sdGlwLW9wYWNpdHkpfS50b29sdGlwIC50b29sdGlwLWFycm93e2Rpc3BsYXk6YmxvY2s7d2lkdGg6dmFyKC0tYnMtdG9vbHRpcC1hcnJvdy13aWR0aCk7aGVpZ2h0OnZhcigtLWJzLXRvb2x0aXAtYXJyb3ctaGVpZ2h0KX0udG9vbHRpcCAudG9vbHRpcC1hcnJvdzo6YmVmb3Jle3Bvc2l0aW9uOmFic29sdXRlO2NvbnRlbnQ6XCJcIjtib3JkZXItY29sb3I6dHJhbnNwYXJlbnQ7Ym9yZGVyLXN0eWxlOnNvbGlkfS5icy10b29sdGlwLXRvcCAudG9vbHRpcC1hcnJvdywuYnMtdG9vbHRpcC1hdXRvW2RhdGEtcG9wcGVyLXBsYWNlbWVudF49XCJ0b3BcIl0gLnRvb2x0aXAtYXJyb3d7Ym90dG9tOmNhbGMoLTEgKiB2YXIoLS1icy10b29sdGlwLWFycm93LWhlaWdodCkpfS5icy10b29sdGlwLXRvcCAudG9vbHRpcC1hcnJvdzo6YmVmb3JlLC5icy10b29sdGlwLWF1dG9bZGF0YS1wb3BwZXItcGxhY2VtZW50Xj1cInRvcFwiXSAudG9vbHRpcC1hcnJvdzo6YmVmb3Jle3RvcDotMXB4O2JvcmRlci13aWR0aDp2YXIoLS1icy10b29sdGlwLWFycm93LWhlaWdodCkgY2FsYyh2YXIoLS1icy10b29sdGlwLWFycm93LXdpZHRoKSAqIC41KSAwO2JvcmRlci10b3AtY29sb3I6dmFyKC0tYnMtdG9vbHRpcC1iZyl9LmJzLXRvb2x0aXAtZW5kIC50b29sdGlwLWFycm93LC5icy10b29sdGlwLWF1dG9bZGF0YS1wb3BwZXItcGxhY2VtZW50Xj1cInJpZ2h0XCJdIC50b29sdGlwLWFycm93e2xlZnQ6Y2FsYygtMSAqIHZhcigtLWJzLXRvb2x0aXAtYXJyb3ctaGVpZ2h0KSk7d2lkdGg6dmFyKC0tYnMtdG9vbHRpcC1hcnJvdy1oZWlnaHQpO2hlaWdodDp2YXIoLS1icy10b29sdGlwLWFycm93LXdpZHRoKX0uYnMtdG9vbHRpcC1lbmQgLnRvb2x0aXAtYXJyb3c6OmJlZm9yZSwuYnMtdG9vbHRpcC1hdXRvW2RhdGEtcG9wcGVyLXBsYWNlbWVudF49XCJyaWdodFwiXSAudG9vbHRpcC1hcnJvdzo6YmVmb3Jle3JpZ2h0Oi0xcHg7Ym9yZGVyLXdpZHRoOmNhbGModmFyKC0tYnMtdG9vbHRpcC1hcnJvdy13aWR0aCkgKiAuNSkgdmFyKC0tYnMtdG9vbHRpcC1hcnJvdy1oZWlnaHQpIGNhbGModmFyKC0tYnMtdG9vbHRpcC1hcnJvdy13aWR0aCkgKiAuNSkgMDtib3JkZXItcmlnaHQtY29sb3I6dmFyKC0tYnMtdG9vbHRpcC1iZyl9LmJzLXRvb2x0aXAtYm90dG9tIC50b29sdGlwLWFycm93LC5icy10b29sdGlwLWF1dG9bZGF0YS1wb3BwZXItcGxhY2VtZW50Xj1cImJvdHRvbVwiXSAudG9vbHRpcC1hcnJvd3t0b3A6Y2FsYygtMSAqIHZhcigtLWJzLXRvb2x0aXAtYXJyb3ctaGVpZ2h0KSl9LmJzLXRvb2x0aXAtYm90dG9tIC50b29sdGlwLWFycm93OjpiZWZvcmUsLmJzLXRvb2x0aXAtYXV0b1tkYXRhLXBvcHBlci1wbGFjZW1lbnRePVwiYm90dG9tXCJdIC50b29sdGlwLWFycm93OjpiZWZvcmV7Ym90dG9tOi0xcHg7Ym9yZGVyLXdpZHRoOjAgY2FsYyh2YXIoLS1icy10b29sdGlwLWFycm93LXdpZHRoKSAqIC41KSB2YXIoLS1icy10b29sdGlwLWFycm93LWhlaWdodCk7Ym9yZGVyLWJvdHRvbS1jb2xvcjp2YXIoLS1icy10b29sdGlwLWJnKX0uYnMtdG9vbHRpcC1zdGFydCAudG9vbHRpcC1hcnJvdywuYnMtdG9vbHRpcC1hdXRvW2RhdGEtcG9wcGVyLXBsYWNlbWVudF49XCJsZWZ0XCJdIC50b29sdGlwLWFycm93e3JpZ2h0OmNhbGMoLTEgKiB2YXIoLS1icy10b29sdGlwLWFycm93LWhlaWdodCkpO3dpZHRoOnZhcigtLWJzLXRvb2x0aXAtYXJyb3ctaGVpZ2h0KTtoZWlnaHQ6dmFyKC0tYnMtdG9vbHRpcC1hcnJvdy13aWR0aCl9LmJzLXRvb2x0aXAtc3RhcnQgLnRvb2x0aXAtYXJyb3c6OmJlZm9yZSwuYnMtdG9vbHRpcC1hdXRvW2RhdGEtcG9wcGVyLXBsYWNlbWVudF49XCJsZWZ0XCJdIC50b29sdGlwLWFycm93OjpiZWZvcmV7bGVmdDotMXB4O2JvcmRlci13aWR0aDpjYWxjKHZhcigtLWJzLXRvb2x0aXAtYXJyb3ctd2lkdGgpICogLjUpIDAgY2FsYyh2YXIoLS1icy10b29sdGlwLWFycm93LXdpZHRoKSAqIC41KSB2YXIoLS1icy10b29sdGlwLWFycm93LWhlaWdodCk7Ym9yZGVyLWxlZnQtY29sb3I6dmFyKC0tYnMtdG9vbHRpcC1iZyl9LnRvb2x0aXAtaW5uZXJ7bWF4LXdpZHRoOnZhcigtLWJzLXRvb2x0aXAtbWF4LXdpZHRoKTtwYWRkaW5nOnZhcigtLWJzLXRvb2x0aXAtcGFkZGluZy15KSB2YXIoLS1icy10b29sdGlwLXBhZGRpbmcteCk7Y29sb3I6dmFyKC0tYnMtdG9vbHRpcC1jb2xvcik7dGV4dC1hbGlnbjpjZW50ZXI7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1icy10b29sdGlwLWJnKTtib3JkZXItcmFkaXVzOnZhcigtLWJzLXRvb2x0aXAtYm9yZGVyLXJhZGl1cyl9LnBvcG92ZXJ7LS1icy1wb3BvdmVyLXppbmRleDogMTA3MDstLWJzLXBvcG92ZXItbWF4LXdpZHRoOiAyNzZweDstLWJzLXBvcG92ZXItZm9udC1zaXplOi44NzVyZW07LS1icy1wb3BvdmVyLWJnOiB2YXIoLS1icy1ib2R5LWJnKTstLWJzLXBvcG92ZXItYm9yZGVyLXdpZHRoOiB2YXIoLS1icy1ib3JkZXItd2lkdGgpOy0tYnMtcG9wb3Zlci1ib3JkZXItY29sb3I6IHZhcigtLWJzLWJvcmRlci1jb2xvci10cmFuc2x1Y2VudCk7LS1icy1wb3BvdmVyLWJvcmRlci1yYWRpdXM6IHZhcigtLWJzLWJvcmRlci1yYWRpdXMtbGcpOy0tYnMtcG9wb3Zlci1pbm5lci1ib3JkZXItcmFkaXVzOiBjYWxjKHZhcigtLWJzLWJvcmRlci1yYWRpdXMtbGcpIC0gdmFyKC0tYnMtYm9yZGVyLXdpZHRoKSk7LS1icy1wb3BvdmVyLWJveC1zaGFkb3c6IHZhcigtLWJzLWJveC1zaGFkb3cpOy0tYnMtcG9wb3Zlci1oZWFkZXItcGFkZGluZy14OiAxcmVtOy0tYnMtcG9wb3Zlci1oZWFkZXItcGFkZGluZy15OiAuNXJlbTstLWJzLXBvcG92ZXItaGVhZGVyLWZvbnQtc2l6ZToxcmVtOy0tYnMtcG9wb3Zlci1oZWFkZXItY29sb3I6IGluaGVyaXQ7LS1icy1wb3BvdmVyLWhlYWRlci1iZzogdmFyKC0tYnMtc2Vjb25kYXJ5LWJnKTstLWJzLXBvcG92ZXItYm9keS1wYWRkaW5nLXg6IDFyZW07LS1icy1wb3BvdmVyLWJvZHktcGFkZGluZy15OiAxcmVtOy0tYnMtcG9wb3Zlci1ib2R5LWNvbG9yOiB2YXIoLS1icy1ib2R5LWNvbG9yKTstLWJzLXBvcG92ZXItYXJyb3ctd2lkdGg6IDFyZW07LS1icy1wb3BvdmVyLWFycm93LWhlaWdodDogLjVyZW07LS1icy1wb3BvdmVyLWFycm93LWJvcmRlcjogdmFyKC0tYnMtcG9wb3Zlci1ib3JkZXItY29sb3IpO3otaW5kZXg6dmFyKC0tYnMtcG9wb3Zlci16aW5kZXgpO2Rpc3BsYXk6YmxvY2s7bWF4LXdpZHRoOnZhcigtLWJzLXBvcG92ZXItbWF4LXdpZHRoKTtmb250LWZhbWlseTp2YXIoLS1icy1mb250LXNhbnMtc2VyaWYpO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxLjU7dGV4dC1hbGlnbjpsZWZ0O3RleHQtYWxpZ246c3RhcnQ7dGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC1zaGFkb3c6bm9uZTt0ZXh0LXRyYW5zZm9ybTpub25lO2xldHRlci1zcGFjaW5nOm5vcm1hbDt3b3JkLWJyZWFrOm5vcm1hbDt3aGl0ZS1zcGFjZTpub3JtYWw7d29yZC1zcGFjaW5nOm5vcm1hbDtsaW5lLWJyZWFrOmF1dG87Zm9udC1zaXplOnZhcigtLWJzLXBvcG92ZXItZm9udC1zaXplKTt3b3JkLXdyYXA6YnJlYWstd29yZDtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWJzLXBvcG92ZXItYmcpO2JhY2tncm91bmQtY2xpcDpwYWRkaW5nLWJveDtib3JkZXI6dmFyKC0tYnMtcG9wb3Zlci1ib3JkZXItd2lkdGgpIHNvbGlkIHZhcigtLWJzLXBvcG92ZXItYm9yZGVyLWNvbG9yKTtib3JkZXItcmFkaXVzOnZhcigtLWJzLXBvcG92ZXItYm9yZGVyLXJhZGl1cyl9LnBvcG92ZXIgLnBvcG92ZXItYXJyb3d7ZGlzcGxheTpibG9jazt3aWR0aDp2YXIoLS1icy1wb3BvdmVyLWFycm93LXdpZHRoKTtoZWlnaHQ6dmFyKC0tYnMtcG9wb3Zlci1hcnJvdy1oZWlnaHQpfS5wb3BvdmVyIC5wb3BvdmVyLWFycm93OjpiZWZvcmUsLnBvcG92ZXIgLnBvcG92ZXItYXJyb3c6OmFmdGVye3Bvc2l0aW9uOmFic29sdXRlO2Rpc3BsYXk6YmxvY2s7Y29udGVudDpcIlwiO2JvcmRlci1jb2xvcjp0cmFuc3BhcmVudDtib3JkZXItc3R5bGU6c29saWQ7Ym9yZGVyLXdpZHRoOjB9LmJzLXBvcG92ZXItdG9wPi5wb3BvdmVyLWFycm93LC5icy1wb3BvdmVyLWF1dG9bZGF0YS1wb3BwZXItcGxhY2VtZW50Xj1cInRvcFwiXT4ucG9wb3Zlci1hcnJvd3tib3R0b206Y2FsYygtMSAqICh2YXIoLS1icy1wb3BvdmVyLWFycm93LWhlaWdodCkpIC0gdmFyKC0tYnMtcG9wb3Zlci1ib3JkZXItd2lkdGgpKX0uYnMtcG9wb3Zlci10b3A+LnBvcG92ZXItYXJyb3c6OmJlZm9yZSwuYnMtcG9wb3Zlci1hdXRvW2RhdGEtcG9wcGVyLXBsYWNlbWVudF49XCJ0b3BcIl0+LnBvcG92ZXItYXJyb3c6OmJlZm9yZSwuYnMtcG9wb3Zlci10b3A+LnBvcG92ZXItYXJyb3c6OmFmdGVyLC5icy1wb3BvdmVyLWF1dG9bZGF0YS1wb3BwZXItcGxhY2VtZW50Xj1cInRvcFwiXT4ucG9wb3Zlci1hcnJvdzo6YWZ0ZXJ7Ym9yZGVyLXdpZHRoOnZhcigtLWJzLXBvcG92ZXItYXJyb3ctaGVpZ2h0KSBjYWxjKHZhcigtLWJzLXBvcG92ZXItYXJyb3ctd2lkdGgpICogLjUpIDB9LmJzLXBvcG92ZXItdG9wPi5wb3BvdmVyLWFycm93OjpiZWZvcmUsLmJzLXBvcG92ZXItYXV0b1tkYXRhLXBvcHBlci1wbGFjZW1lbnRePVwidG9wXCJdPi5wb3BvdmVyLWFycm93OjpiZWZvcmV7Ym90dG9tOjA7Ym9yZGVyLXRvcC1jb2xvcjp2YXIoLS1icy1wb3BvdmVyLWFycm93LWJvcmRlcil9LmJzLXBvcG92ZXItdG9wPi5wb3BvdmVyLWFycm93OjphZnRlciwuYnMtcG9wb3Zlci1hdXRvW2RhdGEtcG9wcGVyLXBsYWNlbWVudF49XCJ0b3BcIl0+LnBvcG92ZXItYXJyb3c6OmFmdGVye2JvdHRvbTp2YXIoLS1icy1wb3BvdmVyLWJvcmRlci13aWR0aCk7Ym9yZGVyLXRvcC1jb2xvcjp2YXIoLS1icy1wb3BvdmVyLWJnKX0uYnMtcG9wb3Zlci1lbmQ+LnBvcG92ZXItYXJyb3csLmJzLXBvcG92ZXItYXV0b1tkYXRhLXBvcHBlci1wbGFjZW1lbnRePVwicmlnaHRcIl0+LnBvcG92ZXItYXJyb3d7bGVmdDpjYWxjKC0xICogKHZhcigtLWJzLXBvcG92ZXItYXJyb3ctaGVpZ2h0KSkgLSB2YXIoLS1icy1wb3BvdmVyLWJvcmRlci13aWR0aCkpO3dpZHRoOnZhcigtLWJzLXBvcG92ZXItYXJyb3ctaGVpZ2h0KTtoZWlnaHQ6dmFyKC0tYnMtcG9wb3Zlci1hcnJvdy13aWR0aCl9LmJzLXBvcG92ZXItZW5kPi5wb3BvdmVyLWFycm93OjpiZWZvcmUsLmJzLXBvcG92ZXItYXV0b1tkYXRhLXBvcHBlci1wbGFjZW1lbnRePVwicmlnaHRcIl0+LnBvcG92ZXItYXJyb3c6OmJlZm9yZSwuYnMtcG9wb3Zlci1lbmQ+LnBvcG92ZXItYXJyb3c6OmFmdGVyLC5icy1wb3BvdmVyLWF1dG9bZGF0YS1wb3BwZXItcGxhY2VtZW50Xj1cInJpZ2h0XCJdPi5wb3BvdmVyLWFycm93OjphZnRlcntib3JkZXItd2lkdGg6Y2FsYyh2YXIoLS1icy1wb3BvdmVyLWFycm93LXdpZHRoKSAqIC41KSB2YXIoLS1icy1wb3BvdmVyLWFycm93LWhlaWdodCkgY2FsYyh2YXIoLS1icy1wb3BvdmVyLWFycm93LXdpZHRoKSAqIC41KSAwfS5icy1wb3BvdmVyLWVuZD4ucG9wb3Zlci1hcnJvdzo6YmVmb3JlLC5icy1wb3BvdmVyLWF1dG9bZGF0YS1wb3BwZXItcGxhY2VtZW50Xj1cInJpZ2h0XCJdPi5wb3BvdmVyLWFycm93OjpiZWZvcmV7bGVmdDowO2JvcmRlci1yaWdodC1jb2xvcjp2YXIoLS1icy1wb3BvdmVyLWFycm93LWJvcmRlcil9LmJzLXBvcG92ZXItZW5kPi5wb3BvdmVyLWFycm93OjphZnRlciwuYnMtcG9wb3Zlci1hdXRvW2RhdGEtcG9wcGVyLXBsYWNlbWVudF49XCJyaWdodFwiXT4ucG9wb3Zlci1hcnJvdzo6YWZ0ZXJ7bGVmdDp2YXIoLS1icy1wb3BvdmVyLWJvcmRlci13aWR0aCk7Ym9yZGVyLXJpZ2h0LWNvbG9yOnZhcigtLWJzLXBvcG92ZXItYmcpfS5icy1wb3BvdmVyLWJvdHRvbT4ucG9wb3Zlci1hcnJvdywuYnMtcG9wb3Zlci1hdXRvW2RhdGEtcG9wcGVyLXBsYWNlbWVudF49XCJib3R0b21cIl0+LnBvcG92ZXItYXJyb3d7dG9wOmNhbGMoLTEgKiAodmFyKC0tYnMtcG9wb3Zlci1hcnJvdy1oZWlnaHQpKSAtIHZhcigtLWJzLXBvcG92ZXItYm9yZGVyLXdpZHRoKSl9LmJzLXBvcG92ZXItYm90dG9tPi5wb3BvdmVyLWFycm93OjpiZWZvcmUsLmJzLXBvcG92ZXItYXV0b1tkYXRhLXBvcHBlci1wbGFjZW1lbnRePVwiYm90dG9tXCJdPi5wb3BvdmVyLWFycm93OjpiZWZvcmUsLmJzLXBvcG92ZXItYm90dG9tPi5wb3BvdmVyLWFycm93OjphZnRlciwuYnMtcG9wb3Zlci1hdXRvW2RhdGEtcG9wcGVyLXBsYWNlbWVudF49XCJib3R0b21cIl0+LnBvcG92ZXItYXJyb3c6OmFmdGVye2JvcmRlci13aWR0aDowIGNhbGModmFyKC0tYnMtcG9wb3Zlci1hcnJvdy13aWR0aCkgKiAuNSkgdmFyKC0tYnMtcG9wb3Zlci1hcnJvdy1oZWlnaHQpfS5icy1wb3BvdmVyLWJvdHRvbT4ucG9wb3Zlci1hcnJvdzo6YmVmb3JlLC5icy1wb3BvdmVyLWF1dG9bZGF0YS1wb3BwZXItcGxhY2VtZW50Xj1cImJvdHRvbVwiXT4ucG9wb3Zlci1hcnJvdzo6YmVmb3Jle3RvcDowO2JvcmRlci1ib3R0b20tY29sb3I6dmFyKC0tYnMtcG9wb3Zlci1hcnJvdy1ib3JkZXIpfS5icy1wb3BvdmVyLWJvdHRvbT4ucG9wb3Zlci1hcnJvdzo6YWZ0ZXIsLmJzLXBvcG92ZXItYXV0b1tkYXRhLXBvcHBlci1wbGFjZW1lbnRePVwiYm90dG9tXCJdPi5wb3BvdmVyLWFycm93OjphZnRlcnt0b3A6dmFyKC0tYnMtcG9wb3Zlci1ib3JkZXItd2lkdGgpO2JvcmRlci1ib3R0b20tY29sb3I6dmFyKC0tYnMtcG9wb3Zlci1iZyl9LmJzLXBvcG92ZXItYm90dG9tIC5wb3BvdmVyLWhlYWRlcjo6YmVmb3JlLC5icy1wb3BvdmVyLWF1dG9bZGF0YS1wb3BwZXItcGxhY2VtZW50Xj1cImJvdHRvbVwiXSAucG9wb3Zlci1oZWFkZXI6OmJlZm9yZXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjUwJTtkaXNwbGF5OmJsb2NrO3dpZHRoOnZhcigtLWJzLXBvcG92ZXItYXJyb3ctd2lkdGgpO21hcmdpbi1sZWZ0OmNhbGMoLS41ICogdmFyKC0tYnMtcG9wb3Zlci1hcnJvdy13aWR0aCkpO2NvbnRlbnQ6XCJcIjtib3JkZXItYm90dG9tOnZhcigtLWJzLXBvcG92ZXItYm9yZGVyLXdpZHRoKSBzb2xpZCB2YXIoLS1icy1wb3BvdmVyLWhlYWRlci1iZyl9LmJzLXBvcG92ZXItc3RhcnQ+LnBvcG92ZXItYXJyb3csLmJzLXBvcG92ZXItYXV0b1tkYXRhLXBvcHBlci1wbGFjZW1lbnRePVwibGVmdFwiXT4ucG9wb3Zlci1hcnJvd3tyaWdodDpjYWxjKC0xICogKHZhcigtLWJzLXBvcG92ZXItYXJyb3ctaGVpZ2h0KSkgLSB2YXIoLS1icy1wb3BvdmVyLWJvcmRlci13aWR0aCkpO3dpZHRoOnZhcigtLWJzLXBvcG92ZXItYXJyb3ctaGVpZ2h0KTtoZWlnaHQ6dmFyKC0tYnMtcG9wb3Zlci1hcnJvdy13aWR0aCl9LmJzLXBvcG92ZXItc3RhcnQ+LnBvcG92ZXItYXJyb3c6OmJlZm9yZSwuYnMtcG9wb3Zlci1hdXRvW2RhdGEtcG9wcGVyLXBsYWNlbWVudF49XCJsZWZ0XCJdPi5wb3BvdmVyLWFycm93OjpiZWZvcmUsLmJzLXBvcG92ZXItc3RhcnQ+LnBvcG92ZXItYXJyb3c6OmFmdGVyLC5icy1wb3BvdmVyLWF1dG9bZGF0YS1wb3BwZXItcGxhY2VtZW50Xj1cImxlZnRcIl0+LnBvcG92ZXItYXJyb3c6OmFmdGVye2JvcmRlci13aWR0aDpjYWxjKHZhcigtLWJzLXBvcG92ZXItYXJyb3ctd2lkdGgpICogLjUpIDAgY2FsYyh2YXIoLS1icy1wb3BvdmVyLWFycm93LXdpZHRoKSAqIC41KSB2YXIoLS1icy1wb3BvdmVyLWFycm93LWhlaWdodCl9LmJzLXBvcG92ZXItc3RhcnQ+LnBvcG92ZXItYXJyb3c6OmJlZm9yZSwuYnMtcG9wb3Zlci1hdXRvW2RhdGEtcG9wcGVyLXBsYWNlbWVudF49XCJsZWZ0XCJdPi5wb3BvdmVyLWFycm93OjpiZWZvcmV7cmlnaHQ6MDtib3JkZXItbGVmdC1jb2xvcjp2YXIoLS1icy1wb3BvdmVyLWFycm93LWJvcmRlcil9LmJzLXBvcG92ZXItc3RhcnQ+LnBvcG92ZXItYXJyb3c6OmFmdGVyLC5icy1wb3BvdmVyLWF1dG9bZGF0YS1wb3BwZXItcGxhY2VtZW50Xj1cImxlZnRcIl0+LnBvcG92ZXItYXJyb3c6OmFmdGVye3JpZ2h0OnZhcigtLWJzLXBvcG92ZXItYm9yZGVyLXdpZHRoKTtib3JkZXItbGVmdC1jb2xvcjp2YXIoLS1icy1wb3BvdmVyLWJnKX0ucG9wb3Zlci1oZWFkZXJ7cGFkZGluZzp2YXIoLS1icy1wb3BvdmVyLWhlYWRlci1wYWRkaW5nLXkpIHZhcigtLWJzLXBvcG92ZXItaGVhZGVyLXBhZGRpbmcteCk7bWFyZ2luLWJvdHRvbTowO2ZvbnQtc2l6ZTp2YXIoLS1icy1wb3BvdmVyLWhlYWRlci1mb250LXNpemUpO2NvbG9yOnZhcigtLWJzLXBvcG92ZXItaGVhZGVyLWNvbG9yKTtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWJzLXBvcG92ZXItaGVhZGVyLWJnKTtib3JkZXItYm90dG9tOnZhcigtLWJzLXBvcG92ZXItYm9yZGVyLXdpZHRoKSBzb2xpZCB2YXIoLS1icy1wb3BvdmVyLWJvcmRlci1jb2xvcik7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czp2YXIoLS1icy1wb3BvdmVyLWlubmVyLWJvcmRlci1yYWRpdXMpO2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOnZhcigtLWJzLXBvcG92ZXItaW5uZXItYm9yZGVyLXJhZGl1cyl9LnBvcG92ZXItaGVhZGVyOmVtcHR5e2Rpc3BsYXk6bm9uZX0ucG9wb3Zlci1ib2R5e3BhZGRpbmc6dmFyKC0tYnMtcG9wb3Zlci1ib2R5LXBhZGRpbmcteSkgdmFyKC0tYnMtcG9wb3Zlci1ib2R5LXBhZGRpbmcteCk7Y29sb3I6dmFyKC0tYnMtcG9wb3Zlci1ib2R5LWNvbG9yKX0uY2Fyb3VzZWx7cG9zaXRpb246cmVsYXRpdmV9LmNhcm91c2VsLnBvaW50ZXItZXZlbnR7dG91Y2gtYWN0aW9uOnBhbi15fS5jYXJvdXNlbC1pbm5lcntwb3NpdGlvbjpyZWxhdGl2ZTt3aWR0aDoxMDAlO292ZXJmbG93OmhpZGRlbn0uY2Fyb3VzZWwtaW5uZXI6OmFmdGVye2Rpc3BsYXk6YmxvY2s7Y2xlYXI6Ym90aDtjb250ZW50OlwiXCJ9LmNhcm91c2VsLWl0ZW17cG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTpub25lO2Zsb2F0OmxlZnQ7d2lkdGg6MTAwJTttYXJnaW4tcmlnaHQ6LTEwMCU7YmFja2ZhY2UtdmlzaWJpbGl0eTpoaWRkZW47dHJhbnNpdGlvbjp0cmFuc2Zvcm0gLjZzIGVhc2UtaW4tb3V0fUBtZWRpYSAocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogcmVkdWNlKXsuY2Fyb3VzZWwtaXRlbXt0cmFuc2l0aW9uOm5vbmV9fS5jYXJvdXNlbC1pdGVtLmFjdGl2ZSwuY2Fyb3VzZWwtaXRlbS1uZXh0LC5jYXJvdXNlbC1pdGVtLXByZXZ7ZGlzcGxheTpibG9ja30uY2Fyb3VzZWwtaXRlbS1uZXh0Om5vdCguY2Fyb3VzZWwtaXRlbS1zdGFydCksLmFjdGl2ZS5jYXJvdXNlbC1pdGVtLWVuZHt0cmFuc2Zvcm06dHJhbnNsYXRlWCgxMDAlKX0uY2Fyb3VzZWwtaXRlbS1wcmV2Om5vdCguY2Fyb3VzZWwtaXRlbS1lbmQpLC5hY3RpdmUuY2Fyb3VzZWwtaXRlbS1zdGFydHt0cmFuc2Zvcm06dHJhbnNsYXRlWCgtMTAwJSl9LmNhcm91c2VsLWZhZGUgLmNhcm91c2VsLWl0ZW17b3BhY2l0eTowO3RyYW5zaXRpb24tcHJvcGVydHk6b3BhY2l0eTt0cmFuc2Zvcm06bm9uZX0uY2Fyb3VzZWwtZmFkZSAuY2Fyb3VzZWwtaXRlbS5hY3RpdmUsLmNhcm91c2VsLWZhZGUgLmNhcm91c2VsLWl0ZW0tbmV4dC5jYXJvdXNlbC1pdGVtLXN0YXJ0LC5jYXJvdXNlbC1mYWRlIC5jYXJvdXNlbC1pdGVtLXByZXYuY2Fyb3VzZWwtaXRlbS1lbmR7ei1pbmRleDoxO29wYWNpdHk6MX0uY2Fyb3VzZWwtZmFkZSAuYWN0aXZlLmNhcm91c2VsLWl0ZW0tc3RhcnQsLmNhcm91c2VsLWZhZGUgLmFjdGl2ZS5jYXJvdXNlbC1pdGVtLWVuZHt6LWluZGV4OjA7b3BhY2l0eTowO3RyYW5zaXRpb246b3BhY2l0eSAwcyAuNnN9QG1lZGlhIChwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2Upey5jYXJvdXNlbC1mYWRlIC5hY3RpdmUuY2Fyb3VzZWwtaXRlbS1zdGFydCwuY2Fyb3VzZWwtZmFkZSAuYWN0aXZlLmNhcm91c2VsLWl0ZW0tZW5ke3RyYW5zaXRpb246bm9uZX19LmNhcm91c2VsLWNvbnRyb2wtcHJldiwuY2Fyb3VzZWwtY29udHJvbC1uZXh0e3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowO3otaW5kZXg6MTtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7d2lkdGg6MTUlO3BhZGRpbmc6MDtjb2xvcjojZmZmO3RleHQtYWxpZ246Y2VudGVyO2JhY2tncm91bmQ6bm9uZTtib3JkZXI6MDtvcGFjaXR5Oi41O3RyYW5zaXRpb246b3BhY2l0eSAwLjE1cyBlYXNlfUBtZWRpYSAocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogcmVkdWNlKXsuY2Fyb3VzZWwtY29udHJvbC1wcmV2LC5jYXJvdXNlbC1jb250cm9sLW5leHR7dHJhbnNpdGlvbjpub25lfX0uY2Fyb3VzZWwtY29udHJvbC1wcmV2OmhvdmVyLC5jYXJvdXNlbC1jb250cm9sLXByZXY6Zm9jdXMsLmNhcm91c2VsLWNvbnRyb2wtbmV4dDpob3ZlciwuY2Fyb3VzZWwtY29udHJvbC1uZXh0OmZvY3Vze2NvbG9yOiNmZmY7dGV4dC1kZWNvcmF0aW9uOm5vbmU7b3V0bGluZTowO29wYWNpdHk6Ljl9LmNhcm91c2VsLWNvbnRyb2wtcHJldntsZWZ0OjB9LmNhcm91c2VsLWNvbnRyb2wtbmV4dHtyaWdodDowfS5jYXJvdXNlbC1jb250cm9sLXByZXYtaWNvbiwuY2Fyb3VzZWwtY29udHJvbC1uZXh0LWljb257ZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6MnJlbTtoZWlnaHQ6MnJlbTtiYWNrZ3JvdW5kLXJlcGVhdDpuby1yZXBlYXQ7YmFja2dyb3VuZC1wb3NpdGlvbjo1MCU7YmFja2dyb3VuZC1zaXplOjEwMCUgMTAwJX0uY2Fyb3VzZWwtY29udHJvbC1wcmV2LWljb257YmFja2dyb3VuZC1pbWFnZTp1cmwoJHtfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8xN19fX30pfS5jYXJvdXNlbC1jb250cm9sLW5leHQtaWNvbntiYWNrZ3JvdW5kLWltYWdlOnVybCgke19fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzE4X19ffSl9LmNhcm91c2VsLWluZGljYXRvcnN7cG9zaXRpb246YWJzb2x1dGU7cmlnaHQ6MDtib3R0b206MDtsZWZ0OjA7ei1pbmRleDoyO2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO3BhZGRpbmc6MDttYXJnaW4tcmlnaHQ6MTUlO21hcmdpbi1ib3R0b206MXJlbTttYXJnaW4tbGVmdDoxNSV9LmNhcm91c2VsLWluZGljYXRvcnMgW2RhdGEtYnMtdGFyZ2V0XXtib3gtc2l6aW5nOmNvbnRlbnQtYm94O2ZsZXg6MCAxIGF1dG87d2lkdGg6MzBweDtoZWlnaHQ6M3B4O3BhZGRpbmc6MDttYXJnaW4tcmlnaHQ6M3B4O21hcmdpbi1sZWZ0OjNweDt0ZXh0LWluZGVudDotOTk5cHg7Y3Vyc29yOnBvaW50ZXI7YmFja2dyb3VuZC1jb2xvcjojZmZmO2JhY2tncm91bmQtY2xpcDpwYWRkaW5nLWJveDtib3JkZXI6MDtib3JkZXItdG9wOjEwcHggc29saWQgdHJhbnNwYXJlbnQ7Ym9yZGVyLWJvdHRvbToxMHB4IHNvbGlkIHRyYW5zcGFyZW50O29wYWNpdHk6LjU7dHJhbnNpdGlvbjpvcGFjaXR5IDAuNnMgZWFzZX1AbWVkaWEgKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZSl7LmNhcm91c2VsLWluZGljYXRvcnMgW2RhdGEtYnMtdGFyZ2V0XXt0cmFuc2l0aW9uOm5vbmV9fS5jYXJvdXNlbC1pbmRpY2F0b3JzIC5hY3RpdmV7b3BhY2l0eToxfS5jYXJvdXNlbC1jYXB0aW9ue3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0OjE1JTtib3R0b206MS4yNXJlbTtsZWZ0OjE1JTtwYWRkaW5nLXRvcDoxLjI1cmVtO3BhZGRpbmctYm90dG9tOjEuMjVyZW07Y29sb3I6I2ZmZjt0ZXh0LWFsaWduOmNlbnRlcn0uY2Fyb3VzZWwtZGFyayAuY2Fyb3VzZWwtY29udHJvbC1wcmV2LWljb24sLmNhcm91c2VsLWRhcmsgLmNhcm91c2VsLWNvbnRyb2wtbmV4dC1pY29ue2ZpbHRlcjppbnZlcnQoMSkgZ3JheXNjYWxlKDEwMCl9LmNhcm91c2VsLWRhcmsgLmNhcm91c2VsLWluZGljYXRvcnMgW2RhdGEtYnMtdGFyZ2V0XXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9LmNhcm91c2VsLWRhcmsgLmNhcm91c2VsLWNhcHRpb257Y29sb3I6IzAwMH1bZGF0YS1icy10aGVtZT1cImRhcmtcIl0gLmNhcm91c2VsIC5jYXJvdXNlbC1jb250cm9sLXByZXYtaWNvbixbZGF0YS1icy10aGVtZT1cImRhcmtcIl0gLmNhcm91c2VsIC5jYXJvdXNlbC1jb250cm9sLW5leHQtaWNvbixbZGF0YS1icy10aGVtZT1cImRhcmtcIl0uY2Fyb3VzZWwgLmNhcm91c2VsLWNvbnRyb2wtcHJldi1pY29uLFtkYXRhLWJzLXRoZW1lPVwiZGFya1wiXS5jYXJvdXNlbCAuY2Fyb3VzZWwtY29udHJvbC1uZXh0LWljb257ZmlsdGVyOmludmVydCgxKSBncmF5c2NhbGUoMTAwKX1bZGF0YS1icy10aGVtZT1cImRhcmtcIl0gLmNhcm91c2VsIC5jYXJvdXNlbC1pbmRpY2F0b3JzIFtkYXRhLWJzLXRhcmdldF0sW2RhdGEtYnMtdGhlbWU9XCJkYXJrXCJdLmNhcm91c2VsIC5jYXJvdXNlbC1pbmRpY2F0b3JzIFtkYXRhLWJzLXRhcmdldF17YmFja2dyb3VuZC1jb2xvcjojMDAwfVtkYXRhLWJzLXRoZW1lPVwiZGFya1wiXSAuY2Fyb3VzZWwgLmNhcm91c2VsLWNhcHRpb24sW2RhdGEtYnMtdGhlbWU9XCJkYXJrXCJdLmNhcm91c2VsIC5jYXJvdXNlbC1jYXB0aW9ue2NvbG9yOiMwMDB9LnNwaW5uZXItZ3Jvdywuc3Bpbm5lci1ib3JkZXJ7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6dmFyKC0tYnMtc3Bpbm5lci13aWR0aCk7aGVpZ2h0OnZhcigtLWJzLXNwaW5uZXItaGVpZ2h0KTt2ZXJ0aWNhbC1hbGlnbjp2YXIoLS1icy1zcGlubmVyLXZlcnRpY2FsLWFsaWduKTtib3JkZXItcmFkaXVzOjUwJTthbmltYXRpb246dmFyKC0tYnMtc3Bpbm5lci1hbmltYXRpb24tc3BlZWQpIGxpbmVhciBpbmZpbml0ZSB2YXIoLS1icy1zcGlubmVyLWFuaW1hdGlvbi1uYW1lKX1Aa2V5ZnJhbWVzIHNwaW5uZXItYm9yZGVye3Rve3RyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKSAvKiBydGw6aWdub3JlICovfX0uc3Bpbm5lci1ib3JkZXJ7LS1icy1zcGlubmVyLXdpZHRoOiAycmVtOy0tYnMtc3Bpbm5lci1oZWlnaHQ6IDJyZW07LS1icy1zcGlubmVyLXZlcnRpY2FsLWFsaWduOiAtLjEyNWVtOy0tYnMtc3Bpbm5lci1ib3JkZXItd2lkdGg6IC4yNWVtOy0tYnMtc3Bpbm5lci1hbmltYXRpb24tc3BlZWQ6IC43NXM7LS1icy1zcGlubmVyLWFuaW1hdGlvbi1uYW1lOiBzcGlubmVyLWJvcmRlcjtib3JkZXI6dmFyKC0tYnMtc3Bpbm5lci1ib3JkZXItd2lkdGgpIHNvbGlkIGN1cnJlbnRjb2xvcjtib3JkZXItcmlnaHQtY29sb3I6dHJhbnNwYXJlbnR9LnNwaW5uZXItYm9yZGVyLXNtey0tYnMtc3Bpbm5lci13aWR0aDogMXJlbTstLWJzLXNwaW5uZXItaGVpZ2h0OiAxcmVtOy0tYnMtc3Bpbm5lci1ib3JkZXItd2lkdGg6IC4yZW19QGtleWZyYW1lcyBzcGlubmVyLWdyb3d7MCV7dHJhbnNmb3JtOnNjYWxlKDApfTUwJXtvcGFjaXR5OjE7dHJhbnNmb3JtOm5vbmV9fS5zcGlubmVyLWdyb3d7LS1icy1zcGlubmVyLXdpZHRoOiAycmVtOy0tYnMtc3Bpbm5lci1oZWlnaHQ6IDJyZW07LS1icy1zcGlubmVyLXZlcnRpY2FsLWFsaWduOiAtLjEyNWVtOy0tYnMtc3Bpbm5lci1hbmltYXRpb24tc3BlZWQ6IC43NXM7LS1icy1zcGlubmVyLWFuaW1hdGlvbi1uYW1lOiBzcGlubmVyLWdyb3c7YmFja2dyb3VuZC1jb2xvcjpjdXJyZW50Y29sb3I7b3BhY2l0eTowfS5zcGlubmVyLWdyb3ctc217LS1icy1zcGlubmVyLXdpZHRoOiAxcmVtOy0tYnMtc3Bpbm5lci1oZWlnaHQ6IDFyZW19QG1lZGlhIChwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2Upey5zcGlubmVyLWJvcmRlciwuc3Bpbm5lci1ncm93ey0tYnMtc3Bpbm5lci1hbmltYXRpb24tc3BlZWQ6IDEuNXN9fS5vZmZjYW52YXMtc20sLm9mZmNhbnZhcy1tZCwub2ZmY2FudmFzLWxnLC5vZmZjYW52YXMteGwsLm9mZmNhbnZhcy14eGwsLm9mZmNhbnZhc3stLWJzLW9mZmNhbnZhcy16aW5kZXg6IDEwNDU7LS1icy1vZmZjYW52YXMtd2lkdGg6IDQwMHB4Oy0tYnMtb2ZmY2FudmFzLWhlaWdodDogMzB2aDstLWJzLW9mZmNhbnZhcy1wYWRkaW5nLXg6IDFyZW07LS1icy1vZmZjYW52YXMtcGFkZGluZy15OiAxcmVtOy0tYnMtb2ZmY2FudmFzLWNvbG9yOiB2YXIoLS1icy1ib2R5LWNvbG9yKTstLWJzLW9mZmNhbnZhcy1iZzogdmFyKC0tYnMtYm9keS1iZyk7LS1icy1vZmZjYW52YXMtYm9yZGVyLXdpZHRoOiB2YXIoLS1icy1ib3JkZXItd2lkdGgpOy0tYnMtb2ZmY2FudmFzLWJvcmRlci1jb2xvcjogdmFyKC0tYnMtYm9yZGVyLWNvbG9yLXRyYW5zbHVjZW50KTstLWJzLW9mZmNhbnZhcy1ib3gtc2hhZG93OiB2YXIoLS1icy1ib3gtc2hhZG93LXNtKTstLWJzLW9mZmNhbnZhcy10cmFuc2l0aW9uOiB0cmFuc2Zvcm0gLjNzIGVhc2UtaW4tb3V0Oy0tYnMtb2ZmY2FudmFzLXRpdGxlLWxpbmUtaGVpZ2h0OiAxLjV9QG1lZGlhIChtYXgtd2lkdGg6IDU3NS45OHB4KXsub2ZmY2FudmFzLXNte3Bvc2l0aW9uOmZpeGVkO2JvdHRvbTowO3otaW5kZXg6dmFyKC0tYnMtb2ZmY2FudmFzLXppbmRleCk7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttYXgtd2lkdGg6MTAwJTtjb2xvcjp2YXIoLS1icy1vZmZjYW52YXMtY29sb3IpO3Zpc2liaWxpdHk6aGlkZGVuO2JhY2tncm91bmQtY29sb3I6dmFyKC0tYnMtb2ZmY2FudmFzLWJnKTtiYWNrZ3JvdW5kLWNsaXA6cGFkZGluZy1ib3g7b3V0bGluZTowO3RyYW5zaXRpb246dmFyKC0tYnMtb2ZmY2FudmFzLXRyYW5zaXRpb24pfX1AbWVkaWEgKG1heC13aWR0aDogNTc1Ljk4cHgpIGFuZCAocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogcmVkdWNlKXsub2ZmY2FudmFzLXNte3RyYW5zaXRpb246bm9uZX19QG1lZGlhIChtYXgtd2lkdGg6IDU3NS45OHB4KXsub2ZmY2FudmFzLXNtLm9mZmNhbnZhcy1zdGFydHt0b3A6MDtsZWZ0OjA7d2lkdGg6dmFyKC0tYnMtb2ZmY2FudmFzLXdpZHRoKTtib3JkZXItcmlnaHQ6dmFyKC0tYnMtb2ZmY2FudmFzLWJvcmRlci13aWR0aCkgc29saWQgdmFyKC0tYnMtb2ZmY2FudmFzLWJvcmRlci1jb2xvcik7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTEwMCUpfS5vZmZjYW52YXMtc20ub2ZmY2FudmFzLWVuZHt0b3A6MDtyaWdodDowO3dpZHRoOnZhcigtLWJzLW9mZmNhbnZhcy13aWR0aCk7Ym9yZGVyLWxlZnQ6dmFyKC0tYnMtb2ZmY2FudmFzLWJvcmRlci13aWR0aCkgc29saWQgdmFyKC0tYnMtb2ZmY2FudmFzLWJvcmRlci1jb2xvcik7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoMTAwJSl9Lm9mZmNhbnZhcy1zbS5vZmZjYW52YXMtdG9we3RvcDowO3JpZ2h0OjA7bGVmdDowO2hlaWdodDp2YXIoLS1icy1vZmZjYW52YXMtaGVpZ2h0KTttYXgtaGVpZ2h0OjEwMCU7Ym9yZGVyLWJvdHRvbTp2YXIoLS1icy1vZmZjYW52YXMtYm9yZGVyLXdpZHRoKSBzb2xpZCB2YXIoLS1icy1vZmZjYW52YXMtYm9yZGVyLWNvbG9yKTt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMTAwJSl9Lm9mZmNhbnZhcy1zbS5vZmZjYW52YXMtYm90dG9te3JpZ2h0OjA7bGVmdDowO2hlaWdodDp2YXIoLS1icy1vZmZjYW52YXMtaGVpZ2h0KTttYXgtaGVpZ2h0OjEwMCU7Ym9yZGVyLXRvcDp2YXIoLS1icy1vZmZjYW52YXMtYm9yZGVyLXdpZHRoKSBzb2xpZCB2YXIoLS1icy1vZmZjYW52YXMtYm9yZGVyLWNvbG9yKTt0cmFuc2Zvcm06dHJhbnNsYXRlWSgxMDAlKX0ub2ZmY2FudmFzLXNtLnNob3dpbmcsLm9mZmNhbnZhcy1zbS5zaG93Om5vdCguaGlkaW5nKXt0cmFuc2Zvcm06bm9uZX0ub2ZmY2FudmFzLXNtLnNob3dpbmcsLm9mZmNhbnZhcy1zbS5oaWRpbmcsLm9mZmNhbnZhcy1zbS5zaG93e3Zpc2liaWxpdHk6dmlzaWJsZX19QG1lZGlhIChtaW4td2lkdGg6IDU3NnB4KXsub2ZmY2FudmFzLXNtey0tYnMtb2ZmY2FudmFzLWhlaWdodDogYXV0bzstLWJzLW9mZmNhbnZhcy1ib3JkZXItd2lkdGg6IDA7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCAhaW1wb3J0YW50fS5vZmZjYW52YXMtc20gLm9mZmNhbnZhcy1oZWFkZXJ7ZGlzcGxheTpub25lfS5vZmZjYW52YXMtc20gLm9mZmNhbnZhcy1ib2R5e2Rpc3BsYXk6ZmxleDtmbGV4LWdyb3c6MDtwYWRkaW5nOjA7b3ZlcmZsb3cteTp2aXNpYmxlO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQgIWltcG9ydGFudH19QG1lZGlhIChtYXgtd2lkdGg6IDc2Ny45OHB4KXsub2ZmY2FudmFzLW1ke3Bvc2l0aW9uOmZpeGVkO2JvdHRvbTowO3otaW5kZXg6dmFyKC0tYnMtb2ZmY2FudmFzLXppbmRleCk7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttYXgtd2lkdGg6MTAwJTtjb2xvcjp2YXIoLS1icy1vZmZjYW52YXMtY29sb3IpO3Zpc2liaWxpdHk6aGlkZGVuO2JhY2tncm91bmQtY29sb3I6dmFyKC0tYnMtb2ZmY2FudmFzLWJnKTtiYWNrZ3JvdW5kLWNsaXA6cGFkZGluZy1ib3g7b3V0bGluZTowO3RyYW5zaXRpb246dmFyKC0tYnMtb2ZmY2FudmFzLXRyYW5zaXRpb24pfX1AbWVkaWEgKG1heC13aWR0aDogNzY3Ljk4cHgpIGFuZCAocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogcmVkdWNlKXsub2ZmY2FudmFzLW1ke3RyYW5zaXRpb246bm9uZX19QG1lZGlhIChtYXgtd2lkdGg6IDc2Ny45OHB4KXsub2ZmY2FudmFzLW1kLm9mZmNhbnZhcy1zdGFydHt0b3A6MDtsZWZ0OjA7d2lkdGg6dmFyKC0tYnMtb2ZmY2FudmFzLXdpZHRoKTtib3JkZXItcmlnaHQ6dmFyKC0tYnMtb2ZmY2FudmFzLWJvcmRlci13aWR0aCkgc29saWQgdmFyKC0tYnMtb2ZmY2FudmFzLWJvcmRlci1jb2xvcik7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTEwMCUpfS5vZmZjYW52YXMtbWQub2ZmY2FudmFzLWVuZHt0b3A6MDtyaWdodDowO3dpZHRoOnZhcigtLWJzLW9mZmNhbnZhcy13aWR0aCk7Ym9yZGVyLWxlZnQ6dmFyKC0tYnMtb2ZmY2FudmFzLWJvcmRlci13aWR0aCkgc29saWQgdmFyKC0tYnMtb2ZmY2FudmFzLWJvcmRlci1jb2xvcik7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoMTAwJSl9Lm9mZmNhbnZhcy1tZC5vZmZjYW52YXMtdG9we3RvcDowO3JpZ2h0OjA7bGVmdDowO2hlaWdodDp2YXIoLS1icy1vZmZjYW52YXMtaGVpZ2h0KTttYXgtaGVpZ2h0OjEwMCU7Ym9yZGVyLWJvdHRvbTp2YXIoLS1icy1vZmZjYW52YXMtYm9yZGVyLXdpZHRoKSBzb2xpZCB2YXIoLS1icy1vZmZjYW52YXMtYm9yZGVyLWNvbG9yKTt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMTAwJSl9Lm9mZmNhbnZhcy1tZC5vZmZjYW52YXMtYm90dG9te3JpZ2h0OjA7bGVmdDowO2hlaWdodDp2YXIoLS1icy1vZmZjYW52YXMtaGVpZ2h0KTttYXgtaGVpZ2h0OjEwMCU7Ym9yZGVyLXRvcDp2YXIoLS1icy1vZmZjYW52YXMtYm9yZGVyLXdpZHRoKSBzb2xpZCB2YXIoLS1icy1vZmZjYW52YXMtYm9yZGVyLWNvbG9yKTt0cmFuc2Zvcm06dHJhbnNsYXRlWSgxMDAlKX0ub2ZmY2FudmFzLW1kLnNob3dpbmcsLm9mZmNhbnZhcy1tZC5zaG93Om5vdCguaGlkaW5nKXt0cmFuc2Zvcm06bm9uZX0ub2ZmY2FudmFzLW1kLnNob3dpbmcsLm9mZmNhbnZhcy1tZC5oaWRpbmcsLm9mZmNhbnZhcy1tZC5zaG93e3Zpc2liaWxpdHk6dmlzaWJsZX19QG1lZGlhIChtaW4td2lkdGg6IDc2OHB4KXsub2ZmY2FudmFzLW1key0tYnMtb2ZmY2FudmFzLWhlaWdodDogYXV0bzstLWJzLW9mZmNhbnZhcy1ib3JkZXItd2lkdGg6IDA7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCAhaW1wb3J0YW50fS5vZmZjYW52YXMtbWQgLm9mZmNhbnZhcy1oZWFkZXJ7ZGlzcGxheTpub25lfS5vZmZjYW52YXMtbWQgLm9mZmNhbnZhcy1ib2R5e2Rpc3BsYXk6ZmxleDtmbGV4LWdyb3c6MDtwYWRkaW5nOjA7b3ZlcmZsb3cteTp2aXNpYmxlO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQgIWltcG9ydGFudH19QG1lZGlhIChtYXgtd2lkdGg6IDk5MS45OHB4KXsub2ZmY2FudmFzLWxne3Bvc2l0aW9uOmZpeGVkO2JvdHRvbTowO3otaW5kZXg6dmFyKC0tYnMtb2ZmY2FudmFzLXppbmRleCk7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttYXgtd2lkdGg6MTAwJTtjb2xvcjp2YXIoLS1icy1vZmZjYW52YXMtY29sb3IpO3Zpc2liaWxpdHk6aGlkZGVuO2JhY2tncm91bmQtY29sb3I6dmFyKC0tYnMtb2ZmY2FudmFzLWJnKTtiYWNrZ3JvdW5kLWNsaXA6cGFkZGluZy1ib3g7b3V0bGluZTowO3RyYW5zaXRpb246dmFyKC0tYnMtb2ZmY2FudmFzLXRyYW5zaXRpb24pfX1AbWVkaWEgKG1heC13aWR0aDogOTkxLjk4cHgpIGFuZCAocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogcmVkdWNlKXsub2ZmY2FudmFzLWxne3RyYW5zaXRpb246bm9uZX19QG1lZGlhIChtYXgtd2lkdGg6IDk5MS45OHB4KXsub2ZmY2FudmFzLWxnLm9mZmNhbnZhcy1zdGFydHt0b3A6MDtsZWZ0OjA7d2lkdGg6dmFyKC0tYnMtb2ZmY2FudmFzLXdpZHRoKTtib3JkZXItcmlnaHQ6dmFyKC0tYnMtb2ZmY2FudmFzLWJvcmRlci13aWR0aCkgc29saWQgdmFyKC0tYnMtb2ZmY2FudmFzLWJvcmRlci1jb2xvcik7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTEwMCUpfS5vZmZjYW52YXMtbGcub2ZmY2FudmFzLWVuZHt0b3A6MDtyaWdodDowO3dpZHRoOnZhcigtLWJzLW9mZmNhbnZhcy13aWR0aCk7Ym9yZGVyLWxlZnQ6dmFyKC0tYnMtb2ZmY2FudmFzLWJvcmRlci13aWR0aCkgc29saWQgdmFyKC0tYnMtb2ZmY2FudmFzLWJvcmRlci1jb2xvcik7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoMTAwJSl9Lm9mZmNhbnZhcy1sZy5vZmZjYW52YXMtdG9we3RvcDowO3JpZ2h0OjA7bGVmdDowO2hlaWdodDp2YXIoLS1icy1vZmZjYW52YXMtaGVpZ2h0KTttYXgtaGVpZ2h0OjEwMCU7Ym9yZGVyLWJvdHRvbTp2YXIoLS1icy1vZmZjYW52YXMtYm9yZGVyLXdpZHRoKSBzb2xpZCB2YXIoLS1icy1vZmZjYW52YXMtYm9yZGVyLWNvbG9yKTt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMTAwJSl9Lm9mZmNhbnZhcy1sZy5vZmZjYW52YXMtYm90dG9te3JpZ2h0OjA7bGVmdDowO2hlaWdodDp2YXIoLS1icy1vZmZjYW52YXMtaGVpZ2h0KTttYXgtaGVpZ2h0OjEwMCU7Ym9yZGVyLXRvcDp2YXIoLS1icy1vZmZjYW52YXMtYm9yZGVyLXdpZHRoKSBzb2xpZCB2YXIoLS1icy1vZmZjYW52YXMtYm9yZGVyLWNvbG9yKTt0cmFuc2Zvcm06dHJhbnNsYXRlWSgxMDAlKX0ub2ZmY2FudmFzLWxnLnNob3dpbmcsLm9mZmNhbnZhcy1sZy5zaG93Om5vdCguaGlkaW5nKXt0cmFuc2Zvcm06bm9uZX0ub2ZmY2FudmFzLWxnLnNob3dpbmcsLm9mZmNhbnZhcy1sZy5oaWRpbmcsLm9mZmNhbnZhcy1sZy5zaG93e3Zpc2liaWxpdHk6dmlzaWJsZX19QG1lZGlhIChtaW4td2lkdGg6IDk5MnB4KXsub2ZmY2FudmFzLWxney0tYnMtb2ZmY2FudmFzLWhlaWdodDogYXV0bzstLWJzLW9mZmNhbnZhcy1ib3JkZXItd2lkdGg6IDA7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCAhaW1wb3J0YW50fS5vZmZjYW52YXMtbGcgLm9mZmNhbnZhcy1oZWFkZXJ7ZGlzcGxheTpub25lfS5vZmZjYW52YXMtbGcgLm9mZmNhbnZhcy1ib2R5e2Rpc3BsYXk6ZmxleDtmbGV4LWdyb3c6MDtwYWRkaW5nOjA7b3ZlcmZsb3cteTp2aXNpYmxlO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQgIWltcG9ydGFudH19QG1lZGlhIChtYXgtd2lkdGg6IDExOTkuOThweCl7Lm9mZmNhbnZhcy14bHtwb3NpdGlvbjpmaXhlZDtib3R0b206MDt6LWluZGV4OnZhcigtLWJzLW9mZmNhbnZhcy16aW5kZXgpO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47bWF4LXdpZHRoOjEwMCU7Y29sb3I6dmFyKC0tYnMtb2ZmY2FudmFzLWNvbG9yKTt2aXNpYmlsaXR5OmhpZGRlbjtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWJzLW9mZmNhbnZhcy1iZyk7YmFja2dyb3VuZC1jbGlwOnBhZGRpbmctYm94O291dGxpbmU6MDt0cmFuc2l0aW9uOnZhcigtLWJzLW9mZmNhbnZhcy10cmFuc2l0aW9uKX19QG1lZGlhIChtYXgtd2lkdGg6IDExOTkuOThweCkgYW5kIChwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2Upey5vZmZjYW52YXMteGx7dHJhbnNpdGlvbjpub25lfX1AbWVkaWEgKG1heC13aWR0aDogMTE5OS45OHB4KXsub2ZmY2FudmFzLXhsLm9mZmNhbnZhcy1zdGFydHt0b3A6MDtsZWZ0OjA7d2lkdGg6dmFyKC0tYnMtb2ZmY2FudmFzLXdpZHRoKTtib3JkZXItcmlnaHQ6dmFyKC0tYnMtb2ZmY2FudmFzLWJvcmRlci13aWR0aCkgc29saWQgdmFyKC0tYnMtb2ZmY2FudmFzLWJvcmRlci1jb2xvcik7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTEwMCUpfS5vZmZjYW52YXMteGwub2ZmY2FudmFzLWVuZHt0b3A6MDtyaWdodDowO3dpZHRoOnZhcigtLWJzLW9mZmNhbnZhcy13aWR0aCk7Ym9yZGVyLWxlZnQ6dmFyKC0tYnMtb2ZmY2FudmFzLWJvcmRlci13aWR0aCkgc29saWQgdmFyKC0tYnMtb2ZmY2FudmFzLWJvcmRlci1jb2xvcik7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoMTAwJSl9Lm9mZmNhbnZhcy14bC5vZmZjYW52YXMtdG9we3RvcDowO3JpZ2h0OjA7bGVmdDowO2hlaWdodDp2YXIoLS1icy1vZmZjYW52YXMtaGVpZ2h0KTttYXgtaGVpZ2h0OjEwMCU7Ym9yZGVyLWJvdHRvbTp2YXIoLS1icy1vZmZjYW52YXMtYm9yZGVyLXdpZHRoKSBzb2xpZCB2YXIoLS1icy1vZmZjYW52YXMtYm9yZGVyLWNvbG9yKTt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMTAwJSl9Lm9mZmNhbnZhcy14bC5vZmZjYW52YXMtYm90dG9te3JpZ2h0OjA7bGVmdDowO2hlaWdodDp2YXIoLS1icy1vZmZjYW52YXMtaGVpZ2h0KTttYXgtaGVpZ2h0OjEwMCU7Ym9yZGVyLXRvcDp2YXIoLS1icy1vZmZjYW52YXMtYm9yZGVyLXdpZHRoKSBzb2xpZCB2YXIoLS1icy1vZmZjYW52YXMtYm9yZGVyLWNvbG9yKTt0cmFuc2Zvcm06dHJhbnNsYXRlWSgxMDAlKX0ub2ZmY2FudmFzLXhsLnNob3dpbmcsLm9mZmNhbnZhcy14bC5zaG93Om5vdCguaGlkaW5nKXt0cmFuc2Zvcm06bm9uZX0ub2ZmY2FudmFzLXhsLnNob3dpbmcsLm9mZmNhbnZhcy14bC5oaWRpbmcsLm9mZmNhbnZhcy14bC5zaG93e3Zpc2liaWxpdHk6dmlzaWJsZX19QG1lZGlhIChtaW4td2lkdGg6IDEyMDBweCl7Lm9mZmNhbnZhcy14bHstLWJzLW9mZmNhbnZhcy1oZWlnaHQ6IGF1dG87LS1icy1vZmZjYW52YXMtYm9yZGVyLXdpZHRoOiAwO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQgIWltcG9ydGFudH0ub2ZmY2FudmFzLXhsIC5vZmZjYW52YXMtaGVhZGVye2Rpc3BsYXk6bm9uZX0ub2ZmY2FudmFzLXhsIC5vZmZjYW52YXMtYm9keXtkaXNwbGF5OmZsZXg7ZmxleC1ncm93OjA7cGFkZGluZzowO292ZXJmbG93LXk6dmlzaWJsZTtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50ICFpbXBvcnRhbnR9fUBtZWRpYSAobWF4LXdpZHRoOiAxMzk5Ljk4cHgpey5vZmZjYW52YXMteHhse3Bvc2l0aW9uOmZpeGVkO2JvdHRvbTowO3otaW5kZXg6dmFyKC0tYnMtb2ZmY2FudmFzLXppbmRleCk7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttYXgtd2lkdGg6MTAwJTtjb2xvcjp2YXIoLS1icy1vZmZjYW52YXMtY29sb3IpO3Zpc2liaWxpdHk6aGlkZGVuO2JhY2tncm91bmQtY29sb3I6dmFyKC0tYnMtb2ZmY2FudmFzLWJnKTtiYWNrZ3JvdW5kLWNsaXA6cGFkZGluZy1ib3g7b3V0bGluZTowO3RyYW5zaXRpb246dmFyKC0tYnMtb2ZmY2FudmFzLXRyYW5zaXRpb24pfX1AbWVkaWEgKG1heC13aWR0aDogMTM5OS45OHB4KSBhbmQgKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZSl7Lm9mZmNhbnZhcy14eGx7dHJhbnNpdGlvbjpub25lfX1AbWVkaWEgKG1heC13aWR0aDogMTM5OS45OHB4KXsub2ZmY2FudmFzLXh4bC5vZmZjYW52YXMtc3RhcnR7dG9wOjA7bGVmdDowO3dpZHRoOnZhcigtLWJzLW9mZmNhbnZhcy13aWR0aCk7Ym9yZGVyLXJpZ2h0OnZhcigtLWJzLW9mZmNhbnZhcy1ib3JkZXItd2lkdGgpIHNvbGlkIHZhcigtLWJzLW9mZmNhbnZhcy1ib3JkZXItY29sb3IpO3RyYW5zZm9ybTp0cmFuc2xhdGVYKC0xMDAlKX0ub2ZmY2FudmFzLXh4bC5vZmZjYW52YXMtZW5ke3RvcDowO3JpZ2h0OjA7d2lkdGg6dmFyKC0tYnMtb2ZmY2FudmFzLXdpZHRoKTtib3JkZXItbGVmdDp2YXIoLS1icy1vZmZjYW52YXMtYm9yZGVyLXdpZHRoKSBzb2xpZCB2YXIoLS1icy1vZmZjYW52YXMtYm9yZGVyLWNvbG9yKTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgxMDAlKX0ub2ZmY2FudmFzLXh4bC5vZmZjYW52YXMtdG9we3RvcDowO3JpZ2h0OjA7bGVmdDowO2hlaWdodDp2YXIoLS1icy1vZmZjYW52YXMtaGVpZ2h0KTttYXgtaGVpZ2h0OjEwMCU7Ym9yZGVyLWJvdHRvbTp2YXIoLS1icy1vZmZjYW52YXMtYm9yZGVyLXdpZHRoKSBzb2xpZCB2YXIoLS1icy1vZmZjYW52YXMtYm9yZGVyLWNvbG9yKTt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMTAwJSl9Lm9mZmNhbnZhcy14eGwub2ZmY2FudmFzLWJvdHRvbXtyaWdodDowO2xlZnQ6MDtoZWlnaHQ6dmFyKC0tYnMtb2ZmY2FudmFzLWhlaWdodCk7bWF4LWhlaWdodDoxMDAlO2JvcmRlci10b3A6dmFyKC0tYnMtb2ZmY2FudmFzLWJvcmRlci13aWR0aCkgc29saWQgdmFyKC0tYnMtb2ZmY2FudmFzLWJvcmRlci1jb2xvcik7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoMTAwJSl9Lm9mZmNhbnZhcy14eGwuc2hvd2luZywub2ZmY2FudmFzLXh4bC5zaG93Om5vdCguaGlkaW5nKXt0cmFuc2Zvcm06bm9uZX0ub2ZmY2FudmFzLXh4bC5zaG93aW5nLC5vZmZjYW52YXMteHhsLmhpZGluZywub2ZmY2FudmFzLXh4bC5zaG93e3Zpc2liaWxpdHk6dmlzaWJsZX19QG1lZGlhIChtaW4td2lkdGg6IDE0MDBweCl7Lm9mZmNhbnZhcy14eGx7LS1icy1vZmZjYW52YXMtaGVpZ2h0OiBhdXRvOy0tYnMtb2ZmY2FudmFzLWJvcmRlci13aWR0aDogMDtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50ICFpbXBvcnRhbnR9Lm9mZmNhbnZhcy14eGwgLm9mZmNhbnZhcy1oZWFkZXJ7ZGlzcGxheTpub25lfS5vZmZjYW52YXMteHhsIC5vZmZjYW52YXMtYm9keXtkaXNwbGF5OmZsZXg7ZmxleC1ncm93OjA7cGFkZGluZzowO292ZXJmbG93LXk6dmlzaWJsZTtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50ICFpbXBvcnRhbnR9fS5vZmZjYW52YXN7cG9zaXRpb246Zml4ZWQ7Ym90dG9tOjA7ei1pbmRleDp2YXIoLS1icy1vZmZjYW52YXMtemluZGV4KTtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO21heC13aWR0aDoxMDAlO2NvbG9yOnZhcigtLWJzLW9mZmNhbnZhcy1jb2xvcik7dmlzaWJpbGl0eTpoaWRkZW47YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1icy1vZmZjYW52YXMtYmcpO2JhY2tncm91bmQtY2xpcDpwYWRkaW5nLWJveDtvdXRsaW5lOjA7dHJhbnNpdGlvbjp2YXIoLS1icy1vZmZjYW52YXMtdHJhbnNpdGlvbil9QG1lZGlhIChwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2Upey5vZmZjYW52YXN7dHJhbnNpdGlvbjpub25lfX0ub2ZmY2FudmFzLm9mZmNhbnZhcy1zdGFydHt0b3A6MDtsZWZ0OjA7d2lkdGg6dmFyKC0tYnMtb2ZmY2FudmFzLXdpZHRoKTtib3JkZXItcmlnaHQ6dmFyKC0tYnMtb2ZmY2FudmFzLWJvcmRlci13aWR0aCkgc29saWQgdmFyKC0tYnMtb2ZmY2FudmFzLWJvcmRlci1jb2xvcik7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTEwMCUpfS5vZmZjYW52YXMub2ZmY2FudmFzLWVuZHt0b3A6MDtyaWdodDowO3dpZHRoOnZhcigtLWJzLW9mZmNhbnZhcy13aWR0aCk7Ym9yZGVyLWxlZnQ6dmFyKC0tYnMtb2ZmY2FudmFzLWJvcmRlci13aWR0aCkgc29saWQgdmFyKC0tYnMtb2ZmY2FudmFzLWJvcmRlci1jb2xvcik7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoMTAwJSl9Lm9mZmNhbnZhcy5vZmZjYW52YXMtdG9we3RvcDowO3JpZ2h0OjA7bGVmdDowO2hlaWdodDp2YXIoLS1icy1vZmZjYW52YXMtaGVpZ2h0KTttYXgtaGVpZ2h0OjEwMCU7Ym9yZGVyLWJvdHRvbTp2YXIoLS1icy1vZmZjYW52YXMtYm9yZGVyLXdpZHRoKSBzb2xpZCB2YXIoLS1icy1vZmZjYW52YXMtYm9yZGVyLWNvbG9yKTt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMTAwJSl9Lm9mZmNhbnZhcy5vZmZjYW52YXMtYm90dG9te3JpZ2h0OjA7bGVmdDowO2hlaWdodDp2YXIoLS1icy1vZmZjYW52YXMtaGVpZ2h0KTttYXgtaGVpZ2h0OjEwMCU7Ym9yZGVyLXRvcDp2YXIoLS1icy1vZmZjYW52YXMtYm9yZGVyLXdpZHRoKSBzb2xpZCB2YXIoLS1icy1vZmZjYW52YXMtYm9yZGVyLWNvbG9yKTt0cmFuc2Zvcm06dHJhbnNsYXRlWSgxMDAlKX0ub2ZmY2FudmFzLnNob3dpbmcsLm9mZmNhbnZhcy5zaG93Om5vdCguaGlkaW5nKXt0cmFuc2Zvcm06bm9uZX0ub2ZmY2FudmFzLnNob3dpbmcsLm9mZmNhbnZhcy5oaWRpbmcsLm9mZmNhbnZhcy5zaG93e3Zpc2liaWxpdHk6dmlzaWJsZX0ub2ZmY2FudmFzLWJhY2tkcm9we3Bvc2l0aW9uOmZpeGVkO3RvcDowO2xlZnQ6MDt6LWluZGV4OjEwNDA7d2lkdGg6MTAwdnc7aGVpZ2h0OjEwMHZoO2JhY2tncm91bmQtY29sb3I6IzAwMH0ub2ZmY2FudmFzLWJhY2tkcm9wLmZhZGV7b3BhY2l0eTowfS5vZmZjYW52YXMtYmFja2Ryb3Auc2hvd3tvcGFjaXR5Oi41fS5vZmZjYW52YXMtaGVhZGVye2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47cGFkZGluZzp2YXIoLS1icy1vZmZjYW52YXMtcGFkZGluZy15KSB2YXIoLS1icy1vZmZjYW52YXMtcGFkZGluZy14KX0ub2ZmY2FudmFzLWhlYWRlciAuYnRuLWNsb3Nle3BhZGRpbmc6Y2FsYyh2YXIoLS1icy1vZmZjYW52YXMtcGFkZGluZy15KSAqIC41KSBjYWxjKHZhcigtLWJzLW9mZmNhbnZhcy1wYWRkaW5nLXgpICogLjUpO21hcmdpbi10b3A6Y2FsYygtLjUgKiB2YXIoLS1icy1vZmZjYW52YXMtcGFkZGluZy15KSk7bWFyZ2luLXJpZ2h0OmNhbGMoLS41ICogdmFyKC0tYnMtb2ZmY2FudmFzLXBhZGRpbmcteCkpO21hcmdpbi1ib3R0b206Y2FsYygtLjUgKiB2YXIoLS1icy1vZmZjYW52YXMtcGFkZGluZy15KSl9Lm9mZmNhbnZhcy10aXRsZXttYXJnaW4tYm90dG9tOjA7bGluZS1oZWlnaHQ6dmFyKC0tYnMtb2ZmY2FudmFzLXRpdGxlLWxpbmUtaGVpZ2h0KX0ub2ZmY2FudmFzLWJvZHl7ZmxleC1ncm93OjE7cGFkZGluZzp2YXIoLS1icy1vZmZjYW52YXMtcGFkZGluZy15KSB2YXIoLS1icy1vZmZjYW52YXMtcGFkZGluZy14KTtvdmVyZmxvdy15OmF1dG99LnBsYWNlaG9sZGVye2Rpc3BsYXk6aW5saW5lLWJsb2NrO21pbi1oZWlnaHQ6MWVtO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTtjdXJzb3I6d2FpdDtiYWNrZ3JvdW5kLWNvbG9yOmN1cnJlbnRjb2xvcjtvcGFjaXR5Oi41fS5wbGFjZWhvbGRlci5idG46OmJlZm9yZXtkaXNwbGF5OmlubGluZS1ibG9jaztjb250ZW50OlwiXCJ9LnBsYWNlaG9sZGVyLXhze21pbi1oZWlnaHQ6LjZlbX0ucGxhY2Vob2xkZXItc217bWluLWhlaWdodDouOGVtfS5wbGFjZWhvbGRlci1sZ3ttaW4taGVpZ2h0OjEuMmVtfS5wbGFjZWhvbGRlci1nbG93IC5wbGFjZWhvbGRlcnthbmltYXRpb246cGxhY2Vob2xkZXItZ2xvdyAycyBlYXNlLWluLW91dCBpbmZpbml0ZX1Aa2V5ZnJhbWVzIHBsYWNlaG9sZGVyLWdsb3d7NTAle29wYWNpdHk6LjJ9fS5wbGFjZWhvbGRlci13YXZle21hc2staW1hZ2U6bGluZWFyLWdyYWRpZW50KDEzMGRlZywgIzAwMCA1NSUsIHJnYmEoMCwwLDAsMC44KSA3NSUsICMwMDAgOTUlKTttYXNrLXNpemU6MjAwJSAxMDAlO2FuaW1hdGlvbjpwbGFjZWhvbGRlci13YXZlIDJzIGxpbmVhciBpbmZpbml0ZX1Aa2V5ZnJhbWVzIHBsYWNlaG9sZGVyLXdhdmV7MTAwJXttYXNrLXBvc2l0aW9uOi0yMDAlIDAlfX0uY2xlYXJmaXg6OmFmdGVye2Rpc3BsYXk6YmxvY2s7Y2xlYXI6Ym90aDtjb250ZW50OlwiXCJ9LnRleHQtYmctcHJpbWFyeXtjb2xvcjojZmZmICFpbXBvcnRhbnQ7YmFja2dyb3VuZC1jb2xvcjpSR0JBKHZhcigtLWJzLXByaW1hcnktcmdiKSwgdmFyKC0tYnMtYmctb3BhY2l0eSwgMSkpICFpbXBvcnRhbnR9LmxpbmstcHJpbWFyeXtjb2xvcjpSR0JBKHZhcigtLWJzLXByaW1hcnktcmdiKSwgdmFyKC0tYnMtbGluay1vcGFjaXR5LCAxKSkgIWltcG9ydGFudDt0ZXh0LWRlY29yYXRpb24tY29sb3I6UkdCQSh2YXIoLS1icy1wcmltYXJ5LXJnYiksIHZhcigtLWJzLWxpbmstdW5kZXJsaW5lLW9wYWNpdHksIDEpKSAhaW1wb3J0YW50fS5saW5rLXByaW1hcnk6aG92ZXIsLmxpbmstcHJpbWFyeTpmb2N1c3tjb2xvcjpSR0JBKDUwLDY1LDE0NSwgdmFyKC0tYnMtbGluay1vcGFjaXR5LCAxKSkgIWltcG9ydGFudDt0ZXh0LWRlY29yYXRpb24tY29sb3I6UkdCQSg1MCw2NSwxNDUsIHZhcigtLWJzLWxpbmstdW5kZXJsaW5lLW9wYWNpdHksIDEpKSAhaW1wb3J0YW50fS5saW5rLWJvZHktZW1waGFzaXN7Y29sb3I6UkdCQSh2YXIoLS1icy1lbXBoYXNpcy1jb2xvci1yZ2IpLCB2YXIoLS1icy1saW5rLW9wYWNpdHksIDEpKSAhaW1wb3J0YW50O3RleHQtZGVjb3JhdGlvbi1jb2xvcjpSR0JBKHZhcigtLWJzLWVtcGhhc2lzLWNvbG9yLXJnYiksIHZhcigtLWJzLWxpbmstdW5kZXJsaW5lLW9wYWNpdHksIDEpKSAhaW1wb3J0YW50fS5saW5rLWJvZHktZW1waGFzaXM6aG92ZXIsLmxpbmstYm9keS1lbXBoYXNpczpmb2N1c3tjb2xvcjpSR0JBKHZhcigtLWJzLWVtcGhhc2lzLWNvbG9yLXJnYiksIHZhcigtLWJzLWxpbmstb3BhY2l0eSwgMC43NSkpICFpbXBvcnRhbnQ7dGV4dC1kZWNvcmF0aW9uLWNvbG9yOlJHQkEodmFyKC0tYnMtZW1waGFzaXMtY29sb3ItcmdiKSwgdmFyKC0tYnMtbGluay11bmRlcmxpbmUtb3BhY2l0eSwgMC43NSkpICFpbXBvcnRhbnR9LmZvY3VzLXJpbmc6Zm9jdXN7b3V0bGluZTowO2JveC1zaGFkb3c6dmFyKC0tYnMtZm9jdXMtcmluZy14LCAwKSB2YXIoLS1icy1mb2N1cy1yaW5nLXksIDApIHZhcigtLWJzLWZvY3VzLXJpbmctYmx1ciwgMCkgdmFyKC0tYnMtZm9jdXMtcmluZy13aWR0aCkgdmFyKC0tYnMtZm9jdXMtcmluZy1jb2xvcil9Lmljb24tbGlua3tkaXNwbGF5OmlubGluZS1mbGV4O2dhcDouMzc1cmVtO2FsaWduLWl0ZW1zOmNlbnRlcjt0ZXh0LWRlY29yYXRpb24tY29sb3I6cmdiYSh2YXIoLS1icy1saW5rLWNvbG9yLXJnYiksIHZhcigtLWJzLWxpbmstb3BhY2l0eSwgMC41KSk7dGV4dC11bmRlcmxpbmUtb2Zmc2V0Oi4yNWVtO2JhY2tmYWNlLXZpc2liaWxpdHk6aGlkZGVufS5pY29uLWxpbms+LmJpe2ZsZXgtc2hyaW5rOjA7d2lkdGg6MWVtO2hlaWdodDoxZW07ZmlsbDpjdXJyZW50Y29sb3I7dHJhbnNpdGlvbjowLjJzIGVhc2UtaW4tb3V0IHRyYW5zZm9ybX1AbWVkaWEgKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZSl7Lmljb24tbGluaz4uYml7dHJhbnNpdGlvbjpub25lfX0uaWNvbi1saW5rLWhvdmVyOmhvdmVyPi5iaSwuaWNvbi1saW5rLWhvdmVyOmZvY3VzLXZpc2libGU+LmJpe3RyYW5zZm9ybTp2YXIoLS1icy1pY29uLWxpbmstdHJhbnNmb3JtLCB0cmFuc2xhdGUzZCgwLjI1ZW0sIDAsIDApKX0ucmF0aW97cG9zaXRpb246cmVsYXRpdmU7d2lkdGg6MTAwJX0ucmF0aW86OmJlZm9yZXtkaXNwbGF5OmJsb2NrO3BhZGRpbmctdG9wOnZhcigtLWJzLWFzcGVjdC1yYXRpbyk7Y29udGVudDpcIlwifS5yYXRpbz4qe3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlfS5yYXRpby0xeDF7LS1icy1hc3BlY3QtcmF0aW86IDEwMCV9LnJhdGlvLTR4M3stLWJzLWFzcGVjdC1yYXRpbzogY2FsYygzIC8gNCAqIDEwMCUpfS5yYXRpby0xNng5ey0tYnMtYXNwZWN0LXJhdGlvOiBjYWxjKDkgLyAxNiAqIDEwMCUpfS5yYXRpby0yMXg5ey0tYnMtYXNwZWN0LXJhdGlvOiBjYWxjKDkgLyAyMSAqIDEwMCUpfS5maXhlZC10b3B7cG9zaXRpb246Zml4ZWQ7dG9wOjA7cmlnaHQ6MDtsZWZ0OjA7ei1pbmRleDoxMDMwfS5maXhlZC1ib3R0b217cG9zaXRpb246Zml4ZWQ7cmlnaHQ6MDtib3R0b206MDtsZWZ0OjA7ei1pbmRleDoxMDMwfS5zdGlja3ktdG9we3Bvc2l0aW9uOnN0aWNreTt0b3A6MDt6LWluZGV4OjEwMjB9LnN0aWNreS1ib3R0b217cG9zaXRpb246c3RpY2t5O2JvdHRvbTowO3otaW5kZXg6MTAyMH1AbWVkaWEgKG1pbi13aWR0aDogNTc2cHgpey5zdGlja3ktc20tdG9we3Bvc2l0aW9uOnN0aWNreTt0b3A6MDt6LWluZGV4OjEwMjB9LnN0aWNreS1zbS1ib3R0b217cG9zaXRpb246c3RpY2t5O2JvdHRvbTowO3otaW5kZXg6MTAyMH19QG1lZGlhIChtaW4td2lkdGg6IDc2OHB4KXsuc3RpY2t5LW1kLXRvcHtwb3NpdGlvbjpzdGlja3k7dG9wOjA7ei1pbmRleDoxMDIwfS5zdGlja3ktbWQtYm90dG9te3Bvc2l0aW9uOnN0aWNreTtib3R0b206MDt6LWluZGV4OjEwMjB9fUBtZWRpYSAobWluLXdpZHRoOiA5OTJweCl7LnN0aWNreS1sZy10b3B7cG9zaXRpb246c3RpY2t5O3RvcDowO3otaW5kZXg6MTAyMH0uc3RpY2t5LWxnLWJvdHRvbXtwb3NpdGlvbjpzdGlja3k7Ym90dG9tOjA7ei1pbmRleDoxMDIwfX1AbWVkaWEgKG1pbi13aWR0aDogMTIwMHB4KXsuc3RpY2t5LXhsLXRvcHtwb3NpdGlvbjpzdGlja3k7dG9wOjA7ei1pbmRleDoxMDIwfS5zdGlja3kteGwtYm90dG9te3Bvc2l0aW9uOnN0aWNreTtib3R0b206MDt6LWluZGV4OjEwMjB9fUBtZWRpYSAobWluLXdpZHRoOiAxNDAwcHgpey5zdGlja3kteHhsLXRvcHtwb3NpdGlvbjpzdGlja3k7dG9wOjA7ei1pbmRleDoxMDIwfS5zdGlja3kteHhsLWJvdHRvbXtwb3NpdGlvbjpzdGlja3k7Ym90dG9tOjA7ei1pbmRleDoxMDIwfX0uaHN0YWNre2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpyb3c7YWxpZ24taXRlbXM6Y2VudGVyO2FsaWduLXNlbGY6c3RyZXRjaH0udnN0YWNre2Rpc3BsYXk6ZmxleDtmbGV4OjEgMSBhdXRvO2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjthbGlnbi1zZWxmOnN0cmV0Y2h9LnZpc3VhbGx5LWhpZGRlbiwudmlzdWFsbHktaGlkZGVuLWZvY3VzYWJsZTpub3QoOmZvY3VzKTpub3QoOmZvY3VzLXdpdGhpbil7d2lkdGg6MXB4ICFpbXBvcnRhbnQ7aGVpZ2h0OjFweCAhaW1wb3J0YW50O3BhZGRpbmc6MCAhaW1wb3J0YW50O21hcmdpbjotMXB4ICFpbXBvcnRhbnQ7b3ZlcmZsb3c6aGlkZGVuICFpbXBvcnRhbnQ7Y2xpcDpyZWN0KDAsIDAsIDAsIDApICFpbXBvcnRhbnQ7d2hpdGUtc3BhY2U6bm93cmFwICFpbXBvcnRhbnQ7Ym9yZGVyOjAgIWltcG9ydGFudH0udmlzdWFsbHktaGlkZGVuOm5vdChjYXB0aW9uKSwudmlzdWFsbHktaGlkZGVuLWZvY3VzYWJsZTpub3QoOmZvY3VzKTpub3QoOmZvY3VzLXdpdGhpbik6bm90KGNhcHRpb24pe3Bvc2l0aW9uOmFic29sdXRlICFpbXBvcnRhbnR9LnN0cmV0Y2hlZC1saW5rOjphZnRlcntwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtyaWdodDowO2JvdHRvbTowO2xlZnQ6MDt6LWluZGV4OjE7Y29udGVudDpcIlwifS50ZXh0LXRydW5jYXRle292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO3doaXRlLXNwYWNlOm5vd3JhcH0udnJ7ZGlzcGxheTppbmxpbmUtYmxvY2s7YWxpZ24tc2VsZjpzdHJldGNoO3dpZHRoOnZhcigtLWJzLWJvcmRlci13aWR0aCk7bWluLWhlaWdodDoxZW07YmFja2dyb3VuZC1jb2xvcjpjdXJyZW50Y29sb3I7b3BhY2l0eTouMjV9LmFsaWduLWJhc2VsaW5le3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lICFpbXBvcnRhbnR9LmFsaWduLXRvcHt2ZXJ0aWNhbC1hbGlnbjp0b3AgIWltcG9ydGFudH0uYWxpZ24tbWlkZGxle3ZlcnRpY2FsLWFsaWduOm1pZGRsZSAhaW1wb3J0YW50fS5hbGlnbi1ib3R0b217dmVydGljYWwtYWxpZ246Ym90dG9tICFpbXBvcnRhbnR9LmFsaWduLXRleHQtYm90dG9te3ZlcnRpY2FsLWFsaWduOnRleHQtYm90dG9tICFpbXBvcnRhbnR9LmFsaWduLXRleHQtdG9we3ZlcnRpY2FsLWFsaWduOnRleHQtdG9wICFpbXBvcnRhbnR9LmZsb2F0LXN0YXJ0e2Zsb2F0OmxlZnQgIWltcG9ydGFudH0uZmxvYXQtZW5ke2Zsb2F0OnJpZ2h0ICFpbXBvcnRhbnR9LmZsb2F0LW5vbmV7ZmxvYXQ6bm9uZSAhaW1wb3J0YW50fS5vYmplY3QtZml0LWNvbnRhaW57b2JqZWN0LWZpdDpjb250YWluICFpbXBvcnRhbnR9Lm9iamVjdC1maXQtY292ZXJ7b2JqZWN0LWZpdDpjb3ZlciAhaW1wb3J0YW50fS5vYmplY3QtZml0LWZpbGx7b2JqZWN0LWZpdDpmaWxsICFpbXBvcnRhbnR9Lm9iamVjdC1maXQtc2NhbGV7b2JqZWN0LWZpdDpzY2FsZS1kb3duICFpbXBvcnRhbnR9Lm9iamVjdC1maXQtbm9uZXtvYmplY3QtZml0Om5vbmUgIWltcG9ydGFudH0ub3BhY2l0eS0we29wYWNpdHk6MCAhaW1wb3J0YW50fS5vcGFjaXR5LTI1e29wYWNpdHk6LjI1ICFpbXBvcnRhbnR9Lm9wYWNpdHktNTB7b3BhY2l0eTouNSAhaW1wb3J0YW50fS5vcGFjaXR5LTc1e29wYWNpdHk6Ljc1ICFpbXBvcnRhbnR9Lm9wYWNpdHktMTAwe29wYWNpdHk6MSAhaW1wb3J0YW50fS5vdmVyZmxvdy1hdXRve292ZXJmbG93OmF1dG8gIWltcG9ydGFudH0ub3ZlcmZsb3ctaGlkZGVue292ZXJmbG93OmhpZGRlbiAhaW1wb3J0YW50fS5vdmVyZmxvdy12aXNpYmxle292ZXJmbG93OnZpc2libGUgIWltcG9ydGFudH0ub3ZlcmZsb3ctc2Nyb2xse292ZXJmbG93OnNjcm9sbCAhaW1wb3J0YW50fS5vdmVyZmxvdy14LWF1dG97b3ZlcmZsb3cteDphdXRvICFpbXBvcnRhbnR9Lm92ZXJmbG93LXgtaGlkZGVue292ZXJmbG93LXg6aGlkZGVuICFpbXBvcnRhbnR9Lm92ZXJmbG93LXgtdmlzaWJsZXtvdmVyZmxvdy14OnZpc2libGUgIWltcG9ydGFudH0ub3ZlcmZsb3cteC1zY3JvbGx7b3ZlcmZsb3cteDpzY3JvbGwgIWltcG9ydGFudH0ub3ZlcmZsb3cteS1hdXRve292ZXJmbG93LXk6YXV0byAhaW1wb3J0YW50fS5vdmVyZmxvdy15LWhpZGRlbntvdmVyZmxvdy15OmhpZGRlbiAhaW1wb3J0YW50fS5vdmVyZmxvdy15LXZpc2libGV7b3ZlcmZsb3cteTp2aXNpYmxlICFpbXBvcnRhbnR9Lm92ZXJmbG93LXktc2Nyb2xse292ZXJmbG93LXk6c2Nyb2xsICFpbXBvcnRhbnR9LmQtaW5saW5le2Rpc3BsYXk6aW5saW5lICFpbXBvcnRhbnR9LmQtaW5saW5lLWJsb2Nre2Rpc3BsYXk6aW5saW5lLWJsb2NrICFpbXBvcnRhbnR9LmQtYmxvY2t7ZGlzcGxheTpibG9jayAhaW1wb3J0YW50fS5kLWdyaWR7ZGlzcGxheTpncmlkICFpbXBvcnRhbnR9LmQtaW5saW5lLWdyaWR7ZGlzcGxheTppbmxpbmUtZ3JpZCAhaW1wb3J0YW50fS5kLXRhYmxle2Rpc3BsYXk6dGFibGUgIWltcG9ydGFudH0uZC10YWJsZS1yb3d7ZGlzcGxheTp0YWJsZS1yb3cgIWltcG9ydGFudH0uZC10YWJsZS1jZWxse2Rpc3BsYXk6dGFibGUtY2VsbCAhaW1wb3J0YW50fS5kLWZsZXh7ZGlzcGxheTpmbGV4ICFpbXBvcnRhbnR9LmQtaW5saW5lLWZsZXh7ZGlzcGxheTppbmxpbmUtZmxleCAhaW1wb3J0YW50fS5kLW5vbmV7ZGlzcGxheTpub25lICFpbXBvcnRhbnR9LnNoYWRvd3tib3gtc2hhZG93OnZhcigtLWJzLWJveC1zaGFkb3cpICFpbXBvcnRhbnR9LnNoYWRvdy1zbXtib3gtc2hhZG93OnZhcigtLWJzLWJveC1zaGFkb3ctc20pICFpbXBvcnRhbnR9LnNoYWRvdy1sZ3tib3gtc2hhZG93OnZhcigtLWJzLWJveC1zaGFkb3ctbGcpICFpbXBvcnRhbnR9LnNoYWRvdy1ub25le2JveC1zaGFkb3c6bm9uZSAhaW1wb3J0YW50fS5mb2N1cy1yaW5nLXByaW1hcnl7LS1icy1mb2N1cy1yaW5nLWNvbG9yOiByZ2JhKHZhcigtLWJzLXByaW1hcnktcmdiKSwgdmFyKC0tYnMtZm9jdXMtcmluZy1vcGFjaXR5KSl9LnBvc2l0aW9uLXN0YXRpY3twb3NpdGlvbjpzdGF0aWMgIWltcG9ydGFudH0ucG9zaXRpb24tcmVsYXRpdmV7cG9zaXRpb246cmVsYXRpdmUgIWltcG9ydGFudH0ucG9zaXRpb24tYWJzb2x1dGV7cG9zaXRpb246YWJzb2x1dGUgIWltcG9ydGFudH0ucG9zaXRpb24tZml4ZWR7cG9zaXRpb246Zml4ZWQgIWltcG9ydGFudH0ucG9zaXRpb24tc3RpY2t5e3Bvc2l0aW9uOnN0aWNreSAhaW1wb3J0YW50fS50b3AtMHt0b3A6MCAhaW1wb3J0YW50fS50b3AtNTB7dG9wOjUwJSAhaW1wb3J0YW50fS50b3AtMTAwe3RvcDoxMDAlICFpbXBvcnRhbnR9LmJvdHRvbS0we2JvdHRvbTowICFpbXBvcnRhbnR9LmJvdHRvbS01MHtib3R0b206NTAlICFpbXBvcnRhbnR9LmJvdHRvbS0xMDB7Ym90dG9tOjEwMCUgIWltcG9ydGFudH0uc3RhcnQtMHtsZWZ0OjAgIWltcG9ydGFudH0uc3RhcnQtNTB7bGVmdDo1MCUgIWltcG9ydGFudH0uc3RhcnQtMTAwe2xlZnQ6MTAwJSAhaW1wb3J0YW50fS5lbmQtMHtyaWdodDowICFpbXBvcnRhbnR9LmVuZC01MHtyaWdodDo1MCUgIWltcG9ydGFudH0uZW5kLTEwMHtyaWdodDoxMDAlICFpbXBvcnRhbnR9LnRyYW5zbGF0ZS1taWRkbGV7dHJhbnNmb3JtOnRyYW5zbGF0ZSgtNTAlLCAtNTAlKSAhaW1wb3J0YW50fS50cmFuc2xhdGUtbWlkZGxlLXh7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTUwJSkgIWltcG9ydGFudH0udHJhbnNsYXRlLW1pZGRsZS15e3RyYW5zZm9ybTp0cmFuc2xhdGVZKC01MCUpICFpbXBvcnRhbnR9LmJvcmRlcntib3JkZXI6dmFyKC0tYnMtYm9yZGVyLXdpZHRoKSB2YXIoLS1icy1ib3JkZXItc3R5bGUpIHZhcigtLWJzLWJvcmRlci1jb2xvcikgIWltcG9ydGFudH0uYm9yZGVyLTB7Ym9yZGVyOjAgIWltcG9ydGFudH0uYm9yZGVyLXRvcHtib3JkZXItdG9wOnZhcigtLWJzLWJvcmRlci13aWR0aCkgdmFyKC0tYnMtYm9yZGVyLXN0eWxlKSB2YXIoLS1icy1ib3JkZXItY29sb3IpICFpbXBvcnRhbnR9LmJvcmRlci10b3AtMHtib3JkZXItdG9wOjAgIWltcG9ydGFudH0uYm9yZGVyLWVuZHtib3JkZXItcmlnaHQ6dmFyKC0tYnMtYm9yZGVyLXdpZHRoKSB2YXIoLS1icy1ib3JkZXItc3R5bGUpIHZhcigtLWJzLWJvcmRlci1jb2xvcikgIWltcG9ydGFudH0uYm9yZGVyLWVuZC0we2JvcmRlci1yaWdodDowICFpbXBvcnRhbnR9LmJvcmRlci1ib3R0b217Ym9yZGVyLWJvdHRvbTp2YXIoLS1icy1ib3JkZXItd2lkdGgpIHZhcigtLWJzLWJvcmRlci1zdHlsZSkgdmFyKC0tYnMtYm9yZGVyLWNvbG9yKSAhaW1wb3J0YW50fS5ib3JkZXItYm90dG9tLTB7Ym9yZGVyLWJvdHRvbTowICFpbXBvcnRhbnR9LmJvcmRlci1zdGFydHtib3JkZXItbGVmdDp2YXIoLS1icy1ib3JkZXItd2lkdGgpIHZhcigtLWJzLWJvcmRlci1zdHlsZSkgdmFyKC0tYnMtYm9yZGVyLWNvbG9yKSAhaW1wb3J0YW50fS5ib3JkZXItc3RhcnQtMHtib3JkZXItbGVmdDowICFpbXBvcnRhbnR9LmJvcmRlci1wcmltYXJ5ey0tYnMtYm9yZGVyLW9wYWNpdHk6IDE7Ym9yZGVyLWNvbG9yOnJnYmEodmFyKC0tYnMtcHJpbWFyeS1yZ2IpLCB2YXIoLS1icy1ib3JkZXItb3BhY2l0eSkpICFpbXBvcnRhbnR9LmJvcmRlci1ibGFja3stLWJzLWJvcmRlci1vcGFjaXR5OiAxO2JvcmRlci1jb2xvcjpyZ2JhKHZhcigtLWJzLWJsYWNrLXJnYiksIHZhcigtLWJzLWJvcmRlci1vcGFjaXR5KSkgIWltcG9ydGFudH0uYm9yZGVyLXdoaXRley0tYnMtYm9yZGVyLW9wYWNpdHk6IDE7Ym9yZGVyLWNvbG9yOnJnYmEodmFyKC0tYnMtd2hpdGUtcmdiKSwgdmFyKC0tYnMtYm9yZGVyLW9wYWNpdHkpKSAhaW1wb3J0YW50fS5ib3JkZXItcHJpbWFyeS1zdWJ0bGV7Ym9yZGVyLWNvbG9yOnZhcigtLWJzLXByaW1hcnktYm9yZGVyLXN1YnRsZSkgIWltcG9ydGFudH0uYm9yZGVyLXNlY29uZGFyeS1zdWJ0bGV7Ym9yZGVyLWNvbG9yOnZhcigtLWJzLXNlY29uZGFyeS1ib3JkZXItc3VidGxlKSAhaW1wb3J0YW50fS5ib3JkZXItc3VjY2Vzcy1zdWJ0bGV7Ym9yZGVyLWNvbG9yOnZhcigtLWJzLXN1Y2Nlc3MtYm9yZGVyLXN1YnRsZSkgIWltcG9ydGFudH0uYm9yZGVyLWluZm8tc3VidGxle2JvcmRlci1jb2xvcjp2YXIoLS1icy1pbmZvLWJvcmRlci1zdWJ0bGUpICFpbXBvcnRhbnR9LmJvcmRlci13YXJuaW5nLXN1YnRsZXtib3JkZXItY29sb3I6dmFyKC0tYnMtd2FybmluZy1ib3JkZXItc3VidGxlKSAhaW1wb3J0YW50fS5ib3JkZXItZGFuZ2VyLXN1YnRsZXtib3JkZXItY29sb3I6dmFyKC0tYnMtZGFuZ2VyLWJvcmRlci1zdWJ0bGUpICFpbXBvcnRhbnR9LmJvcmRlci1saWdodC1zdWJ0bGV7Ym9yZGVyLWNvbG9yOnZhcigtLWJzLWxpZ2h0LWJvcmRlci1zdWJ0bGUpICFpbXBvcnRhbnR9LmJvcmRlci1kYXJrLXN1YnRsZXtib3JkZXItY29sb3I6dmFyKC0tYnMtZGFyay1ib3JkZXItc3VidGxlKSAhaW1wb3J0YW50fS5ib3JkZXItMXtib3JkZXItd2lkdGg6MXB4ICFpbXBvcnRhbnR9LmJvcmRlci0ye2JvcmRlci13aWR0aDoycHggIWltcG9ydGFudH0uYm9yZGVyLTN7Ym9yZGVyLXdpZHRoOjNweCAhaW1wb3J0YW50fS5ib3JkZXItNHtib3JkZXItd2lkdGg6NHB4ICFpbXBvcnRhbnR9LmJvcmRlci01e2JvcmRlci13aWR0aDo1cHggIWltcG9ydGFudH0uYm9yZGVyLW9wYWNpdHktMTB7LS1icy1ib3JkZXItb3BhY2l0eTogLjF9LmJvcmRlci1vcGFjaXR5LTI1ey0tYnMtYm9yZGVyLW9wYWNpdHk6IC4yNX0uYm9yZGVyLW9wYWNpdHktNTB7LS1icy1ib3JkZXItb3BhY2l0eTogLjV9LmJvcmRlci1vcGFjaXR5LTc1ey0tYnMtYm9yZGVyLW9wYWNpdHk6IC43NX0uYm9yZGVyLW9wYWNpdHktMTAwey0tYnMtYm9yZGVyLW9wYWNpdHk6IDF9LnctMjV7d2lkdGg6MjUlICFpbXBvcnRhbnR9LnctNTB7d2lkdGg6NTAlICFpbXBvcnRhbnR9LnctNzV7d2lkdGg6NzUlICFpbXBvcnRhbnR9LnctMTAwe3dpZHRoOjEwMCUgIWltcG9ydGFudH0udy1hdXRve3dpZHRoOmF1dG8gIWltcG9ydGFudH0ubXctMTAwe21heC13aWR0aDoxMDAlICFpbXBvcnRhbnR9LnZ3LTEwMHt3aWR0aDoxMDB2dyAhaW1wb3J0YW50fS5taW4tdnctMTAwe21pbi13aWR0aDoxMDB2dyAhaW1wb3J0YW50fS5oLTI1e2hlaWdodDoyNSUgIWltcG9ydGFudH0uaC01MHtoZWlnaHQ6NTAlICFpbXBvcnRhbnR9LmgtNzV7aGVpZ2h0Ojc1JSAhaW1wb3J0YW50fS5oLTEwMHtoZWlnaHQ6MTAwJSAhaW1wb3J0YW50fS5oLWF1dG97aGVpZ2h0OmF1dG8gIWltcG9ydGFudH0ubWgtMTAwe21heC1oZWlnaHQ6MTAwJSAhaW1wb3J0YW50fS52aC0xMDB7aGVpZ2h0OjEwMHZoICFpbXBvcnRhbnR9Lm1pbi12aC0xMDB7bWluLWhlaWdodDoxMDB2aCAhaW1wb3J0YW50fS5mbGV4LWZpbGx7ZmxleDoxIDEgYXV0byAhaW1wb3J0YW50fS5mbGV4LXJvd3tmbGV4LWRpcmVjdGlvbjpyb3cgIWltcG9ydGFudH0uZmxleC1jb2x1bW57ZmxleC1kaXJlY3Rpb246Y29sdW1uICFpbXBvcnRhbnR9LmZsZXgtcm93LXJldmVyc2V7ZmxleC1kaXJlY3Rpb246cm93LXJldmVyc2UgIWltcG9ydGFudH0uZmxleC1jb2x1bW4tcmV2ZXJzZXtmbGV4LWRpcmVjdGlvbjpjb2x1bW4tcmV2ZXJzZSAhaW1wb3J0YW50fS5mbGV4LWdyb3ctMHtmbGV4LWdyb3c6MCAhaW1wb3J0YW50fS5mbGV4LWdyb3ctMXtmbGV4LWdyb3c6MSAhaW1wb3J0YW50fS5mbGV4LXNocmluay0we2ZsZXgtc2hyaW5rOjAgIWltcG9ydGFudH0uZmxleC1zaHJpbmstMXtmbGV4LXNocmluazoxICFpbXBvcnRhbnR9LmZsZXgtd3JhcHtmbGV4LXdyYXA6d3JhcCAhaW1wb3J0YW50fS5mbGV4LW5vd3JhcHtmbGV4LXdyYXA6bm93cmFwICFpbXBvcnRhbnR9LmZsZXgtd3JhcC1yZXZlcnNle2ZsZXgtd3JhcDp3cmFwLXJldmVyc2UgIWltcG9ydGFudH0uanVzdGlmeS1jb250ZW50LXN0YXJ0e2p1c3RpZnktY29udGVudDpmbGV4LXN0YXJ0ICFpbXBvcnRhbnR9Lmp1c3RpZnktY29udGVudC1lbmR7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kICFpbXBvcnRhbnR9Lmp1c3RpZnktY29udGVudC1jZW50ZXJ7anVzdGlmeS1jb250ZW50OmNlbnRlciAhaW1wb3J0YW50fS5qdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbntqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2VlbiAhaW1wb3J0YW50fS5qdXN0aWZ5LWNvbnRlbnQtYXJvdW5ke2p1c3RpZnktY29udGVudDpzcGFjZS1hcm91bmQgIWltcG9ydGFudH0uanVzdGlmeS1jb250ZW50LWV2ZW5seXtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtZXZlbmx5ICFpbXBvcnRhbnR9LmFsaWduLWl0ZW1zLXN0YXJ0e2FsaWduLWl0ZW1zOmZsZXgtc3RhcnQgIWltcG9ydGFudH0uYWxpZ24taXRlbXMtZW5ke2FsaWduLWl0ZW1zOmZsZXgtZW5kICFpbXBvcnRhbnR9LmFsaWduLWl0ZW1zLWNlbnRlcnthbGlnbi1pdGVtczpjZW50ZXIgIWltcG9ydGFudH0uYWxpZ24taXRlbXMtYmFzZWxpbmV7YWxpZ24taXRlbXM6YmFzZWxpbmUgIWltcG9ydGFudH0uYWxpZ24taXRlbXMtc3RyZXRjaHthbGlnbi1pdGVtczpzdHJldGNoICFpbXBvcnRhbnR9LmFsaWduLWNvbnRlbnQtc3RhcnR7YWxpZ24tY29udGVudDpmbGV4LXN0YXJ0ICFpbXBvcnRhbnR9LmFsaWduLWNvbnRlbnQtZW5ke2FsaWduLWNvbnRlbnQ6ZmxleC1lbmQgIWltcG9ydGFudH0uYWxpZ24tY29udGVudC1jZW50ZXJ7YWxpZ24tY29udGVudDpjZW50ZXIgIWltcG9ydGFudH0uYWxpZ24tY29udGVudC1iZXR3ZWVue2FsaWduLWNvbnRlbnQ6c3BhY2UtYmV0d2VlbiAhaW1wb3J0YW50fS5hbGlnbi1jb250ZW50LWFyb3VuZHthbGlnbi1jb250ZW50OnNwYWNlLWFyb3VuZCAhaW1wb3J0YW50fS5hbGlnbi1jb250ZW50LXN0cmV0Y2h7YWxpZ24tY29udGVudDpzdHJldGNoICFpbXBvcnRhbnR9LmFsaWduLXNlbGYtYXV0b3thbGlnbi1zZWxmOmF1dG8gIWltcG9ydGFudH0uYWxpZ24tc2VsZi1zdGFydHthbGlnbi1zZWxmOmZsZXgtc3RhcnQgIWltcG9ydGFudH0uYWxpZ24tc2VsZi1lbmR7YWxpZ24tc2VsZjpmbGV4LWVuZCAhaW1wb3J0YW50fS5hbGlnbi1zZWxmLWNlbnRlcnthbGlnbi1zZWxmOmNlbnRlciAhaW1wb3J0YW50fS5hbGlnbi1zZWxmLWJhc2VsaW5le2FsaWduLXNlbGY6YmFzZWxpbmUgIWltcG9ydGFudH0uYWxpZ24tc2VsZi1zdHJldGNoe2FsaWduLXNlbGY6c3RyZXRjaCAhaW1wb3J0YW50fS5vcmRlci1maXJzdHtvcmRlcjotMSAhaW1wb3J0YW50fS5vcmRlci0we29yZGVyOjAgIWltcG9ydGFudH0ub3JkZXItMXtvcmRlcjoxICFpbXBvcnRhbnR9Lm9yZGVyLTJ7b3JkZXI6MiAhaW1wb3J0YW50fS5vcmRlci0ze29yZGVyOjMgIWltcG9ydGFudH0ub3JkZXItNHtvcmRlcjo0ICFpbXBvcnRhbnR9Lm9yZGVyLTV7b3JkZXI6NSAhaW1wb3J0YW50fS5vcmRlci1sYXN0e29yZGVyOjYgIWltcG9ydGFudH0ubS0we21hcmdpbjowICFpbXBvcnRhbnR9Lm0tMXttYXJnaW46LjI1cmVtICFpbXBvcnRhbnR9Lm0tMnttYXJnaW46LjVyZW0gIWltcG9ydGFudH0ubS0ze21hcmdpbjoxcmVtICFpbXBvcnRhbnR9Lm0tNHttYXJnaW46MS41cmVtICFpbXBvcnRhbnR9Lm0tNXttYXJnaW46M3JlbSAhaW1wb3J0YW50fS5tLWF1dG97bWFyZ2luOmF1dG8gIWltcG9ydGFudH0ubXgtMHttYXJnaW4tcmlnaHQ6MCAhaW1wb3J0YW50O21hcmdpbi1sZWZ0OjAgIWltcG9ydGFudH0ubXgtMXttYXJnaW4tcmlnaHQ6LjI1cmVtICFpbXBvcnRhbnQ7bWFyZ2luLWxlZnQ6LjI1cmVtICFpbXBvcnRhbnR9Lm14LTJ7bWFyZ2luLXJpZ2h0Oi41cmVtICFpbXBvcnRhbnQ7bWFyZ2luLWxlZnQ6LjVyZW0gIWltcG9ydGFudH0ubXgtM3ttYXJnaW4tcmlnaHQ6MXJlbSAhaW1wb3J0YW50O21hcmdpbi1sZWZ0OjFyZW0gIWltcG9ydGFudH0ubXgtNHttYXJnaW4tcmlnaHQ6MS41cmVtICFpbXBvcnRhbnQ7bWFyZ2luLWxlZnQ6MS41cmVtICFpbXBvcnRhbnR9Lm14LTV7bWFyZ2luLXJpZ2h0OjNyZW0gIWltcG9ydGFudDttYXJnaW4tbGVmdDozcmVtICFpbXBvcnRhbnR9Lm14LWF1dG97bWFyZ2luLXJpZ2h0OmF1dG8gIWltcG9ydGFudDttYXJnaW4tbGVmdDphdXRvICFpbXBvcnRhbnR9Lm15LTB7bWFyZ2luLXRvcDowICFpbXBvcnRhbnQ7bWFyZ2luLWJvdHRvbTowICFpbXBvcnRhbnR9Lm15LTF7bWFyZ2luLXRvcDouMjVyZW0gIWltcG9ydGFudDttYXJnaW4tYm90dG9tOi4yNXJlbSAhaW1wb3J0YW50fS5teS0ye21hcmdpbi10b3A6LjVyZW0gIWltcG9ydGFudDttYXJnaW4tYm90dG9tOi41cmVtICFpbXBvcnRhbnR9Lm15LTN7bWFyZ2luLXRvcDoxcmVtICFpbXBvcnRhbnQ7bWFyZ2luLWJvdHRvbToxcmVtICFpbXBvcnRhbnR9Lm15LTR7bWFyZ2luLXRvcDoxLjVyZW0gIWltcG9ydGFudDttYXJnaW4tYm90dG9tOjEuNXJlbSAhaW1wb3J0YW50fS5teS01e21hcmdpbi10b3A6M3JlbSAhaW1wb3J0YW50O21hcmdpbi1ib3R0b206M3JlbSAhaW1wb3J0YW50fS5teS1hdXRve21hcmdpbi10b3A6YXV0byAhaW1wb3J0YW50O21hcmdpbi1ib3R0b206YXV0byAhaW1wb3J0YW50fS5tdC0we21hcmdpbi10b3A6MCAhaW1wb3J0YW50fS5tdC0xe21hcmdpbi10b3A6LjI1cmVtICFpbXBvcnRhbnR9Lm10LTJ7bWFyZ2luLXRvcDouNXJlbSAhaW1wb3J0YW50fS5tdC0ze21hcmdpbi10b3A6MXJlbSAhaW1wb3J0YW50fS5tdC00e21hcmdpbi10b3A6MS41cmVtICFpbXBvcnRhbnR9Lm10LTV7bWFyZ2luLXRvcDozcmVtICFpbXBvcnRhbnR9Lm10LWF1dG97bWFyZ2luLXRvcDphdXRvICFpbXBvcnRhbnR9Lm1lLTB7bWFyZ2luLXJpZ2h0OjAgIWltcG9ydGFudH0ubWUtMXttYXJnaW4tcmlnaHQ6LjI1cmVtICFpbXBvcnRhbnR9Lm1lLTJ7bWFyZ2luLXJpZ2h0Oi41cmVtICFpbXBvcnRhbnR9Lm1lLTN7bWFyZ2luLXJpZ2h0OjFyZW0gIWltcG9ydGFudH0ubWUtNHttYXJnaW4tcmlnaHQ6MS41cmVtICFpbXBvcnRhbnR9Lm1lLTV7bWFyZ2luLXJpZ2h0OjNyZW0gIWltcG9ydGFudH0ubWUtYXV0b3ttYXJnaW4tcmlnaHQ6YXV0byAhaW1wb3J0YW50fS5tYi0we21hcmdpbi1ib3R0b206MCAhaW1wb3J0YW50fS5tYi0xe21hcmdpbi1ib3R0b206LjI1cmVtICFpbXBvcnRhbnR9Lm1iLTJ7bWFyZ2luLWJvdHRvbTouNXJlbSAhaW1wb3J0YW50fS5tYi0ze21hcmdpbi1ib3R0b206MXJlbSAhaW1wb3J0YW50fS5tYi00e21hcmdpbi1ib3R0b206MS41cmVtICFpbXBvcnRhbnR9Lm1iLTV7bWFyZ2luLWJvdHRvbTozcmVtICFpbXBvcnRhbnR9Lm1iLWF1dG97bWFyZ2luLWJvdHRvbTphdXRvICFpbXBvcnRhbnR9Lm1zLTB7bWFyZ2luLWxlZnQ6MCAhaW1wb3J0YW50fS5tcy0xe21hcmdpbi1sZWZ0Oi4yNXJlbSAhaW1wb3J0YW50fS5tcy0ye21hcmdpbi1sZWZ0Oi41cmVtICFpbXBvcnRhbnR9Lm1zLTN7bWFyZ2luLWxlZnQ6MXJlbSAhaW1wb3J0YW50fS5tcy00e21hcmdpbi1sZWZ0OjEuNXJlbSAhaW1wb3J0YW50fS5tcy01e21hcmdpbi1sZWZ0OjNyZW0gIWltcG9ydGFudH0ubXMtYXV0b3ttYXJnaW4tbGVmdDphdXRvICFpbXBvcnRhbnR9LnAtMHtwYWRkaW5nOjAgIWltcG9ydGFudH0ucC0xe3BhZGRpbmc6LjI1cmVtICFpbXBvcnRhbnR9LnAtMntwYWRkaW5nOi41cmVtICFpbXBvcnRhbnR9LnAtM3twYWRkaW5nOjFyZW0gIWltcG9ydGFudH0ucC00e3BhZGRpbmc6MS41cmVtICFpbXBvcnRhbnR9LnAtNXtwYWRkaW5nOjNyZW0gIWltcG9ydGFudH0ucHgtMHtwYWRkaW5nLXJpZ2h0OjAgIWltcG9ydGFudDtwYWRkaW5nLWxlZnQ6MCAhaW1wb3J0YW50fS5weC0xe3BhZGRpbmctcmlnaHQ6LjI1cmVtICFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0Oi4yNXJlbSAhaW1wb3J0YW50fS5weC0ye3BhZGRpbmctcmlnaHQ6LjVyZW0gIWltcG9ydGFudDtwYWRkaW5nLWxlZnQ6LjVyZW0gIWltcG9ydGFudH0ucHgtM3twYWRkaW5nLXJpZ2h0OjFyZW0gIWltcG9ydGFudDtwYWRkaW5nLWxlZnQ6MXJlbSAhaW1wb3J0YW50fS5weC00e3BhZGRpbmctcmlnaHQ6MS41cmVtICFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjEuNXJlbSAhaW1wb3J0YW50fS5weC01e3BhZGRpbmctcmlnaHQ6M3JlbSAhaW1wb3J0YW50O3BhZGRpbmctbGVmdDozcmVtICFpbXBvcnRhbnR9LnB5LTB7cGFkZGluZy10b3A6MCAhaW1wb3J0YW50O3BhZGRpbmctYm90dG9tOjAgIWltcG9ydGFudH0ucHktMXtwYWRkaW5nLXRvcDouMjVyZW0gIWltcG9ydGFudDtwYWRkaW5nLWJvdHRvbTouMjVyZW0gIWltcG9ydGFudH0ucHktMntwYWRkaW5nLXRvcDouNXJlbSAhaW1wb3J0YW50O3BhZGRpbmctYm90dG9tOi41cmVtICFpbXBvcnRhbnR9LnB5LTN7cGFkZGluZy10b3A6MXJlbSAhaW1wb3J0YW50O3BhZGRpbmctYm90dG9tOjFyZW0gIWltcG9ydGFudH0ucHktNHtwYWRkaW5nLXRvcDoxLjVyZW0gIWltcG9ydGFudDtwYWRkaW5nLWJvdHRvbToxLjVyZW0gIWltcG9ydGFudH0ucHktNXtwYWRkaW5nLXRvcDozcmVtICFpbXBvcnRhbnQ7cGFkZGluZy1ib3R0b206M3JlbSAhaW1wb3J0YW50fS5wdC0we3BhZGRpbmctdG9wOjAgIWltcG9ydGFudH0ucHQtMXtwYWRkaW5nLXRvcDouMjVyZW0gIWltcG9ydGFudH0ucHQtMntwYWRkaW5nLXRvcDouNXJlbSAhaW1wb3J0YW50fS5wdC0ze3BhZGRpbmctdG9wOjFyZW0gIWltcG9ydGFudH0ucHQtNHtwYWRkaW5nLXRvcDoxLjVyZW0gIWltcG9ydGFudH0ucHQtNXtwYWRkaW5nLXRvcDozcmVtICFpbXBvcnRhbnR9LnBlLTB7cGFkZGluZy1yaWdodDowICFpbXBvcnRhbnR9LnBlLTF7cGFkZGluZy1yaWdodDouMjVyZW0gIWltcG9ydGFudH0ucGUtMntwYWRkaW5nLXJpZ2h0Oi41cmVtICFpbXBvcnRhbnR9LnBlLTN7cGFkZGluZy1yaWdodDoxcmVtICFpbXBvcnRhbnR9LnBlLTR7cGFkZGluZy1yaWdodDoxLjVyZW0gIWltcG9ydGFudH0ucGUtNXtwYWRkaW5nLXJpZ2h0OjNyZW0gIWltcG9ydGFudH0ucGItMHtwYWRkaW5nLWJvdHRvbTowICFpbXBvcnRhbnR9LnBiLTF7cGFkZGluZy1ib3R0b206LjI1cmVtICFpbXBvcnRhbnR9LnBiLTJ7cGFkZGluZy1ib3R0b206LjVyZW0gIWltcG9ydGFudH0ucGItM3twYWRkaW5nLWJvdHRvbToxcmVtICFpbXBvcnRhbnR9LnBiLTR7cGFkZGluZy1ib3R0b206MS41cmVtICFpbXBvcnRhbnR9LnBiLTV7cGFkZGluZy1ib3R0b206M3JlbSAhaW1wb3J0YW50fS5wcy0we3BhZGRpbmctbGVmdDowICFpbXBvcnRhbnR9LnBzLTF7cGFkZGluZy1sZWZ0Oi4yNXJlbSAhaW1wb3J0YW50fS5wcy0ye3BhZGRpbmctbGVmdDouNXJlbSAhaW1wb3J0YW50fS5wcy0ze3BhZGRpbmctbGVmdDoxcmVtICFpbXBvcnRhbnR9LnBzLTR7cGFkZGluZy1sZWZ0OjEuNXJlbSAhaW1wb3J0YW50fS5wcy01e3BhZGRpbmctbGVmdDozcmVtICFpbXBvcnRhbnR9LmdhcC0we2dhcDowICFpbXBvcnRhbnR9LmdhcC0xe2dhcDouMjVyZW0gIWltcG9ydGFudH0uZ2FwLTJ7Z2FwOi41cmVtICFpbXBvcnRhbnR9LmdhcC0ze2dhcDoxcmVtICFpbXBvcnRhbnR9LmdhcC00e2dhcDoxLjVyZW0gIWltcG9ydGFudH0uZ2FwLTV7Z2FwOjNyZW0gIWltcG9ydGFudH0ucm93LWdhcC0we3Jvdy1nYXA6MCAhaW1wb3J0YW50fS5yb3ctZ2FwLTF7cm93LWdhcDouMjVyZW0gIWltcG9ydGFudH0ucm93LWdhcC0ye3Jvdy1nYXA6LjVyZW0gIWltcG9ydGFudH0ucm93LWdhcC0ze3Jvdy1nYXA6MXJlbSAhaW1wb3J0YW50fS5yb3ctZ2FwLTR7cm93LWdhcDoxLjVyZW0gIWltcG9ydGFudH0ucm93LWdhcC01e3Jvdy1nYXA6M3JlbSAhaW1wb3J0YW50fS5jb2x1bW4tZ2FwLTB7Y29sdW1uLWdhcDowICFpbXBvcnRhbnR9LmNvbHVtbi1nYXAtMXtjb2x1bW4tZ2FwOi4yNXJlbSAhaW1wb3J0YW50fS5jb2x1bW4tZ2FwLTJ7Y29sdW1uLWdhcDouNXJlbSAhaW1wb3J0YW50fS5jb2x1bW4tZ2FwLTN7Y29sdW1uLWdhcDoxcmVtICFpbXBvcnRhbnR9LmNvbHVtbi1nYXAtNHtjb2x1bW4tZ2FwOjEuNXJlbSAhaW1wb3J0YW50fS5jb2x1bW4tZ2FwLTV7Y29sdW1uLWdhcDozcmVtICFpbXBvcnRhbnR9LmZvbnQtbW9ub3NwYWNle2ZvbnQtZmFtaWx5OnZhcigtLWJzLWZvbnQtbW9ub3NwYWNlKSAhaW1wb3J0YW50fS5mcy0xe2ZvbnQtc2l6ZTpjYWxjKDEuMzc1cmVtICsgMS41dncpICFpbXBvcnRhbnR9LmZzLTJ7Zm9udC1zaXplOmNhbGMoMS4zMjVyZW0gKyAuOXZ3KSAhaW1wb3J0YW50fS5mcy0ze2ZvbnQtc2l6ZTpjYWxjKDEuM3JlbSArIC42dncpICFpbXBvcnRhbnR9LmZzLTR7Zm9udC1zaXplOmNhbGMoMS4yNzVyZW0gKyAuM3Z3KSAhaW1wb3J0YW50fS5mcy01e2ZvbnQtc2l6ZToxLjI1cmVtICFpbXBvcnRhbnR9LmZzLTZ7Zm9udC1zaXplOjFyZW0gIWltcG9ydGFudH0uZnN0LWl0YWxpY3tmb250LXN0eWxlOml0YWxpYyAhaW1wb3J0YW50fS5mc3Qtbm9ybWFse2ZvbnQtc3R5bGU6bm9ybWFsICFpbXBvcnRhbnR9LmZ3LWxpZ2h0ZXJ7Zm9udC13ZWlnaHQ6bGlnaHRlciAhaW1wb3J0YW50fS5mdy1saWdodHtmb250LXdlaWdodDozMDAgIWltcG9ydGFudH0uZnctbm9ybWFse2ZvbnQtd2VpZ2h0OjQwMCAhaW1wb3J0YW50fS5mdy1tZWRpdW17Zm9udC13ZWlnaHQ6NTAwICFpbXBvcnRhbnR9LmZ3LXNlbWlib2xke2ZvbnQtd2VpZ2h0OjYwMCAhaW1wb3J0YW50fS5mdy1ib2xke2ZvbnQtd2VpZ2h0OjcwMCAhaW1wb3J0YW50fS5mdy1ib2xkZXJ7Zm9udC13ZWlnaHQ6Ym9sZGVyICFpbXBvcnRhbnR9LmxoLTF7bGluZS1oZWlnaHQ6MSAhaW1wb3J0YW50fS5saC1zbXtsaW5lLWhlaWdodDoxLjI1ICFpbXBvcnRhbnR9LmxoLWJhc2V7bGluZS1oZWlnaHQ6MS41ICFpbXBvcnRhbnR9LmxoLWxne2xpbmUtaGVpZ2h0OjIgIWltcG9ydGFudH0udGV4dC1zdGFydHt0ZXh0LWFsaWduOmxlZnQgIWltcG9ydGFudH0udGV4dC1lbmR7dGV4dC1hbGlnbjpyaWdodCAhaW1wb3J0YW50fS50ZXh0LWNlbnRlcnt0ZXh0LWFsaWduOmNlbnRlciAhaW1wb3J0YW50fS50ZXh0LWRlY29yYXRpb24tbm9uZXt0ZXh0LWRlY29yYXRpb246bm9uZSAhaW1wb3J0YW50fS50ZXh0LWRlY29yYXRpb24tdW5kZXJsaW5le3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmUgIWltcG9ydGFudH0udGV4dC1kZWNvcmF0aW9uLWxpbmUtdGhyb3VnaHt0ZXh0LWRlY29yYXRpb246bGluZS10aHJvdWdoICFpbXBvcnRhbnR9LnRleHQtbG93ZXJjYXNle3RleHQtdHJhbnNmb3JtOmxvd2VyY2FzZSAhaW1wb3J0YW50fS50ZXh0LXVwcGVyY2FzZXt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2UgIWltcG9ydGFudH0udGV4dC1jYXBpdGFsaXple3RleHQtdHJhbnNmb3JtOmNhcGl0YWxpemUgIWltcG9ydGFudH0udGV4dC13cmFwe3doaXRlLXNwYWNlOm5vcm1hbCAhaW1wb3J0YW50fS50ZXh0LW5vd3JhcHt3aGl0ZS1zcGFjZTpub3dyYXAgIWltcG9ydGFudH0udGV4dC1icmVha3t3b3JkLXdyYXA6YnJlYWstd29yZCAhaW1wb3J0YW50O3dvcmQtYnJlYWs6YnJlYWstd29yZCAhaW1wb3J0YW50fS50ZXh0LXByaW1hcnl7LS1icy10ZXh0LW9wYWNpdHk6IDE7Y29sb3I6cmdiYSh2YXIoLS1icy1wcmltYXJ5LXJnYiksIHZhcigtLWJzLXRleHQtb3BhY2l0eSkpICFpbXBvcnRhbnR9LnRleHQtYmxhY2t7LS1icy10ZXh0LW9wYWNpdHk6IDE7Y29sb3I6cmdiYSh2YXIoLS1icy1ibGFjay1yZ2IpLCB2YXIoLS1icy10ZXh0LW9wYWNpdHkpKSAhaW1wb3J0YW50fS50ZXh0LXdoaXRley0tYnMtdGV4dC1vcGFjaXR5OiAxO2NvbG9yOnJnYmEodmFyKC0tYnMtd2hpdGUtcmdiKSwgdmFyKC0tYnMtdGV4dC1vcGFjaXR5KSkgIWltcG9ydGFudH0udGV4dC1ib2R5ey0tYnMtdGV4dC1vcGFjaXR5OiAxO2NvbG9yOnJnYmEodmFyKC0tYnMtYm9keS1jb2xvci1yZ2IpLCB2YXIoLS1icy10ZXh0LW9wYWNpdHkpKSAhaW1wb3J0YW50fS50ZXh0LW11dGVkey0tYnMtdGV4dC1vcGFjaXR5OiAxO2NvbG9yOnZhcigtLWJzLXNlY29uZGFyeS1jb2xvcikgIWltcG9ydGFudH0udGV4dC1ibGFjay01MHstLWJzLXRleHQtb3BhY2l0eTogMTtjb2xvcjpyZ2JhKDAsMCwwLDAuNSkgIWltcG9ydGFudH0udGV4dC13aGl0ZS01MHstLWJzLXRleHQtb3BhY2l0eTogMTtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LDAuNSkgIWltcG9ydGFudH0udGV4dC1ib2R5LXNlY29uZGFyeXstLWJzLXRleHQtb3BhY2l0eTogMTtjb2xvcjp2YXIoLS1icy1zZWNvbmRhcnktY29sb3IpICFpbXBvcnRhbnR9LnRleHQtYm9keS10ZXJ0aWFyeXstLWJzLXRleHQtb3BhY2l0eTogMTtjb2xvcjp2YXIoLS1icy10ZXJ0aWFyeS1jb2xvcikgIWltcG9ydGFudH0udGV4dC1ib2R5LWVtcGhhc2lzey0tYnMtdGV4dC1vcGFjaXR5OiAxO2NvbG9yOnZhcigtLWJzLWVtcGhhc2lzLWNvbG9yKSAhaW1wb3J0YW50fS50ZXh0LXJlc2V0ey0tYnMtdGV4dC1vcGFjaXR5OiAxO2NvbG9yOmluaGVyaXQgIWltcG9ydGFudH0udGV4dC1vcGFjaXR5LTI1ey0tYnMtdGV4dC1vcGFjaXR5OiAuMjV9LnRleHQtb3BhY2l0eS01MHstLWJzLXRleHQtb3BhY2l0eTogLjV9LnRleHQtb3BhY2l0eS03NXstLWJzLXRleHQtb3BhY2l0eTogLjc1fS50ZXh0LW9wYWNpdHktMTAwey0tYnMtdGV4dC1vcGFjaXR5OiAxfS50ZXh0LXByaW1hcnktZW1waGFzaXN7Y29sb3I6dmFyKC0tYnMtcHJpbWFyeS10ZXh0LWVtcGhhc2lzKSAhaW1wb3J0YW50fS50ZXh0LXNlY29uZGFyeS1lbXBoYXNpc3tjb2xvcjp2YXIoLS1icy1zZWNvbmRhcnktdGV4dC1lbXBoYXNpcykgIWltcG9ydGFudH0udGV4dC1zdWNjZXNzLWVtcGhhc2lze2NvbG9yOnZhcigtLWJzLXN1Y2Nlc3MtdGV4dC1lbXBoYXNpcykgIWltcG9ydGFudH0udGV4dC1pbmZvLWVtcGhhc2lze2NvbG9yOnZhcigtLWJzLWluZm8tdGV4dC1lbXBoYXNpcykgIWltcG9ydGFudH0udGV4dC13YXJuaW5nLWVtcGhhc2lze2NvbG9yOnZhcigtLWJzLXdhcm5pbmctdGV4dC1lbXBoYXNpcykgIWltcG9ydGFudH0udGV4dC1kYW5nZXItZW1waGFzaXN7Y29sb3I6dmFyKC0tYnMtZGFuZ2VyLXRleHQtZW1waGFzaXMpICFpbXBvcnRhbnR9LnRleHQtbGlnaHQtZW1waGFzaXN7Y29sb3I6dmFyKC0tYnMtbGlnaHQtdGV4dC1lbXBoYXNpcykgIWltcG9ydGFudH0udGV4dC1kYXJrLWVtcGhhc2lze2NvbG9yOnZhcigtLWJzLWRhcmstdGV4dC1lbXBoYXNpcykgIWltcG9ydGFudH0ubGluay1vcGFjaXR5LTEwey0tYnMtbGluay1vcGFjaXR5OiAuMX0ubGluay1vcGFjaXR5LTEwLWhvdmVyOmhvdmVyey0tYnMtbGluay1vcGFjaXR5OiAuMX0ubGluay1vcGFjaXR5LTI1ey0tYnMtbGluay1vcGFjaXR5OiAuMjV9Lmxpbmstb3BhY2l0eS0yNS1ob3Zlcjpob3ZlcnstLWJzLWxpbmstb3BhY2l0eTogLjI1fS5saW5rLW9wYWNpdHktNTB7LS1icy1saW5rLW9wYWNpdHk6IC41fS5saW5rLW9wYWNpdHktNTAtaG92ZXI6aG92ZXJ7LS1icy1saW5rLW9wYWNpdHk6IC41fS5saW5rLW9wYWNpdHktNzV7LS1icy1saW5rLW9wYWNpdHk6IC43NX0ubGluay1vcGFjaXR5LTc1LWhvdmVyOmhvdmVyey0tYnMtbGluay1vcGFjaXR5OiAuNzV9Lmxpbmstb3BhY2l0eS0xMDB7LS1icy1saW5rLW9wYWNpdHk6IDF9Lmxpbmstb3BhY2l0eS0xMDAtaG92ZXI6aG92ZXJ7LS1icy1saW5rLW9wYWNpdHk6IDF9Lmxpbmstb2Zmc2V0LTF7dGV4dC11bmRlcmxpbmUtb2Zmc2V0Oi4xMjVlbSAhaW1wb3J0YW50fS5saW5rLW9mZnNldC0xLWhvdmVyOmhvdmVye3RleHQtdW5kZXJsaW5lLW9mZnNldDouMTI1ZW0gIWltcG9ydGFudH0ubGluay1vZmZzZXQtMnt0ZXh0LXVuZGVybGluZS1vZmZzZXQ6LjI1ZW0gIWltcG9ydGFudH0ubGluay1vZmZzZXQtMi1ob3Zlcjpob3Zlcnt0ZXh0LXVuZGVybGluZS1vZmZzZXQ6LjI1ZW0gIWltcG9ydGFudH0ubGluay1vZmZzZXQtM3t0ZXh0LXVuZGVybGluZS1vZmZzZXQ6LjM3NWVtICFpbXBvcnRhbnR9Lmxpbmstb2Zmc2V0LTMtaG92ZXI6aG92ZXJ7dGV4dC11bmRlcmxpbmUtb2Zmc2V0Oi4zNzVlbSAhaW1wb3J0YW50fS5saW5rLXVuZGVybGluZS1wcmltYXJ5ey0tYnMtbGluay11bmRlcmxpbmUtb3BhY2l0eTogMTt0ZXh0LWRlY29yYXRpb24tY29sb3I6cmdiYSh2YXIoLS1icy1wcmltYXJ5LXJnYiksIHZhcigtLWJzLWxpbmstdW5kZXJsaW5lLW9wYWNpdHkpKSAhaW1wb3J0YW50fS5saW5rLXVuZGVybGluZXstLWJzLWxpbmstdW5kZXJsaW5lLW9wYWNpdHk6IDE7dGV4dC1kZWNvcmF0aW9uLWNvbG9yOnJnYmEodmFyKC0tYnMtbGluay1jb2xvci1yZ2IpLCB2YXIoLS1icy1saW5rLXVuZGVybGluZS1vcGFjaXR5LCAxKSkgIWltcG9ydGFudH0ubGluay11bmRlcmxpbmUtb3BhY2l0eS0wey0tYnMtbGluay11bmRlcmxpbmUtb3BhY2l0eTogMH0ubGluay11bmRlcmxpbmUtb3BhY2l0eS0wLWhvdmVyOmhvdmVyey0tYnMtbGluay11bmRlcmxpbmUtb3BhY2l0eTogMH0ubGluay11bmRlcmxpbmUtb3BhY2l0eS0xMHstLWJzLWxpbmstdW5kZXJsaW5lLW9wYWNpdHk6IC4xfS5saW5rLXVuZGVybGluZS1vcGFjaXR5LTEwLWhvdmVyOmhvdmVyey0tYnMtbGluay11bmRlcmxpbmUtb3BhY2l0eTogLjF9LmxpbmstdW5kZXJsaW5lLW9wYWNpdHktMjV7LS1icy1saW5rLXVuZGVybGluZS1vcGFjaXR5OiAuMjV9LmxpbmstdW5kZXJsaW5lLW9wYWNpdHktMjUtaG92ZXI6aG92ZXJ7LS1icy1saW5rLXVuZGVybGluZS1vcGFjaXR5OiAuMjV9LmxpbmstdW5kZXJsaW5lLW9wYWNpdHktNTB7LS1icy1saW5rLXVuZGVybGluZS1vcGFjaXR5OiAuNX0ubGluay11bmRlcmxpbmUtb3BhY2l0eS01MC1ob3Zlcjpob3ZlcnstLWJzLWxpbmstdW5kZXJsaW5lLW9wYWNpdHk6IC41fS5saW5rLXVuZGVybGluZS1vcGFjaXR5LTc1ey0tYnMtbGluay11bmRlcmxpbmUtb3BhY2l0eTogLjc1fS5saW5rLXVuZGVybGluZS1vcGFjaXR5LTc1LWhvdmVyOmhvdmVyey0tYnMtbGluay11bmRlcmxpbmUtb3BhY2l0eTogLjc1fS5saW5rLXVuZGVybGluZS1vcGFjaXR5LTEwMHstLWJzLWxpbmstdW5kZXJsaW5lLW9wYWNpdHk6IDF9LmxpbmstdW5kZXJsaW5lLW9wYWNpdHktMTAwLWhvdmVyOmhvdmVyey0tYnMtbGluay11bmRlcmxpbmUtb3BhY2l0eTogMX0uYmctcHJpbWFyeXstLWJzLWJnLW9wYWNpdHk6IDE7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKHZhcigtLWJzLXByaW1hcnktcmdiKSwgdmFyKC0tYnMtYmctb3BhY2l0eSkpICFpbXBvcnRhbnR9LmJnLWJsYWNrey0tYnMtYmctb3BhY2l0eTogMTtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEodmFyKC0tYnMtYmxhY2stcmdiKSwgdmFyKC0tYnMtYmctb3BhY2l0eSkpICFpbXBvcnRhbnR9LmJnLXdoaXRley0tYnMtYmctb3BhY2l0eTogMTtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEodmFyKC0tYnMtd2hpdGUtcmdiKSwgdmFyKC0tYnMtYmctb3BhY2l0eSkpICFpbXBvcnRhbnR9LmJnLWJvZHl7LS1icy1iZy1vcGFjaXR5OiAxO2JhY2tncm91bmQtY29sb3I6cmdiYSh2YXIoLS1icy1ib2R5LWJnLXJnYiksIHZhcigtLWJzLWJnLW9wYWNpdHkpKSAhaW1wb3J0YW50fS5iZy10cmFuc3BhcmVudHstLWJzLWJnLW9wYWNpdHk6IDE7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLDApICFpbXBvcnRhbnR9LmJnLWJvZHktc2Vjb25kYXJ5ey0tYnMtYmctb3BhY2l0eTogMTtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEodmFyKC0tYnMtc2Vjb25kYXJ5LWJnLXJnYiksIHZhcigtLWJzLWJnLW9wYWNpdHkpKSAhaW1wb3J0YW50fS5iZy1ib2R5LXRlcnRpYXJ5ey0tYnMtYmctb3BhY2l0eTogMTtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEodmFyKC0tYnMtdGVydGlhcnktYmctcmdiKSwgdmFyKC0tYnMtYmctb3BhY2l0eSkpICFpbXBvcnRhbnR9LmJnLW9wYWNpdHktMTB7LS1icy1iZy1vcGFjaXR5OiAuMX0uYmctb3BhY2l0eS0yNXstLWJzLWJnLW9wYWNpdHk6IC4yNX0uYmctb3BhY2l0eS01MHstLWJzLWJnLW9wYWNpdHk6IC41fS5iZy1vcGFjaXR5LTc1ey0tYnMtYmctb3BhY2l0eTogLjc1fS5iZy1vcGFjaXR5LTEwMHstLWJzLWJnLW9wYWNpdHk6IDF9LmJnLXByaW1hcnktc3VidGxle2JhY2tncm91bmQtY29sb3I6dmFyKC0tYnMtcHJpbWFyeS1iZy1zdWJ0bGUpICFpbXBvcnRhbnR9LmJnLXNlY29uZGFyeS1zdWJ0bGV7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1icy1zZWNvbmRhcnktYmctc3VidGxlKSAhaW1wb3J0YW50fS5iZy1zdWNjZXNzLXN1YnRsZXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWJzLXN1Y2Nlc3MtYmctc3VidGxlKSAhaW1wb3J0YW50fS5iZy1pbmZvLXN1YnRsZXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWJzLWluZm8tYmctc3VidGxlKSAhaW1wb3J0YW50fS5iZy13YXJuaW5nLXN1YnRsZXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWJzLXdhcm5pbmctYmctc3VidGxlKSAhaW1wb3J0YW50fS5iZy1kYW5nZXItc3VidGxle2JhY2tncm91bmQtY29sb3I6dmFyKC0tYnMtZGFuZ2VyLWJnLXN1YnRsZSkgIWltcG9ydGFudH0uYmctbGlnaHQtc3VidGxle2JhY2tncm91bmQtY29sb3I6dmFyKC0tYnMtbGlnaHQtYmctc3VidGxlKSAhaW1wb3J0YW50fS5iZy1kYXJrLXN1YnRsZXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWJzLWRhcmstYmctc3VidGxlKSAhaW1wb3J0YW50fS5iZy1ncmFkaWVudHtiYWNrZ3JvdW5kLWltYWdlOnZhcigtLWJzLWdyYWRpZW50KSAhaW1wb3J0YW50fS51c2VyLXNlbGVjdC1hbGx7dXNlci1zZWxlY3Q6YWxsICFpbXBvcnRhbnR9LnVzZXItc2VsZWN0LWF1dG97dXNlci1zZWxlY3Q6YXV0byAhaW1wb3J0YW50fS51c2VyLXNlbGVjdC1ub25le3VzZXItc2VsZWN0Om5vbmUgIWltcG9ydGFudH0ucGUtbm9uZXtwb2ludGVyLWV2ZW50czpub25lICFpbXBvcnRhbnR9LnBlLWF1dG97cG9pbnRlci1ldmVudHM6YXV0byAhaW1wb3J0YW50fS5yb3VuZGVke2JvcmRlci1yYWRpdXM6dmFyKC0tYnMtYm9yZGVyLXJhZGl1cykgIWltcG9ydGFudH0ucm91bmRlZC0we2JvcmRlci1yYWRpdXM6MCAhaW1wb3J0YW50fS5yb3VuZGVkLTF7Ym9yZGVyLXJhZGl1czp2YXIoLS1icy1ib3JkZXItcmFkaXVzLXNtKSAhaW1wb3J0YW50fS5yb3VuZGVkLTJ7Ym9yZGVyLXJhZGl1czp2YXIoLS1icy1ib3JkZXItcmFkaXVzKSAhaW1wb3J0YW50fS5yb3VuZGVkLTN7Ym9yZGVyLXJhZGl1czp2YXIoLS1icy1ib3JkZXItcmFkaXVzLWxnKSAhaW1wb3J0YW50fS5yb3VuZGVkLTR7Ym9yZGVyLXJhZGl1czp2YXIoLS1icy1ib3JkZXItcmFkaXVzLXhsKSAhaW1wb3J0YW50fS5yb3VuZGVkLTV7Ym9yZGVyLXJhZGl1czp2YXIoLS1icy1ib3JkZXItcmFkaXVzLXh4bCkgIWltcG9ydGFudH0ucm91bmRlZC1jaXJjbGV7Ym9yZGVyLXJhZGl1czo1MCUgIWltcG9ydGFudH0ucm91bmRlZC1waWxse2JvcmRlci1yYWRpdXM6dmFyKC0tYnMtYm9yZGVyLXJhZGl1cy1waWxsKSAhaW1wb3J0YW50fS5yb3VuZGVkLXRvcHtib3JkZXItdG9wLWxlZnQtcmFkaXVzOnZhcigtLWJzLWJvcmRlci1yYWRpdXMpICFpbXBvcnRhbnQ7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6dmFyKC0tYnMtYm9yZGVyLXJhZGl1cykgIWltcG9ydGFudH0ucm91bmRlZC10b3AtMHtib3JkZXItdG9wLWxlZnQtcmFkaXVzOjAgIWltcG9ydGFudDtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czowICFpbXBvcnRhbnR9LnJvdW5kZWQtdG9wLTF7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czp2YXIoLS1icy1ib3JkZXItcmFkaXVzLXNtKSAhaW1wb3J0YW50O2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOnZhcigtLWJzLWJvcmRlci1yYWRpdXMtc20pICFpbXBvcnRhbnR9LnJvdW5kZWQtdG9wLTJ7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czp2YXIoLS1icy1ib3JkZXItcmFkaXVzKSAhaW1wb3J0YW50O2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOnZhcigtLWJzLWJvcmRlci1yYWRpdXMpICFpbXBvcnRhbnR9LnJvdW5kZWQtdG9wLTN7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czp2YXIoLS1icy1ib3JkZXItcmFkaXVzLWxnKSAhaW1wb3J0YW50O2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOnZhcigtLWJzLWJvcmRlci1yYWRpdXMtbGcpICFpbXBvcnRhbnR9LnJvdW5kZWQtdG9wLTR7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czp2YXIoLS1icy1ib3JkZXItcmFkaXVzLXhsKSAhaW1wb3J0YW50O2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOnZhcigtLWJzLWJvcmRlci1yYWRpdXMteGwpICFpbXBvcnRhbnR9LnJvdW5kZWQtdG9wLTV7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czp2YXIoLS1icy1ib3JkZXItcmFkaXVzLXh4bCkgIWltcG9ydGFudDtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czp2YXIoLS1icy1ib3JkZXItcmFkaXVzLXh4bCkgIWltcG9ydGFudH0ucm91bmRlZC10b3AtY2lyY2xle2JvcmRlci10b3AtbGVmdC1yYWRpdXM6NTAlICFpbXBvcnRhbnQ7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6NTAlICFpbXBvcnRhbnR9LnJvdW5kZWQtdG9wLXBpbGx7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czp2YXIoLS1icy1ib3JkZXItcmFkaXVzLXBpbGwpICFpbXBvcnRhbnQ7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6dmFyKC0tYnMtYm9yZGVyLXJhZGl1cy1waWxsKSAhaW1wb3J0YW50fS5yb3VuZGVkLWVuZHtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czp2YXIoLS1icy1ib3JkZXItcmFkaXVzKSAhaW1wb3J0YW50O2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOnZhcigtLWJzLWJvcmRlci1yYWRpdXMpICFpbXBvcnRhbnR9LnJvdW5kZWQtZW5kLTB7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6MCAhaW1wb3J0YW50O2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjAgIWltcG9ydGFudH0ucm91bmRlZC1lbmQtMXtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czp2YXIoLS1icy1ib3JkZXItcmFkaXVzLXNtKSAhaW1wb3J0YW50O2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOnZhcigtLWJzLWJvcmRlci1yYWRpdXMtc20pICFpbXBvcnRhbnR9LnJvdW5kZWQtZW5kLTJ7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6dmFyKC0tYnMtYm9yZGVyLXJhZGl1cykgIWltcG9ydGFudDtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czp2YXIoLS1icy1ib3JkZXItcmFkaXVzKSAhaW1wb3J0YW50fS5yb3VuZGVkLWVuZC0ze2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOnZhcigtLWJzLWJvcmRlci1yYWRpdXMtbGcpICFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6dmFyKC0tYnMtYm9yZGVyLXJhZGl1cy1sZykgIWltcG9ydGFudH0ucm91bmRlZC1lbmQtNHtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czp2YXIoLS1icy1ib3JkZXItcmFkaXVzLXhsKSAhaW1wb3J0YW50O2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOnZhcigtLWJzLWJvcmRlci1yYWRpdXMteGwpICFpbXBvcnRhbnR9LnJvdW5kZWQtZW5kLTV7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6dmFyKC0tYnMtYm9yZGVyLXJhZGl1cy14eGwpICFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6dmFyKC0tYnMtYm9yZGVyLXJhZGl1cy14eGwpICFpbXBvcnRhbnR9LnJvdW5kZWQtZW5kLWNpcmNsZXtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czo1MCUgIWltcG9ydGFudDtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czo1MCUgIWltcG9ydGFudH0ucm91bmRlZC1lbmQtcGlsbHtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czp2YXIoLS1icy1ib3JkZXItcmFkaXVzLXBpbGwpICFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6dmFyKC0tYnMtYm9yZGVyLXJhZGl1cy1waWxsKSAhaW1wb3J0YW50fS5yb3VuZGVkLWJvdHRvbXtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czp2YXIoLS1icy1ib3JkZXItcmFkaXVzKSAhaW1wb3J0YW50O2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6dmFyKC0tYnMtYm9yZGVyLXJhZGl1cykgIWltcG9ydGFudH0ucm91bmRlZC1ib3R0b20tMHtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czowICFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czowICFpbXBvcnRhbnR9LnJvdW5kZWQtYm90dG9tLTF7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6dmFyKC0tYnMtYm9yZGVyLXJhZGl1cy1zbSkgIWltcG9ydGFudDtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOnZhcigtLWJzLWJvcmRlci1yYWRpdXMtc20pICFpbXBvcnRhbnR9LnJvdW5kZWQtYm90dG9tLTJ7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6dmFyKC0tYnMtYm9yZGVyLXJhZGl1cykgIWltcG9ydGFudDtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOnZhcigtLWJzLWJvcmRlci1yYWRpdXMpICFpbXBvcnRhbnR9LnJvdW5kZWQtYm90dG9tLTN7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6dmFyKC0tYnMtYm9yZGVyLXJhZGl1cy1sZykgIWltcG9ydGFudDtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOnZhcigtLWJzLWJvcmRlci1yYWRpdXMtbGcpICFpbXBvcnRhbnR9LnJvdW5kZWQtYm90dG9tLTR7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6dmFyKC0tYnMtYm9yZGVyLXJhZGl1cy14bCkgIWltcG9ydGFudDtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOnZhcigtLWJzLWJvcmRlci1yYWRpdXMteGwpICFpbXBvcnRhbnR9LnJvdW5kZWQtYm90dG9tLTV7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6dmFyKC0tYnMtYm9yZGVyLXJhZGl1cy14eGwpICFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czp2YXIoLS1icy1ib3JkZXItcmFkaXVzLXh4bCkgIWltcG9ydGFudH0ucm91bmRlZC1ib3R0b20tY2lyY2xle2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjUwJSAhaW1wb3J0YW50O2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6NTAlICFpbXBvcnRhbnR9LnJvdW5kZWQtYm90dG9tLXBpbGx7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6dmFyKC0tYnMtYm9yZGVyLXJhZGl1cy1waWxsKSAhaW1wb3J0YW50O2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6dmFyKC0tYnMtYm9yZGVyLXJhZGl1cy1waWxsKSAhaW1wb3J0YW50fS5yb3VuZGVkLXN0YXJ0e2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6dmFyKC0tYnMtYm9yZGVyLXJhZGl1cykgIWltcG9ydGFudDtib3JkZXItdG9wLWxlZnQtcmFkaXVzOnZhcigtLWJzLWJvcmRlci1yYWRpdXMpICFpbXBvcnRhbnR9LnJvdW5kZWQtc3RhcnQtMHtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjAgIWltcG9ydGFudDtib3JkZXItdG9wLWxlZnQtcmFkaXVzOjAgIWltcG9ydGFudH0ucm91bmRlZC1zdGFydC0xe2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6dmFyKC0tYnMtYm9yZGVyLXJhZGl1cy1zbSkgIWltcG9ydGFudDtib3JkZXItdG9wLWxlZnQtcmFkaXVzOnZhcigtLWJzLWJvcmRlci1yYWRpdXMtc20pICFpbXBvcnRhbnR9LnJvdW5kZWQtc3RhcnQtMntib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOnZhcigtLWJzLWJvcmRlci1yYWRpdXMpICFpbXBvcnRhbnQ7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czp2YXIoLS1icy1ib3JkZXItcmFkaXVzKSAhaW1wb3J0YW50fS5yb3VuZGVkLXN0YXJ0LTN7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czp2YXIoLS1icy1ib3JkZXItcmFkaXVzLWxnKSAhaW1wb3J0YW50O2JvcmRlci10b3AtbGVmdC1yYWRpdXM6dmFyKC0tYnMtYm9yZGVyLXJhZGl1cy1sZykgIWltcG9ydGFudH0ucm91bmRlZC1zdGFydC00e2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6dmFyKC0tYnMtYm9yZGVyLXJhZGl1cy14bCkgIWltcG9ydGFudDtib3JkZXItdG9wLWxlZnQtcmFkaXVzOnZhcigtLWJzLWJvcmRlci1yYWRpdXMteGwpICFpbXBvcnRhbnR9LnJvdW5kZWQtc3RhcnQtNXtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOnZhcigtLWJzLWJvcmRlci1yYWRpdXMteHhsKSAhaW1wb3J0YW50O2JvcmRlci10b3AtbGVmdC1yYWRpdXM6dmFyKC0tYnMtYm9yZGVyLXJhZGl1cy14eGwpICFpbXBvcnRhbnR9LnJvdW5kZWQtc3RhcnQtY2lyY2xle2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6NTAlICFpbXBvcnRhbnQ7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czo1MCUgIWltcG9ydGFudH0ucm91bmRlZC1zdGFydC1waWxse2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6dmFyKC0tYnMtYm9yZGVyLXJhZGl1cy1waWxsKSAhaW1wb3J0YW50O2JvcmRlci10b3AtbGVmdC1yYWRpdXM6dmFyKC0tYnMtYm9yZGVyLXJhZGl1cy1waWxsKSAhaW1wb3J0YW50fS52aXNpYmxle3Zpc2liaWxpdHk6dmlzaWJsZSAhaW1wb3J0YW50fS5pbnZpc2libGV7dmlzaWJpbGl0eTpoaWRkZW4gIWltcG9ydGFudH0uei1uMXt6LWluZGV4Oi0xICFpbXBvcnRhbnR9LnotMHt6LWluZGV4OjAgIWltcG9ydGFudH0uei0xe3otaW5kZXg6MSAhaW1wb3J0YW50fS56LTJ7ei1pbmRleDoyICFpbXBvcnRhbnR9LnotM3t6LWluZGV4OjMgIWltcG9ydGFudH1AbWVkaWEgKG1pbi13aWR0aDogNTc2cHgpey5mbG9hdC1zbS1zdGFydHtmbG9hdDpsZWZ0ICFpbXBvcnRhbnR9LmZsb2F0LXNtLWVuZHtmbG9hdDpyaWdodCAhaW1wb3J0YW50fS5mbG9hdC1zbS1ub25le2Zsb2F0Om5vbmUgIWltcG9ydGFudH0ub2JqZWN0LWZpdC1zbS1jb250YWlue29iamVjdC1maXQ6Y29udGFpbiAhaW1wb3J0YW50fS5vYmplY3QtZml0LXNtLWNvdmVye29iamVjdC1maXQ6Y292ZXIgIWltcG9ydGFudH0ub2JqZWN0LWZpdC1zbS1maWxse29iamVjdC1maXQ6ZmlsbCAhaW1wb3J0YW50fS5vYmplY3QtZml0LXNtLXNjYWxle29iamVjdC1maXQ6c2NhbGUtZG93biAhaW1wb3J0YW50fS5vYmplY3QtZml0LXNtLW5vbmV7b2JqZWN0LWZpdDpub25lICFpbXBvcnRhbnR9LmQtc20taW5saW5le2Rpc3BsYXk6aW5saW5lICFpbXBvcnRhbnR9LmQtc20taW5saW5lLWJsb2Nre2Rpc3BsYXk6aW5saW5lLWJsb2NrICFpbXBvcnRhbnR9LmQtc20tYmxvY2t7ZGlzcGxheTpibG9jayAhaW1wb3J0YW50fS5kLXNtLWdyaWR7ZGlzcGxheTpncmlkICFpbXBvcnRhbnR9LmQtc20taW5saW5lLWdyaWR7ZGlzcGxheTppbmxpbmUtZ3JpZCAhaW1wb3J0YW50fS5kLXNtLXRhYmxle2Rpc3BsYXk6dGFibGUgIWltcG9ydGFudH0uZC1zbS10YWJsZS1yb3d7ZGlzcGxheTp0YWJsZS1yb3cgIWltcG9ydGFudH0uZC1zbS10YWJsZS1jZWxse2Rpc3BsYXk6dGFibGUtY2VsbCAhaW1wb3J0YW50fS5kLXNtLWZsZXh7ZGlzcGxheTpmbGV4ICFpbXBvcnRhbnR9LmQtc20taW5saW5lLWZsZXh7ZGlzcGxheTppbmxpbmUtZmxleCAhaW1wb3J0YW50fS5kLXNtLW5vbmV7ZGlzcGxheTpub25lICFpbXBvcnRhbnR9LmZsZXgtc20tZmlsbHtmbGV4OjEgMSBhdXRvICFpbXBvcnRhbnR9LmZsZXgtc20tcm93e2ZsZXgtZGlyZWN0aW9uOnJvdyAhaW1wb3J0YW50fS5mbGV4LXNtLWNvbHVtbntmbGV4LWRpcmVjdGlvbjpjb2x1bW4gIWltcG9ydGFudH0uZmxleC1zbS1yb3ctcmV2ZXJzZXtmbGV4LWRpcmVjdGlvbjpyb3ctcmV2ZXJzZSAhaW1wb3J0YW50fS5mbGV4LXNtLWNvbHVtbi1yZXZlcnNle2ZsZXgtZGlyZWN0aW9uOmNvbHVtbi1yZXZlcnNlICFpbXBvcnRhbnR9LmZsZXgtc20tZ3Jvdy0we2ZsZXgtZ3JvdzowICFpbXBvcnRhbnR9LmZsZXgtc20tZ3Jvdy0xe2ZsZXgtZ3JvdzoxICFpbXBvcnRhbnR9LmZsZXgtc20tc2hyaW5rLTB7ZmxleC1zaHJpbms6MCAhaW1wb3J0YW50fS5mbGV4LXNtLXNocmluay0xe2ZsZXgtc2hyaW5rOjEgIWltcG9ydGFudH0uZmxleC1zbS13cmFwe2ZsZXgtd3JhcDp3cmFwICFpbXBvcnRhbnR9LmZsZXgtc20tbm93cmFwe2ZsZXgtd3JhcDpub3dyYXAgIWltcG9ydGFudH0uZmxleC1zbS13cmFwLXJldmVyc2V7ZmxleC13cmFwOndyYXAtcmV2ZXJzZSAhaW1wb3J0YW50fS5qdXN0aWZ5LWNvbnRlbnQtc20tc3RhcnR7anVzdGlmeS1jb250ZW50OmZsZXgtc3RhcnQgIWltcG9ydGFudH0uanVzdGlmeS1jb250ZW50LXNtLWVuZHtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmQgIWltcG9ydGFudH0uanVzdGlmeS1jb250ZW50LXNtLWNlbnRlcntqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyICFpbXBvcnRhbnR9Lmp1c3RpZnktY29udGVudC1zbS1iZXR3ZWVue2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuICFpbXBvcnRhbnR9Lmp1c3RpZnktY29udGVudC1zbS1hcm91bmR7anVzdGlmeS1jb250ZW50OnNwYWNlLWFyb3VuZCAhaW1wb3J0YW50fS5qdXN0aWZ5LWNvbnRlbnQtc20tZXZlbmx5e2p1c3RpZnktY29udGVudDpzcGFjZS1ldmVubHkgIWltcG9ydGFudH0uYWxpZ24taXRlbXMtc20tc3RhcnR7YWxpZ24taXRlbXM6ZmxleC1zdGFydCAhaW1wb3J0YW50fS5hbGlnbi1pdGVtcy1zbS1lbmR7YWxpZ24taXRlbXM6ZmxleC1lbmQgIWltcG9ydGFudH0uYWxpZ24taXRlbXMtc20tY2VudGVye2FsaWduLWl0ZW1zOmNlbnRlciAhaW1wb3J0YW50fS5hbGlnbi1pdGVtcy1zbS1iYXNlbGluZXthbGlnbi1pdGVtczpiYXNlbGluZSAhaW1wb3J0YW50fS5hbGlnbi1pdGVtcy1zbS1zdHJldGNoe2FsaWduLWl0ZW1zOnN0cmV0Y2ggIWltcG9ydGFudH0uYWxpZ24tY29udGVudC1zbS1zdGFydHthbGlnbi1jb250ZW50OmZsZXgtc3RhcnQgIWltcG9ydGFudH0uYWxpZ24tY29udGVudC1zbS1lbmR7YWxpZ24tY29udGVudDpmbGV4LWVuZCAhaW1wb3J0YW50fS5hbGlnbi1jb250ZW50LXNtLWNlbnRlcnthbGlnbi1jb250ZW50OmNlbnRlciAhaW1wb3J0YW50fS5hbGlnbi1jb250ZW50LXNtLWJldHdlZW57YWxpZ24tY29udGVudDpzcGFjZS1iZXR3ZWVuICFpbXBvcnRhbnR9LmFsaWduLWNvbnRlbnQtc20tYXJvdW5ke2FsaWduLWNvbnRlbnQ6c3BhY2UtYXJvdW5kICFpbXBvcnRhbnR9LmFsaWduLWNvbnRlbnQtc20tc3RyZXRjaHthbGlnbi1jb250ZW50OnN0cmV0Y2ggIWltcG9ydGFudH0uYWxpZ24tc2VsZi1zbS1hdXRve2FsaWduLXNlbGY6YXV0byAhaW1wb3J0YW50fS5hbGlnbi1zZWxmLXNtLXN0YXJ0e2FsaWduLXNlbGY6ZmxleC1zdGFydCAhaW1wb3J0YW50fS5hbGlnbi1zZWxmLXNtLWVuZHthbGlnbi1zZWxmOmZsZXgtZW5kICFpbXBvcnRhbnR9LmFsaWduLXNlbGYtc20tY2VudGVye2FsaWduLXNlbGY6Y2VudGVyICFpbXBvcnRhbnR9LmFsaWduLXNlbGYtc20tYmFzZWxpbmV7YWxpZ24tc2VsZjpiYXNlbGluZSAhaW1wb3J0YW50fS5hbGlnbi1zZWxmLXNtLXN0cmV0Y2h7YWxpZ24tc2VsZjpzdHJldGNoICFpbXBvcnRhbnR9Lm9yZGVyLXNtLWZpcnN0e29yZGVyOi0xICFpbXBvcnRhbnR9Lm9yZGVyLXNtLTB7b3JkZXI6MCAhaW1wb3J0YW50fS5vcmRlci1zbS0xe29yZGVyOjEgIWltcG9ydGFudH0ub3JkZXItc20tMntvcmRlcjoyICFpbXBvcnRhbnR9Lm9yZGVyLXNtLTN7b3JkZXI6MyAhaW1wb3J0YW50fS5vcmRlci1zbS00e29yZGVyOjQgIWltcG9ydGFudH0ub3JkZXItc20tNXtvcmRlcjo1ICFpbXBvcnRhbnR9Lm9yZGVyLXNtLWxhc3R7b3JkZXI6NiAhaW1wb3J0YW50fS5tLXNtLTB7bWFyZ2luOjAgIWltcG9ydGFudH0ubS1zbS0xe21hcmdpbjouMjVyZW0gIWltcG9ydGFudH0ubS1zbS0ye21hcmdpbjouNXJlbSAhaW1wb3J0YW50fS5tLXNtLTN7bWFyZ2luOjFyZW0gIWltcG9ydGFudH0ubS1zbS00e21hcmdpbjoxLjVyZW0gIWltcG9ydGFudH0ubS1zbS01e21hcmdpbjozcmVtICFpbXBvcnRhbnR9Lm0tc20tYXV0b3ttYXJnaW46YXV0byAhaW1wb3J0YW50fS5teC1zbS0we21hcmdpbi1yaWdodDowICFpbXBvcnRhbnQ7bWFyZ2luLWxlZnQ6MCAhaW1wb3J0YW50fS5teC1zbS0xe21hcmdpbi1yaWdodDouMjVyZW0gIWltcG9ydGFudDttYXJnaW4tbGVmdDouMjVyZW0gIWltcG9ydGFudH0ubXgtc20tMnttYXJnaW4tcmlnaHQ6LjVyZW0gIWltcG9ydGFudDttYXJnaW4tbGVmdDouNXJlbSAhaW1wb3J0YW50fS5teC1zbS0ze21hcmdpbi1yaWdodDoxcmVtICFpbXBvcnRhbnQ7bWFyZ2luLWxlZnQ6MXJlbSAhaW1wb3J0YW50fS5teC1zbS00e21hcmdpbi1yaWdodDoxLjVyZW0gIWltcG9ydGFudDttYXJnaW4tbGVmdDoxLjVyZW0gIWltcG9ydGFudH0ubXgtc20tNXttYXJnaW4tcmlnaHQ6M3JlbSAhaW1wb3J0YW50O21hcmdpbi1sZWZ0OjNyZW0gIWltcG9ydGFudH0ubXgtc20tYXV0b3ttYXJnaW4tcmlnaHQ6YXV0byAhaW1wb3J0YW50O21hcmdpbi1sZWZ0OmF1dG8gIWltcG9ydGFudH0ubXktc20tMHttYXJnaW4tdG9wOjAgIWltcG9ydGFudDttYXJnaW4tYm90dG9tOjAgIWltcG9ydGFudH0ubXktc20tMXttYXJnaW4tdG9wOi4yNXJlbSAhaW1wb3J0YW50O21hcmdpbi1ib3R0b206LjI1cmVtICFpbXBvcnRhbnR9Lm15LXNtLTJ7bWFyZ2luLXRvcDouNXJlbSAhaW1wb3J0YW50O21hcmdpbi1ib3R0b206LjVyZW0gIWltcG9ydGFudH0ubXktc20tM3ttYXJnaW4tdG9wOjFyZW0gIWltcG9ydGFudDttYXJnaW4tYm90dG9tOjFyZW0gIWltcG9ydGFudH0ubXktc20tNHttYXJnaW4tdG9wOjEuNXJlbSAhaW1wb3J0YW50O21hcmdpbi1ib3R0b206MS41cmVtICFpbXBvcnRhbnR9Lm15LXNtLTV7bWFyZ2luLXRvcDozcmVtICFpbXBvcnRhbnQ7bWFyZ2luLWJvdHRvbTozcmVtICFpbXBvcnRhbnR9Lm15LXNtLWF1dG97bWFyZ2luLXRvcDphdXRvICFpbXBvcnRhbnQ7bWFyZ2luLWJvdHRvbTphdXRvICFpbXBvcnRhbnR9Lm10LXNtLTB7bWFyZ2luLXRvcDowICFpbXBvcnRhbnR9Lm10LXNtLTF7bWFyZ2luLXRvcDouMjVyZW0gIWltcG9ydGFudH0ubXQtc20tMnttYXJnaW4tdG9wOi41cmVtICFpbXBvcnRhbnR9Lm10LXNtLTN7bWFyZ2luLXRvcDoxcmVtICFpbXBvcnRhbnR9Lm10LXNtLTR7bWFyZ2luLXRvcDoxLjVyZW0gIWltcG9ydGFudH0ubXQtc20tNXttYXJnaW4tdG9wOjNyZW0gIWltcG9ydGFudH0ubXQtc20tYXV0b3ttYXJnaW4tdG9wOmF1dG8gIWltcG9ydGFudH0ubWUtc20tMHttYXJnaW4tcmlnaHQ6MCAhaW1wb3J0YW50fS5tZS1zbS0xe21hcmdpbi1yaWdodDouMjVyZW0gIWltcG9ydGFudH0ubWUtc20tMnttYXJnaW4tcmlnaHQ6LjVyZW0gIWltcG9ydGFudH0ubWUtc20tM3ttYXJnaW4tcmlnaHQ6MXJlbSAhaW1wb3J0YW50fS5tZS1zbS00e21hcmdpbi1yaWdodDoxLjVyZW0gIWltcG9ydGFudH0ubWUtc20tNXttYXJnaW4tcmlnaHQ6M3JlbSAhaW1wb3J0YW50fS5tZS1zbS1hdXRve21hcmdpbi1yaWdodDphdXRvICFpbXBvcnRhbnR9Lm1iLXNtLTB7bWFyZ2luLWJvdHRvbTowICFpbXBvcnRhbnR9Lm1iLXNtLTF7bWFyZ2luLWJvdHRvbTouMjVyZW0gIWltcG9ydGFudH0ubWItc20tMnttYXJnaW4tYm90dG9tOi41cmVtICFpbXBvcnRhbnR9Lm1iLXNtLTN7bWFyZ2luLWJvdHRvbToxcmVtICFpbXBvcnRhbnR9Lm1iLXNtLTR7bWFyZ2luLWJvdHRvbToxLjVyZW0gIWltcG9ydGFudH0ubWItc20tNXttYXJnaW4tYm90dG9tOjNyZW0gIWltcG9ydGFudH0ubWItc20tYXV0b3ttYXJnaW4tYm90dG9tOmF1dG8gIWltcG9ydGFudH0ubXMtc20tMHttYXJnaW4tbGVmdDowICFpbXBvcnRhbnR9Lm1zLXNtLTF7bWFyZ2luLWxlZnQ6LjI1cmVtICFpbXBvcnRhbnR9Lm1zLXNtLTJ7bWFyZ2luLWxlZnQ6LjVyZW0gIWltcG9ydGFudH0ubXMtc20tM3ttYXJnaW4tbGVmdDoxcmVtICFpbXBvcnRhbnR9Lm1zLXNtLTR7bWFyZ2luLWxlZnQ6MS41cmVtICFpbXBvcnRhbnR9Lm1zLXNtLTV7bWFyZ2luLWxlZnQ6M3JlbSAhaW1wb3J0YW50fS5tcy1zbS1hdXRve21hcmdpbi1sZWZ0OmF1dG8gIWltcG9ydGFudH0ucC1zbS0we3BhZGRpbmc6MCAhaW1wb3J0YW50fS5wLXNtLTF7cGFkZGluZzouMjVyZW0gIWltcG9ydGFudH0ucC1zbS0ye3BhZGRpbmc6LjVyZW0gIWltcG9ydGFudH0ucC1zbS0ze3BhZGRpbmc6MXJlbSAhaW1wb3J0YW50fS5wLXNtLTR7cGFkZGluZzoxLjVyZW0gIWltcG9ydGFudH0ucC1zbS01e3BhZGRpbmc6M3JlbSAhaW1wb3J0YW50fS5weC1zbS0we3BhZGRpbmctcmlnaHQ6MCAhaW1wb3J0YW50O3BhZGRpbmctbGVmdDowICFpbXBvcnRhbnR9LnB4LXNtLTF7cGFkZGluZy1yaWdodDouMjVyZW0gIWltcG9ydGFudDtwYWRkaW5nLWxlZnQ6LjI1cmVtICFpbXBvcnRhbnR9LnB4LXNtLTJ7cGFkZGluZy1yaWdodDouNXJlbSAhaW1wb3J0YW50O3BhZGRpbmctbGVmdDouNXJlbSAhaW1wb3J0YW50fS5weC1zbS0ze3BhZGRpbmctcmlnaHQ6MXJlbSAhaW1wb3J0YW50O3BhZGRpbmctbGVmdDoxcmVtICFpbXBvcnRhbnR9LnB4LXNtLTR7cGFkZGluZy1yaWdodDoxLjVyZW0gIWltcG9ydGFudDtwYWRkaW5nLWxlZnQ6MS41cmVtICFpbXBvcnRhbnR9LnB4LXNtLTV7cGFkZGluZy1yaWdodDozcmVtICFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjNyZW0gIWltcG9ydGFudH0ucHktc20tMHtwYWRkaW5nLXRvcDowICFpbXBvcnRhbnQ7cGFkZGluZy1ib3R0b206MCAhaW1wb3J0YW50fS5weS1zbS0xe3BhZGRpbmctdG9wOi4yNXJlbSAhaW1wb3J0YW50O3BhZGRpbmctYm90dG9tOi4yNXJlbSAhaW1wb3J0YW50fS5weS1zbS0ye3BhZGRpbmctdG9wOi41cmVtICFpbXBvcnRhbnQ7cGFkZGluZy1ib3R0b206LjVyZW0gIWltcG9ydGFudH0ucHktc20tM3twYWRkaW5nLXRvcDoxcmVtICFpbXBvcnRhbnQ7cGFkZGluZy1ib3R0b206MXJlbSAhaW1wb3J0YW50fS5weS1zbS00e3BhZGRpbmctdG9wOjEuNXJlbSAhaW1wb3J0YW50O3BhZGRpbmctYm90dG9tOjEuNXJlbSAhaW1wb3J0YW50fS5weS1zbS01e3BhZGRpbmctdG9wOjNyZW0gIWltcG9ydGFudDtwYWRkaW5nLWJvdHRvbTozcmVtICFpbXBvcnRhbnR9LnB0LXNtLTB7cGFkZGluZy10b3A6MCAhaW1wb3J0YW50fS5wdC1zbS0xe3BhZGRpbmctdG9wOi4yNXJlbSAhaW1wb3J0YW50fS5wdC1zbS0ye3BhZGRpbmctdG9wOi41cmVtICFpbXBvcnRhbnR9LnB0LXNtLTN7cGFkZGluZy10b3A6MXJlbSAhaW1wb3J0YW50fS5wdC1zbS00e3BhZGRpbmctdG9wOjEuNXJlbSAhaW1wb3J0YW50fS5wdC1zbS01e3BhZGRpbmctdG9wOjNyZW0gIWltcG9ydGFudH0ucGUtc20tMHtwYWRkaW5nLXJpZ2h0OjAgIWltcG9ydGFudH0ucGUtc20tMXtwYWRkaW5nLXJpZ2h0Oi4yNXJlbSAhaW1wb3J0YW50fS5wZS1zbS0ye3BhZGRpbmctcmlnaHQ6LjVyZW0gIWltcG9ydGFudH0ucGUtc20tM3twYWRkaW5nLXJpZ2h0OjFyZW0gIWltcG9ydGFudH0ucGUtc20tNHtwYWRkaW5nLXJpZ2h0OjEuNXJlbSAhaW1wb3J0YW50fS5wZS1zbS01e3BhZGRpbmctcmlnaHQ6M3JlbSAhaW1wb3J0YW50fS5wYi1zbS0we3BhZGRpbmctYm90dG9tOjAgIWltcG9ydGFudH0ucGItc20tMXtwYWRkaW5nLWJvdHRvbTouMjVyZW0gIWltcG9ydGFudH0ucGItc20tMntwYWRkaW5nLWJvdHRvbTouNXJlbSAhaW1wb3J0YW50fS5wYi1zbS0ze3BhZGRpbmctYm90dG9tOjFyZW0gIWltcG9ydGFudH0ucGItc20tNHtwYWRkaW5nLWJvdHRvbToxLjVyZW0gIWltcG9ydGFudH0ucGItc20tNXtwYWRkaW5nLWJvdHRvbTozcmVtICFpbXBvcnRhbnR9LnBzLXNtLTB7cGFkZGluZy1sZWZ0OjAgIWltcG9ydGFudH0ucHMtc20tMXtwYWRkaW5nLWxlZnQ6LjI1cmVtICFpbXBvcnRhbnR9LnBzLXNtLTJ7cGFkZGluZy1sZWZ0Oi41cmVtICFpbXBvcnRhbnR9LnBzLXNtLTN7cGFkZGluZy1sZWZ0OjFyZW0gIWltcG9ydGFudH0ucHMtc20tNHtwYWRkaW5nLWxlZnQ6MS41cmVtICFpbXBvcnRhbnR9LnBzLXNtLTV7cGFkZGluZy1sZWZ0OjNyZW0gIWltcG9ydGFudH0uZ2FwLXNtLTB7Z2FwOjAgIWltcG9ydGFudH0uZ2FwLXNtLTF7Z2FwOi4yNXJlbSAhaW1wb3J0YW50fS5nYXAtc20tMntnYXA6LjVyZW0gIWltcG9ydGFudH0uZ2FwLXNtLTN7Z2FwOjFyZW0gIWltcG9ydGFudH0uZ2FwLXNtLTR7Z2FwOjEuNXJlbSAhaW1wb3J0YW50fS5nYXAtc20tNXtnYXA6M3JlbSAhaW1wb3J0YW50fS5yb3ctZ2FwLXNtLTB7cm93LWdhcDowICFpbXBvcnRhbnR9LnJvdy1nYXAtc20tMXtyb3ctZ2FwOi4yNXJlbSAhaW1wb3J0YW50fS5yb3ctZ2FwLXNtLTJ7cm93LWdhcDouNXJlbSAhaW1wb3J0YW50fS5yb3ctZ2FwLXNtLTN7cm93LWdhcDoxcmVtICFpbXBvcnRhbnR9LnJvdy1nYXAtc20tNHtyb3ctZ2FwOjEuNXJlbSAhaW1wb3J0YW50fS5yb3ctZ2FwLXNtLTV7cm93LWdhcDozcmVtICFpbXBvcnRhbnR9LmNvbHVtbi1nYXAtc20tMHtjb2x1bW4tZ2FwOjAgIWltcG9ydGFudH0uY29sdW1uLWdhcC1zbS0xe2NvbHVtbi1nYXA6LjI1cmVtICFpbXBvcnRhbnR9LmNvbHVtbi1nYXAtc20tMntjb2x1bW4tZ2FwOi41cmVtICFpbXBvcnRhbnR9LmNvbHVtbi1nYXAtc20tM3tjb2x1bW4tZ2FwOjFyZW0gIWltcG9ydGFudH0uY29sdW1uLWdhcC1zbS00e2NvbHVtbi1nYXA6MS41cmVtICFpbXBvcnRhbnR9LmNvbHVtbi1nYXAtc20tNXtjb2x1bW4tZ2FwOjNyZW0gIWltcG9ydGFudH0udGV4dC1zbS1zdGFydHt0ZXh0LWFsaWduOmxlZnQgIWltcG9ydGFudH0udGV4dC1zbS1lbmR7dGV4dC1hbGlnbjpyaWdodCAhaW1wb3J0YW50fS50ZXh0LXNtLWNlbnRlcnt0ZXh0LWFsaWduOmNlbnRlciAhaW1wb3J0YW50fX1AbWVkaWEgKG1pbi13aWR0aDogNzY4cHgpey5mbG9hdC1tZC1zdGFydHtmbG9hdDpsZWZ0ICFpbXBvcnRhbnR9LmZsb2F0LW1kLWVuZHtmbG9hdDpyaWdodCAhaW1wb3J0YW50fS5mbG9hdC1tZC1ub25le2Zsb2F0Om5vbmUgIWltcG9ydGFudH0ub2JqZWN0LWZpdC1tZC1jb250YWlue29iamVjdC1maXQ6Y29udGFpbiAhaW1wb3J0YW50fS5vYmplY3QtZml0LW1kLWNvdmVye29iamVjdC1maXQ6Y292ZXIgIWltcG9ydGFudH0ub2JqZWN0LWZpdC1tZC1maWxse29iamVjdC1maXQ6ZmlsbCAhaW1wb3J0YW50fS5vYmplY3QtZml0LW1kLXNjYWxle29iamVjdC1maXQ6c2NhbGUtZG93biAhaW1wb3J0YW50fS5vYmplY3QtZml0LW1kLW5vbmV7b2JqZWN0LWZpdDpub25lICFpbXBvcnRhbnR9LmQtbWQtaW5saW5le2Rpc3BsYXk6aW5saW5lICFpbXBvcnRhbnR9LmQtbWQtaW5saW5lLWJsb2Nre2Rpc3BsYXk6aW5saW5lLWJsb2NrICFpbXBvcnRhbnR9LmQtbWQtYmxvY2t7ZGlzcGxheTpibG9jayAhaW1wb3J0YW50fS5kLW1kLWdyaWR7ZGlzcGxheTpncmlkICFpbXBvcnRhbnR9LmQtbWQtaW5saW5lLWdyaWR7ZGlzcGxheTppbmxpbmUtZ3JpZCAhaW1wb3J0YW50fS5kLW1kLXRhYmxle2Rpc3BsYXk6dGFibGUgIWltcG9ydGFudH0uZC1tZC10YWJsZS1yb3d7ZGlzcGxheTp0YWJsZS1yb3cgIWltcG9ydGFudH0uZC1tZC10YWJsZS1jZWxse2Rpc3BsYXk6dGFibGUtY2VsbCAhaW1wb3J0YW50fS5kLW1kLWZsZXh7ZGlzcGxheTpmbGV4ICFpbXBvcnRhbnR9LmQtbWQtaW5saW5lLWZsZXh7ZGlzcGxheTppbmxpbmUtZmxleCAhaW1wb3J0YW50fS5kLW1kLW5vbmV7ZGlzcGxheTpub25lICFpbXBvcnRhbnR9LmZsZXgtbWQtZmlsbHtmbGV4OjEgMSBhdXRvICFpbXBvcnRhbnR9LmZsZXgtbWQtcm93e2ZsZXgtZGlyZWN0aW9uOnJvdyAhaW1wb3J0YW50fS5mbGV4LW1kLWNvbHVtbntmbGV4LWRpcmVjdGlvbjpjb2x1bW4gIWltcG9ydGFudH0uZmxleC1tZC1yb3ctcmV2ZXJzZXtmbGV4LWRpcmVjdGlvbjpyb3ctcmV2ZXJzZSAhaW1wb3J0YW50fS5mbGV4LW1kLWNvbHVtbi1yZXZlcnNle2ZsZXgtZGlyZWN0aW9uOmNvbHVtbi1yZXZlcnNlICFpbXBvcnRhbnR9LmZsZXgtbWQtZ3Jvdy0we2ZsZXgtZ3JvdzowICFpbXBvcnRhbnR9LmZsZXgtbWQtZ3Jvdy0xe2ZsZXgtZ3JvdzoxICFpbXBvcnRhbnR9LmZsZXgtbWQtc2hyaW5rLTB7ZmxleC1zaHJpbms6MCAhaW1wb3J0YW50fS5mbGV4LW1kLXNocmluay0xe2ZsZXgtc2hyaW5rOjEgIWltcG9ydGFudH0uZmxleC1tZC13cmFwe2ZsZXgtd3JhcDp3cmFwICFpbXBvcnRhbnR9LmZsZXgtbWQtbm93cmFwe2ZsZXgtd3JhcDpub3dyYXAgIWltcG9ydGFudH0uZmxleC1tZC13cmFwLXJldmVyc2V7ZmxleC13cmFwOndyYXAtcmV2ZXJzZSAhaW1wb3J0YW50fS5qdXN0aWZ5LWNvbnRlbnQtbWQtc3RhcnR7anVzdGlmeS1jb250ZW50OmZsZXgtc3RhcnQgIWltcG9ydGFudH0uanVzdGlmeS1jb250ZW50LW1kLWVuZHtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmQgIWltcG9ydGFudH0uanVzdGlmeS1jb250ZW50LW1kLWNlbnRlcntqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyICFpbXBvcnRhbnR9Lmp1c3RpZnktY29udGVudC1tZC1iZXR3ZWVue2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuICFpbXBvcnRhbnR9Lmp1c3RpZnktY29udGVudC1tZC1hcm91bmR7anVzdGlmeS1jb250ZW50OnNwYWNlLWFyb3VuZCAhaW1wb3J0YW50fS5qdXN0aWZ5LWNvbnRlbnQtbWQtZXZlbmx5e2p1c3RpZnktY29udGVudDpzcGFjZS1ldmVubHkgIWltcG9ydGFudH0uYWxpZ24taXRlbXMtbWQtc3RhcnR7YWxpZ24taXRlbXM6ZmxleC1zdGFydCAhaW1wb3J0YW50fS5hbGlnbi1pdGVtcy1tZC1lbmR7YWxpZ24taXRlbXM6ZmxleC1lbmQgIWltcG9ydGFudH0uYWxpZ24taXRlbXMtbWQtY2VudGVye2FsaWduLWl0ZW1zOmNlbnRlciAhaW1wb3J0YW50fS5hbGlnbi1pdGVtcy1tZC1iYXNlbGluZXthbGlnbi1pdGVtczpiYXNlbGluZSAhaW1wb3J0YW50fS5hbGlnbi1pdGVtcy1tZC1zdHJldGNoe2FsaWduLWl0ZW1zOnN0cmV0Y2ggIWltcG9ydGFudH0uYWxpZ24tY29udGVudC1tZC1zdGFydHthbGlnbi1jb250ZW50OmZsZXgtc3RhcnQgIWltcG9ydGFudH0uYWxpZ24tY29udGVudC1tZC1lbmR7YWxpZ24tY29udGVudDpmbGV4LWVuZCAhaW1wb3J0YW50fS5hbGlnbi1jb250ZW50LW1kLWNlbnRlcnthbGlnbi1jb250ZW50OmNlbnRlciAhaW1wb3J0YW50fS5hbGlnbi1jb250ZW50LW1kLWJldHdlZW57YWxpZ24tY29udGVudDpzcGFjZS1iZXR3ZWVuICFpbXBvcnRhbnR9LmFsaWduLWNvbnRlbnQtbWQtYXJvdW5ke2FsaWduLWNvbnRlbnQ6c3BhY2UtYXJvdW5kICFpbXBvcnRhbnR9LmFsaWduLWNvbnRlbnQtbWQtc3RyZXRjaHthbGlnbi1jb250ZW50OnN0cmV0Y2ggIWltcG9ydGFudH0uYWxpZ24tc2VsZi1tZC1hdXRve2FsaWduLXNlbGY6YXV0byAhaW1wb3J0YW50fS5hbGlnbi1zZWxmLW1kLXN0YXJ0e2FsaWduLXNlbGY6ZmxleC1zdGFydCAhaW1wb3J0YW50fS5hbGlnbi1zZWxmLW1kLWVuZHthbGlnbi1zZWxmOmZsZXgtZW5kICFpbXBvcnRhbnR9LmFsaWduLXNlbGYtbWQtY2VudGVye2FsaWduLXNlbGY6Y2VudGVyICFpbXBvcnRhbnR9LmFsaWduLXNlbGYtbWQtYmFzZWxpbmV7YWxpZ24tc2VsZjpiYXNlbGluZSAhaW1wb3J0YW50fS5hbGlnbi1zZWxmLW1kLXN0cmV0Y2h7YWxpZ24tc2VsZjpzdHJldGNoICFpbXBvcnRhbnR9Lm9yZGVyLW1kLWZpcnN0e29yZGVyOi0xICFpbXBvcnRhbnR9Lm9yZGVyLW1kLTB7b3JkZXI6MCAhaW1wb3J0YW50fS5vcmRlci1tZC0xe29yZGVyOjEgIWltcG9ydGFudH0ub3JkZXItbWQtMntvcmRlcjoyICFpbXBvcnRhbnR9Lm9yZGVyLW1kLTN7b3JkZXI6MyAhaW1wb3J0YW50fS5vcmRlci1tZC00e29yZGVyOjQgIWltcG9ydGFudH0ub3JkZXItbWQtNXtvcmRlcjo1ICFpbXBvcnRhbnR9Lm9yZGVyLW1kLWxhc3R7b3JkZXI6NiAhaW1wb3J0YW50fS5tLW1kLTB7bWFyZ2luOjAgIWltcG9ydGFudH0ubS1tZC0xe21hcmdpbjouMjVyZW0gIWltcG9ydGFudH0ubS1tZC0ye21hcmdpbjouNXJlbSAhaW1wb3J0YW50fS5tLW1kLTN7bWFyZ2luOjFyZW0gIWltcG9ydGFudH0ubS1tZC00e21hcmdpbjoxLjVyZW0gIWltcG9ydGFudH0ubS1tZC01e21hcmdpbjozcmVtICFpbXBvcnRhbnR9Lm0tbWQtYXV0b3ttYXJnaW46YXV0byAhaW1wb3J0YW50fS5teC1tZC0we21hcmdpbi1yaWdodDowICFpbXBvcnRhbnQ7bWFyZ2luLWxlZnQ6MCAhaW1wb3J0YW50fS5teC1tZC0xe21hcmdpbi1yaWdodDouMjVyZW0gIWltcG9ydGFudDttYXJnaW4tbGVmdDouMjVyZW0gIWltcG9ydGFudH0ubXgtbWQtMnttYXJnaW4tcmlnaHQ6LjVyZW0gIWltcG9ydGFudDttYXJnaW4tbGVmdDouNXJlbSAhaW1wb3J0YW50fS5teC1tZC0ze21hcmdpbi1yaWdodDoxcmVtICFpbXBvcnRhbnQ7bWFyZ2luLWxlZnQ6MXJlbSAhaW1wb3J0YW50fS5teC1tZC00e21hcmdpbi1yaWdodDoxLjVyZW0gIWltcG9ydGFudDttYXJnaW4tbGVmdDoxLjVyZW0gIWltcG9ydGFudH0ubXgtbWQtNXttYXJnaW4tcmlnaHQ6M3JlbSAhaW1wb3J0YW50O21hcmdpbi1sZWZ0OjNyZW0gIWltcG9ydGFudH0ubXgtbWQtYXV0b3ttYXJnaW4tcmlnaHQ6YXV0byAhaW1wb3J0YW50O21hcmdpbi1sZWZ0OmF1dG8gIWltcG9ydGFudH0ubXktbWQtMHttYXJnaW4tdG9wOjAgIWltcG9ydGFudDttYXJnaW4tYm90dG9tOjAgIWltcG9ydGFudH0ubXktbWQtMXttYXJnaW4tdG9wOi4yNXJlbSAhaW1wb3J0YW50O21hcmdpbi1ib3R0b206LjI1cmVtICFpbXBvcnRhbnR9Lm15LW1kLTJ7bWFyZ2luLXRvcDouNXJlbSAhaW1wb3J0YW50O21hcmdpbi1ib3R0b206LjVyZW0gIWltcG9ydGFudH0ubXktbWQtM3ttYXJnaW4tdG9wOjFyZW0gIWltcG9ydGFudDttYXJnaW4tYm90dG9tOjFyZW0gIWltcG9ydGFudH0ubXktbWQtNHttYXJnaW4tdG9wOjEuNXJlbSAhaW1wb3J0YW50O21hcmdpbi1ib3R0b206MS41cmVtICFpbXBvcnRhbnR9Lm15LW1kLTV7bWFyZ2luLXRvcDozcmVtICFpbXBvcnRhbnQ7bWFyZ2luLWJvdHRvbTozcmVtICFpbXBvcnRhbnR9Lm15LW1kLWF1dG97bWFyZ2luLXRvcDphdXRvICFpbXBvcnRhbnQ7bWFyZ2luLWJvdHRvbTphdXRvICFpbXBvcnRhbnR9Lm10LW1kLTB7bWFyZ2luLXRvcDowICFpbXBvcnRhbnR9Lm10LW1kLTF7bWFyZ2luLXRvcDouMjVyZW0gIWltcG9ydGFudH0ubXQtbWQtMnttYXJnaW4tdG9wOi41cmVtICFpbXBvcnRhbnR9Lm10LW1kLTN7bWFyZ2luLXRvcDoxcmVtICFpbXBvcnRhbnR9Lm10LW1kLTR7bWFyZ2luLXRvcDoxLjVyZW0gIWltcG9ydGFudH0ubXQtbWQtNXttYXJnaW4tdG9wOjNyZW0gIWltcG9ydGFudH0ubXQtbWQtYXV0b3ttYXJnaW4tdG9wOmF1dG8gIWltcG9ydGFudH0ubWUtbWQtMHttYXJnaW4tcmlnaHQ6MCAhaW1wb3J0YW50fS5tZS1tZC0xe21hcmdpbi1yaWdodDouMjVyZW0gIWltcG9ydGFudH0ubWUtbWQtMnttYXJnaW4tcmlnaHQ6LjVyZW0gIWltcG9ydGFudH0ubWUtbWQtM3ttYXJnaW4tcmlnaHQ6MXJlbSAhaW1wb3J0YW50fS5tZS1tZC00e21hcmdpbi1yaWdodDoxLjVyZW0gIWltcG9ydGFudH0ubWUtbWQtNXttYXJnaW4tcmlnaHQ6M3JlbSAhaW1wb3J0YW50fS5tZS1tZC1hdXRve21hcmdpbi1yaWdodDphdXRvICFpbXBvcnRhbnR9Lm1iLW1kLTB7bWFyZ2luLWJvdHRvbTowICFpbXBvcnRhbnR9Lm1iLW1kLTF7bWFyZ2luLWJvdHRvbTouMjVyZW0gIWltcG9ydGFudH0ubWItbWQtMnttYXJnaW4tYm90dG9tOi41cmVtICFpbXBvcnRhbnR9Lm1iLW1kLTN7bWFyZ2luLWJvdHRvbToxcmVtICFpbXBvcnRhbnR9Lm1iLW1kLTR7bWFyZ2luLWJvdHRvbToxLjVyZW0gIWltcG9ydGFudH0ubWItbWQtNXttYXJnaW4tYm90dG9tOjNyZW0gIWltcG9ydGFudH0ubWItbWQtYXV0b3ttYXJnaW4tYm90dG9tOmF1dG8gIWltcG9ydGFudH0ubXMtbWQtMHttYXJnaW4tbGVmdDowICFpbXBvcnRhbnR9Lm1zLW1kLTF7bWFyZ2luLWxlZnQ6LjI1cmVtICFpbXBvcnRhbnR9Lm1zLW1kLTJ7bWFyZ2luLWxlZnQ6LjVyZW0gIWltcG9ydGFudH0ubXMtbWQtM3ttYXJnaW4tbGVmdDoxcmVtICFpbXBvcnRhbnR9Lm1zLW1kLTR7bWFyZ2luLWxlZnQ6MS41cmVtICFpbXBvcnRhbnR9Lm1zLW1kLTV7bWFyZ2luLWxlZnQ6M3JlbSAhaW1wb3J0YW50fS5tcy1tZC1hdXRve21hcmdpbi1sZWZ0OmF1dG8gIWltcG9ydGFudH0ucC1tZC0we3BhZGRpbmc6MCAhaW1wb3J0YW50fS5wLW1kLTF7cGFkZGluZzouMjVyZW0gIWltcG9ydGFudH0ucC1tZC0ye3BhZGRpbmc6LjVyZW0gIWltcG9ydGFudH0ucC1tZC0ze3BhZGRpbmc6MXJlbSAhaW1wb3J0YW50fS5wLW1kLTR7cGFkZGluZzoxLjVyZW0gIWltcG9ydGFudH0ucC1tZC01e3BhZGRpbmc6M3JlbSAhaW1wb3J0YW50fS5weC1tZC0we3BhZGRpbmctcmlnaHQ6MCAhaW1wb3J0YW50O3BhZGRpbmctbGVmdDowICFpbXBvcnRhbnR9LnB4LW1kLTF7cGFkZGluZy1yaWdodDouMjVyZW0gIWltcG9ydGFudDtwYWRkaW5nLWxlZnQ6LjI1cmVtICFpbXBvcnRhbnR9LnB4LW1kLTJ7cGFkZGluZy1yaWdodDouNXJlbSAhaW1wb3J0YW50O3BhZGRpbmctbGVmdDouNXJlbSAhaW1wb3J0YW50fS5weC1tZC0ze3BhZGRpbmctcmlnaHQ6MXJlbSAhaW1wb3J0YW50O3BhZGRpbmctbGVmdDoxcmVtICFpbXBvcnRhbnR9LnB4LW1kLTR7cGFkZGluZy1yaWdodDoxLjVyZW0gIWltcG9ydGFudDtwYWRkaW5nLWxlZnQ6MS41cmVtICFpbXBvcnRhbnR9LnB4LW1kLTV7cGFkZGluZy1yaWdodDozcmVtICFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjNyZW0gIWltcG9ydGFudH0ucHktbWQtMHtwYWRkaW5nLXRvcDowICFpbXBvcnRhbnQ7cGFkZGluZy1ib3R0b206MCAhaW1wb3J0YW50fS5weS1tZC0xe3BhZGRpbmctdG9wOi4yNXJlbSAhaW1wb3J0YW50O3BhZGRpbmctYm90dG9tOi4yNXJlbSAhaW1wb3J0YW50fS5weS1tZC0ye3BhZGRpbmctdG9wOi41cmVtICFpbXBvcnRhbnQ7cGFkZGluZy1ib3R0b206LjVyZW0gIWltcG9ydGFudH0ucHktbWQtM3twYWRkaW5nLXRvcDoxcmVtICFpbXBvcnRhbnQ7cGFkZGluZy1ib3R0b206MXJlbSAhaW1wb3J0YW50fS5weS1tZC00e3BhZGRpbmctdG9wOjEuNXJlbSAhaW1wb3J0YW50O3BhZGRpbmctYm90dG9tOjEuNXJlbSAhaW1wb3J0YW50fS5weS1tZC01e3BhZGRpbmctdG9wOjNyZW0gIWltcG9ydGFudDtwYWRkaW5nLWJvdHRvbTozcmVtICFpbXBvcnRhbnR9LnB0LW1kLTB7cGFkZGluZy10b3A6MCAhaW1wb3J0YW50fS5wdC1tZC0xe3BhZGRpbmctdG9wOi4yNXJlbSAhaW1wb3J0YW50fS5wdC1tZC0ye3BhZGRpbmctdG9wOi41cmVtICFpbXBvcnRhbnR9LnB0LW1kLTN7cGFkZGluZy10b3A6MXJlbSAhaW1wb3J0YW50fS5wdC1tZC00e3BhZGRpbmctdG9wOjEuNXJlbSAhaW1wb3J0YW50fS5wdC1tZC01e3BhZGRpbmctdG9wOjNyZW0gIWltcG9ydGFudH0ucGUtbWQtMHtwYWRkaW5nLXJpZ2h0OjAgIWltcG9ydGFudH0ucGUtbWQtMXtwYWRkaW5nLXJpZ2h0Oi4yNXJlbSAhaW1wb3J0YW50fS5wZS1tZC0ye3BhZGRpbmctcmlnaHQ6LjVyZW0gIWltcG9ydGFudH0ucGUtbWQtM3twYWRkaW5nLXJpZ2h0OjFyZW0gIWltcG9ydGFudH0ucGUtbWQtNHtwYWRkaW5nLXJpZ2h0OjEuNXJlbSAhaW1wb3J0YW50fS5wZS1tZC01e3BhZGRpbmctcmlnaHQ6M3JlbSAhaW1wb3J0YW50fS5wYi1tZC0we3BhZGRpbmctYm90dG9tOjAgIWltcG9ydGFudH0ucGItbWQtMXtwYWRkaW5nLWJvdHRvbTouMjVyZW0gIWltcG9ydGFudH0ucGItbWQtMntwYWRkaW5nLWJvdHRvbTouNXJlbSAhaW1wb3J0YW50fS5wYi1tZC0ze3BhZGRpbmctYm90dG9tOjFyZW0gIWltcG9ydGFudH0ucGItbWQtNHtwYWRkaW5nLWJvdHRvbToxLjVyZW0gIWltcG9ydGFudH0ucGItbWQtNXtwYWRkaW5nLWJvdHRvbTozcmVtICFpbXBvcnRhbnR9LnBzLW1kLTB7cGFkZGluZy1sZWZ0OjAgIWltcG9ydGFudH0ucHMtbWQtMXtwYWRkaW5nLWxlZnQ6LjI1cmVtICFpbXBvcnRhbnR9LnBzLW1kLTJ7cGFkZGluZy1sZWZ0Oi41cmVtICFpbXBvcnRhbnR9LnBzLW1kLTN7cGFkZGluZy1sZWZ0OjFyZW0gIWltcG9ydGFudH0ucHMtbWQtNHtwYWRkaW5nLWxlZnQ6MS41cmVtICFpbXBvcnRhbnR9LnBzLW1kLTV7cGFkZGluZy1sZWZ0OjNyZW0gIWltcG9ydGFudH0uZ2FwLW1kLTB7Z2FwOjAgIWltcG9ydGFudH0uZ2FwLW1kLTF7Z2FwOi4yNXJlbSAhaW1wb3J0YW50fS5nYXAtbWQtMntnYXA6LjVyZW0gIWltcG9ydGFudH0uZ2FwLW1kLTN7Z2FwOjFyZW0gIWltcG9ydGFudH0uZ2FwLW1kLTR7Z2FwOjEuNXJlbSAhaW1wb3J0YW50fS5nYXAtbWQtNXtnYXA6M3JlbSAhaW1wb3J0YW50fS5yb3ctZ2FwLW1kLTB7cm93LWdhcDowICFpbXBvcnRhbnR9LnJvdy1nYXAtbWQtMXtyb3ctZ2FwOi4yNXJlbSAhaW1wb3J0YW50fS5yb3ctZ2FwLW1kLTJ7cm93LWdhcDouNXJlbSAhaW1wb3J0YW50fS5yb3ctZ2FwLW1kLTN7cm93LWdhcDoxcmVtICFpbXBvcnRhbnR9LnJvdy1nYXAtbWQtNHtyb3ctZ2FwOjEuNXJlbSAhaW1wb3J0YW50fS5yb3ctZ2FwLW1kLTV7cm93LWdhcDozcmVtICFpbXBvcnRhbnR9LmNvbHVtbi1nYXAtbWQtMHtjb2x1bW4tZ2FwOjAgIWltcG9ydGFudH0uY29sdW1uLWdhcC1tZC0xe2NvbHVtbi1nYXA6LjI1cmVtICFpbXBvcnRhbnR9LmNvbHVtbi1nYXAtbWQtMntjb2x1bW4tZ2FwOi41cmVtICFpbXBvcnRhbnR9LmNvbHVtbi1nYXAtbWQtM3tjb2x1bW4tZ2FwOjFyZW0gIWltcG9ydGFudH0uY29sdW1uLWdhcC1tZC00e2NvbHVtbi1nYXA6MS41cmVtICFpbXBvcnRhbnR9LmNvbHVtbi1nYXAtbWQtNXtjb2x1bW4tZ2FwOjNyZW0gIWltcG9ydGFudH0udGV4dC1tZC1zdGFydHt0ZXh0LWFsaWduOmxlZnQgIWltcG9ydGFudH0udGV4dC1tZC1lbmR7dGV4dC1hbGlnbjpyaWdodCAhaW1wb3J0YW50fS50ZXh0LW1kLWNlbnRlcnt0ZXh0LWFsaWduOmNlbnRlciAhaW1wb3J0YW50fX1AbWVkaWEgKG1pbi13aWR0aDogOTkycHgpey5mbG9hdC1sZy1zdGFydHtmbG9hdDpsZWZ0ICFpbXBvcnRhbnR9LmZsb2F0LWxnLWVuZHtmbG9hdDpyaWdodCAhaW1wb3J0YW50fS5mbG9hdC1sZy1ub25le2Zsb2F0Om5vbmUgIWltcG9ydGFudH0ub2JqZWN0LWZpdC1sZy1jb250YWlue29iamVjdC1maXQ6Y29udGFpbiAhaW1wb3J0YW50fS5vYmplY3QtZml0LWxnLWNvdmVye29iamVjdC1maXQ6Y292ZXIgIWltcG9ydGFudH0ub2JqZWN0LWZpdC1sZy1maWxse29iamVjdC1maXQ6ZmlsbCAhaW1wb3J0YW50fS5vYmplY3QtZml0LWxnLXNjYWxle29iamVjdC1maXQ6c2NhbGUtZG93biAhaW1wb3J0YW50fS5vYmplY3QtZml0LWxnLW5vbmV7b2JqZWN0LWZpdDpub25lICFpbXBvcnRhbnR9LmQtbGctaW5saW5le2Rpc3BsYXk6aW5saW5lICFpbXBvcnRhbnR9LmQtbGctaW5saW5lLWJsb2Nre2Rpc3BsYXk6aW5saW5lLWJsb2NrICFpbXBvcnRhbnR9LmQtbGctYmxvY2t7ZGlzcGxheTpibG9jayAhaW1wb3J0YW50fS5kLWxnLWdyaWR7ZGlzcGxheTpncmlkICFpbXBvcnRhbnR9LmQtbGctaW5saW5lLWdyaWR7ZGlzcGxheTppbmxpbmUtZ3JpZCAhaW1wb3J0YW50fS5kLWxnLXRhYmxle2Rpc3BsYXk6dGFibGUgIWltcG9ydGFudH0uZC1sZy10YWJsZS1yb3d7ZGlzcGxheTp0YWJsZS1yb3cgIWltcG9ydGFudH0uZC1sZy10YWJsZS1jZWxse2Rpc3BsYXk6dGFibGUtY2VsbCAhaW1wb3J0YW50fS5kLWxnLWZsZXh7ZGlzcGxheTpmbGV4ICFpbXBvcnRhbnR9LmQtbGctaW5saW5lLWZsZXh7ZGlzcGxheTppbmxpbmUtZmxleCAhaW1wb3J0YW50fS5kLWxnLW5vbmV7ZGlzcGxheTpub25lICFpbXBvcnRhbnR9LmZsZXgtbGctZmlsbHtmbGV4OjEgMSBhdXRvICFpbXBvcnRhbnR9LmZsZXgtbGctcm93e2ZsZXgtZGlyZWN0aW9uOnJvdyAhaW1wb3J0YW50fS5mbGV4LWxnLWNvbHVtbntmbGV4LWRpcmVjdGlvbjpjb2x1bW4gIWltcG9ydGFudH0uZmxleC1sZy1yb3ctcmV2ZXJzZXtmbGV4LWRpcmVjdGlvbjpyb3ctcmV2ZXJzZSAhaW1wb3J0YW50fS5mbGV4LWxnLWNvbHVtbi1yZXZlcnNle2ZsZXgtZGlyZWN0aW9uOmNvbHVtbi1yZXZlcnNlICFpbXBvcnRhbnR9LmZsZXgtbGctZ3Jvdy0we2ZsZXgtZ3JvdzowICFpbXBvcnRhbnR9LmZsZXgtbGctZ3Jvdy0xe2ZsZXgtZ3JvdzoxICFpbXBvcnRhbnR9LmZsZXgtbGctc2hyaW5rLTB7ZmxleC1zaHJpbms6MCAhaW1wb3J0YW50fS5mbGV4LWxnLXNocmluay0xe2ZsZXgtc2hyaW5rOjEgIWltcG9ydGFudH0uZmxleC1sZy13cmFwe2ZsZXgtd3JhcDp3cmFwICFpbXBvcnRhbnR9LmZsZXgtbGctbm93cmFwe2ZsZXgtd3JhcDpub3dyYXAgIWltcG9ydGFudH0uZmxleC1sZy13cmFwLXJldmVyc2V7ZmxleC13cmFwOndyYXAtcmV2ZXJzZSAhaW1wb3J0YW50fS5qdXN0aWZ5LWNvbnRlbnQtbGctc3RhcnR7anVzdGlmeS1jb250ZW50OmZsZXgtc3RhcnQgIWltcG9ydGFudH0uanVzdGlmeS1jb250ZW50LWxnLWVuZHtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmQgIWltcG9ydGFudH0uanVzdGlmeS1jb250ZW50LWxnLWNlbnRlcntqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyICFpbXBvcnRhbnR9Lmp1c3RpZnktY29udGVudC1sZy1iZXR3ZWVue2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuICFpbXBvcnRhbnR9Lmp1c3RpZnktY29udGVudC1sZy1hcm91bmR7anVzdGlmeS1jb250ZW50OnNwYWNlLWFyb3VuZCAhaW1wb3J0YW50fS5qdXN0aWZ5LWNvbnRlbnQtbGctZXZlbmx5e2p1c3RpZnktY29udGVudDpzcGFjZS1ldmVubHkgIWltcG9ydGFudH0uYWxpZ24taXRlbXMtbGctc3RhcnR7YWxpZ24taXRlbXM6ZmxleC1zdGFydCAhaW1wb3J0YW50fS5hbGlnbi1pdGVtcy1sZy1lbmR7YWxpZ24taXRlbXM6ZmxleC1lbmQgIWltcG9ydGFudH0uYWxpZ24taXRlbXMtbGctY2VudGVye2FsaWduLWl0ZW1zOmNlbnRlciAhaW1wb3J0YW50fS5hbGlnbi1pdGVtcy1sZy1iYXNlbGluZXthbGlnbi1pdGVtczpiYXNlbGluZSAhaW1wb3J0YW50fS5hbGlnbi1pdGVtcy1sZy1zdHJldGNoe2FsaWduLWl0ZW1zOnN0cmV0Y2ggIWltcG9ydGFudH0uYWxpZ24tY29udGVudC1sZy1zdGFydHthbGlnbi1jb250ZW50OmZsZXgtc3RhcnQgIWltcG9ydGFudH0uYWxpZ24tY29udGVudC1sZy1lbmR7YWxpZ24tY29udGVudDpmbGV4LWVuZCAhaW1wb3J0YW50fS5hbGlnbi1jb250ZW50LWxnLWNlbnRlcnthbGlnbi1jb250ZW50OmNlbnRlciAhaW1wb3J0YW50fS5hbGlnbi1jb250ZW50LWxnLWJldHdlZW57YWxpZ24tY29udGVudDpzcGFjZS1iZXR3ZWVuICFpbXBvcnRhbnR9LmFsaWduLWNvbnRlbnQtbGctYXJvdW5ke2FsaWduLWNvbnRlbnQ6c3BhY2UtYXJvdW5kICFpbXBvcnRhbnR9LmFsaWduLWNvbnRlbnQtbGctc3RyZXRjaHthbGlnbi1jb250ZW50OnN0cmV0Y2ggIWltcG9ydGFudH0uYWxpZ24tc2VsZi1sZy1hdXRve2FsaWduLXNlbGY6YXV0byAhaW1wb3J0YW50fS5hbGlnbi1zZWxmLWxnLXN0YXJ0e2FsaWduLXNlbGY6ZmxleC1zdGFydCAhaW1wb3J0YW50fS5hbGlnbi1zZWxmLWxnLWVuZHthbGlnbi1zZWxmOmZsZXgtZW5kICFpbXBvcnRhbnR9LmFsaWduLXNlbGYtbGctY2VudGVye2FsaWduLXNlbGY6Y2VudGVyICFpbXBvcnRhbnR9LmFsaWduLXNlbGYtbGctYmFzZWxpbmV7YWxpZ24tc2VsZjpiYXNlbGluZSAhaW1wb3J0YW50fS5hbGlnbi1zZWxmLWxnLXN0cmV0Y2h7YWxpZ24tc2VsZjpzdHJldGNoICFpbXBvcnRhbnR9Lm9yZGVyLWxnLWZpcnN0e29yZGVyOi0xICFpbXBvcnRhbnR9Lm9yZGVyLWxnLTB7b3JkZXI6MCAhaW1wb3J0YW50fS5vcmRlci1sZy0xe29yZGVyOjEgIWltcG9ydGFudH0ub3JkZXItbGctMntvcmRlcjoyICFpbXBvcnRhbnR9Lm9yZGVyLWxnLTN7b3JkZXI6MyAhaW1wb3J0YW50fS5vcmRlci1sZy00e29yZGVyOjQgIWltcG9ydGFudH0ub3JkZXItbGctNXtvcmRlcjo1ICFpbXBvcnRhbnR9Lm9yZGVyLWxnLWxhc3R7b3JkZXI6NiAhaW1wb3J0YW50fS5tLWxnLTB7bWFyZ2luOjAgIWltcG9ydGFudH0ubS1sZy0xe21hcmdpbjouMjVyZW0gIWltcG9ydGFudH0ubS1sZy0ye21hcmdpbjouNXJlbSAhaW1wb3J0YW50fS5tLWxnLTN7bWFyZ2luOjFyZW0gIWltcG9ydGFudH0ubS1sZy00e21hcmdpbjoxLjVyZW0gIWltcG9ydGFudH0ubS1sZy01e21hcmdpbjozcmVtICFpbXBvcnRhbnR9Lm0tbGctYXV0b3ttYXJnaW46YXV0byAhaW1wb3J0YW50fS5teC1sZy0we21hcmdpbi1yaWdodDowICFpbXBvcnRhbnQ7bWFyZ2luLWxlZnQ6MCAhaW1wb3J0YW50fS5teC1sZy0xe21hcmdpbi1yaWdodDouMjVyZW0gIWltcG9ydGFudDttYXJnaW4tbGVmdDouMjVyZW0gIWltcG9ydGFudH0ubXgtbGctMnttYXJnaW4tcmlnaHQ6LjVyZW0gIWltcG9ydGFudDttYXJnaW4tbGVmdDouNXJlbSAhaW1wb3J0YW50fS5teC1sZy0ze21hcmdpbi1yaWdodDoxcmVtICFpbXBvcnRhbnQ7bWFyZ2luLWxlZnQ6MXJlbSAhaW1wb3J0YW50fS5teC1sZy00e21hcmdpbi1yaWdodDoxLjVyZW0gIWltcG9ydGFudDttYXJnaW4tbGVmdDoxLjVyZW0gIWltcG9ydGFudH0ubXgtbGctNXttYXJnaW4tcmlnaHQ6M3JlbSAhaW1wb3J0YW50O21hcmdpbi1sZWZ0OjNyZW0gIWltcG9ydGFudH0ubXgtbGctYXV0b3ttYXJnaW4tcmlnaHQ6YXV0byAhaW1wb3J0YW50O21hcmdpbi1sZWZ0OmF1dG8gIWltcG9ydGFudH0ubXktbGctMHttYXJnaW4tdG9wOjAgIWltcG9ydGFudDttYXJnaW4tYm90dG9tOjAgIWltcG9ydGFudH0ubXktbGctMXttYXJnaW4tdG9wOi4yNXJlbSAhaW1wb3J0YW50O21hcmdpbi1ib3R0b206LjI1cmVtICFpbXBvcnRhbnR9Lm15LWxnLTJ7bWFyZ2luLXRvcDouNXJlbSAhaW1wb3J0YW50O21hcmdpbi1ib3R0b206LjVyZW0gIWltcG9ydGFudH0ubXktbGctM3ttYXJnaW4tdG9wOjFyZW0gIWltcG9ydGFudDttYXJnaW4tYm90dG9tOjFyZW0gIWltcG9ydGFudH0ubXktbGctNHttYXJnaW4tdG9wOjEuNXJlbSAhaW1wb3J0YW50O21hcmdpbi1ib3R0b206MS41cmVtICFpbXBvcnRhbnR9Lm15LWxnLTV7bWFyZ2luLXRvcDozcmVtICFpbXBvcnRhbnQ7bWFyZ2luLWJvdHRvbTozcmVtICFpbXBvcnRhbnR9Lm15LWxnLWF1dG97bWFyZ2luLXRvcDphdXRvICFpbXBvcnRhbnQ7bWFyZ2luLWJvdHRvbTphdXRvICFpbXBvcnRhbnR9Lm10LWxnLTB7bWFyZ2luLXRvcDowICFpbXBvcnRhbnR9Lm10LWxnLTF7bWFyZ2luLXRvcDouMjVyZW0gIWltcG9ydGFudH0ubXQtbGctMnttYXJnaW4tdG9wOi41cmVtICFpbXBvcnRhbnR9Lm10LWxnLTN7bWFyZ2luLXRvcDoxcmVtICFpbXBvcnRhbnR9Lm10LWxnLTR7bWFyZ2luLXRvcDoxLjVyZW0gIWltcG9ydGFudH0ubXQtbGctNXttYXJnaW4tdG9wOjNyZW0gIWltcG9ydGFudH0ubXQtbGctYXV0b3ttYXJnaW4tdG9wOmF1dG8gIWltcG9ydGFudH0ubWUtbGctMHttYXJnaW4tcmlnaHQ6MCAhaW1wb3J0YW50fS5tZS1sZy0xe21hcmdpbi1yaWdodDouMjVyZW0gIWltcG9ydGFudH0ubWUtbGctMnttYXJnaW4tcmlnaHQ6LjVyZW0gIWltcG9ydGFudH0ubWUtbGctM3ttYXJnaW4tcmlnaHQ6MXJlbSAhaW1wb3J0YW50fS5tZS1sZy00e21hcmdpbi1yaWdodDoxLjVyZW0gIWltcG9ydGFudH0ubWUtbGctNXttYXJnaW4tcmlnaHQ6M3JlbSAhaW1wb3J0YW50fS5tZS1sZy1hdXRve21hcmdpbi1yaWdodDphdXRvICFpbXBvcnRhbnR9Lm1iLWxnLTB7bWFyZ2luLWJvdHRvbTowICFpbXBvcnRhbnR9Lm1iLWxnLTF7bWFyZ2luLWJvdHRvbTouMjVyZW0gIWltcG9ydGFudH0ubWItbGctMnttYXJnaW4tYm90dG9tOi41cmVtICFpbXBvcnRhbnR9Lm1iLWxnLTN7bWFyZ2luLWJvdHRvbToxcmVtICFpbXBvcnRhbnR9Lm1iLWxnLTR7bWFyZ2luLWJvdHRvbToxLjVyZW0gIWltcG9ydGFudH0ubWItbGctNXttYXJnaW4tYm90dG9tOjNyZW0gIWltcG9ydGFudH0ubWItbGctYXV0b3ttYXJnaW4tYm90dG9tOmF1dG8gIWltcG9ydGFudH0ubXMtbGctMHttYXJnaW4tbGVmdDowICFpbXBvcnRhbnR9Lm1zLWxnLTF7bWFyZ2luLWxlZnQ6LjI1cmVtICFpbXBvcnRhbnR9Lm1zLWxnLTJ7bWFyZ2luLWxlZnQ6LjVyZW0gIWltcG9ydGFudH0ubXMtbGctM3ttYXJnaW4tbGVmdDoxcmVtICFpbXBvcnRhbnR9Lm1zLWxnLTR7bWFyZ2luLWxlZnQ6MS41cmVtICFpbXBvcnRhbnR9Lm1zLWxnLTV7bWFyZ2luLWxlZnQ6M3JlbSAhaW1wb3J0YW50fS5tcy1sZy1hdXRve21hcmdpbi1sZWZ0OmF1dG8gIWltcG9ydGFudH0ucC1sZy0we3BhZGRpbmc6MCAhaW1wb3J0YW50fS5wLWxnLTF7cGFkZGluZzouMjVyZW0gIWltcG9ydGFudH0ucC1sZy0ye3BhZGRpbmc6LjVyZW0gIWltcG9ydGFudH0ucC1sZy0ze3BhZGRpbmc6MXJlbSAhaW1wb3J0YW50fS5wLWxnLTR7cGFkZGluZzoxLjVyZW0gIWltcG9ydGFudH0ucC1sZy01e3BhZGRpbmc6M3JlbSAhaW1wb3J0YW50fS5weC1sZy0we3BhZGRpbmctcmlnaHQ6MCAhaW1wb3J0YW50O3BhZGRpbmctbGVmdDowICFpbXBvcnRhbnR9LnB4LWxnLTF7cGFkZGluZy1yaWdodDouMjVyZW0gIWltcG9ydGFudDtwYWRkaW5nLWxlZnQ6LjI1cmVtICFpbXBvcnRhbnR9LnB4LWxnLTJ7cGFkZGluZy1yaWdodDouNXJlbSAhaW1wb3J0YW50O3BhZGRpbmctbGVmdDouNXJlbSAhaW1wb3J0YW50fS5weC1sZy0ze3BhZGRpbmctcmlnaHQ6MXJlbSAhaW1wb3J0YW50O3BhZGRpbmctbGVmdDoxcmVtICFpbXBvcnRhbnR9LnB4LWxnLTR7cGFkZGluZy1yaWdodDoxLjVyZW0gIWltcG9ydGFudDtwYWRkaW5nLWxlZnQ6MS41cmVtICFpbXBvcnRhbnR9LnB4LWxnLTV7cGFkZGluZy1yaWdodDozcmVtICFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjNyZW0gIWltcG9ydGFudH0ucHktbGctMHtwYWRkaW5nLXRvcDowICFpbXBvcnRhbnQ7cGFkZGluZy1ib3R0b206MCAhaW1wb3J0YW50fS5weS1sZy0xe3BhZGRpbmctdG9wOi4yNXJlbSAhaW1wb3J0YW50O3BhZGRpbmctYm90dG9tOi4yNXJlbSAhaW1wb3J0YW50fS5weS1sZy0ye3BhZGRpbmctdG9wOi41cmVtICFpbXBvcnRhbnQ7cGFkZGluZy1ib3R0b206LjVyZW0gIWltcG9ydGFudH0ucHktbGctM3twYWRkaW5nLXRvcDoxcmVtICFpbXBvcnRhbnQ7cGFkZGluZy1ib3R0b206MXJlbSAhaW1wb3J0YW50fS5weS1sZy00e3BhZGRpbmctdG9wOjEuNXJlbSAhaW1wb3J0YW50O3BhZGRpbmctYm90dG9tOjEuNXJlbSAhaW1wb3J0YW50fS5weS1sZy01e3BhZGRpbmctdG9wOjNyZW0gIWltcG9ydGFudDtwYWRkaW5nLWJvdHRvbTozcmVtICFpbXBvcnRhbnR9LnB0LWxnLTB7cGFkZGluZy10b3A6MCAhaW1wb3J0YW50fS5wdC1sZy0xe3BhZGRpbmctdG9wOi4yNXJlbSAhaW1wb3J0YW50fS5wdC1sZy0ye3BhZGRpbmctdG9wOi41cmVtICFpbXBvcnRhbnR9LnB0LWxnLTN7cGFkZGluZy10b3A6MXJlbSAhaW1wb3J0YW50fS5wdC1sZy00e3BhZGRpbmctdG9wOjEuNXJlbSAhaW1wb3J0YW50fS5wdC1sZy01e3BhZGRpbmctdG9wOjNyZW0gIWltcG9ydGFudH0ucGUtbGctMHtwYWRkaW5nLXJpZ2h0OjAgIWltcG9ydGFudH0ucGUtbGctMXtwYWRkaW5nLXJpZ2h0Oi4yNXJlbSAhaW1wb3J0YW50fS5wZS1sZy0ye3BhZGRpbmctcmlnaHQ6LjVyZW0gIWltcG9ydGFudH0ucGUtbGctM3twYWRkaW5nLXJpZ2h0OjFyZW0gIWltcG9ydGFudH0ucGUtbGctNHtwYWRkaW5nLXJpZ2h0OjEuNXJlbSAhaW1wb3J0YW50fS5wZS1sZy01e3BhZGRpbmctcmlnaHQ6M3JlbSAhaW1wb3J0YW50fS5wYi1sZy0we3BhZGRpbmctYm90dG9tOjAgIWltcG9ydGFudH0ucGItbGctMXtwYWRkaW5nLWJvdHRvbTouMjVyZW0gIWltcG9ydGFudH0ucGItbGctMntwYWRkaW5nLWJvdHRvbTouNXJlbSAhaW1wb3J0YW50fS5wYi1sZy0ze3BhZGRpbmctYm90dG9tOjFyZW0gIWltcG9ydGFudH0ucGItbGctNHtwYWRkaW5nLWJvdHRvbToxLjVyZW0gIWltcG9ydGFudH0ucGItbGctNXtwYWRkaW5nLWJvdHRvbTozcmVtICFpbXBvcnRhbnR9LnBzLWxnLTB7cGFkZGluZy1sZWZ0OjAgIWltcG9ydGFudH0ucHMtbGctMXtwYWRkaW5nLWxlZnQ6LjI1cmVtICFpbXBvcnRhbnR9LnBzLWxnLTJ7cGFkZGluZy1sZWZ0Oi41cmVtICFpbXBvcnRhbnR9LnBzLWxnLTN7cGFkZGluZy1sZWZ0OjFyZW0gIWltcG9ydGFudH0ucHMtbGctNHtwYWRkaW5nLWxlZnQ6MS41cmVtICFpbXBvcnRhbnR9LnBzLWxnLTV7cGFkZGluZy1sZWZ0OjNyZW0gIWltcG9ydGFudH0uZ2FwLWxnLTB7Z2FwOjAgIWltcG9ydGFudH0uZ2FwLWxnLTF7Z2FwOi4yNXJlbSAhaW1wb3J0YW50fS5nYXAtbGctMntnYXA6LjVyZW0gIWltcG9ydGFudH0uZ2FwLWxnLTN7Z2FwOjFyZW0gIWltcG9ydGFudH0uZ2FwLWxnLTR7Z2FwOjEuNXJlbSAhaW1wb3J0YW50fS5nYXAtbGctNXtnYXA6M3JlbSAhaW1wb3J0YW50fS5yb3ctZ2FwLWxnLTB7cm93LWdhcDowICFpbXBvcnRhbnR9LnJvdy1nYXAtbGctMXtyb3ctZ2FwOi4yNXJlbSAhaW1wb3J0YW50fS5yb3ctZ2FwLWxnLTJ7cm93LWdhcDouNXJlbSAhaW1wb3J0YW50fS5yb3ctZ2FwLWxnLTN7cm93LWdhcDoxcmVtICFpbXBvcnRhbnR9LnJvdy1nYXAtbGctNHtyb3ctZ2FwOjEuNXJlbSAhaW1wb3J0YW50fS5yb3ctZ2FwLWxnLTV7cm93LWdhcDozcmVtICFpbXBvcnRhbnR9LmNvbHVtbi1nYXAtbGctMHtjb2x1bW4tZ2FwOjAgIWltcG9ydGFudH0uY29sdW1uLWdhcC1sZy0xe2NvbHVtbi1nYXA6LjI1cmVtICFpbXBvcnRhbnR9LmNvbHVtbi1nYXAtbGctMntjb2x1bW4tZ2FwOi41cmVtICFpbXBvcnRhbnR9LmNvbHVtbi1nYXAtbGctM3tjb2x1bW4tZ2FwOjFyZW0gIWltcG9ydGFudH0uY29sdW1uLWdhcC1sZy00e2NvbHVtbi1nYXA6MS41cmVtICFpbXBvcnRhbnR9LmNvbHVtbi1nYXAtbGctNXtjb2x1bW4tZ2FwOjNyZW0gIWltcG9ydGFudH0udGV4dC1sZy1zdGFydHt0ZXh0LWFsaWduOmxlZnQgIWltcG9ydGFudH0udGV4dC1sZy1lbmR7dGV4dC1hbGlnbjpyaWdodCAhaW1wb3J0YW50fS50ZXh0LWxnLWNlbnRlcnt0ZXh0LWFsaWduOmNlbnRlciAhaW1wb3J0YW50fX1AbWVkaWEgKG1pbi13aWR0aDogMTIwMHB4KXsuZmxvYXQteGwtc3RhcnR7ZmxvYXQ6bGVmdCAhaW1wb3J0YW50fS5mbG9hdC14bC1lbmR7ZmxvYXQ6cmlnaHQgIWltcG9ydGFudH0uZmxvYXQteGwtbm9uZXtmbG9hdDpub25lICFpbXBvcnRhbnR9Lm9iamVjdC1maXQteGwtY29udGFpbntvYmplY3QtZml0OmNvbnRhaW4gIWltcG9ydGFudH0ub2JqZWN0LWZpdC14bC1jb3ZlcntvYmplY3QtZml0OmNvdmVyICFpbXBvcnRhbnR9Lm9iamVjdC1maXQteGwtZmlsbHtvYmplY3QtZml0OmZpbGwgIWltcG9ydGFudH0ub2JqZWN0LWZpdC14bC1zY2FsZXtvYmplY3QtZml0OnNjYWxlLWRvd24gIWltcG9ydGFudH0ub2JqZWN0LWZpdC14bC1ub25le29iamVjdC1maXQ6bm9uZSAhaW1wb3J0YW50fS5kLXhsLWlubGluZXtkaXNwbGF5OmlubGluZSAhaW1wb3J0YW50fS5kLXhsLWlubGluZS1ibG9ja3tkaXNwbGF5OmlubGluZS1ibG9jayAhaW1wb3J0YW50fS5kLXhsLWJsb2Nre2Rpc3BsYXk6YmxvY2sgIWltcG9ydGFudH0uZC14bC1ncmlke2Rpc3BsYXk6Z3JpZCAhaW1wb3J0YW50fS5kLXhsLWlubGluZS1ncmlke2Rpc3BsYXk6aW5saW5lLWdyaWQgIWltcG9ydGFudH0uZC14bC10YWJsZXtkaXNwbGF5OnRhYmxlICFpbXBvcnRhbnR9LmQteGwtdGFibGUtcm93e2Rpc3BsYXk6dGFibGUtcm93ICFpbXBvcnRhbnR9LmQteGwtdGFibGUtY2VsbHtkaXNwbGF5OnRhYmxlLWNlbGwgIWltcG9ydGFudH0uZC14bC1mbGV4e2Rpc3BsYXk6ZmxleCAhaW1wb3J0YW50fS5kLXhsLWlubGluZS1mbGV4e2Rpc3BsYXk6aW5saW5lLWZsZXggIWltcG9ydGFudH0uZC14bC1ub25le2Rpc3BsYXk6bm9uZSAhaW1wb3J0YW50fS5mbGV4LXhsLWZpbGx7ZmxleDoxIDEgYXV0byAhaW1wb3J0YW50fS5mbGV4LXhsLXJvd3tmbGV4LWRpcmVjdGlvbjpyb3cgIWltcG9ydGFudH0uZmxleC14bC1jb2x1bW57ZmxleC1kaXJlY3Rpb246Y29sdW1uICFpbXBvcnRhbnR9LmZsZXgteGwtcm93LXJldmVyc2V7ZmxleC1kaXJlY3Rpb246cm93LXJldmVyc2UgIWltcG9ydGFudH0uZmxleC14bC1jb2x1bW4tcmV2ZXJzZXtmbGV4LWRpcmVjdGlvbjpjb2x1bW4tcmV2ZXJzZSAhaW1wb3J0YW50fS5mbGV4LXhsLWdyb3ctMHtmbGV4LWdyb3c6MCAhaW1wb3J0YW50fS5mbGV4LXhsLWdyb3ctMXtmbGV4LWdyb3c6MSAhaW1wb3J0YW50fS5mbGV4LXhsLXNocmluay0we2ZsZXgtc2hyaW5rOjAgIWltcG9ydGFudH0uZmxleC14bC1zaHJpbmstMXtmbGV4LXNocmluazoxICFpbXBvcnRhbnR9LmZsZXgteGwtd3JhcHtmbGV4LXdyYXA6d3JhcCAhaW1wb3J0YW50fS5mbGV4LXhsLW5vd3JhcHtmbGV4LXdyYXA6bm93cmFwICFpbXBvcnRhbnR9LmZsZXgteGwtd3JhcC1yZXZlcnNle2ZsZXgtd3JhcDp3cmFwLXJldmVyc2UgIWltcG9ydGFudH0uanVzdGlmeS1jb250ZW50LXhsLXN0YXJ0e2p1c3RpZnktY29udGVudDpmbGV4LXN0YXJ0ICFpbXBvcnRhbnR9Lmp1c3RpZnktY29udGVudC14bC1lbmR7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kICFpbXBvcnRhbnR9Lmp1c3RpZnktY29udGVudC14bC1jZW50ZXJ7anVzdGlmeS1jb250ZW50OmNlbnRlciAhaW1wb3J0YW50fS5qdXN0aWZ5LWNvbnRlbnQteGwtYmV0d2VlbntqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2VlbiAhaW1wb3J0YW50fS5qdXN0aWZ5LWNvbnRlbnQteGwtYXJvdW5ke2p1c3RpZnktY29udGVudDpzcGFjZS1hcm91bmQgIWltcG9ydGFudH0uanVzdGlmeS1jb250ZW50LXhsLWV2ZW5seXtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtZXZlbmx5ICFpbXBvcnRhbnR9LmFsaWduLWl0ZW1zLXhsLXN0YXJ0e2FsaWduLWl0ZW1zOmZsZXgtc3RhcnQgIWltcG9ydGFudH0uYWxpZ24taXRlbXMteGwtZW5ke2FsaWduLWl0ZW1zOmZsZXgtZW5kICFpbXBvcnRhbnR9LmFsaWduLWl0ZW1zLXhsLWNlbnRlcnthbGlnbi1pdGVtczpjZW50ZXIgIWltcG9ydGFudH0uYWxpZ24taXRlbXMteGwtYmFzZWxpbmV7YWxpZ24taXRlbXM6YmFzZWxpbmUgIWltcG9ydGFudH0uYWxpZ24taXRlbXMteGwtc3RyZXRjaHthbGlnbi1pdGVtczpzdHJldGNoICFpbXBvcnRhbnR9LmFsaWduLWNvbnRlbnQteGwtc3RhcnR7YWxpZ24tY29udGVudDpmbGV4LXN0YXJ0ICFpbXBvcnRhbnR9LmFsaWduLWNvbnRlbnQteGwtZW5ke2FsaWduLWNvbnRlbnQ6ZmxleC1lbmQgIWltcG9ydGFudH0uYWxpZ24tY29udGVudC14bC1jZW50ZXJ7YWxpZ24tY29udGVudDpjZW50ZXIgIWltcG9ydGFudH0uYWxpZ24tY29udGVudC14bC1iZXR3ZWVue2FsaWduLWNvbnRlbnQ6c3BhY2UtYmV0d2VlbiAhaW1wb3J0YW50fS5hbGlnbi1jb250ZW50LXhsLWFyb3VuZHthbGlnbi1jb250ZW50OnNwYWNlLWFyb3VuZCAhaW1wb3J0YW50fS5hbGlnbi1jb250ZW50LXhsLXN0cmV0Y2h7YWxpZ24tY29udGVudDpzdHJldGNoICFpbXBvcnRhbnR9LmFsaWduLXNlbGYteGwtYXV0b3thbGlnbi1zZWxmOmF1dG8gIWltcG9ydGFudH0uYWxpZ24tc2VsZi14bC1zdGFydHthbGlnbi1zZWxmOmZsZXgtc3RhcnQgIWltcG9ydGFudH0uYWxpZ24tc2VsZi14bC1lbmR7YWxpZ24tc2VsZjpmbGV4LWVuZCAhaW1wb3J0YW50fS5hbGlnbi1zZWxmLXhsLWNlbnRlcnthbGlnbi1zZWxmOmNlbnRlciAhaW1wb3J0YW50fS5hbGlnbi1zZWxmLXhsLWJhc2VsaW5le2FsaWduLXNlbGY6YmFzZWxpbmUgIWltcG9ydGFudH0uYWxpZ24tc2VsZi14bC1zdHJldGNoe2FsaWduLXNlbGY6c3RyZXRjaCAhaW1wb3J0YW50fS5vcmRlci14bC1maXJzdHtvcmRlcjotMSAhaW1wb3J0YW50fS5vcmRlci14bC0we29yZGVyOjAgIWltcG9ydGFudH0ub3JkZXIteGwtMXtvcmRlcjoxICFpbXBvcnRhbnR9Lm9yZGVyLXhsLTJ7b3JkZXI6MiAhaW1wb3J0YW50fS5vcmRlci14bC0ze29yZGVyOjMgIWltcG9ydGFudH0ub3JkZXIteGwtNHtvcmRlcjo0ICFpbXBvcnRhbnR9Lm9yZGVyLXhsLTV7b3JkZXI6NSAhaW1wb3J0YW50fS5vcmRlci14bC1sYXN0e29yZGVyOjYgIWltcG9ydGFudH0ubS14bC0we21hcmdpbjowICFpbXBvcnRhbnR9Lm0teGwtMXttYXJnaW46LjI1cmVtICFpbXBvcnRhbnR9Lm0teGwtMnttYXJnaW46LjVyZW0gIWltcG9ydGFudH0ubS14bC0ze21hcmdpbjoxcmVtICFpbXBvcnRhbnR9Lm0teGwtNHttYXJnaW46MS41cmVtICFpbXBvcnRhbnR9Lm0teGwtNXttYXJnaW46M3JlbSAhaW1wb3J0YW50fS5tLXhsLWF1dG97bWFyZ2luOmF1dG8gIWltcG9ydGFudH0ubXgteGwtMHttYXJnaW4tcmlnaHQ6MCAhaW1wb3J0YW50O21hcmdpbi1sZWZ0OjAgIWltcG9ydGFudH0ubXgteGwtMXttYXJnaW4tcmlnaHQ6LjI1cmVtICFpbXBvcnRhbnQ7bWFyZ2luLWxlZnQ6LjI1cmVtICFpbXBvcnRhbnR9Lm14LXhsLTJ7bWFyZ2luLXJpZ2h0Oi41cmVtICFpbXBvcnRhbnQ7bWFyZ2luLWxlZnQ6LjVyZW0gIWltcG9ydGFudH0ubXgteGwtM3ttYXJnaW4tcmlnaHQ6MXJlbSAhaW1wb3J0YW50O21hcmdpbi1sZWZ0OjFyZW0gIWltcG9ydGFudH0ubXgteGwtNHttYXJnaW4tcmlnaHQ6MS41cmVtICFpbXBvcnRhbnQ7bWFyZ2luLWxlZnQ6MS41cmVtICFpbXBvcnRhbnR9Lm14LXhsLTV7bWFyZ2luLXJpZ2h0OjNyZW0gIWltcG9ydGFudDttYXJnaW4tbGVmdDozcmVtICFpbXBvcnRhbnR9Lm14LXhsLWF1dG97bWFyZ2luLXJpZ2h0OmF1dG8gIWltcG9ydGFudDttYXJnaW4tbGVmdDphdXRvICFpbXBvcnRhbnR9Lm15LXhsLTB7bWFyZ2luLXRvcDowICFpbXBvcnRhbnQ7bWFyZ2luLWJvdHRvbTowICFpbXBvcnRhbnR9Lm15LXhsLTF7bWFyZ2luLXRvcDouMjVyZW0gIWltcG9ydGFudDttYXJnaW4tYm90dG9tOi4yNXJlbSAhaW1wb3J0YW50fS5teS14bC0ye21hcmdpbi10b3A6LjVyZW0gIWltcG9ydGFudDttYXJnaW4tYm90dG9tOi41cmVtICFpbXBvcnRhbnR9Lm15LXhsLTN7bWFyZ2luLXRvcDoxcmVtICFpbXBvcnRhbnQ7bWFyZ2luLWJvdHRvbToxcmVtICFpbXBvcnRhbnR9Lm15LXhsLTR7bWFyZ2luLXRvcDoxLjVyZW0gIWltcG9ydGFudDttYXJnaW4tYm90dG9tOjEuNXJlbSAhaW1wb3J0YW50fS5teS14bC01e21hcmdpbi10b3A6M3JlbSAhaW1wb3J0YW50O21hcmdpbi1ib3R0b206M3JlbSAhaW1wb3J0YW50fS5teS14bC1hdXRve21hcmdpbi10b3A6YXV0byAhaW1wb3J0YW50O21hcmdpbi1ib3R0b206YXV0byAhaW1wb3J0YW50fS5tdC14bC0we21hcmdpbi10b3A6MCAhaW1wb3J0YW50fS5tdC14bC0xe21hcmdpbi10b3A6LjI1cmVtICFpbXBvcnRhbnR9Lm10LXhsLTJ7bWFyZ2luLXRvcDouNXJlbSAhaW1wb3J0YW50fS5tdC14bC0ze21hcmdpbi10b3A6MXJlbSAhaW1wb3J0YW50fS5tdC14bC00e21hcmdpbi10b3A6MS41cmVtICFpbXBvcnRhbnR9Lm10LXhsLTV7bWFyZ2luLXRvcDozcmVtICFpbXBvcnRhbnR9Lm10LXhsLWF1dG97bWFyZ2luLXRvcDphdXRvICFpbXBvcnRhbnR9Lm1lLXhsLTB7bWFyZ2luLXJpZ2h0OjAgIWltcG9ydGFudH0ubWUteGwtMXttYXJnaW4tcmlnaHQ6LjI1cmVtICFpbXBvcnRhbnR9Lm1lLXhsLTJ7bWFyZ2luLXJpZ2h0Oi41cmVtICFpbXBvcnRhbnR9Lm1lLXhsLTN7bWFyZ2luLXJpZ2h0OjFyZW0gIWltcG9ydGFudH0ubWUteGwtNHttYXJnaW4tcmlnaHQ6MS41cmVtICFpbXBvcnRhbnR9Lm1lLXhsLTV7bWFyZ2luLXJpZ2h0OjNyZW0gIWltcG9ydGFudH0ubWUteGwtYXV0b3ttYXJnaW4tcmlnaHQ6YXV0byAhaW1wb3J0YW50fS5tYi14bC0we21hcmdpbi1ib3R0b206MCAhaW1wb3J0YW50fS5tYi14bC0xe21hcmdpbi1ib3R0b206LjI1cmVtICFpbXBvcnRhbnR9Lm1iLXhsLTJ7bWFyZ2luLWJvdHRvbTouNXJlbSAhaW1wb3J0YW50fS5tYi14bC0ze21hcmdpbi1ib3R0b206MXJlbSAhaW1wb3J0YW50fS5tYi14bC00e21hcmdpbi1ib3R0b206MS41cmVtICFpbXBvcnRhbnR9Lm1iLXhsLTV7bWFyZ2luLWJvdHRvbTozcmVtICFpbXBvcnRhbnR9Lm1iLXhsLWF1dG97bWFyZ2luLWJvdHRvbTphdXRvICFpbXBvcnRhbnR9Lm1zLXhsLTB7bWFyZ2luLWxlZnQ6MCAhaW1wb3J0YW50fS5tcy14bC0xe21hcmdpbi1sZWZ0Oi4yNXJlbSAhaW1wb3J0YW50fS5tcy14bC0ye21hcmdpbi1sZWZ0Oi41cmVtICFpbXBvcnRhbnR9Lm1zLXhsLTN7bWFyZ2luLWxlZnQ6MXJlbSAhaW1wb3J0YW50fS5tcy14bC00e21hcmdpbi1sZWZ0OjEuNXJlbSAhaW1wb3J0YW50fS5tcy14bC01e21hcmdpbi1sZWZ0OjNyZW0gIWltcG9ydGFudH0ubXMteGwtYXV0b3ttYXJnaW4tbGVmdDphdXRvICFpbXBvcnRhbnR9LnAteGwtMHtwYWRkaW5nOjAgIWltcG9ydGFudH0ucC14bC0xe3BhZGRpbmc6LjI1cmVtICFpbXBvcnRhbnR9LnAteGwtMntwYWRkaW5nOi41cmVtICFpbXBvcnRhbnR9LnAteGwtM3twYWRkaW5nOjFyZW0gIWltcG9ydGFudH0ucC14bC00e3BhZGRpbmc6MS41cmVtICFpbXBvcnRhbnR9LnAteGwtNXtwYWRkaW5nOjNyZW0gIWltcG9ydGFudH0ucHgteGwtMHtwYWRkaW5nLXJpZ2h0OjAgIWltcG9ydGFudDtwYWRkaW5nLWxlZnQ6MCAhaW1wb3J0YW50fS5weC14bC0xe3BhZGRpbmctcmlnaHQ6LjI1cmVtICFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0Oi4yNXJlbSAhaW1wb3J0YW50fS5weC14bC0ye3BhZGRpbmctcmlnaHQ6LjVyZW0gIWltcG9ydGFudDtwYWRkaW5nLWxlZnQ6LjVyZW0gIWltcG9ydGFudH0ucHgteGwtM3twYWRkaW5nLXJpZ2h0OjFyZW0gIWltcG9ydGFudDtwYWRkaW5nLWxlZnQ6MXJlbSAhaW1wb3J0YW50fS5weC14bC00e3BhZGRpbmctcmlnaHQ6MS41cmVtICFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjEuNXJlbSAhaW1wb3J0YW50fS5weC14bC01e3BhZGRpbmctcmlnaHQ6M3JlbSAhaW1wb3J0YW50O3BhZGRpbmctbGVmdDozcmVtICFpbXBvcnRhbnR9LnB5LXhsLTB7cGFkZGluZy10b3A6MCAhaW1wb3J0YW50O3BhZGRpbmctYm90dG9tOjAgIWltcG9ydGFudH0ucHkteGwtMXtwYWRkaW5nLXRvcDouMjVyZW0gIWltcG9ydGFudDtwYWRkaW5nLWJvdHRvbTouMjVyZW0gIWltcG9ydGFudH0ucHkteGwtMntwYWRkaW5nLXRvcDouNXJlbSAhaW1wb3J0YW50O3BhZGRpbmctYm90dG9tOi41cmVtICFpbXBvcnRhbnR9LnB5LXhsLTN7cGFkZGluZy10b3A6MXJlbSAhaW1wb3J0YW50O3BhZGRpbmctYm90dG9tOjFyZW0gIWltcG9ydGFudH0ucHkteGwtNHtwYWRkaW5nLXRvcDoxLjVyZW0gIWltcG9ydGFudDtwYWRkaW5nLWJvdHRvbToxLjVyZW0gIWltcG9ydGFudH0ucHkteGwtNXtwYWRkaW5nLXRvcDozcmVtICFpbXBvcnRhbnQ7cGFkZGluZy1ib3R0b206M3JlbSAhaW1wb3J0YW50fS5wdC14bC0we3BhZGRpbmctdG9wOjAgIWltcG9ydGFudH0ucHQteGwtMXtwYWRkaW5nLXRvcDouMjVyZW0gIWltcG9ydGFudH0ucHQteGwtMntwYWRkaW5nLXRvcDouNXJlbSAhaW1wb3J0YW50fS5wdC14bC0ze3BhZGRpbmctdG9wOjFyZW0gIWltcG9ydGFudH0ucHQteGwtNHtwYWRkaW5nLXRvcDoxLjVyZW0gIWltcG9ydGFudH0ucHQteGwtNXtwYWRkaW5nLXRvcDozcmVtICFpbXBvcnRhbnR9LnBlLXhsLTB7cGFkZGluZy1yaWdodDowICFpbXBvcnRhbnR9LnBlLXhsLTF7cGFkZGluZy1yaWdodDouMjVyZW0gIWltcG9ydGFudH0ucGUteGwtMntwYWRkaW5nLXJpZ2h0Oi41cmVtICFpbXBvcnRhbnR9LnBlLXhsLTN7cGFkZGluZy1yaWdodDoxcmVtICFpbXBvcnRhbnR9LnBlLXhsLTR7cGFkZGluZy1yaWdodDoxLjVyZW0gIWltcG9ydGFudH0ucGUteGwtNXtwYWRkaW5nLXJpZ2h0OjNyZW0gIWltcG9ydGFudH0ucGIteGwtMHtwYWRkaW5nLWJvdHRvbTowICFpbXBvcnRhbnR9LnBiLXhsLTF7cGFkZGluZy1ib3R0b206LjI1cmVtICFpbXBvcnRhbnR9LnBiLXhsLTJ7cGFkZGluZy1ib3R0b206LjVyZW0gIWltcG9ydGFudH0ucGIteGwtM3twYWRkaW5nLWJvdHRvbToxcmVtICFpbXBvcnRhbnR9LnBiLXhsLTR7cGFkZGluZy1ib3R0b206MS41cmVtICFpbXBvcnRhbnR9LnBiLXhsLTV7cGFkZGluZy1ib3R0b206M3JlbSAhaW1wb3J0YW50fS5wcy14bC0we3BhZGRpbmctbGVmdDowICFpbXBvcnRhbnR9LnBzLXhsLTF7cGFkZGluZy1sZWZ0Oi4yNXJlbSAhaW1wb3J0YW50fS5wcy14bC0ye3BhZGRpbmctbGVmdDouNXJlbSAhaW1wb3J0YW50fS5wcy14bC0ze3BhZGRpbmctbGVmdDoxcmVtICFpbXBvcnRhbnR9LnBzLXhsLTR7cGFkZGluZy1sZWZ0OjEuNXJlbSAhaW1wb3J0YW50fS5wcy14bC01e3BhZGRpbmctbGVmdDozcmVtICFpbXBvcnRhbnR9LmdhcC14bC0we2dhcDowICFpbXBvcnRhbnR9LmdhcC14bC0xe2dhcDouMjVyZW0gIWltcG9ydGFudH0uZ2FwLXhsLTJ7Z2FwOi41cmVtICFpbXBvcnRhbnR9LmdhcC14bC0ze2dhcDoxcmVtICFpbXBvcnRhbnR9LmdhcC14bC00e2dhcDoxLjVyZW0gIWltcG9ydGFudH0uZ2FwLXhsLTV7Z2FwOjNyZW0gIWltcG9ydGFudH0ucm93LWdhcC14bC0we3Jvdy1nYXA6MCAhaW1wb3J0YW50fS5yb3ctZ2FwLXhsLTF7cm93LWdhcDouMjVyZW0gIWltcG9ydGFudH0ucm93LWdhcC14bC0ye3Jvdy1nYXA6LjVyZW0gIWltcG9ydGFudH0ucm93LWdhcC14bC0ze3Jvdy1nYXA6MXJlbSAhaW1wb3J0YW50fS5yb3ctZ2FwLXhsLTR7cm93LWdhcDoxLjVyZW0gIWltcG9ydGFudH0ucm93LWdhcC14bC01e3Jvdy1nYXA6M3JlbSAhaW1wb3J0YW50fS5jb2x1bW4tZ2FwLXhsLTB7Y29sdW1uLWdhcDowICFpbXBvcnRhbnR9LmNvbHVtbi1nYXAteGwtMXtjb2x1bW4tZ2FwOi4yNXJlbSAhaW1wb3J0YW50fS5jb2x1bW4tZ2FwLXhsLTJ7Y29sdW1uLWdhcDouNXJlbSAhaW1wb3J0YW50fS5jb2x1bW4tZ2FwLXhsLTN7Y29sdW1uLWdhcDoxcmVtICFpbXBvcnRhbnR9LmNvbHVtbi1nYXAteGwtNHtjb2x1bW4tZ2FwOjEuNXJlbSAhaW1wb3J0YW50fS5jb2x1bW4tZ2FwLXhsLTV7Y29sdW1uLWdhcDozcmVtICFpbXBvcnRhbnR9LnRleHQteGwtc3RhcnR7dGV4dC1hbGlnbjpsZWZ0ICFpbXBvcnRhbnR9LnRleHQteGwtZW5ke3RleHQtYWxpZ246cmlnaHQgIWltcG9ydGFudH0udGV4dC14bC1jZW50ZXJ7dGV4dC1hbGlnbjpjZW50ZXIgIWltcG9ydGFudH19QG1lZGlhIChtaW4td2lkdGg6IDE0MDBweCl7LmZsb2F0LXh4bC1zdGFydHtmbG9hdDpsZWZ0ICFpbXBvcnRhbnR9LmZsb2F0LXh4bC1lbmR7ZmxvYXQ6cmlnaHQgIWltcG9ydGFudH0uZmxvYXQteHhsLW5vbmV7ZmxvYXQ6bm9uZSAhaW1wb3J0YW50fS5vYmplY3QtZml0LXh4bC1jb250YWlue29iamVjdC1maXQ6Y29udGFpbiAhaW1wb3J0YW50fS5vYmplY3QtZml0LXh4bC1jb3ZlcntvYmplY3QtZml0OmNvdmVyICFpbXBvcnRhbnR9Lm9iamVjdC1maXQteHhsLWZpbGx7b2JqZWN0LWZpdDpmaWxsICFpbXBvcnRhbnR9Lm9iamVjdC1maXQteHhsLXNjYWxle29iamVjdC1maXQ6c2NhbGUtZG93biAhaW1wb3J0YW50fS5vYmplY3QtZml0LXh4bC1ub25le29iamVjdC1maXQ6bm9uZSAhaW1wb3J0YW50fS5kLXh4bC1pbmxpbmV7ZGlzcGxheTppbmxpbmUgIWltcG9ydGFudH0uZC14eGwtaW5saW5lLWJsb2Nre2Rpc3BsYXk6aW5saW5lLWJsb2NrICFpbXBvcnRhbnR9LmQteHhsLWJsb2Nre2Rpc3BsYXk6YmxvY2sgIWltcG9ydGFudH0uZC14eGwtZ3JpZHtkaXNwbGF5OmdyaWQgIWltcG9ydGFudH0uZC14eGwtaW5saW5lLWdyaWR7ZGlzcGxheTppbmxpbmUtZ3JpZCAhaW1wb3J0YW50fS5kLXh4bC10YWJsZXtkaXNwbGF5OnRhYmxlICFpbXBvcnRhbnR9LmQteHhsLXRhYmxlLXJvd3tkaXNwbGF5OnRhYmxlLXJvdyAhaW1wb3J0YW50fS5kLXh4bC10YWJsZS1jZWxse2Rpc3BsYXk6dGFibGUtY2VsbCAhaW1wb3J0YW50fS5kLXh4bC1mbGV4e2Rpc3BsYXk6ZmxleCAhaW1wb3J0YW50fS5kLXh4bC1pbmxpbmUtZmxleHtkaXNwbGF5OmlubGluZS1mbGV4ICFpbXBvcnRhbnR9LmQteHhsLW5vbmV7ZGlzcGxheTpub25lICFpbXBvcnRhbnR9LmZsZXgteHhsLWZpbGx7ZmxleDoxIDEgYXV0byAhaW1wb3J0YW50fS5mbGV4LXh4bC1yb3d7ZmxleC1kaXJlY3Rpb246cm93ICFpbXBvcnRhbnR9LmZsZXgteHhsLWNvbHVtbntmbGV4LWRpcmVjdGlvbjpjb2x1bW4gIWltcG9ydGFudH0uZmxleC14eGwtcm93LXJldmVyc2V7ZmxleC1kaXJlY3Rpb246cm93LXJldmVyc2UgIWltcG9ydGFudH0uZmxleC14eGwtY29sdW1uLXJldmVyc2V7ZmxleC1kaXJlY3Rpb246Y29sdW1uLXJldmVyc2UgIWltcG9ydGFudH0uZmxleC14eGwtZ3Jvdy0we2ZsZXgtZ3JvdzowICFpbXBvcnRhbnR9LmZsZXgteHhsLWdyb3ctMXtmbGV4LWdyb3c6MSAhaW1wb3J0YW50fS5mbGV4LXh4bC1zaHJpbmstMHtmbGV4LXNocmluazowICFpbXBvcnRhbnR9LmZsZXgteHhsLXNocmluay0xe2ZsZXgtc2hyaW5rOjEgIWltcG9ydGFudH0uZmxleC14eGwtd3JhcHtmbGV4LXdyYXA6d3JhcCAhaW1wb3J0YW50fS5mbGV4LXh4bC1ub3dyYXB7ZmxleC13cmFwOm5vd3JhcCAhaW1wb3J0YW50fS5mbGV4LXh4bC13cmFwLXJldmVyc2V7ZmxleC13cmFwOndyYXAtcmV2ZXJzZSAhaW1wb3J0YW50fS5qdXN0aWZ5LWNvbnRlbnQteHhsLXN0YXJ0e2p1c3RpZnktY29udGVudDpmbGV4LXN0YXJ0ICFpbXBvcnRhbnR9Lmp1c3RpZnktY29udGVudC14eGwtZW5ke2p1c3RpZnktY29udGVudDpmbGV4LWVuZCAhaW1wb3J0YW50fS5qdXN0aWZ5LWNvbnRlbnQteHhsLWNlbnRlcntqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyICFpbXBvcnRhbnR9Lmp1c3RpZnktY29udGVudC14eGwtYmV0d2VlbntqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2VlbiAhaW1wb3J0YW50fS5qdXN0aWZ5LWNvbnRlbnQteHhsLWFyb3VuZHtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYXJvdW5kICFpbXBvcnRhbnR9Lmp1c3RpZnktY29udGVudC14eGwtZXZlbmx5e2p1c3RpZnktY29udGVudDpzcGFjZS1ldmVubHkgIWltcG9ydGFudH0uYWxpZ24taXRlbXMteHhsLXN0YXJ0e2FsaWduLWl0ZW1zOmZsZXgtc3RhcnQgIWltcG9ydGFudH0uYWxpZ24taXRlbXMteHhsLWVuZHthbGlnbi1pdGVtczpmbGV4LWVuZCAhaW1wb3J0YW50fS5hbGlnbi1pdGVtcy14eGwtY2VudGVye2FsaWduLWl0ZW1zOmNlbnRlciAhaW1wb3J0YW50fS5hbGlnbi1pdGVtcy14eGwtYmFzZWxpbmV7YWxpZ24taXRlbXM6YmFzZWxpbmUgIWltcG9ydGFudH0uYWxpZ24taXRlbXMteHhsLXN0cmV0Y2h7YWxpZ24taXRlbXM6c3RyZXRjaCAhaW1wb3J0YW50fS5hbGlnbi1jb250ZW50LXh4bC1zdGFydHthbGlnbi1jb250ZW50OmZsZXgtc3RhcnQgIWltcG9ydGFudH0uYWxpZ24tY29udGVudC14eGwtZW5ke2FsaWduLWNvbnRlbnQ6ZmxleC1lbmQgIWltcG9ydGFudH0uYWxpZ24tY29udGVudC14eGwtY2VudGVye2FsaWduLWNvbnRlbnQ6Y2VudGVyICFpbXBvcnRhbnR9LmFsaWduLWNvbnRlbnQteHhsLWJldHdlZW57YWxpZ24tY29udGVudDpzcGFjZS1iZXR3ZWVuICFpbXBvcnRhbnR9LmFsaWduLWNvbnRlbnQteHhsLWFyb3VuZHthbGlnbi1jb250ZW50OnNwYWNlLWFyb3VuZCAhaW1wb3J0YW50fS5hbGlnbi1jb250ZW50LXh4bC1zdHJldGNoe2FsaWduLWNvbnRlbnQ6c3RyZXRjaCAhaW1wb3J0YW50fS5hbGlnbi1zZWxmLXh4bC1hdXRve2FsaWduLXNlbGY6YXV0byAhaW1wb3J0YW50fS5hbGlnbi1zZWxmLXh4bC1zdGFydHthbGlnbi1zZWxmOmZsZXgtc3RhcnQgIWltcG9ydGFudH0uYWxpZ24tc2VsZi14eGwtZW5ke2FsaWduLXNlbGY6ZmxleC1lbmQgIWltcG9ydGFudH0uYWxpZ24tc2VsZi14eGwtY2VudGVye2FsaWduLXNlbGY6Y2VudGVyICFpbXBvcnRhbnR9LmFsaWduLXNlbGYteHhsLWJhc2VsaW5le2FsaWduLXNlbGY6YmFzZWxpbmUgIWltcG9ydGFudH0uYWxpZ24tc2VsZi14eGwtc3RyZXRjaHthbGlnbi1zZWxmOnN0cmV0Y2ggIWltcG9ydGFudH0ub3JkZXIteHhsLWZpcnN0e29yZGVyOi0xICFpbXBvcnRhbnR9Lm9yZGVyLXh4bC0we29yZGVyOjAgIWltcG9ydGFudH0ub3JkZXIteHhsLTF7b3JkZXI6MSAhaW1wb3J0YW50fS5vcmRlci14eGwtMntvcmRlcjoyICFpbXBvcnRhbnR9Lm9yZGVyLXh4bC0ze29yZGVyOjMgIWltcG9ydGFudH0ub3JkZXIteHhsLTR7b3JkZXI6NCAhaW1wb3J0YW50fS5vcmRlci14eGwtNXtvcmRlcjo1ICFpbXBvcnRhbnR9Lm9yZGVyLXh4bC1sYXN0e29yZGVyOjYgIWltcG9ydGFudH0ubS14eGwtMHttYXJnaW46MCAhaW1wb3J0YW50fS5tLXh4bC0xe21hcmdpbjouMjVyZW0gIWltcG9ydGFudH0ubS14eGwtMnttYXJnaW46LjVyZW0gIWltcG9ydGFudH0ubS14eGwtM3ttYXJnaW46MXJlbSAhaW1wb3J0YW50fS5tLXh4bC00e21hcmdpbjoxLjVyZW0gIWltcG9ydGFudH0ubS14eGwtNXttYXJnaW46M3JlbSAhaW1wb3J0YW50fS5tLXh4bC1hdXRve21hcmdpbjphdXRvICFpbXBvcnRhbnR9Lm14LXh4bC0we21hcmdpbi1yaWdodDowICFpbXBvcnRhbnQ7bWFyZ2luLWxlZnQ6MCAhaW1wb3J0YW50fS5teC14eGwtMXttYXJnaW4tcmlnaHQ6LjI1cmVtICFpbXBvcnRhbnQ7bWFyZ2luLWxlZnQ6LjI1cmVtICFpbXBvcnRhbnR9Lm14LXh4bC0ye21hcmdpbi1yaWdodDouNXJlbSAhaW1wb3J0YW50O21hcmdpbi1sZWZ0Oi41cmVtICFpbXBvcnRhbnR9Lm14LXh4bC0ze21hcmdpbi1yaWdodDoxcmVtICFpbXBvcnRhbnQ7bWFyZ2luLWxlZnQ6MXJlbSAhaW1wb3J0YW50fS5teC14eGwtNHttYXJnaW4tcmlnaHQ6MS41cmVtICFpbXBvcnRhbnQ7bWFyZ2luLWxlZnQ6MS41cmVtICFpbXBvcnRhbnR9Lm14LXh4bC01e21hcmdpbi1yaWdodDozcmVtICFpbXBvcnRhbnQ7bWFyZ2luLWxlZnQ6M3JlbSAhaW1wb3J0YW50fS5teC14eGwtYXV0b3ttYXJnaW4tcmlnaHQ6YXV0byAhaW1wb3J0YW50O21hcmdpbi1sZWZ0OmF1dG8gIWltcG9ydGFudH0ubXkteHhsLTB7bWFyZ2luLXRvcDowICFpbXBvcnRhbnQ7bWFyZ2luLWJvdHRvbTowICFpbXBvcnRhbnR9Lm15LXh4bC0xe21hcmdpbi10b3A6LjI1cmVtICFpbXBvcnRhbnQ7bWFyZ2luLWJvdHRvbTouMjVyZW0gIWltcG9ydGFudH0ubXkteHhsLTJ7bWFyZ2luLXRvcDouNXJlbSAhaW1wb3J0YW50O21hcmdpbi1ib3R0b206LjVyZW0gIWltcG9ydGFudH0ubXkteHhsLTN7bWFyZ2luLXRvcDoxcmVtICFpbXBvcnRhbnQ7bWFyZ2luLWJvdHRvbToxcmVtICFpbXBvcnRhbnR9Lm15LXh4bC00e21hcmdpbi10b3A6MS41cmVtICFpbXBvcnRhbnQ7bWFyZ2luLWJvdHRvbToxLjVyZW0gIWltcG9ydGFudH0ubXkteHhsLTV7bWFyZ2luLXRvcDozcmVtICFpbXBvcnRhbnQ7bWFyZ2luLWJvdHRvbTozcmVtICFpbXBvcnRhbnR9Lm15LXh4bC1hdXRve21hcmdpbi10b3A6YXV0byAhaW1wb3J0YW50O21hcmdpbi1ib3R0b206YXV0byAhaW1wb3J0YW50fS5tdC14eGwtMHttYXJnaW4tdG9wOjAgIWltcG9ydGFudH0ubXQteHhsLTF7bWFyZ2luLXRvcDouMjVyZW0gIWltcG9ydGFudH0ubXQteHhsLTJ7bWFyZ2luLXRvcDouNXJlbSAhaW1wb3J0YW50fS5tdC14eGwtM3ttYXJnaW4tdG9wOjFyZW0gIWltcG9ydGFudH0ubXQteHhsLTR7bWFyZ2luLXRvcDoxLjVyZW0gIWltcG9ydGFudH0ubXQteHhsLTV7bWFyZ2luLXRvcDozcmVtICFpbXBvcnRhbnR9Lm10LXh4bC1hdXRve21hcmdpbi10b3A6YXV0byAhaW1wb3J0YW50fS5tZS14eGwtMHttYXJnaW4tcmlnaHQ6MCAhaW1wb3J0YW50fS5tZS14eGwtMXttYXJnaW4tcmlnaHQ6LjI1cmVtICFpbXBvcnRhbnR9Lm1lLXh4bC0ye21hcmdpbi1yaWdodDouNXJlbSAhaW1wb3J0YW50fS5tZS14eGwtM3ttYXJnaW4tcmlnaHQ6MXJlbSAhaW1wb3J0YW50fS5tZS14eGwtNHttYXJnaW4tcmlnaHQ6MS41cmVtICFpbXBvcnRhbnR9Lm1lLXh4bC01e21hcmdpbi1yaWdodDozcmVtICFpbXBvcnRhbnR9Lm1lLXh4bC1hdXRve21hcmdpbi1yaWdodDphdXRvICFpbXBvcnRhbnR9Lm1iLXh4bC0we21hcmdpbi1ib3R0b206MCAhaW1wb3J0YW50fS5tYi14eGwtMXttYXJnaW4tYm90dG9tOi4yNXJlbSAhaW1wb3J0YW50fS5tYi14eGwtMnttYXJnaW4tYm90dG9tOi41cmVtICFpbXBvcnRhbnR9Lm1iLXh4bC0ze21hcmdpbi1ib3R0b206MXJlbSAhaW1wb3J0YW50fS5tYi14eGwtNHttYXJnaW4tYm90dG9tOjEuNXJlbSAhaW1wb3J0YW50fS5tYi14eGwtNXttYXJnaW4tYm90dG9tOjNyZW0gIWltcG9ydGFudH0ubWIteHhsLWF1dG97bWFyZ2luLWJvdHRvbTphdXRvICFpbXBvcnRhbnR9Lm1zLXh4bC0we21hcmdpbi1sZWZ0OjAgIWltcG9ydGFudH0ubXMteHhsLTF7bWFyZ2luLWxlZnQ6LjI1cmVtICFpbXBvcnRhbnR9Lm1zLXh4bC0ye21hcmdpbi1sZWZ0Oi41cmVtICFpbXBvcnRhbnR9Lm1zLXh4bC0ze21hcmdpbi1sZWZ0OjFyZW0gIWltcG9ydGFudH0ubXMteHhsLTR7bWFyZ2luLWxlZnQ6MS41cmVtICFpbXBvcnRhbnR9Lm1zLXh4bC01e21hcmdpbi1sZWZ0OjNyZW0gIWltcG9ydGFudH0ubXMteHhsLWF1dG97bWFyZ2luLWxlZnQ6YXV0byAhaW1wb3J0YW50fS5wLXh4bC0we3BhZGRpbmc6MCAhaW1wb3J0YW50fS5wLXh4bC0xe3BhZGRpbmc6LjI1cmVtICFpbXBvcnRhbnR9LnAteHhsLTJ7cGFkZGluZzouNXJlbSAhaW1wb3J0YW50fS5wLXh4bC0ze3BhZGRpbmc6MXJlbSAhaW1wb3J0YW50fS5wLXh4bC00e3BhZGRpbmc6MS41cmVtICFpbXBvcnRhbnR9LnAteHhsLTV7cGFkZGluZzozcmVtICFpbXBvcnRhbnR9LnB4LXh4bC0we3BhZGRpbmctcmlnaHQ6MCAhaW1wb3J0YW50O3BhZGRpbmctbGVmdDowICFpbXBvcnRhbnR9LnB4LXh4bC0xe3BhZGRpbmctcmlnaHQ6LjI1cmVtICFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0Oi4yNXJlbSAhaW1wb3J0YW50fS5weC14eGwtMntwYWRkaW5nLXJpZ2h0Oi41cmVtICFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0Oi41cmVtICFpbXBvcnRhbnR9LnB4LXh4bC0ze3BhZGRpbmctcmlnaHQ6MXJlbSAhaW1wb3J0YW50O3BhZGRpbmctbGVmdDoxcmVtICFpbXBvcnRhbnR9LnB4LXh4bC00e3BhZGRpbmctcmlnaHQ6MS41cmVtICFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjEuNXJlbSAhaW1wb3J0YW50fS5weC14eGwtNXtwYWRkaW5nLXJpZ2h0OjNyZW0gIWltcG9ydGFudDtwYWRkaW5nLWxlZnQ6M3JlbSAhaW1wb3J0YW50fS5weS14eGwtMHtwYWRkaW5nLXRvcDowICFpbXBvcnRhbnQ7cGFkZGluZy1ib3R0b206MCAhaW1wb3J0YW50fS5weS14eGwtMXtwYWRkaW5nLXRvcDouMjVyZW0gIWltcG9ydGFudDtwYWRkaW5nLWJvdHRvbTouMjVyZW0gIWltcG9ydGFudH0ucHkteHhsLTJ7cGFkZGluZy10b3A6LjVyZW0gIWltcG9ydGFudDtwYWRkaW5nLWJvdHRvbTouNXJlbSAhaW1wb3J0YW50fS5weS14eGwtM3twYWRkaW5nLXRvcDoxcmVtICFpbXBvcnRhbnQ7cGFkZGluZy1ib3R0b206MXJlbSAhaW1wb3J0YW50fS5weS14eGwtNHtwYWRkaW5nLXRvcDoxLjVyZW0gIWltcG9ydGFudDtwYWRkaW5nLWJvdHRvbToxLjVyZW0gIWltcG9ydGFudH0ucHkteHhsLTV7cGFkZGluZy10b3A6M3JlbSAhaW1wb3J0YW50O3BhZGRpbmctYm90dG9tOjNyZW0gIWltcG9ydGFudH0ucHQteHhsLTB7cGFkZGluZy10b3A6MCAhaW1wb3J0YW50fS5wdC14eGwtMXtwYWRkaW5nLXRvcDouMjVyZW0gIWltcG9ydGFudH0ucHQteHhsLTJ7cGFkZGluZy10b3A6LjVyZW0gIWltcG9ydGFudH0ucHQteHhsLTN7cGFkZGluZy10b3A6MXJlbSAhaW1wb3J0YW50fS5wdC14eGwtNHtwYWRkaW5nLXRvcDoxLjVyZW0gIWltcG9ydGFudH0ucHQteHhsLTV7cGFkZGluZy10b3A6M3JlbSAhaW1wb3J0YW50fS5wZS14eGwtMHtwYWRkaW5nLXJpZ2h0OjAgIWltcG9ydGFudH0ucGUteHhsLTF7cGFkZGluZy1yaWdodDouMjVyZW0gIWltcG9ydGFudH0ucGUteHhsLTJ7cGFkZGluZy1yaWdodDouNXJlbSAhaW1wb3J0YW50fS5wZS14eGwtM3twYWRkaW5nLXJpZ2h0OjFyZW0gIWltcG9ydGFudH0ucGUteHhsLTR7cGFkZGluZy1yaWdodDoxLjVyZW0gIWltcG9ydGFudH0ucGUteHhsLTV7cGFkZGluZy1yaWdodDozcmVtICFpbXBvcnRhbnR9LnBiLXh4bC0we3BhZGRpbmctYm90dG9tOjAgIWltcG9ydGFudH0ucGIteHhsLTF7cGFkZGluZy1ib3R0b206LjI1cmVtICFpbXBvcnRhbnR9LnBiLXh4bC0ye3BhZGRpbmctYm90dG9tOi41cmVtICFpbXBvcnRhbnR9LnBiLXh4bC0ze3BhZGRpbmctYm90dG9tOjFyZW0gIWltcG9ydGFudH0ucGIteHhsLTR7cGFkZGluZy1ib3R0b206MS41cmVtICFpbXBvcnRhbnR9LnBiLXh4bC01e3BhZGRpbmctYm90dG9tOjNyZW0gIWltcG9ydGFudH0ucHMteHhsLTB7cGFkZGluZy1sZWZ0OjAgIWltcG9ydGFudH0ucHMteHhsLTF7cGFkZGluZy1sZWZ0Oi4yNXJlbSAhaW1wb3J0YW50fS5wcy14eGwtMntwYWRkaW5nLWxlZnQ6LjVyZW0gIWltcG9ydGFudH0ucHMteHhsLTN7cGFkZGluZy1sZWZ0OjFyZW0gIWltcG9ydGFudH0ucHMteHhsLTR7cGFkZGluZy1sZWZ0OjEuNXJlbSAhaW1wb3J0YW50fS5wcy14eGwtNXtwYWRkaW5nLWxlZnQ6M3JlbSAhaW1wb3J0YW50fS5nYXAteHhsLTB7Z2FwOjAgIWltcG9ydGFudH0uZ2FwLXh4bC0xe2dhcDouMjVyZW0gIWltcG9ydGFudH0uZ2FwLXh4bC0ye2dhcDouNXJlbSAhaW1wb3J0YW50fS5nYXAteHhsLTN7Z2FwOjFyZW0gIWltcG9ydGFudH0uZ2FwLXh4bC00e2dhcDoxLjVyZW0gIWltcG9ydGFudH0uZ2FwLXh4bC01e2dhcDozcmVtICFpbXBvcnRhbnR9LnJvdy1nYXAteHhsLTB7cm93LWdhcDowICFpbXBvcnRhbnR9LnJvdy1nYXAteHhsLTF7cm93LWdhcDouMjVyZW0gIWltcG9ydGFudH0ucm93LWdhcC14eGwtMntyb3ctZ2FwOi41cmVtICFpbXBvcnRhbnR9LnJvdy1nYXAteHhsLTN7cm93LWdhcDoxcmVtICFpbXBvcnRhbnR9LnJvdy1nYXAteHhsLTR7cm93LWdhcDoxLjVyZW0gIWltcG9ydGFudH0ucm93LWdhcC14eGwtNXtyb3ctZ2FwOjNyZW0gIWltcG9ydGFudH0uY29sdW1uLWdhcC14eGwtMHtjb2x1bW4tZ2FwOjAgIWltcG9ydGFudH0uY29sdW1uLWdhcC14eGwtMXtjb2x1bW4tZ2FwOi4yNXJlbSAhaW1wb3J0YW50fS5jb2x1bW4tZ2FwLXh4bC0ye2NvbHVtbi1nYXA6LjVyZW0gIWltcG9ydGFudH0uY29sdW1uLWdhcC14eGwtM3tjb2x1bW4tZ2FwOjFyZW0gIWltcG9ydGFudH0uY29sdW1uLWdhcC14eGwtNHtjb2x1bW4tZ2FwOjEuNXJlbSAhaW1wb3J0YW50fS5jb2x1bW4tZ2FwLXh4bC01e2NvbHVtbi1nYXA6M3JlbSAhaW1wb3J0YW50fS50ZXh0LXh4bC1zdGFydHt0ZXh0LWFsaWduOmxlZnQgIWltcG9ydGFudH0udGV4dC14eGwtZW5ke3RleHQtYWxpZ246cmlnaHQgIWltcG9ydGFudH0udGV4dC14eGwtY2VudGVye3RleHQtYWxpZ246Y2VudGVyICFpbXBvcnRhbnR9fUBtZWRpYSAobWluLXdpZHRoOiAxMjAwcHgpey5mcy0xe2ZvbnQtc2l6ZToyLjVyZW0gIWltcG9ydGFudH0uZnMtMntmb250LXNpemU6MnJlbSAhaW1wb3J0YW50fS5mcy0ze2ZvbnQtc2l6ZToxLjc1cmVtICFpbXBvcnRhbnR9LmZzLTR7Zm9udC1zaXplOjEuNXJlbSAhaW1wb3J0YW50fX1AbWVkaWEgcHJpbnR7LmQtcHJpbnQtaW5saW5le2Rpc3BsYXk6aW5saW5lICFpbXBvcnRhbnR9LmQtcHJpbnQtaW5saW5lLWJsb2Nre2Rpc3BsYXk6aW5saW5lLWJsb2NrICFpbXBvcnRhbnR9LmQtcHJpbnQtYmxvY2t7ZGlzcGxheTpibG9jayAhaW1wb3J0YW50fS5kLXByaW50LWdyaWR7ZGlzcGxheTpncmlkICFpbXBvcnRhbnR9LmQtcHJpbnQtaW5saW5lLWdyaWR7ZGlzcGxheTppbmxpbmUtZ3JpZCAhaW1wb3J0YW50fS5kLXByaW50LXRhYmxle2Rpc3BsYXk6dGFibGUgIWltcG9ydGFudH0uZC1wcmludC10YWJsZS1yb3d7ZGlzcGxheTp0YWJsZS1yb3cgIWltcG9ydGFudH0uZC1wcmludC10YWJsZS1jZWxse2Rpc3BsYXk6dGFibGUtY2VsbCAhaW1wb3J0YW50fS5kLXByaW50LWZsZXh7ZGlzcGxheTpmbGV4ICFpbXBvcnRhbnR9LmQtcHJpbnQtaW5saW5lLWZsZXh7ZGlzcGxheTppbmxpbmUtZmxleCAhaW1wb3J0YW50fS5kLXByaW50LW5vbmV7ZGlzcGxheTpub25lICFpbXBvcnRhbnR9fVxuYCwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9zcmMvaW5kZXguc2Nzc1wiLFwid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9zY3NzL21peGlucy9fYmFubmVyLnNjc3NcIixcIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9ib290c3RyYXAvc2Nzcy9fcm9vdC5zY3NzXCIsXCJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL3Njc3MvdmVuZG9yL19yZnMuc2Nzc1wiLFwid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9zY3NzL19yZWJvb3Quc2Nzc1wiLFwid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9zY3NzL192YXJpYWJsZXMuc2Nzc1wiLFwid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9zY3NzL21peGlucy9fYm9yZGVyLXJhZGl1cy5zY3NzXCIsXCJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL3Njc3MvX3R5cGUuc2Nzc1wiLFwid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9zY3NzL21peGlucy9fbGlzdHMuc2Nzc1wiLFwid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9zY3NzL21peGlucy9faW1hZ2Uuc2Nzc1wiLFwid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9zY3NzL19pbWFnZXMuc2Nzc1wiLFwid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9zY3NzL21peGlucy9fY29udGFpbmVyLnNjc3NcIixcIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9ib290c3RyYXAvc2Nzcy9taXhpbnMvX2JyZWFrcG9pbnRzLnNjc3NcIixcIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9ib290c3RyYXAvc2Nzcy9fY29udGFpbmVycy5zY3NzXCIsXCJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL3Njc3MvX2dyaWQuc2Nzc1wiLFwid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9zY3NzL21peGlucy9fZ3JpZC5zY3NzXCIsXCJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL3Njc3MvX3RhYmxlcy5zY3NzXCIsXCJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL3Njc3MvbWl4aW5zL190YWJsZS12YXJpYW50cy5zY3NzXCIsXCJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL3Njc3MvZm9ybXMvX2xhYmVscy5zY3NzXCIsXCJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL3Njc3MvX2Z1bmN0aW9ucy5zY3NzXCIsXCJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL3Njc3MvZm9ybXMvX2Zvcm0tdGV4dC5zY3NzXCIsXCJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL3Njc3MvZm9ybXMvX2Zvcm0tY29udHJvbC5zY3NzXCIsXCJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL3Njc3MvbWl4aW5zL190cmFuc2l0aW9uLnNjc3NcIixcIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9ib290c3RyYXAvc2Nzcy9taXhpbnMvX2dyYWRpZW50cy5zY3NzXCIsXCJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL3Njc3MvZm9ybXMvX2Zvcm0tc2VsZWN0LnNjc3NcIixcIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9ib290c3RyYXAvc2Nzcy9mb3Jtcy9fZm9ybS1jaGVjay5zY3NzXCIsXCJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL3Njc3MvZm9ybXMvX2Zvcm0tcmFuZ2Uuc2Nzc1wiLFwid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9zY3NzL2Zvcm1zL19mbG9hdGluZy1sYWJlbHMuc2Nzc1wiLFwid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9zY3NzL2Zvcm1zL19pbnB1dC1ncm91cC5zY3NzXCIsXCJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL3Njc3MvbWl4aW5zL19mb3Jtcy5zY3NzXCIsXCJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL3Njc3MvX2J1dHRvbnMuc2Nzc1wiLFwid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9zY3NzL21peGlucy9fYnV0dG9ucy5zY3NzXCIsXCJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL3Njc3MvX3RyYW5zaXRpb25zLnNjc3NcIixcIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9ib290c3RyYXAvc2Nzcy9fZHJvcGRvd24uc2Nzc1wiLFwid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9zY3NzL21peGlucy9fY2FyZXQuc2Nzc1wiLFwid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9zY3NzL19idXR0b24tZ3JvdXAuc2Nzc1wiLFwid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9zY3NzL19uYXYuc2Nzc1wiLFwid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9zY3NzL19uYXZiYXIuc2Nzc1wiLFwid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9zY3NzL19jYXJkLnNjc3NcIixcIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9ib290c3RyYXAvc2Nzcy9fYWNjb3JkaW9uLnNjc3NcIixcIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9ib290c3RyYXAvc2Nzcy9fYnJlYWRjcnVtYi5zY3NzXCIsXCJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL3Njc3MvX3BhZ2luYXRpb24uc2Nzc1wiLFwid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9zY3NzL21peGlucy9fcGFnaW5hdGlvbi5zY3NzXCIsXCJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL3Njc3MvX2JhZGdlLnNjc3NcIixcIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9ib290c3RyYXAvc2Nzcy9fYWxlcnQuc2Nzc1wiLFwid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9zY3NzL19wcm9ncmVzcy5zY3NzXCIsXCJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL3Njc3MvX2xpc3QtZ3JvdXAuc2Nzc1wiLFwid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9zY3NzL19jbG9zZS5zY3NzXCIsXCJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL3Njc3MvX3RvYXN0cy5zY3NzXCIsXCJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL3Njc3MvX21vZGFsLnNjc3NcIixcIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9ib290c3RyYXAvc2Nzcy9taXhpbnMvX2JhY2tkcm9wLnNjc3NcIixcIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9ib290c3RyYXAvc2Nzcy9fdG9vbHRpcC5zY3NzXCIsXCJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL3Njc3MvbWl4aW5zL19yZXNldC10ZXh0LnNjc3NcIixcIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9ib290c3RyYXAvc2Nzcy9fcG9wb3Zlci5zY3NzXCIsXCJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL3Njc3MvX2Nhcm91c2VsLnNjc3NcIixcIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9ib290c3RyYXAvc2Nzcy9taXhpbnMvX2NsZWFyZml4LnNjc3NcIixcIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9ib290c3RyYXAvc2Nzcy9fc3Bpbm5lcnMuc2Nzc1wiLFwid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9zY3NzL19vZmZjYW52YXMuc2Nzc1wiLFwid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9zY3NzL19wbGFjZWhvbGRlcnMuc2Nzc1wiLFwid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9zY3NzL2hlbHBlcnMvX2NvbG9yLWJnLnNjc3NcIixcIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9ib290c3RyYXAvc2Nzcy9oZWxwZXJzL19jb2xvcmVkLWxpbmtzLnNjc3NcIixcIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9ib290c3RyYXAvc2Nzcy9oZWxwZXJzL19mb2N1cy1yaW5nLnNjc3NcIixcIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9ib290c3RyYXAvc2Nzcy9oZWxwZXJzL19pY29uLWxpbmsuc2Nzc1wiLFwid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9zY3NzL2hlbHBlcnMvX3JhdGlvLnNjc3NcIixcIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9ib290c3RyYXAvc2Nzcy9oZWxwZXJzL19wb3NpdGlvbi5zY3NzXCIsXCJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL3Njc3MvaGVscGVycy9fc3RhY2tzLnNjc3NcIixcIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9ib290c3RyYXAvc2Nzcy9taXhpbnMvX3Zpc3VhbGx5LWhpZGRlbi5zY3NzXCIsXCJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL3Njc3MvaGVscGVycy9fc3RyZXRjaGVkLWxpbmsuc2Nzc1wiLFwid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9zY3NzL21peGlucy9fdGV4dC10cnVuY2F0ZS5zY3NzXCIsXCJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL3Njc3MvaGVscGVycy9fdGV4dC10cnVuY2F0aW9uLnNjc3NcIixcIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9ib290c3RyYXAvc2Nzcy9oZWxwZXJzL192ci5zY3NzXCIsXCJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL3Njc3MvbWl4aW5zL191dGlsaXRpZXMuc2Nzc1wiLFwid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9zY3NzL3V0aWxpdGllcy9fYXBpLnNjc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUEsWUFDSSxlQUFnQixDQUNoQixjQUFlLENBQ2xCLHFCQU1HLHFCQUFzQixDQUN6QixNQUdHLGlCQUFrQixDQUNsQixtQkFBb0IsQ0FDcEIsWUFBYSxDQUNiLHlCQUEwQixDQUMxQixxQkFBc0IsQ0FDdEIsV0FBWSxDQUNaLG9CQUFxQixDQUNyQixxQkFBc0IsQ0FDdEIsMEJBQTJCLENBQzNCLGtDQUFzQyxDQUN0QyxxQkFBc0IsQ0FDekIsU0FHRyxjQUFlLENBQ2YsYUFBYyxDQUNqQiwyREFHRyw4QkFBK0IsQ0FDL0IsK0JBQWdDLENBQ25DLHlEQUdHLGtDQUFtQyxDQUNuQyxpQ0FBa0MsQ0FDckMsV0FHRyxpQkFBa0IsQ0FDbEIsYUFBYyxDQUNkLGNBQWUsQ0FDZixlQUFnQixDQUNuQixZQUdHLHFCQUFzQixDQUN6QixlQUdHLG9CQUFxQixDQUNyQixlQUFnQixDQUNuQixzQkFHRyxlQUFnQixDQUNuQixpQkFHRyxvQkFBcUIsQ0FDeEIsc0JBR0csbUJBQW9CLENBQ3ZCLGFBR0csdUJBQXdCLENBQ3hCLGVBQWdCLENBQ2hCLGlDQUFxQyxDQUNyQyx5Q0FBNkMsQ0FDaEQseUJBR0cseURBQTBELENBQzdELHNEQUdHLFlBQWEsQ0FDaEIsYUFHRyx1QkFBd0IsQ0FDeEIsaUNBQXFDLENBQ3JDLHNDQUEwQyxDQUM3Qyx3QkFHRyx5REFBMEQsQ0FDN0Qsa0JBR0csc0JBQXVCLENBQ3ZCLHNCQUF1QixDQUN2QixxQkFBc0IsQ0FDdEIsZUFBZ0IsQ0FDbkIsbUJBR0csc0JBQXVCLENBQ3ZCLHFCQUFzQixDQUN6QixrQkFHRyxpQkFBa0IsQ0FDbEIsS0FBTSxDQUNOLE9BQVEsQ0FDUixRQUFTLENBQ1QsTUFBTyxDQUNQLGVBQWdCLENBQ25CLHlDQUtHLG1CQUFvQixDQUNwQixhQUFjLENBQ2QsVUFBVyxDQUNkLHdCQUlHLDBDQUEyQyxDQUMzQywyQ0FBNEMsQ0FDL0MsMkJBSUcsOENBQStDLENBQy9DLDZDQUE4QyxDQUNqRCxpQkFHRyxrQkFBbUIsQ0FDdEIsMEJBR0csV0FDSSxtQkFBb0IsQ0FDcEIsWUFBYSxDQUNiLHNCQUF1QixDQUN2QixrQkFBbUIsQ0FDbkIsa0JBQW1CLENBQ25CLGlCQUFrQixDQVgxQixpQkFjUSxlQUFnQixDQUNoQixXQUFZLENBQ1osaUJBQWtCLENBQ2xCLGVBQWdCLENBQ2hCLGdCQUFpQixDQUNwQixDQUdMLGtCQUNJLGtCQUFtQixDQUN0QiwwQkFHRyxZQUNJLG1CQUFvQixDQUNwQixZQUFhLENBQ2Isc0JBQXVCLENBQ3ZCLGtCQUFtQixDQVQzQixrQkFZUSxlQUFnQixDQUNoQixXQUFZLENBQ1osZUFBZ0IsQ0FDbkIsd0JBRUcsYUFBYyxDQUNkLGFBQWMsQ0FDakIsbUNBRUcseUJBQTBCLENBQzFCLDRCQUE2QixDQUNoQyxpR0FHRyx5QkFBMEIsQ0FDN0Isb0dBR0csNEJBQTZCLENBQ2hDLG9DQUVHLHdCQUF5QixDQUN6QiwyQkFBNEIsQ0FDL0IsbUdBR0csd0JBQXlCLENBQzVCLHNHQUdHLDJCQUE0QixDQUMvQixDQUdMLGNBQ0ksYUFBYyxDQUNkLFVBQVcsQ0FDWCxrQ0FBbUMsQ0FDbkMsd0JBQXlCLENBQ3pCLGNBQWUsQ0FDZixlQUFnQixDQUNoQixlQUFnQixDQUNoQixhQUFjLENBQ2QscUJBQXNCLENBQ3RCLDJCQUE0QixDQUM1Qix3QkFBeUIsQ0FDekIscUJBQXNCLENBQ3RCLHVFQUF3RSxDQUMzRSx3Q0FkRCxjQWtCUSxlQUFnQixDQUNuQixDQUdMLDBCQUNJLDRCQUE2QixDQUM3QixRQUFTLENBQ1osNkJBR0csaUJBQWtCLENBQ2xCLHlCQUEwQixDQUM3QixvQkFHRyxhQUFjLENBQ2QscUJBQXNCLENBQ3RCLG9CQUFxQixDQUNyQixTQUFVLENBQ1YsNENBQWdELENBQ25ELHlDQUdHLGFBQWMsQ0FDZCxTQUFVLENBQ2IsZ0NBR0csYUFBYyxDQUNkLFNBQVUsQ0FDYixvQ0FHRyxhQUFjLENBQ2QsU0FBVSxDQUNiLHFDQUdHLGFBQWMsQ0FDZCxTQUFVLENBQ2IsMkJBR0csYUFBYyxDQUNkLFNBQVUsQ0FDYiwrQ0FHRyx3QkFBeUIsQ0FDekIsU0FBVSxDQUNiLHFDQUdHLGFBQWMsQ0FDZCxxQkFBc0IsQ0FDekIsdUNBSUcsYUFBYyxDQUNkLFVBQVcsQ0FDZCxzQkFFRyxXQUFZLENBQ2Y7Ozs7SUF6UkcsQ0NDQyw4QkNJRCxrQkFBd0IsQ0FBeEIsb0JBQXdCLENBQXhCLG9CQUF3QixDQUF4QixrQkFBd0IsQ0FBeEIsaUJBQXdCLENBQXhCLG9CQUF3QixDQUF4QixvQkFBd0IsQ0FBeEIsbUJBQXdCLENBQXhCLGtCQUF3QixDQUF4QixrQkFBd0IsQ0FBeEIsZ0JBQXdCLENBQXhCLGdCQUF3QixDQUF4QixrQkFBd0IsQ0FBeEIsdUJBQXdCLENBSXhCLHNCQUFrQyxDQUFsQyxzQkFBa0MsQ0FBbEMsc0JBQWtDLENBQWxDLHNCQUFrQyxDQUFsQyxzQkFBa0MsQ0FBbEMsc0JBQWtDLENBQWxDLHNCQUFrQyxDQUFsQyxzQkFBa0MsQ0FBbEMsc0JBQWtDLENBSWxDLHFCQUF3QixDQUl4QiwyQkFBZ0MsQ0FJaEMsbUNBQW9ELENBQXBELHFDQUFvRCxDQUFwRCxtQ0FBb0QsQ0FBcEQsZ0NBQW9ELENBQXBELG1DQUFvRCxDQUFwRCxrQ0FBb0QsQ0FBcEQsaUNBQW9ELENBQXBELGdDQUFvRCxDQUlwRCwrQkFBNEMsQ0FBNUMsaUNBQTRDLENBQTVDLCtCQUE0QyxDQUE1Qyw0QkFBNEMsQ0FBNUMsK0JBQTRDLENBQTVDLDhCQUE0QyxDQUE1Qyw2QkFBNEMsQ0FBNUMsNEJBQTRDLENBSTVDLG1DQUFvRCxDQUFwRCxxQ0FBb0QsQ0FBcEQsbUNBQW9ELENBQXBELGdDQUFvRCxDQUFwRCxtQ0FBb0QsQ0FBcEQsa0NBQW9ELENBQXBELGlDQUFvRCxDQUFwRCxnQ0FBb0QsQ0FHdEQsMkJBQWlDLENBQ2pDLHFCQUFpQyxDQU1qQyxxTkFBNkMsQ0FDN0MseUdBQTJDLENBQzNDLG1GQUErQixDQU8vQixnREFBK0MsQ0MyTzNDLHdCQW5FK0IsQ0R0S25DLDBCQUErQyxDQUMvQywwQkFBK0MsQ0FLL0Msd0JBQW1DLENBQ25DLDZCQUEyQyxDQUMzQyxrQkFBNkIsQ0FDN0IsNkJBQXFDLENBRXJDLHlCQUEyQyxDQUMzQyw4QkFBbUQsQ0FFbkQseUNBQTZDLENBQzdDLGtDQUFxRCxDQUNyRCwwQkFBdUMsQ0FDdkMsa0NBQStDLENBRS9DLHVDQUEyQyxDQUMzQyxpQ0FBbUQsQ0FDbkQseUJBQXFDLENBQ3JDLGlDQUE2QyxDQUc3QywyQkFBeUMsQ0FFekMsd0JBQW1DLENBQ25DLCtCQUEyQyxDQUMzQywrQkFBNkMsQ0FFN0MsOEJBQStDLENBQy9DLG9DQUF1RCxDQU12RCx3QkFBbUMsQ0FDbkMsNkJBQTZDLENBQzdDLDBCQUF1QyxDQUd2QyxzQkFBdUMsQ0FDdkMsd0JBQXVDLENBQ3ZDLDBCQUF1QyxDQUN2QyxnREFBK0QsQ0FFL0QsMkJBQXlDLENBQ3pDLDZCQUErQyxDQUMvQyw0QkFBK0MsQ0FDL0MsMkJBQStDLENBQy9DLDRCQUFpRCxDQUNqRCxtREFBaUQsQ0FDakQsOEJBQW1ELENBR25ELCtDQUFtQyxDQUNuQyx3REFBeUMsQ0FDekMsaURBQXlDLENBQ3pDLHdEQUErQyxDQUkvQyw2QkFBK0MsQ0FDL0MsNEJBQW1ELENBQ25ELDRDQUErQyxDQUkvQyw4QkFBK0MsQ0FDL0MscUNBQTZELENBQzdELGdDQUFtRCxDQUNuRCx1Q0FBaUUsQ0FFbEUsdUJBSUcsaUJBQWtCLENBR2xCLHdCQUFtQyxDQUNuQyxnQ0FBMkMsQ0FDM0MscUJBQTZCLENBQzdCLDBCQUFxQyxDQUVyQyx5QkFBMkMsQ0FDM0Msb0NBQW1ELENBRW5ELDRDQUE2QyxDQUM3QyxxQ0FBcUQsQ0FDckQsMEJBQXVDLENBQ3ZDLCtCQUErQyxDQUUvQywwQ0FBMkMsQ0FDM0Msb0NBQW1ELENBQ25ELHlCQUFxQyxDQUNyQyw4QkFBNkMsQ0FHM0MsbUNBQW9ELENBQXBELHFDQUFvRCxDQUFwRCxtQ0FBb0QsQ0FBcEQsZ0NBQW9ELENBQXBELG1DQUFvRCxDQUFwRCxrQ0FBb0QsQ0FBcEQsaUNBQW9ELENBQXBELGdDQUFvRCxDQUlwRCwrQkFBNEMsQ0FBNUMsaUNBQTRDLENBQTVDLCtCQUE0QyxDQUE1Qyw0QkFBNEMsQ0FBNUMsK0JBQTRDLENBQTVDLDhCQUE0QyxDQUE1Qyw2QkFBNEMsQ0FBNUMsNEJBQTRDLENBSTVDLG1DQUFvRCxDQUFwRCxxQ0FBb0QsQ0FBcEQsbUNBQW9ELENBQXBELGdDQUFvRCxDQUFwRCxtQ0FBb0QsQ0FBcEQsa0NBQW9ELENBQXBELGlDQUFvRCxDQUFwRCxnQ0FBb0QsQ0FHdEQsMkJBQXlDLENBRXpDLHdCQUFtQyxDQUNuQyw4QkFBK0MsQ0FDL0MsZ0NBQTJDLENBQzNDLHNDQUF1RCxDQUV2RCx3QkFBbUMsQ0FDbkMsNkJBQTZDLENBQzdDLDBCQUF1QyxDQUV2QywwQkFBdUMsQ0FDdkMscURBQStELENBRS9ELDhCQUErQyxDQUMvQyxxQ0FBNkQsQ0FDN0QsZ0NBQW1ELENBQ25ELHVDQUFpRSxDRmpMckUscUJJWUUscUJBQXNCLENBQ3ZCLCtDQVFELE1BT00sc0JBQXVCLENBRzVCLENBV0QsS0FDRSxRQUFTLENBQ1Qsc0NBQWdFLENENk81RCxrQ0FuRStCLENDeEtuQyxzQ0FBZ0UsQ0FDaEUsc0NBQWdFLENBQ2hFLDBCQUE4QyxDQUM5QyxvQ0FBNkQsQ0FDN0Qsa0NBQW1ELENBQ25ELDZCQUE4QixDQUM5Qix5Q0N4Q2EsQ0R5Q2QsR0FTQyxhQUFzQixDQUN0QixhQ21uQm1DLENEbG5CbkMsUUFBUyxDQUNULHVDQUFrQyxDQUNsQyxXQ3luQitCLENEeG5CaEMsMENBVUMsWUFBYSxDQUNiLG1CQ3dqQndDLENEcmpCeEMsZUN3akIrQixDRHZqQi9CLGVDd2pCK0IsQ0R2akIvQiw2QkFBb0QsQ0FDckQsT0R5TU8sZ0NBZjZCLENBN0lqQywyQkMzQ0osT0Q4TVEsZ0JBOUU2QixDQzdIcEMsQ0FFRCxPRGtNUSwrQkFmNkIsQ0E3SWpDLDJCQ3RDSixPRHlNUSxjQTlFNkIsQ0N4SHBDLENBRUQsT0Q2TFEsNkJBZjZCLENBN0lqQywyQkNqQ0osT0RvTVEsaUJBOUU2QixDQ25IcEMsQ0FFRCxPRHdMUSwrQkFmNkIsQ0E3SWpDLDJCQzVCSixPRCtMUSxnQkE5RTZCLENDOUdwQyxDQUVELE9EK0tNLGlCQW5FK0IsQ0N6R3BDLE9ENEtLLGNBbkUrQixDQ3BHcEMsRUFTQyxZQUFhLENBQ2Isa0JDd1Y4QixDRHZWL0IsWUFVQyxnQ0FBaUMsQ0FDakMsV0FBWSxDQUNaLDZCQUE4QixDQUMvQixRQU1DLGtCQUFtQixDQUNuQixpQkFBa0IsQ0FDbEIsbUJBQW9CLENBQ3JCLE1BT0MsaUJBQWtCLENBQ25CLFNBS0MsWUFBYSxDQUNiLGtCQUFtQixDQUNwQix3QkFNQyxlQUFnQixDQUNqQixHQUdDLGVDNmIrQixDRDViaEMsR0FLQyxtQkFBb0IsQ0FDcEIsYUFBYyxDQUNmLFdBTUMsZUFBZ0IsQ0FDakIsU0FTQyxrQkNzYWtDLENEcmFuQyxhRG9GSyxnQkFuRStCLENDUnBDLFdBTUMsZUNxZm1DLENEcGZuQywrQkFBd0QsQ0FDeEQsdUNBQTZELENBQzlELFFBVUMsaUJBQWtCLENEd0RkLGVBbkUrQixDQ2FuQyxhQUFjLENBQ2QsdUJBQXdCLENBQ3pCLElBRUssYUFBYyxDQUFJLElBQ2xCLFNBQVUsQ0FBSSxFQU1sQiwrREFBNEcsQ0FDNUcseUJDZ05pRCxDRGxObkQsUUFLSSxtREFBMkMsQ0FFNUMsNERBV0MsYUFBYyxDQUNkLG9CQUFxQixDQUN0QixrQkFVRCxvQ0NnVjJFLENGbFV2RSxhQW5FK0IsQ0N1RHBDLElBT0MsYUFBYyxDQUNkLFlBQWEsQ0FDYixrQkFBbUIsQ0FDbkIsYUFBYyxDREVWLGdCQW5FK0IsQ0M2RHJDLFNETU0saUJBbkUrQixDQ3dFakMsYUFBYyxDQUNkLGlCQUFrQixDQUNuQixLRFBHLGdCQW5FK0IsQ0MrRW5DLDBCQUE4QyxDQUM5QyxvQkFBcUIsQ0FHckIsT0FDRSxhQUFjLENBQ2YsSUFJRCx3QkN1NUN5QyxDRjc2Q3JDLGdCQW5FK0IsQ0MyRm5DLHVCQ3U1Q21FLENEdDVDbkUscUNDdTVDeUUsQ0M1ckR2RSxvQkRnaEJnQyxDRC9PcEMsUUFRSSxTQUFVLENEN0JSLGFBbkUrQixDQ21HbEMsT0FTRCxlQUFnQixDQUNqQixRQU9DLHFCQUFzQixDQUN2QixNQVFDLG1CQUFvQixDQUNwQix3QkFBeUIsQ0FDMUIsUUFHQyxpQkM0WGlDLENEM1hqQyxvQkMyWGlDLENEMVhqQywrQkM0WjZFLENEM1o3RSxlQUFnQixDQUNqQixHQVFDLGtCQUFtQixDQUNuQiwrQkFBZ0MsQ0FDakMsMkJBUUMsb0JBQXFCLENBQ3JCLGtCQUFtQixDQUNuQixjQUFlLENBQ2hCLE1BUUMsb0JBQXFCLENBQ3RCLE9BT0MsZUFBZ0IsQ0FDakIsaUNBUUMsU0FBVSxDQUNYLHNDQVNDLFFBQVMsQ0FDVCxtQkFBb0IsQ0Q1SGhCLGlCQW5FK0IsQ0NpTW5DLG1CQUFvQixDQUNyQixjQUtDLG1CQUFvQixDQUNyQixnQkFLQyxjQUFlLENBQ2hCLE9BS0MsZ0JBQWlCLENBSG5CLGdCQU9JLFNBQVUsQ0FDWCxvSkFPRCx1QkFBd0IsQ0FDekIsc0RBV0MseUJBQTBCLENBSjVCLGtIQVFNLGNBQWUsQ0FDaEIsbUJBT0gsU0FBVSxDQUNWLGlCQUFrQixDQUNuQixTQUtDLGVBQWdCLENBQ2pCLFNBVUMsV0FBWSxDQUNaLFNBQVUsQ0FDVixRQUFTLENBQ1QsUUFBUyxDQUNWLE9BUUMsVUFBVyxDQUNYLFVBQVcsQ0FDWCxTQUFVLENBQ1YsbUJDbU5pQyxDRnBhM0IsK0JBZjZCLENDbU9uQyxtQkFBb0IsQ0RoWGxCLDJCQ3lXSixPRHRNUSxnQkE5RTZCLENDZ1NwQyxDQVpELFNBVUksVUFBVyxDQUNaLCtPQWFELFNBQVUsQ0FDWCw0QkFHQyxXQUFZLENBQ2IsZ0JBU0MsNEJBQTZCLENBQzdCLG1CQUFvQixDQUNyQiw0QkFtQkMsdUJBQXdCLENBQ3pCLCtCQUtDLFNBQVUsQ0FDWCx1QkFPQyxZQUFhLENBQ2IseUJBQTBCLENBQzNCLE9BS0Msb0JBQXFCLENBQ3RCLE9BS0MsUUFBUyxDQUNWLFFBT0MsaUJBQWtCLENBQ2xCLGNBQWUsQ0FDaEIsU0FRQyx1QkFBd0IsQ0FDekIsU0FRQyx1QkFBd0IsQ0FDekIsTURuVUssaUJBbkUrQixDSTlMbkMsZUZ3b0IrQixDRXZvQmhDLFdKb1FPLGdDQWY2QixDSTdPakMsZUZ5bkJxQixDRXhuQnJCLGVGd21CNkIsQ0Z6Z0I3QiwyQklwR0YsV0p1UU0sY0E5RTZCLENJbkxsQyxDQU5ELFdKZ1FNLGdDQWY2QixDSTdPakMsZUZ5bkJxQixDRXhuQnJCLGVGd21CNkIsQ0Z6Z0I3QiwyQklwR0YsV0p1UU0sZ0JBOUU2QixDSW5MbEMsQ0FORCxXSmdRTSxnQ0FmNkIsQ0k3T2pDLGVGeW5CcUIsQ0V4bkJyQixlRndtQjZCLENGemdCN0IsMkJJcEdGLFdKdVFNLGNBOUU2QixDSW5MbEMsQ0FORCxXSmdRTSxnQ0FmNkIsQ0k3T2pDLGVGeW5CcUIsQ0V4bkJyQixlRndtQjZCLENGemdCN0IsMkJJcEdGLFdKdVFNLGdCQTlFNkIsQ0luTGxDLENBTkQsV0pnUU0sZ0NBZjZCLENJN09qQyxlRnluQnFCLENFeG5CckIsZUZ3bUI2QixDRnpnQjdCLDJCSXBHRixXSnVRTSxjQTlFNkIsQ0luTGxDLENBTkQsV0pnUU0sZ0NBZjZCLENJN09qQyxlRnluQnFCLENFeG5CckIsZUZ3bUI2QixDRnpnQjdCLDJCSXBHRixXSnVRTSxnQkE5RTZCLENJbkxsQyxDQWtCSCxlQ3ZERSxjQUFlLENBQ2YsZUFBZ0IsQ0R3RGpCLGFDekRDLGNBQWUsQ0FDZixlQUFnQixDRDZEakIsa0JBRUMsb0JBQXFCLENBRHZCLG1DQUlJLGtCRnNvQitCLENFcm9CaEMsWUp1TkcsZ0JBbkUrQixDSXpJbkMsd0JBQXlCLENBQzFCLFlBSUMsa0JGaVVXLENGMUhQLGlCQW5FK0IsQ0lySXJDLHdCQUtJLGVBQWdCLENBQ2pCLG1CQUlELGdCRndUVyxDRXZUWCxrQkZ1VFcsQ0YxSFAsZ0JBbkUrQixDSXhIbkMsYUZ0RmdCLENFa0ZsQiwyQkFPSSxvQkFBcUIsQ0FDdEIsV0U3RkQsY0FBZSxDQUdmLFdBQVksQ0NMYixlQUtDLGNMNmpEd0MsQ0s1akR4QyxrQ0w2akRtRSxDSzVqRG5FLDBETDhqRDZFLENDM2pEM0UscUNENGpENkUsQ0lwa0QvRSxjQUFlLENBR2YsV0FBWSxDQ1FiLFFBUUMsb0JBQXFCLENBQ3RCLFlBR0MsbUJBQTJCLENBQzNCLGFBQWMsQ0FDZixnQlAyUEssZ0JBbkUrQixDT3BMbkMsK0JMZ2pEbUYsQ0svaURwRixtR0N0Q0MscUJBQStCLENBQy9CLGdCQUErQixDQUMvQixVQUFXLENBQ1gsMkNBQTZELENBQzdELDBDQUE0RCxDQUM1RCxpQkFBa0IsQ0FDbEIsZ0JBQWlCLENDc0RmLDBCQzVDRSx5QkFDRSxlUm1lRyxDUWxlSixDRDBDSCwwQkM1Q0UsdUNBQ0UsZVJvZUcsQ1FuZUosQ0QwQ0gsMEJDNUNFLHFEQUNFLGVScWVHLENRcGVKLENEMENILDJCQzVDRSxtRUFDRSxnQlJzZUksQ1FyZUwsQ0QwQ0gsMkJDNUNFLGtGQUNFLGdCUnVlSyxDUXRlTixDVE1QLE1VckJJLHFCQUE2QyxDQUE3Qyx5QkFBNkMsQ0FBN0MseUJBQTZDLENBQTdDLHlCQUE2QyxDQUE3QywwQkFBNkMsQ0FBN0MsMkJBQTZDLENBRWhELEtDSEMscUJBQStCLENBQy9CLGdCQUErQixDQUMvQixZQUFhLENBQ2IsY0FBZSxDQUVmLHdDQUEwRCxDQUMxRCwyQ0FBNkQsQ0FDN0QsMENBQTRELENERDVELE9DVUEsYUFBYyxDQUNkLFVBQVcsQ0FDWCxjQUFlLENBQ2YsMkNBQTZELENBQzdELDBDQUE0RCxDQUM1RCw2QkFBK0MsQ0ErQzNDLEtBQ0UsV0FBWSxDQUNiLGlCQWxDTCxhQUFjLENBQ2QsVUFBVyxDQWNYLGNBQ0UsYUFBYyxDQUNkLFVBQW9DLENBRnRDLGNBQ0UsYUFBYyxDQUNkLFNBQW9DLENBRnRDLGNBQ0UsYUFBYyxDQUNkLGVBQW9DLENBRnRDLGNBQ0UsYUFBYyxDQUNkLFNBQW9DLENBRnRDLGNBQ0UsYUFBYyxDQUNkLFNBQW9DLENBRnRDLGNBQ0UsYUFBYyxDQUNkLGVBQW9DLENBQ3JDLFVBbEJELGFBQWMsQ0FDZCxVQUFXLENBaUROLE9BNURILGFBQWMsQ0FDZCxjQUEwQyxDQStEcEMsT0FoRU4sYUFBYyxDQUNkLGVBQTBDLENBK0RwQyxPQWhFTixhQUFjLENBQ2QsU0FBMEMsQ0ErRHBDLE9BaEVOLGFBQWMsQ0FDZCxlQUEwQyxDQStEcEMsT0FoRU4sYUFBYyxDQUNkLGVBQTBDLENBK0RwQyxPQWhFTixhQUFjLENBQ2QsU0FBMEMsQ0ErRHBDLE9BaEVOLGFBQWMsQ0FDZCxlQUEwQyxDQStEcEMsT0FoRU4sYUFBYyxDQUNkLGVBQTBDLENBK0RwQyxPQWhFTixhQUFjLENBQ2QsU0FBMEMsQ0ErRHBDLFFBaEVOLGFBQWMsQ0FDZCxlQUEwQyxDQStEcEMsUUFoRU4sYUFBYyxDQUNkLGVBQTBDLENBK0RwQyxRQWhFTixhQUFjLENBQ2QsVUFBMEMsQ0FpRW5DLFVBbERULG9CQUE4QyxDQXdEcEMsVUF4RFYscUJBQThDLENBd0RwQyxVQXhEVixlQUE4QyxDQXdEcEMsVUF4RFYscUJBQThDLENBd0RwQyxVQXhEVixxQkFBOEMsQ0F3RHBDLFVBeERWLGVBQThDLENBd0RwQyxVQXhEVixxQkFBOEMsQ0F3RHBDLFVBeERWLHFCQUE4QyxDQXdEcEMsVUF4RFYsZUFBOEMsQ0F3RHBDLFdBeERWLHFCQUE4QyxDQXdEcEMsV0F4RFYscUJBQThDLENBMERuQyxXQVdILGdCQUErQixDQUNoQyxXQUlDLGdCQUErQixDQVBqQyxXQUVFLHFCQUErQixDQUNoQyxXQUlDLHFCQUErQixDQVBqQyxXQUVFLG9CQUErQixDQUNoQyxXQUlDLG9CQUErQixDQVBqQyxXQUVFLG1CQUErQixDQUNoQyxXQUlDLG1CQUErQixDQVBqQyxXQUVFLHFCQUErQixDQUNoQyxXQUlDLHFCQUErQixDQVBqQyxXQUVFLG1CQUErQixDQUNoQyxXQUlDLG1CQUErQixDSDFEckMsMEJHVUUsUUFDRSxXQUFZLENBQ2Isb0JBbENMLGFBQWMsQ0FDZCxVQUFXLENBY1gsaUJBQ0UsYUFBYyxDQUNkLFVBQW9DLENBRnRDLGlCQUNFLGFBQWMsQ0FDZCxTQUFvQyxDQUZ0QyxpQkFDRSxhQUFjLENBQ2QsZUFBb0MsQ0FGdEMsaUJBQ0UsYUFBYyxDQUNkLFNBQW9DLENBRnRDLGlCQUNFLGFBQWMsQ0FDZCxTQUFvQyxDQUZ0QyxpQkFDRSxhQUFjLENBQ2QsZUFBb0MsQ0FDckMsYUFsQkQsYUFBYyxDQUNkLFVBQVcsQ0FpRE4sVUE1REgsYUFBYyxDQUNkLGNBQTBDLENBK0RwQyxVQWhFTixhQUFjLENBQ2QsZUFBMEMsQ0ErRHBDLFVBaEVOLGFBQWMsQ0FDZCxTQUEwQyxDQStEcEMsVUFoRU4sYUFBYyxDQUNkLGVBQTBDLENBK0RwQyxVQWhFTixhQUFjLENBQ2QsZUFBMEMsQ0ErRHBDLFVBaEVOLGFBQWMsQ0FDZCxTQUEwQyxDQStEcEMsVUFoRU4sYUFBYyxDQUNkLGVBQTBDLENBK0RwQyxVQWhFTixhQUFjLENBQ2QsZUFBMEMsQ0ErRHBDLFVBaEVOLGFBQWMsQ0FDZCxTQUEwQyxDQStEcEMsV0FoRU4sYUFBYyxDQUNkLGVBQTBDLENBK0RwQyxXQWhFTixhQUFjLENBQ2QsZUFBMEMsQ0ErRHBDLFdBaEVOLGFBQWMsQ0FDZCxVQUEwQyxDQWlFbkMsYUFsRFQsYUFBNEIsQ0F3RGxCLGFBeERWLG9CQUE4QyxDQXdEcEMsYUF4RFYscUJBQThDLENBd0RwQyxhQXhEVixlQUE4QyxDQXdEcEMsYUF4RFYscUJBQThDLENBd0RwQyxhQXhEVixxQkFBOEMsQ0F3RHBDLGFBeERWLGVBQThDLENBd0RwQyxhQXhEVixxQkFBOEMsQ0F3RHBDLGFBeERWLHFCQUE4QyxDQXdEcEMsYUF4RFYsZUFBOEMsQ0F3RHBDLGNBeERWLHFCQUE4QyxDQXdEcEMsY0F4RFYscUJBQThDLENBMERuQyxpQkFXSCxnQkFBK0IsQ0FDaEMsaUJBSUMsZ0JBQStCLENBUGpDLGlCQUVFLHFCQUErQixDQUNoQyxpQkFJQyxxQkFBK0IsQ0FQakMsaUJBRUUsb0JBQStCLENBQ2hDLGlCQUlDLG9CQUErQixDQVBqQyxpQkFFRSxtQkFBK0IsQ0FDaEMsaUJBSUMsbUJBQStCLENBUGpDLGlCQUVFLHFCQUErQixDQUNoQyxpQkFJQyxxQkFBK0IsQ0FQakMsaUJBRUUsbUJBQStCLENBQ2hDLGlCQUlDLG1CQUErQixDQUNoQyxDSDNETCwwQkdVRSxRQUNFLFdBQVksQ0FDYixvQkFsQ0wsYUFBYyxDQUNkLFVBQVcsQ0FjWCxpQkFDRSxhQUFjLENBQ2QsVUFBb0MsQ0FGdEMsaUJBQ0UsYUFBYyxDQUNkLFNBQW9DLENBRnRDLGlCQUNFLGFBQWMsQ0FDZCxlQUFvQyxDQUZ0QyxpQkFDRSxhQUFjLENBQ2QsU0FBb0MsQ0FGdEMsaUJBQ0UsYUFBYyxDQUNkLFNBQW9DLENBRnRDLGlCQUNFLGFBQWMsQ0FDZCxlQUFvQyxDQUNyQyxhQWxCRCxhQUFjLENBQ2QsVUFBVyxDQWlETixVQTVESCxhQUFjLENBQ2QsY0FBMEMsQ0ErRHBDLFVBaEVOLGFBQWMsQ0FDZCxlQUEwQyxDQStEcEMsVUFoRU4sYUFBYyxDQUNkLFNBQTBDLENBK0RwQyxVQWhFTixhQUFjLENBQ2QsZUFBMEMsQ0ErRHBDLFVBaEVOLGFBQWMsQ0FDZCxlQUEwQyxDQStEcEMsVUFoRU4sYUFBYyxDQUNkLFNBQTBDLENBK0RwQyxVQWhFTixhQUFjLENBQ2QsZUFBMEMsQ0ErRHBDLFVBaEVOLGFBQWMsQ0FDZCxlQUEwQyxDQStEcEMsVUFoRU4sYUFBYyxDQUNkLFNBQTBDLENBK0RwQyxXQWhFTixhQUFjLENBQ2QsZUFBMEMsQ0ErRHBDLFdBaEVOLGFBQWMsQ0FDZCxlQUEwQyxDQStEcEMsV0FoRU4sYUFBYyxDQUNkLFVBQTBDLENBaUVuQyxhQWxEVCxhQUE0QixDQXdEbEIsYUF4RFYsb0JBQThDLENBd0RwQyxhQXhEVixxQkFBOEMsQ0F3RHBDLGFBeERWLGVBQThDLENBd0RwQyxhQXhEVixxQkFBOEMsQ0F3RHBDLGFBeERWLHFCQUE4QyxDQXdEcEMsYUF4RFYsZUFBOEMsQ0F3RHBDLGFBeERWLHFCQUE4QyxDQXdEcEMsYUF4RFYscUJBQThDLENBd0RwQyxhQXhEVixlQUE4QyxDQXdEcEMsY0F4RFYscUJBQThDLENBd0RwQyxjQXhEVixxQkFBOEMsQ0EwRG5DLGlCQVdILGdCQUErQixDQUNoQyxpQkFJQyxnQkFBK0IsQ0FQakMsaUJBRUUscUJBQStCLENBQ2hDLGlCQUlDLHFCQUErQixDQVBqQyxpQkFFRSxvQkFBK0IsQ0FDaEMsaUJBSUMsb0JBQStCLENBUGpDLGlCQUVFLG1CQUErQixDQUNoQyxpQkFJQyxtQkFBK0IsQ0FQakMsaUJBRUUscUJBQStCLENBQ2hDLGlCQUlDLHFCQUErQixDQVBqQyxpQkFFRSxtQkFBK0IsQ0FDaEMsaUJBSUMsbUJBQStCLENBQ2hDLENIM0RMLDBCR1VFLFFBQ0UsV0FBWSxDQUNiLG9CQWxDTCxhQUFjLENBQ2QsVUFBVyxDQWNYLGlCQUNFLGFBQWMsQ0FDZCxVQUFvQyxDQUZ0QyxpQkFDRSxhQUFjLENBQ2QsU0FBb0MsQ0FGdEMsaUJBQ0UsYUFBYyxDQUNkLGVBQW9DLENBRnRDLGlCQUNFLGFBQWMsQ0FDZCxTQUFvQyxDQUZ0QyxpQkFDRSxhQUFjLENBQ2QsU0FBb0MsQ0FGdEMsaUJBQ0UsYUFBYyxDQUNkLGVBQW9DLENBQ3JDLGFBbEJELGFBQWMsQ0FDZCxVQUFXLENBaUROLFVBNURILGFBQWMsQ0FDZCxjQUEwQyxDQStEcEMsVUFoRU4sYUFBYyxDQUNkLGVBQTBDLENBK0RwQyxVQWhFTixhQUFjLENBQ2QsU0FBMEMsQ0ErRHBDLFVBaEVOLGFBQWMsQ0FDZCxlQUEwQyxDQStEcEMsVUFoRU4sYUFBYyxDQUNkLGVBQTBDLENBK0RwQyxVQWhFTixhQUFjLENBQ2QsU0FBMEMsQ0ErRHBDLFVBaEVOLGFBQWMsQ0FDZCxlQUEwQyxDQStEcEMsVUFoRU4sYUFBYyxDQUNkLGVBQTBDLENBK0RwQyxVQWhFTixhQUFjLENBQ2QsU0FBMEMsQ0ErRHBDLFdBaEVOLGFBQWMsQ0FDZCxlQUEwQyxDQStEcEMsV0FoRU4sYUFBYyxDQUNkLGVBQTBDLENBK0RwQyxXQWhFTixhQUFjLENBQ2QsVUFBMEMsQ0FpRW5DLGFBbERULGFBQTRCLENBd0RsQixhQXhEVixvQkFBOEMsQ0F3RHBDLGFBeERWLHFCQUE4QyxDQXdEcEMsYUF4RFYsZUFBOEMsQ0F3RHBDLGFBeERWLHFCQUE4QyxDQXdEcEMsYUF4RFYscUJBQThDLENBd0RwQyxhQXhEVixlQUE4QyxDQXdEcEMsYUF4RFYscUJBQThDLENBd0RwQyxhQXhEVixxQkFBOEMsQ0F3RHBDLGFBeERWLGVBQThDLENBd0RwQyxjQXhEVixxQkFBOEMsQ0F3RHBDLGNBeERWLHFCQUE4QyxDQTBEbkMsaUJBV0gsZ0JBQStCLENBQ2hDLGlCQUlDLGdCQUErQixDQVBqQyxpQkFFRSxxQkFBK0IsQ0FDaEMsaUJBSUMscUJBQStCLENBUGpDLGlCQUVFLG9CQUErQixDQUNoQyxpQkFJQyxvQkFBK0IsQ0FQakMsaUJBRUUsbUJBQStCLENBQ2hDLGlCQUlDLG1CQUErQixDQVBqQyxpQkFFRSxxQkFBK0IsQ0FDaEMsaUJBSUMscUJBQStCLENBUGpDLGlCQUVFLG1CQUErQixDQUNoQyxpQkFJQyxtQkFBK0IsQ0FDaEMsQ0gzREwsMkJHVUUsUUFDRSxXQUFZLENBQ2Isb0JBbENMLGFBQWMsQ0FDZCxVQUFXLENBY1gsaUJBQ0UsYUFBYyxDQUNkLFVBQW9DLENBRnRDLGlCQUNFLGFBQWMsQ0FDZCxTQUFvQyxDQUZ0QyxpQkFDRSxhQUFjLENBQ2QsZUFBb0MsQ0FGdEMsaUJBQ0UsYUFBYyxDQUNkLFNBQW9DLENBRnRDLGlCQUNFLGFBQWMsQ0FDZCxTQUFvQyxDQUZ0QyxpQkFDRSxhQUFjLENBQ2QsZUFBb0MsQ0FDckMsYUFsQkQsYUFBYyxDQUNkLFVBQVcsQ0FpRE4sVUE1REgsYUFBYyxDQUNkLGNBQTBDLENBK0RwQyxVQWhFTixhQUFjLENBQ2QsZUFBMEMsQ0ErRHBDLFVBaEVOLGFBQWMsQ0FDZCxTQUEwQyxDQStEcEMsVUFoRU4sYUFBYyxDQUNkLGVBQTBDLENBK0RwQyxVQWhFTixhQUFjLENBQ2QsZUFBMEMsQ0ErRHBDLFVBaEVOLGFBQWMsQ0FDZCxTQUEwQyxDQStEcEMsVUFoRU4sYUFBYyxDQUNkLGVBQTBDLENBK0RwQyxVQWhFTixhQUFjLENBQ2QsZUFBMEMsQ0ErRHBDLFVBaEVOLGFBQWMsQ0FDZCxTQUEwQyxDQStEcEMsV0FoRU4sYUFBYyxDQUNkLGVBQTBDLENBK0RwQyxXQWhFTixhQUFjLENBQ2QsZUFBMEMsQ0ErRHBDLFdBaEVOLGFBQWMsQ0FDZCxVQUEwQyxDQWlFbkMsYUFsRFQsYUFBNEIsQ0F3RGxCLGFBeERWLG9CQUE4QyxDQXdEcEMsYUF4RFYscUJBQThDLENBd0RwQyxhQXhEVixlQUE4QyxDQXdEcEMsYUF4RFYscUJBQThDLENBd0RwQyxhQXhEVixxQkFBOEMsQ0F3RHBDLGFBeERWLGVBQThDLENBd0RwQyxhQXhEVixxQkFBOEMsQ0F3RHBDLGFBeERWLHFCQUE4QyxDQXdEcEMsYUF4RFYsZUFBOEMsQ0F3RHBDLGNBeERWLHFCQUE4QyxDQXdEcEMsY0F4RFYscUJBQThDLENBMERuQyxpQkFXSCxnQkFBK0IsQ0FDaEMsaUJBSUMsZ0JBQStCLENBUGpDLGlCQUVFLHFCQUErQixDQUNoQyxpQkFJQyxxQkFBK0IsQ0FQakMsaUJBRUUsb0JBQStCLENBQ2hDLGlCQUlDLG9CQUErQixDQVBqQyxpQkFFRSxtQkFBK0IsQ0FDaEMsaUJBSUMsbUJBQStCLENBUGpDLGlCQUVFLHFCQUErQixDQUNoQyxpQkFJQyxxQkFBK0IsQ0FQakMsaUJBRUUsbUJBQStCLENBQ2hDLGlCQUlDLG1CQUErQixDQUNoQyxDSDNETCwyQkdVRSxTQUNFLFdBQVksQ0FDYixxQkFsQ0wsYUFBYyxDQUNkLFVBQVcsQ0FjWCxrQkFDRSxhQUFjLENBQ2QsVUFBb0MsQ0FGdEMsa0JBQ0UsYUFBYyxDQUNkLFNBQW9DLENBRnRDLGtCQUNFLGFBQWMsQ0FDZCxlQUFvQyxDQUZ0QyxrQkFDRSxhQUFjLENBQ2QsU0FBb0MsQ0FGdEMsa0JBQ0UsYUFBYyxDQUNkLFNBQW9DLENBRnRDLGtCQUNFLGFBQWMsQ0FDZCxlQUFvQyxDQUNyQyxjQWxCRCxhQUFjLENBQ2QsVUFBVyxDQWlETixXQTVESCxhQUFjLENBQ2QsY0FBMEMsQ0ErRHBDLFdBaEVOLGFBQWMsQ0FDZCxlQUEwQyxDQStEcEMsV0FoRU4sYUFBYyxDQUNkLFNBQTBDLENBK0RwQyxXQWhFTixhQUFjLENBQ2QsZUFBMEMsQ0ErRHBDLFdBaEVOLGFBQWMsQ0FDZCxlQUEwQyxDQStEcEMsV0FoRU4sYUFBYyxDQUNkLFNBQTBDLENBK0RwQyxXQWhFTixhQUFjLENBQ2QsZUFBMEMsQ0ErRHBDLFdBaEVOLGFBQWMsQ0FDZCxlQUEwQyxDQStEcEMsV0FoRU4sYUFBYyxDQUNkLFNBQTBDLENBK0RwQyxZQWhFTixhQUFjLENBQ2QsZUFBMEMsQ0ErRHBDLFlBaEVOLGFBQWMsQ0FDZCxlQUEwQyxDQStEcEMsWUFoRU4sYUFBYyxDQUNkLFVBQTBDLENBaUVuQyxjQWxEVCxhQUE0QixDQXdEbEIsY0F4RFYsb0JBQThDLENBd0RwQyxjQXhEVixxQkFBOEMsQ0F3RHBDLGNBeERWLGVBQThDLENBd0RwQyxjQXhEVixxQkFBOEMsQ0F3RHBDLGNBeERWLHFCQUE4QyxDQXdEcEMsY0F4RFYsZUFBOEMsQ0F3RHBDLGNBeERWLHFCQUE4QyxDQXdEcEMsY0F4RFYscUJBQThDLENBd0RwQyxjQXhEVixlQUE4QyxDQXdEcEMsZUF4RFYscUJBQThDLENBd0RwQyxlQXhEVixxQkFBOEMsQ0EwRG5DLG1CQVdILGdCQUErQixDQUNoQyxtQkFJQyxnQkFBK0IsQ0FQakMsbUJBRUUscUJBQStCLENBQ2hDLG1CQUlDLHFCQUErQixDQVBqQyxtQkFFRSxvQkFBK0IsQ0FDaEMsbUJBSUMsb0JBQStCLENBUGpDLG1CQUVFLG1CQUErQixDQUNoQyxtQkFJQyxtQkFBK0IsQ0FQakMsbUJBRUUscUJBQStCLENBQ2hDLG1CQUlDLHFCQUErQixDQVBqQyxtQkFFRSxtQkFBK0IsQ0FDaEMsbUJBSUMsbUJBQStCLENBQ2hDLENDdEhULE9BRUUsOEJBQStDLENBQy9DLDJCQUF5QyxDQUN6QywrQkFBaUQsQ0FDakQsNEJBQTJDLENBRTNDLDBDQUFxQyxDQUNyQyxnQ0FBK0IsQ0FDL0IsK0NBQW1ELENBQ25ELG1DQUE2QyxDQUM3QyxrREFBcUQsQ0FDckQsK0RBQStDLENBQy9DLGlEQUFtRCxDQUNuRCw2REFBNkMsQ0FDN0MsZ0RBQWlELENBQ2pELDhEQUEyQyxDQUUzQyxVQUFXLENBQ1gsa0JYa1lXLENXallYLGtCWHVzQitCLENXdHNCL0IseUNBQXFFLENBckJ2RSx5QkE2QkksbUJYMHJCK0IsQ1d4ckIvQixvRkFBNEosQ0FDNUosbUNBQXFELENBQ3JELDBDWCtzQnFFLENXOXNCckUsMEdBQWdMLENBbENwTCxhQXNDSSxzQkFBdUIsQ0F0QzNCLGFBMENJLHFCQUFzQixDQUN2QixxQkFJRCw4RFh1c0J3QyxDV3RzQnpDLGFBT0MsZ0JBQWlCLENBQ2xCLDRCQVVHLHFCWHVwQmdDLENXdHBCakMsZ0NBZUMscUNBQW1DLENBRnZDLGtDQU1NLHFDWDBwQm1FLENXenBCcEUsb0NBT0QscUJBQXNCLENBSDFCLHFDQU9JLGtCQUFtQixDQUNwQiwyQ0FVQyxvREFBK0MsQ0FDL0MsOENBQXlDLENBQzFDLHlEQU1DLG9EQUErQyxDQUMvQyw4Q0FBeUMsQ0FDMUMsY0FRRCxvREFBaUQsQ0FDakQsOENBQTJDLENBQzVDLDhCQVFHLG1EQUFpRCxDQUNqRCw2Q0FBMkMsQ0M1STdDLGVBT0Usc0JBQXFDLENBQ3JDLHNCQUErQixDQUMvQixnQ0FBbUQsQ0FDbkQsOEJBQStDLENBQy9DLDhCQUFxRCxDQUNyRCw2QkFBNkMsQ0FDN0MsNkJBQW1ELENBQ25ELDRCQUEyQyxDQUMzQyw0QkFBaUQsQ0FFakQsMkJBQWdELENBQ2hELHlDQUFxRSxDQWxCdkUsaUJBT0Usc0JBQXFDLENBQ3JDLHNCQUErQixDQUMvQixnQ0FBbUQsQ0FDbkQsOEJBQStDLENBQy9DLDhCQUFxRCxDQUNyRCw2QkFBNkMsQ0FDN0MsNkJBQW1ELENBQ25ELDRCQUEyQyxDQUMzQyw0QkFBaUQsQ0FFakQsMkJBQWdELENBQ2hELHlDQUFxRSxDQWxCdkUsZUFPRSxzQkFBcUMsQ0FDckMsc0JBQStCLENBQy9CLGdDQUFtRCxDQUNuRCw4QkFBK0MsQ0FDL0MsOEJBQXFELENBQ3JELDZCQUE2QyxDQUM3Qyw2QkFBbUQsQ0FDbkQsNEJBQTJDLENBQzNDLDRCQUFpRCxDQUVqRCwyQkFBZ0QsQ0FDaEQseUNBQXFFLENBbEJ2RSxZQU9FLHNCQUFxQyxDQUNyQyxzQkFBK0IsQ0FDL0IsZ0NBQW1ELENBQ25ELDhCQUErQyxDQUMvQyw4QkFBcUQsQ0FDckQsNkJBQTZDLENBQzdDLDZCQUFtRCxDQUNuRCw0QkFBMkMsQ0FDM0MsNEJBQWlELENBRWpELDJCQUFnRCxDQUNoRCx5Q0FBcUUsQ0FsQnZFLGVBT0Usc0JBQXFDLENBQ3JDLHNCQUErQixDQUMvQixnQ0FBbUQsQ0FDbkQsOEJBQStDLENBQy9DLDhCQUFxRCxDQUNyRCw2QkFBNkMsQ0FDN0MsNkJBQW1ELENBQ25ELDRCQUEyQyxDQUMzQyw0QkFBaUQsQ0FFakQsMkJBQWdELENBQ2hELHlDQUFxRSxDQWxCdkUsY0FPRSxzQkFBcUMsQ0FDckMsc0JBQStCLENBQy9CLGdDQUFtRCxDQUNuRCw4QkFBK0MsQ0FDL0MsOEJBQXFELENBQ3JELDZCQUE2QyxDQUM3Qyw2QkFBbUQsQ0FDbkQsNEJBQTJDLENBQzNDLDRCQUFpRCxDQUVqRCwyQkFBZ0QsQ0FDaEQseUNBQXFFLENBbEJ2RSxhQU9FLHNCQUFxQyxDQUNyQyxzQkFBK0IsQ0FDL0IsZ0NBQW1ELENBQ25ELDhCQUErQyxDQUMvQyw4QkFBcUQsQ0FDckQsNkJBQTZDLENBQzdDLDZCQUFtRCxDQUNuRCw0QkFBMkMsQ0FDM0MsNEJBQWlELENBRWpELDJCQUFnRCxDQUNoRCx5Q0FBcUUsQ0FsQnZFLFlBT0Usc0JBQXFDLENBQ3JDLHNCQUErQixDQUMvQixnQ0FBbUQsQ0FDbkQsOEJBQStDLENBQy9DLDhCQUFxRCxDQUNyRCw2QkFBNkMsQ0FDN0MsNkJBQW1ELENBQ25ELDRCQUEyQyxDQUMzQyw0QkFBaUQsQ0FFakQsMkJBQWdELENBQ2hELHlDQUFxRSxDQUN0RSxrQkRpSkcsZUFBZ0IsQ0FDaEIsZ0NBQWlDLENKM0ZuQyw2Qkl5RkEscUJBQ0UsZUFBZ0IsQ0FDaEIsZ0NBQWlDLENBQ2xDLENKNUZELDZCSXlGQSxxQkFDRSxlQUFnQixDQUNoQixnQ0FBaUMsQ0FDbEMsQ0o1RkQsNkJJeUZBLHFCQUNFLGVBQWdCLENBQ2hCLGdDQUFpQyxDQUNsQyxDSjVGRCw4Qkl5RkEscUJBQ0UsZUFBZ0IsQ0FDaEIsZ0NBQWlDLENBQ2xDLENKNUZELDhCSXlGQSxzQkFDRSxlQUFnQixDQUNoQixnQ0FBaUMsQ0FDbEMsQ0VwS0wsWUFDRSxtQmJ1MkIyQyxDYWwyQjVDLGdCQUtDLGtEQzJOOEQsQ0QxTjlELHFEQzBOOEQsQ0R6TjlELGVBQWdCLENmOFFaLGlCQW5FK0IsQ2V2TW5DLGViK2xCK0IsQ2E3bEJoQyxtQkFHQyxnRENnTjhELENEL005RCxtREMrTThELENoQnFEMUQsaUJBbkUrQixDZS9McEMsbUJBR0MsaURDME04RCxDRHpNOUQsb0RDeU04RCxDaEJxRDFELGlCQW5FK0IsQ2V6THBDLFdFOUJDLGlCZisxQjRDLENGcmtCeEMsZ0JBbkUrQixDaUJuTm5DLCtCZisxQnVGLENMN3BCekYsY3FCdE1FLGFBQWMsQ0FDZCxVQUFXLENBQ1gsc0JoQjh3QmtDLENGdGY5QixjQW5FK0IsQ2tCbE5uQyxlaEJrbUIrQixDZ0JqbUIvQixlaEJ5bUIrQixDZ0J4bUIvQiwwQmhCNDNCNkUsQ2dCMzNCN0UsZUFBZ0IsQ0FDaEIsa0NoQnEzQnVFLENnQnAzQnZFLDJCQUE0QixDQUM1QiwwRGhCeTNCaUYsQ0N0M0IvRSxxQ0QwM0JpRixDaUI3M0IvRSxzRWpCbzVCNEYsQ2lCaDVCNUYsd0N0QnVMTixjc0J0TFEsZUFBZ0IsQ0QyRnZCLENBNUdELDJCQXFCSSxlQUFnQixDQXJCcEIsMERBd0JNLGNBQWUsQ3JCK01yQixvQnFCek1JLDBCaEJzMkIyRSxDZ0JyMkIzRSxrQ2hCZzJCcUUsQ2dCLzFCckUsb0JGMEtpQyxDRXpLakMsU0FBVSxDQUtSLDZDaEJKVyxDZ0JsQ2pCLDJDQWdESSxjQUFlLENBTWYsWUFBbUUsQ0FLbkUsUUFBUyxDQTNEYixxQ0FpRUksYUFBYyxDQUNkLFNBQVUsQ3JCaU1kLDJCcUI1TEksK0JoQjQwQnFGLENnQjEwQnJGLFNBQVUsQ0F6RWQsdUJBbUZJLHVDaEI4eUIrRSxDZ0IzeUIvRSxTQUFVLENBdEZkLG9DQTJGSSxzQmhCc3JCZ0MsQ2dCcnJCaEMsdUJoQnFyQmdDLENnQnByQmhDLHdCaEJvckJnQyxDZ0JuckJoQywwQmhCc3lCMkUsQ2tCcDRCN0Usc0NsQnFpQ3lFLENnQnI4QnZFLG1CQUFvQixDQUNwQixvQkFBcUIsQ0FDckIsa0JBQW1CLENBQ25CLGNBQWUsQ0FDZiw4Q2hCZ3NCcUUsQ2dCL3JCckUsZUFBZ0IsQ0N6RmQsaUlqQm8wQjZJLENpQmgwQjdJLHdDRGhCTixvQ0NpQlEsZUFBZ0IsQ0RzRnJCLENBdkdILHlFQTBHSSx1Q2hCNDdCeUUsQ2dCMzdCMUUsd0JBU0QsYUFBYyxDQUNkLFVBQVcsQ0FDWCxpQkFBMkIsQ0FDM0IsZUFBZ0IsQ0FDaEIsZWhCd2YrQixDZ0J2Zi9CLDBCaEIyeEI2RSxDZ0IxeEI3RSw0QkFBNkIsQ0FDN0Isd0JBQXlCLENBQ3pCLHFDQUFtQyxDQVRyQyw4QkFZSSxTQUFVLENBWmQsZ0ZBaUJJLGVBQWdCLENBQ2hCLGNBQWUsQ0FDaEIsaUJBV0QsaUVGcUY4RCxDRXBGOUQsb0JoQjJvQmlDLENGbGdCN0IsaUJBbkUrQixDR3pNakMsd0NEMjNCdUYsQ2dCMXZCM0YsdUNBT0ksb0JoQnNvQitCLENnQnJvQi9CLHFCaEJxb0IrQixDZ0Jwb0IvQix1QmhCb29CK0IsQ2dCbm9CaEMsaUJBSUQsZ0VGd0U4RCxDRXZFOUQsa0JoQmtvQmdDLENGdGdCNUIsaUJBbkUrQixDR3pNakMsd0NENDNCdUYsQ2dCOXVCM0YsdUNBT0ksa0JoQjZuQjhCLENnQjVuQjlCLG1CaEI0bkI4QixDZ0IzbkI5QixzQmhCMm5COEIsQ0wxZ0JsQyxzQnFCeEdJLGtFRnVENEQsQ0V6RGhFLHlCQU1JLGlFRm1ENEQsQ0V6RGhFLHlCQVVJLGdFRitDNEQsQ0U5QzdELG9CQUtELFVoQnF1QjBDLENnQnB1QjFDLDhERndDOEQsQ0V2QzlELGVoQmlsQm1DLENnQnBsQnJDLG1EQU1JLGNBQWUsQ0FObkIsdUNBVUksbUJBQW9CLENmdkxwQixxQ0QwM0JpRixDZ0I3c0JyRiwwQ0FlSSxtQkFBb0IsQ2Y1THBCLHFDRDAzQmlGLENnQjdzQnJGLG9DQW1Cc0IsNkRGdUIwQyxDRTFDaEUsb0NBb0JzQiw0REZzQjBDLENFdEJkLGFHOU1oRCxnRUFBbUQsQ0FFbkQsYUFBYyxDQUNkLFVBQVcsQ0FDWCxzQ25CMndCa0MsQ0Z0ZjlCLGNBbkUrQixDcUIvTW5DLGVuQitsQitCLENtQjlsQi9CLGVuQnNtQitCLENtQnJtQi9CLDBCbkJ5M0I2RSxDbUJ4M0I3RSxlQUFnQixDQUNoQixrQ25CazNCdUUsQ21CajNCdkUsaUZBQTBJLENBQzFJLDJCQUE0QixDQUM1Qix1Q25CKzlCcUUsQ21COTlCckUseUJuQis5QjJDLENtQjk5QjNDLDBEbkJtM0JpRixDQ3QzQi9FLHFDRDAzQmlGLENpQjczQi9FLHNFakJvNUI0RixDaUJoNUI1Rix3Q0VmTixhRmdCUSxlQUFnQixDRWtDdkIsQ0FsREQsbUJBdUJJLG9CTGtMaUMsQ0tqTGpDLFNBQVUsQ0FLUiw2Q25CSVcsQ21CakNqQiwwREFtQ0ksb0JuQjZ1QmdDLENtQjV1QmhDLHFCQUFzQixDQXBDMUIsc0JBeUNJLHVDbkJ1MUIrRSxDbUJoNEJuRiw0QkErQ0ksaUJBQWtCLENBQ2xCLHNDbkJtMUIyRSxDbUJsMUI1RSxnQkFJRCxrQm5Cc3VCa0MsQ21CcnVCbEMscUJuQnF1QmtDLENtQnB1QmxDLGtC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REksVXJCbytCMkMsQ3FCbitCM0MsV3JCbStCMkMsQ3FCbCtCM0MsZUFBZ0IsQ0hwRGxCLHdCbEJrQ2UsQ3FCb0JiLFFyQm0rQndDLENDMWdDeEMsa0JEMmdDMkMsQ2lCOWdDekMseUdqQm9oQ2tJLENpQmhoQ2xJLHdDSWROLDhCSmVRLGVBQWdCLENJNkNyQixDQTVESCxxQ0hGRSx3QkowTW1DLENPeE1yQyw4QkErREksVXJCODhCa0MsQ3FCNzhCbEMsWXJCODhCbUMsQ3FCNzhCbkMsaUJBQWtCLENBQ2xCLGNyQjY4QnFDLENxQjU4QnJDLHVDckI2OEJ5RSxDcUI1OEJ6RSx3QkFBeUIsQ3BCdkR6QixrQkRvZ0NrQyxDcUJqaEN0QyxxQkEwRUksbUJBQW9CLENBMUV4QiwyQ0E2RU0sMENyQmc5QnNGLENxQjdoQzVGLHVDQWlGTSwwQ3JCNDhCc0YsQ3FCMzhCdkYsZUN2RkgsaUJBQWtCLENBRHBCLGdHQU1JLHNEUm9PNEQsQ1FuTzVELDBEUm1PNEQsQ1FsTzVELGdCdEJ1aUN3QyxDc0IvaUM1QyxxQkFZSSxpQkFBa0IsQ0FDbEIsS0FBTSxDQUNOLE1BQU8sQ0FDUCxTQUFVLENBQ1YsV0FBWSxDQUNaLG1CdEJvd0JnQyxDc0Jud0JoQyxlQUFnQixDQUNoQixnQkFBaUIsQ0FDakIsc0JBQXVCLENBQ3ZCLGtCQUFtQixDQUNuQixtQkFBb0IsQ0FDcEIsK0NBQTZDLENBQzdDLG9CQUFxQixDTFJuQiw4RGpCd2lDb0YsQ2lCcGlDcEYsd0NLcEJOLHFCTHFCUSxlQUFnQixDS0tyQixDQTFCSCxvRUE4QkksbUJ0QnV2QmdDLENzQnJ4QnBDLDhGQWlDTSxpQkFBa0IsQ0FqQ3hCLG9NQXNDTSxvQnRCNGdDMEMsQ3NCM2dDMUMsc0J0QjRnQ3lDLENzQm5qQy9DLHNHQTJDTSxvQnRCdWdDMEMsQ3NCdGdDMUMsc0J0QnVnQ3lDLENzQm5qQy9DLDRCQWlESSxvQnRCaWdDNEMsQ3NCaGdDNUMsc0J0QmlnQzJDLENzQm5qQy9DLDJMQTBETSx5Q0FBNkYsQ0FDN0YsNkR0QjIvQmtGLENzQnRqQ3hGLHVOQThEUSxpQkFBa0IsQ0FDbEIsa0JBQStELENBQy9ELFVBQVcsQ0FDWCxZdEJtL0JxQyxDc0JsL0JyQyxVQUFXLENBQ1gsa0N0QmcwQmlFLENDaDNCckUscUNEMDNCaUYsQ3NCNzRCckYsc0RBMkVNLHlDQUE2RixDQUM3Riw2RHRCMCtCa0YsQ3NCdGpDeEYsK0NBa0ZNLHFDQUFtQyxDQWxGekMsK0VBd0ZJLGF0QjFFYyxDc0JkbEIsNkZBMkZNLHVDdEIweUI2RSxDc0J6eUI5RSxhQ3ZGSCxpQkFBa0IsQ0FDbEIsWUFBYSxDQUNiLGNBQWUsQ0FDZixtQkFBb0IsQ0FDcEIsVUFBVyxDQUxiLGlGQVVJLGlCQUFrQixDQUNsQixhQUFjLENBQ2QsUUFBUyxDQUNULFdBQVksQ0FiaEIsMEdBb0JJLFNBQVUsQ0FwQmQsa0JBMkJJLGlCQUFrQixDQUNsQixTQUFVLENBNUJkLHdCQStCTSxTQUFVLENBQ1gsa0JBV0gsWUFBYSxDQUNiLGtCQUFtQixDQUNuQixzQnZCb3VCa0MsQ0Z0ZjlCLGNBbkUrQixDeUJ6S25DLGV2QnlqQitCLEN1QnhqQi9CLGV2QmdrQitCLEN1Qi9qQi9CLDBCdkJtMUI2RSxDdUJsMUI3RSxpQkFBa0IsQ0FDbEIsa0JBQW1CLENBQ25CLHNDdkIwNkIrRSxDdUJ6NkIvRSwwRHZCZzFCaUYsQ0N0M0IvRSxxQ0QwM0JpRixDdUJsMUJwRixrSEFZQyxrQnZCOHRCZ0MsQ0Z0Z0I1QixpQkFuRStCLENHek1qQyx3Q0Q0M0J1RixDdUJyMEIxRixrSEFNQyxvQnZCaXRCaUMsQ0ZsZ0I3QixpQkFuRStCLENHek1qQyx3Q0QyM0J1RixDdUIzekIxRiwwREFJQyxrQkFBc0UsQ0FDdkUsd1Z0QnJERyx5QnNCcUU4QixDdEJwRTlCLDRCc0JvRThCLENBTmxDLHlVdEIvREkseUJzQjhFOEIsQ3RCN0U5Qiw0QnNCNkU4QixDQWZsQywwSUF5QkksNkNBQThDLEN0QjFFOUMsd0JzQjJFOEIsQ3RCMUU5QiwyQnNCMEU4QixDQTFCbEMsdUh0QmpESSx3QnNCZ0Y4QixDdEIvRTlCLDJCc0IrRThCLENBUDRCLGdCQy9GMUQsWUFBYSxDQUNiLFVBQVcsQ0FDWCxpQnhCdTBCMEMsQ0Zya0J4QyxnQkFuRStCLEMwQjVMakMsZ0N4Qm9qQzRELEN3Qm5qQzdELGVBR0MsaUJBQWtCLENBQ2xCLFFBQVMsQ0FDVCxTQUFVLENBQ1YsWUFBYSxDQUNiLGNBQWUsQ0FDZixvQnhCdTFDNEMsQ3dCdDFDNUMsZ0JBQWlCLEMxQnFQZixpQkFuRStCLEMwQi9LakMsVXhCeWlDcUIsQ3dCeGlDckIsa0N4QnlpQ3FELENDcGtDckQscUNEMDJDNkUsQ3dCdjNDN0Usc0lBK0NFLGFBQWMsQ0EvQ2hCLDBEQXFERSw4Q3hCOGhDK0UsQ3dCM2hDN0Usa0NWNEt3RCxDVTNLeEQsd0RWd0UwRSxDVXZFMUUsMkJBQTRCLENBQzVCLHdEQUE2RCxDQUM3RCwyRFZ3S3dELENVcE81RCxzRUFnRUksOEN4Qm1oQzZFLEN3QmxoQzdFLHlEeEJpaEM0SSxDd0JsbENoSiwwRUEwRUksa0NWMEp3RCxDVXpKeEQsNkVWeUp3RCxDVXBPNUQsd0RBa0ZFLDhDeEJpZ0MrRSxDd0JubENqRiw0TkF1Rk0saUVBQXFELENBQ3JELHNCeEIwNUIyRixDd0J6NUIzRiw0RHhCNDRCb0QsQ3dCMzRCcEQscUVWMElzRCxDVXBPNUQsb0VBK0ZJLDhDeEJvL0I2RSxDd0JuL0I3RSx5RHhCay9CNEksQ3dCbGxDaEosc0VBd0dJLHVDVjRId0QsQ1VwTzVELGtFQStHRSw4Q3hCbytCK0UsQ3dCbmxDakYsa0ZBa0hJLDJDeEI0OUJ3RCxDd0I5a0M1RCw4RUFzSEkseUR4QjQ5QjRJLEN3QmxsQ2hKLDBHQTBISSxnQ3hCbzlCd0QsQ3dCbjlCekQsdURBS0QsZ0JBQWlCLENBaEluQixrVkEwSU0sU0FBVSxDQXZJZixrQkFrQkQsWUFBYSxDQUNiLFVBQVcsQ0FDWCxpQnhCdTBCMEMsQ0Zya0J4QyxnQkFuRStCLEMwQjVMakMsa0N4QjRqQ2dFLEN3QjNqQ2pFLGlCQUdDLGlCQUFrQixDQUNsQixRQUFTLENBQ1QsU0FBVSxDQUNWLFlBQWEsQ0FDYixjQUFlLENBQ2Ysb0J4QnUxQzRDLEN3QnQxQzVDLGdCQUFpQixDMUJx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QU9JLDBCQUErRCxDQVBuRSxZQU9JLDBCQUErRCxDQVBuRSxTQU9JLHlCQUErRCxDQVBuRSxTQU9JLDhCQUErRCxDQVBuRSxTQU9JLDZCQUErRCxDQVBuRSxTQU9JLDRCQUErRCxDQVBuRSxTQU9JLDhCQUErRCxDQVBuRSxTQU9JLDRCQUErRCxDQVBuRSxZQU9JLDRCQUErRCxDQVBuRSxTQU9JLDBCQUErRCxDQVBuRSxTQU9JLCtCQUErRCxDQVBuRSxTQU9JLDhCQUErRCxDQVBuRSxTQU9JLDZCQUErRCxDQVBuRSxTQU9JLCtCQUErRCxDQVBuRSxTQU9JLDZCQUErRCxDQVBuRSxZQU9JLDZCQUErRCxDQVBuRSxTQU9JLHdCQUErRCxDQVBuRSxTQU9JLDZCQUErRCxDQVBuRSxTQU9JLDRCQUErRCxDQVBuRSxTQU9JLDJCQUErRCxDQVBuRSxTQU9JLDZCQUErRCxDQVBuRSxTQU9JLDJCQUErRCxDQVBuRSxZQU9JLDJCQUErRCxDQVBuRSxRQU9JLG9CQUErRCxDQVBuRSxRQU9JLHlCQUErRCxDQVBuRSxRQU9JLHdCQUErRCxDQVBuRSxRQU9JLHVCQUErRCxDQVBuRSxRQU9JLHlCQUErRCxDQVBuRSxRQU9JLHVCQUErRCxDQVBuRSxTQU9JLDBCQUErRCxDQUEvRCx5QkFBK0QsQ0FQbkUsU0FPSSwrQkFBK0QsQ0FBL0QsOEJBQStELENBUG5FLFNBT0ksOEJBQStELENBQS9ELDZCQUErRCxDQVBuRSxTQU9JLDZCQUErRCxDQUEvRCw0QkFBK0QsQ0FQbkUsU0FPSSwrQkFBK0QsQ0FBL0QsOEJBQStELENBUG5FLFNBT0ksNkJBQStELENBQS9ELDRCQUErRCxDQVBuRSxTQU9JLHdCQUErRCxDQUEvRCwyQkFBK0QsQ0FQbkUsU0FPSSw2QkFBK0QsQ0FBL0QsZ0NBQStELENBUG5FLFNBT0ksNEJBQStELENBQS9ELCtCQUErRCxDQVBuRSxTQU9JLDJCQUErRCxDQUEvRCw4QkFBK0QsQ0FQbkUsU0FPSSw2QkFBK0QsQ0FBL0QsZ0NBQStELENBUG5FLFNBT0ksMkJBQStELENBQS9ELDhCQUErRCxDQVBuRSxTQU9JLHdCQUErRCxDQVBuRSxTQU9JLDZCQUErRCxDQVBuRSxTQU9JLDRCQUErRCxDQVBuRSxTQU9JLDJCQUErRCxDQVBuRSxTQU9JLDZCQUErRCxDQVBuRSxTQU9JLDJCQUErRCxDQVBuRSxTQU9JLDBCQUErRCxDQVBuRSxTQU9JLCtCQUErRCxDQVBuRSxTQU9JLDhCQUErRCxDQVBuRSxTQU9JLDZCQUErRCxDQVBuRSxTQU9JLCtCQUErRCxDQVBuRSxTQU9JLDZCQUErRCxDQVBuRSxTQU9JLDJCQUErRCxDQVBuRSxTQU9JLGdDQUErRCxDQVBuRSxTQU9JLCtCQUErRCxDQVBuRSxTQU9JLDhCQUErRCxDQVBuRSxTQU9JLGdDQUErRCxDQVBuRSxTQU9JLDhCQUErRCxDQVBuRSxTQU9JLHlCQUErRCxDQVBuRSxTQU9JLDhCQUErRCxDQVBuRSxTQU9JLDZCQUErRCxDQVBuRSxTQU9JLDRCQUErRCxDQVBuRSxTQU9JLDhCQUErRCxDQVBuRSxTQU9JLDRCQUErRCxDQVBuRSxVQU9JLGdCQUErRCxDQVBuRSxVQU9JLHFCQUErRCxDQVBuRSxVQU9JLG9CQUErRCxDQVBuRSxVQU9JLG1CQUErRCxDQVBuRSxVQU9JLHFCQUErRCxDQVBuRSxVQU9JLG1CQUErRCxDQVBuRSxjQU9JLG9CQUErRCxDQVBuRSxjQU9JLHlCQUErRCxDQVBuRSxjQU9JLHdCQUErRCxDQVBuRSxjQU9JLHVCQUErRCxDQVBuRSxjQU9JLHlCQUErRCxDQVBuRSxjQU9JLHVCQUErRCxDQVBuRSxpQkFPSSx1QkFBK0QsQ0FQbkUsaUJBT0ksNEJBQStELENBUG5FLGlCQU9JLDJCQUErRCxDQVBuRSxpQkFPSSwwQkFBK0QsQ0FQbkUsaUJBT0ksNEJBQStELENBUG5FLGlCQU9JLDBCQUErRCxDQVBuRSxlQU9JLDBCQUErRCxDQVBuRSxhQU9JLDJCQUErRCxDQVBuRSxnQkFPSSw0QkFBK0QsQ0FFbEUsQzNEWkwsMEIyREdJLGdCQU9JLHFCQUErRCxDQVBuRSxjQU9JLHNCQUErRCxDQVBuRSxlQU9JLHFCQUErRCxDQVBuRSx1QkFPSSw2QkFBK0QsQ0FQbkUscUJBT0ksMkJBQStELENBUG5FLG9CQU9JLDBCQUErRCxDQVBuRSxxQkFPSSxnQ0FBK0QsQ0FQbkUsb0JBT0ksMEJBQStELENBUG5FLGFBT0kseUJBQStELENBUG5FLG1CQU9JLCtCQUErRCxDQVBuRSxZQU9JLHdCQUErRCxDQVBuRSxXQU9JLHVCQUErRCxDQVBuRSxrQkFPSSw4QkFBK0QsQ0FQbkUsWUFPSSx3QkFBK0QsQ0FQbkUsZ0JBT0ksNEJBQStELENBUG5FLGlCQU9JLDZCQUErRCxDQVBuRSxXQU9JLHVCQUErRCxDQVBuRSxrQkFPSSw4QkFBK0QsQ0FQbkUsV0FPSSx1QkFBK0QsQ0FQbkUsY0FPSSx3QkFBK0QsQ0FQbkUsYUFPSSw2QkFBK0QsQ0FQbkUsZ0JBT0ksZ0NBQStELENBUG5FLHFCQU9JLHFDQUErRCxDQVBuRSx3QkFPSSx3Q0FBK0QsQ0FQbkUsZ0JBT0ksc0JBQStELENBUG5FLGdCQU9JLHNCQUErRCxDQVBuRSxrQkFPSSx3QkFBK0QsQ0FQbkUsa0JBT0ksd0JBQStELENBUG5FLGNBT0kseUJBQStELENBUG5FLGdCQU9JLDJCQUErRCxDQVBuRSxzQkFPSSxpQ0FBK0QsQ0FQbkUsMEJBT0kscUNBQStELENBUG5FLHdCQU9JLG1DQUErRCxDQVBuRSwyQkFPSSxpQ0FBK0QsQ0FQbkUsNEJBT0ksd0NBQStELENBUG5FLDJCQU9JLHVDQUErRCxDQVBuRSwyQkFPSSx1Q0FBK0QsQ0FQbkUsc0JBT0ksaUNBQStELENBUG5FLG9CQU9JLCtCQUErRCxDQVBuRSx1QkFPSSw2QkFBK0QsQ0FQbkUseUJBT0ksK0JBQStELENBUG5FLHdCQU9JLDhCQUErRCxDQVBuRSx3QkFPSSxtQ0FBK0QsQ0FQbkUsc0JBT0ksaUNBQStELENBUG5FLHlCQU9JLCtCQUErRCxDQVBuRSwwQkFPSSxzQ0FBK0QsQ0FQbkUseUJBT0kscUNBQStELENBUG5FLDBCQU9JLGdDQUErRCxDQVBuRSxvQkFPSSwwQkFBK0QsQ0FQbkUscUJBT0ksZ0NBQStELENBUG5FLG1CQU9JLDhCQUErRCxDQVBuRSxzQkFPSSw0QkFBK0QsQ0FQbkUsd0JBT0ksOEJBQStELENBUG5FLHVCQU9JLDZCQUErRCxDQVBuRSxnQkFPSSxtQkFBK0QsQ0FQbkUsWUFPSSxrQkFBK0QsQ0FQbkUsWUFPSSxrQkFBK0QsQ0FQbkUsWUFPSSxrQkFBK0QsQ0FQbkUsWUFPSSxrQkFBK0QsQ0FQbkUsWUFPSSxrQkFBK0QsQ0FQbkUsWUFPSSxrQkFBK0QsQ0FQbkUsZUFPSSxrQkFBK0QsQ0FQbkUsUUFPSSxtQkFBK0QsQ0FQbkUsUUFPSSx3QkFBK0QsQ0FQbkUsUUFPSSx1QkFBK0QsQ0FQbkUsUUFPSSxzQkFBK0QsQ0FQbkUsUUFPSSx3QkFBK0QsQ0FQbkUsUUFPSSxzQkFBK0QsQ0FQbkUsV0FPSSxzQkFBK0QsQ0FQbkUsU0FPSSx5QkFBK0QsQ0FBL0Qsd0JBQStELENBUG5FLFNBT0ksOEJBQStELENBQS9ELDZCQUErRCxDQVBuRSxTQU9JLDZCQUErRCxDQUEvRCw0QkFBK0QsQ0FQbkUsU0FPSSw0QkFBK0QsQ0FBL0QsMkJBQStELENBUG5FLFNBT0ksOEJBQStELENBQS9ELDZCQUErRCxDQVBuRSxTQU9JLDRCQUErRCxDQUEvRCwyQkFBK0QsQ0FQbkUsWUFPSSw0QkFBK0QsQ0FBL0QsMkJBQStELENBUG5FLFNBT0ksdUJBQStELENBQS9ELDBCQUErRCxDQVBuRSxTQU9JLDRCQUErRCxDQUEvRCwrQkFBK0QsQ0FQbkUsU0FPSSwyQkFBK0QsQ0FBL0QsOEJBQStELENBUG5FLFNBT0ksMEJBQStELENBQS9ELDZCQUErRCxDQVBuRSxTQU9JLDRCQUErRCxDQUEvRCwrQkFBK0QsQ0FQbkUsU0FPSSwwQkFBK0QsQ0FBL0QsNkJBQStELENBUG5FLFlBT0ksMEJBQStELENBQS9ELDZCQUErRCxDQVBuRSxTQU9JLHVCQUErRCxDQVBuRSxTQU9JLDRCQUErRCxDQVBuRSxTQU9JLDJCQUErRCxDQVBuRSxTQU9JLDBCQUErRCxDQVBuRSxTQU9JLDRCQUErRCxDQVBuRSxTQU9JLDBCQUErRCxDQVBuRSxZQU9JLDBCQUErRCxDQVBuRSxTQU9JLHlCQUErRCxDQVBuRSxTQU9JLDhCQUErRCxDQVBuRSxTQU9JLDZCQUErRCxDQVBuRSxTQU9JLDRCQUErRCxDQVBuRSxTQU9JLDhCQUErRCxDQVBuRSxTQU9JLDRCQUErRCxDQVBuRSxZQU9JLDRCQUErRCxDQVBuRSxTQU9JLDBCQUErRCxDQVBuRSxTQU9JLCtCQUErRCxDQVBuRSxTQU9JLDhCQUErRCxDQVBuRSxTQU9JLDZCQUErRCxDQVBuRSxTQU9JLCtCQUErRCxDQVBuRSxTQU9JLDZCQUErRCxDQVBuRSxZQU9JLDZCQUErRCxDQVBuRSxTQU9JLHdCQUErRCxDQVBuRSxTQU9JLDZCQUErRCxDQVBuRSxTQU9JLDRCQUErRCxDQVBuRSxTQU9JLDJCQUErRCxDQVBuRSxTQU9JLDZCQUErRCxDQVBuRSxTQU9JLDJCQUErRCxDQVBuRSxZQU9JLDJCQUErRCxDQVBuRSxRQU9JLG9CQUErRCxDQVBuRSxRQU9JLHlCQUErRCxDQVBuRSxRQU9JLHdCQUErRCxDQVBuRSxRQU9JLHVCQUErRCxDQVBuRSxRQU9JLHlCQUErRCxDQVBuRSxRQU9JLHVCQUErRCxDQVBuRSxTQU9JLDBCQUErRCxDQUEvRCx5QkFBK0QsQ0FQbkUsU0FPSSwrQkFBK0QsQ0FBL0QsOEJBQStELENBUG5FLFNBT0ksOEJBQStELENBQS9ELDZCQUErRCxDQVBuRSxTQU9JLDZCQUErRCxDQUEvRCw0QkFBK0QsQ0FQbkUsU0FPSSwrQkFBK0QsQ0FBL0QsOEJBQStELENBUG5FLFNBT0ksNkJBQStELENBQS9ELDRCQUErRCxDQVBuRSxTQU9JLHdCQUErRCxDQUEvRCwyQkFBK0QsQ0FQbkUsU0FPSSw2QkFBK0QsQ0FBL0QsZ0NBQStELENBUG5FLFNBT0ksNEJBQStELENBQS9ELCtCQUErRCxDQVBuRSxTQU9JLDJCQUErRCxDQUEvRCw4QkFBK0QsQ0FQbkUsU0FPSSw2QkFBK0QsQ0FBL0QsZ0NBQStELENBUG5FLFNBT0ksMkJBQStELENBQS9ELDhCQUErRCxDQVBuRSxTQU9JLHdCQUErRCxDQVBuRSxTQU9JLDZCQUErRCxDQVBuRSxTQU9JLDRCQUErRCxDQVBuRSxTQU9JLDJCQUErRCxDQVBuRSxTQU9JLDZCQUErRCxDQVBuRSxTQU9JLDJCQUErRCxDQVBuRSxTQU9JLDBCQUErRCxDQVBuRSxTQU9JLCtCQUErRCxDQVBuRSxTQU9JLDhCQUErRCxDQVBuRSxTQU9JLDZCQUErRCxDQVBuRSxTQU9JLCtCQUErRCxDQVBuRSxTQU9JLDZCQUErRCxDQVBuRSxTQU9JLDJCQUErRCxDQVBuRSxTQU9JLGdDQUErRCxDQVBuRSxTQU9JLCtCQUErRCxDQVBuRSxTQU9JLDhCQUErRCxDQVBuRSxTQU9JLGdDQUErRCxDQVBuRSxTQU9JLDhCQUErRCxDQVBuRSxTQU9JLHlCQUErRCxDQVBuRSxTQU9JLDhCQUErRCxDQVBuRSxTQU9JLDZCQUErRCxDQVBuRSxTQU9JLDRCQUErRCxDQVBuRSxTQU9JLDhCQUErRCxDQVBuRSxTQU9JLDRCQUErRCxDQVBuRSxVQU9JLGdCQUErRCxDQVBuRSxVQU9JLHFCQUErRCxDQVBuRSxVQU9JLG9CQUErRCxDQVBuRSxVQU9JLG1CQUErRCxDQVBuRSxVQU9JLHFCQUErRCxDQVBuRSxVQU9JLG1CQUErRCxDQVBuRSxjQU9JLG9CQUErRCxDQVBuRSxjQU9JLHlCQUErRCxDQVBuRSxjQU9JLHdCQUErRCxDQVBuRSxjQU9JLHVCQUErRCxDQVBuRSxjQU9JLHlCQUErRCxDQVBuRSxjQU9JLHVCQUErRCxDQVBuRSxpQkFPSSx1QkFBK0QsQ0FQbkUsaUJBT0ksNEJBQStELENBUG5FLGlCQU9JLDJCQUErRCxDQVBuRSxpQkFPSSwwQkFBK0QsQ0FQbkUsaUJBT0ksNEJBQStELENBUG5FLGlCQU9JLDBCQUErRCxDQVBuRSxlQU9JLDBCQUErRCxDQVBuRSxhQU9JLDJCQUErRCxDQVBuRSxnQkFPSSw0QkFBK0QsQ0FFbEUsQzNEWkwsMEIyREdJLGdCQU9JLHFCQUErRCxDQVBuRSxjQU9JLHNCQUErRCxDQVBuRSxlQU9JLHFCQUErRCxDQVBuRSx1QkFPSSw2QkFBK0QsQ0FQbkUscUJBT0ksMkJBQStELENBUG5FLG9CQU9JLDBCQUErRCxDQVBuRSxxQkFPSSxnQ0FBK0QsQ0FQbkUsb0JBT0ksMEJBQStELENBUG5FLGFBT0kseUJBQStELENBUG5FLG1CQU9JLCtCQUErRCxDQVBuRSxZQU9JLHdCQUErRCxDQVBuRSxXQU9JLHVCQUErRCxDQVBuRSxrQkFPSSw4QkFBK0QsQ0FQbkUsWUFPSSx3QkFBK0QsQ0FQbkUsZ0JBT0ksNEJBQStELENBUG5FLGlCQU9JLDZCQUErRCxDQVBuRSxXQU9JLHVCQUErRCxDQVBuRSxrQkFPSSw4QkFBK0QsQ0FQbkUsV0FPSSx1QkFBK0QsQ0FQbkUsY0FPSSx3QkFBK0QsQ0FQbkUsYUFPSSw2QkFBK0QsQ0FQbkUsZ0JBT0ksZ0NBQStELENBUG5FLHFCQU9JLHFDQUErRCxDQVBuRSx3QkFPSSx3Q0FBK0QsQ0FQbkUsZ0JBT0ksc0JBQStELENBUG5FLGdCQU9JLHNCQUErRCxDQVBuRSxrQkFPSSx3QkFBK0QsQ0FQbkUsa0JBT0ksd0JBQStELENBUG5FLGNBT0kseUJBQStELENBUG5FLGdCQU9JLDJCQUErRCxDQVBuRSxzQkFPSSxpQ0FBK0QsQ0FQbkUsMEJBT0kscUNBQStELENBUG5FLHdCQU9JLG1DQUErRCxDQVBuRSwyQkFPSSxpQ0FBK0QsQ0FQbkUsNEJBT0ksd0NBQStELENBUG5FLDJCQU9JLHVDQUErRCxDQVBuRSwyQkFPSSx1Q0FBK0QsQ0FQbkUsc0JBT0ksaUNBQStELENBUG5FLG9CQU9JLCtCQUErRCxDQVBuRSx1QkFPSSw2QkFBK0QsQ0FQbkUseUJBT0ksK0JBQStELENBUG5FLHdCQU9JLDhCQUErRCxDQVBuRSx3QkFPSSxtQ0FBK0QsQ0FQbkUsc0JBT0ksaUNBQStELENBUG5FLHlCQU9JLCtCQUErRCxDQVBuRSwwQkFPSSxzQ0FBK0QsQ0FQbkUseUJBT0kscUNBQStELENBUG5FLDBCQU9JLGdDQUErRCxDQVBuRSxvQkFPSSwwQkFBK0QsQ0FQbkUscUJBT0ksZ0NBQStELENBUG5FLG1CQU9JLDhCQUErRCxDQVBuRSxzQkFPSSw0QkFBK0QsQ0FQbkUsd0JBT0ksOEJBQStELENBUG5FLHVCQU9JLDZCQUErRCxDQVBuRSxnQkFPSSxtQkFBK0QsQ0FQbkUsWUFPSSxrQkFBK0QsQ0FQbkUsWUFPSSxrQkFBK0QsQ0FQbkUsWUFPSSxrQkFBK0QsQ0FQbkUsWUFPSSxrQkFBK0QsQ0FQbkUsWUFPSSxrQkFBK0QsQ0FQbkUsWUFPSSxrQkFBK0QsQ0FQbkUsZUFPSSxrQkFBK0QsQ0FQbkUsUUFPSSxtQkFBK0QsQ0FQbkUsUUFPSSx3QkFBK0QsQ0FQbkUsUUFPSSx1QkFBK0QsQ0FQbkUsUUFPSSxzQkFBK0QsQ0FQbkUsUUFPSSx3QkFBK0QsQ0FQbkUsUUFPSSxzQkFBK0QsQ0FQbkUsV0FPSSxzQkFBK0QsQ0FQbkUsU0FPSSx5QkFBK0QsQ0FBL0Qsd0JBQStELENBUG5FLFNBT0ksOEJBQStELENBQS9ELDZCQUErRCxDQVBuRSxTQU9JLDZCQUErRCxDQUEvRCw0QkFBK0QsQ0FQbkUsU0FPSSw0QkFBK0QsQ0FBL0QsMkJBQStELENBUG5FLFNBT0ksOEJBQStELENBQS9ELDZCQUErRCxDQVBuRSxTQU9JLDRCQUErRCxDQUEvRCwyQkFBK0QsQ0FQbkUsWUFPSSw0QkFBK0QsQ0FBL0QsMkJBQStELENBUG5FLFNBT0ksdUJBQStELENBQS9ELDBCQUErRCxDQVBuRSxTQU9JLDRCQUErRCxDQUEvRCwrQkFBK0QsQ0FQbkUsU0FPSSwyQkFBK0QsQ0FBL0QsOEJBQStELENBUG5FLFNBT0ksMEJBQStELENBQS9ELDZCQUErRCxDQVBuRSxTQU9JLDRCQUErRCxDQUEvRCwrQkFBK0QsQ0FQbkUsU0FPSSwwQkFBK0QsQ0FBL0QsNkJBQStELENBUG5FLFlBT0ksMEJBQStELENBQS9ELDZCQUErRCxDQVBuRSxTQU9JLHVCQUErRCxDQVBuRSxTQU9JLDRCQUErRCxDQVBuRSxTQU9JLDJCQUErRCxDQVBuRSxTQU9JLDBCQUErRCxDQVBuRSxTQU9JLDRCQUErRCxDQVBuRSxTQU9JLDBCQUErRCxDQVBuRSxZQU9JLDBCQUErRCxDQVBuRSxTQU9JLHlCQUErRCxDQVBuRSxTQU9JLDhCQUErRCxDQVBuRSxTQU9JLDZCQUErRCxDQVBuRSxTQU9JLDRCQUErRCxDQVBuRSxTQU9JLDhCQUErRCxDQVBuRSxTQU9JLDRCQUErRCxDQVBuRSxZQU9JLDRCQUErRCxDQVBuRSxTQU9JLDBCQUErRCxDQVBuRSxTQU9JLCtCQUErRCxDQVBuRSxTQU9JLDhCQUErRCxDQVBuRSxTQU9JLDZCQUErRCxDQVBuRSxTQU9JLCtCQUErRCxDQVBuRSxTQU9JLDZCQUErRCxDQVBuRSxZQU9JLDZCQUErRCxDQVBuRSxTQU9JLHdCQUErRCxDQVBuRSxTQU9JLDZCQUErRCxDQVBuRSxTQU9JLDRCQUErRCxDQVBuRSxTQU9JLDJCQUErRCxDQVBuRSxTQU9JLDZCQUErRCxDQVBuRSxTQU9JLDJCQUErRCxDQVBuRSxZQU9JLDJCQUErRCxDQVBuRSxRQU9JLG9CQUErRCxDQVBuRSxRQU9JLHlCQUErRCxDQVBuRSxRQU9JLHdCQUErRCxDQVBuRSxRQU9JLHVCQUErRCxDQVBuRSxRQU9JLHlCQUErRCxDQVBuRSxRQU9JLHVCQUErRCxDQVBuRSxTQU9JLDBCQUErRCxDQUEvRCx5QkFBK0QsQ0FQbkUsU0FPSSwrQkFBK0QsQ0FBL0QsOEJBQStELENBUG5FLFNBT0ksOEJBQStELENBQS9ELDZCQUErRCxDQVBuRSxTQU9JLDZCQUErRCxDQUEvRCw0QkFBK0QsQ0FQbkUsU0FPSSwrQkFBK0QsQ0FBL0QsOEJBQStELENBUG5FLFNBT0ksNkJBQStELENBQS9ELDRCQUErRCxDQVBuRSxTQU9JLHdCQUErRCxDQUEvRCwyQkFBK0QsQ0FQbkUsU0FPSSw2QkFBK0QsQ0FBL0QsZ0NBQStELENBUG5FLFNBT0ksNEJBQStELENBQS9ELCtCQUErRCxDQVBuRSxTQU9JLDJCQUErRCxDQUEvRCw4QkFBK0QsQ0FQbkUsU0FPSSw2QkFBK0QsQ0FBL0QsZ0NBQStELENBUG5FLFNBT0ksMkJBQStELENBQS9ELDhCQUErRCxDQVBuRSxTQU9JLHdCQUErRCxDQVBuRSxTQU9JLDZCQUErRCxDQVBuRSxTQU9JLDRCQUErRCxDQVBuRSxTQU9JLDJCQUErRCxDQVBuRSxTQU9JLDZCQUErRCxDQVBuRSxTQU9JLDJCQUErRCxDQVBuRSxTQU9JLDBCQUErRCxDQVBuRSxTQU9JLCtCQUErRCxD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QU9JLDhCQUErRCxDQVBuRSxTQU9JLDZCQUErRCxDQVBuRSxTQU9JLCtCQUErRCxDQVBuRSxTQU9JLDZCQUErRCxDQVBuRSxZQU9JLDZCQUErRCxDQVBuRSxTQU9JLHdCQUErRCxDQVBuRSxTQU9JLDZCQUErRCxDQVBuRSxTQU9JLDRCQUErRCxDQVBuRSxTQU9JLDJCQUErRCxDQVBuRSxTQU9JLDZCQUErRCxDQVBuRSxTQU9JLDJCQUErRCxDQVBuRSxZQU9JLDJCQUErRCxDQVBuRSxRQU9JLG9CQUErRCxDQVBuRSxRQU9JLHlCQUErRCxDQVBuRSxRQU9JLHdCQUErRCxDQVBuRSxRQU9JLHVCQUErRCxDQVBuRSxRQU9JLHlCQUErRCxDQVBuRSxRQU9JLHVCQUErRCxDQVBuRSxTQU9JLDBCQUErRCxDQUEvRCx5QkFBK0QsQ0FQbkUsU0FPSSwrQkFBK0QsQ0FBL0QsOEJBQStELENBUG5FLFNBT0ksOEJBQStELENBQS9ELDZCQUErRCxDQVBuRSxTQU9JLDZCQUErRCxDQUEvRCw0QkFBK0QsQ0FQbkUsU0FPSSwrQkFBK0QsQ0FBL0QsOEJBQStELENBUG5FLFNBT0ksNkJBQStELENBQS9ELDRCQUErRCxDQVBuRSxTQU9JLHdCQUErRCxDQUEvRCwyQkFBK0QsQ0FQbkUsU0FPSSw2QkFBK0QsQ0FBL0QsZ0NBQStELENBUG5FLFNBT0ksNEJBQStELENBQS9ELCtCQUErRCxDQVBuRSxTQU9JLDJCQUErRCxDQUEvRCw4QkFBK0QsQ0FQbkUsU0FPSSw2QkFBK0QsQ0FBL0QsZ0NBQStELENBUG5FLFNBT0ksMkJBQStELENBQS9ELDhCQUErRCxDQVBuRSxTQU9JLHdCQUErRCxDQVBuRSxTQU9JLDZCQUErRCxDQVBuRSxTQU9JLDRCQUErRCxDQVBuRSxTQU9JLDJCQUErRCxDQVBuRSxTQU9JLDZCQUErRCxDQVBuRSxTQU9JLDJCQUErRCxDQVBuRSxTQU9JLDBCQUErRCxDQVBuRSxTQU9JLCtCQUErRCxDQVBuRSxTQU9JLDhCQUErRCxDQVBuRSxTQU9JLDZCQUErRCxDQVBuRSxTQU9JLCtCQUErRCxDQVBuRSxTQU9JLDZC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LENBUG5FLGFBT0ksNkJBQStELENBUG5FLFVBT0ksd0JBQStELENBUG5FLFVBT0ksNkJBQStELENBUG5FLFVBT0ksNEJBQStELENBUG5FLFVBT0ksMkJBQStELENBUG5FLFVBT0ksNkJBQStELENBUG5FLFVBT0ksMkJBQStELENBUG5FLGFBT0ksMkJBQStELENBUG5FLFNBT0ksb0JBQStELENBUG5FLFNBT0kseUJBQStELENBUG5FLFNBT0ksd0JBQStELENBUG5FLFNBT0ksdUJBQStELENBUG5FLFNBT0kseUJBQStELENBUG5FLFNBT0ksdUJBQStELENBUG5FLFVBT0ksMEJBQStELENBQS9ELHlCQUErRCxDQVBuRSxVQU9JLCtCQUErRCxDQUEvRCw4QkFBK0QsQ0FQbkUsVUFPSSw4QkFBK0QsQ0FBL0QsNkJBQStELENBUG5FLFVBT0ksNkJBQStELENBQS9ELDRCQUErRCxDQVBuRSxVQU9JLCtCQUErRCxDQUEvRCw4QkFBK0QsQ0FQbkUsVUFPSSw2QkFBK0QsQ0FBL0QsNEJBQStELENBUG5FLFVBT0ksd0JBQStELENBQS9ELDJCQUErRCxDQVBuRSxVQU9JLDZCQUErRCxDQUEvRCxnQ0FBK0QsQ0FQbkUsVUFPSSw0QkFBK0QsQ0FBL0QsK0JBQStELENBUG5FLFVBT0ksMkJBQStELENBQS9ELDhCQUErRCxDQVBuRSxVQU9JLDZCQUErRCxDQUEvRCxnQ0FBK0QsQ0FQbkUsVUFPSSwyQkFBK0QsQ0FBL0QsOEJBQStELENBUG5FLFVBT0ksd0JBQStELENBUG5FLFVBT0ksNkJBQStELENBUG5FLFVBT0ksNEJBQStELENBUG5FLFVBT0ksMkJBQStELENBUG5FLFVBT0ksNkJBQStELENBUG5FLFVBT0ksMkJBQStELENBUG5FLFVBT0ksMEJBQStELENBUG5FLFVBT0ksK0JBQStELENBUG5FLFVBT0ksOEJBQStELENBUG5FLFVBT0ksNkJBQStELENBUG5FLFVBT0ksK0JBQStELENBUG5FLFVBT0ksNkJBQStELENBUG5FLFVBT0ksMkJBQStELENBUG5FLFVBT0ksZ0NBQStELENBUG5FLFVBT0ksK0JBQStELENBUG5FLFVBT0ksOEJBQStELENBUG5FLFVBT0ksZ0NBQStELENBUG5FLFVBT0ksOEJBQStELENBUG5FLFVBT0kseUJBQStELENBUG5FLFVBT0ksOEJBQStELENBUG5FLFVBT0ksNkJBQStELENBUG5FLFVBT0ksNEJBQStELENBUG5FLFVBT0ksOEJBQStELENBUG5FLFVBT0ksNEJBQStELENBUG5FLFdBT0ksZ0JBQStELENBUG5FLFdBT0kscUJBQStELENBUG5FLFdBT0ksb0JBQStELENBUG5FLFdBT0ksbUJBQStELENBUG5FLFdBT0kscUJBQStELENBUG5FLFdBT0ksbUJBQStELENBUG5FLGVBT0ksb0JBQStELENBUG5FLGVBT0kseUJBQStELENBUG5FLGVBT0ksd0JBQStELENBUG5FLGVBT0ksdUJBQStELENBUG5FLGVBT0kseUJBQStELENBUG5FLGVBT0ksdUJBQStELENBUG5FLGtCQU9JLHVCQUErRCxDQVBuRSxrQkFPSSw0QkFBK0QsQ0FQbkUsa0JBT0ksMkJBQStELENBUG5FLGtCQU9JLDBCQUErRCxDQVBuRSxrQkFPSSw0QkFBK0QsQ0FQbkUsa0JBT0ksMEJBQStELENBUG5FLGdCQU9JLDBCQUErRCxDQVBuRSxjQU9JLDJCQUErRCxDQVBuRSxpQkFPSSw0QkFBK0QsQ0FFbEUsQ0N4RFQsMkJEK0NRLE1BT0ksMkJBQStELENBUG5FLE1BT0kseUJBQStELENBUG5FLE1BT0ksNEJBQStELENBUG5FLE1BT0ksMkJBQStELENBRWxFLENDckNULGFENEJRLGdCQU9JLHlCQUErRCxDQVBuRSxzQkFPSSwrQkFBK0QsQ0FQbkUsZUFPSSx3QkFBK0QsQ0FQbkUsY0FPSSx1QkFBK0QsQ0FQbkUscUJBT0ksOEJBQStELENBUG5FLGVBT0ksd0JBQStELENBUG5FLG1CQU9JLDRCQUErRCxDQVBuRSxvQkFPSSw2QkFBK0QsQ0FQbkUsY0FPSSx1QkFBK0QsQ0FQbkUscUJBT0ksOEJBQStELENBUG5FLGNBT0ksdUJBQStELENBRWxFXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIi5ncmlkLXRpdGxlICB7XFxuICAgIG1hcmdpbi1sZWZ0OiA1cHg7XFxuICAgIG1hcmdpbi10b3A6IDJweDtcXG59XFxuXFxuXFxuKixcXG4qOjpiZWZvcmUsXFxuKjo6YWZ0ZXIge1xcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbn1cXG5cXG4uY2FyZCB7XFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gICAgZGlzcGxheTogLW1zLWZsZXhib3g7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogY29sdW1uO1xcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xcbiAgICBtaW4td2lkdGg6IDA7XFxuICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcXG4gICAgYmFja2dyb3VuZC1jbGlwOiBib3JkZXItYm94O1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMTI1KTtcXG4gICAgYm9yZGVyLXJhZGl1czogMC4yNXJlbTtcXG59XFxuXFxuLmNhcmQgPiBociB7XFxuICAgIG1hcmdpbi1yaWdodDogMDtcXG4gICAgbWFyZ2luLWxlZnQ6IDA7XFxufVxcblxcbi5jYXJkID4gLmxpc3QtZ3JvdXA6Zmlyc3QtY2hpbGQgLmxpc3QtZ3JvdXAtaXRlbTpmaXJzdC1jaGlsZCB7XFxuICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDAuMjVyZW07XFxuICAgIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAwLjI1cmVtO1xcbn1cXG5cXG4uY2FyZCA+IC5saXN0LWdyb3VwOmxhc3QtY2hpbGQgLmxpc3QtZ3JvdXAtaXRlbTpsYXN0LWNoaWxkIHtcXG4gICAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDAuMjVyZW07XFxuICAgIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDAuMjVyZW07XFxufVxcblxcbi5jYXJkLWJvZHkge1xcbiAgICAtbXMtZmxleDogMSAxIGF1dG87XFxuICAgIGZsZXg6IDEgMSBhdXRvO1xcbiAgICBtaW4taGVpZ2h0OiAxcHg7XFxuICAgIHBhZGRpbmc6IDEuMjVyZW07XFxufVxcblxcbi5jYXJkLXRpdGxlIHtcXG4gICAgbWFyZ2luLWJvdHRvbTogMC43NXJlbTtcXG59XFxuXFxuLmNhcmQtc3VidGl0bGUge1xcbiAgICBtYXJnaW4tdG9wOiAtMC4zNzVyZW07XFxuICAgIG1hcmdpbi1ib3R0b206IDA7XFxufVxcblxcbi5jYXJkLXRleHQ6bGFzdC1jaGlsZCB7XFxuICAgIG1hcmdpbi1ib3R0b206IDA7XFxufVxcblxcbi5jYXJkLWxpbms6aG92ZXIge1xcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XFxufVxcblxcbi5jYXJkLWxpbmsgKyAuY2FyZC1saW5rIHtcXG4gICAgbWFyZ2luLWxlZnQ6IDEuMjVyZW07XFxufVxcblxcbi5jYXJkLWhlYWRlciB7XFxuICAgIHBhZGRpbmc6IDAuNzVyZW0gMS4yNXJlbTtcXG4gICAgbWFyZ2luLWJvdHRvbTogMDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjAzKTtcXG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC4xMjUpO1xcbn1cXG5cXG4uY2FyZC1oZWFkZXI6Zmlyc3QtY2hpbGQge1xcbiAgICBib3JkZXItcmFkaXVzOiBjYWxjKDAuMjVyZW0gLSAxcHgpIGNhbGMoMC4yNXJlbSAtIDFweCkgMCAwO1xcbn1cXG5cXG4uY2FyZC1oZWFkZXIgKyAubGlzdC1ncm91cCAubGlzdC1ncm91cC1pdGVtOmZpcnN0LWNoaWxkIHtcXG4gICAgYm9yZGVyLXRvcDogMDtcXG59XFxuXFxuLmNhcmQtZm9vdGVyIHtcXG4gICAgcGFkZGluZzogMC43NXJlbSAxLjI1cmVtO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMDMpO1xcbiAgICBib3JkZXItdG9wOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjEyNSk7XFxufVxcblxcbi5jYXJkLWZvb3RlcjpsYXN0LWNoaWxkIHtcXG4gICAgYm9yZGVyLXJhZGl1czogMCAwIGNhbGMoMC4yNXJlbSAtIDFweCkgY2FsYygwLjI1cmVtIC0gMXB4KTtcXG59XFxuXFxuLmNhcmQtaGVhZGVyLXRhYnMge1xcbiAgICBtYXJnaW4tcmlnaHQ6IC0wLjYyNXJlbTtcXG4gICAgbWFyZ2luLWJvdHRvbTogLTAuNzVyZW07XFxuICAgIG1hcmdpbi1sZWZ0OiAtMC42MjVyZW07XFxuICAgIGJvcmRlci1ib3R0b206IDA7XFxufVxcblxcbi5jYXJkLWhlYWRlci1waWxscyB7XFxuICAgIG1hcmdpbi1yaWdodDogLTAuNjI1cmVtO1xcbiAgICBtYXJnaW4tbGVmdDogLTAuNjI1cmVtO1xcbn1cXG5cXG4uY2FyZC1pbWctb3ZlcmxheSB7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgdG9wOiAwO1xcbiAgICByaWdodDogMDtcXG4gICAgYm90dG9tOiAwO1xcbiAgICBsZWZ0OiAwO1xcbiAgICBwYWRkaW5nOiAxLjI1cmVtO1xcbn1cXG5cXG4uY2FyZC1pbWcsXFxuLmNhcmQtaW1nLXRvcCxcXG4uY2FyZC1pbWctYm90dG9tIHtcXG4gICAgLW1zLWZsZXgtbmVnYXRpdmU6IDA7XFxuICAgIGZsZXgtc2hyaW5rOiAwO1xcbiAgICB3aWR0aDogMTAwJTtcXG59XFxuXFxuLmNhcmQtaW1nLFxcbi5jYXJkLWltZy10b3Age1xcbiAgICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiBjYWxjKDAuMjVyZW0gLSAxcHgpO1xcbiAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogY2FsYygwLjI1cmVtIC0gMXB4KTtcXG59XFxuXFxuLmNhcmQtaW1nLFxcbi5jYXJkLWltZy1ib3R0b20ge1xcbiAgICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogY2FsYygwLjI1cmVtIC0gMXB4KTtcXG4gICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogY2FsYygwLjI1cmVtIC0gMXB4KTtcXG59XFxuXFxuLmNhcmQtZGVjayAuY2FyZCB7XFxuICAgIG1hcmdpbi1ib3R0b206IDE1cHg7XFxufVxcblxcbkBtZWRpYSAobWluLXdpZHRoOiA1NzZweCkge1xcbiAgICAuY2FyZC1kZWNrIHtcXG4gICAgICAgIGRpc3BsYXk6IC1tcy1mbGV4Ym94O1xcbiAgICAgICAgZGlzcGxheTogZmxleDtcXG4gICAgICAgIC1tcy1mbGV4LWZsb3c6IHJvdyB3cmFwO1xcbiAgICAgICAgZmxleC1mbG93OiByb3cgd3JhcDtcXG4gICAgICAgIG1hcmdpbi1yaWdodDogLTE1cHg7XFxuICAgICAgICBtYXJnaW4tbGVmdDogLTE1cHg7XFxuICAgIH1cXG4gICAgLmNhcmQtZGVjayAuY2FyZCB7XFxuICAgICAgICAtbXMtZmxleDogMSAwIDAlO1xcbiAgICAgICAgZmxleDogMSAwIDAlO1xcbiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxNXB4O1xcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMDtcXG4gICAgICAgIG1hcmdpbi1sZWZ0OiAxNXB4O1xcbiAgICB9XFxufVxcblxcbi5jYXJkLWdyb3VwID4gLmNhcmQge1xcbiAgICBtYXJnaW4tYm90dG9tOiAxNXB4O1xcbn1cXG5cXG5AbWVkaWEgKG1pbi13aWR0aDogNTc2cHgpIHtcXG4gICAgLmNhcmQtZ3JvdXAge1xcbiAgICAgICAgZGlzcGxheTogLW1zLWZsZXhib3g7XFxuICAgICAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICAgICAgLW1zLWZsZXgtZmxvdzogcm93IHdyYXA7XFxuICAgICAgICBmbGV4LWZsb3c6IHJvdyB3cmFwO1xcbiAgICB9XFxuICAgIC5jYXJkLWdyb3VwID4gLmNhcmQge1xcbiAgICAgICAgLW1zLWZsZXg6IDEgMCAwJTtcXG4gICAgICAgIGZsZXg6IDEgMCAwJTtcXG4gICAgICAgIG1hcmdpbi1ib3R0b206IDA7XFxuICAgIH1cXG4gICAgLmNhcmQtZ3JvdXAgPiAuY2FyZCArIC5jYXJkIHtcXG4gICAgICAgIG1hcmdpbi1sZWZ0OiAwO1xcbiAgICAgICAgYm9yZGVyLWxlZnQ6IDA7XFxuICAgIH1cXG4gICAgLmNhcmQtZ3JvdXAgPiAuY2FyZDpub3QoOmxhc3QtY2hpbGQpIHtcXG4gICAgICAgIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAwO1xcbiAgICAgICAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDA7XFxuICAgIH1cXG4gICAgLmNhcmQtZ3JvdXAgPiAuY2FyZDpub3QoOmxhc3QtY2hpbGQpIC5jYXJkLWltZy10b3AsXFxuICAgIC5jYXJkLWdyb3VwID4gLmNhcmQ6bm90KDpsYXN0LWNoaWxkKSAuY2FyZC1oZWFkZXIge1xcbiAgICAgICAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDA7XFxuICAgIH1cXG4gICAgLmNhcmQtZ3JvdXAgPiAuY2FyZDpub3QoOmxhc3QtY2hpbGQpIC5jYXJkLWltZy1ib3R0b20sXFxuICAgIC5jYXJkLWdyb3VwID4gLmNhcmQ6bm90KDpsYXN0LWNoaWxkKSAuY2FyZC1mb290ZXIge1xcbiAgICAgICAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDA7XFxuICAgIH1cXG4gICAgLmNhcmQtZ3JvdXAgPiAuY2FyZDpub3QoOmZpcnN0LWNoaWxkKSB7XFxuICAgICAgICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAwO1xcbiAgICAgICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMDtcXG4gICAgfVxcbiAgICAuY2FyZC1ncm91cCA+IC5jYXJkOm5vdCg6Zmlyc3QtY2hpbGQpIC5jYXJkLWltZy10b3AsXFxuICAgIC5jYXJkLWdyb3VwID4gLmNhcmQ6bm90KDpmaXJzdC1jaGlsZCkgLmNhcmQtaGVhZGVyIHtcXG4gICAgICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDA7XFxuICAgIH1cXG4gICAgLmNhcmQtZ3JvdXAgPiAuY2FyZDpub3QoOmZpcnN0LWNoaWxkKSAuY2FyZC1pbWctYm90dG9tLFxcbiAgICAuY2FyZC1ncm91cCA+IC5jYXJkOm5vdCg6Zmlyc3QtY2hpbGQpIC5jYXJkLWZvb3RlciB7XFxuICAgICAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAwO1xcbiAgICB9XFxufVxcblxcbi5mb3JtLWNvbnRyb2wge1xcbiAgICBkaXNwbGF5OiBibG9jaztcXG4gICAgd2lkdGg6IDEwMCU7XFxuICAgIGhlaWdodDogY2FsYygxLjVlbSArIDAuNzVyZW0gKyAycHgpO1xcbiAgICBwYWRkaW5nOiAwLjM3NXJlbSAwLjc1cmVtO1xcbiAgICBmb250LXNpemU6IDFyZW07XFxuICAgIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICAgIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICAgIGNvbG9yOiAjNDk1MDU3O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xcbiAgICBiYWNrZ3JvdW5kLWNsaXA6IHBhZGRpbmctYm94O1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjY2VkNGRhO1xcbiAgICBib3JkZXItcmFkaXVzOiAwLjI1cmVtO1xcbiAgICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgMC4xNXMgZWFzZS1pbi1vdXQsIGJveC1zaGFkb3cgMC4xNXMgZWFzZS1pbi1vdXQ7XFxufVxcblxcbkBtZWRpYSAocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogcmVkdWNlKSB7XFxuICAgIC5mb3JtLWNvbnRyb2wge1xcbiAgICAgICAgdHJhbnNpdGlvbjogbm9uZTtcXG4gICAgfVxcbn1cXG5cXG4uZm9ybS1jb250cm9sOjotbXMtZXhwYW5kIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XFxuICAgIGJvcmRlcjogMDtcXG59XFxuXFxuLmZvcm0tY29udHJvbDotbW96LWZvY3VzcmluZyB7XFxuICAgIGNvbG9yOiB0cmFuc3BhcmVudDtcXG4gICAgdGV4dC1zaGFkb3c6IDAgMCAwICM0OTUwNTc7XFxufVxcblxcbi5mb3JtLWNvbnRyb2w6Zm9jdXMge1xcbiAgICBjb2xvcjogIzQ5NTA1NztcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcXG4gICAgYm9yZGVyLWNvbG9yOiAjODBiZGZmO1xcbiAgICBvdXRsaW5lOiAwO1xcbiAgICBib3gtc2hhZG93OiAwIDAgMCAwLjJyZW0gcmdiYSgwLCAxMjMsIDI1NSwgMC4yNSk7XFxufVxcblxcbi5mb3JtLWNvbnRyb2w6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXIge1xcbiAgICBjb2xvcjogIzZjNzU3ZDtcXG4gICAgb3BhY2l0eTogMTtcXG59XFxuXFxuLmZvcm0tY29udHJvbDo6LW1vei1wbGFjZWhvbGRlciB7XFxuICAgIGNvbG9yOiAjNmM3NTdkO1xcbiAgICBvcGFjaXR5OiAxO1xcbn1cXG5cXG4uZm9ybS1jb250cm9sOi1tcy1pbnB1dC1wbGFjZWhvbGRlciB7XFxuICAgIGNvbG9yOiAjNmM3NTdkO1xcbiAgICBvcGFjaXR5OiAxO1xcbn1cXG5cXG4uZm9ybS1jb250cm9sOjotbXMtaW5wdXQtcGxhY2Vob2xkZXIge1xcbiAgICBjb2xvcjogIzZjNzU3ZDtcXG4gICAgb3BhY2l0eTogMTtcXG59XFxuXFxuLmZvcm0tY29udHJvbDo6cGxhY2Vob2xkZXIge1xcbiAgICBjb2xvcjogIzZjNzU3ZDtcXG4gICAgb3BhY2l0eTogMTtcXG59XFxuXFxuLmZvcm0tY29udHJvbDpkaXNhYmxlZCwgLmZvcm0tY29udHJvbFtyZWFkb25seV0ge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTllY2VmO1xcbiAgICBvcGFjaXR5OiAxO1xcbn1cXG5cXG5zZWxlY3QuZm9ybS1jb250cm9sOmZvY3VzOjotbXMtdmFsdWUge1xcbiAgICBjb2xvcjogIzQ5NTA1NztcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcXG59XFxuXFxuLmZvcm0tY29udHJvbC1maWxlLFxcbi5mb3JtLWNvbnRyb2wtcmFuZ2Uge1xcbiAgICBkaXNwbGF5OiBibG9jaztcXG4gICAgd2lkdGg6IDEwMCU7XFxufVxcbnRleHRhcmVhLmZvcm0tY29udHJvbCB7XFxuICAgIGhlaWdodDogYXV0bztcXG59XFxuJHRoZW1lLWNvbG9yczogKFxcbiAgJ3ByaW1hcnknOiAjM2Y1MWI1XFxuKTtcXG5cXG5cXG5AaW1wb3J0ICd+Ym9vdHN0cmFwL3Njc3MvYm9vdHN0cmFwJztcXG5cIixcIkBtaXhpbiBic0Jhbm5lcigkZmlsZSkge1xcbiAgLyohXFxuICAgKiBCb290c3RyYXAgI3skZmlsZX0gdjUuMy4yIChodHRwczovL2dldGJvb3RzdHJhcC5jb20vKVxcbiAgICogQ29weXJpZ2h0IDIwMTEtMjAyMyBUaGUgQm9vdHN0cmFwIEF1dGhvcnNcXG4gICAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxcbiAgICovXFxufVxcblwiLFwiOnJvb3QsXFxuW2RhdGEtYnMtdGhlbWU9XFxcImxpZ2h0XFxcIl0ge1xcbiAgLy8gTm90ZTogQ3VzdG9tIHZhcmlhYmxlIHZhbHVlcyBvbmx5IHN1cHBvcnQgU2Fzc1NjcmlwdCBpbnNpZGUgYCN7fWAuXFxuXFxuICAvLyBDb2xvcnNcXG4gIC8vXFxuICAvLyBHZW5lcmF0ZSBwYWxldHRlcyBmb3IgZnVsbCBjb2xvcnMsIGdyYXlzLCBhbmQgdGhlbWUgY29sb3JzLlxcblxcbiAgQGVhY2ggJGNvbG9yLCAkdmFsdWUgaW4gJGNvbG9ycyB7XFxuICAgIC0tI3skcHJlZml4fSN7JGNvbG9yfTogI3skdmFsdWV9O1xcbiAgfVxcblxcbiAgQGVhY2ggJGNvbG9yLCAkdmFsdWUgaW4gJGdyYXlzIHtcXG4gICAgLS0jeyRwcmVmaXh9Z3JheS0jeyRjb2xvcn06ICN7JHZhbHVlfTtcXG4gIH1cXG5cXG4gIEBlYWNoICRjb2xvciwgJHZhbHVlIGluICR0aGVtZS1jb2xvcnMge1xcbiAgICAtLSN7JHByZWZpeH0jeyRjb2xvcn06ICN7JHZhbHVlfTtcXG4gIH1cXG5cXG4gIEBlYWNoICRjb2xvciwgJHZhbHVlIGluICR0aGVtZS1jb2xvcnMtcmdiIHtcXG4gICAgLS0jeyRwcmVmaXh9I3skY29sb3J9LXJnYjogI3skdmFsdWV9O1xcbiAgfVxcblxcbiAgQGVhY2ggJGNvbG9yLCAkdmFsdWUgaW4gJHRoZW1lLWNvbG9ycy10ZXh0IHtcXG4gICAgLS0jeyRwcmVmaXh9I3skY29sb3J9LXRleHQtZW1waGFzaXM6ICN7JHZhbHVlfTtcXG4gIH1cXG5cXG4gIEBlYWNoICRjb2xvciwgJHZhbHVlIGluICR0aGVtZS1jb2xvcnMtYmctc3VidGxlIHtcXG4gICAgLS0jeyRwcmVmaXh9I3skY29sb3J9LWJnLXN1YnRsZTogI3skdmFsdWV9O1xcbiAgfVxcblxcbiAgQGVhY2ggJGNvbG9yLCAkdmFsdWUgaW4gJHRoZW1lLWNvbG9ycy1ib3JkZXItc3VidGxlIHtcXG4gICAgLS0jeyRwcmVmaXh9I3skY29sb3J9LWJvcmRlci1zdWJ0bGU6ICN7JHZhbHVlfTtcXG4gIH1cXG5cXG4gIC0tI3skcHJlZml4fXdoaXRlLXJnYjogI3t0by1yZ2IoJHdoaXRlKX07XFxuICAtLSN7JHByZWZpeH1ibGFjay1yZ2I6ICN7dG8tcmdiKCRibGFjayl9O1xcblxcbiAgLy8gRm9udHNcXG5cXG4gIC8vIE5vdGU6IFVzZSBgaW5zcGVjdGAgZm9yIGxpc3RzIHNvIHRoYXQgcXVvdGVkIGl0ZW1zIGtlZXAgdGhlIHF1b3Rlcy5cXG4gIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vc2Fzcy9zYXNzL2lzc3Vlcy8yMzgzI2lzc3VlY29tbWVudC0zMzYzNDkxNzJcXG4gIC0tI3skcHJlZml4fWZvbnQtc2Fucy1zZXJpZjogI3tpbnNwZWN0KCRmb250LWZhbWlseS1zYW5zLXNlcmlmKX07XFxuICAtLSN7JHByZWZpeH1mb250LW1vbm9zcGFjZTogI3tpbnNwZWN0KCRmb250LWZhbWlseS1tb25vc3BhY2UpfTtcXG4gIC0tI3skcHJlZml4fWdyYWRpZW50OiAjeyRncmFkaWVudH07XFxuXFxuICAvLyBSb290IGFuZCBib2R5XFxuICAvLyBzY3NzLWRvY3Mtc3RhcnQgcm9vdC1ib2R5LXZhcmlhYmxlc1xcbiAgQGlmICRmb250LXNpemUtcm9vdCAhPSBudWxsIHtcXG4gICAgLS0jeyRwcmVmaXh9cm9vdC1mb250LXNpemU6ICN7JGZvbnQtc2l6ZS1yb290fTtcXG4gIH1cXG4gIC0tI3skcHJlZml4fWJvZHktZm9udC1mYW1pbHk6ICN7aW5zcGVjdCgkZm9udC1mYW1pbHktYmFzZSl9O1xcbiAgQGluY2x1ZGUgcmZzKCRmb250LXNpemUtYmFzZSwgLS0jeyRwcmVmaXh9Ym9keS1mb250LXNpemUpO1xcbiAgLS0jeyRwcmVmaXh9Ym9keS1mb250LXdlaWdodDogI3skZm9udC13ZWlnaHQtYmFzZX07XFxuICAtLSN7JHByZWZpeH1ib2R5LWxpbmUtaGVpZ2h0OiAjeyRsaW5lLWhlaWdodC1iYXNlfTtcXG4gIEBpZiAkYm9keS10ZXh0LWFsaWduICE9IG51bGwge1xcbiAgICAtLSN7JHByZWZpeH1ib2R5LXRleHQtYWxpZ246ICN7JGJvZHktdGV4dC1hbGlnbn07XFxuICB9XFxuXFxuICAtLSN7JHByZWZpeH1ib2R5LWNvbG9yOiAjeyRib2R5LWNvbG9yfTtcXG4gIC0tI3skcHJlZml4fWJvZHktY29sb3ItcmdiOiAje3RvLXJnYigkYm9keS1jb2xvcil9O1xcbiAgLS0jeyRwcmVmaXh9Ym9keS1iZzogI3skYm9keS1iZ307XFxuICAtLSN7JHByZWZpeH1ib2R5LWJnLXJnYjogI3t0by1yZ2IoJGJvZHktYmcpfTtcXG5cXG4gIC0tI3skcHJlZml4fWVtcGhhc2lzLWNvbG9yOiAjeyRib2R5LWVtcGhhc2lzLWNvbG9yfTtcXG4gIC0tI3skcHJlZml4fWVtcGhhc2lzLWNvbG9yLXJnYjogI3t0by1yZ2IoJGJvZHktZW1waGFzaXMtY29sb3IpfTtcXG5cXG4gIC0tI3skcHJlZml4fXNlY29uZGFyeS1jb2xvcjogI3skYm9keS1zZWNvbmRhcnktY29sb3J9O1xcbiAgLS0jeyRwcmVmaXh9c2Vjb25kYXJ5LWNvbG9yLXJnYjogI3t0by1yZ2IoJGJvZHktc2Vjb25kYXJ5LWNvbG9yKX07XFxuICAtLSN7JHByZWZpeH1zZWNvbmRhcnktYmc6ICN7JGJvZHktc2Vjb25kYXJ5LWJnfTtcXG4gIC0tI3skcHJlZml4fXNlY29uZGFyeS1iZy1yZ2I6ICN7dG8tcmdiKCRib2R5LXNlY29uZGFyeS1iZyl9O1xcblxcbiAgLS0jeyRwcmVmaXh9dGVydGlhcnktY29sb3I6ICN7JGJvZHktdGVydGlhcnktY29sb3J9O1xcbiAgLS0jeyRwcmVmaXh9dGVydGlhcnktY29sb3ItcmdiOiAje3RvLXJnYigkYm9keS10ZXJ0aWFyeS1jb2xvcil9O1xcbiAgLS0jeyRwcmVmaXh9dGVydGlhcnktYmc6ICN7JGJvZHktdGVydGlhcnktYmd9O1xcbiAgLS0jeyRwcmVmaXh9dGVydGlhcnktYmctcmdiOiAje3RvLXJnYigkYm9keS10ZXJ0aWFyeS1iZyl9O1xcbiAgLy8gc2Nzcy1kb2NzLWVuZCByb290LWJvZHktdmFyaWFibGVzXFxuXFxuICAtLSN7JHByZWZpeH1oZWFkaW5nLWNvbG9yOiAjeyRoZWFkaW5ncy1jb2xvcn07XFxuXFxuICAtLSN7JHByZWZpeH1saW5rLWNvbG9yOiAjeyRsaW5rLWNvbG9yfTtcXG4gIC0tI3skcHJlZml4fWxpbmstY29sb3ItcmdiOiAje3RvLXJnYigkbGluay1jb2xvcil9O1xcbiAgLS0jeyRwcmVmaXh9bGluay1kZWNvcmF0aW9uOiAjeyRsaW5rLWRlY29yYXRpb259O1xcblxcbiAgLS0jeyRwcmVmaXh9bGluay1ob3Zlci1jb2xvcjogI3skbGluay1ob3Zlci1jb2xvcn07XFxuICAtLSN7JHByZWZpeH1saW5rLWhvdmVyLWNvbG9yLXJnYjogI3t0by1yZ2IoJGxpbmstaG92ZXItY29sb3IpfTtcXG5cXG4gIEBpZiAkbGluay1ob3Zlci1kZWNvcmF0aW9uICE9IG51bGwge1xcbiAgICAtLSN7JHByZWZpeH1saW5rLWhvdmVyLWRlY29yYXRpb246ICN7JGxpbmstaG92ZXItZGVjb3JhdGlvbn07XFxuICB9XFxuXFxuICAtLSN7JHByZWZpeH1jb2RlLWNvbG9yOiAjeyRjb2RlLWNvbG9yfTtcXG4gIC0tI3skcHJlZml4fWhpZ2hsaWdodC1jb2xvcjogI3skbWFyay1jb2xvcn07XFxuICAtLSN7JHByZWZpeH1oaWdobGlnaHQtYmc6ICN7JG1hcmstYmd9O1xcblxcbiAgLy8gc2Nzcy1kb2NzLXN0YXJ0IHJvb3QtYm9yZGVyLXZhclxcbiAgLS0jeyRwcmVmaXh9Ym9yZGVyLXdpZHRoOiAjeyRib3JkZXItd2lkdGh9O1xcbiAgLS0jeyRwcmVmaXh9Ym9yZGVyLXN0eWxlOiAjeyRib3JkZXItc3R5bGV9O1xcbiAgLS0jeyRwcmVmaXh9Ym9yZGVyLWNvbG9yOiAjeyRib3JkZXItY29sb3J9O1xcbiAgLS0jeyRwcmVmaXh9Ym9yZGVyLWNvbG9yLXRyYW5zbHVjZW50OiAjeyRib3JkZXItY29sb3ItdHJhbnNsdWNlbnR9O1xcblxcbiAgLS0jeyRwcmVmaXh9Ym9yZGVyLXJhZGl1czogI3skYm9yZGVyLXJhZGl1c307XFxuICAtLSN7JHByZWZpeH1ib3JkZXItcmFkaXVzLXNtOiAjeyRib3JkZXItcmFkaXVzLXNtfTtcXG4gIC0tI3skcHJlZml4fWJvcmRlci1yYWRpdXMtbGc6ICN7JGJvcmRlci1yYWRpdXMtbGd9O1xcbiAgLS0jeyRwcmVmaXh9Ym9yZGVyLXJhZGl1cy14bDogI3skYm9yZGVyLXJhZGl1cy14bH07XFxuICAtLSN7JHByZWZpeH1ib3JkZXItcmFkaXVzLXh4bDogI3skYm9yZGVyLXJhZGl1cy14eGx9O1xcbiAgLS0jeyRwcmVmaXh9Ym9yZGVyLXJhZGl1cy0yeGw6IHZhcigtLSN7JHByZWZpeH1ib3JkZXItcmFkaXVzLXh4bCk7IC8vIERlcHJlY2F0ZWQgaW4gdjUuMy4wIGZvciBjb25zaXN0ZW5jeVxcbiAgLS0jeyRwcmVmaXh9Ym9yZGVyLXJhZGl1cy1waWxsOiAjeyRib3JkZXItcmFkaXVzLXBpbGx9O1xcbiAgLy8gc2Nzcy1kb2NzLWVuZCByb290LWJvcmRlci12YXJcXG5cXG4gIC0tI3skcHJlZml4fWJveC1zaGFkb3c6ICN7JGJveC1zaGFkb3d9O1xcbiAgLS0jeyRwcmVmaXh9Ym94LXNoYWRvdy1zbTogI3skYm94LXNoYWRvdy1zbX07XFxuICAtLSN7JHByZWZpeH1ib3gtc2hhZG93LWxnOiAjeyRib3gtc2hhZG93LWxnfTtcXG4gIC0tI3skcHJlZml4fWJveC1zaGFkb3ctaW5zZXQ6ICN7JGJveC1zaGFkb3ctaW5zZXR9O1xcblxcbiAgLy8gRm9jdXMgc3R5bGVzXFxuICAvLyBzY3NzLWRvY3Mtc3RhcnQgcm9vdC1mb2N1cy12YXJpYWJsZXNcXG4gIC0tI3skcHJlZml4fWZvY3VzLXJpbmctd2lkdGg6ICN7JGZvY3VzLXJpbmctd2lkdGh9O1xcbiAgLS0jeyRwcmVmaXh9Zm9jdXMtcmluZy1vcGFjaXR5OiAjeyRmb2N1cy1yaW5nLW9wYWNpdHl9O1xcbiAgLS0jeyRwcmVmaXh9Zm9jdXMtcmluZy1jb2xvcjogI3skZm9jdXMtcmluZy1jb2xvcn07XFxuICAvLyBzY3NzLWRvY3MtZW5kIHJvb3QtZm9jdXMtdmFyaWFibGVzXFxuXFxuICAvLyBzY3NzLWRvY3Mtc3RhcnQgcm9vdC1mb3JtLXZhbGlkYXRpb24tdmFyaWFibGVzXFxuICAtLSN7JHByZWZpeH1mb3JtLXZhbGlkLWNvbG9yOiAjeyRmb3JtLXZhbGlkLWNvbG9yfTtcXG4gIC0tI3skcHJlZml4fWZvcm0tdmFsaWQtYm9yZGVyLWNvbG9yOiAjeyRmb3JtLXZhbGlkLWJvcmRlci1jb2xvcn07XFxuICAtLSN7JHByZWZpeH1mb3JtLWludmFsaWQtY29sb3I6ICN7JGZvcm0taW52YWxpZC1jb2xvcn07XFxuICAtLSN7JHByZWZpeH1mb3JtLWludmFsaWQtYm9yZGVyLWNvbG9yOiAjeyRmb3JtLWludmFsaWQtYm9yZGVyLWNvbG9yfTtcXG4gIC8vIHNjc3MtZG9jcy1lbmQgcm9vdC1mb3JtLXZhbGlkYXRpb24tdmFyaWFibGVzXFxufVxcblxcbkBpZiAkZW5hYmxlLWRhcmstbW9kZSB7XFxuICBAaW5jbHVkZSBjb2xvci1tb2RlKGRhcmssIHRydWUpIHtcXG4gICAgY29sb3Itc2NoZW1lOiBkYXJrO1xcblxcbiAgICAvLyBzY3NzLWRvY3Mtc3RhcnQgcm9vdC1kYXJrLW1vZGUtdmFyc1xcbiAgICAtLSN7JHByZWZpeH1ib2R5LWNvbG9yOiAjeyRib2R5LWNvbG9yLWRhcmt9O1xcbiAgICAtLSN7JHByZWZpeH1ib2R5LWNvbG9yLXJnYjogI3t0by1yZ2IoJGJvZHktY29sb3ItZGFyayl9O1xcbiAgICAtLSN7JHByZWZpeH1ib2R5LWJnOiAjeyRib2R5LWJnLWRhcmt9O1xcbiAgICAtLSN7JHByZWZpeH1ib2R5LWJnLXJnYjogI3t0by1yZ2IoJGJvZHktYmctZGFyayl9O1xcblxcbiAgICAtLSN7JHByZWZpeH1lbXBoYXNpcy1jb2xvcjogI3skYm9keS1lbXBoYXNpcy1jb2xvci1kYXJrfTtcXG4gICAgLS0jeyRwcmVmaXh9ZW1waGFzaXMtY29sb3ItcmdiOiAje3RvLXJnYigkYm9keS1lbXBoYXNpcy1jb2xvci1kYXJrKX07XFxuXFxuICAgIC0tI3skcHJlZml4fXNlY29uZGFyeS1jb2xvcjogI3skYm9keS1zZWNvbmRhcnktY29sb3ItZGFya307XFxuICAgIC0tI3skcHJlZml4fXNlY29uZGFyeS1jb2xvci1yZ2I6ICN7dG8tcmdiKCRib2R5LXNlY29uZGFyeS1jb2xvci1kYXJrKX07XFxuICAgIC0tI3skcHJlZml4fXNlY29uZGFyeS1iZzogI3skYm9keS1zZWNvbmRhcnktYmctZGFya307XFxuICAgIC0tI3skcHJlZml4fXNlY29uZGFyeS1iZy1yZ2I6ICN7dG8tcmdiKCRib2R5LXNlY29uZGFyeS1iZy1kYXJrKX07XFxuXFxuICAgIC0tI3skcHJlZml4fXRlcnRpYXJ5LWNvbG9yOiAjeyRib2R5LXRlcnRpYXJ5LWNvbG9yLWRhcmt9O1xcbiAgICAtLSN7JHByZWZpeH10ZXJ0aWFyeS1jb2xvci1yZ2I6ICN7dG8tcmdiKCRib2R5LXRlcnRpYXJ5LWNvbG9yLWRhcmspfTtcXG4gICAgLS0jeyRwcmVmaXh9dGVydGlhcnktYmc6ICN7JGJvZHktdGVydGlhcnktYmctZGFya307XFxuICAgIC0tI3skcHJlZml4fXRlcnRpYXJ5LWJnLXJnYjogI3t0by1yZ2IoJGJvZHktdGVydGlhcnktYmctZGFyayl9O1xcblxcbiAgICBAZWFjaCAkY29sb3IsICR2YWx1ZSBpbiAkdGhlbWUtY29sb3JzLXRleHQtZGFyayB7XFxuICAgICAgLS0jeyRwcmVmaXh9I3skY29sb3J9LXRleHQtZW1waGFzaXM6ICN7JHZhbHVlfTtcXG4gICAgfVxcblxcbiAgICBAZWFjaCAkY29sb3IsICR2YWx1ZSBpbiAkdGhlbWUtY29sb3JzLWJnLXN1YnRsZS1kYXJrIHtcXG4gICAgICAtLSN7JHByZWZpeH0jeyRjb2xvcn0tYmctc3VidGxlOiAjeyR2YWx1ZX07XFxuICAgIH1cXG5cXG4gICAgQGVhY2ggJGNvbG9yLCAkdmFsdWUgaW4gJHRoZW1lLWNvbG9ycy1ib3JkZXItc3VidGxlLWRhcmsge1xcbiAgICAgIC0tI3skcHJlZml4fSN7JGNvbG9yfS1ib3JkZXItc3VidGxlOiAjeyR2YWx1ZX07XFxuICAgIH1cXG5cXG4gICAgLS0jeyRwcmVmaXh9aGVhZGluZy1jb2xvcjogI3skaGVhZGluZ3MtY29sb3ItZGFya307XFxuXFxuICAgIC0tI3skcHJlZml4fWxpbmstY29sb3I6ICN7JGxpbmstY29sb3ItZGFya307XFxuICAgIC0tI3skcHJlZml4fWxpbmstaG92ZXItY29sb3I6ICN7JGxpbmstaG92ZXItY29sb3ItZGFya307XFxuICAgIC0tI3skcHJlZml4fWxpbmstY29sb3ItcmdiOiAje3RvLXJnYigkbGluay1jb2xvci1kYXJrKX07XFxuICAgIC0tI3skcHJlZml4fWxpbmstaG92ZXItY29sb3ItcmdiOiAje3RvLXJnYigkbGluay1ob3Zlci1jb2xvci1kYXJrKX07XFxuXFxuICAgIC0tI3skcHJlZml4fWNvZGUtY29sb3I6ICN7JGNvZGUtY29sb3ItZGFya307XFxuICAgIC0tI3skcHJlZml4fWhpZ2hsaWdodC1jb2xvcjogI3skbWFyay1jb2xvci1kYXJrfTtcXG4gICAgLS0jeyRwcmVmaXh9aGlnaGxpZ2h0LWJnOiAjeyRtYXJrLWJnLWRhcmt9O1xcblxcbiAgICAtLSN7JHByZWZpeH1ib3JkZXItY29sb3I6ICN7JGJvcmRlci1jb2xvci1kYXJrfTtcXG4gICAgLS0jeyRwcmVmaXh9Ym9yZGVyLWNvbG9yLXRyYW5zbHVjZW50OiAjeyRib3JkZXItY29sb3ItdHJhbnNsdWNlbnQtZGFya307XFxuXFxuICAgIC0tI3skcHJlZml4fWZvcm0tdmFsaWQtY29sb3I6ICN7JGZvcm0tdmFsaWQtY29sb3ItZGFya307XFxuICAgIC0tI3skcHJlZml4fWZvcm0tdmFsaWQtYm9yZGVyLWNvbG9yOiAjeyRmb3JtLXZhbGlkLWJvcmRlci1jb2xvci1kYXJrfTtcXG4gICAgLS0jeyRwcmVmaXh9Zm9ybS1pbnZhbGlkLWNvbG9yOiAjeyRmb3JtLWludmFsaWQtY29sb3ItZGFya307XFxuICAgIC0tI3skcHJlZml4fWZvcm0taW52YWxpZC1ib3JkZXItY29sb3I6ICN7JGZvcm0taW52YWxpZC1ib3JkZXItY29sb3ItZGFya307XFxuICAgIC8vIHNjc3MtZG9jcy1lbmQgcm9vdC1kYXJrLW1vZGUtdmFyc1xcbiAgfVxcbn1cXG5cIixcIi8vIHN0eWxlbGludC1kaXNhYmxlIHNjc3MvZGltZW5zaW9uLW5vLW5vbi1udW1lcmljLXZhbHVlc1xcblxcbi8vIFNDU1MgUkZTIG1peGluXFxuLy9cXG4vLyBBdXRvbWF0ZWQgcmVzcG9uc2l2ZSB2YWx1ZXMgZm9yIGZvbnQgc2l6ZXMsIHBhZGRpbmdzLCBtYXJnaW5zIGFuZCBtdWNoIG1vcmVcXG4vL1xcbi8vIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvcmZzL2Jsb2IvbWFpbi9MSUNFTlNFKVxcblxcbi8vIENvbmZpZ3VyYXRpb25cXG5cXG4vLyBCYXNlIHZhbHVlXFxuJHJmcy1iYXNlLXZhbHVlOiAxLjI1cmVtICFkZWZhdWx0O1xcbiRyZnMtdW5pdDogcmVtICFkZWZhdWx0O1xcblxcbkBpZiAkcmZzLXVuaXQgIT0gcmVtIGFuZCAkcmZzLXVuaXQgIT0gcHgge1xcbiAgQGVycm9yIFxcXCJgI3skcmZzLXVuaXR9YCBpcyBub3QgYSB2YWxpZCB1bml0IGZvciAkcmZzLXVuaXQuIFVzZSBgcHhgIG9yIGByZW1gLlxcXCI7XFxufVxcblxcbi8vIEJyZWFrcG9pbnQgYXQgd2hlcmUgdmFsdWVzIHN0YXJ0IGRlY3JlYXNpbmcgaWYgc2NyZWVuIHdpZHRoIGlzIHNtYWxsZXJcXG4kcmZzLWJyZWFrcG9pbnQ6IDEyMDBweCAhZGVmYXVsdDtcXG4kcmZzLWJyZWFrcG9pbnQtdW5pdDogcHggIWRlZmF1bHQ7XFxuXFxuQGlmICRyZnMtYnJlYWtwb2ludC11bml0ICE9IHB4IGFuZCAkcmZzLWJyZWFrcG9pbnQtdW5pdCAhPSBlbSBhbmQgJHJmcy1icmVha3BvaW50LXVuaXQgIT0gcmVtIHtcXG4gIEBlcnJvciBcXFwiYCN7JHJmcy1icmVha3BvaW50LXVuaXR9YCBpcyBub3QgYSB2YWxpZCB1bml0IGZvciAkcmZzLWJyZWFrcG9pbnQtdW5pdC4gVXNlIGBweGAsIGBlbWAgb3IgYHJlbWAuXFxcIjtcXG59XFxuXFxuLy8gUmVzaXplIHZhbHVlcyBiYXNlZCBvbiBzY3JlZW4gaGVpZ2h0IGFuZCB3aWR0aFxcbiRyZnMtdHdvLWRpbWVuc2lvbmFsOiBmYWxzZSAhZGVmYXVsdDtcXG5cXG4vLyBGYWN0b3Igb2YgZGVjcmVhc2VcXG4kcmZzLWZhY3RvcjogMTAgIWRlZmF1bHQ7XFxuXFxuQGlmIHR5cGUtb2YoJHJmcy1mYWN0b3IpICE9IG51bWJlciBvciAkcmZzLWZhY3RvciA8PSAxIHtcXG4gIEBlcnJvciBcXFwiYCN7JHJmcy1mYWN0b3J9YCBpcyBub3QgYSB2YWxpZCAgJHJmcy1mYWN0b3IsIGl0IG11c3QgYmUgZ3JlYXRlciB0aGFuIDEuXFxcIjtcXG59XFxuXFxuLy8gTW9kZS4gUG9zc2liaWxpdGllczogXFxcIm1pbi1tZWRpYS1xdWVyeVxcXCIsIFxcXCJtYXgtbWVkaWEtcXVlcnlcXFwiXFxuJHJmcy1tb2RlOiBtaW4tbWVkaWEtcXVlcnkgIWRlZmF1bHQ7XFxuXFxuLy8gR2VuZXJhdGUgZW5hYmxlIG9yIGRpc2FibGUgY2xhc3Nlcy4gUG9zc2liaWxpdGllczogZmFsc2UsIFxcXCJlbmFibGVcXFwiIG9yIFxcXCJkaXNhYmxlXFxcIlxcbiRyZnMtY2xhc3M6IGZhbHNlICFkZWZhdWx0O1xcblxcbi8vIDEgcmVtID0gJHJmcy1yZW0tdmFsdWUgcHhcXG4kcmZzLXJlbS12YWx1ZTogMTYgIWRlZmF1bHQ7XFxuXFxuLy8gU2FmYXJpIGlmcmFtZSByZXNpemUgYnVnOiBodHRwczovL2dpdGh1Yi5jb20vdHdicy9yZnMvaXNzdWVzLzE0XFxuJHJmcy1zYWZhcmktaWZyYW1lLXJlc2l6ZS1idWctZml4OiBmYWxzZSAhZGVmYXVsdDtcXG5cXG4vLyBEaXNhYmxlIFJGUyBieSBzZXR0aW5nICRlbmFibGUtcmZzIHRvIGZhbHNlXFxuJGVuYWJsZS1yZnM6IHRydWUgIWRlZmF1bHQ7XFxuXFxuLy8gQ2FjaGUgJHJmcy1iYXNlLXZhbHVlIHVuaXRcXG4kcmZzLWJhc2UtdmFsdWUtdW5pdDogdW5pdCgkcmZzLWJhc2UtdmFsdWUpO1xcblxcbkBmdW5jdGlvbiBkaXZpZGUoJGRpdmlkZW5kLCAkZGl2aXNvciwgJHByZWNpc2lvbjogMTApIHtcXG4gICRzaWduOiBpZigkZGl2aWRlbmQgPiAwIGFuZCAkZGl2aXNvciA+IDAgb3IgJGRpdmlkZW5kIDwgMCBhbmQgJGRpdmlzb3IgPCAwLCAxLCAtMSk7XFxuICAkZGl2aWRlbmQ6IGFicygkZGl2aWRlbmQpO1xcbiAgJGRpdmlzb3I6IGFicygkZGl2aXNvcik7XFxuICBAaWYgJGRpdmlkZW5kID09IDAge1xcbiAgICBAcmV0dXJuIDA7XFxuICB9XFxuICBAaWYgJGRpdmlzb3IgPT0gMCB7XFxuICAgIEBlcnJvciBcXFwiQ2Fubm90IGRpdmlkZSBieSAwXFxcIjtcXG4gIH1cXG4gICRyZW1haW5kZXI6ICRkaXZpZGVuZDtcXG4gICRyZXN1bHQ6IDA7XFxuICAkZmFjdG9yOiAxMDtcXG4gIEB3aGlsZSAoJHJlbWFpbmRlciA+IDAgYW5kICRwcmVjaXNpb24gPj0gMCkge1xcbiAgICAkcXVvdGllbnQ6IDA7XFxuICAgIEB3aGlsZSAoJHJlbWFpbmRlciA+PSAkZGl2aXNvcikge1xcbiAgICAgICRyZW1haW5kZXI6ICRyZW1haW5kZXIgLSAkZGl2aXNvcjtcXG4gICAgICAkcXVvdGllbnQ6ICRxdW90aWVudCArIDE7XFxuICAgIH1cXG4gICAgJHJlc3VsdDogJHJlc3VsdCAqIDEwICsgJHF1b3RpZW50O1xcbiAgICAkZmFjdG9yOiAkZmFjdG9yICogLjE7XFxuICAgICRyZW1haW5kZXI6ICRyZW1haW5kZXIgKiAxMDtcXG4gICAgJHByZWNpc2lvbjogJHByZWNpc2lvbiAtIDE7XFxuICAgIEBpZiAoJHByZWNpc2lvbiA8IDAgYW5kICRyZW1haW5kZXIgPj0gJGRpdmlzb3IgKiA1KSB7XFxuICAgICAgJHJlc3VsdDogJHJlc3VsdCArIDE7XFxuICAgIH1cXG4gIH1cXG4gICRyZXN1bHQ6ICRyZXN1bHQgKiAkZmFjdG9yICogJHNpZ247XFxuICAkZGl2aWRlbmQtdW5pdDogdW5pdCgkZGl2aWRlbmQpO1xcbiAgJGRpdmlzb3ItdW5pdDogdW5pdCgkZGl2aXNvcik7XFxuICAkdW5pdC1tYXA6IChcXG4gICAgXFxcInB4XFxcIjogMXB4LFxcbiAgICBcXFwicmVtXFxcIjogMXJlbSxcXG4gICAgXFxcImVtXFxcIjogMWVtLFxcbiAgICBcXFwiJVxcXCI6IDElXFxuICApO1xcbiAgQGlmICgkZGl2aWRlbmQtdW5pdCAhPSAkZGl2aXNvci11bml0IGFuZCBtYXAtaGFzLWtleSgkdW5pdC1tYXAsICRkaXZpZGVuZC11bml0KSkge1xcbiAgICAkcmVzdWx0OiAkcmVzdWx0ICogbWFwLWdldCgkdW5pdC1tYXAsICRkaXZpZGVuZC11bml0KTtcXG4gIH1cXG4gIEByZXR1cm4gJHJlc3VsdDtcXG59XFxuXFxuLy8gUmVtb3ZlIHB4LXVuaXQgZnJvbSAkcmZzLWJhc2UtdmFsdWUgZm9yIGNhbGN1bGF0aW9uc1xcbkBpZiAkcmZzLWJhc2UtdmFsdWUtdW5pdCA9PSBweCB7XFxuICAkcmZzLWJhc2UtdmFsdWU6IGRpdmlkZSgkcmZzLWJhc2UtdmFsdWUsICRyZnMtYmFzZS12YWx1ZSAqIDAgKyAxKTtcXG59XFxuQGVsc2UgaWYgJHJmcy1iYXNlLXZhbHVlLXVuaXQgPT0gcmVtIHtcXG4gICRyZnMtYmFzZS12YWx1ZTogZGl2aWRlKCRyZnMtYmFzZS12YWx1ZSwgZGl2aWRlKCRyZnMtYmFzZS12YWx1ZSAqIDAgKyAxLCAkcmZzLXJlbS12YWx1ZSkpO1xcbn1cXG5cXG4vLyBDYWNoZSAkcmZzLWJyZWFrcG9pbnQgdW5pdCB0byBwcmV2ZW50IG11bHRpcGxlIGNhbGxzXFxuJHJmcy1icmVha3BvaW50LXVuaXQtY2FjaGU6IHVuaXQoJHJmcy1icmVha3BvaW50KTtcXG5cXG4vLyBSZW1vdmUgdW5pdCBmcm9tICRyZnMtYnJlYWtwb2ludCBmb3IgY2FsY3VsYXRpb25zXFxuQGlmICRyZnMtYnJlYWtwb2ludC11bml0LWNhY2hlID09IHB4IHtcXG4gICRyZnMtYnJlYWtwb2ludDogZGl2aWRlKCRyZnMtYnJlYWtwb2ludCwgJHJmcy1icmVha3BvaW50ICogMCArIDEpO1xcbn1cXG5AZWxzZSBpZiAkcmZzLWJyZWFrcG9pbnQtdW5pdC1jYWNoZSA9PSByZW0gb3IgJHJmcy1icmVha3BvaW50LXVuaXQtY2FjaGUgPT0gXFxcImVtXFxcIiB7XFxuICAkcmZzLWJyZWFrcG9pbnQ6IGRpdmlkZSgkcmZzLWJyZWFrcG9pbnQsIGRpdmlkZSgkcmZzLWJyZWFrcG9pbnQgKiAwICsgMSwgJHJmcy1yZW0tdmFsdWUpKTtcXG59XFxuXFxuLy8gQ2FsY3VsYXRlIHRoZSBtZWRpYSBxdWVyeSB2YWx1ZVxcbiRyZnMtbXEtdmFsdWU6IGlmKCRyZnMtYnJlYWtwb2ludC11bml0ID09IHB4LCAjeyRyZnMtYnJlYWtwb2ludH1weCwgI3tkaXZpZGUoJHJmcy1icmVha3BvaW50LCAkcmZzLXJlbS12YWx1ZSl9I3skcmZzLWJyZWFrcG9pbnQtdW5pdH0pO1xcbiRyZnMtbXEtcHJvcGVydHktd2lkdGg6IGlmKCRyZnMtbW9kZSA9PSBtYXgtbWVkaWEtcXVlcnksIG1heC13aWR0aCwgbWluLXdpZHRoKTtcXG4kcmZzLW1xLXByb3BlcnR5LWhlaWdodDogaWYoJHJmcy1tb2RlID09IG1heC1tZWRpYS1xdWVyeSwgbWF4LWhlaWdodCwgbWluLWhlaWdodCk7XFxuXFxuLy8gSW50ZXJuYWwgbWl4aW4gdXNlZCB0byBkZXRlcm1pbmUgd2hpY2ggbWVkaWEgcXVlcnkgbmVlZHMgdG8gYmUgdXNlZFxcbkBtaXhpbiBfcmZzLW1lZGlhLXF1ZXJ5IHtcXG4gIEBpZiAkcmZzLXR3by1kaW1lbnNpb25hbCB7XFxuICAgIEBpZiAkcmZzLW1vZGUgPT0gbWF4LW1lZGlhLXF1ZXJ5IHtcXG4gICAgICBAbWVkaWEgKCN7JHJmcy1tcS1wcm9wZXJ0eS13aWR0aH06ICN7JHJmcy1tcS12YWx1ZX0pLCAoI3skcmZzLW1xLXByb3BlcnR5LWhlaWdodH06ICN7JHJmcy1tcS12YWx1ZX0pIHtcXG4gICAgICAgIEBjb250ZW50O1xcbiAgICAgIH1cXG4gICAgfVxcbiAgICBAZWxzZSB7XFxuICAgICAgQG1lZGlhICgjeyRyZnMtbXEtcHJvcGVydHktd2lkdGh9OiAjeyRyZnMtbXEtdmFsdWV9KSBhbmQgKCN7JHJmcy1tcS1wcm9wZXJ0eS1oZWlnaHR9OiAjeyRyZnMtbXEtdmFsdWV9KSB7XFxuICAgICAgICBAY29udGVudDtcXG4gICAgICB9XFxuICAgIH1cXG4gIH1cXG4gIEBlbHNlIHtcXG4gICAgQG1lZGlhICgjeyRyZnMtbXEtcHJvcGVydHktd2lkdGh9OiAjeyRyZnMtbXEtdmFsdWV9KSB7XFxuICAgICAgQGNvbnRlbnQ7XFxuICAgIH1cXG4gIH1cXG59XFxuXFxuLy8gSW50ZXJuYWwgbWl4aW4gdGhhdCBhZGRzIGRpc2FibGUgY2xhc3NlcyB0byB0aGUgc2VsZWN0b3IgaWYgbmVlZGVkLlxcbkBtaXhpbiBfcmZzLXJ1bGUge1xcbiAgQGlmICRyZnMtY2xhc3MgPT0gZGlzYWJsZSBhbmQgJHJmcy1tb2RlID09IG1heC1tZWRpYS1xdWVyeSB7XFxuICAgIC8vIEFkZGluZyBhbiBleHRyYSBjbGFzcyBpbmNyZWFzZXMgc3BlY2lmaWNpdHksIHdoaWNoIHByZXZlbnRzIHRoZSBtZWRpYSBxdWVyeSB0byBvdmVycmlkZSB0aGUgcHJvcGVydHlcXG4gICAgJixcXG4gICAgLmRpc2FibGUtcmZzICYsXFxuICAgICYuZGlzYWJsZS1yZnMge1xcbiAgICAgIEBjb250ZW50O1xcbiAgICB9XFxuICB9XFxuICBAZWxzZSBpZiAkcmZzLWNsYXNzID09IGVuYWJsZSBhbmQgJHJmcy1tb2RlID09IG1pbi1tZWRpYS1xdWVyeSB7XFxuICAgIC5lbmFibGUtcmZzICYsXFxuICAgICYuZW5hYmxlLXJmcyB7XFxuICAgICAgQGNvbnRlbnQ7XFxuICAgIH1cXG4gIH0gQGVsc2Uge1xcbiAgICBAY29udGVudDtcXG4gIH1cXG59XFxuXFxuLy8gSW50ZXJuYWwgbWl4aW4gdGhhdCBhZGRzIGVuYWJsZSBjbGFzc2VzIHRvIHRoZSBzZWxlY3RvciBpZiBuZWVkZWQuXFxuQG1peGluIF9yZnMtbWVkaWEtcXVlcnktcnVsZSB7XFxuXFxuICBAaWYgJHJmcy1jbGFzcyA9PSBlbmFibGUge1xcbiAgICBAaWYgJHJmcy1tb2RlID09IG1pbi1tZWRpYS1xdWVyeSB7XFxuICAgICAgQGNvbnRlbnQ7XFxuICAgIH1cXG5cXG4gICAgQGluY2x1ZGUgX3Jmcy1tZWRpYS1xdWVyeSAoKSB7XFxuICAgICAgLmVuYWJsZS1yZnMgJixcXG4gICAgICAmLmVuYWJsZS1yZnMge1xcbiAgICAgICAgQGNvbnRlbnQ7XFxuICAgICAgfVxcbiAgICB9XFxuICB9XFxuICBAZWxzZSB7XFxuICAgIEBpZiAkcmZzLWNsYXNzID09IGRpc2FibGUgYW5kICRyZnMtbW9kZSA9PSBtaW4tbWVkaWEtcXVlcnkge1xcbiAgICAgIC5kaXNhYmxlLXJmcyAmLFxcbiAgICAgICYuZGlzYWJsZS1yZnMge1xcbiAgICAgICAgQGNvbnRlbnQ7XFxuICAgICAgfVxcbiAgICB9XFxuICAgIEBpbmNsdWRlIF9yZnMtbWVkaWEtcXVlcnkgKCkge1xcbiAgICAgIEBjb250ZW50O1xcbiAgICB9XFxuICB9XFxufVxcblxcbi8vIEhlbHBlciBmdW5jdGlvbiB0byBnZXQgdGhlIGZvcm1hdHRlZCBub24tcmVzcG9uc2l2ZSB2YWx1ZVxcbkBmdW5jdGlvbiByZnMtdmFsdWUoJHZhbHVlcykge1xcbiAgLy8gQ29udmVydCB0byBsaXN0XFxuICAkdmFsdWVzOiBpZih0eXBlLW9mKCR2YWx1ZXMpICE9IGxpc3QsICgkdmFsdWVzLCksICR2YWx1ZXMpO1xcblxcbiAgJHZhbDogXFxcIlxcXCI7XFxuXFxuICAvLyBMb29wIG92ZXIgZWFjaCB2YWx1ZSBhbmQgY2FsY3VsYXRlIHZhbHVlXFxuICBAZWFjaCAkdmFsdWUgaW4gJHZhbHVlcyB7XFxuICAgIEBpZiAkdmFsdWUgPT0gMCB7XFxuICAgICAgJHZhbDogJHZhbCArIFxcXCIgMFxcXCI7XFxuICAgIH1cXG4gICAgQGVsc2Uge1xcbiAgICAgIC8vIENhY2hlICR2YWx1ZSB1bml0XFxuICAgICAgJHVuaXQ6IGlmKHR5cGUtb2YoJHZhbHVlKSA9PSBcXFwibnVtYmVyXFxcIiwgdW5pdCgkdmFsdWUpLCBmYWxzZSk7XFxuXFxuICAgICAgQGlmICR1bml0ID09IHB4IHtcXG4gICAgICAgIC8vIENvbnZlcnQgdG8gcmVtIGlmIG5lZWRlZFxcbiAgICAgICAgJHZhbDogJHZhbCArIFxcXCIgXFxcIiArIGlmKCRyZnMtdW5pdCA9PSByZW0sICN7ZGl2aWRlKCR2YWx1ZSwgJHZhbHVlICogMCArICRyZnMtcmVtLXZhbHVlKX1yZW0sICR2YWx1ZSk7XFxuICAgICAgfVxcbiAgICAgIEBlbHNlIGlmICR1bml0ID09IHJlbSB7XFxuICAgICAgICAvLyBDb252ZXJ0IHRvIHB4IGlmIG5lZWRlZFxcbiAgICAgICAgJHZhbDogJHZhbCArIFxcXCIgXFxcIiArIGlmKCRyZnMtdW5pdCA9PSBweCwgI3tkaXZpZGUoJHZhbHVlLCAkdmFsdWUgKiAwICsgMSkgKiAkcmZzLXJlbS12YWx1ZX1weCwgJHZhbHVlKTtcXG4gICAgICB9IEBlbHNlIHtcXG4gICAgICAgIC8vIElmICR2YWx1ZSBpc24ndCBhIG51bWJlciAobGlrZSBpbmhlcml0KSBvciAkdmFsdWUgaGFzIGEgdW5pdCAobm90IHB4IG9yIHJlbSwgbGlrZSAxLjVlbSkgb3IgJCBpcyAwLCBqdXN0IHByaW50IHRoZSB2YWx1ZVxcbiAgICAgICAgJHZhbDogJHZhbCArIFxcXCIgXFxcIiArICR2YWx1ZTtcXG4gICAgICB9XFxuICAgIH1cXG4gIH1cXG5cXG4gIC8vIFJlbW92ZSBmaXJzdCBzcGFjZVxcbiAgQHJldHVybiB1bnF1b3RlKHN0ci1zbGljZSgkdmFsLCAyKSk7XFxufVxcblxcbi8vIEhlbHBlciBmdW5jdGlvbiB0byBnZXQgdGhlIHJlc3BvbnNpdmUgdmFsdWUgY2FsY3VsYXRlZCBieSBSRlNcXG5AZnVuY3Rpb24gcmZzLWZsdWlkLXZhbHVlKCR2YWx1ZXMpIHtcXG4gIC8vIENvbnZlcnQgdG8gbGlzdFxcbiAgJHZhbHVlczogaWYodHlwZS1vZigkdmFsdWVzKSAhPSBsaXN0LCAoJHZhbHVlcywpLCAkdmFsdWVzKTtcXG5cXG4gICR2YWw6IFxcXCJcXFwiO1xcblxcbiAgLy8gTG9vcCBvdmVyIGVhY2ggdmFsdWUgYW5kIGNhbGN1bGF0ZSB2YWx1ZVxcbiAgQGVhY2ggJHZhbHVlIGluICR2YWx1ZXMge1xcbiAgICBAaWYgJHZhbHVlID09IDAge1xcbiAgICAgICR2YWw6ICR2YWwgKyBcXFwiIDBcXFwiO1xcbiAgICB9IEBlbHNlIHtcXG4gICAgICAvLyBDYWNoZSAkdmFsdWUgdW5pdFxcbiAgICAgICR1bml0OiBpZih0eXBlLW9mKCR2YWx1ZSkgPT0gXFxcIm51bWJlclxcXCIsIHVuaXQoJHZhbHVlKSwgZmFsc2UpO1xcblxcbiAgICAgIC8vIElmICR2YWx1ZSBpc24ndCBhIG51bWJlciAobGlrZSBpbmhlcml0KSBvciAkdmFsdWUgaGFzIGEgdW5pdCAobm90IHB4IG9yIHJlbSwgbGlrZSAxLjVlbSkgb3IgJCBpcyAwLCBqdXN0IHByaW50IHRoZSB2YWx1ZVxcbiAgICAgIEBpZiBub3QgJHVuaXQgb3IgJHVuaXQgIT0gcHggYW5kICR1bml0ICE9IHJlbSB7XFxuICAgICAgICAkdmFsOiAkdmFsICsgXFxcIiBcXFwiICsgJHZhbHVlO1xcbiAgICAgIH0gQGVsc2Uge1xcbiAgICAgICAgLy8gUmVtb3ZlIHVuaXQgZnJvbSAkdmFsdWUgZm9yIGNhbGN1bGF0aW9uc1xcbiAgICAgICAgJHZhbHVlOiBkaXZpZGUoJHZhbHVlLCAkdmFsdWUgKiAwICsgaWYoJHVuaXQgPT0gcHgsIDEsIGRpdmlkZSgxLCAkcmZzLXJlbS12YWx1ZSkpKTtcXG5cXG4gICAgICAgIC8vIE9ubHkgYWRkIHRoZSBtZWRpYSBxdWVyeSBpZiB0aGUgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIHRoZSBtaW5pbXVtIHZhbHVlXFxuICAgICAgICBAaWYgYWJzKCR2YWx1ZSkgPD0gJHJmcy1iYXNlLXZhbHVlIG9yIG5vdCAkZW5hYmxlLXJmcyB7XFxuICAgICAgICAgICR2YWw6ICR2YWwgKyBcXFwiIFxcXCIgKyBpZigkcmZzLXVuaXQgPT0gcmVtLCAje2RpdmlkZSgkdmFsdWUsICRyZnMtcmVtLXZhbHVlKX1yZW0sICN7JHZhbHVlfXB4KTtcXG4gICAgICAgIH1cXG4gICAgICAgIEBlbHNlIHtcXG4gICAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBtaW5pbXVtIHZhbHVlXFxuICAgICAgICAgICR2YWx1ZS1taW46ICRyZnMtYmFzZS12YWx1ZSArIGRpdmlkZShhYnMoJHZhbHVlKSAtICRyZnMtYmFzZS12YWx1ZSwgJHJmcy1mYWN0b3IpO1xcblxcbiAgICAgICAgICAvLyBDYWxjdWxhdGUgZGlmZmVyZW5jZSBiZXR3ZWVuICR2YWx1ZSBhbmQgdGhlIG1pbmltdW0gdmFsdWVcXG4gICAgICAgICAgJHZhbHVlLWRpZmY6IGFicygkdmFsdWUpIC0gJHZhbHVlLW1pbjtcXG5cXG4gICAgICAgICAgLy8gQmFzZSB2YWx1ZSBmb3JtYXR0aW5nXFxuICAgICAgICAgICRtaW4td2lkdGg6IGlmKCRyZnMtdW5pdCA9PSByZW0sICN7ZGl2aWRlKCR2YWx1ZS1taW4sICRyZnMtcmVtLXZhbHVlKX1yZW0sICN7JHZhbHVlLW1pbn1weCk7XFxuXFxuICAgICAgICAgIC8vIFVzZSBuZWdhdGl2ZSB2YWx1ZSBpZiBuZWVkZWRcXG4gICAgICAgICAgJG1pbi13aWR0aDogaWYoJHZhbHVlIDwgMCwgLSRtaW4td2lkdGgsICRtaW4td2lkdGgpO1xcblxcbiAgICAgICAgICAvLyBVc2UgYHZtaW5gIGlmIHR3by1kaW1lbnNpb25hbCBpcyBlbmFibGVkXFxuICAgICAgICAgICR2YXJpYWJsZS11bml0OiBpZigkcmZzLXR3by1kaW1lbnNpb25hbCwgdm1pbiwgdncpO1xcblxcbiAgICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIHZhcmlhYmxlIHdpZHRoIGJldHdlZW4gMCBhbmQgJHJmcy1icmVha3BvaW50XFxuICAgICAgICAgICR2YXJpYWJsZS13aWR0aDogI3tkaXZpZGUoJHZhbHVlLWRpZmYgKiAxMDAsICRyZnMtYnJlYWtwb2ludCl9I3skdmFyaWFibGUtdW5pdH07XFxuXFxuICAgICAgICAgIC8vIFJldHVybiB0aGUgY2FsY3VsYXRlZCB2YWx1ZVxcbiAgICAgICAgICAkdmFsOiAkdmFsICsgXFxcIiBjYWxjKFxcXCIgKyAkbWluLXdpZHRoICsgaWYoJHZhbHVlIDwgMCwgXFxcIiAtIFxcXCIsIFxcXCIgKyBcXFwiKSArICR2YXJpYWJsZS13aWR0aCArIFxcXCIpXFxcIjtcXG4gICAgICAgIH1cXG4gICAgICB9XFxuICAgIH1cXG4gIH1cXG5cXG4gIC8vIFJlbW92ZSBmaXJzdCBzcGFjZVxcbiAgQHJldHVybiB1bnF1b3RlKHN0ci1zbGljZSgkdmFsLCAyKSk7XFxufVxcblxcbi8vIFJGUyBtaXhpblxcbkBtaXhpbiByZnMoJHZhbHVlcywgJHByb3BlcnR5OiBmb250LXNpemUpIHtcXG4gIEBpZiAkdmFsdWVzICE9IG51bGwge1xcbiAgICAkdmFsOiByZnMtdmFsdWUoJHZhbHVlcyk7XFxuICAgICRmbHVpZC12YWw6IHJmcy1mbHVpZC12YWx1ZSgkdmFsdWVzKTtcXG5cXG4gICAgLy8gRG8gbm90IHByaW50IHRoZSBtZWRpYSBxdWVyeSBpZiByZXNwb25zaXZlICYgbm9uLXJlc3BvbnNpdmUgdmFsdWVzIGFyZSB0aGUgc2FtZVxcbiAgICBAaWYgJHZhbCA9PSAkZmx1aWQtdmFsIHtcXG4gICAgICAjeyRwcm9wZXJ0eX06ICR2YWw7XFxuICAgIH1cXG4gICAgQGVsc2Uge1xcbiAgICAgIEBpbmNsdWRlIF9yZnMtcnVsZSAoKSB7XFxuICAgICAgICAjeyRwcm9wZXJ0eX06IGlmKCRyZnMtbW9kZSA9PSBtYXgtbWVkaWEtcXVlcnksICR2YWwsICRmbHVpZC12YWwpO1xcblxcbiAgICAgICAgLy8gSW5jbHVkZSBzYWZhcmkgaWZyYW1lIHJlc2l6ZSBmaXggaWYgbmVlZGVkXFxuICAgICAgICBtaW4td2lkdGg6IGlmKCRyZnMtc2FmYXJpLWlmcmFtZS1yZXNpemUtYnVnLWZpeCwgKDAgKiAxdncpLCBudWxsKTtcXG4gICAgICB9XFxuXFxuICAgICAgQGluY2x1ZGUgX3Jmcy1tZWRpYS1xdWVyeS1ydWxlICgpIHtcXG4gICAgICAgICN7JHByb3BlcnR5fTogaWYoJHJmcy1tb2RlID09IG1heC1tZWRpYS1xdWVyeSwgJGZsdWlkLXZhbCwgJHZhbCk7XFxuICAgICAgfVxcbiAgICB9XFxuICB9XFxufVxcblxcbi8vIFNob3J0aGFuZCBoZWxwZXIgbWl4aW5zXFxuQG1peGluIGZvbnQtc2l6ZSgkdmFsdWUpIHtcXG4gIEBpbmNsdWRlIHJmcygkdmFsdWUpO1xcbn1cXG5cXG5AbWl4aW4gcGFkZGluZygkdmFsdWUpIHtcXG4gIEBpbmNsdWRlIHJmcygkdmFsdWUsIHBhZGRpbmcpO1xcbn1cXG5cXG5AbWl4aW4gcGFkZGluZy10b3AoJHZhbHVlKSB7XFxuICBAaW5jbHVkZSByZnMoJHZhbHVlLCBwYWRkaW5nLXRvcCk7XFxufVxcblxcbkBtaXhpbiBwYWRkaW5nLXJpZ2h0KCR2YWx1ZSkge1xcbiAgQGluY2x1ZGUgcmZzKCR2YWx1ZSwgcGFkZGluZy1yaWdodCk7XFxufVxcblxcbkBtaXhpbiBwYWRkaW5nLWJvdHRvbSgkdmFsdWUpIHtcXG4gIEBpbmNsdWRlIHJmcygkdmFsdWUsIHBhZGRpbmctYm90dG9tKTtcXG59XFxuXFxuQG1peGluIHBhZGRpbmctbGVmdCgkdmFsdWUpIHtcXG4gIEBpbmNsdWRlIHJmcygkdmFsdWUsIHBhZGRpbmctbGVmdCk7XFxufVxcblxcbkBtaXhpbiBtYXJnaW4oJHZhbHVlKSB7XFxuICBAaW5jbHVkZSByZnMoJHZhbHVlLCBtYXJnaW4pO1xcbn1cXG5cXG5AbWl4aW4gbWFyZ2luLXRvcCgkdmFsdWUpIHtcXG4gIEBpbmNsdWRlIHJmcygkdmFsdWUsIG1hcmdpbi10b3ApO1xcbn1cXG5cXG5AbWl4aW4gbWFyZ2luLXJpZ2h0KCR2YWx1ZSkge1xcbiAgQGluY2x1ZGUgcmZzKCR2YWx1ZSwgbWFyZ2luLXJpZ2h0KTtcXG59XFxuXFxuQG1peGluIG1hcmdpbi1ib3R0b20oJHZhbHVlKSB7XFxuICBAaW5jbHVkZSByZnMoJHZhbHVlLCBtYXJnaW4tYm90dG9tKTtcXG59XFxuXFxuQG1peGluIG1hcmdpbi1sZWZ0KCR2YWx1ZSkge1xcbiAgQGluY2x1ZGUgcmZzKCR2YWx1ZSwgbWFyZ2luLWxlZnQpO1xcbn1cXG5cIixcIi8vIHN0eWxlbGludC1kaXNhYmxlIGRlY2xhcmF0aW9uLW5vLWltcG9ydGFudCwgc2VsZWN0b3Itbm8tcXVhbGlmeWluZy10eXBlLCBwcm9wZXJ0eS1uby12ZW5kb3ItcHJlZml4XFxuXFxuXFxuLy8gUmVib290XFxuLy9cXG4vLyBOb3JtYWxpemF0aW9uIG9mIEhUTUwgZWxlbWVudHMsIG1hbnVhbGx5IGZvcmtlZCBmcm9tIE5vcm1hbGl6ZS5jc3MgdG8gcmVtb3ZlXFxuLy8gc3R5bGVzIHRhcmdldGluZyBpcnJlbGV2YW50IGJyb3dzZXJzIHdoaWxlIGFwcGx5aW5nIG5ldyBzdHlsZXMuXFxuLy9cXG4vLyBOb3JtYWxpemUgaXMgbGljZW5zZWQgTUlULiBodHRwczovL2dpdGh1Yi5jb20vbmVjb2xhcy9ub3JtYWxpemUuY3NzXFxuXFxuXFxuLy8gRG9jdW1lbnRcXG4vL1xcbi8vIENoYW5nZSBmcm9tIGBib3gtc2l6aW5nOiBjb250ZW50LWJveGAgc28gdGhhdCBgd2lkdGhgIGlzIG5vdCBhZmZlY3RlZCBieSBgcGFkZGluZ2Agb3IgYGJvcmRlcmAuXFxuXFxuKixcXG4qOjpiZWZvcmUsXFxuKjo6YWZ0ZXIge1xcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG59XFxuXFxuXFxuLy8gUm9vdFxcbi8vXFxuLy8gQWJpbGl0eSB0byB0aGUgdmFsdWUgb2YgdGhlIHJvb3QgZm9udCBzaXplcywgYWZmZWN0aW5nIHRoZSB2YWx1ZSBvZiBgcmVtYC5cXG4vLyBudWxsIGJ5IGRlZmF1bHQsIHRodXMgbm90aGluZyBpcyBnZW5lcmF0ZWQuXFxuXFxuOnJvb3Qge1xcbiAgQGlmICRmb250LXNpemUtcm9vdCAhPSBudWxsIHtcXG4gICAgQGluY2x1ZGUgZm9udC1zaXplKHZhcigtLSN7JHByZWZpeH1yb290LWZvbnQtc2l6ZSkpO1xcbiAgfVxcblxcbiAgQGlmICRlbmFibGUtc21vb3RoLXNjcm9sbCB7XFxuICAgIEBtZWRpYSAocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogbm8tcHJlZmVyZW5jZSkge1xcbiAgICAgIHNjcm9sbC1iZWhhdmlvcjogc21vb3RoO1xcbiAgICB9XFxuICB9XFxufVxcblxcblxcbi8vIEJvZHlcXG4vL1xcbi8vIDEuIFJlbW92ZSB0aGUgbWFyZ2luIGluIGFsbCBicm93c2Vycy5cXG4vLyAyLiBBcyBhIGJlc3QgcHJhY3RpY2UsIGFwcGx5IGEgZGVmYXVsdCBgYmFja2dyb3VuZC1jb2xvcmAuXFxuLy8gMy4gUHJldmVudCBhZGp1c3RtZW50cyBvZiBmb250IHNpemUgYWZ0ZXIgb3JpZW50YXRpb24gY2hhbmdlcyBpbiBpT1MuXFxuLy8gNC4gQ2hhbmdlIHRoZSBkZWZhdWx0IHRhcCBoaWdobGlnaHQgdG8gYmUgY29tcGxldGVseSB0cmFuc3BhcmVudCBpbiBpT1MuXFxuXFxuLy8gc2Nzcy1kb2NzLXN0YXJ0IHJlYm9vdC1ib2R5LXJ1bGVzXFxuYm9keSB7XFxuICBtYXJnaW46IDA7IC8vIDFcXG4gIGZvbnQtZmFtaWx5OiB2YXIoLS0jeyRwcmVmaXh9Ym9keS1mb250LWZhbWlseSk7XFxuICBAaW5jbHVkZSBmb250LXNpemUodmFyKC0tI3skcHJlZml4fWJvZHktZm9udC1zaXplKSk7XFxuICBmb250LXdlaWdodDogdmFyKC0tI3skcHJlZml4fWJvZHktZm9udC13ZWlnaHQpO1xcbiAgbGluZS1oZWlnaHQ6IHZhcigtLSN7JHByZWZpeH1ib2R5LWxpbmUtaGVpZ2h0KTtcXG4gIGNvbG9yOiB2YXIoLS0jeyRwcmVmaXh9Ym9keS1jb2xvcik7XFxuICB0ZXh0LWFsaWduOiB2YXIoLS0jeyRwcmVmaXh9Ym9keS10ZXh0LWFsaWduKTtcXG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLSN7JHByZWZpeH1ib2R5LWJnKTsgLy8gMlxcbiAgLXdlYmtpdC10ZXh0LXNpemUtYWRqdXN0OiAxMDAlOyAvLyAzXFxuICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHJnYmEoJGJsYWNrLCAwKTsgLy8gNFxcbn1cXG4vLyBzY3NzLWRvY3MtZW5kIHJlYm9vdC1ib2R5LXJ1bGVzXFxuXFxuXFxuLy8gQ29udGVudCBncm91cGluZ1xcbi8vXFxuLy8gMS4gUmVzZXQgRmlyZWZveCdzIGdyYXkgY29sb3JcXG5cXG5ociB7XFxuICBtYXJnaW46ICRoci1tYXJnaW4teSAwO1xcbiAgY29sb3I6ICRoci1jb2xvcjsgLy8gMVxcbiAgYm9yZGVyOiAwO1xcbiAgYm9yZGVyLXRvcDogJGhyLWJvcmRlci13aWR0aCBzb2xpZCAkaHItYm9yZGVyLWNvbG9yO1xcbiAgb3BhY2l0eTogJGhyLW9wYWNpdHk7XFxufVxcblxcblxcbi8vIFR5cG9ncmFwaHlcXG4vL1xcbi8vIDEuIFJlbW92ZSB0b3AgbWFyZ2lucyBmcm9tIGhlYWRpbmdzXFxuLy8gICAgQnkgZGVmYXVsdCwgYDxoMT5gLWA8aDY+YCBhbGwgcmVjZWl2ZSB0b3AgYW5kIGJvdHRvbSBtYXJnaW5zLiBXZSBudWtlIHRoZSB0b3BcXG4vLyAgICBtYXJnaW4gZm9yIGVhc2llciBjb250cm9sIHdpdGhpbiB0eXBlIHNjYWxlcyBhcyBpdCBhdm9pZHMgbWFyZ2luIGNvbGxhcHNpbmcuXFxuXFxuJWhlYWRpbmcge1xcbiAgbWFyZ2luLXRvcDogMDsgLy8gMVxcbiAgbWFyZ2luLWJvdHRvbTogJGhlYWRpbmdzLW1hcmdpbi1ib3R0b207XFxuICBmb250LWZhbWlseTogJGhlYWRpbmdzLWZvbnQtZmFtaWx5O1xcbiAgZm9udC1zdHlsZTogJGhlYWRpbmdzLWZvbnQtc3R5bGU7XFxuICBmb250LXdlaWdodDogJGhlYWRpbmdzLWZvbnQtd2VpZ2h0O1xcbiAgbGluZS1oZWlnaHQ6ICRoZWFkaW5ncy1saW5lLWhlaWdodDtcXG4gIGNvbG9yOiB2YXIoLS0jeyRwcmVmaXh9aGVhZGluZy1jb2xvcik7XFxufVxcblxcbmgxIHtcXG4gIEBleHRlbmQgJWhlYWRpbmc7XFxuICBAaW5jbHVkZSBmb250LXNpemUoJGgxLWZvbnQtc2l6ZSk7XFxufVxcblxcbmgyIHtcXG4gIEBleHRlbmQgJWhlYWRpbmc7XFxuICBAaW5jbHVkZSBmb250LXNpemUoJGgyLWZvbnQtc2l6ZSk7XFxufVxcblxcbmgzIHtcXG4gIEBleHRlbmQgJWhlYWRpbmc7XFxuICBAaW5jbHVkZSBmb250LXNpemUoJGgzLWZvbnQtc2l6ZSk7XFxufVxcblxcbmg0IHtcXG4gIEBleHRlbmQgJWhlYWRpbmc7XFxuICBAaW5jbHVkZSBmb250LXNpemUoJGg0LWZvbnQtc2l6ZSk7XFxufVxcblxcbmg1IHtcXG4gIEBleHRlbmQgJWhlYWRpbmc7XFxuICBAaW5jbHVkZSBmb250LXNpemUoJGg1LWZvbnQtc2l6ZSk7XFxufVxcblxcbmg2IHtcXG4gIEBleHRlbmQgJWhlYWRpbmc7XFxuICBAaW5jbHVkZSBmb250LXNpemUoJGg2LWZvbnQtc2l6ZSk7XFxufVxcblxcblxcbi8vIFJlc2V0IG1hcmdpbnMgb24gcGFyYWdyYXBoc1xcbi8vXFxuLy8gU2ltaWxhcmx5LCB0aGUgdG9wIG1hcmdpbiBvbiBgPHA+YHMgZ2V0IHJlc2V0LiBIb3dldmVyLCB3ZSBhbHNvIHJlc2V0IHRoZVxcbi8vIGJvdHRvbSBtYXJnaW4gdG8gdXNlIGByZW1gIHVuaXRzIGluc3RlYWQgb2YgYGVtYC5cXG5cXG5wIHtcXG4gIG1hcmdpbi10b3A6IDA7XFxuICBtYXJnaW4tYm90dG9tOiAkcGFyYWdyYXBoLW1hcmdpbi1ib3R0b207XFxufVxcblxcblxcbi8vIEFiYnJldmlhdGlvbnNcXG4vL1xcbi8vIDEuIEFkZCB0aGUgY29ycmVjdCB0ZXh0IGRlY29yYXRpb24gaW4gQ2hyb21lLCBFZGdlLCBPcGVyYSwgYW5kIFNhZmFyaS5cXG4vLyAyLiBBZGQgZXhwbGljaXQgY3Vyc29yIHRvIGluZGljYXRlIGNoYW5nZWQgYmVoYXZpb3IuXFxuLy8gMy4gUHJldmVudCB0aGUgdGV4dC1kZWNvcmF0aW9uIHRvIGJlIHNraXBwZWQuXFxuXFxuYWJiclt0aXRsZV0ge1xcbiAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmUgZG90dGVkOyAvLyAxXFxuICBjdXJzb3I6IGhlbHA7IC8vIDJcXG4gIHRleHQtZGVjb3JhdGlvbi1za2lwLWluazogbm9uZTsgLy8gM1xcbn1cXG5cXG5cXG4vLyBBZGRyZXNzXFxuXFxuYWRkcmVzcyB7XFxuICBtYXJnaW4tYm90dG9tOiAxcmVtO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGluZS1oZWlnaHQ6IGluaGVyaXQ7XFxufVxcblxcblxcbi8vIExpc3RzXFxuXFxub2wsXFxudWwge1xcbiAgcGFkZGluZy1sZWZ0OiAycmVtO1xcbn1cXG5cXG5vbCxcXG51bCxcXG5kbCB7XFxuICBtYXJnaW4tdG9wOiAwO1xcbiAgbWFyZ2luLWJvdHRvbTogMXJlbTtcXG59XFxuXFxub2wgb2wsXFxudWwgdWwsXFxub2wgdWwsXFxudWwgb2wge1xcbiAgbWFyZ2luLWJvdHRvbTogMDtcXG59XFxuXFxuZHQge1xcbiAgZm9udC13ZWlnaHQ6ICRkdC1mb250LXdlaWdodDtcXG59XFxuXFxuLy8gMS4gVW5kbyBicm93c2VyIGRlZmF1bHRcXG5cXG5kZCB7XFxuICBtYXJnaW4tYm90dG9tOiAuNXJlbTtcXG4gIG1hcmdpbi1sZWZ0OiAwOyAvLyAxXFxufVxcblxcblxcbi8vIEJsb2NrcXVvdGVcXG5cXG5ibG9ja3F1b3RlIHtcXG4gIG1hcmdpbjogMCAwIDFyZW07XFxufVxcblxcblxcbi8vIFN0cm9uZ1xcbi8vXFxuLy8gQWRkIHRoZSBjb3JyZWN0IGZvbnQgd2VpZ2h0IGluIENocm9tZSwgRWRnZSwgYW5kIFNhZmFyaVxcblxcbmIsXFxuc3Ryb25nIHtcXG4gIGZvbnQtd2VpZ2h0OiAkZm9udC13ZWlnaHQtYm9sZGVyO1xcbn1cXG5cXG5cXG4vLyBTbWFsbFxcbi8vXFxuLy8gQWRkIHRoZSBjb3JyZWN0IGZvbnQgc2l6ZSBpbiBhbGwgYnJvd3NlcnNcXG5cXG5zbWFsbCB7XFxuICBAaW5jbHVkZSBmb250LXNpemUoJHNtYWxsLWZvbnQtc2l6ZSk7XFxufVxcblxcblxcbi8vIE1hcmtcXG5cXG5tYXJrIHtcXG4gIHBhZGRpbmc6ICRtYXJrLXBhZGRpbmc7XFxuICBjb2xvcjogdmFyKC0tI3skcHJlZml4fWhpZ2hsaWdodC1jb2xvcik7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS0jeyRwcmVmaXh9aGlnaGxpZ2h0LWJnKTtcXG59XFxuXFxuXFxuLy8gU3ViIGFuZCBTdXBcXG4vL1xcbi8vIFByZXZlbnQgYHN1YmAgYW5kIGBzdXBgIGVsZW1lbnRzIGZyb20gYWZmZWN0aW5nIHRoZSBsaW5lIGhlaWdodCBpblxcbi8vIGFsbCBicm93c2Vycy5cXG5cXG5zdWIsXFxuc3VwIHtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIEBpbmNsdWRlIGZvbnQtc2l6ZSgkc3ViLXN1cC1mb250LXNpemUpO1xcbiAgbGluZS1oZWlnaHQ6IDA7XFxuICB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7XFxufVxcblxcbnN1YiB7IGJvdHRvbTogLS4yNWVtOyB9XFxuc3VwIHsgdG9wOiAtLjVlbTsgfVxcblxcblxcbi8vIExpbmtzXFxuXFxuYSB7XFxuICBjb2xvcjogcmdiYSh2YXIoLS0jeyRwcmVmaXh9bGluay1jb2xvci1yZ2IpLCB2YXIoLS0jeyRwcmVmaXh9bGluay1vcGFjaXR5LCAxKSk7XFxuICB0ZXh0LWRlY29yYXRpb246ICRsaW5rLWRlY29yYXRpb247XFxuXFxuICAmOmhvdmVyIHtcXG4gICAgLS0jeyRwcmVmaXh9bGluay1jb2xvci1yZ2I6IHZhcigtLSN7JHByZWZpeH1saW5rLWhvdmVyLWNvbG9yLXJnYik7XFxuICAgIHRleHQtZGVjb3JhdGlvbjogJGxpbmstaG92ZXItZGVjb3JhdGlvbjtcXG4gIH1cXG59XFxuXFxuLy8gQW5kIHVuZG8gdGhlc2Ugc3R5bGVzIGZvciBwbGFjZWhvbGRlciBsaW5rcy9uYW1lZCBhbmNob3JzICh3aXRob3V0IGhyZWYpLlxcbi8vIEl0IHdvdWxkIGJlIG1vcmUgc3RyYWlnaHRmb3J3YXJkIHRvIGp1c3QgdXNlIGFbaHJlZl0gaW4gcHJldmlvdXMgYmxvY2ssIGJ1dCB0aGF0XFxuLy8gY2F1c2VzIHNwZWNpZmljaXR5IGlzc3VlcyBpbiBtYW55IG90aGVyIHN0eWxlcyB0aGF0IGFyZSB0b28gY29tcGxleCB0byBmaXguXFxuLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9pc3N1ZXMvMTk0MDJcXG5cXG5hOm5vdChbaHJlZl0pOm5vdChbY2xhc3NdKSB7XFxuICAmLFxcbiAgJjpob3ZlciB7XFxuICAgIGNvbG9yOiBpbmhlcml0O1xcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XFxuICB9XFxufVxcblxcblxcbi8vIENvZGVcXG5cXG5wcmUsXFxuY29kZSxcXG5rYmQsXFxuc2FtcCB7XFxuICBmb250LWZhbWlseTogJGZvbnQtZmFtaWx5LWNvZGU7XFxuICBAaW5jbHVkZSBmb250LXNpemUoMWVtKTsgLy8gQ29ycmVjdCB0aGUgb2RkIGBlbWAgZm9udCBzaXppbmcgaW4gYWxsIGJyb3dzZXJzLlxcbn1cXG5cXG4vLyAxLiBSZW1vdmUgYnJvd3NlciBkZWZhdWx0IHRvcCBtYXJnaW5cXG4vLyAyLiBSZXNldCBicm93c2VyIGRlZmF1bHQgb2YgYDFlbWAgdG8gdXNlIGByZW1gc1xcbi8vIDMuIERvbid0IGFsbG93IGNvbnRlbnQgdG8gYnJlYWsgb3V0c2lkZVxcblxcbnByZSB7XFxuICBkaXNwbGF5OiBibG9jaztcXG4gIG1hcmdpbi10b3A6IDA7IC8vIDFcXG4gIG1hcmdpbi1ib3R0b206IDFyZW07IC8vIDJcXG4gIG92ZXJmbG93OiBhdXRvOyAvLyAzXFxuICBAaW5jbHVkZSBmb250LXNpemUoJGNvZGUtZm9udC1zaXplKTtcXG4gIGNvbG9yOiAkcHJlLWNvbG9yO1xcblxcbiAgLy8gQWNjb3VudCBmb3Igc29tZSBjb2RlIG91dHB1dHMgdGhhdCBwbGFjZSBjb2RlIHRhZ3MgaW4gcHJlIHRhZ3NcXG4gIGNvZGUge1xcbiAgICBAaW5jbHVkZSBmb250LXNpemUoaW5oZXJpdCk7XFxuICAgIGNvbG9yOiBpbmhlcml0O1xcbiAgICB3b3JkLWJyZWFrOiBub3JtYWw7XFxuICB9XFxufVxcblxcbmNvZGUge1xcbiAgQGluY2x1ZGUgZm9udC1zaXplKCRjb2RlLWZvbnQtc2l6ZSk7XFxuICBjb2xvcjogdmFyKC0tI3skcHJlZml4fWNvZGUtY29sb3IpO1xcbiAgd29yZC13cmFwOiBicmVhay13b3JkO1xcblxcbiAgLy8gU3RyZWFtbGluZSB0aGUgc3R5bGUgd2hlbiBpbnNpZGUgYW5jaG9ycyB0byBhdm9pZCBicm9rZW4gdW5kZXJsaW5lIGFuZCBtb3JlXFxuICBhID4gJiB7XFxuICAgIGNvbG9yOiBpbmhlcml0O1xcbiAgfVxcbn1cXG5cXG5rYmQge1xcbiAgcGFkZGluZzogJGtiZC1wYWRkaW5nLXkgJGtiZC1wYWRkaW5nLXg7XFxuICBAaW5jbHVkZSBmb250LXNpemUoJGtiZC1mb250LXNpemUpO1xcbiAgY29sb3I6ICRrYmQtY29sb3I7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAka2JkLWJnO1xcbiAgQGluY2x1ZGUgYm9yZGVyLXJhZGl1cygkYm9yZGVyLXJhZGl1cy1zbSk7XFxuXFxuICBrYmQge1xcbiAgICBwYWRkaW5nOiAwO1xcbiAgICBAaW5jbHVkZSBmb250LXNpemUoMWVtKTtcXG4gICAgZm9udC13ZWlnaHQ6ICRuZXN0ZWQta2JkLWZvbnQtd2VpZ2h0O1xcbiAgfVxcbn1cXG5cXG5cXG4vLyBGaWd1cmVzXFxuLy9cXG4vLyBBcHBseSBhIGNvbnNpc3RlbnQgbWFyZ2luIHN0cmF0ZWd5IChtYXRjaGVzIG91ciB0eXBlIHN0eWxlcykuXFxuXFxuZmlndXJlIHtcXG4gIG1hcmdpbjogMCAwIDFyZW07XFxufVxcblxcblxcbi8vIEltYWdlcyBhbmQgY29udGVudFxcblxcbmltZyxcXG5zdmcge1xcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcXG59XFxuXFxuXFxuLy8gVGFibGVzXFxuLy9cXG4vLyBQcmV2ZW50IGRvdWJsZSBib3JkZXJzXFxuXFxudGFibGUge1xcbiAgY2FwdGlvbi1zaWRlOiBib3R0b207XFxuICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlO1xcbn1cXG5cXG5jYXB0aW9uIHtcXG4gIHBhZGRpbmctdG9wOiAkdGFibGUtY2VsbC1wYWRkaW5nLXk7XFxuICBwYWRkaW5nLWJvdHRvbTogJHRhYmxlLWNlbGwtcGFkZGluZy15O1xcbiAgY29sb3I6ICR0YWJsZS1jYXB0aW9uLWNvbG9yO1xcbiAgdGV4dC1hbGlnbjogbGVmdDtcXG59XFxuXFxuLy8gMS4gUmVtb3ZlcyBmb250LXdlaWdodCBib2xkIGJ5IGluaGVyaXRpbmdcXG4vLyAyLiBNYXRjaGVzIGRlZmF1bHQgYDx0ZD5gIGFsaWdubWVudCBieSBpbmhlcml0aW5nIGB0ZXh0LWFsaWduYC5cXG4vLyAzLiBGaXggYWxpZ25tZW50IGZvciBTYWZhcmlcXG5cXG50aCB7XFxuICBmb250LXdlaWdodDogJHRhYmxlLXRoLWZvbnQtd2VpZ2h0OyAvLyAxXFxuICB0ZXh0LWFsaWduOiBpbmhlcml0OyAvLyAyXFxuICB0ZXh0LWFsaWduOiAtd2Via2l0LW1hdGNoLXBhcmVudDsgLy8gM1xcbn1cXG5cXG50aGVhZCxcXG50Ym9keSxcXG50Zm9vdCxcXG50cixcXG50ZCxcXG50aCB7XFxuICBib3JkZXItY29sb3I6IGluaGVyaXQ7XFxuICBib3JkZXItc3R5bGU6IHNvbGlkO1xcbiAgYm9yZGVyLXdpZHRoOiAwO1xcbn1cXG5cXG5cXG4vLyBGb3Jtc1xcbi8vXFxuLy8gMS4gQWxsb3cgbGFiZWxzIHRvIHVzZSBgbWFyZ2luYCBmb3Igc3BhY2luZy5cXG5cXG5sYWJlbCB7XFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IC8vIDFcXG59XFxuXFxuLy8gUmVtb3ZlIHRoZSBkZWZhdWx0IGBib3JkZXItcmFkaXVzYCB0aGF0IG1hY09TIENocm9tZSBhZGRzLlxcbi8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvaXNzdWVzLzI0MDkzXFxuXFxuYnV0dG9uIHtcXG4gIC8vIHN0eWxlbGludC1kaXNhYmxlLW5leHQtbGluZSBwcm9wZXJ0eS1kaXNhbGxvd2VkLWxpc3RcXG4gIGJvcmRlci1yYWRpdXM6IDA7XFxufVxcblxcbi8vIEV4cGxpY2l0bHkgcmVtb3ZlIGZvY3VzIG91dGxpbmUgaW4gQ2hyb21pdW0gd2hlbiBpdCBzaG91bGRuJ3QgYmVcXG4vLyB2aXNpYmxlIChlLmcuIGFzIHJlc3VsdCBvZiBtb3VzZSBjbGljayBvciB0b3VjaCB0YXApLiBJdCBhbHJlYWR5XFxuLy8gc2hvdWxkIGJlIGRvaW5nIHRoaXMgYXV0b21hdGljYWxseSwgYnV0IHNlZW1zIHRvIGN1cnJlbnRseSBiZVxcbi8vIGNvbmZ1c2VkIGFuZCBhcHBsaWVzIGl0cyB2ZXJ5IHZpc2libGUgdHdvLXRvbmUgb3V0bGluZSBhbnl3YXkuXFxuXFxuYnV0dG9uOmZvY3VzOm5vdCg6Zm9jdXMtdmlzaWJsZSkge1xcbiAgb3V0bGluZTogMDtcXG59XFxuXFxuLy8gMS4gUmVtb3ZlIHRoZSBtYXJnaW4gaW4gRmlyZWZveCBhbmQgU2FmYXJpXFxuXFxuaW5wdXQsXFxuYnV0dG9uLFxcbnNlbGVjdCxcXG5vcHRncm91cCxcXG50ZXh0YXJlYSB7XFxuICBtYXJnaW46IDA7IC8vIDFcXG4gIGZvbnQtZmFtaWx5OiBpbmhlcml0O1xcbiAgQGluY2x1ZGUgZm9udC1zaXplKGluaGVyaXQpO1xcbiAgbGluZS1oZWlnaHQ6IGluaGVyaXQ7XFxufVxcblxcbi8vIFJlbW92ZSB0aGUgaW5oZXJpdGFuY2Ugb2YgdGV4dCB0cmFuc2Zvcm0gaW4gRmlyZWZveFxcbmJ1dHRvbixcXG5zZWxlY3Qge1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxufVxcbi8vIFNldCB0aGUgY3Vyc29yIGZvciBub24tYDxidXR0b24+YCBidXR0b25zXFxuLy9cXG4vLyBEZXRhaWxzIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9wdWxsLzMwNTYyXFxuW3JvbGU9XFxcImJ1dHRvblxcXCJdIHtcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuXFxuc2VsZWN0IHtcXG4gIC8vIFJlbW92ZSB0aGUgaW5oZXJpdGFuY2Ugb2Ygd29yZC13cmFwIGluIFNhZmFyaS5cXG4gIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvaXNzdWVzLzI0OTkwXFxuICB3b3JkLXdyYXA6IG5vcm1hbDtcXG5cXG4gIC8vIFVuZG8gdGhlIG9wYWNpdHkgY2hhbmdlIGZyb20gQ2hyb21lXFxuICAmOmRpc2FibGVkIHtcXG4gICAgb3BhY2l0eTogMTtcXG4gIH1cXG59XFxuXFxuLy8gUmVtb3ZlIHRoZSBkcm9wZG93biBhcnJvdyBvbmx5IGZyb20gdGV4dCB0eXBlIGlucHV0cyBidWlsdCB3aXRoIGRhdGFsaXN0cyBpbiBDaHJvbWUuXFxuLy8gU2VlIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS81NDk5NzExOFxcblxcbltsaXN0XTpub3QoW3R5cGU9XFxcImRhdGVcXFwiXSk6bm90KFt0eXBlPVxcXCJkYXRldGltZS1sb2NhbFxcXCJdKTpub3QoW3R5cGU9XFxcIm1vbnRoXFxcIl0pOm5vdChbdHlwZT1cXFwid2Vla1xcXCJdKTpub3QoW3R5cGU9XFxcInRpbWVcXFwiXSk6Oi13ZWJraXQtY2FsZW5kYXItcGlja2VyLWluZGljYXRvciB7XFxuICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XFxufVxcblxcbi8vIDEuIFByZXZlbnQgYSBXZWJLaXQgYnVnIHdoZXJlICgyKSBkZXN0cm95cyBuYXRpdmUgYGF1ZGlvYCBhbmQgYHZpZGVvYFxcbi8vICAgIGNvbnRyb2xzIGluIEFuZHJvaWQgNC5cXG4vLyAyLiBDb3JyZWN0IHRoZSBpbmFiaWxpdHkgdG8gc3R5bGUgY2xpY2thYmxlIHR5cGVzIGluIGlPUyBhbmQgU2FmYXJpLlxcbi8vIDMuIE9waW5pb25hdGVkOiBhZGQgXFxcImhhbmRcXFwiIGN1cnNvciB0byBub24tZGlzYWJsZWQgYnV0dG9uIGVsZW1lbnRzLlxcblxcbmJ1dHRvbixcXG5bdHlwZT1cXFwiYnV0dG9uXFxcIl0sIC8vIDFcXG5bdHlwZT1cXFwicmVzZXRcXFwiXSxcXG5bdHlwZT1cXFwic3VibWl0XFxcIl0ge1xcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiBidXR0b247IC8vIDJcXG5cXG4gIEBpZiAkZW5hYmxlLWJ1dHRvbi1wb2ludGVycyB7XFxuICAgICY6bm90KDpkaXNhYmxlZCkge1xcbiAgICAgIGN1cnNvcjogcG9pbnRlcjsgLy8gM1xcbiAgICB9XFxuICB9XFxufVxcblxcbi8vIFJlbW92ZSBpbm5lciBib3JkZXIgYW5kIHBhZGRpbmcgZnJvbSBGaXJlZm94LCBidXQgZG9uJ3QgcmVzdG9yZSB0aGUgb3V0bGluZSBsaWtlIE5vcm1hbGl6ZS5cXG5cXG46Oi1tb3otZm9jdXMtaW5uZXIge1xcbiAgcGFkZGluZzogMDtcXG4gIGJvcmRlci1zdHlsZTogbm9uZTtcXG59XFxuXFxuLy8gMS4gVGV4dGFyZWFzIHNob3VsZCByZWFsbHkgb25seSByZXNpemUgdmVydGljYWxseSBzbyB0aGV5IGRvbid0IGJyZWFrIHRoZWlyIChob3Jpem9udGFsKSBjb250YWluZXJzLlxcblxcbnRleHRhcmVhIHtcXG4gIHJlc2l6ZTogdmVydGljYWw7IC8vIDFcXG59XFxuXFxuLy8gMS4gQnJvd3NlcnMgc2V0IGEgZGVmYXVsdCBgbWluLXdpZHRoOiBtaW4tY29udGVudDtgIG9uIGZpZWxkc2V0cyxcXG4vLyAgICB1bmxpa2UgZS5nLiBgPGRpdj5gcywgd2hpY2ggaGF2ZSBgbWluLXdpZHRoOiAwO2AgYnkgZGVmYXVsdC5cXG4vLyAgICBTbyB3ZSByZXNldCB0aGF0IHRvIGVuc3VyZSBmaWVsZHNldHMgYmVoYXZlIG1vcmUgbGlrZSBhIHN0YW5kYXJkIGJsb2NrIGVsZW1lbnQuXFxuLy8gICAgU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9pc3N1ZXMvMTIzNTlcXG4vLyAgICBhbmQgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvI3RoZS1maWVsZHNldC1hbmQtbGVnZW5kLWVsZW1lbnRzXFxuLy8gMi4gUmVzZXQgdGhlIGRlZmF1bHQgb3V0bGluZSBiZWhhdmlvciBvZiBmaWVsZHNldHMgc28gdGhleSBkb24ndCBhZmZlY3QgcGFnZSBsYXlvdXQuXFxuXFxuZmllbGRzZXQge1xcbiAgbWluLXdpZHRoOiAwOyAvLyAxXFxuICBwYWRkaW5nOiAwOyAvLyAyXFxuICBtYXJnaW46IDA7IC8vIDJcXG4gIGJvcmRlcjogMDsgLy8gMlxcbn1cXG5cXG4vLyAxLiBCeSB1c2luZyBgZmxvYXQ6IGxlZnRgLCB0aGUgbGVnZW5kIHdpbGwgYmVoYXZlIGxpa2UgYSBibG9jayBlbGVtZW50Llxcbi8vICAgIFRoaXMgd2F5IHRoZSBib3JkZXIgb2YgYSBmaWVsZHNldCB3cmFwcyBhcm91bmQgdGhlIGxlZ2VuZCBpZiBwcmVzZW50Llxcbi8vIDIuIEZpeCB3cmFwcGluZyBidWcuXFxuLy8gICAgU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9pc3N1ZXMvMjk3MTJcXG5cXG5sZWdlbmQge1xcbiAgZmxvYXQ6IGxlZnQ7IC8vIDFcXG4gIHdpZHRoOiAxMDAlO1xcbiAgcGFkZGluZzogMDtcXG4gIG1hcmdpbi1ib3R0b206ICRsZWdlbmQtbWFyZ2luLWJvdHRvbTtcXG4gIEBpbmNsdWRlIGZvbnQtc2l6ZSgkbGVnZW5kLWZvbnQtc2l6ZSk7XFxuICBmb250LXdlaWdodDogJGxlZ2VuZC1mb250LXdlaWdodDtcXG4gIGxpbmUtaGVpZ2h0OiBpbmhlcml0O1xcblxcbiAgKyAqIHtcXG4gICAgY2xlYXI6IGxlZnQ7IC8vIDJcXG4gIH1cXG59XFxuXFxuLy8gRml4IGhlaWdodCBvZiBpbnB1dHMgd2l0aCBhIHR5cGUgb2YgZGF0ZXRpbWUtbG9jYWwsIGRhdGUsIG1vbnRoLCB3ZWVrLCBvciB0aW1lXFxuLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9pc3N1ZXMvMTg4NDJcXG5cXG46Oi13ZWJraXQtZGF0ZXRpbWUtZWRpdC1maWVsZHMtd3JhcHBlcixcXG46Oi13ZWJraXQtZGF0ZXRpbWUtZWRpdC10ZXh0LFxcbjo6LXdlYmtpdC1kYXRldGltZS1lZGl0LW1pbnV0ZSxcXG46Oi13ZWJraXQtZGF0ZXRpbWUtZWRpdC1ob3VyLWZpZWxkLFxcbjo6LXdlYmtpdC1kYXRldGltZS1lZGl0LWRheS1maWVsZCxcXG46Oi13ZWJraXQtZGF0ZXRpbWUtZWRpdC1tb250aC1maWVsZCxcXG46Oi13ZWJraXQtZGF0ZXRpbWUtZWRpdC15ZWFyLWZpZWxkIHtcXG4gIHBhZGRpbmc6IDA7XFxufVxcblxcbjo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbiB7XFxuICBoZWlnaHQ6IGF1dG87XFxufVxcblxcbi8vIDEuIFRoaXMgb3ZlcnJpZGVzIHRoZSBleHRyYSByb3VuZGVkIGNvcm5lcnMgb24gc2VhcmNoIGlucHV0cyBpbiBpT1Mgc28gdGhhdCBvdXJcXG4vLyAgICBgLmZvcm0tY29udHJvbGAgY2xhc3MgY2FuIHByb3Blcmx5IHN0eWxlIHRoZW0uIE5vdGUgdGhhdCB0aGlzIGNhbm5vdCBzaW1wbHlcXG4vLyAgICBiZSBhZGRlZCB0byBgLmZvcm0tY29udHJvbGAgYXMgaXQncyBub3Qgc3BlY2lmaWMgZW5vdWdoLiBGb3IgZGV0YWlscywgc2VlXFxuLy8gICAgaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2lzc3Vlcy8xMTU4Ni5cXG4vLyAyLiBDb3JyZWN0IHRoZSBvdXRsaW5lIHN0eWxlIGluIFNhZmFyaS5cXG5cXG5bdHlwZT1cXFwic2VhcmNoXFxcIl0ge1xcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiB0ZXh0ZmllbGQ7IC8vIDFcXG4gIG91dGxpbmUtb2Zmc2V0OiAtMnB4OyAvLyAyXFxufVxcblxcbi8vIDEuIEEgZmV3IGlucHV0IHR5cGVzIHNob3VsZCBzdGF5IExUUlxcbi8vIFNlZSBodHRwczovL3J0bHN0eWxpbmcuY29tL3Bvc3RzL3J0bC1zdHlsaW5nI2Zvcm0taW5wdXRzXFxuLy8gMi4gUlRMIG9ubHkgb3V0cHV0XFxuLy8gU2VlIGh0dHBzOi8vcnRsY3NzLmNvbS9sZWFybi91c2FnZS1ndWlkZS9jb250cm9sLWRpcmVjdGl2ZXMvI3Jhd1xcblxcbi8qIHJ0bDpyYXc6XFxuW3R5cGU9XFxcInRlbFxcXCJdLFxcblt0eXBlPVxcXCJ1cmxcXFwiXSxcXG5bdHlwZT1cXFwiZW1haWxcXFwiXSxcXG5bdHlwZT1cXFwibnVtYmVyXFxcIl0ge1xcbiAgZGlyZWN0aW9uOiBsdHI7XFxufVxcbiovXFxuXFxuLy8gUmVtb3ZlIHRoZSBpbm5lciBwYWRkaW5nIGluIENocm9tZSBhbmQgU2FmYXJpIG9uIG1hY09TLlxcblxcbjo6LXdlYmtpdC1zZWFyY2gtZGVjb3JhdGlvbiB7XFxuICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XFxufVxcblxcbi8vIFJlbW92ZSBwYWRkaW5nIGFyb3VuZCBjb2xvciBwaWNrZXJzIGluIHdlYmtpdCBicm93c2Vyc1xcblxcbjo6LXdlYmtpdC1jb2xvci1zd2F0Y2gtd3JhcHBlciB7XFxuICBwYWRkaW5nOiAwO1xcbn1cXG5cXG5cXG4vLyAxLiBJbmhlcml0IGZvbnQgZmFtaWx5IGFuZCBsaW5lIGhlaWdodCBmb3IgZmlsZSBpbnB1dCBidXR0b25zXFxuLy8gMi4gQ29ycmVjdCB0aGUgaW5hYmlsaXR5IHRvIHN0eWxlIGNsaWNrYWJsZSB0eXBlcyBpbiBpT1MgYW5kIFNhZmFyaS5cXG5cXG46OmZpbGUtc2VsZWN0b3ItYnV0dG9uIHtcXG4gIGZvbnQ6IGluaGVyaXQ7IC8vIDFcXG4gIC13ZWJraXQtYXBwZWFyYW5jZTogYnV0dG9uOyAvLyAyXFxufVxcblxcbi8vIENvcnJlY3QgZWxlbWVudCBkaXNwbGF5c1xcblxcbm91dHB1dCB7XFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxufVxcblxcbi8vIFJlbW92ZSBib3JkZXIgZnJvbSBpZnJhbWVcXG5cXG5pZnJhbWUge1xcbiAgYm9yZGVyOiAwO1xcbn1cXG5cXG4vLyBTdW1tYXJ5XFxuLy9cXG4vLyAxLiBBZGQgdGhlIGNvcnJlY3QgZGlzcGxheSBpbiBhbGwgYnJvd3NlcnNcXG5cXG5zdW1tYXJ5IHtcXG4gIGRpc3BsYXk6IGxpc3QtaXRlbTsgLy8gMVxcbiAgY3Vyc29yOiBwb2ludGVyO1xcbn1cXG5cXG5cXG4vLyBQcm9ncmVzc1xcbi8vXFxuLy8gQWRkIHRoZSBjb3JyZWN0IHZlcnRpY2FsIGFsaWdubWVudCBpbiBDaHJvbWUsIEZpcmVmb3gsIGFuZCBPcGVyYS5cXG5cXG5wcm9ncmVzcyB7XFxuICB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7XFxufVxcblxcblxcbi8vIEhpZGRlbiBhdHRyaWJ1dGVcXG4vL1xcbi8vIEFsd2F5cyBoaWRlIGFuIGVsZW1lbnQgd2l0aCB0aGUgYGhpZGRlbmAgSFRNTCBhdHRyaWJ1dGUuXFxuXFxuW2hpZGRlbl0ge1xcbiAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xcbn1cXG5cIixcIi8vIFZhcmlhYmxlc1xcbi8vXFxuLy8gVmFyaWFibGVzIHNob3VsZCBmb2xsb3cgdGhlIGAkY29tcG9uZW50LXN0YXRlLXByb3BlcnR5LXNpemVgIGZvcm11bGEgZm9yXFxuLy8gY29uc2lzdGVudCBuYW1pbmcuIEV4OiAkbmF2LWxpbmstZGlzYWJsZWQtY29sb3IgYW5kICRtb2RhbC1jb250ZW50LWJveC1zaGFkb3cteHMuXFxuXFxuLy8gQ29sb3Igc3lzdGVtXFxuXFxuLy8gc2Nzcy1kb2NzLXN0YXJ0IGdyYXktY29sb3ItdmFyaWFibGVzXFxuJHdoaXRlOiAgICAjZmZmICFkZWZhdWx0O1xcbiRncmF5LTEwMDogI2Y4ZjlmYSAhZGVmYXVsdDtcXG4kZ3JheS0yMDA6ICNlOWVjZWYgIWRlZmF1bHQ7XFxuJGdyYXktMzAwOiAjZGVlMmU2ICFkZWZhdWx0O1xcbiRncmF5LTQwMDogI2NlZDRkYSAhZGVmYXVsdDtcXG4kZ3JheS01MDA6ICNhZGI1YmQgIWRlZmF1bHQ7XFxuJGdyYXktNjAwOiAjNmM3NTdkICFkZWZhdWx0O1xcbiRncmF5LTcwMDogIzQ5NTA1NyAhZGVmYXVsdDtcXG4kZ3JheS04MDA6ICMzNDNhNDAgIWRlZmF1bHQ7XFxuJGdyYXktOTAwOiAjMjEyNTI5ICFkZWZhdWx0O1xcbiRibGFjazogICAgIzAwMCAhZGVmYXVsdDtcXG4vLyBzY3NzLWRvY3MtZW5kIGdyYXktY29sb3ItdmFyaWFibGVzXFxuXFxuLy8gZnVzdi1kaXNhYmxlXFxuLy8gc2Nzcy1kb2NzLXN0YXJ0IGdyYXktY29sb3JzLW1hcFxcbiRncmF5czogKFxcbiAgXFxcIjEwMFxcXCI6ICRncmF5LTEwMCxcXG4gIFxcXCIyMDBcXFwiOiAkZ3JheS0yMDAsXFxuICBcXFwiMzAwXFxcIjogJGdyYXktMzAwLFxcbiAgXFxcIjQwMFxcXCI6ICRncmF5LTQwMCxcXG4gIFxcXCI1MDBcXFwiOiAkZ3JheS01MDAsXFxuICBcXFwiNjAwXFxcIjogJGdyYXktNjAwLFxcbiAgXFxcIjcwMFxcXCI6ICRncmF5LTcwMCxcXG4gIFxcXCI4MDBcXFwiOiAkZ3JheS04MDAsXFxuICBcXFwiOTAwXFxcIjogJGdyYXktOTAwXFxuKSAhZGVmYXVsdDtcXG4vLyBzY3NzLWRvY3MtZW5kIGdyYXktY29sb3JzLW1hcFxcbi8vIGZ1c3YtZW5hYmxlXFxuXFxuLy8gc2Nzcy1kb2NzLXN0YXJ0IGNvbG9yLXZhcmlhYmxlc1xcbiRibHVlOiAgICAjMGQ2ZWZkICFkZWZhdWx0O1xcbiRpbmRpZ286ICAjNjYxMGYyICFkZWZhdWx0O1xcbiRwdXJwbGU6ICAjNmY0MmMxICFkZWZhdWx0O1xcbiRwaW5rOiAgICAjZDYzMzg0ICFkZWZhdWx0O1xcbiRyZWQ6ICAgICAjZGMzNTQ1ICFkZWZhdWx0O1xcbiRvcmFuZ2U6ICAjZmQ3ZTE0ICFkZWZhdWx0O1xcbiR5ZWxsb3c6ICAjZmZjMTA3ICFkZWZhdWx0O1xcbiRncmVlbjogICAjMTk4NzU0ICFkZWZhdWx0O1xcbiR0ZWFsOiAgICAjMjBjOTk3ICFkZWZhdWx0O1xcbiRjeWFuOiAgICAjMGRjYWYwICFkZWZhdWx0O1xcbi8vIHNjc3MtZG9jcy1lbmQgY29sb3ItdmFyaWFibGVzXFxuXFxuLy8gc2Nzcy1kb2NzLXN0YXJ0IGNvbG9ycy1tYXBcXG4kY29sb3JzOiAoXFxuICBcXFwiYmx1ZVxcXCI6ICAgICAgICRibHVlLFxcbiAgXFxcImluZGlnb1xcXCI6ICAgICAkaW5kaWdvLFxcbiAgXFxcInB1cnBsZVxcXCI6ICAgICAkcHVycGxlLFxcbiAgXFxcInBpbmtcXFwiOiAgICAgICAkcGluayxcXG4gIFxcXCJyZWRcXFwiOiAgICAgICAgJHJlZCxcXG4gIFxcXCJvcmFuZ2VcXFwiOiAgICAgJG9yYW5nZSxcXG4gIFxcXCJ5ZWxsb3dcXFwiOiAgICAgJHllbGxvdyxcXG4gIFxcXCJncmVlblxcXCI6ICAgICAgJGdyZWVuLFxcbiAgXFxcInRlYWxcXFwiOiAgICAgICAkdGVhbCxcXG4gIFxcXCJjeWFuXFxcIjogICAgICAgJGN5YW4sXFxuICBcXFwiYmxhY2tcXFwiOiAgICAgICRibGFjayxcXG4gIFxcXCJ3aGl0ZVxcXCI6ICAgICAgJHdoaXRlLFxcbiAgXFxcImdyYXlcXFwiOiAgICAgICAkZ3JheS02MDAsXFxuICBcXFwiZ3JheS1kYXJrXFxcIjogICRncmF5LTgwMFxcbikgIWRlZmF1bHQ7XFxuLy8gc2Nzcy1kb2NzLWVuZCBjb2xvcnMtbWFwXFxuXFxuLy8gVGhlIGNvbnRyYXN0IHJhdGlvIHRvIHJlYWNoIGFnYWluc3Qgd2hpdGUsIHRvIGRldGVybWluZSBpZiBjb2xvciBjaGFuZ2VzIGZyb20gXFxcImxpZ2h0XFxcIiB0byBcXFwiZGFya1xcXCIuIEFjY2VwdGFibGUgdmFsdWVzIGZvciBXQ0FHIDIuMCBhcmUgMywgNC41IGFuZCA3Llxcbi8vIFNlZSBodHRwczovL3d3dy53My5vcmcvVFIvV0NBRzIwLyN2aXN1YWwtYXVkaW8tY29udHJhc3QtY29udHJhc3RcXG4kbWluLWNvbnRyYXN0LXJhdGlvOiAgIDQuNSAhZGVmYXVsdDtcXG5cXG4vLyBDdXN0b21pemUgdGhlIGxpZ2h0IGFuZCBkYXJrIHRleHQgY29sb3JzIGZvciB1c2UgaW4gb3VyIGNvbG9yIGNvbnRyYXN0IGZ1bmN0aW9uLlxcbiRjb2xvci1jb250cmFzdC1kYXJrOiAgICAgICRibGFjayAhZGVmYXVsdDtcXG4kY29sb3ItY29udHJhc3QtbGlnaHQ6ICAgICAkd2hpdGUgIWRlZmF1bHQ7XFxuXFxuLy8gZnVzdi1kaXNhYmxlXFxuJGJsdWUtMTAwOiB0aW50LWNvbG9yKCRibHVlLCA4MCUpICFkZWZhdWx0O1xcbiRibHVlLTIwMDogdGludC1jb2xvcigkYmx1ZSwgNjAlKSAhZGVmYXVsdDtcXG4kYmx1ZS0zMDA6IHRpbnQtY29sb3IoJGJsdWUsIDQwJSkgIWRlZmF1bHQ7XFxuJGJsdWUtNDAwOiB0aW50LWNvbG9yKCRibHVlLCAyMCUpICFkZWZhdWx0O1xcbiRibHVlLTUwMDogJGJsdWUgIWRlZmF1bHQ7XFxuJGJsdWUtNjAwOiBzaGFkZS1jb2xvcigkYmx1ZSwgMjAlKSAhZGVmYXVsdDtcXG4kYmx1ZS03MDA6IHNoYWRlLWNvbG9yKCRibHVlLCA0MCUpICFkZWZhdWx0O1xcbiRibHVlLTgwMDogc2hhZGUtY29sb3IoJGJsdWUsIDYwJSkgIWRlZmF1bHQ7XFxuJGJsdWUtOTAwOiBzaGFkZS1jb2xvcigkYmx1ZSwgODAlKSAhZGVmYXVsdDtcXG5cXG4kaW5kaWdvLTEwMDogdGludC1jb2xvcigkaW5kaWdvLCA4MCUpICFkZWZhdWx0O1xcbiRpbmRpZ28tMjAwOiB0aW50LWNvbG9yKCRpbmRpZ28sIDYwJSkgIWRlZmF1bHQ7XFxuJGluZGlnby0zMDA6IHRpbnQtY29sb3IoJGluZGlnbywgNDAlKSAhZGVmYXVsdDtcXG4kaW5kaWdvLTQwMDogdGludC1jb2xvcigkaW5kaWdvLCAyMCUpICFkZWZhdWx0O1xcbiRpbmRpZ28tNTAwOiAkaW5kaWdvICFkZWZhdWx0O1xcbiRpbmRpZ28tNjAwOiBzaGFkZS1jb2xvcigkaW5kaWdvLCAyMCUpICFkZWZhdWx0O1xcbiRpbmRpZ28tNzAwOiBzaGFkZS1jb2xvcigkaW5kaWdvLCA0MCUpICFkZWZhdWx0O1xcbiRpbmRpZ28tODAwOiBzaGFkZS1jb2xvcigkaW5kaWdvLCA2MCUpICFkZWZhdWx0O1xcbiRpbmRpZ28tOTAwOiBzaGFkZS1jb2xvcigkaW5kaWdvLCA4MCUpICFkZWZhdWx0O1xcblxcbiRwdXJwbGUtMTAwOiB0aW50LWNvbG9yKCRwdXJwbGUsIDgwJSkgIWRlZmF1bHQ7XFxuJHB1cnBsZS0yMDA6IHRpbnQtY29sb3IoJHB1cnBsZSwgNjAlKSAhZGVmYXVsdDtcXG4kcHVycGxlLTMwMDogdGludC1jb2xvcigkcHVycGxlLCA0MCUpICFkZWZhdWx0O1xcbiRwdXJwbGUtNDAwOiB0aW50LWNvbG9yKCRwdXJwbGUsIDIwJSkgIWRlZmF1bHQ7XFxuJHB1cnBsZS01MDA6ICRwdXJwbGUgIWRlZmF1bHQ7XFxuJHB1cnBsZS02MDA6IHNoYWRlLWNvbG9yKCRwdXJwbGUsIDIwJSkgIWRlZmF1bHQ7XFxuJHB1cnBsZS03MDA6IHNoYWRlLWNvbG9yKCRwdXJwbGUsIDQwJSkgIWRlZmF1bHQ7XFxuJHB1cnBsZS04MDA6IHNoYWRlLWNvbG9yKCRwdXJwbGUsIDYwJSkgIWRlZmF1bHQ7XFxuJHB1cnBsZS05MDA6IHNoYWRlLWNvbG9yKCRwdXJwbGUsIDgwJSkgIWRlZmF1bHQ7XFxuXFxuJHBpbmstMTAwOiB0aW50LWNvbG9yKCRwaW5rLCA4MCUpICFkZWZhdWx0O1xcbiRwaW5rLTIwMDogdGludC1jb2xvcigkcGluaywgNjAlKSAhZGVmYXVsdDtcXG4kcGluay0zMDA6IHRpbnQtY29sb3IoJHBpbmssIDQwJSkgIWRlZmF1bHQ7XFxuJHBpbmstNDAwOiB0aW50LWNvbG9yKCRwaW5rLCAyMCUpICFkZWZhdWx0O1xcbiRwaW5rLTUwMDogJHBpbmsgIWRlZmF1bHQ7XFxuJHBpbmstNjAwOiBzaGFkZS1jb2xvcigkcGluaywgMjAlKSAhZGVmYXVsdDtcXG4kcGluay03MDA6IHNoYWRlLWNvbG9yKCRwaW5rLCA0MCUpICFkZWZhdWx0O1xcbiRwaW5rLTgwMDogc2hhZGUtY29sb3IoJHBpbmssIDYwJSkgIWRlZmF1bHQ7XFxuJHBpbmstOTAwOiBzaGFkZS1jb2xvcigkcGluaywgODAlKSAhZGVmYXVsdDtcXG5cXG4kcmVkLTEwMDogdGludC1jb2xvcigkcmVkLCA4MCUpICFkZWZhdWx0O1xcbiRyZWQtMjAwOiB0aW50LWNvbG9yKCRyZWQsIDYwJSkgIWRlZmF1bHQ7XFxuJHJlZC0zMDA6IHRpbnQtY29sb3IoJHJlZCwgNDAlKSAhZGVmYXVsdDtcXG4kcmVkLTQwMDogdGludC1jb2xvcigkcmVkLCAyMCUpICFkZWZhdWx0O1xcbiRyZWQtNTAwOiAkcmVkICFkZWZhdWx0O1xcbiRyZWQtNjAwOiBzaGFkZS1jb2xvcigkcmVkLCAyMCUpICFkZWZhdWx0O1xcbiRyZWQtNzAwOiBzaGFkZS1jb2xvcigkcmVkLCA0MCUpICFkZWZhdWx0O1xcbiRyZWQtODAwOiBzaGFkZS1jb2xvcigkcmVkLCA2MCUpICFkZWZhdWx0O1xcbiRyZWQtOTAwOiBzaGFkZS1jb2xvcigkcmVkLCA4MCUpICFkZWZhdWx0O1xcblxcbiRvcmFuZ2UtMTAwOiB0aW50LWNvbG9yKCRvcmFuZ2UsIDgwJSkgIWRlZmF1bHQ7XFxuJG9yYW5nZS0yMDA6IHRpbnQtY29sb3IoJG9yYW5nZSwgNjAlKSAhZGVmYXVsdDtcXG4kb3JhbmdlLTMwMDogdGludC1jb2xvcigkb3JhbmdlLCA0MCUpICFkZWZhdWx0O1xcbiRvcmFuZ2UtNDAwOiB0aW50LWNvbG9yKCRvcmFuZ2UsIDIwJSkgIWRlZmF1bHQ7XFxuJG9yYW5nZS01MDA6ICRvcmFuZ2UgIWRlZmF1bHQ7XFxuJG9yYW5nZS02MDA6IHNoYWRlLWNvbG9yKCRvcmFuZ2UsIDIwJSkgIWRlZmF1bHQ7XFxuJG9yYW5nZS03MDA6IHNoYWRlLWNvbG9yKCRvcmFuZ2UsIDQwJSkgIWRlZmF1bHQ7XFxuJG9yYW5nZS04MDA6IHNoYWRlLWNvbG9yKCRvcmFuZ2UsIDYwJSkgIWRlZmF1bHQ7XFxuJG9yYW5nZS05MDA6IHNoYWRlLWNvbG9yKCRvcmFuZ2UsIDgwJSkgIWRlZmF1bHQ7XFxuXFxuJHllbGxvdy0xMDA6IHRpbnQtY29sb3IoJHllbGxvdywgODAlKSAhZGVmYXVsdDtcXG4keWVsbG93LTIwMDogdGludC1jb2xvcigkeWVsbG93LCA2MCUpICFkZWZhdWx0O1xcbiR5ZWxsb3ctMzAwOiB0aW50LWNvbG9yKCR5ZWxsb3csIDQwJSkgIWRlZmF1bHQ7XFxuJHllbGxvdy00MDA6IHRpbnQtY29sb3IoJHllbGxvdywgMjAlKSAhZGVmYXVsdDtcXG4keWVsbG93LTUwMDogJHllbGxvdyAhZGVmYXVsdDtcXG4keWVsbG93LTYwMDogc2hhZGUtY29sb3IoJHllbGxvdywgMjAlKSAhZGVmYXVsdDtcXG4keWVsbG93LTcwMDogc2hhZGUtY29sb3IoJHllbGxvdywgNDAlKSAhZGVmYXVsdDtcXG4keWVsbG93LTgwMDogc2hhZGUtY29sb3IoJHllbGxvdywgNjAlKSAhZGVmYXVsdDtcXG4keWVsbG93LTkwMDogc2hhZGUtY29sb3IoJHllbGxvdywgODAlKSAhZGVmYXVsdDtcXG5cXG4kZ3JlZW4tMTAwOiB0aW50LWNvbG9yKCRncmVlbiwgODAlKSAhZGVmYXVsdDtcXG4kZ3JlZW4tMjAwOiB0aW50LWNvbG9yKCRncmVlbiwgNjAlKSAhZGVmYXVsdDtcXG4kZ3JlZW4tMzAwOiB0aW50LWNvbG9yKCRncmVlbiwgNDAlKSAhZGVmYXVsdDtcXG4kZ3JlZW4tNDAwOiB0aW50LWNvbG9yKCRncmVlbiwgMjAlKSAhZGVmYXVsdDtcXG4kZ3JlZW4tNTAwOiAkZ3JlZW4gIWRlZmF1bHQ7XFxuJGdyZWVuLTYwMDogc2hhZGUtY29sb3IoJGdyZWVuLCAyMCUpICFkZWZhdWx0O1xcbiRncmVlbi03MDA6IHNoYWRlLWNvbG9yKCRncmVlbiwgNDAlKSAhZGVmYXVsdDtcXG4kZ3JlZW4tODAwOiBzaGFkZS1jb2xvcigkZ3JlZW4sIDYwJSkgIWRlZmF1bHQ7XFxuJGdyZWVuLTkwMDogc2hhZGUtY29sb3IoJGdyZWVuLCA4MCUpICFkZWZhdWx0O1xcblxcbiR0ZWFsLTEwMDogdGludC1jb2xvcigkdGVhbCwgODAlKSAhZGVmYXVsdDtcXG4kdGVhbC0yMDA6IHRpbnQtY29sb3IoJHRlYWwsIDYwJSkgIWRlZmF1bHQ7XFxuJHRlYWwtMzAwOiB0aW50LWNvbG9yKCR0ZWFsLCA0MCUpICFkZWZhdWx0O1xcbiR0ZWFsLTQwMDogdGludC1jb2xvcigkdGVhbCwgMjAlKSAhZGVmYXVsdDtcXG4kdGVhbC01MDA6ICR0ZWFsICFkZWZhdWx0O1xcbiR0ZWFsLTYwMDogc2hhZGUtY29sb3IoJHRlYWwsIDIwJSkgIWRlZmF1bHQ7XFxuJHRlYWwtNzAwOiBzaGFkZS1jb2xvcigkdGVhbCwgNDAlKSAhZGVmYXVsdDtcXG4kdGVhbC04MDA6IHNoYWRlLWNvbG9yKCR0ZWFsLCA2MCUpICFkZWZhdWx0O1xcbiR0ZWFsLTkwMDogc2hhZGUtY29sb3IoJHRlYWwsIDgwJSkgIWRlZmF1bHQ7XFxuXFxuJGN5YW4tMTAwOiB0aW50LWNvbG9yKCRjeWFuLCA4MCUpICFkZWZhdWx0O1xcbiRjeWFuLTIwMDogdGludC1jb2xvcigkY3lhbiwgNjAlKSAhZGVmYXVsdDtcXG4kY3lhbi0zMDA6IHRpbnQtY29sb3IoJGN5YW4sIDQwJSkgIWRlZmF1bHQ7XFxuJGN5YW4tNDAwOiB0aW50LWNvbG9yKCRjeWFuLCAyMCUpICFkZWZhdWx0O1xcbiRjeWFuLTUwMDogJGN5YW4gIWRlZmF1bHQ7XFxuJGN5YW4tNjAwOiBzaGFkZS1jb2xvcigkY3lhbiwgMjAlKSAhZGVmYXVsdDtcXG4kY3lhbi03MDA6IHNoYWRlLWNvbG9yKCRjeWFuLCA0MCUpICFkZWZhdWx0O1xcbiRjeWFuLTgwMDogc2hhZGUtY29sb3IoJGN5YW4sIDYwJSkgIWRlZmF1bHQ7XFxuJGN5YW4tOTAwOiBzaGFkZS1jb2xvcigkY3lhbiwgODAlKSAhZGVmYXVsdDtcXG5cXG4kYmx1ZXM6IChcXG4gIFxcXCJibHVlLTEwMFxcXCI6ICRibHVlLTEwMCxcXG4gIFxcXCJibHVlLTIwMFxcXCI6ICRibHVlLTIwMCxcXG4gIFxcXCJibHVlLTMwMFxcXCI6ICRibHVlLTMwMCxcXG4gIFxcXCJibHVlLTQwMFxcXCI6ICRibHVlLTQwMCxcXG4gIFxcXCJibHVlLTUwMFxcXCI6ICRibHVlLTUwMCxcXG4gIFxcXCJibHVlLTYwMFxcXCI6ICRibHVlLTYwMCxcXG4gIFxcXCJibHVlLTcwMFxcXCI6ICRibHVlLTcwMCxcXG4gIFxcXCJibHVlLTgwMFxcXCI6ICRibHVlLTgwMCxcXG4gIFxcXCJibHVlLTkwMFxcXCI6ICRibHVlLTkwMFxcbikgIWRlZmF1bHQ7XFxuXFxuJGluZGlnb3M6IChcXG4gIFxcXCJpbmRpZ28tMTAwXFxcIjogJGluZGlnby0xMDAsXFxuICBcXFwiaW5kaWdvLTIwMFxcXCI6ICRpbmRpZ28tMjAwLFxcbiAgXFxcImluZGlnby0zMDBcXFwiOiAkaW5kaWdvLTMwMCxcXG4gIFxcXCJpbmRpZ28tNDAwXFxcIjogJGluZGlnby00MDAsXFxuICBcXFwiaW5kaWdvLTUwMFxcXCI6ICRpbmRpZ28tNTAwLFxcbiAgXFxcImluZGlnby02MDBcXFwiOiAkaW5kaWdvLTYwMCxcXG4gIFxcXCJpbmRpZ28tNzAwXFxcIjogJGluZGlnby03MDAsXFxuICBcXFwiaW5kaWdvLTgwMFxcXCI6ICRpbmRpZ28tODAwLFxcbiAgXFxcImluZGlnby05MDBcXFwiOiAkaW5kaWdvLTkwMFxcbikgIWRlZmF1bHQ7XFxuXFxuJHB1cnBsZXM6IChcXG4gIFxcXCJwdXJwbGUtMTAwXFxcIjogJHB1cnBsZS0xMDAsXFxuICBcXFwicHVycGxlLTIwMFxcXCI6ICRwdXJwbGUtMjAwLFxcbiAgXFxcInB1cnBsZS0zMDBcXFwiOiAkcHVycGxlLTMwMCxcXG4gIFxcXCJwdXJwbGUtNDAwXFxcIjogJHB1cnBsZS00MDAsXFxuICBcXFwicHVycGxlLTUwMFxcXCI6ICRwdXJwbGUtNTAwLFxcbiAgXFxcInB1cnBsZS02MDBcXFwiOiAkcHVycGxlLTYwMCxcXG4gIFxcXCJwdXJwbGUtNzAwXFxcIjogJHB1cnBsZS03MDAsXFxuICBcXFwicHVycGxlLTgwMFxcXCI6ICRwdXJwbGUtODAwLFxcbiAgXFxcInB1cnBsZS05MDBcXFwiOiAkcHVycGxlLTkwMFxcbikgIWRlZmF1bHQ7XFxuXFxuJHBpbmtzOiAoXFxuICBcXFwicGluay0xMDBcXFwiOiAkcGluay0xMDAsXFxuICBcXFwicGluay0yMDBcXFwiOiAkcGluay0yMDAsXFxuICBcXFwicGluay0zMDBcXFwiOiAkcGluay0zMDAsXFxuICBcXFwicGluay00MDBcXFwiOiAkcGluay00MDAsXFxuICBcXFwicGluay01MDBcXFwiOiAkcGluay01MDAsXFxuICBcXFwicGluay02MDBcXFwiOiAkcGluay02MDAsXFxuICBcXFwicGluay03MDBcXFwiOiAkcGluay03MDAsXFxuICBcXFwicGluay04MDBcXFwiOiAkcGluay04MDAsXFxuICBcXFwicGluay05MDBcXFwiOiAkcGluay05MDBcXG4pICFkZWZhdWx0O1xcblxcbiRyZWRzOiAoXFxuICBcXFwicmVkLTEwMFxcXCI6ICRyZWQtMTAwLFxcbiAgXFxcInJlZC0yMDBcXFwiOiAkcmVkLTIwMCxcXG4gIFxcXCJyZWQtMzAwXFxcIjogJHJlZC0zMDAsXFxuICBcXFwicmVkLTQwMFxcXCI6ICRyZWQtNDAwLFxcbiAgXFxcInJlZC01MDBcXFwiOiAkcmVkLTUwMCxcXG4gIFxcXCJyZWQtNjAwXFxcIjogJHJlZC02MDAsXFxuICBcXFwicmVkLTcwMFxcXCI6ICRyZWQtNzAwLFxcbiAgXFxcInJlZC04MDBcXFwiOiAkcmVkLTgwMCxcXG4gIFxcXCJyZWQtOTAwXFxcIjogJHJlZC05MDBcXG4pICFkZWZhdWx0O1xcblxcbiRvcmFuZ2VzOiAoXFxuICBcXFwib3JhbmdlLTEwMFxcXCI6ICRvcmFuZ2UtMTAwLFxcbiAgXFxcIm9yYW5nZS0yMDBcXFwiOiAkb3JhbmdlLTIwMCxcXG4gIFxcXCJvcmFuZ2UtMzAwXFxcIjogJG9yYW5nZS0zMDAsXFxuICBcXFwib3JhbmdlLTQwMFxcXCI6ICRvcmFuZ2UtNDAwLFxcbiAgXFxcIm9yYW5nZS01MDBcXFwiOiAkb3JhbmdlLTUwMCxcXG4gIFxcXCJvcmFuZ2UtNjAwXFxcIjogJG9yYW5nZS02MDAsXFxuICBcXFwib3JhbmdlLTcwMFxcXCI6ICRvcmFuZ2UtNzAwLFxcbiAgXFxcIm9yYW5nZS04MDBcXFwiOiAkb3JhbmdlLTgwMCxcXG4gIFxcXCJvcmFuZ2UtOTAwXFxcIjogJG9yYW5nZS05MDBcXG4pICFkZWZhdWx0O1xcblxcbiR5ZWxsb3dzOiAoXFxuICBcXFwieWVsbG93LTEwMFxcXCI6ICR5ZWxsb3ctMTAwLFxcbiAgXFxcInllbGxvdy0yMDBcXFwiOiAkeWVsbG93LTIwMCxcXG4gIFxcXCJ5ZWxsb3ctMzAwXFxcIjogJHllbGxvdy0zMDAsXFxuICBcXFwieWVsbG93LTQwMFxcXCI6ICR5ZWxsb3ctNDAwLFxcbiAgXFxcInllbGxvdy01MDBcXFwiOiAkeWVsbG93LTUwMCxcXG4gIFxcXCJ5ZWxsb3ctNjAwXFxcIjogJHllbGxvdy02MDAsXFxuICBcXFwieWVsbG93LTcwMFxcXCI6ICR5ZWxsb3ctNzAwLFxcbiAgXFxcInllbGxvdy04MDBcXFwiOiAkeWVsbG93LTgwMCxcXG4gIFxcXCJ5ZWxsb3ctOTAwXFxcIjogJHllbGxvdy05MDBcXG4pICFkZWZhdWx0O1xcblxcbiRncmVlbnM6IChcXG4gIFxcXCJncmVlbi0xMDBcXFwiOiAkZ3JlZW4tMTAwLFxcbiAgXFxcImdyZWVuLTIwMFxcXCI6ICRncmVlbi0yMDAsXFxuICBcXFwiZ3JlZW4tMzAwXFxcIjogJGdyZWVuLTMwMCxcXG4gIFxcXCJncmVlbi00MDBcXFwiOiAkZ3JlZW4tNDAwLFxcbiAgXFxcImdyZWVuLTUwMFxcXCI6ICRncmVlbi01MDAsXFxuICBcXFwiZ3JlZW4tNjAwXFxcIjogJGdyZWVuLTYwMCxcXG4gIFxcXCJncmVlbi03MDBcXFwiOiAkZ3JlZW4tNzAwLFxcbiAgXFxcImdyZWVuLTgwMFxcXCI6ICRncmVlbi04MDAsXFxuICBcXFwiZ3JlZW4tOTAwXFxcIjogJGdyZWVuLTkwMFxcbikgIWRlZmF1bHQ7XFxuXFxuJHRlYWxzOiAoXFxuICBcXFwidGVhbC0xMDBcXFwiOiAkdGVhbC0xMDAsXFxuICBcXFwidGVhbC0yMDBcXFwiOiAkdGVhbC0yMDAsXFxuICBcXFwidGVhbC0zMDBcXFwiOiAkdGVhbC0zMDAsXFxuICBcXFwidGVhbC00MDBcXFwiOiAkdGVhbC00MDAsXFxuICBcXFwidGVhbC01MDBcXFwiOiAkdGVhbC01MDAsXFxuICBcXFwidGVhbC02MDBcXFwiOiAkdGVhbC02MDAsXFxuICBcXFwidGVhbC03MDBcXFwiOiAkdGVhbC03MDAsXFxuICBcXFwidGVhbC04MDBcXFwiOiAkdGVhbC04MDAsXFxuICBcXFwidGVhbC05MDBcXFwiOiAkdGVhbC05MDBcXG4pICFkZWZhdWx0O1xcblxcbiRjeWFuczogKFxcbiAgXFxcImN5YW4tMTAwXFxcIjogJGN5YW4tMTAwLFxcbiAgXFxcImN5YW4tMjAwXFxcIjogJGN5YW4tMjAwLFxcbiAgXFxcImN5YW4tMzAwXFxcIjogJGN5YW4tMzAwLFxcbiAgXFxcImN5YW4tNDAwXFxcIjogJGN5YW4tNDAwLFxcbiAgXFxcImN5YW4tNTAwXFxcIjogJGN5YW4tNTAwLFxcbiAgXFxcImN5YW4tNjAwXFxcIjogJGN5YW4tNjAwLFxcbiAgXFxcImN5YW4tNzAwXFxcIjogJGN5YW4tNzAwLFxcbiAgXFxcImN5YW4tODAwXFxcIjogJGN5YW4tODAwLFxcbiAgXFxcImN5YW4tOTAwXFxcIjogJGN5YW4tOTAwXFxuKSAhZGVmYXVsdDtcXG4vLyBmdXN2LWVuYWJsZVxcblxcbi8vIHNjc3MtZG9jcy1zdGFydCB0aGVtZS1jb2xvci12YXJpYWJsZXNcXG4kcHJpbWFyeTogICAgICAgJGJsdWUgIWRlZmF1bHQ7XFxuJHNlY29uZGFyeTogICAgICRncmF5LTYwMCAhZGVmYXVsdDtcXG4kc3VjY2VzczogICAgICAgJGdyZWVuICFkZWZhdWx0O1xcbiRpbmZvOiAgICAgICAgICAkY3lhbiAhZGVmYXVsdDtcXG4kd2FybmluZzogICAgICAgJHllbGxvdyAhZGVmYXVsdDtcXG4kZGFuZ2VyOiAgICAgICAgJHJlZCAhZGVmYXVsdDtcXG4kbGlnaHQ6ICAgICAgICAgJGdyYXktMTAwICFkZWZhdWx0O1xcbiRkYXJrOiAgICAgICAgICAkZ3JheS05MDAgIWRlZmF1bHQ7XFxuLy8gc2Nzcy1kb2NzLWVuZCB0aGVtZS1jb2xvci12YXJpYWJsZXNcXG5cXG4vLyBzY3NzLWRvY3Mtc3RhcnQgdGhlbWUtY29sb3JzLW1hcFxcbiR0aGVtZS1jb2xvcnM6IChcXG4gIFxcXCJwcmltYXJ5XFxcIjogICAgJHByaW1hcnksXFxuICBcXFwic2Vjb25kYXJ5XFxcIjogICRzZWNvbmRhcnksXFxuICBcXFwic3VjY2Vzc1xcXCI6ICAgICRzdWNjZXNzLFxcbiAgXFxcImluZm9cXFwiOiAgICAgICAkaW5mbyxcXG4gIFxcXCJ3YXJuaW5nXFxcIjogICAgJHdhcm5pbmcsXFxuICBcXFwiZGFuZ2VyXFxcIjogICAgICRkYW5nZXIsXFxuICBcXFwibGlnaHRcXFwiOiAgICAgICRsaWdodCxcXG4gIFxcXCJkYXJrXFxcIjogICAgICAgJGRhcmtcXG4pICFkZWZhdWx0O1xcbi8vIHNjc3MtZG9jcy1lbmQgdGhlbWUtY29sb3JzLW1hcFxcblxcbi8vIHNjc3MtZG9jcy1zdGFydCB0aGVtZS10ZXh0LXZhcmlhYmxlc1xcbiRwcmltYXJ5LXRleHQtZW1waGFzaXM6ICAgc2hhZGUtY29sb3IoJHByaW1hcnksIDYwJSkgIWRlZmF1bHQ7XFxuJHNlY29uZGFyeS10ZXh0LWVtcGhhc2lzOiBzaGFkZS1jb2xvcigkc2Vjb25kYXJ5LCA2MCUpICFkZWZhdWx0O1xcbiRzdWNjZXNzLXRleHQtZW1waGFzaXM6ICAgc2hhZGUtY29sb3IoJHN1Y2Nlc3MsIDYwJSkgIWRlZmF1bHQ7XFxuJGluZm8tdGV4dC1lbXBoYXNpczogICAgICBzaGFkZS1jb2xvcigkaW5mbywgNjAlKSAhZGVmYXVsdDtcXG4kd2FybmluZy10ZXh0LWVtcGhhc2lzOiAgIHNoYWRlLWNvbG9yKCR3YXJuaW5nLCA2MCUpICFkZWZhdWx0O1xcbiRkYW5nZXItdGV4dC1lbXBoYXNpczogICAgc2hhZGUtY29sb3IoJGRhbmdlciwgNjAlKSAhZGVmYXVsdDtcXG4kbGlnaHQtdGV4dC1lbXBoYXNpczogICAgICRncmF5LTcwMCAhZGVmYXVsdDtcXG4kZGFyay10ZXh0LWVtcGhhc2lzOiAgICAgICRncmF5LTcwMCAhZGVmYXVsdDtcXG4vLyBzY3NzLWRvY3MtZW5kIHRoZW1lLXRleHQtdmFyaWFibGVzXFxuXFxuLy8gc2Nzcy1kb2NzLXN0YXJ0IHRoZW1lLWJnLXN1YnRsZS12YXJpYWJsZXNcXG4kcHJpbWFyeS1iZy1zdWJ0bGU6ICAgICAgIHRpbnQtY29sb3IoJHByaW1hcnksIDgwJSkgIWRlZmF1bHQ7XFxuJHNlY29uZGFyeS1iZy1zdWJ0bGU6ICAgICB0aW50LWNvbG9yKCRzZWNvbmRhcnksIDgwJSkgIWRlZmF1bHQ7XFxuJHN1Y2Nlc3MtYmctc3VidGxlOiAgICAgICB0aW50LWNvbG9yKCRzdWNjZXNzLCA4MCUpICFkZWZhdWx0O1xcbiRpbmZvLWJnLXN1YnRsZTogICAgICAgICAgdGludC1jb2xvcigkaW5mbywgODAlKSAhZGVmYXVsdDtcXG4kd2FybmluZy1iZy1zdWJ0bGU6ICAgICAgIHRpbnQtY29sb3IoJHdhcm5pbmcsIDgwJSkgIWRlZmF1bHQ7XFxuJGRhbmdlci1iZy1zdWJ0bGU6ICAgICAgICB0aW50LWNvbG9yKCRkYW5nZXIsIDgwJSkgIWRlZmF1bHQ7XFxuJGxpZ2h0LWJnLXN1YnRsZTogICAgICAgICBtaXgoJGdyYXktMTAwLCAkd2hpdGUpICFkZWZhdWx0O1xcbiRkYXJrLWJnLXN1YnRsZTogICAgICAgICAgJGdyYXktNDAwICFkZWZhdWx0O1xcbi8vIHNjc3MtZG9jcy1lbmQgdGhlbWUtYmctc3VidGxlLXZhcmlhYmxlc1xcblxcbi8vIHNjc3MtZG9jcy1zdGFydCB0aGVtZS1ib3JkZXItc3VidGxlLXZhcmlhYmxlc1xcbiRwcmltYXJ5LWJvcmRlci1zdWJ0bGU6ICAgdGludC1jb2xvcigkcHJpbWFyeSwgNjAlKSAhZGVmYXVsdDtcXG4kc2Vjb25kYXJ5LWJvcmRlci1zdWJ0bGU6IHRpbnQtY29sb3IoJHNlY29uZGFyeSwgNjAlKSAhZGVmYXVsdDtcXG4kc3VjY2Vzcy1ib3JkZXItc3VidGxlOiAgIHRpbnQtY29sb3IoJHN1Y2Nlc3MsIDYwJSkgIWRlZmF1bHQ7XFxuJGluZm8tYm9yZGVyLXN1YnRsZTogICAgICB0aW50LWNvbG9yKCRpbmZvLCA2MCUpICFkZWZhdWx0O1xcbiR3YXJuaW5nLWJvcmRlci1zdWJ0bGU6ICAgdGludC1jb2xvcigkd2FybmluZywgNjAlKSAhZGVmYXVsdDtcXG4kZGFuZ2VyLWJvcmRlci1zdWJ0bGU6ICAgIHRpbnQtY29sb3IoJGRhbmdlciwgNjAlKSAhZGVmYXVsdDtcXG4kbGlnaHQtYm9yZGVyLXN1YnRsZTogICAgICRncmF5LTIwMCAhZGVmYXVsdDtcXG4kZGFyay1ib3JkZXItc3VidGxlOiAgICAgICRncmF5LTUwMCAhZGVmYXVsdDtcXG4vLyBzY3NzLWRvY3MtZW5kIHRoZW1lLWJvcmRlci1zdWJ0bGUtdmFyaWFibGVzXFxuXFxuLy8gQ2hhcmFjdGVycyB3aGljaCBhcmUgZXNjYXBlZCBieSB0aGUgZXNjYXBlLXN2ZyBmdW5jdGlvblxcbiRlc2NhcGVkLWNoYXJhY3RlcnM6IChcXG4gIChcXFwiPFxcXCIsIFxcXCIlM2NcXFwiKSxcXG4gIChcXFwiPlxcXCIsIFxcXCIlM2VcXFwiKSxcXG4gIChcXFwiI1xcXCIsIFxcXCIlMjNcXFwiKSxcXG4gIChcXFwiKFxcXCIsIFxcXCIlMjhcXFwiKSxcXG4gIChcXFwiKVxcXCIsIFxcXCIlMjlcXFwiKSxcXG4pICFkZWZhdWx0O1xcblxcbi8vIE9wdGlvbnNcXG4vL1xcbi8vIFF1aWNrbHkgbW9kaWZ5IGdsb2JhbCBzdHlsaW5nIGJ5IGVuYWJsaW5nIG9yIGRpc2FibGluZyBvcHRpb25hbCBmZWF0dXJlcy5cXG5cXG4kZW5hYmxlLWNhcmV0OiAgICAgICAgICAgICAgICB0cnVlICFkZWZhdWx0O1xcbiRlbmFibGUtcm91bmRlZDogICAgICAgICAgICAgIHRydWUgIWRlZmF1bHQ7XFxuJGVuYWJsZS1zaGFkb3dzOiAgICAgICAgICAgICAgZmFsc2UgIWRlZmF1bHQ7XFxuJGVuYWJsZS1ncmFkaWVudHM6ICAgICAgICAgICAgZmFsc2UgIWRlZmF1bHQ7XFxuJGVuYWJsZS10cmFuc2l0aW9uczogICAgICAgICAgdHJ1ZSAhZGVmYXVsdDtcXG4kZW5hYmxlLXJlZHVjZWQtbW90aW9uOiAgICAgICB0cnVlICFkZWZhdWx0O1xcbiRlbmFibGUtc21vb3RoLXNjcm9sbDogICAgICAgIHRydWUgIWRlZmF1bHQ7XFxuJGVuYWJsZS1ncmlkLWNsYXNzZXM6ICAgICAgICAgdHJ1ZSAhZGVmYXVsdDtcXG4kZW5hYmxlLWNvbnRhaW5lci1jbGFzc2VzOiAgICB0cnVlICFkZWZhdWx0O1xcbiRlbmFibGUtY3NzZ3JpZDogICAgICAgICAgICAgIGZhbHNlICFkZWZhdWx0O1xcbiRlbmFibGUtYnV0dG9uLXBvaW50ZXJzOiAgICAgIHRydWUgIWRlZmF1bHQ7XFxuJGVuYWJsZS1yZnM6ICAgICAgICAgICAgICAgICAgdHJ1ZSAhZGVmYXVsdDtcXG4kZW5hYmxlLXZhbGlkYXRpb24taWNvbnM6ICAgICB0cnVlICFkZWZhdWx0O1xcbiRlbmFibGUtbmVnYXRpdmUtbWFyZ2luczogICAgIGZhbHNlICFkZWZhdWx0O1xcbiRlbmFibGUtZGVwcmVjYXRpb24tbWVzc2FnZXM6IHRydWUgIWRlZmF1bHQ7XFxuJGVuYWJsZS1pbXBvcnRhbnQtdXRpbGl0aWVzOiAgdHJ1ZSAhZGVmYXVsdDtcXG5cXG4kZW5hYmxlLWRhcmstbW9kZTogICAgICAgICAgICB0cnVlICFkZWZhdWx0O1xcbiRjb2xvci1tb2RlLXR5cGU6ICAgICAgICAgICAgIGRhdGEgIWRlZmF1bHQ7IC8vIGBkYXRhYCBvciBgbWVkaWEtcXVlcnlgXFxuXFxuLy8gUHJlZml4IGZvciA6cm9vdCBDU1MgdmFyaWFibGVzXFxuXFxuJHZhcmlhYmxlLXByZWZpeDogICAgICAgICAgICAgYnMtICFkZWZhdWx0OyAvLyBEZXByZWNhdGVkIGluIHY1LjIuMCBmb3IgdGhlIHNob3J0ZXIgYCRwcmVmaXhgXFxuJHByZWZpeDogICAgICAgICAgICAgICAgICAgICAgJHZhcmlhYmxlLXByZWZpeCAhZGVmYXVsdDtcXG5cXG4vLyBHcmFkaWVudFxcbi8vXFxuLy8gVGhlIGdyYWRpZW50IHdoaWNoIGlzIGFkZGVkIHRvIGNvbXBvbmVudHMgaWYgYCRlbmFibGUtZ3JhZGllbnRzYCBpcyBgdHJ1ZWBcXG4vLyBUaGlzIGdyYWRpZW50IGlzIGFsc28gYWRkZWQgdG8gZWxlbWVudHMgd2l0aCBgLmJnLWdyYWRpZW50YFxcbi8vIHNjc3MtZG9jcy1zdGFydCB2YXJpYWJsZS1ncmFkaWVudFxcbiRncmFkaWVudDogbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgkd2hpdGUsIC4xNSksIHJnYmEoJHdoaXRlLCAwKSkgIWRlZmF1bHQ7XFxuLy8gc2Nzcy1kb2NzLWVuZCB2YXJpYWJsZS1ncmFkaWVudFxcblxcbi8vIFNwYWNpbmdcXG4vL1xcbi8vIENvbnRyb2wgdGhlIGRlZmF1bHQgc3R5bGluZyBvZiBtb3N0IEJvb3RzdHJhcCBlbGVtZW50cyBieSBtb2RpZnlpbmcgdGhlc2VcXG4vLyB2YXJpYWJsZXMuIE1vc3RseSBmb2N1c2VkIG9uIHNwYWNpbmcuXFxuLy8gWW91IGNhbiBhZGQgbW9yZSBlbnRyaWVzIHRvIHRoZSAkc3BhY2VycyBtYXAsIHNob3VsZCB5b3UgbmVlZCBtb3JlIHZhcmlhdGlvbi5cXG5cXG4vLyBzY3NzLWRvY3Mtc3RhcnQgc3BhY2VyLXZhcmlhYmxlcy1tYXBzXFxuJHNwYWNlcjogMXJlbSAhZGVmYXVsdDtcXG4kc3BhY2VyczogKFxcbiAgMDogMCxcXG4gIDE6ICRzcGFjZXIgKiAuMjUsXFxuICAyOiAkc3BhY2VyICogLjUsXFxuICAzOiAkc3BhY2VyLFxcbiAgNDogJHNwYWNlciAqIDEuNSxcXG4gIDU6ICRzcGFjZXIgKiAzLFxcbikgIWRlZmF1bHQ7XFxuLy8gc2Nzcy1kb2NzLWVuZCBzcGFjZXItdmFyaWFibGVzLW1hcHNcXG5cXG4vLyBQb3NpdGlvblxcbi8vXFxuLy8gRGVmaW5lIHRoZSBlZGdlIHBvc2l0aW9uaW5nIGFuY2hvcnMgb2YgdGhlIHBvc2l0aW9uIHV0aWxpdGllcy5cXG5cXG4vLyBzY3NzLWRvY3Mtc3RhcnQgcG9zaXRpb24tbWFwXFxuJHBvc2l0aW9uLXZhbHVlczogKFxcbiAgMDogMCxcXG4gIDUwOiA1MCUsXFxuICAxMDA6IDEwMCVcXG4pICFkZWZhdWx0O1xcbi8vIHNjc3MtZG9jcy1lbmQgcG9zaXRpb24tbWFwXFxuXFxuLy8gQm9keVxcbi8vXFxuLy8gU2V0dGluZ3MgZm9yIHRoZSBgPGJvZHk+YCBlbGVtZW50LlxcblxcbiRib2R5LXRleHQtYWxpZ246ICAgICAgICAgICBudWxsICFkZWZhdWx0O1xcbiRib2R5LWNvbG9yOiAgICAgICAgICAgICAgICAkZ3JheS05MDAgIWRlZmF1bHQ7XFxuJGJvZHktYmc6ICAgICAgICAgICAgICAgICAgICR3aGl0ZSAhZGVmYXVsdDtcXG5cXG4kYm9keS1zZWNvbmRhcnktY29sb3I6ICAgICAgcmdiYSgkYm9keS1jb2xvciwgLjc1KSAhZGVmYXVsdDtcXG4kYm9keS1zZWNvbmRhcnktYmc6ICAgICAgICAgJGdyYXktMjAwICFkZWZhdWx0O1xcblxcbiRib2R5LXRlcnRpYXJ5LWNvbG9yOiAgICAgICByZ2JhKCRib2R5LWNvbG9yLCAuNSkgIWRlZmF1bHQ7XFxuJGJvZHktdGVydGlhcnktYmc6ICAgICAgICAgICRncmF5LTEwMCAhZGVmYXVsdDtcXG5cXG4kYm9keS1lbXBoYXNpcy1jb2xvcjogICAgICAgJGJsYWNrICFkZWZhdWx0O1xcblxcbi8vIExpbmtzXFxuLy9cXG4vLyBTdHlsZSBhbmNob3IgZWxlbWVudHMuXFxuXFxuJGxpbmstY29sb3I6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHByaW1hcnkgIWRlZmF1bHQ7XFxuJGxpbmstZGVjb3JhdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgdW5kZXJsaW5lICFkZWZhdWx0O1xcbiRsaW5rLXNoYWRlLXBlcmNlbnRhZ2U6ICAgICAgICAgICAgICAgICAgIDIwJSAhZGVmYXVsdDtcXG4kbGluay1ob3Zlci1jb2xvcjogICAgICAgICAgICAgICAgICAgICAgICBzaGlmdC1jb2xvcigkbGluay1jb2xvciwgJGxpbmstc2hhZGUtcGVyY2VudGFnZSkgIWRlZmF1bHQ7XFxuJGxpbmstaG92ZXItZGVjb3JhdGlvbjogICAgICAgICAgICAgICAgICAgbnVsbCAhZGVmYXVsdDtcXG5cXG4kc3RyZXRjaGVkLWxpbmstcHNldWRvLWVsZW1lbnQ6ICAgICAgICAgICBhZnRlciAhZGVmYXVsdDtcXG4kc3RyZXRjaGVkLWxpbmstei1pbmRleDogICAgICAgICAgICAgICAgICAxICFkZWZhdWx0O1xcblxcbi8vIEljb24gbGlua3NcXG4vLyBzY3NzLWRvY3Mtc3RhcnQgaWNvbi1saW5rLXZhcmlhYmxlc1xcbiRpY29uLWxpbmstZ2FwOiAgICAgICAgICAgICAgIC4zNzVyZW0gIWRlZmF1bHQ7XFxuJGljb24tbGluay11bmRlcmxpbmUtb2Zmc2V0OiAgLjI1ZW0gIWRlZmF1bHQ7XFxuJGljb24tbGluay1pY29uLXNpemU6ICAgICAgICAgMWVtICFkZWZhdWx0O1xcbiRpY29uLWxpbmstaWNvbi10cmFuc2l0aW9uOiAgIC4ycyBlYXNlLWluLW91dCB0cmFuc2Zvcm0gIWRlZmF1bHQ7XFxuJGljb24tbGluay1pY29uLXRyYW5zZm9ybTogICAgdHJhbnNsYXRlM2QoLjI1ZW0sIDAsIDApICFkZWZhdWx0O1xcbi8vIHNjc3MtZG9jcy1lbmQgaWNvbi1saW5rLXZhcmlhYmxlc1xcblxcbi8vIFBhcmFncmFwaHNcXG4vL1xcbi8vIFN0eWxlIHAgZWxlbWVudC5cXG5cXG4kcGFyYWdyYXBoLW1hcmdpbi1ib3R0b206ICAgMXJlbSAhZGVmYXVsdDtcXG5cXG5cXG4vLyBHcmlkIGJyZWFrcG9pbnRzXFxuLy9cXG4vLyBEZWZpbmUgdGhlIG1pbmltdW0gZGltZW5zaW9ucyBhdCB3aGljaCB5b3VyIGxheW91dCB3aWxsIGNoYW5nZSxcXG4vLyBhZGFwdGluZyB0byBkaWZmZXJlbnQgc2NyZWVuIHNpemVzLCBmb3IgdXNlIGluIG1lZGlhIHF1ZXJpZXMuXFxuXFxuLy8gc2Nzcy1kb2NzLXN0YXJ0IGdyaWQtYnJlYWtwb2ludHNcXG4kZ3JpZC1icmVha3BvaW50czogKFxcbiAgeHM6IDAsXFxuICBzbTogNTc2cHgsXFxuICBtZDogNzY4cHgsXFxuICBsZzogOTkycHgsXFxuICB4bDogMTIwMHB4LFxcbiAgeHhsOiAxNDAwcHhcXG4pICFkZWZhdWx0O1xcbi8vIHNjc3MtZG9jcy1lbmQgZ3JpZC1icmVha3BvaW50c1xcblxcbkBpbmNsdWRlIF9hc3NlcnQtYXNjZW5kaW5nKCRncmlkLWJyZWFrcG9pbnRzLCBcXFwiJGdyaWQtYnJlYWtwb2ludHNcXFwiKTtcXG5AaW5jbHVkZSBfYXNzZXJ0LXN0YXJ0cy1hdC16ZXJvKCRncmlkLWJyZWFrcG9pbnRzLCBcXFwiJGdyaWQtYnJlYWtwb2ludHNcXFwiKTtcXG5cXG5cXG4vLyBHcmlkIGNvbnRhaW5lcnNcXG4vL1xcbi8vIERlZmluZSB0aGUgbWF4aW11bSB3aWR0aCBvZiBgLmNvbnRhaW5lcmAgZm9yIGRpZmZlcmVudCBzY3JlZW4gc2l6ZXMuXFxuXFxuLy8gc2Nzcy1kb2NzLXN0YXJ0IGNvbnRhaW5lci1tYXgtd2lkdGhzXFxuJGNvbnRhaW5lci1tYXgtd2lkdGhzOiAoXFxuICBzbTogNTQwcHgsXFxuICBtZDogNzIwcHgsXFxuICBsZzogOTYwcHgsXFxuICB4bDogMTE0MHB4LFxcbiAgeHhsOiAxMzIwcHhcXG4pICFkZWZhdWx0O1xcbi8vIHNjc3MtZG9jcy1lbmQgY29udGFpbmVyLW1heC13aWR0aHNcXG5cXG5AaW5jbHVkZSBfYXNzZXJ0LWFzY2VuZGluZygkY29udGFpbmVyLW1heC13aWR0aHMsIFxcXCIkY29udGFpbmVyLW1heC13aWR0aHNcXFwiKTtcXG5cXG5cXG4vLyBHcmlkIGNvbHVtbnNcXG4vL1xcbi8vIFNldCB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgYW5kIHNwZWNpZnkgdGhlIHdpZHRoIG9mIHRoZSBndXR0ZXJzLlxcblxcbiRncmlkLWNvbHVtbnM6ICAgICAgICAgICAgICAgIDEyICFkZWZhdWx0O1xcbiRncmlkLWd1dHRlci13aWR0aDogICAgICAgICAgIDEuNXJlbSAhZGVmYXVsdDtcXG4kZ3JpZC1yb3ctY29sdW1uczogICAgICAgICAgICA2ICFkZWZhdWx0O1xcblxcbi8vIENvbnRhaW5lciBwYWRkaW5nXFxuXFxuJGNvbnRhaW5lci1wYWRkaW5nLXg6ICRncmlkLWd1dHRlci13aWR0aCAhZGVmYXVsdDtcXG5cXG5cXG4vLyBDb21wb25lbnRzXFxuLy9cXG4vLyBEZWZpbmUgY29tbW9uIHBhZGRpbmcgYW5kIGJvcmRlciByYWRpdXMgc2l6ZXMgYW5kIG1vcmUuXFxuXFxuLy8gc2Nzcy1kb2NzLXN0YXJ0IGJvcmRlci12YXJpYWJsZXNcXG4kYm9yZGVyLXdpZHRoOiAgICAgICAgICAgICAgICAxcHggIWRlZmF1bHQ7XFxuJGJvcmRlci13aWR0aHM6IChcXG4gIDE6IDFweCxcXG4gIDI6IDJweCxcXG4gIDM6IDNweCxcXG4gIDQ6IDRweCxcXG4gIDU6IDVweFxcbikgIWRlZmF1bHQ7XFxuJGJvcmRlci1zdHlsZTogICAgICAgICAgICAgICAgc29saWQgIWRlZmF1bHQ7XFxuJGJvcmRlci1jb2xvcjogICAgICAgICAgICAgICAgJGdyYXktMzAwICFkZWZhdWx0O1xcbiRib3JkZXItY29sb3ItdHJhbnNsdWNlbnQ6ICAgIHJnYmEoJGJsYWNrLCAuMTc1KSAhZGVmYXVsdDtcXG4vLyBzY3NzLWRvY3MtZW5kIGJvcmRlci12YXJpYWJsZXNcXG5cXG4vLyBzY3NzLWRvY3Mtc3RhcnQgYm9yZGVyLXJhZGl1cy12YXJpYWJsZXNcXG4kYm9yZGVyLXJhZGl1czogICAgICAgICAgICAgICAuMzc1cmVtICFkZWZhdWx0O1xcbiRib3JkZXItcmFkaXVzLXNtOiAgICAgICAgICAgIC4yNXJlbSAhZGVmYXVsdDtcXG4kYm9yZGVyLXJhZGl1cy1sZzogICAgICAgICAgICAuNXJlbSAhZGVmYXVsdDtcXG4kYm9yZGVyLXJhZGl1cy14bDogICAgICAgICAgICAxcmVtICFkZWZhdWx0O1xcbiRib3JkZXItcmFkaXVzLXh4bDogICAgICAgICAgIDJyZW0gIWRlZmF1bHQ7XFxuJGJvcmRlci1yYWRpdXMtcGlsbDogICAgICAgICAgNTByZW0gIWRlZmF1bHQ7XFxuLy8gc2Nzcy1kb2NzLWVuZCBib3JkZXItcmFkaXVzLXZhcmlhYmxlc1xcbi8vIGZ1c3YtZGlzYWJsZVxcbiRib3JkZXItcmFkaXVzLTJ4bDogICAgICAgICAgICRib3JkZXItcmFkaXVzLXh4bCAhZGVmYXVsdDsgLy8gRGVwcmVjYXRlZCBpbiB2NS4zLjBcXG4vLyBmdXN2LWVuYWJsZVxcblxcbi8vIHNjc3MtZG9jcy1zdGFydCBib3gtc2hhZG93LXZhcmlhYmxlc1xcbiRib3gtc2hhZG93OiAgICAgICAgICAgICAgICAgIDAgLjVyZW0gMXJlbSByZ2JhKCRibGFjaywgLjE1KSAhZGVmYXVsdDtcXG4kYm94LXNoYWRvdy1zbTogICAgICAgICAgICAgICAwIC4xMjVyZW0gLjI1cmVtIHJnYmEoJGJsYWNrLCAuMDc1KSAhZGVmYXVsdDtcXG4kYm94LXNoYWRvdy1sZzogICAgICAgICAgICAgICAwIDFyZW0gM3JlbSByZ2JhKCRibGFjaywgLjE3NSkgIWRlZmF1bHQ7XFxuJGJveC1zaGFkb3ctaW5zZXQ6ICAgICAgICAgICAgaW5zZXQgMCAxcHggMnB4IHJnYmEoJGJsYWNrLCAuMDc1KSAhZGVmYXVsdDtcXG4vLyBzY3NzLWRvY3MtZW5kIGJveC1zaGFkb3ctdmFyaWFibGVzXFxuXFxuJGNvbXBvbmVudC1hY3RpdmUtY29sb3I6ICAgICAgJHdoaXRlICFkZWZhdWx0O1xcbiRjb21wb25lbnQtYWN0aXZlLWJnOiAgICAgICAgICRwcmltYXJ5ICFkZWZhdWx0O1xcblxcbi8vIHNjc3MtZG9jcy1zdGFydCBmb2N1cy1yaW5nLXZhcmlhYmxlc1xcbiRmb2N1cy1yaW5nLXdpZHRoOiAgICAgIC4yNXJlbSAhZGVmYXVsdDtcXG4kZm9jdXMtcmluZy1vcGFjaXR5OiAgICAuMjUgIWRlZmF1bHQ7XFxuJGZvY3VzLXJpbmctY29sb3I6ICAgICAgcmdiYSgkcHJpbWFyeSwgJGZvY3VzLXJpbmctb3BhY2l0eSkgIWRlZmF1bHQ7XFxuJGZvY3VzLXJpbmctYmx1cjogICAgICAgMCAhZGVmYXVsdDtcXG4kZm9jdXMtcmluZy1ib3gtc2hhZG93OiAwIDAgJGZvY3VzLXJpbmctYmx1ciAkZm9jdXMtcmluZy13aWR0aCAkZm9jdXMtcmluZy1jb2xvciAhZGVmYXVsdDtcXG4vLyBzY3NzLWRvY3MtZW5kIGZvY3VzLXJpbmctdmFyaWFibGVzXFxuXFxuLy8gc2Nzcy1kb2NzLXN0YXJ0IGNhcmV0LXZhcmlhYmxlc1xcbiRjYXJldC13aWR0aDogICAgICAgICAgICAgICAgIC4zZW0gIWRlZmF1bHQ7XFxuJGNhcmV0LXZlcnRpY2FsLWFsaWduOiAgICAgICAgJGNhcmV0LXdpZHRoICogLjg1ICFkZWZhdWx0O1xcbiRjYXJldC1zcGFjaW5nOiAgICAgICAgICAgICAgICRjYXJldC13aWR0aCAqIC44NSAhZGVmYXVsdDtcXG4vLyBzY3NzLWRvY3MtZW5kIGNhcmV0LXZhcmlhYmxlc1xcblxcbiR0cmFuc2l0aW9uLWJhc2U6ICAgICAgICAgICAgIGFsbCAuMnMgZWFzZS1pbi1vdXQgIWRlZmF1bHQ7XFxuJHRyYW5zaXRpb24tZmFkZTogICAgICAgICAgICAgb3BhY2l0eSAuMTVzIGxpbmVhciAhZGVmYXVsdDtcXG4vLyBzY3NzLWRvY3Mtc3RhcnQgY29sbGFwc2UtdHJhbnNpdGlvblxcbiR0cmFuc2l0aW9uLWNvbGxhcHNlOiAgICAgICAgIGhlaWdodCAuMzVzIGVhc2UgIWRlZmF1bHQ7XFxuJHRyYW5zaXRpb24tY29sbGFwc2Utd2lkdGg6ICAgd2lkdGggLjM1cyBlYXNlICFkZWZhdWx0O1xcbi8vIHNjc3MtZG9jcy1lbmQgY29sbGFwc2UtdHJhbnNpdGlvblxcblxcbi8vIHN0eWxlbGludC1kaXNhYmxlIGZ1bmN0aW9uLWRpc2FsbG93ZWQtbGlzdFxcbi8vIHNjc3MtZG9jcy1zdGFydCBhc3BlY3QtcmF0aW9zXFxuJGFzcGVjdC1yYXRpb3M6IChcXG4gIFxcXCIxeDFcXFwiOiAxMDAlLFxcbiAgXFxcIjR4M1xcXCI6IGNhbGMoMyAvIDQgKiAxMDAlKSxcXG4gIFxcXCIxNng5XFxcIjogY2FsYyg5IC8gMTYgKiAxMDAlKSxcXG4gIFxcXCIyMXg5XFxcIjogY2FsYyg5IC8gMjEgKiAxMDAlKVxcbikgIWRlZmF1bHQ7XFxuLy8gc2Nzcy1kb2NzLWVuZCBhc3BlY3QtcmF0aW9zXFxuLy8gc3R5bGVsaW50LWVuYWJsZSBmdW5jdGlvbi1kaXNhbGxvd2VkLWxpc3RcXG5cXG4vLyBUeXBvZ3JhcGh5XFxuLy9cXG4vLyBGb250LCBsaW5lLWhlaWdodCwgYW5kIGNvbG9yIGZvciBib2R5IHRleHQsIGhlYWRpbmdzLCBhbmQgbW9yZS5cXG5cXG4vLyBzY3NzLWRvY3Mtc3RhcnQgZm9udC12YXJpYWJsZXNcXG4vLyBzdHlsZWxpbnQtZGlzYWJsZSB2YWx1ZS1rZXl3b3JkLWNhc2VcXG4kZm9udC1mYW1pbHktc2Fucy1zZXJpZjogICAgICBzeXN0ZW0tdWksIC1hcHBsZS1zeXN0ZW0sIFxcXCJTZWdvZSBVSVxcXCIsIFJvYm90bywgXFxcIkhlbHZldGljYSBOZXVlXFxcIiwgXFxcIk5vdG8gU2Fuc1xcXCIsIFxcXCJMaWJlcmF0aW9uIFNhbnNcXFwiLCBBcmlhbCwgc2Fucy1zZXJpZiwgXFxcIkFwcGxlIENvbG9yIEVtb2ppXFxcIiwgXFxcIlNlZ29lIFVJIEVtb2ppXFxcIiwgXFxcIlNlZ29lIFVJIFN5bWJvbFxcXCIsIFxcXCJOb3RvIENvbG9yIEVtb2ppXFxcIiAhZGVmYXVsdDtcXG4kZm9udC1mYW1pbHktbW9ub3NwYWNlOiAgICAgICBTRk1vbm8tUmVndWxhciwgTWVubG8sIE1vbmFjbywgQ29uc29sYXMsIFxcXCJMaWJlcmF0aW9uIE1vbm9cXFwiLCBcXFwiQ291cmllciBOZXdcXFwiLCBtb25vc3BhY2UgIWRlZmF1bHQ7XFxuLy8gc3R5bGVsaW50LWVuYWJsZSB2YWx1ZS1rZXl3b3JkLWNhc2VcXG4kZm9udC1mYW1pbHktYmFzZTogICAgICAgICAgICB2YXIoLS0jeyRwcmVmaXh9Zm9udC1zYW5zLXNlcmlmKSAhZGVmYXVsdDtcXG4kZm9udC1mYW1pbHktY29kZTogICAgICAgICAgICB2YXIoLS0jeyRwcmVmaXh9Zm9udC1tb25vc3BhY2UpICFkZWZhdWx0O1xcblxcbi8vICRmb250LXNpemUtcm9vdCBhZmZlY3RzIHRoZSB2YWx1ZSBvZiBgcmVtYCwgd2hpY2ggaXMgdXNlZCBmb3IgYXMgd2VsbCBmb250IHNpemVzLCBwYWRkaW5ncywgYW5kIG1hcmdpbnNcXG4vLyAkZm9udC1zaXplLWJhc2UgYWZmZWN0cyB0aGUgZm9udCBzaXplIG9mIHRoZSBib2R5IHRleHRcXG4kZm9udC1zaXplLXJvb3Q6ICAgICAgICAgICAgICBudWxsICFkZWZhdWx0O1xcbiRmb250LXNpemUtYmFzZTogICAgICAgICAgICAgIDFyZW0gIWRlZmF1bHQ7IC8vIEFzc3VtZXMgdGhlIGJyb3dzZXIgZGVmYXVsdCwgdHlwaWNhbGx5IGAxNnB4YFxcbiRmb250LXNpemUtc206ICAgICAgICAgICAgICAgICRmb250LXNpemUtYmFzZSAqIC44NzUgIWRlZmF1bHQ7XFxuJGZvbnQtc2l6ZS1sZzogICAgICAgICAgICAgICAgJGZvbnQtc2l6ZS1iYXNlICogMS4yNSAhZGVmYXVsdDtcXG5cXG4kZm9udC13ZWlnaHQtbGlnaHRlcjogICAgICAgICBsaWdodGVyICFkZWZhdWx0O1xcbiRmb250LXdlaWdodC1saWdodDogICAgICAgICAgIDMwMCAhZGVmYXVsdDtcXG4kZm9udC13ZWlnaHQtbm9ybWFsOiAgICAgICAgICA0MDAgIWRlZmF1bHQ7XFxuJGZvbnQtd2VpZ2h0LW1lZGl1bTogICAgICAgICAgNTAwICFkZWZhdWx0O1xcbiRmb250LXdlaWdodC1zZW1pYm9sZDogICAgICAgIDYwMCAhZGVmYXVsdDtcXG4kZm9udC13ZWlnaHQtYm9sZDogICAgICAgICAgICA3MDAgIWRlZmF1bHQ7XFxuJGZvbnQtd2VpZ2h0LWJvbGRlcjogICAgICAgICAgYm9sZGVyICFkZWZhdWx0O1xcblxcbiRmb250LXdlaWdodC1iYXNlOiAgICAgICAgICAgICRmb250LXdlaWdodC1ub3JtYWwgIWRlZmF1bHQ7XFxuXFxuJGxpbmUtaGVpZ2h0LWJhc2U6ICAgICAgICAgICAgMS41ICFkZWZhdWx0O1xcbiRsaW5lLWhlaWdodC1zbTogICAgICAgICAgICAgIDEuMjUgIWRlZmF1bHQ7XFxuJGxpbmUtaGVpZ2h0LWxnOiAgICAgICAgICAgICAgMiAhZGVmYXVsdDtcXG5cXG4kaDEtZm9udC1zaXplOiAgICAgICAgICAgICAgICAkZm9udC1zaXplLWJhc2UgKiAyLjUgIWRlZmF1bHQ7XFxuJGgyLWZvbnQtc2l6ZTogICAgICAgICAgICAgICAgJGZvbnQtc2l6ZS1iYXNlICogMiAhZGVmYXVsdDtcXG4kaDMtZm9udC1zaXplOiAgICAgICAgICAgICAgICAkZm9udC1zaXplLWJhc2UgKiAxLjc1ICFkZWZhdWx0O1xcbiRoNC1mb250LXNpemU6ICAgICAgICAgICAgICAgICRmb250LXNpemUtYmFzZSAqIDEuNSAhZGVmYXVsdDtcXG4kaDUtZm9udC1zaXplOiAgICAgICAgICAgICAgICAkZm9udC1zaXplLWJhc2UgKiAxLjI1ICFkZWZhdWx0O1xcbiRoNi1mb250LXNpemU6ICAgICAgICAgICAgICAgICRmb250LXNpemUtYmFzZSAhZGVmYXVsdDtcXG4vLyBzY3NzLWRvY3MtZW5kIGZvbnQtdmFyaWFibGVzXFxuXFxuLy8gc2Nzcy1kb2NzLXN0YXJ0IGZvbnQtc2l6ZXNcXG4kZm9udC1zaXplczogKFxcbiAgMTogJGgxLWZvbnQtc2l6ZSxcXG4gIDI6ICRoMi1mb250LXNpemUsXFxuICAzOiAkaDMtZm9udC1zaXplLFxcbiAgNDogJGg0LWZvbnQtc2l6ZSxcXG4gIDU6ICRoNS1mb250LXNpemUsXFxuICA2OiAkaDYtZm9udC1zaXplXFxuKSAhZGVmYXVsdDtcXG4vLyBzY3NzLWRvY3MtZW5kIGZvbnQtc2l6ZXNcXG5cXG4vLyBzY3NzLWRvY3Mtc3RhcnQgaGVhZGluZ3MtdmFyaWFibGVzXFxuJGhlYWRpbmdzLW1hcmdpbi1ib3R0b206ICAgICAgJHNwYWNlciAqIC41ICFkZWZhdWx0O1xcbiRoZWFkaW5ncy1mb250LWZhbWlseTogICAgICAgIG51bGwgIWRlZmF1bHQ7XFxuJGhlYWRpbmdzLWZvbnQtc3R5bGU6ICAgICAgICAgbnVsbCAhZGVmYXVsdDtcXG4kaGVhZGluZ3MtZm9udC13ZWlnaHQ6ICAgICAgICA1MDAgIWRlZmF1bHQ7XFxuJGhlYWRpbmdzLWxpbmUtaGVpZ2h0OiAgICAgICAgMS4yICFkZWZhdWx0O1xcbiRoZWFkaW5ncy1jb2xvcjogICAgICAgICAgICAgIGluaGVyaXQgIWRlZmF1bHQ7XFxuLy8gc2Nzcy1kb2NzLWVuZCBoZWFkaW5ncy12YXJpYWJsZXNcXG5cXG4vLyBzY3NzLWRvY3Mtc3RhcnQgZGlzcGxheS1oZWFkaW5nc1xcbiRkaXNwbGF5LWZvbnQtc2l6ZXM6IChcXG4gIDE6IDVyZW0sXFxuICAyOiA0LjVyZW0sXFxuICAzOiA0cmVtLFxcbiAgNDogMy41cmVtLFxcbiAgNTogM3JlbSxcXG4gIDY6IDIuNXJlbVxcbikgIWRlZmF1bHQ7XFxuXFxuJGRpc3BsYXktZm9udC1mYW1pbHk6IG51bGwgIWRlZmF1bHQ7XFxuJGRpc3BsYXktZm9udC1zdHlsZTogIG51bGwgIWRlZmF1bHQ7XFxuJGRpc3BsYXktZm9udC13ZWlnaHQ6IDMwMCAhZGVmYXVsdDtcXG4kZGlzcGxheS1saW5lLWhlaWdodDogJGhlYWRpbmdzLWxpbmUtaGVpZ2h0ICFkZWZhdWx0O1xcbi8vIHNjc3MtZG9jcy1lbmQgZGlzcGxheS1oZWFkaW5nc1xcblxcbi8vIHNjc3MtZG9jcy1zdGFydCB0eXBlLXZhcmlhYmxlc1xcbiRsZWFkLWZvbnQtc2l6ZTogICAgICAgICAgICAgICRmb250LXNpemUtYmFzZSAqIDEuMjUgIWRlZmF1bHQ7XFxuJGxlYWQtZm9udC13ZWlnaHQ6ICAgICAgICAgICAgMzAwICFkZWZhdWx0O1xcblxcbiRzbWFsbC1mb250LXNpemU6ICAgICAgICAgICAgIC44NzVlbSAhZGVmYXVsdDtcXG5cXG4kc3ViLXN1cC1mb250LXNpemU6ICAgICAgICAgICAuNzVlbSAhZGVmYXVsdDtcXG5cXG4vLyBmdXN2LWRpc2FibGVcXG4kdGV4dC1tdXRlZDogICAgICAgICAgICAgICAgICB2YXIoLS0jeyRwcmVmaXh9c2Vjb25kYXJ5LWNvbG9yKSAhZGVmYXVsdDsgLy8gRGVwcmVjYXRlZCBpbiA1LjMuMFxcbi8vIGZ1c3YtZW5hYmxlXFxuXFxuJGluaXRpYWxpc20tZm9udC1zaXplOiAgICAgICAgJHNtYWxsLWZvbnQtc2l6ZSAhZGVmYXVsdDtcXG5cXG4kYmxvY2txdW90ZS1tYXJnaW4teTogICAgICAgICAkc3BhY2VyICFkZWZhdWx0O1xcbiRibG9ja3F1b3RlLWZvbnQtc2l6ZTogICAgICAgICRmb250LXNpemUtYmFzZSAqIDEuMjUgIWRlZmF1bHQ7XFxuJGJsb2NrcXVvdGUtZm9vdGVyLWNvbG9yOiAgICAgJGdyYXktNjAwICFkZWZhdWx0O1xcbiRibG9ja3F1b3RlLWZvb3Rlci1mb250LXNpemU6ICRzbWFsbC1mb250LXNpemUgIWRlZmF1bHQ7XFxuXFxuJGhyLW1hcmdpbi15OiAgICAgICAgICAgICAgICAgJHNwYWNlciAhZGVmYXVsdDtcXG4kaHItY29sb3I6ICAgICAgICAgICAgICAgICAgICBpbmhlcml0ICFkZWZhdWx0O1xcblxcbi8vIGZ1c3YtZGlzYWJsZVxcbiRoci1iZy1jb2xvcjogICAgICAgICAgICAgICAgIG51bGwgIWRlZmF1bHQ7IC8vIERlcHJlY2F0ZWQgaW4gdjUuMi4wXFxuJGhyLWhlaWdodDogICAgICAgICAgICAgICAgICAgbnVsbCAhZGVmYXVsdDsgLy8gRGVwcmVjYXRlZCBpbiB2NS4yLjBcXG4vLyBmdXN2LWVuYWJsZVxcblxcbiRoci1ib3JkZXItY29sb3I6ICAgICAgICAgICAgIG51bGwgIWRlZmF1bHQ7IC8vIEFsbG93cyBmb3IgaW5oZXJpdGVkIGNvbG9yc1xcbiRoci1ib3JkZXItd2lkdGg6ICAgICAgICAgICAgIHZhcigtLSN7JHByZWZpeH1ib3JkZXItd2lkdGgpICFkZWZhdWx0O1xcbiRoci1vcGFjaXR5OiAgICAgICAgICAgICAgICAgIC4yNSAhZGVmYXVsdDtcXG5cXG4vLyBzY3NzLWRvY3Mtc3RhcnQgdnItdmFyaWFibGVzXFxuJHZyLWJvcmRlci13aWR0aDogICAgICAgICAgICAgdmFyKC0tI3skcHJlZml4fWJvcmRlci13aWR0aCkgIWRlZmF1bHQ7XFxuLy8gc2Nzcy1kb2NzLWVuZCB2ci12YXJpYWJsZXNcXG5cXG4kbGVnZW5kLW1hcmdpbi1ib3R0b206ICAgICAgICAuNXJlbSAhZGVmYXVsdDtcXG4kbGVnZW5kLWZvbnQtc2l6ZTogICAgICAgICAgICAxLjVyZW0gIWRlZmF1bHQ7XFxuJGxlZ2VuZC1mb250LXdlaWdodDogICAgICAgICAgbnVsbCAhZGVmYXVsdDtcXG5cXG4kZHQtZm9udC13ZWlnaHQ6ICAgICAgICAgICAgICAkZm9udC13ZWlnaHQtYm9sZCAhZGVmYXVsdDtcXG5cXG4kbGlzdC1pbmxpbmUtcGFkZGluZzogICAgICAgICAuNXJlbSAhZGVmYXVsdDtcXG5cXG4kbWFyay1wYWRkaW5nOiAgICAgICAgICAgICAgICAuMTg3NWVtICFkZWZhdWx0O1xcbiRtYXJrLWNvbG9yOiAgICAgICAgICAgICAgICAgICRib2R5LWNvbG9yICFkZWZhdWx0O1xcbiRtYXJrLWJnOiAgICAgICAgICAgICAgICAgICAgICR5ZWxsb3ctMTAwICFkZWZhdWx0O1xcbi8vIHNjc3MtZG9jcy1lbmQgdHlwZS12YXJpYWJsZXNcXG5cXG5cXG4vLyBUYWJsZXNcXG4vL1xcbi8vIEN1c3RvbWl6ZXMgdGhlIGAudGFibGVgIGNvbXBvbmVudCB3aXRoIGJhc2ljIHZhbHVlcywgZWFjaCB1c2VkIGFjcm9zcyBhbGwgdGFibGUgdmFyaWF0aW9ucy5cXG5cXG4vLyBzY3NzLWRvY3Mtc3RhcnQgdGFibGUtdmFyaWFibGVzXFxuJHRhYmxlLWNlbGwtcGFkZGluZy15OiAgICAgICAgLjVyZW0gIWRlZmF1bHQ7XFxuJHRhYmxlLWNlbGwtcGFkZGluZy14OiAgICAgICAgLjVyZW0gIWRlZmF1bHQ7XFxuJHRhYmxlLWNlbGwtcGFkZGluZy15LXNtOiAgICAgLjI1cmVtICFkZWZhdWx0O1xcbiR0YWJsZS1jZWxsLXBhZGRpbmcteC1zbTogICAgIC4yNXJlbSAhZGVmYXVsdDtcXG5cXG4kdGFibGUtY2VsbC12ZXJ0aWNhbC1hbGlnbjogICB0b3AgIWRlZmF1bHQ7XFxuXFxuJHRhYmxlLWNvbG9yOiAgICAgICAgICAgICAgICAgdmFyKC0tI3skcHJlZml4fWVtcGhhc2lzLWNvbG9yKSAhZGVmYXVsdDtcXG4kdGFibGUtYmc6ICAgICAgICAgICAgICAgICAgICB2YXIoLS0jeyRwcmVmaXh9Ym9keS1iZykgIWRlZmF1bHQ7XFxuJHRhYmxlLWFjY2VudC1iZzogICAgICAgICAgICAgdHJhbnNwYXJlbnQgIWRlZmF1bHQ7XFxuXFxuJHRhYmxlLXRoLWZvbnQtd2VpZ2h0OiAgICAgICAgbnVsbCAhZGVmYXVsdDtcXG5cXG4kdGFibGUtc3RyaXBlZC1jb2xvcjogICAgICAgICAkdGFibGUtY29sb3IgIWRlZmF1bHQ7XFxuJHRhYmxlLXN0cmlwZWQtYmctZmFjdG9yOiAgICAgLjA1ICFkZWZhdWx0O1xcbiR0YWJsZS1zdHJpcGVkLWJnOiAgICAgICAgICAgIHJnYmEodmFyKC0tI3skcHJlZml4fWVtcGhhc2lzLWNvbG9yLXJnYiksICR0YWJsZS1zdHJpcGVkLWJnLWZhY3RvcikgIWRlZmF1bHQ7XFxuXFxuJHRhYmxlLWFjdGl2ZS1jb2xvcjogICAgICAgICAgJHRhYmxlLWNvbG9yICFkZWZhdWx0O1xcbiR0YWJsZS1hY3RpdmUtYmctZmFjdG9yOiAgICAgIC4xICFkZWZhdWx0O1xcbiR0YWJsZS1hY3RpdmUtYmc6ICAgICAgICAgICAgIHJnYmEodmFyKC0tI3skcHJlZml4fWVtcGhhc2lzLWNvbG9yLXJnYiksICR0YWJsZS1hY3RpdmUtYmctZmFjdG9yKSAhZGVmYXVsdDtcXG5cXG4kdGFibGUtaG92ZXItY29sb3I6ICAgICAgICAgICAkdGFibGUtY29sb3IgIWRlZmF1bHQ7XFxuJHRhYmxlLWhvdmVyLWJnLWZhY3RvcjogICAgICAgLjA3NSAhZGVmYXVsdDtcXG4kdGFibGUtaG92ZXItYmc6ICAgICAgICAgICAgICByZ2JhKHZhcigtLSN7JHByZWZpeH1lbXBoYXNpcy1jb2xvci1yZ2IpLCAkdGFibGUtaG92ZXItYmctZmFjdG9yKSAhZGVmYXVsdDtcXG5cXG4kdGFibGUtYm9yZGVyLWZhY3RvcjogICAgICAgICAuMiAhZGVmYXVsdDtcXG4kdGFibGUtYm9yZGVyLXdpZHRoOiAgICAgICAgICB2YXIoLS0jeyRwcmVmaXh9Ym9yZGVyLXdpZHRoKSAhZGVmYXVsdDtcXG4kdGFibGUtYm9yZGVyLWNvbG9yOiAgICAgICAgICB2YXIoLS0jeyRwcmVmaXh9Ym9yZGVyLWNvbG9yKSAhZGVmYXVsdDtcXG5cXG4kdGFibGUtc3RyaXBlZC1vcmRlcjogICAgICAgICBvZGQgIWRlZmF1bHQ7XFxuJHRhYmxlLXN0cmlwZWQtY29sdW1ucy1vcmRlcjogZXZlbiAhZGVmYXVsdDtcXG5cXG4kdGFibGUtZ3JvdXAtc2VwYXJhdG9yLWNvbG9yOiBjdXJyZW50Y29sb3IgIWRlZmF1bHQ7XFxuXFxuJHRhYmxlLWNhcHRpb24tY29sb3I6ICAgICAgICAgdmFyKC0tI3skcHJlZml4fXNlY29uZGFyeS1jb2xvcikgIWRlZmF1bHQ7XFxuXFxuJHRhYmxlLWJnLXNjYWxlOiAgICAgICAgICAgICAgLTgwJSAhZGVmYXVsdDtcXG4vLyBzY3NzLWRvY3MtZW5kIHRhYmxlLXZhcmlhYmxlc1xcblxcbi8vIHNjc3MtZG9jcy1zdGFydCB0YWJsZS1sb29wXFxuJHRhYmxlLXZhcmlhbnRzOiAoXFxuICBcXFwicHJpbWFyeVxcXCI6ICAgIHNoaWZ0LWNvbG9yKCRwcmltYXJ5LCAkdGFibGUtYmctc2NhbGUpLFxcbiAgXFxcInNlY29uZGFyeVxcXCI6ICBzaGlmdC1jb2xvcigkc2Vjb25kYXJ5LCAkdGFibGUtYmctc2NhbGUpLFxcbiAgXFxcInN1Y2Nlc3NcXFwiOiAgICBzaGlmdC1jb2xvcigkc3VjY2VzcywgJHRhYmxlLWJnLXNjYWxlKSxcXG4gIFxcXCJpbmZvXFxcIjogICAgICAgc2hpZnQtY29sb3IoJGluZm8sICR0YWJsZS1iZy1zY2FsZSksXFxuICBcXFwid2FybmluZ1xcXCI6ICAgIHNoaWZ0LWNvbG9yKCR3YXJuaW5nLCAkdGFibGUtYmctc2NhbGUpLFxcbiAgXFxcImRhbmdlclxcXCI6ICAgICBzaGlmdC1jb2xvcigkZGFuZ2VyLCAkdGFibGUtYmctc2NhbGUpLFxcbiAgXFxcImxpZ2h0XFxcIjogICAgICAkbGlnaHQsXFxuICBcXFwiZGFya1xcXCI6ICAgICAgICRkYXJrLFxcbikgIWRlZmF1bHQ7XFxuLy8gc2Nzcy1kb2NzLWVuZCB0YWJsZS1sb29wXFxuXFxuXFxuLy8gQnV0dG9ucyArIEZvcm1zXFxuLy9cXG4vLyBTaGFyZWQgdmFyaWFibGVzIHRoYXQgYXJlIHJlYXNzaWduZWQgdG8gYCRpbnB1dC1gIGFuZCBgJGJ0bi1gIHNwZWNpZmljIHZhcmlhYmxlcy5cXG5cXG4vLyBzY3NzLWRvY3Mtc3RhcnQgaW5wdXQtYnRuLXZhcmlhYmxlc1xcbiRpbnB1dC1idG4tcGFkZGluZy15OiAgICAgICAgIC4zNzVyZW0gIWRlZmF1bHQ7XFxuJGlucHV0LWJ0bi1wYWRkaW5nLXg6ICAgICAgICAgLjc1cmVtICFkZWZhdWx0O1xcbiRpbnB1dC1idG4tZm9udC1mYW1pbHk6ICAgICAgIG51bGwgIWRlZmF1bHQ7XFxuJGlucHV0LWJ0bi1mb250LXNpemU6ICAgICAgICAgJGZvbnQtc2l6ZS1iYXNlICFkZWZhdWx0O1xcbiRpbnB1dC1idG4tbGluZS1oZWlnaHQ6ICAgICAgICRsaW5lLWhlaWdodC1iYXNlICFkZWZhdWx0O1xcblxcbiRpbnB1dC1idG4tZm9jdXMtd2lkdGg6ICAgICAgICAgJGZvY3VzLXJpbmctd2lkdGggIWRlZmF1bHQ7XFxuJGlucHV0LWJ0bi1mb2N1cy1jb2xvci1vcGFjaXR5OiAkZm9jdXMtcmluZy1vcGFjaXR5ICFkZWZhdWx0O1xcbiRpbnB1dC1idG4tZm9jdXMtY29sb3I6ICAgICAgICAgJGZvY3VzLXJpbmctY29sb3IgIWRlZmF1bHQ7XFxuJGlucHV0LWJ0bi1mb2N1cy1ibHVyOiAgICAgICAgICAkZm9jdXMtcmluZy1ibHVyICFkZWZhdWx0O1xcbiRpbnB1dC1idG4tZm9jdXMtYm94LXNoYWRvdzogICAgJGZvY3VzLXJpbmctYm94LXNoYWRvdyAhZGVmYXVsdDtcXG5cXG4kaW5wdXQtYnRuLXBhZGRpbmcteS1zbTogICAgICAuMjVyZW0gIWRlZmF1bHQ7XFxuJGlucHV0LWJ0bi1wYWRkaW5nLXgtc206ICAgICAgLjVyZW0gIWRlZmF1bHQ7XFxuJGlucHV0LWJ0bi1mb250LXNpemUtc206ICAgICAgJGZvbnQtc2l6ZS1zbSAhZGVmYXVsdDtcXG5cXG4kaW5wdXQtYnRuLXBhZGRpbmcteS1sZzogICAgICAuNXJlbSAhZGVmYXVsdDtcXG4kaW5wdXQtYnRuLXBhZGRpbmcteC1sZzogICAgICAxcmVtICFkZWZhdWx0O1xcbiRpbnB1dC1idG4tZm9udC1zaXplLWxnOiAgICAgICRmb250LXNpemUtbGcgIWRlZmF1bHQ7XFxuXFxuJGlucHV0LWJ0bi1ib3JkZXItd2lkdGg6ICAgICAgdmFyKC0tI3skcHJlZml4fWJvcmRlci13aWR0aCkgIWRlZmF1bHQ7XFxuLy8gc2Nzcy1kb2NzLWVuZCBpbnB1dC1idG4tdmFyaWFibGVzXFxuXFxuXFxuLy8gQnV0dG9uc1xcbi8vXFxuLy8gRm9yIGVhY2ggb2YgQm9vdHN0cmFwJ3MgYnV0dG9ucywgZGVmaW5lIHRleHQsIGJhY2tncm91bmQsIGFuZCBib3JkZXIgY29sb3IuXFxuXFxuLy8gc2Nzcy1kb2NzLXN0YXJ0IGJ0bi12YXJpYWJsZXNcXG4kYnRuLWNvbG9yOiAgICAgICAgICAgICAgICAgICB2YXIoLS0jeyRwcmVmaXh9Ym9keS1jb2xvcikgIWRlZmF1bHQ7XFxuJGJ0bi1wYWRkaW5nLXk6ICAgICAgICAgICAgICAgJGlucHV0LWJ0bi1wYWRkaW5nLXkgIWRlZmF1bHQ7XFxuJGJ0bi1wYWRkaW5nLXg6ICAgICAgICAgICAgICAgJGlucHV0LWJ0bi1wYWRkaW5nLXggIWRlZmF1bHQ7XFxuJGJ0bi1mb250LWZhbWlseTogICAgICAgICAgICAgJGlucHV0LWJ0bi1mb250LWZhbWlseSAhZGVmYXVsdDtcXG4kYnRuLWZvbnQtc2l6ZTogICAgICAgICAgICAgICAkaW5wdXQtYnRuLWZvbnQtc2l6ZSAhZGVmYXVsdDtcXG4kYnRuLWxpbmUtaGVpZ2h0OiAgICAgICAgICAgICAkaW5wdXQtYnRuLWxpbmUtaGVpZ2h0ICFkZWZhdWx0O1xcbiRidG4td2hpdGUtc3BhY2U6ICAgICAgICAgICAgIG51bGwgIWRlZmF1bHQ7IC8vIFNldCB0byBgbm93cmFwYCB0byBwcmV2ZW50IHRleHQgd3JhcHBpbmdcXG5cXG4kYnRuLXBhZGRpbmcteS1zbTogICAgICAgICAgICAkaW5wdXQtYnRuLXBhZGRpbmcteS1zbSAhZGVmYXVsdDtcXG4kYnRuLXBhZGRpbmcteC1zbTogICAgICAgICAgICAkaW5wdXQtYnRuLXBhZGRpbmcteC1zbSAhZGVmYXVsdDtcXG4kYnRuLWZvbnQtc2l6ZS1zbTogICAgICAgICAgICAkaW5wdXQtYnRuLWZvbnQtc2l6ZS1zbSAhZGVmYXVsdDtcXG5cXG4kYnRuLXBhZGRpbmcteS1sZzogICAgICAgICAgICAkaW5wdXQtYnRuLXBhZGRpbmcteS1sZyAhZGVmYXVsdDtcXG4kYnRuLXBhZGRpbmcteC1sZzogICAgICAgICAgICAkaW5wdXQtYnRuLXBhZGRpbmcteC1sZyAhZGVmYXVsdDtcXG4kYnRuLWZvbnQtc2l6ZS1sZzogICAgICAgICAgICAkaW5wdXQtYnRuLWZvbnQtc2l6ZS1sZyAhZGVmYXVsdDtcXG5cXG4kYnRuLWJvcmRlci13aWR0aDogICAgICAgICAgICAkaW5wdXQtYnRuLWJvcmRlci13aWR0aCAhZGVmYXVsdDtcXG5cXG4kYnRuLWZvbnQtd2VpZ2h0OiAgICAgICAgICAgICAkZm9udC13ZWlnaHQtbm9ybWFsICFkZWZhdWx0O1xcbiRidG4tYm94LXNoYWRvdzogICAgICAgICAgICAgIGluc2V0IDAgMXB4IDAgcmdiYSgkd2hpdGUsIC4xNSksIDAgMXB4IDFweCByZ2JhKCRibGFjaywgLjA3NSkgIWRlZmF1bHQ7XFxuJGJ0bi1mb2N1cy13aWR0aDogICAgICAgICAgICAgJGlucHV0LWJ0bi1mb2N1cy13aWR0aCAhZGVmYXVsdDtcXG4kYnRuLWZvY3VzLWJveC1zaGFkb3c6ICAgICAgICAkaW5wdXQtYnRuLWZvY3VzLWJveC1zaGFkb3cgIWRlZmF1bHQ7XFxuJGJ0bi1kaXNhYmxlZC1vcGFjaXR5OiAgICAgICAgLjY1ICFkZWZhdWx0O1xcbiRidG4tYWN0aXZlLWJveC1zaGFkb3c6ICAgICAgIGluc2V0IDAgM3B4IDVweCByZ2JhKCRibGFjaywgLjEyNSkgIWRlZmF1bHQ7XFxuXFxuJGJ0bi1saW5rLWNvbG9yOiAgICAgICAgICAgICAgdmFyKC0tI3skcHJlZml4fWxpbmstY29sb3IpICFkZWZhdWx0O1xcbiRidG4tbGluay1ob3Zlci1jb2xvcjogICAgICAgIHZhcigtLSN7JHByZWZpeH1saW5rLWhvdmVyLWNvbG9yKSAhZGVmYXVsdDtcXG4kYnRuLWxpbmstZGlzYWJsZWQtY29sb3I6ICAgICAkZ3JheS02MDAgIWRlZmF1bHQ7XFxuJGJ0bi1saW5rLWZvY3VzLXNoYWRvdy1yZ2I6ICAgdG8tcmdiKG1peChjb2xvci1jb250cmFzdCgkbGluay1jb2xvciksICRsaW5rLWNvbG9yLCAxNSUpKSAhZGVmYXVsdDtcXG5cXG4vLyBBbGxvd3MgZm9yIGN1c3RvbWl6aW5nIGJ1dHRvbiByYWRpdXMgaW5kZXBlbmRlbnRseSBmcm9tIGdsb2JhbCBib3JkZXIgcmFkaXVzXFxuJGJ0bi1ib3JkZXItcmFkaXVzOiAgICAgICAgICAgdmFyKC0tI3skcHJlZml4fWJvcmRlci1yYWRpdXMpICFkZWZhdWx0O1xcbiRidG4tYm9yZGVyLXJhZGl1cy1zbTogICAgICAgIHZhcigtLSN7JHByZWZpeH1ib3JkZXItcmFkaXVzLXNtKSAhZGVmYXVsdDtcXG4kYnRuLWJvcmRlci1yYWRpdXMtbGc6ICAgICAgICB2YXIoLS0jeyRwcmVmaXh9Ym9yZGVyLXJhZGl1cy1sZykgIWRlZmF1bHQ7XFxuXFxuJGJ0bi10cmFuc2l0aW9uOiAgICAgICAgICAgICAgY29sb3IgLjE1cyBlYXNlLWluLW91dCwgYmFja2dyb3VuZC1jb2xvciAuMTVzIGVhc2UtaW4tb3V0LCBib3JkZXItY29sb3IgLjE1cyBlYXNlLWluLW91dCwgYm94LXNoYWRvdyAuMTVzIGVhc2UtaW4tb3V0ICFkZWZhdWx0O1xcblxcbiRidG4taG92ZXItYmctc2hhZGUtYW1vdW50OiAgICAgICAxNSUgIWRlZmF1bHQ7XFxuJGJ0bi1ob3Zlci1iZy10aW50LWFtb3VudDogICAgICAgIDE1JSAhZGVmYXVsdDtcXG4kYnRuLWhvdmVyLWJvcmRlci1zaGFkZS1hbW91bnQ6ICAgMjAlICFkZWZhdWx0O1xcbiRidG4taG92ZXItYm9yZGVyLXRpbnQtYW1vdW50OiAgICAxMCUgIWRlZmF1bHQ7XFxuJGJ0bi1hY3RpdmUtYmctc2hhZGUtYW1vdW50OiAgICAgIDIwJSAhZGVmYXVsdDtcXG4kYnRuLWFjdGl2ZS1iZy10aW50LWFtb3VudDogICAgICAgMjAlICFkZWZhdWx0O1xcbiRidG4tYWN0aXZlLWJvcmRlci1zaGFkZS1hbW91bnQ6ICAyNSUgIWRlZmF1bHQ7XFxuJGJ0bi1hY3RpdmUtYm9yZGVyLXRpbnQtYW1vdW50OiAgIDEwJSAhZGVmYXVsdDtcXG4vLyBzY3NzLWRvY3MtZW5kIGJ0bi12YXJpYWJsZXNcXG5cXG5cXG4vLyBGb3Jtc1xcblxcbi8vIHNjc3MtZG9jcy1zdGFydCBmb3JtLXRleHQtdmFyaWFibGVzXFxuJGZvcm0tdGV4dC1tYXJnaW4tdG9wOiAgICAgICAgICAgICAgICAgIC4yNXJlbSAhZGVmYXVsdDtcXG4kZm9ybS10ZXh0LWZvbnQtc2l6ZTogICAgICAgICAgICAgICAgICAgJHNtYWxsLWZvbnQtc2l6ZSAhZGVmYXVsdDtcXG4kZm9ybS10ZXh0LWZvbnQtc3R5bGU6ICAgICAgICAgICAgICAgICAgbnVsbCAhZGVmYXVsdDtcXG4kZm9ybS10ZXh0LWZvbnQtd2VpZ2h0OiAgICAgICAgICAgICAgICAgbnVsbCAhZGVmYXVsdDtcXG4kZm9ybS10ZXh0LWNvbG9yOiAgICAgICAgICAgICAgICAgICAgICAgdmFyKC0tI3skcHJlZml4fXNlY29uZGFyeS1jb2xvcikgIWRlZmF1bHQ7XFxuLy8gc2Nzcy1kb2NzLWVuZCBmb3JtLXRleHQtdmFyaWFibGVzXFxuXFxuLy8gc2Nzcy1kb2NzLXN0YXJ0IGZvcm0tbGFiZWwtdmFyaWFibGVzXFxuJGZvcm0tbGFiZWwtbWFyZ2luLWJvdHRvbTogICAgICAgICAgICAgIC41cmVtICFkZWZhdWx0O1xcbiRmb3JtLWxhYmVsLWZvbnQtc2l6ZTogICAgICAgICAgICAgICAgICBudWxsICFkZWZhdWx0O1xcbiRmb3JtLWxhYmVsLWZvbnQtc3R5bGU6ICAgICAgICAgICAgICAgICBudWxsICFkZWZhdWx0O1xcbiRmb3JtLWxhYmVsLWZvbnQtd2VpZ2h0OiAgICAgICAgICAgICAgICBudWxsICFkZWZhdWx0O1xcbiRmb3JtLWxhYmVsLWNvbG9yOiAgICAgICAgICAgICAgICAgICAgICBudWxsICFkZWZhdWx0O1xcbi8vIHNjc3MtZG9jcy1lbmQgZm9ybS1sYWJlbC12YXJpYWJsZXNcXG5cXG4vLyBzY3NzLWRvY3Mtc3RhcnQgZm9ybS1pbnB1dC12YXJpYWJsZXNcXG4kaW5wdXQtcGFkZGluZy15OiAgICAgICAgICAgICAgICAgICAgICAgJGlucHV0LWJ0bi1wYWRkaW5nLXkgIWRlZmF1bHQ7XFxuJGlucHV0LXBhZGRpbmcteDogICAgICAgICAgICAgICAgICAgICAgICRpbnB1dC1idG4tcGFkZGluZy14ICFkZWZhdWx0O1xcbiRpbnB1dC1mb250LWZhbWlseTogICAgICAgICAgICAgICAgICAgICAkaW5wdXQtYnRuLWZvbnQtZmFtaWx5ICFkZWZhdWx0O1xcbiRpbnB1dC1mb250LXNpemU6ICAgICAgICAgICAgICAgICAgICAgICAkaW5wdXQtYnRuLWZvbnQtc2l6ZSAhZGVmYXVsdDtcXG4kaW5wdXQtZm9udC13ZWlnaHQ6ICAgICAgICAgICAgICAgICAgICAgJGZvbnQtd2VpZ2h0LWJhc2UgIWRlZmF1bHQ7XFxuJGlucHV0LWxpbmUtaGVpZ2h0OiAgICAgICAgICAgICAgICAgICAgICRpbnB1dC1idG4tbGluZS1oZWlnaHQgIWRlZmF1bHQ7XFxuXFxuJGlucHV0LXBhZGRpbmcteS1zbTogICAgICAgICAgICAgICAgICAgICRpbnB1dC1idG4tcGFkZGluZy15LXNtICFkZWZhdWx0O1xcbiRpbnB1dC1wYWRkaW5nLXgtc206ICAgICAgICAgICAgICAgICAgICAkaW5wdXQtYnRuLXBhZGRpbmcteC1zbSAhZGVmYXVsdDtcXG4kaW5wdXQtZm9udC1zaXplLXNtOiAgICAgICAgICAgICAgICAgICAgJGlucHV0LWJ0bi1mb250LXNpemUtc20gIWRlZmF1bHQ7XFxuXFxuJGlucHV0LXBhZGRpbmcteS1sZzogICAgICAgICAgICAgICAgICAgICRpbnB1dC1idG4tcGFkZGluZy15LWxnICFkZWZhdWx0O1xcbiRpbnB1dC1wYWRkaW5nLXgtbGc6ICAgICAgICAgICAgICAgICAgICAkaW5wdXQtYnRuLXBhZGRpbmcteC1sZyAhZGVmYXVsdDtcXG4kaW5wdXQtZm9udC1zaXplLWxnOiAgICAgICAgICAgICAgICAgICAgJGlucHV0LWJ0bi1mb250LXNpemUtbGcgIWRlZmF1bHQ7XFxuXFxuJGlucHV0LWJnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcigtLSN7JHByZWZpeH1ib2R5LWJnKSAhZGVmYXVsdDtcXG4kaW5wdXQtZGlzYWJsZWQtY29sb3I6ICAgICAgICAgICAgICAgICAgbnVsbCAhZGVmYXVsdDtcXG4kaW5wdXQtZGlzYWJsZWQtYmc6ICAgICAgICAgICAgICAgICAgICAgdmFyKC0tI3skcHJlZml4fXNlY29uZGFyeS1iZykgIWRlZmF1bHQ7XFxuJGlucHV0LWRpc2FibGVkLWJvcmRlci1jb2xvcjogICAgICAgICAgIG51bGwgIWRlZmF1bHQ7XFxuXFxuJGlucHV0LWNvbG9yOiAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcigtLSN7JHByZWZpeH1ib2R5LWNvbG9yKSAhZGVmYXVsdDtcXG4kaW5wdXQtYm9yZGVyLWNvbG9yOiAgICAgICAgICAgICAgICAgICAgdmFyKC0tI3skcHJlZml4fWJvcmRlci1jb2xvcikgIWRlZmF1bHQ7XFxuJGlucHV0LWJvcmRlci13aWR0aDogICAgICAgICAgICAgICAgICAgICRpbnB1dC1idG4tYm9yZGVyLXdpZHRoICFkZWZhdWx0O1xcbiRpbnB1dC1ib3gtc2hhZG93OiAgICAgICAgICAgICAgICAgICAgICB2YXIoLS0jeyRwcmVmaXh9Ym94LXNoYWRvdy1pbnNldCkgIWRlZmF1bHQ7XFxuXFxuJGlucHV0LWJvcmRlci1yYWRpdXM6ICAgICAgICAgICAgICAgICAgIHZhcigtLSN7JHByZWZpeH1ib3JkZXItcmFkaXVzKSAhZGVmYXVsdDtcXG4kaW5wdXQtYm9yZGVyLXJhZGl1cy1zbTogICAgICAgICAgICAgICAgdmFyKC0tI3skcHJlZml4fWJvcmRlci1yYWRpdXMtc20pICFkZWZhdWx0O1xcbiRpbnB1dC1ib3JkZXItcmFkaXVzLWxnOiAgICAgICAgICAgICAgICB2YXIoLS0jeyRwcmVmaXh9Ym9yZGVyLXJhZGl1cy1sZykgIWRlZmF1bHQ7XFxuXFxuJGlucHV0LWZvY3VzLWJnOiAgICAgICAgICAgICAgICAgICAgICAgICRpbnB1dC1iZyAhZGVmYXVsdDtcXG4kaW5wdXQtZm9jdXMtYm9yZGVyLWNvbG9yOiAgICAgICAgICAgICAgdGludC1jb2xvcigkY29tcG9uZW50LWFjdGl2ZS1iZywgNTAlKSAhZGVmYXVsdDtcXG4kaW5wdXQtZm9jdXMtY29sb3I6ICAgICAgICAgICAgICAgICAgICAgJGlucHV0LWNvbG9yICFkZWZhdWx0O1xcbiRpbnB1dC1mb2N1cy13aWR0aDogICAgICAgICAgICAgICAgICAgICAkaW5wdXQtYnRuLWZvY3VzLXdpZHRoICFkZWZhdWx0O1xcbiRpbnB1dC1mb2N1cy1ib3gtc2hhZG93OiAgICAgICAgICAgICAgICAkaW5wdXQtYnRuLWZvY3VzLWJveC1zaGFkb3cgIWRlZmF1bHQ7XFxuXFxuJGlucHV0LXBsYWNlaG9sZGVyLWNvbG9yOiAgICAgICAgICAgICAgIHZhcigtLSN7JHByZWZpeH1zZWNvbmRhcnktY29sb3IpICFkZWZhdWx0O1xcbiRpbnB1dC1wbGFpbnRleHQtY29sb3I6ICAgICAgICAgICAgICAgICB2YXIoLS0jeyRwcmVmaXh9Ym9keS1jb2xvcikgIWRlZmF1bHQ7XFxuXFxuJGlucHV0LWhlaWdodC1ib3JkZXI6ICAgICAgICAgICAgICAgICAgIGNhbGMoI3skaW5wdXQtYm9yZGVyLXdpZHRofSAqIDIpICFkZWZhdWx0OyAvLyBzdHlsZWxpbnQtZGlzYWJsZS1saW5lIGZ1bmN0aW9uLWRpc2FsbG93ZWQtbGlzdFxcblxcbiRpbnB1dC1oZWlnaHQtaW5uZXI6ICAgICAgICAgICAgICAgICAgICBhZGQoJGlucHV0LWxpbmUtaGVpZ2h0ICogMWVtLCAkaW5wdXQtcGFkZGluZy15ICogMikgIWRlZmF1bHQ7XFxuJGlucHV0LWhlaWdodC1pbm5lci1oYWxmOiAgICAgICAgICAgICAgIGFkZCgkaW5wdXQtbGluZS1oZWlnaHQgKiAuNWVtLCAkaW5wdXQtcGFkZGluZy15KSAhZGVmYXVsdDtcXG4kaW5wdXQtaGVpZ2h0LWlubmVyLXF1YXJ0ZXI6ICAgICAgICAgICAgYWRkKCRpbnB1dC1saW5lLWhlaWdodCAqIC4yNWVtLCAkaW5wdXQtcGFkZGluZy15ICogLjUpICFkZWZhdWx0O1xcblxcbiRpbnB1dC1oZWlnaHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICBhZGQoJGlucHV0LWxpbmUtaGVpZ2h0ICogMWVtLCBhZGQoJGlucHV0LXBhZGRpbmcteSAqIDIsICRpbnB1dC1oZWlnaHQtYm9yZGVyLCBmYWxzZSkpICFkZWZhdWx0O1xcbiRpbnB1dC1oZWlnaHQtc206ICAgICAgICAgICAgICAgICAgICAgICBhZGQoJGlucHV0LWxpbmUtaGVpZ2h0ICogMWVtLCBhZGQoJGlucHV0LXBhZGRpbmcteS1zbSAqIDIsICRpbnB1dC1oZWlnaHQtYm9yZGVyLCBmYWxzZSkpICFkZWZhdWx0O1xcbiRpbnB1dC1oZWlnaHQtbGc6ICAgICAgICAgICAgICAgICAgICAgICBhZGQoJGlucHV0LWxpbmUtaGVpZ2h0ICogMWVtLCBhZGQoJGlucHV0LXBhZGRpbmcteS1sZyAqIDIsICRpbnB1dC1oZWlnaHQtYm9yZGVyLCBmYWxzZSkpICFkZWZhdWx0O1xcblxcbiRpbnB1dC10cmFuc2l0aW9uOiAgICAgICAgICAgICAgICAgICAgICBib3JkZXItY29sb3IgLjE1cyBlYXNlLWluLW91dCwgYm94LXNoYWRvdyAuMTVzIGVhc2UtaW4tb3V0ICFkZWZhdWx0O1xcblxcbiRmb3JtLWNvbG9yLXdpZHRoOiAgICAgICAgICAgICAgICAgICAgICAzcmVtICFkZWZhdWx0O1xcbi8vIHNjc3MtZG9jcy1lbmQgZm9ybS1pbnB1dC12YXJpYWJsZXNcXG5cXG4vLyBzY3NzLWRvY3Mtc3RhcnQgZm9ybS1jaGVjay12YXJpYWJsZXNcXG4kZm9ybS1jaGVjay1pbnB1dC13aWR0aDogICAgICAgICAgICAgICAgICAxZW0gIWRlZmF1bHQ7XFxuJGZvcm0tY2hlY2stbWluLWhlaWdodDogICAgICAgICAgICAgICAgICAgJGZvbnQtc2l6ZS1iYXNlICogJGxpbmUtaGVpZ2h0LWJhc2UgIWRlZmF1bHQ7XFxuJGZvcm0tY2hlY2stcGFkZGluZy1zdGFydDogICAgICAgICAgICAgICAgJGZvcm0tY2hlY2staW5wdXQtd2lkdGggKyAuNWVtICFkZWZhdWx0O1xcbiRmb3JtLWNoZWNrLW1hcmdpbi1ib3R0b206ICAgICAgICAgICAgICAgIC4xMjVyZW0gIWRlZmF1bHQ7XFxuJGZvcm0tY2hlY2stbGFiZWwtY29sb3I6ICAgICAgICAgICAgICAgICAgbnVsbCAhZGVmYXVsdDtcXG4kZm9ybS1jaGVjay1sYWJlbC1jdXJzb3I6ICAgICAgICAgICAgICAgICBudWxsICFkZWZhdWx0O1xcbiRmb3JtLWNoZWNrLXRyYW5zaXRpb246ICAgICAgICAgICAgICAgICAgIG51bGwgIWRlZmF1bHQ7XFxuXFxuJGZvcm0tY2hlY2staW5wdXQtYWN0aXZlLWZpbHRlcjogICAgICAgICAgYnJpZ2h0bmVzcyg5MCUpICFkZWZhdWx0O1xcblxcbiRmb3JtLWNoZWNrLWlucHV0LWJnOiAgICAgICAgICAgICAgICAgICAgICRpbnB1dC1iZyAhZGVmYXVsdDtcXG4kZm9ybS1jaGVjay1pbnB1dC1ib3JkZXI6ICAgICAgICAgICAgICAgICB2YXIoLS0jeyRwcmVmaXh9Ym9yZGVyLXdpZHRoKSBzb2xpZCB2YXIoLS0jeyRwcmVmaXh9Ym9yZGVyLWNvbG9yKSAhZGVmYXVsdDtcXG4kZm9ybS1jaGVjay1pbnB1dC1ib3JkZXItcmFkaXVzOiAgICAgICAgICAuMjVlbSAhZGVmYXVsdDtcXG4kZm9ybS1jaGVjay1yYWRpby1ib3JkZXItcmFkaXVzOiAgICAgICAgICA1MCUgIWRlZmF1bHQ7XFxuJGZvcm0tY2hlY2staW5wdXQtZm9jdXMtYm9yZGVyOiAgICAgICAgICAgJGlucHV0LWZvY3VzLWJvcmRlci1jb2xvciAhZGVmYXVsdDtcXG4kZm9ybS1jaGVjay1pbnB1dC1mb2N1cy1ib3gtc2hhZG93OiAgICAgICAkZm9jdXMtcmluZy1ib3gtc2hhZG93ICFkZWZhdWx0O1xcblxcbiRmb3JtLWNoZWNrLWlucHV0LWNoZWNrZWQtY29sb3I6ICAgICAgICAgICRjb21wb25lbnQtYWN0aXZlLWNvbG9yICFkZWZhdWx0O1xcbiRmb3JtLWNoZWNrLWlucHV0LWNoZWNrZWQtYmctY29sb3I6ICAgICAgICRjb21wb25lbnQtYWN0aXZlLWJnICFkZWZhdWx0O1xcbiRmb3JtLWNoZWNrLWlucHV0LWNoZWNrZWQtYm9yZGVyLWNvbG9yOiAgICRmb3JtLWNoZWNrLWlucHV0LWNoZWNrZWQtYmctY29sb3IgIWRlZmF1bHQ7XFxuJGZvcm0tY2hlY2staW5wdXQtY2hlY2tlZC1iZy1pbWFnZTogICAgICAgdXJsKFxcXCJkYXRhOmltYWdlL3N2Zyt4bWwsPHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyMCAyMCc+PHBhdGggZmlsbD0nbm9uZScgc3Ryb2tlPScjeyRmb3JtLWNoZWNrLWlucHV0LWNoZWNrZWQtY29sb3J9JyBzdHJva2UtbGluZWNhcD0ncm91bmQnIHN0cm9rZS1saW5lam9pbj0ncm91bmQnIHN0cm9rZS13aWR0aD0nMycgZD0nbTYgMTAgMyAzIDYtNicvPjwvc3ZnPlxcXCIpICFkZWZhdWx0O1xcbiRmb3JtLWNoZWNrLXJhZGlvLWNoZWNrZWQtYmctaW1hZ2U6ICAgICAgIHVybChcXFwiZGF0YTppbWFnZS9zdmcreG1sLDxzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB2aWV3Qm94PSctNCAtNCA4IDgnPjxjaXJjbGUgcj0nMicgZmlsbD0nI3skZm9ybS1jaGVjay1pbnB1dC1jaGVja2VkLWNvbG9yfScvPjwvc3ZnPlxcXCIpICFkZWZhdWx0O1xcblxcbiRmb3JtLWNoZWNrLWlucHV0LWluZGV0ZXJtaW5hdGUtY29sb3I6ICAgICAgICAgICRjb21wb25lbnQtYWN0aXZlLWNvbG9yICFkZWZhdWx0O1xcbiRmb3JtLWNoZWNrLWlucHV0LWluZGV0ZXJtaW5hdGUtYmctY29sb3I6ICAgICAgICRjb21wb25lbnQtYWN0aXZlLWJnICFkZWZhdWx0O1xcbiRmb3JtLWNoZWNrLWlucHV0LWluZGV0ZXJtaW5hdGUtYm9yZGVyLWNvbG9yOiAgICRmb3JtLWNoZWNrLWlucHV0LWluZGV0ZXJtaW5hdGUtYmctY29sb3IgIWRlZmF1bHQ7XFxuJGZvcm0tY2hlY2staW5wdXQtaW5kZXRlcm1pbmF0ZS1iZy1pbWFnZTogICAgICAgdXJsKFxcXCJkYXRhOmltYWdlL3N2Zyt4bWwsPHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyMCAyMCc+PHBhdGggZmlsbD0nbm9uZScgc3Ryb2tlPScjeyRmb3JtLWNoZWNrLWlucHV0LWluZGV0ZXJtaW5hdGUtY29sb3J9JyBzdHJva2UtbGluZWNhcD0ncm91bmQnIHN0cm9rZS1saW5lam9pbj0ncm91bmQnIHN0cm9rZS13aWR0aD0nMycgZD0nTTYgMTBoOCcvPjwvc3ZnPlxcXCIpICFkZWZhdWx0O1xcblxcbiRmb3JtLWNoZWNrLWlucHV0LWRpc2FibGVkLW9wYWNpdHk6ICAgICAgICAuNSAhZGVmYXVsdDtcXG4kZm9ybS1jaGVjay1sYWJlbC1kaXNhYmxlZC1vcGFjaXR5OiAgICAgICAgJGZvcm0tY2hlY2staW5wdXQtZGlzYWJsZWQtb3BhY2l0eSAhZGVmYXVsdDtcXG4kZm9ybS1jaGVjay1idG4tY2hlY2stZGlzYWJsZWQtb3BhY2l0eTogICAgJGJ0bi1kaXNhYmxlZC1vcGFjaXR5ICFkZWZhdWx0O1xcblxcbiRmb3JtLWNoZWNrLWlubGluZS1tYXJnaW4tZW5kOiAgICAxcmVtICFkZWZhdWx0O1xcbi8vIHNjc3MtZG9jcy1lbmQgZm9ybS1jaGVjay12YXJpYWJsZXNcXG5cXG4vLyBzY3NzLWRvY3Mtc3RhcnQgZm9ybS1zd2l0Y2gtdmFyaWFibGVzXFxuJGZvcm0tc3dpdGNoLWNvbG9yOiAgICAgICAgICAgICAgIHJnYmEoJGJsYWNrLCAuMjUpICFkZWZhdWx0O1xcbiRmb3JtLXN3aXRjaC13aWR0aDogICAgICAgICAgICAgICAyZW0gIWRlZmF1bHQ7XFxuJGZvcm0tc3dpdGNoLXBhZGRpbmctc3RhcnQ6ICAgICAgICRmb3JtLXN3aXRjaC13aWR0aCArIC41ZW0gIWRlZmF1bHQ7XFxuJGZvcm0tc3dpdGNoLWJnLWltYWdlOiAgICAgICAgICAgIHVybChcXFwiZGF0YTppbWFnZS9zdmcreG1sLDxzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB2aWV3Qm94PSctNCAtNCA4IDgnPjxjaXJjbGUgcj0nMycgZmlsbD0nI3skZm9ybS1zd2l0Y2gtY29sb3J9Jy8+PC9zdmc+XFxcIikgIWRlZmF1bHQ7XFxuJGZvcm0tc3dpdGNoLWJvcmRlci1yYWRpdXM6ICAgICAgICRmb3JtLXN3aXRjaC13aWR0aCAhZGVmYXVsdDtcXG4kZm9ybS1zd2l0Y2gtdHJhbnNpdGlvbjogICAgICAgICAgYmFja2dyb3VuZC1wb3NpdGlvbiAuMTVzIGVhc2UtaW4tb3V0ICFkZWZhdWx0O1xcblxcbiRmb3JtLXN3aXRjaC1mb2N1cy1jb2xvcjogICAgICAgICAkaW5wdXQtZm9jdXMtYm9yZGVyLWNvbG9yICFkZWZhdWx0O1xcbiRmb3JtLXN3aXRjaC1mb2N1cy1iZy1pbWFnZTogICAgICB1cmwoXFxcImRhdGE6aW1hZ2Uvc3ZnK3htbCw8c3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgdmlld0JveD0nLTQgLTQgOCA4Jz48Y2lyY2xlIHI9JzMnIGZpbGw9JyN7JGZvcm0tc3dpdGNoLWZvY3VzLWNvbG9yfScvPjwvc3ZnPlxcXCIpICFkZWZhdWx0O1xcblxcbiRmb3JtLXN3aXRjaC1jaGVja2VkLWNvbG9yOiAgICAgICAkY29tcG9uZW50LWFjdGl2ZS1jb2xvciAhZGVmYXVsdDtcXG4kZm9ybS1zd2l0Y2gtY2hlY2tlZC1iZy1pbWFnZTogICAgdXJsKFxcXCJkYXRhOmltYWdlL3N2Zyt4bWwsPHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9Jy00IC00IDggOCc+PGNpcmNsZSByPSczJyBmaWxsPScjeyRmb3JtLXN3aXRjaC1jaGVja2VkLWNvbG9yfScvPjwvc3ZnPlxcXCIpICFkZWZhdWx0O1xcbiRmb3JtLXN3aXRjaC1jaGVja2VkLWJnLXBvc2l0aW9uOiByaWdodCBjZW50ZXIgIWRlZmF1bHQ7XFxuLy8gc2Nzcy1kb2NzLWVuZCBmb3JtLXN3aXRjaC12YXJpYWJsZXNcXG5cXG4vLyBzY3NzLWRvY3Mtc3RhcnQgaW5wdXQtZ3JvdXAtdmFyaWFibGVzXFxuJGlucHV0LWdyb3VwLWFkZG9uLXBhZGRpbmcteTogICAgICAgICAgICRpbnB1dC1wYWRkaW5nLXkgIWRlZmF1bHQ7XFxuJGlucHV0LWdyb3VwLWFkZG9uLXBhZGRpbmcteDogICAgICAgICAgICRpbnB1dC1wYWRkaW5nLXggIWRlZmF1bHQ7XFxuJGlucHV0LWdyb3VwLWFkZG9uLWZvbnQtd2VpZ2h0OiAgICAgICAgICRpbnB1dC1mb250LXdlaWdodCAhZGVmYXVsdDtcXG4kaW5wdXQtZ3JvdXAtYWRkb24tY29sb3I6ICAgICAgICAgICAgICAgJGlucHV0LWNvbG9yICFkZWZhdWx0O1xcbiRpbnB1dC1ncm91cC1hZGRvbi1iZzogICAgICAgICAgICAgICAgICB2YXIoLS0jeyRwcmVmaXh9dGVydGlhcnktYmcpICFkZWZhdWx0O1xcbiRpbnB1dC1ncm91cC1hZGRvbi1ib3JkZXItY29sb3I6ICAgICAgICAkaW5wdXQtYm9yZGVyLWNvbG9yICFkZWZhdWx0O1xcbi8vIHNjc3MtZG9jcy1lbmQgaW5wdXQtZ3JvdXAtdmFyaWFibGVzXFxuXFxuLy8gc2Nzcy1kb2NzLXN0YXJ0IGZvcm0tc2VsZWN0LXZhcmlhYmxlc1xcbiRmb3JtLXNlbGVjdC1wYWRkaW5nLXk6ICAgICAgICAgICAgICRpbnB1dC1wYWRkaW5nLXkgIWRlZmF1bHQ7XFxuJGZvcm0tc2VsZWN0LXBhZGRpbmcteDogICAgICAgICAgICAgJGlucHV0LXBhZGRpbmcteCAhZGVmYXVsdDtcXG4kZm9ybS1zZWxlY3QtZm9udC1mYW1pbHk6ICAgICAgICAgICAkaW5wdXQtZm9udC1mYW1pbHkgIWRlZmF1bHQ7XFxuJGZvcm0tc2VsZWN0LWZvbnQtc2l6ZTogICAgICAgICAgICAgJGlucHV0LWZvbnQtc2l6ZSAhZGVmYXVsdDtcXG4kZm9ybS1zZWxlY3QtaW5kaWNhdG9yLXBhZGRpbmc6ICAgICAkZm9ybS1zZWxlY3QtcGFkZGluZy14ICogMyAhZGVmYXVsdDsgLy8gRXh0cmEgcGFkZGluZyBmb3IgYmFja2dyb3VuZC1pbWFnZVxcbiRmb3JtLXNlbGVjdC1mb250LXdlaWdodDogICAgICAgICAgICRpbnB1dC1mb250LXdlaWdodCAhZGVmYXVsdDtcXG4kZm9ybS1zZWxlY3QtbGluZS1oZWlnaHQ6ICAgICAgICAgICAkaW5wdXQtbGluZS1oZWlnaHQgIWRlZmF1bHQ7XFxuJGZvcm0tc2VsZWN0LWNvbG9yOiAgICAgICAgICAgICAgICAgJGlucHV0LWNvbG9yICFkZWZhdWx0O1xcbiRmb3JtLXNlbGVjdC1iZzogICAgICAgICAgICAgICAgICAgICRpbnB1dC1iZyAhZGVmYXVsdDtcXG4kZm9ybS1zZWxlY3QtZGlzYWJsZWQtY29sb3I6ICAgICAgICBudWxsICFkZWZhdWx0O1xcbiRmb3JtLXNlbGVjdC1kaXNhYmxlZC1iZzogICAgICAgICAgICRpbnB1dC1kaXNhYmxlZC1iZyAhZGVmYXVsdDtcXG4kZm9ybS1zZWxlY3QtZGlzYWJsZWQtYm9yZGVyLWNvbG9yOiAkaW5wdXQtZGlzYWJsZWQtYm9yZGVyLWNvbG9yICFkZWZhdWx0O1xcbiRmb3JtLXNlbGVjdC1iZy1wb3NpdGlvbjogICAgICAgICAgIHJpZ2h0ICRmb3JtLXNlbGVjdC1wYWRkaW5nLXggY2VudGVyICFkZWZhdWx0O1xcbiRmb3JtLXNlbGVjdC1iZy1zaXplOiAgICAgICAgICAgICAgIDE2cHggMTJweCAhZGVmYXVsdDsgLy8gSW4gcGl4ZWxzIGJlY2F1c2UgaW1hZ2UgZGltZW5zaW9uc1xcbiRmb3JtLXNlbGVjdC1pbmRpY2F0b3ItY29sb3I6ICAgICAgICRncmF5LTgwMCAhZGVmYXVsdDtcXG4kZm9ybS1zZWxlY3QtaW5kaWNhdG9yOiAgICAgICAgICAgICB1cmwoXFxcImRhdGE6aW1hZ2Uvc3ZnK3htbCw8c3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgdmlld0JveD0nMCAwIDE2IDE2Jz48cGF0aCBmaWxsPSdub25lJyBzdHJva2U9JyN7JGZvcm0tc2VsZWN0LWluZGljYXRvci1jb2xvcn0nIHN0cm9rZS1saW5lY2FwPSdyb3VuZCcgc3Ryb2tlLWxpbmVqb2luPSdyb3VuZCcgc3Ryb2tlLXdpZHRoPScyJyBkPSdtMiA1IDYgNiA2LTYnLz48L3N2Zz5cXFwiKSAhZGVmYXVsdDtcXG5cXG4kZm9ybS1zZWxlY3QtZmVlZGJhY2staWNvbi1wYWRkaW5nLWVuZDogJGZvcm0tc2VsZWN0LXBhZGRpbmcteCAqIDIuNSArICRmb3JtLXNlbGVjdC1pbmRpY2F0b3ItcGFkZGluZyAhZGVmYXVsdDtcXG4kZm9ybS1zZWxlY3QtZmVlZGJhY2staWNvbi1wb3NpdGlvbjogICAgY2VudGVyIHJpZ2h0ICRmb3JtLXNlbGVjdC1pbmRpY2F0b3ItcGFkZGluZyAhZGVmYXVsdDtcXG4kZm9ybS1zZWxlY3QtZmVlZGJhY2staWNvbi1zaXplOiAgICAgICAgJGlucHV0LWhlaWdodC1pbm5lci1oYWxmICRpbnB1dC1oZWlnaHQtaW5uZXItaGFsZiAhZGVmYXVsdDtcXG5cXG4kZm9ybS1zZWxlY3QtYm9yZGVyLXdpZHRoOiAgICAgICAgJGlucHV0LWJvcmRlci13aWR0aCAhZGVmYXVsdDtcXG4kZm9ybS1zZWxlY3QtYm9yZGVyLWNvbG9yOiAgICAgICAgJGlucHV0LWJvcmRlci1jb2xvciAhZGVmYXVsdDtcXG4kZm9ybS1zZWxlY3QtYm9yZGVyLXJhZGl1czogICAgICAgJGlucHV0LWJvcmRlci1yYWRpdXMgIWRlZmF1bHQ7XFxuJGZvcm0tc2VsZWN0LWJveC1zaGFkb3c6ICAgICAgICAgIHZhcigtLSN7JHByZWZpeH1ib3gtc2hhZG93LWluc2V0KSAhZGVmYXVsdDtcXG5cXG4kZm9ybS1zZWxlY3QtZm9jdXMtYm9yZGVyLWNvbG9yOiAgJGlucHV0LWZvY3VzLWJvcmRlci1jb2xvciAhZGVmYXVsdDtcXG4kZm9ybS1zZWxlY3QtZm9jdXMtd2lkdGg6ICAgICAgICAgJGlucHV0LWZvY3VzLXdpZHRoICFkZWZhdWx0O1xcbiRmb3JtLXNlbGVjdC1mb2N1cy1ib3gtc2hhZG93OiAgICAwIDAgMCAkZm9ybS1zZWxlY3QtZm9jdXMtd2lkdGggJGlucHV0LWJ0bi1mb2N1cy1jb2xvciAhZGVmYXVsdDtcXG5cXG4kZm9ybS1zZWxlY3QtcGFkZGluZy15LXNtOiAgICAgICAgJGlucHV0LXBhZGRpbmcteS1zbSAhZGVmYXVsdDtcXG4kZm9ybS1zZWxlY3QtcGFkZGluZy14LXNtOiAgICAgICAgJGlucHV0LXBhZGRpbmcteC1zbSAhZGVmYXVsdDtcXG4kZm9ybS1zZWxlY3QtZm9udC1zaXplLXNtOiAgICAgICAgJGlucHV0LWZvbnQtc2l6ZS1zbSAhZGVmYXVsdDtcXG4kZm9ybS1zZWxlY3QtYm9yZGVyLXJhZGl1cy1zbTogICAgJGlucHV0LWJvcmRlci1yYWRpdXMtc20gIWRlZmF1bHQ7XFxuXFxuJGZvcm0tc2VsZWN0LXBhZGRpbmcteS1sZzogICAgICAgICRpbnB1dC1wYWRkaW5nLXktbGcgIWRlZmF1bHQ7XFxuJGZvcm0tc2VsZWN0LXBhZGRpbmcteC1sZzogICAgICAgICRpbnB1dC1wYWRkaW5nLXgtbGcgIWRlZmF1bHQ7XFxuJGZvcm0tc2VsZWN0LWZvbnQtc2l6ZS1sZzogICAgICAgICRpbnB1dC1mb250LXNpemUtbGcgIWRlZmF1bHQ7XFxuJGZvcm0tc2VsZWN0LWJvcmRlci1yYWRpdXMtbGc6ICAgICRpbnB1dC1ib3JkZXItcmFkaXVzLWxnICFkZWZhdWx0O1xcblxcbiRmb3JtLXNlbGVjdC10cmFuc2l0aW9uOiAgICAgICAgICAkaW5wdXQtdHJhbnNpdGlvbiAhZGVmYXVsdDtcXG4vLyBzY3NzLWRvY3MtZW5kIGZvcm0tc2VsZWN0LXZhcmlhYmxlc1xcblxcbi8vIHNjc3MtZG9jcy1zdGFydCBmb3JtLXJhbmdlLXZhcmlhYmxlc1xcbiRmb3JtLXJhbmdlLXRyYWNrLXdpZHRoOiAgICAgICAgICAxMDAlICFkZWZhdWx0O1xcbiRmb3JtLXJhbmdlLXRyYWNrLWhlaWdodDogICAgICAgICAuNXJlbSAhZGVmYXVsdDtcXG4kZm9ybS1yYW5nZS10cmFjay1jdXJzb3I6ICAgICAgICAgcG9pbnRlciAhZGVmYXVsdDtcXG4kZm9ybS1yYW5nZS10cmFjay1iZzogICAgICAgICAgICAgdmFyKC0tI3skcHJlZml4fXNlY29uZGFyeS1iZykgIWRlZmF1bHQ7XFxuJGZvcm0tcmFuZ2UtdHJhY2stYm9yZGVyLXJhZGl1czogIDFyZW0gIWRlZmF1bHQ7XFxuJGZvcm0tcmFuZ2UtdHJhY2stYm94LXNoYWRvdzogICAgIHZhcigtLSN7JHByZWZpeH1ib3gtc2hhZG93LWluc2V0KSAhZGVmYXVsdDtcXG5cXG4kZm9ybS1yYW5nZS10aHVtYi13aWR0aDogICAgICAgICAgICAgICAgICAgMXJlbSAhZGVmYXVsdDtcXG4kZm9ybS1yYW5nZS10aHVtYi1oZWlnaHQ6ICAgICAgICAgICAgICAgICAgJGZvcm0tcmFuZ2UtdGh1bWItd2lkdGggIWRlZmF1bHQ7XFxuJGZvcm0tcmFuZ2UtdGh1bWItYmc6ICAgICAgICAgICAgICAgICAgICAgICRjb21wb25lbnQtYWN0aXZlLWJnICFkZWZhdWx0O1xcbiRmb3JtLXJhbmdlLXRodW1iLWJvcmRlcjogICAgICAgICAgICAgICAgICAwICFkZWZhdWx0O1xcbiRmb3JtLXJhbmdlLXRodW1iLWJvcmRlci1yYWRpdXM6ICAgICAgICAgICAxcmVtICFkZWZhdWx0O1xcbiRmb3JtLXJhbmdlLXRodW1iLWJveC1zaGFkb3c6ICAgICAgICAgICAgICAwIC4xcmVtIC4yNXJlbSByZ2JhKCRibGFjaywgLjEpICFkZWZhdWx0O1xcbiRmb3JtLXJhbmdlLXRodW1iLWZvY3VzLWJveC1zaGFkb3c6ICAgICAgICAwIDAgMCAxcHggJGJvZHktYmcsICRpbnB1dC1mb2N1cy1ib3gtc2hhZG93ICFkZWZhdWx0O1xcbiRmb3JtLXJhbmdlLXRodW1iLWZvY3VzLWJveC1zaGFkb3ctd2lkdGg6ICAkaW5wdXQtZm9jdXMtd2lkdGggIWRlZmF1bHQ7IC8vIEZvciBmb2N1cyBib3ggc2hhZG93IGlzc3VlIGluIEVkZ2VcXG4kZm9ybS1yYW5nZS10aHVtYi1hY3RpdmUtYmc6ICAgICAgICAgICAgICAgdGludC1jb2xvcigkY29tcG9uZW50LWFjdGl2ZS1iZywgNzAlKSAhZGVmYXVsdDtcXG4kZm9ybS1yYW5nZS10aHVtYi1kaXNhYmxlZC1iZzogICAgICAgICAgICAgdmFyKC0tI3skcHJlZml4fXNlY29uZGFyeS1jb2xvcikgIWRlZmF1bHQ7XFxuJGZvcm0tcmFuZ2UtdGh1bWItdHJhbnNpdGlvbjogICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3IgLjE1cyBlYXNlLWluLW91dCwgYm9yZGVyLWNvbG9yIC4xNXMgZWFzZS1pbi1vdXQsIGJveC1zaGFkb3cgLjE1cyBlYXNlLWluLW91dCAhZGVmYXVsdDtcXG4vLyBzY3NzLWRvY3MtZW5kIGZvcm0tcmFuZ2UtdmFyaWFibGVzXFxuXFxuLy8gc2Nzcy1kb2NzLXN0YXJ0IGZvcm0tZmlsZS12YXJpYWJsZXNcXG4kZm9ybS1maWxlLWJ1dHRvbi1jb2xvcjogICAgICAgICAgJGlucHV0LWNvbG9yICFkZWZhdWx0O1xcbiRmb3JtLWZpbGUtYnV0dG9uLWJnOiAgICAgICAgICAgICB2YXIoLS0jeyRwcmVmaXh9dGVydGlhcnktYmcpICFkZWZhdWx0O1xcbiRmb3JtLWZpbGUtYnV0dG9uLWhvdmVyLWJnOiAgICAgICB2YXIoLS0jeyRwcmVmaXh9c2Vjb25kYXJ5LWJnKSAhZGVmYXVsdDtcXG4vLyBzY3NzLWRvY3MtZW5kIGZvcm0tZmlsZS12YXJpYWJsZXNcXG5cXG4vLyBzY3NzLWRvY3Mtc3RhcnQgZm9ybS1mbG9hdGluZy12YXJpYWJsZXNcXG4kZm9ybS1mbG9hdGluZy1oZWlnaHQ6ICAgICAgICAgICAgICAgICAgYWRkKDMuNXJlbSwgJGlucHV0LWhlaWdodC1ib3JkZXIpICFkZWZhdWx0O1xcbiRmb3JtLWZsb2F0aW5nLWxpbmUtaGVpZ2h0OiAgICAgICAgICAgICAxLjI1ICFkZWZhdWx0O1xcbiRmb3JtLWZsb2F0aW5nLXBhZGRpbmcteDogICAgICAgICAgICAgICAkaW5wdXQtcGFkZGluZy14ICFkZWZhdWx0O1xcbiRmb3JtLWZsb2F0aW5nLXBhZGRpbmcteTogICAgICAgICAgICAgICAxcmVtICFkZWZhdWx0O1xcbiRmb3JtLWZsb2F0aW5nLWlucHV0LXBhZGRpbmctdDogICAgICAgICAxLjYyNXJlbSAhZGVmYXVsdDtcXG4kZm9ybS1mbG9hdGluZy1pbnB1dC1wYWRkaW5nLWI6ICAgICAgICAgLjYyNXJlbSAhZGVmYXVsdDtcXG4kZm9ybS1mbG9hdGluZy1sYWJlbC1oZWlnaHQ6ICAgICAgICAgICAgMS41ZW0gIWRlZmF1bHQ7XFxuJGZvcm0tZmxvYXRpbmctbGFiZWwtb3BhY2l0eTogICAgICAgICAgIC42NSAhZGVmYXVsdDtcXG4kZm9ybS1mbG9hdGluZy1sYWJlbC10cmFuc2Zvcm06ICAgICAgICAgc2NhbGUoLjg1KSB0cmFuc2xhdGVZKC0uNXJlbSkgdHJhbnNsYXRlWCguMTVyZW0pICFkZWZhdWx0O1xcbiRmb3JtLWZsb2F0aW5nLWxhYmVsLWRpc2FibGVkLWNvbG9yOiAgICAkZ3JheS02MDAgIWRlZmF1bHQ7XFxuJGZvcm0tZmxvYXRpbmctdHJhbnNpdGlvbjogICAgICAgICAgICAgIG9wYWNpdHkgLjFzIGVhc2UtaW4tb3V0LCB0cmFuc2Zvcm0gLjFzIGVhc2UtaW4tb3V0ICFkZWZhdWx0O1xcbi8vIHNjc3MtZG9jcy1lbmQgZm9ybS1mbG9hdGluZy12YXJpYWJsZXNcXG5cXG4vLyBGb3JtIHZhbGlkYXRpb25cXG5cXG4vLyBzY3NzLWRvY3Mtc3RhcnQgZm9ybS1mZWVkYmFjay12YXJpYWJsZXNcXG4kZm9ybS1mZWVkYmFjay1tYXJnaW4tdG9wOiAgICAgICAgICAkZm9ybS10ZXh0LW1hcmdpbi10b3AgIWRlZmF1bHQ7XFxuJGZvcm0tZmVlZGJhY2stZm9udC1zaXplOiAgICAgICAgICAgJGZvcm0tdGV4dC1mb250LXNpemUgIWRlZmF1bHQ7XFxuJGZvcm0tZmVlZGJhY2stZm9udC1zdHlsZTogICAgICAgICAgJGZvcm0tdGV4dC1mb250LXN0eWxlICFkZWZhdWx0O1xcbiRmb3JtLWZlZWRiYWNrLXZhbGlkLWNvbG9yOiAgICAgICAgICRzdWNjZXNzICFkZWZhdWx0O1xcbiRmb3JtLWZlZWRiYWNrLWludmFsaWQtY29sb3I6ICAgICAgICRkYW5nZXIgIWRlZmF1bHQ7XFxuXFxuJGZvcm0tZmVlZGJhY2staWNvbi12YWxpZC1jb2xvcjogICAgJGZvcm0tZmVlZGJhY2stdmFsaWQtY29sb3IgIWRlZmF1bHQ7XFxuJGZvcm0tZmVlZGJhY2staWNvbi12YWxpZDogICAgICAgICAgdXJsKFxcXCJkYXRhOmltYWdlL3N2Zyt4bWwsPHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCA4IDgnPjxwYXRoIGZpbGw9JyN7JGZvcm0tZmVlZGJhY2staWNvbi12YWxpZC1jb2xvcn0nIGQ9J00yLjMgNi43My42IDQuNTNjLS40LTEuMDQuNDYtMS40IDEuMS0uOGwxLjEgMS40IDMuNC0zLjhjLjYtLjYzIDEuNi0uMjcgMS4yLjdsLTQgNC42Yy0uNDMuNS0uOC40LTEuMS4xeicvPjwvc3ZnPlxcXCIpICFkZWZhdWx0O1xcbiRmb3JtLWZlZWRiYWNrLWljb24taW52YWxpZC1jb2xvcjogICRmb3JtLWZlZWRiYWNrLWludmFsaWQtY29sb3IgIWRlZmF1bHQ7XFxuJGZvcm0tZmVlZGJhY2staWNvbi1pbnZhbGlkOiAgICAgICAgdXJsKFxcXCJkYXRhOmltYWdlL3N2Zyt4bWwsPHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAxMiAxMicgd2lkdGg9JzEyJyBoZWlnaHQ9JzEyJyBmaWxsPSdub25lJyBzdHJva2U9JyN7JGZvcm0tZmVlZGJhY2staWNvbi1pbnZhbGlkLWNvbG9yfSc+PGNpcmNsZSBjeD0nNicgY3k9JzYnIHI9JzQuNScvPjxwYXRoIHN0cm9rZS1saW5lam9pbj0ncm91bmQnIGQ9J001LjggMy42aC40TDYgNi41eicvPjxjaXJjbGUgY3g9JzYnIGN5PSc4LjInIHI9Jy42JyBmaWxsPScjeyRmb3JtLWZlZWRiYWNrLWljb24taW52YWxpZC1jb2xvcn0nIHN0cm9rZT0nbm9uZScvPjwvc3ZnPlxcXCIpICFkZWZhdWx0O1xcbi8vIHNjc3MtZG9jcy1lbmQgZm9ybS1mZWVkYmFjay12YXJpYWJsZXNcXG5cXG4vLyBzY3NzLWRvY3Mtc3RhcnQgZm9ybS12YWxpZGF0aW9uLWNvbG9yc1xcbiRmb3JtLXZhbGlkLWNvbG9yOiAgICAgICAgICAgICAgICAgICRmb3JtLWZlZWRiYWNrLXZhbGlkLWNvbG9yICFkZWZhdWx0O1xcbiRmb3JtLXZhbGlkLWJvcmRlci1jb2xvcjogICAgICAgICAgICRmb3JtLWZlZWRiYWNrLXZhbGlkLWNvbG9yICFkZWZhdWx0O1xcbiRmb3JtLWludmFsaWQtY29sb3I6ICAgICAgICAgICAgICAgICRmb3JtLWZlZWRiYWNrLWludmFsaWQtY29sb3IgIWRlZmF1bHQ7XFxuJGZvcm0taW52YWxpZC1ib3JkZXItY29sb3I6ICAgICAgICAgJGZvcm0tZmVlZGJhY2staW52YWxpZC1jb2xvciAhZGVmYXVsdDtcXG4vLyBzY3NzLWRvY3MtZW5kIGZvcm0tdmFsaWRhdGlvbi1jb2xvcnNcXG5cXG4vLyBzY3NzLWRvY3Mtc3RhcnQgZm9ybS12YWxpZGF0aW9uLXN0YXRlc1xcbiRmb3JtLXZhbGlkYXRpb24tc3RhdGVzOiAoXFxuICBcXFwidmFsaWRcXFwiOiAoXFxuICAgIFxcXCJjb2xvclxcXCI6IHZhcigtLSN7JHByZWZpeH1mb3JtLXZhbGlkLWNvbG9yKSxcXG4gICAgXFxcImljb25cXFwiOiAkZm9ybS1mZWVkYmFjay1pY29uLXZhbGlkLFxcbiAgICBcXFwidG9vbHRpcC1jb2xvclxcXCI6ICNmZmYsXFxuICAgIFxcXCJ0b29sdGlwLWJnLWNvbG9yXFxcIjogdmFyKC0tI3skcHJlZml4fXN1Y2Nlc3MpLFxcbiAgICBcXFwiZm9jdXMtYm94LXNoYWRvd1xcXCI6IDAgMCAkaW5wdXQtYnRuLWZvY3VzLWJsdXIgJGlucHV0LWZvY3VzLXdpZHRoIHJnYmEodmFyKC0tI3skcHJlZml4fXN1Y2Nlc3MtcmdiKSwgJGlucHV0LWJ0bi1mb2N1cy1jb2xvci1vcGFjaXR5KSxcXG4gICAgXFxcImJvcmRlci1jb2xvclxcXCI6IHZhcigtLSN7JHByZWZpeH1mb3JtLXZhbGlkLWJvcmRlci1jb2xvciksXFxuICApLFxcbiAgXFxcImludmFsaWRcXFwiOiAoXFxuICAgIFxcXCJjb2xvclxcXCI6IHZhcigtLSN7JHByZWZpeH1mb3JtLWludmFsaWQtY29sb3IpLFxcbiAgICBcXFwiaWNvblxcXCI6ICRmb3JtLWZlZWRiYWNrLWljb24taW52YWxpZCxcXG4gICAgXFxcInRvb2x0aXAtY29sb3JcXFwiOiAjZmZmLFxcbiAgICBcXFwidG9vbHRpcC1iZy1jb2xvclxcXCI6IHZhcigtLSN7JHByZWZpeH1kYW5nZXIpLFxcbiAgICBcXFwiZm9jdXMtYm94LXNoYWRvd1xcXCI6IDAgMCAkaW5wdXQtYnRuLWZvY3VzLWJsdXIgJGlucHV0LWZvY3VzLXdpZHRoIHJnYmEodmFyKC0tI3skcHJlZml4fWRhbmdlci1yZ2IpLCAkaW5wdXQtYnRuLWZvY3VzLWNvbG9yLW9wYWNpdHkpLFxcbiAgICBcXFwiYm9yZGVyLWNvbG9yXFxcIjogdmFyKC0tI3skcHJlZml4fWZvcm0taW52YWxpZC1ib3JkZXItY29sb3IpLFxcbiAgKVxcbikgIWRlZmF1bHQ7XFxuLy8gc2Nzcy1kb2NzLWVuZCBmb3JtLXZhbGlkYXRpb24tc3RhdGVzXFxuXFxuLy8gWi1pbmRleCBtYXN0ZXIgbGlzdFxcbi8vXFxuLy8gV2FybmluZzogQXZvaWQgY3VzdG9taXppbmcgdGhlc2UgdmFsdWVzLiBUaGV5J3JlIHVzZWQgZm9yIGEgYmlyZCdzIGV5ZSB2aWV3XFxuLy8gb2YgY29tcG9uZW50cyBkZXBlbmRlbnQgb24gdGhlIHotYXhpcyBhbmQgYXJlIGRlc2lnbmVkIHRvIGFsbCB3b3JrIHRvZ2V0aGVyLlxcblxcbi8vIHNjc3MtZG9jcy1zdGFydCB6aW5kZXgtc3RhY2tcXG4kemluZGV4LWRyb3Bkb3duOiAgICAgICAgICAgICAgICAgICAxMDAwICFkZWZhdWx0O1xcbiR6aW5kZXgtc3RpY2t5OiAgICAgICAgICAgICAgICAgICAgIDEwMjAgIWRlZmF1bHQ7XFxuJHppbmRleC1maXhlZDogICAgICAgICAgICAgICAgICAgICAgMTAzMCAhZGVmYXVsdDtcXG4kemluZGV4LW9mZmNhbnZhcy1iYWNrZHJvcDogICAgICAgICAxMDQwICFkZWZhdWx0O1xcbiR6aW5kZXgtb2ZmY2FudmFzOiAgICAgICAgICAgICAgICAgIDEwNDUgIWRlZmF1bHQ7XFxuJHppbmRleC1tb2RhbC1iYWNrZHJvcDogICAgICAgICAgICAgMTA1MCAhZGVmYXVsdDtcXG4kemluZGV4LW1vZGFsOiAgICAgICAgICAgICAgICAgICAgICAxMDU1ICFkZWZhdWx0O1xcbiR6aW5kZXgtcG9wb3ZlcjogICAgICAgICAgICAgICAgICAgIDEwNzAgIWRlZmF1bHQ7XFxuJHppbmRleC10b29sdGlwOiAgICAgICAgICAgICAgICAgICAgMTA4MCAhZGVmYXVsdDtcXG4kemluZGV4LXRvYXN0OiAgICAgICAgICAgICAgICAgICAgICAxMDkwICFkZWZhdWx0O1xcbi8vIHNjc3MtZG9jcy1lbmQgemluZGV4LXN0YWNrXFxuXFxuLy8gc2Nzcy1kb2NzLXN0YXJ0IHppbmRleC1sZXZlbHMtbWFwXFxuJHppbmRleC1sZXZlbHM6IChcXG4gIG4xOiAtMSxcXG4gIDA6IDAsXFxuICAxOiAxLFxcbiAgMjogMixcXG4gIDM6IDNcXG4pICFkZWZhdWx0O1xcbi8vIHNjc3MtZG9jcy1lbmQgemluZGV4LWxldmVscy1tYXBcXG5cXG5cXG4vLyBOYXZzXFxuXFxuLy8gc2Nzcy1kb2NzLXN0YXJ0IG5hdi12YXJpYWJsZXNcXG4kbmF2LWxpbmstcGFkZGluZy15OiAgICAgICAgICAgICAgICAuNXJlbSAhZGVmYXVsdDtcXG4kbmF2LWxpbmstcGFkZGluZy14OiAgICAgICAgICAgICAgICAxcmVtICFkZWZhdWx0O1xcbiRuYXYtbGluay1mb250LXNpemU6ICAgICAgICAgICAgICAgIG51bGwgIWRlZmF1bHQ7XFxuJG5hdi1saW5rLWZvbnQtd2VpZ2h0OiAgICAgICAgICAgICAgbnVsbCAhZGVmYXVsdDtcXG4kbmF2LWxpbmstY29sb3I6ICAgICAgICAgICAgICAgICAgICB2YXIoLS0jeyRwcmVmaXh9bGluay1jb2xvcikgIWRlZmF1bHQ7XFxuJG5hdi1saW5rLWhvdmVyLWNvbG9yOiAgICAgICAgICAgICAgdmFyKC0tI3skcHJlZml4fWxpbmstaG92ZXItY29sb3IpICFkZWZhdWx0O1xcbiRuYXYtbGluay10cmFuc2l0aW9uOiAgICAgICAgICAgICAgIGNvbG9yIC4xNXMgZWFzZS1pbi1vdXQsIGJhY2tncm91bmQtY29sb3IgLjE1cyBlYXNlLWluLW91dCwgYm9yZGVyLWNvbG9yIC4xNXMgZWFzZS1pbi1vdXQgIWRlZmF1bHQ7XFxuJG5hdi1saW5rLWRpc2FibGVkLWNvbG9yOiAgICAgICAgICAgdmFyKC0tI3skcHJlZml4fXNlY29uZGFyeS1jb2xvcikgIWRlZmF1bHQ7XFxuJG5hdi1saW5rLWZvY3VzLWJveC1zaGFkb3c6ICAgICAgICAgJGZvY3VzLXJpbmctYm94LXNoYWRvdyAhZGVmYXVsdDtcXG5cXG4kbmF2LXRhYnMtYm9yZGVyLWNvbG9yOiAgICAgICAgICAgICB2YXIoLS0jeyRwcmVmaXh9Ym9yZGVyLWNvbG9yKSAhZGVmYXVsdDtcXG4kbmF2LXRhYnMtYm9yZGVyLXdpZHRoOiAgICAgICAgICAgICB2YXIoLS0jeyRwcmVmaXh9Ym9yZGVyLXdpZHRoKSAhZGVmYXVsdDtcXG4kbmF2LXRhYnMtYm9yZGVyLXJhZGl1czogICAgICAgICAgICB2YXIoLS0jeyRwcmVmaXh9Ym9yZGVyLXJhZGl1cykgIWRlZmF1bHQ7XFxuJG5hdi10YWJzLWxpbmstaG92ZXItYm9yZGVyLWNvbG9yOiAgdmFyKC0tI3skcHJlZml4fXNlY29uZGFyeS1iZykgdmFyKC0tI3skcHJlZml4fXNlY29uZGFyeS1iZykgJG5hdi10YWJzLWJvcmRlci1jb2xvciAhZGVmYXVsdDtcXG4kbmF2LXRhYnMtbGluay1hY3RpdmUtY29sb3I6ICAgICAgICB2YXIoLS0jeyRwcmVmaXh9ZW1waGFzaXMtY29sb3IpICFkZWZhdWx0O1xcbiRuYXYtdGFicy1saW5rLWFjdGl2ZS1iZzogICAgICAgICAgIHZhcigtLSN7JHByZWZpeH1ib2R5LWJnKSAhZGVmYXVsdDtcXG4kbmF2LXRhYnMtbGluay1hY3RpdmUtYm9yZGVyLWNvbG9yOiB2YXIoLS0jeyRwcmVmaXh9Ym9yZGVyLWNvbG9yKSB2YXIoLS0jeyRwcmVmaXh9Ym9yZGVyLWNvbG9yKSAkbmF2LXRhYnMtbGluay1hY3RpdmUtYmcgIWRlZmF1bHQ7XFxuXFxuJG5hdi1waWxscy1ib3JkZXItcmFkaXVzOiAgICAgICAgICAgdmFyKC0tI3skcHJlZml4fWJvcmRlci1yYWRpdXMpICFkZWZhdWx0O1xcbiRuYXYtcGlsbHMtbGluay1hY3RpdmUtY29sb3I6ICAgICAgICRjb21wb25lbnQtYWN0aXZlLWNvbG9yICFkZWZhdWx0O1xcbiRuYXYtcGlsbHMtbGluay1hY3RpdmUtYmc6ICAgICAgICAgICRjb21wb25lbnQtYWN0aXZlLWJnICFkZWZhdWx0O1xcblxcbiRuYXYtdW5kZXJsaW5lLWdhcDogICAgICAgICAgICAgICAgIDFyZW0gIWRlZmF1bHQ7XFxuJG5hdi11bmRlcmxpbmUtYm9yZGVyLXdpZHRoOiAgICAgICAgLjEyNXJlbSAhZGVmYXVsdDtcXG4kbmF2LXVuZGVybGluZS1saW5rLWFjdGl2ZS1jb2xvcjogICB2YXIoLS0jeyRwcmVmaXh9ZW1waGFzaXMtY29sb3IpICFkZWZhdWx0O1xcbi8vIHNjc3MtZG9jcy1lbmQgbmF2LXZhcmlhYmxlc1xcblxcblxcbi8vIE5hdmJhclxcblxcbi8vIHNjc3MtZG9jcy1zdGFydCBuYXZiYXItdmFyaWFibGVzXFxuJG5hdmJhci1wYWRkaW5nLXk6ICAgICAgICAgICAgICAgICAgJHNwYWNlciAqIC41ICFkZWZhdWx0O1xcbiRuYXZiYXItcGFkZGluZy14OiAgICAgICAgICAgICAgICAgIG51bGwgIWRlZmF1bHQ7XFxuXFxuJG5hdmJhci1uYXYtbGluay1wYWRkaW5nLXg6ICAgICAgICAgLjVyZW0gIWRlZmF1bHQ7XFxuXFxuJG5hdmJhci1icmFuZC1mb250LXNpemU6ICAgICAgICAgICAgJGZvbnQtc2l6ZS1sZyAhZGVmYXVsdDtcXG4vLyBDb21wdXRlIHRoZSBuYXZiYXItYnJhbmQgcGFkZGluZy15IHNvIHRoZSBuYXZiYXItYnJhbmQgd2lsbCBoYXZlIHRoZSBzYW1lIGhlaWdodCBhcyBuYXZiYXItdGV4dCBhbmQgbmF2LWxpbmtcXG4kbmF2LWxpbmstaGVpZ2h0OiAgICAgICAgICAgICAgICAgICAkZm9udC1zaXplLWJhc2UgKiAkbGluZS1oZWlnaHQtYmFzZSArICRuYXYtbGluay1wYWRkaW5nLXkgKiAyICFkZWZhdWx0O1xcbiRuYXZiYXItYnJhbmQtaGVpZ2h0OiAgICAgICAgICAgICAgICRuYXZiYXItYnJhbmQtZm9udC1zaXplICogJGxpbmUtaGVpZ2h0LWJhc2UgIWRlZmF1bHQ7XFxuJG5hdmJhci1icmFuZC1wYWRkaW5nLXk6ICAgICAgICAgICAgKCRuYXYtbGluay1oZWlnaHQgLSAkbmF2YmFyLWJyYW5kLWhlaWdodCkgKiAuNSAhZGVmYXVsdDtcXG4kbmF2YmFyLWJyYW5kLW1hcmdpbi1lbmQ6ICAgICAgICAgICAxcmVtICFkZWZhdWx0O1xcblxcbiRuYXZiYXItdG9nZ2xlci1wYWRkaW5nLXk6ICAgICAgICAgIC4yNXJlbSAhZGVmYXVsdDtcXG4kbmF2YmFyLXRvZ2dsZXItcGFkZGluZy14OiAgICAgICAgICAuNzVyZW0gIWRlZmF1bHQ7XFxuJG5hdmJhci10b2dnbGVyLWZvbnQtc2l6ZTogICAgICAgICAgJGZvbnQtc2l6ZS1sZyAhZGVmYXVsdDtcXG4kbmF2YmFyLXRvZ2dsZXItYm9yZGVyLXJhZGl1czogICAgICAkYnRuLWJvcmRlci1yYWRpdXMgIWRlZmF1bHQ7XFxuJG5hdmJhci10b2dnbGVyLWZvY3VzLXdpZHRoOiAgICAgICAgJGJ0bi1mb2N1cy13aWR0aCAhZGVmYXVsdDtcXG4kbmF2YmFyLXRvZ2dsZXItdHJhbnNpdGlvbjogICAgICAgICBib3gtc2hhZG93IC4xNXMgZWFzZS1pbi1vdXQgIWRlZmF1bHQ7XFxuXFxuJG5hdmJhci1saWdodC1jb2xvcjogICAgICAgICAgICAgICAgcmdiYSh2YXIoLS0jeyRwcmVmaXh9ZW1waGFzaXMtY29sb3ItcmdiKSwgLjY1KSAhZGVmYXVsdDtcXG4kbmF2YmFyLWxpZ2h0LWhvdmVyLWNvbG9yOiAgICAgICAgICByZ2JhKHZhcigtLSN7JHByZWZpeH1lbXBoYXNpcy1jb2xvci1yZ2IpLCAuOCkgIWRlZmF1bHQ7XFxuJG5hdmJhci1saWdodC1hY3RpdmUtY29sb3I6ICAgICAgICAgcmdiYSh2YXIoLS0jeyRwcmVmaXh9ZW1waGFzaXMtY29sb3ItcmdiKSwgMSkgIWRlZmF1bHQ7XFxuJG5hdmJhci1saWdodC1kaXNhYmxlZC1jb2xvcjogICAgICAgcmdiYSh2YXIoLS0jeyRwcmVmaXh9ZW1waGFzaXMtY29sb3ItcmdiKSwgLjMpICFkZWZhdWx0O1xcbiRuYXZiYXItbGlnaHQtaWNvbi1jb2xvcjogICAgICAgICAgIHJnYmEoJGJvZHktY29sb3IsIC43NSkgIWRlZmF1bHQ7XFxuJG5hdmJhci1saWdodC10b2dnbGVyLWljb24tYmc6ICAgICAgdXJsKFxcXCJkYXRhOmltYWdlL3N2Zyt4bWwsPHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAzMCAzMCc+PHBhdGggc3Ryb2tlPScjeyRuYXZiYXItbGlnaHQtaWNvbi1jb2xvcn0nIHN0cm9rZS1saW5lY2FwPSdyb3VuZCcgc3Ryb2tlLW1pdGVybGltaXQ9JzEwJyBzdHJva2Utd2lkdGg9JzInIGQ9J000IDdoMjJNNCAxNWgyMk00IDIzaDIyJy8+PC9zdmc+XFxcIikgIWRlZmF1bHQ7XFxuJG5hdmJhci1saWdodC10b2dnbGVyLWJvcmRlci1jb2xvcjogcmdiYSh2YXIoLS0jeyRwcmVmaXh9ZW1waGFzaXMtY29sb3ItcmdiKSwgLjE1KSAhZGVmYXVsdDtcXG4kbmF2YmFyLWxpZ2h0LWJyYW5kLWNvbG9yOiAgICAgICAgICAkbmF2YmFyLWxpZ2h0LWFjdGl2ZS1jb2xvciAhZGVmYXVsdDtcXG4kbmF2YmFyLWxpZ2h0LWJyYW5kLWhvdmVyLWNvbG9yOiAgICAkbmF2YmFyLWxpZ2h0LWFjdGl2ZS1jb2xvciAhZGVmYXVsdDtcXG4vLyBzY3NzLWRvY3MtZW5kIG5hdmJhci12YXJpYWJsZXNcXG5cXG4vLyBzY3NzLWRvY3Mtc3RhcnQgbmF2YmFyLWRhcmstdmFyaWFibGVzXFxuJG5hdmJhci1kYXJrLWNvbG9yOiAgICAgICAgICAgICAgICAgcmdiYSgkd2hpdGUsIC41NSkgIWRlZmF1bHQ7XFxuJG5hdmJhci1kYXJrLWhvdmVyLWNvbG9yOiAgICAgICAgICAgcmdiYSgkd2hpdGUsIC43NSkgIWRlZmF1bHQ7XFxuJG5hdmJhci1kYXJrLWFjdGl2ZS1jb2xvcjogICAgICAgICAgJHdoaXRlICFkZWZhdWx0O1xcbiRuYXZiYXItZGFyay1kaXNhYmxlZC1jb2xvcjogICAgICAgIHJnYmEoJHdoaXRlLCAuMjUpICFkZWZhdWx0O1xcbiRuYXZiYXItZGFyay1pY29uLWNvbG9yOiAgICAgICAgICAgICRuYXZiYXItZGFyay1jb2xvciAhZGVmYXVsdDtcXG4kbmF2YmFyLWRhcmstdG9nZ2xlci1pY29uLWJnOiAgICAgICB1cmwoXFxcImRhdGE6aW1hZ2Uvc3ZnK3htbCw8c3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgdmlld0JveD0nMCAwIDMwIDMwJz48cGF0aCBzdHJva2U9JyN7JG5hdmJhci1kYXJrLWljb24tY29sb3J9JyBzdHJva2UtbGluZWNhcD0ncm91bmQnIHN0cm9rZS1taXRlcmxpbWl0PScxMCcgc3Ryb2tlLXdpZHRoPScyJyBkPSdNNCA3aDIyTTQgMTVoMjJNNCAyM2gyMicvPjwvc3ZnPlxcXCIpICFkZWZhdWx0O1xcbiRuYXZiYXItZGFyay10b2dnbGVyLWJvcmRlci1jb2xvcjogIHJnYmEoJHdoaXRlLCAuMSkgIWRlZmF1bHQ7XFxuJG5hdmJhci1kYXJrLWJyYW5kLWNvbG9yOiAgICAgICAgICAgJG5hdmJhci1kYXJrLWFjdGl2ZS1jb2xvciAhZGVmYXVsdDtcXG4kbmF2YmFyLWRhcmstYnJhbmQtaG92ZXItY29sb3I6ICAgICAkbmF2YmFyLWRhcmstYWN0aXZlLWNvbG9yICFkZWZhdWx0O1xcbi8vIHNjc3MtZG9jcy1lbmQgbmF2YmFyLWRhcmstdmFyaWFibGVzXFxuXFxuXFxuLy8gRHJvcGRvd25zXFxuLy9cXG4vLyBEcm9wZG93biBtZW51IGNvbnRhaW5lciBhbmQgY29udGVudHMuXFxuXFxuLy8gc2Nzcy1kb2NzLXN0YXJ0IGRyb3Bkb3duLXZhcmlhYmxlc1xcbiRkcm9wZG93bi1taW4td2lkdGg6ICAgICAgICAgICAgICAgIDEwcmVtICFkZWZhdWx0O1xcbiRkcm9wZG93bi1wYWRkaW5nLXg6ICAgICAgICAgICAgICAgIDAgIWRlZmF1bHQ7XFxuJGRyb3Bkb3duLXBhZGRpbmcteTogICAgICAgICAgICAgICAgLjVyZW0gIWRlZmF1bHQ7XFxuJGRyb3Bkb3duLXNwYWNlcjogICAgICAgICAgICAgICAgICAgLjEyNXJlbSAhZGVmYXVsdDtcXG4kZHJvcGRvd24tZm9udC1zaXplOiAgICAgICAgICAgICAgICAkZm9udC1zaXplLWJhc2UgIWRlZmF1bHQ7XFxuJGRyb3Bkb3duLWNvbG9yOiAgICAgICAgICAgICAgICAgICAgdmFyKC0tI3skcHJlZml4fWJvZHktY29sb3IpICFkZWZhdWx0O1xcbiRkcm9wZG93bi1iZzogICAgICAgICAgICAgICAgICAgICAgIHZhcigtLSN7JHByZWZpeH1ib2R5LWJnKSAhZGVmYXVsdDtcXG4kZHJvcGRvd24tYm9yZGVyLWNvbG9yOiAgICAgICAgICAgICB2YXIoLS0jeyRwcmVmaXh9Ym9yZGVyLWNvbG9yLXRyYW5zbHVjZW50KSAhZGVmYXVsdDtcXG4kZHJvcGRvd24tYm9yZGVyLXJhZGl1czogICAgICAgICAgICB2YXIoLS0jeyRwcmVmaXh9Ym9yZGVyLXJhZGl1cykgIWRlZmF1bHQ7XFxuJGRyb3Bkb3duLWJvcmRlci13aWR0aDogICAgICAgICAgICAgdmFyKC0tI3skcHJlZml4fWJvcmRlci13aWR0aCkgIWRlZmF1bHQ7XFxuJGRyb3Bkb3duLWlubmVyLWJvcmRlci1yYWRpdXM6ICAgICAgY2FsYygjeyRkcm9wZG93bi1ib3JkZXItcmFkaXVzfSAtICN7JGRyb3Bkb3duLWJvcmRlci13aWR0aH0pICFkZWZhdWx0OyAvLyBzdHlsZWxpbnQtZGlzYWJsZS1saW5lIGZ1bmN0aW9uLWRpc2FsbG93ZWQtbGlzdFxcbiRkcm9wZG93bi1kaXZpZGVyLWJnOiAgICAgICAgICAgICAgICRkcm9wZG93bi1ib3JkZXItY29sb3IgIWRlZmF1bHQ7XFxuJGRyb3Bkb3duLWRpdmlkZXItbWFyZ2luLXk6ICAgICAgICAgJHNwYWNlciAqIC41ICFkZWZhdWx0O1xcbiRkcm9wZG93bi1ib3gtc2hhZG93OiAgICAgICAgICAgICAgIHZhcigtLSN7JHByZWZpeH1ib3gtc2hhZG93KSAhZGVmYXVsdDtcXG5cXG4kZHJvcGRvd24tbGluay1jb2xvcjogICAgICAgICAgICAgICB2YXIoLS0jeyRwcmVmaXh9Ym9keS1jb2xvcikgIWRlZmF1bHQ7XFxuJGRyb3Bkb3duLWxpbmstaG92ZXItY29sb3I6ICAgICAgICAgJGRyb3Bkb3duLWxpbmstY29sb3IgIWRlZmF1bHQ7XFxuJGRyb3Bkb3duLWxpbmstaG92ZXItYmc6ICAgICAgICAgICAgdmFyKC0tI3skcHJlZml4fXRlcnRpYXJ5LWJnKSAhZGVmYXVsdDtcXG5cXG4kZHJvcGRvd24tbGluay1hY3RpdmUtY29sb3I6ICAgICAgICAkY29tcG9uZW50LWFjdGl2ZS1jb2xvciAhZGVmYXVsdDtcXG4kZHJvcGRvd24tbGluay1hY3RpdmUtYmc6ICAgICAgICAgICAkY29tcG9uZW50LWFjdGl2ZS1iZyAhZGVmYXVsdDtcXG5cXG4kZHJvcGRvd24tbGluay1kaXNhYmxlZC1jb2xvcjogICAgICB2YXIoLS0jeyRwcmVmaXh9dGVydGlhcnktY29sb3IpICFkZWZhdWx0O1xcblxcbiRkcm9wZG93bi1pdGVtLXBhZGRpbmcteTogICAgICAgICAgICRzcGFjZXIgKiAuMjUgIWRlZmF1bHQ7XFxuJGRyb3Bkb3duLWl0ZW0tcGFkZGluZy14OiAgICAgICAgICAgJHNwYWNlciAhZGVmYXVsdDtcXG5cXG4kZHJvcGRvd24taGVhZGVyLWNvbG9yOiAgICAgICAgICAgICAkZ3JheS02MDAgIWRlZmF1bHQ7XFxuJGRyb3Bkb3duLWhlYWRlci1wYWRkaW5nLXg6ICAgICAgICAgJGRyb3Bkb3duLWl0ZW0tcGFkZGluZy14ICFkZWZhdWx0O1xcbiRkcm9wZG93bi1oZWFkZXItcGFkZGluZy15OiAgICAgICAgICRkcm9wZG93bi1wYWRkaW5nLXkgIWRlZmF1bHQ7XFxuLy8gZnVzdi1kaXNhYmxlXFxuJGRyb3Bkb3duLWhlYWRlci1wYWRkaW5nOiAgICAgICAgICAgJGRyb3Bkb3duLWhlYWRlci1wYWRkaW5nLXkgJGRyb3Bkb3duLWhlYWRlci1wYWRkaW5nLXggIWRlZmF1bHQ7IC8vIERlcHJlY2F0ZWQgaW4gdjUuMi4wXFxuLy8gZnVzdi1lbmFibGVcXG4vLyBzY3NzLWRvY3MtZW5kIGRyb3Bkb3duLXZhcmlhYmxlc1xcblxcbi8vIHNjc3MtZG9jcy1zdGFydCBkcm9wZG93bi1kYXJrLXZhcmlhYmxlc1xcbiRkcm9wZG93bi1kYXJrLWNvbG9yOiAgICAgICAgICAgICAgICRncmF5LTMwMCAhZGVmYXVsdDtcXG4kZHJvcGRvd24tZGFyay1iZzogICAgICAgICAgICAgICAgICAkZ3JheS04MDAgIWRlZmF1bHQ7XFxuJGRyb3Bkb3duLWRhcmstYm9yZGVyLWNvbG9yOiAgICAgICAgJGRyb3Bkb3duLWJvcmRlci1jb2xvciAhZGVmYXVsdDtcXG4kZHJvcGRvd24tZGFyay1kaXZpZGVyLWJnOiAgICAgICAgICAkZHJvcGRvd24tZGl2aWRlci1iZyAhZGVmYXVsdDtcXG4kZHJvcGRvd24tZGFyay1ib3gtc2hhZG93OiAgICAgICAgICBudWxsICFkZWZhdWx0O1xcbiRkcm9wZG93bi1kYXJrLWxpbmstY29sb3I6ICAgICAgICAgICRkcm9wZG93bi1kYXJrLWNvbG9yICFkZWZhdWx0O1xcbiRkcm9wZG93bi1kYXJrLWxpbmstaG92ZXItY29sb3I6ICAgICR3aGl0ZSAhZGVmYXVsdDtcXG4kZHJvcGRvd24tZGFyay1saW5rLWhvdmVyLWJnOiAgICAgICByZ2JhKCR3aGl0ZSwgLjE1KSAhZGVmYXVsdDtcXG4kZHJvcGRvd24tZGFyay1saW5rLWFjdGl2ZS1jb2xvcjogICAkZHJvcGRvd24tbGluay1hY3RpdmUtY29sb3IgIWRlZmF1bHQ7XFxuJGRyb3Bkb3duLWRhcmstbGluay1hY3RpdmUtYmc6ICAgICAgJGRyb3Bkb3duLWxpbmstYWN0aXZlLWJnICFkZWZhdWx0O1xcbiRkcm9wZG93bi1kYXJrLWxpbmstZGlzYWJsZWQtY29sb3I6ICRncmF5LTUwMCAhZGVmYXVsdDtcXG4kZHJvcGRvd24tZGFyay1oZWFkZXItY29sb3I6ICAgICAgICAkZ3JheS01MDAgIWRlZmF1bHQ7XFxuLy8gc2Nzcy1kb2NzLWVuZCBkcm9wZG93bi1kYXJrLXZhcmlhYmxlc1xcblxcblxcbi8vIFBhZ2luYXRpb25cXG5cXG4vLyBzY3NzLWRvY3Mtc3RhcnQgcGFnaW5hdGlvbi12YXJpYWJsZXNcXG4kcGFnaW5hdGlvbi1wYWRkaW5nLXk6ICAgICAgICAgICAgICAuMzc1cmVtICFkZWZhdWx0O1xcbiRwYWdpbmF0aW9uLXBhZGRpbmcteDogICAgICAgICAgICAgIC43NXJlbSAhZGVmYXVsdDtcXG4kcGFnaW5hdGlvbi1wYWRkaW5nLXktc206ICAgICAgICAgICAuMjVyZW0gIWRlZmF1bHQ7XFxuJHBhZ2luYXRpb24tcGFkZGluZy14LXNtOiAgICAgICAgICAgLjVyZW0gIWRlZmF1bHQ7XFxuJHBhZ2luYXRpb24tcGFkZGluZy15LWxnOiAgICAgICAgICAgLjc1cmVtICFkZWZhdWx0O1xcbiRwYWdpbmF0aW9uLXBhZGRpbmcteC1sZzogICAgICAgICAgIDEuNXJlbSAhZGVmYXVsdDtcXG5cXG4kcGFnaW5hdGlvbi1mb250LXNpemU6ICAgICAgICAgICAgICAkZm9udC1zaXplLWJhc2UgIWRlZmF1bHQ7XFxuXFxuJHBhZ2luYXRpb24tY29sb3I6ICAgICAgICAgICAgICAgICAgdmFyKC0tI3skcHJlZml4fWxpbmstY29sb3IpICFkZWZhdWx0O1xcbiRwYWdpbmF0aW9uLWJnOiAgICAgICAgICAgICAgICAgICAgIHZhcigtLSN7JHByZWZpeH1ib2R5LWJnKSAhZGVmYXVsdDtcXG4kcGFnaW5hdGlvbi1ib3JkZXItcmFkaXVzOiAgICAgICAgICB2YXIoLS0jeyRwcmVmaXh9Ym9yZGVyLXJhZGl1cykgIWRlZmF1bHQ7XFxuJHBhZ2luYXRpb24tYm9yZGVyLXdpZHRoOiAgICAgICAgICAgdmFyKC0tI3skcHJlZml4fWJvcmRlci13aWR0aCkgIWRlZmF1bHQ7XFxuJHBhZ2luYXRpb24tbWFyZ2luLXN0YXJ0OiAgICAgICAgICAgY2FsYygjeyRwYWdpbmF0aW9uLWJvcmRlci13aWR0aH0gKiAtMSkgIWRlZmF1bHQ7IC8vIHN0eWxlbGludC1kaXNhYmxlLWxpbmUgZnVuY3Rpb24tZGlzYWxsb3dlZC1saXN0XFxuJHBhZ2luYXRpb24tYm9yZGVyLWNvbG9yOiAgICAgICAgICAgdmFyKC0tI3skcHJlZml4fWJvcmRlci1jb2xvcikgIWRlZmF1bHQ7XFxuXFxuJHBhZ2luYXRpb24tZm9jdXMtY29sb3I6ICAgICAgICAgICAgdmFyKC0tI3skcHJlZml4fWxpbmstaG92ZXItY29sb3IpICFkZWZhdWx0O1xcbiRwYWdpbmF0aW9uLWZvY3VzLWJnOiAgICAgICAgICAgICAgIHZhcigtLSN7JHByZWZpeH1zZWNvbmRhcnktYmcpICFkZWZhdWx0O1xcbiRwYWdpbmF0aW9uLWZvY3VzLWJveC1zaGFkb3c6ICAgICAgICRmb2N1cy1yaW5nLWJveC1zaGFkb3cgIWRlZmF1bHQ7XFxuJHBhZ2luYXRpb24tZm9jdXMtb3V0bGluZTogICAgICAgICAgMCAhZGVmYXVsdDtcXG5cXG4kcGFnaW5hdGlvbi1ob3Zlci1jb2xvcjogICAgICAgICAgICB2YXIoLS0jeyRwcmVmaXh9bGluay1ob3Zlci1jb2xvcikgIWRlZmF1bHQ7XFxuJHBhZ2luYXRpb24taG92ZXItYmc6ICAgICAgICAgICAgICAgdmFyKC0tI3skcHJlZml4fXRlcnRpYXJ5LWJnKSAhZGVmYXVsdDtcXG4kcGFnaW5hdGlvbi1ob3Zlci1ib3JkZXItY29sb3I6ICAgICB2YXIoLS0jeyRwcmVmaXh9Ym9yZGVyLWNvbG9yKSAhZGVmYXVsdDsgLy8gVG9kbyBpbiB2NjogcmVtb3ZlIHRoaXM/XFxuXFxuJHBhZ2luYXRpb24tYWN0aXZlLWNvbG9yOiAgICAgICAgICAgJGNvbXBvbmVudC1hY3RpdmUtY29sb3IgIWRlZmF1bHQ7XFxuJHBhZ2luYXRpb24tYWN0aXZlLWJnOiAgICAgICAgICAgICAgJGNvbXBvbmVudC1hY3RpdmUtYmcgIWRlZmF1bHQ7XFxuJHBhZ2luYXRpb24tYWN0aXZlLWJvcmRlci1jb2xvcjogICAgJGNvbXBvbmVudC1hY3RpdmUtYmcgIWRlZmF1bHQ7XFxuXFxuJHBhZ2luYXRpb24tZGlzYWJsZWQtY29sb3I6ICAgICAgICAgdmFyKC0tI3skcHJlZml4fXNlY29uZGFyeS1jb2xvcikgIWRlZmF1bHQ7XFxuJHBhZ2luYXRpb24tZGlzYWJsZWQtYmc6ICAgICAgICAgICAgdmFyKC0tI3skcHJlZml4fXNlY29uZGFyeS1iZykgIWRlZmF1bHQ7XFxuJHBhZ2luYXRpb24tZGlzYWJsZWQtYm9yZGVyLWNvbG9yOiAgdmFyKC0tI3skcHJlZml4fWJvcmRlci1jb2xvcikgIWRlZmF1bHQ7XFxuXFxuJHBhZ2luYXRpb24tdHJhbnNpdGlvbjogICAgICAgICAgICAgIGNvbG9yIC4xNXMgZWFzZS1pbi1vdXQsIGJhY2tncm91bmQtY29sb3IgLjE1cyBlYXNlLWluLW91dCwgYm9yZGVyLWNvbG9yIC4xNXMgZWFzZS1pbi1vdXQsIGJveC1zaGFkb3cgLjE1cyBlYXNlLWluLW91dCAhZGVmYXVsdDtcXG5cXG4kcGFnaW5hdGlvbi1ib3JkZXItcmFkaXVzLXNtOiAgICAgICB2YXIoLS0jeyRwcmVmaXh9Ym9yZGVyLXJhZGl1cy1zbSkgIWRlZmF1bHQ7XFxuJHBhZ2luYXRpb24tYm9yZGVyLXJhZGl1cy1sZzogICAgICAgdmFyKC0tI3skcHJlZml4fWJvcmRlci1yYWRpdXMtbGcpICFkZWZhdWx0O1xcbi8vIHNjc3MtZG9jcy1lbmQgcGFnaW5hdGlvbi12YXJpYWJsZXNcXG5cXG5cXG4vLyBQbGFjZWhvbGRlcnNcXG5cXG4vLyBzY3NzLWRvY3Mtc3RhcnQgcGxhY2Vob2xkZXJzXFxuJHBsYWNlaG9sZGVyLW9wYWNpdHktbWF4OiAgICAgICAgICAgLjUgIWRlZmF1bHQ7XFxuJHBsYWNlaG9sZGVyLW9wYWNpdHktbWluOiAgICAgICAgICAgLjIgIWRlZmF1bHQ7XFxuLy8gc2Nzcy1kb2NzLWVuZCBwbGFjZWhvbGRlcnNcXG5cXG4vLyBDYXJkc1xcblxcbi8vIHNjc3MtZG9jcy1zdGFydCBjYXJkLXZhcmlhYmxlc1xcbiRjYXJkLXNwYWNlci15OiAgICAgICAgICAgICAgICAgICAgICRzcGFjZXIgIWRlZmF1bHQ7XFxuJGNhcmQtc3BhY2VyLXg6ICAgICAgICAgICAgICAgICAgICAgJHNwYWNlciAhZGVmYXVsdDtcXG4kY2FyZC10aXRsZS1zcGFjZXIteTogICAgICAgICAgICAgICAkc3BhY2VyICogLjUgIWRlZmF1bHQ7XFxuJGNhcmQtdGl0bGUtY29sb3I6ICAgICAgICAgICAgICAgICAgbnVsbCAhZGVmYXVsdDtcXG4kY2FyZC1zdWJ0aXRsZS1jb2xvcjogICAgICAgICAgICAgICBudWxsICFkZWZhdWx0O1xcbiRjYXJkLWJvcmRlci13aWR0aDogICAgICAgICAgICAgICAgIHZhcigtLSN7JHByZWZpeH1ib3JkZXItd2lkdGgpICFkZWZhdWx0O1xcbiRjYXJkLWJvcmRlci1jb2xvcjogICAgICAgICAgICAgICAgIHZhcigtLSN7JHByZWZpeH1ib3JkZXItY29sb3ItdHJhbnNsdWNlbnQpICFkZWZhdWx0O1xcbiRjYXJkLWJvcmRlci1yYWRpdXM6ICAgICAgICAgICAgICAgIHZhcigtLSN7JHByZWZpeH1ib3JkZXItcmFkaXVzKSAhZGVmYXVsdDtcXG4kY2FyZC1ib3gtc2hhZG93OiAgICAgICAgICAgICAgICAgICBudWxsICFkZWZhdWx0O1xcbiRjYXJkLWlubmVyLWJvcmRlci1yYWRpdXM6ICAgICAgICAgIHN1YnRyYWN0KCRjYXJkLWJvcmRlci1yYWRpdXMsICRjYXJkLWJvcmRlci13aWR0aCkgIWRlZmF1bHQ7XFxuJGNhcmQtY2FwLXBhZGRpbmcteTogICAgICAgICAgICAgICAgJGNhcmQtc3BhY2VyLXkgKiAuNSAhZGVmYXVsdDtcXG4kY2FyZC1jYXAtcGFkZGluZy14OiAgICAgICAgICAgICAgICAkY2FyZC1zcGFjZXIteCAhZGVmYXVsdDtcXG4kY2FyZC1jYXAtYmc6ICAgICAgICAgICAgICAgICAgICAgICByZ2JhKHZhcigtLSN7JHByZWZpeH1ib2R5LWNvbG9yLXJnYiksIC4wMykgIWRlZmF1bHQ7XFxuJGNhcmQtY2FwLWNvbG9yOiAgICAgICAgICAgICAgICAgICAgbnVsbCAhZGVmYXVsdDtcXG4kY2FyZC1oZWlnaHQ6ICAgICAgICAgICAgICAgICAgICAgICBudWxsICFkZWZhdWx0O1xcbiRjYXJkLWNvbG9yOiAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgIWRlZmF1bHQ7XFxuJGNhcmQtYmc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyKC0tI3skcHJlZml4fWJvZHktYmcpICFkZWZhdWx0O1xcbiRjYXJkLWltZy1vdmVybGF5LXBhZGRpbmc6ICAgICAgICAgICRzcGFjZXIgIWRlZmF1bHQ7XFxuJGNhcmQtZ3JvdXAtbWFyZ2luOiAgICAgICAgICAgICAgICAgJGdyaWQtZ3V0dGVyLXdpZHRoICogLjUgIWRlZmF1bHQ7XFxuLy8gc2Nzcy1kb2NzLWVuZCBjYXJkLXZhcmlhYmxlc1xcblxcbi8vIEFjY29yZGlvblxcblxcbi8vIHNjc3MtZG9jcy1zdGFydCBhY2NvcmRpb24tdmFyaWFibGVzXFxuJGFjY29yZGlvbi1wYWRkaW5nLXk6ICAgICAgICAgICAgICAgICAgICAgMXJlbSAhZGVmYXVsdDtcXG4kYWNjb3JkaW9uLXBhZGRpbmcteDogICAgICAgICAgICAgICAgICAgICAxLjI1cmVtICFkZWZhdWx0O1xcbiRhY2NvcmRpb24tY29sb3I6ICAgICAgICAgICAgICAgICAgICAgICAgIHZhcigtLSN7JHByZWZpeH1ib2R5LWNvbG9yKSAhZGVmYXVsdDtcXG4kYWNjb3JkaW9uLWJnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIoLS0jeyRwcmVmaXh9Ym9keS1iZykgIWRlZmF1bHQ7XFxuJGFjY29yZGlvbi1ib3JkZXItd2lkdGg6ICAgICAgICAgICAgICAgICAgdmFyKC0tI3skcHJlZml4fWJvcmRlci13aWR0aCkgIWRlZmF1bHQ7XFxuJGFjY29yZGlvbi1ib3JkZXItY29sb3I6ICAgICAgICAgICAgICAgICAgdmFyKC0tI3skcHJlZml4fWJvcmRlci1jb2xvcikgIWRlZmF1bHQ7XFxuJGFjY29yZGlvbi1ib3JkZXItcmFkaXVzOiAgICAgICAgICAgICAgICAgdmFyKC0tI3skcHJlZml4fWJvcmRlci1yYWRpdXMpICFkZWZhdWx0O1xcbiRhY2NvcmRpb24taW5uZXItYm9yZGVyLXJhZGl1czogICAgICAgICAgIHN1YnRyYWN0KCRhY2NvcmRpb24tYm9yZGVyLXJhZGl1cywgJGFjY29yZGlvbi1ib3JkZXItd2lkdGgpICFkZWZhdWx0O1xcblxcbiRhY2NvcmRpb24tYm9keS1wYWRkaW5nLXk6ICAgICAgICAgICAgICAgICRhY2NvcmRpb24tcGFkZGluZy15ICFkZWZhdWx0O1xcbiRhY2NvcmRpb24tYm9keS1wYWRkaW5nLXg6ICAgICAgICAgICAgICAgICRhY2NvcmRpb24tcGFkZGluZy14ICFkZWZhdWx0O1xcblxcbiRhY2NvcmRpb24tYnV0dG9uLXBhZGRpbmcteTogICAgICAgICAgICAgICRhY2NvcmRpb24tcGFkZGluZy15ICFkZWZhdWx0O1xcbiRhY2NvcmRpb24tYnV0dG9uLXBhZGRpbmcteDogICAgICAgICAgICAgICRhY2NvcmRpb24tcGFkZGluZy14ICFkZWZhdWx0O1xcbiRhY2NvcmRpb24tYnV0dG9uLWNvbG9yOiAgICAgICAgICAgICAgICAgIHZhcigtLSN7JHByZWZpeH1ib2R5LWNvbG9yKSAhZGVmYXVsdDtcXG4kYWNjb3JkaW9uLWJ1dHRvbi1iZzogICAgICAgICAgICAgICAgICAgICB2YXIoLS0jeyRwcmVmaXh9YWNjb3JkaW9uLWJnKSAhZGVmYXVsdDtcXG4kYWNjb3JkaW9uLXRyYW5zaXRpb246ICAgICAgICAgICAgICAgICAgICAkYnRuLXRyYW5zaXRpb24sIGJvcmRlci1yYWRpdXMgLjE1cyBlYXNlICFkZWZhdWx0O1xcbiRhY2NvcmRpb24tYnV0dG9uLWFjdGl2ZS1iZzogICAgICAgICAgICAgIHZhcigtLSN7JHByZWZpeH1wcmltYXJ5LWJnLXN1YnRsZSkgIWRlZmF1bHQ7XFxuJGFjY29yZGlvbi1idXR0b24tYWN0aXZlLWNvbG9yOiAgICAgICAgICAgdmFyKC0tI3skcHJlZml4fXByaW1hcnktdGV4dC1lbXBoYXNpcykgIWRlZmF1bHQ7XFxuXFxuJGFjY29yZGlvbi1idXR0b24tZm9jdXMtYm9yZGVyLWNvbG9yOiAgICAgJGlucHV0LWZvY3VzLWJvcmRlci1jb2xvciAhZGVmYXVsdDtcXG4kYWNjb3JkaW9uLWJ1dHRvbi1mb2N1cy1ib3gtc2hhZG93OiAgICAgICAkYnRuLWZvY3VzLWJveC1zaGFkb3cgIWRlZmF1bHQ7XFxuXFxuJGFjY29yZGlvbi1pY29uLXdpZHRoOiAgICAgICAgICAgICAgICAgICAgMS4yNXJlbSAhZGVmYXVsdDtcXG4kYWNjb3JkaW9uLWljb24tY29sb3I6ICAgICAgICAgICAgICAgICAgICAkYm9keS1jb2xvciAhZGVmYXVsdDtcXG4kYWNjb3JkaW9uLWljb24tYWN0aXZlLWNvbG9yOiAgICAgICAgICAgICAkcHJpbWFyeS10ZXh0LWVtcGhhc2lzICFkZWZhdWx0O1xcbiRhY2NvcmRpb24taWNvbi10cmFuc2l0aW9uOiAgICAgICAgICAgICAgIHRyYW5zZm9ybSAuMnMgZWFzZS1pbi1vdXQgIWRlZmF1bHQ7XFxuJGFjY29yZGlvbi1pY29uLXRyYW5zZm9ybTogICAgICAgICAgICAgICAgcm90YXRlKC0xODBkZWcpICFkZWZhdWx0O1xcblxcbiRhY2NvcmRpb24tYnV0dG9uLWljb246ICAgICAgICAgdXJsKFxcXCJkYXRhOmltYWdlL3N2Zyt4bWwsPHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAxNiAxNicgZmlsbD0nI3skYWNjb3JkaW9uLWljb24tY29sb3J9Jz48cGF0aCBmaWxsLXJ1bGU9J2V2ZW5vZGQnIGQ9J00xLjY0NiA0LjY0NmEuNS41IDAgMCAxIC43MDggMEw4IDEwLjI5M2w1LjY0Ni01LjY0N2EuNS41IDAgMCAxIC43MDguNzA4bC02IDZhLjUuNSAwIDAgMS0uNzA4IDBsLTYtNmEuNS41IDAgMCAxIDAtLjcwOHonLz48L3N2Zz5cXFwiKSAhZGVmYXVsdDtcXG4kYWNjb3JkaW9uLWJ1dHRvbi1hY3RpdmUtaWNvbjogIHVybChcXFwiZGF0YTppbWFnZS9zdmcreG1sLDxzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB2aWV3Qm94PScwIDAgMTYgMTYnIGZpbGw9JyN7JGFjY29yZGlvbi1pY29uLWFjdGl2ZS1jb2xvcn0nPjxwYXRoIGZpbGwtcnVsZT0nZXZlbm9kZCcgZD0nTTEuNjQ2IDQuNjQ2YS41LjUgMCAwIDEgLjcwOCAwTDggMTAuMjkzbDUuNjQ2LTUuNjQ3YS41LjUgMCAwIDEgLjcwOC43MDhsLTYgNmEuNS41IDAgMCAxLS43MDggMGwtNi02YS41LjUgMCAwIDEgMC0uNzA4eicvPjwvc3ZnPlxcXCIpICFkZWZhdWx0O1xcbi8vIHNjc3MtZG9jcy1lbmQgYWNjb3JkaW9uLXZhcmlhYmxlc1xcblxcbi8vIFRvb2x0aXBzXFxuXFxuLy8gc2Nzcy1kb2NzLXN0YXJ0IHRvb2x0aXAtdmFyaWFibGVzXFxuJHRvb2x0aXAtZm9udC1zaXplOiAgICAgICAgICAgICAgICAgJGZvbnQtc2l6ZS1zbSAhZGVmYXVsdDtcXG4kdG9vbHRpcC1tYXgtd2lkdGg6ICAgICAgICAgICAgICAgICAyMDBweCAhZGVmYXVsdDtcXG4kdG9vbHRpcC1jb2xvcjogICAgICAgICAgICAgICAgICAgICB2YXIoLS0jeyRwcmVmaXh9Ym9keS1iZykgIWRlZmF1bHQ7XFxuJHRvb2x0aXAtYmc6ICAgICAgICAgICAgICAgICAgICAgICAgdmFyKC0tI3skcHJlZml4fWVtcGhhc2lzLWNvbG9yKSAhZGVmYXVsdDtcXG4kdG9vbHRpcC1ib3JkZXItcmFkaXVzOiAgICAgICAgICAgICB2YXIoLS0jeyRwcmVmaXh9Ym9yZGVyLXJhZGl1cykgIWRlZmF1bHQ7XFxuJHRvb2x0aXAtb3BhY2l0eTogICAgICAgICAgICAgICAgICAgLjkgIWRlZmF1bHQ7XFxuJHRvb2x0aXAtcGFkZGluZy15OiAgICAgICAgICAgICAgICAgJHNwYWNlciAqIC4yNSAhZGVmYXVsdDtcXG4kdG9vbHRpcC1wYWRkaW5nLXg6ICAgICAgICAgICAgICAgICAkc3BhY2VyICogLjUgIWRlZmF1bHQ7XFxuJHRvb2x0aXAtbWFyZ2luOiAgICAgICAgICAgICAgICAgICAgbnVsbCAhZGVmYXVsdDsgLy8gVE9ETzogcmVtb3ZlIHRoaXMgaW4gdjZcXG5cXG4kdG9vbHRpcC1hcnJvdy13aWR0aDogICAgICAgICAgICAgICAuOHJlbSAhZGVmYXVsdDtcXG4kdG9vbHRpcC1hcnJvdy1oZWlnaHQ6ICAgICAgICAgICAgICAuNHJlbSAhZGVmYXVsdDtcXG4vLyBmdXN2LWRpc2FibGVcXG4kdG9vbHRpcC1hcnJvdy1jb2xvcjogICAgICAgICAgICAgICBudWxsICFkZWZhdWx0OyAvLyBEZXByZWNhdGVkIGluIEJvb3RzdHJhcCA1LjIuMCBmb3IgQ1NTIHZhcmlhYmxlc1xcbi8vIGZ1c3YtZW5hYmxlXFxuLy8gc2Nzcy1kb2NzLWVuZCB0b29sdGlwLXZhcmlhYmxlc1xcblxcbi8vIEZvcm0gdG9vbHRpcHMgbXVzdCBjb21lIGFmdGVyIHJlZ3VsYXIgdG9vbHRpcHNcXG4vLyBzY3NzLWRvY3Mtc3RhcnQgdG9vbHRpcC1mZWVkYmFjay12YXJpYWJsZXNcXG4kZm9ybS1mZWVkYmFjay10b29sdGlwLXBhZGRpbmcteTogICAgICR0b29sdGlwLXBhZGRpbmcteSAhZGVmYXVsdDtcXG4kZm9ybS1mZWVkYmFjay10b29sdGlwLXBhZGRpbmcteDogICAgICR0b29sdGlwLXBhZGRpbmcteCAhZGVmYXVsdDtcXG4kZm9ybS1mZWVkYmFjay10b29sdGlwLWZvbnQtc2l6ZTogICAgICR0b29sdGlwLWZvbnQtc2l6ZSAhZGVmYXVsdDtcXG4kZm9ybS1mZWVkYmFjay10b29sdGlwLWxpbmUtaGVpZ2h0OiAgIG51bGwgIWRlZmF1bHQ7XFxuJGZvcm0tZmVlZGJhY2stdG9vbHRpcC1vcGFjaXR5OiAgICAgICAkdG9vbHRpcC1vcGFjaXR5ICFkZWZhdWx0O1xcbiRmb3JtLWZlZWRiYWNrLXRvb2x0aXAtYm9yZGVyLXJhZGl1czogJHRvb2x0aXAtYm9yZGVyLXJhZGl1cyAhZGVmYXVsdDtcXG4vLyBzY3NzLWRvY3MtZW5kIHRvb2x0aXAtZmVlZGJhY2stdmFyaWFibGVzXFxuXFxuXFxuLy8gUG9wb3ZlcnNcXG5cXG4vLyBzY3NzLWRvY3Mtc3RhcnQgcG9wb3Zlci12YXJpYWJsZXNcXG4kcG9wb3Zlci1mb250LXNpemU6ICAgICAgICAgICAgICAgICAkZm9udC1zaXplLXNtICFkZWZhdWx0O1xcbiRwb3BvdmVyLWJnOiAgICAgICAgICAgICAgICAgICAgICAgIHZhcigtLSN7JHByZWZpeH1ib2R5LWJnKSAhZGVmYXVsdDtcXG4kcG9wb3Zlci1tYXgtd2lkdGg6ICAgICAgICAgICAgICAgICAyNzZweCAhZGVmYXVsdDtcXG4kcG9wb3Zlci1ib3JkZXItd2lkdGg6ICAgICAgICAgICAgICB2YXIoLS0jeyRwcmVmaXh9Ym9yZGVyLXdpZHRoKSAhZGVmYXVsdDtcXG4kcG9wb3Zlci1ib3JkZXItY29sb3I6ICAgICAgICAgICAgICB2YXIoLS0jeyRwcmVmaXh9Ym9yZGVyLWNvbG9yLXRyYW5zbHVjZW50KSAhZGVmYXVsdDtcXG4kcG9wb3Zlci1ib3JkZXItcmFkaXVzOiAgICAgICAgICAgICB2YXIoLS0jeyRwcmVmaXh9Ym9yZGVyLXJhZGl1cy1sZykgIWRlZmF1bHQ7XFxuJHBvcG92ZXItaW5uZXItYm9yZGVyLXJhZGl1czogICAgICAgY2FsYygjeyRwb3BvdmVyLWJvcmRlci1yYWRpdXN9IC0gI3skcG9wb3Zlci1ib3JkZXItd2lkdGh9KSAhZGVmYXVsdDsgLy8gc3R5bGVsaW50LWRpc2FibGUtbGluZSBmdW5jdGlvbi1kaXNhbGxvd2VkLWxpc3RcXG4kcG9wb3Zlci1ib3gtc2hhZG93OiAgICAgICAgICAgICAgICB2YXIoLS0jeyRwcmVmaXh9Ym94LXNoYWRvdykgIWRlZmF1bHQ7XFxuXFxuJHBvcG92ZXItaGVhZGVyLWZvbnQtc2l6ZTogICAgICAgICAgJGZvbnQtc2l6ZS1iYXNlICFkZWZhdWx0O1xcbiRwb3BvdmVyLWhlYWRlci1iZzogICAgICAgICAgICAgICAgIHZhcigtLSN7JHByZWZpeH1zZWNvbmRhcnktYmcpICFkZWZhdWx0O1xcbiRwb3BvdmVyLWhlYWRlci1jb2xvcjogICAgICAgICAgICAgICRoZWFkaW5ncy1jb2xvciAhZGVmYXVsdDtcXG4kcG9wb3Zlci1oZWFkZXItcGFkZGluZy15OiAgICAgICAgICAuNXJlbSAhZGVmYXVsdDtcXG4kcG9wb3Zlci1oZWFkZXItcGFkZGluZy14OiAgICAgICAgICAkc3BhY2VyICFkZWZhdWx0O1xcblxcbiRwb3BvdmVyLWJvZHktY29sb3I6ICAgICAgICAgICAgICAgIHZhcigtLSN7JHByZWZpeH1ib2R5LWNvbG9yKSAhZGVmYXVsdDtcXG4kcG9wb3Zlci1ib2R5LXBhZGRpbmcteTogICAgICAgICAgICAkc3BhY2VyICFkZWZhdWx0O1xcbiRwb3BvdmVyLWJvZHktcGFkZGluZy14OiAgICAgICAgICAgICRzcGFjZXIgIWRlZmF1bHQ7XFxuXFxuJHBvcG92ZXItYXJyb3ctd2lkdGg6ICAgICAgICAgICAgICAgMXJlbSAhZGVmYXVsdDtcXG4kcG9wb3Zlci1hcnJvdy1oZWlnaHQ6ICAgICAgICAgICAgICAuNXJlbSAhZGVmYXVsdDtcXG4vLyBzY3NzLWRvY3MtZW5kIHBvcG92ZXItdmFyaWFibGVzXFxuXFxuLy8gZnVzdi1kaXNhYmxlXFxuLy8gRGVwcmVjYXRlZCBpbiBCb290c3RyYXAgNS4yLjAgZm9yIENTUyB2YXJpYWJsZXNcXG4kcG9wb3Zlci1hcnJvdy1jb2xvcjogICAgICAgICAgICAgICAkcG9wb3Zlci1iZyAhZGVmYXVsdDtcXG4kcG9wb3Zlci1hcnJvdy1vdXRlci1jb2xvcjogICAgICAgICB2YXIoLS0jeyRwcmVmaXh9Ym9yZGVyLWNvbG9yLXRyYW5zbHVjZW50KSAhZGVmYXVsdDtcXG4vLyBmdXN2LWVuYWJsZVxcblxcblxcbi8vIFRvYXN0c1xcblxcbi8vIHNjc3MtZG9jcy1zdGFydCB0b2FzdC12YXJpYWJsZXNcXG4kdG9hc3QtbWF4LXdpZHRoOiAgICAgICAgICAgICAgICAgICAzNTBweCAhZGVmYXVsdDtcXG4kdG9hc3QtcGFkZGluZy14OiAgICAgICAgICAgICAgICAgICAuNzVyZW0gIWRlZmF1bHQ7XFxuJHRvYXN0LXBhZGRpbmcteTogICAgICAgICAgICAgICAgICAgLjVyZW0gIWRlZmF1bHQ7XFxuJHRvYXN0LWZvbnQtc2l6ZTogICAgICAgICAgICAgICAgICAgLjg3NXJlbSAhZGVmYXVsdDtcXG4kdG9hc3QtY29sb3I6ICAgICAgICAgICAgICAgICAgICAgICBudWxsICFkZWZhdWx0O1xcbiR0b2FzdC1iYWNrZ3JvdW5kLWNvbG9yOiAgICAgICAgICAgIHJnYmEodmFyKC0tI3skcHJlZml4fWJvZHktYmctcmdiKSwgLjg1KSAhZGVmYXVsdDtcXG4kdG9hc3QtYm9yZGVyLXdpZHRoOiAgICAgICAgICAgICAgICB2YXIoLS0jeyRwcmVmaXh9Ym9yZGVyLXdpZHRoKSAhZGVmYXVsdDtcXG4kdG9hc3QtYm9yZGVyLWNvbG9yOiAgICAgICAgICAgICAgICB2YXIoLS0jeyRwcmVmaXh9Ym9yZGVyLWNvbG9yLXRyYW5zbHVjZW50KSAhZGVmYXVsdDtcXG4kdG9hc3QtYm9yZGVyLXJhZGl1czogICAgICAgICAgICAgICB2YXIoLS0jeyRwcmVmaXh9Ym9yZGVyLXJhZGl1cykgIWRlZmF1bHQ7XFxuJHRvYXN0LWJveC1zaGFkb3c6ICAgICAgICAgICAgICAgICAgdmFyKC0tI3skcHJlZml4fWJveC1zaGFkb3cpICFkZWZhdWx0O1xcbiR0b2FzdC1zcGFjaW5nOiAgICAgICAgICAgICAgICAgICAgICRjb250YWluZXItcGFkZGluZy14ICFkZWZhdWx0O1xcblxcbiR0b2FzdC1oZWFkZXItY29sb3I6ICAgICAgICAgICAgICAgIHZhcigtLSN7JHByZWZpeH1zZWNvbmRhcnktY29sb3IpICFkZWZhdWx0O1xcbiR0b2FzdC1oZWFkZXItYmFja2dyb3VuZC1jb2xvcjogICAgIHJnYmEodmFyKC0tI3skcHJlZml4fWJvZHktYmctcmdiKSwgLjg1KSAhZGVmYXVsdDtcXG4kdG9hc3QtaGVhZGVyLWJvcmRlci1jb2xvcjogICAgICAgICAkdG9hc3QtYm9yZGVyLWNvbG9yICFkZWZhdWx0O1xcbi8vIHNjc3MtZG9jcy1lbmQgdG9hc3QtdmFyaWFibGVzXFxuXFxuXFxuLy8gQmFkZ2VzXFxuXFxuLy8gc2Nzcy1kb2NzLXN0YXJ0IGJhZGdlLXZhcmlhYmxlc1xcbiRiYWRnZS1mb250LXNpemU6ICAgICAgICAgICAgICAgICAgIC43NWVtICFkZWZhdWx0O1xcbiRiYWRnZS1mb250LXdlaWdodDogICAgICAgICAgICAgICAgICRmb250LXdlaWdodC1ib2xkICFkZWZhdWx0O1xcbiRiYWRnZS1jb2xvcjogICAgICAgICAgICAgICAgICAgICAgICR3aGl0ZSAhZGVmYXVsdDtcXG4kYmFkZ2UtcGFkZGluZy15OiAgICAgICAgICAgICAgICAgICAuMzVlbSAhZGVmYXVsdDtcXG4kYmFkZ2UtcGFkZGluZy14OiAgICAgICAgICAgICAgICAgICAuNjVlbSAhZGVmYXVsdDtcXG4kYmFkZ2UtYm9yZGVyLXJhZGl1czogICAgICAgICAgICAgICB2YXIoLS0jeyRwcmVmaXh9Ym9yZGVyLXJhZGl1cykgIWRlZmF1bHQ7XFxuLy8gc2Nzcy1kb2NzLWVuZCBiYWRnZS12YXJpYWJsZXNcXG5cXG5cXG4vLyBNb2RhbHNcXG5cXG4vLyBzY3NzLWRvY3Mtc3RhcnQgbW9kYWwtdmFyaWFibGVzXFxuJG1vZGFsLWlubmVyLXBhZGRpbmc6ICAgICAgICAgICAgICAgJHNwYWNlciAhZGVmYXVsdDtcXG5cXG4kbW9kYWwtZm9vdGVyLW1hcmdpbi1iZXR3ZWVuOiAgICAgICAuNXJlbSAhZGVmYXVsdDtcXG5cXG4kbW9kYWwtZGlhbG9nLW1hcmdpbjogICAgICAgICAgICAgICAuNXJlbSAhZGVmYXVsdDtcXG4kbW9kYWwtZGlhbG9nLW1hcmdpbi15LXNtLXVwOiAgICAgICAxLjc1cmVtICFkZWZhdWx0O1xcblxcbiRtb2RhbC10aXRsZS1saW5lLWhlaWdodDogICAgICAgICAgICRsaW5lLWhlaWdodC1iYXNlICFkZWZhdWx0O1xcblxcbiRtb2RhbC1jb250ZW50LWNvbG9yOiAgICAgICAgICAgICAgIG51bGwgIWRlZmF1bHQ7XFxuJG1vZGFsLWNvbnRlbnQtYmc6ICAgICAgICAgICAgICAgICAgdmFyKC0tI3skcHJlZml4fWJvZHktYmcpICFkZWZhdWx0O1xcbiRtb2RhbC1jb250ZW50LWJvcmRlci1jb2xvcjogICAgICAgIHZhcigtLSN7JHByZWZpeH1ib3JkZXItY29sb3ItdHJhbnNsdWNlbnQpICFkZWZhdWx0O1xcbiRtb2RhbC1jb250ZW50LWJvcmRlci13aWR0aDogICAgICAgIHZhcigtLSN7JHByZWZpeH1ib3JkZXItd2lkdGgpICFkZWZhdWx0O1xcbiRtb2RhbC1jb250ZW50LWJvcmRlci1yYWRpdXM6ICAgICAgIHZhcigtLSN7JHByZWZpeH1ib3JkZXItcmFkaXVzLWxnKSAhZGVmYXVsdDtcXG4kbW9kYWwtY29udGVudC1pbm5lci1ib3JkZXItcmFkaXVzOiBzdWJ0cmFjdCgkbW9kYWwtY29udGVudC1ib3JkZXItcmFkaXVzLCAkbW9kYWwtY29udGVudC1ib3JkZXItd2lkdGgpICFkZWZhdWx0O1xcbiRtb2RhbC1jb250ZW50LWJveC1zaGFkb3cteHM6ICAgICAgIHZhcigtLSN7JHByZWZpeH1ib3gtc2hhZG93LXNtKSAhZGVmYXVsdDtcXG4kbW9kYWwtY29udGVudC1ib3gtc2hhZG93LXNtLXVwOiAgICB2YXIoLS0jeyRwcmVmaXh9Ym94LXNoYWRvdykgIWRlZmF1bHQ7XFxuXFxuJG1vZGFsLWJhY2tkcm9wLWJnOiAgICAgICAgICAgICAgICAgJGJsYWNrICFkZWZhdWx0O1xcbiRtb2RhbC1iYWNrZHJvcC1vcGFjaXR5OiAgICAgICAgICAgIC41ICFkZWZhdWx0O1xcblxcbiRtb2RhbC1oZWFkZXItYm9yZGVyLWNvbG9yOiAgICAgICAgIHZhcigtLSN7JHByZWZpeH1ib3JkZXItY29sb3IpICFkZWZhdWx0O1xcbiRtb2RhbC1oZWFkZXItYm9yZGVyLXdpZHRoOiAgICAgICAgICRtb2RhbC1jb250ZW50LWJvcmRlci13aWR0aCAhZGVmYXVsdDtcXG4kbW9kYWwtaGVhZGVyLXBhZGRpbmcteTogICAgICAgICAgICAkbW9kYWwtaW5uZXItcGFkZGluZyAhZGVmYXVsdDtcXG4kbW9kYWwtaGVhZGVyLXBhZGRpbmcteDogICAgICAgICAgICAkbW9kYWwtaW5uZXItcGFkZGluZyAhZGVmYXVsdDtcXG4kbW9kYWwtaGVhZGVyLXBhZGRpbmc6ICAgICAgICAgICAgICAkbW9kYWwtaGVhZGVyLXBhZGRpbmcteSAkbW9kYWwtaGVhZGVyLXBhZGRpbmcteCAhZGVmYXVsdDsgLy8gS2VlcCB0aGlzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxcblxcbiRtb2RhbC1mb290ZXItYmc6ICAgICAgICAgICAgICAgICAgIG51bGwgIWRlZmF1bHQ7XFxuJG1vZGFsLWZvb3Rlci1ib3JkZXItY29sb3I6ICAgICAgICAgJG1vZGFsLWhlYWRlci1ib3JkZXItY29sb3IgIWRlZmF1bHQ7XFxuJG1vZGFsLWZvb3Rlci1ib3JkZXItd2lkdGg6ICAgICAgICAgJG1vZGFsLWhlYWRlci1ib3JkZXItd2lkdGggIWRlZmF1bHQ7XFxuXFxuJG1vZGFsLXNtOiAgICAgICAgICAgICAgICAgICAgICAgICAgMzAwcHggIWRlZmF1bHQ7XFxuJG1vZGFsLW1kOiAgICAgICAgICAgICAgICAgICAgICAgICAgNTAwcHggIWRlZmF1bHQ7XFxuJG1vZGFsLWxnOiAgICAgICAgICAgICAgICAgICAgICAgICAgODAwcHggIWRlZmF1bHQ7XFxuJG1vZGFsLXhsOiAgICAgICAgICAgICAgICAgICAgICAgICAgMTE0MHB4ICFkZWZhdWx0O1xcblxcbiRtb2RhbC1mYWRlLXRyYW5zZm9ybTogICAgICAgICAgICAgIHRyYW5zbGF0ZSgwLCAtNTBweCkgIWRlZmF1bHQ7XFxuJG1vZGFsLXNob3ctdHJhbnNmb3JtOiAgICAgICAgICAgICAgbm9uZSAhZGVmYXVsdDtcXG4kbW9kYWwtdHJhbnNpdGlvbjogICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0gLjNzIGVhc2Utb3V0ICFkZWZhdWx0O1xcbiRtb2RhbC1zY2FsZS10cmFuc2Zvcm06ICAgICAgICAgICAgIHNjYWxlKDEuMDIpICFkZWZhdWx0O1xcbi8vIHNjc3MtZG9jcy1lbmQgbW9kYWwtdmFyaWFibGVzXFxuXFxuXFxuLy8gQWxlcnRzXFxuLy9cXG4vLyBEZWZpbmUgYWxlcnQgY29sb3JzLCBib3JkZXIgcmFkaXVzLCBhbmQgcGFkZGluZy5cXG5cXG4vLyBzY3NzLWRvY3Mtc3RhcnQgYWxlcnQtdmFyaWFibGVzXFxuJGFsZXJ0LXBhZGRpbmcteTogICAgICAgICAgICAgICAkc3BhY2VyICFkZWZhdWx0O1xcbiRhbGVydC1wYWRkaW5nLXg6ICAgICAgICAgICAgICAgJHNwYWNlciAhZGVmYXVsdDtcXG4kYWxlcnQtbWFyZ2luLWJvdHRvbTogICAgICAgICAgIDFyZW0gIWRlZmF1bHQ7XFxuJGFsZXJ0LWJvcmRlci1yYWRpdXM6ICAgICAgICAgICB2YXIoLS0jeyRwcmVmaXh9Ym9yZGVyLXJhZGl1cykgIWRlZmF1bHQ7XFxuJGFsZXJ0LWxpbmstZm9udC13ZWlnaHQ6ICAgICAgICAkZm9udC13ZWlnaHQtYm9sZCAhZGVmYXVsdDtcXG4kYWxlcnQtYm9yZGVyLXdpZHRoOiAgICAgICAgICAgIHZhcigtLSN7JHByZWZpeH1ib3JkZXItd2lkdGgpICFkZWZhdWx0O1xcbiRhbGVydC1kaXNtaXNzaWJsZS1wYWRkaW5nLXI6ICAgJGFsZXJ0LXBhZGRpbmcteCAqIDMgIWRlZmF1bHQ7IC8vIDN4IGNvdmVycyB3aWR0aCBvZiB4IHBsdXMgZGVmYXVsdCBwYWRkaW5nIG9uIGVpdGhlciBzaWRlXFxuLy8gc2Nzcy1kb2NzLWVuZCBhbGVydC12YXJpYWJsZXNcXG5cXG4vLyBmdXN2LWRpc2FibGVcXG4kYWxlcnQtYmctc2NhbGU6ICAgICAgICAgICAgICAgIC04MCUgIWRlZmF1bHQ7IC8vIERlcHJlY2F0ZWQgaW4gdjUuMi4wLCB0byBiZSByZW1vdmVkIGluIHY2XFxuJGFsZXJ0LWJvcmRlci1zY2FsZTogICAgICAgICAgICAtNzAlICFkZWZhdWx0OyAvLyBEZXByZWNhdGVkIGluIHY1LjIuMCwgdG8gYmUgcmVtb3ZlZCBpbiB2NlxcbiRhbGVydC1jb2xvci1zY2FsZTogICAgICAgICAgICAgNDAlICFkZWZhdWx0OyAvLyBEZXByZWNhdGVkIGluIHY1LjIuMCwgdG8gYmUgcmVtb3ZlZCBpbiB2Nlxcbi8vIGZ1c3YtZW5hYmxlXFxuXFxuLy8gUHJvZ3Jlc3MgYmFyc1xcblxcbi8vIHNjc3MtZG9jcy1zdGFydCBwcm9ncmVzcy12YXJpYWJsZXNcXG4kcHJvZ3Jlc3MtaGVpZ2h0OiAgICAgICAgICAgICAgICAgICAxcmVtICFkZWZhdWx0O1xcbiRwcm9ncmVzcy1mb250LXNpemU6ICAgICAgICAgICAgICAgICRmb250LXNpemUtYmFzZSAqIC43NSAhZGVmYXVsdDtcXG4kcHJvZ3Jlc3MtYmc6ICAgICAgICAgICAgICAgICAgICAgICB2YXIoLS0jeyRwcmVmaXh9c2Vjb25kYXJ5LWJnKSAhZGVmYXVsdDtcXG4kcHJvZ3Jlc3MtYm9yZGVyLXJhZGl1czogICAgICAgICAgICB2YXIoLS0jeyRwcmVmaXh9Ym9yZGVyLXJhZGl1cykgIWRlZmF1bHQ7XFxuJHByb2dyZXNzLWJveC1zaGFkb3c6ICAgICAgICAgICAgICAgdmFyKC0tI3skcHJlZml4fWJveC1zaGFkb3ctaW5zZXQpICFkZWZhdWx0O1xcbiRwcm9ncmVzcy1iYXItY29sb3I6ICAgICAgICAgICAgICAgICR3aGl0ZSAhZGVmYXVsdDtcXG4kcHJvZ3Jlc3MtYmFyLWJnOiAgICAgICAgICAgICAgICAgICAkcHJpbWFyeSAhZGVmYXVsdDtcXG4kcHJvZ3Jlc3MtYmFyLWFuaW1hdGlvbi10aW1pbmc6ICAgICAxcyBsaW5lYXIgaW5maW5pdGUgIWRlZmF1bHQ7XFxuJHByb2dyZXNzLWJhci10cmFuc2l0aW9uOiAgICAgICAgICAgd2lkdGggLjZzIGVhc2UgIWRlZmF1bHQ7XFxuLy8gc2Nzcy1kb2NzLWVuZCBwcm9ncmVzcy12YXJpYWJsZXNcXG5cXG5cXG4vLyBMaXN0IGdyb3VwXFxuXFxuLy8gc2Nzcy1kb2NzLXN0YXJ0IGxpc3QtZ3JvdXAtdmFyaWFibGVzXFxuJGxpc3QtZ3JvdXAtY29sb3I6ICAgICAgICAgICAgICAgICAgdmFyKC0tI3skcHJlZml4fWJvZHktY29sb3IpICFkZWZhdWx0O1xcbiRsaXN0LWdyb3VwLWJnOiAgICAgICAgICAgICAgICAgICAgIHZhcigtLSN7JHByZWZpeH1ib2R5LWJnKSAhZGVmYXVsdDtcXG4kbGlzdC1ncm91cC1ib3JkZXItY29sb3I6ICAgICAgICAgICB2YXIoLS0jeyRwcmVmaXh9Ym9yZGVyLWNvbG9yKSAhZGVmYXVsdDtcXG4kbGlzdC1ncm91cC1ib3JkZXItd2lkdGg6ICAgICAgICAgICB2YXIoLS0jeyRwcmVmaXh9Ym9yZGVyLXdpZHRoKSAhZGVmYXVsdDtcXG4kbGlzdC1ncm91cC1ib3JkZXItcmFkaXVzOiAgICAgICAgICB2YXIoLS0jeyRwcmVmaXh9Ym9yZGVyLXJhZGl1cykgIWRlZmF1bHQ7XFxuXFxuJGxpc3QtZ3JvdXAtaXRlbS1wYWRkaW5nLXk6ICAgICAgICAgJHNwYWNlciAqIC41ICFkZWZhdWx0O1xcbiRsaXN0LWdyb3VwLWl0ZW0tcGFkZGluZy14OiAgICAgICAgICRzcGFjZXIgIWRlZmF1bHQ7XFxuLy8gZnVzdi1kaXNhYmxlXFxuJGxpc3QtZ3JvdXAtaXRlbS1iZy1zY2FsZTogICAgICAgICAgLTgwJSAhZGVmYXVsdDsgLy8gRGVwcmVjYXRlZCBpbiB2NS4zLjBcXG4kbGlzdC1ncm91cC1pdGVtLWNvbG9yLXNjYWxlOiAgICAgICA0MCUgIWRlZmF1bHQ7IC8vIERlcHJlY2F0ZWQgaW4gdjUuMy4wXFxuLy8gZnVzdi1lbmFibGVcXG5cXG4kbGlzdC1ncm91cC1ob3Zlci1iZzogICAgICAgICAgICAgICB2YXIoLS0jeyRwcmVmaXh9dGVydGlhcnktYmcpICFkZWZhdWx0O1xcbiRsaXN0LWdyb3VwLWFjdGl2ZS1jb2xvcjogICAgICAgICAgICRjb21wb25lbnQtYWN0aXZlLWNvbG9yICFkZWZhdWx0O1xcbiRsaXN0LWdyb3VwLWFjdGl2ZS1iZzogICAgICAgICAgICAgICRjb21wb25lbnQtYWN0aXZlLWJnICFkZWZhdWx0O1xcbiRsaXN0LWdyb3VwLWFjdGl2ZS1ib3JkZXItY29sb3I6ICAgICRsaXN0LWdyb3VwLWFjdGl2ZS1iZyAhZGVmYXVsdDtcXG5cXG4kbGlzdC1ncm91cC1kaXNhYmxlZC1jb2xvcjogICAgICAgICB2YXIoLS0jeyRwcmVmaXh9c2Vjb25kYXJ5LWNvbG9yKSAhZGVmYXVsdDtcXG4kbGlzdC1ncm91cC1kaXNhYmxlZC1iZzogICAgICAgICAgICAkbGlzdC1ncm91cC1iZyAhZGVmYXVsdDtcXG5cXG4kbGlzdC1ncm91cC1hY3Rpb24tY29sb3I6ICAgICAgICAgICB2YXIoLS0jeyRwcmVmaXh9c2Vjb25kYXJ5LWNvbG9yKSAhZGVmYXVsdDtcXG4kbGlzdC1ncm91cC1hY3Rpb24taG92ZXItY29sb3I6ICAgICB2YXIoLS0jeyRwcmVmaXh9ZW1waGFzaXMtY29sb3IpICFkZWZhdWx0O1xcblxcbiRsaXN0LWdyb3VwLWFjdGlvbi1hY3RpdmUtY29sb3I6ICAgIHZhcigtLSN7JHByZWZpeH1ib2R5LWNvbG9yKSAhZGVmYXVsdDtcXG4kbGlzdC1ncm91cC1hY3Rpb24tYWN0aXZlLWJnOiAgICAgICB2YXIoLS0jeyRwcmVmaXh9c2Vjb25kYXJ5LWJnKSAhZGVmYXVsdDtcXG4vLyBzY3NzLWRvY3MtZW5kIGxpc3QtZ3JvdXAtdmFyaWFibGVzXFxuXFxuXFxuLy8gSW1hZ2UgdGh1bWJuYWlsc1xcblxcbi8vIHNjc3MtZG9jcy1zdGFydCB0aHVtYm5haWwtdmFyaWFibGVzXFxuJHRodW1ibmFpbC1wYWRkaW5nOiAgICAgICAgICAgICAgICAgLjI1cmVtICFkZWZhdWx0O1xcbiR0aHVtYm5haWwtYmc6ICAgICAgICAgICAgICAgICAgICAgIHZhcigtLSN7JHByZWZpeH1ib2R5LWJnKSAhZGVmYXVsdDtcXG4kdGh1bWJuYWlsLWJvcmRlci13aWR0aDogICAgICAgICAgICB2YXIoLS0jeyRwcmVmaXh9Ym9yZGVyLXdpZHRoKSAhZGVmYXVsdDtcXG4kdGh1bWJuYWlsLWJvcmRlci1jb2xvcjogICAgICAgICAgICB2YXIoLS0jeyRwcmVmaXh9Ym9yZGVyLWNvbG9yKSAhZGVmYXVsdDtcXG4kdGh1bWJuYWlsLWJvcmRlci1yYWRpdXM6ICAgICAgICAgICB2YXIoLS0jeyRwcmVmaXh9Ym9yZGVyLXJhZGl1cykgIWRlZmF1bHQ7XFxuJHRodW1ibmFpbC1ib3gtc2hhZG93OiAgICAgICAgICAgICAgdmFyKC0tI3skcHJlZml4fWJveC1zaGFkb3ctc20pICFkZWZhdWx0O1xcbi8vIHNjc3MtZG9jcy1lbmQgdGh1bWJuYWlsLXZhcmlhYmxlc1xcblxcblxcbi8vIEZpZ3VyZXNcXG5cXG4vLyBzY3NzLWRvY3Mtc3RhcnQgZmlndXJlLXZhcmlhYmxlc1xcbiRmaWd1cmUtY2FwdGlvbi1mb250LXNpemU6ICAgICAgICAgICRzbWFsbC1mb250LXNpemUgIWRlZmF1bHQ7XFxuJGZpZ3VyZS1jYXB0aW9uLWNvbG9yOiAgICAgICAgICAgICAgdmFyKC0tI3skcHJlZml4fXNlY29uZGFyeS1jb2xvcikgIWRlZmF1bHQ7XFxuLy8gc2Nzcy1kb2NzLWVuZCBmaWd1cmUtdmFyaWFibGVzXFxuXFxuXFxuLy8gQnJlYWRjcnVtYnNcXG5cXG4vLyBzY3NzLWRvY3Mtc3RhcnQgYnJlYWRjcnVtYi12YXJpYWJsZXNcXG4kYnJlYWRjcnVtYi1mb250LXNpemU6ICAgICAgICAgICAgICBudWxsICFkZWZhdWx0O1xcbiRicmVhZGNydW1iLXBhZGRpbmcteTogICAgICAgICAgICAgIDAgIWRlZmF1bHQ7XFxuJGJyZWFkY3J1bWItcGFkZGluZy14OiAgICAgICAgICAgICAgMCAhZGVmYXVsdDtcXG4kYnJlYWRjcnVtYi1pdGVtLXBhZGRpbmcteDogICAgICAgICAuNXJlbSAhZGVmYXVsdDtcXG4kYnJlYWRjcnVtYi1tYXJnaW4tYm90dG9tOiAgICAgICAgICAxcmVtICFkZWZhdWx0O1xcbiRicmVhZGNydW1iLWJnOiAgICAgICAgICAgICAgICAgICAgIG51bGwgIWRlZmF1bHQ7XFxuJGJyZWFkY3J1bWItZGl2aWRlci1jb2xvcjogICAgICAgICAgdmFyKC0tI3skcHJlZml4fXNlY29uZGFyeS1jb2xvcikgIWRlZmF1bHQ7XFxuJGJyZWFkY3J1bWItYWN0aXZlLWNvbG9yOiAgICAgICAgICAgdmFyKC0tI3skcHJlZml4fXNlY29uZGFyeS1jb2xvcikgIWRlZmF1bHQ7XFxuJGJyZWFkY3J1bWItZGl2aWRlcjogICAgICAgICAgICAgICAgcXVvdGUoXFxcIi9cXFwiKSAhZGVmYXVsdDtcXG4kYnJlYWRjcnVtYi1kaXZpZGVyLWZsaXBwZWQ6ICAgICAgICAkYnJlYWRjcnVtYi1kaXZpZGVyICFkZWZhdWx0O1xcbiRicmVhZGNydW1iLWJvcmRlci1yYWRpdXM6ICAgICAgICAgIG51bGwgIWRlZmF1bHQ7XFxuLy8gc2Nzcy1kb2NzLWVuZCBicmVhZGNydW1iLXZhcmlhYmxlc1xcblxcbi8vIENhcm91c2VsXFxuXFxuLy8gc2Nzcy1kb2NzLXN0YXJ0IGNhcm91c2VsLXZhcmlhYmxlc1xcbiRjYXJvdXNlbC1jb250cm9sLWNvbG9yOiAgICAgICAgICAgICAkd2hpdGUgIWRlZmF1bHQ7XFxuJGNhcm91c2VsLWNvbnRyb2wtd2lkdGg6ICAgICAgICAgICAgIDE1JSAhZGVmYXVsdDtcXG4kY2Fyb3VzZWwtY29udHJvbC1vcGFjaXR5OiAgICAgICAgICAgLjUgIWRlZmF1bHQ7XFxuJGNhcm91c2VsLWNvbnRyb2wtaG92ZXItb3BhY2l0eTogICAgIC45ICFkZWZhdWx0O1xcbiRjYXJvdXNlbC1jb250cm9sLXRyYW5zaXRpb246ICAgICAgICBvcGFjaXR5IC4xNXMgZWFzZSAhZGVmYXVsdDtcXG5cXG4kY2Fyb3VzZWwtaW5kaWNhdG9yLXdpZHRoOiAgICAgICAgICAgMzBweCAhZGVmYXVsdDtcXG4kY2Fyb3VzZWwtaW5kaWNhdG9yLWhlaWdodDogICAgICAgICAgM3B4ICFkZWZhdWx0O1xcbiRjYXJvdXNlbC1pbmRpY2F0b3ItaGl0LWFyZWEtaGVpZ2h0OiAxMHB4ICFkZWZhdWx0O1xcbiRjYXJvdXNlbC1pbmRpY2F0b3Itc3BhY2VyOiAgICAgICAgICAzcHggIWRlZmF1bHQ7XFxuJGNhcm91c2VsLWluZGljYXRvci1vcGFjaXR5OiAgICAgICAgIC41ICFkZWZhdWx0O1xcbiRjYXJvdXNlbC1pbmRpY2F0b3ItYWN0aXZlLWJnOiAgICAgICAkd2hpdGUgIWRlZmF1bHQ7XFxuJGNhcm91c2VsLWluZGljYXRvci1hY3RpdmUtb3BhY2l0eTogIDEgIWRlZmF1bHQ7XFxuJGNhcm91c2VsLWluZGljYXRvci10cmFuc2l0aW9uOiAgICAgIG9wYWNpdHkgLjZzIGVhc2UgIWRlZmF1bHQ7XFxuXFxuJGNhcm91c2VsLWNhcHRpb24td2lkdGg6ICAgICAgICAgICAgIDcwJSAhZGVmYXVsdDtcXG4kY2Fyb3VzZWwtY2FwdGlvbi1jb2xvcjogICAgICAgICAgICAgJHdoaXRlICFkZWZhdWx0O1xcbiRjYXJvdXNlbC1jYXB0aW9uLXBhZGRpbmcteTogICAgICAgICAxLjI1cmVtICFkZWZhdWx0O1xcbiRjYXJvdXNlbC1jYXB0aW9uLXNwYWNlcjogICAgICAgICAgICAxLjI1cmVtICFkZWZhdWx0O1xcblxcbiRjYXJvdXNlbC1jb250cm9sLWljb24td2lkdGg6ICAgICAgICAycmVtICFkZWZhdWx0O1xcblxcbiRjYXJvdXNlbC1jb250cm9sLXByZXYtaWNvbi1iZzogICAgICB1cmwoXFxcImRhdGE6aW1hZ2Uvc3ZnK3htbCw8c3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgdmlld0JveD0nMCAwIDE2IDE2JyBmaWxsPScjeyRjYXJvdXNlbC1jb250cm9sLWNvbG9yfSc+PHBhdGggZD0nTTExLjM1NCAxLjY0NmEuNS41IDAgMCAxIDAgLjcwOEw1LjcwNyA4bDUuNjQ3IDUuNjQ2YS41LjUgMCAwIDEtLjcwOC43MDhsLTYtNmEuNS41IDAgMCAxIDAtLjcwOGw2LTZhLjUuNSAwIDAgMSAuNzA4IDB6Jy8+PC9zdmc+XFxcIikgIWRlZmF1bHQ7XFxuJGNhcm91c2VsLWNvbnRyb2wtbmV4dC1pY29uLWJnOiAgICAgIHVybChcXFwiZGF0YTppbWFnZS9zdmcreG1sLDxzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB2aWV3Qm94PScwIDAgMTYgMTYnIGZpbGw9JyN7JGNhcm91c2VsLWNvbnRyb2wtY29sb3J9Jz48cGF0aCBkPSdNNC42NDYgMS42NDZhLjUuNSAwIDAgMSAuNzA4IDBsNiA2YS41LjUgMCAwIDEgMCAuNzA4bC02IDZhLjUuNSAwIDAgMS0uNzA4LS43MDhMMTAuMjkzIDggNC42NDYgMi4zNTRhLjUuNSAwIDAgMSAwLS43MDh6Jy8+PC9zdmc+XFxcIikgIWRlZmF1bHQ7XFxuXFxuJGNhcm91c2VsLXRyYW5zaXRpb24tZHVyYXRpb246ICAgICAgIC42cyAhZGVmYXVsdDtcXG4kY2Fyb3VzZWwtdHJhbnNpdGlvbjogICAgICAgICAgICAgICAgdHJhbnNmb3JtICRjYXJvdXNlbC10cmFuc2l0aW9uLWR1cmF0aW9uIGVhc2UtaW4tb3V0ICFkZWZhdWx0OyAvLyBEZWZpbmUgdHJhbnNmb3JtIHRyYW5zaXRpb24gZmlyc3QgaWYgdXNpbmcgbXVsdGlwbGUgdHJhbnNpdGlvbnMgKGUuZy4sIGB0cmFuc2Zvcm0gMnMgZWFzZSwgb3BhY2l0eSAuNXMgZWFzZS1vdXRgKVxcbi8vIHNjc3MtZG9jcy1lbmQgY2Fyb3VzZWwtdmFyaWFibGVzXFxuXFxuLy8gc2Nzcy1kb2NzLXN0YXJ0IGNhcm91c2VsLWRhcmstdmFyaWFibGVzXFxuJGNhcm91c2VsLWRhcmstaW5kaWNhdG9yLWFjdGl2ZS1iZzogICRibGFjayAhZGVmYXVsdDtcXG4kY2Fyb3VzZWwtZGFyay1jYXB0aW9uLWNvbG9yOiAgICAgICAgJGJsYWNrICFkZWZhdWx0O1xcbiRjYXJvdXNlbC1kYXJrLWNvbnRyb2wtaWNvbi1maWx0ZXI6ICBpbnZlcnQoMSkgZ3JheXNjYWxlKDEwMCkgIWRlZmF1bHQ7XFxuLy8gc2Nzcy1kb2NzLWVuZCBjYXJvdXNlbC1kYXJrLXZhcmlhYmxlc1xcblxcblxcbi8vIFNwaW5uZXJzXFxuXFxuLy8gc2Nzcy1kb2NzLXN0YXJ0IHNwaW5uZXItdmFyaWFibGVzXFxuJHNwaW5uZXItd2lkdGg6ICAgICAgICAgICAycmVtICFkZWZhdWx0O1xcbiRzcGlubmVyLWhlaWdodDogICAgICAgICAgJHNwaW5uZXItd2lkdGggIWRlZmF1bHQ7XFxuJHNwaW5uZXItdmVydGljYWwtYWxpZ246ICAtLjEyNWVtICFkZWZhdWx0O1xcbiRzcGlubmVyLWJvcmRlci13aWR0aDogICAgLjI1ZW0gIWRlZmF1bHQ7XFxuJHNwaW5uZXItYW5pbWF0aW9uLXNwZWVkOiAuNzVzICFkZWZhdWx0O1xcblxcbiRzcGlubmVyLXdpZHRoLXNtOiAgICAgICAgMXJlbSAhZGVmYXVsdDtcXG4kc3Bpbm5lci1oZWlnaHQtc206ICAgICAgICRzcGlubmVyLXdpZHRoLXNtICFkZWZhdWx0O1xcbiRzcGlubmVyLWJvcmRlci13aWR0aC1zbTogLjJlbSAhZGVmYXVsdDtcXG4vLyBzY3NzLWRvY3MtZW5kIHNwaW5uZXItdmFyaWFibGVzXFxuXFxuXFxuLy8gQ2xvc2VcXG5cXG4vLyBzY3NzLWRvY3Mtc3RhcnQgY2xvc2UtdmFyaWFibGVzXFxuJGJ0bi1jbG9zZS13aWR0aDogICAgICAgICAgICAxZW0gIWRlZmF1bHQ7XFxuJGJ0bi1jbG9zZS1oZWlnaHQ6ICAgICAgICAgICAkYnRuLWNsb3NlLXdpZHRoICFkZWZhdWx0O1xcbiRidG4tY2xvc2UtcGFkZGluZy14OiAgICAgICAgLjI1ZW0gIWRlZmF1bHQ7XFxuJGJ0bi1jbG9zZS1wYWRkaW5nLXk6ICAgICAgICAkYnRuLWNsb3NlLXBhZGRpbmcteCAhZGVmYXVsdDtcXG4kYnRuLWNsb3NlLWNvbG9yOiAgICAgICAgICAgICRibGFjayAhZGVmYXVsdDtcXG4kYnRuLWNsb3NlLWJnOiAgICAgICAgICAgICAgIHVybChcXFwiZGF0YTppbWFnZS9zdmcreG1sLDxzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB2aWV3Qm94PScwIDAgMTYgMTYnIGZpbGw9JyN7JGJ0bi1jbG9zZS1jb2xvcn0nPjxwYXRoIGQ9J00uMjkzLjI5M2ExIDEgMCAwIDEgMS40MTQgMEw4IDYuNTg2IDE0LjI5My4yOTNhMSAxIDAgMSAxIDEuNDE0IDEuNDE0TDkuNDE0IDhsNi4yOTMgNi4yOTNhMSAxIDAgMCAxLTEuNDE0IDEuNDE0TDggOS40MTRsLTYuMjkzIDYuMjkzYTEgMSAwIDAgMS0xLjQxNC0xLjQxNEw2LjU4NiA4IC4yOTMgMS43MDdhMSAxIDAgMCAxIDAtMS40MTR6Jy8+PC9zdmc+XFxcIikgIWRlZmF1bHQ7XFxuJGJ0bi1jbG9zZS1mb2N1cy1zaGFkb3c6ICAgICAkZm9jdXMtcmluZy1ib3gtc2hhZG93ICFkZWZhdWx0O1xcbiRidG4tY2xvc2Utb3BhY2l0eTogICAgICAgICAgLjUgIWRlZmF1bHQ7XFxuJGJ0bi1jbG9zZS1ob3Zlci1vcGFjaXR5OiAgICAuNzUgIWRlZmF1bHQ7XFxuJGJ0bi1jbG9zZS1mb2N1cy1vcGFjaXR5OiAgICAxICFkZWZhdWx0O1xcbiRidG4tY2xvc2UtZGlzYWJsZWQtb3BhY2l0eTogLjI1ICFkZWZhdWx0O1xcbiRidG4tY2xvc2Utd2hpdGUtZmlsdGVyOiAgICAgaW52ZXJ0KDEpIGdyYXlzY2FsZSgxMDAlKSBicmlnaHRuZXNzKDIwMCUpICFkZWZhdWx0O1xcbi8vIHNjc3MtZG9jcy1lbmQgY2xvc2UtdmFyaWFibGVzXFxuXFxuXFxuLy8gT2ZmY2FudmFzXFxuXFxuLy8gc2Nzcy1kb2NzLXN0YXJ0IG9mZmNhbnZhcy12YXJpYWJsZXNcXG4kb2ZmY2FudmFzLXBhZGRpbmcteTogICAgICAgICAgICAgICAkbW9kYWwtaW5uZXItcGFkZGluZyAhZGVmYXVsdDtcXG4kb2ZmY2FudmFzLXBhZGRpbmcteDogICAgICAgICAgICAgICAkbW9kYWwtaW5uZXItcGFkZGluZyAhZGVmYXVsdDtcXG4kb2ZmY2FudmFzLWhvcml6b250YWwtd2lkdGg6ICAgICAgICA0MDBweCAhZGVmYXVsdDtcXG4kb2ZmY2FudmFzLXZlcnRpY2FsLWhlaWdodDogICAgICAgICAzMHZoICFkZWZhdWx0O1xcbiRvZmZjYW52YXMtdHJhbnNpdGlvbi1kdXJhdGlvbjogICAgIC4zcyAhZGVmYXVsdDtcXG4kb2ZmY2FudmFzLWJvcmRlci1jb2xvcjogICAgICAgICAgICAkbW9kYWwtY29udGVudC1ib3JkZXItY29sb3IgIWRlZmF1bHQ7XFxuJG9mZmNhbnZhcy1ib3JkZXItd2lkdGg6ICAgICAgICAgICAgJG1vZGFsLWNvbnRlbnQtYm9yZGVyLXdpZHRoICFkZWZhdWx0O1xcbiRvZmZjYW52YXMtdGl0bGUtbGluZS1oZWlnaHQ6ICAgICAgICRtb2RhbC10aXRsZS1saW5lLWhlaWdodCAhZGVmYXVsdDtcXG4kb2ZmY2FudmFzLWJnLWNvbG9yOiAgICAgICAgICAgICAgICB2YXIoLS0jeyRwcmVmaXh9Ym9keS1iZykgIWRlZmF1bHQ7XFxuJG9mZmNhbnZhcy1jb2xvcjogICAgICAgICAgICAgICAgICAgdmFyKC0tI3skcHJlZml4fWJvZHktY29sb3IpICFkZWZhdWx0O1xcbiRvZmZjYW52YXMtYm94LXNoYWRvdzogICAgICAgICAgICAgICRtb2RhbC1jb250ZW50LWJveC1zaGFkb3cteHMgIWRlZmF1bHQ7XFxuJG9mZmNhbnZhcy1iYWNrZHJvcC1iZzogICAgICAgICAgICAgJG1vZGFsLWJhY2tkcm9wLWJnICFkZWZhdWx0O1xcbiRvZmZjYW52YXMtYmFja2Ryb3Atb3BhY2l0eTogICAgICAgICRtb2RhbC1iYWNrZHJvcC1vcGFjaXR5ICFkZWZhdWx0O1xcbi8vIHNjc3MtZG9jcy1lbmQgb2ZmY2FudmFzLXZhcmlhYmxlc1xcblxcbi8vIENvZGVcXG5cXG4kY29kZS1mb250LXNpemU6ICAgICAgICAgICAgICAgICAgICAkc21hbGwtZm9udC1zaXplICFkZWZhdWx0O1xcbiRjb2RlLWNvbG9yOiAgICAgICAgICAgICAgICAgICAgICAgICRwaW5rICFkZWZhdWx0O1xcblxcbiRrYmQtcGFkZGluZy15OiAgICAgICAgICAgICAgICAgICAgIC4xODc1cmVtICFkZWZhdWx0O1xcbiRrYmQtcGFkZGluZy14OiAgICAgICAgICAgICAgICAgICAgIC4zNzVyZW0gIWRlZmF1bHQ7XFxuJGtiZC1mb250LXNpemU6ICAgICAgICAgICAgICAgICAgICAgJGNvZGUtZm9udC1zaXplICFkZWZhdWx0O1xcbiRrYmQtY29sb3I6ICAgICAgICAgICAgICAgICAgICAgICAgIHZhcigtLSN7JHByZWZpeH1ib2R5LWJnKSAhZGVmYXVsdDtcXG4ka2JkLWJnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIoLS0jeyRwcmVmaXh9Ym9keS1jb2xvcikgIWRlZmF1bHQ7XFxuJG5lc3RlZC1rYmQtZm9udC13ZWlnaHQ6ICAgICAgICAgICAgbnVsbCAhZGVmYXVsdDsgLy8gRGVwcmVjYXRlZCBpbiB2NS4yLjAsIHJlbW92aW5nIGluIHY2XFxuXFxuJHByZS1jb2xvcjogICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAhZGVmYXVsdDtcXG5cIixcIi8vIHN0eWxlbGludC1kaXNhYmxlIHByb3BlcnR5LWRpc2FsbG93ZWQtbGlzdFxcbi8vIFNpbmdsZSBzaWRlIGJvcmRlci1yYWRpdXNcXG5cXG4vLyBIZWxwZXIgZnVuY3Rpb24gdG8gcmVwbGFjZSBuZWdhdGl2ZSB2YWx1ZXMgd2l0aCAwXFxuQGZ1bmN0aW9uIHZhbGlkLXJhZGl1cygkcmFkaXVzKSB7XFxuICAkcmV0dXJuOiAoKTtcXG4gIEBlYWNoICR2YWx1ZSBpbiAkcmFkaXVzIHtcXG4gICAgQGlmIHR5cGUtb2YoJHZhbHVlKSA9PSBudW1iZXIge1xcbiAgICAgICRyZXR1cm46IGFwcGVuZCgkcmV0dXJuLCBtYXgoJHZhbHVlLCAwKSk7XFxuICAgIH0gQGVsc2Uge1xcbiAgICAgICRyZXR1cm46IGFwcGVuZCgkcmV0dXJuLCAkdmFsdWUpO1xcbiAgICB9XFxuICB9XFxuICBAcmV0dXJuICRyZXR1cm47XFxufVxcblxcbi8vIHNjc3MtZG9jcy1zdGFydCBib3JkZXItcmFkaXVzLW1peGluc1xcbkBtaXhpbiBib3JkZXItcmFkaXVzKCRyYWRpdXM6ICRib3JkZXItcmFkaXVzLCAkZmFsbGJhY2stYm9yZGVyLXJhZGl1czogZmFsc2UpIHtcXG4gIEBpZiAkZW5hYmxlLXJvdW5kZWQge1xcbiAgICBib3JkZXItcmFkaXVzOiB2YWxpZC1yYWRpdXMoJHJhZGl1cyk7XFxuICB9XFxuICBAZWxzZSBpZiAkZmFsbGJhY2stYm9yZGVyLXJhZGl1cyAhPSBmYWxzZSB7XFxuICAgIGJvcmRlci1yYWRpdXM6ICRmYWxsYmFjay1ib3JkZXItcmFkaXVzO1xcbiAgfVxcbn1cXG5cXG5AbWl4aW4gYm9yZGVyLXRvcC1yYWRpdXMoJHJhZGl1czogJGJvcmRlci1yYWRpdXMpIHtcXG4gIEBpZiAkZW5hYmxlLXJvdW5kZWQge1xcbiAgICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiB2YWxpZC1yYWRpdXMoJHJhZGl1cyk7XFxuICAgIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiB2YWxpZC1yYWRpdXMoJHJhZGl1cyk7XFxuICB9XFxufVxcblxcbkBtaXhpbiBib3JkZXItZW5kLXJhZGl1cygkcmFkaXVzOiAkYm9yZGVyLXJhZGl1cykge1xcbiAgQGlmICRlbmFibGUtcm91bmRlZCB7XFxuICAgIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiB2YWxpZC1yYWRpdXMoJHJhZGl1cyk7XFxuICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiB2YWxpZC1yYWRpdXMoJHJhZGl1cyk7XFxuICB9XFxufVxcblxcbkBtaXhpbiBib3JkZXItYm90dG9tLXJhZGl1cygkcmFkaXVzOiAkYm9yZGVyLXJhZGl1cykge1xcbiAgQGlmICRlbmFibGUtcm91bmRlZCB7XFxuICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiB2YWxpZC1yYWRpdXMoJHJhZGl1cyk7XFxuICAgIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IHZhbGlkLXJhZGl1cygkcmFkaXVzKTtcXG4gIH1cXG59XFxuXFxuQG1peGluIGJvcmRlci1zdGFydC1yYWRpdXMoJHJhZGl1czogJGJvcmRlci1yYWRpdXMpIHtcXG4gIEBpZiAkZW5hYmxlLXJvdW5kZWQge1xcbiAgICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiB2YWxpZC1yYWRpdXMoJHJhZGl1cyk7XFxuICAgIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IHZhbGlkLXJhZGl1cygkcmFkaXVzKTtcXG4gIH1cXG59XFxuXFxuQG1peGluIGJvcmRlci10b3Atc3RhcnQtcmFkaXVzKCRyYWRpdXM6ICRib3JkZXItcmFkaXVzKSB7XFxuICBAaWYgJGVuYWJsZS1yb3VuZGVkIHtcXG4gICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogdmFsaWQtcmFkaXVzKCRyYWRpdXMpO1xcbiAgfVxcbn1cXG5cXG5AbWl4aW4gYm9yZGVyLXRvcC1lbmQtcmFkaXVzKCRyYWRpdXM6ICRib3JkZXItcmFkaXVzKSB7XFxuICBAaWYgJGVuYWJsZS1yb3VuZGVkIHtcXG4gICAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IHZhbGlkLXJhZGl1cygkcmFkaXVzKTtcXG4gIH1cXG59XFxuXFxuQG1peGluIGJvcmRlci1ib3R0b20tZW5kLXJhZGl1cygkcmFkaXVzOiAkYm9yZGVyLXJhZGl1cykge1xcbiAgQGlmICRlbmFibGUtcm91bmRlZCB7XFxuICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiB2YWxpZC1yYWRpdXMoJHJhZGl1cyk7XFxuICB9XFxufVxcblxcbkBtaXhpbiBib3JkZXItYm90dG9tLXN0YXJ0LXJhZGl1cygkcmFkaXVzOiAkYm9yZGVyLXJhZGl1cykge1xcbiAgQGlmICRlbmFibGUtcm91bmRlZCB7XFxuICAgIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IHZhbGlkLXJhZGl1cygkcmFkaXVzKTtcXG4gIH1cXG59XFxuLy8gc2Nzcy1kb2NzLWVuZCBib3JkZXItcmFkaXVzLW1peGluc1xcblwiLFwiLy9cXG4vLyBIZWFkaW5nc1xcbi8vXFxuLmgxIHtcXG4gIEBleHRlbmQgaDE7XFxufVxcblxcbi5oMiB7XFxuICBAZXh0ZW5kIGgyO1xcbn1cXG5cXG4uaDMge1xcbiAgQGV4dGVuZCBoMztcXG59XFxuXFxuLmg0IHtcXG4gIEBleHRlbmQgaDQ7XFxufVxcblxcbi5oNSB7XFxuICBAZXh0ZW5kIGg1O1xcbn1cXG5cXG4uaDYge1xcbiAgQGV4dGVuZCBoNjtcXG59XFxuXFxuXFxuLmxlYWQge1xcbiAgQGluY2x1ZGUgZm9udC1zaXplKCRsZWFkLWZvbnQtc2l6ZSk7XFxuICBmb250LXdlaWdodDogJGxlYWQtZm9udC13ZWlnaHQ7XFxufVxcblxcbi8vIFR5cGUgZGlzcGxheSBjbGFzc2VzXFxuQGVhY2ggJGRpc3BsYXksICRmb250LXNpemUgaW4gJGRpc3BsYXktZm9udC1zaXplcyB7XFxuICAuZGlzcGxheS0jeyRkaXNwbGF5fSB7XFxuICAgIEBpbmNsdWRlIGZvbnQtc2l6ZSgkZm9udC1zaXplKTtcXG4gICAgZm9udC1mYW1pbHk6ICRkaXNwbGF5LWZvbnQtZmFtaWx5O1xcbiAgICBmb250LXN0eWxlOiAkZGlzcGxheS1mb250LXN0eWxlO1xcbiAgICBmb250LXdlaWdodDogJGRpc3BsYXktZm9udC13ZWlnaHQ7XFxuICAgIGxpbmUtaGVpZ2h0OiAkZGlzcGxheS1saW5lLWhlaWdodDtcXG4gIH1cXG59XFxuXFxuLy9cXG4vLyBFbXBoYXNpc1xcbi8vXFxuLnNtYWxsIHtcXG4gIEBleHRlbmQgc21hbGw7XFxufVxcblxcbi5tYXJrIHtcXG4gIEBleHRlbmQgbWFyaztcXG59XFxuXFxuLy9cXG4vLyBMaXN0c1xcbi8vXFxuXFxuLmxpc3QtdW5zdHlsZWQge1xcbiAgQGluY2x1ZGUgbGlzdC11bnN0eWxlZCgpO1xcbn1cXG5cXG4vLyBJbmxpbmUgdHVybnMgbGlzdCBpdGVtcyBpbnRvIGlubGluZS1ibG9ja1xcbi5saXN0LWlubGluZSB7XFxuICBAaW5jbHVkZSBsaXN0LXVuc3R5bGVkKCk7XFxufVxcbi5saXN0LWlubGluZS1pdGVtIHtcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG5cXG4gICY6bm90KDpsYXN0LWNoaWxkKSB7XFxuICAgIG1hcmdpbi1yaWdodDogJGxpc3QtaW5saW5lLXBhZGRpbmc7XFxuICB9XFxufVxcblxcblxcbi8vXFxuLy8gTWlzY1xcbi8vXFxuXFxuLy8gQnVpbGRzIG9uIGBhYmJyYFxcbi5pbml0aWFsaXNtIHtcXG4gIEBpbmNsdWRlIGZvbnQtc2l6ZSgkaW5pdGlhbGlzbS1mb250LXNpemUpO1xcbiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcXG59XFxuXFxuLy8gQmxvY2txdW90ZXNcXG4uYmxvY2txdW90ZSB7XFxuICBtYXJnaW4tYm90dG9tOiAkYmxvY2txdW90ZS1tYXJnaW4teTtcXG4gIEBpbmNsdWRlIGZvbnQtc2l6ZSgkYmxvY2txdW90ZS1mb250LXNpemUpO1xcblxcbiAgPiA6bGFzdC1jaGlsZCB7XFxuICAgIG1hcmdpbi1ib3R0b206IDA7XFxuICB9XFxufVxcblxcbi5ibG9ja3F1b3RlLWZvb3RlciB7XFxuICBtYXJnaW4tdG9wOiAtJGJsb2NrcXVvdGUtbWFyZ2luLXk7XFxuICBtYXJnaW4tYm90dG9tOiAkYmxvY2txdW90ZS1tYXJnaW4teTtcXG4gIEBpbmNsdWRlIGZvbnQtc2l6ZSgkYmxvY2txdW90ZS1mb290ZXItZm9udC1zaXplKTtcXG4gIGNvbG9yOiAkYmxvY2txdW90ZS1mb290ZXItY29sb3I7XFxuXFxuICAmOjpiZWZvcmUge1xcbiAgICBjb250ZW50OiBcXFwiXFxcXDIwMTRcXFxcMDBBMFxcXCI7IC8vIGVtIGRhc2gsIG5ic3BcXG4gIH1cXG59XFxuXCIsXCIvLyBMaXN0c1xcblxcbi8vIFVuc3R5bGVkIGtlZXBzIGxpc3QgaXRlbXMgYmxvY2sgbGV2ZWwsIGp1c3QgcmVtb3ZlcyBkZWZhdWx0IGJyb3dzZXIgcGFkZGluZyBhbmQgbGlzdC1zdHlsZVxcbkBtaXhpbiBsaXN0LXVuc3R5bGVkIHtcXG4gIHBhZGRpbmctbGVmdDogMDtcXG4gIGxpc3Qtc3R5bGU6IG5vbmU7XFxufVxcblwiLFwiLy8gSW1hZ2UgTWl4aW5zXFxuLy8gLSBSZXNwb25zaXZlIGltYWdlXFxuLy8gLSBSZXRpbmEgaW1hZ2VcXG5cXG5cXG4vLyBSZXNwb25zaXZlIGltYWdlXFxuLy9cXG4vLyBLZWVwIGltYWdlcyBmcm9tIHNjYWxpbmcgYmV5b25kIHRoZSB3aWR0aCBvZiB0aGVpciBwYXJlbnRzLlxcblxcbkBtaXhpbiBpbWctZmx1aWQge1xcbiAgLy8gUGFydCAxOiBTZXQgYSBtYXhpbXVtIHJlbGF0aXZlIHRvIHRoZSBwYXJlbnRcXG4gIG1heC13aWR0aDogMTAwJTtcXG4gIC8vIFBhcnQgMjogT3ZlcnJpZGUgdGhlIGhlaWdodCB0byBhdXRvLCBvdGhlcndpc2UgaW1hZ2VzIHdpbGwgYmUgc3RyZXRjaGVkXFxuICAvLyB3aGVuIHNldHRpbmcgYSB3aWR0aCBhbmQgaGVpZ2h0IGF0dHJpYnV0ZSBvbiB0aGUgaW1nIGVsZW1lbnQuXFxuICBoZWlnaHQ6IGF1dG87XFxufVxcblwiLFwiLy8gUmVzcG9uc2l2ZSBpbWFnZXMgKGVuc3VyZSBpbWFnZXMgZG9uJ3Qgc2NhbGUgYmV5b25kIHRoZWlyIHBhcmVudHMpXFxuLy9cXG4vLyBUaGlzIGlzIHB1cnBvc2VmdWxseSBvcHQtaW4gdmlhIGFuIGV4cGxpY2l0IGNsYXNzIHJhdGhlciB0aGFuIGJlaW5nIHRoZSBkZWZhdWx0IGZvciBhbGwgYDxpbWc+YHMuXFxuLy8gV2UgcHJldmlvdXNseSB0cmllZCB0aGUgXFxcImltYWdlcyBhcmUgcmVzcG9uc2l2ZSBieSBkZWZhdWx0XFxcIiBhcHByb2FjaCBpbiBCb290c3RyYXAgdjIsXFxuLy8gYW5kIGFiYW5kb25lZCBpdCBpbiBCb290c3RyYXAgdjMgYmVjYXVzZSBpdCBicmVha3MgbG90cyBvZiB0aGlyZC1wYXJ0eSB3aWRnZXRzIChpbmNsdWRpbmcgR29vZ2xlIE1hcHMpXFxuLy8gd2hpY2ggd2VyZW4ndCBleHBlY3RpbmcgdGhlIGltYWdlcyB3aXRoaW4gdGhlbXNlbHZlcyB0byBiZSBpbnZvbHVudGFyaWx5IHJlc2l6ZWQuXFxuLy8gU2VlIGFsc28gaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2lzc3Vlcy8xODE3OFxcbi5pbWctZmx1aWQge1xcbiAgQGluY2x1ZGUgaW1nLWZsdWlkKCk7XFxufVxcblxcblxcbi8vIEltYWdlIHRodW1ibmFpbHNcXG4uaW1nLXRodW1ibmFpbCB7XFxuICBwYWRkaW5nOiAkdGh1bWJuYWlsLXBhZGRpbmc7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAkdGh1bWJuYWlsLWJnO1xcbiAgYm9yZGVyOiAkdGh1bWJuYWlsLWJvcmRlci13aWR0aCBzb2xpZCAkdGh1bWJuYWlsLWJvcmRlci1jb2xvcjtcXG4gIEBpbmNsdWRlIGJvcmRlci1yYWRpdXMoJHRodW1ibmFpbC1ib3JkZXItcmFkaXVzKTtcXG4gIEBpbmNsdWRlIGJveC1zaGFkb3coJHRodW1ibmFpbC1ib3gtc2hhZG93KTtcXG5cXG4gIC8vIEtlZXAgdGhlbSBhdCBtb3N0IDEwMCUgd2lkZVxcbiAgQGluY2x1ZGUgaW1nLWZsdWlkKCk7XFxufVxcblxcbi8vXFxuLy8gRmlndXJlc1xcbi8vXFxuXFxuLmZpZ3VyZSB7XFxuICAvLyBFbnN1cmVzIHRoZSBjYXB0aW9uJ3MgdGV4dCBhbGlnbnMgd2l0aCB0aGUgaW1hZ2UuXFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxufVxcblxcbi5maWd1cmUtaW1nIHtcXG4gIG1hcmdpbi1ib3R0b206ICRzcGFjZXIgKiAuNTtcXG4gIGxpbmUtaGVpZ2h0OiAxO1xcbn1cXG5cXG4uZmlndXJlLWNhcHRpb24ge1xcbiAgQGluY2x1ZGUgZm9udC1zaXplKCRmaWd1cmUtY2FwdGlvbi1mb250LXNpemUpO1xcbiAgY29sb3I6ICRmaWd1cmUtY2FwdGlvbi1jb2xvcjtcXG59XFxuXCIsXCIvLyBDb250YWluZXIgbWl4aW5zXFxuXFxuQG1peGluIG1ha2UtY29udGFpbmVyKCRndXR0ZXI6ICRjb250YWluZXItcGFkZGluZy14KSB7XFxuICAtLSN7JHByZWZpeH1ndXR0ZXIteDogI3skZ3V0dGVyfTtcXG4gIC0tI3skcHJlZml4fWd1dHRlci15OiAwO1xcbiAgd2lkdGg6IDEwMCU7XFxuICBwYWRkaW5nLXJpZ2h0OiBjYWxjKHZhcigtLSN7JHByZWZpeH1ndXR0ZXIteCkgKiAuNSk7IC8vIHN0eWxlbGludC1kaXNhYmxlLWxpbmUgZnVuY3Rpb24tZGlzYWxsb3dlZC1saXN0XFxuICBwYWRkaW5nLWxlZnQ6IGNhbGModmFyKC0tI3skcHJlZml4fWd1dHRlci14KSAqIC41KTsgLy8gc3R5bGVsaW50LWRpc2FibGUtbGluZSBmdW5jdGlvbi1kaXNhbGxvd2VkLWxpc3RcXG4gIG1hcmdpbi1yaWdodDogYXV0bztcXG4gIG1hcmdpbi1sZWZ0OiBhdXRvO1xcbn1cXG5cIixcIi8vIEJyZWFrcG9pbnQgdmlld3BvcnQgc2l6ZXMgYW5kIG1lZGlhIHF1ZXJpZXMuXFxuLy9cXG4vLyBCcmVha3BvaW50cyBhcmUgZGVmaW5lZCBhcyBhIG1hcCBvZiAobmFtZTogbWluaW11bSB3aWR0aCksIG9yZGVyIGZyb20gc21hbGwgdG8gbGFyZ2U6XFxuLy9cXG4vLyAgICAoeHM6IDAsIHNtOiA1NzZweCwgbWQ6IDc2OHB4LCBsZzogOTkycHgsIHhsOiAxMjAwcHgsIHh4bDogMTQwMHB4KVxcbi8vXFxuLy8gVGhlIG1hcCBkZWZpbmVkIGluIHRoZSBgJGdyaWQtYnJlYWtwb2ludHNgIGdsb2JhbCB2YXJpYWJsZSBpcyB1c2VkIGFzIHRoZSBgJGJyZWFrcG9pbnRzYCBhcmd1bWVudCBieSBkZWZhdWx0Llxcblxcbi8vIE5hbWUgb2YgdGhlIG5leHQgYnJlYWtwb2ludCwgb3IgbnVsbCBmb3IgdGhlIGxhc3QgYnJlYWtwb2ludC5cXG4vL1xcbi8vICAgID4+IGJyZWFrcG9pbnQtbmV4dChzbSlcXG4vLyAgICBtZFxcbi8vICAgID4+IGJyZWFrcG9pbnQtbmV4dChzbSwgKHhzOiAwLCBzbTogNTc2cHgsIG1kOiA3NjhweCwgbGc6IDk5MnB4LCB4bDogMTIwMHB4LCB4eGw6IDE0MDBweCkpXFxuLy8gICAgbWRcXG4vLyAgICA+PiBicmVha3BvaW50LW5leHQoc20sICRicmVha3BvaW50LW5hbWVzOiAoeHMgc20gbWQgbGcgeGwgeHhsKSlcXG4vLyAgICBtZFxcbkBmdW5jdGlvbiBicmVha3BvaW50LW5leHQoJG5hbWUsICRicmVha3BvaW50czogJGdyaWQtYnJlYWtwb2ludHMsICRicmVha3BvaW50LW5hbWVzOiBtYXAta2V5cygkYnJlYWtwb2ludHMpKSB7XFxuICAkbjogaW5kZXgoJGJyZWFrcG9pbnQtbmFtZXMsICRuYW1lKTtcXG4gIEBpZiBub3QgJG4ge1xcbiAgICBAZXJyb3IgXFxcImJyZWFrcG9pbnQgYCN7JG5hbWV9YCBub3QgZm91bmQgaW4gYCN7JGJyZWFrcG9pbnRzfWBcXFwiO1xcbiAgfVxcbiAgQHJldHVybiBpZigkbiA8IGxlbmd0aCgkYnJlYWtwb2ludC1uYW1lcyksIG50aCgkYnJlYWtwb2ludC1uYW1lcywgJG4gKyAxKSwgbnVsbCk7XFxufVxcblxcbi8vIE1pbmltdW0gYnJlYWtwb2ludCB3aWR0aC4gTnVsbCBmb3IgdGhlIHNtYWxsZXN0IChmaXJzdCkgYnJlYWtwb2ludC5cXG4vL1xcbi8vICAgID4+IGJyZWFrcG9pbnQtbWluKHNtLCAoeHM6IDAsIHNtOiA1NzZweCwgbWQ6IDc2OHB4LCBsZzogOTkycHgsIHhsOiAxMjAwcHgsIHh4bDogMTQwMHB4KSlcXG4vLyAgICA1NzZweFxcbkBmdW5jdGlvbiBicmVha3BvaW50LW1pbigkbmFtZSwgJGJyZWFrcG9pbnRzOiAkZ3JpZC1icmVha3BvaW50cykge1xcbiAgJG1pbjogbWFwLWdldCgkYnJlYWtwb2ludHMsICRuYW1lKTtcXG4gIEByZXR1cm4gaWYoJG1pbiAhPSAwLCAkbWluLCBudWxsKTtcXG59XFxuXFxuLy8gTWF4aW11bSBicmVha3BvaW50IHdpZHRoLlxcbi8vIFRoZSBtYXhpbXVtIHZhbHVlIGlzIHJlZHVjZWQgYnkgMC4wMnB4IHRvIHdvcmsgYXJvdW5kIHRoZSBsaW1pdGF0aW9ucyBvZlxcbi8vIGBtaW4tYCBhbmQgYG1heC1gIHByZWZpeGVzIGFuZCB2aWV3cG9ydHMgd2l0aCBmcmFjdGlvbmFsIHdpZHRocy5cXG4vLyBTZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL21lZGlhcXVlcmllcy00LyNtcS1taW4tbWF4XFxuLy8gVXNlcyAwLjAycHggcmF0aGVyIHRoYW4gMC4wMXB4IHRvIHdvcmsgYXJvdW5kIGEgY3VycmVudCByb3VuZGluZyBidWcgaW4gU2FmYXJpLlxcbi8vIFNlZSBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTc4MjYxXFxuLy9cXG4vLyAgICA+PiBicmVha3BvaW50LW1heChtZCwgKHhzOiAwLCBzbTogNTc2cHgsIG1kOiA3NjhweCwgbGc6IDk5MnB4LCB4bDogMTIwMHB4LCB4eGw6IDE0MDBweCkpXFxuLy8gICAgNzY3Ljk4cHhcXG5AZnVuY3Rpb24gYnJlYWtwb2ludC1tYXgoJG5hbWUsICRicmVha3BvaW50czogJGdyaWQtYnJlYWtwb2ludHMpIHtcXG4gICRtYXg6IG1hcC1nZXQoJGJyZWFrcG9pbnRzLCAkbmFtZSk7XFxuICBAcmV0dXJuIGlmKCRtYXggYW5kICRtYXggPiAwLCAkbWF4IC0gLjAyLCBudWxsKTtcXG59XFxuXFxuLy8gUmV0dXJucyBhIGJsYW5rIHN0cmluZyBpZiBzbWFsbGVzdCBicmVha3BvaW50LCBvdGhlcndpc2UgcmV0dXJucyB0aGUgbmFtZSB3aXRoIGEgZGFzaCBpbiBmcm9udC5cXG4vLyBVc2VmdWwgZm9yIG1ha2luZyByZXNwb25zaXZlIHV0aWxpdGllcy5cXG4vL1xcbi8vICAgID4+IGJyZWFrcG9pbnQtaW5maXgoeHMsICh4czogMCwgc206IDU3NnB4LCBtZDogNzY4cHgsIGxnOiA5OTJweCwgeGw6IDEyMDBweCwgeHhsOiAxNDAwcHgpKVxcbi8vICAgIFxcXCJcXFwiICAoUmV0dXJucyBhIGJsYW5rIHN0cmluZylcXG4vLyAgICA+PiBicmVha3BvaW50LWluZml4KHNtLCAoeHM6IDAsIHNtOiA1NzZweCwgbWQ6IDc2OHB4LCBsZzogOTkycHgsIHhsOiAxMjAwcHgsIHh4bDogMTQwMHB4KSlcXG4vLyAgICBcXFwiLXNtXFxcIlxcbkBmdW5jdGlvbiBicmVha3BvaW50LWluZml4KCRuYW1lLCAkYnJlYWtwb2ludHM6ICRncmlkLWJyZWFrcG9pbnRzKSB7XFxuICBAcmV0dXJuIGlmKGJyZWFrcG9pbnQtbWluKCRuYW1lLCAkYnJlYWtwb2ludHMpID09IG51bGwsIFxcXCJcXFwiLCBcXFwiLSN7JG5hbWV9XFxcIik7XFxufVxcblxcbi8vIE1lZGlhIG9mIGF0IGxlYXN0IHRoZSBtaW5pbXVtIGJyZWFrcG9pbnQgd2lkdGguIE5vIHF1ZXJ5IGZvciB0aGUgc21hbGxlc3QgYnJlYWtwb2ludC5cXG4vLyBNYWtlcyB0aGUgQGNvbnRlbnQgYXBwbHkgdG8gdGhlIGdpdmVuIGJyZWFrcG9pbnQgYW5kIHdpZGVyLlxcbkBtaXhpbiBtZWRpYS1icmVha3BvaW50LXVwKCRuYW1lLCAkYnJlYWtwb2ludHM6ICRncmlkLWJyZWFrcG9pbnRzKSB7XFxuICAkbWluOiBicmVha3BvaW50LW1pbigkbmFtZSwgJGJyZWFrcG9pbnRzKTtcXG4gIEBpZiAkbWluIHtcXG4gICAgQG1lZGlhIChtaW4td2lkdGg6ICRtaW4pIHtcXG4gICAgICBAY29udGVudDtcXG4gICAgfVxcbiAgfSBAZWxzZSB7XFxuICAgIEBjb250ZW50O1xcbiAgfVxcbn1cXG5cXG4vLyBNZWRpYSBvZiBhdCBtb3N0IHRoZSBtYXhpbXVtIGJyZWFrcG9pbnQgd2lkdGguIE5vIHF1ZXJ5IGZvciB0aGUgbGFyZ2VzdCBicmVha3BvaW50Llxcbi8vIE1ha2VzIHRoZSBAY29udGVudCBhcHBseSB0byB0aGUgZ2l2ZW4gYnJlYWtwb2ludCBhbmQgbmFycm93ZXIuXFxuQG1peGluIG1lZGlhLWJyZWFrcG9pbnQtZG93bigkbmFtZSwgJGJyZWFrcG9pbnRzOiAkZ3JpZC1icmVha3BvaW50cykge1xcbiAgJG1heDogYnJlYWtwb2ludC1tYXgoJG5hbWUsICRicmVha3BvaW50cyk7XFxuICBAaWYgJG1heCB7XFxuICAgIEBtZWRpYSAobWF4LXdpZHRoOiAkbWF4KSB7XFxuICAgICAgQGNvbnRlbnQ7XFxuICAgIH1cXG4gIH0gQGVsc2Uge1xcbiAgICBAY29udGVudDtcXG4gIH1cXG59XFxuXFxuLy8gTWVkaWEgdGhhdCBzcGFucyBtdWx0aXBsZSBicmVha3BvaW50IHdpZHRocy5cXG4vLyBNYWtlcyB0aGUgQGNvbnRlbnQgYXBwbHkgYmV0d2VlbiB0aGUgbWluIGFuZCBtYXggYnJlYWtwb2ludHNcXG5AbWl4aW4gbWVkaWEtYnJlYWtwb2ludC1iZXR3ZWVuKCRsb3dlciwgJHVwcGVyLCAkYnJlYWtwb2ludHM6ICRncmlkLWJyZWFrcG9pbnRzKSB7XFxuICAkbWluOiBicmVha3BvaW50LW1pbigkbG93ZXIsICRicmVha3BvaW50cyk7XFxuICAkbWF4OiBicmVha3BvaW50LW1heCgkdXBwZXIsICRicmVha3BvaW50cyk7XFxuXFxuICBAaWYgJG1pbiAhPSBudWxsIGFuZCAkbWF4ICE9IG51bGwge1xcbiAgICBAbWVkaWEgKG1pbi13aWR0aDogJG1pbikgYW5kIChtYXgtd2lkdGg6ICRtYXgpIHtcXG4gICAgICBAY29udGVudDtcXG4gICAgfVxcbiAgfSBAZWxzZSBpZiAkbWF4ID09IG51bGwge1xcbiAgICBAaW5jbHVkZSBtZWRpYS1icmVha3BvaW50LXVwKCRsb3dlciwgJGJyZWFrcG9pbnRzKSB7XFxuICAgICAgQGNvbnRlbnQ7XFxuICAgIH1cXG4gIH0gQGVsc2UgaWYgJG1pbiA9PSBudWxsIHtcXG4gICAgQGluY2x1ZGUgbWVkaWEtYnJlYWtwb2ludC1kb3duKCR1cHBlciwgJGJyZWFrcG9pbnRzKSB7XFxuICAgICAgQGNvbnRlbnQ7XFxuICAgIH1cXG4gIH1cXG59XFxuXFxuLy8gTWVkaWEgYmV0d2VlbiB0aGUgYnJlYWtwb2ludCdzIG1pbmltdW0gYW5kIG1heGltdW0gd2lkdGhzLlxcbi8vIE5vIG1pbmltdW0gZm9yIHRoZSBzbWFsbGVzdCBicmVha3BvaW50LCBhbmQgbm8gbWF4aW11bSBmb3IgdGhlIGxhcmdlc3Qgb25lLlxcbi8vIE1ha2VzIHRoZSBAY29udGVudCBhcHBseSBvbmx5IHRvIHRoZSBnaXZlbiBicmVha3BvaW50LCBub3Qgdmlld3BvcnRzIGFueSB3aWRlciBvciBuYXJyb3dlci5cXG5AbWl4aW4gbWVkaWEtYnJlYWtwb2ludC1vbmx5KCRuYW1lLCAkYnJlYWtwb2ludHM6ICRncmlkLWJyZWFrcG9pbnRzKSB7XFxuICAkbWluOiAgYnJlYWtwb2ludC1taW4oJG5hbWUsICRicmVha3BvaW50cyk7XFxuICAkbmV4dDogYnJlYWtwb2ludC1uZXh0KCRuYW1lLCAkYnJlYWtwb2ludHMpO1xcbiAgJG1heDogIGJyZWFrcG9pbnQtbWF4KCRuZXh0LCAkYnJlYWtwb2ludHMpO1xcblxcbiAgQGlmICRtaW4gIT0gbnVsbCBhbmQgJG1heCAhPSBudWxsIHtcXG4gICAgQG1lZGlhIChtaW4td2lkdGg6ICRtaW4pIGFuZCAobWF4LXdpZHRoOiAkbWF4KSB7XFxuICAgICAgQGNvbnRlbnQ7XFxuICAgIH1cXG4gIH0gQGVsc2UgaWYgJG1heCA9PSBudWxsIHtcXG4gICAgQGluY2x1ZGUgbWVkaWEtYnJlYWtwb2ludC11cCgkbmFtZSwgJGJyZWFrcG9pbnRzKSB7XFxuICAgICAgQGNvbnRlbnQ7XFxuICAgIH1cXG4gIH0gQGVsc2UgaWYgJG1pbiA9PSBudWxsIHtcXG4gICAgQGluY2x1ZGUgbWVkaWEtYnJlYWtwb2ludC1kb3duKCRuZXh0LCAkYnJlYWtwb2ludHMpIHtcXG4gICAgICBAY29udGVudDtcXG4gICAgfVxcbiAgfVxcbn1cXG5cIixcIi8vIENvbnRhaW5lciB3aWR0aHNcXG4vL1xcbi8vIFNldCB0aGUgY29udGFpbmVyIHdpZHRoLCBhbmQgb3ZlcnJpZGUgaXQgZm9yIGZpeGVkIG5hdmJhcnMgaW4gbWVkaWEgcXVlcmllcy5cXG5cXG5AaWYgJGVuYWJsZS1jb250YWluZXItY2xhc3NlcyB7XFxuICAvLyBTaW5nbGUgY29udGFpbmVyIGNsYXNzIHdpdGggYnJlYWtwb2ludCBtYXgtd2lkdGhzXFxuICAuY29udGFpbmVyLFxcbiAgLy8gMTAwJSB3aWRlIGNvbnRhaW5lciBhdCBhbGwgYnJlYWtwb2ludHNcXG4gIC5jb250YWluZXItZmx1aWQge1xcbiAgICBAaW5jbHVkZSBtYWtlLWNvbnRhaW5lcigpO1xcbiAgfVxcblxcbiAgLy8gUmVzcG9uc2l2ZSBjb250YWluZXJzIHRoYXQgYXJlIDEwMCUgd2lkZSB1bnRpbCBhIGJyZWFrcG9pbnRcXG4gIEBlYWNoICRicmVha3BvaW50LCAkY29udGFpbmVyLW1heC13aWR0aCBpbiAkY29udGFpbmVyLW1heC13aWR0aHMge1xcbiAgICAuY29udGFpbmVyLSN7JGJyZWFrcG9pbnR9IHtcXG4gICAgICBAZXh0ZW5kIC5jb250YWluZXItZmx1aWQ7XFxuICAgIH1cXG5cXG4gICAgQGluY2x1ZGUgbWVkaWEtYnJlYWtwb2ludC11cCgkYnJlYWtwb2ludCwgJGdyaWQtYnJlYWtwb2ludHMpIHtcXG4gICAgICAlcmVzcG9uc2l2ZS1jb250YWluZXItI3skYnJlYWtwb2ludH0ge1xcbiAgICAgICAgbWF4LXdpZHRoOiAkY29udGFpbmVyLW1heC13aWR0aDtcXG4gICAgICB9XFxuXFxuICAgICAgLy8gRXh0ZW5kIGVhY2ggYnJlYWtwb2ludCB3aGljaCBpcyBzbWFsbGVyIG9yIGVxdWFsIHRvIHRoZSBjdXJyZW50IGJyZWFrcG9pbnRcXG4gICAgICAkZXh0ZW5kLWJyZWFrcG9pbnQ6IHRydWU7XFxuXFxuICAgICAgQGVhY2ggJG5hbWUsICR3aWR0aCBpbiAkZ3JpZC1icmVha3BvaW50cyB7XFxuICAgICAgICBAaWYgKCRleHRlbmQtYnJlYWtwb2ludCkge1xcbiAgICAgICAgICAuY29udGFpbmVyI3ticmVha3BvaW50LWluZml4KCRuYW1lLCAkZ3JpZC1icmVha3BvaW50cyl9IHtcXG4gICAgICAgICAgICBAZXh0ZW5kICVyZXNwb25zaXZlLWNvbnRhaW5lci0jeyRicmVha3BvaW50fTtcXG4gICAgICAgICAgfVxcblxcbiAgICAgICAgICAvLyBPbmNlIHRoZSBjdXJyZW50IGJyZWFrcG9pbnQgaXMgcmVhY2hlZCwgc3RvcCBleHRlbmRpbmdcXG4gICAgICAgICAgQGlmICgkYnJlYWtwb2ludCA9PSAkbmFtZSkge1xcbiAgICAgICAgICAgICRleHRlbmQtYnJlYWtwb2ludDogZmFsc2U7XFxuICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgICB9XFxuICAgIH1cXG4gIH1cXG59XFxuXCIsXCIvLyBSb3dcXG4vL1xcbi8vIFJvd3MgY29udGFpbiB5b3VyIGNvbHVtbnMuXFxuXFxuOnJvb3Qge1xcbiAgQGVhY2ggJG5hbWUsICR2YWx1ZSBpbiAkZ3JpZC1icmVha3BvaW50cyB7XFxuICAgIC0tI3skcHJlZml4fWJyZWFrcG9pbnQtI3skbmFtZX06ICN7JHZhbHVlfTtcXG4gIH1cXG59XFxuXFxuQGlmICRlbmFibGUtZ3JpZC1jbGFzc2VzIHtcXG4gIC5yb3cge1xcbiAgICBAaW5jbHVkZSBtYWtlLXJvdygpO1xcblxcbiAgICA+ICoge1xcbiAgICAgIEBpbmNsdWRlIG1ha2UtY29sLXJlYWR5KCk7XFxuICAgIH1cXG4gIH1cXG59XFxuXFxuQGlmICRlbmFibGUtY3NzZ3JpZCB7XFxuICAuZ3JpZCB7XFxuICAgIGRpc3BsYXk6IGdyaWQ7XFxuICAgIGdyaWQtdGVtcGxhdGUtcm93czogcmVwZWF0KHZhcigtLSN7JHByZWZpeH1yb3dzLCAxKSwgMWZyKTtcXG4gICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQodmFyKC0tI3skcHJlZml4fWNvbHVtbnMsICN7JGdyaWQtY29sdW1uc30pLCAxZnIpO1xcbiAgICBnYXA6IHZhcigtLSN7JHByZWZpeH1nYXAsICN7JGdyaWQtZ3V0dGVyLXdpZHRofSk7XFxuXFxuICAgIEBpbmNsdWRlIG1ha2UtY3NzZ3JpZCgpO1xcbiAgfVxcbn1cXG5cXG5cXG4vLyBDb2x1bW5zXFxuLy9cXG4vLyBDb21tb24gc3R5bGVzIGZvciBzbWFsbCBhbmQgbGFyZ2UgZ3JpZCBjb2x1bW5zXFxuXFxuQGlmICRlbmFibGUtZ3JpZC1jbGFzc2VzIHtcXG4gIEBpbmNsdWRlIG1ha2UtZ3JpZC1jb2x1bW5zKCk7XFxufVxcblwiLFwiLy8gR3JpZCBzeXN0ZW1cXG4vL1xcbi8vIEdlbmVyYXRlIHNlbWFudGljIGdyaWQgY29sdW1ucyB3aXRoIHRoZXNlIG1peGlucy5cXG5cXG5AbWl4aW4gbWFrZS1yb3coJGd1dHRlcjogJGdyaWQtZ3V0dGVyLXdpZHRoKSB7XFxuICAtLSN7JHByZWZpeH1ndXR0ZXIteDogI3skZ3V0dGVyfTtcXG4gIC0tI3skcHJlZml4fWd1dHRlci15OiAwO1xcbiAgZGlzcGxheTogZmxleDtcXG4gIGZsZXgtd3JhcDogd3JhcDtcXG4gIC8vIFRPRE86IFJldmlzaXQgY2FsYyBvcmRlciBhZnRlciBodHRwczovL2dpdGh1Yi5jb20vcmVhY3QtYm9vdHN0cmFwL3JlYWN0LWJvb3RzdHJhcC9pc3N1ZXMvNjAzOSBpcyBmaXhlZFxcbiAgbWFyZ2luLXRvcDogY2FsYygtMSAqIHZhcigtLSN7JHByZWZpeH1ndXR0ZXIteSkpOyAvLyBzdHlsZWxpbnQtZGlzYWJsZS1saW5lIGZ1bmN0aW9uLWRpc2FsbG93ZWQtbGlzdFxcbiAgbWFyZ2luLXJpZ2h0OiBjYWxjKC0uNSAqIHZhcigtLSN7JHByZWZpeH1ndXR0ZXIteCkpOyAvLyBzdHlsZWxpbnQtZGlzYWJsZS1saW5lIGZ1bmN0aW9uLWRpc2FsbG93ZWQtbGlzdFxcbiAgbWFyZ2luLWxlZnQ6IGNhbGMoLS41ICogdmFyKC0tI3skcHJlZml4fWd1dHRlci14KSk7IC8vIHN0eWxlbGludC1kaXNhYmxlLWxpbmUgZnVuY3Rpb24tZGlzYWxsb3dlZC1saXN0XFxufVxcblxcbkBtaXhpbiBtYWtlLWNvbC1yZWFkeSgpIHtcXG4gIC8vIEFkZCBib3ggc2l6aW5nIGlmIG9ubHkgdGhlIGdyaWQgaXMgbG9hZGVkXFxuICBib3gtc2l6aW5nOiBpZih2YXJpYWJsZS1leGlzdHMoaW5jbHVkZS1jb2x1bW4tYm94LXNpemluZykgYW5kICRpbmNsdWRlLWNvbHVtbi1ib3gtc2l6aW5nLCBib3JkZXItYm94LCBudWxsKTtcXG4gIC8vIFByZXZlbnQgY29sdW1ucyBmcm9tIGJlY29taW5nIHRvbyBuYXJyb3cgd2hlbiBhdCBzbWFsbGVyIGdyaWQgdGllcnMgYnlcXG4gIC8vIGFsd2F5cyBzZXR0aW5nIGB3aWR0aDogMTAwJTtgLiBUaGlzIHdvcmtzIGJlY2F1c2Ugd2Ugc2V0IHRoZSB3aWR0aFxcbiAgLy8gbGF0ZXIgb24gdG8gb3ZlcnJpZGUgdGhpcyBpbml0aWFsIHdpZHRoLlxcbiAgZmxleC1zaHJpbms6IDA7XFxuICB3aWR0aDogMTAwJTtcXG4gIG1heC13aWR0aDogMTAwJTsgLy8gUHJldmVudCBgLmNvbC1hdXRvYCwgYC5jb2xgICgmIHJlc3BvbnNpdmUgdmFyaWFudHMpIGZyb20gYnJlYWtpbmcgb3V0IHRoZSBncmlkXFxuICBwYWRkaW5nLXJpZ2h0OiBjYWxjKHZhcigtLSN7JHByZWZpeH1ndXR0ZXIteCkgKiAuNSk7IC8vIHN0eWxlbGludC1kaXNhYmxlLWxpbmUgZnVuY3Rpb24tZGlzYWxsb3dlZC1saXN0XFxuICBwYWRkaW5nLWxlZnQ6IGNhbGModmFyKC0tI3skcHJlZml4fWd1dHRlci14KSAqIC41KTsgLy8gc3R5bGVsaW50LWRpc2FibGUtbGluZSBmdW5jdGlvbi1kaXNhbGxvd2VkLWxpc3RcXG4gIG1hcmdpbi10b3A6IHZhcigtLSN7JHByZWZpeH1ndXR0ZXIteSk7XFxufVxcblxcbkBtaXhpbiBtYWtlLWNvbCgkc2l6ZTogZmFsc2UsICRjb2x1bW5zOiAkZ3JpZC1jb2x1bW5zKSB7XFxuICBAaWYgJHNpemUge1xcbiAgICBmbGV4OiAwIDAgYXV0bztcXG4gICAgd2lkdGg6IHBlcmNlbnRhZ2UoZGl2aWRlKCRzaXplLCAkY29sdW1ucykpO1xcblxcbiAgfSBAZWxzZSB7XFxuICAgIGZsZXg6IDEgMSAwO1xcbiAgICBtYXgtd2lkdGg6IDEwMCU7XFxuICB9XFxufVxcblxcbkBtaXhpbiBtYWtlLWNvbC1hdXRvKCkge1xcbiAgZmxleDogMCAwIGF1dG87XFxuICB3aWR0aDogYXV0bztcXG59XFxuXFxuQG1peGluIG1ha2UtY29sLW9mZnNldCgkc2l6ZSwgJGNvbHVtbnM6ICRncmlkLWNvbHVtbnMpIHtcXG4gICRudW06IGRpdmlkZSgkc2l6ZSwgJGNvbHVtbnMpO1xcbiAgbWFyZ2luLWxlZnQ6IGlmKCRudW0gPT0gMCwgMCwgcGVyY2VudGFnZSgkbnVtKSk7XFxufVxcblxcbi8vIFJvdyBjb2x1bW5zXFxuLy9cXG4vLyBTcGVjaWZ5IG9uIGEgcGFyZW50IGVsZW1lbnQoZS5nLiwgLnJvdykgdG8gZm9yY2UgaW1tZWRpYXRlIGNoaWxkcmVuIGludG8gTk5cXG4vLyBudW1iZXIgb2YgY29sdW1ucy4gU3VwcG9ydHMgd3JhcHBpbmcgdG8gbmV3IGxpbmVzLCBidXQgZG9lcyBub3QgZG8gYSBNYXNvbnJ5XFxuLy8gc3R5bGUgZ3JpZC5cXG5AbWl4aW4gcm93LWNvbHMoJGNvdW50KSB7XFxuICA+ICoge1xcbiAgICBmbGV4OiAwIDAgYXV0bztcXG4gICAgd2lkdGg6IHBlcmNlbnRhZ2UoZGl2aWRlKDEsICRjb3VudCkpO1xcbiAgfVxcbn1cXG5cXG4vLyBGcmFtZXdvcmsgZ3JpZCBnZW5lcmF0aW9uXFxuLy9cXG4vLyBVc2VkIG9ubHkgYnkgQm9vdHN0cmFwIHRvIGdlbmVyYXRlIHRoZSBjb3JyZWN0IG51bWJlciBvZiBncmlkIGNsYXNzZXMgZ2l2ZW5cXG4vLyBhbnkgdmFsdWUgb2YgYCRncmlkLWNvbHVtbnNgLlxcblxcbkBtaXhpbiBtYWtlLWdyaWQtY29sdW1ucygkY29sdW1uczogJGdyaWQtY29sdW1ucywgJGd1dHRlcjogJGdyaWQtZ3V0dGVyLXdpZHRoLCAkYnJlYWtwb2ludHM6ICRncmlkLWJyZWFrcG9pbnRzKSB7XFxuICBAZWFjaCAkYnJlYWtwb2ludCBpbiBtYXAta2V5cygkYnJlYWtwb2ludHMpIHtcXG4gICAgJGluZml4OiBicmVha3BvaW50LWluZml4KCRicmVha3BvaW50LCAkYnJlYWtwb2ludHMpO1xcblxcbiAgICBAaW5jbHVkZSBtZWRpYS1icmVha3BvaW50LXVwKCRicmVha3BvaW50LCAkYnJlYWtwb2ludHMpIHtcXG4gICAgICAvLyBQcm92aWRlIGJhc2ljIGAuY29sLXticH1gIGNsYXNzZXMgZm9yIGVxdWFsLXdpZHRoIGZsZXhib3ggY29sdW1uc1xcbiAgICAgIC5jb2wjeyRpbmZpeH0ge1xcbiAgICAgICAgZmxleDogMSAwIDAlOyAvLyBGbGV4YnVncyAjNDogaHR0cHM6Ly9naXRodWIuY29tL3BoaWxpcHdhbHRvbi9mbGV4YnVncyNmbGV4YnVnLTRcXG4gICAgICB9XFxuXFxuICAgICAgLnJvdy1jb2xzI3skaW5maXh9LWF1dG8gPiAqIHtcXG4gICAgICAgIEBpbmNsdWRlIG1ha2UtY29sLWF1dG8oKTtcXG4gICAgICB9XFxuXFxuICAgICAgQGlmICRncmlkLXJvdy1jb2x1bW5zID4gMCB7XFxuICAgICAgICBAZm9yICRpIGZyb20gMSB0aHJvdWdoICRncmlkLXJvdy1jb2x1bW5zIHtcXG4gICAgICAgICAgLnJvdy1jb2xzI3skaW5maXh9LSN7JGl9IHtcXG4gICAgICAgICAgICBAaW5jbHVkZSByb3ctY29scygkaSk7XFxuICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgICB9XFxuXFxuICAgICAgLmNvbCN7JGluZml4fS1hdXRvIHtcXG4gICAgICAgIEBpbmNsdWRlIG1ha2UtY29sLWF1dG8oKTtcXG4gICAgICB9XFxuXFxuICAgICAgQGlmICRjb2x1bW5zID4gMCB7XFxuICAgICAgICBAZm9yICRpIGZyb20gMSB0aHJvdWdoICRjb2x1bW5zIHtcXG4gICAgICAgICAgLmNvbCN7JGluZml4fS0jeyRpfSB7XFxuICAgICAgICAgICAgQGluY2x1ZGUgbWFrZS1jb2woJGksICRjb2x1bW5zKTtcXG4gICAgICAgICAgfVxcbiAgICAgICAgfVxcblxcbiAgICAgICAgLy8gYCRjb2x1bW5zIC0gMWAgYmVjYXVzZSBvZmZzZXR0aW5nIGJ5IHRoZSB3aWR0aCBvZiBhbiBlbnRpcmUgcm93IGlzbid0IHBvc3NpYmxlXFxuICAgICAgICBAZm9yICRpIGZyb20gMCB0aHJvdWdoICgkY29sdW1ucyAtIDEpIHtcXG4gICAgICAgICAgQGlmIG5vdCAoJGluZml4ID09IFxcXCJcXFwiIGFuZCAkaSA9PSAwKSB7IC8vIEF2b2lkIGVtaXR0aW5nIHVzZWxlc3MgLm9mZnNldC0wXFxuICAgICAgICAgICAgLm9mZnNldCN7JGluZml4fS0jeyRpfSB7XFxuICAgICAgICAgICAgICBAaW5jbHVkZSBtYWtlLWNvbC1vZmZzZXQoJGksICRjb2x1bW5zKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgICB9XFxuXFxuICAgICAgLy8gR3V0dGVyc1xcbiAgICAgIC8vXFxuICAgICAgLy8gTWFrZSB1c2Ugb2YgYC5nLSpgLCBgLmd4LSpgIG9yIGAuZ3ktKmAgdXRpbGl0aWVzIHRvIGNoYW5nZSBzcGFjaW5nIGJldHdlZW4gdGhlIGNvbHVtbnMuXFxuICAgICAgQGVhY2ggJGtleSwgJHZhbHVlIGluICRndXR0ZXJzIHtcXG4gICAgICAgIC5nI3skaW5maXh9LSN7JGtleX0sXFxuICAgICAgICAuZ3gjeyRpbmZpeH0tI3ska2V5fSB7XFxuICAgICAgICAgIC0tI3skcHJlZml4fWd1dHRlci14OiAjeyR2YWx1ZX07XFxuICAgICAgICB9XFxuXFxuICAgICAgICAuZyN7JGluZml4fS0jeyRrZXl9LFxcbiAgICAgICAgLmd5I3skaW5maXh9LSN7JGtleX0ge1xcbiAgICAgICAgICAtLSN7JHByZWZpeH1ndXR0ZXIteTogI3skdmFsdWV9O1xcbiAgICAgICAgfVxcbiAgICAgIH1cXG4gICAgfVxcbiAgfVxcbn1cXG5cXG5AbWl4aW4gbWFrZS1jc3NncmlkKCRjb2x1bW5zOiAkZ3JpZC1jb2x1bW5zLCAkYnJlYWtwb2ludHM6ICRncmlkLWJyZWFrcG9pbnRzKSB7XFxuICBAZWFjaCAkYnJlYWtwb2ludCBpbiBtYXAta2V5cygkYnJlYWtwb2ludHMpIHtcXG4gICAgJGluZml4OiBicmVha3BvaW50LWluZml4KCRicmVha3BvaW50LCAkYnJlYWtwb2ludHMpO1xcblxcbiAgICBAaW5jbHVkZSBtZWRpYS1icmVha3BvaW50LXVwKCRicmVha3BvaW50LCAkYnJlYWtwb2ludHMpIHtcXG4gICAgICBAaWYgJGNvbHVtbnMgPiAwIHtcXG4gICAgICAgIEBmb3IgJGkgZnJvbSAxIHRocm91Z2ggJGNvbHVtbnMge1xcbiAgICAgICAgICAuZy1jb2wjeyRpbmZpeH0tI3skaX0ge1xcbiAgICAgICAgICAgIGdyaWQtY29sdW1uOiBhdXRvIC8gc3BhbiAkaTtcXG4gICAgICAgICAgfVxcbiAgICAgICAgfVxcblxcbiAgICAgICAgLy8gU3RhcnQgd2l0aCBgMWAgYmVjYXVzZSBgMGAgaXMgYW5kIGludmFsaWQgdmFsdWUuXFxuICAgICAgICAvLyBFbmRzIHdpdGggYCRjb2x1bW5zIC0gMWAgYmVjYXVzZSBvZmZzZXR0aW5nIGJ5IHRoZSB3aWR0aCBvZiBhbiBlbnRpcmUgcm93IGlzbid0IHBvc3NpYmxlLlxcbiAgICAgICAgQGZvciAkaSBmcm9tIDEgdGhyb3VnaCAoJGNvbHVtbnMgLSAxKSB7XFxuICAgICAgICAgIC5nLXN0YXJ0I3skaW5maXh9LSN7JGl9IHtcXG4gICAgICAgICAgICBncmlkLWNvbHVtbi1zdGFydDogJGk7XFxuICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgICB9XFxuICAgIH1cXG4gIH1cXG59XFxuXCIsXCIvL1xcbi8vIEJhc2ljIEJvb3RzdHJhcCB0YWJsZVxcbi8vXFxuXFxuLnRhYmxlIHtcXG4gIC8vIFJlc2V0IG5lZWRlZCBmb3IgbmVzdGluZyB0YWJsZXNcXG4gIC0tI3skcHJlZml4fXRhYmxlLWNvbG9yLXR5cGU6IGluaXRpYWw7XFxuICAtLSN7JHByZWZpeH10YWJsZS1iZy10eXBlOiBpbml0aWFsO1xcbiAgLS0jeyRwcmVmaXh9dGFibGUtY29sb3Itc3RhdGU6IGluaXRpYWw7XFxuICAtLSN7JHByZWZpeH10YWJsZS1iZy1zdGF0ZTogaW5pdGlhbDtcXG4gIC8vIEVuZCBvZiByZXNldFxcbiAgLS0jeyRwcmVmaXh9dGFibGUtY29sb3I6ICN7JHRhYmxlLWNvbG9yfTtcXG4gIC0tI3skcHJlZml4fXRhYmxlLWJnOiAjeyR0YWJsZS1iZ307XFxuICAtLSN7JHByZWZpeH10YWJsZS1ib3JkZXItY29sb3I6ICN7JHRhYmxlLWJvcmRlci1jb2xvcn07XFxuICAtLSN7JHByZWZpeH10YWJsZS1hY2NlbnQtYmc6ICN7JHRhYmxlLWFjY2VudC1iZ307XFxuICAtLSN7JHByZWZpeH10YWJsZS1zdHJpcGVkLWNvbG9yOiAjeyR0YWJsZS1zdHJpcGVkLWNvbG9yfTtcXG4gIC0tI3skcHJlZml4fXRhYmxlLXN0cmlwZWQtYmc6ICN7JHRhYmxlLXN0cmlwZWQtYmd9O1xcbiAgLS0jeyRwcmVmaXh9dGFibGUtYWN0aXZlLWNvbG9yOiAjeyR0YWJsZS1hY3RpdmUtY29sb3J9O1xcbiAgLS0jeyRwcmVmaXh9dGFibGUtYWN0aXZlLWJnOiAjeyR0YWJsZS1hY3RpdmUtYmd9O1xcbiAgLS0jeyRwcmVmaXh9dGFibGUtaG92ZXItY29sb3I6ICN7JHRhYmxlLWhvdmVyLWNvbG9yfTtcXG4gIC0tI3skcHJlZml4fXRhYmxlLWhvdmVyLWJnOiAjeyR0YWJsZS1ob3Zlci1iZ307XFxuXFxuICB3aWR0aDogMTAwJTtcXG4gIG1hcmdpbi1ib3R0b206ICRzcGFjZXI7XFxuICB2ZXJ0aWNhbC1hbGlnbjogJHRhYmxlLWNlbGwtdmVydGljYWwtYWxpZ247XFxuICBib3JkZXItY29sb3I6IHZhcigtLSN7JHByZWZpeH10YWJsZS1ib3JkZXItY29sb3IpO1xcblxcbiAgLy8gVGFyZ2V0IHRoICYgdGRcXG4gIC8vIFdlIG5lZWQgdGhlIGNoaWxkIGNvbWJpbmF0b3IgdG8gcHJldmVudCBzdHlsZXMgbGVha2luZyB0byBuZXN0ZWQgdGFibGVzIHdoaWNoIGRvZXNuJ3QgaGF2ZSBhIGAudGFibGVgIGNsYXNzLlxcbiAgLy8gV2UgdXNlIHRoZSB1bml2ZXJzYWwgc2VsZWN0b3JzIGhlcmUgdG8gc2ltcGxpZnkgdGhlIHNlbGVjdG9yIChlbHNlIHdlIHdvdWxkIG5lZWQgNiBkaWZmZXJlbnQgc2VsZWN0b3JzKS5cXG4gIC8vIEFub3RoZXIgYWR2YW50YWdlIGlzIHRoYXQgdGhpcyBnZW5lcmF0ZXMgbGVzcyBjb2RlIGFuZCBtYWtlcyB0aGUgc2VsZWN0b3IgbGVzcyBzcGVjaWZpYyBtYWtpbmcgaXQgZWFzaWVyIHRvIG92ZXJyaWRlLlxcbiAgLy8gc3R5bGVsaW50LWRpc2FibGUtbmV4dC1saW5lIHNlbGVjdG9yLW1heC11bml2ZXJzYWxcXG4gID4gOm5vdChjYXB0aW9uKSA+ICogPiAqIHtcXG4gICAgcGFkZGluZzogJHRhYmxlLWNlbGwtcGFkZGluZy15ICR0YWJsZS1jZWxsLXBhZGRpbmcteDtcXG4gICAgLy8gRm9sbG93aW5nIHRoZSBwcmVjZXB0IG9mIGNhc2NhZGVzOiBodHRwczovL2NvZGVwZW4uaW8vbWlyaWFtc3V6YW5uZS9mdWxsL3ZZTmdvZGJcXG4gICAgY29sb3I6IHZhcigtLSN7JHByZWZpeH10YWJsZS1jb2xvci1zdGF0ZSwgdmFyKC0tI3skcHJlZml4fXRhYmxlLWNvbG9yLXR5cGUsIHZhcigtLSN7JHByZWZpeH10YWJsZS1jb2xvcikpKTtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tI3skcHJlZml4fXRhYmxlLWJnKTtcXG4gICAgYm9yZGVyLWJvdHRvbS13aWR0aDogJHRhYmxlLWJvcmRlci13aWR0aDtcXG4gICAgYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgOTk5OXB4IHZhcigtLSN7JHByZWZpeH10YWJsZS1iZy1zdGF0ZSwgdmFyKC0tI3skcHJlZml4fXRhYmxlLWJnLXR5cGUsIHZhcigtLSN7JHByZWZpeH10YWJsZS1hY2NlbnQtYmcpKSk7XFxuICB9XFxuXFxuICA+IHRib2R5IHtcXG4gICAgdmVydGljYWwtYWxpZ246IGluaGVyaXQ7XFxuICB9XFxuXFxuICA+IHRoZWFkIHtcXG4gICAgdmVydGljYWwtYWxpZ246IGJvdHRvbTtcXG4gIH1cXG59XFxuXFxuLnRhYmxlLWdyb3VwLWRpdmlkZXIge1xcbiAgYm9yZGVyLXRvcDogY2FsYygjeyR0YWJsZS1ib3JkZXItd2lkdGh9ICogMikgc29saWQgJHRhYmxlLWdyb3VwLXNlcGFyYXRvci1jb2xvcjsgLy8gc3R5bGVsaW50LWRpc2FibGUtbGluZSBmdW5jdGlvbi1kaXNhbGxvd2VkLWxpc3RcXG59XFxuXFxuLy9cXG4vLyBDaGFuZ2UgcGxhY2VtZW50IG9mIGNhcHRpb25zIHdpdGggYSBjbGFzc1xcbi8vXFxuXFxuLmNhcHRpb24tdG9wIHtcXG4gIGNhcHRpb24tc2lkZTogdG9wO1xcbn1cXG5cXG5cXG4vL1xcbi8vIENvbmRlbnNlZCB0YWJsZSB3LyBoYWxmIHBhZGRpbmdcXG4vL1xcblxcbi50YWJsZS1zbSB7XFxuICAvLyBzdHlsZWxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgc2VsZWN0b3ItbWF4LXVuaXZlcnNhbFxcbiAgPiA6bm90KGNhcHRpb24pID4gKiA+ICoge1xcbiAgICBwYWRkaW5nOiAkdGFibGUtY2VsbC1wYWRkaW5nLXktc20gJHRhYmxlLWNlbGwtcGFkZGluZy14LXNtO1xcbiAgfVxcbn1cXG5cXG5cXG4vLyBCb3JkZXIgdmVyc2lvbnNcXG4vL1xcbi8vIEFkZCBvciByZW1vdmUgYm9yZGVycyBhbGwgYXJvdW5kIHRoZSB0YWJsZSBhbmQgYmV0d2VlbiBhbGwgdGhlIGNvbHVtbnMuXFxuLy9cXG4vLyBXaGVuIGJvcmRlcnMgYXJlIGFkZGVkIG9uIGFsbCBzaWRlcyBvZiB0aGUgY2VsbHMsIHRoZSBjb3JuZXJzIGNhbiByZW5kZXIgb2RkIHdoZW5cXG4vLyB0aGVzZSBib3JkZXJzIGRvIG5vdCBoYXZlIHRoZSBzYW1lIGNvbG9yIG9yIGlmIHRoZXkgYXJlIHNlbWktdHJhbnNwYXJlbnQuXFxuLy8gVGhlcmVmb3Igd2UgYWRkIHRvcCBhbmQgYm9yZGVyIGJvdHRvbXMgdG8gdGhlIGB0cmBzIGFuZCBsZWZ0IGFuZCByaWdodCBib3JkZXJzXFxuLy8gdG8gdGhlIGB0ZGBzIG9yIGB0aGBzXFxuXFxuLnRhYmxlLWJvcmRlcmVkIHtcXG4gID4gOm5vdChjYXB0aW9uKSA+ICoge1xcbiAgICBib3JkZXItd2lkdGg6ICR0YWJsZS1ib3JkZXItd2lkdGggMDtcXG5cXG4gICAgLy8gc3R5bGVsaW50LWRpc2FibGUtbmV4dC1saW5lIHNlbGVjdG9yLW1heC11bml2ZXJzYWxcXG4gICAgPiAqIHtcXG4gICAgICBib3JkZXItd2lkdGg6IDAgJHRhYmxlLWJvcmRlci13aWR0aDtcXG4gICAgfVxcbiAgfVxcbn1cXG5cXG4udGFibGUtYm9yZGVybGVzcyB7XFxuICAvLyBzdHlsZWxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgc2VsZWN0b3ItbWF4LXVuaXZlcnNhbFxcbiAgPiA6bm90KGNhcHRpb24pID4gKiA+ICoge1xcbiAgICBib3JkZXItYm90dG9tLXdpZHRoOiAwO1xcbiAgfVxcblxcbiAgPiA6bm90KDpmaXJzdC1jaGlsZCkge1xcbiAgICBib3JkZXItdG9wLXdpZHRoOiAwO1xcbiAgfVxcbn1cXG5cXG4vLyBaZWJyYS1zdHJpcGluZ1xcbi8vXFxuLy8gRGVmYXVsdCB6ZWJyYS1zdHJpcGUgc3R5bGVzIChhbHRlcm5hdGluZyBncmF5IGFuZCB0cmFuc3BhcmVudCBiYWNrZ3JvdW5kcylcXG5cXG4vLyBGb3Igcm93c1xcbi50YWJsZS1zdHJpcGVkIHtcXG4gID4gdGJvZHkgPiB0cjpudGgtb2YtdHlwZSgjeyR0YWJsZS1zdHJpcGVkLW9yZGVyfSkgPiAqIHtcXG4gICAgLS0jeyRwcmVmaXh9dGFibGUtY29sb3ItdHlwZTogdmFyKC0tI3skcHJlZml4fXRhYmxlLXN0cmlwZWQtY29sb3IpO1xcbiAgICAtLSN7JHByZWZpeH10YWJsZS1iZy10eXBlOiB2YXIoLS0jeyRwcmVmaXh9dGFibGUtc3RyaXBlZC1iZyk7XFxuICB9XFxufVxcblxcbi8vIEZvciBjb2x1bW5zXFxuLnRhYmxlLXN0cmlwZWQtY29sdW1ucyB7XFxuICA+IDpub3QoY2FwdGlvbikgPiB0ciA+IDpudGgtY2hpbGQoI3skdGFibGUtc3RyaXBlZC1jb2x1bW5zLW9yZGVyfSkge1xcbiAgICAtLSN7JHByZWZpeH10YWJsZS1jb2xvci10eXBlOiB2YXIoLS0jeyRwcmVmaXh9dGFibGUtc3RyaXBlZC1jb2xvcik7XFxuICAgIC0tI3skcHJlZml4fXRhYmxlLWJnLXR5cGU6IHZhcigtLSN7JHByZWZpeH10YWJsZS1zdHJpcGVkLWJnKTtcXG4gIH1cXG59XFxuXFxuLy8gQWN0aXZlIHRhYmxlXFxuLy9cXG4vLyBUaGUgYC50YWJsZS1hY3RpdmVgIGNsYXNzIGNhbiBiZSBhZGRlZCB0byBoaWdobGlnaHQgcm93cyBvciBjZWxsc1xcblxcbi50YWJsZS1hY3RpdmUge1xcbiAgLS0jeyRwcmVmaXh9dGFibGUtY29sb3Itc3RhdGU6IHZhcigtLSN7JHByZWZpeH10YWJsZS1hY3RpdmUtY29sb3IpO1xcbiAgLS0jeyRwcmVmaXh9dGFibGUtYmctc3RhdGU6IHZhcigtLSN7JHByZWZpeH10YWJsZS1hY3RpdmUtYmcpO1xcbn1cXG5cXG4vLyBIb3ZlciBlZmZlY3RcXG4vL1xcbi8vIFBsYWNlZCBoZXJlIHNpbmNlIGl0IGhhcyB0byBjb21lIGFmdGVyIHRoZSBwb3RlbnRpYWwgemVicmEgc3RyaXBpbmdcXG5cXG4udGFibGUtaG92ZXIge1xcbiAgPiB0Ym9keSA+IHRyOmhvdmVyID4gKiB7XFxuICAgIC0tI3skcHJlZml4fXRhYmxlLWNvbG9yLXN0YXRlOiB2YXIoLS0jeyRwcmVmaXh9dGFibGUtaG92ZXItY29sb3IpO1xcbiAgICAtLSN7JHByZWZpeH10YWJsZS1iZy1zdGF0ZTogdmFyKC0tI3skcHJlZml4fXRhYmxlLWhvdmVyLWJnKTtcXG4gIH1cXG59XFxuXFxuXFxuLy8gVGFibGUgdmFyaWFudHNcXG4vL1xcbi8vIFRhYmxlIHZhcmlhbnRzIHNldCB0aGUgdGFibGUgY2VsbCBiYWNrZ3JvdW5kcywgYm9yZGVyIGNvbG9yc1xcbi8vIGFuZCB0aGUgY29sb3JzIG9mIHRoZSBzdHJpcGVkLCBob3ZlcmVkICYgYWN0aXZlIHRhYmxlc1xcblxcbkBlYWNoICRjb2xvciwgJHZhbHVlIGluICR0YWJsZS12YXJpYW50cyB7XFxuICBAaW5jbHVkZSB0YWJsZS12YXJpYW50KCRjb2xvciwgJHZhbHVlKTtcXG59XFxuXFxuLy8gUmVzcG9uc2l2ZSB0YWJsZXNcXG4vL1xcbi8vIEdlbmVyYXRlIHNlcmllcyBvZiBgLnRhYmxlLXJlc3BvbnNpdmUtKmAgY2xhc3NlcyBmb3IgY29uZmlndXJpbmcgdGhlIHNjcmVlblxcbi8vIHNpemUgb2Ygd2hlcmUgeW91ciB0YWJsZSB3aWxsIG92ZXJmbG93LlxcblxcbkBlYWNoICRicmVha3BvaW50IGluIG1hcC1rZXlzKCRncmlkLWJyZWFrcG9pbnRzKSB7XFxuICAkaW5maXg6IGJyZWFrcG9pbnQtaW5maXgoJGJyZWFrcG9pbnQsICRncmlkLWJyZWFrcG9pbnRzKTtcXG5cXG4gIEBpbmNsdWRlIG1lZGlhLWJyZWFrcG9pbnQtZG93bigkYnJlYWtwb2ludCkge1xcbiAgICAudGFibGUtcmVzcG9uc2l2ZSN7JGluZml4fSB7XFxuICAgICAgb3ZlcmZsb3cteDogYXV0bztcXG4gICAgICAtd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7XFxuICAgIH1cXG4gIH1cXG59XFxuXCIsXCIvLyBzY3NzLWRvY3Mtc3RhcnQgdGFibGUtdmFyaWFudFxcbkBtaXhpbiB0YWJsZS12YXJpYW50KCRzdGF0ZSwgJGJhY2tncm91bmQpIHtcXG4gIC50YWJsZS0jeyRzdGF0ZX0ge1xcbiAgICAkY29sb3I6IGNvbG9yLWNvbnRyYXN0KG9wYXF1ZSgkYm9keS1iZywgJGJhY2tncm91bmQpKTtcXG4gICAgJGhvdmVyLWJnOiBtaXgoJGNvbG9yLCAkYmFja2dyb3VuZCwgcGVyY2VudGFnZSgkdGFibGUtaG92ZXItYmctZmFjdG9yKSk7XFxuICAgICRzdHJpcGVkLWJnOiBtaXgoJGNvbG9yLCAkYmFja2dyb3VuZCwgcGVyY2VudGFnZSgkdGFibGUtc3RyaXBlZC1iZy1mYWN0b3IpKTtcXG4gICAgJGFjdGl2ZS1iZzogbWl4KCRjb2xvciwgJGJhY2tncm91bmQsIHBlcmNlbnRhZ2UoJHRhYmxlLWFjdGl2ZS1iZy1mYWN0b3IpKTtcXG4gICAgJHRhYmxlLWJvcmRlci1jb2xvcjogbWl4KCRjb2xvciwgJGJhY2tncm91bmQsIHBlcmNlbnRhZ2UoJHRhYmxlLWJvcmRlci1mYWN0b3IpKTtcXG5cXG4gICAgLS0jeyRwcmVmaXh9dGFibGUtY29sb3I6ICN7JGNvbG9yfTtcXG4gICAgLS0jeyRwcmVmaXh9dGFibGUtYmc6ICN7JGJhY2tncm91bmR9O1xcbiAgICAtLSN7JHByZWZpeH10YWJsZS1ib3JkZXItY29sb3I6ICN7JHRhYmxlLWJvcmRlci1jb2xvcn07XFxuICAgIC0tI3skcHJlZml4fXRhYmxlLXN0cmlwZWQtYmc6ICN7JHN0cmlwZWQtYmd9O1xcbiAgICAtLSN7JHByZWZpeH10YWJsZS1zdHJpcGVkLWNvbG9yOiAje2NvbG9yLWNvbnRyYXN0KCRzdHJpcGVkLWJnKX07XFxuICAgIC0tI3skcHJlZml4fXRhYmxlLWFjdGl2ZS1iZzogI3skYWN0aXZlLWJnfTtcXG4gICAgLS0jeyRwcmVmaXh9dGFibGUtYWN0aXZlLWNvbG9yOiAje2NvbG9yLWNvbnRyYXN0KCRhY3RpdmUtYmcpfTtcXG4gICAgLS0jeyRwcmVmaXh9dGFibGUtaG92ZXItYmc6ICN7JGhvdmVyLWJnfTtcXG4gICAgLS0jeyRwcmVmaXh9dGFibGUtaG92ZXItY29sb3I6ICN7Y29sb3ItY29udHJhc3QoJGhvdmVyLWJnKX07XFxuXFxuICAgIGNvbG9yOiB2YXIoLS0jeyRwcmVmaXh9dGFibGUtY29sb3IpO1xcbiAgICBib3JkZXItY29sb3I6IHZhcigtLSN7JHByZWZpeH10YWJsZS1ib3JkZXItY29sb3IpO1xcbiAgfVxcbn1cXG4vLyBzY3NzLWRvY3MtZW5kIHRhYmxlLXZhcmlhbnRcXG5cIixcIi8vXFxuLy8gTGFiZWxzXFxuLy9cXG5cXG4uZm9ybS1sYWJlbCB7XFxuICBtYXJnaW4tYm90dG9tOiAkZm9ybS1sYWJlbC1tYXJnaW4tYm90dG9tO1xcbiAgQGluY2x1ZGUgZm9udC1zaXplKCRmb3JtLWxhYmVsLWZvbnQtc2l6ZSk7XFxuICBmb250LXN0eWxlOiAkZm9ybS1sYWJlbC1mb250LXN0eWxlO1xcbiAgZm9udC13ZWlnaHQ6ICRmb3JtLWxhYmVsLWZvbnQtd2VpZ2h0O1xcbiAgY29sb3I6ICRmb3JtLWxhYmVsLWNvbG9yO1xcbn1cXG5cXG4vLyBGb3IgdXNlIHdpdGggaG9yaXpvbnRhbCBhbmQgaW5saW5lIGZvcm1zLCB3aGVuIHlvdSBuZWVkIHRoZSBsYWJlbCAob3IgbGVnZW5kKVxcbi8vIHRleHQgdG8gYWxpZ24gd2l0aCB0aGUgZm9ybSBjb250cm9scy5cXG4uY29sLWZvcm0tbGFiZWwge1xcbiAgcGFkZGluZy10b3A6IGFkZCgkaW5wdXQtcGFkZGluZy15LCAkaW5wdXQtYm9yZGVyLXdpZHRoKTtcXG4gIHBhZGRpbmctYm90dG9tOiBhZGQoJGlucHV0LXBhZGRpbmcteSwgJGlucHV0LWJvcmRlci13aWR0aCk7XFxuICBtYXJnaW4tYm90dG9tOiAwOyAvLyBPdmVycmlkZSB0aGUgYDxsZWdlbmQ+YCBkZWZhdWx0XFxuICBAaW5jbHVkZSBmb250LXNpemUoaW5oZXJpdCk7IC8vIE92ZXJyaWRlIHRoZSBgPGxlZ2VuZD5gIGRlZmF1bHRcXG4gIGZvbnQtc3R5bGU6ICRmb3JtLWxhYmVsLWZvbnQtc3R5bGU7XFxuICBmb250LXdlaWdodDogJGZvcm0tbGFiZWwtZm9udC13ZWlnaHQ7XFxuICBsaW5lLWhlaWdodDogJGlucHV0LWxpbmUtaGVpZ2h0O1xcbiAgY29sb3I6ICRmb3JtLWxhYmVsLWNvbG9yO1xcbn1cXG5cXG4uY29sLWZvcm0tbGFiZWwtbGcge1xcbiAgcGFkZGluZy10b3A6IGFkZCgkaW5wdXQtcGFkZGluZy15LWxnLCAkaW5wdXQtYm9yZGVyLXdpZHRoKTtcXG4gIHBhZGRpbmctYm90dG9tOiBhZGQoJGlucHV0LXBhZGRpbmcteS1sZywgJGlucHV0LWJvcmRlci13aWR0aCk7XFxuICBAaW5jbHVkZSBmb250LXNpemUoJGlucHV0LWZvbnQtc2l6ZS1sZyk7XFxufVxcblxcbi5jb2wtZm9ybS1sYWJlbC1zbSB7XFxuICBwYWRkaW5nLXRvcDogYWRkKCRpbnB1dC1wYWRkaW5nLXktc20sICRpbnB1dC1ib3JkZXItd2lkdGgpO1xcbiAgcGFkZGluZy1ib3R0b206IGFkZCgkaW5wdXQtcGFkZGluZy15LXNtLCAkaW5wdXQtYm9yZGVyLXdpZHRoKTtcXG4gIEBpbmNsdWRlIGZvbnQtc2l6ZSgkaW5wdXQtZm9udC1zaXplLXNtKTtcXG59XFxuXCIsXCIvLyBCb290c3RyYXAgZnVuY3Rpb25zXFxuLy9cXG4vLyBVdGlsaXR5IG1peGlucyBhbmQgZnVuY3Rpb25zIGZvciBldmFsdWF0aW5nIHNvdXJjZSBjb2RlIGFjcm9zcyBvdXIgdmFyaWFibGVzLCBtYXBzLCBhbmQgbWl4aW5zLlxcblxcbi8vIEFzY2VuZGluZ1xcbi8vIFVzZWQgdG8gZXZhbHVhdGUgU2FzcyBtYXBzIGxpa2Ugb3VyIGdyaWQgYnJlYWtwb2ludHMuXFxuQG1peGluIF9hc3NlcnQtYXNjZW5kaW5nKCRtYXAsICRtYXAtbmFtZSkge1xcbiAgJHByZXYta2V5OiBudWxsO1xcbiAgJHByZXYtbnVtOiBudWxsO1xcbiAgQGVhY2ggJGtleSwgJG51bSBpbiAkbWFwIHtcXG4gICAgQGlmICRwcmV2LW51bSA9PSBudWxsIG9yIHVuaXQoJG51bSkgPT0gXFxcIiVcXFwiIG9yIHVuaXQoJHByZXYtbnVtKSA9PSBcXFwiJVxcXCIge1xcbiAgICAgIC8vIERvIG5vdGhpbmdcXG4gICAgfSBAZWxzZSBpZiBub3QgY29tcGFyYWJsZSgkcHJldi1udW0sICRudW0pIHtcXG4gICAgICBAd2FybiBcXFwiUG90ZW50aWFsbHkgaW52YWxpZCB2YWx1ZSBmb3IgI3skbWFwLW5hbWV9OiBUaGlzIG1hcCBtdXN0IGJlIGluIGFzY2VuZGluZyBvcmRlciwgYnV0IGtleSAnI3ska2V5fScgaGFzIHZhbHVlICN7JG51bX0gd2hvc2UgdW5pdCBtYWtlcyBpdCBpbmNvbXBhcmFibGUgdG8gI3skcHJldi1udW19LCB0aGUgdmFsdWUgb2YgdGhlIHByZXZpb3VzIGtleSAnI3skcHJldi1rZXl9JyAhXFxcIjtcXG4gICAgfSBAZWxzZSBpZiAkcHJldi1udW0gPj0gJG51bSB7XFxuICAgICAgQHdhcm4gXFxcIkludmFsaWQgdmFsdWUgZm9yICN7JG1hcC1uYW1lfTogVGhpcyBtYXAgbXVzdCBiZSBpbiBhc2NlbmRpbmcgb3JkZXIsIGJ1dCBrZXkgJyN7JGtleX0nIGhhcyB2YWx1ZSAjeyRudW19IHdoaWNoIGlzbid0IGdyZWF0ZXIgdGhhbiAjeyRwcmV2LW51bX0sIHRoZSB2YWx1ZSBvZiB0aGUgcHJldmlvdXMga2V5ICcjeyRwcmV2LWtleX0nICFcXFwiO1xcbiAgICB9XFxuICAgICRwcmV2LWtleTogJGtleTtcXG4gICAgJHByZXYtbnVtOiAkbnVtO1xcbiAgfVxcbn1cXG5cXG4vLyBTdGFydHMgYXQgemVyb1xcbi8vIFVzZWQgdG8gZW5zdXJlIHRoZSBtaW4td2lkdGggb2YgdGhlIGxvd2VzdCBicmVha3BvaW50IHN0YXJ0cyBhdCAwLlxcbkBtaXhpbiBfYXNzZXJ0LXN0YXJ0cy1hdC16ZXJvKCRtYXAsICRtYXAtbmFtZTogXFxcIiRncmlkLWJyZWFrcG9pbnRzXFxcIikge1xcbiAgQGlmIGxlbmd0aCgkbWFwKSA+IDAge1xcbiAgICAkdmFsdWVzOiBtYXAtdmFsdWVzKCRtYXApO1xcbiAgICAkZmlyc3QtdmFsdWU6IG50aCgkdmFsdWVzLCAxKTtcXG4gICAgQGlmICRmaXJzdC12YWx1ZSAhPSAwIHtcXG4gICAgICBAd2FybiBcXFwiRmlyc3QgYnJlYWtwb2ludCBpbiAjeyRtYXAtbmFtZX0gbXVzdCBzdGFydCBhdCAwLCBidXQgc3RhcnRzIGF0ICN7JGZpcnN0LXZhbHVlfS5cXFwiO1xcbiAgICB9XFxuICB9XFxufVxcblxcbi8vIENvbG9yc1xcbkBmdW5jdGlvbiB0by1yZ2IoJHZhbHVlKSB7XFxuICBAcmV0dXJuIHJlZCgkdmFsdWUpLCBncmVlbigkdmFsdWUpLCBibHVlKCR2YWx1ZSk7XFxufVxcblxcbi8vIHN0eWxlbGludC1kaXNhYmxlIHNjc3MvZG9sbGFyLXZhcmlhYmxlLXBhdHRlcm5cXG5AZnVuY3Rpb24gcmdiYS1jc3MtdmFyKCRpZGVudGlmaWVyLCAkdGFyZ2V0KSB7XFxuICBAaWYgJGlkZW50aWZpZXIgPT0gXFxcImJvZHlcXFwiIGFuZCAkdGFyZ2V0ID09IFxcXCJiZ1xcXCIge1xcbiAgICBAcmV0dXJuIHJnYmEodmFyKC0tI3skcHJlZml4fSN7JGlkZW50aWZpZXJ9LWJnLXJnYiksIHZhcigtLSN7JHByZWZpeH0jeyR0YXJnZXR9LW9wYWNpdHkpKTtcXG4gIH0gQGlmICRpZGVudGlmaWVyID09IFxcXCJib2R5XFxcIiBhbmQgJHRhcmdldCA9PSBcXFwidGV4dFxcXCIge1xcbiAgICBAcmV0dXJuIHJnYmEodmFyKC0tI3skcHJlZml4fSN7JGlkZW50aWZpZXJ9LWNvbG9yLXJnYiksIHZhcigtLSN7JHByZWZpeH0jeyR0YXJnZXR9LW9wYWNpdHkpKTtcXG4gIH0gQGVsc2Uge1xcbiAgICBAcmV0dXJuIHJnYmEodmFyKC0tI3skcHJlZml4fSN7JGlkZW50aWZpZXJ9LXJnYiksIHZhcigtLSN7JHByZWZpeH0jeyR0YXJnZXR9LW9wYWNpdHkpKTtcXG4gIH1cXG59XFxuXFxuQGZ1bmN0aW9uIG1hcC1sb29wKCRtYXAsICRmdW5jLCAkYXJncy4uLikge1xcbiAgJF9tYXA6ICgpO1xcblxcbiAgQGVhY2ggJGtleSwgJHZhbHVlIGluICRtYXAge1xcbiAgICAvLyBhbGxvdyB0byBwYXNzIHRoZSAka2V5IGFuZCAkdmFsdWUgb2YgdGhlIG1hcCBhcyBhbiBmdW5jdGlvbiBhcmd1bWVudFxcbiAgICAkX2FyZ3M6ICgpO1xcbiAgICBAZWFjaCAkYXJnIGluICRhcmdzIHtcXG4gICAgICAkX2FyZ3M6IGFwcGVuZCgkX2FyZ3MsIGlmKCRhcmcgPT0gXFxcIiRrZXlcXFwiLCAka2V5LCBpZigkYXJnID09IFxcXCIkdmFsdWVcXFwiLCAkdmFsdWUsICRhcmcpKSk7XFxuICAgIH1cXG5cXG4gICAgJF9tYXA6IG1hcC1tZXJnZSgkX21hcCwgKCRrZXk6IGNhbGwoZ2V0LWZ1bmN0aW9uKCRmdW5jKSwgJF9hcmdzLi4uKSkpO1xcbiAgfVxcblxcbiAgQHJldHVybiAkX21hcDtcXG59XFxuLy8gc3R5bGVsaW50LWVuYWJsZSBzY3NzL2RvbGxhci12YXJpYWJsZS1wYXR0ZXJuXFxuXFxuQGZ1bmN0aW9uIHZhcmlmeSgkbGlzdCkge1xcbiAgJHJlc3VsdDogbnVsbDtcXG4gIEBlYWNoICRlbnRyeSBpbiAkbGlzdCB7XFxuICAgICRyZXN1bHQ6IGFwcGVuZCgkcmVzdWx0LCB2YXIoLS0jeyRwcmVmaXh9I3skZW50cnl9KSwgc3BhY2UpO1xcbiAgfVxcbiAgQHJldHVybiAkcmVzdWx0O1xcbn1cXG5cXG4vLyBJbnRlcm5hbCBCb290c3RyYXAgZnVuY3Rpb24gdG8gdHVybiBtYXBzIGludG8gaXRzIG5lZ2F0aXZlIHZhcmlhbnQuXFxuLy8gSXQgcHJlZml4ZXMgdGhlIGtleXMgd2l0aCBgbmAgYW5kIG1ha2VzIHRoZSB2YWx1ZSBuZWdhdGl2ZS5cXG5AZnVuY3Rpb24gbmVnYXRpdmlmeS1tYXAoJG1hcCkge1xcbiAgJHJlc3VsdDogKCk7XFxuICBAZWFjaCAka2V5LCAkdmFsdWUgaW4gJG1hcCB7XFxuICAgIEBpZiAka2V5ICE9IDAge1xcbiAgICAgICRyZXN1bHQ6IG1hcC1tZXJnZSgkcmVzdWx0LCAoXFxcIm5cXFwiICsgJGtleTogKC0kdmFsdWUpKSk7XFxuICAgIH1cXG4gIH1cXG4gIEByZXR1cm4gJHJlc3VsdDtcXG59XFxuXFxuLy8gR2V0IG11bHRpcGxlIGtleXMgZnJvbSBhIHNhc3MgbWFwXFxuQGZ1bmN0aW9uIG1hcC1nZXQtbXVsdGlwbGUoJG1hcCwgJHZhbHVlcykge1xcbiAgJHJlc3VsdDogKCk7XFxuICBAZWFjaCAka2V5LCAkdmFsdWUgaW4gJG1hcCB7XFxuICAgIEBpZiAoaW5kZXgoJHZhbHVlcywgJGtleSkgIT0gbnVsbCkge1xcbiAgICAgICRyZXN1bHQ6IG1hcC1tZXJnZSgkcmVzdWx0LCAoJGtleTogJHZhbHVlKSk7XFxuICAgIH1cXG4gIH1cXG4gIEByZXR1cm4gJHJlc3VsdDtcXG59XFxuXFxuLy8gTWVyZ2UgbXVsdGlwbGUgbWFwc1xcbkBmdW5jdGlvbiBtYXAtbWVyZ2UtbXVsdGlwbGUoJG1hcHMuLi4pIHtcXG4gICRtZXJnZWQtbWFwczogKCk7XFxuXFxuICBAZWFjaCAkbWFwIGluICRtYXBzIHtcXG4gICAgJG1lcmdlZC1tYXBzOiBtYXAtbWVyZ2UoJG1lcmdlZC1tYXBzLCAkbWFwKTtcXG4gIH1cXG4gIEByZXR1cm4gJG1lcmdlZC1tYXBzO1xcbn1cXG5cXG4vLyBSZXBsYWNlIGAkc2VhcmNoYCB3aXRoIGAkcmVwbGFjZWAgaW4gYCRzdHJpbmdgXFxuLy8gVXNlZCBvbiBvdXIgU1ZHIGljb24gYmFja2dyb3VuZHMgZm9yIGN1c3RvbSBmb3Jtcy5cXG4vL1xcbi8vIEBhdXRob3IgS2l0dHkgR2lyYXVkZWxcXG4vLyBAcGFyYW0ge1N0cmluZ30gJHN0cmluZyAtIEluaXRpYWwgc3RyaW5nXFxuLy8gQHBhcmFtIHtTdHJpbmd9ICRzZWFyY2ggLSBTdWJzdHJpbmcgdG8gcmVwbGFjZVxcbi8vIEBwYXJhbSB7U3RyaW5nfSAkcmVwbGFjZSAoJycpIC0gTmV3IHZhbHVlXFxuLy8gQHJldHVybiB7U3RyaW5nfSAtIFVwZGF0ZWQgc3RyaW5nXFxuQGZ1bmN0aW9uIHN0ci1yZXBsYWNlKCRzdHJpbmcsICRzZWFyY2gsICRyZXBsYWNlOiBcXFwiXFxcIikge1xcbiAgJGluZGV4OiBzdHItaW5kZXgoJHN0cmluZywgJHNlYXJjaCk7XFxuXFxuICBAaWYgJGluZGV4IHtcXG4gICAgQHJldHVybiBzdHItc2xpY2UoJHN0cmluZywgMSwgJGluZGV4IC0gMSkgKyAkcmVwbGFjZSArIHN0ci1yZXBsYWNlKHN0ci1zbGljZSgkc3RyaW5nLCAkaW5kZXggKyBzdHItbGVuZ3RoKCRzZWFyY2gpKSwgJHNlYXJjaCwgJHJlcGxhY2UpO1xcbiAgfVxcblxcbiAgQHJldHVybiAkc3RyaW5nO1xcbn1cXG5cXG4vLyBTZWUgaHR0cHM6Ly9jb2RlcGVuLmlvL2tldmlud2ViZXIvcGVuL2RYV29Sd1xcbi8vXFxuLy8gUmVxdWlyZXMgdGhlIHVzZSBvZiBxdW90ZXMgYXJvdW5kIGRhdGEgVVJJcy5cXG5cXG5AZnVuY3Rpb24gZXNjYXBlLXN2Zygkc3RyaW5nKSB7XFxuICBAaWYgc3RyLWluZGV4KCRzdHJpbmcsIFxcXCJkYXRhOmltYWdlL3N2Zyt4bWxcXFwiKSB7XFxuICAgIEBlYWNoICRjaGFyLCAkZW5jb2RlZCBpbiAkZXNjYXBlZC1jaGFyYWN0ZXJzIHtcXG4gICAgICAvLyBEbyBub3QgZXNjYXBlIHRoZSB1cmwgYnJhY2tldHNcXG4gICAgICBAaWYgc3RyLWluZGV4KCRzdHJpbmcsIFxcXCJ1cmwoXFxcIikgPT0gMSB7XFxuICAgICAgICAkc3RyaW5nOiB1cmwoXFxcIiN7c3RyLXJlcGxhY2Uoc3RyLXNsaWNlKCRzdHJpbmcsIDYsIC0zKSwgJGNoYXIsICRlbmNvZGVkKX1cXFwiKTtcXG4gICAgICB9IEBlbHNlIHtcXG4gICAgICAgICRzdHJpbmc6IHN0ci1yZXBsYWNlKCRzdHJpbmcsICRjaGFyLCAkZW5jb2RlZCk7XFxuICAgICAgfVxcbiAgICB9XFxuICB9XFxuXFxuICBAcmV0dXJuICRzdHJpbmc7XFxufVxcblxcbi8vIENvbG9yIGNvbnRyYXN0XFxuLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9wdWxsLzMwMTY4XFxuXFxuLy8gQSBsaXN0IG9mIHByZS1jYWxjdWxhdGVkIG51bWJlcnMgb2YgcG93KGRpdmlkZSgoZGl2aWRlKCR2YWx1ZSwgMjU1KSArIC4wNTUpLCAxLjA1NSksIDIuNCkuIChmcm9tIDAgdG8gMjU1KVxcbi8vIHN0eWxlbGludC1kaXNhYmxlLW5leHQtbGluZSBzY3NzL2RvbGxhci12YXJpYWJsZS1kZWZhdWx0LCBzY3NzL2RvbGxhci12YXJpYWJsZS1wYXR0ZXJuXFxuJF9sdW1pbmFuY2UtbGlzdDogLjAwMDggLjAwMSAuMDAxMSAuMDAxMyAuMDAxNSAuMDAxNyAuMDAyIC4wMDIyIC4wMDI1IC4wMDI3IC4wMDMgLjAwMzMgLjAwMzcgLjAwNCAuMDA0NCAuMDA0OCAuMDA1MiAuMDA1NiAuMDA2IC4wMDY1IC4wMDcgLjAwNzUgLjAwOCAuMDA4NiAuMDA5MSAuMDA5NyAuMDEwMyAuMDExIC4wMTE2IC4wMTIzIC4wMTMgLjAxMzcgLjAxNDQgLjAxNTIgLjAxNiAuMDE2OCAuMDE3NiAuMDE4NSAuMDE5NCAuMDIwMyAuMDIxMiAuMDIyMiAuMDIzMiAuMDI0MiAuMDI1MiAuMDI2MiAuMDI3MyAuMDI4NCAuMDI5NiAuMDMwNyAuMDMxOSAuMDMzMSAuMDM0MyAuMDM1NiAuMDM2OSAuMDM4MiAuMDM5NSAuMDQwOSAuMDQyMyAuMDQzNyAuMDQ1MiAuMDQ2NyAuMDQ4MiAuMDQ5NyAuMDUxMyAuMDUyOSAuMDU0NSAuMDU2MSAuMDU3OCAuMDU5NSAuMDYxMiAuMDYzIC4wNjQ4IC4wNjY2IC4wNjg1IC4wNzA0IC4wNzIzIC4wNzQyIC4wNzYyIC4wNzgyIC4wODAyIC4wODIzIC4wODQ0IC4wODY1IC4wODg3IC4wOTA4IC4wOTMxIC4wOTUzIC4wOTc2IC4wOTk5IC4xMDIyIC4xMDQ2IC4xMDcgLjEwOTUgLjExMTkgLjExNDQgLjExNyAuMTE5NSAuMTIyMSAuMTI0OCAuMTI3NCAuMTMwMSAuMTMyOSAuMTM1NiAuMTM4NCAuMTQxMyAuMTQ0MSAuMTQ3IC4xNSAuMTUyOSAuMTU1OSAuMTU5IC4xNjIgLjE2NTEgLjE2ODMgLjE3MTQgLjE3NDYgLjE3NzkgLjE4MTIgLjE4NDUgLjE4NzggLjE5MTIgLjE5NDYgLjE5ODEgLjIwMTYgLjIwNTEgLjIwODYgLjIxMjIgLjIxNTkgLjIxOTUgLjIyMzIgLjIyNyAuMjMwNyAuMjM0NiAuMjM4NCAuMjQyMyAuMjQ2MiAuMjUwMiAuMjU0MiAuMjU4MiAuMjYyMyAuMjY2NCAuMjcwNSAuMjc0NyAuMjc4OSAuMjgzMSAuMjg3NCAuMjkxOCAuMjk2MSAuMzAwNSAuMzA1IC4zMDk1IC4zMTQgLjMxODUgLjMyMzEgLjMyNzggLjMzMjUgLjMzNzIgLjM0MTkgLjM0NjcgLjM1MTUgLjM1NjQgLjM2MTMgLjM2NjMgLjM3MTIgLjM3NjMgLjM4MTMgLjM4NjQgLjM5MTYgLjM5NjggLjQwMiAuNDA3MiAuNDEyNSAuNDE3OSAuNDIzMyAuNDI4NyAuNDM0MiAuNDM5NyAuNDQ1MiAuNDUwOCAuNDU2NCAuNDYyMSAuNDY3OCAuNDczNSAuNDc5MyAuNDg1MSAuNDkxIC40OTY5IC41MDI5IC41MDg5IC41MTQ5IC41MjEgLjUyNzEgLjUzMzMgLjUzOTUgLjU0NTcgLjU1MiAuNTU4MyAuNTY0NyAuNTcxMSAuNTc3NiAuNTg0MSAuNTkwNiAuNTk3MiAuNjAzOCAuNjEwNSAuNjE3MiAuNjI0IC42MzA4IC42Mzc2IC42NDQ1IC42NTE0IC42NTg0IC42NjU0IC42NzI0IC42Nzk1IC42ODY3IC42OTM5IC43MDExIC43MDg0IC43MTU3IC43MjMxIC43MzA1IC43Mzc5IC43NDU0IC43NTI5IC43NjA1IC43NjgyIC43NzU4IC43ODM1IC43OTEzIC43OTkxIC44MDcgLjgxNDggLjgyMjggLjgzMDggLjgzODggLjg0NjkgLjg1NSAuODYzMiAuODcxNCAuODc5NiAuODg3OSAuODk2MyAuOTA0NyAuOTEzMSAuOTIxNiAuOTMwMSAuOTM4NyAuOTQ3MyAuOTU2IC45NjQ3IC45NzM0IC45ODIzIC45OTExIDE7XFxuXFxuQGZ1bmN0aW9uIGNvbG9yLWNvbnRyYXN0KCRiYWNrZ3JvdW5kLCAkY29sb3ItY29udHJhc3QtZGFyazogJGNvbG9yLWNvbnRyYXN0LWRhcmssICRjb2xvci1jb250cmFzdC1saWdodDogJGNvbG9yLWNvbnRyYXN0LWxpZ2h0LCAkbWluLWNvbnRyYXN0LXJhdGlvOiAkbWluLWNvbnRyYXN0LXJhdGlvKSB7XFxuICAkZm9yZWdyb3VuZHM6ICRjb2xvci1jb250cmFzdC1saWdodCwgJGNvbG9yLWNvbnRyYXN0LWRhcmssICR3aGl0ZSwgJGJsYWNrO1xcbiAgJG1heC1yYXRpbzogMDtcXG4gICRtYXgtcmF0aW8tY29sb3I6IG51bGw7XFxuXFxuICBAZWFjaCAkY29sb3IgaW4gJGZvcmVncm91bmRzIHtcXG4gICAgJGNvbnRyYXN0LXJhdGlvOiBjb250cmFzdC1yYXRpbygkYmFja2dyb3VuZCwgJGNvbG9yKTtcXG4gICAgQGlmICRjb250cmFzdC1yYXRpbyA+ICRtaW4tY29udHJhc3QtcmF0aW8ge1xcbiAgICAgIEByZXR1cm4gJGNvbG9yO1xcbiAgICB9IEBlbHNlIGlmICRjb250cmFzdC1yYXRpbyA+ICRtYXgtcmF0aW8ge1xcbiAgICAgICRtYXgtcmF0aW86ICRjb250cmFzdC1yYXRpbztcXG4gICAgICAkbWF4LXJhdGlvLWNvbG9yOiAkY29sb3I7XFxuICAgIH1cXG4gIH1cXG5cXG4gIEB3YXJuIFxcXCJGb3VuZCBubyBjb2xvciBsZWFkaW5nIHRvICN7JG1pbi1jb250cmFzdC1yYXRpb306MSBjb250cmFzdCByYXRpbyBhZ2FpbnN0ICN7JGJhY2tncm91bmR9Li4uXFxcIjtcXG5cXG4gIEByZXR1cm4gJG1heC1yYXRpby1jb2xvcjtcXG59XFxuXFxuQGZ1bmN0aW9uIGNvbnRyYXN0LXJhdGlvKCRiYWNrZ3JvdW5kLCAkZm9yZWdyb3VuZDogJGNvbG9yLWNvbnRyYXN0LWxpZ2h0KSB7XFxuICAkbDE6IGx1bWluYW5jZSgkYmFja2dyb3VuZCk7XFxuICAkbDI6IGx1bWluYW5jZShvcGFxdWUoJGJhY2tncm91bmQsICRmb3JlZ3JvdW5kKSk7XFxuXFxuICBAcmV0dXJuIGlmKCRsMSA+ICRsMiwgZGl2aWRlKCRsMSArIC4wNSwgJGwyICsgLjA1KSwgZGl2aWRlKCRsMiArIC4wNSwgJGwxICsgLjA1KSk7XFxufVxcblxcbi8vIFJldHVybiBXQ0FHMi4xIHJlbGF0aXZlIGx1bWluYW5jZVxcbi8vIFNlZSBodHRwczovL3d3dy53My5vcmcvVFIvV0NBRy8jZGZuLXJlbGF0aXZlLWx1bWluYW5jZVxcbi8vIFNlZSBodHRwczovL3d3dy53My5vcmcvVFIvV0NBRy8jZGZuLWNvbnRyYXN0LXJhdGlvXFxuQGZ1bmN0aW9uIGx1bWluYW5jZSgkY29sb3IpIHtcXG4gICRyZ2I6IChcXG4gICAgXFxcInJcXFwiOiByZWQoJGNvbG9yKSxcXG4gICAgXFxcImdcXFwiOiBncmVlbigkY29sb3IpLFxcbiAgICBcXFwiYlxcXCI6IGJsdWUoJGNvbG9yKVxcbiAgKTtcXG5cXG4gIEBlYWNoICRuYW1lLCAkdmFsdWUgaW4gJHJnYiB7XFxuICAgICR2YWx1ZTogaWYoZGl2aWRlKCR2YWx1ZSwgMjU1KSA8IC4wNDA0NSwgZGl2aWRlKGRpdmlkZSgkdmFsdWUsIDI1NSksIDEyLjkyKSwgbnRoKCRfbHVtaW5hbmNlLWxpc3QsICR2YWx1ZSArIDEpKTtcXG4gICAgJHJnYjogbWFwLW1lcmdlKCRyZ2IsICgkbmFtZTogJHZhbHVlKSk7XFxuICB9XFxuXFxuICBAcmV0dXJuIChtYXAtZ2V0KCRyZ2IsIFxcXCJyXFxcIikgKiAuMjEyNikgKyAobWFwLWdldCgkcmdiLCBcXFwiZ1xcXCIpICogLjcxNTIpICsgKG1hcC1nZXQoJHJnYiwgXFxcImJcXFwiKSAqIC4wNzIyKTtcXG59XFxuXFxuLy8gUmV0dXJuIG9wYXF1ZSBjb2xvclxcbi8vIG9wYXF1ZSgjZmZmLCByZ2JhKDAsIDAsIDAsIC41KSkgPT4gIzgwODA4MFxcbkBmdW5jdGlvbiBvcGFxdWUoJGJhY2tncm91bmQsICRmb3JlZ3JvdW5kKSB7XFxuICBAcmV0dXJuIG1peChyZ2JhKCRmb3JlZ3JvdW5kLCAxKSwgJGJhY2tncm91bmQsIG9wYWNpdHkoJGZvcmVncm91bmQpICogMTAwJSk7XFxufVxcblxcbi8vIHNjc3MtZG9jcy1zdGFydCBjb2xvci1mdW5jdGlvbnNcXG4vLyBUaW50IGEgY29sb3I6IG1peCBhIGNvbG9yIHdpdGggd2hpdGVcXG5AZnVuY3Rpb24gdGludC1jb2xvcigkY29sb3IsICR3ZWlnaHQpIHtcXG4gIEByZXR1cm4gbWl4KHdoaXRlLCAkY29sb3IsICR3ZWlnaHQpO1xcbn1cXG5cXG4vLyBTaGFkZSBhIGNvbG9yOiBtaXggYSBjb2xvciB3aXRoIGJsYWNrXFxuQGZ1bmN0aW9uIHNoYWRlLWNvbG9yKCRjb2xvciwgJHdlaWdodCkge1xcbiAgQHJldHVybiBtaXgoYmxhY2ssICRjb2xvciwgJHdlaWdodCk7XFxufVxcblxcbi8vIFNoYWRlIHRoZSBjb2xvciBpZiB0aGUgd2VpZ2h0IGlzIHBvc2l0aXZlLCBlbHNlIHRpbnQgaXRcXG5AZnVuY3Rpb24gc2hpZnQtY29sb3IoJGNvbG9yLCAkd2VpZ2h0KSB7XFxuICBAcmV0dXJuIGlmKCR3ZWlnaHQgPiAwLCBzaGFkZS1jb2xvcigkY29sb3IsICR3ZWlnaHQpLCB0aW50LWNvbG9yKCRjb2xvciwgLSR3ZWlnaHQpKTtcXG59XFxuLy8gc2Nzcy1kb2NzLWVuZCBjb2xvci1mdW5jdGlvbnNcXG5cXG4vLyBSZXR1cm4gdmFsaWQgY2FsY1xcbkBmdW5jdGlvbiBhZGQoJHZhbHVlMSwgJHZhbHVlMiwgJHJldHVybi1jYWxjOiB0cnVlKSB7XFxuICBAaWYgJHZhbHVlMSA9PSBudWxsIHtcXG4gICAgQHJldHVybiAkdmFsdWUyO1xcbiAgfVxcblxcbiAgQGlmICR2YWx1ZTIgPT0gbnVsbCB7XFxuICAgIEByZXR1cm4gJHZhbHVlMTtcXG4gIH1cXG5cXG4gIEBpZiB0eXBlLW9mKCR2YWx1ZTEpID09IG51bWJlciBhbmQgdHlwZS1vZigkdmFsdWUyKSA9PSBudW1iZXIgYW5kIGNvbXBhcmFibGUoJHZhbHVlMSwgJHZhbHVlMikge1xcbiAgICBAcmV0dXJuICR2YWx1ZTEgKyAkdmFsdWUyO1xcbiAgfVxcblxcbiAgQHJldHVybiBpZigkcmV0dXJuLWNhbGMgPT0gdHJ1ZSwgY2FsYygjeyR2YWx1ZTF9ICsgI3skdmFsdWUyfSksICR2YWx1ZTEgKyB1bnF1b3RlKFxcXCIgKyBcXFwiKSArICR2YWx1ZTIpO1xcbn1cXG5cXG5AZnVuY3Rpb24gc3VidHJhY3QoJHZhbHVlMSwgJHZhbHVlMiwgJHJldHVybi1jYWxjOiB0cnVlKSB7XFxuICBAaWYgJHZhbHVlMSA9PSBudWxsIGFuZCAkdmFsdWUyID09IG51bGwge1xcbiAgICBAcmV0dXJuIG51bGw7XFxuICB9XFxuXFxuICBAaWYgJHZhbHVlMSA9PSBudWxsIHtcXG4gICAgQHJldHVybiAtJHZhbHVlMjtcXG4gIH1cXG5cXG4gIEBpZiAkdmFsdWUyID09IG51bGwge1xcbiAgICBAcmV0dXJuICR2YWx1ZTE7XFxuICB9XFxuXFxuICBAaWYgdHlwZS1vZigkdmFsdWUxKSA9PSBudW1iZXIgYW5kIHR5cGUtb2YoJHZhbHVlMikgPT0gbnVtYmVyIGFuZCBjb21wYXJhYmxlKCR2YWx1ZTEsICR2YWx1ZTIpIHtcXG4gICAgQHJldHVybiAkdmFsdWUxIC0gJHZhbHVlMjtcXG4gIH1cXG5cXG4gIEBpZiB0eXBlLW9mKCR2YWx1ZTIpICE9IG51bWJlciB7XFxuICAgICR2YWx1ZTI6IHVucXVvdGUoXFxcIihcXFwiKSArICR2YWx1ZTIgKyB1bnF1b3RlKFxcXCIpXFxcIik7XFxuICB9XFxuXFxuICBAcmV0dXJuIGlmKCRyZXR1cm4tY2FsYyA9PSB0cnVlLCBjYWxjKCN7JHZhbHVlMX0gLSAjeyR2YWx1ZTJ9KSwgJHZhbHVlMSArIHVucXVvdGUoXFxcIiAtIFxcXCIpICsgJHZhbHVlMik7XFxufVxcblxcbkBmdW5jdGlvbiBkaXZpZGUoJGRpdmlkZW5kLCAkZGl2aXNvciwgJHByZWNpc2lvbjogMTApIHtcXG4gICRzaWduOiBpZigkZGl2aWRlbmQgPiAwIGFuZCAkZGl2aXNvciA+IDAgb3IgJGRpdmlkZW5kIDwgMCBhbmQgJGRpdmlzb3IgPCAwLCAxLCAtMSk7XFxuICAkZGl2aWRlbmQ6IGFicygkZGl2aWRlbmQpO1xcbiAgJGRpdmlzb3I6IGFicygkZGl2aXNvcik7XFxuICBAaWYgJGRpdmlkZW5kID09IDAge1xcbiAgICBAcmV0dXJuIDA7XFxuICB9XFxuICBAaWYgJGRpdmlzb3IgPT0gMCB7XFxuICAgIEBlcnJvciBcXFwiQ2Fubm90IGRpdmlkZSBieSAwXFxcIjtcXG4gIH1cXG4gICRyZW1haW5kZXI6ICRkaXZpZGVuZDtcXG4gICRyZXN1bHQ6IDA7XFxuICAkZmFjdG9yOiAxMDtcXG4gIEB3aGlsZSAoJHJlbWFpbmRlciA+IDAgYW5kICRwcmVjaXNpb24gPj0gMCkge1xcbiAgICAkcXVvdGllbnQ6IDA7XFxuICAgIEB3aGlsZSAoJHJlbWFpbmRlciA+PSAkZGl2aXNvcikge1xcbiAgICAgICRyZW1haW5kZXI6ICRyZW1haW5kZXIgLSAkZGl2aXNvcjtcXG4gICAgICAkcXVvdGllbnQ6ICRxdW90aWVudCArIDE7XFxuICAgIH1cXG4gICAgJHJlc3VsdDogJHJlc3VsdCAqIDEwICsgJHF1b3RpZW50O1xcbiAgICAkZmFjdG9yOiAkZmFjdG9yICogLjE7XFxuICAgICRyZW1haW5kZXI6ICRyZW1haW5kZXIgKiAxMDtcXG4gICAgJHByZWNpc2lvbjogJHByZWNpc2lvbiAtIDE7XFxuICAgIEBpZiAoJHByZWNpc2lvbiA8IDAgYW5kICRyZW1haW5kZXIgPj0gJGRpdmlzb3IgKiA1KSB7XFxuICAgICAgJHJlc3VsdDogJHJlc3VsdCArIDE7XFxuICAgIH1cXG4gIH1cXG4gICRyZXN1bHQ6ICRyZXN1bHQgKiAkZmFjdG9yICogJHNpZ247XFxuICAkZGl2aWRlbmQtdW5pdDogdW5pdCgkZGl2aWRlbmQpO1xcbiAgJGRpdmlzb3ItdW5pdDogdW5pdCgkZGl2aXNvcik7XFxuICAkdW5pdC1tYXA6IChcXG4gICAgXFxcInB4XFxcIjogMXB4LFxcbiAgICBcXFwicmVtXFxcIjogMXJlbSxcXG4gICAgXFxcImVtXFxcIjogMWVtLFxcbiAgICBcXFwiJVxcXCI6IDElXFxuICApO1xcbiAgQGlmICgkZGl2aWRlbmQtdW5pdCAhPSAkZGl2aXNvci11bml0IGFuZCBtYXAtaGFzLWtleSgkdW5pdC1tYXAsICRkaXZpZGVuZC11bml0KSkge1xcbiAgICAkcmVzdWx0OiAkcmVzdWx0ICogbWFwLWdldCgkdW5pdC1tYXAsICRkaXZpZGVuZC11bml0KTtcXG4gIH1cXG4gIEByZXR1cm4gJHJlc3VsdDtcXG59XFxuXCIsXCIvL1xcbi8vIEZvcm0gdGV4dFxcbi8vXFxuXFxuLmZvcm0tdGV4dCB7XFxuICBtYXJnaW4tdG9wOiAkZm9ybS10ZXh0LW1hcmdpbi10b3A7XFxuICBAaW5jbHVkZSBmb250LXNpemUoJGZvcm0tdGV4dC1mb250LXNpemUpO1xcbiAgZm9udC1zdHlsZTogJGZvcm0tdGV4dC1mb250LXN0eWxlO1xcbiAgZm9udC13ZWlnaHQ6ICRmb3JtLXRleHQtZm9udC13ZWlnaHQ7XFxuICBjb2xvcjogJGZvcm0tdGV4dC1jb2xvcjtcXG59XFxuXCIsXCIvL1xcbi8vIEdlbmVyYWwgZm9ybSBjb250cm9scyAocGx1cyBhIGZldyBzcGVjaWZpYyBoaWdoLWxldmVsIGludGVydmVudGlvbnMpXFxuLy9cXG5cXG4uZm9ybS1jb250cm9sIHtcXG4gIGRpc3BsYXk6IGJsb2NrO1xcbiAgd2lkdGg6IDEwMCU7XFxuICBwYWRkaW5nOiAkaW5wdXQtcGFkZGluZy15ICRpbnB1dC1wYWRkaW5nLXg7XFxuICBmb250LWZhbWlseTogJGlucHV0LWZvbnQtZmFtaWx5O1xcbiAgQGluY2x1ZGUgZm9udC1zaXplKCRpbnB1dC1mb250LXNpemUpO1xcbiAgZm9udC13ZWlnaHQ6ICRpbnB1dC1mb250LXdlaWdodDtcXG4gIGxpbmUtaGVpZ2h0OiAkaW5wdXQtbGluZS1oZWlnaHQ7XFxuICBjb2xvcjogJGlucHV0LWNvbG9yO1xcbiAgYXBwZWFyYW5jZTogbm9uZTsgLy8gRml4IGFwcGVhcmFuY2UgZm9yIGRhdGUgaW5wdXRzIGluIFNhZmFyaVxcbiAgYmFja2dyb3VuZC1jb2xvcjogJGlucHV0LWJnO1xcbiAgYmFja2dyb3VuZC1jbGlwOiBwYWRkaW5nLWJveDtcXG4gIGJvcmRlcjogJGlucHV0LWJvcmRlci13aWR0aCBzb2xpZCAkaW5wdXQtYm9yZGVyLWNvbG9yO1xcblxcbiAgLy8gTm90ZTogVGhpcyBoYXMgbm8gZWZmZWN0IG9uIDxzZWxlY3Q+cyBpbiBzb21lIGJyb3dzZXJzLCBkdWUgdG8gdGhlIGxpbWl0ZWQgc3R5bGFiaWxpdHkgb2YgYDxzZWxlY3Q+YHMgaW4gQ1NTLlxcbiAgQGluY2x1ZGUgYm9yZGVyLXJhZGl1cygkaW5wdXQtYm9yZGVyLXJhZGl1cywgMCk7XFxuXFxuICBAaW5jbHVkZSBib3gtc2hhZG93KCRpbnB1dC1ib3gtc2hhZG93KTtcXG4gIEBpbmNsdWRlIHRyYW5zaXRpb24oJGlucHV0LXRyYW5zaXRpb24pO1xcblxcbiAgJlt0eXBlPVxcXCJmaWxlXFxcIl0ge1xcbiAgICBvdmVyZmxvdzogaGlkZGVuOyAvLyBwcmV2ZW50IHBzZXVkbyBlbGVtZW50IGJ1dHRvbiBvdmVybGFwXFxuXFxuICAgICY6bm90KDpkaXNhYmxlZCk6bm90KFtyZWFkb25seV0pIHtcXG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XFxuICAgIH1cXG4gIH1cXG5cXG4gIC8vIEN1c3RvbWl6ZSB0aGUgYDpmb2N1c2Agc3RhdGUgdG8gaW1pdGF0ZSBuYXRpdmUgV2ViS2l0IHN0eWxlcy5cXG4gICY6Zm9jdXMge1xcbiAgICBjb2xvcjogJGlucHV0LWZvY3VzLWNvbG9yO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkaW5wdXQtZm9jdXMtYmc7XFxuICAgIGJvcmRlci1jb2xvcjogJGlucHV0LWZvY3VzLWJvcmRlci1jb2xvcjtcXG4gICAgb3V0bGluZTogMDtcXG4gICAgQGlmICRlbmFibGUtc2hhZG93cyB7XFxuICAgICAgQGluY2x1ZGUgYm94LXNoYWRvdygkaW5wdXQtYm94LXNoYWRvdywgJGlucHV0LWZvY3VzLWJveC1zaGFkb3cpO1xcbiAgICB9IEBlbHNlIHtcXG4gICAgICAvLyBBdm9pZCB1c2luZyBtaXhpbiBzbyB3ZSBjYW4gcGFzcyBjdXN0b20gZm9jdXMgc2hhZG93IHByb3Blcmx5XFxuICAgICAgYm94LXNoYWRvdzogJGlucHV0LWZvY3VzLWJveC1zaGFkb3c7XFxuICAgIH1cXG4gIH1cXG5cXG4gICY6Oi13ZWJraXQtZGF0ZS1hbmQtdGltZS12YWx1ZSB7XFxuICAgIC8vIE9uIEFuZHJvaWQgQ2hyb21lLCBmb3JtLWNvbnRyb2wncyBcXFwid2lkdGg6IDEwMCVcXFwiIG1ha2VzIHRoZSBpbnB1dCB3aWR0aCB0b28gc21hbGxcXG4gICAgLy8gVGVzdGVkIHVuZGVyIEFuZHJvaWQgMTEgLyBDaHJvbWUgODksIEFuZHJvaWQgMTIgLyBDaHJvbWUgMTAwLCBBbmRyb2lkIDEzIC8gQ2hyb21lIDEwOVxcbiAgICAvL1xcbiAgICAvLyBPbiBpT1MgU2FmYXJpLCBmb3JtLWNvbnRyb2wncyBcXFwiYXBwZWFyYW5jZTogbm9uZVxcXCIgKyBcXFwid2lkdGg6IDEwMCVcXFwiIG1ha2VzIHRoZSBpbnB1dCB3aWR0aCB0b28gc21hbGxcXG4gICAgLy8gVGVzdGVkIHVuZGVyIGlPUyAxNi4yIC8gU2FmYXJpIDE2LjJcXG4gICAgbWluLXdpZHRoOiA4NXB4OyAvLyBTZWVtcyB0byBiZSBhIGdvb2QgbWluaW11bSBzYWZlIHdpZHRoXFxuXFxuICAgIC8vIEFkZCBzb21lIGhlaWdodCB0byBkYXRlIGlucHV0cyBvbiBpT1NcXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2lzc3Vlcy8yMzMwN1xcbiAgICAvLyBUT0RPOiB3ZSBjYW4gcmVtb3ZlIHRoaXMgd29ya2Fyb3VuZCBvbmNlIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xOTg5NTkgaXMgcmVzb2x2ZWRcXG4gICAgLy8gTXVsdGlwbHkgbGluZS1oZWlnaHQgYnkgMWVtIGlmIGl0IGhhcyBubyB1bml0XFxuICAgIGhlaWdodDogaWYodW5pdCgkaW5wdXQtbGluZS1oZWlnaHQpID09IFxcXCJcXFwiLCAkaW5wdXQtbGluZS1oZWlnaHQgKiAxZW0sICRpbnB1dC1saW5lLWhlaWdodCk7XFxuXFxuICAgIC8vIEFuZHJvaWQgQ2hyb21lIHR5cGU9XFxcImRhdGVcXFwiIGlzIHRhbGxlciB0aGFuIHRoZSBvdGhlciBpbnB1dHNcXG4gICAgLy8gYmVjYXVzZSBvZiBcXFwibWFyZ2luOiAxcHggMjRweCAxcHggNHB4XFxcIiBpbnNpZGUgdGhlIHNoYWRvdyBET01cXG4gICAgLy8gVGVzdGVkIHVuZGVyIEFuZHJvaWQgMTEgLyBDaHJvbWUgODksIEFuZHJvaWQgMTIgLyBDaHJvbWUgMTAwLCBBbmRyb2lkIDEzIC8gQ2hyb21lIDEwOVxcbiAgICBtYXJnaW46IDA7XFxuICB9XFxuXFxuICAvLyBQcmV2ZW50IGV4Y2Vzc2l2ZSBkYXRlIGlucHV0IGhlaWdodCBpbiBXZWJraXRcXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9pc3N1ZXMvMzQ0MzNcXG4gICY6Oi13ZWJraXQtZGF0ZXRpbWUtZWRpdCB7XFxuICAgIGRpc3BsYXk6IGJsb2NrO1xcbiAgICBwYWRkaW5nOiAwO1xcbiAgfVxcblxcbiAgLy8gUGxhY2Vob2xkZXJcXG4gICY6OnBsYWNlaG9sZGVyIHtcXG4gICAgY29sb3I6ICRpbnB1dC1wbGFjZWhvbGRlci1jb2xvcjtcXG4gICAgLy8gT3ZlcnJpZGUgRmlyZWZveCdzIHVudXN1YWwgZGVmYXVsdCBvcGFjaXR5OyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL3B1bGwvMTE1MjYuXFxuICAgIG9wYWNpdHk6IDE7XFxuICB9XFxuXFxuICAvLyBEaXNhYmxlZCBpbnB1dHNcXG4gIC8vXFxuICAvLyBIVE1MNSBzYXlzIHRoYXQgY29udHJvbHMgdW5kZXIgYSBmaWVsZHNldCA+IGxlZ2VuZDpmaXJzdC1jaGlsZCB3b24ndCBiZVxcbiAgLy8gZGlzYWJsZWQgaWYgdGhlIGZpZWxkc2V0IGlzIGRpc2FibGVkLiBEdWUgdG8gaW1wbGVtZW50YXRpb24gZGlmZmljdWx0eSwgd2VcXG4gIC8vIGRvbid0IGhvbm9yIHRoYXQgZWRnZSBjYXNlOyB3ZSBzdHlsZSB0aGVtIGFzIGRpc2FibGVkIGFueXdheS5cXG4gICY6ZGlzYWJsZWQge1xcbiAgICBjb2xvcjogJGlucHV0LWRpc2FibGVkLWNvbG9yO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkaW5wdXQtZGlzYWJsZWQtYmc7XFxuICAgIGJvcmRlci1jb2xvcjogJGlucHV0LWRpc2FibGVkLWJvcmRlci1jb2xvcjtcXG4gICAgLy8gaU9TIGZpeCBmb3IgdW5yZWFkYWJsZSBkaXNhYmxlZCBjb250ZW50OyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2lzc3Vlcy8xMTY1NS5cXG4gICAgb3BhY2l0eTogMTtcXG4gIH1cXG5cXG4gIC8vIEZpbGUgaW5wdXQgYnV0dG9ucyB0aGVtaW5nXFxuICAmOjpmaWxlLXNlbGVjdG9yLWJ1dHRvbiB7XFxuICAgIHBhZGRpbmc6ICRpbnB1dC1wYWRkaW5nLXkgJGlucHV0LXBhZGRpbmcteDtcXG4gICAgbWFyZ2luOiAoLSRpbnB1dC1wYWRkaW5nLXkpICgtJGlucHV0LXBhZGRpbmcteCk7XFxuICAgIG1hcmdpbi1pbmxpbmUtZW5kOiAkaW5wdXQtcGFkZGluZy14O1xcbiAgICBjb2xvcjogJGZvcm0tZmlsZS1idXR0b24tY29sb3I7XFxuICAgIEBpbmNsdWRlIGdyYWRpZW50LWJnKCRmb3JtLWZpbGUtYnV0dG9uLWJnKTtcXG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxuICAgIGJvcmRlci1jb2xvcjogaW5oZXJpdDtcXG4gICAgYm9yZGVyLXN0eWxlOiBzb2xpZDtcXG4gICAgYm9yZGVyLXdpZHRoOiAwO1xcbiAgICBib3JkZXItaW5saW5lLWVuZC13aWR0aDogJGlucHV0LWJvcmRlci13aWR0aDtcXG4gICAgYm9yZGVyLXJhZGl1czogMDsgLy8gc3R5bGVsaW50LWRpc2FibGUtbGluZSBwcm9wZXJ0eS1kaXNhbGxvd2VkLWxpc3RcXG4gICAgQGluY2x1ZGUgdHJhbnNpdGlvbigkYnRuLXRyYW5zaXRpb24pO1xcbiAgfVxcblxcbiAgJjpob3Zlcjpub3QoOmRpc2FibGVkKTpub3QoW3JlYWRvbmx5XSk6OmZpbGUtc2VsZWN0b3ItYnV0dG9uIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogJGZvcm0tZmlsZS1idXR0b24taG92ZXItYmc7XFxuICB9XFxufVxcblxcbi8vIFJlYWRvbmx5IGNvbnRyb2xzIGFzIHBsYWluIHRleHRcXG4vL1xcbi8vIEFwcGx5IGNsYXNzIHRvIGEgcmVhZG9ubHkgaW5wdXQgdG8gbWFrZSBpdCBhcHBlYXIgbGlrZSByZWd1bGFyIHBsYWluXFxuLy8gdGV4dCAod2l0aG91dCBhbnkgYm9yZGVyLCBiYWNrZ3JvdW5kIGNvbG9yLCBmb2N1cyBpbmRpY2F0b3IpXFxuXFxuLmZvcm0tY29udHJvbC1wbGFpbnRleHQge1xcbiAgZGlzcGxheTogYmxvY2s7XFxuICB3aWR0aDogMTAwJTtcXG4gIHBhZGRpbmc6ICRpbnB1dC1wYWRkaW5nLXkgMDtcXG4gIG1hcmdpbi1ib3R0b206IDA7IC8vIG1hdGNoIGlucHV0cyBpZiB0aGlzIGNsYXNzIGNvbWVzIG9uIGlucHV0cyB3aXRoIGRlZmF1bHQgbWFyZ2luc1xcbiAgbGluZS1oZWlnaHQ6ICRpbnB1dC1saW5lLWhlaWdodDtcXG4gIGNvbG9yOiAkaW5wdXQtcGxhaW50ZXh0LWNvbG9yO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XFxuICBib3JkZXI6IHNvbGlkIHRyYW5zcGFyZW50O1xcbiAgYm9yZGVyLXdpZHRoOiAkaW5wdXQtYm9yZGVyLXdpZHRoIDA7XFxuXFxuICAmOmZvY3VzIHtcXG4gICAgb3V0bGluZTogMDtcXG4gIH1cXG5cXG4gICYuZm9ybS1jb250cm9sLXNtLFxcbiAgJi5mb3JtLWNvbnRyb2wtbGcge1xcbiAgICBwYWRkaW5nLXJpZ2h0OiAwO1xcbiAgICBwYWRkaW5nLWxlZnQ6IDA7XFxuICB9XFxufVxcblxcbi8vIEZvcm0gY29udHJvbCBzaXppbmdcXG4vL1xcbi8vIEJ1aWxkIG9uIGAuZm9ybS1jb250cm9sYCB3aXRoIG1vZGlmaWVyIGNsYXNzZXMgdG8gZGVjcmVhc2Ugb3IgaW5jcmVhc2UgdGhlXFxuLy8gaGVpZ2h0IGFuZCBmb250LXNpemUgb2YgZm9ybSBjb250cm9scy5cXG4vL1xcbi8vIFJlcGVhdGVkIGluIGBfaW5wdXRfZ3JvdXAuc2Nzc2AgdG8gYXZvaWQgU2FzcyBleHRlbmQgaXNzdWVzLlxcblxcbi5mb3JtLWNvbnRyb2wtc20ge1xcbiAgbWluLWhlaWdodDogJGlucHV0LWhlaWdodC1zbTtcXG4gIHBhZGRpbmc6ICRpbnB1dC1wYWRkaW5nLXktc20gJGlucHV0LXBhZGRpbmcteC1zbTtcXG4gIEBpbmNsdWRlIGZvbnQtc2l6ZSgkaW5wdXQtZm9udC1zaXplLXNtKTtcXG4gIEBpbmNsdWRlIGJvcmRlci1yYWRpdXMoJGlucHV0LWJvcmRlci1yYWRpdXMtc20pO1xcblxcbiAgJjo6ZmlsZS1zZWxlY3Rvci1idXR0b24ge1xcbiAgICBwYWRkaW5nOiAkaW5wdXQtcGFkZGluZy15LXNtICRpbnB1dC1wYWRkaW5nLXgtc207XFxuICAgIG1hcmdpbjogKC0kaW5wdXQtcGFkZGluZy15LXNtKSAoLSRpbnB1dC1wYWRkaW5nLXgtc20pO1xcbiAgICBtYXJnaW4taW5saW5lLWVuZDogJGlucHV0LXBhZGRpbmcteC1zbTtcXG4gIH1cXG59XFxuXFxuLmZvcm0tY29udHJvbC1sZyB7XFxuICBtaW4taGVpZ2h0OiAkaW5wdXQtaGVpZ2h0LWxnO1xcbiAgcGFkZGluZzogJGlucHV0LXBhZGRpbmcteS1sZyAkaW5wdXQtcGFkZGluZy14LWxnO1xcbiAgQGluY2x1ZGUgZm9udC1zaXplKCRpbnB1dC1mb250LXNpemUtbGcpO1xcbiAgQGluY2x1ZGUgYm9yZGVyLXJhZGl1cygkaW5wdXQtYm9yZGVyLXJhZGl1cy1sZyk7XFxuXFxuICAmOjpmaWxlLXNlbGVjdG9yLWJ1dHRvbiB7XFxuICAgIHBhZGRpbmc6ICRpbnB1dC1wYWRkaW5nLXktbGcgJGlucHV0LXBhZGRpbmcteC1sZztcXG4gICAgbWFyZ2luOiAoLSRpbnB1dC1wYWRkaW5nLXktbGcpICgtJGlucHV0LXBhZGRpbmcteC1sZyk7XFxuICAgIG1hcmdpbi1pbmxpbmUtZW5kOiAkaW5wdXQtcGFkZGluZy14LWxnO1xcbiAgfVxcbn1cXG5cXG4vLyBNYWtlIHN1cmUgdGV4dGFyZWFzIGRvbid0IHNocmluayB0b28gbXVjaCB3aGVuIHJlc2l6ZWRcXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvcHVsbC8yOTEyNFxcbi8vIHN0eWxlbGludC1kaXNhYmxlIHNlbGVjdG9yLW5vLXF1YWxpZnlpbmctdHlwZVxcbnRleHRhcmVhIHtcXG4gICYuZm9ybS1jb250cm9sIHtcXG4gICAgbWluLWhlaWdodDogJGlucHV0LWhlaWdodDtcXG4gIH1cXG5cXG4gICYuZm9ybS1jb250cm9sLXNtIHtcXG4gICAgbWluLWhlaWdodDogJGlucHV0LWhlaWdodC1zbTtcXG4gIH1cXG5cXG4gICYuZm9ybS1jb250cm9sLWxnIHtcXG4gICAgbWluLWhlaWdodDogJGlucHV0LWhlaWdodC1sZztcXG4gIH1cXG59XFxuLy8gc3R5bGVsaW50LWVuYWJsZSBzZWxlY3Rvci1uby1xdWFsaWZ5aW5nLXR5cGVcXG5cXG4uZm9ybS1jb250cm9sLWNvbG9yIHtcXG4gIHdpZHRoOiAkZm9ybS1jb2xvci13aWR0aDtcXG4gIGhlaWdodDogJGlucHV0LWhlaWdodDtcXG4gIHBhZGRpbmc6ICRpbnB1dC1wYWRkaW5nLXk7XFxuXFxuICAmOm5vdCg6ZGlzYWJsZWQpOm5vdChbcmVhZG9ubHldKSB7XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG4gIH1cXG5cXG4gICY6Oi1tb3otY29sb3Itc3dhdGNoIHtcXG4gICAgYm9yZGVyOiAwICFpbXBvcnRhbnQ7IC8vIHN0eWxlbGludC1kaXNhYmxlLWxpbmUgZGVjbGFyYXRpb24tbm8taW1wb3J0YW50XFxuICAgIEBpbmNsdWRlIGJvcmRlci1yYWRpdXMoJGlucHV0LWJvcmRlci1yYWRpdXMpO1xcbiAgfVxcblxcbiAgJjo6LXdlYmtpdC1jb2xvci1zd2F0Y2gge1xcbiAgICBib3JkZXI6IDAgIWltcG9ydGFudDsgLy8gc3R5bGVsaW50LWRpc2FibGUtbGluZSBkZWNsYXJhdGlvbi1uby1pbXBvcnRhbnRcXG4gICAgQGluY2x1ZGUgYm9yZGVyLXJhZGl1cygkaW5wdXQtYm9yZGVyLXJhZGl1cyk7XFxuICB9XFxuXFxuICAmLmZvcm0tY29udHJvbC1zbSB7IGhlaWdodDogJGlucHV0LWhlaWdodC1zbTsgfVxcbiAgJi5mb3JtLWNvbnRyb2wtbGcgeyBoZWlnaHQ6ICRpbnB1dC1oZWlnaHQtbGc7IH1cXG59XFxuXCIsXCIvLyBzdHlsZWxpbnQtZGlzYWJsZSBwcm9wZXJ0eS1kaXNhbGxvd2VkLWxpc3RcXG5AbWl4aW4gdHJhbnNpdGlvbigkdHJhbnNpdGlvbi4uLikge1xcbiAgQGlmIGxlbmd0aCgkdHJhbnNpdGlvbikgPT0gMCB7XFxuICAgICR0cmFuc2l0aW9uOiAkdHJhbnNpdGlvbi1iYXNlO1xcbiAgfVxcblxcbiAgQGlmIGxlbmd0aCgkdHJhbnNpdGlvbikgPiAxIHtcXG4gICAgQGVhY2ggJHZhbHVlIGluICR0cmFuc2l0aW9uIHtcXG4gICAgICBAaWYgJHZhbHVlID09IG51bGwgb3IgJHZhbHVlID09IG5vbmUge1xcbiAgICAgICAgQHdhcm4gXFxcIlRoZSBrZXl3b3JkICdub25lJyBvciAnbnVsbCcgbXVzdCBiZSB1c2VkIGFzIGEgc2luZ2xlIGFyZ3VtZW50LlxcXCI7XFxuICAgICAgfVxcbiAgICB9XFxuICB9XFxuXFxuICBAaWYgJGVuYWJsZS10cmFuc2l0aW9ucyB7XFxuICAgIEBpZiBudGgoJHRyYW5zaXRpb24sIDEpICE9IG51bGwge1xcbiAgICAgIHRyYW5zaXRpb246ICR0cmFuc2l0aW9uO1xcbiAgICB9XFxuXFxuICAgIEBpZiAkZW5hYmxlLXJlZHVjZWQtbW90aW9uIGFuZCBudGgoJHRyYW5zaXRpb24sIDEpICE9IG51bGwgYW5kIG50aCgkdHJhbnNpdGlvbiwgMSkgIT0gbm9uZSB7XFxuICAgICAgQG1lZGlhIChwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2UpIHtcXG4gICAgICAgIHRyYW5zaXRpb246IG5vbmU7XFxuICAgICAgfVxcbiAgICB9XFxuICB9XFxufVxcblwiLFwiLy8gR3JhZGllbnRzXFxuXFxuLy8gc2Nzcy1kb2NzLXN0YXJ0IGdyYWRpZW50LWJnLW1peGluXFxuQG1peGluIGdyYWRpZW50LWJnKCRjb2xvcjogbnVsbCkge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogJGNvbG9yO1xcblxcbiAgQGlmICRlbmFibGUtZ3JhZGllbnRzIHtcXG4gICAgYmFja2dyb3VuZC1pbWFnZTogdmFyKC0tI3skcHJlZml4fWdyYWRpZW50KTtcXG4gIH1cXG59XFxuLy8gc2Nzcy1kb2NzLWVuZCBncmFkaWVudC1iZy1taXhpblxcblxcbi8vIHNjc3MtZG9jcy1zdGFydCBncmFkaWVudC1taXhpbnNcXG4vLyBIb3Jpem9udGFsIGdyYWRpZW50LCBmcm9tIGxlZnQgdG8gcmlnaHRcXG4vL1xcbi8vIENyZWF0ZXMgdHdvIGNvbG9yIHN0b3BzLCBzdGFydCBhbmQgZW5kLCBieSBzcGVjaWZ5aW5nIGEgY29sb3IgYW5kIHBvc2l0aW9uIGZvciBlYWNoIGNvbG9yIHN0b3AuXFxuQG1peGluIGdyYWRpZW50LXgoJHN0YXJ0LWNvbG9yOiAkZ3JheS03MDAsICRlbmQtY29sb3I6ICRncmF5LTgwMCwgJHN0YXJ0LXBlcmNlbnQ6IDAlLCAkZW5kLXBlcmNlbnQ6IDEwMCUpIHtcXG4gIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCh0byByaWdodCwgJHN0YXJ0LWNvbG9yICRzdGFydC1wZXJjZW50LCAkZW5kLWNvbG9yICRlbmQtcGVyY2VudCk7XFxufVxcblxcbi8vIFZlcnRpY2FsIGdyYWRpZW50LCBmcm9tIHRvcCB0byBib3R0b21cXG4vL1xcbi8vIENyZWF0ZXMgdHdvIGNvbG9yIHN0b3BzLCBzdGFydCBhbmQgZW5kLCBieSBzcGVjaWZ5aW5nIGEgY29sb3IgYW5kIHBvc2l0aW9uIGZvciBlYWNoIGNvbG9yIHN0b3AuXFxuQG1peGluIGdyYWRpZW50LXkoJHN0YXJ0LWNvbG9yOiAkZ3JheS03MDAsICRlbmQtY29sb3I6ICRncmF5LTgwMCwgJHN0YXJ0LXBlcmNlbnQ6IG51bGwsICRlbmQtcGVyY2VudDogbnVsbCkge1xcbiAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgJHN0YXJ0LWNvbG9yICRzdGFydC1wZXJjZW50LCAkZW5kLWNvbG9yICRlbmQtcGVyY2VudCk7XFxufVxcblxcbkBtaXhpbiBncmFkaWVudC1kaXJlY3Rpb25hbCgkc3RhcnQtY29sb3I6ICRncmF5LTcwMCwgJGVuZC1jb2xvcjogJGdyYXktODAwLCAkZGVnOiA0NWRlZykge1xcbiAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KCRkZWcsICRzdGFydC1jb2xvciwgJGVuZC1jb2xvcik7XFxufVxcblxcbkBtaXhpbiBncmFkaWVudC14LXRocmVlLWNvbG9ycygkc3RhcnQtY29sb3I6ICRibHVlLCAkbWlkLWNvbG9yOiAkcHVycGxlLCAkY29sb3Itc3RvcDogNTAlLCAkZW5kLWNvbG9yOiAkcmVkKSB7XFxuICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsICRzdGFydC1jb2xvciwgJG1pZC1jb2xvciAkY29sb3Itc3RvcCwgJGVuZC1jb2xvcik7XFxufVxcblxcbkBtaXhpbiBncmFkaWVudC15LXRocmVlLWNvbG9ycygkc3RhcnQtY29sb3I6ICRibHVlLCAkbWlkLWNvbG9yOiAkcHVycGxlLCAkY29sb3Itc3RvcDogNTAlLCAkZW5kLWNvbG9yOiAkcmVkKSB7XFxuICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQoJHN0YXJ0LWNvbG9yLCAkbWlkLWNvbG9yICRjb2xvci1zdG9wLCAkZW5kLWNvbG9yKTtcXG59XFxuXFxuQG1peGluIGdyYWRpZW50LXJhZGlhbCgkaW5uZXItY29sb3I6ICRncmF5LTcwMCwgJG91dGVyLWNvbG9yOiAkZ3JheS04MDApIHtcXG4gIGJhY2tncm91bmQtaW1hZ2U6IHJhZGlhbC1ncmFkaWVudChjaXJjbGUsICRpbm5lci1jb2xvciwgJG91dGVyLWNvbG9yKTtcXG59XFxuXFxuQG1peGluIGdyYWRpZW50LXN0cmlwZWQoJGNvbG9yOiByZ2JhKCR3aGl0ZSwgLjE1KSwgJGFuZ2xlOiA0NWRlZykge1xcbiAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KCRhbmdsZSwgJGNvbG9yIDI1JSwgdHJhbnNwYXJlbnQgMjUlLCB0cmFuc3BhcmVudCA1MCUsICRjb2xvciA1MCUsICRjb2xvciA3NSUsIHRyYW5zcGFyZW50IDc1JSwgdHJhbnNwYXJlbnQpO1xcbn1cXG4vLyBzY3NzLWRvY3MtZW5kIGdyYWRpZW50LW1peGluc1xcblwiLFwiLy8gU2VsZWN0XFxuLy9cXG4vLyBSZXBsYWNlcyB0aGUgYnJvd3NlciBkZWZhdWx0IHNlbGVjdCB3aXRoIGEgY3VzdG9tIG9uZSwgbW9zdGx5IHB1bGxlZCBmcm9tXFxuLy8gaHR0cHM6Ly9wcmltZXIuZ2l0aHViLmlvLy5cXG5cXG4uZm9ybS1zZWxlY3Qge1xcbiAgLS0jeyRwcmVmaXh9Zm9ybS1zZWxlY3QtYmctaW1nOiAje2VzY2FwZS1zdmcoJGZvcm0tc2VsZWN0LWluZGljYXRvcil9O1xcblxcbiAgZGlzcGxheTogYmxvY2s7XFxuICB3aWR0aDogMTAwJTtcXG4gIHBhZGRpbmc6ICRmb3JtLXNlbGVjdC1wYWRkaW5nLXkgJGZvcm0tc2VsZWN0LWluZGljYXRvci1wYWRkaW5nICRmb3JtLXNlbGVjdC1wYWRkaW5nLXkgJGZvcm0tc2VsZWN0LXBhZGRpbmcteDtcXG4gIGZvbnQtZmFtaWx5OiAkZm9ybS1zZWxlY3QtZm9udC1mYW1pbHk7XFxuICBAaW5jbHVkZSBmb250LXNpemUoJGZvcm0tc2VsZWN0LWZvbnQtc2l6ZSk7XFxuICBmb250LXdlaWdodDogJGZvcm0tc2VsZWN0LWZvbnQtd2VpZ2h0O1xcbiAgbGluZS1oZWlnaHQ6ICRmb3JtLXNlbGVjdC1saW5lLWhlaWdodDtcXG4gIGNvbG9yOiAkZm9ybS1zZWxlY3QtY29sb3I7XFxuICBhcHBlYXJhbmNlOiBub25lO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogJGZvcm0tc2VsZWN0LWJnO1xcbiAgYmFja2dyb3VuZC1pbWFnZTogdmFyKC0tI3skcHJlZml4fWZvcm0tc2VsZWN0LWJnLWltZyksIHZhcigtLSN7JHByZWZpeH1mb3JtLXNlbGVjdC1iZy1pY29uLCBub25lKTtcXG4gIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XFxuICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAkZm9ybS1zZWxlY3QtYmctcG9zaXRpb247XFxuICBiYWNrZ3JvdW5kLXNpemU6ICRmb3JtLXNlbGVjdC1iZy1zaXplO1xcbiAgYm9yZGVyOiAkZm9ybS1zZWxlY3QtYm9yZGVyLXdpZHRoIHNvbGlkICRmb3JtLXNlbGVjdC1ib3JkZXItY29sb3I7XFxuICBAaW5jbHVkZSBib3JkZXItcmFkaXVzKCRmb3JtLXNlbGVjdC1ib3JkZXItcmFkaXVzLCAwKTtcXG4gIEBpbmNsdWRlIGJveC1zaGFkb3coJGZvcm0tc2VsZWN0LWJveC1zaGFkb3cpO1xcbiAgQGluY2x1ZGUgdHJhbnNpdGlvbigkZm9ybS1zZWxlY3QtdHJhbnNpdGlvbik7XFxuXFxuICAmOmZvY3VzIHtcXG4gICAgYm9yZGVyLWNvbG9yOiAkZm9ybS1zZWxlY3QtZm9jdXMtYm9yZGVyLWNvbG9yO1xcbiAgICBvdXRsaW5lOiAwO1xcbiAgICBAaWYgJGVuYWJsZS1zaGFkb3dzIHtcXG4gICAgICBAaW5jbHVkZSBib3gtc2hhZG93KCRmb3JtLXNlbGVjdC1ib3gtc2hhZG93LCAkZm9ybS1zZWxlY3QtZm9jdXMtYm94LXNoYWRvdyk7XFxuICAgIH0gQGVsc2Uge1xcbiAgICAgIC8vIEF2b2lkIHVzaW5nIG1peGluIHNvIHdlIGNhbiBwYXNzIGN1c3RvbSBmb2N1cyBzaGFkb3cgcHJvcGVybHlcXG4gICAgICBib3gtc2hhZG93OiAkZm9ybS1zZWxlY3QtZm9jdXMtYm94LXNoYWRvdztcXG4gICAgfVxcbiAgfVxcblxcbiAgJlttdWx0aXBsZV0sXFxuICAmW3NpemVdOm5vdChbc2l6ZT1cXFwiMVxcXCJdKSB7XFxuICAgIHBhZGRpbmctcmlnaHQ6ICRmb3JtLXNlbGVjdC1wYWRkaW5nLXg7XFxuICAgIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7XFxuICB9XFxuXFxuICAmOmRpc2FibGVkIHtcXG4gICAgY29sb3I6ICRmb3JtLXNlbGVjdC1kaXNhYmxlZC1jb2xvcjtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogJGZvcm0tc2VsZWN0LWRpc2FibGVkLWJnO1xcbiAgICBib3JkZXItY29sb3I6ICRmb3JtLXNlbGVjdC1kaXNhYmxlZC1ib3JkZXItY29sb3I7XFxuICB9XFxuXFxuICAvLyBSZW1vdmUgb3V0bGluZSBmcm9tIHNlbGVjdCBib3ggaW4gRkZcXG4gICY6LW1vei1mb2N1c3Jpbmcge1xcbiAgICBjb2xvcjogdHJhbnNwYXJlbnQ7XFxuICAgIHRleHQtc2hhZG93OiAwIDAgMCAkZm9ybS1zZWxlY3QtY29sb3I7XFxuICB9XFxufVxcblxcbi5mb3JtLXNlbGVjdC1zbSB7XFxuICBwYWRkaW5nLXRvcDogJGZvcm0tc2VsZWN0LXBhZGRpbmcteS1zbTtcXG4gIHBhZGRpbmctYm90dG9tOiAkZm9ybS1zZWxlY3QtcGFkZGluZy15LXNtO1xcbiAgcGFkZGluZy1sZWZ0OiAkZm9ybS1zZWxlY3QtcGFkZGluZy14LXNtO1xcbiAgQGluY2x1ZGUgZm9udC1zaXplKCRmb3JtLXNlbGVjdC1mb250LXNpemUtc20pO1xcbiAgQGluY2x1ZGUgYm9yZGVyLXJhZGl1cygkZm9ybS1zZWxlY3QtYm9yZGVyLXJhZGl1cy1zbSk7XFxufVxcblxcbi5mb3JtLXNlbGVjdC1sZyB7XFxuICBwYWRkaW5nLXRvcDogJGZvcm0tc2VsZWN0LXBhZGRpbmcteS1sZztcXG4gIHBhZGRpbmctYm90dG9tOiAkZm9ybS1zZWxlY3QtcGFkZGluZy15LWxnO1xcbiAgcGFkZGluZy1sZWZ0OiAkZm9ybS1zZWxlY3QtcGFkZGluZy14LWxnO1xcbiAgQGluY2x1ZGUgZm9udC1zaXplKCRmb3JtLXNlbGVjdC1mb250LXNpemUtbGcpO1xcbiAgQGluY2x1ZGUgYm9yZGVyLXJhZGl1cygkZm9ybS1zZWxlY3QtYm9yZGVyLXJhZGl1cy1sZyk7XFxufVxcblxcbkBpZiAkZW5hYmxlLWRhcmstbW9kZSB7XFxuICBAaW5jbHVkZSBjb2xvci1tb2RlKGRhcmspIHtcXG4gICAgLmZvcm0tc2VsZWN0IHtcXG4gICAgICAtLSN7JHByZWZpeH1mb3JtLXNlbGVjdC1iZy1pbWc6ICN7ZXNjYXBlLXN2ZygkZm9ybS1zZWxlY3QtaW5kaWNhdG9yLWRhcmspfTtcXG4gICAgfVxcbiAgfVxcbn1cXG5cIixcIi8vXFxuLy8gQ2hlY2svcmFkaW9cXG4vL1xcblxcbi5mb3JtLWNoZWNrIHtcXG4gIGRpc3BsYXk6IGJsb2NrO1xcbiAgbWluLWhlaWdodDogJGZvcm0tY2hlY2stbWluLWhlaWdodDtcXG4gIHBhZGRpbmctbGVmdDogJGZvcm0tY2hlY2stcGFkZGluZy1zdGFydDtcXG4gIG1hcmdpbi1ib3R0b206ICRmb3JtLWNoZWNrLW1hcmdpbi1ib3R0b207XFxuXFxuICAuZm9ybS1jaGVjay1pbnB1dCB7XFxuICAgIGZsb2F0OiBsZWZ0O1xcbiAgICBtYXJnaW4tbGVmdDogJGZvcm0tY2hlY2stcGFkZGluZy1zdGFydCAqIC0xO1xcbiAgfVxcbn1cXG5cXG4uZm9ybS1jaGVjay1yZXZlcnNlIHtcXG4gIHBhZGRpbmctcmlnaHQ6ICRmb3JtLWNoZWNrLXBhZGRpbmctc3RhcnQ7XFxuICBwYWRkaW5nLWxlZnQ6IDA7XFxuICB0ZXh0LWFsaWduOiByaWdodDtcXG5cXG4gIC5mb3JtLWNoZWNrLWlucHV0IHtcXG4gICAgZmxvYXQ6IHJpZ2h0O1xcbiAgICBtYXJnaW4tcmlnaHQ6ICRmb3JtLWNoZWNrLXBhZGRpbmctc3RhcnQgKiAtMTtcXG4gICAgbWFyZ2luLWxlZnQ6IDA7XFxuICB9XFxufVxcblxcbi5mb3JtLWNoZWNrLWlucHV0IHtcXG4gIC0tI3skcHJlZml4fWZvcm0tY2hlY2stYmc6ICN7JGZvcm0tY2hlY2staW5wdXQtYmd9O1xcblxcbiAgZmxleC1zaHJpbms6IDA7XFxuICB3aWR0aDogJGZvcm0tY2hlY2staW5wdXQtd2lkdGg7XFxuICBoZWlnaHQ6ICRmb3JtLWNoZWNrLWlucHV0LXdpZHRoO1xcbiAgbWFyZ2luLXRvcDogKCRsaW5lLWhlaWdodC1iYXNlIC0gJGZvcm0tY2hlY2staW5wdXQtd2lkdGgpICogLjU7IC8vIGxpbmUtaGVpZ2h0IG1pbnVzIGNoZWNrIGhlaWdodFxcbiAgdmVydGljYWwtYWxpZ246IHRvcDtcXG4gIGFwcGVhcmFuY2U6IG5vbmU7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS0jeyRwcmVmaXh9Zm9ybS1jaGVjay1iZyk7XFxuICBiYWNrZ3JvdW5kLWltYWdlOiB2YXIoLS0jeyRwcmVmaXh9Zm9ybS1jaGVjay1iZy1pbWFnZSk7XFxuICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyO1xcbiAgYmFja2dyb3VuZC1zaXplOiBjb250YWluO1xcbiAgYm9yZGVyOiAkZm9ybS1jaGVjay1pbnB1dC1ib3JkZXI7XFxuICBwcmludC1jb2xvci1hZGp1c3Q6IGV4YWN0OyAvLyBLZWVwIHRoZW1lZCBhcHBlYXJhbmNlIGZvciBwcmludFxcbiAgQGluY2x1ZGUgdHJhbnNpdGlvbigkZm9ybS1jaGVjay10cmFuc2l0aW9uKTtcXG5cXG4gICZbdHlwZT1cXFwiY2hlY2tib3hcXFwiXSB7XFxuICAgIEBpbmNsdWRlIGJvcmRlci1yYWRpdXMoJGZvcm0tY2hlY2staW5wdXQtYm9yZGVyLXJhZGl1cyk7XFxuICB9XFxuXFxuICAmW3R5cGU9XFxcInJhZGlvXFxcIl0ge1xcbiAgICAvLyBzdHlsZWxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJvcGVydHktZGlzYWxsb3dlZC1saXN0XFxuICAgIGJvcmRlci1yYWRpdXM6ICRmb3JtLWNoZWNrLXJhZGlvLWJvcmRlci1yYWRpdXM7XFxuICB9XFxuXFxuICAmOmFjdGl2ZSB7XFxuICAgIGZpbHRlcjogJGZvcm0tY2hlY2staW5wdXQtYWN0aXZlLWZpbHRlcjtcXG4gIH1cXG5cXG4gICY6Zm9jdXMge1xcbiAgICBib3JkZXItY29sb3I6ICRmb3JtLWNoZWNrLWlucHV0LWZvY3VzLWJvcmRlcjtcXG4gICAgb3V0bGluZTogMDtcXG4gICAgYm94LXNoYWRvdzogJGZvcm0tY2hlY2staW5wdXQtZm9jdXMtYm94LXNoYWRvdztcXG4gIH1cXG5cXG4gICY6Y2hlY2tlZCB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICRmb3JtLWNoZWNrLWlucHV0LWNoZWNrZWQtYmctY29sb3I7XFxuICAgIGJvcmRlci1jb2xvcjogJGZvcm0tY2hlY2staW5wdXQtY2hlY2tlZC1ib3JkZXItY29sb3I7XFxuXFxuICAgICZbdHlwZT1cXFwiY2hlY2tib3hcXFwiXSB7XFxuICAgICAgQGlmICRlbmFibGUtZ3JhZGllbnRzIHtcXG4gICAgICAgIC0tI3skcHJlZml4fWZvcm0tY2hlY2stYmctaW1hZ2U6ICN7ZXNjYXBlLXN2ZygkZm9ybS1jaGVjay1pbnB1dC1jaGVja2VkLWJnLWltYWdlKX0sIHZhcigtLSN7JHByZWZpeH1ncmFkaWVudCk7XFxuICAgICAgfSBAZWxzZSB7XFxuICAgICAgICAtLSN7JHByZWZpeH1mb3JtLWNoZWNrLWJnLWltYWdlOiAje2VzY2FwZS1zdmcoJGZvcm0tY2hlY2staW5wdXQtY2hlY2tlZC1iZy1pbWFnZSl9O1xcbiAgICAgIH1cXG4gICAgfVxcblxcbiAgICAmW3R5cGU9XFxcInJhZGlvXFxcIl0ge1xcbiAgICAgIEBpZiAkZW5hYmxlLWdyYWRpZW50cyB7XFxuICAgICAgICAtLSN7JHByZWZpeH1mb3JtLWNoZWNrLWJnLWltYWdlOiAje2VzY2FwZS1zdmcoJGZvcm0tY2hlY2stcmFkaW8tY2hlY2tlZC1iZy1pbWFnZSl9LCB2YXIoLS0jeyRwcmVmaXh9Z3JhZGllbnQpO1xcbiAgICAgIH0gQGVsc2Uge1xcbiAgICAgICAgLS0jeyRwcmVmaXh9Zm9ybS1jaGVjay1iZy1pbWFnZTogI3tlc2NhcGUtc3ZnKCRmb3JtLWNoZWNrLXJhZGlvLWNoZWNrZWQtYmctaW1hZ2UpfTtcXG4gICAgICB9XFxuICAgIH1cXG4gIH1cXG5cXG4gICZbdHlwZT1cXFwiY2hlY2tib3hcXFwiXTppbmRldGVybWluYXRlIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogJGZvcm0tY2hlY2staW5wdXQtaW5kZXRlcm1pbmF0ZS1iZy1jb2xvcjtcXG4gICAgYm9yZGVyLWNvbG9yOiAkZm9ybS1jaGVjay1pbnB1dC1pbmRldGVybWluYXRlLWJvcmRlci1jb2xvcjtcXG5cXG4gICAgQGlmICRlbmFibGUtZ3JhZGllbnRzIHtcXG4gICAgICAtLSN7JHByZWZpeH1mb3JtLWNoZWNrLWJnLWltYWdlOiAje2VzY2FwZS1zdmcoJGZvcm0tY2hlY2staW5wdXQtaW5kZXRlcm1pbmF0ZS1iZy1pbWFnZSl9LCB2YXIoLS0jeyRwcmVmaXh9Z3JhZGllbnQpO1xcbiAgICB9IEBlbHNlIHtcXG4gICAgICAtLSN7JHByZWZpeH1mb3JtLWNoZWNrLWJnLWltYWdlOiAje2VzY2FwZS1zdmcoJGZvcm0tY2hlY2staW5wdXQtaW5kZXRlcm1pbmF0ZS1iZy1pbWFnZSl9O1xcbiAgICB9XFxuICB9XFxuXFxuICAmOmRpc2FibGVkIHtcXG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxuICAgIGZpbHRlcjogbm9uZTtcXG4gICAgb3BhY2l0eTogJGZvcm0tY2hlY2staW5wdXQtZGlzYWJsZWQtb3BhY2l0eTtcXG4gIH1cXG5cXG4gIC8vIFVzZSBkaXNhYmxlZCBhdHRyaWJ1dGUgaW4gYWRkaXRpb24gb2YgOmRpc2FibGVkIHBzZXVkby1jbGFzc1xcbiAgLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvaXNzdWVzLzI4MjQ3XFxuICAmW2Rpc2FibGVkXSxcXG4gICY6ZGlzYWJsZWQge1xcbiAgICB+IC5mb3JtLWNoZWNrLWxhYmVsIHtcXG4gICAgICBjdXJzb3I6IGRlZmF1bHQ7XFxuICAgICAgb3BhY2l0eTogJGZvcm0tY2hlY2stbGFiZWwtZGlzYWJsZWQtb3BhY2l0eTtcXG4gICAgfVxcbiAgfVxcbn1cXG5cXG4uZm9ybS1jaGVjay1sYWJlbCB7XFxuICBjb2xvcjogJGZvcm0tY2hlY2stbGFiZWwtY29sb3I7XFxuICBjdXJzb3I6ICRmb3JtLWNoZWNrLWxhYmVsLWN1cnNvcjtcXG59XFxuXFxuLy9cXG4vLyBTd2l0Y2hcXG4vL1xcblxcbi5mb3JtLXN3aXRjaCB7XFxuICBwYWRkaW5nLWxlZnQ6ICRmb3JtLXN3aXRjaC1wYWRkaW5nLXN0YXJ0O1xcblxcbiAgLmZvcm0tY2hlY2staW5wdXQge1xcbiAgICAtLSN7JHByZWZpeH1mb3JtLXN3aXRjaC1iZzogI3tlc2NhcGUtc3ZnKCRmb3JtLXN3aXRjaC1iZy1pbWFnZSl9O1xcblxcbiAgICB3aWR0aDogJGZvcm0tc3dpdGNoLXdpZHRoO1xcbiAgICBtYXJnaW4tbGVmdDogJGZvcm0tc3dpdGNoLXBhZGRpbmctc3RhcnQgKiAtMTtcXG4gICAgYmFja2dyb3VuZC1pbWFnZTogdmFyKC0tI3skcHJlZml4fWZvcm0tc3dpdGNoLWJnKTtcXG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogbGVmdCBjZW50ZXI7XFxuICAgIEBpbmNsdWRlIGJvcmRlci1yYWRpdXMoJGZvcm0tc3dpdGNoLWJvcmRlci1yYWRpdXMpO1xcbiAgICBAaW5jbHVkZSB0cmFuc2l0aW9uKCRmb3JtLXN3aXRjaC10cmFuc2l0aW9uKTtcXG5cXG4gICAgJjpmb2N1cyB7XFxuICAgICAgLS0jeyRwcmVmaXh9Zm9ybS1zd2l0Y2gtYmc6ICN7ZXNjYXBlLXN2ZygkZm9ybS1zd2l0Y2gtZm9jdXMtYmctaW1hZ2UpfTtcXG4gICAgfVxcblxcbiAgICAmOmNoZWNrZWQge1xcbiAgICAgIGJhY2tncm91bmQtcG9zaXRpb246ICRmb3JtLXN3aXRjaC1jaGVja2VkLWJnLXBvc2l0aW9uO1xcblxcbiAgICAgIEBpZiAkZW5hYmxlLWdyYWRpZW50cyB7XFxuICAgICAgICAtLSN7JHByZWZpeH1mb3JtLXN3aXRjaC1iZzogI3tlc2NhcGUtc3ZnKCRmb3JtLXN3aXRjaC1jaGVja2VkLWJnLWltYWdlKX0sIHZhcigtLSN7JHByZWZpeH1ncmFkaWVudCk7XFxuICAgICAgfSBAZWxzZSB7XFxuICAgICAgICAtLSN7JHByZWZpeH1mb3JtLXN3aXRjaC1iZzogI3tlc2NhcGUtc3ZnKCRmb3JtLXN3aXRjaC1jaGVja2VkLWJnLWltYWdlKX07XFxuICAgICAgfVxcbiAgICB9XFxuICB9XFxuXFxuICAmLmZvcm0tY2hlY2stcmV2ZXJzZSB7XFxuICAgIHBhZGRpbmctcmlnaHQ6ICRmb3JtLXN3aXRjaC1wYWRkaW5nLXN0YXJ0O1xcbiAgICBwYWRkaW5nLWxlZnQ6IDA7XFxuXFxuICAgIC5mb3JtLWNoZWNrLWlucHV0IHtcXG4gICAgICBtYXJnaW4tcmlnaHQ6ICRmb3JtLXN3aXRjaC1wYWRkaW5nLXN0YXJ0ICogLTE7XFxuICAgICAgbWFyZ2luLWxlZnQ6IDA7XFxuICAgIH1cXG4gIH1cXG59XFxuXFxuLmZvcm0tY2hlY2staW5saW5lIHtcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gIG1hcmdpbi1yaWdodDogJGZvcm0tY2hlY2staW5saW5lLW1hcmdpbi1lbmQ7XFxufVxcblxcbi5idG4tY2hlY2sge1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgY2xpcDogcmVjdCgwLCAwLCAwLCAwKTtcXG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xcblxcbiAgJltkaXNhYmxlZF0sXFxuICAmOmRpc2FibGVkIHtcXG4gICAgKyAuYnRuIHtcXG4gICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcXG4gICAgICBmaWx0ZXI6IG5vbmU7XFxuICAgICAgb3BhY2l0eTogJGZvcm0tY2hlY2stYnRuLWNoZWNrLWRpc2FibGVkLW9wYWNpdHk7XFxuICAgIH1cXG4gIH1cXG59XFxuXFxuQGlmICRlbmFibGUtZGFyay1tb2RlIHtcXG4gIEBpbmNsdWRlIGNvbG9yLW1vZGUoZGFyaykge1xcbiAgICAuZm9ybS1zd2l0Y2ggLmZvcm0tY2hlY2staW5wdXQ6bm90KDpjaGVja2VkKTpub3QoOmZvY3VzKSB7XFxuICAgICAgLS0jeyRwcmVmaXh9Zm9ybS1zd2l0Y2gtYmc6ICN7ZXNjYXBlLXN2ZygkZm9ybS1zd2l0Y2gtYmctaW1hZ2UtZGFyayl9O1xcbiAgICB9XFxuICB9XFxufVxcblwiLFwiLy8gUmFuZ2VcXG4vL1xcbi8vIFN0eWxlIHJhbmdlIGlucHV0cyB0aGUgc2FtZSBhY3Jvc3MgYnJvd3NlcnMuIFZlbmRvci1zcGVjaWZpYyBydWxlcyBmb3IgcHNldWRvXFxuLy8gZWxlbWVudHMgY2Fubm90IGJlIG1peGVkLiBBcyBzdWNoLCB0aGVyZSBhcmUgbm8gc2hhcmVkIHN0eWxlcyBmb3IgZm9jdXMgb3JcXG4vLyBhY3RpdmUgc3RhdGVzIG9uIHByZWZpeGVkIHNlbGVjdG9ycy5cXG5cXG4uZm9ybS1yYW5nZSB7XFxuICB3aWR0aDogMTAwJTtcXG4gIGhlaWdodDogYWRkKCRmb3JtLXJhbmdlLXRodW1iLWhlaWdodCwgJGZvcm0tcmFuZ2UtdGh1bWItZm9jdXMtYm94LXNoYWRvdy13aWR0aCAqIDIpO1xcbiAgcGFkZGluZzogMDsgLy8gTmVlZCB0byByZXNldCBwYWRkaW5nXFxuICBhcHBlYXJhbmNlOiBub25lO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XFxuXFxuICAmOmZvY3VzIHtcXG4gICAgb3V0bGluZTogMDtcXG5cXG4gICAgLy8gUHNldWRvLWVsZW1lbnRzIG11c3QgYmUgc3BsaXQgYWNyb3NzIG11bHRpcGxlIHJ1bGVzZXRzIHRvIGhhdmUgYW4gZWZmZWN0LlxcbiAgICAvLyBObyBib3gtc2hhZG93KCkgbWl4aW4gZm9yIGZvY3VzIGFjY2Vzc2liaWxpdHkuXFxuICAgICY6Oi13ZWJraXQtc2xpZGVyLXRodW1iIHsgYm94LXNoYWRvdzogJGZvcm0tcmFuZ2UtdGh1bWItZm9jdXMtYm94LXNoYWRvdzsgfVxcbiAgICAmOjotbW96LXJhbmdlLXRodW1iICAgICB7IGJveC1zaGFkb3c6ICRmb3JtLXJhbmdlLXRodW1iLWZvY3VzLWJveC1zaGFkb3c7IH1cXG4gIH1cXG5cXG4gICY6Oi1tb3otZm9jdXMtb3V0ZXIge1xcbiAgICBib3JkZXI6IDA7XFxuICB9XFxuXFxuICAmOjotd2Via2l0LXNsaWRlci10aHVtYiB7XFxuICAgIHdpZHRoOiAkZm9ybS1yYW5nZS10aHVtYi13aWR0aDtcXG4gICAgaGVpZ2h0OiAkZm9ybS1yYW5nZS10aHVtYi1oZWlnaHQ7XFxuICAgIG1hcmdpbi10b3A6ICgkZm9ybS1yYW5nZS10cmFjay1oZWlnaHQgLSAkZm9ybS1yYW5nZS10aHVtYi1oZWlnaHQpICogLjU7IC8vIFdlYmtpdCBzcGVjaWZpY1xcbiAgICBhcHBlYXJhbmNlOiBub25lO1xcbiAgICBAaW5jbHVkZSBncmFkaWVudC1iZygkZm9ybS1yYW5nZS10aHVtYi1iZyk7XFxuICAgIGJvcmRlcjogJGZvcm0tcmFuZ2UtdGh1bWItYm9yZGVyO1xcbiAgICBAaW5jbHVkZSBib3JkZXItcmFkaXVzKCRmb3JtLXJhbmdlLXRodW1iLWJvcmRlci1yYWRpdXMpO1xcbiAgICBAaW5jbHVkZSBib3gtc2hhZG93KCRmb3JtLXJhbmdlLXRodW1iLWJveC1zaGFkb3cpO1xcbiAgICBAaW5jbHVkZSB0cmFuc2l0aW9uKCRmb3JtLXJhbmdlLXRodW1iLXRyYW5zaXRpb24pO1xcblxcbiAgICAmOmFjdGl2ZSB7XFxuICAgICAgQGluY2x1ZGUgZ3JhZGllbnQtYmcoJGZvcm0tcmFuZ2UtdGh1bWItYWN0aXZlLWJnKTtcXG4gICAgfVxcbiAgfVxcblxcbiAgJjo6LXdlYmtpdC1zbGlkZXItcnVubmFibGUtdHJhY2sge1xcbiAgICB3aWR0aDogJGZvcm0tcmFuZ2UtdHJhY2std2lkdGg7XFxuICAgIGhlaWdodDogJGZvcm0tcmFuZ2UtdHJhY2staGVpZ2h0O1xcbiAgICBjb2xvcjogdHJhbnNwYXJlbnQ7IC8vIFdoeT9cXG4gICAgY3Vyc29yOiAkZm9ybS1yYW5nZS10cmFjay1jdXJzb3I7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICRmb3JtLXJhbmdlLXRyYWNrLWJnO1xcbiAgICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50O1xcbiAgICBAaW5jbHVkZSBib3JkZXItcmFkaXVzKCRmb3JtLXJhbmdlLXRyYWNrLWJvcmRlci1yYWRpdXMpO1xcbiAgICBAaW5jbHVkZSBib3gtc2hhZG93KCRmb3JtLXJhbmdlLXRyYWNrLWJveC1zaGFkb3cpO1xcbiAgfVxcblxcbiAgJjo6LW1vei1yYW5nZS10aHVtYiB7XFxuICAgIHdpZHRoOiAkZm9ybS1yYW5nZS10aHVtYi13aWR0aDtcXG4gICAgaGVpZ2h0OiAkZm9ybS1yYW5nZS10aHVtYi1oZWlnaHQ7XFxuICAgIGFwcGVhcmFuY2U6IG5vbmU7XFxuICAgIEBpbmNsdWRlIGdyYWRpZW50LWJnKCRmb3JtLXJhbmdlLXRodW1iLWJnKTtcXG4gICAgYm9yZGVyOiAkZm9ybS1yYW5nZS10aHVtYi1ib3JkZXI7XFxuICAgIEBpbmNsdWRlIGJvcmRlci1yYWRpdXMoJGZvcm0tcmFuZ2UtdGh1bWItYm9yZGVyLXJhZGl1cyk7XFxuICAgIEBpbmNsdWRlIGJveC1zaGFkb3coJGZvcm0tcmFuZ2UtdGh1bWItYm94LXNoYWRvdyk7XFxuICAgIEBpbmNsdWRlIHRyYW5zaXRpb24oJGZvcm0tcmFuZ2UtdGh1bWItdHJhbnNpdGlvbik7XFxuXFxuICAgICY6YWN0aXZlIHtcXG4gICAgICBAaW5jbHVkZSBncmFkaWVudC1iZygkZm9ybS1yYW5nZS10aHVtYi1hY3RpdmUtYmcpO1xcbiAgICB9XFxuICB9XFxuXFxuICAmOjotbW96LXJhbmdlLXRyYWNrIHtcXG4gICAgd2lkdGg6ICRmb3JtLXJhbmdlLXRyYWNrLXdpZHRoO1xcbiAgICBoZWlnaHQ6ICRmb3JtLXJhbmdlLXRyYWNrLWhlaWdodDtcXG4gICAgY29sb3I6IHRyYW5zcGFyZW50O1xcbiAgICBjdXJzb3I6ICRmb3JtLXJhbmdlLXRyYWNrLWN1cnNvcjtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogJGZvcm0tcmFuZ2UtdHJhY2stYmc7XFxuICAgIGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQ7IC8vIEZpcmVmb3ggc3BlY2lmaWM/XFxuICAgIEBpbmNsdWRlIGJvcmRlci1yYWRpdXMoJGZvcm0tcmFuZ2UtdHJhY2stYm9yZGVyLXJhZGl1cyk7XFxuICAgIEBpbmNsdWRlIGJveC1zaGFkb3coJGZvcm0tcmFuZ2UtdHJhY2stYm94LXNoYWRvdyk7XFxuICB9XFxuXFxuICAmOmRpc2FibGVkIHtcXG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxuXFxuICAgICY6Oi13ZWJraXQtc2xpZGVyLXRodW1iIHtcXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkZm9ybS1yYW5nZS10aHVtYi1kaXNhYmxlZC1iZztcXG4gICAgfVxcblxcbiAgICAmOjotbW96LXJhbmdlLXRodW1iIHtcXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkZm9ybS1yYW5nZS10aHVtYi1kaXNhYmxlZC1iZztcXG4gICAgfVxcbiAgfVxcbn1cXG5cIixcIi5mb3JtLWZsb2F0aW5nIHtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG5cXG4gID4gLmZvcm0tY29udHJvbCxcXG4gID4gLmZvcm0tY29udHJvbC1wbGFpbnRleHQsXFxuICA+IC5mb3JtLXNlbGVjdCB7XFxuICAgIGhlaWdodDogJGZvcm0tZmxvYXRpbmctaGVpZ2h0O1xcbiAgICBtaW4taGVpZ2h0OiAkZm9ybS1mbG9hdGluZy1oZWlnaHQ7XFxuICAgIGxpbmUtaGVpZ2h0OiAkZm9ybS1mbG9hdGluZy1saW5lLWhlaWdodDtcXG4gIH1cXG5cXG4gID4gbGFiZWwge1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIHRvcDogMDtcXG4gICAgbGVmdDogMDtcXG4gICAgei1pbmRleDogMjtcXG4gICAgaGVpZ2h0OiAxMDAlOyAvLyBhbGxvdyB0ZXh0YXJlYXNcXG4gICAgcGFkZGluZzogJGZvcm0tZmxvYXRpbmctcGFkZGluZy15ICRmb3JtLWZsb2F0aW5nLXBhZGRpbmcteDtcXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcXG4gICAgdGV4dC1hbGlnbjogc3RhcnQ7XFxuICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcXG4gICAgYm9yZGVyOiAkaW5wdXQtYm9yZGVyLXdpZHRoIHNvbGlkIHRyYW5zcGFyZW50OyAvLyBSZXF1aXJlZCBmb3IgYWxpZ25pbmcgbGFiZWwncyB0ZXh0IHdpdGggdGhlIGlucHV0IGFzIGl0IGFmZmVjdHMgaW5uZXIgYm94IG1vZGVsXFxuICAgIHRyYW5zZm9ybS1vcmlnaW46IDAgMDtcXG4gICAgQGluY2x1ZGUgdHJhbnNpdGlvbigkZm9ybS1mbG9hdGluZy10cmFuc2l0aW9uKTtcXG4gIH1cXG5cXG4gID4gLmZvcm0tY29udHJvbCxcXG4gID4gLmZvcm0tY29udHJvbC1wbGFpbnRleHQge1xcbiAgICBwYWRkaW5nOiAkZm9ybS1mbG9hdGluZy1wYWRkaW5nLXkgJGZvcm0tZmxvYXRpbmctcGFkZGluZy14O1xcblxcbiAgICAmOjpwbGFjZWhvbGRlciB7XFxuICAgICAgY29sb3I6IHRyYW5zcGFyZW50O1xcbiAgICB9XFxuXFxuICAgICY6Zm9jdXMsXFxuICAgICY6bm90KDpwbGFjZWhvbGRlci1zaG93bikge1xcbiAgICAgIHBhZGRpbmctdG9wOiAkZm9ybS1mbG9hdGluZy1pbnB1dC1wYWRkaW5nLXQ7XFxuICAgICAgcGFkZGluZy1ib3R0b206ICRmb3JtLWZsb2F0aW5nLWlucHV0LXBhZGRpbmctYjtcXG4gICAgfVxcbiAgICAvLyBEdXBsaWNhdGVkIGJlY2F1c2UgYDotd2Via2l0LWF1dG9maWxsYCBpbnZhbGlkYXRlcyBvdGhlciBzZWxlY3RvcnMgd2hlbiBncm91cGVkXFxuICAgICY6LXdlYmtpdC1hdXRvZmlsbCB7XFxuICAgICAgcGFkZGluZy10b3A6ICRmb3JtLWZsb2F0aW5nLWlucHV0LXBhZGRpbmctdDtcXG4gICAgICBwYWRkaW5nLWJvdHRvbTogJGZvcm0tZmxvYXRpbmctaW5wdXQtcGFkZGluZy1iO1xcbiAgICB9XFxuICB9XFxuXFxuICA+IC5mb3JtLXNlbGVjdCB7XFxuICAgIHBhZGRpbmctdG9wOiAkZm9ybS1mbG9hdGluZy1pbnB1dC1wYWRkaW5nLXQ7XFxuICAgIHBhZGRpbmctYm90dG9tOiAkZm9ybS1mbG9hdGluZy1pbnB1dC1wYWRkaW5nLWI7XFxuICB9XFxuXFxuICA+IC5mb3JtLWNvbnRyb2w6Zm9jdXMsXFxuICA+IC5mb3JtLWNvbnRyb2w6bm90KDpwbGFjZWhvbGRlci1zaG93biksXFxuICA+IC5mb3JtLWNvbnRyb2wtcGxhaW50ZXh0LFxcbiAgPiAuZm9ybS1zZWxlY3Qge1xcbiAgICB+IGxhYmVsIHtcXG4gICAgICBjb2xvcjogcmdiYSh2YXIoLS0jeyRwcmVmaXh9Ym9keS1jb2xvci1yZ2IpLCAjeyRmb3JtLWZsb2F0aW5nLWxhYmVsLW9wYWNpdHl9KTtcXG4gICAgICB0cmFuc2Zvcm06ICRmb3JtLWZsb2F0aW5nLWxhYmVsLXRyYW5zZm9ybTtcXG5cXG4gICAgICAmOjphZnRlciB7XFxuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgICAgICBpbnNldDogJGZvcm0tZmxvYXRpbmctcGFkZGluZy15ICgkZm9ybS1mbG9hdGluZy1wYWRkaW5nLXggKiAuNSk7XFxuICAgICAgICB6LWluZGV4OiAtMTtcXG4gICAgICAgIGhlaWdodDogJGZvcm0tZmxvYXRpbmctbGFiZWwtaGVpZ2h0O1xcbiAgICAgICAgY29udGVudDogXFxcIlxcXCI7XFxuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkaW5wdXQtYmc7XFxuICAgICAgICBAaW5jbHVkZSBib3JkZXItcmFkaXVzKCRpbnB1dC1ib3JkZXItcmFkaXVzKTtcXG4gICAgICB9XFxuICAgIH1cXG4gIH1cXG4gIC8vIER1cGxpY2F0ZWQgYmVjYXVzZSBgOi13ZWJraXQtYXV0b2ZpbGxgIGludmFsaWRhdGVzIG90aGVyIHNlbGVjdG9ycyB3aGVuIGdyb3VwZWRcXG4gID4gLmZvcm0tY29udHJvbDotd2Via2l0LWF1dG9maWxsIHtcXG4gICAgfiBsYWJlbCB7XFxuICAgICAgY29sb3I6IHJnYmEodmFyKC0tI3skcHJlZml4fWJvZHktY29sb3ItcmdiKSwgI3skZm9ybS1mbG9hdGluZy1sYWJlbC1vcGFjaXR5fSk7XFxuICAgICAgdHJhbnNmb3JtOiAkZm9ybS1mbG9hdGluZy1sYWJlbC10cmFuc2Zvcm07XFxuICAgIH1cXG4gIH1cXG5cXG4gID4gLmZvcm0tY29udHJvbC1wbGFpbnRleHQge1xcbiAgICB+IGxhYmVsIHtcXG4gICAgICBib3JkZXItd2lkdGg6ICRpbnB1dC1ib3JkZXItd2lkdGggMDsgLy8gUmVxdWlyZWQgdG8gcHJvcGVybHkgcG9zaXRpb24gbGFiZWwgdGV4dCAtIGFzIGV4cGxhaW5lZCBhYm92ZVxcbiAgICB9XFxuICB9XFxuXFxuICA+IDpkaXNhYmxlZCB+IGxhYmVsLFxcbiAgPiAuZm9ybS1jb250cm9sOmRpc2FibGVkIH4gbGFiZWwgeyAvLyBSZXF1aXJlZCBmb3IgYC5mb3JtLWNvbnRyb2xgcyBiZWNhdXNlIG9mIHNwZWNpZmljaXR5XFxuICAgIGNvbG9yOiAkZm9ybS1mbG9hdGluZy1sYWJlbC1kaXNhYmxlZC1jb2xvcjtcXG5cXG4gICAgJjo6YWZ0ZXIge1xcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICRpbnB1dC1kaXNhYmxlZC1iZztcXG4gICAgfVxcbiAgfVxcbn1cXG5cIixcIi8vXFxuLy8gQmFzZSBzdHlsZXNcXG4vL1xcblxcbi5pbnB1dC1ncm91cCB7XFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICBkaXNwbGF5OiBmbGV4O1xcbiAgZmxleC13cmFwOiB3cmFwOyAvLyBGb3IgZm9ybSB2YWxpZGF0aW9uIGZlZWRiYWNrXFxuICBhbGlnbi1pdGVtczogc3RyZXRjaDtcXG4gIHdpZHRoOiAxMDAlO1xcblxcbiAgPiAuZm9ybS1jb250cm9sLFxcbiAgPiAuZm9ybS1zZWxlY3QsXFxuICA+IC5mb3JtLWZsb2F0aW5nIHtcXG4gICAgcG9zaXRpb246IHJlbGF0aXZlOyAvLyBGb3IgZm9jdXMgc3RhdGUncyB6LWluZGV4XFxuICAgIGZsZXg6IDEgMSBhdXRvO1xcbiAgICB3aWR0aDogMSU7XFxuICAgIG1pbi13aWR0aDogMDsgLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzYyNDcxNDAvd2h5LWRvbnQtZmxleC1pdGVtcy1zaHJpbmstcGFzdC1jb250ZW50LXNpemVcXG4gIH1cXG5cXG4gIC8vIEJyaW5nIHRoZSBcXFwiYWN0aXZlXFxcIiBmb3JtIGNvbnRyb2wgdG8gdGhlIHRvcCBvZiBzdXJyb3VuZGluZyBlbGVtZW50c1xcbiAgPiAuZm9ybS1jb250cm9sOmZvY3VzLFxcbiAgPiAuZm9ybS1zZWxlY3Q6Zm9jdXMsXFxuICA+IC5mb3JtLWZsb2F0aW5nOmZvY3VzLXdpdGhpbiB7XFxuICAgIHotaW5kZXg6IDU7XFxuICB9XFxuXFxuICAvLyBFbnN1cmUgYnV0dG9ucyBhcmUgYWx3YXlzIGFib3ZlIGlucHV0cyBmb3IgbW9yZSB2aXN1YWxseSBwbGVhc2luZyBib3JkZXJzLlxcbiAgLy8gVGhpcyBpc24ndCBuZWVkZWQgZm9yIGAuaW5wdXQtZ3JvdXAtdGV4dGAgc2luY2UgaXQgc2hhcmVzIHRoZSBzYW1lIGJvcmRlci1jb2xvclxcbiAgLy8gYXMgb3VyIGlucHV0cy5cXG4gIC5idG4ge1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICAgIHotaW5kZXg6IDI7XFxuXFxuICAgICY6Zm9jdXMge1xcbiAgICAgIHotaW5kZXg6IDU7XFxuICAgIH1cXG4gIH1cXG59XFxuXFxuXFxuLy8gVGV4dHVhbCBhZGRvbnNcXG4vL1xcbi8vIFNlcnZlcyBhcyBhIGNhdGNoLWFsbCBlbGVtZW50IGZvciBhbnkgdGV4dCBvciByYWRpby9jaGVja2JveCBpbnB1dCB5b3Ugd2lzaFxcbi8vIHRvIHByZXBlbmQgb3IgYXBwZW5kIHRvIGFuIGlucHV0Llxcblxcbi5pbnB1dC1ncm91cC10ZXh0IHtcXG4gIGRpc3BsYXk6IGZsZXg7XFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgcGFkZGluZzogJGlucHV0LWdyb3VwLWFkZG9uLXBhZGRpbmcteSAkaW5wdXQtZ3JvdXAtYWRkb24tcGFkZGluZy14O1xcbiAgQGluY2x1ZGUgZm9udC1zaXplKCRpbnB1dC1mb250LXNpemUpOyAvLyBNYXRjaCBpbnB1dHNcXG4gIGZvbnQtd2VpZ2h0OiAkaW5wdXQtZ3JvdXAtYWRkb24tZm9udC13ZWlnaHQ7XFxuICBsaW5lLWhlaWdodDogJGlucHV0LWxpbmUtaGVpZ2h0O1xcbiAgY29sb3I6ICRpbnB1dC1ncm91cC1hZGRvbi1jb2xvcjtcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAkaW5wdXQtZ3JvdXAtYWRkb24tYmc7XFxuICBib3JkZXI6ICRpbnB1dC1ib3JkZXItd2lkdGggc29saWQgJGlucHV0LWdyb3VwLWFkZG9uLWJvcmRlci1jb2xvcjtcXG4gIEBpbmNsdWRlIGJvcmRlci1yYWRpdXMoJGlucHV0LWJvcmRlci1yYWRpdXMpO1xcbn1cXG5cXG5cXG4vLyBTaXppbmdcXG4vL1xcbi8vIFJlbWl4IHRoZSBkZWZhdWx0IGZvcm0gY29udHJvbCBzaXppbmcgY2xhc3NlcyBpbnRvIG5ldyBvbmVzIGZvciBlYXNpZXJcXG4vLyBtYW5pcHVsYXRpb24uXFxuXFxuLmlucHV0LWdyb3VwLWxnID4gLmZvcm0tY29udHJvbCxcXG4uaW5wdXQtZ3JvdXAtbGcgPiAuZm9ybS1zZWxlY3QsXFxuLmlucHV0LWdyb3VwLWxnID4gLmlucHV0LWdyb3VwLXRleHQsXFxuLmlucHV0LWdyb3VwLWxnID4gLmJ0biB7XFxuICBwYWRkaW5nOiAkaW5wdXQtcGFkZGluZy15LWxnICRpbnB1dC1wYWRkaW5nLXgtbGc7XFxuICBAaW5jbHVkZSBmb250LXNpemUoJGlucHV0LWZvbnQtc2l6ZS1sZyk7XFxuICBAaW5jbHVkZSBib3JkZXItcmFkaXVzKCRpbnB1dC1ib3JkZXItcmFkaXVzLWxnKTtcXG59XFxuXFxuLmlucHV0LWdyb3VwLXNtID4gLmZvcm0tY29udHJvbCxcXG4uaW5wdXQtZ3JvdXAtc20gPiAuZm9ybS1zZWxlY3QsXFxuLmlucHV0LWdyb3VwLXNtID4gLmlucHV0LWdyb3VwLXRleHQsXFxuLmlucHV0LWdyb3VwLXNtID4gLmJ0biB7XFxuICBwYWRkaW5nOiAkaW5wdXQtcGFkZGluZy15LXNtICRpbnB1dC1wYWRkaW5nLXgtc207XFxuICBAaW5jbHVkZSBmb250LXNpemUoJGlucHV0LWZvbnQtc2l6ZS1zbSk7XFxuICBAaW5jbHVkZSBib3JkZXItcmFkaXVzKCRpbnB1dC1ib3JkZXItcmFkaXVzLXNtKTtcXG59XFxuXFxuLmlucHV0LWdyb3VwLWxnID4gLmZvcm0tc2VsZWN0LFxcbi5pbnB1dC1ncm91cC1zbSA+IC5mb3JtLXNlbGVjdCB7XFxuICBwYWRkaW5nLXJpZ2h0OiAkZm9ybS1zZWxlY3QtcGFkZGluZy14ICsgJGZvcm0tc2VsZWN0LWluZGljYXRvci1wYWRkaW5nO1xcbn1cXG5cXG5cXG4vLyBSb3VuZGVkIGNvcm5lcnNcXG4vL1xcbi8vIFRoZXNlIHJ1bGVzZXRzIG11c3QgY29tZSBhZnRlciB0aGUgc2l6aW5nIG9uZXMgdG8gcHJvcGVybHkgb3ZlcnJpZGUgc20gYW5kIGxnXFxuLy8gYm9yZGVyLXJhZGl1cyB2YWx1ZXMgd2hlbiBleHRlbmRpbmcuIFRoZXkncmUgbW9yZSBzcGVjaWZpYyB0aGFuIHdlJ2QgbGlrZVxcbi8vIHdpdGggdGhlIGAuaW5wdXQtZ3JvdXAgPmAgcGFydCwgYnV0IHdpdGhvdXQgaXQsIHdlIGNhbm5vdCBvdmVycmlkZSB0aGUgc2l6aW5nLlxcblxcbi8vIHN0eWxlbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1kdXBsaWNhdGUtc2VsZWN0b3JzXFxuLmlucHV0LWdyb3VwIHtcXG4gICY6bm90KC5oYXMtdmFsaWRhdGlvbikge1xcbiAgICA+IDpub3QoOmxhc3QtY2hpbGQpOm5vdCguZHJvcGRvd24tdG9nZ2xlKTpub3QoLmRyb3Bkb3duLW1lbnUpOm5vdCguZm9ybS1mbG9hdGluZyksXFxuICAgID4gLmRyb3Bkb3duLXRvZ2dsZTpudGgtbGFzdC1jaGlsZChuICsgMyksXFxuICAgID4gLmZvcm0tZmxvYXRpbmc6bm90KDpsYXN0LWNoaWxkKSA+IC5mb3JtLWNvbnRyb2wsXFxuICAgID4gLmZvcm0tZmxvYXRpbmc6bm90KDpsYXN0LWNoaWxkKSA+IC5mb3JtLXNlbGVjdCB7XFxuICAgICAgQGluY2x1ZGUgYm9yZGVyLWVuZC1yYWRpdXMoMCk7XFxuICAgIH1cXG4gIH1cXG5cXG4gICYuaGFzLXZhbGlkYXRpb24ge1xcbiAgICA+IDpudGgtbGFzdC1jaGlsZChuICsgMyk6bm90KC5kcm9wZG93bi10b2dnbGUpOm5vdCguZHJvcGRvd24tbWVudSk6bm90KC5mb3JtLWZsb2F0aW5nKSxcXG4gICAgPiAuZHJvcGRvd24tdG9nZ2xlOm50aC1sYXN0LWNoaWxkKG4gKyA0KSxcXG4gICAgPiAuZm9ybS1mbG9hdGluZzpudGgtbGFzdC1jaGlsZChuICsgMykgPiAuZm9ybS1jb250cm9sLFxcbiAgICA+IC5mb3JtLWZsb2F0aW5nOm50aC1sYXN0LWNoaWxkKG4gKyAzKSA+IC5mb3JtLXNlbGVjdCB7XFxuICAgICAgQGluY2x1ZGUgYm9yZGVyLWVuZC1yYWRpdXMoMCk7XFxuICAgIH1cXG4gIH1cXG5cXG4gICR2YWxpZGF0aW9uLW1lc3NhZ2VzOiBcXFwiXFxcIjtcXG4gIEBlYWNoICRzdGF0ZSBpbiBtYXAta2V5cygkZm9ybS12YWxpZGF0aW9uLXN0YXRlcykge1xcbiAgICAkdmFsaWRhdGlvbi1tZXNzYWdlczogJHZhbGlkYXRpb24tbWVzc2FnZXMgKyBcXFwiOm5vdCguXFxcIiArIHVucXVvdGUoJHN0YXRlKSArIFxcXCItdG9vbHRpcClcXFwiICsgXFxcIjpub3QoLlxcXCIgKyB1bnF1b3RlKCRzdGF0ZSkgKyBcXFwiLWZlZWRiYWNrKVxcXCI7XFxuICB9XFxuXFxuICA+IDpub3QoOmZpcnN0LWNoaWxkKTpub3QoLmRyb3Bkb3duLW1lbnUpI3skdmFsaWRhdGlvbi1tZXNzYWdlc30ge1xcbiAgICBtYXJnaW4tbGVmdDogY2FsYygjeyRpbnB1dC1ib3JkZXItd2lkdGh9ICogLTEpOyAvLyBzdHlsZWxpbnQtZGlzYWJsZS1saW5lIGZ1bmN0aW9uLWRpc2FsbG93ZWQtbGlzdFxcbiAgICBAaW5jbHVkZSBib3JkZXItc3RhcnQtcmFkaXVzKDApO1xcbiAgfVxcblxcbiAgPiAuZm9ybS1mbG9hdGluZzpub3QoOmZpcnN0LWNoaWxkKSA+IC5mb3JtLWNvbnRyb2wsXFxuICA+IC5mb3JtLWZsb2F0aW5nOm5vdCg6Zmlyc3QtY2hpbGQpID4gLmZvcm0tc2VsZWN0IHtcXG4gICAgQGluY2x1ZGUgYm9yZGVyLXN0YXJ0LXJhZGl1cygwKTtcXG4gIH1cXG59XFxuXCIsXCIvLyBUaGlzIG1peGluIHVzZXMgYW4gYGlmKClgIHRlY2huaXF1ZSB0byBiZSBjb21wYXRpYmxlIHdpdGggRGFydCBTYXNzXFxuLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9zYXNzL3Nhc3MvaXNzdWVzLzE4NzMjaXNzdWVjb21tZW50LTE1MjI5MzcyNSBmb3IgbW9yZSBkZXRhaWxzXFxuXFxuLy8gc2Nzcy1kb2NzLXN0YXJ0IGZvcm0tdmFsaWRhdGlvbi1taXhpbnNcXG5AbWl4aW4gZm9ybS12YWxpZGF0aW9uLXN0YXRlLXNlbGVjdG9yKCRzdGF0ZSkge1xcbiAgQGlmICgkc3RhdGUgPT0gXFxcInZhbGlkXFxcIiBvciAkc3RhdGUgPT0gXFxcImludmFsaWRcXFwiKSB7XFxuICAgIC53YXMtdmFsaWRhdGVkICN7aWYoJiwgXFxcIiZcXFwiLCBcXFwiXFxcIil9OiN7JHN0YXRlfSxcXG4gICAgI3tpZigmLCBcXFwiJlxcXCIsIFxcXCJcXFwiKX0uaXMtI3skc3RhdGV9IHtcXG4gICAgICBAY29udGVudDtcXG4gICAgfVxcbiAgfSBAZWxzZSB7XFxuICAgICN7aWYoJiwgXFxcIiZcXFwiLCBcXFwiXFxcIil9LmlzLSN7JHN0YXRlfSB7XFxuICAgICAgQGNvbnRlbnQ7XFxuICAgIH1cXG4gIH1cXG59XFxuXFxuQG1peGluIGZvcm0tdmFsaWRhdGlvbi1zdGF0ZShcXG4gICRzdGF0ZSxcXG4gICRjb2xvcixcXG4gICRpY29uLFxcbiAgJHRvb2x0aXAtY29sb3I6IGNvbG9yLWNvbnRyYXN0KCRjb2xvciksXFxuICAkdG9vbHRpcC1iZy1jb2xvcjogcmdiYSgkY29sb3IsICRmb3JtLWZlZWRiYWNrLXRvb2x0aXAtb3BhY2l0eSksXFxuICAkZm9jdXMtYm94LXNoYWRvdzogMCAwICRpbnB1dC1idG4tZm9jdXMtYmx1ciAkaW5wdXQtZm9jdXMtd2lkdGggcmdiYSgkY29sb3IsICRpbnB1dC1idG4tZm9jdXMtY29sb3Itb3BhY2l0eSksXFxuICAkYm9yZGVyLWNvbG9yOiAkY29sb3JcXG4pIHtcXG4gIC4jeyRzdGF0ZX0tZmVlZGJhY2sge1xcbiAgICBkaXNwbGF5OiBub25lO1xcbiAgICB3aWR0aDogMTAwJTtcXG4gICAgbWFyZ2luLXRvcDogJGZvcm0tZmVlZGJhY2stbWFyZ2luLXRvcDtcXG4gICAgQGluY2x1ZGUgZm9udC1zaXplKCRmb3JtLWZlZWRiYWNrLWZvbnQtc2l6ZSk7XFxuICAgIGZvbnQtc3R5bGU6ICRmb3JtLWZlZWRiYWNrLWZvbnQtc3R5bGU7XFxuICAgIGNvbG9yOiAkY29sb3I7XFxuICB9XFxuXFxuICAuI3skc3RhdGV9LXRvb2x0aXAge1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIHRvcDogMTAwJTtcXG4gICAgei1pbmRleDogNTtcXG4gICAgZGlzcGxheTogbm9uZTtcXG4gICAgbWF4LXdpZHRoOiAxMDAlOyAvLyBDb250YWluIHRvIHBhcmVudCB3aGVuIHBvc3NpYmxlXFxuICAgIHBhZGRpbmc6ICRmb3JtLWZlZWRiYWNrLXRvb2x0aXAtcGFkZGluZy15ICRmb3JtLWZlZWRiYWNrLXRvb2x0aXAtcGFkZGluZy14O1xcbiAgICBtYXJnaW4tdG9wOiAuMXJlbTtcXG4gICAgQGluY2x1ZGUgZm9udC1zaXplKCRmb3JtLWZlZWRiYWNrLXRvb2x0aXAtZm9udC1zaXplKTtcXG4gICAgbGluZS1oZWlnaHQ6ICRmb3JtLWZlZWRiYWNrLXRvb2x0aXAtbGluZS1oZWlnaHQ7XFxuICAgIGNvbG9yOiAkdG9vbHRpcC1jb2xvcjtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogJHRvb2x0aXAtYmctY29sb3I7XFxuICAgIEBpbmNsdWRlIGJvcmRlci1yYWRpdXMoJGZvcm0tZmVlZGJhY2stdG9vbHRpcC1ib3JkZXItcmFkaXVzKTtcXG4gIH1cXG5cXG4gIEBpbmNsdWRlIGZvcm0tdmFsaWRhdGlvbi1zdGF0ZS1zZWxlY3Rvcigkc3RhdGUpIHtcXG4gICAgfiAuI3skc3RhdGV9LWZlZWRiYWNrLFxcbiAgICB+IC4jeyRzdGF0ZX0tdG9vbHRpcCB7XFxuICAgICAgZGlzcGxheTogYmxvY2s7XFxuICAgIH1cXG4gIH1cXG5cXG4gIC5mb3JtLWNvbnRyb2wge1xcbiAgICBAaW5jbHVkZSBmb3JtLXZhbGlkYXRpb24tc3RhdGUtc2VsZWN0b3IoJHN0YXRlKSB7XFxuICAgICAgYm9yZGVyLWNvbG9yOiAkYm9yZGVyLWNvbG9yO1xcblxcbiAgICAgIEBpZiAkZW5hYmxlLXZhbGlkYXRpb24taWNvbnMge1xcbiAgICAgICAgcGFkZGluZy1yaWdodDogJGlucHV0LWhlaWdodC1pbm5lcjtcXG4gICAgICAgIGJhY2tncm91bmQtaW1hZ2U6IGVzY2FwZS1zdmcoJGljb24pO1xcbiAgICAgICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcXG4gICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IHJpZ2h0ICRpbnB1dC1oZWlnaHQtaW5uZXItcXVhcnRlciBjZW50ZXI7XFxuICAgICAgICBiYWNrZ3JvdW5kLXNpemU6ICRpbnB1dC1oZWlnaHQtaW5uZXItaGFsZiAkaW5wdXQtaGVpZ2h0LWlubmVyLWhhbGY7XFxuICAgICAgfVxcblxcbiAgICAgICY6Zm9jdXMge1xcbiAgICAgICAgYm9yZGVyLWNvbG9yOiAkYm9yZGVyLWNvbG9yO1xcbiAgICAgICAgYm94LXNoYWRvdzogJGZvY3VzLWJveC1zaGFkb3c7XFxuICAgICAgfVxcbiAgICB9XFxuICB9XFxuXFxuICAvLyBzdHlsZWxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgc2VsZWN0b3Itbm8tcXVhbGlmeWluZy10eXBlXFxuICB0ZXh0YXJlYS5mb3JtLWNvbnRyb2wge1xcbiAgICBAaW5jbHVkZSBmb3JtLXZhbGlkYXRpb24tc3RhdGUtc2VsZWN0b3IoJHN0YXRlKSB7XFxuICAgICAgQGlmICRlbmFibGUtdmFsaWRhdGlvbi1pY29ucyB7XFxuICAgICAgICBwYWRkaW5nLXJpZ2h0OiAkaW5wdXQtaGVpZ2h0LWlubmVyO1xcbiAgICAgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogdG9wICRpbnB1dC1oZWlnaHQtaW5uZXItcXVhcnRlciByaWdodCAkaW5wdXQtaGVpZ2h0LWlubmVyLXF1YXJ0ZXI7XFxuICAgICAgfVxcbiAgICB9XFxuICB9XFxuXFxuICAuZm9ybS1zZWxlY3Qge1xcbiAgICBAaW5jbHVkZSBmb3JtLXZhbGlkYXRpb24tc3RhdGUtc2VsZWN0b3IoJHN0YXRlKSB7XFxuICAgICAgYm9yZGVyLWNvbG9yOiAkYm9yZGVyLWNvbG9yO1xcblxcbiAgICAgIEBpZiAkZW5hYmxlLXZhbGlkYXRpb24taWNvbnMge1xcbiAgICAgICAgJjpub3QoW211bHRpcGxlXSk6bm90KFtzaXplXSksXFxuICAgICAgICAmOm5vdChbbXVsdGlwbGVdKVtzaXplPVxcXCIxXFxcIl0ge1xcbiAgICAgICAgICAtLSN7JHByZWZpeH1mb3JtLXNlbGVjdC1iZy1pY29uOiAje2VzY2FwZS1zdmcoJGljb24pfTtcXG4gICAgICAgICAgcGFkZGluZy1yaWdodDogJGZvcm0tc2VsZWN0LWZlZWRiYWNrLWljb24tcGFkZGluZy1lbmQ7XFxuICAgICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246ICRmb3JtLXNlbGVjdC1iZy1wb3NpdGlvbiwgJGZvcm0tc2VsZWN0LWZlZWRiYWNrLWljb24tcG9zaXRpb247XFxuICAgICAgICAgIGJhY2tncm91bmQtc2l6ZTogJGZvcm0tc2VsZWN0LWJnLXNpemUsICRmb3JtLXNlbGVjdC1mZWVkYmFjay1pY29uLXNpemU7XFxuICAgICAgICB9XFxuICAgICAgfVxcblxcbiAgICAgICY6Zm9jdXMge1xcbiAgICAgICAgYm9yZGVyLWNvbG9yOiAkYm9yZGVyLWNvbG9yO1xcbiAgICAgICAgYm94LXNoYWRvdzogJGZvY3VzLWJveC1zaGFkb3c7XFxuICAgICAgfVxcbiAgICB9XFxuICB9XFxuXFxuICAuZm9ybS1jb250cm9sLWNvbG9yIHtcXG4gICAgQGluY2x1ZGUgZm9ybS12YWxpZGF0aW9uLXN0YXRlLXNlbGVjdG9yKCRzdGF0ZSkge1xcbiAgICAgIEBpZiAkZW5hYmxlLXZhbGlkYXRpb24taWNvbnMge1xcbiAgICAgICAgd2lkdGg6IGFkZCgkZm9ybS1jb2xvci13aWR0aCwgJGlucHV0LWhlaWdodC1pbm5lcik7XFxuICAgICAgfVxcbiAgICB9XFxuICB9XFxuXFxuICAuZm9ybS1jaGVjay1pbnB1dCB7XFxuICAgIEBpbmNsdWRlIGZvcm0tdmFsaWRhdGlvbi1zdGF0ZS1zZWxlY3Rvcigkc3RhdGUpIHtcXG4gICAgICBib3JkZXItY29sb3I6ICRib3JkZXItY29sb3I7XFxuXFxuICAgICAgJjpjaGVja2VkIHtcXG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICRjb2xvcjtcXG4gICAgICB9XFxuXFxuICAgICAgJjpmb2N1cyB7XFxuICAgICAgICBib3gtc2hhZG93OiAkZm9jdXMtYm94LXNoYWRvdztcXG4gICAgICB9XFxuXFxuICAgICAgfiAuZm9ybS1jaGVjay1sYWJlbCB7XFxuICAgICAgICBjb2xvcjogJGNvbG9yO1xcbiAgICAgIH1cXG4gICAgfVxcbiAgfVxcbiAgLmZvcm0tY2hlY2staW5saW5lIC5mb3JtLWNoZWNrLWlucHV0IHtcXG4gICAgfiAuI3skc3RhdGV9LWZlZWRiYWNrIHtcXG4gICAgICBtYXJnaW4tbGVmdDogLjVlbTtcXG4gICAgfVxcbiAgfVxcblxcbiAgLmlucHV0LWdyb3VwIHtcXG4gICAgPiAuZm9ybS1jb250cm9sOm5vdCg6Zm9jdXMpLFxcbiAgICA+IC5mb3JtLXNlbGVjdDpub3QoOmZvY3VzKSxcXG4gICAgPiAuZm9ybS1mbG9hdGluZzpub3QoOmZvY3VzLXdpdGhpbikge1xcbiAgICAgIEBpbmNsdWRlIGZvcm0tdmFsaWRhdGlvbi1zdGF0ZS1zZWxlY3Rvcigkc3RhdGUpIHtcXG4gICAgICAgIEBpZiAkc3RhdGUgPT0gXFxcInZhbGlkXFxcIiB7XFxuICAgICAgICAgIHotaW5kZXg6IDM7XFxuICAgICAgICB9IEBlbHNlIGlmICRzdGF0ZSA9PSBcXFwiaW52YWxpZFxcXCIge1xcbiAgICAgICAgICB6LWluZGV4OiA0O1xcbiAgICAgICAgfVxcbiAgICAgIH1cXG4gICAgfVxcbiAgfVxcbn1cXG4vLyBzY3NzLWRvY3MtZW5kIGZvcm0tdmFsaWRhdGlvbi1taXhpbnNcXG5cIixcIi8vXFxuLy8gQmFzZSBzdHlsZXNcXG4vL1xcblxcbi5idG4ge1xcbiAgLy8gc2Nzcy1kb2NzLXN0YXJ0IGJ0bi1jc3MtdmFyc1xcbiAgLS0jeyRwcmVmaXh9YnRuLXBhZGRpbmcteDogI3skYnRuLXBhZGRpbmcteH07XFxuICAtLSN7JHByZWZpeH1idG4tcGFkZGluZy15OiAjeyRidG4tcGFkZGluZy15fTtcXG4gIC0tI3skcHJlZml4fWJ0bi1mb250LWZhbWlseTogI3skYnRuLWZvbnQtZmFtaWx5fTtcXG4gIEBpbmNsdWRlIHJmcygkYnRuLWZvbnQtc2l6ZSwgLS0jeyRwcmVmaXh9YnRuLWZvbnQtc2l6ZSk7XFxuICAtLSN7JHByZWZpeH1idG4tZm9udC13ZWlnaHQ6ICN7JGJ0bi1mb250LXdlaWdodH07XFxuICAtLSN7JHByZWZpeH1idG4tbGluZS1oZWlnaHQ6ICN7JGJ0bi1saW5lLWhlaWdodH07XFxuICAtLSN7JHByZWZpeH1idG4tY29sb3I6ICN7JGJ0bi1jb2xvcn07XFxuICAtLSN7JHByZWZpeH1idG4tYmc6IHRyYW5zcGFyZW50O1xcbiAgLS0jeyRwcmVmaXh9YnRuLWJvcmRlci13aWR0aDogI3skYnRuLWJvcmRlci13aWR0aH07XFxuICAtLSN7JHByZWZpeH1idG4tYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDtcXG4gIC0tI3skcHJlZml4fWJ0bi1ib3JkZXItcmFkaXVzOiAjeyRidG4tYm9yZGVyLXJhZGl1c307XFxuICAtLSN7JHByZWZpeH1idG4taG92ZXItYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDtcXG4gIC0tI3skcHJlZml4fWJ0bi1ib3gtc2hhZG93OiAjeyRidG4tYm94LXNoYWRvd307XFxuICAtLSN7JHByZWZpeH1idG4tZGlzYWJsZWQtb3BhY2l0eTogI3skYnRuLWRpc2FibGVkLW9wYWNpdHl9O1xcbiAgLS0jeyRwcmVmaXh9YnRuLWZvY3VzLWJveC1zaGFkb3c6IDAgMCAwICN7JGJ0bi1mb2N1cy13aWR0aH0gcmdiYSh2YXIoLS0jeyRwcmVmaXh9YnRuLWZvY3VzLXNoYWRvdy1yZ2IpLCAuNSk7XFxuICAvLyBzY3NzLWRvY3MtZW5kIGJ0bi1jc3MtdmFyc1xcblxcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgcGFkZGluZzogdmFyKC0tI3skcHJlZml4fWJ0bi1wYWRkaW5nLXkpIHZhcigtLSN7JHByZWZpeH1idG4tcGFkZGluZy14KTtcXG4gIGZvbnQtZmFtaWx5OiB2YXIoLS0jeyRwcmVmaXh9YnRuLWZvbnQtZmFtaWx5KTtcXG4gIEBpbmNsdWRlIGZvbnQtc2l6ZSh2YXIoLS0jeyRwcmVmaXh9YnRuLWZvbnQtc2l6ZSkpO1xcbiAgZm9udC13ZWlnaHQ6IHZhcigtLSN7JHByZWZpeH1idG4tZm9udC13ZWlnaHQpO1xcbiAgbGluZS1oZWlnaHQ6IHZhcigtLSN7JHByZWZpeH1idG4tbGluZS1oZWlnaHQpO1xcbiAgY29sb3I6IHZhcigtLSN7JHByZWZpeH1idG4tY29sb3IpO1xcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbiAgdGV4dC1kZWNvcmF0aW9uOiBpZigkbGluay1kZWNvcmF0aW9uID09IG5vbmUsIG51bGwsIG5vbmUpO1xcbiAgd2hpdGUtc3BhY2U6ICRidG4td2hpdGUtc3BhY2U7XFxuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xcbiAgY3Vyc29yOiBpZigkZW5hYmxlLWJ1dHRvbi1wb2ludGVycywgcG9pbnRlciwgbnVsbCk7XFxuICB1c2VyLXNlbGVjdDogbm9uZTtcXG4gIGJvcmRlcjogdmFyKC0tI3skcHJlZml4fWJ0bi1ib3JkZXItd2lkdGgpIHNvbGlkIHZhcigtLSN7JHByZWZpeH1idG4tYm9yZGVyLWNvbG9yKTtcXG4gIEBpbmNsdWRlIGJvcmRlci1yYWRpdXModmFyKC0tI3skcHJlZml4fWJ0bi1ib3JkZXItcmFkaXVzKSk7XFxuICBAaW5jbHVkZSBncmFkaWVudC1iZyh2YXIoLS0jeyRwcmVmaXh9YnRuLWJnKSk7XFxuICBAaW5jbHVkZSBib3gtc2hhZG93KHZhcigtLSN7JHByZWZpeH1idG4tYm94LXNoYWRvdykpO1xcbiAgQGluY2x1ZGUgdHJhbnNpdGlvbigkYnRuLXRyYW5zaXRpb24pO1xcblxcbiAgJjpob3ZlciB7XFxuICAgIGNvbG9yOiB2YXIoLS0jeyRwcmVmaXh9YnRuLWhvdmVyLWNvbG9yKTtcXG4gICAgdGV4dC1kZWNvcmF0aW9uOiBpZigkbGluay1ob3Zlci1kZWNvcmF0aW9uID09IHVuZGVybGluZSwgbm9uZSwgbnVsbCk7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLSN7JHByZWZpeH1idG4taG92ZXItYmcpO1xcbiAgICBib3JkZXItY29sb3I6IHZhcigtLSN7JHByZWZpeH1idG4taG92ZXItYm9yZGVyLWNvbG9yKTtcXG4gIH1cXG5cXG4gIC5idG4tY2hlY2sgKyAmOmhvdmVyIHtcXG4gICAgLy8gb3ZlcnJpZGUgZm9yIHRoZSBjaGVja2JveC9yYWRpbyBidXR0b25zXFxuICAgIGNvbG9yOiB2YXIoLS0jeyRwcmVmaXh9YnRuLWNvbG9yKTtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tI3skcHJlZml4fWJ0bi1iZyk7XFxuICAgIGJvcmRlci1jb2xvcjogdmFyKC0tI3skcHJlZml4fWJ0bi1ib3JkZXItY29sb3IpO1xcbiAgfVxcblxcbiAgJjpmb2N1cy12aXNpYmxlIHtcXG4gICAgY29sb3I6IHZhcigtLSN7JHByZWZpeH1idG4taG92ZXItY29sb3IpO1xcbiAgICBAaW5jbHVkZSBncmFkaWVudC1iZyh2YXIoLS0jeyRwcmVmaXh9YnRuLWhvdmVyLWJnKSk7XFxuICAgIGJvcmRlci1jb2xvcjogdmFyKC0tI3skcHJlZml4fWJ0bi1ob3Zlci1ib3JkZXItY29sb3IpO1xcbiAgICBvdXRsaW5lOiAwO1xcbiAgICAvLyBBdm9pZCB1c2luZyBtaXhpbiBzbyB3ZSBjYW4gcGFzcyBjdXN0b20gZm9jdXMgc2hhZG93IHByb3Blcmx5XFxuICAgIEBpZiAkZW5hYmxlLXNoYWRvd3Mge1xcbiAgICAgIGJveC1zaGFkb3c6IHZhcigtLSN7JHByZWZpeH1idG4tYm94LXNoYWRvdyksIHZhcigtLSN7JHByZWZpeH1idG4tZm9jdXMtYm94LXNoYWRvdyk7XFxuICAgIH0gQGVsc2Uge1xcbiAgICAgIGJveC1zaGFkb3c6IHZhcigtLSN7JHByZWZpeH1idG4tZm9jdXMtYm94LXNoYWRvdyk7XFxuICAgIH1cXG4gIH1cXG5cXG4gIC5idG4tY2hlY2s6Zm9jdXMtdmlzaWJsZSArICYge1xcbiAgICBib3JkZXItY29sb3I6IHZhcigtLSN7JHByZWZpeH1idG4taG92ZXItYm9yZGVyLWNvbG9yKTtcXG4gICAgb3V0bGluZTogMDtcXG4gICAgLy8gQXZvaWQgdXNpbmcgbWl4aW4gc28gd2UgY2FuIHBhc3MgY3VzdG9tIGZvY3VzIHNoYWRvdyBwcm9wZXJseVxcbiAgICBAaWYgJGVuYWJsZS1zaGFkb3dzIHtcXG4gICAgICBib3gtc2hhZG93OiB2YXIoLS0jeyRwcmVmaXh9YnRuLWJveC1zaGFkb3cpLCB2YXIoLS0jeyRwcmVmaXh9YnRuLWZvY3VzLWJveC1zaGFkb3cpO1xcbiAgICB9IEBlbHNlIHtcXG4gICAgICBib3gtc2hhZG93OiB2YXIoLS0jeyRwcmVmaXh9YnRuLWZvY3VzLWJveC1zaGFkb3cpO1xcbiAgICB9XFxuICB9XFxuXFxuICAuYnRuLWNoZWNrOmNoZWNrZWQgKyAmLFxcbiAgOm5vdCguYnRuLWNoZWNrKSArICY6YWN0aXZlLFxcbiAgJjpmaXJzdC1jaGlsZDphY3RpdmUsXFxuICAmLmFjdGl2ZSxcXG4gICYuc2hvdyB7XFxuICAgIGNvbG9yOiB2YXIoLS0jeyRwcmVmaXh9YnRuLWFjdGl2ZS1jb2xvcik7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLSN7JHByZWZpeH1idG4tYWN0aXZlLWJnKTtcXG4gICAgLy8gUmVtb3ZlIENTUyBncmFkaWVudHMgaWYgdGhleSdyZSBlbmFibGVkXFxuICAgIGJhY2tncm91bmQtaW1hZ2U6IGlmKCRlbmFibGUtZ3JhZGllbnRzLCBub25lLCBudWxsKTtcXG4gICAgYm9yZGVyLWNvbG9yOiB2YXIoLS0jeyRwcmVmaXh9YnRuLWFjdGl2ZS1ib3JkZXItY29sb3IpO1xcbiAgICBAaW5jbHVkZSBib3gtc2hhZG93KHZhcigtLSN7JHByZWZpeH1idG4tYWN0aXZlLXNoYWRvdykpO1xcblxcbiAgICAmOmZvY3VzLXZpc2libGUge1xcbiAgICAgIC8vIEF2b2lkIHVzaW5nIG1peGluIHNvIHdlIGNhbiBwYXNzIGN1c3RvbSBmb2N1cyBzaGFkb3cgcHJvcGVybHlcXG4gICAgICBAaWYgJGVuYWJsZS1zaGFkb3dzIHtcXG4gICAgICAgIGJveC1zaGFkb3c6IHZhcigtLSN7JHByZWZpeH1idG4tYWN0aXZlLXNoYWRvdyksIHZhcigtLSN7JHByZWZpeH1idG4tZm9jdXMtYm94LXNoYWRvdyk7XFxuICAgICAgfSBAZWxzZSB7XFxuICAgICAgICBib3gtc2hhZG93OiB2YXIoLS0jeyRwcmVmaXh9YnRuLWZvY3VzLWJveC1zaGFkb3cpO1xcbiAgICAgIH1cXG4gICAgfVxcbiAgfVxcblxcbiAgJjpkaXNhYmxlZCxcXG4gICYuZGlzYWJsZWQsXFxuICBmaWVsZHNldDpkaXNhYmxlZCAmIHtcXG4gICAgY29sb3I6IHZhcigtLSN7JHByZWZpeH1idG4tZGlzYWJsZWQtY29sb3IpO1xcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tI3skcHJlZml4fWJ0bi1kaXNhYmxlZC1iZyk7XFxuICAgIGJhY2tncm91bmQtaW1hZ2U6IGlmKCRlbmFibGUtZ3JhZGllbnRzLCBub25lLCBudWxsKTtcXG4gICAgYm9yZGVyLWNvbG9yOiB2YXIoLS0jeyRwcmVmaXh9YnRuLWRpc2FibGVkLWJvcmRlci1jb2xvcik7XFxuICAgIG9wYWNpdHk6IHZhcigtLSN7JHByZWZpeH1idG4tZGlzYWJsZWQtb3BhY2l0eSk7XFxuICAgIEBpbmNsdWRlIGJveC1zaGFkb3cobm9uZSk7XFxuICB9XFxufVxcblxcblxcbi8vXFxuLy8gQWx0ZXJuYXRlIGJ1dHRvbnNcXG4vL1xcblxcbi8vIHNjc3MtZG9jcy1zdGFydCBidG4tdmFyaWFudC1sb29wc1xcbkBlYWNoICRjb2xvciwgJHZhbHVlIGluICR0aGVtZS1jb2xvcnMge1xcbiAgLmJ0bi0jeyRjb2xvcn0ge1xcbiAgICBAaWYgJGNvbG9yID09IFxcXCJsaWdodFxcXCIge1xcbiAgICAgIEBpbmNsdWRlIGJ1dHRvbi12YXJpYW50KFxcbiAgICAgICAgJHZhbHVlLFxcbiAgICAgICAgJHZhbHVlLFxcbiAgICAgICAgJGhvdmVyLWJhY2tncm91bmQ6IHNoYWRlLWNvbG9yKCR2YWx1ZSwgJGJ0bi1ob3Zlci1iZy1zaGFkZS1hbW91bnQpLFxcbiAgICAgICAgJGhvdmVyLWJvcmRlcjogc2hhZGUtY29sb3IoJHZhbHVlLCAkYnRuLWhvdmVyLWJvcmRlci1zaGFkZS1hbW91bnQpLFxcbiAgICAgICAgJGFjdGl2ZS1iYWNrZ3JvdW5kOiBzaGFkZS1jb2xvcigkdmFsdWUsICRidG4tYWN0aXZlLWJnLXNoYWRlLWFtb3VudCksXFxuICAgICAgICAkYWN0aXZlLWJvcmRlcjogc2hhZGUtY29sb3IoJHZhbHVlLCAkYnRuLWFjdGl2ZS1ib3JkZXItc2hhZGUtYW1vdW50KVxcbiAgICAgICk7XFxuICAgIH0gQGVsc2UgaWYgJGNvbG9yID09IFxcXCJkYXJrXFxcIiB7XFxuICAgICAgQGluY2x1ZGUgYnV0dG9uLXZhcmlhbnQoXFxuICAgICAgICAkdmFsdWUsXFxuICAgICAgICAkdmFsdWUsXFxuICAgICAgICAkaG92ZXItYmFja2dyb3VuZDogdGludC1jb2xvcigkdmFsdWUsICRidG4taG92ZXItYmctdGludC1hbW91bnQpLFxcbiAgICAgICAgJGhvdmVyLWJvcmRlcjogdGludC1jb2xvcigkdmFsdWUsICRidG4taG92ZXItYm9yZGVyLXRpbnQtYW1vdW50KSxcXG4gICAgICAgICRhY3RpdmUtYmFja2dyb3VuZDogdGludC1jb2xvcigkdmFsdWUsICRidG4tYWN0aXZlLWJnLXRpbnQtYW1vdW50KSxcXG4gICAgICAgICRhY3RpdmUtYm9yZGVyOiB0aW50LWNvbG9yKCR2YWx1ZSwgJGJ0bi1hY3RpdmUtYm9yZGVyLXRpbnQtYW1vdW50KVxcbiAgICAgICk7XFxuICAgIH0gQGVsc2Uge1xcbiAgICAgIEBpbmNsdWRlIGJ1dHRvbi12YXJpYW50KCR2YWx1ZSwgJHZhbHVlKTtcXG4gICAgfVxcbiAgfVxcbn1cXG5cXG5AZWFjaCAkY29sb3IsICR2YWx1ZSBpbiAkdGhlbWUtY29sb3JzIHtcXG4gIC5idG4tb3V0bGluZS0jeyRjb2xvcn0ge1xcbiAgICBAaW5jbHVkZSBidXR0b24tb3V0bGluZS12YXJpYW50KCR2YWx1ZSk7XFxuICB9XFxufVxcbi8vIHNjc3MtZG9jcy1lbmQgYnRuLXZhcmlhbnQtbG9vcHNcXG5cXG5cXG4vL1xcbi8vIExpbmsgYnV0dG9uc1xcbi8vXFxuXFxuLy8gTWFrZSBhIGJ1dHRvbiBsb29rIGFuZCBiZWhhdmUgbGlrZSBhIGxpbmtcXG4uYnRuLWxpbmsge1xcbiAgLS0jeyRwcmVmaXh9YnRuLWZvbnQtd2VpZ2h0OiAjeyRmb250LXdlaWdodC1ub3JtYWx9O1xcbiAgLS0jeyRwcmVmaXh9YnRuLWNvbG9yOiAjeyRidG4tbGluay1jb2xvcn07XFxuICAtLSN7JHByZWZpeH1idG4tYmc6IHRyYW5zcGFyZW50O1xcbiAgLS0jeyRwcmVmaXh9YnRuLWJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQ7XFxuICAtLSN7JHByZWZpeH1idG4taG92ZXItY29sb3I6ICN7JGJ0bi1saW5rLWhvdmVyLWNvbG9yfTtcXG4gIC0tI3skcHJlZml4fWJ0bi1ob3Zlci1ib3JkZXItY29sb3I6IHRyYW5zcGFyZW50O1xcbiAgLS0jeyRwcmVmaXh9YnRuLWFjdGl2ZS1jb2xvcjogI3skYnRuLWxpbmstaG92ZXItY29sb3J9O1xcbiAgLS0jeyRwcmVmaXh9YnRuLWFjdGl2ZS1ib3JkZXItY29sb3I6IHRyYW5zcGFyZW50O1xcbiAgLS0jeyRwcmVmaXh9YnRuLWRpc2FibGVkLWNvbG9yOiAjeyRidG4tbGluay1kaXNhYmxlZC1jb2xvcn07XFxuICAtLSN7JHByZWZpeH1idG4tZGlzYWJsZWQtYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDtcXG4gIC0tI3skcHJlZml4fWJ0bi1ib3gtc2hhZG93OiAwIDAgMCAjMDAwOyAvLyBDYW4ndCB1c2UgYG5vbmVgIGFzIGtleXdvcmQgbmVnYXRlcyBhbGwgdmFsdWVzIHdoZW4gdXNlZCB3aXRoIG11bHRpcGxlIHNoYWRvd3NcXG4gIC0tI3skcHJlZml4fWJ0bi1mb2N1cy1zaGFkb3ctcmdiOiAjeyRidG4tbGluay1mb2N1cy1zaGFkb3ctcmdifTtcXG5cXG4gIHRleHQtZGVjb3JhdGlvbjogJGxpbmstZGVjb3JhdGlvbjtcXG4gIEBpZiAkZW5hYmxlLWdyYWRpZW50cyB7XFxuICAgIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7XFxuICB9XFxuXFxuICAmOmhvdmVyLFxcbiAgJjpmb2N1cy12aXNpYmxlIHtcXG4gICAgdGV4dC1kZWNvcmF0aW9uOiAkbGluay1ob3Zlci1kZWNvcmF0aW9uO1xcbiAgfVxcblxcbiAgJjpmb2N1cy12aXNpYmxlIHtcXG4gICAgY29sb3I6IHZhcigtLSN7JHByZWZpeH1idG4tY29sb3IpO1xcbiAgfVxcblxcbiAgJjpob3ZlciB7XFxuICAgIGNvbG9yOiB2YXIoLS0jeyRwcmVmaXh9YnRuLWhvdmVyLWNvbG9yKTtcXG4gIH1cXG5cXG4gIC8vIE5vIG5lZWQgZm9yIGFuIGFjdGl2ZSBzdGF0ZSBoZXJlXFxufVxcblxcblxcbi8vXFxuLy8gQnV0dG9uIFNpemVzXFxuLy9cXG5cXG4uYnRuLWxnIHtcXG4gIEBpbmNsdWRlIGJ1dHRvbi1zaXplKCRidG4tcGFkZGluZy15LWxnLCAkYnRuLXBhZGRpbmcteC1sZywgJGJ0bi1mb250LXNpemUtbGcsICRidG4tYm9yZGVyLXJhZGl1cy1sZyk7XFxufVxcblxcbi5idG4tc20ge1xcbiAgQGluY2x1ZGUgYnV0dG9uLXNpemUoJGJ0bi1wYWRkaW5nLXktc20sICRidG4tcGFkZGluZy14LXNtLCAkYnRuLWZvbnQtc2l6ZS1zbSwgJGJ0bi1ib3JkZXItcmFkaXVzLXNtKTtcXG59XFxuXCIsXCIvLyBCdXR0b24gdmFyaWFudHNcXG4vL1xcbi8vIEVhc2lseSBwdW1wIG91dCBkZWZhdWx0IHN0eWxlcywgYXMgd2VsbCBhcyA6aG92ZXIsIDpmb2N1cywgOmFjdGl2ZSxcXG4vLyBhbmQgZGlzYWJsZWQgb3B0aW9ucyBmb3IgYWxsIGJ1dHRvbnNcXG5cXG4vLyBzY3NzLWRvY3Mtc3RhcnQgYnRuLXZhcmlhbnQtbWl4aW5cXG5AbWl4aW4gYnV0dG9uLXZhcmlhbnQoXFxuICAkYmFja2dyb3VuZCxcXG4gICRib3JkZXIsXFxuICAkY29sb3I6IGNvbG9yLWNvbnRyYXN0KCRiYWNrZ3JvdW5kKSxcXG4gICRob3Zlci1iYWNrZ3JvdW5kOiBpZigkY29sb3IgPT0gJGNvbG9yLWNvbnRyYXN0LWxpZ2h0LCBzaGFkZS1jb2xvcigkYmFja2dyb3VuZCwgJGJ0bi1ob3Zlci1iZy1zaGFkZS1hbW91bnQpLCB0aW50LWNvbG9yKCRiYWNrZ3JvdW5kLCAkYnRuLWhvdmVyLWJnLXRpbnQtYW1vdW50KSksXFxuICAkaG92ZXItYm9yZGVyOiBpZigkY29sb3IgPT0gJGNvbG9yLWNvbnRyYXN0LWxpZ2h0LCBzaGFkZS1jb2xvcigkYm9yZGVyLCAkYnRuLWhvdmVyLWJvcmRlci1zaGFkZS1hbW91bnQpLCB0aW50LWNvbG9yKCRib3JkZXIsICRidG4taG92ZXItYm9yZGVyLXRpbnQtYW1vdW50KSksXFxuICAkaG92ZXItY29sb3I6IGNvbG9yLWNvbnRyYXN0KCRob3Zlci1iYWNrZ3JvdW5kKSxcXG4gICRhY3RpdmUtYmFja2dyb3VuZDogaWYoJGNvbG9yID09ICRjb2xvci1jb250cmFzdC1saWdodCwgc2hhZGUtY29sb3IoJGJhY2tncm91bmQsICRidG4tYWN0aXZlLWJnLXNoYWRlLWFtb3VudCksIHRpbnQtY29sb3IoJGJhY2tncm91bmQsICRidG4tYWN0aXZlLWJnLXRpbnQtYW1vdW50KSksXFxuICAkYWN0aXZlLWJvcmRlcjogaWYoJGNvbG9yID09ICRjb2xvci1jb250cmFzdC1saWdodCwgc2hhZGUtY29sb3IoJGJvcmRlciwgJGJ0bi1hY3RpdmUtYm9yZGVyLXNoYWRlLWFtb3VudCksIHRpbnQtY29sb3IoJGJvcmRlciwgJGJ0bi1hY3RpdmUtYm9yZGVyLXRpbnQtYW1vdW50KSksXFxuICAkYWN0aXZlLWNvbG9yOiBjb2xvci1jb250cmFzdCgkYWN0aXZlLWJhY2tncm91bmQpLFxcbiAgJGRpc2FibGVkLWJhY2tncm91bmQ6ICRiYWNrZ3JvdW5kLFxcbiAgJGRpc2FibGVkLWJvcmRlcjogJGJvcmRlcixcXG4gICRkaXNhYmxlZC1jb2xvcjogY29sb3ItY29udHJhc3QoJGRpc2FibGVkLWJhY2tncm91bmQpXFxuKSB7XFxuICAtLSN7JHByZWZpeH1idG4tY29sb3I6ICN7JGNvbG9yfTtcXG4gIC0tI3skcHJlZml4fWJ0bi1iZzogI3skYmFja2dyb3VuZH07XFxuICAtLSN7JHByZWZpeH1idG4tYm9yZGVyLWNvbG9yOiAjeyRib3JkZXJ9O1xcbiAgLS0jeyRwcmVmaXh9YnRuLWhvdmVyLWNvbG9yOiAjeyRob3Zlci1jb2xvcn07XFxuICAtLSN7JHByZWZpeH1idG4taG92ZXItYmc6ICN7JGhvdmVyLWJhY2tncm91bmR9O1xcbiAgLS0jeyRwcmVmaXh9YnRuLWhvdmVyLWJvcmRlci1jb2xvcjogI3skaG92ZXItYm9yZGVyfTtcXG4gIC0tI3skcHJlZml4fWJ0bi1mb2N1cy1zaGFkb3ctcmdiOiAje3RvLXJnYihtaXgoJGNvbG9yLCAkYm9yZGVyLCAxNSUpKX07XFxuICAtLSN7JHByZWZpeH1idG4tYWN0aXZlLWNvbG9yOiAjeyRhY3RpdmUtY29sb3J9O1xcbiAgLS0jeyRwcmVmaXh9YnRuLWFjdGl2ZS1iZzogI3skYWN0aXZlLWJhY2tncm91bmR9O1xcbiAgLS0jeyRwcmVmaXh9YnRuLWFjdGl2ZS1ib3JkZXItY29sb3I6ICN7JGFjdGl2ZS1ib3JkZXJ9O1xcbiAgLS0jeyRwcmVmaXh9YnRuLWFjdGl2ZS1zaGFkb3c6ICN7JGJ0bi1hY3RpdmUtYm94LXNoYWRvd307XFxuICAtLSN7JHByZWZpeH1idG4tZGlzYWJsZWQtY29sb3I6ICN7JGRpc2FibGVkLWNvbG9yfTtcXG4gIC0tI3skcHJlZml4fWJ0bi1kaXNhYmxlZC1iZzogI3skZGlzYWJsZWQtYmFja2dyb3VuZH07XFxuICAtLSN7JHByZWZpeH1idG4tZGlzYWJsZWQtYm9yZGVyLWNvbG9yOiAjeyRkaXNhYmxlZC1ib3JkZXJ9O1xcbn1cXG4vLyBzY3NzLWRvY3MtZW5kIGJ0bi12YXJpYW50LW1peGluXFxuXFxuLy8gc2Nzcy1kb2NzLXN0YXJ0IGJ0bi1vdXRsaW5lLXZhcmlhbnQtbWl4aW5cXG5AbWl4aW4gYnV0dG9uLW91dGxpbmUtdmFyaWFudChcXG4gICRjb2xvcixcXG4gICRjb2xvci1ob3ZlcjogY29sb3ItY29udHJhc3QoJGNvbG9yKSxcXG4gICRhY3RpdmUtYmFja2dyb3VuZDogJGNvbG9yLFxcbiAgJGFjdGl2ZS1ib3JkZXI6ICRjb2xvcixcXG4gICRhY3RpdmUtY29sb3I6IGNvbG9yLWNvbnRyYXN0KCRhY3RpdmUtYmFja2dyb3VuZClcXG4pIHtcXG4gIC0tI3skcHJlZml4fWJ0bi1jb2xvcjogI3skY29sb3J9O1xcbiAgLS0jeyRwcmVmaXh9YnRuLWJvcmRlci1jb2xvcjogI3skY29sb3J9O1xcbiAgLS0jeyRwcmVmaXh9YnRuLWhvdmVyLWNvbG9yOiAjeyRjb2xvci1ob3Zlcn07XFxuICAtLSN7JHByZWZpeH1idG4taG92ZXItYmc6ICN7JGFjdGl2ZS1iYWNrZ3JvdW5kfTtcXG4gIC0tI3skcHJlZml4fWJ0bi1ob3Zlci1ib3JkZXItY29sb3I6ICN7JGFjdGl2ZS1ib3JkZXJ9O1xcbiAgLS0jeyRwcmVmaXh9YnRuLWZvY3VzLXNoYWRvdy1yZ2I6ICN7dG8tcmdiKCRjb2xvcil9O1xcbiAgLS0jeyRwcmVmaXh9YnRuLWFjdGl2ZS1jb2xvcjogI3skYWN0aXZlLWNvbG9yfTtcXG4gIC0tI3skcHJlZml4fWJ0bi1hY3RpdmUtYmc6ICN7JGFjdGl2ZS1iYWNrZ3JvdW5kfTtcXG4gIC0tI3skcHJlZml4fWJ0bi1hY3RpdmUtYm9yZGVyLWNvbG9yOiAjeyRhY3RpdmUtYm9yZGVyfTtcXG4gIC0tI3skcHJlZml4fWJ0bi1hY3RpdmUtc2hhZG93OiAjeyRidG4tYWN0aXZlLWJveC1zaGFkb3d9O1xcbiAgLS0jeyRwcmVmaXh9YnRuLWRpc2FibGVkLWNvbG9yOiAjeyRjb2xvcn07XFxuICAtLSN7JHByZWZpeH1idG4tZGlzYWJsZWQtYmc6IHRyYW5zcGFyZW50O1xcbiAgLS0jeyRwcmVmaXh9YnRuLWRpc2FibGVkLWJvcmRlci1jb2xvcjogI3skY29sb3J9O1xcbiAgLS0jeyRwcmVmaXh9Z3JhZGllbnQ6IG5vbmU7XFxufVxcbi8vIHNjc3MtZG9jcy1lbmQgYnRuLW91dGxpbmUtdmFyaWFudC1taXhpblxcblxcbi8vIHNjc3MtZG9jcy1zdGFydCBidG4tc2l6ZS1taXhpblxcbkBtaXhpbiBidXR0b24tc2l6ZSgkcGFkZGluZy15LCAkcGFkZGluZy14LCAkZm9udC1zaXplLCAkYm9yZGVyLXJhZGl1cykge1xcbiAgLS0jeyRwcmVmaXh9YnRuLXBhZGRpbmcteTogI3skcGFkZGluZy15fTtcXG4gIC0tI3skcHJlZml4fWJ0bi1wYWRkaW5nLXg6ICN7JHBhZGRpbmcteH07XFxuICBAaW5jbHVkZSByZnMoJGZvbnQtc2l6ZSwgLS0jeyRwcmVmaXh9YnRuLWZvbnQtc2l6ZSk7XFxuICAtLSN7JHByZWZpeH1idG4tYm9yZGVyLXJhZGl1czogI3skYm9yZGVyLXJhZGl1c307XFxufVxcbi8vIHNjc3MtZG9jcy1lbmQgYnRuLXNpemUtbWl4aW5cXG5cIixcIi5mYWRlIHtcXG4gIEBpbmNsdWRlIHRyYW5zaXRpb24oJHRyYW5zaXRpb24tZmFkZSk7XFxuXFxuICAmOm5vdCguc2hvdykge1xcbiAgICBvcGFjaXR5OiAwO1xcbiAgfVxcbn1cXG5cXG4vLyBzY3NzLWRvY3Mtc3RhcnQgY29sbGFwc2UtY2xhc3Nlc1xcbi5jb2xsYXBzZSB7XFxuICAmOm5vdCguc2hvdykge1xcbiAgICBkaXNwbGF5OiBub25lO1xcbiAgfVxcbn1cXG5cXG4uY29sbGFwc2luZyB7XFxuICBoZWlnaHQ6IDA7XFxuICBvdmVyZmxvdzogaGlkZGVuO1xcbiAgQGluY2x1ZGUgdHJhbnNpdGlvbigkdHJhbnNpdGlvbi1jb2xsYXBzZSk7XFxuXFxuICAmLmNvbGxhcHNlLWhvcml6b250YWwge1xcbiAgICB3aWR0aDogMDtcXG4gICAgaGVpZ2h0OiBhdXRvO1xcbiAgICBAaW5jbHVkZSB0cmFuc2l0aW9uKCR0cmFuc2l0aW9uLWNvbGxhcHNlLXdpZHRoKTtcXG4gIH1cXG59XFxuLy8gc2Nzcy1kb2NzLWVuZCBjb2xsYXBzZS1jbGFzc2VzXFxuXCIsXCIvLyBUaGUgZHJvcGRvd24gd3JhcHBlciAoYDxkaXY+YClcXG4uZHJvcHVwLFxcbi5kcm9wZW5kLFxcbi5kcm9wZG93bixcXG4uZHJvcHN0YXJ0LFxcbi5kcm9wdXAtY2VudGVyLFxcbi5kcm9wZG93bi1jZW50ZXIge1xcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcbn1cXG5cXG4uZHJvcGRvd24tdG9nZ2xlIHtcXG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxuXFxuICAvLyBHZW5lcmF0ZSB0aGUgY2FyZXQgYXV0b21hdGljYWxseVxcbiAgQGluY2x1ZGUgY2FyZXQoKTtcXG59XFxuXFxuLy8gVGhlIGRyb3Bkb3duIG1lbnVcXG4uZHJvcGRvd24tbWVudSB7XFxuICAvLyBzY3NzLWRvY3Mtc3RhcnQgZHJvcGRvd24tY3NzLXZhcnNcXG4gIC0tI3skcHJlZml4fWRyb3Bkb3duLXppbmRleDogI3skemluZGV4LWRyb3Bkb3dufTtcXG4gIC0tI3skcHJlZml4fWRyb3Bkb3duLW1pbi13aWR0aDogI3skZHJvcGRvd24tbWluLXdpZHRofTtcXG4gIC0tI3skcHJlZml4fWRyb3Bkb3duLXBhZGRpbmcteDogI3skZHJvcGRvd24tcGFkZGluZy14fTtcXG4gIC0tI3skcHJlZml4fWRyb3Bkb3duLXBhZGRpbmcteTogI3skZHJvcGRvd24tcGFkZGluZy15fTtcXG4gIC0tI3skcHJlZml4fWRyb3Bkb3duLXNwYWNlcjogI3skZHJvcGRvd24tc3BhY2VyfTtcXG4gIEBpbmNsdWRlIHJmcygkZHJvcGRvd24tZm9udC1zaXplLCAtLSN7JHByZWZpeH1kcm9wZG93bi1mb250LXNpemUpO1xcbiAgLS0jeyRwcmVmaXh9ZHJvcGRvd24tY29sb3I6ICN7JGRyb3Bkb3duLWNvbG9yfTtcXG4gIC0tI3skcHJlZml4fWRyb3Bkb3duLWJnOiAjeyRkcm9wZG93bi1iZ307XFxuICAtLSN7JHByZWZpeH1kcm9wZG93bi1ib3JkZXItY29sb3I6ICN7JGRyb3Bkb3duLWJvcmRlci1jb2xvcn07XFxuICAtLSN7JHByZWZpeH1kcm9wZG93bi1ib3JkZXItcmFkaXVzOiAjeyRkcm9wZG93bi1ib3JkZXItcmFkaXVzfTtcXG4gIC0tI3skcHJlZml4fWRyb3Bkb3duLWJvcmRlci13aWR0aDogI3skZHJvcGRvd24tYm9yZGVyLXdpZHRofTtcXG4gIC0tI3skcHJlZml4fWRyb3Bkb3duLWlubmVyLWJvcmRlci1yYWRpdXM6ICN7JGRyb3Bkb3duLWlubmVyLWJvcmRlci1yYWRpdXN9O1xcbiAgLS0jeyRwcmVmaXh9ZHJvcGRvd24tZGl2aWRlci1iZzogI3skZHJvcGRvd24tZGl2aWRlci1iZ307XFxuICAtLSN7JHByZWZpeH1kcm9wZG93bi1kaXZpZGVyLW1hcmdpbi15OiAjeyRkcm9wZG93bi1kaXZpZGVyLW1hcmdpbi15fTtcXG4gIC0tI3skcHJlZml4fWRyb3Bkb3duLWJveC1zaGFkb3c6ICN7JGRyb3Bkb3duLWJveC1zaGFkb3d9O1xcbiAgLS0jeyRwcmVmaXh9ZHJvcGRvd24tbGluay1jb2xvcjogI3skZHJvcGRvd24tbGluay1jb2xvcn07XFxuICAtLSN7JHByZWZpeH1kcm9wZG93bi1saW5rLWhvdmVyLWNvbG9yOiAjeyRkcm9wZG93bi1saW5rLWhvdmVyLWNvbG9yfTtcXG4gIC0tI3skcHJlZml4fWRyb3Bkb3duLWxpbmstaG92ZXItYmc6ICN7JGRyb3Bkb3duLWxpbmstaG92ZXItYmd9O1xcbiAgLS0jeyRwcmVmaXh9ZHJvcGRvd24tbGluay1hY3RpdmUtY29sb3I6ICN7JGRyb3Bkb3duLWxpbmstYWN0aXZlLWNvbG9yfTtcXG4gIC0tI3skcHJlZml4fWRyb3Bkb3duLWxpbmstYWN0aXZlLWJnOiAjeyRkcm9wZG93bi1saW5rLWFjdGl2ZS1iZ307XFxuICAtLSN7JHByZWZpeH1kcm9wZG93bi1saW5rLWRpc2FibGVkLWNvbG9yOiAjeyRkcm9wZG93bi1saW5rLWRpc2FibGVkLWNvbG9yfTtcXG4gIC0tI3skcHJlZml4fWRyb3Bkb3duLWl0ZW0tcGFkZGluZy14OiAjeyRkcm9wZG93bi1pdGVtLXBhZGRpbmcteH07XFxuICAtLSN7JHByZWZpeH1kcm9wZG93bi1pdGVtLXBhZGRpbmcteTogI3skZHJvcGRvd24taXRlbS1wYWRkaW5nLXl9O1xcbiAgLS0jeyRwcmVmaXh9ZHJvcGRvd24taGVhZGVyLWNvbG9yOiAjeyRkcm9wZG93bi1oZWFkZXItY29sb3J9O1xcbiAgLS0jeyRwcmVmaXh9ZHJvcGRvd24taGVhZGVyLXBhZGRpbmcteDogI3skZHJvcGRvd24taGVhZGVyLXBhZGRpbmcteH07XFxuICAtLSN7JHByZWZpeH1kcm9wZG93bi1oZWFkZXItcGFkZGluZy15OiAjeyRkcm9wZG93bi1oZWFkZXItcGFkZGluZy15fTtcXG4gIC8vIHNjc3MtZG9jcy1lbmQgZHJvcGRvd24tY3NzLXZhcnNcXG5cXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIHotaW5kZXg6IHZhcigtLSN7JHByZWZpeH1kcm9wZG93bi16aW5kZXgpO1xcbiAgZGlzcGxheTogbm9uZTsgLy8gbm9uZSBieSBkZWZhdWx0LCBidXQgYmxvY2sgb24gXFxcIm9wZW5cXFwiIG9mIHRoZSBtZW51XFxuICBtaW4td2lkdGg6IHZhcigtLSN7JHByZWZpeH1kcm9wZG93bi1taW4td2lkdGgpO1xcbiAgcGFkZGluZzogdmFyKC0tI3skcHJlZml4fWRyb3Bkb3duLXBhZGRpbmcteSkgdmFyKC0tI3skcHJlZml4fWRyb3Bkb3duLXBhZGRpbmcteCk7XFxuICBtYXJnaW46IDA7IC8vIE92ZXJyaWRlIGRlZmF1bHQgbWFyZ2luIG9mIHVsXFxuICBAaW5jbHVkZSBmb250LXNpemUodmFyKC0tI3skcHJlZml4fWRyb3Bkb3duLWZvbnQtc2l6ZSkpO1xcbiAgY29sb3I6IHZhcigtLSN7JHByZWZpeH1kcm9wZG93bi1jb2xvcik7XFxuICB0ZXh0LWFsaWduOiBsZWZ0OyAvLyBFbnN1cmVzIHByb3BlciBhbGlnbm1lbnQgaWYgcGFyZW50IGhhcyBpdCBjaGFuZ2VkIChlLmcuLCBtb2RhbCBmb290ZXIpXFxuICBsaXN0LXN0eWxlOiBub25lO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tI3skcHJlZml4fWRyb3Bkb3duLWJnKTtcXG4gIGJhY2tncm91bmQtY2xpcDogcGFkZGluZy1ib3g7XFxuICBib3JkZXI6IHZhcigtLSN7JHByZWZpeH1kcm9wZG93bi1ib3JkZXItd2lkdGgpIHNvbGlkIHZhcigtLSN7JHByZWZpeH1kcm9wZG93bi1ib3JkZXItY29sb3IpO1xcbiAgQGluY2x1ZGUgYm9yZGVyLXJhZGl1cyh2YXIoLS0jeyRwcmVmaXh9ZHJvcGRvd24tYm9yZGVyLXJhZGl1cykpO1xcbiAgQGluY2x1ZGUgYm94LXNoYWRvdyh2YXIoLS0jeyRwcmVmaXh9ZHJvcGRvd24tYm94LXNoYWRvdykpO1xcblxcbiAgJltkYXRhLWJzLXBvcHBlcl0ge1xcbiAgICB0b3A6IDEwMCU7XFxuICAgIGxlZnQ6IDA7XFxuICAgIG1hcmdpbi10b3A6IHZhcigtLSN7JHByZWZpeH1kcm9wZG93bi1zcGFjZXIpO1xcbiAgfVxcblxcbiAgQGlmICRkcm9wZG93bi1wYWRkaW5nLXkgPT0gMCB7XFxuICAgID4gLmRyb3Bkb3duLWl0ZW06Zmlyc3QtY2hpbGQsXFxuICAgID4gbGk6Zmlyc3QtY2hpbGQgLmRyb3Bkb3duLWl0ZW0ge1xcbiAgICAgIEBpbmNsdWRlIGJvcmRlci10b3AtcmFkaXVzKHZhcigtLSN7JHByZWZpeH1kcm9wZG93bi1pbm5lci1ib3JkZXItcmFkaXVzKSk7XFxuICAgIH1cXG4gICAgPiAuZHJvcGRvd24taXRlbTpsYXN0LWNoaWxkLFxcbiAgICA+IGxpOmxhc3QtY2hpbGQgLmRyb3Bkb3duLWl0ZW0ge1xcbiAgICAgIEBpbmNsdWRlIGJvcmRlci1ib3R0b20tcmFkaXVzKHZhcigtLSN7JHByZWZpeH1kcm9wZG93bi1pbm5lci1ib3JkZXItcmFkaXVzKSk7XFxuICAgIH1cXG5cXG4gIH1cXG59XFxuXFxuLy8gc2Nzcy1kb2NzLXN0YXJ0IHJlc3BvbnNpdmUtYnJlYWtwb2ludHNcXG4vLyBXZSBkZWxpYmVyYXRlbHkgaGFyZGNvZGUgdGhlIGBicy1gIHByZWZpeCBiZWNhdXNlIHdlIGNoZWNrXFxuLy8gdGhpcyBjdXN0b20gcHJvcGVydHkgaW4gSlMgdG8gZGV0ZXJtaW5lIFBvcHBlcidzIHBvc2l0aW9uaW5nXFxuXFxuQGVhY2ggJGJyZWFrcG9pbnQgaW4gbWFwLWtleXMoJGdyaWQtYnJlYWtwb2ludHMpIHtcXG4gIEBpbmNsdWRlIG1lZGlhLWJyZWFrcG9pbnQtdXAoJGJyZWFrcG9pbnQpIHtcXG4gICAgJGluZml4OiBicmVha3BvaW50LWluZml4KCRicmVha3BvaW50LCAkZ3JpZC1icmVha3BvaW50cyk7XFxuXFxuICAgIC5kcm9wZG93bi1tZW51I3skaW5maXh9LXN0YXJ0IHtcXG4gICAgICAtLWJzLXBvc2l0aW9uOiBzdGFydDtcXG5cXG4gICAgICAmW2RhdGEtYnMtcG9wcGVyXSB7XFxuICAgICAgICByaWdodDogYXV0bztcXG4gICAgICAgIGxlZnQ6IDA7XFxuICAgICAgfVxcbiAgICB9XFxuXFxuICAgIC5kcm9wZG93bi1tZW51I3skaW5maXh9LWVuZCB7XFxuICAgICAgLS1icy1wb3NpdGlvbjogZW5kO1xcblxcbiAgICAgICZbZGF0YS1icy1wb3BwZXJdIHtcXG4gICAgICAgIHJpZ2h0OiAwO1xcbiAgICAgICAgbGVmdDogYXV0bztcXG4gICAgICB9XFxuICAgIH1cXG4gIH1cXG59XFxuLy8gc2Nzcy1kb2NzLWVuZCByZXNwb25zaXZlLWJyZWFrcG9pbnRzXFxuXFxuLy8gQWxsb3cgZm9yIGRyb3Bkb3ducyB0byBnbyBib3R0b20gdXAgKGFrYSwgZHJvcHVwLW1lbnUpXFxuLy8gSnVzdCBhZGQgLmRyb3B1cCBhZnRlciB0aGUgc3RhbmRhcmQgLmRyb3Bkb3duIGNsYXNzIGFuZCB5b3UncmUgc2V0Llxcbi5kcm9wdXAge1xcbiAgLmRyb3Bkb3duLW1lbnVbZGF0YS1icy1wb3BwZXJdIHtcXG4gICAgdG9wOiBhdXRvO1xcbiAgICBib3R0b206IDEwMCU7XFxuICAgIG1hcmdpbi10b3A6IDA7XFxuICAgIG1hcmdpbi1ib3R0b206IHZhcigtLSN7JHByZWZpeH1kcm9wZG93bi1zcGFjZXIpO1xcbiAgfVxcblxcbiAgLmRyb3Bkb3duLXRvZ2dsZSB7XFxuICAgIEBpbmNsdWRlIGNhcmV0KHVwKTtcXG4gIH1cXG59XFxuXFxuLmRyb3BlbmQge1xcbiAgLmRyb3Bkb3duLW1lbnVbZGF0YS1icy1wb3BwZXJdIHtcXG4gICAgdG9wOiAwO1xcbiAgICByaWdodDogYXV0bztcXG4gICAgbGVmdDogMTAwJTtcXG4gICAgbWFyZ2luLXRvcDogMDtcXG4gICAgbWFyZ2luLWxlZnQ6IHZhcigtLSN7JHByZWZpeH1kcm9wZG93bi1zcGFjZXIpO1xcbiAgfVxcblxcbiAgLmRyb3Bkb3duLXRvZ2dsZSB7XFxuICAgIEBpbmNsdWRlIGNhcmV0KGVuZCk7XFxuICAgICY6OmFmdGVyIHtcXG4gICAgICB2ZXJ0aWNhbC1hbGlnbjogMDtcXG4gICAgfVxcbiAgfVxcbn1cXG5cXG4uZHJvcHN0YXJ0IHtcXG4gIC5kcm9wZG93bi1tZW51W2RhdGEtYnMtcG9wcGVyXSB7XFxuICAgIHRvcDogMDtcXG4gICAgcmlnaHQ6IDEwMCU7XFxuICAgIGxlZnQ6IGF1dG87XFxuICAgIG1hcmdpbi10b3A6IDA7XFxuICAgIG1hcmdpbi1yaWdodDogdmFyKC0tI3skcHJlZml4fWRyb3Bkb3duLXNwYWNlcik7XFxuICB9XFxuXFxuICAuZHJvcGRvd24tdG9nZ2xlIHtcXG4gICAgQGluY2x1ZGUgY2FyZXQoc3RhcnQpO1xcbiAgICAmOjpiZWZvcmUge1xcbiAgICAgIHZlcnRpY2FsLWFsaWduOiAwO1xcbiAgICB9XFxuICB9XFxufVxcblxcblxcbi8vIERpdmlkZXJzIChiYXNpY2FsbHkgYW4gYDxocj5gKSB3aXRoaW4gdGhlIGRyb3Bkb3duXFxuLmRyb3Bkb3duLWRpdmlkZXIge1xcbiAgaGVpZ2h0OiAwO1xcbiAgbWFyZ2luOiB2YXIoLS0jeyRwcmVmaXh9ZHJvcGRvd24tZGl2aWRlci1tYXJnaW4teSkgMDtcXG4gIG92ZXJmbG93OiBoaWRkZW47XFxuICBib3JkZXItdG9wOiAxcHggc29saWQgdmFyKC0tI3skcHJlZml4fWRyb3Bkb3duLWRpdmlkZXItYmcpO1xcbiAgb3BhY2l0eTogMTsgLy8gUmV2aXNpdCBpbiB2NiB0byBkZS1kdXBlIHN0eWxlcyB0aGF0IGNvbmZsaWN0IHdpdGggPGhyPiBlbGVtZW50XFxufVxcblxcbi8vIExpbmtzLCBidXR0b25zLCBhbmQgbW9yZSB3aXRoaW4gdGhlIGRyb3Bkb3duIG1lbnVcXG4vL1xcbi8vIGA8YnV0dG9uPmAtc3BlY2lmaWMgc3R5bGVzIGFyZSBkZW5vdGVkIHdpdGggYC8vIEZvciA8YnV0dG9uPnNgXFxuLmRyb3Bkb3duLWl0ZW0ge1xcbiAgZGlzcGxheTogYmxvY2s7XFxuICB3aWR0aDogMTAwJTsgLy8gRm9yIGA8YnV0dG9uPmBzXFxuICBwYWRkaW5nOiB2YXIoLS0jeyRwcmVmaXh9ZHJvcGRvd24taXRlbS1wYWRkaW5nLXkpIHZhcigtLSN7JHByZWZpeH1kcm9wZG93bi1pdGVtLXBhZGRpbmcteCk7XFxuICBjbGVhcjogYm90aDtcXG4gIGZvbnQtd2VpZ2h0OiAkZm9udC13ZWlnaHQtbm9ybWFsO1xcbiAgY29sb3I6IHZhcigtLSN7JHByZWZpeH1kcm9wZG93bi1saW5rLWNvbG9yKTtcXG4gIHRleHQtYWxpZ246IGluaGVyaXQ7IC8vIEZvciBgPGJ1dHRvbj5gc1xcbiAgdGV4dC1kZWNvcmF0aW9uOiBpZigkbGluay1kZWNvcmF0aW9uID09IG5vbmUsIG51bGwsIG5vbmUpO1xcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDsgLy8gcHJldmVudCBsaW5rcyBmcm9tIHJhbmRvbWx5IGJyZWFraW5nIG9udG8gbmV3IGxpbmVzXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsgLy8gRm9yIGA8YnV0dG9uPmBzXFxuICBib3JkZXI6IDA7IC8vIEZvciBgPGJ1dHRvbj5gc1xcbiAgQGluY2x1ZGUgYm9yZGVyLXJhZGl1cyh2YXIoLS0jeyRwcmVmaXh9ZHJvcGRvd24taXRlbS1ib3JkZXItcmFkaXVzLCAwKSk7XFxuXFxuICAmOmhvdmVyLFxcbiAgJjpmb2N1cyB7XFxuICAgIGNvbG9yOiB2YXIoLS0jeyRwcmVmaXh9ZHJvcGRvd24tbGluay1ob3Zlci1jb2xvcik7XFxuICAgIHRleHQtZGVjb3JhdGlvbjogaWYoJGxpbmstaG92ZXItZGVjb3JhdGlvbiA9PSB1bmRlcmxpbmUsIG5vbmUsIG51bGwpO1xcbiAgICBAaW5jbHVkZSBncmFkaWVudC1iZyh2YXIoLS0jeyRwcmVmaXh9ZHJvcGRvd24tbGluay1ob3Zlci1iZykpO1xcbiAgfVxcblxcbiAgJi5hY3RpdmUsXFxuICAmOmFjdGl2ZSB7XFxuICAgIGNvbG9yOiB2YXIoLS0jeyRwcmVmaXh9ZHJvcGRvd24tbGluay1hY3RpdmUtY29sb3IpO1xcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XFxuICAgIEBpbmNsdWRlIGdyYWRpZW50LWJnKHZhcigtLSN7JHByZWZpeH1kcm9wZG93bi1saW5rLWFjdGl2ZS1iZykpO1xcbiAgfVxcblxcbiAgJi5kaXNhYmxlZCxcXG4gICY6ZGlzYWJsZWQge1xcbiAgICBjb2xvcjogdmFyKC0tI3skcHJlZml4fWRyb3Bkb3duLWxpbmstZGlzYWJsZWQtY29sb3IpO1xcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XFxuICAgIC8vIFJlbW92ZSBDU1MgZ3JhZGllbnRzIGlmIHRoZXkncmUgZW5hYmxlZFxcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiBpZigkZW5hYmxlLWdyYWRpZW50cywgbm9uZSwgbnVsbCk7XFxuICB9XFxufVxcblxcbi5kcm9wZG93bi1tZW51LnNob3cge1xcbiAgZGlzcGxheTogYmxvY2s7XFxufVxcblxcbi8vIERyb3Bkb3duIHNlY3Rpb24gaGVhZGVyc1xcbi5kcm9wZG93bi1oZWFkZXIge1xcbiAgZGlzcGxheTogYmxvY2s7XFxuICBwYWRkaW5nOiB2YXIoLS0jeyRwcmVmaXh9ZHJvcGRvd24taGVhZGVyLXBhZGRpbmcteSkgdmFyKC0tI3skcHJlZml4fWRyb3Bkb3duLWhlYWRlci1wYWRkaW5nLXgpO1xcbiAgbWFyZ2luLWJvdHRvbTogMDsgLy8gZm9yIHVzZSB3aXRoIGhlYWRpbmcgZWxlbWVudHNcXG4gIEBpbmNsdWRlIGZvbnQtc2l6ZSgkZm9udC1zaXplLXNtKTtcXG4gIGNvbG9yOiB2YXIoLS0jeyRwcmVmaXh9ZHJvcGRvd24taGVhZGVyLWNvbG9yKTtcXG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7IC8vIGFzIHdpdGggPiBsaSA+IGFcXG59XFxuXFxuLy8gRHJvcGRvd24gdGV4dFxcbi5kcm9wZG93bi1pdGVtLXRleHQge1xcbiAgZGlzcGxheTogYmxvY2s7XFxuICBwYWRkaW5nOiB2YXIoLS0jeyRwcmVmaXh9ZHJvcGRvd24taXRlbS1wYWRkaW5nLXkpIHZhcigtLSN7JHByZWZpeH1kcm9wZG93bi1pdGVtLXBhZGRpbmcteCk7XFxuICBjb2xvcjogdmFyKC0tI3skcHJlZml4fWRyb3Bkb3duLWxpbmstY29sb3IpO1xcbn1cXG5cXG4vLyBEYXJrIGRyb3Bkb3duc1xcbi5kcm9wZG93bi1tZW51LWRhcmsge1xcbiAgLy8gc2Nzcy1kb2NzLXN0YXJ0IGRyb3Bkb3duLWRhcmstY3NzLXZhcnNcXG4gIC0tI3skcHJlZml4fWRyb3Bkb3duLWNvbG9yOiAjeyRkcm9wZG93bi1kYXJrLWNvbG9yfTtcXG4gIC0tI3skcHJlZml4fWRyb3Bkb3duLWJnOiAjeyRkcm9wZG93bi1kYXJrLWJnfTtcXG4gIC0tI3skcHJlZml4fWRyb3Bkb3duLWJvcmRlci1jb2xvcjogI3skZHJvcGRvd24tZGFyay1ib3JkZXItY29sb3J9O1xcbiAgLS0jeyRwcmVmaXh9ZHJvcGRvd24tYm94LXNoYWRvdzogI3skZHJvcGRvd24tZGFyay1ib3gtc2hhZG93fTtcXG4gIC0tI3skcHJlZml4fWRyb3Bkb3duLWxpbmstY29sb3I6ICN7JGRyb3Bkb3duLWRhcmstbGluay1jb2xvcn07XFxuICAtLSN7JHByZWZpeH1kcm9wZG93bi1saW5rLWhvdmVyLWNvbG9yOiAjeyRkcm9wZG93bi1kYXJrLWxpbmstaG92ZXItY29sb3J9O1xcbiAgLS0jeyRwcmVmaXh9ZHJvcGRvd24tZGl2aWRlci1iZzogI3skZHJvcGRvd24tZGFyay1kaXZpZGVyLWJnfTtcXG4gIC0tI3skcHJlZml4fWRyb3Bkb3duLWxpbmstaG92ZXItYmc6ICN7JGRyb3Bkb3duLWRhcmstbGluay1ob3Zlci1iZ307XFxuICAtLSN7JHByZWZpeH1kcm9wZG93bi1saW5rLWFjdGl2ZS1jb2xvcjogI3skZHJvcGRvd24tZGFyay1saW5rLWFjdGl2ZS1jb2xvcn07XFxuICAtLSN7JHByZWZpeH1kcm9wZG93bi1saW5rLWFjdGl2ZS1iZzogI3skZHJvcGRvd24tZGFyay1saW5rLWFjdGl2ZS1iZ307XFxuICAtLSN7JHByZWZpeH1kcm9wZG93bi1saW5rLWRpc2FibGVkLWNvbG9yOiAjeyRkcm9wZG93bi1kYXJrLWxpbmstZGlzYWJsZWQtY29sb3J9O1xcbiAgLS0jeyRwcmVmaXh9ZHJvcGRvd24taGVhZGVyLWNvbG9yOiAjeyRkcm9wZG93bi1kYXJrLWhlYWRlci1jb2xvcn07XFxuICAvLyBzY3NzLWRvY3MtZW5kIGRyb3Bkb3duLWRhcmstY3NzLXZhcnNcXG59XFxuXCIsXCIvLyBzY3NzLWRvY3Mtc3RhcnQgY2FyZXQtbWl4aW5zXFxuQG1peGluIGNhcmV0LWRvd24oJHdpZHRoOiAkY2FyZXQtd2lkdGgpIHtcXG4gIGJvcmRlci10b3A6ICR3aWR0aCBzb2xpZDtcXG4gIGJvcmRlci1yaWdodDogJHdpZHRoIHNvbGlkIHRyYW5zcGFyZW50O1xcbiAgYm9yZGVyLWJvdHRvbTogMDtcXG4gIGJvcmRlci1sZWZ0OiAkd2lkdGggc29saWQgdHJhbnNwYXJlbnQ7XFxufVxcblxcbkBtaXhpbiBjYXJldC11cCgkd2lkdGg6ICRjYXJldC13aWR0aCkge1xcbiAgYm9yZGVyLXRvcDogMDtcXG4gIGJvcmRlci1yaWdodDogJHdpZHRoIHNvbGlkIHRyYW5zcGFyZW50O1xcbiAgYm9yZGVyLWJvdHRvbTogJHdpZHRoIHNvbGlkO1xcbiAgYm9yZGVyLWxlZnQ6ICR3aWR0aCBzb2xpZCB0cmFuc3BhcmVudDtcXG59XFxuXFxuQG1peGluIGNhcmV0LWVuZCgkd2lkdGg6ICRjYXJldC13aWR0aCkge1xcbiAgYm9yZGVyLXRvcDogJHdpZHRoIHNvbGlkIHRyYW5zcGFyZW50O1xcbiAgYm9yZGVyLXJpZ2h0OiAwO1xcbiAgYm9yZGVyLWJvdHRvbTogJHdpZHRoIHNvbGlkIHRyYW5zcGFyZW50O1xcbiAgYm9yZGVyLWxlZnQ6ICR3aWR0aCBzb2xpZDtcXG59XFxuXFxuQG1peGluIGNhcmV0LXN0YXJ0KCR3aWR0aDogJGNhcmV0LXdpZHRoKSB7XFxuICBib3JkZXItdG9wOiAkd2lkdGggc29saWQgdHJhbnNwYXJlbnQ7XFxuICBib3JkZXItcmlnaHQ6ICR3aWR0aCBzb2xpZDtcXG4gIGJvcmRlci1ib3R0b206ICR3aWR0aCBzb2xpZCB0cmFuc3BhcmVudDtcXG59XFxuXFxuQG1peGluIGNhcmV0KFxcbiAgJGRpcmVjdGlvbjogZG93bixcXG4gICR3aWR0aDogJGNhcmV0LXdpZHRoLFxcbiAgJHNwYWNpbmc6ICRjYXJldC1zcGFjaW5nLFxcbiAgJHZlcnRpY2FsLWFsaWduOiAkY2FyZXQtdmVydGljYWwtYWxpZ25cXG4pIHtcXG4gIEBpZiAkZW5hYmxlLWNhcmV0IHtcXG4gICAgJjo6YWZ0ZXIge1xcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gICAgICBtYXJnaW4tbGVmdDogJHNwYWNpbmc7XFxuICAgICAgdmVydGljYWwtYWxpZ246ICR2ZXJ0aWNhbC1hbGlnbjtcXG4gICAgICBjb250ZW50OiBcXFwiXFxcIjtcXG4gICAgICBAaWYgJGRpcmVjdGlvbiA9PSBkb3duIHtcXG4gICAgICAgIEBpbmNsdWRlIGNhcmV0LWRvd24oJHdpZHRoKTtcXG4gICAgICB9IEBlbHNlIGlmICRkaXJlY3Rpb24gPT0gdXAge1xcbiAgICAgICAgQGluY2x1ZGUgY2FyZXQtdXAoJHdpZHRoKTtcXG4gICAgICB9IEBlbHNlIGlmICRkaXJlY3Rpb24gPT0gZW5kIHtcXG4gICAgICAgIEBpbmNsdWRlIGNhcmV0LWVuZCgkd2lkdGgpO1xcbiAgICAgIH1cXG4gICAgfVxcblxcbiAgICBAaWYgJGRpcmVjdGlvbiA9PSBzdGFydCB7XFxuICAgICAgJjo6YWZ0ZXIge1xcbiAgICAgICAgZGlzcGxheTogbm9uZTtcXG4gICAgICB9XFxuXFxuICAgICAgJjo6YmVmb3JlIHtcXG4gICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gICAgICAgIG1hcmdpbi1yaWdodDogJHNwYWNpbmc7XFxuICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogJHZlcnRpY2FsLWFsaWduO1xcbiAgICAgICAgY29udGVudDogXFxcIlxcXCI7XFxuICAgICAgICBAaW5jbHVkZSBjYXJldC1zdGFydCgkd2lkdGgpO1xcbiAgICAgIH1cXG4gICAgfVxcblxcbiAgICAmOmVtcHR5OjphZnRlciB7XFxuICAgICAgbWFyZ2luLWxlZnQ6IDA7XFxuICAgIH1cXG4gIH1cXG59XFxuLy8gc2Nzcy1kb2NzLWVuZCBjYXJldC1taXhpbnNcXG5cIixcIi8vIE1ha2UgdGhlIGRpdiBiZWhhdmUgbGlrZSBhIGJ1dHRvblxcbi5idG4tZ3JvdXAsXFxuLmJ0bi1ncm91cC12ZXJ0aWNhbCB7XFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcXG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IC8vIG1hdGNoIC5idG4gYWxpZ25tZW50IGdpdmVuIGZvbnQtc2l6ZSBoYWNrIGFib3ZlXFxuXFxuICA+IC5idG4ge1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICAgIGZsZXg6IDEgMSBhdXRvO1xcbiAgfVxcblxcbiAgLy8gQnJpbmcgdGhlIGhvdmVyLCBmb2N1c2VkLCBhbmQgXFxcImFjdGl2ZVxcXCIgYnV0dG9ucyB0byB0aGUgZnJvbnQgdG8gb3ZlcmxheVxcbiAgLy8gdGhlIGJvcmRlcnMgcHJvcGVybHlcXG4gID4gLmJ0bi1jaGVjazpjaGVja2VkICsgLmJ0bixcXG4gID4gLmJ0bi1jaGVjazpmb2N1cyArIC5idG4sXFxuICA+IC5idG46aG92ZXIsXFxuICA+IC5idG46Zm9jdXMsXFxuICA+IC5idG46YWN0aXZlLFxcbiAgPiAuYnRuLmFjdGl2ZSB7XFxuICAgIHotaW5kZXg6IDE7XFxuICB9XFxufVxcblxcbi8vIE9wdGlvbmFsOiBHcm91cCBtdWx0aXBsZSBidXR0b24gZ3JvdXBzIHRvZ2V0aGVyIGZvciBhIHRvb2xiYXJcXG4uYnRuLXRvb2xiYXIge1xcbiAgZGlzcGxheTogZmxleDtcXG4gIGZsZXgtd3JhcDogd3JhcDtcXG4gIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDtcXG5cXG4gIC5pbnB1dC1ncm91cCB7XFxuICAgIHdpZHRoOiBhdXRvO1xcbiAgfVxcbn1cXG5cXG4uYnRuLWdyb3VwIHtcXG4gIEBpbmNsdWRlIGJvcmRlci1yYWRpdXMoJGJ0bi1ib3JkZXItcmFkaXVzKTtcXG5cXG4gIC8vIFByZXZlbnQgZG91YmxlIGJvcmRlcnMgd2hlbiBidXR0b25zIGFyZSBuZXh0IHRvIGVhY2ggb3RoZXJcXG4gID4gOm5vdCguYnRuLWNoZWNrOmZpcnN0LWNoaWxkKSArIC5idG4sXFxuICA+IC5idG4tZ3JvdXA6bm90KDpmaXJzdC1jaGlsZCkge1xcbiAgICBtYXJnaW4tbGVmdDogY2FsYygjeyRidG4tYm9yZGVyLXdpZHRofSAqIC0xKTsgLy8gc3R5bGVsaW50LWRpc2FibGUtbGluZSBmdW5jdGlvbi1kaXNhbGxvd2VkLWxpc3RcXG4gIH1cXG5cXG4gIC8vIFJlc2V0IHJvdW5kZWQgY29ybmVyc1xcbiAgPiAuYnRuOm5vdCg6bGFzdC1jaGlsZCk6bm90KC5kcm9wZG93bi10b2dnbGUpLFxcbiAgPiAuYnRuLmRyb3Bkb3duLXRvZ2dsZS1zcGxpdDpmaXJzdC1jaGlsZCxcXG4gID4gLmJ0bi1ncm91cDpub3QoOmxhc3QtY2hpbGQpID4gLmJ0biB7XFxuICAgIEBpbmNsdWRlIGJvcmRlci1lbmQtcmFkaXVzKDApO1xcbiAgfVxcblxcbiAgLy8gVGhlIGxlZnQgcmFkaXVzIHNob3VsZCBiZSAwIGlmIHRoZSBidXR0b24gaXM6XFxuICAvLyAtIHRoZSBcXFwidGhpcmQgb3IgbW9yZVxcXCIgY2hpbGRcXG4gIC8vIC0gdGhlIHNlY29uZCBjaGlsZCBhbmQgdGhlIHByZXZpb3VzIGVsZW1lbnQgaXNuJ3QgYC5idG4tY2hlY2tgIChtYWtpbmcgaXQgdGhlIGZpcnN0IGNoaWxkIHZpc3VhbGx5KVxcbiAgLy8gLSBwYXJ0IG9mIGEgYnRuLWdyb3VwIHdoaWNoIGlzbid0IHRoZSBmaXJzdCBjaGlsZFxcbiAgPiAuYnRuOm50aC1jaGlsZChuICsgMyksXFxuICA+IDpub3QoLmJ0bi1jaGVjaykgKyAuYnRuLFxcbiAgPiAuYnRuLWdyb3VwOm5vdCg6Zmlyc3QtY2hpbGQpID4gLmJ0biB7XFxuICAgIEBpbmNsdWRlIGJvcmRlci1zdGFydC1yYWRpdXMoMCk7XFxuICB9XFxufVxcblxcbi8vIFNpemluZ1xcbi8vXFxuLy8gUmVtaXggdGhlIGRlZmF1bHQgYnV0dG9uIHNpemluZyBjbGFzc2VzIGludG8gbmV3IG9uZXMgZm9yIGVhc2llciBtYW5pcHVsYXRpb24uXFxuXFxuLmJ0bi1ncm91cC1zbSA+IC5idG4geyBAZXh0ZW5kIC5idG4tc207IH1cXG4uYnRuLWdyb3VwLWxnID4gLmJ0biB7IEBleHRlbmQgLmJ0bi1sZzsgfVxcblxcblxcbi8vXFxuLy8gU3BsaXQgYnV0dG9uIGRyb3Bkb3duc1xcbi8vXFxuXFxuLmRyb3Bkb3duLXRvZ2dsZS1zcGxpdCB7XFxuICBwYWRkaW5nLXJpZ2h0OiAkYnRuLXBhZGRpbmcteCAqIC43NTtcXG4gIHBhZGRpbmctbGVmdDogJGJ0bi1wYWRkaW5nLXggKiAuNzU7XFxuXFxuICAmOjphZnRlcixcXG4gIC5kcm9wdXAgJjo6YWZ0ZXIsXFxuICAuZHJvcGVuZCAmOjphZnRlciB7XFxuICAgIG1hcmdpbi1sZWZ0OiAwO1xcbiAgfVxcblxcbiAgLmRyb3BzdGFydCAmOjpiZWZvcmUge1xcbiAgICBtYXJnaW4tcmlnaHQ6IDA7XFxuICB9XFxufVxcblxcbi5idG4tc20gKyAuZHJvcGRvd24tdG9nZ2xlLXNwbGl0IHtcXG4gIHBhZGRpbmctcmlnaHQ6ICRidG4tcGFkZGluZy14LXNtICogLjc1O1xcbiAgcGFkZGluZy1sZWZ0OiAkYnRuLXBhZGRpbmcteC1zbSAqIC43NTtcXG59XFxuXFxuLmJ0bi1sZyArIC5kcm9wZG93bi10b2dnbGUtc3BsaXQge1xcbiAgcGFkZGluZy1yaWdodDogJGJ0bi1wYWRkaW5nLXgtbGcgKiAuNzU7XFxuICBwYWRkaW5nLWxlZnQ6ICRidG4tcGFkZGluZy14LWxnICogLjc1O1xcbn1cXG5cXG5cXG4vLyBUaGUgY2xpY2thYmxlIGJ1dHRvbiBmb3IgdG9nZ2xpbmcgdGhlIG1lbnVcXG4vLyBTZXQgdGhlIHNhbWUgaW5zZXQgc2hhZG93IGFzIHRoZSA6YWN0aXZlIHN0YXRlXFxuLmJ0bi1ncm91cC5zaG93IC5kcm9wZG93bi10b2dnbGUge1xcbiAgQGluY2x1ZGUgYm94LXNoYWRvdygkYnRuLWFjdGl2ZS1ib3gtc2hhZG93KTtcXG5cXG4gIC8vIFNob3cgbm8gc2hhZG93IGZvciBgLmJ0bi1saW5rYCBzaW5jZSBpdCBoYXMgbm8gb3RoZXIgYnV0dG9uIHN0eWxlcy5cXG4gICYuYnRuLWxpbmsge1xcbiAgICBAaW5jbHVkZSBib3gtc2hhZG93KG5vbmUpO1xcbiAgfVxcbn1cXG5cXG5cXG4vL1xcbi8vIFZlcnRpY2FsIGJ1dHRvbiBncm91cHNcXG4vL1xcblxcbi5idG4tZ3JvdXAtdmVydGljYWwge1xcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcXG4gIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxuXFxuICA+IC5idG4sXFxuICA+IC5idG4tZ3JvdXAge1xcbiAgICB3aWR0aDogMTAwJTtcXG4gIH1cXG5cXG4gID4gLmJ0bjpub3QoOmZpcnN0LWNoaWxkKSxcXG4gID4gLmJ0bi1ncm91cDpub3QoOmZpcnN0LWNoaWxkKSB7XFxuICAgIG1hcmdpbi10b3A6IGNhbGMoI3skYnRuLWJvcmRlci13aWR0aH0gKiAtMSk7IC8vIHN0eWxlbGludC1kaXNhYmxlLWxpbmUgZnVuY3Rpb24tZGlzYWxsb3dlZC1saXN0XFxuICB9XFxuXFxuICAvLyBSZXNldCByb3VuZGVkIGNvcm5lcnNcXG4gID4gLmJ0bjpub3QoOmxhc3QtY2hpbGQpOm5vdCguZHJvcGRvd24tdG9nZ2xlKSxcXG4gID4gLmJ0bi1ncm91cDpub3QoOmxhc3QtY2hpbGQpID4gLmJ0biB7XFxuICAgIEBpbmNsdWRlIGJvcmRlci1ib3R0b20tcmFkaXVzKDApO1xcbiAgfVxcblxcbiAgPiAuYnRuIH4gLmJ0bixcXG4gID4gLmJ0bi1ncm91cDpub3QoOmZpcnN0LWNoaWxkKSA+IC5idG4ge1xcbiAgICBAaW5jbHVkZSBib3JkZXItdG9wLXJhZGl1cygwKTtcXG4gIH1cXG59XFxuXCIsXCIvLyBCYXNlIGNsYXNzXFxuLy9cXG4vLyBLaWNrc3RhcnQgYW55IG5hdmlnYXRpb24gY29tcG9uZW50IHdpdGggYSBzZXQgb2Ygc3R5bGUgcmVzZXRzLiBXb3JrcyB3aXRoXFxuLy8gYDxuYXY+YHMsIGA8dWw+YHMgb3IgYDxvbD5gcy5cXG5cXG4ubmF2IHtcXG4gIC8vIHNjc3MtZG9jcy1zdGFydCBuYXYtY3NzLXZhcnNcXG4gIC0tI3skcHJlZml4fW5hdi1saW5rLXBhZGRpbmcteDogI3skbmF2LWxpbmstcGFkZGluZy14fTtcXG4gIC0tI3skcHJlZml4fW5hdi1saW5rLXBhZGRpbmcteTogI3skbmF2LWxpbmstcGFkZGluZy15fTtcXG4gIEBpbmNsdWRlIHJmcygkbmF2LWxpbmstZm9udC1zaXplLCAtLSN7JHByZWZpeH1uYXYtbGluay1mb250LXNpemUpO1xcbiAgLS0jeyRwcmVmaXh9bmF2LWxpbmstZm9udC13ZWlnaHQ6ICN7JG5hdi1saW5rLWZvbnQtd2VpZ2h0fTtcXG4gIC0tI3skcHJlZml4fW5hdi1saW5rLWNvbG9yOiAjeyRuYXYtbGluay1jb2xvcn07XFxuICAtLSN7JHByZWZpeH1uYXYtbGluay1ob3Zlci1jb2xvcjogI3skbmF2LWxpbmstaG92ZXItY29sb3J9O1xcbiAgLS0jeyRwcmVmaXh9bmF2LWxpbmstZGlzYWJsZWQtY29sb3I6ICN7JG5hdi1saW5rLWRpc2FibGVkLWNvbG9yfTtcXG4gIC8vIHNjc3MtZG9jcy1lbmQgbmF2LWNzcy12YXJzXFxuXFxuICBkaXNwbGF5OiBmbGV4O1xcbiAgZmxleC13cmFwOiB3cmFwO1xcbiAgcGFkZGluZy1sZWZ0OiAwO1xcbiAgbWFyZ2luLWJvdHRvbTogMDtcXG4gIGxpc3Qtc3R5bGU6IG5vbmU7XFxufVxcblxcbi5uYXYtbGluayB7XFxuICBkaXNwbGF5OiBibG9jaztcXG4gIHBhZGRpbmc6IHZhcigtLSN7JHByZWZpeH1uYXYtbGluay1wYWRkaW5nLXkpIHZhcigtLSN7JHByZWZpeH1uYXYtbGluay1wYWRkaW5nLXgpO1xcbiAgQGluY2x1ZGUgZm9udC1zaXplKHZhcigtLSN7JHByZWZpeH1uYXYtbGluay1mb250LXNpemUpKTtcXG4gIGZvbnQtd2VpZ2h0OiB2YXIoLS0jeyRwcmVmaXh9bmF2LWxpbmstZm9udC13ZWlnaHQpO1xcbiAgY29sb3I6IHZhcigtLSN7JHByZWZpeH1uYXYtbGluay1jb2xvcik7XFxuICB0ZXh0LWRlY29yYXRpb246IGlmKCRsaW5rLWRlY29yYXRpb24gPT0gbm9uZSwgbnVsbCwgbm9uZSk7XFxuICBiYWNrZ3JvdW5kOiBub25lO1xcbiAgYm9yZGVyOiAwO1xcbiAgQGluY2x1ZGUgdHJhbnNpdGlvbigkbmF2LWxpbmstdHJhbnNpdGlvbik7XFxuXFxuICAmOmhvdmVyLFxcbiAgJjpmb2N1cyB7XFxuICAgIGNvbG9yOiB2YXIoLS0jeyRwcmVmaXh9bmF2LWxpbmstaG92ZXItY29sb3IpO1xcbiAgICB0ZXh0LWRlY29yYXRpb246IGlmKCRsaW5rLWhvdmVyLWRlY29yYXRpb24gPT0gdW5kZXJsaW5lLCBub25lLCBudWxsKTtcXG4gIH1cXG5cXG4gICY6Zm9jdXMtdmlzaWJsZSB7XFxuICAgIG91dGxpbmU6IDA7XFxuICAgIGJveC1zaGFkb3c6ICRuYXYtbGluay1mb2N1cy1ib3gtc2hhZG93O1xcbiAgfVxcblxcbiAgLy8gRGlzYWJsZWQgc3RhdGUgbGlnaHRlbnMgdGV4dFxcbiAgJi5kaXNhYmxlZCxcXG4gICY6ZGlzYWJsZWQge1xcbiAgICBjb2xvcjogdmFyKC0tI3skcHJlZml4fW5hdi1saW5rLWRpc2FibGVkLWNvbG9yKTtcXG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxuICAgIGN1cnNvcjogZGVmYXVsdDtcXG4gIH1cXG59XFxuXFxuLy9cXG4vLyBUYWJzXFxuLy9cXG5cXG4ubmF2LXRhYnMge1xcbiAgLy8gc2Nzcy1kb2NzLXN0YXJ0IG5hdi10YWJzLWNzcy12YXJzXFxuICAtLSN7JHByZWZpeH1uYXYtdGFicy1ib3JkZXItd2lkdGg6ICN7JG5hdi10YWJzLWJvcmRlci13aWR0aH07XFxuICAtLSN7JHByZWZpeH1uYXYtdGFicy1ib3JkZXItY29sb3I6ICN7JG5hdi10YWJzLWJvcmRlci1jb2xvcn07XFxuICAtLSN7JHByZWZpeH1uYXYtdGFicy1ib3JkZXItcmFkaXVzOiAjeyRuYXYtdGFicy1ib3JkZXItcmFkaXVzfTtcXG4gIC0tI3skcHJlZml4fW5hdi10YWJzLWxpbmstaG92ZXItYm9yZGVyLWNvbG9yOiAjeyRuYXYtdGFicy1saW5rLWhvdmVyLWJvcmRlci1jb2xvcn07XFxuICAtLSN7JHByZWZpeH1uYXYtdGFicy1saW5rLWFjdGl2ZS1jb2xvcjogI3skbmF2LXRhYnMtbGluay1hY3RpdmUtY29sb3J9O1xcbiAgLS0jeyRwcmVmaXh9bmF2LXRhYnMtbGluay1hY3RpdmUtYmc6ICN7JG5hdi10YWJzLWxpbmstYWN0aXZlLWJnfTtcXG4gIC0tI3skcHJlZml4fW5hdi10YWJzLWxpbmstYWN0aXZlLWJvcmRlci1jb2xvcjogI3skbmF2LXRhYnMtbGluay1hY3RpdmUtYm9yZGVyLWNvbG9yfTtcXG4gIC8vIHNjc3MtZG9jcy1lbmQgbmF2LXRhYnMtY3NzLXZhcnNcXG5cXG4gIGJvcmRlci1ib3R0b206IHZhcigtLSN7JHByZWZpeH1uYXYtdGFicy1ib3JkZXItd2lkdGgpIHNvbGlkIHZhcigtLSN7JHByZWZpeH1uYXYtdGFicy1ib3JkZXItY29sb3IpO1xcblxcbiAgLm5hdi1saW5rIHtcXG4gICAgbWFyZ2luLWJvdHRvbTogY2FsYygtMSAqIHZhcigtLSN7JHByZWZpeH1uYXYtdGFicy1ib3JkZXItd2lkdGgpKTsgLy8gc3R5bGVsaW50LWRpc2FibGUtbGluZSBmdW5jdGlvbi1kaXNhbGxvd2VkLWxpc3RcXG4gICAgYm9yZGVyOiB2YXIoLS0jeyRwcmVmaXh9bmF2LXRhYnMtYm9yZGVyLXdpZHRoKSBzb2xpZCB0cmFuc3BhcmVudDtcXG4gICAgQGluY2x1ZGUgYm9yZGVyLXRvcC1yYWRpdXModmFyKC0tI3skcHJlZml4fW5hdi10YWJzLWJvcmRlci1yYWRpdXMpKTtcXG5cXG4gICAgJjpob3ZlcixcXG4gICAgJjpmb2N1cyB7XFxuICAgICAgLy8gUHJldmVudHMgYWN0aXZlIC5uYXYtbGluayB0YWIgb3ZlcmxhcHBpbmcgZm9jdXMgb3V0bGluZSBvZiBwcmV2aW91cy9uZXh0IC5uYXYtbGlua1xcbiAgICAgIGlzb2xhdGlvbjogaXNvbGF0ZTtcXG4gICAgICBib3JkZXItY29sb3I6IHZhcigtLSN7JHByZWZpeH1uYXYtdGFicy1saW5rLWhvdmVyLWJvcmRlci1jb2xvcik7XFxuICAgIH1cXG4gIH1cXG5cXG4gIC5uYXYtbGluay5hY3RpdmUsXFxuICAubmF2LWl0ZW0uc2hvdyAubmF2LWxpbmsge1xcbiAgICBjb2xvcjogdmFyKC0tI3skcHJlZml4fW5hdi10YWJzLWxpbmstYWN0aXZlLWNvbG9yKTtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tI3skcHJlZml4fW5hdi10YWJzLWxpbmstYWN0aXZlLWJnKTtcXG4gICAgYm9yZGVyLWNvbG9yOiB2YXIoLS0jeyRwcmVmaXh9bmF2LXRhYnMtbGluay1hY3RpdmUtYm9yZGVyLWNvbG9yKTtcXG4gIH1cXG5cXG4gIC5kcm9wZG93bi1tZW51IHtcXG4gICAgLy8gTWFrZSBkcm9wZG93biBib3JkZXIgb3ZlcmxhcCB0YWIgYm9yZGVyXFxuICAgIG1hcmdpbi10b3A6IGNhbGMoLTEgKiB2YXIoLS0jeyRwcmVmaXh9bmF2LXRhYnMtYm9yZGVyLXdpZHRoKSk7IC8vIHN0eWxlbGludC1kaXNhYmxlLWxpbmUgZnVuY3Rpb24tZGlzYWxsb3dlZC1saXN0XFxuICAgIC8vIFJlbW92ZSB0aGUgdG9wIHJvdW5kZWQgY29ybmVycyBoZXJlIHNpbmNlIHRoZXJlIGlzIGEgaGFyZCBlZGdlIGFib3ZlIHRoZSBtZW51XFxuICAgIEBpbmNsdWRlIGJvcmRlci10b3AtcmFkaXVzKDApO1xcbiAgfVxcbn1cXG5cXG5cXG4vL1xcbi8vIFBpbGxzXFxuLy9cXG5cXG4ubmF2LXBpbGxzIHtcXG4gIC8vIHNjc3MtZG9jcy1zdGFydCBuYXYtcGlsbHMtY3NzLXZhcnNcXG4gIC0tI3skcHJlZml4fW5hdi1waWxscy1ib3JkZXItcmFkaXVzOiAjeyRuYXYtcGlsbHMtYm9yZGVyLXJhZGl1c307XFxuICAtLSN7JHByZWZpeH1uYXYtcGlsbHMtbGluay1hY3RpdmUtY29sb3I6ICN7JG5hdi1waWxscy1saW5rLWFjdGl2ZS1jb2xvcn07XFxuICAtLSN7JHByZWZpeH1uYXYtcGlsbHMtbGluay1hY3RpdmUtYmc6ICN7JG5hdi1waWxscy1saW5rLWFjdGl2ZS1iZ307XFxuICAvLyBzY3NzLWRvY3MtZW5kIG5hdi1waWxscy1jc3MtdmFyc1xcblxcbiAgLm5hdi1saW5rIHtcXG4gICAgQGluY2x1ZGUgYm9yZGVyLXJhZGl1cyh2YXIoLS0jeyRwcmVmaXh9bmF2LXBpbGxzLWJvcmRlci1yYWRpdXMpKTtcXG4gIH1cXG5cXG4gIC5uYXYtbGluay5hY3RpdmUsXFxuICAuc2hvdyA+IC5uYXYtbGluayB7XFxuICAgIGNvbG9yOiB2YXIoLS0jeyRwcmVmaXh9bmF2LXBpbGxzLWxpbmstYWN0aXZlLWNvbG9yKTtcXG4gICAgQGluY2x1ZGUgZ3JhZGllbnQtYmcodmFyKC0tI3skcHJlZml4fW5hdi1waWxscy1saW5rLWFjdGl2ZS1iZykpO1xcbiAgfVxcbn1cXG5cXG5cXG4vL1xcbi8vIFVuZGVybGluZVxcbi8vXFxuXFxuLm5hdi11bmRlcmxpbmUge1xcbiAgLy8gc2Nzcy1kb2NzLXN0YXJ0IG5hdi11bmRlcmxpbmUtY3NzLXZhcnNcXG4gIC0tI3skcHJlZml4fW5hdi11bmRlcmxpbmUtZ2FwOiAjeyRuYXYtdW5kZXJsaW5lLWdhcH07XFxuICAtLSN7JHByZWZpeH1uYXYtdW5kZXJsaW5lLWJvcmRlci13aWR0aDogI3skbmF2LXVuZGVybGluZS1ib3JkZXItd2lkdGh9O1xcbiAgLS0jeyRwcmVmaXh9bmF2LXVuZGVybGluZS1saW5rLWFjdGl2ZS1jb2xvcjogI3skbmF2LXVuZGVybGluZS1saW5rLWFjdGl2ZS1jb2xvcn07XFxuICAvLyBzY3NzLWRvY3MtZW5kIG5hdi11bmRlcmxpbmUtY3NzLXZhcnNcXG5cXG4gIGdhcDogdmFyKC0tI3skcHJlZml4fW5hdi11bmRlcmxpbmUtZ2FwKTtcXG5cXG4gIC5uYXYtbGluayB7XFxuICAgIHBhZGRpbmctcmlnaHQ6IDA7XFxuICAgIHBhZGRpbmctbGVmdDogMDtcXG4gICAgYm9yZGVyLWJvdHRvbTogdmFyKC0tI3skcHJlZml4fW5hdi11bmRlcmxpbmUtYm9yZGVyLXdpZHRoKSBzb2xpZCB0cmFuc3BhcmVudDtcXG5cXG4gICAgJjpob3ZlcixcXG4gICAgJjpmb2N1cyB7XFxuICAgICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogY3VycmVudGNvbG9yO1xcbiAgICB9XFxuICB9XFxuXFxuICAubmF2LWxpbmsuYWN0aXZlLFxcbiAgLnNob3cgPiAubmF2LWxpbmsge1xcbiAgICBmb250LXdlaWdodDogJGZvbnQtd2VpZ2h0LWJvbGQ7XFxuICAgIGNvbG9yOiB2YXIoLS0jeyRwcmVmaXh9bmF2LXVuZGVybGluZS1saW5rLWFjdGl2ZS1jb2xvcik7XFxuICAgIGJvcmRlci1ib3R0b20tY29sb3I6IGN1cnJlbnRjb2xvcjtcXG4gIH1cXG59XFxuXFxuXFxuLy9cXG4vLyBKdXN0aWZpZWQgdmFyaWFudHNcXG4vL1xcblxcbi5uYXYtZmlsbCB7XFxuICA+IC5uYXYtbGluayxcXG4gIC5uYXYtaXRlbSB7XFxuICAgIGZsZXg6IDEgMSBhdXRvO1xcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICB9XFxufVxcblxcbi5uYXYtanVzdGlmaWVkIHtcXG4gID4gLm5hdi1saW5rLFxcbiAgLm5hdi1pdGVtIHtcXG4gICAgZmxleC1iYXNpczogMDtcXG4gICAgZmxleC1ncm93OiAxO1xcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICB9XFxufVxcblxcbi5uYXYtZmlsbCxcXG4ubmF2LWp1c3RpZmllZCB7XFxuICAubmF2LWl0ZW0gLm5hdi1saW5rIHtcXG4gICAgd2lkdGg6IDEwMCU7IC8vIE1ha2Ugc3VyZSBidXR0b24gd2lsbCBncm93XFxuICB9XFxufVxcblxcblxcbi8vIFRhYmJhYmxlIHRhYnNcXG4vL1xcbi8vIEhpZGUgdGFiYmFibGUgcGFuZXMgdG8gc3RhcnQsIHNob3cgdGhlbSB3aGVuIGAuYWN0aXZlYFxcblxcbi50YWItY29udGVudCB7XFxuICA+IC50YWItcGFuZSB7XFxuICAgIGRpc3BsYXk6IG5vbmU7XFxuICB9XFxuICA+IC5hY3RpdmUge1xcbiAgICBkaXNwbGF5OiBibG9jaztcXG4gIH1cXG59XFxuXCIsXCIvLyBOYXZiYXJcXG4vL1xcbi8vIFByb3ZpZGUgYSBzdGF0aWMgbmF2YmFyIGZyb20gd2hpY2ggd2UgZXhwYW5kIHRvIGNyZWF0ZSBmdWxsLXdpZHRoLCBmaXhlZCwgYW5kXFxuLy8gb3RoZXIgbmF2YmFyIHZhcmlhdGlvbnMuXFxuXFxuLm5hdmJhciB7XFxuICAvLyBzY3NzLWRvY3Mtc3RhcnQgbmF2YmFyLWNzcy12YXJzXFxuICAtLSN7JHByZWZpeH1uYXZiYXItcGFkZGluZy14OiAje2lmKCRuYXZiYXItcGFkZGluZy14ID09IG51bGwsIDAsICRuYXZiYXItcGFkZGluZy14KX07XFxuICAtLSN7JHByZWZpeH1uYXZiYXItcGFkZGluZy15OiAjeyRuYXZiYXItcGFkZGluZy15fTtcXG4gIC0tI3skcHJlZml4fW5hdmJhci1jb2xvcjogI3skbmF2YmFyLWxpZ2h0LWNvbG9yfTtcXG4gIC0tI3skcHJlZml4fW5hdmJhci1ob3Zlci1jb2xvcjogI3skbmF2YmFyLWxpZ2h0LWhvdmVyLWNvbG9yfTtcXG4gIC0tI3skcHJlZml4fW5hdmJhci1kaXNhYmxlZC1jb2xvcjogI3skbmF2YmFyLWxpZ2h0LWRpc2FibGVkLWNvbG9yfTtcXG4gIC0tI3skcHJlZml4fW5hdmJhci1hY3RpdmUtY29sb3I6ICN7JG5hdmJhci1saWdodC1hY3RpdmUtY29sb3J9O1xcbiAgLS0jeyRwcmVmaXh9bmF2YmFyLWJyYW5kLXBhZGRpbmcteTogI3skbmF2YmFyLWJyYW5kLXBhZGRpbmcteX07XFxuICAtLSN7JHByZWZpeH1uYXZiYXItYnJhbmQtbWFyZ2luLWVuZDogI3skbmF2YmFyLWJyYW5kLW1hcmdpbi1lbmR9O1xcbiAgLS0jeyRwcmVmaXh9bmF2YmFyLWJyYW5kLWZvbnQtc2l6ZTogI3skbmF2YmFyLWJyYW5kLWZvbnQtc2l6ZX07XFxuICAtLSN7JHByZWZpeH1uYXZiYXItYnJhbmQtY29sb3I6ICN7JG5hdmJhci1saWdodC1icmFuZC1jb2xvcn07XFxuICAtLSN7JHByZWZpeH1uYXZiYXItYnJhbmQtaG92ZXItY29sb3I6ICN7JG5hdmJhci1saWdodC1icmFuZC1ob3Zlci1jb2xvcn07XFxuICAtLSN7JHByZWZpeH1uYXZiYXItbmF2LWxpbmstcGFkZGluZy14OiAjeyRuYXZiYXItbmF2LWxpbmstcGFkZGluZy14fTtcXG4gIC0tI3skcHJlZml4fW5hdmJhci10b2dnbGVyLXBhZGRpbmcteTogI3skbmF2YmFyLXRvZ2dsZXItcGFkZGluZy15fTtcXG4gIC0tI3skcHJlZml4fW5hdmJhci10b2dnbGVyLXBhZGRpbmcteDogI3skbmF2YmFyLXRvZ2dsZXItcGFkZGluZy14fTtcXG4gIC0tI3skcHJlZml4fW5hdmJhci10b2dnbGVyLWZvbnQtc2l6ZTogI3skbmF2YmFyLXRvZ2dsZXItZm9udC1zaXplfTtcXG4gIC0tI3skcHJlZml4fW5hdmJhci10b2dnbGVyLWljb24tYmc6ICN7ZXNjYXBlLXN2ZygkbmF2YmFyLWxpZ2h0LXRvZ2dsZXItaWNvbi1iZyl9O1xcbiAgLS0jeyRwcmVmaXh9bmF2YmFyLXRvZ2dsZXItYm9yZGVyLWNvbG9yOiAjeyRuYXZiYXItbGlnaHQtdG9nZ2xlci1ib3JkZXItY29sb3J9O1xcbiAgLS0jeyRwcmVmaXh9bmF2YmFyLXRvZ2dsZXItYm9yZGVyLXJhZGl1czogI3skbmF2YmFyLXRvZ2dsZXItYm9yZGVyLXJhZGl1c307XFxuICAtLSN7JHByZWZpeH1uYXZiYXItdG9nZ2xlci1mb2N1cy13aWR0aDogI3skbmF2YmFyLXRvZ2dsZXItZm9jdXMtd2lkdGh9O1xcbiAgLS0jeyRwcmVmaXh9bmF2YmFyLXRvZ2dsZXItdHJhbnNpdGlvbjogI3skbmF2YmFyLXRvZ2dsZXItdHJhbnNpdGlvbn07XFxuICAvLyBzY3NzLWRvY3MtZW5kIG5hdmJhci1jc3MtdmFyc1xcblxcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgZGlzcGxheTogZmxleDtcXG4gIGZsZXgtd3JhcDogd3JhcDsgLy8gYWxsb3cgdXMgdG8gZG8gdGhlIGxpbmUgYnJlYWsgZm9yIGNvbGxhcHNpbmcgY29udGVudFxcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsgLy8gc3BhY2Ugb3V0IGJyYW5kIGZyb20gbG9nb1xcbiAgcGFkZGluZzogdmFyKC0tI3skcHJlZml4fW5hdmJhci1wYWRkaW5nLXkpIHZhcigtLSN7JHByZWZpeH1uYXZiYXItcGFkZGluZy14KTtcXG4gIEBpbmNsdWRlIGdyYWRpZW50LWJnKCk7XFxuXFxuICAvLyBCZWNhdXNlIGZsZXggcHJvcGVydGllcyBhcmVuJ3QgaW5oZXJpdGVkLCB3ZSBuZWVkIHRvIHJlZGVjbGFyZSB0aGVzZSBmaXJzdFxcbiAgLy8gZmV3IHByb3BlcnRpZXMgc28gdGhhdCBjb250ZW50IG5lc3RlZCB3aXRoaW4gYmVoYXZlIHByb3Blcmx5LlxcbiAgLy8gVGhlIGBmbGV4LXdyYXBgIHByb3BlcnR5IGlzIGluaGVyaXRlZCB0byBzaW1wbGlmeSB0aGUgZXhwYW5kZWQgbmF2YmFyc1xcbiAgJWNvbnRhaW5lci1mbGV4LXByb3BlcnRpZXMge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBmbGV4LXdyYXA6IGluaGVyaXQ7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcXG4gIH1cXG5cXG4gID4gLmNvbnRhaW5lcixcXG4gID4gLmNvbnRhaW5lci1mbHVpZCB7XFxuICAgIEBleHRlbmQgJWNvbnRhaW5lci1mbGV4LXByb3BlcnRpZXM7XFxuICB9XFxuXFxuICBAZWFjaCAkYnJlYWtwb2ludCwgJGNvbnRhaW5lci1tYXgtd2lkdGggaW4gJGNvbnRhaW5lci1tYXgtd2lkdGhzIHtcXG4gICAgPiAuY29udGFpbmVyI3ticmVha3BvaW50LWluZml4KCRicmVha3BvaW50LCAkY29udGFpbmVyLW1heC13aWR0aHMpfSB7XFxuICAgICAgQGV4dGVuZCAlY29udGFpbmVyLWZsZXgtcHJvcGVydGllcztcXG4gICAgfVxcbiAgfVxcbn1cXG5cXG5cXG4vLyBOYXZiYXIgYnJhbmRcXG4vL1xcbi8vIFVzZWQgZm9yIGJyYW5kLCBwcm9qZWN0LCBvciBzaXRlIG5hbWVzLlxcblxcbi5uYXZiYXItYnJhbmQge1xcbiAgcGFkZGluZy10b3A6IHZhcigtLSN7JHByZWZpeH1uYXZiYXItYnJhbmQtcGFkZGluZy15KTtcXG4gIHBhZGRpbmctYm90dG9tOiB2YXIoLS0jeyRwcmVmaXh9bmF2YmFyLWJyYW5kLXBhZGRpbmcteSk7XFxuICBtYXJnaW4tcmlnaHQ6IHZhcigtLSN7JHByZWZpeH1uYXZiYXItYnJhbmQtbWFyZ2luLWVuZCk7XFxuICBAaW5jbHVkZSBmb250LXNpemUodmFyKC0tI3skcHJlZml4fW5hdmJhci1icmFuZC1mb250LXNpemUpKTtcXG4gIGNvbG9yOiB2YXIoLS0jeyRwcmVmaXh9bmF2YmFyLWJyYW5kLWNvbG9yKTtcXG4gIHRleHQtZGVjb3JhdGlvbjogaWYoJGxpbmstZGVjb3JhdGlvbiA9PSBub25lLCBudWxsLCBub25lKTtcXG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxuXFxuICAmOmhvdmVyLFxcbiAgJjpmb2N1cyB7XFxuICAgIGNvbG9yOiB2YXIoLS0jeyRwcmVmaXh9bmF2YmFyLWJyYW5kLWhvdmVyLWNvbG9yKTtcXG4gICAgdGV4dC1kZWNvcmF0aW9uOiBpZigkbGluay1ob3Zlci1kZWNvcmF0aW9uID09IHVuZGVybGluZSwgbm9uZSwgbnVsbCk7XFxuICB9XFxufVxcblxcblxcbi8vIE5hdmJhciBuYXZcXG4vL1xcbi8vIEN1c3RvbSBuYXZiYXIgbmF2aWdhdGlvbiAoZG9lc24ndCByZXF1aXJlIGAubmF2YCwgYnV0IGRvZXMgbWFrZSB1c2Ugb2YgYC5uYXYtbGlua2ApLlxcblxcbi5uYXZiYXItbmF2IHtcXG4gIC8vIHNjc3MtZG9jcy1zdGFydCBuYXZiYXItbmF2LWNzcy12YXJzXFxuICAtLSN7JHByZWZpeH1uYXYtbGluay1wYWRkaW5nLXg6IDA7XFxuICAtLSN7JHByZWZpeH1uYXYtbGluay1wYWRkaW5nLXk6ICN7JG5hdi1saW5rLXBhZGRpbmcteX07XFxuICBAaW5jbHVkZSByZnMoJG5hdi1saW5rLWZvbnQtc2l6ZSwgLS0jeyRwcmVmaXh9bmF2LWxpbmstZm9udC1zaXplKTtcXG4gIC0tI3skcHJlZml4fW5hdi1saW5rLWZvbnQtd2VpZ2h0OiAjeyRuYXYtbGluay1mb250LXdlaWdodH07XFxuICAtLSN7JHByZWZpeH1uYXYtbGluay1jb2xvcjogdmFyKC0tI3skcHJlZml4fW5hdmJhci1jb2xvcik7XFxuICAtLSN7JHByZWZpeH1uYXYtbGluay1ob3Zlci1jb2xvcjogdmFyKC0tI3skcHJlZml4fW5hdmJhci1ob3Zlci1jb2xvcik7XFxuICAtLSN7JHByZWZpeH1uYXYtbGluay1kaXNhYmxlZC1jb2xvcjogdmFyKC0tI3skcHJlZml4fW5hdmJhci1kaXNhYmxlZC1jb2xvcik7XFxuICAvLyBzY3NzLWRvY3MtZW5kIG5hdmJhci1uYXYtY3NzLXZhcnNcXG5cXG4gIGRpc3BsYXk6IGZsZXg7XFxuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyAvLyBjYW5ub3QgdXNlIGBpbmhlcml0YCB0byBnZXQgdGhlIGAubmF2YmFyYHMgdmFsdWVcXG4gIHBhZGRpbmctbGVmdDogMDtcXG4gIG1hcmdpbi1ib3R0b206IDA7XFxuICBsaXN0LXN0eWxlOiBub25lO1xcblxcbiAgLm5hdi1saW5rIHtcXG4gICAgJi5hY3RpdmUsXFxuICAgICYuc2hvdyB7XFxuICAgICAgY29sb3I6IHZhcigtLSN7JHByZWZpeH1uYXZiYXItYWN0aXZlLWNvbG9yKTtcXG4gICAgfVxcbiAgfVxcblxcbiAgLmRyb3Bkb3duLW1lbnUge1xcbiAgICBwb3NpdGlvbjogc3RhdGljO1xcbiAgfVxcbn1cXG5cXG5cXG4vLyBOYXZiYXIgdGV4dFxcbi8vXFxuLy9cXG5cXG4ubmF2YmFyLXRleHQge1xcbiAgcGFkZGluZy10b3A6ICRuYXYtbGluay1wYWRkaW5nLXk7XFxuICBwYWRkaW5nLWJvdHRvbTogJG5hdi1saW5rLXBhZGRpbmcteTtcXG4gIGNvbG9yOiB2YXIoLS0jeyRwcmVmaXh9bmF2YmFyLWNvbG9yKTtcXG5cXG4gIGEsXFxuICBhOmhvdmVyLFxcbiAgYTpmb2N1cyAge1xcbiAgICBjb2xvcjogdmFyKC0tI3skcHJlZml4fW5hdmJhci1hY3RpdmUtY29sb3IpO1xcbiAgfVxcbn1cXG5cXG5cXG4vLyBSZXNwb25zaXZlIG5hdmJhclxcbi8vXFxuLy8gQ3VzdG9tIHN0eWxlcyBmb3IgcmVzcG9uc2l2ZSBjb2xsYXBzaW5nIGFuZCB0b2dnbGluZyBvZiBuYXZiYXIgY29udGVudHMuXFxuLy8gUG93ZXJlZCBieSB0aGUgY29sbGFwc2UgQm9vdHN0cmFwIEphdmFTY3JpcHQgcGx1Z2luLlxcblxcbi8vIFdoZW4gY29sbGFwc2VkLCBwcmV2ZW50IHRoZSB0b2dnbGVhYmxlIG5hdmJhciBjb250ZW50cyBmcm9tIGFwcGVhcmluZyBpblxcbi8vIHRoZSBkZWZhdWx0IGZsZXhib3ggcm93IG9yaWVudGF0aW9uLiBSZXF1aXJlcyB0aGUgdXNlIG9mIGBmbGV4LXdyYXA6IHdyYXBgXFxuLy8gb24gdGhlIGAubmF2YmFyYCBwYXJlbnQuXFxuLm5hdmJhci1jb2xsYXBzZSB7XFxuICBmbGV4LWJhc2lzOiAxMDAlO1xcbiAgZmxleC1ncm93OiAxO1xcbiAgLy8gRm9yIGFsd2F5cyBleHBhbmRlZCBvciBleHRyYSBmdWxsIG5hdmJhcnMsIGVuc3VyZSBjb250ZW50IGFsaWducyBpdHNlbGZcXG4gIC8vIHByb3Blcmx5IHZlcnRpY2FsbHkuIENhbiBiZSBlYXNpbHkgb3ZlcnJpZGRlbiB3aXRoIGZsZXggdXRpbGl0aWVzLlxcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG59XFxuXFxuLy8gQnV0dG9uIGZvciB0b2dnbGluZyB0aGUgbmF2YmFyIHdoZW4gaW4gaXRzIGNvbGxhcHNlZCBzdGF0ZVxcbi5uYXZiYXItdG9nZ2xlciB7XFxuICBwYWRkaW5nOiB2YXIoLS0jeyRwcmVmaXh9bmF2YmFyLXRvZ2dsZXItcGFkZGluZy15KSB2YXIoLS0jeyRwcmVmaXh9bmF2YmFyLXRvZ2dsZXItcGFkZGluZy14KTtcXG4gIEBpbmNsdWRlIGZvbnQtc2l6ZSh2YXIoLS0jeyRwcmVmaXh9bmF2YmFyLXRvZ2dsZXItZm9udC1zaXplKSk7XFxuICBsaW5lLWhlaWdodDogMTtcXG4gIGNvbG9yOiB2YXIoLS0jeyRwcmVmaXh9bmF2YmFyLWNvbG9yKTtcXG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OyAvLyByZW1vdmUgZGVmYXVsdCBidXR0b24gc3R5bGVcXG4gIGJvcmRlcjogdmFyKC0tI3skcHJlZml4fWJvcmRlci13aWR0aCkgc29saWQgdmFyKC0tI3skcHJlZml4fW5hdmJhci10b2dnbGVyLWJvcmRlci1jb2xvcik7IC8vIHJlbW92ZSBkZWZhdWx0IGJ1dHRvbiBzdHlsZVxcbiAgQGluY2x1ZGUgYm9yZGVyLXJhZGl1cyh2YXIoLS0jeyRwcmVmaXh9bmF2YmFyLXRvZ2dsZXItYm9yZGVyLXJhZGl1cykpO1xcbiAgQGluY2x1ZGUgdHJhbnNpdGlvbih2YXIoLS0jeyRwcmVmaXh9bmF2YmFyLXRvZ2dsZXItdHJhbnNpdGlvbikpO1xcblxcbiAgJjpob3ZlciB7XFxuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcXG4gIH1cXG5cXG4gICY6Zm9jdXMge1xcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XFxuICAgIG91dGxpbmU6IDA7XFxuICAgIGJveC1zaGFkb3c6IDAgMCAwIHZhcigtLSN7JHByZWZpeH1uYXZiYXItdG9nZ2xlci1mb2N1cy13aWR0aCk7XFxuICB9XFxufVxcblxcbi8vIEtlZXAgYXMgYSBzZXBhcmF0ZSBlbGVtZW50IHNvIGZvbGtzIGNhbiBlYXNpbHkgb3ZlcnJpZGUgaXQgd2l0aCBhbm90aGVyIGljb25cXG4vLyBvciBpbWFnZSBmaWxlIGFzIG5lZWRlZC5cXG4ubmF2YmFyLXRvZ2dsZXItaWNvbiB7XFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICB3aWR0aDogMS41ZW07XFxuICBoZWlnaHQ6IDEuNWVtO1xcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcXG4gIGJhY2tncm91bmQtaW1hZ2U6IHZhcigtLSN7JHByZWZpeH1uYXZiYXItdG9nZ2xlci1pY29uLWJnKTtcXG4gIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XFxuICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXI7XFxuICBiYWNrZ3JvdW5kLXNpemU6IDEwMCU7XFxufVxcblxcbi5uYXZiYXItbmF2LXNjcm9sbCB7XFxuICBtYXgtaGVpZ2h0OiB2YXIoLS0jeyRwcmVmaXh9c2Nyb2xsLWhlaWdodCwgNzV2aCk7XFxuICBvdmVyZmxvdy15OiBhdXRvO1xcbn1cXG5cXG4vLyBzY3NzLWRvY3Mtc3RhcnQgbmF2YmFyLWV4cGFuZC1sb29wXFxuLy8gR2VuZXJhdGUgc2VyaWVzIG9mIGAubmF2YmFyLWV4cGFuZC0qYCByZXNwb25zaXZlIGNsYXNzZXMgZm9yIGNvbmZpZ3VyaW5nXFxuLy8gd2hlcmUgeW91ciBuYXZiYXIgY29sbGFwc2VzLlxcbi5uYXZiYXItZXhwYW5kIHtcXG4gIEBlYWNoICRicmVha3BvaW50IGluIG1hcC1rZXlzKCRncmlkLWJyZWFrcG9pbnRzKSB7XFxuICAgICRuZXh0OiBicmVha3BvaW50LW5leHQoJGJyZWFrcG9pbnQsICRncmlkLWJyZWFrcG9pbnRzKTtcXG4gICAgJGluZml4OiBicmVha3BvaW50LWluZml4KCRuZXh0LCAkZ3JpZC1icmVha3BvaW50cyk7XFxuXFxuICAgIC8vIHN0eWxlbGludC1kaXNhYmxlLW5leHQtbGluZSBzY3NzL3NlbGVjdG9yLW5vLXVuaW9uLWNsYXNzLW5hbWVcXG4gICAgJiN7JGluZml4fSB7XFxuICAgICAgQGluY2x1ZGUgbWVkaWEtYnJlYWtwb2ludC11cCgkbmV4dCkge1xcbiAgICAgICAgZmxleC13cmFwOiBub3dyYXA7XFxuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7XFxuXFxuICAgICAgICAubmF2YmFyLW5hdiB7XFxuICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XFxuXFxuICAgICAgICAgIC5kcm9wZG93bi1tZW51IHtcXG4gICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgLm5hdi1saW5rIHtcXG4gICAgICAgICAgICBwYWRkaW5nLXJpZ2h0OiB2YXIoLS0jeyRwcmVmaXh9bmF2YmFyLW5hdi1saW5rLXBhZGRpbmcteCk7XFxuICAgICAgICAgICAgcGFkZGluZy1sZWZ0OiB2YXIoLS0jeyRwcmVmaXh9bmF2YmFyLW5hdi1saW5rLXBhZGRpbmcteCk7XFxuICAgICAgICAgIH1cXG4gICAgICAgIH1cXG5cXG4gICAgICAgIC5uYXZiYXItbmF2LXNjcm9sbCB7XFxuICAgICAgICAgIG92ZXJmbG93OiB2aXNpYmxlO1xcbiAgICAgICAgfVxcblxcbiAgICAgICAgLm5hdmJhci1jb2xsYXBzZSB7XFxuICAgICAgICAgIGRpc3BsYXk6IGZsZXggIWltcG9ydGFudDsgLy8gc3R5bGVsaW50LWRpc2FibGUtbGluZSBkZWNsYXJhdGlvbi1uby1pbXBvcnRhbnRcXG4gICAgICAgICAgZmxleC1iYXNpczogYXV0bztcXG4gICAgICAgIH1cXG5cXG4gICAgICAgIC5uYXZiYXItdG9nZ2xlciB7XFxuICAgICAgICAgIGRpc3BsYXk6IG5vbmU7XFxuICAgICAgICB9XFxuXFxuICAgICAgICAub2ZmY2FudmFzIHtcXG4gICAgICAgICAgLy8gc3R5bGVsaW50LWRpc2FibGUgZGVjbGFyYXRpb24tbm8taW1wb3J0YW50XFxuICAgICAgICAgIHBvc2l0aW9uOiBzdGF0aWM7XFxuICAgICAgICAgIHotaW5kZXg6IGF1dG87XFxuICAgICAgICAgIGZsZXgtZ3JvdzogMTtcXG4gICAgICAgICAgd2lkdGg6IGF1dG8gIWltcG9ydGFudDtcXG4gICAgICAgICAgaGVpZ2h0OiBhdXRvICFpbXBvcnRhbnQ7XFxuICAgICAgICAgIHZpc2liaWxpdHk6IHZpc2libGUgIWltcG9ydGFudDtcXG4gICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQgIWltcG9ydGFudDtcXG4gICAgICAgICAgYm9yZGVyOiAwICFpbXBvcnRhbnQ7XFxuICAgICAgICAgIHRyYW5zZm9ybTogbm9uZSAhaW1wb3J0YW50O1xcbiAgICAgICAgICBAaW5jbHVkZSBib3gtc2hhZG93KG5vbmUpO1xcbiAgICAgICAgICBAaW5jbHVkZSB0cmFuc2l0aW9uKG5vbmUpO1xcbiAgICAgICAgICAvLyBzdHlsZWxpbnQtZW5hYmxlIGRlY2xhcmF0aW9uLW5vLWltcG9ydGFudFxcblxcbiAgICAgICAgICAub2ZmY2FudmFzLWhlYWRlciB7XFxuICAgICAgICAgICAgZGlzcGxheTogbm9uZTtcXG4gICAgICAgICAgfVxcblxcbiAgICAgICAgICAub2ZmY2FudmFzLWJvZHkge1xcbiAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgICAgICAgICAgZmxleC1ncm93OiAwO1xcbiAgICAgICAgICAgIHBhZGRpbmc6IDA7XFxuICAgICAgICAgICAgb3ZlcmZsb3cteTogdmlzaWJsZTtcXG4gICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICAgIH1cXG4gICAgfVxcbiAgfVxcbn1cXG4vLyBzY3NzLWRvY3MtZW5kIG5hdmJhci1leHBhbmQtbG9vcFxcblxcbi8vIE5hdmJhciB0aGVtZXNcXG4vL1xcbi8vIFN0eWxlcyBmb3Igc3dpdGNoaW5nIGJldHdlZW4gbmF2YmFycyB3aXRoIGxpZ2h0IG9yIGRhcmsgYmFja2dyb3VuZC5cXG5cXG4ubmF2YmFyLWxpZ2h0IHtcXG4gIEBpbmNsdWRlIGRlcHJlY2F0ZShcXFwiYC5uYXZiYXItbGlnaHRgXFxcIiwgXFxcInY1LjIuMFxcXCIsIFxcXCJ2Ni4wLjBcXFwiLCB0cnVlKTtcXG59XFxuXFxuLm5hdmJhci1kYXJrLFxcbi5uYXZiYXJbZGF0YS1icy10aGVtZT1cXFwiZGFya1xcXCJdIHtcXG4gIC8vIHNjc3MtZG9jcy1zdGFydCBuYXZiYXItZGFyay1jc3MtdmFyc1xcbiAgLS0jeyRwcmVmaXh9bmF2YmFyLWNvbG9yOiAjeyRuYXZiYXItZGFyay1jb2xvcn07XFxuICAtLSN7JHByZWZpeH1uYXZiYXItaG92ZXItY29sb3I6ICN7JG5hdmJhci1kYXJrLWhvdmVyLWNvbG9yfTtcXG4gIC0tI3skcHJlZml4fW5hdmJhci1kaXNhYmxlZC1jb2xvcjogI3skbmF2YmFyLWRhcmstZGlzYWJsZWQtY29sb3J9O1xcbiAgLS0jeyRwcmVmaXh9bmF2YmFyLWFjdGl2ZS1jb2xvcjogI3skbmF2YmFyLWRhcmstYWN0aXZlLWNvbG9yfTtcXG4gIC0tI3skcHJlZml4fW5hdmJhci1icmFuZC1jb2xvcjogI3skbmF2YmFyLWRhcmstYnJhbmQtY29sb3J9O1xcbiAgLS0jeyRwcmVmaXh9bmF2YmFyLWJyYW5kLWhvdmVyLWNvbG9yOiAjeyRuYXZiYXItZGFyay1icmFuZC1ob3Zlci1jb2xvcn07XFxuICAtLSN7JHByZWZpeH1uYXZiYXItdG9nZ2xlci1ib3JkZXItY29sb3I6ICN7JG5hdmJhci1kYXJrLXRvZ2dsZXItYm9yZGVyLWNvbG9yfTtcXG4gIC0tI3skcHJlZml4fW5hdmJhci10b2dnbGVyLWljb24tYmc6ICN7ZXNjYXBlLXN2ZygkbmF2YmFyLWRhcmstdG9nZ2xlci1pY29uLWJnKX07XFxuICAvLyBzY3NzLWRvY3MtZW5kIG5hdmJhci1kYXJrLWNzcy12YXJzXFxufVxcblxcbkBpZiAkZW5hYmxlLWRhcmstbW9kZSB7XFxuICBAaW5jbHVkZSBjb2xvci1tb2RlKGRhcmspIHtcXG4gICAgLm5hdmJhci10b2dnbGVyLWljb24ge1xcbiAgICAgIC0tI3skcHJlZml4fW5hdmJhci10b2dnbGVyLWljb24tYmc6ICN7ZXNjYXBlLXN2ZygkbmF2YmFyLWRhcmstdG9nZ2xlci1pY29uLWJnKX07XFxuICAgIH1cXG4gIH1cXG59XFxuXCIsXCIvL1xcbi8vIEJhc2Ugc3R5bGVzXFxuLy9cXG5cXG4uY2FyZCB7XFxuICAvLyBzY3NzLWRvY3Mtc3RhcnQgY2FyZC1jc3MtdmFyc1xcbiAgLS0jeyRwcmVmaXh9Y2FyZC1zcGFjZXIteTogI3skY2FyZC1zcGFjZXIteX07XFxuICAtLSN7JHByZWZpeH1jYXJkLXNwYWNlci14OiAjeyRjYXJkLXNwYWNlci14fTtcXG4gIC0tI3skcHJlZml4fWNhcmQtdGl0bGUtc3BhY2VyLXk6ICN7JGNhcmQtdGl0bGUtc3BhY2VyLXl9O1xcbiAgLS0jeyRwcmVmaXh9Y2FyZC10aXRsZS1jb2xvcjogI3skY2FyZC10aXRsZS1jb2xvcn07XFxuICAtLSN7JHByZWZpeH1jYXJkLXN1YnRpdGxlLWNvbG9yOiAjeyRjYXJkLXN1YnRpdGxlLWNvbG9yfTtcXG4gIC0tI3skcHJlZml4fWNhcmQtYm9yZGVyLXdpZHRoOiAjeyRjYXJkLWJvcmRlci13aWR0aH07XFxuICAtLSN7JHByZWZpeH1jYXJkLWJvcmRlci1jb2xvcjogI3skY2FyZC1ib3JkZXItY29sb3J9O1xcbiAgLS0jeyRwcmVmaXh9Y2FyZC1ib3JkZXItcmFkaXVzOiAjeyRjYXJkLWJvcmRlci1yYWRpdXN9O1xcbiAgLS0jeyRwcmVmaXh9Y2FyZC1ib3gtc2hhZG93OiAjeyRjYXJkLWJveC1zaGFkb3d9O1xcbiAgLS0jeyRwcmVmaXh9Y2FyZC1pbm5lci1ib3JkZXItcmFkaXVzOiAjeyRjYXJkLWlubmVyLWJvcmRlci1yYWRpdXN9O1xcbiAgLS0jeyRwcmVmaXh9Y2FyZC1jYXAtcGFkZGluZy15OiAjeyRjYXJkLWNhcC1wYWRkaW5nLXl9O1xcbiAgLS0jeyRwcmVmaXh9Y2FyZC1jYXAtcGFkZGluZy14OiAjeyRjYXJkLWNhcC1wYWRkaW5nLXh9O1xcbiAgLS0jeyRwcmVmaXh9Y2FyZC1jYXAtYmc6ICN7JGNhcmQtY2FwLWJnfTtcXG4gIC0tI3skcHJlZml4fWNhcmQtY2FwLWNvbG9yOiAjeyRjYXJkLWNhcC1jb2xvcn07XFxuICAtLSN7JHByZWZpeH1jYXJkLWhlaWdodDogI3skY2FyZC1oZWlnaHR9O1xcbiAgLS0jeyRwcmVmaXh9Y2FyZC1jb2xvcjogI3skY2FyZC1jb2xvcn07XFxuICAtLSN7JHByZWZpeH1jYXJkLWJnOiAjeyRjYXJkLWJnfTtcXG4gIC0tI3skcHJlZml4fWNhcmQtaW1nLW92ZXJsYXktcGFkZGluZzogI3skY2FyZC1pbWctb3ZlcmxheS1wYWRkaW5nfTtcXG4gIC0tI3skcHJlZml4fWNhcmQtZ3JvdXAtbWFyZ2luOiAjeyRjYXJkLWdyb3VwLW1hcmdpbn07XFxuICAvLyBzY3NzLWRvY3MtZW5kIGNhcmQtY3NzLXZhcnNcXG5cXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIGRpc3BsYXk6IGZsZXg7XFxuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xcbiAgbWluLXdpZHRoOiAwOyAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL3B1bGwvMjI3NDAjaXNzdWVjb21tZW50LTMwNTg2ODEwNlxcbiAgaGVpZ2h0OiB2YXIoLS0jeyRwcmVmaXh9Y2FyZC1oZWlnaHQpO1xcbiAgY29sb3I6IHZhcigtLSN7JHByZWZpeH1ib2R5LWNvbG9yKTtcXG4gIHdvcmQtd3JhcDogYnJlYWstd29yZDtcXG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLSN7JHByZWZpeH1jYXJkLWJnKTtcXG4gIGJhY2tncm91bmQtY2xpcDogYm9yZGVyLWJveDtcXG4gIGJvcmRlcjogdmFyKC0tI3skcHJlZml4fWNhcmQtYm9yZGVyLXdpZHRoKSBzb2xpZCB2YXIoLS0jeyRwcmVmaXh9Y2FyZC1ib3JkZXItY29sb3IpO1xcbiAgQGluY2x1ZGUgYm9yZGVyLXJhZGl1cyh2YXIoLS0jeyRwcmVmaXh9Y2FyZC1ib3JkZXItcmFkaXVzKSk7XFxuICBAaW5jbHVkZSBib3gtc2hhZG93KHZhcigtLSN7JHByZWZpeH1jYXJkLWJveC1zaGFkb3cpKTtcXG5cXG4gID4gaHIge1xcbiAgICBtYXJnaW4tcmlnaHQ6IDA7XFxuICAgIG1hcmdpbi1sZWZ0OiAwO1xcbiAgfVxcblxcbiAgPiAubGlzdC1ncm91cCB7XFxuICAgIGJvcmRlci10b3A6IGluaGVyaXQ7XFxuICAgIGJvcmRlci1ib3R0b206IGluaGVyaXQ7XFxuXFxuICAgICY6Zmlyc3QtY2hpbGQge1xcbiAgICAgIGJvcmRlci10b3Atd2lkdGg6IDA7XFxuICAgICAgQGluY2x1ZGUgYm9yZGVyLXRvcC1yYWRpdXModmFyKC0tI3skcHJlZml4fWNhcmQtaW5uZXItYm9yZGVyLXJhZGl1cykpO1xcbiAgICB9XFxuXFxuICAgICY6bGFzdC1jaGlsZCAge1xcbiAgICAgIGJvcmRlci1ib3R0b20td2lkdGg6IDA7XFxuICAgICAgQGluY2x1ZGUgYm9yZGVyLWJvdHRvbS1yYWRpdXModmFyKC0tI3skcHJlZml4fWNhcmQtaW5uZXItYm9yZGVyLXJhZGl1cykpO1xcbiAgICB9XFxuICB9XFxuXFxuICAvLyBEdWUgdG8gc3BlY2lmaWNpdHkgb2YgdGhlIGFib3ZlIHNlbGVjdG9yIChgLmNhcmQgPiAubGlzdC1ncm91cGApLCB3ZSBtdXN0XFxuICAvLyB1c2UgYSBjaGlsZCBzZWxlY3RvciBoZXJlIHRvIHByZXZlbnQgZG91YmxlIGJvcmRlcnMuXFxuICA+IC5jYXJkLWhlYWRlciArIC5saXN0LWdyb3VwLFxcbiAgPiAubGlzdC1ncm91cCArIC5jYXJkLWZvb3RlciB7XFxuICAgIGJvcmRlci10b3A6IDA7XFxuICB9XFxufVxcblxcbi5jYXJkLWJvZHkge1xcbiAgLy8gRW5hYmxlIGBmbGV4LWdyb3c6IDFgIGZvciBkZWNrcyBhbmQgZ3JvdXBzIHNvIHRoYXQgY2FyZCBibG9ja3MgdGFrZSB1cFxcbiAgLy8gYXMgbXVjaCBzcGFjZSBhcyBwb3NzaWJsZSwgZW5zdXJpbmcgZm9vdGVycyBhcmUgYWxpZ25lZCB0byB0aGUgYm90dG9tLlxcbiAgZmxleDogMSAxIGF1dG87XFxuICBwYWRkaW5nOiB2YXIoLS0jeyRwcmVmaXh9Y2FyZC1zcGFjZXIteSkgdmFyKC0tI3skcHJlZml4fWNhcmQtc3BhY2VyLXgpO1xcbiAgY29sb3I6IHZhcigtLSN7JHByZWZpeH1jYXJkLWNvbG9yKTtcXG59XFxuXFxuLmNhcmQtdGl0bGUge1xcbiAgbWFyZ2luLWJvdHRvbTogdmFyKC0tI3skcHJlZml4fWNhcmQtdGl0bGUtc3BhY2VyLXkpO1xcbiAgY29sb3I6IHZhcigtLSN7JHByZWZpeH1jYXJkLXRpdGxlLWNvbG9yKTtcXG59XFxuXFxuLmNhcmQtc3VidGl0bGUge1xcbiAgbWFyZ2luLXRvcDogY2FsYygtLjUgKiB2YXIoLS0jeyRwcmVmaXh9Y2FyZC10aXRsZS1zcGFjZXIteSkpOyAvLyBzdHlsZWxpbnQtZGlzYWJsZS1saW5lIGZ1bmN0aW9uLWRpc2FsbG93ZWQtbGlzdFxcbiAgbWFyZ2luLWJvdHRvbTogMDtcXG4gIGNvbG9yOiB2YXIoLS0jeyRwcmVmaXh9Y2FyZC1zdWJ0aXRsZS1jb2xvcik7XFxufVxcblxcbi5jYXJkLXRleHQ6bGFzdC1jaGlsZCB7XFxuICBtYXJnaW4tYm90dG9tOiAwO1xcbn1cXG5cXG4uY2FyZC1saW5rIHtcXG4gICY6aG92ZXIge1xcbiAgICB0ZXh0LWRlY29yYXRpb246IGlmKCRsaW5rLWhvdmVyLWRlY29yYXRpb24gPT0gdW5kZXJsaW5lLCBub25lLCBudWxsKTtcXG4gIH1cXG5cXG4gICsgLmNhcmQtbGluayB7XFxuICAgIG1hcmdpbi1sZWZ0OiB2YXIoLS0jeyRwcmVmaXh9Y2FyZC1zcGFjZXIteCk7XFxuICB9XFxufVxcblxcbi8vXFxuLy8gT3B0aW9uYWwgdGV4dHVhbCBjYXBzXFxuLy9cXG5cXG4uY2FyZC1oZWFkZXIge1xcbiAgcGFkZGluZzogdmFyKC0tI3skcHJlZml4fWNhcmQtY2FwLXBhZGRpbmcteSkgdmFyKC0tI3skcHJlZml4fWNhcmQtY2FwLXBhZGRpbmcteCk7XFxuICBtYXJnaW4tYm90dG9tOiAwOyAvLyBSZW1vdmVzIHRoZSBkZWZhdWx0IG1hcmdpbi1ib3R0b20gb2YgPGhOPlxcbiAgY29sb3I6IHZhcigtLSN7JHByZWZpeH1jYXJkLWNhcC1jb2xvcik7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS0jeyRwcmVmaXh9Y2FyZC1jYXAtYmcpO1xcbiAgYm9yZGVyLWJvdHRvbTogdmFyKC0tI3skcHJlZml4fWNhcmQtYm9yZGVyLXdpZHRoKSBzb2xpZCB2YXIoLS0jeyRwcmVmaXh9Y2FyZC1ib3JkZXItY29sb3IpO1xcblxcbiAgJjpmaXJzdC1jaGlsZCB7XFxuICAgIEBpbmNsdWRlIGJvcmRlci1yYWRpdXModmFyKC0tI3skcHJlZml4fWNhcmQtaW5uZXItYm9yZGVyLXJhZGl1cykgdmFyKC0tI3skcHJlZml4fWNhcmQtaW5uZXItYm9yZGVyLXJhZGl1cykgMCAwKTtcXG4gIH1cXG59XFxuXFxuLmNhcmQtZm9vdGVyIHtcXG4gIHBhZGRpbmc6IHZhcigtLSN7JHByZWZpeH1jYXJkLWNhcC1wYWRkaW5nLXkpIHZhcigtLSN7JHByZWZpeH1jYXJkLWNhcC1wYWRkaW5nLXgpO1xcbiAgY29sb3I6IHZhcigtLSN7JHByZWZpeH1jYXJkLWNhcC1jb2xvcik7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS0jeyRwcmVmaXh9Y2FyZC1jYXAtYmcpO1xcbiAgYm9yZGVyLXRvcDogdmFyKC0tI3skcHJlZml4fWNhcmQtYm9yZGVyLXdpZHRoKSBzb2xpZCB2YXIoLS0jeyRwcmVmaXh9Y2FyZC1ib3JkZXItY29sb3IpO1xcblxcbiAgJjpsYXN0LWNoaWxkIHtcXG4gICAgQGluY2x1ZGUgYm9yZGVyLXJhZGl1cygwIDAgdmFyKC0tI3skcHJlZml4fWNhcmQtaW5uZXItYm9yZGVyLXJhZGl1cykgdmFyKC0tI3skcHJlZml4fWNhcmQtaW5uZXItYm9yZGVyLXJhZGl1cykpO1xcbiAgfVxcbn1cXG5cXG5cXG4vL1xcbi8vIEhlYWRlciBuYXZzXFxuLy9cXG5cXG4uY2FyZC1oZWFkZXItdGFicyB7XFxuICBtYXJnaW4tcmlnaHQ6IGNhbGMoLS41ICogdmFyKC0tI3skcHJlZml4fWNhcmQtY2FwLXBhZGRpbmcteCkpOyAvLyBzdHlsZWxpbnQtZGlzYWJsZS1saW5lIGZ1bmN0aW9uLWRpc2FsbG93ZWQtbGlzdFxcbiAgbWFyZ2luLWJvdHRvbTogY2FsYygtMSAqIHZhcigtLSN7JHByZWZpeH1jYXJkLWNhcC1wYWRkaW5nLXkpKTsgLy8gc3R5bGVsaW50LWRpc2FibGUtbGluZSBmdW5jdGlvbi1kaXNhbGxvd2VkLWxpc3RcXG4gIG1hcmdpbi1sZWZ0OiBjYWxjKC0uNSAqIHZhcigtLSN7JHByZWZpeH1jYXJkLWNhcC1wYWRkaW5nLXgpKTsgLy8gc3R5bGVsaW50LWRpc2FibGUtbGluZSBmdW5jdGlvbi1kaXNhbGxvd2VkLWxpc3RcXG4gIGJvcmRlci1ib3R0b206IDA7XFxuXFxuICAubmF2LWxpbmsuYWN0aXZlIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tI3skcHJlZml4fWNhcmQtYmcpO1xcbiAgICBib3JkZXItYm90dG9tLWNvbG9yOiB2YXIoLS0jeyRwcmVmaXh9Y2FyZC1iZyk7XFxuICB9XFxufVxcblxcbi5jYXJkLWhlYWRlci1waWxscyB7XFxuICBtYXJnaW4tcmlnaHQ6IGNhbGMoLS41ICogdmFyKC0tI3skcHJlZml4fWNhcmQtY2FwLXBhZGRpbmcteCkpOyAvLyBzdHlsZWxpbnQtZGlzYWJsZS1saW5lIGZ1bmN0aW9uLWRpc2FsbG93ZWQtbGlzdFxcbiAgbWFyZ2luLWxlZnQ6IGNhbGMoLS41ICogdmFyKC0tI3skcHJlZml4fWNhcmQtY2FwLXBhZGRpbmcteCkpOyAvLyBzdHlsZWxpbnQtZGlzYWJsZS1saW5lIGZ1bmN0aW9uLWRpc2FsbG93ZWQtbGlzdFxcbn1cXG5cXG4vLyBDYXJkIGltYWdlXFxuLmNhcmQtaW1nLW92ZXJsYXkge1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgdG9wOiAwO1xcbiAgcmlnaHQ6IDA7XFxuICBib3R0b206IDA7XFxuICBsZWZ0OiAwO1xcbiAgcGFkZGluZzogdmFyKC0tI3skcHJlZml4fWNhcmQtaW1nLW92ZXJsYXktcGFkZGluZyk7XFxuICBAaW5jbHVkZSBib3JkZXItcmFkaXVzKHZhcigtLSN7JHByZWZpeH1jYXJkLWlubmVyLWJvcmRlci1yYWRpdXMpKTtcXG59XFxuXFxuLmNhcmQtaW1nLFxcbi5jYXJkLWltZy10b3AsXFxuLmNhcmQtaW1nLWJvdHRvbSB7XFxuICB3aWR0aDogMTAwJTsgLy8gUmVxdWlyZWQgYmVjYXVzZSB3ZSB1c2UgZmxleGJveCBhbmQgdGhpcyBpbmhlcmVudGx5IGFwcGxpZXMgYWxpZ24tc2VsZjogc3RyZXRjaFxcbn1cXG5cXG4uY2FyZC1pbWcsXFxuLmNhcmQtaW1nLXRvcCB7XFxuICBAaW5jbHVkZSBib3JkZXItdG9wLXJhZGl1cyh2YXIoLS0jeyRwcmVmaXh9Y2FyZC1pbm5lci1ib3JkZXItcmFkaXVzKSk7XFxufVxcblxcbi5jYXJkLWltZyxcXG4uY2FyZC1pbWctYm90dG9tIHtcXG4gIEBpbmNsdWRlIGJvcmRlci1ib3R0b20tcmFkaXVzKHZhcigtLSN7JHByZWZpeH1jYXJkLWlubmVyLWJvcmRlci1yYWRpdXMpKTtcXG59XFxuXFxuXFxuLy9cXG4vLyBDYXJkIGdyb3Vwc1xcbi8vXFxuXFxuLmNhcmQtZ3JvdXAge1xcbiAgLy8gVGhlIGNoaWxkIHNlbGVjdG9yIGFsbG93cyBuZXN0ZWQgYC5jYXJkYCB3aXRoaW4gYC5jYXJkLWdyb3VwYFxcbiAgLy8gdG8gZGlzcGxheSBwcm9wZXJseS5cXG4gID4gLmNhcmQge1xcbiAgICBtYXJnaW4tYm90dG9tOiB2YXIoLS0jeyRwcmVmaXh9Y2FyZC1ncm91cC1tYXJnaW4pO1xcbiAgfVxcblxcbiAgQGluY2x1ZGUgbWVkaWEtYnJlYWtwb2ludC11cChzbSkge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBmbGV4LWZsb3c6IHJvdyB3cmFwO1xcbiAgICAvLyBUaGUgY2hpbGQgc2VsZWN0b3IgYWxsb3dzIG5lc3RlZCBgLmNhcmRgIHdpdGhpbiBgLmNhcmQtZ3JvdXBgXFxuICAgIC8vIHRvIGRpc3BsYXkgcHJvcGVybHkuXFxuICAgID4gLmNhcmQge1xcbiAgICAgIC8vIEZsZXhidWdzICM0OiBodHRwczovL2dpdGh1Yi5jb20vcGhpbGlwd2FsdG9uL2ZsZXhidWdzI2ZsZXhidWctNFxcbiAgICAgIGZsZXg6IDEgMCAwJTtcXG4gICAgICBtYXJnaW4tYm90dG9tOiAwO1xcblxcbiAgICAgICsgLmNhcmQge1xcbiAgICAgICAgbWFyZ2luLWxlZnQ6IDA7XFxuICAgICAgICBib3JkZXItbGVmdDogMDtcXG4gICAgICB9XFxuXFxuICAgICAgLy8gSGFuZGxlIHJvdW5kZWQgY29ybmVyc1xcbiAgICAgIEBpZiAkZW5hYmxlLXJvdW5kZWQge1xcbiAgICAgICAgJjpub3QoOmxhc3QtY2hpbGQpIHtcXG4gICAgICAgICAgQGluY2x1ZGUgYm9yZGVyLWVuZC1yYWRpdXMoMCk7XFxuXFxuICAgICAgICAgIC5jYXJkLWltZy10b3AsXFxuICAgICAgICAgIC5jYXJkLWhlYWRlciB7XFxuICAgICAgICAgICAgLy8gc3R5bGVsaW50LWRpc2FibGUtbmV4dC1saW5lIHByb3BlcnR5LWRpc2FsbG93ZWQtbGlzdFxcbiAgICAgICAgICAgIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAwO1xcbiAgICAgICAgICB9XFxuICAgICAgICAgIC5jYXJkLWltZy1ib3R0b20sXFxuICAgICAgICAgIC5jYXJkLWZvb3RlciB7XFxuICAgICAgICAgICAgLy8gc3R5bGVsaW50LWRpc2FibGUtbmV4dC1saW5lIHByb3BlcnR5LWRpc2FsbG93ZWQtbGlzdFxcbiAgICAgICAgICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAwO1xcbiAgICAgICAgICB9XFxuICAgICAgICB9XFxuXFxuICAgICAgICAmOm5vdCg6Zmlyc3QtY2hpbGQpIHtcXG4gICAgICAgICAgQGluY2x1ZGUgYm9yZGVyLXN0YXJ0LXJhZGl1cygwKTtcXG5cXG4gICAgICAgICAgLmNhcmQtaW1nLXRvcCxcXG4gICAgICAgICAgLmNhcmQtaGVhZGVyIHtcXG4gICAgICAgICAgICAvLyBzdHlsZWxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJvcGVydHktZGlzYWxsb3dlZC1saXN0XFxuICAgICAgICAgICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMDtcXG4gICAgICAgICAgfVxcbiAgICAgICAgICAuY2FyZC1pbWctYm90dG9tLFxcbiAgICAgICAgICAuY2FyZC1mb290ZXIge1xcbiAgICAgICAgICAgIC8vIHN0eWxlbGludC1kaXNhYmxlLW5leHQtbGluZSBwcm9wZXJ0eS1kaXNhbGxvd2VkLWxpc3RcXG4gICAgICAgICAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAwO1xcbiAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgICAgfVxcbiAgICB9XFxuICB9XFxufVxcblwiLFwiLy9cXG4vLyBCYXNlIHN0eWxlc1xcbi8vXFxuXFxuLmFjY29yZGlvbiB7XFxuICAvLyBzY3NzLWRvY3Mtc3RhcnQgYWNjb3JkaW9uLWNzcy12YXJzXFxuICAtLSN7JHByZWZpeH1hY2NvcmRpb24tY29sb3I6ICN7JGFjY29yZGlvbi1jb2xvcn07XFxuICAtLSN7JHByZWZpeH1hY2NvcmRpb24tYmc6ICN7JGFjY29yZGlvbi1iZ307XFxuICAtLSN7JHByZWZpeH1hY2NvcmRpb24tdHJhbnNpdGlvbjogI3skYWNjb3JkaW9uLXRyYW5zaXRpb259O1xcbiAgLS0jeyRwcmVmaXh9YWNjb3JkaW9uLWJvcmRlci1jb2xvcjogI3skYWNjb3JkaW9uLWJvcmRlci1jb2xvcn07XFxuICAtLSN7JHByZWZpeH1hY2NvcmRpb24tYm9yZGVyLXdpZHRoOiAjeyRhY2NvcmRpb24tYm9yZGVyLXdpZHRofTtcXG4gIC0tI3skcHJlZml4fWFjY29yZGlvbi1ib3JkZXItcmFkaXVzOiAjeyRhY2NvcmRpb24tYm9yZGVyLXJhZGl1c307XFxuICAtLSN7JHByZWZpeH1hY2NvcmRpb24taW5uZXItYm9yZGVyLXJhZGl1czogI3skYWNjb3JkaW9uLWlubmVyLWJvcmRlci1yYWRpdXN9O1xcbiAgLS0jeyRwcmVmaXh9YWNjb3JkaW9uLWJ0bi1wYWRkaW5nLXg6ICN7JGFjY29yZGlvbi1idXR0b24tcGFkZGluZy14fTtcXG4gIC0tI3skcHJlZml4fWFjY29yZGlvbi1idG4tcGFkZGluZy15OiAjeyRhY2NvcmRpb24tYnV0dG9uLXBhZGRpbmcteX07XFxuICAtLSN7JHByZWZpeH1hY2NvcmRpb24tYnRuLWNvbG9yOiAjeyRhY2NvcmRpb24tYnV0dG9uLWNvbG9yfTtcXG4gIC0tI3skcHJlZml4fWFjY29yZGlvbi1idG4tYmc6ICN7JGFjY29yZGlvbi1idXR0b24tYmd9O1xcbiAgLS0jeyRwcmVmaXh9YWNjb3JkaW9uLWJ0bi1pY29uOiAje2VzY2FwZS1zdmcoJGFjY29yZGlvbi1idXR0b24taWNvbil9O1xcbiAgLS0jeyRwcmVmaXh9YWNjb3JkaW9uLWJ0bi1pY29uLXdpZHRoOiAjeyRhY2NvcmRpb24taWNvbi13aWR0aH07XFxuICAtLSN7JHByZWZpeH1hY2NvcmRpb24tYnRuLWljb24tdHJhbnNmb3JtOiAjeyRhY2NvcmRpb24taWNvbi10cmFuc2Zvcm19O1xcbiAgLS0jeyRwcmVmaXh9YWNjb3JkaW9uLWJ0bi1pY29uLXRyYW5zaXRpb246ICN7JGFjY29yZGlvbi1pY29uLXRyYW5zaXRpb259O1xcbiAgLS0jeyRwcmVmaXh9YWNjb3JkaW9uLWJ0bi1hY3RpdmUtaWNvbjogI3tlc2NhcGUtc3ZnKCRhY2NvcmRpb24tYnV0dG9uLWFjdGl2ZS1pY29uKX07XFxuICAtLSN7JHByZWZpeH1hY2NvcmRpb24tYnRuLWZvY3VzLWJvcmRlci1jb2xvcjogI3skYWNjb3JkaW9uLWJ1dHRvbi1mb2N1cy1ib3JkZXItY29sb3J9O1xcbiAgLS0jeyRwcmVmaXh9YWNjb3JkaW9uLWJ0bi1mb2N1cy1ib3gtc2hhZG93OiAjeyRhY2NvcmRpb24tYnV0dG9uLWZvY3VzLWJveC1zaGFkb3d9O1xcbiAgLS0jeyRwcmVmaXh9YWNjb3JkaW9uLWJvZHktcGFkZGluZy14OiAjeyRhY2NvcmRpb24tYm9keS1wYWRkaW5nLXh9O1xcbiAgLS0jeyRwcmVmaXh9YWNjb3JkaW9uLWJvZHktcGFkZGluZy15OiAjeyRhY2NvcmRpb24tYm9keS1wYWRkaW5nLXl9O1xcbiAgLS0jeyRwcmVmaXh9YWNjb3JkaW9uLWFjdGl2ZS1jb2xvcjogI3skYWNjb3JkaW9uLWJ1dHRvbi1hY3RpdmUtY29sb3J9O1xcbiAgLS0jeyRwcmVmaXh9YWNjb3JkaW9uLWFjdGl2ZS1iZzogI3skYWNjb3JkaW9uLWJ1dHRvbi1hY3RpdmUtYmd9O1xcbiAgLy8gc2Nzcy1kb2NzLWVuZCBhY2NvcmRpb24tY3NzLXZhcnNcXG59XFxuXFxuLmFjY29yZGlvbi1idXR0b24ge1xcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgZGlzcGxheTogZmxleDtcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICB3aWR0aDogMTAwJTtcXG4gIHBhZGRpbmc6IHZhcigtLSN7JHByZWZpeH1hY2NvcmRpb24tYnRuLXBhZGRpbmcteSkgdmFyKC0tI3skcHJlZml4fWFjY29yZGlvbi1idG4tcGFkZGluZy14KTtcXG4gIEBpbmNsdWRlIGZvbnQtc2l6ZSgkZm9udC1zaXplLWJhc2UpO1xcbiAgY29sb3I6IHZhcigtLSN7JHByZWZpeH1hY2NvcmRpb24tYnRuLWNvbG9yKTtcXG4gIHRleHQtYWxpZ246IGxlZnQ7IC8vIFJlc2V0IGJ1dHRvbiBzdHlsZVxcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tI3skcHJlZml4fWFjY29yZGlvbi1idG4tYmcpO1xcbiAgYm9yZGVyOiAwO1xcbiAgQGluY2x1ZGUgYm9yZGVyLXJhZGl1cygwKTtcXG4gIG92ZXJmbG93LWFuY2hvcjogbm9uZTtcXG4gIEBpbmNsdWRlIHRyYW5zaXRpb24odmFyKC0tI3skcHJlZml4fWFjY29yZGlvbi10cmFuc2l0aW9uKSk7XFxuXFxuICAmOm5vdCguY29sbGFwc2VkKSB7XFxuICAgIGNvbG9yOiB2YXIoLS0jeyRwcmVmaXh9YWNjb3JkaW9uLWFjdGl2ZS1jb2xvcik7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLSN7JHByZWZpeH1hY2NvcmRpb24tYWN0aXZlLWJnKTtcXG4gICAgYm94LXNoYWRvdzogaW5zZXQgMCBjYWxjKC0xICogdmFyKC0tI3skcHJlZml4fWFjY29yZGlvbi1ib3JkZXItd2lkdGgpKSAwIHZhcigtLSN7JHByZWZpeH1hY2NvcmRpb24tYm9yZGVyLWNvbG9yKTsgLy8gc3R5bGVsaW50LWRpc2FibGUtbGluZSBmdW5jdGlvbi1kaXNhbGxvd2VkLWxpc3RcXG5cXG4gICAgJjo6YWZ0ZXIge1xcbiAgICAgIGJhY2tncm91bmQtaW1hZ2U6IHZhcigtLSN7JHByZWZpeH1hY2NvcmRpb24tYnRuLWFjdGl2ZS1pY29uKTtcXG4gICAgICB0cmFuc2Zvcm06IHZhcigtLSN7JHByZWZpeH1hY2NvcmRpb24tYnRuLWljb24tdHJhbnNmb3JtKTtcXG4gICAgfVxcbiAgfVxcblxcbiAgLy8gQWNjb3JkaW9uIGljb25cXG4gICY6OmFmdGVyIHtcXG4gICAgZmxleC1zaHJpbms6IDA7XFxuICAgIHdpZHRoOiB2YXIoLS0jeyRwcmVmaXh9YWNjb3JkaW9uLWJ0bi1pY29uLXdpZHRoKTtcXG4gICAgaGVpZ2h0OiB2YXIoLS0jeyRwcmVmaXh9YWNjb3JkaW9uLWJ0bi1pY29uLXdpZHRoKTtcXG4gICAgbWFyZ2luLWxlZnQ6IGF1dG87XFxuICAgIGNvbnRlbnQ6IFxcXCJcXFwiO1xcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB2YXIoLS0jeyRwcmVmaXh9YWNjb3JkaW9uLWJ0bi1pY29uKTtcXG4gICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcXG4gICAgYmFja2dyb3VuZC1zaXplOiB2YXIoLS0jeyRwcmVmaXh9YWNjb3JkaW9uLWJ0bi1pY29uLXdpZHRoKTtcXG4gICAgQGluY2x1ZGUgdHJhbnNpdGlvbih2YXIoLS0jeyRwcmVmaXh9YWNjb3JkaW9uLWJ0bi1pY29uLXRyYW5zaXRpb24pKTtcXG4gIH1cXG5cXG4gICY6aG92ZXIge1xcbiAgICB6LWluZGV4OiAyO1xcbiAgfVxcblxcbiAgJjpmb2N1cyB7XFxuICAgIHotaW5kZXg6IDM7XFxuICAgIGJvcmRlci1jb2xvcjogdmFyKC0tI3skcHJlZml4fWFjY29yZGlvbi1idG4tZm9jdXMtYm9yZGVyLWNvbG9yKTtcXG4gICAgb3V0bGluZTogMDtcXG4gICAgYm94LXNoYWRvdzogdmFyKC0tI3skcHJlZml4fWFjY29yZGlvbi1idG4tZm9jdXMtYm94LXNoYWRvdyk7XFxuICB9XFxufVxcblxcbi5hY2NvcmRpb24taGVhZGVyIHtcXG4gIG1hcmdpbi1ib3R0b206IDA7XFxufVxcblxcbi5hY2NvcmRpb24taXRlbSB7XFxuICBjb2xvcjogdmFyKC0tI3skcHJlZml4fWFjY29yZGlvbi1jb2xvcik7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS0jeyRwcmVmaXh9YWNjb3JkaW9uLWJnKTtcXG4gIGJvcmRlcjogdmFyKC0tI3skcHJlZml4fWFjY29yZGlvbi1ib3JkZXItd2lkdGgpIHNvbGlkIHZhcigtLSN7JHByZWZpeH1hY2NvcmRpb24tYm9yZGVyLWNvbG9yKTtcXG5cXG4gICY6Zmlyc3Qtb2YtdHlwZSB7XFxuICAgIEBpbmNsdWRlIGJvcmRlci10b3AtcmFkaXVzKHZhcigtLSN7JHByZWZpeH1hY2NvcmRpb24tYm9yZGVyLXJhZGl1cykpO1xcblxcbiAgICAuYWNjb3JkaW9uLWJ1dHRvbiB7XFxuICAgICAgQGluY2x1ZGUgYm9yZGVyLXRvcC1yYWRpdXModmFyKC0tI3skcHJlZml4fWFjY29yZGlvbi1pbm5lci1ib3JkZXItcmFkaXVzKSk7XFxuICAgIH1cXG4gIH1cXG5cXG4gICY6bm90KDpmaXJzdC1vZi10eXBlKSB7XFxuICAgIGJvcmRlci10b3A6IDA7XFxuICB9XFxuXFxuICAvLyBPbmx5IHNldCBhIGJvcmRlci1yYWRpdXMgb24gdGhlIGxhc3QgaXRlbSBpZiB0aGUgYWNjb3JkaW9uIGlzIGNvbGxhcHNlZFxcbiAgJjpsYXN0LW9mLXR5cGUge1xcbiAgICBAaW5jbHVkZSBib3JkZXItYm90dG9tLXJhZGl1cyh2YXIoLS0jeyRwcmVmaXh9YWNjb3JkaW9uLWJvcmRlci1yYWRpdXMpKTtcXG5cXG4gICAgLmFjY29yZGlvbi1idXR0b24ge1xcbiAgICAgICYuY29sbGFwc2VkIHtcXG4gICAgICAgIEBpbmNsdWRlIGJvcmRlci1ib3R0b20tcmFkaXVzKHZhcigtLSN7JHByZWZpeH1hY2NvcmRpb24taW5uZXItYm9yZGVyLXJhZGl1cykpO1xcbiAgICAgIH1cXG4gICAgfVxcblxcbiAgICAuYWNjb3JkaW9uLWNvbGxhcHNlIHtcXG4gICAgICBAaW5jbHVkZSBib3JkZXItYm90dG9tLXJhZGl1cyh2YXIoLS0jeyRwcmVmaXh9YWNjb3JkaW9uLWJvcmRlci1yYWRpdXMpKTtcXG4gICAgfVxcbiAgfVxcbn1cXG5cXG4uYWNjb3JkaW9uLWJvZHkge1xcbiAgcGFkZGluZzogdmFyKC0tI3skcHJlZml4fWFjY29yZGlvbi1ib2R5LXBhZGRpbmcteSkgdmFyKC0tI3skcHJlZml4fWFjY29yZGlvbi1ib2R5LXBhZGRpbmcteCk7XFxufVxcblxcblxcbi8vIEZsdXNoIGFjY29yZGlvbiBpdGVtc1xcbi8vXFxuLy8gUmVtb3ZlIGJvcmRlcnMgYW5kIGJvcmRlci1yYWRpdXMgdG8ga2VlcCBhY2NvcmRpb24gaXRlbXMgZWRnZS10by1lZGdlLlxcblxcbi5hY2NvcmRpb24tZmx1c2gge1xcbiAgLmFjY29yZGlvbi1jb2xsYXBzZSB7XFxuICAgIGJvcmRlci13aWR0aDogMDtcXG4gIH1cXG5cXG4gIC5hY2NvcmRpb24taXRlbSB7XFxuICAgIGJvcmRlci1yaWdodDogMDtcXG4gICAgYm9yZGVyLWxlZnQ6IDA7XFxuICAgIEBpbmNsdWRlIGJvcmRlci1yYWRpdXMoMCk7XFxuXFxuICAgICY6Zmlyc3QtY2hpbGQgeyBib3JkZXItdG9wOiAwOyB9XFxuICAgICY6bGFzdC1jaGlsZCB7IGJvcmRlci1ib3R0b206IDA7IH1cXG5cXG4gICAgLmFjY29yZGlvbi1idXR0b24ge1xcbiAgICAgICYsXFxuICAgICAgJi5jb2xsYXBzZWQge1xcbiAgICAgICAgQGluY2x1ZGUgYm9yZGVyLXJhZGl1cygwKTtcXG4gICAgICB9XFxuICAgIH1cXG4gIH1cXG59XFxuXFxuQGlmICRlbmFibGUtZGFyay1tb2RlIHtcXG4gIEBpbmNsdWRlIGNvbG9yLW1vZGUoZGFyaykge1xcbiAgICAuYWNjb3JkaW9uLWJ1dHRvbjo6YWZ0ZXIge1xcbiAgICAgIC0tI3skcHJlZml4fWFjY29yZGlvbi1idG4taWNvbjogI3tlc2NhcGUtc3ZnKCRhY2NvcmRpb24tYnV0dG9uLWljb24tZGFyayl9O1xcbiAgICAgIC0tI3skcHJlZml4fWFjY29yZGlvbi1idG4tYWN0aXZlLWljb246ICN7ZXNjYXBlLXN2ZygkYWNjb3JkaW9uLWJ1dHRvbi1hY3RpdmUtaWNvbi1kYXJrKX07XFxuICAgIH1cXG4gIH1cXG59XFxuXCIsXCIuYnJlYWRjcnVtYiB7XFxuICAvLyBzY3NzLWRvY3Mtc3RhcnQgYnJlYWRjcnVtYi1jc3MtdmFyc1xcbiAgLS0jeyRwcmVmaXh9YnJlYWRjcnVtYi1wYWRkaW5nLXg6ICN7JGJyZWFkY3J1bWItcGFkZGluZy14fTtcXG4gIC0tI3skcHJlZml4fWJyZWFkY3J1bWItcGFkZGluZy15OiAjeyRicmVhZGNydW1iLXBhZGRpbmcteX07XFxuICAtLSN7JHByZWZpeH1icmVhZGNydW1iLW1hcmdpbi1ib3R0b206ICN7JGJyZWFkY3J1bWItbWFyZ2luLWJvdHRvbX07XFxuICBAaW5jbHVkZSByZnMoJGJyZWFkY3J1bWItZm9udC1zaXplLCAtLSN7JHByZWZpeH1icmVhZGNydW1iLWZvbnQtc2l6ZSk7XFxuICAtLSN7JHByZWZpeH1icmVhZGNydW1iLWJnOiAjeyRicmVhZGNydW1iLWJnfTtcXG4gIC0tI3skcHJlZml4fWJyZWFkY3J1bWItYm9yZGVyLXJhZGl1czogI3skYnJlYWRjcnVtYi1ib3JkZXItcmFkaXVzfTtcXG4gIC0tI3skcHJlZml4fWJyZWFkY3J1bWItZGl2aWRlci1jb2xvcjogI3skYnJlYWRjcnVtYi1kaXZpZGVyLWNvbG9yfTtcXG4gIC0tI3skcHJlZml4fWJyZWFkY3J1bWItaXRlbS1wYWRkaW5nLXg6ICN7JGJyZWFkY3J1bWItaXRlbS1wYWRkaW5nLXh9O1xcbiAgLS0jeyRwcmVmaXh9YnJlYWRjcnVtYi1pdGVtLWFjdGl2ZS1jb2xvcjogI3skYnJlYWRjcnVtYi1hY3RpdmUtY29sb3J9O1xcbiAgLy8gc2Nzcy1kb2NzLWVuZCBicmVhZGNydW1iLWNzcy12YXJzXFxuXFxuICBkaXNwbGF5OiBmbGV4O1xcbiAgZmxleC13cmFwOiB3cmFwO1xcbiAgcGFkZGluZzogdmFyKC0tI3skcHJlZml4fWJyZWFkY3J1bWItcGFkZGluZy15KSB2YXIoLS0jeyRwcmVmaXh9YnJlYWRjcnVtYi1wYWRkaW5nLXgpO1xcbiAgbWFyZ2luLWJvdHRvbTogdmFyKC0tI3skcHJlZml4fWJyZWFkY3J1bWItbWFyZ2luLWJvdHRvbSk7XFxuICBAaW5jbHVkZSBmb250LXNpemUodmFyKC0tI3skcHJlZml4fWJyZWFkY3J1bWItZm9udC1zaXplKSk7XFxuICBsaXN0LXN0eWxlOiBub25lO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tI3skcHJlZml4fWJyZWFkY3J1bWItYmcpO1xcbiAgQGluY2x1ZGUgYm9yZGVyLXJhZGl1cyh2YXIoLS0jeyRwcmVmaXh9YnJlYWRjcnVtYi1ib3JkZXItcmFkaXVzKSk7XFxufVxcblxcbi5icmVhZGNydW1iLWl0ZW0ge1xcbiAgLy8gVGhlIHNlcGFyYXRvciBiZXR3ZWVuIGJyZWFkY3J1bWJzIChieSBkZWZhdWx0LCBhIGZvcndhcmQtc2xhc2g6IFxcXCIvXFxcIilcXG4gICsgLmJyZWFkY3J1bWItaXRlbSB7XFxuICAgIHBhZGRpbmctbGVmdDogdmFyKC0tI3skcHJlZml4fWJyZWFkY3J1bWItaXRlbS1wYWRkaW5nLXgpO1xcblxcbiAgICAmOjpiZWZvcmUge1xcbiAgICAgIGZsb2F0OiBsZWZ0OyAvLyBTdXBwcmVzcyBpbmxpbmUgc3BhY2luZ3MgYW5kIHVuZGVybGluaW5nIG9mIHRoZSBzZXBhcmF0b3JcXG4gICAgICBwYWRkaW5nLXJpZ2h0OiB2YXIoLS0jeyRwcmVmaXh9YnJlYWRjcnVtYi1pdGVtLXBhZGRpbmcteCk7XFxuICAgICAgY29sb3I6IHZhcigtLSN7JHByZWZpeH1icmVhZGNydW1iLWRpdmlkZXItY29sb3IpO1xcbiAgICAgIGNvbnRlbnQ6IHZhcigtLSN7JHByZWZpeH1icmVhZGNydW1iLWRpdmlkZXIsIGVzY2FwZS1zdmcoJGJyZWFkY3J1bWItZGl2aWRlcikpICN7XFxcIi8qIHJ0bDpcXFwifSB2YXIoLS0jeyRwcmVmaXh9YnJlYWRjcnVtYi1kaXZpZGVyLCBlc2NhcGUtc3ZnKCRicmVhZGNydW1iLWRpdmlkZXItZmxpcHBlZCkpICN7XFxcIiovXFxcIn07XFxuICAgIH1cXG4gIH1cXG5cXG4gICYuYWN0aXZlIHtcXG4gICAgY29sb3I6IHZhcigtLSN7JHByZWZpeH1icmVhZGNydW1iLWl0ZW0tYWN0aXZlLWNvbG9yKTtcXG4gIH1cXG59XFxuXCIsXCIucGFnaW5hdGlvbiB7XFxuICAvLyBzY3NzLWRvY3Mtc3RhcnQgcGFnaW5hdGlvbi1jc3MtdmFyc1xcbiAgLS0jeyRwcmVmaXh9cGFnaW5hdGlvbi1wYWRkaW5nLXg6ICN7JHBhZ2luYXRpb24tcGFkZGluZy14fTtcXG4gIC0tI3skcHJlZml4fXBhZ2luYXRpb24tcGFkZGluZy15OiAjeyRwYWdpbmF0aW9uLXBhZGRpbmcteX07XFxuICBAaW5jbHVkZSByZnMoJHBhZ2luYXRpb24tZm9udC1zaXplLCAtLSN7JHByZWZpeH1wYWdpbmF0aW9uLWZvbnQtc2l6ZSk7XFxuICAtLSN7JHByZWZpeH1wYWdpbmF0aW9uLWNvbG9yOiAjeyRwYWdpbmF0aW9uLWNvbG9yfTtcXG4gIC0tI3skcHJlZml4fXBhZ2luYXRpb24tYmc6ICN7JHBhZ2luYXRpb24tYmd9O1xcbiAgLS0jeyRwcmVmaXh9cGFnaW5hdGlvbi1ib3JkZXItd2lkdGg6ICN7JHBhZ2luYXRpb24tYm9yZGVyLXdpZHRofTtcXG4gIC0tI3skcHJlZml4fXBhZ2luYXRpb24tYm9yZGVyLWNvbG9yOiAjeyRwYWdpbmF0aW9uLWJvcmRlci1jb2xvcn07XFxuICAtLSN7JHByZWZpeH1wYWdpbmF0aW9uLWJvcmRlci1yYWRpdXM6ICN7JHBhZ2luYXRpb24tYm9yZGVyLXJhZGl1c307XFxuICAtLSN7JHByZWZpeH1wYWdpbmF0aW9uLWhvdmVyLWNvbG9yOiAjeyRwYWdpbmF0aW9uLWhvdmVyLWNvbG9yfTtcXG4gIC0tI3skcHJlZml4fXBhZ2luYXRpb24taG92ZXItYmc6ICN7JHBhZ2luYXRpb24taG92ZXItYmd9O1xcbiAgLS0jeyRwcmVmaXh9cGFnaW5hdGlvbi1ob3Zlci1ib3JkZXItY29sb3I6ICN7JHBhZ2luYXRpb24taG92ZXItYm9yZGVyLWNvbG9yfTtcXG4gIC0tI3skcHJlZml4fXBhZ2luYXRpb24tZm9jdXMtY29sb3I6ICN7JHBhZ2luYXRpb24tZm9jdXMtY29sb3J9O1xcbiAgLS0jeyRwcmVmaXh9cGFnaW5hdGlvbi1mb2N1cy1iZzogI3skcGFnaW5hdGlvbi1mb2N1cy1iZ307XFxuICAtLSN7JHByZWZpeH1wYWdpbmF0aW9uLWZvY3VzLWJveC1zaGFkb3c6ICN7JHBhZ2luYXRpb24tZm9jdXMtYm94LXNoYWRvd307XFxuICAtLSN7JHByZWZpeH1wYWdpbmF0aW9uLWFjdGl2ZS1jb2xvcjogI3skcGFnaW5hdGlvbi1hY3RpdmUtY29sb3J9O1xcbiAgLS0jeyRwcmVmaXh9cGFnaW5hdGlvbi1hY3RpdmUtYmc6ICN7JHBhZ2luYXRpb24tYWN0aXZlLWJnfTtcXG4gIC0tI3skcHJlZml4fXBhZ2luYXRpb24tYWN0aXZlLWJvcmRlci1jb2xvcjogI3skcGFnaW5hdGlvbi1hY3RpdmUtYm9yZGVyLWNvbG9yfTtcXG4gIC0tI3skcHJlZml4fXBhZ2luYXRpb24tZGlzYWJsZWQtY29sb3I6ICN7JHBhZ2luYXRpb24tZGlzYWJsZWQtY29sb3J9O1xcbiAgLS0jeyRwcmVmaXh9cGFnaW5hdGlvbi1kaXNhYmxlZC1iZzogI3skcGFnaW5hdGlvbi1kaXNhYmxlZC1iZ307XFxuICAtLSN7JHByZWZpeH1wYWdpbmF0aW9uLWRpc2FibGVkLWJvcmRlci1jb2xvcjogI3skcGFnaW5hdGlvbi1kaXNhYmxlZC1ib3JkZXItY29sb3J9O1xcbiAgLy8gc2Nzcy1kb2NzLWVuZCBwYWdpbmF0aW9uLWNzcy12YXJzXFxuXFxuICBkaXNwbGF5OiBmbGV4O1xcbiAgQGluY2x1ZGUgbGlzdC11bnN0eWxlZCgpO1xcbn1cXG5cXG4ucGFnZS1saW5rIHtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIGRpc3BsYXk6IGJsb2NrO1xcbiAgcGFkZGluZzogdmFyKC0tI3skcHJlZml4fXBhZ2luYXRpb24tcGFkZGluZy15KSB2YXIoLS0jeyRwcmVmaXh9cGFnaW5hdGlvbi1wYWRkaW5nLXgpO1xcbiAgQGluY2x1ZGUgZm9udC1zaXplKHZhcigtLSN7JHByZWZpeH1wYWdpbmF0aW9uLWZvbnQtc2l6ZSkpO1xcbiAgY29sb3I6IHZhcigtLSN7JHByZWZpeH1wYWdpbmF0aW9uLWNvbG9yKTtcXG4gIHRleHQtZGVjb3JhdGlvbjogaWYoJGxpbmstZGVjb3JhdGlvbiA9PSBub25lLCBudWxsLCBub25lKTtcXG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLSN7JHByZWZpeH1wYWdpbmF0aW9uLWJnKTtcXG4gIGJvcmRlcjogdmFyKC0tI3skcHJlZml4fXBhZ2luYXRpb24tYm9yZGVyLXdpZHRoKSBzb2xpZCB2YXIoLS0jeyRwcmVmaXh9cGFnaW5hdGlvbi1ib3JkZXItY29sb3IpO1xcbiAgQGluY2x1ZGUgdHJhbnNpdGlvbigkcGFnaW5hdGlvbi10cmFuc2l0aW9uKTtcXG5cXG4gICY6aG92ZXIge1xcbiAgICB6LWluZGV4OiAyO1xcbiAgICBjb2xvcjogdmFyKC0tI3skcHJlZml4fXBhZ2luYXRpb24taG92ZXItY29sb3IpO1xcbiAgICB0ZXh0LWRlY29yYXRpb246IGlmKCRsaW5rLWhvdmVyLWRlY29yYXRpb24gPT0gdW5kZXJsaW5lLCBub25lLCBudWxsKTtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tI3skcHJlZml4fXBhZ2luYXRpb24taG92ZXItYmcpO1xcbiAgICBib3JkZXItY29sb3I6IHZhcigtLSN7JHByZWZpeH1wYWdpbmF0aW9uLWhvdmVyLWJvcmRlci1jb2xvcik7XFxuICB9XFxuXFxuICAmOmZvY3VzIHtcXG4gICAgei1pbmRleDogMztcXG4gICAgY29sb3I6IHZhcigtLSN7JHByZWZpeH1wYWdpbmF0aW9uLWZvY3VzLWNvbG9yKTtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tI3skcHJlZml4fXBhZ2luYXRpb24tZm9jdXMtYmcpO1xcbiAgICBvdXRsaW5lOiAkcGFnaW5hdGlvbi1mb2N1cy1vdXRsaW5lO1xcbiAgICBib3gtc2hhZG93OiB2YXIoLS0jeyRwcmVmaXh9cGFnaW5hdGlvbi1mb2N1cy1ib3gtc2hhZG93KTtcXG4gIH1cXG5cXG4gICYuYWN0aXZlLFxcbiAgLmFjdGl2ZSA+ICYge1xcbiAgICB6LWluZGV4OiAzO1xcbiAgICBjb2xvcjogdmFyKC0tI3skcHJlZml4fXBhZ2luYXRpb24tYWN0aXZlLWNvbG9yKTtcXG4gICAgQGluY2x1ZGUgZ3JhZGllbnQtYmcodmFyKC0tI3skcHJlZml4fXBhZ2luYXRpb24tYWN0aXZlLWJnKSk7XFxuICAgIGJvcmRlci1jb2xvcjogdmFyKC0tI3skcHJlZml4fXBhZ2luYXRpb24tYWN0aXZlLWJvcmRlci1jb2xvcik7XFxuICB9XFxuXFxuICAmLmRpc2FibGVkLFxcbiAgLmRpc2FibGVkID4gJiB7XFxuICAgIGNvbG9yOiB2YXIoLS0jeyRwcmVmaXh9cGFnaW5hdGlvbi1kaXNhYmxlZC1jb2xvcik7XFxuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS0jeyRwcmVmaXh9cGFnaW5hdGlvbi1kaXNhYmxlZC1iZyk7XFxuICAgIGJvcmRlci1jb2xvcjogdmFyKC0tI3skcHJlZml4fXBhZ2luYXRpb24tZGlzYWJsZWQtYm9yZGVyLWNvbG9yKTtcXG4gIH1cXG59XFxuXFxuLnBhZ2UtaXRlbSB7XFxuICAmOm5vdCg6Zmlyc3QtY2hpbGQpIC5wYWdlLWxpbmsge1xcbiAgICBtYXJnaW4tbGVmdDogJHBhZ2luYXRpb24tbWFyZ2luLXN0YXJ0O1xcbiAgfVxcblxcbiAgQGlmICRwYWdpbmF0aW9uLW1hcmdpbi1zdGFydCA9PSBjYWxjKCN7JHBhZ2luYXRpb24tYm9yZGVyLXdpZHRofSAqIC0xKSB7XFxuICAgICY6Zmlyc3QtY2hpbGQge1xcbiAgICAgIC5wYWdlLWxpbmsge1xcbiAgICAgICAgQGluY2x1ZGUgYm9yZGVyLXN0YXJ0LXJhZGl1cyh2YXIoLS0jeyRwcmVmaXh9cGFnaW5hdGlvbi1ib3JkZXItcmFkaXVzKSk7XFxuICAgICAgfVxcbiAgICB9XFxuXFxuICAgICY6bGFzdC1jaGlsZCB7XFxuICAgICAgLnBhZ2UtbGluayB7XFxuICAgICAgICBAaW5jbHVkZSBib3JkZXItZW5kLXJhZGl1cyh2YXIoLS0jeyRwcmVmaXh9cGFnaW5hdGlvbi1ib3JkZXItcmFkaXVzKSk7XFxuICAgICAgfVxcbiAgICB9XFxuICB9IEBlbHNlIHtcXG4gICAgLy8gQWRkIGJvcmRlci1yYWRpdXMgdG8gYWxsIHBhZ2VMaW5rcyBpbiBjYXNlIHRoZXkgaGF2ZSBsZWZ0IG1hcmdpblxcbiAgICAucGFnZS1saW5rIHtcXG4gICAgICBAaW5jbHVkZSBib3JkZXItcmFkaXVzKHZhcigtLSN7JHByZWZpeH1wYWdpbmF0aW9uLWJvcmRlci1yYWRpdXMpKTtcXG4gICAgfVxcbiAgfVxcbn1cXG5cXG5cXG4vL1xcbi8vIFNpemluZ1xcbi8vXFxuXFxuLnBhZ2luYXRpb24tbGcge1xcbiAgQGluY2x1ZGUgcGFnaW5hdGlvbi1zaXplKCRwYWdpbmF0aW9uLXBhZGRpbmcteS1sZywgJHBhZ2luYXRpb24tcGFkZGluZy14LWxnLCAkZm9udC1zaXplLWxnLCAkcGFnaW5hdGlvbi1ib3JkZXItcmFkaXVzLWxnKTtcXG59XFxuXFxuLnBhZ2luYXRpb24tc20ge1xcbiAgQGluY2x1ZGUgcGFnaW5hdGlvbi1zaXplKCRwYWdpbmF0aW9uLXBhZGRpbmcteS1zbSwgJHBhZ2luYXRpb24tcGFkZGluZy14LXNtLCAkZm9udC1zaXplLXNtLCAkcGFnaW5hdGlvbi1ib3JkZXItcmFkaXVzLXNtKTtcXG59XFxuXCIsXCIvLyBQYWdpbmF0aW9uXFxuXFxuLy8gc2Nzcy1kb2NzLXN0YXJ0IHBhZ2luYXRpb24tbWl4aW5cXG5AbWl4aW4gcGFnaW5hdGlvbi1zaXplKCRwYWRkaW5nLXksICRwYWRkaW5nLXgsICRmb250LXNpemUsICRib3JkZXItcmFkaXVzKSB7XFxuICAtLSN7JHByZWZpeH1wYWdpbmF0aW9uLXBhZGRpbmcteDogI3skcGFkZGluZy14fTtcXG4gIC0tI3skcHJlZml4fXBhZ2luYXRpb24tcGFkZGluZy15OiAjeyRwYWRkaW5nLXl9O1xcbiAgQGluY2x1ZGUgcmZzKCRmb250LXNpemUsIC0tI3skcHJlZml4fXBhZ2luYXRpb24tZm9udC1zaXplKTtcXG4gIC0tI3skcHJlZml4fXBhZ2luYXRpb24tYm9yZGVyLXJhZGl1czogI3skYm9yZGVyLXJhZGl1c307XFxufVxcbi8vIHNjc3MtZG9jcy1lbmQgcGFnaW5hdGlvbi1taXhpblxcblwiLFwiLy8gQmFzZSBjbGFzc1xcbi8vXFxuLy8gUmVxdWlyZXMgb25lIG9mIHRoZSBjb250ZXh0dWFsLCBjb2xvciBtb2RpZmllciBjbGFzc2VzIGZvciBgY29sb3JgIGFuZFxcbi8vIGBiYWNrZ3JvdW5kLWNvbG9yYC5cXG5cXG4uYmFkZ2Uge1xcbiAgLy8gc2Nzcy1kb2NzLXN0YXJ0IGJhZGdlLWNzcy12YXJzXFxuICAtLSN7JHByZWZpeH1iYWRnZS1wYWRkaW5nLXg6ICN7JGJhZGdlLXBhZGRpbmcteH07XFxuICAtLSN7JHByZWZpeH1iYWRnZS1wYWRkaW5nLXk6ICN7JGJhZGdlLXBhZGRpbmcteX07XFxuICBAaW5jbHVkZSByZnMoJGJhZGdlLWZvbnQtc2l6ZSwgLS0jeyRwcmVmaXh9YmFkZ2UtZm9udC1zaXplKTtcXG4gIC0tI3skcHJlZml4fWJhZGdlLWZvbnQtd2VpZ2h0OiAjeyRiYWRnZS1mb250LXdlaWdodH07XFxuICAtLSN7JHByZWZpeH1iYWRnZS1jb2xvcjogI3skYmFkZ2UtY29sb3J9O1xcbiAgLS0jeyRwcmVmaXh9YmFkZ2UtYm9yZGVyLXJhZGl1czogI3skYmFkZ2UtYm9yZGVyLXJhZGl1c307XFxuICAvLyBzY3NzLWRvY3MtZW5kIGJhZGdlLWNzcy12YXJzXFxuXFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICBwYWRkaW5nOiB2YXIoLS0jeyRwcmVmaXh9YmFkZ2UtcGFkZGluZy15KSB2YXIoLS0jeyRwcmVmaXh9YmFkZ2UtcGFkZGluZy14KTtcXG4gIEBpbmNsdWRlIGZvbnQtc2l6ZSh2YXIoLS0jeyRwcmVmaXh9YmFkZ2UtZm9udC1zaXplKSk7XFxuICBmb250LXdlaWdodDogdmFyKC0tI3skcHJlZml4fWJhZGdlLWZvbnQtd2VpZ2h0KTtcXG4gIGxpbmUtaGVpZ2h0OiAxO1xcbiAgY29sb3I6IHZhcigtLSN7JHByZWZpeH1iYWRnZS1jb2xvcik7XFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xcbiAgdmVydGljYWwtYWxpZ246IGJhc2VsaW5lO1xcbiAgQGluY2x1ZGUgYm9yZGVyLXJhZGl1cyh2YXIoLS0jeyRwcmVmaXh9YmFkZ2UtYm9yZGVyLXJhZGl1cykpO1xcbiAgQGluY2x1ZGUgZ3JhZGllbnQtYmcoKTtcXG5cXG4gIC8vIEVtcHR5IGJhZGdlcyBjb2xsYXBzZSBhdXRvbWF0aWNhbGx5XFxuICAmOmVtcHR5IHtcXG4gICAgZGlzcGxheTogbm9uZTtcXG4gIH1cXG59XFxuXFxuLy8gUXVpY2sgZml4IGZvciBiYWRnZXMgaW4gYnV0dG9uc1xcbi5idG4gLmJhZGdlIHtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIHRvcDogLTFweDtcXG59XFxuXCIsXCIvL1xcbi8vIEJhc2Ugc3R5bGVzXFxuLy9cXG5cXG4uYWxlcnQge1xcbiAgLy8gc2Nzcy1kb2NzLXN0YXJ0IGFsZXJ0LWNzcy12YXJzXFxuICAtLSN7JHByZWZpeH1hbGVydC1iZzogdHJhbnNwYXJlbnQ7XFxuICAtLSN7JHByZWZpeH1hbGVydC1wYWRkaW5nLXg6ICN7JGFsZXJ0LXBhZGRpbmcteH07XFxuICAtLSN7JHByZWZpeH1hbGVydC1wYWRkaW5nLXk6ICN7JGFsZXJ0LXBhZGRpbmcteX07XFxuICAtLSN7JHByZWZpeH1hbGVydC1tYXJnaW4tYm90dG9tOiAjeyRhbGVydC1tYXJnaW4tYm90dG9tfTtcXG4gIC0tI3skcHJlZml4fWFsZXJ0LWNvbG9yOiBpbmhlcml0O1xcbiAgLS0jeyRwcmVmaXh9YWxlcnQtYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDtcXG4gIC0tI3skcHJlZml4fWFsZXJ0LWJvcmRlcjogI3skYWxlcnQtYm9yZGVyLXdpZHRofSBzb2xpZCB2YXIoLS0jeyRwcmVmaXh9YWxlcnQtYm9yZGVyLWNvbG9yKTtcXG4gIC0tI3skcHJlZml4fWFsZXJ0LWJvcmRlci1yYWRpdXM6ICN7JGFsZXJ0LWJvcmRlci1yYWRpdXN9O1xcbiAgLS0jeyRwcmVmaXh9YWxlcnQtbGluay1jb2xvcjogaW5oZXJpdDtcXG4gIC8vIHNjc3MtZG9jcy1lbmQgYWxlcnQtY3NzLXZhcnNcXG5cXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIHBhZGRpbmc6IHZhcigtLSN7JHByZWZpeH1hbGVydC1wYWRkaW5nLXkpIHZhcigtLSN7JHByZWZpeH1hbGVydC1wYWRkaW5nLXgpO1xcbiAgbWFyZ2luLWJvdHRvbTogdmFyKC0tI3skcHJlZml4fWFsZXJ0LW1hcmdpbi1ib3R0b20pO1xcbiAgY29sb3I6IHZhcigtLSN7JHByZWZpeH1hbGVydC1jb2xvcik7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS0jeyRwcmVmaXh9YWxlcnQtYmcpO1xcbiAgYm9yZGVyOiB2YXIoLS0jeyRwcmVmaXh9YWxlcnQtYm9yZGVyKTtcXG4gIEBpbmNsdWRlIGJvcmRlci1yYWRpdXModmFyKC0tI3skcHJlZml4fWFsZXJ0LWJvcmRlci1yYWRpdXMpKTtcXG59XFxuXFxuLy8gSGVhZGluZ3MgZm9yIGxhcmdlciBhbGVydHNcXG4uYWxlcnQtaGVhZGluZyB7XFxuICAvLyBTcGVjaWZpZWQgdG8gcHJldmVudCBjb25mbGljdHMgb2YgY2hhbmdpbmcgJGhlYWRpbmdzLWNvbG9yXFxuICBjb2xvcjogaW5oZXJpdDtcXG59XFxuXFxuLy8gUHJvdmlkZSBjbGFzcyBmb3IgbGlua3MgdGhhdCBtYXRjaCBhbGVydHNcXG4uYWxlcnQtbGluayB7XFxuICBmb250LXdlaWdodDogJGFsZXJ0LWxpbmstZm9udC13ZWlnaHQ7XFxuICBjb2xvcjogdmFyKC0tI3skcHJlZml4fWFsZXJ0LWxpbmstY29sb3IpO1xcbn1cXG5cXG5cXG4vLyBEaXNtaXNzaWJsZSBhbGVydHNcXG4vL1xcbi8vIEV4cGFuZCB0aGUgcmlnaHQgcGFkZGluZyBhbmQgYWNjb3VudCBmb3IgdGhlIGNsb3NlIGJ1dHRvbidzIHBvc2l0aW9uaW5nLlxcblxcbi5hbGVydC1kaXNtaXNzaWJsZSB7XFxuICBwYWRkaW5nLXJpZ2h0OiAkYWxlcnQtZGlzbWlzc2libGUtcGFkZGluZy1yO1xcblxcbiAgLy8gQWRqdXN0IGNsb3NlIGxpbmsgcG9zaXRpb25cXG4gIC5idG4tY2xvc2Uge1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIHRvcDogMDtcXG4gICAgcmlnaHQ6IDA7XFxuICAgIHotaW5kZXg6ICRzdHJldGNoZWQtbGluay16LWluZGV4ICsgMTtcXG4gICAgcGFkZGluZzogJGFsZXJ0LXBhZGRpbmcteSAqIDEuMjUgJGFsZXJ0LXBhZGRpbmcteDtcXG4gIH1cXG59XFxuXFxuXFxuLy8gc2Nzcy1kb2NzLXN0YXJ0IGFsZXJ0LW1vZGlmaWVyc1xcbi8vIEdlbmVyYXRlIGNvbnRleHR1YWwgbW9kaWZpZXIgY2xhc3NlcyBmb3IgY29sb3JpemluZyB0aGUgYWxlcnRcXG5AZWFjaCAkc3RhdGUgaW4gbWFwLWtleXMoJHRoZW1lLWNvbG9ycykge1xcbiAgLmFsZXJ0LSN7JHN0YXRlfSB7XFxuICAgIC0tI3skcHJlZml4fWFsZXJ0LWNvbG9yOiB2YXIoLS0jeyRwcmVmaXh9I3skc3RhdGV9LXRleHQtZW1waGFzaXMpO1xcbiAgICAtLSN7JHByZWZpeH1hbGVydC1iZzogdmFyKC0tI3skcHJlZml4fSN7JHN0YXRlfS1iZy1zdWJ0bGUpO1xcbiAgICAtLSN7JHByZWZpeH1hbGVydC1ib3JkZXItY29sb3I6IHZhcigtLSN7JHByZWZpeH0jeyRzdGF0ZX0tYm9yZGVyLXN1YnRsZSk7XFxuICAgIC0tI3skcHJlZml4fWFsZXJ0LWxpbmstY29sb3I6IHZhcigtLSN7JHByZWZpeH0jeyRzdGF0ZX0tdGV4dC1lbXBoYXNpcyk7XFxuICB9XFxufVxcbi8vIHNjc3MtZG9jcy1lbmQgYWxlcnQtbW9kaWZpZXJzXFxuXCIsXCIvLyBEaXNhYmxlIGFuaW1hdGlvbiBpZiB0cmFuc2l0aW9ucyBhcmUgZGlzYWJsZWRcXG5cXG4vLyBzY3NzLWRvY3Mtc3RhcnQgcHJvZ3Jlc3Mta2V5ZnJhbWVzXFxuQGlmICRlbmFibGUtdHJhbnNpdGlvbnMge1xcbiAgQGtleWZyYW1lcyBwcm9ncmVzcy1iYXItc3RyaXBlcyB7XFxuICAgIDAlIHsgYmFja2dyb3VuZC1wb3NpdGlvbi14OiAkcHJvZ3Jlc3MtaGVpZ2h0OyB9XFxuICB9XFxufVxcbi8vIHNjc3MtZG9jcy1lbmQgcHJvZ3Jlc3Mta2V5ZnJhbWVzXFxuXFxuLnByb2dyZXNzLFxcbi5wcm9ncmVzcy1zdGFja2VkIHtcXG4gIC8vIHNjc3MtZG9jcy1zdGFydCBwcm9ncmVzcy1jc3MtdmFyc1xcbiAgLS0jeyRwcmVmaXh9cHJvZ3Jlc3MtaGVpZ2h0OiAjeyRwcm9ncmVzcy1oZWlnaHR9O1xcbiAgQGluY2x1ZGUgcmZzKCRwcm9ncmVzcy1mb250LXNpemUsIC0tI3skcHJlZml4fXByb2dyZXNzLWZvbnQtc2l6ZSk7XFxuICAtLSN7JHByZWZpeH1wcm9ncmVzcy1iZzogI3skcHJvZ3Jlc3MtYmd9O1xcbiAgLS0jeyRwcmVmaXh9cHJvZ3Jlc3MtYm9yZGVyLXJhZGl1czogI3skcHJvZ3Jlc3MtYm9yZGVyLXJhZGl1c307XFxuICAtLSN7JHByZWZpeH1wcm9ncmVzcy1ib3gtc2hhZG93OiAjeyRwcm9ncmVzcy1ib3gtc2hhZG93fTtcXG4gIC0tI3skcHJlZml4fXByb2dyZXNzLWJhci1jb2xvcjogI3skcHJvZ3Jlc3MtYmFyLWNvbG9yfTtcXG4gIC0tI3skcHJlZml4fXByb2dyZXNzLWJhci1iZzogI3skcHJvZ3Jlc3MtYmFyLWJnfTtcXG4gIC0tI3skcHJlZml4fXByb2dyZXNzLWJhci10cmFuc2l0aW9uOiAjeyRwcm9ncmVzcy1iYXItdHJhbnNpdGlvbn07XFxuICAvLyBzY3NzLWRvY3MtZW5kIHByb2dyZXNzLWNzcy12YXJzXFxuXFxuICBkaXNwbGF5OiBmbGV4O1xcbiAgaGVpZ2h0OiB2YXIoLS0jeyRwcmVmaXh9cHJvZ3Jlc3MtaGVpZ2h0KTtcXG4gIG92ZXJmbG93OiBoaWRkZW47IC8vIGZvcmNlIHJvdW5kZWQgY29ybmVycyBieSBjcm9wcGluZyBpdFxcbiAgQGluY2x1ZGUgZm9udC1zaXplKHZhcigtLSN7JHByZWZpeH1wcm9ncmVzcy1mb250LXNpemUpKTtcXG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLSN7JHByZWZpeH1wcm9ncmVzcy1iZyk7XFxuICBAaW5jbHVkZSBib3JkZXItcmFkaXVzKHZhcigtLSN7JHByZWZpeH1wcm9ncmVzcy1ib3JkZXItcmFkaXVzKSk7XFxuICBAaW5jbHVkZSBib3gtc2hhZG93KHZhcigtLSN7JHByZWZpeH1wcm9ncmVzcy1ib3gtc2hhZG93KSk7XFxufVxcblxcbi5wcm9ncmVzcy1iYXIge1xcbiAgZGlzcGxheTogZmxleDtcXG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XFxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gIG92ZXJmbG93OiBoaWRkZW47XFxuICBjb2xvcjogdmFyKC0tI3skcHJlZml4fXByb2dyZXNzLWJhci1jb2xvcik7XFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tI3skcHJlZml4fXByb2dyZXNzLWJhci1iZyk7XFxuICBAaW5jbHVkZSB0cmFuc2l0aW9uKHZhcigtLSN7JHByZWZpeH1wcm9ncmVzcy1iYXItdHJhbnNpdGlvbikpO1xcbn1cXG5cXG4ucHJvZ3Jlc3MtYmFyLXN0cmlwZWQge1xcbiAgQGluY2x1ZGUgZ3JhZGllbnQtc3RyaXBlZCgpO1xcbiAgYmFja2dyb3VuZC1zaXplOiB2YXIoLS0jeyRwcmVmaXh9cHJvZ3Jlc3MtaGVpZ2h0KSB2YXIoLS0jeyRwcmVmaXh9cHJvZ3Jlc3MtaGVpZ2h0KTtcXG59XFxuXFxuLnByb2dyZXNzLXN0YWNrZWQgPiAucHJvZ3Jlc3Mge1xcbiAgb3ZlcmZsb3c6IHZpc2libGU7XFxufVxcblxcbi5wcm9ncmVzcy1zdGFja2VkID4gLnByb2dyZXNzID4gLnByb2dyZXNzLWJhciB7XFxuICB3aWR0aDogMTAwJTtcXG59XFxuXFxuQGlmICRlbmFibGUtdHJhbnNpdGlvbnMge1xcbiAgLnByb2dyZXNzLWJhci1hbmltYXRlZCB7XFxuICAgIGFuaW1hdGlvbjogJHByb2dyZXNzLWJhci1hbmltYXRpb24tdGltaW5nIHByb2dyZXNzLWJhci1zdHJpcGVzO1xcblxcbiAgICBAaWYgJGVuYWJsZS1yZWR1Y2VkLW1vdGlvbiB7XFxuICAgICAgQG1lZGlhIChwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2UpIHtcXG4gICAgICAgIGFuaW1hdGlvbjogbm9uZTtcXG4gICAgICB9XFxuICAgIH1cXG4gIH1cXG59XFxuXCIsXCIvLyBCYXNlIGNsYXNzXFxuLy9cXG4vLyBFYXNpbHkgdXNhYmxlIG9uIDx1bD4sIDxvbD4sIG9yIDxkaXY+Llxcblxcbi5saXN0LWdyb3VwIHtcXG4gIC8vIHNjc3MtZG9jcy1zdGFydCBsaXN0LWdyb3VwLWNzcy12YXJzXFxuICAtLSN7JHByZWZpeH1saXN0LWdyb3VwLWNvbG9yOiAjeyRsaXN0LWdyb3VwLWNvbG9yfTtcXG4gIC0tI3skcHJlZml4fWxpc3QtZ3JvdXAtYmc6ICN7JGxpc3QtZ3JvdXAtYmd9O1xcbiAgLS0jeyRwcmVmaXh9bGlzdC1ncm91cC1ib3JkZXItY29sb3I6ICN7JGxpc3QtZ3JvdXAtYm9yZGVyLWNvbG9yfTtcXG4gIC0tI3skcHJlZml4fWxpc3QtZ3JvdXAtYm9yZGVyLXdpZHRoOiAjeyRsaXN0LWdyb3VwLWJvcmRlci13aWR0aH07XFxuICAtLSN7JHByZWZpeH1saXN0LWdyb3VwLWJvcmRlci1yYWRpdXM6ICN7JGxpc3QtZ3JvdXAtYm9yZGVyLXJhZGl1c307XFxuICAtLSN7JHByZWZpeH1saXN0LWdyb3VwLWl0ZW0tcGFkZGluZy14OiAjeyRsaXN0LWdyb3VwLWl0ZW0tcGFkZGluZy14fTtcXG4gIC0tI3skcHJlZml4fWxpc3QtZ3JvdXAtaXRlbS1wYWRkaW5nLXk6ICN7JGxpc3QtZ3JvdXAtaXRlbS1wYWRkaW5nLXl9O1xcbiAgLS0jeyRwcmVmaXh9bGlzdC1ncm91cC1hY3Rpb24tY29sb3I6ICN7JGxpc3QtZ3JvdXAtYWN0aW9uLWNvbG9yfTtcXG4gIC0tI3skcHJlZml4fWxpc3QtZ3JvdXAtYWN0aW9uLWhvdmVyLWNvbG9yOiAjeyRsaXN0LWdyb3VwLWFjdGlvbi1ob3Zlci1jb2xvcn07XFxuICAtLSN7JHByZWZpeH1saXN0LWdyb3VwLWFjdGlvbi1ob3Zlci1iZzogI3skbGlzdC1ncm91cC1ob3Zlci1iZ307XFxuICAtLSN7JHByZWZpeH1saXN0LWdyb3VwLWFjdGlvbi1hY3RpdmUtY29sb3I6ICN7JGxpc3QtZ3JvdXAtYWN0aW9uLWFjdGl2ZS1jb2xvcn07XFxuICAtLSN7JHByZWZpeH1saXN0LWdyb3VwLWFjdGlvbi1hY3RpdmUtYmc6ICN7JGxpc3QtZ3JvdXAtYWN0aW9uLWFjdGl2ZS1iZ307XFxuICAtLSN7JHByZWZpeH1saXN0LWdyb3VwLWRpc2FibGVkLWNvbG9yOiAjeyRsaXN0LWdyb3VwLWRpc2FibGVkLWNvbG9yfTtcXG4gIC0tI3skcHJlZml4fWxpc3QtZ3JvdXAtZGlzYWJsZWQtYmc6ICN7JGxpc3QtZ3JvdXAtZGlzYWJsZWQtYmd9O1xcbiAgLS0jeyRwcmVmaXh9bGlzdC1ncm91cC1hY3RpdmUtY29sb3I6ICN7JGxpc3QtZ3JvdXAtYWN0aXZlLWNvbG9yfTtcXG4gIC0tI3skcHJlZml4fWxpc3QtZ3JvdXAtYWN0aXZlLWJnOiAjeyRsaXN0LWdyb3VwLWFjdGl2ZS1iZ307XFxuICAtLSN7JHByZWZpeH1saXN0LWdyb3VwLWFjdGl2ZS1ib3JkZXItY29sb3I6ICN7JGxpc3QtZ3JvdXAtYWN0aXZlLWJvcmRlci1jb2xvcn07XFxuICAvLyBzY3NzLWRvY3MtZW5kIGxpc3QtZ3JvdXAtY3NzLXZhcnNcXG5cXG4gIGRpc3BsYXk6IGZsZXg7XFxuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xcblxcbiAgLy8gTm8gbmVlZCB0byBzZXQgbGlzdC1zdHlsZTogbm9uZTsgc2luY2UgLmxpc3QtZ3JvdXAtaXRlbSBpcyBibG9jayBsZXZlbFxcbiAgcGFkZGluZy1sZWZ0OiAwOyAvLyByZXNldCBwYWRkaW5nIGJlY2F1c2UgdWwgYW5kIG9sXFxuICBtYXJnaW4tYm90dG9tOiAwO1xcbiAgQGluY2x1ZGUgYm9yZGVyLXJhZGl1cyh2YXIoLS0jeyRwcmVmaXh9bGlzdC1ncm91cC1ib3JkZXItcmFkaXVzKSk7XFxufVxcblxcbi5saXN0LWdyb3VwLW51bWJlcmVkIHtcXG4gIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTtcXG4gIGNvdW50ZXItcmVzZXQ6IHNlY3Rpb247XFxuXFxuICA+IC5saXN0LWdyb3VwLWl0ZW06OmJlZm9yZSB7XFxuICAgIC8vIEluY3JlbWVudHMgb25seSB0aGlzIGluc3RhbmNlIG9mIHRoZSBzZWN0aW9uIGNvdW50ZXJcXG4gICAgY29udGVudDogY291bnRlcnMoc2VjdGlvbiwgXFxcIi5cXFwiKSBcXFwiLiBcXFwiO1xcbiAgICBjb3VudGVyLWluY3JlbWVudDogc2VjdGlvbjtcXG4gIH1cXG59XFxuXFxuLy8gSW50ZXJhY3RpdmUgbGlzdCBpdGVtc1xcbi8vXFxuLy8gVXNlIGFuY2hvciBvciBidXR0b24gZWxlbWVudHMgaW5zdGVhZCBvZiBgbGlgcyBvciBgZGl2YHMgdG8gY3JlYXRlIGludGVyYWN0aXZlXFxuLy8gbGlzdCBpdGVtcy4gSW5jbHVkZXMgYW4gZXh0cmEgYC5hY3RpdmVgIG1vZGlmaWVyIGNsYXNzIGZvciBzZWxlY3RlZCBpdGVtcy5cXG5cXG4ubGlzdC1ncm91cC1pdGVtLWFjdGlvbiB7XFxuICB3aWR0aDogMTAwJTsgLy8gRm9yIGA8YnV0dG9uPmBzIChhbmNob3JzIGJlY29tZSAxMDAlIGJ5IGRlZmF1bHQgdGhvdWdoKVxcbiAgY29sb3I6IHZhcigtLSN7JHByZWZpeH1saXN0LWdyb3VwLWFjdGlvbi1jb2xvcik7XFxuICB0ZXh0LWFsaWduOiBpbmhlcml0OyAvLyBGb3IgYDxidXR0b24+YHMgKGFuY2hvcnMgaW5oZXJpdClcXG5cXG4gIC8vIEhvdmVyIHN0YXRlXFxuICAmOmhvdmVyLFxcbiAgJjpmb2N1cyB7XFxuICAgIHotaW5kZXg6IDE7IC8vIFBsYWNlIGhvdmVyL2ZvY3VzIGl0ZW1zIGFib3ZlIHRoZWlyIHNpYmxpbmdzIGZvciBwcm9wZXIgYm9yZGVyIHN0eWxpbmdcXG4gICAgY29sb3I6IHZhcigtLSN7JHByZWZpeH1saXN0LWdyb3VwLWFjdGlvbi1ob3Zlci1jb2xvcik7XFxuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tI3skcHJlZml4fWxpc3QtZ3JvdXAtYWN0aW9uLWhvdmVyLWJnKTtcXG4gIH1cXG5cXG4gICY6YWN0aXZlIHtcXG4gICAgY29sb3I6IHZhcigtLSN7JHByZWZpeH1saXN0LWdyb3VwLWFjdGlvbi1hY3RpdmUtY29sb3IpO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS0jeyRwcmVmaXh9bGlzdC1ncm91cC1hY3Rpb24tYWN0aXZlLWJnKTtcXG4gIH1cXG59XFxuXFxuLy8gSW5kaXZpZHVhbCBsaXN0IGl0ZW1zXFxuLy9cXG4vLyBVc2Ugb24gYGxpYHMgb3IgYGRpdmBzIHdpdGhpbiB0aGUgYC5saXN0LWdyb3VwYCBwYXJlbnQuXFxuXFxuLmxpc3QtZ3JvdXAtaXRlbSB7XFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICBkaXNwbGF5OiBibG9jaztcXG4gIHBhZGRpbmc6IHZhcigtLSN7JHByZWZpeH1saXN0LWdyb3VwLWl0ZW0tcGFkZGluZy15KSB2YXIoLS0jeyRwcmVmaXh9bGlzdC1ncm91cC1pdGVtLXBhZGRpbmcteCk7XFxuICBjb2xvcjogdmFyKC0tI3skcHJlZml4fWxpc3QtZ3JvdXAtY29sb3IpO1xcbiAgdGV4dC1kZWNvcmF0aW9uOiBpZigkbGluay1kZWNvcmF0aW9uID09IG5vbmUsIG51bGwsIG5vbmUpO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tI3skcHJlZml4fWxpc3QtZ3JvdXAtYmcpO1xcbiAgYm9yZGVyOiB2YXIoLS0jeyRwcmVmaXh9bGlzdC1ncm91cC1ib3JkZXItd2lkdGgpIHNvbGlkIHZhcigtLSN7JHByZWZpeH1saXN0LWdyb3VwLWJvcmRlci1jb2xvcik7XFxuXFxuICAmOmZpcnN0LWNoaWxkIHtcXG4gICAgQGluY2x1ZGUgYm9yZGVyLXRvcC1yYWRpdXMoaW5oZXJpdCk7XFxuICB9XFxuXFxuICAmOmxhc3QtY2hpbGQge1xcbiAgICBAaW5jbHVkZSBib3JkZXItYm90dG9tLXJhZGl1cyhpbmhlcml0KTtcXG4gIH1cXG5cXG4gICYuZGlzYWJsZWQsXFxuICAmOmRpc2FibGVkIHtcXG4gICAgY29sb3I6IHZhcigtLSN7JHByZWZpeH1saXN0LWdyb3VwLWRpc2FibGVkLWNvbG9yKTtcXG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLSN7JHByZWZpeH1saXN0LWdyb3VwLWRpc2FibGVkLWJnKTtcXG4gIH1cXG5cXG4gIC8vIEluY2x1ZGUgYm90aCBoZXJlIGZvciBgPGE+YHMgYW5kIGA8YnV0dG9uPmBzXFxuICAmLmFjdGl2ZSB7XFxuICAgIHotaW5kZXg6IDI7IC8vIFBsYWNlIGFjdGl2ZSBpdGVtcyBhYm92ZSB0aGVpciBzaWJsaW5ncyBmb3IgcHJvcGVyIGJvcmRlciBzdHlsaW5nXFxuICAgIGNvbG9yOiB2YXIoLS0jeyRwcmVmaXh9bGlzdC1ncm91cC1hY3RpdmUtY29sb3IpO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS0jeyRwcmVmaXh9bGlzdC1ncm91cC1hY3RpdmUtYmcpO1xcbiAgICBib3JkZXItY29sb3I6IHZhcigtLSN7JHByZWZpeH1saXN0LWdyb3VwLWFjdGl2ZS1ib3JkZXItY29sb3IpO1xcbiAgfVxcblxcbiAgLy8gc3R5bGVsaW50LWRpc2FibGUtbmV4dC1saW5lIHNjc3Mvc2VsZWN0b3Itbm8tcmVkdW5kYW50LW5lc3Rpbmctc2VsZWN0b3JcXG4gICYgKyAubGlzdC1ncm91cC1pdGVtIHtcXG4gICAgYm9yZGVyLXRvcC13aWR0aDogMDtcXG5cXG4gICAgJi5hY3RpdmUge1xcbiAgICAgIG1hcmdpbi10b3A6IGNhbGMoLTEgKiB2YXIoLS0jeyRwcmVmaXh9bGlzdC1ncm91cC1ib3JkZXItd2lkdGgpKTsgLy8gc3R5bGVsaW50LWRpc2FibGUtbGluZSBmdW5jdGlvbi1kaXNhbGxvd2VkLWxpc3RcXG4gICAgICBib3JkZXItdG9wLXdpZHRoOiB2YXIoLS0jeyRwcmVmaXh9bGlzdC1ncm91cC1ib3JkZXItd2lkdGgpO1xcbiAgICB9XFxuICB9XFxufVxcblxcbi8vIEhvcml6b250YWxcXG4vL1xcbi8vIENoYW5nZSB0aGUgbGF5b3V0IG9mIGxpc3QgZ3JvdXAgaXRlbXMgZnJvbSB2ZXJ0aWNhbCAoZGVmYXVsdCkgdG8gaG9yaXpvbnRhbC5cXG5cXG5AZWFjaCAkYnJlYWtwb2ludCBpbiBtYXAta2V5cygkZ3JpZC1icmVha3BvaW50cykge1xcbiAgQGluY2x1ZGUgbWVkaWEtYnJlYWtwb2ludC11cCgkYnJlYWtwb2ludCkge1xcbiAgICAkaW5maXg6IGJyZWFrcG9pbnQtaW5maXgoJGJyZWFrcG9pbnQsICRncmlkLWJyZWFrcG9pbnRzKTtcXG5cXG4gICAgLmxpc3QtZ3JvdXAtaG9yaXpvbnRhbCN7JGluZml4fSB7XFxuICAgICAgZmxleC1kaXJlY3Rpb246IHJvdztcXG5cXG4gICAgICA+IC5saXN0LWdyb3VwLWl0ZW0ge1xcbiAgICAgICAgJjpmaXJzdC1jaGlsZDpub3QoOmxhc3QtY2hpbGQpIHtcXG4gICAgICAgICAgQGluY2x1ZGUgYm9yZGVyLWJvdHRvbS1zdGFydC1yYWRpdXModmFyKC0tI3skcHJlZml4fWxpc3QtZ3JvdXAtYm9yZGVyLXJhZGl1cykpO1xcbiAgICAgICAgICBAaW5jbHVkZSBib3JkZXItdG9wLWVuZC1yYWRpdXMoMCk7XFxuICAgICAgICB9XFxuXFxuICAgICAgICAmOmxhc3QtY2hpbGQ6bm90KDpmaXJzdC1jaGlsZCkge1xcbiAgICAgICAgICBAaW5jbHVkZSBib3JkZXItdG9wLWVuZC1yYWRpdXModmFyKC0tI3skcHJlZml4fWxpc3QtZ3JvdXAtYm9yZGVyLXJhZGl1cykpO1xcbiAgICAgICAgICBAaW5jbHVkZSBib3JkZXItYm90dG9tLXN0YXJ0LXJhZGl1cygwKTtcXG4gICAgICAgIH1cXG5cXG4gICAgICAgICYuYWN0aXZlIHtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogMDtcXG4gICAgICAgIH1cXG5cXG4gICAgICAgICsgLmxpc3QtZ3JvdXAtaXRlbSB7XFxuICAgICAgICAgIGJvcmRlci10b3Atd2lkdGg6IHZhcigtLSN7JHByZWZpeH1saXN0LWdyb3VwLWJvcmRlci13aWR0aCk7XFxuICAgICAgICAgIGJvcmRlci1sZWZ0LXdpZHRoOiAwO1xcblxcbiAgICAgICAgICAmLmFjdGl2ZSB7XFxuICAgICAgICAgICAgbWFyZ2luLWxlZnQ6IGNhbGMoLTEgKiB2YXIoLS0jeyRwcmVmaXh9bGlzdC1ncm91cC1ib3JkZXItd2lkdGgpKTsgLy8gc3R5bGVsaW50LWRpc2FibGUtbGluZSBmdW5jdGlvbi1kaXNhbGxvd2VkLWxpc3RcXG4gICAgICAgICAgICBib3JkZXItbGVmdC13aWR0aDogdmFyKC0tI3skcHJlZml4fWxpc3QtZ3JvdXAtYm9yZGVyLXdpZHRoKTtcXG4gICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICAgIH1cXG4gICAgfVxcbiAgfVxcbn1cXG5cXG5cXG4vLyBGbHVzaCBsaXN0IGl0ZW1zXFxuLy9cXG4vLyBSZW1vdmUgYm9yZGVycyBhbmQgYm9yZGVyLXJhZGl1cyB0byBrZWVwIGxpc3QgZ3JvdXAgaXRlbXMgZWRnZS10by1lZGdlLiBNb3N0XFxuLy8gdXNlZnVsIHdpdGhpbiBvdGhlciBjb21wb25lbnRzIChlLmcuLCBjYXJkcykuXFxuXFxuLmxpc3QtZ3JvdXAtZmx1c2gge1xcbiAgQGluY2x1ZGUgYm9yZGVyLXJhZGl1cygwKTtcXG5cXG4gID4gLmxpc3QtZ3JvdXAtaXRlbSB7XFxuICAgIGJvcmRlci13aWR0aDogMCAwIHZhcigtLSN7JHByZWZpeH1saXN0LWdyb3VwLWJvcmRlci13aWR0aCk7XFxuXFxuICAgICY6bGFzdC1jaGlsZCB7XFxuICAgICAgYm9yZGVyLWJvdHRvbS13aWR0aDogMDtcXG4gICAgfVxcbiAgfVxcbn1cXG5cXG5cXG4vLyBzY3NzLWRvY3Mtc3RhcnQgbGlzdC1ncm91cC1tb2RpZmllcnNcXG4vLyBMaXN0IGdyb3VwIGNvbnRleHR1YWwgdmFyaWFudHNcXG4vL1xcbi8vIEFkZCBtb2RpZmllciBjbGFzc2VzIHRvIGNoYW5nZSB0ZXh0IGFuZCBiYWNrZ3JvdW5kIGNvbG9yIG9uIGluZGl2aWR1YWwgaXRlbXMuXFxuLy8gT3JnYW5pemF0aW9uYWxseSwgdGhpcyBtdXN0IGNvbWUgYWZ0ZXIgdGhlIGA6aG92ZXJgIHN0YXRlcy5cXG5cXG5AZWFjaCAkc3RhdGUgaW4gbWFwLWtleXMoJHRoZW1lLWNvbG9ycykge1xcbiAgLmxpc3QtZ3JvdXAtaXRlbS0jeyRzdGF0ZX0ge1xcbiAgICAtLSN7JHByZWZpeH1saXN0LWdyb3VwLWNvbG9yOiB2YXIoLS0jeyRwcmVmaXh9I3skc3RhdGV9LXRleHQtZW1waGFzaXMpO1xcbiAgICAtLSN7JHByZWZpeH1saXN0LWdyb3VwLWJnOiB2YXIoLS0jeyRwcmVmaXh9I3skc3RhdGV9LWJnLXN1YnRsZSk7XFxuICAgIC0tI3skcHJlZml4fWxpc3QtZ3JvdXAtYm9yZGVyLWNvbG9yOiB2YXIoLS0jeyRwcmVmaXh9I3skc3RhdGV9LWJvcmRlci1zdWJ0bGUpO1xcbiAgICAtLSN7JHByZWZpeH1saXN0LWdyb3VwLWFjdGlvbi1ob3Zlci1jb2xvcjogdmFyKC0tI3skcHJlZml4fWVtcGhhc2lzLWNvbG9yKTtcXG4gICAgLS0jeyRwcmVmaXh9bGlzdC1ncm91cC1hY3Rpb24taG92ZXItYmc6IHZhcigtLSN7JHByZWZpeH0jeyRzdGF0ZX0tYm9yZGVyLXN1YnRsZSk7XFxuICAgIC0tI3skcHJlZml4fWxpc3QtZ3JvdXAtYWN0aW9uLWFjdGl2ZS1jb2xvcjogdmFyKC0tI3skcHJlZml4fWVtcGhhc2lzLWNvbG9yKTtcXG4gICAgLS0jeyRwcmVmaXh9bGlzdC1ncm91cC1hY3Rpb24tYWN0aXZlLWJnOiB2YXIoLS0jeyRwcmVmaXh9I3skc3RhdGV9LWJvcmRlci1zdWJ0bGUpO1xcbiAgICAtLSN7JHByZWZpeH1saXN0LWdyb3VwLWFjdGl2ZS1jb2xvcjogdmFyKC0tI3skcHJlZml4fSN7JHN0YXRlfS1iZy1zdWJ0bGUpO1xcbiAgICAtLSN7JHByZWZpeH1saXN0LWdyb3VwLWFjdGl2ZS1iZzogdmFyKC0tI3skcHJlZml4fSN7JHN0YXRlfS10ZXh0LWVtcGhhc2lzKTtcXG4gICAgLS0jeyRwcmVmaXh9bGlzdC1ncm91cC1hY3RpdmUtYm9yZGVyLWNvbG9yOiB2YXIoLS0jeyRwcmVmaXh9I3skc3RhdGV9LXRleHQtZW1waGFzaXMpO1xcbiAgfVxcbn1cXG4vLyBzY3NzLWRvY3MtZW5kIGxpc3QtZ3JvdXAtbW9kaWZpZXJzXFxuXCIsXCIvLyBUcmFuc3BhcmVudCBiYWNrZ3JvdW5kIGFuZCBib3JkZXIgcHJvcGVydGllcyBpbmNsdWRlZCBmb3IgYnV0dG9uIHZlcnNpb24uXFxuLy8gaU9TIHJlcXVpcmVzIHRoZSBidXR0b24gZWxlbWVudCBpbnN0ZWFkIG9mIGFuIGFuY2hvciB0YWcuXFxuLy8gSWYgeW91IHdhbnQgdGhlIGFuY2hvciB2ZXJzaW9uLCBpdCByZXF1aXJlcyBgaHJlZj1cXFwiI1xcXCJgLlxcbi8vIFNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9FdmVudHMvY2xpY2sjU2FmYXJpX01vYmlsZVxcblxcbi5idG4tY2xvc2Uge1xcbiAgLy8gc2Nzcy1kb2NzLXN0YXJ0IGNsb3NlLWNzcy12YXJzXFxuICAtLSN7JHByZWZpeH1idG4tY2xvc2UtY29sb3I6ICN7JGJ0bi1jbG9zZS1jb2xvcn07XFxuICAtLSN7JHByZWZpeH1idG4tY2xvc2UtYmc6ICN7IGVzY2FwZS1zdmcoJGJ0bi1jbG9zZS1iZykgfTtcXG4gIC0tI3skcHJlZml4fWJ0bi1jbG9zZS1vcGFjaXR5OiAjeyRidG4tY2xvc2Utb3BhY2l0eX07XFxuICAtLSN7JHByZWZpeH1idG4tY2xvc2UtaG92ZXItb3BhY2l0eTogI3skYnRuLWNsb3NlLWhvdmVyLW9wYWNpdHl9O1xcbiAgLS0jeyRwcmVmaXh9YnRuLWNsb3NlLWZvY3VzLXNoYWRvdzogI3skYnRuLWNsb3NlLWZvY3VzLXNoYWRvd307XFxuICAtLSN7JHByZWZpeH1idG4tY2xvc2UtZm9jdXMtb3BhY2l0eTogI3skYnRuLWNsb3NlLWZvY3VzLW9wYWNpdHl9O1xcbiAgLS0jeyRwcmVmaXh9YnRuLWNsb3NlLWRpc2FibGVkLW9wYWNpdHk6ICN7JGJ0bi1jbG9zZS1kaXNhYmxlZC1vcGFjaXR5fTtcXG4gIC0tI3skcHJlZml4fWJ0bi1jbG9zZS13aGl0ZS1maWx0ZXI6ICN7JGJ0bi1jbG9zZS13aGl0ZS1maWx0ZXJ9O1xcbiAgLy8gc2Nzcy1kb2NzLWVuZCBjbG9zZS1jc3MtdmFyc1xcblxcbiAgYm94LXNpemluZzogY29udGVudC1ib3g7XFxuICB3aWR0aDogJGJ0bi1jbG9zZS13aWR0aDtcXG4gIGhlaWdodDogJGJ0bi1jbG9zZS1oZWlnaHQ7XFxuICBwYWRkaW5nOiAkYnRuLWNsb3NlLXBhZGRpbmcteSAkYnRuLWNsb3NlLXBhZGRpbmcteDtcXG4gIGNvbG9yOiB2YXIoLS0jeyRwcmVmaXh9YnRuLWNsb3NlLWNvbG9yKTtcXG4gIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50IHZhcigtLSN7JHByZWZpeH1idG4tY2xvc2UtYmcpIGNlbnRlciAvICRidG4tY2xvc2Utd2lkdGggYXV0byBuby1yZXBlYXQ7IC8vIGluY2x1ZGUgdHJhbnNwYXJlbnQgZm9yIGJ1dHRvbiBlbGVtZW50c1xcbiAgYm9yZGVyOiAwOyAvLyBmb3IgYnV0dG9uIGVsZW1lbnRzXFxuICBAaW5jbHVkZSBib3JkZXItcmFkaXVzKCk7XFxuICBvcGFjaXR5OiB2YXIoLS0jeyRwcmVmaXh9YnRuLWNsb3NlLW9wYWNpdHkpO1xcblxcbiAgLy8gT3ZlcnJpZGUgPGE+J3MgaG92ZXIgc3R5bGVcXG4gICY6aG92ZXIge1xcbiAgICBjb2xvcjogdmFyKC0tI3skcHJlZml4fWJ0bi1jbG9zZS1jb2xvcik7XFxuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcXG4gICAgb3BhY2l0eTogdmFyKC0tI3skcHJlZml4fWJ0bi1jbG9zZS1ob3Zlci1vcGFjaXR5KTtcXG4gIH1cXG5cXG4gICY6Zm9jdXMge1xcbiAgICBvdXRsaW5lOiAwO1xcbiAgICBib3gtc2hhZG93OiB2YXIoLS0jeyRwcmVmaXh9YnRuLWNsb3NlLWZvY3VzLXNoYWRvdyk7XFxuICAgIG9wYWNpdHk6IHZhcigtLSN7JHByZWZpeH1idG4tY2xvc2UtZm9jdXMtb3BhY2l0eSk7XFxuICB9XFxuXFxuICAmOmRpc2FibGVkLFxcbiAgJi5kaXNhYmxlZCB7XFxuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xcbiAgICB1c2VyLXNlbGVjdDogbm9uZTtcXG4gICAgb3BhY2l0eTogdmFyKC0tI3skcHJlZml4fWJ0bi1jbG9zZS1kaXNhYmxlZC1vcGFjaXR5KTtcXG4gIH1cXG59XFxuXFxuQG1peGluIGJ0bi1jbG9zZS13aGl0ZSgpIHtcXG4gIGZpbHRlcjogdmFyKC0tI3skcHJlZml4fWJ0bi1jbG9zZS13aGl0ZS1maWx0ZXIpO1xcbn1cXG5cXG4uYnRuLWNsb3NlLXdoaXRlIHtcXG4gIEBpbmNsdWRlIGJ0bi1jbG9zZS13aGl0ZSgpO1xcbn1cXG5cXG5AaWYgJGVuYWJsZS1kYXJrLW1vZGUge1xcbiAgQGluY2x1ZGUgY29sb3ItbW9kZShkYXJrKSB7XFxuICAgIC5idG4tY2xvc2Uge1xcbiAgICAgIEBpbmNsdWRlIGJ0bi1jbG9zZS13aGl0ZSgpO1xcbiAgICB9XFxuICB9XFxufVxcblwiLFwiLnRvYXN0IHtcXG4gIC8vIHNjc3MtZG9jcy1zdGFydCB0b2FzdC1jc3MtdmFyc1xcbiAgLS0jeyRwcmVmaXh9dG9hc3QtemluZGV4OiAjeyR6aW5kZXgtdG9hc3R9O1xcbiAgLS0jeyRwcmVmaXh9dG9hc3QtcGFkZGluZy14OiAjeyR0b2FzdC1wYWRkaW5nLXh9O1xcbiAgLS0jeyRwcmVmaXh9dG9hc3QtcGFkZGluZy15OiAjeyR0b2FzdC1wYWRkaW5nLXl9O1xcbiAgLS0jeyRwcmVmaXh9dG9hc3Qtc3BhY2luZzogI3skdG9hc3Qtc3BhY2luZ307XFxuICAtLSN7JHByZWZpeH10b2FzdC1tYXgtd2lkdGg6ICN7JHRvYXN0LW1heC13aWR0aH07XFxuICBAaW5jbHVkZSByZnMoJHRvYXN0LWZvbnQtc2l6ZSwgLS0jeyRwcmVmaXh9dG9hc3QtZm9udC1zaXplKTtcXG4gIC0tI3skcHJlZml4fXRvYXN0LWNvbG9yOiAjeyR0b2FzdC1jb2xvcn07XFxuICAtLSN7JHByZWZpeH10b2FzdC1iZzogI3skdG9hc3QtYmFja2dyb3VuZC1jb2xvcn07XFxuICAtLSN7JHByZWZpeH10b2FzdC1ib3JkZXItd2lkdGg6ICN7JHRvYXN0LWJvcmRlci13aWR0aH07XFxuICAtLSN7JHByZWZpeH10b2FzdC1ib3JkZXItY29sb3I6ICN7JHRvYXN0LWJvcmRlci1jb2xvcn07XFxuICAtLSN7JHByZWZpeH10b2FzdC1ib3JkZXItcmFkaXVzOiAjeyR0b2FzdC1ib3JkZXItcmFkaXVzfTtcXG4gIC0tI3skcHJlZml4fXRvYXN0LWJveC1zaGFkb3c6ICN7JHRvYXN0LWJveC1zaGFkb3d9O1xcbiAgLS0jeyRwcmVmaXh9dG9hc3QtaGVhZGVyLWNvbG9yOiAjeyR0b2FzdC1oZWFkZXItY29sb3J9O1xcbiAgLS0jeyRwcmVmaXh9dG9hc3QtaGVhZGVyLWJnOiAjeyR0b2FzdC1oZWFkZXItYmFja2dyb3VuZC1jb2xvcn07XFxuICAtLSN7JHByZWZpeH10b2FzdC1oZWFkZXItYm9yZGVyLWNvbG9yOiAjeyR0b2FzdC1oZWFkZXItYm9yZGVyLWNvbG9yfTtcXG4gIC8vIHNjc3MtZG9jcy1lbmQgdG9hc3QtY3NzLXZhcnNcXG5cXG4gIHdpZHRoOiB2YXIoLS0jeyRwcmVmaXh9dG9hc3QtbWF4LXdpZHRoKTtcXG4gIG1heC13aWR0aDogMTAwJTtcXG4gIEBpbmNsdWRlIGZvbnQtc2l6ZSh2YXIoLS0jeyRwcmVmaXh9dG9hc3QtZm9udC1zaXplKSk7XFxuICBjb2xvcjogdmFyKC0tI3skcHJlZml4fXRvYXN0LWNvbG9yKTtcXG4gIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tI3skcHJlZml4fXRvYXN0LWJnKTtcXG4gIGJhY2tncm91bmQtY2xpcDogcGFkZGluZy1ib3g7XFxuICBib3JkZXI6IHZhcigtLSN7JHByZWZpeH10b2FzdC1ib3JkZXItd2lkdGgpIHNvbGlkIHZhcigtLSN7JHByZWZpeH10b2FzdC1ib3JkZXItY29sb3IpO1xcbiAgYm94LXNoYWRvdzogdmFyKC0tI3skcHJlZml4fXRvYXN0LWJveC1zaGFkb3cpO1xcbiAgQGluY2x1ZGUgYm9yZGVyLXJhZGl1cyh2YXIoLS0jeyRwcmVmaXh9dG9hc3QtYm9yZGVyLXJhZGl1cykpO1xcblxcbiAgJi5zaG93aW5nIHtcXG4gICAgb3BhY2l0eTogMDtcXG4gIH1cXG5cXG4gICY6bm90KC5zaG93KSB7XFxuICAgIGRpc3BsYXk6IG5vbmU7XFxuICB9XFxufVxcblxcbi50b2FzdC1jb250YWluZXIge1xcbiAgLS0jeyRwcmVmaXh9dG9hc3QtemluZGV4OiAjeyR6aW5kZXgtdG9hc3R9O1xcblxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgei1pbmRleDogdmFyKC0tI3skcHJlZml4fXRvYXN0LXppbmRleCk7XFxuICB3aWR0aDogbWF4LWNvbnRlbnQ7XFxuICBtYXgtd2lkdGg6IDEwMCU7XFxuICBwb2ludGVyLWV2ZW50czogbm9uZTtcXG5cXG4gID4gOm5vdCg6bGFzdC1jaGlsZCkge1xcbiAgICBtYXJnaW4tYm90dG9tOiB2YXIoLS0jeyRwcmVmaXh9dG9hc3Qtc3BhY2luZyk7XFxuICB9XFxufVxcblxcbi50b2FzdC1oZWFkZXIge1xcbiAgZGlzcGxheTogZmxleDtcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICBwYWRkaW5nOiB2YXIoLS0jeyRwcmVmaXh9dG9hc3QtcGFkZGluZy15KSB2YXIoLS0jeyRwcmVmaXh9dG9hc3QtcGFkZGluZy14KTtcXG4gIGNvbG9yOiB2YXIoLS0jeyRwcmVmaXh9dG9hc3QtaGVhZGVyLWNvbG9yKTtcXG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLSN7JHByZWZpeH10b2FzdC1oZWFkZXItYmcpO1xcbiAgYmFja2dyb3VuZC1jbGlwOiBwYWRkaW5nLWJveDtcXG4gIGJvcmRlci1ib3R0b206IHZhcigtLSN7JHByZWZpeH10b2FzdC1ib3JkZXItd2lkdGgpIHNvbGlkIHZhcigtLSN7JHByZWZpeH10b2FzdC1oZWFkZXItYm9yZGVyLWNvbG9yKTtcXG4gIEBpbmNsdWRlIGJvcmRlci10b3AtcmFkaXVzKGNhbGModmFyKC0tI3skcHJlZml4fXRvYXN0LWJvcmRlci1yYWRpdXMpIC0gdmFyKC0tI3skcHJlZml4fXRvYXN0LWJvcmRlci13aWR0aCkpKTtcXG5cXG4gIC5idG4tY2xvc2Uge1xcbiAgICBtYXJnaW4tcmlnaHQ6IGNhbGMoLS41ICogdmFyKC0tI3skcHJlZml4fXRvYXN0LXBhZGRpbmcteCkpOyAvLyBzdHlsZWxpbnQtZGlzYWJsZS1saW5lIGZ1bmN0aW9uLWRpc2FsbG93ZWQtbGlzdFxcbiAgICBtYXJnaW4tbGVmdDogdmFyKC0tI3skcHJlZml4fXRvYXN0LXBhZGRpbmcteCk7XFxuICB9XFxufVxcblxcbi50b2FzdC1ib2R5IHtcXG4gIHBhZGRpbmc6IHZhcigtLSN7JHByZWZpeH10b2FzdC1wYWRkaW5nLXgpO1xcbiAgd29yZC13cmFwOiBicmVhay13b3JkO1xcbn1cXG5cIixcIi8vIHN0eWxlbGludC1kaXNhYmxlIGZ1bmN0aW9uLWRpc2FsbG93ZWQtbGlzdFxcblxcbi8vIC5tb2RhbC1vcGVuICAgICAgLSBib2R5IGNsYXNzIGZvciBraWxsaW5nIHRoZSBzY3JvbGxcXG4vLyAubW9kYWwgICAgICAgICAgIC0gY29udGFpbmVyIHRvIHNjcm9sbCB3aXRoaW5cXG4vLyAubW9kYWwtZGlhbG9nICAgIC0gcG9zaXRpb25pbmcgc2hlbGwgZm9yIHRoZSBhY3R1YWwgbW9kYWxcXG4vLyAubW9kYWwtY29udGVudCAgIC0gYWN0dWFsIG1vZGFsIHcvIGJnIGFuZCBjb3JuZXJzIGFuZCBzdHVmZlxcblxcblxcbi8vIENvbnRhaW5lciB0aGF0IHRoZSBtb2RhbCBzY3JvbGxzIHdpdGhpblxcbi5tb2RhbCB7XFxuICAvLyBzY3NzLWRvY3Mtc3RhcnQgbW9kYWwtY3NzLXZhcnNcXG4gIC0tI3skcHJlZml4fW1vZGFsLXppbmRleDogI3skemluZGV4LW1vZGFsfTtcXG4gIC0tI3skcHJlZml4fW1vZGFsLXdpZHRoOiAjeyRtb2RhbC1tZH07XFxuICAtLSN7JHByZWZpeH1tb2RhbC1wYWRkaW5nOiAjeyRtb2RhbC1pbm5lci1wYWRkaW5nfTtcXG4gIC0tI3skcHJlZml4fW1vZGFsLW1hcmdpbjogI3skbW9kYWwtZGlhbG9nLW1hcmdpbn07XFxuICAtLSN7JHByZWZpeH1tb2RhbC1jb2xvcjogI3skbW9kYWwtY29udGVudC1jb2xvcn07XFxuICAtLSN7JHByZWZpeH1tb2RhbC1iZzogI3skbW9kYWwtY29udGVudC1iZ307XFxuICAtLSN7JHByZWZpeH1tb2RhbC1ib3JkZXItY29sb3I6ICN7JG1vZGFsLWNvbnRlbnQtYm9yZGVyLWNvbG9yfTtcXG4gIC0tI3skcHJlZml4fW1vZGFsLWJvcmRlci13aWR0aDogI3skbW9kYWwtY29udGVudC1ib3JkZXItd2lkdGh9O1xcbiAgLS0jeyRwcmVmaXh9bW9kYWwtYm9yZGVyLXJhZGl1czogI3skbW9kYWwtY29udGVudC1ib3JkZXItcmFkaXVzfTtcXG4gIC0tI3skcHJlZml4fW1vZGFsLWJveC1zaGFkb3c6ICN7JG1vZGFsLWNvbnRlbnQtYm94LXNoYWRvdy14c307XFxuICAtLSN7JHByZWZpeH1tb2RhbC1pbm5lci1ib3JkZXItcmFkaXVzOiAjeyRtb2RhbC1jb250ZW50LWlubmVyLWJvcmRlci1yYWRpdXN9O1xcbiAgLS0jeyRwcmVmaXh9bW9kYWwtaGVhZGVyLXBhZGRpbmcteDogI3skbW9kYWwtaGVhZGVyLXBhZGRpbmcteH07XFxuICAtLSN7JHByZWZpeH1tb2RhbC1oZWFkZXItcGFkZGluZy15OiAjeyRtb2RhbC1oZWFkZXItcGFkZGluZy15fTtcXG4gIC0tI3skcHJlZml4fW1vZGFsLWhlYWRlci1wYWRkaW5nOiAjeyRtb2RhbC1oZWFkZXItcGFkZGluZ307IC8vIFRvZG8gaW4gdjY6IFNwbGl0IHRoaXMgcGFkZGluZyBpbnRvIHggYW5kIHlcXG4gIC0tI3skcHJlZml4fW1vZGFsLWhlYWRlci1ib3JkZXItY29sb3I6ICN7JG1vZGFsLWhlYWRlci1ib3JkZXItY29sb3J9O1xcbiAgLS0jeyRwcmVmaXh9bW9kYWwtaGVhZGVyLWJvcmRlci13aWR0aDogI3skbW9kYWwtaGVhZGVyLWJvcmRlci13aWR0aH07XFxuICAtLSN7JHByZWZpeH1tb2RhbC10aXRsZS1saW5lLWhlaWdodDogI3skbW9kYWwtdGl0bGUtbGluZS1oZWlnaHR9O1xcbiAgLS0jeyRwcmVmaXh9bW9kYWwtZm9vdGVyLWdhcDogI3skbW9kYWwtZm9vdGVyLW1hcmdpbi1iZXR3ZWVufTtcXG4gIC0tI3skcHJlZml4fW1vZGFsLWZvb3Rlci1iZzogI3skbW9kYWwtZm9vdGVyLWJnfTtcXG4gIC0tI3skcHJlZml4fW1vZGFsLWZvb3Rlci1ib3JkZXItY29sb3I6ICN7JG1vZGFsLWZvb3Rlci1ib3JkZXItY29sb3J9O1xcbiAgLS0jeyRwcmVmaXh9bW9kYWwtZm9vdGVyLWJvcmRlci13aWR0aDogI3skbW9kYWwtZm9vdGVyLWJvcmRlci13aWR0aH07XFxuICAvLyBzY3NzLWRvY3MtZW5kIG1vZGFsLWNzcy12YXJzXFxuXFxuICBwb3NpdGlvbjogZml4ZWQ7XFxuICB0b3A6IDA7XFxuICBsZWZ0OiAwO1xcbiAgei1pbmRleDogdmFyKC0tI3skcHJlZml4fW1vZGFsLXppbmRleCk7XFxuICBkaXNwbGF5OiBub25lO1xcbiAgd2lkdGg6IDEwMCU7XFxuICBoZWlnaHQ6IDEwMCU7XFxuICBvdmVyZmxvdy14OiBoaWRkZW47XFxuICBvdmVyZmxvdy15OiBhdXRvO1xcbiAgLy8gUHJldmVudCBDaHJvbWUgb24gV2luZG93cyBmcm9tIGFkZGluZyBhIGZvY3VzIG91dGxpbmUuIEZvciBkZXRhaWxzLCBzZWVcXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9wdWxsLzEwOTUxLlxcbiAgb3V0bGluZTogMDtcXG4gIC8vIFdlIGRlbGliZXJhdGVseSBkb24ndCB1c2UgYC13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOiB0b3VjaDtgIGR1ZSB0byBhXFxuICAvLyBnbmFybHkgaU9TIFNhZmFyaSBidWc6IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNTgzNDJcXG4gIC8vIFNlZSBhbHNvIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9pc3N1ZXMvMTc2OTVcXG59XFxuXFxuLy8gU2hlbGwgZGl2IHRvIHBvc2l0aW9uIHRoZSBtb2RhbCB3aXRoIGJvdHRvbSBwYWRkaW5nXFxuLm1vZGFsLWRpYWxvZyB7XFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICB3aWR0aDogYXV0bztcXG4gIG1hcmdpbjogdmFyKC0tI3skcHJlZml4fW1vZGFsLW1hcmdpbik7XFxuICAvLyBhbGxvdyBjbGlja3MgdG8gcGFzcyB0aHJvdWdoIGZvciBjdXN0b20gY2xpY2sgaGFuZGxpbmcgdG8gY2xvc2UgbW9kYWxcXG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xcblxcbiAgLy8gV2hlbiBmYWRpbmcgaW4gdGhlIG1vZGFsLCBhbmltYXRlIGl0IHRvIHNsaWRlIGRvd25cXG4gIC5tb2RhbC5mYWRlICYge1xcbiAgICBAaW5jbHVkZSB0cmFuc2l0aW9uKCRtb2RhbC10cmFuc2l0aW9uKTtcXG4gICAgdHJhbnNmb3JtOiAkbW9kYWwtZmFkZS10cmFuc2Zvcm07XFxuICB9XFxuICAubW9kYWwuc2hvdyAmIHtcXG4gICAgdHJhbnNmb3JtOiAkbW9kYWwtc2hvdy10cmFuc2Zvcm07XFxuICB9XFxuXFxuICAvLyBXaGVuIHRyeWluZyB0byBjbG9zZSwgYW5pbWF0ZSBmb2N1cyB0byBzY2FsZVxcbiAgLm1vZGFsLm1vZGFsLXN0YXRpYyAmIHtcXG4gICAgdHJhbnNmb3JtOiAkbW9kYWwtc2NhbGUtdHJhbnNmb3JtO1xcbiAgfVxcbn1cXG5cXG4ubW9kYWwtZGlhbG9nLXNjcm9sbGFibGUge1xcbiAgaGVpZ2h0OiBjYWxjKDEwMCUgLSB2YXIoLS0jeyRwcmVmaXh9bW9kYWwtbWFyZ2luKSAqIDIpO1xcblxcbiAgLm1vZGFsLWNvbnRlbnQge1xcbiAgICBtYXgtaGVpZ2h0OiAxMDAlO1xcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xcbiAgfVxcblxcbiAgLm1vZGFsLWJvZHkge1xcbiAgICBvdmVyZmxvdy15OiBhdXRvO1xcbiAgfVxcbn1cXG5cXG4ubW9kYWwtZGlhbG9nLWNlbnRlcmVkIHtcXG4gIGRpc3BsYXk6IGZsZXg7XFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgbWluLWhlaWdodDogY2FsYygxMDAlIC0gdmFyKC0tI3skcHJlZml4fW1vZGFsLW1hcmdpbikgKiAyKTtcXG59XFxuXFxuLy8gQWN0dWFsIG1vZGFsXFxuLm1vZGFsLWNvbnRlbnQge1xcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgZGlzcGxheTogZmxleDtcXG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XFxuICB3aWR0aDogMTAwJTsgLy8gRW5zdXJlIGAubW9kYWwtY29udGVudGAgZXh0ZW5kcyB0aGUgZnVsbCB3aWR0aCBvZiB0aGUgcGFyZW50IGAubW9kYWwtZGlhbG9nYFxcbiAgLy8gY291bnRlcmFjdCB0aGUgcG9pbnRlci1ldmVudHM6IG5vbmU7IGluIHRoZSAubW9kYWwtZGlhbG9nXFxuICBjb2xvcjogdmFyKC0tI3skcHJlZml4fW1vZGFsLWNvbG9yKTtcXG4gIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tI3skcHJlZml4fW1vZGFsLWJnKTtcXG4gIGJhY2tncm91bmQtY2xpcDogcGFkZGluZy1ib3g7XFxuICBib3JkZXI6IHZhcigtLSN7JHByZWZpeH1tb2RhbC1ib3JkZXItd2lkdGgpIHNvbGlkIHZhcigtLSN7JHByZWZpeH1tb2RhbC1ib3JkZXItY29sb3IpO1xcbiAgQGluY2x1ZGUgYm9yZGVyLXJhZGl1cyh2YXIoLS0jeyRwcmVmaXh9bW9kYWwtYm9yZGVyLXJhZGl1cykpO1xcbiAgQGluY2x1ZGUgYm94LXNoYWRvdyh2YXIoLS0jeyRwcmVmaXh9bW9kYWwtYm94LXNoYWRvdykpO1xcbiAgLy8gUmVtb3ZlIGZvY3VzIG91dGxpbmUgZnJvbSBvcGVuZWQgbW9kYWxcXG4gIG91dGxpbmU6IDA7XFxufVxcblxcbi8vIE1vZGFsIGJhY2tncm91bmRcXG4ubW9kYWwtYmFja2Ryb3Age1xcbiAgLy8gc2Nzcy1kb2NzLXN0YXJ0IG1vZGFsLWJhY2tkcm9wLWNzcy12YXJzXFxuICAtLSN7JHByZWZpeH1iYWNrZHJvcC16aW5kZXg6ICN7JHppbmRleC1tb2RhbC1iYWNrZHJvcH07XFxuICAtLSN7JHByZWZpeH1iYWNrZHJvcC1iZzogI3skbW9kYWwtYmFja2Ryb3AtYmd9O1xcbiAgLS0jeyRwcmVmaXh9YmFja2Ryb3Atb3BhY2l0eTogI3skbW9kYWwtYmFja2Ryb3Atb3BhY2l0eX07XFxuICAvLyBzY3NzLWRvY3MtZW5kIG1vZGFsLWJhY2tkcm9wLWNzcy12YXJzXFxuXFxuICBAaW5jbHVkZSBvdmVybGF5LWJhY2tkcm9wKHZhcigtLSN7JHByZWZpeH1iYWNrZHJvcC16aW5kZXgpLCB2YXIoLS0jeyRwcmVmaXh9YmFja2Ryb3AtYmcpLCB2YXIoLS0jeyRwcmVmaXh9YmFja2Ryb3Atb3BhY2l0eSkpO1xcbn1cXG5cXG4vLyBNb2RhbCBoZWFkZXJcXG4vLyBUb3Agc2VjdGlvbiBvZiB0aGUgbW9kYWwgdy8gdGl0bGUgYW5kIGRpc21pc3NcXG4ubW9kYWwtaGVhZGVyIHtcXG4gIGRpc3BsYXk6IGZsZXg7XFxuICBmbGV4LXNocmluazogMDtcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47IC8vIFB1dCBtb2RhbCBoZWFkZXIgZWxlbWVudHMgKHRpdGxlIGFuZCBkaXNtaXNzKSBvbiBvcHBvc2l0ZSBlbmRzXFxuICBwYWRkaW5nOiB2YXIoLS0jeyRwcmVmaXh9bW9kYWwtaGVhZGVyLXBhZGRpbmcpO1xcbiAgYm9yZGVyLWJvdHRvbTogdmFyKC0tI3skcHJlZml4fW1vZGFsLWhlYWRlci1ib3JkZXItd2lkdGgpIHNvbGlkIHZhcigtLSN7JHByZWZpeH1tb2RhbC1oZWFkZXItYm9yZGVyLWNvbG9yKTtcXG4gIEBpbmNsdWRlIGJvcmRlci10b3AtcmFkaXVzKHZhcigtLSN7JHByZWZpeH1tb2RhbC1pbm5lci1ib3JkZXItcmFkaXVzKSk7XFxuXFxuICAuYnRuLWNsb3NlIHtcXG4gICAgcGFkZGluZzogY2FsYyh2YXIoLS0jeyRwcmVmaXh9bW9kYWwtaGVhZGVyLXBhZGRpbmcteSkgKiAuNSkgY2FsYyh2YXIoLS0jeyRwcmVmaXh9bW9kYWwtaGVhZGVyLXBhZGRpbmcteCkgKiAuNSk7XFxuICAgIG1hcmdpbjogY2FsYygtLjUgKiB2YXIoLS0jeyRwcmVmaXh9bW9kYWwtaGVhZGVyLXBhZGRpbmcteSkpIGNhbGMoLS41ICogdmFyKC0tI3skcHJlZml4fW1vZGFsLWhlYWRlci1wYWRkaW5nLXgpKSBjYWxjKC0uNSAqIHZhcigtLSN7JHByZWZpeH1tb2RhbC1oZWFkZXItcGFkZGluZy15KSkgYXV0bztcXG4gIH1cXG59XFxuXFxuLy8gVGl0bGUgdGV4dCB3aXRoaW4gaGVhZGVyXFxuLm1vZGFsLXRpdGxlIHtcXG4gIG1hcmdpbi1ib3R0b206IDA7XFxuICBsaW5lLWhlaWdodDogdmFyKC0tI3skcHJlZml4fW1vZGFsLXRpdGxlLWxpbmUtaGVpZ2h0KTtcXG59XFxuXFxuLy8gTW9kYWwgYm9keVxcbi8vIFdoZXJlIGFsbCBtb2RhbCBjb250ZW50IHJlc2lkZXMgKHNpYmxpbmcgb2YgLm1vZGFsLWhlYWRlciBhbmQgLm1vZGFsLWZvb3RlcilcXG4ubW9kYWwtYm9keSB7XFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICAvLyBFbmFibGUgYGZsZXgtZ3JvdzogMWAgc28gdGhhdCB0aGUgYm9keSB0YWtlIHVwIGFzIG11Y2ggc3BhY2UgYXMgcG9zc2libGVcXG4gIC8vIHdoZW4gdGhlcmUgc2hvdWxkIGJlIGEgZml4ZWQgaGVpZ2h0IG9uIGAubW9kYWwtZGlhbG9nYC5cXG4gIGZsZXg6IDEgMSBhdXRvO1xcbiAgcGFkZGluZzogdmFyKC0tI3skcHJlZml4fW1vZGFsLXBhZGRpbmcpO1xcbn1cXG5cXG4vLyBGb290ZXIgKGZvciBhY3Rpb25zKVxcbi5tb2RhbC1mb290ZXIge1xcbiAgZGlzcGxheTogZmxleDtcXG4gIGZsZXgtc2hyaW5rOiAwO1xcbiAgZmxleC13cmFwOiB3cmFwO1xcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjsgLy8gdmVydGljYWxseSBjZW50ZXJcXG4gIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7IC8vIFJpZ2h0IGFsaWduIGJ1dHRvbnMgd2l0aCBmbGV4IHByb3BlcnR5IGJlY2F1c2UgdGV4dC1hbGlnbiBkb2Vzbid0IHdvcmsgb24gZmxleCBpdGVtc1xcbiAgcGFkZGluZzogY2FsYyh2YXIoLS0jeyRwcmVmaXh9bW9kYWwtcGFkZGluZykgLSB2YXIoLS0jeyRwcmVmaXh9bW9kYWwtZm9vdGVyLWdhcCkgKiAuNSk7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS0jeyRwcmVmaXh9bW9kYWwtZm9vdGVyLWJnKTtcXG4gIGJvcmRlci10b3A6IHZhcigtLSN7JHByZWZpeH1tb2RhbC1mb290ZXItYm9yZGVyLXdpZHRoKSBzb2xpZCB2YXIoLS0jeyRwcmVmaXh9bW9kYWwtZm9vdGVyLWJvcmRlci1jb2xvcik7XFxuICBAaW5jbHVkZSBib3JkZXItYm90dG9tLXJhZGl1cyh2YXIoLS0jeyRwcmVmaXh9bW9kYWwtaW5uZXItYm9yZGVyLXJhZGl1cykpO1xcblxcbiAgLy8gUGxhY2UgbWFyZ2luIGJldHdlZW4gZm9vdGVyIGVsZW1lbnRzXFxuICAvLyBUaGlzIHNvbHV0aW9uIGlzIGZhciBmcm9tIGlkZWFsIGJlY2F1c2Ugb2YgdGhlIHVuaXZlcnNhbCBzZWxlY3RvciB1c2FnZSxcXG4gIC8vIGJ1dCBpcyBuZWVkZWQgdG8gZml4IGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9pc3N1ZXMvMjQ4MDBcXG4gID4gKiB7XFxuICAgIG1hcmdpbjogY2FsYyh2YXIoLS0jeyRwcmVmaXh9bW9kYWwtZm9vdGVyLWdhcCkgKiAuNSk7IC8vIFRvZG8gaW4gdjY6IHJlcGxhY2Ugd2l0aCBnYXAgb24gcGFyZW50IGNsYXNzXFxuICB9XFxufVxcblxcbi8vIFNjYWxlIHVwIHRoZSBtb2RhbFxcbkBpbmNsdWRlIG1lZGlhLWJyZWFrcG9pbnQtdXAoc20pIHtcXG4gIC5tb2RhbCB7XFxuICAgIC0tI3skcHJlZml4fW1vZGFsLW1hcmdpbjogI3skbW9kYWwtZGlhbG9nLW1hcmdpbi15LXNtLXVwfTtcXG4gICAgLS0jeyRwcmVmaXh9bW9kYWwtYm94LXNoYWRvdzogI3skbW9kYWwtY29udGVudC1ib3gtc2hhZG93LXNtLXVwfTtcXG4gIH1cXG5cXG4gIC8vIEF1dG9tYXRpY2FsbHkgc2V0IG1vZGFsJ3Mgd2lkdGggZm9yIGxhcmdlciB2aWV3cG9ydHNcXG4gIC5tb2RhbC1kaWFsb2cge1xcbiAgICBtYXgtd2lkdGg6IHZhcigtLSN7JHByZWZpeH1tb2RhbC13aWR0aCk7XFxuICAgIG1hcmdpbi1yaWdodDogYXV0bztcXG4gICAgbWFyZ2luLWxlZnQ6IGF1dG87XFxuICB9XFxuXFxuICAubW9kYWwtc20ge1xcbiAgICAtLSN7JHByZWZpeH1tb2RhbC13aWR0aDogI3skbW9kYWwtc219O1xcbiAgfVxcbn1cXG5cXG5AaW5jbHVkZSBtZWRpYS1icmVha3BvaW50LXVwKGxnKSB7XFxuICAubW9kYWwtbGcsXFxuICAubW9kYWwteGwge1xcbiAgICAtLSN7JHByZWZpeH1tb2RhbC13aWR0aDogI3skbW9kYWwtbGd9O1xcbiAgfVxcbn1cXG5cXG5AaW5jbHVkZSBtZWRpYS1icmVha3BvaW50LXVwKHhsKSB7XFxuICAubW9kYWwteGwge1xcbiAgICAtLSN7JHByZWZpeH1tb2RhbC13aWR0aDogI3skbW9kYWwteGx9O1xcbiAgfVxcbn1cXG5cXG4vLyBzY3NzLWRvY3Mtc3RhcnQgbW9kYWwtZnVsbHNjcmVlbi1sb29wXFxuQGVhY2ggJGJyZWFrcG9pbnQgaW4gbWFwLWtleXMoJGdyaWQtYnJlYWtwb2ludHMpIHtcXG4gICRpbmZpeDogYnJlYWtwb2ludC1pbmZpeCgkYnJlYWtwb2ludCwgJGdyaWQtYnJlYWtwb2ludHMpO1xcbiAgJHBvc3RmaXg6IGlmKCRpbmZpeCAhPSBcXFwiXFxcIiwgJGluZml4ICsgXFxcIi1kb3duXFxcIiwgXFxcIlxcXCIpO1xcblxcbiAgQGluY2x1ZGUgbWVkaWEtYnJlYWtwb2ludC1kb3duKCRicmVha3BvaW50KSB7XFxuICAgIC5tb2RhbC1mdWxsc2NyZWVuI3skcG9zdGZpeH0ge1xcbiAgICAgIHdpZHRoOiAxMDB2dztcXG4gICAgICBtYXgtd2lkdGg6IG5vbmU7XFxuICAgICAgaGVpZ2h0OiAxMDAlO1xcbiAgICAgIG1hcmdpbjogMDtcXG5cXG4gICAgICAubW9kYWwtY29udGVudCB7XFxuICAgICAgICBoZWlnaHQ6IDEwMCU7XFxuICAgICAgICBib3JkZXI6IDA7XFxuICAgICAgICBAaW5jbHVkZSBib3JkZXItcmFkaXVzKDApO1xcbiAgICAgIH1cXG5cXG4gICAgICAubW9kYWwtaGVhZGVyLFxcbiAgICAgIC5tb2RhbC1mb290ZXIge1xcbiAgICAgICAgQGluY2x1ZGUgYm9yZGVyLXJhZGl1cygwKTtcXG4gICAgICB9XFxuXFxuICAgICAgLm1vZGFsLWJvZHkge1xcbiAgICAgICAgb3ZlcmZsb3cteTogYXV0bztcXG4gICAgICB9XFxuICAgIH1cXG4gIH1cXG59XFxuLy8gc2Nzcy1kb2NzLWVuZCBtb2RhbC1mdWxsc2NyZWVuLWxvb3BcXG5cIixcIi8vIFNoYXJlZCBiZXR3ZWVuIG1vZGFscyBhbmQgb2ZmY2FudmFzZXNcXG5AbWl4aW4gb3ZlcmxheS1iYWNrZHJvcCgkemluZGV4LCAkYmFja2Ryb3AtYmcsICRiYWNrZHJvcC1vcGFjaXR5KSB7XFxuICBwb3NpdGlvbjogZml4ZWQ7XFxuICB0b3A6IDA7XFxuICBsZWZ0OiAwO1xcbiAgei1pbmRleDogJHppbmRleDtcXG4gIHdpZHRoOiAxMDB2dztcXG4gIGhlaWdodDogMTAwdmg7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAkYmFja2Ryb3AtYmc7XFxuXFxuICAvLyBGYWRlIGZvciBiYWNrZHJvcFxcbiAgJi5mYWRlIHsgb3BhY2l0eTogMDsgfVxcbiAgJi5zaG93IHsgb3BhY2l0eTogJGJhY2tkcm9wLW9wYWNpdHk7IH1cXG59XFxuXCIsXCIvLyBCYXNlIGNsYXNzXFxuLnRvb2x0aXAge1xcbiAgLy8gc2Nzcy1kb2NzLXN0YXJ0IHRvb2x0aXAtY3NzLXZhcnNcXG4gIC0tI3skcHJlZml4fXRvb2x0aXAtemluZGV4OiAjeyR6aW5kZXgtdG9vbHRpcH07XFxuICAtLSN7JHByZWZpeH10b29sdGlwLW1heC13aWR0aDogI3skdG9vbHRpcC1tYXgtd2lkdGh9O1xcbiAgLS0jeyRwcmVmaXh9dG9vbHRpcC1wYWRkaW5nLXg6ICN7JHRvb2x0aXAtcGFkZGluZy14fTtcXG4gIC0tI3skcHJlZml4fXRvb2x0aXAtcGFkZGluZy15OiAjeyR0b29sdGlwLXBhZGRpbmcteX07XFxuICAtLSN7JHByZWZpeH10b29sdGlwLW1hcmdpbjogI3skdG9vbHRpcC1tYXJnaW59O1xcbiAgQGluY2x1ZGUgcmZzKCR0b29sdGlwLWZvbnQtc2l6ZSwgLS0jeyRwcmVmaXh9dG9vbHRpcC1mb250LXNpemUpO1xcbiAgLS0jeyRwcmVmaXh9dG9vbHRpcC1jb2xvcjogI3skdG9vbHRpcC1jb2xvcn07XFxuICAtLSN7JHByZWZpeH10b29sdGlwLWJnOiAjeyR0b29sdGlwLWJnfTtcXG4gIC0tI3skcHJlZml4fXRvb2x0aXAtYm9yZGVyLXJhZGl1czogI3skdG9vbHRpcC1ib3JkZXItcmFkaXVzfTtcXG4gIC0tI3skcHJlZml4fXRvb2x0aXAtb3BhY2l0eTogI3skdG9vbHRpcC1vcGFjaXR5fTtcXG4gIC0tI3skcHJlZml4fXRvb2x0aXAtYXJyb3ctd2lkdGg6ICN7JHRvb2x0aXAtYXJyb3ctd2lkdGh9O1xcbiAgLS0jeyRwcmVmaXh9dG9vbHRpcC1hcnJvdy1oZWlnaHQ6ICN7JHRvb2x0aXAtYXJyb3ctaGVpZ2h0fTtcXG4gIC8vIHNjc3MtZG9jcy1lbmQgdG9vbHRpcC1jc3MtdmFyc1xcblxcbiAgei1pbmRleDogdmFyKC0tI3skcHJlZml4fXRvb2x0aXAtemluZGV4KTtcXG4gIGRpc3BsYXk6IGJsb2NrO1xcbiAgbWFyZ2luOiB2YXIoLS0jeyRwcmVmaXh9dG9vbHRpcC1tYXJnaW4pO1xcbiAgQGluY2x1ZGUgZGVwcmVjYXRlKFxcXCJgJHRvb2x0aXAtbWFyZ2luYFxcXCIsIFxcXCJ2NVxcXCIsIFxcXCJ2NS54XFxcIiwgdHJ1ZSk7XFxuICAvLyBPdXIgcGFyZW50IGVsZW1lbnQgY2FuIGJlIGFyYml0cmFyeSBzaW5jZSB0b29sdGlwcyBhcmUgYnkgZGVmYXVsdCBpbnNlcnRlZCBhcyBhIHNpYmxpbmcgb2YgdGhlaXIgdGFyZ2V0IGVsZW1lbnQuXFxuICAvLyBTbyByZXNldCBvdXIgZm9udCBhbmQgdGV4dCBwcm9wZXJ0aWVzIHRvIGF2b2lkIGluaGVyaXRpbmcgd2VpcmQgdmFsdWVzLlxcbiAgQGluY2x1ZGUgcmVzZXQtdGV4dCgpO1xcbiAgQGluY2x1ZGUgZm9udC1zaXplKHZhcigtLSN7JHByZWZpeH10b29sdGlwLWZvbnQtc2l6ZSkpO1xcbiAgLy8gQWxsb3cgYnJlYWtpbmcgdmVyeSBsb25nIHdvcmRzIHNvIHRoZXkgZG9uJ3Qgb3ZlcmZsb3cgdGhlIHRvb2x0aXAncyBib3VuZHNcXG4gIHdvcmQtd3JhcDogYnJlYWstd29yZDtcXG4gIG9wYWNpdHk6IDA7XFxuXFxuICAmLnNob3cgeyBvcGFjaXR5OiB2YXIoLS0jeyRwcmVmaXh9dG9vbHRpcC1vcGFjaXR5KTsgfVxcblxcbiAgLnRvb2x0aXAtYXJyb3cge1xcbiAgICBkaXNwbGF5OiBibG9jaztcXG4gICAgd2lkdGg6IHZhcigtLSN7JHByZWZpeH10b29sdGlwLWFycm93LXdpZHRoKTtcXG4gICAgaGVpZ2h0OiB2YXIoLS0jeyRwcmVmaXh9dG9vbHRpcC1hcnJvdy1oZWlnaHQpO1xcblxcbiAgICAmOjpiZWZvcmUge1xcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgICBjb250ZW50OiBcXFwiXFxcIjtcXG4gICAgICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50O1xcbiAgICAgIGJvcmRlci1zdHlsZTogc29saWQ7XFxuICAgIH1cXG4gIH1cXG59XFxuXFxuLmJzLXRvb2x0aXAtdG9wIC50b29sdGlwLWFycm93IHtcXG4gIGJvdHRvbTogY2FsYygtMSAqIHZhcigtLSN7JHByZWZpeH10b29sdGlwLWFycm93LWhlaWdodCkpOyAvLyBzdHlsZWxpbnQtZGlzYWJsZS1saW5lIGZ1bmN0aW9uLWRpc2FsbG93ZWQtbGlzdFxcblxcbiAgJjo6YmVmb3JlIHtcXG4gICAgdG9wOiAtMXB4O1xcbiAgICBib3JkZXItd2lkdGg6IHZhcigtLSN7JHByZWZpeH10b29sdGlwLWFycm93LWhlaWdodCkgY2FsYyh2YXIoLS0jeyRwcmVmaXh9dG9vbHRpcC1hcnJvdy13aWR0aCkgKiAuNSkgMDsgLy8gc3R5bGVsaW50LWRpc2FibGUtbGluZSBmdW5jdGlvbi1kaXNhbGxvd2VkLWxpc3RcXG4gICAgYm9yZGVyLXRvcC1jb2xvcjogdmFyKC0tI3skcHJlZml4fXRvb2x0aXAtYmcpO1xcbiAgfVxcbn1cXG5cXG4vKiBydGw6YmVnaW46aWdub3JlICovXFxuLmJzLXRvb2x0aXAtZW5kIC50b29sdGlwLWFycm93IHtcXG4gIGxlZnQ6IGNhbGMoLTEgKiB2YXIoLS0jeyRwcmVmaXh9dG9vbHRpcC1hcnJvdy1oZWlnaHQpKTsgLy8gc3R5bGVsaW50LWRpc2FibGUtbGluZSBmdW5jdGlvbi1kaXNhbGxvd2VkLWxpc3RcXG4gIHdpZHRoOiB2YXIoLS0jeyRwcmVmaXh9dG9vbHRpcC1hcnJvdy1oZWlnaHQpO1xcbiAgaGVpZ2h0OiB2YXIoLS0jeyRwcmVmaXh9dG9vbHRpcC1hcnJvdy13aWR0aCk7XFxuXFxuICAmOjpiZWZvcmUge1xcbiAgICByaWdodDogLTFweDtcXG4gICAgYm9yZGVyLXdpZHRoOiBjYWxjKHZhcigtLSN7JHByZWZpeH10b29sdGlwLWFycm93LXdpZHRoKSAqIC41KSB2YXIoLS0jeyRwcmVmaXh9dG9vbHRpcC1hcnJvdy1oZWlnaHQpIGNhbGModmFyKC0tI3skcHJlZml4fXRvb2x0aXAtYXJyb3ctd2lkdGgpICogLjUpIDA7IC8vIHN0eWxlbGludC1kaXNhYmxlLWxpbmUgZnVuY3Rpb24tZGlzYWxsb3dlZC1saXN0XFxuICAgIGJvcmRlci1yaWdodC1jb2xvcjogdmFyKC0tI3skcHJlZml4fXRvb2x0aXAtYmcpO1xcbiAgfVxcbn1cXG5cXG4vKiBydGw6ZW5kOmlnbm9yZSAqL1xcblxcbi5icy10b29sdGlwLWJvdHRvbSAudG9vbHRpcC1hcnJvdyB7XFxuICB0b3A6IGNhbGMoLTEgKiB2YXIoLS0jeyRwcmVmaXh9dG9vbHRpcC1hcnJvdy1oZWlnaHQpKTsgLy8gc3R5bGVsaW50LWRpc2FibGUtbGluZSBmdW5jdGlvbi1kaXNhbGxvd2VkLWxpc3RcXG5cXG4gICY6OmJlZm9yZSB7XFxuICAgIGJvdHRvbTogLTFweDtcXG4gICAgYm9yZGVyLXdpZHRoOiAwIGNhbGModmFyKC0tI3skcHJlZml4fXRvb2x0aXAtYXJyb3ctd2lkdGgpICogLjUpIHZhcigtLSN7JHByZWZpeH10b29sdGlwLWFycm93LWhlaWdodCk7IC8vIHN0eWxlbGludC1kaXNhYmxlLWxpbmUgZnVuY3Rpb24tZGlzYWxsb3dlZC1saXN0XFxuICAgIGJvcmRlci1ib3R0b20tY29sb3I6IHZhcigtLSN7JHByZWZpeH10b29sdGlwLWJnKTtcXG4gIH1cXG59XFxuXFxuLyogcnRsOmJlZ2luOmlnbm9yZSAqL1xcbi5icy10b29sdGlwLXN0YXJ0IC50b29sdGlwLWFycm93IHtcXG4gIHJpZ2h0OiBjYWxjKC0xICogdmFyKC0tI3skcHJlZml4fXRvb2x0aXAtYXJyb3ctaGVpZ2h0KSk7IC8vIHN0eWxlbGludC1kaXNhYmxlLWxpbmUgZnVuY3Rpb24tZGlzYWxsb3dlZC1saXN0XFxuICB3aWR0aDogdmFyKC0tI3skcHJlZml4fXRvb2x0aXAtYXJyb3ctaGVpZ2h0KTtcXG4gIGhlaWdodDogdmFyKC0tI3skcHJlZml4fXRvb2x0aXAtYXJyb3ctd2lkdGgpO1xcblxcbiAgJjo6YmVmb3JlIHtcXG4gICAgbGVmdDogLTFweDtcXG4gICAgYm9yZGVyLXdpZHRoOiBjYWxjKHZhcigtLSN7JHByZWZpeH10b29sdGlwLWFycm93LXdpZHRoKSAqIC41KSAwIGNhbGModmFyKC0tI3skcHJlZml4fXRvb2x0aXAtYXJyb3ctd2lkdGgpICogLjUpIHZhcigtLSN7JHByZWZpeH10b29sdGlwLWFycm93LWhlaWdodCk7IC8vIHN0eWxlbGludC1kaXNhYmxlLWxpbmUgZnVuY3Rpb24tZGlzYWxsb3dlZC1saXN0XFxuICAgIGJvcmRlci1sZWZ0LWNvbG9yOiB2YXIoLS0jeyRwcmVmaXh9dG9vbHRpcC1iZyk7XFxuICB9XFxufVxcblxcbi8qIHJ0bDplbmQ6aWdub3JlICovXFxuXFxuLmJzLXRvb2x0aXAtYXV0byB7XFxuICAmW2RhdGEtcG9wcGVyLXBsYWNlbWVudF49XFxcInRvcFxcXCJdIHtcXG4gICAgQGV4dGVuZCAuYnMtdG9vbHRpcC10b3A7XFxuICB9XFxuICAmW2RhdGEtcG9wcGVyLXBsYWNlbWVudF49XFxcInJpZ2h0XFxcIl0ge1xcbiAgICBAZXh0ZW5kIC5icy10b29sdGlwLWVuZDtcXG4gIH1cXG4gICZbZGF0YS1wb3BwZXItcGxhY2VtZW50Xj1cXFwiYm90dG9tXFxcIl0ge1xcbiAgICBAZXh0ZW5kIC5icy10b29sdGlwLWJvdHRvbTtcXG4gIH1cXG4gICZbZGF0YS1wb3BwZXItcGxhY2VtZW50Xj1cXFwibGVmdFxcXCJdIHtcXG4gICAgQGV4dGVuZCAuYnMtdG9vbHRpcC1zdGFydDtcXG4gIH1cXG59XFxuXFxuLy8gV3JhcHBlciBmb3IgdGhlIHRvb2x0aXAgY29udGVudFxcbi50b29sdGlwLWlubmVyIHtcXG4gIG1heC13aWR0aDogdmFyKC0tI3skcHJlZml4fXRvb2x0aXAtbWF4LXdpZHRoKTtcXG4gIHBhZGRpbmc6IHZhcigtLSN7JHByZWZpeH10b29sdGlwLXBhZGRpbmcteSkgdmFyKC0tI3skcHJlZml4fXRvb2x0aXAtcGFkZGluZy14KTtcXG4gIGNvbG9yOiB2YXIoLS0jeyRwcmVmaXh9dG9vbHRpcC1jb2xvcik7XFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS0jeyRwcmVmaXh9dG9vbHRpcC1iZyk7XFxuICBAaW5jbHVkZSBib3JkZXItcmFkaXVzKHZhcigtLSN7JHByZWZpeH10b29sdGlwLWJvcmRlci1yYWRpdXMpKTtcXG59XFxuXCIsXCJAbWl4aW4gcmVzZXQtdGV4dCB7XFxuICBmb250LWZhbWlseTogJGZvbnQtZmFtaWx5LWJhc2U7XFxuICAvLyBXZSBkZWxpYmVyYXRlbHkgZG8gTk9UIHJlc2V0IGZvbnQtc2l6ZSBvciBvdmVyZmxvdy13cmFwIC8gd29yZC13cmFwLlxcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgZm9udC13ZWlnaHQ6ICRmb250LXdlaWdodC1ub3JtYWw7XFxuICBsaW5lLWhlaWdodDogJGxpbmUtaGVpZ2h0LWJhc2U7XFxuICB0ZXh0LWFsaWduOiBsZWZ0OyAvLyBGYWxsYmFjayBmb3Igd2hlcmUgYHN0YXJ0YCBpcyBub3Qgc3VwcG9ydGVkXFxuICB0ZXh0LWFsaWduOiBzdGFydDtcXG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcXG4gIHRleHQtc2hhZG93OiBub25lO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuICBsZXR0ZXItc3BhY2luZzogbm9ybWFsO1xcbiAgd29yZC1icmVhazogbm9ybWFsO1xcbiAgd2hpdGUtc3BhY2U6IG5vcm1hbDtcXG4gIHdvcmQtc3BhY2luZzogbm9ybWFsO1xcbiAgbGluZS1icmVhazogYXV0bztcXG59XFxuXCIsXCIucG9wb3ZlciB7XFxuICAvLyBzY3NzLWRvY3Mtc3RhcnQgcG9wb3Zlci1jc3MtdmFyc1xcbiAgLS0jeyRwcmVmaXh9cG9wb3Zlci16aW5kZXg6ICN7JHppbmRleC1wb3BvdmVyfTtcXG4gIC0tI3skcHJlZml4fXBvcG92ZXItbWF4LXdpZHRoOiAjeyRwb3BvdmVyLW1heC13aWR0aH07XFxuICBAaW5jbHVkZSByZnMoJHBvcG92ZXItZm9udC1zaXplLCAtLSN7JHByZWZpeH1wb3BvdmVyLWZvbnQtc2l6ZSk7XFxuICAtLSN7JHByZWZpeH1wb3BvdmVyLWJnOiAjeyRwb3BvdmVyLWJnfTtcXG4gIC0tI3skcHJlZml4fXBvcG92ZXItYm9yZGVyLXdpZHRoOiAjeyRwb3BvdmVyLWJvcmRlci13aWR0aH07XFxuICAtLSN7JHByZWZpeH1wb3BvdmVyLWJvcmRlci1jb2xvcjogI3skcG9wb3Zlci1ib3JkZXItY29sb3J9O1xcbiAgLS0jeyRwcmVmaXh9cG9wb3Zlci1ib3JkZXItcmFkaXVzOiAjeyRwb3BvdmVyLWJvcmRlci1yYWRpdXN9O1xcbiAgLS0jeyRwcmVmaXh9cG9wb3Zlci1pbm5lci1ib3JkZXItcmFkaXVzOiAjeyRwb3BvdmVyLWlubmVyLWJvcmRlci1yYWRpdXN9O1xcbiAgLS0jeyRwcmVmaXh9cG9wb3Zlci1ib3gtc2hhZG93OiAjeyRwb3BvdmVyLWJveC1zaGFkb3d9O1xcbiAgLS0jeyRwcmVmaXh9cG9wb3Zlci1oZWFkZXItcGFkZGluZy14OiAjeyRwb3BvdmVyLWhlYWRlci1wYWRkaW5nLXh9O1xcbiAgLS0jeyRwcmVmaXh9cG9wb3Zlci1oZWFkZXItcGFkZGluZy15OiAjeyRwb3BvdmVyLWhlYWRlci1wYWRkaW5nLXl9O1xcbiAgQGluY2x1ZGUgcmZzKCRwb3BvdmVyLWhlYWRlci1mb250LXNpemUsIC0tI3skcHJlZml4fXBvcG92ZXItaGVhZGVyLWZvbnQtc2l6ZSk7XFxuICAtLSN7JHByZWZpeH1wb3BvdmVyLWhlYWRlci1jb2xvcjogI3skcG9wb3Zlci1oZWFkZXItY29sb3J9O1xcbiAgLS0jeyRwcmVmaXh9cG9wb3Zlci1oZWFkZXItYmc6ICN7JHBvcG92ZXItaGVhZGVyLWJnfTtcXG4gIC0tI3skcHJlZml4fXBvcG92ZXItYm9keS1wYWRkaW5nLXg6ICN7JHBvcG92ZXItYm9keS1wYWRkaW5nLXh9O1xcbiAgLS0jeyRwcmVmaXh9cG9wb3Zlci1ib2R5LXBhZGRpbmcteTogI3skcG9wb3Zlci1ib2R5LXBhZGRpbmcteX07XFxuICAtLSN7JHByZWZpeH1wb3BvdmVyLWJvZHktY29sb3I6ICN7JHBvcG92ZXItYm9keS1jb2xvcn07XFxuICAtLSN7JHByZWZpeH1wb3BvdmVyLWFycm93LXdpZHRoOiAjeyRwb3BvdmVyLWFycm93LXdpZHRofTtcXG4gIC0tI3skcHJlZml4fXBvcG92ZXItYXJyb3ctaGVpZ2h0OiAjeyRwb3BvdmVyLWFycm93LWhlaWdodH07XFxuICAtLSN7JHByZWZpeH1wb3BvdmVyLWFycm93LWJvcmRlcjogdmFyKC0tI3skcHJlZml4fXBvcG92ZXItYm9yZGVyLWNvbG9yKTtcXG4gIC8vIHNjc3MtZG9jcy1lbmQgcG9wb3Zlci1jc3MtdmFyc1xcblxcbiAgei1pbmRleDogdmFyKC0tI3skcHJlZml4fXBvcG92ZXItemluZGV4KTtcXG4gIGRpc3BsYXk6IGJsb2NrO1xcbiAgbWF4LXdpZHRoOiB2YXIoLS0jeyRwcmVmaXh9cG9wb3Zlci1tYXgtd2lkdGgpO1xcbiAgLy8gT3VyIHBhcmVudCBlbGVtZW50IGNhbiBiZSBhcmJpdHJhcnkgc2luY2UgdG9vbHRpcHMgYXJlIGJ5IGRlZmF1bHQgaW5zZXJ0ZWQgYXMgYSBzaWJsaW5nIG9mIHRoZWlyIHRhcmdldCBlbGVtZW50LlxcbiAgLy8gU28gcmVzZXQgb3VyIGZvbnQgYW5kIHRleHQgcHJvcGVydGllcyB0byBhdm9pZCBpbmhlcml0aW5nIHdlaXJkIHZhbHVlcy5cXG4gIEBpbmNsdWRlIHJlc2V0LXRleHQoKTtcXG4gIEBpbmNsdWRlIGZvbnQtc2l6ZSh2YXIoLS0jeyRwcmVmaXh9cG9wb3Zlci1mb250LXNpemUpKTtcXG4gIC8vIEFsbG93IGJyZWFraW5nIHZlcnkgbG9uZyB3b3JkcyBzbyB0aGV5IGRvbid0IG92ZXJmbG93IHRoZSBwb3BvdmVyJ3MgYm91bmRzXFxuICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS0jeyRwcmVmaXh9cG9wb3Zlci1iZyk7XFxuICBiYWNrZ3JvdW5kLWNsaXA6IHBhZGRpbmctYm94O1xcbiAgYm9yZGVyOiB2YXIoLS0jeyRwcmVmaXh9cG9wb3Zlci1ib3JkZXItd2lkdGgpIHNvbGlkIHZhcigtLSN7JHByZWZpeH1wb3BvdmVyLWJvcmRlci1jb2xvcik7XFxuICBAaW5jbHVkZSBib3JkZXItcmFkaXVzKHZhcigtLSN7JHByZWZpeH1wb3BvdmVyLWJvcmRlci1yYWRpdXMpKTtcXG4gIEBpbmNsdWRlIGJveC1zaGFkb3codmFyKC0tI3skcHJlZml4fXBvcG92ZXItYm94LXNoYWRvdykpO1xcblxcbiAgLnBvcG92ZXItYXJyb3cge1xcbiAgICBkaXNwbGF5OiBibG9jaztcXG4gICAgd2lkdGg6IHZhcigtLSN7JHByZWZpeH1wb3BvdmVyLWFycm93LXdpZHRoKTtcXG4gICAgaGVpZ2h0OiB2YXIoLS0jeyRwcmVmaXh9cG9wb3Zlci1hcnJvdy1oZWlnaHQpO1xcblxcbiAgICAmOjpiZWZvcmUsXFxuICAgICY6OmFmdGVyIHtcXG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgICAgZGlzcGxheTogYmxvY2s7XFxuICAgICAgY29udGVudDogXFxcIlxcXCI7XFxuICAgICAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDtcXG4gICAgICBib3JkZXItc3R5bGU6IHNvbGlkO1xcbiAgICAgIGJvcmRlci13aWR0aDogMDtcXG4gICAgfVxcbiAgfVxcbn1cXG5cXG4uYnMtcG9wb3Zlci10b3Age1xcbiAgPiAucG9wb3Zlci1hcnJvdyB7XFxuICAgIGJvdHRvbTogY2FsYygtMSAqICh2YXIoLS0jeyRwcmVmaXh9cG9wb3Zlci1hcnJvdy1oZWlnaHQpKSAtIHZhcigtLSN7JHByZWZpeH1wb3BvdmVyLWJvcmRlci13aWR0aCkpOyAvLyBzdHlsZWxpbnQtZGlzYWJsZS1saW5lIGZ1bmN0aW9uLWRpc2FsbG93ZWQtbGlzdFxcblxcbiAgICAmOjpiZWZvcmUsXFxuICAgICY6OmFmdGVyIHtcXG4gICAgICBib3JkZXItd2lkdGg6IHZhcigtLSN7JHByZWZpeH1wb3BvdmVyLWFycm93LWhlaWdodCkgY2FsYyh2YXIoLS0jeyRwcmVmaXh9cG9wb3Zlci1hcnJvdy13aWR0aCkgKiAuNSkgMDsgLy8gc3R5bGVsaW50LWRpc2FibGUtbGluZSBmdW5jdGlvbi1kaXNhbGxvd2VkLWxpc3RcXG4gICAgfVxcblxcbiAgICAmOjpiZWZvcmUge1xcbiAgICAgIGJvdHRvbTogMDtcXG4gICAgICBib3JkZXItdG9wLWNvbG9yOiB2YXIoLS0jeyRwcmVmaXh9cG9wb3Zlci1hcnJvdy1ib3JkZXIpO1xcbiAgICB9XFxuXFxuICAgICY6OmFmdGVyIHtcXG4gICAgICBib3R0b206IHZhcigtLSN7JHByZWZpeH1wb3BvdmVyLWJvcmRlci13aWR0aCk7XFxuICAgICAgYm9yZGVyLXRvcC1jb2xvcjogdmFyKC0tI3skcHJlZml4fXBvcG92ZXItYmcpO1xcbiAgICB9XFxuICB9XFxufVxcblxcbi8qIHJ0bDpiZWdpbjppZ25vcmUgKi9cXG4uYnMtcG9wb3Zlci1lbmQge1xcbiAgPiAucG9wb3Zlci1hcnJvdyB7XFxuICAgIGxlZnQ6IGNhbGMoLTEgKiAodmFyKC0tI3skcHJlZml4fXBvcG92ZXItYXJyb3ctaGVpZ2h0KSkgLSB2YXIoLS0jeyRwcmVmaXh9cG9wb3Zlci1ib3JkZXItd2lkdGgpKTsgLy8gc3R5bGVsaW50LWRpc2FibGUtbGluZSBmdW5jdGlvbi1kaXNhbGxvd2VkLWxpc3RcXG4gICAgd2lkdGg6IHZhcigtLSN7JHByZWZpeH1wb3BvdmVyLWFycm93LWhlaWdodCk7XFxuICAgIGhlaWdodDogdmFyKC0tI3skcHJlZml4fXBvcG92ZXItYXJyb3ctd2lkdGgpO1xcblxcbiAgICAmOjpiZWZvcmUsXFxuICAgICY6OmFmdGVyIHtcXG4gICAgICBib3JkZXItd2lkdGg6IGNhbGModmFyKC0tI3skcHJlZml4fXBvcG92ZXItYXJyb3ctd2lkdGgpICogLjUpIHZhcigtLSN7JHByZWZpeH1wb3BvdmVyLWFycm93LWhlaWdodCkgY2FsYyh2YXIoLS0jeyRwcmVmaXh9cG9wb3Zlci1hcnJvdy13aWR0aCkgKiAuNSkgMDsgLy8gc3R5bGVsaW50LWRpc2FibGUtbGluZSBmdW5jdGlvbi1kaXNhbGxvd2VkLWxpc3RcXG4gICAgfVxcblxcbiAgICAmOjpiZWZvcmUge1xcbiAgICAgIGxlZnQ6IDA7XFxuICAgICAgYm9yZGVyLXJpZ2h0LWNvbG9yOiB2YXIoLS0jeyRwcmVmaXh9cG9wb3Zlci1hcnJvdy1ib3JkZXIpO1xcbiAgICB9XFxuXFxuICAgICY6OmFmdGVyIHtcXG4gICAgICBsZWZ0OiB2YXIoLS0jeyRwcmVmaXh9cG9wb3Zlci1ib3JkZXItd2lkdGgpO1xcbiAgICAgIGJvcmRlci1yaWdodC1jb2xvcjogdmFyKC0tI3skcHJlZml4fXBvcG92ZXItYmcpO1xcbiAgICB9XFxuICB9XFxufVxcblxcbi8qIHJ0bDplbmQ6aWdub3JlICovXFxuXFxuLmJzLXBvcG92ZXItYm90dG9tIHtcXG4gID4gLnBvcG92ZXItYXJyb3cge1xcbiAgICB0b3A6IGNhbGMoLTEgKiAodmFyKC0tI3skcHJlZml4fXBvcG92ZXItYXJyb3ctaGVpZ2h0KSkgLSB2YXIoLS0jeyRwcmVmaXh9cG9wb3Zlci1ib3JkZXItd2lkdGgpKTsgLy8gc3R5bGVsaW50LWRpc2FibGUtbGluZSBmdW5jdGlvbi1kaXNhbGxvd2VkLWxpc3RcXG5cXG4gICAgJjo6YmVmb3JlLFxcbiAgICAmOjphZnRlciB7XFxuICAgICAgYm9yZGVyLXdpZHRoOiAwIGNhbGModmFyKC0tI3skcHJlZml4fXBvcG92ZXItYXJyb3ctd2lkdGgpICogLjUpIHZhcigtLSN7JHByZWZpeH1wb3BvdmVyLWFycm93LWhlaWdodCk7IC8vIHN0eWxlbGludC1kaXNhYmxlLWxpbmUgZnVuY3Rpb24tZGlzYWxsb3dlZC1saXN0XFxuICAgIH1cXG5cXG4gICAgJjo6YmVmb3JlIHtcXG4gICAgICB0b3A6IDA7XFxuICAgICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogdmFyKC0tI3skcHJlZml4fXBvcG92ZXItYXJyb3ctYm9yZGVyKTtcXG4gICAgfVxcblxcbiAgICAmOjphZnRlciB7XFxuICAgICAgdG9wOiB2YXIoLS0jeyRwcmVmaXh9cG9wb3Zlci1ib3JkZXItd2lkdGgpO1xcbiAgICAgIGJvcmRlci1ib3R0b20tY29sb3I6IHZhcigtLSN7JHByZWZpeH1wb3BvdmVyLWJnKTtcXG4gICAgfVxcbiAgfVxcblxcbiAgLy8gVGhpcyB3aWxsIHJlbW92ZSB0aGUgcG9wb3Zlci1oZWFkZXIncyBib3JkZXIganVzdCBiZWxvdyB0aGUgYXJyb3dcXG4gIC5wb3BvdmVyLWhlYWRlcjo6YmVmb3JlIHtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICB0b3A6IDA7XFxuICAgIGxlZnQ6IDUwJTtcXG4gICAgZGlzcGxheTogYmxvY2s7XFxuICAgIHdpZHRoOiB2YXIoLS0jeyRwcmVmaXh9cG9wb3Zlci1hcnJvdy13aWR0aCk7XFxuICAgIG1hcmdpbi1sZWZ0OiBjYWxjKC0uNSAqIHZhcigtLSN7JHByZWZpeH1wb3BvdmVyLWFycm93LXdpZHRoKSk7IC8vIHN0eWxlbGludC1kaXNhYmxlLWxpbmUgZnVuY3Rpb24tZGlzYWxsb3dlZC1saXN0XFxuICAgIGNvbnRlbnQ6IFxcXCJcXFwiO1xcbiAgICBib3JkZXItYm90dG9tOiB2YXIoLS0jeyRwcmVmaXh9cG9wb3Zlci1ib3JkZXItd2lkdGgpIHNvbGlkIHZhcigtLSN7JHByZWZpeH1wb3BvdmVyLWhlYWRlci1iZyk7XFxuICB9XFxufVxcblxcbi8qIHJ0bDpiZWdpbjppZ25vcmUgKi9cXG4uYnMtcG9wb3Zlci1zdGFydCB7XFxuICA+IC5wb3BvdmVyLWFycm93IHtcXG4gICAgcmlnaHQ6IGNhbGMoLTEgKiAodmFyKC0tI3skcHJlZml4fXBvcG92ZXItYXJyb3ctaGVpZ2h0KSkgLSB2YXIoLS0jeyRwcmVmaXh9cG9wb3Zlci1ib3JkZXItd2lkdGgpKTsgLy8gc3R5bGVsaW50LWRpc2FibGUtbGluZSBmdW5jdGlvbi1kaXNhbGxvd2VkLWxpc3RcXG4gICAgd2lkdGg6IHZhcigtLSN7JHByZWZpeH1wb3BvdmVyLWFycm93LWhlaWdodCk7XFxuICAgIGhlaWdodDogdmFyKC0tI3skcHJlZml4fXBvcG92ZXItYXJyb3ctd2lkdGgpO1xcblxcbiAgICAmOjpiZWZvcmUsXFxuICAgICY6OmFmdGVyIHtcXG4gICAgICBib3JkZXItd2lkdGg6IGNhbGModmFyKC0tI3skcHJlZml4fXBvcG92ZXItYXJyb3ctd2lkdGgpICogLjUpIDAgY2FsYyh2YXIoLS0jeyRwcmVmaXh9cG9wb3Zlci1hcnJvdy13aWR0aCkgKiAuNSkgdmFyKC0tI3skcHJlZml4fXBvcG92ZXItYXJyb3ctaGVpZ2h0KTsgLy8gc3R5bGVsaW50LWRpc2FibGUtbGluZSBmdW5jdGlvbi1kaXNhbGxvd2VkLWxpc3RcXG4gICAgfVxcblxcbiAgICAmOjpiZWZvcmUge1xcbiAgICAgIHJpZ2h0OiAwO1xcbiAgICAgIGJvcmRlci1sZWZ0LWNvbG9yOiB2YXIoLS0jeyRwcmVmaXh9cG9wb3Zlci1hcnJvdy1ib3JkZXIpO1xcbiAgICB9XFxuXFxuICAgICY6OmFmdGVyIHtcXG4gICAgICByaWdodDogdmFyKC0tI3skcHJlZml4fXBvcG92ZXItYm9yZGVyLXdpZHRoKTtcXG4gICAgICBib3JkZXItbGVmdC1jb2xvcjogdmFyKC0tI3skcHJlZml4fXBvcG92ZXItYmcpO1xcbiAgICB9XFxuICB9XFxufVxcblxcbi8qIHJ0bDplbmQ6aWdub3JlICovXFxuXFxuLmJzLXBvcG92ZXItYXV0byB7XFxuICAmW2RhdGEtcG9wcGVyLXBsYWNlbWVudF49XFxcInRvcFxcXCJdIHtcXG4gICAgQGV4dGVuZCAuYnMtcG9wb3Zlci10b3A7XFxuICB9XFxuICAmW2RhdGEtcG9wcGVyLXBsYWNlbWVudF49XFxcInJpZ2h0XFxcIl0ge1xcbiAgICBAZXh0ZW5kIC5icy1wb3BvdmVyLWVuZDtcXG4gIH1cXG4gICZbZGF0YS1wb3BwZXItcGxhY2VtZW50Xj1cXFwiYm90dG9tXFxcIl0ge1xcbiAgICBAZXh0ZW5kIC5icy1wb3BvdmVyLWJvdHRvbTtcXG4gIH1cXG4gICZbZGF0YS1wb3BwZXItcGxhY2VtZW50Xj1cXFwibGVmdFxcXCJdIHtcXG4gICAgQGV4dGVuZCAuYnMtcG9wb3Zlci1zdGFydDtcXG4gIH1cXG59XFxuXFxuLy8gT2Zmc2V0IHRoZSBwb3BvdmVyIHRvIGFjY291bnQgZm9yIHRoZSBwb3BvdmVyIGFycm93XFxuLnBvcG92ZXItaGVhZGVyIHtcXG4gIHBhZGRpbmc6IHZhcigtLSN7JHByZWZpeH1wb3BvdmVyLWhlYWRlci1wYWRkaW5nLXkpIHZhcigtLSN7JHByZWZpeH1wb3BvdmVyLWhlYWRlci1wYWRkaW5nLXgpO1xcbiAgbWFyZ2luLWJvdHRvbTogMDsgLy8gUmVzZXQgdGhlIGRlZmF1bHQgZnJvbSBSZWJvb3RcXG4gIEBpbmNsdWRlIGZvbnQtc2l6ZSh2YXIoLS0jeyRwcmVmaXh9cG9wb3Zlci1oZWFkZXItZm9udC1zaXplKSk7XFxuICBjb2xvcjogdmFyKC0tI3skcHJlZml4fXBvcG92ZXItaGVhZGVyLWNvbG9yKTtcXG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLSN7JHByZWZpeH1wb3BvdmVyLWhlYWRlci1iZyk7XFxuICBib3JkZXItYm90dG9tOiB2YXIoLS0jeyRwcmVmaXh9cG9wb3Zlci1ib3JkZXItd2lkdGgpIHNvbGlkIHZhcigtLSN7JHByZWZpeH1wb3BvdmVyLWJvcmRlci1jb2xvcik7XFxuICBAaW5jbHVkZSBib3JkZXItdG9wLXJhZGl1cyh2YXIoLS0jeyRwcmVmaXh9cG9wb3Zlci1pbm5lci1ib3JkZXItcmFkaXVzKSk7XFxuXFxuICAmOmVtcHR5IHtcXG4gICAgZGlzcGxheTogbm9uZTtcXG4gIH1cXG59XFxuXFxuLnBvcG92ZXItYm9keSB7XFxuICBwYWRkaW5nOiB2YXIoLS0jeyRwcmVmaXh9cG9wb3Zlci1ib2R5LXBhZGRpbmcteSkgdmFyKC0tI3skcHJlZml4fXBvcG92ZXItYm9keS1wYWRkaW5nLXgpO1xcbiAgY29sb3I6IHZhcigtLSN7JHByZWZpeH1wb3BvdmVyLWJvZHktY29sb3IpO1xcbn1cXG5cIixcIi8vIE5vdGVzIG9uIHRoZSBjbGFzc2VzOlxcbi8vXFxuLy8gMS4gLmNhcm91c2VsLnBvaW50ZXItZXZlbnQgc2hvdWxkIGlkZWFsbHkgYmUgcGFuLXkgKHRvIGFsbG93IGZvciB1c2VycyB0byBzY3JvbGwgdmVydGljYWxseSlcXG4vLyAgICBldmVuIHdoZW4gdGhlaXIgc2Nyb2xsIGFjdGlvbiBzdGFydGVkIG9uIGEgY2Fyb3VzZWwsIGJ1dCBmb3IgY29tcGF0aWJpbGl0eSAod2l0aCBGaXJlZm94KVxcbi8vICAgIHdlJ3JlIHByZXZlbnRpbmcgYWxsIGFjdGlvbnMgaW5zdGVhZFxcbi8vIDIuIFRoZSAuY2Fyb3VzZWwtaXRlbS1zdGFydCBhbmQgLmNhcm91c2VsLWl0ZW0tZW5kIGlzIHVzZWQgdG8gaW5kaWNhdGUgd2hlcmVcXG4vLyAgICB0aGUgYWN0aXZlIHNsaWRlIGlzIGhlYWRpbmcuXFxuLy8gMy4gLmFjdGl2ZS5jYXJvdXNlbC1pdGVtIGlzIHRoZSBjdXJyZW50IHNsaWRlLlxcbi8vIDQuIC5hY3RpdmUuY2Fyb3VzZWwtaXRlbS1zdGFydCBhbmQgLmFjdGl2ZS5jYXJvdXNlbC1pdGVtLWVuZCBpcyB0aGUgY3VycmVudFxcbi8vICAgIHNsaWRlIGluIGl0cyBpbi10cmFuc2l0aW9uIHN0YXRlLiBPbmx5IG9uZSBvZiB0aGVzZSBvY2N1cnMgYXQgYSB0aW1lLlxcbi8vIDUuIC5jYXJvdXNlbC1pdGVtLW5leHQuY2Fyb3VzZWwtaXRlbS1zdGFydCBhbmQgLmNhcm91c2VsLWl0ZW0tcHJldi5jYXJvdXNlbC1pdGVtLWVuZFxcbi8vICAgIGlzIHRoZSB1cGNvbWluZyBzbGlkZSBpbiB0cmFuc2l0aW9uLlxcblxcbi5jYXJvdXNlbCB7XFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxufVxcblxcbi5jYXJvdXNlbC5wb2ludGVyLWV2ZW50IHtcXG4gIHRvdWNoLWFjdGlvbjogcGFuLXk7XFxufVxcblxcbi5jYXJvdXNlbC1pbm5lciB7XFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICB3aWR0aDogMTAwJTtcXG4gIG92ZXJmbG93OiBoaWRkZW47XFxuICBAaW5jbHVkZSBjbGVhcmZpeCgpO1xcbn1cXG5cXG4uY2Fyb3VzZWwtaXRlbSB7XFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICBkaXNwbGF5OiBub25lO1xcbiAgZmxvYXQ6IGxlZnQ7XFxuICB3aWR0aDogMTAwJTtcXG4gIG1hcmdpbi1yaWdodDogLTEwMCU7XFxuICBiYWNrZmFjZS12aXNpYmlsaXR5OiBoaWRkZW47XFxuICBAaW5jbHVkZSB0cmFuc2l0aW9uKCRjYXJvdXNlbC10cmFuc2l0aW9uKTtcXG59XFxuXFxuLmNhcm91c2VsLWl0ZW0uYWN0aXZlLFxcbi5jYXJvdXNlbC1pdGVtLW5leHQsXFxuLmNhcm91c2VsLWl0ZW0tcHJldiB7XFxuICBkaXNwbGF5OiBibG9jaztcXG59XFxuXFxuLmNhcm91c2VsLWl0ZW0tbmV4dDpub3QoLmNhcm91c2VsLWl0ZW0tc3RhcnQpLFxcbi5hY3RpdmUuY2Fyb3VzZWwtaXRlbS1lbmQge1xcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDEwMCUpO1xcbn1cXG5cXG4uY2Fyb3VzZWwtaXRlbS1wcmV2Om5vdCguY2Fyb3VzZWwtaXRlbS1lbmQpLFxcbi5hY3RpdmUuY2Fyb3VzZWwtaXRlbS1zdGFydCB7XFxuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTEwMCUpO1xcbn1cXG5cXG5cXG4vL1xcbi8vIEFsdGVybmF0ZSB0cmFuc2l0aW9uc1xcbi8vXFxuXFxuLmNhcm91c2VsLWZhZGUge1xcbiAgLmNhcm91c2VsLWl0ZW0ge1xcbiAgICBvcGFjaXR5OiAwO1xcbiAgICB0cmFuc2l0aW9uLXByb3BlcnR5OiBvcGFjaXR5O1xcbiAgICB0cmFuc2Zvcm06IG5vbmU7XFxuICB9XFxuXFxuICAuY2Fyb3VzZWwtaXRlbS5hY3RpdmUsXFxuICAuY2Fyb3VzZWwtaXRlbS1uZXh0LmNhcm91c2VsLWl0ZW0tc3RhcnQsXFxuICAuY2Fyb3VzZWwtaXRlbS1wcmV2LmNhcm91c2VsLWl0ZW0tZW5kIHtcXG4gICAgei1pbmRleDogMTtcXG4gICAgb3BhY2l0eTogMTtcXG4gIH1cXG5cXG4gIC5hY3RpdmUuY2Fyb3VzZWwtaXRlbS1zdGFydCxcXG4gIC5hY3RpdmUuY2Fyb3VzZWwtaXRlbS1lbmQge1xcbiAgICB6LWluZGV4OiAwO1xcbiAgICBvcGFjaXR5OiAwO1xcbiAgICBAaW5jbHVkZSB0cmFuc2l0aW9uKG9wYWNpdHkgMHMgJGNhcm91c2VsLXRyYW5zaXRpb24tZHVyYXRpb24pO1xcbiAgfVxcbn1cXG5cXG5cXG4vL1xcbi8vIExlZnQvcmlnaHQgY29udHJvbHMgZm9yIG5hdlxcbi8vXFxuXFxuLmNhcm91c2VsLWNvbnRyb2wtcHJldixcXG4uY2Fyb3VzZWwtY29udHJvbC1uZXh0IHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIHRvcDogMDtcXG4gIGJvdHRvbTogMDtcXG4gIHotaW5kZXg6IDE7XFxuICAvLyBVc2UgZmxleCBmb3IgYWxpZ25tZW50ICgxLTMpXFxuICBkaXNwbGF5OiBmbGV4OyAvLyAxLiBhbGxvdyBmbGV4IHN0eWxlc1xcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjsgLy8gMi4gdmVydGljYWxseSBjZW50ZXIgY29udGVudHNcXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyOyAvLyAzLiBob3Jpem9udGFsbHkgY2VudGVyIGNvbnRlbnRzXFxuICB3aWR0aDogJGNhcm91c2VsLWNvbnRyb2wtd2lkdGg7XFxuICBwYWRkaW5nOiAwO1xcbiAgY29sb3I6ICRjYXJvdXNlbC1jb250cm9sLWNvbG9yO1xcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbiAgYmFja2dyb3VuZDogbm9uZTtcXG4gIGJvcmRlcjogMDtcXG4gIG9wYWNpdHk6ICRjYXJvdXNlbC1jb250cm9sLW9wYWNpdHk7XFxuICBAaW5jbHVkZSB0cmFuc2l0aW9uKCRjYXJvdXNlbC1jb250cm9sLXRyYW5zaXRpb24pO1xcblxcbiAgLy8gSG92ZXIvZm9jdXMgc3RhdGVcXG4gICY6aG92ZXIsXFxuICAmOmZvY3VzIHtcXG4gICAgY29sb3I6ICRjYXJvdXNlbC1jb250cm9sLWNvbG9yO1xcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XFxuICAgIG91dGxpbmU6IDA7XFxuICAgIG9wYWNpdHk6ICRjYXJvdXNlbC1jb250cm9sLWhvdmVyLW9wYWNpdHk7XFxuICB9XFxufVxcbi5jYXJvdXNlbC1jb250cm9sLXByZXYge1xcbiAgbGVmdDogMDtcXG4gIGJhY2tncm91bmQtaW1hZ2U6IGlmKCRlbmFibGUtZ3JhZGllbnRzLCBsaW5lYXItZ3JhZGllbnQoOTBkZWcsIHJnYmEoJGJsYWNrLCAuMjUpLCByZ2JhKCRibGFjaywgLjAwMSkpLCBudWxsKTtcXG59XFxuLmNhcm91c2VsLWNvbnRyb2wtbmV4dCB7XFxuICByaWdodDogMDtcXG4gIGJhY2tncm91bmQtaW1hZ2U6IGlmKCRlbmFibGUtZ3JhZGllbnRzLCBsaW5lYXItZ3JhZGllbnQoMjcwZGVnLCByZ2JhKCRibGFjaywgLjI1KSwgcmdiYSgkYmxhY2ssIC4wMDEpKSwgbnVsbCk7XFxufVxcblxcbi8vIEljb25zIGZvciB3aXRoaW5cXG4uY2Fyb3VzZWwtY29udHJvbC1wcmV2LWljb24sXFxuLmNhcm91c2VsLWNvbnRyb2wtbmV4dC1pY29uIHtcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gIHdpZHRoOiAkY2Fyb3VzZWwtY29udHJvbC1pY29uLXdpZHRoO1xcbiAgaGVpZ2h0OiAkY2Fyb3VzZWwtY29udHJvbC1pY29uLXdpZHRoO1xcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcXG4gIGJhY2tncm91bmQtcG9zaXRpb246IDUwJTtcXG4gIGJhY2tncm91bmQtc2l6ZTogMTAwJSAxMDAlO1xcbn1cXG5cXG4vKiBydGw6b3B0aW9uczoge1xcbiAgXFxcImF1dG9SZW5hbWVcXFwiOiB0cnVlLFxcbiAgXFxcInN0cmluZ01hcFxcXCI6WyB7XFxuICAgIFxcXCJuYW1lXFxcIiAgICA6IFxcXCJwcmV2LW5leHRcXFwiLFxcbiAgICBcXFwic2VhcmNoXFxcIiAgOiBcXFwicHJldlxcXCIsXFxuICAgIFxcXCJyZXBsYWNlXFxcIiA6IFxcXCJuZXh0XFxcIlxcbiAgfSBdXFxufSAqL1xcbi5jYXJvdXNlbC1jb250cm9sLXByZXYtaWNvbiB7XFxuICBiYWNrZ3JvdW5kLWltYWdlOiBlc2NhcGUtc3ZnKCRjYXJvdXNlbC1jb250cm9sLXByZXYtaWNvbi1iZyk7XFxufVxcbi5jYXJvdXNlbC1jb250cm9sLW5leHQtaWNvbiB7XFxuICBiYWNrZ3JvdW5kLWltYWdlOiBlc2NhcGUtc3ZnKCRjYXJvdXNlbC1jb250cm9sLW5leHQtaWNvbi1iZyk7XFxufVxcblxcbi8vIE9wdGlvbmFsIGluZGljYXRvciBwaXBzL2NvbnRyb2xzXFxuLy9cXG4vLyBBZGQgYSBjb250YWluZXIgKHN1Y2ggYXMgYSBsaXN0KSB3aXRoIHRoZSBmb2xsb3dpbmcgY2xhc3MgYW5kIGFkZCBhbiBpdGVtIChpZGVhbGx5IGEgZm9jdXNhYmxlIGNvbnRyb2wsXFxuLy8gbGlrZSBhIGJ1dHRvbikgd2l0aCBkYXRhLWJzLXRhcmdldCBmb3IgZWFjaCBzbGlkZSB5b3VyIGNhcm91c2VsIGhvbGRzLlxcblxcbi5jYXJvdXNlbC1pbmRpY2F0b3JzIHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIHJpZ2h0OiAwO1xcbiAgYm90dG9tOiAwO1xcbiAgbGVmdDogMDtcXG4gIHotaW5kZXg6IDI7XFxuICBkaXNwbGF5OiBmbGV4O1xcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxuICBwYWRkaW5nOiAwO1xcbiAgLy8gVXNlIHRoZSAuY2Fyb3VzZWwtY29udHJvbCdzIHdpZHRoIGFzIG1hcmdpbiBzbyB3ZSBkb24ndCBvdmVybGF5IHRob3NlXFxuICBtYXJnaW4tcmlnaHQ6ICRjYXJvdXNlbC1jb250cm9sLXdpZHRoO1xcbiAgbWFyZ2luLWJvdHRvbTogMXJlbTtcXG4gIG1hcmdpbi1sZWZ0OiAkY2Fyb3VzZWwtY29udHJvbC13aWR0aDtcXG5cXG4gIFtkYXRhLWJzLXRhcmdldF0ge1xcbiAgICBib3gtc2l6aW5nOiBjb250ZW50LWJveDtcXG4gICAgZmxleDogMCAxIGF1dG87XFxuICAgIHdpZHRoOiAkY2Fyb3VzZWwtaW5kaWNhdG9yLXdpZHRoO1xcbiAgICBoZWlnaHQ6ICRjYXJvdXNlbC1pbmRpY2F0b3ItaGVpZ2h0O1xcbiAgICBwYWRkaW5nOiAwO1xcbiAgICBtYXJnaW4tcmlnaHQ6ICRjYXJvdXNlbC1pbmRpY2F0b3Itc3BhY2VyO1xcbiAgICBtYXJnaW4tbGVmdDogJGNhcm91c2VsLWluZGljYXRvci1zcGFjZXI7XFxuICAgIHRleHQtaW5kZW50OiAtOTk5cHg7XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogJGNhcm91c2VsLWluZGljYXRvci1hY3RpdmUtYmc7XFxuICAgIGJhY2tncm91bmQtY2xpcDogcGFkZGluZy1ib3g7XFxuICAgIGJvcmRlcjogMDtcXG4gICAgLy8gVXNlIHRyYW5zcGFyZW50IGJvcmRlcnMgdG8gaW5jcmVhc2UgdGhlIGhpdCBhcmVhIGJ5IDEwcHggb24gdG9wIGFuZCBib3R0b20uXFxuICAgIGJvcmRlci10b3A6ICRjYXJvdXNlbC1pbmRpY2F0b3ItaGl0LWFyZWEtaGVpZ2h0IHNvbGlkIHRyYW5zcGFyZW50O1xcbiAgICBib3JkZXItYm90dG9tOiAkY2Fyb3VzZWwtaW5kaWNhdG9yLWhpdC1hcmVhLWhlaWdodCBzb2xpZCB0cmFuc3BhcmVudDtcXG4gICAgb3BhY2l0eTogJGNhcm91c2VsLWluZGljYXRvci1vcGFjaXR5O1xcbiAgICBAaW5jbHVkZSB0cmFuc2l0aW9uKCRjYXJvdXNlbC1pbmRpY2F0b3ItdHJhbnNpdGlvbik7XFxuICB9XFxuXFxuICAuYWN0aXZlIHtcXG4gICAgb3BhY2l0eTogJGNhcm91c2VsLWluZGljYXRvci1hY3RpdmUtb3BhY2l0eTtcXG4gIH1cXG59XFxuXFxuXFxuLy8gT3B0aW9uYWwgY2FwdGlvbnNcXG4vL1xcbi8vXFxuXFxuLmNhcm91c2VsLWNhcHRpb24ge1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgcmlnaHQ6ICgxMDAlIC0gJGNhcm91c2VsLWNhcHRpb24td2lkdGgpICogLjU7XFxuICBib3R0b206ICRjYXJvdXNlbC1jYXB0aW9uLXNwYWNlcjtcXG4gIGxlZnQ6ICgxMDAlIC0gJGNhcm91c2VsLWNhcHRpb24td2lkdGgpICogLjU7XFxuICBwYWRkaW5nLXRvcDogJGNhcm91c2VsLWNhcHRpb24tcGFkZGluZy15O1xcbiAgcGFkZGluZy1ib3R0b206ICRjYXJvdXNlbC1jYXB0aW9uLXBhZGRpbmcteTtcXG4gIGNvbG9yOiAkY2Fyb3VzZWwtY2FwdGlvbi1jb2xvcjtcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG59XFxuXFxuLy8gRGFyayBtb2RlIGNhcm91c2VsXFxuXFxuQG1peGluIGNhcm91c2VsLWRhcmsoKSB7XFxuICAuY2Fyb3VzZWwtY29udHJvbC1wcmV2LWljb24sXFxuICAuY2Fyb3VzZWwtY29udHJvbC1uZXh0LWljb24ge1xcbiAgICBmaWx0ZXI6ICRjYXJvdXNlbC1kYXJrLWNvbnRyb2wtaWNvbi1maWx0ZXI7XFxuICB9XFxuXFxuICAuY2Fyb3VzZWwtaW5kaWNhdG9ycyBbZGF0YS1icy10YXJnZXRdIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogJGNhcm91c2VsLWRhcmstaW5kaWNhdG9yLWFjdGl2ZS1iZztcXG4gIH1cXG5cXG4gIC5jYXJvdXNlbC1jYXB0aW9uIHtcXG4gICAgY29sb3I6ICRjYXJvdXNlbC1kYXJrLWNhcHRpb24tY29sb3I7XFxuICB9XFxufVxcblxcbi5jYXJvdXNlbC1kYXJrIHtcXG4gIEBpbmNsdWRlIGNhcm91c2VsLWRhcmsoKTtcXG59XFxuXFxuQGlmICRlbmFibGUtZGFyay1tb2RlIHtcXG4gIEBpbmNsdWRlIGNvbG9yLW1vZGUoZGFyaykge1xcbiAgICBAaWYgJGNvbG9yLW1vZGUtdHlwZSA9PSBcXFwibWVkaWEtcXVlcnlcXFwiIHtcXG4gICAgICAuY2Fyb3VzZWwge1xcbiAgICAgICAgQGluY2x1ZGUgY2Fyb3VzZWwtZGFyaygpO1xcbiAgICAgIH1cXG4gICAgfSBAZWxzZSB7XFxuICAgICAgLmNhcm91c2VsLFxcbiAgICAgICYuY2Fyb3VzZWwge1xcbiAgICAgICAgQGluY2x1ZGUgY2Fyb3VzZWwtZGFyaygpO1xcbiAgICAgIH1cXG4gICAgfVxcbiAgfVxcbn1cXG5cIixcIi8vIHNjc3MtZG9jcy1zdGFydCBjbGVhcmZpeFxcbkBtaXhpbiBjbGVhcmZpeCgpIHtcXG4gICY6OmFmdGVyIHtcXG4gICAgZGlzcGxheTogYmxvY2s7XFxuICAgIGNsZWFyOiBib3RoO1xcbiAgICBjb250ZW50OiBcXFwiXFxcIjtcXG4gIH1cXG59XFxuLy8gc2Nzcy1kb2NzLWVuZCBjbGVhcmZpeFxcblwiLFwiLy9cXG4vLyBSb3RhdGluZyBib3JkZXJcXG4vL1xcblxcbi5zcGlubmVyLWdyb3csXFxuLnNwaW5uZXItYm9yZGVyIHtcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gIHdpZHRoOiB2YXIoLS0jeyRwcmVmaXh9c3Bpbm5lci13aWR0aCk7XFxuICBoZWlnaHQ6IHZhcigtLSN7JHByZWZpeH1zcGlubmVyLWhlaWdodCk7XFxuICB2ZXJ0aWNhbC1hbGlnbjogdmFyKC0tI3skcHJlZml4fXNwaW5uZXItdmVydGljYWwtYWxpZ24pO1xcbiAgLy8gc3R5bGVsaW50LWRpc2FibGUtbmV4dC1saW5lIHByb3BlcnR5LWRpc2FsbG93ZWQtbGlzdFxcbiAgYm9yZGVyLXJhZGl1czogNTAlO1xcbiAgYW5pbWF0aW9uOiB2YXIoLS0jeyRwcmVmaXh9c3Bpbm5lci1hbmltYXRpb24tc3BlZWQpIGxpbmVhciBpbmZpbml0ZSB2YXIoLS0jeyRwcmVmaXh9c3Bpbm5lci1hbmltYXRpb24tbmFtZSk7XFxufVxcblxcbi8vIHNjc3MtZG9jcy1zdGFydCBzcGlubmVyLWJvcmRlci1rZXlmcmFtZXNcXG5Aa2V5ZnJhbWVzIHNwaW5uZXItYm9yZGVyIHtcXG4gIHRvIHsgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKSAje1xcXCIvKiBydGw6aWdub3JlICovXFxcIn07IH1cXG59XFxuLy8gc2Nzcy1kb2NzLWVuZCBzcGlubmVyLWJvcmRlci1rZXlmcmFtZXNcXG5cXG4uc3Bpbm5lci1ib3JkZXIge1xcbiAgLy8gc2Nzcy1kb2NzLXN0YXJ0IHNwaW5uZXItYm9yZGVyLWNzcy12YXJzXFxuICAtLSN7JHByZWZpeH1zcGlubmVyLXdpZHRoOiAjeyRzcGlubmVyLXdpZHRofTtcXG4gIC0tI3skcHJlZml4fXNwaW5uZXItaGVpZ2h0OiAjeyRzcGlubmVyLWhlaWdodH07XFxuICAtLSN7JHByZWZpeH1zcGlubmVyLXZlcnRpY2FsLWFsaWduOiAjeyRzcGlubmVyLXZlcnRpY2FsLWFsaWdufTtcXG4gIC0tI3skcHJlZml4fXNwaW5uZXItYm9yZGVyLXdpZHRoOiAjeyRzcGlubmVyLWJvcmRlci13aWR0aH07XFxuICAtLSN7JHByZWZpeH1zcGlubmVyLWFuaW1hdGlvbi1zcGVlZDogI3skc3Bpbm5lci1hbmltYXRpb24tc3BlZWR9O1xcbiAgLS0jeyRwcmVmaXh9c3Bpbm5lci1hbmltYXRpb24tbmFtZTogc3Bpbm5lci1ib3JkZXI7XFxuICAvLyBzY3NzLWRvY3MtZW5kIHNwaW5uZXItYm9yZGVyLWNzcy12YXJzXFxuXFxuICBib3JkZXI6IHZhcigtLSN7JHByZWZpeH1zcGlubmVyLWJvcmRlci13aWR0aCkgc29saWQgY3VycmVudGNvbG9yO1xcbiAgYm9yZGVyLXJpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDtcXG59XFxuXFxuLnNwaW5uZXItYm9yZGVyLXNtIHtcXG4gIC8vIHNjc3MtZG9jcy1zdGFydCBzcGlubmVyLWJvcmRlci1zbS1jc3MtdmFyc1xcbiAgLS0jeyRwcmVmaXh9c3Bpbm5lci13aWR0aDogI3skc3Bpbm5lci13aWR0aC1zbX07XFxuICAtLSN7JHByZWZpeH1zcGlubmVyLWhlaWdodDogI3skc3Bpbm5lci1oZWlnaHQtc219O1xcbiAgLS0jeyRwcmVmaXh9c3Bpbm5lci1ib3JkZXItd2lkdGg6ICN7JHNwaW5uZXItYm9yZGVyLXdpZHRoLXNtfTtcXG4gIC8vIHNjc3MtZG9jcy1lbmQgc3Bpbm5lci1ib3JkZXItc20tY3NzLXZhcnNcXG59XFxuXFxuLy9cXG4vLyBHcm93aW5nIGNpcmNsZVxcbi8vXFxuXFxuLy8gc2Nzcy1kb2NzLXN0YXJ0IHNwaW5uZXItZ3Jvdy1rZXlmcmFtZXNcXG5Aa2V5ZnJhbWVzIHNwaW5uZXItZ3JvdyB7XFxuICAwJSB7XFxuICAgIHRyYW5zZm9ybTogc2NhbGUoMCk7XFxuICB9XFxuICA1MCUge1xcbiAgICBvcGFjaXR5OiAxO1xcbiAgICB0cmFuc2Zvcm06IG5vbmU7XFxuICB9XFxufVxcbi8vIHNjc3MtZG9jcy1lbmQgc3Bpbm5lci1ncm93LWtleWZyYW1lc1xcblxcbi5zcGlubmVyLWdyb3cge1xcbiAgLy8gc2Nzcy1kb2NzLXN0YXJ0IHNwaW5uZXItZ3Jvdy1jc3MtdmFyc1xcbiAgLS0jeyRwcmVmaXh9c3Bpbm5lci13aWR0aDogI3skc3Bpbm5lci13aWR0aH07XFxuICAtLSN7JHByZWZpeH1zcGlubmVyLWhlaWdodDogI3skc3Bpbm5lci1oZWlnaHR9O1xcbiAgLS0jeyRwcmVmaXh9c3Bpbm5lci12ZXJ0aWNhbC1hbGlnbjogI3skc3Bpbm5lci12ZXJ0aWNhbC1hbGlnbn07XFxuICAtLSN7JHByZWZpeH1zcGlubmVyLWFuaW1hdGlvbi1zcGVlZDogI3skc3Bpbm5lci1hbmltYXRpb24tc3BlZWR9O1xcbiAgLS0jeyRwcmVmaXh9c3Bpbm5lci1hbmltYXRpb24tbmFtZTogc3Bpbm5lci1ncm93O1xcbiAgLy8gc2Nzcy1kb2NzLWVuZCBzcGlubmVyLWdyb3ctY3NzLXZhcnNcXG5cXG4gIGJhY2tncm91bmQtY29sb3I6IGN1cnJlbnRjb2xvcjtcXG4gIG9wYWNpdHk6IDA7XFxufVxcblxcbi5zcGlubmVyLWdyb3ctc20ge1xcbiAgLS0jeyRwcmVmaXh9c3Bpbm5lci13aWR0aDogI3skc3Bpbm5lci13aWR0aC1zbX07XFxuICAtLSN7JHByZWZpeH1zcGlubmVyLWhlaWdodDogI3skc3Bpbm5lci1oZWlnaHQtc219O1xcbn1cXG5cXG5AaWYgJGVuYWJsZS1yZWR1Y2VkLW1vdGlvbiB7XFxuICBAbWVkaWEgKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZSkge1xcbiAgICAuc3Bpbm5lci1ib3JkZXIsXFxuICAgIC5zcGlubmVyLWdyb3cge1xcbiAgICAgIC0tI3skcHJlZml4fXNwaW5uZXItYW5pbWF0aW9uLXNwZWVkOiAjeyRzcGlubmVyLWFuaW1hdGlvbi1zcGVlZCAqIDJ9O1xcbiAgICB9XFxuICB9XFxufVxcblwiLFwiLy8gc3R5bGVsaW50LWRpc2FibGUgZnVuY3Rpb24tZGlzYWxsb3dlZC1saXN0XFxuXFxuJW9mZmNhbnZhcy1jc3MtdmFycyB7XFxuICAvLyBzY3NzLWRvY3Mtc3RhcnQgb2ZmY2FudmFzLWNzcy12YXJzXFxuICAtLSN7JHByZWZpeH1vZmZjYW52YXMtemluZGV4OiAjeyR6aW5kZXgtb2ZmY2FudmFzfTtcXG4gIC0tI3skcHJlZml4fW9mZmNhbnZhcy13aWR0aDogI3skb2ZmY2FudmFzLWhvcml6b250YWwtd2lkdGh9O1xcbiAgLS0jeyRwcmVmaXh9b2ZmY2FudmFzLWhlaWdodDogI3skb2ZmY2FudmFzLXZlcnRpY2FsLWhlaWdodH07XFxuICAtLSN7JHByZWZpeH1vZmZjYW52YXMtcGFkZGluZy14OiAjeyRvZmZjYW52YXMtcGFkZGluZy14fTtcXG4gIC0tI3skcHJlZml4fW9mZmNhbnZhcy1wYWRkaW5nLXk6ICN7JG9mZmNhbnZhcy1wYWRkaW5nLXl9O1xcbiAgLS0jeyRwcmVmaXh9b2ZmY2FudmFzLWNvbG9yOiAjeyRvZmZjYW52YXMtY29sb3J9O1xcbiAgLS0jeyRwcmVmaXh9b2ZmY2FudmFzLWJnOiAjeyRvZmZjYW52YXMtYmctY29sb3J9O1xcbiAgLS0jeyRwcmVmaXh9b2ZmY2FudmFzLWJvcmRlci13aWR0aDogI3skb2ZmY2FudmFzLWJvcmRlci13aWR0aH07XFxuICAtLSN7JHByZWZpeH1vZmZjYW52YXMtYm9yZGVyLWNvbG9yOiAjeyRvZmZjYW52YXMtYm9yZGVyLWNvbG9yfTtcXG4gIC0tI3skcHJlZml4fW9mZmNhbnZhcy1ib3gtc2hhZG93OiAjeyRvZmZjYW52YXMtYm94LXNoYWRvd307XFxuICAtLSN7JHByZWZpeH1vZmZjYW52YXMtdHJhbnNpdGlvbjogI3t0cmFuc2Zvcm0gJG9mZmNhbnZhcy10cmFuc2l0aW9uLWR1cmF0aW9uIGVhc2UtaW4tb3V0fTtcXG4gIC0tI3skcHJlZml4fW9mZmNhbnZhcy10aXRsZS1saW5lLWhlaWdodDogI3skb2ZmY2FudmFzLXRpdGxlLWxpbmUtaGVpZ2h0fTtcXG4gIC8vIHNjc3MtZG9jcy1lbmQgb2ZmY2FudmFzLWNzcy12YXJzXFxufVxcblxcbkBlYWNoICRicmVha3BvaW50IGluIG1hcC1rZXlzKCRncmlkLWJyZWFrcG9pbnRzKSB7XFxuICAkbmV4dDogYnJlYWtwb2ludC1uZXh0KCRicmVha3BvaW50LCAkZ3JpZC1icmVha3BvaW50cyk7XFxuICAkaW5maXg6IGJyZWFrcG9pbnQtaW5maXgoJG5leHQsICRncmlkLWJyZWFrcG9pbnRzKTtcXG5cXG4gIC5vZmZjYW52YXMjeyRpbmZpeH0ge1xcbiAgICBAZXh0ZW5kICVvZmZjYW52YXMtY3NzLXZhcnM7XFxuICB9XFxufVxcblxcbkBlYWNoICRicmVha3BvaW50IGluIG1hcC1rZXlzKCRncmlkLWJyZWFrcG9pbnRzKSB7XFxuICAkbmV4dDogYnJlYWtwb2ludC1uZXh0KCRicmVha3BvaW50LCAkZ3JpZC1icmVha3BvaW50cyk7XFxuICAkaW5maXg6IGJyZWFrcG9pbnQtaW5maXgoJG5leHQsICRncmlkLWJyZWFrcG9pbnRzKTtcXG5cXG4gIC5vZmZjYW52YXMjeyRpbmZpeH0ge1xcbiAgICBAaW5jbHVkZSBtZWRpYS1icmVha3BvaW50LWRvd24oJG5leHQpIHtcXG4gICAgICBwb3NpdGlvbjogZml4ZWQ7XFxuICAgICAgYm90dG9tOiAwO1xcbiAgICAgIHotaW5kZXg6IHZhcigtLSN7JHByZWZpeH1vZmZjYW52YXMtemluZGV4KTtcXG4gICAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XFxuICAgICAgbWF4LXdpZHRoOiAxMDAlO1xcbiAgICAgIGNvbG9yOiB2YXIoLS0jeyRwcmVmaXh9b2ZmY2FudmFzLWNvbG9yKTtcXG4gICAgICB2aXNpYmlsaXR5OiBoaWRkZW47XFxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tI3skcHJlZml4fW9mZmNhbnZhcy1iZyk7XFxuICAgICAgYmFja2dyb3VuZC1jbGlwOiBwYWRkaW5nLWJveDtcXG4gICAgICBvdXRsaW5lOiAwO1xcbiAgICAgIEBpbmNsdWRlIGJveC1zaGFkb3codmFyKC0tI3skcHJlZml4fW9mZmNhbnZhcy1ib3gtc2hhZG93KSk7XFxuICAgICAgQGluY2x1ZGUgdHJhbnNpdGlvbih2YXIoLS0jeyRwcmVmaXh9b2ZmY2FudmFzLXRyYW5zaXRpb24pKTtcXG5cXG4gICAgICAmLm9mZmNhbnZhcy1zdGFydCB7XFxuICAgICAgICB0b3A6IDA7XFxuICAgICAgICBsZWZ0OiAwO1xcbiAgICAgICAgd2lkdGg6IHZhcigtLSN7JHByZWZpeH1vZmZjYW52YXMtd2lkdGgpO1xcbiAgICAgICAgYm9yZGVyLXJpZ2h0OiB2YXIoLS0jeyRwcmVmaXh9b2ZmY2FudmFzLWJvcmRlci13aWR0aCkgc29saWQgdmFyKC0tI3skcHJlZml4fW9mZmNhbnZhcy1ib3JkZXItY29sb3IpO1xcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0xMDAlKTtcXG4gICAgICB9XFxuXFxuICAgICAgJi5vZmZjYW52YXMtZW5kIHtcXG4gICAgICAgIHRvcDogMDtcXG4gICAgICAgIHJpZ2h0OiAwO1xcbiAgICAgICAgd2lkdGg6IHZhcigtLSN7JHByZWZpeH1vZmZjYW52YXMtd2lkdGgpO1xcbiAgICAgICAgYm9yZGVyLWxlZnQ6IHZhcigtLSN7JHByZWZpeH1vZmZjYW52YXMtYm9yZGVyLXdpZHRoKSBzb2xpZCB2YXIoLS0jeyRwcmVmaXh9b2ZmY2FudmFzLWJvcmRlci1jb2xvcik7XFxuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMTAwJSk7XFxuICAgICAgfVxcblxcbiAgICAgICYub2ZmY2FudmFzLXRvcCB7XFxuICAgICAgICB0b3A6IDA7XFxuICAgICAgICByaWdodDogMDtcXG4gICAgICAgIGxlZnQ6IDA7XFxuICAgICAgICBoZWlnaHQ6IHZhcigtLSN7JHByZWZpeH1vZmZjYW52YXMtaGVpZ2h0KTtcXG4gICAgICAgIG1heC1oZWlnaHQ6IDEwMCU7XFxuICAgICAgICBib3JkZXItYm90dG9tOiB2YXIoLS0jeyRwcmVmaXh9b2ZmY2FudmFzLWJvcmRlci13aWR0aCkgc29saWQgdmFyKC0tI3skcHJlZml4fW9mZmNhbnZhcy1ib3JkZXItY29sb3IpO1xcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xMDAlKTtcXG4gICAgICB9XFxuXFxuICAgICAgJi5vZmZjYW52YXMtYm90dG9tIHtcXG4gICAgICAgIHJpZ2h0OiAwO1xcbiAgICAgICAgbGVmdDogMDtcXG4gICAgICAgIGhlaWdodDogdmFyKC0tI3skcHJlZml4fW9mZmNhbnZhcy1oZWlnaHQpO1xcbiAgICAgICAgbWF4LWhlaWdodDogMTAwJTtcXG4gICAgICAgIGJvcmRlci10b3A6IHZhcigtLSN7JHByZWZpeH1vZmZjYW52YXMtYm9yZGVyLXdpZHRoKSBzb2xpZCB2YXIoLS0jeyRwcmVmaXh9b2ZmY2FudmFzLWJvcmRlci1jb2xvcik7XFxuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMTAwJSk7XFxuICAgICAgfVxcblxcbiAgICAgICYuc2hvd2luZyxcXG4gICAgICAmLnNob3c6bm90KC5oaWRpbmcpIHtcXG4gICAgICAgIHRyYW5zZm9ybTogbm9uZTtcXG4gICAgICB9XFxuXFxuICAgICAgJi5zaG93aW5nLFxcbiAgICAgICYuaGlkaW5nLFxcbiAgICAgICYuc2hvdyB7XFxuICAgICAgICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xcbiAgICAgIH1cXG4gICAgfVxcblxcbiAgICBAaWYgbm90ICgkaW5maXggPT0gXFxcIlxcXCIpIHtcXG4gICAgICBAaW5jbHVkZSBtZWRpYS1icmVha3BvaW50LXVwKCRuZXh0KSB7XFxuICAgICAgICAtLSN7JHByZWZpeH1vZmZjYW52YXMtaGVpZ2h0OiBhdXRvO1xcbiAgICAgICAgLS0jeyRwcmVmaXh9b2ZmY2FudmFzLWJvcmRlci13aWR0aDogMDtcXG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7IC8vIHN0eWxlbGludC1kaXNhYmxlLWxpbmUgZGVjbGFyYXRpb24tbm8taW1wb3J0YW50XFxuXFxuICAgICAgICAub2ZmY2FudmFzLWhlYWRlciB7XFxuICAgICAgICAgIGRpc3BsYXk6IG5vbmU7XFxuICAgICAgICB9XFxuXFxuICAgICAgICAub2ZmY2FudmFzLWJvZHkge1xcbiAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICAgICAgICBmbGV4LWdyb3c6IDA7XFxuICAgICAgICAgIHBhZGRpbmc6IDA7XFxuICAgICAgICAgIG92ZXJmbG93LXk6IHZpc2libGU7XFxuICAgICAgICAgIC8vIFJlc2V0IGBiYWNrZ3JvdW5kLWNvbG9yYCBpbiBjYXNlIGAuYmctKmAgY2xhc3NlcyBhcmUgdXNlZCBpbiBvZmZjYW52YXNcXG4gICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQgIWltcG9ydGFudDsgLy8gc3R5bGVsaW50LWRpc2FibGUtbGluZSBkZWNsYXJhdGlvbi1uby1pbXBvcnRhbnRcXG4gICAgICAgIH1cXG4gICAgICB9XFxuICAgIH1cXG4gIH1cXG59XFxuXFxuLm9mZmNhbnZhcy1iYWNrZHJvcCB7XFxuICBAaW5jbHVkZSBvdmVybGF5LWJhY2tkcm9wKCR6aW5kZXgtb2ZmY2FudmFzLWJhY2tkcm9wLCAkb2ZmY2FudmFzLWJhY2tkcm9wLWJnLCAkb2ZmY2FudmFzLWJhY2tkcm9wLW9wYWNpdHkpO1xcbn1cXG5cXG4ub2ZmY2FudmFzLWhlYWRlciB7XFxuICBkaXNwbGF5OiBmbGV4O1xcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcXG4gIHBhZGRpbmc6IHZhcigtLSN7JHByZWZpeH1vZmZjYW52YXMtcGFkZGluZy15KSB2YXIoLS0jeyRwcmVmaXh9b2ZmY2FudmFzLXBhZGRpbmcteCk7XFxuXFxuICAuYnRuLWNsb3NlIHtcXG4gICAgcGFkZGluZzogY2FsYyh2YXIoLS0jeyRwcmVmaXh9b2ZmY2FudmFzLXBhZGRpbmcteSkgKiAuNSkgY2FsYyh2YXIoLS0jeyRwcmVmaXh9b2ZmY2FudmFzLXBhZGRpbmcteCkgKiAuNSk7XFxuICAgIG1hcmdpbi10b3A6IGNhbGMoLS41ICogdmFyKC0tI3skcHJlZml4fW9mZmNhbnZhcy1wYWRkaW5nLXkpKTtcXG4gICAgbWFyZ2luLXJpZ2h0OiBjYWxjKC0uNSAqIHZhcigtLSN7JHByZWZpeH1vZmZjYW52YXMtcGFkZGluZy14KSk7XFxuICAgIG1hcmdpbi1ib3R0b206IGNhbGMoLS41ICogdmFyKC0tI3skcHJlZml4fW9mZmNhbnZhcy1wYWRkaW5nLXkpKTtcXG4gIH1cXG59XFxuXFxuLm9mZmNhbnZhcy10aXRsZSB7XFxuICBtYXJnaW4tYm90dG9tOiAwO1xcbiAgbGluZS1oZWlnaHQ6IHZhcigtLSN7JHByZWZpeH1vZmZjYW52YXMtdGl0bGUtbGluZS1oZWlnaHQpO1xcbn1cXG5cXG4ub2ZmY2FudmFzLWJvZHkge1xcbiAgZmxleC1ncm93OiAxO1xcbiAgcGFkZGluZzogdmFyKC0tI3skcHJlZml4fW9mZmNhbnZhcy1wYWRkaW5nLXkpIHZhcigtLSN7JHByZWZpeH1vZmZjYW52YXMtcGFkZGluZy14KTtcXG4gIG92ZXJmbG93LXk6IGF1dG87XFxufVxcblwiLFwiLnBsYWNlaG9sZGVyIHtcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gIG1pbi1oZWlnaHQ6IDFlbTtcXG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxuICBjdXJzb3I6IHdhaXQ7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiBjdXJyZW50Y29sb3I7XFxuICBvcGFjaXR5OiAkcGxhY2Vob2xkZXItb3BhY2l0eS1tYXg7XFxuXFxuICAmLmJ0bjo6YmVmb3JlIHtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgICBjb250ZW50OiBcXFwiXFxcIjtcXG4gIH1cXG59XFxuXFxuLy8gU2l6aW5nXFxuLnBsYWNlaG9sZGVyLXhzIHtcXG4gIG1pbi1oZWlnaHQ6IC42ZW07XFxufVxcblxcbi5wbGFjZWhvbGRlci1zbSB7XFxuICBtaW4taGVpZ2h0OiAuOGVtO1xcbn1cXG5cXG4ucGxhY2Vob2xkZXItbGcge1xcbiAgbWluLWhlaWdodDogMS4yZW07XFxufVxcblxcbi8vIEFuaW1hdGlvblxcbi5wbGFjZWhvbGRlci1nbG93IHtcXG4gIC5wbGFjZWhvbGRlciB7XFxuICAgIGFuaW1hdGlvbjogcGxhY2Vob2xkZXItZ2xvdyAycyBlYXNlLWluLW91dCBpbmZpbml0ZTtcXG4gIH1cXG59XFxuXFxuQGtleWZyYW1lcyBwbGFjZWhvbGRlci1nbG93IHtcXG4gIDUwJSB7XFxuICAgIG9wYWNpdHk6ICRwbGFjZWhvbGRlci1vcGFjaXR5LW1pbjtcXG4gIH1cXG59XFxuXFxuLnBsYWNlaG9sZGVyLXdhdmUge1xcbiAgbWFzay1pbWFnZTogbGluZWFyLWdyYWRpZW50KDEzMGRlZywgJGJsYWNrIDU1JSwgcmdiYSgwLCAwLCAwLCAoMSAtICRwbGFjZWhvbGRlci1vcGFjaXR5LW1pbikpIDc1JSwgJGJsYWNrIDk1JSk7XFxuICBtYXNrLXNpemU6IDIwMCUgMTAwJTtcXG4gIGFuaW1hdGlvbjogcGxhY2Vob2xkZXItd2F2ZSAycyBsaW5lYXIgaW5maW5pdGU7XFxufVxcblxcbkBrZXlmcmFtZXMgcGxhY2Vob2xkZXItd2F2ZSB7XFxuICAxMDAlIHtcXG4gICAgbWFzay1wb3NpdGlvbjogLTIwMCUgMCU7XFxuICB9XFxufVxcblwiLFwiLy8gQWxsLWNhcHMgYFJHQkEoKWAgZnVuY3Rpb24gdXNlZCBiZWNhdXNlIG9mIHRoaXMgU2FzcyBidWc6IGh0dHBzOi8vZ2l0aHViLmNvbS9zYXNzL25vZGUtc2Fzcy9pc3N1ZXMvMjI1MVxcbkBlYWNoICRjb2xvciwgJHZhbHVlIGluICR0aGVtZS1jb2xvcnMge1xcbiAgLnRleHQtYmctI3skY29sb3J9IHtcXG4gICAgY29sb3I6IGNvbG9yLWNvbnRyYXN0KCR2YWx1ZSkgaWYoJGVuYWJsZS1pbXBvcnRhbnQtdXRpbGl0aWVzLCAhaW1wb3J0YW50LCBudWxsKTtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogUkdCQSh2YXIoLS0jeyRwcmVmaXh9I3skY29sb3J9LXJnYiksIHZhcigtLSN7JHByZWZpeH1iZy1vcGFjaXR5LCAxKSkgaWYoJGVuYWJsZS1pbXBvcnRhbnQtdXRpbGl0aWVzLCAhaW1wb3J0YW50LCBudWxsKTtcXG4gIH1cXG59XFxuXCIsXCIvLyBBbGwtY2FwcyBgUkdCQSgpYCBmdW5jdGlvbiB1c2VkIGJlY2F1c2Ugb2YgdGhpcyBTYXNzIGJ1ZzogaHR0cHM6Ly9naXRodWIuY29tL3Nhc3Mvbm9kZS1zYXNzL2lzc3Vlcy8yMjUxXFxuQGVhY2ggJGNvbG9yLCAkdmFsdWUgaW4gJHRoZW1lLWNvbG9ycyB7XFxuICAubGluay0jeyRjb2xvcn0ge1xcbiAgICBjb2xvcjogUkdCQSh2YXIoLS0jeyRwcmVmaXh9I3skY29sb3J9LXJnYiksIHZhcigtLSN7JHByZWZpeH1saW5rLW9wYWNpdHksIDEpKSBpZigkZW5hYmxlLWltcG9ydGFudC11dGlsaXRpZXMsICFpbXBvcnRhbnQsIG51bGwpO1xcbiAgICB0ZXh0LWRlY29yYXRpb24tY29sb3I6IFJHQkEodmFyKC0tI3skcHJlZml4fSN7JGNvbG9yfS1yZ2IpLCB2YXIoLS0jeyRwcmVmaXh9bGluay11bmRlcmxpbmUtb3BhY2l0eSwgMSkpIGlmKCRlbmFibGUtaW1wb3J0YW50LXV0aWxpdGllcywgIWltcG9ydGFudCwgbnVsbCk7XFxuXFxuICAgIEBpZiAkbGluay1zaGFkZS1wZXJjZW50YWdlICE9IDAge1xcbiAgICAgICY6aG92ZXIsXFxuICAgICAgJjpmb2N1cyB7XFxuICAgICAgICAkaG92ZXItY29sb3I6IGlmKGNvbG9yLWNvbnRyYXN0KCR2YWx1ZSkgPT0gJGNvbG9yLWNvbnRyYXN0LWxpZ2h0LCBzaGFkZS1jb2xvcigkdmFsdWUsICRsaW5rLXNoYWRlLXBlcmNlbnRhZ2UpLCB0aW50LWNvbG9yKCR2YWx1ZSwgJGxpbmstc2hhZGUtcGVyY2VudGFnZSkpO1xcbiAgICAgICAgY29sb3I6IFJHQkEoI3t0by1yZ2IoJGhvdmVyLWNvbG9yKX0sIHZhcigtLSN7JHByZWZpeH1saW5rLW9wYWNpdHksIDEpKSBpZigkZW5hYmxlLWltcG9ydGFudC11dGlsaXRpZXMsICFpbXBvcnRhbnQsIG51bGwpO1xcbiAgICAgICAgdGV4dC1kZWNvcmF0aW9uLWNvbG9yOiBSR0JBKHRvLXJnYigkaG92ZXItY29sb3IpLCB2YXIoLS0jeyRwcmVmaXh9bGluay11bmRlcmxpbmUtb3BhY2l0eSwgMSkpIGlmKCRlbmFibGUtaW1wb3J0YW50LXV0aWxpdGllcywgIWltcG9ydGFudCwgbnVsbCk7XFxuICAgICAgfVxcbiAgICB9XFxuICB9XFxufVxcblxcbi8vIE9uZS1vZmYgc3BlY2lhbCBsaW5rIGhlbHBlciBhcyBhIGJyaWRnZSB1bnRpbCB2Nlxcbi5saW5rLWJvZHktZW1waGFzaXMge1xcbiAgY29sb3I6IFJHQkEodmFyKC0tI3skcHJlZml4fWVtcGhhc2lzLWNvbG9yLXJnYiksIHZhcigtLSN7JHByZWZpeH1saW5rLW9wYWNpdHksIDEpKSBpZigkZW5hYmxlLWltcG9ydGFudC11dGlsaXRpZXMsICFpbXBvcnRhbnQsIG51bGwpO1xcbiAgdGV4dC1kZWNvcmF0aW9uLWNvbG9yOiBSR0JBKHZhcigtLSN7JHByZWZpeH1lbXBoYXNpcy1jb2xvci1yZ2IpLCB2YXIoLS0jeyRwcmVmaXh9bGluay11bmRlcmxpbmUtb3BhY2l0eSwgMSkpIGlmKCRlbmFibGUtaW1wb3J0YW50LXV0aWxpdGllcywgIWltcG9ydGFudCwgbnVsbCk7XFxuXFxuICBAaWYgJGxpbmstc2hhZGUtcGVyY2VudGFnZSAhPSAwIHtcXG4gICAgJjpob3ZlcixcXG4gICAgJjpmb2N1cyB7XFxuICAgICAgY29sb3I6IFJHQkEodmFyKC0tI3skcHJlZml4fWVtcGhhc2lzLWNvbG9yLXJnYiksIHZhcigtLSN7JHByZWZpeH1saW5rLW9wYWNpdHksIC43NSkpIGlmKCRlbmFibGUtaW1wb3J0YW50LXV0aWxpdGllcywgIWltcG9ydGFudCwgbnVsbCk7XFxuICAgICAgdGV4dC1kZWNvcmF0aW9uLWNvbG9yOiBSR0JBKHZhcigtLSN7JHByZWZpeH1lbXBoYXNpcy1jb2xvci1yZ2IpLCB2YXIoLS0jeyRwcmVmaXh9bGluay11bmRlcmxpbmUtb3BhY2l0eSwgLjc1KSkgaWYoJGVuYWJsZS1pbXBvcnRhbnQtdXRpbGl0aWVzLCAhaW1wb3J0YW50LCBudWxsKTtcXG4gICAgfVxcbiAgfVxcbn1cXG5cIixcIi5mb2N1cy1yaW5nOmZvY3VzIHtcXG4gIG91dGxpbmU6IDA7XFxuICAvLyBCeSBkZWZhdWx0LCB0aGVyZSBpcyBubyBgLS1icy1mb2N1cy1yaW5nLXhgLCBgLS1icy1mb2N1cy1yaW5nLXlgLCBvciBgLS1icy1mb2N1cy1yaW5nLWJsdXJgLCBidXQgd2UgcHJvdmlkZSBDU1MgdmFyaWFibGVzIHdpdGggZmFsbGJhY2tzIHRvIGluaXRpYWwgYDBgIHZhbHVlc1xcbiAgYm94LXNoYWRvdzogdmFyKC0tI3skcHJlZml4fWZvY3VzLXJpbmcteCwgMCkgdmFyKC0tI3skcHJlZml4fWZvY3VzLXJpbmcteSwgMCkgdmFyKC0tI3skcHJlZml4fWZvY3VzLXJpbmctYmx1ciwgMCkgdmFyKC0tI3skcHJlZml4fWZvY3VzLXJpbmctd2lkdGgpIHZhcigtLSN7JHByZWZpeH1mb2N1cy1yaW5nLWNvbG9yKTtcXG59XFxuXCIsXCIuaWNvbi1saW5rIHtcXG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xcbiAgZ2FwOiAkaWNvbi1saW5rLWdhcDtcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICB0ZXh0LWRlY29yYXRpb24tY29sb3I6IHJnYmEodmFyKC0tI3skcHJlZml4fWxpbmstY29sb3ItcmdiKSwgdmFyKC0tI3skcHJlZml4fWxpbmstb3BhY2l0eSwgLjUpKTtcXG4gIHRleHQtdW5kZXJsaW5lLW9mZnNldDogJGljb24tbGluay11bmRlcmxpbmUtb2Zmc2V0O1xcbiAgYmFja2ZhY2UtdmlzaWJpbGl0eTogaGlkZGVuO1xcblxcbiAgPiAuYmkge1xcbiAgICBmbGV4LXNocmluazogMDtcXG4gICAgd2lkdGg6ICRpY29uLWxpbmstaWNvbi1zaXplO1xcbiAgICBoZWlnaHQ6ICRpY29uLWxpbmstaWNvbi1zaXplO1xcbiAgICBmaWxsOiBjdXJyZW50Y29sb3I7XFxuICAgIEBpbmNsdWRlIHRyYW5zaXRpb24oJGljb24tbGluay1pY29uLXRyYW5zaXRpb24pO1xcbiAgfVxcbn1cXG5cXG4uaWNvbi1saW5rLWhvdmVyIHtcXG4gICY6aG92ZXIsXFxuICAmOmZvY3VzLXZpc2libGUge1xcbiAgICA+IC5iaSB7XFxuICAgICAgdHJhbnNmb3JtOiB2YXIoLS0jeyRwcmVmaXh9aWNvbi1saW5rLXRyYW5zZm9ybSwgJGljb24tbGluay1pY29uLXRyYW5zZm9ybSk7XFxuICAgIH1cXG4gIH1cXG59XFxuXCIsXCIvLyBDcmVkaXQ6IE5pY29sYXMgR2FsbGFnaGVyIGFuZCBTVUlUIENTUy5cXG5cXG4ucmF0aW8ge1xcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgd2lkdGg6IDEwMCU7XFxuXFxuICAmOjpiZWZvcmUge1xcbiAgICBkaXNwbGF5OiBibG9jaztcXG4gICAgcGFkZGluZy10b3A6IHZhcigtLSN7JHByZWZpeH1hc3BlY3QtcmF0aW8pO1xcbiAgICBjb250ZW50OiBcXFwiXFxcIjtcXG4gIH1cXG5cXG4gID4gKiB7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgdG9wOiAwO1xcbiAgICBsZWZ0OiAwO1xcbiAgICB3aWR0aDogMTAwJTtcXG4gICAgaGVpZ2h0OiAxMDAlO1xcbiAgfVxcbn1cXG5cXG5AZWFjaCAka2V5LCAkcmF0aW8gaW4gJGFzcGVjdC1yYXRpb3Mge1xcbiAgLnJhdGlvLSN7JGtleX0ge1xcbiAgICAtLSN7JHByZWZpeH1hc3BlY3QtcmF0aW86ICN7JHJhdGlvfTtcXG4gIH1cXG59XFxuXCIsXCIvLyBTaG9ydGhhbmRcXG5cXG4uZml4ZWQtdG9wIHtcXG4gIHBvc2l0aW9uOiBmaXhlZDtcXG4gIHRvcDogMDtcXG4gIHJpZ2h0OiAwO1xcbiAgbGVmdDogMDtcXG4gIHotaW5kZXg6ICR6aW5kZXgtZml4ZWQ7XFxufVxcblxcbi5maXhlZC1ib3R0b20ge1xcbiAgcG9zaXRpb246IGZpeGVkO1xcbiAgcmlnaHQ6IDA7XFxuICBib3R0b206IDA7XFxuICBsZWZ0OiAwO1xcbiAgei1pbmRleDogJHppbmRleC1maXhlZDtcXG59XFxuXFxuLy8gUmVzcG9uc2l2ZSBzdGlja3kgdG9wIGFuZCBib3R0b21cXG5AZWFjaCAkYnJlYWtwb2ludCBpbiBtYXAta2V5cygkZ3JpZC1icmVha3BvaW50cykge1xcbiAgQGluY2x1ZGUgbWVkaWEtYnJlYWtwb2ludC11cCgkYnJlYWtwb2ludCkge1xcbiAgICAkaW5maXg6IGJyZWFrcG9pbnQtaW5maXgoJGJyZWFrcG9pbnQsICRncmlkLWJyZWFrcG9pbnRzKTtcXG5cXG4gICAgLnN0aWNreSN7JGluZml4fS10b3Age1xcbiAgICAgIHBvc2l0aW9uOiBzdGlja3k7XFxuICAgICAgdG9wOiAwO1xcbiAgICAgIHotaW5kZXg6ICR6aW5kZXgtc3RpY2t5O1xcbiAgICB9XFxuXFxuICAgIC5zdGlja3kjeyRpbmZpeH0tYm90dG9tIHtcXG4gICAgICBwb3NpdGlvbjogc3RpY2t5O1xcbiAgICAgIGJvdHRvbTogMDtcXG4gICAgICB6LWluZGV4OiAkemluZGV4LXN0aWNreTtcXG4gICAgfVxcbiAgfVxcbn1cXG5cIixcIi8vIHNjc3MtZG9jcy1zdGFydCBzdGFja3NcXG4uaHN0YWNrIHtcXG4gIGRpc3BsYXk6IGZsZXg7XFxuICBmbGV4LWRpcmVjdGlvbjogcm93O1xcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gIGFsaWduLXNlbGY6IHN0cmV0Y2g7XFxufVxcblxcbi52c3RhY2sge1xcbiAgZGlzcGxheTogZmxleDtcXG4gIGZsZXg6IDEgMSBhdXRvO1xcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcXG4gIGFsaWduLXNlbGY6IHN0cmV0Y2g7XFxufVxcbi8vIHNjc3MtZG9jcy1lbmQgc3RhY2tzXFxuXCIsXCIvLyBzdHlsZWxpbnQtZGlzYWJsZSBkZWNsYXJhdGlvbi1uby1pbXBvcnRhbnRcXG5cXG4vLyBIaWRlIGNvbnRlbnQgdmlzdWFsbHkgd2hpbGUga2VlcGluZyBpdCBhY2Nlc3NpYmxlIHRvIGFzc2lzdGl2ZSB0ZWNobm9sb2dpZXNcXG4vL1xcbi8vIFNlZTogaHR0cHM6Ly93d3cuYTExeXByb2plY3QuY29tL3Bvc3RzLzIwMTMtMDEtMTEtaG93LXRvLWhpZGUtY29udGVudC9cXG4vLyBTZWU6IGh0dHBzOi8va2l0dHlnaXJhdWRlbC5jb20vMjAxNi8xMC8xMy9jc3MtaGlkZS1hbmQtc2Vlay9cXG5cXG5AbWl4aW4gdmlzdWFsbHktaGlkZGVuKCkge1xcbiAgd2lkdGg6IDFweCAhaW1wb3J0YW50O1xcbiAgaGVpZ2h0OiAxcHggIWltcG9ydGFudDtcXG4gIHBhZGRpbmc6IDAgIWltcG9ydGFudDtcXG4gIG1hcmdpbjogLTFweCAhaW1wb3J0YW50OyAvLyBGaXggZm9yIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9pc3N1ZXMvMjU2ODZcXG4gIG92ZXJmbG93OiBoaWRkZW4gIWltcG9ydGFudDtcXG4gIGNsaXA6IHJlY3QoMCwgMCwgMCwgMCkgIWltcG9ydGFudDtcXG4gIHdoaXRlLXNwYWNlOiBub3dyYXAgIWltcG9ydGFudDtcXG4gIGJvcmRlcjogMCAhaW1wb3J0YW50O1xcblxcbiAgLy8gRml4IGZvciBwb3NpdGlvbmVkIHRhYmxlIGNhcHRpb24gdGhhdCBjb3VsZCBiZWNvbWUgYW5vbnltb3VzIGNlbGxzXFxuICAmOm5vdChjYXB0aW9uKSB7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZSAhaW1wb3J0YW50O1xcbiAgfVxcbn1cXG5cXG4vLyBVc2UgdG8gb25seSBkaXNwbGF5IGNvbnRlbnQgd2hlbiBpdCdzIGZvY3VzZWQsIG9yIG9uZSBvZiBpdHMgY2hpbGQgZWxlbWVudHMgaXMgZm9jdXNlZFxcbi8vIChpLmUuIHdoZW4gZm9jdXMgaXMgd2l0aGluIHRoZSBlbGVtZW50L2NvbnRhaW5lciB0aGF0IHRoZSBjbGFzcyB3YXMgYXBwbGllZCB0bylcXG4vL1xcbi8vIFVzZWZ1bCBmb3IgXFxcIlNraXAgdG8gbWFpbiBjb250ZW50XFxcIiBsaW5rczsgc2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDEzL05PVEUtV0NBRzIwLVRFQ0hTLTIwMTMwOTA1L0cxXFxuXFxuQG1peGluIHZpc3VhbGx5LWhpZGRlbi1mb2N1c2FibGUoKSB7XFxuICAmOm5vdCg6Zm9jdXMpOm5vdCg6Zm9jdXMtd2l0aGluKSB7XFxuICAgIEBpbmNsdWRlIHZpc3VhbGx5LWhpZGRlbigpO1xcbiAgfVxcbn1cXG5cIixcIi8vXFxuLy8gU3RyZXRjaGVkIGxpbmtcXG4vL1xcblxcbi5zdHJldGNoZWQtbGluayB7XFxuICAmOjojeyRzdHJldGNoZWQtbGluay1wc2V1ZG8tZWxlbWVudH0ge1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIHRvcDogMDtcXG4gICAgcmlnaHQ6IDA7XFxuICAgIGJvdHRvbTogMDtcXG4gICAgbGVmdDogMDtcXG4gICAgei1pbmRleDogJHN0cmV0Y2hlZC1saW5rLXotaW5kZXg7XFxuICAgIGNvbnRlbnQ6IFxcXCJcXFwiO1xcbiAgfVxcbn1cXG5cIixcIi8vIFRleHQgdHJ1bmNhdGVcXG4vLyBSZXF1aXJlcyBpbmxpbmUtYmxvY2sgb3IgYmxvY2sgZm9yIHByb3BlciBzdHlsaW5nXFxuXFxuQG1peGluIHRleHQtdHJ1bmNhdGUoKSB7XFxuICBvdmVyZmxvdzogaGlkZGVuO1xcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XFxuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xcbn1cXG5cIixcIi8vXFxuLy8gVGV4dCB0cnVuY2F0aW9uXFxuLy9cXG5cXG4udGV4dC10cnVuY2F0ZSB7XFxuICBAaW5jbHVkZSB0ZXh0LXRydW5jYXRlKCk7XFxufVxcblwiLFwiLnZyIHtcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gIGFsaWduLXNlbGY6IHN0cmV0Y2g7XFxuICB3aWR0aDogJHZyLWJvcmRlci13aWR0aDtcXG4gIG1pbi1oZWlnaHQ6IDFlbTtcXG4gIGJhY2tncm91bmQtY29sb3I6IGN1cnJlbnRjb2xvcjtcXG4gIG9wYWNpdHk6ICRoci1vcGFjaXR5O1xcbn1cXG5cIixcIi8vIFV0aWxpdHkgZ2VuZXJhdG9yXFxuLy8gVXNlZCB0byBnZW5lcmF0ZSB1dGlsaXRpZXMgJiBwcmludCB1dGlsaXRpZXNcXG5AbWl4aW4gZ2VuZXJhdGUtdXRpbGl0eSgkdXRpbGl0eSwgJGluZml4OiBcXFwiXFxcIiwgJGlzLXJmcy1tZWRpYS1xdWVyeTogZmFsc2UpIHtcXG4gICR2YWx1ZXM6IG1hcC1nZXQoJHV0aWxpdHksIHZhbHVlcyk7XFxuXFxuICAvLyBJZiB0aGUgdmFsdWVzIGFyZSBhIGxpc3Qgb3Igc3RyaW5nLCBjb252ZXJ0IGl0IGludG8gYSBtYXBcXG4gIEBpZiB0eXBlLW9mKCR2YWx1ZXMpID09IFxcXCJzdHJpbmdcXFwiIG9yIHR5cGUtb2YobnRoKCR2YWx1ZXMsIDEpKSAhPSBcXFwibGlzdFxcXCIge1xcbiAgICAkdmFsdWVzOiB6aXAoJHZhbHVlcywgJHZhbHVlcyk7XFxuICB9XFxuXFxuICBAZWFjaCAka2V5LCAkdmFsdWUgaW4gJHZhbHVlcyB7XFxuICAgICRwcm9wZXJ0aWVzOiBtYXAtZ2V0KCR1dGlsaXR5LCBwcm9wZXJ0eSk7XFxuXFxuICAgIC8vIE11bHRpcGxlIHByb3BlcnRpZXMgYXJlIHBvc3NpYmxlLCBmb3IgZXhhbXBsZSB3aXRoIHZlcnRpY2FsIG9yIGhvcml6b250YWwgbWFyZ2lucyBvciBwYWRkaW5nc1xcbiAgICBAaWYgdHlwZS1vZigkcHJvcGVydGllcykgPT0gXFxcInN0cmluZ1xcXCIge1xcbiAgICAgICRwcm9wZXJ0aWVzOiBhcHBlbmQoKCksICRwcm9wZXJ0aWVzKTtcXG4gICAgfVxcblxcbiAgICAvLyBVc2UgY3VzdG9tIGNsYXNzIGlmIHByZXNlbnRcXG4gICAgJHByb3BlcnR5LWNsYXNzOiBpZihtYXAtaGFzLWtleSgkdXRpbGl0eSwgY2xhc3MpLCBtYXAtZ2V0KCR1dGlsaXR5LCBjbGFzcyksIG50aCgkcHJvcGVydGllcywgMSkpO1xcbiAgICAkcHJvcGVydHktY2xhc3M6IGlmKCRwcm9wZXJ0eS1jbGFzcyA9PSBudWxsLCBcXFwiXFxcIiwgJHByb3BlcnR5LWNsYXNzKTtcXG5cXG4gICAgLy8gVXNlIGN1c3RvbSBDU1MgdmFyaWFibGUgbmFtZSBpZiBwcmVzZW50LCBvdGhlcndpc2UgZGVmYXVsdCB0byBgY2xhc3NgXFxuICAgICRjc3MtdmFyaWFibGUtbmFtZTogaWYobWFwLWhhcy1rZXkoJHV0aWxpdHksIGNzcy12YXJpYWJsZS1uYW1lKSwgbWFwLWdldCgkdXRpbGl0eSwgY3NzLXZhcmlhYmxlLW5hbWUpLCBtYXAtZ2V0KCR1dGlsaXR5LCBjbGFzcykpO1xcblxcbiAgICAvLyBTdGF0ZSBwYXJhbXMgdG8gZ2VuZXJhdGUgcHNldWRvLWNsYXNzZXNcXG4gICAgJHN0YXRlOiBpZihtYXAtaGFzLWtleSgkdXRpbGl0eSwgc3RhdGUpLCBtYXAtZ2V0KCR1dGlsaXR5LCBzdGF0ZSksICgpKTtcXG5cXG4gICAgJGluZml4OiBpZigkcHJvcGVydHktY2xhc3MgPT0gXFxcIlxcXCIgYW5kIHN0ci1zbGljZSgkaW5maXgsIDEsIDEpID09IFxcXCItXFxcIiwgc3RyLXNsaWNlKCRpbmZpeCwgMiksICRpbmZpeCk7XFxuXFxuICAgIC8vIERvbid0IHByZWZpeCBpZiB2YWx1ZSBrZXkgaXMgbnVsbCAoZS5nLiB3aXRoIHNoYWRvdyBjbGFzcylcXG4gICAgJHByb3BlcnR5LWNsYXNzLW1vZGlmaWVyOiBpZigka2V5LCBpZigkcHJvcGVydHktY2xhc3MgPT0gXFxcIlxcXCIgYW5kICRpbmZpeCA9PSBcXFwiXFxcIiwgXFxcIlxcXCIsIFxcXCItXFxcIikgKyAka2V5LCBcXFwiXFxcIik7XFxuXFxuICAgIEBpZiBtYXAtZ2V0KCR1dGlsaXR5LCByZnMpIHtcXG4gICAgICAvLyBJbnNpZGUgdGhlIG1lZGlhIHF1ZXJ5XFxuICAgICAgQGlmICRpcy1yZnMtbWVkaWEtcXVlcnkge1xcbiAgICAgICAgJHZhbDogcmZzLXZhbHVlKCR2YWx1ZSk7XFxuXFxuICAgICAgICAvLyBEbyBub3QgcmVuZGVyIGFueXRoaW5nIGlmIGZsdWlkIGFuZCBub24gZmx1aWQgdmFsdWVzIGFyZSB0aGUgc2FtZVxcbiAgICAgICAgJHZhbHVlOiBpZigkdmFsID09IHJmcy1mbHVpZC12YWx1ZSgkdmFsdWUpLCBudWxsLCAkdmFsKTtcXG4gICAgICB9XFxuICAgICAgQGVsc2Uge1xcbiAgICAgICAgJHZhbHVlOiByZnMtZmx1aWQtdmFsdWUoJHZhbHVlKTtcXG4gICAgICB9XFxuICAgIH1cXG5cXG4gICAgJGlzLWNzcy12YXI6IG1hcC1nZXQoJHV0aWxpdHksIGNzcy12YXIpO1xcbiAgICAkaXMtbG9jYWwtdmFyczogbWFwLWdldCgkdXRpbGl0eSwgbG9jYWwtdmFycyk7XFxuICAgICRpcy1ydGw6IG1hcC1nZXQoJHV0aWxpdHksIHJ0bCk7XFxuXFxuICAgIEBpZiAkdmFsdWUgIT0gbnVsbCB7XFxuICAgICAgQGlmICRpcy1ydGwgPT0gZmFsc2Uge1xcbiAgICAgICAgLyogcnRsOmJlZ2luOnJlbW92ZSAqL1xcbiAgICAgIH1cXG5cXG4gICAgICBAaWYgJGlzLWNzcy12YXIge1xcbiAgICAgICAgLiN7JHByb3BlcnR5LWNsYXNzICsgJGluZml4ICsgJHByb3BlcnR5LWNsYXNzLW1vZGlmaWVyfSB7XFxuICAgICAgICAgIC0tI3skcHJlZml4fSN7JGNzcy12YXJpYWJsZS1uYW1lfTogI3skdmFsdWV9O1xcbiAgICAgICAgfVxcblxcbiAgICAgICAgQGVhY2ggJHBzZXVkbyBpbiAkc3RhdGUge1xcbiAgICAgICAgICAuI3skcHJvcGVydHktY2xhc3MgKyAkaW5maXggKyAkcHJvcGVydHktY2xhc3MtbW9kaWZpZXJ9LSN7JHBzZXVkb306I3skcHNldWRvfSB7XFxuICAgICAgICAgICAgLS0jeyRwcmVmaXh9I3skY3NzLXZhcmlhYmxlLW5hbWV9OiAjeyR2YWx1ZX07XFxuICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgICB9IEBlbHNlIHtcXG4gICAgICAgIC4jeyRwcm9wZXJ0eS1jbGFzcyArICRpbmZpeCArICRwcm9wZXJ0eS1jbGFzcy1tb2RpZmllcn0ge1xcbiAgICAgICAgICBAZWFjaCAkcHJvcGVydHkgaW4gJHByb3BlcnRpZXMge1xcbiAgICAgICAgICAgIEBpZiAkaXMtbG9jYWwtdmFycyB7XFxuICAgICAgICAgICAgICBAZWFjaCAkbG9jYWwtdmFyLCAkdmFyaWFibGUgaW4gJGlzLWxvY2FsLXZhcnMge1xcbiAgICAgICAgICAgICAgICAtLSN7JHByZWZpeH0jeyRsb2NhbC12YXJ9OiAjeyR2YXJpYWJsZX07XFxuICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICN7JHByb3BlcnR5fTogJHZhbHVlIGlmKCRlbmFibGUtaW1wb3J0YW50LXV0aWxpdGllcywgIWltcG9ydGFudCwgbnVsbCk7XFxuICAgICAgICAgIH1cXG4gICAgICAgIH1cXG5cXG4gICAgICAgIEBlYWNoICRwc2V1ZG8gaW4gJHN0YXRlIHtcXG4gICAgICAgICAgLiN7JHByb3BlcnR5LWNsYXNzICsgJGluZml4ICsgJHByb3BlcnR5LWNsYXNzLW1vZGlmaWVyfS0jeyRwc2V1ZG99OiN7JHBzZXVkb30ge1xcbiAgICAgICAgICAgIEBlYWNoICRwcm9wZXJ0eSBpbiAkcHJvcGVydGllcyB7XFxuICAgICAgICAgICAgICBAaWYgJGlzLWxvY2FsLXZhcnMge1xcbiAgICAgICAgICAgICAgICBAZWFjaCAkbG9jYWwtdmFyLCAkdmFyaWFibGUgaW4gJGlzLWxvY2FsLXZhcnMge1xcbiAgICAgICAgICAgICAgICAgIC0tI3skcHJlZml4fSN7JGxvY2FsLXZhcn06ICN7JHZhcmlhYmxlfTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgI3skcHJvcGVydHl9OiAkdmFsdWUgaWYoJGVuYWJsZS1pbXBvcnRhbnQtdXRpbGl0aWVzLCAhaW1wb3J0YW50LCBudWxsKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgICB9XFxuXFxuICAgICAgQGlmICRpcy1ydGwgPT0gZmFsc2Uge1xcbiAgICAgICAgLyogcnRsOmVuZDpyZW1vdmUgKi9cXG4gICAgICB9XFxuICAgIH1cXG4gIH1cXG59XFxuXCIsXCIvLyBMb29wIG92ZXIgZWFjaCBicmVha3BvaW50XFxuQGVhY2ggJGJyZWFrcG9pbnQgaW4gbWFwLWtleXMoJGdyaWQtYnJlYWtwb2ludHMpIHtcXG5cXG4gIC8vIEdlbmVyYXRlIG1lZGlhIHF1ZXJ5IGlmIG5lZWRlZFxcbiAgQGluY2x1ZGUgbWVkaWEtYnJlYWtwb2ludC11cCgkYnJlYWtwb2ludCkge1xcbiAgICAkaW5maXg6IGJyZWFrcG9pbnQtaW5maXgoJGJyZWFrcG9pbnQsICRncmlkLWJyZWFrcG9pbnRzKTtcXG5cXG4gICAgLy8gTG9vcCBvdmVyIGVhY2ggdXRpbGl0eSBwcm9wZXJ0eVxcbiAgICBAZWFjaCAka2V5LCAkdXRpbGl0eSBpbiAkdXRpbGl0aWVzIHtcXG4gICAgICAvLyBUaGUgdXRpbGl0eSBjYW4gYmUgZGlzYWJsZWQgd2l0aCBgZmFsc2VgLCB0aHVzIGNoZWNrIGlmIHRoZSB1dGlsaXR5IGlzIGEgbWFwIGZpcnN0XFxuICAgICAgLy8gT25seSBwcm9jZWVkIGlmIHJlc3BvbnNpdmUgbWVkaWEgcXVlcmllcyBhcmUgZW5hYmxlZCBvciBpZiBpdCdzIHRoZSBiYXNlIG1lZGlhIHF1ZXJ5XFxuICAgICAgQGlmIHR5cGUtb2YoJHV0aWxpdHkpID09IFxcXCJtYXBcXFwiIGFuZCAobWFwLWdldCgkdXRpbGl0eSwgcmVzcG9uc2l2ZSkgb3IgJGluZml4ID09IFxcXCJcXFwiKSB7XFxuICAgICAgICBAaW5jbHVkZSBnZW5lcmF0ZS11dGlsaXR5KCR1dGlsaXR5LCAkaW5maXgpO1xcbiAgICAgIH1cXG4gICAgfVxcbiAgfVxcbn1cXG5cXG4vLyBSRlMgcmVzY2FsaW5nXFxuQG1lZGlhIChtaW4td2lkdGg6ICRyZnMtbXEtdmFsdWUpIHtcXG4gIEBlYWNoICRicmVha3BvaW50IGluIG1hcC1rZXlzKCRncmlkLWJyZWFrcG9pbnRzKSB7XFxuICAgICRpbmZpeDogYnJlYWtwb2ludC1pbmZpeCgkYnJlYWtwb2ludCwgJGdyaWQtYnJlYWtwb2ludHMpO1xcblxcbiAgICBAaWYgKG1hcC1nZXQoJGdyaWQtYnJlYWtwb2ludHMsICRicmVha3BvaW50KSA8ICRyZnMtYnJlYWtwb2ludCkge1xcbiAgICAgIC8vIExvb3Agb3ZlciBlYWNoIHV0aWxpdHkgcHJvcGVydHlcXG4gICAgICBAZWFjaCAka2V5LCAkdXRpbGl0eSBpbiAkdXRpbGl0aWVzIHtcXG4gICAgICAgIC8vIFRoZSB1dGlsaXR5IGNhbiBiZSBkaXNhYmxlZCB3aXRoIGBmYWxzZWAsIHRodXMgY2hlY2sgaWYgdGhlIHV0aWxpdHkgaXMgYSBtYXAgZmlyc3RcXG4gICAgICAgIC8vIE9ubHkgcHJvY2VlZCBpZiByZXNwb25zaXZlIG1lZGlhIHF1ZXJpZXMgYXJlIGVuYWJsZWQgb3IgaWYgaXQncyB0aGUgYmFzZSBtZWRpYSBxdWVyeVxcbiAgICAgICAgQGlmIHR5cGUtb2YoJHV0aWxpdHkpID09IFxcXCJtYXBcXFwiIGFuZCBtYXAtZ2V0KCR1dGlsaXR5LCByZnMpIGFuZCAobWFwLWdldCgkdXRpbGl0eSwgcmVzcG9uc2l2ZSkgb3IgJGluZml4ID09IFxcXCJcXFwiKSB7XFxuICAgICAgICAgIEBpbmNsdWRlIGdlbmVyYXRlLXV0aWxpdHkoJHV0aWxpdHksICRpbmZpeCwgdHJ1ZSk7XFxuICAgICAgICB9XFxuICAgICAgfVxcbiAgICB9XFxuICB9XFxufVxcblxcblxcbi8vIFByaW50IHV0aWxpdGllc1xcbkBtZWRpYSBwcmludCB7XFxuICBAZWFjaCAka2V5LCAkdXRpbGl0eSBpbiAkdXRpbGl0aWVzIHtcXG4gICAgLy8gVGhlIHV0aWxpdHkgY2FuIGJlIGRpc2FibGVkIHdpdGggYGZhbHNlYCwgdGh1cyBjaGVjayBpZiB0aGUgdXRpbGl0eSBpcyBhIG1hcCBmaXJzdFxcbiAgICAvLyBUaGVuIGNoZWNrIGlmIHRoZSB1dGlsaXR5IG5lZWRzIHByaW50IHN0eWxlc1xcbiAgICBAaWYgdHlwZS1vZigkdXRpbGl0eSkgPT0gXFxcIm1hcFxcXCIgYW5kIG1hcC1nZXQoJHV0aWxpdHksIHByaW50KSA9PSB0cnVlIHtcXG4gICAgICBAaW5jbHVkZSBnZW5lcmF0ZS11dGlsaXR5KCR1dGlsaXR5LCBcXFwiLXByaW50XFxcIik7XFxuICAgIH1cXG4gIH1cXG59XFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///4800\n')},588:(module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Z: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _advanced_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7537);\n/* harmony import */ var _advanced_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_advanced_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _advanced_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(3645);\n/* harmony import */ var _advanced_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_advanced_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _advanced_node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(1667);\n/* harmony import */ var _advanced_node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_advanced_node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2__);\n// Imports\n\n\n\nvar ___CSS_LOADER_URL_IMPORT_0___ = new URL(/* asset import */ __webpack_require__(2810), __webpack_require__.b);\nvar ___CSS_LOADER_EXPORT___ = _advanced_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_advanced_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\nvar ___CSS_LOADER_URL_REPLACEMENT_0___ = _advanced_node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_0___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `:root .grid-stack-item>.ui-resizable-handle{filter:none}.grid-stack{position:relative}.grid-stack.grid-stack-rtl{direction:ltr}.grid-stack.grid-stack-rtl>.grid-stack-item{direction:rtl}.grid-stack .grid-stack-placeholder>.placeholder-content{background-color:rgba(0,0,0,0.1);margin:0;position:absolute;width:auto;z-index:0 !important;text-align:center}.grid-stack>.grid-stack-item{min-width:8.3333333333%;position:absolute;padding:0}.grid-stack>.grid-stack-item>.grid-stack-item-content{margin:0;position:absolute;width:auto;overflow-x:hidden;overflow-y:auto}.grid-stack>.grid-stack-item>.ui-resizable-handle{position:absolute;font-size:.1px;display:block;-ms-touch-action:none;touch-action:none}.grid-stack>.grid-stack-item.ui-resizable-autohide>.ui-resizable-handle,.grid-stack>.grid-stack-item.ui-resizable-disabled>.ui-resizable-handle{display:none}.grid-stack>.grid-stack-item>.ui-resizable-se,.grid-stack>.grid-stack-item>.ui-resizable-sw{background-image:url(${___CSS_LOADER_URL_REPLACEMENT_0___});background-repeat:no-repeat;background-position:center;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg)}.grid-stack>.grid-stack-item>.ui-resizable-se{-webkit-transform:rotate(-45deg);-moz-transform:rotate(-45deg);-ms-transform:rotate(-45deg);-o-transform:rotate(-45deg);transform:rotate(-45deg)}.grid-stack>.grid-stack-item>.ui-resizable-nw{cursor:nw-resize;width:20px;height:20px;top:0}.grid-stack>.grid-stack-item>.ui-resizable-n{cursor:n-resize;height:10px;top:0;left:25px;right:25px}.grid-stack>.grid-stack-item>.ui-resizable-ne{cursor:ne-resize;width:20px;height:20px;top:0}.grid-stack>.grid-stack-item>.ui-resizable-e{cursor:e-resize;width:10px;top:15px;bottom:15px}.grid-stack>.grid-stack-item>.ui-resizable-se{cursor:se-resize;width:20px;height:20px}.grid-stack>.grid-stack-item>.ui-resizable-s{cursor:s-resize;height:10px;left:25px;bottom:0;right:25px}.grid-stack>.grid-stack-item>.ui-resizable-sw{cursor:sw-resize;width:20px;height:20px}.grid-stack>.grid-stack-item>.ui-resizable-w{cursor:w-resize;width:10px;top:15px;bottom:15px}.grid-stack>.grid-stack-item.ui-draggable-dragging>.ui-resizable-handle{display:none !important}.grid-stack>.grid-stack-item[gs-w="0"]{width:0%}.grid-stack>.grid-stack-item[gs-x="0"]{left:0}.grid-stack>.grid-stack-item[gs-min-w="0"]{min-width:0}.grid-stack>.grid-stack-item[gs-max-w="0"]{max-width:0%}.grid-stack>.grid-stack-item[gs-w="1"]{width:8.3333333333%}.grid-stack>.grid-stack-item[gs-x="1"]{left:8.3333333333%}.grid-stack>.grid-stack-item[gs-min-w="1"]{min-width:8.3333333333%}.grid-stack>.grid-stack-item[gs-max-w="1"]{max-width:8.3333333333%}.grid-stack>.grid-stack-item[gs-w="2"]{width:16.6666666667%}.grid-stack>.grid-stack-item[gs-x="2"]{left:16.6666666667%}.grid-stack>.grid-stack-item[gs-min-w="2"]{min-width:16.6666666667%}.grid-stack>.grid-stack-item[gs-max-w="2"]{max-width:16.6666666667%}.grid-stack>.grid-stack-item[gs-w="3"]{width:25%}.grid-stack>.grid-stack-item[gs-x="3"]{left:25%}.grid-stack>.grid-stack-item[gs-min-w="3"]{min-width:25%}.grid-stack>.grid-stack-item[gs-max-w="3"]{max-width:25%}.grid-stack>.grid-stack-item[gs-w="4"]{width:33.3333333333%}.grid-stack>.grid-stack-item[gs-x="4"]{left:33.3333333333%}.grid-stack>.grid-stack-item[gs-min-w="4"]{min-width:33.3333333333%}.grid-stack>.grid-stack-item[gs-max-w="4"]{max-width:33.3333333333%}.grid-stack>.grid-stack-item[gs-w="5"]{width:41.6666666667%}.grid-stack>.grid-stack-item[gs-x="5"]{left:41.6666666667%}.grid-stack>.grid-stack-item[gs-min-w="5"]{min-width:41.6666666667%}.grid-stack>.grid-stack-item[gs-max-w="5"]{max-width:41.6666666667%}.grid-stack>.grid-stack-item[gs-w="6"]{width:50%}.grid-stack>.grid-stack-item[gs-x="6"]{left:50%}.grid-stack>.grid-stack-item[gs-min-w="6"]{min-width:50%}.grid-stack>.grid-stack-item[gs-max-w="6"]{max-width:50%}.grid-stack>.grid-stack-item[gs-w="7"]{width:58.3333333333%}.grid-stack>.grid-stack-item[gs-x="7"]{left:58.3333333333%}.grid-stack>.grid-stack-item[gs-min-w="7"]{min-width:58.3333333333%}.grid-stack>.grid-stack-item[gs-max-w="7"]{max-width:58.3333333333%}.grid-stack>.grid-stack-item[gs-w="8"]{width:66.6666666667%}.grid-stack>.grid-stack-item[gs-x="8"]{left:66.6666666667%}.grid-stack>.grid-stack-item[gs-min-w="8"]{min-width:66.6666666667%}.grid-stack>.grid-stack-item[gs-max-w="8"]{max-width:66.6666666667%}.grid-stack>.grid-stack-item[gs-w="9"]{width:75%}.grid-stack>.grid-stack-item[gs-x="9"]{left:75%}.grid-stack>.grid-stack-item[gs-min-w="9"]{min-width:75%}.grid-stack>.grid-stack-item[gs-max-w="9"]{max-width:75%}.grid-stack>.grid-stack-item[gs-w="10"]{width:83.3333333333%}.grid-stack>.grid-stack-item[gs-x="10"]{left:83.3333333333%}.grid-stack>.grid-stack-item[gs-min-w="10"]{min-width:83.3333333333%}.grid-stack>.grid-stack-item[gs-max-w="10"]{max-width:83.3333333333%}.grid-stack>.grid-stack-item[gs-w="11"]{width:91.6666666667%}.grid-stack>.grid-stack-item[gs-x="11"]{left:91.6666666667%}.grid-stack>.grid-stack-item[gs-min-w="11"]{min-width:91.6666666667%}.grid-stack>.grid-stack-item[gs-max-w="11"]{max-width:91.6666666667%}.grid-stack>.grid-stack-item[gs-w="12"]{width:100%}.grid-stack>.grid-stack-item[gs-x="12"]{left:100%}.grid-stack>.grid-stack-item[gs-min-w="12"]{min-width:100%}.grid-stack>.grid-stack-item[gs-max-w="12"]{max-width:100%}.grid-stack.grid-stack-1>.grid-stack-item{min-width:100%}.grid-stack.grid-stack-1>.grid-stack-item[gs-w="1"]{width:100%}.grid-stack.grid-stack-1>.grid-stack-item[gs-x="1"]{left:100%}.grid-stack.grid-stack-1>.grid-stack-item[gs-min-w="1"]{min-width:100%}.grid-stack.grid-stack-1>.grid-stack-item[gs-max-w="1"]{max-width:100%}.grid-stack.grid-stack-animate,.grid-stack.grid-stack-animate .grid-stack-item{-webkit-transition:left .3s,top .3s,height .3s,width .3s;-moz-transition:left .3s,top .3s,height .3s,width .3s;-ms-transition:left .3s,top .3s,height .3s,width .3s;-o-transition:left .3s,top .3s,height .3s,width .3s;transition:left .3s,top .3s,height .3s,width .3s}.grid-stack.grid-stack-animate .grid-stack-item.grid-stack-placeholder,.grid-stack.grid-stack-animate .grid-stack-item.ui-draggable-dragging,.grid-stack.grid-stack-animate .grid-stack-item.ui-resizable-resizing{-webkit-transition:left 0s,top 0s,height 0s,width 0s;-moz-transition:left 0s,top 0s,height 0s,width 0s;-ms-transition:left 0s,top 0s,height 0s,width 0s;-o-transition:left 0s,top 0s,height 0s,width 0s;transition:left 0s,top 0s,height 0s,width 0s}.ui-draggable-dragging,.ui-resizable-resizing{z-index:100}.ui-draggable-dragging>.grid-stack-item-content,.ui-resizable-resizing>.grid-stack-item-content{box-shadow:1px 4px 6px rgba(0,0,0,0.2);opacity:.8}.ui-draggable-dragging{will-change:left,top;cursor:move}.ui-resizable-resizing{will-change:width,height}\n`, "",{"version":3,"sources":["webpack://./../node_modules/gridstack/dist/gridstack.min.css"],"names":[],"mappings":"AAAA,4CAA4C,WAAW,CAAC,YAAY,iBAAiB,CAAC,2BAA2B,aAAa,CAAC,4CAA4C,aAAa,CAAC,yDAAyD,gCAA+B,CAAC,QAAQ,CAAC,iBAAiB,CAAC,UAAU,CAAC,oBAAmB,CAAC,iBAAiB,CAAC,6BAA6B,uBAAuB,CAAC,iBAAiB,CAAC,SAAS,CAAC,sDAAsD,QAAQ,CAAC,iBAAiB,CAAC,UAAU,CAAC,iBAAiB,CAAC,eAAe,CAAC,kDAAkD,iBAAiB,CAAC,cAAc,CAAC,aAAa,CAAC,qBAAqB,CAAC,iBAAiB,CAAC,gJAAgJ,YAAY,CAAC,4FAA4F,wDAA41D,CAAC,2BAA2B,CAAC,0BAA0B,CAAC,+BAA+B,CAAC,4BAA4B,CAAC,2BAA2B,CAAC,0BAA0B,CAAC,uBAAuB,CAAC,8CAA8C,gCAAgC,CAAC,6BAA6B,CAAC,4BAA4B,CAAC,2BAA2B,CAAC,wBAAwB,CAAC,8CAA8C,gBAAgB,CAAC,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC,6CAA6C,eAAe,CAAC,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,8CAA8C,gBAAgB,CAAC,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC,6CAA6C,eAAe,CAAC,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC,8CAA8C,gBAAgB,CAAC,UAAU,CAAC,WAAW,CAAC,6CAA6C,eAAe,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,8CAA8C,gBAAgB,CAAC,UAAU,CAAC,WAAW,CAAC,6CAA6C,eAAe,CAAC,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC,wEAAwE,uBAAsB,CAAC,uCAAuC,QAAQ,CAAC,uCAAuC,MAAM,CAAC,2CAA2C,WAAW,CAAC,2CAA2C,YAAY,CAAC,uCAAuC,mBAAmB,CAAC,uCAAuC,kBAAkB,CAAC,2CAA2C,uBAAuB,CAAC,2CAA2C,uBAAuB,CAAC,uCAAuC,oBAAoB,CAAC,uCAAuC,mBAAmB,CAAC,2CAA2C,wBAAwB,CAAC,2CAA2C,wBAAwB,CAAC,uCAAuC,SAAS,CAAC,uCAAuC,QAAQ,CAAC,2CAA2C,aAAa,CAAC,2CAA2C,aAAa,CAAC,uCAAuC,oBAAoB,CAAC,uCAAuC,mBAAmB,CAAC,2CAA2C,wBAAwB,CAAC,2CAA2C,wBAAwB,CAAC,uCAAuC,oBAAoB,CAAC,uCAAuC,mBAAmB,CAAC,2CAA2C,wBAAwB,CAAC,2CAA2C,wBAAwB,CAAC,uCAAuC,SAAS,CAAC,uCAAuC,QAAQ,CAAC,2CAA2C,aAAa,CAAC,2CAA2C,aAAa,CAAC,uCAAuC,oBAAoB,CAAC,uCAAuC,mBAAmB,CAAC,2CAA2C,wBAAwB,CAAC,2CAA2C,wBAAwB,CAAC,uCAAuC,oBAAoB,CAAC,uCAAuC,mBAAmB,CAAC,2CAA2C,wBAAwB,CAAC,2CAA2C,wBAAwB,CAAC,uCAAuC,SAAS,CAAC,uCAAuC,QAAQ,CAAC,2CAA2C,aAAa,CAAC,2CAA2C,aAAa,CAAC,wCAAwC,oBAAoB,CAAC,wCAAwC,mBAAmB,CAAC,4CAA4C,wBAAwB,CAAC,4CAA4C,wBAAwB,CAAC,wCAAwC,oBAAoB,CAAC,wCAAwC,mBAAmB,CAAC,4CAA4C,wBAAwB,CAAC,4CAA4C,wBAAwB,CAAC,wCAAwC,UAAU,CAAC,wCAAwC,SAAS,CAAC,4CAA4C,cAAc,CAAC,4CAA4C,cAAc,CAAC,0CAA0C,cAAc,CAAC,oDAAoD,UAAU,CAAC,oDAAoD,SAAS,CAAC,wDAAwD,cAAc,CAAC,wDAAwD,cAAc,CAAC,+EAA+E,wDAAwD,CAAC,qDAAqD,CAAC,oDAAoD,CAAC,mDAAmD,CAAC,gDAAgD,CAAC,mNAAmN,oDAAoD,CAAC,iDAAiD,CAAC,gDAAgD,CAAC,+CAA+C,CAAC,4CAA4C,CAAC,8CAA8C,WAAW,CAAC,gGAAgG,sCAAqC,CAAC,UAAU,CAAC,uBAAuB,oBAAoB,CAAC,WAAW,CAAC,uBAAuB,wBAAwB","sourcesContent":[":root .grid-stack-item>.ui-resizable-handle{filter:none}.grid-stack{position:relative}.grid-stack.grid-stack-rtl{direction:ltr}.grid-stack.grid-stack-rtl>.grid-stack-item{direction:rtl}.grid-stack .grid-stack-placeholder>.placeholder-content{background-color:rgba(0,0,0,.1);margin:0;position:absolute;width:auto;z-index:0!important;text-align:center}.grid-stack>.grid-stack-item{min-width:8.3333333333%;position:absolute;padding:0}.grid-stack>.grid-stack-item>.grid-stack-item-content{margin:0;position:absolute;width:auto;overflow-x:hidden;overflow-y:auto}.grid-stack>.grid-stack-item>.ui-resizable-handle{position:absolute;font-size:.1px;display:block;-ms-touch-action:none;touch-action:none}.grid-stack>.grid-stack-item.ui-resizable-autohide>.ui-resizable-handle,.grid-stack>.grid-stack-item.ui-resizable-disabled>.ui-resizable-handle{display:none}.grid-stack>.grid-stack-item>.ui-resizable-se,.grid-stack>.grid-stack-item>.ui-resizable-sw{background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMTYuMC4wLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgLS0+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4PSIwcHgiIHk9IjBweCIgd2lkdGg9IjE2cHgiIGhlaWdodD0iMTZweCIgdmlld0JveD0iMCAwIDUxMS42MjYgNTExLjYyNyIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNTExLjYyNiA1MTEuNjI3OyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxnPgoJPHBhdGggZD0iTTMyOC45MDYsNDAxLjk5NGgtMzYuNTUzVjEwOS42MzZoMzYuNTUzYzQuOTQ4LDAsOS4yMzYtMS44MDksMTIuODQ3LTUuNDI2YzMuNjEzLTMuNjE1LDUuNDIxLTcuODk4LDUuNDIxLTEyLjg0NSAgIGMwLTQuOTQ5LTEuODAxLTkuMjMxLTUuNDI4LTEyLjg1MWwtNzMuMDg3LTczLjA5QzI2NS4wNDQsMS44MDksMjYwLjc2LDAsMjU1LjgxMywwYy00Ljk0OCwwLTkuMjI5LDEuODA5LTEyLjg0Nyw1LjQyNCAgIGwtNzMuMDg4LDczLjA5Yy0zLjYxOCwzLjYxOS01LjQyNCw3LjkwMi01LjQyNCwxMi44NTFjMCw0Ljk0NiwxLjgwNyw5LjIyOSw1LjQyNCwxMi44NDVjMy42MTksMy42MTcsNy45MDEsNS40MjYsMTIuODUsNS40MjYgICBoMzYuNTQ1djI5Mi4zNThoLTM2LjU0MmMtNC45NTIsMC05LjIzNSwxLjgwOC0xMi44NSw1LjQyMWMtMy42MTcsMy42MjEtNS40MjQsNy45MDUtNS40MjQsMTIuODU0ICAgYzAsNC45NDUsMS44MDcsOS4yMjcsNS40MjQsMTIuODQ3bDczLjA4OSw3My4wODhjMy42MTcsMy42MTcsNy44OTgsNS40MjQsMTIuODQ3LDUuNDI0YzQuOTUsMCw5LjIzNC0xLjgwNywxMi44NDktNS40MjQgICBsNzMuMDg3LTczLjA4OGMzLjYxMy0zLjYyLDUuNDIxLTcuOTAxLDUuNDIxLTEyLjg0N2MwLTQuOTQ4LTEuODA4LTkuMjMyLTUuNDIxLTEyLjg1NCAgIEMzMzguMTQyLDQwMy44MDIsMzMzLjg1Nyw0MDEuOTk0LDMyOC45MDYsNDAxLjk5NHoiIGZpbGw9IiM2NjY2NjYiLz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8L3N2Zz4K);background-repeat:no-repeat;background-position:center;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg)}.grid-stack>.grid-stack-item>.ui-resizable-se{-webkit-transform:rotate(-45deg);-moz-transform:rotate(-45deg);-ms-transform:rotate(-45deg);-o-transform:rotate(-45deg);transform:rotate(-45deg)}.grid-stack>.grid-stack-item>.ui-resizable-nw{cursor:nw-resize;width:20px;height:20px;top:0}.grid-stack>.grid-stack-item>.ui-resizable-n{cursor:n-resize;height:10px;top:0;left:25px;right:25px}.grid-stack>.grid-stack-item>.ui-resizable-ne{cursor:ne-resize;width:20px;height:20px;top:0}.grid-stack>.grid-stack-item>.ui-resizable-e{cursor:e-resize;width:10px;top:15px;bottom:15px}.grid-stack>.grid-stack-item>.ui-resizable-se{cursor:se-resize;width:20px;height:20px}.grid-stack>.grid-stack-item>.ui-resizable-s{cursor:s-resize;height:10px;left:25px;bottom:0;right:25px}.grid-stack>.grid-stack-item>.ui-resizable-sw{cursor:sw-resize;width:20px;height:20px}.grid-stack>.grid-stack-item>.ui-resizable-w{cursor:w-resize;width:10px;top:15px;bottom:15px}.grid-stack>.grid-stack-item.ui-draggable-dragging>.ui-resizable-handle{display:none!important}.grid-stack>.grid-stack-item[gs-w=\\"0\\"]{width:0%}.grid-stack>.grid-stack-item[gs-x=\\"0\\"]{left:0}.grid-stack>.grid-stack-item[gs-min-w=\\"0\\"]{min-width:0}.grid-stack>.grid-stack-item[gs-max-w=\\"0\\"]{max-width:0%}.grid-stack>.grid-stack-item[gs-w=\\"1\\"]{width:8.3333333333%}.grid-stack>.grid-stack-item[gs-x=\\"1\\"]{left:8.3333333333%}.grid-stack>.grid-stack-item[gs-min-w=\\"1\\"]{min-width:8.3333333333%}.grid-stack>.grid-stack-item[gs-max-w=\\"1\\"]{max-width:8.3333333333%}.grid-stack>.grid-stack-item[gs-w=\\"2\\"]{width:16.6666666667%}.grid-stack>.grid-stack-item[gs-x=\\"2\\"]{left:16.6666666667%}.grid-stack>.grid-stack-item[gs-min-w=\\"2\\"]{min-width:16.6666666667%}.grid-stack>.grid-stack-item[gs-max-w=\\"2\\"]{max-width:16.6666666667%}.grid-stack>.grid-stack-item[gs-w=\\"3\\"]{width:25%}.grid-stack>.grid-stack-item[gs-x=\\"3\\"]{left:25%}.grid-stack>.grid-stack-item[gs-min-w=\\"3\\"]{min-width:25%}.grid-stack>.grid-stack-item[gs-max-w=\\"3\\"]{max-width:25%}.grid-stack>.grid-stack-item[gs-w=\\"4\\"]{width:33.3333333333%}.grid-stack>.grid-stack-item[gs-x=\\"4\\"]{left:33.3333333333%}.grid-stack>.grid-stack-item[gs-min-w=\\"4\\"]{min-width:33.3333333333%}.grid-stack>.grid-stack-item[gs-max-w=\\"4\\"]{max-width:33.3333333333%}.grid-stack>.grid-stack-item[gs-w=\\"5\\"]{width:41.6666666667%}.grid-stack>.grid-stack-item[gs-x=\\"5\\"]{left:41.6666666667%}.grid-stack>.grid-stack-item[gs-min-w=\\"5\\"]{min-width:41.6666666667%}.grid-stack>.grid-stack-item[gs-max-w=\\"5\\"]{max-width:41.6666666667%}.grid-stack>.grid-stack-item[gs-w=\\"6\\"]{width:50%}.grid-stack>.grid-stack-item[gs-x=\\"6\\"]{left:50%}.grid-stack>.grid-stack-item[gs-min-w=\\"6\\"]{min-width:50%}.grid-stack>.grid-stack-item[gs-max-w=\\"6\\"]{max-width:50%}.grid-stack>.grid-stack-item[gs-w=\\"7\\"]{width:58.3333333333%}.grid-stack>.grid-stack-item[gs-x=\\"7\\"]{left:58.3333333333%}.grid-stack>.grid-stack-item[gs-min-w=\\"7\\"]{min-width:58.3333333333%}.grid-stack>.grid-stack-item[gs-max-w=\\"7\\"]{max-width:58.3333333333%}.grid-stack>.grid-stack-item[gs-w=\\"8\\"]{width:66.6666666667%}.grid-stack>.grid-stack-item[gs-x=\\"8\\"]{left:66.6666666667%}.grid-stack>.grid-stack-item[gs-min-w=\\"8\\"]{min-width:66.6666666667%}.grid-stack>.grid-stack-item[gs-max-w=\\"8\\"]{max-width:66.6666666667%}.grid-stack>.grid-stack-item[gs-w=\\"9\\"]{width:75%}.grid-stack>.grid-stack-item[gs-x=\\"9\\"]{left:75%}.grid-stack>.grid-stack-item[gs-min-w=\\"9\\"]{min-width:75%}.grid-stack>.grid-stack-item[gs-max-w=\\"9\\"]{max-width:75%}.grid-stack>.grid-stack-item[gs-w=\\"10\\"]{width:83.3333333333%}.grid-stack>.grid-stack-item[gs-x=\\"10\\"]{left:83.3333333333%}.grid-stack>.grid-stack-item[gs-min-w=\\"10\\"]{min-width:83.3333333333%}.grid-stack>.grid-stack-item[gs-max-w=\\"10\\"]{max-width:83.3333333333%}.grid-stack>.grid-stack-item[gs-w=\\"11\\"]{width:91.6666666667%}.grid-stack>.grid-stack-item[gs-x=\\"11\\"]{left:91.6666666667%}.grid-stack>.grid-stack-item[gs-min-w=\\"11\\"]{min-width:91.6666666667%}.grid-stack>.grid-stack-item[gs-max-w=\\"11\\"]{max-width:91.6666666667%}.grid-stack>.grid-stack-item[gs-w=\\"12\\"]{width:100%}.grid-stack>.grid-stack-item[gs-x=\\"12\\"]{left:100%}.grid-stack>.grid-stack-item[gs-min-w=\\"12\\"]{min-width:100%}.grid-stack>.grid-stack-item[gs-max-w=\\"12\\"]{max-width:100%}.grid-stack.grid-stack-1>.grid-stack-item{min-width:100%}.grid-stack.grid-stack-1>.grid-stack-item[gs-w=\\"1\\"]{width:100%}.grid-stack.grid-stack-1>.grid-stack-item[gs-x=\\"1\\"]{left:100%}.grid-stack.grid-stack-1>.grid-stack-item[gs-min-w=\\"1\\"]{min-width:100%}.grid-stack.grid-stack-1>.grid-stack-item[gs-max-w=\\"1\\"]{max-width:100%}.grid-stack.grid-stack-animate,.grid-stack.grid-stack-animate .grid-stack-item{-webkit-transition:left .3s,top .3s,height .3s,width .3s;-moz-transition:left .3s,top .3s,height .3s,width .3s;-ms-transition:left .3s,top .3s,height .3s,width .3s;-o-transition:left .3s,top .3s,height .3s,width .3s;transition:left .3s,top .3s,height .3s,width .3s}.grid-stack.grid-stack-animate .grid-stack-item.grid-stack-placeholder,.grid-stack.grid-stack-animate .grid-stack-item.ui-draggable-dragging,.grid-stack.grid-stack-animate .grid-stack-item.ui-resizable-resizing{-webkit-transition:left 0s,top 0s,height 0s,width 0s;-moz-transition:left 0s,top 0s,height 0s,width 0s;-ms-transition:left 0s,top 0s,height 0s,width 0s;-o-transition:left 0s,top 0s,height 0s,width 0s;transition:left 0s,top 0s,height 0s,width 0s}.ui-draggable-dragging,.ui-resizable-resizing{z-index:100}.ui-draggable-dragging>.grid-stack-item-content,.ui-resizable-resizing>.grid-stack-item-content{box-shadow:1px 4px 6px rgba(0,0,0,.2);opacity:.8}.ui-draggable-dragging{will-change:left,top;cursor:move}.ui-resizable-resizing{will-change:width,height}"],"sourceRoot":""}]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LDZDQUE2QyxjQUFjLDZDQUE2QyxjQUFjLDBDQUEwQyxxQkFBcUIsMENBQTBDLG9CQUFvQiw4Q0FBOEMseUJBQXlCLDhDQUE4Qyx5QkFBeUIsMENBQTBDLHFCQUFxQiwwQ0FBMEMsb0JBQW9CLDhDQUE4Qyx5QkFBeUIsOENBQThDLHlCQUF5QiwwQ0FBMEMsV0FBVywwQ0FBMEMsVUFBVSw4Q0FBOEMsZUFBZSw4Q0FBOEMsZUFBZSwwQ0FBMEMsZUFBZSxzREFBc0QsV0FBVyxzREFBc0QsVUFBVSwwREFBMEQsZUFBZSwwREFBMEQsZUFBZSwrRUFBK0UseURBQXlELHNEQUFzRCxxREFBcUQsb0RBQW9ELGlEQUFpRCxtTkFBbU4scURBQXFELGtEQUFrRCxpREFBaUQsZ0RBQWdELDZDQUE2Qyw4Q0FBOEMsWUFBWSxnR0FBZ0csc0NBQXNDLFdBQVcsdUJBQXVCLHFCQUFxQixZQUFZLHVCQUF1Qix5QkFBeUIsbUJBQW1CO0FBQ3R3VjtBQUNBLGlFQUFlLHVCQUF1QixFQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL25vZGVfbW9kdWxlcy9ncmlkc3RhY2svZGlzdC9ncmlkc3RhY2subWluLmNzcz8yNWUxIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9hZHZhbmNlZC9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vYWR2YW5jZWQvbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfR0VUX1VSTF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL2FkdmFuY2VkL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9nZXRVcmwuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfMF9fXyA9IG5ldyBVUkwoXCJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBEOTRiV3dnZG1WeWMybHZiajBpTVM0d0lpQmxibU52WkdsdVp6MGlhWE52TFRnNE5Ua3RNU0kvUGdvOElTMHRJRWRsYm1WeVlYUnZjam9nUVdSdlltVWdTV3hzZFhOMGNtRjBiM0lnTVRZdU1DNHdMQ0JUVmtjZ1JYaHdiM0owSUZCc2RXY3RTVzRnTGlCVFZrY2dWbVZ5YzJsdmJqb2dOaTR3TUNCQ2RXbHNaQ0F3S1NBZ0xTMCtDandoUkU5RFZGbFFSU0J6ZG1jZ1VGVkNURWxESUNJdEx5OVhNME12TDBSVVJDQlRWa2NnTVM0eEx5OUZUaUlnSW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTDBkeVlYQm9hV056TDFOV1J5OHhMakV2UkZSRUwzTjJaekV4TG1SMFpDSStDanh6ZG1jZ2VHMXNibk05SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpJd01EQXZjM1puSWlCNGJXeHVjenA0YkdsdWF6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNVGs1T1M5NGJHbHVheUlnZG1WeWMybHZiajBpTVM0eElpQnBaRDBpUTJGd1lWOHhJaUI0UFNJd2NIZ2lJSGs5SWpCd2VDSWdkMmxrZEdnOUlqRTJjSGdpSUdobGFXZG9kRDBpTVRad2VDSWdkbWxsZDBKdmVEMGlNQ0F3SURVeE1TNDJNallnTlRFeExqWXlOeUlnYzNSNWJHVTlJbVZ1WVdKc1pTMWlZV05yWjNKdmRXNWtPbTVsZHlBd0lEQWdOVEV4TGpZeU5pQTFNVEV1TmpJM095SWdlRzFzT25Od1lXTmxQU0p3Y21WelpYSjJaU0krQ2p4blBnb0pQSEJoZEdnZ1pEMGlUVE15T0M0NU1EWXNOREF4TGprNU5HZ3RNell1TlRVelZqRXdPUzQyTXpab016WXVOVFV6WXpRdU9UUTRMREFzT1M0eU16WXRNUzQ0TURrc01USXVPRFEzTFRVdU5ESTJZek11TmpFekxUTXVOakUxTERVdU5ESXhMVGN1T0RrNExEVXVOREl4TFRFeUxqZzBOU0FnSUdNd0xUUXVPVFE1TFRFdU9EQXhMVGt1TWpNeExUVXVOREk0TFRFeUxqZzFNV3d0TnpNdU1EZzNMVGN6TGpBNVF6STJOUzR3TkRRc01TNDRNRGtzTWpZd0xqYzJMREFzTWpVMUxqZ3hNeXd3WXkwMExqazBPQ3d3TFRrdU1qSTVMREV1T0RBNUxURXlMamcwTnl3MUxqUXlOQ0FnSUd3dE56TXVNRGc0TERjekxqQTVZeTB6TGpZeE9Dd3pMall4T1MwMUxqUXlOQ3czTGprd01pMDFMalF5TkN3eE1pNDROVEZqTUN3MExqazBOaXd4TGpnd055dzVMakl5T1N3MUxqUXlOQ3d4TWk0NE5EVmpNeTQyTVRrc015NDJNVGNzTnk0NU1ERXNOUzQwTWpZc01USXVPRFVzTlM0ME1qWWdJQ0JvTXpZdU5UUTFkakk1TWk0ek5UaG9MVE0yTGpVME1tTXROQzQ1TlRJc01DMDVMakl6TlN3eExqZ3dPQzB4TWk0NE5TdzFMalF5TVdNdE15NDJNVGNzTXk0Mk1qRXROUzQwTWpRc055NDVNRFV0TlM0ME1qUXNNVEl1T0RVMElDQWdZekFzTkM0NU5EVXNNUzQ0TURjc09TNHlNamNzTlM0ME1qUXNNVEl1T0RRM2JEY3pMakE0T1N3M015NHdPRGhqTXk0Mk1UY3NNeTQyTVRjc055NDRPVGdzTlM0ME1qUXNNVEl1T0RRM0xEVXVOREkwWXpRdU9UVXNNQ3c1TGpJek5DMHhMamd3Tnl3eE1pNDRORGt0TlM0ME1qUWdJQ0JzTnpNdU1EZzNMVGN6TGpBNE9HTXpMall4TXkwekxqWXlMRFV1TkRJeExUY3VPVEF4TERVdU5ESXhMVEV5TGpnME4yTXdMVFF1T1RRNExURXVPREE0TFRrdU1qTXlMVFV1TkRJeExURXlMamcxTkNBZ0lFTXpNemd1TVRReUxEUXdNeTQ0TURJc016TXpMamcxTnl3ME1ERXVPVGswTERNeU9DNDVNRFlzTkRBeExqazVOSG9pSUdacGJHdzlJaU0yTmpZMk5qWWlMejRLUEM5blBnbzhaejRLUEM5blBnbzhaejRLUEM5blBnbzhaejRLUEM5blBnbzhaejRLUEM5blBnbzhaejRLUEM5blBnbzhaejRLUEM5blBnbzhaejRLUEM5blBnbzhaejRLUEM5blBnbzhaejRLUEM5blBnbzhaejRLUEM5blBnbzhaejRLUEM5blBnbzhaejRLUEM5blBnbzhaejRLUEM5blBnbzhaejRLUEM5blBnbzhaejRLUEM5blBnbzhMM04yWno0S1wiLCBpbXBvcnQubWV0YS51cmwpO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzBfX18gPSBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8wX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgOnJvb3QgLmdyaWQtc3RhY2staXRlbT4udWktcmVzaXphYmxlLWhhbmRsZXtmaWx0ZXI6bm9uZX0uZ3JpZC1zdGFja3twb3NpdGlvbjpyZWxhdGl2ZX0uZ3JpZC1zdGFjay5ncmlkLXN0YWNrLXJ0bHtkaXJlY3Rpb246bHRyfS5ncmlkLXN0YWNrLmdyaWQtc3RhY2stcnRsPi5ncmlkLXN0YWNrLWl0ZW17ZGlyZWN0aW9uOnJ0bH0uZ3JpZC1zdGFjayAuZ3JpZC1zdGFjay1wbGFjZWhvbGRlcj4ucGxhY2Vob2xkZXItY29udGVudHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsMC4xKTttYXJnaW46MDtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDphdXRvO3otaW5kZXg6MCAhaW1wb3J0YW50O3RleHQtYWxpZ246Y2VudGVyfS5ncmlkLXN0YWNrPi5ncmlkLXN0YWNrLWl0ZW17bWluLXdpZHRoOjguMzMzMzMzMzMzMyU7cG9zaXRpb246YWJzb2x1dGU7cGFkZGluZzowfS5ncmlkLXN0YWNrPi5ncmlkLXN0YWNrLWl0ZW0+LmdyaWQtc3RhY2staXRlbS1jb250ZW50e21hcmdpbjowO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOmF1dG87b3ZlcmZsb3cteDpoaWRkZW47b3ZlcmZsb3cteTphdXRvfS5ncmlkLXN0YWNrPi5ncmlkLXN0YWNrLWl0ZW0+LnVpLXJlc2l6YWJsZS1oYW5kbGV7cG9zaXRpb246YWJzb2x1dGU7Zm9udC1zaXplOi4xcHg7ZGlzcGxheTpibG9jazstbXMtdG91Y2gtYWN0aW9uOm5vbmU7dG91Y2gtYWN0aW9uOm5vbmV9LmdyaWQtc3RhY2s+LmdyaWQtc3RhY2staXRlbS51aS1yZXNpemFibGUtYXV0b2hpZGU+LnVpLXJlc2l6YWJsZS1oYW5kbGUsLmdyaWQtc3RhY2s+LmdyaWQtc3RhY2staXRlbS51aS1yZXNpemFibGUtZGlzYWJsZWQ+LnVpLXJlc2l6YWJsZS1oYW5kbGV7ZGlzcGxheTpub25lfS5ncmlkLXN0YWNrPi5ncmlkLXN0YWNrLWl0ZW0+LnVpLXJlc2l6YWJsZS1zZSwuZ3JpZC1zdGFjaz4uZ3JpZC1zdGFjay1pdGVtPi51aS1yZXNpemFibGUtc3d7YmFja2dyb3VuZC1pbWFnZTp1cmwoJHtfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8wX19ffSk7YmFja2dyb3VuZC1yZXBlYXQ6bm8tcmVwZWF0O2JhY2tncm91bmQtcG9zaXRpb246Y2VudGVyOy13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSg0NWRlZyk7LW1vei10cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKTstbXMtdHJhbnNmb3JtOnJvdGF0ZSg0NWRlZyk7LW8tdHJhbnNmb3JtOnJvdGF0ZSg0NWRlZyk7dHJhbnNmb3JtOnJvdGF0ZSg0NWRlZyl9LmdyaWQtc3RhY2s+LmdyaWQtc3RhY2staXRlbT4udWktcmVzaXphYmxlLXNley13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpOy1tb3otdHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpOy1tcy10cmFuc2Zvcm06cm90YXRlKC00NWRlZyk7LW8tdHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpO3RyYW5zZm9ybTpyb3RhdGUoLTQ1ZGVnKX0uZ3JpZC1zdGFjaz4uZ3JpZC1zdGFjay1pdGVtPi51aS1yZXNpemFibGUtbnd7Y3Vyc29yOm53LXJlc2l6ZTt3aWR0aDoyMHB4O2hlaWdodDoyMHB4O3RvcDowfS5ncmlkLXN0YWNrPi5ncmlkLXN0YWNrLWl0ZW0+LnVpLXJlc2l6YWJsZS1ue2N1cnNvcjpuLXJlc2l6ZTtoZWlnaHQ6MTBweDt0b3A6MDtsZWZ0OjI1cHg7cmlnaHQ6MjVweH0uZ3JpZC1zdGFjaz4uZ3JpZC1zdGFjay1pdGVtPi51aS1yZXNpemFibGUtbmV7Y3Vyc29yOm5lLXJlc2l6ZTt3aWR0aDoyMHB4O2hlaWdodDoyMHB4O3RvcDowfS5ncmlkLXN0YWNrPi5ncmlkLXN0YWNrLWl0ZW0+LnVpLXJlc2l6YWJsZS1le2N1cnNvcjplLXJlc2l6ZTt3aWR0aDoxMHB4O3RvcDoxNXB4O2JvdHRvbToxNXB4fS5ncmlkLXN0YWNrPi5ncmlkLXN0YWNrLWl0ZW0+LnVpLXJlc2l6YWJsZS1zZXtjdXJzb3I6c2UtcmVzaXplO3dpZHRoOjIwcHg7aGVpZ2h0OjIwcHh9LmdyaWQtc3RhY2s+LmdyaWQtc3RhY2staXRlbT4udWktcmVzaXphYmxlLXN7Y3Vyc29yOnMtcmVzaXplO2hlaWdodDoxMHB4O2xlZnQ6MjVweDtib3R0b206MDtyaWdodDoyNXB4fS5ncmlkLXN0YWNrPi5ncmlkLXN0YWNrLWl0ZW0+LnVpLXJlc2l6YWJsZS1zd3tjdXJzb3I6c3ctcmVzaXplO3dpZHRoOjIwcHg7aGVpZ2h0OjIwcHh9LmdyaWQtc3RhY2s+LmdyaWQtc3RhY2staXRlbT4udWktcmVzaXphYmxlLXd7Y3Vyc29yOnctcmVzaXplO3dpZHRoOjEwcHg7dG9wOjE1cHg7Ym90dG9tOjE1cHh9LmdyaWQtc3RhY2s+LmdyaWQtc3RhY2staXRlbS51aS1kcmFnZ2FibGUtZHJhZ2dpbmc+LnVpLXJlc2l6YWJsZS1oYW5kbGV7ZGlzcGxheTpub25lICFpbXBvcnRhbnR9LmdyaWQtc3RhY2s+LmdyaWQtc3RhY2staXRlbVtncy13PVwiMFwiXXt3aWR0aDowJX0uZ3JpZC1zdGFjaz4uZ3JpZC1zdGFjay1pdGVtW2dzLXg9XCIwXCJde2xlZnQ6MH0uZ3JpZC1zdGFjaz4uZ3JpZC1zdGFjay1pdGVtW2dzLW1pbi13PVwiMFwiXXttaW4td2lkdGg6MH0uZ3JpZC1zdGFjaz4uZ3JpZC1zdGFjay1pdGVtW2dzLW1heC13PVwiMFwiXXttYXgtd2lkdGg6MCV9LmdyaWQtc3RhY2s+LmdyaWQtc3RhY2staXRlbVtncy13PVwiMVwiXXt3aWR0aDo4LjMzMzMzMzMzMzMlfS5ncmlkLXN0YWNrPi5ncmlkLXN0YWNrLWl0ZW1bZ3MteD1cIjFcIl17bGVmdDo4LjMzMzMzMzMzMzMlfS5ncmlkLXN0YWNrPi5ncmlkLXN0YWNrLWl0ZW1bZ3MtbWluLXc9XCIxXCJde21pbi13aWR0aDo4LjMzMzMzMzMzMzMlfS5ncmlkLXN0YWNrPi5ncmlkLXN0YWNrLWl0ZW1bZ3MtbWF4LXc9XCIxXCJde21heC13aWR0aDo4LjMzMzMzMzMzMzMlfS5ncmlkLXN0YWNrPi5ncmlkLXN0YWNrLWl0ZW1bZ3Mtdz1cIjJcIl17d2lkdGg6MTYuNjY2NjY2NjY2NyV9LmdyaWQtc3RhY2s+LmdyaWQtc3RhY2staXRlbVtncy14PVwiMlwiXXtsZWZ0OjE2LjY2NjY2NjY2NjclfS5ncmlkLXN0YWNrPi5ncmlkLXN0YWNrLWl0ZW1bZ3MtbWluLXc9XCIyXCJde21pbi13aWR0aDoxNi42NjY2NjY2NjY3JX0uZ3JpZC1zdGFjaz4uZ3JpZC1zdGFjay1pdGVtW2dzLW1heC13PVwiMlwiXXttYXgtd2lkdGg6MTYuNjY2NjY2NjY2NyV9LmdyaWQtc3RhY2s+LmdyaWQtc3RhY2staXRlbVtncy13PVwiM1wiXXt3aWR0aDoyNSV9LmdyaWQtc3RhY2s+LmdyaWQtc3RhY2staXRlbVtncy14PVwiM1wiXXtsZWZ0OjI1JX0uZ3JpZC1zdGFjaz4uZ3JpZC1zdGFjay1pdGVtW2dzLW1pbi13PVwiM1wiXXttaW4td2lkdGg6MjUlfS5ncmlkLXN0YWNrPi5ncmlkLXN0YWNrLWl0ZW1bZ3MtbWF4LXc9XCIzXCJde21heC13aWR0aDoyNSV9LmdyaWQtc3RhY2s+LmdyaWQtc3RhY2staXRlbVtncy13PVwiNFwiXXt3aWR0aDozMy4zMzMzMzMzMzMzJX0uZ3JpZC1zdGFjaz4uZ3JpZC1zdGFjay1pdGVtW2dzLXg9XCI0XCJde2xlZnQ6MzMuMzMzMzMzMzMzMyV9LmdyaWQtc3RhY2s+LmdyaWQtc3RhY2staXRlbVtncy1taW4tdz1cIjRcIl17bWluLXdpZHRoOjMzLjMzMzMzMzMzMzMlfS5ncmlkLXN0YWNrPi5ncmlkLXN0YWNrLWl0ZW1bZ3MtbWF4LXc9XCI0XCJde21heC13aWR0aDozMy4zMzMzMzMzMzMzJX0uZ3JpZC1zdGFjaz4uZ3JpZC1zdGFjay1pdGVtW2dzLXc9XCI1XCJde3dpZHRoOjQxLjY2NjY2NjY2NjclfS5ncmlkLXN0YWNrPi5ncmlkLXN0YWNrLWl0ZW1bZ3MteD1cIjVcIl17bGVmdDo0MS42NjY2NjY2NjY3JX0uZ3JpZC1zdGFjaz4uZ3JpZC1zdGFjay1pdGVtW2dzLW1pbi13PVwiNVwiXXttaW4td2lkdGg6NDEuNjY2NjY2NjY2NyV9LmdyaWQtc3RhY2s+LmdyaWQtc3RhY2staXRlbVtncy1tYXgtdz1cIjVcIl17bWF4LXdpZHRoOjQxLjY2NjY2NjY2NjclfS5ncmlkLXN0YWNrPi5ncmlkLXN0YWNrLWl0ZW1bZ3Mtdz1cIjZcIl17d2lkdGg6NTAlfS5ncmlkLXN0YWNrPi5ncmlkLXN0YWNrLWl0ZW1bZ3MteD1cIjZcIl17bGVmdDo1MCV9LmdyaWQtc3RhY2s+LmdyaWQtc3RhY2staXRlbVtncy1taW4tdz1cIjZcIl17bWluLXdpZHRoOjUwJX0uZ3JpZC1zdGFjaz4uZ3JpZC1zdGFjay1pdGVtW2dzLW1heC13PVwiNlwiXXttYXgtd2lkdGg6NTAlfS5ncmlkLXN0YWNrPi5ncmlkLXN0YWNrLWl0ZW1bZ3Mtdz1cIjdcIl17d2lkdGg6NTguMzMzMzMzMzMzMyV9LmdyaWQtc3RhY2s+LmdyaWQtc3RhY2staXRlbVtncy14PVwiN1wiXXtsZWZ0OjU4LjMzMzMzMzMzMzMlfS5ncmlkLXN0YWNrPi5ncmlkLXN0YWNrLWl0ZW1bZ3MtbWluLXc9XCI3XCJde21pbi13aWR0aDo1OC4zMzMzMzMzMzMzJX0uZ3JpZC1zdGFjaz4uZ3JpZC1zdGFjay1pdGVtW2dzLW1heC13PVwiN1wiXXttYXgtd2lkdGg6NTguMzMzMzMzMzMzMyV9LmdyaWQtc3RhY2s+LmdyaWQtc3RhY2staXRlbVtncy13PVwiOFwiXXt3aWR0aDo2Ni42NjY2NjY2NjY3JX0uZ3JpZC1zdGFjaz4uZ3JpZC1zdGFjay1pdGVtW2dzLXg9XCI4XCJde2xlZnQ6NjYuNjY2NjY2NjY2NyV9LmdyaWQtc3RhY2s+LmdyaWQtc3RhY2staXRlbVtncy1taW4tdz1cIjhcIl17bWluLXdpZHRoOjY2LjY2NjY2NjY2NjclfS5ncmlkLXN0YWNrPi5ncmlkLXN0YWNrLWl0ZW1bZ3MtbWF4LXc9XCI4XCJde21heC13aWR0aDo2Ni42NjY2NjY2NjY3JX0uZ3JpZC1zdGFjaz4uZ3JpZC1zdGFjay1pdGVtW2dzLXc9XCI5XCJde3dpZHRoOjc1JX0uZ3JpZC1zdGFjaz4uZ3JpZC1zdGFjay1pdGVtW2dzLXg9XCI5XCJde2xlZnQ6NzUlfS5ncmlkLXN0YWNrPi5ncmlkLXN0YWNrLWl0ZW1bZ3MtbWluLXc9XCI5XCJde21pbi13aWR0aDo3NSV9LmdyaWQtc3RhY2s+LmdyaWQtc3RhY2staXRlbVtncy1tYXgtdz1cIjlcIl17bWF4LXdpZHRoOjc1JX0uZ3JpZC1zdGFjaz4uZ3JpZC1zdGFjay1pdGVtW2dzLXc9XCIxMFwiXXt3aWR0aDo4My4zMzMzMzMzMzMzJX0uZ3JpZC1zdGFjaz4uZ3JpZC1zdGFjay1pdGVtW2dzLXg9XCIxMFwiXXtsZWZ0OjgzLjMzMzMzMzMzMzMlfS5ncmlkLXN0YWNrPi5ncmlkLXN0YWNrLWl0ZW1bZ3MtbWluLXc9XCIxMFwiXXttaW4td2lkdGg6ODMuMzMzMzMzMzMzMyV9LmdyaWQtc3RhY2s+LmdyaWQtc3RhY2staXRlbVtncy1tYXgtdz1cIjEwXCJde21heC13aWR0aDo4My4zMzMzMzMzMzMzJX0uZ3JpZC1zdGFjaz4uZ3JpZC1zdGFjay1pdGVtW2dzLXc9XCIxMVwiXXt3aWR0aDo5MS42NjY2NjY2NjY3JX0uZ3JpZC1zdGFjaz4uZ3JpZC1zdGFjay1pdGVtW2dzLXg9XCIxMVwiXXtsZWZ0OjkxLjY2NjY2NjY2NjclfS5ncmlkLXN0YWNrPi5ncmlkLXN0YWNrLWl0ZW1bZ3MtbWluLXc9XCIxMVwiXXttaW4td2lkdGg6OTEuNjY2NjY2NjY2NyV9LmdyaWQtc3RhY2s+LmdyaWQtc3RhY2staXRlbVtncy1tYXgtdz1cIjExXCJde21heC13aWR0aDo5MS42NjY2NjY2NjY3JX0uZ3JpZC1zdGFjaz4uZ3JpZC1zdGFjay1pdGVtW2dzLXc9XCIxMlwiXXt3aWR0aDoxMDAlfS5ncmlkLXN0YWNrPi5ncmlkLXN0YWNrLWl0ZW1bZ3MteD1cIjEyXCJde2xlZnQ6MTAwJX0uZ3JpZC1zdGFjaz4uZ3JpZC1zdGFjay1pdGVtW2dzLW1pbi13PVwiMTJcIl17bWluLXdpZHRoOjEwMCV9LmdyaWQtc3RhY2s+LmdyaWQtc3RhY2staXRlbVtncy1tYXgtdz1cIjEyXCJde21heC13aWR0aDoxMDAlfS5ncmlkLXN0YWNrLmdyaWQtc3RhY2stMT4uZ3JpZC1zdGFjay1pdGVte21pbi13aWR0aDoxMDAlfS5ncmlkLXN0YWNrLmdyaWQtc3RhY2stMT4uZ3JpZC1zdGFjay1pdGVtW2dzLXc9XCIxXCJde3dpZHRoOjEwMCV9LmdyaWQtc3RhY2suZ3JpZC1zdGFjay0xPi5ncmlkLXN0YWNrLWl0ZW1bZ3MteD1cIjFcIl17bGVmdDoxMDAlfS5ncmlkLXN0YWNrLmdyaWQtc3RhY2stMT4uZ3JpZC1zdGFjay1pdGVtW2dzLW1pbi13PVwiMVwiXXttaW4td2lkdGg6MTAwJX0uZ3JpZC1zdGFjay5ncmlkLXN0YWNrLTE+LmdyaWQtc3RhY2staXRlbVtncy1tYXgtdz1cIjFcIl17bWF4LXdpZHRoOjEwMCV9LmdyaWQtc3RhY2suZ3JpZC1zdGFjay1hbmltYXRlLC5ncmlkLXN0YWNrLmdyaWQtc3RhY2stYW5pbWF0ZSAuZ3JpZC1zdGFjay1pdGVtey13ZWJraXQtdHJhbnNpdGlvbjpsZWZ0IC4zcyx0b3AgLjNzLGhlaWdodCAuM3Msd2lkdGggLjNzOy1tb3otdHJhbnNpdGlvbjpsZWZ0IC4zcyx0b3AgLjNzLGhlaWdodCAuM3Msd2lkdGggLjNzOy1tcy10cmFuc2l0aW9uOmxlZnQgLjNzLHRvcCAuM3MsaGVpZ2h0IC4zcyx3aWR0aCAuM3M7LW8tdHJhbnNpdGlvbjpsZWZ0IC4zcyx0b3AgLjNzLGhlaWdodCAuM3Msd2lkdGggLjNzO3RyYW5zaXRpb246bGVmdCAuM3MsdG9wIC4zcyxoZWlnaHQgLjNzLHdpZHRoIC4zc30uZ3JpZC1zdGFjay5ncmlkLXN0YWNrLWFuaW1hdGUgLmdyaWQtc3RhY2staXRlbS5ncmlkLXN0YWNrLXBsYWNlaG9sZGVyLC5ncmlkLXN0YWNrLmdyaWQtc3RhY2stYW5pbWF0ZSAuZ3JpZC1zdGFjay1pdGVtLnVpLWRyYWdnYWJsZS1kcmFnZ2luZywuZ3JpZC1zdGFjay5ncmlkLXN0YWNrLWFuaW1hdGUgLmdyaWQtc3RhY2staXRlbS51aS1yZXNpemFibGUtcmVzaXppbmd7LXdlYmtpdC10cmFuc2l0aW9uOmxlZnQgMHMsdG9wIDBzLGhlaWdodCAwcyx3aWR0aCAwczstbW96LXRyYW5zaXRpb246bGVmdCAwcyx0b3AgMHMsaGVpZ2h0IDBzLHdpZHRoIDBzOy1tcy10cmFuc2l0aW9uOmxlZnQgMHMsdG9wIDBzLGhlaWdodCAwcyx3aWR0aCAwczstby10cmFuc2l0aW9uOmxlZnQgMHMsdG9wIDBzLGhlaWdodCAwcyx3aWR0aCAwczt0cmFuc2l0aW9uOmxlZnQgMHMsdG9wIDBzLGhlaWdodCAwcyx3aWR0aCAwc30udWktZHJhZ2dhYmxlLWRyYWdnaW5nLC51aS1yZXNpemFibGUtcmVzaXppbmd7ei1pbmRleDoxMDB9LnVpLWRyYWdnYWJsZS1kcmFnZ2luZz4uZ3JpZC1zdGFjay1pdGVtLWNvbnRlbnQsLnVpLXJlc2l6YWJsZS1yZXNpemluZz4uZ3JpZC1zdGFjay1pdGVtLWNvbnRlbnR7Ym94LXNoYWRvdzoxcHggNHB4IDZweCByZ2JhKDAsMCwwLDAuMik7b3BhY2l0eTouOH0udWktZHJhZ2dhYmxlLWRyYWdnaW5ne3dpbGwtY2hhbmdlOmxlZnQsdG9wO2N1cnNvcjptb3ZlfS51aS1yZXNpemFibGUtcmVzaXppbmd7d2lsbC1jaGFuZ2U6d2lkdGgsaGVpZ2h0fVxuYCwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi8uLi9ub2RlX21vZHVsZXMvZ3JpZHN0YWNrL2Rpc3QvZ3JpZHN0YWNrLm1pbi5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUEsNENBQTRDLFdBQVcsQ0FBQyxZQUFZLGlCQUFpQixDQUFDLDJCQUEyQixhQUFhLENBQUMsNENBQTRDLGFBQWEsQ0FBQyx5REFBeUQsZ0NBQStCLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxvQkFBbUIsQ0FBQyxpQkFBaUIsQ0FBQyw2QkFBNkIsdUJBQXVCLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLHNEQUFzRCxRQUFRLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxrREFBa0QsaUJBQWlCLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsQ0FBQyxpQkFBaUIsQ0FBQyxnSkFBZ0osWUFBWSxDQUFDLDRGQUE0Rix3REFBNDFELENBQUMsMkJBQTJCLENBQUMsMEJBQTBCLENBQUMsK0JBQStCLENBQUMsNEJBQTRCLENBQUMsMkJBQTJCLENBQUMsMEJBQTBCLENBQUMsdUJBQXVCLENBQUMsOENBQThDLGdDQUFnQyxDQUFDLDZCQUE2QixDQUFDLDRCQUE0QixDQUFDLDJCQUEyQixDQUFDLHdCQUF3QixDQUFDLDhDQUE4QyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyw2Q0FBNkMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyw4Q0FBOEMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsNkNBQTZDLGVBQWUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyw4Q0FBOEMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyw2Q0FBNkMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyw4Q0FBOEMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyw2Q0FBNkMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLHdFQUF3RSx1QkFBc0IsQ0FBQyx1Q0FBdUMsUUFBUSxDQUFDLHVDQUF1QyxNQUFNLENBQUMsMkNBQTJDLFdBQVcsQ0FBQywyQ0FBMkMsWUFBWSxDQUFDLHVDQUF1QyxtQkFBbUIsQ0FBQyx1Q0FBdUMsa0JBQWtCLENBQUMsMkNBQTJDLHVCQUF1QixDQUFDLDJDQUEyQyx1QkFBdUIsQ0FBQyx1Q0FBdUMsb0JBQW9CLENBQUMsdUNBQXVDLG1CQUFtQixDQUFDLDJDQUEyQyx3QkFBd0IsQ0FBQywyQ0FBMkMsd0JBQXdCLENBQUMsdUNBQXVDLFNBQVMsQ0FBQyx1Q0FBdUMsUUFBUSxDQUFDLDJDQUEyQyxhQUFhLENBQUMsMkNBQTJDLGFBQWEsQ0FBQyx1Q0FBdUMsb0JBQW9CLENBQUMsdUNBQXVDLG1CQUFtQixDQUFDLDJDQUEyQyx3QkFBd0IsQ0FBQywyQ0FBMkMsd0JBQXdCLENBQUMsdUNBQXVDLG9CQUFvQixDQUFDLHVDQUF1QyxtQkFBbUIsQ0FBQywyQ0FBMkMsd0JBQXdCLENBQUMsMkNBQTJDLHdCQUF3QixDQUFDLHVDQUF1QyxTQUFTLENBQUMsdUNBQXVDLFFBQVEsQ0FBQywyQ0FBMkMsYUFBYSxDQUFDLDJDQUEyQyxhQUFhLENBQUMsdUNBQXVDLG9CQUFvQixDQUFDLHVDQUF1QyxtQkFBbUIsQ0FBQywyQ0FBMkMsd0JBQXdCLENBQUMsMkNBQTJDLHdCQUF3QixDQUFDLHVDQUF1QyxvQkFBb0IsQ0FBQyx1Q0FBdUMsbUJBQW1CLENBQUMsMkNBQTJDLHdCQUF3QixDQUFDLDJDQUEyQyx3QkFBd0IsQ0FBQyx1Q0FBdUMsU0FBUyxDQUFDLHVDQUF1QyxRQUFRLENBQUMsMkNBQTJDLGFBQWEsQ0FBQywyQ0FBMkMsYUFBYSxDQUFDLHdDQUF3QyxvQkFBb0IsQ0FBQyx3Q0FBd0MsbUJBQW1CLENBQUMsNENBQTRDLHdCQUF3QixDQUFDLDRDQUE0Qyx3QkFBd0IsQ0FBQyx3Q0FBd0Msb0JBQW9CLENBQUMsd0NBQXdDLG1CQUFtQixDQUFDLDRDQUE0Qyx3QkFBd0IsQ0FBQyw0Q0FBNEMsd0JBQXdCLENBQUMsd0NBQXdDLFVBQVUsQ0FBQyx3Q0FBd0MsU0FBUyxDQUFDLDRDQUE0QyxjQUFjLENBQUMsNENBQTRDLGNBQWMsQ0FBQywwQ0FBMEMsY0FBYyxDQUFDLG9EQUFvRCxVQUFVLENBQUMsb0RBQW9ELFNBQVMsQ0FBQyx3REFBd0QsY0FBYyxDQUFDLHdEQUF3RCxjQUFjLENBQUMsK0VBQStFLHdEQUF3RCxDQUFDLHFEQUFxRCxDQUFDLG9EQUFvRCxDQUFDLG1EQUFtRCxDQUFDLGdEQUFnRCxDQUFDLG1OQUFtTixvREFBb0QsQ0FBQyxpREFBaUQsQ0FBQyxnREFBZ0QsQ0FBQywrQ0FBK0MsQ0FBQyw0Q0FBNEMsQ0FBQyw4Q0FBOEMsV0FBVyxDQUFDLGdHQUFnRyxzQ0FBcUMsQ0FBQyxVQUFVLENBQUMsdUJBQXVCLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyx1QkFBdUIsd0JBQXdCXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjpyb290IC5ncmlkLXN0YWNrLWl0ZW0+LnVpLXJlc2l6YWJsZS1oYW5kbGV7ZmlsdGVyOm5vbmV9LmdyaWQtc3RhY2t7cG9zaXRpb246cmVsYXRpdmV9LmdyaWQtc3RhY2suZ3JpZC1zdGFjay1ydGx7ZGlyZWN0aW9uOmx0cn0uZ3JpZC1zdGFjay5ncmlkLXN0YWNrLXJ0bD4uZ3JpZC1zdGFjay1pdGVte2RpcmVjdGlvbjpydGx9LmdyaWQtc3RhY2sgLmdyaWQtc3RhY2stcGxhY2Vob2xkZXI+LnBsYWNlaG9sZGVyLWNvbnRlbnR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xKTttYXJnaW46MDtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDphdXRvO3otaW5kZXg6MCFpbXBvcnRhbnQ7dGV4dC1hbGlnbjpjZW50ZXJ9LmdyaWQtc3RhY2s+LmdyaWQtc3RhY2staXRlbXttaW4td2lkdGg6OC4zMzMzMzMzMzMzJTtwb3NpdGlvbjphYnNvbHV0ZTtwYWRkaW5nOjB9LmdyaWQtc3RhY2s+LmdyaWQtc3RhY2staXRlbT4uZ3JpZC1zdGFjay1pdGVtLWNvbnRlbnR7bWFyZ2luOjA7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6YXV0bztvdmVyZmxvdy14OmhpZGRlbjtvdmVyZmxvdy15OmF1dG99LmdyaWQtc3RhY2s+LmdyaWQtc3RhY2staXRlbT4udWktcmVzaXphYmxlLWhhbmRsZXtwb3NpdGlvbjphYnNvbHV0ZTtmb250LXNpemU6LjFweDtkaXNwbGF5OmJsb2NrOy1tcy10b3VjaC1hY3Rpb246bm9uZTt0b3VjaC1hY3Rpb246bm9uZX0uZ3JpZC1zdGFjaz4uZ3JpZC1zdGFjay1pdGVtLnVpLXJlc2l6YWJsZS1hdXRvaGlkZT4udWktcmVzaXphYmxlLWhhbmRsZSwuZ3JpZC1zdGFjaz4uZ3JpZC1zdGFjay1pdGVtLnVpLXJlc2l6YWJsZS1kaXNhYmxlZD4udWktcmVzaXphYmxlLWhhbmRsZXtkaXNwbGF5Om5vbmV9LmdyaWQtc3RhY2s+LmdyaWQtc3RhY2staXRlbT4udWktcmVzaXphYmxlLXNlLC5ncmlkLXN0YWNrPi5ncmlkLXN0YWNrLWl0ZW0+LnVpLXJlc2l6YWJsZS1zd3tiYWNrZ3JvdW5kLWltYWdlOnVybChkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBEOTRiV3dnZG1WeWMybHZiajBpTVM0d0lpQmxibU52WkdsdVp6MGlhWE52TFRnNE5Ua3RNU0kvUGdvOElTMHRJRWRsYm1WeVlYUnZjam9nUVdSdlltVWdTV3hzZFhOMGNtRjBiM0lnTVRZdU1DNHdMQ0JUVmtjZ1JYaHdiM0owSUZCc2RXY3RTVzRnTGlCVFZrY2dWbVZ5YzJsdmJqb2dOaTR3TUNCQ2RXbHNaQ0F3S1NBZ0xTMCtDandoUkU5RFZGbFFSU0J6ZG1jZ1VGVkNURWxESUNJdEx5OVhNME12TDBSVVJDQlRWa2NnTVM0eEx5OUZUaUlnSW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTDBkeVlYQm9hV056TDFOV1J5OHhMakV2UkZSRUwzTjJaekV4TG1SMFpDSStDanh6ZG1jZ2VHMXNibk05SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpJd01EQXZjM1puSWlCNGJXeHVjenA0YkdsdWF6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNVGs1T1M5NGJHbHVheUlnZG1WeWMybHZiajBpTVM0eElpQnBaRDBpUTJGd1lWOHhJaUI0UFNJd2NIZ2lJSGs5SWpCd2VDSWdkMmxrZEdnOUlqRTJjSGdpSUdobGFXZG9kRDBpTVRad2VDSWdkbWxsZDBKdmVEMGlNQ0F3SURVeE1TNDJNallnTlRFeExqWXlOeUlnYzNSNWJHVTlJbVZ1WVdKc1pTMWlZV05yWjNKdmRXNWtPbTVsZHlBd0lEQWdOVEV4TGpZeU5pQTFNVEV1TmpJM095SWdlRzFzT25Od1lXTmxQU0p3Y21WelpYSjJaU0krQ2p4blBnb0pQSEJoZEdnZ1pEMGlUVE15T0M0NU1EWXNOREF4TGprNU5HZ3RNell1TlRVelZqRXdPUzQyTXpab016WXVOVFV6WXpRdU9UUTRMREFzT1M0eU16WXRNUzQ0TURrc01USXVPRFEzTFRVdU5ESTJZek11TmpFekxUTXVOakUxTERVdU5ESXhMVGN1T0RrNExEVXVOREl4TFRFeUxqZzBOU0FnSUdNd0xUUXVPVFE1TFRFdU9EQXhMVGt1TWpNeExUVXVOREk0TFRFeUxqZzFNV3d0TnpNdU1EZzNMVGN6TGpBNVF6STJOUzR3TkRRc01TNDRNRGtzTWpZd0xqYzJMREFzTWpVMUxqZ3hNeXd3WXkwMExqazBPQ3d3TFRrdU1qSTVMREV1T0RBNUxURXlMamcwTnl3MUxqUXlOQ0FnSUd3dE56TXVNRGc0TERjekxqQTVZeTB6TGpZeE9Dd3pMall4T1MwMUxqUXlOQ3czTGprd01pMDFMalF5TkN3eE1pNDROVEZqTUN3MExqazBOaXd4TGpnd055dzVMakl5T1N3MUxqUXlOQ3d4TWk0NE5EVmpNeTQyTVRrc015NDJNVGNzTnk0NU1ERXNOUzQwTWpZc01USXVPRFVzTlM0ME1qWWdJQ0JvTXpZdU5UUTFkakk1TWk0ek5UaG9MVE0yTGpVME1tTXROQzQ1TlRJc01DMDVMakl6TlN3eExqZ3dPQzB4TWk0NE5TdzFMalF5TVdNdE15NDJNVGNzTXk0Mk1qRXROUzQwTWpRc055NDVNRFV0TlM0ME1qUXNNVEl1T0RVMElDQWdZekFzTkM0NU5EVXNNUzQ0TURjc09TNHlNamNzTlM0ME1qUXNNVEl1T0RRM2JEY3pMakE0T1N3M015NHdPRGhqTXk0Mk1UY3NNeTQyTVRjc055NDRPVGdzTlM0ME1qUXNNVEl1T0RRM0xEVXVOREkwWXpRdU9UVXNNQ3c1TGpJek5DMHhMamd3Tnl3eE1pNDRORGt0TlM0ME1qUWdJQ0JzTnpNdU1EZzNMVGN6TGpBNE9HTXpMall4TXkwekxqWXlMRFV1TkRJeExUY3VPVEF4TERVdU5ESXhMVEV5TGpnME4yTXdMVFF1T1RRNExURXVPREE0TFRrdU1qTXlMVFV1TkRJeExURXlMamcxTkNBZ0lFTXpNemd1TVRReUxEUXdNeTQ0TURJc016TXpMamcxTnl3ME1ERXVPVGswTERNeU9DNDVNRFlzTkRBeExqazVOSG9pSUdacGJHdzlJaU0yTmpZMk5qWWlMejRLUEM5blBnbzhaejRLUEM5blBnbzhaejRLUEM5blBnbzhaejRLUEM5blBnbzhaejRLUEM5blBnbzhaejRLUEM5blBnbzhaejRLUEM5blBnbzhaejRLUEM5blBnbzhaejRLUEM5blBnbzhaejRLUEM5blBnbzhaejRLUEM5blBnbzhaejRLUEM5blBnbzhaejRLUEM5blBnbzhaejRLUEM5blBnbzhaejRLUEM5blBnbzhaejRLUEM5blBnbzhMM04yWno0Syk7YmFja2dyb3VuZC1yZXBlYXQ6bm8tcmVwZWF0O2JhY2tncm91bmQtcG9zaXRpb246Y2VudGVyOy13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSg0NWRlZyk7LW1vei10cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKTstbXMtdHJhbnNmb3JtOnJvdGF0ZSg0NWRlZyk7LW8tdHJhbnNmb3JtOnJvdGF0ZSg0NWRlZyk7dHJhbnNmb3JtOnJvdGF0ZSg0NWRlZyl9LmdyaWQtc3RhY2s+LmdyaWQtc3RhY2staXRlbT4udWktcmVzaXphYmxlLXNley13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpOy1tb3otdHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpOy1tcy10cmFuc2Zvcm06cm90YXRlKC00NWRlZyk7LW8tdHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpO3RyYW5zZm9ybTpyb3RhdGUoLTQ1ZGVnKX0uZ3JpZC1zdGFjaz4uZ3JpZC1zdGFjay1pdGVtPi51aS1yZXNpemFibGUtbnd7Y3Vyc29yOm53LXJlc2l6ZTt3aWR0aDoyMHB4O2hlaWdodDoyMHB4O3RvcDowfS5ncmlkLXN0YWNrPi5ncmlkLXN0YWNrLWl0ZW0+LnVpLXJlc2l6YWJsZS1ue2N1cnNvcjpuLXJlc2l6ZTtoZWlnaHQ6MTBweDt0b3A6MDtsZWZ0OjI1cHg7cmlnaHQ6MjVweH0uZ3JpZC1zdGFjaz4uZ3JpZC1zdGFjay1pdGVtPi51aS1yZXNpemFibGUtbmV7Y3Vyc29yOm5lLXJlc2l6ZTt3aWR0aDoyMHB4O2hlaWdodDoyMHB4O3RvcDowfS5ncmlkLXN0YWNrPi5ncmlkLXN0YWNrLWl0ZW0+LnVpLXJlc2l6YWJsZS1le2N1cnNvcjplLXJlc2l6ZTt3aWR0aDoxMHB4O3RvcDoxNXB4O2JvdHRvbToxNXB4fS5ncmlkLXN0YWNrPi5ncmlkLXN0YWNrLWl0ZW0+LnVpLXJlc2l6YWJsZS1zZXtjdXJzb3I6c2UtcmVzaXplO3dpZHRoOjIwcHg7aGVpZ2h0OjIwcHh9LmdyaWQtc3RhY2s+LmdyaWQtc3RhY2staXRlbT4udWktcmVzaXphYmxlLXN7Y3Vyc29yOnMtcmVzaXplO2hlaWdodDoxMHB4O2xlZnQ6MjVweDtib3R0b206MDtyaWdodDoyNXB4fS5ncmlkLXN0YWNrPi5ncmlkLXN0YWNrLWl0ZW0+LnVpLXJlc2l6YWJsZS1zd3tjdXJzb3I6c3ctcmVzaXplO3dpZHRoOjIwcHg7aGVpZ2h0OjIwcHh9LmdyaWQtc3RhY2s+LmdyaWQtc3RhY2staXRlbT4udWktcmVzaXphYmxlLXd7Y3Vyc29yOnctcmVzaXplO3dpZHRoOjEwcHg7dG9wOjE1cHg7Ym90dG9tOjE1cHh9LmdyaWQtc3RhY2s+LmdyaWQtc3RhY2staXRlbS51aS1kcmFnZ2FibGUtZHJhZ2dpbmc+LnVpLXJlc2l6YWJsZS1oYW5kbGV7ZGlzcGxheTpub25lIWltcG9ydGFudH0uZ3JpZC1zdGFjaz4uZ3JpZC1zdGFjay1pdGVtW2dzLXc9XFxcIjBcXFwiXXt3aWR0aDowJX0uZ3JpZC1zdGFjaz4uZ3JpZC1zdGFjay1pdGVtW2dzLXg9XFxcIjBcXFwiXXtsZWZ0OjB9LmdyaWQtc3RhY2s+LmdyaWQtc3RhY2staXRlbVtncy1taW4tdz1cXFwiMFxcXCJde21pbi13aWR0aDowfS5ncmlkLXN0YWNrPi5ncmlkLXN0YWNrLWl0ZW1bZ3MtbWF4LXc9XFxcIjBcXFwiXXttYXgtd2lkdGg6MCV9LmdyaWQtc3RhY2s+LmdyaWQtc3RhY2staXRlbVtncy13PVxcXCIxXFxcIl17d2lkdGg6OC4zMzMzMzMzMzMzJX0uZ3JpZC1zdGFjaz4uZ3JpZC1zdGFjay1pdGVtW2dzLXg9XFxcIjFcXFwiXXtsZWZ0OjguMzMzMzMzMzMzMyV9LmdyaWQtc3RhY2s+LmdyaWQtc3RhY2staXRlbVtncy1taW4tdz1cXFwiMVxcXCJde21pbi13aWR0aDo4LjMzMzMzMzMzMzMlfS5ncmlkLXN0YWNrPi5ncmlkLXN0YWNrLWl0ZW1bZ3MtbWF4LXc9XFxcIjFcXFwiXXttYXgtd2lkdGg6OC4zMzMzMzMzMzMzJX0uZ3JpZC1zdGFjaz4uZ3JpZC1zdGFjay1pdGVtW2dzLXc9XFxcIjJcXFwiXXt3aWR0aDoxNi42NjY2NjY2NjY3JX0uZ3JpZC1zdGFjaz4uZ3JpZC1zdGFjay1pdGVtW2dzLXg9XFxcIjJcXFwiXXtsZWZ0OjE2LjY2NjY2NjY2NjclfS5ncmlkLXN0YWNrPi5ncmlkLXN0YWNrLWl0ZW1bZ3MtbWluLXc9XFxcIjJcXFwiXXttaW4td2lkdGg6MTYuNjY2NjY2NjY2NyV9LmdyaWQtc3RhY2s+LmdyaWQtc3RhY2staXRlbVtncy1tYXgtdz1cXFwiMlxcXCJde21heC13aWR0aDoxNi42NjY2NjY2NjY3JX0uZ3JpZC1zdGFjaz4uZ3JpZC1zdGFjay1pdGVtW2dzLXc9XFxcIjNcXFwiXXt3aWR0aDoyNSV9LmdyaWQtc3RhY2s+LmdyaWQtc3RhY2staXRlbVtncy14PVxcXCIzXFxcIl17bGVmdDoyNSV9LmdyaWQtc3RhY2s+LmdyaWQtc3RhY2staXRlbVtncy1taW4tdz1cXFwiM1xcXCJde21pbi13aWR0aDoyNSV9LmdyaWQtc3RhY2s+LmdyaWQtc3RhY2staXRlbVtncy1tYXgtdz1cXFwiM1xcXCJde21heC13aWR0aDoyNSV9LmdyaWQtc3RhY2s+LmdyaWQtc3RhY2staXRlbVtncy13PVxcXCI0XFxcIl17d2lkdGg6MzMuMzMzMzMzMzMzMyV9LmdyaWQtc3RhY2s+LmdyaWQtc3RhY2staXRlbVtncy14PVxcXCI0XFxcIl17bGVmdDozMy4zMzMzMzMzMzMzJX0uZ3JpZC1zdGFjaz4uZ3JpZC1zdGFjay1pdGVtW2dzLW1pbi13PVxcXCI0XFxcIl17bWluLXdpZHRoOjMzLjMzMzMzMzMzMzMlfS5ncmlkLXN0YWNrPi5ncmlkLXN0YWNrLWl0ZW1bZ3MtbWF4LXc9XFxcIjRcXFwiXXttYXgtd2lkdGg6MzMuMzMzMzMzMzMzMyV9LmdyaWQtc3RhY2s+LmdyaWQtc3RhY2staXRlbVtncy13PVxcXCI1XFxcIl17d2lkdGg6NDEuNjY2NjY2NjY2NyV9LmdyaWQtc3RhY2s+LmdyaWQtc3RhY2staXRlbVtncy14PVxcXCI1XFxcIl17bGVmdDo0MS42NjY2NjY2NjY3JX0uZ3JpZC1zdGFjaz4uZ3JpZC1zdGFjay1pdGVtW2dzLW1pbi13PVxcXCI1XFxcIl17bWluLXdpZHRoOjQxLjY2NjY2NjY2NjclfS5ncmlkLXN0YWNrPi5ncmlkLXN0YWNrLWl0ZW1bZ3MtbWF4LXc9XFxcIjVcXFwiXXttYXgtd2lkdGg6NDEuNjY2NjY2NjY2NyV9LmdyaWQtc3RhY2s+LmdyaWQtc3RhY2staXRlbVtncy13PVxcXCI2XFxcIl17d2lkdGg6NTAlfS5ncmlkLXN0YWNrPi5ncmlkLXN0YWNrLWl0ZW1bZ3MteD1cXFwiNlxcXCJde2xlZnQ6NTAlfS5ncmlkLXN0YWNrPi5ncmlkLXN0YWNrLWl0ZW1bZ3MtbWluLXc9XFxcIjZcXFwiXXttaW4td2lkdGg6NTAlfS5ncmlkLXN0YWNrPi5ncmlkLXN0YWNrLWl0ZW1bZ3MtbWF4LXc9XFxcIjZcXFwiXXttYXgtd2lkdGg6NTAlfS5ncmlkLXN0YWNrPi5ncmlkLXN0YWNrLWl0ZW1bZ3Mtdz1cXFwiN1xcXCJde3dpZHRoOjU4LjMzMzMzMzMzMzMlfS5ncmlkLXN0YWNrPi5ncmlkLXN0YWNrLWl0ZW1bZ3MteD1cXFwiN1xcXCJde2xlZnQ6NTguMzMzMzMzMzMzMyV9LmdyaWQtc3RhY2s+LmdyaWQtc3RhY2staXRlbVtncy1taW4tdz1cXFwiN1xcXCJde21pbi13aWR0aDo1OC4zMzMzMzMzMzMzJX0uZ3JpZC1zdGFjaz4uZ3JpZC1zdGFjay1pdGVtW2dzLW1heC13PVxcXCI3XFxcIl17bWF4LXdpZHRoOjU4LjMzMzMzMzMzMzMlfS5ncmlkLXN0YWNrPi5ncmlkLXN0YWNrLWl0ZW1bZ3Mtdz1cXFwiOFxcXCJde3dpZHRoOjY2LjY2NjY2NjY2NjclfS5ncmlkLXN0YWNrPi5ncmlkLXN0YWNrLWl0ZW1bZ3MteD1cXFwiOFxcXCJde2xlZnQ6NjYuNjY2NjY2NjY2NyV9LmdyaWQtc3RhY2s+LmdyaWQtc3RhY2staXRlbVtncy1taW4tdz1cXFwiOFxcXCJde21pbi13aWR0aDo2Ni42NjY2NjY2NjY3JX0uZ3JpZC1zdGFjaz4uZ3JpZC1zdGFjay1pdGVtW2dzLW1heC13PVxcXCI4XFxcIl17bWF4LXdpZHRoOjY2LjY2NjY2NjY2NjclfS5ncmlkLXN0YWNrPi5ncmlkLXN0YWNrLWl0ZW1bZ3Mtdz1cXFwiOVxcXCJde3dpZHRoOjc1JX0uZ3JpZC1zdGFjaz4uZ3JpZC1zdGFjay1pdGVtW2dzLXg9XFxcIjlcXFwiXXtsZWZ0Ojc1JX0uZ3JpZC1zdGFjaz4uZ3JpZC1zdGFjay1pdGVtW2dzLW1pbi13PVxcXCI5XFxcIl17bWluLXdpZHRoOjc1JX0uZ3JpZC1zdGFjaz4uZ3JpZC1zdGFjay1pdGVtW2dzLW1heC13PVxcXCI5XFxcIl17bWF4LXdpZHRoOjc1JX0uZ3JpZC1zdGFjaz4uZ3JpZC1zdGFjay1pdGVtW2dzLXc9XFxcIjEwXFxcIl17d2lkdGg6ODMuMzMzMzMzMzMzMyV9LmdyaWQtc3RhY2s+LmdyaWQtc3RhY2staXRlbVtncy14PVxcXCIxMFxcXCJde2xlZnQ6ODMuMzMzMzMzMzMzMyV9LmdyaWQtc3RhY2s+LmdyaWQtc3RhY2staXRlbVtncy1taW4tdz1cXFwiMTBcXFwiXXttaW4td2lkdGg6ODMuMzMzMzMzMzMzMyV9LmdyaWQtc3RhY2s+LmdyaWQtc3RhY2staXRlbVtncy1tYXgtdz1cXFwiMTBcXFwiXXttYXgtd2lkdGg6ODMuMzMzMzMzMzMzMyV9LmdyaWQtc3RhY2s+LmdyaWQtc3RhY2staXRlbVtncy13PVxcXCIxMVxcXCJde3dpZHRoOjkxLjY2NjY2NjY2NjclfS5ncmlkLXN0YWNrPi5ncmlkLXN0YWNrLWl0ZW1bZ3MteD1cXFwiMTFcXFwiXXtsZWZ0OjkxLjY2NjY2NjY2NjclfS5ncmlkLXN0YWNrPi5ncmlkLXN0YWNrLWl0ZW1bZ3MtbWluLXc9XFxcIjExXFxcIl17bWluLXdpZHRoOjkxLjY2NjY2NjY2NjclfS5ncmlkLXN0YWNrPi5ncmlkLXN0YWNrLWl0ZW1bZ3MtbWF4LXc9XFxcIjExXFxcIl17bWF4LXdpZHRoOjkxLjY2NjY2NjY2NjclfS5ncmlkLXN0YWNrPi5ncmlkLXN0YWNrLWl0ZW1bZ3Mtdz1cXFwiMTJcXFwiXXt3aWR0aDoxMDAlfS5ncmlkLXN0YWNrPi5ncmlkLXN0YWNrLWl0ZW1bZ3MteD1cXFwiMTJcXFwiXXtsZWZ0OjEwMCV9LmdyaWQtc3RhY2s+LmdyaWQtc3RhY2staXRlbVtncy1taW4tdz1cXFwiMTJcXFwiXXttaW4td2lkdGg6MTAwJX0uZ3JpZC1zdGFjaz4uZ3JpZC1zdGFjay1pdGVtW2dzLW1heC13PVxcXCIxMlxcXCJde21heC13aWR0aDoxMDAlfS5ncmlkLXN0YWNrLmdyaWQtc3RhY2stMT4uZ3JpZC1zdGFjay1pdGVte21pbi13aWR0aDoxMDAlfS5ncmlkLXN0YWNrLmdyaWQtc3RhY2stMT4uZ3JpZC1zdGFjay1pdGVtW2dzLXc9XFxcIjFcXFwiXXt3aWR0aDoxMDAlfS5ncmlkLXN0YWNrLmdyaWQtc3RhY2stMT4uZ3JpZC1zdGFjay1pdGVtW2dzLXg9XFxcIjFcXFwiXXtsZWZ0OjEwMCV9LmdyaWQtc3RhY2suZ3JpZC1zdGFjay0xPi5ncmlkLXN0YWNrLWl0ZW1bZ3MtbWluLXc9XFxcIjFcXFwiXXttaW4td2lkdGg6MTAwJX0uZ3JpZC1zdGFjay5ncmlkLXN0YWNrLTE+LmdyaWQtc3RhY2staXRlbVtncy1tYXgtdz1cXFwiMVxcXCJde21heC13aWR0aDoxMDAlfS5ncmlkLXN0YWNrLmdyaWQtc3RhY2stYW5pbWF0ZSwuZ3JpZC1zdGFjay5ncmlkLXN0YWNrLWFuaW1hdGUgLmdyaWQtc3RhY2staXRlbXstd2Via2l0LXRyYW5zaXRpb246bGVmdCAuM3MsdG9wIC4zcyxoZWlnaHQgLjNzLHdpZHRoIC4zczstbW96LXRyYW5zaXRpb246bGVmdCAuM3MsdG9wIC4zcyxoZWlnaHQgLjNzLHdpZHRoIC4zczstbXMtdHJhbnNpdGlvbjpsZWZ0IC4zcyx0b3AgLjNzLGhlaWdodCAuM3Msd2lkdGggLjNzOy1vLXRyYW5zaXRpb246bGVmdCAuM3MsdG9wIC4zcyxoZWlnaHQgLjNzLHdpZHRoIC4zczt0cmFuc2l0aW9uOmxlZnQgLjNzLHRvcCAuM3MsaGVpZ2h0IC4zcyx3aWR0aCAuM3N9LmdyaWQtc3RhY2suZ3JpZC1zdGFjay1hbmltYXRlIC5ncmlkLXN0YWNrLWl0ZW0uZ3JpZC1zdGFjay1wbGFjZWhvbGRlciwuZ3JpZC1zdGFjay5ncmlkLXN0YWNrLWFuaW1hdGUgLmdyaWQtc3RhY2staXRlbS51aS1kcmFnZ2FibGUtZHJhZ2dpbmcsLmdyaWQtc3RhY2suZ3JpZC1zdGFjay1hbmltYXRlIC5ncmlkLXN0YWNrLWl0ZW0udWktcmVzaXphYmxlLXJlc2l6aW5ney13ZWJraXQtdHJhbnNpdGlvbjpsZWZ0IDBzLHRvcCAwcyxoZWlnaHQgMHMsd2lkdGggMHM7LW1vei10cmFuc2l0aW9uOmxlZnQgMHMsdG9wIDBzLGhlaWdodCAwcyx3aWR0aCAwczstbXMtdHJhbnNpdGlvbjpsZWZ0IDBzLHRvcCAwcyxoZWlnaHQgMHMsd2lkdGggMHM7LW8tdHJhbnNpdGlvbjpsZWZ0IDBzLHRvcCAwcyxoZWlnaHQgMHMsd2lkdGggMHM7dHJhbnNpdGlvbjpsZWZ0IDBzLHRvcCAwcyxoZWlnaHQgMHMsd2lkdGggMHN9LnVpLWRyYWdnYWJsZS1kcmFnZ2luZywudWktcmVzaXphYmxlLXJlc2l6aW5ne3otaW5kZXg6MTAwfS51aS1kcmFnZ2FibGUtZHJhZ2dpbmc+LmdyaWQtc3RhY2staXRlbS1jb250ZW50LC51aS1yZXNpemFibGUtcmVzaXppbmc+LmdyaWQtc3RhY2staXRlbS1jb250ZW50e2JveC1zaGFkb3c6MXB4IDRweCA2cHggcmdiYSgwLDAsMCwuMik7b3BhY2l0eTouOH0udWktZHJhZ2dhYmxlLWRyYWdnaW5ne3dpbGwtY2hhbmdlOmxlZnQsdG9wO2N1cnNvcjptb3ZlfS51aS1yZXNpemFibGUtcmVzaXppbmd7d2lsbC1jaGFuZ2U6d2lkdGgsaGVpZ2h0fVwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///588\n')},254:(module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Z: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _advanced_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7537);\n/* harmony import */ var _advanced_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_advanced_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _advanced_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(3645);\n/* harmony import */ var _advanced_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_advanced_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _advanced_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_advanced_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.chart-title{font-size:20px;font-weight:bold}.chart-subtitle{font-size:15px;font-weight:bold;text-align:center}.chart-subtitle.column{width:100%;text-align:left !important}.chart-error-message{font-size:15px;font-style:italic}.chart-path{fill:none;stroke-width:1.5}.chart-area{stroke-width:1.5}.listening-rect{stroke:grey;fill:white}.question-mark{cursor:pointer;opacity:0.2;transform:scale(0.05);-ms-transform:scale(0.05);-webkit-transform:scale(0.05)}.question-mark:hover{opacity:0.5}.question-mark-legacy{cursor:pointer;opacity:0.2;float:right;margin-right:5px;border:3px solid black;border-radius:15px;height:30px;width:30px;text-align:center;line-height:22px;font-family:monospace;font-weight:bold;font-size:27px;transform:scale(0.8);-ms-transform:scale(0.8);-webkit-transform:scale(0.8)}.question-mark-legacy:hover{opacity:0.5}.grid-stack-item-content{overflow:hidden !important;box-shadow:0 1px 3px rgba(0,0,0,0.12),0 1px 2px rgba(0,0,0,0.24);transition:all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1);background:#fff}.grid-stack-item-removing{opacity:0.5}.subgrid{margin-right:20px}.grid-stack>.grid-stack-item.grid-stack-sub-grid>.grid-stack-item-content{background:rgba(0,0,0,0.05)}.grid-stack.grid-stack-nested{background:none;position:absolute;inset:0}body{height:100%;margin:0;padding:0}.wrapper{display:flex;font-family:"Roboto"}.grid{width:100%;height:100%}.grid .grid-stack{min-height:500px}.sidebar-hidden{visibility:hidden;display:none}.sidebar{visibility:visible;display:flex;flex-direction:column;gap:10px;padding:10px}.dropzone-remove{border:3px dashed red;opacity:0.5;height:100px;display:flex;justify-content:center;align-items:center}.dropzone-remove:hover{opacity:1}.available-widgets{border:3px dashed grey;padding:10px;display:flex;flex-direction:column;gap:10px}\n`, "",{"version":3,"sources":["webpack://./../src/css/widget-theme.scss","webpack://./../src/css/styles.scss"],"names":[],"mappings":"AAEA,aACE,cAAe,CACf,gBAAiB,CAClB,gBAGC,cAAe,CACf,gBAAiB,CACjB,iBAAkB,CACnB,uBAIC,UAAW,CACX,0BAA0B,CAC3B,qBAGC,cAAe,CACf,iBAAkB,CACnB,YAGC,SAAU,CACV,gBAAiB,CAClB,YAGC,gBAAiB,CAClB,gBAGC,WAAY,CACZ,UAAW,CACZ,eAGC,cAAe,CACf,WAAY,CACZ,qBAAsB,CACtB,yBAA0B,CAC1B,6BAA8B,CALhC,qBAOI,WAAY,CACb,sBAID,cAAe,CACf,WAAY,CACZ,WAAY,CACZ,gBAAiB,CACjB,sBAAuB,CACvB,kBAAmB,CACnB,WAAY,CACZ,UAAW,CACX,iBAAkB,CAClB,gBAAiB,CACjB,qBAAsB,CACtB,gBAAiB,CACjB,cAAe,CACf,oBAAqB,CACrB,wBAAyB,CACzB,4BAA6B,CAhB/B,4BAkBI,WAAY,CACb,yBAID,0BAA2B,CAC3B,gEAAwE,CACxE,oDAAqD,CACrD,eAAkC,CACnC,0BAGC,WAAY,CACb,SAGC,iBAAkB,CACnB,0EAIC,2BAA+B,CAGhC,8BAEC,eAAgB,CAGhB,iBAAkB,CAClB,OAAQ,CC/FV,KACE,WAAY,CACZ,QAAS,CACT,SAAU,CACX,SAGC,YAAa,CACb,oBAAqB,CACtB,MAEC,UAAW,CACX,WAAY,CAFd,kBAII,gBAAiB,CAClB,gBAGD,iBAAkB,CAClB,YAAa,CACd,SAEC,kBAAmB,CACnB,YAAa,CACb,qBAAsB,CACtB,QAAS,CACT,YAAa,CACd,iBAEC,qBAAsB,CACtB,WAAY,CACZ,YAAa,CACb,YAAa,CACb,sBAAuB,CACvB,kBAAmB,CANrB,uBAQI,SAAU,CACX,mBAGD,sBAAuB,CACvB,YAAa,CACb,YAAa,CACb,qBAAsB,CACtB,QAAS","sourcesContent":["@import \\"theme-variables\\";\\n\\n.chart-title {\\n font-size: 20px;\\n font-weight: bold;\\n}\\n\\n.chart-subtitle {\\n font-size: 15px;\\n font-weight: bold;\\n text-align: center;\\n}\\n\\n.chart-subtitle.column\\n{\\n width: 100%;\\n text-align:left !important;\\n}\\n\\n.chart-error-message {\\n font-size: 15px;\\n font-style: italic;\\n}\\n\\n.chart-path {\\n fill: none;\\n stroke-width: 1.5;\\n}\\n\\n.chart-area {\\n stroke-width: 1.5;\\n}\\n\\n.listening-rect {\\n stroke: grey;\\n fill: white;\\n}\\n\\n.question-mark {\\n cursor: pointer;\\n opacity: 0.2;\\n transform: scale(0.05);\\n -ms-transform: scale(0.05);\\n -webkit-transform: scale(0.05);\\n &:hover {\\n opacity: 0.5;\\n }\\n}\\n\\n.question-mark-legacy {\\n cursor: pointer;\\n opacity: 0.2;\\n float: right;\\n margin-right: 5px;\\n border: 3px solid black;\\n border-radius: 15px;\\n height: 30px;\\n width: 30px;\\n text-align: center;\\n line-height: 22px;\\n font-family: monospace;\\n font-weight: bold;\\n font-size: 27px;\\n transform: scale(0.8);\\n -ms-transform: scale(0.8);\\n -webkit-transform: scale(0.8);\\n &:hover {\\n opacity: 0.5;\\n }\\n}\\n\\n.grid-stack-item-content {\\n overflow: hidden !important;\\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24);\\n transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1);\\n background: rgba(255, 255, 255, 1);\\n}\\n\\n.grid-stack-item-removing {\\n opacity: 0.5;\\n}\\n\\n.subgrid {\\n margin-right: 20px;\\n}\\n\\n/* make nested grid have slightly darker bg take almost all space (need some to tell them apart) so items inside can have similar to external size+margin */\\n.grid-stack > .grid-stack-item.grid-stack-sub-grid > .grid-stack-item-content {\\n background: rgba(0, 0, 0, 0.05);\\n //inset: 0 2px;\\n //overflow: hidden !important;\\n}\\n.grid-stack.grid-stack-nested {\\n background: none;\\n /* background-color: red; */\\n /* take entire space */\\n position: absolute;\\n inset: 0; /* TODO change top: if you have content in nested grid */\\n}\\n","@import \\"widget-theme.scss\\";\\n\\nbody {\\n height: 100%;\\n margin: 0;\\n padding: 0;\\n}\\n\\n.wrapper {\\n display: flex;\\n font-family: \\"Roboto\\";\\n}\\n.grid {\\n width: 100%;\\n height: 100%;\\n .grid-stack {\\n min-height: 500px;\\n }\\n}\\n.sidebar-hidden {\\n visibility: hidden;\\n display: none;\\n}\\n.sidebar {\\n visibility: visible;\\n display: flex;\\n flex-direction: column;\\n gap: 10px;\\n padding: 10px;\\n}\\n.dropzone-remove {\\n border: 3px dashed red;\\n opacity: 0.5;\\n height: 100px;\\n display: flex;\\n justify-content: center;\\n align-items: center;\\n &:hover {\\n opacity: 1;\\n }\\n}\\n.available-widgets {\\n border: 3px dashed grey;\\n padding: 10px;\\n display: flex;\\n flex-direction: column;\\n gap: 10px;\\n}\\n"],"sourceRoot":""}]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjU0LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNzSDtBQUNqQjtBQUNyRyw4QkFBOEIsNEZBQTJCLENBQUMscUdBQXFDO0FBQy9GO0FBQ0EsdURBQXVELGVBQWUsaUJBQWlCLGdCQUFnQixlQUFlLGlCQUFpQixrQkFBa0IsdUJBQXVCLFdBQVcsMkJBQTJCLHFCQUFxQixlQUFlLGtCQUFrQixZQUFZLFVBQVUsaUJBQWlCLFlBQVksaUJBQWlCLGdCQUFnQixZQUFZLFdBQVcsZUFBZSxlQUFlLFlBQVksc0JBQXNCLDBCQUEwQiw4QkFBOEIscUJBQXFCLFlBQVksc0JBQXNCLGVBQWUsWUFBWSxZQUFZLGlCQUFpQix1QkFBdUIsbUJBQW1CLFlBQVksV0FBVyxrQkFBa0IsaUJBQWlCLHNCQUFzQixpQkFBaUIsZUFBZSxxQkFBcUIseUJBQXlCLDZCQUE2Qiw0QkFBNEIsWUFBWSx5QkFBeUIsMkJBQTJCLGlFQUFpRSxxREFBcUQsZ0JBQWdCLDBCQUEwQixZQUFZLFNBQVMsa0JBQWtCLDBFQUEwRSw0QkFBNEIsOEJBQThCLGdCQUFnQixrQkFBa0IsUUFBUSxLQUFLLFlBQVksU0FBUyxVQUFVLFNBQVMsYUFBYSxxQkFBcUIsTUFBTSxXQUFXLFlBQVksa0JBQWtCLGlCQUFpQixnQkFBZ0Isa0JBQWtCLGFBQWEsU0FBUyxtQkFBbUIsYUFBYSxzQkFBc0IsU0FBUyxhQUFhLGlCQUFpQixzQkFBc0IsWUFBWSxhQUFhLGFBQWEsdUJBQXVCLG1CQUFtQix1QkFBdUIsVUFBVSxtQkFBbUIsdUJBQXVCLGFBQWEsYUFBYSxzQkFBc0I7QUFDenhELE9BQU8sbXBDQUFtcEMsa0JBQWtCLG9CQUFvQixzQkFBc0IsR0FBRyxxQkFBcUIsb0JBQW9CLHNCQUFzQix1QkFBdUIsR0FBRyw2QkFBNkIsZ0JBQWdCLCtCQUErQixHQUFHLDBCQUEwQixvQkFBb0IsdUJBQXVCLEdBQUcsaUJBQWlCLGVBQWUsc0JBQXNCLEdBQUcsaUJBQWlCLHNCQUFzQixHQUFHLHFCQUFxQixpQkFBaUIsZ0JBQWdCLEdBQUcsb0JBQW9CLG9CQUFvQixpQkFBaUIsMkJBQTJCLCtCQUErQixtQ0FBbUMsYUFBYSxtQkFBbUIsS0FBSyxHQUFHLDJCQUEyQixvQkFBb0IsaUJBQWlCLGlCQUFpQixzQkFBc0IsNEJBQTRCLHdCQUF3QixpQkFBaUIsZ0JBQWdCLHVCQUF1QixzQkFBc0IsMkJBQTJCLHNCQUFzQixvQkFBb0IsMEJBQTBCLDhCQUE4QixrQ0FBa0MsYUFBYSxtQkFBbUIsS0FBSyxHQUFHLDhCQUE4QixnQ0FBZ0MsNkVBQTZFLDBEQUEwRCx1Q0FBdUMsR0FBRywrQkFBK0IsaUJBQWlCLEdBQUcsY0FBYyx1QkFBdUIsR0FBRyxpUEFBaVAsb0NBQW9DLG1CQUFtQixrQ0FBa0MsR0FBRyxpQ0FBaUMscUJBQXFCLDhCQUE4QixvREFBb0QsY0FBYyw0REFBNEQsbUNBQW1DLFVBQVUsaUJBQWlCLGNBQWMsZUFBZSxHQUFHLGNBQWMsa0JBQWtCLDRCQUE0QixHQUFHLFNBQVMsZ0JBQWdCLGlCQUFpQixpQkFBaUIsd0JBQXdCLEtBQUssR0FBRyxtQkFBbUIsdUJBQXVCLGtCQUFrQixHQUFHLFlBQVksd0JBQXdCLGtCQUFrQiwyQkFBMkIsY0FBYyxrQkFBa0IsR0FBRyxvQkFBb0IsMkJBQTJCLGlCQUFpQixrQkFBa0Isa0JBQWtCLDRCQUE0Qix3QkFBd0IsYUFBYSxpQkFBaUIsS0FBSyxHQUFHLHNCQUFzQiw0QkFBNEIsa0JBQWtCLGtCQUFrQiwyQkFBMkIsY0FBYyxHQUFHLHFCQUFxQjtBQUM1ekg7QUFDQSxpRUFBZSx1QkFBdUIsRUFBQyIsInNvdXJjZXMiOlsid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9zcmMvY3NzL3N0eWxlcy5zY3NzPzY2ZTUiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uL2FkdmFuY2VkL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi9hZHZhbmNlZC9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgYC5jaGFydC10aXRsZXtmb250LXNpemU6MjBweDtmb250LXdlaWdodDpib2xkfS5jaGFydC1zdWJ0aXRsZXtmb250LXNpemU6MTVweDtmb250LXdlaWdodDpib2xkO3RleHQtYWxpZ246Y2VudGVyfS5jaGFydC1zdWJ0aXRsZS5jb2x1bW57d2lkdGg6MTAwJTt0ZXh0LWFsaWduOmxlZnQgIWltcG9ydGFudH0uY2hhcnQtZXJyb3ItbWVzc2FnZXtmb250LXNpemU6MTVweDtmb250LXN0eWxlOml0YWxpY30uY2hhcnQtcGF0aHtmaWxsOm5vbmU7c3Ryb2tlLXdpZHRoOjEuNX0uY2hhcnQtYXJlYXtzdHJva2Utd2lkdGg6MS41fS5saXN0ZW5pbmctcmVjdHtzdHJva2U6Z3JleTtmaWxsOndoaXRlfS5xdWVzdGlvbi1tYXJre2N1cnNvcjpwb2ludGVyO29wYWNpdHk6MC4yO3RyYW5zZm9ybTpzY2FsZSgwLjA1KTstbXMtdHJhbnNmb3JtOnNjYWxlKDAuMDUpOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKDAuMDUpfS5xdWVzdGlvbi1tYXJrOmhvdmVye29wYWNpdHk6MC41fS5xdWVzdGlvbi1tYXJrLWxlZ2FjeXtjdXJzb3I6cG9pbnRlcjtvcGFjaXR5OjAuMjtmbG9hdDpyaWdodDttYXJnaW4tcmlnaHQ6NXB4O2JvcmRlcjozcHggc29saWQgYmxhY2s7Ym9yZGVyLXJhZGl1czoxNXB4O2hlaWdodDozMHB4O3dpZHRoOjMwcHg7dGV4dC1hbGlnbjpjZW50ZXI7bGluZS1oZWlnaHQ6MjJweDtmb250LWZhbWlseTptb25vc3BhY2U7Zm9udC13ZWlnaHQ6Ym9sZDtmb250LXNpemU6MjdweDt0cmFuc2Zvcm06c2NhbGUoMC44KTstbXMtdHJhbnNmb3JtOnNjYWxlKDAuOCk7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoMC44KX0ucXVlc3Rpb24tbWFyay1sZWdhY3k6aG92ZXJ7b3BhY2l0eTowLjV9LmdyaWQtc3RhY2staXRlbS1jb250ZW50e292ZXJmbG93OmhpZGRlbiAhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAxcHggM3B4IHJnYmEoMCwwLDAsMC4xMiksMCAxcHggMnB4IHJnYmEoMCwwLDAsMC4yNCk7dHJhbnNpdGlvbjphbGwgMC4zcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtiYWNrZ3JvdW5kOiNmZmZ9LmdyaWQtc3RhY2staXRlbS1yZW1vdmluZ3tvcGFjaXR5OjAuNX0uc3ViZ3JpZHttYXJnaW4tcmlnaHQ6MjBweH0uZ3JpZC1zdGFjaz4uZ3JpZC1zdGFjay1pdGVtLmdyaWQtc3RhY2stc3ViLWdyaWQ+LmdyaWQtc3RhY2staXRlbS1jb250ZW50e2JhY2tncm91bmQ6cmdiYSgwLDAsMCwwLjA1KX0uZ3JpZC1zdGFjay5ncmlkLXN0YWNrLW5lc3RlZHtiYWNrZ3JvdW5kOm5vbmU7cG9zaXRpb246YWJzb2x1dGU7aW5zZXQ6MH1ib2R5e2hlaWdodDoxMDAlO21hcmdpbjowO3BhZGRpbmc6MH0ud3JhcHBlcntkaXNwbGF5OmZsZXg7Zm9udC1mYW1pbHk6XCJSb2JvdG9cIn0uZ3JpZHt3aWR0aDoxMDAlO2hlaWdodDoxMDAlfS5ncmlkIC5ncmlkLXN0YWNre21pbi1oZWlnaHQ6NTAwcHh9LnNpZGViYXItaGlkZGVue3Zpc2liaWxpdHk6aGlkZGVuO2Rpc3BsYXk6bm9uZX0uc2lkZWJhcnt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtnYXA6MTBweDtwYWRkaW5nOjEwcHh9LmRyb3B6b25lLXJlbW92ZXtib3JkZXI6M3B4IGRhc2hlZCByZWQ7b3BhY2l0eTowLjU7aGVpZ2h0OjEwMHB4O2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2FsaWduLWl0ZW1zOmNlbnRlcn0uZHJvcHpvbmUtcmVtb3ZlOmhvdmVye29wYWNpdHk6MX0uYXZhaWxhYmxlLXdpZGdldHN7Ym9yZGVyOjNweCBkYXNoZWQgZ3JleTtwYWRkaW5nOjEwcHg7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtnYXA6MTBweH1cbmAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vLi4vc3JjL2Nzcy93aWRnZXQtdGhlbWUuc2Nzc1wiLFwid2VicGFjazovLy4vLi4vc3JjL2Nzcy9zdHlsZXMuc2Nzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFFQSxhQUNFLGNBQWUsQ0FDZixnQkFBaUIsQ0FDbEIsZ0JBR0MsY0FBZSxDQUNmLGdCQUFpQixDQUNqQixpQkFBa0IsQ0FDbkIsdUJBSUMsVUFBVyxDQUNYLDBCQUEwQixDQUMzQixxQkFHQyxjQUFlLENBQ2YsaUJBQWtCLENBQ25CLFlBR0MsU0FBVSxDQUNWLGdCQUFpQixDQUNsQixZQUdDLGdCQUFpQixDQUNsQixnQkFHQyxXQUFZLENBQ1osVUFBVyxDQUNaLGVBR0MsY0FBZSxDQUNmLFdBQVksQ0FDWixxQkFBc0IsQ0FDdEIseUJBQTBCLENBQzFCLDZCQUE4QixDQUxoQyxxQkFPSSxXQUFZLENBQ2Isc0JBSUQsY0FBZSxDQUNmLFdBQVksQ0FDWixXQUFZLENBQ1osZ0JBQWlCLENBQ2pCLHNCQUF1QixDQUN2QixrQkFBbUIsQ0FDbkIsV0FBWSxDQUNaLFVBQVcsQ0FDWCxpQkFBa0IsQ0FDbEIsZ0JBQWlCLENBQ2pCLHFCQUFzQixDQUN0QixnQkFBaUIsQ0FDakIsY0FBZSxDQUNmLG9CQUFxQixDQUNyQix3QkFBeUIsQ0FDekIsNEJBQTZCLENBaEIvQiw0QkFrQkksV0FBWSxDQUNiLHlCQUlELDBCQUEyQixDQUMzQixnRUFBd0UsQ0FDeEUsb0RBQXFELENBQ3JELGVBQWtDLENBQ25DLDBCQUdDLFdBQVksQ0FDYixTQUdDLGlCQUFrQixDQUNuQiwwRUFJQywyQkFBK0IsQ0FHaEMsOEJBRUMsZUFBZ0IsQ0FHaEIsaUJBQWtCLENBQ2xCLE9BQVEsQ0MvRlYsS0FDRSxXQUFZLENBQ1osUUFBUyxDQUNULFNBQVUsQ0FDWCxTQUdDLFlBQWEsQ0FDYixvQkFBcUIsQ0FDdEIsTUFFQyxVQUFXLENBQ1gsV0FBWSxDQUZkLGtCQUlJLGdCQUFpQixDQUNsQixnQkFHRCxpQkFBa0IsQ0FDbEIsWUFBYSxDQUNkLFNBRUMsa0JBQW1CLENBQ25CLFlBQWEsQ0FDYixxQkFBc0IsQ0FDdEIsUUFBUyxDQUNULFlBQWEsQ0FDZCxpQkFFQyxxQkFBc0IsQ0FDdEIsV0FBWSxDQUNaLFlBQWEsQ0FDYixZQUFhLENBQ2Isc0JBQXVCLENBQ3ZCLGtCQUFtQixDQU5yQix1QkFRSSxTQUFVLENBQ1gsbUJBR0Qsc0JBQXVCLENBQ3ZCLFlBQWEsQ0FDYixZQUFhLENBQ2IscUJBQXNCLENBQ3RCLFFBQVNcIixcInNvdXJjZXNDb250ZW50XCI6W1wiQGltcG9ydCBcXFwidGhlbWUtdmFyaWFibGVzXFxcIjtcXG5cXG4uY2hhcnQtdGl0bGUge1xcbiAgZm9udC1zaXplOiAyMHB4O1xcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxufVxcblxcbi5jaGFydC1zdWJ0aXRsZSB7XFxuICBmb250LXNpemU6IDE1cHg7XFxuICBmb250LXdlaWdodDogYm9sZDtcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG59XFxuXFxuLmNoYXJ0LXN1YnRpdGxlLmNvbHVtblxcbntcXG4gIHdpZHRoOiAxMDAlO1xcbiAgdGV4dC1hbGlnbjpsZWZ0ICFpbXBvcnRhbnQ7XFxufVxcblxcbi5jaGFydC1lcnJvci1tZXNzYWdlIHtcXG4gIGZvbnQtc2l6ZTogMTVweDtcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG59XFxuXFxuLmNoYXJ0LXBhdGgge1xcbiAgZmlsbDogbm9uZTtcXG4gIHN0cm9rZS13aWR0aDogMS41O1xcbn1cXG5cXG4uY2hhcnQtYXJlYSB7XFxuICBzdHJva2Utd2lkdGg6IDEuNTtcXG59XFxuXFxuLmxpc3RlbmluZy1yZWN0IHtcXG4gIHN0cm9rZTogZ3JleTtcXG4gIGZpbGw6IHdoaXRlO1xcbn1cXG5cXG4ucXVlc3Rpb24tbWFyayB7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxuICBvcGFjaXR5OiAwLjI7XFxuICB0cmFuc2Zvcm06IHNjYWxlKDAuMDUpO1xcbiAgLW1zLXRyYW5zZm9ybTogc2NhbGUoMC4wNSk7XFxuICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMC4wNSk7XFxuICAmOmhvdmVyIHtcXG4gICAgb3BhY2l0eTogMC41O1xcbiAgfVxcbn1cXG5cXG4ucXVlc3Rpb24tbWFyay1sZWdhY3kge1xcbiAgY3Vyc29yOiBwb2ludGVyO1xcbiAgb3BhY2l0eTogMC4yO1xcbiAgZmxvYXQ6IHJpZ2h0O1xcbiAgbWFyZ2luLXJpZ2h0OiA1cHg7XFxuICBib3JkZXI6IDNweCBzb2xpZCBibGFjaztcXG4gIGJvcmRlci1yYWRpdXM6IDE1cHg7XFxuICBoZWlnaHQ6IDMwcHg7XFxuICB3aWR0aDogMzBweDtcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gIGxpbmUtaGVpZ2h0OiAyMnB4O1xcbiAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTtcXG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xcbiAgZm9udC1zaXplOiAyN3B4O1xcbiAgdHJhbnNmb3JtOiBzY2FsZSgwLjgpO1xcbiAgLW1zLXRyYW5zZm9ybTogc2NhbGUoMC44KTtcXG4gIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgwLjgpO1xcbiAgJjpob3ZlciB7XFxuICAgIG9wYWNpdHk6IDAuNTtcXG4gIH1cXG59XFxuXFxuLmdyaWQtc3RhY2staXRlbS1jb250ZW50IHtcXG4gIG92ZXJmbG93OiBoaWRkZW4gIWltcG9ydGFudDtcXG4gIGJveC1zaGFkb3c6IDAgMXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTIpLCAwIDFweCAycHggcmdiYSgwLCAwLCAwLCAwLjI0KTtcXG4gIHRyYW5zaXRpb246IGFsbCAwLjNzIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpO1xcbiAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAxKTtcXG59XFxuXFxuLmdyaWQtc3RhY2staXRlbS1yZW1vdmluZyB7XFxuICBvcGFjaXR5OiAwLjU7XFxufVxcblxcbi5zdWJncmlkIHtcXG4gIG1hcmdpbi1yaWdodDogMjBweDtcXG59XFxuXFxuLyogbWFrZSBuZXN0ZWQgZ3JpZCBoYXZlIHNsaWdodGx5IGRhcmtlciBiZyB0YWtlIGFsbW9zdCBhbGwgc3BhY2UgKG5lZWQgc29tZSB0byB0ZWxsIHRoZW0gYXBhcnQpIHNvIGl0ZW1zIGluc2lkZSBjYW4gaGF2ZSBzaW1pbGFyIHRvIGV4dGVybmFsIHNpemUrbWFyZ2luICovXFxuLmdyaWQtc3RhY2sgPiAuZ3JpZC1zdGFjay1pdGVtLmdyaWQtc3RhY2stc3ViLWdyaWQgPiAuZ3JpZC1zdGFjay1pdGVtLWNvbnRlbnQge1xcbiAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjA1KTtcXG4gIC8vaW5zZXQ6IDAgMnB4O1xcbiAgLy9vdmVyZmxvdzogaGlkZGVuICFpbXBvcnRhbnQ7XFxufVxcbi5ncmlkLXN0YWNrLmdyaWQtc3RhY2stbmVzdGVkIHtcXG4gIGJhY2tncm91bmQ6IG5vbmU7XFxuICAvKiBiYWNrZ3JvdW5kLWNvbG9yOiByZWQ7ICovXFxuICAvKiB0YWtlIGVudGlyZSBzcGFjZSAqL1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgaW5zZXQ6IDA7IC8qIFRPRE8gY2hhbmdlIHRvcDogaWYgeW91IGhhdmUgY29udGVudCBpbiBuZXN0ZWQgZ3JpZCAqL1xcbn1cXG5cIixcIkBpbXBvcnQgXFxcIndpZGdldC10aGVtZS5zY3NzXFxcIjtcXG5cXG5ib2R5IHtcXG4gIGhlaWdodDogMTAwJTtcXG4gIG1hcmdpbjogMDtcXG4gIHBhZGRpbmc6IDA7XFxufVxcblxcbi53cmFwcGVyIHtcXG4gIGRpc3BsYXk6IGZsZXg7XFxuICBmb250LWZhbWlseTogXFxcIlJvYm90b1xcXCI7XFxufVxcbi5ncmlkIHtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgaGVpZ2h0OiAxMDAlO1xcbiAgLmdyaWQtc3RhY2sge1xcbiAgICBtaW4taGVpZ2h0OiA1MDBweDtcXG4gIH1cXG59XFxuLnNpZGViYXItaGlkZGVuIHtcXG4gIHZpc2liaWxpdHk6IGhpZGRlbjtcXG4gIGRpc3BsYXk6IG5vbmU7XFxufVxcbi5zaWRlYmFyIHtcXG4gIHZpc2liaWxpdHk6IHZpc2libGU7XFxuICBkaXNwbGF5OiBmbGV4O1xcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcXG4gIGdhcDogMTBweDtcXG4gIHBhZGRpbmc6IDEwcHg7XFxufVxcbi5kcm9wem9uZS1yZW1vdmUge1xcbiAgYm9yZGVyOiAzcHggZGFzaGVkIHJlZDtcXG4gIG9wYWNpdHk6IDAuNTtcXG4gIGhlaWdodDogMTAwcHg7XFxuICBkaXNwbGF5OiBmbGV4O1xcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgJjpob3ZlciB7XFxuICAgIG9wYWNpdHk6IDE7XFxuICB9XFxufVxcbi5hdmFpbGFibGUtd2lkZ2V0cyB7XFxuICBib3JkZXI6IDNweCBkYXNoZWQgZ3JleTtcXG4gIHBhZGRpbmc6IDEwcHg7XFxuICBkaXNwbGF5OiBmbGV4O1xcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcXG4gIGdhcDogMTBweDtcXG59XFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///254\n')},3645:module=>{"use strict";eval('\n\n/*\n MIT License http://www.opensource.org/licenses/mit-license.php\n Author Tobias Koppers @sokra\n*/\nmodule.exports = function (cssWithMappingToString) {\n var list = [];\n\n // return the list of modules as css string\n list.toString = function toString() {\n return this.map(function (item) {\n var content = "";\n var needLayer = typeof item[5] !== "undefined";\n if (item[4]) {\n content += "@supports (".concat(item[4], ") {");\n }\n if (item[2]) {\n content += "@media ".concat(item[2], " {");\n }\n if (needLayer) {\n content += "@layer".concat(item[5].length > 0 ? " ".concat(item[5]) : "", " {");\n }\n content += cssWithMappingToString(item);\n if (needLayer) {\n content += "}";\n }\n if (item[2]) {\n content += "}";\n }\n if (item[4]) {\n content += "}";\n }\n return content;\n }).join("");\n };\n\n // import a list of modules into the list\n list.i = function i(modules, media, dedupe, supports, layer) {\n if (typeof modules === "string") {\n modules = [[null, modules, undefined]];\n }\n var alreadyImportedModules = {};\n if (dedupe) {\n for (var k = 0; k < this.length; k++) {\n var id = this[k][0];\n if (id != null) {\n alreadyImportedModules[id] = true;\n }\n }\n }\n for (var _k = 0; _k < modules.length; _k++) {\n var item = [].concat(modules[_k]);\n if (dedupe && alreadyImportedModules[item[0]]) {\n continue;\n }\n if (typeof layer !== "undefined") {\n if (typeof item[5] === "undefined") {\n item[5] = layer;\n } else {\n item[1] = "@layer".concat(item[5].length > 0 ? " ".concat(item[5]) : "", " {").concat(item[1], "}");\n item[5] = layer;\n }\n }\n if (media) {\n if (!item[2]) {\n item[2] = media;\n } else {\n item[1] = "@media ".concat(item[2], " {").concat(item[1], "}");\n item[2] = media;\n }\n }\n if (supports) {\n if (!item[4]) {\n item[4] = "".concat(supports);\n } else {\n item[1] = "@supports (".concat(item[4], ") {").concat(item[1], "}");\n item[4] = supports;\n }\n }\n list.push(item);\n }\n };\n return list;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzY0NS5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscURBQXFEO0FBQ3JEO0FBQ0E7QUFDQSxnREFBZ0Q7QUFDaEQ7QUFDQTtBQUNBLHFGQUFxRjtBQUNyRjtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsaUJBQWlCO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixxQkFBcUI7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Ysc0ZBQXNGLHFCQUFxQjtBQUMzRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1YsaURBQWlELHFCQUFxQjtBQUN0RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Ysc0RBQXNELHFCQUFxQjtBQUMzRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qcz8yNGZiIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG4vKlxuICBNSVQgTGljZW5zZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocFxuICBBdXRob3IgVG9iaWFzIEtvcHBlcnMgQHNva3JhXG4qL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoY3NzV2l0aE1hcHBpbmdUb1N0cmluZykge1xuICB2YXIgbGlzdCA9IFtdO1xuXG4gIC8vIHJldHVybiB0aGUgbGlzdCBvZiBtb2R1bGVzIGFzIGNzcyBzdHJpbmdcbiAgbGlzdC50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgdmFyIGNvbnRlbnQgPSBcIlwiO1xuICAgICAgdmFyIG5lZWRMYXllciA9IHR5cGVvZiBpdGVtWzVdICE9PSBcInVuZGVmaW5lZFwiO1xuICAgICAgaWYgKGl0ZW1bNF0pIHtcbiAgICAgICAgY29udGVudCArPSBcIkBzdXBwb3J0cyAoXCIuY29uY2F0KGl0ZW1bNF0sIFwiKSB7XCIpO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW1bMl0pIHtcbiAgICAgICAgY29udGVudCArPSBcIkBtZWRpYSBcIi5jb25jYXQoaXRlbVsyXSwgXCIge1wiKTtcbiAgICAgIH1cbiAgICAgIGlmIChuZWVkTGF5ZXIpIHtcbiAgICAgICAgY29udGVudCArPSBcIkBsYXllclwiLmNvbmNhdChpdGVtWzVdLmxlbmd0aCA+IDAgPyBcIiBcIi5jb25jYXQoaXRlbVs1XSkgOiBcIlwiLCBcIiB7XCIpO1xuICAgICAgfVxuICAgICAgY29udGVudCArPSBjc3NXaXRoTWFwcGluZ1RvU3RyaW5nKGl0ZW0pO1xuICAgICAgaWYgKG5lZWRMYXllcikge1xuICAgICAgICBjb250ZW50ICs9IFwifVwiO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW1bMl0pIHtcbiAgICAgICAgY29udGVudCArPSBcIn1cIjtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtWzRdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJ9XCI7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29udGVudDtcbiAgICB9KS5qb2luKFwiXCIpO1xuICB9O1xuXG4gIC8vIGltcG9ydCBhIGxpc3Qgb2YgbW9kdWxlcyBpbnRvIHRoZSBsaXN0XG4gIGxpc3QuaSA9IGZ1bmN0aW9uIGkobW9kdWxlcywgbWVkaWEsIGRlZHVwZSwgc3VwcG9ydHMsIGxheWVyKSB7XG4gICAgaWYgKHR5cGVvZiBtb2R1bGVzID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBtb2R1bGVzID0gW1tudWxsLCBtb2R1bGVzLCB1bmRlZmluZWRdXTtcbiAgICB9XG4gICAgdmFyIGFscmVhZHlJbXBvcnRlZE1vZHVsZXMgPSB7fTtcbiAgICBpZiAoZGVkdXBlKSB7XG4gICAgICBmb3IgKHZhciBrID0gMDsgayA8IHRoaXMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgdmFyIGlkID0gdGhpc1trXVswXTtcbiAgICAgICAgaWYgKGlkICE9IG51bGwpIHtcbiAgICAgICAgICBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzW2lkXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZm9yICh2YXIgX2sgPSAwOyBfayA8IG1vZHVsZXMubGVuZ3RoOyBfaysrKSB7XG4gICAgICB2YXIgaXRlbSA9IFtdLmNvbmNhdChtb2R1bGVzW19rXSk7XG4gICAgICBpZiAoZGVkdXBlICYmIGFscmVhZHlJbXBvcnRlZE1vZHVsZXNbaXRlbVswXV0pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGxheWVyICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaXRlbVs1XSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgIGl0ZW1bNV0gPSBsYXllcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzFdID0gXCJAbGF5ZXJcIi5jb25jYXQoaXRlbVs1XS5sZW5ndGggPiAwID8gXCIgXCIuY29uY2F0KGl0ZW1bNV0pIDogXCJcIiwgXCIge1wiKS5jb25jYXQoaXRlbVsxXSwgXCJ9XCIpO1xuICAgICAgICAgIGl0ZW1bNV0gPSBsYXllcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG1lZGlhKSB7XG4gICAgICAgIGlmICghaXRlbVsyXSkge1xuICAgICAgICAgIGl0ZW1bMl0gPSBtZWRpYTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzFdID0gXCJAbWVkaWEgXCIuY29uY2F0KGl0ZW1bMl0sIFwiIHtcIikuY29uY2F0KGl0ZW1bMV0sIFwifVwiKTtcbiAgICAgICAgICBpdGVtWzJdID0gbWVkaWE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzdXBwb3J0cykge1xuICAgICAgICBpZiAoIWl0ZW1bNF0pIHtcbiAgICAgICAgICBpdGVtWzRdID0gXCJcIi5jb25jYXQoc3VwcG9ydHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGl0ZW1bMV0gPSBcIkBzdXBwb3J0cyAoXCIuY29uY2F0KGl0ZW1bNF0sIFwiKSB7XCIpLmNvbmNhdChpdGVtWzFdLCBcIn1cIik7XG4gICAgICAgICAgaXRlbVs0XSA9IHN1cHBvcnRzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsaXN0LnB1c2goaXRlbSk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gbGlzdDtcbn07Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///3645\n')},1667:module=>{"use strict";eval('\n\nmodule.exports = function (url, options) {\n if (!options) {\n options = {};\n }\n if (!url) {\n return url;\n }\n url = String(url.__esModule ? url.default : url);\n\n // If url is already wrapped in quotes, remove them\n if (/^[\'"].*[\'"]$/.test(url)) {\n url = url.slice(1, -1);\n }\n if (options.hash) {\n url += options.hash;\n }\n\n // Should url be wrapped?\n // See https://drafts.csswg.org/css-values-3/#urls\n if (/["\'() \\t\\n]|(%20)/.test(url) || options.needQuotes) {\n return "\\"".concat(url.replace(/"/g, \'\\\\"\').replace(/\\n/g, "\\\\n"), "\\"");\n }\n return url;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTY2Ny5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2dldFVybC5qcz8xZGU1Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh1cmwsIG9wdGlvbnMpIHtcbiAgaWYgKCFvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG4gIGlmICghdXJsKSB7XG4gICAgcmV0dXJuIHVybDtcbiAgfVxuICB1cmwgPSBTdHJpbmcodXJsLl9fZXNNb2R1bGUgPyB1cmwuZGVmYXVsdCA6IHVybCk7XG5cbiAgLy8gSWYgdXJsIGlzIGFscmVhZHkgd3JhcHBlZCBpbiBxdW90ZXMsIHJlbW92ZSB0aGVtXG4gIGlmICgvXlsnXCJdLipbJ1wiXSQvLnRlc3QodXJsKSkge1xuICAgIHVybCA9IHVybC5zbGljZSgxLCAtMSk7XG4gIH1cbiAgaWYgKG9wdGlvbnMuaGFzaCkge1xuICAgIHVybCArPSBvcHRpb25zLmhhc2g7XG4gIH1cblxuICAvLyBTaG91bGQgdXJsIGJlIHdyYXBwZWQ/XG4gIC8vIFNlZSBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcvY3NzLXZhbHVlcy0zLyN1cmxzXG4gIGlmICgvW1wiJygpIFxcdFxcbl18KCUyMCkvLnRlc3QodXJsKSB8fCBvcHRpb25zLm5lZWRRdW90ZXMpIHtcbiAgICByZXR1cm4gXCJcXFwiXCIuY29uY2F0KHVybC5yZXBsYWNlKC9cIi9nLCAnXFxcXFwiJykucmVwbGFjZSgvXFxuL2csIFwiXFxcXG5cIiksIFwiXFxcIlwiKTtcbiAgfVxuICByZXR1cm4gdXJsO1xufTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///1667\n')},7537:module=>{"use strict";eval('\n\nmodule.exports = function (item) {\n var content = item[1];\n var cssMapping = item[3];\n if (!cssMapping) {\n return content;\n }\n if (typeof btoa === "function") {\n var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping))));\n var data = "sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(base64);\n var sourceMapping = "/*# ".concat(data, " */");\n return [content].concat([sourceMapping]).join("\\n");\n }\n return [content].join("\\n");\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzUzNy5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdURBQXVELGNBQWM7QUFDckU7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzP2FmMTIiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZW0pIHtcbiAgdmFyIGNvbnRlbnQgPSBpdGVtWzFdO1xuICB2YXIgY3NzTWFwcGluZyA9IGl0ZW1bM107XG4gIGlmICghY3NzTWFwcGluZykge1xuICAgIHJldHVybiBjb250ZW50O1xuICB9XG4gIGlmICh0eXBlb2YgYnRvYSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdmFyIGJhc2U2NCA9IGJ0b2EodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KGNzc01hcHBpbmcpKSkpO1xuICAgIHZhciBkYXRhID0gXCJzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxcIi5jb25jYXQoYmFzZTY0KTtcbiAgICB2YXIgc291cmNlTWFwcGluZyA9IFwiLyojIFwiLmNvbmNhdChkYXRhLCBcIiAqL1wiKTtcbiAgICByZXR1cm4gW2NvbnRlbnRdLmNvbmNhdChbc291cmNlTWFwcGluZ10pLmpvaW4oXCJcXG5cIik7XG4gIH1cbiAgcmV0dXJuIFtjb250ZW50XS5qb2luKFwiXFxuXCIpO1xufTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///7537\n')},1143:module=>{"use strict";eval("/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\n\n/**\n * Use invariant() to assert state which your program assumes to be true.\n *\n * Provide sprintf-style format (only %s is supported) and arguments\n * to provide information about what broke and what you were\n * expecting.\n *\n * The invariant message will be stripped in production, but the invariant\n * will remain to ensure logic does not differ in production.\n */\n\nvar invariant = function(condition, format, a, b, c, d, e, f) {\n if (false) {}\n\n if (!condition) {\n var error;\n if (format === undefined) {\n error = new Error(\n 'Minified exception occurred; use the non-minified dev environment ' +\n 'for the full error message and additional helpful warnings.'\n );\n } else {\n var args = [a, b, c, d, e, f];\n var argIndex = 0;\n error = new Error(\n format.replace(/%s/g, function() { return args[argIndex++]; })\n );\n error.name = 'Invariant Violation';\n }\n\n error.framesToPop = 1; // we don't care about invariant's own frame\n throw error;\n }\n};\n\nmodule.exports = invariant;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTE0My5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNLEtBQXFDLEVBQUUsRUFJMUM7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkMsMEJBQTBCO0FBQ3JFO0FBQ0E7QUFDQTs7QUFFQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBOztBQUVBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL2ludmFyaWFudC9icm93c2VyLmpzPzQwYjYiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogVXNlIGludmFyaWFudCgpIHRvIGFzc2VydCBzdGF0ZSB3aGljaCB5b3VyIHByb2dyYW0gYXNzdW1lcyB0byBiZSB0cnVlLlxuICpcbiAqIFByb3ZpZGUgc3ByaW50Zi1zdHlsZSBmb3JtYXQgKG9ubHkgJXMgaXMgc3VwcG9ydGVkKSBhbmQgYXJndW1lbnRzXG4gKiB0byBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IHdoYXQgYnJva2UgYW5kIHdoYXQgeW91IHdlcmVcbiAqIGV4cGVjdGluZy5cbiAqXG4gKiBUaGUgaW52YXJpYW50IG1lc3NhZ2Ugd2lsbCBiZSBzdHJpcHBlZCBpbiBwcm9kdWN0aW9uLCBidXQgdGhlIGludmFyaWFudFxuICogd2lsbCByZW1haW4gdG8gZW5zdXJlIGxvZ2ljIGRvZXMgbm90IGRpZmZlciBpbiBwcm9kdWN0aW9uLlxuICovXG5cbnZhciBpbnZhcmlhbnQgPSBmdW5jdGlvbihjb25kaXRpb24sIGZvcm1hdCwgYSwgYiwgYywgZCwgZSwgZikge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGlmIChmb3JtYXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhcmlhbnQgcmVxdWlyZXMgYW4gZXJyb3IgbWVzc2FnZSBhcmd1bWVudCcpO1xuICAgIH1cbiAgfVxuXG4gIGlmICghY29uZGl0aW9uKSB7XG4gICAgdmFyIGVycm9yO1xuICAgIGlmIChmb3JtYXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoXG4gICAgICAgICdNaW5pZmllZCBleGNlcHRpb24gb2NjdXJyZWQ7IHVzZSB0aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZpcm9ubWVudCAnICtcbiAgICAgICAgJ2ZvciB0aGUgZnVsbCBlcnJvciBtZXNzYWdlIGFuZCBhZGRpdGlvbmFsIGhlbHBmdWwgd2FybmluZ3MuJ1xuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGFyZ3MgPSBbYSwgYiwgYywgZCwgZSwgZl07XG4gICAgICB2YXIgYXJnSW5kZXggPSAwO1xuICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoXG4gICAgICAgIGZvcm1hdC5yZXBsYWNlKC8lcy9nLCBmdW5jdGlvbigpIHsgcmV0dXJuIGFyZ3NbYXJnSW5kZXgrK107IH0pXG4gICAgICApO1xuICAgICAgZXJyb3IubmFtZSA9ICdJbnZhcmlhbnQgVmlvbGF0aW9uJztcbiAgICB9XG5cbiAgICBlcnJvci5mcmFtZXNUb1BvcCA9IDE7IC8vIHdlIGRvbid0IGNhcmUgYWJvdXQgaW52YXJpYW50J3Mgb3duIGZyYW1lXG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gaW52YXJpYW50O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///1143\n")},4391:(module,exports,__webpack_require__)=>{"use strict";eval('\n\nObject.defineProperty(exports, "__esModule", ({\n value: true\n}));\nexports["default"] = all;\n\nvar _createChainableTypeChecker = __webpack_require__(2613);\n\nvar _createChainableTypeChecker2 = _interopRequireDefault(_createChainableTypeChecker);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction all() {\n for (var _len = arguments.length, validators = Array(_len), _key = 0; _key < _len; _key++) {\n validators[_key] = arguments[_key];\n }\n\n function allPropTypes() {\n for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n var error = null;\n\n validators.forEach(function (validator) {\n if (error != null) {\n return;\n }\n\n var result = validator.apply(undefined, args);\n if (result != null) {\n error = result;\n }\n });\n\n return error;\n }\n\n return (0, _createChainableTypeChecker2.default)(allPropTypes);\n}\nmodule.exports = exports[\'default\'];//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDM5MS5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYiw4Q0FBNkM7QUFDN0M7QUFDQSxDQUFDLEVBQUM7QUFDRixrQkFBZTs7QUFFZixrQ0FBa0MsbUJBQU8sQ0FBQyxJQUFvQzs7QUFFOUU7O0FBRUEsdUNBQXVDLHVDQUF1Qzs7QUFFOUU7QUFDQSx3RUFBd0UsYUFBYTtBQUNyRjtBQUNBOztBQUVBO0FBQ0EsdUVBQXVFLGVBQWU7QUFDdEY7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTs7QUFFQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy1leHRyYS9saWIvYWxsLmpzPzJiZDQiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gYWxsO1xuXG52YXIgX2NyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyID0gcmVxdWlyZSgnLi91dGlscy9jcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcicpO1xuXG52YXIgX2NyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZnVuY3Rpb24gYWxsKCkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgdmFsaWRhdG9ycyA9IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIHZhbGlkYXRvcnNbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICBmdW5jdGlvbiBhbGxQcm9wVHlwZXMoKSB7XG4gICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbjIpLCBfa2V5MiA9IDA7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgIGFyZ3NbX2tleTJdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICB9XG5cbiAgICB2YXIgZXJyb3IgPSBudWxsO1xuXG4gICAgdmFsaWRhdG9ycy5mb3JFYWNoKGZ1bmN0aW9uICh2YWxpZGF0b3IpIHtcbiAgICAgIGlmIChlcnJvciAhPSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIHJlc3VsdCA9IHZhbGlkYXRvci5hcHBseSh1bmRlZmluZWQsIGFyZ3MpO1xuICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7XG4gICAgICAgIGVycm9yID0gcmVzdWx0O1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVycm9yO1xuICB9XG5cbiAgcmV0dXJuICgwLCBfY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIyLmRlZmF1bHQpKGFsbFByb3BUeXBlcyk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///4391\n')},2613:(module,exports)=>{"use strict";eval("\n\nObject.defineProperty(exports, \"__esModule\", ({\n value: true\n}));\nexports[\"default\"] = createChainableTypeChecker;\n/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n */\n\n// Mostly taken from ReactPropTypes.\n\nfunction createChainableTypeChecker(validate) {\n function checkType(isRequired, props, propName, componentName, location, propFullName) {\n var componentNameSafe = componentName || '<<anonymous>>';\n var propFullNameSafe = propFullName || propName;\n\n if (props[propName] == null) {\n if (isRequired) {\n return new Error('Required ' + location + ' `' + propFullNameSafe + '` was not specified ' + ('in `' + componentNameSafe + '`.'));\n }\n\n return null;\n }\n\n for (var _len = arguments.length, args = Array(_len > 6 ? _len - 6 : 0), _key = 6; _key < _len; _key++) {\n args[_key - 6] = arguments[_key];\n }\n\n return validate.apply(undefined, [props, propName, componentNameSafe, location, propFullNameSafe].concat(args));\n }\n\n var chainedCheckType = checkType.bind(null, false);\n chainedCheckType.isRequired = checkType.bind(null, true);\n\n return chainedCheckType;\n}\nmodule.exports = exports['default'];//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjYxMy5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYiw4Q0FBNkM7QUFDN0M7QUFDQSxDQUFDLEVBQUM7QUFDRixrQkFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSx1RkFBdUYsYUFBYTtBQUNwRztBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy1leHRyYS9saWIvdXRpbHMvY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIuanM/YTZmMiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcjtcbi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICovXG5cbi8vIE1vc3RseSB0YWtlbiBmcm9tIFJlYWN0UHJvcFR5cGVzLlxuXG5mdW5jdGlvbiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSkge1xuICBmdW5jdGlvbiBjaGVja1R5cGUoaXNSZXF1aXJlZCwgcHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgdmFyIGNvbXBvbmVudE5hbWVTYWZlID0gY29tcG9uZW50TmFtZSB8fCAnPDxhbm9ueW1vdXM+Pic7XG4gICAgdmFyIHByb3BGdWxsTmFtZVNhZmUgPSBwcm9wRnVsbE5hbWUgfHwgcHJvcE5hbWU7XG5cbiAgICBpZiAocHJvcHNbcHJvcE5hbWVdID09IG51bGwpIHtcbiAgICAgIGlmIChpc1JlcXVpcmVkKSB7XG4gICAgICAgIHJldHVybiBuZXcgRXJyb3IoJ1JlcXVpcmVkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWVTYWZlICsgJ2Agd2FzIG5vdCBzcGVjaWZpZWQgJyArICgnaW4gYCcgKyBjb21wb25lbnROYW1lU2FmZSArICdgLicpKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuID4gNiA/IF9sZW4gLSA2IDogMCksIF9rZXkgPSA2OyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXkgLSA2XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsaWRhdGUuYXBwbHkodW5kZWZpbmVkLCBbcHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lU2FmZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZVNhZmVdLmNvbmNhdChhcmdzKSk7XG4gIH1cblxuICB2YXIgY2hhaW5lZENoZWNrVHlwZSA9IGNoZWNrVHlwZS5iaW5kKG51bGwsIGZhbHNlKTtcbiAgY2hhaW5lZENoZWNrVHlwZS5pc1JlcXVpcmVkID0gY2hlY2tUeXBlLmJpbmQobnVsbCwgdHJ1ZSk7XG5cbiAgcmV0dXJuIGNoYWluZWRDaGVja1R5cGU7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///2613\n")},2703:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\n\nvar ReactPropTypesSecret = __webpack_require__(414);\n\nfunction emptyFunction() {}\nfunction emptyFunctionWithReset() {}\nemptyFunctionWithReset.resetWarningCache = emptyFunction;\n\nmodule.exports = function() {\n function shim(props, propName, componentName, location, propFullName, secret) {\n if (secret === ReactPropTypesSecret) {\n // It is still safe when called from React.\n return;\n }\n var err = new Error(\n 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +\n 'Use PropTypes.checkPropTypes() to call them. ' +\n 'Read more at http://fb.me/use-check-prop-types'\n );\n err.name = 'Invariant Violation';\n throw err;\n };\n shim.isRequired = shim;\n function getShim() {\n return shim;\n };\n // Important!\n // Keep this list in sync with production version in `./factoryWithTypeCheckers.js`.\n var ReactPropTypes = {\n array: shim,\n bigint: shim,\n bool: shim,\n func: shim,\n number: shim,\n object: shim,\n string: shim,\n symbol: shim,\n\n any: shim,\n arrayOf: getShim,\n element: shim,\n elementType: shim,\n instanceOf: getShim,\n node: shim,\n objectOf: getShim,\n oneOf: getShim,\n oneOfType: getShim,\n shape: getShim,\n exact: getShim,\n\n checkPropTypes: emptyFunctionWithReset,\n resetWarningCache: emptyFunction\n };\n\n ReactPropTypes.PropTypes = ReactPropTypes;\n\n return ReactPropTypes;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjcwMy5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRWE7O0FBRWIsMkJBQTJCLG1CQUFPLENBQUMsR0FBNEI7O0FBRS9EO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9mYWN0b3J5V2l0aFRocm93aW5nU2hpbXMuanM/ZDdhMCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWN0UHJvcFR5cGVzU2VjcmV0ID0gcmVxdWlyZSgnLi9saWIvUmVhY3RQcm9wVHlwZXNTZWNyZXQnKTtcblxuZnVuY3Rpb24gZW1wdHlGdW5jdGlvbigpIHt9XG5mdW5jdGlvbiBlbXB0eUZ1bmN0aW9uV2l0aFJlc2V0KCkge31cbmVtcHR5RnVuY3Rpb25XaXRoUmVzZXQucmVzZXRXYXJuaW5nQ2FjaGUgPSBlbXB0eUZ1bmN0aW9uO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkge1xuICBmdW5jdGlvbiBzaGltKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSwgc2VjcmV0KSB7XG4gICAgaWYgKHNlY3JldCA9PT0gUmVhY3RQcm9wVHlwZXNTZWNyZXQpIHtcbiAgICAgIC8vIEl0IGlzIHN0aWxsIHNhZmUgd2hlbiBjYWxsZWQgZnJvbSBSZWFjdC5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGVyciA9IG5ldyBFcnJvcihcbiAgICAgICdDYWxsaW5nIFByb3BUeXBlcyB2YWxpZGF0b3JzIGRpcmVjdGx5IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGBwcm9wLXR5cGVzYCBwYWNrYWdlLiAnICtcbiAgICAgICdVc2UgUHJvcFR5cGVzLmNoZWNrUHJvcFR5cGVzKCkgdG8gY2FsbCB0aGVtLiAnICtcbiAgICAgICdSZWFkIG1vcmUgYXQgaHR0cDovL2ZiLm1lL3VzZS1jaGVjay1wcm9wLXR5cGVzJ1xuICAgICk7XG4gICAgZXJyLm5hbWUgPSAnSW52YXJpYW50IFZpb2xhdGlvbic7XG4gICAgdGhyb3cgZXJyO1xuICB9O1xuICBzaGltLmlzUmVxdWlyZWQgPSBzaGltO1xuICBmdW5jdGlvbiBnZXRTaGltKCkge1xuICAgIHJldHVybiBzaGltO1xuICB9O1xuICAvLyBJbXBvcnRhbnQhXG4gIC8vIEtlZXAgdGhpcyBsaXN0IGluIHN5bmMgd2l0aCBwcm9kdWN0aW9uIHZlcnNpb24gaW4gYC4vZmFjdG9yeVdpdGhUeXBlQ2hlY2tlcnMuanNgLlxuICB2YXIgUmVhY3RQcm9wVHlwZXMgPSB7XG4gICAgYXJyYXk6IHNoaW0sXG4gICAgYmlnaW50OiBzaGltLFxuICAgIGJvb2w6IHNoaW0sXG4gICAgZnVuYzogc2hpbSxcbiAgICBudW1iZXI6IHNoaW0sXG4gICAgb2JqZWN0OiBzaGltLFxuICAgIHN0cmluZzogc2hpbSxcbiAgICBzeW1ib2w6IHNoaW0sXG5cbiAgICBhbnk6IHNoaW0sXG4gICAgYXJyYXlPZjogZ2V0U2hpbSxcbiAgICBlbGVtZW50OiBzaGltLFxuICAgIGVsZW1lbnRUeXBlOiBzaGltLFxuICAgIGluc3RhbmNlT2Y6IGdldFNoaW0sXG4gICAgbm9kZTogc2hpbSxcbiAgICBvYmplY3RPZjogZ2V0U2hpbSxcbiAgICBvbmVPZjogZ2V0U2hpbSxcbiAgICBvbmVPZlR5cGU6IGdldFNoaW0sXG4gICAgc2hhcGU6IGdldFNoaW0sXG4gICAgZXhhY3Q6IGdldFNoaW0sXG5cbiAgICBjaGVja1Byb3BUeXBlczogZW1wdHlGdW5jdGlvbldpdGhSZXNldCxcbiAgICByZXNldFdhcm5pbmdDYWNoZTogZW1wdHlGdW5jdGlvblxuICB9O1xuXG4gIFJlYWN0UHJvcFR5cGVzLlByb3BUeXBlcyA9IFJlYWN0UHJvcFR5cGVzO1xuXG4gIHJldHVybiBSZWFjdFByb3BUeXBlcztcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///2703\n")},5697:(module,__unused_webpack_exports,__webpack_require__)=>{eval("/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nif (false) { var throwOnDirectAccess, ReactIs; } else {\n // By explicitly using `prop-types` you are opting into new production behavior.\n // http://fb.me/prop-types-in-prod\n module.exports = __webpack_require__(2703)();\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTY5Ny5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsSUFBSSxLQUFxQyxFQUFFLHFDQU8xQyxDQUFDO0FBQ0Y7QUFDQTtBQUNBLG1CQUFtQixtQkFBTyxDQUFDLElBQTRCO0FBQ3ZEIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL3Byb3AtdHlwZXMvaW5kZXguanM/ZDdiYyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHZhciBSZWFjdElzID0gcmVxdWlyZSgncmVhY3QtaXMnKTtcblxuICAvLyBCeSBleHBsaWNpdGx5IHVzaW5nIGBwcm9wLXR5cGVzYCB5b3UgYXJlIG9wdGluZyBpbnRvIG5ldyBkZXZlbG9wbWVudCBiZWhhdmlvci5cbiAgLy8gaHR0cDovL2ZiLm1lL3Byb3AtdHlwZXMtaW4tcHJvZFxuICB2YXIgdGhyb3dPbkRpcmVjdEFjY2VzcyA9IHRydWU7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9mYWN0b3J5V2l0aFR5cGVDaGVja2VycycpKFJlYWN0SXMuaXNFbGVtZW50LCB0aHJvd09uRGlyZWN0QWNjZXNzKTtcbn0gZWxzZSB7XG4gIC8vIEJ5IGV4cGxpY2l0bHkgdXNpbmcgYHByb3AtdHlwZXNgIHlvdSBhcmUgb3B0aW5nIGludG8gbmV3IHByb2R1Y3Rpb24gYmVoYXZpb3IuXG4gIC8vIGh0dHA6Ly9mYi5tZS9wcm9wLXR5cGVzLWluLXByb2RcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2ZhY3RvcnlXaXRoVGhyb3dpbmdTaGltcycpKCk7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///5697\n")},414:module=>{"use strict";eval("/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\n\nvar ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';\n\nmodule.exports = ReactPropTypesSecret;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDE0LmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFYTs7QUFFYjs7QUFFQSIsInNvdXJjZXMiOlsid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uL25vZGVfbW9kdWxlcy9wcm9wLXR5cGVzL2xpYi9SZWFjdFByb3BUeXBlc1NlY3JldC5qcz81OWIwIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQgPSAnU0VDUkVUX0RPX05PVF9QQVNTX1RISVNfT1JfWU9VX1dJTExfQkVfRklSRUQnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0UHJvcFR5cGVzU2VjcmV0O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///414\n")},4448:(__unused_webpack_module,exports,__webpack_require__)=>{"use strict";eval('/**\n * @license React\n * react-dom.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n/*\n Modernizr 3.0.0pre (Custom Build) | MIT\n*/\nvar aa=__webpack_require__(7294),ca=__webpack_require__(3840);function p(a){for(var b="https://reactjs.org/docs/error-decoder.html?invariant="+a,c=1;c<arguments.length;c++)b+="&args[]="+encodeURIComponent(arguments[c]);return"Minified React error #"+a+"; visit "+b+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}var da=new Set,ea={};function fa(a,b){ha(a,b);ha(a+"Capture",b)}\nfunction ha(a,b){ea[a]=b;for(a=0;a<b.length;a++)da.add(b[a])}\nvar ia=!("undefined"===typeof window||"undefined"===typeof window.document||"undefined"===typeof window.document.createElement),ja=Object.prototype.hasOwnProperty,ka=/^[:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD][:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$/,la=\n{},ma={};function oa(a){if(ja.call(ma,a))return!0;if(ja.call(la,a))return!1;if(ka.test(a))return ma[a]=!0;la[a]=!0;return!1}function pa(a,b,c,d){if(null!==c&&0===c.type)return!1;switch(typeof b){case "function":case "symbol":return!0;case "boolean":if(d)return!1;if(null!==c)return!c.acceptsBooleans;a=a.toLowerCase().slice(0,5);return"data-"!==a&&"aria-"!==a;default:return!1}}\nfunction qa(a,b,c,d){if(null===b||"undefined"===typeof b||pa(a,b,c,d))return!0;if(d)return!1;if(null!==c)switch(c.type){case 3:return!b;case 4:return!1===b;case 5:return isNaN(b);case 6:return isNaN(b)||1>b}return!1}function v(a,b,c,d,e,f,g){this.acceptsBooleans=2===b||3===b||4===b;this.attributeName=d;this.attributeNamespace=e;this.mustUseProperty=c;this.propertyName=a;this.type=b;this.sanitizeURL=f;this.removeEmptyString=g}var z={};\n"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(a){z[a]=new v(a,0,!1,a,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(a){var b=a[0];z[b]=new v(b,1,!1,a[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(a){z[a]=new v(a,2,!1,a.toLowerCase(),null,!1,!1)});\n["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(a){z[a]=new v(a,2,!1,a,null,!1,!1)});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(a){z[a]=new v(a,3,!1,a.toLowerCase(),null,!1,!1)});\n["checked","multiple","muted","selected"].forEach(function(a){z[a]=new v(a,3,!0,a,null,!1,!1)});["capture","download"].forEach(function(a){z[a]=new v(a,4,!1,a,null,!1,!1)});["cols","rows","size","span"].forEach(function(a){z[a]=new v(a,6,!1,a,null,!1,!1)});["rowSpan","start"].forEach(function(a){z[a]=new v(a,5,!1,a.toLowerCase(),null,!1,!1)});var ra=/[\\-:]([a-z])/g;function sa(a){return a[1].toUpperCase()}\n"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(a){var b=a.replace(ra,\nsa);z[b]=new v(b,1,!1,a,null,!1,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(a){var b=a.replace(ra,sa);z[b]=new v(b,1,!1,a,"http://www.w3.org/1999/xlink",!1,!1)});["xml:base","xml:lang","xml:space"].forEach(function(a){var b=a.replace(ra,sa);z[b]=new v(b,1,!1,a,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function(a){z[a]=new v(a,1,!1,a.toLowerCase(),null,!1,!1)});\nz.xlinkHref=new v("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(a){z[a]=new v(a,1,!1,a.toLowerCase(),null,!0,!0)});\nfunction ta(a,b,c,d){var e=z.hasOwnProperty(b)?z[b]:null;if(null!==e?0!==e.type:d||!(2<b.length)||"o"!==b[0]&&"O"!==b[0]||"n"!==b[1]&&"N"!==b[1])qa(b,c,e,d)&&(c=null),d||null===e?oa(b)&&(null===c?a.removeAttribute(b):a.setAttribute(b,""+c)):e.mustUseProperty?a[e.propertyName]=null===c?3===e.type?!1:"":c:(b=e.attributeName,d=e.attributeNamespace,null===c?a.removeAttribute(b):(e=e.type,c=3===e||4===e&&!0===c?"":""+c,d?a.setAttributeNS(d,b,c):a.setAttribute(b,c)))}\nvar ua=aa.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,va=Symbol.for("react.element"),wa=Symbol.for("react.portal"),ya=Symbol.for("react.fragment"),za=Symbol.for("react.strict_mode"),Aa=Symbol.for("react.profiler"),Ba=Symbol.for("react.provider"),Ca=Symbol.for("react.context"),Da=Symbol.for("react.forward_ref"),Ea=Symbol.for("react.suspense"),Fa=Symbol.for("react.suspense_list"),Ga=Symbol.for("react.memo"),Ha=Symbol.for("react.lazy");Symbol.for("react.scope");Symbol.for("react.debug_trace_mode");\nvar Ia=Symbol.for("react.offscreen");Symbol.for("react.legacy_hidden");Symbol.for("react.cache");Symbol.for("react.tracing_marker");var Ja=Symbol.iterator;function Ka(a){if(null===a||"object"!==typeof a)return null;a=Ja&&a[Ja]||a["@@iterator"];return"function"===typeof a?a:null}var A=Object.assign,La;function Ma(a){if(void 0===La)try{throw Error();}catch(c){var b=c.stack.trim().match(/\\n( *(at )?)/);La=b&&b[1]||""}return"\\n"+La+a}var Na=!1;\nfunction Oa(a,b){if(!a||Na)return"";Na=!0;var c=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{if(b)if(b=function(){throw Error();},Object.defineProperty(b.prototype,"props",{set:function(){throw Error();}}),"object"===typeof Reflect&&Reflect.construct){try{Reflect.construct(b,[])}catch(l){var d=l}Reflect.construct(a,[],b)}else{try{b.call()}catch(l){d=l}a.call(b.prototype)}else{try{throw Error();}catch(l){d=l}a()}}catch(l){if(l&&d&&"string"===typeof l.stack){for(var e=l.stack.split("\\n"),\nf=d.stack.split("\\n"),g=e.length-1,h=f.length-1;1<=g&&0<=h&&e[g]!==f[h];)h--;for(;1<=g&&0<=h;g--,h--)if(e[g]!==f[h]){if(1!==g||1!==h){do if(g--,h--,0>h||e[g]!==f[h]){var k="\\n"+e[g].replace(" at new "," at ");a.displayName&&k.includes("<anonymous>")&&(k=k.replace("<anonymous>",a.displayName));return k}while(1<=g&&0<=h)}break}}}finally{Na=!1,Error.prepareStackTrace=c}return(a=a?a.displayName||a.name:"")?Ma(a):""}\nfunction Pa(a){switch(a.tag){case 5:return Ma(a.type);case 16:return Ma("Lazy");case 13:return Ma("Suspense");case 19:return Ma("SuspenseList");case 0:case 2:case 15:return a=Oa(a.type,!1),a;case 11:return a=Oa(a.type.render,!1),a;case 1:return a=Oa(a.type,!0),a;default:return""}}\nfunction Qa(a){if(null==a)return null;if("function"===typeof a)return a.displayName||a.name||null;if("string"===typeof a)return a;switch(a){case ya:return"Fragment";case wa:return"Portal";case Aa:return"Profiler";case za:return"StrictMode";case Ea:return"Suspense";case Fa:return"SuspenseList"}if("object"===typeof a)switch(a.$$typeof){case Ca:return(a.displayName||"Context")+".Consumer";case Ba:return(a._context.displayName||"Context")+".Provider";case Da:var b=a.render;a=a.displayName;a||(a=b.displayName||\nb.name||"",a=""!==a?"ForwardRef("+a+")":"ForwardRef");return a;case Ga:return b=a.displayName||null,null!==b?b:Qa(a.type)||"Memo";case Ha:b=a._payload;a=a._init;try{return Qa(a(b))}catch(c){}}return null}\nfunction Ra(a){var b=a.type;switch(a.tag){case 24:return"Cache";case 9:return(b.displayName||"Context")+".Consumer";case 10:return(b._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return a=b.render,a=a.displayName||a.name||"",b.displayName||(""!==a?"ForwardRef("+a+")":"ForwardRef");case 7:return"Fragment";case 5:return b;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return Qa(b);case 8:return b===za?"StrictMode":"Mode";case 22:return"Offscreen";\ncase 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if("function"===typeof b)return b.displayName||b.name||null;if("string"===typeof b)return b}return null}function Sa(a){switch(typeof a){case "boolean":case "number":case "string":case "undefined":return a;case "object":return a;default:return""}}\nfunction Ta(a){var b=a.type;return(a=a.nodeName)&&"input"===a.toLowerCase()&&("checkbox"===b||"radio"===b)}\nfunction Ua(a){var b=Ta(a)?"checked":"value",c=Object.getOwnPropertyDescriptor(a.constructor.prototype,b),d=""+a[b];if(!a.hasOwnProperty(b)&&"undefined"!==typeof c&&"function"===typeof c.get&&"function"===typeof c.set){var e=c.get,f=c.set;Object.defineProperty(a,b,{configurable:!0,get:function(){return e.call(this)},set:function(a){d=""+a;f.call(this,a)}});Object.defineProperty(a,b,{enumerable:c.enumerable});return{getValue:function(){return d},setValue:function(a){d=""+a},stopTracking:function(){a._valueTracker=\nnull;delete a[b]}}}}function Va(a){a._valueTracker||(a._valueTracker=Ua(a))}function Wa(a){if(!a)return!1;var b=a._valueTracker;if(!b)return!0;var c=b.getValue();var d="";a&&(d=Ta(a)?a.checked?"true":"false":a.value);a=d;return a!==c?(b.setValue(a),!0):!1}function Xa(a){a=a||("undefined"!==typeof document?document:void 0);if("undefined"===typeof a)return null;try{return a.activeElement||a.body}catch(b){return a.body}}\nfunction Ya(a,b){var c=b.checked;return A({},b,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=c?c:a._wrapperState.initialChecked})}function Za(a,b){var c=null==b.defaultValue?"":b.defaultValue,d=null!=b.checked?b.checked:b.defaultChecked;c=Sa(null!=b.value?b.value:c);a._wrapperState={initialChecked:d,initialValue:c,controlled:"checkbox"===b.type||"radio"===b.type?null!=b.checked:null!=b.value}}function ab(a,b){b=b.checked;null!=b&&ta(a,"checked",b,!1)}\nfunction bb(a,b){ab(a,b);var c=Sa(b.value),d=b.type;if(null!=c)if("number"===d){if(0===c&&""===a.value||a.value!=c)a.value=""+c}else a.value!==""+c&&(a.value=""+c);else if("submit"===d||"reset"===d){a.removeAttribute("value");return}b.hasOwnProperty("value")?cb(a,b.type,c):b.hasOwnProperty("defaultValue")&&cb(a,b.type,Sa(b.defaultValue));null==b.checked&&null!=b.defaultChecked&&(a.defaultChecked=!!b.defaultChecked)}\nfunction db(a,b,c){if(b.hasOwnProperty("value")||b.hasOwnProperty("defaultValue")){var d=b.type;if(!("submit"!==d&&"reset"!==d||void 0!==b.value&&null!==b.value))return;b=""+a._wrapperState.initialValue;c||b===a.value||(a.value=b);a.defaultValue=b}c=a.name;""!==c&&(a.name="");a.defaultChecked=!!a._wrapperState.initialChecked;""!==c&&(a.name=c)}\nfunction cb(a,b,c){if("number"!==b||Xa(a.ownerDocument)!==a)null==c?a.defaultValue=""+a._wrapperState.initialValue:a.defaultValue!==""+c&&(a.defaultValue=""+c)}var eb=Array.isArray;\nfunction fb(a,b,c,d){a=a.options;if(b){b={};for(var e=0;e<c.length;e++)b["$"+c[e]]=!0;for(c=0;c<a.length;c++)e=b.hasOwnProperty("$"+a[c].value),a[c].selected!==e&&(a[c].selected=e),e&&d&&(a[c].defaultSelected=!0)}else{c=""+Sa(c);b=null;for(e=0;e<a.length;e++){if(a[e].value===c){a[e].selected=!0;d&&(a[e].defaultSelected=!0);return}null!==b||a[e].disabled||(b=a[e])}null!==b&&(b.selected=!0)}}\nfunction gb(a,b){if(null!=b.dangerouslySetInnerHTML)throw Error(p(91));return A({},b,{value:void 0,defaultValue:void 0,children:""+a._wrapperState.initialValue})}function hb(a,b){var c=b.value;if(null==c){c=b.children;b=b.defaultValue;if(null!=c){if(null!=b)throw Error(p(92));if(eb(c)){if(1<c.length)throw Error(p(93));c=c[0]}b=c}null==b&&(b="");c=b}a._wrapperState={initialValue:Sa(c)}}\nfunction ib(a,b){var c=Sa(b.value),d=Sa(b.defaultValue);null!=c&&(c=""+c,c!==a.value&&(a.value=c),null==b.defaultValue&&a.defaultValue!==c&&(a.defaultValue=c));null!=d&&(a.defaultValue=""+d)}function jb(a){var b=a.textContent;b===a._wrapperState.initialValue&&""!==b&&null!==b&&(a.value=b)}function kb(a){switch(a){case "svg":return"http://www.w3.org/2000/svg";case "math":return"http://www.w3.org/1998/Math/MathML";default:return"http://www.w3.org/1999/xhtml"}}\nfunction lb(a,b){return null==a||"http://www.w3.org/1999/xhtml"===a?kb(b):"http://www.w3.org/2000/svg"===a&&"foreignObject"===b?"http://www.w3.org/1999/xhtml":a}\nvar mb,nb=function(a){return"undefined"!==typeof MSApp&&MSApp.execUnsafeLocalFunction?function(b,c,d,e){MSApp.execUnsafeLocalFunction(function(){return a(b,c,d,e)})}:a}(function(a,b){if("http://www.w3.org/2000/svg"!==a.namespaceURI||"innerHTML"in a)a.innerHTML=b;else{mb=mb||document.createElement("div");mb.innerHTML="<svg>"+b.valueOf().toString()+"</svg>";for(b=mb.firstChild;a.firstChild;)a.removeChild(a.firstChild);for(;b.firstChild;)a.appendChild(b.firstChild)}});\nfunction ob(a,b){if(b){var c=a.firstChild;if(c&&c===a.lastChild&&3===c.nodeType){c.nodeValue=b;return}}a.textContent=b}\nvar pb={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,\nzoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},qb=["Webkit","ms","Moz","O"];Object.keys(pb).forEach(function(a){qb.forEach(function(b){b=b+a.charAt(0).toUpperCase()+a.substring(1);pb[b]=pb[a]})});function rb(a,b,c){return null==b||"boolean"===typeof b||""===b?"":c||"number"!==typeof b||0===b||pb.hasOwnProperty(a)&&pb[a]?(""+b).trim():b+"px"}\nfunction sb(a,b){a=a.style;for(var c in b)if(b.hasOwnProperty(c)){var d=0===c.indexOf("--"),e=rb(c,b[c],d);"float"===c&&(c="cssFloat");d?a.setProperty(c,e):a[c]=e}}var tb=A({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});\nfunction ub(a,b){if(b){if(tb[a]&&(null!=b.children||null!=b.dangerouslySetInnerHTML))throw Error(p(137,a));if(null!=b.dangerouslySetInnerHTML){if(null!=b.children)throw Error(p(60));if("object"!==typeof b.dangerouslySetInnerHTML||!("__html"in b.dangerouslySetInnerHTML))throw Error(p(61));}if(null!=b.style&&"object"!==typeof b.style)throw Error(p(62));}}\nfunction vb(a,b){if(-1===a.indexOf("-"))return"string"===typeof b.is;switch(a){case "annotation-xml":case "color-profile":case "font-face":case "font-face-src":case "font-face-uri":case "font-face-format":case "font-face-name":case "missing-glyph":return!1;default:return!0}}var wb=null;function xb(a){a=a.target||a.srcElement||window;a.correspondingUseElement&&(a=a.correspondingUseElement);return 3===a.nodeType?a.parentNode:a}var yb=null,zb=null,Ab=null;\nfunction Bb(a){if(a=Cb(a)){if("function"!==typeof yb)throw Error(p(280));var b=a.stateNode;b&&(b=Db(b),yb(a.stateNode,a.type,b))}}function Eb(a){zb?Ab?Ab.push(a):Ab=[a]:zb=a}function Fb(){if(zb){var a=zb,b=Ab;Ab=zb=null;Bb(a);if(b)for(a=0;a<b.length;a++)Bb(b[a])}}function Gb(a,b){return a(b)}function Hb(){}var Ib=!1;function Jb(a,b,c){if(Ib)return a(b,c);Ib=!0;try{return Gb(a,b,c)}finally{if(Ib=!1,null!==zb||null!==Ab)Hb(),Fb()}}\nfunction Kb(a,b){var c=a.stateNode;if(null===c)return null;var d=Db(c);if(null===d)return null;c=d[b];a:switch(b){case "onClick":case "onClickCapture":case "onDoubleClick":case "onDoubleClickCapture":case "onMouseDown":case "onMouseDownCapture":case "onMouseMove":case "onMouseMoveCapture":case "onMouseUp":case "onMouseUpCapture":case "onMouseEnter":(d=!d.disabled)||(a=a.type,d=!("button"===a||"input"===a||"select"===a||"textarea"===a));a=!d;break a;default:a=!1}if(a)return null;if(c&&"function"!==\ntypeof c)throw Error(p(231,b,typeof c));return c}var Lb=!1;if(ia)try{var Mb={};Object.defineProperty(Mb,"passive",{get:function(){Lb=!0}});window.addEventListener("test",Mb,Mb);window.removeEventListener("test",Mb,Mb)}catch(a){Lb=!1}function Nb(a,b,c,d,e,f,g,h,k){var l=Array.prototype.slice.call(arguments,3);try{b.apply(c,l)}catch(m){this.onError(m)}}var Ob=!1,Pb=null,Qb=!1,Rb=null,Sb={onError:function(a){Ob=!0;Pb=a}};function Tb(a,b,c,d,e,f,g,h,k){Ob=!1;Pb=null;Nb.apply(Sb,arguments)}\nfunction Ub(a,b,c,d,e,f,g,h,k){Tb.apply(this,arguments);if(Ob){if(Ob){var l=Pb;Ob=!1;Pb=null}else throw Error(p(198));Qb||(Qb=!0,Rb=l)}}function Vb(a){var b=a,c=a;if(a.alternate)for(;b.return;)b=b.return;else{a=b;do b=a,0!==(b.flags&4098)&&(c=b.return),a=b.return;while(a)}return 3===b.tag?c:null}function Wb(a){if(13===a.tag){var b=a.memoizedState;null===b&&(a=a.alternate,null!==a&&(b=a.memoizedState));if(null!==b)return b.dehydrated}return null}function Xb(a){if(Vb(a)!==a)throw Error(p(188));}\nfunction Yb(a){var b=a.alternate;if(!b){b=Vb(a);if(null===b)throw Error(p(188));return b!==a?null:a}for(var c=a,d=b;;){var e=c.return;if(null===e)break;var f=e.alternate;if(null===f){d=e.return;if(null!==d){c=d;continue}break}if(e.child===f.child){for(f=e.child;f;){if(f===c)return Xb(e),a;if(f===d)return Xb(e),b;f=f.sibling}throw Error(p(188));}if(c.return!==d.return)c=e,d=f;else{for(var g=!1,h=e.child;h;){if(h===c){g=!0;c=e;d=f;break}if(h===d){g=!0;d=e;c=f;break}h=h.sibling}if(!g){for(h=f.child;h;){if(h===\nc){g=!0;c=f;d=e;break}if(h===d){g=!0;d=f;c=e;break}h=h.sibling}if(!g)throw Error(p(189));}}if(c.alternate!==d)throw Error(p(190));}if(3!==c.tag)throw Error(p(188));return c.stateNode.current===c?a:b}function Zb(a){a=Yb(a);return null!==a?$b(a):null}function $b(a){if(5===a.tag||6===a.tag)return a;for(a=a.child;null!==a;){var b=$b(a);if(null!==b)return b;a=a.sibling}return null}\nvar ac=ca.unstable_scheduleCallback,bc=ca.unstable_cancelCallback,cc=ca.unstable_shouldYield,dc=ca.unstable_requestPaint,B=ca.unstable_now,ec=ca.unstable_getCurrentPriorityLevel,fc=ca.unstable_ImmediatePriority,gc=ca.unstable_UserBlockingPriority,hc=ca.unstable_NormalPriority,ic=ca.unstable_LowPriority,jc=ca.unstable_IdlePriority,kc=null,lc=null;function mc(a){if(lc&&"function"===typeof lc.onCommitFiberRoot)try{lc.onCommitFiberRoot(kc,a,void 0,128===(a.current.flags&128))}catch(b){}}\nvar oc=Math.clz32?Math.clz32:nc,pc=Math.log,qc=Math.LN2;function nc(a){a>>>=0;return 0===a?32:31-(pc(a)/qc|0)|0}var rc=64,sc=4194304;\nfunction tc(a){switch(a&-a){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return a&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return a&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;\ndefault:return a}}function uc(a,b){var c=a.pendingLanes;if(0===c)return 0;var d=0,e=a.suspendedLanes,f=a.pingedLanes,g=c&268435455;if(0!==g){var h=g&~e;0!==h?d=tc(h):(f&=g,0!==f&&(d=tc(f)))}else g=c&~e,0!==g?d=tc(g):0!==f&&(d=tc(f));if(0===d)return 0;if(0!==b&&b!==d&&0===(b&e)&&(e=d&-d,f=b&-b,e>=f||16===e&&0!==(f&4194240)))return b;0!==(d&4)&&(d|=c&16);b=a.entangledLanes;if(0!==b)for(a=a.entanglements,b&=d;0<b;)c=31-oc(b),e=1<<c,d|=a[c],b&=~e;return d}\nfunction vc(a,b){switch(a){case 1:case 2:case 4:return b+250;case 8:case 16:case 32:case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return b+5E3;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return-1;case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}\nfunction wc(a,b){for(var c=a.suspendedLanes,d=a.pingedLanes,e=a.expirationTimes,f=a.pendingLanes;0<f;){var g=31-oc(f),h=1<<g,k=e[g];if(-1===k){if(0===(h&c)||0!==(h&d))e[g]=vc(h,b)}else k<=b&&(a.expiredLanes|=h);f&=~h}}function xc(a){a=a.pendingLanes&-1073741825;return 0!==a?a:a&1073741824?1073741824:0}function yc(){var a=rc;rc<<=1;0===(rc&4194240)&&(rc=64);return a}function zc(a){for(var b=[],c=0;31>c;c++)b.push(a);return b}\nfunction Ac(a,b,c){a.pendingLanes|=b;536870912!==b&&(a.suspendedLanes=0,a.pingedLanes=0);a=a.eventTimes;b=31-oc(b);a[b]=c}function Bc(a,b){var c=a.pendingLanes&~b;a.pendingLanes=b;a.suspendedLanes=0;a.pingedLanes=0;a.expiredLanes&=b;a.mutableReadLanes&=b;a.entangledLanes&=b;b=a.entanglements;var d=a.eventTimes;for(a=a.expirationTimes;0<c;){var e=31-oc(c),f=1<<e;b[e]=0;d[e]=-1;a[e]=-1;c&=~f}}\nfunction Cc(a,b){var c=a.entangledLanes|=b;for(a=a.entanglements;c;){var d=31-oc(c),e=1<<d;e&b|a[d]&b&&(a[d]|=b);c&=~e}}var C=0;function Dc(a){a&=-a;return 1<a?4<a?0!==(a&268435455)?16:536870912:4:1}var Ec,Fc,Gc,Hc,Ic,Jc=!1,Kc=[],Lc=null,Mc=null,Nc=null,Oc=new Map,Pc=new Map,Qc=[],Rc="mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset submit".split(" ");\nfunction Sc(a,b){switch(a){case "focusin":case "focusout":Lc=null;break;case "dragenter":case "dragleave":Mc=null;break;case "mouseover":case "mouseout":Nc=null;break;case "pointerover":case "pointerout":Oc.delete(b.pointerId);break;case "gotpointercapture":case "lostpointercapture":Pc.delete(b.pointerId)}}\nfunction Tc(a,b,c,d,e,f){if(null===a||a.nativeEvent!==f)return a={blockedOn:b,domEventName:c,eventSystemFlags:d,nativeEvent:f,targetContainers:[e]},null!==b&&(b=Cb(b),null!==b&&Fc(b)),a;a.eventSystemFlags|=d;b=a.targetContainers;null!==e&&-1===b.indexOf(e)&&b.push(e);return a}\nfunction Uc(a,b,c,d,e){switch(b){case "focusin":return Lc=Tc(Lc,a,b,c,d,e),!0;case "dragenter":return Mc=Tc(Mc,a,b,c,d,e),!0;case "mouseover":return Nc=Tc(Nc,a,b,c,d,e),!0;case "pointerover":var f=e.pointerId;Oc.set(f,Tc(Oc.get(f)||null,a,b,c,d,e));return!0;case "gotpointercapture":return f=e.pointerId,Pc.set(f,Tc(Pc.get(f)||null,a,b,c,d,e)),!0}return!1}\nfunction Vc(a){var b=Wc(a.target);if(null!==b){var c=Vb(b);if(null!==c)if(b=c.tag,13===b){if(b=Wb(c),null!==b){a.blockedOn=b;Ic(a.priority,function(){Gc(c)});return}}else if(3===b&&c.stateNode.current.memoizedState.isDehydrated){a.blockedOn=3===c.tag?c.stateNode.containerInfo:null;return}}a.blockedOn=null}\nfunction Xc(a){if(null!==a.blockedOn)return!1;for(var b=a.targetContainers;0<b.length;){var c=Yc(a.domEventName,a.eventSystemFlags,b[0],a.nativeEvent);if(null===c){c=a.nativeEvent;var d=new c.constructor(c.type,c);wb=d;c.target.dispatchEvent(d);wb=null}else return b=Cb(c),null!==b&&Fc(b),a.blockedOn=c,!1;b.shift()}return!0}function Zc(a,b,c){Xc(a)&&c.delete(b)}function $c(){Jc=!1;null!==Lc&&Xc(Lc)&&(Lc=null);null!==Mc&&Xc(Mc)&&(Mc=null);null!==Nc&&Xc(Nc)&&(Nc=null);Oc.forEach(Zc);Pc.forEach(Zc)}\nfunction ad(a,b){a.blockedOn===b&&(a.blockedOn=null,Jc||(Jc=!0,ca.unstable_scheduleCallback(ca.unstable_NormalPriority,$c)))}\nfunction bd(a){function b(b){return ad(b,a)}if(0<Kc.length){ad(Kc[0],a);for(var c=1;c<Kc.length;c++){var d=Kc[c];d.blockedOn===a&&(d.blockedOn=null)}}null!==Lc&&ad(Lc,a);null!==Mc&&ad(Mc,a);null!==Nc&&ad(Nc,a);Oc.forEach(b);Pc.forEach(b);for(c=0;c<Qc.length;c++)d=Qc[c],d.blockedOn===a&&(d.blockedOn=null);for(;0<Qc.length&&(c=Qc[0],null===c.blockedOn);)Vc(c),null===c.blockedOn&&Qc.shift()}var cd=ua.ReactCurrentBatchConfig,dd=!0;\nfunction ed(a,b,c,d){var e=C,f=cd.transition;cd.transition=null;try{C=1,fd(a,b,c,d)}finally{C=e,cd.transition=f}}function gd(a,b,c,d){var e=C,f=cd.transition;cd.transition=null;try{C=4,fd(a,b,c,d)}finally{C=e,cd.transition=f}}\nfunction fd(a,b,c,d){if(dd){var e=Yc(a,b,c,d);if(null===e)hd(a,b,d,id,c),Sc(a,d);else if(Uc(e,a,b,c,d))d.stopPropagation();else if(Sc(a,d),b&4&&-1<Rc.indexOf(a)){for(;null!==e;){var f=Cb(e);null!==f&&Ec(f);f=Yc(a,b,c,d);null===f&&hd(a,b,d,id,c);if(f===e)break;e=f}null!==e&&d.stopPropagation()}else hd(a,b,d,null,c)}}var id=null;\nfunction Yc(a,b,c,d){id=null;a=xb(d);a=Wc(a);if(null!==a)if(b=Vb(a),null===b)a=null;else if(c=b.tag,13===c){a=Wb(b);if(null!==a)return a;a=null}else if(3===c){if(b.stateNode.current.memoizedState.isDehydrated)return 3===b.tag?b.stateNode.containerInfo:null;a=null}else b!==a&&(a=null);id=a;return null}\nfunction jd(a){switch(a){case "cancel":case "click":case "close":case "contextmenu":case "copy":case "cut":case "auxclick":case "dblclick":case "dragend":case "dragstart":case "drop":case "focusin":case "focusout":case "input":case "invalid":case "keydown":case "keypress":case "keyup":case "mousedown":case "mouseup":case "paste":case "pause":case "play":case "pointercancel":case "pointerdown":case "pointerup":case "ratechange":case "reset":case "resize":case "seeked":case "submit":case "touchcancel":case "touchend":case "touchstart":case "volumechange":case "change":case "selectionchange":case "textInput":case "compositionstart":case "compositionend":case "compositionupdate":case "beforeblur":case "afterblur":case "beforeinput":case "blur":case "fullscreenchange":case "focus":case "hashchange":case "popstate":case "select":case "selectstart":return 1;case "drag":case "dragenter":case "dragexit":case "dragleave":case "dragover":case "mousemove":case "mouseout":case "mouseover":case "pointermove":case "pointerout":case "pointerover":case "scroll":case "toggle":case "touchmove":case "wheel":case "mouseenter":case "mouseleave":case "pointerenter":case "pointerleave":return 4;\ncase "message":switch(ec()){case fc:return 1;case gc:return 4;case hc:case ic:return 16;case jc:return 536870912;default:return 16}default:return 16}}var kd=null,ld=null,md=null;function nd(){if(md)return md;var a,b=ld,c=b.length,d,e="value"in kd?kd.value:kd.textContent,f=e.length;for(a=0;a<c&&b[a]===e[a];a++);var g=c-a;for(d=1;d<=g&&b[c-d]===e[f-d];d++);return md=e.slice(a,1<d?1-d:void 0)}\nfunction od(a){var b=a.keyCode;"charCode"in a?(a=a.charCode,0===a&&13===b&&(a=13)):a=b;10===a&&(a=13);return 32<=a||13===a?a:0}function pd(){return!0}function qd(){return!1}\nfunction rd(a){function b(b,d,e,f,g){this._reactName=b;this._targetInst=e;this.type=d;this.nativeEvent=f;this.target=g;this.currentTarget=null;for(var c in a)a.hasOwnProperty(c)&&(b=a[c],this[c]=b?b(f):f[c]);this.isDefaultPrevented=(null!=f.defaultPrevented?f.defaultPrevented:!1===f.returnValue)?pd:qd;this.isPropagationStopped=qd;return this}A(b.prototype,{preventDefault:function(){this.defaultPrevented=!0;var a=this.nativeEvent;a&&(a.preventDefault?a.preventDefault():"unknown"!==typeof a.returnValue&&\n(a.returnValue=!1),this.isDefaultPrevented=pd)},stopPropagation:function(){var a=this.nativeEvent;a&&(a.stopPropagation?a.stopPropagation():"unknown"!==typeof a.cancelBubble&&(a.cancelBubble=!0),this.isPropagationStopped=pd)},persist:function(){},isPersistent:pd});return b}\nvar sd={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(a){return a.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},td=rd(sd),ud=A({},sd,{view:0,detail:0}),vd=rd(ud),wd,xd,yd,Ad=A({},ud,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:zd,button:0,buttons:0,relatedTarget:function(a){return void 0===a.relatedTarget?a.fromElement===a.srcElement?a.toElement:a.fromElement:a.relatedTarget},movementX:function(a){if("movementX"in\na)return a.movementX;a!==yd&&(yd&&"mousemove"===a.type?(wd=a.screenX-yd.screenX,xd=a.screenY-yd.screenY):xd=wd=0,yd=a);return wd},movementY:function(a){return"movementY"in a?a.movementY:xd}}),Bd=rd(Ad),Cd=A({},Ad,{dataTransfer:0}),Dd=rd(Cd),Ed=A({},ud,{relatedTarget:0}),Fd=rd(Ed),Gd=A({},sd,{animationName:0,elapsedTime:0,pseudoElement:0}),Hd=rd(Gd),Id=A({},sd,{clipboardData:function(a){return"clipboardData"in a?a.clipboardData:window.clipboardData}}),Jd=rd(Id),Kd=A({},sd,{data:0}),Ld=rd(Kd),Md={Esc:"Escape",\nSpacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},Nd={8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",45:"Insert",46:"Delete",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",\n119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NumLock",145:"ScrollLock",224:"Meta"},Od={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};function Pd(a){var b=this.nativeEvent;return b.getModifierState?b.getModifierState(a):(a=Od[a])?!!b[a]:!1}function zd(){return Pd}\nvar Qd=A({},ud,{key:function(a){if(a.key){var b=Md[a.key]||a.key;if("Unidentified"!==b)return b}return"keypress"===a.type?(a=od(a),13===a?"Enter":String.fromCharCode(a)):"keydown"===a.type||"keyup"===a.type?Nd[a.keyCode]||"Unidentified":""},code:0,location:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,repeat:0,locale:0,getModifierState:zd,charCode:function(a){return"keypress"===a.type?od(a):0},keyCode:function(a){return"keydown"===a.type||"keyup"===a.type?a.keyCode:0},which:function(a){return"keypress"===\na.type?od(a):"keydown"===a.type||"keyup"===a.type?a.keyCode:0}}),Rd=rd(Qd),Sd=A({},Ad,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0}),Td=rd(Sd),Ud=A({},ud,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:zd}),Vd=rd(Ud),Wd=A({},sd,{propertyName:0,elapsedTime:0,pseudoElement:0}),Xd=rd(Wd),Yd=A({},Ad,{deltaX:function(a){return"deltaX"in a?a.deltaX:"wheelDeltaX"in a?-a.wheelDeltaX:0},\ndeltaY:function(a){return"deltaY"in a?a.deltaY:"wheelDeltaY"in a?-a.wheelDeltaY:"wheelDelta"in a?-a.wheelDelta:0},deltaZ:0,deltaMode:0}),Zd=rd(Yd),$d=[9,13,27,32],ae=ia&&"CompositionEvent"in window,be=null;ia&&"documentMode"in document&&(be=document.documentMode);var ce=ia&&"TextEvent"in window&&!be,de=ia&&(!ae||be&&8<be&&11>=be),ee=String.fromCharCode(32),fe=!1;\nfunction ge(a,b){switch(a){case "keyup":return-1!==$d.indexOf(b.keyCode);case "keydown":return 229!==b.keyCode;case "keypress":case "mousedown":case "focusout":return!0;default:return!1}}function he(a){a=a.detail;return"object"===typeof a&&"data"in a?a.data:null}var ie=!1;function je(a,b){switch(a){case "compositionend":return he(b);case "keypress":if(32!==b.which)return null;fe=!0;return ee;case "textInput":return a=b.data,a===ee&&fe?null:a;default:return null}}\nfunction ke(a,b){if(ie)return"compositionend"===a||!ae&&ge(a,b)?(a=nd(),md=ld=kd=null,ie=!1,a):null;switch(a){case "paste":return null;case "keypress":if(!(b.ctrlKey||b.altKey||b.metaKey)||b.ctrlKey&&b.altKey){if(b.char&&1<b.char.length)return b.char;if(b.which)return String.fromCharCode(b.which)}return null;case "compositionend":return de&&"ko"!==b.locale?null:b.data;default:return null}}\nvar le={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function me(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return"input"===b?!!le[a.type]:"textarea"===b?!0:!1}function ne(a,b,c,d){Eb(d);b=oe(b,"onChange");0<b.length&&(c=new td("onChange","change",null,c,d),a.push({event:c,listeners:b}))}var pe=null,qe=null;function re(a){se(a,0)}function te(a){var b=ue(a);if(Wa(b))return a}\nfunction ve(a,b){if("change"===a)return b}var we=!1;if(ia){var xe;if(ia){var ye="oninput"in document;if(!ye){var ze=document.createElement("div");ze.setAttribute("oninput","return;");ye="function"===typeof ze.oninput}xe=ye}else xe=!1;we=xe&&(!document.documentMode||9<document.documentMode)}function Ae(){pe&&(pe.detachEvent("onpropertychange",Be),qe=pe=null)}function Be(a){if("value"===a.propertyName&&te(qe)){var b=[];ne(b,qe,a,xb(a));Jb(re,b)}}\nfunction Ce(a,b,c){"focusin"===a?(Ae(),pe=b,qe=c,pe.attachEvent("onpropertychange",Be)):"focusout"===a&&Ae()}function De(a){if("selectionchange"===a||"keyup"===a||"keydown"===a)return te(qe)}function Ee(a,b){if("click"===a)return te(b)}function Fe(a,b){if("input"===a||"change"===a)return te(b)}function Ge(a,b){return a===b&&(0!==a||1/a===1/b)||a!==a&&b!==b}var He="function"===typeof Object.is?Object.is:Ge;\nfunction Ie(a,b){if(He(a,b))return!0;if("object"!==typeof a||null===a||"object"!==typeof b||null===b)return!1;var c=Object.keys(a),d=Object.keys(b);if(c.length!==d.length)return!1;for(d=0;d<c.length;d++){var e=c[d];if(!ja.call(b,e)||!He(a[e],b[e]))return!1}return!0}function Je(a){for(;a&&a.firstChild;)a=a.firstChild;return a}\nfunction Ke(a,b){var c=Je(a);a=0;for(var d;c;){if(3===c.nodeType){d=a+c.textContent.length;if(a<=b&&d>=b)return{node:c,offset:b-a};a=d}a:{for(;c;){if(c.nextSibling){c=c.nextSibling;break a}c=c.parentNode}c=void 0}c=Je(c)}}function Le(a,b){return a&&b?a===b?!0:a&&3===a.nodeType?!1:b&&3===b.nodeType?Le(a,b.parentNode):"contains"in a?a.contains(b):a.compareDocumentPosition?!!(a.compareDocumentPosition(b)&16):!1:!1}\nfunction Me(){for(var a=window,b=Xa();b instanceof a.HTMLIFrameElement;){try{var c="string"===typeof b.contentWindow.location.href}catch(d){c=!1}if(c)a=b.contentWindow;else break;b=Xa(a.document)}return b}function Ne(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return b&&("input"===b&&("text"===a.type||"search"===a.type||"tel"===a.type||"url"===a.type||"password"===a.type)||"textarea"===b||"true"===a.contentEditable)}\nfunction Oe(a){var b=Me(),c=a.focusedElem,d=a.selectionRange;if(b!==c&&c&&c.ownerDocument&&Le(c.ownerDocument.documentElement,c)){if(null!==d&&Ne(c))if(b=d.start,a=d.end,void 0===a&&(a=b),"selectionStart"in c)c.selectionStart=b,c.selectionEnd=Math.min(a,c.value.length);else if(a=(b=c.ownerDocument||document)&&b.defaultView||window,a.getSelection){a=a.getSelection();var e=c.textContent.length,f=Math.min(d.start,e);d=void 0===d.end?f:Math.min(d.end,e);!a.extend&&f>d&&(e=d,d=f,f=e);e=Ke(c,f);var g=Ke(c,\nd);e&&g&&(1!==a.rangeCount||a.anchorNode!==e.node||a.anchorOffset!==e.offset||a.focusNode!==g.node||a.focusOffset!==g.offset)&&(b=b.createRange(),b.setStart(e.node,e.offset),a.removeAllRanges(),f>d?(a.addRange(b),a.extend(g.node,g.offset)):(b.setEnd(g.node,g.offset),a.addRange(b)))}b=[];for(a=c;a=a.parentNode;)1===a.nodeType&&b.push({element:a,left:a.scrollLeft,top:a.scrollTop});"function"===typeof c.focus&&c.focus();for(c=0;c<b.length;c++)a=b[c],a.element.scrollLeft=a.left,a.element.scrollTop=a.top}}\nvar Pe=ia&&"documentMode"in document&&11>=document.documentMode,Qe=null,Re=null,Se=null,Te=!1;\nfunction Ue(a,b,c){var d=c.window===c?c.document:9===c.nodeType?c:c.ownerDocument;Te||null==Qe||Qe!==Xa(d)||(d=Qe,"selectionStart"in d&&Ne(d)?d={start:d.selectionStart,end:d.selectionEnd}:(d=(d.ownerDocument&&d.ownerDocument.defaultView||window).getSelection(),d={anchorNode:d.anchorNode,anchorOffset:d.anchorOffset,focusNode:d.focusNode,focusOffset:d.focusOffset}),Se&&Ie(Se,d)||(Se=d,d=oe(Re,"onSelect"),0<d.length&&(b=new td("onSelect","select",null,b,c),a.push({event:b,listeners:d}),b.target=Qe)))}\nfunction Ve(a,b){var c={};c[a.toLowerCase()]=b.toLowerCase();c["Webkit"+a]="webkit"+b;c["Moz"+a]="moz"+b;return c}var We={animationend:Ve("Animation","AnimationEnd"),animationiteration:Ve("Animation","AnimationIteration"),animationstart:Ve("Animation","AnimationStart"),transitionend:Ve("Transition","TransitionEnd")},Xe={},Ye={};\nia&&(Ye=document.createElement("div").style,"AnimationEvent"in window||(delete We.animationend.animation,delete We.animationiteration.animation,delete We.animationstart.animation),"TransitionEvent"in window||delete We.transitionend.transition);function Ze(a){if(Xe[a])return Xe[a];if(!We[a])return a;var b=We[a],c;for(c in b)if(b.hasOwnProperty(c)&&c in Ye)return Xe[a]=b[c];return a}var $e=Ze("animationend"),af=Ze("animationiteration"),bf=Ze("animationstart"),cf=Ze("transitionend"),df=new Map,ef="abort auxClick cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel".split(" ");\nfunction ff(a,b){df.set(a,b);fa(b,[a])}for(var gf=0;gf<ef.length;gf++){var hf=ef[gf],jf=hf.toLowerCase(),kf=hf[0].toUpperCase()+hf.slice(1);ff(jf,"on"+kf)}ff($e,"onAnimationEnd");ff(af,"onAnimationIteration");ff(bf,"onAnimationStart");ff("dblclick","onDoubleClick");ff("focusin","onFocus");ff("focusout","onBlur");ff(cf,"onTransitionEnd");ha("onMouseEnter",["mouseout","mouseover"]);ha("onMouseLeave",["mouseout","mouseover"]);ha("onPointerEnter",["pointerout","pointerover"]);\nha("onPointerLeave",["pointerout","pointerover"]);fa("onChange","change click focusin focusout input keydown keyup selectionchange".split(" "));fa("onSelect","focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange".split(" "));fa("onBeforeInput",["compositionend","keypress","textInput","paste"]);fa("onCompositionEnd","compositionend focusout keydown keypress keyup mousedown".split(" "));fa("onCompositionStart","compositionstart focusout keydown keypress keyup mousedown".split(" "));\nfa("onCompositionUpdate","compositionupdate focusout keydown keypress keyup mousedown".split(" "));var lf="abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange resize seeked seeking stalled suspend timeupdate volumechange waiting".split(" "),mf=new Set("cancel close invalid load scroll toggle".split(" ").concat(lf));\nfunction nf(a,b,c){var d=a.type||"unknown-event";a.currentTarget=c;Ub(d,b,void 0,a);a.currentTarget=null}\nfunction se(a,b){b=0!==(b&4);for(var c=0;c<a.length;c++){var d=a[c],e=d.event;d=d.listeners;a:{var f=void 0;if(b)for(var g=d.length-1;0<=g;g--){var h=d[g],k=h.instance,l=h.currentTarget;h=h.listener;if(k!==f&&e.isPropagationStopped())break a;nf(e,h,l);f=k}else for(g=0;g<d.length;g++){h=d[g];k=h.instance;l=h.currentTarget;h=h.listener;if(k!==f&&e.isPropagationStopped())break a;nf(e,h,l);f=k}}}if(Qb)throw a=Rb,Qb=!1,Rb=null,a;}\nfunction D(a,b){var c=b[of];void 0===c&&(c=b[of]=new Set);var d=a+"__bubble";c.has(d)||(pf(b,a,2,!1),c.add(d))}function qf(a,b,c){var d=0;b&&(d|=4);pf(c,a,d,b)}var rf="_reactListening"+Math.random().toString(36).slice(2);function sf(a){if(!a[rf]){a[rf]=!0;da.forEach(function(b){"selectionchange"!==b&&(mf.has(b)||qf(b,!1,a),qf(b,!0,a))});var b=9===a.nodeType?a:a.ownerDocument;null===b||b[rf]||(b[rf]=!0,qf("selectionchange",!1,b))}}\nfunction pf(a,b,c,d){switch(jd(b)){case 1:var e=ed;break;case 4:e=gd;break;default:e=fd}c=e.bind(null,b,c,a);e=void 0;!Lb||"touchstart"!==b&&"touchmove"!==b&&"wheel"!==b||(e=!0);d?void 0!==e?a.addEventListener(b,c,{capture:!0,passive:e}):a.addEventListener(b,c,!0):void 0!==e?a.addEventListener(b,c,{passive:e}):a.addEventListener(b,c,!1)}\nfunction hd(a,b,c,d,e){var f=d;if(0===(b&1)&&0===(b&2)&&null!==d)a:for(;;){if(null===d)return;var g=d.tag;if(3===g||4===g){var h=d.stateNode.containerInfo;if(h===e||8===h.nodeType&&h.parentNode===e)break;if(4===g)for(g=d.return;null!==g;){var k=g.tag;if(3===k||4===k)if(k=g.stateNode.containerInfo,k===e||8===k.nodeType&&k.parentNode===e)return;g=g.return}for(;null!==h;){g=Wc(h);if(null===g)return;k=g.tag;if(5===k||6===k){d=f=g;continue a}h=h.parentNode}}d=d.return}Jb(function(){var d=f,e=xb(c),g=[];\na:{var h=df.get(a);if(void 0!==h){var k=td,n=a;switch(a){case "keypress":if(0===od(c))break a;case "keydown":case "keyup":k=Rd;break;case "focusin":n="focus";k=Fd;break;case "focusout":n="blur";k=Fd;break;case "beforeblur":case "afterblur":k=Fd;break;case "click":if(2===c.button)break a;case "auxclick":case "dblclick":case "mousedown":case "mousemove":case "mouseup":case "mouseout":case "mouseover":case "contextmenu":k=Bd;break;case "drag":case "dragend":case "dragenter":case "dragexit":case "dragleave":case "dragover":case "dragstart":case "drop":k=\nDd;break;case "touchcancel":case "touchend":case "touchmove":case "touchstart":k=Vd;break;case $e:case af:case bf:k=Hd;break;case cf:k=Xd;break;case "scroll":k=vd;break;case "wheel":k=Zd;break;case "copy":case "cut":case "paste":k=Jd;break;case "gotpointercapture":case "lostpointercapture":case "pointercancel":case "pointerdown":case "pointermove":case "pointerout":case "pointerover":case "pointerup":k=Td}var t=0!==(b&4),J=!t&&"scroll"===a,x=t?null!==h?h+"Capture":null:h;t=[];for(var w=d,u;null!==\nw;){u=w;var F=u.stateNode;5===u.tag&&null!==F&&(u=F,null!==x&&(F=Kb(w,x),null!=F&&t.push(tf(w,F,u))));if(J)break;w=w.return}0<t.length&&(h=new k(h,n,null,c,e),g.push({event:h,listeners:t}))}}if(0===(b&7)){a:{h="mouseover"===a||"pointerover"===a;k="mouseout"===a||"pointerout"===a;if(h&&c!==wb&&(n=c.relatedTarget||c.fromElement)&&(Wc(n)||n[uf]))break a;if(k||h){h=e.window===e?e:(h=e.ownerDocument)?h.defaultView||h.parentWindow:window;if(k){if(n=c.relatedTarget||c.toElement,k=d,n=n?Wc(n):null,null!==\nn&&(J=Vb(n),n!==J||5!==n.tag&&6!==n.tag))n=null}else k=null,n=d;if(k!==n){t=Bd;F="onMouseLeave";x="onMouseEnter";w="mouse";if("pointerout"===a||"pointerover"===a)t=Td,F="onPointerLeave",x="onPointerEnter",w="pointer";J=null==k?h:ue(k);u=null==n?h:ue(n);h=new t(F,w+"leave",k,c,e);h.target=J;h.relatedTarget=u;F=null;Wc(e)===d&&(t=new t(x,w+"enter",n,c,e),t.target=u,t.relatedTarget=J,F=t);J=F;if(k&&n)b:{t=k;x=n;w=0;for(u=t;u;u=vf(u))w++;u=0;for(F=x;F;F=vf(F))u++;for(;0<w-u;)t=vf(t),w--;for(;0<u-w;)x=\nvf(x),u--;for(;w--;){if(t===x||null!==x&&t===x.alternate)break b;t=vf(t);x=vf(x)}t=null}else t=null;null!==k&&wf(g,h,k,t,!1);null!==n&&null!==J&&wf(g,J,n,t,!0)}}}a:{h=d?ue(d):window;k=h.nodeName&&h.nodeName.toLowerCase();if("select"===k||"input"===k&&"file"===h.type)var na=ve;else if(me(h))if(we)na=Fe;else{na=De;var xa=Ce}else(k=h.nodeName)&&"input"===k.toLowerCase()&&("checkbox"===h.type||"radio"===h.type)&&(na=Ee);if(na&&(na=na(a,d))){ne(g,na,c,e);break a}xa&&xa(a,h,d);"focusout"===a&&(xa=h._wrapperState)&&\nxa.controlled&&"number"===h.type&&cb(h,"number",h.value)}xa=d?ue(d):window;switch(a){case "focusin":if(me(xa)||"true"===xa.contentEditable)Qe=xa,Re=d,Se=null;break;case "focusout":Se=Re=Qe=null;break;case "mousedown":Te=!0;break;case "contextmenu":case "mouseup":case "dragend":Te=!1;Ue(g,c,e);break;case "selectionchange":if(Pe)break;case "keydown":case "keyup":Ue(g,c,e)}var $a;if(ae)b:{switch(a){case "compositionstart":var ba="onCompositionStart";break b;case "compositionend":ba="onCompositionEnd";\nbreak b;case "compositionupdate":ba="onCompositionUpdate";break b}ba=void 0}else ie?ge(a,c)&&(ba="onCompositionEnd"):"keydown"===a&&229===c.keyCode&&(ba="onCompositionStart");ba&&(de&&"ko"!==c.locale&&(ie||"onCompositionStart"!==ba?"onCompositionEnd"===ba&&ie&&($a=nd()):(kd=e,ld="value"in kd?kd.value:kd.textContent,ie=!0)),xa=oe(d,ba),0<xa.length&&(ba=new Ld(ba,a,null,c,e),g.push({event:ba,listeners:xa}),$a?ba.data=$a:($a=he(c),null!==$a&&(ba.data=$a))));if($a=ce?je(a,c):ke(a,c))d=oe(d,"onBeforeInput"),\n0<d.length&&(e=new Ld("onBeforeInput","beforeinput",null,c,e),g.push({event:e,listeners:d}),e.data=$a)}se(g,b)})}function tf(a,b,c){return{instance:a,listener:b,currentTarget:c}}function oe(a,b){for(var c=b+"Capture",d=[];null!==a;){var e=a,f=e.stateNode;5===e.tag&&null!==f&&(e=f,f=Kb(a,c),null!=f&&d.unshift(tf(a,f,e)),f=Kb(a,b),null!=f&&d.push(tf(a,f,e)));a=a.return}return d}function vf(a){if(null===a)return null;do a=a.return;while(a&&5!==a.tag);return a?a:null}\nfunction wf(a,b,c,d,e){for(var f=b._reactName,g=[];null!==c&&c!==d;){var h=c,k=h.alternate,l=h.stateNode;if(null!==k&&k===d)break;5===h.tag&&null!==l&&(h=l,e?(k=Kb(c,f),null!=k&&g.unshift(tf(c,k,h))):e||(k=Kb(c,f),null!=k&&g.push(tf(c,k,h))));c=c.return}0!==g.length&&a.push({event:b,listeners:g})}var xf=/\\r\\n?/g,yf=/\\u0000|\\uFFFD/g;function zf(a){return("string"===typeof a?a:""+a).replace(xf,"\\n").replace(yf,"")}function Af(a,b,c){b=zf(b);if(zf(a)!==b&&c)throw Error(p(425));}function Bf(){}\nvar Cf=null,Df=null;function Ef(a,b){return"textarea"===a||"noscript"===a||"string"===typeof b.children||"number"===typeof b.children||"object"===typeof b.dangerouslySetInnerHTML&&null!==b.dangerouslySetInnerHTML&&null!=b.dangerouslySetInnerHTML.__html}\nvar Ff="function"===typeof setTimeout?setTimeout:void 0,Gf="function"===typeof clearTimeout?clearTimeout:void 0,Hf="function"===typeof Promise?Promise:void 0,Jf="function"===typeof queueMicrotask?queueMicrotask:"undefined"!==typeof Hf?function(a){return Hf.resolve(null).then(a).catch(If)}:Ff;function If(a){setTimeout(function(){throw a;})}\nfunction Kf(a,b){var c=b,d=0;do{var e=c.nextSibling;a.removeChild(c);if(e&&8===e.nodeType)if(c=e.data,"/$"===c){if(0===d){a.removeChild(e);bd(b);return}d--}else"$"!==c&&"$?"!==c&&"$!"!==c||d++;c=e}while(c);bd(b)}function Lf(a){for(;null!=a;a=a.nextSibling){var b=a.nodeType;if(1===b||3===b)break;if(8===b){b=a.data;if("$"===b||"$!"===b||"$?"===b)break;if("/$"===b)return null}}return a}\nfunction Mf(a){a=a.previousSibling;for(var b=0;a;){if(8===a.nodeType){var c=a.data;if("$"===c||"$!"===c||"$?"===c){if(0===b)return a;b--}else"/$"===c&&b++}a=a.previousSibling}return null}var Nf=Math.random().toString(36).slice(2),Of="__reactFiber$"+Nf,Pf="__reactProps$"+Nf,uf="__reactContainer$"+Nf,of="__reactEvents$"+Nf,Qf="__reactListeners$"+Nf,Rf="__reactHandles$"+Nf;\nfunction Wc(a){var b=a[Of];if(b)return b;for(var c=a.parentNode;c;){if(b=c[uf]||c[Of]){c=b.alternate;if(null!==b.child||null!==c&&null!==c.child)for(a=Mf(a);null!==a;){if(c=a[Of])return c;a=Mf(a)}return b}a=c;c=a.parentNode}return null}function Cb(a){a=a[Of]||a[uf];return!a||5!==a.tag&&6!==a.tag&&13!==a.tag&&3!==a.tag?null:a}function ue(a){if(5===a.tag||6===a.tag)return a.stateNode;throw Error(p(33));}function Db(a){return a[Pf]||null}var Sf=[],Tf=-1;function Uf(a){return{current:a}}\nfunction E(a){0>Tf||(a.current=Sf[Tf],Sf[Tf]=null,Tf--)}function G(a,b){Tf++;Sf[Tf]=a.current;a.current=b}var Vf={},H=Uf(Vf),Wf=Uf(!1),Xf=Vf;function Yf(a,b){var c=a.type.contextTypes;if(!c)return Vf;var d=a.stateNode;if(d&&d.__reactInternalMemoizedUnmaskedChildContext===b)return d.__reactInternalMemoizedMaskedChildContext;var e={},f;for(f in c)e[f]=b[f];d&&(a=a.stateNode,a.__reactInternalMemoizedUnmaskedChildContext=b,a.__reactInternalMemoizedMaskedChildContext=e);return e}\nfunction Zf(a){a=a.childContextTypes;return null!==a&&void 0!==a}function $f(){E(Wf);E(H)}function ag(a,b,c){if(H.current!==Vf)throw Error(p(168));G(H,b);G(Wf,c)}function bg(a,b,c){var d=a.stateNode;b=b.childContextTypes;if("function"!==typeof d.getChildContext)return c;d=d.getChildContext();for(var e in d)if(!(e in b))throw Error(p(108,Ra(a)||"Unknown",e));return A({},c,d)}\nfunction cg(a){a=(a=a.stateNode)&&a.__reactInternalMemoizedMergedChildContext||Vf;Xf=H.current;G(H,a);G(Wf,Wf.current);return!0}function dg(a,b,c){var d=a.stateNode;if(!d)throw Error(p(169));c?(a=bg(a,b,Xf),d.__reactInternalMemoizedMergedChildContext=a,E(Wf),E(H),G(H,a)):E(Wf);G(Wf,c)}var eg=null,fg=!1,gg=!1;function hg(a){null===eg?eg=[a]:eg.push(a)}function ig(a){fg=!0;hg(a)}\nfunction jg(){if(!gg&&null!==eg){gg=!0;var a=0,b=C;try{var c=eg;for(C=1;a<c.length;a++){var d=c[a];do d=d(!0);while(null!==d)}eg=null;fg=!1}catch(e){throw null!==eg&&(eg=eg.slice(a+1)),ac(fc,jg),e;}finally{C=b,gg=!1}}return null}var kg=[],lg=0,mg=null,ng=0,og=[],pg=0,qg=null,rg=1,sg="";function tg(a,b){kg[lg++]=ng;kg[lg++]=mg;mg=a;ng=b}\nfunction ug(a,b,c){og[pg++]=rg;og[pg++]=sg;og[pg++]=qg;qg=a;var d=rg;a=sg;var e=32-oc(d)-1;d&=~(1<<e);c+=1;var f=32-oc(b)+e;if(30<f){var g=e-e%5;f=(d&(1<<g)-1).toString(32);d>>=g;e-=g;rg=1<<32-oc(b)+e|c<<e|d;sg=f+a}else rg=1<<f|c<<e|d,sg=a}function vg(a){null!==a.return&&(tg(a,1),ug(a,1,0))}function wg(a){for(;a===mg;)mg=kg[--lg],kg[lg]=null,ng=kg[--lg],kg[lg]=null;for(;a===qg;)qg=og[--pg],og[pg]=null,sg=og[--pg],og[pg]=null,rg=og[--pg],og[pg]=null}var xg=null,yg=null,I=!1,zg=null;\nfunction Ag(a,b){var c=Bg(5,null,null,0);c.elementType="DELETED";c.stateNode=b;c.return=a;b=a.deletions;null===b?(a.deletions=[c],a.flags|=16):b.push(c)}\nfunction Cg(a,b){switch(a.tag){case 5:var c=a.type;b=1!==b.nodeType||c.toLowerCase()!==b.nodeName.toLowerCase()?null:b;return null!==b?(a.stateNode=b,xg=a,yg=Lf(b.firstChild),!0):!1;case 6:return b=""===a.pendingProps||3!==b.nodeType?null:b,null!==b?(a.stateNode=b,xg=a,yg=null,!0):!1;case 13:return b=8!==b.nodeType?null:b,null!==b?(c=null!==qg?{id:rg,overflow:sg}:null,a.memoizedState={dehydrated:b,treeContext:c,retryLane:1073741824},c=Bg(18,null,null,0),c.stateNode=b,c.return=a,a.child=c,xg=a,yg=\nnull,!0):!1;default:return!1}}function Dg(a){return 0!==(a.mode&1)&&0===(a.flags&128)}function Eg(a){if(I){var b=yg;if(b){var c=b;if(!Cg(a,b)){if(Dg(a))throw Error(p(418));b=Lf(c.nextSibling);var d=xg;b&&Cg(a,b)?Ag(d,c):(a.flags=a.flags&-4097|2,I=!1,xg=a)}}else{if(Dg(a))throw Error(p(418));a.flags=a.flags&-4097|2;I=!1;xg=a}}}function Fg(a){for(a=a.return;null!==a&&5!==a.tag&&3!==a.tag&&13!==a.tag;)a=a.return;xg=a}\nfunction Gg(a){if(a!==xg)return!1;if(!I)return Fg(a),I=!0,!1;var b;(b=3!==a.tag)&&!(b=5!==a.tag)&&(b=a.type,b="head"!==b&&"body"!==b&&!Ef(a.type,a.memoizedProps));if(b&&(b=yg)){if(Dg(a))throw Hg(),Error(p(418));for(;b;)Ag(a,b),b=Lf(b.nextSibling)}Fg(a);if(13===a.tag){a=a.memoizedState;a=null!==a?a.dehydrated:null;if(!a)throw Error(p(317));a:{a=a.nextSibling;for(b=0;a;){if(8===a.nodeType){var c=a.data;if("/$"===c){if(0===b){yg=Lf(a.nextSibling);break a}b--}else"$"!==c&&"$!"!==c&&"$?"!==c||b++}a=a.nextSibling}yg=\nnull}}else yg=xg?Lf(a.stateNode.nextSibling):null;return!0}function Hg(){for(var a=yg;a;)a=Lf(a.nextSibling)}function Ig(){yg=xg=null;I=!1}function Jg(a){null===zg?zg=[a]:zg.push(a)}var Kg=ua.ReactCurrentBatchConfig;function Lg(a,b){if(a&&a.defaultProps){b=A({},b);a=a.defaultProps;for(var c in a)void 0===b[c]&&(b[c]=a[c]);return b}return b}var Mg=Uf(null),Ng=null,Og=null,Pg=null;function Qg(){Pg=Og=Ng=null}function Rg(a){var b=Mg.current;E(Mg);a._currentValue=b}\nfunction Sg(a,b,c){for(;null!==a;){var d=a.alternate;(a.childLanes&b)!==b?(a.childLanes|=b,null!==d&&(d.childLanes|=b)):null!==d&&(d.childLanes&b)!==b&&(d.childLanes|=b);if(a===c)break;a=a.return}}function Tg(a,b){Ng=a;Pg=Og=null;a=a.dependencies;null!==a&&null!==a.firstContext&&(0!==(a.lanes&b)&&(Ug=!0),a.firstContext=null)}\nfunction Vg(a){var b=a._currentValue;if(Pg!==a)if(a={context:a,memoizedValue:b,next:null},null===Og){if(null===Ng)throw Error(p(308));Og=a;Ng.dependencies={lanes:0,firstContext:a}}else Og=Og.next=a;return b}var Wg=null;function Xg(a){null===Wg?Wg=[a]:Wg.push(a)}function Yg(a,b,c,d){var e=b.interleaved;null===e?(c.next=c,Xg(b)):(c.next=e.next,e.next=c);b.interleaved=c;return Zg(a,d)}\nfunction Zg(a,b){a.lanes|=b;var c=a.alternate;null!==c&&(c.lanes|=b);c=a;for(a=a.return;null!==a;)a.childLanes|=b,c=a.alternate,null!==c&&(c.childLanes|=b),c=a,a=a.return;return 3===c.tag?c.stateNode:null}var $g=!1;function ah(a){a.updateQueue={baseState:a.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}\nfunction bh(a,b){a=a.updateQueue;b.updateQueue===a&&(b.updateQueue={baseState:a.baseState,firstBaseUpdate:a.firstBaseUpdate,lastBaseUpdate:a.lastBaseUpdate,shared:a.shared,effects:a.effects})}function ch(a,b){return{eventTime:a,lane:b,tag:0,payload:null,callback:null,next:null}}\nfunction dh(a,b,c){var d=a.updateQueue;if(null===d)return null;d=d.shared;if(0!==(K&2)){var e=d.pending;null===e?b.next=b:(b.next=e.next,e.next=b);d.pending=b;return Zg(a,c)}e=d.interleaved;null===e?(b.next=b,Xg(d)):(b.next=e.next,e.next=b);d.interleaved=b;return Zg(a,c)}function eh(a,b,c){b=b.updateQueue;if(null!==b&&(b=b.shared,0!==(c&4194240))){var d=b.lanes;d&=a.pendingLanes;c|=d;b.lanes=c;Cc(a,c)}}\nfunction fh(a,b){var c=a.updateQueue,d=a.alternate;if(null!==d&&(d=d.updateQueue,c===d)){var e=null,f=null;c=c.firstBaseUpdate;if(null!==c){do{var g={eventTime:c.eventTime,lane:c.lane,tag:c.tag,payload:c.payload,callback:c.callback,next:null};null===f?e=f=g:f=f.next=g;c=c.next}while(null!==c);null===f?e=f=b:f=f.next=b}else e=f=b;c={baseState:d.baseState,firstBaseUpdate:e,lastBaseUpdate:f,shared:d.shared,effects:d.effects};a.updateQueue=c;return}a=c.lastBaseUpdate;null===a?c.firstBaseUpdate=b:a.next=\nb;c.lastBaseUpdate=b}\nfunction gh(a,b,c,d){var e=a.updateQueue;$g=!1;var f=e.firstBaseUpdate,g=e.lastBaseUpdate,h=e.shared.pending;if(null!==h){e.shared.pending=null;var k=h,l=k.next;k.next=null;null===g?f=l:g.next=l;g=k;var m=a.alternate;null!==m&&(m=m.updateQueue,h=m.lastBaseUpdate,h!==g&&(null===h?m.firstBaseUpdate=l:h.next=l,m.lastBaseUpdate=k))}if(null!==f){var q=e.baseState;g=0;m=l=k=null;h=f;do{var r=h.lane,y=h.eventTime;if((d&r)===r){null!==m&&(m=m.next={eventTime:y,lane:0,tag:h.tag,payload:h.payload,callback:h.callback,\nnext:null});a:{var n=a,t=h;r=b;y=c;switch(t.tag){case 1:n=t.payload;if("function"===typeof n){q=n.call(y,q,r);break a}q=n;break a;case 3:n.flags=n.flags&-65537|128;case 0:n=t.payload;r="function"===typeof n?n.call(y,q,r):n;if(null===r||void 0===r)break a;q=A({},q,r);break a;case 2:$g=!0}}null!==h.callback&&0!==h.lane&&(a.flags|=64,r=e.effects,null===r?e.effects=[h]:r.push(h))}else y={eventTime:y,lane:r,tag:h.tag,payload:h.payload,callback:h.callback,next:null},null===m?(l=m=y,k=q):m=m.next=y,g|=r;\nh=h.next;if(null===h)if(h=e.shared.pending,null===h)break;else r=h,h=r.next,r.next=null,e.lastBaseUpdate=r,e.shared.pending=null}while(1);null===m&&(k=q);e.baseState=k;e.firstBaseUpdate=l;e.lastBaseUpdate=m;b=e.shared.interleaved;if(null!==b){e=b;do g|=e.lane,e=e.next;while(e!==b)}else null===f&&(e.shared.lanes=0);hh|=g;a.lanes=g;a.memoizedState=q}}\nfunction ih(a,b,c){a=b.effects;b.effects=null;if(null!==a)for(b=0;b<a.length;b++){var d=a[b],e=d.callback;if(null!==e){d.callback=null;d=c;if("function"!==typeof e)throw Error(p(191,e));e.call(d)}}}var jh=(new aa.Component).refs;function kh(a,b,c,d){b=a.memoizedState;c=c(d,b);c=null===c||void 0===c?b:A({},b,c);a.memoizedState=c;0===a.lanes&&(a.updateQueue.baseState=c)}\nvar nh={isMounted:function(a){return(a=a._reactInternals)?Vb(a)===a:!1},enqueueSetState:function(a,b,c){a=a._reactInternals;var d=L(),e=lh(a),f=ch(d,e);f.payload=b;void 0!==c&&null!==c&&(f.callback=c);b=dh(a,f,e);null!==b&&(mh(b,a,e,d),eh(b,a,e))},enqueueReplaceState:function(a,b,c){a=a._reactInternals;var d=L(),e=lh(a),f=ch(d,e);f.tag=1;f.payload=b;void 0!==c&&null!==c&&(f.callback=c);b=dh(a,f,e);null!==b&&(mh(b,a,e,d),eh(b,a,e))},enqueueForceUpdate:function(a,b){a=a._reactInternals;var c=L(),d=\nlh(a),e=ch(c,d);e.tag=2;void 0!==b&&null!==b&&(e.callback=b);b=dh(a,e,d);null!==b&&(mh(b,a,d,c),eh(b,a,d))}};function oh(a,b,c,d,e,f,g){a=a.stateNode;return"function"===typeof a.shouldComponentUpdate?a.shouldComponentUpdate(d,f,g):b.prototype&&b.prototype.isPureReactComponent?!Ie(c,d)||!Ie(e,f):!0}\nfunction ph(a,b,c){var d=!1,e=Vf;var f=b.contextType;"object"===typeof f&&null!==f?f=Vg(f):(e=Zf(b)?Xf:H.current,d=b.contextTypes,f=(d=null!==d&&void 0!==d)?Yf(a,e):Vf);b=new b(c,f);a.memoizedState=null!==b.state&&void 0!==b.state?b.state:null;b.updater=nh;a.stateNode=b;b._reactInternals=a;d&&(a=a.stateNode,a.__reactInternalMemoizedUnmaskedChildContext=e,a.__reactInternalMemoizedMaskedChildContext=f);return b}\nfunction qh(a,b,c,d){a=b.state;"function"===typeof b.componentWillReceiveProps&&b.componentWillReceiveProps(c,d);"function"===typeof b.UNSAFE_componentWillReceiveProps&&b.UNSAFE_componentWillReceiveProps(c,d);b.state!==a&&nh.enqueueReplaceState(b,b.state,null)}\nfunction rh(a,b,c,d){var e=a.stateNode;e.props=c;e.state=a.memoizedState;e.refs=jh;ah(a);var f=b.contextType;"object"===typeof f&&null!==f?e.context=Vg(f):(f=Zf(b)?Xf:H.current,e.context=Yf(a,f));e.state=a.memoizedState;f=b.getDerivedStateFromProps;"function"===typeof f&&(kh(a,b,f,c),e.state=a.memoizedState);"function"===typeof b.getDerivedStateFromProps||"function"===typeof e.getSnapshotBeforeUpdate||"function"!==typeof e.UNSAFE_componentWillMount&&"function"!==typeof e.componentWillMount||(b=e.state,\n"function"===typeof e.componentWillMount&&e.componentWillMount(),"function"===typeof e.UNSAFE_componentWillMount&&e.UNSAFE_componentWillMount(),b!==e.state&&nh.enqueueReplaceState(e,e.state,null),gh(a,c,e,d),e.state=a.memoizedState);"function"===typeof e.componentDidMount&&(a.flags|=4194308)}\nfunction sh(a,b,c){a=c.ref;if(null!==a&&"function"!==typeof a&&"object"!==typeof a){if(c._owner){c=c._owner;if(c){if(1!==c.tag)throw Error(p(309));var d=c.stateNode}if(!d)throw Error(p(147,a));var e=d,f=""+a;if(null!==b&&null!==b.ref&&"function"===typeof b.ref&&b.ref._stringRef===f)return b.ref;b=function(a){var b=e.refs;b===jh&&(b=e.refs={});null===a?delete b[f]:b[f]=a};b._stringRef=f;return b}if("string"!==typeof a)throw Error(p(284));if(!c._owner)throw Error(p(290,a));}return a}\nfunction th(a,b){a=Object.prototype.toString.call(b);throw Error(p(31,"[object Object]"===a?"object with keys {"+Object.keys(b).join(", ")+"}":a));}function uh(a){var b=a._init;return b(a._payload)}\nfunction vh(a){function b(b,c){if(a){var d=b.deletions;null===d?(b.deletions=[c],b.flags|=16):d.push(c)}}function c(c,d){if(!a)return null;for(;null!==d;)b(c,d),d=d.sibling;return null}function d(a,b){for(a=new Map;null!==b;)null!==b.key?a.set(b.key,b):a.set(b.index,b),b=b.sibling;return a}function e(a,b){a=wh(a,b);a.index=0;a.sibling=null;return a}function f(b,c,d){b.index=d;if(!a)return b.flags|=1048576,c;d=b.alternate;if(null!==d)return d=d.index,d<c?(b.flags|=2,c):d;b.flags|=2;return c}function g(b){a&&\nnull===b.alternate&&(b.flags|=2);return b}function h(a,b,c,d){if(null===b||6!==b.tag)return b=xh(c,a.mode,d),b.return=a,b;b=e(b,c);b.return=a;return b}function k(a,b,c,d){var f=c.type;if(f===ya)return m(a,b,c.props.children,d,c.key);if(null!==b&&(b.elementType===f||"object"===typeof f&&null!==f&&f.$$typeof===Ha&&uh(f)===b.type))return d=e(b,c.props),d.ref=sh(a,b,c),d.return=a,d;d=yh(c.type,c.key,c.props,null,a.mode,d);d.ref=sh(a,b,c);d.return=a;return d}function l(a,b,c,d){if(null===b||4!==b.tag||\nb.stateNode.containerInfo!==c.containerInfo||b.stateNode.implementation!==c.implementation)return b=zh(c,a.mode,d),b.return=a,b;b=e(b,c.children||[]);b.return=a;return b}function m(a,b,c,d,f){if(null===b||7!==b.tag)return b=Ah(c,a.mode,d,f),b.return=a,b;b=e(b,c);b.return=a;return b}function q(a,b,c){if("string"===typeof b&&""!==b||"number"===typeof b)return b=xh(""+b,a.mode,c),b.return=a,b;if("object"===typeof b&&null!==b){switch(b.$$typeof){case va:return c=yh(b.type,b.key,b.props,null,a.mode,c),\nc.ref=sh(a,null,b),c.return=a,c;case wa:return b=zh(b,a.mode,c),b.return=a,b;case Ha:var d=b._init;return q(a,d(b._payload),c)}if(eb(b)||Ka(b))return b=Ah(b,a.mode,c,null),b.return=a,b;th(a,b)}return null}function r(a,b,c,d){var e=null!==b?b.key:null;if("string"===typeof c&&""!==c||"number"===typeof c)return null!==e?null:h(a,b,""+c,d);if("object"===typeof c&&null!==c){switch(c.$$typeof){case va:return c.key===e?k(a,b,c,d):null;case wa:return c.key===e?l(a,b,c,d):null;case Ha:return e=c._init,r(a,\nb,e(c._payload),d)}if(eb(c)||Ka(c))return null!==e?null:m(a,b,c,d,null);th(a,c)}return null}function y(a,b,c,d,e){if("string"===typeof d&&""!==d||"number"===typeof d)return a=a.get(c)||null,h(b,a,""+d,e);if("object"===typeof d&&null!==d){switch(d.$$typeof){case va:return a=a.get(null===d.key?c:d.key)||null,k(b,a,d,e);case wa:return a=a.get(null===d.key?c:d.key)||null,l(b,a,d,e);case Ha:var f=d._init;return y(a,b,c,f(d._payload),e)}if(eb(d)||Ka(d))return a=a.get(c)||null,m(b,a,d,e,null);th(b,d)}return null}\nfunction n(e,g,h,k){for(var l=null,m=null,u=g,w=g=0,x=null;null!==u&&w<h.length;w++){u.index>w?(x=u,u=null):x=u.sibling;var n=r(e,u,h[w],k);if(null===n){null===u&&(u=x);break}a&&u&&null===n.alternate&&b(e,u);g=f(n,g,w);null===m?l=n:m.sibling=n;m=n;u=x}if(w===h.length)return c(e,u),I&&tg(e,w),l;if(null===u){for(;w<h.length;w++)u=q(e,h[w],k),null!==u&&(g=f(u,g,w),null===m?l=u:m.sibling=u,m=u);I&&tg(e,w);return l}for(u=d(e,u);w<h.length;w++)x=y(u,e,w,h[w],k),null!==x&&(a&&null!==x.alternate&&u.delete(null===\nx.key?w:x.key),g=f(x,g,w),null===m?l=x:m.sibling=x,m=x);a&&u.forEach(function(a){return b(e,a)});I&&tg(e,w);return l}function t(e,g,h,k){var l=Ka(h);if("function"!==typeof l)throw Error(p(150));h=l.call(h);if(null==h)throw Error(p(151));for(var u=l=null,m=g,w=g=0,x=null,n=h.next();null!==m&&!n.done;w++,n=h.next()){m.index>w?(x=m,m=null):x=m.sibling;var t=r(e,m,n.value,k);if(null===t){null===m&&(m=x);break}a&&m&&null===t.alternate&&b(e,m);g=f(t,g,w);null===u?l=t:u.sibling=t;u=t;m=x}if(n.done)return c(e,\nm),I&&tg(e,w),l;if(null===m){for(;!n.done;w++,n=h.next())n=q(e,n.value,k),null!==n&&(g=f(n,g,w),null===u?l=n:u.sibling=n,u=n);I&&tg(e,w);return l}for(m=d(e,m);!n.done;w++,n=h.next())n=y(m,e,w,n.value,k),null!==n&&(a&&null!==n.alternate&&m.delete(null===n.key?w:n.key),g=f(n,g,w),null===u?l=n:u.sibling=n,u=n);a&&m.forEach(function(a){return b(e,a)});I&&tg(e,w);return l}function J(a,d,f,h){"object"===typeof f&&null!==f&&f.type===ya&&null===f.key&&(f=f.props.children);if("object"===typeof f&&null!==f){switch(f.$$typeof){case va:a:{for(var k=\nf.key,l=d;null!==l;){if(l.key===k){k=f.type;if(k===ya){if(7===l.tag){c(a,l.sibling);d=e(l,f.props.children);d.return=a;a=d;break a}}else if(l.elementType===k||"object"===typeof k&&null!==k&&k.$$typeof===Ha&&uh(k)===l.type){c(a,l.sibling);d=e(l,f.props);d.ref=sh(a,l,f);d.return=a;a=d;break a}c(a,l);break}else b(a,l);l=l.sibling}f.type===ya?(d=Ah(f.props.children,a.mode,h,f.key),d.return=a,a=d):(h=yh(f.type,f.key,f.props,null,a.mode,h),h.ref=sh(a,d,f),h.return=a,a=h)}return g(a);case wa:a:{for(l=f.key;null!==\nd;){if(d.key===l)if(4===d.tag&&d.stateNode.containerInfo===f.containerInfo&&d.stateNode.implementation===f.implementation){c(a,d.sibling);d=e(d,f.children||[]);d.return=a;a=d;break a}else{c(a,d);break}else b(a,d);d=d.sibling}d=zh(f,a.mode,h);d.return=a;a=d}return g(a);case Ha:return l=f._init,J(a,d,l(f._payload),h)}if(eb(f))return n(a,d,f,h);if(Ka(f))return t(a,d,f,h);th(a,f)}return"string"===typeof f&&""!==f||"number"===typeof f?(f=""+f,null!==d&&6===d.tag?(c(a,d.sibling),d=e(d,f),d.return=a,a=d):\n(c(a,d),d=xh(f,a.mode,h),d.return=a,a=d),g(a)):c(a,d)}return J}var Bh=vh(!0),Ch=vh(!1),Dh={},Eh=Uf(Dh),Fh=Uf(Dh),Gh=Uf(Dh);function Hh(a){if(a===Dh)throw Error(p(174));return a}function Ih(a,b){G(Gh,b);G(Fh,a);G(Eh,Dh);a=b.nodeType;switch(a){case 9:case 11:b=(b=b.documentElement)?b.namespaceURI:lb(null,"");break;default:a=8===a?b.parentNode:b,b=a.namespaceURI||null,a=a.tagName,b=lb(b,a)}E(Eh);G(Eh,b)}function Jh(){E(Eh);E(Fh);E(Gh)}\nfunction Kh(a){Hh(Gh.current);var b=Hh(Eh.current);var c=lb(b,a.type);b!==c&&(G(Fh,a),G(Eh,c))}function Lh(a){Fh.current===a&&(E(Eh),E(Fh))}var M=Uf(0);\nfunction Mh(a){for(var b=a;null!==b;){if(13===b.tag){var c=b.memoizedState;if(null!==c&&(c=c.dehydrated,null===c||"$?"===c.data||"$!"===c.data))return b}else if(19===b.tag&&void 0!==b.memoizedProps.revealOrder){if(0!==(b.flags&128))return b}else if(null!==b.child){b.child.return=b;b=b.child;continue}if(b===a)break;for(;null===b.sibling;){if(null===b.return||b.return===a)return null;b=b.return}b.sibling.return=b.return;b=b.sibling}return null}var Nh=[];\nfunction Oh(){for(var a=0;a<Nh.length;a++)Nh[a]._workInProgressVersionPrimary=null;Nh.length=0}var Ph=ua.ReactCurrentDispatcher,Qh=ua.ReactCurrentBatchConfig,Rh=0,N=null,O=null,P=null,Sh=!1,Th=!1,Uh=0,Vh=0;function Q(){throw Error(p(321));}function Wh(a,b){if(null===b)return!1;for(var c=0;c<b.length&&c<a.length;c++)if(!He(a[c],b[c]))return!1;return!0}\nfunction Xh(a,b,c,d,e,f){Rh=f;N=b;b.memoizedState=null;b.updateQueue=null;b.lanes=0;Ph.current=null===a||null===a.memoizedState?Yh:Zh;a=c(d,e);if(Th){f=0;do{Th=!1;Uh=0;if(25<=f)throw Error(p(301));f+=1;P=O=null;b.updateQueue=null;Ph.current=$h;a=c(d,e)}while(Th)}Ph.current=ai;b=null!==O&&null!==O.next;Rh=0;P=O=N=null;Sh=!1;if(b)throw Error(p(300));return a}function bi(){var a=0!==Uh;Uh=0;return a}\nfunction ci(){var a={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};null===P?N.memoizedState=P=a:P=P.next=a;return P}function di(){if(null===O){var a=N.alternate;a=null!==a?a.memoizedState:null}else a=O.next;var b=null===P?N.memoizedState:P.next;if(null!==b)P=b,O=a;else{if(null===a)throw Error(p(310));O=a;a={memoizedState:O.memoizedState,baseState:O.baseState,baseQueue:O.baseQueue,queue:O.queue,next:null};null===P?N.memoizedState=P=a:P=P.next=a}return P}\nfunction ei(a,b){return"function"===typeof b?b(a):b}\nfunction fi(a){var b=di(),c=b.queue;if(null===c)throw Error(p(311));c.lastRenderedReducer=a;var d=O,e=d.baseQueue,f=c.pending;if(null!==f){if(null!==e){var g=e.next;e.next=f.next;f.next=g}d.baseQueue=e=f;c.pending=null}if(null!==e){f=e.next;d=d.baseState;var h=g=null,k=null,l=f;do{var m=l.lane;if((Rh&m)===m)null!==k&&(k=k.next={lane:0,action:l.action,hasEagerState:l.hasEagerState,eagerState:l.eagerState,next:null}),d=l.hasEagerState?l.eagerState:a(d,l.action);else{var q={lane:m,action:l.action,hasEagerState:l.hasEagerState,\neagerState:l.eagerState,next:null};null===k?(h=k=q,g=d):k=k.next=q;N.lanes|=m;hh|=m}l=l.next}while(null!==l&&l!==f);null===k?g=d:k.next=h;He(d,b.memoizedState)||(Ug=!0);b.memoizedState=d;b.baseState=g;b.baseQueue=k;c.lastRenderedState=d}a=c.interleaved;if(null!==a){e=a;do f=e.lane,N.lanes|=f,hh|=f,e=e.next;while(e!==a)}else null===e&&(c.lanes=0);return[b.memoizedState,c.dispatch]}\nfunction gi(a){var b=di(),c=b.queue;if(null===c)throw Error(p(311));c.lastRenderedReducer=a;var d=c.dispatch,e=c.pending,f=b.memoizedState;if(null!==e){c.pending=null;var g=e=e.next;do f=a(f,g.action),g=g.next;while(g!==e);He(f,b.memoizedState)||(Ug=!0);b.memoizedState=f;null===b.baseQueue&&(b.baseState=f);c.lastRenderedState=f}return[f,d]}function hi(){}\nfunction ii(a,b){var c=N,d=di(),e=b(),f=!He(d.memoizedState,e);f&&(d.memoizedState=e,Ug=!0);d=d.queue;ji(ki.bind(null,c,d,a),[a]);if(d.getSnapshot!==b||f||null!==P&&P.memoizedState.tag&1){c.flags|=2048;li(9,mi.bind(null,c,d,e,b),void 0,null);if(null===R)throw Error(p(349));0!==(Rh&30)||ni(c,b,e)}return e}function ni(a,b,c){a.flags|=16384;a={getSnapshot:b,value:c};b=N.updateQueue;null===b?(b={lastEffect:null,stores:null},N.updateQueue=b,b.stores=[a]):(c=b.stores,null===c?b.stores=[a]:c.push(a))}\nfunction mi(a,b,c,d){b.value=c;b.getSnapshot=d;oi(b)&&pi(a)}function ki(a,b,c){return c(function(){oi(b)&&pi(a)})}function oi(a){var b=a.getSnapshot;a=a.value;try{var c=b();return!He(a,c)}catch(d){return!0}}function pi(a){var b=Zg(a,1);null!==b&&mh(b,a,1,-1)}\nfunction qi(a){var b=ci();"function"===typeof a&&(a=a());b.memoizedState=b.baseState=a;a={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:ei,lastRenderedState:a};b.queue=a;a=a.dispatch=ri.bind(null,N,a);return[b.memoizedState,a]}\nfunction li(a,b,c,d){a={tag:a,create:b,destroy:c,deps:d,next:null};b=N.updateQueue;null===b?(b={lastEffect:null,stores:null},N.updateQueue=b,b.lastEffect=a.next=a):(c=b.lastEffect,null===c?b.lastEffect=a.next=a:(d=c.next,c.next=a,a.next=d,b.lastEffect=a));return a}function si(){return di().memoizedState}function ti(a,b,c,d){var e=ci();N.flags|=a;e.memoizedState=li(1|b,c,void 0,void 0===d?null:d)}\nfunction ui(a,b,c,d){var e=di();d=void 0===d?null:d;var f=void 0;if(null!==O){var g=O.memoizedState;f=g.destroy;if(null!==d&&Wh(d,g.deps)){e.memoizedState=li(b,c,f,d);return}}N.flags|=a;e.memoizedState=li(1|b,c,f,d)}function vi(a,b){return ti(8390656,8,a,b)}function ji(a,b){return ui(2048,8,a,b)}function wi(a,b){return ui(4,2,a,b)}function xi(a,b){return ui(4,4,a,b)}\nfunction yi(a,b){if("function"===typeof b)return a=a(),b(a),function(){b(null)};if(null!==b&&void 0!==b)return a=a(),b.current=a,function(){b.current=null}}function zi(a,b,c){c=null!==c&&void 0!==c?c.concat([a]):null;return ui(4,4,yi.bind(null,b,a),c)}function Ai(){}function Bi(a,b){var c=di();b=void 0===b?null:b;var d=c.memoizedState;if(null!==d&&null!==b&&Wh(b,d[1]))return d[0];c.memoizedState=[a,b];return a}\nfunction Ci(a,b){var c=di();b=void 0===b?null:b;var d=c.memoizedState;if(null!==d&&null!==b&&Wh(b,d[1]))return d[0];a=a();c.memoizedState=[a,b];return a}function Di(a,b,c){if(0===(Rh&21))return a.baseState&&(a.baseState=!1,Ug=!0),a.memoizedState=c;He(c,b)||(c=yc(),N.lanes|=c,hh|=c,a.baseState=!0);return b}function Ei(a,b){var c=C;C=0!==c&&4>c?c:4;a(!0);var d=Qh.transition;Qh.transition={};try{a(!1),b()}finally{C=c,Qh.transition=d}}function Fi(){return di().memoizedState}\nfunction Gi(a,b,c){var d=lh(a);c={lane:d,action:c,hasEagerState:!1,eagerState:null,next:null};if(Hi(a))Ii(b,c);else if(c=Yg(a,b,c,d),null!==c){var e=L();mh(c,a,d,e);Ji(c,b,d)}}\nfunction ri(a,b,c){var d=lh(a),e={lane:d,action:c,hasEagerState:!1,eagerState:null,next:null};if(Hi(a))Ii(b,e);else{var f=a.alternate;if(0===a.lanes&&(null===f||0===f.lanes)&&(f=b.lastRenderedReducer,null!==f))try{var g=b.lastRenderedState,h=f(g,c);e.hasEagerState=!0;e.eagerState=h;if(He(h,g)){var k=b.interleaved;null===k?(e.next=e,Xg(b)):(e.next=k.next,k.next=e);b.interleaved=e;return}}catch(l){}finally{}c=Yg(a,b,e,d);null!==c&&(e=L(),mh(c,a,d,e),Ji(c,b,d))}}\nfunction Hi(a){var b=a.alternate;return a===N||null!==b&&b===N}function Ii(a,b){Th=Sh=!0;var c=a.pending;null===c?b.next=b:(b.next=c.next,c.next=b);a.pending=b}function Ji(a,b,c){if(0!==(c&4194240)){var d=b.lanes;d&=a.pendingLanes;c|=d;b.lanes=c;Cc(a,c)}}\nvar ai={readContext:Vg,useCallback:Q,useContext:Q,useEffect:Q,useImperativeHandle:Q,useInsertionEffect:Q,useLayoutEffect:Q,useMemo:Q,useReducer:Q,useRef:Q,useState:Q,useDebugValue:Q,useDeferredValue:Q,useTransition:Q,useMutableSource:Q,useSyncExternalStore:Q,useId:Q,unstable_isNewReconciler:!1},Yh={readContext:Vg,useCallback:function(a,b){ci().memoizedState=[a,void 0===b?null:b];return a},useContext:Vg,useEffect:vi,useImperativeHandle:function(a,b,c){c=null!==c&&void 0!==c?c.concat([a]):null;return ti(4194308,\n4,yi.bind(null,b,a),c)},useLayoutEffect:function(a,b){return ti(4194308,4,a,b)},useInsertionEffect:function(a,b){return ti(4,2,a,b)},useMemo:function(a,b){var c=ci();b=void 0===b?null:b;a=a();c.memoizedState=[a,b];return a},useReducer:function(a,b,c){var d=ci();b=void 0!==c?c(b):b;d.memoizedState=d.baseState=b;a={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:a,lastRenderedState:b};d.queue=a;a=a.dispatch=Gi.bind(null,N,a);return[d.memoizedState,a]},useRef:function(a){var b=\nci();a={current:a};return b.memoizedState=a},useState:qi,useDebugValue:Ai,useDeferredValue:function(a){return ci().memoizedState=a},useTransition:function(){var a=qi(!1),b=a[0];a=Ei.bind(null,a[1]);ci().memoizedState=a;return[b,a]},useMutableSource:function(){},useSyncExternalStore:function(a,b,c){var d=N,e=ci();if(I){if(void 0===c)throw Error(p(407));c=c()}else{c=b();if(null===R)throw Error(p(349));0!==(Rh&30)||ni(d,b,c)}e.memoizedState=c;var f={value:c,getSnapshot:b};e.queue=f;vi(ki.bind(null,d,\nf,a),[a]);d.flags|=2048;li(9,mi.bind(null,d,f,c,b),void 0,null);return c},useId:function(){var a=ci(),b=R.identifierPrefix;if(I){var c=sg;var d=rg;c=(d&~(1<<32-oc(d)-1)).toString(32)+c;b=":"+b+"R"+c;c=Uh++;0<c&&(b+="H"+c.toString(32));b+=":"}else c=Vh++,b=":"+b+"r"+c.toString(32)+":";return a.memoizedState=b},unstable_isNewReconciler:!1},Zh={readContext:Vg,useCallback:Bi,useContext:Vg,useEffect:ji,useImperativeHandle:zi,useInsertionEffect:wi,useLayoutEffect:xi,useMemo:Ci,useReducer:fi,useRef:si,useState:function(){return fi(ei)},\nuseDebugValue:Ai,useDeferredValue:function(a){var b=di();return Di(b,O.memoizedState,a)},useTransition:function(){var a=fi(ei)[0],b=di().memoizedState;return[a,b]},useMutableSource:hi,useSyncExternalStore:ii,useId:Fi,unstable_isNewReconciler:!1},$h={readContext:Vg,useCallback:Bi,useContext:Vg,useEffect:ji,useImperativeHandle:zi,useInsertionEffect:wi,useLayoutEffect:xi,useMemo:Ci,useReducer:gi,useRef:si,useState:function(){return gi(ei)},useDebugValue:Ai,useDeferredValue:function(a){var b=di();return null===\nO?b.memoizedState=a:Di(b,O.memoizedState,a)},useTransition:function(){var a=gi(ei)[0],b=di().memoizedState;return[a,b]},useMutableSource:hi,useSyncExternalStore:ii,useId:Fi,unstable_isNewReconciler:!1};function Ki(a,b){try{var c="",d=b;do c+=Pa(d),d=d.return;while(d);var e=c}catch(f){e="\\nError generating stack: "+f.message+"\\n"+f.stack}return{value:a,source:b,stack:e,digest:null}}function Li(a,b,c){return{value:a,source:null,stack:null!=c?c:null,digest:null!=b?b:null}}\nfunction Mi(a,b){try{console.error(b.value)}catch(c){setTimeout(function(){throw c;})}}var Ni="function"===typeof WeakMap?WeakMap:Map;function Oi(a,b,c){c=ch(-1,c);c.tag=3;c.payload={element:null};var d=b.value;c.callback=function(){Pi||(Pi=!0,Qi=d);Mi(a,b)};return c}\nfunction Ri(a,b,c){c=ch(-1,c);c.tag=3;var d=a.type.getDerivedStateFromError;if("function"===typeof d){var e=b.value;c.payload=function(){return d(e)};c.callback=function(){Mi(a,b)}}var f=a.stateNode;null!==f&&"function"===typeof f.componentDidCatch&&(c.callback=function(){Mi(a,b);"function"!==typeof d&&(null===Si?Si=new Set([this]):Si.add(this));var c=b.stack;this.componentDidCatch(b.value,{componentStack:null!==c?c:""})});return c}\nfunction Ti(a,b,c){var d=a.pingCache;if(null===d){d=a.pingCache=new Ni;var e=new Set;d.set(b,e)}else e=d.get(b),void 0===e&&(e=new Set,d.set(b,e));e.has(c)||(e.add(c),a=Ui.bind(null,a,b,c),b.then(a,a))}function Vi(a){do{var b;if(b=13===a.tag)b=a.memoizedState,b=null!==b?null!==b.dehydrated?!0:!1:!0;if(b)return a;a=a.return}while(null!==a);return null}\nfunction Wi(a,b,c,d,e){if(0===(a.mode&1))return a===b?a.flags|=65536:(a.flags|=128,c.flags|=131072,c.flags&=-52805,1===c.tag&&(null===c.alternate?c.tag=17:(b=ch(-1,1),b.tag=2,dh(c,b,1))),c.lanes|=1),a;a.flags|=65536;a.lanes=e;return a}var Xi=ua.ReactCurrentOwner,Ug=!1;function Yi(a,b,c,d){b.child=null===a?Ch(b,null,c,d):Bh(b,a.child,c,d)}\nfunction Zi(a,b,c,d,e){c=c.render;var f=b.ref;Tg(b,e);d=Xh(a,b,c,d,f,e);c=bi();if(null!==a&&!Ug)return b.updateQueue=a.updateQueue,b.flags&=-2053,a.lanes&=~e,$i(a,b,e);I&&c&&vg(b);b.flags|=1;Yi(a,b,d,e);return b.child}\nfunction aj(a,b,c,d,e){if(null===a){var f=c.type;if("function"===typeof f&&!bj(f)&&void 0===f.defaultProps&&null===c.compare&&void 0===c.defaultProps)return b.tag=15,b.type=f,cj(a,b,f,d,e);a=yh(c.type,null,d,b,b.mode,e);a.ref=b.ref;a.return=b;return b.child=a}f=a.child;if(0===(a.lanes&e)){var g=f.memoizedProps;c=c.compare;c=null!==c?c:Ie;if(c(g,d)&&a.ref===b.ref)return $i(a,b,e)}b.flags|=1;a=wh(f,d);a.ref=b.ref;a.return=b;return b.child=a}\nfunction cj(a,b,c,d,e){if(null!==a){var f=a.memoizedProps;if(Ie(f,d)&&a.ref===b.ref)if(Ug=!1,b.pendingProps=d=f,0!==(a.lanes&e))0!==(a.flags&131072)&&(Ug=!0);else return b.lanes=a.lanes,$i(a,b,e)}return dj(a,b,c,d,e)}\nfunction ej(a,b,c){var d=b.pendingProps,e=d.children,f=null!==a?a.memoizedState:null;if("hidden"===d.mode)if(0===(b.mode&1))b.memoizedState={baseLanes:0,cachePool:null,transitions:null},G(fj,gj),gj|=c;else{if(0===(c&1073741824))return a=null!==f?f.baseLanes|c:c,b.lanes=b.childLanes=1073741824,b.memoizedState={baseLanes:a,cachePool:null,transitions:null},b.updateQueue=null,G(fj,gj),gj|=a,null;b.memoizedState={baseLanes:0,cachePool:null,transitions:null};d=null!==f?f.baseLanes:c;G(fj,gj);gj|=d}else null!==\nf?(d=f.baseLanes|c,b.memoizedState=null):d=c,G(fj,gj),gj|=d;Yi(a,b,e,c);return b.child}function hj(a,b){var c=b.ref;if(null===a&&null!==c||null!==a&&a.ref!==c)b.flags|=512,b.flags|=2097152}function dj(a,b,c,d,e){var f=Zf(c)?Xf:H.current;f=Yf(b,f);Tg(b,e);c=Xh(a,b,c,d,f,e);d=bi();if(null!==a&&!Ug)return b.updateQueue=a.updateQueue,b.flags&=-2053,a.lanes&=~e,$i(a,b,e);I&&d&&vg(b);b.flags|=1;Yi(a,b,c,e);return b.child}\nfunction ij(a,b,c,d,e){if(Zf(c)){var f=!0;cg(b)}else f=!1;Tg(b,e);if(null===b.stateNode)jj(a,b),ph(b,c,d),rh(b,c,d,e),d=!0;else if(null===a){var g=b.stateNode,h=b.memoizedProps;g.props=h;var k=g.context,l=c.contextType;"object"===typeof l&&null!==l?l=Vg(l):(l=Zf(c)?Xf:H.current,l=Yf(b,l));var m=c.getDerivedStateFromProps,q="function"===typeof m||"function"===typeof g.getSnapshotBeforeUpdate;q||"function"!==typeof g.UNSAFE_componentWillReceiveProps&&"function"!==typeof g.componentWillReceiveProps||\n(h!==d||k!==l)&&qh(b,g,d,l);$g=!1;var r=b.memoizedState;g.state=r;gh(b,d,g,e);k=b.memoizedState;h!==d||r!==k||Wf.current||$g?("function"===typeof m&&(kh(b,c,m,d),k=b.memoizedState),(h=$g||oh(b,c,h,d,r,k,l))?(q||"function"!==typeof g.UNSAFE_componentWillMount&&"function"!==typeof g.componentWillMount||("function"===typeof g.componentWillMount&&g.componentWillMount(),"function"===typeof g.UNSAFE_componentWillMount&&g.UNSAFE_componentWillMount()),"function"===typeof g.componentDidMount&&(b.flags|=4194308)):\n("function"===typeof g.componentDidMount&&(b.flags|=4194308),b.memoizedProps=d,b.memoizedState=k),g.props=d,g.state=k,g.context=l,d=h):("function"===typeof g.componentDidMount&&(b.flags|=4194308),d=!1)}else{g=b.stateNode;bh(a,b);h=b.memoizedProps;l=b.type===b.elementType?h:Lg(b.type,h);g.props=l;q=b.pendingProps;r=g.context;k=c.contextType;"object"===typeof k&&null!==k?k=Vg(k):(k=Zf(c)?Xf:H.current,k=Yf(b,k));var y=c.getDerivedStateFromProps;(m="function"===typeof y||"function"===typeof g.getSnapshotBeforeUpdate)||\n"function"!==typeof g.UNSAFE_componentWillReceiveProps&&"function"!==typeof g.componentWillReceiveProps||(h!==q||r!==k)&&qh(b,g,d,k);$g=!1;r=b.memoizedState;g.state=r;gh(b,d,g,e);var n=b.memoizedState;h!==q||r!==n||Wf.current||$g?("function"===typeof y&&(kh(b,c,y,d),n=b.memoizedState),(l=$g||oh(b,c,l,d,r,n,k)||!1)?(m||"function"!==typeof g.UNSAFE_componentWillUpdate&&"function"!==typeof g.componentWillUpdate||("function"===typeof g.componentWillUpdate&&g.componentWillUpdate(d,n,k),"function"===typeof g.UNSAFE_componentWillUpdate&&\ng.UNSAFE_componentWillUpdate(d,n,k)),"function"===typeof g.componentDidUpdate&&(b.flags|=4),"function"===typeof g.getSnapshotBeforeUpdate&&(b.flags|=1024)):("function"!==typeof g.componentDidUpdate||h===a.memoizedProps&&r===a.memoizedState||(b.flags|=4),"function"!==typeof g.getSnapshotBeforeUpdate||h===a.memoizedProps&&r===a.memoizedState||(b.flags|=1024),b.memoizedProps=d,b.memoizedState=n),g.props=d,g.state=n,g.context=k,d=l):("function"!==typeof g.componentDidUpdate||h===a.memoizedProps&&r===\na.memoizedState||(b.flags|=4),"function"!==typeof g.getSnapshotBeforeUpdate||h===a.memoizedProps&&r===a.memoizedState||(b.flags|=1024),d=!1)}return kj(a,b,c,d,f,e)}\nfunction kj(a,b,c,d,e,f){hj(a,b);var g=0!==(b.flags&128);if(!d&&!g)return e&&dg(b,c,!1),$i(a,b,f);d=b.stateNode;Xi.current=b;var h=g&&"function"!==typeof c.getDerivedStateFromError?null:d.render();b.flags|=1;null!==a&&g?(b.child=Bh(b,a.child,null,f),b.child=Bh(b,null,h,f)):Yi(a,b,h,f);b.memoizedState=d.state;e&&dg(b,c,!0);return b.child}function lj(a){var b=a.stateNode;b.pendingContext?ag(a,b.pendingContext,b.pendingContext!==b.context):b.context&&ag(a,b.context,!1);Ih(a,b.containerInfo)}\nfunction mj(a,b,c,d,e){Ig();Jg(e);b.flags|=256;Yi(a,b,c,d);return b.child}var nj={dehydrated:null,treeContext:null,retryLane:0};function oj(a){return{baseLanes:a,cachePool:null,transitions:null}}\nfunction pj(a,b,c){var d=b.pendingProps,e=M.current,f=!1,g=0!==(b.flags&128),h;(h=g)||(h=null!==a&&null===a.memoizedState?!1:0!==(e&2));if(h)f=!0,b.flags&=-129;else if(null===a||null!==a.memoizedState)e|=1;G(M,e&1);if(null===a){Eg(b);a=b.memoizedState;if(null!==a&&(a=a.dehydrated,null!==a))return 0===(b.mode&1)?b.lanes=1:"$!"===a.data?b.lanes=8:b.lanes=1073741824,null;g=d.children;a=d.fallback;return f?(d=b.mode,f=b.child,g={mode:"hidden",children:g},0===(d&1)&&null!==f?(f.childLanes=0,f.pendingProps=\ng):f=qj(g,d,0,null),a=Ah(a,d,c,null),f.return=b,a.return=b,f.sibling=a,b.child=f,b.child.memoizedState=oj(c),b.memoizedState=nj,a):rj(b,g)}e=a.memoizedState;if(null!==e&&(h=e.dehydrated,null!==h))return sj(a,b,g,d,h,e,c);if(f){f=d.fallback;g=b.mode;e=a.child;h=e.sibling;var k={mode:"hidden",children:d.children};0===(g&1)&&b.child!==e?(d=b.child,d.childLanes=0,d.pendingProps=k,b.deletions=null):(d=wh(e,k),d.subtreeFlags=e.subtreeFlags&14680064);null!==h?f=wh(h,f):(f=Ah(f,g,c,null),f.flags|=2);f.return=\nb;d.return=b;d.sibling=f;b.child=d;d=f;f=b.child;g=a.child.memoizedState;g=null===g?oj(c):{baseLanes:g.baseLanes|c,cachePool:null,transitions:g.transitions};f.memoizedState=g;f.childLanes=a.childLanes&~c;b.memoizedState=nj;return d}f=a.child;a=f.sibling;d=wh(f,{mode:"visible",children:d.children});0===(b.mode&1)&&(d.lanes=c);d.return=b;d.sibling=null;null!==a&&(c=b.deletions,null===c?(b.deletions=[a],b.flags|=16):c.push(a));b.child=d;b.memoizedState=null;return d}\nfunction rj(a,b){b=qj({mode:"visible",children:b},a.mode,0,null);b.return=a;return a.child=b}function tj(a,b,c,d){null!==d&&Jg(d);Bh(b,a.child,null,c);a=rj(b,b.pendingProps.children);a.flags|=2;b.memoizedState=null;return a}\nfunction sj(a,b,c,d,e,f,g){if(c){if(b.flags&256)return b.flags&=-257,d=Li(Error(p(422))),tj(a,b,g,d);if(null!==b.memoizedState)return b.child=a.child,b.flags|=128,null;f=d.fallback;e=b.mode;d=qj({mode:"visible",children:d.children},e,0,null);f=Ah(f,e,g,null);f.flags|=2;d.return=b;f.return=b;d.sibling=f;b.child=d;0!==(b.mode&1)&&Bh(b,a.child,null,g);b.child.memoizedState=oj(g);b.memoizedState=nj;return f}if(0===(b.mode&1))return tj(a,b,g,null);if("$!"===e.data){d=e.nextSibling&&e.nextSibling.dataset;\nif(d)var h=d.dgst;d=h;f=Error(p(419));d=Li(f,d,void 0);return tj(a,b,g,d)}h=0!==(g&a.childLanes);if(Ug||h){d=R;if(null!==d){switch(g&-g){case 4:e=2;break;case 16:e=8;break;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:e=32;break;case 536870912:e=268435456;break;default:e=0}e=0!==(e&(d.suspendedLanes|g))?0:e;\n0!==e&&e!==f.retryLane&&(f.retryLane=e,Zg(a,e),mh(d,a,e,-1))}uj();d=Li(Error(p(421)));return tj(a,b,g,d)}if("$?"===e.data)return b.flags|=128,b.child=a.child,b=vj.bind(null,a),e._reactRetry=b,null;a=f.treeContext;yg=Lf(e.nextSibling);xg=b;I=!0;zg=null;null!==a&&(og[pg++]=rg,og[pg++]=sg,og[pg++]=qg,rg=a.id,sg=a.overflow,qg=b);b=rj(b,d.children);b.flags|=4096;return b}function wj(a,b,c){a.lanes|=b;var d=a.alternate;null!==d&&(d.lanes|=b);Sg(a.return,b,c)}\nfunction xj(a,b,c,d,e){var f=a.memoizedState;null===f?a.memoizedState={isBackwards:b,rendering:null,renderingStartTime:0,last:d,tail:c,tailMode:e}:(f.isBackwards=b,f.rendering=null,f.renderingStartTime=0,f.last=d,f.tail=c,f.tailMode=e)}\nfunction yj(a,b,c){var d=b.pendingProps,e=d.revealOrder,f=d.tail;Yi(a,b,d.children,c);d=M.current;if(0!==(d&2))d=d&1|2,b.flags|=128;else{if(null!==a&&0!==(a.flags&128))a:for(a=b.child;null!==a;){if(13===a.tag)null!==a.memoizedState&&wj(a,c,b);else if(19===a.tag)wj(a,c,b);else if(null!==a.child){a.child.return=a;a=a.child;continue}if(a===b)break a;for(;null===a.sibling;){if(null===a.return||a.return===b)break a;a=a.return}a.sibling.return=a.return;a=a.sibling}d&=1}G(M,d);if(0===(b.mode&1))b.memoizedState=\nnull;else switch(e){case "forwards":c=b.child;for(e=null;null!==c;)a=c.alternate,null!==a&&null===Mh(a)&&(e=c),c=c.sibling;c=e;null===c?(e=b.child,b.child=null):(e=c.sibling,c.sibling=null);xj(b,!1,e,c,f);break;case "backwards":c=null;e=b.child;for(b.child=null;null!==e;){a=e.alternate;if(null!==a&&null===Mh(a)){b.child=e;break}a=e.sibling;e.sibling=c;c=e;e=a}xj(b,!0,c,null,f);break;case "together":xj(b,!1,null,null,void 0);break;default:b.memoizedState=null}return b.child}\nfunction jj(a,b){0===(b.mode&1)&&null!==a&&(a.alternate=null,b.alternate=null,b.flags|=2)}function $i(a,b,c){null!==a&&(b.dependencies=a.dependencies);hh|=b.lanes;if(0===(c&b.childLanes))return null;if(null!==a&&b.child!==a.child)throw Error(p(153));if(null!==b.child){a=b.child;c=wh(a,a.pendingProps);b.child=c;for(c.return=b;null!==a.sibling;)a=a.sibling,c=c.sibling=wh(a,a.pendingProps),c.return=b;c.sibling=null}return b.child}\nfunction zj(a,b,c){switch(b.tag){case 3:lj(b);Ig();break;case 5:Kh(b);break;case 1:Zf(b.type)&&cg(b);break;case 4:Ih(b,b.stateNode.containerInfo);break;case 10:var d=b.type._context,e=b.memoizedProps.value;G(Mg,d._currentValue);d._currentValue=e;break;case 13:d=b.memoizedState;if(null!==d){if(null!==d.dehydrated)return G(M,M.current&1),b.flags|=128,null;if(0!==(c&b.child.childLanes))return pj(a,b,c);G(M,M.current&1);a=$i(a,b,c);return null!==a?a.sibling:null}G(M,M.current&1);break;case 19:d=0!==(c&\nb.childLanes);if(0!==(a.flags&128)){if(d)return yj(a,b,c);b.flags|=128}e=b.memoizedState;null!==e&&(e.rendering=null,e.tail=null,e.lastEffect=null);G(M,M.current);if(d)break;else return null;case 22:case 23:return b.lanes=0,ej(a,b,c)}return $i(a,b,c)}var Aj,Bj,Cj,Dj;\nAj=function(a,b){for(var c=b.child;null!==c;){if(5===c.tag||6===c.tag)a.appendChild(c.stateNode);else if(4!==c.tag&&null!==c.child){c.child.return=c;c=c.child;continue}if(c===b)break;for(;null===c.sibling;){if(null===c.return||c.return===b)return;c=c.return}c.sibling.return=c.return;c=c.sibling}};Bj=function(){};\nCj=function(a,b,c,d){var e=a.memoizedProps;if(e!==d){a=b.stateNode;Hh(Eh.current);var f=null;switch(c){case "input":e=Ya(a,e);d=Ya(a,d);f=[];break;case "select":e=A({},e,{value:void 0});d=A({},d,{value:void 0});f=[];break;case "textarea":e=gb(a,e);d=gb(a,d);f=[];break;default:"function"!==typeof e.onClick&&"function"===typeof d.onClick&&(a.onclick=Bf)}ub(c,d);var g;c=null;for(l in e)if(!d.hasOwnProperty(l)&&e.hasOwnProperty(l)&&null!=e[l])if("style"===l){var h=e[l];for(g in h)h.hasOwnProperty(g)&&\n(c||(c={}),c[g]="")}else"dangerouslySetInnerHTML"!==l&&"children"!==l&&"suppressContentEditableWarning"!==l&&"suppressHydrationWarning"!==l&&"autoFocus"!==l&&(ea.hasOwnProperty(l)?f||(f=[]):(f=f||[]).push(l,null));for(l in d){var k=d[l];h=null!=e?e[l]:void 0;if(d.hasOwnProperty(l)&&k!==h&&(null!=k||null!=h))if("style"===l)if(h){for(g in h)!h.hasOwnProperty(g)||k&&k.hasOwnProperty(g)||(c||(c={}),c[g]="");for(g in k)k.hasOwnProperty(g)&&h[g]!==k[g]&&(c||(c={}),c[g]=k[g])}else c||(f||(f=[]),f.push(l,\nc)),c=k;else"dangerouslySetInnerHTML"===l?(k=k?k.__html:void 0,h=h?h.__html:void 0,null!=k&&h!==k&&(f=f||[]).push(l,k)):"children"===l?"string"!==typeof k&&"number"!==typeof k||(f=f||[]).push(l,""+k):"suppressContentEditableWarning"!==l&&"suppressHydrationWarning"!==l&&(ea.hasOwnProperty(l)?(null!=k&&"onScroll"===l&&D("scroll",a),f||h===k||(f=[])):(f=f||[]).push(l,k))}c&&(f=f||[]).push("style",c);var l=f;if(b.updateQueue=l)b.flags|=4}};Dj=function(a,b,c,d){c!==d&&(b.flags|=4)};\nfunction Ej(a,b){if(!I)switch(a.tailMode){case "hidden":b=a.tail;for(var c=null;null!==b;)null!==b.alternate&&(c=b),b=b.sibling;null===c?a.tail=null:c.sibling=null;break;case "collapsed":c=a.tail;for(var d=null;null!==c;)null!==c.alternate&&(d=c),c=c.sibling;null===d?b||null===a.tail?a.tail=null:a.tail.sibling=null:d.sibling=null}}\nfunction S(a){var b=null!==a.alternate&&a.alternate.child===a.child,c=0,d=0;if(b)for(var e=a.child;null!==e;)c|=e.lanes|e.childLanes,d|=e.subtreeFlags&14680064,d|=e.flags&14680064,e.return=a,e=e.sibling;else for(e=a.child;null!==e;)c|=e.lanes|e.childLanes,d|=e.subtreeFlags,d|=e.flags,e.return=a,e=e.sibling;a.subtreeFlags|=d;a.childLanes=c;return b}\nfunction Fj(a,b,c){var d=b.pendingProps;wg(b);switch(b.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return S(b),null;case 1:return Zf(b.type)&&$f(),S(b),null;case 3:d=b.stateNode;Jh();E(Wf);E(H);Oh();d.pendingContext&&(d.context=d.pendingContext,d.pendingContext=null);if(null===a||null===a.child)Gg(b)?b.flags|=4:null===a||a.memoizedState.isDehydrated&&0===(b.flags&256)||(b.flags|=1024,null!==zg&&(Gj(zg),zg=null));Bj(a,b);S(b);return null;case 5:Lh(b);var e=Hh(Gh.current);\nc=b.type;if(null!==a&&null!=b.stateNode)Cj(a,b,c,d,e),a.ref!==b.ref&&(b.flags|=512,b.flags|=2097152);else{if(!d){if(null===b.stateNode)throw Error(p(166));S(b);return null}a=Hh(Eh.current);if(Gg(b)){d=b.stateNode;c=b.type;var f=b.memoizedProps;d[Of]=b;d[Pf]=f;a=0!==(b.mode&1);switch(c){case "dialog":D("cancel",d);D("close",d);break;case "iframe":case "object":case "embed":D("load",d);break;case "video":case "audio":for(e=0;e<lf.length;e++)D(lf[e],d);break;case "source":D("error",d);break;case "img":case "image":case "link":D("error",\nd);D("load",d);break;case "details":D("toggle",d);break;case "input":Za(d,f);D("invalid",d);break;case "select":d._wrapperState={wasMultiple:!!f.multiple};D("invalid",d);break;case "textarea":hb(d,f),D("invalid",d)}ub(c,f);e=null;for(var g in f)if(f.hasOwnProperty(g)){var h=f[g];"children"===g?"string"===typeof h?d.textContent!==h&&(!0!==f.suppressHydrationWarning&&Af(d.textContent,h,a),e=["children",h]):"number"===typeof h&&d.textContent!==""+h&&(!0!==f.suppressHydrationWarning&&Af(d.textContent,\nh,a),e=["children",""+h]):ea.hasOwnProperty(g)&&null!=h&&"onScroll"===g&&D("scroll",d)}switch(c){case "input":Va(d);db(d,f,!0);break;case "textarea":Va(d);jb(d);break;case "select":case "option":break;default:"function"===typeof f.onClick&&(d.onclick=Bf)}d=e;b.updateQueue=d;null!==d&&(b.flags|=4)}else{g=9===e.nodeType?e:e.ownerDocument;"http://www.w3.org/1999/xhtml"===a&&(a=kb(c));"http://www.w3.org/1999/xhtml"===a?"script"===c?(a=g.createElement("div"),a.innerHTML="<script>\\x3c/script>",a=a.removeChild(a.firstChild)):\n"string"===typeof d.is?a=g.createElement(c,{is:d.is}):(a=g.createElement(c),"select"===c&&(g=a,d.multiple?g.multiple=!0:d.size&&(g.size=d.size))):a=g.createElementNS(a,c);a[Of]=b;a[Pf]=d;Aj(a,b,!1,!1);b.stateNode=a;a:{g=vb(c,d);switch(c){case "dialog":D("cancel",a);D("close",a);e=d;break;case "iframe":case "object":case "embed":D("load",a);e=d;break;case "video":case "audio":for(e=0;e<lf.length;e++)D(lf[e],a);e=d;break;case "source":D("error",a);e=d;break;case "img":case "image":case "link":D("error",\na);D("load",a);e=d;break;case "details":D("toggle",a);e=d;break;case "input":Za(a,d);e=Ya(a,d);D("invalid",a);break;case "option":e=d;break;case "select":a._wrapperState={wasMultiple:!!d.multiple};e=A({},d,{value:void 0});D("invalid",a);break;case "textarea":hb(a,d);e=gb(a,d);D("invalid",a);break;default:e=d}ub(c,e);h=e;for(f in h)if(h.hasOwnProperty(f)){var k=h[f];"style"===f?sb(a,k):"dangerouslySetInnerHTML"===f?(k=k?k.__html:void 0,null!=k&&nb(a,k)):"children"===f?"string"===typeof k?("textarea"!==\nc||""!==k)&&ob(a,k):"number"===typeof k&&ob(a,""+k):"suppressContentEditableWarning"!==f&&"suppressHydrationWarning"!==f&&"autoFocus"!==f&&(ea.hasOwnProperty(f)?null!=k&&"onScroll"===f&&D("scroll",a):null!=k&&ta(a,f,k,g))}switch(c){case "input":Va(a);db(a,d,!1);break;case "textarea":Va(a);jb(a);break;case "option":null!=d.value&&a.setAttribute("value",""+Sa(d.value));break;case "select":a.multiple=!!d.multiple;f=d.value;null!=f?fb(a,!!d.multiple,f,!1):null!=d.defaultValue&&fb(a,!!d.multiple,d.defaultValue,\n!0);break;default:"function"===typeof e.onClick&&(a.onclick=Bf)}switch(c){case "button":case "input":case "select":case "textarea":d=!!d.autoFocus;break a;case "img":d=!0;break a;default:d=!1}}d&&(b.flags|=4)}null!==b.ref&&(b.flags|=512,b.flags|=2097152)}S(b);return null;case 6:if(a&&null!=b.stateNode)Dj(a,b,a.memoizedProps,d);else{if("string"!==typeof d&&null===b.stateNode)throw Error(p(166));c=Hh(Gh.current);Hh(Eh.current);if(Gg(b)){d=b.stateNode;c=b.memoizedProps;d[Of]=b;if(f=d.nodeValue!==c)if(a=\nxg,null!==a)switch(a.tag){case 3:Af(d.nodeValue,c,0!==(a.mode&1));break;case 5:!0!==a.memoizedProps.suppressHydrationWarning&&Af(d.nodeValue,c,0!==(a.mode&1))}f&&(b.flags|=4)}else d=(9===c.nodeType?c:c.ownerDocument).createTextNode(d),d[Of]=b,b.stateNode=d}S(b);return null;case 13:E(M);d=b.memoizedState;if(null===a||null!==a.memoizedState&&null!==a.memoizedState.dehydrated){if(I&&null!==yg&&0!==(b.mode&1)&&0===(b.flags&128))Hg(),Ig(),b.flags|=98560,f=!1;else if(f=Gg(b),null!==d&&null!==d.dehydrated){if(null===\na){if(!f)throw Error(p(318));f=b.memoizedState;f=null!==f?f.dehydrated:null;if(!f)throw Error(p(317));f[Of]=b}else Ig(),0===(b.flags&128)&&(b.memoizedState=null),b.flags|=4;S(b);f=!1}else null!==zg&&(Gj(zg),zg=null),f=!0;if(!f)return b.flags&65536?b:null}if(0!==(b.flags&128))return b.lanes=c,b;d=null!==d;d!==(null!==a&&null!==a.memoizedState)&&d&&(b.child.flags|=8192,0!==(b.mode&1)&&(null===a||0!==(M.current&1)?0===T&&(T=3):uj()));null!==b.updateQueue&&(b.flags|=4);S(b);return null;case 4:return Jh(),\nBj(a,b),null===a&&sf(b.stateNode.containerInfo),S(b),null;case 10:return Rg(b.type._context),S(b),null;case 17:return Zf(b.type)&&$f(),S(b),null;case 19:E(M);f=b.memoizedState;if(null===f)return S(b),null;d=0!==(b.flags&128);g=f.rendering;if(null===g)if(d)Ej(f,!1);else{if(0!==T||null!==a&&0!==(a.flags&128))for(a=b.child;null!==a;){g=Mh(a);if(null!==g){b.flags|=128;Ej(f,!1);d=g.updateQueue;null!==d&&(b.updateQueue=d,b.flags|=4);b.subtreeFlags=0;d=c;for(c=b.child;null!==c;)f=c,a=d,f.flags&=14680066,\ng=f.alternate,null===g?(f.childLanes=0,f.lanes=a,f.child=null,f.subtreeFlags=0,f.memoizedProps=null,f.memoizedState=null,f.updateQueue=null,f.dependencies=null,f.stateNode=null):(f.childLanes=g.childLanes,f.lanes=g.lanes,f.child=g.child,f.subtreeFlags=0,f.deletions=null,f.memoizedProps=g.memoizedProps,f.memoizedState=g.memoizedState,f.updateQueue=g.updateQueue,f.type=g.type,a=g.dependencies,f.dependencies=null===a?null:{lanes:a.lanes,firstContext:a.firstContext}),c=c.sibling;G(M,M.current&1|2);return b.child}a=\na.sibling}null!==f.tail&&B()>Hj&&(b.flags|=128,d=!0,Ej(f,!1),b.lanes=4194304)}else{if(!d)if(a=Mh(g),null!==a){if(b.flags|=128,d=!0,c=a.updateQueue,null!==c&&(b.updateQueue=c,b.flags|=4),Ej(f,!0),null===f.tail&&"hidden"===f.tailMode&&!g.alternate&&!I)return S(b),null}else 2*B()-f.renderingStartTime>Hj&&1073741824!==c&&(b.flags|=128,d=!0,Ej(f,!1),b.lanes=4194304);f.isBackwards?(g.sibling=b.child,b.child=g):(c=f.last,null!==c?c.sibling=g:b.child=g,f.last=g)}if(null!==f.tail)return b=f.tail,f.rendering=\nb,f.tail=b.sibling,f.renderingStartTime=B(),b.sibling=null,c=M.current,G(M,d?c&1|2:c&1),b;S(b);return null;case 22:case 23:return Ij(),d=null!==b.memoizedState,null!==a&&null!==a.memoizedState!==d&&(b.flags|=8192),d&&0!==(b.mode&1)?0!==(gj&1073741824)&&(S(b),b.subtreeFlags&6&&(b.flags|=8192)):S(b),null;case 24:return null;case 25:return null}throw Error(p(156,b.tag));}\nfunction Jj(a,b){wg(b);switch(b.tag){case 1:return Zf(b.type)&&$f(),a=b.flags,a&65536?(b.flags=a&-65537|128,b):null;case 3:return Jh(),E(Wf),E(H),Oh(),a=b.flags,0!==(a&65536)&&0===(a&128)?(b.flags=a&-65537|128,b):null;case 5:return Lh(b),null;case 13:E(M);a=b.memoizedState;if(null!==a&&null!==a.dehydrated){if(null===b.alternate)throw Error(p(340));Ig()}a=b.flags;return a&65536?(b.flags=a&-65537|128,b):null;case 19:return E(M),null;case 4:return Jh(),null;case 10:return Rg(b.type._context),null;case 22:case 23:return Ij(),\nnull;case 24:return null;default:return null}}var Kj=!1,U=!1,Lj="function"===typeof WeakSet?WeakSet:Set,V=null;function Mj(a,b){var c=a.ref;if(null!==c)if("function"===typeof c)try{c(null)}catch(d){W(a,b,d)}else c.current=null}function Nj(a,b,c){try{c()}catch(d){W(a,b,d)}}var Oj=!1;\nfunction Pj(a,b){Cf=dd;a=Me();if(Ne(a)){if("selectionStart"in a)var c={start:a.selectionStart,end:a.selectionEnd};else a:{c=(c=a.ownerDocument)&&c.defaultView||window;var d=c.getSelection&&c.getSelection();if(d&&0!==d.rangeCount){c=d.anchorNode;var e=d.anchorOffset,f=d.focusNode;d=d.focusOffset;try{c.nodeType,f.nodeType}catch(F){c=null;break a}var g=0,h=-1,k=-1,l=0,m=0,q=a,r=null;b:for(;;){for(var y;;){q!==c||0!==e&&3!==q.nodeType||(h=g+e);q!==f||0!==d&&3!==q.nodeType||(k=g+d);3===q.nodeType&&(g+=\nq.nodeValue.length);if(null===(y=q.firstChild))break;r=q;q=y}for(;;){if(q===a)break b;r===c&&++l===e&&(h=g);r===f&&++m===d&&(k=g);if(null!==(y=q.nextSibling))break;q=r;r=q.parentNode}q=y}c=-1===h||-1===k?null:{start:h,end:k}}else c=null}c=c||{start:0,end:0}}else c=null;Df={focusedElem:a,selectionRange:c};dd=!1;for(V=b;null!==V;)if(b=V,a=b.child,0!==(b.subtreeFlags&1028)&&null!==a)a.return=b,V=a;else for(;null!==V;){b=V;try{var n=b.alternate;if(0!==(b.flags&1024))switch(b.tag){case 0:case 11:case 15:break;\ncase 1:if(null!==n){var t=n.memoizedProps,J=n.memoizedState,x=b.stateNode,w=x.getSnapshotBeforeUpdate(b.elementType===b.type?t:Lg(b.type,t),J);x.__reactInternalSnapshotBeforeUpdate=w}break;case 3:var u=b.stateNode.containerInfo;1===u.nodeType?u.textContent="":9===u.nodeType&&u.documentElement&&u.removeChild(u.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(p(163));}}catch(F){W(b,b.return,F)}a=b.sibling;if(null!==a){a.return=b.return;V=a;break}V=b.return}n=Oj;Oj=!1;return n}\nfunction Qj(a,b,c){var d=b.updateQueue;d=null!==d?d.lastEffect:null;if(null!==d){var e=d=d.next;do{if((e.tag&a)===a){var f=e.destroy;e.destroy=void 0;void 0!==f&&Nj(b,c,f)}e=e.next}while(e!==d)}}function Rj(a,b){b=b.updateQueue;b=null!==b?b.lastEffect:null;if(null!==b){var c=b=b.next;do{if((c.tag&a)===a){var d=c.create;c.destroy=d()}c=c.next}while(c!==b)}}function Sj(a){var b=a.ref;if(null!==b){var c=a.stateNode;switch(a.tag){case 5:a=c;break;default:a=c}"function"===typeof b?b(a):b.current=a}}\nfunction Tj(a){var b=a.alternate;null!==b&&(a.alternate=null,Tj(b));a.child=null;a.deletions=null;a.sibling=null;5===a.tag&&(b=a.stateNode,null!==b&&(delete b[Of],delete b[Pf],delete b[of],delete b[Qf],delete b[Rf]));a.stateNode=null;a.return=null;a.dependencies=null;a.memoizedProps=null;a.memoizedState=null;a.pendingProps=null;a.stateNode=null;a.updateQueue=null}function Uj(a){return 5===a.tag||3===a.tag||4===a.tag}\nfunction Vj(a){a:for(;;){for(;null===a.sibling;){if(null===a.return||Uj(a.return))return null;a=a.return}a.sibling.return=a.return;for(a=a.sibling;5!==a.tag&&6!==a.tag&&18!==a.tag;){if(a.flags&2)continue a;if(null===a.child||4===a.tag)continue a;else a.child.return=a,a=a.child}if(!(a.flags&2))return a.stateNode}}\nfunction Wj(a,b,c){var d=a.tag;if(5===d||6===d)a=a.stateNode,b?8===c.nodeType?c.parentNode.insertBefore(a,b):c.insertBefore(a,b):(8===c.nodeType?(b=c.parentNode,b.insertBefore(a,c)):(b=c,b.appendChild(a)),c=c._reactRootContainer,null!==c&&void 0!==c||null!==b.onclick||(b.onclick=Bf));else if(4!==d&&(a=a.child,null!==a))for(Wj(a,b,c),a=a.sibling;null!==a;)Wj(a,b,c),a=a.sibling}\nfunction Xj(a,b,c){var d=a.tag;if(5===d||6===d)a=a.stateNode,b?c.insertBefore(a,b):c.appendChild(a);else if(4!==d&&(a=a.child,null!==a))for(Xj(a,b,c),a=a.sibling;null!==a;)Xj(a,b,c),a=a.sibling}var X=null,Yj=!1;function Zj(a,b,c){for(c=c.child;null!==c;)ak(a,b,c),c=c.sibling}\nfunction ak(a,b,c){if(lc&&"function"===typeof lc.onCommitFiberUnmount)try{lc.onCommitFiberUnmount(kc,c)}catch(h){}switch(c.tag){case 5:U||Mj(c,b);case 6:var d=X,e=Yj;X=null;Zj(a,b,c);X=d;Yj=e;null!==X&&(Yj?(a=X,c=c.stateNode,8===a.nodeType?a.parentNode.removeChild(c):a.removeChild(c)):X.removeChild(c.stateNode));break;case 18:null!==X&&(Yj?(a=X,c=c.stateNode,8===a.nodeType?Kf(a.parentNode,c):1===a.nodeType&&Kf(a,c),bd(a)):Kf(X,c.stateNode));break;case 4:d=X;e=Yj;X=c.stateNode.containerInfo;Yj=!0;\nZj(a,b,c);X=d;Yj=e;break;case 0:case 11:case 14:case 15:if(!U&&(d=c.updateQueue,null!==d&&(d=d.lastEffect,null!==d))){e=d=d.next;do{var f=e,g=f.destroy;f=f.tag;void 0!==g&&(0!==(f&2)?Nj(c,b,g):0!==(f&4)&&Nj(c,b,g));e=e.next}while(e!==d)}Zj(a,b,c);break;case 1:if(!U&&(Mj(c,b),d=c.stateNode,"function"===typeof d.componentWillUnmount))try{d.props=c.memoizedProps,d.state=c.memoizedState,d.componentWillUnmount()}catch(h){W(c,b,h)}Zj(a,b,c);break;case 21:Zj(a,b,c);break;case 22:c.mode&1?(U=(d=U)||null!==\nc.memoizedState,Zj(a,b,c),U=d):Zj(a,b,c);break;default:Zj(a,b,c)}}function bk(a){var b=a.updateQueue;if(null!==b){a.updateQueue=null;var c=a.stateNode;null===c&&(c=a.stateNode=new Lj);b.forEach(function(b){var d=ck.bind(null,a,b);c.has(b)||(c.add(b),b.then(d,d))})}}\nfunction dk(a,b){var c=b.deletions;if(null!==c)for(var d=0;d<c.length;d++){var e=c[d];try{var f=a,g=b,h=g;a:for(;null!==h;){switch(h.tag){case 5:X=h.stateNode;Yj=!1;break a;case 3:X=h.stateNode.containerInfo;Yj=!0;break a;case 4:X=h.stateNode.containerInfo;Yj=!0;break a}h=h.return}if(null===X)throw Error(p(160));ak(f,g,e);X=null;Yj=!1;var k=e.alternate;null!==k&&(k.return=null);e.return=null}catch(l){W(e,b,l)}}if(b.subtreeFlags&12854)for(b=b.child;null!==b;)ek(b,a),b=b.sibling}\nfunction ek(a,b){var c=a.alternate,d=a.flags;switch(a.tag){case 0:case 11:case 14:case 15:dk(b,a);fk(a);if(d&4){try{Qj(3,a,a.return),Rj(3,a)}catch(t){W(a,a.return,t)}try{Qj(5,a,a.return)}catch(t){W(a,a.return,t)}}break;case 1:dk(b,a);fk(a);d&512&&null!==c&&Mj(c,c.return);break;case 5:dk(b,a);fk(a);d&512&&null!==c&&Mj(c,c.return);if(a.flags&32){var e=a.stateNode;try{ob(e,"")}catch(t){W(a,a.return,t)}}if(d&4&&(e=a.stateNode,null!=e)){var f=a.memoizedProps,g=null!==c?c.memoizedProps:f,h=a.type,k=a.updateQueue;\na.updateQueue=null;if(null!==k)try{"input"===h&&"radio"===f.type&&null!=f.name&&ab(e,f);vb(h,g);var l=vb(h,f);for(g=0;g<k.length;g+=2){var m=k[g],q=k[g+1];"style"===m?sb(e,q):"dangerouslySetInnerHTML"===m?nb(e,q):"children"===m?ob(e,q):ta(e,m,q,l)}switch(h){case "input":bb(e,f);break;case "textarea":ib(e,f);break;case "select":var r=e._wrapperState.wasMultiple;e._wrapperState.wasMultiple=!!f.multiple;var y=f.value;null!=y?fb(e,!!f.multiple,y,!1):r!==!!f.multiple&&(null!=f.defaultValue?fb(e,!!f.multiple,\nf.defaultValue,!0):fb(e,!!f.multiple,f.multiple?[]:"",!1))}e[Pf]=f}catch(t){W(a,a.return,t)}}break;case 6:dk(b,a);fk(a);if(d&4){if(null===a.stateNode)throw Error(p(162));e=a.stateNode;f=a.memoizedProps;try{e.nodeValue=f}catch(t){W(a,a.return,t)}}break;case 3:dk(b,a);fk(a);if(d&4&&null!==c&&c.memoizedState.isDehydrated)try{bd(b.containerInfo)}catch(t){W(a,a.return,t)}break;case 4:dk(b,a);fk(a);break;case 13:dk(b,a);fk(a);e=a.child;e.flags&8192&&(f=null!==e.memoizedState,e.stateNode.isHidden=f,!f||\nnull!==e.alternate&&null!==e.alternate.memoizedState||(gk=B()));d&4&&bk(a);break;case 22:m=null!==c&&null!==c.memoizedState;a.mode&1?(U=(l=U)||m,dk(b,a),U=l):dk(b,a);fk(a);if(d&8192){l=null!==a.memoizedState;if((a.stateNode.isHidden=l)&&!m&&0!==(a.mode&1))for(V=a,m=a.child;null!==m;){for(q=V=m;null!==V;){r=V;y=r.child;switch(r.tag){case 0:case 11:case 14:case 15:Qj(4,r,r.return);break;case 1:Mj(r,r.return);var n=r.stateNode;if("function"===typeof n.componentWillUnmount){d=r;c=r.return;try{b=d,n.props=\nb.memoizedProps,n.state=b.memoizedState,n.componentWillUnmount()}catch(t){W(d,c,t)}}break;case 5:Mj(r,r.return);break;case 22:if(null!==r.memoizedState){hk(q);continue}}null!==y?(y.return=r,V=y):hk(q)}m=m.sibling}a:for(m=null,q=a;;){if(5===q.tag){if(null===m){m=q;try{e=q.stateNode,l?(f=e.style,"function"===typeof f.setProperty?f.setProperty("display","none","important"):f.display="none"):(h=q.stateNode,k=q.memoizedProps.style,g=void 0!==k&&null!==k&&k.hasOwnProperty("display")?k.display:null,h.style.display=\nrb("display",g))}catch(t){W(a,a.return,t)}}}else if(6===q.tag){if(null===m)try{q.stateNode.nodeValue=l?"":q.memoizedProps}catch(t){W(a,a.return,t)}}else if((22!==q.tag&&23!==q.tag||null===q.memoizedState||q===a)&&null!==q.child){q.child.return=q;q=q.child;continue}if(q===a)break a;for(;null===q.sibling;){if(null===q.return||q.return===a)break a;m===q&&(m=null);q=q.return}m===q&&(m=null);q.sibling.return=q.return;q=q.sibling}}break;case 19:dk(b,a);fk(a);d&4&&bk(a);break;case 21:break;default:dk(b,\na),fk(a)}}function fk(a){var b=a.flags;if(b&2){try{a:{for(var c=a.return;null!==c;){if(Uj(c)){var d=c;break a}c=c.return}throw Error(p(160));}switch(d.tag){case 5:var e=d.stateNode;d.flags&32&&(ob(e,""),d.flags&=-33);var f=Vj(a);Xj(a,f,e);break;case 3:case 4:var g=d.stateNode.containerInfo,h=Vj(a);Wj(a,h,g);break;default:throw Error(p(161));}}catch(k){W(a,a.return,k)}a.flags&=-3}b&4096&&(a.flags&=-4097)}function ik(a,b,c){V=a;jk(a,b,c)}\nfunction jk(a,b,c){for(var d=0!==(a.mode&1);null!==V;){var e=V,f=e.child;if(22===e.tag&&d){var g=null!==e.memoizedState||Kj;if(!g){var h=e.alternate,k=null!==h&&null!==h.memoizedState||U;h=Kj;var l=U;Kj=g;if((U=k)&&!l)for(V=e;null!==V;)g=V,k=g.child,22===g.tag&&null!==g.memoizedState?kk(e):null!==k?(k.return=g,V=k):kk(e);for(;null!==f;)V=f,jk(f,b,c),f=f.sibling;V=e;Kj=h;U=l}lk(a,b,c)}else 0!==(e.subtreeFlags&8772)&&null!==f?(f.return=e,V=f):lk(a,b,c)}}\nfunction lk(a){for(;null!==V;){var b=V;if(0!==(b.flags&8772)){var c=b.alternate;try{if(0!==(b.flags&8772))switch(b.tag){case 0:case 11:case 15:U||Rj(5,b);break;case 1:var d=b.stateNode;if(b.flags&4&&!U)if(null===c)d.componentDidMount();else{var e=b.elementType===b.type?c.memoizedProps:Lg(b.type,c.memoizedProps);d.componentDidUpdate(e,c.memoizedState,d.__reactInternalSnapshotBeforeUpdate)}var f=b.updateQueue;null!==f&&ih(b,f,d);break;case 3:var g=b.updateQueue;if(null!==g){c=null;if(null!==b.child)switch(b.child.tag){case 5:c=\nb.child.stateNode;break;case 1:c=b.child.stateNode}ih(b,g,c)}break;case 5:var h=b.stateNode;if(null===c&&b.flags&4){c=h;var k=b.memoizedProps;switch(b.type){case "button":case "input":case "select":case "textarea":k.autoFocus&&c.focus();break;case "img":k.src&&(c.src=k.src)}}break;case 6:break;case 4:break;case 12:break;case 13:if(null===b.memoizedState){var l=b.alternate;if(null!==l){var m=l.memoizedState;if(null!==m){var q=m.dehydrated;null!==q&&bd(q)}}}break;case 19:case 17:case 21:case 22:case 23:case 25:break;\ndefault:throw Error(p(163));}U||b.flags&512&&Sj(b)}catch(r){W(b,b.return,r)}}if(b===a){V=null;break}c=b.sibling;if(null!==c){c.return=b.return;V=c;break}V=b.return}}function hk(a){for(;null!==V;){var b=V;if(b===a){V=null;break}var c=b.sibling;if(null!==c){c.return=b.return;V=c;break}V=b.return}}\nfunction kk(a){for(;null!==V;){var b=V;try{switch(b.tag){case 0:case 11:case 15:var c=b.return;try{Rj(4,b)}catch(k){W(b,c,k)}break;case 1:var d=b.stateNode;if("function"===typeof d.componentDidMount){var e=b.return;try{d.componentDidMount()}catch(k){W(b,e,k)}}var f=b.return;try{Sj(b)}catch(k){W(b,f,k)}break;case 5:var g=b.return;try{Sj(b)}catch(k){W(b,g,k)}}}catch(k){W(b,b.return,k)}if(b===a){V=null;break}var h=b.sibling;if(null!==h){h.return=b.return;V=h;break}V=b.return}}\nvar mk=Math.ceil,nk=ua.ReactCurrentDispatcher,ok=ua.ReactCurrentOwner,pk=ua.ReactCurrentBatchConfig,K=0,R=null,Y=null,Z=0,gj=0,fj=Uf(0),T=0,qk=null,hh=0,rk=0,sk=0,tk=null,uk=null,gk=0,Hj=Infinity,vk=null,Pi=!1,Qi=null,Si=null,wk=!1,xk=null,yk=0,zk=0,Ak=null,Bk=-1,Ck=0;function L(){return 0!==(K&6)?B():-1!==Bk?Bk:Bk=B()}\nfunction lh(a){if(0===(a.mode&1))return 1;if(0!==(K&2)&&0!==Z)return Z&-Z;if(null!==Kg.transition)return 0===Ck&&(Ck=yc()),Ck;a=C;if(0!==a)return a;a=window.event;a=void 0===a?16:jd(a.type);return a}function mh(a,b,c,d){if(50<zk)throw zk=0,Ak=null,Error(p(185));Ac(a,c,d);if(0===(K&2)||a!==R)a===R&&(0===(K&2)&&(rk|=c),4===T&&Dk(a,Z)),Ek(a,d),1===c&&0===K&&0===(b.mode&1)&&(Hj=B()+500,fg&&jg())}\nfunction Ek(a,b){var c=a.callbackNode;wc(a,b);var d=uc(a,a===R?Z:0);if(0===d)null!==c&&bc(c),a.callbackNode=null,a.callbackPriority=0;else if(b=d&-d,a.callbackPriority!==b){null!=c&&bc(c);if(1===b)0===a.tag?ig(Fk.bind(null,a)):hg(Fk.bind(null,a)),Jf(function(){0===(K&6)&&jg()}),c=null;else{switch(Dc(d)){case 1:c=fc;break;case 4:c=gc;break;case 16:c=hc;break;case 536870912:c=jc;break;default:c=hc}c=Gk(c,Hk.bind(null,a))}a.callbackPriority=b;a.callbackNode=c}}\nfunction Hk(a,b){Bk=-1;Ck=0;if(0!==(K&6))throw Error(p(327));var c=a.callbackNode;if(Ik()&&a.callbackNode!==c)return null;var d=uc(a,a===R?Z:0);if(0===d)return null;if(0!==(d&30)||0!==(d&a.expiredLanes)||b)b=Jk(a,d);else{b=d;var e=K;K|=2;var f=Kk();if(R!==a||Z!==b)vk=null,Hj=B()+500,Lk(a,b);do try{Mk();break}catch(h){Nk(a,h)}while(1);Qg();nk.current=f;K=e;null!==Y?b=0:(R=null,Z=0,b=T)}if(0!==b){2===b&&(e=xc(a),0!==e&&(d=e,b=Ok(a,e)));if(1===b)throw c=qk,Lk(a,0),Dk(a,d),Ek(a,B()),c;if(6===b)Dk(a,d);\nelse{e=a.current.alternate;if(0===(d&30)&&!Pk(e)&&(b=Jk(a,d),2===b&&(f=xc(a),0!==f&&(d=f,b=Ok(a,f))),1===b))throw c=qk,Lk(a,0),Dk(a,d),Ek(a,B()),c;a.finishedWork=e;a.finishedLanes=d;switch(b){case 0:case 1:throw Error(p(345));case 2:Qk(a,uk,vk);break;case 3:Dk(a,d);if((d&130023424)===d&&(b=gk+500-B(),10<b)){if(0!==uc(a,0))break;e=a.suspendedLanes;if((e&d)!==d){L();a.pingedLanes|=a.suspendedLanes&e;break}a.timeoutHandle=Ff(Qk.bind(null,a,uk,vk),b);break}Qk(a,uk,vk);break;case 4:Dk(a,d);if((d&4194240)===\nd)break;b=a.eventTimes;for(e=-1;0<d;){var g=31-oc(d);f=1<<g;g=b[g];g>e&&(e=g);d&=~f}d=e;d=B()-d;d=(120>d?120:480>d?480:1080>d?1080:1920>d?1920:3E3>d?3E3:4320>d?4320:1960*mk(d/1960))-d;if(10<d){a.timeoutHandle=Ff(Qk.bind(null,a,uk,vk),d);break}Qk(a,uk,vk);break;case 5:Qk(a,uk,vk);break;default:throw Error(p(329));}}}Ek(a,B());return a.callbackNode===c?Hk.bind(null,a):null}\nfunction Ok(a,b){var c=tk;a.current.memoizedState.isDehydrated&&(Lk(a,b).flags|=256);a=Jk(a,b);2!==a&&(b=uk,uk=c,null!==b&&Gj(b));return a}function Gj(a){null===uk?uk=a:uk.push.apply(uk,a)}\nfunction Pk(a){for(var b=a;;){if(b.flags&16384){var c=b.updateQueue;if(null!==c&&(c=c.stores,null!==c))for(var d=0;d<c.length;d++){var e=c[d],f=e.getSnapshot;e=e.value;try{if(!He(f(),e))return!1}catch(g){return!1}}}c=b.child;if(b.subtreeFlags&16384&&null!==c)c.return=b,b=c;else{if(b===a)break;for(;null===b.sibling;){if(null===b.return||b.return===a)return!0;b=b.return}b.sibling.return=b.return;b=b.sibling}}return!0}\nfunction Dk(a,b){b&=~sk;b&=~rk;a.suspendedLanes|=b;a.pingedLanes&=~b;for(a=a.expirationTimes;0<b;){var c=31-oc(b),d=1<<c;a[c]=-1;b&=~d}}function Fk(a){if(0!==(K&6))throw Error(p(327));Ik();var b=uc(a,0);if(0===(b&1))return Ek(a,B()),null;var c=Jk(a,b);if(0!==a.tag&&2===c){var d=xc(a);0!==d&&(b=d,c=Ok(a,d))}if(1===c)throw c=qk,Lk(a,0),Dk(a,b),Ek(a,B()),c;if(6===c)throw Error(p(345));a.finishedWork=a.current.alternate;a.finishedLanes=b;Qk(a,uk,vk);Ek(a,B());return null}\nfunction Rk(a,b){var c=K;K|=1;try{return a(b)}finally{K=c,0===K&&(Hj=B()+500,fg&&jg())}}function Sk(a){null!==xk&&0===xk.tag&&0===(K&6)&&Ik();var b=K;K|=1;var c=pk.transition,d=C;try{if(pk.transition=null,C=1,a)return a()}finally{C=d,pk.transition=c,K=b,0===(K&6)&&jg()}}function Ij(){gj=fj.current;E(fj)}\nfunction Lk(a,b){a.finishedWork=null;a.finishedLanes=0;var c=a.timeoutHandle;-1!==c&&(a.timeoutHandle=-1,Gf(c));if(null!==Y)for(c=Y.return;null!==c;){var d=c;wg(d);switch(d.tag){case 1:d=d.type.childContextTypes;null!==d&&void 0!==d&&$f();break;case 3:Jh();E(Wf);E(H);Oh();break;case 5:Lh(d);break;case 4:Jh();break;case 13:E(M);break;case 19:E(M);break;case 10:Rg(d.type._context);break;case 22:case 23:Ij()}c=c.return}R=a;Y=a=wh(a.current,null);Z=gj=b;T=0;qk=null;sk=rk=hh=0;uk=tk=null;if(null!==Wg){for(b=\n0;b<Wg.length;b++)if(c=Wg[b],d=c.interleaved,null!==d){c.interleaved=null;var e=d.next,f=c.pending;if(null!==f){var g=f.next;f.next=e;d.next=g}c.pending=d}Wg=null}return a}\nfunction Nk(a,b){do{var c=Y;try{Qg();Ph.current=ai;if(Sh){for(var d=N.memoizedState;null!==d;){var e=d.queue;null!==e&&(e.pending=null);d=d.next}Sh=!1}Rh=0;P=O=N=null;Th=!1;Uh=0;ok.current=null;if(null===c||null===c.return){T=1;qk=b;Y=null;break}a:{var f=a,g=c.return,h=c,k=b;b=Z;h.flags|=32768;if(null!==k&&"object"===typeof k&&"function"===typeof k.then){var l=k,m=h,q=m.tag;if(0===(m.mode&1)&&(0===q||11===q||15===q)){var r=m.alternate;r?(m.updateQueue=r.updateQueue,m.memoizedState=r.memoizedState,\nm.lanes=r.lanes):(m.updateQueue=null,m.memoizedState=null)}var y=Vi(g);if(null!==y){y.flags&=-257;Wi(y,g,h,f,b);y.mode&1&&Ti(f,l,b);b=y;k=l;var n=b.updateQueue;if(null===n){var t=new Set;t.add(k);b.updateQueue=t}else n.add(k);break a}else{if(0===(b&1)){Ti(f,l,b);uj();break a}k=Error(p(426))}}else if(I&&h.mode&1){var J=Vi(g);if(null!==J){0===(J.flags&65536)&&(J.flags|=256);Wi(J,g,h,f,b);Jg(Ki(k,h));break a}}f=k=Ki(k,h);4!==T&&(T=2);null===tk?tk=[f]:tk.push(f);f=g;do{switch(f.tag){case 3:f.flags|=65536;\nb&=-b;f.lanes|=b;var x=Oi(f,k,b);fh(f,x);break a;case 1:h=k;var w=f.type,u=f.stateNode;if(0===(f.flags&128)&&("function"===typeof w.getDerivedStateFromError||null!==u&&"function"===typeof u.componentDidCatch&&(null===Si||!Si.has(u)))){f.flags|=65536;b&=-b;f.lanes|=b;var F=Ri(f,h,b);fh(f,F);break a}}f=f.return}while(null!==f)}Tk(c)}catch(na){b=na;Y===c&&null!==c&&(Y=c=c.return);continue}break}while(1)}function Kk(){var a=nk.current;nk.current=ai;return null===a?ai:a}\nfunction uj(){if(0===T||3===T||2===T)T=4;null===R||0===(hh&268435455)&&0===(rk&268435455)||Dk(R,Z)}function Jk(a,b){var c=K;K|=2;var d=Kk();if(R!==a||Z!==b)vk=null,Lk(a,b);do try{Uk();break}catch(e){Nk(a,e)}while(1);Qg();K=c;nk.current=d;if(null!==Y)throw Error(p(261));R=null;Z=0;return T}function Uk(){for(;null!==Y;)Vk(Y)}function Mk(){for(;null!==Y&&!cc();)Vk(Y)}function Vk(a){var b=Wk(a.alternate,a,gj);a.memoizedProps=a.pendingProps;null===b?Tk(a):Y=b;ok.current=null}\nfunction Tk(a){var b=a;do{var c=b.alternate;a=b.return;if(0===(b.flags&32768)){if(c=Fj(c,b,gj),null!==c){Y=c;return}}else{c=Jj(c,b);if(null!==c){c.flags&=32767;Y=c;return}if(null!==a)a.flags|=32768,a.subtreeFlags=0,a.deletions=null;else{T=6;Y=null;return}}b=b.sibling;if(null!==b){Y=b;return}Y=b=a}while(null!==b);0===T&&(T=5)}function Qk(a,b,c){var d=C,e=pk.transition;try{pk.transition=null,C=1,Xk(a,b,c,d)}finally{pk.transition=e,C=d}return null}\nfunction Xk(a,b,c,d){do Ik();while(null!==xk);if(0!==(K&6))throw Error(p(327));c=a.finishedWork;var e=a.finishedLanes;if(null===c)return null;a.finishedWork=null;a.finishedLanes=0;if(c===a.current)throw Error(p(177));a.callbackNode=null;a.callbackPriority=0;var f=c.lanes|c.childLanes;Bc(a,f);a===R&&(Y=R=null,Z=0);0===(c.subtreeFlags&2064)&&0===(c.flags&2064)||wk||(wk=!0,Gk(hc,function(){Ik();return null}));f=0!==(c.flags&15990);if(0!==(c.subtreeFlags&15990)||f){f=pk.transition;pk.transition=null;\nvar g=C;C=1;var h=K;K|=4;ok.current=null;Pj(a,c);ek(c,a);Oe(Df);dd=!!Cf;Df=Cf=null;a.current=c;ik(c,a,e);dc();K=h;C=g;pk.transition=f}else a.current=c;wk&&(wk=!1,xk=a,yk=e);f=a.pendingLanes;0===f&&(Si=null);mc(c.stateNode,d);Ek(a,B());if(null!==b)for(d=a.onRecoverableError,c=0;c<b.length;c++)e=b[c],d(e.value,{componentStack:e.stack,digest:e.digest});if(Pi)throw Pi=!1,a=Qi,Qi=null,a;0!==(yk&1)&&0!==a.tag&&Ik();f=a.pendingLanes;0!==(f&1)?a===Ak?zk++:(zk=0,Ak=a):zk=0;jg();return null}\nfunction Ik(){if(null!==xk){var a=Dc(yk),b=pk.transition,c=C;try{pk.transition=null;C=16>a?16:a;if(null===xk)var d=!1;else{a=xk;xk=null;yk=0;if(0!==(K&6))throw Error(p(331));var e=K;K|=4;for(V=a.current;null!==V;){var f=V,g=f.child;if(0!==(V.flags&16)){var h=f.deletions;if(null!==h){for(var k=0;k<h.length;k++){var l=h[k];for(V=l;null!==V;){var m=V;switch(m.tag){case 0:case 11:case 15:Qj(8,m,f)}var q=m.child;if(null!==q)q.return=m,V=q;else for(;null!==V;){m=V;var r=m.sibling,y=m.return;Tj(m);if(m===\nl){V=null;break}if(null!==r){r.return=y;V=r;break}V=y}}}var n=f.alternate;if(null!==n){var t=n.child;if(null!==t){n.child=null;do{var J=t.sibling;t.sibling=null;t=J}while(null!==t)}}V=f}}if(0!==(f.subtreeFlags&2064)&&null!==g)g.return=f,V=g;else b:for(;null!==V;){f=V;if(0!==(f.flags&2048))switch(f.tag){case 0:case 11:case 15:Qj(9,f,f.return)}var x=f.sibling;if(null!==x){x.return=f.return;V=x;break b}V=f.return}}var w=a.current;for(V=w;null!==V;){g=V;var u=g.child;if(0!==(g.subtreeFlags&2064)&&null!==\nu)u.return=g,V=u;else b:for(g=w;null!==V;){h=V;if(0!==(h.flags&2048))try{switch(h.tag){case 0:case 11:case 15:Rj(9,h)}}catch(na){W(h,h.return,na)}if(h===g){V=null;break b}var F=h.sibling;if(null!==F){F.return=h.return;V=F;break b}V=h.return}}K=e;jg();if(lc&&"function"===typeof lc.onPostCommitFiberRoot)try{lc.onPostCommitFiberRoot(kc,a)}catch(na){}d=!0}return d}finally{C=c,pk.transition=b}}return!1}function Yk(a,b,c){b=Ki(c,b);b=Oi(a,b,1);a=dh(a,b,1);b=L();null!==a&&(Ac(a,1,b),Ek(a,b))}\nfunction W(a,b,c){if(3===a.tag)Yk(a,a,c);else for(;null!==b;){if(3===b.tag){Yk(b,a,c);break}else if(1===b.tag){var d=b.stateNode;if("function"===typeof b.type.getDerivedStateFromError||"function"===typeof d.componentDidCatch&&(null===Si||!Si.has(d))){a=Ki(c,a);a=Ri(b,a,1);b=dh(b,a,1);a=L();null!==b&&(Ac(b,1,a),Ek(b,a));break}}b=b.return}}\nfunction Ui(a,b,c){var d=a.pingCache;null!==d&&d.delete(b);b=L();a.pingedLanes|=a.suspendedLanes&c;R===a&&(Z&c)===c&&(4===T||3===T&&(Z&130023424)===Z&&500>B()-gk?Lk(a,0):sk|=c);Ek(a,b)}function Zk(a,b){0===b&&(0===(a.mode&1)?b=1:(b=sc,sc<<=1,0===(sc&130023424)&&(sc=4194304)));var c=L();a=Zg(a,b);null!==a&&(Ac(a,b,c),Ek(a,c))}function vj(a){var b=a.memoizedState,c=0;null!==b&&(c=b.retryLane);Zk(a,c)}\nfunction ck(a,b){var c=0;switch(a.tag){case 13:var d=a.stateNode;var e=a.memoizedState;null!==e&&(c=e.retryLane);break;case 19:d=a.stateNode;break;default:throw Error(p(314));}null!==d&&d.delete(b);Zk(a,c)}var Wk;\nWk=function(a,b,c){if(null!==a)if(a.memoizedProps!==b.pendingProps||Wf.current)Ug=!0;else{if(0===(a.lanes&c)&&0===(b.flags&128))return Ug=!1,zj(a,b,c);Ug=0!==(a.flags&131072)?!0:!1}else Ug=!1,I&&0!==(b.flags&1048576)&&ug(b,ng,b.index);b.lanes=0;switch(b.tag){case 2:var d=b.type;jj(a,b);a=b.pendingProps;var e=Yf(b,H.current);Tg(b,c);e=Xh(null,b,d,a,e,c);var f=bi();b.flags|=1;"object"===typeof e&&null!==e&&"function"===typeof e.render&&void 0===e.$$typeof?(b.tag=1,b.memoizedState=null,b.updateQueue=\nnull,Zf(d)?(f=!0,cg(b)):f=!1,b.memoizedState=null!==e.state&&void 0!==e.state?e.state:null,ah(b),e.updater=nh,b.stateNode=e,e._reactInternals=b,rh(b,d,a,c),b=kj(null,b,d,!0,f,c)):(b.tag=0,I&&f&&vg(b),Yi(null,b,e,c),b=b.child);return b;case 16:d=b.elementType;a:{jj(a,b);a=b.pendingProps;e=d._init;d=e(d._payload);b.type=d;e=b.tag=$k(d);a=Lg(d,a);switch(e){case 0:b=dj(null,b,d,a,c);break a;case 1:b=ij(null,b,d,a,c);break a;case 11:b=Zi(null,b,d,a,c);break a;case 14:b=aj(null,b,d,Lg(d.type,a),c);break a}throw Error(p(306,\nd,""));}return b;case 0:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:Lg(d,e),dj(a,b,d,e,c);case 1:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:Lg(d,e),ij(a,b,d,e,c);case 3:a:{lj(b);if(null===a)throw Error(p(387));d=b.pendingProps;f=b.memoizedState;e=f.element;bh(a,b);gh(b,d,null,c);var g=b.memoizedState;d=g.element;if(f.isDehydrated)if(f={element:d,isDehydrated:!1,cache:g.cache,pendingSuspenseBoundaries:g.pendingSuspenseBoundaries,transitions:g.transitions},b.updateQueue.baseState=\nf,b.memoizedState=f,b.flags&256){e=Ki(Error(p(423)),b);b=mj(a,b,d,c,e);break a}else if(d!==e){e=Ki(Error(p(424)),b);b=mj(a,b,d,c,e);break a}else for(yg=Lf(b.stateNode.containerInfo.firstChild),xg=b,I=!0,zg=null,c=Ch(b,null,d,c),b.child=c;c;)c.flags=c.flags&-3|4096,c=c.sibling;else{Ig();if(d===e){b=$i(a,b,c);break a}Yi(a,b,d,c)}b=b.child}return b;case 5:return Kh(b),null===a&&Eg(b),d=b.type,e=b.pendingProps,f=null!==a?a.memoizedProps:null,g=e.children,Ef(d,e)?g=null:null!==f&&Ef(d,f)&&(b.flags|=32),\nhj(a,b),Yi(a,b,g,c),b.child;case 6:return null===a&&Eg(b),null;case 13:return pj(a,b,c);case 4:return Ih(b,b.stateNode.containerInfo),d=b.pendingProps,null===a?b.child=Bh(b,null,d,c):Yi(a,b,d,c),b.child;case 11:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:Lg(d,e),Zi(a,b,d,e,c);case 7:return Yi(a,b,b.pendingProps,c),b.child;case 8:return Yi(a,b,b.pendingProps.children,c),b.child;case 12:return Yi(a,b,b.pendingProps.children,c),b.child;case 10:a:{d=b.type._context;e=b.pendingProps;f=b.memoizedProps;\ng=e.value;G(Mg,d._currentValue);d._currentValue=g;if(null!==f)if(He(f.value,g)){if(f.children===e.children&&!Wf.current){b=$i(a,b,c);break a}}else for(f=b.child,null!==f&&(f.return=b);null!==f;){var h=f.dependencies;if(null!==h){g=f.child;for(var k=h.firstContext;null!==k;){if(k.context===d){if(1===f.tag){k=ch(-1,c&-c);k.tag=2;var l=f.updateQueue;if(null!==l){l=l.shared;var m=l.pending;null===m?k.next=k:(k.next=m.next,m.next=k);l.pending=k}}f.lanes|=c;k=f.alternate;null!==k&&(k.lanes|=c);Sg(f.return,\nc,b);h.lanes|=c;break}k=k.next}}else if(10===f.tag)g=f.type===b.type?null:f.child;else if(18===f.tag){g=f.return;if(null===g)throw Error(p(341));g.lanes|=c;h=g.alternate;null!==h&&(h.lanes|=c);Sg(g,c,b);g=f.sibling}else g=f.child;if(null!==g)g.return=f;else for(g=f;null!==g;){if(g===b){g=null;break}f=g.sibling;if(null!==f){f.return=g.return;g=f;break}g=g.return}f=g}Yi(a,b,e.children,c);b=b.child}return b;case 9:return e=b.type,d=b.pendingProps.children,Tg(b,c),e=Vg(e),d=d(e),b.flags|=1,Yi(a,b,d,c),\nb.child;case 14:return d=b.type,e=Lg(d,b.pendingProps),e=Lg(d.type,e),aj(a,b,d,e,c);case 15:return cj(a,b,b.type,b.pendingProps,c);case 17:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:Lg(d,e),jj(a,b),b.tag=1,Zf(d)?(a=!0,cg(b)):a=!1,Tg(b,c),ph(b,d,e),rh(b,d,e,c),kj(null,b,d,!0,a,c);case 19:return yj(a,b,c);case 22:return ej(a,b,c)}throw Error(p(156,b.tag));};function Gk(a,b){return ac(a,b)}\nfunction al(a,b,c,d){this.tag=a;this.key=c;this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null;this.index=0;this.ref=null;this.pendingProps=b;this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null;this.mode=d;this.subtreeFlags=this.flags=0;this.deletions=null;this.childLanes=this.lanes=0;this.alternate=null}function Bg(a,b,c,d){return new al(a,b,c,d)}function bj(a){a=a.prototype;return!(!a||!a.isReactComponent)}\nfunction $k(a){if("function"===typeof a)return bj(a)?1:0;if(void 0!==a&&null!==a){a=a.$$typeof;if(a===Da)return 11;if(a===Ga)return 14}return 2}\nfunction wh(a,b){var c=a.alternate;null===c?(c=Bg(a.tag,b,a.key,a.mode),c.elementType=a.elementType,c.type=a.type,c.stateNode=a.stateNode,c.alternate=a,a.alternate=c):(c.pendingProps=b,c.type=a.type,c.flags=0,c.subtreeFlags=0,c.deletions=null);c.flags=a.flags&14680064;c.childLanes=a.childLanes;c.lanes=a.lanes;c.child=a.child;c.memoizedProps=a.memoizedProps;c.memoizedState=a.memoizedState;c.updateQueue=a.updateQueue;b=a.dependencies;c.dependencies=null===b?null:{lanes:b.lanes,firstContext:b.firstContext};\nc.sibling=a.sibling;c.index=a.index;c.ref=a.ref;return c}\nfunction yh(a,b,c,d,e,f){var g=2;d=a;if("function"===typeof a)bj(a)&&(g=1);else if("string"===typeof a)g=5;else a:switch(a){case ya:return Ah(c.children,e,f,b);case za:g=8;e|=8;break;case Aa:return a=Bg(12,c,b,e|2),a.elementType=Aa,a.lanes=f,a;case Ea:return a=Bg(13,c,b,e),a.elementType=Ea,a.lanes=f,a;case Fa:return a=Bg(19,c,b,e),a.elementType=Fa,a.lanes=f,a;case Ia:return qj(c,e,f,b);default:if("object"===typeof a&&null!==a)switch(a.$$typeof){case Ba:g=10;break a;case Ca:g=9;break a;case Da:g=11;\nbreak a;case Ga:g=14;break a;case Ha:g=16;d=null;break a}throw Error(p(130,null==a?a:typeof a,""));}b=Bg(g,c,b,e);b.elementType=a;b.type=d;b.lanes=f;return b}function Ah(a,b,c,d){a=Bg(7,a,d,b);a.lanes=c;return a}function qj(a,b,c,d){a=Bg(22,a,d,b);a.elementType=Ia;a.lanes=c;a.stateNode={isHidden:!1};return a}function xh(a,b,c){a=Bg(6,a,null,b);a.lanes=c;return a}\nfunction zh(a,b,c){b=Bg(4,null!==a.children?a.children:[],a.key,b);b.lanes=c;b.stateNode={containerInfo:a.containerInfo,pendingChildren:null,implementation:a.implementation};return b}\nfunction bl(a,b,c,d,e){this.tag=b;this.containerInfo=a;this.finishedWork=this.pingCache=this.current=this.pendingChildren=null;this.timeoutHandle=-1;this.callbackNode=this.pendingContext=this.context=null;this.callbackPriority=0;this.eventTimes=zc(0);this.expirationTimes=zc(-1);this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0;this.entanglements=zc(0);this.identifierPrefix=d;this.onRecoverableError=e;this.mutableSourceEagerHydrationData=\nnull}function cl(a,b,c,d,e,f,g,h,k){a=new bl(a,b,c,h,k);1===b?(b=1,!0===f&&(b|=8)):b=0;f=Bg(3,null,null,b);a.current=f;f.stateNode=a;f.memoizedState={element:d,isDehydrated:c,cache:null,transitions:null,pendingSuspenseBoundaries:null};ah(f);return a}function dl(a,b,c){var d=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:wa,key:null==d?null:""+d,children:a,containerInfo:b,implementation:c}}\nfunction el(a){if(!a)return Vf;a=a._reactInternals;a:{if(Vb(a)!==a||1!==a.tag)throw Error(p(170));var b=a;do{switch(b.tag){case 3:b=b.stateNode.context;break a;case 1:if(Zf(b.type)){b=b.stateNode.__reactInternalMemoizedMergedChildContext;break a}}b=b.return}while(null!==b);throw Error(p(171));}if(1===a.tag){var c=a.type;if(Zf(c))return bg(a,c,b)}return b}\nfunction fl(a,b,c,d,e,f,g,h,k){a=cl(c,d,!0,a,e,f,g,h,k);a.context=el(null);c=a.current;d=L();e=lh(c);f=ch(d,e);f.callback=void 0!==b&&null!==b?b:null;dh(c,f,e);a.current.lanes=e;Ac(a,e,d);Ek(a,d);return a}function gl(a,b,c,d){var e=b.current,f=L(),g=lh(e);c=el(c);null===b.context?b.context=c:b.pendingContext=c;b=ch(f,g);b.payload={element:a};d=void 0===d?null:d;null!==d&&(b.callback=d);a=dh(e,b,g);null!==a&&(mh(a,e,g,f),eh(a,e,g));return g}\nfunction hl(a){a=a.current;if(!a.child)return null;switch(a.child.tag){case 5:return a.child.stateNode;default:return a.child.stateNode}}function il(a,b){a=a.memoizedState;if(null!==a&&null!==a.dehydrated){var c=a.retryLane;a.retryLane=0!==c&&c<b?c:b}}function jl(a,b){il(a,b);(a=a.alternate)&&il(a,b)}function kl(){return null}var ll="function"===typeof reportError?reportError:function(a){console.error(a)};function ml(a){this._internalRoot=a}\nnl.prototype.render=ml.prototype.render=function(a){var b=this._internalRoot;if(null===b)throw Error(p(409));gl(a,b,null,null)};nl.prototype.unmount=ml.prototype.unmount=function(){var a=this._internalRoot;if(null!==a){this._internalRoot=null;var b=a.containerInfo;Sk(function(){gl(null,a,null,null)});b[uf]=null}};function nl(a){this._internalRoot=a}\nnl.prototype.unstable_scheduleHydration=function(a){if(a){var b=Hc();a={blockedOn:null,target:a,priority:b};for(var c=0;c<Qc.length&&0!==b&&b<Qc[c].priority;c++);Qc.splice(c,0,a);0===c&&Vc(a)}};function ol(a){return!(!a||1!==a.nodeType&&9!==a.nodeType&&11!==a.nodeType)}function pl(a){return!(!a||1!==a.nodeType&&9!==a.nodeType&&11!==a.nodeType&&(8!==a.nodeType||" react-mount-point-unstable "!==a.nodeValue))}function ql(){}\nfunction rl(a,b,c,d,e){if(e){if("function"===typeof d){var f=d;d=function(){var a=hl(g);f.call(a)}}var g=fl(b,d,a,0,null,!1,!1,"",ql);a._reactRootContainer=g;a[uf]=g.current;sf(8===a.nodeType?a.parentNode:a);Sk();return g}for(;e=a.lastChild;)a.removeChild(e);if("function"===typeof d){var h=d;d=function(){var a=hl(k);h.call(a)}}var k=cl(a,0,!1,null,null,!1,!1,"",ql);a._reactRootContainer=k;a[uf]=k.current;sf(8===a.nodeType?a.parentNode:a);Sk(function(){gl(b,k,c,d)});return k}\nfunction sl(a,b,c,d,e){var f=c._reactRootContainer;if(f){var g=f;if("function"===typeof e){var h=e;e=function(){var a=hl(g);h.call(a)}}gl(b,g,a,e)}else g=rl(c,b,a,e,d);return hl(g)}Ec=function(a){switch(a.tag){case 3:var b=a.stateNode;if(b.current.memoizedState.isDehydrated){var c=tc(b.pendingLanes);0!==c&&(Cc(b,c|1),Ek(b,B()),0===(K&6)&&(Hj=B()+500,jg()))}break;case 13:Sk(function(){var b=Zg(a,1);if(null!==b){var c=L();mh(b,a,1,c)}}),jl(a,1)}};\nFc=function(a){if(13===a.tag){var b=Zg(a,134217728);if(null!==b){var c=L();mh(b,a,134217728,c)}jl(a,134217728)}};Gc=function(a){if(13===a.tag){var b=lh(a),c=Zg(a,b);if(null!==c){var d=L();mh(c,a,b,d)}jl(a,b)}};Hc=function(){return C};Ic=function(a,b){var c=C;try{return C=a,b()}finally{C=c}};\nyb=function(a,b,c){switch(b){case "input":bb(a,c);b=c.name;if("radio"===c.type&&null!=b){for(c=a;c.parentNode;)c=c.parentNode;c=c.querySelectorAll("input[name="+JSON.stringify(""+b)+\'][type="radio"]\');for(b=0;b<c.length;b++){var d=c[b];if(d!==a&&d.form===a.form){var e=Db(d);if(!e)throw Error(p(90));Wa(d);bb(d,e)}}}break;case "textarea":ib(a,c);break;case "select":b=c.value,null!=b&&fb(a,!!c.multiple,b,!1)}};Gb=Rk;Hb=Sk;\nvar tl={usingClientEntryPoint:!1,Events:[Cb,ue,Db,Eb,Fb,Rk]},ul={findFiberByHostInstance:Wc,bundleType:0,version:"18.2.0",rendererPackageName:"react-dom"};\nvar vl={bundleType:ul.bundleType,version:ul.version,rendererPackageName:ul.rendererPackageName,rendererConfig:ul.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setErrorHandler:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:ua.ReactCurrentDispatcher,findHostInstanceByFiber:function(a){a=Zb(a);return null===a?null:a.stateNode},findFiberByHostInstance:ul.findFiberByHostInstance||\nkl,findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null,reconcilerVersion:"18.2.0-next-9e3b772b8-20220608"};if("undefined"!==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__){var wl=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!wl.isDisabled&&wl.supportsFiber)try{kc=wl.inject(vl),lc=wl}catch(a){}}exports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=tl;\nexports.createPortal=function(a,b){var c=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;if(!ol(b))throw Error(p(200));return dl(a,b,null,c)};exports.createRoot=function(a,b){if(!ol(a))throw Error(p(299));var c=!1,d="",e=ll;null!==b&&void 0!==b&&(!0===b.unstable_strictMode&&(c=!0),void 0!==b.identifierPrefix&&(d=b.identifierPrefix),void 0!==b.onRecoverableError&&(e=b.onRecoverableError));b=cl(a,1,!1,null,null,c,!1,d,e);a[uf]=b.current;sf(8===a.nodeType?a.parentNode:a);return new ml(b)};\nexports.findDOMNode=function(a){if(null==a)return null;if(1===a.nodeType)return a;var b=a._reactInternals;if(void 0===b){if("function"===typeof a.render)throw Error(p(188));a=Object.keys(a).join(",");throw Error(p(268,a));}a=Zb(b);a=null===a?null:a.stateNode;return a};exports.flushSync=function(a){return Sk(a)};exports.hydrate=function(a,b,c){if(!pl(b))throw Error(p(200));return sl(null,a,b,!0,c)};\nexports.hydrateRoot=function(a,b,c){if(!ol(a))throw Error(p(405));var d=null!=c&&c.hydratedSources||null,e=!1,f="",g=ll;null!==c&&void 0!==c&&(!0===c.unstable_strictMode&&(e=!0),void 0!==c.identifierPrefix&&(f=c.identifierPrefix),void 0!==c.onRecoverableError&&(g=c.onRecoverableError));b=fl(b,null,a,1,null!=c?c:null,e,!1,f,g);a[uf]=b.current;sf(a);if(d)for(a=0;a<d.length;a++)c=d[a],e=c._getVersion,e=e(c._source),null==b.mutableSourceEagerHydrationData?b.mutableSourceEagerHydrationData=[c,e]:b.mutableSourceEagerHydrationData.push(c,\ne);return new nl(b)};exports.render=function(a,b,c){if(!pl(b))throw Error(p(200));return sl(null,a,b,!1,c)};exports.unmountComponentAtNode=function(a){if(!pl(a))throw Error(p(40));return a._reactRootContainer?(Sk(function(){sl(null,null,a,!1,function(){a._reactRootContainer=null;a[uf]=null})}),!0):!1};exports.unstable_batchedUpdates=Rk;\nexports.unstable_renderSubtreeIntoContainer=function(a,b,c,d){if(!pl(c))throw Error(p(200));if(null==a||void 0===a._reactInternals)throw Error(p(38));return sl(a,b,c,!1,d)};exports.version="18.2.0-next-9e3b772b8-20220608";\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDQ0OC5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDYSxPQUFPLG1CQUFPLENBQUMsSUFBTyxLQUFLLG1CQUFPLENBQUMsSUFBVyxFQUFFLGNBQWMseUVBQXlFLG1CQUFtQixtREFBbUQsb0NBQW9DLDJIQUEySCxxQkFBcUIsaUJBQWlCLFFBQVE7QUFDdmEsaUJBQWlCLFFBQVEsUUFBUSxXQUFXO0FBQzVDO0FBQ0EsRUFBRSxPQUFPLGVBQWUsMEJBQTBCLDBCQUEwQiw4QkFBOEIsU0FBUyxTQUFTLHFCQUFxQixpQ0FBaUMsaUJBQWlCLHVDQUF1Qyw2QkFBNkIscUNBQXFDLDZCQUE2QiwrQkFBK0I7QUFDeFcscUJBQXFCLDBEQUEwRCxjQUFjLDJCQUEyQixnQkFBZ0Isb0JBQW9CLHVCQUF1Qiw0QkFBNEIsU0FBUywwQkFBMEIseUNBQXlDLHFCQUFxQiwwQkFBMEIsdUJBQXVCLG9CQUFvQixZQUFZLG1CQUFtQix5QkFBeUI7QUFDN2Esc0tBQXNLLGdDQUFnQyxFQUFFLDRIQUE0SCxXQUFXLG1DQUFtQyxFQUFFLHlFQUF5RSw4Q0FBOEM7QUFDM2UsNEZBQTRGLGdDQUFnQyxFQUFFLDZRQUE2USw4Q0FBOEM7QUFDemIsOERBQThELGdDQUFnQyxFQUFFLDJDQUEyQyxnQ0FBZ0MsRUFBRSxrREFBa0QsZ0NBQWdDLEVBQUUsd0NBQXdDLDhDQUE4QyxFQUFFLHVCQUF1QixlQUFlO0FBQy9YLHlsQ0FBeWxDO0FBQ3psQyxJQUFJLGdDQUFnQyxFQUFFLDBHQUEwRyx1QkFBdUIsMERBQTBELEVBQUUsd0RBQXdELHVCQUF1QixrRUFBa0UsRUFBRSwrQ0FBK0MsOENBQThDO0FBQ25kLHNGQUFzRix5REFBeUQsOENBQThDO0FBQzdMLHFCQUFxQixvQ0FBb0M7QUFDekQsNGJBQTRiLDBCQUEwQjtBQUN0ZCxxQ0FBcUMsa0NBQWtDLDBCQUEwQixtQ0FBbUMsdUJBQXVCLGVBQWUsNkNBQTZDLDZCQUE2QixtQ0FBbUMsdUJBQXVCLGVBQWUsbUJBQW1CLGVBQWUsU0FBUywyQ0FBMkMsZUFBZSxnQkFBZ0I7QUFDbGIsaUJBQWlCLG1CQUFtQixNQUFNLDhCQUE4QiwrQkFBK0IsSUFBSSxxQkFBcUIsZUFBZSw0Q0FBNEMsZUFBZSxnQkFBZ0IsZ0RBQWdELElBQUksd0JBQXdCLFNBQVMsUUFBUSwwQkFBMEIsS0FBSyxJQUFJLFNBQVMsU0FBUyxJQUFJLG9CQUFvQixLQUFLLElBQUksZUFBZSxTQUFTLElBQUksS0FBSyxTQUFTLG9DQUFvQztBQUMzZCxnREFBZ0Qsd0JBQXdCLEtBQUssS0FBSyxXQUFXLHdCQUF3QixpQkFBaUIsZ0NBQWdDLDJDQUEyQyxxRkFBcUYsU0FBUyxrQkFBa0IsUUFBUSxRQUFRLGdDQUFnQztBQUNqWCxlQUFlLGNBQWMseUJBQXlCLDBCQUEwQiw4QkFBOEIsa0NBQWtDLCtDQUErQyx3Q0FBd0MsZ0NBQWdDO0FBQ3ZRLGVBQWUsdUJBQXVCLDREQUE0RCxnQ0FBZ0MsVUFBVSx5QkFBeUIsdUJBQXVCLHlCQUF5QiwyQkFBMkIseUJBQXlCLDZCQUE2QiwwQ0FBMEMscURBQXFELDhEQUE4RCx1QkFBdUIsZ0JBQWdCO0FBQzFlLHNEQUFzRCxTQUFTLG1FQUFtRSxxQkFBcUIsVUFBVSxJQUFJLGdCQUFnQixXQUFXO0FBQ2hNLGVBQWUsYUFBYSxjQUFjLHNCQUFzQixvREFBb0QsOERBQThELG1DQUFtQywrR0FBK0csd0JBQXdCLGdCQUFnQixzQkFBc0Isb0JBQW9CLG9CQUFvQixxQkFBcUIseUNBQXlDO0FBQ3hlLHlCQUF5QixzQkFBc0IseUJBQXlCLDZCQUE2Qiw4QkFBOEIseUdBQXlHLGdDQUFnQyxZQUFZLGVBQWUsaUJBQWlCLHFFQUFxRSx1QkFBdUI7QUFDcFosZUFBZSxhQUFhO0FBQzVCLGVBQWUscUdBQXFHLHVHQUF1RyxvQkFBb0IsMkJBQTJCLCtCQUErQixvQkFBb0IsaUJBQWlCLE9BQU8sZ0JBQWdCLEVBQUUsMkJBQTJCLHdCQUF3QixFQUFFLE9BQU8sb0JBQW9CLFNBQVMsc0JBQXNCLE9BQU8seUJBQXlCO0FBQ3RmLEtBQUssZUFBZSxlQUFlLHlDQUF5QyxlQUFlLGVBQWUsc0JBQXNCLGVBQWUsbUJBQW1CLFNBQVMsOENBQThDLElBQUksbUNBQW1DLGVBQWUscURBQXFELHNDQUFzQyxJQUFJLCtCQUErQixTQUFTO0FBQ3RaLGlCQUFpQixnQkFBZ0IsV0FBVyxJQUFJLHdHQUF3RyxFQUFFLGlCQUFpQiwwRkFBMEYsOEJBQThCLGlCQUFpQixnSEFBZ0gsaUJBQWlCLFlBQVk7QUFDamMsaUJBQWlCLFFBQVEsMkJBQTJCLDRCQUE0QixnREFBZ0Qsb0NBQW9DLG1DQUFtQywyQkFBMkIsT0FBTywyR0FBMkc7QUFDcFYsbUJBQW1CLGdFQUFnRSxhQUFhLHlFQUF5RSxrQ0FBa0MsNEJBQTRCLGlCQUFpQixTQUFTLG9CQUFvQixrREFBa0Q7QUFDdlUsbUJBQW1CLDZJQUE2STtBQUNoSyxxQkFBcUIsWUFBWSxNQUFNLEtBQUssWUFBWSxXQUFXLG1CQUFtQixRQUFRLFdBQVcsNEdBQTRHLEtBQUssV0FBVyxPQUFPLFFBQVEsV0FBVyxLQUFLLG1CQUFtQixpQkFBaUIsNkJBQTZCLE9BQU8sa0NBQWtDO0FBQzlXLGlCQUFpQixzREFBc0QsV0FBVyxJQUFJLDBFQUEwRSxFQUFFLGlCQUFpQixjQUFjLFlBQVksYUFBYSxpQkFBaUIsWUFBWSw4QkFBOEIsVUFBVSxpQ0FBaUMsT0FBTyxJQUFJLGdCQUFnQixJQUFJLGlCQUFpQjtBQUNoWCxpQkFBaUIsdUNBQXVDLHdHQUF3RywrQkFBK0IsZUFBZSxvQkFBb0IsZ0VBQWdFLGVBQWUsVUFBVSw4Q0FBOEMsdURBQXVEO0FBQ2hhLGlCQUFpQjtBQUNqQixzQkFBc0Isa0ZBQWtGLHlDQUF5QyxrQkFBa0IsRUFBRSxHQUFHLGVBQWUsZ0ZBQWdGLEtBQUsscUNBQXFDLHFEQUFxRCxvQkFBb0IsYUFBYSw2QkFBNkIsS0FBSyxhQUFhLDhCQUE4QjtBQUNwZCxpQkFBaUIsTUFBTSxtQkFBbUIsdUNBQXVDLGNBQWMsUUFBUTtBQUN2RyxRQUFRO0FBQ1IsaUpBQWlKLDhCQUE4QixvQ0FBb0MsdUJBQXVCLDZDQUE2QyxZQUFZLEVBQUUsRUFBRSxtQkFBbUI7QUFDMVQsaUJBQWlCLFVBQVUsdUNBQXVDLHlDQUF5Qyw0QkFBNEIsNkJBQTZCLFVBQVUsWUFBWSxFQUFFLHlIQUF5SDtBQUNyVCxpQkFBaUIsTUFBTSxvRkFBb0Ysb0NBQW9DLHVDQUF1Qyw0R0FBNEc7QUFDbFMsaUJBQWlCLG9EQUFvRCxVQUFVLGtMQUFrTCxrQkFBa0IsWUFBWSxlQUFlLGlDQUFpQyx5REFBeUQscUNBQXFDO0FBQzdhLGVBQWUsWUFBWSw4Q0FBOEMsa0JBQWtCLHVDQUF1QyxlQUFlLDZCQUE2QixjQUFjLE9BQU8sY0FBYyxXQUFXLE1BQU0sYUFBYSxXQUFXLGNBQWMsaUJBQWlCLFlBQVksZUFBZSxVQUFVLG1CQUFtQixvQkFBb0IsTUFBTSxJQUFJLGlCQUFpQixRQUFRO0FBQ3hZLGlCQUFpQixrQkFBa0Isd0JBQXdCLFlBQVksd0JBQXdCLE9BQU8sWUFBWSxzVUFBc1UsS0FBSyxRQUFRLGFBQWEsaUJBQWlCO0FBQ25lLHdDQUF3QyxTQUFTLFVBQVUsVUFBVSxVQUFVLG9DQUFvQyxlQUFlLE9BQU8sRUFBRSxzQ0FBc0MseUNBQXlDLFNBQVMsTUFBTSwrQkFBK0IsOENBQThDLElBQUksYUFBYSxTQUFTLGlCQUFpQixvQ0FBb0Msb0JBQW9CLE1BQU0sT0FBTywrQkFBK0IsTUFBTSxRQUFRO0FBQ25kLCtCQUErQix5QkFBeUIsT0FBTyxPQUFPLFNBQVMsTUFBTSxRQUFRLHlCQUF5QixrQkFBa0IsZUFBZSxZQUFZLG9CQUFvQixTQUFTLFlBQVksS0FBSyxJQUFJLG1EQUFtRCxTQUFTLHdCQUF3QixlQUFlLGVBQWUsc0JBQXNCLHdEQUF3RCxnQ0FBZ0MsWUFBWSxlQUFlO0FBQ2hkLGVBQWUsa0JBQWtCLE9BQU8sUUFBUSxnQ0FBZ0Msb0JBQW9CLGlCQUFpQixFQUFFLGVBQWUsa0JBQWtCLGtCQUFrQixhQUFhLFdBQVcsYUFBYSxJQUFJLFNBQVMsTUFBTSxzQkFBc0IsY0FBYyxFQUFFLEVBQUUsd0JBQXdCLHdCQUF3QixZQUFZLHFCQUFxQiwrQkFBK0IsS0FBSyx1QkFBdUIsRUFBRSxFQUFFLFVBQVUsS0FBSyxJQUFJLElBQUksTUFBTSxVQUFVLEtBQUssSUFBSSxJQUFJLE1BQU0sWUFBWSxPQUFPLGNBQWMsRUFBRSxFQUFFO0FBQ3pmLEdBQUcsS0FBSyxJQUFJLElBQUksTUFBTSxVQUFVLEtBQUssSUFBSSxJQUFJLE1BQU0sWUFBWSw0QkFBNEIsd0NBQXdDLGlDQUFpQyxtQ0FBbUMsZUFBZSxRQUFRLDJCQUEyQixlQUFlLGlDQUFpQyxjQUFjLFNBQVMsRUFBRSxZQUFZLHFCQUFxQixZQUFZO0FBQy9XLDRWQUE0VixlQUFlLG9EQUFvRCw4REFBOEQ7QUFDN2Qsd0RBQXdELGVBQWUsT0FBTyxrQ0FBa0M7QUFDaEgsZUFBZSxhQUFhLGdCQUFnQixnQkFBZ0IsZ0JBQWdCLGdCQUFnQixrQkFBa0Isa0JBQWtCLDJMQUEyTCx1RkFBdUYsZ0NBQWdDLGdDQUFnQyxnQ0FBZ0M7QUFDbGYsa0JBQWtCLGlCQUFpQixxQkFBcUIsa0JBQWtCLHlEQUF5RCxVQUFVLFdBQVcsc0NBQXNDLDJDQUEyQyxrQkFBa0IsbUZBQW1GLHFCQUFxQixtQkFBbUIsb0NBQW9DLElBQUksaUNBQWlDO0FBQy9iLGlCQUFpQixVQUFVLGtDQUFrQyw4TUFBOE0sNkVBQTZFLHNFQUFzRTtBQUM5WixpQkFBaUIsZ0ZBQWdGLElBQUksRUFBRSw2QkFBNkIsV0FBVyxxQ0FBcUMsK0JBQStCLE9BQU8sZUFBZSw2QkFBNkIseUNBQXlDLGNBQWMsU0FBUyxPQUFPLDBCQUEwQixTQUFTLGVBQWUsaUJBQWlCLEtBQUssY0FBYztBQUNuYSxtQkFBbUIsa0JBQWtCLG9EQUFvRCxlQUFlLFdBQVcsT0FBTyxpQkFBaUIsd0JBQXdCLGlCQUFpQixtQkFBbUIsZ0JBQWdCLGtCQUFrQixzQkFBc0Isb0JBQW9CLGtCQUFrQixtQkFBbUIsd0JBQXdCLElBQUksRUFBRSxzQkFBc0IsT0FBTyxRQUFRLFFBQVE7QUFDblksaUJBQWlCLDBCQUEwQixzQkFBc0IsRUFBRSxFQUFFLHNCQUFzQixzQkFBc0IsT0FBTyxRQUFRLGVBQWUsTUFBTSxrREFBa0Q7QUFDdk0saUJBQWlCLFVBQVUsdUNBQXVDLE1BQU0sMENBQTBDLE1BQU0seUNBQXlDLE1BQU0sNERBQTRELE1BQU07QUFDek8seUJBQXlCLHlDQUF5QyxpRkFBaUYsdUNBQXVDLHNCQUFzQixxQkFBcUIsdUNBQXVDO0FBQzVRLHVCQUF1QixVQUFVLDZDQUE2QywrQ0FBK0MsK0NBQStDLHFDQUFxQyx3Q0FBd0MsU0FBUyx5RkFBeUY7QUFDM1YsZUFBZSxtQkFBbUIsYUFBYSxZQUFZLCtCQUErQixxQkFBcUIsY0FBYyx5QkFBeUIsTUFBTSxFQUFFLFFBQVEsK0RBQStELHFEQUFxRCxRQUFRO0FBQ2xTLGVBQWUsK0JBQStCLDZCQUE2QixXQUFXLEVBQUUsK0RBQStELGFBQWEsZ0JBQWdCLGtDQUFrQyxLQUFLLDBCQUEwQixRQUFRLHFEQUFxRCxVQUFVLFNBQVMsbUJBQW1CLG1CQUFtQixjQUFjLE1BQU0sNkJBQTZCLDZCQUE2Qiw2QkFBNkIsZUFBZTtBQUNyZSxpQkFBaUI7QUFDakIsZUFBZSxjQUFjLGVBQWUsZ0JBQWdCLFlBQVksWUFBWSxZQUFZLEtBQUssWUFBWSxxQ0FBcUMsb0JBQW9CLG9CQUFvQixvQkFBb0IsY0FBYyxjQUFjLFFBQVEsWUFBWSxnREFBZ0QsS0FBSywwQ0FBMEMsc0NBQXNDO0FBQ3ZZLHFCQUFxQix3QkFBd0IsbUJBQW1CLElBQUksZ0JBQWdCLFFBQVEscUJBQXFCLHFCQUFxQix3QkFBd0IsbUJBQW1CLElBQUksZ0JBQWdCLFFBQVE7QUFDN00scUJBQXFCLE9BQU8sa0JBQWtCLG1DQUFtQywwQ0FBMEMsdUNBQXVDLEtBQUssU0FBUyxFQUFFLFlBQVksZ0JBQWdCLGNBQWMseUJBQXlCLGVBQWUsSUFBSSw4QkFBOEIsdUJBQXVCO0FBQzdULHFCQUFxQixRQUFRLFFBQVEsUUFBUSx1Q0FBdUMsd0JBQXdCLFFBQVEscUJBQXFCLE9BQU8sZUFBZSxrR0FBa0csT0FBTyxxQkFBcUIsS0FBSztBQUNsUyxlQUFlLFVBQVUsczBCQUFzMEI7QUFDLzFCLDRCQUE0QixpQkFBaUIsaUJBQWlCLDBCQUEwQix5QkFBeUIsa0JBQWtCLG1CQUFtQiw0QkFBNEIsY0FBYyxnQkFBZ0IsMEVBQTBFLFFBQVEsaUJBQWlCLEtBQUssVUFBVSxRQUFRLHNCQUFzQixLQUFLO0FBQ3JXLGVBQWUsZ0JBQWdCLHdEQUF3RCxlQUFlLHlCQUF5QixjQUFjLFNBQVMsY0FBYztBQUNwSyxlQUFlLHNCQUFzQixrQkFBa0IsbUJBQW1CLFlBQVksbUJBQW1CLGNBQWMsd0JBQXdCLGlFQUFpRSwrRkFBK0YsNkJBQTZCLFlBQVksZUFBZSwwQkFBMEIseUJBQXlCLHVCQUF1QjtBQUNqYiwrQ0FBK0MsNEJBQTRCLHVCQUF1QiwrSEFBK0gscUJBQXFCLGlCQUFpQixFQUFFO0FBQ3pRLFFBQVEsMERBQTBELCtCQUErQixnQ0FBZ0Msa0JBQWtCLEtBQUssZ0JBQWdCLDRCQUE0QixLQUFLLGlLQUFpSyx1R0FBdUcsdUJBQXVCO0FBQ3hlLHFCQUFxQixrR0FBa0csVUFBVSx1QkFBdUIsc0NBQXNDLG1CQUFtQixLQUFLLGVBQWUsbUJBQW1CLEtBQUssZ0JBQWdCLG1CQUFtQixLQUFLLDhDQUE4QyxtQkFBbUIsS0FBSywwQkFBMEIsZ0VBQWdFLG1CQUFtQixLQUFLLE9BQU8sZ0JBQWdCO0FBQ3BmLDhMQUE4TCxLQUFLO0FBQ25NLDBGQUEwRixLQUFLLGdFQUFnRSxlQUFlLHVCQUF1QixvRUFBb0UsY0FBYztBQUN2UixXQUFXLEtBQUssZ0JBQWdCLFVBQVUsdUJBQXVCLCtCQUErQixnSkFBZ0osc0hBQXNILGtDQUFrQyxxQkFBcUIsdURBQXVELG1CQUFtQjtBQUN2ZSwrREFBK0QsbUJBQW1CLEtBQUssK0dBQStHLG1CQUFtQixLQUFLLHVHQUF1RyxtQkFBbUIsS0FBSyw2Q0FBNkMsbUJBQW1CLEtBQUssbUJBQW1CLCtEQUErRDtBQUNwZixtQkFBbUIsOEZBQThGLHNCQUFzQix1RUFBdUUsMERBQTBEO0FBQ3hRLGlCQUFpQixVQUFVLDhDQUE4QyxzQ0FBc0MsMERBQTBELGtCQUFrQixlQUFlLFdBQVcsa0RBQWtELFVBQVUsaUJBQWlCLFVBQVUsbUNBQW1DLDRDQUE0QyxNQUFNLFVBQVUsbURBQW1EO0FBQzliLGlCQUFpQixtRkFBbUYsVUFBVSx5QkFBeUIsMkVBQTJFLHlDQUF5QywrQ0FBK0MsWUFBWSw2REFBNkQ7QUFDblgsUUFBUSxtSkFBbUosZUFBZSw4Q0FBOEMsb0RBQW9ELHFCQUFxQixNQUFNLG1CQUFtQiw0REFBNEQsb0JBQW9CLEdBQUcsb0JBQW9CLGVBQWUsUUFBUSxlQUFlLFlBQVk7QUFDbmQsaUJBQWlCLHlCQUF5QixVQUFVLE9BQU8sT0FBTyxPQUFPLDRCQUE0QixRQUFRLHFDQUFxQyxrQ0FBa0MsR0FBRyxrQ0FBa0MsTUFBTSxXQUFXLHlEQUF5RCxjQUFjLHVEQUF1RCxlQUFlLHFDQUFxQyxTQUFTLGlCQUFpQjtBQUN0YixtQkFBbUIsMEZBQTBGLGVBQWUsbUVBQW1FLGlCQUFpQiw0QkFBNEIsaUJBQWlCLDBDQUEwQyxpQkFBaUIsK0NBQStDO0FBQ3ZXLGlCQUFpQixvQkFBb0IseUVBQXlFLHNDQUFzQyxnQ0FBZ0MsUUFBUSxXQUFXLEtBQUssV0FBVywwQ0FBMEMsU0FBUyxlQUFlLEtBQUssZ0JBQWdCLGdCQUFnQjtBQUM5VCxpQkFBaUIsWUFBWSxJQUFJLFVBQVUsRUFBRSxFQUFFLG1CQUFtQix5QkFBeUIscUJBQXFCLG1CQUFtQixJQUFJLEdBQUcsS0FBSyxFQUFFLEVBQUUsa0JBQWtCLGdCQUFnQixRQUFRLGVBQWUsU0FBUyxTQUFTLGlCQUFpQjtBQUMvTyxjQUFjLHdCQUF3QixpQ0FBaUMsRUFBRSxJQUFJLHNEQUFzRCxTQUFTLEtBQUssdUJBQXVCLFdBQVcsaUJBQWlCLFNBQVMsZUFBZSw4Q0FBOEM7QUFDMVEsZUFBZSw4Q0FBOEMscUVBQXFFLDRJQUE0SSwrRUFBK0UsbUJBQW1CLGlEQUFpRCxxQ0FBcUMsOEJBQThCLFVBQVU7QUFDOWUsR0FBRyx3UkFBd1IsS0FBSyxRQUFRLGVBQWUseUJBQXlCLDRDQUE0QyxFQUFFLHVDQUF1QyxRQUFRLFdBQVc7QUFDeGI7QUFDQSxtQkFBbUIsK0RBQStELCtEQUErRCwwQ0FBMEMsNkVBQTZFLG9HQUFvRyxzR0FBc0csb0JBQW9CO0FBQ3RlLGlCQUFpQixTQUFTLG1DQUFtQyx5QkFBeUIsbUJBQW1CLFNBQVMsUUFBUSxtTUFBbU0sTUFBTTtBQUNuVSxvUEFBb1AsZUFBZSxzQkFBc0IsbUJBQW1CLGNBQWMsNkRBQTZELFNBQVM7QUFDaFksaUJBQWlCLFlBQVksVUFBVSxhQUFhLGFBQWEsTUFBTSxxRUFBcUUsZUFBZSx3QkFBd0IsOEJBQThCLDBCQUEwQiwrQkFBK0Isd0JBQXdCLHdCQUF3Qix5QkFBeUIsNENBQTRDLDRDQUE0QztBQUMzYSxrREFBa0QsOEZBQThGLGlIQUFpSCxzRUFBc0UsNkZBQTZGO0FBQ3BhLG1HQUFtRztBQUNuRyxtQkFBbUIsOEJBQThCLGtCQUFrQixpQkFBaUI7QUFDcEYsaUJBQWlCLFlBQVksWUFBWSxXQUFXLEtBQUsscUJBQXFCLGNBQWMsR0FBRyxhQUFhLDBCQUEwQixLQUFLLEtBQUssMENBQTBDLGFBQWEsMkNBQTJDLFVBQVUsSUFBSSxhQUFhLFdBQVcsS0FBSyxPQUFPLGFBQWEsa0JBQWtCLGFBQWEsMkNBQTJDLFVBQVUsTUFBTTtBQUMzWSxnQkFBZ0IsWUFBWSw4QkFBOEIsbUJBQW1CLGtDQUFrQyxtQkFBbUIsUUFBUSxVQUFVLFlBQVksNkRBQTZELGVBQWUsV0FBVyxTQUFTLHVCQUF1QiwwREFBMEQsRUFBRSx1Q0FBdUM7QUFDMVgscUJBQXFCLGNBQWMsZ0JBQWdCLE1BQU0sWUFBWSxNQUFNLGFBQWEscUJBQXFCLFNBQVMsNERBQTRELHFDQUFxQyxxQkFBcUIsZ0VBQWdFLFVBQVU7QUFDdFQsdUJBQXVCLFFBQVEsMENBQTBDLEVBQUUsbUJBQW1CLFlBQVksaUJBQWlCLGdDQUFnQyxpREFBaUQsd0JBQXdCLFNBQVMsRUFBRSxZQUFZLDhGQUE4RixXQUFXLEtBQUssU0FBUyxFQUFFLFFBQVEsbUJBQW1CLFFBQVEsaUJBQWlCLE1BQU0sV0FBVyxnQkFBZ0IsV0FBVyxjQUFjO0FBQ2xlLEdBQUcsZ0JBQWdCLGVBQWUsYUFBYSxVQUFVLHFDQUFxQyxpQ0FBaUMsTUFBTSx5QkFBeUIsS0FBSyxNQUFNLHlCQUF5QixLQUFLLE1BQU0sd0NBQXdDLE1BQU0scUNBQXFDLDBJQUEwSSxNQUFNO0FBQ2hiLEdBQUcsTUFBTSwyRUFBMkUsTUFBTSw2QkFBNkIsTUFBTSxhQUFhLE1BQU0sbUJBQW1CLE1BQU0sa0JBQWtCLE1BQU0seUNBQXlDLE1BQU0seUtBQXlLLG1FQUFtRSxLQUFLLGNBQWM7QUFDL2UsRUFBRSxFQUFFLElBQUksa0JBQWtCLDRFQUE0RSxXQUFXLFdBQVcsMkNBQTJDLG9CQUFvQixJQUFJLGNBQWMsR0FBRyxxQ0FBcUMsbUNBQW1DLHlFQUF5RSxTQUFTLDBFQUEwRSxNQUFNO0FBQzFiLGdEQUFnRCxnQkFBZ0IsVUFBVSxLQUFLLGlCQUFpQixpQkFBaUIsVUFBVSw4RkFBOEYsa0JBQWtCLGtCQUFrQiwyQkFBMkIsV0FBVyxrQkFBa0IsT0FBTyx5RUFBeUUsSUFBSSxXQUFXLElBQUksSUFBSSxJQUFJLFFBQVEsRUFBRSxZQUFZLElBQUksUUFBUSxFQUFFLFlBQVksS0FBSyxNQUFNLGFBQWEsS0FBSyxNQUFNO0FBQ25mLFVBQVUsS0FBSyxJQUFJLEVBQUUsNENBQTRDLFFBQVEsUUFBUSxPQUFPLFlBQVkseUJBQXlCLHFDQUFxQyxHQUFHLGlCQUFpQix1Q0FBdUMsd0RBQXdELDBCQUEwQixLQUFLLE1BQU0sVUFBVSxnR0FBZ0cscUJBQXFCLGFBQWEsUUFBUSxjQUFjO0FBQzVkLHlEQUF5RCxrQkFBa0IsVUFBVSx5RUFBeUUsTUFBTSw4QkFBOEIsTUFBTSx1QkFBdUIsTUFBTSx1REFBdUQsVUFBVSxNQUFNLG1DQUFtQyxzQ0FBc0MsT0FBTyxTQUFTLFVBQVUsb0RBQW9ELFFBQVE7QUFDM2MsUUFBUSxrREFBa0QsUUFBUSxVQUFVLG1HQUFtRyxpTkFBaU4sc0JBQXNCLHFEQUFxRDtBQUMzYyxzRUFBc0Usb0JBQW9CLGFBQWEsUUFBUSxFQUFFLG1CQUFtQixPQUFPLHVDQUF1QyxpQkFBaUIsMkJBQTJCLFNBQVMsRUFBRSxzQkFBc0Isd0dBQXdHLFdBQVcsU0FBUyxlQUFlLHdCQUF3QixjQUFjLG9CQUFvQjtBQUNwYyx1QkFBdUIsNEJBQTRCLGdCQUFnQixFQUFFLG9DQUFvQyx5QkFBeUIsaUhBQWlILFdBQVcsc0JBQXNCLG9CQUFvQixFQUFFLG9DQUFvQyxlQUFlLG1FQUFtRSxtQkFBbUIsUUFBUSxxQ0FBcUM7QUFDaGUsb0JBQW9CLGlCQUFpQjtBQUNyQyx1UEFBdVAsMENBQTBDLElBQUksZUFBZSxzQkFBc0IsU0FBUztBQUNuVixpQkFBaUIsWUFBWSxHQUFHLG9CQUFvQixpQkFBaUIsMkNBQTJDLFVBQVUsaUJBQWlCLE1BQU0sT0FBTyxJQUFJLHFDQUFxQyxJQUFJLFNBQVMsTUFBTSxlQUFlLEtBQUssUUFBUSxpQkFBaUIsaUJBQWlCLHNCQUFzQixVQUFVLFNBQVMscUNBQXFDLHlCQUF5QjtBQUN6WCxlQUFlLG9CQUFvQixZQUFZLEVBQUUsRUFBRSxtQkFBbUIsYUFBYSxnQ0FBZ0Msa0JBQWtCLElBQUksa0JBQWtCLG9CQUFvQixZQUFZO0FBQzNMLGVBQWUsWUFBWSxjQUFjLHVCQUF1QixFQUFFLEVBQUUsbUJBQW1CLGNBQWMsd0RBQXdELFNBQVMsRUFBRSxvQkFBb0IsUUFBUSxTQUFTLElBQUksZUFBZSxZQUFZLGVBQWUsZUFBZSw2REFBNkQsZUFBZSwyQ0FBMkMsb0JBQW9CLGVBQWUsbUJBQW1CLGdCQUFnQixlQUFlLE9BQU87QUFDN2QsY0FBYywwQ0FBMEMsZ0JBQWdCLEtBQUssaUJBQWlCLFlBQVksU0FBUywwQkFBMEIsaUJBQWlCLDBCQUEwQixnQkFBZ0Isa0JBQWtCLDJHQUEyRyxRQUFRLEdBQUcscUJBQXFCLGlIQUFpSDtBQUN0ZCxlQUFlLHNCQUFzQiw0QkFBNEIsY0FBYyxNQUFNLEtBQUssbUJBQW1CLHNDQUFzQyxPQUFPLFFBQVEsbUJBQW1CLGtCQUFrQixzQkFBc0Isa0RBQWtELHNCQUFzQixtRUFBbUUsV0FBVztBQUNuWCxlQUFlLG1FQUFtRSxhQUFhLE9BQU8saUJBQWlCLFNBQVMsbUJBQW1CLGtCQUFrQiwwQkFBMEIsdUZBQXVGLFFBQVEsd0JBQXdCLGVBQWUsNEJBQTRCLGVBQWUsTUFBTTtBQUN0WCxjQUFjLG1CQUFtQixNQUFNLFlBQVksSUFBSSxTQUFTLFFBQVEsV0FBVyxLQUFLLFdBQVcsV0FBVyxnQkFBZ0IsUUFBUSxNQUFNLFNBQVMsaURBQWlELFFBQVEsV0FBVyxZQUFZLDBEQUEwRCxpQkFBaUIsWUFBWSxZQUFZLEtBQUs7QUFDN1UsbUJBQW1CLFlBQVksWUFBWSxZQUFZLEtBQUssU0FBUyxLQUFLLGlCQUFpQixXQUFXLEtBQUssaUJBQWlCLFNBQVMsWUFBWSw0QkFBNEIsTUFBTSxLQUFLLHdCQUF3QixPQUFPLHlCQUF5QixlQUFlLHFDQUFxQyxlQUFlLEtBQUssT0FBTyxpREFBaUQsS0FBSyxPQUFPLHlFQUF5RTtBQUNyYyxpQkFBaUIsd0JBQXdCLHdCQUF3QixjQUFjLFdBQVcsY0FBYztBQUN4RyxpQkFBaUIsY0FBYyxvQkFBb0Isb0VBQW9FLCtEQUErRCx1R0FBdUcsOERBQThELGtCQUFrQix1QkFBdUIsZ0RBQWdEO0FBQ3BiLFlBQVksa0JBQWtCLGVBQWUseUNBQXlDLGVBQWUsTUFBTSxTQUFTLE1BQU0sUUFBUSxhQUFhLDZCQUE2QixvQkFBb0IsU0FBUyx3REFBd0QsS0FBSyw2QkFBNkIsd0JBQXdCLEtBQUssT0FBTyxlQUFlLGVBQWUsMkNBQTJDLFlBQVk7QUFDNVosZUFBZSxtQkFBbUIsMkJBQTJCLE1BQU0sZ0dBQWdHLGNBQWMsa0NBQWtDLEtBQUssRUFBRSw2QkFBNkIsTUFBTSxlQUFlLGtCQUFrQiw2QkFBNkIsMEJBQTBCLEdBQUcsZ0JBQWdCLFFBQVEsRUFBRSxFQUFFLG1CQUFtQixhQUFhLGFBQWEsVUFBVSxxQkFBcUIsUUFBUSxJQUFJLHFDQUFxQyxnQkFBZ0I7QUFDamdCLE1BQU0sNENBQTRDLFNBQVMsY0FBYyxhQUFhLEVBQUUscUJBQXFCLGNBQWMsV0FBVyxLQUFLLGVBQWUsNEJBQTRCLGtDQUFrQyxpQkFBaUIsc0JBQXNCLE1BQU0sSUFBSSxpQkFBaUIsMENBQTBDLFNBQVMsU0FBUyx3Q0FBd0MsY0FBYyxjQUFjLGVBQWUsaUJBQWlCLE1BQU07QUFDaGMsbUJBQW1CLEtBQUssU0FBUyxFQUFFLGtCQUFrQixxSEFBcUgsZUFBZSxZQUFZLGlCQUFpQixLQUFLLFdBQVcsaUJBQWlCO0FBQ3ZQLGVBQWUsc0JBQXNCLGdCQUFnQixvQ0FBb0MsWUFBWSxpQ0FBaUMsS0FBSyxpQkFBaUIsd0JBQXdCLGtCQUFrQixTQUFTLFlBQVksZUFBZSw0QkFBNEIscUJBQXFCLG9CQUFvQixtREFBbUQsZ0JBQWdCO0FBQ2xYLGlCQUFpQixXQUFXLGtCQUFrQix1QkFBdUIsSUFBSSxlQUFlLFNBQVMsMEVBQTBFLGtDQUFrQyxVQUFVLGVBQWUsZUFBZSwyRUFBMkUsc0NBQXNDO0FBQ3RXLGlCQUFpQixnQkFBZ0IsbUNBQW1DLDBIQUEwSCxFQUFFLGlCQUFpQixPQUFPO0FBQ3hOLG1CQUFtQixvQkFBb0Isd0JBQXdCLFdBQVcsY0FBYyxnQkFBZ0IsMkNBQTJDLFlBQVksZUFBZSxnQkFBZ0IsbURBQW1ELGdCQUFnQixlQUFlLG1CQUFtQixnQkFBZ0IsMkNBQTJDLGNBQWMsa0JBQWtCLEtBQUssVUFBVTtBQUM3WSxpQkFBaUIsa0NBQWtDLHNDQUFzQyxrQkFBa0Isb0JBQW9CLGFBQWEsR0FBRyxPQUFPLDZGQUE2RiwwQkFBMEIsU0FBUyxnQkFBZ0IsMEJBQTBCLFdBQVcsR0FBRyw0RkFBNEYsZ0JBQWdCLE9BQU8sbUJBQW1CO0FBQ3BkLEVBQUU7QUFDRixxQkFBcUIsb0JBQW9CLE1BQU0sOERBQThELGFBQWEsc0JBQXNCLGlCQUFpQixZQUFZLHNCQUFzQixJQUFJLGtCQUFrQixpSEFBaUgsYUFBYSxrQkFBa0IsSUFBSSxXQUFXLElBQUksR0FBRywyQkFBMkIsY0FBYyxxQkFBcUI7QUFDN2IsVUFBVSxFQUFFLEdBQUcsWUFBWSxJQUFJLElBQUksY0FBYyxtQkFBbUIsMEJBQTBCLGdCQUFnQixRQUFRLElBQUksUUFBUSxrQ0FBa0MsbUJBQW1CLHdDQUF3QyxnQ0FBZ0MsTUFBTSxNQUFNLFFBQVEsY0FBYywwRkFBMEYsUUFBUSw2RUFBNkU7QUFDaGQsU0FBUyxpREFBaUQsdUVBQXVFLFNBQVMsZ0JBQWdCLGNBQWMsb0JBQW9CLG1CQUFtQix1QkFBdUIsYUFBYSxJQUFJLHNCQUFzQixhQUFhLGtDQUFrQyxNQUFNLFVBQVU7QUFDNVUsbUJBQW1CLFlBQVksZUFBZSxvQkFBb0IsV0FBVyxLQUFLLHdCQUF3QixhQUFhLGdCQUFnQixJQUFJLCtDQUErQyxZQUFZLCtCQUErQixxQkFBcUIsa0JBQWtCLFNBQVMsNkJBQTZCLE1BQU0sa0JBQWtCO0FBQzFVLFFBQVEsc0JBQXNCLHlDQUF5QyxpQ0FBaUMsb0JBQW9CLDRCQUE0QixZQUFZLHFDQUFxQyxZQUFZLGtDQUFrQyxxQ0FBcUMsb0JBQW9CLDRCQUE0QixRQUFRLFlBQVkscUNBQXFDLFlBQVksa0NBQWtDLGtDQUFrQyxvQkFBb0I7QUFDemUsZ0JBQWdCLFFBQVEscUNBQXFDLFlBQVksb0NBQW9DLDJCQUEyQixjQUFjO0FBQ3RKLG1CQUFtQixjQUFjLG9CQUFvQixvSEFBb0gsYUFBYSw4REFBOEQsYUFBYSxjQUFjLG9CQUFvQixpSEFBaUg7QUFDcFoscUJBQXFCLFVBQVUsa0ZBQWtGLGdHQUFnRztBQUNqTixxQkFBcUIsa0JBQWtCLFVBQVUsd0JBQXdCLFVBQVUsTUFBTSxvQkFBb0IsdUZBQXVGLHdCQUF3Qiw2QkFBNkIsNkRBQTZEO0FBQ3RULHlPQUF5TztBQUN6TyxtQkFBbUIsUUFBUSx5REFBeUQsYUFBYSxXQUFXLE1BQU0saUNBQWlDLGtCQUFrQiw0QkFBNEIsZUFBZSx3RkFBd0YsY0FBYyxhQUFhLG9CQUFvQixFQUFFLDZCQUE2QixlQUFlLFNBQVMsMkNBQTJDLG9DQUFvQztBQUM3ZCxpQkFBaUIsb0NBQW9DLDBEQUEwRCw4QkFBOEIsT0FBTyxlQUFlLGNBQWM7QUFDakwsZUFBZSxnQkFBZ0IsTUFBTSxrQkFBa0Isa0RBQWtELGdCQUFnQixrQkFBa0IsS0FBSyxTQUFTLG9CQUFvQixZQUFZLGdCQUFnQixjQUFjLFNBQVMsMERBQTBELFNBQVMsZ0JBQWdCLFVBQVUsVUFBVSxlQUFlLFNBQVMsa0JBQWtCLFVBQVUsZ0NBQWdDLGNBQWMsa0RBQWtELFdBQVcsU0FBUyxjQUFjO0FBQzdmLGlDQUFpQyxTQUFTLG9CQUFvQiw0REFBNEQsU0FBUyxXQUFXLFNBQVMsb0JBQW9CLGFBQWEsaURBQWlELG9KQUFvSix5Q0FBeUMsZ0JBQWdCLFdBQVcsU0FBUyxvQkFBb0I7QUFDOWQsZ0lBQWdJLHNCQUFzQixXQUFXLFNBQVMsc0JBQXNCLDhEQUE4RCxTQUFTLFdBQVcsU0FBUyxrQkFBa0IsNEZBQTRGLGtDQUFrQyxtQkFBbUI7QUFDOWIsZ0NBQWdDLDZDQUE2QyxzQkFBc0IsNEJBQTRCLDBEQUEwRCxRQUFRLFlBQVksb0JBQW9CLDBCQUEwQix1RkFBdUYsa0NBQWtDLG1CQUFtQix5Q0FBeUMseUNBQXlDO0FBQ3pkLG1CQUFtQixxREFBcUQsUUFBUSxZQUFZLHNCQUFzQiwwRkFBMEYsa0NBQWtDLG1CQUFtQiw4REFBOEQsOERBQThELHNCQUFzQixnQ0FBZ0Msd0RBQXdELFFBQVE7QUFDbmYsb0JBQW9CLHVDQUF1QyxxQkFBcUIsS0FBSyxtQ0FBbUMsb0JBQW9CLGFBQWEsZ0JBQWdCLE1BQU0saUNBQWlDLFdBQVcseUJBQXlCLElBQUksSUFBSSwyQ0FBMkMsYUFBYSxLQUFLLFdBQVcsc0VBQXNFLFdBQVcsU0FBUyxhQUFhLFdBQVc7QUFDdGIsd0RBQXdELHlCQUF5QixjQUFjLEVBQUUsV0FBVyxTQUFTLG9CQUFvQixZQUFZLDZDQUE2QyxZQUFZLCtCQUErQiw2Q0FBNkMsa0JBQWtCLGdCQUFnQixtQ0FBbUMsdUJBQXVCLGFBQWEsZ0JBQWdCLE1BQU0saUNBQWlDLFdBQVcseUJBQXlCLElBQUksSUFBSTtBQUN0ZSxnQkFBZ0IsYUFBYSxLQUFLLFFBQVEsb0ZBQW9GLFdBQVcsU0FBUyxhQUFhLFFBQVEsOElBQThJLHlCQUF5QixjQUFjLEVBQUUsV0FBVyxTQUFTLG9CQUFvQiwrRUFBK0Usa0NBQWtDLG1CQUFtQixXQUFXO0FBQ3JoQixVQUFVLFNBQVMsRUFBRSxjQUFjLFNBQVMsV0FBVyxjQUFjLGVBQWUsd0JBQXdCLFdBQVcsSUFBSSxTQUFTLDJGQUEyRixlQUFlLGVBQWUsZ0JBQWdCLFdBQVcsSUFBSSxRQUFRLE9BQU8sTUFBTSxZQUFZLFlBQVksNklBQTZJLFlBQVksV0FBVyxZQUFZO0FBQ3pmLEVBQUUsRUFBRSx1SEFBdUgsZUFBZSxzQkFBc0IsV0FBVyxJQUFJLFFBQVEsS0FBSyxPQUFPLE1BQU0sWUFBWSxZQUFZLGlCQUFpQixXQUFXLElBQUksWUFBWSxnREFBZ0QsMkJBQTJCLDJCQUEyQixRQUFRO0FBQzNYLHNEQUFzRCxTQUFTLDZCQUE2QiwrQkFBK0IsZUFBZSw4QkFBOEIsU0FBUyxpQkFBaUIsUUFBUSxRQUFRLFNBQVMsYUFBYSxVQUFVLGtFQUFrRSxNQUFNLDRFQUE0RSxNQUFNLFFBQVEsY0FBYyxNQUFNLE1BQU07QUFDOWEsZUFBZSxlQUFlLHFCQUFxQixtQkFBbUIseUJBQXlCLGVBQWUsOEJBQThCO0FBQzVJLGVBQWUsWUFBWSxTQUFTLEVBQUUsZUFBZSxzQkFBc0IsOEVBQThFLDBEQUEwRCw4QkFBOEIsd0JBQXdCLGlCQUFpQixVQUFVLFNBQVMsZUFBZSxLQUFLLGlCQUFpQixFQUFFLDZDQUE2QyxXQUFXLDBCQUEwQixZQUFZLFlBQVk7QUFDOWIsY0FBYyxZQUFZLFlBQVksNkNBQTZDLFlBQVksK0dBQStHLGFBQWEscUJBQXFCLGlCQUFpQixxQkFBcUIsWUFBWSx1QkFBdUIsK0JBQStCO0FBQ3hWLHlCQUF5QixLQUFLLElBQUkscUJBQXFCLG1CQUFtQixVQUFVLGtEQUFrRCxTQUFTLE9BQU8sSUFBSSxHQUFHLE1BQU0sS0FBSyw2QkFBNkIsS0FBSyxTQUFTLG1CQUFtQixjQUFjLFNBQVMsVUFBVSxjQUFjLDBCQUEwQixLQUFLLFdBQVcsTUFBTSx5QkFBeUIsU0FBUyxjQUFjLGFBQWEsS0FBSztBQUN2WSxjQUFjLE9BQU8sdUVBQXVFLHdDQUF3QyxTQUFTLGNBQWMsYUFBYSxrQkFBa0IsZ0NBQWdDLGNBQWMsc0NBQXNDLG9CQUFvQixLQUFLLGdDQUFnQyxJQUFJLEdBQUcsbUdBQW1HLHdDQUF3QztBQUN6ZCxpQkFBaUI7QUFDakIsZUFBZSxxQkFBcUIsZ0NBQWdDLHdCQUF3QixrQ0FBa0MsYUFBYSxhQUFhLGFBQWEsY0FBYyxTQUFTLGdCQUFnQixlQUFlLGFBQWEsU0FBUyxjQUFjLHdCQUF3QixHQUFHLGFBQWEsbUNBQW1DLHVGQUF1RiwrQ0FBK0MsS0FBSyxPQUFPO0FBQzVkLG1DQUFtQyxnQ0FBZ0MsV0FBVyxNQUFNLFNBQVMsdUJBQXVCLHNCQUFzQiwrQkFBK0Isa0JBQWtCLGNBQWMsY0FBYyxzQkFBc0IsZ0JBQWdCLGFBQWEsSUFBSSxzQ0FBc0MsYUFBYSwyQkFBMkI7QUFDNVYsZUFBZSxxQkFBcUIsZ0NBQWdDLHdCQUF3QiwrQ0FBK0MsYUFBYSxlQUFlLGVBQWUsNEJBQTRCLGFBQWEsK0JBQStCLGtCQUFrQixvQ0FBb0Msc0JBQXNCLFlBQVk7QUFDdFYsaUJBQWlCLDhDQUE4Qyw2QkFBNkIsVUFBVSw0QkFBNEIsMERBQTBELGNBQWMsd0NBQXdDLGdDQUFnQyx1QkFBdUIsU0FBUyxtQkFBbUIsZUFBZSxHQUFHLHVCQUF1QixnQkFBZ0IsYUFBYSw0QkFBNEI7QUFDdmEscUJBQXFCLFVBQVUsZ0JBQWdCLGFBQWEsbUJBQW1CLG9CQUFvQixhQUFhLEVBQUUsZUFBZSxvQkFBb0IsVUFBVSxJQUFJLFVBQVUsZUFBZSxTQUFTLFVBQVUsZUFBZSxjQUFjO0FBQzVPLGVBQWUsV0FBVywrQkFBK0IsOEJBQThCLEdBQUcsZ0dBQWdHLFVBQVUsK0JBQStCO0FBQ25PLHFCQUFxQixHQUFHLDJDQUEyQyxnQkFBZ0IsYUFBYSw0QkFBNEIsb0lBQW9JLFNBQVMsY0FBYywwQkFBMEIscUJBQXFCLFdBQVcsV0FBVztBQUM1VixxQkFBcUIsV0FBVyxvQkFBb0IsYUFBYSxhQUFhLHNCQUFzQixZQUFZLDJCQUEyQiw0QkFBNEIsUUFBUSxXQUFXLDhCQUE4QixpQkFBaUIseUJBQXlCLGlCQUFpQixzQkFBc0IsaUJBQWlCLG1CQUFtQixpQkFBaUI7QUFDOVYsaUJBQWlCLHNEQUFzRCxTQUFTLDREQUE0RCxnQkFBZ0IsbUJBQW1CLDBDQUEwQyxtQ0FBbUMsZUFBZSxpQkFBaUIsV0FBVyxvQkFBb0Isc0JBQXNCLDhDQUE4QyxzQkFBc0I7QUFDclosaUJBQWlCLFdBQVcsb0JBQW9CLHNCQUFzQiw4Q0FBOEMsTUFBTSxzQkFBc0IsU0FBUyxtQkFBbUIsNEVBQTRFLGtEQUFrRCxTQUFTLGlCQUFpQixRQUFRLGlCQUFpQixNQUFNLG9CQUFvQixpQkFBaUIsSUFBSSxVQUFVLFFBQVEscUJBQXFCLGNBQWM7QUFDamMsbUJBQW1CLFlBQVksR0FBRyw0REFBNEQsaUJBQWlCLGdDQUFnQyxVQUFVLFlBQVk7QUFDckssbUJBQW1CLGVBQWUsNERBQTRELGlCQUFpQixLQUFLLGtCQUFrQixnRkFBZ0YsbUNBQW1DLG1CQUFtQixlQUFlLFlBQVksb0JBQW9CLG1EQUFtRCxnQkFBZ0IsUUFBUSxVQUFVLFNBQVMsY0FBYztBQUN2YSxlQUFlLGtCQUFrQiw4QkFBOEIsaUJBQWlCLFNBQVMsZ0JBQWdCLDJDQUEyQyxZQUFZLG1CQUFtQixvQkFBb0IsY0FBYyxrQkFBa0IsS0FBSyxVQUFVO0FBQ3RQLFFBQVEsK1JBQStSLEtBQUsseUNBQXlDLHlDQUF5QyxTQUFTLGdFQUFnRSwwQ0FBMEM7QUFDamYsdUJBQXVCLCtCQUErQix5QkFBeUIsa0NBQWtDLG1CQUFtQix1QkFBdUIsV0FBVyxvQkFBb0IsTUFBTSxzQkFBc0IsU0FBUyw0QkFBNEIsV0FBVyxvQkFBb0IsOEJBQThCLEdBQUcsK0ZBQStGLFVBQVUsK0JBQStCLDBCQUEwQixvQkFBb0I7QUFDamYsS0FBSyxHQUFHLFdBQVcseUJBQXlCLDJEQUEyRCw0QkFBNEIsMEJBQTBCLG9CQUFvQixxQkFBcUIscUJBQXFCLFlBQVksOEJBQThCLHNDQUFzQyxlQUFlLE1BQU0sa0NBQWtDLE1BQU0sS0FBSyxNQUFNLGdDQUFnQyx1QkFBdUIsa0JBQWtCLE9BQU8sdUJBQXVCLFVBQVU7QUFDcGUsVUFBVSxjQUFjLHdDQUF3QyxTQUFTLGtCQUFrQixnQ0FBZ0MsTUFBTSxTQUFTLFNBQVMsc0NBQXNDLGNBQWMsT0FBTyw2QkFBNkIsT0FBTywyQ0FBMkMseUJBQXlCLDZCQUE2QixLQUFLLGdMQUFnTCxjQUFjO0FBQ3RoQiw4Q0FBOEMsV0FBVywrQkFBK0IsMEJBQTBCLHFDQUFxQyxZQUFZLGtGQUFrRixLQUFLLGdMQUFnTCxjQUFjLCtDQUErQyxXQUFXO0FBQ2xmLDRDQUE0QywwQkFBMEIscUNBQXFDLFlBQVksbUZBQW1GLGlCQUFpQixJQUFJLGFBQWEsdUJBQXVCLFNBQVMsUUFBUSxTQUFTLHNEQUFzRCxPQUFPLHNDQUFzQyxtQkFBbUIsT0FBTztBQUMxWixpQkFBaUIsSUFBSSx1QkFBdUIsU0FBUyxzQkFBc0IsU0FBUyxHQUFHLCtDQUErQyxtQkFBbUIsV0FBVyxRQUFRLFdBQVcsY0FBYyxjQUFjLHNCQUFzQixpQkFBaUIsU0FBUztBQUNuUSxtQkFBbUIsV0FBVyxRQUFRLHNDQUFzQywwQkFBMEIsY0FBYyxxQkFBcUIsYUFBYSxzQkFBc0IsU0FBUyxrQkFBa0IsMEVBQTBFLFFBQVEsbUVBQW1FLGNBQWMsZ0NBQWdDLDZCQUE2QixFQUFFLEVBQUU7QUFDM2EsbUJBQW1CLGtCQUFrQixhQUFhLHFCQUFxQixjQUFjLFdBQVcsbURBQW1ELHVEQUF1RCxlQUFlLEdBQUcsTUFBTSwwRUFBMEUsY0FBYyxXQUFXLGdCQUFnQjtBQUNyVix1QkFBdUIsa0xBQWtMLGVBQWUsVUFBVSxTQUFTLGtDQUFrQyxxQkFBcUI7QUFDbFMsdUJBQXVCLFdBQVcsWUFBWSxRQUFRLGtCQUFrQixPQUFPLHlGQUF5RixZQUFZLFdBQVcsWUFBWTtBQUMzTSx1QkFBdUIsYUFBYSxhQUFhLDRJQUE0SSwrQkFBK0IsWUFBWSxXQUFXLGlCQUFpQixVQUFVLG9CQUFvQixzQkFBc0IsWUFBWSxnQkFBZ0IsMENBQTBDLFdBQVcsVUFBVSxZQUFZLFdBQVc7QUFDMWEsdUJBQXVCLGFBQWEsc0JBQXNCLG9HQUFvRyxzQ0FBc0M7QUFDcE0sbUJBQW1CLGtFQUFrRSx3REFBd0QsNENBQTRDLGdCQUFnQixLQUFLLHlHQUF5Ryw0Q0FBNEMsd0NBQXdDLGlCQUFpQiw2Q0FBNkMseUJBQXlCLFNBQVMsTUFBTTtBQUNqZiw0REFBNEQsWUFBWSxlQUFlLGlCQUFpQixZQUFZLHlFQUF5RSx1QkFBdUIseUJBQXlCLFVBQVUsUUFBUSxrQkFBa0IsT0FBTyx5RkFBeUYsWUFBWSxXQUFXLFlBQVk7QUFDcFosdUJBQXVCLFVBQVUsU0FBUyxNQUFNLFVBQVUsUUFBUSx5REFBeUQsa0JBQWtCLG9DQUFvQyxVQUFVLGdDQUFnQyx1RUFBdUUsd0dBQXdHO0FBQzFZLDRCQUE0QixNQUFNLHNCQUFzQixVQUFVLFlBQVksa0JBQWtCO0FBQ2hHLDBNQUEwTSxLQUFLLGNBQWMsUUFBUSxrQkFBa0Isd0NBQXdDLFVBQVUsaUJBQWlCLFlBQVksZ0JBQWdCLHVFQUF1RSxpQ0FBaUM7QUFDOWIscUlBQXFJLE1BQU0sa0JBQWtCLFVBQVUsWUFBWSxzQkFBc0I7QUFDek07QUFDQSw2SUFBNkk7QUFDN0kseUJBQXlCLFFBQVEsd0JBQXdCLHlDQUF5QyxjQUFjLGFBQWEsd0VBQXdFLFdBQVcsOEVBQThFLHdCQUF3QixjQUFjLGVBQWUsZUFBZSxrQkFBa0IsbUdBQW1HO0FBQ3ZkLHVCQUF1QixLQUFLLE1BQU0sYUFBYSxZQUFZLGVBQWUsUUFBUSw4Q0FBOEMsZUFBZSxPQUFPO0FBQ3RKLG1CQUFtQiw0REFBNEQseURBQXlELHdCQUF3Qiw4Q0FBOEMsU0FBUyxhQUFhLE1BQU0sa0JBQWtCLHVIQUF1SCxhQUFhLGFBQWEsZ0NBQWdDLHlCQUF5QjtBQUN0YywySUFBMkksa0JBQWtCLGdFQUFnRSxNQUFNLGFBQWEsU0FBUyxVQUFVLFlBQVksT0FBTyxtQ0FBbUMsdUlBQXVJLGlEQUFpRDtBQUNqZixFQUFFLFdBQVcsWUFBWSxVQUFVLElBQUksVUFBVSx3QkFBd0Isa0JBQWtCLGtFQUFrRSxrQkFBa0IsNkJBQTZCLG1CQUFtQixTQUFTLFVBQVUsWUFBWSxRQUFRLG1DQUFtQyxFQUFFLDRCQUE0QixXQUFXLGVBQWUsMkVBQTJFLFVBQVUscUJBQXFCO0FBQzNjLGlCQUFpQixNQUFNLDBCQUEwQixnQkFBZ0IsV0FBVyxpQkFBaUIscUJBQXFCLGdCQUFnQixxQkFBcUIsZ0NBQWdDLFdBQVcscUJBQXFCO0FBQ3ZOLDJCQUEyQixNQUFNLG9FQUFvRSxtRUFBbUUsYUFBYSxTQUFTLE1BQU0sbUNBQW1DLFdBQVcsaUJBQWlCLFdBQVcsV0FBVyxXQUFXLFlBQVksVUFBVSxxQ0FBcUMsNEJBQTRCLG1CQUFtQixTQUFTLHdDQUF3QyxrQkFBa0I7QUFDamQsa0JBQWtCLElBQUksZ0JBQWdCLGlCQUFpQixtQkFBbUIsdUJBQXVCLFVBQVUsSUFBSSxhQUFhLGFBQWEsV0FBVyxNQUFNLFlBQVksTUFBTSxtUEFBbVAsTUFBTSwyQkFBMkIsTUFBTSxZQUFZO0FBQ2xkLDZEQUE2RCxLQUFLLG9CQUFvQixtQkFBbUIsNEZBQTRGLGdCQUFnQixxQkFBcUIsS0FBSyxLQUFLLFFBQVEsMkVBQTJFLG1CQUFtQixjQUFjLFNBQVMsbUJBQW1CLFdBQVcsa0JBQWtCLHVCQUF1QjtBQUN4Yix1QkFBdUIsc0JBQXNCLDBCQUEwQiwyRUFBMkU7QUFDbEosbUJBQW1CLDhDQUE4QyxxQkFBcUIsWUFBWSxrQ0FBa0MsS0FBSywrQ0FBK0MsU0FBUyxFQUFFLGdEQUFnRCw2QkFBNkIsd0JBQXdCLGlCQUFpQixVQUFVLFNBQVMsaUJBQWlCLEtBQUssaUJBQWlCLEVBQUUseUNBQXlDLFdBQVcsMEJBQTBCLFlBQVksS0FBSyxPQUFPO0FBQzNkLEtBQUssZUFBZSwwQkFBMEIsV0FBVyxTQUFTLHlEQUF5RCxJQUFJLCtEQUErRCxlQUFlLE1BQU0sd0JBQXdCLFVBQVUsaUJBQWlCLFNBQVMsRUFBRSxjQUFjLDJCQUEyQixVQUFVLE1BQU0sWUFBWSxZQUFZLElBQUksSUFBSSxrQkFBa0IsTUFBTSwwQ0FBMEMsTUFBTSw2QkFBNkI7QUFDL2MsaUJBQWlCLHlFQUF5RSxtQkFBbUIsMENBQTBDLFlBQVksb0NBQW9DLG1EQUFtRCxtQkFBbUIsVUFBVSx1QkFBdUIsVUFBVSxlQUFlLGlCQUFpQix5REFBeUQsZUFBZTtBQUNoYSxtQkFBbUIsY0FBYyxhQUFhLEtBQUssTUFBTSxhQUFhLE1BQU0seUJBQXlCLE1BQU0sdUNBQXVDLE1BQU0sc0RBQXNELHNCQUFzQixrQkFBa0IsTUFBTSwwQkFBMEIsYUFBYSxpRUFBaUUsK0NBQStDLGlCQUFpQixZQUFZLCtCQUErQixpQkFBaUIsTUFBTTtBQUN0ZSxjQUFjLHNCQUFzQixzQkFBc0IsYUFBYSxrQkFBa0IsMkRBQTJELGVBQWUsV0FBVyxpQkFBaUIsMkNBQTJDLGlCQUFpQjtBQUMzUCxpQkFBaUIsa0JBQWtCLFNBQVMsRUFBRSxtREFBbUQsbUNBQW1DLGlCQUFpQixVQUFVLFNBQVMsZUFBZSxLQUFLLGlCQUFpQixFQUFFLHdDQUF3QyxXQUFXLDBCQUEwQixjQUFjO0FBQzFTLHFCQUFxQixzQkFBc0IsVUFBVSxjQUFjLGVBQWUsV0FBVyxVQUFVLHVCQUF1QixVQUFVLEtBQUssTUFBTSxvQkFBb0IsSUFBSSxhQUFhLEVBQUUsTUFBTSxJQUFJLGFBQWEsRUFBRSxLQUFLLE1BQU0sMEJBQTBCLFVBQVUsS0FBSyxNQUFNLHFGQUFxRixRQUFRLE1BQU0sT0FBTyxvRkFBb0YsV0FBVztBQUN0ZCxTQUFTLFdBQVcsa01BQWtNLFlBQVksV0FBVyxzQkFBc0IsdUVBQXVFLGtFQUFrRSxXQUFXLHNEQUFzRCxhQUFhO0FBQzFkLFFBQVEsMldBQTJXLDZCQUE2QixRQUFRLGdDQUFnQyxxQkFBcUI7QUFDN2MsaUJBQWlCLHlCQUF5Qix1QkFBdUIsZUFBZSxTQUFTLHVDQUF1QyxvQ0FBb0MsTUFBTSwwQkFBMEIsZUFBZSxTQUFTLHVDQUF1QztBQUNuUSxjQUFjLDhEQUE4RCx1QkFBdUIsU0FBUywrRkFBK0YsbUJBQW1CLFNBQVMsNkVBQTZFLGtCQUFrQixlQUFlO0FBQ3JWLG1CQUFtQixxQkFBcUIsTUFBTSxjQUFjLDRGQUE0Rix5Q0FBeUMscUJBQXFCLEtBQUssTUFBTSxLQUFLLEtBQUsscUVBQXFFLG9KQUFvSixRQUFRLEtBQUssWUFBWSxhQUFhO0FBQzFlLFNBQVMsNEZBQTRGLEtBQUssT0FBTywwQ0FBMEMsS0FBSyxZQUFZLGlCQUFpQixVQUFVLGNBQWMsU0FBUyxzQkFBc0IsUUFBUSxRQUFRLGlCQUFpQixVQUFVLDRCQUE0QixhQUFhLE1BQU0scURBQXFELE1BQU0sa0NBQWtDLFlBQVksZUFBZSxNQUFNLDJCQUEyQixNQUFNO0FBQzdlLEdBQUcsWUFBWSxNQUFNLDZCQUE2QixNQUFNLHFCQUFxQixlQUFlLE1BQU0sK0JBQStCLDBCQUEwQixlQUFlLE1BQU0sdUNBQXVDLFFBQVEsT0FBTyx1Q0FBdUMsV0FBVztBQUN4Uix1RkFBdUYsVUFBVSxtQkFBbUIsV0FBVyxNQUFNLHNCQUFzQixNQUFNLE1BQU0sa0NBQWtDLHNEQUFzRCxJQUFJLGdCQUFnQix1QkFBdUIsS0FBSyxtQ0FBbUMsOENBQThDO0FBQ2hZLDRDQUE0QyxRQUFRLHVIQUF1SCxRQUFRLFFBQVEsY0FBYyxjQUFjLEdBQUcsVUFBVSxVQUFVLDRCQUE0QixhQUFhLElBQUksTUFBTSxxREFBcUQsSUFBSSxNQUFNLGtDQUFrQyxZQUFZLGVBQWUsSUFBSSxNQUFNLDJCQUEyQixJQUFJLE1BQU07QUFDNWMsR0FBRyxZQUFZLElBQUksTUFBTSw2QkFBNkIsSUFBSSxNQUFNLHFCQUFxQixVQUFVLGVBQWUsTUFBTSxrQkFBa0IsTUFBTSwrQkFBK0IsMEJBQTBCLE1BQU0sSUFBSSxhQUFhLEVBQUUsZUFBZSxNQUFNLHdCQUF3QixVQUFVLGVBQWUsTUFBTSxZQUFZLFFBQVEsSUFBSSxtQ0FBbUMsV0FBVztBQUNoWCw4TkFBOE4sVUFBVSxtQkFBbUIsV0FBVyxNQUFNLHNCQUFzQixNQUFNLE1BQU0sb0VBQW9FLE1BQU0sc0NBQXNDLFVBQVU7QUFDeGEsSUFBSSxNQUFNLHNEQUFzRCxVQUFVLHlFQUF5RSxRQUFRLGdCQUFnQixRQUFRLGNBQWMsZ0JBQWdCLDhDQUE4QyxLQUFLLFlBQVkseURBQXlELEtBQUssK0RBQStELGlCQUFpQixlQUFlLFVBQVUsY0FBYyxrQkFBa0IsUUFBUTtBQUMvZCwwQkFBMEIsd0NBQXdDLE1BQU0sdUZBQXVGLGdCQUFnQixrRkFBa0YsS0FBSyxZQUFZLGFBQWEsa0JBQWtCLHdFQUF3RSxpRkFBaUYsK0NBQStDO0FBQ3pmLEdBQUcsMEJBQTBCLGtCQUFrQiw2QkFBNkIsMEJBQTBCLFFBQVEsK0RBQStELEtBQUssS0FBSyxzQ0FBc0Msa0NBQWtDLHdDQUF3QyxXQUFXLGlJQUFpSSxtQ0FBbUMsS0FBSyxZQUFZO0FBQ3ZlLDBEQUEwRCw2Q0FBNkMsMENBQTBDLGFBQWEsa0JBQWtCLDZCQUE2QixvQkFBb0IsY0FBYywwQkFBMEIsS0FBSyxvREFBb0QsU0FBUyxFQUFFLFFBQVEsYUFBYSxhQUFhLFNBQVMsZ0JBQWdCLHVDQUF1QyxpQkFBaUIsSUFBSSxjQUFjLFNBQVM7QUFDM2Qsd2FBQXdhLDBDQUEwQyxjQUFjLG1CQUFtQixlQUFlO0FBQ2xnQixVQUFVLG9FQUFvRSxLQUFLLDJCQUEyQiw2SkFBNkosaUdBQWlHLCtGQUErRjtBQUMzYywwRkFBMEYsS0FBSyxZQUFZLHFNQUFxTSxvQkFBb0Isb0JBQW9CO0FBQ3hWLGlCQUFpQixNQUFNLGNBQWMsK0VBQStFLHNHQUFzRyx5QkFBeUIsYUFBYSxrQkFBa0Isa0NBQWtDLDBDQUEwQyxLQUFLLFVBQVUsNkNBQTZDLHlCQUF5Qix3QkFBd0Isd0NBQXdDO0FBQ25mLEtBQUssb0JBQW9CLHFCQUFxQixpRUFBaUUsaUJBQWlCLFlBQVkseUNBQXlDLFFBQVEsU0FBUyxTQUFTLG9CQUFvQixtQkFBbUIsSUFBSSxJQUFJLFNBQVMsVUFBVTtBQUNqUixpQkFBaUIsTUFBTSxPQUFPLFVBQVUsK0JBQStCLDJDQUEyQyxRQUFRLDZDQUE2Qyx1Q0FBdUMsd0JBQXdCLGVBQWUsbUNBQW1DLGdCQUFnQixJQUFJLHNCQUFzQixTQUFTLE9BQU8sUUFBUSxxQ0FBcUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxzQ0FBc0Msc0NBQXNDO0FBQ2xlLG9CQUFvQixpQ0FBaUMsSUFBSSxJQUFJLE1BQU0sRUFBRSxpQkFBaUIsc0JBQXNCLHNCQUFzQixrQ0FBa0MsSUFBSSxlQUFlLElBQUksdUJBQXVCLGVBQWUsWUFBWSxNQUFNLGVBQWUsWUFBWSxJQUFJLGdDQUFnQyxNQUFNLFFBQVEsU0FBUyxxRUFBcUUsVUFBVSxTQUFTLEVBQUUsSUFBSSxJQUFJLGtCQUFrQixvQ0FBb0M7QUFDamUsb0JBQW9CLDJIQUEySCx3Q0FBd0MsTUFBTSx1Q0FBdUMsb0dBQW9HLE1BQU0sbUNBQW1DLDhCQUE4QixTQUFTLGdCQUFnQixZQUFZLGFBQWEsa0JBQWtCLElBQUksTUFBTSxXQUFXLEtBQUssTUFBTTtBQUNuZixtQkFBbUIsb0JBQW9CLDZCQUE2QixhQUFhLGVBQWUsR0FBRyxrQkFBa0IsZ0JBQWdCLGlCQUFpQixzQkFBc0IsU0FBUyxjQUFjLGlCQUFpQixnQkFBZ0IsNkJBQTZCLGFBQWEsZUFBZSxHQUFHLGtCQUFrQixlQUFlLGNBQWMsU0FBUyxjQUFjLGVBQWUsWUFBWSxhQUFhLGtCQUFrQixjQUFjLFdBQVcsTUFBTSxZQUFZO0FBQzNjLGVBQWUsa0JBQWtCLG1DQUFtQyxhQUFhLGlCQUFpQixlQUFlLHdHQUF3RyxpQkFBaUIsY0FBYyxvQkFBb0IscUJBQXFCLHFCQUFxQixvQkFBb0IsaUJBQWlCLG1CQUFtQixlQUFlO0FBQzdYLGVBQWUsUUFBUSxFQUFFLEtBQUssaUJBQWlCLEVBQUUsNkNBQTZDLFdBQVcsMEJBQTBCLGdCQUFnQixpQ0FBaUMsRUFBRSx3QkFBd0Isd0NBQXdDLGdDQUFnQztBQUN0UixtQkFBbUIsWUFBWSw4UEFBOFAsOERBQThELFNBQVM7QUFDcFcsbUJBQW1CLFlBQVkscUVBQXFFLDhEQUE4RCxTQUFTLHVCQUF1QixpQkFBaUIsbUJBQW1CLGNBQWMsU0FBUztBQUM3UCxtQkFBbUIsdURBQXVELDhCQUE4QixVQUFVLGNBQWMsa0JBQWtCLG9CQUFvQixPQUFPLFVBQVUsSUFBSSxLQUFLLDBIQUEwSCxNQUFNLDZIQUE2SCxNQUFNLFdBQVcsS0FBSyw0QkFBNEI7QUFDL2UsVUFBVSxJQUFJLEtBQUssTUFBTSw2RkFBNkYsV0FBVyxHQUFHLG9CQUFvQixRQUFRLHVEQUF1RCxTQUFTLGFBQWEsVUFBVSxNQUFNLHFGQUFxRix5RUFBeUUsU0FBUyxTQUFTLFVBQVUsTUFBTSxrQkFBa0IsTUFBTTtBQUNyZCx5Q0FBeUMsTUFBTSxtQkFBbUIsZUFBZSxvQkFBb0IsYUFBYSxtQkFBbUIsa0JBQWtCLGlDQUFpQyxzQkFBc0Isd0JBQXdCLGlDQUFpQztBQUN2USxpQkFBaUIsa0JBQWtCLHdCQUF3QixXQUFXLEtBQUssV0FBVyxJQUFJLGdCQUFnQixPQUFPLFNBQVMsRUFBRSxjQUFjLHFCQUFxQixNQUFNLFFBQVEsbUNBQW1DLE1BQU0sUUFBUSxtQ0FBbUMsTUFBTSxRQUFRLFdBQVcsZ0NBQWdDLFVBQVUsT0FBTyxNQUFNLGtCQUFrQiwwQkFBMEIsY0FBYyxTQUFTLFVBQVUsc0NBQXNDLFNBQVM7QUFDN2MsaUJBQWlCLDRCQUE0QixjQUFjLHVDQUF1QyxNQUFNLFFBQVEsSUFBSSx5QkFBeUIsU0FBUyxnQkFBZ0IsSUFBSSxpQkFBaUIsU0FBUyxpQkFBaUIsTUFBTSxlQUFlLE1BQU0sZ0NBQWdDLE1BQU0sZUFBZSxNQUFNLGdDQUFnQyxlQUFlLGtCQUFrQixJQUFJLFNBQVMsU0FBUyxpQkFBaUIsaUNBQWlDO0FBQ3BiLG1CQUFtQixnQkFBZ0IscURBQXFELFFBQVEsY0FBYyxRQUFRLFdBQVcsTUFBTSxvQkFBb0IsNkZBQTZGLFVBQVUscUJBQXFCLE1BQU0sd0JBQXdCLE1BQU0sZ0RBQWdELHlDQUF5QyxjQUFjO0FBQ2xhLDJEQUEyRCxRQUFRLFNBQVMsaUJBQWlCLE1BQU0sZUFBZSxNQUFNLFFBQVEsMENBQTBDLGNBQWMsa0JBQWtCLElBQUksY0FBYyxTQUFTLGlCQUFpQixNQUFNLGVBQWUsTUFBTSxtREFBbUQsb0JBQW9CLFNBQVMsZ0JBQWdCLE1BQU0sZUFBZSxNQUFNLE1BQU0sZ0JBQWdCLE1BQU0sVUFBVTtBQUNsYixnRUFBZ0UsV0FBVyxNQUFNLDJDQUEyQywwQ0FBMEMsTUFBTSxXQUFXLHlCQUF5QixrRUFBa0UsU0FBUyxFQUFFLFVBQVUsU0FBUyxFQUFFLElBQUksVUFBVSxjQUFjLGdEQUFnRCxNQUFNLHNCQUFzQixrQkFBa0IsK0NBQStDLElBQUksV0FBVyxJQUFJO0FBQzllLGlFQUFpRSxTQUFTLFVBQVUsTUFBTSxzQkFBc0IsTUFBTSxtQ0FBbUMsTUFBTSxVQUFVLGdDQUFnQyxZQUFZLGtCQUFrQixFQUFFLGNBQWMsYUFBYSxJQUFJLElBQUk7QUFDNVEsaUJBQWlCLFNBQVMsa0JBQWtCLG1CQUFtQixnQkFBZ0IsMkNBQTJDLFNBQVMsaUJBQWlCLGlGQUFpRixpQkFBaUIsVUFBVSxTQUFTLGlCQUFpQixLQUFLLGlCQUFpQixFQUFFLHlDQUF5QyxnQkFBZ0IsV0FBVyxnQkFBZ0IsMEJBQTBCLGFBQWEsTUFBTSxnQkFBZ0IsTUFBTSxXQUFXLE1BQU0sY0FBYztBQUN4ZSxVQUFVLGVBQWUsY0FBYyxRQUFRLElBQUksR0FBRyxtQkFBbUIsU0FBUyxFQUFFLFVBQVUsUUFBUSxRQUFRLFdBQVcscUJBQXFCLGNBQWMseUJBQXlCLG9DQUFvQyxZQUFZLFVBQVUsTUFBTSxzREFBc0QsVUFBVSxNQUFNLDhCQUE4QixTQUFTLGdCQUFnQixZQUFZLHlCQUF5QixtQkFBbUIsSUFBSTtBQUM5YSxtQkFBbUIseUJBQXlCLFNBQVMsRUFBRSxrQkFBa0Isa0JBQWtCLGlDQUFpQyxPQUFPLHdEQUF3RCxLQUFLLFFBQVEsS0FBSyxxQkFBcUIsU0FBUyx3RkFBd0YsS0FBSyxTQUFTLDJCQUEyQixJQUFJLEtBQUssSUFBSSxVQUFVO0FBQ25ZLGVBQWUsS0FBSyxTQUFTLEVBQUUsUUFBUSx1QkFBdUIsa0JBQWtCLElBQUksb0NBQW9DLGtDQUFrQyxNQUFNLHlCQUF5QixtREFBbUQsS0FBSyx3RUFBd0UsOEVBQThFLG9CQUFvQixvQkFBb0IsTUFBTSwyQkFBMkIsYUFBYSxPQUFPLHNDQUFzQztBQUMxZ0Isa0JBQWtCLE1BQU0sMkJBQTJCLFVBQVUsTUFBTSx5QkFBeUIsd0JBQXdCLElBQUksc0JBQXNCLGVBQWUsZ0ZBQWdGLE1BQU0saUNBQWlDLE1BQU0sYUFBYSxhQUFhLGNBQWMsbUNBQW1DLGtCQUFrQixhQUFhLHNCQUFzQixhQUFhLG1CQUFtQixrQkFBa0IsTUFBTTtBQUNsZCw2QkFBNkIsc0JBQXNCLFNBQVMsaUJBQWlCLFVBQVUsT0FBTyxNQUFNLFlBQVksYUFBYSxrQkFBa0IsSUFBSSxNQUFNLFlBQVksZUFBZSxLQUFLLFNBQVMsRUFBRSxRQUFRLFVBQVUsT0FBTyxNQUFNLGdCQUFnQixhQUFhLGtCQUFrQixJQUFJLE1BQU07QUFDNVIsZUFBZSxLQUFLLFNBQVMsRUFBRSxRQUFRLElBQUksY0FBYyxzQ0FBc0MsSUFBSSxRQUFRLFNBQVMsU0FBUyxNQUFNLHlCQUF5Qiw0Q0FBNEMsZUFBZSxJQUFJLHNCQUFzQixTQUFTLFVBQVUsZUFBZSxJQUFJLE1BQU0sU0FBUyxTQUFTLE1BQU0sc0JBQXNCLElBQUksTUFBTSxTQUFTLFdBQVcsU0FBUyxnQkFBZ0IsVUFBVSxPQUFPLE1BQU0sZ0JBQWdCLGFBQWEsa0JBQWtCLElBQUksTUFBTTtBQUNsZCw2UUFBNlEsYUFBYTtBQUMxUixlQUFlLDJCQUEyQixnQ0FBZ0Msb0RBQW9ELElBQUksa0JBQWtCLGVBQWUsMkJBQTJCLFNBQVMscUJBQXFCLDBDQUEwQyxVQUFVO0FBQ2hSLGlCQUFpQixxQkFBcUIsUUFBUSxzQkFBc0Isa0VBQWtFLHVDQUF1QyxlQUFlLHlFQUF5RSxnQkFBZ0IsU0FBUyxLQUFLLGNBQWMsWUFBWSxNQUFNLFlBQVksTUFBTSxhQUFhLE1BQU0sb0JBQW9CLE1BQU0sYUFBYSx3QkFBd0IscUJBQXFCO0FBQzViLGlCQUFpQixNQUFNLEtBQUssaUNBQWlDLHFCQUFxQix3Q0FBd0Msc0JBQXNCLHFCQUFxQixtREFBbUQsS0FBSyxJQUFJLFFBQVEsS0FBSyxXQUFXLDJDQUEyQyxPQUFPLEtBQUssTUFBTSxTQUFTLFFBQVEsU0FBUyxLQUFLLGFBQWEsSUFBSSw4QkFBOEIsVUFBVSx3Q0FBd0MsZ0RBQWdEO0FBQ3RlLEtBQUssc0JBQXNCLHdIQUF3SCxpQkFBaUIsa0JBQWtCLFVBQVUsa0NBQWtDLG1CQUFtQixNQUFNLGVBQWUsMkNBQTJDLHFCQUFxQixtQkFBbUIsY0FBYyxJQUFJLGtDQUFrQyxNQUFNLDRDQUE0QyxNQUFNLFlBQVksTUFBTSxlQUFlO0FBQzFlLFFBQVEsZUFBZSxTQUFTLElBQUksRUFBRSxlQUFlLE9BQU8sT0FBTyxXQUFXLE1BQU0sSUFBSSxRQUFRLHdGQUF3RixTQUFTLDRDQUE0QyxNQUFNLFlBQVksTUFBTSxtQkFBbUIsTUFBTSwrQkFBK0IsVUFBVTtBQUN2VSxpQkFBaUIsU0FBUywyREFBMkQsVUFBVSxtQ0FBbUMsU0FBUyxlQUFlO0FBQzFKLGVBQWUsYUFBYSxFQUFFLGtCQUFrQixvQkFBb0IsK0NBQStDLFdBQVcsS0FBSywyQkFBMkIsVUFBVSxJQUFJLHVCQUF1QixTQUFTLFdBQVcsVUFBVSxpREFBaUQsS0FBSyxlQUFlLEtBQUssaUJBQWlCLEVBQUUsMENBQTBDLFdBQVcsMEJBQTBCLGFBQWE7QUFDMVosaUJBQWlCLE9BQU8sT0FBTyxvQkFBb0Isa0JBQWtCLHdCQUF3QixJQUFJLEVBQUUsc0JBQXNCLFFBQVEsT0FBTyxlQUFlLGlDQUFpQyxLQUFLLGNBQWMsbUNBQW1DLGNBQWMscUJBQXFCLFlBQVksdUJBQXVCLGdEQUFnRCw2QkFBNkIsbUNBQW1DLGtCQUFrQixZQUFZLFVBQVU7QUFDNWMsaUJBQWlCLFFBQVEsS0FBSyxJQUFJLFlBQVksUUFBUSxrQ0FBa0MsZUFBZSx1Q0FBdUMsUUFBUSxLQUFLLHdCQUF3QixJQUFJLHVDQUF1QyxRQUFRLHlDQUF5QyxjQUFjLGNBQWM7QUFDM1MsaUJBQWlCLG9CQUFvQixrQkFBa0Isc0JBQXNCLG1DQUFtQywyQkFBMkIsU0FBUyxFQUFFLFFBQVEsTUFBTSxjQUFjLGtDQUFrQywyQkFBMkIsTUFBTSxZQUFZLE1BQU0sS0FBSyxLQUFLLE1BQU0sYUFBYSxNQUFNLFlBQVksTUFBTSxhQUFhLE1BQU0sYUFBYSxNQUFNLDRCQUE0QixNQUFNLHFCQUFxQixXQUFXLElBQUksdUJBQXVCLE9BQU8sSUFBSSxRQUFRLFdBQVcsV0FBVyxjQUFjO0FBQ3RmLEVBQUUsWUFBWSx5Q0FBeUMsbUJBQW1CLHlCQUF5QixhQUFhLGFBQWEsU0FBUyxTQUFTLFlBQVksUUFBUTtBQUNuSyxpQkFBaUIsR0FBRyxRQUFRLElBQUksS0FBSyxjQUFjLE9BQU8sMEJBQTBCLFNBQVMsRUFBRSxjQUFjLDJCQUEyQixTQUFTLE1BQU0sS0FBSyxXQUFXLE1BQU0sS0FBSyxnQkFBZ0IsOEJBQThCLElBQUksS0FBSyxPQUFPLE1BQU0sR0FBRywyQkFBMkIsSUFBSSxlQUFlLDhEQUE4RCxvQkFBb0IsNENBQTRDLGtCQUFrQjtBQUN2YiwyREFBMkQsWUFBWSxhQUFhLGNBQWMsY0FBYyxvQkFBb0IsSUFBSSxJQUFJLG9CQUFvQixhQUFhLGNBQWMsU0FBUyxnQkFBZ0IsY0FBYyxRQUFRLEtBQUssY0FBYyxVQUFVLEtBQUssUUFBUSxpQkFBaUIscUJBQXFCLFlBQVksYUFBYSxvQ0FBb0MsY0FBYyxZQUFZLFNBQVMsWUFBWSxhQUFhLDRCQUE0QixJQUFJLEdBQUcsY0FBYztBQUNwZSxNQUFNLFdBQVcsZ0JBQWdCLFFBQVEsUUFBUSxXQUFXLDJCQUEyQixvSkFBb0osZUFBZSxNQUFNLFdBQVcsZ0JBQWdCLFFBQVEsU0FBUyxXQUFXLGdCQUFnQixNQUFNLFVBQVUsS0FBSyxnQ0FBZ0MsU0FBUyxNQUFNLFNBQVMsY0FBYyxpQkFBaUIsY0FBYztBQUNqYyxjQUFjLDJCQUEyQiwwREFBMEQsaUJBQWlCLFFBQVEsS0FBSyxXQUFXLGdDQUFnQyxPQUFPLEtBQUssTUFBTSxTQUFTLFFBQVEsU0FBUyxLQUFLLElBQUksYUFBYSxnQ0FBZ0MsT0FBTyxJQUFJLFNBQVMsY0FBYyxLQUFLLFNBQVMsT0FBTyxjQUFjLEtBQUssZ0JBQWdCLE9BQU8sZUFBZSwyQkFBMkIsK0JBQStCLG1CQUFtQjtBQUMzYyxlQUFlLFFBQVEsR0FBRyxrQkFBa0IsV0FBVyx3QkFBd0IsMEJBQTBCLElBQUksUUFBUSxLQUFLLFVBQVUsYUFBYSxlQUFlLElBQUksT0FBTyw2REFBNkQsS0FBSyxJQUFJLE9BQU8sUUFBUSxZQUFZLGFBQWEsSUFBSSxPQUFPLE1BQU0sZ0JBQWdCLGFBQWEsbUJBQW1CLHdCQUF3QixJQUFJLG1DQUFtQyxRQUFRLG9CQUFvQjtBQUNyYixxQkFBcUIsUUFBUSxpQkFBaUIsaUNBQWlDLGlCQUFpQixzQkFBc0Isd0JBQXdCLG9CQUFvQixrQkFBa0IscUNBQXFDLG9CQUFvQixxQkFBcUIsMkJBQTJCLFFBQVEsc0JBQXNCLDJFQUEyRSxLQUFLLFlBQVksR0FBRyxzQkFBc0Isa0NBQWtDLGdCQUFnQjtBQUNsZSxRQUFRLElBQUksUUFBUSxLQUFLLGdCQUFnQixRQUFRLFFBQVEsT0FBTyxRQUFRLFdBQVcsWUFBWSxVQUFVLEtBQUssSUFBSSxJQUFJLGdCQUFnQixpQkFBaUIsc0JBQXNCLGlCQUFpQixpQkFBaUIsa0JBQWtCLFVBQVUsMkNBQTJDLFdBQVcsc0JBQXNCLHVDQUF1QyxFQUFFLGlDQUFpQyw0QkFBNEIsaUJBQWlCLHVDQUF1QyxLQUFLO0FBQzFkLGNBQWMsY0FBYyxpQ0FBaUMsSUFBSSxtQkFBbUIsWUFBWSxzQkFBc0IsS0FBSyxLQUFLLFFBQVEsS0FBSyxpQ0FBaUMsUUFBUSxLQUFLLGdCQUFnQixTQUFTLEVBQUUsa0JBQWtCLHFCQUFxQixrQkFBa0IsYUFBYSxZQUFZLFdBQVcsS0FBSyxXQUFXLFFBQVEsU0FBUyxFQUFFLFFBQVEsY0FBYyxpQ0FBaUMsY0FBYywyQkFBMkIsVUFBVSxTQUFTLEVBQUUsSUFBSSwyQkFBMkIsTUFBTTtBQUNoZixHQUFHLE9BQU8sTUFBTSxhQUFhLFdBQVcsSUFBSSxNQUFNLE1BQU0sa0JBQWtCLGFBQWEsY0FBYyxhQUFhLGFBQWEsR0FBRyxnQkFBZ0IsZUFBZSxJQUFJLGlCQUFpQixLQUFLLHNEQUFzRCxZQUFZLFNBQVMsRUFBRSxJQUFJLG9DQUFvQyx3Q0FBd0MsZ0JBQWdCLGFBQWEsa0JBQWtCLElBQUksUUFBUSxZQUFZLGdCQUFnQixRQUFRLFNBQVMsRUFBRSxJQUFJLGNBQWM7QUFDcGQsaUJBQWlCLGVBQWUsU0FBUyxFQUFFLElBQUksMEJBQTBCLGNBQWMsZ0NBQWdDLFVBQVUsaUJBQWlCLFVBQVUsT0FBTyxRQUFRLGdCQUFnQixhQUFhLGtCQUFrQixJQUFJLFFBQVEsWUFBWSxJQUFJLEtBQUssd0RBQXdELCtCQUErQixXQUFXLEtBQUssU0FBUyxRQUFRLHFCQUFxQixTQUFTLG1CQUFtQixVQUFVLFlBQVksWUFBWSxNQUFNO0FBQzVjLGtCQUFrQix1QkFBdUIsVUFBVSxTQUFTLEVBQUUsY0FBYyxVQUFVLE1BQU0sbUJBQW1CLGtCQUFrQiwwSEFBMEgsVUFBVSxZQUFZLFlBQVksTUFBTSw4QkFBOEIsT0FBTztBQUN4VSxtQkFBbUIsa0JBQWtCLHNCQUFzQixNQUFNLGtDQUFrQyw4RUFBOEUsUUFBUSxpQkFBaUIsMkVBQTJFLFVBQVUsVUFBVSw4QkFBOEIsZUFBZSwwQkFBMEIsMEJBQTBCO0FBQzFZLGlCQUFpQixRQUFRLGNBQWMsMEJBQTBCLHNCQUFzQiwwQkFBMEIsTUFBTSxzQkFBc0IsTUFBTSw2QkFBNkIsc0JBQXNCLFFBQVE7QUFDOU0sbUJBQW1CLGtFQUFrRSxLQUFLLDZEQUE2RCw4QkFBOEIsc0RBQXNELFVBQVUsY0FBYyxvQkFBb0IsUUFBUSxpQkFBaUIsc0JBQXNCLFFBQVEscUJBQXFCLFdBQVcsV0FBVztBQUN6WCxrT0FBa08sU0FBUyx3QkFBd0IsR0FBRyxRQUFRLGlCQUFpQixVQUFVLGdCQUFnQixTQUFTLGNBQWMsVUFBVSxVQUFVLDBCQUEwQixRQUFRLDBCQUEwQixRQUFRLDJCQUEyQixRQUFRLHNDQUFzQyxRQUFRO0FBQ3pmLFFBQVEsU0FBUyxvRkFBb0Ysb0ZBQW9GLFVBQVUsTUFBTSxnQ0FBZ0MsaUJBQWlCLGtCQUFrQixZQUFZLFFBQVEsZUFBZSxzQkFBc0IsWUFBWSx3QkFBd0Isd0hBQXdIO0FBQ2plLGlDQUFpQyxzQkFBc0IsZ0JBQWdCLFFBQVEsZUFBZSxzQkFBc0IsZ0JBQWdCLFFBQVEsa0dBQWtHLEVBQUUscUNBQXFDLEtBQUssS0FBSyxVQUFVLFlBQVksUUFBUSxZQUFZLFVBQVUsU0FBUztBQUM1Viw0QkFBNEIsbUNBQW1DLHlCQUF5QixtSEFBbUgscUZBQXFGLCtDQUErQyx3REFBd0QseURBQXlELFdBQVcsa0JBQWtCLGlCQUFpQjtBQUM5ZSxVQUFVLHNCQUFzQixrQkFBa0IsOEJBQThCLHlDQUF5QyxZQUFZLFNBQVMsMENBQTBDLFNBQVMsRUFBRSxxQkFBcUIsYUFBYSxVQUFVLHlCQUF5QixTQUFTLEVBQUUsa0JBQWtCLGNBQWMsY0FBYyxRQUFRLG9CQUFvQixhQUFhLFdBQVcsZ0JBQWdCLDJDQUEyQyxhQUFhLFdBQVcsY0FBYyx1QkFBdUI7QUFDN2UsS0FBSyxXQUFXLE1BQU0sVUFBVSxrREFBa0Qsb0JBQW9CLFdBQVcsZ0NBQWdDLFdBQVcsY0FBYyx1QkFBdUIsVUFBVSxZQUFZLGVBQWUsdUJBQXVCLGFBQWEsU0FBUyxFQUFFLFVBQVUsT0FBTyxNQUFNLFlBQVksYUFBYSxrQkFBa0IsSUFBSSxNQUFNLFdBQVcsSUFBSSxxQkFBcUIsVUFBVSxTQUFTO0FBQ3haLFFBQVEsNEVBQTRFLCtDQUErQyxpS0FBaUsseUJBQXlCLHlCQUF5Qiw0QkFBNEIsaUJBQWlCO0FBQ25ZLHFCQUFxQixXQUFXLFdBQVcsbUZBQW1GLGFBQWEsY0FBYyxvQkFBb0IsOEVBQThFLFlBQVksK0JBQStCLG9CQUFvQiw2QkFBNkIsb0JBQW9CLHFCQUFxQix1QkFBdUIsZUFBZSxjQUFjO0FBQ3BiLGVBQWUsMENBQTBDLHlCQUF5QixhQUFhLG9CQUFvQixvQkFBb0I7QUFDdkksaUJBQWlCLGtCQUFrQixpTkFBaU4seUJBQXlCLDBCQUEwQixnQkFBZ0IsZ0JBQWdCLGdDQUFnQyxnQ0FBZ0MsNEJBQTRCLGlCQUFpQiw4QkFBOEI7QUFDbGQsb0JBQW9CLGdCQUFnQixZQUFZO0FBQ2hELHlCQUF5QixRQUFRLElBQUksc0NBQXNDLGdDQUFnQyxpQkFBaUIsb0NBQW9DLFlBQVksS0FBSyxNQUFNLDZEQUE2RCwyREFBMkQsMkRBQTJELDJCQUEyQiw0REFBNEQsYUFBYSxRQUFRLFlBQVksUUFBUTtBQUMxZSxRQUFRLGFBQWEsUUFBUSxhQUFhLE9BQU8sUUFBUSwyQ0FBMkMsY0FBYyxnQkFBZ0IsU0FBUyxVQUFVLFNBQVMscUJBQXFCLGNBQWMsVUFBVSxTQUFTLHFCQUFxQixlQUFlLGlCQUFpQixVQUFVLGFBQWEsYUFBYSxTQUFTLG1CQUFtQixpQkFBaUIsVUFBVTtBQUNwVyxtQkFBbUIsZ0RBQWdELFVBQVUsYUFBYSxvRkFBb0Y7QUFDOUssdUJBQXVCLFdBQVcscUJBQXFCLHdFQUF3RSxzQkFBc0Isd0RBQXdELHdCQUF3QixzQkFBc0IsNEJBQTRCLHdJQUF3SSx5QkFBeUIsd0JBQXdCLDBCQUEwQjtBQUMxZSxLQUFLLCtCQUErQixvQkFBb0IsK0JBQStCLG9CQUFvQixZQUFZLGNBQWMsaUJBQWlCLHFGQUFxRixNQUFNLFNBQVMsbUJBQW1CLGtFQUFrRSxPQUFPO0FBQ3RWLGVBQWUsZ0JBQWdCLG9CQUFvQixHQUFHLDRDQUE0QyxRQUFRLEdBQUcsY0FBYyw2QkFBNkIsUUFBUSxzQkFBc0Isd0RBQXdELFNBQVMsV0FBVyxnQkFBZ0IscUJBQXFCLGNBQWMsYUFBYSwwQkFBMEI7QUFDNVYsK0JBQStCLHlCQUF5QixtQkFBbUIsWUFBWSxNQUFNLFFBQVEsVUFBVSx1Q0FBdUMsVUFBVSxrQkFBa0IsVUFBVSxRQUFRLFNBQVMscUJBQXFCLDhCQUE4QixRQUFRLGdEQUFnRCxVQUFVLFdBQVcsV0FBVyxvQkFBb0IseUJBQXlCLFlBQVksa0NBQWtDO0FBQ25iLGVBQWUsWUFBWSx3QkFBd0Isb0JBQW9CLGdDQUFnQyxrQ0FBa0MsaUJBQWlCLGtCQUFrQixrQ0FBa0Msa0JBQWtCLDRCQUE0QixpQkFBaUIsUUFBUSx5QkFBeUIsY0FBYyxZQUFZLCtEQUErRCxrQkFBa0IsZUFBZTtBQUN4YSxvREFBb0QseUJBQXlCLGdDQUFnQyxtQkFBbUIscURBQXFELHlCQUF5QixhQUFhLHdCQUF3QixzQkFBc0IsY0FBYyxxQkFBcUIsRUFBRSxhQUFhLGVBQWU7QUFDMVUsb0RBQW9ELE1BQU0sV0FBVyxHQUFHLG9DQUFvQyxZQUFZLHFDQUFxQyxLQUFLLGlCQUFpQixlQUFlLGVBQWUsNkRBQTZELGVBQWUsNkhBQTZIO0FBQzFaLHVCQUF1QixNQUFNLDBCQUEwQixRQUFRLGFBQWEsWUFBWSxXQUFXLG1DQUFtQyx3QkFBd0IsZ0JBQWdCLGtDQUFrQyxLQUFLLFNBQVMsS0FBSyxjQUFjLGtCQUFrQiwwQkFBMEIsUUFBUSxhQUFhLFlBQVksV0FBVyx1Q0FBdUMsd0JBQXdCLGdCQUFnQixrQ0FBa0MsY0FBYyxZQUFZLEVBQUU7QUFDdGQsdUJBQXVCLDRCQUE0QixNQUFNLFFBQVEsMEJBQTBCLFFBQVEsYUFBYSxZQUFZLFdBQVcsWUFBWSxxQkFBcUIsYUFBYSxlQUFlLGNBQWMseUJBQXlCLHlDQUF5Qyx5QkFBeUIsMERBQTBELE1BQU0sc0JBQXNCLGNBQWMsYUFBYSxVQUFVLGFBQWE7QUFDcmIsZUFBZSxlQUFlLHNCQUFzQixhQUFhLFVBQVUsb0JBQW9CLGtCQUFrQixlQUFlLGVBQWUsc0JBQXNCLGFBQWEsVUFBVSxZQUFZLFVBQVUsY0FBYyxVQUFVLGlCQUFpQixRQUFRLElBQUksZUFBZSxRQUFRO0FBQzlSLG1CQUFtQixVQUFVLHFCQUFxQixTQUFTLDhCQUE4QixRQUFRLGFBQWEsZ0JBQWdCLDJFQUEyRSxRQUFRLFdBQVcsS0FBSyxXQUFXLDJCQUEyQixZQUFZLHlCQUF5QixNQUFNLFVBQVUsTUFBTSx3QkFBd0IsTUFBTSwyREFBMkQsTUFBTTtBQUNqYSxRQUFRLG9EQUFvRCxLQUFLO0FBQ2pFLFFBQVEsa2JBQWtiLFFBQVEsaUNBQWlDO0FBQ25lLDJLQUEySyx3REFBd0Qsc0NBQXNDLHdDQUF3Qyx1QkFBdUIsV0FBVywwREFBMEQ7QUFDN1ksb0JBQW9CLGVBQWUsa0VBQWtFLDhCQUE4Qix1QkFBdUIsa0JBQWtCLGVBQWUsOEJBQThCLG1CQUFtQix1S0FBdUssZ0NBQWdDLGdCQUFnQixrQ0FBa0M7QUFDcmUsbUJBQW1CLGFBQWEsdUJBQXVCLDJCQUEyQix3QkFBd0IsZUFBZSxvREFBb0QsMkJBQTJCLHVCQUF1QixRQUFRLDRCQUE0QixVQUFVLGlCQUFpQixhQUFhLGNBQWMsZUFBZSxpQkFBaUIsOEJBQThCO0FBQ3ZYLG1CQUFtQixpQkFBaUIsOEJBQThCLHNEQUFzRCx1S0FBdUsseUNBQXlDLGdCQUFnQixNQUFNLGFBQWEsV0FBVztBQUN0WCxHQUFHLGtCQUFrQixjQUFjLGlCQUFpQiw4QkFBOEIsMEJBQTBCLDhCQUE4QixhQUFhLDZCQUE2Qiw0Q0FBNEMsNkJBQTZCLDJCQUEyQixXQUFXLEVBQUUsVUFBVSwrQkFBK0I7QUFDOVUsMkNBQTJDLG1CQUFtQiw4QkFBOEIsMERBQTBELHVCQUF1QixlQUFlIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9janMvcmVhY3QtZG9tLnByb2R1Y3Rpb24ubWluLmpzP2NhNWQiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZSBSZWFjdFxuICogcmVhY3QtZG9tLnByb2R1Y3Rpb24ubWluLmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cbi8qXG4gTW9kZXJuaXpyIDMuMC4wcHJlIChDdXN0b20gQnVpbGQpIHwgTUlUXG4qL1xuJ3VzZSBzdHJpY3QnO3ZhciBhYT1yZXF1aXJlKFwicmVhY3RcIiksY2E9cmVxdWlyZShcInNjaGVkdWxlclwiKTtmdW5jdGlvbiBwKGEpe2Zvcih2YXIgYj1cImh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9lcnJvci1kZWNvZGVyLmh0bWw/aW52YXJpYW50PVwiK2EsYz0xO2M8YXJndW1lbnRzLmxlbmd0aDtjKyspYis9XCImYXJnc1tdPVwiK2VuY29kZVVSSUNvbXBvbmVudChhcmd1bWVudHNbY10pO3JldHVyblwiTWluaWZpZWQgUmVhY3QgZXJyb3IgI1wiK2ErXCI7IHZpc2l0IFwiK2IrXCIgZm9yIHRoZSBmdWxsIG1lc3NhZ2Ugb3IgdXNlIHRoZSBub24tbWluaWZpZWQgZGV2IGVudmlyb25tZW50IGZvciBmdWxsIGVycm9ycyBhbmQgYWRkaXRpb25hbCBoZWxwZnVsIHdhcm5pbmdzLlwifXZhciBkYT1uZXcgU2V0LGVhPXt9O2Z1bmN0aW9uIGZhKGEsYil7aGEoYSxiKTtoYShhK1wiQ2FwdHVyZVwiLGIpfVxuZnVuY3Rpb24gaGEoYSxiKXtlYVthXT1iO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspZGEuYWRkKGJbYV0pfVxudmFyIGlhPSEoXCJ1bmRlZmluZWRcIj09PXR5cGVvZiB3aW5kb3d8fFwidW5kZWZpbmVkXCI9PT10eXBlb2Ygd2luZG93LmRvY3VtZW50fHxcInVuZGVmaW5lZFwiPT09dHlwZW9mIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KSxqYT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LGthPS9eWzpBLVpfYS16XFx1MDBDMC1cXHUwMEQ2XFx1MDBEOC1cXHUwMEY2XFx1MDBGOC1cXHUwMkZGXFx1MDM3MC1cXHUwMzdEXFx1MDM3Ri1cXHUxRkZGXFx1MjAwQy1cXHUyMDBEXFx1MjA3MC1cXHUyMThGXFx1MkMwMC1cXHUyRkVGXFx1MzAwMS1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkZEXVs6QS1aX2EtelxcdTAwQzAtXFx1MDBENlxcdTAwRDgtXFx1MDBGNlxcdTAwRjgtXFx1MDJGRlxcdTAzNzAtXFx1MDM3RFxcdTAzN0YtXFx1MUZGRlxcdTIwMEMtXFx1MjAwRFxcdTIwNzAtXFx1MjE4RlxcdTJDMDAtXFx1MkZFRlxcdTMwMDEtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZGRFxcLS4wLTlcXHUwMEI3XFx1MDMwMC1cXHUwMzZGXFx1MjAzRi1cXHUyMDQwXSokLyxsYT1cbnt9LG1hPXt9O2Z1bmN0aW9uIG9hKGEpe2lmKGphLmNhbGwobWEsYSkpcmV0dXJuITA7aWYoamEuY2FsbChsYSxhKSlyZXR1cm4hMTtpZihrYS50ZXN0KGEpKXJldHVybiBtYVthXT0hMDtsYVthXT0hMDtyZXR1cm4hMX1mdW5jdGlvbiBwYShhLGIsYyxkKXtpZihudWxsIT09YyYmMD09PWMudHlwZSlyZXR1cm4hMTtzd2l0Y2godHlwZW9mIGIpe2Nhc2UgXCJmdW5jdGlvblwiOmNhc2UgXCJzeW1ib2xcIjpyZXR1cm4hMDtjYXNlIFwiYm9vbGVhblwiOmlmKGQpcmV0dXJuITE7aWYobnVsbCE9PWMpcmV0dXJuIWMuYWNjZXB0c0Jvb2xlYW5zO2E9YS50b0xvd2VyQ2FzZSgpLnNsaWNlKDAsNSk7cmV0dXJuXCJkYXRhLVwiIT09YSYmXCJhcmlhLVwiIT09YTtkZWZhdWx0OnJldHVybiExfX1cbmZ1bmN0aW9uIHFhKGEsYixjLGQpe2lmKG51bGw9PT1ifHxcInVuZGVmaW5lZFwiPT09dHlwZW9mIGJ8fHBhKGEsYixjLGQpKXJldHVybiEwO2lmKGQpcmV0dXJuITE7aWYobnVsbCE9PWMpc3dpdGNoKGMudHlwZSl7Y2FzZSAzOnJldHVybiFiO2Nhc2UgNDpyZXR1cm4hMT09PWI7Y2FzZSA1OnJldHVybiBpc05hTihiKTtjYXNlIDY6cmV0dXJuIGlzTmFOKGIpfHwxPmJ9cmV0dXJuITF9ZnVuY3Rpb24gdihhLGIsYyxkLGUsZixnKXt0aGlzLmFjY2VwdHNCb29sZWFucz0yPT09Ynx8Mz09PWJ8fDQ9PT1iO3RoaXMuYXR0cmlidXRlTmFtZT1kO3RoaXMuYXR0cmlidXRlTmFtZXNwYWNlPWU7dGhpcy5tdXN0VXNlUHJvcGVydHk9Yzt0aGlzLnByb3BlcnR5TmFtZT1hO3RoaXMudHlwZT1iO3RoaXMuc2FuaXRpemVVUkw9Zjt0aGlzLnJlbW92ZUVtcHR5U3RyaW5nPWd9dmFyIHo9e307XG5cImNoaWxkcmVuIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIGRlZmF1bHRWYWx1ZSBkZWZhdWx0Q2hlY2tlZCBpbm5lckhUTUwgc3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nIHN1cHByZXNzSHlkcmF0aW9uV2FybmluZyBzdHlsZVwiLnNwbGl0KFwiIFwiKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3pbYV09bmV3IHYoYSwwLCExLGEsbnVsbCwhMSwhMSl9KTtbW1wiYWNjZXB0Q2hhcnNldFwiLFwiYWNjZXB0LWNoYXJzZXRcIl0sW1wiY2xhc3NOYW1lXCIsXCJjbGFzc1wiXSxbXCJodG1sRm9yXCIsXCJmb3JcIl0sW1wiaHR0cEVxdWl2XCIsXCJodHRwLWVxdWl2XCJdXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBiPWFbMF07eltiXT1uZXcgdihiLDEsITEsYVsxXSxudWxsLCExLCExKX0pO1tcImNvbnRlbnRFZGl0YWJsZVwiLFwiZHJhZ2dhYmxlXCIsXCJzcGVsbENoZWNrXCIsXCJ2YWx1ZVwiXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3pbYV09bmV3IHYoYSwyLCExLGEudG9Mb3dlckNhc2UoKSxudWxsLCExLCExKX0pO1xuW1wiYXV0b1JldmVyc2VcIixcImV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWRcIixcImZvY3VzYWJsZVwiLFwicHJlc2VydmVBbHBoYVwiXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3pbYV09bmV3IHYoYSwyLCExLGEsbnVsbCwhMSwhMSl9KTtcImFsbG93RnVsbFNjcmVlbiBhc3luYyBhdXRvRm9jdXMgYXV0b1BsYXkgY29udHJvbHMgZGVmYXVsdCBkZWZlciBkaXNhYmxlZCBkaXNhYmxlUGljdHVyZUluUGljdHVyZSBkaXNhYmxlUmVtb3RlUGxheWJhY2sgZm9ybU5vVmFsaWRhdGUgaGlkZGVuIGxvb3Agbm9Nb2R1bGUgbm9WYWxpZGF0ZSBvcGVuIHBsYXlzSW5saW5lIHJlYWRPbmx5IHJlcXVpcmVkIHJldmVyc2VkIHNjb3BlZCBzZWFtbGVzcyBpdGVtU2NvcGVcIi5zcGxpdChcIiBcIikuZm9yRWFjaChmdW5jdGlvbihhKXt6W2FdPW5ldyB2KGEsMywhMSxhLnRvTG93ZXJDYXNlKCksbnVsbCwhMSwhMSl9KTtcbltcImNoZWNrZWRcIixcIm11bHRpcGxlXCIsXCJtdXRlZFwiLFwic2VsZWN0ZWRcIl0uZm9yRWFjaChmdW5jdGlvbihhKXt6W2FdPW5ldyB2KGEsMywhMCxhLG51bGwsITEsITEpfSk7W1wiY2FwdHVyZVwiLFwiZG93bmxvYWRcIl0uZm9yRWFjaChmdW5jdGlvbihhKXt6W2FdPW5ldyB2KGEsNCwhMSxhLG51bGwsITEsITEpfSk7W1wiY29sc1wiLFwicm93c1wiLFwic2l6ZVwiLFwic3BhblwiXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3pbYV09bmV3IHYoYSw2LCExLGEsbnVsbCwhMSwhMSl9KTtbXCJyb3dTcGFuXCIsXCJzdGFydFwiXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3pbYV09bmV3IHYoYSw1LCExLGEudG9Mb3dlckNhc2UoKSxudWxsLCExLCExKX0pO3ZhciByYT0vW1xcLTpdKFthLXpdKS9nO2Z1bmN0aW9uIHNhKGEpe3JldHVybiBhWzFdLnRvVXBwZXJDYXNlKCl9XG5cImFjY2VudC1oZWlnaHQgYWxpZ25tZW50LWJhc2VsaW5lIGFyYWJpYy1mb3JtIGJhc2VsaW5lLXNoaWZ0IGNhcC1oZWlnaHQgY2xpcC1wYXRoIGNsaXAtcnVsZSBjb2xvci1pbnRlcnBvbGF0aW9uIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycyBjb2xvci1wcm9maWxlIGNvbG9yLXJlbmRlcmluZyBkb21pbmFudC1iYXNlbGluZSBlbmFibGUtYmFja2dyb3VuZCBmaWxsLW9wYWNpdHkgZmlsbC1ydWxlIGZsb29kLWNvbG9yIGZsb29kLW9wYWNpdHkgZm9udC1mYW1pbHkgZm9udC1zaXplIGZvbnQtc2l6ZS1hZGp1c3QgZm9udC1zdHJldGNoIGZvbnQtc3R5bGUgZm9udC12YXJpYW50IGZvbnQtd2VpZ2h0IGdseXBoLW5hbWUgZ2x5cGgtb3JpZW50YXRpb24taG9yaXpvbnRhbCBnbHlwaC1vcmllbnRhdGlvbi12ZXJ0aWNhbCBob3Jpei1hZHYteCBob3Jpei1vcmlnaW4teCBpbWFnZS1yZW5kZXJpbmcgbGV0dGVyLXNwYWNpbmcgbGlnaHRpbmctY29sb3IgbWFya2VyLWVuZCBtYXJrZXItbWlkIG1hcmtlci1zdGFydCBvdmVybGluZS1wb3NpdGlvbiBvdmVybGluZS10aGlja25lc3MgcGFpbnQtb3JkZXIgcGFub3NlLTEgcG9pbnRlci1ldmVudHMgcmVuZGVyaW5nLWludGVudCBzaGFwZS1yZW5kZXJpbmcgc3RvcC1jb2xvciBzdG9wLW9wYWNpdHkgc3RyaWtldGhyb3VnaC1wb3NpdGlvbiBzdHJpa2V0aHJvdWdoLXRoaWNrbmVzcyBzdHJva2UtZGFzaGFycmF5IHN0cm9rZS1kYXNob2Zmc2V0IHN0cm9rZS1saW5lY2FwIHN0cm9rZS1saW5lam9pbiBzdHJva2UtbWl0ZXJsaW1pdCBzdHJva2Utb3BhY2l0eSBzdHJva2Utd2lkdGggdGV4dC1hbmNob3IgdGV4dC1kZWNvcmF0aW9uIHRleHQtcmVuZGVyaW5nIHVuZGVybGluZS1wb3NpdGlvbiB1bmRlcmxpbmUtdGhpY2tuZXNzIHVuaWNvZGUtYmlkaSB1bmljb2RlLXJhbmdlIHVuaXRzLXBlci1lbSB2LWFscGhhYmV0aWMgdi1oYW5naW5nIHYtaWRlb2dyYXBoaWMgdi1tYXRoZW1hdGljYWwgdmVjdG9yLWVmZmVjdCB2ZXJ0LWFkdi15IHZlcnQtb3JpZ2luLXggdmVydC1vcmlnaW4teSB3b3JkLXNwYWNpbmcgd3JpdGluZy1tb2RlIHhtbG5zOnhsaW5rIHgtaGVpZ2h0XCIuc3BsaXQoXCIgXCIpLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5yZXBsYWNlKHJhLFxuc2EpO3pbYl09bmV3IHYoYiwxLCExLGEsbnVsbCwhMSwhMSl9KTtcInhsaW5rOmFjdHVhdGUgeGxpbms6YXJjcm9sZSB4bGluazpyb2xlIHhsaW5rOnNob3cgeGxpbms6dGl0bGUgeGxpbms6dHlwZVwiLnNwbGl0KFwiIFwiKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBiPWEucmVwbGFjZShyYSxzYSk7eltiXT1uZXcgdihiLDEsITEsYSxcImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiwhMSwhMSl9KTtbXCJ4bWw6YmFzZVwiLFwieG1sOmxhbmdcIixcInhtbDpzcGFjZVwiXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBiPWEucmVwbGFjZShyYSxzYSk7eltiXT1uZXcgdihiLDEsITEsYSxcImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZVwiLCExLCExKX0pO1tcInRhYkluZGV4XCIsXCJjcm9zc09yaWdpblwiXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3pbYV09bmV3IHYoYSwxLCExLGEudG9Mb3dlckNhc2UoKSxudWxsLCExLCExKX0pO1xuei54bGlua0hyZWY9bmV3IHYoXCJ4bGlua0hyZWZcIiwxLCExLFwieGxpbms6aHJlZlwiLFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiLCEwLCExKTtbXCJzcmNcIixcImhyZWZcIixcImFjdGlvblwiLFwiZm9ybUFjdGlvblwiXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3pbYV09bmV3IHYoYSwxLCExLGEudG9Mb3dlckNhc2UoKSxudWxsLCEwLCEwKX0pO1xuZnVuY3Rpb24gdGEoYSxiLGMsZCl7dmFyIGU9ei5oYXNPd25Qcm9wZXJ0eShiKT96W2JdOm51bGw7aWYobnVsbCE9PWU/MCE9PWUudHlwZTpkfHwhKDI8Yi5sZW5ndGgpfHxcIm9cIiE9PWJbMF0mJlwiT1wiIT09YlswXXx8XCJuXCIhPT1iWzFdJiZcIk5cIiE9PWJbMV0pcWEoYixjLGUsZCkmJihjPW51bGwpLGR8fG51bGw9PT1lP29hKGIpJiYobnVsbD09PWM/YS5yZW1vdmVBdHRyaWJ1dGUoYik6YS5zZXRBdHRyaWJ1dGUoYixcIlwiK2MpKTplLm11c3RVc2VQcm9wZXJ0eT9hW2UucHJvcGVydHlOYW1lXT1udWxsPT09Yz8zPT09ZS50eXBlPyExOlwiXCI6YzooYj1lLmF0dHJpYnV0ZU5hbWUsZD1lLmF0dHJpYnV0ZU5hbWVzcGFjZSxudWxsPT09Yz9hLnJlbW92ZUF0dHJpYnV0ZShiKTooZT1lLnR5cGUsYz0zPT09ZXx8ND09PWUmJiEwPT09Yz9cIlwiOlwiXCIrYyxkP2Euc2V0QXR0cmlidXRlTlMoZCxiLGMpOmEuc2V0QXR0cmlidXRlKGIsYykpKX1cbnZhciB1YT1hYS5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRCx2YT1TeW1ib2wuZm9yKFwicmVhY3QuZWxlbWVudFwiKSx3YT1TeW1ib2wuZm9yKFwicmVhY3QucG9ydGFsXCIpLHlhPVN5bWJvbC5mb3IoXCJyZWFjdC5mcmFnbWVudFwiKSx6YT1TeW1ib2wuZm9yKFwicmVhY3Quc3RyaWN0X21vZGVcIiksQWE9U3ltYm9sLmZvcihcInJlYWN0LnByb2ZpbGVyXCIpLEJhPVN5bWJvbC5mb3IoXCJyZWFjdC5wcm92aWRlclwiKSxDYT1TeW1ib2wuZm9yKFwicmVhY3QuY29udGV4dFwiKSxEYT1TeW1ib2wuZm9yKFwicmVhY3QuZm9yd2FyZF9yZWZcIiksRWE9U3ltYm9sLmZvcihcInJlYWN0LnN1c3BlbnNlXCIpLEZhPVN5bWJvbC5mb3IoXCJyZWFjdC5zdXNwZW5zZV9saXN0XCIpLEdhPVN5bWJvbC5mb3IoXCJyZWFjdC5tZW1vXCIpLEhhPVN5bWJvbC5mb3IoXCJyZWFjdC5sYXp5XCIpO1N5bWJvbC5mb3IoXCJyZWFjdC5zY29wZVwiKTtTeW1ib2wuZm9yKFwicmVhY3QuZGVidWdfdHJhY2VfbW9kZVwiKTtcbnZhciBJYT1TeW1ib2wuZm9yKFwicmVhY3Qub2Zmc2NyZWVuXCIpO1N5bWJvbC5mb3IoXCJyZWFjdC5sZWdhY3lfaGlkZGVuXCIpO1N5bWJvbC5mb3IoXCJyZWFjdC5jYWNoZVwiKTtTeW1ib2wuZm9yKFwicmVhY3QudHJhY2luZ19tYXJrZXJcIik7dmFyIEphPVN5bWJvbC5pdGVyYXRvcjtmdW5jdGlvbiBLYShhKXtpZihudWxsPT09YXx8XCJvYmplY3RcIiE9PXR5cGVvZiBhKXJldHVybiBudWxsO2E9SmEmJmFbSmFdfHxhW1wiQEBpdGVyYXRvclwiXTtyZXR1cm5cImZ1bmN0aW9uXCI9PT10eXBlb2YgYT9hOm51bGx9dmFyIEE9T2JqZWN0LmFzc2lnbixMYTtmdW5jdGlvbiBNYShhKXtpZih2b2lkIDA9PT1MYSl0cnl7dGhyb3cgRXJyb3IoKTt9Y2F0Y2goYyl7dmFyIGI9Yy5zdGFjay50cmltKCkubWF0Y2goL1xcbiggKihhdCApPykvKTtMYT1iJiZiWzFdfHxcIlwifXJldHVyblwiXFxuXCIrTGErYX12YXIgTmE9ITE7XG5mdW5jdGlvbiBPYShhLGIpe2lmKCFhfHxOYSlyZXR1cm5cIlwiO05hPSEwO3ZhciBjPUVycm9yLnByZXBhcmVTdGFja1RyYWNlO0Vycm9yLnByZXBhcmVTdGFja1RyYWNlPXZvaWQgMDt0cnl7aWYoYilpZihiPWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoKTt9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShiLnByb3RvdHlwZSxcInByb3BzXCIse3NldDpmdW5jdGlvbigpe3Rocm93IEVycm9yKCk7fX0pLFwib2JqZWN0XCI9PT10eXBlb2YgUmVmbGVjdCYmUmVmbGVjdC5jb25zdHJ1Y3Qpe3RyeXtSZWZsZWN0LmNvbnN0cnVjdChiLFtdKX1jYXRjaChsKXt2YXIgZD1sfVJlZmxlY3QuY29uc3RydWN0KGEsW10sYil9ZWxzZXt0cnl7Yi5jYWxsKCl9Y2F0Y2gobCl7ZD1sfWEuY2FsbChiLnByb3RvdHlwZSl9ZWxzZXt0cnl7dGhyb3cgRXJyb3IoKTt9Y2F0Y2gobCl7ZD1sfWEoKX19Y2F0Y2gobCl7aWYobCYmZCYmXCJzdHJpbmdcIj09PXR5cGVvZiBsLnN0YWNrKXtmb3IodmFyIGU9bC5zdGFjay5zcGxpdChcIlxcblwiKSxcbmY9ZC5zdGFjay5zcGxpdChcIlxcblwiKSxnPWUubGVuZ3RoLTEsaD1mLmxlbmd0aC0xOzE8PWcmJjA8PWgmJmVbZ10hPT1mW2hdOyloLS07Zm9yKDsxPD1nJiYwPD1oO2ctLSxoLS0paWYoZVtnXSE9PWZbaF0pe2lmKDEhPT1nfHwxIT09aCl7ZG8gaWYoZy0tLGgtLSwwPmh8fGVbZ10hPT1mW2hdKXt2YXIgaz1cIlxcblwiK2VbZ10ucmVwbGFjZShcIiBhdCBuZXcgXCIsXCIgYXQgXCIpO2EuZGlzcGxheU5hbWUmJmsuaW5jbHVkZXMoXCI8YW5vbnltb3VzPlwiKSYmKGs9ay5yZXBsYWNlKFwiPGFub255bW91cz5cIixhLmRpc3BsYXlOYW1lKSk7cmV0dXJuIGt9d2hpbGUoMTw9ZyYmMDw9aCl9YnJlYWt9fX1maW5hbGx5e05hPSExLEVycm9yLnByZXBhcmVTdGFja1RyYWNlPWN9cmV0dXJuKGE9YT9hLmRpc3BsYXlOYW1lfHxhLm5hbWU6XCJcIik/TWEoYSk6XCJcIn1cbmZ1bmN0aW9uIFBhKGEpe3N3aXRjaChhLnRhZyl7Y2FzZSA1OnJldHVybiBNYShhLnR5cGUpO2Nhc2UgMTY6cmV0dXJuIE1hKFwiTGF6eVwiKTtjYXNlIDEzOnJldHVybiBNYShcIlN1c3BlbnNlXCIpO2Nhc2UgMTk6cmV0dXJuIE1hKFwiU3VzcGVuc2VMaXN0XCIpO2Nhc2UgMDpjYXNlIDI6Y2FzZSAxNTpyZXR1cm4gYT1PYShhLnR5cGUsITEpLGE7Y2FzZSAxMTpyZXR1cm4gYT1PYShhLnR5cGUucmVuZGVyLCExKSxhO2Nhc2UgMTpyZXR1cm4gYT1PYShhLnR5cGUsITApLGE7ZGVmYXVsdDpyZXR1cm5cIlwifX1cbmZ1bmN0aW9uIFFhKGEpe2lmKG51bGw9PWEpcmV0dXJuIG51bGw7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGEpcmV0dXJuIGEuZGlzcGxheU5hbWV8fGEubmFtZXx8bnVsbDtpZihcInN0cmluZ1wiPT09dHlwZW9mIGEpcmV0dXJuIGE7c3dpdGNoKGEpe2Nhc2UgeWE6cmV0dXJuXCJGcmFnbWVudFwiO2Nhc2Ugd2E6cmV0dXJuXCJQb3J0YWxcIjtjYXNlIEFhOnJldHVyblwiUHJvZmlsZXJcIjtjYXNlIHphOnJldHVyblwiU3RyaWN0TW9kZVwiO2Nhc2UgRWE6cmV0dXJuXCJTdXNwZW5zZVwiO2Nhc2UgRmE6cmV0dXJuXCJTdXNwZW5zZUxpc3RcIn1pZihcIm9iamVjdFwiPT09dHlwZW9mIGEpc3dpdGNoKGEuJCR0eXBlb2Ype2Nhc2UgQ2E6cmV0dXJuKGEuZGlzcGxheU5hbWV8fFwiQ29udGV4dFwiKStcIi5Db25zdW1lclwiO2Nhc2UgQmE6cmV0dXJuKGEuX2NvbnRleHQuZGlzcGxheU5hbWV8fFwiQ29udGV4dFwiKStcIi5Qcm92aWRlclwiO2Nhc2UgRGE6dmFyIGI9YS5yZW5kZXI7YT1hLmRpc3BsYXlOYW1lO2F8fChhPWIuZGlzcGxheU5hbWV8fFxuYi5uYW1lfHxcIlwiLGE9XCJcIiE9PWE/XCJGb3J3YXJkUmVmKFwiK2ErXCIpXCI6XCJGb3J3YXJkUmVmXCIpO3JldHVybiBhO2Nhc2UgR2E6cmV0dXJuIGI9YS5kaXNwbGF5TmFtZXx8bnVsbCxudWxsIT09Yj9iOlFhKGEudHlwZSl8fFwiTWVtb1wiO2Nhc2UgSGE6Yj1hLl9wYXlsb2FkO2E9YS5faW5pdDt0cnl7cmV0dXJuIFFhKGEoYikpfWNhdGNoKGMpe319cmV0dXJuIG51bGx9XG5mdW5jdGlvbiBSYShhKXt2YXIgYj1hLnR5cGU7c3dpdGNoKGEudGFnKXtjYXNlIDI0OnJldHVyblwiQ2FjaGVcIjtjYXNlIDk6cmV0dXJuKGIuZGlzcGxheU5hbWV8fFwiQ29udGV4dFwiKStcIi5Db25zdW1lclwiO2Nhc2UgMTA6cmV0dXJuKGIuX2NvbnRleHQuZGlzcGxheU5hbWV8fFwiQ29udGV4dFwiKStcIi5Qcm92aWRlclwiO2Nhc2UgMTg6cmV0dXJuXCJEZWh5ZHJhdGVkRnJhZ21lbnRcIjtjYXNlIDExOnJldHVybiBhPWIucmVuZGVyLGE9YS5kaXNwbGF5TmFtZXx8YS5uYW1lfHxcIlwiLGIuZGlzcGxheU5hbWV8fChcIlwiIT09YT9cIkZvcndhcmRSZWYoXCIrYStcIilcIjpcIkZvcndhcmRSZWZcIik7Y2FzZSA3OnJldHVyblwiRnJhZ21lbnRcIjtjYXNlIDU6cmV0dXJuIGI7Y2FzZSA0OnJldHVyblwiUG9ydGFsXCI7Y2FzZSAzOnJldHVyblwiUm9vdFwiO2Nhc2UgNjpyZXR1cm5cIlRleHRcIjtjYXNlIDE2OnJldHVybiBRYShiKTtjYXNlIDg6cmV0dXJuIGI9PT16YT9cIlN0cmljdE1vZGVcIjpcIk1vZGVcIjtjYXNlIDIyOnJldHVyblwiT2Zmc2NyZWVuXCI7XG5jYXNlIDEyOnJldHVyblwiUHJvZmlsZXJcIjtjYXNlIDIxOnJldHVyblwiU2NvcGVcIjtjYXNlIDEzOnJldHVyblwiU3VzcGVuc2VcIjtjYXNlIDE5OnJldHVyblwiU3VzcGVuc2VMaXN0XCI7Y2FzZSAyNTpyZXR1cm5cIlRyYWNpbmdNYXJrZXJcIjtjYXNlIDE6Y2FzZSAwOmNhc2UgMTc6Y2FzZSAyOmNhc2UgMTQ6Y2FzZSAxNTppZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgYilyZXR1cm4gYi5kaXNwbGF5TmFtZXx8Yi5uYW1lfHxudWxsO2lmKFwic3RyaW5nXCI9PT10eXBlb2YgYilyZXR1cm4gYn1yZXR1cm4gbnVsbH1mdW5jdGlvbiBTYShhKXtzd2l0Y2godHlwZW9mIGEpe2Nhc2UgXCJib29sZWFuXCI6Y2FzZSBcIm51bWJlclwiOmNhc2UgXCJzdHJpbmdcIjpjYXNlIFwidW5kZWZpbmVkXCI6cmV0dXJuIGE7Y2FzZSBcIm9iamVjdFwiOnJldHVybiBhO2RlZmF1bHQ6cmV0dXJuXCJcIn19XG5mdW5jdGlvbiBUYShhKXt2YXIgYj1hLnR5cGU7cmV0dXJuKGE9YS5ub2RlTmFtZSkmJlwiaW5wdXRcIj09PWEudG9Mb3dlckNhc2UoKSYmKFwiY2hlY2tib3hcIj09PWJ8fFwicmFkaW9cIj09PWIpfVxuZnVuY3Rpb24gVWEoYSl7dmFyIGI9VGEoYSk/XCJjaGVja2VkXCI6XCJ2YWx1ZVwiLGM9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihhLmNvbnN0cnVjdG9yLnByb3RvdHlwZSxiKSxkPVwiXCIrYVtiXTtpZighYS5oYXNPd25Qcm9wZXJ0eShiKSYmXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBjJiZcImZ1bmN0aW9uXCI9PT10eXBlb2YgYy5nZXQmJlwiZnVuY3Rpb25cIj09PXR5cGVvZiBjLnNldCl7dmFyIGU9Yy5nZXQsZj1jLnNldDtPYmplY3QuZGVmaW5lUHJvcGVydHkoYSxiLHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGUuY2FsbCh0aGlzKX0sc2V0OmZ1bmN0aW9uKGEpe2Q9XCJcIithO2YuY2FsbCh0aGlzLGEpfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLGIse2VudW1lcmFibGU6Yy5lbnVtZXJhYmxlfSk7cmV0dXJue2dldFZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIGR9LHNldFZhbHVlOmZ1bmN0aW9uKGEpe2Q9XCJcIithfSxzdG9wVHJhY2tpbmc6ZnVuY3Rpb24oKXthLl92YWx1ZVRyYWNrZXI9XG5udWxsO2RlbGV0ZSBhW2JdfX19fWZ1bmN0aW9uIFZhKGEpe2EuX3ZhbHVlVHJhY2tlcnx8KGEuX3ZhbHVlVHJhY2tlcj1VYShhKSl9ZnVuY3Rpb24gV2EoYSl7aWYoIWEpcmV0dXJuITE7dmFyIGI9YS5fdmFsdWVUcmFja2VyO2lmKCFiKXJldHVybiEwO3ZhciBjPWIuZ2V0VmFsdWUoKTt2YXIgZD1cIlwiO2EmJihkPVRhKGEpP2EuY2hlY2tlZD9cInRydWVcIjpcImZhbHNlXCI6YS52YWx1ZSk7YT1kO3JldHVybiBhIT09Yz8oYi5zZXRWYWx1ZShhKSwhMCk6ITF9ZnVuY3Rpb24gWGEoYSl7YT1hfHwoXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBkb2N1bWVudD9kb2N1bWVudDp2b2lkIDApO2lmKFwidW5kZWZpbmVkXCI9PT10eXBlb2YgYSlyZXR1cm4gbnVsbDt0cnl7cmV0dXJuIGEuYWN0aXZlRWxlbWVudHx8YS5ib2R5fWNhdGNoKGIpe3JldHVybiBhLmJvZHl9fVxuZnVuY3Rpb24gWWEoYSxiKXt2YXIgYz1iLmNoZWNrZWQ7cmV0dXJuIEEoe30sYix7ZGVmYXVsdENoZWNrZWQ6dm9pZCAwLGRlZmF1bHRWYWx1ZTp2b2lkIDAsdmFsdWU6dm9pZCAwLGNoZWNrZWQ6bnVsbCE9Yz9jOmEuX3dyYXBwZXJTdGF0ZS5pbml0aWFsQ2hlY2tlZH0pfWZ1bmN0aW9uIFphKGEsYil7dmFyIGM9bnVsbD09Yi5kZWZhdWx0VmFsdWU/XCJcIjpiLmRlZmF1bHRWYWx1ZSxkPW51bGwhPWIuY2hlY2tlZD9iLmNoZWNrZWQ6Yi5kZWZhdWx0Q2hlY2tlZDtjPVNhKG51bGwhPWIudmFsdWU/Yi52YWx1ZTpjKTthLl93cmFwcGVyU3RhdGU9e2luaXRpYWxDaGVja2VkOmQsaW5pdGlhbFZhbHVlOmMsY29udHJvbGxlZDpcImNoZWNrYm94XCI9PT1iLnR5cGV8fFwicmFkaW9cIj09PWIudHlwZT9udWxsIT1iLmNoZWNrZWQ6bnVsbCE9Yi52YWx1ZX19ZnVuY3Rpb24gYWIoYSxiKXtiPWIuY2hlY2tlZDtudWxsIT1iJiZ0YShhLFwiY2hlY2tlZFwiLGIsITEpfVxuZnVuY3Rpb24gYmIoYSxiKXthYihhLGIpO3ZhciBjPVNhKGIudmFsdWUpLGQ9Yi50eXBlO2lmKG51bGwhPWMpaWYoXCJudW1iZXJcIj09PWQpe2lmKDA9PT1jJiZcIlwiPT09YS52YWx1ZXx8YS52YWx1ZSE9YylhLnZhbHVlPVwiXCIrY31lbHNlIGEudmFsdWUhPT1cIlwiK2MmJihhLnZhbHVlPVwiXCIrYyk7ZWxzZSBpZihcInN1Ym1pdFwiPT09ZHx8XCJyZXNldFwiPT09ZCl7YS5yZW1vdmVBdHRyaWJ1dGUoXCJ2YWx1ZVwiKTtyZXR1cm59Yi5oYXNPd25Qcm9wZXJ0eShcInZhbHVlXCIpP2NiKGEsYi50eXBlLGMpOmIuaGFzT3duUHJvcGVydHkoXCJkZWZhdWx0VmFsdWVcIikmJmNiKGEsYi50eXBlLFNhKGIuZGVmYXVsdFZhbHVlKSk7bnVsbD09Yi5jaGVja2VkJiZudWxsIT1iLmRlZmF1bHRDaGVja2VkJiYoYS5kZWZhdWx0Q2hlY2tlZD0hIWIuZGVmYXVsdENoZWNrZWQpfVxuZnVuY3Rpb24gZGIoYSxiLGMpe2lmKGIuaGFzT3duUHJvcGVydHkoXCJ2YWx1ZVwiKXx8Yi5oYXNPd25Qcm9wZXJ0eShcImRlZmF1bHRWYWx1ZVwiKSl7dmFyIGQ9Yi50eXBlO2lmKCEoXCJzdWJtaXRcIiE9PWQmJlwicmVzZXRcIiE9PWR8fHZvaWQgMCE9PWIudmFsdWUmJm51bGwhPT1iLnZhbHVlKSlyZXR1cm47Yj1cIlwiK2EuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWU7Y3x8Yj09PWEudmFsdWV8fChhLnZhbHVlPWIpO2EuZGVmYXVsdFZhbHVlPWJ9Yz1hLm5hbWU7XCJcIiE9PWMmJihhLm5hbWU9XCJcIik7YS5kZWZhdWx0Q2hlY2tlZD0hIWEuX3dyYXBwZXJTdGF0ZS5pbml0aWFsQ2hlY2tlZDtcIlwiIT09YyYmKGEubmFtZT1jKX1cbmZ1bmN0aW9uIGNiKGEsYixjKXtpZihcIm51bWJlclwiIT09Ynx8WGEoYS5vd25lckRvY3VtZW50KSE9PWEpbnVsbD09Yz9hLmRlZmF1bHRWYWx1ZT1cIlwiK2EuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWU6YS5kZWZhdWx0VmFsdWUhPT1cIlwiK2MmJihhLmRlZmF1bHRWYWx1ZT1cIlwiK2MpfXZhciBlYj1BcnJheS5pc0FycmF5O1xuZnVuY3Rpb24gZmIoYSxiLGMsZCl7YT1hLm9wdGlvbnM7aWYoYil7Yj17fTtmb3IodmFyIGU9MDtlPGMubGVuZ3RoO2UrKyliW1wiJFwiK2NbZV1dPSEwO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspZT1iLmhhc093blByb3BlcnR5KFwiJFwiK2FbY10udmFsdWUpLGFbY10uc2VsZWN0ZWQhPT1lJiYoYVtjXS5zZWxlY3RlZD1lKSxlJiZkJiYoYVtjXS5kZWZhdWx0U2VsZWN0ZWQ9ITApfWVsc2V7Yz1cIlwiK1NhKGMpO2I9bnVsbDtmb3IoZT0wO2U8YS5sZW5ndGg7ZSsrKXtpZihhW2VdLnZhbHVlPT09Yyl7YVtlXS5zZWxlY3RlZD0hMDtkJiYoYVtlXS5kZWZhdWx0U2VsZWN0ZWQ9ITApO3JldHVybn1udWxsIT09Ynx8YVtlXS5kaXNhYmxlZHx8KGI9YVtlXSl9bnVsbCE9PWImJihiLnNlbGVjdGVkPSEwKX19XG5mdW5jdGlvbiBnYihhLGIpe2lmKG51bGwhPWIuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwpdGhyb3cgRXJyb3IocCg5MSkpO3JldHVybiBBKHt9LGIse3ZhbHVlOnZvaWQgMCxkZWZhdWx0VmFsdWU6dm9pZCAwLGNoaWxkcmVuOlwiXCIrYS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZX0pfWZ1bmN0aW9uIGhiKGEsYil7dmFyIGM9Yi52YWx1ZTtpZihudWxsPT1jKXtjPWIuY2hpbGRyZW47Yj1iLmRlZmF1bHRWYWx1ZTtpZihudWxsIT1jKXtpZihudWxsIT1iKXRocm93IEVycm9yKHAoOTIpKTtpZihlYihjKSl7aWYoMTxjLmxlbmd0aCl0aHJvdyBFcnJvcihwKDkzKSk7Yz1jWzBdfWI9Y31udWxsPT1iJiYoYj1cIlwiKTtjPWJ9YS5fd3JhcHBlclN0YXRlPXtpbml0aWFsVmFsdWU6U2EoYyl9fVxuZnVuY3Rpb24gaWIoYSxiKXt2YXIgYz1TYShiLnZhbHVlKSxkPVNhKGIuZGVmYXVsdFZhbHVlKTtudWxsIT1jJiYoYz1cIlwiK2MsYyE9PWEudmFsdWUmJihhLnZhbHVlPWMpLG51bGw9PWIuZGVmYXVsdFZhbHVlJiZhLmRlZmF1bHRWYWx1ZSE9PWMmJihhLmRlZmF1bHRWYWx1ZT1jKSk7bnVsbCE9ZCYmKGEuZGVmYXVsdFZhbHVlPVwiXCIrZCl9ZnVuY3Rpb24gamIoYSl7dmFyIGI9YS50ZXh0Q29udGVudDtiPT09YS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZSYmXCJcIiE9PWImJm51bGwhPT1iJiYoYS52YWx1ZT1iKX1mdW5jdGlvbiBrYihhKXtzd2l0Y2goYSl7Y2FzZSBcInN2Z1wiOnJldHVyblwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIjtjYXNlIFwibWF0aFwiOnJldHVyblwiaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTFwiO2RlZmF1bHQ6cmV0dXJuXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCJ9fVxuZnVuY3Rpb24gbGIoYSxiKXtyZXR1cm4gbnVsbD09YXx8XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCI9PT1hP2tiKGIpOlwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj09PWEmJlwiZm9yZWlnbk9iamVjdFwiPT09Yj9cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWxcIjphfVxudmFyIG1iLG5iPWZ1bmN0aW9uKGEpe3JldHVyblwidW5kZWZpbmVkXCIhPT10eXBlb2YgTVNBcHAmJk1TQXBwLmV4ZWNVbnNhZmVMb2NhbEZ1bmN0aW9uP2Z1bmN0aW9uKGIsYyxkLGUpe01TQXBwLmV4ZWNVbnNhZmVMb2NhbEZ1bmN0aW9uKGZ1bmN0aW9uKCl7cmV0dXJuIGEoYixjLGQsZSl9KX06YX0oZnVuY3Rpb24oYSxiKXtpZihcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIhPT1hLm5hbWVzcGFjZVVSSXx8XCJpbm5lckhUTUxcImluIGEpYS5pbm5lckhUTUw9YjtlbHNle21iPW1ifHxkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO21iLmlubmVySFRNTD1cIjxzdmc+XCIrYi52YWx1ZU9mKCkudG9TdHJpbmcoKStcIjwvc3ZnPlwiO2ZvcihiPW1iLmZpcnN0Q2hpbGQ7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWEuYXBwZW5kQ2hpbGQoYi5maXJzdENoaWxkKX19KTtcbmZ1bmN0aW9uIG9iKGEsYil7aWYoYil7dmFyIGM9YS5maXJzdENoaWxkO2lmKGMmJmM9PT1hLmxhc3RDaGlsZCYmMz09PWMubm9kZVR5cGUpe2Mubm9kZVZhbHVlPWI7cmV0dXJufX1hLnRleHRDb250ZW50PWJ9XG52YXIgcGI9e2FuaW1hdGlvbkl0ZXJhdGlvbkNvdW50OiEwLGFzcGVjdFJhdGlvOiEwLGJvcmRlckltYWdlT3V0c2V0OiEwLGJvcmRlckltYWdlU2xpY2U6ITAsYm9yZGVySW1hZ2VXaWR0aDohMCxib3hGbGV4OiEwLGJveEZsZXhHcm91cDohMCxib3hPcmRpbmFsR3JvdXA6ITAsY29sdW1uQ291bnQ6ITAsY29sdW1uczohMCxmbGV4OiEwLGZsZXhHcm93OiEwLGZsZXhQb3NpdGl2ZTohMCxmbGV4U2hyaW5rOiEwLGZsZXhOZWdhdGl2ZTohMCxmbGV4T3JkZXI6ITAsZ3JpZEFyZWE6ITAsZ3JpZFJvdzohMCxncmlkUm93RW5kOiEwLGdyaWRSb3dTcGFuOiEwLGdyaWRSb3dTdGFydDohMCxncmlkQ29sdW1uOiEwLGdyaWRDb2x1bW5FbmQ6ITAsZ3JpZENvbHVtblNwYW46ITAsZ3JpZENvbHVtblN0YXJ0OiEwLGZvbnRXZWlnaHQ6ITAsbGluZUNsYW1wOiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcmRlcjohMCxvcnBoYW5zOiEwLHRhYlNpemU6ITAsd2lkb3dzOiEwLHpJbmRleDohMCxcbnpvb206ITAsZmlsbE9wYWNpdHk6ITAsZmxvb2RPcGFjaXR5OiEwLHN0b3BPcGFjaXR5OiEwLHN0cm9rZURhc2hhcnJheTohMCxzdHJva2VEYXNob2Zmc2V0OiEwLHN0cm9rZU1pdGVybGltaXQ6ITAsc3Ryb2tlT3BhY2l0eTohMCxzdHJva2VXaWR0aDohMH0scWI9W1wiV2Via2l0XCIsXCJtc1wiLFwiTW96XCIsXCJPXCJdO09iamVjdC5rZXlzKHBiKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3FiLmZvckVhY2goZnVuY3Rpb24oYil7Yj1iK2EuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYS5zdWJzdHJpbmcoMSk7cGJbYl09cGJbYV19KX0pO2Z1bmN0aW9uIHJiKGEsYixjKXtyZXR1cm4gbnVsbD09Ynx8XCJib29sZWFuXCI9PT10eXBlb2YgYnx8XCJcIj09PWI/XCJcIjpjfHxcIm51bWJlclwiIT09dHlwZW9mIGJ8fDA9PT1ifHxwYi5oYXNPd25Qcm9wZXJ0eShhKSYmcGJbYV0/KFwiXCIrYikudHJpbSgpOmIrXCJweFwifVxuZnVuY3Rpb24gc2IoYSxiKXthPWEuc3R5bGU7Zm9yKHZhciBjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7dmFyIGQ9MD09PWMuaW5kZXhPZihcIi0tXCIpLGU9cmIoYyxiW2NdLGQpO1wiZmxvYXRcIj09PWMmJihjPVwiY3NzRmxvYXRcIik7ZD9hLnNldFByb3BlcnR5KGMsZSk6YVtjXT1lfX12YXIgdGI9QSh7bWVudWl0ZW06ITB9LHthcmVhOiEwLGJhc2U6ITAsYnI6ITAsY29sOiEwLGVtYmVkOiEwLGhyOiEwLGltZzohMCxpbnB1dDohMCxrZXlnZW46ITAsbGluazohMCxtZXRhOiEwLHBhcmFtOiEwLHNvdXJjZTohMCx0cmFjazohMCx3YnI6ITB9KTtcbmZ1bmN0aW9uIHViKGEsYil7aWYoYil7aWYodGJbYV0mJihudWxsIT1iLmNoaWxkcmVufHxudWxsIT1iLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MKSl0aHJvdyBFcnJvcihwKDEzNyxhKSk7aWYobnVsbCE9Yi5kYW5nZXJvdXNseVNldElubmVySFRNTCl7aWYobnVsbCE9Yi5jaGlsZHJlbil0aHJvdyBFcnJvcihwKDYwKSk7aWYoXCJvYmplY3RcIiE9PXR5cGVvZiBiLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MfHwhKFwiX19odG1sXCJpbiBiLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MKSl0aHJvdyBFcnJvcihwKDYxKSk7fWlmKG51bGwhPWIuc3R5bGUmJlwib2JqZWN0XCIhPT10eXBlb2YgYi5zdHlsZSl0aHJvdyBFcnJvcihwKDYyKSk7fX1cbmZ1bmN0aW9uIHZiKGEsYil7aWYoLTE9PT1hLmluZGV4T2YoXCItXCIpKXJldHVyblwic3RyaW5nXCI9PT10eXBlb2YgYi5pcztzd2l0Y2goYSl7Y2FzZSBcImFubm90YXRpb24teG1sXCI6Y2FzZSBcImNvbG9yLXByb2ZpbGVcIjpjYXNlIFwiZm9udC1mYWNlXCI6Y2FzZSBcImZvbnQtZmFjZS1zcmNcIjpjYXNlIFwiZm9udC1mYWNlLXVyaVwiOmNhc2UgXCJmb250LWZhY2UtZm9ybWF0XCI6Y2FzZSBcImZvbnQtZmFjZS1uYW1lXCI6Y2FzZSBcIm1pc3NpbmctZ2x5cGhcIjpyZXR1cm4hMTtkZWZhdWx0OnJldHVybiEwfX12YXIgd2I9bnVsbDtmdW5jdGlvbiB4YihhKXthPWEudGFyZ2V0fHxhLnNyY0VsZW1lbnR8fHdpbmRvdzthLmNvcnJlc3BvbmRpbmdVc2VFbGVtZW50JiYoYT1hLmNvcnJlc3BvbmRpbmdVc2VFbGVtZW50KTtyZXR1cm4gMz09PWEubm9kZVR5cGU/YS5wYXJlbnROb2RlOmF9dmFyIHliPW51bGwsemI9bnVsbCxBYj1udWxsO1xuZnVuY3Rpb24gQmIoYSl7aWYoYT1DYihhKSl7aWYoXCJmdW5jdGlvblwiIT09dHlwZW9mIHliKXRocm93IEVycm9yKHAoMjgwKSk7dmFyIGI9YS5zdGF0ZU5vZGU7YiYmKGI9RGIoYikseWIoYS5zdGF0ZU5vZGUsYS50eXBlLGIpKX19ZnVuY3Rpb24gRWIoYSl7emI/QWI/QWIucHVzaChhKTpBYj1bYV06emI9YX1mdW5jdGlvbiBGYigpe2lmKHpiKXt2YXIgYT16YixiPUFiO0FiPXpiPW51bGw7QmIoYSk7aWYoYilmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKUJiKGJbYV0pfX1mdW5jdGlvbiBHYihhLGIpe3JldHVybiBhKGIpfWZ1bmN0aW9uIEhiKCl7fXZhciBJYj0hMTtmdW5jdGlvbiBKYihhLGIsYyl7aWYoSWIpcmV0dXJuIGEoYixjKTtJYj0hMDt0cnl7cmV0dXJuIEdiKGEsYixjKX1maW5hbGx5e2lmKEliPSExLG51bGwhPT16Ynx8bnVsbCE9PUFiKUhiKCksRmIoKX19XG5mdW5jdGlvbiBLYihhLGIpe3ZhciBjPWEuc3RhdGVOb2RlO2lmKG51bGw9PT1jKXJldHVybiBudWxsO3ZhciBkPURiKGMpO2lmKG51bGw9PT1kKXJldHVybiBudWxsO2M9ZFtiXTthOnN3aXRjaChiKXtjYXNlIFwib25DbGlja1wiOmNhc2UgXCJvbkNsaWNrQ2FwdHVyZVwiOmNhc2UgXCJvbkRvdWJsZUNsaWNrXCI6Y2FzZSBcIm9uRG91YmxlQ2xpY2tDYXB0dXJlXCI6Y2FzZSBcIm9uTW91c2VEb3duXCI6Y2FzZSBcIm9uTW91c2VEb3duQ2FwdHVyZVwiOmNhc2UgXCJvbk1vdXNlTW92ZVwiOmNhc2UgXCJvbk1vdXNlTW92ZUNhcHR1cmVcIjpjYXNlIFwib25Nb3VzZVVwXCI6Y2FzZSBcIm9uTW91c2VVcENhcHR1cmVcIjpjYXNlIFwib25Nb3VzZUVudGVyXCI6KGQ9IWQuZGlzYWJsZWQpfHwoYT1hLnR5cGUsZD0hKFwiYnV0dG9uXCI9PT1hfHxcImlucHV0XCI9PT1hfHxcInNlbGVjdFwiPT09YXx8XCJ0ZXh0YXJlYVwiPT09YSkpO2E9IWQ7YnJlYWsgYTtkZWZhdWx0OmE9ITF9aWYoYSlyZXR1cm4gbnVsbDtpZihjJiZcImZ1bmN0aW9uXCIhPT1cbnR5cGVvZiBjKXRocm93IEVycm9yKHAoMjMxLGIsdHlwZW9mIGMpKTtyZXR1cm4gY312YXIgTGI9ITE7aWYoaWEpdHJ5e3ZhciBNYj17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoTWIsXCJwYXNzaXZlXCIse2dldDpmdW5jdGlvbigpe0xiPSEwfX0pO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwidGVzdFwiLE1iLE1iKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRlc3RcIixNYixNYil9Y2F0Y2goYSl7TGI9ITF9ZnVuY3Rpb24gTmIoYSxiLGMsZCxlLGYsZyxoLGspe3ZhciBsPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywzKTt0cnl7Yi5hcHBseShjLGwpfWNhdGNoKG0pe3RoaXMub25FcnJvcihtKX19dmFyIE9iPSExLFBiPW51bGwsUWI9ITEsUmI9bnVsbCxTYj17b25FcnJvcjpmdW5jdGlvbihhKXtPYj0hMDtQYj1hfX07ZnVuY3Rpb24gVGIoYSxiLGMsZCxlLGYsZyxoLGspe09iPSExO1BiPW51bGw7TmIuYXBwbHkoU2IsYXJndW1lbnRzKX1cbmZ1bmN0aW9uIFViKGEsYixjLGQsZSxmLGcsaCxrKXtUYi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7aWYoT2Ipe2lmKE9iKXt2YXIgbD1QYjtPYj0hMTtQYj1udWxsfWVsc2UgdGhyb3cgRXJyb3IocCgxOTgpKTtRYnx8KFFiPSEwLFJiPWwpfX1mdW5jdGlvbiBWYihhKXt2YXIgYj1hLGM9YTtpZihhLmFsdGVybmF0ZSlmb3IoO2IucmV0dXJuOyliPWIucmV0dXJuO2Vsc2V7YT1iO2RvIGI9YSwwIT09KGIuZmxhZ3MmNDA5OCkmJihjPWIucmV0dXJuKSxhPWIucmV0dXJuO3doaWxlKGEpfXJldHVybiAzPT09Yi50YWc/YzpudWxsfWZ1bmN0aW9uIFdiKGEpe2lmKDEzPT09YS50YWcpe3ZhciBiPWEubWVtb2l6ZWRTdGF0ZTtudWxsPT09YiYmKGE9YS5hbHRlcm5hdGUsbnVsbCE9PWEmJihiPWEubWVtb2l6ZWRTdGF0ZSkpO2lmKG51bGwhPT1iKXJldHVybiBiLmRlaHlkcmF0ZWR9cmV0dXJuIG51bGx9ZnVuY3Rpb24gWGIoYSl7aWYoVmIoYSkhPT1hKXRocm93IEVycm9yKHAoMTg4KSk7fVxuZnVuY3Rpb24gWWIoYSl7dmFyIGI9YS5hbHRlcm5hdGU7aWYoIWIpe2I9VmIoYSk7aWYobnVsbD09PWIpdGhyb3cgRXJyb3IocCgxODgpKTtyZXR1cm4gYiE9PWE/bnVsbDphfWZvcih2YXIgYz1hLGQ9Yjs7KXt2YXIgZT1jLnJldHVybjtpZihudWxsPT09ZSlicmVhazt2YXIgZj1lLmFsdGVybmF0ZTtpZihudWxsPT09Zil7ZD1lLnJldHVybjtpZihudWxsIT09ZCl7Yz1kO2NvbnRpbnVlfWJyZWFrfWlmKGUuY2hpbGQ9PT1mLmNoaWxkKXtmb3IoZj1lLmNoaWxkO2Y7KXtpZihmPT09YylyZXR1cm4gWGIoZSksYTtpZihmPT09ZClyZXR1cm4gWGIoZSksYjtmPWYuc2libGluZ310aHJvdyBFcnJvcihwKDE4OCkpO31pZihjLnJldHVybiE9PWQucmV0dXJuKWM9ZSxkPWY7ZWxzZXtmb3IodmFyIGc9ITEsaD1lLmNoaWxkO2g7KXtpZihoPT09Yyl7Zz0hMDtjPWU7ZD1mO2JyZWFrfWlmKGg9PT1kKXtnPSEwO2Q9ZTtjPWY7YnJlYWt9aD1oLnNpYmxpbmd9aWYoIWcpe2ZvcihoPWYuY2hpbGQ7aDspe2lmKGg9PT1cbmMpe2c9ITA7Yz1mO2Q9ZTticmVha31pZihoPT09ZCl7Zz0hMDtkPWY7Yz1lO2JyZWFrfWg9aC5zaWJsaW5nfWlmKCFnKXRocm93IEVycm9yKHAoMTg5KSk7fX1pZihjLmFsdGVybmF0ZSE9PWQpdGhyb3cgRXJyb3IocCgxOTApKTt9aWYoMyE9PWMudGFnKXRocm93IEVycm9yKHAoMTg4KSk7cmV0dXJuIGMuc3RhdGVOb2RlLmN1cnJlbnQ9PT1jP2E6Yn1mdW5jdGlvbiBaYihhKXthPVliKGEpO3JldHVybiBudWxsIT09YT8kYihhKTpudWxsfWZ1bmN0aW9uICRiKGEpe2lmKDU9PT1hLnRhZ3x8Nj09PWEudGFnKXJldHVybiBhO2ZvcihhPWEuY2hpbGQ7bnVsbCE9PWE7KXt2YXIgYj0kYihhKTtpZihudWxsIT09YilyZXR1cm4gYjthPWEuc2libGluZ31yZXR1cm4gbnVsbH1cbnZhciBhYz1jYS51bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrLGJjPWNhLnVuc3RhYmxlX2NhbmNlbENhbGxiYWNrLGNjPWNhLnVuc3RhYmxlX3Nob3VsZFlpZWxkLGRjPWNhLnVuc3RhYmxlX3JlcXVlc3RQYWludCxCPWNhLnVuc3RhYmxlX25vdyxlYz1jYS51bnN0YWJsZV9nZXRDdXJyZW50UHJpb3JpdHlMZXZlbCxmYz1jYS51bnN0YWJsZV9JbW1lZGlhdGVQcmlvcml0eSxnYz1jYS51bnN0YWJsZV9Vc2VyQmxvY2tpbmdQcmlvcml0eSxoYz1jYS51bnN0YWJsZV9Ob3JtYWxQcmlvcml0eSxpYz1jYS51bnN0YWJsZV9Mb3dQcmlvcml0eSxqYz1jYS51bnN0YWJsZV9JZGxlUHJpb3JpdHksa2M9bnVsbCxsYz1udWxsO2Z1bmN0aW9uIG1jKGEpe2lmKGxjJiZcImZ1bmN0aW9uXCI9PT10eXBlb2YgbGMub25Db21taXRGaWJlclJvb3QpdHJ5e2xjLm9uQ29tbWl0RmliZXJSb290KGtjLGEsdm9pZCAwLDEyOD09PShhLmN1cnJlbnQuZmxhZ3MmMTI4KSl9Y2F0Y2goYil7fX1cbnZhciBvYz1NYXRoLmNsejMyP01hdGguY2x6MzI6bmMscGM9TWF0aC5sb2cscWM9TWF0aC5MTjI7ZnVuY3Rpb24gbmMoYSl7YT4+Pj0wO3JldHVybiAwPT09YT8zMjozMS0ocGMoYSkvcWN8MCl8MH12YXIgcmM9NjQsc2M9NDE5NDMwNDtcbmZ1bmN0aW9uIHRjKGEpe3N3aXRjaChhJi1hKXtjYXNlIDE6cmV0dXJuIDE7Y2FzZSAyOnJldHVybiAyO2Nhc2UgNDpyZXR1cm4gNDtjYXNlIDg6cmV0dXJuIDg7Y2FzZSAxNjpyZXR1cm4gMTY7Y2FzZSAzMjpyZXR1cm4gMzI7Y2FzZSA2NDpjYXNlIDEyODpjYXNlIDI1NjpjYXNlIDUxMjpjYXNlIDEwMjQ6Y2FzZSAyMDQ4OmNhc2UgNDA5NjpjYXNlIDgxOTI6Y2FzZSAxNjM4NDpjYXNlIDMyNzY4OmNhc2UgNjU1MzY6Y2FzZSAxMzEwNzI6Y2FzZSAyNjIxNDQ6Y2FzZSA1MjQyODg6Y2FzZSAxMDQ4NTc2OmNhc2UgMjA5NzE1MjpyZXR1cm4gYSY0MTk0MjQwO2Nhc2UgNDE5NDMwNDpjYXNlIDgzODg2MDg6Y2FzZSAxNjc3NzIxNjpjYXNlIDMzNTU0NDMyOmNhc2UgNjcxMDg4NjQ6cmV0dXJuIGEmMTMwMDIzNDI0O2Nhc2UgMTM0MjE3NzI4OnJldHVybiAxMzQyMTc3Mjg7Y2FzZSAyNjg0MzU0NTY6cmV0dXJuIDI2ODQzNTQ1NjtjYXNlIDUzNjg3MDkxMjpyZXR1cm4gNTM2ODcwOTEyO2Nhc2UgMTA3Mzc0MTgyNDpyZXR1cm4gMTA3Mzc0MTgyNDtcbmRlZmF1bHQ6cmV0dXJuIGF9fWZ1bmN0aW9uIHVjKGEsYil7dmFyIGM9YS5wZW5kaW5nTGFuZXM7aWYoMD09PWMpcmV0dXJuIDA7dmFyIGQ9MCxlPWEuc3VzcGVuZGVkTGFuZXMsZj1hLnBpbmdlZExhbmVzLGc9YyYyNjg0MzU0NTU7aWYoMCE9PWcpe3ZhciBoPWcmfmU7MCE9PWg/ZD10YyhoKTooZiY9ZywwIT09ZiYmKGQ9dGMoZikpKX1lbHNlIGc9YyZ+ZSwwIT09Zz9kPXRjKGcpOjAhPT1mJiYoZD10YyhmKSk7aWYoMD09PWQpcmV0dXJuIDA7aWYoMCE9PWImJmIhPT1kJiYwPT09KGImZSkmJihlPWQmLWQsZj1iJi1iLGU+PWZ8fDE2PT09ZSYmMCE9PShmJjQxOTQyNDApKSlyZXR1cm4gYjswIT09KGQmNCkmJihkfD1jJjE2KTtiPWEuZW50YW5nbGVkTGFuZXM7aWYoMCE9PWIpZm9yKGE9YS5lbnRhbmdsZW1lbnRzLGImPWQ7MDxiOyljPTMxLW9jKGIpLGU9MTw8YyxkfD1hW2NdLGImPX5lO3JldHVybiBkfVxuZnVuY3Rpb24gdmMoYSxiKXtzd2l0Y2goYSl7Y2FzZSAxOmNhc2UgMjpjYXNlIDQ6cmV0dXJuIGIrMjUwO2Nhc2UgODpjYXNlIDE2OmNhc2UgMzI6Y2FzZSA2NDpjYXNlIDEyODpjYXNlIDI1NjpjYXNlIDUxMjpjYXNlIDEwMjQ6Y2FzZSAyMDQ4OmNhc2UgNDA5NjpjYXNlIDgxOTI6Y2FzZSAxNjM4NDpjYXNlIDMyNzY4OmNhc2UgNjU1MzY6Y2FzZSAxMzEwNzI6Y2FzZSAyNjIxNDQ6Y2FzZSA1MjQyODg6Y2FzZSAxMDQ4NTc2OmNhc2UgMjA5NzE1MjpyZXR1cm4gYis1RTM7Y2FzZSA0MTk0MzA0OmNhc2UgODM4ODYwODpjYXNlIDE2Nzc3MjE2OmNhc2UgMzM1NTQ0MzI6Y2FzZSA2NzEwODg2NDpyZXR1cm4tMTtjYXNlIDEzNDIxNzcyODpjYXNlIDI2ODQzNTQ1NjpjYXNlIDUzNjg3MDkxMjpjYXNlIDEwNzM3NDE4MjQ6cmV0dXJuLTE7ZGVmYXVsdDpyZXR1cm4tMX19XG5mdW5jdGlvbiB3YyhhLGIpe2Zvcih2YXIgYz1hLnN1c3BlbmRlZExhbmVzLGQ9YS5waW5nZWRMYW5lcyxlPWEuZXhwaXJhdGlvblRpbWVzLGY9YS5wZW5kaW5nTGFuZXM7MDxmOyl7dmFyIGc9MzEtb2MoZiksaD0xPDxnLGs9ZVtnXTtpZigtMT09PWspe2lmKDA9PT0oaCZjKXx8MCE9PShoJmQpKWVbZ109dmMoaCxiKX1lbHNlIGs8PWImJihhLmV4cGlyZWRMYW5lc3w9aCk7ZiY9fmh9fWZ1bmN0aW9uIHhjKGEpe2E9YS5wZW5kaW5nTGFuZXMmLTEwNzM3NDE4MjU7cmV0dXJuIDAhPT1hP2E6YSYxMDczNzQxODI0PzEwNzM3NDE4MjQ6MH1mdW5jdGlvbiB5Yygpe3ZhciBhPXJjO3JjPDw9MTswPT09KHJjJjQxOTQyNDApJiYocmM9NjQpO3JldHVybiBhfWZ1bmN0aW9uIHpjKGEpe2Zvcih2YXIgYj1bXSxjPTA7MzE+YztjKyspYi5wdXNoKGEpO3JldHVybiBifVxuZnVuY3Rpb24gQWMoYSxiLGMpe2EucGVuZGluZ0xhbmVzfD1iOzUzNjg3MDkxMiE9PWImJihhLnN1c3BlbmRlZExhbmVzPTAsYS5waW5nZWRMYW5lcz0wKTthPWEuZXZlbnRUaW1lcztiPTMxLW9jKGIpO2FbYl09Y31mdW5jdGlvbiBCYyhhLGIpe3ZhciBjPWEucGVuZGluZ0xhbmVzJn5iO2EucGVuZGluZ0xhbmVzPWI7YS5zdXNwZW5kZWRMYW5lcz0wO2EucGluZ2VkTGFuZXM9MDthLmV4cGlyZWRMYW5lcyY9YjthLm11dGFibGVSZWFkTGFuZXMmPWI7YS5lbnRhbmdsZWRMYW5lcyY9YjtiPWEuZW50YW5nbGVtZW50czt2YXIgZD1hLmV2ZW50VGltZXM7Zm9yKGE9YS5leHBpcmF0aW9uVGltZXM7MDxjOyl7dmFyIGU9MzEtb2MoYyksZj0xPDxlO2JbZV09MDtkW2VdPS0xO2FbZV09LTE7YyY9fmZ9fVxuZnVuY3Rpb24gQ2MoYSxiKXt2YXIgYz1hLmVudGFuZ2xlZExhbmVzfD1iO2ZvcihhPWEuZW50YW5nbGVtZW50cztjOyl7dmFyIGQ9MzEtb2MoYyksZT0xPDxkO2UmYnxhW2RdJmImJihhW2RdfD1iKTtjJj1+ZX19dmFyIEM9MDtmdW5jdGlvbiBEYyhhKXthJj0tYTtyZXR1cm4gMTxhPzQ8YT8wIT09KGEmMjY4NDM1NDU1KT8xNjo1MzY4NzA5MTI6NDoxfXZhciBFYyxGYyxHYyxIYyxJYyxKYz0hMSxLYz1bXSxMYz1udWxsLE1jPW51bGwsTmM9bnVsbCxPYz1uZXcgTWFwLFBjPW5ldyBNYXAsUWM9W10sUmM9XCJtb3VzZWRvd24gbW91c2V1cCB0b3VjaGNhbmNlbCB0b3VjaGVuZCB0b3VjaHN0YXJ0IGF1eGNsaWNrIGRibGNsaWNrIHBvaW50ZXJjYW5jZWwgcG9pbnRlcmRvd24gcG9pbnRlcnVwIGRyYWdlbmQgZHJhZ3N0YXJ0IGRyb3AgY29tcG9zaXRpb25lbmQgY29tcG9zaXRpb25zdGFydCBrZXlkb3duIGtleXByZXNzIGtleXVwIGlucHV0IHRleHRJbnB1dCBjb3B5IGN1dCBwYXN0ZSBjbGljayBjaGFuZ2UgY29udGV4dG1lbnUgcmVzZXQgc3VibWl0XCIuc3BsaXQoXCIgXCIpO1xuZnVuY3Rpb24gU2MoYSxiKXtzd2l0Y2goYSl7Y2FzZSBcImZvY3VzaW5cIjpjYXNlIFwiZm9jdXNvdXRcIjpMYz1udWxsO2JyZWFrO2Nhc2UgXCJkcmFnZW50ZXJcIjpjYXNlIFwiZHJhZ2xlYXZlXCI6TWM9bnVsbDticmVhaztjYXNlIFwibW91c2VvdmVyXCI6Y2FzZSBcIm1vdXNlb3V0XCI6TmM9bnVsbDticmVhaztjYXNlIFwicG9pbnRlcm92ZXJcIjpjYXNlIFwicG9pbnRlcm91dFwiOk9jLmRlbGV0ZShiLnBvaW50ZXJJZCk7YnJlYWs7Y2FzZSBcImdvdHBvaW50ZXJjYXB0dXJlXCI6Y2FzZSBcImxvc3Rwb2ludGVyY2FwdHVyZVwiOlBjLmRlbGV0ZShiLnBvaW50ZXJJZCl9fVxuZnVuY3Rpb24gVGMoYSxiLGMsZCxlLGYpe2lmKG51bGw9PT1hfHxhLm5hdGl2ZUV2ZW50IT09ZilyZXR1cm4gYT17YmxvY2tlZE9uOmIsZG9tRXZlbnROYW1lOmMsZXZlbnRTeXN0ZW1GbGFnczpkLG5hdGl2ZUV2ZW50OmYsdGFyZ2V0Q29udGFpbmVyczpbZV19LG51bGwhPT1iJiYoYj1DYihiKSxudWxsIT09YiYmRmMoYikpLGE7YS5ldmVudFN5c3RlbUZsYWdzfD1kO2I9YS50YXJnZXRDb250YWluZXJzO251bGwhPT1lJiYtMT09PWIuaW5kZXhPZihlKSYmYi5wdXNoKGUpO3JldHVybiBhfVxuZnVuY3Rpb24gVWMoYSxiLGMsZCxlKXtzd2l0Y2goYil7Y2FzZSBcImZvY3VzaW5cIjpyZXR1cm4gTGM9VGMoTGMsYSxiLGMsZCxlKSwhMDtjYXNlIFwiZHJhZ2VudGVyXCI6cmV0dXJuIE1jPVRjKE1jLGEsYixjLGQsZSksITA7Y2FzZSBcIm1vdXNlb3ZlclwiOnJldHVybiBOYz1UYyhOYyxhLGIsYyxkLGUpLCEwO2Nhc2UgXCJwb2ludGVyb3ZlclwiOnZhciBmPWUucG9pbnRlcklkO09jLnNldChmLFRjKE9jLmdldChmKXx8bnVsbCxhLGIsYyxkLGUpKTtyZXR1cm4hMDtjYXNlIFwiZ290cG9pbnRlcmNhcHR1cmVcIjpyZXR1cm4gZj1lLnBvaW50ZXJJZCxQYy5zZXQoZixUYyhQYy5nZXQoZil8fG51bGwsYSxiLGMsZCxlKSksITB9cmV0dXJuITF9XG5mdW5jdGlvbiBWYyhhKXt2YXIgYj1XYyhhLnRhcmdldCk7aWYobnVsbCE9PWIpe3ZhciBjPVZiKGIpO2lmKG51bGwhPT1jKWlmKGI9Yy50YWcsMTM9PT1iKXtpZihiPVdiKGMpLG51bGwhPT1iKXthLmJsb2NrZWRPbj1iO0ljKGEucHJpb3JpdHksZnVuY3Rpb24oKXtHYyhjKX0pO3JldHVybn19ZWxzZSBpZigzPT09YiYmYy5zdGF0ZU5vZGUuY3VycmVudC5tZW1vaXplZFN0YXRlLmlzRGVoeWRyYXRlZCl7YS5ibG9ja2VkT249Mz09PWMudGFnP2Muc3RhdGVOb2RlLmNvbnRhaW5lckluZm86bnVsbDtyZXR1cm59fWEuYmxvY2tlZE9uPW51bGx9XG5mdW5jdGlvbiBYYyhhKXtpZihudWxsIT09YS5ibG9ja2VkT24pcmV0dXJuITE7Zm9yKHZhciBiPWEudGFyZ2V0Q29udGFpbmVyczswPGIubGVuZ3RoOyl7dmFyIGM9WWMoYS5kb21FdmVudE5hbWUsYS5ldmVudFN5c3RlbUZsYWdzLGJbMF0sYS5uYXRpdmVFdmVudCk7aWYobnVsbD09PWMpe2M9YS5uYXRpdmVFdmVudDt2YXIgZD1uZXcgYy5jb25zdHJ1Y3RvcihjLnR5cGUsYyk7d2I9ZDtjLnRhcmdldC5kaXNwYXRjaEV2ZW50KGQpO3diPW51bGx9ZWxzZSByZXR1cm4gYj1DYihjKSxudWxsIT09YiYmRmMoYiksYS5ibG9ja2VkT249YywhMTtiLnNoaWZ0KCl9cmV0dXJuITB9ZnVuY3Rpb24gWmMoYSxiLGMpe1hjKGEpJiZjLmRlbGV0ZShiKX1mdW5jdGlvbiAkYygpe0pjPSExO251bGwhPT1MYyYmWGMoTGMpJiYoTGM9bnVsbCk7bnVsbCE9PU1jJiZYYyhNYykmJihNYz1udWxsKTtudWxsIT09TmMmJlhjKE5jKSYmKE5jPW51bGwpO09jLmZvckVhY2goWmMpO1BjLmZvckVhY2goWmMpfVxuZnVuY3Rpb24gYWQoYSxiKXthLmJsb2NrZWRPbj09PWImJihhLmJsb2NrZWRPbj1udWxsLEpjfHwoSmM9ITAsY2EudW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjayhjYS51bnN0YWJsZV9Ob3JtYWxQcmlvcml0eSwkYykpKX1cbmZ1bmN0aW9uIGJkKGEpe2Z1bmN0aW9uIGIoYil7cmV0dXJuIGFkKGIsYSl9aWYoMDxLYy5sZW5ndGgpe2FkKEtjWzBdLGEpO2Zvcih2YXIgYz0xO2M8S2MubGVuZ3RoO2MrKyl7dmFyIGQ9S2NbY107ZC5ibG9ja2VkT249PT1hJiYoZC5ibG9ja2VkT249bnVsbCl9fW51bGwhPT1MYyYmYWQoTGMsYSk7bnVsbCE9PU1jJiZhZChNYyxhKTtudWxsIT09TmMmJmFkKE5jLGEpO09jLmZvckVhY2goYik7UGMuZm9yRWFjaChiKTtmb3IoYz0wO2M8UWMubGVuZ3RoO2MrKylkPVFjW2NdLGQuYmxvY2tlZE9uPT09YSYmKGQuYmxvY2tlZE9uPW51bGwpO2Zvcig7MDxRYy5sZW5ndGgmJihjPVFjWzBdLG51bGw9PT1jLmJsb2NrZWRPbik7KVZjKGMpLG51bGw9PT1jLmJsb2NrZWRPbiYmUWMuc2hpZnQoKX12YXIgY2Q9dWEuUmVhY3RDdXJyZW50QmF0Y2hDb25maWcsZGQ9ITA7XG5mdW5jdGlvbiBlZChhLGIsYyxkKXt2YXIgZT1DLGY9Y2QudHJhbnNpdGlvbjtjZC50cmFuc2l0aW9uPW51bGw7dHJ5e0M9MSxmZChhLGIsYyxkKX1maW5hbGx5e0M9ZSxjZC50cmFuc2l0aW9uPWZ9fWZ1bmN0aW9uIGdkKGEsYixjLGQpe3ZhciBlPUMsZj1jZC50cmFuc2l0aW9uO2NkLnRyYW5zaXRpb249bnVsbDt0cnl7Qz00LGZkKGEsYixjLGQpfWZpbmFsbHl7Qz1lLGNkLnRyYW5zaXRpb249Zn19XG5mdW5jdGlvbiBmZChhLGIsYyxkKXtpZihkZCl7dmFyIGU9WWMoYSxiLGMsZCk7aWYobnVsbD09PWUpaGQoYSxiLGQsaWQsYyksU2MoYSxkKTtlbHNlIGlmKFVjKGUsYSxiLGMsZCkpZC5zdG9wUHJvcGFnYXRpb24oKTtlbHNlIGlmKFNjKGEsZCksYiY0JiYtMTxSYy5pbmRleE9mKGEpKXtmb3IoO251bGwhPT1lOyl7dmFyIGY9Q2IoZSk7bnVsbCE9PWYmJkVjKGYpO2Y9WWMoYSxiLGMsZCk7bnVsbD09PWYmJmhkKGEsYixkLGlkLGMpO2lmKGY9PT1lKWJyZWFrO2U9Zn1udWxsIT09ZSYmZC5zdG9wUHJvcGFnYXRpb24oKX1lbHNlIGhkKGEsYixkLG51bGwsYyl9fXZhciBpZD1udWxsO1xuZnVuY3Rpb24gWWMoYSxiLGMsZCl7aWQ9bnVsbDthPXhiKGQpO2E9V2MoYSk7aWYobnVsbCE9PWEpaWYoYj1WYihhKSxudWxsPT09YilhPW51bGw7ZWxzZSBpZihjPWIudGFnLDEzPT09Yyl7YT1XYihiKTtpZihudWxsIT09YSlyZXR1cm4gYTthPW51bGx9ZWxzZSBpZigzPT09Yyl7aWYoYi5zdGF0ZU5vZGUuY3VycmVudC5tZW1vaXplZFN0YXRlLmlzRGVoeWRyYXRlZClyZXR1cm4gMz09PWIudGFnP2Iuc3RhdGVOb2RlLmNvbnRhaW5lckluZm86bnVsbDthPW51bGx9ZWxzZSBiIT09YSYmKGE9bnVsbCk7aWQ9YTtyZXR1cm4gbnVsbH1cbmZ1bmN0aW9uIGpkKGEpe3N3aXRjaChhKXtjYXNlIFwiY2FuY2VsXCI6Y2FzZSBcImNsaWNrXCI6Y2FzZSBcImNsb3NlXCI6Y2FzZSBcImNvbnRleHRtZW51XCI6Y2FzZSBcImNvcHlcIjpjYXNlIFwiY3V0XCI6Y2FzZSBcImF1eGNsaWNrXCI6Y2FzZSBcImRibGNsaWNrXCI6Y2FzZSBcImRyYWdlbmRcIjpjYXNlIFwiZHJhZ3N0YXJ0XCI6Y2FzZSBcImRyb3BcIjpjYXNlIFwiZm9jdXNpblwiOmNhc2UgXCJmb2N1c291dFwiOmNhc2UgXCJpbnB1dFwiOmNhc2UgXCJpbnZhbGlkXCI6Y2FzZSBcImtleWRvd25cIjpjYXNlIFwia2V5cHJlc3NcIjpjYXNlIFwia2V5dXBcIjpjYXNlIFwibW91c2Vkb3duXCI6Y2FzZSBcIm1vdXNldXBcIjpjYXNlIFwicGFzdGVcIjpjYXNlIFwicGF1c2VcIjpjYXNlIFwicGxheVwiOmNhc2UgXCJwb2ludGVyY2FuY2VsXCI6Y2FzZSBcInBvaW50ZXJkb3duXCI6Y2FzZSBcInBvaW50ZXJ1cFwiOmNhc2UgXCJyYXRlY2hhbmdlXCI6Y2FzZSBcInJlc2V0XCI6Y2FzZSBcInJlc2l6ZVwiOmNhc2UgXCJzZWVrZWRcIjpjYXNlIFwic3VibWl0XCI6Y2FzZSBcInRvdWNoY2FuY2VsXCI6Y2FzZSBcInRvdWNoZW5kXCI6Y2FzZSBcInRvdWNoc3RhcnRcIjpjYXNlIFwidm9sdW1lY2hhbmdlXCI6Y2FzZSBcImNoYW5nZVwiOmNhc2UgXCJzZWxlY3Rpb25jaGFuZ2VcIjpjYXNlIFwidGV4dElucHV0XCI6Y2FzZSBcImNvbXBvc2l0aW9uc3RhcnRcIjpjYXNlIFwiY29tcG9zaXRpb25lbmRcIjpjYXNlIFwiY29tcG9zaXRpb251cGRhdGVcIjpjYXNlIFwiYmVmb3JlYmx1clwiOmNhc2UgXCJhZnRlcmJsdXJcIjpjYXNlIFwiYmVmb3JlaW5wdXRcIjpjYXNlIFwiYmx1clwiOmNhc2UgXCJmdWxsc2NyZWVuY2hhbmdlXCI6Y2FzZSBcImZvY3VzXCI6Y2FzZSBcImhhc2hjaGFuZ2VcIjpjYXNlIFwicG9wc3RhdGVcIjpjYXNlIFwic2VsZWN0XCI6Y2FzZSBcInNlbGVjdHN0YXJ0XCI6cmV0dXJuIDE7Y2FzZSBcImRyYWdcIjpjYXNlIFwiZHJhZ2VudGVyXCI6Y2FzZSBcImRyYWdleGl0XCI6Y2FzZSBcImRyYWdsZWF2ZVwiOmNhc2UgXCJkcmFnb3ZlclwiOmNhc2UgXCJtb3VzZW1vdmVcIjpjYXNlIFwibW91c2VvdXRcIjpjYXNlIFwibW91c2VvdmVyXCI6Y2FzZSBcInBvaW50ZXJtb3ZlXCI6Y2FzZSBcInBvaW50ZXJvdXRcIjpjYXNlIFwicG9pbnRlcm92ZXJcIjpjYXNlIFwic2Nyb2xsXCI6Y2FzZSBcInRvZ2dsZVwiOmNhc2UgXCJ0b3VjaG1vdmVcIjpjYXNlIFwid2hlZWxcIjpjYXNlIFwibW91c2VlbnRlclwiOmNhc2UgXCJtb3VzZWxlYXZlXCI6Y2FzZSBcInBvaW50ZXJlbnRlclwiOmNhc2UgXCJwb2ludGVybGVhdmVcIjpyZXR1cm4gNDtcbmNhc2UgXCJtZXNzYWdlXCI6c3dpdGNoKGVjKCkpe2Nhc2UgZmM6cmV0dXJuIDE7Y2FzZSBnYzpyZXR1cm4gNDtjYXNlIGhjOmNhc2UgaWM6cmV0dXJuIDE2O2Nhc2UgamM6cmV0dXJuIDUzNjg3MDkxMjtkZWZhdWx0OnJldHVybiAxNn1kZWZhdWx0OnJldHVybiAxNn19dmFyIGtkPW51bGwsbGQ9bnVsbCxtZD1udWxsO2Z1bmN0aW9uIG5kKCl7aWYobWQpcmV0dXJuIG1kO3ZhciBhLGI9bGQsYz1iLmxlbmd0aCxkLGU9XCJ2YWx1ZVwiaW4ga2Q/a2QudmFsdWU6a2QudGV4dENvbnRlbnQsZj1lLmxlbmd0aDtmb3IoYT0wO2E8YyYmYlthXT09PWVbYV07YSsrKTt2YXIgZz1jLWE7Zm9yKGQ9MTtkPD1nJiZiW2MtZF09PT1lW2YtZF07ZCsrKTtyZXR1cm4gbWQ9ZS5zbGljZShhLDE8ZD8xLWQ6dm9pZCAwKX1cbmZ1bmN0aW9uIG9kKGEpe3ZhciBiPWEua2V5Q29kZTtcImNoYXJDb2RlXCJpbiBhPyhhPWEuY2hhckNvZGUsMD09PWEmJjEzPT09YiYmKGE9MTMpKTphPWI7MTA9PT1hJiYoYT0xMyk7cmV0dXJuIDMyPD1hfHwxMz09PWE/YTowfWZ1bmN0aW9uIHBkKCl7cmV0dXJuITB9ZnVuY3Rpb24gcWQoKXtyZXR1cm4hMX1cbmZ1bmN0aW9uIHJkKGEpe2Z1bmN0aW9uIGIoYixkLGUsZixnKXt0aGlzLl9yZWFjdE5hbWU9Yjt0aGlzLl90YXJnZXRJbnN0PWU7dGhpcy50eXBlPWQ7dGhpcy5uYXRpdmVFdmVudD1mO3RoaXMudGFyZ2V0PWc7dGhpcy5jdXJyZW50VGFyZ2V0PW51bGw7Zm9yKHZhciBjIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShjKSYmKGI9YVtjXSx0aGlzW2NdPWI/YihmKTpmW2NdKTt0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD0obnVsbCE9Zi5kZWZhdWx0UHJldmVudGVkP2YuZGVmYXVsdFByZXZlbnRlZDohMT09PWYucmV0dXJuVmFsdWUpP3BkOnFkO3RoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9cWQ7cmV0dXJuIHRoaXN9QShiLnByb3RvdHlwZSx7cHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXt0aGlzLmRlZmF1bHRQcmV2ZW50ZWQ9ITA7dmFyIGE9dGhpcy5uYXRpdmVFdmVudDthJiYoYS5wcmV2ZW50RGVmYXVsdD9hLnByZXZlbnREZWZhdWx0KCk6XCJ1bmtub3duXCIhPT10eXBlb2YgYS5yZXR1cm5WYWx1ZSYmXG4oYS5yZXR1cm5WYWx1ZT0hMSksdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9cGQpfSxzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm5hdGl2ZUV2ZW50O2EmJihhLnN0b3BQcm9wYWdhdGlvbj9hLnN0b3BQcm9wYWdhdGlvbigpOlwidW5rbm93blwiIT09dHlwZW9mIGEuY2FuY2VsQnViYmxlJiYoYS5jYW5jZWxCdWJibGU9ITApLHRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9cGQpfSxwZXJzaXN0OmZ1bmN0aW9uKCl7fSxpc1BlcnNpc3RlbnQ6cGR9KTtyZXR1cm4gYn1cbnZhciBzZD17ZXZlbnRQaGFzZTowLGJ1YmJsZXM6MCxjYW5jZWxhYmxlOjAsdGltZVN0YW1wOmZ1bmN0aW9uKGEpe3JldHVybiBhLnRpbWVTdGFtcHx8RGF0ZS5ub3coKX0sZGVmYXVsdFByZXZlbnRlZDowLGlzVHJ1c3RlZDowfSx0ZD1yZChzZCksdWQ9QSh7fSxzZCx7dmlldzowLGRldGFpbDowfSksdmQ9cmQodWQpLHdkLHhkLHlkLEFkPUEoe30sdWQse3NjcmVlblg6MCxzY3JlZW5ZOjAsY2xpZW50WDowLGNsaWVudFk6MCxwYWdlWDowLHBhZ2VZOjAsY3RybEtleTowLHNoaWZ0S2V5OjAsYWx0S2V5OjAsbWV0YUtleTowLGdldE1vZGlmaWVyU3RhdGU6emQsYnV0dG9uOjAsYnV0dG9uczowLHJlbGF0ZWRUYXJnZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHZvaWQgMD09PWEucmVsYXRlZFRhcmdldD9hLmZyb21FbGVtZW50PT09YS5zcmNFbGVtZW50P2EudG9FbGVtZW50OmEuZnJvbUVsZW1lbnQ6YS5yZWxhdGVkVGFyZ2V0fSxtb3ZlbWVudFg6ZnVuY3Rpb24oYSl7aWYoXCJtb3ZlbWVudFhcImluXG5hKXJldHVybiBhLm1vdmVtZW50WDthIT09eWQmJih5ZCYmXCJtb3VzZW1vdmVcIj09PWEudHlwZT8od2Q9YS5zY3JlZW5YLXlkLnNjcmVlblgseGQ9YS5zY3JlZW5ZLXlkLnNjcmVlblkpOnhkPXdkPTAseWQ9YSk7cmV0dXJuIHdkfSxtb3ZlbWVudFk6ZnVuY3Rpb24oYSl7cmV0dXJuXCJtb3ZlbWVudFlcImluIGE/YS5tb3ZlbWVudFk6eGR9fSksQmQ9cmQoQWQpLENkPUEoe30sQWQse2RhdGFUcmFuc2ZlcjowfSksRGQ9cmQoQ2QpLEVkPUEoe30sdWQse3JlbGF0ZWRUYXJnZXQ6MH0pLEZkPXJkKEVkKSxHZD1BKHt9LHNkLHthbmltYXRpb25OYW1lOjAsZWxhcHNlZFRpbWU6MCxwc2V1ZG9FbGVtZW50OjB9KSxIZD1yZChHZCksSWQ9QSh7fSxzZCx7Y2xpcGJvYXJkRGF0YTpmdW5jdGlvbihhKXtyZXR1cm5cImNsaXBib2FyZERhdGFcImluIGE/YS5jbGlwYm9hcmREYXRhOndpbmRvdy5jbGlwYm9hcmREYXRhfX0pLEpkPXJkKElkKSxLZD1BKHt9LHNkLHtkYXRhOjB9KSxMZD1yZChLZCksTWQ9e0VzYzpcIkVzY2FwZVwiLFxuU3BhY2ViYXI6XCIgXCIsTGVmdDpcIkFycm93TGVmdFwiLFVwOlwiQXJyb3dVcFwiLFJpZ2h0OlwiQXJyb3dSaWdodFwiLERvd246XCJBcnJvd0Rvd25cIixEZWw6XCJEZWxldGVcIixXaW46XCJPU1wiLE1lbnU6XCJDb250ZXh0TWVudVwiLEFwcHM6XCJDb250ZXh0TWVudVwiLFNjcm9sbDpcIlNjcm9sbExvY2tcIixNb3pQcmludGFibGVLZXk6XCJVbmlkZW50aWZpZWRcIn0sTmQ9ezg6XCJCYWNrc3BhY2VcIiw5OlwiVGFiXCIsMTI6XCJDbGVhclwiLDEzOlwiRW50ZXJcIiwxNjpcIlNoaWZ0XCIsMTc6XCJDb250cm9sXCIsMTg6XCJBbHRcIiwxOTpcIlBhdXNlXCIsMjA6XCJDYXBzTG9ja1wiLDI3OlwiRXNjYXBlXCIsMzI6XCIgXCIsMzM6XCJQYWdlVXBcIiwzNDpcIlBhZ2VEb3duXCIsMzU6XCJFbmRcIiwzNjpcIkhvbWVcIiwzNzpcIkFycm93TGVmdFwiLDM4OlwiQXJyb3dVcFwiLDM5OlwiQXJyb3dSaWdodFwiLDQwOlwiQXJyb3dEb3duXCIsNDU6XCJJbnNlcnRcIiw0NjpcIkRlbGV0ZVwiLDExMjpcIkYxXCIsMTEzOlwiRjJcIiwxMTQ6XCJGM1wiLDExNTpcIkY0XCIsMTE2OlwiRjVcIiwxMTc6XCJGNlwiLDExODpcIkY3XCIsXG4xMTk6XCJGOFwiLDEyMDpcIkY5XCIsMTIxOlwiRjEwXCIsMTIyOlwiRjExXCIsMTIzOlwiRjEyXCIsMTQ0OlwiTnVtTG9ja1wiLDE0NTpcIlNjcm9sbExvY2tcIiwyMjQ6XCJNZXRhXCJ9LE9kPXtBbHQ6XCJhbHRLZXlcIixDb250cm9sOlwiY3RybEtleVwiLE1ldGE6XCJtZXRhS2V5XCIsU2hpZnQ6XCJzaGlmdEtleVwifTtmdW5jdGlvbiBQZChhKXt2YXIgYj10aGlzLm5hdGl2ZUV2ZW50O3JldHVybiBiLmdldE1vZGlmaWVyU3RhdGU/Yi5nZXRNb2RpZmllclN0YXRlKGEpOihhPU9kW2FdKT8hIWJbYV06ITF9ZnVuY3Rpb24gemQoKXtyZXR1cm4gUGR9XG52YXIgUWQ9QSh7fSx1ZCx7a2V5OmZ1bmN0aW9uKGEpe2lmKGEua2V5KXt2YXIgYj1NZFthLmtleV18fGEua2V5O2lmKFwiVW5pZGVudGlmaWVkXCIhPT1iKXJldHVybiBifXJldHVyblwia2V5cHJlc3NcIj09PWEudHlwZT8oYT1vZChhKSwxMz09PWE/XCJFbnRlclwiOlN0cmluZy5mcm9tQ2hhckNvZGUoYSkpOlwia2V5ZG93blwiPT09YS50eXBlfHxcImtleXVwXCI9PT1hLnR5cGU/TmRbYS5rZXlDb2RlXXx8XCJVbmlkZW50aWZpZWRcIjpcIlwifSxjb2RlOjAsbG9jYXRpb246MCxjdHJsS2V5OjAsc2hpZnRLZXk6MCxhbHRLZXk6MCxtZXRhS2V5OjAscmVwZWF0OjAsbG9jYWxlOjAsZ2V0TW9kaWZpZXJTdGF0ZTp6ZCxjaGFyQ29kZTpmdW5jdGlvbihhKXtyZXR1cm5cImtleXByZXNzXCI9PT1hLnR5cGU/b2QoYSk6MH0sa2V5Q29kZTpmdW5jdGlvbihhKXtyZXR1cm5cImtleWRvd25cIj09PWEudHlwZXx8XCJrZXl1cFwiPT09YS50eXBlP2Eua2V5Q29kZTowfSx3aGljaDpmdW5jdGlvbihhKXtyZXR1cm5cImtleXByZXNzXCI9PT1cbmEudHlwZT9vZChhKTpcImtleWRvd25cIj09PWEudHlwZXx8XCJrZXl1cFwiPT09YS50eXBlP2Eua2V5Q29kZTowfX0pLFJkPXJkKFFkKSxTZD1BKHt9LEFkLHtwb2ludGVySWQ6MCx3aWR0aDowLGhlaWdodDowLHByZXNzdXJlOjAsdGFuZ2VudGlhbFByZXNzdXJlOjAsdGlsdFg6MCx0aWx0WTowLHR3aXN0OjAscG9pbnRlclR5cGU6MCxpc1ByaW1hcnk6MH0pLFRkPXJkKFNkKSxVZD1BKHt9LHVkLHt0b3VjaGVzOjAsdGFyZ2V0VG91Y2hlczowLGNoYW5nZWRUb3VjaGVzOjAsYWx0S2V5OjAsbWV0YUtleTowLGN0cmxLZXk6MCxzaGlmdEtleTowLGdldE1vZGlmaWVyU3RhdGU6emR9KSxWZD1yZChVZCksV2Q9QSh7fSxzZCx7cHJvcGVydHlOYW1lOjAsZWxhcHNlZFRpbWU6MCxwc2V1ZG9FbGVtZW50OjB9KSxYZD1yZChXZCksWWQ9QSh7fSxBZCx7ZGVsdGFYOmZ1bmN0aW9uKGEpe3JldHVyblwiZGVsdGFYXCJpbiBhP2EuZGVsdGFYOlwid2hlZWxEZWx0YVhcImluIGE/LWEud2hlZWxEZWx0YVg6MH0sXG5kZWx0YVk6ZnVuY3Rpb24oYSl7cmV0dXJuXCJkZWx0YVlcImluIGE/YS5kZWx0YVk6XCJ3aGVlbERlbHRhWVwiaW4gYT8tYS53aGVlbERlbHRhWTpcIndoZWVsRGVsdGFcImluIGE/LWEud2hlZWxEZWx0YTowfSxkZWx0YVo6MCxkZWx0YU1vZGU6MH0pLFpkPXJkKFlkKSwkZD1bOSwxMywyNywzMl0sYWU9aWEmJlwiQ29tcG9zaXRpb25FdmVudFwiaW4gd2luZG93LGJlPW51bGw7aWEmJlwiZG9jdW1lbnRNb2RlXCJpbiBkb2N1bWVudCYmKGJlPWRvY3VtZW50LmRvY3VtZW50TW9kZSk7dmFyIGNlPWlhJiZcIlRleHRFdmVudFwiaW4gd2luZG93JiYhYmUsZGU9aWEmJighYWV8fGJlJiY4PGJlJiYxMT49YmUpLGVlPVN0cmluZy5mcm9tQ2hhckNvZGUoMzIpLGZlPSExO1xuZnVuY3Rpb24gZ2UoYSxiKXtzd2l0Y2goYSl7Y2FzZSBcImtleXVwXCI6cmV0dXJuLTEhPT0kZC5pbmRleE9mKGIua2V5Q29kZSk7Y2FzZSBcImtleWRvd25cIjpyZXR1cm4gMjI5IT09Yi5rZXlDb2RlO2Nhc2UgXCJrZXlwcmVzc1wiOmNhc2UgXCJtb3VzZWRvd25cIjpjYXNlIFwiZm9jdXNvdXRcIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX1mdW5jdGlvbiBoZShhKXthPWEuZGV0YWlsO3JldHVyblwib2JqZWN0XCI9PT10eXBlb2YgYSYmXCJkYXRhXCJpbiBhP2EuZGF0YTpudWxsfXZhciBpZT0hMTtmdW5jdGlvbiBqZShhLGIpe3N3aXRjaChhKXtjYXNlIFwiY29tcG9zaXRpb25lbmRcIjpyZXR1cm4gaGUoYik7Y2FzZSBcImtleXByZXNzXCI6aWYoMzIhPT1iLndoaWNoKXJldHVybiBudWxsO2ZlPSEwO3JldHVybiBlZTtjYXNlIFwidGV4dElucHV0XCI6cmV0dXJuIGE9Yi5kYXRhLGE9PT1lZSYmZmU/bnVsbDphO2RlZmF1bHQ6cmV0dXJuIG51bGx9fVxuZnVuY3Rpb24ga2UoYSxiKXtpZihpZSlyZXR1cm5cImNvbXBvc2l0aW9uZW5kXCI9PT1hfHwhYWUmJmdlKGEsYik/KGE9bmQoKSxtZD1sZD1rZD1udWxsLGllPSExLGEpOm51bGw7c3dpdGNoKGEpe2Nhc2UgXCJwYXN0ZVwiOnJldHVybiBudWxsO2Nhc2UgXCJrZXlwcmVzc1wiOmlmKCEoYi5jdHJsS2V5fHxiLmFsdEtleXx8Yi5tZXRhS2V5KXx8Yi5jdHJsS2V5JiZiLmFsdEtleSl7aWYoYi5jaGFyJiYxPGIuY2hhci5sZW5ndGgpcmV0dXJuIGIuY2hhcjtpZihiLndoaWNoKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIud2hpY2gpfXJldHVybiBudWxsO2Nhc2UgXCJjb21wb3NpdGlvbmVuZFwiOnJldHVybiBkZSYmXCJrb1wiIT09Yi5sb2NhbGU/bnVsbDpiLmRhdGE7ZGVmYXVsdDpyZXR1cm4gbnVsbH19XG52YXIgbGU9e2NvbG9yOiEwLGRhdGU6ITAsZGF0ZXRpbWU6ITAsXCJkYXRldGltZS1sb2NhbFwiOiEwLGVtYWlsOiEwLG1vbnRoOiEwLG51bWJlcjohMCxwYXNzd29yZDohMCxyYW5nZTohMCxzZWFyY2g6ITAsdGVsOiEwLHRleHQ6ITAsdGltZTohMCx1cmw6ITAsd2VlazohMH07ZnVuY3Rpb24gbWUoYSl7dmFyIGI9YSYmYS5ub2RlTmFtZSYmYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVyblwiaW5wdXRcIj09PWI/ISFsZVthLnR5cGVdOlwidGV4dGFyZWFcIj09PWI/ITA6ITF9ZnVuY3Rpb24gbmUoYSxiLGMsZCl7RWIoZCk7Yj1vZShiLFwib25DaGFuZ2VcIik7MDxiLmxlbmd0aCYmKGM9bmV3IHRkKFwib25DaGFuZ2VcIixcImNoYW5nZVwiLG51bGwsYyxkKSxhLnB1c2goe2V2ZW50OmMsbGlzdGVuZXJzOmJ9KSl9dmFyIHBlPW51bGwscWU9bnVsbDtmdW5jdGlvbiByZShhKXtzZShhLDApfWZ1bmN0aW9uIHRlKGEpe3ZhciBiPXVlKGEpO2lmKFdhKGIpKXJldHVybiBhfVxuZnVuY3Rpb24gdmUoYSxiKXtpZihcImNoYW5nZVwiPT09YSlyZXR1cm4gYn12YXIgd2U9ITE7aWYoaWEpe3ZhciB4ZTtpZihpYSl7dmFyIHllPVwib25pbnB1dFwiaW4gZG9jdW1lbnQ7aWYoIXllKXt2YXIgemU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTt6ZS5zZXRBdHRyaWJ1dGUoXCJvbmlucHV0XCIsXCJyZXR1cm47XCIpO3llPVwiZnVuY3Rpb25cIj09PXR5cGVvZiB6ZS5vbmlucHV0fXhlPXllfWVsc2UgeGU9ITE7d2U9eGUmJighZG9jdW1lbnQuZG9jdW1lbnRNb2RlfHw5PGRvY3VtZW50LmRvY3VtZW50TW9kZSl9ZnVuY3Rpb24gQWUoKXtwZSYmKHBlLmRldGFjaEV2ZW50KFwib25wcm9wZXJ0eWNoYW5nZVwiLEJlKSxxZT1wZT1udWxsKX1mdW5jdGlvbiBCZShhKXtpZihcInZhbHVlXCI9PT1hLnByb3BlcnR5TmFtZSYmdGUocWUpKXt2YXIgYj1bXTtuZShiLHFlLGEseGIoYSkpO0piKHJlLGIpfX1cbmZ1bmN0aW9uIENlKGEsYixjKXtcImZvY3VzaW5cIj09PWE/KEFlKCkscGU9YixxZT1jLHBlLmF0dGFjaEV2ZW50KFwib25wcm9wZXJ0eWNoYW5nZVwiLEJlKSk6XCJmb2N1c291dFwiPT09YSYmQWUoKX1mdW5jdGlvbiBEZShhKXtpZihcInNlbGVjdGlvbmNoYW5nZVwiPT09YXx8XCJrZXl1cFwiPT09YXx8XCJrZXlkb3duXCI9PT1hKXJldHVybiB0ZShxZSl9ZnVuY3Rpb24gRWUoYSxiKXtpZihcImNsaWNrXCI9PT1hKXJldHVybiB0ZShiKX1mdW5jdGlvbiBGZShhLGIpe2lmKFwiaW5wdXRcIj09PWF8fFwiY2hhbmdlXCI9PT1hKXJldHVybiB0ZShiKX1mdW5jdGlvbiBHZShhLGIpe3JldHVybiBhPT09YiYmKDAhPT1hfHwxL2E9PT0xL2IpfHxhIT09YSYmYiE9PWJ9dmFyIEhlPVwiZnVuY3Rpb25cIj09PXR5cGVvZiBPYmplY3QuaXM/T2JqZWN0LmlzOkdlO1xuZnVuY3Rpb24gSWUoYSxiKXtpZihIZShhLGIpKXJldHVybiEwO2lmKFwib2JqZWN0XCIhPT10eXBlb2YgYXx8bnVsbD09PWF8fFwib2JqZWN0XCIhPT10eXBlb2YgYnx8bnVsbD09PWIpcmV0dXJuITE7dmFyIGM9T2JqZWN0LmtleXMoYSksZD1PYmplY3Qua2V5cyhiKTtpZihjLmxlbmd0aCE9PWQubGVuZ3RoKXJldHVybiExO2ZvcihkPTA7ZDxjLmxlbmd0aDtkKyspe3ZhciBlPWNbZF07aWYoIWphLmNhbGwoYixlKXx8IUhlKGFbZV0sYltlXSkpcmV0dXJuITF9cmV0dXJuITB9ZnVuY3Rpb24gSmUoYSl7Zm9yKDthJiZhLmZpcnN0Q2hpbGQ7KWE9YS5maXJzdENoaWxkO3JldHVybiBhfVxuZnVuY3Rpb24gS2UoYSxiKXt2YXIgYz1KZShhKTthPTA7Zm9yKHZhciBkO2M7KXtpZigzPT09Yy5ub2RlVHlwZSl7ZD1hK2MudGV4dENvbnRlbnQubGVuZ3RoO2lmKGE8PWImJmQ+PWIpcmV0dXJue25vZGU6YyxvZmZzZXQ6Yi1hfTthPWR9YTp7Zm9yKDtjOyl7aWYoYy5uZXh0U2libGluZyl7Yz1jLm5leHRTaWJsaW5nO2JyZWFrIGF9Yz1jLnBhcmVudE5vZGV9Yz12b2lkIDB9Yz1KZShjKX19ZnVuY3Rpb24gTGUoYSxiKXtyZXR1cm4gYSYmYj9hPT09Yj8hMDphJiYzPT09YS5ub2RlVHlwZT8hMTpiJiYzPT09Yi5ub2RlVHlwZT9MZShhLGIucGFyZW50Tm9kZSk6XCJjb250YWluc1wiaW4gYT9hLmNvbnRhaW5zKGIpOmEuY29tcGFyZURvY3VtZW50UG9zaXRpb24/ISEoYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSYxNik6ITE6ITF9XG5mdW5jdGlvbiBNZSgpe2Zvcih2YXIgYT13aW5kb3csYj1YYSgpO2IgaW5zdGFuY2VvZiBhLkhUTUxJRnJhbWVFbGVtZW50Oyl7dHJ5e3ZhciBjPVwic3RyaW5nXCI9PT10eXBlb2YgYi5jb250ZW50V2luZG93LmxvY2F0aW9uLmhyZWZ9Y2F0Y2goZCl7Yz0hMX1pZihjKWE9Yi5jb250ZW50V2luZG93O2Vsc2UgYnJlYWs7Yj1YYShhLmRvY3VtZW50KX1yZXR1cm4gYn1mdW5jdGlvbiBOZShhKXt2YXIgYj1hJiZhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuIGImJihcImlucHV0XCI9PT1iJiYoXCJ0ZXh0XCI9PT1hLnR5cGV8fFwic2VhcmNoXCI9PT1hLnR5cGV8fFwidGVsXCI9PT1hLnR5cGV8fFwidXJsXCI9PT1hLnR5cGV8fFwicGFzc3dvcmRcIj09PWEudHlwZSl8fFwidGV4dGFyZWFcIj09PWJ8fFwidHJ1ZVwiPT09YS5jb250ZW50RWRpdGFibGUpfVxuZnVuY3Rpb24gT2UoYSl7dmFyIGI9TWUoKSxjPWEuZm9jdXNlZEVsZW0sZD1hLnNlbGVjdGlvblJhbmdlO2lmKGIhPT1jJiZjJiZjLm93bmVyRG9jdW1lbnQmJkxlKGMub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsYykpe2lmKG51bGwhPT1kJiZOZShjKSlpZihiPWQuc3RhcnQsYT1kLmVuZCx2b2lkIDA9PT1hJiYoYT1iKSxcInNlbGVjdGlvblN0YXJ0XCJpbiBjKWMuc2VsZWN0aW9uU3RhcnQ9YixjLnNlbGVjdGlvbkVuZD1NYXRoLm1pbihhLGMudmFsdWUubGVuZ3RoKTtlbHNlIGlmKGE9KGI9Yy5vd25lckRvY3VtZW50fHxkb2N1bWVudCkmJmIuZGVmYXVsdFZpZXd8fHdpbmRvdyxhLmdldFNlbGVjdGlvbil7YT1hLmdldFNlbGVjdGlvbigpO3ZhciBlPWMudGV4dENvbnRlbnQubGVuZ3RoLGY9TWF0aC5taW4oZC5zdGFydCxlKTtkPXZvaWQgMD09PWQuZW5kP2Y6TWF0aC5taW4oZC5lbmQsZSk7IWEuZXh0ZW5kJiZmPmQmJihlPWQsZD1mLGY9ZSk7ZT1LZShjLGYpO3ZhciBnPUtlKGMsXG5kKTtlJiZnJiYoMSE9PWEucmFuZ2VDb3VudHx8YS5hbmNob3JOb2RlIT09ZS5ub2RlfHxhLmFuY2hvck9mZnNldCE9PWUub2Zmc2V0fHxhLmZvY3VzTm9kZSE9PWcubm9kZXx8YS5mb2N1c09mZnNldCE9PWcub2Zmc2V0KSYmKGI9Yi5jcmVhdGVSYW5nZSgpLGIuc2V0U3RhcnQoZS5ub2RlLGUub2Zmc2V0KSxhLnJlbW92ZUFsbFJhbmdlcygpLGY+ZD8oYS5hZGRSYW5nZShiKSxhLmV4dGVuZChnLm5vZGUsZy5vZmZzZXQpKTooYi5zZXRFbmQoZy5ub2RlLGcub2Zmc2V0KSxhLmFkZFJhbmdlKGIpKSl9Yj1bXTtmb3IoYT1jO2E9YS5wYXJlbnROb2RlOykxPT09YS5ub2RlVHlwZSYmYi5wdXNoKHtlbGVtZW50OmEsbGVmdDphLnNjcm9sbExlZnQsdG9wOmEuc2Nyb2xsVG9wfSk7XCJmdW5jdGlvblwiPT09dHlwZW9mIGMuZm9jdXMmJmMuZm9jdXMoKTtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWE9YltjXSxhLmVsZW1lbnQuc2Nyb2xsTGVmdD1hLmxlZnQsYS5lbGVtZW50LnNjcm9sbFRvcD1hLnRvcH19XG52YXIgUGU9aWEmJlwiZG9jdW1lbnRNb2RlXCJpbiBkb2N1bWVudCYmMTE+PWRvY3VtZW50LmRvY3VtZW50TW9kZSxRZT1udWxsLFJlPW51bGwsU2U9bnVsbCxUZT0hMTtcbmZ1bmN0aW9uIFVlKGEsYixjKXt2YXIgZD1jLndpbmRvdz09PWM/Yy5kb2N1bWVudDo5PT09Yy5ub2RlVHlwZT9jOmMub3duZXJEb2N1bWVudDtUZXx8bnVsbD09UWV8fFFlIT09WGEoZCl8fChkPVFlLFwic2VsZWN0aW9uU3RhcnRcImluIGQmJk5lKGQpP2Q9e3N0YXJ0OmQuc2VsZWN0aW9uU3RhcnQsZW5kOmQuc2VsZWN0aW9uRW5kfTooZD0oZC5vd25lckRvY3VtZW50JiZkLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXd8fHdpbmRvdykuZ2V0U2VsZWN0aW9uKCksZD17YW5jaG9yTm9kZTpkLmFuY2hvck5vZGUsYW5jaG9yT2Zmc2V0OmQuYW5jaG9yT2Zmc2V0LGZvY3VzTm9kZTpkLmZvY3VzTm9kZSxmb2N1c09mZnNldDpkLmZvY3VzT2Zmc2V0fSksU2UmJkllKFNlLGQpfHwoU2U9ZCxkPW9lKFJlLFwib25TZWxlY3RcIiksMDxkLmxlbmd0aCYmKGI9bmV3IHRkKFwib25TZWxlY3RcIixcInNlbGVjdFwiLG51bGwsYixjKSxhLnB1c2goe2V2ZW50OmIsbGlzdGVuZXJzOmR9KSxiLnRhcmdldD1RZSkpKX1cbmZ1bmN0aW9uIFZlKGEsYil7dmFyIGM9e307Y1thLnRvTG93ZXJDYXNlKCldPWIudG9Mb3dlckNhc2UoKTtjW1wiV2Via2l0XCIrYV09XCJ3ZWJraXRcIitiO2NbXCJNb3pcIithXT1cIm1velwiK2I7cmV0dXJuIGN9dmFyIFdlPXthbmltYXRpb25lbmQ6VmUoXCJBbmltYXRpb25cIixcIkFuaW1hdGlvbkVuZFwiKSxhbmltYXRpb25pdGVyYXRpb246VmUoXCJBbmltYXRpb25cIixcIkFuaW1hdGlvbkl0ZXJhdGlvblwiKSxhbmltYXRpb25zdGFydDpWZShcIkFuaW1hdGlvblwiLFwiQW5pbWF0aW9uU3RhcnRcIiksdHJhbnNpdGlvbmVuZDpWZShcIlRyYW5zaXRpb25cIixcIlRyYW5zaXRpb25FbmRcIil9LFhlPXt9LFllPXt9O1xuaWEmJihZZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLnN0eWxlLFwiQW5pbWF0aW9uRXZlbnRcImluIHdpbmRvd3x8KGRlbGV0ZSBXZS5hbmltYXRpb25lbmQuYW5pbWF0aW9uLGRlbGV0ZSBXZS5hbmltYXRpb25pdGVyYXRpb24uYW5pbWF0aW9uLGRlbGV0ZSBXZS5hbmltYXRpb25zdGFydC5hbmltYXRpb24pLFwiVHJhbnNpdGlvbkV2ZW50XCJpbiB3aW5kb3d8fGRlbGV0ZSBXZS50cmFuc2l0aW9uZW5kLnRyYW5zaXRpb24pO2Z1bmN0aW9uIFplKGEpe2lmKFhlW2FdKXJldHVybiBYZVthXTtpZighV2VbYV0pcmV0dXJuIGE7dmFyIGI9V2VbYV0sYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykmJmMgaW4gWWUpcmV0dXJuIFhlW2FdPWJbY107cmV0dXJuIGF9dmFyICRlPVplKFwiYW5pbWF0aW9uZW5kXCIpLGFmPVplKFwiYW5pbWF0aW9uaXRlcmF0aW9uXCIpLGJmPVplKFwiYW5pbWF0aW9uc3RhcnRcIiksY2Y9WmUoXCJ0cmFuc2l0aW9uZW5kXCIpLGRmPW5ldyBNYXAsZWY9XCJhYm9ydCBhdXhDbGljayBjYW5jZWwgY2FuUGxheSBjYW5QbGF5VGhyb3VnaCBjbGljayBjbG9zZSBjb250ZXh0TWVudSBjb3B5IGN1dCBkcmFnIGRyYWdFbmQgZHJhZ0VudGVyIGRyYWdFeGl0IGRyYWdMZWF2ZSBkcmFnT3ZlciBkcmFnU3RhcnQgZHJvcCBkdXJhdGlvbkNoYW5nZSBlbXB0aWVkIGVuY3J5cHRlZCBlbmRlZCBlcnJvciBnb3RQb2ludGVyQ2FwdHVyZSBpbnB1dCBpbnZhbGlkIGtleURvd24ga2V5UHJlc3Mga2V5VXAgbG9hZCBsb2FkZWREYXRhIGxvYWRlZE1ldGFkYXRhIGxvYWRTdGFydCBsb3N0UG9pbnRlckNhcHR1cmUgbW91c2VEb3duIG1vdXNlTW92ZSBtb3VzZU91dCBtb3VzZU92ZXIgbW91c2VVcCBwYXN0ZSBwYXVzZSBwbGF5IHBsYXlpbmcgcG9pbnRlckNhbmNlbCBwb2ludGVyRG93biBwb2ludGVyTW92ZSBwb2ludGVyT3V0IHBvaW50ZXJPdmVyIHBvaW50ZXJVcCBwcm9ncmVzcyByYXRlQ2hhbmdlIHJlc2V0IHJlc2l6ZSBzZWVrZWQgc2Vla2luZyBzdGFsbGVkIHN1Ym1pdCBzdXNwZW5kIHRpbWVVcGRhdGUgdG91Y2hDYW5jZWwgdG91Y2hFbmQgdG91Y2hTdGFydCB2b2x1bWVDaGFuZ2Ugc2Nyb2xsIHRvZ2dsZSB0b3VjaE1vdmUgd2FpdGluZyB3aGVlbFwiLnNwbGl0KFwiIFwiKTtcbmZ1bmN0aW9uIGZmKGEsYil7ZGYuc2V0KGEsYik7ZmEoYixbYV0pfWZvcih2YXIgZ2Y9MDtnZjxlZi5sZW5ndGg7Z2YrKyl7dmFyIGhmPWVmW2dmXSxqZj1oZi50b0xvd2VyQ2FzZSgpLGtmPWhmWzBdLnRvVXBwZXJDYXNlKCkraGYuc2xpY2UoMSk7ZmYoamYsXCJvblwiK2tmKX1mZigkZSxcIm9uQW5pbWF0aW9uRW5kXCIpO2ZmKGFmLFwib25BbmltYXRpb25JdGVyYXRpb25cIik7ZmYoYmYsXCJvbkFuaW1hdGlvblN0YXJ0XCIpO2ZmKFwiZGJsY2xpY2tcIixcIm9uRG91YmxlQ2xpY2tcIik7ZmYoXCJmb2N1c2luXCIsXCJvbkZvY3VzXCIpO2ZmKFwiZm9jdXNvdXRcIixcIm9uQmx1clwiKTtmZihjZixcIm9uVHJhbnNpdGlvbkVuZFwiKTtoYShcIm9uTW91c2VFbnRlclwiLFtcIm1vdXNlb3V0XCIsXCJtb3VzZW92ZXJcIl0pO2hhKFwib25Nb3VzZUxlYXZlXCIsW1wibW91c2VvdXRcIixcIm1vdXNlb3ZlclwiXSk7aGEoXCJvblBvaW50ZXJFbnRlclwiLFtcInBvaW50ZXJvdXRcIixcInBvaW50ZXJvdmVyXCJdKTtcbmhhKFwib25Qb2ludGVyTGVhdmVcIixbXCJwb2ludGVyb3V0XCIsXCJwb2ludGVyb3ZlclwiXSk7ZmEoXCJvbkNoYW5nZVwiLFwiY2hhbmdlIGNsaWNrIGZvY3VzaW4gZm9jdXNvdXQgaW5wdXQga2V5ZG93biBrZXl1cCBzZWxlY3Rpb25jaGFuZ2VcIi5zcGxpdChcIiBcIikpO2ZhKFwib25TZWxlY3RcIixcImZvY3Vzb3V0IGNvbnRleHRtZW51IGRyYWdlbmQgZm9jdXNpbiBrZXlkb3duIGtleXVwIG1vdXNlZG93biBtb3VzZXVwIHNlbGVjdGlvbmNoYW5nZVwiLnNwbGl0KFwiIFwiKSk7ZmEoXCJvbkJlZm9yZUlucHV0XCIsW1wiY29tcG9zaXRpb25lbmRcIixcImtleXByZXNzXCIsXCJ0ZXh0SW5wdXRcIixcInBhc3RlXCJdKTtmYShcIm9uQ29tcG9zaXRpb25FbmRcIixcImNvbXBvc2l0aW9uZW5kIGZvY3Vzb3V0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgbW91c2Vkb3duXCIuc3BsaXQoXCIgXCIpKTtmYShcIm9uQ29tcG9zaXRpb25TdGFydFwiLFwiY29tcG9zaXRpb25zdGFydCBmb2N1c291dCBrZXlkb3duIGtleXByZXNzIGtleXVwIG1vdXNlZG93blwiLnNwbGl0KFwiIFwiKSk7XG5mYShcIm9uQ29tcG9zaXRpb25VcGRhdGVcIixcImNvbXBvc2l0aW9udXBkYXRlIGZvY3Vzb3V0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgbW91c2Vkb3duXCIuc3BsaXQoXCIgXCIpKTt2YXIgbGY9XCJhYm9ydCBjYW5wbGF5IGNhbnBsYXl0aHJvdWdoIGR1cmF0aW9uY2hhbmdlIGVtcHRpZWQgZW5jcnlwdGVkIGVuZGVkIGVycm9yIGxvYWRlZGRhdGEgbG9hZGVkbWV0YWRhdGEgbG9hZHN0YXJ0IHBhdXNlIHBsYXkgcGxheWluZyBwcm9ncmVzcyByYXRlY2hhbmdlIHJlc2l6ZSBzZWVrZWQgc2Vla2luZyBzdGFsbGVkIHN1c3BlbmQgdGltZXVwZGF0ZSB2b2x1bWVjaGFuZ2Ugd2FpdGluZ1wiLnNwbGl0KFwiIFwiKSxtZj1uZXcgU2V0KFwiY2FuY2VsIGNsb3NlIGludmFsaWQgbG9hZCBzY3JvbGwgdG9nZ2xlXCIuc3BsaXQoXCIgXCIpLmNvbmNhdChsZikpO1xuZnVuY3Rpb24gbmYoYSxiLGMpe3ZhciBkPWEudHlwZXx8XCJ1bmtub3duLWV2ZW50XCI7YS5jdXJyZW50VGFyZ2V0PWM7VWIoZCxiLHZvaWQgMCxhKTthLmN1cnJlbnRUYXJnZXQ9bnVsbH1cbmZ1bmN0aW9uIHNlKGEsYil7Yj0wIT09KGImNCk7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY10sZT1kLmV2ZW50O2Q9ZC5saXN0ZW5lcnM7YTp7dmFyIGY9dm9pZCAwO2lmKGIpZm9yKHZhciBnPWQubGVuZ3RoLTE7MDw9ZztnLS0pe3ZhciBoPWRbZ10saz1oLmluc3RhbmNlLGw9aC5jdXJyZW50VGFyZ2V0O2g9aC5saXN0ZW5lcjtpZihrIT09ZiYmZS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKWJyZWFrIGE7bmYoZSxoLGwpO2Y9a31lbHNlIGZvcihnPTA7ZzxkLmxlbmd0aDtnKyspe2g9ZFtnXTtrPWguaW5zdGFuY2U7bD1oLmN1cnJlbnRUYXJnZXQ7aD1oLmxpc3RlbmVyO2lmKGshPT1mJiZlLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpYnJlYWsgYTtuZihlLGgsbCk7Zj1rfX19aWYoUWIpdGhyb3cgYT1SYixRYj0hMSxSYj1udWxsLGE7fVxuZnVuY3Rpb24gRChhLGIpe3ZhciBjPWJbb2ZdO3ZvaWQgMD09PWMmJihjPWJbb2ZdPW5ldyBTZXQpO3ZhciBkPWErXCJfX2J1YmJsZVwiO2MuaGFzKGQpfHwocGYoYixhLDIsITEpLGMuYWRkKGQpKX1mdW5jdGlvbiBxZihhLGIsYyl7dmFyIGQ9MDtiJiYoZHw9NCk7cGYoYyxhLGQsYil9dmFyIHJmPVwiX3JlYWN0TGlzdGVuaW5nXCIrTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMik7ZnVuY3Rpb24gc2YoYSl7aWYoIWFbcmZdKXthW3JmXT0hMDtkYS5mb3JFYWNoKGZ1bmN0aW9uKGIpe1wic2VsZWN0aW9uY2hhbmdlXCIhPT1iJiYobWYuaGFzKGIpfHxxZihiLCExLGEpLHFmKGIsITAsYSkpfSk7dmFyIGI9OT09PWEubm9kZVR5cGU/YTphLm93bmVyRG9jdW1lbnQ7bnVsbD09PWJ8fGJbcmZdfHwoYltyZl09ITAscWYoXCJzZWxlY3Rpb25jaGFuZ2VcIiwhMSxiKSl9fVxuZnVuY3Rpb24gcGYoYSxiLGMsZCl7c3dpdGNoKGpkKGIpKXtjYXNlIDE6dmFyIGU9ZWQ7YnJlYWs7Y2FzZSA0OmU9Z2Q7YnJlYWs7ZGVmYXVsdDplPWZkfWM9ZS5iaW5kKG51bGwsYixjLGEpO2U9dm9pZCAwOyFMYnx8XCJ0b3VjaHN0YXJ0XCIhPT1iJiZcInRvdWNobW92ZVwiIT09YiYmXCJ3aGVlbFwiIT09Ynx8KGU9ITApO2Q/dm9pZCAwIT09ZT9hLmFkZEV2ZW50TGlzdGVuZXIoYixjLHtjYXB0dXJlOiEwLHBhc3NpdmU6ZX0pOmEuYWRkRXZlbnRMaXN0ZW5lcihiLGMsITApOnZvaWQgMCE9PWU/YS5hZGRFdmVudExpc3RlbmVyKGIsYyx7cGFzc2l2ZTplfSk6YS5hZGRFdmVudExpc3RlbmVyKGIsYywhMSl9XG5mdW5jdGlvbiBoZChhLGIsYyxkLGUpe3ZhciBmPWQ7aWYoMD09PShiJjEpJiYwPT09KGImMikmJm51bGwhPT1kKWE6Zm9yKDs7KXtpZihudWxsPT09ZClyZXR1cm47dmFyIGc9ZC50YWc7aWYoMz09PWd8fDQ9PT1nKXt2YXIgaD1kLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO2lmKGg9PT1lfHw4PT09aC5ub2RlVHlwZSYmaC5wYXJlbnROb2RlPT09ZSlicmVhaztpZig0PT09Zylmb3IoZz1kLnJldHVybjtudWxsIT09Zzspe3ZhciBrPWcudGFnO2lmKDM9PT1rfHw0PT09aylpZihrPWcuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8saz09PWV8fDg9PT1rLm5vZGVUeXBlJiZrLnBhcmVudE5vZGU9PT1lKXJldHVybjtnPWcucmV0dXJufWZvcig7bnVsbCE9PWg7KXtnPVdjKGgpO2lmKG51bGw9PT1nKXJldHVybjtrPWcudGFnO2lmKDU9PT1rfHw2PT09ayl7ZD1mPWc7Y29udGludWUgYX1oPWgucGFyZW50Tm9kZX19ZD1kLnJldHVybn1KYihmdW5jdGlvbigpe3ZhciBkPWYsZT14YihjKSxnPVtdO1xuYTp7dmFyIGg9ZGYuZ2V0KGEpO2lmKHZvaWQgMCE9PWgpe3ZhciBrPXRkLG49YTtzd2l0Y2goYSl7Y2FzZSBcImtleXByZXNzXCI6aWYoMD09PW9kKGMpKWJyZWFrIGE7Y2FzZSBcImtleWRvd25cIjpjYXNlIFwia2V5dXBcIjprPVJkO2JyZWFrO2Nhc2UgXCJmb2N1c2luXCI6bj1cImZvY3VzXCI7az1GZDticmVhaztjYXNlIFwiZm9jdXNvdXRcIjpuPVwiYmx1clwiO2s9RmQ7YnJlYWs7Y2FzZSBcImJlZm9yZWJsdXJcIjpjYXNlIFwiYWZ0ZXJibHVyXCI6az1GZDticmVhaztjYXNlIFwiY2xpY2tcIjppZigyPT09Yy5idXR0b24pYnJlYWsgYTtjYXNlIFwiYXV4Y2xpY2tcIjpjYXNlIFwiZGJsY2xpY2tcIjpjYXNlIFwibW91c2Vkb3duXCI6Y2FzZSBcIm1vdXNlbW92ZVwiOmNhc2UgXCJtb3VzZXVwXCI6Y2FzZSBcIm1vdXNlb3V0XCI6Y2FzZSBcIm1vdXNlb3ZlclwiOmNhc2UgXCJjb250ZXh0bWVudVwiOms9QmQ7YnJlYWs7Y2FzZSBcImRyYWdcIjpjYXNlIFwiZHJhZ2VuZFwiOmNhc2UgXCJkcmFnZW50ZXJcIjpjYXNlIFwiZHJhZ2V4aXRcIjpjYXNlIFwiZHJhZ2xlYXZlXCI6Y2FzZSBcImRyYWdvdmVyXCI6Y2FzZSBcImRyYWdzdGFydFwiOmNhc2UgXCJkcm9wXCI6az1cbkRkO2JyZWFrO2Nhc2UgXCJ0b3VjaGNhbmNlbFwiOmNhc2UgXCJ0b3VjaGVuZFwiOmNhc2UgXCJ0b3VjaG1vdmVcIjpjYXNlIFwidG91Y2hzdGFydFwiOms9VmQ7YnJlYWs7Y2FzZSAkZTpjYXNlIGFmOmNhc2UgYmY6az1IZDticmVhaztjYXNlIGNmOms9WGQ7YnJlYWs7Y2FzZSBcInNjcm9sbFwiOms9dmQ7YnJlYWs7Y2FzZSBcIndoZWVsXCI6az1aZDticmVhaztjYXNlIFwiY29weVwiOmNhc2UgXCJjdXRcIjpjYXNlIFwicGFzdGVcIjprPUpkO2JyZWFrO2Nhc2UgXCJnb3Rwb2ludGVyY2FwdHVyZVwiOmNhc2UgXCJsb3N0cG9pbnRlcmNhcHR1cmVcIjpjYXNlIFwicG9pbnRlcmNhbmNlbFwiOmNhc2UgXCJwb2ludGVyZG93blwiOmNhc2UgXCJwb2ludGVybW92ZVwiOmNhc2UgXCJwb2ludGVyb3V0XCI6Y2FzZSBcInBvaW50ZXJvdmVyXCI6Y2FzZSBcInBvaW50ZXJ1cFwiOms9VGR9dmFyIHQ9MCE9PShiJjQpLEo9IXQmJlwic2Nyb2xsXCI9PT1hLHg9dD9udWxsIT09aD9oK1wiQ2FwdHVyZVwiOm51bGw6aDt0PVtdO2Zvcih2YXIgdz1kLHU7bnVsbCE9PVxudzspe3U9dzt2YXIgRj11LnN0YXRlTm9kZTs1PT09dS50YWcmJm51bGwhPT1GJiYodT1GLG51bGwhPT14JiYoRj1LYih3LHgpLG51bGwhPUYmJnQucHVzaCh0Zih3LEYsdSkpKSk7aWYoSilicmVhazt3PXcucmV0dXJufTA8dC5sZW5ndGgmJihoPW5ldyBrKGgsbixudWxsLGMsZSksZy5wdXNoKHtldmVudDpoLGxpc3RlbmVyczp0fSkpfX1pZigwPT09KGImNykpe2E6e2g9XCJtb3VzZW92ZXJcIj09PWF8fFwicG9pbnRlcm92ZXJcIj09PWE7az1cIm1vdXNlb3V0XCI9PT1hfHxcInBvaW50ZXJvdXRcIj09PWE7aWYoaCYmYyE9PXdiJiYobj1jLnJlbGF0ZWRUYXJnZXR8fGMuZnJvbUVsZW1lbnQpJiYoV2Mobil8fG5bdWZdKSlicmVhayBhO2lmKGt8fGgpe2g9ZS53aW5kb3c9PT1lP2U6KGg9ZS5vd25lckRvY3VtZW50KT9oLmRlZmF1bHRWaWV3fHxoLnBhcmVudFdpbmRvdzp3aW5kb3c7aWYoayl7aWYobj1jLnJlbGF0ZWRUYXJnZXR8fGMudG9FbGVtZW50LGs9ZCxuPW4/V2Mobik6bnVsbCxudWxsIT09XG5uJiYoSj1WYihuKSxuIT09Snx8NSE9PW4udGFnJiY2IT09bi50YWcpKW49bnVsbH1lbHNlIGs9bnVsbCxuPWQ7aWYoayE9PW4pe3Q9QmQ7Rj1cIm9uTW91c2VMZWF2ZVwiO3g9XCJvbk1vdXNlRW50ZXJcIjt3PVwibW91c2VcIjtpZihcInBvaW50ZXJvdXRcIj09PWF8fFwicG9pbnRlcm92ZXJcIj09PWEpdD1UZCxGPVwib25Qb2ludGVyTGVhdmVcIix4PVwib25Qb2ludGVyRW50ZXJcIix3PVwicG9pbnRlclwiO0o9bnVsbD09az9oOnVlKGspO3U9bnVsbD09bj9oOnVlKG4pO2g9bmV3IHQoRix3K1wibGVhdmVcIixrLGMsZSk7aC50YXJnZXQ9SjtoLnJlbGF0ZWRUYXJnZXQ9dTtGPW51bGw7V2MoZSk9PT1kJiYodD1uZXcgdCh4LHcrXCJlbnRlclwiLG4sYyxlKSx0LnRhcmdldD11LHQucmVsYXRlZFRhcmdldD1KLEY9dCk7Sj1GO2lmKGsmJm4pYjp7dD1rO3g9bjt3PTA7Zm9yKHU9dDt1O3U9dmYodSkpdysrO3U9MDtmb3IoRj14O0Y7Rj12ZihGKSl1Kys7Zm9yKDswPHctdTspdD12Zih0KSx3LS07Zm9yKDswPHUtdzspeD1cbnZmKHgpLHUtLTtmb3IoO3ctLTspe2lmKHQ9PT14fHxudWxsIT09eCYmdD09PXguYWx0ZXJuYXRlKWJyZWFrIGI7dD12Zih0KTt4PXZmKHgpfXQ9bnVsbH1lbHNlIHQ9bnVsbDtudWxsIT09ayYmd2YoZyxoLGssdCwhMSk7bnVsbCE9PW4mJm51bGwhPT1KJiZ3ZihnLEosbix0LCEwKX19fWE6e2g9ZD91ZShkKTp3aW5kb3c7az1oLm5vZGVOYW1lJiZoLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7aWYoXCJzZWxlY3RcIj09PWt8fFwiaW5wdXRcIj09PWsmJlwiZmlsZVwiPT09aC50eXBlKXZhciBuYT12ZTtlbHNlIGlmKG1lKGgpKWlmKHdlKW5hPUZlO2Vsc2V7bmE9RGU7dmFyIHhhPUNlfWVsc2Uoaz1oLm5vZGVOYW1lKSYmXCJpbnB1dFwiPT09ay50b0xvd2VyQ2FzZSgpJiYoXCJjaGVja2JveFwiPT09aC50eXBlfHxcInJhZGlvXCI9PT1oLnR5cGUpJiYobmE9RWUpO2lmKG5hJiYobmE9bmEoYSxkKSkpe25lKGcsbmEsYyxlKTticmVhayBhfXhhJiZ4YShhLGgsZCk7XCJmb2N1c291dFwiPT09YSYmKHhhPWguX3dyYXBwZXJTdGF0ZSkmJlxueGEuY29udHJvbGxlZCYmXCJudW1iZXJcIj09PWgudHlwZSYmY2IoaCxcIm51bWJlclwiLGgudmFsdWUpfXhhPWQ/dWUoZCk6d2luZG93O3N3aXRjaChhKXtjYXNlIFwiZm9jdXNpblwiOmlmKG1lKHhhKXx8XCJ0cnVlXCI9PT14YS5jb250ZW50RWRpdGFibGUpUWU9eGEsUmU9ZCxTZT1udWxsO2JyZWFrO2Nhc2UgXCJmb2N1c291dFwiOlNlPVJlPVFlPW51bGw7YnJlYWs7Y2FzZSBcIm1vdXNlZG93blwiOlRlPSEwO2JyZWFrO2Nhc2UgXCJjb250ZXh0bWVudVwiOmNhc2UgXCJtb3VzZXVwXCI6Y2FzZSBcImRyYWdlbmRcIjpUZT0hMTtVZShnLGMsZSk7YnJlYWs7Y2FzZSBcInNlbGVjdGlvbmNoYW5nZVwiOmlmKFBlKWJyZWFrO2Nhc2UgXCJrZXlkb3duXCI6Y2FzZSBcImtleXVwXCI6VWUoZyxjLGUpfXZhciAkYTtpZihhZSliOntzd2l0Y2goYSl7Y2FzZSBcImNvbXBvc2l0aW9uc3RhcnRcIjp2YXIgYmE9XCJvbkNvbXBvc2l0aW9uU3RhcnRcIjticmVhayBiO2Nhc2UgXCJjb21wb3NpdGlvbmVuZFwiOmJhPVwib25Db21wb3NpdGlvbkVuZFwiO1xuYnJlYWsgYjtjYXNlIFwiY29tcG9zaXRpb251cGRhdGVcIjpiYT1cIm9uQ29tcG9zaXRpb25VcGRhdGVcIjticmVhayBifWJhPXZvaWQgMH1lbHNlIGllP2dlKGEsYykmJihiYT1cIm9uQ29tcG9zaXRpb25FbmRcIik6XCJrZXlkb3duXCI9PT1hJiYyMjk9PT1jLmtleUNvZGUmJihiYT1cIm9uQ29tcG9zaXRpb25TdGFydFwiKTtiYSYmKGRlJiZcImtvXCIhPT1jLmxvY2FsZSYmKGllfHxcIm9uQ29tcG9zaXRpb25TdGFydFwiIT09YmE/XCJvbkNvbXBvc2l0aW9uRW5kXCI9PT1iYSYmaWUmJigkYT1uZCgpKTooa2Q9ZSxsZD1cInZhbHVlXCJpbiBrZD9rZC52YWx1ZTprZC50ZXh0Q29udGVudCxpZT0hMCkpLHhhPW9lKGQsYmEpLDA8eGEubGVuZ3RoJiYoYmE9bmV3IExkKGJhLGEsbnVsbCxjLGUpLGcucHVzaCh7ZXZlbnQ6YmEsbGlzdGVuZXJzOnhhfSksJGE/YmEuZGF0YT0kYTooJGE9aGUoYyksbnVsbCE9PSRhJiYoYmEuZGF0YT0kYSkpKSk7aWYoJGE9Y2U/amUoYSxjKTprZShhLGMpKWQ9b2UoZCxcIm9uQmVmb3JlSW5wdXRcIiksXG4wPGQubGVuZ3RoJiYoZT1uZXcgTGQoXCJvbkJlZm9yZUlucHV0XCIsXCJiZWZvcmVpbnB1dFwiLG51bGwsYyxlKSxnLnB1c2goe2V2ZW50OmUsbGlzdGVuZXJzOmR9KSxlLmRhdGE9JGEpfXNlKGcsYil9KX1mdW5jdGlvbiB0ZihhLGIsYyl7cmV0dXJue2luc3RhbmNlOmEsbGlzdGVuZXI6YixjdXJyZW50VGFyZ2V0OmN9fWZ1bmN0aW9uIG9lKGEsYil7Zm9yKHZhciBjPWIrXCJDYXB0dXJlXCIsZD1bXTtudWxsIT09YTspe3ZhciBlPWEsZj1lLnN0YXRlTm9kZTs1PT09ZS50YWcmJm51bGwhPT1mJiYoZT1mLGY9S2IoYSxjKSxudWxsIT1mJiZkLnVuc2hpZnQodGYoYSxmLGUpKSxmPUtiKGEsYiksbnVsbCE9ZiYmZC5wdXNoKHRmKGEsZixlKSkpO2E9YS5yZXR1cm59cmV0dXJuIGR9ZnVuY3Rpb24gdmYoYSl7aWYobnVsbD09PWEpcmV0dXJuIG51bGw7ZG8gYT1hLnJldHVybjt3aGlsZShhJiY1IT09YS50YWcpO3JldHVybiBhP2E6bnVsbH1cbmZ1bmN0aW9uIHdmKGEsYixjLGQsZSl7Zm9yKHZhciBmPWIuX3JlYWN0TmFtZSxnPVtdO251bGwhPT1jJiZjIT09ZDspe3ZhciBoPWMsaz1oLmFsdGVybmF0ZSxsPWguc3RhdGVOb2RlO2lmKG51bGwhPT1rJiZrPT09ZClicmVhazs1PT09aC50YWcmJm51bGwhPT1sJiYoaD1sLGU/KGs9S2IoYyxmKSxudWxsIT1rJiZnLnVuc2hpZnQodGYoYyxrLGgpKSk6ZXx8KGs9S2IoYyxmKSxudWxsIT1rJiZnLnB1c2godGYoYyxrLGgpKSkpO2M9Yy5yZXR1cm59MCE9PWcubGVuZ3RoJiZhLnB1c2goe2V2ZW50OmIsbGlzdGVuZXJzOmd9KX12YXIgeGY9L1xcclxcbj8vZyx5Zj0vXFx1MDAwMHxcXHVGRkZEL2c7ZnVuY3Rpb24gemYoYSl7cmV0dXJuKFwic3RyaW5nXCI9PT10eXBlb2YgYT9hOlwiXCIrYSkucmVwbGFjZSh4ZixcIlxcblwiKS5yZXBsYWNlKHlmLFwiXCIpfWZ1bmN0aW9uIEFmKGEsYixjKXtiPXpmKGIpO2lmKHpmKGEpIT09YiYmYyl0aHJvdyBFcnJvcihwKDQyNSkpO31mdW5jdGlvbiBCZigpe31cbnZhciBDZj1udWxsLERmPW51bGw7ZnVuY3Rpb24gRWYoYSxiKXtyZXR1cm5cInRleHRhcmVhXCI9PT1hfHxcIm5vc2NyaXB0XCI9PT1hfHxcInN0cmluZ1wiPT09dHlwZW9mIGIuY2hpbGRyZW58fFwibnVtYmVyXCI9PT10eXBlb2YgYi5jaGlsZHJlbnx8XCJvYmplY3RcIj09PXR5cGVvZiBiLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MJiZudWxsIT09Yi5kYW5nZXJvdXNseVNldElubmVySFRNTCYmbnVsbCE9Yi5kYW5nZXJvdXNseVNldElubmVySFRNTC5fX2h0bWx9XG52YXIgRmY9XCJmdW5jdGlvblwiPT09dHlwZW9mIHNldFRpbWVvdXQ/c2V0VGltZW91dDp2b2lkIDAsR2Y9XCJmdW5jdGlvblwiPT09dHlwZW9mIGNsZWFyVGltZW91dD9jbGVhclRpbWVvdXQ6dm9pZCAwLEhmPVwiZnVuY3Rpb25cIj09PXR5cGVvZiBQcm9taXNlP1Byb21pc2U6dm9pZCAwLEpmPVwiZnVuY3Rpb25cIj09PXR5cGVvZiBxdWV1ZU1pY3JvdGFzaz9xdWV1ZU1pY3JvdGFzazpcInVuZGVmaW5lZFwiIT09dHlwZW9mIEhmP2Z1bmN0aW9uKGEpe3JldHVybiBIZi5yZXNvbHZlKG51bGwpLnRoZW4oYSkuY2F0Y2goSWYpfTpGZjtmdW5jdGlvbiBJZihhKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhyb3cgYTt9KX1cbmZ1bmN0aW9uIEtmKGEsYil7dmFyIGM9YixkPTA7ZG97dmFyIGU9Yy5uZXh0U2libGluZzthLnJlbW92ZUNoaWxkKGMpO2lmKGUmJjg9PT1lLm5vZGVUeXBlKWlmKGM9ZS5kYXRhLFwiLyRcIj09PWMpe2lmKDA9PT1kKXthLnJlbW92ZUNoaWxkKGUpO2JkKGIpO3JldHVybn1kLS19ZWxzZVwiJFwiIT09YyYmXCIkP1wiIT09YyYmXCIkIVwiIT09Y3x8ZCsrO2M9ZX13aGlsZShjKTtiZChiKX1mdW5jdGlvbiBMZihhKXtmb3IoO251bGwhPWE7YT1hLm5leHRTaWJsaW5nKXt2YXIgYj1hLm5vZGVUeXBlO2lmKDE9PT1ifHwzPT09YilicmVhaztpZig4PT09Yil7Yj1hLmRhdGE7aWYoXCIkXCI9PT1ifHxcIiQhXCI9PT1ifHxcIiQ/XCI9PT1iKWJyZWFrO2lmKFwiLyRcIj09PWIpcmV0dXJuIG51bGx9fXJldHVybiBhfVxuZnVuY3Rpb24gTWYoYSl7YT1hLnByZXZpb3VzU2libGluZztmb3IodmFyIGI9MDthOyl7aWYoOD09PWEubm9kZVR5cGUpe3ZhciBjPWEuZGF0YTtpZihcIiRcIj09PWN8fFwiJCFcIj09PWN8fFwiJD9cIj09PWMpe2lmKDA9PT1iKXJldHVybiBhO2ItLX1lbHNlXCIvJFwiPT09YyYmYisrfWE9YS5wcmV2aW91c1NpYmxpbmd9cmV0dXJuIG51bGx9dmFyIE5mPU1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpLE9mPVwiX19yZWFjdEZpYmVyJFwiK05mLFBmPVwiX19yZWFjdFByb3BzJFwiK05mLHVmPVwiX19yZWFjdENvbnRhaW5lciRcIitOZixvZj1cIl9fcmVhY3RFdmVudHMkXCIrTmYsUWY9XCJfX3JlYWN0TGlzdGVuZXJzJFwiK05mLFJmPVwiX19yZWFjdEhhbmRsZXMkXCIrTmY7XG5mdW5jdGlvbiBXYyhhKXt2YXIgYj1hW09mXTtpZihiKXJldHVybiBiO2Zvcih2YXIgYz1hLnBhcmVudE5vZGU7Yzspe2lmKGI9Y1t1Zl18fGNbT2ZdKXtjPWIuYWx0ZXJuYXRlO2lmKG51bGwhPT1iLmNoaWxkfHxudWxsIT09YyYmbnVsbCE9PWMuY2hpbGQpZm9yKGE9TWYoYSk7bnVsbCE9PWE7KXtpZihjPWFbT2ZdKXJldHVybiBjO2E9TWYoYSl9cmV0dXJuIGJ9YT1jO2M9YS5wYXJlbnROb2RlfXJldHVybiBudWxsfWZ1bmN0aW9uIENiKGEpe2E9YVtPZl18fGFbdWZdO3JldHVybiFhfHw1IT09YS50YWcmJjYhPT1hLnRhZyYmMTMhPT1hLnRhZyYmMyE9PWEudGFnP251bGw6YX1mdW5jdGlvbiB1ZShhKXtpZig1PT09YS50YWd8fDY9PT1hLnRhZylyZXR1cm4gYS5zdGF0ZU5vZGU7dGhyb3cgRXJyb3IocCgzMykpO31mdW5jdGlvbiBEYihhKXtyZXR1cm4gYVtQZl18fG51bGx9dmFyIFNmPVtdLFRmPS0xO2Z1bmN0aW9uIFVmKGEpe3JldHVybntjdXJyZW50OmF9fVxuZnVuY3Rpb24gRShhKXswPlRmfHwoYS5jdXJyZW50PVNmW1RmXSxTZltUZl09bnVsbCxUZi0tKX1mdW5jdGlvbiBHKGEsYil7VGYrKztTZltUZl09YS5jdXJyZW50O2EuY3VycmVudD1ifXZhciBWZj17fSxIPVVmKFZmKSxXZj1VZighMSksWGY9VmY7ZnVuY3Rpb24gWWYoYSxiKXt2YXIgYz1hLnR5cGUuY29udGV4dFR5cGVzO2lmKCFjKXJldHVybiBWZjt2YXIgZD1hLnN0YXRlTm9kZTtpZihkJiZkLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkVW5tYXNrZWRDaGlsZENvbnRleHQ9PT1iKXJldHVybiBkLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWFza2VkQ2hpbGRDb250ZXh0O3ZhciBlPXt9LGY7Zm9yKGYgaW4gYyllW2ZdPWJbZl07ZCYmKGE9YS5zdGF0ZU5vZGUsYS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZFVubWFza2VkQ2hpbGRDb250ZXh0PWIsYS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1hc2tlZENoaWxkQ29udGV4dD1lKTtyZXR1cm4gZX1cbmZ1bmN0aW9uIFpmKGEpe2E9YS5jaGlsZENvbnRleHRUeXBlcztyZXR1cm4gbnVsbCE9PWEmJnZvaWQgMCE9PWF9ZnVuY3Rpb24gJGYoKXtFKFdmKTtFKEgpfWZ1bmN0aW9uIGFnKGEsYixjKXtpZihILmN1cnJlbnQhPT1WZil0aHJvdyBFcnJvcihwKDE2OCkpO0coSCxiKTtHKFdmLGMpfWZ1bmN0aW9uIGJnKGEsYixjKXt2YXIgZD1hLnN0YXRlTm9kZTtiPWIuY2hpbGRDb250ZXh0VHlwZXM7aWYoXCJmdW5jdGlvblwiIT09dHlwZW9mIGQuZ2V0Q2hpbGRDb250ZXh0KXJldHVybiBjO2Q9ZC5nZXRDaGlsZENvbnRleHQoKTtmb3IodmFyIGUgaW4gZClpZighKGUgaW4gYikpdGhyb3cgRXJyb3IocCgxMDgsUmEoYSl8fFwiVW5rbm93blwiLGUpKTtyZXR1cm4gQSh7fSxjLGQpfVxuZnVuY3Rpb24gY2coYSl7YT0oYT1hLnN0YXRlTm9kZSkmJmEuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNZXJnZWRDaGlsZENvbnRleHR8fFZmO1hmPUguY3VycmVudDtHKEgsYSk7RyhXZixXZi5jdXJyZW50KTtyZXR1cm4hMH1mdW5jdGlvbiBkZyhhLGIsYyl7dmFyIGQ9YS5zdGF0ZU5vZGU7aWYoIWQpdGhyb3cgRXJyb3IocCgxNjkpKTtjPyhhPWJnKGEsYixYZiksZC5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1lcmdlZENoaWxkQ29udGV4dD1hLEUoV2YpLEUoSCksRyhILGEpKTpFKFdmKTtHKFdmLGMpfXZhciBlZz1udWxsLGZnPSExLGdnPSExO2Z1bmN0aW9uIGhnKGEpe251bGw9PT1lZz9lZz1bYV06ZWcucHVzaChhKX1mdW5jdGlvbiBpZyhhKXtmZz0hMDtoZyhhKX1cbmZ1bmN0aW9uIGpnKCl7aWYoIWdnJiZudWxsIT09ZWcpe2dnPSEwO3ZhciBhPTAsYj1DO3RyeXt2YXIgYz1lZztmb3IoQz0xO2E8Yy5sZW5ndGg7YSsrKXt2YXIgZD1jW2FdO2RvIGQ9ZCghMCk7d2hpbGUobnVsbCE9PWQpfWVnPW51bGw7Zmc9ITF9Y2F0Y2goZSl7dGhyb3cgbnVsbCE9PWVnJiYoZWc9ZWcuc2xpY2UoYSsxKSksYWMoZmMsamcpLGU7fWZpbmFsbHl7Qz1iLGdnPSExfX1yZXR1cm4gbnVsbH12YXIga2c9W10sbGc9MCxtZz1udWxsLG5nPTAsb2c9W10scGc9MCxxZz1udWxsLHJnPTEsc2c9XCJcIjtmdW5jdGlvbiB0ZyhhLGIpe2tnW2xnKytdPW5nO2tnW2xnKytdPW1nO21nPWE7bmc9Yn1cbmZ1bmN0aW9uIHVnKGEsYixjKXtvZ1twZysrXT1yZztvZ1twZysrXT1zZztvZ1twZysrXT1xZztxZz1hO3ZhciBkPXJnO2E9c2c7dmFyIGU9MzItb2MoZCktMTtkJj1+KDE8PGUpO2MrPTE7dmFyIGY9MzItb2MoYikrZTtpZigzMDxmKXt2YXIgZz1lLWUlNTtmPShkJigxPDxnKS0xKS50b1N0cmluZygzMik7ZD4+PWc7ZS09ZztyZz0xPDwzMi1vYyhiKStlfGM8PGV8ZDtzZz1mK2F9ZWxzZSByZz0xPDxmfGM8PGV8ZCxzZz1hfWZ1bmN0aW9uIHZnKGEpe251bGwhPT1hLnJldHVybiYmKHRnKGEsMSksdWcoYSwxLDApKX1mdW5jdGlvbiB3ZyhhKXtmb3IoO2E9PT1tZzspbWc9a2dbLS1sZ10sa2dbbGddPW51bGwsbmc9a2dbLS1sZ10sa2dbbGddPW51bGw7Zm9yKDthPT09cWc7KXFnPW9nWy0tcGddLG9nW3BnXT1udWxsLHNnPW9nWy0tcGddLG9nW3BnXT1udWxsLHJnPW9nWy0tcGddLG9nW3BnXT1udWxsfXZhciB4Zz1udWxsLHlnPW51bGwsST0hMSx6Zz1udWxsO1xuZnVuY3Rpb24gQWcoYSxiKXt2YXIgYz1CZyg1LG51bGwsbnVsbCwwKTtjLmVsZW1lbnRUeXBlPVwiREVMRVRFRFwiO2Muc3RhdGVOb2RlPWI7Yy5yZXR1cm49YTtiPWEuZGVsZXRpb25zO251bGw9PT1iPyhhLmRlbGV0aW9ucz1bY10sYS5mbGFnc3w9MTYpOmIucHVzaChjKX1cbmZ1bmN0aW9uIENnKGEsYil7c3dpdGNoKGEudGFnKXtjYXNlIDU6dmFyIGM9YS50eXBlO2I9MSE9PWIubm9kZVR5cGV8fGMudG9Mb3dlckNhc2UoKSE9PWIubm9kZU5hbWUudG9Mb3dlckNhc2UoKT9udWxsOmI7cmV0dXJuIG51bGwhPT1iPyhhLnN0YXRlTm9kZT1iLHhnPWEseWc9TGYoYi5maXJzdENoaWxkKSwhMCk6ITE7Y2FzZSA2OnJldHVybiBiPVwiXCI9PT1hLnBlbmRpbmdQcm9wc3x8MyE9PWIubm9kZVR5cGU/bnVsbDpiLG51bGwhPT1iPyhhLnN0YXRlTm9kZT1iLHhnPWEseWc9bnVsbCwhMCk6ITE7Y2FzZSAxMzpyZXR1cm4gYj04IT09Yi5ub2RlVHlwZT9udWxsOmIsbnVsbCE9PWI/KGM9bnVsbCE9PXFnP3tpZDpyZyxvdmVyZmxvdzpzZ306bnVsbCxhLm1lbW9pemVkU3RhdGU9e2RlaHlkcmF0ZWQ6Yix0cmVlQ29udGV4dDpjLHJldHJ5TGFuZToxMDczNzQxODI0fSxjPUJnKDE4LG51bGwsbnVsbCwwKSxjLnN0YXRlTm9kZT1iLGMucmV0dXJuPWEsYS5jaGlsZD1jLHhnPWEseWc9XG5udWxsLCEwKTohMTtkZWZhdWx0OnJldHVybiExfX1mdW5jdGlvbiBEZyhhKXtyZXR1cm4gMCE9PShhLm1vZGUmMSkmJjA9PT0oYS5mbGFncyYxMjgpfWZ1bmN0aW9uIEVnKGEpe2lmKEkpe3ZhciBiPXlnO2lmKGIpe3ZhciBjPWI7aWYoIUNnKGEsYikpe2lmKERnKGEpKXRocm93IEVycm9yKHAoNDE4KSk7Yj1MZihjLm5leHRTaWJsaW5nKTt2YXIgZD14ZztiJiZDZyhhLGIpP0FnKGQsYyk6KGEuZmxhZ3M9YS5mbGFncyYtNDA5N3wyLEk9ITEseGc9YSl9fWVsc2V7aWYoRGcoYSkpdGhyb3cgRXJyb3IocCg0MTgpKTthLmZsYWdzPWEuZmxhZ3MmLTQwOTd8MjtJPSExO3hnPWF9fX1mdW5jdGlvbiBGZyhhKXtmb3IoYT1hLnJldHVybjtudWxsIT09YSYmNSE9PWEudGFnJiYzIT09YS50YWcmJjEzIT09YS50YWc7KWE9YS5yZXR1cm47eGc9YX1cbmZ1bmN0aW9uIEdnKGEpe2lmKGEhPT14ZylyZXR1cm4hMTtpZighSSlyZXR1cm4gRmcoYSksST0hMCwhMTt2YXIgYjsoYj0zIT09YS50YWcpJiYhKGI9NSE9PWEudGFnKSYmKGI9YS50eXBlLGI9XCJoZWFkXCIhPT1iJiZcImJvZHlcIiE9PWImJiFFZihhLnR5cGUsYS5tZW1vaXplZFByb3BzKSk7aWYoYiYmKGI9eWcpKXtpZihEZyhhKSl0aHJvdyBIZygpLEVycm9yKHAoNDE4KSk7Zm9yKDtiOylBZyhhLGIpLGI9TGYoYi5uZXh0U2libGluZyl9RmcoYSk7aWYoMTM9PT1hLnRhZyl7YT1hLm1lbW9pemVkU3RhdGU7YT1udWxsIT09YT9hLmRlaHlkcmF0ZWQ6bnVsbDtpZighYSl0aHJvdyBFcnJvcihwKDMxNykpO2E6e2E9YS5uZXh0U2libGluZztmb3IoYj0wO2E7KXtpZig4PT09YS5ub2RlVHlwZSl7dmFyIGM9YS5kYXRhO2lmKFwiLyRcIj09PWMpe2lmKDA9PT1iKXt5Zz1MZihhLm5leHRTaWJsaW5nKTticmVhayBhfWItLX1lbHNlXCIkXCIhPT1jJiZcIiQhXCIhPT1jJiZcIiQ/XCIhPT1jfHxiKyt9YT1hLm5leHRTaWJsaW5nfXlnPVxubnVsbH19ZWxzZSB5Zz14Zz9MZihhLnN0YXRlTm9kZS5uZXh0U2libGluZyk6bnVsbDtyZXR1cm4hMH1mdW5jdGlvbiBIZygpe2Zvcih2YXIgYT15ZzthOylhPUxmKGEubmV4dFNpYmxpbmcpfWZ1bmN0aW9uIElnKCl7eWc9eGc9bnVsbDtJPSExfWZ1bmN0aW9uIEpnKGEpe251bGw9PT16Zz96Zz1bYV06emcucHVzaChhKX12YXIgS2c9dWEuUmVhY3RDdXJyZW50QmF0Y2hDb25maWc7ZnVuY3Rpb24gTGcoYSxiKXtpZihhJiZhLmRlZmF1bHRQcm9wcyl7Yj1BKHt9LGIpO2E9YS5kZWZhdWx0UHJvcHM7Zm9yKHZhciBjIGluIGEpdm9pZCAwPT09YltjXSYmKGJbY109YVtjXSk7cmV0dXJuIGJ9cmV0dXJuIGJ9dmFyIE1nPVVmKG51bGwpLE5nPW51bGwsT2c9bnVsbCxQZz1udWxsO2Z1bmN0aW9uIFFnKCl7UGc9T2c9Tmc9bnVsbH1mdW5jdGlvbiBSZyhhKXt2YXIgYj1NZy5jdXJyZW50O0UoTWcpO2EuX2N1cnJlbnRWYWx1ZT1ifVxuZnVuY3Rpb24gU2coYSxiLGMpe2Zvcig7bnVsbCE9PWE7KXt2YXIgZD1hLmFsdGVybmF0ZTsoYS5jaGlsZExhbmVzJmIpIT09Yj8oYS5jaGlsZExhbmVzfD1iLG51bGwhPT1kJiYoZC5jaGlsZExhbmVzfD1iKSk6bnVsbCE9PWQmJihkLmNoaWxkTGFuZXMmYikhPT1iJiYoZC5jaGlsZExhbmVzfD1iKTtpZihhPT09YylicmVhazthPWEucmV0dXJufX1mdW5jdGlvbiBUZyhhLGIpe05nPWE7UGc9T2c9bnVsbDthPWEuZGVwZW5kZW5jaWVzO251bGwhPT1hJiZudWxsIT09YS5maXJzdENvbnRleHQmJigwIT09KGEubGFuZXMmYikmJihVZz0hMCksYS5maXJzdENvbnRleHQ9bnVsbCl9XG5mdW5jdGlvbiBWZyhhKXt2YXIgYj1hLl9jdXJyZW50VmFsdWU7aWYoUGchPT1hKWlmKGE9e2NvbnRleHQ6YSxtZW1vaXplZFZhbHVlOmIsbmV4dDpudWxsfSxudWxsPT09T2cpe2lmKG51bGw9PT1OZyl0aHJvdyBFcnJvcihwKDMwOCkpO09nPWE7TmcuZGVwZW5kZW5jaWVzPXtsYW5lczowLGZpcnN0Q29udGV4dDphfX1lbHNlIE9nPU9nLm5leHQ9YTtyZXR1cm4gYn12YXIgV2c9bnVsbDtmdW5jdGlvbiBYZyhhKXtudWxsPT09V2c/V2c9W2FdOldnLnB1c2goYSl9ZnVuY3Rpb24gWWcoYSxiLGMsZCl7dmFyIGU9Yi5pbnRlcmxlYXZlZDtudWxsPT09ZT8oYy5uZXh0PWMsWGcoYikpOihjLm5leHQ9ZS5uZXh0LGUubmV4dD1jKTtiLmludGVybGVhdmVkPWM7cmV0dXJuIFpnKGEsZCl9XG5mdW5jdGlvbiBaZyhhLGIpe2EubGFuZXN8PWI7dmFyIGM9YS5hbHRlcm5hdGU7bnVsbCE9PWMmJihjLmxhbmVzfD1iKTtjPWE7Zm9yKGE9YS5yZXR1cm47bnVsbCE9PWE7KWEuY2hpbGRMYW5lc3w9YixjPWEuYWx0ZXJuYXRlLG51bGwhPT1jJiYoYy5jaGlsZExhbmVzfD1iKSxjPWEsYT1hLnJldHVybjtyZXR1cm4gMz09PWMudGFnP2Muc3RhdGVOb2RlOm51bGx9dmFyICRnPSExO2Z1bmN0aW9uIGFoKGEpe2EudXBkYXRlUXVldWU9e2Jhc2VTdGF0ZTphLm1lbW9pemVkU3RhdGUsZmlyc3RCYXNlVXBkYXRlOm51bGwsbGFzdEJhc2VVcGRhdGU6bnVsbCxzaGFyZWQ6e3BlbmRpbmc6bnVsbCxpbnRlcmxlYXZlZDpudWxsLGxhbmVzOjB9LGVmZmVjdHM6bnVsbH19XG5mdW5jdGlvbiBiaChhLGIpe2E9YS51cGRhdGVRdWV1ZTtiLnVwZGF0ZVF1ZXVlPT09YSYmKGIudXBkYXRlUXVldWU9e2Jhc2VTdGF0ZTphLmJhc2VTdGF0ZSxmaXJzdEJhc2VVcGRhdGU6YS5maXJzdEJhc2VVcGRhdGUsbGFzdEJhc2VVcGRhdGU6YS5sYXN0QmFzZVVwZGF0ZSxzaGFyZWQ6YS5zaGFyZWQsZWZmZWN0czphLmVmZmVjdHN9KX1mdW5jdGlvbiBjaChhLGIpe3JldHVybntldmVudFRpbWU6YSxsYW5lOmIsdGFnOjAscGF5bG9hZDpudWxsLGNhbGxiYWNrOm51bGwsbmV4dDpudWxsfX1cbmZ1bmN0aW9uIGRoKGEsYixjKXt2YXIgZD1hLnVwZGF0ZVF1ZXVlO2lmKG51bGw9PT1kKXJldHVybiBudWxsO2Q9ZC5zaGFyZWQ7aWYoMCE9PShLJjIpKXt2YXIgZT1kLnBlbmRpbmc7bnVsbD09PWU/Yi5uZXh0PWI6KGIubmV4dD1lLm5leHQsZS5uZXh0PWIpO2QucGVuZGluZz1iO3JldHVybiBaZyhhLGMpfWU9ZC5pbnRlcmxlYXZlZDtudWxsPT09ZT8oYi5uZXh0PWIsWGcoZCkpOihiLm5leHQ9ZS5uZXh0LGUubmV4dD1iKTtkLmludGVybGVhdmVkPWI7cmV0dXJuIFpnKGEsYyl9ZnVuY3Rpb24gZWgoYSxiLGMpe2I9Yi51cGRhdGVRdWV1ZTtpZihudWxsIT09YiYmKGI9Yi5zaGFyZWQsMCE9PShjJjQxOTQyNDApKSl7dmFyIGQ9Yi5sYW5lcztkJj1hLnBlbmRpbmdMYW5lcztjfD1kO2IubGFuZXM9YztDYyhhLGMpfX1cbmZ1bmN0aW9uIGZoKGEsYil7dmFyIGM9YS51cGRhdGVRdWV1ZSxkPWEuYWx0ZXJuYXRlO2lmKG51bGwhPT1kJiYoZD1kLnVwZGF0ZVF1ZXVlLGM9PT1kKSl7dmFyIGU9bnVsbCxmPW51bGw7Yz1jLmZpcnN0QmFzZVVwZGF0ZTtpZihudWxsIT09Yyl7ZG97dmFyIGc9e2V2ZW50VGltZTpjLmV2ZW50VGltZSxsYW5lOmMubGFuZSx0YWc6Yy50YWcscGF5bG9hZDpjLnBheWxvYWQsY2FsbGJhY2s6Yy5jYWxsYmFjayxuZXh0Om51bGx9O251bGw9PT1mP2U9Zj1nOmY9Zi5uZXh0PWc7Yz1jLm5leHR9d2hpbGUobnVsbCE9PWMpO251bGw9PT1mP2U9Zj1iOmY9Zi5uZXh0PWJ9ZWxzZSBlPWY9YjtjPXtiYXNlU3RhdGU6ZC5iYXNlU3RhdGUsZmlyc3RCYXNlVXBkYXRlOmUsbGFzdEJhc2VVcGRhdGU6ZixzaGFyZWQ6ZC5zaGFyZWQsZWZmZWN0czpkLmVmZmVjdHN9O2EudXBkYXRlUXVldWU9YztyZXR1cm59YT1jLmxhc3RCYXNlVXBkYXRlO251bGw9PT1hP2MuZmlyc3RCYXNlVXBkYXRlPWI6YS5uZXh0PVxuYjtjLmxhc3RCYXNlVXBkYXRlPWJ9XG5mdW5jdGlvbiBnaChhLGIsYyxkKXt2YXIgZT1hLnVwZGF0ZVF1ZXVlOyRnPSExO3ZhciBmPWUuZmlyc3RCYXNlVXBkYXRlLGc9ZS5sYXN0QmFzZVVwZGF0ZSxoPWUuc2hhcmVkLnBlbmRpbmc7aWYobnVsbCE9PWgpe2Uuc2hhcmVkLnBlbmRpbmc9bnVsbDt2YXIgaz1oLGw9ay5uZXh0O2submV4dD1udWxsO251bGw9PT1nP2Y9bDpnLm5leHQ9bDtnPWs7dmFyIG09YS5hbHRlcm5hdGU7bnVsbCE9PW0mJihtPW0udXBkYXRlUXVldWUsaD1tLmxhc3RCYXNlVXBkYXRlLGghPT1nJiYobnVsbD09PWg/bS5maXJzdEJhc2VVcGRhdGU9bDpoLm5leHQ9bCxtLmxhc3RCYXNlVXBkYXRlPWspKX1pZihudWxsIT09Zil7dmFyIHE9ZS5iYXNlU3RhdGU7Zz0wO209bD1rPW51bGw7aD1mO2Rve3ZhciByPWgubGFuZSx5PWguZXZlbnRUaW1lO2lmKChkJnIpPT09cil7bnVsbCE9PW0mJihtPW0ubmV4dD17ZXZlbnRUaW1lOnksbGFuZTowLHRhZzpoLnRhZyxwYXlsb2FkOmgucGF5bG9hZCxjYWxsYmFjazpoLmNhbGxiYWNrLFxubmV4dDpudWxsfSk7YTp7dmFyIG49YSx0PWg7cj1iO3k9Yztzd2l0Y2godC50YWcpe2Nhc2UgMTpuPXQucGF5bG9hZDtpZihcImZ1bmN0aW9uXCI9PT10eXBlb2Ygbil7cT1uLmNhbGwoeSxxLHIpO2JyZWFrIGF9cT1uO2JyZWFrIGE7Y2FzZSAzOm4uZmxhZ3M9bi5mbGFncyYtNjU1Mzd8MTI4O2Nhc2UgMDpuPXQucGF5bG9hZDtyPVwiZnVuY3Rpb25cIj09PXR5cGVvZiBuP24uY2FsbCh5LHEscik6bjtpZihudWxsPT09cnx8dm9pZCAwPT09cilicmVhayBhO3E9QSh7fSxxLHIpO2JyZWFrIGE7Y2FzZSAyOiRnPSEwfX1udWxsIT09aC5jYWxsYmFjayYmMCE9PWgubGFuZSYmKGEuZmxhZ3N8PTY0LHI9ZS5lZmZlY3RzLG51bGw9PT1yP2UuZWZmZWN0cz1baF06ci5wdXNoKGgpKX1lbHNlIHk9e2V2ZW50VGltZTp5LGxhbmU6cix0YWc6aC50YWcscGF5bG9hZDpoLnBheWxvYWQsY2FsbGJhY2s6aC5jYWxsYmFjayxuZXh0Om51bGx9LG51bGw9PT1tPyhsPW09eSxrPXEpOm09bS5uZXh0PXksZ3w9cjtcbmg9aC5uZXh0O2lmKG51bGw9PT1oKWlmKGg9ZS5zaGFyZWQucGVuZGluZyxudWxsPT09aClicmVhaztlbHNlIHI9aCxoPXIubmV4dCxyLm5leHQ9bnVsbCxlLmxhc3RCYXNlVXBkYXRlPXIsZS5zaGFyZWQucGVuZGluZz1udWxsfXdoaWxlKDEpO251bGw9PT1tJiYoaz1xKTtlLmJhc2VTdGF0ZT1rO2UuZmlyc3RCYXNlVXBkYXRlPWw7ZS5sYXN0QmFzZVVwZGF0ZT1tO2I9ZS5zaGFyZWQuaW50ZXJsZWF2ZWQ7aWYobnVsbCE9PWIpe2U9YjtkbyBnfD1lLmxhbmUsZT1lLm5leHQ7d2hpbGUoZSE9PWIpfWVsc2UgbnVsbD09PWYmJihlLnNoYXJlZC5sYW5lcz0wKTtoaHw9ZzthLmxhbmVzPWc7YS5tZW1vaXplZFN0YXRlPXF9fVxuZnVuY3Rpb24gaWgoYSxiLGMpe2E9Yi5lZmZlY3RzO2IuZWZmZWN0cz1udWxsO2lmKG51bGwhPT1hKWZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPWFbYl0sZT1kLmNhbGxiYWNrO2lmKG51bGwhPT1lKXtkLmNhbGxiYWNrPW51bGw7ZD1jO2lmKFwiZnVuY3Rpb25cIiE9PXR5cGVvZiBlKXRocm93IEVycm9yKHAoMTkxLGUpKTtlLmNhbGwoZCl9fX12YXIgamg9KG5ldyBhYS5Db21wb25lbnQpLnJlZnM7ZnVuY3Rpb24ga2goYSxiLGMsZCl7Yj1hLm1lbW9pemVkU3RhdGU7Yz1jKGQsYik7Yz1udWxsPT09Y3x8dm9pZCAwPT09Yz9iOkEoe30sYixjKTthLm1lbW9pemVkU3RhdGU9YzswPT09YS5sYW5lcyYmKGEudXBkYXRlUXVldWUuYmFzZVN0YXRlPWMpfVxudmFyIG5oPXtpc01vdW50ZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuKGE9YS5fcmVhY3RJbnRlcm5hbHMpP1ZiKGEpPT09YTohMX0sZW5xdWV1ZVNldFN0YXRlOmZ1bmN0aW9uKGEsYixjKXthPWEuX3JlYWN0SW50ZXJuYWxzO3ZhciBkPUwoKSxlPWxoKGEpLGY9Y2goZCxlKTtmLnBheWxvYWQ9Yjt2b2lkIDAhPT1jJiZudWxsIT09YyYmKGYuY2FsbGJhY2s9Yyk7Yj1kaChhLGYsZSk7bnVsbCE9PWImJihtaChiLGEsZSxkKSxlaChiLGEsZSkpfSxlbnF1ZXVlUmVwbGFjZVN0YXRlOmZ1bmN0aW9uKGEsYixjKXthPWEuX3JlYWN0SW50ZXJuYWxzO3ZhciBkPUwoKSxlPWxoKGEpLGY9Y2goZCxlKTtmLnRhZz0xO2YucGF5bG9hZD1iO3ZvaWQgMCE9PWMmJm51bGwhPT1jJiYoZi5jYWxsYmFjaz1jKTtiPWRoKGEsZixlKTtudWxsIT09YiYmKG1oKGIsYSxlLGQpLGVoKGIsYSxlKSl9LGVucXVldWVGb3JjZVVwZGF0ZTpmdW5jdGlvbihhLGIpe2E9YS5fcmVhY3RJbnRlcm5hbHM7dmFyIGM9TCgpLGQ9XG5saChhKSxlPWNoKGMsZCk7ZS50YWc9Mjt2b2lkIDAhPT1iJiZudWxsIT09YiYmKGUuY2FsbGJhY2s9Yik7Yj1kaChhLGUsZCk7bnVsbCE9PWImJihtaChiLGEsZCxjKSxlaChiLGEsZCkpfX07ZnVuY3Rpb24gb2goYSxiLGMsZCxlLGYsZyl7YT1hLnN0YXRlTm9kZTtyZXR1cm5cImZ1bmN0aW9uXCI9PT10eXBlb2YgYS5zaG91bGRDb21wb25lbnRVcGRhdGU/YS5zaG91bGRDb21wb25lbnRVcGRhdGUoZCxmLGcpOmIucHJvdG90eXBlJiZiLnByb3RvdHlwZS5pc1B1cmVSZWFjdENvbXBvbmVudD8hSWUoYyxkKXx8IUllKGUsZik6ITB9XG5mdW5jdGlvbiBwaChhLGIsYyl7dmFyIGQ9ITEsZT1WZjt2YXIgZj1iLmNvbnRleHRUeXBlO1wib2JqZWN0XCI9PT10eXBlb2YgZiYmbnVsbCE9PWY/Zj1WZyhmKTooZT1aZihiKT9YZjpILmN1cnJlbnQsZD1iLmNvbnRleHRUeXBlcyxmPShkPW51bGwhPT1kJiZ2b2lkIDAhPT1kKT9ZZihhLGUpOlZmKTtiPW5ldyBiKGMsZik7YS5tZW1vaXplZFN0YXRlPW51bGwhPT1iLnN0YXRlJiZ2b2lkIDAhPT1iLnN0YXRlP2Iuc3RhdGU6bnVsbDtiLnVwZGF0ZXI9bmg7YS5zdGF0ZU5vZGU9YjtiLl9yZWFjdEludGVybmFscz1hO2QmJihhPWEuc3RhdGVOb2RlLGEuX19yZWFjdEludGVybmFsTWVtb2l6ZWRVbm1hc2tlZENoaWxkQ29udGV4dD1lLGEuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNYXNrZWRDaGlsZENvbnRleHQ9Zik7cmV0dXJuIGJ9XG5mdW5jdGlvbiBxaChhLGIsYyxkKXthPWIuc3RhdGU7XCJmdW5jdGlvblwiPT09dHlwZW9mIGIuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyYmYi5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKGMsZCk7XCJmdW5jdGlvblwiPT09dHlwZW9mIGIuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMmJmIuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoYyxkKTtiLnN0YXRlIT09YSYmbmguZW5xdWV1ZVJlcGxhY2VTdGF0ZShiLGIuc3RhdGUsbnVsbCl9XG5mdW5jdGlvbiByaChhLGIsYyxkKXt2YXIgZT1hLnN0YXRlTm9kZTtlLnByb3BzPWM7ZS5zdGF0ZT1hLm1lbW9pemVkU3RhdGU7ZS5yZWZzPWpoO2FoKGEpO3ZhciBmPWIuY29udGV4dFR5cGU7XCJvYmplY3RcIj09PXR5cGVvZiBmJiZudWxsIT09Zj9lLmNvbnRleHQ9VmcoZik6KGY9WmYoYik/WGY6SC5jdXJyZW50LGUuY29udGV4dD1ZZihhLGYpKTtlLnN0YXRlPWEubWVtb2l6ZWRTdGF0ZTtmPWIuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzO1wiZnVuY3Rpb25cIj09PXR5cGVvZiBmJiYoa2goYSxiLGYsYyksZS5zdGF0ZT1hLm1lbW9pemVkU3RhdGUpO1wiZnVuY3Rpb25cIj09PXR5cGVvZiBiLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wc3x8XCJmdW5jdGlvblwiPT09dHlwZW9mIGUuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGV8fFwiZnVuY3Rpb25cIiE9PXR5cGVvZiBlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQmJlwiZnVuY3Rpb25cIiE9PXR5cGVvZiBlLmNvbXBvbmVudFdpbGxNb3VudHx8KGI9ZS5zdGF0ZSxcblwiZnVuY3Rpb25cIj09PXR5cGVvZiBlLmNvbXBvbmVudFdpbGxNb3VudCYmZS5jb21wb25lbnRXaWxsTW91bnQoKSxcImZ1bmN0aW9uXCI9PT10eXBlb2YgZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50JiZlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQoKSxiIT09ZS5zdGF0ZSYmbmguZW5xdWV1ZVJlcGxhY2VTdGF0ZShlLGUuc3RhdGUsbnVsbCksZ2goYSxjLGUsZCksZS5zdGF0ZT1hLm1lbW9pemVkU3RhdGUpO1wiZnVuY3Rpb25cIj09PXR5cGVvZiBlLmNvbXBvbmVudERpZE1vdW50JiYoYS5mbGFnc3w9NDE5NDMwOCl9XG5mdW5jdGlvbiBzaChhLGIsYyl7YT1jLnJlZjtpZihudWxsIT09YSYmXCJmdW5jdGlvblwiIT09dHlwZW9mIGEmJlwib2JqZWN0XCIhPT10eXBlb2YgYSl7aWYoYy5fb3duZXIpe2M9Yy5fb3duZXI7aWYoYyl7aWYoMSE9PWMudGFnKXRocm93IEVycm9yKHAoMzA5KSk7dmFyIGQ9Yy5zdGF0ZU5vZGV9aWYoIWQpdGhyb3cgRXJyb3IocCgxNDcsYSkpO3ZhciBlPWQsZj1cIlwiK2E7aWYobnVsbCE9PWImJm51bGwhPT1iLnJlZiYmXCJmdW5jdGlvblwiPT09dHlwZW9mIGIucmVmJiZiLnJlZi5fc3RyaW5nUmVmPT09ZilyZXR1cm4gYi5yZWY7Yj1mdW5jdGlvbihhKXt2YXIgYj1lLnJlZnM7Yj09PWpoJiYoYj1lLnJlZnM9e30pO251bGw9PT1hP2RlbGV0ZSBiW2ZdOmJbZl09YX07Yi5fc3RyaW5nUmVmPWY7cmV0dXJuIGJ9aWYoXCJzdHJpbmdcIiE9PXR5cGVvZiBhKXRocm93IEVycm9yKHAoMjg0KSk7aWYoIWMuX293bmVyKXRocm93IEVycm9yKHAoMjkwLGEpKTt9cmV0dXJuIGF9XG5mdW5jdGlvbiB0aChhLGIpe2E9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGIpO3Rocm93IEVycm9yKHAoMzEsXCJbb2JqZWN0IE9iamVjdF1cIj09PWE/XCJvYmplY3Qgd2l0aCBrZXlzIHtcIitPYmplY3Qua2V5cyhiKS5qb2luKFwiLCBcIikrXCJ9XCI6YSkpO31mdW5jdGlvbiB1aChhKXt2YXIgYj1hLl9pbml0O3JldHVybiBiKGEuX3BheWxvYWQpfVxuZnVuY3Rpb24gdmgoYSl7ZnVuY3Rpb24gYihiLGMpe2lmKGEpe3ZhciBkPWIuZGVsZXRpb25zO251bGw9PT1kPyhiLmRlbGV0aW9ucz1bY10sYi5mbGFnc3w9MTYpOmQucHVzaChjKX19ZnVuY3Rpb24gYyhjLGQpe2lmKCFhKXJldHVybiBudWxsO2Zvcig7bnVsbCE9PWQ7KWIoYyxkKSxkPWQuc2libGluZztyZXR1cm4gbnVsbH1mdW5jdGlvbiBkKGEsYil7Zm9yKGE9bmV3IE1hcDtudWxsIT09YjspbnVsbCE9PWIua2V5P2Euc2V0KGIua2V5LGIpOmEuc2V0KGIuaW5kZXgsYiksYj1iLnNpYmxpbmc7cmV0dXJuIGF9ZnVuY3Rpb24gZShhLGIpe2E9d2goYSxiKTthLmluZGV4PTA7YS5zaWJsaW5nPW51bGw7cmV0dXJuIGF9ZnVuY3Rpb24gZihiLGMsZCl7Yi5pbmRleD1kO2lmKCFhKXJldHVybiBiLmZsYWdzfD0xMDQ4NTc2LGM7ZD1iLmFsdGVybmF0ZTtpZihudWxsIT09ZClyZXR1cm4gZD1kLmluZGV4LGQ8Yz8oYi5mbGFnc3w9MixjKTpkO2IuZmxhZ3N8PTI7cmV0dXJuIGN9ZnVuY3Rpb24gZyhiKXthJiZcbm51bGw9PT1iLmFsdGVybmF0ZSYmKGIuZmxhZ3N8PTIpO3JldHVybiBifWZ1bmN0aW9uIGgoYSxiLGMsZCl7aWYobnVsbD09PWJ8fDYhPT1iLnRhZylyZXR1cm4gYj14aChjLGEubW9kZSxkKSxiLnJldHVybj1hLGI7Yj1lKGIsYyk7Yi5yZXR1cm49YTtyZXR1cm4gYn1mdW5jdGlvbiBrKGEsYixjLGQpe3ZhciBmPWMudHlwZTtpZihmPT09eWEpcmV0dXJuIG0oYSxiLGMucHJvcHMuY2hpbGRyZW4sZCxjLmtleSk7aWYobnVsbCE9PWImJihiLmVsZW1lbnRUeXBlPT09Znx8XCJvYmplY3RcIj09PXR5cGVvZiBmJiZudWxsIT09ZiYmZi4kJHR5cGVvZj09PUhhJiZ1aChmKT09PWIudHlwZSkpcmV0dXJuIGQ9ZShiLGMucHJvcHMpLGQucmVmPXNoKGEsYixjKSxkLnJldHVybj1hLGQ7ZD15aChjLnR5cGUsYy5rZXksYy5wcm9wcyxudWxsLGEubW9kZSxkKTtkLnJlZj1zaChhLGIsYyk7ZC5yZXR1cm49YTtyZXR1cm4gZH1mdW5jdGlvbiBsKGEsYixjLGQpe2lmKG51bGw9PT1ifHw0IT09Yi50YWd8fFxuYi5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyE9PWMuY29udGFpbmVySW5mb3x8Yi5zdGF0ZU5vZGUuaW1wbGVtZW50YXRpb24hPT1jLmltcGxlbWVudGF0aW9uKXJldHVybiBiPXpoKGMsYS5tb2RlLGQpLGIucmV0dXJuPWEsYjtiPWUoYixjLmNoaWxkcmVufHxbXSk7Yi5yZXR1cm49YTtyZXR1cm4gYn1mdW5jdGlvbiBtKGEsYixjLGQsZil7aWYobnVsbD09PWJ8fDchPT1iLnRhZylyZXR1cm4gYj1BaChjLGEubW9kZSxkLGYpLGIucmV0dXJuPWEsYjtiPWUoYixjKTtiLnJldHVybj1hO3JldHVybiBifWZ1bmN0aW9uIHEoYSxiLGMpe2lmKFwic3RyaW5nXCI9PT10eXBlb2YgYiYmXCJcIiE9PWJ8fFwibnVtYmVyXCI9PT10eXBlb2YgYilyZXR1cm4gYj14aChcIlwiK2IsYS5tb2RlLGMpLGIucmV0dXJuPWEsYjtpZihcIm9iamVjdFwiPT09dHlwZW9mIGImJm51bGwhPT1iKXtzd2l0Y2goYi4kJHR5cGVvZil7Y2FzZSB2YTpyZXR1cm4gYz15aChiLnR5cGUsYi5rZXksYi5wcm9wcyxudWxsLGEubW9kZSxjKSxcbmMucmVmPXNoKGEsbnVsbCxiKSxjLnJldHVybj1hLGM7Y2FzZSB3YTpyZXR1cm4gYj16aChiLGEubW9kZSxjKSxiLnJldHVybj1hLGI7Y2FzZSBIYTp2YXIgZD1iLl9pbml0O3JldHVybiBxKGEsZChiLl9wYXlsb2FkKSxjKX1pZihlYihiKXx8S2EoYikpcmV0dXJuIGI9QWgoYixhLm1vZGUsYyxudWxsKSxiLnJldHVybj1hLGI7dGgoYSxiKX1yZXR1cm4gbnVsbH1mdW5jdGlvbiByKGEsYixjLGQpe3ZhciBlPW51bGwhPT1iP2Iua2V5Om51bGw7aWYoXCJzdHJpbmdcIj09PXR5cGVvZiBjJiZcIlwiIT09Y3x8XCJudW1iZXJcIj09PXR5cGVvZiBjKXJldHVybiBudWxsIT09ZT9udWxsOmgoYSxiLFwiXCIrYyxkKTtpZihcIm9iamVjdFwiPT09dHlwZW9mIGMmJm51bGwhPT1jKXtzd2l0Y2goYy4kJHR5cGVvZil7Y2FzZSB2YTpyZXR1cm4gYy5rZXk9PT1lP2soYSxiLGMsZCk6bnVsbDtjYXNlIHdhOnJldHVybiBjLmtleT09PWU/bChhLGIsYyxkKTpudWxsO2Nhc2UgSGE6cmV0dXJuIGU9Yy5faW5pdCxyKGEsXG5iLGUoYy5fcGF5bG9hZCksZCl9aWYoZWIoYyl8fEthKGMpKXJldHVybiBudWxsIT09ZT9udWxsOm0oYSxiLGMsZCxudWxsKTt0aChhLGMpfXJldHVybiBudWxsfWZ1bmN0aW9uIHkoYSxiLGMsZCxlKXtpZihcInN0cmluZ1wiPT09dHlwZW9mIGQmJlwiXCIhPT1kfHxcIm51bWJlclwiPT09dHlwZW9mIGQpcmV0dXJuIGE9YS5nZXQoYyl8fG51bGwsaChiLGEsXCJcIitkLGUpO2lmKFwib2JqZWN0XCI9PT10eXBlb2YgZCYmbnVsbCE9PWQpe3N3aXRjaChkLiQkdHlwZW9mKXtjYXNlIHZhOnJldHVybiBhPWEuZ2V0KG51bGw9PT1kLmtleT9jOmQua2V5KXx8bnVsbCxrKGIsYSxkLGUpO2Nhc2Ugd2E6cmV0dXJuIGE9YS5nZXQobnVsbD09PWQua2V5P2M6ZC5rZXkpfHxudWxsLGwoYixhLGQsZSk7Y2FzZSBIYTp2YXIgZj1kLl9pbml0O3JldHVybiB5KGEsYixjLGYoZC5fcGF5bG9hZCksZSl9aWYoZWIoZCl8fEthKGQpKXJldHVybiBhPWEuZ2V0KGMpfHxudWxsLG0oYixhLGQsZSxudWxsKTt0aChiLGQpfXJldHVybiBudWxsfVxuZnVuY3Rpb24gbihlLGcsaCxrKXtmb3IodmFyIGw9bnVsbCxtPW51bGwsdT1nLHc9Zz0wLHg9bnVsbDtudWxsIT09dSYmdzxoLmxlbmd0aDt3Kyspe3UuaW5kZXg+dz8oeD11LHU9bnVsbCk6eD11LnNpYmxpbmc7dmFyIG49cihlLHUsaFt3XSxrKTtpZihudWxsPT09bil7bnVsbD09PXUmJih1PXgpO2JyZWFrfWEmJnUmJm51bGw9PT1uLmFsdGVybmF0ZSYmYihlLHUpO2c9ZihuLGcsdyk7bnVsbD09PW0/bD1uOm0uc2libGluZz1uO209bjt1PXh9aWYodz09PWgubGVuZ3RoKXJldHVybiBjKGUsdSksSSYmdGcoZSx3KSxsO2lmKG51bGw9PT11KXtmb3IoO3c8aC5sZW5ndGg7dysrKXU9cShlLGhbd10sayksbnVsbCE9PXUmJihnPWYodSxnLHcpLG51bGw9PT1tP2w9dTptLnNpYmxpbmc9dSxtPXUpO0kmJnRnKGUsdyk7cmV0dXJuIGx9Zm9yKHU9ZChlLHUpO3c8aC5sZW5ndGg7dysrKXg9eSh1LGUsdyxoW3ddLGspLG51bGwhPT14JiYoYSYmbnVsbCE9PXguYWx0ZXJuYXRlJiZ1LmRlbGV0ZShudWxsPT09XG54LmtleT93Ongua2V5KSxnPWYoeCxnLHcpLG51bGw9PT1tP2w9eDptLnNpYmxpbmc9eCxtPXgpO2EmJnUuZm9yRWFjaChmdW5jdGlvbihhKXtyZXR1cm4gYihlLGEpfSk7SSYmdGcoZSx3KTtyZXR1cm4gbH1mdW5jdGlvbiB0KGUsZyxoLGspe3ZhciBsPUthKGgpO2lmKFwiZnVuY3Rpb25cIiE9PXR5cGVvZiBsKXRocm93IEVycm9yKHAoMTUwKSk7aD1sLmNhbGwoaCk7aWYobnVsbD09aCl0aHJvdyBFcnJvcihwKDE1MSkpO2Zvcih2YXIgdT1sPW51bGwsbT1nLHc9Zz0wLHg9bnVsbCxuPWgubmV4dCgpO251bGwhPT1tJiYhbi5kb25lO3crKyxuPWgubmV4dCgpKXttLmluZGV4Pnc/KHg9bSxtPW51bGwpOng9bS5zaWJsaW5nO3ZhciB0PXIoZSxtLG4udmFsdWUsayk7aWYobnVsbD09PXQpe251bGw9PT1tJiYobT14KTticmVha31hJiZtJiZudWxsPT09dC5hbHRlcm5hdGUmJmIoZSxtKTtnPWYodCxnLHcpO251bGw9PT11P2w9dDp1LnNpYmxpbmc9dDt1PXQ7bT14fWlmKG4uZG9uZSlyZXR1cm4gYyhlLFxubSksSSYmdGcoZSx3KSxsO2lmKG51bGw9PT1tKXtmb3IoOyFuLmRvbmU7dysrLG49aC5uZXh0KCkpbj1xKGUsbi52YWx1ZSxrKSxudWxsIT09biYmKGc9ZihuLGcsdyksbnVsbD09PXU/bD1uOnUuc2libGluZz1uLHU9bik7SSYmdGcoZSx3KTtyZXR1cm4gbH1mb3IobT1kKGUsbSk7IW4uZG9uZTt3Kyssbj1oLm5leHQoKSluPXkobSxlLHcsbi52YWx1ZSxrKSxudWxsIT09biYmKGEmJm51bGwhPT1uLmFsdGVybmF0ZSYmbS5kZWxldGUobnVsbD09PW4ua2V5P3c6bi5rZXkpLGc9ZihuLGcsdyksbnVsbD09PXU/bD1uOnUuc2libGluZz1uLHU9bik7YSYmbS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3JldHVybiBiKGUsYSl9KTtJJiZ0ZyhlLHcpO3JldHVybiBsfWZ1bmN0aW9uIEooYSxkLGYsaCl7XCJvYmplY3RcIj09PXR5cGVvZiBmJiZudWxsIT09ZiYmZi50eXBlPT09eWEmJm51bGw9PT1mLmtleSYmKGY9Zi5wcm9wcy5jaGlsZHJlbik7aWYoXCJvYmplY3RcIj09PXR5cGVvZiBmJiZudWxsIT09Zil7c3dpdGNoKGYuJCR0eXBlb2Ype2Nhc2UgdmE6YTp7Zm9yKHZhciBrPVxuZi5rZXksbD1kO251bGwhPT1sOyl7aWYobC5rZXk9PT1rKXtrPWYudHlwZTtpZihrPT09eWEpe2lmKDc9PT1sLnRhZyl7YyhhLGwuc2libGluZyk7ZD1lKGwsZi5wcm9wcy5jaGlsZHJlbik7ZC5yZXR1cm49YTthPWQ7YnJlYWsgYX19ZWxzZSBpZihsLmVsZW1lbnRUeXBlPT09a3x8XCJvYmplY3RcIj09PXR5cGVvZiBrJiZudWxsIT09ayYmay4kJHR5cGVvZj09PUhhJiZ1aChrKT09PWwudHlwZSl7YyhhLGwuc2libGluZyk7ZD1lKGwsZi5wcm9wcyk7ZC5yZWY9c2goYSxsLGYpO2QucmV0dXJuPWE7YT1kO2JyZWFrIGF9YyhhLGwpO2JyZWFrfWVsc2UgYihhLGwpO2w9bC5zaWJsaW5nfWYudHlwZT09PXlhPyhkPUFoKGYucHJvcHMuY2hpbGRyZW4sYS5tb2RlLGgsZi5rZXkpLGQucmV0dXJuPWEsYT1kKTooaD15aChmLnR5cGUsZi5rZXksZi5wcm9wcyxudWxsLGEubW9kZSxoKSxoLnJlZj1zaChhLGQsZiksaC5yZXR1cm49YSxhPWgpfXJldHVybiBnKGEpO2Nhc2Ugd2E6YTp7Zm9yKGw9Zi5rZXk7bnVsbCE9PVxuZDspe2lmKGQua2V5PT09bClpZig0PT09ZC50YWcmJmQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm89PT1mLmNvbnRhaW5lckluZm8mJmQuc3RhdGVOb2RlLmltcGxlbWVudGF0aW9uPT09Zi5pbXBsZW1lbnRhdGlvbil7YyhhLGQuc2libGluZyk7ZD1lKGQsZi5jaGlsZHJlbnx8W10pO2QucmV0dXJuPWE7YT1kO2JyZWFrIGF9ZWxzZXtjKGEsZCk7YnJlYWt9ZWxzZSBiKGEsZCk7ZD1kLnNpYmxpbmd9ZD16aChmLGEubW9kZSxoKTtkLnJldHVybj1hO2E9ZH1yZXR1cm4gZyhhKTtjYXNlIEhhOnJldHVybiBsPWYuX2luaXQsSihhLGQsbChmLl9wYXlsb2FkKSxoKX1pZihlYihmKSlyZXR1cm4gbihhLGQsZixoKTtpZihLYShmKSlyZXR1cm4gdChhLGQsZixoKTt0aChhLGYpfXJldHVyblwic3RyaW5nXCI9PT10eXBlb2YgZiYmXCJcIiE9PWZ8fFwibnVtYmVyXCI9PT10eXBlb2YgZj8oZj1cIlwiK2YsbnVsbCE9PWQmJjY9PT1kLnRhZz8oYyhhLGQuc2libGluZyksZD1lKGQsZiksZC5yZXR1cm49YSxhPWQpOlxuKGMoYSxkKSxkPXhoKGYsYS5tb2RlLGgpLGQucmV0dXJuPWEsYT1kKSxnKGEpKTpjKGEsZCl9cmV0dXJuIEp9dmFyIEJoPXZoKCEwKSxDaD12aCghMSksRGg9e30sRWg9VWYoRGgpLEZoPVVmKERoKSxHaD1VZihEaCk7ZnVuY3Rpb24gSGgoYSl7aWYoYT09PURoKXRocm93IEVycm9yKHAoMTc0KSk7cmV0dXJuIGF9ZnVuY3Rpb24gSWgoYSxiKXtHKEdoLGIpO0coRmgsYSk7RyhFaCxEaCk7YT1iLm5vZGVUeXBlO3N3aXRjaChhKXtjYXNlIDk6Y2FzZSAxMTpiPShiPWIuZG9jdW1lbnRFbGVtZW50KT9iLm5hbWVzcGFjZVVSSTpsYihudWxsLFwiXCIpO2JyZWFrO2RlZmF1bHQ6YT04PT09YT9iLnBhcmVudE5vZGU6YixiPWEubmFtZXNwYWNlVVJJfHxudWxsLGE9YS50YWdOYW1lLGI9bGIoYixhKX1FKEVoKTtHKEVoLGIpfWZ1bmN0aW9uIEpoKCl7RShFaCk7RShGaCk7RShHaCl9XG5mdW5jdGlvbiBLaChhKXtIaChHaC5jdXJyZW50KTt2YXIgYj1IaChFaC5jdXJyZW50KTt2YXIgYz1sYihiLGEudHlwZSk7YiE9PWMmJihHKEZoLGEpLEcoRWgsYykpfWZ1bmN0aW9uIExoKGEpe0ZoLmN1cnJlbnQ9PT1hJiYoRShFaCksRShGaCkpfXZhciBNPVVmKDApO1xuZnVuY3Rpb24gTWgoYSl7Zm9yKHZhciBiPWE7bnVsbCE9PWI7KXtpZigxMz09PWIudGFnKXt2YXIgYz1iLm1lbW9pemVkU3RhdGU7aWYobnVsbCE9PWMmJihjPWMuZGVoeWRyYXRlZCxudWxsPT09Y3x8XCIkP1wiPT09Yy5kYXRhfHxcIiQhXCI9PT1jLmRhdGEpKXJldHVybiBifWVsc2UgaWYoMTk9PT1iLnRhZyYmdm9pZCAwIT09Yi5tZW1vaXplZFByb3BzLnJldmVhbE9yZGVyKXtpZigwIT09KGIuZmxhZ3MmMTI4KSlyZXR1cm4gYn1lbHNlIGlmKG51bGwhPT1iLmNoaWxkKXtiLmNoaWxkLnJldHVybj1iO2I9Yi5jaGlsZDtjb250aW51ZX1pZihiPT09YSlicmVhaztmb3IoO251bGw9PT1iLnNpYmxpbmc7KXtpZihudWxsPT09Yi5yZXR1cm58fGIucmV0dXJuPT09YSlyZXR1cm4gbnVsbDtiPWIucmV0dXJufWIuc2libGluZy5yZXR1cm49Yi5yZXR1cm47Yj1iLnNpYmxpbmd9cmV0dXJuIG51bGx9dmFyIE5oPVtdO1xuZnVuY3Rpb24gT2goKXtmb3IodmFyIGE9MDthPE5oLmxlbmd0aDthKyspTmhbYV0uX3dvcmtJblByb2dyZXNzVmVyc2lvblByaW1hcnk9bnVsbDtOaC5sZW5ndGg9MH12YXIgUGg9dWEuUmVhY3RDdXJyZW50RGlzcGF0Y2hlcixRaD11YS5SZWFjdEN1cnJlbnRCYXRjaENvbmZpZyxSaD0wLE49bnVsbCxPPW51bGwsUD1udWxsLFNoPSExLFRoPSExLFVoPTAsVmg9MDtmdW5jdGlvbiBRKCl7dGhyb3cgRXJyb3IocCgzMjEpKTt9ZnVuY3Rpb24gV2goYSxiKXtpZihudWxsPT09YilyZXR1cm4hMTtmb3IodmFyIGM9MDtjPGIubGVuZ3RoJiZjPGEubGVuZ3RoO2MrKylpZighSGUoYVtjXSxiW2NdKSlyZXR1cm4hMTtyZXR1cm4hMH1cbmZ1bmN0aW9uIFhoKGEsYixjLGQsZSxmKXtSaD1mO049YjtiLm1lbW9pemVkU3RhdGU9bnVsbDtiLnVwZGF0ZVF1ZXVlPW51bGw7Yi5sYW5lcz0wO1BoLmN1cnJlbnQ9bnVsbD09PWF8fG51bGw9PT1hLm1lbW9pemVkU3RhdGU/WWg6Wmg7YT1jKGQsZSk7aWYoVGgpe2Y9MDtkb3tUaD0hMTtVaD0wO2lmKDI1PD1mKXRocm93IEVycm9yKHAoMzAxKSk7Zis9MTtQPU89bnVsbDtiLnVwZGF0ZVF1ZXVlPW51bGw7UGguY3VycmVudD0kaDthPWMoZCxlKX13aGlsZShUaCl9UGguY3VycmVudD1haTtiPW51bGwhPT1PJiZudWxsIT09Ty5uZXh0O1JoPTA7UD1PPU49bnVsbDtTaD0hMTtpZihiKXRocm93IEVycm9yKHAoMzAwKSk7cmV0dXJuIGF9ZnVuY3Rpb24gYmkoKXt2YXIgYT0wIT09VWg7VWg9MDtyZXR1cm4gYX1cbmZ1bmN0aW9uIGNpKCl7dmFyIGE9e21lbW9pemVkU3RhdGU6bnVsbCxiYXNlU3RhdGU6bnVsbCxiYXNlUXVldWU6bnVsbCxxdWV1ZTpudWxsLG5leHQ6bnVsbH07bnVsbD09PVA/Ti5tZW1vaXplZFN0YXRlPVA9YTpQPVAubmV4dD1hO3JldHVybiBQfWZ1bmN0aW9uIGRpKCl7aWYobnVsbD09PU8pe3ZhciBhPU4uYWx0ZXJuYXRlO2E9bnVsbCE9PWE/YS5tZW1vaXplZFN0YXRlOm51bGx9ZWxzZSBhPU8ubmV4dDt2YXIgYj1udWxsPT09UD9OLm1lbW9pemVkU3RhdGU6UC5uZXh0O2lmKG51bGwhPT1iKVA9YixPPWE7ZWxzZXtpZihudWxsPT09YSl0aHJvdyBFcnJvcihwKDMxMCkpO089YTthPXttZW1vaXplZFN0YXRlOk8ubWVtb2l6ZWRTdGF0ZSxiYXNlU3RhdGU6Ty5iYXNlU3RhdGUsYmFzZVF1ZXVlOk8uYmFzZVF1ZXVlLHF1ZXVlOk8ucXVldWUsbmV4dDpudWxsfTtudWxsPT09UD9OLm1lbW9pemVkU3RhdGU9UD1hOlA9UC5uZXh0PWF9cmV0dXJuIFB9XG5mdW5jdGlvbiBlaShhLGIpe3JldHVyblwiZnVuY3Rpb25cIj09PXR5cGVvZiBiP2IoYSk6Yn1cbmZ1bmN0aW9uIGZpKGEpe3ZhciBiPWRpKCksYz1iLnF1ZXVlO2lmKG51bGw9PT1jKXRocm93IEVycm9yKHAoMzExKSk7Yy5sYXN0UmVuZGVyZWRSZWR1Y2VyPWE7dmFyIGQ9TyxlPWQuYmFzZVF1ZXVlLGY9Yy5wZW5kaW5nO2lmKG51bGwhPT1mKXtpZihudWxsIT09ZSl7dmFyIGc9ZS5uZXh0O2UubmV4dD1mLm5leHQ7Zi5uZXh0PWd9ZC5iYXNlUXVldWU9ZT1mO2MucGVuZGluZz1udWxsfWlmKG51bGwhPT1lKXtmPWUubmV4dDtkPWQuYmFzZVN0YXRlO3ZhciBoPWc9bnVsbCxrPW51bGwsbD1mO2Rve3ZhciBtPWwubGFuZTtpZigoUmgmbSk9PT1tKW51bGwhPT1rJiYoaz1rLm5leHQ9e2xhbmU6MCxhY3Rpb246bC5hY3Rpb24saGFzRWFnZXJTdGF0ZTpsLmhhc0VhZ2VyU3RhdGUsZWFnZXJTdGF0ZTpsLmVhZ2VyU3RhdGUsbmV4dDpudWxsfSksZD1sLmhhc0VhZ2VyU3RhdGU/bC5lYWdlclN0YXRlOmEoZCxsLmFjdGlvbik7ZWxzZXt2YXIgcT17bGFuZTptLGFjdGlvbjpsLmFjdGlvbixoYXNFYWdlclN0YXRlOmwuaGFzRWFnZXJTdGF0ZSxcbmVhZ2VyU3RhdGU6bC5lYWdlclN0YXRlLG5leHQ6bnVsbH07bnVsbD09PWs/KGg9az1xLGc9ZCk6az1rLm5leHQ9cTtOLmxhbmVzfD1tO2hofD1tfWw9bC5uZXh0fXdoaWxlKG51bGwhPT1sJiZsIT09Zik7bnVsbD09PWs/Zz1kOmsubmV4dD1oO0hlKGQsYi5tZW1vaXplZFN0YXRlKXx8KFVnPSEwKTtiLm1lbW9pemVkU3RhdGU9ZDtiLmJhc2VTdGF0ZT1nO2IuYmFzZVF1ZXVlPWs7Yy5sYXN0UmVuZGVyZWRTdGF0ZT1kfWE9Yy5pbnRlcmxlYXZlZDtpZihudWxsIT09YSl7ZT1hO2RvIGY9ZS5sYW5lLE4ubGFuZXN8PWYsaGh8PWYsZT1lLm5leHQ7d2hpbGUoZSE9PWEpfWVsc2UgbnVsbD09PWUmJihjLmxhbmVzPTApO3JldHVybltiLm1lbW9pemVkU3RhdGUsYy5kaXNwYXRjaF19XG5mdW5jdGlvbiBnaShhKXt2YXIgYj1kaSgpLGM9Yi5xdWV1ZTtpZihudWxsPT09Yyl0aHJvdyBFcnJvcihwKDMxMSkpO2MubGFzdFJlbmRlcmVkUmVkdWNlcj1hO3ZhciBkPWMuZGlzcGF0Y2gsZT1jLnBlbmRpbmcsZj1iLm1lbW9pemVkU3RhdGU7aWYobnVsbCE9PWUpe2MucGVuZGluZz1udWxsO3ZhciBnPWU9ZS5uZXh0O2RvIGY9YShmLGcuYWN0aW9uKSxnPWcubmV4dDt3aGlsZShnIT09ZSk7SGUoZixiLm1lbW9pemVkU3RhdGUpfHwoVWc9ITApO2IubWVtb2l6ZWRTdGF0ZT1mO251bGw9PT1iLmJhc2VRdWV1ZSYmKGIuYmFzZVN0YXRlPWYpO2MubGFzdFJlbmRlcmVkU3RhdGU9Zn1yZXR1cm5bZixkXX1mdW5jdGlvbiBoaSgpe31cbmZ1bmN0aW9uIGlpKGEsYil7dmFyIGM9TixkPWRpKCksZT1iKCksZj0hSGUoZC5tZW1vaXplZFN0YXRlLGUpO2YmJihkLm1lbW9pemVkU3RhdGU9ZSxVZz0hMCk7ZD1kLnF1ZXVlO2ppKGtpLmJpbmQobnVsbCxjLGQsYSksW2FdKTtpZihkLmdldFNuYXBzaG90IT09Ynx8Znx8bnVsbCE9PVAmJlAubWVtb2l6ZWRTdGF0ZS50YWcmMSl7Yy5mbGFnc3w9MjA0ODtsaSg5LG1pLmJpbmQobnVsbCxjLGQsZSxiKSx2b2lkIDAsbnVsbCk7aWYobnVsbD09PVIpdGhyb3cgRXJyb3IocCgzNDkpKTswIT09KFJoJjMwKXx8bmkoYyxiLGUpfXJldHVybiBlfWZ1bmN0aW9uIG5pKGEsYixjKXthLmZsYWdzfD0xNjM4NDthPXtnZXRTbmFwc2hvdDpiLHZhbHVlOmN9O2I9Ti51cGRhdGVRdWV1ZTtudWxsPT09Yj8oYj17bGFzdEVmZmVjdDpudWxsLHN0b3JlczpudWxsfSxOLnVwZGF0ZVF1ZXVlPWIsYi5zdG9yZXM9W2FdKTooYz1iLnN0b3JlcyxudWxsPT09Yz9iLnN0b3Jlcz1bYV06Yy5wdXNoKGEpKX1cbmZ1bmN0aW9uIG1pKGEsYixjLGQpe2IudmFsdWU9YztiLmdldFNuYXBzaG90PWQ7b2koYikmJnBpKGEpfWZ1bmN0aW9uIGtpKGEsYixjKXtyZXR1cm4gYyhmdW5jdGlvbigpe29pKGIpJiZwaShhKX0pfWZ1bmN0aW9uIG9pKGEpe3ZhciBiPWEuZ2V0U25hcHNob3Q7YT1hLnZhbHVlO3RyeXt2YXIgYz1iKCk7cmV0dXJuIUhlKGEsYyl9Y2F0Y2goZCl7cmV0dXJuITB9fWZ1bmN0aW9uIHBpKGEpe3ZhciBiPVpnKGEsMSk7bnVsbCE9PWImJm1oKGIsYSwxLC0xKX1cbmZ1bmN0aW9uIHFpKGEpe3ZhciBiPWNpKCk7XCJmdW5jdGlvblwiPT09dHlwZW9mIGEmJihhPWEoKSk7Yi5tZW1vaXplZFN0YXRlPWIuYmFzZVN0YXRlPWE7YT17cGVuZGluZzpudWxsLGludGVybGVhdmVkOm51bGwsbGFuZXM6MCxkaXNwYXRjaDpudWxsLGxhc3RSZW5kZXJlZFJlZHVjZXI6ZWksbGFzdFJlbmRlcmVkU3RhdGU6YX07Yi5xdWV1ZT1hO2E9YS5kaXNwYXRjaD1yaS5iaW5kKG51bGwsTixhKTtyZXR1cm5bYi5tZW1vaXplZFN0YXRlLGFdfVxuZnVuY3Rpb24gbGkoYSxiLGMsZCl7YT17dGFnOmEsY3JlYXRlOmIsZGVzdHJveTpjLGRlcHM6ZCxuZXh0Om51bGx9O2I9Ti51cGRhdGVRdWV1ZTtudWxsPT09Yj8oYj17bGFzdEVmZmVjdDpudWxsLHN0b3JlczpudWxsfSxOLnVwZGF0ZVF1ZXVlPWIsYi5sYXN0RWZmZWN0PWEubmV4dD1hKTooYz1iLmxhc3RFZmZlY3QsbnVsbD09PWM/Yi5sYXN0RWZmZWN0PWEubmV4dD1hOihkPWMubmV4dCxjLm5leHQ9YSxhLm5leHQ9ZCxiLmxhc3RFZmZlY3Q9YSkpO3JldHVybiBhfWZ1bmN0aW9uIHNpKCl7cmV0dXJuIGRpKCkubWVtb2l6ZWRTdGF0ZX1mdW5jdGlvbiB0aShhLGIsYyxkKXt2YXIgZT1jaSgpO04uZmxhZ3N8PWE7ZS5tZW1vaXplZFN0YXRlPWxpKDF8YixjLHZvaWQgMCx2b2lkIDA9PT1kP251bGw6ZCl9XG5mdW5jdGlvbiB1aShhLGIsYyxkKXt2YXIgZT1kaSgpO2Q9dm9pZCAwPT09ZD9udWxsOmQ7dmFyIGY9dm9pZCAwO2lmKG51bGwhPT1PKXt2YXIgZz1PLm1lbW9pemVkU3RhdGU7Zj1nLmRlc3Ryb3k7aWYobnVsbCE9PWQmJldoKGQsZy5kZXBzKSl7ZS5tZW1vaXplZFN0YXRlPWxpKGIsYyxmLGQpO3JldHVybn19Ti5mbGFnc3w9YTtlLm1lbW9pemVkU3RhdGU9bGkoMXxiLGMsZixkKX1mdW5jdGlvbiB2aShhLGIpe3JldHVybiB0aSg4MzkwNjU2LDgsYSxiKX1mdW5jdGlvbiBqaShhLGIpe3JldHVybiB1aSgyMDQ4LDgsYSxiKX1mdW5jdGlvbiB3aShhLGIpe3JldHVybiB1aSg0LDIsYSxiKX1mdW5jdGlvbiB4aShhLGIpe3JldHVybiB1aSg0LDQsYSxiKX1cbmZ1bmN0aW9uIHlpKGEsYil7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGIpcmV0dXJuIGE9YSgpLGIoYSksZnVuY3Rpb24oKXtiKG51bGwpfTtpZihudWxsIT09YiYmdm9pZCAwIT09YilyZXR1cm4gYT1hKCksYi5jdXJyZW50PWEsZnVuY3Rpb24oKXtiLmN1cnJlbnQ9bnVsbH19ZnVuY3Rpb24gemkoYSxiLGMpe2M9bnVsbCE9PWMmJnZvaWQgMCE9PWM/Yy5jb25jYXQoW2FdKTpudWxsO3JldHVybiB1aSg0LDQseWkuYmluZChudWxsLGIsYSksYyl9ZnVuY3Rpb24gQWkoKXt9ZnVuY3Rpb24gQmkoYSxiKXt2YXIgYz1kaSgpO2I9dm9pZCAwPT09Yj9udWxsOmI7dmFyIGQ9Yy5tZW1vaXplZFN0YXRlO2lmKG51bGwhPT1kJiZudWxsIT09YiYmV2goYixkWzFdKSlyZXR1cm4gZFswXTtjLm1lbW9pemVkU3RhdGU9W2EsYl07cmV0dXJuIGF9XG5mdW5jdGlvbiBDaShhLGIpe3ZhciBjPWRpKCk7Yj12b2lkIDA9PT1iP251bGw6Yjt2YXIgZD1jLm1lbW9pemVkU3RhdGU7aWYobnVsbCE9PWQmJm51bGwhPT1iJiZXaChiLGRbMV0pKXJldHVybiBkWzBdO2E9YSgpO2MubWVtb2l6ZWRTdGF0ZT1bYSxiXTtyZXR1cm4gYX1mdW5jdGlvbiBEaShhLGIsYyl7aWYoMD09PShSaCYyMSkpcmV0dXJuIGEuYmFzZVN0YXRlJiYoYS5iYXNlU3RhdGU9ITEsVWc9ITApLGEubWVtb2l6ZWRTdGF0ZT1jO0hlKGMsYil8fChjPXljKCksTi5sYW5lc3w9YyxoaHw9YyxhLmJhc2VTdGF0ZT0hMCk7cmV0dXJuIGJ9ZnVuY3Rpb24gRWkoYSxiKXt2YXIgYz1DO0M9MCE9PWMmJjQ+Yz9jOjQ7YSghMCk7dmFyIGQ9UWgudHJhbnNpdGlvbjtRaC50cmFuc2l0aW9uPXt9O3RyeXthKCExKSxiKCl9ZmluYWxseXtDPWMsUWgudHJhbnNpdGlvbj1kfX1mdW5jdGlvbiBGaSgpe3JldHVybiBkaSgpLm1lbW9pemVkU3RhdGV9XG5mdW5jdGlvbiBHaShhLGIsYyl7dmFyIGQ9bGgoYSk7Yz17bGFuZTpkLGFjdGlvbjpjLGhhc0VhZ2VyU3RhdGU6ITEsZWFnZXJTdGF0ZTpudWxsLG5leHQ6bnVsbH07aWYoSGkoYSkpSWkoYixjKTtlbHNlIGlmKGM9WWcoYSxiLGMsZCksbnVsbCE9PWMpe3ZhciBlPUwoKTttaChjLGEsZCxlKTtKaShjLGIsZCl9fVxuZnVuY3Rpb24gcmkoYSxiLGMpe3ZhciBkPWxoKGEpLGU9e2xhbmU6ZCxhY3Rpb246YyxoYXNFYWdlclN0YXRlOiExLGVhZ2VyU3RhdGU6bnVsbCxuZXh0Om51bGx9O2lmKEhpKGEpKUlpKGIsZSk7ZWxzZXt2YXIgZj1hLmFsdGVybmF0ZTtpZigwPT09YS5sYW5lcyYmKG51bGw9PT1mfHwwPT09Zi5sYW5lcykmJihmPWIubGFzdFJlbmRlcmVkUmVkdWNlcixudWxsIT09ZikpdHJ5e3ZhciBnPWIubGFzdFJlbmRlcmVkU3RhdGUsaD1mKGcsYyk7ZS5oYXNFYWdlclN0YXRlPSEwO2UuZWFnZXJTdGF0ZT1oO2lmKEhlKGgsZykpe3ZhciBrPWIuaW50ZXJsZWF2ZWQ7bnVsbD09PWs/KGUubmV4dD1lLFhnKGIpKTooZS5uZXh0PWsubmV4dCxrLm5leHQ9ZSk7Yi5pbnRlcmxlYXZlZD1lO3JldHVybn19Y2F0Y2gobCl7fWZpbmFsbHl7fWM9WWcoYSxiLGUsZCk7bnVsbCE9PWMmJihlPUwoKSxtaChjLGEsZCxlKSxKaShjLGIsZCkpfX1cbmZ1bmN0aW9uIEhpKGEpe3ZhciBiPWEuYWx0ZXJuYXRlO3JldHVybiBhPT09Tnx8bnVsbCE9PWImJmI9PT1OfWZ1bmN0aW9uIElpKGEsYil7VGg9U2g9ITA7dmFyIGM9YS5wZW5kaW5nO251bGw9PT1jP2IubmV4dD1iOihiLm5leHQ9Yy5uZXh0LGMubmV4dD1iKTthLnBlbmRpbmc9Yn1mdW5jdGlvbiBKaShhLGIsYyl7aWYoMCE9PShjJjQxOTQyNDApKXt2YXIgZD1iLmxhbmVzO2QmPWEucGVuZGluZ0xhbmVzO2N8PWQ7Yi5sYW5lcz1jO0NjKGEsYyl9fVxudmFyIGFpPXtyZWFkQ29udGV4dDpWZyx1c2VDYWxsYmFjazpRLHVzZUNvbnRleHQ6USx1c2VFZmZlY3Q6USx1c2VJbXBlcmF0aXZlSGFuZGxlOlEsdXNlSW5zZXJ0aW9uRWZmZWN0OlEsdXNlTGF5b3V0RWZmZWN0OlEsdXNlTWVtbzpRLHVzZVJlZHVjZXI6USx1c2VSZWY6USx1c2VTdGF0ZTpRLHVzZURlYnVnVmFsdWU6USx1c2VEZWZlcnJlZFZhbHVlOlEsdXNlVHJhbnNpdGlvbjpRLHVzZU11dGFibGVTb3VyY2U6USx1c2VTeW5jRXh0ZXJuYWxTdG9yZTpRLHVzZUlkOlEsdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiExfSxZaD17cmVhZENvbnRleHQ6VmcsdXNlQ2FsbGJhY2s6ZnVuY3Rpb24oYSxiKXtjaSgpLm1lbW9pemVkU3RhdGU9W2Esdm9pZCAwPT09Yj9udWxsOmJdO3JldHVybiBhfSx1c2VDb250ZXh0OlZnLHVzZUVmZmVjdDp2aSx1c2VJbXBlcmF0aXZlSGFuZGxlOmZ1bmN0aW9uKGEsYixjKXtjPW51bGwhPT1jJiZ2b2lkIDAhPT1jP2MuY29uY2F0KFthXSk6bnVsbDtyZXR1cm4gdGkoNDE5NDMwOCxcbjQseWkuYmluZChudWxsLGIsYSksYyl9LHVzZUxheW91dEVmZmVjdDpmdW5jdGlvbihhLGIpe3JldHVybiB0aSg0MTk0MzA4LDQsYSxiKX0sdXNlSW5zZXJ0aW9uRWZmZWN0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRpKDQsMixhLGIpfSx1c2VNZW1vOmZ1bmN0aW9uKGEsYil7dmFyIGM9Y2koKTtiPXZvaWQgMD09PWI/bnVsbDpiO2E9YSgpO2MubWVtb2l6ZWRTdGF0ZT1bYSxiXTtyZXR1cm4gYX0sdXNlUmVkdWNlcjpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9Y2koKTtiPXZvaWQgMCE9PWM/YyhiKTpiO2QubWVtb2l6ZWRTdGF0ZT1kLmJhc2VTdGF0ZT1iO2E9e3BlbmRpbmc6bnVsbCxpbnRlcmxlYXZlZDpudWxsLGxhbmVzOjAsZGlzcGF0Y2g6bnVsbCxsYXN0UmVuZGVyZWRSZWR1Y2VyOmEsbGFzdFJlbmRlcmVkU3RhdGU6Yn07ZC5xdWV1ZT1hO2E9YS5kaXNwYXRjaD1HaS5iaW5kKG51bGwsTixhKTtyZXR1cm5bZC5tZW1vaXplZFN0YXRlLGFdfSx1c2VSZWY6ZnVuY3Rpb24oYSl7dmFyIGI9XG5jaSgpO2E9e2N1cnJlbnQ6YX07cmV0dXJuIGIubWVtb2l6ZWRTdGF0ZT1hfSx1c2VTdGF0ZTpxaSx1c2VEZWJ1Z1ZhbHVlOkFpLHVzZURlZmVycmVkVmFsdWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGNpKCkubWVtb2l6ZWRTdGF0ZT1hfSx1c2VUcmFuc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9cWkoITEpLGI9YVswXTthPUVpLmJpbmQobnVsbCxhWzFdKTtjaSgpLm1lbW9pemVkU3RhdGU9YTtyZXR1cm5bYixhXX0sdXNlTXV0YWJsZVNvdXJjZTpmdW5jdGlvbigpe30sdXNlU3luY0V4dGVybmFsU3RvcmU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPU4sZT1jaSgpO2lmKEkpe2lmKHZvaWQgMD09PWMpdGhyb3cgRXJyb3IocCg0MDcpKTtjPWMoKX1lbHNle2M9YigpO2lmKG51bGw9PT1SKXRocm93IEVycm9yKHAoMzQ5KSk7MCE9PShSaCYzMCl8fG5pKGQsYixjKX1lLm1lbW9pemVkU3RhdGU9Yzt2YXIgZj17dmFsdWU6YyxnZXRTbmFwc2hvdDpifTtlLnF1ZXVlPWY7dmkoa2kuYmluZChudWxsLGQsXG5mLGEpLFthXSk7ZC5mbGFnc3w9MjA0ODtsaSg5LG1pLmJpbmQobnVsbCxkLGYsYyxiKSx2b2lkIDAsbnVsbCk7cmV0dXJuIGN9LHVzZUlkOmZ1bmN0aW9uKCl7dmFyIGE9Y2koKSxiPVIuaWRlbnRpZmllclByZWZpeDtpZihJKXt2YXIgYz1zZzt2YXIgZD1yZztjPShkJn4oMTw8MzItb2MoZCktMSkpLnRvU3RyaW5nKDMyKStjO2I9XCI6XCIrYitcIlJcIitjO2M9VWgrKzswPGMmJihiKz1cIkhcIitjLnRvU3RyaW5nKDMyKSk7Yis9XCI6XCJ9ZWxzZSBjPVZoKyssYj1cIjpcIitiK1wiclwiK2MudG9TdHJpbmcoMzIpK1wiOlwiO3JldHVybiBhLm1lbW9pemVkU3RhdGU9Yn0sdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiExfSxaaD17cmVhZENvbnRleHQ6VmcsdXNlQ2FsbGJhY2s6QmksdXNlQ29udGV4dDpWZyx1c2VFZmZlY3Q6amksdXNlSW1wZXJhdGl2ZUhhbmRsZTp6aSx1c2VJbnNlcnRpb25FZmZlY3Q6d2ksdXNlTGF5b3V0RWZmZWN0OnhpLHVzZU1lbW86Q2ksdXNlUmVkdWNlcjpmaSx1c2VSZWY6c2ksdXNlU3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gZmkoZWkpfSxcbnVzZURlYnVnVmFsdWU6QWksdXNlRGVmZXJyZWRWYWx1ZTpmdW5jdGlvbihhKXt2YXIgYj1kaSgpO3JldHVybiBEaShiLE8ubWVtb2l6ZWRTdGF0ZSxhKX0sdXNlVHJhbnNpdGlvbjpmdW5jdGlvbigpe3ZhciBhPWZpKGVpKVswXSxiPWRpKCkubWVtb2l6ZWRTdGF0ZTtyZXR1cm5bYSxiXX0sdXNlTXV0YWJsZVNvdXJjZTpoaSx1c2VTeW5jRXh0ZXJuYWxTdG9yZTppaSx1c2VJZDpGaSx1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6ITF9LCRoPXtyZWFkQ29udGV4dDpWZyx1c2VDYWxsYmFjazpCaSx1c2VDb250ZXh0OlZnLHVzZUVmZmVjdDpqaSx1c2VJbXBlcmF0aXZlSGFuZGxlOnppLHVzZUluc2VydGlvbkVmZmVjdDp3aSx1c2VMYXlvdXRFZmZlY3Q6eGksdXNlTWVtbzpDaSx1c2VSZWR1Y2VyOmdpLHVzZVJlZjpzaSx1c2VTdGF0ZTpmdW5jdGlvbigpe3JldHVybiBnaShlaSl9LHVzZURlYnVnVmFsdWU6QWksdXNlRGVmZXJyZWRWYWx1ZTpmdW5jdGlvbihhKXt2YXIgYj1kaSgpO3JldHVybiBudWxsPT09XG5PP2IubWVtb2l6ZWRTdGF0ZT1hOkRpKGIsTy5tZW1vaXplZFN0YXRlLGEpfSx1c2VUcmFuc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9Z2koZWkpWzBdLGI9ZGkoKS5tZW1vaXplZFN0YXRlO3JldHVyblthLGJdfSx1c2VNdXRhYmxlU291cmNlOmhpLHVzZVN5bmNFeHRlcm5hbFN0b3JlOmlpLHVzZUlkOkZpLHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjohMX07ZnVuY3Rpb24gS2koYSxiKXt0cnl7dmFyIGM9XCJcIixkPWI7ZG8gYys9UGEoZCksZD1kLnJldHVybjt3aGlsZShkKTt2YXIgZT1jfWNhdGNoKGYpe2U9XCJcXG5FcnJvciBnZW5lcmF0aW5nIHN0YWNrOiBcIitmLm1lc3NhZ2UrXCJcXG5cIitmLnN0YWNrfXJldHVybnt2YWx1ZTphLHNvdXJjZTpiLHN0YWNrOmUsZGlnZXN0Om51bGx9fWZ1bmN0aW9uIExpKGEsYixjKXtyZXR1cm57dmFsdWU6YSxzb3VyY2U6bnVsbCxzdGFjazpudWxsIT1jP2M6bnVsbCxkaWdlc3Q6bnVsbCE9Yj9iOm51bGx9fVxuZnVuY3Rpb24gTWkoYSxiKXt0cnl7Y29uc29sZS5lcnJvcihiLnZhbHVlKX1jYXRjaChjKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhyb3cgYzt9KX19dmFyIE5pPVwiZnVuY3Rpb25cIj09PXR5cGVvZiBXZWFrTWFwP1dlYWtNYXA6TWFwO2Z1bmN0aW9uIE9pKGEsYixjKXtjPWNoKC0xLGMpO2MudGFnPTM7Yy5wYXlsb2FkPXtlbGVtZW50Om51bGx9O3ZhciBkPWIudmFsdWU7Yy5jYWxsYmFjaz1mdW5jdGlvbigpe1BpfHwoUGk9ITAsUWk9ZCk7TWkoYSxiKX07cmV0dXJuIGN9XG5mdW5jdGlvbiBSaShhLGIsYyl7Yz1jaCgtMSxjKTtjLnRhZz0zO3ZhciBkPWEudHlwZS5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3I7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGQpe3ZhciBlPWIudmFsdWU7Yy5wYXlsb2FkPWZ1bmN0aW9uKCl7cmV0dXJuIGQoZSl9O2MuY2FsbGJhY2s9ZnVuY3Rpb24oKXtNaShhLGIpfX12YXIgZj1hLnN0YXRlTm9kZTtudWxsIT09ZiYmXCJmdW5jdGlvblwiPT09dHlwZW9mIGYuY29tcG9uZW50RGlkQ2F0Y2gmJihjLmNhbGxiYWNrPWZ1bmN0aW9uKCl7TWkoYSxiKTtcImZ1bmN0aW9uXCIhPT10eXBlb2YgZCYmKG51bGw9PT1TaT9TaT1uZXcgU2V0KFt0aGlzXSk6U2kuYWRkKHRoaXMpKTt2YXIgYz1iLnN0YWNrO3RoaXMuY29tcG9uZW50RGlkQ2F0Y2goYi52YWx1ZSx7Y29tcG9uZW50U3RhY2s6bnVsbCE9PWM/YzpcIlwifSl9KTtyZXR1cm4gY31cbmZ1bmN0aW9uIFRpKGEsYixjKXt2YXIgZD1hLnBpbmdDYWNoZTtpZihudWxsPT09ZCl7ZD1hLnBpbmdDYWNoZT1uZXcgTmk7dmFyIGU9bmV3IFNldDtkLnNldChiLGUpfWVsc2UgZT1kLmdldChiKSx2b2lkIDA9PT1lJiYoZT1uZXcgU2V0LGQuc2V0KGIsZSkpO2UuaGFzKGMpfHwoZS5hZGQoYyksYT1VaS5iaW5kKG51bGwsYSxiLGMpLGIudGhlbihhLGEpKX1mdW5jdGlvbiBWaShhKXtkb3t2YXIgYjtpZihiPTEzPT09YS50YWcpYj1hLm1lbW9pemVkU3RhdGUsYj1udWxsIT09Yj9udWxsIT09Yi5kZWh5ZHJhdGVkPyEwOiExOiEwO2lmKGIpcmV0dXJuIGE7YT1hLnJldHVybn13aGlsZShudWxsIT09YSk7cmV0dXJuIG51bGx9XG5mdW5jdGlvbiBXaShhLGIsYyxkLGUpe2lmKDA9PT0oYS5tb2RlJjEpKXJldHVybiBhPT09Yj9hLmZsYWdzfD02NTUzNjooYS5mbGFnc3w9MTI4LGMuZmxhZ3N8PTEzMTA3MixjLmZsYWdzJj0tNTI4MDUsMT09PWMudGFnJiYobnVsbD09PWMuYWx0ZXJuYXRlP2MudGFnPTE3OihiPWNoKC0xLDEpLGIudGFnPTIsZGgoYyxiLDEpKSksYy5sYW5lc3w9MSksYTthLmZsYWdzfD02NTUzNjthLmxhbmVzPWU7cmV0dXJuIGF9dmFyIFhpPXVhLlJlYWN0Q3VycmVudE93bmVyLFVnPSExO2Z1bmN0aW9uIFlpKGEsYixjLGQpe2IuY2hpbGQ9bnVsbD09PWE/Q2goYixudWxsLGMsZCk6QmgoYixhLmNoaWxkLGMsZCl9XG5mdW5jdGlvbiBaaShhLGIsYyxkLGUpe2M9Yy5yZW5kZXI7dmFyIGY9Yi5yZWY7VGcoYixlKTtkPVhoKGEsYixjLGQsZixlKTtjPWJpKCk7aWYobnVsbCE9PWEmJiFVZylyZXR1cm4gYi51cGRhdGVRdWV1ZT1hLnVwZGF0ZVF1ZXVlLGIuZmxhZ3MmPS0yMDUzLGEubGFuZXMmPX5lLCRpKGEsYixlKTtJJiZjJiZ2ZyhiKTtiLmZsYWdzfD0xO1lpKGEsYixkLGUpO3JldHVybiBiLmNoaWxkfVxuZnVuY3Rpb24gYWooYSxiLGMsZCxlKXtpZihudWxsPT09YSl7dmFyIGY9Yy50eXBlO2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBmJiYhYmooZikmJnZvaWQgMD09PWYuZGVmYXVsdFByb3BzJiZudWxsPT09Yy5jb21wYXJlJiZ2b2lkIDA9PT1jLmRlZmF1bHRQcm9wcylyZXR1cm4gYi50YWc9MTUsYi50eXBlPWYsY2ooYSxiLGYsZCxlKTthPXloKGMudHlwZSxudWxsLGQsYixiLm1vZGUsZSk7YS5yZWY9Yi5yZWY7YS5yZXR1cm49YjtyZXR1cm4gYi5jaGlsZD1hfWY9YS5jaGlsZDtpZigwPT09KGEubGFuZXMmZSkpe3ZhciBnPWYubWVtb2l6ZWRQcm9wcztjPWMuY29tcGFyZTtjPW51bGwhPT1jP2M6SWU7aWYoYyhnLGQpJiZhLnJlZj09PWIucmVmKXJldHVybiAkaShhLGIsZSl9Yi5mbGFnc3w9MTthPXdoKGYsZCk7YS5yZWY9Yi5yZWY7YS5yZXR1cm49YjtyZXR1cm4gYi5jaGlsZD1hfVxuZnVuY3Rpb24gY2ooYSxiLGMsZCxlKXtpZihudWxsIT09YSl7dmFyIGY9YS5tZW1vaXplZFByb3BzO2lmKEllKGYsZCkmJmEucmVmPT09Yi5yZWYpaWYoVWc9ITEsYi5wZW5kaW5nUHJvcHM9ZD1mLDAhPT0oYS5sYW5lcyZlKSkwIT09KGEuZmxhZ3MmMTMxMDcyKSYmKFVnPSEwKTtlbHNlIHJldHVybiBiLmxhbmVzPWEubGFuZXMsJGkoYSxiLGUpfXJldHVybiBkaihhLGIsYyxkLGUpfVxuZnVuY3Rpb24gZWooYSxiLGMpe3ZhciBkPWIucGVuZGluZ1Byb3BzLGU9ZC5jaGlsZHJlbixmPW51bGwhPT1hP2EubWVtb2l6ZWRTdGF0ZTpudWxsO2lmKFwiaGlkZGVuXCI9PT1kLm1vZGUpaWYoMD09PShiLm1vZGUmMSkpYi5tZW1vaXplZFN0YXRlPXtiYXNlTGFuZXM6MCxjYWNoZVBvb2w6bnVsbCx0cmFuc2l0aW9uczpudWxsfSxHKGZqLGdqKSxnanw9YztlbHNle2lmKDA9PT0oYyYxMDczNzQxODI0KSlyZXR1cm4gYT1udWxsIT09Zj9mLmJhc2VMYW5lc3xjOmMsYi5sYW5lcz1iLmNoaWxkTGFuZXM9MTA3Mzc0MTgyNCxiLm1lbW9pemVkU3RhdGU9e2Jhc2VMYW5lczphLGNhY2hlUG9vbDpudWxsLHRyYW5zaXRpb25zOm51bGx9LGIudXBkYXRlUXVldWU9bnVsbCxHKGZqLGdqKSxnanw9YSxudWxsO2IubWVtb2l6ZWRTdGF0ZT17YmFzZUxhbmVzOjAsY2FjaGVQb29sOm51bGwsdHJhbnNpdGlvbnM6bnVsbH07ZD1udWxsIT09Zj9mLmJhc2VMYW5lczpjO0coZmosZ2opO2dqfD1kfWVsc2UgbnVsbCE9PVxuZj8oZD1mLmJhc2VMYW5lc3xjLGIubWVtb2l6ZWRTdGF0ZT1udWxsKTpkPWMsRyhmaixnaiksZ2p8PWQ7WWkoYSxiLGUsYyk7cmV0dXJuIGIuY2hpbGR9ZnVuY3Rpb24gaGooYSxiKXt2YXIgYz1iLnJlZjtpZihudWxsPT09YSYmbnVsbCE9PWN8fG51bGwhPT1hJiZhLnJlZiE9PWMpYi5mbGFnc3w9NTEyLGIuZmxhZ3N8PTIwOTcxNTJ9ZnVuY3Rpb24gZGooYSxiLGMsZCxlKXt2YXIgZj1aZihjKT9YZjpILmN1cnJlbnQ7Zj1ZZihiLGYpO1RnKGIsZSk7Yz1YaChhLGIsYyxkLGYsZSk7ZD1iaSgpO2lmKG51bGwhPT1hJiYhVWcpcmV0dXJuIGIudXBkYXRlUXVldWU9YS51cGRhdGVRdWV1ZSxiLmZsYWdzJj0tMjA1MyxhLmxhbmVzJj1+ZSwkaShhLGIsZSk7SSYmZCYmdmcoYik7Yi5mbGFnc3w9MTtZaShhLGIsYyxlKTtyZXR1cm4gYi5jaGlsZH1cbmZ1bmN0aW9uIGlqKGEsYixjLGQsZSl7aWYoWmYoYykpe3ZhciBmPSEwO2NnKGIpfWVsc2UgZj0hMTtUZyhiLGUpO2lmKG51bGw9PT1iLnN0YXRlTm9kZSlqaihhLGIpLHBoKGIsYyxkKSxyaChiLGMsZCxlKSxkPSEwO2Vsc2UgaWYobnVsbD09PWEpe3ZhciBnPWIuc3RhdGVOb2RlLGg9Yi5tZW1vaXplZFByb3BzO2cucHJvcHM9aDt2YXIgaz1nLmNvbnRleHQsbD1jLmNvbnRleHRUeXBlO1wib2JqZWN0XCI9PT10eXBlb2YgbCYmbnVsbCE9PWw/bD1WZyhsKToobD1aZihjKT9YZjpILmN1cnJlbnQsbD1ZZihiLGwpKTt2YXIgbT1jLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyxxPVwiZnVuY3Rpb25cIj09PXR5cGVvZiBtfHxcImZ1bmN0aW9uXCI9PT10eXBlb2YgZy5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZTtxfHxcImZ1bmN0aW9uXCIhPT10eXBlb2YgZy5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyYmXCJmdW5jdGlvblwiIT09dHlwZW9mIGcuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc3x8XG4oaCE9PWR8fGshPT1sKSYmcWgoYixnLGQsbCk7JGc9ITE7dmFyIHI9Yi5tZW1vaXplZFN0YXRlO2cuc3RhdGU9cjtnaChiLGQsZyxlKTtrPWIubWVtb2l6ZWRTdGF0ZTtoIT09ZHx8ciE9PWt8fFdmLmN1cnJlbnR8fCRnPyhcImZ1bmN0aW9uXCI9PT10eXBlb2YgbSYmKGtoKGIsYyxtLGQpLGs9Yi5tZW1vaXplZFN0YXRlKSwoaD0kZ3x8b2goYixjLGgsZCxyLGssbCkpPyhxfHxcImZ1bmN0aW9uXCIhPT10eXBlb2YgZy5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50JiZcImZ1bmN0aW9uXCIhPT10eXBlb2YgZy5jb21wb25lbnRXaWxsTW91bnR8fChcImZ1bmN0aW9uXCI9PT10eXBlb2YgZy5jb21wb25lbnRXaWxsTW91bnQmJmcuY29tcG9uZW50V2lsbE1vdW50KCksXCJmdW5jdGlvblwiPT09dHlwZW9mIGcuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCYmZy5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50KCkpLFwiZnVuY3Rpb25cIj09PXR5cGVvZiBnLmNvbXBvbmVudERpZE1vdW50JiYoYi5mbGFnc3w9NDE5NDMwOCkpOlxuKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBnLmNvbXBvbmVudERpZE1vdW50JiYoYi5mbGFnc3w9NDE5NDMwOCksYi5tZW1vaXplZFByb3BzPWQsYi5tZW1vaXplZFN0YXRlPWspLGcucHJvcHM9ZCxnLnN0YXRlPWssZy5jb250ZXh0PWwsZD1oKTooXCJmdW5jdGlvblwiPT09dHlwZW9mIGcuY29tcG9uZW50RGlkTW91bnQmJihiLmZsYWdzfD00MTk0MzA4KSxkPSExKX1lbHNle2c9Yi5zdGF0ZU5vZGU7YmgoYSxiKTtoPWIubWVtb2l6ZWRQcm9wcztsPWIudHlwZT09PWIuZWxlbWVudFR5cGU/aDpMZyhiLnR5cGUsaCk7Zy5wcm9wcz1sO3E9Yi5wZW5kaW5nUHJvcHM7cj1nLmNvbnRleHQ7az1jLmNvbnRleHRUeXBlO1wib2JqZWN0XCI9PT10eXBlb2YgayYmbnVsbCE9PWs/az1WZyhrKTooaz1aZihjKT9YZjpILmN1cnJlbnQsaz1ZZihiLGspKTt2YXIgeT1jLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wczsobT1cImZ1bmN0aW9uXCI9PT10eXBlb2YgeXx8XCJmdW5jdGlvblwiPT09dHlwZW9mIGcuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUpfHxcblwiZnVuY3Rpb25cIiE9PXR5cGVvZiBnLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzJiZcImZ1bmN0aW9uXCIhPT10eXBlb2YgZy5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzfHwoaCE9PXF8fHIhPT1rKSYmcWgoYixnLGQsayk7JGc9ITE7cj1iLm1lbW9pemVkU3RhdGU7Zy5zdGF0ZT1yO2doKGIsZCxnLGUpO3ZhciBuPWIubWVtb2l6ZWRTdGF0ZTtoIT09cXx8ciE9PW58fFdmLmN1cnJlbnR8fCRnPyhcImZ1bmN0aW9uXCI9PT10eXBlb2YgeSYmKGtoKGIsYyx5LGQpLG49Yi5tZW1vaXplZFN0YXRlKSwobD0kZ3x8b2goYixjLGwsZCxyLG4sayl8fCExKT8obXx8XCJmdW5jdGlvblwiIT09dHlwZW9mIGcuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUmJlwiZnVuY3Rpb25cIiE9PXR5cGVvZiBnLmNvbXBvbmVudFdpbGxVcGRhdGV8fChcImZ1bmN0aW9uXCI9PT10eXBlb2YgZy5jb21wb25lbnRXaWxsVXBkYXRlJiZnLmNvbXBvbmVudFdpbGxVcGRhdGUoZCxuLGspLFwiZnVuY3Rpb25cIj09PXR5cGVvZiBnLlVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlJiZcbmcuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUoZCxuLGspKSxcImZ1bmN0aW9uXCI9PT10eXBlb2YgZy5jb21wb25lbnREaWRVcGRhdGUmJihiLmZsYWdzfD00KSxcImZ1bmN0aW9uXCI9PT10eXBlb2YgZy5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSYmKGIuZmxhZ3N8PTEwMjQpKTooXCJmdW5jdGlvblwiIT09dHlwZW9mIGcuY29tcG9uZW50RGlkVXBkYXRlfHxoPT09YS5tZW1vaXplZFByb3BzJiZyPT09YS5tZW1vaXplZFN0YXRlfHwoYi5mbGFnc3w9NCksXCJmdW5jdGlvblwiIT09dHlwZW9mIGcuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGV8fGg9PT1hLm1lbW9pemVkUHJvcHMmJnI9PT1hLm1lbW9pemVkU3RhdGV8fChiLmZsYWdzfD0xMDI0KSxiLm1lbW9pemVkUHJvcHM9ZCxiLm1lbW9pemVkU3RhdGU9biksZy5wcm9wcz1kLGcuc3RhdGU9bixnLmNvbnRleHQ9ayxkPWwpOihcImZ1bmN0aW9uXCIhPT10eXBlb2YgZy5jb21wb25lbnREaWRVcGRhdGV8fGg9PT1hLm1lbW9pemVkUHJvcHMmJnI9PT1cbmEubWVtb2l6ZWRTdGF0ZXx8KGIuZmxhZ3N8PTQpLFwiZnVuY3Rpb25cIiE9PXR5cGVvZiBnLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlfHxoPT09YS5tZW1vaXplZFByb3BzJiZyPT09YS5tZW1vaXplZFN0YXRlfHwoYi5mbGFnc3w9MTAyNCksZD0hMSl9cmV0dXJuIGtqKGEsYixjLGQsZixlKX1cbmZ1bmN0aW9uIGtqKGEsYixjLGQsZSxmKXtoaihhLGIpO3ZhciBnPTAhPT0oYi5mbGFncyYxMjgpO2lmKCFkJiYhZylyZXR1cm4gZSYmZGcoYixjLCExKSwkaShhLGIsZik7ZD1iLnN0YXRlTm9kZTtYaS5jdXJyZW50PWI7dmFyIGg9ZyYmXCJmdW5jdGlvblwiIT09dHlwZW9mIGMuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yP251bGw6ZC5yZW5kZXIoKTtiLmZsYWdzfD0xO251bGwhPT1hJiZnPyhiLmNoaWxkPUJoKGIsYS5jaGlsZCxudWxsLGYpLGIuY2hpbGQ9QmgoYixudWxsLGgsZikpOllpKGEsYixoLGYpO2IubWVtb2l6ZWRTdGF0ZT1kLnN0YXRlO2UmJmRnKGIsYywhMCk7cmV0dXJuIGIuY2hpbGR9ZnVuY3Rpb24gbGooYSl7dmFyIGI9YS5zdGF0ZU5vZGU7Yi5wZW5kaW5nQ29udGV4dD9hZyhhLGIucGVuZGluZ0NvbnRleHQsYi5wZW5kaW5nQ29udGV4dCE9PWIuY29udGV4dCk6Yi5jb250ZXh0JiZhZyhhLGIuY29udGV4dCwhMSk7SWgoYSxiLmNvbnRhaW5lckluZm8pfVxuZnVuY3Rpb24gbWooYSxiLGMsZCxlKXtJZygpO0pnKGUpO2IuZmxhZ3N8PTI1NjtZaShhLGIsYyxkKTtyZXR1cm4gYi5jaGlsZH12YXIgbmo9e2RlaHlkcmF0ZWQ6bnVsbCx0cmVlQ29udGV4dDpudWxsLHJldHJ5TGFuZTowfTtmdW5jdGlvbiBvaihhKXtyZXR1cm57YmFzZUxhbmVzOmEsY2FjaGVQb29sOm51bGwsdHJhbnNpdGlvbnM6bnVsbH19XG5mdW5jdGlvbiBwaihhLGIsYyl7dmFyIGQ9Yi5wZW5kaW5nUHJvcHMsZT1NLmN1cnJlbnQsZj0hMSxnPTAhPT0oYi5mbGFncyYxMjgpLGg7KGg9Zyl8fChoPW51bGwhPT1hJiZudWxsPT09YS5tZW1vaXplZFN0YXRlPyExOjAhPT0oZSYyKSk7aWYoaClmPSEwLGIuZmxhZ3MmPS0xMjk7ZWxzZSBpZihudWxsPT09YXx8bnVsbCE9PWEubWVtb2l6ZWRTdGF0ZSllfD0xO0coTSxlJjEpO2lmKG51bGw9PT1hKXtFZyhiKTthPWIubWVtb2l6ZWRTdGF0ZTtpZihudWxsIT09YSYmKGE9YS5kZWh5ZHJhdGVkLG51bGwhPT1hKSlyZXR1cm4gMD09PShiLm1vZGUmMSk/Yi5sYW5lcz0xOlwiJCFcIj09PWEuZGF0YT9iLmxhbmVzPTg6Yi5sYW5lcz0xMDczNzQxODI0LG51bGw7Zz1kLmNoaWxkcmVuO2E9ZC5mYWxsYmFjaztyZXR1cm4gZj8oZD1iLm1vZGUsZj1iLmNoaWxkLGc9e21vZGU6XCJoaWRkZW5cIixjaGlsZHJlbjpnfSwwPT09KGQmMSkmJm51bGwhPT1mPyhmLmNoaWxkTGFuZXM9MCxmLnBlbmRpbmdQcm9wcz1cbmcpOmY9cWooZyxkLDAsbnVsbCksYT1BaChhLGQsYyxudWxsKSxmLnJldHVybj1iLGEucmV0dXJuPWIsZi5zaWJsaW5nPWEsYi5jaGlsZD1mLGIuY2hpbGQubWVtb2l6ZWRTdGF0ZT1vaihjKSxiLm1lbW9pemVkU3RhdGU9bmosYSk6cmooYixnKX1lPWEubWVtb2l6ZWRTdGF0ZTtpZihudWxsIT09ZSYmKGg9ZS5kZWh5ZHJhdGVkLG51bGwhPT1oKSlyZXR1cm4gc2ooYSxiLGcsZCxoLGUsYyk7aWYoZil7Zj1kLmZhbGxiYWNrO2c9Yi5tb2RlO2U9YS5jaGlsZDtoPWUuc2libGluZzt2YXIgaz17bW9kZTpcImhpZGRlblwiLGNoaWxkcmVuOmQuY2hpbGRyZW59OzA9PT0oZyYxKSYmYi5jaGlsZCE9PWU/KGQ9Yi5jaGlsZCxkLmNoaWxkTGFuZXM9MCxkLnBlbmRpbmdQcm9wcz1rLGIuZGVsZXRpb25zPW51bGwpOihkPXdoKGUsayksZC5zdWJ0cmVlRmxhZ3M9ZS5zdWJ0cmVlRmxhZ3MmMTQ2ODAwNjQpO251bGwhPT1oP2Y9d2goaCxmKTooZj1BaChmLGcsYyxudWxsKSxmLmZsYWdzfD0yKTtmLnJldHVybj1cbmI7ZC5yZXR1cm49YjtkLnNpYmxpbmc9ZjtiLmNoaWxkPWQ7ZD1mO2Y9Yi5jaGlsZDtnPWEuY2hpbGQubWVtb2l6ZWRTdGF0ZTtnPW51bGw9PT1nP29qKGMpOntiYXNlTGFuZXM6Zy5iYXNlTGFuZXN8YyxjYWNoZVBvb2w6bnVsbCx0cmFuc2l0aW9uczpnLnRyYW5zaXRpb25zfTtmLm1lbW9pemVkU3RhdGU9ZztmLmNoaWxkTGFuZXM9YS5jaGlsZExhbmVzJn5jO2IubWVtb2l6ZWRTdGF0ZT1uajtyZXR1cm4gZH1mPWEuY2hpbGQ7YT1mLnNpYmxpbmc7ZD13aChmLHttb2RlOlwidmlzaWJsZVwiLGNoaWxkcmVuOmQuY2hpbGRyZW59KTswPT09KGIubW9kZSYxKSYmKGQubGFuZXM9Yyk7ZC5yZXR1cm49YjtkLnNpYmxpbmc9bnVsbDtudWxsIT09YSYmKGM9Yi5kZWxldGlvbnMsbnVsbD09PWM/KGIuZGVsZXRpb25zPVthXSxiLmZsYWdzfD0xNik6Yy5wdXNoKGEpKTtiLmNoaWxkPWQ7Yi5tZW1vaXplZFN0YXRlPW51bGw7cmV0dXJuIGR9XG5mdW5jdGlvbiByaihhLGIpe2I9cWooe21vZGU6XCJ2aXNpYmxlXCIsY2hpbGRyZW46Yn0sYS5tb2RlLDAsbnVsbCk7Yi5yZXR1cm49YTtyZXR1cm4gYS5jaGlsZD1ifWZ1bmN0aW9uIHRqKGEsYixjLGQpe251bGwhPT1kJiZKZyhkKTtCaChiLGEuY2hpbGQsbnVsbCxjKTthPXJqKGIsYi5wZW5kaW5nUHJvcHMuY2hpbGRyZW4pO2EuZmxhZ3N8PTI7Yi5tZW1vaXplZFN0YXRlPW51bGw7cmV0dXJuIGF9XG5mdW5jdGlvbiBzaihhLGIsYyxkLGUsZixnKXtpZihjKXtpZihiLmZsYWdzJjI1NilyZXR1cm4gYi5mbGFncyY9LTI1NyxkPUxpKEVycm9yKHAoNDIyKSkpLHRqKGEsYixnLGQpO2lmKG51bGwhPT1iLm1lbW9pemVkU3RhdGUpcmV0dXJuIGIuY2hpbGQ9YS5jaGlsZCxiLmZsYWdzfD0xMjgsbnVsbDtmPWQuZmFsbGJhY2s7ZT1iLm1vZGU7ZD1xaih7bW9kZTpcInZpc2libGVcIixjaGlsZHJlbjpkLmNoaWxkcmVufSxlLDAsbnVsbCk7Zj1BaChmLGUsZyxudWxsKTtmLmZsYWdzfD0yO2QucmV0dXJuPWI7Zi5yZXR1cm49YjtkLnNpYmxpbmc9ZjtiLmNoaWxkPWQ7MCE9PShiLm1vZGUmMSkmJkJoKGIsYS5jaGlsZCxudWxsLGcpO2IuY2hpbGQubWVtb2l6ZWRTdGF0ZT1vaihnKTtiLm1lbW9pemVkU3RhdGU9bmo7cmV0dXJuIGZ9aWYoMD09PShiLm1vZGUmMSkpcmV0dXJuIHRqKGEsYixnLG51bGwpO2lmKFwiJCFcIj09PWUuZGF0YSl7ZD1lLm5leHRTaWJsaW5nJiZlLm5leHRTaWJsaW5nLmRhdGFzZXQ7XG5pZihkKXZhciBoPWQuZGdzdDtkPWg7Zj1FcnJvcihwKDQxOSkpO2Q9TGkoZixkLHZvaWQgMCk7cmV0dXJuIHRqKGEsYixnLGQpfWg9MCE9PShnJmEuY2hpbGRMYW5lcyk7aWYoVWd8fGgpe2Q9UjtpZihudWxsIT09ZCl7c3dpdGNoKGcmLWcpe2Nhc2UgNDplPTI7YnJlYWs7Y2FzZSAxNjplPTg7YnJlYWs7Y2FzZSA2NDpjYXNlIDEyODpjYXNlIDI1NjpjYXNlIDUxMjpjYXNlIDEwMjQ6Y2FzZSAyMDQ4OmNhc2UgNDA5NjpjYXNlIDgxOTI6Y2FzZSAxNjM4NDpjYXNlIDMyNzY4OmNhc2UgNjU1MzY6Y2FzZSAxMzEwNzI6Y2FzZSAyNjIxNDQ6Y2FzZSA1MjQyODg6Y2FzZSAxMDQ4NTc2OmNhc2UgMjA5NzE1MjpjYXNlIDQxOTQzMDQ6Y2FzZSA4Mzg4NjA4OmNhc2UgMTY3NzcyMTY6Y2FzZSAzMzU1NDQzMjpjYXNlIDY3MTA4ODY0OmU9MzI7YnJlYWs7Y2FzZSA1MzY4NzA5MTI6ZT0yNjg0MzU0NTY7YnJlYWs7ZGVmYXVsdDplPTB9ZT0wIT09KGUmKGQuc3VzcGVuZGVkTGFuZXN8ZykpPzA6ZTtcbjAhPT1lJiZlIT09Zi5yZXRyeUxhbmUmJihmLnJldHJ5TGFuZT1lLFpnKGEsZSksbWgoZCxhLGUsLTEpKX11aigpO2Q9TGkoRXJyb3IocCg0MjEpKSk7cmV0dXJuIHRqKGEsYixnLGQpfWlmKFwiJD9cIj09PWUuZGF0YSlyZXR1cm4gYi5mbGFnc3w9MTI4LGIuY2hpbGQ9YS5jaGlsZCxiPXZqLmJpbmQobnVsbCxhKSxlLl9yZWFjdFJldHJ5PWIsbnVsbDthPWYudHJlZUNvbnRleHQ7eWc9TGYoZS5uZXh0U2libGluZyk7eGc9YjtJPSEwO3pnPW51bGw7bnVsbCE9PWEmJihvZ1twZysrXT1yZyxvZ1twZysrXT1zZyxvZ1twZysrXT1xZyxyZz1hLmlkLHNnPWEub3ZlcmZsb3cscWc9Yik7Yj1yaihiLGQuY2hpbGRyZW4pO2IuZmxhZ3N8PTQwOTY7cmV0dXJuIGJ9ZnVuY3Rpb24gd2ooYSxiLGMpe2EubGFuZXN8PWI7dmFyIGQ9YS5hbHRlcm5hdGU7bnVsbCE9PWQmJihkLmxhbmVzfD1iKTtTZyhhLnJldHVybixiLGMpfVxuZnVuY3Rpb24geGooYSxiLGMsZCxlKXt2YXIgZj1hLm1lbW9pemVkU3RhdGU7bnVsbD09PWY/YS5tZW1vaXplZFN0YXRlPXtpc0JhY2t3YXJkczpiLHJlbmRlcmluZzpudWxsLHJlbmRlcmluZ1N0YXJ0VGltZTowLGxhc3Q6ZCx0YWlsOmMsdGFpbE1vZGU6ZX06KGYuaXNCYWNrd2FyZHM9YixmLnJlbmRlcmluZz1udWxsLGYucmVuZGVyaW5nU3RhcnRUaW1lPTAsZi5sYXN0PWQsZi50YWlsPWMsZi50YWlsTW9kZT1lKX1cbmZ1bmN0aW9uIHlqKGEsYixjKXt2YXIgZD1iLnBlbmRpbmdQcm9wcyxlPWQucmV2ZWFsT3JkZXIsZj1kLnRhaWw7WWkoYSxiLGQuY2hpbGRyZW4sYyk7ZD1NLmN1cnJlbnQ7aWYoMCE9PShkJjIpKWQ9ZCYxfDIsYi5mbGFnc3w9MTI4O2Vsc2V7aWYobnVsbCE9PWEmJjAhPT0oYS5mbGFncyYxMjgpKWE6Zm9yKGE9Yi5jaGlsZDtudWxsIT09YTspe2lmKDEzPT09YS50YWcpbnVsbCE9PWEubWVtb2l6ZWRTdGF0ZSYmd2ooYSxjLGIpO2Vsc2UgaWYoMTk9PT1hLnRhZyl3aihhLGMsYik7ZWxzZSBpZihudWxsIT09YS5jaGlsZCl7YS5jaGlsZC5yZXR1cm49YTthPWEuY2hpbGQ7Y29udGludWV9aWYoYT09PWIpYnJlYWsgYTtmb3IoO251bGw9PT1hLnNpYmxpbmc7KXtpZihudWxsPT09YS5yZXR1cm58fGEucmV0dXJuPT09YilicmVhayBhO2E9YS5yZXR1cm59YS5zaWJsaW5nLnJldHVybj1hLnJldHVybjthPWEuc2libGluZ31kJj0xfUcoTSxkKTtpZigwPT09KGIubW9kZSYxKSliLm1lbW9pemVkU3RhdGU9XG5udWxsO2Vsc2Ugc3dpdGNoKGUpe2Nhc2UgXCJmb3J3YXJkc1wiOmM9Yi5jaGlsZDtmb3IoZT1udWxsO251bGwhPT1jOylhPWMuYWx0ZXJuYXRlLG51bGwhPT1hJiZudWxsPT09TWgoYSkmJihlPWMpLGM9Yy5zaWJsaW5nO2M9ZTtudWxsPT09Yz8oZT1iLmNoaWxkLGIuY2hpbGQ9bnVsbCk6KGU9Yy5zaWJsaW5nLGMuc2libGluZz1udWxsKTt4aihiLCExLGUsYyxmKTticmVhaztjYXNlIFwiYmFja3dhcmRzXCI6Yz1udWxsO2U9Yi5jaGlsZDtmb3IoYi5jaGlsZD1udWxsO251bGwhPT1lOyl7YT1lLmFsdGVybmF0ZTtpZihudWxsIT09YSYmbnVsbD09PU1oKGEpKXtiLmNoaWxkPWU7YnJlYWt9YT1lLnNpYmxpbmc7ZS5zaWJsaW5nPWM7Yz1lO2U9YX14aihiLCEwLGMsbnVsbCxmKTticmVhaztjYXNlIFwidG9nZXRoZXJcIjp4aihiLCExLG51bGwsbnVsbCx2b2lkIDApO2JyZWFrO2RlZmF1bHQ6Yi5tZW1vaXplZFN0YXRlPW51bGx9cmV0dXJuIGIuY2hpbGR9XG5mdW5jdGlvbiBqaihhLGIpezA9PT0oYi5tb2RlJjEpJiZudWxsIT09YSYmKGEuYWx0ZXJuYXRlPW51bGwsYi5hbHRlcm5hdGU9bnVsbCxiLmZsYWdzfD0yKX1mdW5jdGlvbiAkaShhLGIsYyl7bnVsbCE9PWEmJihiLmRlcGVuZGVuY2llcz1hLmRlcGVuZGVuY2llcyk7aGh8PWIubGFuZXM7aWYoMD09PShjJmIuY2hpbGRMYW5lcykpcmV0dXJuIG51bGw7aWYobnVsbCE9PWEmJmIuY2hpbGQhPT1hLmNoaWxkKXRocm93IEVycm9yKHAoMTUzKSk7aWYobnVsbCE9PWIuY2hpbGQpe2E9Yi5jaGlsZDtjPXdoKGEsYS5wZW5kaW5nUHJvcHMpO2IuY2hpbGQ9Yztmb3IoYy5yZXR1cm49YjtudWxsIT09YS5zaWJsaW5nOylhPWEuc2libGluZyxjPWMuc2libGluZz13aChhLGEucGVuZGluZ1Byb3BzKSxjLnJldHVybj1iO2Muc2libGluZz1udWxsfXJldHVybiBiLmNoaWxkfVxuZnVuY3Rpb24gemooYSxiLGMpe3N3aXRjaChiLnRhZyl7Y2FzZSAzOmxqKGIpO0lnKCk7YnJlYWs7Y2FzZSA1OktoKGIpO2JyZWFrO2Nhc2UgMTpaZihiLnR5cGUpJiZjZyhiKTticmVhaztjYXNlIDQ6SWgoYixiLnN0YXRlTm9kZS5jb250YWluZXJJbmZvKTticmVhaztjYXNlIDEwOnZhciBkPWIudHlwZS5fY29udGV4dCxlPWIubWVtb2l6ZWRQcm9wcy52YWx1ZTtHKE1nLGQuX2N1cnJlbnRWYWx1ZSk7ZC5fY3VycmVudFZhbHVlPWU7YnJlYWs7Y2FzZSAxMzpkPWIubWVtb2l6ZWRTdGF0ZTtpZihudWxsIT09ZCl7aWYobnVsbCE9PWQuZGVoeWRyYXRlZClyZXR1cm4gRyhNLE0uY3VycmVudCYxKSxiLmZsYWdzfD0xMjgsbnVsbDtpZigwIT09KGMmYi5jaGlsZC5jaGlsZExhbmVzKSlyZXR1cm4gcGooYSxiLGMpO0coTSxNLmN1cnJlbnQmMSk7YT0kaShhLGIsYyk7cmV0dXJuIG51bGwhPT1hP2Euc2libGluZzpudWxsfUcoTSxNLmN1cnJlbnQmMSk7YnJlYWs7Y2FzZSAxOTpkPTAhPT0oYyZcbmIuY2hpbGRMYW5lcyk7aWYoMCE9PShhLmZsYWdzJjEyOCkpe2lmKGQpcmV0dXJuIHlqKGEsYixjKTtiLmZsYWdzfD0xMjh9ZT1iLm1lbW9pemVkU3RhdGU7bnVsbCE9PWUmJihlLnJlbmRlcmluZz1udWxsLGUudGFpbD1udWxsLGUubGFzdEVmZmVjdD1udWxsKTtHKE0sTS5jdXJyZW50KTtpZihkKWJyZWFrO2Vsc2UgcmV0dXJuIG51bGw7Y2FzZSAyMjpjYXNlIDIzOnJldHVybiBiLmxhbmVzPTAsZWooYSxiLGMpfXJldHVybiAkaShhLGIsYyl9dmFyIEFqLEJqLENqLERqO1xuQWo9ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9Yi5jaGlsZDtudWxsIT09Yzspe2lmKDU9PT1jLnRhZ3x8Nj09PWMudGFnKWEuYXBwZW5kQ2hpbGQoYy5zdGF0ZU5vZGUpO2Vsc2UgaWYoNCE9PWMudGFnJiZudWxsIT09Yy5jaGlsZCl7Yy5jaGlsZC5yZXR1cm49YztjPWMuY2hpbGQ7Y29udGludWV9aWYoYz09PWIpYnJlYWs7Zm9yKDtudWxsPT09Yy5zaWJsaW5nOyl7aWYobnVsbD09PWMucmV0dXJufHxjLnJldHVybj09PWIpcmV0dXJuO2M9Yy5yZXR1cm59Yy5zaWJsaW5nLnJldHVybj1jLnJldHVybjtjPWMuc2libGluZ319O0JqPWZ1bmN0aW9uKCl7fTtcbkNqPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPWEubWVtb2l6ZWRQcm9wcztpZihlIT09ZCl7YT1iLnN0YXRlTm9kZTtIaChFaC5jdXJyZW50KTt2YXIgZj1udWxsO3N3aXRjaChjKXtjYXNlIFwiaW5wdXRcIjplPVlhKGEsZSk7ZD1ZYShhLGQpO2Y9W107YnJlYWs7Y2FzZSBcInNlbGVjdFwiOmU9QSh7fSxlLHt2YWx1ZTp2b2lkIDB9KTtkPUEoe30sZCx7dmFsdWU6dm9pZCAwfSk7Zj1bXTticmVhaztjYXNlIFwidGV4dGFyZWFcIjplPWdiKGEsZSk7ZD1nYihhLGQpO2Y9W107YnJlYWs7ZGVmYXVsdDpcImZ1bmN0aW9uXCIhPT10eXBlb2YgZS5vbkNsaWNrJiZcImZ1bmN0aW9uXCI9PT10eXBlb2YgZC5vbkNsaWNrJiYoYS5vbmNsaWNrPUJmKX11YihjLGQpO3ZhciBnO2M9bnVsbDtmb3IobCBpbiBlKWlmKCFkLmhhc093blByb3BlcnR5KGwpJiZlLmhhc093blByb3BlcnR5KGwpJiZudWxsIT1lW2xdKWlmKFwic3R5bGVcIj09PWwpe3ZhciBoPWVbbF07Zm9yKGcgaW4gaCloLmhhc093blByb3BlcnR5KGcpJiZcbihjfHwoYz17fSksY1tnXT1cIlwiKX1lbHNlXCJkYW5nZXJvdXNseVNldElubmVySFRNTFwiIT09bCYmXCJjaGlsZHJlblwiIT09bCYmXCJzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmdcIiE9PWwmJlwic3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nXCIhPT1sJiZcImF1dG9Gb2N1c1wiIT09bCYmKGVhLmhhc093blByb3BlcnR5KGwpP2Z8fChmPVtdKTooZj1mfHxbXSkucHVzaChsLG51bGwpKTtmb3IobCBpbiBkKXt2YXIgaz1kW2xdO2g9bnVsbCE9ZT9lW2xdOnZvaWQgMDtpZihkLmhhc093blByb3BlcnR5KGwpJiZrIT09aCYmKG51bGwhPWt8fG51bGwhPWgpKWlmKFwic3R5bGVcIj09PWwpaWYoaCl7Zm9yKGcgaW4gaCkhaC5oYXNPd25Qcm9wZXJ0eShnKXx8ayYmay5oYXNPd25Qcm9wZXJ0eShnKXx8KGN8fChjPXt9KSxjW2ddPVwiXCIpO2ZvcihnIGluIGspay5oYXNPd25Qcm9wZXJ0eShnKSYmaFtnXSE9PWtbZ10mJihjfHwoYz17fSksY1tnXT1rW2ddKX1lbHNlIGN8fChmfHwoZj1bXSksZi5wdXNoKGwsXG5jKSksYz1rO2Vsc2VcImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MXCI9PT1sPyhrPWs/ay5fX2h0bWw6dm9pZCAwLGg9aD9oLl9faHRtbDp2b2lkIDAsbnVsbCE9ayYmaCE9PWsmJihmPWZ8fFtdKS5wdXNoKGwsaykpOlwiY2hpbGRyZW5cIj09PWw/XCJzdHJpbmdcIiE9PXR5cGVvZiBrJiZcIm51bWJlclwiIT09dHlwZW9mIGt8fChmPWZ8fFtdKS5wdXNoKGwsXCJcIitrKTpcInN1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZ1wiIT09bCYmXCJzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmdcIiE9PWwmJihlYS5oYXNPd25Qcm9wZXJ0eShsKT8obnVsbCE9ayYmXCJvblNjcm9sbFwiPT09bCYmRChcInNjcm9sbFwiLGEpLGZ8fGg9PT1rfHwoZj1bXSkpOihmPWZ8fFtdKS5wdXNoKGwsaykpfWMmJihmPWZ8fFtdKS5wdXNoKFwic3R5bGVcIixjKTt2YXIgbD1mO2lmKGIudXBkYXRlUXVldWU9bCliLmZsYWdzfD00fX07RGo9ZnVuY3Rpb24oYSxiLGMsZCl7YyE9PWQmJihiLmZsYWdzfD00KX07XG5mdW5jdGlvbiBFaihhLGIpe2lmKCFJKXN3aXRjaChhLnRhaWxNb2RlKXtjYXNlIFwiaGlkZGVuXCI6Yj1hLnRhaWw7Zm9yKHZhciBjPW51bGw7bnVsbCE9PWI7KW51bGwhPT1iLmFsdGVybmF0ZSYmKGM9YiksYj1iLnNpYmxpbmc7bnVsbD09PWM/YS50YWlsPW51bGw6Yy5zaWJsaW5nPW51bGw7YnJlYWs7Y2FzZSBcImNvbGxhcHNlZFwiOmM9YS50YWlsO2Zvcih2YXIgZD1udWxsO251bGwhPT1jOyludWxsIT09Yy5hbHRlcm5hdGUmJihkPWMpLGM9Yy5zaWJsaW5nO251bGw9PT1kP2J8fG51bGw9PT1hLnRhaWw/YS50YWlsPW51bGw6YS50YWlsLnNpYmxpbmc9bnVsbDpkLnNpYmxpbmc9bnVsbH19XG5mdW5jdGlvbiBTKGEpe3ZhciBiPW51bGwhPT1hLmFsdGVybmF0ZSYmYS5hbHRlcm5hdGUuY2hpbGQ9PT1hLmNoaWxkLGM9MCxkPTA7aWYoYilmb3IodmFyIGU9YS5jaGlsZDtudWxsIT09ZTspY3w9ZS5sYW5lc3xlLmNoaWxkTGFuZXMsZHw9ZS5zdWJ0cmVlRmxhZ3MmMTQ2ODAwNjQsZHw9ZS5mbGFncyYxNDY4MDA2NCxlLnJldHVybj1hLGU9ZS5zaWJsaW5nO2Vsc2UgZm9yKGU9YS5jaGlsZDtudWxsIT09ZTspY3w9ZS5sYW5lc3xlLmNoaWxkTGFuZXMsZHw9ZS5zdWJ0cmVlRmxhZ3MsZHw9ZS5mbGFncyxlLnJldHVybj1hLGU9ZS5zaWJsaW5nO2Euc3VidHJlZUZsYWdzfD1kO2EuY2hpbGRMYW5lcz1jO3JldHVybiBifVxuZnVuY3Rpb24gRmooYSxiLGMpe3ZhciBkPWIucGVuZGluZ1Byb3BzO3dnKGIpO3N3aXRjaChiLnRhZyl7Y2FzZSAyOmNhc2UgMTY6Y2FzZSAxNTpjYXNlIDA6Y2FzZSAxMTpjYXNlIDc6Y2FzZSA4OmNhc2UgMTI6Y2FzZSA5OmNhc2UgMTQ6cmV0dXJuIFMoYiksbnVsbDtjYXNlIDE6cmV0dXJuIFpmKGIudHlwZSkmJiRmKCksUyhiKSxudWxsO2Nhc2UgMzpkPWIuc3RhdGVOb2RlO0poKCk7RShXZik7RShIKTtPaCgpO2QucGVuZGluZ0NvbnRleHQmJihkLmNvbnRleHQ9ZC5wZW5kaW5nQ29udGV4dCxkLnBlbmRpbmdDb250ZXh0PW51bGwpO2lmKG51bGw9PT1hfHxudWxsPT09YS5jaGlsZClHZyhiKT9iLmZsYWdzfD00Om51bGw9PT1hfHxhLm1lbW9pemVkU3RhdGUuaXNEZWh5ZHJhdGVkJiYwPT09KGIuZmxhZ3MmMjU2KXx8KGIuZmxhZ3N8PTEwMjQsbnVsbCE9PXpnJiYoR2ooemcpLHpnPW51bGwpKTtCaihhLGIpO1MoYik7cmV0dXJuIG51bGw7Y2FzZSA1OkxoKGIpO3ZhciBlPUhoKEdoLmN1cnJlbnQpO1xuYz1iLnR5cGU7aWYobnVsbCE9PWEmJm51bGwhPWIuc3RhdGVOb2RlKUNqKGEsYixjLGQsZSksYS5yZWYhPT1iLnJlZiYmKGIuZmxhZ3N8PTUxMixiLmZsYWdzfD0yMDk3MTUyKTtlbHNle2lmKCFkKXtpZihudWxsPT09Yi5zdGF0ZU5vZGUpdGhyb3cgRXJyb3IocCgxNjYpKTtTKGIpO3JldHVybiBudWxsfWE9SGgoRWguY3VycmVudCk7aWYoR2coYikpe2Q9Yi5zdGF0ZU5vZGU7Yz1iLnR5cGU7dmFyIGY9Yi5tZW1vaXplZFByb3BzO2RbT2ZdPWI7ZFtQZl09ZjthPTAhPT0oYi5tb2RlJjEpO3N3aXRjaChjKXtjYXNlIFwiZGlhbG9nXCI6RChcImNhbmNlbFwiLGQpO0QoXCJjbG9zZVwiLGQpO2JyZWFrO2Nhc2UgXCJpZnJhbWVcIjpjYXNlIFwib2JqZWN0XCI6Y2FzZSBcImVtYmVkXCI6RChcImxvYWRcIixkKTticmVhaztjYXNlIFwidmlkZW9cIjpjYXNlIFwiYXVkaW9cIjpmb3IoZT0wO2U8bGYubGVuZ3RoO2UrKylEKGxmW2VdLGQpO2JyZWFrO2Nhc2UgXCJzb3VyY2VcIjpEKFwiZXJyb3JcIixkKTticmVhaztjYXNlIFwiaW1nXCI6Y2FzZSBcImltYWdlXCI6Y2FzZSBcImxpbmtcIjpEKFwiZXJyb3JcIixcbmQpO0QoXCJsb2FkXCIsZCk7YnJlYWs7Y2FzZSBcImRldGFpbHNcIjpEKFwidG9nZ2xlXCIsZCk7YnJlYWs7Y2FzZSBcImlucHV0XCI6WmEoZCxmKTtEKFwiaW52YWxpZFwiLGQpO2JyZWFrO2Nhc2UgXCJzZWxlY3RcIjpkLl93cmFwcGVyU3RhdGU9e3dhc011bHRpcGxlOiEhZi5tdWx0aXBsZX07RChcImludmFsaWRcIixkKTticmVhaztjYXNlIFwidGV4dGFyZWFcIjpoYihkLGYpLEQoXCJpbnZhbGlkXCIsZCl9dWIoYyxmKTtlPW51bGw7Zm9yKHZhciBnIGluIGYpaWYoZi5oYXNPd25Qcm9wZXJ0eShnKSl7dmFyIGg9ZltnXTtcImNoaWxkcmVuXCI9PT1nP1wic3RyaW5nXCI9PT10eXBlb2YgaD9kLnRleHRDb250ZW50IT09aCYmKCEwIT09Zi5zdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmcmJkFmKGQudGV4dENvbnRlbnQsaCxhKSxlPVtcImNoaWxkcmVuXCIsaF0pOlwibnVtYmVyXCI9PT10eXBlb2YgaCYmZC50ZXh0Q29udGVudCE9PVwiXCIraCYmKCEwIT09Zi5zdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmcmJkFmKGQudGV4dENvbnRlbnQsXG5oLGEpLGU9W1wiY2hpbGRyZW5cIixcIlwiK2hdKTplYS5oYXNPd25Qcm9wZXJ0eShnKSYmbnVsbCE9aCYmXCJvblNjcm9sbFwiPT09ZyYmRChcInNjcm9sbFwiLGQpfXN3aXRjaChjKXtjYXNlIFwiaW5wdXRcIjpWYShkKTtkYihkLGYsITApO2JyZWFrO2Nhc2UgXCJ0ZXh0YXJlYVwiOlZhKGQpO2piKGQpO2JyZWFrO2Nhc2UgXCJzZWxlY3RcIjpjYXNlIFwib3B0aW9uXCI6YnJlYWs7ZGVmYXVsdDpcImZ1bmN0aW9uXCI9PT10eXBlb2YgZi5vbkNsaWNrJiYoZC5vbmNsaWNrPUJmKX1kPWU7Yi51cGRhdGVRdWV1ZT1kO251bGwhPT1kJiYoYi5mbGFnc3w9NCl9ZWxzZXtnPTk9PT1lLm5vZGVUeXBlP2U6ZS5vd25lckRvY3VtZW50O1wiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbFwiPT09YSYmKGE9a2IoYykpO1wiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbFwiPT09YT9cInNjcmlwdFwiPT09Yz8oYT1nLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksYS5pbm5lckhUTUw9XCI8c2NyaXB0PlxceDNjL3NjcmlwdD5cIixhPWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKSk6XG5cInN0cmluZ1wiPT09dHlwZW9mIGQuaXM/YT1nLmNyZWF0ZUVsZW1lbnQoYyx7aXM6ZC5pc30pOihhPWcuY3JlYXRlRWxlbWVudChjKSxcInNlbGVjdFwiPT09YyYmKGc9YSxkLm11bHRpcGxlP2cubXVsdGlwbGU9ITA6ZC5zaXplJiYoZy5zaXplPWQuc2l6ZSkpKTphPWcuY3JlYXRlRWxlbWVudE5TKGEsYyk7YVtPZl09YjthW1BmXT1kO0FqKGEsYiwhMSwhMSk7Yi5zdGF0ZU5vZGU9YTthOntnPXZiKGMsZCk7c3dpdGNoKGMpe2Nhc2UgXCJkaWFsb2dcIjpEKFwiY2FuY2VsXCIsYSk7RChcImNsb3NlXCIsYSk7ZT1kO2JyZWFrO2Nhc2UgXCJpZnJhbWVcIjpjYXNlIFwib2JqZWN0XCI6Y2FzZSBcImVtYmVkXCI6RChcImxvYWRcIixhKTtlPWQ7YnJlYWs7Y2FzZSBcInZpZGVvXCI6Y2FzZSBcImF1ZGlvXCI6Zm9yKGU9MDtlPGxmLmxlbmd0aDtlKyspRChsZltlXSxhKTtlPWQ7YnJlYWs7Y2FzZSBcInNvdXJjZVwiOkQoXCJlcnJvclwiLGEpO2U9ZDticmVhaztjYXNlIFwiaW1nXCI6Y2FzZSBcImltYWdlXCI6Y2FzZSBcImxpbmtcIjpEKFwiZXJyb3JcIixcbmEpO0QoXCJsb2FkXCIsYSk7ZT1kO2JyZWFrO2Nhc2UgXCJkZXRhaWxzXCI6RChcInRvZ2dsZVwiLGEpO2U9ZDticmVhaztjYXNlIFwiaW5wdXRcIjpaYShhLGQpO2U9WWEoYSxkKTtEKFwiaW52YWxpZFwiLGEpO2JyZWFrO2Nhc2UgXCJvcHRpb25cIjplPWQ7YnJlYWs7Y2FzZSBcInNlbGVjdFwiOmEuX3dyYXBwZXJTdGF0ZT17d2FzTXVsdGlwbGU6ISFkLm11bHRpcGxlfTtlPUEoe30sZCx7dmFsdWU6dm9pZCAwfSk7RChcImludmFsaWRcIixhKTticmVhaztjYXNlIFwidGV4dGFyZWFcIjpoYihhLGQpO2U9Z2IoYSxkKTtEKFwiaW52YWxpZFwiLGEpO2JyZWFrO2RlZmF1bHQ6ZT1kfXViKGMsZSk7aD1lO2ZvcihmIGluIGgpaWYoaC5oYXNPd25Qcm9wZXJ0eShmKSl7dmFyIGs9aFtmXTtcInN0eWxlXCI9PT1mP3NiKGEsayk6XCJkYW5nZXJvdXNseVNldElubmVySFRNTFwiPT09Zj8oaz1rP2suX19odG1sOnZvaWQgMCxudWxsIT1rJiZuYihhLGspKTpcImNoaWxkcmVuXCI9PT1mP1wic3RyaW5nXCI9PT10eXBlb2Ygaz8oXCJ0ZXh0YXJlYVwiIT09XG5jfHxcIlwiIT09aykmJm9iKGEsayk6XCJudW1iZXJcIj09PXR5cGVvZiBrJiZvYihhLFwiXCIrayk6XCJzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmdcIiE9PWYmJlwic3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nXCIhPT1mJiZcImF1dG9Gb2N1c1wiIT09ZiYmKGVhLmhhc093blByb3BlcnR5KGYpP251bGwhPWsmJlwib25TY3JvbGxcIj09PWYmJkQoXCJzY3JvbGxcIixhKTpudWxsIT1rJiZ0YShhLGYsayxnKSl9c3dpdGNoKGMpe2Nhc2UgXCJpbnB1dFwiOlZhKGEpO2RiKGEsZCwhMSk7YnJlYWs7Y2FzZSBcInRleHRhcmVhXCI6VmEoYSk7amIoYSk7YnJlYWs7Y2FzZSBcIm9wdGlvblwiOm51bGwhPWQudmFsdWUmJmEuc2V0QXR0cmlidXRlKFwidmFsdWVcIixcIlwiK1NhKGQudmFsdWUpKTticmVhaztjYXNlIFwic2VsZWN0XCI6YS5tdWx0aXBsZT0hIWQubXVsdGlwbGU7Zj1kLnZhbHVlO251bGwhPWY/ZmIoYSwhIWQubXVsdGlwbGUsZiwhMSk6bnVsbCE9ZC5kZWZhdWx0VmFsdWUmJmZiKGEsISFkLm11bHRpcGxlLGQuZGVmYXVsdFZhbHVlLFxuITApO2JyZWFrO2RlZmF1bHQ6XCJmdW5jdGlvblwiPT09dHlwZW9mIGUub25DbGljayYmKGEub25jbGljaz1CZil9c3dpdGNoKGMpe2Nhc2UgXCJidXR0b25cIjpjYXNlIFwiaW5wdXRcIjpjYXNlIFwic2VsZWN0XCI6Y2FzZSBcInRleHRhcmVhXCI6ZD0hIWQuYXV0b0ZvY3VzO2JyZWFrIGE7Y2FzZSBcImltZ1wiOmQ9ITA7YnJlYWsgYTtkZWZhdWx0OmQ9ITF9fWQmJihiLmZsYWdzfD00KX1udWxsIT09Yi5yZWYmJihiLmZsYWdzfD01MTIsYi5mbGFnc3w9MjA5NzE1Mil9UyhiKTtyZXR1cm4gbnVsbDtjYXNlIDY6aWYoYSYmbnVsbCE9Yi5zdGF0ZU5vZGUpRGooYSxiLGEubWVtb2l6ZWRQcm9wcyxkKTtlbHNle2lmKFwic3RyaW5nXCIhPT10eXBlb2YgZCYmbnVsbD09PWIuc3RhdGVOb2RlKXRocm93IEVycm9yKHAoMTY2KSk7Yz1IaChHaC5jdXJyZW50KTtIaChFaC5jdXJyZW50KTtpZihHZyhiKSl7ZD1iLnN0YXRlTm9kZTtjPWIubWVtb2l6ZWRQcm9wcztkW09mXT1iO2lmKGY9ZC5ub2RlVmFsdWUhPT1jKWlmKGE9XG54ZyxudWxsIT09YSlzd2l0Y2goYS50YWcpe2Nhc2UgMzpBZihkLm5vZGVWYWx1ZSxjLDAhPT0oYS5tb2RlJjEpKTticmVhaztjYXNlIDU6ITAhPT1hLm1lbW9pemVkUHJvcHMuc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nJiZBZihkLm5vZGVWYWx1ZSxjLDAhPT0oYS5tb2RlJjEpKX1mJiYoYi5mbGFnc3w9NCl9ZWxzZSBkPSg5PT09Yy5ub2RlVHlwZT9jOmMub3duZXJEb2N1bWVudCkuY3JlYXRlVGV4dE5vZGUoZCksZFtPZl09YixiLnN0YXRlTm9kZT1kfVMoYik7cmV0dXJuIG51bGw7Y2FzZSAxMzpFKE0pO2Q9Yi5tZW1vaXplZFN0YXRlO2lmKG51bGw9PT1hfHxudWxsIT09YS5tZW1vaXplZFN0YXRlJiZudWxsIT09YS5tZW1vaXplZFN0YXRlLmRlaHlkcmF0ZWQpe2lmKEkmJm51bGwhPT15ZyYmMCE9PShiLm1vZGUmMSkmJjA9PT0oYi5mbGFncyYxMjgpKUhnKCksSWcoKSxiLmZsYWdzfD05ODU2MCxmPSExO2Vsc2UgaWYoZj1HZyhiKSxudWxsIT09ZCYmbnVsbCE9PWQuZGVoeWRyYXRlZCl7aWYobnVsbD09PVxuYSl7aWYoIWYpdGhyb3cgRXJyb3IocCgzMTgpKTtmPWIubWVtb2l6ZWRTdGF0ZTtmPW51bGwhPT1mP2YuZGVoeWRyYXRlZDpudWxsO2lmKCFmKXRocm93IEVycm9yKHAoMzE3KSk7ZltPZl09Yn1lbHNlIElnKCksMD09PShiLmZsYWdzJjEyOCkmJihiLm1lbW9pemVkU3RhdGU9bnVsbCksYi5mbGFnc3w9NDtTKGIpO2Y9ITF9ZWxzZSBudWxsIT09emcmJihHaih6Zyksemc9bnVsbCksZj0hMDtpZighZilyZXR1cm4gYi5mbGFncyY2NTUzNj9iOm51bGx9aWYoMCE9PShiLmZsYWdzJjEyOCkpcmV0dXJuIGIubGFuZXM9YyxiO2Q9bnVsbCE9PWQ7ZCE9PShudWxsIT09YSYmbnVsbCE9PWEubWVtb2l6ZWRTdGF0ZSkmJmQmJihiLmNoaWxkLmZsYWdzfD04MTkyLDAhPT0oYi5tb2RlJjEpJiYobnVsbD09PWF8fDAhPT0oTS5jdXJyZW50JjEpPzA9PT1UJiYoVD0zKTp1aigpKSk7bnVsbCE9PWIudXBkYXRlUXVldWUmJihiLmZsYWdzfD00KTtTKGIpO3JldHVybiBudWxsO2Nhc2UgNDpyZXR1cm4gSmgoKSxcbkJqKGEsYiksbnVsbD09PWEmJnNmKGIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pLFMoYiksbnVsbDtjYXNlIDEwOnJldHVybiBSZyhiLnR5cGUuX2NvbnRleHQpLFMoYiksbnVsbDtjYXNlIDE3OnJldHVybiBaZihiLnR5cGUpJiYkZigpLFMoYiksbnVsbDtjYXNlIDE5OkUoTSk7Zj1iLm1lbW9pemVkU3RhdGU7aWYobnVsbD09PWYpcmV0dXJuIFMoYiksbnVsbDtkPTAhPT0oYi5mbGFncyYxMjgpO2c9Zi5yZW5kZXJpbmc7aWYobnVsbD09PWcpaWYoZClFaihmLCExKTtlbHNle2lmKDAhPT1UfHxudWxsIT09YSYmMCE9PShhLmZsYWdzJjEyOCkpZm9yKGE9Yi5jaGlsZDtudWxsIT09YTspe2c9TWgoYSk7aWYobnVsbCE9PWcpe2IuZmxhZ3N8PTEyODtFaihmLCExKTtkPWcudXBkYXRlUXVldWU7bnVsbCE9PWQmJihiLnVwZGF0ZVF1ZXVlPWQsYi5mbGFnc3w9NCk7Yi5zdWJ0cmVlRmxhZ3M9MDtkPWM7Zm9yKGM9Yi5jaGlsZDtudWxsIT09YzspZj1jLGE9ZCxmLmZsYWdzJj0xNDY4MDA2Nixcbmc9Zi5hbHRlcm5hdGUsbnVsbD09PWc/KGYuY2hpbGRMYW5lcz0wLGYubGFuZXM9YSxmLmNoaWxkPW51bGwsZi5zdWJ0cmVlRmxhZ3M9MCxmLm1lbW9pemVkUHJvcHM9bnVsbCxmLm1lbW9pemVkU3RhdGU9bnVsbCxmLnVwZGF0ZVF1ZXVlPW51bGwsZi5kZXBlbmRlbmNpZXM9bnVsbCxmLnN0YXRlTm9kZT1udWxsKTooZi5jaGlsZExhbmVzPWcuY2hpbGRMYW5lcyxmLmxhbmVzPWcubGFuZXMsZi5jaGlsZD1nLmNoaWxkLGYuc3VidHJlZUZsYWdzPTAsZi5kZWxldGlvbnM9bnVsbCxmLm1lbW9pemVkUHJvcHM9Zy5tZW1vaXplZFByb3BzLGYubWVtb2l6ZWRTdGF0ZT1nLm1lbW9pemVkU3RhdGUsZi51cGRhdGVRdWV1ZT1nLnVwZGF0ZVF1ZXVlLGYudHlwZT1nLnR5cGUsYT1nLmRlcGVuZGVuY2llcyxmLmRlcGVuZGVuY2llcz1udWxsPT09YT9udWxsOntsYW5lczphLmxhbmVzLGZpcnN0Q29udGV4dDphLmZpcnN0Q29udGV4dH0pLGM9Yy5zaWJsaW5nO0coTSxNLmN1cnJlbnQmMXwyKTtyZXR1cm4gYi5jaGlsZH1hPVxuYS5zaWJsaW5nfW51bGwhPT1mLnRhaWwmJkIoKT5IaiYmKGIuZmxhZ3N8PTEyOCxkPSEwLEVqKGYsITEpLGIubGFuZXM9NDE5NDMwNCl9ZWxzZXtpZighZClpZihhPU1oKGcpLG51bGwhPT1hKXtpZihiLmZsYWdzfD0xMjgsZD0hMCxjPWEudXBkYXRlUXVldWUsbnVsbCE9PWMmJihiLnVwZGF0ZVF1ZXVlPWMsYi5mbGFnc3w9NCksRWooZiwhMCksbnVsbD09PWYudGFpbCYmXCJoaWRkZW5cIj09PWYudGFpbE1vZGUmJiFnLmFsdGVybmF0ZSYmIUkpcmV0dXJuIFMoYiksbnVsbH1lbHNlIDIqQigpLWYucmVuZGVyaW5nU3RhcnRUaW1lPkhqJiYxMDczNzQxODI0IT09YyYmKGIuZmxhZ3N8PTEyOCxkPSEwLEVqKGYsITEpLGIubGFuZXM9NDE5NDMwNCk7Zi5pc0JhY2t3YXJkcz8oZy5zaWJsaW5nPWIuY2hpbGQsYi5jaGlsZD1nKTooYz1mLmxhc3QsbnVsbCE9PWM/Yy5zaWJsaW5nPWc6Yi5jaGlsZD1nLGYubGFzdD1nKX1pZihudWxsIT09Zi50YWlsKXJldHVybiBiPWYudGFpbCxmLnJlbmRlcmluZz1cbmIsZi50YWlsPWIuc2libGluZyxmLnJlbmRlcmluZ1N0YXJ0VGltZT1CKCksYi5zaWJsaW5nPW51bGwsYz1NLmN1cnJlbnQsRyhNLGQ/YyYxfDI6YyYxKSxiO1MoYik7cmV0dXJuIG51bGw7Y2FzZSAyMjpjYXNlIDIzOnJldHVybiBJaigpLGQ9bnVsbCE9PWIubWVtb2l6ZWRTdGF0ZSxudWxsIT09YSYmbnVsbCE9PWEubWVtb2l6ZWRTdGF0ZSE9PWQmJihiLmZsYWdzfD04MTkyKSxkJiYwIT09KGIubW9kZSYxKT8wIT09KGdqJjEwNzM3NDE4MjQpJiYoUyhiKSxiLnN1YnRyZWVGbGFncyY2JiYoYi5mbGFnc3w9ODE5MikpOlMoYiksbnVsbDtjYXNlIDI0OnJldHVybiBudWxsO2Nhc2UgMjU6cmV0dXJuIG51bGx9dGhyb3cgRXJyb3IocCgxNTYsYi50YWcpKTt9XG5mdW5jdGlvbiBKaihhLGIpe3dnKGIpO3N3aXRjaChiLnRhZyl7Y2FzZSAxOnJldHVybiBaZihiLnR5cGUpJiYkZigpLGE9Yi5mbGFncyxhJjY1NTM2PyhiLmZsYWdzPWEmLTY1NTM3fDEyOCxiKTpudWxsO2Nhc2UgMzpyZXR1cm4gSmgoKSxFKFdmKSxFKEgpLE9oKCksYT1iLmZsYWdzLDAhPT0oYSY2NTUzNikmJjA9PT0oYSYxMjgpPyhiLmZsYWdzPWEmLTY1NTM3fDEyOCxiKTpudWxsO2Nhc2UgNTpyZXR1cm4gTGgoYiksbnVsbDtjYXNlIDEzOkUoTSk7YT1iLm1lbW9pemVkU3RhdGU7aWYobnVsbCE9PWEmJm51bGwhPT1hLmRlaHlkcmF0ZWQpe2lmKG51bGw9PT1iLmFsdGVybmF0ZSl0aHJvdyBFcnJvcihwKDM0MCkpO0lnKCl9YT1iLmZsYWdzO3JldHVybiBhJjY1NTM2PyhiLmZsYWdzPWEmLTY1NTM3fDEyOCxiKTpudWxsO2Nhc2UgMTk6cmV0dXJuIEUoTSksbnVsbDtjYXNlIDQ6cmV0dXJuIEpoKCksbnVsbDtjYXNlIDEwOnJldHVybiBSZyhiLnR5cGUuX2NvbnRleHQpLG51bGw7Y2FzZSAyMjpjYXNlIDIzOnJldHVybiBJaigpLFxubnVsbDtjYXNlIDI0OnJldHVybiBudWxsO2RlZmF1bHQ6cmV0dXJuIG51bGx9fXZhciBLaj0hMSxVPSExLExqPVwiZnVuY3Rpb25cIj09PXR5cGVvZiBXZWFrU2V0P1dlYWtTZXQ6U2V0LFY9bnVsbDtmdW5jdGlvbiBNaihhLGIpe3ZhciBjPWEucmVmO2lmKG51bGwhPT1jKWlmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBjKXRyeXtjKG51bGwpfWNhdGNoKGQpe1coYSxiLGQpfWVsc2UgYy5jdXJyZW50PW51bGx9ZnVuY3Rpb24gTmooYSxiLGMpe3RyeXtjKCl9Y2F0Y2goZCl7VyhhLGIsZCl9fXZhciBPaj0hMTtcbmZ1bmN0aW9uIFBqKGEsYil7Q2Y9ZGQ7YT1NZSgpO2lmKE5lKGEpKXtpZihcInNlbGVjdGlvblN0YXJ0XCJpbiBhKXZhciBjPXtzdGFydDphLnNlbGVjdGlvblN0YXJ0LGVuZDphLnNlbGVjdGlvbkVuZH07ZWxzZSBhOntjPShjPWEub3duZXJEb2N1bWVudCkmJmMuZGVmYXVsdFZpZXd8fHdpbmRvdzt2YXIgZD1jLmdldFNlbGVjdGlvbiYmYy5nZXRTZWxlY3Rpb24oKTtpZihkJiYwIT09ZC5yYW5nZUNvdW50KXtjPWQuYW5jaG9yTm9kZTt2YXIgZT1kLmFuY2hvck9mZnNldCxmPWQuZm9jdXNOb2RlO2Q9ZC5mb2N1c09mZnNldDt0cnl7Yy5ub2RlVHlwZSxmLm5vZGVUeXBlfWNhdGNoKEYpe2M9bnVsbDticmVhayBhfXZhciBnPTAsaD0tMSxrPS0xLGw9MCxtPTAscT1hLHI9bnVsbDtiOmZvcig7Oyl7Zm9yKHZhciB5Ozspe3EhPT1jfHwwIT09ZSYmMyE9PXEubm9kZVR5cGV8fChoPWcrZSk7cSE9PWZ8fDAhPT1kJiYzIT09cS5ub2RlVHlwZXx8KGs9ZytkKTszPT09cS5ub2RlVHlwZSYmKGcrPVxucS5ub2RlVmFsdWUubGVuZ3RoKTtpZihudWxsPT09KHk9cS5maXJzdENoaWxkKSlicmVhaztyPXE7cT15fWZvcig7Oyl7aWYocT09PWEpYnJlYWsgYjtyPT09YyYmKytsPT09ZSYmKGg9Zyk7cj09PWYmJisrbT09PWQmJihrPWcpO2lmKG51bGwhPT0oeT1xLm5leHRTaWJsaW5nKSlicmVhaztxPXI7cj1xLnBhcmVudE5vZGV9cT15fWM9LTE9PT1ofHwtMT09PWs/bnVsbDp7c3RhcnQ6aCxlbmQ6a319ZWxzZSBjPW51bGx9Yz1jfHx7c3RhcnQ6MCxlbmQ6MH19ZWxzZSBjPW51bGw7RGY9e2ZvY3VzZWRFbGVtOmEsc2VsZWN0aW9uUmFuZ2U6Y307ZGQ9ITE7Zm9yKFY9YjtudWxsIT09VjspaWYoYj1WLGE9Yi5jaGlsZCwwIT09KGIuc3VidHJlZUZsYWdzJjEwMjgpJiZudWxsIT09YSlhLnJldHVybj1iLFY9YTtlbHNlIGZvcig7bnVsbCE9PVY7KXtiPVY7dHJ5e3ZhciBuPWIuYWx0ZXJuYXRlO2lmKDAhPT0oYi5mbGFncyYxMDI0KSlzd2l0Y2goYi50YWcpe2Nhc2UgMDpjYXNlIDExOmNhc2UgMTU6YnJlYWs7XG5jYXNlIDE6aWYobnVsbCE9PW4pe3ZhciB0PW4ubWVtb2l6ZWRQcm9wcyxKPW4ubWVtb2l6ZWRTdGF0ZSx4PWIuc3RhdGVOb2RlLHc9eC5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZShiLmVsZW1lbnRUeXBlPT09Yi50eXBlP3Q6TGcoYi50eXBlLHQpLEopO3guX19yZWFjdEludGVybmFsU25hcHNob3RCZWZvcmVVcGRhdGU9d31icmVhaztjYXNlIDM6dmFyIHU9Yi5zdGF0ZU5vZGUuY29udGFpbmVySW5mbzsxPT09dS5ub2RlVHlwZT91LnRleHRDb250ZW50PVwiXCI6OT09PXUubm9kZVR5cGUmJnUuZG9jdW1lbnRFbGVtZW50JiZ1LnJlbW92ZUNoaWxkKHUuZG9jdW1lbnRFbGVtZW50KTticmVhaztjYXNlIDU6Y2FzZSA2OmNhc2UgNDpjYXNlIDE3OmJyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IocCgxNjMpKTt9fWNhdGNoKEYpe1coYixiLnJldHVybixGKX1hPWIuc2libGluZztpZihudWxsIT09YSl7YS5yZXR1cm49Yi5yZXR1cm47Vj1hO2JyZWFrfVY9Yi5yZXR1cm59bj1PajtPaj0hMTtyZXR1cm4gbn1cbmZ1bmN0aW9uIFFqKGEsYixjKXt2YXIgZD1iLnVwZGF0ZVF1ZXVlO2Q9bnVsbCE9PWQ/ZC5sYXN0RWZmZWN0Om51bGw7aWYobnVsbCE9PWQpe3ZhciBlPWQ9ZC5uZXh0O2Rve2lmKChlLnRhZyZhKT09PWEpe3ZhciBmPWUuZGVzdHJveTtlLmRlc3Ryb3k9dm9pZCAwO3ZvaWQgMCE9PWYmJk5qKGIsYyxmKX1lPWUubmV4dH13aGlsZShlIT09ZCl9fWZ1bmN0aW9uIFJqKGEsYil7Yj1iLnVwZGF0ZVF1ZXVlO2I9bnVsbCE9PWI/Yi5sYXN0RWZmZWN0Om51bGw7aWYobnVsbCE9PWIpe3ZhciBjPWI9Yi5uZXh0O2Rve2lmKChjLnRhZyZhKT09PWEpe3ZhciBkPWMuY3JlYXRlO2MuZGVzdHJveT1kKCl9Yz1jLm5leHR9d2hpbGUoYyE9PWIpfX1mdW5jdGlvbiBTaihhKXt2YXIgYj1hLnJlZjtpZihudWxsIT09Yil7dmFyIGM9YS5zdGF0ZU5vZGU7c3dpdGNoKGEudGFnKXtjYXNlIDU6YT1jO2JyZWFrO2RlZmF1bHQ6YT1jfVwiZnVuY3Rpb25cIj09PXR5cGVvZiBiP2IoYSk6Yi5jdXJyZW50PWF9fVxuZnVuY3Rpb24gVGooYSl7dmFyIGI9YS5hbHRlcm5hdGU7bnVsbCE9PWImJihhLmFsdGVybmF0ZT1udWxsLFRqKGIpKTthLmNoaWxkPW51bGw7YS5kZWxldGlvbnM9bnVsbDthLnNpYmxpbmc9bnVsbDs1PT09YS50YWcmJihiPWEuc3RhdGVOb2RlLG51bGwhPT1iJiYoZGVsZXRlIGJbT2ZdLGRlbGV0ZSBiW1BmXSxkZWxldGUgYltvZl0sZGVsZXRlIGJbUWZdLGRlbGV0ZSBiW1JmXSkpO2Euc3RhdGVOb2RlPW51bGw7YS5yZXR1cm49bnVsbDthLmRlcGVuZGVuY2llcz1udWxsO2EubWVtb2l6ZWRQcm9wcz1udWxsO2EubWVtb2l6ZWRTdGF0ZT1udWxsO2EucGVuZGluZ1Byb3BzPW51bGw7YS5zdGF0ZU5vZGU9bnVsbDthLnVwZGF0ZVF1ZXVlPW51bGx9ZnVuY3Rpb24gVWooYSl7cmV0dXJuIDU9PT1hLnRhZ3x8Mz09PWEudGFnfHw0PT09YS50YWd9XG5mdW5jdGlvbiBWaihhKXthOmZvcig7Oyl7Zm9yKDtudWxsPT09YS5zaWJsaW5nOyl7aWYobnVsbD09PWEucmV0dXJufHxVaihhLnJldHVybikpcmV0dXJuIG51bGw7YT1hLnJldHVybn1hLnNpYmxpbmcucmV0dXJuPWEucmV0dXJuO2ZvcihhPWEuc2libGluZzs1IT09YS50YWcmJjYhPT1hLnRhZyYmMTghPT1hLnRhZzspe2lmKGEuZmxhZ3MmMiljb250aW51ZSBhO2lmKG51bGw9PT1hLmNoaWxkfHw0PT09YS50YWcpY29udGludWUgYTtlbHNlIGEuY2hpbGQucmV0dXJuPWEsYT1hLmNoaWxkfWlmKCEoYS5mbGFncyYyKSlyZXR1cm4gYS5zdGF0ZU5vZGV9fVxuZnVuY3Rpb24gV2ooYSxiLGMpe3ZhciBkPWEudGFnO2lmKDU9PT1kfHw2PT09ZClhPWEuc3RhdGVOb2RlLGI/OD09PWMubm9kZVR5cGU/Yy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShhLGIpOmMuaW5zZXJ0QmVmb3JlKGEsYik6KDg9PT1jLm5vZGVUeXBlPyhiPWMucGFyZW50Tm9kZSxiLmluc2VydEJlZm9yZShhLGMpKTooYj1jLGIuYXBwZW5kQ2hpbGQoYSkpLGM9Yy5fcmVhY3RSb290Q29udGFpbmVyLG51bGwhPT1jJiZ2b2lkIDAhPT1jfHxudWxsIT09Yi5vbmNsaWNrfHwoYi5vbmNsaWNrPUJmKSk7ZWxzZSBpZig0IT09ZCYmKGE9YS5jaGlsZCxudWxsIT09YSkpZm9yKFdqKGEsYixjKSxhPWEuc2libGluZztudWxsIT09YTspV2ooYSxiLGMpLGE9YS5zaWJsaW5nfVxuZnVuY3Rpb24gWGooYSxiLGMpe3ZhciBkPWEudGFnO2lmKDU9PT1kfHw2PT09ZClhPWEuc3RhdGVOb2RlLGI/Yy5pbnNlcnRCZWZvcmUoYSxiKTpjLmFwcGVuZENoaWxkKGEpO2Vsc2UgaWYoNCE9PWQmJihhPWEuY2hpbGQsbnVsbCE9PWEpKWZvcihYaihhLGIsYyksYT1hLnNpYmxpbmc7bnVsbCE9PWE7KVhqKGEsYixjKSxhPWEuc2libGluZ312YXIgWD1udWxsLFlqPSExO2Z1bmN0aW9uIFpqKGEsYixjKXtmb3IoYz1jLmNoaWxkO251bGwhPT1jOylhayhhLGIsYyksYz1jLnNpYmxpbmd9XG5mdW5jdGlvbiBhayhhLGIsYyl7aWYobGMmJlwiZnVuY3Rpb25cIj09PXR5cGVvZiBsYy5vbkNvbW1pdEZpYmVyVW5tb3VudCl0cnl7bGMub25Db21taXRGaWJlclVubW91bnQoa2MsYyl9Y2F0Y2goaCl7fXN3aXRjaChjLnRhZyl7Y2FzZSA1OlV8fE1qKGMsYik7Y2FzZSA2OnZhciBkPVgsZT1ZajtYPW51bGw7WmooYSxiLGMpO1g9ZDtZaj1lO251bGwhPT1YJiYoWWo/KGE9WCxjPWMuc3RhdGVOb2RlLDg9PT1hLm5vZGVUeXBlP2EucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjKTphLnJlbW92ZUNoaWxkKGMpKTpYLnJlbW92ZUNoaWxkKGMuc3RhdGVOb2RlKSk7YnJlYWs7Y2FzZSAxODpudWxsIT09WCYmKFlqPyhhPVgsYz1jLnN0YXRlTm9kZSw4PT09YS5ub2RlVHlwZT9LZihhLnBhcmVudE5vZGUsYyk6MT09PWEubm9kZVR5cGUmJktmKGEsYyksYmQoYSkpOktmKFgsYy5zdGF0ZU5vZGUpKTticmVhaztjYXNlIDQ6ZD1YO2U9WWo7WD1jLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO1lqPSEwO1xuWmooYSxiLGMpO1g9ZDtZaj1lO2JyZWFrO2Nhc2UgMDpjYXNlIDExOmNhc2UgMTQ6Y2FzZSAxNTppZighVSYmKGQ9Yy51cGRhdGVRdWV1ZSxudWxsIT09ZCYmKGQ9ZC5sYXN0RWZmZWN0LG51bGwhPT1kKSkpe2U9ZD1kLm5leHQ7ZG97dmFyIGY9ZSxnPWYuZGVzdHJveTtmPWYudGFnO3ZvaWQgMCE9PWcmJigwIT09KGYmMik/TmooYyxiLGcpOjAhPT0oZiY0KSYmTmooYyxiLGcpKTtlPWUubmV4dH13aGlsZShlIT09ZCl9WmooYSxiLGMpO2JyZWFrO2Nhc2UgMTppZighVSYmKE1qKGMsYiksZD1jLnN0YXRlTm9kZSxcImZ1bmN0aW9uXCI9PT10eXBlb2YgZC5jb21wb25lbnRXaWxsVW5tb3VudCkpdHJ5e2QucHJvcHM9Yy5tZW1vaXplZFByb3BzLGQuc3RhdGU9Yy5tZW1vaXplZFN0YXRlLGQuY29tcG9uZW50V2lsbFVubW91bnQoKX1jYXRjaChoKXtXKGMsYixoKX1aaihhLGIsYyk7YnJlYWs7Y2FzZSAyMTpaaihhLGIsYyk7YnJlYWs7Y2FzZSAyMjpjLm1vZGUmMT8oVT0oZD1VKXx8bnVsbCE9PVxuYy5tZW1vaXplZFN0YXRlLFpqKGEsYixjKSxVPWQpOlpqKGEsYixjKTticmVhaztkZWZhdWx0OlpqKGEsYixjKX19ZnVuY3Rpb24gYmsoYSl7dmFyIGI9YS51cGRhdGVRdWV1ZTtpZihudWxsIT09Yil7YS51cGRhdGVRdWV1ZT1udWxsO3ZhciBjPWEuc3RhdGVOb2RlO251bGw9PT1jJiYoYz1hLnN0YXRlTm9kZT1uZXcgTGopO2IuZm9yRWFjaChmdW5jdGlvbihiKXt2YXIgZD1jay5iaW5kKG51bGwsYSxiKTtjLmhhcyhiKXx8KGMuYWRkKGIpLGIudGhlbihkLGQpKX0pfX1cbmZ1bmN0aW9uIGRrKGEsYil7dmFyIGM9Yi5kZWxldGlvbnM7aWYobnVsbCE9PWMpZm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspe3ZhciBlPWNbZF07dHJ5e3ZhciBmPWEsZz1iLGg9ZzthOmZvcig7bnVsbCE9PWg7KXtzd2l0Y2goaC50YWcpe2Nhc2UgNTpYPWguc3RhdGVOb2RlO1lqPSExO2JyZWFrIGE7Y2FzZSAzOlg9aC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztZaj0hMDticmVhayBhO2Nhc2UgNDpYPWguc3RhdGVOb2RlLmNvbnRhaW5lckluZm87WWo9ITA7YnJlYWsgYX1oPWgucmV0dXJufWlmKG51bGw9PT1YKXRocm93IEVycm9yKHAoMTYwKSk7YWsoZixnLGUpO1g9bnVsbDtZaj0hMTt2YXIgaz1lLmFsdGVybmF0ZTtudWxsIT09ayYmKGsucmV0dXJuPW51bGwpO2UucmV0dXJuPW51bGx9Y2F0Y2gobCl7VyhlLGIsbCl9fWlmKGIuc3VidHJlZUZsYWdzJjEyODU0KWZvcihiPWIuY2hpbGQ7bnVsbCE9PWI7KWVrKGIsYSksYj1iLnNpYmxpbmd9XG5mdW5jdGlvbiBlayhhLGIpe3ZhciBjPWEuYWx0ZXJuYXRlLGQ9YS5mbGFncztzd2l0Y2goYS50YWcpe2Nhc2UgMDpjYXNlIDExOmNhc2UgMTQ6Y2FzZSAxNTpkayhiLGEpO2ZrKGEpO2lmKGQmNCl7dHJ5e1FqKDMsYSxhLnJldHVybiksUmooMyxhKX1jYXRjaCh0KXtXKGEsYS5yZXR1cm4sdCl9dHJ5e1FqKDUsYSxhLnJldHVybil9Y2F0Y2godCl7VyhhLGEucmV0dXJuLHQpfX1icmVhaztjYXNlIDE6ZGsoYixhKTtmayhhKTtkJjUxMiYmbnVsbCE9PWMmJk1qKGMsYy5yZXR1cm4pO2JyZWFrO2Nhc2UgNTpkayhiLGEpO2ZrKGEpO2QmNTEyJiZudWxsIT09YyYmTWooYyxjLnJldHVybik7aWYoYS5mbGFncyYzMil7dmFyIGU9YS5zdGF0ZU5vZGU7dHJ5e29iKGUsXCJcIil9Y2F0Y2godCl7VyhhLGEucmV0dXJuLHQpfX1pZihkJjQmJihlPWEuc3RhdGVOb2RlLG51bGwhPWUpKXt2YXIgZj1hLm1lbW9pemVkUHJvcHMsZz1udWxsIT09Yz9jLm1lbW9pemVkUHJvcHM6ZixoPWEudHlwZSxrPWEudXBkYXRlUXVldWU7XG5hLnVwZGF0ZVF1ZXVlPW51bGw7aWYobnVsbCE9PWspdHJ5e1wiaW5wdXRcIj09PWgmJlwicmFkaW9cIj09PWYudHlwZSYmbnVsbCE9Zi5uYW1lJiZhYihlLGYpO3ZiKGgsZyk7dmFyIGw9dmIoaCxmKTtmb3IoZz0wO2c8ay5sZW5ndGg7Zys9Mil7dmFyIG09a1tnXSxxPWtbZysxXTtcInN0eWxlXCI9PT1tP3NiKGUscSk6XCJkYW5nZXJvdXNseVNldElubmVySFRNTFwiPT09bT9uYihlLHEpOlwiY2hpbGRyZW5cIj09PW0/b2IoZSxxKTp0YShlLG0scSxsKX1zd2l0Y2goaCl7Y2FzZSBcImlucHV0XCI6YmIoZSxmKTticmVhaztjYXNlIFwidGV4dGFyZWFcIjppYihlLGYpO2JyZWFrO2Nhc2UgXCJzZWxlY3RcIjp2YXIgcj1lLl93cmFwcGVyU3RhdGUud2FzTXVsdGlwbGU7ZS5fd3JhcHBlclN0YXRlLndhc011bHRpcGxlPSEhZi5tdWx0aXBsZTt2YXIgeT1mLnZhbHVlO251bGwhPXk/ZmIoZSwhIWYubXVsdGlwbGUseSwhMSk6ciE9PSEhZi5tdWx0aXBsZSYmKG51bGwhPWYuZGVmYXVsdFZhbHVlP2ZiKGUsISFmLm11bHRpcGxlLFxuZi5kZWZhdWx0VmFsdWUsITApOmZiKGUsISFmLm11bHRpcGxlLGYubXVsdGlwbGU/W106XCJcIiwhMSkpfWVbUGZdPWZ9Y2F0Y2godCl7VyhhLGEucmV0dXJuLHQpfX1icmVhaztjYXNlIDY6ZGsoYixhKTtmayhhKTtpZihkJjQpe2lmKG51bGw9PT1hLnN0YXRlTm9kZSl0aHJvdyBFcnJvcihwKDE2MikpO2U9YS5zdGF0ZU5vZGU7Zj1hLm1lbW9pemVkUHJvcHM7dHJ5e2Uubm9kZVZhbHVlPWZ9Y2F0Y2godCl7VyhhLGEucmV0dXJuLHQpfX1icmVhaztjYXNlIDM6ZGsoYixhKTtmayhhKTtpZihkJjQmJm51bGwhPT1jJiZjLm1lbW9pemVkU3RhdGUuaXNEZWh5ZHJhdGVkKXRyeXtiZChiLmNvbnRhaW5lckluZm8pfWNhdGNoKHQpe1coYSxhLnJldHVybix0KX1icmVhaztjYXNlIDQ6ZGsoYixhKTtmayhhKTticmVhaztjYXNlIDEzOmRrKGIsYSk7ZmsoYSk7ZT1hLmNoaWxkO2UuZmxhZ3MmODE5MiYmKGY9bnVsbCE9PWUubWVtb2l6ZWRTdGF0ZSxlLnN0YXRlTm9kZS5pc0hpZGRlbj1mLCFmfHxcbm51bGwhPT1lLmFsdGVybmF0ZSYmbnVsbCE9PWUuYWx0ZXJuYXRlLm1lbW9pemVkU3RhdGV8fChnaz1CKCkpKTtkJjQmJmJrKGEpO2JyZWFrO2Nhc2UgMjI6bT1udWxsIT09YyYmbnVsbCE9PWMubWVtb2l6ZWRTdGF0ZTthLm1vZGUmMT8oVT0obD1VKXx8bSxkayhiLGEpLFU9bCk6ZGsoYixhKTtmayhhKTtpZihkJjgxOTIpe2w9bnVsbCE9PWEubWVtb2l6ZWRTdGF0ZTtpZigoYS5zdGF0ZU5vZGUuaXNIaWRkZW49bCkmJiFtJiYwIT09KGEubW9kZSYxKSlmb3IoVj1hLG09YS5jaGlsZDtudWxsIT09bTspe2ZvcihxPVY9bTtudWxsIT09Vjspe3I9Vjt5PXIuY2hpbGQ7c3dpdGNoKHIudGFnKXtjYXNlIDA6Y2FzZSAxMTpjYXNlIDE0OmNhc2UgMTU6UWooNCxyLHIucmV0dXJuKTticmVhaztjYXNlIDE6TWoocixyLnJldHVybik7dmFyIG49ci5zdGF0ZU5vZGU7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIG4uY29tcG9uZW50V2lsbFVubW91bnQpe2Q9cjtjPXIucmV0dXJuO3RyeXtiPWQsbi5wcm9wcz1cbmIubWVtb2l6ZWRQcm9wcyxuLnN0YXRlPWIubWVtb2l6ZWRTdGF0ZSxuLmNvbXBvbmVudFdpbGxVbm1vdW50KCl9Y2F0Y2godCl7VyhkLGMsdCl9fWJyZWFrO2Nhc2UgNTpNaihyLHIucmV0dXJuKTticmVhaztjYXNlIDIyOmlmKG51bGwhPT1yLm1lbW9pemVkU3RhdGUpe2hrKHEpO2NvbnRpbnVlfX1udWxsIT09eT8oeS5yZXR1cm49cixWPXkpOmhrKHEpfW09bS5zaWJsaW5nfWE6Zm9yKG09bnVsbCxxPWE7Oyl7aWYoNT09PXEudGFnKXtpZihudWxsPT09bSl7bT1xO3RyeXtlPXEuc3RhdGVOb2RlLGw/KGY9ZS5zdHlsZSxcImZ1bmN0aW9uXCI9PT10eXBlb2YgZi5zZXRQcm9wZXJ0eT9mLnNldFByb3BlcnR5KFwiZGlzcGxheVwiLFwibm9uZVwiLFwiaW1wb3J0YW50XCIpOmYuZGlzcGxheT1cIm5vbmVcIik6KGg9cS5zdGF0ZU5vZGUsaz1xLm1lbW9pemVkUHJvcHMuc3R5bGUsZz12b2lkIDAhPT1rJiZudWxsIT09ayYmay5oYXNPd25Qcm9wZXJ0eShcImRpc3BsYXlcIik/ay5kaXNwbGF5Om51bGwsaC5zdHlsZS5kaXNwbGF5PVxucmIoXCJkaXNwbGF5XCIsZykpfWNhdGNoKHQpe1coYSxhLnJldHVybix0KX19fWVsc2UgaWYoNj09PXEudGFnKXtpZihudWxsPT09bSl0cnl7cS5zdGF0ZU5vZGUubm9kZVZhbHVlPWw/XCJcIjpxLm1lbW9pemVkUHJvcHN9Y2F0Y2godCl7VyhhLGEucmV0dXJuLHQpfX1lbHNlIGlmKCgyMiE9PXEudGFnJiYyMyE9PXEudGFnfHxudWxsPT09cS5tZW1vaXplZFN0YXRlfHxxPT09YSkmJm51bGwhPT1xLmNoaWxkKXtxLmNoaWxkLnJldHVybj1xO3E9cS5jaGlsZDtjb250aW51ZX1pZihxPT09YSlicmVhayBhO2Zvcig7bnVsbD09PXEuc2libGluZzspe2lmKG51bGw9PT1xLnJldHVybnx8cS5yZXR1cm49PT1hKWJyZWFrIGE7bT09PXEmJihtPW51bGwpO3E9cS5yZXR1cm59bT09PXEmJihtPW51bGwpO3Euc2libGluZy5yZXR1cm49cS5yZXR1cm47cT1xLnNpYmxpbmd9fWJyZWFrO2Nhc2UgMTk6ZGsoYixhKTtmayhhKTtkJjQmJmJrKGEpO2JyZWFrO2Nhc2UgMjE6YnJlYWs7ZGVmYXVsdDpkayhiLFxuYSksZmsoYSl9fWZ1bmN0aW9uIGZrKGEpe3ZhciBiPWEuZmxhZ3M7aWYoYiYyKXt0cnl7YTp7Zm9yKHZhciBjPWEucmV0dXJuO251bGwhPT1jOyl7aWYoVWooYykpe3ZhciBkPWM7YnJlYWsgYX1jPWMucmV0dXJufXRocm93IEVycm9yKHAoMTYwKSk7fXN3aXRjaChkLnRhZyl7Y2FzZSA1OnZhciBlPWQuc3RhdGVOb2RlO2QuZmxhZ3MmMzImJihvYihlLFwiXCIpLGQuZmxhZ3MmPS0zMyk7dmFyIGY9VmooYSk7WGooYSxmLGUpO2JyZWFrO2Nhc2UgMzpjYXNlIDQ6dmFyIGc9ZC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyxoPVZqKGEpO1dqKGEsaCxnKTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKHAoMTYxKSk7fX1jYXRjaChrKXtXKGEsYS5yZXR1cm4sayl9YS5mbGFncyY9LTN9YiY0MDk2JiYoYS5mbGFncyY9LTQwOTcpfWZ1bmN0aW9uIGlrKGEsYixjKXtWPWE7amsoYSxiLGMpfVxuZnVuY3Rpb24gamsoYSxiLGMpe2Zvcih2YXIgZD0wIT09KGEubW9kZSYxKTtudWxsIT09Vjspe3ZhciBlPVYsZj1lLmNoaWxkO2lmKDIyPT09ZS50YWcmJmQpe3ZhciBnPW51bGwhPT1lLm1lbW9pemVkU3RhdGV8fEtqO2lmKCFnKXt2YXIgaD1lLmFsdGVybmF0ZSxrPW51bGwhPT1oJiZudWxsIT09aC5tZW1vaXplZFN0YXRlfHxVO2g9S2o7dmFyIGw9VTtLaj1nO2lmKChVPWspJiYhbClmb3IoVj1lO251bGwhPT1WOylnPVYsaz1nLmNoaWxkLDIyPT09Zy50YWcmJm51bGwhPT1nLm1lbW9pemVkU3RhdGU/a2soZSk6bnVsbCE9PWs/KGsucmV0dXJuPWcsVj1rKTprayhlKTtmb3IoO251bGwhPT1mOylWPWYsamsoZixiLGMpLGY9Zi5zaWJsaW5nO1Y9ZTtLaj1oO1U9bH1sayhhLGIsYyl9ZWxzZSAwIT09KGUuc3VidHJlZUZsYWdzJjg3NzIpJiZudWxsIT09Zj8oZi5yZXR1cm49ZSxWPWYpOmxrKGEsYixjKX19XG5mdW5jdGlvbiBsayhhKXtmb3IoO251bGwhPT1WOyl7dmFyIGI9VjtpZigwIT09KGIuZmxhZ3MmODc3Mikpe3ZhciBjPWIuYWx0ZXJuYXRlO3RyeXtpZigwIT09KGIuZmxhZ3MmODc3Mikpc3dpdGNoKGIudGFnKXtjYXNlIDA6Y2FzZSAxMTpjYXNlIDE1OlV8fFJqKDUsYik7YnJlYWs7Y2FzZSAxOnZhciBkPWIuc3RhdGVOb2RlO2lmKGIuZmxhZ3MmNCYmIVUpaWYobnVsbD09PWMpZC5jb21wb25lbnREaWRNb3VudCgpO2Vsc2V7dmFyIGU9Yi5lbGVtZW50VHlwZT09PWIudHlwZT9jLm1lbW9pemVkUHJvcHM6TGcoYi50eXBlLGMubWVtb2l6ZWRQcm9wcyk7ZC5jb21wb25lbnREaWRVcGRhdGUoZSxjLm1lbW9pemVkU3RhdGUsZC5fX3JlYWN0SW50ZXJuYWxTbmFwc2hvdEJlZm9yZVVwZGF0ZSl9dmFyIGY9Yi51cGRhdGVRdWV1ZTtudWxsIT09ZiYmaWgoYixmLGQpO2JyZWFrO2Nhc2UgMzp2YXIgZz1iLnVwZGF0ZVF1ZXVlO2lmKG51bGwhPT1nKXtjPW51bGw7aWYobnVsbCE9PWIuY2hpbGQpc3dpdGNoKGIuY2hpbGQudGFnKXtjYXNlIDU6Yz1cbmIuY2hpbGQuc3RhdGVOb2RlO2JyZWFrO2Nhc2UgMTpjPWIuY2hpbGQuc3RhdGVOb2RlfWloKGIsZyxjKX1icmVhaztjYXNlIDU6dmFyIGg9Yi5zdGF0ZU5vZGU7aWYobnVsbD09PWMmJmIuZmxhZ3MmNCl7Yz1oO3ZhciBrPWIubWVtb2l6ZWRQcm9wcztzd2l0Y2goYi50eXBlKXtjYXNlIFwiYnV0dG9uXCI6Y2FzZSBcImlucHV0XCI6Y2FzZSBcInNlbGVjdFwiOmNhc2UgXCJ0ZXh0YXJlYVwiOmsuYXV0b0ZvY3VzJiZjLmZvY3VzKCk7YnJlYWs7Y2FzZSBcImltZ1wiOmsuc3JjJiYoYy5zcmM9ay5zcmMpfX1icmVhaztjYXNlIDY6YnJlYWs7Y2FzZSA0OmJyZWFrO2Nhc2UgMTI6YnJlYWs7Y2FzZSAxMzppZihudWxsPT09Yi5tZW1vaXplZFN0YXRlKXt2YXIgbD1iLmFsdGVybmF0ZTtpZihudWxsIT09bCl7dmFyIG09bC5tZW1vaXplZFN0YXRlO2lmKG51bGwhPT1tKXt2YXIgcT1tLmRlaHlkcmF0ZWQ7bnVsbCE9PXEmJmJkKHEpfX19YnJlYWs7Y2FzZSAxOTpjYXNlIDE3OmNhc2UgMjE6Y2FzZSAyMjpjYXNlIDIzOmNhc2UgMjU6YnJlYWs7XG5kZWZhdWx0OnRocm93IEVycm9yKHAoMTYzKSk7fVV8fGIuZmxhZ3MmNTEyJiZTaihiKX1jYXRjaChyKXtXKGIsYi5yZXR1cm4scil9fWlmKGI9PT1hKXtWPW51bGw7YnJlYWt9Yz1iLnNpYmxpbmc7aWYobnVsbCE9PWMpe2MucmV0dXJuPWIucmV0dXJuO1Y9YzticmVha31WPWIucmV0dXJufX1mdW5jdGlvbiBoayhhKXtmb3IoO251bGwhPT1WOyl7dmFyIGI9VjtpZihiPT09YSl7Vj1udWxsO2JyZWFrfXZhciBjPWIuc2libGluZztpZihudWxsIT09Yyl7Yy5yZXR1cm49Yi5yZXR1cm47Vj1jO2JyZWFrfVY9Yi5yZXR1cm59fVxuZnVuY3Rpb24ga2soYSl7Zm9yKDtudWxsIT09Vjspe3ZhciBiPVY7dHJ5e3N3aXRjaChiLnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNTp2YXIgYz1iLnJldHVybjt0cnl7UmooNCxiKX1jYXRjaChrKXtXKGIsYyxrKX1icmVhaztjYXNlIDE6dmFyIGQ9Yi5zdGF0ZU5vZGU7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGQuY29tcG9uZW50RGlkTW91bnQpe3ZhciBlPWIucmV0dXJuO3RyeXtkLmNvbXBvbmVudERpZE1vdW50KCl9Y2F0Y2goayl7VyhiLGUsayl9fXZhciBmPWIucmV0dXJuO3RyeXtTaihiKX1jYXRjaChrKXtXKGIsZixrKX1icmVhaztjYXNlIDU6dmFyIGc9Yi5yZXR1cm47dHJ5e1NqKGIpfWNhdGNoKGspe1coYixnLGspfX19Y2F0Y2goayl7VyhiLGIucmV0dXJuLGspfWlmKGI9PT1hKXtWPW51bGw7YnJlYWt9dmFyIGg9Yi5zaWJsaW5nO2lmKG51bGwhPT1oKXtoLnJldHVybj1iLnJldHVybjtWPWg7YnJlYWt9Vj1iLnJldHVybn19XG52YXIgbWs9TWF0aC5jZWlsLG5rPXVhLlJlYWN0Q3VycmVudERpc3BhdGNoZXIsb2s9dWEuUmVhY3RDdXJyZW50T3duZXIscGs9dWEuUmVhY3RDdXJyZW50QmF0Y2hDb25maWcsSz0wLFI9bnVsbCxZPW51bGwsWj0wLGdqPTAsZmo9VWYoMCksVD0wLHFrPW51bGwsaGg9MCxyaz0wLHNrPTAsdGs9bnVsbCx1az1udWxsLGdrPTAsSGo9SW5maW5pdHksdms9bnVsbCxQaT0hMSxRaT1udWxsLFNpPW51bGwsd2s9ITEseGs9bnVsbCx5az0wLHprPTAsQWs9bnVsbCxCaz0tMSxDaz0wO2Z1bmN0aW9uIEwoKXtyZXR1cm4gMCE9PShLJjYpP0IoKTotMSE9PUJrP0JrOkJrPUIoKX1cbmZ1bmN0aW9uIGxoKGEpe2lmKDA9PT0oYS5tb2RlJjEpKXJldHVybiAxO2lmKDAhPT0oSyYyKSYmMCE9PVopcmV0dXJuIFomLVo7aWYobnVsbCE9PUtnLnRyYW5zaXRpb24pcmV0dXJuIDA9PT1DayYmKENrPXljKCkpLENrO2E9QztpZigwIT09YSlyZXR1cm4gYTthPXdpbmRvdy5ldmVudDthPXZvaWQgMD09PWE/MTY6amQoYS50eXBlKTtyZXR1cm4gYX1mdW5jdGlvbiBtaChhLGIsYyxkKXtpZig1MDx6ayl0aHJvdyB6az0wLEFrPW51bGwsRXJyb3IocCgxODUpKTtBYyhhLGMsZCk7aWYoMD09PShLJjIpfHxhIT09UilhPT09UiYmKDA9PT0oSyYyKSYmKHJrfD1jKSw0PT09VCYmRGsoYSxaKSksRWsoYSxkKSwxPT09YyYmMD09PUsmJjA9PT0oYi5tb2RlJjEpJiYoSGo9QigpKzUwMCxmZyYmamcoKSl9XG5mdW5jdGlvbiBFayhhLGIpe3ZhciBjPWEuY2FsbGJhY2tOb2RlO3djKGEsYik7dmFyIGQ9dWMoYSxhPT09Uj9aOjApO2lmKDA9PT1kKW51bGwhPT1jJiZiYyhjKSxhLmNhbGxiYWNrTm9kZT1udWxsLGEuY2FsbGJhY2tQcmlvcml0eT0wO2Vsc2UgaWYoYj1kJi1kLGEuY2FsbGJhY2tQcmlvcml0eSE9PWIpe251bGwhPWMmJmJjKGMpO2lmKDE9PT1iKTA9PT1hLnRhZz9pZyhGay5iaW5kKG51bGwsYSkpOmhnKEZrLmJpbmQobnVsbCxhKSksSmYoZnVuY3Rpb24oKXswPT09KEsmNikmJmpnKCl9KSxjPW51bGw7ZWxzZXtzd2l0Y2goRGMoZCkpe2Nhc2UgMTpjPWZjO2JyZWFrO2Nhc2UgNDpjPWdjO2JyZWFrO2Nhc2UgMTY6Yz1oYzticmVhaztjYXNlIDUzNjg3MDkxMjpjPWpjO2JyZWFrO2RlZmF1bHQ6Yz1oY31jPUdrKGMsSGsuYmluZChudWxsLGEpKX1hLmNhbGxiYWNrUHJpb3JpdHk9YjthLmNhbGxiYWNrTm9kZT1jfX1cbmZ1bmN0aW9uIEhrKGEsYil7Qms9LTE7Q2s9MDtpZigwIT09KEsmNikpdGhyb3cgRXJyb3IocCgzMjcpKTt2YXIgYz1hLmNhbGxiYWNrTm9kZTtpZihJaygpJiZhLmNhbGxiYWNrTm9kZSE9PWMpcmV0dXJuIG51bGw7dmFyIGQ9dWMoYSxhPT09Uj9aOjApO2lmKDA9PT1kKXJldHVybiBudWxsO2lmKDAhPT0oZCYzMCl8fDAhPT0oZCZhLmV4cGlyZWRMYW5lcyl8fGIpYj1KayhhLGQpO2Vsc2V7Yj1kO3ZhciBlPUs7S3w9Mjt2YXIgZj1LaygpO2lmKFIhPT1hfHxaIT09Yil2az1udWxsLEhqPUIoKSs1MDAsTGsoYSxiKTtkbyB0cnl7TWsoKTticmVha31jYXRjaChoKXtOayhhLGgpfXdoaWxlKDEpO1FnKCk7bmsuY3VycmVudD1mO0s9ZTtudWxsIT09WT9iPTA6KFI9bnVsbCxaPTAsYj1UKX1pZigwIT09Yil7Mj09PWImJihlPXhjKGEpLDAhPT1lJiYoZD1lLGI9T2soYSxlKSkpO2lmKDE9PT1iKXRocm93IGM9cWssTGsoYSwwKSxEayhhLGQpLEVrKGEsQigpKSxjO2lmKDY9PT1iKURrKGEsZCk7XG5lbHNle2U9YS5jdXJyZW50LmFsdGVybmF0ZTtpZigwPT09KGQmMzApJiYhUGsoZSkmJihiPUprKGEsZCksMj09PWImJihmPXhjKGEpLDAhPT1mJiYoZD1mLGI9T2soYSxmKSkpLDE9PT1iKSl0aHJvdyBjPXFrLExrKGEsMCksRGsoYSxkKSxFayhhLEIoKSksYzthLmZpbmlzaGVkV29yaz1lO2EuZmluaXNoZWRMYW5lcz1kO3N3aXRjaChiKXtjYXNlIDA6Y2FzZSAxOnRocm93IEVycm9yKHAoMzQ1KSk7Y2FzZSAyOlFrKGEsdWssdmspO2JyZWFrO2Nhc2UgMzpEayhhLGQpO2lmKChkJjEzMDAyMzQyNCk9PT1kJiYoYj1nays1MDAtQigpLDEwPGIpKXtpZigwIT09dWMoYSwwKSlicmVhaztlPWEuc3VzcGVuZGVkTGFuZXM7aWYoKGUmZCkhPT1kKXtMKCk7YS5waW5nZWRMYW5lc3w9YS5zdXNwZW5kZWRMYW5lcyZlO2JyZWFrfWEudGltZW91dEhhbmRsZT1GZihRay5iaW5kKG51bGwsYSx1ayx2ayksYik7YnJlYWt9UWsoYSx1ayx2ayk7YnJlYWs7Y2FzZSA0OkRrKGEsZCk7aWYoKGQmNDE5NDI0MCk9PT1cbmQpYnJlYWs7Yj1hLmV2ZW50VGltZXM7Zm9yKGU9LTE7MDxkOyl7dmFyIGc9MzEtb2MoZCk7Zj0xPDxnO2c9YltnXTtnPmUmJihlPWcpO2QmPX5mfWQ9ZTtkPUIoKS1kO2Q9KDEyMD5kPzEyMDo0ODA+ZD80ODA6MTA4MD5kPzEwODA6MTkyMD5kPzE5MjA6M0UzPmQ/M0UzOjQzMjA+ZD80MzIwOjE5NjAqbWsoZC8xOTYwKSktZDtpZigxMDxkKXthLnRpbWVvdXRIYW5kbGU9RmYoUWsuYmluZChudWxsLGEsdWssdmspLGQpO2JyZWFrfVFrKGEsdWssdmspO2JyZWFrO2Nhc2UgNTpRayhhLHVrLHZrKTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKHAoMzI5KSk7fX19RWsoYSxCKCkpO3JldHVybiBhLmNhbGxiYWNrTm9kZT09PWM/SGsuYmluZChudWxsLGEpOm51bGx9XG5mdW5jdGlvbiBPayhhLGIpe3ZhciBjPXRrO2EuY3VycmVudC5tZW1vaXplZFN0YXRlLmlzRGVoeWRyYXRlZCYmKExrKGEsYikuZmxhZ3N8PTI1Nik7YT1KayhhLGIpOzIhPT1hJiYoYj11ayx1az1jLG51bGwhPT1iJiZHaihiKSk7cmV0dXJuIGF9ZnVuY3Rpb24gR2ooYSl7bnVsbD09PXVrP3VrPWE6dWsucHVzaC5hcHBseSh1ayxhKX1cbmZ1bmN0aW9uIFBrKGEpe2Zvcih2YXIgYj1hOzspe2lmKGIuZmxhZ3MmMTYzODQpe3ZhciBjPWIudXBkYXRlUXVldWU7aWYobnVsbCE9PWMmJihjPWMuc3RvcmVzLG51bGwhPT1jKSlmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl7dmFyIGU9Y1tkXSxmPWUuZ2V0U25hcHNob3Q7ZT1lLnZhbHVlO3RyeXtpZighSGUoZigpLGUpKXJldHVybiExfWNhdGNoKGcpe3JldHVybiExfX19Yz1iLmNoaWxkO2lmKGIuc3VidHJlZUZsYWdzJjE2Mzg0JiZudWxsIT09YyljLnJldHVybj1iLGI9YztlbHNle2lmKGI9PT1hKWJyZWFrO2Zvcig7bnVsbD09PWIuc2libGluZzspe2lmKG51bGw9PT1iLnJldHVybnx8Yi5yZXR1cm49PT1hKXJldHVybiEwO2I9Yi5yZXR1cm59Yi5zaWJsaW5nLnJldHVybj1iLnJldHVybjtiPWIuc2libGluZ319cmV0dXJuITB9XG5mdW5jdGlvbiBEayhhLGIpe2ImPX5zaztiJj1+cms7YS5zdXNwZW5kZWRMYW5lc3w9YjthLnBpbmdlZExhbmVzJj1+Yjtmb3IoYT1hLmV4cGlyYXRpb25UaW1lczswPGI7KXt2YXIgYz0zMS1vYyhiKSxkPTE8PGM7YVtjXT0tMTtiJj1+ZH19ZnVuY3Rpb24gRmsoYSl7aWYoMCE9PShLJjYpKXRocm93IEVycm9yKHAoMzI3KSk7SWsoKTt2YXIgYj11YyhhLDApO2lmKDA9PT0oYiYxKSlyZXR1cm4gRWsoYSxCKCkpLG51bGw7dmFyIGM9SmsoYSxiKTtpZigwIT09YS50YWcmJjI9PT1jKXt2YXIgZD14YyhhKTswIT09ZCYmKGI9ZCxjPU9rKGEsZCkpfWlmKDE9PT1jKXRocm93IGM9cWssTGsoYSwwKSxEayhhLGIpLEVrKGEsQigpKSxjO2lmKDY9PT1jKXRocm93IEVycm9yKHAoMzQ1KSk7YS5maW5pc2hlZFdvcms9YS5jdXJyZW50LmFsdGVybmF0ZTthLmZpbmlzaGVkTGFuZXM9YjtRayhhLHVrLHZrKTtFayhhLEIoKSk7cmV0dXJuIG51bGx9XG5mdW5jdGlvbiBSayhhLGIpe3ZhciBjPUs7S3w9MTt0cnl7cmV0dXJuIGEoYil9ZmluYWxseXtLPWMsMD09PUsmJihIaj1CKCkrNTAwLGZnJiZqZygpKX19ZnVuY3Rpb24gU2soYSl7bnVsbCE9PXhrJiYwPT09eGsudGFnJiYwPT09KEsmNikmJklrKCk7dmFyIGI9SztLfD0xO3ZhciBjPXBrLnRyYW5zaXRpb24sZD1DO3RyeXtpZihway50cmFuc2l0aW9uPW51bGwsQz0xLGEpcmV0dXJuIGEoKX1maW5hbGx5e0M9ZCxway50cmFuc2l0aW9uPWMsSz1iLDA9PT0oSyY2KSYmamcoKX19ZnVuY3Rpb24gSWooKXtnaj1mai5jdXJyZW50O0UoZmopfVxuZnVuY3Rpb24gTGsoYSxiKXthLmZpbmlzaGVkV29yaz1udWxsO2EuZmluaXNoZWRMYW5lcz0wO3ZhciBjPWEudGltZW91dEhhbmRsZTstMSE9PWMmJihhLnRpbWVvdXRIYW5kbGU9LTEsR2YoYykpO2lmKG51bGwhPT1ZKWZvcihjPVkucmV0dXJuO251bGwhPT1jOyl7dmFyIGQ9Yzt3ZyhkKTtzd2l0Y2goZC50YWcpe2Nhc2UgMTpkPWQudHlwZS5jaGlsZENvbnRleHRUeXBlcztudWxsIT09ZCYmdm9pZCAwIT09ZCYmJGYoKTticmVhaztjYXNlIDM6SmgoKTtFKFdmKTtFKEgpO09oKCk7YnJlYWs7Y2FzZSA1OkxoKGQpO2JyZWFrO2Nhc2UgNDpKaCgpO2JyZWFrO2Nhc2UgMTM6RShNKTticmVhaztjYXNlIDE5OkUoTSk7YnJlYWs7Y2FzZSAxMDpSZyhkLnR5cGUuX2NvbnRleHQpO2JyZWFrO2Nhc2UgMjI6Y2FzZSAyMzpJaigpfWM9Yy5yZXR1cm59Uj1hO1k9YT13aChhLmN1cnJlbnQsbnVsbCk7Wj1naj1iO1Q9MDtxaz1udWxsO3NrPXJrPWhoPTA7dWs9dGs9bnVsbDtpZihudWxsIT09V2cpe2ZvcihiPVxuMDtiPFdnLmxlbmd0aDtiKyspaWYoYz1XZ1tiXSxkPWMuaW50ZXJsZWF2ZWQsbnVsbCE9PWQpe2MuaW50ZXJsZWF2ZWQ9bnVsbDt2YXIgZT1kLm5leHQsZj1jLnBlbmRpbmc7aWYobnVsbCE9PWYpe3ZhciBnPWYubmV4dDtmLm5leHQ9ZTtkLm5leHQ9Z31jLnBlbmRpbmc9ZH1XZz1udWxsfXJldHVybiBhfVxuZnVuY3Rpb24gTmsoYSxiKXtkb3t2YXIgYz1ZO3RyeXtRZygpO1BoLmN1cnJlbnQ9YWk7aWYoU2gpe2Zvcih2YXIgZD1OLm1lbW9pemVkU3RhdGU7bnVsbCE9PWQ7KXt2YXIgZT1kLnF1ZXVlO251bGwhPT1lJiYoZS5wZW5kaW5nPW51bGwpO2Q9ZC5uZXh0fVNoPSExfVJoPTA7UD1PPU49bnVsbDtUaD0hMTtVaD0wO29rLmN1cnJlbnQ9bnVsbDtpZihudWxsPT09Y3x8bnVsbD09PWMucmV0dXJuKXtUPTE7cWs9YjtZPW51bGw7YnJlYWt9YTp7dmFyIGY9YSxnPWMucmV0dXJuLGg9YyxrPWI7Yj1aO2guZmxhZ3N8PTMyNzY4O2lmKG51bGwhPT1rJiZcIm9iamVjdFwiPT09dHlwZW9mIGsmJlwiZnVuY3Rpb25cIj09PXR5cGVvZiBrLnRoZW4pe3ZhciBsPWssbT1oLHE9bS50YWc7aWYoMD09PShtLm1vZGUmMSkmJigwPT09cXx8MTE9PT1xfHwxNT09PXEpKXt2YXIgcj1tLmFsdGVybmF0ZTtyPyhtLnVwZGF0ZVF1ZXVlPXIudXBkYXRlUXVldWUsbS5tZW1vaXplZFN0YXRlPXIubWVtb2l6ZWRTdGF0ZSxcbm0ubGFuZXM9ci5sYW5lcyk6KG0udXBkYXRlUXVldWU9bnVsbCxtLm1lbW9pemVkU3RhdGU9bnVsbCl9dmFyIHk9VmkoZyk7aWYobnVsbCE9PXkpe3kuZmxhZ3MmPS0yNTc7V2koeSxnLGgsZixiKTt5Lm1vZGUmMSYmVGkoZixsLGIpO2I9eTtrPWw7dmFyIG49Yi51cGRhdGVRdWV1ZTtpZihudWxsPT09bil7dmFyIHQ9bmV3IFNldDt0LmFkZChrKTtiLnVwZGF0ZVF1ZXVlPXR9ZWxzZSBuLmFkZChrKTticmVhayBhfWVsc2V7aWYoMD09PShiJjEpKXtUaShmLGwsYik7dWooKTticmVhayBhfWs9RXJyb3IocCg0MjYpKX19ZWxzZSBpZihJJiZoLm1vZGUmMSl7dmFyIEo9VmkoZyk7aWYobnVsbCE9PUopezA9PT0oSi5mbGFncyY2NTUzNikmJihKLmZsYWdzfD0yNTYpO1dpKEosZyxoLGYsYik7SmcoS2koayxoKSk7YnJlYWsgYX19Zj1rPUtpKGssaCk7NCE9PVQmJihUPTIpO251bGw9PT10az90az1bZl06dGsucHVzaChmKTtmPWc7ZG97c3dpdGNoKGYudGFnKXtjYXNlIDM6Zi5mbGFnc3w9NjU1MzY7XG5iJj0tYjtmLmxhbmVzfD1iO3ZhciB4PU9pKGYsayxiKTtmaChmLHgpO2JyZWFrIGE7Y2FzZSAxOmg9azt2YXIgdz1mLnR5cGUsdT1mLnN0YXRlTm9kZTtpZigwPT09KGYuZmxhZ3MmMTI4KSYmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiB3LmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcnx8bnVsbCE9PXUmJlwiZnVuY3Rpb25cIj09PXR5cGVvZiB1LmNvbXBvbmVudERpZENhdGNoJiYobnVsbD09PVNpfHwhU2kuaGFzKHUpKSkpe2YuZmxhZ3N8PTY1NTM2O2ImPS1iO2YubGFuZXN8PWI7dmFyIEY9UmkoZixoLGIpO2ZoKGYsRik7YnJlYWsgYX19Zj1mLnJldHVybn13aGlsZShudWxsIT09Zil9VGsoYyl9Y2F0Y2gobmEpe2I9bmE7WT09PWMmJm51bGwhPT1jJiYoWT1jPWMucmV0dXJuKTtjb250aW51ZX1icmVha313aGlsZSgxKX1mdW5jdGlvbiBLaygpe3ZhciBhPW5rLmN1cnJlbnQ7bmsuY3VycmVudD1haTtyZXR1cm4gbnVsbD09PWE/YWk6YX1cbmZ1bmN0aW9uIHVqKCl7aWYoMD09PVR8fDM9PT1UfHwyPT09VClUPTQ7bnVsbD09PVJ8fDA9PT0oaGgmMjY4NDM1NDU1KSYmMD09PShyayYyNjg0MzU0NTUpfHxEayhSLFopfWZ1bmN0aW9uIEprKGEsYil7dmFyIGM9SztLfD0yO3ZhciBkPUtrKCk7aWYoUiE9PWF8fFohPT1iKXZrPW51bGwsTGsoYSxiKTtkbyB0cnl7VWsoKTticmVha31jYXRjaChlKXtOayhhLGUpfXdoaWxlKDEpO1FnKCk7Sz1jO25rLmN1cnJlbnQ9ZDtpZihudWxsIT09WSl0aHJvdyBFcnJvcihwKDI2MSkpO1I9bnVsbDtaPTA7cmV0dXJuIFR9ZnVuY3Rpb24gVWsoKXtmb3IoO251bGwhPT1ZOylWayhZKX1mdW5jdGlvbiBNaygpe2Zvcig7bnVsbCE9PVkmJiFjYygpOylWayhZKX1mdW5jdGlvbiBWayhhKXt2YXIgYj1XayhhLmFsdGVybmF0ZSxhLGdqKTthLm1lbW9pemVkUHJvcHM9YS5wZW5kaW5nUHJvcHM7bnVsbD09PWI/VGsoYSk6WT1iO29rLmN1cnJlbnQ9bnVsbH1cbmZ1bmN0aW9uIFRrKGEpe3ZhciBiPWE7ZG97dmFyIGM9Yi5hbHRlcm5hdGU7YT1iLnJldHVybjtpZigwPT09KGIuZmxhZ3MmMzI3NjgpKXtpZihjPUZqKGMsYixnaiksbnVsbCE9PWMpe1k9YztyZXR1cm59fWVsc2V7Yz1KaihjLGIpO2lmKG51bGwhPT1jKXtjLmZsYWdzJj0zMjc2NztZPWM7cmV0dXJufWlmKG51bGwhPT1hKWEuZmxhZ3N8PTMyNzY4LGEuc3VidHJlZUZsYWdzPTAsYS5kZWxldGlvbnM9bnVsbDtlbHNle1Q9NjtZPW51bGw7cmV0dXJufX1iPWIuc2libGluZztpZihudWxsIT09Yil7WT1iO3JldHVybn1ZPWI9YX13aGlsZShudWxsIT09Yik7MD09PVQmJihUPTUpfWZ1bmN0aW9uIFFrKGEsYixjKXt2YXIgZD1DLGU9cGsudHJhbnNpdGlvbjt0cnl7cGsudHJhbnNpdGlvbj1udWxsLEM9MSxYayhhLGIsYyxkKX1maW5hbGx5e3BrLnRyYW5zaXRpb249ZSxDPWR9cmV0dXJuIG51bGx9XG5mdW5jdGlvbiBYayhhLGIsYyxkKXtkbyBJaygpO3doaWxlKG51bGwhPT14ayk7aWYoMCE9PShLJjYpKXRocm93IEVycm9yKHAoMzI3KSk7Yz1hLmZpbmlzaGVkV29yazt2YXIgZT1hLmZpbmlzaGVkTGFuZXM7aWYobnVsbD09PWMpcmV0dXJuIG51bGw7YS5maW5pc2hlZFdvcms9bnVsbDthLmZpbmlzaGVkTGFuZXM9MDtpZihjPT09YS5jdXJyZW50KXRocm93IEVycm9yKHAoMTc3KSk7YS5jYWxsYmFja05vZGU9bnVsbDthLmNhbGxiYWNrUHJpb3JpdHk9MDt2YXIgZj1jLmxhbmVzfGMuY2hpbGRMYW5lcztCYyhhLGYpO2E9PT1SJiYoWT1SPW51bGwsWj0wKTswPT09KGMuc3VidHJlZUZsYWdzJjIwNjQpJiYwPT09KGMuZmxhZ3MmMjA2NCl8fHdrfHwod2s9ITAsR2soaGMsZnVuY3Rpb24oKXtJaygpO3JldHVybiBudWxsfSkpO2Y9MCE9PShjLmZsYWdzJjE1OTkwKTtpZigwIT09KGMuc3VidHJlZUZsYWdzJjE1OTkwKXx8Zil7Zj1way50cmFuc2l0aW9uO3BrLnRyYW5zaXRpb249bnVsbDtcbnZhciBnPUM7Qz0xO3ZhciBoPUs7S3w9NDtvay5jdXJyZW50PW51bGw7UGooYSxjKTtlayhjLGEpO09lKERmKTtkZD0hIUNmO0RmPUNmPW51bGw7YS5jdXJyZW50PWM7aWsoYyxhLGUpO2RjKCk7Sz1oO0M9Zztway50cmFuc2l0aW9uPWZ9ZWxzZSBhLmN1cnJlbnQ9Yzt3ayYmKHdrPSExLHhrPWEseWs9ZSk7Zj1hLnBlbmRpbmdMYW5lczswPT09ZiYmKFNpPW51bGwpO21jKGMuc3RhdGVOb2RlLGQpO0VrKGEsQigpKTtpZihudWxsIT09Yilmb3IoZD1hLm9uUmVjb3ZlcmFibGVFcnJvcixjPTA7YzxiLmxlbmd0aDtjKyspZT1iW2NdLGQoZS52YWx1ZSx7Y29tcG9uZW50U3RhY2s6ZS5zdGFjayxkaWdlc3Q6ZS5kaWdlc3R9KTtpZihQaSl0aHJvdyBQaT0hMSxhPVFpLFFpPW51bGwsYTswIT09KHlrJjEpJiYwIT09YS50YWcmJklrKCk7Zj1hLnBlbmRpbmdMYW5lczswIT09KGYmMSk/YT09PUFrP3prKys6KHprPTAsQWs9YSk6ems9MDtqZygpO3JldHVybiBudWxsfVxuZnVuY3Rpb24gSWsoKXtpZihudWxsIT09eGspe3ZhciBhPURjKHlrKSxiPXBrLnRyYW5zaXRpb24sYz1DO3RyeXtway50cmFuc2l0aW9uPW51bGw7Qz0xNj5hPzE2OmE7aWYobnVsbD09PXhrKXZhciBkPSExO2Vsc2V7YT14azt4az1udWxsO3lrPTA7aWYoMCE9PShLJjYpKXRocm93IEVycm9yKHAoMzMxKSk7dmFyIGU9SztLfD00O2ZvcihWPWEuY3VycmVudDtudWxsIT09Vjspe3ZhciBmPVYsZz1mLmNoaWxkO2lmKDAhPT0oVi5mbGFncyYxNikpe3ZhciBoPWYuZGVsZXRpb25zO2lmKG51bGwhPT1oKXtmb3IodmFyIGs9MDtrPGgubGVuZ3RoO2srKyl7dmFyIGw9aFtrXTtmb3IoVj1sO251bGwhPT1WOyl7dmFyIG09Vjtzd2l0Y2gobS50YWcpe2Nhc2UgMDpjYXNlIDExOmNhc2UgMTU6UWooOCxtLGYpfXZhciBxPW0uY2hpbGQ7aWYobnVsbCE9PXEpcS5yZXR1cm49bSxWPXE7ZWxzZSBmb3IoO251bGwhPT1WOyl7bT1WO3ZhciByPW0uc2libGluZyx5PW0ucmV0dXJuO1RqKG0pO2lmKG09PT1cbmwpe1Y9bnVsbDticmVha31pZihudWxsIT09cil7ci5yZXR1cm49eTtWPXI7YnJlYWt9Vj15fX19dmFyIG49Zi5hbHRlcm5hdGU7aWYobnVsbCE9PW4pe3ZhciB0PW4uY2hpbGQ7aWYobnVsbCE9PXQpe24uY2hpbGQ9bnVsbDtkb3t2YXIgSj10LnNpYmxpbmc7dC5zaWJsaW5nPW51bGw7dD1KfXdoaWxlKG51bGwhPT10KX19Vj1mfX1pZigwIT09KGYuc3VidHJlZUZsYWdzJjIwNjQpJiZudWxsIT09ZylnLnJldHVybj1mLFY9ZztlbHNlIGI6Zm9yKDtudWxsIT09Vjspe2Y9VjtpZigwIT09KGYuZmxhZ3MmMjA0OCkpc3dpdGNoKGYudGFnKXtjYXNlIDA6Y2FzZSAxMTpjYXNlIDE1OlFqKDksZixmLnJldHVybil9dmFyIHg9Zi5zaWJsaW5nO2lmKG51bGwhPT14KXt4LnJldHVybj1mLnJldHVybjtWPXg7YnJlYWsgYn1WPWYucmV0dXJufX12YXIgdz1hLmN1cnJlbnQ7Zm9yKFY9dztudWxsIT09Vjspe2c9Vjt2YXIgdT1nLmNoaWxkO2lmKDAhPT0oZy5zdWJ0cmVlRmxhZ3MmMjA2NCkmJm51bGwhPT1cbnUpdS5yZXR1cm49ZyxWPXU7ZWxzZSBiOmZvcihnPXc7bnVsbCE9PVY7KXtoPVY7aWYoMCE9PShoLmZsYWdzJjIwNDgpKXRyeXtzd2l0Y2goaC50YWcpe2Nhc2UgMDpjYXNlIDExOmNhc2UgMTU6UmooOSxoKX19Y2F0Y2gobmEpe1coaCxoLnJldHVybixuYSl9aWYoaD09PWcpe1Y9bnVsbDticmVhayBifXZhciBGPWguc2libGluZztpZihudWxsIT09Ril7Ri5yZXR1cm49aC5yZXR1cm47Vj1GO2JyZWFrIGJ9Vj1oLnJldHVybn19Sz1lO2pnKCk7aWYobGMmJlwiZnVuY3Rpb25cIj09PXR5cGVvZiBsYy5vblBvc3RDb21taXRGaWJlclJvb3QpdHJ5e2xjLm9uUG9zdENvbW1pdEZpYmVyUm9vdChrYyxhKX1jYXRjaChuYSl7fWQ9ITB9cmV0dXJuIGR9ZmluYWxseXtDPWMscGsudHJhbnNpdGlvbj1ifX1yZXR1cm4hMX1mdW5jdGlvbiBZayhhLGIsYyl7Yj1LaShjLGIpO2I9T2koYSxiLDEpO2E9ZGgoYSxiLDEpO2I9TCgpO251bGwhPT1hJiYoQWMoYSwxLGIpLEVrKGEsYikpfVxuZnVuY3Rpb24gVyhhLGIsYyl7aWYoMz09PWEudGFnKVlrKGEsYSxjKTtlbHNlIGZvcig7bnVsbCE9PWI7KXtpZigzPT09Yi50YWcpe1lrKGIsYSxjKTticmVha31lbHNlIGlmKDE9PT1iLnRhZyl7dmFyIGQ9Yi5zdGF0ZU5vZGU7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGIudHlwZS5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3J8fFwiZnVuY3Rpb25cIj09PXR5cGVvZiBkLmNvbXBvbmVudERpZENhdGNoJiYobnVsbD09PVNpfHwhU2kuaGFzKGQpKSl7YT1LaShjLGEpO2E9UmkoYixhLDEpO2I9ZGgoYixhLDEpO2E9TCgpO251bGwhPT1iJiYoQWMoYiwxLGEpLEVrKGIsYSkpO2JyZWFrfX1iPWIucmV0dXJufX1cbmZ1bmN0aW9uIFVpKGEsYixjKXt2YXIgZD1hLnBpbmdDYWNoZTtudWxsIT09ZCYmZC5kZWxldGUoYik7Yj1MKCk7YS5waW5nZWRMYW5lc3w9YS5zdXNwZW5kZWRMYW5lcyZjO1I9PT1hJiYoWiZjKT09PWMmJig0PT09VHx8Mz09PVQmJihaJjEzMDAyMzQyNCk9PT1aJiY1MDA+QigpLWdrP0xrKGEsMCk6c2t8PWMpO0VrKGEsYil9ZnVuY3Rpb24gWmsoYSxiKXswPT09YiYmKDA9PT0oYS5tb2RlJjEpP2I9MTooYj1zYyxzYzw8PTEsMD09PShzYyYxMzAwMjM0MjQpJiYoc2M9NDE5NDMwNCkpKTt2YXIgYz1MKCk7YT1aZyhhLGIpO251bGwhPT1hJiYoQWMoYSxiLGMpLEVrKGEsYykpfWZ1bmN0aW9uIHZqKGEpe3ZhciBiPWEubWVtb2l6ZWRTdGF0ZSxjPTA7bnVsbCE9PWImJihjPWIucmV0cnlMYW5lKTtaayhhLGMpfVxuZnVuY3Rpb24gY2soYSxiKXt2YXIgYz0wO3N3aXRjaChhLnRhZyl7Y2FzZSAxMzp2YXIgZD1hLnN0YXRlTm9kZTt2YXIgZT1hLm1lbW9pemVkU3RhdGU7bnVsbCE9PWUmJihjPWUucmV0cnlMYW5lKTticmVhaztjYXNlIDE5OmQ9YS5zdGF0ZU5vZGU7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcihwKDMxNCkpO31udWxsIT09ZCYmZC5kZWxldGUoYik7WmsoYSxjKX12YXIgV2s7XG5Xaz1mdW5jdGlvbihhLGIsYyl7aWYobnVsbCE9PWEpaWYoYS5tZW1vaXplZFByb3BzIT09Yi5wZW5kaW5nUHJvcHN8fFdmLmN1cnJlbnQpVWc9ITA7ZWxzZXtpZigwPT09KGEubGFuZXMmYykmJjA9PT0oYi5mbGFncyYxMjgpKXJldHVybiBVZz0hMSx6aihhLGIsYyk7VWc9MCE9PShhLmZsYWdzJjEzMTA3Mik/ITA6ITF9ZWxzZSBVZz0hMSxJJiYwIT09KGIuZmxhZ3MmMTA0ODU3NikmJnVnKGIsbmcsYi5pbmRleCk7Yi5sYW5lcz0wO3N3aXRjaChiLnRhZyl7Y2FzZSAyOnZhciBkPWIudHlwZTtqaihhLGIpO2E9Yi5wZW5kaW5nUHJvcHM7dmFyIGU9WWYoYixILmN1cnJlbnQpO1RnKGIsYyk7ZT1YaChudWxsLGIsZCxhLGUsYyk7dmFyIGY9YmkoKTtiLmZsYWdzfD0xO1wib2JqZWN0XCI9PT10eXBlb2YgZSYmbnVsbCE9PWUmJlwiZnVuY3Rpb25cIj09PXR5cGVvZiBlLnJlbmRlciYmdm9pZCAwPT09ZS4kJHR5cGVvZj8oYi50YWc9MSxiLm1lbW9pemVkU3RhdGU9bnVsbCxiLnVwZGF0ZVF1ZXVlPVxubnVsbCxaZihkKT8oZj0hMCxjZyhiKSk6Zj0hMSxiLm1lbW9pemVkU3RhdGU9bnVsbCE9PWUuc3RhdGUmJnZvaWQgMCE9PWUuc3RhdGU/ZS5zdGF0ZTpudWxsLGFoKGIpLGUudXBkYXRlcj1uaCxiLnN0YXRlTm9kZT1lLGUuX3JlYWN0SW50ZXJuYWxzPWIscmgoYixkLGEsYyksYj1raihudWxsLGIsZCwhMCxmLGMpKTooYi50YWc9MCxJJiZmJiZ2ZyhiKSxZaShudWxsLGIsZSxjKSxiPWIuY2hpbGQpO3JldHVybiBiO2Nhc2UgMTY6ZD1iLmVsZW1lbnRUeXBlO2E6e2pqKGEsYik7YT1iLnBlbmRpbmdQcm9wcztlPWQuX2luaXQ7ZD1lKGQuX3BheWxvYWQpO2IudHlwZT1kO2U9Yi50YWc9JGsoZCk7YT1MZyhkLGEpO3N3aXRjaChlKXtjYXNlIDA6Yj1kaihudWxsLGIsZCxhLGMpO2JyZWFrIGE7Y2FzZSAxOmI9aWoobnVsbCxiLGQsYSxjKTticmVhayBhO2Nhc2UgMTE6Yj1aaShudWxsLGIsZCxhLGMpO2JyZWFrIGE7Y2FzZSAxNDpiPWFqKG51bGwsYixkLExnKGQudHlwZSxhKSxjKTticmVhayBhfXRocm93IEVycm9yKHAoMzA2LFxuZCxcIlwiKSk7fXJldHVybiBiO2Nhc2UgMDpyZXR1cm4gZD1iLnR5cGUsZT1iLnBlbmRpbmdQcm9wcyxlPWIuZWxlbWVudFR5cGU9PT1kP2U6TGcoZCxlKSxkaihhLGIsZCxlLGMpO2Nhc2UgMTpyZXR1cm4gZD1iLnR5cGUsZT1iLnBlbmRpbmdQcm9wcyxlPWIuZWxlbWVudFR5cGU9PT1kP2U6TGcoZCxlKSxpaihhLGIsZCxlLGMpO2Nhc2UgMzphOntsaihiKTtpZihudWxsPT09YSl0aHJvdyBFcnJvcihwKDM4NykpO2Q9Yi5wZW5kaW5nUHJvcHM7Zj1iLm1lbW9pemVkU3RhdGU7ZT1mLmVsZW1lbnQ7YmgoYSxiKTtnaChiLGQsbnVsbCxjKTt2YXIgZz1iLm1lbW9pemVkU3RhdGU7ZD1nLmVsZW1lbnQ7aWYoZi5pc0RlaHlkcmF0ZWQpaWYoZj17ZWxlbWVudDpkLGlzRGVoeWRyYXRlZDohMSxjYWNoZTpnLmNhY2hlLHBlbmRpbmdTdXNwZW5zZUJvdW5kYXJpZXM6Zy5wZW5kaW5nU3VzcGVuc2VCb3VuZGFyaWVzLHRyYW5zaXRpb25zOmcudHJhbnNpdGlvbnN9LGIudXBkYXRlUXVldWUuYmFzZVN0YXRlPVxuZixiLm1lbW9pemVkU3RhdGU9ZixiLmZsYWdzJjI1Nil7ZT1LaShFcnJvcihwKDQyMykpLGIpO2I9bWooYSxiLGQsYyxlKTticmVhayBhfWVsc2UgaWYoZCE9PWUpe2U9S2koRXJyb3IocCg0MjQpKSxiKTtiPW1qKGEsYixkLGMsZSk7YnJlYWsgYX1lbHNlIGZvcih5Zz1MZihiLnN0YXRlTm9kZS5jb250YWluZXJJbmZvLmZpcnN0Q2hpbGQpLHhnPWIsST0hMCx6Zz1udWxsLGM9Q2goYixudWxsLGQsYyksYi5jaGlsZD1jO2M7KWMuZmxhZ3M9Yy5mbGFncyYtM3w0MDk2LGM9Yy5zaWJsaW5nO2Vsc2V7SWcoKTtpZihkPT09ZSl7Yj0kaShhLGIsYyk7YnJlYWsgYX1ZaShhLGIsZCxjKX1iPWIuY2hpbGR9cmV0dXJuIGI7Y2FzZSA1OnJldHVybiBLaChiKSxudWxsPT09YSYmRWcoYiksZD1iLnR5cGUsZT1iLnBlbmRpbmdQcm9wcyxmPW51bGwhPT1hP2EubWVtb2l6ZWRQcm9wczpudWxsLGc9ZS5jaGlsZHJlbixFZihkLGUpP2c9bnVsbDpudWxsIT09ZiYmRWYoZCxmKSYmKGIuZmxhZ3N8PTMyKSxcbmhqKGEsYiksWWkoYSxiLGcsYyksYi5jaGlsZDtjYXNlIDY6cmV0dXJuIG51bGw9PT1hJiZFZyhiKSxudWxsO2Nhc2UgMTM6cmV0dXJuIHBqKGEsYixjKTtjYXNlIDQ6cmV0dXJuIEloKGIsYi5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyksZD1iLnBlbmRpbmdQcm9wcyxudWxsPT09YT9iLmNoaWxkPUJoKGIsbnVsbCxkLGMpOllpKGEsYixkLGMpLGIuY2hpbGQ7Y2FzZSAxMTpyZXR1cm4gZD1iLnR5cGUsZT1iLnBlbmRpbmdQcm9wcyxlPWIuZWxlbWVudFR5cGU9PT1kP2U6TGcoZCxlKSxaaShhLGIsZCxlLGMpO2Nhc2UgNzpyZXR1cm4gWWkoYSxiLGIucGVuZGluZ1Byb3BzLGMpLGIuY2hpbGQ7Y2FzZSA4OnJldHVybiBZaShhLGIsYi5wZW5kaW5nUHJvcHMuY2hpbGRyZW4sYyksYi5jaGlsZDtjYXNlIDEyOnJldHVybiBZaShhLGIsYi5wZW5kaW5nUHJvcHMuY2hpbGRyZW4sYyksYi5jaGlsZDtjYXNlIDEwOmE6e2Q9Yi50eXBlLl9jb250ZXh0O2U9Yi5wZW5kaW5nUHJvcHM7Zj1iLm1lbW9pemVkUHJvcHM7XG5nPWUudmFsdWU7RyhNZyxkLl9jdXJyZW50VmFsdWUpO2QuX2N1cnJlbnRWYWx1ZT1nO2lmKG51bGwhPT1mKWlmKEhlKGYudmFsdWUsZykpe2lmKGYuY2hpbGRyZW49PT1lLmNoaWxkcmVuJiYhV2YuY3VycmVudCl7Yj0kaShhLGIsYyk7YnJlYWsgYX19ZWxzZSBmb3IoZj1iLmNoaWxkLG51bGwhPT1mJiYoZi5yZXR1cm49Yik7bnVsbCE9PWY7KXt2YXIgaD1mLmRlcGVuZGVuY2llcztpZihudWxsIT09aCl7Zz1mLmNoaWxkO2Zvcih2YXIgaz1oLmZpcnN0Q29udGV4dDtudWxsIT09azspe2lmKGsuY29udGV4dD09PWQpe2lmKDE9PT1mLnRhZyl7az1jaCgtMSxjJi1jKTtrLnRhZz0yO3ZhciBsPWYudXBkYXRlUXVldWU7aWYobnVsbCE9PWwpe2w9bC5zaGFyZWQ7dmFyIG09bC5wZW5kaW5nO251bGw9PT1tP2submV4dD1rOihrLm5leHQ9bS5uZXh0LG0ubmV4dD1rKTtsLnBlbmRpbmc9a319Zi5sYW5lc3w9YztrPWYuYWx0ZXJuYXRlO251bGwhPT1rJiYoay5sYW5lc3w9Yyk7U2coZi5yZXR1cm4sXG5jLGIpO2gubGFuZXN8PWM7YnJlYWt9az1rLm5leHR9fWVsc2UgaWYoMTA9PT1mLnRhZylnPWYudHlwZT09PWIudHlwZT9udWxsOmYuY2hpbGQ7ZWxzZSBpZigxOD09PWYudGFnKXtnPWYucmV0dXJuO2lmKG51bGw9PT1nKXRocm93IEVycm9yKHAoMzQxKSk7Zy5sYW5lc3w9YztoPWcuYWx0ZXJuYXRlO251bGwhPT1oJiYoaC5sYW5lc3w9Yyk7U2coZyxjLGIpO2c9Zi5zaWJsaW5nfWVsc2UgZz1mLmNoaWxkO2lmKG51bGwhPT1nKWcucmV0dXJuPWY7ZWxzZSBmb3IoZz1mO251bGwhPT1nOyl7aWYoZz09PWIpe2c9bnVsbDticmVha31mPWcuc2libGluZztpZihudWxsIT09Zil7Zi5yZXR1cm49Zy5yZXR1cm47Zz1mO2JyZWFrfWc9Zy5yZXR1cm59Zj1nfVlpKGEsYixlLmNoaWxkcmVuLGMpO2I9Yi5jaGlsZH1yZXR1cm4gYjtjYXNlIDk6cmV0dXJuIGU9Yi50eXBlLGQ9Yi5wZW5kaW5nUHJvcHMuY2hpbGRyZW4sVGcoYixjKSxlPVZnKGUpLGQ9ZChlKSxiLmZsYWdzfD0xLFlpKGEsYixkLGMpLFxuYi5jaGlsZDtjYXNlIDE0OnJldHVybiBkPWIudHlwZSxlPUxnKGQsYi5wZW5kaW5nUHJvcHMpLGU9TGcoZC50eXBlLGUpLGFqKGEsYixkLGUsYyk7Y2FzZSAxNTpyZXR1cm4gY2ooYSxiLGIudHlwZSxiLnBlbmRpbmdQcm9wcyxjKTtjYXNlIDE3OnJldHVybiBkPWIudHlwZSxlPWIucGVuZGluZ1Byb3BzLGU9Yi5lbGVtZW50VHlwZT09PWQ/ZTpMZyhkLGUpLGpqKGEsYiksYi50YWc9MSxaZihkKT8oYT0hMCxjZyhiKSk6YT0hMSxUZyhiLGMpLHBoKGIsZCxlKSxyaChiLGQsZSxjKSxraihudWxsLGIsZCwhMCxhLGMpO2Nhc2UgMTk6cmV0dXJuIHlqKGEsYixjKTtjYXNlIDIyOnJldHVybiBlaihhLGIsYyl9dGhyb3cgRXJyb3IocCgxNTYsYi50YWcpKTt9O2Z1bmN0aW9uIEdrKGEsYil7cmV0dXJuIGFjKGEsYil9XG5mdW5jdGlvbiBhbChhLGIsYyxkKXt0aGlzLnRhZz1hO3RoaXMua2V5PWM7dGhpcy5zaWJsaW5nPXRoaXMuY2hpbGQ9dGhpcy5yZXR1cm49dGhpcy5zdGF0ZU5vZGU9dGhpcy50eXBlPXRoaXMuZWxlbWVudFR5cGU9bnVsbDt0aGlzLmluZGV4PTA7dGhpcy5yZWY9bnVsbDt0aGlzLnBlbmRpbmdQcm9wcz1iO3RoaXMuZGVwZW5kZW5jaWVzPXRoaXMubWVtb2l6ZWRTdGF0ZT10aGlzLnVwZGF0ZVF1ZXVlPXRoaXMubWVtb2l6ZWRQcm9wcz1udWxsO3RoaXMubW9kZT1kO3RoaXMuc3VidHJlZUZsYWdzPXRoaXMuZmxhZ3M9MDt0aGlzLmRlbGV0aW9ucz1udWxsO3RoaXMuY2hpbGRMYW5lcz10aGlzLmxhbmVzPTA7dGhpcy5hbHRlcm5hdGU9bnVsbH1mdW5jdGlvbiBCZyhhLGIsYyxkKXtyZXR1cm4gbmV3IGFsKGEsYixjLGQpfWZ1bmN0aW9uIGJqKGEpe2E9YS5wcm90b3R5cGU7cmV0dXJuISghYXx8IWEuaXNSZWFjdENvbXBvbmVudCl9XG5mdW5jdGlvbiAkayhhKXtpZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgYSlyZXR1cm4gYmooYSk/MTowO2lmKHZvaWQgMCE9PWEmJm51bGwhPT1hKXthPWEuJCR0eXBlb2Y7aWYoYT09PURhKXJldHVybiAxMTtpZihhPT09R2EpcmV0dXJuIDE0fXJldHVybiAyfVxuZnVuY3Rpb24gd2goYSxiKXt2YXIgYz1hLmFsdGVybmF0ZTtudWxsPT09Yz8oYz1CZyhhLnRhZyxiLGEua2V5LGEubW9kZSksYy5lbGVtZW50VHlwZT1hLmVsZW1lbnRUeXBlLGMudHlwZT1hLnR5cGUsYy5zdGF0ZU5vZGU9YS5zdGF0ZU5vZGUsYy5hbHRlcm5hdGU9YSxhLmFsdGVybmF0ZT1jKTooYy5wZW5kaW5nUHJvcHM9YixjLnR5cGU9YS50eXBlLGMuZmxhZ3M9MCxjLnN1YnRyZWVGbGFncz0wLGMuZGVsZXRpb25zPW51bGwpO2MuZmxhZ3M9YS5mbGFncyYxNDY4MDA2NDtjLmNoaWxkTGFuZXM9YS5jaGlsZExhbmVzO2MubGFuZXM9YS5sYW5lcztjLmNoaWxkPWEuY2hpbGQ7Yy5tZW1vaXplZFByb3BzPWEubWVtb2l6ZWRQcm9wcztjLm1lbW9pemVkU3RhdGU9YS5tZW1vaXplZFN0YXRlO2MudXBkYXRlUXVldWU9YS51cGRhdGVRdWV1ZTtiPWEuZGVwZW5kZW5jaWVzO2MuZGVwZW5kZW5jaWVzPW51bGw9PT1iP251bGw6e2xhbmVzOmIubGFuZXMsZmlyc3RDb250ZXh0OmIuZmlyc3RDb250ZXh0fTtcbmMuc2libGluZz1hLnNpYmxpbmc7Yy5pbmRleD1hLmluZGV4O2MucmVmPWEucmVmO3JldHVybiBjfVxuZnVuY3Rpb24geWgoYSxiLGMsZCxlLGYpe3ZhciBnPTI7ZD1hO2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBhKWJqKGEpJiYoZz0xKTtlbHNlIGlmKFwic3RyaW5nXCI9PT10eXBlb2YgYSlnPTU7ZWxzZSBhOnN3aXRjaChhKXtjYXNlIHlhOnJldHVybiBBaChjLmNoaWxkcmVuLGUsZixiKTtjYXNlIHphOmc9ODtlfD04O2JyZWFrO2Nhc2UgQWE6cmV0dXJuIGE9QmcoMTIsYyxiLGV8MiksYS5lbGVtZW50VHlwZT1BYSxhLmxhbmVzPWYsYTtjYXNlIEVhOnJldHVybiBhPUJnKDEzLGMsYixlKSxhLmVsZW1lbnRUeXBlPUVhLGEubGFuZXM9ZixhO2Nhc2UgRmE6cmV0dXJuIGE9QmcoMTksYyxiLGUpLGEuZWxlbWVudFR5cGU9RmEsYS5sYW5lcz1mLGE7Y2FzZSBJYTpyZXR1cm4gcWooYyxlLGYsYik7ZGVmYXVsdDppZihcIm9iamVjdFwiPT09dHlwZW9mIGEmJm51bGwhPT1hKXN3aXRjaChhLiQkdHlwZW9mKXtjYXNlIEJhOmc9MTA7YnJlYWsgYTtjYXNlIENhOmc9OTticmVhayBhO2Nhc2UgRGE6Zz0xMTtcbmJyZWFrIGE7Y2FzZSBHYTpnPTE0O2JyZWFrIGE7Y2FzZSBIYTpnPTE2O2Q9bnVsbDticmVhayBhfXRocm93IEVycm9yKHAoMTMwLG51bGw9PWE/YTp0eXBlb2YgYSxcIlwiKSk7fWI9QmcoZyxjLGIsZSk7Yi5lbGVtZW50VHlwZT1hO2IudHlwZT1kO2IubGFuZXM9ZjtyZXR1cm4gYn1mdW5jdGlvbiBBaChhLGIsYyxkKXthPUJnKDcsYSxkLGIpO2EubGFuZXM9YztyZXR1cm4gYX1mdW5jdGlvbiBxaihhLGIsYyxkKXthPUJnKDIyLGEsZCxiKTthLmVsZW1lbnRUeXBlPUlhO2EubGFuZXM9YzthLnN0YXRlTm9kZT17aXNIaWRkZW46ITF9O3JldHVybiBhfWZ1bmN0aW9uIHhoKGEsYixjKXthPUJnKDYsYSxudWxsLGIpO2EubGFuZXM9YztyZXR1cm4gYX1cbmZ1bmN0aW9uIHpoKGEsYixjKXtiPUJnKDQsbnVsbCE9PWEuY2hpbGRyZW4/YS5jaGlsZHJlbjpbXSxhLmtleSxiKTtiLmxhbmVzPWM7Yi5zdGF0ZU5vZGU9e2NvbnRhaW5lckluZm86YS5jb250YWluZXJJbmZvLHBlbmRpbmdDaGlsZHJlbjpudWxsLGltcGxlbWVudGF0aW9uOmEuaW1wbGVtZW50YXRpb259O3JldHVybiBifVxuZnVuY3Rpb24gYmwoYSxiLGMsZCxlKXt0aGlzLnRhZz1iO3RoaXMuY29udGFpbmVySW5mbz1hO3RoaXMuZmluaXNoZWRXb3JrPXRoaXMucGluZ0NhY2hlPXRoaXMuY3VycmVudD10aGlzLnBlbmRpbmdDaGlsZHJlbj1udWxsO3RoaXMudGltZW91dEhhbmRsZT0tMTt0aGlzLmNhbGxiYWNrTm9kZT10aGlzLnBlbmRpbmdDb250ZXh0PXRoaXMuY29udGV4dD1udWxsO3RoaXMuY2FsbGJhY2tQcmlvcml0eT0wO3RoaXMuZXZlbnRUaW1lcz16YygwKTt0aGlzLmV4cGlyYXRpb25UaW1lcz16YygtMSk7dGhpcy5lbnRhbmdsZWRMYW5lcz10aGlzLmZpbmlzaGVkTGFuZXM9dGhpcy5tdXRhYmxlUmVhZExhbmVzPXRoaXMuZXhwaXJlZExhbmVzPXRoaXMucGluZ2VkTGFuZXM9dGhpcy5zdXNwZW5kZWRMYW5lcz10aGlzLnBlbmRpbmdMYW5lcz0wO3RoaXMuZW50YW5nbGVtZW50cz16YygwKTt0aGlzLmlkZW50aWZpZXJQcmVmaXg9ZDt0aGlzLm9uUmVjb3ZlcmFibGVFcnJvcj1lO3RoaXMubXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YT1cbm51bGx9ZnVuY3Rpb24gY2woYSxiLGMsZCxlLGYsZyxoLGspe2E9bmV3IGJsKGEsYixjLGgsayk7MT09PWI/KGI9MSwhMD09PWYmJihifD04KSk6Yj0wO2Y9QmcoMyxudWxsLG51bGwsYik7YS5jdXJyZW50PWY7Zi5zdGF0ZU5vZGU9YTtmLm1lbW9pemVkU3RhdGU9e2VsZW1lbnQ6ZCxpc0RlaHlkcmF0ZWQ6YyxjYWNoZTpudWxsLHRyYW5zaXRpb25zOm51bGwscGVuZGluZ1N1c3BlbnNlQm91bmRhcmllczpudWxsfTthaChmKTtyZXR1cm4gYX1mdW5jdGlvbiBkbChhLGIsYyl7dmFyIGQ9Mzxhcmd1bWVudHMubGVuZ3RoJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10/YXJndW1lbnRzWzNdOm51bGw7cmV0dXJueyQkdHlwZW9mOndhLGtleTpudWxsPT1kP251bGw6XCJcIitkLGNoaWxkcmVuOmEsY29udGFpbmVySW5mbzpiLGltcGxlbWVudGF0aW9uOmN9fVxuZnVuY3Rpb24gZWwoYSl7aWYoIWEpcmV0dXJuIFZmO2E9YS5fcmVhY3RJbnRlcm5hbHM7YTp7aWYoVmIoYSkhPT1hfHwxIT09YS50YWcpdGhyb3cgRXJyb3IocCgxNzApKTt2YXIgYj1hO2Rve3N3aXRjaChiLnRhZyl7Y2FzZSAzOmI9Yi5zdGF0ZU5vZGUuY29udGV4dDticmVhayBhO2Nhc2UgMTppZihaZihiLnR5cGUpKXtiPWIuc3RhdGVOb2RlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0O2JyZWFrIGF9fWI9Yi5yZXR1cm59d2hpbGUobnVsbCE9PWIpO3Rocm93IEVycm9yKHAoMTcxKSk7fWlmKDE9PT1hLnRhZyl7dmFyIGM9YS50eXBlO2lmKFpmKGMpKXJldHVybiBiZyhhLGMsYil9cmV0dXJuIGJ9XG5mdW5jdGlvbiBmbChhLGIsYyxkLGUsZixnLGgsayl7YT1jbChjLGQsITAsYSxlLGYsZyxoLGspO2EuY29udGV4dD1lbChudWxsKTtjPWEuY3VycmVudDtkPUwoKTtlPWxoKGMpO2Y9Y2goZCxlKTtmLmNhbGxiYWNrPXZvaWQgMCE9PWImJm51bGwhPT1iP2I6bnVsbDtkaChjLGYsZSk7YS5jdXJyZW50LmxhbmVzPWU7QWMoYSxlLGQpO0VrKGEsZCk7cmV0dXJuIGF9ZnVuY3Rpb24gZ2woYSxiLGMsZCl7dmFyIGU9Yi5jdXJyZW50LGY9TCgpLGc9bGgoZSk7Yz1lbChjKTtudWxsPT09Yi5jb250ZXh0P2IuY29udGV4dD1jOmIucGVuZGluZ0NvbnRleHQ9YztiPWNoKGYsZyk7Yi5wYXlsb2FkPXtlbGVtZW50OmF9O2Q9dm9pZCAwPT09ZD9udWxsOmQ7bnVsbCE9PWQmJihiLmNhbGxiYWNrPWQpO2E9ZGgoZSxiLGcpO251bGwhPT1hJiYobWgoYSxlLGcsZiksZWgoYSxlLGcpKTtyZXR1cm4gZ31cbmZ1bmN0aW9uIGhsKGEpe2E9YS5jdXJyZW50O2lmKCFhLmNoaWxkKXJldHVybiBudWxsO3N3aXRjaChhLmNoaWxkLnRhZyl7Y2FzZSA1OnJldHVybiBhLmNoaWxkLnN0YXRlTm9kZTtkZWZhdWx0OnJldHVybiBhLmNoaWxkLnN0YXRlTm9kZX19ZnVuY3Rpb24gaWwoYSxiKXthPWEubWVtb2l6ZWRTdGF0ZTtpZihudWxsIT09YSYmbnVsbCE9PWEuZGVoeWRyYXRlZCl7dmFyIGM9YS5yZXRyeUxhbmU7YS5yZXRyeUxhbmU9MCE9PWMmJmM8Yj9jOmJ9fWZ1bmN0aW9uIGpsKGEsYil7aWwoYSxiKTsoYT1hLmFsdGVybmF0ZSkmJmlsKGEsYil9ZnVuY3Rpb24ga2woKXtyZXR1cm4gbnVsbH12YXIgbGw9XCJmdW5jdGlvblwiPT09dHlwZW9mIHJlcG9ydEVycm9yP3JlcG9ydEVycm9yOmZ1bmN0aW9uKGEpe2NvbnNvbGUuZXJyb3IoYSl9O2Z1bmN0aW9uIG1sKGEpe3RoaXMuX2ludGVybmFsUm9vdD1hfVxubmwucHJvdG90eXBlLnJlbmRlcj1tbC5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuX2ludGVybmFsUm9vdDtpZihudWxsPT09Yil0aHJvdyBFcnJvcihwKDQwOSkpO2dsKGEsYixudWxsLG51bGwpfTtubC5wcm90b3R5cGUudW5tb3VudD1tbC5wcm90b3R5cGUudW5tb3VudD1mdW5jdGlvbigpe3ZhciBhPXRoaXMuX2ludGVybmFsUm9vdDtpZihudWxsIT09YSl7dGhpcy5faW50ZXJuYWxSb290PW51bGw7dmFyIGI9YS5jb250YWluZXJJbmZvO1NrKGZ1bmN0aW9uKCl7Z2wobnVsbCxhLG51bGwsbnVsbCl9KTtiW3VmXT1udWxsfX07ZnVuY3Rpb24gbmwoYSl7dGhpcy5faW50ZXJuYWxSb290PWF9XG5ubC5wcm90b3R5cGUudW5zdGFibGVfc2NoZWR1bGVIeWRyYXRpb249ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGI9SGMoKTthPXtibG9ja2VkT246bnVsbCx0YXJnZXQ6YSxwcmlvcml0eTpifTtmb3IodmFyIGM9MDtjPFFjLmxlbmd0aCYmMCE9PWImJmI8UWNbY10ucHJpb3JpdHk7YysrKTtRYy5zcGxpY2UoYywwLGEpOzA9PT1jJiZWYyhhKX19O2Z1bmN0aW9uIG9sKGEpe3JldHVybiEoIWF8fDEhPT1hLm5vZGVUeXBlJiY5IT09YS5ub2RlVHlwZSYmMTEhPT1hLm5vZGVUeXBlKX1mdW5jdGlvbiBwbChhKXtyZXR1cm4hKCFhfHwxIT09YS5ub2RlVHlwZSYmOSE9PWEubm9kZVR5cGUmJjExIT09YS5ub2RlVHlwZSYmKDghPT1hLm5vZGVUeXBlfHxcIiByZWFjdC1tb3VudC1wb2ludC11bnN0YWJsZSBcIiE9PWEubm9kZVZhbHVlKSl9ZnVuY3Rpb24gcWwoKXt9XG5mdW5jdGlvbiBybChhLGIsYyxkLGUpe2lmKGUpe2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBkKXt2YXIgZj1kO2Q9ZnVuY3Rpb24oKXt2YXIgYT1obChnKTtmLmNhbGwoYSl9fXZhciBnPWZsKGIsZCxhLDAsbnVsbCwhMSwhMSxcIlwiLHFsKTthLl9yZWFjdFJvb3RDb250YWluZXI9ZzthW3VmXT1nLmN1cnJlbnQ7c2YoOD09PWEubm9kZVR5cGU/YS5wYXJlbnROb2RlOmEpO1NrKCk7cmV0dXJuIGd9Zm9yKDtlPWEubGFzdENoaWxkOylhLnJlbW92ZUNoaWxkKGUpO2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBkKXt2YXIgaD1kO2Q9ZnVuY3Rpb24oKXt2YXIgYT1obChrKTtoLmNhbGwoYSl9fXZhciBrPWNsKGEsMCwhMSxudWxsLG51bGwsITEsITEsXCJcIixxbCk7YS5fcmVhY3RSb290Q29udGFpbmVyPWs7YVt1Zl09ay5jdXJyZW50O3NmKDg9PT1hLm5vZGVUeXBlP2EucGFyZW50Tm9kZTphKTtTayhmdW5jdGlvbigpe2dsKGIsayxjLGQpfSk7cmV0dXJuIGt9XG5mdW5jdGlvbiBzbChhLGIsYyxkLGUpe3ZhciBmPWMuX3JlYWN0Um9vdENvbnRhaW5lcjtpZihmKXt2YXIgZz1mO2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBlKXt2YXIgaD1lO2U9ZnVuY3Rpb24oKXt2YXIgYT1obChnKTtoLmNhbGwoYSl9fWdsKGIsZyxhLGUpfWVsc2UgZz1ybChjLGIsYSxlLGQpO3JldHVybiBobChnKX1FYz1mdW5jdGlvbihhKXtzd2l0Y2goYS50YWcpe2Nhc2UgMzp2YXIgYj1hLnN0YXRlTm9kZTtpZihiLmN1cnJlbnQubWVtb2l6ZWRTdGF0ZS5pc0RlaHlkcmF0ZWQpe3ZhciBjPXRjKGIucGVuZGluZ0xhbmVzKTswIT09YyYmKENjKGIsY3wxKSxFayhiLEIoKSksMD09PShLJjYpJiYoSGo9QigpKzUwMCxqZygpKSl9YnJlYWs7Y2FzZSAxMzpTayhmdW5jdGlvbigpe3ZhciBiPVpnKGEsMSk7aWYobnVsbCE9PWIpe3ZhciBjPUwoKTttaChiLGEsMSxjKX19KSxqbChhLDEpfX07XG5GYz1mdW5jdGlvbihhKXtpZigxMz09PWEudGFnKXt2YXIgYj1aZyhhLDEzNDIxNzcyOCk7aWYobnVsbCE9PWIpe3ZhciBjPUwoKTttaChiLGEsMTM0MjE3NzI4LGMpfWpsKGEsMTM0MjE3NzI4KX19O0djPWZ1bmN0aW9uKGEpe2lmKDEzPT09YS50YWcpe3ZhciBiPWxoKGEpLGM9WmcoYSxiKTtpZihudWxsIT09Yyl7dmFyIGQ9TCgpO21oKGMsYSxiLGQpfWpsKGEsYil9fTtIYz1mdW5jdGlvbigpe3JldHVybiBDfTtJYz1mdW5jdGlvbihhLGIpe3ZhciBjPUM7dHJ5e3JldHVybiBDPWEsYigpfWZpbmFsbHl7Qz1jfX07XG55Yj1mdW5jdGlvbihhLGIsYyl7c3dpdGNoKGIpe2Nhc2UgXCJpbnB1dFwiOmJiKGEsYyk7Yj1jLm5hbWU7aWYoXCJyYWRpb1wiPT09Yy50eXBlJiZudWxsIT1iKXtmb3IoYz1hO2MucGFyZW50Tm9kZTspYz1jLnBhcmVudE5vZGU7Yz1jLnF1ZXJ5U2VsZWN0b3JBbGwoXCJpbnB1dFtuYW1lPVwiK0pTT04uc3RyaW5naWZ5KFwiXCIrYikrJ11bdHlwZT1cInJhZGlvXCJdJyk7Zm9yKGI9MDtiPGMubGVuZ3RoO2IrKyl7dmFyIGQ9Y1tiXTtpZihkIT09YSYmZC5mb3JtPT09YS5mb3JtKXt2YXIgZT1EYihkKTtpZighZSl0aHJvdyBFcnJvcihwKDkwKSk7V2EoZCk7YmIoZCxlKX19fWJyZWFrO2Nhc2UgXCJ0ZXh0YXJlYVwiOmliKGEsYyk7YnJlYWs7Y2FzZSBcInNlbGVjdFwiOmI9Yy52YWx1ZSxudWxsIT1iJiZmYihhLCEhYy5tdWx0aXBsZSxiLCExKX19O0diPVJrO0hiPVNrO1xudmFyIHRsPXt1c2luZ0NsaWVudEVudHJ5UG9pbnQ6ITEsRXZlbnRzOltDYix1ZSxEYixFYixGYixSa119LHVsPXtmaW5kRmliZXJCeUhvc3RJbnN0YW5jZTpXYyxidW5kbGVUeXBlOjAsdmVyc2lvbjpcIjE4LjIuMFwiLHJlbmRlcmVyUGFja2FnZU5hbWU6XCJyZWFjdC1kb21cIn07XG52YXIgdmw9e2J1bmRsZVR5cGU6dWwuYnVuZGxlVHlwZSx2ZXJzaW9uOnVsLnZlcnNpb24scmVuZGVyZXJQYWNrYWdlTmFtZTp1bC5yZW5kZXJlclBhY2thZ2VOYW1lLHJlbmRlcmVyQ29uZmlnOnVsLnJlbmRlcmVyQ29uZmlnLG92ZXJyaWRlSG9va1N0YXRlOm51bGwsb3ZlcnJpZGVIb29rU3RhdGVEZWxldGVQYXRoOm51bGwsb3ZlcnJpZGVIb29rU3RhdGVSZW5hbWVQYXRoOm51bGwsb3ZlcnJpZGVQcm9wczpudWxsLG92ZXJyaWRlUHJvcHNEZWxldGVQYXRoOm51bGwsb3ZlcnJpZGVQcm9wc1JlbmFtZVBhdGg6bnVsbCxzZXRFcnJvckhhbmRsZXI6bnVsbCxzZXRTdXNwZW5zZUhhbmRsZXI6bnVsbCxzY2hlZHVsZVVwZGF0ZTpudWxsLGN1cnJlbnREaXNwYXRjaGVyUmVmOnVhLlJlYWN0Q3VycmVudERpc3BhdGNoZXIsZmluZEhvc3RJbnN0YW5jZUJ5RmliZXI6ZnVuY3Rpb24oYSl7YT1aYihhKTtyZXR1cm4gbnVsbD09PWE/bnVsbDphLnN0YXRlTm9kZX0sZmluZEZpYmVyQnlIb3N0SW5zdGFuY2U6dWwuZmluZEZpYmVyQnlIb3N0SW5zdGFuY2V8fFxua2wsZmluZEhvc3RJbnN0YW5jZXNGb3JSZWZyZXNoOm51bGwsc2NoZWR1bGVSZWZyZXNoOm51bGwsc2NoZWR1bGVSb290Om51bGwsc2V0UmVmcmVzaEhhbmRsZXI6bnVsbCxnZXRDdXJyZW50RmliZXI6bnVsbCxyZWNvbmNpbGVyVmVyc2lvbjpcIjE4LjIuMC1uZXh0LTllM2I3NzJiOC0yMDIyMDYwOFwifTtpZihcInVuZGVmaW5lZFwiIT09dHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyl7dmFyIHdsPV9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXztpZighd2wuaXNEaXNhYmxlZCYmd2wuc3VwcG9ydHNGaWJlcil0cnl7a2M9d2wuaW5qZWN0KHZsKSxsYz13bH1jYXRjaChhKXt9fWV4cG9ydHMuX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQ9dGw7XG5leHBvcnRzLmNyZWF0ZVBvcnRhbD1mdW5jdGlvbihhLGIpe3ZhciBjPTI8YXJndW1lbnRzLmxlbmd0aCYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTpudWxsO2lmKCFvbChiKSl0aHJvdyBFcnJvcihwKDIwMCkpO3JldHVybiBkbChhLGIsbnVsbCxjKX07ZXhwb3J0cy5jcmVhdGVSb290PWZ1bmN0aW9uKGEsYil7aWYoIW9sKGEpKXRocm93IEVycm9yKHAoMjk5KSk7dmFyIGM9ITEsZD1cIlwiLGU9bGw7bnVsbCE9PWImJnZvaWQgMCE9PWImJighMD09PWIudW5zdGFibGVfc3RyaWN0TW9kZSYmKGM9ITApLHZvaWQgMCE9PWIuaWRlbnRpZmllclByZWZpeCYmKGQ9Yi5pZGVudGlmaWVyUHJlZml4KSx2b2lkIDAhPT1iLm9uUmVjb3ZlcmFibGVFcnJvciYmKGU9Yi5vblJlY292ZXJhYmxlRXJyb3IpKTtiPWNsKGEsMSwhMSxudWxsLG51bGwsYywhMSxkLGUpO2FbdWZdPWIuY3VycmVudDtzZig4PT09YS5ub2RlVHlwZT9hLnBhcmVudE5vZGU6YSk7cmV0dXJuIG5ldyBtbChiKX07XG5leHBvcnRzLmZpbmRET01Ob2RlPWZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpcmV0dXJuIG51bGw7aWYoMT09PWEubm9kZVR5cGUpcmV0dXJuIGE7dmFyIGI9YS5fcmVhY3RJbnRlcm5hbHM7aWYodm9pZCAwPT09Yil7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGEucmVuZGVyKXRocm93IEVycm9yKHAoMTg4KSk7YT1PYmplY3Qua2V5cyhhKS5qb2luKFwiLFwiKTt0aHJvdyBFcnJvcihwKDI2OCxhKSk7fWE9WmIoYik7YT1udWxsPT09YT9udWxsOmEuc3RhdGVOb2RlO3JldHVybiBhfTtleHBvcnRzLmZsdXNoU3luYz1mdW5jdGlvbihhKXtyZXR1cm4gU2soYSl9O2V4cG9ydHMuaHlkcmF0ZT1mdW5jdGlvbihhLGIsYyl7aWYoIXBsKGIpKXRocm93IEVycm9yKHAoMjAwKSk7cmV0dXJuIHNsKG51bGwsYSxiLCEwLGMpfTtcbmV4cG9ydHMuaHlkcmF0ZVJvb3Q9ZnVuY3Rpb24oYSxiLGMpe2lmKCFvbChhKSl0aHJvdyBFcnJvcihwKDQwNSkpO3ZhciBkPW51bGwhPWMmJmMuaHlkcmF0ZWRTb3VyY2VzfHxudWxsLGU9ITEsZj1cIlwiLGc9bGw7bnVsbCE9PWMmJnZvaWQgMCE9PWMmJighMD09PWMudW5zdGFibGVfc3RyaWN0TW9kZSYmKGU9ITApLHZvaWQgMCE9PWMuaWRlbnRpZmllclByZWZpeCYmKGY9Yy5pZGVudGlmaWVyUHJlZml4KSx2b2lkIDAhPT1jLm9uUmVjb3ZlcmFibGVFcnJvciYmKGc9Yy5vblJlY292ZXJhYmxlRXJyb3IpKTtiPWZsKGIsbnVsbCxhLDEsbnVsbCE9Yz9jOm51bGwsZSwhMSxmLGcpO2FbdWZdPWIuY3VycmVudDtzZihhKTtpZihkKWZvcihhPTA7YTxkLmxlbmd0aDthKyspYz1kW2FdLGU9Yy5fZ2V0VmVyc2lvbixlPWUoYy5fc291cmNlKSxudWxsPT1iLm11dGFibGVTb3VyY2VFYWdlckh5ZHJhdGlvbkRhdGE/Yi5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhPVtjLGVdOmIubXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YS5wdXNoKGMsXG5lKTtyZXR1cm4gbmV3IG5sKGIpfTtleHBvcnRzLnJlbmRlcj1mdW5jdGlvbihhLGIsYyl7aWYoIXBsKGIpKXRocm93IEVycm9yKHAoMjAwKSk7cmV0dXJuIHNsKG51bGwsYSxiLCExLGMpfTtleHBvcnRzLnVubW91bnRDb21wb25lbnRBdE5vZGU9ZnVuY3Rpb24oYSl7aWYoIXBsKGEpKXRocm93IEVycm9yKHAoNDApKTtyZXR1cm4gYS5fcmVhY3RSb290Q29udGFpbmVyPyhTayhmdW5jdGlvbigpe3NsKG51bGwsbnVsbCxhLCExLGZ1bmN0aW9uKCl7YS5fcmVhY3RSb290Q29udGFpbmVyPW51bGw7YVt1Zl09bnVsbH0pfSksITApOiExfTtleHBvcnRzLnVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzPVJrO1xuZXhwb3J0cy51bnN0YWJsZV9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcj1mdW5jdGlvbihhLGIsYyxkKXtpZighcGwoYykpdGhyb3cgRXJyb3IocCgyMDApKTtpZihudWxsPT1hfHx2b2lkIDA9PT1hLl9yZWFjdEludGVybmFscyl0aHJvdyBFcnJvcihwKDM4KSk7cmV0dXJuIHNsKGEsYixjLCExLGQpfTtleHBvcnRzLnZlcnNpb249XCIxOC4yLjAtbmV4dC05ZTNiNzcyYjgtMjAyMjA2MDhcIjtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///4448\n')},745:(__unused_webpack_module,exports,__webpack_require__)=>{"use strict";eval("var __webpack_unused_export__;\n\n\nvar m = __webpack_require__(3935);\nif (true) {\n exports.s = m.createRoot;\n __webpack_unused_export__ = m.hydrateRoot;\n} else { var i; }\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzQ1LmpzIiwibWFwcGluZ3MiOiI7QUFBYTs7QUFFYixRQUFRLG1CQUFPLENBQUMsSUFBVztBQUMzQixJQUFJLElBQXFDO0FBQ3pDLEVBQUUsU0FBa0I7QUFDcEIsRUFBRSx5QkFBbUI7QUFDckIsRUFBRSxLQUFLLFVBa0JOIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9jbGllbnQuanM/MTFiMSJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciBtID0gcmVxdWlyZSgncmVhY3QtZG9tJyk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBleHBvcnRzLmNyZWF0ZVJvb3QgPSBtLmNyZWF0ZVJvb3Q7XG4gIGV4cG9ydHMuaHlkcmF0ZVJvb3QgPSBtLmh5ZHJhdGVSb290O1xufSBlbHNlIHtcbiAgdmFyIGkgPSBtLl9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEO1xuICBleHBvcnRzLmNyZWF0ZVJvb3QgPSBmdW5jdGlvbihjLCBvKSB7XG4gICAgaS51c2luZ0NsaWVudEVudHJ5UG9pbnQgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gbS5jcmVhdGVSb290KGMsIG8pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpLnVzaW5nQ2xpZW50RW50cnlQb2ludCA9IGZhbHNlO1xuICAgIH1cbiAgfTtcbiAgZXhwb3J0cy5oeWRyYXRlUm9vdCA9IGZ1bmN0aW9uKGMsIGgsIG8pIHtcbiAgICBpLnVzaW5nQ2xpZW50RW50cnlQb2ludCA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBtLmh5ZHJhdGVSb290KGMsIGgsIG8pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpLnVzaW5nQ2xpZW50RW50cnlQb2ludCA9IGZhbHNlO1xuICAgIH1cbiAgfTtcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///745\n")},3935:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\nfunction checkDCE() {\n /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */\n if (\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined' ||\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE !== 'function'\n ) {\n return;\n }\n if (false) {}\n try {\n // Verify that the code above has been dead code eliminated (DCE'd).\n __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(checkDCE);\n } catch (err) {\n // DevTools shouldn't crash React, no matter what.\n // We should still report in case we break this code.\n console.error(err);\n }\n}\n\nif (true) {\n // DCE check should happen before ReactDOM bundle executes so that\n // DevTools can report bad minification during injection.\n checkDCE();\n module.exports = __webpack_require__(4448);\n} else {}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzkzNS5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxLQUFxQyxFQUFFLEVBUzFDO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsSUFBSSxJQUFxQztBQUN6QztBQUNBO0FBQ0E7QUFDQSxFQUFFLDBDQUE2RDtBQUMvRCxFQUFFLEtBQUssRUFFTiIsInNvdXJjZXMiOlsid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vaW5kZXguanM/OGJjOCJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIGNoZWNrRENFKCkge1xuICAvKiBnbG9iYWwgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICovXG4gIGlmIChcbiAgICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fID09PSAndW5kZWZpbmVkJyB8fFxuICAgIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18uY2hlY2tEQ0UgIT09ICdmdW5jdGlvbidcbiAgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgLy8gVGhpcyBicmFuY2ggaXMgdW5yZWFjaGFibGUgYmVjYXVzZSB0aGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkXG4gICAgLy8gaW4gcHJvZHVjdGlvbiwgYnV0IHRoZSBjb25kaXRpb24gaXMgdHJ1ZSBvbmx5IGluIGRldmVsb3BtZW50LlxuICAgIC8vIFRoZXJlZm9yZSBpZiB0aGUgYnJhbmNoIGlzIHN0aWxsIGhlcmUsIGRlYWQgY29kZSBlbGltaW5hdGlvbiB3YXNuJ3RcbiAgICAvLyBwcm9wZXJseSBhcHBsaWVkLlxuICAgIC8vIERvbid0IGNoYW5nZSB0aGUgbWVzc2FnZS4gUmVhY3QgRGV2VG9vbHMgcmVsaWVzIG9uIGl0LiBBbHNvIG1ha2Ugc3VyZVxuICAgIC8vIHRoaXMgbWVzc2FnZSBkb2Vzbid0IG9jY3VyIGVsc2V3aGVyZSBpbiB0aGlzIGZ1bmN0aW9uLCBvciBpdCB3aWxsIGNhdXNlXG4gICAgLy8gYSBmYWxzZSBwb3NpdGl2ZS5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ15fXicpO1xuICB9XG4gIHRyeSB7XG4gICAgLy8gVmVyaWZ5IHRoYXQgdGhlIGNvZGUgYWJvdmUgaGFzIGJlZW4gZGVhZCBjb2RlIGVsaW1pbmF0ZWQgKERDRSdkKS5cbiAgICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18uY2hlY2tEQ0UoY2hlY2tEQ0UpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBEZXZUb29scyBzaG91bGRuJ3QgY3Jhc2ggUmVhY3QsIG5vIG1hdHRlciB3aGF0LlxuICAgIC8vIFdlIHNob3VsZCBzdGlsbCByZXBvcnQgaW4gY2FzZSB3ZSBicmVhayB0aGlzIGNvZGUuXG4gICAgY29uc29sZS5lcnJvcihlcnIpO1xuICB9XG59XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIC8vIERDRSBjaGVjayBzaG91bGQgaGFwcGVuIGJlZm9yZSBSZWFjdERPTSBidW5kbGUgZXhlY3V0ZXMgc28gdGhhdFxuICAvLyBEZXZUb29scyBjYW4gcmVwb3J0IGJhZCBtaW5pZmljYXRpb24gZHVyaW5nIGluamVjdGlvbi5cbiAgY2hlY2tEQ0UoKTtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1kb20ucHJvZHVjdGlvbi5taW4uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtZG9tLmRldmVsb3BtZW50LmpzJyk7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///3935\n")},5251:(__unused_webpack_module,exports,__webpack_require__)=>{"use strict";eval('/**\n * @license React\n * react-jsx-runtime.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nvar f=__webpack_require__(7294),k=Symbol.for("react.element"),l=Symbol.for("react.fragment"),m=Object.prototype.hasOwnProperty,n=f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,p={key:!0,ref:!0,__self:!0,__source:!0};\nfunction q(c,a,g){var b,d={},e=null,h=null;void 0!==g&&(e=""+g);void 0!==a.key&&(e=""+a.key);void 0!==a.ref&&(h=a.ref);for(b in a)m.call(a,b)&&!p.hasOwnProperty(b)&&(d[b]=a[b]);if(c&&c.defaultProps)for(b in a=c.defaultProps,a)void 0===d[b]&&(d[b]=a[b]);return{$$typeof:k,type:c,key:e,ref:h,props:d,_owner:n.current}}exports.Fragment=l;exports.jsx=q;exports.jsxs=q;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTI1MS5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDYSxNQUFNLG1CQUFPLENBQUMsSUFBTyw2S0FBNks7QUFDL00sa0JBQWtCLFVBQVUsZUFBZSxxQkFBcUIsNkJBQTZCLDBCQUEwQiwwREFBMEQsNEVBQTRFLE9BQU8sd0RBQXdELGdCQUFnQixHQUFHLFdBQVcsR0FBRyxZQUFZIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL3JlYWN0L2Nqcy9yZWFjdC1qc3gtcnVudGltZS5wcm9kdWN0aW9uLm1pbi5qcz9kMzFkIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2UgUmVhY3RcbiAqIHJlYWN0LWpzeC1ydW50aW1lLnByb2R1Y3Rpb24ubWluLmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cbid1c2Ugc3RyaWN0Jzt2YXIgZj1yZXF1aXJlKFwicmVhY3RcIiksaz1TeW1ib2wuZm9yKFwicmVhY3QuZWxlbWVudFwiKSxsPVN5bWJvbC5mb3IoXCJyZWFjdC5mcmFnbWVudFwiKSxtPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksbj1mLl9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVELlJlYWN0Q3VycmVudE93bmVyLHA9e2tleTohMCxyZWY6ITAsX19zZWxmOiEwLF9fc291cmNlOiEwfTtcbmZ1bmN0aW9uIHEoYyxhLGcpe3ZhciBiLGQ9e30sZT1udWxsLGg9bnVsbDt2b2lkIDAhPT1nJiYoZT1cIlwiK2cpO3ZvaWQgMCE9PWEua2V5JiYoZT1cIlwiK2Eua2V5KTt2b2lkIDAhPT1hLnJlZiYmKGg9YS5yZWYpO2ZvcihiIGluIGEpbS5jYWxsKGEsYikmJiFwLmhhc093blByb3BlcnR5KGIpJiYoZFtiXT1hW2JdKTtpZihjJiZjLmRlZmF1bHRQcm9wcylmb3IoYiBpbiBhPWMuZGVmYXVsdFByb3BzLGEpdm9pZCAwPT09ZFtiXSYmKGRbYl09YVtiXSk7cmV0dXJueyQkdHlwZW9mOmssdHlwZTpjLGtleTplLHJlZjpoLHByb3BzOmQsX293bmVyOm4uY3VycmVudH19ZXhwb3J0cy5GcmFnbWVudD1sO2V4cG9ydHMuanN4PXE7ZXhwb3J0cy5qc3hzPXE7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///5251\n')},2408:(__unused_webpack_module,exports)=>{"use strict";eval('/**\n * @license React\n * react.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nvar l=Symbol.for("react.element"),n=Symbol.for("react.portal"),p=Symbol.for("react.fragment"),q=Symbol.for("react.strict_mode"),r=Symbol.for("react.profiler"),t=Symbol.for("react.provider"),u=Symbol.for("react.context"),v=Symbol.for("react.forward_ref"),w=Symbol.for("react.suspense"),x=Symbol.for("react.memo"),y=Symbol.for("react.lazy"),z=Symbol.iterator;function A(a){if(null===a||"object"!==typeof a)return null;a=z&&a[z]||a["@@iterator"];return"function"===typeof a?a:null}\nvar B={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},C=Object.assign,D={};function E(a,b,e){this.props=a;this.context=b;this.refs=D;this.updater=e||B}E.prototype.isReactComponent={};\nE.prototype.setState=function(a,b){if("object"!==typeof a&&"function"!==typeof a&&null!=a)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,a,b,"setState")};E.prototype.forceUpdate=function(a){this.updater.enqueueForceUpdate(this,a,"forceUpdate")};function F(){}F.prototype=E.prototype;function G(a,b,e){this.props=a;this.context=b;this.refs=D;this.updater=e||B}var H=G.prototype=new F;\nH.constructor=G;C(H,E.prototype);H.isPureReactComponent=!0;var I=Array.isArray,J=Object.prototype.hasOwnProperty,K={current:null},L={key:!0,ref:!0,__self:!0,__source:!0};\nfunction M(a,b,e){var d,c={},k=null,h=null;if(null!=b)for(d in void 0!==b.ref&&(h=b.ref),void 0!==b.key&&(k=""+b.key),b)J.call(b,d)&&!L.hasOwnProperty(d)&&(c[d]=b[d]);var g=arguments.length-2;if(1===g)c.children=e;else if(1<g){for(var f=Array(g),m=0;m<g;m++)f[m]=arguments[m+2];c.children=f}if(a&&a.defaultProps)for(d in g=a.defaultProps,g)void 0===c[d]&&(c[d]=g[d]);return{$$typeof:l,type:a,key:k,ref:h,props:c,_owner:K.current}}\nfunction N(a,b){return{$$typeof:l,type:a.type,key:b,ref:a.ref,props:a.props,_owner:a._owner}}function O(a){return"object"===typeof a&&null!==a&&a.$$typeof===l}function escape(a){var b={"=":"=0",":":"=2"};return"$"+a.replace(/[=:]/g,function(a){return b[a]})}var P=/\\/+/g;function Q(a,b){return"object"===typeof a&&null!==a&&null!=a.key?escape(""+a.key):b.toString(36)}\nfunction R(a,b,e,d,c){var k=typeof a;if("undefined"===k||"boolean"===k)a=null;var h=!1;if(null===a)h=!0;else switch(k){case "string":case "number":h=!0;break;case "object":switch(a.$$typeof){case l:case n:h=!0}}if(h)return h=a,c=c(h),a=""===d?"."+Q(h,0):d,I(c)?(e="",null!=a&&(e=a.replace(P,"$&/")+"/"),R(c,b,e,"",function(a){return a})):null!=c&&(O(c)&&(c=N(c,e+(!c.key||h&&h.key===c.key?"":(""+c.key).replace(P,"$&/")+"/")+a)),b.push(c)),1;h=0;d=""===d?".":d+":";if(I(a))for(var g=0;g<a.length;g++){k=\na[g];var f=d+Q(k,g);h+=R(k,b,e,f,c)}else if(f=A(a),"function"===typeof f)for(a=f.call(a),g=0;!(k=a.next()).done;)k=k.value,f=d+Q(k,g++),h+=R(k,b,e,f,c);else if("object"===k)throw b=String(a),Error("Objects are not valid as a React child (found: "+("[object Object]"===b?"object with keys {"+Object.keys(a).join(", ")+"}":b)+"). If you meant to render a collection of children, use an array instead.");return h}\nfunction S(a,b,e){if(null==a)return a;var d=[],c=0;R(a,d,"","",function(a){return b.call(e,a,c++)});return d}function T(a){if(-1===a._status){var b=a._result;b=b();b.then(function(b){if(0===a._status||-1===a._status)a._status=1,a._result=b},function(b){if(0===a._status||-1===a._status)a._status=2,a._result=b});-1===a._status&&(a._status=0,a._result=b)}if(1===a._status)return a._result.default;throw a._result;}\nvar U={current:null},V={transition:null},W={ReactCurrentDispatcher:U,ReactCurrentBatchConfig:V,ReactCurrentOwner:K};exports.Children={map:S,forEach:function(a,b,e){S(a,function(){b.apply(this,arguments)},e)},count:function(a){var b=0;S(a,function(){b++});return b},toArray:function(a){return S(a,function(a){return a})||[]},only:function(a){if(!O(a))throw Error("React.Children.only expected to receive a single React element child.");return a}};exports.Component=E;exports.Fragment=p;\nexports.Profiler=r;exports.PureComponent=G;exports.StrictMode=q;exports.Suspense=w;exports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=W;\nexports.cloneElement=function(a,b,e){if(null===a||void 0===a)throw Error("React.cloneElement(...): The argument must be a React element, but you passed "+a+".");var d=C({},a.props),c=a.key,k=a.ref,h=a._owner;if(null!=b){void 0!==b.ref&&(k=b.ref,h=K.current);void 0!==b.key&&(c=""+b.key);if(a.type&&a.type.defaultProps)var g=a.type.defaultProps;for(f in b)J.call(b,f)&&!L.hasOwnProperty(f)&&(d[f]=void 0===b[f]&&void 0!==g?g[f]:b[f])}var f=arguments.length-2;if(1===f)d.children=e;else if(1<f){g=Array(f);\nfor(var m=0;m<f;m++)g[m]=arguments[m+2];d.children=g}return{$$typeof:l,type:a.type,key:c,ref:k,props:d,_owner:h}};exports.createContext=function(a){a={$$typeof:u,_currentValue:a,_currentValue2:a,_threadCount:0,Provider:null,Consumer:null,_defaultValue:null,_globalName:null};a.Provider={$$typeof:t,_context:a};return a.Consumer=a};exports.createElement=M;exports.createFactory=function(a){var b=M.bind(null,a);b.type=a;return b};exports.createRef=function(){return{current:null}};\nexports.forwardRef=function(a){return{$$typeof:v,render:a}};exports.isValidElement=O;exports.lazy=function(a){return{$$typeof:y,_payload:{_status:-1,_result:a},_init:T}};exports.memo=function(a,b){return{$$typeof:x,type:a,compare:void 0===b?null:b}};exports.startTransition=function(a){var b=V.transition;V.transition={};try{a()}finally{V.transition=b}};exports.unstable_act=function(){throw Error("act(...) is not supported in production builds of React.");};\nexports.useCallback=function(a,b){return U.current.useCallback(a,b)};exports.useContext=function(a){return U.current.useContext(a)};exports.useDebugValue=function(){};exports.useDeferredValue=function(a){return U.current.useDeferredValue(a)};exports.useEffect=function(a,b){return U.current.useEffect(a,b)};exports.useId=function(){return U.current.useId()};exports.useImperativeHandle=function(a,b,e){return U.current.useImperativeHandle(a,b,e)};\nexports.useInsertionEffect=function(a,b){return U.current.useInsertionEffect(a,b)};exports.useLayoutEffect=function(a,b){return U.current.useLayoutEffect(a,b)};exports.useMemo=function(a,b){return U.current.useMemo(a,b)};exports.useReducer=function(a,b,e){return U.current.useReducer(a,b,e)};exports.useRef=function(a){return U.current.useRef(a)};exports.useState=function(a){return U.current.useState(a)};exports.useSyncExternalStore=function(a,b,e){return U.current.useSyncExternalStore(a,b,e)};\nexports.useTransition=function(){return U.current.useTransition()};exports.version="18.2.0";\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQwOC5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDYSxxV0FBcVcsY0FBYyw2Q0FBNkMsMkJBQTJCO0FBQ3hjLE9BQU8scUJBQXFCLFNBQVMsZ0NBQWdDLGlDQUFpQyw4QkFBOEIsc0JBQXNCLGtCQUFrQixhQUFhLGVBQWUsWUFBWSxrQkFBa0I7QUFDdE8sbUNBQW1DLDRMQUE0TCxtREFBbUQsb0NBQW9DLHVEQUF1RCxjQUFjLHdCQUF3QixrQkFBa0IsYUFBYSxlQUFlLFlBQVksa0JBQWtCO0FBQy9kLGdCQUFnQixpQkFBaUIsMEJBQTBCLHlEQUF5RCxhQUFhLElBQUk7QUFDckksa0JBQWtCLFVBQVUsZUFBZSw0SEFBNEgseUJBQXlCLHNCQUFzQixhQUFhLHVCQUF1QixJQUFJLHdCQUF3QixhQUFhLDRFQUE0RSxPQUFPO0FBQ3RYLGdCQUFnQixPQUFPLHNFQUFzRSxjQUFjLG9EQUFvRCxtQkFBbUIsT0FBTyxtQkFBbUIsd0NBQXdDLFlBQVksRUFBRSxhQUFhLGdCQUFnQjtBQUMvUixzQkFBc0IsZUFBZSx5Q0FBeUMsU0FBUyxpQkFBaUIsZUFBZSxpQ0FBaUMsTUFBTSxpQ0FBaUMsb0JBQW9CLG1IQUFtSCxTQUFTLDJHQUEyRyxJQUFJLG1CQUFtQixvQkFBb0IsV0FBVyxLQUFLO0FBQ3JmLEtBQUssZUFBZSxnQkFBZ0IseURBQXlELG1CQUFtQix3Q0FBd0MseUlBQXlJLDhCQUE4QixrRkFBa0Y7QUFDalosa0JBQWtCLG9CQUFvQixhQUFhLHdCQUF3Qix1QkFBdUIsRUFBRSxTQUFTLGNBQWMsbUJBQW1CLGdCQUFnQixNQUFNLG1CQUFtQix5REFBeUQsYUFBYSx5REFBeUQsRUFBRSwwQ0FBMEMsMENBQTBDO0FBQzVZLE9BQU8sYUFBYSxJQUFJLGdCQUFnQixJQUFJLHdFQUF3RSxnQkFBZ0IsRUFBRSw4QkFBOEIsZUFBZSx3QkFBd0IsSUFBSSxtQkFBbUIsUUFBUSxlQUFlLElBQUksRUFBRSxTQUFTLHFCQUFxQix1QkFBdUIsU0FBUyxNQUFNLGtCQUFrQiw4RkFBOEYsV0FBVyxpQkFBaUIsR0FBRyxnQkFBZ0I7QUFDbGUsZ0JBQWdCLEdBQUcscUJBQXFCLEdBQUcsa0JBQWtCLEdBQUcsZ0JBQWdCLEdBQUcsMERBQTBEO0FBQzdJLG9CQUFvQixpQkFBaUIsNEhBQTRILFVBQVUscUNBQXFDLFlBQVksc0NBQXNDLDZCQUE2Qix5REFBeUQseUZBQXlGLHlCQUF5QixzQkFBc0IsYUFBYTtBQUM3ZSxZQUFZLElBQUksd0JBQXdCLGFBQWEsT0FBTyxzREFBc0QscUJBQXFCLGFBQWEsR0FBRyw0SEFBNEgsWUFBWSx1QkFBdUIscUJBQXFCLHFCQUFxQixHQUFHLHFCQUFxQixhQUFhLHFCQUFxQixTQUFTLFVBQVUsaUJBQWlCLFlBQVksT0FBTztBQUNqZCxrQkFBa0IsYUFBYSxPQUFPLHNCQUFzQixzQkFBc0IsR0FBRyxZQUFZLGFBQWEsT0FBTyxxQkFBcUIscUJBQXFCLFdBQVcsWUFBWSxlQUFlLE9BQU8sOENBQThDLHVCQUF1QixhQUFhLG1CQUFtQixnQkFBZ0IsSUFBSSxJQUFJLFFBQVEsaUJBQWlCLG9CQUFvQixZQUFZO0FBQ2xZLG1CQUFtQixlQUFlLG1DQUFtQyxrQkFBa0IsYUFBYSxnQ0FBZ0MscUJBQXFCLGNBQWMsd0JBQXdCLGFBQWEsc0NBQXNDLGlCQUFpQixlQUFlLGlDQUFpQyxhQUFhLFlBQVksMEJBQTBCLDJCQUEyQixpQkFBaUI7QUFDbFosMEJBQTBCLGVBQWUsMENBQTBDLHVCQUF1QixlQUFlLHVDQUF1QyxlQUFlLGVBQWUsK0JBQStCLGtCQUFrQixpQkFBaUIsb0NBQW9DLGNBQWMsYUFBYSw0QkFBNEIsZ0JBQWdCLGFBQWEsOEJBQThCLDRCQUE0QixpQkFBaUI7QUFDbmMscUJBQXFCLFlBQVksa0NBQWtDLGVBQWUiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvcmVhY3QvY2pzL3JlYWN0LnByb2R1Y3Rpb24ubWluLmpzP2JlMjQiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZSBSZWFjdFxuICogcmVhY3QucHJvZHVjdGlvbi5taW4uanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuJ3VzZSBzdHJpY3QnO3ZhciBsPVN5bWJvbC5mb3IoXCJyZWFjdC5lbGVtZW50XCIpLG49U3ltYm9sLmZvcihcInJlYWN0LnBvcnRhbFwiKSxwPVN5bWJvbC5mb3IoXCJyZWFjdC5mcmFnbWVudFwiKSxxPVN5bWJvbC5mb3IoXCJyZWFjdC5zdHJpY3RfbW9kZVwiKSxyPVN5bWJvbC5mb3IoXCJyZWFjdC5wcm9maWxlclwiKSx0PVN5bWJvbC5mb3IoXCJyZWFjdC5wcm92aWRlclwiKSx1PVN5bWJvbC5mb3IoXCJyZWFjdC5jb250ZXh0XCIpLHY9U3ltYm9sLmZvcihcInJlYWN0LmZvcndhcmRfcmVmXCIpLHc9U3ltYm9sLmZvcihcInJlYWN0LnN1c3BlbnNlXCIpLHg9U3ltYm9sLmZvcihcInJlYWN0Lm1lbW9cIikseT1TeW1ib2wuZm9yKFwicmVhY3QubGF6eVwiKSx6PVN5bWJvbC5pdGVyYXRvcjtmdW5jdGlvbiBBKGEpe2lmKG51bGw9PT1hfHxcIm9iamVjdFwiIT09dHlwZW9mIGEpcmV0dXJuIG51bGw7YT16JiZhW3pdfHxhW1wiQEBpdGVyYXRvclwiXTtyZXR1cm5cImZ1bmN0aW9uXCI9PT10eXBlb2YgYT9hOm51bGx9XG52YXIgQj17aXNNb3VudGVkOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGVucXVldWVGb3JjZVVwZGF0ZTpmdW5jdGlvbigpe30sZW5xdWV1ZVJlcGxhY2VTdGF0ZTpmdW5jdGlvbigpe30sZW5xdWV1ZVNldFN0YXRlOmZ1bmN0aW9uKCl7fX0sQz1PYmplY3QuYXNzaWduLEQ9e307ZnVuY3Rpb24gRShhLGIsZSl7dGhpcy5wcm9wcz1hO3RoaXMuY29udGV4dD1iO3RoaXMucmVmcz1EO3RoaXMudXBkYXRlcj1lfHxCfUUucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQ9e307XG5FLnByb3RvdHlwZS5zZXRTdGF0ZT1mdW5jdGlvbihhLGIpe2lmKFwib2JqZWN0XCIhPT10eXBlb2YgYSYmXCJmdW5jdGlvblwiIT09dHlwZW9mIGEmJm51bGwhPWEpdGhyb3cgRXJyb3IoXCJzZXRTdGF0ZSguLi4pOiB0YWtlcyBhbiBvYmplY3Qgb2Ygc3RhdGUgdmFyaWFibGVzIHRvIHVwZGF0ZSBvciBhIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgYW4gb2JqZWN0IG9mIHN0YXRlIHZhcmlhYmxlcy5cIik7dGhpcy51cGRhdGVyLmVucXVldWVTZXRTdGF0ZSh0aGlzLGEsYixcInNldFN0YXRlXCIpfTtFLnByb3RvdHlwZS5mb3JjZVVwZGF0ZT1mdW5jdGlvbihhKXt0aGlzLnVwZGF0ZXIuZW5xdWV1ZUZvcmNlVXBkYXRlKHRoaXMsYSxcImZvcmNlVXBkYXRlXCIpfTtmdW5jdGlvbiBGKCl7fUYucHJvdG90eXBlPUUucHJvdG90eXBlO2Z1bmN0aW9uIEcoYSxiLGUpe3RoaXMucHJvcHM9YTt0aGlzLmNvbnRleHQ9Yjt0aGlzLnJlZnM9RDt0aGlzLnVwZGF0ZXI9ZXx8Qn12YXIgSD1HLnByb3RvdHlwZT1uZXcgRjtcbkguY29uc3RydWN0b3I9RztDKEgsRS5wcm90b3R5cGUpO0guaXNQdXJlUmVhY3RDb21wb25lbnQ9ITA7dmFyIEk9QXJyYXkuaXNBcnJheSxKPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksSz17Y3VycmVudDpudWxsfSxMPXtrZXk6ITAscmVmOiEwLF9fc2VsZjohMCxfX3NvdXJjZTohMH07XG5mdW5jdGlvbiBNKGEsYixlKXt2YXIgZCxjPXt9LGs9bnVsbCxoPW51bGw7aWYobnVsbCE9Yilmb3IoZCBpbiB2b2lkIDAhPT1iLnJlZiYmKGg9Yi5yZWYpLHZvaWQgMCE9PWIua2V5JiYoaz1cIlwiK2Iua2V5KSxiKUouY2FsbChiLGQpJiYhTC5oYXNPd25Qcm9wZXJ0eShkKSYmKGNbZF09YltkXSk7dmFyIGc9YXJndW1lbnRzLmxlbmd0aC0yO2lmKDE9PT1nKWMuY2hpbGRyZW49ZTtlbHNlIGlmKDE8Zyl7Zm9yKHZhciBmPUFycmF5KGcpLG09MDttPGc7bSsrKWZbbV09YXJndW1lbnRzW20rMl07Yy5jaGlsZHJlbj1mfWlmKGEmJmEuZGVmYXVsdFByb3BzKWZvcihkIGluIGc9YS5kZWZhdWx0UHJvcHMsZyl2b2lkIDA9PT1jW2RdJiYoY1tkXT1nW2RdKTtyZXR1cm57JCR0eXBlb2Y6bCx0eXBlOmEsa2V5OmsscmVmOmgscHJvcHM6Yyxfb3duZXI6Sy5jdXJyZW50fX1cbmZ1bmN0aW9uIE4oYSxiKXtyZXR1cm57JCR0eXBlb2Y6bCx0eXBlOmEudHlwZSxrZXk6YixyZWY6YS5yZWYscHJvcHM6YS5wcm9wcyxfb3duZXI6YS5fb3duZXJ9fWZ1bmN0aW9uIE8oYSl7cmV0dXJuXCJvYmplY3RcIj09PXR5cGVvZiBhJiZudWxsIT09YSYmYS4kJHR5cGVvZj09PWx9ZnVuY3Rpb24gZXNjYXBlKGEpe3ZhciBiPXtcIj1cIjpcIj0wXCIsXCI6XCI6XCI9MlwifTtyZXR1cm5cIiRcIithLnJlcGxhY2UoL1s9Ol0vZyxmdW5jdGlvbihhKXtyZXR1cm4gYlthXX0pfXZhciBQPS9cXC8rL2c7ZnVuY3Rpb24gUShhLGIpe3JldHVyblwib2JqZWN0XCI9PT10eXBlb2YgYSYmbnVsbCE9PWEmJm51bGwhPWEua2V5P2VzY2FwZShcIlwiK2Eua2V5KTpiLnRvU3RyaW5nKDM2KX1cbmZ1bmN0aW9uIFIoYSxiLGUsZCxjKXt2YXIgaz10eXBlb2YgYTtpZihcInVuZGVmaW5lZFwiPT09a3x8XCJib29sZWFuXCI9PT1rKWE9bnVsbDt2YXIgaD0hMTtpZihudWxsPT09YSloPSEwO2Vsc2Ugc3dpdGNoKGspe2Nhc2UgXCJzdHJpbmdcIjpjYXNlIFwibnVtYmVyXCI6aD0hMDticmVhaztjYXNlIFwib2JqZWN0XCI6c3dpdGNoKGEuJCR0eXBlb2Ype2Nhc2UgbDpjYXNlIG46aD0hMH19aWYoaClyZXR1cm4gaD1hLGM9YyhoKSxhPVwiXCI9PT1kP1wiLlwiK1EoaCwwKTpkLEkoYyk/KGU9XCJcIixudWxsIT1hJiYoZT1hLnJlcGxhY2UoUCxcIiQmL1wiKStcIi9cIiksUihjLGIsZSxcIlwiLGZ1bmN0aW9uKGEpe3JldHVybiBhfSkpOm51bGwhPWMmJihPKGMpJiYoYz1OKGMsZSsoIWMua2V5fHxoJiZoLmtleT09PWMua2V5P1wiXCI6KFwiXCIrYy5rZXkpLnJlcGxhY2UoUCxcIiQmL1wiKStcIi9cIikrYSkpLGIucHVzaChjKSksMTtoPTA7ZD1cIlwiPT09ZD9cIi5cIjpkK1wiOlwiO2lmKEkoYSkpZm9yKHZhciBnPTA7ZzxhLmxlbmd0aDtnKyspe2s9XG5hW2ddO3ZhciBmPWQrUShrLGcpO2grPVIoayxiLGUsZixjKX1lbHNlIGlmKGY9QShhKSxcImZ1bmN0aW9uXCI9PT10eXBlb2YgZilmb3IoYT1mLmNhbGwoYSksZz0wOyEoaz1hLm5leHQoKSkuZG9uZTspaz1rLnZhbHVlLGY9ZCtRKGssZysrKSxoKz1SKGssYixlLGYsYyk7ZWxzZSBpZihcIm9iamVjdFwiPT09ayl0aHJvdyBiPVN0cmluZyhhKSxFcnJvcihcIk9iamVjdHMgYXJlIG5vdCB2YWxpZCBhcyBhIFJlYWN0IGNoaWxkIChmb3VuZDogXCIrKFwiW29iamVjdCBPYmplY3RdXCI9PT1iP1wib2JqZWN0IHdpdGgga2V5cyB7XCIrT2JqZWN0LmtleXMoYSkuam9pbihcIiwgXCIpK1wifVwiOmIpK1wiKS4gSWYgeW91IG1lYW50IHRvIHJlbmRlciBhIGNvbGxlY3Rpb24gb2YgY2hpbGRyZW4sIHVzZSBhbiBhcnJheSBpbnN0ZWFkLlwiKTtyZXR1cm4gaH1cbmZ1bmN0aW9uIFMoYSxiLGUpe2lmKG51bGw9PWEpcmV0dXJuIGE7dmFyIGQ9W10sYz0wO1IoYSxkLFwiXCIsXCJcIixmdW5jdGlvbihhKXtyZXR1cm4gYi5jYWxsKGUsYSxjKyspfSk7cmV0dXJuIGR9ZnVuY3Rpb24gVChhKXtpZigtMT09PWEuX3N0YXR1cyl7dmFyIGI9YS5fcmVzdWx0O2I9YigpO2IudGhlbihmdW5jdGlvbihiKXtpZigwPT09YS5fc3RhdHVzfHwtMT09PWEuX3N0YXR1cylhLl9zdGF0dXM9MSxhLl9yZXN1bHQ9Yn0sZnVuY3Rpb24oYil7aWYoMD09PWEuX3N0YXR1c3x8LTE9PT1hLl9zdGF0dXMpYS5fc3RhdHVzPTIsYS5fcmVzdWx0PWJ9KTstMT09PWEuX3N0YXR1cyYmKGEuX3N0YXR1cz0wLGEuX3Jlc3VsdD1iKX1pZigxPT09YS5fc3RhdHVzKXJldHVybiBhLl9yZXN1bHQuZGVmYXVsdDt0aHJvdyBhLl9yZXN1bHQ7fVxudmFyIFU9e2N1cnJlbnQ6bnVsbH0sVj17dHJhbnNpdGlvbjpudWxsfSxXPXtSZWFjdEN1cnJlbnREaXNwYXRjaGVyOlUsUmVhY3RDdXJyZW50QmF0Y2hDb25maWc6VixSZWFjdEN1cnJlbnRPd25lcjpLfTtleHBvcnRzLkNoaWxkcmVuPXttYXA6Uyxmb3JFYWNoOmZ1bmN0aW9uKGEsYixlKXtTKGEsZnVuY3Rpb24oKXtiLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZSl9LGNvdW50OmZ1bmN0aW9uKGEpe3ZhciBiPTA7UyhhLGZ1bmN0aW9uKCl7YisrfSk7cmV0dXJuIGJ9LHRvQXJyYXk6ZnVuY3Rpb24oYSl7cmV0dXJuIFMoYSxmdW5jdGlvbihhKXtyZXR1cm4gYX0pfHxbXX0sb25seTpmdW5jdGlvbihhKXtpZighTyhhKSl0aHJvdyBFcnJvcihcIlJlYWN0LkNoaWxkcmVuLm9ubHkgZXhwZWN0ZWQgdG8gcmVjZWl2ZSBhIHNpbmdsZSBSZWFjdCBlbGVtZW50IGNoaWxkLlwiKTtyZXR1cm4gYX19O2V4cG9ydHMuQ29tcG9uZW50PUU7ZXhwb3J0cy5GcmFnbWVudD1wO1xuZXhwb3J0cy5Qcm9maWxlcj1yO2V4cG9ydHMuUHVyZUNvbXBvbmVudD1HO2V4cG9ydHMuU3RyaWN0TW9kZT1xO2V4cG9ydHMuU3VzcGVuc2U9dztleHBvcnRzLl9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEPVc7XG5leHBvcnRzLmNsb25lRWxlbWVudD1mdW5jdGlvbihhLGIsZSl7aWYobnVsbD09PWF8fHZvaWQgMD09PWEpdGhyb3cgRXJyb3IoXCJSZWFjdC5jbG9uZUVsZW1lbnQoLi4uKTogVGhlIGFyZ3VtZW50IG11c3QgYmUgYSBSZWFjdCBlbGVtZW50LCBidXQgeW91IHBhc3NlZCBcIithK1wiLlwiKTt2YXIgZD1DKHt9LGEucHJvcHMpLGM9YS5rZXksaz1hLnJlZixoPWEuX293bmVyO2lmKG51bGwhPWIpe3ZvaWQgMCE9PWIucmVmJiYoaz1iLnJlZixoPUsuY3VycmVudCk7dm9pZCAwIT09Yi5rZXkmJihjPVwiXCIrYi5rZXkpO2lmKGEudHlwZSYmYS50eXBlLmRlZmF1bHRQcm9wcyl2YXIgZz1hLnR5cGUuZGVmYXVsdFByb3BzO2ZvcihmIGluIGIpSi5jYWxsKGIsZikmJiFMLmhhc093blByb3BlcnR5KGYpJiYoZFtmXT12b2lkIDA9PT1iW2ZdJiZ2b2lkIDAhPT1nP2dbZl06YltmXSl9dmFyIGY9YXJndW1lbnRzLmxlbmd0aC0yO2lmKDE9PT1mKWQuY2hpbGRyZW49ZTtlbHNlIGlmKDE8Zil7Zz1BcnJheShmKTtcbmZvcih2YXIgbT0wO208ZjttKyspZ1ttXT1hcmd1bWVudHNbbSsyXTtkLmNoaWxkcmVuPWd9cmV0dXJueyQkdHlwZW9mOmwsdHlwZTphLnR5cGUsa2V5OmMscmVmOmsscHJvcHM6ZCxfb3duZXI6aH19O2V4cG9ydHMuY3JlYXRlQ29udGV4dD1mdW5jdGlvbihhKXthPXskJHR5cGVvZjp1LF9jdXJyZW50VmFsdWU6YSxfY3VycmVudFZhbHVlMjphLF90aHJlYWRDb3VudDowLFByb3ZpZGVyOm51bGwsQ29uc3VtZXI6bnVsbCxfZGVmYXVsdFZhbHVlOm51bGwsX2dsb2JhbE5hbWU6bnVsbH07YS5Qcm92aWRlcj17JCR0eXBlb2Y6dCxfY29udGV4dDphfTtyZXR1cm4gYS5Db25zdW1lcj1hfTtleHBvcnRzLmNyZWF0ZUVsZW1lbnQ9TTtleHBvcnRzLmNyZWF0ZUZhY3Rvcnk9ZnVuY3Rpb24oYSl7dmFyIGI9TS5iaW5kKG51bGwsYSk7Yi50eXBlPWE7cmV0dXJuIGJ9O2V4cG9ydHMuY3JlYXRlUmVmPWZ1bmN0aW9uKCl7cmV0dXJue2N1cnJlbnQ6bnVsbH19O1xuZXhwb3J0cy5mb3J3YXJkUmVmPWZ1bmN0aW9uKGEpe3JldHVybnskJHR5cGVvZjp2LHJlbmRlcjphfX07ZXhwb3J0cy5pc1ZhbGlkRWxlbWVudD1PO2V4cG9ydHMubGF6eT1mdW5jdGlvbihhKXtyZXR1cm57JCR0eXBlb2Y6eSxfcGF5bG9hZDp7X3N0YXR1czotMSxfcmVzdWx0OmF9LF9pbml0OlR9fTtleHBvcnRzLm1lbW89ZnVuY3Rpb24oYSxiKXtyZXR1cm57JCR0eXBlb2Y6eCx0eXBlOmEsY29tcGFyZTp2b2lkIDA9PT1iP251bGw6Yn19O2V4cG9ydHMuc3RhcnRUcmFuc2l0aW9uPWZ1bmN0aW9uKGEpe3ZhciBiPVYudHJhbnNpdGlvbjtWLnRyYW5zaXRpb249e307dHJ5e2EoKX1maW5hbGx5e1YudHJhbnNpdGlvbj1ifX07ZXhwb3J0cy51bnN0YWJsZV9hY3Q9ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcihcImFjdCguLi4pIGlzIG5vdCBzdXBwb3J0ZWQgaW4gcHJvZHVjdGlvbiBidWlsZHMgb2YgUmVhY3QuXCIpO307XG5leHBvcnRzLnVzZUNhbGxiYWNrPWZ1bmN0aW9uKGEsYil7cmV0dXJuIFUuY3VycmVudC51c2VDYWxsYmFjayhhLGIpfTtleHBvcnRzLnVzZUNvbnRleHQ9ZnVuY3Rpb24oYSl7cmV0dXJuIFUuY3VycmVudC51c2VDb250ZXh0KGEpfTtleHBvcnRzLnVzZURlYnVnVmFsdWU9ZnVuY3Rpb24oKXt9O2V4cG9ydHMudXNlRGVmZXJyZWRWYWx1ZT1mdW5jdGlvbihhKXtyZXR1cm4gVS5jdXJyZW50LnVzZURlZmVycmVkVmFsdWUoYSl9O2V4cG9ydHMudXNlRWZmZWN0PWZ1bmN0aW9uKGEsYil7cmV0dXJuIFUuY3VycmVudC51c2VFZmZlY3QoYSxiKX07ZXhwb3J0cy51c2VJZD1mdW5jdGlvbigpe3JldHVybiBVLmN1cnJlbnQudXNlSWQoKX07ZXhwb3J0cy51c2VJbXBlcmF0aXZlSGFuZGxlPWZ1bmN0aW9uKGEsYixlKXtyZXR1cm4gVS5jdXJyZW50LnVzZUltcGVyYXRpdmVIYW5kbGUoYSxiLGUpfTtcbmV4cG9ydHMudXNlSW5zZXJ0aW9uRWZmZWN0PWZ1bmN0aW9uKGEsYil7cmV0dXJuIFUuY3VycmVudC51c2VJbnNlcnRpb25FZmZlY3QoYSxiKX07ZXhwb3J0cy51c2VMYXlvdXRFZmZlY3Q9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gVS5jdXJyZW50LnVzZUxheW91dEVmZmVjdChhLGIpfTtleHBvcnRzLnVzZU1lbW89ZnVuY3Rpb24oYSxiKXtyZXR1cm4gVS5jdXJyZW50LnVzZU1lbW8oYSxiKX07ZXhwb3J0cy51c2VSZWR1Y2VyPWZ1bmN0aW9uKGEsYixlKXtyZXR1cm4gVS5jdXJyZW50LnVzZVJlZHVjZXIoYSxiLGUpfTtleHBvcnRzLnVzZVJlZj1mdW5jdGlvbihhKXtyZXR1cm4gVS5jdXJyZW50LnVzZVJlZihhKX07ZXhwb3J0cy51c2VTdGF0ZT1mdW5jdGlvbihhKXtyZXR1cm4gVS5jdXJyZW50LnVzZVN0YXRlKGEpfTtleHBvcnRzLnVzZVN5bmNFeHRlcm5hbFN0b3JlPWZ1bmN0aW9uKGEsYixlKXtyZXR1cm4gVS5jdXJyZW50LnVzZVN5bmNFeHRlcm5hbFN0b3JlKGEsYixlKX07XG5leHBvcnRzLnVzZVRyYW5zaXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gVS5jdXJyZW50LnVzZVRyYW5zaXRpb24oKX07ZXhwb3J0cy52ZXJzaW9uPVwiMTguMi4wXCI7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///2408\n')},7294:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\nif (true) {\n module.exports = __webpack_require__(2408);\n} else {}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzI5NC5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixJQUFJLElBQXFDO0FBQ3pDLEVBQUUsMENBQXlEO0FBQzNELEVBQUUsS0FBSyxFQUVOIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL3JlYWN0L2luZGV4LmpzP2FiNWIiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LnByb2R1Y3Rpb24ubWluLmpzJyk7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LmRldmVsb3BtZW50LmpzJyk7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///7294\n")},5893:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\nif (true) {\n module.exports = __webpack_require__(5251);\n} else {}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTg5My5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixJQUFJLElBQXFDO0FBQ3pDLEVBQUUsMENBQXFFO0FBQ3ZFLEVBQUUsS0FBSyxFQUVOIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL3JlYWN0L2pzeC1ydW50aW1lLmpzPzljYTUiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LWpzeC1ydW50aW1lLnByb2R1Y3Rpb24ubWluLmpzJyk7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LWpzeC1ydW50aW1lLmRldmVsb3BtZW50LmpzJyk7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///5893\n")},53:(__unused_webpack_module,exports)=>{"use strict";eval('/**\n * @license React\n * scheduler.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nfunction f(a,b){var c=a.length;a.push(b);a:for(;0<c;){var d=c-1>>>1,e=a[d];if(0<g(e,b))a[d]=b,a[c]=e,c=d;else break a}}function h(a){return 0===a.length?null:a[0]}function k(a){if(0===a.length)return null;var b=a[0],c=a.pop();if(c!==b){a[0]=c;a:for(var d=0,e=a.length,w=e>>>1;d<w;){var m=2*(d+1)-1,C=a[m],n=m+1,x=a[n];if(0>g(C,c))n<e&&0>g(x,C)?(a[d]=x,a[n]=c,d=n):(a[d]=C,a[m]=c,d=m);else if(n<e&&0>g(x,c))a[d]=x,a[n]=c,d=n;else break a}}return b}\nfunction g(a,b){var c=a.sortIndex-b.sortIndex;return 0!==c?c:a.id-b.id}if("object"===typeof performance&&"function"===typeof performance.now){var l=performance;exports.unstable_now=function(){return l.now()}}else{var p=Date,q=p.now();exports.unstable_now=function(){return p.now()-q}}var r=[],t=[],u=1,v=null,y=3,z=!1,A=!1,B=!1,D="function"===typeof setTimeout?setTimeout:null,E="function"===typeof clearTimeout?clearTimeout:null,F="undefined"!==typeof setImmediate?setImmediate:null;\n"undefined"!==typeof navigator&&void 0!==navigator.scheduling&&void 0!==navigator.scheduling.isInputPending&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function G(a){for(var b=h(t);null!==b;){if(null===b.callback)k(t);else if(b.startTime<=a)k(t),b.sortIndex=b.expirationTime,f(r,b);else break;b=h(t)}}function H(a){B=!1;G(a);if(!A)if(null!==h(r))A=!0,I(J);else{var b=h(t);null!==b&&K(H,b.startTime-a)}}\nfunction J(a,b){A=!1;B&&(B=!1,E(L),L=-1);z=!0;var c=y;try{G(b);for(v=h(r);null!==v&&(!(v.expirationTime>b)||a&&!M());){var d=v.callback;if("function"===typeof d){v.callback=null;y=v.priorityLevel;var e=d(v.expirationTime<=b);b=exports.unstable_now();"function"===typeof e?v.callback=e:v===h(r)&&k(r);G(b)}else k(r);v=h(r)}if(null!==v)var w=!0;else{var m=h(t);null!==m&&K(H,m.startTime-b);w=!1}return w}finally{v=null,y=c,z=!1}}var N=!1,O=null,L=-1,P=5,Q=-1;\nfunction M(){return exports.unstable_now()-Q<P?!1:!0}function R(){if(null!==O){var a=exports.unstable_now();Q=a;var b=!0;try{b=O(!0,a)}finally{b?S():(N=!1,O=null)}}else N=!1}var S;if("function"===typeof F)S=function(){F(R)};else if("undefined"!==typeof MessageChannel){var T=new MessageChannel,U=T.port2;T.port1.onmessage=R;S=function(){U.postMessage(null)}}else S=function(){D(R,0)};function I(a){O=a;N||(N=!0,S())}function K(a,b){L=D(function(){a(exports.unstable_now())},b)}\nexports.unstable_IdlePriority=5;exports.unstable_ImmediatePriority=1;exports.unstable_LowPriority=4;exports.unstable_NormalPriority=3;exports.unstable_Profiling=null;exports.unstable_UserBlockingPriority=2;exports.unstable_cancelCallback=function(a){a.callback=null};exports.unstable_continueExecution=function(){A||z||(A=!0,I(J))};\nexports.unstable_forceFrameRate=function(a){0>a||125<a?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):P=0<a?Math.floor(1E3/a):5};exports.unstable_getCurrentPriorityLevel=function(){return y};exports.unstable_getFirstCallbackNode=function(){return h(r)};exports.unstable_next=function(a){switch(y){case 1:case 2:case 3:var b=3;break;default:b=y}var c=y;y=b;try{return a()}finally{y=c}};exports.unstable_pauseExecution=function(){};\nexports.unstable_requestPaint=function(){};exports.unstable_runWithPriority=function(a,b){switch(a){case 1:case 2:case 3:case 4:case 5:break;default:a=3}var c=y;y=a;try{return b()}finally{y=c}};\nexports.unstable_scheduleCallback=function(a,b,c){var d=exports.unstable_now();"object"===typeof c&&null!==c?(c=c.delay,c="number"===typeof c&&0<c?d+c:d):c=d;switch(a){case 1:var e=-1;break;case 2:e=250;break;case 5:e=1073741823;break;case 4:e=1E4;break;default:e=5E3}e=c+e;a={id:u++,callback:b,priorityLevel:a,startTime:c,expirationTime:e,sortIndex:-1};c>d?(a.sortIndex=c,f(t,a),null===h(r)&&a===h(t)&&(B?(E(L),L=-1):B=!0,K(H,c-d))):(a.sortIndex=e,f(r,a),A||z||(A=!0,I(J)));return a};\nexports.unstable_shouldYield=M;exports.unstable_wrapCallback=function(a){var b=y;return function(){var c=y;y=b;try{return a.apply(this,arguments)}finally{y=c}}};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTMuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ2EsZ0JBQWdCLGVBQWUsVUFBVSxPQUFPLElBQUksRUFBRSxxQkFBcUIsOEJBQThCLGNBQWMsY0FBYyw4QkFBOEIsY0FBYyw0QkFBNEIscUJBQXFCLFVBQVUsT0FBTyxpQ0FBaUMsSUFBSSxFQUFFLG9DQUFvQyxrRUFBa0Usd0NBQXdDLGNBQWM7QUFDbmMsZ0JBQWdCLDhCQUE4Qix5QkFBeUIsdUVBQXVFLGtCQUFrQixvQkFBb0IsWUFBWSxnQkFBZ0IsS0FBSyxxQkFBcUIsb0JBQW9CLFlBQVksa0JBQWtCO0FBQzVSLDRLQUE0SyxjQUFjLGVBQWUsU0FBUyxFQUFFLDBCQUEwQixnRUFBZ0UsV0FBVyxRQUFRLGNBQWMsS0FBSyxLQUFLLCtCQUErQixLQUFLLFdBQVc7QUFDeFksZ0JBQWdCLEtBQUssb0JBQW9CLEtBQUssUUFBUSxJQUFJLEtBQUssV0FBVywyQ0FBMkMsRUFBRSxpQkFBaUIsMEJBQTBCLGdCQUFnQixrQkFBa0IsNkJBQTZCLHlCQUF5QixrREFBa0QsS0FBSyxVQUFVLE9BQU8scUJBQXFCLEtBQUssV0FBVyw2QkFBNkIsS0FBSyxTQUFTLFFBQVEsaUJBQWlCO0FBQzNhLGFBQWEsd0NBQXdDLGFBQWEsYUFBYSw2QkFBNkIsSUFBSSxTQUFTLElBQUksVUFBVSxRQUFRLHFCQUFxQixVQUFVLE1BQU0sc0NBQXNDLE1BQU0sNkNBQTZDLG1DQUFtQyxvQkFBb0IsYUFBYSxxQkFBcUIsa0JBQWtCLFFBQVEsY0FBYyxJQUFJLGNBQWMsZ0JBQWdCLGVBQWUsMEJBQTBCO0FBQ3pkLDZCQUE2QixHQUFHLGtDQUFrQyxHQUFHLDRCQUE0QixHQUFHLCtCQUErQixHQUFHLDBCQUEwQixNQUFNLHFDQUFxQyxHQUFHLCtCQUErQixhQUFhLGlCQUFpQixrQ0FBa0MsWUFBWTtBQUN6VCwrQkFBK0IsYUFBYSx1S0FBdUssd0NBQXdDLFlBQVksVUFBVSxxQ0FBcUMsWUFBWSxhQUFhLHFCQUFxQixhQUFhLFVBQVUsNkJBQTZCLE1BQU0sWUFBWSxRQUFRLElBQUksSUFBSSxXQUFXLFFBQVEsTUFBTSwrQkFBK0I7QUFDbGYsNkJBQTZCLGNBQWMsZ0NBQWdDLGVBQWUsVUFBVSx5Q0FBeUMsWUFBWSxRQUFRLElBQUksSUFBSSxXQUFXLFFBQVE7QUFDNUwsaUNBQWlDLGlCQUFpQiw2QkFBNkIsK0VBQStFLFVBQVUsZ0JBQWdCLE1BQU0sYUFBYSxNQUFNLG9CQUFvQixNQUFNLGFBQWEsTUFBTSxjQUFjLE1BQU0sR0FBRyw2RUFBNkUseUhBQXlIO0FBQzNkLDRCQUE0QixHQUFHLDZCQUE2QixhQUFhLFFBQVEsa0JBQWtCLFFBQVEsSUFBSSxJQUFJLCtCQUErQixRQUFRIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL3NjaGVkdWxlci9janMvc2NoZWR1bGVyLnByb2R1Y3Rpb24ubWluLmpzP2ZiMDciXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZSBSZWFjdFxuICogc2NoZWR1bGVyLnByb2R1Y3Rpb24ubWluLmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cbid1c2Ugc3RyaWN0JztmdW5jdGlvbiBmKGEsYil7dmFyIGM9YS5sZW5ndGg7YS5wdXNoKGIpO2E6Zm9yKDswPGM7KXt2YXIgZD1jLTE+Pj4xLGU9YVtkXTtpZigwPGcoZSxiKSlhW2RdPWIsYVtjXT1lLGM9ZDtlbHNlIGJyZWFrIGF9fWZ1bmN0aW9uIGgoYSl7cmV0dXJuIDA9PT1hLmxlbmd0aD9udWxsOmFbMF19ZnVuY3Rpb24gayhhKXtpZigwPT09YS5sZW5ndGgpcmV0dXJuIG51bGw7dmFyIGI9YVswXSxjPWEucG9wKCk7aWYoYyE9PWIpe2FbMF09YzthOmZvcih2YXIgZD0wLGU9YS5sZW5ndGgsdz1lPj4+MTtkPHc7KXt2YXIgbT0yKihkKzEpLTEsQz1hW21dLG49bSsxLHg9YVtuXTtpZigwPmcoQyxjKSluPGUmJjA+Zyh4LEMpPyhhW2RdPXgsYVtuXT1jLGQ9bik6KGFbZF09QyxhW21dPWMsZD1tKTtlbHNlIGlmKG48ZSYmMD5nKHgsYykpYVtkXT14LGFbbl09YyxkPW47ZWxzZSBicmVhayBhfX1yZXR1cm4gYn1cbmZ1bmN0aW9uIGcoYSxiKXt2YXIgYz1hLnNvcnRJbmRleC1iLnNvcnRJbmRleDtyZXR1cm4gMCE9PWM/YzphLmlkLWIuaWR9aWYoXCJvYmplY3RcIj09PXR5cGVvZiBwZXJmb3JtYW5jZSYmXCJmdW5jdGlvblwiPT09dHlwZW9mIHBlcmZvcm1hbmNlLm5vdyl7dmFyIGw9cGVyZm9ybWFuY2U7ZXhwb3J0cy51bnN0YWJsZV9ub3c9ZnVuY3Rpb24oKXtyZXR1cm4gbC5ub3coKX19ZWxzZXt2YXIgcD1EYXRlLHE9cC5ub3coKTtleHBvcnRzLnVuc3RhYmxlX25vdz1mdW5jdGlvbigpe3JldHVybiBwLm5vdygpLXF9fXZhciByPVtdLHQ9W10sdT0xLHY9bnVsbCx5PTMsej0hMSxBPSExLEI9ITEsRD1cImZ1bmN0aW9uXCI9PT10eXBlb2Ygc2V0VGltZW91dD9zZXRUaW1lb3V0Om51bGwsRT1cImZ1bmN0aW9uXCI9PT10eXBlb2YgY2xlYXJUaW1lb3V0P2NsZWFyVGltZW91dDpudWxsLEY9XCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBzZXRJbW1lZGlhdGU/c2V0SW1tZWRpYXRlOm51bGw7XG5cInVuZGVmaW5lZFwiIT09dHlwZW9mIG5hdmlnYXRvciYmdm9pZCAwIT09bmF2aWdhdG9yLnNjaGVkdWxpbmcmJnZvaWQgMCE9PW5hdmlnYXRvci5zY2hlZHVsaW5nLmlzSW5wdXRQZW5kaW5nJiZuYXZpZ2F0b3Iuc2NoZWR1bGluZy5pc0lucHV0UGVuZGluZy5iaW5kKG5hdmlnYXRvci5zY2hlZHVsaW5nKTtmdW5jdGlvbiBHKGEpe2Zvcih2YXIgYj1oKHQpO251bGwhPT1iOyl7aWYobnVsbD09PWIuY2FsbGJhY2spayh0KTtlbHNlIGlmKGIuc3RhcnRUaW1lPD1hKWsodCksYi5zb3J0SW5kZXg9Yi5leHBpcmF0aW9uVGltZSxmKHIsYik7ZWxzZSBicmVhaztiPWgodCl9fWZ1bmN0aW9uIEgoYSl7Qj0hMTtHKGEpO2lmKCFBKWlmKG51bGwhPT1oKHIpKUE9ITAsSShKKTtlbHNle3ZhciBiPWgodCk7bnVsbCE9PWImJksoSCxiLnN0YXJ0VGltZS1hKX19XG5mdW5jdGlvbiBKKGEsYil7QT0hMTtCJiYoQj0hMSxFKEwpLEw9LTEpO3o9ITA7dmFyIGM9eTt0cnl7RyhiKTtmb3Iodj1oKHIpO251bGwhPT12JiYoISh2LmV4cGlyYXRpb25UaW1lPmIpfHxhJiYhTSgpKTspe3ZhciBkPXYuY2FsbGJhY2s7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGQpe3YuY2FsbGJhY2s9bnVsbDt5PXYucHJpb3JpdHlMZXZlbDt2YXIgZT1kKHYuZXhwaXJhdGlvblRpbWU8PWIpO2I9ZXhwb3J0cy51bnN0YWJsZV9ub3coKTtcImZ1bmN0aW9uXCI9PT10eXBlb2YgZT92LmNhbGxiYWNrPWU6dj09PWgocikmJmsocik7RyhiKX1lbHNlIGsocik7dj1oKHIpfWlmKG51bGwhPT12KXZhciB3PSEwO2Vsc2V7dmFyIG09aCh0KTtudWxsIT09bSYmSyhILG0uc3RhcnRUaW1lLWIpO3c9ITF9cmV0dXJuIHd9ZmluYWxseXt2PW51bGwseT1jLHo9ITF9fXZhciBOPSExLE89bnVsbCxMPS0xLFA9NSxRPS0xO1xuZnVuY3Rpb24gTSgpe3JldHVybiBleHBvcnRzLnVuc3RhYmxlX25vdygpLVE8UD8hMTohMH1mdW5jdGlvbiBSKCl7aWYobnVsbCE9PU8pe3ZhciBhPWV4cG9ydHMudW5zdGFibGVfbm93KCk7UT1hO3ZhciBiPSEwO3RyeXtiPU8oITAsYSl9ZmluYWxseXtiP1MoKTooTj0hMSxPPW51bGwpfX1lbHNlIE49ITF9dmFyIFM7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIEYpUz1mdW5jdGlvbigpe0YoUil9O2Vsc2UgaWYoXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBNZXNzYWdlQ2hhbm5lbCl7dmFyIFQ9bmV3IE1lc3NhZ2VDaGFubmVsLFU9VC5wb3J0MjtULnBvcnQxLm9ubWVzc2FnZT1SO1M9ZnVuY3Rpb24oKXtVLnBvc3RNZXNzYWdlKG51bGwpfX1lbHNlIFM9ZnVuY3Rpb24oKXtEKFIsMCl9O2Z1bmN0aW9uIEkoYSl7Tz1hO058fChOPSEwLFMoKSl9ZnVuY3Rpb24gSyhhLGIpe0w9RChmdW5jdGlvbigpe2EoZXhwb3J0cy51bnN0YWJsZV9ub3coKSl9LGIpfVxuZXhwb3J0cy51bnN0YWJsZV9JZGxlUHJpb3JpdHk9NTtleHBvcnRzLnVuc3RhYmxlX0ltbWVkaWF0ZVByaW9yaXR5PTE7ZXhwb3J0cy51bnN0YWJsZV9Mb3dQcmlvcml0eT00O2V4cG9ydHMudW5zdGFibGVfTm9ybWFsUHJpb3JpdHk9MztleHBvcnRzLnVuc3RhYmxlX1Byb2ZpbGluZz1udWxsO2V4cG9ydHMudW5zdGFibGVfVXNlckJsb2NraW5nUHJpb3JpdHk9MjtleHBvcnRzLnVuc3RhYmxlX2NhbmNlbENhbGxiYWNrPWZ1bmN0aW9uKGEpe2EuY2FsbGJhY2s9bnVsbH07ZXhwb3J0cy51bnN0YWJsZV9jb250aW51ZUV4ZWN1dGlvbj1mdW5jdGlvbigpe0F8fHp8fChBPSEwLEkoSikpfTtcbmV4cG9ydHMudW5zdGFibGVfZm9yY2VGcmFtZVJhdGU9ZnVuY3Rpb24oYSl7MD5hfHwxMjU8YT9jb25zb2xlLmVycm9yKFwiZm9yY2VGcmFtZVJhdGUgdGFrZXMgYSBwb3NpdGl2ZSBpbnQgYmV0d2VlbiAwIGFuZCAxMjUsIGZvcmNpbmcgZnJhbWUgcmF0ZXMgaGlnaGVyIHRoYW4gMTI1IGZwcyBpcyBub3Qgc3VwcG9ydGVkXCIpOlA9MDxhP01hdGguZmxvb3IoMUUzL2EpOjV9O2V4cG9ydHMudW5zdGFibGVfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWw9ZnVuY3Rpb24oKXtyZXR1cm4geX07ZXhwb3J0cy51bnN0YWJsZV9nZXRGaXJzdENhbGxiYWNrTm9kZT1mdW5jdGlvbigpe3JldHVybiBoKHIpfTtleHBvcnRzLnVuc3RhYmxlX25leHQ9ZnVuY3Rpb24oYSl7c3dpdGNoKHkpe2Nhc2UgMTpjYXNlIDI6Y2FzZSAzOnZhciBiPTM7YnJlYWs7ZGVmYXVsdDpiPXl9dmFyIGM9eTt5PWI7dHJ5e3JldHVybiBhKCl9ZmluYWxseXt5PWN9fTtleHBvcnRzLnVuc3RhYmxlX3BhdXNlRXhlY3V0aW9uPWZ1bmN0aW9uKCl7fTtcbmV4cG9ydHMudW5zdGFibGVfcmVxdWVzdFBhaW50PWZ1bmN0aW9uKCl7fTtleHBvcnRzLnVuc3RhYmxlX3J1bldpdGhQcmlvcml0eT1mdW5jdGlvbihhLGIpe3N3aXRjaChhKXtjYXNlIDE6Y2FzZSAyOmNhc2UgMzpjYXNlIDQ6Y2FzZSA1OmJyZWFrO2RlZmF1bHQ6YT0zfXZhciBjPXk7eT1hO3RyeXtyZXR1cm4gYigpfWZpbmFsbHl7eT1jfX07XG5leHBvcnRzLnVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2s9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWV4cG9ydHMudW5zdGFibGVfbm93KCk7XCJvYmplY3RcIj09PXR5cGVvZiBjJiZudWxsIT09Yz8oYz1jLmRlbGF5LGM9XCJudW1iZXJcIj09PXR5cGVvZiBjJiYwPGM/ZCtjOmQpOmM9ZDtzd2l0Y2goYSl7Y2FzZSAxOnZhciBlPS0xO2JyZWFrO2Nhc2UgMjplPTI1MDticmVhaztjYXNlIDU6ZT0xMDczNzQxODIzO2JyZWFrO2Nhc2UgNDplPTFFNDticmVhaztkZWZhdWx0OmU9NUUzfWU9YytlO2E9e2lkOnUrKyxjYWxsYmFjazpiLHByaW9yaXR5TGV2ZWw6YSxzdGFydFRpbWU6YyxleHBpcmF0aW9uVGltZTplLHNvcnRJbmRleDotMX07Yz5kPyhhLnNvcnRJbmRleD1jLGYodCxhKSxudWxsPT09aChyKSYmYT09PWgodCkmJihCPyhFKEwpLEw9LTEpOkI9ITAsSyhILGMtZCkpKTooYS5zb3J0SW5kZXg9ZSxmKHIsYSksQXx8enx8KEE9ITAsSShKKSkpO3JldHVybiBhfTtcbmV4cG9ydHMudW5zdGFibGVfc2hvdWxkWWllbGQ9TTtleHBvcnRzLnVuc3RhYmxlX3dyYXBDYWxsYmFjaz1mdW5jdGlvbihhKXt2YXIgYj15O3JldHVybiBmdW5jdGlvbigpe3ZhciBjPXk7eT1iO3RyeXtyZXR1cm4gYS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZmluYWxseXt5PWN9fX07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///53\n')},3840:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\nif (true) {\n module.exports = __webpack_require__(53);\n} else {}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzg0MC5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixJQUFJLElBQXFDO0FBQ3pDLEVBQUUsd0NBQTZEO0FBQy9ELEVBQUUsS0FBSyxFQUVOIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL3NjaGVkdWxlci9pbmRleC5qcz80MDI5Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9zY2hlZHVsZXIucHJvZHVjdGlvbi5taW4uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvc2NoZWR1bGVyLmRldmVsb3BtZW50LmpzJyk7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///3840\n")},3379:module=>{"use strict";eval('\n\nvar stylesInDOM = [];\nfunction getIndexByIdentifier(identifier) {\n var result = -1;\n for (var i = 0; i < stylesInDOM.length; i++) {\n if (stylesInDOM[i].identifier === identifier) {\n result = i;\n break;\n }\n }\n return result;\n}\nfunction modulesToDom(list, options) {\n var idCountMap = {};\n var identifiers = [];\n for (var i = 0; i < list.length; i++) {\n var item = list[i];\n var id = options.base ? item[0] + options.base : item[0];\n var count = idCountMap[id] || 0;\n var identifier = "".concat(id, " ").concat(count);\n idCountMap[id] = count + 1;\n var indexByIdentifier = getIndexByIdentifier(identifier);\n var obj = {\n css: item[1],\n media: item[2],\n sourceMap: item[3],\n supports: item[4],\n layer: item[5]\n };\n if (indexByIdentifier !== -1) {\n stylesInDOM[indexByIdentifier].references++;\n stylesInDOM[indexByIdentifier].updater(obj);\n } else {\n var updater = addElementStyle(obj, options);\n options.byIndex = i;\n stylesInDOM.splice(i, 0, {\n identifier: identifier,\n updater: updater,\n references: 1\n });\n }\n identifiers.push(identifier);\n }\n return identifiers;\n}\nfunction addElementStyle(obj, options) {\n var api = options.domAPI(options);\n api.update(obj);\n var updater = function updater(newObj) {\n if (newObj) {\n if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap && newObj.supports === obj.supports && newObj.layer === obj.layer) {\n return;\n }\n api.update(obj = newObj);\n } else {\n api.remove();\n }\n };\n return updater;\n}\nmodule.exports = function (list, options) {\n options = options || {};\n list = list || [];\n var lastIdentifiers = modulesToDom(list, options);\n return function update(newList) {\n newList = newList || [];\n for (var i = 0; i < lastIdentifiers.length; i++) {\n var identifier = lastIdentifiers[i];\n var index = getIndexByIdentifier(identifier);\n stylesInDOM[index].references--;\n }\n var newLastIdentifiers = modulesToDom(newList, options);\n for (var _i = 0; _i < lastIdentifiers.length; _i++) {\n var _identifier = lastIdentifiers[_i];\n var _index = getIndexByIdentifier(_identifier);\n if (stylesInDOM[_index].references === 0) {\n stylesInDOM[_index].updater();\n stylesInDOM.splice(_index, 1);\n }\n }\n lastIdentifiers = newLastIdentifiers;\n };\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzM3OS5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQSxrQkFBa0Isd0JBQXdCO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGlCQUFpQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLDRCQUE0QjtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLDZCQUE2QjtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qcz8yZGJhIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG52YXIgc3R5bGVzSW5ET00gPSBbXTtcbmZ1bmN0aW9uIGdldEluZGV4QnlJZGVudGlmaWVyKGlkZW50aWZpZXIpIHtcbiAgdmFyIHJlc3VsdCA9IC0xO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0eWxlc0luRE9NLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHN0eWxlc0luRE9NW2ldLmlkZW50aWZpZXIgPT09IGlkZW50aWZpZXIpIHtcbiAgICAgIHJlc3VsdCA9IGk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIG1vZHVsZXNUb0RvbShsaXN0LCBvcHRpb25zKSB7XG4gIHZhciBpZENvdW50TWFwID0ge307XG4gIHZhciBpZGVudGlmaWVycyA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgaXRlbSA9IGxpc3RbaV07XG4gICAgdmFyIGlkID0gb3B0aW9ucy5iYXNlID8gaXRlbVswXSArIG9wdGlvbnMuYmFzZSA6IGl0ZW1bMF07XG4gICAgdmFyIGNvdW50ID0gaWRDb3VudE1hcFtpZF0gfHwgMDtcbiAgICB2YXIgaWRlbnRpZmllciA9IFwiXCIuY29uY2F0KGlkLCBcIiBcIikuY29uY2F0KGNvdW50KTtcbiAgICBpZENvdW50TWFwW2lkXSA9IGNvdW50ICsgMTtcbiAgICB2YXIgaW5kZXhCeUlkZW50aWZpZXIgPSBnZXRJbmRleEJ5SWRlbnRpZmllcihpZGVudGlmaWVyKTtcbiAgICB2YXIgb2JqID0ge1xuICAgICAgY3NzOiBpdGVtWzFdLFxuICAgICAgbWVkaWE6IGl0ZW1bMl0sXG4gICAgICBzb3VyY2VNYXA6IGl0ZW1bM10sXG4gICAgICBzdXBwb3J0czogaXRlbVs0XSxcbiAgICAgIGxheWVyOiBpdGVtWzVdXG4gICAgfTtcbiAgICBpZiAoaW5kZXhCeUlkZW50aWZpZXIgIT09IC0xKSB7XG4gICAgICBzdHlsZXNJbkRPTVtpbmRleEJ5SWRlbnRpZmllcl0ucmVmZXJlbmNlcysrO1xuICAgICAgc3R5bGVzSW5ET01baW5kZXhCeUlkZW50aWZpZXJdLnVwZGF0ZXIob2JqKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHVwZGF0ZXIgPSBhZGRFbGVtZW50U3R5bGUob2JqLCBvcHRpb25zKTtcbiAgICAgIG9wdGlvbnMuYnlJbmRleCA9IGk7XG4gICAgICBzdHlsZXNJbkRPTS5zcGxpY2UoaSwgMCwge1xuICAgICAgICBpZGVudGlmaWVyOiBpZGVudGlmaWVyLFxuICAgICAgICB1cGRhdGVyOiB1cGRhdGVyLFxuICAgICAgICByZWZlcmVuY2VzOiAxXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWRlbnRpZmllcnMucHVzaChpZGVudGlmaWVyKTtcbiAgfVxuICByZXR1cm4gaWRlbnRpZmllcnM7XG59XG5mdW5jdGlvbiBhZGRFbGVtZW50U3R5bGUob2JqLCBvcHRpb25zKSB7XG4gIHZhciBhcGkgPSBvcHRpb25zLmRvbUFQSShvcHRpb25zKTtcbiAgYXBpLnVwZGF0ZShvYmopO1xuICB2YXIgdXBkYXRlciA9IGZ1bmN0aW9uIHVwZGF0ZXIobmV3T2JqKSB7XG4gICAgaWYgKG5ld09iaikge1xuICAgICAgaWYgKG5ld09iai5jc3MgPT09IG9iai5jc3MgJiYgbmV3T2JqLm1lZGlhID09PSBvYmoubWVkaWEgJiYgbmV3T2JqLnNvdXJjZU1hcCA9PT0gb2JqLnNvdXJjZU1hcCAmJiBuZXdPYmouc3VwcG9ydHMgPT09IG9iai5zdXBwb3J0cyAmJiBuZXdPYmoubGF5ZXIgPT09IG9iai5sYXllcikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBhcGkudXBkYXRlKG9iaiA9IG5ld09iaik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFwaS5yZW1vdmUoKTtcbiAgICB9XG4gIH07XG4gIHJldHVybiB1cGRhdGVyO1xufVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobGlzdCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgbGlzdCA9IGxpc3QgfHwgW107XG4gIHZhciBsYXN0SWRlbnRpZmllcnMgPSBtb2R1bGVzVG9Eb20obGlzdCwgb3B0aW9ucyk7XG4gIHJldHVybiBmdW5jdGlvbiB1cGRhdGUobmV3TGlzdCkge1xuICAgIG5ld0xpc3QgPSBuZXdMaXN0IHx8IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGFzdElkZW50aWZpZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaWRlbnRpZmllciA9IGxhc3RJZGVudGlmaWVyc1tpXTtcbiAgICAgIHZhciBpbmRleCA9IGdldEluZGV4QnlJZGVudGlmaWVyKGlkZW50aWZpZXIpO1xuICAgICAgc3R5bGVzSW5ET01baW5kZXhdLnJlZmVyZW5jZXMtLTtcbiAgICB9XG4gICAgdmFyIG5ld0xhc3RJZGVudGlmaWVycyA9IG1vZHVsZXNUb0RvbShuZXdMaXN0LCBvcHRpb25zKTtcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbGFzdElkZW50aWZpZXJzLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIF9pZGVudGlmaWVyID0gbGFzdElkZW50aWZpZXJzW19pXTtcbiAgICAgIHZhciBfaW5kZXggPSBnZXRJbmRleEJ5SWRlbnRpZmllcihfaWRlbnRpZmllcik7XG4gICAgICBpZiAoc3R5bGVzSW5ET01bX2luZGV4XS5yZWZlcmVuY2VzID09PSAwKSB7XG4gICAgICAgIHN0eWxlc0luRE9NW19pbmRleF0udXBkYXRlcigpO1xuICAgICAgICBzdHlsZXNJbkRPTS5zcGxpY2UoX2luZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbGFzdElkZW50aWZpZXJzID0gbmV3TGFzdElkZW50aWZpZXJzO1xuICB9O1xufTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///3379\n')},569:module=>{"use strict";eval('\n\nvar memo = {};\n\n/* istanbul ignore next */\nfunction getTarget(target) {\n if (typeof memo[target] === "undefined") {\n var styleTarget = document.querySelector(target);\n\n // Special case to return head of iframe instead of iframe itself\n if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) {\n try {\n // This will throw an exception if access to iframe is blocked\n // due to cross-origin restrictions\n styleTarget = styleTarget.contentDocument.head;\n } catch (e) {\n // istanbul ignore next\n styleTarget = null;\n }\n }\n memo[target] = styleTarget;\n }\n return memo[target];\n}\n\n/* istanbul ignore next */\nfunction insertBySelector(insert, style) {\n var target = getTarget(insert);\n if (!target) {\n throw new Error("Couldn\'t find a style target. This probably means that the value for the \'insert\' parameter is invalid.");\n }\n target.appendChild(style);\n}\nmodule.exports = insertBySelector;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTY5LmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanM/YjIxNCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxudmFyIG1lbW8gPSB7fTtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBnZXRUYXJnZXQodGFyZ2V0KSB7XG4gIGlmICh0eXBlb2YgbWVtb1t0YXJnZXRdID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgdmFyIHN0eWxlVGFyZ2V0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0YXJnZXQpO1xuXG4gICAgLy8gU3BlY2lhbCBjYXNlIHRvIHJldHVybiBoZWFkIG9mIGlmcmFtZSBpbnN0ZWFkIG9mIGlmcmFtZSBpdHNlbGZcbiAgICBpZiAod2luZG93LkhUTUxJRnJhbWVFbGVtZW50ICYmIHN0eWxlVGFyZ2V0IGluc3RhbmNlb2Ygd2luZG93LkhUTUxJRnJhbWVFbGVtZW50KSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBUaGlzIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGFjY2VzcyB0byBpZnJhbWUgaXMgYmxvY2tlZFxuICAgICAgICAvLyBkdWUgdG8gY3Jvc3Mtb3JpZ2luIHJlc3RyaWN0aW9uc1xuICAgICAgICBzdHlsZVRhcmdldCA9IHN0eWxlVGFyZ2V0LmNvbnRlbnREb2N1bWVudC5oZWFkO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBpc3RhbmJ1bCBpZ25vcmUgbmV4dFxuICAgICAgICBzdHlsZVRhcmdldCA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIG1lbW9bdGFyZ2V0XSA9IHN0eWxlVGFyZ2V0O1xuICB9XG4gIHJldHVybiBtZW1vW3RhcmdldF07XG59XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gaW5zZXJ0QnlTZWxlY3RvcihpbnNlcnQsIHN0eWxlKSB7XG4gIHZhciB0YXJnZXQgPSBnZXRUYXJnZXQoaW5zZXJ0KTtcbiAgaWYgKCF0YXJnZXQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZG4ndCBmaW5kIGEgc3R5bGUgdGFyZ2V0LiBUaGlzIHByb2JhYmx5IG1lYW5zIHRoYXQgdGhlIHZhbHVlIGZvciB0aGUgJ2luc2VydCcgcGFyYW1ldGVyIGlzIGludmFsaWQuXCIpO1xuICB9XG4gIHRhcmdldC5hcHBlbmRDaGlsZChzdHlsZSk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGluc2VydEJ5U2VsZWN0b3I7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///569\n')},9216:module=>{"use strict";eval('\n\n/* istanbul ignore next */\nfunction insertStyleElement(options) {\n var element = document.createElement("style");\n options.setAttributes(element, options.attributes);\n options.insert(element, options.options);\n return element;\n}\nmodule.exports = insertStyleElement;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTIxNi5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzP2RlNmMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gaW5zZXJ0U3R5bGVFbGVtZW50KG9wdGlvbnMpIHtcbiAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3R5bGVcIik7XG4gIG9wdGlvbnMuc2V0QXR0cmlidXRlcyhlbGVtZW50LCBvcHRpb25zLmF0dHJpYnV0ZXMpO1xuICBvcHRpb25zLmluc2VydChlbGVtZW50LCBvcHRpb25zLm9wdGlvbnMpO1xuICByZXR1cm4gZWxlbWVudDtcbn1cbm1vZHVsZS5leHBvcnRzID0gaW5zZXJ0U3R5bGVFbGVtZW50OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///9216\n')},3565:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval('\n\n/* istanbul ignore next */\nfunction setAttributesWithoutAttributes(styleElement) {\n var nonce = true ? __webpack_require__.nc : 0;\n if (nonce) {\n styleElement.setAttribute("nonce", nonce);\n }\n}\nmodule.exports = setAttributesWithoutAttributes;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzU2NS5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBO0FBQ0EsY0FBYyxLQUF3QyxHQUFHLHNCQUFpQixHQUFHLENBQUk7QUFDakY7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qcz9kZGNlIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIHNldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcyhzdHlsZUVsZW1lbnQpIHtcbiAgdmFyIG5vbmNlID0gdHlwZW9mIF9fd2VicGFja19ub25jZV9fICE9PSBcInVuZGVmaW5lZFwiID8gX193ZWJwYWNrX25vbmNlX18gOiBudWxsO1xuICBpZiAobm9uY2UpIHtcbiAgICBzdHlsZUVsZW1lbnQuc2V0QXR0cmlidXRlKFwibm9uY2VcIiwgbm9uY2UpO1xuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IHNldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlczsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///3565\n')},7795:module=>{"use strict";eval('\n\n/* istanbul ignore next */\nfunction apply(styleElement, options, obj) {\n var css = "";\n if (obj.supports) {\n css += "@supports (".concat(obj.supports, ") {");\n }\n if (obj.media) {\n css += "@media ".concat(obj.media, " {");\n }\n var needLayer = typeof obj.layer !== "undefined";\n if (needLayer) {\n css += "@layer".concat(obj.layer.length > 0 ? " ".concat(obj.layer) : "", " {");\n }\n css += obj.css;\n if (needLayer) {\n css += "}";\n }\n if (obj.media) {\n css += "}";\n }\n if (obj.supports) {\n css += "}";\n }\n var sourceMap = obj.sourceMap;\n if (sourceMap && typeof btoa !== "undefined") {\n css += "\\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), " */");\n }\n\n // For old IE\n /* istanbul ignore if */\n options.styleTagTransform(css, styleElement, options.options);\n}\nfunction removeStyleElement(styleElement) {\n // istanbul ignore if\n if (styleElement.parentNode === null) {\n return false;\n }\n styleElement.parentNode.removeChild(styleElement);\n}\n\n/* istanbul ignore next */\nfunction domAPI(options) {\n if (typeof document === "undefined") {\n return {\n update: function update() {},\n remove: function remove() {}\n };\n }\n var styleElement = options.insertStyleElement(options);\n return {\n update: function update(obj) {\n apply(styleElement, options, obj);\n },\n remove: function remove() {\n removeStyleElement(styleElement);\n }\n };\n}\nmodule.exports = domAPI;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzc5NS5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRDtBQUNsRDtBQUNBO0FBQ0EsMENBQTBDO0FBQzFDO0FBQ0E7QUFDQTtBQUNBLGlGQUFpRjtBQUNqRjtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLHlEQUF5RDtBQUN6RDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzP2U0NzkiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gYXBwbHkoc3R5bGVFbGVtZW50LCBvcHRpb25zLCBvYmopIHtcbiAgdmFyIGNzcyA9IFwiXCI7XG4gIGlmIChvYmouc3VwcG9ydHMpIHtcbiAgICBjc3MgKz0gXCJAc3VwcG9ydHMgKFwiLmNvbmNhdChvYmouc3VwcG9ydHMsIFwiKSB7XCIpO1xuICB9XG4gIGlmIChvYmoubWVkaWEpIHtcbiAgICBjc3MgKz0gXCJAbWVkaWEgXCIuY29uY2F0KG9iai5tZWRpYSwgXCIge1wiKTtcbiAgfVxuICB2YXIgbmVlZExheWVyID0gdHlwZW9mIG9iai5sYXllciAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgaWYgKG5lZWRMYXllcikge1xuICAgIGNzcyArPSBcIkBsYXllclwiLmNvbmNhdChvYmoubGF5ZXIubGVuZ3RoID4gMCA/IFwiIFwiLmNvbmNhdChvYmoubGF5ZXIpIDogXCJcIiwgXCIge1wiKTtcbiAgfVxuICBjc3MgKz0gb2JqLmNzcztcbiAgaWYgKG5lZWRMYXllcikge1xuICAgIGNzcyArPSBcIn1cIjtcbiAgfVxuICBpZiAob2JqLm1lZGlhKSB7XG4gICAgY3NzICs9IFwifVwiO1xuICB9XG4gIGlmIChvYmouc3VwcG9ydHMpIHtcbiAgICBjc3MgKz0gXCJ9XCI7XG4gIH1cbiAgdmFyIHNvdXJjZU1hcCA9IG9iai5zb3VyY2VNYXA7XG4gIGlmIChzb3VyY2VNYXAgJiYgdHlwZW9mIGJ0b2EgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBjc3MgKz0gXCJcXG4vKiMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LFwiLmNvbmNhdChidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShzb3VyY2VNYXApKSkpLCBcIiAqL1wiKTtcbiAgfVxuXG4gIC8vIEZvciBvbGQgSUVcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICAqL1xuICBvcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtKGNzcywgc3R5bGVFbGVtZW50LCBvcHRpb25zLm9wdGlvbnMpO1xufVxuZnVuY3Rpb24gcmVtb3ZlU3R5bGVFbGVtZW50KHN0eWxlRWxlbWVudCkge1xuICAvLyBpc3RhbmJ1bCBpZ25vcmUgaWZcbiAgaWYgKHN0eWxlRWxlbWVudC5wYXJlbnROb2RlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHN0eWxlRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHN0eWxlRWxlbWVudCk7XG59XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gZG9tQVBJKG9wdGlvbnMpIHtcbiAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHJldHVybiB7XG4gICAgICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZSgpIHt9LFxuICAgICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7fVxuICAgIH07XG4gIH1cbiAgdmFyIHN0eWxlRWxlbWVudCA9IG9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50KG9wdGlvbnMpO1xuICByZXR1cm4ge1xuICAgIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlKG9iaikge1xuICAgICAgYXBwbHkoc3R5bGVFbGVtZW50LCBvcHRpb25zLCBvYmopO1xuICAgIH0sXG4gICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7XG4gICAgICByZW1vdmVTdHlsZUVsZW1lbnQoc3R5bGVFbGVtZW50KTtcbiAgICB9XG4gIH07XG59XG5tb2R1bGUuZXhwb3J0cyA9IGRvbUFQSTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///7795\n')},4589:module=>{"use strict";eval("\n\n/* istanbul ignore next */\nfunction styleTagTransform(css, styleElement) {\n if (styleElement.styleSheet) {\n styleElement.styleSheet.cssText = css;\n } else {\n while (styleElement.firstChild) {\n styleElement.removeChild(styleElement.firstChild);\n }\n styleElement.appendChild(document.createTextNode(css));\n }\n}\nmodule.exports = styleTagTransform;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDU4OS5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzPzFkZGUiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gc3R5bGVUYWdUcmFuc2Zvcm0oY3NzLCBzdHlsZUVsZW1lbnQpIHtcbiAgaWYgKHN0eWxlRWxlbWVudC5zdHlsZVNoZWV0KSB7XG4gICAgc3R5bGVFbGVtZW50LnN0eWxlU2hlZXQuY3NzVGV4dCA9IGNzcztcbiAgfSBlbHNlIHtcbiAgICB3aGlsZSAoc3R5bGVFbGVtZW50LmZpcnN0Q2hpbGQpIHtcbiAgICAgIHN0eWxlRWxlbWVudC5yZW1vdmVDaGlsZChzdHlsZUVsZW1lbnQuZmlyc3RDaGlsZCk7XG4gICAgfVxuICAgIHN0eWxlRWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjc3MpKTtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBzdHlsZVRhZ1RyYW5zZm9ybTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///4589\n")},2473:module=>{"use strict";eval("/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\n\n/**\n * Similar to invariant but only logs a warning if the condition is not met.\n * This can be used to log issues in development environments in critical\n * paths. Removing the logging code for production environments will keep the\n * same logic and follow the same code paths.\n */\n\nvar __DEV__ = \"production\" !== 'production';\n\nvar warning = function() {};\n\nif (__DEV__) {\n var printWarning = function printWarning(format, args) {\n var len = arguments.length;\n args = new Array(len > 1 ? len - 1 : 0);\n for (var key = 1; key < len; key++) {\n args[key - 1] = arguments[key];\n }\n var argIndex = 0;\n var message = 'Warning: ' +\n format.replace(/%s/g, function() {\n return args[argIndex++];\n });\n if (typeof console !== 'undefined') {\n console.error(message);\n }\n try {\n // --- Welcome to debugging React ---\n // This error was thrown as a convenience so that you can use this stack\n // to find the callsite that caused this warning to fire.\n throw new Error(message);\n } catch (x) {}\n }\n\n warning = function(condition, format, args) {\n var len = arguments.length;\n args = new Array(len > 2 ? len - 2 : 0);\n for (var key = 2; key < len; key++) {\n args[key - 2] = arguments[key];\n }\n if (format === undefined) {\n throw new Error(\n '`warning(condition, format, ...args)` requires a warning ' +\n 'message argument'\n );\n }\n if (!condition) {\n printWarning.apply(null, [format].concat(args));\n }\n };\n}\n\nmodule.exports = warning;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQ3My5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGNBQWMsWUFBb0I7O0FBRWxDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFdBQVc7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047O0FBRUE7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFdBQVc7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi9ub2RlX21vZHVsZXMvd2FybmluZy93YXJuaW5nLmpzP2Q5NmUiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogU2ltaWxhciB0byBpbnZhcmlhbnQgYnV0IG9ubHkgbG9ncyBhIHdhcm5pbmcgaWYgdGhlIGNvbmRpdGlvbiBpcyBub3QgbWV0LlxuICogVGhpcyBjYW4gYmUgdXNlZCB0byBsb2cgaXNzdWVzIGluIGRldmVsb3BtZW50IGVudmlyb25tZW50cyBpbiBjcml0aWNhbFxuICogcGF0aHMuIFJlbW92aW5nIHRoZSBsb2dnaW5nIGNvZGUgZm9yIHByb2R1Y3Rpb24gZW52aXJvbm1lbnRzIHdpbGwga2VlcCB0aGVcbiAqIHNhbWUgbG9naWMgYW5kIGZvbGxvdyB0aGUgc2FtZSBjb2RlIHBhdGhzLlxuICovXG5cbnZhciBfX0RFVl9fID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJztcblxudmFyIHdhcm5pbmcgPSBmdW5jdGlvbigpIHt9O1xuXG5pZiAoX19ERVZfXykge1xuICB2YXIgcHJpbnRXYXJuaW5nID0gZnVuY3Rpb24gcHJpbnRXYXJuaW5nKGZvcm1hdCwgYXJncykge1xuICAgIHZhciBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIGFyZ3MgPSBuZXcgQXJyYXkobGVuID4gMSA/IGxlbiAtIDEgOiAwKTtcbiAgICBmb3IgKHZhciBrZXkgPSAxOyBrZXkgPCBsZW47IGtleSsrKSB7XG4gICAgICBhcmdzW2tleSAtIDFdID0gYXJndW1lbnRzW2tleV07XG4gICAgfVxuICAgIHZhciBhcmdJbmRleCA9IDA7XG4gICAgdmFyIG1lc3NhZ2UgPSAnV2FybmluZzogJyArXG4gICAgICBmb3JtYXQucmVwbGFjZSgvJXMvZywgZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBhcmdzW2FyZ0luZGV4KytdO1xuICAgICAgfSk7XG4gICAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgY29uc29sZS5lcnJvcihtZXNzYWdlKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIC8vIC0tLSBXZWxjb21lIHRvIGRlYnVnZ2luZyBSZWFjdCAtLS1cbiAgICAgIC8vIFRoaXMgZXJyb3Igd2FzIHRocm93biBhcyBhIGNvbnZlbmllbmNlIHNvIHRoYXQgeW91IGNhbiB1c2UgdGhpcyBzdGFja1xuICAgICAgLy8gdG8gZmluZCB0aGUgY2FsbHNpdGUgdGhhdCBjYXVzZWQgdGhpcyB3YXJuaW5nIHRvIGZpcmUuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgfSBjYXRjaCAoeCkge31cbiAgfVxuXG4gIHdhcm5pbmcgPSBmdW5jdGlvbihjb25kaXRpb24sIGZvcm1hdCwgYXJncykge1xuICAgIHZhciBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIGFyZ3MgPSBuZXcgQXJyYXkobGVuID4gMiA/IGxlbiAtIDIgOiAwKTtcbiAgICBmb3IgKHZhciBrZXkgPSAyOyBrZXkgPCBsZW47IGtleSsrKSB7XG4gICAgICBhcmdzW2tleSAtIDJdID0gYXJndW1lbnRzW2tleV07XG4gICAgfVxuICAgIGlmIChmb3JtYXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdgd2FybmluZyhjb25kaXRpb24sIGZvcm1hdCwgLi4uYXJncylgIHJlcXVpcmVzIGEgd2FybmluZyAnICtcbiAgICAgICAgICAnbWVzc2FnZSBhcmd1bWVudCdcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghY29uZGl0aW9uKSB7XG4gICAgICBwcmludFdhcm5pbmcuYXBwbHkobnVsbCwgW2Zvcm1hdF0uY29uY2F0KGFyZ3MpKTtcbiAgICB9XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gd2FybmluZztcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///2473\n")},7955:(__unused_webpack_module,exports)=>{"use strict";eval('\r\n/**\r\n * dd-base-impl.ts 7.3.0\r\n * Copyright (c) 2021-2022 Alain Dumesny - see GridStack root license\r\n */\r\nObject.defineProperty(exports, "__esModule", ({ value: true }));\r\nexports.DDBaseImplement = void 0;\r\nclass DDBaseImplement {\r\n constructor() {\r\n /** @internal */\r\n this._eventRegister = {};\r\n }\r\n /** returns the enable state, but you have to call enable()/disable() to change (as other things need to happen) */\r\n get disabled() { return this._disabled; }\r\n on(event, callback) {\r\n this._eventRegister[event] = callback;\r\n }\r\n off(event) {\r\n delete this._eventRegister[event];\r\n }\r\n enable() {\r\n this._disabled = false;\r\n }\r\n disable() {\r\n this._disabled = true;\r\n }\r\n destroy() {\r\n delete this._eventRegister;\r\n }\r\n triggerEvent(eventName, event) {\r\n if (!this.disabled && this._eventRegister && this._eventRegister[eventName])\r\n return this._eventRegister[eventName](event);\r\n }\r\n}\r\nexports.DDBaseImplement = DDBaseImplement;\r\n//# sourceMappingURL=dd-base-impl.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzk1NS5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QiIsInNvdXJjZXMiOlsid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZ3JpZHN0YWNrL2Rpc3QvZGQtYmFzZS1pbXBsLmpzP2Y2NTQiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XHJcbi8qKlxyXG4gKiBkZC1iYXNlLWltcGwudHMgNy4zLjBcclxuICogQ29weXJpZ2h0IChjKSAyMDIxLTIwMjIgQWxhaW4gRHVtZXNueSAtIHNlZSBHcmlkU3RhY2sgcm9vdCBsaWNlbnNlXHJcbiAqL1xyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XHJcbmV4cG9ydHMuRERCYXNlSW1wbGVtZW50ID0gdm9pZCAwO1xyXG5jbGFzcyBEREJhc2VJbXBsZW1lbnQge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHRoaXMuX2V2ZW50UmVnaXN0ZXIgPSB7fTtcclxuICAgIH1cclxuICAgIC8qKiByZXR1cm5zIHRoZSBlbmFibGUgc3RhdGUsIGJ1dCB5b3UgaGF2ZSB0byBjYWxsIGVuYWJsZSgpL2Rpc2FibGUoKSB0byBjaGFuZ2UgKGFzIG90aGVyIHRoaW5ncyBuZWVkIHRvIGhhcHBlbikgKi9cclxuICAgIGdldCBkaXNhYmxlZCgpIHsgcmV0dXJuIHRoaXMuX2Rpc2FibGVkOyB9XHJcbiAgICBvbihldmVudCwgY2FsbGJhY2spIHtcclxuICAgICAgICB0aGlzLl9ldmVudFJlZ2lzdGVyW2V2ZW50XSA9IGNhbGxiYWNrO1xyXG4gICAgfVxyXG4gICAgb2ZmKGV2ZW50KSB7XHJcbiAgICAgICAgZGVsZXRlIHRoaXMuX2V2ZW50UmVnaXN0ZXJbZXZlbnRdO1xyXG4gICAgfVxyXG4gICAgZW5hYmxlKCkge1xyXG4gICAgICAgIHRoaXMuX2Rpc2FibGVkID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBkaXNhYmxlKCkge1xyXG4gICAgICAgIHRoaXMuX2Rpc2FibGVkID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIGRlc3Ryb3koKSB7XHJcbiAgICAgICAgZGVsZXRlIHRoaXMuX2V2ZW50UmVnaXN0ZXI7XHJcbiAgICB9XHJcbiAgICB0cmlnZ2VyRXZlbnQoZXZlbnROYW1lLCBldmVudCkge1xyXG4gICAgICAgIGlmICghdGhpcy5kaXNhYmxlZCAmJiB0aGlzLl9ldmVudFJlZ2lzdGVyICYmIHRoaXMuX2V2ZW50UmVnaXN0ZXJbZXZlbnROYW1lXSlcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2V2ZW50UmVnaXN0ZXJbZXZlbnROYW1lXShldmVudCk7XHJcbiAgICB9XHJcbn1cclxuZXhwb3J0cy5EREJhc2VJbXBsZW1lbnQgPSBEREJhc2VJbXBsZW1lbnQ7XHJcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRkLWJhc2UtaW1wbC5qcy5tYXAiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///7955\n')},4736:(__unused_webpack_module,exports,__webpack_require__)=>{"use strict";eval("\r\n/**\r\n * dd-draggable.ts 7.3.0\r\n * Copyright (c) 2021-2022 Alain Dumesny - see GridStack root license\r\n */\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.DDDraggable = void 0;\r\nconst dd_manager_1 = __webpack_require__(7655);\r\nconst utils_1 = __webpack_require__(6480);\r\nconst dd_base_impl_1 = __webpack_require__(7955);\r\nconst dd_touch_1 = __webpack_require__(4770);\r\n// let count = 0; // TEST\r\nclass DDDraggable extends dd_base_impl_1.DDBaseImplement {\r\n constructor(el, option = {}) {\r\n super();\r\n this.el = el;\r\n this.option = option;\r\n // get the element that is actually supposed to be dragged by\r\n let handleName = option.handle.substring(1);\r\n this.dragEl = el.classList.contains(handleName) ? el : el.querySelector(option.handle) || el;\r\n // create var event binding so we can easily remove and still look like TS methods (unlike anonymous functions)\r\n this._mouseDown = this._mouseDown.bind(this);\r\n this._mouseMove = this._mouseMove.bind(this);\r\n this._mouseUp = this._mouseUp.bind(this);\r\n this.enable();\r\n }\r\n on(event, callback) {\r\n super.on(event, callback);\r\n }\r\n off(event) {\r\n super.off(event);\r\n }\r\n enable() {\r\n if (this.disabled === false)\r\n return;\r\n super.enable();\r\n this.dragEl.addEventListener('mousedown', this._mouseDown);\r\n if (dd_touch_1.isTouch) {\r\n this.dragEl.addEventListener('touchstart', dd_touch_1.touchstart);\r\n this.dragEl.addEventListener('pointerdown', dd_touch_1.pointerdown);\r\n // this.dragEl.style.touchAction = 'none'; // not needed unlike pointerdown doc comment\r\n }\r\n this.el.classList.remove('ui-draggable-disabled');\r\n this.el.classList.add('ui-draggable');\r\n }\r\n disable(forDestroy = false) {\r\n if (this.disabled === true)\r\n return;\r\n super.disable();\r\n this.dragEl.removeEventListener('mousedown', this._mouseDown);\r\n if (dd_touch_1.isTouch) {\r\n this.dragEl.removeEventListener('touchstart', dd_touch_1.touchstart);\r\n this.dragEl.removeEventListener('pointerdown', dd_touch_1.pointerdown);\r\n }\r\n this.el.classList.remove('ui-draggable');\r\n if (!forDestroy)\r\n this.el.classList.add('ui-draggable-disabled');\r\n }\r\n destroy() {\r\n if (this.dragTimeout)\r\n window.clearTimeout(this.dragTimeout);\r\n delete this.dragTimeout;\r\n if (this.dragging)\r\n this._mouseUp(this.mouseDownEvent);\r\n this.disable(true);\r\n delete this.el;\r\n delete this.helper;\r\n delete this.option;\r\n super.destroy();\r\n }\r\n updateOption(opts) {\r\n Object.keys(opts).forEach(key => this.option[key] = opts[key]);\r\n return this;\r\n }\r\n /** @internal call when mouse goes down before a dragstart happens */\r\n _mouseDown(e) {\r\n // don't let more than one widget handle mouseStart\r\n if (dd_manager_1.DDManager.mouseHandled)\r\n return;\r\n if (e.button !== 0)\r\n return true; // only left click\r\n // make sure we are not clicking on known object that handles mouseDown (TODO: make this extensible ?) #2054\r\n const skipMouseDown = ['input', 'textarea', 'button', 'select', 'option'];\r\n const name = e.target.nodeName.toLowerCase();\r\n if (skipMouseDown.find(skip => skip === name))\r\n return true;\r\n // also check for content editable\r\n if (e.target.closest('[contenteditable=\"true\"]'))\r\n return true;\r\n // REMOVE: why would we get the event if it wasn't for us or child ?\r\n // make sure we are clicking on a drag handle or child of it...\r\n // Note: we don't need to check that's handle is an immediate child, as mouseHandled will prevent parents from also handling it (lowest wins)\r\n // let className = this.option.handle.substring(1);\r\n // let el = e.target as HTMLElement;\r\n // while (el && !el.classList.contains(className)) { el = el.parentElement; }\r\n // if (!el) return;\r\n this.mouseDownEvent = e;\r\n delete this.dragging;\r\n delete dd_manager_1.DDManager.dragElement;\r\n delete dd_manager_1.DDManager.dropElement;\r\n // document handler so we can continue receiving moves as the item is 'fixed' position, and capture=true so WE get a first crack\r\n document.addEventListener('mousemove', this._mouseMove, true); // true=capture, not bubble\r\n document.addEventListener('mouseup', this._mouseUp, true);\r\n if (dd_touch_1.isTouch) {\r\n this.dragEl.addEventListener('touchmove', dd_touch_1.touchmove);\r\n this.dragEl.addEventListener('touchend', dd_touch_1.touchend);\r\n }\r\n e.preventDefault();\r\n // preventDefault() prevents blur event which occurs just after mousedown event.\r\n // if an editable content has focus, then blur must be call\r\n if (document.activeElement)\r\n document.activeElement.blur();\r\n dd_manager_1.DDManager.mouseHandled = true;\r\n return true;\r\n }\r\n /** @internal method to call actual drag event */\r\n _callDrag(e) {\r\n if (!this.dragging)\r\n return;\r\n const ev = utils_1.Utils.initEvent(e, { target: this.el, type: 'drag' });\r\n if (this.option.drag) {\r\n this.option.drag(ev, this.ui());\r\n }\r\n this.triggerEvent('drag', ev);\r\n }\r\n /** @internal called when the main page (after successful mousedown) receives a move event to drag the item around the screen */\r\n _mouseMove(e) {\r\n var _a;\r\n // console.log(`${count++} move ${e.x},${e.y}`)\r\n let s = this.mouseDownEvent;\r\n if (this.dragging) {\r\n this._dragFollow(e);\r\n // delay actual grid handling drag until we pause for a while if set\r\n if (dd_manager_1.DDManager.pauseDrag) {\r\n const pause = Number.isInteger(dd_manager_1.DDManager.pauseDrag) ? dd_manager_1.DDManager.pauseDrag : 100;\r\n if (this.dragTimeout)\r\n window.clearTimeout(this.dragTimeout);\r\n this.dragTimeout = window.setTimeout(() => this._callDrag(e), pause);\r\n }\r\n else {\r\n this._callDrag(e);\r\n }\r\n }\r\n else if (Math.abs(e.x - s.x) + Math.abs(e.y - s.y) > 3) {\r\n /**\r\n * don't start unless we've moved at least 3 pixels\r\n */\r\n this.dragging = true;\r\n dd_manager_1.DDManager.dragElement = this;\r\n // if we're dragging an actual grid item, set the current drop as the grid (to detect enter/leave)\r\n let grid = (_a = this.el.gridstackNode) === null || _a === void 0 ? void 0 : _a.grid;\r\n if (grid) {\r\n dd_manager_1.DDManager.dropElement = grid.el.ddElement.ddDroppable;\r\n }\r\n else {\r\n delete dd_manager_1.DDManager.dropElement;\r\n }\r\n this.helper = this._createHelper(e);\r\n this._setupHelperContainmentStyle();\r\n this.dragOffset = this._getDragOffset(e, this.el, this.helperContainment);\r\n const ev = utils_1.Utils.initEvent(e, { target: this.el, type: 'dragstart' });\r\n this._setupHelperStyle(e);\r\n if (this.option.start) {\r\n this.option.start(ev, this.ui());\r\n }\r\n this.triggerEvent('dragstart', ev);\r\n }\r\n e.preventDefault(); // needed otherwise we get text sweep text selection as we drag around\r\n return true;\r\n }\r\n /** @internal call when the mouse gets released to drop the item at current location */\r\n _mouseUp(e) {\r\n var _a;\r\n document.removeEventListener('mousemove', this._mouseMove, true);\r\n document.removeEventListener('mouseup', this._mouseUp, true);\r\n if (dd_touch_1.isTouch) {\r\n this.dragEl.removeEventListener('touchmove', dd_touch_1.touchmove, true);\r\n this.dragEl.removeEventListener('touchend', dd_touch_1.touchend, true);\r\n }\r\n if (this.dragging) {\r\n delete this.dragging;\r\n // reset the drop target if dragging over ourself (already parented, just moving during stop callback below)\r\n if (((_a = dd_manager_1.DDManager.dropElement) === null || _a === void 0 ? void 0 : _a.el) === this.el.parentElement) {\r\n delete dd_manager_1.DDManager.dropElement;\r\n }\r\n this.helperContainment.style.position = this.parentOriginStylePosition || null;\r\n if (this.helper === this.el) {\r\n this._removeHelperStyle();\r\n }\r\n else {\r\n this.helper.remove();\r\n }\r\n const ev = utils_1.Utils.initEvent(e, { target: this.el, type: 'dragstop' });\r\n if (this.option.stop) {\r\n this.option.stop(ev); // NOTE: destroy() will be called when removing item, so expect NULL ptr after!\r\n }\r\n this.triggerEvent('dragstop', ev);\r\n // call the droppable method to receive the item\r\n if (dd_manager_1.DDManager.dropElement) {\r\n dd_manager_1.DDManager.dropElement.drop(e);\r\n }\r\n }\r\n delete this.helper;\r\n delete this.mouseDownEvent;\r\n delete dd_manager_1.DDManager.dragElement;\r\n delete dd_manager_1.DDManager.dropElement;\r\n delete dd_manager_1.DDManager.mouseHandled;\r\n e.preventDefault();\r\n }\r\n /** @internal create a clone copy (or user defined method) of the original drag item if set */\r\n _createHelper(event) {\r\n let helper = this.el;\r\n if (typeof this.option.helper === 'function') {\r\n helper = this.option.helper(event);\r\n }\r\n else if (this.option.helper === 'clone') {\r\n helper = utils_1.Utils.cloneNode(this.el);\r\n }\r\n if (!document.body.contains(helper)) {\r\n utils_1.Utils.appendTo(helper, this.option.appendTo === 'parent' ? this.el.parentNode : this.option.appendTo);\r\n }\r\n if (helper === this.el) {\r\n this.dragElementOriginStyle = DDDraggable.originStyleProp.map(prop => this.el.style[prop]);\r\n }\r\n return helper;\r\n }\r\n /** @internal set the fix position of the dragged item */\r\n _setupHelperStyle(e) {\r\n this.helper.classList.add('ui-draggable-dragging');\r\n // TODO: set all at once with style.cssText += ... ? https://stackoverflow.com/questions/3968593\r\n const style = this.helper.style;\r\n style.pointerEvents = 'none'; // needed for over items to get enter/leave\r\n // style.cursor = 'move'; // TODO: can't set with pointerEvents=none ! (done in CSS as well)\r\n style['min-width'] = 0; // since we no longer relative to our parent and we don't resize anyway (normally 100/#column %)\r\n style.width = this.dragOffset.width + 'px';\r\n style.height = this.dragOffset.height + 'px';\r\n style.willChange = 'left, top';\r\n style.position = 'fixed'; // let us drag between grids by not clipping as parent .grid-stack is position: 'relative'\r\n this._dragFollow(e); // now position it\r\n style.transition = 'none'; // show up instantly\r\n setTimeout(() => {\r\n if (this.helper) {\r\n style.transition = null; // recover animation\r\n }\r\n }, 0);\r\n return this;\r\n }\r\n /** @internal restore back the original style before dragging */\r\n _removeHelperStyle() {\r\n var _a;\r\n this.helper.classList.remove('ui-draggable-dragging');\r\n let node = (_a = this.helper) === null || _a === void 0 ? void 0 : _a.gridstackNode;\r\n // don't bother restoring styles if we're gonna remove anyway...\r\n if (!(node === null || node === void 0 ? void 0 : node._isAboutToRemove) && this.dragElementOriginStyle) {\r\n let helper = this.helper;\r\n // don't animate, otherwise we animate offseted when switching back to 'absolute' from 'fixed'.\r\n // TODO: this also removes resizing animation which doesn't have this issue, but others.\r\n // Ideally both would animate ('move' would immediately restore 'absolute' and adjust coordinate to match,\r\n // then trigger a delay (repaint) to restore to final dest with animate) but then we need to make sure 'resizestop'\r\n // is called AFTER 'transitionend' event is received (see https://github.com/gridstack/gridstack.js/issues/2033)\r\n let transition = this.dragElementOriginStyle['transition'] || null;\r\n helper.style.transition = this.dragElementOriginStyle['transition'] = 'none'; // can't be NULL #1973\r\n DDDraggable.originStyleProp.forEach(prop => helper.style[prop] = this.dragElementOriginStyle[prop] || null);\r\n setTimeout(() => helper.style.transition = transition, 50); // recover animation from saved vars after a pause (0 isn't enough #1973)\r\n }\r\n delete this.dragElementOriginStyle;\r\n return this;\r\n }\r\n /** @internal updates the top/left position to follow the mouse */\r\n _dragFollow(e) {\r\n let containmentRect = { left: 0, top: 0 };\r\n // if (this.helper.style.position === 'absolute') { // we use 'fixed'\r\n // const { left, top } = this.helperContainment.getBoundingClientRect();\r\n // containmentRect = { left, top };\r\n // }\r\n const style = this.helper.style;\r\n const offset = this.dragOffset;\r\n style.left = e.clientX + offset.offsetLeft - containmentRect.left + 'px';\r\n style.top = e.clientY + offset.offsetTop - containmentRect.top + 'px';\r\n }\r\n /** @internal */\r\n _setupHelperContainmentStyle() {\r\n this.helperContainment = this.helper.parentElement;\r\n if (this.helper.style.position !== 'fixed') {\r\n this.parentOriginStylePosition = this.helperContainment.style.position;\r\n if (window.getComputedStyle(this.helperContainment).position.match(/static/)) {\r\n this.helperContainment.style.position = 'relative';\r\n }\r\n }\r\n return this;\r\n }\r\n /** @internal */\r\n _getDragOffset(event, el, parent) {\r\n // in case ancestor has transform/perspective css properties that change the viewpoint\r\n let xformOffsetX = 0;\r\n let xformOffsetY = 0;\r\n if (parent) {\r\n const testEl = document.createElement('div');\r\n utils_1.Utils.addElStyles(testEl, {\r\n opacity: '0',\r\n position: 'fixed',\r\n top: 0 + 'px',\r\n left: 0 + 'px',\r\n width: '1px',\r\n height: '1px',\r\n zIndex: '-999999',\r\n });\r\n parent.appendChild(testEl);\r\n const testElPosition = testEl.getBoundingClientRect();\r\n parent.removeChild(testEl);\r\n xformOffsetX = testElPosition.left;\r\n xformOffsetY = testElPosition.top;\r\n // TODO: scale ?\r\n }\r\n const targetOffset = el.getBoundingClientRect();\r\n return {\r\n left: targetOffset.left,\r\n top: targetOffset.top,\r\n offsetLeft: -event.clientX + targetOffset.left - xformOffsetX,\r\n offsetTop: -event.clientY + targetOffset.top - xformOffsetY,\r\n width: targetOffset.width,\r\n height: targetOffset.height\r\n };\r\n }\r\n /** @internal TODO: set to public as called by DDDroppable! */\r\n ui() {\r\n const containmentEl = this.el.parentElement;\r\n const containmentRect = containmentEl.getBoundingClientRect();\r\n const offset = this.helper.getBoundingClientRect();\r\n return {\r\n position: {\r\n top: offset.top - containmentRect.top,\r\n left: offset.left - containmentRect.left\r\n }\r\n /* not used by GridStack for now...\r\n helper: [this.helper], //The object arr representing the helper that's being dragged.\r\n offset: { top: offset.top, left: offset.left } // Current offset position of the helper as { top, left } object.\r\n */\r\n };\r\n }\r\n}\r\nexports.DDDraggable = DDDraggable;\r\n/** @internal properties we change during dragging, and restore back */\r\nDDDraggable.originStyleProp = ['transition', 'pointerEvents', 'position', 'left', 'top', 'minWidth', 'willChange'];\r\n//# sourceMappingURL=dd-draggable.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixxQ0FBcUMsOENBQThDLFlBQVk7QUFDckg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL25vZGVfbW9kdWxlcy9ncmlkc3RhY2svZGlzdC9kZC1kcmFnZ2FibGUuanM/NDAzYiJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcclxuLyoqXHJcbiAqIGRkLWRyYWdnYWJsZS50cyA3LjMuMFxyXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjEtMjAyMiBBbGFpbiBEdW1lc255IC0gc2VlIEdyaWRTdGFjayByb290IGxpY2Vuc2VcclxuICovXHJcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcclxuZXhwb3J0cy5ERERyYWdnYWJsZSA9IHZvaWQgMDtcclxuY29uc3QgZGRfbWFuYWdlcl8xID0gcmVxdWlyZShcIi4vZGQtbWFuYWdlclwiKTtcclxuY29uc3QgdXRpbHNfMSA9IHJlcXVpcmUoXCIuL3V0aWxzXCIpO1xyXG5jb25zdCBkZF9iYXNlX2ltcGxfMSA9IHJlcXVpcmUoXCIuL2RkLWJhc2UtaW1wbFwiKTtcclxuY29uc3QgZGRfdG91Y2hfMSA9IHJlcXVpcmUoXCIuL2RkLXRvdWNoXCIpO1xyXG4vLyBsZXQgY291bnQgPSAwOyAvLyBURVNUXHJcbmNsYXNzIERERHJhZ2dhYmxlIGV4dGVuZHMgZGRfYmFzZV9pbXBsXzEuRERCYXNlSW1wbGVtZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKGVsLCBvcHRpb24gPSB7fSkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgdGhpcy5lbCA9IGVsO1xyXG4gICAgICAgIHRoaXMub3B0aW9uID0gb3B0aW9uO1xyXG4gICAgICAgIC8vIGdldCB0aGUgZWxlbWVudCB0aGF0IGlzIGFjdHVhbGx5IHN1cHBvc2VkIHRvIGJlIGRyYWdnZWQgYnlcclxuICAgICAgICBsZXQgaGFuZGxlTmFtZSA9IG9wdGlvbi5oYW5kbGUuc3Vic3RyaW5nKDEpO1xyXG4gICAgICAgIHRoaXMuZHJhZ0VsID0gZWwuY2xhc3NMaXN0LmNvbnRhaW5zKGhhbmRsZU5hbWUpID8gZWwgOiBlbC5xdWVyeVNlbGVjdG9yKG9wdGlvbi5oYW5kbGUpIHx8IGVsO1xyXG4gICAgICAgIC8vIGNyZWF0ZSB2YXIgZXZlbnQgYmluZGluZyBzbyB3ZSBjYW4gZWFzaWx5IHJlbW92ZSBhbmQgc3RpbGwgbG9vayBsaWtlIFRTIG1ldGhvZHMgKHVubGlrZSBhbm9ueW1vdXMgZnVuY3Rpb25zKVxyXG4gICAgICAgIHRoaXMuX21vdXNlRG93biA9IHRoaXMuX21vdXNlRG93bi5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuX21vdXNlTW92ZSA9IHRoaXMuX21vdXNlTW92ZS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuX21vdXNlVXAgPSB0aGlzLl9tb3VzZVVwLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5lbmFibGUoKTtcclxuICAgIH1cclxuICAgIG9uKGV2ZW50LCBjYWxsYmFjaykge1xyXG4gICAgICAgIHN1cGVyLm9uKGV2ZW50LCBjYWxsYmFjayk7XHJcbiAgICB9XHJcbiAgICBvZmYoZXZlbnQpIHtcclxuICAgICAgICBzdXBlci5vZmYoZXZlbnQpO1xyXG4gICAgfVxyXG4gICAgZW5hYmxlKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkID09PSBmYWxzZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHN1cGVyLmVuYWJsZSgpO1xyXG4gICAgICAgIHRoaXMuZHJhZ0VsLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMuX21vdXNlRG93bik7XHJcbiAgICAgICAgaWYgKGRkX3RvdWNoXzEuaXNUb3VjaCkge1xyXG4gICAgICAgICAgICB0aGlzLmRyYWdFbC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgZGRfdG91Y2hfMS50b3VjaHN0YXJ0KTtcclxuICAgICAgICAgICAgdGhpcy5kcmFnRWwuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCBkZF90b3VjaF8xLnBvaW50ZXJkb3duKTtcclxuICAgICAgICAgICAgLy8gdGhpcy5kcmFnRWwuc3R5bGUudG91Y2hBY3Rpb24gPSAnbm9uZSc7IC8vIG5vdCBuZWVkZWQgdW5saWtlIHBvaW50ZXJkb3duIGRvYyBjb21tZW50XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZWwuY2xhc3NMaXN0LnJlbW92ZSgndWktZHJhZ2dhYmxlLWRpc2FibGVkJyk7XHJcbiAgICAgICAgdGhpcy5lbC5jbGFzc0xpc3QuYWRkKCd1aS1kcmFnZ2FibGUnKTtcclxuICAgIH1cclxuICAgIGRpc2FibGUoZm9yRGVzdHJveSA9IGZhbHNlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQgPT09IHRydWUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzdXBlci5kaXNhYmxlKCk7XHJcbiAgICAgICAgdGhpcy5kcmFnRWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5fbW91c2VEb3duKTtcclxuICAgICAgICBpZiAoZGRfdG91Y2hfMS5pc1RvdWNoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZHJhZ0VsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBkZF90b3VjaF8xLnRvdWNoc3RhcnQpO1xyXG4gICAgICAgICAgICB0aGlzLmRyYWdFbC5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIGRkX3RvdWNoXzEucG9pbnRlcmRvd24pO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmVsLmNsYXNzTGlzdC5yZW1vdmUoJ3VpLWRyYWdnYWJsZScpO1xyXG4gICAgICAgIGlmICghZm9yRGVzdHJveSlcclxuICAgICAgICAgICAgdGhpcy5lbC5jbGFzc0xpc3QuYWRkKCd1aS1kcmFnZ2FibGUtZGlzYWJsZWQnKTtcclxuICAgIH1cclxuICAgIGRlc3Ryb3koKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZHJhZ1RpbWVvdXQpXHJcbiAgICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5kcmFnVGltZW91dCk7XHJcbiAgICAgICAgZGVsZXRlIHRoaXMuZHJhZ1RpbWVvdXQ7XHJcbiAgICAgICAgaWYgKHRoaXMuZHJhZ2dpbmcpXHJcbiAgICAgICAgICAgIHRoaXMuX21vdXNlVXAodGhpcy5tb3VzZURvd25FdmVudCk7XHJcbiAgICAgICAgdGhpcy5kaXNhYmxlKHRydWUpO1xyXG4gICAgICAgIGRlbGV0ZSB0aGlzLmVsO1xyXG4gICAgICAgIGRlbGV0ZSB0aGlzLmhlbHBlcjtcclxuICAgICAgICBkZWxldGUgdGhpcy5vcHRpb247XHJcbiAgICAgICAgc3VwZXIuZGVzdHJveSgpO1xyXG4gICAgfVxyXG4gICAgdXBkYXRlT3B0aW9uKG9wdHMpIHtcclxuICAgICAgICBPYmplY3Qua2V5cyhvcHRzKS5mb3JFYWNoKGtleSA9PiB0aGlzLm9wdGlvbltrZXldID0gb3B0c1trZXldKTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICAgIC8qKiBAaW50ZXJuYWwgY2FsbCB3aGVuIG1vdXNlIGdvZXMgZG93biBiZWZvcmUgYSBkcmFnc3RhcnQgaGFwcGVucyAqL1xyXG4gICAgX21vdXNlRG93bihlKSB7XHJcbiAgICAgICAgLy8gZG9uJ3QgbGV0IG1vcmUgdGhhbiBvbmUgd2lkZ2V0IGhhbmRsZSBtb3VzZVN0YXJ0XHJcbiAgICAgICAgaWYgKGRkX21hbmFnZXJfMS5ERE1hbmFnZXIubW91c2VIYW5kbGVkKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKGUuYnV0dG9uICE9PSAwKVxyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gb25seSBsZWZ0IGNsaWNrXHJcbiAgICAgICAgLy8gbWFrZSBzdXJlIHdlIGFyZSBub3QgY2xpY2tpbmcgb24ga25vd24gb2JqZWN0IHRoYXQgaGFuZGxlcyBtb3VzZURvd24gKFRPRE86IG1ha2UgdGhpcyBleHRlbnNpYmxlID8pICMyMDU0XHJcbiAgICAgICAgY29uc3Qgc2tpcE1vdXNlRG93biA9IFsnaW5wdXQnLCAndGV4dGFyZWEnLCAnYnV0dG9uJywgJ3NlbGVjdCcsICdvcHRpb24nXTtcclxuICAgICAgICBjb25zdCBuYW1lID0gZS50YXJnZXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICBpZiAoc2tpcE1vdXNlRG93bi5maW5kKHNraXAgPT4gc2tpcCA9PT0gbmFtZSkpXHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIC8vIGFsc28gY2hlY2sgZm9yIGNvbnRlbnQgZWRpdGFibGVcclxuICAgICAgICBpZiAoZS50YXJnZXQuY2xvc2VzdCgnW2NvbnRlbnRlZGl0YWJsZT1cInRydWVcIl0nKSlcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgLy8gUkVNT1ZFOiB3aHkgd291bGQgd2UgZ2V0IHRoZSBldmVudCBpZiBpdCB3YXNuJ3QgZm9yIHVzIG9yIGNoaWxkID9cclxuICAgICAgICAvLyBtYWtlIHN1cmUgd2UgYXJlIGNsaWNraW5nIG9uIGEgZHJhZyBoYW5kbGUgb3IgY2hpbGQgb2YgaXQuLi5cclxuICAgICAgICAvLyBOb3RlOiB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIHRoYXQncyBoYW5kbGUgaXMgYW4gaW1tZWRpYXRlIGNoaWxkLCBhcyBtb3VzZUhhbmRsZWQgd2lsbCBwcmV2ZW50IHBhcmVudHMgZnJvbSBhbHNvIGhhbmRsaW5nIGl0IChsb3dlc3Qgd2lucylcclxuICAgICAgICAvLyBsZXQgY2xhc3NOYW1lID0gdGhpcy5vcHRpb24uaGFuZGxlLnN1YnN0cmluZygxKTtcclxuICAgICAgICAvLyBsZXQgZWwgPSBlLnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICAvLyB3aGlsZSAoZWwgJiYgIWVsLmNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWUpKSB7IGVsID0gZWwucGFyZW50RWxlbWVudDsgfVxyXG4gICAgICAgIC8vIGlmICghZWwpIHJldHVybjtcclxuICAgICAgICB0aGlzLm1vdXNlRG93bkV2ZW50ID0gZTtcclxuICAgICAgICBkZWxldGUgdGhpcy5kcmFnZ2luZztcclxuICAgICAgICBkZWxldGUgZGRfbWFuYWdlcl8xLkRETWFuYWdlci5kcmFnRWxlbWVudDtcclxuICAgICAgICBkZWxldGUgZGRfbWFuYWdlcl8xLkRETWFuYWdlci5kcm9wRWxlbWVudDtcclxuICAgICAgICAvLyBkb2N1bWVudCBoYW5kbGVyIHNvIHdlIGNhbiBjb250aW51ZSByZWNlaXZpbmcgbW92ZXMgYXMgdGhlIGl0ZW0gaXMgJ2ZpeGVkJyBwb3NpdGlvbiwgYW5kIGNhcHR1cmU9dHJ1ZSBzbyBXRSBnZXQgYSBmaXJzdCBjcmFja1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuX21vdXNlTW92ZSwgdHJ1ZSk7IC8vIHRydWU9Y2FwdHVyZSwgbm90IGJ1YmJsZVxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLl9tb3VzZVVwLCB0cnVlKTtcclxuICAgICAgICBpZiAoZGRfdG91Y2hfMS5pc1RvdWNoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZHJhZ0VsLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIGRkX3RvdWNoXzEudG91Y2htb3ZlKTtcclxuICAgICAgICAgICAgdGhpcy5kcmFnRWwuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBkZF90b3VjaF8xLnRvdWNoZW5kKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIC8vIHByZXZlbnREZWZhdWx0KCkgcHJldmVudHMgYmx1ciBldmVudCB3aGljaCBvY2N1cnMganVzdCBhZnRlciBtb3VzZWRvd24gZXZlbnQuXHJcbiAgICAgICAgLy8gaWYgYW4gZWRpdGFibGUgY29udGVudCBoYXMgZm9jdXMsIHRoZW4gYmx1ciBtdXN0IGJlIGNhbGxcclxuICAgICAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudClcclxuICAgICAgICAgICAgZG9jdW1lbnQuYWN0aXZlRWxlbWVudC5ibHVyKCk7XHJcbiAgICAgICAgZGRfbWFuYWdlcl8xLkRETWFuYWdlci5tb3VzZUhhbmRsZWQgPSB0cnVlO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgLyoqIEBpbnRlcm5hbCBtZXRob2QgdG8gY2FsbCBhY3R1YWwgZHJhZyBldmVudCAqL1xyXG4gICAgX2NhbGxEcmFnKGUpIHtcclxuICAgICAgICBpZiAoIXRoaXMuZHJhZ2dpbmcpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBldiA9IHV0aWxzXzEuVXRpbHMuaW5pdEV2ZW50KGUsIHsgdGFyZ2V0OiB0aGlzLmVsLCB0eXBlOiAnZHJhZycgfSk7XHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9uLmRyYWcpIHtcclxuICAgICAgICAgICAgdGhpcy5vcHRpb24uZHJhZyhldiwgdGhpcy51aSgpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy50cmlnZ2VyRXZlbnQoJ2RyYWcnLCBldik7XHJcbiAgICB9XHJcbiAgICAvKiogQGludGVybmFsIGNhbGxlZCB3aGVuIHRoZSBtYWluIHBhZ2UgKGFmdGVyIHN1Y2Nlc3NmdWwgbW91c2Vkb3duKSByZWNlaXZlcyBhIG1vdmUgZXZlbnQgdG8gZHJhZyB0aGUgaXRlbSBhcm91bmQgdGhlIHNjcmVlbiAqL1xyXG4gICAgX21vdXNlTW92ZShlKSB7XHJcbiAgICAgICAgdmFyIF9hO1xyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGAke2NvdW50Kyt9IG1vdmUgJHtlLnh9LCR7ZS55fWApXHJcbiAgICAgICAgbGV0IHMgPSB0aGlzLm1vdXNlRG93bkV2ZW50O1xyXG4gICAgICAgIGlmICh0aGlzLmRyYWdnaW5nKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2RyYWdGb2xsb3coZSk7XHJcbiAgICAgICAgICAgIC8vIGRlbGF5IGFjdHVhbCBncmlkIGhhbmRsaW5nIGRyYWcgdW50aWwgd2UgcGF1c2UgZm9yIGEgd2hpbGUgaWYgc2V0XHJcbiAgICAgICAgICAgIGlmIChkZF9tYW5hZ2VyXzEuRERNYW5hZ2VyLnBhdXNlRHJhZykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGF1c2UgPSBOdW1iZXIuaXNJbnRlZ2VyKGRkX21hbmFnZXJfMS5ERE1hbmFnZXIucGF1c2VEcmFnKSA/IGRkX21hbmFnZXJfMS5ERE1hbmFnZXIucGF1c2VEcmFnIDogMTAwO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZHJhZ1RpbWVvdXQpXHJcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aGlzLmRyYWdUaW1lb3V0KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZHJhZ1RpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB0aGlzLl9jYWxsRHJhZyhlKSwgcGF1c2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fY2FsbERyYWcoZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoTWF0aC5hYnMoZS54IC0gcy54KSArIE1hdGguYWJzKGUueSAtIHMueSkgPiAzKSB7XHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiBkb24ndCBzdGFydCB1bmxlc3Mgd2UndmUgbW92ZWQgYXQgbGVhc3QgMyBwaXhlbHNcclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIHRoaXMuZHJhZ2dpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICBkZF9tYW5hZ2VyXzEuRERNYW5hZ2VyLmRyYWdFbGVtZW50ID0gdGhpcztcclxuICAgICAgICAgICAgLy8gaWYgd2UncmUgZHJhZ2dpbmcgYW4gYWN0dWFsIGdyaWQgaXRlbSwgc2V0IHRoZSBjdXJyZW50IGRyb3AgYXMgdGhlIGdyaWQgKHRvIGRldGVjdCBlbnRlci9sZWF2ZSlcclxuICAgICAgICAgICAgbGV0IGdyaWQgPSAoX2EgPSB0aGlzLmVsLmdyaWRzdGFja05vZGUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5ncmlkO1xyXG4gICAgICAgICAgICBpZiAoZ3JpZCkge1xyXG4gICAgICAgICAgICAgICAgZGRfbWFuYWdlcl8xLkRETWFuYWdlci5kcm9wRWxlbWVudCA9IGdyaWQuZWwuZGRFbGVtZW50LmRkRHJvcHBhYmxlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlIGRkX21hbmFnZXJfMS5ERE1hbmFnZXIuZHJvcEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5oZWxwZXIgPSB0aGlzLl9jcmVhdGVIZWxwZXIoZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3NldHVwSGVscGVyQ29udGFpbm1lbnRTdHlsZSgpO1xyXG4gICAgICAgICAgICB0aGlzLmRyYWdPZmZzZXQgPSB0aGlzLl9nZXREcmFnT2Zmc2V0KGUsIHRoaXMuZWwsIHRoaXMuaGVscGVyQ29udGFpbm1lbnQpO1xyXG4gICAgICAgICAgICBjb25zdCBldiA9IHV0aWxzXzEuVXRpbHMuaW5pdEV2ZW50KGUsIHsgdGFyZ2V0OiB0aGlzLmVsLCB0eXBlOiAnZHJhZ3N0YXJ0JyB9KTtcclxuICAgICAgICAgICAgdGhpcy5fc2V0dXBIZWxwZXJTdHlsZShlKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9uLnN0YXJ0KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbi5zdGFydChldiwgdGhpcy51aSgpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnRyaWdnZXJFdmVudCgnZHJhZ3N0YXJ0JywgZXYpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7IC8vIG5lZWRlZCBvdGhlcndpc2Ugd2UgZ2V0IHRleHQgc3dlZXAgdGV4dCBzZWxlY3Rpb24gYXMgd2UgZHJhZyBhcm91bmRcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIC8qKiBAaW50ZXJuYWwgY2FsbCB3aGVuIHRoZSBtb3VzZSBnZXRzIHJlbGVhc2VkIHRvIGRyb3AgdGhlIGl0ZW0gYXQgY3VycmVudCBsb2NhdGlvbiAqL1xyXG4gICAgX21vdXNlVXAoZSkge1xyXG4gICAgICAgIHZhciBfYTtcclxuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLl9tb3VzZU1vdmUsIHRydWUpO1xyXG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLl9tb3VzZVVwLCB0cnVlKTtcclxuICAgICAgICBpZiAoZGRfdG91Y2hfMS5pc1RvdWNoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZHJhZ0VsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIGRkX3RvdWNoXzEudG91Y2htb3ZlLCB0cnVlKTtcclxuICAgICAgICAgICAgdGhpcy5kcmFnRWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBkZF90b3VjaF8xLnRvdWNoZW5kLCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuZHJhZ2dpbmcpIHtcclxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuZHJhZ2dpbmc7XHJcbiAgICAgICAgICAgIC8vIHJlc2V0IHRoZSBkcm9wIHRhcmdldCBpZiBkcmFnZ2luZyBvdmVyIG91cnNlbGYgKGFscmVhZHkgcGFyZW50ZWQsIGp1c3QgbW92aW5nIGR1cmluZyBzdG9wIGNhbGxiYWNrIGJlbG93KVxyXG4gICAgICAgICAgICBpZiAoKChfYSA9IGRkX21hbmFnZXJfMS5ERE1hbmFnZXIuZHJvcEVsZW1lbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5lbCkgPT09IHRoaXMuZWwucGFyZW50RWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlIGRkX21hbmFnZXJfMS5ERE1hbmFnZXIuZHJvcEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5oZWxwZXJDb250YWlubWVudC5zdHlsZS5wb3NpdGlvbiA9IHRoaXMucGFyZW50T3JpZ2luU3R5bGVQb3NpdGlvbiB8fCBudWxsO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5oZWxwZXIgPT09IHRoaXMuZWwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3JlbW92ZUhlbHBlclN0eWxlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhlbHBlci5yZW1vdmUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBldiA9IHV0aWxzXzEuVXRpbHMuaW5pdEV2ZW50KGUsIHsgdGFyZ2V0OiB0aGlzLmVsLCB0eXBlOiAnZHJhZ3N0b3AnIH0pO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb24uc3RvcCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb24uc3RvcChldik7IC8vIE5PVEU6IGRlc3Ryb3koKSB3aWxsIGJlIGNhbGxlZCB3aGVuIHJlbW92aW5nIGl0ZW0sIHNvIGV4cGVjdCBOVUxMIHB0ciBhZnRlciFcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnRyaWdnZXJFdmVudCgnZHJhZ3N0b3AnLCBldik7XHJcbiAgICAgICAgICAgIC8vIGNhbGwgdGhlIGRyb3BwYWJsZSBtZXRob2QgdG8gcmVjZWl2ZSB0aGUgaXRlbVxyXG4gICAgICAgICAgICBpZiAoZGRfbWFuYWdlcl8xLkRETWFuYWdlci5kcm9wRWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgZGRfbWFuYWdlcl8xLkRETWFuYWdlci5kcm9wRWxlbWVudC5kcm9wKGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRlbGV0ZSB0aGlzLmhlbHBlcjtcclxuICAgICAgICBkZWxldGUgdGhpcy5tb3VzZURvd25FdmVudDtcclxuICAgICAgICBkZWxldGUgZGRfbWFuYWdlcl8xLkRETWFuYWdlci5kcmFnRWxlbWVudDtcclxuICAgICAgICBkZWxldGUgZGRfbWFuYWdlcl8xLkRETWFuYWdlci5kcm9wRWxlbWVudDtcclxuICAgICAgICBkZWxldGUgZGRfbWFuYWdlcl8xLkRETWFuYWdlci5tb3VzZUhhbmRsZWQ7XHJcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgfVxyXG4gICAgLyoqIEBpbnRlcm5hbCBjcmVhdGUgYSBjbG9uZSBjb3B5IChvciB1c2VyIGRlZmluZWQgbWV0aG9kKSBvZiB0aGUgb3JpZ2luYWwgZHJhZyBpdGVtIGlmIHNldCAqL1xyXG4gICAgX2NyZWF0ZUhlbHBlcihldmVudCkge1xyXG4gICAgICAgIGxldCBoZWxwZXIgPSB0aGlzLmVsO1xyXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5vcHRpb24uaGVscGVyID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIGhlbHBlciA9IHRoaXMub3B0aW9uLmhlbHBlcihldmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMub3B0aW9uLmhlbHBlciA9PT0gJ2Nsb25lJykge1xyXG4gICAgICAgICAgICBoZWxwZXIgPSB1dGlsc18xLlV0aWxzLmNsb25lTm9kZSh0aGlzLmVsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFkb2N1bWVudC5ib2R5LmNvbnRhaW5zKGhlbHBlcikpIHtcclxuICAgICAgICAgICAgdXRpbHNfMS5VdGlscy5hcHBlbmRUbyhoZWxwZXIsIHRoaXMub3B0aW9uLmFwcGVuZFRvID09PSAncGFyZW50JyA/IHRoaXMuZWwucGFyZW50Tm9kZSA6IHRoaXMub3B0aW9uLmFwcGVuZFRvKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGhlbHBlciA9PT0gdGhpcy5lbCkge1xyXG4gICAgICAgICAgICB0aGlzLmRyYWdFbGVtZW50T3JpZ2luU3R5bGUgPSBERERyYWdnYWJsZS5vcmlnaW5TdHlsZVByb3AubWFwKHByb3AgPT4gdGhpcy5lbC5zdHlsZVtwcm9wXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBoZWxwZXI7XHJcbiAgICB9XHJcbiAgICAvKiogQGludGVybmFsIHNldCB0aGUgZml4IHBvc2l0aW9uIG9mIHRoZSBkcmFnZ2VkIGl0ZW0gKi9cclxuICAgIF9zZXR1cEhlbHBlclN0eWxlKGUpIHtcclxuICAgICAgICB0aGlzLmhlbHBlci5jbGFzc0xpc3QuYWRkKCd1aS1kcmFnZ2FibGUtZHJhZ2dpbmcnKTtcclxuICAgICAgICAvLyBUT0RPOiBzZXQgYWxsIGF0IG9uY2Ugd2l0aCBzdHlsZS5jc3NUZXh0ICs9IC4uLiA/IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzM5Njg1OTNcclxuICAgICAgICBjb25zdCBzdHlsZSA9IHRoaXMuaGVscGVyLnN0eWxlO1xyXG4gICAgICAgIHN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSc7IC8vIG5lZWRlZCBmb3Igb3ZlciBpdGVtcyB0byBnZXQgZW50ZXIvbGVhdmVcclxuICAgICAgICAvLyBzdHlsZS5jdXJzb3IgPSAnbW92ZSc7IC8vICBUT0RPOiBjYW4ndCBzZXQgd2l0aCBwb2ludGVyRXZlbnRzPW5vbmUgISAoZG9uZSBpbiBDU1MgYXMgd2VsbClcclxuICAgICAgICBzdHlsZVsnbWluLXdpZHRoJ10gPSAwOyAvLyBzaW5jZSB3ZSBubyBsb25nZXIgcmVsYXRpdmUgdG8gb3VyIHBhcmVudCBhbmQgd2UgZG9uJ3QgcmVzaXplIGFueXdheSAobm9ybWFsbHkgMTAwLyNjb2x1bW4gJSlcclxuICAgICAgICBzdHlsZS53aWR0aCA9IHRoaXMuZHJhZ09mZnNldC53aWR0aCArICdweCc7XHJcbiAgICAgICAgc3R5bGUuaGVpZ2h0ID0gdGhpcy5kcmFnT2Zmc2V0LmhlaWdodCArICdweCc7XHJcbiAgICAgICAgc3R5bGUud2lsbENoYW5nZSA9ICdsZWZ0LCB0b3AnO1xyXG4gICAgICAgIHN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJzsgLy8gbGV0IHVzIGRyYWcgYmV0d2VlbiBncmlkcyBieSBub3QgY2xpcHBpbmcgYXMgcGFyZW50IC5ncmlkLXN0YWNrIGlzIHBvc2l0aW9uOiAncmVsYXRpdmUnXHJcbiAgICAgICAgdGhpcy5fZHJhZ0ZvbGxvdyhlKTsgLy8gbm93IHBvc2l0aW9uIGl0XHJcbiAgICAgICAgc3R5bGUudHJhbnNpdGlvbiA9ICdub25lJzsgLy8gc2hvdyB1cCBpbnN0YW50bHlcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaGVscGVyKSB7XHJcbiAgICAgICAgICAgICAgICBzdHlsZS50cmFuc2l0aW9uID0gbnVsbDsgLy8gcmVjb3ZlciBhbmltYXRpb25cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sIDApO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gICAgLyoqIEBpbnRlcm5hbCByZXN0b3JlIGJhY2sgdGhlIG9yaWdpbmFsIHN0eWxlIGJlZm9yZSBkcmFnZ2luZyAqL1xyXG4gICAgX3JlbW92ZUhlbHBlclN0eWxlKCkge1xyXG4gICAgICAgIHZhciBfYTtcclxuICAgICAgICB0aGlzLmhlbHBlci5jbGFzc0xpc3QucmVtb3ZlKCd1aS1kcmFnZ2FibGUtZHJhZ2dpbmcnKTtcclxuICAgICAgICBsZXQgbm9kZSA9IChfYSA9IHRoaXMuaGVscGVyKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZ3JpZHN0YWNrTm9kZTtcclxuICAgICAgICAvLyBkb24ndCBib3RoZXIgcmVzdG9yaW5nIHN0eWxlcyBpZiB3ZSdyZSBnb25uYSByZW1vdmUgYW55d2F5Li4uXHJcbiAgICAgICAgaWYgKCEobm9kZSA9PT0gbnVsbCB8fCBub2RlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBub2RlLl9pc0Fib3V0VG9SZW1vdmUpICYmIHRoaXMuZHJhZ0VsZW1lbnRPcmlnaW5TdHlsZSkge1xyXG4gICAgICAgICAgICBsZXQgaGVscGVyID0gdGhpcy5oZWxwZXI7XHJcbiAgICAgICAgICAgIC8vIGRvbid0IGFuaW1hdGUsIG90aGVyd2lzZSB3ZSBhbmltYXRlIG9mZnNldGVkIHdoZW4gc3dpdGNoaW5nIGJhY2sgdG8gJ2Fic29sdXRlJyBmcm9tICdmaXhlZCcuXHJcbiAgICAgICAgICAgIC8vIFRPRE86IHRoaXMgYWxzbyByZW1vdmVzIHJlc2l6aW5nIGFuaW1hdGlvbiB3aGljaCBkb2Vzbid0IGhhdmUgdGhpcyBpc3N1ZSwgYnV0IG90aGVycy5cclxuICAgICAgICAgICAgLy8gSWRlYWxseSBib3RoIHdvdWxkIGFuaW1hdGUgKCdtb3ZlJyB3b3VsZCBpbW1lZGlhdGVseSByZXN0b3JlICdhYnNvbHV0ZScgYW5kIGFkanVzdCBjb29yZGluYXRlIHRvIG1hdGNoLFxyXG4gICAgICAgICAgICAvLyB0aGVuIHRyaWdnZXIgYSBkZWxheSAocmVwYWludCkgdG8gcmVzdG9yZSB0byBmaW5hbCBkZXN0IHdpdGggYW5pbWF0ZSkgYnV0IHRoZW4gd2UgbmVlZCB0byBtYWtlIHN1cmUgJ3Jlc2l6ZXN0b3AnXHJcbiAgICAgICAgICAgIC8vIGlzIGNhbGxlZCBBRlRFUiAndHJhbnNpdGlvbmVuZCcgZXZlbnQgaXMgcmVjZWl2ZWQgKHNlZSBodHRwczovL2dpdGh1Yi5jb20vZ3JpZHN0YWNrL2dyaWRzdGFjay5qcy9pc3N1ZXMvMjAzMylcclxuICAgICAgICAgICAgbGV0IHRyYW5zaXRpb24gPSB0aGlzLmRyYWdFbGVtZW50T3JpZ2luU3R5bGVbJ3RyYW5zaXRpb24nXSB8fCBudWxsO1xyXG4gICAgICAgICAgICBoZWxwZXIuc3R5bGUudHJhbnNpdGlvbiA9IHRoaXMuZHJhZ0VsZW1lbnRPcmlnaW5TdHlsZVsndHJhbnNpdGlvbiddID0gJ25vbmUnOyAvLyBjYW4ndCBiZSBOVUxMICMxOTczXHJcbiAgICAgICAgICAgIERERHJhZ2dhYmxlLm9yaWdpblN0eWxlUHJvcC5mb3JFYWNoKHByb3AgPT4gaGVscGVyLnN0eWxlW3Byb3BdID0gdGhpcy5kcmFnRWxlbWVudE9yaWdpblN0eWxlW3Byb3BdIHx8IG51bGwpO1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IGhlbHBlci5zdHlsZS50cmFuc2l0aW9uID0gdHJhbnNpdGlvbiwgNTApOyAvLyByZWNvdmVyIGFuaW1hdGlvbiBmcm9tIHNhdmVkIHZhcnMgYWZ0ZXIgYSBwYXVzZSAoMCBpc24ndCBlbm91Z2ggIzE5NzMpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRlbGV0ZSB0aGlzLmRyYWdFbGVtZW50T3JpZ2luU3R5bGU7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICAvKiogQGludGVybmFsIHVwZGF0ZXMgdGhlIHRvcC9sZWZ0IHBvc2l0aW9uIHRvIGZvbGxvdyB0aGUgbW91c2UgKi9cclxuICAgIF9kcmFnRm9sbG93KGUpIHtcclxuICAgICAgICBsZXQgY29udGFpbm1lbnRSZWN0ID0geyBsZWZ0OiAwLCB0b3A6IDAgfTtcclxuICAgICAgICAvLyBpZiAodGhpcy5oZWxwZXIuc3R5bGUucG9zaXRpb24gPT09ICdhYnNvbHV0ZScpIHsgLy8gd2UgdXNlICdmaXhlZCdcclxuICAgICAgICAvLyAgIGNvbnN0IHsgbGVmdCwgdG9wIH0gPSB0aGlzLmhlbHBlckNvbnRhaW5tZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgIC8vICAgY29udGFpbm1lbnRSZWN0ID0geyBsZWZ0LCB0b3AgfTtcclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgY29uc3Qgc3R5bGUgPSB0aGlzLmhlbHBlci5zdHlsZTtcclxuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmRyYWdPZmZzZXQ7XHJcbiAgICAgICAgc3R5bGUubGVmdCA9IGUuY2xpZW50WCArIG9mZnNldC5vZmZzZXRMZWZ0IC0gY29udGFpbm1lbnRSZWN0LmxlZnQgKyAncHgnO1xyXG4gICAgICAgIHN0eWxlLnRvcCA9IGUuY2xpZW50WSArIG9mZnNldC5vZmZzZXRUb3AgLSBjb250YWlubWVudFJlY3QudG9wICsgJ3B4JztcclxuICAgIH1cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIF9zZXR1cEhlbHBlckNvbnRhaW5tZW50U3R5bGUoKSB7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJDb250YWlubWVudCA9IHRoaXMuaGVscGVyLnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgaWYgKHRoaXMuaGVscGVyLnN0eWxlLnBvc2l0aW9uICE9PSAnZml4ZWQnKSB7XHJcbiAgICAgICAgICAgIHRoaXMucGFyZW50T3JpZ2luU3R5bGVQb3NpdGlvbiA9IHRoaXMuaGVscGVyQ29udGFpbm1lbnQuc3R5bGUucG9zaXRpb247XHJcbiAgICAgICAgICAgIGlmICh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmhlbHBlckNvbnRhaW5tZW50KS5wb3NpdGlvbi5tYXRjaCgvc3RhdGljLykpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaGVscGVyQ29udGFpbm1lbnQuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgX2dldERyYWdPZmZzZXQoZXZlbnQsIGVsLCBwYXJlbnQpIHtcclxuICAgICAgICAvLyBpbiBjYXNlIGFuY2VzdG9yIGhhcyB0cmFuc2Zvcm0vcGVyc3BlY3RpdmUgY3NzIHByb3BlcnRpZXMgdGhhdCBjaGFuZ2UgdGhlIHZpZXdwb2ludFxyXG4gICAgICAgIGxldCB4Zm9ybU9mZnNldFggPSAwO1xyXG4gICAgICAgIGxldCB4Zm9ybU9mZnNldFkgPSAwO1xyXG4gICAgICAgIGlmIChwYXJlbnQpIHtcclxuICAgICAgICAgICAgY29uc3QgdGVzdEVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgICAgIHV0aWxzXzEuVXRpbHMuYWRkRWxTdHlsZXModGVzdEVsLCB7XHJcbiAgICAgICAgICAgICAgICBvcGFjaXR5OiAnMCcsXHJcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ2ZpeGVkJyxcclxuICAgICAgICAgICAgICAgIHRvcDogMCArICdweCcsXHJcbiAgICAgICAgICAgICAgICBsZWZ0OiAwICsgJ3B4JyxcclxuICAgICAgICAgICAgICAgIHdpZHRoOiAnMXB4JyxcclxuICAgICAgICAgICAgICAgIGhlaWdodDogJzFweCcsXHJcbiAgICAgICAgICAgICAgICB6SW5kZXg6ICctOTk5OTk5JyxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHBhcmVudC5hcHBlbmRDaGlsZCh0ZXN0RWwpO1xyXG4gICAgICAgICAgICBjb25zdCB0ZXN0RWxQb3NpdGlvbiA9IHRlc3RFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICAgICAgcGFyZW50LnJlbW92ZUNoaWxkKHRlc3RFbCk7XHJcbiAgICAgICAgICAgIHhmb3JtT2Zmc2V0WCA9IHRlc3RFbFBvc2l0aW9uLmxlZnQ7XHJcbiAgICAgICAgICAgIHhmb3JtT2Zmc2V0WSA9IHRlc3RFbFBvc2l0aW9uLnRvcDtcclxuICAgICAgICAgICAgLy8gVE9ETzogc2NhbGUgP1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB0YXJnZXRPZmZzZXQgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBsZWZ0OiB0YXJnZXRPZmZzZXQubGVmdCxcclxuICAgICAgICAgICAgdG9wOiB0YXJnZXRPZmZzZXQudG9wLFxyXG4gICAgICAgICAgICBvZmZzZXRMZWZ0OiAtZXZlbnQuY2xpZW50WCArIHRhcmdldE9mZnNldC5sZWZ0IC0geGZvcm1PZmZzZXRYLFxyXG4gICAgICAgICAgICBvZmZzZXRUb3A6IC1ldmVudC5jbGllbnRZICsgdGFyZ2V0T2Zmc2V0LnRvcCAtIHhmb3JtT2Zmc2V0WSxcclxuICAgICAgICAgICAgd2lkdGg6IHRhcmdldE9mZnNldC53aWR0aCxcclxuICAgICAgICAgICAgaGVpZ2h0OiB0YXJnZXRPZmZzZXQuaGVpZ2h0XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIC8qKiBAaW50ZXJuYWwgVE9ETzogc2V0IHRvIHB1YmxpYyBhcyBjYWxsZWQgYnkgREREcm9wcGFibGUhICovXHJcbiAgICB1aSgpIHtcclxuICAgICAgICBjb25zdCBjb250YWlubWVudEVsID0gdGhpcy5lbC5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgIGNvbnN0IGNvbnRhaW5tZW50UmVjdCA9IGNvbnRhaW5tZW50RWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5oZWxwZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgcG9zaXRpb246IHtcclxuICAgICAgICAgICAgICAgIHRvcDogb2Zmc2V0LnRvcCAtIGNvbnRhaW5tZW50UmVjdC50b3AsXHJcbiAgICAgICAgICAgICAgICBsZWZ0OiBvZmZzZXQubGVmdCAtIGNvbnRhaW5tZW50UmVjdC5sZWZ0XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLyogbm90IHVzZWQgYnkgR3JpZFN0YWNrIGZvciBub3cuLi5cclxuICAgICAgICAgICAgaGVscGVyOiBbdGhpcy5oZWxwZXJdLCAvL1RoZSBvYmplY3QgYXJyIHJlcHJlc2VudGluZyB0aGUgaGVscGVyIHRoYXQncyBiZWluZyBkcmFnZ2VkLlxyXG4gICAgICAgICAgICBvZmZzZXQ6IHsgdG9wOiBvZmZzZXQudG9wLCBsZWZ0OiBvZmZzZXQubGVmdCB9IC8vIEN1cnJlbnQgb2Zmc2V0IHBvc2l0aW9uIG9mIHRoZSBoZWxwZXIgYXMgeyB0b3AsIGxlZnQgfSBvYmplY3QuXHJcbiAgICAgICAgICAgICovXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxufVxyXG5leHBvcnRzLkRERHJhZ2dhYmxlID0gREREcmFnZ2FibGU7XHJcbi8qKiBAaW50ZXJuYWwgcHJvcGVydGllcyB3ZSBjaGFuZ2UgZHVyaW5nIGRyYWdnaW5nLCBhbmQgcmVzdG9yZSBiYWNrICovXHJcbkRERHJhZ2dhYmxlLm9yaWdpblN0eWxlUHJvcCA9IFsndHJhbnNpdGlvbicsICdwb2ludGVyRXZlbnRzJywgJ3Bvc2l0aW9uJywgJ2xlZnQnLCAndG9wJywgJ21pbldpZHRoJywgJ3dpbGxDaGFuZ2UnXTtcclxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGQtZHJhZ2dhYmxlLmpzLm1hcCJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///4736\n")},9053:(__unused_webpack_module,exports,__webpack_require__)=>{"use strict";eval("\r\n/**\r\n * dd-droppable.ts 7.3.0\r\n * Copyright (c) 2021-2022 Alain Dumesny - see GridStack root license\r\n */\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.DDDroppable = void 0;\r\nconst dd_manager_1 = __webpack_require__(7655);\r\nconst dd_base_impl_1 = __webpack_require__(7955);\r\nconst utils_1 = __webpack_require__(6480);\r\nconst dd_touch_1 = __webpack_require__(4770);\r\n// let count = 0; // TEST\r\nclass DDDroppable extends dd_base_impl_1.DDBaseImplement {\r\n constructor(el, opts = {}) {\r\n super();\r\n this.el = el;\r\n this.option = opts;\r\n // create var event binding so we can easily remove and still look like TS methods (unlike anonymous functions)\r\n this._mouseEnter = this._mouseEnter.bind(this);\r\n this._mouseLeave = this._mouseLeave.bind(this);\r\n this.enable();\r\n this._setupAccept();\r\n }\r\n on(event, callback) {\r\n super.on(event, callback);\r\n }\r\n off(event) {\r\n super.off(event);\r\n }\r\n enable() {\r\n if (this.disabled === false)\r\n return;\r\n super.enable();\r\n this.el.classList.add('ui-droppable');\r\n this.el.classList.remove('ui-droppable-disabled');\r\n this.el.addEventListener('mouseenter', this._mouseEnter);\r\n this.el.addEventListener('mouseleave', this._mouseLeave);\r\n if (dd_touch_1.isTouch) {\r\n this.el.addEventListener('pointerenter', dd_touch_1.pointerenter);\r\n this.el.addEventListener('pointerleave', dd_touch_1.pointerleave);\r\n }\r\n }\r\n disable(forDestroy = false) {\r\n if (this.disabled === true)\r\n return;\r\n super.disable();\r\n this.el.classList.remove('ui-droppable');\r\n if (!forDestroy)\r\n this.el.classList.add('ui-droppable-disabled');\r\n this.el.removeEventListener('mouseenter', this._mouseEnter);\r\n this.el.removeEventListener('mouseleave', this._mouseLeave);\r\n if (dd_touch_1.isTouch) {\r\n this.el.removeEventListener('pointerenter', dd_touch_1.pointerenter);\r\n this.el.removeEventListener('pointerleave', dd_touch_1.pointerleave);\r\n }\r\n }\r\n destroy() {\r\n this.disable(true);\r\n this.el.classList.remove('ui-droppable');\r\n this.el.classList.remove('ui-droppable-disabled');\r\n super.destroy();\r\n }\r\n updateOption(opts) {\r\n Object.keys(opts).forEach(key => this.option[key] = opts[key]);\r\n this._setupAccept();\r\n return this;\r\n }\r\n /** @internal called when the cursor enters our area - prepare for a possible drop and track leaving */\r\n _mouseEnter(e) {\r\n // console.log(`${count++} Enter ${this.el.id || (this.el as GridHTMLElement).gridstack.opts.id}`); // TEST\r\n if (!dd_manager_1.DDManager.dragElement)\r\n return;\r\n if (!this._canDrop(dd_manager_1.DDManager.dragElement.el))\r\n return;\r\n e.preventDefault();\r\n e.stopPropagation();\r\n // make sure when we enter this, that the last one gets a leave FIRST to correctly cleanup as we don't always do\r\n if (dd_manager_1.DDManager.dropElement && dd_manager_1.DDManager.dropElement !== this) {\r\n dd_manager_1.DDManager.dropElement._mouseLeave(e);\r\n }\r\n dd_manager_1.DDManager.dropElement = this;\r\n const ev = utils_1.Utils.initEvent(e, { target: this.el, type: 'dropover' });\r\n if (this.option.over) {\r\n this.option.over(ev, this._ui(dd_manager_1.DDManager.dragElement));\r\n }\r\n this.triggerEvent('dropover', ev);\r\n this.el.classList.add('ui-droppable-over');\r\n // console.log('tracking'); // TEST\r\n }\r\n /** @internal called when the item is leaving our area, stop tracking if we had moving item */\r\n _mouseLeave(e) {\r\n var _a;\r\n // console.log(`${count++} Leave ${this.el.id || (this.el as GridHTMLElement).gridstack.opts.id}`); // TEST\r\n if (!dd_manager_1.DDManager.dragElement || dd_manager_1.DDManager.dropElement !== this)\r\n return;\r\n e.preventDefault();\r\n e.stopPropagation();\r\n const ev = utils_1.Utils.initEvent(e, { target: this.el, type: 'dropout' });\r\n if (this.option.out) {\r\n this.option.out(ev, this._ui(dd_manager_1.DDManager.dragElement));\r\n }\r\n this.triggerEvent('dropout', ev);\r\n if (dd_manager_1.DDManager.dropElement === this) {\r\n delete dd_manager_1.DDManager.dropElement;\r\n // console.log('not tracking'); // TEST\r\n // if we're still over a parent droppable, send it an enter as we don't get one from leaving nested children\r\n let parentDrop;\r\n let parent = this.el.parentElement;\r\n while (!parentDrop && parent) {\r\n parentDrop = (_a = parent.ddElement) === null || _a === void 0 ? void 0 : _a.ddDroppable;\r\n parent = parent.parentElement;\r\n }\r\n if (parentDrop) {\r\n parentDrop._mouseEnter(e);\r\n }\r\n }\r\n }\r\n /** item is being dropped on us - called by the drag mouseup handler - this calls the client drop event */\r\n drop(e) {\r\n e.preventDefault();\r\n const ev = utils_1.Utils.initEvent(e, { target: this.el, type: 'drop' });\r\n if (this.option.drop) {\r\n this.option.drop(ev, this._ui(dd_manager_1.DDManager.dragElement));\r\n }\r\n this.triggerEvent('drop', ev);\r\n }\r\n /** @internal true if element matches the string/method accept option */\r\n _canDrop(el) {\r\n return el && (!this.accept || this.accept(el));\r\n }\r\n /** @internal */\r\n _setupAccept() {\r\n if (!this.option.accept)\r\n return this;\r\n if (typeof this.option.accept === 'string') {\r\n this.accept = (el) => el.matches(this.option.accept);\r\n }\r\n else {\r\n this.accept = this.option.accept;\r\n }\r\n return this;\r\n }\r\n /** @internal */\r\n _ui(drag) {\r\n return Object.assign({ draggable: drag.el }, drag.ui());\r\n }\r\n}\r\nexports.DDDroppable = DDDroppable;\r\n//# sourceMappingURL=dd-droppable.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTA1My5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELG1CQUFtQjtBQUNuQixxQkFBcUIsbUJBQU8sQ0FBQyxJQUFjO0FBQzNDLHVCQUF1QixtQkFBTyxDQUFDLElBQWdCO0FBQy9DLGdCQUFnQixtQkFBTyxDQUFDLElBQVM7QUFDakMsbUJBQW1CLG1CQUFPLENBQUMsSUFBWTtBQUN2QyxrQkFBa0I7QUFDbEI7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsU0FBUyxRQUFRLDZEQUE2RCxJQUFJO0FBQzVHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0QsbUNBQW1DO0FBQ25GO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0M7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsU0FBUyxRQUFRLDZEQUE2RCxJQUFJO0FBQzVHO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdELGtDQUFrQztBQUNsRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEM7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdELCtCQUErQjtBQUMvRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLG9CQUFvQjtBQUNuRDtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL25vZGVfbW9kdWxlcy9ncmlkc3RhY2svZGlzdC9kZC1kcm9wcGFibGUuanM/ZDVmMyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcclxuLyoqXHJcbiAqIGRkLWRyb3BwYWJsZS50cyA3LjMuMFxyXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjEtMjAyMiBBbGFpbiBEdW1lc255IC0gc2VlIEdyaWRTdGFjayByb290IGxpY2Vuc2VcclxuICovXHJcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcclxuZXhwb3J0cy5ERERyb3BwYWJsZSA9IHZvaWQgMDtcclxuY29uc3QgZGRfbWFuYWdlcl8xID0gcmVxdWlyZShcIi4vZGQtbWFuYWdlclwiKTtcclxuY29uc3QgZGRfYmFzZV9pbXBsXzEgPSByZXF1aXJlKFwiLi9kZC1iYXNlLWltcGxcIik7XHJcbmNvbnN0IHV0aWxzXzEgPSByZXF1aXJlKFwiLi91dGlsc1wiKTtcclxuY29uc3QgZGRfdG91Y2hfMSA9IHJlcXVpcmUoXCIuL2RkLXRvdWNoXCIpO1xyXG4vLyBsZXQgY291bnQgPSAwOyAvLyBURVNUXHJcbmNsYXNzIERERHJvcHBhYmxlIGV4dGVuZHMgZGRfYmFzZV9pbXBsXzEuRERCYXNlSW1wbGVtZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKGVsLCBvcHRzID0ge30pIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIHRoaXMuZWwgPSBlbDtcclxuICAgICAgICB0aGlzLm9wdGlvbiA9IG9wdHM7XHJcbiAgICAgICAgLy8gY3JlYXRlIHZhciBldmVudCBiaW5kaW5nIHNvIHdlIGNhbiBlYXNpbHkgcmVtb3ZlIGFuZCBzdGlsbCBsb29rIGxpa2UgVFMgbWV0aG9kcyAodW5saWtlIGFub255bW91cyBmdW5jdGlvbnMpXHJcbiAgICAgICAgdGhpcy5fbW91c2VFbnRlciA9IHRoaXMuX21vdXNlRW50ZXIuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLl9tb3VzZUxlYXZlID0gdGhpcy5fbW91c2VMZWF2ZS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuZW5hYmxlKCk7XHJcbiAgICAgICAgdGhpcy5fc2V0dXBBY2NlcHQoKTtcclxuICAgIH1cclxuICAgIG9uKGV2ZW50LCBjYWxsYmFjaykge1xyXG4gICAgICAgIHN1cGVyLm9uKGV2ZW50LCBjYWxsYmFjayk7XHJcbiAgICB9XHJcbiAgICBvZmYoZXZlbnQpIHtcclxuICAgICAgICBzdXBlci5vZmYoZXZlbnQpO1xyXG4gICAgfVxyXG4gICAgZW5hYmxlKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkID09PSBmYWxzZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHN1cGVyLmVuYWJsZSgpO1xyXG4gICAgICAgIHRoaXMuZWwuY2xhc3NMaXN0LmFkZCgndWktZHJvcHBhYmxlJyk7XHJcbiAgICAgICAgdGhpcy5lbC5jbGFzc0xpc3QucmVtb3ZlKCd1aS1kcm9wcGFibGUtZGlzYWJsZWQnKTtcclxuICAgICAgICB0aGlzLmVsLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZW50ZXInLCB0aGlzLl9tb3VzZUVudGVyKTtcclxuICAgICAgICB0aGlzLmVsLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCB0aGlzLl9tb3VzZUxlYXZlKTtcclxuICAgICAgICBpZiAoZGRfdG91Y2hfMS5pc1RvdWNoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZWwuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmVudGVyJywgZGRfdG91Y2hfMS5wb2ludGVyZW50ZXIpO1xyXG4gICAgICAgICAgICB0aGlzLmVsLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJsZWF2ZScsIGRkX3RvdWNoXzEucG9pbnRlcmxlYXZlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBkaXNhYmxlKGZvckRlc3Ryb3kgPSBmYWxzZSkge1xyXG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkID09PSB0cnVlKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc3VwZXIuZGlzYWJsZSgpO1xyXG4gICAgICAgIHRoaXMuZWwuY2xhc3NMaXN0LnJlbW92ZSgndWktZHJvcHBhYmxlJyk7XHJcbiAgICAgICAgaWYgKCFmb3JEZXN0cm95KVxyXG4gICAgICAgICAgICB0aGlzLmVsLmNsYXNzTGlzdC5hZGQoJ3VpLWRyb3BwYWJsZS1kaXNhYmxlZCcpO1xyXG4gICAgICAgIHRoaXMuZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2VlbnRlcicsIHRoaXMuX21vdXNlRW50ZXIpO1xyXG4gICAgICAgIHRoaXMuZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIHRoaXMuX21vdXNlTGVhdmUpO1xyXG4gICAgICAgIGlmIChkZF90b3VjaF8xLmlzVG91Y2gpIHtcclxuICAgICAgICAgICAgdGhpcy5lbC5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVyZW50ZXInLCBkZF90b3VjaF8xLnBvaW50ZXJlbnRlcik7XHJcbiAgICAgICAgICAgIHRoaXMuZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcmxlYXZlJywgZGRfdG91Y2hfMS5wb2ludGVybGVhdmUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGRlc3Ryb3koKSB7XHJcbiAgICAgICAgdGhpcy5kaXNhYmxlKHRydWUpO1xyXG4gICAgICAgIHRoaXMuZWwuY2xhc3NMaXN0LnJlbW92ZSgndWktZHJvcHBhYmxlJyk7XHJcbiAgICAgICAgdGhpcy5lbC5jbGFzc0xpc3QucmVtb3ZlKCd1aS1kcm9wcGFibGUtZGlzYWJsZWQnKTtcclxuICAgICAgICBzdXBlci5kZXN0cm95KCk7XHJcbiAgICB9XHJcbiAgICB1cGRhdGVPcHRpb24ob3B0cykge1xyXG4gICAgICAgIE9iamVjdC5rZXlzKG9wdHMpLmZvckVhY2goa2V5ID0+IHRoaXMub3B0aW9uW2tleV0gPSBvcHRzW2tleV0pO1xyXG4gICAgICAgIHRoaXMuX3NldHVwQWNjZXB0KCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICAvKiogQGludGVybmFsIGNhbGxlZCB3aGVuIHRoZSBjdXJzb3IgZW50ZXJzIG91ciBhcmVhIC0gcHJlcGFyZSBmb3IgYSBwb3NzaWJsZSBkcm9wIGFuZCB0cmFjayBsZWF2aW5nICovXHJcbiAgICBfbW91c2VFbnRlcihlKSB7XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coYCR7Y291bnQrK30gRW50ZXIgJHt0aGlzLmVsLmlkIHx8ICh0aGlzLmVsIGFzIEdyaWRIVE1MRWxlbWVudCkuZ3JpZHN0YWNrLm9wdHMuaWR9YCk7IC8vIFRFU1RcclxuICAgICAgICBpZiAoIWRkX21hbmFnZXJfMS5ERE1hbmFnZXIuZHJhZ0VsZW1lbnQpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBpZiAoIXRoaXMuX2NhbkRyb3AoZGRfbWFuYWdlcl8xLkRETWFuYWdlci5kcmFnRWxlbWVudC5lbCkpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAvLyBtYWtlIHN1cmUgd2hlbiB3ZSBlbnRlciB0aGlzLCB0aGF0IHRoZSBsYXN0IG9uZSBnZXRzIGEgbGVhdmUgRklSU1QgdG8gY29ycmVjdGx5IGNsZWFudXAgYXMgd2UgZG9uJ3QgYWx3YXlzIGRvXHJcbiAgICAgICAgaWYgKGRkX21hbmFnZXJfMS5ERE1hbmFnZXIuZHJvcEVsZW1lbnQgJiYgZGRfbWFuYWdlcl8xLkRETWFuYWdlci5kcm9wRWxlbWVudCAhPT0gdGhpcykge1xyXG4gICAgICAgICAgICBkZF9tYW5hZ2VyXzEuRERNYW5hZ2VyLmRyb3BFbGVtZW50Ll9tb3VzZUxlYXZlKGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBkZF9tYW5hZ2VyXzEuRERNYW5hZ2VyLmRyb3BFbGVtZW50ID0gdGhpcztcclxuICAgICAgICBjb25zdCBldiA9IHV0aWxzXzEuVXRpbHMuaW5pdEV2ZW50KGUsIHsgdGFyZ2V0OiB0aGlzLmVsLCB0eXBlOiAnZHJvcG92ZXInIH0pO1xyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbi5vdmVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9uLm92ZXIoZXYsIHRoaXMuX3VpKGRkX21hbmFnZXJfMS5ERE1hbmFnZXIuZHJhZ0VsZW1lbnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy50cmlnZ2VyRXZlbnQoJ2Ryb3BvdmVyJywgZXYpO1xyXG4gICAgICAgIHRoaXMuZWwuY2xhc3NMaXN0LmFkZCgndWktZHJvcHBhYmxlLW92ZXInKTtcclxuICAgICAgICAvLyBjb25zb2xlLmxvZygndHJhY2tpbmcnKTsgLy8gVEVTVFxyXG4gICAgfVxyXG4gICAgLyoqIEBpbnRlcm5hbCBjYWxsZWQgd2hlbiB0aGUgaXRlbSBpcyBsZWF2aW5nIG91ciBhcmVhLCBzdG9wIHRyYWNraW5nIGlmIHdlIGhhZCBtb3ZpbmcgaXRlbSAqL1xyXG4gICAgX21vdXNlTGVhdmUoZSkge1xyXG4gICAgICAgIHZhciBfYTtcclxuICAgICAgICAvLyBjb25zb2xlLmxvZyhgJHtjb3VudCsrfSBMZWF2ZSAke3RoaXMuZWwuaWQgfHwgKHRoaXMuZWwgYXMgR3JpZEhUTUxFbGVtZW50KS5ncmlkc3RhY2sub3B0cy5pZH1gKTsgLy8gVEVTVFxyXG4gICAgICAgIGlmICghZGRfbWFuYWdlcl8xLkRETWFuYWdlci5kcmFnRWxlbWVudCB8fCBkZF9tYW5hZ2VyXzEuRERNYW5hZ2VyLmRyb3BFbGVtZW50ICE9PSB0aGlzKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgY29uc3QgZXYgPSB1dGlsc18xLlV0aWxzLmluaXRFdmVudChlLCB7IHRhcmdldDogdGhpcy5lbCwgdHlwZTogJ2Ryb3BvdXQnIH0pO1xyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbi5vdXQpIHtcclxuICAgICAgICAgICAgdGhpcy5vcHRpb24ub3V0KGV2LCB0aGlzLl91aShkZF9tYW5hZ2VyXzEuRERNYW5hZ2VyLmRyYWdFbGVtZW50KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudHJpZ2dlckV2ZW50KCdkcm9wb3V0JywgZXYpO1xyXG4gICAgICAgIGlmIChkZF9tYW5hZ2VyXzEuRERNYW5hZ2VyLmRyb3BFbGVtZW50ID09PSB0aGlzKSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBkZF9tYW5hZ2VyXzEuRERNYW5hZ2VyLmRyb3BFbGVtZW50O1xyXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnbm90IHRyYWNraW5nJyk7IC8vIFRFU1RcclxuICAgICAgICAgICAgLy8gaWYgd2UncmUgc3RpbGwgb3ZlciBhIHBhcmVudCBkcm9wcGFibGUsIHNlbmQgaXQgYW4gZW50ZXIgYXMgd2UgZG9uJ3QgZ2V0IG9uZSBmcm9tIGxlYXZpbmcgbmVzdGVkIGNoaWxkcmVuXHJcbiAgICAgICAgICAgIGxldCBwYXJlbnREcm9wO1xyXG4gICAgICAgICAgICBsZXQgcGFyZW50ID0gdGhpcy5lbC5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgICAgICB3aGlsZSAoIXBhcmVudERyb3AgJiYgcGFyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnREcm9wID0gKF9hID0gcGFyZW50LmRkRWxlbWVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmRkRHJvcHBhYmxlO1xyXG4gICAgICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHBhcmVudERyb3ApIHtcclxuICAgICAgICAgICAgICAgIHBhcmVudERyb3AuX21vdXNlRW50ZXIoZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKiogaXRlbSBpcyBiZWluZyBkcm9wcGVkIG9uIHVzIC0gY2FsbGVkIGJ5IHRoZSBkcmFnIG1vdXNldXAgaGFuZGxlciAtIHRoaXMgY2FsbHMgdGhlIGNsaWVudCBkcm9wIGV2ZW50ICovXHJcbiAgICBkcm9wKGUpIHtcclxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgY29uc3QgZXYgPSB1dGlsc18xLlV0aWxzLmluaXRFdmVudChlLCB7IHRhcmdldDogdGhpcy5lbCwgdHlwZTogJ2Ryb3AnIH0pO1xyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbi5kcm9wKSB7XHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9uLmRyb3AoZXYsIHRoaXMuX3VpKGRkX21hbmFnZXJfMS5ERE1hbmFnZXIuZHJhZ0VsZW1lbnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy50cmlnZ2VyRXZlbnQoJ2Ryb3AnLCBldik7XHJcbiAgICB9XHJcbiAgICAvKiogQGludGVybmFsIHRydWUgaWYgZWxlbWVudCBtYXRjaGVzIHRoZSBzdHJpbmcvbWV0aG9kIGFjY2VwdCBvcHRpb24gKi9cclxuICAgIF9jYW5Ecm9wKGVsKSB7XHJcbiAgICAgICAgcmV0dXJuIGVsICYmICghdGhpcy5hY2NlcHQgfHwgdGhpcy5hY2NlcHQoZWwpKTtcclxuICAgIH1cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIF9zZXR1cEFjY2VwdCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMub3B0aW9uLmFjY2VwdClcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbi5hY2NlcHQgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYWNjZXB0ID0gKGVsKSA9PiBlbC5tYXRjaGVzKHRoaXMub3B0aW9uLmFjY2VwdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmFjY2VwdCA9IHRoaXMub3B0aW9uLmFjY2VwdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBfdWkoZHJhZykge1xyXG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHsgZHJhZ2dhYmxlOiBkcmFnLmVsIH0sIGRyYWcudWkoKSk7XHJcbiAgICB9XHJcbn1cclxuZXhwb3J0cy5ERERyb3BwYWJsZSA9IERERHJvcHBhYmxlO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZC1kcm9wcGFibGUuanMubWFwIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///9053\n")},2373:(__unused_webpack_module,exports,__webpack_require__)=>{"use strict";eval("\r\n/**\r\n * dd-elements.ts 7.3.0\r\n * Copyright (c) 2021 Alain Dumesny - see GridStack root license\r\n */\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.DDElement = void 0;\r\nconst dd_resizable_1 = __webpack_require__(9326);\r\nconst dd_draggable_1 = __webpack_require__(4736);\r\nconst dd_droppable_1 = __webpack_require__(9053);\r\nclass DDElement {\r\n constructor(el) {\r\n this.el = el;\r\n }\r\n static init(el) {\r\n if (!el.ddElement) {\r\n el.ddElement = new DDElement(el);\r\n }\r\n return el.ddElement;\r\n }\r\n on(eventName, callback) {\r\n if (this.ddDraggable && ['drag', 'dragstart', 'dragstop'].indexOf(eventName) > -1) {\r\n this.ddDraggable.on(eventName, callback);\r\n }\r\n else if (this.ddDroppable && ['drop', 'dropover', 'dropout'].indexOf(eventName) > -1) {\r\n this.ddDroppable.on(eventName, callback);\r\n }\r\n else if (this.ddResizable && ['resizestart', 'resize', 'resizestop'].indexOf(eventName) > -1) {\r\n this.ddResizable.on(eventName, callback);\r\n }\r\n return this;\r\n }\r\n off(eventName) {\r\n if (this.ddDraggable && ['drag', 'dragstart', 'dragstop'].indexOf(eventName) > -1) {\r\n this.ddDraggable.off(eventName);\r\n }\r\n else if (this.ddDroppable && ['drop', 'dropover', 'dropout'].indexOf(eventName) > -1) {\r\n this.ddDroppable.off(eventName);\r\n }\r\n else if (this.ddResizable && ['resizestart', 'resize', 'resizestop'].indexOf(eventName) > -1) {\r\n this.ddResizable.off(eventName);\r\n }\r\n return this;\r\n }\r\n setupDraggable(opts) {\r\n if (!this.ddDraggable) {\r\n this.ddDraggable = new dd_draggable_1.DDDraggable(this.el, opts);\r\n }\r\n else {\r\n this.ddDraggable.updateOption(opts);\r\n }\r\n return this;\r\n }\r\n cleanDraggable() {\r\n if (this.ddDraggable) {\r\n this.ddDraggable.destroy();\r\n delete this.ddDraggable;\r\n }\r\n return this;\r\n }\r\n setupResizable(opts) {\r\n if (!this.ddResizable) {\r\n this.ddResizable = new dd_resizable_1.DDResizable(this.el, opts);\r\n }\r\n else {\r\n this.ddResizable.updateOption(opts);\r\n }\r\n return this;\r\n }\r\n cleanResizable() {\r\n if (this.ddResizable) {\r\n this.ddResizable.destroy();\r\n delete this.ddResizable;\r\n }\r\n return this;\r\n }\r\n setupDroppable(opts) {\r\n if (!this.ddDroppable) {\r\n this.ddDroppable = new dd_droppable_1.DDDroppable(this.el, opts);\r\n }\r\n else {\r\n this.ddDroppable.updateOption(opts);\r\n }\r\n return this;\r\n }\r\n cleanDroppable() {\r\n if (this.ddDroppable) {\r\n this.ddDroppable.destroy();\r\n delete this.ddDroppable;\r\n }\r\n return this;\r\n }\r\n}\r\nexports.DDElement = DDElement;\r\n//# sourceMappingURL=dd-element.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjM3My5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELGlCQUFpQjtBQUNqQix1QkFBdUIsbUJBQU8sQ0FBQyxJQUFnQjtBQUMvQyx1QkFBdUIsbUJBQU8sQ0FBQyxJQUFnQjtBQUMvQyx1QkFBdUIsbUJBQU8sQ0FBQyxJQUFnQjtBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL25vZGVfbW9kdWxlcy9ncmlkc3RhY2svZGlzdC9kZC1lbGVtZW50LmpzPzJlMmUiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XHJcbi8qKlxyXG4gKiBkZC1lbGVtZW50cy50cyA3LjMuMFxyXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjEgQWxhaW4gRHVtZXNueSAtIHNlZSBHcmlkU3RhY2sgcm9vdCBsaWNlbnNlXHJcbiAqL1xyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XHJcbmV4cG9ydHMuRERFbGVtZW50ID0gdm9pZCAwO1xyXG5jb25zdCBkZF9yZXNpemFibGVfMSA9IHJlcXVpcmUoXCIuL2RkLXJlc2l6YWJsZVwiKTtcclxuY29uc3QgZGRfZHJhZ2dhYmxlXzEgPSByZXF1aXJlKFwiLi9kZC1kcmFnZ2FibGVcIik7XHJcbmNvbnN0IGRkX2Ryb3BwYWJsZV8xID0gcmVxdWlyZShcIi4vZGQtZHJvcHBhYmxlXCIpO1xyXG5jbGFzcyBEREVsZW1lbnQge1xyXG4gICAgY29uc3RydWN0b3IoZWwpIHtcclxuICAgICAgICB0aGlzLmVsID0gZWw7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgaW5pdChlbCkge1xyXG4gICAgICAgIGlmICghZWwuZGRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGVsLmRkRWxlbWVudCA9IG5ldyBEREVsZW1lbnQoZWwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZWwuZGRFbGVtZW50O1xyXG4gICAgfVxyXG4gICAgb24oZXZlbnROYW1lLCBjYWxsYmFjaykge1xyXG4gICAgICAgIGlmICh0aGlzLmRkRHJhZ2dhYmxlICYmIFsnZHJhZycsICdkcmFnc3RhcnQnLCAnZHJhZ3N0b3AnXS5pbmRleE9mKGV2ZW50TmFtZSkgPiAtMSkge1xyXG4gICAgICAgICAgICB0aGlzLmRkRHJhZ2dhYmxlLm9uKGV2ZW50TmFtZSwgY2FsbGJhY2spO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLmRkRHJvcHBhYmxlICYmIFsnZHJvcCcsICdkcm9wb3ZlcicsICdkcm9wb3V0J10uaW5kZXhPZihldmVudE5hbWUpID4gLTEpIHtcclxuICAgICAgICAgICAgdGhpcy5kZERyb3BwYWJsZS5vbihldmVudE5hbWUsIGNhbGxiYWNrKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5kZFJlc2l6YWJsZSAmJiBbJ3Jlc2l6ZXN0YXJ0JywgJ3Jlc2l6ZScsICdyZXNpemVzdG9wJ10uaW5kZXhPZihldmVudE5hbWUpID4gLTEpIHtcclxuICAgICAgICAgICAgdGhpcy5kZFJlc2l6YWJsZS5vbihldmVudE5hbWUsIGNhbGxiYWNrKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICBvZmYoZXZlbnROYW1lKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZGREcmFnZ2FibGUgJiYgWydkcmFnJywgJ2RyYWdzdGFydCcsICdkcmFnc3RvcCddLmluZGV4T2YoZXZlbnROYW1lKSA+IC0xKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGREcmFnZ2FibGUub2ZmKGV2ZW50TmFtZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuZGREcm9wcGFibGUgJiYgWydkcm9wJywgJ2Ryb3BvdmVyJywgJ2Ryb3BvdXQnXS5pbmRleE9mKGV2ZW50TmFtZSkgPiAtMSkge1xyXG4gICAgICAgICAgICB0aGlzLmRkRHJvcHBhYmxlLm9mZihldmVudE5hbWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLmRkUmVzaXphYmxlICYmIFsncmVzaXplc3RhcnQnLCAncmVzaXplJywgJ3Jlc2l6ZXN0b3AnXS5pbmRleE9mKGV2ZW50TmFtZSkgPiAtMSkge1xyXG4gICAgICAgICAgICB0aGlzLmRkUmVzaXphYmxlLm9mZihldmVudE5hbWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICAgIHNldHVwRHJhZ2dhYmxlKG9wdHMpIHtcclxuICAgICAgICBpZiAoIXRoaXMuZGREcmFnZ2FibGUpIHtcclxuICAgICAgICAgICAgdGhpcy5kZERyYWdnYWJsZSA9IG5ldyBkZF9kcmFnZ2FibGVfMS5ERERyYWdnYWJsZSh0aGlzLmVsLCBvcHRzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGREcmFnZ2FibGUudXBkYXRlT3B0aW9uKG9wdHMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICAgIGNsZWFuRHJhZ2dhYmxlKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmRkRHJhZ2dhYmxlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGREcmFnZ2FibGUuZGVzdHJveSgpO1xyXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5kZERyYWdnYWJsZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICBzZXR1cFJlc2l6YWJsZShvcHRzKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmRkUmVzaXphYmxlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGRSZXNpemFibGUgPSBuZXcgZGRfcmVzaXphYmxlXzEuRERSZXNpemFibGUodGhpcy5lbCwgb3B0cyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmRkUmVzaXphYmxlLnVwZGF0ZU9wdGlvbihvcHRzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICBjbGVhblJlc2l6YWJsZSgpIHtcclxuICAgICAgICBpZiAodGhpcy5kZFJlc2l6YWJsZSkge1xyXG4gICAgICAgICAgICB0aGlzLmRkUmVzaXphYmxlLmRlc3Ryb3koKTtcclxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuZGRSZXNpemFibGU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gICAgc2V0dXBEcm9wcGFibGUob3B0cykge1xyXG4gICAgICAgIGlmICghdGhpcy5kZERyb3BwYWJsZSkge1xyXG4gICAgICAgICAgICB0aGlzLmRkRHJvcHBhYmxlID0gbmV3IGRkX2Ryb3BwYWJsZV8xLkRERHJvcHBhYmxlKHRoaXMuZWwsIG9wdHMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5kZERyb3BwYWJsZS51cGRhdGVPcHRpb24ob3B0cyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gICAgY2xlYW5Ecm9wcGFibGUoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZGREcm9wcGFibGUpIHtcclxuICAgICAgICAgICAgdGhpcy5kZERyb3BwYWJsZS5kZXN0cm95KCk7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmRkRHJvcHBhYmxlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxufVxyXG5leHBvcnRzLkRERWxlbWVudCA9IERERWxlbWVudDtcclxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGQtZWxlbWVudC5qcy5tYXAiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///2373\n")},6656:(__unused_webpack_module,exports,__webpack_require__)=>{"use strict";eval("\r\n/**\r\n * dd-gridstack.ts 7.3.0\r\n * Copyright (c) 2021 Alain Dumesny - see GridStack root license\r\n */\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.DDGridStack = void 0;\r\nconst utils_1 = __webpack_require__(6480);\r\nconst dd_manager_1 = __webpack_require__(7655);\r\nconst dd_element_1 = __webpack_require__(2373);\r\n// let count = 0; // TEST\r\n/**\r\n * HTML Native Mouse and Touch Events Drag and Drop functionality.\r\n */\r\nclass DDGridStack {\r\n resizable(el, opts, key, value) {\r\n this._getDDElements(el).forEach(dEl => {\r\n if (opts === 'disable' || opts === 'enable') {\r\n dEl.ddResizable && dEl.ddResizable[opts](); // can't create DD as it requires options for setupResizable()\r\n }\r\n else if (opts === 'destroy') {\r\n dEl.ddResizable && dEl.cleanResizable();\r\n }\r\n else if (opts === 'option') {\r\n dEl.setupResizable({ [key]: value });\r\n }\r\n else {\r\n const grid = dEl.el.gridstackNode.grid;\r\n let handles = dEl.el.getAttribute('gs-resize-handles') ? dEl.el.getAttribute('gs-resize-handles') : grid.opts.resizable.handles;\r\n let autoHide = !grid.opts.alwaysShowResizeHandle;\r\n dEl.setupResizable(Object.assign(Object.assign(Object.assign({}, grid.opts.resizable), { handles, autoHide }), {\r\n start: opts.start,\r\n stop: opts.stop,\r\n resize: opts.resize\r\n }));\r\n }\r\n });\r\n return this;\r\n }\r\n draggable(el, opts, key, value) {\r\n this._getDDElements(el).forEach(dEl => {\r\n if (opts === 'disable' || opts === 'enable') {\r\n dEl.ddDraggable && dEl.ddDraggable[opts](); // can't create DD as it requires options for setupDraggable()\r\n }\r\n else if (opts === 'destroy') {\r\n dEl.ddDraggable && dEl.cleanDraggable();\r\n }\r\n else if (opts === 'option') {\r\n dEl.setupDraggable({ [key]: value });\r\n }\r\n else {\r\n const grid = dEl.el.gridstackNode.grid;\r\n dEl.setupDraggable(Object.assign(Object.assign({}, grid.opts.draggable), {\r\n // containment: (grid.parentGridItem && !grid.opts.dragOut) ? grid.el.parentElement : (grid.opts.draggable.containment || null),\r\n start: opts.start,\r\n stop: opts.stop,\r\n drag: opts.drag\r\n }));\r\n }\r\n });\r\n return this;\r\n }\r\n dragIn(el, opts) {\r\n this._getDDElements(el).forEach(dEl => dEl.setupDraggable(opts));\r\n return this;\r\n }\r\n droppable(el, opts, key, value) {\r\n if (typeof opts.accept === 'function' && !opts._accept) {\r\n opts._accept = opts.accept;\r\n opts.accept = (el) => opts._accept(el);\r\n }\r\n this._getDDElements(el).forEach(dEl => {\r\n if (opts === 'disable' || opts === 'enable') {\r\n dEl.ddDroppable && dEl.ddDroppable[opts]();\r\n }\r\n else if (opts === 'destroy') {\r\n if (dEl.ddDroppable) { // error to call destroy if not there\r\n dEl.cleanDroppable();\r\n }\r\n }\r\n else if (opts === 'option') {\r\n dEl.setupDroppable({ [key]: value });\r\n }\r\n else {\r\n dEl.setupDroppable(opts);\r\n }\r\n });\r\n return this;\r\n }\r\n /** true if element is droppable */\r\n isDroppable(el) {\r\n return !!(el && el.ddElement && el.ddElement.ddDroppable && !el.ddElement.ddDroppable.disabled);\r\n }\r\n /** true if element is draggable */\r\n isDraggable(el) {\r\n return !!(el && el.ddElement && el.ddElement.ddDraggable && !el.ddElement.ddDraggable.disabled);\r\n }\r\n /** true if element is draggable */\r\n isResizable(el) {\r\n return !!(el && el.ddElement && el.ddElement.ddResizable && !el.ddElement.ddResizable.disabled);\r\n }\r\n on(el, name, callback) {\r\n this._getDDElements(el).forEach(dEl => dEl.on(name, (event) => {\r\n callback(event, dd_manager_1.DDManager.dragElement ? dd_manager_1.DDManager.dragElement.el : event.target, dd_manager_1.DDManager.dragElement ? dd_manager_1.DDManager.dragElement.helper : null);\r\n }));\r\n return this;\r\n }\r\n off(el, name) {\r\n this._getDDElements(el).forEach(dEl => dEl.off(name));\r\n return this;\r\n }\r\n /** @internal returns a list of DD elements, creating them on the fly by default */\r\n _getDDElements(els, create = true) {\r\n let hosts = utils_1.Utils.getElements(els);\r\n if (!hosts.length)\r\n return [];\r\n let list = hosts.map(e => e.ddElement || (create ? dd_element_1.DDElement.init(e) : null));\r\n if (!create) {\r\n list.filter(d => d);\r\n } // remove nulls\r\n return list;\r\n }\r\n}\r\nexports.DDGridStack = DDGridStack;\r\n//# sourceMappingURL=dd-gridstack.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjY1Ni5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELG1CQUFtQjtBQUNuQixnQkFBZ0IsbUJBQU8sQ0FBQyxJQUFTO0FBQ2pDLHFCQUFxQixtQkFBTyxDQUFDLElBQWM7QUFDM0MscUJBQXFCLG1CQUFPLENBQUMsSUFBYztBQUMzQyxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0REFBNEQ7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyxjQUFjO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrRUFBK0UsMEJBQTBCLG1CQUFtQjtBQUM1SDtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDREQUE0RDtBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLGNBQWM7QUFDbkQ7QUFDQTtBQUNBO0FBQ0EsaUVBQWlFO0FBQ2pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLGNBQWM7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQiIsInNvdXJjZXMiOlsid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZ3JpZHN0YWNrL2Rpc3QvZGQtZ3JpZHN0YWNrLmpzPzZjZjciXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XHJcbi8qKlxyXG4gKiBkZC1ncmlkc3RhY2sudHMgNy4zLjBcclxuICogQ29weXJpZ2h0IChjKSAyMDIxIEFsYWluIER1bWVzbnkgLSBzZWUgR3JpZFN0YWNrIHJvb3QgbGljZW5zZVxyXG4gKi9cclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xyXG5leHBvcnRzLkRER3JpZFN0YWNrID0gdm9pZCAwO1xyXG5jb25zdCB1dGlsc18xID0gcmVxdWlyZShcIi4vdXRpbHNcIik7XHJcbmNvbnN0IGRkX21hbmFnZXJfMSA9IHJlcXVpcmUoXCIuL2RkLW1hbmFnZXJcIik7XHJcbmNvbnN0IGRkX2VsZW1lbnRfMSA9IHJlcXVpcmUoXCIuL2RkLWVsZW1lbnRcIik7XHJcbi8vIGxldCBjb3VudCA9IDA7IC8vIFRFU1RcclxuLyoqXHJcbiAqIEhUTUwgTmF0aXZlIE1vdXNlIGFuZCBUb3VjaCBFdmVudHMgRHJhZyBhbmQgRHJvcCBmdW5jdGlvbmFsaXR5LlxyXG4gKi9cclxuY2xhc3MgRERHcmlkU3RhY2sge1xyXG4gICAgcmVzaXphYmxlKGVsLCBvcHRzLCBrZXksIHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5fZ2V0RERFbGVtZW50cyhlbCkuZm9yRWFjaChkRWwgPT4ge1xyXG4gICAgICAgICAgICBpZiAob3B0cyA9PT0gJ2Rpc2FibGUnIHx8IG9wdHMgPT09ICdlbmFibGUnKSB7XHJcbiAgICAgICAgICAgICAgICBkRWwuZGRSZXNpemFibGUgJiYgZEVsLmRkUmVzaXphYmxlW29wdHNdKCk7IC8vIGNhbid0IGNyZWF0ZSBERCBhcyBpdCByZXF1aXJlcyBvcHRpb25zIGZvciBzZXR1cFJlc2l6YWJsZSgpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAob3B0cyA9PT0gJ2Rlc3Ryb3knKSB7XHJcbiAgICAgICAgICAgICAgICBkRWwuZGRSZXNpemFibGUgJiYgZEVsLmNsZWFuUmVzaXphYmxlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAob3B0cyA9PT0gJ29wdGlvbicpIHtcclxuICAgICAgICAgICAgICAgIGRFbC5zZXR1cFJlc2l6YWJsZSh7IFtrZXldOiB2YWx1ZSB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGdyaWQgPSBkRWwuZWwuZ3JpZHN0YWNrTm9kZS5ncmlkO1xyXG4gICAgICAgICAgICAgICAgbGV0IGhhbmRsZXMgPSBkRWwuZWwuZ2V0QXR0cmlidXRlKCdncy1yZXNpemUtaGFuZGxlcycpID8gZEVsLmVsLmdldEF0dHJpYnV0ZSgnZ3MtcmVzaXplLWhhbmRsZXMnKSA6IGdyaWQub3B0cy5yZXNpemFibGUuaGFuZGxlcztcclxuICAgICAgICAgICAgICAgIGxldCBhdXRvSGlkZSA9ICFncmlkLm9wdHMuYWx3YXlzU2hvd1Jlc2l6ZUhhbmRsZTtcclxuICAgICAgICAgICAgICAgIGRFbC5zZXR1cFJlc2l6YWJsZShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZ3JpZC5vcHRzLnJlc2l6YWJsZSksIHsgaGFuZGxlcywgYXV0b0hpZGUgfSksIHtcclxuICAgICAgICAgICAgICAgICAgICBzdGFydDogb3B0cy5zdGFydCxcclxuICAgICAgICAgICAgICAgICAgICBzdG9wOiBvcHRzLnN0b3AsXHJcbiAgICAgICAgICAgICAgICAgICAgcmVzaXplOiBvcHRzLnJlc2l6ZVxyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICBkcmFnZ2FibGUoZWwsIG9wdHMsIGtleSwgdmFsdWUpIHtcclxuICAgICAgICB0aGlzLl9nZXREREVsZW1lbnRzKGVsKS5mb3JFYWNoKGRFbCA9PiB7XHJcbiAgICAgICAgICAgIGlmIChvcHRzID09PSAnZGlzYWJsZScgfHwgb3B0cyA9PT0gJ2VuYWJsZScpIHtcclxuICAgICAgICAgICAgICAgIGRFbC5kZERyYWdnYWJsZSAmJiBkRWwuZGREcmFnZ2FibGVbb3B0c10oKTsgLy8gY2FuJ3QgY3JlYXRlIEREIGFzIGl0IHJlcXVpcmVzIG9wdGlvbnMgZm9yIHNldHVwRHJhZ2dhYmxlKClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChvcHRzID09PSAnZGVzdHJveScpIHtcclxuICAgICAgICAgICAgICAgIGRFbC5kZERyYWdnYWJsZSAmJiBkRWwuY2xlYW5EcmFnZ2FibGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChvcHRzID09PSAnb3B0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgZEVsLnNldHVwRHJhZ2dhYmxlKHsgW2tleV06IHZhbHVlIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZ3JpZCA9IGRFbC5lbC5ncmlkc3RhY2tOb2RlLmdyaWQ7XHJcbiAgICAgICAgICAgICAgICBkRWwuc2V0dXBEcmFnZ2FibGUoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBncmlkLm9wdHMuZHJhZ2dhYmxlKSwge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnRhaW5tZW50OiAoZ3JpZC5wYXJlbnRHcmlkSXRlbSAmJiAhZ3JpZC5vcHRzLmRyYWdPdXQpID8gZ3JpZC5lbC5wYXJlbnRFbGVtZW50IDogKGdyaWQub3B0cy5kcmFnZ2FibGUuY29udGFpbm1lbnQgfHwgbnVsbCksXHJcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IG9wdHMuc3RhcnQsXHJcbiAgICAgICAgICAgICAgICAgICAgc3RvcDogb3B0cy5zdG9wLFxyXG4gICAgICAgICAgICAgICAgICAgIGRyYWc6IG9wdHMuZHJhZ1xyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICBkcmFnSW4oZWwsIG9wdHMpIHtcclxuICAgICAgICB0aGlzLl9nZXREREVsZW1lbnRzKGVsKS5mb3JFYWNoKGRFbCA9PiBkRWwuc2V0dXBEcmFnZ2FibGUob3B0cykpO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gICAgZHJvcHBhYmxlKGVsLCBvcHRzLCBrZXksIHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRzLmFjY2VwdCA9PT0gJ2Z1bmN0aW9uJyAmJiAhb3B0cy5fYWNjZXB0KSB7XHJcbiAgICAgICAgICAgIG9wdHMuX2FjY2VwdCA9IG9wdHMuYWNjZXB0O1xyXG4gICAgICAgICAgICBvcHRzLmFjY2VwdCA9IChlbCkgPT4gb3B0cy5fYWNjZXB0KGVsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fZ2V0RERFbGVtZW50cyhlbCkuZm9yRWFjaChkRWwgPT4ge1xyXG4gICAgICAgICAgICBpZiAob3B0cyA9PT0gJ2Rpc2FibGUnIHx8IG9wdHMgPT09ICdlbmFibGUnKSB7XHJcbiAgICAgICAgICAgICAgICBkRWwuZGREcm9wcGFibGUgJiYgZEVsLmRkRHJvcHBhYmxlW29wdHNdKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAob3B0cyA9PT0gJ2Rlc3Ryb3knKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZEVsLmRkRHJvcHBhYmxlKSB7IC8vIGVycm9yIHRvIGNhbGwgZGVzdHJveSBpZiBub3QgdGhlcmVcclxuICAgICAgICAgICAgICAgICAgICBkRWwuY2xlYW5Ecm9wcGFibGUoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChvcHRzID09PSAnb3B0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgZEVsLnNldHVwRHJvcHBhYmxlKHsgW2tleV06IHZhbHVlIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZEVsLnNldHVwRHJvcHBhYmxlKG9wdHMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICAvKiogdHJ1ZSBpZiBlbGVtZW50IGlzIGRyb3BwYWJsZSAqL1xyXG4gICAgaXNEcm9wcGFibGUoZWwpIHtcclxuICAgICAgICByZXR1cm4gISEoZWwgJiYgZWwuZGRFbGVtZW50ICYmIGVsLmRkRWxlbWVudC5kZERyb3BwYWJsZSAmJiAhZWwuZGRFbGVtZW50LmRkRHJvcHBhYmxlLmRpc2FibGVkKTtcclxuICAgIH1cclxuICAgIC8qKiB0cnVlIGlmIGVsZW1lbnQgaXMgZHJhZ2dhYmxlICovXHJcbiAgICBpc0RyYWdnYWJsZShlbCkge1xyXG4gICAgICAgIHJldHVybiAhIShlbCAmJiBlbC5kZEVsZW1lbnQgJiYgZWwuZGRFbGVtZW50LmRkRHJhZ2dhYmxlICYmICFlbC5kZEVsZW1lbnQuZGREcmFnZ2FibGUuZGlzYWJsZWQpO1xyXG4gICAgfVxyXG4gICAgLyoqIHRydWUgaWYgZWxlbWVudCBpcyBkcmFnZ2FibGUgKi9cclxuICAgIGlzUmVzaXphYmxlKGVsKSB7XHJcbiAgICAgICAgcmV0dXJuICEhKGVsICYmIGVsLmRkRWxlbWVudCAmJiBlbC5kZEVsZW1lbnQuZGRSZXNpemFibGUgJiYgIWVsLmRkRWxlbWVudC5kZFJlc2l6YWJsZS5kaXNhYmxlZCk7XHJcbiAgICB9XHJcbiAgICBvbihlbCwgbmFtZSwgY2FsbGJhY2spIHtcclxuICAgICAgICB0aGlzLl9nZXREREVsZW1lbnRzKGVsKS5mb3JFYWNoKGRFbCA9PiBkRWwub24obmFtZSwgKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgIGNhbGxiYWNrKGV2ZW50LCBkZF9tYW5hZ2VyXzEuRERNYW5hZ2VyLmRyYWdFbGVtZW50ID8gZGRfbWFuYWdlcl8xLkRETWFuYWdlci5kcmFnRWxlbWVudC5lbCA6IGV2ZW50LnRhcmdldCwgZGRfbWFuYWdlcl8xLkRETWFuYWdlci5kcmFnRWxlbWVudCA/IGRkX21hbmFnZXJfMS5ERE1hbmFnZXIuZHJhZ0VsZW1lbnQuaGVscGVyIDogbnVsbCk7XHJcbiAgICAgICAgfSkpO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gICAgb2ZmKGVsLCBuYW1lKSB7XHJcbiAgICAgICAgdGhpcy5fZ2V0RERFbGVtZW50cyhlbCkuZm9yRWFjaChkRWwgPT4gZEVsLm9mZihuYW1lKSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICAvKiogQGludGVybmFsIHJldHVybnMgYSBsaXN0IG9mIEREIGVsZW1lbnRzLCBjcmVhdGluZyB0aGVtIG9uIHRoZSBmbHkgYnkgZGVmYXVsdCAqL1xyXG4gICAgX2dldERERWxlbWVudHMoZWxzLCBjcmVhdGUgPSB0cnVlKSB7XHJcbiAgICAgICAgbGV0IGhvc3RzID0gdXRpbHNfMS5VdGlscy5nZXRFbGVtZW50cyhlbHMpO1xyXG4gICAgICAgIGlmICghaG9zdHMubGVuZ3RoKVxyXG4gICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgbGV0IGxpc3QgPSBob3N0cy5tYXAoZSA9PiBlLmRkRWxlbWVudCB8fCAoY3JlYXRlID8gZGRfZWxlbWVudF8xLkRERWxlbWVudC5pbml0KGUpIDogbnVsbCkpO1xyXG4gICAgICAgIGlmICghY3JlYXRlKSB7XHJcbiAgICAgICAgICAgIGxpc3QuZmlsdGVyKGQgPT4gZCk7XHJcbiAgICAgICAgfSAvLyByZW1vdmUgbnVsbHNcclxuICAgICAgICByZXR1cm4gbGlzdDtcclxuICAgIH1cclxufVxyXG5leHBvcnRzLkRER3JpZFN0YWNrID0gRERHcmlkU3RhY2s7XHJcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRkLWdyaWRzdGFjay5qcy5tYXAiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///6656\n")},7655:(__unused_webpack_module,exports)=>{"use strict";eval('\r\n/**\r\n * dd-manager.ts 7.3.0\r\n * Copyright (c) 2021 Alain Dumesny - see GridStack root license\r\n */\r\nObject.defineProperty(exports, "__esModule", ({ value: true }));\r\nexports.DDManager = void 0;\r\n/**\r\n * globals that are shared across Drag & Drop instances\r\n */\r\nclass DDManager {\r\n}\r\nexports.DDManager = DDManager;\r\n//# sourceMappingURL=dd-manager.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzY1NS5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL25vZGVfbW9kdWxlcy9ncmlkc3RhY2svZGlzdC9kZC1tYW5hZ2VyLmpzP2M3YTYiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XHJcbi8qKlxyXG4gKiBkZC1tYW5hZ2VyLnRzIDcuMy4wXHJcbiAqIENvcHlyaWdodCAoYykgMjAyMSBBbGFpbiBEdW1lc255IC0gc2VlIEdyaWRTdGFjayByb290IGxpY2Vuc2VcclxuICovXHJcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcclxuZXhwb3J0cy5ERE1hbmFnZXIgPSB2b2lkIDA7XHJcbi8qKlxyXG4gKiBnbG9iYWxzIHRoYXQgYXJlIHNoYXJlZCBhY3Jvc3MgRHJhZyAmIERyb3AgaW5zdGFuY2VzXHJcbiAqL1xyXG5jbGFzcyBERE1hbmFnZXIge1xyXG59XHJcbmV4cG9ydHMuRERNYW5hZ2VyID0gRERNYW5hZ2VyO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZC1tYW5hZ2VyLmpzLm1hcCJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///7655\n')},6565:(__unused_webpack_module,exports,__webpack_require__)=>{"use strict";eval("\r\n/**\r\n * dd-resizable-handle.ts 7.3.0\r\n * Copyright (c) 2021-2022 Alain Dumesny - see GridStack root license\r\n */\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.DDResizableHandle = void 0;\r\nconst dd_touch_1 = __webpack_require__(4770);\r\nclass DDResizableHandle {\r\n constructor(host, direction, option) {\r\n /** @internal true after we've moved enough pixels to start a resize */\r\n this.moving = false;\r\n this.host = host;\r\n this.dir = direction;\r\n this.option = option;\r\n // create var event binding so we can easily remove and still look like TS methods (unlike anonymous functions)\r\n this._mouseDown = this._mouseDown.bind(this);\r\n this._mouseMove = this._mouseMove.bind(this);\r\n this._mouseUp = this._mouseUp.bind(this);\r\n this._init();\r\n }\r\n /** @internal */\r\n _init() {\r\n const el = document.createElement('div');\r\n el.classList.add('ui-resizable-handle');\r\n el.classList.add(`${DDResizableHandle.prefix}${this.dir}`);\r\n el.style.zIndex = '100';\r\n el.style.userSelect = 'none';\r\n this.el = el;\r\n this.host.appendChild(this.el);\r\n this.el.addEventListener('mousedown', this._mouseDown);\r\n if (dd_touch_1.isTouch) {\r\n this.el.addEventListener('touchstart', dd_touch_1.touchstart);\r\n this.el.addEventListener('pointerdown', dd_touch_1.pointerdown);\r\n // this.el.style.touchAction = 'none'; // not needed unlike pointerdown doc comment\r\n }\r\n return this;\r\n }\r\n /** call this when resize handle needs to be removed and cleaned up */\r\n destroy() {\r\n if (this.moving)\r\n this._mouseUp(this.mouseDownEvent);\r\n this.el.removeEventListener('mousedown', this._mouseDown);\r\n if (dd_touch_1.isTouch) {\r\n this.el.removeEventListener('touchstart', dd_touch_1.touchstart);\r\n this.el.removeEventListener('pointerdown', dd_touch_1.pointerdown);\r\n }\r\n this.host.removeChild(this.el);\r\n delete this.el;\r\n delete this.host;\r\n return this;\r\n }\r\n /** @internal called on mouse down on us: capture move on the entire document (mouse might not stay on us) until we release the mouse */\r\n _mouseDown(e) {\r\n this.mouseDownEvent = e;\r\n document.addEventListener('mousemove', this._mouseMove, true); // capture, not bubble\r\n document.addEventListener('mouseup', this._mouseUp, true);\r\n if (dd_touch_1.isTouch) {\r\n this.el.addEventListener('touchmove', dd_touch_1.touchmove);\r\n this.el.addEventListener('touchend', dd_touch_1.touchend);\r\n }\r\n e.stopPropagation();\r\n e.preventDefault();\r\n }\r\n /** @internal */\r\n _mouseMove(e) {\r\n let s = this.mouseDownEvent;\r\n if (this.moving) {\r\n this._triggerEvent('move', e);\r\n }\r\n else if (Math.abs(e.x - s.x) + Math.abs(e.y - s.y) > 2) {\r\n // don't start unless we've moved at least 3 pixels\r\n this.moving = true;\r\n this._triggerEvent('start', this.mouseDownEvent);\r\n this._triggerEvent('move', e);\r\n }\r\n e.stopPropagation();\r\n e.preventDefault();\r\n }\r\n /** @internal */\r\n _mouseUp(e) {\r\n if (this.moving) {\r\n this._triggerEvent('stop', e);\r\n }\r\n document.removeEventListener('mousemove', this._mouseMove, true);\r\n document.removeEventListener('mouseup', this._mouseUp, true);\r\n if (dd_touch_1.isTouch) {\r\n this.el.removeEventListener('touchmove', dd_touch_1.touchmove);\r\n this.el.removeEventListener('touchend', dd_touch_1.touchend);\r\n }\r\n delete this.moving;\r\n delete this.mouseDownEvent;\r\n e.stopPropagation();\r\n e.preventDefault();\r\n }\r\n /** @internal */\r\n _triggerEvent(name, event) {\r\n if (this.option[name])\r\n this.option[name](event);\r\n return this;\r\n }\r\n}\r\nexports.DDResizableHandle = DDResizableHandle;\r\n/** @internal */\r\nDDResizableHandle.prefix = 'ui-resizable-';\r\n//# sourceMappingURL=dd-resizable-handle.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjU2NS5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELHlCQUF5QjtBQUN6QixtQkFBbUIsbUJBQU8sQ0FBQyxJQUFZO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIseUJBQXlCLEVBQUUsU0FBUztBQUNoRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1EO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1RUFBdUU7QUFDdkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL25vZGVfbW9kdWxlcy9ncmlkc3RhY2svZGlzdC9kZC1yZXNpemFibGUtaGFuZGxlLmpzPzk1ODQiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XHJcbi8qKlxyXG4gKiBkZC1yZXNpemFibGUtaGFuZGxlLnRzIDcuMy4wXHJcbiAqIENvcHlyaWdodCAoYykgMjAyMS0yMDIyIEFsYWluIER1bWVzbnkgLSBzZWUgR3JpZFN0YWNrIHJvb3QgbGljZW5zZVxyXG4gKi9cclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xyXG5leHBvcnRzLkREUmVzaXphYmxlSGFuZGxlID0gdm9pZCAwO1xyXG5jb25zdCBkZF90b3VjaF8xID0gcmVxdWlyZShcIi4vZGQtdG91Y2hcIik7XHJcbmNsYXNzIEREUmVzaXphYmxlSGFuZGxlIHtcclxuICAgIGNvbnN0cnVjdG9yKGhvc3QsIGRpcmVjdGlvbiwgb3B0aW9uKSB7XHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCB0cnVlIGFmdGVyIHdlJ3ZlIG1vdmVkIGVub3VnaCBwaXhlbHMgdG8gc3RhcnQgYSByZXNpemUgKi9cclxuICAgICAgICB0aGlzLm1vdmluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuaG9zdCA9IGhvc3Q7XHJcbiAgICAgICAgdGhpcy5kaXIgPSBkaXJlY3Rpb247XHJcbiAgICAgICAgdGhpcy5vcHRpb24gPSBvcHRpb247XHJcbiAgICAgICAgLy8gY3JlYXRlIHZhciBldmVudCBiaW5kaW5nIHNvIHdlIGNhbiBlYXNpbHkgcmVtb3ZlIGFuZCBzdGlsbCBsb29rIGxpa2UgVFMgbWV0aG9kcyAodW5saWtlIGFub255bW91cyBmdW5jdGlvbnMpXHJcbiAgICAgICAgdGhpcy5fbW91c2VEb3duID0gdGhpcy5fbW91c2VEb3duLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5fbW91c2VNb3ZlID0gdGhpcy5fbW91c2VNb3ZlLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5fbW91c2VVcCA9IHRoaXMuX21vdXNlVXAuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLl9pbml0KCk7XHJcbiAgICB9XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBfaW5pdCgpIHtcclxuICAgICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIGVsLmNsYXNzTGlzdC5hZGQoJ3VpLXJlc2l6YWJsZS1oYW5kbGUnKTtcclxuICAgICAgICBlbC5jbGFzc0xpc3QuYWRkKGAke0REUmVzaXphYmxlSGFuZGxlLnByZWZpeH0ke3RoaXMuZGlyfWApO1xyXG4gICAgICAgIGVsLnN0eWxlLnpJbmRleCA9ICcxMDAnO1xyXG4gICAgICAgIGVsLnN0eWxlLnVzZXJTZWxlY3QgPSAnbm9uZSc7XHJcbiAgICAgICAgdGhpcy5lbCA9IGVsO1xyXG4gICAgICAgIHRoaXMuaG9zdC5hcHBlbmRDaGlsZCh0aGlzLmVsKTtcclxuICAgICAgICB0aGlzLmVsLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMuX21vdXNlRG93bik7XHJcbiAgICAgICAgaWYgKGRkX3RvdWNoXzEuaXNUb3VjaCkge1xyXG4gICAgICAgICAgICB0aGlzLmVsLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBkZF90b3VjaF8xLnRvdWNoc3RhcnQpO1xyXG4gICAgICAgICAgICB0aGlzLmVsLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgZGRfdG91Y2hfMS5wb2ludGVyZG93bik7XHJcbiAgICAgICAgICAgIC8vIHRoaXMuZWwuc3R5bGUudG91Y2hBY3Rpb24gPSAnbm9uZSc7IC8vIG5vdCBuZWVkZWQgdW5saWtlIHBvaW50ZXJkb3duIGRvYyBjb21tZW50XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gICAgLyoqIGNhbGwgdGhpcyB3aGVuIHJlc2l6ZSBoYW5kbGUgbmVlZHMgdG8gYmUgcmVtb3ZlZCBhbmQgY2xlYW5lZCB1cCAqL1xyXG4gICAgZGVzdHJveSgpIHtcclxuICAgICAgICBpZiAodGhpcy5tb3ZpbmcpXHJcbiAgICAgICAgICAgIHRoaXMuX21vdXNlVXAodGhpcy5tb3VzZURvd25FdmVudCk7XHJcbiAgICAgICAgdGhpcy5lbC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLl9tb3VzZURvd24pO1xyXG4gICAgICAgIGlmIChkZF90b3VjaF8xLmlzVG91Y2gpIHtcclxuICAgICAgICAgICAgdGhpcy5lbC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgZGRfdG91Y2hfMS50b3VjaHN0YXJ0KTtcclxuICAgICAgICAgICAgdGhpcy5lbC5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIGRkX3RvdWNoXzEucG9pbnRlcmRvd24pO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmhvc3QucmVtb3ZlQ2hpbGQodGhpcy5lbCk7XHJcbiAgICAgICAgZGVsZXRlIHRoaXMuZWw7XHJcbiAgICAgICAgZGVsZXRlIHRoaXMuaG9zdDtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICAgIC8qKiBAaW50ZXJuYWwgY2FsbGVkIG9uIG1vdXNlIGRvd24gb24gdXM6IGNhcHR1cmUgbW92ZSBvbiB0aGUgZW50aXJlIGRvY3VtZW50IChtb3VzZSBtaWdodCBub3Qgc3RheSBvbiB1cykgdW50aWwgd2UgcmVsZWFzZSB0aGUgbW91c2UgKi9cclxuICAgIF9tb3VzZURvd24oZSkge1xyXG4gICAgICAgIHRoaXMubW91c2VEb3duRXZlbnQgPSBlO1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuX21vdXNlTW92ZSwgdHJ1ZSk7IC8vIGNhcHR1cmUsIG5vdCBidWJibGVcclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5fbW91c2VVcCwgdHJ1ZSk7XHJcbiAgICAgICAgaWYgKGRkX3RvdWNoXzEuaXNUb3VjaCkge1xyXG4gICAgICAgICAgICB0aGlzLmVsLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIGRkX3RvdWNoXzEudG91Y2htb3ZlKTtcclxuICAgICAgICAgICAgdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIGRkX3RvdWNoXzEudG91Y2hlbmQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgIH1cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIF9tb3VzZU1vdmUoZSkge1xyXG4gICAgICAgIGxldCBzID0gdGhpcy5tb3VzZURvd25FdmVudDtcclxuICAgICAgICBpZiAodGhpcy5tb3ZpbmcpIHtcclxuICAgICAgICAgICAgdGhpcy5fdHJpZ2dlckV2ZW50KCdtb3ZlJywgZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKE1hdGguYWJzKGUueCAtIHMueCkgKyBNYXRoLmFicyhlLnkgLSBzLnkpID4gMikge1xyXG4gICAgICAgICAgICAvLyBkb24ndCBzdGFydCB1bmxlc3Mgd2UndmUgbW92ZWQgYXQgbGVhc3QgMyBwaXhlbHNcclxuICAgICAgICAgICAgdGhpcy5tb3ZpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLl90cmlnZ2VyRXZlbnQoJ3N0YXJ0JywgdGhpcy5tb3VzZURvd25FdmVudCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3RyaWdnZXJFdmVudCgnbW92ZScsIGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgIH1cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIF9tb3VzZVVwKGUpIHtcclxuICAgICAgICBpZiAodGhpcy5tb3ZpbmcpIHtcclxuICAgICAgICAgICAgdGhpcy5fdHJpZ2dlckV2ZW50KCdzdG9wJywgZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuX21vdXNlTW92ZSwgdHJ1ZSk7XHJcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuX21vdXNlVXAsIHRydWUpO1xyXG4gICAgICAgIGlmIChkZF90b3VjaF8xLmlzVG91Y2gpIHtcclxuICAgICAgICAgICAgdGhpcy5lbC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBkZF90b3VjaF8xLnRvdWNobW92ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBkZF90b3VjaF8xLnRvdWNoZW5kKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZGVsZXRlIHRoaXMubW92aW5nO1xyXG4gICAgICAgIGRlbGV0ZSB0aGlzLm1vdXNlRG93bkV2ZW50O1xyXG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgfVxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgX3RyaWdnZXJFdmVudChuYW1lLCBldmVudCkge1xyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbltuYW1lXSlcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25bbmFtZV0oZXZlbnQpO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG59XHJcbmV4cG9ydHMuRERSZXNpemFibGVIYW5kbGUgPSBERFJlc2l6YWJsZUhhbmRsZTtcclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5ERFJlc2l6YWJsZUhhbmRsZS5wcmVmaXggPSAndWktcmVzaXphYmxlLSc7XHJcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRkLXJlc2l6YWJsZS1oYW5kbGUuanMubWFwIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///6565\n")},9326:(__unused_webpack_module,exports,__webpack_require__)=>{"use strict";eval("\r\n/**\r\n * dd-resizable.ts 7.3.0\r\n * Copyright (c) 2021-2022 Alain Dumesny - see GridStack root license\r\n */\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.DDResizable = void 0;\r\nconst dd_resizable_handle_1 = __webpack_require__(6565);\r\nconst dd_base_impl_1 = __webpack_require__(7955);\r\nconst utils_1 = __webpack_require__(6480);\r\nconst dd_manager_1 = __webpack_require__(7655);\r\nclass DDResizable extends dd_base_impl_1.DDBaseImplement {\r\n constructor(el, opts = {}) {\r\n super();\r\n /** @internal */\r\n this._ui = () => {\r\n const containmentEl = this.el.parentElement;\r\n const containmentRect = containmentEl.getBoundingClientRect();\r\n const newRect = {\r\n width: this.originalRect.width,\r\n height: this.originalRect.height + this.scrolled,\r\n left: this.originalRect.left,\r\n top: this.originalRect.top - this.scrolled\r\n };\r\n const rect = this.temporalRect || newRect;\r\n return {\r\n position: {\r\n left: rect.left - containmentRect.left,\r\n top: rect.top - containmentRect.top\r\n },\r\n size: {\r\n width: rect.width,\r\n height: rect.height\r\n }\r\n /* Gridstack ONLY needs position set above... keep around in case.\r\n element: [this.el], // The object representing the element to be resized\r\n helper: [], // TODO: not support yet - The object representing the helper that's being resized\r\n originalElement: [this.el],// we don't wrap here, so simplify as this.el //The object representing the original element before it is wrapped\r\n originalPosition: { // The position represented as { left, top } before the resizable is resized\r\n left: this.originalRect.left - containmentRect.left,\r\n top: this.originalRect.top - containmentRect.top\r\n },\r\n originalSize: { // The size represented as { width, height } before the resizable is resized\r\n width: this.originalRect.width,\r\n height: this.originalRect.height\r\n }\r\n */\r\n };\r\n };\r\n this.el = el;\r\n this.option = opts;\r\n // create var event binding so we can easily remove and still look like TS methods (unlike anonymous functions)\r\n this._mouseOver = this._mouseOver.bind(this);\r\n this._mouseOut = this._mouseOut.bind(this);\r\n this.enable();\r\n this._setupAutoHide(this.option.autoHide);\r\n this._setupHandlers();\r\n }\r\n on(event, callback) {\r\n super.on(event, callback);\r\n }\r\n off(event) {\r\n super.off(event);\r\n }\r\n enable() {\r\n super.enable();\r\n this.el.classList.add('ui-resizable');\r\n this.el.classList.remove('ui-resizable-disabled');\r\n this._setupAutoHide(this.option.autoHide);\r\n }\r\n disable() {\r\n super.disable();\r\n this.el.classList.add('ui-resizable-disabled');\r\n this.el.classList.remove('ui-resizable');\r\n this._setupAutoHide(false);\r\n }\r\n destroy() {\r\n this._removeHandlers();\r\n this._setupAutoHide(false);\r\n this.el.classList.remove('ui-resizable');\r\n delete this.el;\r\n super.destroy();\r\n }\r\n updateOption(opts) {\r\n let updateHandles = (opts.handles && opts.handles !== this.option.handles);\r\n let updateAutoHide = (opts.autoHide && opts.autoHide !== this.option.autoHide);\r\n Object.keys(opts).forEach(key => this.option[key] = opts[key]);\r\n if (updateHandles) {\r\n this._removeHandlers();\r\n this._setupHandlers();\r\n }\r\n if (updateAutoHide) {\r\n this._setupAutoHide(this.option.autoHide);\r\n }\r\n return this;\r\n }\r\n /** @internal turns auto hide on/off */\r\n _setupAutoHide(auto) {\r\n if (auto) {\r\n this.el.classList.add('ui-resizable-autohide');\r\n // use mouseover and not mouseenter to get better performance and track for nested cases\r\n this.el.addEventListener('mouseover', this._mouseOver);\r\n this.el.addEventListener('mouseout', this._mouseOut);\r\n }\r\n else {\r\n this.el.classList.remove('ui-resizable-autohide');\r\n this.el.removeEventListener('mouseover', this._mouseOver);\r\n this.el.removeEventListener('mouseout', this._mouseOut);\r\n if (dd_manager_1.DDManager.overResizeElement === this) {\r\n delete dd_manager_1.DDManager.overResizeElement;\r\n }\r\n }\r\n return this;\r\n }\r\n /** @internal */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n _mouseOver(e) {\r\n // console.log(`${count++} pre-enter ${(this.el as GridItemHTMLElement).gridstackNode._id}`)\r\n // already over a child, ignore. Ideally we just call e.stopPropagation() but see https://github.com/gridstack/gridstack.js/issues/2018\r\n if (dd_manager_1.DDManager.overResizeElement || dd_manager_1.DDManager.dragElement)\r\n return;\r\n dd_manager_1.DDManager.overResizeElement = this;\r\n // console.log(`${count++} enter ${(this.el as GridItemHTMLElement).gridstackNode._id}`)\r\n this.el.classList.remove('ui-resizable-autohide');\r\n }\r\n /** @internal */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n _mouseOut(e) {\r\n // console.log(`${count++} pre-leave ${(this.el as GridItemHTMLElement).gridstackNode._id}`)\r\n if (dd_manager_1.DDManager.overResizeElement !== this)\r\n return;\r\n delete dd_manager_1.DDManager.overResizeElement;\r\n // console.log(`${count++} leave ${(this.el as GridItemHTMLElement).gridstackNode._id}`)\r\n this.el.classList.add('ui-resizable-autohide');\r\n }\r\n /** @internal */\r\n _setupHandlers() {\r\n let handlerDirection = this.option.handles || 'e,s,se';\r\n if (handlerDirection === 'all') {\r\n handlerDirection = 'n,e,s,w,se,sw,ne,nw';\r\n }\r\n this.handlers = handlerDirection.split(',')\r\n .map(dir => dir.trim())\r\n .map(dir => new dd_resizable_handle_1.DDResizableHandle(this.el, dir, {\r\n start: (event) => {\r\n this._resizeStart(event);\r\n },\r\n stop: (event) => {\r\n this._resizeStop(event);\r\n },\r\n move: (event) => {\r\n this._resizing(event, dir);\r\n }\r\n }));\r\n return this;\r\n }\r\n /** @internal */\r\n _resizeStart(event) {\r\n this.originalRect = this.el.getBoundingClientRect();\r\n this.scrollEl = utils_1.Utils.getScrollElement(this.el);\r\n this.scrollY = this.scrollEl.scrollTop;\r\n this.scrolled = 0;\r\n this.startEvent = event;\r\n this._setupHelper();\r\n this._applyChange();\r\n const ev = utils_1.Utils.initEvent(event, { type: 'resizestart', target: this.el });\r\n if (this.option.start) {\r\n this.option.start(ev, this._ui());\r\n }\r\n this.el.classList.add('ui-resizable-resizing');\r\n this.triggerEvent('resizestart', ev);\r\n return this;\r\n }\r\n /** @internal */\r\n _resizing(event, dir) {\r\n this.scrolled = this.scrollEl.scrollTop - this.scrollY;\r\n this.temporalRect = this._getChange(event, dir);\r\n this._applyChange();\r\n const ev = utils_1.Utils.initEvent(event, { type: 'resize', target: this.el });\r\n if (this.option.resize) {\r\n this.option.resize(ev, this._ui());\r\n }\r\n this.triggerEvent('resize', ev);\r\n return this;\r\n }\r\n /** @internal */\r\n _resizeStop(event) {\r\n const ev = utils_1.Utils.initEvent(event, { type: 'resizestop', target: this.el });\r\n if (this.option.stop) {\r\n this.option.stop(ev); // Note: ui() not used by gridstack so don't pass\r\n }\r\n this.el.classList.remove('ui-resizable-resizing');\r\n this.triggerEvent('resizestop', ev);\r\n this._cleanHelper();\r\n delete this.startEvent;\r\n delete this.originalRect;\r\n delete this.temporalRect;\r\n delete this.scrollY;\r\n delete this.scrolled;\r\n return this;\r\n }\r\n /** @internal */\r\n _setupHelper() {\r\n this.elOriginStyleVal = DDResizable._originStyleProp.map(prop => this.el.style[prop]);\r\n this.parentOriginStylePosition = this.el.parentElement.style.position;\r\n if (window.getComputedStyle(this.el.parentElement).position.match(/static/)) {\r\n this.el.parentElement.style.position = 'relative';\r\n }\r\n this.el.style.position = 'absolute';\r\n this.el.style.opacity = '0.8';\r\n return this;\r\n }\r\n /** @internal */\r\n _cleanHelper() {\r\n DDResizable._originStyleProp.forEach((prop, i) => {\r\n this.el.style[prop] = this.elOriginStyleVal[i] || null;\r\n });\r\n this.el.parentElement.style.position = this.parentOriginStylePosition || null;\r\n return this;\r\n }\r\n /** @internal */\r\n _getChange(event, dir) {\r\n const oEvent = this.startEvent;\r\n const newRect = {\r\n width: this.originalRect.width,\r\n height: this.originalRect.height + this.scrolled,\r\n left: this.originalRect.left,\r\n top: this.originalRect.top - this.scrolled\r\n };\r\n const offsetX = event.clientX - oEvent.clientX;\r\n const offsetY = event.clientY - oEvent.clientY;\r\n if (dir.indexOf('e') > -1) {\r\n newRect.width += offsetX;\r\n }\r\n else if (dir.indexOf('w') > -1) {\r\n newRect.width -= offsetX;\r\n newRect.left += offsetX;\r\n }\r\n if (dir.indexOf('s') > -1) {\r\n newRect.height += offsetY;\r\n }\r\n else if (dir.indexOf('n') > -1) {\r\n newRect.height -= offsetY;\r\n newRect.top += offsetY;\r\n }\r\n const constrain = this._constrainSize(newRect.width, newRect.height);\r\n if (Math.round(newRect.width) !== Math.round(constrain.width)) { // round to ignore slight round-off errors\r\n if (dir.indexOf('w') > -1) {\r\n newRect.left += newRect.width - constrain.width;\r\n }\r\n newRect.width = constrain.width;\r\n }\r\n if (Math.round(newRect.height) !== Math.round(constrain.height)) {\r\n if (dir.indexOf('n') > -1) {\r\n newRect.top += newRect.height - constrain.height;\r\n }\r\n newRect.height = constrain.height;\r\n }\r\n return newRect;\r\n }\r\n /** @internal constrain the size to the set min/max values */\r\n _constrainSize(oWidth, oHeight) {\r\n const maxWidth = this.option.maxWidth || Number.MAX_SAFE_INTEGER;\r\n const minWidth = this.option.minWidth || oWidth;\r\n const maxHeight = this.option.maxHeight || Number.MAX_SAFE_INTEGER;\r\n const minHeight = this.option.minHeight || oHeight;\r\n const width = Math.min(maxWidth, Math.max(minWidth, oWidth));\r\n const height = Math.min(maxHeight, Math.max(minHeight, oHeight));\r\n return { width, height };\r\n }\r\n /** @internal */\r\n _applyChange() {\r\n let containmentRect = { left: 0, top: 0, width: 0, height: 0 };\r\n if (this.el.style.position === 'absolute') {\r\n const containmentEl = this.el.parentElement;\r\n const { left, top } = containmentEl.getBoundingClientRect();\r\n containmentRect = { left, top, width: 0, height: 0 };\r\n }\r\n if (!this.temporalRect)\r\n return this;\r\n Object.keys(this.temporalRect).forEach(key => {\r\n const value = this.temporalRect[key];\r\n this.el.style[key] = value - containmentRect[key] + 'px';\r\n });\r\n return this;\r\n }\r\n /** @internal */\r\n _removeHandlers() {\r\n this.handlers.forEach(handle => handle.destroy());\r\n delete this.handlers;\r\n return this;\r\n }\r\n}\r\nexports.DDResizable = DDResizable;\r\n/** @internal */\r\nDDResizable._originStyleProp = ['width', 'height', 'position', 'left', 'top', 'opacity', 'zIndex'];\r\n//# sourceMappingURL=dd-resizable.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Q2hDO0FBQ0E7QUFDQSxvQkFBb0IsWUFBWTtBQUNoQyxnQ0FBZ0M7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vbm9kZV9tb2R1bGVzL2dyaWRzdGFjay9kaXN0L2RkLXJlc2l6YWJsZS5qcz9jZjQ4Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xyXG4vKipcclxuICogZGQtcmVzaXphYmxlLnRzIDcuMy4wXHJcbiAqIENvcHlyaWdodCAoYykgMjAyMS0yMDIyIEFsYWluIER1bWVzbnkgLSBzZWUgR3JpZFN0YWNrIHJvb3QgbGljZW5zZVxyXG4gKi9cclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xyXG5leHBvcnRzLkREUmVzaXphYmxlID0gdm9pZCAwO1xyXG5jb25zdCBkZF9yZXNpemFibGVfaGFuZGxlXzEgPSByZXF1aXJlKFwiLi9kZC1yZXNpemFibGUtaGFuZGxlXCIpO1xyXG5jb25zdCBkZF9iYXNlX2ltcGxfMSA9IHJlcXVpcmUoXCIuL2RkLWJhc2UtaW1wbFwiKTtcclxuY29uc3QgdXRpbHNfMSA9IHJlcXVpcmUoXCIuL3V0aWxzXCIpO1xyXG5jb25zdCBkZF9tYW5hZ2VyXzEgPSByZXF1aXJlKFwiLi9kZC1tYW5hZ2VyXCIpO1xyXG5jbGFzcyBERFJlc2l6YWJsZSBleHRlbmRzIGRkX2Jhc2VfaW1wbF8xLkREQmFzZUltcGxlbWVudCB7XHJcbiAgICBjb25zdHJ1Y3RvcihlbCwgb3B0cyA9IHt9KSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgdGhpcy5fdWkgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5tZW50RWwgPSB0aGlzLmVsLnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5tZW50UmVjdCA9IGNvbnRhaW5tZW50RWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgICAgIGNvbnN0IG5ld1JlY3QgPSB7XHJcbiAgICAgICAgICAgICAgICB3aWR0aDogdGhpcy5vcmlnaW5hbFJlY3Qud2lkdGgsXHJcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IHRoaXMub3JpZ2luYWxSZWN0LmhlaWdodCArIHRoaXMuc2Nyb2xsZWQsXHJcbiAgICAgICAgICAgICAgICBsZWZ0OiB0aGlzLm9yaWdpbmFsUmVjdC5sZWZ0LFxyXG4gICAgICAgICAgICAgICAgdG9wOiB0aGlzLm9yaWdpbmFsUmVjdC50b3AgLSB0aGlzLnNjcm9sbGVkXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLnRlbXBvcmFsUmVjdCB8fCBuZXdSZWN0O1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgcG9zaXRpb246IHtcclxuICAgICAgICAgICAgICAgICAgICBsZWZ0OiByZWN0LmxlZnQgLSBjb250YWlubWVudFJlY3QubGVmdCxcclxuICAgICAgICAgICAgICAgICAgICB0b3A6IHJlY3QudG9wIC0gY29udGFpbm1lbnRSZWN0LnRvcFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHNpemU6IHtcclxuICAgICAgICAgICAgICAgICAgICB3aWR0aDogcmVjdC53aWR0aCxcclxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IHJlY3QuaGVpZ2h0XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvKiBHcmlkc3RhY2sgT05MWSBuZWVkcyBwb3NpdGlvbiBzZXQgYWJvdmUuLi4ga2VlcCBhcm91bmQgaW4gY2FzZS5cclxuICAgICAgICAgICAgICAgIGVsZW1lbnQ6IFt0aGlzLmVsXSwgLy8gVGhlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGVsZW1lbnQgdG8gYmUgcmVzaXplZFxyXG4gICAgICAgICAgICAgICAgaGVscGVyOiBbXSwgLy8gVE9ETzogbm90IHN1cHBvcnQgeWV0IC0gVGhlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGhlbHBlciB0aGF0J3MgYmVpbmcgcmVzaXplZFxyXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxFbGVtZW50OiBbdGhpcy5lbF0sLy8gd2UgZG9uJ3Qgd3JhcCBoZXJlLCBzbyBzaW1wbGlmeSBhcyB0aGlzLmVsIC8vVGhlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIG9yaWdpbmFsIGVsZW1lbnQgYmVmb3JlIGl0IGlzIHdyYXBwZWRcclxuICAgICAgICAgICAgICAgIG9yaWdpbmFsUG9zaXRpb246IHsgLy8gVGhlIHBvc2l0aW9uIHJlcHJlc2VudGVkIGFzIHsgbGVmdCwgdG9wIH0gYmVmb3JlIHRoZSByZXNpemFibGUgaXMgcmVzaXplZFxyXG4gICAgICAgICAgICAgICAgICBsZWZ0OiB0aGlzLm9yaWdpbmFsUmVjdC5sZWZ0IC0gY29udGFpbm1lbnRSZWN0LmxlZnQsXHJcbiAgICAgICAgICAgICAgICAgIHRvcDogdGhpcy5vcmlnaW5hbFJlY3QudG9wIC0gY29udGFpbm1lbnRSZWN0LnRvcFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIG9yaWdpbmFsU2l6ZTogeyAvLyBUaGUgc2l6ZSByZXByZXNlbnRlZCBhcyB7IHdpZHRoLCBoZWlnaHQgfSBiZWZvcmUgdGhlIHJlc2l6YWJsZSBpcyByZXNpemVkXHJcbiAgICAgICAgICAgICAgICAgIHdpZHRoOiB0aGlzLm9yaWdpbmFsUmVjdC53aWR0aCxcclxuICAgICAgICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLm9yaWdpbmFsUmVjdC5oZWlnaHRcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmVsID0gZWw7XHJcbiAgICAgICAgdGhpcy5vcHRpb24gPSBvcHRzO1xyXG4gICAgICAgIC8vIGNyZWF0ZSB2YXIgZXZlbnQgYmluZGluZyBzbyB3ZSBjYW4gZWFzaWx5IHJlbW92ZSBhbmQgc3RpbGwgbG9vayBsaWtlIFRTIG1ldGhvZHMgKHVubGlrZSBhbm9ueW1vdXMgZnVuY3Rpb25zKVxyXG4gICAgICAgIHRoaXMuX21vdXNlT3ZlciA9IHRoaXMuX21vdXNlT3Zlci5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuX21vdXNlT3V0ID0gdGhpcy5fbW91c2VPdXQuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLmVuYWJsZSgpO1xyXG4gICAgICAgIHRoaXMuX3NldHVwQXV0b0hpZGUodGhpcy5vcHRpb24uYXV0b0hpZGUpO1xyXG4gICAgICAgIHRoaXMuX3NldHVwSGFuZGxlcnMoKTtcclxuICAgIH1cclxuICAgIG9uKGV2ZW50LCBjYWxsYmFjaykge1xyXG4gICAgICAgIHN1cGVyLm9uKGV2ZW50LCBjYWxsYmFjayk7XHJcbiAgICB9XHJcbiAgICBvZmYoZXZlbnQpIHtcclxuICAgICAgICBzdXBlci5vZmYoZXZlbnQpO1xyXG4gICAgfVxyXG4gICAgZW5hYmxlKCkge1xyXG4gICAgICAgIHN1cGVyLmVuYWJsZSgpO1xyXG4gICAgICAgIHRoaXMuZWwuY2xhc3NMaXN0LmFkZCgndWktcmVzaXphYmxlJyk7XHJcbiAgICAgICAgdGhpcy5lbC5jbGFzc0xpc3QucmVtb3ZlKCd1aS1yZXNpemFibGUtZGlzYWJsZWQnKTtcclxuICAgICAgICB0aGlzLl9zZXR1cEF1dG9IaWRlKHRoaXMub3B0aW9uLmF1dG9IaWRlKTtcclxuICAgIH1cclxuICAgIGRpc2FibGUoKSB7XHJcbiAgICAgICAgc3VwZXIuZGlzYWJsZSgpO1xyXG4gICAgICAgIHRoaXMuZWwuY2xhc3NMaXN0LmFkZCgndWktcmVzaXphYmxlLWRpc2FibGVkJyk7XHJcbiAgICAgICAgdGhpcy5lbC5jbGFzc0xpc3QucmVtb3ZlKCd1aS1yZXNpemFibGUnKTtcclxuICAgICAgICB0aGlzLl9zZXR1cEF1dG9IaWRlKGZhbHNlKTtcclxuICAgIH1cclxuICAgIGRlc3Ryb3koKSB7XHJcbiAgICAgICAgdGhpcy5fcmVtb3ZlSGFuZGxlcnMoKTtcclxuICAgICAgICB0aGlzLl9zZXR1cEF1dG9IaWRlKGZhbHNlKTtcclxuICAgICAgICB0aGlzLmVsLmNsYXNzTGlzdC5yZW1vdmUoJ3VpLXJlc2l6YWJsZScpO1xyXG4gICAgICAgIGRlbGV0ZSB0aGlzLmVsO1xyXG4gICAgICAgIHN1cGVyLmRlc3Ryb3koKTtcclxuICAgIH1cclxuICAgIHVwZGF0ZU9wdGlvbihvcHRzKSB7XHJcbiAgICAgICAgbGV0IHVwZGF0ZUhhbmRsZXMgPSAob3B0cy5oYW5kbGVzICYmIG9wdHMuaGFuZGxlcyAhPT0gdGhpcy5vcHRpb24uaGFuZGxlcyk7XHJcbiAgICAgICAgbGV0IHVwZGF0ZUF1dG9IaWRlID0gKG9wdHMuYXV0b0hpZGUgJiYgb3B0cy5hdXRvSGlkZSAhPT0gdGhpcy5vcHRpb24uYXV0b0hpZGUpO1xyXG4gICAgICAgIE9iamVjdC5rZXlzKG9wdHMpLmZvckVhY2goa2V5ID0+IHRoaXMub3B0aW9uW2tleV0gPSBvcHRzW2tleV0pO1xyXG4gICAgICAgIGlmICh1cGRhdGVIYW5kbGVzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3JlbW92ZUhhbmRsZXJzKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3NldHVwSGFuZGxlcnMoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHVwZGF0ZUF1dG9IaWRlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3NldHVwQXV0b0hpZGUodGhpcy5vcHRpb24uYXV0b0hpZGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICAgIC8qKiBAaW50ZXJuYWwgdHVybnMgYXV0byBoaWRlIG9uL29mZiAqL1xyXG4gICAgX3NldHVwQXV0b0hpZGUoYXV0bykge1xyXG4gICAgICAgIGlmIChhdXRvKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZWwuY2xhc3NMaXN0LmFkZCgndWktcmVzaXphYmxlLWF1dG9oaWRlJyk7XHJcbiAgICAgICAgICAgIC8vIHVzZSBtb3VzZW92ZXIgYW5kIG5vdCBtb3VzZWVudGVyIHRvIGdldCBiZXR0ZXIgcGVyZm9ybWFuY2UgYW5kIHRyYWNrIGZvciBuZXN0ZWQgY2FzZXNcclxuICAgICAgICAgICAgdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLCB0aGlzLl9tb3VzZU92ZXIpO1xyXG4gICAgICAgICAgICB0aGlzLmVsLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3V0JywgdGhpcy5fbW91c2VPdXQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5lbC5jbGFzc0xpc3QucmVtb3ZlKCd1aS1yZXNpemFibGUtYXV0b2hpZGUnKTtcclxuICAgICAgICAgICAgdGhpcy5lbC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLCB0aGlzLl9tb3VzZU92ZXIpO1xyXG4gICAgICAgICAgICB0aGlzLmVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlb3V0JywgdGhpcy5fbW91c2VPdXQpO1xyXG4gICAgICAgICAgICBpZiAoZGRfbWFuYWdlcl8xLkRETWFuYWdlci5vdmVyUmVzaXplRWxlbWVudCA9PT0gdGhpcykge1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlIGRkX21hbmFnZXJfMS5ERE1hbmFnZXIub3ZlclJlc2l6ZUVsZW1lbnQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXHJcbiAgICBfbW91c2VPdmVyKGUpIHtcclxuICAgICAgICAvLyBjb25zb2xlLmxvZyhgJHtjb3VudCsrfSBwcmUtZW50ZXIgJHsodGhpcy5lbCBhcyBHcmlkSXRlbUhUTUxFbGVtZW50KS5ncmlkc3RhY2tOb2RlLl9pZH1gKVxyXG4gICAgICAgIC8vIGFscmVhZHkgb3ZlciBhIGNoaWxkLCBpZ25vcmUuIElkZWFsbHkgd2UganVzdCBjYWxsIGUuc3RvcFByb3BhZ2F0aW9uKCkgYnV0IHNlZSBodHRwczovL2dpdGh1Yi5jb20vZ3JpZHN0YWNrL2dyaWRzdGFjay5qcy9pc3N1ZXMvMjAxOFxyXG4gICAgICAgIGlmIChkZF9tYW5hZ2VyXzEuRERNYW5hZ2VyLm92ZXJSZXNpemVFbGVtZW50IHx8IGRkX21hbmFnZXJfMS5ERE1hbmFnZXIuZHJhZ0VsZW1lbnQpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBkZF9tYW5hZ2VyXzEuRERNYW5hZ2VyLm92ZXJSZXNpemVFbGVtZW50ID0gdGhpcztcclxuICAgICAgICAvLyBjb25zb2xlLmxvZyhgJHtjb3VudCsrfSBlbnRlciAkeyh0aGlzLmVsIGFzIEdyaWRJdGVtSFRNTEVsZW1lbnQpLmdyaWRzdGFja05vZGUuX2lkfWApXHJcbiAgICAgICAgdGhpcy5lbC5jbGFzc0xpc3QucmVtb3ZlKCd1aS1yZXNpemFibGUtYXV0b2hpZGUnKTtcclxuICAgIH1cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcclxuICAgIF9tb3VzZU91dChlKSB7XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coYCR7Y291bnQrK30gcHJlLWxlYXZlICR7KHRoaXMuZWwgYXMgR3JpZEl0ZW1IVE1MRWxlbWVudCkuZ3JpZHN0YWNrTm9kZS5faWR9YClcclxuICAgICAgICBpZiAoZGRfbWFuYWdlcl8xLkRETWFuYWdlci5vdmVyUmVzaXplRWxlbWVudCAhPT0gdGhpcylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGRlbGV0ZSBkZF9tYW5hZ2VyXzEuRERNYW5hZ2VyLm92ZXJSZXNpemVFbGVtZW50O1xyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGAke2NvdW50Kyt9IGxlYXZlICR7KHRoaXMuZWwgYXMgR3JpZEl0ZW1IVE1MRWxlbWVudCkuZ3JpZHN0YWNrTm9kZS5faWR9YClcclxuICAgICAgICB0aGlzLmVsLmNsYXNzTGlzdC5hZGQoJ3VpLXJlc2l6YWJsZS1hdXRvaGlkZScpO1xyXG4gICAgfVxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgX3NldHVwSGFuZGxlcnMoKSB7XHJcbiAgICAgICAgbGV0IGhhbmRsZXJEaXJlY3Rpb24gPSB0aGlzLm9wdGlvbi5oYW5kbGVzIHx8ICdlLHMsc2UnO1xyXG4gICAgICAgIGlmIChoYW5kbGVyRGlyZWN0aW9uID09PSAnYWxsJykge1xyXG4gICAgICAgICAgICBoYW5kbGVyRGlyZWN0aW9uID0gJ24sZSxzLHcsc2Usc3csbmUsbncnO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmhhbmRsZXJzID0gaGFuZGxlckRpcmVjdGlvbi5zcGxpdCgnLCcpXHJcbiAgICAgICAgICAgIC5tYXAoZGlyID0+IGRpci50cmltKCkpXHJcbiAgICAgICAgICAgIC5tYXAoZGlyID0+IG5ldyBkZF9yZXNpemFibGVfaGFuZGxlXzEuRERSZXNpemFibGVIYW5kbGUodGhpcy5lbCwgZGlyLCB7XHJcbiAgICAgICAgICAgIHN0YXJ0OiAoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3Jlc2l6ZVN0YXJ0KGV2ZW50KTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc3RvcDogKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9yZXNpemVTdG9wKGV2ZW50KTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgbW92ZTogKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9yZXNpemluZyhldmVudCwgZGlyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pKTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIF9yZXNpemVTdGFydChldmVudCkge1xyXG4gICAgICAgIHRoaXMub3JpZ2luYWxSZWN0ID0gdGhpcy5lbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICB0aGlzLnNjcm9sbEVsID0gdXRpbHNfMS5VdGlscy5nZXRTY3JvbGxFbGVtZW50KHRoaXMuZWwpO1xyXG4gICAgICAgIHRoaXMuc2Nyb2xsWSA9IHRoaXMuc2Nyb2xsRWwuc2Nyb2xsVG9wO1xyXG4gICAgICAgIHRoaXMuc2Nyb2xsZWQgPSAwO1xyXG4gICAgICAgIHRoaXMuc3RhcnRFdmVudCA9IGV2ZW50O1xyXG4gICAgICAgIHRoaXMuX3NldHVwSGVscGVyKCk7XHJcbiAgICAgICAgdGhpcy5fYXBwbHlDaGFuZ2UoKTtcclxuICAgICAgICBjb25zdCBldiA9IHV0aWxzXzEuVXRpbHMuaW5pdEV2ZW50KGV2ZW50LCB7IHR5cGU6ICdyZXNpemVzdGFydCcsIHRhcmdldDogdGhpcy5lbCB9KTtcclxuICAgICAgICBpZiAodGhpcy5vcHRpb24uc3RhcnQpIHtcclxuICAgICAgICAgICAgdGhpcy5vcHRpb24uc3RhcnQoZXYsIHRoaXMuX3VpKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmVsLmNsYXNzTGlzdC5hZGQoJ3VpLXJlc2l6YWJsZS1yZXNpemluZycpO1xyXG4gICAgICAgIHRoaXMudHJpZ2dlckV2ZW50KCdyZXNpemVzdGFydCcsIGV2KTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIF9yZXNpemluZyhldmVudCwgZGlyKSB7XHJcbiAgICAgICAgdGhpcy5zY3JvbGxlZCA9IHRoaXMuc2Nyb2xsRWwuc2Nyb2xsVG9wIC0gdGhpcy5zY3JvbGxZO1xyXG4gICAgICAgIHRoaXMudGVtcG9yYWxSZWN0ID0gdGhpcy5fZ2V0Q2hhbmdlKGV2ZW50LCBkaXIpO1xyXG4gICAgICAgIHRoaXMuX2FwcGx5Q2hhbmdlKCk7XHJcbiAgICAgICAgY29uc3QgZXYgPSB1dGlsc18xLlV0aWxzLmluaXRFdmVudChldmVudCwgeyB0eXBlOiAncmVzaXplJywgdGFyZ2V0OiB0aGlzLmVsIH0pO1xyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbi5yZXNpemUpIHtcclxuICAgICAgICAgICAgdGhpcy5vcHRpb24ucmVzaXplKGV2LCB0aGlzLl91aSgpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy50cmlnZ2VyRXZlbnQoJ3Jlc2l6ZScsIGV2KTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIF9yZXNpemVTdG9wKGV2ZW50KSB7XHJcbiAgICAgICAgY29uc3QgZXYgPSB1dGlsc18xLlV0aWxzLmluaXRFdmVudChldmVudCwgeyB0eXBlOiAncmVzaXplc3RvcCcsIHRhcmdldDogdGhpcy5lbCB9KTtcclxuICAgICAgICBpZiAodGhpcy5vcHRpb24uc3RvcCkge1xyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbi5zdG9wKGV2KTsgLy8gTm90ZTogdWkoKSBub3QgdXNlZCBieSBncmlkc3RhY2sgc28gZG9uJ3QgcGFzc1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmVsLmNsYXNzTGlzdC5yZW1vdmUoJ3VpLXJlc2l6YWJsZS1yZXNpemluZycpO1xyXG4gICAgICAgIHRoaXMudHJpZ2dlckV2ZW50KCdyZXNpemVzdG9wJywgZXYpO1xyXG4gICAgICAgIHRoaXMuX2NsZWFuSGVscGVyKCk7XHJcbiAgICAgICAgZGVsZXRlIHRoaXMuc3RhcnRFdmVudDtcclxuICAgICAgICBkZWxldGUgdGhpcy5vcmlnaW5hbFJlY3Q7XHJcbiAgICAgICAgZGVsZXRlIHRoaXMudGVtcG9yYWxSZWN0O1xyXG4gICAgICAgIGRlbGV0ZSB0aGlzLnNjcm9sbFk7XHJcbiAgICAgICAgZGVsZXRlIHRoaXMuc2Nyb2xsZWQ7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBfc2V0dXBIZWxwZXIoKSB7XHJcbiAgICAgICAgdGhpcy5lbE9yaWdpblN0eWxlVmFsID0gRERSZXNpemFibGUuX29yaWdpblN0eWxlUHJvcC5tYXAocHJvcCA9PiB0aGlzLmVsLnN0eWxlW3Byb3BdKTtcclxuICAgICAgICB0aGlzLnBhcmVudE9yaWdpblN0eWxlUG9zaXRpb24gPSB0aGlzLmVsLnBhcmVudEVsZW1lbnQuc3R5bGUucG9zaXRpb247XHJcbiAgICAgICAgaWYgKHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMuZWwucGFyZW50RWxlbWVudCkucG9zaXRpb24ubWF0Y2goL3N0YXRpYy8pKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZWwucGFyZW50RWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZWwuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xyXG4gICAgICAgIHRoaXMuZWwuc3R5bGUub3BhY2l0eSA9ICcwLjgnO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgX2NsZWFuSGVscGVyKCkge1xyXG4gICAgICAgIEREUmVzaXphYmxlLl9vcmlnaW5TdHlsZVByb3AuZm9yRWFjaCgocHJvcCwgaSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmVsLnN0eWxlW3Byb3BdID0gdGhpcy5lbE9yaWdpblN0eWxlVmFsW2ldIHx8IG51bGw7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5lbC5wYXJlbnRFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gdGhpcy5wYXJlbnRPcmlnaW5TdHlsZVBvc2l0aW9uIHx8IG51bGw7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBfZ2V0Q2hhbmdlKGV2ZW50LCBkaXIpIHtcclxuICAgICAgICBjb25zdCBvRXZlbnQgPSB0aGlzLnN0YXJ0RXZlbnQ7XHJcbiAgICAgICAgY29uc3QgbmV3UmVjdCA9IHtcclxuICAgICAgICAgICAgd2lkdGg6IHRoaXMub3JpZ2luYWxSZWN0LndpZHRoLFxyXG4gICAgICAgICAgICBoZWlnaHQ6IHRoaXMub3JpZ2luYWxSZWN0LmhlaWdodCArIHRoaXMuc2Nyb2xsZWQsXHJcbiAgICAgICAgICAgIGxlZnQ6IHRoaXMub3JpZ2luYWxSZWN0LmxlZnQsXHJcbiAgICAgICAgICAgIHRvcDogdGhpcy5vcmlnaW5hbFJlY3QudG9wIC0gdGhpcy5zY3JvbGxlZFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3Qgb2Zmc2V0WCA9IGV2ZW50LmNsaWVudFggLSBvRXZlbnQuY2xpZW50WDtcclxuICAgICAgICBjb25zdCBvZmZzZXRZID0gZXZlbnQuY2xpZW50WSAtIG9FdmVudC5jbGllbnRZO1xyXG4gICAgICAgIGlmIChkaXIuaW5kZXhPZignZScpID4gLTEpIHtcclxuICAgICAgICAgICAgbmV3UmVjdC53aWR0aCArPSBvZmZzZXRYO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChkaXIuaW5kZXhPZigndycpID4gLTEpIHtcclxuICAgICAgICAgICAgbmV3UmVjdC53aWR0aCAtPSBvZmZzZXRYO1xyXG4gICAgICAgICAgICBuZXdSZWN0LmxlZnQgKz0gb2Zmc2V0WDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGRpci5pbmRleE9mKCdzJykgPiAtMSkge1xyXG4gICAgICAgICAgICBuZXdSZWN0LmhlaWdodCArPSBvZmZzZXRZO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChkaXIuaW5kZXhPZignbicpID4gLTEpIHtcclxuICAgICAgICAgICAgbmV3UmVjdC5oZWlnaHQgLT0gb2Zmc2V0WTtcclxuICAgICAgICAgICAgbmV3UmVjdC50b3AgKz0gb2Zmc2V0WTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY29uc3RyYWluID0gdGhpcy5fY29uc3RyYWluU2l6ZShuZXdSZWN0LndpZHRoLCBuZXdSZWN0LmhlaWdodCk7XHJcbiAgICAgICAgaWYgKE1hdGgucm91bmQobmV3UmVjdC53aWR0aCkgIT09IE1hdGgucm91bmQoY29uc3RyYWluLndpZHRoKSkgeyAvLyByb3VuZCB0byBpZ25vcmUgc2xpZ2h0IHJvdW5kLW9mZiBlcnJvcnNcclxuICAgICAgICAgICAgaWYgKGRpci5pbmRleE9mKCd3JykgPiAtMSkge1xyXG4gICAgICAgICAgICAgICAgbmV3UmVjdC5sZWZ0ICs9IG5ld1JlY3Qud2lkdGggLSBjb25zdHJhaW4ud2lkdGg7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbmV3UmVjdC53aWR0aCA9IGNvbnN0cmFpbi53aWR0aDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKE1hdGgucm91bmQobmV3UmVjdC5oZWlnaHQpICE9PSBNYXRoLnJvdW5kKGNvbnN0cmFpbi5oZWlnaHQpKSB7XHJcbiAgICAgICAgICAgIGlmIChkaXIuaW5kZXhPZignbicpID4gLTEpIHtcclxuICAgICAgICAgICAgICAgIG5ld1JlY3QudG9wICs9IG5ld1JlY3QuaGVpZ2h0IC0gY29uc3RyYWluLmhlaWdodDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBuZXdSZWN0LmhlaWdodCA9IGNvbnN0cmFpbi5oZWlnaHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBuZXdSZWN0O1xyXG4gICAgfVxyXG4gICAgLyoqIEBpbnRlcm5hbCBjb25zdHJhaW4gdGhlIHNpemUgdG8gdGhlIHNldCBtaW4vbWF4IHZhbHVlcyAqL1xyXG4gICAgX2NvbnN0cmFpblNpemUob1dpZHRoLCBvSGVpZ2h0KSB7XHJcbiAgICAgICAgY29uc3QgbWF4V2lkdGggPSB0aGlzLm9wdGlvbi5tYXhXaWR0aCB8fCBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcclxuICAgICAgICBjb25zdCBtaW5XaWR0aCA9IHRoaXMub3B0aW9uLm1pbldpZHRoIHx8IG9XaWR0aDtcclxuICAgICAgICBjb25zdCBtYXhIZWlnaHQgPSB0aGlzLm9wdGlvbi5tYXhIZWlnaHQgfHwgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVI7XHJcbiAgICAgICAgY29uc3QgbWluSGVpZ2h0ID0gdGhpcy5vcHRpb24ubWluSGVpZ2h0IHx8IG9IZWlnaHQ7XHJcbiAgICAgICAgY29uc3Qgd2lkdGggPSBNYXRoLm1pbihtYXhXaWR0aCwgTWF0aC5tYXgobWluV2lkdGgsIG9XaWR0aCkpO1xyXG4gICAgICAgIGNvbnN0IGhlaWdodCA9IE1hdGgubWluKG1heEhlaWdodCwgTWF0aC5tYXgobWluSGVpZ2h0LCBvSGVpZ2h0KSk7XHJcbiAgICAgICAgcmV0dXJuIHsgd2lkdGgsIGhlaWdodCB9O1xyXG4gICAgfVxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgX2FwcGx5Q2hhbmdlKCkge1xyXG4gICAgICAgIGxldCBjb250YWlubWVudFJlY3QgPSB7IGxlZnQ6IDAsIHRvcDogMCwgd2lkdGg6IDAsIGhlaWdodDogMCB9O1xyXG4gICAgICAgIGlmICh0aGlzLmVsLnN0eWxlLnBvc2l0aW9uID09PSAnYWJzb2x1dGUnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5tZW50RWwgPSB0aGlzLmVsLnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IHsgbGVmdCwgdG9wIH0gPSBjb250YWlubWVudEVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgICAgICBjb250YWlubWVudFJlY3QgPSB7IGxlZnQsIHRvcCwgd2lkdGg6IDAsIGhlaWdodDogMCB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMudGVtcG9yYWxSZWN0KVxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLnRlbXBvcmFsUmVjdCkuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMudGVtcG9yYWxSZWN0W2tleV07XHJcbiAgICAgICAgICAgIHRoaXMuZWwuc3R5bGVba2V5XSA9IHZhbHVlIC0gY29udGFpbm1lbnRSZWN0W2tleV0gKyAncHgnO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgX3JlbW92ZUhhbmRsZXJzKCkge1xyXG4gICAgICAgIHRoaXMuaGFuZGxlcnMuZm9yRWFjaChoYW5kbGUgPT4gaGFuZGxlLmRlc3Ryb3koKSk7XHJcbiAgICAgICAgZGVsZXRlIHRoaXMuaGFuZGxlcnM7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbn1cclxuZXhwb3J0cy5ERFJlc2l6YWJsZSA9IEREUmVzaXphYmxlO1xyXG4vKiogQGludGVybmFsICovXHJcbkREUmVzaXphYmxlLl9vcmlnaW5TdHlsZVByb3AgPSBbJ3dpZHRoJywgJ2hlaWdodCcsICdwb3NpdGlvbicsICdsZWZ0JywgJ3RvcCcsICdvcGFjaXR5JywgJ3pJbmRleCddO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZC1yZXNpemFibGUuanMubWFwIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///9326\n")},4770:(__unused_webpack_module,exports,__webpack_require__)=>{"use strict";eval("\r\n/**\r\n * touch.ts 7.3.0\r\n * Copyright (c) 2021 Alain Dumesny - see GridStack root license\r\n */\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.pointerleave = exports.pointerenter = exports.pointerdown = exports.touchend = exports.touchmove = exports.touchstart = exports.isTouch = void 0;\r\nconst dd_manager_1 = __webpack_require__(7655);\r\n/**\r\n * Detect touch support - Windows Surface devices and other touch devices\r\n * should we use this instead ? (what we had for always showing resize handles)\r\n * /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)\r\n */\r\nexports.isTouch = typeof window !== 'undefined' && typeof document !== 'undefined' &&\r\n ('ontouchstart' in document\r\n || 'ontouchstart' in window\r\n // || !!window.TouchEvent // true on Windows 10 Chrome desktop so don't use this\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n || (window.DocumentTouch && document instanceof window.DocumentTouch)\r\n || navigator.maxTouchPoints > 0\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n || navigator.msMaxTouchPoints > 0);\r\n// interface TouchCoord {x: number, y: number};\r\nclass DDTouch {\r\n}\r\n/**\r\n* Get the x,y position of a touch event\r\n*/\r\n// function getTouchCoords(e: TouchEvent): TouchCoord {\r\n// return {\r\n// x: e.changedTouches[0].pageX,\r\n// y: e.changedTouches[0].pageY\r\n// };\r\n// }\r\n/**\r\n * Simulate a mouse event based on a corresponding touch event\r\n * @param {Object} e A touch event\r\n * @param {String} simulatedType The corresponding mouse event\r\n */\r\nfunction simulateMouseEvent(e, simulatedType) {\r\n // Ignore multi-touch events\r\n if (e.touches.length > 1)\r\n return;\r\n // Prevent \"Ignored attempt to cancel a touchmove event with cancelable=false\" errors\r\n if (e.cancelable)\r\n e.preventDefault();\r\n const touch = e.changedTouches[0], simulatedEvent = document.createEvent('MouseEvents');\r\n // Initialize the simulated mouse event using the touch event's coordinates\r\n simulatedEvent.initMouseEvent(simulatedType, // type\r\n true, // bubbles\r\n true, // cancelable\r\n window, // view\r\n 1, // detail\r\n touch.screenX, // screenX\r\n touch.screenY, // screenY\r\n touch.clientX, // clientX\r\n touch.clientY, // clientY\r\n false, // ctrlKey\r\n false, // altKey\r\n false, // shiftKey\r\n false, // metaKey\r\n 0, // button\r\n null // relatedTarget\r\n );\r\n // Dispatch the simulated event to the target element\r\n e.target.dispatchEvent(simulatedEvent);\r\n}\r\n/**\r\n * Simulate a mouse event based on a corresponding Pointer event\r\n * @param {Object} e A pointer event\r\n * @param {String} simulatedType The corresponding mouse event\r\n */\r\nfunction simulatePointerMouseEvent(e, simulatedType) {\r\n // Prevent \"Ignored attempt to cancel a touchmove event with cancelable=false\" errors\r\n if (e.cancelable)\r\n e.preventDefault();\r\n const simulatedEvent = document.createEvent('MouseEvents');\r\n // Initialize the simulated mouse event using the touch event's coordinates\r\n simulatedEvent.initMouseEvent(simulatedType, // type\r\n true, // bubbles\r\n true, // cancelable\r\n window, // view\r\n 1, // detail\r\n e.screenX, // screenX\r\n e.screenY, // screenY\r\n e.clientX, // clientX\r\n e.clientY, // clientY\r\n false, // ctrlKey\r\n false, // altKey\r\n false, // shiftKey\r\n false, // metaKey\r\n 0, // button\r\n null // relatedTarget\r\n );\r\n // Dispatch the simulated event to the target element\r\n e.target.dispatchEvent(simulatedEvent);\r\n}\r\n/**\r\n * Handle the touchstart events\r\n * @param {Object} e The widget element's touchstart event\r\n */\r\nfunction touchstart(e) {\r\n // Ignore the event if another widget is already being handled\r\n if (DDTouch.touchHandled)\r\n return;\r\n DDTouch.touchHandled = true;\r\n // Simulate the mouse events\r\n // simulateMouseEvent(e, 'mouseover');\r\n // simulateMouseEvent(e, 'mousemove');\r\n simulateMouseEvent(e, 'mousedown');\r\n}\r\nexports.touchstart = touchstart;\r\n/**\r\n * Handle the touchmove events\r\n * @param {Object} e The document's touchmove event\r\n */\r\nfunction touchmove(e) {\r\n // Ignore event if not handled by us\r\n if (!DDTouch.touchHandled)\r\n return;\r\n simulateMouseEvent(e, 'mousemove');\r\n}\r\nexports.touchmove = touchmove;\r\n/**\r\n * Handle the touchend events\r\n * @param {Object} e The document's touchend event\r\n */\r\nfunction touchend(e) {\r\n // Ignore event if not handled\r\n if (!DDTouch.touchHandled)\r\n return;\r\n // cancel delayed leave event when we release on ourself which happens BEFORE we get this!\r\n if (DDTouch.pointerLeaveTimeout) {\r\n window.clearTimeout(DDTouch.pointerLeaveTimeout);\r\n delete DDTouch.pointerLeaveTimeout;\r\n }\r\n const wasDragging = !!dd_manager_1.DDManager.dragElement;\r\n // Simulate the mouseup event\r\n simulateMouseEvent(e, 'mouseup');\r\n // simulateMouseEvent(event, 'mouseout');\r\n // If the touch interaction did not move, it should trigger a click\r\n if (!wasDragging) {\r\n simulateMouseEvent(e, 'click');\r\n }\r\n // Unset the flag to allow other widgets to inherit the touch event\r\n DDTouch.touchHandled = false;\r\n}\r\nexports.touchend = touchend;\r\n/**\r\n * Note we don't get touchenter/touchleave (which are deprecated)\r\n * see https://stackoverflow.com/questions/27908339/js-touch-equivalent-for-mouseenter\r\n * so instead of PointerEvent to still get enter/leave and send the matching mouse event.\r\n */\r\nfunction pointerdown(e) {\r\n // console.log(\"pointer down\")\r\n e.target.releasePointerCapture(e.pointerId); // <- Important!\r\n}\r\nexports.pointerdown = pointerdown;\r\nfunction pointerenter(e) {\r\n // ignore the initial one we get on pointerdown on ourself\r\n if (!dd_manager_1.DDManager.dragElement) {\r\n // console.log('pointerenter ignored');\r\n return;\r\n }\r\n // console.log('pointerenter');\r\n simulatePointerMouseEvent(e, 'mouseenter');\r\n}\r\nexports.pointerenter = pointerenter;\r\nfunction pointerleave(e) {\r\n // ignore the leave on ourself we get before releasing the mouse over ourself\r\n // by delaying sending the event and having the up event cancel us\r\n if (!dd_manager_1.DDManager.dragElement) {\r\n // console.log('pointerleave ignored');\r\n return;\r\n }\r\n DDTouch.pointerLeaveTimeout = window.setTimeout(() => {\r\n delete DDTouch.pointerLeaveTimeout;\r\n // console.log('pointerleave delayed');\r\n simulatePointerMouseEvent(e, 'mouseleave');\r\n }, 10);\r\n}\r\nexports.pointerleave = pointerleave;\r\n//# sourceMappingURL=dd-touch.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDc3MC5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELG9CQUFvQixHQUFHLG9CQUFvQixHQUFHLG1CQUFtQixHQUFHLGdCQUFnQixHQUFHLGlCQUFpQixHQUFHLGtCQUFrQixHQUFHLGVBQWU7QUFDL0kscUJBQXFCLG1CQUFPLENBQUMsSUFBYztBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpREFBaUQ7QUFDakQ7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxvQkFBb0I7QUFDcEIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vbm9kZV9tb2R1bGVzL2dyaWRzdGFjay9kaXN0L2RkLXRvdWNoLmpzP2U4MjEiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XHJcbi8qKlxyXG4gKiB0b3VjaC50cyA3LjMuMFxyXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjEgQWxhaW4gRHVtZXNueSAtIHNlZSBHcmlkU3RhY2sgcm9vdCBsaWNlbnNlXHJcbiAqL1xyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XHJcbmV4cG9ydHMucG9pbnRlcmxlYXZlID0gZXhwb3J0cy5wb2ludGVyZW50ZXIgPSBleHBvcnRzLnBvaW50ZXJkb3duID0gZXhwb3J0cy50b3VjaGVuZCA9IGV4cG9ydHMudG91Y2htb3ZlID0gZXhwb3J0cy50b3VjaHN0YXJ0ID0gZXhwb3J0cy5pc1RvdWNoID0gdm9pZCAwO1xyXG5jb25zdCBkZF9tYW5hZ2VyXzEgPSByZXF1aXJlKFwiLi9kZC1tYW5hZ2VyXCIpO1xyXG4vKipcclxuICogRGV0ZWN0IHRvdWNoIHN1cHBvcnQgLSBXaW5kb3dzIFN1cmZhY2UgZGV2aWNlcyBhbmQgb3RoZXIgdG91Y2ggZGV2aWNlc1xyXG4gKiBzaG91bGQgd2UgdXNlIHRoaXMgaW5zdGVhZCA/ICh3aGF0IHdlIGhhZCBmb3IgYWx3YXlzIHNob3dpbmcgcmVzaXplIGhhbmRsZXMpXHJcbiAqIC9BbmRyb2lkfHdlYk9TfGlQaG9uZXxpUGFkfGlQb2R8QmxhY2tCZXJyeXxJRU1vYmlsZXxPcGVyYSBNaW5pL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KVxyXG4gKi9cclxuZXhwb3J0cy5pc1RvdWNoID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJlxyXG4gICAgKCdvbnRvdWNoc3RhcnQnIGluIGRvY3VtZW50XHJcbiAgICAgICAgfHwgJ29udG91Y2hzdGFydCcgaW4gd2luZG93XHJcbiAgICAgICAgLy8gfHwgISF3aW5kb3cuVG91Y2hFdmVudCAvLyB0cnVlIG9uIFdpbmRvd3MgMTAgQ2hyb21lIGRlc2t0b3Agc28gZG9uJ3QgdXNlIHRoaXNcclxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gICAgICAgIHx8ICh3aW5kb3cuRG9jdW1lbnRUb3VjaCAmJiBkb2N1bWVudCBpbnN0YW5jZW9mIHdpbmRvdy5Eb2N1bWVudFRvdWNoKVxyXG4gICAgICAgIHx8IG5hdmlnYXRvci5tYXhUb3VjaFBvaW50cyA+IDBcclxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gICAgICAgIHx8IG5hdmlnYXRvci5tc01heFRvdWNoUG9pbnRzID4gMCk7XHJcbi8vIGludGVyZmFjZSBUb3VjaENvb3JkIHt4OiBudW1iZXIsIHk6IG51bWJlcn07XHJcbmNsYXNzIEREVG91Y2gge1xyXG59XHJcbi8qKlxyXG4qIEdldCB0aGUgeCx5IHBvc2l0aW9uIG9mIGEgdG91Y2ggZXZlbnRcclxuKi9cclxuLy8gZnVuY3Rpb24gZ2V0VG91Y2hDb29yZHMoZTogVG91Y2hFdmVudCk6IFRvdWNoQ29vcmQge1xyXG4vLyAgIHJldHVybiB7XHJcbi8vICAgICB4OiBlLmNoYW5nZWRUb3VjaGVzWzBdLnBhZ2VYLFxyXG4vLyAgICAgeTogZS5jaGFuZ2VkVG91Y2hlc1swXS5wYWdlWVxyXG4vLyAgIH07XHJcbi8vIH1cclxuLyoqXHJcbiAqIFNpbXVsYXRlIGEgbW91c2UgZXZlbnQgYmFzZWQgb24gYSBjb3JyZXNwb25kaW5nIHRvdWNoIGV2ZW50XHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBlIEEgdG91Y2ggZXZlbnRcclxuICogQHBhcmFtIHtTdHJpbmd9IHNpbXVsYXRlZFR5cGUgVGhlIGNvcnJlc3BvbmRpbmcgbW91c2UgZXZlbnRcclxuICovXHJcbmZ1bmN0aW9uIHNpbXVsYXRlTW91c2VFdmVudChlLCBzaW11bGF0ZWRUeXBlKSB7XHJcbiAgICAvLyBJZ25vcmUgbXVsdGktdG91Y2ggZXZlbnRzXHJcbiAgICBpZiAoZS50b3VjaGVzLmxlbmd0aCA+IDEpXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgLy8gUHJldmVudCBcIklnbm9yZWQgYXR0ZW1wdCB0byBjYW5jZWwgYSB0b3VjaG1vdmUgZXZlbnQgd2l0aCBjYW5jZWxhYmxlPWZhbHNlXCIgZXJyb3JzXHJcbiAgICBpZiAoZS5jYW5jZWxhYmxlKVxyXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgIGNvbnN0IHRvdWNoID0gZS5jaGFuZ2VkVG91Y2hlc1swXSwgc2ltdWxhdGVkRXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnTW91c2VFdmVudHMnKTtcclxuICAgIC8vIEluaXRpYWxpemUgdGhlIHNpbXVsYXRlZCBtb3VzZSBldmVudCB1c2luZyB0aGUgdG91Y2ggZXZlbnQncyBjb29yZGluYXRlc1xyXG4gICAgc2ltdWxhdGVkRXZlbnQuaW5pdE1vdXNlRXZlbnQoc2ltdWxhdGVkVHlwZSwgLy8gdHlwZVxyXG4gICAgdHJ1ZSwgLy8gYnViYmxlc1xyXG4gICAgdHJ1ZSwgLy8gY2FuY2VsYWJsZVxyXG4gICAgd2luZG93LCAvLyB2aWV3XHJcbiAgICAxLCAvLyBkZXRhaWxcclxuICAgIHRvdWNoLnNjcmVlblgsIC8vIHNjcmVlblhcclxuICAgIHRvdWNoLnNjcmVlblksIC8vIHNjcmVlbllcclxuICAgIHRvdWNoLmNsaWVudFgsIC8vIGNsaWVudFhcclxuICAgIHRvdWNoLmNsaWVudFksIC8vIGNsaWVudFlcclxuICAgIGZhbHNlLCAvLyBjdHJsS2V5XHJcbiAgICBmYWxzZSwgLy8gYWx0S2V5XHJcbiAgICBmYWxzZSwgLy8gc2hpZnRLZXlcclxuICAgIGZhbHNlLCAvLyBtZXRhS2V5XHJcbiAgICAwLCAvLyBidXR0b25cclxuICAgIG51bGwgLy8gcmVsYXRlZFRhcmdldFxyXG4gICAgKTtcclxuICAgIC8vIERpc3BhdGNoIHRoZSBzaW11bGF0ZWQgZXZlbnQgdG8gdGhlIHRhcmdldCBlbGVtZW50XHJcbiAgICBlLnRhcmdldC5kaXNwYXRjaEV2ZW50KHNpbXVsYXRlZEV2ZW50KTtcclxufVxyXG4vKipcclxuICogU2ltdWxhdGUgYSBtb3VzZSBldmVudCBiYXNlZCBvbiBhIGNvcnJlc3BvbmRpbmcgUG9pbnRlciBldmVudFxyXG4gKiBAcGFyYW0ge09iamVjdH0gZSBBIHBvaW50ZXIgZXZlbnRcclxuICogQHBhcmFtIHtTdHJpbmd9IHNpbXVsYXRlZFR5cGUgVGhlIGNvcnJlc3BvbmRpbmcgbW91c2UgZXZlbnRcclxuICovXHJcbmZ1bmN0aW9uIHNpbXVsYXRlUG9pbnRlck1vdXNlRXZlbnQoZSwgc2ltdWxhdGVkVHlwZSkge1xyXG4gICAgLy8gUHJldmVudCBcIklnbm9yZWQgYXR0ZW1wdCB0byBjYW5jZWwgYSB0b3VjaG1vdmUgZXZlbnQgd2l0aCBjYW5jZWxhYmxlPWZhbHNlXCIgZXJyb3JzXHJcbiAgICBpZiAoZS5jYW5jZWxhYmxlKVxyXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgIGNvbnN0IHNpbXVsYXRlZEV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ01vdXNlRXZlbnRzJyk7XHJcbiAgICAvLyBJbml0aWFsaXplIHRoZSBzaW11bGF0ZWQgbW91c2UgZXZlbnQgdXNpbmcgdGhlIHRvdWNoIGV2ZW50J3MgY29vcmRpbmF0ZXNcclxuICAgIHNpbXVsYXRlZEV2ZW50LmluaXRNb3VzZUV2ZW50KHNpbXVsYXRlZFR5cGUsIC8vIHR5cGVcclxuICAgIHRydWUsIC8vIGJ1YmJsZXNcclxuICAgIHRydWUsIC8vIGNhbmNlbGFibGVcclxuICAgIHdpbmRvdywgLy8gdmlld1xyXG4gICAgMSwgLy8gZGV0YWlsXHJcbiAgICBlLnNjcmVlblgsIC8vIHNjcmVlblhcclxuICAgIGUuc2NyZWVuWSwgLy8gc2NyZWVuWVxyXG4gICAgZS5jbGllbnRYLCAvLyBjbGllbnRYXHJcbiAgICBlLmNsaWVudFksIC8vIGNsaWVudFlcclxuICAgIGZhbHNlLCAvLyBjdHJsS2V5XHJcbiAgICBmYWxzZSwgLy8gYWx0S2V5XHJcbiAgICBmYWxzZSwgLy8gc2hpZnRLZXlcclxuICAgIGZhbHNlLCAvLyBtZXRhS2V5XHJcbiAgICAwLCAvLyBidXR0b25cclxuICAgIG51bGwgLy8gcmVsYXRlZFRhcmdldFxyXG4gICAgKTtcclxuICAgIC8vIERpc3BhdGNoIHRoZSBzaW11bGF0ZWQgZXZlbnQgdG8gdGhlIHRhcmdldCBlbGVtZW50XHJcbiAgICBlLnRhcmdldC5kaXNwYXRjaEV2ZW50KHNpbXVsYXRlZEV2ZW50KTtcclxufVxyXG4vKipcclxuICogSGFuZGxlIHRoZSB0b3VjaHN0YXJ0IGV2ZW50c1xyXG4gKiBAcGFyYW0ge09iamVjdH0gZSBUaGUgd2lkZ2V0IGVsZW1lbnQncyB0b3VjaHN0YXJ0IGV2ZW50XHJcbiAqL1xyXG5mdW5jdGlvbiB0b3VjaHN0YXJ0KGUpIHtcclxuICAgIC8vIElnbm9yZSB0aGUgZXZlbnQgaWYgYW5vdGhlciB3aWRnZXQgaXMgYWxyZWFkeSBiZWluZyBoYW5kbGVkXHJcbiAgICBpZiAoRERUb3VjaC50b3VjaEhhbmRsZWQpXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgRERUb3VjaC50b3VjaEhhbmRsZWQgPSB0cnVlO1xyXG4gICAgLy8gU2ltdWxhdGUgdGhlIG1vdXNlIGV2ZW50c1xyXG4gICAgLy8gc2ltdWxhdGVNb3VzZUV2ZW50KGUsICdtb3VzZW92ZXInKTtcclxuICAgIC8vIHNpbXVsYXRlTW91c2VFdmVudChlLCAnbW91c2Vtb3ZlJyk7XHJcbiAgICBzaW11bGF0ZU1vdXNlRXZlbnQoZSwgJ21vdXNlZG93bicpO1xyXG59XHJcbmV4cG9ydHMudG91Y2hzdGFydCA9IHRvdWNoc3RhcnQ7XHJcbi8qKlxyXG4gKiBIYW5kbGUgdGhlIHRvdWNobW92ZSBldmVudHNcclxuICogQHBhcmFtIHtPYmplY3R9IGUgVGhlIGRvY3VtZW50J3MgdG91Y2htb3ZlIGV2ZW50XHJcbiAqL1xyXG5mdW5jdGlvbiB0b3VjaG1vdmUoZSkge1xyXG4gICAgLy8gSWdub3JlIGV2ZW50IGlmIG5vdCBoYW5kbGVkIGJ5IHVzXHJcbiAgICBpZiAoIUREVG91Y2gudG91Y2hIYW5kbGVkKVxyXG4gICAgICAgIHJldHVybjtcclxuICAgIHNpbXVsYXRlTW91c2VFdmVudChlLCAnbW91c2Vtb3ZlJyk7XHJcbn1cclxuZXhwb3J0cy50b3VjaG1vdmUgPSB0b3VjaG1vdmU7XHJcbi8qKlxyXG4gKiBIYW5kbGUgdGhlIHRvdWNoZW5kIGV2ZW50c1xyXG4gKiBAcGFyYW0ge09iamVjdH0gZSBUaGUgZG9jdW1lbnQncyB0b3VjaGVuZCBldmVudFxyXG4gKi9cclxuZnVuY3Rpb24gdG91Y2hlbmQoZSkge1xyXG4gICAgLy8gSWdub3JlIGV2ZW50IGlmIG5vdCBoYW5kbGVkXHJcbiAgICBpZiAoIUREVG91Y2gudG91Y2hIYW5kbGVkKVxyXG4gICAgICAgIHJldHVybjtcclxuICAgIC8vIGNhbmNlbCBkZWxheWVkIGxlYXZlIGV2ZW50IHdoZW4gd2UgcmVsZWFzZSBvbiBvdXJzZWxmIHdoaWNoIGhhcHBlbnMgQkVGT1JFIHdlIGdldCB0aGlzIVxyXG4gICAgaWYgKEREVG91Y2gucG9pbnRlckxlYXZlVGltZW91dCkge1xyXG4gICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQoRERUb3VjaC5wb2ludGVyTGVhdmVUaW1lb3V0KTtcclxuICAgICAgICBkZWxldGUgRERUb3VjaC5wb2ludGVyTGVhdmVUaW1lb3V0O1xyXG4gICAgfVxyXG4gICAgY29uc3Qgd2FzRHJhZ2dpbmcgPSAhIWRkX21hbmFnZXJfMS5ERE1hbmFnZXIuZHJhZ0VsZW1lbnQ7XHJcbiAgICAvLyBTaW11bGF0ZSB0aGUgbW91c2V1cCBldmVudFxyXG4gICAgc2ltdWxhdGVNb3VzZUV2ZW50KGUsICdtb3VzZXVwJyk7XHJcbiAgICAvLyBzaW11bGF0ZU1vdXNlRXZlbnQoZXZlbnQsICdtb3VzZW91dCcpO1xyXG4gICAgLy8gSWYgdGhlIHRvdWNoIGludGVyYWN0aW9uIGRpZCBub3QgbW92ZSwgaXQgc2hvdWxkIHRyaWdnZXIgYSBjbGlja1xyXG4gICAgaWYgKCF3YXNEcmFnZ2luZykge1xyXG4gICAgICAgIHNpbXVsYXRlTW91c2VFdmVudChlLCAnY2xpY2snKTtcclxuICAgIH1cclxuICAgIC8vIFVuc2V0IHRoZSBmbGFnIHRvIGFsbG93IG90aGVyIHdpZGdldHMgdG8gaW5oZXJpdCB0aGUgdG91Y2ggZXZlbnRcclxuICAgIEREVG91Y2gudG91Y2hIYW5kbGVkID0gZmFsc2U7XHJcbn1cclxuZXhwb3J0cy50b3VjaGVuZCA9IHRvdWNoZW5kO1xyXG4vKipcclxuICogTm90ZSB3ZSBkb24ndCBnZXQgdG91Y2hlbnRlci90b3VjaGxlYXZlICh3aGljaCBhcmUgZGVwcmVjYXRlZClcclxuICogc2VlIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzI3OTA4MzM5L2pzLXRvdWNoLWVxdWl2YWxlbnQtZm9yLW1vdXNlZW50ZXJcclxuICogc28gaW5zdGVhZCBvZiBQb2ludGVyRXZlbnQgdG8gc3RpbGwgZ2V0IGVudGVyL2xlYXZlIGFuZCBzZW5kIHRoZSBtYXRjaGluZyBtb3VzZSBldmVudC5cclxuICovXHJcbmZ1bmN0aW9uIHBvaW50ZXJkb3duKGUpIHtcclxuICAgIC8vIGNvbnNvbGUubG9nKFwicG9pbnRlciBkb3duXCIpXHJcbiAgICBlLnRhcmdldC5yZWxlYXNlUG9pbnRlckNhcHR1cmUoZS5wb2ludGVySWQpOyAvLyA8LSBJbXBvcnRhbnQhXHJcbn1cclxuZXhwb3J0cy5wb2ludGVyZG93biA9IHBvaW50ZXJkb3duO1xyXG5mdW5jdGlvbiBwb2ludGVyZW50ZXIoZSkge1xyXG4gICAgLy8gaWdub3JlIHRoZSBpbml0aWFsIG9uZSB3ZSBnZXQgb24gcG9pbnRlcmRvd24gb24gb3Vyc2VsZlxyXG4gICAgaWYgKCFkZF9tYW5hZ2VyXzEuRERNYW5hZ2VyLmRyYWdFbGVtZW50KSB7XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ3BvaW50ZXJlbnRlciBpZ25vcmVkJyk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgLy8gY29uc29sZS5sb2coJ3BvaW50ZXJlbnRlcicpO1xyXG4gICAgc2ltdWxhdGVQb2ludGVyTW91c2VFdmVudChlLCAnbW91c2VlbnRlcicpO1xyXG59XHJcbmV4cG9ydHMucG9pbnRlcmVudGVyID0gcG9pbnRlcmVudGVyO1xyXG5mdW5jdGlvbiBwb2ludGVybGVhdmUoZSkge1xyXG4gICAgLy8gaWdub3JlIHRoZSBsZWF2ZSBvbiBvdXJzZWxmIHdlIGdldCBiZWZvcmUgcmVsZWFzaW5nIHRoZSBtb3VzZSBvdmVyIG91cnNlbGZcclxuICAgIC8vIGJ5IGRlbGF5aW5nIHNlbmRpbmcgdGhlIGV2ZW50IGFuZCBoYXZpbmcgdGhlIHVwIGV2ZW50IGNhbmNlbCB1c1xyXG4gICAgaWYgKCFkZF9tYW5hZ2VyXzEuRERNYW5hZ2VyLmRyYWdFbGVtZW50KSB7XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ3BvaW50ZXJsZWF2ZSBpZ25vcmVkJyk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgRERUb3VjaC5wb2ludGVyTGVhdmVUaW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIGRlbGV0ZSBERFRvdWNoLnBvaW50ZXJMZWF2ZVRpbWVvdXQ7XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ3BvaW50ZXJsZWF2ZSBkZWxheWVkJyk7XHJcbiAgICAgICAgc2ltdWxhdGVQb2ludGVyTW91c2VFdmVudChlLCAnbW91c2VsZWF2ZScpO1xyXG4gICAgfSwgMTApO1xyXG59XHJcbmV4cG9ydHMucG9pbnRlcmxlYXZlID0gcG9pbnRlcmxlYXZlO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZC10b3VjaC5qcy5tYXAiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///4770\n")},7:(__unused_webpack_module,exports,__webpack_require__)=>{"use strict";eval("\r\n/**\r\n * gridstack-engine.ts 7.3.0\r\n * Copyright (c) 2021-2022 Alain Dumesny - see GridStack root license\r\n */\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.GridStackEngine = void 0;\r\nconst utils_1 = __webpack_require__(6480);\r\n/**\r\n * Defines the GridStack engine that does most no DOM grid manipulation.\r\n * See GridStack methods and vars for descriptions.\r\n *\r\n * NOTE: values should not be modified directly - call the main GridStack API instead\r\n */\r\nclass GridStackEngine {\r\n constructor(opts = {}) {\r\n this.addedNodes = [];\r\n this.removedNodes = [];\r\n this.column = opts.column || 12;\r\n this.maxRow = opts.maxRow;\r\n this._float = opts.float;\r\n this.nodes = opts.nodes || [];\r\n this.onChange = opts.onChange;\r\n }\r\n batchUpdate(flag = true) {\r\n if (!!this.batchMode === flag)\r\n return this;\r\n this.batchMode = flag;\r\n if (flag) {\r\n this._prevFloat = this._float;\r\n this._float = true; // let things go anywhere for now... will restore and possibly reposition later\r\n this.saveInitial(); // since begin update (which is called multiple times) won't do this\r\n }\r\n else {\r\n this._float = this._prevFloat;\r\n delete this._prevFloat;\r\n this._packNodes()._notify();\r\n }\r\n return this;\r\n }\r\n // use entire row for hitting area (will use bottom reverse sorted first) if we not actively moving DOWN and didn't already skip\r\n _useEntireRowArea(node, nn) {\r\n return (!this.float || this.batchMode && !this._prevFloat) && !this._hasLocked && (!node._moving || node._skipDown || nn.y <= node.y);\r\n }\r\n /** @internal fix collision on given 'node', going to given new location 'nn', with optional 'collide' node already found.\r\n * return true if we moved. */\r\n _fixCollisions(node, nn = node, collide, opt = {}) {\r\n this.sortNodes(-1); // from last to first, so recursive collision move items in the right order\r\n collide = collide || this.collide(node, nn); // REAL area collide for swap and skip if none...\r\n if (!collide)\r\n return false;\r\n // swap check: if we're actively moving in gravity mode, see if we collide with an object the same size\r\n if (node._moving && !opt.nested && !this.float) {\r\n if (this.swap(node, collide))\r\n return true;\r\n }\r\n // during while() collisions MAKE SURE to check entire row so larger items don't leap frog small ones (push them all down starting last in grid)\r\n let area = nn;\r\n if (this._useEntireRowArea(node, nn)) {\r\n area = { x: 0, w: this.column, y: nn.y, h: nn.h };\r\n collide = this.collide(node, area, opt.skip); // force new hit\r\n }\r\n let didMove = false;\r\n let newOpt = { nested: true, pack: false };\r\n while (collide = collide || this.collide(node, area, opt.skip)) { // could collide with more than 1 item... so repeat for each\r\n let moved;\r\n // if colliding with a locked item OR moving down with top gravity (and collide could move up) -> skip past the collide,\r\n // but remember that skip down so we only do this once (and push others otherwise).\r\n if (collide.locked || node._moving && !node._skipDown && nn.y > node.y && !this.float &&\r\n // can take space we had, or before where we're going\r\n (!this.collide(collide, Object.assign(Object.assign({}, collide), { y: node.y }), node) || !this.collide(collide, Object.assign(Object.assign({}, collide), { y: nn.y - collide.h }), node))) {\r\n node._skipDown = (node._skipDown || nn.y > node.y);\r\n moved = this.moveNode(node, Object.assign(Object.assign(Object.assign({}, nn), { y: collide.y + collide.h }), newOpt));\r\n if (collide.locked && moved) {\r\n utils_1.Utils.copyPos(nn, node); // moving after lock become our new desired location\r\n }\r\n else if (!collide.locked && moved && opt.pack) {\r\n // we moved after and will pack: do it now and keep the original drop location, but past the old collide to see what else we might push way\r\n this._packNodes();\r\n nn.y = collide.y + collide.h;\r\n utils_1.Utils.copyPos(node, nn);\r\n }\r\n didMove = didMove || moved;\r\n }\r\n else {\r\n // move collide down *after* where we will be, ignoring where we are now (don't collide with us)\r\n moved = this.moveNode(collide, Object.assign(Object.assign(Object.assign({}, collide), { y: nn.y + nn.h, skip: node }), newOpt));\r\n }\r\n if (!moved) {\r\n return didMove;\r\n } // break inf loop if we couldn't move after all (ex: maxRow, fixed)\r\n collide = undefined;\r\n }\r\n return didMove;\r\n }\r\n /** return the nodes that intercept the given node. Optionally a different area can be used, as well as a second node to skip */\r\n collide(skip, area = skip, skip2) {\r\n return this.nodes.find(n => n !== skip && n !== skip2 && utils_1.Utils.isIntercepted(n, area));\r\n }\r\n collideAll(skip, area = skip, skip2) {\r\n return this.nodes.filter(n => n !== skip && n !== skip2 && utils_1.Utils.isIntercepted(n, area));\r\n }\r\n /** does a pixel coverage collision based on where we started, returning the node that has the most coverage that is >50% mid line */\r\n directionCollideCoverage(node, o, collides) {\r\n if (!o.rect || !node._rect)\r\n return;\r\n let r0 = node._rect; // where started\r\n let r = Object.assign({}, o.rect); // where we are\r\n // update dragged rect to show where it's coming from (above or below, etc...)\r\n if (r.y > r0.y) {\r\n r.h += r.y - r0.y;\r\n r.y = r0.y;\r\n }\r\n else {\r\n r.h += r0.y - r.y;\r\n }\r\n if (r.x > r0.x) {\r\n r.w += r.x - r0.x;\r\n r.x = r0.x;\r\n }\r\n else {\r\n r.w += r0.x - r.x;\r\n }\r\n let collide;\r\n collides.forEach(n => {\r\n if (n.locked || !n._rect)\r\n return;\r\n let r2 = n._rect; // overlapping target\r\n let yOver = Number.MAX_VALUE, xOver = Number.MAX_VALUE, overMax = 0.5; // need >50%\r\n // depending on which side we started from, compute the overlap % of coverage\r\n // (ex: from above/below we only compute the max horizontal line coverage)\r\n if (r0.y < r2.y) { // from above\r\n yOver = ((r.y + r.h) - r2.y) / r2.h;\r\n }\r\n else if (r0.y + r0.h > r2.y + r2.h) { // from below\r\n yOver = ((r2.y + r2.h) - r.y) / r2.h;\r\n }\r\n if (r0.x < r2.x) { // from the left\r\n xOver = ((r.x + r.w) - r2.x) / r2.w;\r\n }\r\n else if (r0.x + r0.w > r2.x + r2.w) { // from the right\r\n xOver = ((r2.x + r2.w) - r.x) / r2.w;\r\n }\r\n let over = Math.min(xOver, yOver);\r\n if (over > overMax) {\r\n overMax = over;\r\n collide = n;\r\n }\r\n });\r\n o.collide = collide; // save it so we don't have to find it again\r\n return collide;\r\n }\r\n /** does a pixel coverage returning the node that has the most coverage by area */\r\n /*\r\n protected collideCoverage(r: GridStackPosition, collides: GridStackNode[]): {collide: GridStackNode, over: number} {\r\n let collide: GridStackNode;\r\n let overMax = 0;\r\n collides.forEach(n => {\r\n if (n.locked || !n._rect) return;\r\n let over = Utils.areaIntercept(r, n._rect);\r\n if (over > overMax) {\r\n overMax = over;\r\n collide = n;\r\n }\r\n });\r\n return {collide, over: overMax};\r\n }\r\n */\r\n /** called to cache the nodes pixel rectangles used for collision detection during drag */\r\n cacheRects(w, h, top, right, bottom, left) {\r\n this.nodes.forEach(n => n._rect = {\r\n y: n.y * h + top,\r\n x: n.x * w + left,\r\n w: n.w * w - left - right,\r\n h: n.h * h - top - bottom\r\n });\r\n return this;\r\n }\r\n /** called to possibly swap between 2 nodes (same size or column, not locked, touching), returning true if successful */\r\n swap(a, b) {\r\n if (!b || b.locked || !a || a.locked)\r\n return false;\r\n function _doSwap() {\r\n let x = b.x, y = b.y;\r\n b.x = a.x;\r\n b.y = a.y; // b -> a position\r\n if (a.h != b.h) {\r\n a.x = x;\r\n a.y = b.y + b.h; // a -> goes after b\r\n }\r\n else if (a.w != b.w) {\r\n a.x = b.x + b.w;\r\n a.y = y; // a -> goes after b\r\n }\r\n else {\r\n a.x = x;\r\n a.y = y; // a -> old b position\r\n }\r\n a._dirty = b._dirty = true;\r\n return true;\r\n }\r\n let touching; // remember if we called it (vs undefined)\r\n // same size and same row or column, and touching\r\n if (a.w === b.w && a.h === b.h && (a.x === b.x || a.y === b.y) && (touching = utils_1.Utils.isTouching(a, b)))\r\n return _doSwap();\r\n if (touching === false)\r\n return; // IFF ran test and fail, bail out\r\n // check for taking same columns (but different height) and touching\r\n if (a.w === b.w && a.x === b.x && (touching || (touching = utils_1.Utils.isTouching(a, b)))) {\r\n if (b.y < a.y) {\r\n let t = a;\r\n a = b;\r\n b = t;\r\n } // swap a <-> b vars so a is first\r\n return _doSwap();\r\n }\r\n if (touching === false)\r\n return;\r\n // check if taking same row (but different width) and touching\r\n if (a.h === b.h && a.y === b.y && (touching || (touching = utils_1.Utils.isTouching(a, b)))) {\r\n if (b.x < a.x) {\r\n let t = a;\r\n a = b;\r\n b = t;\r\n } // swap a <-> b vars so a is first\r\n return _doSwap();\r\n }\r\n return false;\r\n }\r\n isAreaEmpty(x, y, w, h) {\r\n let nn = { x: x || 0, y: y || 0, w: w || 1, h: h || 1 };\r\n return !this.collide(nn);\r\n }\r\n /** re-layout grid items to reclaim any empty space */\r\n compact() {\r\n if (this.nodes.length === 0)\r\n return this;\r\n this.batchUpdate()\r\n .sortNodes();\r\n let copyNodes = this.nodes;\r\n this.nodes = []; // pretend we have no nodes to conflict layout to start with...\r\n copyNodes.forEach(node => {\r\n if (!node.locked) {\r\n node.autoPosition = true;\r\n }\r\n this.addNode(node, false); // 'false' for add event trigger\r\n node._dirty = true; // will force attr update\r\n });\r\n return this.batchUpdate(false);\r\n }\r\n /** enable/disable floating widgets (default: `false`) See [example](http://gridstackjs.com/demo/float.html) */\r\n set float(val) {\r\n if (this._float === val)\r\n return;\r\n this._float = val || false;\r\n if (!val) {\r\n this._packNodes()._notify();\r\n }\r\n }\r\n /** float getter method */\r\n get float() { return this._float || false; }\r\n /** sort the nodes array from first to last, or reverse. Called during collision/placement to force an order */\r\n sortNodes(dir) {\r\n this.nodes = utils_1.Utils.sort(this.nodes, dir, this.column);\r\n return this;\r\n }\r\n /** @internal called to top gravity pack the items back OR revert back to original Y positions when floating */\r\n _packNodes() {\r\n if (this.batchMode) {\r\n return this;\r\n }\r\n this.sortNodes(); // first to last\r\n if (this.float) {\r\n // restore original Y pos\r\n this.nodes.forEach(n => {\r\n if (n._updating || n._orig === undefined || n.y === n._orig.y)\r\n return;\r\n let newY = n.y;\r\n while (newY > n._orig.y) {\r\n --newY;\r\n let collide = this.collide(n, { x: n.x, y: newY, w: n.w, h: n.h });\r\n if (!collide) {\r\n n._dirty = true;\r\n n.y = newY;\r\n }\r\n }\r\n });\r\n }\r\n else {\r\n // top gravity pack\r\n this.nodes.forEach((n, i) => {\r\n if (n.locked)\r\n return;\r\n while (n.y > 0) {\r\n let newY = i === 0 ? 0 : n.y - 1;\r\n let canBeMoved = i === 0 || !this.collide(n, { x: n.x, y: newY, w: n.w, h: n.h });\r\n if (!canBeMoved)\r\n break;\r\n // Note: must be dirty (from last position) for GridStack::OnChange CB to update positions\r\n // and move items back. The user 'change' CB should detect changes from the original\r\n // starting position instead.\r\n n._dirty = (n.y !== newY);\r\n n.y = newY;\r\n }\r\n });\r\n }\r\n return this;\r\n }\r\n /**\r\n * given a random node, makes sure it's coordinates/values are valid in the current grid\r\n * @param node to adjust\r\n * @param resizing if out of bound, resize down or move into the grid to fit ?\r\n */\r\n prepareNode(node, resizing) {\r\n node = node || {};\r\n node._id = node._id || GridStackEngine._idSeq++;\r\n // if we're missing position, have the grid position us automatically (before we set them to 0,0)\r\n if (node.x === undefined || node.y === undefined || node.x === null || node.y === null) {\r\n node.autoPosition = true;\r\n }\r\n // assign defaults for missing required fields\r\n let defaults = { x: 0, y: 0, w: 1, h: 1 };\r\n utils_1.Utils.defaults(node, defaults);\r\n if (!node.autoPosition) {\r\n delete node.autoPosition;\r\n }\r\n if (!node.noResize) {\r\n delete node.noResize;\r\n }\r\n if (!node.noMove) {\r\n delete node.noMove;\r\n }\r\n // check for NaN (in case messed up strings were passed. can't do parseInt() || defaults.x above as 0 is valid #)\r\n if (typeof node.x == 'string') {\r\n node.x = Number(node.x);\r\n }\r\n if (typeof node.y == 'string') {\r\n node.y = Number(node.y);\r\n }\r\n if (typeof node.w == 'string') {\r\n node.w = Number(node.w);\r\n }\r\n if (typeof node.h == 'string') {\r\n node.h = Number(node.h);\r\n }\r\n if (isNaN(node.x)) {\r\n node.x = defaults.x;\r\n node.autoPosition = true;\r\n }\r\n if (isNaN(node.y)) {\r\n node.y = defaults.y;\r\n node.autoPosition = true;\r\n }\r\n if (isNaN(node.w)) {\r\n node.w = defaults.w;\r\n }\r\n if (isNaN(node.h)) {\r\n node.h = defaults.h;\r\n }\r\n return this.nodeBoundFix(node, resizing);\r\n }\r\n /** part2 of preparing a node to fit inside our grid - checks for x,y,w from grid dimensions */\r\n nodeBoundFix(node, resizing) {\r\n let before = node._orig || utils_1.Utils.copyPos({}, node);\r\n if (node.maxW) {\r\n node.w = Math.min(node.w, node.maxW);\r\n }\r\n if (node.maxH) {\r\n node.h = Math.min(node.h, node.maxH);\r\n }\r\n if (node.minW && node.minW <= this.column) {\r\n node.w = Math.max(node.w, node.minW);\r\n }\r\n if (node.minH) {\r\n node.h = Math.max(node.h, node.minH);\r\n }\r\n // if user loaded a larger than allowed widget for current # of columns (or force 1 column mode),\r\n // remember it's position & width so we can restore back (1 -> 12 column) #1655 #1985\r\n // IFF we're not in the middle of column resizing!\r\n const saveOrig = this.column === 1 || node.x + node.w > this.column;\r\n if (saveOrig && this.column < 12 && !this._inColumnResize && node._id && this.findCacheLayout(node, 12) === -1) {\r\n let copy = Object.assign({}, node); // need _id + positions\r\n if (copy.autoPosition) {\r\n delete copy.x;\r\n delete copy.y;\r\n }\r\n else\r\n copy.x = Math.min(11, copy.x);\r\n copy.w = Math.min(12, copy.w);\r\n this.cacheOneLayout(copy, 12);\r\n }\r\n if (node.w > this.column) {\r\n node.w = this.column;\r\n }\r\n else if (node.w < 1) {\r\n node.w = 1;\r\n }\r\n if (this.maxRow && node.h > this.maxRow) {\r\n node.h = this.maxRow;\r\n }\r\n else if (node.h < 1) {\r\n node.h = 1;\r\n }\r\n if (node.x < 0) {\r\n node.x = 0;\r\n }\r\n if (node.y < 0) {\r\n node.y = 0;\r\n }\r\n if (node.x + node.w > this.column) {\r\n if (resizing) {\r\n node.w = this.column - node.x;\r\n }\r\n else {\r\n node.x = this.column - node.w;\r\n }\r\n }\r\n if (this.maxRow && node.y + node.h > this.maxRow) {\r\n if (resizing) {\r\n node.h = this.maxRow - node.y;\r\n }\r\n else {\r\n node.y = this.maxRow - node.h;\r\n }\r\n }\r\n if (!utils_1.Utils.samePos(node, before)) {\r\n node._dirty = true;\r\n }\r\n return node;\r\n }\r\n /** returns a list of modified nodes from their original values */\r\n getDirtyNodes(verify) {\r\n // compare original x,y,w,h instead as _dirty can be a temporary state\r\n if (verify) {\r\n return this.nodes.filter(n => n._dirty && !utils_1.Utils.samePos(n, n._orig));\r\n }\r\n return this.nodes.filter(n => n._dirty);\r\n }\r\n /** @internal call this to call onChange callback with dirty nodes so DOM can be updated */\r\n _notify(removedNodes) {\r\n if (this.batchMode || !this.onChange)\r\n return this;\r\n let dirtyNodes = (removedNodes || []).concat(this.getDirtyNodes());\r\n this.onChange(dirtyNodes);\r\n return this;\r\n }\r\n /** @internal remove dirty and last tried info */\r\n cleanNodes() {\r\n if (this.batchMode)\r\n return this;\r\n this.nodes.forEach(n => {\r\n delete n._dirty;\r\n delete n._lastTried;\r\n });\r\n return this;\r\n }\r\n /** @internal called to save initial position/size to track real dirty state.\r\n * Note: should be called right after we call change event (so next API is can detect changes)\r\n * as well as right before we start move/resize/enter (so we can restore items to prev values) */\r\n saveInitial() {\r\n this.nodes.forEach(n => {\r\n n._orig = utils_1.Utils.copyPos({}, n);\r\n delete n._dirty;\r\n });\r\n this._hasLocked = this.nodes.some(n => n.locked);\r\n return this;\r\n }\r\n /** @internal restore all the nodes back to initial values (called when we leave) */\r\n restoreInitial() {\r\n this.nodes.forEach(n => {\r\n if (utils_1.Utils.samePos(n, n._orig))\r\n return;\r\n utils_1.Utils.copyPos(n, n._orig);\r\n n._dirty = true;\r\n });\r\n this._notify();\r\n return this;\r\n }\r\n /** find the first available empty spot for the given node width/height, updating the x,y attributes. return true if found.\r\n * optionally you can pass your own existing node list and column count, otherwise defaults to that engine data.\r\n */\r\n findEmptyPosition(node, nodeList = this.nodes, column = this.column) {\r\n nodeList = utils_1.Utils.sort(nodeList, -1, column);\r\n let found = false;\r\n for (let i = 0; !found; ++i) {\r\n let x = i % column;\r\n let y = Math.floor(i / column);\r\n if (x + node.w > column) {\r\n continue;\r\n }\r\n let box = { x, y, w: node.w, h: node.h };\r\n if (!nodeList.find(n => utils_1.Utils.isIntercepted(box, n))) {\r\n node.x = x;\r\n node.y = y;\r\n delete node.autoPosition;\r\n found = true;\r\n }\r\n }\r\n return found;\r\n }\r\n /** call to add the given node to our list, fixing collision and re-packing */\r\n addNode(node, triggerAddEvent = false) {\r\n let dup = this.nodes.find(n => n._id === node._id);\r\n if (dup)\r\n return dup; // prevent inserting twice! return it instead.\r\n // skip prepareNode if we're in middle of column resize (not new) but do check for bounds!\r\n node = this._inColumnResize ? this.nodeBoundFix(node) : this.prepareNode(node);\r\n delete node._temporaryRemoved;\r\n delete node._removeDOM;\r\n if (node.autoPosition && this.findEmptyPosition(node)) {\r\n delete node.autoPosition; // found our slot\r\n }\r\n this.nodes.push(node);\r\n if (triggerAddEvent) {\r\n this.addedNodes.push(node);\r\n }\r\n this._fixCollisions(node);\r\n if (!this.batchMode) {\r\n this._packNodes()._notify();\r\n }\r\n return node;\r\n }\r\n removeNode(node, removeDOM = true, triggerEvent = false) {\r\n if (!this.nodes.find(n => n === node)) {\r\n // TEST console.log(`Error: GridStackEngine.removeNode() node._id=${node._id} not found!`)\r\n return this;\r\n }\r\n if (triggerEvent) { // we wait until final drop to manually track removed items (rather than during drag)\r\n this.removedNodes.push(node);\r\n }\r\n if (removeDOM)\r\n node._removeDOM = true; // let CB remove actual HTML (used to set _id to null, but then we loose layout info)\r\n // don't use 'faster' .splice(findIndex(),1) in case node isn't in our list, or in multiple times.\r\n this.nodes = this.nodes.filter(n => n !== node);\r\n return this._packNodes()\r\n ._notify([node]);\r\n }\r\n removeAll(removeDOM = true) {\r\n delete this._layouts;\r\n if (this.nodes.length === 0)\r\n return this;\r\n removeDOM && this.nodes.forEach(n => n._removeDOM = true); // let CB remove actual HTML (used to set _id to null, but then we loose layout info)\r\n this.removedNodes = this.nodes;\r\n this.nodes = [];\r\n return this._notify(this.removedNodes);\r\n }\r\n /** checks if item can be moved (layout constrain) vs moveNode(), returning true if was able to move.\r\n * In more complicated cases (maxRow) it will attempt at moving the item and fixing\r\n * others in a clone first, then apply those changes if still within specs. */\r\n moveNodeCheck(node, o) {\r\n // if (node.locked) return false;\r\n if (!this.changedPosConstrain(node, o))\r\n return false;\r\n o.pack = true;\r\n // simpler case: move item directly...\r\n if (!this.maxRow) {\r\n return this.moveNode(node, o);\r\n }\r\n // complex case: create a clone with NO maxRow (will check for out of bounds at the end)\r\n let clonedNode;\r\n let clone = new GridStackEngine({\r\n column: this.column,\r\n float: this.float,\r\n nodes: this.nodes.map(n => {\r\n if (n === node) {\r\n clonedNode = Object.assign({}, n);\r\n return clonedNode;\r\n }\r\n return Object.assign({}, n);\r\n })\r\n });\r\n if (!clonedNode)\r\n return false;\r\n // check if we're covering 50% collision and could move\r\n let canMove = clone.moveNode(clonedNode, o) && clone.getRow() <= this.maxRow;\r\n // else check if we can force a swap (float=true, or different shapes) on non-resize\r\n if (!canMove && !o.resizing && o.collide) {\r\n let collide = o.collide.el.gridstackNode; // find the source node the clone collided with at 50%\r\n if (this.swap(node, collide)) { // swaps and mark dirty\r\n this._notify();\r\n return true;\r\n }\r\n }\r\n if (!canMove)\r\n return false;\r\n // if clone was able to move, copy those mods over to us now instead of caller trying to do this all over!\r\n // Note: we can't use the list directly as elements and other parts point to actual node, so copy content\r\n clone.nodes.filter(n => n._dirty).forEach(c => {\r\n let n = this.nodes.find(a => a._id === c._id);\r\n if (!n)\r\n return;\r\n utils_1.Utils.copyPos(n, c);\r\n n._dirty = true;\r\n });\r\n this._notify();\r\n return true;\r\n }\r\n /** return true if can fit in grid height constrain only (always true if no maxRow) */\r\n willItFit(node) {\r\n delete node._willFitPos;\r\n if (!this.maxRow)\r\n return true;\r\n // create a clone with NO maxRow and check if still within size\r\n let clone = new GridStackEngine({\r\n column: this.column,\r\n float: this.float,\r\n nodes: this.nodes.map(n => { return Object.assign({}, n); })\r\n });\r\n let n = Object.assign({}, node); // clone node so we don't mod any settings on it but have full autoPosition and min/max as well! #1687\r\n this.cleanupNode(n);\r\n delete n.el;\r\n delete n._id;\r\n delete n.content;\r\n delete n.grid;\r\n clone.addNode(n);\r\n if (clone.getRow() <= this.maxRow) {\r\n node._willFitPos = utils_1.Utils.copyPos({}, n);\r\n return true;\r\n }\r\n return false;\r\n }\r\n /** true if x,y or w,h are different after clamping to min/max */\r\n changedPosConstrain(node, p) {\r\n // first make sure w,h are set for caller\r\n p.w = p.w || node.w;\r\n p.h = p.h || node.h;\r\n if (node.x !== p.x || node.y !== p.y)\r\n return true;\r\n // check constrained w,h\r\n if (node.maxW) {\r\n p.w = Math.min(p.w, node.maxW);\r\n }\r\n if (node.maxH) {\r\n p.h = Math.min(p.h, node.maxH);\r\n }\r\n if (node.minW) {\r\n p.w = Math.max(p.w, node.minW);\r\n }\r\n if (node.minH) {\r\n p.h = Math.max(p.h, node.minH);\r\n }\r\n return (node.w !== p.w || node.h !== p.h);\r\n }\r\n /** return true if the passed in node was actually moved (checks for no-op and locked) */\r\n moveNode(node, o) {\r\n var _a, _b;\r\n if (!node || /*node.locked ||*/ !o)\r\n return false;\r\n let wasUndefinedPack;\r\n if (o.pack === undefined) {\r\n wasUndefinedPack = o.pack = true;\r\n }\r\n // constrain the passed in values and check if we're still changing our node\r\n if (typeof o.x !== 'number') {\r\n o.x = node.x;\r\n }\r\n if (typeof o.y !== 'number') {\r\n o.y = node.y;\r\n }\r\n if (typeof o.w !== 'number') {\r\n o.w = node.w;\r\n }\r\n if (typeof o.h !== 'number') {\r\n o.h = node.h;\r\n }\r\n let resizing = (node.w !== o.w || node.h !== o.h);\r\n let nn = utils_1.Utils.copyPos({}, node, true); // get min/max out first, then opt positions next\r\n utils_1.Utils.copyPos(nn, o);\r\n nn = this.nodeBoundFix(nn, resizing);\r\n utils_1.Utils.copyPos(o, nn);\r\n if (utils_1.Utils.samePos(node, o))\r\n return false;\r\n let prevPos = utils_1.Utils.copyPos({}, node);\r\n // check if we will need to fix collision at our new location\r\n let collides = this.collideAll(node, nn, o.skip);\r\n let needToMove = true;\r\n if (collides.length) {\r\n let activeDrag = node._moving && !o.nested;\r\n // check to make sure we actually collided over 50% surface area while dragging\r\n let collide = activeDrag ? this.directionCollideCoverage(node, o, collides) : collides[0];\r\n // if we're enabling creation of sub-grids on the fly, see if we're covering 80% of either one, if we didn't already do that\r\n if (activeDrag && collide && ((_b = (_a = node.grid) === null || _a === void 0 ? void 0 : _a.opts) === null || _b === void 0 ? void 0 : _b.subGridDynamic) && !node.grid._isTemp) {\r\n let over = utils_1.Utils.areaIntercept(o.rect, collide._rect);\r\n let a1 = utils_1.Utils.area(o.rect);\r\n let a2 = utils_1.Utils.area(collide._rect);\r\n let perc = over / (a1 < a2 ? a1 : a2);\r\n if (perc > .8) {\r\n collide.grid.makeSubGrid(collide.el, undefined, node);\r\n collide = undefined;\r\n }\r\n }\r\n if (collide) {\r\n needToMove = !this._fixCollisions(node, nn, collide, o); // check if already moved...\r\n }\r\n else {\r\n needToMove = false; // we didn't cover >50% for a move, skip...\r\n if (wasUndefinedPack)\r\n delete o.pack;\r\n }\r\n }\r\n // now move (to the original ask vs the collision version which might differ) and repack things\r\n if (needToMove) {\r\n node._dirty = true;\r\n utils_1.Utils.copyPos(node, nn);\r\n }\r\n if (o.pack) {\r\n this._packNodes()\r\n ._notify();\r\n }\r\n return !utils_1.Utils.samePos(node, prevPos); // pack might have moved things back\r\n }\r\n getRow() {\r\n return this.nodes.reduce((row, n) => Math.max(row, n.y + n.h), 0);\r\n }\r\n beginUpdate(node) {\r\n if (!node._updating) {\r\n node._updating = true;\r\n delete node._skipDown;\r\n if (!this.batchMode)\r\n this.saveInitial();\r\n }\r\n return this;\r\n }\r\n endUpdate() {\r\n let n = this.nodes.find(n => n._updating);\r\n if (n) {\r\n delete n._updating;\r\n delete n._skipDown;\r\n }\r\n return this;\r\n }\r\n /** saves a copy of the largest column layout (eg 12 even when rendering oneColumnMode) so we don't loose orig layout,\r\n * returning a list of widgets for serialization */\r\n save(saveElement = true) {\r\n var _a;\r\n // use the highest layout for any saved info so we can have full detail on reload #1849\r\n let len = (_a = this._layouts) === null || _a === void 0 ? void 0 : _a.length;\r\n let layout = len && this.column !== (len - 1) ? this._layouts[len - 1] : null;\r\n let list = [];\r\n this.sortNodes();\r\n this.nodes.forEach(n => {\r\n let wl = layout === null || layout === void 0 ? void 0 : layout.find(l => l._id === n._id);\r\n let w = Object.assign({}, n);\r\n // use layout info instead if set\r\n if (wl) {\r\n w.x = wl.x;\r\n w.y = wl.y;\r\n w.w = wl.w;\r\n }\r\n utils_1.Utils.removeInternalForSave(w, !saveElement);\r\n list.push(w);\r\n });\r\n return list;\r\n }\r\n /** @internal called whenever a node is added or moved - updates the cached layouts */\r\n layoutsNodesChange(nodes) {\r\n if (!this._layouts || this._inColumnResize)\r\n return this;\r\n // remove smaller layouts - we will re-generate those on the fly... larger ones need to update\r\n this._layouts.forEach((layout, column) => {\r\n if (!layout || column === this.column)\r\n return this;\r\n if (column < this.column) {\r\n this._layouts[column] = undefined;\r\n }\r\n else {\r\n // we save the original x,y,w (h isn't cached) to see what actually changed to propagate better.\r\n // NOTE: we don't need to check against out of bound scaling/moving as that will be done when using those cache values. #1785\r\n let ratio = column / this.column;\r\n nodes.forEach(node => {\r\n if (!node._orig)\r\n return; // didn't change (newly added ?)\r\n let n = layout.find(l => l._id === node._id);\r\n if (!n)\r\n return; // no cache for new nodes. Will use those values.\r\n // Y changed, push down same amount\r\n // TODO: detect doing item 'swaps' will help instead of move (especially in 1 column mode)\r\n if (node.y !== node._orig.y) {\r\n n.y += (node.y - node._orig.y);\r\n }\r\n // X changed, scale from new position\r\n if (node.x !== node._orig.x) {\r\n n.x = Math.round(node.x * ratio);\r\n }\r\n // width changed, scale from new width\r\n if (node.w !== node._orig.w) {\r\n n.w = Math.round(node.w * ratio);\r\n }\r\n // ...height always carries over from cache\r\n });\r\n }\r\n });\r\n return this;\r\n }\r\n /**\r\n * @internal Called to scale the widget width & position up/down based on the column change.\r\n * Note we store previous layouts (especially original ones) to make it possible to go\r\n * from say 12 -> 1 -> 12 and get back to where we were.\r\n *\r\n * @param prevColumn previous number of columns\r\n * @param column new column number\r\n * @param nodes different sorted list (ex: DOM order) instead of current list\r\n * @param layout specify the type of re-layout that will happen (position, size, etc...).\r\n * Note: items will never be outside of the current column boundaries. default (moveScale). Ignored for 1 column\r\n */\r\n updateNodeWidths(prevColumn, column, nodes, layout = 'moveScale') {\r\n var _a;\r\n if (!this.nodes.length || !column || prevColumn === column)\r\n return this;\r\n // cache the current layout in case they want to go back (like 12 -> 1 -> 12) as it requires original data\r\n this.cacheLayout(this.nodes, prevColumn);\r\n this.batchUpdate(); // do this EARLY as it will call saveInitial() so we can detect where we started for _dirty and collision\r\n let newNodes = [];\r\n // if we're going to 1 column and using DOM order rather than default sorting, then generate that layout\r\n let domOrder = false;\r\n if (column === 1 && (nodes === null || nodes === void 0 ? void 0 : nodes.length)) {\r\n domOrder = true;\r\n let top = 0;\r\n nodes.forEach(n => {\r\n n.x = 0;\r\n n.w = 1;\r\n n.y = Math.max(n.y, top);\r\n top = n.y + n.h;\r\n });\r\n newNodes = nodes;\r\n nodes = [];\r\n }\r\n else {\r\n nodes = utils_1.Utils.sort(this.nodes, -1, prevColumn); // current column reverse sorting so we can insert last to front (limit collision)\r\n }\r\n // see if we have cached previous layout IFF we are going up in size (restore) otherwise always\r\n // generate next size down from where we are (looks more natural as you gradually size down).\r\n let cacheNodes = [];\r\n if (column > prevColumn) {\r\n cacheNodes = this._layouts[column] || [];\r\n // ...if not, start with the largest layout (if not already there) as down-scaling is more accurate\r\n // by pretending we came from that larger column by assigning those values as starting point\r\n let lastIndex = this._layouts.length - 1;\r\n if (!cacheNodes.length && prevColumn !== lastIndex && ((_a = this._layouts[lastIndex]) === null || _a === void 0 ? void 0 : _a.length)) {\r\n prevColumn = lastIndex;\r\n this._layouts[lastIndex].forEach(cacheNode => {\r\n let n = nodes.find(n => n._id === cacheNode._id);\r\n if (n) {\r\n // still current, use cache info positions\r\n n.x = cacheNode.x;\r\n n.y = cacheNode.y;\r\n n.w = cacheNode.w;\r\n }\r\n });\r\n }\r\n }\r\n // if we found cache re-use those nodes that are still current\r\n cacheNodes.forEach(cacheNode => {\r\n let j = nodes.findIndex(n => n._id === cacheNode._id);\r\n if (j !== -1) {\r\n // still current, use cache info positions\r\n if (cacheNode.autoPosition || isNaN(cacheNode.x) || isNaN(cacheNode.y)) {\r\n this.findEmptyPosition(cacheNode, newNodes);\r\n }\r\n if (!cacheNode.autoPosition) {\r\n nodes[j].x = cacheNode.x;\r\n nodes[j].y = cacheNode.y;\r\n nodes[j].w = cacheNode.w;\r\n newNodes.push(nodes[j]);\r\n }\r\n nodes.splice(j, 1);\r\n }\r\n });\r\n // ...and add any extra non-cached ones\r\n if (nodes.length) {\r\n if (typeof layout === 'function') {\r\n layout(column, prevColumn, newNodes, nodes);\r\n }\r\n else if (!domOrder) {\r\n let ratio = column / prevColumn;\r\n let move = (layout === 'move' || layout === 'moveScale');\r\n let scale = (layout === 'scale' || layout === 'moveScale');\r\n nodes.forEach(node => {\r\n // NOTE: x + w could be outside of the grid, but addNode() below will handle that\r\n node.x = (column === 1 ? 0 : (move ? Math.round(node.x * ratio) : Math.min(node.x, column - 1)));\r\n node.w = ((column === 1 || prevColumn === 1) ? 1 :\r\n scale ? (Math.round(node.w * ratio) || 1) : (Math.min(node.w, column)));\r\n newNodes.push(node);\r\n });\r\n nodes = [];\r\n }\r\n }\r\n // finally re-layout them in reverse order (to get correct placement)\r\n if (!domOrder)\r\n newNodes = utils_1.Utils.sort(newNodes, -1, column);\r\n this._inColumnResize = true; // prevent cache update\r\n this.nodes = []; // pretend we have no nodes to start with (add() will use same structures) to simplify layout\r\n newNodes.forEach(node => {\r\n this.addNode(node, false); // 'false' for add event trigger\r\n delete node._orig; // make sure the commit doesn't try to restore things back to original\r\n });\r\n this.batchUpdate(false);\r\n delete this._inColumnResize;\r\n return this;\r\n }\r\n /**\r\n * call to cache the given layout internally to the given location so we can restore back when column changes size\r\n * @param nodes list of nodes\r\n * @param column corresponding column index to save it under\r\n * @param clear if true, will force other caches to be removed (default false)\r\n */\r\n cacheLayout(nodes, column, clear = false) {\r\n let copy = [];\r\n nodes.forEach((n, i) => {\r\n n._id = n._id || GridStackEngine._idSeq++; // make sure we have an id in case this is new layout, else re-use id already set\r\n copy[i] = { x: n.x, y: n.y, w: n.w, _id: n._id }; // only thing we change is x,y,w and id to find it back\r\n });\r\n this._layouts = clear ? [] : this._layouts || []; // use array to find larger quick\r\n this._layouts[column] = copy;\r\n return this;\r\n }\r\n /**\r\n * call to cache the given node layout internally to the given location so we can restore back when column changes size\r\n * @param node single node to cache\r\n * @param column corresponding column index to save it under\r\n */\r\n cacheOneLayout(n, column) {\r\n n._id = n._id || GridStackEngine._idSeq++;\r\n let l = { x: n.x, y: n.y, w: n.w, _id: n._id };\r\n if (n.autoPosition) {\r\n delete l.x;\r\n delete l.y;\r\n l.autoPosition = true;\r\n }\r\n this._layouts = this._layouts || [];\r\n this._layouts[column] = this._layouts[column] || [];\r\n let index = this.findCacheLayout(n, column);\r\n if (index === -1)\r\n this._layouts[column].push(l);\r\n else\r\n this._layouts[column][index] = l;\r\n return this;\r\n }\r\n findCacheLayout(n, column) {\r\n var _a, _b, _c;\r\n return (_c = (_b = (_a = this._layouts) === null || _a === void 0 ? void 0 : _a[column]) === null || _b === void 0 ? void 0 : _b.findIndex(l => l._id === n._id)) !== null && _c !== void 0 ? _c : -1;\r\n }\r\n /** called to remove all internal values but the _id */\r\n cleanupNode(node) {\r\n for (let prop in node) {\r\n if (prop[0] === '_' && prop !== '_id')\r\n delete node[prop];\r\n }\r\n return this;\r\n }\r\n}\r\nexports.GridStackEngine = GridStackEngine;\r\n/** @internal unique global internal _id counter NOT starting at 0 */\r\nGridStackEngine._idSeq = 1;\r\n//# sourceMappingURL=gridstack-engine.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNy5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELHVCQUF1QjtBQUN2QixnQkFBZ0IsbUJBQU8sQ0FBQyxJQUFTO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0M7QUFDaEMsZ0NBQWdDO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxREFBcUQ7QUFDckQsNEJBQTRCO0FBQzVCLHFEQUFxRDtBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQiwwREFBMEQ7QUFDMUQ7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QiwwRUFBMEU7QUFDMUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNFQUFzRSxjQUFjLFdBQVcsaUVBQWlFLGNBQWMscUJBQXFCO0FBQ25NO0FBQ0Esd0ZBQXdGLFNBQVMsMEJBQTBCO0FBQzNIO0FBQ0EscURBQXFEO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyRkFBMkYsY0FBYyw0QkFBNEI7QUFDckk7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QixnQ0FBZ0MsV0FBVztBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QixtRkFBbUY7QUFDbkY7QUFDQTtBQUNBLCtCQUErQjtBQUMvQjtBQUNBO0FBQ0Esa0RBQWtEO0FBQ2xEO0FBQ0E7QUFDQSwrQkFBK0I7QUFDL0I7QUFDQTtBQUNBLGtEQUFrRDtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpRkFBaUY7QUFDakY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQSxpQ0FBaUM7QUFDakM7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkMsZ0NBQWdDO0FBQ2hDLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9EQUFvRCxpQ0FBaUM7QUFDckY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUVBQW1FLGlDQUFpQztBQUNwRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyREFBMkQ7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QyxTQUFTO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEM7QUFDOUM7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLFFBQVE7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QjtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QjtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0ZBQWdGLFVBQVU7QUFDMUY7QUFDQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0M7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUVBQW1FO0FBQ25FO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpREFBaUQ7QUFDakQ7QUFDQTtBQUNBLHVDQUF1QztBQUN2QyxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNEQUFzRDtBQUN0RCw0Q0FBNEM7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUMsdUJBQXVCLE9BQU87QUFDdkUsU0FBUztBQUNULGdDQUFnQyxTQUFTO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdURBQXVEO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDLGVBQWU7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QztBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlFQUF5RTtBQUN6RTtBQUNBO0FBQ0Esb0NBQW9DO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0RBQXNEO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0M7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQztBQUNoQztBQUNBO0FBQ0EsZ0NBQWdDO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9FQUFvRTtBQUNwRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQztBQUNyQyx5QkFBeUI7QUFDekI7QUFDQSx1Q0FBdUM7QUFDdkMsK0JBQStCO0FBQy9CLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVEQUF1RDtBQUN2RCx3QkFBd0Isc0NBQXNDO0FBQzlELFNBQVM7QUFDVCwwREFBMEQ7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2Rhc2hib2FyZC1hZHZhbmNlZC8uLi9ub2RlX21vZHVsZXMvZ3JpZHN0YWNrL2Rpc3QvZ3JpZHN0YWNrLWVuZ2luZS5qcz8wYzc0Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xyXG4vKipcclxuICogZ3JpZHN0YWNrLWVuZ2luZS50cyA3LjMuMFxyXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjEtMjAyMiBBbGFpbiBEdW1lc255IC0gc2VlIEdyaWRTdGFjayByb290IGxpY2Vuc2VcclxuICovXHJcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcclxuZXhwb3J0cy5HcmlkU3RhY2tFbmdpbmUgPSB2b2lkIDA7XHJcbmNvbnN0IHV0aWxzXzEgPSByZXF1aXJlKFwiLi91dGlsc1wiKTtcclxuLyoqXHJcbiAqIERlZmluZXMgdGhlIEdyaWRTdGFjayBlbmdpbmUgdGhhdCBkb2VzIG1vc3Qgbm8gRE9NIGdyaWQgbWFuaXB1bGF0aW9uLlxyXG4gKiBTZWUgR3JpZFN0YWNrIG1ldGhvZHMgYW5kIHZhcnMgZm9yIGRlc2NyaXB0aW9ucy5cclxuICpcclxuICogTk9URTogdmFsdWVzIHNob3VsZCBub3QgYmUgbW9kaWZpZWQgZGlyZWN0bHkgLSBjYWxsIHRoZSBtYWluIEdyaWRTdGFjayBBUEkgaW5zdGVhZFxyXG4gKi9cclxuY2xhc3MgR3JpZFN0YWNrRW5naW5lIHtcclxuICAgIGNvbnN0cnVjdG9yKG9wdHMgPSB7fSkge1xyXG4gICAgICAgIHRoaXMuYWRkZWROb2RlcyA9IFtdO1xyXG4gICAgICAgIHRoaXMucmVtb3ZlZE5vZGVzID0gW107XHJcbiAgICAgICAgdGhpcy5jb2x1bW4gPSBvcHRzLmNvbHVtbiB8fCAxMjtcclxuICAgICAgICB0aGlzLm1heFJvdyA9IG9wdHMubWF4Um93O1xyXG4gICAgICAgIHRoaXMuX2Zsb2F0ID0gb3B0cy5mbG9hdDtcclxuICAgICAgICB0aGlzLm5vZGVzID0gb3B0cy5ub2RlcyB8fCBbXTtcclxuICAgICAgICB0aGlzLm9uQ2hhbmdlID0gb3B0cy5vbkNoYW5nZTtcclxuICAgIH1cclxuICAgIGJhdGNoVXBkYXRlKGZsYWcgPSB0cnVlKSB7XHJcbiAgICAgICAgaWYgKCEhdGhpcy5iYXRjaE1vZGUgPT09IGZsYWcpXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgIHRoaXMuYmF0Y2hNb2RlID0gZmxhZztcclxuICAgICAgICBpZiAoZmxhZykge1xyXG4gICAgICAgICAgICB0aGlzLl9wcmV2RmxvYXQgPSB0aGlzLl9mbG9hdDtcclxuICAgICAgICAgICAgdGhpcy5fZmxvYXQgPSB0cnVlOyAvLyBsZXQgdGhpbmdzIGdvIGFueXdoZXJlIGZvciBub3cuLi4gd2lsbCByZXN0b3JlIGFuZCBwb3NzaWJseSByZXBvc2l0aW9uIGxhdGVyXHJcbiAgICAgICAgICAgIHRoaXMuc2F2ZUluaXRpYWwoKTsgLy8gc2luY2UgYmVnaW4gdXBkYXRlICh3aGljaCBpcyBjYWxsZWQgbXVsdGlwbGUgdGltZXMpIHdvbid0IGRvIHRoaXNcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2Zsb2F0ID0gdGhpcy5fcHJldkZsb2F0O1xyXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fcHJldkZsb2F0O1xyXG4gICAgICAgICAgICB0aGlzLl9wYWNrTm9kZXMoKS5fbm90aWZ5KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gICAgLy8gdXNlIGVudGlyZSByb3cgZm9yIGhpdHRpbmcgYXJlYSAod2lsbCB1c2UgYm90dG9tIHJldmVyc2Ugc29ydGVkIGZpcnN0KSBpZiB3ZSBub3QgYWN0aXZlbHkgbW92aW5nIERPV04gYW5kIGRpZG4ndCBhbHJlYWR5IHNraXBcclxuICAgIF91c2VFbnRpcmVSb3dBcmVhKG5vZGUsIG5uKSB7XHJcbiAgICAgICAgcmV0dXJuICghdGhpcy5mbG9hdCB8fCB0aGlzLmJhdGNoTW9kZSAmJiAhdGhpcy5fcHJldkZsb2F0KSAmJiAhdGhpcy5faGFzTG9ja2VkICYmICghbm9kZS5fbW92aW5nIHx8IG5vZGUuX3NraXBEb3duIHx8IG5uLnkgPD0gbm9kZS55KTtcclxuICAgIH1cclxuICAgIC8qKiBAaW50ZXJuYWwgZml4IGNvbGxpc2lvbiBvbiBnaXZlbiAnbm9kZScsIGdvaW5nIHRvIGdpdmVuIG5ldyBsb2NhdGlvbiAnbm4nLCB3aXRoIG9wdGlvbmFsICdjb2xsaWRlJyBub2RlIGFscmVhZHkgZm91bmQuXHJcbiAgICAgKiByZXR1cm4gdHJ1ZSBpZiB3ZSBtb3ZlZC4gKi9cclxuICAgIF9maXhDb2xsaXNpb25zKG5vZGUsIG5uID0gbm9kZSwgY29sbGlkZSwgb3B0ID0ge30pIHtcclxuICAgICAgICB0aGlzLnNvcnROb2RlcygtMSk7IC8vIGZyb20gbGFzdCB0byBmaXJzdCwgc28gcmVjdXJzaXZlIGNvbGxpc2lvbiBtb3ZlIGl0ZW1zIGluIHRoZSByaWdodCBvcmRlclxyXG4gICAgICAgIGNvbGxpZGUgPSBjb2xsaWRlIHx8IHRoaXMuY29sbGlkZShub2RlLCBubik7IC8vIFJFQUwgYXJlYSBjb2xsaWRlIGZvciBzd2FwIGFuZCBza2lwIGlmIG5vbmUuLi5cclxuICAgICAgICBpZiAoIWNvbGxpZGUpXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAvLyBzd2FwIGNoZWNrOiBpZiB3ZSdyZSBhY3RpdmVseSBtb3ZpbmcgaW4gZ3Jhdml0eSBtb2RlLCBzZWUgaWYgd2UgY29sbGlkZSB3aXRoIGFuIG9iamVjdCB0aGUgc2FtZSBzaXplXHJcbiAgICAgICAgaWYgKG5vZGUuX21vdmluZyAmJiAhb3B0Lm5lc3RlZCAmJiAhdGhpcy5mbG9hdCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zd2FwKG5vZGUsIGNvbGxpZGUpKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGR1cmluZyB3aGlsZSgpIGNvbGxpc2lvbnMgTUFLRSBTVVJFIHRvIGNoZWNrIGVudGlyZSByb3cgc28gbGFyZ2VyIGl0ZW1zIGRvbid0IGxlYXAgZnJvZyBzbWFsbCBvbmVzIChwdXNoIHRoZW0gYWxsIGRvd24gc3RhcnRpbmcgbGFzdCBpbiBncmlkKVxyXG4gICAgICAgIGxldCBhcmVhID0gbm47XHJcbiAgICAgICAgaWYgKHRoaXMuX3VzZUVudGlyZVJvd0FyZWEobm9kZSwgbm4pKSB7XHJcbiAgICAgICAgICAgIGFyZWEgPSB7IHg6IDAsIHc6IHRoaXMuY29sdW1uLCB5OiBubi55LCBoOiBubi5oIH07XHJcbiAgICAgICAgICAgIGNvbGxpZGUgPSB0aGlzLmNvbGxpZGUobm9kZSwgYXJlYSwgb3B0LnNraXApOyAvLyBmb3JjZSBuZXcgaGl0XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBkaWRNb3ZlID0gZmFsc2U7XHJcbiAgICAgICAgbGV0IG5ld09wdCA9IHsgbmVzdGVkOiB0cnVlLCBwYWNrOiBmYWxzZSB9O1xyXG4gICAgICAgIHdoaWxlIChjb2xsaWRlID0gY29sbGlkZSB8fCB0aGlzLmNvbGxpZGUobm9kZSwgYXJlYSwgb3B0LnNraXApKSB7IC8vIGNvdWxkIGNvbGxpZGUgd2l0aCBtb3JlIHRoYW4gMSBpdGVtLi4uIHNvIHJlcGVhdCBmb3IgZWFjaFxyXG4gICAgICAgICAgICBsZXQgbW92ZWQ7XHJcbiAgICAgICAgICAgIC8vIGlmIGNvbGxpZGluZyB3aXRoIGEgbG9ja2VkIGl0ZW0gT1IgbW92aW5nIGRvd24gd2l0aCB0b3AgZ3Jhdml0eSAoYW5kIGNvbGxpZGUgY291bGQgbW92ZSB1cCkgLT4gc2tpcCBwYXN0IHRoZSBjb2xsaWRlLFxyXG4gICAgICAgICAgICAvLyBidXQgcmVtZW1iZXIgdGhhdCBza2lwIGRvd24gc28gd2Ugb25seSBkbyB0aGlzIG9uY2UgKGFuZCBwdXNoIG90aGVycyBvdGhlcndpc2UpLlxyXG4gICAgICAgICAgICBpZiAoY29sbGlkZS5sb2NrZWQgfHwgbm9kZS5fbW92aW5nICYmICFub2RlLl9za2lwRG93biAmJiBubi55ID4gbm9kZS55ICYmICF0aGlzLmZsb2F0ICYmXHJcbiAgICAgICAgICAgICAgICAvLyBjYW4gdGFrZSBzcGFjZSB3ZSBoYWQsIG9yIGJlZm9yZSB3aGVyZSB3ZSdyZSBnb2luZ1xyXG4gICAgICAgICAgICAgICAgKCF0aGlzLmNvbGxpZGUoY29sbGlkZSwgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBjb2xsaWRlKSwgeyB5OiBub2RlLnkgfSksIG5vZGUpIHx8ICF0aGlzLmNvbGxpZGUoY29sbGlkZSwgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBjb2xsaWRlKSwgeyB5OiBubi55IC0gY29sbGlkZS5oIH0pLCBub2RlKSkpIHtcclxuICAgICAgICAgICAgICAgIG5vZGUuX3NraXBEb3duID0gKG5vZGUuX3NraXBEb3duIHx8IG5uLnkgPiBub2RlLnkpO1xyXG4gICAgICAgICAgICAgICAgbW92ZWQgPSB0aGlzLm1vdmVOb2RlKG5vZGUsIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBubiksIHsgeTogY29sbGlkZS55ICsgY29sbGlkZS5oIH0pLCBuZXdPcHQpKTtcclxuICAgICAgICAgICAgICAgIGlmIChjb2xsaWRlLmxvY2tlZCAmJiBtb3ZlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHV0aWxzXzEuVXRpbHMuY29weVBvcyhubiwgbm9kZSk7IC8vIG1vdmluZyBhZnRlciBsb2NrIGJlY29tZSBvdXIgbmV3IGRlc2lyZWQgbG9jYXRpb25cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFjb2xsaWRlLmxvY2tlZCAmJiBtb3ZlZCAmJiBvcHQucGFjaykge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHdlIG1vdmVkIGFmdGVyIGFuZCB3aWxsIHBhY2s6IGRvIGl0IG5vdyBhbmQga2VlcCB0aGUgb3JpZ2luYWwgZHJvcCBsb2NhdGlvbiwgYnV0IHBhc3QgdGhlIG9sZCBjb2xsaWRlIHRvIHNlZSB3aGF0IGVsc2Ugd2UgbWlnaHQgcHVzaCB3YXlcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9wYWNrTm9kZXMoKTtcclxuICAgICAgICAgICAgICAgICAgICBubi55ID0gY29sbGlkZS55ICsgY29sbGlkZS5oO1xyXG4gICAgICAgICAgICAgICAgICAgIHV0aWxzXzEuVXRpbHMuY29weVBvcyhub2RlLCBubik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBkaWRNb3ZlID0gZGlkTW92ZSB8fCBtb3ZlZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIG1vdmUgY29sbGlkZSBkb3duICphZnRlciogd2hlcmUgd2Ugd2lsbCBiZSwgaWdub3Jpbmcgd2hlcmUgd2UgYXJlIG5vdyAoZG9uJ3QgY29sbGlkZSB3aXRoIHVzKVxyXG4gICAgICAgICAgICAgICAgbW92ZWQgPSB0aGlzLm1vdmVOb2RlKGNvbGxpZGUsIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBjb2xsaWRlKSwgeyB5OiBubi55ICsgbm4uaCwgc2tpcDogbm9kZSB9KSwgbmV3T3B0KSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCFtb3ZlZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRpZE1vdmU7XHJcbiAgICAgICAgICAgIH0gLy8gYnJlYWsgaW5mIGxvb3AgaWYgd2UgY291bGRuJ3QgbW92ZSBhZnRlciBhbGwgKGV4OiBtYXhSb3csIGZpeGVkKVxyXG4gICAgICAgICAgICBjb2xsaWRlID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZGlkTW92ZTtcclxuICAgIH1cclxuICAgIC8qKiByZXR1cm4gdGhlIG5vZGVzIHRoYXQgaW50ZXJjZXB0IHRoZSBnaXZlbiBub2RlLiBPcHRpb25hbGx5IGEgZGlmZmVyZW50IGFyZWEgY2FuIGJlIHVzZWQsIGFzIHdlbGwgYXMgYSBzZWNvbmQgbm9kZSB0byBza2lwICovXHJcbiAgICBjb2xsaWRlKHNraXAsIGFyZWEgPSBza2lwLCBza2lwMikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm5vZGVzLmZpbmQobiA9PiBuICE9PSBza2lwICYmIG4gIT09IHNraXAyICYmIHV0aWxzXzEuVXRpbHMuaXNJbnRlcmNlcHRlZChuLCBhcmVhKSk7XHJcbiAgICB9XHJcbiAgICBjb2xsaWRlQWxsKHNraXAsIGFyZWEgPSBza2lwLCBza2lwMikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm5vZGVzLmZpbHRlcihuID0+IG4gIT09IHNraXAgJiYgbiAhPT0gc2tpcDIgJiYgdXRpbHNfMS5VdGlscy5pc0ludGVyY2VwdGVkKG4sIGFyZWEpKTtcclxuICAgIH1cclxuICAgIC8qKiBkb2VzIGEgcGl4ZWwgY292ZXJhZ2UgY29sbGlzaW9uIGJhc2VkIG9uIHdoZXJlIHdlIHN0YXJ0ZWQsIHJldHVybmluZyB0aGUgbm9kZSB0aGF0IGhhcyB0aGUgbW9zdCBjb3ZlcmFnZSB0aGF0IGlzID41MCUgbWlkIGxpbmUgKi9cclxuICAgIGRpcmVjdGlvbkNvbGxpZGVDb3ZlcmFnZShub2RlLCBvLCBjb2xsaWRlcykge1xyXG4gICAgICAgIGlmICghby5yZWN0IHx8ICFub2RlLl9yZWN0KVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgbGV0IHIwID0gbm9kZS5fcmVjdDsgLy8gd2hlcmUgc3RhcnRlZFxyXG4gICAgICAgIGxldCByID0gT2JqZWN0LmFzc2lnbih7fSwgby5yZWN0KTsgLy8gd2hlcmUgd2UgYXJlXHJcbiAgICAgICAgLy8gdXBkYXRlIGRyYWdnZWQgcmVjdCB0byBzaG93IHdoZXJlIGl0J3MgY29taW5nIGZyb20gKGFib3ZlIG9yIGJlbG93LCBldGMuLi4pXHJcbiAgICAgICAgaWYgKHIueSA+IHIwLnkpIHtcclxuICAgICAgICAgICAgci5oICs9IHIueSAtIHIwLnk7XHJcbiAgICAgICAgICAgIHIueSA9IHIwLnk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByLmggKz0gcjAueSAtIHIueTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHIueCA+IHIwLngpIHtcclxuICAgICAgICAgICAgci53ICs9IHIueCAtIHIwLng7XHJcbiAgICAgICAgICAgIHIueCA9IHIwLng7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByLncgKz0gcjAueCAtIHIueDtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGNvbGxpZGU7XHJcbiAgICAgICAgY29sbGlkZXMuZm9yRWFjaChuID0+IHtcclxuICAgICAgICAgICAgaWYgKG4ubG9ja2VkIHx8ICFuLl9yZWN0KVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICBsZXQgcjIgPSBuLl9yZWN0OyAvLyBvdmVybGFwcGluZyB0YXJnZXRcclxuICAgICAgICAgICAgbGV0IHlPdmVyID0gTnVtYmVyLk1BWF9WQUxVRSwgeE92ZXIgPSBOdW1iZXIuTUFYX1ZBTFVFLCBvdmVyTWF4ID0gMC41OyAvLyBuZWVkID41MCVcclxuICAgICAgICAgICAgLy8gZGVwZW5kaW5nIG9uIHdoaWNoIHNpZGUgd2Ugc3RhcnRlZCBmcm9tLCBjb21wdXRlIHRoZSBvdmVybGFwICUgb2YgY292ZXJhZ2VcclxuICAgICAgICAgICAgLy8gKGV4OiBmcm9tIGFib3ZlL2JlbG93IHdlIG9ubHkgY29tcHV0ZSB0aGUgbWF4IGhvcml6b250YWwgbGluZSBjb3ZlcmFnZSlcclxuICAgICAgICAgICAgaWYgKHIwLnkgPCByMi55KSB7IC8vIGZyb20gYWJvdmVcclxuICAgICAgICAgICAgICAgIHlPdmVyID0gKChyLnkgKyByLmgpIC0gcjIueSkgLyByMi5oO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHIwLnkgKyByMC5oID4gcjIueSArIHIyLmgpIHsgLy8gZnJvbSBiZWxvd1xyXG4gICAgICAgICAgICAgICAgeU92ZXIgPSAoKHIyLnkgKyByMi5oKSAtIHIueSkgLyByMi5oO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChyMC54IDwgcjIueCkgeyAvLyBmcm9tIHRoZSBsZWZ0XHJcbiAgICAgICAgICAgICAgICB4T3ZlciA9ICgoci54ICsgci53KSAtIHIyLngpIC8gcjIudztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChyMC54ICsgcjAudyA+IHIyLnggKyByMi53KSB7IC8vIGZyb20gdGhlIHJpZ2h0XHJcbiAgICAgICAgICAgICAgICB4T3ZlciA9ICgocjIueCArIHIyLncpIC0gci54KSAvIHIyLnc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IG92ZXIgPSBNYXRoLm1pbih4T3ZlciwgeU92ZXIpO1xyXG4gICAgICAgICAgICBpZiAob3ZlciA+IG92ZXJNYXgpIHtcclxuICAgICAgICAgICAgICAgIG92ZXJNYXggPSBvdmVyO1xyXG4gICAgICAgICAgICAgICAgY29sbGlkZSA9IG47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBvLmNvbGxpZGUgPSBjb2xsaWRlOyAvLyBzYXZlIGl0IHNvIHdlIGRvbid0IGhhdmUgdG8gZmluZCBpdCBhZ2FpblxyXG4gICAgICAgIHJldHVybiBjb2xsaWRlO1xyXG4gICAgfVxyXG4gICAgLyoqIGRvZXMgYSBwaXhlbCBjb3ZlcmFnZSByZXR1cm5pbmcgdGhlIG5vZGUgdGhhdCBoYXMgdGhlIG1vc3QgY292ZXJhZ2UgYnkgYXJlYSAqL1xyXG4gICAgLypcclxuICAgIHByb3RlY3RlZCBjb2xsaWRlQ292ZXJhZ2UocjogR3JpZFN0YWNrUG9zaXRpb24sIGNvbGxpZGVzOiBHcmlkU3RhY2tOb2RlW10pOiB7Y29sbGlkZTogR3JpZFN0YWNrTm9kZSwgb3ZlcjogbnVtYmVyfSB7XHJcbiAgICAgIGxldCBjb2xsaWRlOiBHcmlkU3RhY2tOb2RlO1xyXG4gICAgICBsZXQgb3Zlck1heCA9IDA7XHJcbiAgICAgIGNvbGxpZGVzLmZvckVhY2gobiA9PiB7XHJcbiAgICAgICAgaWYgKG4ubG9ja2VkIHx8ICFuLl9yZWN0KSByZXR1cm47XHJcbiAgICAgICAgbGV0IG92ZXIgPSBVdGlscy5hcmVhSW50ZXJjZXB0KHIsIG4uX3JlY3QpO1xyXG4gICAgICAgIGlmIChvdmVyID4gb3Zlck1heCkge1xyXG4gICAgICAgICAgb3Zlck1heCA9IG92ZXI7XHJcbiAgICAgICAgICBjb2xsaWRlID0gbjtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm4ge2NvbGxpZGUsIG92ZXI6IG92ZXJNYXh9O1xyXG4gICAgfVxyXG4gICAgKi9cclxuICAgIC8qKiBjYWxsZWQgdG8gY2FjaGUgdGhlIG5vZGVzIHBpeGVsIHJlY3RhbmdsZXMgdXNlZCBmb3IgY29sbGlzaW9uIGRldGVjdGlvbiBkdXJpbmcgZHJhZyAqL1xyXG4gICAgY2FjaGVSZWN0cyh3LCBoLCB0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnQpIHtcclxuICAgICAgICB0aGlzLm5vZGVzLmZvckVhY2gobiA9PiBuLl9yZWN0ID0ge1xyXG4gICAgICAgICAgICB5OiBuLnkgKiBoICsgdG9wLFxyXG4gICAgICAgICAgICB4OiBuLnggKiB3ICsgbGVmdCxcclxuICAgICAgICAgICAgdzogbi53ICogdyAtIGxlZnQgLSByaWdodCxcclxuICAgICAgICAgICAgaDogbi5oICogaCAtIHRvcCAtIGJvdHRvbVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gICAgLyoqIGNhbGxlZCB0byBwb3NzaWJseSBzd2FwIGJldHdlZW4gMiBub2RlcyAoc2FtZSBzaXplIG9yIGNvbHVtbiwgbm90IGxvY2tlZCwgdG91Y2hpbmcpLCByZXR1cm5pbmcgdHJ1ZSBpZiBzdWNjZXNzZnVsICovXHJcbiAgICBzd2FwKGEsIGIpIHtcclxuICAgICAgICBpZiAoIWIgfHwgYi5sb2NrZWQgfHwgIWEgfHwgYS5sb2NrZWQpXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICBmdW5jdGlvbiBfZG9Td2FwKCkge1xyXG4gICAgICAgICAgICBsZXQgeCA9IGIueCwgeSA9IGIueTtcclxuICAgICAgICAgICAgYi54ID0gYS54O1xyXG4gICAgICAgICAgICBiLnkgPSBhLnk7IC8vIGIgLT4gYSBwb3NpdGlvblxyXG4gICAgICAgICAgICBpZiAoYS5oICE9IGIuaCkge1xyXG4gICAgICAgICAgICAgICAgYS54ID0geDtcclxuICAgICAgICAgICAgICAgIGEueSA9IGIueSArIGIuaDsgLy8gYSAtPiBnb2VzIGFmdGVyIGJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChhLncgIT0gYi53KSB7XHJcbiAgICAgICAgICAgICAgICBhLnggPSBiLnggKyBiLnc7XHJcbiAgICAgICAgICAgICAgICBhLnkgPSB5OyAvLyBhIC0+IGdvZXMgYWZ0ZXIgYlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYS54ID0geDtcclxuICAgICAgICAgICAgICAgIGEueSA9IHk7IC8vIGEgLT4gb2xkIGIgcG9zaXRpb25cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBhLl9kaXJ0eSA9IGIuX2RpcnR5ID0gdHJ1ZTtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCB0b3VjaGluZzsgLy8gcmVtZW1iZXIgaWYgd2UgY2FsbGVkIGl0ICh2cyB1bmRlZmluZWQpXHJcbiAgICAgICAgLy8gc2FtZSBzaXplIGFuZCBzYW1lIHJvdyBvciBjb2x1bW4sIGFuZCB0b3VjaGluZ1xyXG4gICAgICAgIGlmIChhLncgPT09IGIudyAmJiBhLmggPT09IGIuaCAmJiAoYS54ID09PSBiLnggfHwgYS55ID09PSBiLnkpICYmICh0b3VjaGluZyA9IHV0aWxzXzEuVXRpbHMuaXNUb3VjaGluZyhhLCBiKSkpXHJcbiAgICAgICAgICAgIHJldHVybiBfZG9Td2FwKCk7XHJcbiAgICAgICAgaWYgKHRvdWNoaW5nID09PSBmYWxzZSlcclxuICAgICAgICAgICAgcmV0dXJuOyAvLyBJRkYgcmFuIHRlc3QgYW5kIGZhaWwsIGJhaWwgb3V0XHJcbiAgICAgICAgLy8gY2hlY2sgZm9yIHRha2luZyBzYW1lIGNvbHVtbnMgKGJ1dCBkaWZmZXJlbnQgaGVpZ2h0KSBhbmQgdG91Y2hpbmdcclxuICAgICAgICBpZiAoYS53ID09PSBiLncgJiYgYS54ID09PSBiLnggJiYgKHRvdWNoaW5nIHx8ICh0b3VjaGluZyA9IHV0aWxzXzEuVXRpbHMuaXNUb3VjaGluZyhhLCBiKSkpKSB7XHJcbiAgICAgICAgICAgIGlmIChiLnkgPCBhLnkpIHtcclxuICAgICAgICAgICAgICAgIGxldCB0ID0gYTtcclxuICAgICAgICAgICAgICAgIGEgPSBiO1xyXG4gICAgICAgICAgICAgICAgYiA9IHQ7XHJcbiAgICAgICAgICAgIH0gLy8gc3dhcCBhIDwtPiBiIHZhcnMgc28gYSBpcyBmaXJzdFxyXG4gICAgICAgICAgICByZXR1cm4gX2RvU3dhcCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodG91Y2hpbmcgPT09IGZhbHNlKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgLy8gY2hlY2sgaWYgdGFraW5nIHNhbWUgcm93IChidXQgZGlmZmVyZW50IHdpZHRoKSBhbmQgdG91Y2hpbmdcclxuICAgICAgICBpZiAoYS5oID09PSBiLmggJiYgYS55ID09PSBiLnkgJiYgKHRvdWNoaW5nIHx8ICh0b3VjaGluZyA9IHV0aWxzXzEuVXRpbHMuaXNUb3VjaGluZyhhLCBiKSkpKSB7XHJcbiAgICAgICAgICAgIGlmIChiLnggPCBhLngpIHtcclxuICAgICAgICAgICAgICAgIGxldCB0ID0gYTtcclxuICAgICAgICAgICAgICAgIGEgPSBiO1xyXG4gICAgICAgICAgICAgICAgYiA9IHQ7XHJcbiAgICAgICAgICAgIH0gLy8gc3dhcCBhIDwtPiBiIHZhcnMgc28gYSBpcyBmaXJzdFxyXG4gICAgICAgICAgICByZXR1cm4gX2RvU3dhcCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBpc0FyZWFFbXB0eSh4LCB5LCB3LCBoKSB7XHJcbiAgICAgICAgbGV0IG5uID0geyB4OiB4IHx8IDAsIHk6IHkgfHwgMCwgdzogdyB8fCAxLCBoOiBoIHx8IDEgfTtcclxuICAgICAgICByZXR1cm4gIXRoaXMuY29sbGlkZShubik7XHJcbiAgICB9XHJcbiAgICAvKiogcmUtbGF5b3V0IGdyaWQgaXRlbXMgdG8gcmVjbGFpbSBhbnkgZW1wdHkgc3BhY2UgKi9cclxuICAgIGNvbXBhY3QoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMubm9kZXMubGVuZ3RoID09PSAwKVxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICB0aGlzLmJhdGNoVXBkYXRlKClcclxuICAgICAgICAgICAgLnNvcnROb2RlcygpO1xyXG4gICAgICAgIGxldCBjb3B5Tm9kZXMgPSB0aGlzLm5vZGVzO1xyXG4gICAgICAgIHRoaXMubm9kZXMgPSBbXTsgLy8gcHJldGVuZCB3ZSBoYXZlIG5vIG5vZGVzIHRvIGNvbmZsaWN0IGxheW91dCB0byBzdGFydCB3aXRoLi4uXHJcbiAgICAgICAgY29weU5vZGVzLmZvckVhY2gobm9kZSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghbm9kZS5sb2NrZWQpIHtcclxuICAgICAgICAgICAgICAgIG5vZGUuYXV0b1Bvc2l0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmFkZE5vZGUobm9kZSwgZmFsc2UpOyAvLyAnZmFsc2UnIGZvciBhZGQgZXZlbnQgdHJpZ2dlclxyXG4gICAgICAgICAgICBub2RlLl9kaXJ0eSA9IHRydWU7IC8vIHdpbGwgZm9yY2UgYXR0ciB1cGRhdGVcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gdGhpcy5iYXRjaFVwZGF0ZShmYWxzZSk7XHJcbiAgICB9XHJcbiAgICAvKiogZW5hYmxlL2Rpc2FibGUgZmxvYXRpbmcgd2lkZ2V0cyAoZGVmYXVsdDogYGZhbHNlYCkgU2VlIFtleGFtcGxlXShodHRwOi8vZ3JpZHN0YWNranMuY29tL2RlbW8vZmxvYXQuaHRtbCkgKi9cclxuICAgIHNldCBmbG9hdCh2YWwpIHtcclxuICAgICAgICBpZiAodGhpcy5fZmxvYXQgPT09IHZhbClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMuX2Zsb2F0ID0gdmFsIHx8IGZhbHNlO1xyXG4gICAgICAgIGlmICghdmFsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3BhY2tOb2RlcygpLl9ub3RpZnkoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKiogZmxvYXQgZ2V0dGVyIG1ldGhvZCAqL1xyXG4gICAgZ2V0IGZsb2F0KCkgeyByZXR1cm4gdGhpcy5fZmxvYXQgfHwgZmFsc2U7IH1cclxuICAgIC8qKiBzb3J0IHRoZSBub2RlcyBhcnJheSBmcm9tIGZpcnN0IHRvIGxhc3QsIG9yIHJldmVyc2UuIENhbGxlZCBkdXJpbmcgY29sbGlzaW9uL3BsYWNlbWVudCB0byBmb3JjZSBhbiBvcmRlciAqL1xyXG4gICAgc29ydE5vZGVzKGRpcikge1xyXG4gICAgICAgIHRoaXMubm9kZXMgPSB1dGlsc18xLlV0aWxzLnNvcnQodGhpcy5ub2RlcywgZGlyLCB0aGlzLmNvbHVtbik7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICAvKiogQGludGVybmFsIGNhbGxlZCB0byB0b3AgZ3Jhdml0eSBwYWNrIHRoZSBpdGVtcyBiYWNrIE9SIHJldmVydCBiYWNrIHRvIG9yaWdpbmFsIFkgcG9zaXRpb25zIHdoZW4gZmxvYXRpbmcgKi9cclxuICAgIF9wYWNrTm9kZXMoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuYmF0Y2hNb2RlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNvcnROb2RlcygpOyAvLyBmaXJzdCB0byBsYXN0XHJcbiAgICAgICAgaWYgKHRoaXMuZmxvYXQpIHtcclxuICAgICAgICAgICAgLy8gcmVzdG9yZSBvcmlnaW5hbCBZIHBvc1xyXG4gICAgICAgICAgICB0aGlzLm5vZGVzLmZvckVhY2gobiA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAobi5fdXBkYXRpbmcgfHwgbi5fb3JpZyA9PT0gdW5kZWZpbmVkIHx8IG4ueSA9PT0gbi5fb3JpZy55KVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIGxldCBuZXdZID0gbi55O1xyXG4gICAgICAgICAgICAgICAgd2hpbGUgKG5ld1kgPiBuLl9vcmlnLnkpIHtcclxuICAgICAgICAgICAgICAgICAgICAtLW5ld1k7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbGxpZGUgPSB0aGlzLmNvbGxpZGUobiwgeyB4OiBuLngsIHk6IG5ld1ksIHc6IG4udywgaDogbi5oIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghY29sbGlkZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuLl9kaXJ0eSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG4ueSA9IG5ld1k7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIHRvcCBncmF2aXR5IHBhY2tcclxuICAgICAgICAgICAgdGhpcy5ub2Rlcy5mb3JFYWNoKChuLCBpKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAobi5sb2NrZWQpXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgd2hpbGUgKG4ueSA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgbmV3WSA9IGkgPT09IDAgPyAwIDogbi55IC0gMTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgY2FuQmVNb3ZlZCA9IGkgPT09IDAgfHwgIXRoaXMuY29sbGlkZShuLCB7IHg6IG4ueCwgeTogbmV3WSwgdzogbi53LCBoOiBuLmggfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjYW5CZU1vdmVkKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAvLyBOb3RlOiBtdXN0IGJlIGRpcnR5IChmcm9tIGxhc3QgcG9zaXRpb24pIGZvciBHcmlkU3RhY2s6Ok9uQ2hhbmdlIENCIHRvIHVwZGF0ZSBwb3NpdGlvbnNcclxuICAgICAgICAgICAgICAgICAgICAvLyBhbmQgbW92ZSBpdGVtcyBiYWNrLiBUaGUgdXNlciAnY2hhbmdlJyBDQiBzaG91bGQgZGV0ZWN0IGNoYW5nZXMgZnJvbSB0aGUgb3JpZ2luYWxcclxuICAgICAgICAgICAgICAgICAgICAvLyBzdGFydGluZyBwb3NpdGlvbiBpbnN0ZWFkLlxyXG4gICAgICAgICAgICAgICAgICAgIG4uX2RpcnR5ID0gKG4ueSAhPT0gbmV3WSk7XHJcbiAgICAgICAgICAgICAgICAgICAgbi55ID0gbmV3WTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBnaXZlbiBhIHJhbmRvbSBub2RlLCBtYWtlcyBzdXJlIGl0J3MgY29vcmRpbmF0ZXMvdmFsdWVzIGFyZSB2YWxpZCBpbiB0aGUgY3VycmVudCBncmlkXHJcbiAgICAgKiBAcGFyYW0gbm9kZSB0byBhZGp1c3RcclxuICAgICAqIEBwYXJhbSByZXNpemluZyBpZiBvdXQgb2YgYm91bmQsIHJlc2l6ZSBkb3duIG9yIG1vdmUgaW50byB0aGUgZ3JpZCB0byBmaXQgP1xyXG4gICAgICovXHJcbiAgICBwcmVwYXJlTm9kZShub2RlLCByZXNpemluZykge1xyXG4gICAgICAgIG5vZGUgPSBub2RlIHx8IHt9O1xyXG4gICAgICAgIG5vZGUuX2lkID0gbm9kZS5faWQgfHwgR3JpZFN0YWNrRW5naW5lLl9pZFNlcSsrO1xyXG4gICAgICAgIC8vIGlmIHdlJ3JlIG1pc3NpbmcgcG9zaXRpb24sIGhhdmUgdGhlIGdyaWQgcG9zaXRpb24gdXMgYXV0b21hdGljYWxseSAoYmVmb3JlIHdlIHNldCB0aGVtIHRvIDAsMClcclxuICAgICAgICBpZiAobm9kZS54ID09PSB1bmRlZmluZWQgfHwgbm9kZS55ID09PSB1bmRlZmluZWQgfHwgbm9kZS54ID09PSBudWxsIHx8IG5vZGUueSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBub2RlLmF1dG9Qb3NpdGlvbiA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGFzc2lnbiBkZWZhdWx0cyBmb3IgbWlzc2luZyByZXF1aXJlZCBmaWVsZHNcclxuICAgICAgICBsZXQgZGVmYXVsdHMgPSB7IHg6IDAsIHk6IDAsIHc6IDEsIGg6IDEgfTtcclxuICAgICAgICB1dGlsc18xLlV0aWxzLmRlZmF1bHRzKG5vZGUsIGRlZmF1bHRzKTtcclxuICAgICAgICBpZiAoIW5vZGUuYXV0b1Bvc2l0aW9uKSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBub2RlLmF1dG9Qb3NpdGlvbjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFub2RlLm5vUmVzaXplKSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBub2RlLm5vUmVzaXplO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIW5vZGUubm9Nb3ZlKSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBub2RlLm5vTW92ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gY2hlY2sgZm9yIE5hTiAoaW4gY2FzZSBtZXNzZWQgdXAgc3RyaW5ncyB3ZXJlIHBhc3NlZC4gY2FuJ3QgZG8gcGFyc2VJbnQoKSB8fCBkZWZhdWx0cy54IGFib3ZlIGFzIDAgaXMgdmFsaWQgIylcclxuICAgICAgICBpZiAodHlwZW9mIG5vZGUueCA9PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBub2RlLnggPSBOdW1iZXIobm9kZS54KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHR5cGVvZiBub2RlLnkgPT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgbm9kZS55ID0gTnVtYmVyKG5vZGUueSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0eXBlb2Ygbm9kZS53ID09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIG5vZGUudyA9IE51bWJlcihub2RlLncpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodHlwZW9mIG5vZGUuaCA9PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBub2RlLmggPSBOdW1iZXIobm9kZS5oKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGlzTmFOKG5vZGUueCkpIHtcclxuICAgICAgICAgICAgbm9kZS54ID0gZGVmYXVsdHMueDtcclxuICAgICAgICAgICAgbm9kZS5hdXRvUG9zaXRpb24gPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaXNOYU4obm9kZS55KSkge1xyXG4gICAgICAgICAgICBub2RlLnkgPSBkZWZhdWx0cy55O1xyXG4gICAgICAgICAgICBub2RlLmF1dG9Qb3NpdGlvbiA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpc05hTihub2RlLncpKSB7XHJcbiAgICAgICAgICAgIG5vZGUudyA9IGRlZmF1bHRzLnc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpc05hTihub2RlLmgpKSB7XHJcbiAgICAgICAgICAgIG5vZGUuaCA9IGRlZmF1bHRzLmg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLm5vZGVCb3VuZEZpeChub2RlLCByZXNpemluZyk7XHJcbiAgICB9XHJcbiAgICAvKiogcGFydDIgb2YgcHJlcGFyaW5nIGEgbm9kZSB0byBmaXQgaW5zaWRlIG91ciBncmlkIC0gY2hlY2tzIGZvciB4LHksdyBmcm9tIGdyaWQgZGltZW5zaW9ucyAqL1xyXG4gICAgbm9kZUJvdW5kRml4KG5vZGUsIHJlc2l6aW5nKSB7XHJcbiAgICAgICAgbGV0IGJlZm9yZSA9IG5vZGUuX29yaWcgfHwgdXRpbHNfMS5VdGlscy5jb3B5UG9zKHt9LCBub2RlKTtcclxuICAgICAgICBpZiAobm9kZS5tYXhXKSB7XHJcbiAgICAgICAgICAgIG5vZGUudyA9IE1hdGgubWluKG5vZGUudywgbm9kZS5tYXhXKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG5vZGUubWF4SCkge1xyXG4gICAgICAgICAgICBub2RlLmggPSBNYXRoLm1pbihub2RlLmgsIG5vZGUubWF4SCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChub2RlLm1pblcgJiYgbm9kZS5taW5XIDw9IHRoaXMuY29sdW1uKSB7XHJcbiAgICAgICAgICAgIG5vZGUudyA9IE1hdGgubWF4KG5vZGUudywgbm9kZS5taW5XKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG5vZGUubWluSCkge1xyXG4gICAgICAgICAgICBub2RlLmggPSBNYXRoLm1heChub2RlLmgsIG5vZGUubWluSCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGlmIHVzZXIgbG9hZGVkIGEgbGFyZ2VyIHRoYW4gYWxsb3dlZCB3aWRnZXQgZm9yIGN1cnJlbnQgIyBvZiBjb2x1bW5zIChvciBmb3JjZSAxIGNvbHVtbiBtb2RlKSxcclxuICAgICAgICAvLyByZW1lbWJlciBpdCdzIHBvc2l0aW9uICYgd2lkdGggc28gd2UgY2FuIHJlc3RvcmUgYmFjayAoMSAtPiAxMiBjb2x1bW4pICMxNjU1ICMxOTg1XHJcbiAgICAgICAgLy8gSUZGIHdlJ3JlIG5vdCBpbiB0aGUgbWlkZGxlIG9mIGNvbHVtbiByZXNpemluZyFcclxuICAgICAgICBjb25zdCBzYXZlT3JpZyA9IHRoaXMuY29sdW1uID09PSAxIHx8IG5vZGUueCArIG5vZGUudyA+IHRoaXMuY29sdW1uO1xyXG4gICAgICAgIGlmIChzYXZlT3JpZyAmJiB0aGlzLmNvbHVtbiA8IDEyICYmICF0aGlzLl9pbkNvbHVtblJlc2l6ZSAmJiBub2RlLl9pZCAmJiB0aGlzLmZpbmRDYWNoZUxheW91dChub2RlLCAxMikgPT09IC0xKSB7XHJcbiAgICAgICAgICAgIGxldCBjb3B5ID0gT2JqZWN0LmFzc2lnbih7fSwgbm9kZSk7IC8vIG5lZWQgX2lkICsgcG9zaXRpb25zXHJcbiAgICAgICAgICAgIGlmIChjb3B5LmF1dG9Qb3NpdGlvbikge1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlIGNvcHkueDtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSBjb3B5Lnk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgY29weS54ID0gTWF0aC5taW4oMTEsIGNvcHkueCk7XHJcbiAgICAgICAgICAgIGNvcHkudyA9IE1hdGgubWluKDEyLCBjb3B5LncpO1xyXG4gICAgICAgICAgICB0aGlzLmNhY2hlT25lTGF5b3V0KGNvcHksIDEyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG5vZGUudyA+IHRoaXMuY29sdW1uKSB7XHJcbiAgICAgICAgICAgIG5vZGUudyA9IHRoaXMuY29sdW1uO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChub2RlLncgPCAxKSB7XHJcbiAgICAgICAgICAgIG5vZGUudyA9IDE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLm1heFJvdyAmJiBub2RlLmggPiB0aGlzLm1heFJvdykge1xyXG4gICAgICAgICAgICBub2RlLmggPSB0aGlzLm1heFJvdztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAobm9kZS5oIDwgMSkge1xyXG4gICAgICAgICAgICBub2RlLmggPSAxO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobm9kZS54IDwgMCkge1xyXG4gICAgICAgICAgICBub2RlLnggPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobm9kZS55IDwgMCkge1xyXG4gICAgICAgICAgICBub2RlLnkgPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobm9kZS54ICsgbm9kZS53ID4gdGhpcy5jb2x1bW4pIHtcclxuICAgICAgICAgICAgaWYgKHJlc2l6aW5nKSB7XHJcbiAgICAgICAgICAgICAgICBub2RlLncgPSB0aGlzLmNvbHVtbiAtIG5vZGUueDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG5vZGUueCA9IHRoaXMuY29sdW1uIC0gbm9kZS53O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLm1heFJvdyAmJiBub2RlLnkgKyBub2RlLmggPiB0aGlzLm1heFJvdykge1xyXG4gICAgICAgICAgICBpZiAocmVzaXppbmcpIHtcclxuICAgICAgICAgICAgICAgIG5vZGUuaCA9IHRoaXMubWF4Um93IC0gbm9kZS55O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbm9kZS55ID0gdGhpcy5tYXhSb3cgLSBub2RlLmg7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF1dGlsc18xLlV0aWxzLnNhbWVQb3Mobm9kZSwgYmVmb3JlKSkge1xyXG4gICAgICAgICAgICBub2RlLl9kaXJ0eSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBub2RlO1xyXG4gICAgfVxyXG4gICAgLyoqIHJldHVybnMgYSBsaXN0IG9mIG1vZGlmaWVkIG5vZGVzIGZyb20gdGhlaXIgb3JpZ2luYWwgdmFsdWVzICovXHJcbiAgICBnZXREaXJ0eU5vZGVzKHZlcmlmeSkge1xyXG4gICAgICAgIC8vIGNvbXBhcmUgb3JpZ2luYWwgeCx5LHcsaCBpbnN0ZWFkIGFzIF9kaXJ0eSBjYW4gYmUgYSB0ZW1wb3Jhcnkgc3RhdGVcclxuICAgICAgICBpZiAodmVyaWZ5KSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm5vZGVzLmZpbHRlcihuID0+IG4uX2RpcnR5ICYmICF1dGlsc18xLlV0aWxzLnNhbWVQb3Mobiwgbi5fb3JpZykpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5ub2Rlcy5maWx0ZXIobiA9PiBuLl9kaXJ0eSk7XHJcbiAgICB9XHJcbiAgICAvKiogQGludGVybmFsIGNhbGwgdGhpcyB0byBjYWxsIG9uQ2hhbmdlIGNhbGxiYWNrIHdpdGggZGlydHkgbm9kZXMgc28gRE9NIGNhbiBiZSB1cGRhdGVkICovXHJcbiAgICBfbm90aWZ5KHJlbW92ZWROb2Rlcykge1xyXG4gICAgICAgIGlmICh0aGlzLmJhdGNoTW9kZSB8fCAhdGhpcy5vbkNoYW5nZSlcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgbGV0IGRpcnR5Tm9kZXMgPSAocmVtb3ZlZE5vZGVzIHx8IFtdKS5jb25jYXQodGhpcy5nZXREaXJ0eU5vZGVzKCkpO1xyXG4gICAgICAgIHRoaXMub25DaGFuZ2UoZGlydHlOb2Rlcyk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICAvKiogQGludGVybmFsIHJlbW92ZSBkaXJ0eSBhbmQgbGFzdCB0cmllZCBpbmZvICovXHJcbiAgICBjbGVhbk5vZGVzKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmJhdGNoTW9kZSlcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgdGhpcy5ub2Rlcy5mb3JFYWNoKG4gPT4ge1xyXG4gICAgICAgICAgICBkZWxldGUgbi5fZGlydHk7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBuLl9sYXN0VHJpZWQ7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICAvKiogQGludGVybmFsIGNhbGxlZCB0byBzYXZlIGluaXRpYWwgcG9zaXRpb24vc2l6ZSB0byB0cmFjayByZWFsIGRpcnR5IHN0YXRlLlxyXG4gICAgICogTm90ZTogc2hvdWxkIGJlIGNhbGxlZCByaWdodCBhZnRlciB3ZSBjYWxsIGNoYW5nZSBldmVudCAoc28gbmV4dCBBUEkgaXMgY2FuIGRldGVjdCBjaGFuZ2VzKVxyXG4gICAgICogYXMgd2VsbCBhcyByaWdodCBiZWZvcmUgd2Ugc3RhcnQgbW92ZS9yZXNpemUvZW50ZXIgKHNvIHdlIGNhbiByZXN0b3JlIGl0ZW1zIHRvIHByZXYgdmFsdWVzKSAqL1xyXG4gICAgc2F2ZUluaXRpYWwoKSB7XHJcbiAgICAgICAgdGhpcy5ub2Rlcy5mb3JFYWNoKG4gPT4ge1xyXG4gICAgICAgICAgICBuLl9vcmlnID0gdXRpbHNfMS5VdGlscy5jb3B5UG9zKHt9LCBuKTtcclxuICAgICAgICAgICAgZGVsZXRlIG4uX2RpcnR5O1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuX2hhc0xvY2tlZCA9IHRoaXMubm9kZXMuc29tZShuID0+IG4ubG9ja2VkKTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICAgIC8qKiBAaW50ZXJuYWwgcmVzdG9yZSBhbGwgdGhlIG5vZGVzIGJhY2sgdG8gaW5pdGlhbCB2YWx1ZXMgKGNhbGxlZCB3aGVuIHdlIGxlYXZlKSAqL1xyXG4gICAgcmVzdG9yZUluaXRpYWwoKSB7XHJcbiAgICAgICAgdGhpcy5ub2Rlcy5mb3JFYWNoKG4gPT4ge1xyXG4gICAgICAgICAgICBpZiAodXRpbHNfMS5VdGlscy5zYW1lUG9zKG4sIG4uX29yaWcpKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB1dGlsc18xLlV0aWxzLmNvcHlQb3Mobiwgbi5fb3JpZyk7XHJcbiAgICAgICAgICAgIG4uX2RpcnR5ID0gdHJ1ZTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLl9ub3RpZnkoKTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICAgIC8qKiBmaW5kIHRoZSBmaXJzdCBhdmFpbGFibGUgZW1wdHkgc3BvdCBmb3IgdGhlIGdpdmVuIG5vZGUgd2lkdGgvaGVpZ2h0LCB1cGRhdGluZyB0aGUgeCx5IGF0dHJpYnV0ZXMuIHJldHVybiB0cnVlIGlmIGZvdW5kLlxyXG4gICAgICogb3B0aW9uYWxseSB5b3UgY2FuIHBhc3MgeW91ciBvd24gZXhpc3Rpbmcgbm9kZSBsaXN0IGFuZCBjb2x1bW4gY291bnQsIG90aGVyd2lzZSBkZWZhdWx0cyB0byB0aGF0IGVuZ2luZSBkYXRhLlxyXG4gICAgICovXHJcbiAgICBmaW5kRW1wdHlQb3NpdGlvbihub2RlLCBub2RlTGlzdCA9IHRoaXMubm9kZXMsIGNvbHVtbiA9IHRoaXMuY29sdW1uKSB7XHJcbiAgICAgICAgbm9kZUxpc3QgPSB1dGlsc18xLlV0aWxzLnNvcnQobm9kZUxpc3QsIC0xLCBjb2x1bW4pO1xyXG4gICAgICAgIGxldCBmb3VuZCA9IGZhbHNlO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyAhZm91bmQ7ICsraSkge1xyXG4gICAgICAgICAgICBsZXQgeCA9IGkgJSBjb2x1bW47XHJcbiAgICAgICAgICAgIGxldCB5ID0gTWF0aC5mbG9vcihpIC8gY29sdW1uKTtcclxuICAgICAgICAgICAgaWYgKHggKyBub2RlLncgPiBjb2x1bW4pIHtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCBib3ggPSB7IHgsIHksIHc6IG5vZGUudywgaDogbm9kZS5oIH07XHJcbiAgICAgICAgICAgIGlmICghbm9kZUxpc3QuZmluZChuID0+IHV0aWxzXzEuVXRpbHMuaXNJbnRlcmNlcHRlZChib3gsIG4pKSkge1xyXG4gICAgICAgICAgICAgICAgbm9kZS54ID0geDtcclxuICAgICAgICAgICAgICAgIG5vZGUueSA9IHk7XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgbm9kZS5hdXRvUG9zaXRpb247XHJcbiAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZvdW5kO1xyXG4gICAgfVxyXG4gICAgLyoqIGNhbGwgdG8gYWRkIHRoZSBnaXZlbiBub2RlIHRvIG91ciBsaXN0LCBmaXhpbmcgY29sbGlzaW9uIGFuZCByZS1wYWNraW5nICovXHJcbiAgICBhZGROb2RlKG5vZGUsIHRyaWdnZXJBZGRFdmVudCA9IGZhbHNlKSB7XHJcbiAgICAgICAgbGV0IGR1cCA9IHRoaXMubm9kZXMuZmluZChuID0+IG4uX2lkID09PSBub2RlLl9pZCk7XHJcbiAgICAgICAgaWYgKGR1cClcclxuICAgICAgICAgICAgcmV0dXJuIGR1cDsgLy8gcHJldmVudCBpbnNlcnRpbmcgdHdpY2UhIHJldHVybiBpdCBpbnN0ZWFkLlxyXG4gICAgICAgIC8vIHNraXAgcHJlcGFyZU5vZGUgaWYgd2UncmUgaW4gbWlkZGxlIG9mIGNvbHVtbiByZXNpemUgKG5vdCBuZXcpIGJ1dCBkbyBjaGVjayBmb3IgYm91bmRzIVxyXG4gICAgICAgIG5vZGUgPSB0aGlzLl9pbkNvbHVtblJlc2l6ZSA/IHRoaXMubm9kZUJvdW5kRml4KG5vZGUpIDogdGhpcy5wcmVwYXJlTm9kZShub2RlKTtcclxuICAgICAgICBkZWxldGUgbm9kZS5fdGVtcG9yYXJ5UmVtb3ZlZDtcclxuICAgICAgICBkZWxldGUgbm9kZS5fcmVtb3ZlRE9NO1xyXG4gICAgICAgIGlmIChub2RlLmF1dG9Qb3NpdGlvbiAmJiB0aGlzLmZpbmRFbXB0eVBvc2l0aW9uKG5vZGUpKSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBub2RlLmF1dG9Qb3NpdGlvbjsgLy8gZm91bmQgb3VyIHNsb3RcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5ub2Rlcy5wdXNoKG5vZGUpO1xyXG4gICAgICAgIGlmICh0cmlnZ2VyQWRkRXZlbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5hZGRlZE5vZGVzLnB1c2gobm9kZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2ZpeENvbGxpc2lvbnMobm9kZSk7XHJcbiAgICAgICAgaWYgKCF0aGlzLmJhdGNoTW9kZSkge1xyXG4gICAgICAgICAgICB0aGlzLl9wYWNrTm9kZXMoKS5fbm90aWZ5KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBub2RlO1xyXG4gICAgfVxyXG4gICAgcmVtb3ZlTm9kZShub2RlLCByZW1vdmVET00gPSB0cnVlLCB0cmlnZ2VyRXZlbnQgPSBmYWxzZSkge1xyXG4gICAgICAgIGlmICghdGhpcy5ub2Rlcy5maW5kKG4gPT4gbiA9PT0gbm9kZSkpIHtcclxuICAgICAgICAgICAgLy8gVEVTVCBjb25zb2xlLmxvZyhgRXJyb3I6IEdyaWRTdGFja0VuZ2luZS5yZW1vdmVOb2RlKCkgbm9kZS5faWQ9JHtub2RlLl9pZH0gbm90IGZvdW5kIWApXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodHJpZ2dlckV2ZW50KSB7IC8vIHdlIHdhaXQgdW50aWwgZmluYWwgZHJvcCB0byBtYW51YWxseSB0cmFjayByZW1vdmVkIGl0ZW1zIChyYXRoZXIgdGhhbiBkdXJpbmcgZHJhZylcclxuICAgICAgICAgICAgdGhpcy5yZW1vdmVkTm9kZXMucHVzaChub2RlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJlbW92ZURPTSlcclxuICAgICAgICAgICAgbm9kZS5fcmVtb3ZlRE9NID0gdHJ1ZTsgLy8gbGV0IENCIHJlbW92ZSBhY3R1YWwgSFRNTCAodXNlZCB0byBzZXQgX2lkIHRvIG51bGwsIGJ1dCB0aGVuIHdlIGxvb3NlIGxheW91dCBpbmZvKVxyXG4gICAgICAgIC8vIGRvbid0IHVzZSAnZmFzdGVyJyAuc3BsaWNlKGZpbmRJbmRleCgpLDEpIGluIGNhc2Ugbm9kZSBpc24ndCBpbiBvdXIgbGlzdCwgb3IgaW4gbXVsdGlwbGUgdGltZXMuXHJcbiAgICAgICAgdGhpcy5ub2RlcyA9IHRoaXMubm9kZXMuZmlsdGVyKG4gPT4gbiAhPT0gbm9kZSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhY2tOb2RlcygpXHJcbiAgICAgICAgICAgIC5fbm90aWZ5KFtub2RlXSk7XHJcbiAgICB9XHJcbiAgICByZW1vdmVBbGwocmVtb3ZlRE9NID0gdHJ1ZSkge1xyXG4gICAgICAgIGRlbGV0ZSB0aGlzLl9sYXlvdXRzO1xyXG4gICAgICAgIGlmICh0aGlzLm5vZGVzLmxlbmd0aCA9PT0gMClcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgcmVtb3ZlRE9NICYmIHRoaXMubm9kZXMuZm9yRWFjaChuID0+IG4uX3JlbW92ZURPTSA9IHRydWUpOyAvLyBsZXQgQ0IgcmVtb3ZlIGFjdHVhbCBIVE1MICh1c2VkIHRvIHNldCBfaWQgdG8gbnVsbCwgYnV0IHRoZW4gd2UgbG9vc2UgbGF5b3V0IGluZm8pXHJcbiAgICAgICAgdGhpcy5yZW1vdmVkTm9kZXMgPSB0aGlzLm5vZGVzO1xyXG4gICAgICAgIHRoaXMubm9kZXMgPSBbXTtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbm90aWZ5KHRoaXMucmVtb3ZlZE5vZGVzKTtcclxuICAgIH1cclxuICAgIC8qKiBjaGVja3MgaWYgaXRlbSBjYW4gYmUgbW92ZWQgKGxheW91dCBjb25zdHJhaW4pIHZzIG1vdmVOb2RlKCksIHJldHVybmluZyB0cnVlIGlmIHdhcyBhYmxlIHRvIG1vdmUuXHJcbiAgICAgKiBJbiBtb3JlIGNvbXBsaWNhdGVkIGNhc2VzIChtYXhSb3cpIGl0IHdpbGwgYXR0ZW1wdCBhdCBtb3ZpbmcgdGhlIGl0ZW0gYW5kIGZpeGluZ1xyXG4gICAgICogb3RoZXJzIGluIGEgY2xvbmUgZmlyc3QsIHRoZW4gYXBwbHkgdGhvc2UgY2hhbmdlcyBpZiBzdGlsbCB3aXRoaW4gc3BlY3MuICovXHJcbiAgICBtb3ZlTm9kZUNoZWNrKG5vZGUsIG8pIHtcclxuICAgICAgICAvLyBpZiAobm9kZS5sb2NrZWQpIHJldHVybiBmYWxzZTtcclxuICAgICAgICBpZiAoIXRoaXMuY2hhbmdlZFBvc0NvbnN0cmFpbihub2RlLCBvKSlcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIG8ucGFjayA9IHRydWU7XHJcbiAgICAgICAgLy8gc2ltcGxlciBjYXNlOiBtb3ZlIGl0ZW0gZGlyZWN0bHkuLi5cclxuICAgICAgICBpZiAoIXRoaXMubWF4Um93KSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1vdmVOb2RlKG5vZGUsIG8pO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBjb21wbGV4IGNhc2U6IGNyZWF0ZSBhIGNsb25lIHdpdGggTk8gbWF4Um93ICh3aWxsIGNoZWNrIGZvciBvdXQgb2YgYm91bmRzIGF0IHRoZSBlbmQpXHJcbiAgICAgICAgbGV0IGNsb25lZE5vZGU7XHJcbiAgICAgICAgbGV0IGNsb25lID0gbmV3IEdyaWRTdGFja0VuZ2luZSh7XHJcbiAgICAgICAgICAgIGNvbHVtbjogdGhpcy5jb2x1bW4sXHJcbiAgICAgICAgICAgIGZsb2F0OiB0aGlzLmZsb2F0LFxyXG4gICAgICAgICAgICBub2RlczogdGhpcy5ub2Rlcy5tYXAobiA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAobiA9PT0gbm9kZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNsb25lZE5vZGUgPSBPYmplY3QuYXNzaWduKHt9LCBuKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xvbmVkTm9kZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBuKTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoIWNsb25lZE5vZGUpXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAvLyBjaGVjayBpZiB3ZSdyZSBjb3ZlcmluZyA1MCUgY29sbGlzaW9uIGFuZCBjb3VsZCBtb3ZlXHJcbiAgICAgICAgbGV0IGNhbk1vdmUgPSBjbG9uZS5tb3ZlTm9kZShjbG9uZWROb2RlLCBvKSAmJiBjbG9uZS5nZXRSb3coKSA8PSB0aGlzLm1heFJvdztcclxuICAgICAgICAvLyBlbHNlIGNoZWNrIGlmIHdlIGNhbiBmb3JjZSBhIHN3YXAgKGZsb2F0PXRydWUsIG9yIGRpZmZlcmVudCBzaGFwZXMpIG9uIG5vbi1yZXNpemVcclxuICAgICAgICBpZiAoIWNhbk1vdmUgJiYgIW8ucmVzaXppbmcgJiYgby5jb2xsaWRlKSB7XHJcbiAgICAgICAgICAgIGxldCBjb2xsaWRlID0gby5jb2xsaWRlLmVsLmdyaWRzdGFja05vZGU7IC8vIGZpbmQgdGhlIHNvdXJjZSBub2RlIHRoZSBjbG9uZSBjb2xsaWRlZCB3aXRoIGF0IDUwJVxyXG4gICAgICAgICAgICBpZiAodGhpcy5zd2FwKG5vZGUsIGNvbGxpZGUpKSB7IC8vIHN3YXBzIGFuZCBtYXJrIGRpcnR5XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9ub3RpZnkoKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghY2FuTW92ZSlcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIC8vIGlmIGNsb25lIHdhcyBhYmxlIHRvIG1vdmUsIGNvcHkgdGhvc2UgbW9kcyBvdmVyIHRvIHVzIG5vdyBpbnN0ZWFkIG9mIGNhbGxlciB0cnlpbmcgdG8gZG8gdGhpcyBhbGwgb3ZlciFcclxuICAgICAgICAvLyBOb3RlOiB3ZSBjYW4ndCB1c2UgdGhlIGxpc3QgZGlyZWN0bHkgYXMgZWxlbWVudHMgYW5kIG90aGVyIHBhcnRzIHBvaW50IHRvIGFjdHVhbCBub2RlLCBzbyBjb3B5IGNvbnRlbnRcclxuICAgICAgICBjbG9uZS5ub2Rlcy5maWx0ZXIobiA9PiBuLl9kaXJ0eSkuZm9yRWFjaChjID0+IHtcclxuICAgICAgICAgICAgbGV0IG4gPSB0aGlzLm5vZGVzLmZpbmQoYSA9PiBhLl9pZCA9PT0gYy5faWQpO1xyXG4gICAgICAgICAgICBpZiAoIW4pXHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIHV0aWxzXzEuVXRpbHMuY29weVBvcyhuLCBjKTtcclxuICAgICAgICAgICAgbi5fZGlydHkgPSB0cnVlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuX25vdGlmeSgpO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgLyoqIHJldHVybiB0cnVlIGlmIGNhbiBmaXQgaW4gZ3JpZCBoZWlnaHQgY29uc3RyYWluIG9ubHkgKGFsd2F5cyB0cnVlIGlmIG5vIG1heFJvdykgKi9cclxuICAgIHdpbGxJdEZpdChub2RlKSB7XHJcbiAgICAgICAgZGVsZXRlIG5vZGUuX3dpbGxGaXRQb3M7XHJcbiAgICAgICAgaWYgKCF0aGlzLm1heFJvdylcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgLy8gY3JlYXRlIGEgY2xvbmUgd2l0aCBOTyBtYXhSb3cgYW5kIGNoZWNrIGlmIHN0aWxsIHdpdGhpbiBzaXplXHJcbiAgICAgICAgbGV0IGNsb25lID0gbmV3IEdyaWRTdGFja0VuZ2luZSh7XHJcbiAgICAgICAgICAgIGNvbHVtbjogdGhpcy5jb2x1bW4sXHJcbiAgICAgICAgICAgIGZsb2F0OiB0aGlzLmZsb2F0LFxyXG4gICAgICAgICAgICBub2RlczogdGhpcy5ub2Rlcy5tYXAobiA9PiB7IHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBuKTsgfSlcclxuICAgICAgICB9KTtcclxuICAgICAgICBsZXQgbiA9IE9iamVjdC5hc3NpZ24oe30sIG5vZGUpOyAvLyBjbG9uZSBub2RlIHNvIHdlIGRvbid0IG1vZCBhbnkgc2V0dGluZ3Mgb24gaXQgYnV0IGhhdmUgZnVsbCBhdXRvUG9zaXRpb24gYW5kIG1pbi9tYXggYXMgd2VsbCEgIzE2ODdcclxuICAgICAgICB0aGlzLmNsZWFudXBOb2RlKG4pO1xyXG4gICAgICAgIGRlbGV0ZSBuLmVsO1xyXG4gICAgICAgIGRlbGV0ZSBuLl9pZDtcclxuICAgICAgICBkZWxldGUgbi5jb250ZW50O1xyXG4gICAgICAgIGRlbGV0ZSBuLmdyaWQ7XHJcbiAgICAgICAgY2xvbmUuYWRkTm9kZShuKTtcclxuICAgICAgICBpZiAoY2xvbmUuZ2V0Um93KCkgPD0gdGhpcy5tYXhSb3cpIHtcclxuICAgICAgICAgICAgbm9kZS5fd2lsbEZpdFBvcyA9IHV0aWxzXzEuVXRpbHMuY29weVBvcyh7fSwgbik7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICAvKiogdHJ1ZSBpZiB4LHkgb3IgdyxoIGFyZSBkaWZmZXJlbnQgYWZ0ZXIgY2xhbXBpbmcgdG8gbWluL21heCAqL1xyXG4gICAgY2hhbmdlZFBvc0NvbnN0cmFpbihub2RlLCBwKSB7XHJcbiAgICAgICAgLy8gZmlyc3QgbWFrZSBzdXJlIHcsaCBhcmUgc2V0IGZvciBjYWxsZXJcclxuICAgICAgICBwLncgPSBwLncgfHwgbm9kZS53O1xyXG4gICAgICAgIHAuaCA9IHAuaCB8fCBub2RlLmg7XHJcbiAgICAgICAgaWYgKG5vZGUueCAhPT0gcC54IHx8IG5vZGUueSAhPT0gcC55KVxyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAvLyBjaGVjayBjb25zdHJhaW5lZCB3LGhcclxuICAgICAgICBpZiAobm9kZS5tYXhXKSB7XHJcbiAgICAgICAgICAgIHAudyA9IE1hdGgubWluKHAudywgbm9kZS5tYXhXKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG5vZGUubWF4SCkge1xyXG4gICAgICAgICAgICBwLmggPSBNYXRoLm1pbihwLmgsIG5vZGUubWF4SCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChub2RlLm1pblcpIHtcclxuICAgICAgICAgICAgcC53ID0gTWF0aC5tYXgocC53LCBub2RlLm1pblcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobm9kZS5taW5IKSB7XHJcbiAgICAgICAgICAgIHAuaCA9IE1hdGgubWF4KHAuaCwgbm9kZS5taW5IKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIChub2RlLncgIT09IHAudyB8fCBub2RlLmggIT09IHAuaCk7XHJcbiAgICB9XHJcbiAgICAvKiogcmV0dXJuIHRydWUgaWYgdGhlIHBhc3NlZCBpbiBub2RlIHdhcyBhY3R1YWxseSBtb3ZlZCAoY2hlY2tzIGZvciBuby1vcCBhbmQgbG9ja2VkKSAqL1xyXG4gICAgbW92ZU5vZGUobm9kZSwgbykge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgaWYgKCFub2RlIHx8IC8qbm9kZS5sb2NrZWQgfHwqLyAhbylcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGxldCB3YXNVbmRlZmluZWRQYWNrO1xyXG4gICAgICAgIGlmIChvLnBhY2sgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB3YXNVbmRlZmluZWRQYWNrID0gby5wYWNrID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gY29uc3RyYWluIHRoZSBwYXNzZWQgaW4gdmFsdWVzIGFuZCBjaGVjayBpZiB3ZSdyZSBzdGlsbCBjaGFuZ2luZyBvdXIgbm9kZVxyXG4gICAgICAgIGlmICh0eXBlb2Ygby54ICE9PSAnbnVtYmVyJykge1xyXG4gICAgICAgICAgICBvLnggPSBub2RlLng7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0eXBlb2Ygby55ICE9PSAnbnVtYmVyJykge1xyXG4gICAgICAgICAgICBvLnkgPSBub2RlLnk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0eXBlb2Ygby53ICE9PSAnbnVtYmVyJykge1xyXG4gICAgICAgICAgICBvLncgPSBub2RlLnc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0eXBlb2Ygby5oICE9PSAnbnVtYmVyJykge1xyXG4gICAgICAgICAgICBvLmggPSBub2RlLmg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCByZXNpemluZyA9IChub2RlLncgIT09IG8udyB8fCBub2RlLmggIT09IG8uaCk7XHJcbiAgICAgICAgbGV0IG5uID0gdXRpbHNfMS5VdGlscy5jb3B5UG9zKHt9LCBub2RlLCB0cnVlKTsgLy8gZ2V0IG1pbi9tYXggb3V0IGZpcnN0LCB0aGVuIG9wdCBwb3NpdGlvbnMgbmV4dFxyXG4gICAgICAgIHV0aWxzXzEuVXRpbHMuY29weVBvcyhubiwgbyk7XHJcbiAgICAgICAgbm4gPSB0aGlzLm5vZGVCb3VuZEZpeChubiwgcmVzaXppbmcpO1xyXG4gICAgICAgIHV0aWxzXzEuVXRpbHMuY29weVBvcyhvLCBubik7XHJcbiAgICAgICAgaWYgKHV0aWxzXzEuVXRpbHMuc2FtZVBvcyhub2RlLCBvKSlcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGxldCBwcmV2UG9zID0gdXRpbHNfMS5VdGlscy5jb3B5UG9zKHt9LCBub2RlKTtcclxuICAgICAgICAvLyBjaGVjayBpZiB3ZSB3aWxsIG5lZWQgdG8gZml4IGNvbGxpc2lvbiBhdCBvdXIgbmV3IGxvY2F0aW9uXHJcbiAgICAgICAgbGV0IGNvbGxpZGVzID0gdGhpcy5jb2xsaWRlQWxsKG5vZGUsIG5uLCBvLnNraXApO1xyXG4gICAgICAgIGxldCBuZWVkVG9Nb3ZlID0gdHJ1ZTtcclxuICAgICAgICBpZiAoY29sbGlkZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGxldCBhY3RpdmVEcmFnID0gbm9kZS5fbW92aW5nICYmICFvLm5lc3RlZDtcclxuICAgICAgICAgICAgLy8gY2hlY2sgdG8gbWFrZSBzdXJlIHdlIGFjdHVhbGx5IGNvbGxpZGVkIG92ZXIgNTAlIHN1cmZhY2UgYXJlYSB3aGlsZSBkcmFnZ2luZ1xyXG4gICAgICAgICAgICBsZXQgY29sbGlkZSA9IGFjdGl2ZURyYWcgPyB0aGlzLmRpcmVjdGlvbkNvbGxpZGVDb3ZlcmFnZShub2RlLCBvLCBjb2xsaWRlcykgOiBjb2xsaWRlc1swXTtcclxuICAgICAgICAgICAgLy8gaWYgd2UncmUgZW5hYmxpbmcgY3JlYXRpb24gb2Ygc3ViLWdyaWRzIG9uIHRoZSBmbHksIHNlZSBpZiB3ZSdyZSBjb3ZlcmluZyA4MCUgb2YgZWl0aGVyIG9uZSwgaWYgd2UgZGlkbid0IGFscmVhZHkgZG8gdGhhdFxyXG4gICAgICAgICAgICBpZiAoYWN0aXZlRHJhZyAmJiBjb2xsaWRlICYmICgoX2IgPSAoX2EgPSBub2RlLmdyaWQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5vcHRzKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Iuc3ViR3JpZER5bmFtaWMpICYmICFub2RlLmdyaWQuX2lzVGVtcCkge1xyXG4gICAgICAgICAgICAgICAgbGV0IG92ZXIgPSB1dGlsc18xLlV0aWxzLmFyZWFJbnRlcmNlcHQoby5yZWN0LCBjb2xsaWRlLl9yZWN0KTtcclxuICAgICAgICAgICAgICAgIGxldCBhMSA9IHV0aWxzXzEuVXRpbHMuYXJlYShvLnJlY3QpO1xyXG4gICAgICAgICAgICAgICAgbGV0IGEyID0gdXRpbHNfMS5VdGlscy5hcmVhKGNvbGxpZGUuX3JlY3QpO1xyXG4gICAgICAgICAgICAgICAgbGV0IHBlcmMgPSBvdmVyIC8gKGExIDwgYTIgPyBhMSA6IGEyKTtcclxuICAgICAgICAgICAgICAgIGlmIChwZXJjID4gLjgpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb2xsaWRlLmdyaWQubWFrZVN1YkdyaWQoY29sbGlkZS5lbCwgdW5kZWZpbmVkLCBub2RlKTtcclxuICAgICAgICAgICAgICAgICAgICBjb2xsaWRlID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChjb2xsaWRlKSB7XHJcbiAgICAgICAgICAgICAgICBuZWVkVG9Nb3ZlID0gIXRoaXMuX2ZpeENvbGxpc2lvbnMobm9kZSwgbm4sIGNvbGxpZGUsIG8pOyAvLyBjaGVjayBpZiBhbHJlYWR5IG1vdmVkLi4uXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBuZWVkVG9Nb3ZlID0gZmFsc2U7IC8vIHdlIGRpZG4ndCBjb3ZlciA+NTAlIGZvciBhIG1vdmUsIHNraXAuLi5cclxuICAgICAgICAgICAgICAgIGlmICh3YXNVbmRlZmluZWRQYWNrKVxyXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBvLnBhY2s7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gbm93IG1vdmUgKHRvIHRoZSBvcmlnaW5hbCBhc2sgdnMgdGhlIGNvbGxpc2lvbiB2ZXJzaW9uIHdoaWNoIG1pZ2h0IGRpZmZlcikgYW5kIHJlcGFjayB0aGluZ3NcclxuICAgICAgICBpZiAobmVlZFRvTW92ZSkge1xyXG4gICAgICAgICAgICBub2RlLl9kaXJ0eSA9IHRydWU7XHJcbiAgICAgICAgICAgIHV0aWxzXzEuVXRpbHMuY29weVBvcyhub2RlLCBubik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChvLnBhY2spIHtcclxuICAgICAgICAgICAgdGhpcy5fcGFja05vZGVzKClcclxuICAgICAgICAgICAgICAgIC5fbm90aWZ5KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAhdXRpbHNfMS5VdGlscy5zYW1lUG9zKG5vZGUsIHByZXZQb3MpOyAvLyBwYWNrIG1pZ2h0IGhhdmUgbW92ZWQgdGhpbmdzIGJhY2tcclxuICAgIH1cclxuICAgIGdldFJvdygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5ub2Rlcy5yZWR1Y2UoKHJvdywgbikgPT4gTWF0aC5tYXgocm93LCBuLnkgKyBuLmgpLCAwKTtcclxuICAgIH1cclxuICAgIGJlZ2luVXBkYXRlKG5vZGUpIHtcclxuICAgICAgICBpZiAoIW5vZGUuX3VwZGF0aW5nKSB7XHJcbiAgICAgICAgICAgIG5vZGUuX3VwZGF0aW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgZGVsZXRlIG5vZGUuX3NraXBEb3duO1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuYmF0Y2hNb2RlKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5zYXZlSW5pdGlhbCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICAgIGVuZFVwZGF0ZSgpIHtcclxuICAgICAgICBsZXQgbiA9IHRoaXMubm9kZXMuZmluZChuID0+IG4uX3VwZGF0aW5nKTtcclxuICAgICAgICBpZiAobikge1xyXG4gICAgICAgICAgICBkZWxldGUgbi5fdXBkYXRpbmc7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBuLl9za2lwRG93bjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICAvKiogc2F2ZXMgYSBjb3B5IG9mIHRoZSBsYXJnZXN0IGNvbHVtbiBsYXlvdXQgKGVnIDEyIGV2ZW4gd2hlbiByZW5kZXJpbmcgb25lQ29sdW1uTW9kZSkgc28gd2UgZG9uJ3QgbG9vc2Ugb3JpZyBsYXlvdXQsXHJcbiAgICAgKiByZXR1cm5pbmcgYSBsaXN0IG9mIHdpZGdldHMgZm9yIHNlcmlhbGl6YXRpb24gKi9cclxuICAgIHNhdmUoc2F2ZUVsZW1lbnQgPSB0cnVlKSB7XHJcbiAgICAgICAgdmFyIF9hO1xyXG4gICAgICAgIC8vIHVzZSB0aGUgaGlnaGVzdCBsYXlvdXQgZm9yIGFueSBzYXZlZCBpbmZvIHNvIHdlIGNhbiBoYXZlIGZ1bGwgZGV0YWlsIG9uIHJlbG9hZCAjMTg0OVxyXG4gICAgICAgIGxldCBsZW4gPSAoX2EgPSB0aGlzLl9sYXlvdXRzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubGVuZ3RoO1xyXG4gICAgICAgIGxldCBsYXlvdXQgPSBsZW4gJiYgdGhpcy5jb2x1bW4gIT09IChsZW4gLSAxKSA/IHRoaXMuX2xheW91dHNbbGVuIC0gMV0gOiBudWxsO1xyXG4gICAgICAgIGxldCBsaXN0ID0gW107XHJcbiAgICAgICAgdGhpcy5zb3J0Tm9kZXMoKTtcclxuICAgICAgICB0aGlzLm5vZGVzLmZvckVhY2gobiA9PiB7XHJcbiAgICAgICAgICAgIGxldCB3bCA9IGxheW91dCA9PT0gbnVsbCB8fCBsYXlvdXQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxheW91dC5maW5kKGwgPT4gbC5faWQgPT09IG4uX2lkKTtcclxuICAgICAgICAgICAgbGV0IHcgPSBPYmplY3QuYXNzaWduKHt9LCBuKTtcclxuICAgICAgICAgICAgLy8gdXNlIGxheW91dCBpbmZvIGluc3RlYWQgaWYgc2V0XHJcbiAgICAgICAgICAgIGlmICh3bCkge1xyXG4gICAgICAgICAgICAgICAgdy54ID0gd2wueDtcclxuICAgICAgICAgICAgICAgIHcueSA9IHdsLnk7XHJcbiAgICAgICAgICAgICAgICB3LncgPSB3bC53O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHV0aWxzXzEuVXRpbHMucmVtb3ZlSW50ZXJuYWxGb3JTYXZlKHcsICFzYXZlRWxlbWVudCk7XHJcbiAgICAgICAgICAgIGxpc3QucHVzaCh3KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gbGlzdDtcclxuICAgIH1cclxuICAgIC8qKiBAaW50ZXJuYWwgY2FsbGVkIHdoZW5ldmVyIGEgbm9kZSBpcyBhZGRlZCBvciBtb3ZlZCAtIHVwZGF0ZXMgdGhlIGNhY2hlZCBsYXlvdXRzICovXHJcbiAgICBsYXlvdXRzTm9kZXNDaGFuZ2Uobm9kZXMpIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2xheW91dHMgfHwgdGhpcy5faW5Db2x1bW5SZXNpemUpXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgIC8vIHJlbW92ZSBzbWFsbGVyIGxheW91dHMgLSB3ZSB3aWxsIHJlLWdlbmVyYXRlIHRob3NlIG9uIHRoZSBmbHkuLi4gbGFyZ2VyIG9uZXMgbmVlZCB0byB1cGRhdGVcclxuICAgICAgICB0aGlzLl9sYXlvdXRzLmZvckVhY2goKGxheW91dCwgY29sdW1uKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghbGF5b3V0IHx8IGNvbHVtbiA9PT0gdGhpcy5jb2x1bW4pXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICAgICAgaWYgKGNvbHVtbiA8IHRoaXMuY29sdW1uKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9sYXlvdXRzW2NvbHVtbl0gPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyB3ZSBzYXZlIHRoZSBvcmlnaW5hbCB4LHksdyAoaCBpc24ndCBjYWNoZWQpIHRvIHNlZSB3aGF0IGFjdHVhbGx5IGNoYW5nZWQgdG8gcHJvcGFnYXRlIGJldHRlci5cclxuICAgICAgICAgICAgICAgIC8vIE5PVEU6IHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgYWdhaW5zdCBvdXQgb2YgYm91bmQgc2NhbGluZy9tb3ZpbmcgYXMgdGhhdCB3aWxsIGJlIGRvbmUgd2hlbiB1c2luZyB0aG9zZSBjYWNoZSB2YWx1ZXMuICMxNzg1XHJcbiAgICAgICAgICAgICAgICBsZXQgcmF0aW8gPSBjb2x1bW4gLyB0aGlzLmNvbHVtbjtcclxuICAgICAgICAgICAgICAgIG5vZGVzLmZvckVhY2gobm9kZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlLl9vcmlnKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47IC8vIGRpZG4ndCBjaGFuZ2UgKG5ld2x5IGFkZGVkID8pXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IG4gPSBsYXlvdXQuZmluZChsID0+IGwuX2lkID09PSBub2RlLl9pZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFuKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47IC8vIG5vIGNhY2hlIGZvciBuZXcgbm9kZXMuIFdpbGwgdXNlIHRob3NlIHZhbHVlcy5cclxuICAgICAgICAgICAgICAgICAgICAvLyBZIGNoYW5nZWQsIHB1c2ggZG93biBzYW1lIGFtb3VudFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGRldGVjdCBkb2luZyBpdGVtICdzd2Fwcycgd2lsbCBoZWxwIGluc3RlYWQgb2YgbW92ZSAoZXNwZWNpYWxseSBpbiAxIGNvbHVtbiBtb2RlKVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlLnkgIT09IG5vZGUuX29yaWcueSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuLnkgKz0gKG5vZGUueSAtIG5vZGUuX29yaWcueSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIFggY2hhbmdlZCwgc2NhbGUgZnJvbSBuZXcgcG9zaXRpb25cclxuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS54ICE9PSBub2RlLl9vcmlnLngpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbi54ID0gTWF0aC5yb3VuZChub2RlLnggKiByYXRpbyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIHdpZHRoIGNoYW5nZWQsIHNjYWxlIGZyb20gbmV3IHdpZHRoXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUudyAhPT0gbm9kZS5fb3JpZy53KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG4udyA9IE1hdGgucm91bmQobm9kZS53ICogcmF0aW8pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAvLyAuLi5oZWlnaHQgYWx3YXlzIGNhcnJpZXMgb3ZlciBmcm9tIGNhY2hlXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBAaW50ZXJuYWwgQ2FsbGVkIHRvIHNjYWxlIHRoZSB3aWRnZXQgd2lkdGggJiBwb3NpdGlvbiB1cC9kb3duIGJhc2VkIG9uIHRoZSBjb2x1bW4gY2hhbmdlLlxyXG4gICAgICogTm90ZSB3ZSBzdG9yZSBwcmV2aW91cyBsYXlvdXRzIChlc3BlY2lhbGx5IG9yaWdpbmFsIG9uZXMpIHRvIG1ha2UgaXQgcG9zc2libGUgdG8gZ29cclxuICAgICAqIGZyb20gc2F5IDEyIC0+IDEgLT4gMTIgYW5kIGdldCBiYWNrIHRvIHdoZXJlIHdlIHdlcmUuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHByZXZDb2x1bW4gcHJldmlvdXMgbnVtYmVyIG9mIGNvbHVtbnNcclxuICAgICAqIEBwYXJhbSBjb2x1bW4gIG5ldyBjb2x1bW4gbnVtYmVyXHJcbiAgICAgKiBAcGFyYW0gbm9kZXMgZGlmZmVyZW50IHNvcnRlZCBsaXN0IChleDogRE9NIG9yZGVyKSBpbnN0ZWFkIG9mIGN1cnJlbnQgbGlzdFxyXG4gICAgICogQHBhcmFtIGxheW91dCBzcGVjaWZ5IHRoZSB0eXBlIG9mIHJlLWxheW91dCB0aGF0IHdpbGwgaGFwcGVuIChwb3NpdGlvbiwgc2l6ZSwgZXRjLi4uKS5cclxuICAgICAqIE5vdGU6IGl0ZW1zIHdpbGwgbmV2ZXIgYmUgb3V0c2lkZSBvZiB0aGUgY3VycmVudCBjb2x1bW4gYm91bmRhcmllcy4gZGVmYXVsdCAobW92ZVNjYWxlKS4gSWdub3JlZCBmb3IgMSBjb2x1bW5cclxuICAgICAqL1xyXG4gICAgdXBkYXRlTm9kZVdpZHRocyhwcmV2Q29sdW1uLCBjb2x1bW4sIG5vZGVzLCBsYXlvdXQgPSAnbW92ZVNjYWxlJykge1xyXG4gICAgICAgIHZhciBfYTtcclxuICAgICAgICBpZiAoIXRoaXMubm9kZXMubGVuZ3RoIHx8ICFjb2x1bW4gfHwgcHJldkNvbHVtbiA9PT0gY29sdW1uKVxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICAvLyBjYWNoZSB0aGUgY3VycmVudCBsYXlvdXQgaW4gY2FzZSB0aGV5IHdhbnQgdG8gZ28gYmFjayAobGlrZSAxMiAtPiAxIC0+IDEyKSBhcyBpdCByZXF1aXJlcyBvcmlnaW5hbCBkYXRhXHJcbiAgICAgICAgdGhpcy5jYWNoZUxheW91dCh0aGlzLm5vZGVzLCBwcmV2Q29sdW1uKTtcclxuICAgICAgICB0aGlzLmJhdGNoVXBkYXRlKCk7IC8vIGRvIHRoaXMgRUFSTFkgYXMgaXQgd2lsbCBjYWxsIHNhdmVJbml0aWFsKCkgc28gd2UgY2FuIGRldGVjdCB3aGVyZSB3ZSBzdGFydGVkIGZvciBfZGlydHkgYW5kIGNvbGxpc2lvblxyXG4gICAgICAgIGxldCBuZXdOb2RlcyA9IFtdO1xyXG4gICAgICAgIC8vIGlmIHdlJ3JlIGdvaW5nIHRvIDEgY29sdW1uIGFuZCB1c2luZyBET00gb3JkZXIgcmF0aGVyIHRoYW4gZGVmYXVsdCBzb3J0aW5nLCB0aGVuIGdlbmVyYXRlIHRoYXQgbGF5b3V0XHJcbiAgICAgICAgbGV0IGRvbU9yZGVyID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKGNvbHVtbiA9PT0gMSAmJiAobm9kZXMgPT09IG51bGwgfHwgbm9kZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG5vZGVzLmxlbmd0aCkpIHtcclxuICAgICAgICAgICAgZG9tT3JkZXIgPSB0cnVlO1xyXG4gICAgICAgICAgICBsZXQgdG9wID0gMDtcclxuICAgICAgICAgICAgbm9kZXMuZm9yRWFjaChuID0+IHtcclxuICAgICAgICAgICAgICAgIG4ueCA9IDA7XHJcbiAgICAgICAgICAgICAgICBuLncgPSAxO1xyXG4gICAgICAgICAgICAgICAgbi55ID0gTWF0aC5tYXgobi55LCB0b3ApO1xyXG4gICAgICAgICAgICAgICAgdG9wID0gbi55ICsgbi5oO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgbmV3Tm9kZXMgPSBub2RlcztcclxuICAgICAgICAgICAgbm9kZXMgPSBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIG5vZGVzID0gdXRpbHNfMS5VdGlscy5zb3J0KHRoaXMubm9kZXMsIC0xLCBwcmV2Q29sdW1uKTsgLy8gY3VycmVudCBjb2x1bW4gcmV2ZXJzZSBzb3J0aW5nIHNvIHdlIGNhbiBpbnNlcnQgbGFzdCB0byBmcm9udCAobGltaXQgY29sbGlzaW9uKVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBzZWUgaWYgd2UgaGF2ZSBjYWNoZWQgcHJldmlvdXMgbGF5b3V0IElGRiB3ZSBhcmUgZ29pbmcgdXAgaW4gc2l6ZSAocmVzdG9yZSkgb3RoZXJ3aXNlIGFsd2F5c1xyXG4gICAgICAgIC8vIGdlbmVyYXRlIG5leHQgc2l6ZSBkb3duIGZyb20gd2hlcmUgd2UgYXJlIChsb29rcyBtb3JlIG5hdHVyYWwgYXMgeW91IGdyYWR1YWxseSBzaXplIGRvd24pLlxyXG4gICAgICAgIGxldCBjYWNoZU5vZGVzID0gW107XHJcbiAgICAgICAgaWYgKGNvbHVtbiA+IHByZXZDb2x1bW4pIHtcclxuICAgICAgICAgICAgY2FjaGVOb2RlcyA9IHRoaXMuX2xheW91dHNbY29sdW1uXSB8fCBbXTtcclxuICAgICAgICAgICAgLy8gLi4uaWYgbm90LCBzdGFydCB3aXRoIHRoZSBsYXJnZXN0IGxheW91dCAoaWYgbm90IGFscmVhZHkgdGhlcmUpIGFzIGRvd24tc2NhbGluZyBpcyBtb3JlIGFjY3VyYXRlXHJcbiAgICAgICAgICAgIC8vIGJ5IHByZXRlbmRpbmcgd2UgY2FtZSBmcm9tIHRoYXQgbGFyZ2VyIGNvbHVtbiBieSBhc3NpZ25pbmcgdGhvc2UgdmFsdWVzIGFzIHN0YXJ0aW5nIHBvaW50XHJcbiAgICAgICAgICAgIGxldCBsYXN0SW5kZXggPSB0aGlzLl9sYXlvdXRzLmxlbmd0aCAtIDE7XHJcbiAgICAgICAgICAgIGlmICghY2FjaGVOb2Rlcy5sZW5ndGggJiYgcHJldkNvbHVtbiAhPT0gbGFzdEluZGV4ICYmICgoX2EgPSB0aGlzLl9sYXlvdXRzW2xhc3RJbmRleF0pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5sZW5ndGgpKSB7XHJcbiAgICAgICAgICAgICAgICBwcmV2Q29sdW1uID0gbGFzdEluZGV4O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbGF5b3V0c1tsYXN0SW5kZXhdLmZvckVhY2goY2FjaGVOb2RlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgbiA9IG5vZGVzLmZpbmQobiA9PiBuLl9pZCA9PT0gY2FjaGVOb2RlLl9pZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG4pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RpbGwgY3VycmVudCwgdXNlIGNhY2hlIGluZm8gcG9zaXRpb25zXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG4ueCA9IGNhY2hlTm9kZS54O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuLnkgPSBjYWNoZU5vZGUueTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbi53ID0gY2FjaGVOb2RlLnc7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gaWYgd2UgZm91bmQgY2FjaGUgcmUtdXNlIHRob3NlIG5vZGVzIHRoYXQgYXJlIHN0aWxsIGN1cnJlbnRcclxuICAgICAgICBjYWNoZU5vZGVzLmZvckVhY2goY2FjaGVOb2RlID0+IHtcclxuICAgICAgICAgICAgbGV0IGogPSBub2Rlcy5maW5kSW5kZXgobiA9PiBuLl9pZCA9PT0gY2FjaGVOb2RlLl9pZCk7XHJcbiAgICAgICAgICAgIGlmIChqICE9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgLy8gc3RpbGwgY3VycmVudCwgdXNlIGNhY2hlIGluZm8gcG9zaXRpb25zXHJcbiAgICAgICAgICAgICAgICBpZiAoY2FjaGVOb2RlLmF1dG9Qb3NpdGlvbiB8fCBpc05hTihjYWNoZU5vZGUueCkgfHwgaXNOYU4oY2FjaGVOb2RlLnkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5kRW1wdHlQb3NpdGlvbihjYWNoZU5vZGUsIG5ld05vZGVzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICghY2FjaGVOb2RlLmF1dG9Qb3NpdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgIG5vZGVzW2pdLnggPSBjYWNoZU5vZGUueDtcclxuICAgICAgICAgICAgICAgICAgICBub2Rlc1tqXS55ID0gY2FjaGVOb2RlLnk7XHJcbiAgICAgICAgICAgICAgICAgICAgbm9kZXNbal0udyA9IGNhY2hlTm9kZS53O1xyXG4gICAgICAgICAgICAgICAgICAgIG5ld05vZGVzLnB1c2gobm9kZXNbal0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbm9kZXMuc3BsaWNlKGosIDEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgLy8gLi4uYW5kIGFkZCBhbnkgZXh0cmEgbm9uLWNhY2hlZCBvbmVzXHJcbiAgICAgICAgaWYgKG5vZGVzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIGxheW91dCA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgbGF5b3V0KGNvbHVtbiwgcHJldkNvbHVtbiwgbmV3Tm9kZXMsIG5vZGVzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICghZG9tT3JkZXIpIHtcclxuICAgICAgICAgICAgICAgIGxldCByYXRpbyA9IGNvbHVtbiAvIHByZXZDb2x1bW47XHJcbiAgICAgICAgICAgICAgICBsZXQgbW92ZSA9IChsYXlvdXQgPT09ICdtb3ZlJyB8fCBsYXlvdXQgPT09ICdtb3ZlU2NhbGUnKTtcclxuICAgICAgICAgICAgICAgIGxldCBzY2FsZSA9IChsYXlvdXQgPT09ICdzY2FsZScgfHwgbGF5b3V0ID09PSAnbW92ZVNjYWxlJyk7XHJcbiAgICAgICAgICAgICAgICBub2Rlcy5mb3JFYWNoKG5vZGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIE5PVEU6IHggKyB3IGNvdWxkIGJlIG91dHNpZGUgb2YgdGhlIGdyaWQsIGJ1dCBhZGROb2RlKCkgYmVsb3cgd2lsbCBoYW5kbGUgdGhhdFxyXG4gICAgICAgICAgICAgICAgICAgIG5vZGUueCA9IChjb2x1bW4gPT09IDEgPyAwIDogKG1vdmUgPyBNYXRoLnJvdW5kKG5vZGUueCAqIHJhdGlvKSA6IE1hdGgubWluKG5vZGUueCwgY29sdW1uIC0gMSkpKTtcclxuICAgICAgICAgICAgICAgICAgICBub2RlLncgPSAoKGNvbHVtbiA9PT0gMSB8fCBwcmV2Q29sdW1uID09PSAxKSA/IDEgOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzY2FsZSA/IChNYXRoLnJvdW5kKG5vZGUudyAqIHJhdGlvKSB8fCAxKSA6IChNYXRoLm1pbihub2RlLncsIGNvbHVtbikpKTtcclxuICAgICAgICAgICAgICAgICAgICBuZXdOb2Rlcy5wdXNoKG5vZGUpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICBub2RlcyA9IFtdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGZpbmFsbHkgcmUtbGF5b3V0IHRoZW0gaW4gcmV2ZXJzZSBvcmRlciAodG8gZ2V0IGNvcnJlY3QgcGxhY2VtZW50KVxyXG4gICAgICAgIGlmICghZG9tT3JkZXIpXHJcbiAgICAgICAgICAgIG5ld05vZGVzID0gdXRpbHNfMS5VdGlscy5zb3J0KG5ld05vZGVzLCAtMSwgY29sdW1uKTtcclxuICAgICAgICB0aGlzLl9pbkNvbHVtblJlc2l6ZSA9IHRydWU7IC8vIHByZXZlbnQgY2FjaGUgdXBkYXRlXHJcbiAgICAgICAgdGhpcy5ub2RlcyA9IFtdOyAvLyBwcmV0ZW5kIHdlIGhhdmUgbm8gbm9kZXMgdG8gc3RhcnQgd2l0aCAoYWRkKCkgd2lsbCB1c2Ugc2FtZSBzdHJ1Y3R1cmVzKSB0byBzaW1wbGlmeSBsYXlvdXRcclxuICAgICAgICBuZXdOb2Rlcy5mb3JFYWNoKG5vZGUgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmFkZE5vZGUobm9kZSwgZmFsc2UpOyAvLyAnZmFsc2UnIGZvciBhZGQgZXZlbnQgdHJpZ2dlclxyXG4gICAgICAgICAgICBkZWxldGUgbm9kZS5fb3JpZzsgLy8gbWFrZSBzdXJlIHRoZSBjb21taXQgZG9lc24ndCB0cnkgdG8gcmVzdG9yZSB0aGluZ3MgYmFjayB0byBvcmlnaW5hbFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuYmF0Y2hVcGRhdGUoZmFsc2UpO1xyXG4gICAgICAgIGRlbGV0ZSB0aGlzLl9pbkNvbHVtblJlc2l6ZTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogY2FsbCB0byBjYWNoZSB0aGUgZ2l2ZW4gbGF5b3V0IGludGVybmFsbHkgdG8gdGhlIGdpdmVuIGxvY2F0aW9uIHNvIHdlIGNhbiByZXN0b3JlIGJhY2sgd2hlbiBjb2x1bW4gY2hhbmdlcyBzaXplXHJcbiAgICAgKiBAcGFyYW0gbm9kZXMgbGlzdCBvZiBub2Rlc1xyXG4gICAgICogQHBhcmFtIGNvbHVtbiBjb3JyZXNwb25kaW5nIGNvbHVtbiBpbmRleCB0byBzYXZlIGl0IHVuZGVyXHJcbiAgICAgKiBAcGFyYW0gY2xlYXIgaWYgdHJ1ZSwgd2lsbCBmb3JjZSBvdGhlciBjYWNoZXMgdG8gYmUgcmVtb3ZlZCAoZGVmYXVsdCBmYWxzZSlcclxuICAgICAqL1xyXG4gICAgY2FjaGVMYXlvdXQobm9kZXMsIGNvbHVtbiwgY2xlYXIgPSBmYWxzZSkge1xyXG4gICAgICAgIGxldCBjb3B5ID0gW107XHJcbiAgICAgICAgbm9kZXMuZm9yRWFjaCgobiwgaSkgPT4ge1xyXG4gICAgICAgICAgICBuLl9pZCA9IG4uX2lkIHx8IEdyaWRTdGFja0VuZ2luZS5faWRTZXErKzsgLy8gbWFrZSBzdXJlIHdlIGhhdmUgYW4gaWQgaW4gY2FzZSB0aGlzIGlzIG5ldyBsYXlvdXQsIGVsc2UgcmUtdXNlIGlkIGFscmVhZHkgc2V0XHJcbiAgICAgICAgICAgIGNvcHlbaV0gPSB7IHg6IG4ueCwgeTogbi55LCB3OiBuLncsIF9pZDogbi5faWQgfTsgLy8gb25seSB0aGluZyB3ZSBjaGFuZ2UgaXMgeCx5LHcgYW5kIGlkIHRvIGZpbmQgaXQgYmFja1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuX2xheW91dHMgPSBjbGVhciA/IFtdIDogdGhpcy5fbGF5b3V0cyB8fCBbXTsgLy8gdXNlIGFycmF5IHRvIGZpbmQgbGFyZ2VyIHF1aWNrXHJcbiAgICAgICAgdGhpcy5fbGF5b3V0c1tjb2x1bW5dID0gY29weTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogY2FsbCB0byBjYWNoZSB0aGUgZ2l2ZW4gbm9kZSBsYXlvdXQgaW50ZXJuYWxseSB0byB0aGUgZ2l2ZW4gbG9jYXRpb24gc28gd2UgY2FuIHJlc3RvcmUgYmFjayB3aGVuIGNvbHVtbiBjaGFuZ2VzIHNpemVcclxuICAgICAqIEBwYXJhbSBub2RlIHNpbmdsZSBub2RlIHRvIGNhY2hlXHJcbiAgICAgKiBAcGFyYW0gY29sdW1uIGNvcnJlc3BvbmRpbmcgY29sdW1uIGluZGV4IHRvIHNhdmUgaXQgdW5kZXJcclxuICAgICAqL1xyXG4gICAgY2FjaGVPbmVMYXlvdXQobiwgY29sdW1uKSB7XHJcbiAgICAgICAgbi5faWQgPSBuLl9pZCB8fCBHcmlkU3RhY2tFbmdpbmUuX2lkU2VxKys7XHJcbiAgICAgICAgbGV0IGwgPSB7IHg6IG4ueCwgeTogbi55LCB3OiBuLncsIF9pZDogbi5faWQgfTtcclxuICAgICAgICBpZiAobi5hdXRvUG9zaXRpb24pIHtcclxuICAgICAgICAgICAgZGVsZXRlIGwueDtcclxuICAgICAgICAgICAgZGVsZXRlIGwueTtcclxuICAgICAgICAgICAgbC5hdXRvUG9zaXRpb24gPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9sYXlvdXRzID0gdGhpcy5fbGF5b3V0cyB8fCBbXTtcclxuICAgICAgICB0aGlzLl9sYXlvdXRzW2NvbHVtbl0gPSB0aGlzLl9sYXlvdXRzW2NvbHVtbl0gfHwgW107XHJcbiAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5maW5kQ2FjaGVMYXlvdXQobiwgY29sdW1uKTtcclxuICAgICAgICBpZiAoaW5kZXggPT09IC0xKVxyXG4gICAgICAgICAgICB0aGlzLl9sYXlvdXRzW2NvbHVtbl0ucHVzaChsKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRoaXMuX2xheW91dHNbY29sdW1uXVtpbmRleF0gPSBsO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gICAgZmluZENhY2hlTGF5b3V0KG4sIGNvbHVtbikge1xyXG4gICAgICAgIHZhciBfYSwgX2IsIF9jO1xyXG4gICAgICAgIHJldHVybiAoX2MgPSAoX2IgPSAoX2EgPSB0aGlzLl9sYXlvdXRzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2FbY29sdW1uXSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmZpbmRJbmRleChsID0+IGwuX2lkID09PSBuLl9pZCkpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IC0xO1xyXG4gICAgfVxyXG4gICAgLyoqIGNhbGxlZCB0byByZW1vdmUgYWxsIGludGVybmFsIHZhbHVlcyBidXQgdGhlIF9pZCAqL1xyXG4gICAgY2xlYW51cE5vZGUobm9kZSkge1xyXG4gICAgICAgIGZvciAobGV0IHByb3AgaW4gbm9kZSkge1xyXG4gICAgICAgICAgICBpZiAocHJvcFswXSA9PT0gJ18nICYmIHByb3AgIT09ICdfaWQnKVxyXG4gICAgICAgICAgICAgICAgZGVsZXRlIG5vZGVbcHJvcF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG59XHJcbmV4cG9ydHMuR3JpZFN0YWNrRW5naW5lID0gR3JpZFN0YWNrRW5naW5lO1xyXG4vKiogQGludGVybmFsIHVuaXF1ZSBnbG9iYWwgaW50ZXJuYWwgX2lkIGNvdW50ZXIgTk9UIHN0YXJ0aW5nIGF0IDAgKi9cclxuR3JpZFN0YWNrRW5naW5lLl9pZFNlcSA9IDE7XHJcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdyaWRzdGFjay1lbmdpbmUuanMubWFwIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///7\n")},3624:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval("\r\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}));\r\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\r\n for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p);\r\n};\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.GridStack = void 0;\r\n/*!\r\n * GridStack 7.3.0\r\n * https://gridstackjs.com/\r\n *\r\n * Copyright (c) 2021-2022 Alain Dumesny\r\n * see root license https://github.com/gridstack/gridstack.js/tree/master/LICENSE\r\n */\r\nconst gridstack_engine_1 = __webpack_require__(7);\r\nconst utils_1 = __webpack_require__(6480);\r\nconst types_1 = __webpack_require__(1032);\r\n/*\r\n * and include D&D by default\r\n * TODO: while we could generate a gridstack-static.js at smaller size - saves about 31k (41k -> 72k)\r\n * I don't know how to generate the DD only code at the remaining 31k to delay load as code depends on Gridstack.ts\r\n * also it caused loading issues in prod - see https://github.com/gridstack/gridstack.js/issues/2039\r\n */\r\nconst dd_gridstack_1 = __webpack_require__(6656);\r\nconst dd_touch_1 = __webpack_require__(4770);\r\nconst dd_manager_1 = __webpack_require__(7655);\r\n/** global instance */\r\nconst dd = new dd_gridstack_1.DDGridStack;\r\n// export all dependent file as well to make it easier for users to just import the main file\r\n__exportStar(__webpack_require__(1032), exports);\r\n__exportStar(__webpack_require__(6480), exports);\r\n__exportStar(__webpack_require__(7), exports);\r\n__exportStar(__webpack_require__(6656), exports);\r\n/**\r\n * Main gridstack class - you will need to call `GridStack.init()` first to initialize your grid.\r\n * Note: your grid elements MUST have the following classes for the CSS layout to work:\r\n * @example\r\n * <div class=\"grid-stack\">\r\n * <div class=\"grid-stack-item\">\r\n * <div class=\"grid-stack-item-content\">Item 1</div>\r\n * </div>\r\n * </div>\r\n */\r\nclass GridStack {\r\n /**\r\n * Construct a grid item from the given element and options\r\n * @param el\r\n * @param opts\r\n */\r\n constructor(el, opts = {}) {\r\n var _a, _b;\r\n /** @internal */\r\n this._gsEventHandler = {};\r\n /** @internal extra row added when dragging at the bottom of the grid */\r\n this._extraDragRow = 0;\r\n this.el = el; // exposed HTML element to the user\r\n opts = opts || {}; // handles null/undefined/0\r\n if (!el.classList.contains('grid-stack')) {\r\n this.el.classList.add('grid-stack');\r\n }\r\n // if row property exists, replace minRow and maxRow instead\r\n if (opts.row) {\r\n opts.minRow = opts.maxRow = opts.row;\r\n delete opts.row;\r\n }\r\n let rowAttr = utils_1.Utils.toNumber(el.getAttribute('gs-row'));\r\n // flag only valid in sub-grids (handled by parent, not here)\r\n if (opts.column === 'auto') {\r\n delete opts.column;\r\n }\r\n // 'minWidth' legacy support in 5.1\r\n /* eslint-disable-next-line @typescript-eslint/no-explicit-any */\r\n let anyOpts = opts;\r\n if (anyOpts.minWidth !== undefined) {\r\n opts.oneColumnSize = opts.oneColumnSize || anyOpts.minWidth;\r\n delete anyOpts.minWidth;\r\n }\r\n // save original setting so we can restore on save\r\n if (opts.alwaysShowResizeHandle !== undefined) {\r\n opts._alwaysShowResizeHandle = opts.alwaysShowResizeHandle;\r\n }\r\n // elements DOM attributes override any passed options (like CSS style) - merge the two together\r\n let defaults = Object.assign(Object.assign({}, utils_1.Utils.cloneDeep(types_1.gridDefaults)), { column: utils_1.Utils.toNumber(el.getAttribute('gs-column')) || types_1.gridDefaults.column, minRow: rowAttr ? rowAttr : utils_1.Utils.toNumber(el.getAttribute('gs-min-row')) || types_1.gridDefaults.minRow, maxRow: rowAttr ? rowAttr : utils_1.Utils.toNumber(el.getAttribute('gs-max-row')) || types_1.gridDefaults.maxRow, staticGrid: utils_1.Utils.toBool(el.getAttribute('gs-static')) || types_1.gridDefaults.staticGrid, draggable: {\r\n handle: (opts.handleClass ? '.' + opts.handleClass : (opts.handle ? opts.handle : '')) || types_1.gridDefaults.draggable.handle,\r\n }, removableOptions: {\r\n accept: opts.itemClass ? '.' + opts.itemClass : types_1.gridDefaults.removableOptions.accept,\r\n } });\r\n if (el.getAttribute('gs-animate')) { // default to true, but if set to false use that instead\r\n defaults.animate = utils_1.Utils.toBool(el.getAttribute('gs-animate'));\r\n }\r\n this.opts = utils_1.Utils.defaults(opts, defaults);\r\n opts = null; // make sure we use this.opts instead\r\n this._initMargin(); // part of settings defaults...\r\n // Now check if we're loading into 1 column mode FIRST so we don't do un-necessary work (like cellHeight = width / 12 then go 1 column)\r\n if (this.opts.column !== 1 && !this.opts.disableOneColumnMode && this._widthOrContainer() <= this.opts.oneColumnSize) {\r\n this._prevColumn = this.getColumn();\r\n this.opts.column = 1;\r\n }\r\n if (this.opts.rtl === 'auto') {\r\n this.opts.rtl = (el.style.direction === 'rtl');\r\n }\r\n if (this.opts.rtl) {\r\n this.el.classList.add('grid-stack-rtl');\r\n }\r\n // check if we're been nested, and if so update our style and keep pointer around (used during save)\r\n let parentGridItem = (_a = utils_1.Utils.closestUpByClass(this.el, types_1.gridDefaults.itemClass)) === null || _a === void 0 ? void 0 : _a.gridstackNode;\r\n if (parentGridItem) {\r\n parentGridItem.subGrid = this;\r\n this.parentGridItem = parentGridItem;\r\n this.el.classList.add('grid-stack-nested');\r\n parentGridItem.el.classList.add('grid-stack-sub-grid');\r\n }\r\n this._isAutoCellHeight = (this.opts.cellHeight === 'auto');\r\n if (this._isAutoCellHeight || this.opts.cellHeight === 'initial') {\r\n // make the cell content square initially (will use resize/column event to keep it square)\r\n this.cellHeight(undefined, false);\r\n }\r\n else {\r\n // append unit if any are set\r\n if (typeof this.opts.cellHeight == 'number' && this.opts.cellHeightUnit && this.opts.cellHeightUnit !== types_1.gridDefaults.cellHeightUnit) {\r\n this.opts.cellHeight = this.opts.cellHeight + this.opts.cellHeightUnit;\r\n delete this.opts.cellHeightUnit;\r\n }\r\n this.cellHeight(this.opts.cellHeight, false);\r\n }\r\n // see if we need to adjust auto-hide\r\n if (this.opts.alwaysShowResizeHandle === 'mobile') {\r\n this.opts.alwaysShowResizeHandle = dd_touch_1.isTouch;\r\n }\r\n this._styleSheetClass = 'grid-stack-instance-' + gridstack_engine_1.GridStackEngine._idSeq++;\r\n this.el.classList.add(this._styleSheetClass);\r\n this._setStaticClass();\r\n let engineClass = this.opts.engineClass || GridStack.engineClass || gridstack_engine_1.GridStackEngine;\r\n this.engine = new engineClass({\r\n column: this.getColumn(),\r\n float: this.opts.float,\r\n maxRow: this.opts.maxRow,\r\n onChange: (cbNodes) => {\r\n let maxH = 0;\r\n this.engine.nodes.forEach(n => { maxH = Math.max(maxH, n.y + n.h); });\r\n cbNodes.forEach(n => {\r\n let el = n.el;\r\n if (!el)\r\n return;\r\n if (n._removeDOM) {\r\n if (el)\r\n el.remove();\r\n delete n._removeDOM;\r\n }\r\n else {\r\n this._writePosAttr(el, n);\r\n }\r\n });\r\n this._updateStyles(false, maxH); // false = don't recreate, just append if need be\r\n }\r\n });\r\n if (this.opts.auto) {\r\n this.batchUpdate(); // prevent in between re-layout #1535 TODO: this only set float=true, need to prevent collision check...\r\n this.getGridItems().forEach(el => this._prepareElement(el));\r\n this.batchUpdate(false);\r\n }\r\n // load any passed in children as well, which overrides any DOM layout done above\r\n if (this.opts.children) {\r\n let children = this.opts.children;\r\n delete this.opts.children;\r\n if (children.length)\r\n this.load(children); // don't load empty\r\n }\r\n this.setAnimation(this.opts.animate);\r\n this._updateStyles();\r\n if (this.opts.column != 12) {\r\n this.el.classList.add('grid-stack-' + this.opts.column);\r\n }\r\n // legacy support to appear 'per grid` options when really global.\r\n if (this.opts.dragIn)\r\n GridStack.setupDragIn(this.opts.dragIn, this.opts.dragInOptions);\r\n delete this.opts.dragIn;\r\n delete this.opts.dragInOptions;\r\n // dynamic grids require pausing during drag to detect over to nest vs push\r\n if (this.opts.subGridDynamic && !dd_manager_1.DDManager.pauseDrag)\r\n dd_manager_1.DDManager.pauseDrag = true;\r\n if (((_b = this.opts.draggable) === null || _b === void 0 ? void 0 : _b.pause) !== undefined)\r\n dd_manager_1.DDManager.pauseDrag = this.opts.draggable.pause;\r\n this._setupRemoveDrop();\r\n this._setupAcceptWidget();\r\n this._updateWindowResizeEvent();\r\n }\r\n /**\r\n * initializing the HTML element, or selector string, into a grid will return the grid. Calling it again will\r\n * simply return the existing instance (ignore any passed options). There is also an initAll() version that support\r\n * multiple grids initialization at once. Or you can use addGrid() to create the entire grid from JSON.\r\n * @param options grid options (optional)\r\n * @param elOrString element or CSS selector (first one used) to convert to a grid (default to '.grid-stack' class selector)\r\n *\r\n * @example\r\n * let grid = GridStack.init();\r\n *\r\n * Note: the HTMLElement (of type GridHTMLElement) will store a `gridstack: GridStack` value that can be retrieve later\r\n * let grid = document.querySelector('.grid-stack').gridstack;\r\n */\r\n static init(options = {}, elOrString = '.grid-stack') {\r\n let el = GridStack.getGridElement(elOrString);\r\n if (!el) {\r\n if (typeof elOrString === 'string') {\r\n console.error('GridStack.initAll() no grid was found with selector \"' + elOrString + '\" - element missing or wrong selector ?' +\r\n '\\nNote: \".grid-stack\" is required for proper CSS styling and drag/drop, and is the default selector.');\r\n }\r\n else {\r\n console.error('GridStack.init() no grid element was passed.');\r\n }\r\n return null;\r\n }\r\n if (!el.gridstack) {\r\n el.gridstack = new GridStack(el, utils_1.Utils.cloneDeep(options));\r\n }\r\n return el.gridstack;\r\n }\r\n /**\r\n * Will initialize a list of elements (given a selector) and return an array of grids.\r\n * @param options grid options (optional)\r\n * @param selector elements selector to convert to grids (default to '.grid-stack' class selector)\r\n *\r\n * @example\r\n * let grids = GridStack.initAll();\r\n * grids.forEach(...)\r\n */\r\n static initAll(options = {}, selector = '.grid-stack') {\r\n let grids = [];\r\n GridStack.getGridElements(selector).forEach(el => {\r\n if (!el.gridstack) {\r\n el.gridstack = new GridStack(el, utils_1.Utils.cloneDeep(options));\r\n delete options.dragIn;\r\n delete options.dragInOptions; // only need to be done once (really a static global thing, not per grid)\r\n }\r\n grids.push(el.gridstack);\r\n });\r\n if (grids.length === 0) {\r\n console.error('GridStack.initAll() no grid was found with selector \"' + selector + '\" - element missing or wrong selector ?' +\r\n '\\nNote: \".grid-stack\" is required for proper CSS styling and drag/drop, and is the default selector.');\r\n }\r\n return grids;\r\n }\r\n /**\r\n * call to create a grid with the given options, including loading any children from JSON structure. This will call GridStack.init(), then\r\n * grid.load() on any passed children (recursively). Great alternative to calling init() if you want entire grid to come from\r\n * JSON serialized data, including options.\r\n * @param parent HTML element parent to the grid\r\n * @param opt grids options used to initialize the grid, and list of children\r\n */\r\n static addGrid(parent, opt = {}) {\r\n if (!parent)\r\n return null;\r\n // create the grid element, but check if the passed 'parent' already has grid styling and should be used instead\r\n let el = parent;\r\n const parentIsGrid = parent.classList.contains('grid-stack');\r\n if (!parentIsGrid || opt.addRemoveCB) {\r\n if (opt.addRemoveCB) {\r\n el = opt.addRemoveCB(parent, opt, true, true);\r\n }\r\n else {\r\n let doc = document.implementation.createHTMLDocument(''); // IE needs a param\r\n doc.body.innerHTML = `<div class=\"grid-stack ${opt.class || ''}\"></div>`;\r\n el = doc.body.children[0];\r\n parent.appendChild(el);\r\n }\r\n }\r\n // create grid class and load any children\r\n let grid = GridStack.init(opt, el);\r\n return grid;\r\n }\r\n /** call this method to register your engine instead of the default one.\r\n * See instead `GridStackOptions.engineClass` if you only need to\r\n * replace just one instance.\r\n */\r\n static registerEngine(engineClass) {\r\n GridStack.engineClass = engineClass;\r\n }\r\n /** @internal create placeholder DIV as needed */\r\n get placeholder() {\r\n if (!this._placeholder) {\r\n let placeholderChild = document.createElement('div'); // child so padding match item-content\r\n placeholderChild.className = 'placeholder-content';\r\n if (this.opts.placeholderText) {\r\n placeholderChild.innerHTML = this.opts.placeholderText;\r\n }\r\n this._placeholder = document.createElement('div');\r\n this._placeholder.classList.add(this.opts.placeholderClass, types_1.gridDefaults.itemClass, this.opts.itemClass);\r\n this.placeholder.appendChild(placeholderChild);\r\n }\r\n return this._placeholder;\r\n }\r\n /**\r\n * add a new widget and returns it.\r\n *\r\n * Widget will be always placed even if result height is more than actual grid height.\r\n * You need to use `willItFit()` before calling addWidget for additional check.\r\n * See also `makeWidget()`.\r\n *\r\n * @example\r\n * let grid = GridStack.init();\r\n * grid.addWidget({w: 3, content: 'hello'});\r\n * grid.addWidget('<div class=\"grid-stack-item\"><div class=\"grid-stack-item-content\">hello</div></div>', {w: 3});\r\n *\r\n * @param el GridStackWidget (which can have content string as well), html element, or string definition to add\r\n * @param options widget position/size options (optional, and ignore if first param is already option) - see GridStackWidget\r\n */\r\n addWidget(els, options) {\r\n function isGridStackWidget(w) {\r\n return w.el !== undefined || w.x !== undefined || w.y !== undefined || w.w !== undefined || w.h !== undefined || w.content !== undefined ? true : false;\r\n }\r\n let el;\r\n let node;\r\n if (typeof els === 'string') {\r\n let doc = document.implementation.createHTMLDocument(''); // IE needs a param\r\n doc.body.innerHTML = els;\r\n el = doc.body.children[0];\r\n }\r\n else if (arguments.length === 0 || arguments.length === 1 && isGridStackWidget(els)) {\r\n node = options = els;\r\n if (node === null || node === void 0 ? void 0 : node.el) {\r\n el = node.el; // re-use element stored in the node\r\n }\r\n else if (this.opts.addRemoveCB) {\r\n el = this.opts.addRemoveCB(this.el, options, true, false);\r\n }\r\n else {\r\n let content = (options === null || options === void 0 ? void 0 : options.content) || '';\r\n let doc = document.implementation.createHTMLDocument(''); // IE needs a param\r\n doc.body.innerHTML = `<div class=\"grid-stack-item ${this.opts.itemClass || ''}\"><div class=\"grid-stack-item-content\">${content}</div></div>`;\r\n el = doc.body.children[0];\r\n }\r\n }\r\n else {\r\n el = els;\r\n }\r\n if (!el)\r\n return;\r\n // Tempting to initialize the passed in opt with default and valid values, but this break knockout demos\r\n // as the actual value are filled in when _prepareElement() calls el.getAttribute('gs-xyz') before adding the node.\r\n // So make sure we load any DOM attributes that are not specified in passed in options (which override)\r\n let domAttr = this._readAttr(el);\r\n options = utils_1.Utils.cloneDeep(options) || {}; // make a copy before we modify in case caller re-uses it\r\n utils_1.Utils.defaults(options, domAttr);\r\n node = this.engine.prepareNode(options);\r\n this._writeAttr(el, options);\r\n if (this._insertNotAppend) {\r\n this.el.prepend(el);\r\n }\r\n else {\r\n this.el.appendChild(el);\r\n }\r\n // similar to makeWidget() that doesn't read attr again and worse re-create a new node and loose any _id\r\n this._prepareElement(el, true, options);\r\n this._updateContainerHeight();\r\n // see if there is a sub-grid to create\r\n if (node.subGrid) {\r\n this.makeSubGrid(node.el, undefined, undefined, false); //node.subGrid will be used as option in method, no need to pass\r\n }\r\n // if we're adding an item into 1 column (_prevColumn is set only when going to 1) make sure\r\n // we don't override the larger 12 column layout that was already saved. #1985\r\n if (this._prevColumn && this.opts.column === 1) {\r\n this._ignoreLayoutsNodeChange = true;\r\n }\r\n this._triggerAddEvent();\r\n this._triggerChangeEvent();\r\n delete this._ignoreLayoutsNodeChange;\r\n return el;\r\n }\r\n /**\r\n * Convert an existing gridItem element into a sub-grid with the given (optional) options, else inherit them\r\n * from the parent's subGrid options.\r\n * @param el gridItem element to convert\r\n * @param ops (optional) sub-grid options, else default to node, then parent settings, else defaults\r\n * @param nodeToAdd (optional) node to add to the newly created sub grid (used when dragging over existing regular item)\r\n * @returns newly created grid\r\n */\r\n makeSubGrid(el, ops, nodeToAdd, saveContent = true) {\r\n var _a, _b, _c;\r\n let node = el.gridstackNode;\r\n if (!node) {\r\n node = this.makeWidget(el).gridstackNode;\r\n }\r\n if ((_a = node.subGrid) === null || _a === void 0 ? void 0 : _a.el)\r\n return node.subGrid; // already done\r\n // find the template subGrid stored on a parent as fallback...\r\n let subGridTemplate; // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n let grid = this;\r\n while (grid && !subGridTemplate) {\r\n subGridTemplate = (_b = grid.opts) === null || _b === void 0 ? void 0 : _b.subGrid;\r\n grid = (_c = grid.parentGridItem) === null || _c === void 0 ? void 0 : _c.grid;\r\n }\r\n //... and set the create options\r\n ops = utils_1.Utils.cloneDeep(Object.assign(Object.assign(Object.assign({}, (subGridTemplate || {})), { children: undefined }), (ops || node.subGrid)));\r\n node.subGrid = ops;\r\n // if column special case it set, remember that flag and set default\r\n let autoColumn;\r\n if (ops.column === 'auto') {\r\n autoColumn = true;\r\n ops.column = Math.max(node.w || 1, (nodeToAdd === null || nodeToAdd === void 0 ? void 0 : nodeToAdd.w) || 1);\r\n ops.disableOneColumnMode = true; // driven by parent\r\n }\r\n // if we're converting an existing full item, move over the content to be the first sub item in the new grid\r\n let content = node.el.querySelector('.grid-stack-item-content');\r\n let newItem;\r\n let newItemOpt;\r\n if (saveContent) {\r\n this._removeDD(node.el); // remove D&D since it's set on content div\r\n newItemOpt = Object.assign(Object.assign({}, node), { x: 0, y: 0 });\r\n utils_1.Utils.removeInternalForSave(newItemOpt);\r\n delete newItemOpt.subGrid;\r\n if (node.content) {\r\n newItemOpt.content = node.content;\r\n delete node.content;\r\n }\r\n if (this.opts.addRemoveCB) {\r\n newItem = this.opts.addRemoveCB(this.el, newItemOpt, true, false);\r\n }\r\n else {\r\n let doc = document.implementation.createHTMLDocument(''); // IE needs a param\r\n doc.body.innerHTML = `<div class=\"grid-stack-item\"></div>`;\r\n newItem = doc.body.children[0];\r\n newItem.appendChild(content);\r\n doc.body.innerHTML = `<div class=\"grid-stack-item-content\"></div>`;\r\n content = doc.body.children[0];\r\n node.el.appendChild(content);\r\n }\r\n this._prepareDragDropByNode(node); // ... and restore original D&D\r\n }\r\n // if we're adding an additional item, make the container large enough to have them both\r\n if (nodeToAdd) {\r\n let w = autoColumn ? ops.column : node.w;\r\n let h = node.h + nodeToAdd.h;\r\n let style = node.el.style;\r\n style.transition = 'none'; // show up instantly so we don't see scrollbar with nodeToAdd\r\n this.update(node.el, { w, h });\r\n setTimeout(() => style.transition = null); // recover animation\r\n }\r\n if (this.opts.addRemoveCB) {\r\n ops.addRemoveCB = ops.addRemoveCB || this.opts.addRemoveCB;\r\n }\r\n let subGrid = node.subGrid = GridStack.addGrid(content, ops);\r\n if (nodeToAdd === null || nodeToAdd === void 0 ? void 0 : nodeToAdd._moving)\r\n subGrid._isTemp = true; // prevent re-nesting as we add over\r\n if (autoColumn)\r\n subGrid._autoColumn = true;\r\n // add the original content back as a child of hte newly created grid\r\n if (saveContent) {\r\n subGrid.addWidget(newItem, newItemOpt);\r\n }\r\n // now add any additional node\r\n if (nodeToAdd) {\r\n if (nodeToAdd._moving) {\r\n // create an artificial event even for the just created grid to receive this item\r\n window.setTimeout(() => utils_1.Utils.simulateMouseEvent(nodeToAdd._event, 'mouseenter', subGrid.el), 0);\r\n }\r\n else {\r\n subGrid.addWidget(node.el, node);\r\n }\r\n }\r\n return subGrid;\r\n }\r\n /**\r\n * called when an item was converted into a nested grid to accommodate a dragged over item, but then item leaves - return back\r\n * to the original grid-item. Also called to remove empty sub-grids when last item is dragged out (since re-creating is simple)\r\n */\r\n removeAsSubGrid(nodeThatRemoved) {\r\n var _a;\r\n let pGrid = (_a = this.parentGridItem) === null || _a === void 0 ? void 0 : _a.grid;\r\n if (!pGrid)\r\n return;\r\n pGrid.batchUpdate();\r\n pGrid.removeWidget(this.parentGridItem.el, true, true);\r\n this.engine.nodes.forEach(n => {\r\n // migrate any children over and offsetting by our location\r\n n.x += this.parentGridItem.x;\r\n n.y += this.parentGridItem.y;\r\n pGrid.addWidget(n.el, n);\r\n });\r\n pGrid.batchUpdate(false);\r\n if (this.parentGridItem)\r\n delete this.parentGridItem.subGrid;\r\n delete this.parentGridItem;\r\n // create an artificial event for the original grid now that this one is gone (got a leave, but won't get enter)\r\n if (nodeThatRemoved) {\r\n window.setTimeout(() => utils_1.Utils.simulateMouseEvent(nodeThatRemoved._event, 'mouseenter', pGrid.el), 0);\r\n }\r\n }\r\n /**\r\n /**\r\n * saves the current layout returning a list of widgets for serialization which might include any nested grids.\r\n * @param saveContent if true (default) the latest html inside .grid-stack-content will be saved to GridStackWidget.content field, else it will\r\n * be removed.\r\n * @param saveGridOpt if true (default false), save the grid options itself, so you can call the new GridStack.addGrid()\r\n * to recreate everything from scratch. GridStackOptions.children would then contain the widget list instead.\r\n * @returns list of widgets or full grid option, including .children list of widgets\r\n */\r\n save(saveContent = true, saveGridOpt = false) {\r\n // return copied nodes we can modify at will...\r\n let list = this.engine.save(saveContent);\r\n // check for HTML content and nested grids\r\n list.forEach(n => {\r\n var _a;\r\n if (saveContent && n.el && !n.subGrid) { // sub-grid are saved differently, not plain content\r\n let sub = n.el.querySelector('.grid-stack-item-content');\r\n n.content = sub ? sub.innerHTML : undefined;\r\n if (!n.content)\r\n delete n.content;\r\n }\r\n else {\r\n if (!saveContent) {\r\n delete n.content;\r\n }\r\n // check for nested grid\r\n if ((_a = n.subGrid) === null || _a === void 0 ? void 0 : _a.el) {\r\n const listOrOpt = n.subGrid.save(saveContent, saveGridOpt);\r\n n.subGrid = (saveGridOpt ? listOrOpt : { children: listOrOpt });\r\n }\r\n }\r\n delete n.el;\r\n });\r\n // check if save entire grid options (needed for recursive) + children...\r\n if (saveGridOpt) {\r\n let o = utils_1.Utils.cloneDeep(this.opts);\r\n // delete default values that will be recreated on launch\r\n if (o.marginBottom === o.marginTop && o.marginRight === o.marginLeft && o.marginTop === o.marginRight) {\r\n o.margin = o.marginTop;\r\n delete o.marginTop;\r\n delete o.marginRight;\r\n delete o.marginBottom;\r\n delete o.marginLeft;\r\n }\r\n if (o.rtl === (this.el.style.direction === 'rtl')) {\r\n o.rtl = 'auto';\r\n }\r\n if (this._isAutoCellHeight) {\r\n o.cellHeight = 'auto';\r\n }\r\n if (this._autoColumn) {\r\n o.column = 'auto';\r\n delete o.disableOneColumnMode;\r\n }\r\n const origShow = o._alwaysShowResizeHandle;\r\n delete o._alwaysShowResizeHandle;\r\n if (origShow !== undefined) {\r\n o.alwaysShowResizeHandle = origShow;\r\n }\r\n else {\r\n delete o.alwaysShowResizeHandle;\r\n }\r\n utils_1.Utils.removeInternalAndSame(o, types_1.gridDefaults);\r\n o.children = list;\r\n return o;\r\n }\r\n return list;\r\n }\r\n /**\r\n * load the widgets from a list. This will call update() on each (matching by id) or add/remove widgets that are not there.\r\n *\r\n * @param layout list of widgets definition to update/create\r\n * @param addAndRemove boolean (default true) or callback method can be passed to control if and how missing widgets can be added/removed, giving\r\n * the user control of insertion.\r\n *\r\n * @example\r\n * see http://gridstackjs.com/demo/serialization.html\r\n **/\r\n load(layout, addRemove = this.opts.addRemoveCB || true) {\r\n let items = GridStack.Utils.sort([...layout], -1, this._prevColumn || this.getColumn()); // make copy before we mod/sort\r\n this._insertNotAppend = true; // since create in reverse order...\r\n // if we're loading a layout into for example 1 column (_prevColumn is set only when going to 1) and items don't fit, make sure to save\r\n // the original wanted layout so we can scale back up correctly #1471\r\n if (this._prevColumn && this._prevColumn !== this.opts.column && items.some(n => (n.x + n.w) > this.opts.column)) {\r\n this._ignoreLayoutsNodeChange = true; // skip layout update\r\n this.engine.cacheLayout(items, this._prevColumn, true);\r\n }\r\n // if given a different callback, temporally set it as global option to creating will use it\r\n const prevCB = this.opts.addRemoveCB;\r\n if (typeof (addRemove) === 'function')\r\n this.opts.addRemoveCB = addRemove;\r\n let removed = [];\r\n this.batchUpdate();\r\n // see if any items are missing from new layout and need to be removed first\r\n if (addRemove) {\r\n let copyNodes = [...this.engine.nodes]; // don't loop through array you modify\r\n copyNodes.forEach(n => {\r\n let item = items.find(w => n.id === w.id);\r\n if (!item) {\r\n if (this.opts.addRemoveCB)\r\n this.opts.addRemoveCB(this.el, n, false, false);\r\n removed.push(n); // batch keep track\r\n this.removeWidget(n.el, true, false);\r\n }\r\n });\r\n }\r\n // now add/update the widgets\r\n items.forEach(w => {\r\n let item = (w.id || w.id === 0) ? this.engine.nodes.find(n => n.id === w.id) : undefined;\r\n if (item) {\r\n this.update(item.el, w);\r\n if (w.subGrid && w.subGrid.children) { // update any sub grid as well\r\n let sub = item.el.querySelector('.grid-stack');\r\n if (sub && sub.gridstack) {\r\n sub.gridstack.load(w.subGrid.children); // TODO: support updating grid options ?\r\n this._insertNotAppend = true; // got reset by above call\r\n }\r\n }\r\n }\r\n else if (addRemove) {\r\n this.addWidget(w);\r\n }\r\n });\r\n this.engine.removedNodes = removed;\r\n this.batchUpdate(false);\r\n // after commit, clear that flag\r\n delete this._ignoreLayoutsNodeChange;\r\n delete this._insertNotAppend;\r\n prevCB ? this.opts.addRemoveCB = prevCB : delete this.opts.addRemoveCB;\r\n return this;\r\n }\r\n /**\r\n * use before calling a bunch of `addWidget()` to prevent un-necessary relayouts in between (more efficient)\r\n * and get a single event callback. You will see no changes until `batchUpdate(false)` is called.\r\n */\r\n batchUpdate(flag = true) {\r\n this.engine.batchUpdate(flag);\r\n if (!flag) {\r\n this._triggerRemoveEvent();\r\n this._triggerAddEvent();\r\n this._triggerChangeEvent();\r\n }\r\n return this;\r\n }\r\n /**\r\n * Gets current cell height.\r\n */\r\n getCellHeight(forcePixel = false) {\r\n if (this.opts.cellHeight && this.opts.cellHeight !== 'auto' &&\r\n (!forcePixel || !this.opts.cellHeightUnit || this.opts.cellHeightUnit === 'px')) {\r\n return this.opts.cellHeight;\r\n }\r\n // else get first cell height\r\n let el = this.el.querySelector('.' + this.opts.itemClass);\r\n if (el) {\r\n let height = utils_1.Utils.toNumber(el.getAttribute('gs-h'));\r\n return Math.round(el.offsetHeight / height);\r\n }\r\n // else do entire grid and # of rows (but doesn't work if min-height is the actual constrain)\r\n let rows = parseInt(this.el.getAttribute('gs-current-row'));\r\n return rows ? Math.round(this.el.getBoundingClientRect().height / rows) : this.opts.cellHeight;\r\n }\r\n /**\r\n * Update current cell height - see `GridStackOptions.cellHeight` for format.\r\n * This method rebuilds an internal CSS style sheet.\r\n * Note: You can expect performance issues if call this method too often.\r\n *\r\n * @param val the cell height. If not passed (undefined), cells content will be made square (match width minus margin),\r\n * if pass 0 the CSS will be generated by the application instead.\r\n * @param update (Optional) if false, styles will not be updated\r\n *\r\n * @example\r\n * grid.cellHeight(100); // same as 100px\r\n * grid.cellHeight('70px');\r\n * grid.cellHeight(grid.cellWidth() * 1.2);\r\n */\r\n cellHeight(val, update = true) {\r\n // if not called internally, check if we're changing mode\r\n if (update && val !== undefined) {\r\n if (this._isAutoCellHeight !== (val === 'auto')) {\r\n this._isAutoCellHeight = (val === 'auto');\r\n this._updateWindowResizeEvent();\r\n }\r\n }\r\n if (val === 'initial' || val === 'auto') {\r\n val = undefined;\r\n }\r\n // make item content be square\r\n if (val === undefined) {\r\n let marginDiff = -this.opts.marginRight - this.opts.marginLeft\r\n + this.opts.marginTop + this.opts.marginBottom;\r\n val = this.cellWidth() + marginDiff;\r\n }\r\n let data = utils_1.Utils.parseHeight(val);\r\n if (this.opts.cellHeightUnit === data.unit && this.opts.cellHeight === data.h) {\r\n return this;\r\n }\r\n this.opts.cellHeightUnit = data.unit;\r\n this.opts.cellHeight = data.h;\r\n if (update) {\r\n this._updateStyles(true); // true = force re-create for current # of rows\r\n }\r\n return this;\r\n }\r\n /** Gets current cell width. */\r\n cellWidth() {\r\n return this._widthOrContainer() / this.getColumn();\r\n }\r\n /** return our expected width (or parent) for 1 column check */\r\n _widthOrContainer() {\r\n // use `offsetWidth` or `clientWidth` (no scrollbar) ?\r\n // https://stackoverflow.com/questions/21064101/understanding-offsetwidth-clientwidth-scrollwidth-and-height-respectively\r\n return (this.el.clientWidth || this.el.parentElement.clientWidth || window.innerWidth);\r\n }\r\n /** re-layout grid items to reclaim any empty space */\r\n compact() {\r\n this.engine.compact();\r\n this._triggerChangeEvent();\r\n return this;\r\n }\r\n /**\r\n * set the number of columns in the grid. Will update existing widgets to conform to new number of columns,\r\n * as well as cache the original layout so you can revert back to previous positions without loss.\r\n * Requires `gridstack-extra.css` or `gridstack-extra.min.css` for [2-11],\r\n * else you will need to generate correct CSS (see https://github.com/gridstack/gridstack.js#change-grid-columns)\r\n * @param column - Integer > 0 (default 12).\r\n * @param layout specify the type of re-layout that will happen (position, size, etc...).\r\n * Note: items will never be outside of the current column boundaries. default (moveScale). Ignored for 1 column\r\n */\r\n column(column, layout = 'moveScale') {\r\n if (column < 1 || this.opts.column === column)\r\n return this;\r\n let oldColumn = this.getColumn();\r\n // if we go into 1 column mode (which happens if we're sized less than minW unless disableOneColumnMode is on)\r\n // then remember the original columns so we can restore.\r\n if (column === 1) {\r\n this._prevColumn = oldColumn;\r\n }\r\n else {\r\n delete this._prevColumn;\r\n }\r\n this.el.classList.remove('grid-stack-' + oldColumn);\r\n this.el.classList.add('grid-stack-' + column);\r\n this.opts.column = this.engine.column = column;\r\n // update the items now - see if the dom order nodes should be passed instead (else default to current list)\r\n let domNodes;\r\n if (column === 1 && this.opts.oneColumnModeDomSort) {\r\n domNodes = [];\r\n this.getGridItems().forEach(el => {\r\n if (el.gridstackNode) {\r\n domNodes.push(el.gridstackNode);\r\n }\r\n });\r\n if (!domNodes.length) {\r\n domNodes = undefined;\r\n }\r\n }\r\n this.engine.updateNodeWidths(oldColumn, column, domNodes, layout);\r\n if (this._isAutoCellHeight)\r\n this.cellHeight();\r\n // and trigger our event last...\r\n this._ignoreLayoutsNodeChange = true; // skip layout update\r\n this._triggerChangeEvent();\r\n delete this._ignoreLayoutsNodeChange;\r\n return this;\r\n }\r\n /**\r\n * get the number of columns in the grid (default 12)\r\n */\r\n getColumn() {\r\n return this.opts.column;\r\n }\r\n /** returns an array of grid HTML elements (no placeholder) - used to iterate through our children in DOM order */\r\n getGridItems() {\r\n return Array.from(this.el.children)\r\n .filter((el) => el.matches('.' + this.opts.itemClass) && !el.matches('.' + this.opts.placeholderClass));\r\n }\r\n /**\r\n * Destroys a grid instance. DO NOT CALL any methods or access any vars after this as it will free up members.\r\n * @param removeDOM if `false` grid and items HTML elements will not be removed from the DOM (Optional. Default `true`).\r\n */\r\n destroy(removeDOM = true) {\r\n if (!this.el)\r\n return; // prevent multiple calls\r\n this._updateWindowResizeEvent(true);\r\n this.setStatic(true, false); // permanently removes DD but don't set CSS class (we're going away)\r\n this.setAnimation(false);\r\n if (!removeDOM) {\r\n this.removeAll(removeDOM);\r\n this.el.classList.remove(this._styleSheetClass);\r\n }\r\n else {\r\n this.el.parentNode.removeChild(this.el);\r\n }\r\n this._removeStylesheet();\r\n this.el.removeAttribute('gs-current-row');\r\n if (this.parentGridItem)\r\n delete this.parentGridItem.subGrid;\r\n delete this.parentGridItem;\r\n delete this.opts;\r\n delete this._placeholder;\r\n delete this.engine;\r\n delete this.el.gridstack; // remove circular dependency that would prevent a freeing\r\n delete this.el;\r\n return this;\r\n }\r\n /**\r\n * enable/disable floating widgets (default: `false`) See [example](http://gridstackjs.com/demo/float.html)\r\n */\r\n float(val) {\r\n if (this.opts.float !== val) {\r\n this.opts.float = this.engine.float = val;\r\n this._triggerChangeEvent();\r\n }\r\n return this;\r\n }\r\n /**\r\n * get the current float mode\r\n */\r\n getFloat() {\r\n return this.engine.float;\r\n }\r\n /**\r\n * Get the position of the cell under a pixel on screen.\r\n * @param position the position of the pixel to resolve in\r\n * absolute coordinates, as an object with top and left properties\r\n * @param useDocRelative if true, value will be based on document position vs parent position (Optional. Default false).\r\n * Useful when grid is within `position: relative` element\r\n *\r\n * Returns an object with properties `x` and `y` i.e. the column and row in the grid.\r\n */\r\n getCellFromPixel(position, useDocRelative = false) {\r\n let box = this.el.getBoundingClientRect();\r\n // console.log(`getBoundingClientRect left: ${box.left} top: ${box.top} w: ${box.w} h: ${box.h}`)\r\n let containerPos;\r\n if (useDocRelative) {\r\n containerPos = { top: box.top + document.documentElement.scrollTop, left: box.left };\r\n // console.log(`getCellFromPixel scrollTop: ${document.documentElement.scrollTop}`)\r\n }\r\n else {\r\n containerPos = { top: this.el.offsetTop, left: this.el.offsetLeft };\r\n // console.log(`getCellFromPixel offsetTop: ${containerPos.left} offsetLeft: ${containerPos.top}`)\r\n }\r\n let relativeLeft = position.left - containerPos.left;\r\n let relativeTop = position.top - containerPos.top;\r\n let columnWidth = (box.width / this.getColumn());\r\n let rowHeight = (box.height / parseInt(this.el.getAttribute('gs-current-row')));\r\n return { x: Math.floor(relativeLeft / columnWidth), y: Math.floor(relativeTop / rowHeight) };\r\n }\r\n /** returns the current number of rows, which will be at least `minRow` if set */\r\n getRow() {\r\n return Math.max(this.engine.getRow(), this.opts.minRow);\r\n }\r\n /**\r\n * Checks if specified area is empty.\r\n * @param x the position x.\r\n * @param y the position y.\r\n * @param w the width of to check\r\n * @param h the height of to check\r\n */\r\n isAreaEmpty(x, y, w, h) {\r\n return this.engine.isAreaEmpty(x, y, w, h);\r\n }\r\n /**\r\n * If you add elements to your grid by hand, you have to tell gridstack afterwards to make them widgets.\r\n * If you want gridstack to add the elements for you, use `addWidget()` instead.\r\n * Makes the given element a widget and returns it.\r\n * @param els widget or single selector to convert.\r\n *\r\n * @example\r\n * let grid = GridStack.init();\r\n * grid.el.appendChild('<div id=\"gsi-1\" gs-w=\"3\"></div>');\r\n * grid.makeWidget('#gsi-1');\r\n */\r\n makeWidget(els) {\r\n let el = GridStack.getElement(els);\r\n this._prepareElement(el, true);\r\n this._updateContainerHeight();\r\n this._triggerAddEvent();\r\n this._triggerChangeEvent();\r\n return el;\r\n }\r\n /**\r\n * Event handler that extracts our CustomEvent data out automatically for receiving custom\r\n * notifications (see doc for supported events)\r\n * @param name of the event (see possible values) or list of names space separated\r\n * @param callback function called with event and optional second/third param\r\n * (see README documentation for each signature).\r\n *\r\n * @example\r\n * grid.on('added', function(e, items) { log('added ', items)} );\r\n * or\r\n * grid.on('added removed change', function(e, items) { log(e.type, items)} );\r\n *\r\n * Note: in some cases it is the same as calling native handler and parsing the event.\r\n * grid.el.addEventListener('added', function(event) { log('added ', event.detail)} );\r\n *\r\n */\r\n on(name, callback) {\r\n // check for array of names being passed instead\r\n if (name.indexOf(' ') !== -1) {\r\n let names = name.split(' ');\r\n names.forEach(name => this.on(name, callback));\r\n return this;\r\n }\r\n if (name === 'change' || name === 'added' || name === 'removed' || name === 'enable' || name === 'disable') {\r\n // native CustomEvent handlers - cash the generic handlers so we can easily remove\r\n let noData = (name === 'enable' || name === 'disable');\r\n if (noData) {\r\n this._gsEventHandler[name] = (event) => callback(event);\r\n }\r\n else {\r\n this._gsEventHandler[name] = (event) => callback(event, event.detail);\r\n }\r\n this.el.addEventListener(name, this._gsEventHandler[name]);\r\n }\r\n else if (name === 'drag' || name === 'dragstart' || name === 'dragstop' || name === 'resizestart' || name === 'resize' || name === 'resizestop' || name === 'dropped') {\r\n // drag&drop stop events NEED to be call them AFTER we update node attributes so handle them ourself.\r\n // do same for start event to make it easier...\r\n this._gsEventHandler[name] = callback;\r\n }\r\n else {\r\n console.log('GridStack.on(' + name + ') event not supported, but you can still use $(\".grid-stack\").on(...) while jquery-ui is still used internally.');\r\n }\r\n return this;\r\n }\r\n /**\r\n * unsubscribe from the 'on' event below\r\n * @param name of the event (see possible values)\r\n */\r\n off(name) {\r\n // check for array of names being passed instead\r\n if (name.indexOf(' ') !== -1) {\r\n let names = name.split(' ');\r\n names.forEach(name => this.off(name));\r\n return this;\r\n }\r\n if (name === 'change' || name === 'added' || name === 'removed' || name === 'enable' || name === 'disable') {\r\n // remove native CustomEvent handlers\r\n if (this._gsEventHandler[name]) {\r\n this.el.removeEventListener(name, this._gsEventHandler[name]);\r\n }\r\n }\r\n delete this._gsEventHandler[name];\r\n return this;\r\n }\r\n /**\r\n * Removes widget from the grid.\r\n * @param el widget or selector to modify\r\n * @param removeDOM if `false` DOM element won't be removed from the tree (Default? true).\r\n * @param triggerEvent if `false` (quiet mode) element will not be added to removed list and no 'removed' callbacks will be called (Default? true).\r\n */\r\n removeWidget(els, removeDOM = true, triggerEvent = true) {\r\n GridStack.getElements(els).forEach(el => {\r\n if (el.parentElement && el.parentElement !== this.el)\r\n return; // not our child!\r\n let node = el.gridstackNode;\r\n // For Meteor support: https://github.com/gridstack/gridstack.js/pull/272\r\n if (!node) {\r\n node = this.engine.nodes.find(n => el === n.el);\r\n }\r\n if (!node)\r\n return;\r\n // remove our DOM data (circular link) and drag&drop permanently\r\n delete el.gridstackNode;\r\n this._removeDD(el);\r\n this.engine.removeNode(node, removeDOM, triggerEvent);\r\n if (removeDOM && el.parentElement) {\r\n el.remove(); // in batch mode engine.removeNode doesn't call back to remove DOM\r\n }\r\n });\r\n if (triggerEvent) {\r\n this._triggerRemoveEvent();\r\n this._triggerChangeEvent();\r\n }\r\n return this;\r\n }\r\n /**\r\n * Removes all widgets from the grid.\r\n * @param removeDOM if `false` DOM elements won't be removed from the tree (Default? `true`).\r\n */\r\n removeAll(removeDOM = true) {\r\n // always remove our DOM data (circular link) before list gets emptied and drag&drop permanently\r\n this.engine.nodes.forEach(n => {\r\n delete n.el.gridstackNode;\r\n this._removeDD(n.el);\r\n });\r\n this.engine.removeAll(removeDOM);\r\n this._triggerRemoveEvent();\r\n return this;\r\n }\r\n /**\r\n * Toggle the grid animation state. Toggles the `grid-stack-animate` class.\r\n * @param doAnimate if true the grid will animate.\r\n */\r\n setAnimation(doAnimate) {\r\n if (doAnimate) {\r\n this.el.classList.add('grid-stack-animate');\r\n }\r\n else {\r\n this.el.classList.remove('grid-stack-animate');\r\n }\r\n return this;\r\n }\r\n /**\r\n * Toggle the grid static state, which permanently removes/add Drag&Drop support, unlike disable()/enable() that just turns it off/on.\r\n * Also toggle the grid-stack-static class.\r\n * @param val if true the grid become static.\r\n * @param updateClass true (default) if css class gets updated\r\n * @param recurse true (default) if sub-grids also get updated\r\n */\r\n setStatic(val, updateClass = true, recurse = true) {\r\n if (this.opts.staticGrid === val)\r\n return this;\r\n this.opts.staticGrid = val;\r\n this._setupRemoveDrop();\r\n this._setupAcceptWidget();\r\n this.engine.nodes.forEach(n => {\r\n this._prepareDragDropByNode(n); // either delete or init Drag&drop\r\n if (n.subGrid && recurse)\r\n n.subGrid.setStatic(val, updateClass, recurse);\r\n });\r\n if (updateClass) {\r\n this._setStaticClass();\r\n }\r\n return this;\r\n }\r\n /**\r\n * Updates widget position/size and other info. Note: if you need to call this on all nodes, use load() instead which will update what changed.\r\n * @param els widget or selector of objects to modify (note: setting the same x,y for multiple items will be indeterministic and likely unwanted)\r\n * @param opt new widget options (x,y,w,h, etc..). Only those set will be updated.\r\n */\r\n update(els, opt) {\r\n // support legacy call for now ?\r\n if (arguments.length > 2) {\r\n console.warn('gridstack.ts: `update(el, x, y, w, h)` is deprecated. Use `update(el, {x, w, content, ...})`. It will be removed soon');\r\n // eslint-disable-next-line prefer-rest-params\r\n let a = arguments, i = 1;\r\n opt = { x: a[i++], y: a[i++], w: a[i++], h: a[i++] };\r\n return this.update(els, opt);\r\n }\r\n GridStack.getElements(els).forEach(el => {\r\n if (!el || !el.gridstackNode)\r\n return;\r\n let n = el.gridstackNode;\r\n let w = utils_1.Utils.cloneDeep(opt); // make a copy we can modify in case they re-use it or multiple items\r\n delete w.autoPosition;\r\n // move/resize widget if anything changed\r\n let keys = ['x', 'y', 'w', 'h'];\r\n let m;\r\n if (keys.some(k => w[k] !== undefined && w[k] !== n[k])) {\r\n m = {};\r\n keys.forEach(k => {\r\n m[k] = (w[k] !== undefined) ? w[k] : n[k];\r\n delete w[k];\r\n });\r\n }\r\n // for a move as well IFF there is any min/max fields set\r\n if (!m && (w.minW || w.minH || w.maxW || w.maxH)) {\r\n m = {}; // will use node position but validate values\r\n }\r\n // check for content changing\r\n if (w.content) {\r\n let sub = el.querySelector('.grid-stack-item-content');\r\n if (sub && sub.innerHTML !== w.content) {\r\n sub.innerHTML = w.content;\r\n }\r\n delete w.content;\r\n }\r\n // any remaining fields are assigned, but check for dragging changes, resize constrain\r\n let changed = false;\r\n let ddChanged = false;\r\n for (const key in w) {\r\n if (key[0] !== '_' && n[key] !== w[key]) {\r\n n[key] = w[key];\r\n changed = true;\r\n ddChanged = ddChanged || (!this.opts.staticGrid && (key === 'noResize' || key === 'noMove' || key === 'locked'));\r\n }\r\n }\r\n // finally move the widget\r\n if (m) {\r\n this.engine.cleanNodes()\r\n .beginUpdate(n)\r\n .moveNode(n, m);\r\n this._updateContainerHeight();\r\n this._triggerChangeEvent();\r\n this.engine.endUpdate();\r\n }\r\n if (changed) { // move will only update x,y,w,h so update the rest too\r\n this._writeAttr(el, n);\r\n }\r\n if (ddChanged) {\r\n this._prepareDragDropByNode(n);\r\n }\r\n });\r\n return this;\r\n }\r\n /**\r\n * Updates the margins which will set all 4 sides at once - see `GridStackOptions.margin` for format options (CSS string format of 1,2,4 values or single number).\r\n * @param value margin value\r\n */\r\n margin(value) {\r\n let isMultiValue = (typeof value === 'string' && value.split(' ').length > 1);\r\n // check if we can skip re-creating our CSS file... won't check if multi values (too much hassle)\r\n if (!isMultiValue) {\r\n let data = utils_1.Utils.parseHeight(value);\r\n if (this.opts.marginUnit === data.unit && this.opts.margin === data.h)\r\n return;\r\n }\r\n // re-use existing margin handling\r\n this.opts.margin = value;\r\n this.opts.marginTop = this.opts.marginBottom = this.opts.marginLeft = this.opts.marginRight = undefined;\r\n this._initMargin();\r\n this._updateStyles(true); // true = force re-create\r\n return this;\r\n }\r\n /** returns current margin number value (undefined if 4 sides don't match) */\r\n getMargin() { return this.opts.margin; }\r\n /**\r\n * Returns true if the height of the grid will be less than the vertical\r\n * constraint. Always returns true if grid doesn't have height constraint.\r\n * @param node contains x,y,w,h,auto-position options\r\n *\r\n * @example\r\n * if (grid.willItFit(newWidget)) {\r\n * grid.addWidget(newWidget);\r\n * } else {\r\n * alert('Not enough free space to place the widget');\r\n * }\r\n */\r\n willItFit(node) {\r\n // support legacy call for now\r\n if (arguments.length > 1) {\r\n console.warn('gridstack.ts: `willItFit(x,y,w,h,autoPosition)` is deprecated. Use `willItFit({x, y,...})`. It will be removed soon');\r\n // eslint-disable-next-line prefer-rest-params\r\n let a = arguments, i = 0, w = { x: a[i++], y: a[i++], w: a[i++], h: a[i++], autoPosition: a[i++] };\r\n return this.willItFit(w);\r\n }\r\n return this.engine.willItFit(node);\r\n }\r\n /** @internal */\r\n _triggerChangeEvent() {\r\n if (this.engine.batchMode)\r\n return this;\r\n let elements = this.engine.getDirtyNodes(true); // verify they really changed\r\n if (elements && elements.length) {\r\n if (!this._ignoreLayoutsNodeChange) {\r\n this.engine.layoutsNodesChange(elements);\r\n }\r\n this._triggerEvent('change', elements);\r\n }\r\n this.engine.saveInitial(); // we called, now reset initial values & dirty flags\r\n return this;\r\n }\r\n /** @internal */\r\n _triggerAddEvent() {\r\n if (this.engine.batchMode)\r\n return this;\r\n if (this.engine.addedNodes && this.engine.addedNodes.length > 0) {\r\n if (!this._ignoreLayoutsNodeChange) {\r\n this.engine.layoutsNodesChange(this.engine.addedNodes);\r\n }\r\n // prevent added nodes from also triggering 'change' event (which is called next)\r\n this.engine.addedNodes.forEach(n => { delete n._dirty; });\r\n this._triggerEvent('added', this.engine.addedNodes);\r\n this.engine.addedNodes = [];\r\n }\r\n return this;\r\n }\r\n /** @internal */\r\n _triggerRemoveEvent() {\r\n if (this.engine.batchMode)\r\n return this;\r\n if (this.engine.removedNodes && this.engine.removedNodes.length > 0) {\r\n this._triggerEvent('removed', this.engine.removedNodes);\r\n this.engine.removedNodes = [];\r\n }\r\n return this;\r\n }\r\n /** @internal */\r\n _triggerEvent(type, data) {\r\n let event = data ? new CustomEvent(type, { bubbles: false, detail: data }) : new Event(type);\r\n this.el.dispatchEvent(event);\r\n return this;\r\n }\r\n /** @internal called to delete the current dynamic style sheet used for our layout */\r\n _removeStylesheet() {\r\n if (this._styles) {\r\n utils_1.Utils.removeStylesheet(this._styleSheetClass);\r\n delete this._styles;\r\n }\r\n return this;\r\n }\r\n /** @internal updated/create the CSS styles for row based layout and initial margin setting */\r\n _updateStyles(forceUpdate = false, maxH) {\r\n // call to delete existing one if we change cellHeight / margin\r\n if (forceUpdate) {\r\n this._removeStylesheet();\r\n }\r\n if (!maxH)\r\n maxH = this.getRow();\r\n this._updateContainerHeight();\r\n // if user is telling us they will handle the CSS themselves by setting heights to 0. Do we need this opts really ??\r\n if (this.opts.cellHeight === 0) {\r\n return this;\r\n }\r\n let cellHeight = this.opts.cellHeight;\r\n let cellHeightUnit = this.opts.cellHeightUnit;\r\n let prefix = `.${this._styleSheetClass} > .${this.opts.itemClass}`;\r\n // create one as needed\r\n if (!this._styles) {\r\n // insert style to parent (instead of 'head' by default) to support WebComponent\r\n let styleLocation = this.opts.styleInHead ? undefined : this.el.parentNode;\r\n this._styles = utils_1.Utils.createStylesheet(this._styleSheetClass, styleLocation, {\r\n nonce: this.opts.nonce,\r\n });\r\n if (!this._styles)\r\n return this;\r\n this._styles._max = 0;\r\n // these are done once only\r\n utils_1.Utils.addCSSRule(this._styles, prefix, `min-height: ${cellHeight}${cellHeightUnit}`);\r\n // content margins\r\n let top = this.opts.marginTop + this.opts.marginUnit;\r\n let bottom = this.opts.marginBottom + this.opts.marginUnit;\r\n let right = this.opts.marginRight + this.opts.marginUnit;\r\n let left = this.opts.marginLeft + this.opts.marginUnit;\r\n let content = `${prefix} > .grid-stack-item-content`;\r\n let placeholder = `.${this._styleSheetClass} > .grid-stack-placeholder > .placeholder-content`;\r\n utils_1.Utils.addCSSRule(this._styles, content, `top: ${top}; right: ${right}; bottom: ${bottom}; left: ${left};`);\r\n utils_1.Utils.addCSSRule(this._styles, placeholder, `top: ${top}; right: ${right}; bottom: ${bottom}; left: ${left};`);\r\n // resize handles offset (to match margin)\r\n utils_1.Utils.addCSSRule(this._styles, `${prefix} > .ui-resizable-ne`, `right: ${right}`);\r\n utils_1.Utils.addCSSRule(this._styles, `${prefix} > .ui-resizable-e`, `right: ${right}`);\r\n utils_1.Utils.addCSSRule(this._styles, `${prefix} > .ui-resizable-se`, `right: ${right}; bottom: ${bottom}`);\r\n utils_1.Utils.addCSSRule(this._styles, `${prefix} > .ui-resizable-nw`, `left: ${left}`);\r\n utils_1.Utils.addCSSRule(this._styles, `${prefix} > .ui-resizable-w`, `left: ${left}`);\r\n utils_1.Utils.addCSSRule(this._styles, `${prefix} > .ui-resizable-sw`, `left: ${left}; bottom: ${bottom}`);\r\n }\r\n // now update the height specific fields\r\n maxH = maxH || this._styles._max;\r\n if (maxH > this._styles._max) {\r\n let getHeight = (rows) => (cellHeight * rows) + cellHeightUnit;\r\n for (let i = this._styles._max + 1; i <= maxH; i++) { // start at 1\r\n let h = getHeight(i);\r\n utils_1.Utils.addCSSRule(this._styles, `${prefix}[gs-y=\"${i - 1}\"]`, `top: ${getHeight(i - 1)}`); // start at 0\r\n utils_1.Utils.addCSSRule(this._styles, `${prefix}[gs-h=\"${i}\"]`, `height: ${h}`);\r\n utils_1.Utils.addCSSRule(this._styles, `${prefix}[gs-min-h=\"${i}\"]`, `min-height: ${h}`);\r\n utils_1.Utils.addCSSRule(this._styles, `${prefix}[gs-max-h=\"${i}\"]`, `max-height: ${h}`);\r\n }\r\n this._styles._max = maxH;\r\n }\r\n return this;\r\n }\r\n /** @internal */\r\n _updateContainerHeight() {\r\n if (!this.engine || this.engine.batchMode)\r\n return this;\r\n let row = this.getRow() + this._extraDragRow; // checks for minRow already\r\n // check for css min height\r\n // Note: we don't handle %,rem correctly so comment out, beside we don't need need to create un-necessary\r\n // rows as the CSS will make us bigger than our set height if needed... not sure why we had this.\r\n // let cssMinHeight = parseInt(getComputedStyle(this.el)['min-height']);\r\n // if (cssMinHeight > 0) {\r\n // let minRow = Math.round(cssMinHeight / this.getCellHeight(true));\r\n // if (row < minRow) {\r\n // row = minRow;\r\n // }\r\n // }\r\n this.el.setAttribute('gs-current-row', String(row));\r\n if (row === 0) {\r\n this.el.style.removeProperty('min-height');\r\n return this;\r\n }\r\n let cellHeight = this.opts.cellHeight;\r\n let unit = this.opts.cellHeightUnit;\r\n if (!cellHeight)\r\n return this;\r\n this.el.style.minHeight = row * cellHeight + unit;\r\n return this;\r\n }\r\n /** @internal */\r\n _prepareElement(el, triggerAddEvent = false, node) {\r\n el.classList.add(this.opts.itemClass);\r\n node = node || this._readAttr(el);\r\n el.gridstackNode = node;\r\n node.el = el;\r\n node.grid = this;\r\n let copy = Object.assign({}, node);\r\n node = this.engine.addNode(node, triggerAddEvent);\r\n // write node attr back in case there was collision or we have to fix bad values during addNode()\r\n if (!utils_1.Utils.same(node, copy)) {\r\n this._writeAttr(el, node);\r\n }\r\n this._prepareDragDropByNode(node);\r\n return this;\r\n }\r\n /** @internal call to write position x,y,w,h attributes back to element */\r\n _writePosAttr(el, n) {\r\n if (n.x !== undefined && n.x !== null) {\r\n el.setAttribute('gs-x', String(n.x));\r\n }\r\n if (n.y !== undefined && n.y !== null) {\r\n el.setAttribute('gs-y', String(n.y));\r\n }\r\n if (n.w) {\r\n el.setAttribute('gs-w', String(n.w));\r\n }\r\n if (n.h) {\r\n el.setAttribute('gs-h', String(n.h));\r\n }\r\n return this;\r\n }\r\n /** @internal call to write any default attributes back to element */\r\n _writeAttr(el, node) {\r\n if (!node)\r\n return this;\r\n this._writePosAttr(el, node);\r\n let attrs /*: GridStackWidget but strings */ = {\r\n autoPosition: 'gs-auto-position',\r\n minW: 'gs-min-w',\r\n minH: 'gs-min-h',\r\n maxW: 'gs-max-w',\r\n maxH: 'gs-max-h',\r\n noResize: 'gs-no-resize',\r\n noMove: 'gs-no-move',\r\n locked: 'gs-locked',\r\n id: 'gs-id',\r\n };\r\n for (const key in attrs) {\r\n if (node[key]) { // 0 is valid for x,y only but done above already and not in list anyway\r\n el.setAttribute(attrs[key], String(node[key]));\r\n }\r\n else {\r\n el.removeAttribute(attrs[key]);\r\n }\r\n }\r\n return this;\r\n }\r\n /** @internal call to read any default attributes from element */\r\n _readAttr(el) {\r\n let node = {};\r\n node.x = utils_1.Utils.toNumber(el.getAttribute('gs-x'));\r\n node.y = utils_1.Utils.toNumber(el.getAttribute('gs-y'));\r\n node.w = utils_1.Utils.toNumber(el.getAttribute('gs-w'));\r\n node.h = utils_1.Utils.toNumber(el.getAttribute('gs-h'));\r\n node.maxW = utils_1.Utils.toNumber(el.getAttribute('gs-max-w'));\r\n node.minW = utils_1.Utils.toNumber(el.getAttribute('gs-min-w'));\r\n node.maxH = utils_1.Utils.toNumber(el.getAttribute('gs-max-h'));\r\n node.minH = utils_1.Utils.toNumber(el.getAttribute('gs-min-h'));\r\n node.autoPosition = utils_1.Utils.toBool(el.getAttribute('gs-auto-position'));\r\n node.noResize = utils_1.Utils.toBool(el.getAttribute('gs-no-resize'));\r\n node.noMove = utils_1.Utils.toBool(el.getAttribute('gs-no-move'));\r\n node.locked = utils_1.Utils.toBool(el.getAttribute('gs-locked'));\r\n node.id = el.getAttribute('gs-id');\r\n // remove any key not found (null or false which is default)\r\n for (const key in node) {\r\n if (!node.hasOwnProperty(key))\r\n return;\r\n if (!node[key] && node[key] !== 0) { // 0 can be valid value (x,y only really)\r\n delete node[key];\r\n }\r\n }\r\n return node;\r\n }\r\n /** @internal */\r\n _setStaticClass() {\r\n let classes = ['grid-stack-static'];\r\n if (this.opts.staticGrid) {\r\n this.el.classList.add(...classes);\r\n this.el.setAttribute('gs-static', 'true');\r\n }\r\n else {\r\n this.el.classList.remove(...classes);\r\n this.el.removeAttribute('gs-static');\r\n }\r\n return this;\r\n }\r\n /**\r\n * called when we are being resized by the window - check if the one Column Mode needs to be turned on/off\r\n * and remember the prev columns we used, or get our count from parent, as well as check for auto cell height (square)\r\n */\r\n onParentResize() {\r\n if (!this.el || !this.el.clientWidth)\r\n return; // return if we're gone or no size yet (will get called again)\r\n let changedColumn = false;\r\n // see if we're nested and take our column count from our parent....\r\n if (this._autoColumn && this.parentGridItem) {\r\n if (this.opts.column !== this.parentGridItem.w) {\r\n changedColumn = true;\r\n this.column(this.parentGridItem.w, 'none');\r\n }\r\n }\r\n else {\r\n // else check for 1 column in/out behavior\r\n let oneColumn = !this.opts.disableOneColumnMode && this.el.clientWidth <= this.opts.oneColumnSize;\r\n if ((this.opts.column === 1) !== oneColumn) {\r\n changedColumn = true;\r\n if (this.opts.animate) {\r\n this.setAnimation(false);\r\n } // 1 <-> 12 is too radical, turn off animation\r\n this.column(oneColumn ? 1 : this._prevColumn);\r\n if (this.opts.animate) {\r\n this.setAnimation(true);\r\n }\r\n }\r\n }\r\n // make the cells content square again\r\n if (this._isAutoCellHeight) {\r\n if (!changedColumn && this.opts.cellHeightThrottle) {\r\n if (!this._cellHeightThrottle) {\r\n this._cellHeightThrottle = utils_1.Utils.throttle(() => this.cellHeight(), this.opts.cellHeightThrottle);\r\n }\r\n this._cellHeightThrottle();\r\n }\r\n else {\r\n // immediate update if we've changed column count or have no threshold\r\n this.cellHeight();\r\n }\r\n }\r\n // finally update any nested grids\r\n this.engine.nodes.forEach(n => {\r\n if (n.subGrid) {\r\n n.subGrid.onParentResize();\r\n }\r\n });\r\n return this;\r\n }\r\n /** add or remove the window size event handler */\r\n _updateWindowResizeEvent(forceRemove = false) {\r\n // only add event if we're not nested (parent will call us) and we're auto sizing cells or supporting oneColumn (i.e. doing work)\r\n const workTodo = (this._isAutoCellHeight || !this.opts.disableOneColumnMode) && !this.parentGridItem;\r\n if (!forceRemove && workTodo && !this._windowResizeBind) {\r\n this._windowResizeBind = this.onParentResize.bind(this); // so we can properly remove later\r\n window.addEventListener('resize', this._windowResizeBind);\r\n }\r\n else if ((forceRemove || !workTodo) && this._windowResizeBind) {\r\n window.removeEventListener('resize', this._windowResizeBind);\r\n delete this._windowResizeBind; // remove link to us so we can free\r\n }\r\n return this;\r\n }\r\n /** @internal convert a potential selector into actual element */\r\n static getElement(els = '.grid-stack-item') { return utils_1.Utils.getElement(els); }\r\n /** @internal */\r\n static getElements(els = '.grid-stack-item') { return utils_1.Utils.getElements(els); }\r\n /** @internal */\r\n static getGridElement(els) { return GridStack.getElement(els); }\r\n /** @internal */\r\n static getGridElements(els) { return utils_1.Utils.getElements(els); }\r\n /** @internal initialize margin top/bottom/left/right and units */\r\n _initMargin() {\r\n let data;\r\n let margin = 0;\r\n // support passing multiple values like CSS (ex: '5px 10px 0 20px')\r\n let margins = [];\r\n if (typeof this.opts.margin === 'string') {\r\n margins = this.opts.margin.split(' ');\r\n }\r\n if (margins.length === 2) { // top/bot, left/right like CSS\r\n this.opts.marginTop = this.opts.marginBottom = margins[0];\r\n this.opts.marginLeft = this.opts.marginRight = margins[1];\r\n }\r\n else if (margins.length === 4) { // Clockwise like CSS\r\n this.opts.marginTop = margins[0];\r\n this.opts.marginRight = margins[1];\r\n this.opts.marginBottom = margins[2];\r\n this.opts.marginLeft = margins[3];\r\n }\r\n else {\r\n data = utils_1.Utils.parseHeight(this.opts.margin);\r\n this.opts.marginUnit = data.unit;\r\n margin = this.opts.margin = data.h;\r\n }\r\n // see if top/bottom/left/right need to be set as well\r\n if (this.opts.marginTop === undefined) {\r\n this.opts.marginTop = margin;\r\n }\r\n else {\r\n data = utils_1.Utils.parseHeight(this.opts.marginTop);\r\n this.opts.marginTop = data.h;\r\n delete this.opts.margin;\r\n }\r\n if (this.opts.marginBottom === undefined) {\r\n this.opts.marginBottom = margin;\r\n }\r\n else {\r\n data = utils_1.Utils.parseHeight(this.opts.marginBottom);\r\n this.opts.marginBottom = data.h;\r\n delete this.opts.margin;\r\n }\r\n if (this.opts.marginRight === undefined) {\r\n this.opts.marginRight = margin;\r\n }\r\n else {\r\n data = utils_1.Utils.parseHeight(this.opts.marginRight);\r\n this.opts.marginRight = data.h;\r\n delete this.opts.margin;\r\n }\r\n if (this.opts.marginLeft === undefined) {\r\n this.opts.marginLeft = margin;\r\n }\r\n else {\r\n data = utils_1.Utils.parseHeight(this.opts.marginLeft);\r\n this.opts.marginLeft = data.h;\r\n delete this.opts.margin;\r\n }\r\n this.opts.marginUnit = data.unit; // in case side were spelled out, use those units instead...\r\n if (this.opts.marginTop === this.opts.marginBottom && this.opts.marginLeft === this.opts.marginRight && this.opts.marginTop === this.opts.marginRight) {\r\n this.opts.margin = this.opts.marginTop; // makes it easier to check for no-ops in setMargin()\r\n }\r\n return this;\r\n }\r\n /* ===========================================================================================\r\n * drag&drop methods that used to be stubbed out and implemented in dd-gridstack.ts\r\n * but caused loading issues in prod - see https://github.com/gridstack/gridstack.js/issues/2039\r\n * ===========================================================================================\r\n */\r\n /** get the global (but static to this code) DD implementation */\r\n static getDD() {\r\n return dd;\r\n }\r\n /**\r\n * call to setup dragging in from the outside (say toolbar), by specifying the class selection and options.\r\n * Called during GridStack.init() as options, but can also be called directly (last param are used) in case the toolbar\r\n * is dynamically create and needs to be set later.\r\n * @param dragIn string selector (ex: '.sidebar .grid-stack-item')\r\n * @param dragInOptions options - see DDDragInOpt. (default: {handle: '.grid-stack-item-content', appendTo: 'body'}\r\n **/\r\n static setupDragIn(dragIn, dragInOptions) {\r\n if ((dragInOptions === null || dragInOptions === void 0 ? void 0 : dragInOptions.pause) !== undefined) {\r\n dd_manager_1.DDManager.pauseDrag = dragInOptions.pause;\r\n }\r\n if (typeof dragIn === 'string') {\r\n dragInOptions = Object.assign(Object.assign({}, types_1.dragInDefaultOptions), (dragInOptions || {}));\r\n utils_1.Utils.getElements(dragIn).forEach(el => {\r\n if (!dd.isDraggable(el))\r\n dd.dragIn(el, dragInOptions);\r\n });\r\n }\r\n }\r\n /**\r\n * Enables/Disables dragging by the user of specific grid element. If you want all items, and have it affect future items, use enableMove() instead. No-op for static grids.\r\n * IF you are looking to prevent an item from moving (due to being pushed around by another during collision) use locked property instead.\r\n * @param els widget or selector to modify.\r\n * @param val if true widget will be draggable.\r\n */\r\n movable(els, val) {\r\n if (this.opts.staticGrid)\r\n return this; // can't move a static grid!\r\n GridStack.getElements(els).forEach(el => {\r\n let node = el.gridstackNode;\r\n if (!node)\r\n return;\r\n if (val)\r\n delete node.noMove;\r\n else\r\n node.noMove = true;\r\n this._prepareDragDropByNode(node); // init DD if need be, and adjust\r\n });\r\n return this;\r\n }\r\n /**\r\n * Enables/Disables user resizing of specific grid element. If you want all items, and have it affect future items, use enableResize() instead. No-op for static grids.\r\n * @param els widget or selector to modify\r\n * @param val if true widget will be resizable.\r\n */\r\n resizable(els, val) {\r\n if (this.opts.staticGrid)\r\n return this; // can't resize a static grid!\r\n GridStack.getElements(els).forEach(el => {\r\n let node = el.gridstackNode;\r\n if (!node)\r\n return;\r\n if (val)\r\n delete node.noResize;\r\n else\r\n node.noResize = true;\r\n this._prepareDragDropByNode(node); // init DD if need be, and adjust\r\n });\r\n return this;\r\n }\r\n /**\r\n * Temporarily disables widgets moving/resizing.\r\n * If you want a more permanent way (which freezes up resources) use `setStatic(true)` instead.\r\n * Note: no-op for static grid\r\n * This is a shortcut for:\r\n * @example\r\n * grid.enableMove(false);\r\n * grid.enableResize(false);\r\n * @param recurse true (default) if sub-grids also get updated\r\n */\r\n disable(recurse = true) {\r\n if (this.opts.staticGrid)\r\n return;\r\n this.enableMove(false, recurse);\r\n this.enableResize(false, recurse); // @ts-ignore\r\n this._triggerEvent('disable');\r\n return this;\r\n }\r\n /**\r\n * Re-enables widgets moving/resizing - see disable().\r\n * Note: no-op for static grid.\r\n * This is a shortcut for:\r\n * @example\r\n * grid.enableMove(true);\r\n * grid.enableResize(true);\r\n * @param recurse true (default) if sub-grids also get updated\r\n */\r\n enable(recurse = true) {\r\n if (this.opts.staticGrid)\r\n return;\r\n this.enableMove(true, recurse);\r\n this.enableResize(true, recurse); // @ts-ignore\r\n this._triggerEvent('enable');\r\n return this;\r\n }\r\n /**\r\n * Enables/disables widget moving. No-op for static grids.\r\n * @param recurse true (default) if sub-grids also get updated\r\n */\r\n enableMove(doEnable, recurse = true) {\r\n if (this.opts.staticGrid)\r\n return this; // can't move a static grid!\r\n this.opts.disableDrag = !doEnable; // FIRST before we update children as grid overrides #1658\r\n this.engine.nodes.forEach(n => {\r\n this.movable(n.el, doEnable);\r\n if (n.subGrid && recurse)\r\n n.subGrid.enableMove(doEnable, recurse);\r\n });\r\n return this;\r\n }\r\n /**\r\n * Enables/disables widget resizing. No-op for static grids.\r\n * @param recurse true (default) if sub-grids also get updated\r\n */\r\n enableResize(doEnable, recurse = true) {\r\n if (this.opts.staticGrid)\r\n return this; // can't size a static grid!\r\n this.opts.disableResize = !doEnable; // FIRST before we update children as grid overrides #1658\r\n this.engine.nodes.forEach(n => {\r\n this.resizable(n.el, doEnable);\r\n if (n.subGrid && recurse)\r\n n.subGrid.enableResize(doEnable, recurse);\r\n });\r\n return this;\r\n }\r\n /** @internal removes any drag&drop present (called during destroy) */\r\n _removeDD(el) {\r\n dd.draggable(el, 'destroy').resizable(el, 'destroy');\r\n if (el.gridstackNode) {\r\n delete el.gridstackNode._initDD; // reset our DD init flag\r\n }\r\n delete el.ddElement;\r\n return this;\r\n }\r\n /** @internal called to add drag over to support widgets being added externally */\r\n _setupAcceptWidget() {\r\n // check if we need to disable things\r\n if (this.opts.staticGrid || (!this.opts.acceptWidgets && !this.opts.removable)) {\r\n dd.droppable(this.el, 'destroy');\r\n return this;\r\n }\r\n // vars shared across all methods\r\n let cellHeight, cellWidth;\r\n let onDrag = (event, el, helper) => {\r\n let node = el.gridstackNode;\r\n if (!node)\r\n return;\r\n helper = helper || el;\r\n let parent = this.el.getBoundingClientRect();\r\n let { top, left } = helper.getBoundingClientRect();\r\n left -= parent.left;\r\n top -= parent.top;\r\n let ui = { position: { top, left } };\r\n if (node._temporaryRemoved) {\r\n node.x = Math.max(0, Math.round(left / cellWidth));\r\n node.y = Math.max(0, Math.round(top / cellHeight));\r\n delete node.autoPosition;\r\n this.engine.nodeBoundFix(node);\r\n // don't accept *initial* location if doesn't fit #1419 (locked drop region, or can't grow), but maybe try if it will go somewhere\r\n if (!this.engine.willItFit(node)) {\r\n node.autoPosition = true; // ignore x,y and try for any slot...\r\n if (!this.engine.willItFit(node)) {\r\n dd.off(el, 'drag'); // stop calling us\r\n return; // full grid or can't grow\r\n }\r\n if (node._willFitPos) {\r\n // use the auto position instead #1687\r\n utils_1.Utils.copyPos(node, node._willFitPos);\r\n delete node._willFitPos;\r\n }\r\n }\r\n // re-use the existing node dragging method\r\n this._onStartMoving(helper, event, ui, node, cellWidth, cellHeight);\r\n }\r\n else {\r\n // re-use the existing node dragging that does so much of the collision detection\r\n this._dragOrResize(helper, event, ui, node, cellWidth, cellHeight);\r\n }\r\n };\r\n dd.droppable(this.el, {\r\n accept: (el) => {\r\n let node = el.gridstackNode;\r\n // set accept drop to true on ourself (which we ignore) so we don't get \"can't drop\" icon in HTML5 mode while moving\r\n if ((node === null || node === void 0 ? void 0 : node.grid) === this)\r\n return true;\r\n if (!this.opts.acceptWidgets)\r\n return false;\r\n // check for accept method or class matching\r\n let canAccept = true;\r\n if (typeof this.opts.acceptWidgets === 'function') {\r\n canAccept = this.opts.acceptWidgets(el);\r\n }\r\n else {\r\n let selector = (this.opts.acceptWidgets === true ? '.grid-stack-item' : this.opts.acceptWidgets);\r\n canAccept = el.matches(selector);\r\n }\r\n // finally check to make sure we actually have space left #1571\r\n if (canAccept && node && this.opts.maxRow) {\r\n let n = { w: node.w, h: node.h, minW: node.minW, minH: node.minH }; // only width/height matters and autoPosition\r\n canAccept = this.engine.willItFit(n);\r\n }\r\n return canAccept;\r\n }\r\n })\r\n /**\r\n * entering our grid area\r\n */\r\n .on(this.el, 'dropover', (event, el, helper) => {\r\n // console.log(`over ${this.el.gridstack.opts.id} ${count++}`); // TEST\r\n let node = el.gridstackNode;\r\n // ignore drop enter on ourself (unless we temporarily removed) which happens on a simple drag of our item\r\n if ((node === null || node === void 0 ? void 0 : node.grid) === this && !node._temporaryRemoved) {\r\n // delete node._added; // reset this to track placeholder again in case we were over other grid #1484 (dropout doesn't always clear)\r\n return false; // prevent parent from receiving msg (which may be a grid as well)\r\n }\r\n // fix #1578 when dragging fast, we may not get a leave on the previous grid so force one now\r\n if ((node === null || node === void 0 ? void 0 : node.grid) && node.grid !== this && !node._temporaryRemoved) {\r\n // console.log('dropover without leave'); // TEST\r\n let otherGrid = node.grid;\r\n otherGrid._leave(el, helper);\r\n }\r\n // cache cell dimensions (which don't change), position can animate if we removed an item in otherGrid that affects us...\r\n cellWidth = this.cellWidth();\r\n cellHeight = this.getCellHeight(true);\r\n // load any element attributes if we don't have a node\r\n if (!node) { // @ts-ignore private read only on ourself\r\n node = this._readAttr(el);\r\n }\r\n if (!node.grid) {\r\n node._isExternal = true;\r\n el.gridstackNode = node;\r\n }\r\n // calculate the grid size based on element outer size\r\n helper = helper || el;\r\n let w = node.w || Math.round(helper.offsetWidth / cellWidth) || 1;\r\n let h = node.h || Math.round(helper.offsetHeight / cellHeight) || 1;\r\n // if the item came from another grid, make a copy and save the original info in case we go back there\r\n if (node.grid && node.grid !== this) {\r\n // copy the node original values (min/max/id/etc...) but override width/height/other flags which are this grid specific\r\n // console.log('dropover cloning node'); // TEST\r\n if (!el._gridstackNodeOrig)\r\n el._gridstackNodeOrig = node; // shouldn't have multiple nested!\r\n el.gridstackNode = node = Object.assign(Object.assign({}, node), { w, h, grid: this });\r\n this.engine.cleanupNode(node)\r\n .nodeBoundFix(node);\r\n // restore some internal fields we need after clearing them all\r\n node._initDD =\r\n node._isExternal = // DOM needs to be re-parented on a drop\r\n node._temporaryRemoved = true; // so it can be inserted onDrag below\r\n }\r\n else {\r\n node.w = w;\r\n node.h = h;\r\n node._temporaryRemoved = true; // so we can insert it\r\n }\r\n // clear any marked for complete removal (Note: don't check _isAboutToRemove as that is cleared above - just do it)\r\n this._itemRemoving(node.el, false);\r\n dd.on(el, 'drag', onDrag);\r\n // make sure this is called at least once when going fast #1578\r\n onDrag(event, el, helper);\r\n return false; // prevent parent from receiving msg (which may be a grid as well)\r\n })\r\n /**\r\n * Leaving our grid area...\r\n */\r\n .on(this.el, 'dropout', (event, el, helper) => {\r\n // console.log(`out ${this.el.gridstack.opts.id} ${count++}`); // TEST\r\n let node = el.gridstackNode;\r\n if (!node)\r\n return false;\r\n // fix #1578 when dragging fast, we might get leave after other grid gets enter (which calls us to clean)\r\n // so skip this one if we're not the active grid really..\r\n if (!node.grid || node.grid === this) {\r\n this._leave(el, helper);\r\n // if we were created as temporary nested grid, go back to before state\r\n if (this._isTemp) {\r\n this.removeAsSubGrid(node);\r\n }\r\n }\r\n return false; // prevent parent from receiving msg (which may be grid as well)\r\n })\r\n /**\r\n * end - releasing the mouse\r\n */\r\n .on(this.el, 'drop', (event, el, helper) => {\r\n var _a, _b;\r\n let node = el.gridstackNode;\r\n // ignore drop on ourself from ourself that didn't come from the outside - dragend will handle the simple move instead\r\n if ((node === null || node === void 0 ? void 0 : node.grid) === this && !node._isExternal)\r\n return false;\r\n let wasAdded = !!this.placeholder.parentElement; // skip items not actually added to us because of constrains, but do cleanup #1419\r\n this.placeholder.remove();\r\n // notify previous grid of removal\r\n // console.log('drop delete _gridstackNodeOrig') // TEST\r\n let origNode = el._gridstackNodeOrig;\r\n delete el._gridstackNodeOrig;\r\n if (wasAdded && (origNode === null || origNode === void 0 ? void 0 : origNode.grid) && origNode.grid !== this) {\r\n let oGrid = origNode.grid;\r\n oGrid.engine.removedNodes.push(origNode);\r\n oGrid._triggerRemoveEvent()._triggerChangeEvent();\r\n // if it's an empty sub-grid that got auto-created, nuke it\r\n if (oGrid.parentGridItem && !oGrid.engine.nodes.length && oGrid.opts.subGridDynamic) {\r\n oGrid.removeAsSubGrid();\r\n }\r\n }\r\n if (!node)\r\n return false;\r\n // use existing placeholder node as it's already in our list with drop location\r\n if (wasAdded) {\r\n this.engine.cleanupNode(node); // removes all internal _xyz values\r\n node.grid = this;\r\n }\r\n dd.off(el, 'drag');\r\n // if we made a copy ('helper' which is temp) of the original node then insert a copy, else we move the original node (#1102)\r\n // as the helper will be nuked by jquery-ui otherwise. TODO: update old code path\r\n if (helper !== el) {\r\n helper.remove();\r\n el.gridstackNode = origNode; // original item (left behind) is re-stored to pre dragging as the node now has drop info\r\n if (wasAdded) {\r\n el = el.cloneNode(true);\r\n }\r\n }\r\n else {\r\n el.remove(); // reduce flicker as we change depth here, and size further down\r\n this._removeDD(el);\r\n }\r\n if (!wasAdded)\r\n return false;\r\n el.gridstackNode = node;\r\n node.el = el;\r\n let subGrid = (_b = (_a = node.subGrid) === null || _a === void 0 ? void 0 : _a.el) === null || _b === void 0 ? void 0 : _b.gridstack; // set when actual sub-grid present\r\n // @ts-ignore\r\n utils_1.Utils.copyPos(node, this._readAttr(this.placeholder)); // placeholder values as moving VERY fast can throw things off #1578\r\n utils_1.Utils.removePositioningStyles(el); // @ts-ignore\r\n this._writeAttr(el, node);\r\n el.classList.add(types_1.gridDefaults.itemClass, this.opts.itemClass);\r\n this.el.appendChild(el); // @ts-ignore // TODO: now would be ideal time to _removeHelperStyle() overriding floating styles (native only)\r\n if (subGrid) {\r\n subGrid.parentGridItem = node;\r\n if (!subGrid.opts.styleInHead)\r\n subGrid._updateStyles(true); // re-create sub-grid styles now that we've moved\r\n }\r\n this._updateContainerHeight();\r\n this.engine.addedNodes.push(node); // @ts-ignore\r\n this._triggerAddEvent(); // @ts-ignore\r\n this._triggerChangeEvent();\r\n this.engine.endUpdate();\r\n if (this._gsEventHandler['dropped']) {\r\n this._gsEventHandler['dropped'](Object.assign(Object.assign({}, event), { type: 'dropped' }), origNode && origNode.grid ? origNode : undefined, node);\r\n }\r\n // wait till we return out of the drag callback to set the new drag&resize handler or they may get messed up\r\n window.setTimeout(() => {\r\n // IFF we are still there (some application will use as placeholder and insert their real widget instead and better call makeWidget())\r\n if (node.el && node.el.parentElement) {\r\n this._prepareDragDropByNode(node);\r\n }\r\n else {\r\n this.engine.removeNode(node);\r\n }\r\n delete node.grid._isTemp;\r\n });\r\n return false; // prevent parent from receiving msg (which may be grid as well)\r\n });\r\n return this;\r\n }\r\n /** @internal mark item for removal */\r\n _itemRemoving(el, remove) {\r\n let node = el ? el.gridstackNode : undefined;\r\n if (!node || !node.grid)\r\n return;\r\n remove ? node._isAboutToRemove = true : delete node._isAboutToRemove;\r\n remove ? el.classList.add('grid-stack-item-removing') : el.classList.remove('grid-stack-item-removing');\r\n }\r\n /** @internal called to setup a trash drop zone if the user specifies it */\r\n _setupRemoveDrop() {\r\n if (!this.opts.staticGrid && typeof this.opts.removable === 'string') {\r\n let trashEl = document.querySelector(this.opts.removable);\r\n if (!trashEl)\r\n return this;\r\n // only register ONE drop-over/dropout callback for the 'trash', and it will\r\n // update the passed in item and parent grid because the 'trash' is a shared resource anyway,\r\n // and Native DD only has 1 event CB (having a list and technically a per grid removableOptions complicates things greatly)\r\n if (!dd.isDroppable(trashEl)) {\r\n dd.droppable(trashEl, this.opts.removableOptions)\r\n .on(trashEl, 'dropover', (event, el) => this._itemRemoving(el, true))\r\n .on(trashEl, 'dropout', (event, el) => this._itemRemoving(el, false));\r\n }\r\n }\r\n return this;\r\n }\r\n /** @internal prepares the element for drag&drop **/\r\n _prepareDragDropByNode(node) {\r\n let el = node.el;\r\n const noMove = node.noMove || this.opts.disableDrag;\r\n const noResize = node.noResize || this.opts.disableResize;\r\n // check for disabled grid first\r\n if (this.opts.staticGrid || (noMove && noResize)) {\r\n if (node._initDD) {\r\n this._removeDD(el); // nukes everything instead of just disable, will add some styles back next\r\n delete node._initDD;\r\n }\r\n el.classList.add('ui-draggable-disabled', 'ui-resizable-disabled'); // add styles one might depend on #1435\r\n return this;\r\n }\r\n if (!node._initDD) {\r\n // variables used/cashed between the 3 start/move/end methods, in addition to node passed above\r\n let cellWidth;\r\n let cellHeight;\r\n /** called when item starts moving/resizing */\r\n let onStartMoving = (event, ui) => {\r\n // trigger any 'dragstart' / 'resizestart' manually\r\n if (this._gsEventHandler[event.type]) {\r\n this._gsEventHandler[event.type](event, event.target);\r\n }\r\n cellWidth = this.cellWidth();\r\n cellHeight = this.getCellHeight(true); // force pixels for calculations\r\n this._onStartMoving(el, event, ui, node, cellWidth, cellHeight);\r\n };\r\n /** called when item is being dragged/resized */\r\n let dragOrResize = (event, ui) => {\r\n this._dragOrResize(el, event, ui, node, cellWidth, cellHeight);\r\n };\r\n /** called when the item stops moving/resizing */\r\n let onEndMoving = (event) => {\r\n this.placeholder.remove();\r\n delete node._moving;\r\n delete node._event;\r\n delete node._lastTried;\r\n // if the item has moved to another grid, we're done here\r\n let target = event.target;\r\n if (!target.gridstackNode || target.gridstackNode.grid !== this)\r\n return;\r\n node.el = target;\r\n if (node._isAboutToRemove) {\r\n let gridToNotify = el.gridstackNode.grid;\r\n if (gridToNotify._gsEventHandler[event.type]) {\r\n gridToNotify._gsEventHandler[event.type](event, target);\r\n }\r\n this._removeDD(el);\r\n gridToNotify.engine.removedNodes.push(node);\r\n gridToNotify._triggerRemoveEvent();\r\n // break circular links and remove DOM\r\n delete el.gridstackNode;\r\n delete node.el;\r\n el.remove();\r\n }\r\n else {\r\n utils_1.Utils.removePositioningStyles(target);\r\n if (node._temporaryRemoved) {\r\n // got removed - restore item back to before dragging position\r\n utils_1.Utils.copyPos(node, node._orig); // @ts-ignore\r\n this._writePosAttr(target, node);\r\n this.engine.addNode(node);\r\n }\r\n else {\r\n // move to new placeholder location\r\n this._writePosAttr(target, node);\r\n }\r\n if (this._gsEventHandler[event.type]) {\r\n this._gsEventHandler[event.type](event, target);\r\n }\r\n }\r\n // @ts-ignore\r\n this._extraDragRow = 0; // @ts-ignore\r\n this._updateContainerHeight(); // @ts-ignore\r\n this._triggerChangeEvent();\r\n this.engine.endUpdate();\r\n };\r\n dd.draggable(el, {\r\n start: onStartMoving,\r\n stop: onEndMoving,\r\n drag: dragOrResize\r\n }).resizable(el, {\r\n start: onStartMoving,\r\n stop: onEndMoving,\r\n resize: dragOrResize\r\n });\r\n node._initDD = true; // we've set DD support now\r\n }\r\n // finally fine tune move vs resize by disabling any part...\r\n dd.draggable(el, noMove ? 'disable' : 'enable')\r\n .resizable(el, noResize ? 'disable' : 'enable');\r\n return this;\r\n }\r\n /** @internal handles actual drag/resize start **/\r\n _onStartMoving(el, event, ui, node, cellWidth, cellHeight) {\r\n this.engine.cleanNodes()\r\n .beginUpdate(node);\r\n // @ts-ignore\r\n this._writePosAttr(this.placeholder, node);\r\n this.el.appendChild(this.placeholder);\r\n // console.log('_onStartMoving placeholder') // TEST\r\n node.el = this.placeholder;\r\n node._lastUiPosition = ui.position;\r\n node._prevYPix = ui.position.top;\r\n node._moving = (event.type === 'dragstart'); // 'dropover' are not initially moving so they can go exactly where they enter (will push stuff out of the way)\r\n delete node._lastTried;\r\n if (event.type === 'dropover' && node._temporaryRemoved) {\r\n // console.log('engine.addNode x=' + node.x); // TEST\r\n this.engine.addNode(node); // will add, fix collisions, update attr and clear _temporaryRemoved\r\n node._moving = true; // AFTER, mark as moving object (wanted fix location before)\r\n }\r\n // set the min/max resize info\r\n this.engine.cacheRects(cellWidth, cellHeight, this.opts.marginTop, this.opts.marginRight, this.opts.marginBottom, this.opts.marginLeft);\r\n if (event.type === 'resizestart') {\r\n dd.resizable(el, 'option', 'minWidth', cellWidth * (node.minW || 1))\r\n .resizable(el, 'option', 'minHeight', cellHeight * (node.minH || 1));\r\n if (node.maxW) {\r\n dd.resizable(el, 'option', 'maxWidth', cellWidth * node.maxW);\r\n }\r\n if (node.maxH) {\r\n dd.resizable(el, 'option', 'maxHeight', cellHeight * node.maxH);\r\n }\r\n }\r\n }\r\n /** @internal handles actual drag/resize **/\r\n _dragOrResize(el, event, ui, node, cellWidth, cellHeight) {\r\n let p = Object.assign({}, node._orig); // could be undefined (_isExternal) which is ok (drag only set x,y and w,h will default to node value)\r\n let resizing;\r\n let mLeft = this.opts.marginLeft, mRight = this.opts.marginRight, mTop = this.opts.marginTop, mBottom = this.opts.marginBottom;\r\n // if margins (which are used to pass mid point by) are large relative to cell height/width, reduce them down #1855\r\n let mHeight = Math.round(cellHeight * 0.1), mWidth = Math.round(cellWidth * 0.1);\r\n mLeft = Math.min(mLeft, mWidth);\r\n mRight = Math.min(mRight, mWidth);\r\n mTop = Math.min(mTop, mHeight);\r\n mBottom = Math.min(mBottom, mHeight);\r\n if (event.type === 'drag') {\r\n if (node._temporaryRemoved)\r\n return; // handled by dropover\r\n let distance = ui.position.top - node._prevYPix;\r\n node._prevYPix = ui.position.top;\r\n if (this.opts.draggable.scroll !== false) {\r\n utils_1.Utils.updateScrollPosition(el, ui.position, distance);\r\n }\r\n // get new position taking into account the margin in the direction we are moving! (need to pass mid point by margin)\r\n let left = ui.position.left + (ui.position.left > node._lastUiPosition.left ? -mRight : mLeft);\r\n let top = ui.position.top + (ui.position.top > node._lastUiPosition.top ? -mBottom : mTop);\r\n p.x = Math.round(left / cellWidth);\r\n p.y = Math.round(top / cellHeight);\r\n // @ts-ignore// if we're at the bottom hitting something else, grow the grid so cursor doesn't leave when trying to place below others\r\n let prev = this._extraDragRow;\r\n if (this.engine.collide(node, p)) {\r\n let row = this.getRow();\r\n let extra = Math.max(0, (p.y + node.h) - row);\r\n if (this.opts.maxRow && row + extra > this.opts.maxRow) {\r\n extra = Math.max(0, this.opts.maxRow - row);\r\n } // @ts-ignore\r\n this._extraDragRow = extra; // @ts-ignore\r\n }\r\n else\r\n this._extraDragRow = 0; // @ts-ignore\r\n if (this._extraDragRow !== prev)\r\n this._updateContainerHeight();\r\n if (node.x === p.x && node.y === p.y)\r\n return; // skip same\r\n // DON'T skip one we tried as we might have failed because of coverage <50% before\r\n // if (node._lastTried && node._lastTried.x === x && node._lastTried.y === y) return;\r\n }\r\n else if (event.type === 'resize') {\r\n if (p.x < 0)\r\n return;\r\n // Scrolling page if needed\r\n utils_1.Utils.updateScrollResize(event, el, cellHeight);\r\n // get new size\r\n p.w = Math.round((ui.size.width - mLeft) / cellWidth);\r\n p.h = Math.round((ui.size.height - mTop) / cellHeight);\r\n if (node.w === p.w && node.h === p.h)\r\n return;\r\n if (node._lastTried && node._lastTried.w === p.w && node._lastTried.h === p.h)\r\n return; // skip one we tried (but failed)\r\n // if we size on left/top side this might move us, so get possible new position as well\r\n let left = ui.position.left + mLeft;\r\n let top = ui.position.top + mTop;\r\n p.x = Math.round(left / cellWidth);\r\n p.y = Math.round(top / cellHeight);\r\n resizing = true;\r\n }\r\n node._event = event;\r\n node._lastTried = p; // set as last tried (will nuke if we go there)\r\n let rect = {\r\n x: ui.position.left + mLeft,\r\n y: ui.position.top + mTop,\r\n w: (ui.size ? ui.size.width : node.w * cellWidth) - mLeft - mRight,\r\n h: (ui.size ? ui.size.height : node.h * cellHeight) - mTop - mBottom\r\n };\r\n if (this.engine.moveNodeCheck(node, Object.assign(Object.assign({}, p), { cellWidth, cellHeight, rect, resizing }))) {\r\n node._lastUiPosition = ui.position;\r\n this.engine.cacheRects(cellWidth, cellHeight, mTop, mRight, mBottom, mLeft);\r\n delete node._skipDown;\r\n if (resizing && node.subGrid) {\r\n node.subGrid.onParentResize();\r\n } // @ts-ignore\r\n this._extraDragRow = 0; // @ts-ignore\r\n this._updateContainerHeight();\r\n let target = event.target; // @ts-ignore\r\n this._writePosAttr(target, node);\r\n if (this._gsEventHandler[event.type]) {\r\n this._gsEventHandler[event.type](event, target);\r\n }\r\n }\r\n }\r\n /** @internal called when item leaving our area by either cursor dropout event\r\n * or shape is outside our boundaries. remove it from us, and mark temporary if this was\r\n * our item to start with else restore prev node values from prev grid it came from.\r\n **/\r\n _leave(el, helper) {\r\n let node = el.gridstackNode;\r\n if (!node)\r\n return;\r\n dd.off(el, 'drag'); // no need to track while being outside\r\n // this gets called when cursor leaves and shape is outside, so only do this once\r\n if (node._temporaryRemoved)\r\n return;\r\n node._temporaryRemoved = true;\r\n this.engine.removeNode(node); // remove placeholder as well, otherwise it's a sign node is not in our list, which is a bigger issue\r\n node.el = node._isExternal && helper ? helper : el; // point back to real item being dragged\r\n if (this.opts.removable === true) { // boolean vs a class string\r\n // item leaving us and we are supposed to remove on leave (no need to drag onto trash) mark it so\r\n this._itemRemoving(el, true);\r\n }\r\n // finally if item originally came from another grid, but left us, restore things back to prev info\r\n if (el._gridstackNodeOrig) {\r\n // console.log('leave delete _gridstackNodeOrig') // TEST\r\n el.gridstackNode = el._gridstackNodeOrig;\r\n delete el._gridstackNodeOrig;\r\n }\r\n else if (node._isExternal) {\r\n // item came from outside (like a toolbar) so nuke any node info\r\n delete node.el;\r\n delete el.gridstackNode;\r\n // and restore all nodes back to original\r\n this.engine.restoreInitial();\r\n }\r\n }\r\n // legacy method removed\r\n commit() { utils_1.obsolete(this, this.batchUpdate(false), 'commit', 'batchUpdate', '5.2'); return this; }\r\n}\r\nexports.GridStack = GridStack;\r\n/** scoping so users can call GridStack.Utils.sort() for example */\r\nGridStack.Utils = utils_1.Utils;\r\n/** scoping so users can call new GridStack.Engine(12) for example */\r\nGridStack.Engine = gridstack_engine_1.GridStackEngine;\r\nGridStack.GDRev = '7.3.0';\r\n//# sourceMappingURL=gridstack.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpREFBaUQ7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxRUFBcUU7QUFDckU7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkM7QUFDM0M7QUFDQTtBQUNB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ZHVsZXMvZ3JpZHN0YWNrL2Rpc3QvZ3JpZHN0YWNrLmpzPzE5OGMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XHJcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfSk7XHJcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XHJcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xyXG4gICAgb1trMl0gPSBtW2tdO1xyXG59KSk7XHJcbnZhciBfX2V4cG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9fZXhwb3J0U3RhcikgfHwgZnVuY3Rpb24obSwgZXhwb3J0cykge1xyXG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIWV4cG9ydHMuaGFzT3duUHJvcGVydHkocCkpIF9fY3JlYXRlQmluZGluZyhleHBvcnRzLCBtLCBwKTtcclxufTtcclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xyXG5leHBvcnRzLkdyaWRTdGFjayA9IHZvaWQgMDtcclxuLyohXHJcbiAqIEdyaWRTdGFjayA3LjMuMFxyXG4gKiBodHRwczovL2dyaWRzdGFja2pzLmNvbS9cclxuICpcclxuICogQ29weXJpZ2h0IChjKSAyMDIxLTIwMjIgQWxhaW4gRHVtZXNueVxyXG4gKiBzZWUgcm9vdCBsaWNlbnNlIGh0dHBzOi8vZ2l0aHViLmNvbS9ncmlkc3RhY2svZ3JpZHN0YWNrLmpzL3RyZWUvbWFzdGVyL0xJQ0VOU0VcclxuICovXHJcbmNvbnN0IGdyaWRzdGFja19lbmdpbmVfMSA9IHJlcXVpcmUoXCIuL2dyaWRzdGFjay1lbmdpbmVcIik7XHJcbmNvbnN0IHV0aWxzXzEgPSByZXF1aXJlKFwiLi91dGlsc1wiKTtcclxuY29uc3QgdHlwZXNfMSA9IHJlcXVpcmUoXCIuL3R5cGVzXCIpO1xyXG4vKlxyXG4gKiBhbmQgaW5jbHVkZSBEJkQgYnkgZGVmYXVsdFxyXG4gKiBUT0RPOiB3aGlsZSB3ZSBjb3VsZCBnZW5lcmF0ZSBhIGdyaWRzdGFjay1zdGF0aWMuanMgYXQgc21hbGxlciBzaXplIC0gc2F2ZXMgYWJvdXQgMzFrICg0MWsgLT4gNzJrKVxyXG4gKiBJIGRvbid0IGtub3cgaG93IHRvIGdlbmVyYXRlIHRoZSBERCBvbmx5IGNvZGUgYXQgdGhlIHJlbWFpbmluZyAzMWsgdG8gZGVsYXkgbG9hZCBhcyBjb2RlIGRlcGVuZHMgb24gR3JpZHN0YWNrLnRzXHJcbiAqIGFsc28gaXQgY2F1c2VkIGxvYWRpbmcgaXNzdWVzIGluIHByb2QgLSBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2dyaWRzdGFjay9ncmlkc3RhY2suanMvaXNzdWVzLzIwMzlcclxuICovXHJcbmNvbnN0IGRkX2dyaWRzdGFja18xID0gcmVxdWlyZShcIi4vZGQtZ3JpZHN0YWNrXCIpO1xyXG5jb25zdCBkZF90b3VjaF8xID0gcmVxdWlyZShcIi4vZGQtdG91Y2hcIik7XHJcbmNvbnN0IGRkX21hbmFnZXJfMSA9IHJlcXVpcmUoXCIuL2RkLW1hbmFnZXJcIik7XHJcbi8qKiBnbG9iYWwgaW5zdGFuY2UgKi9cclxuY29uc3QgZGQgPSBuZXcgZGRfZ3JpZHN0YWNrXzEuRERHcmlkU3RhY2s7XHJcbi8vIGV4cG9ydCBhbGwgZGVwZW5kZW50IGZpbGUgYXMgd2VsbCB0byBtYWtlIGl0IGVhc2llciBmb3IgdXNlcnMgdG8ganVzdCBpbXBvcnQgdGhlIG1haW4gZmlsZVxyXG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vdHlwZXNcIiksIGV4cG9ydHMpO1xyXG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vdXRpbHNcIiksIGV4cG9ydHMpO1xyXG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vZ3JpZHN0YWNrLWVuZ2luZVwiKSwgZXhwb3J0cyk7XHJcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9kZC1ncmlkc3RhY2tcIiksIGV4cG9ydHMpO1xyXG4vKipcclxuICogTWFpbiBncmlkc3RhY2sgY2xhc3MgLSB5b3Ugd2lsbCBuZWVkIHRvIGNhbGwgYEdyaWRTdGFjay5pbml0KClgIGZpcnN0IHRvIGluaXRpYWxpemUgeW91ciBncmlkLlxyXG4gKiBOb3RlOiB5b3VyIGdyaWQgZWxlbWVudHMgTVVTVCBoYXZlIHRoZSBmb2xsb3dpbmcgY2xhc3NlcyBmb3IgdGhlIENTUyBsYXlvdXQgdG8gd29yazpcclxuICogQGV4YW1wbGVcclxuICogPGRpdiBjbGFzcz1cImdyaWQtc3RhY2tcIj5cclxuICogICA8ZGl2IGNsYXNzPVwiZ3JpZC1zdGFjay1pdGVtXCI+XHJcbiAqICAgICA8ZGl2IGNsYXNzPVwiZ3JpZC1zdGFjay1pdGVtLWNvbnRlbnRcIj5JdGVtIDE8L2Rpdj5cclxuICogICA8L2Rpdj5cclxuICogPC9kaXY+XHJcbiAqL1xyXG5jbGFzcyBHcmlkU3RhY2sge1xyXG4gICAgLyoqXHJcbiAgICAgKiBDb25zdHJ1Y3QgYSBncmlkIGl0ZW0gZnJvbSB0aGUgZ2l2ZW4gZWxlbWVudCBhbmQgb3B0aW9uc1xyXG4gICAgICogQHBhcmFtIGVsXHJcbiAgICAgKiBAcGFyYW0gb3B0c1xyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihlbCwgb3B0cyA9IHt9KSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgdGhpcy5fZ3NFdmVudEhhbmRsZXIgPSB7fTtcclxuICAgICAgICAvKiogQGludGVybmFsIGV4dHJhIHJvdyBhZGRlZCB3aGVuIGRyYWdnaW5nIGF0IHRoZSBib3R0b20gb2YgdGhlIGdyaWQgKi9cclxuICAgICAgICB0aGlzLl9leHRyYURyYWdSb3cgPSAwO1xyXG4gICAgICAgIHRoaXMuZWwgPSBlbDsgLy8gZXhwb3NlZCBIVE1MIGVsZW1lbnQgdG8gdGhlIHVzZXJcclxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fTsgLy8gaGFuZGxlcyBudWxsL3VuZGVmaW5lZC8wXHJcbiAgICAgICAgaWYgKCFlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2dyaWQtc3RhY2snKSkge1xyXG4gICAgICAgICAgICB0aGlzLmVsLmNsYXNzTGlzdC5hZGQoJ2dyaWQtc3RhY2snKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gaWYgcm93IHByb3BlcnR5IGV4aXN0cywgcmVwbGFjZSBtaW5Sb3cgYW5kIG1heFJvdyBpbnN0ZWFkXHJcbiAgICAgICAgaWYgKG9wdHMucm93KSB7XHJcbiAgICAgICAgICAgIG9wdHMubWluUm93ID0gb3B0cy5tYXhSb3cgPSBvcHRzLnJvdztcclxuICAgICAgICAgICAgZGVsZXRlIG9wdHMucm93O1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgcm93QXR0ciA9IHV0aWxzXzEuVXRpbHMudG9OdW1iZXIoZWwuZ2V0QXR0cmlidXRlKCdncy1yb3cnKSk7XHJcbiAgICAgICAgLy8gZmxhZyBvbmx5IHZhbGlkIGluIHN1Yi1ncmlkcyAoaGFuZGxlZCBieSBwYXJlbnQsIG5vdCBoZXJlKVxyXG4gICAgICAgIGlmIChvcHRzLmNvbHVtbiA9PT0gJ2F1dG8nKSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBvcHRzLmNvbHVtbjtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gJ21pbldpZHRoJyBsZWdhY3kgc3VwcG9ydCBpbiA1LjFcclxuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xyXG4gICAgICAgIGxldCBhbnlPcHRzID0gb3B0cztcclxuICAgICAgICBpZiAoYW55T3B0cy5taW5XaWR0aCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIG9wdHMub25lQ29sdW1uU2l6ZSA9IG9wdHMub25lQ29sdW1uU2l6ZSB8fCBhbnlPcHRzLm1pbldpZHRoO1xyXG4gICAgICAgICAgICBkZWxldGUgYW55T3B0cy5taW5XaWR0aDtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gc2F2ZSBvcmlnaW5hbCBzZXR0aW5nIHNvIHdlIGNhbiByZXN0b3JlIG9uIHNhdmVcclxuICAgICAgICBpZiAob3B0cy5hbHdheXNTaG93UmVzaXplSGFuZGxlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgb3B0cy5fYWx3YXlzU2hvd1Jlc2l6ZUhhbmRsZSA9IG9wdHMuYWx3YXlzU2hvd1Jlc2l6ZUhhbmRsZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gZWxlbWVudHMgRE9NIGF0dHJpYnV0ZXMgb3ZlcnJpZGUgYW55IHBhc3NlZCBvcHRpb25zIChsaWtlIENTUyBzdHlsZSkgLSBtZXJnZSB0aGUgdHdvIHRvZ2V0aGVyXHJcbiAgICAgICAgbGV0IGRlZmF1bHRzID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCB1dGlsc18xLlV0aWxzLmNsb25lRGVlcCh0eXBlc18xLmdyaWREZWZhdWx0cykpLCB7IGNvbHVtbjogdXRpbHNfMS5VdGlscy50b051bWJlcihlbC5nZXRBdHRyaWJ1dGUoJ2dzLWNvbHVtbicpKSB8fCB0eXBlc18xLmdyaWREZWZhdWx0cy5jb2x1bW4sIG1pblJvdzogcm93QXR0ciA/IHJvd0F0dHIgOiB1dGlsc18xLlV0aWxzLnRvTnVtYmVyKGVsLmdldEF0dHJpYnV0ZSgnZ3MtbWluLXJvdycpKSB8fCB0eXBlc18xLmdyaWREZWZhdWx0cy5taW5Sb3csIG1heFJvdzogcm93QXR0ciA/IHJvd0F0dHIgOiB1dGlsc18xLlV0aWxzLnRvTnVtYmVyKGVsLmdldEF0dHJpYnV0ZSgnZ3MtbWF4LXJvdycpKSB8fCB0eXBlc18xLmdyaWREZWZhdWx0cy5tYXhSb3csIHN0YXRpY0dyaWQ6IHV0aWxzXzEuVXRpbHMudG9Cb29sKGVsLmdldEF0dHJpYnV0ZSgnZ3Mtc3RhdGljJykpIHx8IHR5cGVzXzEuZ3JpZERlZmF1bHRzLnN0YXRpY0dyaWQsIGRyYWdnYWJsZToge1xyXG4gICAgICAgICAgICAgICAgaGFuZGxlOiAob3B0cy5oYW5kbGVDbGFzcyA/ICcuJyArIG9wdHMuaGFuZGxlQ2xhc3MgOiAob3B0cy5oYW5kbGUgPyBvcHRzLmhhbmRsZSA6ICcnKSkgfHwgdHlwZXNfMS5ncmlkRGVmYXVsdHMuZHJhZ2dhYmxlLmhhbmRsZSxcclxuICAgICAgICAgICAgfSwgcmVtb3ZhYmxlT3B0aW9uczoge1xyXG4gICAgICAgICAgICAgICAgYWNjZXB0OiBvcHRzLml0ZW1DbGFzcyA/ICcuJyArIG9wdHMuaXRlbUNsYXNzIDogdHlwZXNfMS5ncmlkRGVmYXVsdHMucmVtb3ZhYmxlT3B0aW9ucy5hY2NlcHQsXHJcbiAgICAgICAgICAgIH0gfSk7XHJcbiAgICAgICAgaWYgKGVsLmdldEF0dHJpYnV0ZSgnZ3MtYW5pbWF0ZScpKSB7IC8vIGRlZmF1bHQgdG8gdHJ1ZSwgYnV0IGlmIHNldCB0byBmYWxzZSB1c2UgdGhhdCBpbnN0ZWFkXHJcbiAgICAgICAgICAgIGRlZmF1bHRzLmFuaW1hdGUgPSB1dGlsc18xLlV0aWxzLnRvQm9vbChlbC5nZXRBdHRyaWJ1dGUoJ2dzLWFuaW1hdGUnKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMub3B0cyA9IHV0aWxzXzEuVXRpbHMuZGVmYXVsdHMob3B0cywgZGVmYXVsdHMpO1xyXG4gICAgICAgIG9wdHMgPSBudWxsOyAvLyBtYWtlIHN1cmUgd2UgdXNlIHRoaXMub3B0cyBpbnN0ZWFkXHJcbiAgICAgICAgdGhpcy5faW5pdE1hcmdpbigpOyAvLyBwYXJ0IG9mIHNldHRpbmdzIGRlZmF1bHRzLi4uXHJcbiAgICAgICAgLy8gTm93IGNoZWNrIGlmIHdlJ3JlIGxvYWRpbmcgaW50byAxIGNvbHVtbiBtb2RlIEZJUlNUIHNvIHdlIGRvbid0IGRvIHVuLW5lY2Vzc2FyeSB3b3JrIChsaWtlIGNlbGxIZWlnaHQgPSB3aWR0aCAvIDEyIHRoZW4gZ28gMSBjb2x1bW4pXHJcbiAgICAgICAgaWYgKHRoaXMub3B0cy5jb2x1bW4gIT09IDEgJiYgIXRoaXMub3B0cy5kaXNhYmxlT25lQ29sdW1uTW9kZSAmJiB0aGlzLl93aWR0aE9yQ29udGFpbmVyKCkgPD0gdGhpcy5vcHRzLm9uZUNvbHVtblNpemUpIHtcclxuICAgICAgICAgICAgdGhpcy5fcHJldkNvbHVtbiA9IHRoaXMuZ2V0Q29sdW1uKCk7XHJcbiAgICAgICAgICAgIHRoaXMub3B0cy5jb2x1bW4gPSAxO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5vcHRzLnJ0bCA9PT0gJ2F1dG8nKSB7XHJcbiAgICAgICAgICAgIHRoaXMub3B0cy5ydGwgPSAoZWwuc3R5bGUuZGlyZWN0aW9uID09PSAncnRsJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLm9wdHMucnRsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZWwuY2xhc3NMaXN0LmFkZCgnZ3JpZC1zdGFjay1ydGwnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gY2hlY2sgaWYgd2UncmUgYmVlbiBuZXN0ZWQsIGFuZCBpZiBzbyB1cGRhdGUgb3VyIHN0eWxlIGFuZCBrZWVwIHBvaW50ZXIgYXJvdW5kICh1c2VkIGR1cmluZyBzYXZlKVxyXG4gICAgICAgIGxldCBwYXJlbnRHcmlkSXRlbSA9IChfYSA9IHV0aWxzXzEuVXRpbHMuY2xvc2VzdFVwQnlDbGFzcyh0aGlzLmVsLCB0eXBlc18xLmdyaWREZWZhdWx0cy5pdGVtQ2xhc3MpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZ3JpZHN0YWNrTm9kZTtcclxuICAgICAgICBpZiAocGFyZW50R3JpZEl0ZW0pIHtcclxuICAgICAgICAgICAgcGFyZW50R3JpZEl0ZW0uc3ViR3JpZCA9IHRoaXM7XHJcbiAgICAgICAgICAgIHRoaXMucGFyZW50R3JpZEl0ZW0gPSBwYXJlbnRHcmlkSXRlbTtcclxuICAgICAgICAgICAgdGhpcy5lbC5jbGFzc0xpc3QuYWRkKCdncmlkLXN0YWNrLW5lc3RlZCcpO1xyXG4gICAgICAgICAgICBwYXJlbnRHcmlkSXRlbS5lbC5jbGFzc0xpc3QuYWRkKCdncmlkLXN0YWNrLXN1Yi1ncmlkJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2lzQXV0b0NlbGxIZWlnaHQgPSAodGhpcy5vcHRzLmNlbGxIZWlnaHQgPT09ICdhdXRvJyk7XHJcbiAgICAgICAgaWYgKHRoaXMuX2lzQXV0b0NlbGxIZWlnaHQgfHwgdGhpcy5vcHRzLmNlbGxIZWlnaHQgPT09ICdpbml0aWFsJykge1xyXG4gICAgICAgICAgICAvLyBtYWtlIHRoZSBjZWxsIGNvbnRlbnQgc3F1YXJlIGluaXRpYWxseSAod2lsbCB1c2UgcmVzaXplL2NvbHVtbiBldmVudCB0byBrZWVwIGl0IHNxdWFyZSlcclxuICAgICAgICAgICAgdGhpcy5jZWxsSGVpZ2h0KHVuZGVmaW5lZCwgZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgLy8gYXBwZW5kIHVuaXQgaWYgYW55IGFyZSBzZXRcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdHMuY2VsbEhlaWdodCA9PSAnbnVtYmVyJyAmJiB0aGlzLm9wdHMuY2VsbEhlaWdodFVuaXQgJiYgdGhpcy5vcHRzLmNlbGxIZWlnaHRVbml0ICE9PSB0eXBlc18xLmdyaWREZWZhdWx0cy5jZWxsSGVpZ2h0VW5pdCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vcHRzLmNlbGxIZWlnaHQgPSB0aGlzLm9wdHMuY2VsbEhlaWdodCArIHRoaXMub3B0cy5jZWxsSGVpZ2h0VW5pdDtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLm9wdHMuY2VsbEhlaWdodFVuaXQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5jZWxsSGVpZ2h0KHRoaXMub3B0cy5jZWxsSGVpZ2h0LCBmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHNlZSBpZiB3ZSBuZWVkIHRvIGFkanVzdCBhdXRvLWhpZGVcclxuICAgICAgICBpZiAodGhpcy5vcHRzLmFsd2F5c1Nob3dSZXNpemVIYW5kbGUgPT09ICdtb2JpbGUnKSB7XHJcbiAgICAgICAgICAgIHRoaXMub3B0cy5hbHdheXNTaG93UmVzaXplSGFuZGxlID0gZGRfdG91Y2hfMS5pc1RvdWNoO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9zdHlsZVNoZWV0Q2xhc3MgPSAnZ3JpZC1zdGFjay1pbnN0YW5jZS0nICsgZ3JpZHN0YWNrX2VuZ2luZV8xLkdyaWRTdGFja0VuZ2luZS5faWRTZXErKztcclxuICAgICAgICB0aGlzLmVsLmNsYXNzTGlzdC5hZGQodGhpcy5fc3R5bGVTaGVldENsYXNzKTtcclxuICAgICAgICB0aGlzLl9zZXRTdGF0aWNDbGFzcygpO1xyXG4gICAgICAgIGxldCBlbmdpbmVDbGFzcyA9IHRoaXMub3B0cy5lbmdpbmVDbGFzcyB8fCBHcmlkU3RhY2suZW5naW5lQ2xhc3MgfHwgZ3JpZHN0YWNrX2VuZ2luZV8xLkdyaWRTdGFja0VuZ2luZTtcclxuICAgICAgICB0aGlzLmVuZ2luZSA9IG5ldyBlbmdpbmVDbGFzcyh7XHJcbiAgICAgICAgICAgIGNvbHVtbjogdGhpcy5nZXRDb2x1bW4oKSxcclxuICAgICAgICAgICAgZmxvYXQ6IHRoaXMub3B0cy5mbG9hdCxcclxuICAgICAgICAgICAgbWF4Um93OiB0aGlzLm9wdHMubWF4Um93LFxyXG4gICAgICAgICAgICBvbkNoYW5nZTogKGNiTm9kZXMpID0+IHtcclxuICAgICAgICAgICAgICAgIGxldCBtYXhIID0gMDtcclxuICAgICAgICAgICAgICAgIHRoaXMuZW5naW5lLm5vZGVzLmZvckVhY2gobiA9PiB7IG1heEggPSBNYXRoLm1heChtYXhILCBuLnkgKyBuLmgpOyB9KTtcclxuICAgICAgICAgICAgICAgIGNiTm9kZXMuZm9yRWFjaChuID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgZWwgPSBuLmVsO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghZWwpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobi5fcmVtb3ZlRE9NKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgbi5fcmVtb3ZlRE9NO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fd3JpdGVQb3NBdHRyKGVsLCBuKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVN0eWxlcyhmYWxzZSwgbWF4SCk7IC8vIGZhbHNlID0gZG9uJ3QgcmVjcmVhdGUsIGp1c3QgYXBwZW5kIGlmIG5lZWQgYmVcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmICh0aGlzLm9wdHMuYXV0bykge1xyXG4gICAgICAgICAgICB0aGlzLmJhdGNoVXBkYXRlKCk7IC8vIHByZXZlbnQgaW4gYmV0d2VlbiByZS1sYXlvdXQgIzE1MzUgVE9ETzogdGhpcyBvbmx5IHNldCBmbG9hdD10cnVlLCBuZWVkIHRvIHByZXZlbnQgY29sbGlzaW9uIGNoZWNrLi4uXHJcbiAgICAgICAgICAgIHRoaXMuZ2V0R3JpZEl0ZW1zKCkuZm9yRWFjaChlbCA9PiB0aGlzLl9wcmVwYXJlRWxlbWVudChlbCkpO1xyXG4gICAgICAgICAgICB0aGlzLmJhdGNoVXBkYXRlKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gbG9hZCBhbnkgcGFzc2VkIGluIGNoaWxkcmVuIGFzIHdlbGwsIHdoaWNoIG92ZXJyaWRlcyBhbnkgRE9NIGxheW91dCBkb25lIGFib3ZlXHJcbiAgICAgICAgaWYgKHRoaXMub3B0cy5jaGlsZHJlbikge1xyXG4gICAgICAgICAgICBsZXQgY2hpbGRyZW4gPSB0aGlzLm9wdHMuY2hpbGRyZW47XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLm9wdHMuY2hpbGRyZW47XHJcbiAgICAgICAgICAgIGlmIChjaGlsZHJlbi5sZW5ndGgpXHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWQoY2hpbGRyZW4pOyAvLyBkb24ndCBsb2FkIGVtcHR5XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2V0QW5pbWF0aW9uKHRoaXMub3B0cy5hbmltYXRlKTtcclxuICAgICAgICB0aGlzLl91cGRhdGVTdHlsZXMoKTtcclxuICAgICAgICBpZiAodGhpcy5vcHRzLmNvbHVtbiAhPSAxMikge1xyXG4gICAgICAgICAgICB0aGlzLmVsLmNsYXNzTGlzdC5hZGQoJ2dyaWQtc3RhY2stJyArIHRoaXMub3B0cy5jb2x1bW4pO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBsZWdhY3kgc3VwcG9ydCB0byBhcHBlYXIgJ3BlciBncmlkYCBvcHRpb25zIHdoZW4gcmVhbGx5IGdsb2JhbC5cclxuICAgICAgICBpZiAodGhpcy5vcHRzLmRyYWdJbilcclxuICAgICAgICAgICAgR3JpZFN0YWNrLnNldHVwRHJhZ0luKHRoaXMub3B0cy5kcmFnSW4sIHRoaXMub3B0cy5kcmFnSW5PcHRpb25zKTtcclxuICAgICAgICBkZWxldGUgdGhpcy5vcHRzLmRyYWdJbjtcclxuICAgICAgICBkZWxldGUgdGhpcy5vcHRzLmRyYWdJbk9wdGlvbnM7XHJcbiAgICAgICAgLy8gZHluYW1pYyBncmlkcyByZXF1aXJlIHBhdXNpbmcgZHVyaW5nIGRyYWcgdG8gZGV0ZWN0IG92ZXIgdG8gbmVzdCB2cyBwdXNoXHJcbiAgICAgICAgaWYgKHRoaXMub3B0cy5zdWJHcmlkRHluYW1pYyAmJiAhZGRfbWFuYWdlcl8xLkRETWFuYWdlci5wYXVzZURyYWcpXHJcbiAgICAgICAgICAgIGRkX21hbmFnZXJfMS5ERE1hbmFnZXIucGF1c2VEcmFnID0gdHJ1ZTtcclxuICAgICAgICBpZiAoKChfYiA9IHRoaXMub3B0cy5kcmFnZ2FibGUpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5wYXVzZSkgIT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgZGRfbWFuYWdlcl8xLkRETWFuYWdlci5wYXVzZURyYWcgPSB0aGlzLm9wdHMuZHJhZ2dhYmxlLnBhdXNlO1xyXG4gICAgICAgIHRoaXMuX3NldHVwUmVtb3ZlRHJvcCgpO1xyXG4gICAgICAgIHRoaXMuX3NldHVwQWNjZXB0V2lkZ2V0KCk7XHJcbiAgICAgICAgdGhpcy5fdXBkYXRlV2luZG93UmVzaXplRXZlbnQoKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogaW5pdGlhbGl6aW5nIHRoZSBIVE1MIGVsZW1lbnQsIG9yIHNlbGVjdG9yIHN0cmluZywgaW50byBhIGdyaWQgd2lsbCByZXR1cm4gdGhlIGdyaWQuIENhbGxpbmcgaXQgYWdhaW4gd2lsbFxyXG4gICAgICogc2ltcGx5IHJldHVybiB0aGUgZXhpc3RpbmcgaW5zdGFuY2UgKGlnbm9yZSBhbnkgcGFzc2VkIG9wdGlvbnMpLiBUaGVyZSBpcyBhbHNvIGFuIGluaXRBbGwoKSB2ZXJzaW9uIHRoYXQgc3VwcG9ydFxyXG4gICAgICogbXVsdGlwbGUgZ3JpZHMgaW5pdGlhbGl6YXRpb24gYXQgb25jZS4gT3IgeW91IGNhbiB1c2UgYWRkR3JpZCgpIHRvIGNyZWF0ZSB0aGUgZW50aXJlIGdyaWQgZnJvbSBKU09OLlxyXG4gICAgICogQHBhcmFtIG9wdGlvbnMgZ3JpZCBvcHRpb25zIChvcHRpb25hbClcclxuICAgICAqIEBwYXJhbSBlbE9yU3RyaW5nIGVsZW1lbnQgb3IgQ1NTIHNlbGVjdG9yIChmaXJzdCBvbmUgdXNlZCkgdG8gY29udmVydCB0byBhIGdyaWQgKGRlZmF1bHQgdG8gJy5ncmlkLXN0YWNrJyBjbGFzcyBzZWxlY3RvcilcclxuICAgICAqXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogbGV0IGdyaWQgPSBHcmlkU3RhY2suaW5pdCgpO1xyXG4gICAgICpcclxuICAgICAqIE5vdGU6IHRoZSBIVE1MRWxlbWVudCAob2YgdHlwZSBHcmlkSFRNTEVsZW1lbnQpIHdpbGwgc3RvcmUgYSBgZ3JpZHN0YWNrOiBHcmlkU3RhY2tgIHZhbHVlIHRoYXQgY2FuIGJlIHJldHJpZXZlIGxhdGVyXHJcbiAgICAgKiBsZXQgZ3JpZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5ncmlkLXN0YWNrJykuZ3JpZHN0YWNrO1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgaW5pdChvcHRpb25zID0ge30sIGVsT3JTdHJpbmcgPSAnLmdyaWQtc3RhY2snKSB7XHJcbiAgICAgICAgbGV0IGVsID0gR3JpZFN0YWNrLmdldEdyaWRFbGVtZW50KGVsT3JTdHJpbmcpO1xyXG4gICAgICAgIGlmICghZWwpIHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBlbE9yU3RyaW5nID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignR3JpZFN0YWNrLmluaXRBbGwoKSBubyBncmlkIHdhcyBmb3VuZCB3aXRoIHNlbGVjdG9yIFwiJyArIGVsT3JTdHJpbmcgKyAnXCIgLSBlbGVtZW50IG1pc3Npbmcgb3Igd3Jvbmcgc2VsZWN0b3IgPycgK1xyXG4gICAgICAgICAgICAgICAgICAgICdcXG5Ob3RlOiBcIi5ncmlkLXN0YWNrXCIgaXMgcmVxdWlyZWQgZm9yIHByb3BlciBDU1Mgc3R5bGluZyBhbmQgZHJhZy9kcm9wLCBhbmQgaXMgdGhlIGRlZmF1bHQgc2VsZWN0b3IuJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdHcmlkU3RhY2suaW5pdCgpIG5vIGdyaWQgZWxlbWVudCB3YXMgcGFzc2VkLicpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWVsLmdyaWRzdGFjaykge1xyXG4gICAgICAgICAgICBlbC5ncmlkc3RhY2sgPSBuZXcgR3JpZFN0YWNrKGVsLCB1dGlsc18xLlV0aWxzLmNsb25lRGVlcChvcHRpb25zKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBlbC5ncmlkc3RhY2s7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFdpbGwgaW5pdGlhbGl6ZSBhIGxpc3Qgb2YgZWxlbWVudHMgKGdpdmVuIGEgc2VsZWN0b3IpIGFuZCByZXR1cm4gYW4gYXJyYXkgb2YgZ3JpZHMuXHJcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBncmlkIG9wdGlvbnMgKG9wdGlvbmFsKVxyXG4gICAgICogQHBhcmFtIHNlbGVjdG9yIGVsZW1lbnRzIHNlbGVjdG9yIHRvIGNvbnZlcnQgdG8gZ3JpZHMgKGRlZmF1bHQgdG8gJy5ncmlkLXN0YWNrJyBjbGFzcyBzZWxlY3RvcilcclxuICAgICAqXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogbGV0IGdyaWRzID0gR3JpZFN0YWNrLmluaXRBbGwoKTtcclxuICAgICAqIGdyaWRzLmZvckVhY2goLi4uKVxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgaW5pdEFsbChvcHRpb25zID0ge30sIHNlbGVjdG9yID0gJy5ncmlkLXN0YWNrJykge1xyXG4gICAgICAgIGxldCBncmlkcyA9IFtdO1xyXG4gICAgICAgIEdyaWRTdGFjay5nZXRHcmlkRWxlbWVudHMoc2VsZWN0b3IpLmZvckVhY2goZWwgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIWVsLmdyaWRzdGFjaykge1xyXG4gICAgICAgICAgICAgICAgZWwuZ3JpZHN0YWNrID0gbmV3IEdyaWRTdGFjayhlbCwgdXRpbHNfMS5VdGlscy5jbG9uZURlZXAob3B0aW9ucykpO1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlIG9wdGlvbnMuZHJhZ0luO1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlIG9wdGlvbnMuZHJhZ0luT3B0aW9uczsgLy8gb25seSBuZWVkIHRvIGJlIGRvbmUgb25jZSAocmVhbGx5IGEgc3RhdGljIGdsb2JhbCB0aGluZywgbm90IHBlciBncmlkKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGdyaWRzLnB1c2goZWwuZ3JpZHN0YWNrKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoZ3JpZHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0dyaWRTdGFjay5pbml0QWxsKCkgbm8gZ3JpZCB3YXMgZm91bmQgd2l0aCBzZWxlY3RvciBcIicgKyBzZWxlY3RvciArICdcIiAtIGVsZW1lbnQgbWlzc2luZyBvciB3cm9uZyBzZWxlY3RvciA/JyArXHJcbiAgICAgICAgICAgICAgICAnXFxuTm90ZTogXCIuZ3JpZC1zdGFja1wiIGlzIHJlcXVpcmVkIGZvciBwcm9wZXIgQ1NTIHN0eWxpbmcgYW5kIGRyYWcvZHJvcCwgYW5kIGlzIHRoZSBkZWZhdWx0IHNlbGVjdG9yLicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZ3JpZHM7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIGNhbGwgdG8gY3JlYXRlIGEgZ3JpZCB3aXRoIHRoZSBnaXZlbiBvcHRpb25zLCBpbmNsdWRpbmcgbG9hZGluZyBhbnkgY2hpbGRyZW4gZnJvbSBKU09OIHN0cnVjdHVyZS4gVGhpcyB3aWxsIGNhbGwgR3JpZFN0YWNrLmluaXQoKSwgdGhlblxyXG4gICAgICogZ3JpZC5sb2FkKCkgb24gYW55IHBhc3NlZCBjaGlsZHJlbiAocmVjdXJzaXZlbHkpLiBHcmVhdCBhbHRlcm5hdGl2ZSB0byBjYWxsaW5nIGluaXQoKSBpZiB5b3Ugd2FudCBlbnRpcmUgZ3JpZCB0byBjb21lIGZyb21cclxuICAgICAqIEpTT04gc2VyaWFsaXplZCBkYXRhLCBpbmNsdWRpbmcgb3B0aW9ucy5cclxuICAgICAqIEBwYXJhbSBwYXJlbnQgSFRNTCBlbGVtZW50IHBhcmVudCB0byB0aGUgZ3JpZFxyXG4gICAgICogQHBhcmFtIG9wdCBncmlkcyBvcHRpb25zIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZ3JpZCwgYW5kIGxpc3Qgb2YgY2hpbGRyZW5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGFkZEdyaWQocGFyZW50LCBvcHQgPSB7fSkge1xyXG4gICAgICAgIGlmICghcGFyZW50KVxyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAvLyBjcmVhdGUgdGhlIGdyaWQgZWxlbWVudCwgYnV0IGNoZWNrIGlmIHRoZSBwYXNzZWQgJ3BhcmVudCcgYWxyZWFkeSBoYXMgZ3JpZCBzdHlsaW5nIGFuZCBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkXHJcbiAgICAgICAgbGV0IGVsID0gcGFyZW50O1xyXG4gICAgICAgIGNvbnN0IHBhcmVudElzR3JpZCA9IHBhcmVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2dyaWQtc3RhY2snKTtcclxuICAgICAgICBpZiAoIXBhcmVudElzR3JpZCB8fCBvcHQuYWRkUmVtb3ZlQ0IpIHtcclxuICAgICAgICAgICAgaWYgKG9wdC5hZGRSZW1vdmVDQikge1xyXG4gICAgICAgICAgICAgICAgZWwgPSBvcHQuYWRkUmVtb3ZlQ0IocGFyZW50LCBvcHQsIHRydWUsIHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbGV0IGRvYyA9IGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgnJyk7IC8vIElFIG5lZWRzIGEgcGFyYW1cclxuICAgICAgICAgICAgICAgIGRvYy5ib2R5LmlubmVySFRNTCA9IGA8ZGl2IGNsYXNzPVwiZ3JpZC1zdGFjayAke29wdC5jbGFzcyB8fCAnJ31cIj48L2Rpdj5gO1xyXG4gICAgICAgICAgICAgICAgZWwgPSBkb2MuYm9keS5jaGlsZHJlblswXTtcclxuICAgICAgICAgICAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChlbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gY3JlYXRlIGdyaWQgY2xhc3MgYW5kIGxvYWQgYW55IGNoaWxkcmVuXHJcbiAgICAgICAgbGV0IGdyaWQgPSBHcmlkU3RhY2suaW5pdChvcHQsIGVsKTtcclxuICAgICAgICByZXR1cm4gZ3JpZDtcclxuICAgIH1cclxuICAgIC8qKiBjYWxsIHRoaXMgbWV0aG9kIHRvIHJlZ2lzdGVyIHlvdXIgZW5naW5lIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgb25lLlxyXG4gICAgICogU2VlIGluc3RlYWQgYEdyaWRTdGFja09wdGlvbnMuZW5naW5lQ2xhc3NgIGlmIHlvdSBvbmx5IG5lZWQgdG9cclxuICAgICAqIHJlcGxhY2UganVzdCBvbmUgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyByZWdpc3RlckVuZ2luZShlbmdpbmVDbGFzcykge1xyXG4gICAgICAgIEdyaWRTdGFjay5lbmdpbmVDbGFzcyA9IGVuZ2luZUNsYXNzO1xyXG4gICAgfVxyXG4gICAgLyoqIEBpbnRlcm5hbCBjcmVhdGUgcGxhY2Vob2xkZXIgRElWIGFzIG5lZWRlZCAqL1xyXG4gICAgZ2V0IHBsYWNlaG9sZGVyKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5fcGxhY2Vob2xkZXIpIHtcclxuICAgICAgICAgICAgbGV0IHBsYWNlaG9sZGVyQ2hpbGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsgLy8gY2hpbGQgc28gcGFkZGluZyBtYXRjaCBpdGVtLWNvbnRlbnRcclxuICAgICAgICAgICAgcGxhY2Vob2xkZXJDaGlsZC5jbGFzc05hbWUgPSAncGxhY2Vob2xkZXItY29udGVudCc7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdHMucGxhY2Vob2xkZXJUZXh0KSB7XHJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlckNoaWxkLmlubmVySFRNTCA9IHRoaXMub3B0cy5wbGFjZWhvbGRlclRleHQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fcGxhY2Vob2xkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICAgICAgdGhpcy5fcGxhY2Vob2xkZXIuY2xhc3NMaXN0LmFkZCh0aGlzLm9wdHMucGxhY2Vob2xkZXJDbGFzcywgdHlwZXNfMS5ncmlkRGVmYXVsdHMuaXRlbUNsYXNzLCB0aGlzLm9wdHMuaXRlbUNsYXNzKTtcclxuICAgICAgICAgICAgdGhpcy5wbGFjZWhvbGRlci5hcHBlbmRDaGlsZChwbGFjZWhvbGRlckNoaWxkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BsYWNlaG9sZGVyO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBhZGQgYSBuZXcgd2lkZ2V0IGFuZCByZXR1cm5zIGl0LlxyXG4gICAgICpcclxuICAgICAqIFdpZGdldCB3aWxsIGJlIGFsd2F5cyBwbGFjZWQgZXZlbiBpZiByZXN1bHQgaGVpZ2h0IGlzIG1vcmUgdGhhbiBhY3R1YWwgZ3JpZCBoZWlnaHQuXHJcbiAgICAgKiBZb3UgbmVlZCB0byB1c2UgYHdpbGxJdEZpdCgpYCBiZWZvcmUgY2FsbGluZyBhZGRXaWRnZXQgZm9yIGFkZGl0aW9uYWwgY2hlY2suXHJcbiAgICAgKiBTZWUgYWxzbyBgbWFrZVdpZGdldCgpYC5cclxuICAgICAqXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogbGV0IGdyaWQgPSBHcmlkU3RhY2suaW5pdCgpO1xyXG4gICAgICogZ3JpZC5hZGRXaWRnZXQoe3c6IDMsIGNvbnRlbnQ6ICdoZWxsbyd9KTtcclxuICAgICAqIGdyaWQuYWRkV2lkZ2V0KCc8ZGl2IGNsYXNzPVwiZ3JpZC1zdGFjay1pdGVtXCI+PGRpdiBjbGFzcz1cImdyaWQtc3RhY2staXRlbS1jb250ZW50XCI+aGVsbG88L2Rpdj48L2Rpdj4nLCB7dzogM30pO1xyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBlbCAgR3JpZFN0YWNrV2lkZ2V0ICh3aGljaCBjYW4gaGF2ZSBjb250ZW50IHN0cmluZyBhcyB3ZWxsKSwgaHRtbCBlbGVtZW50LCBvciBzdHJpbmcgZGVmaW5pdGlvbiB0byBhZGRcclxuICAgICAqIEBwYXJhbSBvcHRpb25zIHdpZGdldCBwb3NpdGlvbi9zaXplIG9wdGlvbnMgKG9wdGlvbmFsLCBhbmQgaWdub3JlIGlmIGZpcnN0IHBhcmFtIGlzIGFscmVhZHkgb3B0aW9uKSAtIHNlZSBHcmlkU3RhY2tXaWRnZXRcclxuICAgICAqL1xyXG4gICAgYWRkV2lkZ2V0KGVscywgb3B0aW9ucykge1xyXG4gICAgICAgIGZ1bmN0aW9uIGlzR3JpZFN0YWNrV2lkZ2V0KHcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHcuZWwgIT09IHVuZGVmaW5lZCB8fCB3LnggIT09IHVuZGVmaW5lZCB8fCB3LnkgIT09IHVuZGVmaW5lZCB8fCB3LncgIT09IHVuZGVmaW5lZCB8fCB3LmggIT09IHVuZGVmaW5lZCB8fCB3LmNvbnRlbnQgIT09IHVuZGVmaW5lZCA/IHRydWUgOiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGVsO1xyXG4gICAgICAgIGxldCBub2RlO1xyXG4gICAgICAgIGlmICh0eXBlb2YgZWxzID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBsZXQgZG9jID0gZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCcnKTsgLy8gSUUgbmVlZHMgYSBwYXJhbVxyXG4gICAgICAgICAgICBkb2MuYm9keS5pbm5lckhUTUwgPSBlbHM7XHJcbiAgICAgICAgICAgIGVsID0gZG9jLmJvZHkuY2hpbGRyZW5bMF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDAgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMSAmJiBpc0dyaWRTdGFja1dpZGdldChlbHMpKSB7XHJcbiAgICAgICAgICAgIG5vZGUgPSBvcHRpb25zID0gZWxzO1xyXG4gICAgICAgICAgICBpZiAobm9kZSA9PT0gbnVsbCB8fCBub2RlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBub2RlLmVsKSB7XHJcbiAgICAgICAgICAgICAgICBlbCA9IG5vZGUuZWw7IC8vIHJlLXVzZSBlbGVtZW50IHN0b3JlZCBpbiB0aGUgbm9kZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMub3B0cy5hZGRSZW1vdmVDQikge1xyXG4gICAgICAgICAgICAgICAgZWwgPSB0aGlzLm9wdHMuYWRkUmVtb3ZlQ0IodGhpcy5lbCwgb3B0aW9ucywgdHJ1ZSwgZmFsc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmNvbnRlbnQpIHx8ICcnO1xyXG4gICAgICAgICAgICAgICAgbGV0IGRvYyA9IGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgnJyk7IC8vIElFIG5lZWRzIGEgcGFyYW1cclxuICAgICAgICAgICAgICAgIGRvYy5ib2R5LmlubmVySFRNTCA9IGA8ZGl2IGNsYXNzPVwiZ3JpZC1zdGFjay1pdGVtICR7dGhpcy5vcHRzLml0ZW1DbGFzcyB8fCAnJ31cIj48ZGl2IGNsYXNzPVwiZ3JpZC1zdGFjay1pdGVtLWNvbnRlbnRcIj4ke2NvbnRlbnR9PC9kaXY+PC9kaXY+YDtcclxuICAgICAgICAgICAgICAgIGVsID0gZG9jLmJvZHkuY2hpbGRyZW5bMF07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGVsID0gZWxzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWVsKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgLy8gVGVtcHRpbmcgdG8gaW5pdGlhbGl6ZSB0aGUgcGFzc2VkIGluIG9wdCB3aXRoIGRlZmF1bHQgYW5kIHZhbGlkIHZhbHVlcywgYnV0IHRoaXMgYnJlYWsga25vY2tvdXQgZGVtb3NcclxuICAgICAgICAvLyBhcyB0aGUgYWN0dWFsIHZhbHVlIGFyZSBmaWxsZWQgaW4gd2hlbiBfcHJlcGFyZUVsZW1lbnQoKSBjYWxscyBlbC5nZXRBdHRyaWJ1dGUoJ2dzLXh5eicpIGJlZm9yZSBhZGRpbmcgdGhlIG5vZGUuXHJcbiAgICAgICAgLy8gU28gbWFrZSBzdXJlIHdlIGxvYWQgYW55IERPTSBhdHRyaWJ1dGVzIHRoYXQgYXJlIG5vdCBzcGVjaWZpZWQgaW4gcGFzc2VkIGluIG9wdGlvbnMgKHdoaWNoIG92ZXJyaWRlKVxyXG4gICAgICAgIGxldCBkb21BdHRyID0gdGhpcy5fcmVhZEF0dHIoZWwpO1xyXG4gICAgICAgIG9wdGlvbnMgPSB1dGlsc18xLlV0aWxzLmNsb25lRGVlcChvcHRpb25zKSB8fCB7fTsgLy8gbWFrZSBhIGNvcHkgYmVmb3JlIHdlIG1vZGlmeSBpbiBjYXNlIGNhbGxlciByZS11c2VzIGl0XHJcbiAgICAgICAgdXRpbHNfMS5VdGlscy5kZWZhdWx0cyhvcHRpb25zLCBkb21BdHRyKTtcclxuICAgICAgICBub2RlID0gdGhpcy5lbmdpbmUucHJlcGFyZU5vZGUob3B0aW9ucyk7XHJcbiAgICAgICAgdGhpcy5fd3JpdGVBdHRyKGVsLCBvcHRpb25zKTtcclxuICAgICAgICBpZiAodGhpcy5faW5zZXJ0Tm90QXBwZW5kKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZWwucHJlcGVuZChlbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmVsLmFwcGVuZENoaWxkKGVsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gc2ltaWxhciB0byBtYWtlV2lkZ2V0KCkgdGhhdCBkb2Vzbid0IHJlYWQgYXR0ciBhZ2FpbiBhbmQgd29yc2UgcmUtY3JlYXRlIGEgbmV3IG5vZGUgYW5kIGxvb3NlIGFueSBfaWRcclxuICAgICAgICB0aGlzLl9wcmVwYXJlRWxlbWVudChlbCwgdHJ1ZSwgb3B0aW9ucyk7XHJcbiAgICAgICAgdGhpcy5fdXBkYXRlQ29udGFpbmVySGVpZ2h0KCk7XHJcbiAgICAgICAgLy8gc2VlIGlmIHRoZXJlIGlzIGEgc3ViLWdyaWQgdG8gY3JlYXRlXHJcbiAgICAgICAgaWYgKG5vZGUuc3ViR3JpZCkge1xyXG4gICAgICAgICAgICB0aGlzLm1ha2VTdWJHcmlkKG5vZGUuZWwsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBmYWxzZSk7IC8vbm9kZS5zdWJHcmlkIHdpbGwgYmUgdXNlZCBhcyBvcHRpb24gaW4gbWV0aG9kLCBubyBuZWVkIHRvIHBhc3NcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gaWYgd2UncmUgYWRkaW5nIGFuIGl0ZW0gaW50byAxIGNvbHVtbiAoX3ByZXZDb2x1bW4gaXMgc2V0IG9ubHkgd2hlbiBnb2luZyB0byAxKSBtYWtlIHN1cmVcclxuICAgICAgICAvLyB3ZSBkb24ndCBvdmVycmlkZSB0aGUgbGFyZ2VyIDEyIGNvbHVtbiBsYXlvdXQgdGhhdCB3YXMgYWxyZWFkeSBzYXZlZC4gIzE5ODVcclxuICAgICAgICBpZiAodGhpcy5fcHJldkNvbHVtbiAmJiB0aGlzLm9wdHMuY29sdW1uID09PSAxKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2lnbm9yZUxheW91dHNOb2RlQ2hhbmdlID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fdHJpZ2dlckFkZEV2ZW50KCk7XHJcbiAgICAgICAgdGhpcy5fdHJpZ2dlckNoYW5nZUV2ZW50KCk7XHJcbiAgICAgICAgZGVsZXRlIHRoaXMuX2lnbm9yZUxheW91dHNOb2RlQ2hhbmdlO1xyXG4gICAgICAgIHJldHVybiBlbDtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ29udmVydCBhbiBleGlzdGluZyBncmlkSXRlbSBlbGVtZW50IGludG8gYSBzdWItZ3JpZCB3aXRoIHRoZSBnaXZlbiAob3B0aW9uYWwpIG9wdGlvbnMsIGVsc2UgaW5oZXJpdCB0aGVtXHJcbiAgICAgKiBmcm9tIHRoZSBwYXJlbnQncyBzdWJHcmlkIG9wdGlvbnMuXHJcbiAgICAgKiBAcGFyYW0gZWwgZ3JpZEl0ZW0gZWxlbWVudCB0byBjb252ZXJ0XHJcbiAgICAgKiBAcGFyYW0gb3BzIChvcHRpb25hbCkgc3ViLWdyaWQgb3B0aW9ucywgZWxzZSBkZWZhdWx0IHRvIG5vZGUsIHRoZW4gcGFyZW50IHNldHRpbmdzLCBlbHNlIGRlZmF1bHRzXHJcbiAgICAgKiBAcGFyYW0gbm9kZVRvQWRkIChvcHRpb25hbCkgbm9kZSB0byBhZGQgdG8gdGhlIG5ld2x5IGNyZWF0ZWQgc3ViIGdyaWQgKHVzZWQgd2hlbiBkcmFnZ2luZyBvdmVyIGV4aXN0aW5nIHJlZ3VsYXIgaXRlbSlcclxuICAgICAqIEByZXR1cm5zIG5ld2x5IGNyZWF0ZWQgZ3JpZFxyXG4gICAgICovXHJcbiAgICBtYWtlU3ViR3JpZChlbCwgb3BzLCBub2RlVG9BZGQsIHNhdmVDb250ZW50ID0gdHJ1ZSkge1xyXG4gICAgICAgIHZhciBfYSwgX2IsIF9jO1xyXG4gICAgICAgIGxldCBub2RlID0gZWwuZ3JpZHN0YWNrTm9kZTtcclxuICAgICAgICBpZiAoIW5vZGUpIHtcclxuICAgICAgICAgICAgbm9kZSA9IHRoaXMubWFrZVdpZGdldChlbCkuZ3JpZHN0YWNrTm9kZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKChfYSA9IG5vZGUuc3ViR3JpZCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmVsKVxyXG4gICAgICAgICAgICByZXR1cm4gbm9kZS5zdWJHcmlkOyAvLyBhbHJlYWR5IGRvbmVcclxuICAgICAgICAvLyBmaW5kIHRoZSB0ZW1wbGF0ZSBzdWJHcmlkIHN0b3JlZCBvbiBhIHBhcmVudCBhcyBmYWxsYmFjay4uLlxyXG4gICAgICAgIGxldCBzdWJHcmlkVGVtcGxhdGU7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xyXG4gICAgICAgIGxldCBncmlkID0gdGhpcztcclxuICAgICAgICB3aGlsZSAoZ3JpZCAmJiAhc3ViR3JpZFRlbXBsYXRlKSB7XHJcbiAgICAgICAgICAgIHN1YkdyaWRUZW1wbGF0ZSA9IChfYiA9IGdyaWQub3B0cykgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLnN1YkdyaWQ7XHJcbiAgICAgICAgICAgIGdyaWQgPSAoX2MgPSBncmlkLnBhcmVudEdyaWRJdGVtKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MuZ3JpZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8uLi4gYW5kIHNldCB0aGUgY3JlYXRlIG9wdGlvbnNcclxuICAgICAgICBvcHMgPSB1dGlsc18xLlV0aWxzLmNsb25lRGVlcChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgKHN1YkdyaWRUZW1wbGF0ZSB8fCB7fSkpLCB7IGNoaWxkcmVuOiB1bmRlZmluZWQgfSksIChvcHMgfHwgbm9kZS5zdWJHcmlkKSkpO1xyXG4gICAgICAgIG5vZGUuc3ViR3JpZCA9IG9wcztcclxuICAgICAgICAvLyBpZiBjb2x1bW4gc3BlY2lhbCBjYXNlIGl0IHNldCwgcmVtZW1iZXIgdGhhdCBmbGFnIGFuZCBzZXQgZGVmYXVsdFxyXG4gICAgICAgIGxldCBhdXRvQ29sdW1uO1xyXG4gICAgICAgIGlmIChvcHMuY29sdW1uID09PSAnYXV0bycpIHtcclxuICAgICAgICAgICAgYXV0b0NvbHVtbiA9IHRydWU7XHJcbiAgICAgICAgICAgIG9wcy5jb2x1bW4gPSBNYXRoLm1heChub2RlLncgfHwgMSwgKG5vZGVUb0FkZCA9PT0gbnVsbCB8fCBub2RlVG9BZGQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG5vZGVUb0FkZC53KSB8fCAxKTtcclxuICAgICAgICAgICAgb3BzLmRpc2FibGVPbmVDb2x1bW5Nb2RlID0gdHJ1ZTsgLy8gZHJpdmVuIGJ5IHBhcmVudFxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBpZiB3ZSdyZSBjb252ZXJ0aW5nIGFuIGV4aXN0aW5nIGZ1bGwgaXRlbSwgbW92ZSBvdmVyIHRoZSBjb250ZW50IHRvIGJlIHRoZSBmaXJzdCBzdWIgaXRlbSBpbiB0aGUgbmV3IGdyaWRcclxuICAgICAgICBsZXQgY29udGVudCA9IG5vZGUuZWwucXVlcnlTZWxlY3RvcignLmdyaWQtc3RhY2staXRlbS1jb250ZW50Jyk7XHJcbiAgICAgICAgbGV0IG5ld0l0ZW07XHJcbiAgICAgICAgbGV0IG5ld0l0ZW1PcHQ7XHJcbiAgICAgICAgaWYgKHNhdmVDb250ZW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3JlbW92ZUREKG5vZGUuZWwpOyAvLyByZW1vdmUgRCZEIHNpbmNlIGl0J3Mgc2V0IG9uIGNvbnRlbnQgZGl2XHJcbiAgICAgICAgICAgIG5ld0l0ZW1PcHQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG5vZGUpLCB7IHg6IDAsIHk6IDAgfSk7XHJcbiAgICAgICAgICAgIHV0aWxzXzEuVXRpbHMucmVtb3ZlSW50ZXJuYWxGb3JTYXZlKG5ld0l0ZW1PcHQpO1xyXG4gICAgICAgICAgICBkZWxldGUgbmV3SXRlbU9wdC5zdWJHcmlkO1xyXG4gICAgICAgICAgICBpZiAobm9kZS5jb250ZW50KSB7XHJcbiAgICAgICAgICAgICAgICBuZXdJdGVtT3B0LmNvbnRlbnQgPSBub2RlLmNvbnRlbnQ7XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgbm9kZS5jb250ZW50O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdHMuYWRkUmVtb3ZlQ0IpIHtcclxuICAgICAgICAgICAgICAgIG5ld0l0ZW0gPSB0aGlzLm9wdHMuYWRkUmVtb3ZlQ0IodGhpcy5lbCwgbmV3SXRlbU9wdCwgdHJ1ZSwgZmFsc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbGV0IGRvYyA9IGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgnJyk7IC8vIElFIG5lZWRzIGEgcGFyYW1cclxuICAgICAgICAgICAgICAgIGRvYy5ib2R5LmlubmVySFRNTCA9IGA8ZGl2IGNsYXNzPVwiZ3JpZC1zdGFjay1pdGVtXCI+PC9kaXY+YDtcclxuICAgICAgICAgICAgICAgIG5ld0l0ZW0gPSBkb2MuYm9keS5jaGlsZHJlblswXTtcclxuICAgICAgICAgICAgICAgIG5ld0l0ZW0uYXBwZW5kQ2hpbGQoY29udGVudCk7XHJcbiAgICAgICAgICAgICAgICBkb2MuYm9keS5pbm5lckhUTUwgPSBgPGRpdiBjbGFzcz1cImdyaWQtc3RhY2staXRlbS1jb250ZW50XCI+PC9kaXY+YDtcclxuICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBkb2MuYm9keS5jaGlsZHJlblswXTtcclxuICAgICAgICAgICAgICAgIG5vZGUuZWwuYXBwZW5kQ2hpbGQoY29udGVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fcHJlcGFyZURyYWdEcm9wQnlOb2RlKG5vZGUpOyAvLyAuLi4gYW5kIHJlc3RvcmUgb3JpZ2luYWwgRCZEXHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGlmIHdlJ3JlIGFkZGluZyBhbiBhZGRpdGlvbmFsIGl0ZW0sIG1ha2UgdGhlIGNvbnRhaW5lciBsYXJnZSBlbm91Z2ggdG8gaGF2ZSB0aGVtIGJvdGhcclxuICAgICAgICBpZiAobm9kZVRvQWRkKSB7XHJcbiAgICAgICAgICAgIGxldCB3ID0gYXV0b0NvbHVtbiA/IG9wcy5jb2x1bW4gOiBub2RlLnc7XHJcbiAgICAgICAgICAgIGxldCBoID0gbm9kZS5oICsgbm9kZVRvQWRkLmg7XHJcbiAgICAgICAgICAgIGxldCBzdHlsZSA9IG5vZGUuZWwuc3R5bGU7XHJcbiAgICAgICAgICAgIHN0eWxlLnRyYW5zaXRpb24gPSAnbm9uZSc7IC8vIHNob3cgdXAgaW5zdGFudGx5IHNvIHdlIGRvbid0IHNlZSBzY3JvbGxiYXIgd2l0aCBub2RlVG9BZGRcclxuICAgICAgICAgICAgdGhpcy51cGRhdGUobm9kZS5lbCwgeyB3LCBoIH0pO1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHN0eWxlLnRyYW5zaXRpb24gPSBudWxsKTsgLy8gcmVjb3ZlciBhbmltYXRpb25cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMub3B0cy5hZGRSZW1vdmVDQikge1xyXG4gICAgICAgICAgICBvcHMuYWRkUmVtb3ZlQ0IgPSBvcHMuYWRkUmVtb3ZlQ0IgfHwgdGhpcy5vcHRzLmFkZFJlbW92ZUNCO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgc3ViR3JpZCA9IG5vZGUuc3ViR3JpZCA9IEdyaWRTdGFjay5hZGRHcmlkKGNvbnRlbnQsIG9wcyk7XHJcbiAgICAgICAgaWYgKG5vZGVUb0FkZCA9PT0gbnVsbCB8fCBub2RlVG9BZGQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG5vZGVUb0FkZC5fbW92aW5nKVxyXG4gICAgICAgICAgICBzdWJHcmlkLl9pc1RlbXAgPSB0cnVlOyAvLyBwcmV2ZW50IHJlLW5lc3RpbmcgYXMgd2UgYWRkIG92ZXJcclxuICAgICAgICBpZiAoYXV0b0NvbHVtbilcclxuICAgICAgICAgICAgc3ViR3JpZC5fYXV0b0NvbHVtbiA9IHRydWU7XHJcbiAgICAgICAgLy8gYWRkIHRoZSBvcmlnaW5hbCBjb250ZW50IGJhY2sgYXMgYSBjaGlsZCBvZiBodGUgbmV3bHkgY3JlYXRlZCBncmlkXHJcbiAgICAgICAgaWYgKHNhdmVDb250ZW50KSB7XHJcbiAgICAgICAgICAgIHN1YkdyaWQuYWRkV2lkZ2V0KG5ld0l0ZW0sIG5ld0l0ZW1PcHQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBub3cgYWRkIGFueSBhZGRpdGlvbmFsIG5vZGVcclxuICAgICAgICBpZiAobm9kZVRvQWRkKSB7XHJcbiAgICAgICAgICAgIGlmIChub2RlVG9BZGQuX21vdmluZykge1xyXG4gICAgICAgICAgICAgICAgLy8gY3JlYXRlIGFuIGFydGlmaWNpYWwgZXZlbnQgZXZlbiBmb3IgdGhlIGp1c3QgY3JlYXRlZCBncmlkIHRvIHJlY2VpdmUgdGhpcyBpdGVtXHJcbiAgICAgICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB1dGlsc18xLlV0aWxzLnNpbXVsYXRlTW91c2VFdmVudChub2RlVG9BZGQuX2V2ZW50LCAnbW91c2VlbnRlcicsIHN1YkdyaWQuZWwpLCAwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHN1YkdyaWQuYWRkV2lkZ2V0KG5vZGUuZWwsIG5vZGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzdWJHcmlkO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBjYWxsZWQgd2hlbiBhbiBpdGVtIHdhcyBjb252ZXJ0ZWQgaW50byBhIG5lc3RlZCBncmlkIHRvIGFjY29tbW9kYXRlIGEgZHJhZ2dlZCBvdmVyIGl0ZW0sIGJ1dCB0aGVuIGl0ZW0gbGVhdmVzIC0gcmV0dXJuIGJhY2tcclxuICAgICAqIHRvIHRoZSBvcmlnaW5hbCBncmlkLWl0ZW0uIEFsc28gY2FsbGVkIHRvIHJlbW92ZSBlbXB0eSBzdWItZ3JpZHMgd2hlbiBsYXN0IGl0ZW0gaXMgZHJhZ2dlZCBvdXQgKHNpbmNlIHJlLWNyZWF0aW5nIGlzIHNpbXBsZSlcclxuICAgICAqL1xyXG4gICAgcmVtb3ZlQXNTdWJHcmlkKG5vZGVUaGF0UmVtb3ZlZCkge1xyXG4gICAgICAgIHZhciBfYTtcclxuICAgICAgICBsZXQgcEdyaWQgPSAoX2EgPSB0aGlzLnBhcmVudEdyaWRJdGVtKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZ3JpZDtcclxuICAgICAgICBpZiAoIXBHcmlkKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgcEdyaWQuYmF0Y2hVcGRhdGUoKTtcclxuICAgICAgICBwR3JpZC5yZW1vdmVXaWRnZXQodGhpcy5wYXJlbnRHcmlkSXRlbS5lbCwgdHJ1ZSwgdHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5lbmdpbmUubm9kZXMuZm9yRWFjaChuID0+IHtcclxuICAgICAgICAgICAgLy8gbWlncmF0ZSBhbnkgY2hpbGRyZW4gb3ZlciBhbmQgb2Zmc2V0dGluZyBieSBvdXIgbG9jYXRpb25cclxuICAgICAgICAgICAgbi54ICs9IHRoaXMucGFyZW50R3JpZEl0ZW0ueDtcclxuICAgICAgICAgICAgbi55ICs9IHRoaXMucGFyZW50R3JpZEl0ZW0ueTtcclxuICAgICAgICAgICAgcEdyaWQuYWRkV2lkZ2V0KG4uZWwsIG4pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHBHcmlkLmJhdGNoVXBkYXRlKGZhbHNlKTtcclxuICAgICAgICBpZiAodGhpcy5wYXJlbnRHcmlkSXRlbSlcclxuICAgICAgICAgICAgZGVsZXRlIHRoaXMucGFyZW50R3JpZEl0ZW0uc3ViR3JpZDtcclxuICAgICAgICBkZWxldGUgdGhpcy5wYXJlbnRHcmlkSXRlbTtcclxuICAgICAgICAvLyBjcmVhdGUgYW4gYXJ0aWZpY2lhbCBldmVudCBmb3IgdGhlIG9yaWdpbmFsIGdyaWQgbm93IHRoYXQgdGhpcyBvbmUgaXMgZ29uZSAoZ290IGEgbGVhdmUsIGJ1dCB3b24ndCBnZXQgZW50ZXIpXHJcbiAgICAgICAgaWYgKG5vZGVUaGF0UmVtb3ZlZCkge1xyXG4gICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB1dGlsc18xLlV0aWxzLnNpbXVsYXRlTW91c2VFdmVudChub2RlVGhhdFJlbW92ZWQuX2V2ZW50LCAnbW91c2VlbnRlcicsIHBHcmlkLmVsKSwgMCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAvKipcclxuICAgICAqIHNhdmVzIHRoZSBjdXJyZW50IGxheW91dCByZXR1cm5pbmcgYSBsaXN0IG9mIHdpZGdldHMgZm9yIHNlcmlhbGl6YXRpb24gd2hpY2ggbWlnaHQgaW5jbHVkZSBhbnkgbmVzdGVkIGdyaWRzLlxyXG4gICAgICogQHBhcmFtIHNhdmVDb250ZW50IGlmIHRydWUgKGRlZmF1bHQpIHRoZSBsYXRlc3QgaHRtbCBpbnNpZGUgLmdyaWQtc3RhY2stY29udGVudCB3aWxsIGJlIHNhdmVkIHRvIEdyaWRTdGFja1dpZGdldC5jb250ZW50IGZpZWxkLCBlbHNlIGl0IHdpbGxcclxuICAgICAqIGJlIHJlbW92ZWQuXHJcbiAgICAgKiBAcGFyYW0gc2F2ZUdyaWRPcHQgaWYgdHJ1ZSAoZGVmYXVsdCBmYWxzZSksIHNhdmUgdGhlIGdyaWQgb3B0aW9ucyBpdHNlbGYsIHNvIHlvdSBjYW4gY2FsbCB0aGUgbmV3IEdyaWRTdGFjay5hZGRHcmlkKClcclxuICAgICAqIHRvIHJlY3JlYXRlIGV2ZXJ5dGhpbmcgZnJvbSBzY3JhdGNoLiBHcmlkU3RhY2tPcHRpb25zLmNoaWxkcmVuIHdvdWxkIHRoZW4gY29udGFpbiB0aGUgd2lkZ2V0IGxpc3QgaW5zdGVhZC5cclxuICAgICAqIEByZXR1cm5zIGxpc3Qgb2Ygd2lkZ2V0cyBvciBmdWxsIGdyaWQgb3B0aW9uLCBpbmNsdWRpbmcgLmNoaWxkcmVuIGxpc3Qgb2Ygd2lkZ2V0c1xyXG4gICAgICovXHJcbiAgICBzYXZlKHNhdmVDb250ZW50ID0gdHJ1ZSwgc2F2ZUdyaWRPcHQgPSBmYWxzZSkge1xyXG4gICAgICAgIC8vIHJldHVybiBjb3BpZWQgbm9kZXMgd2UgY2FuIG1vZGlmeSBhdCB3aWxsLi4uXHJcbiAgICAgICAgbGV0IGxpc3QgPSB0aGlzLmVuZ2luZS5zYXZlKHNhdmVDb250ZW50KTtcclxuICAgICAgICAvLyBjaGVjayBmb3IgSFRNTCBjb250ZW50IGFuZCBuZXN0ZWQgZ3JpZHNcclxuICAgICAgICBsaXN0LmZvckVhY2gobiA9PiB7XHJcbiAgICAgICAgICAgIHZhciBfYTtcclxuICAgICAgICAgICAgaWYgKHNhdmVDb250ZW50ICYmIG4uZWwgJiYgIW4uc3ViR3JpZCkgeyAvLyBzdWItZ3JpZCBhcmUgc2F2ZWQgZGlmZmVyZW50bHksIG5vdCBwbGFpbiBjb250ZW50XHJcbiAgICAgICAgICAgICAgICBsZXQgc3ViID0gbi5lbC5xdWVyeVNlbGVjdG9yKCcuZ3JpZC1zdGFjay1pdGVtLWNvbnRlbnQnKTtcclxuICAgICAgICAgICAgICAgIG4uY29udGVudCA9IHN1YiA/IHN1Yi5pbm5lckhUTUwgOiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICBpZiAoIW4uY29udGVudClcclxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgbi5jb250ZW50O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFzYXZlQ29udGVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBuLmNvbnRlbnQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyBjaGVjayBmb3IgbmVzdGVkIGdyaWRcclxuICAgICAgICAgICAgICAgIGlmICgoX2EgPSBuLnN1YkdyaWQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5lbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpc3RPck9wdCA9IG4uc3ViR3JpZC5zYXZlKHNhdmVDb250ZW50LCBzYXZlR3JpZE9wdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgbi5zdWJHcmlkID0gKHNhdmVHcmlkT3B0ID8gbGlzdE9yT3B0IDogeyBjaGlsZHJlbjogbGlzdE9yT3B0IH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGRlbGV0ZSBuLmVsO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vIGNoZWNrIGlmIHNhdmUgZW50aXJlIGdyaWQgb3B0aW9ucyAobmVlZGVkIGZvciByZWN1cnNpdmUpICsgY2hpbGRyZW4uLi5cclxuICAgICAgICBpZiAoc2F2ZUdyaWRPcHQpIHtcclxuICAgICAgICAgICAgbGV0IG8gPSB1dGlsc18xLlV0aWxzLmNsb25lRGVlcCh0aGlzLm9wdHMpO1xyXG4gICAgICAgICAgICAvLyBkZWxldGUgZGVmYXVsdCB2YWx1ZXMgdGhhdCB3aWxsIGJlIHJlY3JlYXRlZCBvbiBsYXVuY2hcclxuICAgICAgICAgICAgaWYgKG8ubWFyZ2luQm90dG9tID09PSBvLm1hcmdpblRvcCAmJiBvLm1hcmdpblJpZ2h0ID09PSBvLm1hcmdpbkxlZnQgJiYgby5tYXJnaW5Ub3AgPT09IG8ubWFyZ2luUmlnaHQpIHtcclxuICAgICAgICAgICAgICAgIG8ubWFyZ2luID0gby5tYXJnaW5Ub3A7XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgby5tYXJnaW5Ub3A7XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgby5tYXJnaW5SaWdodDtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSBvLm1hcmdpbkJvdHRvbTtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSBvLm1hcmdpbkxlZnQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKG8ucnRsID09PSAodGhpcy5lbC5zdHlsZS5kaXJlY3Rpb24gPT09ICdydGwnKSkge1xyXG4gICAgICAgICAgICAgICAgby5ydGwgPSAnYXV0byc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRoaXMuX2lzQXV0b0NlbGxIZWlnaHQpIHtcclxuICAgICAgICAgICAgICAgIG8uY2VsbEhlaWdodCA9ICdhdXRvJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGhpcy5fYXV0b0NvbHVtbikge1xyXG4gICAgICAgICAgICAgICAgby5jb2x1bW4gPSAnYXV0byc7XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgby5kaXNhYmxlT25lQ29sdW1uTW9kZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBvcmlnU2hvdyA9IG8uX2Fsd2F5c1Nob3dSZXNpemVIYW5kbGU7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBvLl9hbHdheXNTaG93UmVzaXplSGFuZGxlO1xyXG4gICAgICAgICAgICBpZiAob3JpZ1Nob3cgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgby5hbHdheXNTaG93UmVzaXplSGFuZGxlID0gb3JpZ1Nob3c7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgby5hbHdheXNTaG93UmVzaXplSGFuZGxlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHV0aWxzXzEuVXRpbHMucmVtb3ZlSW50ZXJuYWxBbmRTYW1lKG8sIHR5cGVzXzEuZ3JpZERlZmF1bHRzKTtcclxuICAgICAgICAgICAgby5jaGlsZHJlbiA9IGxpc3Q7XHJcbiAgICAgICAgICAgIHJldHVybiBvO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbGlzdDtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogbG9hZCB0aGUgd2lkZ2V0cyBmcm9tIGEgbGlzdC4gVGhpcyB3aWxsIGNhbGwgdXBkYXRlKCkgb24gZWFjaCAobWF0Y2hpbmcgYnkgaWQpIG9yIGFkZC9yZW1vdmUgd2lkZ2V0cyB0aGF0IGFyZSBub3QgdGhlcmUuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGxheW91dCBsaXN0IG9mIHdpZGdldHMgZGVmaW5pdGlvbiB0byB1cGRhdGUvY3JlYXRlXHJcbiAgICAgKiBAcGFyYW0gYWRkQW5kUmVtb3ZlIGJvb2xlYW4gKGRlZmF1bHQgdHJ1ZSkgb3IgY2FsbGJhY2sgbWV0aG9kIGNhbiBiZSBwYXNzZWQgdG8gY29udHJvbCBpZiBhbmQgaG93IG1pc3Npbmcgd2lkZ2V0cyBjYW4gYmUgYWRkZWQvcmVtb3ZlZCwgZ2l2aW5nXHJcbiAgICAgKiB0aGUgdXNlciBjb250cm9sIG9mIGluc2VydGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogc2VlIGh0dHA6Ly9ncmlkc3RhY2tqcy5jb20vZGVtby9zZXJpYWxpemF0aW9uLmh0bWxcclxuICAgICAqKi9cclxuICAgIGxvYWQobGF5b3V0LCBhZGRSZW1vdmUgPSB0aGlzLm9wdHMuYWRkUmVtb3ZlQ0IgfHwgdHJ1ZSkge1xyXG4gICAgICAgIGxldCBpdGVtcyA9IEdyaWRTdGFjay5VdGlscy5zb3J0KFsuLi5sYXlvdXRdLCAtMSwgdGhpcy5fcHJldkNvbHVtbiB8fCB0aGlzLmdldENvbHVtbigpKTsgLy8gbWFrZSBjb3B5IGJlZm9yZSB3ZSBtb2Qvc29ydFxyXG4gICAgICAgIHRoaXMuX2luc2VydE5vdEFwcGVuZCA9IHRydWU7IC8vIHNpbmNlIGNyZWF0ZSBpbiByZXZlcnNlIG9yZGVyLi4uXHJcbiAgICAgICAgLy8gaWYgd2UncmUgbG9hZGluZyBhIGxheW91dCBpbnRvIGZvciBleGFtcGxlIDEgY29sdW1uIChfcHJldkNvbHVtbiBpcyBzZXQgb25seSB3aGVuIGdvaW5nIHRvIDEpIGFuZCBpdGVtcyBkb24ndCBmaXQsIG1ha2Ugc3VyZSB0byBzYXZlXHJcbiAgICAgICAgLy8gdGhlIG9yaWdpbmFsIHdhbnRlZCBsYXlvdXQgc28gd2UgY2FuIHNjYWxlIGJhY2sgdXAgY29ycmVjdGx5ICMxNDcxXHJcbiAgICAgICAgaWYgKHRoaXMuX3ByZXZDb2x1bW4gJiYgdGhpcy5fcHJldkNvbHVtbiAhPT0gdGhpcy5vcHRzLmNvbHVtbiAmJiBpdGVtcy5zb21lKG4gPT4gKG4ueCArIG4udykgPiB0aGlzLm9wdHMuY29sdW1uKSkge1xyXG4gICAgICAgICAgICB0aGlzLl9pZ25vcmVMYXlvdXRzTm9kZUNoYW5nZSA9IHRydWU7IC8vIHNraXAgbGF5b3V0IHVwZGF0ZVxyXG4gICAgICAgICAgICB0aGlzLmVuZ2luZS5jYWNoZUxheW91dChpdGVtcywgdGhpcy5fcHJldkNvbHVtbiwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGlmIGdpdmVuIGEgZGlmZmVyZW50IGNhbGxiYWNrLCB0ZW1wb3JhbGx5IHNldCBpdCBhcyBnbG9iYWwgb3B0aW9uIHRvIGNyZWF0aW5nIHdpbGwgdXNlIGl0XHJcbiAgICAgICAgY29uc3QgcHJldkNCID0gdGhpcy5vcHRzLmFkZFJlbW92ZUNCO1xyXG4gICAgICAgIGlmICh0eXBlb2YgKGFkZFJlbW92ZSkgPT09ICdmdW5jdGlvbicpXHJcbiAgICAgICAgICAgIHRoaXMub3B0cy5hZGRSZW1vdmVDQiA9IGFkZFJlbW92ZTtcclxuICAgICAgICBsZXQgcmVtb3ZlZCA9IFtdO1xyXG4gICAgICAgIHRoaXMuYmF0Y2hVcGRhdGUoKTtcclxuICAgICAgICAvLyBzZWUgaWYgYW55IGl0ZW1zIGFyZSBtaXNzaW5nIGZyb20gbmV3IGxheW91dCBhbmQgbmVlZCB0byBiZSByZW1vdmVkIGZpcnN0XHJcbiAgICAgICAgaWYgKGFkZFJlbW92ZSkge1xyXG4gICAgICAgICAgICBsZXQgY29weU5vZGVzID0gWy4uLnRoaXMuZW5naW5lLm5vZGVzXTsgLy8gZG9uJ3QgbG9vcCB0aHJvdWdoIGFycmF5IHlvdSBtb2RpZnlcclxuICAgICAgICAgICAgY29weU5vZGVzLmZvckVhY2gobiA9PiB7XHJcbiAgICAgICAgICAgICAgICBsZXQgaXRlbSA9IGl0ZW1zLmZpbmQodyA9PiBuLmlkID09PSB3LmlkKTtcclxuICAgICAgICAgICAgICAgIGlmICghaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdHMuYWRkUmVtb3ZlQ0IpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0cy5hZGRSZW1vdmVDQih0aGlzLmVsLCBuLCBmYWxzZSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZWQucHVzaChuKTsgLy8gYmF0Y2gga2VlcCB0cmFja1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlV2lkZ2V0KG4uZWwsIHRydWUsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIG5vdyBhZGQvdXBkYXRlIHRoZSB3aWRnZXRzXHJcbiAgICAgICAgaXRlbXMuZm9yRWFjaCh3ID0+IHtcclxuICAgICAgICAgICAgbGV0IGl0ZW0gPSAody5pZCB8fCB3LmlkID09PSAwKSA/IHRoaXMuZW5naW5lLm5vZGVzLmZpbmQobiA9PiBuLmlkID09PSB3LmlkKSA6IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgaWYgKGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlKGl0ZW0uZWwsIHcpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHcuc3ViR3JpZCAmJiB3LnN1YkdyaWQuY2hpbGRyZW4pIHsgLy8gdXBkYXRlIGFueSBzdWIgZ3JpZCBhcyB3ZWxsXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHN1YiA9IGl0ZW0uZWwucXVlcnlTZWxlY3RvcignLmdyaWQtc3RhY2snKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc3ViICYmIHN1Yi5ncmlkc3RhY2spIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3ViLmdyaWRzdGFjay5sb2FkKHcuc3ViR3JpZC5jaGlsZHJlbik7IC8vIFRPRE86IHN1cHBvcnQgdXBkYXRpbmcgZ3JpZCBvcHRpb25zID9cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5zZXJ0Tm90QXBwZW5kID0gdHJ1ZTsgLy8gZ290IHJlc2V0IGJ5IGFib3ZlIGNhbGxcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoYWRkUmVtb3ZlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFdpZGdldCh3KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuZW5naW5lLnJlbW92ZWROb2RlcyA9IHJlbW92ZWQ7XHJcbiAgICAgICAgdGhpcy5iYXRjaFVwZGF0ZShmYWxzZSk7XHJcbiAgICAgICAgLy8gYWZ0ZXIgY29tbWl0LCBjbGVhciB0aGF0IGZsYWdcclxuICAgICAgICBkZWxldGUgdGhpcy5faWdub3JlTGF5b3V0c05vZGVDaGFuZ2U7XHJcbiAgICAgICAgZGVsZXRlIHRoaXMuX2luc2VydE5vdEFwcGVuZDtcclxuICAgICAgICBwcmV2Q0IgPyB0aGlzLm9wdHMuYWRkUmVtb3ZlQ0IgPSBwcmV2Q0IgOiBkZWxldGUgdGhpcy5vcHRzLmFkZFJlbW92ZUNCO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiB1c2UgYmVmb3JlIGNhbGxpbmcgYSBidW5jaCBvZiBgYWRkV2lkZ2V0KClgIHRvIHByZXZlbnQgdW4tbmVjZXNzYXJ5IHJlbGF5b3V0cyBpbiBiZXR3ZWVuIChtb3JlIGVmZmljaWVudClcclxuICAgICAqIGFuZCBnZXQgYSBzaW5nbGUgZXZlbnQgY2FsbGJhY2suIFlvdSB3aWxsIHNlZSBubyBjaGFuZ2VzIHVudGlsIGBiYXRjaFVwZGF0ZShmYWxzZSlgIGlzIGNhbGxlZC5cclxuICAgICAqL1xyXG4gICAgYmF0Y2hVcGRhdGUoZmxhZyA9IHRydWUpIHtcclxuICAgICAgICB0aGlzLmVuZ2luZS5iYXRjaFVwZGF0ZShmbGFnKTtcclxuICAgICAgICBpZiAoIWZsYWcpIHtcclxuICAgICAgICAgICAgdGhpcy5fdHJpZ2dlclJlbW92ZUV2ZW50KCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3RyaWdnZXJBZGRFdmVudCgpO1xyXG4gICAgICAgICAgICB0aGlzLl90cmlnZ2VyQ2hhbmdlRXZlbnQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEdldHMgY3VycmVudCBjZWxsIGhlaWdodC5cclxuICAgICAqL1xyXG4gICAgZ2V0Q2VsbEhlaWdodChmb3JjZVBpeGVsID0gZmFsc2UpIHtcclxuICAgICAgICBpZiAodGhpcy5vcHRzLmNlbGxIZWlnaHQgJiYgdGhpcy5vcHRzLmNlbGxIZWlnaHQgIT09ICdhdXRvJyAmJlxyXG4gICAgICAgICAgICAoIWZvcmNlUGl4ZWwgfHwgIXRoaXMub3B0cy5jZWxsSGVpZ2h0VW5pdCB8fCB0aGlzLm9wdHMuY2VsbEhlaWdodFVuaXQgPT09ICdweCcpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm9wdHMuY2VsbEhlaWdodDtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gZWxzZSBnZXQgZmlyc3QgY2VsbCBoZWlnaHRcclxuICAgICAgICBsZXQgZWwgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJy4nICsgdGhpcy5vcHRzLml0ZW1DbGFzcyk7XHJcbiAgICAgICAgaWYgKGVsKSB7XHJcbiAgICAgICAgICAgIGxldCBoZWlnaHQgPSB1dGlsc18xLlV0aWxzLnRvTnVtYmVyKGVsLmdldEF0dHJpYnV0ZSgnZ3MtaCcpKTtcclxuICAgICAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoZWwub2Zmc2V0SGVpZ2h0IC8gaGVpZ2h0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gZWxzZSBkbyBlbnRpcmUgZ3JpZCBhbmQgIyBvZiByb3dzIChidXQgZG9lc24ndCB3b3JrIGlmIG1pbi1oZWlnaHQgaXMgdGhlIGFjdHVhbCBjb25zdHJhaW4pXHJcbiAgICAgICAgbGV0IHJvd3MgPSBwYXJzZUludCh0aGlzLmVsLmdldEF0dHJpYnV0ZSgnZ3MtY3VycmVudC1yb3cnKSk7XHJcbiAgICAgICAgcmV0dXJuIHJvd3MgPyBNYXRoLnJvdW5kKHRoaXMuZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0IC8gcm93cykgOiB0aGlzLm9wdHMuY2VsbEhlaWdodDtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlIGN1cnJlbnQgY2VsbCBoZWlnaHQgLSBzZWUgYEdyaWRTdGFja09wdGlvbnMuY2VsbEhlaWdodGAgZm9yIGZvcm1hdC5cclxuICAgICAqIFRoaXMgbWV0aG9kIHJlYnVpbGRzIGFuIGludGVybmFsIENTUyBzdHlsZSBzaGVldC5cclxuICAgICAqIE5vdGU6IFlvdSBjYW4gZXhwZWN0IHBlcmZvcm1hbmNlIGlzc3VlcyBpZiBjYWxsIHRoaXMgbWV0aG9kIHRvbyBvZnRlbi5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gdmFsIHRoZSBjZWxsIGhlaWdodC4gSWYgbm90IHBhc3NlZCAodW5kZWZpbmVkKSwgY2VsbHMgY29udGVudCB3aWxsIGJlIG1hZGUgc3F1YXJlIChtYXRjaCB3aWR0aCBtaW51cyBtYXJnaW4pLFxyXG4gICAgICogaWYgcGFzcyAwIHRoZSBDU1Mgd2lsbCBiZSBnZW5lcmF0ZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGluc3RlYWQuXHJcbiAgICAgKiBAcGFyYW0gdXBkYXRlIChPcHRpb25hbCkgaWYgZmFsc2UsIHN0eWxlcyB3aWxsIG5vdCBiZSB1cGRhdGVkXHJcbiAgICAgKlxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIGdyaWQuY2VsbEhlaWdodCgxMDApOyAvLyBzYW1lIGFzIDEwMHB4XHJcbiAgICAgKiBncmlkLmNlbGxIZWlnaHQoJzcwcHgnKTtcclxuICAgICAqIGdyaWQuY2VsbEhlaWdodChncmlkLmNlbGxXaWR0aCgpICogMS4yKTtcclxuICAgICAqL1xyXG4gICAgY2VsbEhlaWdodCh2YWwsIHVwZGF0ZSA9IHRydWUpIHtcclxuICAgICAgICAvLyBpZiBub3QgY2FsbGVkIGludGVybmFsbHksIGNoZWNrIGlmIHdlJ3JlIGNoYW5naW5nIG1vZGVcclxuICAgICAgICBpZiAodXBkYXRlICYmIHZhbCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9pc0F1dG9DZWxsSGVpZ2h0ICE9PSAodmFsID09PSAnYXV0bycpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9pc0F1dG9DZWxsSGVpZ2h0ID0gKHZhbCA9PT0gJ2F1dG8nKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVdpbmRvd1Jlc2l6ZUV2ZW50KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHZhbCA9PT0gJ2luaXRpYWwnIHx8IHZhbCA9PT0gJ2F1dG8nKSB7XHJcbiAgICAgICAgICAgIHZhbCA9IHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gbWFrZSBpdGVtIGNvbnRlbnQgYmUgc3F1YXJlXHJcbiAgICAgICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGxldCBtYXJnaW5EaWZmID0gLXRoaXMub3B0cy5tYXJnaW5SaWdodCAtIHRoaXMub3B0cy5tYXJnaW5MZWZ0XHJcbiAgICAgICAgICAgICAgICArIHRoaXMub3B0cy5tYXJnaW5Ub3AgKyB0aGlzLm9wdHMubWFyZ2luQm90dG9tO1xyXG4gICAgICAgICAgICB2YWwgPSB0aGlzLmNlbGxXaWR0aCgpICsgbWFyZ2luRGlmZjtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGRhdGEgPSB1dGlsc18xLlV0aWxzLnBhcnNlSGVpZ2h0KHZhbCk7XHJcbiAgICAgICAgaWYgKHRoaXMub3B0cy5jZWxsSGVpZ2h0VW5pdCA9PT0gZGF0YS51bml0ICYmIHRoaXMub3B0cy5jZWxsSGVpZ2h0ID09PSBkYXRhLmgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMub3B0cy5jZWxsSGVpZ2h0VW5pdCA9IGRhdGEudW5pdDtcclxuICAgICAgICB0aGlzLm9wdHMuY2VsbEhlaWdodCA9IGRhdGEuaDtcclxuICAgICAgICBpZiAodXBkYXRlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVN0eWxlcyh0cnVlKTsgLy8gdHJ1ZSA9IGZvcmNlIHJlLWNyZWF0ZSBmb3IgY3VycmVudCAjIG9mIHJvd3NcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICAvKiogR2V0cyBjdXJyZW50IGNlbGwgd2lkdGguICovXHJcbiAgICBjZWxsV2lkdGgoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dpZHRoT3JDb250YWluZXIoKSAvIHRoaXMuZ2V0Q29sdW1uKCk7XHJcbiAgICB9XHJcbiAgICAvKiogcmV0dXJuIG91ciBleHBlY3RlZCB3aWR0aCAob3IgcGFyZW50KSBmb3IgMSBjb2x1bW4gY2hlY2sgKi9cclxuICAgIF93aWR0aE9yQ29udGFpbmVyKCkge1xyXG4gICAgICAgIC8vIHVzZSBgb2Zmc2V0V2lkdGhgIG9yIGBjbGllbnRXaWR0aGAgKG5vIHNjcm9sbGJhcikgP1xyXG4gICAgICAgIC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzIxMDY0MTAxL3VuZGVyc3RhbmRpbmctb2Zmc2V0d2lkdGgtY2xpZW50d2lkdGgtc2Nyb2xsd2lkdGgtYW5kLWhlaWdodC1yZXNwZWN0aXZlbHlcclxuICAgICAgICByZXR1cm4gKHRoaXMuZWwuY2xpZW50V2lkdGggfHwgdGhpcy5lbC5wYXJlbnRFbGVtZW50LmNsaWVudFdpZHRoIHx8IHdpbmRvdy5pbm5lcldpZHRoKTtcclxuICAgIH1cclxuICAgIC8qKiByZS1sYXlvdXQgZ3JpZCBpdGVtcyB0byByZWNsYWltIGFueSBlbXB0eSBzcGFjZSAqL1xyXG4gICAgY29tcGFjdCgpIHtcclxuICAgICAgICB0aGlzLmVuZ2luZS5jb21wYWN0KCk7XHJcbiAgICAgICAgdGhpcy5fdHJpZ2dlckNoYW5nZUV2ZW50KCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIHNldCB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlIGdyaWQuIFdpbGwgdXBkYXRlIGV4aXN0aW5nIHdpZGdldHMgdG8gY29uZm9ybSB0byBuZXcgbnVtYmVyIG9mIGNvbHVtbnMsXHJcbiAgICAgKiBhcyB3ZWxsIGFzIGNhY2hlIHRoZSBvcmlnaW5hbCBsYXlvdXQgc28geW91IGNhbiByZXZlcnQgYmFjayB0byBwcmV2aW91cyBwb3NpdGlvbnMgd2l0aG91dCBsb3NzLlxyXG4gICAgICogUmVxdWlyZXMgYGdyaWRzdGFjay1leHRyYS5jc3NgIG9yIGBncmlkc3RhY2stZXh0cmEubWluLmNzc2AgZm9yIFsyLTExXSxcclxuICAgICAqIGVsc2UgeW91IHdpbGwgbmVlZCB0byBnZW5lcmF0ZSBjb3JyZWN0IENTUyAoc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9ncmlkc3RhY2svZ3JpZHN0YWNrLmpzI2NoYW5nZS1ncmlkLWNvbHVtbnMpXHJcbiAgICAgKiBAcGFyYW0gY29sdW1uIC0gSW50ZWdlciA+IDAgKGRlZmF1bHQgMTIpLlxyXG4gICAgICogQHBhcmFtIGxheW91dCBzcGVjaWZ5IHRoZSB0eXBlIG9mIHJlLWxheW91dCB0aGF0IHdpbGwgaGFwcGVuIChwb3NpdGlvbiwgc2l6ZSwgZXRjLi4uKS5cclxuICAgICAqIE5vdGU6IGl0ZW1zIHdpbGwgbmV2ZXIgYmUgb3V0c2lkZSBvZiB0aGUgY3VycmVudCBjb2x1bW4gYm91bmRhcmllcy4gZGVmYXVsdCAobW92ZVNjYWxlKS4gSWdub3JlZCBmb3IgMSBjb2x1bW5cclxuICAgICAqL1xyXG4gICAgY29sdW1uKGNvbHVtbiwgbGF5b3V0ID0gJ21vdmVTY2FsZScpIHtcclxuICAgICAgICBpZiAoY29sdW1uIDwgMSB8fCB0aGlzLm9wdHMuY29sdW1uID09PSBjb2x1bW4pXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgIGxldCBvbGRDb2x1bW4gPSB0aGlzLmdldENvbHVtbigpO1xyXG4gICAgICAgIC8vIGlmIHdlIGdvIGludG8gMSBjb2x1bW4gbW9kZSAod2hpY2ggaGFwcGVucyBpZiB3ZSdyZSBzaXplZCBsZXNzIHRoYW4gbWluVyB1bmxlc3MgZGlzYWJsZU9uZUNvbHVtbk1vZGUgaXMgb24pXHJcbiAgICAgICAgLy8gdGhlbiByZW1lbWJlciB0aGUgb3JpZ2luYWwgY29sdW1ucyBzbyB3ZSBjYW4gcmVzdG9yZS5cclxuICAgICAgICBpZiAoY29sdW1uID09PSAxKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3ByZXZDb2x1bW4gPSBvbGRDb2x1bW47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fcHJldkNvbHVtbjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5lbC5jbGFzc0xpc3QucmVtb3ZlKCdncmlkLXN0YWNrLScgKyBvbGRDb2x1bW4pO1xyXG4gICAgICAgIHRoaXMuZWwuY2xhc3NMaXN0LmFkZCgnZ3JpZC1zdGFjay0nICsgY29sdW1uKTtcclxuICAgICAgICB0aGlzLm9wdHMuY29sdW1uID0gdGhpcy5lbmdpbmUuY29sdW1uID0gY29sdW1uO1xyXG4gICAgICAgIC8vIHVwZGF0ZSB0aGUgaXRlbXMgbm93IC0gc2VlIGlmIHRoZSBkb20gb3JkZXIgbm9kZXMgc2hvdWxkIGJlIHBhc3NlZCBpbnN0ZWFkIChlbHNlIGRlZmF1bHQgdG8gY3VycmVudCBsaXN0KVxyXG4gICAgICAgIGxldCBkb21Ob2RlcztcclxuICAgICAgICBpZiAoY29sdW1uID09PSAxICYmIHRoaXMub3B0cy5vbmVDb2x1bW5Nb2RlRG9tU29ydCkge1xyXG4gICAgICAgICAgICBkb21Ob2RlcyA9IFtdO1xyXG4gICAgICAgICAgICB0aGlzLmdldEdyaWRJdGVtcygpLmZvckVhY2goZWwgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVsLmdyaWRzdGFja05vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBkb21Ob2Rlcy5wdXNoKGVsLmdyaWRzdGFja05vZGUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgaWYgKCFkb21Ob2Rlcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIGRvbU5vZGVzID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZW5naW5lLnVwZGF0ZU5vZGVXaWR0aHMob2xkQ29sdW1uLCBjb2x1bW4sIGRvbU5vZGVzLCBsYXlvdXQpO1xyXG4gICAgICAgIGlmICh0aGlzLl9pc0F1dG9DZWxsSGVpZ2h0KVxyXG4gICAgICAgICAgICB0aGlzLmNlbGxIZWlnaHQoKTtcclxuICAgICAgICAvLyBhbmQgdHJpZ2dlciBvdXIgZXZlbnQgbGFzdC4uLlxyXG4gICAgICAgIHRoaXMuX2lnbm9yZUxheW91dHNOb2RlQ2hhbmdlID0gdHJ1ZTsgLy8gc2tpcCBsYXlvdXQgdXBkYXRlXHJcbiAgICAgICAgdGhpcy5fdHJpZ2dlckNoYW5nZUV2ZW50KCk7XHJcbiAgICAgICAgZGVsZXRlIHRoaXMuX2lnbm9yZUxheW91dHNOb2RlQ2hhbmdlO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBnZXQgdGhlIG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSBncmlkIChkZWZhdWx0IDEyKVxyXG4gICAgICovXHJcbiAgICBnZXRDb2x1bW4oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0cy5jb2x1bW47XHJcbiAgICB9XHJcbiAgICAvKiogcmV0dXJucyBhbiBhcnJheSBvZiBncmlkIEhUTUwgZWxlbWVudHMgKG5vIHBsYWNlaG9sZGVyKSAtIHVzZWQgdG8gaXRlcmF0ZSB0aHJvdWdoIG91ciBjaGlsZHJlbiBpbiBET00gb3JkZXIgKi9cclxuICAgIGdldEdyaWRJdGVtcygpIHtcclxuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmVsLmNoaWxkcmVuKVxyXG4gICAgICAgICAgICAuZmlsdGVyKChlbCkgPT4gZWwubWF0Y2hlcygnLicgKyB0aGlzLm9wdHMuaXRlbUNsYXNzKSAmJiAhZWwubWF0Y2hlcygnLicgKyB0aGlzLm9wdHMucGxhY2Vob2xkZXJDbGFzcykpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXN0cm95cyBhIGdyaWQgaW5zdGFuY2UuIERPIE5PVCBDQUxMIGFueSBtZXRob2RzIG9yIGFjY2VzcyBhbnkgdmFycyBhZnRlciB0aGlzIGFzIGl0IHdpbGwgZnJlZSB1cCBtZW1iZXJzLlxyXG4gICAgICogQHBhcmFtIHJlbW92ZURPTSBpZiBgZmFsc2VgIGdyaWQgYW5kIGl0ZW1zIEhUTUwgZWxlbWVudHMgd2lsbCBub3QgYmUgcmVtb3ZlZCBmcm9tIHRoZSBET00gKE9wdGlvbmFsLiBEZWZhdWx0IGB0cnVlYCkuXHJcbiAgICAgKi9cclxuICAgIGRlc3Ryb3kocmVtb3ZlRE9NID0gdHJ1ZSkge1xyXG4gICAgICAgIGlmICghdGhpcy5lbClcclxuICAgICAgICAgICAgcmV0dXJuOyAvLyBwcmV2ZW50IG11bHRpcGxlIGNhbGxzXHJcbiAgICAgICAgdGhpcy5fdXBkYXRlV2luZG93UmVzaXplRXZlbnQodHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0aWModHJ1ZSwgZmFsc2UpOyAvLyBwZXJtYW5lbnRseSByZW1vdmVzIEREIGJ1dCBkb24ndCBzZXQgQ1NTIGNsYXNzICh3ZSdyZSBnb2luZyBhd2F5KVxyXG4gICAgICAgIHRoaXMuc2V0QW5pbWF0aW9uKGZhbHNlKTtcclxuICAgICAgICBpZiAoIXJlbW92ZURPTSkge1xyXG4gICAgICAgICAgICB0aGlzLnJlbW92ZUFsbChyZW1vdmVET00pO1xyXG4gICAgICAgICAgICB0aGlzLmVsLmNsYXNzTGlzdC5yZW1vdmUodGhpcy5fc3R5bGVTaGVldENsYXNzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuZWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmVsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fcmVtb3ZlU3R5bGVzaGVldCgpO1xyXG4gICAgICAgIHRoaXMuZWwucmVtb3ZlQXR0cmlidXRlKCdncy1jdXJyZW50LXJvdycpO1xyXG4gICAgICAgIGlmICh0aGlzLnBhcmVudEdyaWRJdGVtKVxyXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5wYXJlbnRHcmlkSXRlbS5zdWJHcmlkO1xyXG4gICAgICAgIGRlbGV0ZSB0aGlzLnBhcmVudEdyaWRJdGVtO1xyXG4gICAgICAgIGRlbGV0ZSB0aGlzLm9wdHM7XHJcbiAgICAgICAgZGVsZXRlIHRoaXMuX3BsYWNlaG9sZGVyO1xyXG4gICAgICAgIGRlbGV0ZSB0aGlzLmVuZ2luZTtcclxuICAgICAgICBkZWxldGUgdGhpcy5lbC5ncmlkc3RhY2s7IC8vIHJlbW92ZSBjaXJjdWxhciBkZXBlbmRlbmN5IHRoYXQgd291bGQgcHJldmVudCBhIGZyZWVpbmdcclxuICAgICAgICBkZWxldGUgdGhpcy5lbDtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogZW5hYmxlL2Rpc2FibGUgZmxvYXRpbmcgd2lkZ2V0cyAoZGVmYXVsdDogYGZhbHNlYCkgU2VlIFtleGFtcGxlXShodHRwOi8vZ3JpZHN0YWNranMuY29tL2RlbW8vZmxvYXQuaHRtbClcclxuICAgICAqL1xyXG4gICAgZmxvYXQodmFsKSB7XHJcbiAgICAgICAgaWYgKHRoaXMub3B0cy5mbG9hdCAhPT0gdmFsKSB7XHJcbiAgICAgICAgICAgIHRoaXMub3B0cy5mbG9hdCA9IHRoaXMuZW5naW5lLmZsb2F0ID0gdmFsO1xyXG4gICAgICAgICAgICB0aGlzLl90cmlnZ2VyQ2hhbmdlRXZlbnQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIGdldCB0aGUgY3VycmVudCBmbG9hdCBtb2RlXHJcbiAgICAgKi9cclxuICAgIGdldEZsb2F0KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmVuZ2luZS5mbG9hdDtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgY2VsbCB1bmRlciBhIHBpeGVsIG9uIHNjcmVlbi5cclxuICAgICAqIEBwYXJhbSBwb3NpdGlvbiB0aGUgcG9zaXRpb24gb2YgdGhlIHBpeGVsIHRvIHJlc29sdmUgaW5cclxuICAgICAqIGFic29sdXRlIGNvb3JkaW5hdGVzLCBhcyBhbiBvYmplY3Qgd2l0aCB0b3AgYW5kIGxlZnQgcHJvcGVydGllc1xyXG4gICAgICogQHBhcmFtIHVzZURvY1JlbGF0aXZlIGlmIHRydWUsIHZhbHVlIHdpbGwgYmUgYmFzZWQgb24gZG9jdW1lbnQgcG9zaXRpb24gdnMgcGFyZW50IHBvc2l0aW9uIChPcHRpb25hbC4gRGVmYXVsdCBmYWxzZSkuXHJcbiAgICAgKiBVc2VmdWwgd2hlbiBncmlkIGlzIHdpdGhpbiBgcG9zaXRpb246IHJlbGF0aXZlYCBlbGVtZW50XHJcbiAgICAgKlxyXG4gICAgICogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBwcm9wZXJ0aWVzIGB4YCBhbmQgYHlgIGkuZS4gdGhlIGNvbHVtbiBhbmQgcm93IGluIHRoZSBncmlkLlxyXG4gICAgICovXHJcbiAgICBnZXRDZWxsRnJvbVBpeGVsKHBvc2l0aW9uLCB1c2VEb2NSZWxhdGl2ZSA9IGZhbHNlKSB7XHJcbiAgICAgICAgbGV0IGJveCA9IHRoaXMuZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coYGdldEJvdW5kaW5nQ2xpZW50UmVjdCBsZWZ0OiAke2JveC5sZWZ0fSB0b3A6ICR7Ym94LnRvcH0gdzogJHtib3gud30gaDogJHtib3guaH1gKVxyXG4gICAgICAgIGxldCBjb250YWluZXJQb3M7XHJcbiAgICAgICAgaWYgKHVzZURvY1JlbGF0aXZlKSB7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lclBvcyA9IHsgdG9wOiBib3gudG9wICsgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCwgbGVmdDogYm94LmxlZnQgfTtcclxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coYGdldENlbGxGcm9tUGl4ZWwgc2Nyb2xsVG9wOiAke2RvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3B9YClcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lclBvcyA9IHsgdG9wOiB0aGlzLmVsLm9mZnNldFRvcCwgbGVmdDogdGhpcy5lbC5vZmZzZXRMZWZ0IH07XHJcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGBnZXRDZWxsRnJvbVBpeGVsIG9mZnNldFRvcDogJHtjb250YWluZXJQb3MubGVmdH0gb2Zmc2V0TGVmdDogJHtjb250YWluZXJQb3MudG9wfWApXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCByZWxhdGl2ZUxlZnQgPSBwb3NpdGlvbi5sZWZ0IC0gY29udGFpbmVyUG9zLmxlZnQ7XHJcbiAgICAgICAgbGV0IHJlbGF0aXZlVG9wID0gcG9zaXRpb24udG9wIC0gY29udGFpbmVyUG9zLnRvcDtcclxuICAgICAgICBsZXQgY29sdW1uV2lkdGggPSAoYm94LndpZHRoIC8gdGhpcy5nZXRDb2x1bW4oKSk7XHJcbiAgICAgICAgbGV0IHJvd0hlaWdodCA9IChib3guaGVpZ2h0IC8gcGFyc2VJbnQodGhpcy5lbC5nZXRBdHRyaWJ1dGUoJ2dzLWN1cnJlbnQtcm93JykpKTtcclxuICAgICAgICByZXR1cm4geyB4OiBNYXRoLmZsb29yKHJlbGF0aXZlTGVmdCAvIGNvbHVtbldpZHRoKSwgeTogTWF0aC5mbG9vcihyZWxhdGl2ZVRvcCAvIHJvd0hlaWdodCkgfTtcclxuICAgIH1cclxuICAgIC8qKiByZXR1cm5zIHRoZSBjdXJyZW50IG51bWJlciBvZiByb3dzLCB3aGljaCB3aWxsIGJlIGF0IGxlYXN0IGBtaW5Sb3dgIGlmIHNldCAqL1xyXG4gICAgZ2V0Um93KCkge1xyXG4gICAgICAgIHJldHVybiBNYXRoLm1heCh0aGlzLmVuZ2luZS5nZXRSb3coKSwgdGhpcy5vcHRzLm1pblJvdyk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENoZWNrcyBpZiBzcGVjaWZpZWQgYXJlYSBpcyBlbXB0eS5cclxuICAgICAqIEBwYXJhbSB4IHRoZSBwb3NpdGlvbiB4LlxyXG4gICAgICogQHBhcmFtIHkgdGhlIHBvc2l0aW9uIHkuXHJcbiAgICAgKiBAcGFyYW0gdyB0aGUgd2lkdGggb2YgdG8gY2hlY2tcclxuICAgICAqIEBwYXJhbSBoIHRoZSBoZWlnaHQgb2YgdG8gY2hlY2tcclxuICAgICAqL1xyXG4gICAgaXNBcmVhRW1wdHkoeCwgeSwgdywgaCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmVuZ2luZS5pc0FyZWFFbXB0eSh4LCB5LCB3LCBoKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogSWYgeW91IGFkZCBlbGVtZW50cyB0byB5b3VyIGdyaWQgYnkgaGFuZCwgeW91IGhhdmUgdG8gdGVsbCBncmlkc3RhY2sgYWZ0ZXJ3YXJkcyB0byBtYWtlIHRoZW0gd2lkZ2V0cy5cclxuICAgICAqIElmIHlvdSB3YW50IGdyaWRzdGFjayB0byBhZGQgdGhlIGVsZW1lbnRzIGZvciB5b3UsIHVzZSBgYWRkV2lkZ2V0KClgIGluc3RlYWQuXHJcbiAgICAgKiBNYWtlcyB0aGUgZ2l2ZW4gZWxlbWVudCBhIHdpZGdldCBhbmQgcmV0dXJucyBpdC5cclxuICAgICAqIEBwYXJhbSBlbHMgd2lkZ2V0IG9yIHNpbmdsZSBzZWxlY3RvciB0byBjb252ZXJ0LlxyXG4gICAgICpcclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiBsZXQgZ3JpZCA9IEdyaWRTdGFjay5pbml0KCk7XHJcbiAgICAgKiBncmlkLmVsLmFwcGVuZENoaWxkKCc8ZGl2IGlkPVwiZ3NpLTFcIiBncy13PVwiM1wiPjwvZGl2PicpO1xyXG4gICAgICogZ3JpZC5tYWtlV2lkZ2V0KCcjZ3NpLTEnKTtcclxuICAgICAqL1xyXG4gICAgbWFrZVdpZGdldChlbHMpIHtcclxuICAgICAgICBsZXQgZWwgPSBHcmlkU3RhY2suZ2V0RWxlbWVudChlbHMpO1xyXG4gICAgICAgIHRoaXMuX3ByZXBhcmVFbGVtZW50KGVsLCB0cnVlKTtcclxuICAgICAgICB0aGlzLl91cGRhdGVDb250YWluZXJIZWlnaHQoKTtcclxuICAgICAgICB0aGlzLl90cmlnZ2VyQWRkRXZlbnQoKTtcclxuICAgICAgICB0aGlzLl90cmlnZ2VyQ2hhbmdlRXZlbnQoKTtcclxuICAgICAgICByZXR1cm4gZWw7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEV2ZW50IGhhbmRsZXIgdGhhdCBleHRyYWN0cyBvdXIgQ3VzdG9tRXZlbnQgZGF0YSBvdXQgYXV0b21hdGljYWxseSBmb3IgcmVjZWl2aW5nIGN1c3RvbVxyXG4gICAgICogbm90aWZpY2F0aW9ucyAoc2VlIGRvYyBmb3Igc3VwcG9ydGVkIGV2ZW50cylcclxuICAgICAqIEBwYXJhbSBuYW1lIG9mIHRoZSBldmVudCAoc2VlIHBvc3NpYmxlIHZhbHVlcykgb3IgbGlzdCBvZiBuYW1lcyBzcGFjZSBzZXBhcmF0ZWRcclxuICAgICAqIEBwYXJhbSBjYWxsYmFjayBmdW5jdGlvbiBjYWxsZWQgd2l0aCBldmVudCBhbmQgb3B0aW9uYWwgc2Vjb25kL3RoaXJkIHBhcmFtXHJcbiAgICAgKiAoc2VlIFJFQURNRSBkb2N1bWVudGF0aW9uIGZvciBlYWNoIHNpZ25hdHVyZSkuXHJcbiAgICAgKlxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIGdyaWQub24oJ2FkZGVkJywgZnVuY3Rpb24oZSwgaXRlbXMpIHsgbG9nKCdhZGRlZCAnLCBpdGVtcyl9ICk7XHJcbiAgICAgKiBvclxyXG4gICAgICogZ3JpZC5vbignYWRkZWQgcmVtb3ZlZCBjaGFuZ2UnLCBmdW5jdGlvbihlLCBpdGVtcykgeyBsb2coZS50eXBlLCBpdGVtcyl9ICk7XHJcbiAgICAgKlxyXG4gICAgICogTm90ZTogaW4gc29tZSBjYXNlcyBpdCBpcyB0aGUgc2FtZSBhcyBjYWxsaW5nIG5hdGl2ZSBoYW5kbGVyIGFuZCBwYXJzaW5nIHRoZSBldmVudC5cclxuICAgICAqIGdyaWQuZWwuYWRkRXZlbnRMaXN0ZW5lcignYWRkZWQnLCBmdW5jdGlvbihldmVudCkgeyBsb2coJ2FkZGVkICcsIGV2ZW50LmRldGFpbCl9ICk7XHJcbiAgICAgKlxyXG4gICAgICovXHJcbiAgICBvbihuYW1lLCBjYWxsYmFjaykge1xyXG4gICAgICAgIC8vIGNoZWNrIGZvciBhcnJheSBvZiBuYW1lcyBiZWluZyBwYXNzZWQgaW5zdGVhZFxyXG4gICAgICAgIGlmIChuYW1lLmluZGV4T2YoJyAnKSAhPT0gLTEpIHtcclxuICAgICAgICAgICAgbGV0IG5hbWVzID0gbmFtZS5zcGxpdCgnICcpO1xyXG4gICAgICAgICAgICBuYW1lcy5mb3JFYWNoKG5hbWUgPT4gdGhpcy5vbihuYW1lLCBjYWxsYmFjaykpO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG5hbWUgPT09ICdjaGFuZ2UnIHx8IG5hbWUgPT09ICdhZGRlZCcgfHwgbmFtZSA9PT0gJ3JlbW92ZWQnIHx8IG5hbWUgPT09ICdlbmFibGUnIHx8IG5hbWUgPT09ICdkaXNhYmxlJykge1xyXG4gICAgICAgICAgICAvLyBuYXRpdmUgQ3VzdG9tRXZlbnQgaGFuZGxlcnMgLSBjYXNoIHRoZSBnZW5lcmljIGhhbmRsZXJzIHNvIHdlIGNhbiBlYXNpbHkgcmVtb3ZlXHJcbiAgICAgICAgICAgIGxldCBub0RhdGEgPSAobmFtZSA9PT0gJ2VuYWJsZScgfHwgbmFtZSA9PT0gJ2Rpc2FibGUnKTtcclxuICAgICAgICAgICAgaWYgKG5vRGF0YSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZ3NFdmVudEhhbmRsZXJbbmFtZV0gPSAoZXZlbnQpID0+IGNhbGxiYWNrKGV2ZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2dzRXZlbnRIYW5kbGVyW25hbWVdID0gKGV2ZW50KSA9PiBjYWxsYmFjayhldmVudCwgZXZlbnQuZGV0YWlsKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmVsLmFkZEV2ZW50TGlzdGVuZXIobmFtZSwgdGhpcy5fZ3NFdmVudEhhbmRsZXJbbmFtZV0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChuYW1lID09PSAnZHJhZycgfHwgbmFtZSA9PT0gJ2RyYWdzdGFydCcgfHwgbmFtZSA9PT0gJ2RyYWdzdG9wJyB8fCBuYW1lID09PSAncmVzaXplc3RhcnQnIHx8IG5hbWUgPT09ICdyZXNpemUnIHx8IG5hbWUgPT09ICdyZXNpemVzdG9wJyB8fCBuYW1lID09PSAnZHJvcHBlZCcpIHtcclxuICAgICAgICAgICAgLy8gZHJhZyZkcm9wIHN0b3AgZXZlbnRzIE5FRUQgdG8gYmUgY2FsbCB0aGVtIEFGVEVSIHdlIHVwZGF0ZSBub2RlIGF0dHJpYnV0ZXMgc28gaGFuZGxlIHRoZW0gb3Vyc2VsZi5cclxuICAgICAgICAgICAgLy8gZG8gc2FtZSBmb3Igc3RhcnQgZXZlbnQgdG8gbWFrZSBpdCBlYXNpZXIuLi5cclxuICAgICAgICAgICAgdGhpcy5fZ3NFdmVudEhhbmRsZXJbbmFtZV0gPSBjYWxsYmFjaztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdHcmlkU3RhY2sub24oJyArIG5hbWUgKyAnKSBldmVudCBub3Qgc3VwcG9ydGVkLCBidXQgeW91IGNhbiBzdGlsbCB1c2UgJChcIi5ncmlkLXN0YWNrXCIpLm9uKC4uLikgd2hpbGUganF1ZXJ5LXVpIGlzIHN0aWxsIHVzZWQgaW50ZXJuYWxseS4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIHVuc3Vic2NyaWJlIGZyb20gdGhlICdvbicgZXZlbnQgYmVsb3dcclxuICAgICAqIEBwYXJhbSBuYW1lIG9mIHRoZSBldmVudCAoc2VlIHBvc3NpYmxlIHZhbHVlcylcclxuICAgICAqL1xyXG4gICAgb2ZmKG5hbWUpIHtcclxuICAgICAgICAvLyBjaGVjayBmb3IgYXJyYXkgb2YgbmFtZXMgYmVpbmcgcGFzc2VkIGluc3RlYWRcclxuICAgICAgICBpZiAobmFtZS5pbmRleE9mKCcgJykgIT09IC0xKSB7XHJcbiAgICAgICAgICAgIGxldCBuYW1lcyA9IG5hbWUuc3BsaXQoJyAnKTtcclxuICAgICAgICAgICAgbmFtZXMuZm9yRWFjaChuYW1lID0+IHRoaXMub2ZmKG5hbWUpKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChuYW1lID09PSAnY2hhbmdlJyB8fCBuYW1lID09PSAnYWRkZWQnIHx8IG5hbWUgPT09ICdyZW1vdmVkJyB8fCBuYW1lID09PSAnZW5hYmxlJyB8fCBuYW1lID09PSAnZGlzYWJsZScpIHtcclxuICAgICAgICAgICAgLy8gcmVtb3ZlIG5hdGl2ZSBDdXN0b21FdmVudCBoYW5kbGVyc1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fZ3NFdmVudEhhbmRsZXJbbmFtZV0pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihuYW1lLCB0aGlzLl9nc0V2ZW50SGFuZGxlcltuYW1lXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZGVsZXRlIHRoaXMuX2dzRXZlbnRIYW5kbGVyW25hbWVdO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIHdpZGdldCBmcm9tIHRoZSBncmlkLlxyXG4gICAgICogQHBhcmFtIGVsICB3aWRnZXQgb3Igc2VsZWN0b3IgdG8gbW9kaWZ5XHJcbiAgICAgKiBAcGFyYW0gcmVtb3ZlRE9NIGlmIGBmYWxzZWAgRE9NIGVsZW1lbnQgd29uJ3QgYmUgcmVtb3ZlZCBmcm9tIHRoZSB0cmVlIChEZWZhdWx0PyB0cnVlKS5cclxuICAgICAqIEBwYXJhbSB0cmlnZ2VyRXZlbnQgaWYgYGZhbHNlYCAocXVpZXQgbW9kZSkgZWxlbWVudCB3aWxsIG5vdCBiZSBhZGRlZCB0byByZW1vdmVkIGxpc3QgYW5kIG5vICdyZW1vdmVkJyBjYWxsYmFja3Mgd2lsbCBiZSBjYWxsZWQgKERlZmF1bHQ/IHRydWUpLlxyXG4gICAgICovXHJcbiAgICByZW1vdmVXaWRnZXQoZWxzLCByZW1vdmVET00gPSB0cnVlLCB0cmlnZ2VyRXZlbnQgPSB0cnVlKSB7XHJcbiAgICAgICAgR3JpZFN0YWNrLmdldEVsZW1lbnRzKGVscykuZm9yRWFjaChlbCA9PiB7XHJcbiAgICAgICAgICAgIGlmIChlbC5wYXJlbnRFbGVtZW50ICYmIGVsLnBhcmVudEVsZW1lbnQgIT09IHRoaXMuZWwpXHJcbiAgICAgICAgICAgICAgICByZXR1cm47IC8vIG5vdCBvdXIgY2hpbGQhXHJcbiAgICAgICAgICAgIGxldCBub2RlID0gZWwuZ3JpZHN0YWNrTm9kZTtcclxuICAgICAgICAgICAgLy8gRm9yIE1ldGVvciBzdXBwb3J0OiBodHRwczovL2dpdGh1Yi5jb20vZ3JpZHN0YWNrL2dyaWRzdGFjay5qcy9wdWxsLzI3MlxyXG4gICAgICAgICAgICBpZiAoIW5vZGUpIHtcclxuICAgICAgICAgICAgICAgIG5vZGUgPSB0aGlzLmVuZ2luZS5ub2Rlcy5maW5kKG4gPT4gZWwgPT09IG4uZWwpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgLy8gcmVtb3ZlIG91ciBET00gZGF0YSAoY2lyY3VsYXIgbGluaykgYW5kIGRyYWcmZHJvcCBwZXJtYW5lbnRseVxyXG4gICAgICAgICAgICBkZWxldGUgZWwuZ3JpZHN0YWNrTm9kZTtcclxuICAgICAgICAgICAgdGhpcy5fcmVtb3ZlREQoZWwpO1xyXG4gICAgICAgICAgICB0aGlzLmVuZ2luZS5yZW1vdmVOb2RlKG5vZGUsIHJlbW92ZURPTSwgdHJpZ2dlckV2ZW50KTtcclxuICAgICAgICAgICAgaWYgKHJlbW92ZURPTSAmJiBlbC5wYXJlbnRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICBlbC5yZW1vdmUoKTsgLy8gaW4gYmF0Y2ggbW9kZSBlbmdpbmUucmVtb3ZlTm9kZSBkb2Vzbid0IGNhbGwgYmFjayB0byByZW1vdmUgRE9NXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAodHJpZ2dlckV2ZW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3RyaWdnZXJSZW1vdmVFdmVudCgpO1xyXG4gICAgICAgICAgICB0aGlzLl90cmlnZ2VyQ2hhbmdlRXZlbnQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgYWxsIHdpZGdldHMgZnJvbSB0aGUgZ3JpZC5cclxuICAgICAqIEBwYXJhbSByZW1vdmVET00gaWYgYGZhbHNlYCBET00gZWxlbWVudHMgd29uJ3QgYmUgcmVtb3ZlZCBmcm9tIHRoZSB0cmVlIChEZWZhdWx0PyBgdHJ1ZWApLlxyXG4gICAgICovXHJcbiAgICByZW1vdmVBbGwocmVtb3ZlRE9NID0gdHJ1ZSkge1xyXG4gICAgICAgIC8vIGFsd2F5cyByZW1vdmUgb3VyIERPTSBkYXRhIChjaXJjdWxhciBsaW5rKSBiZWZvcmUgbGlzdCBnZXRzIGVtcHRpZWQgYW5kIGRyYWcmZHJvcCBwZXJtYW5lbnRseVxyXG4gICAgICAgIHRoaXMuZW5naW5lLm5vZGVzLmZvckVhY2gobiA9PiB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBuLmVsLmdyaWRzdGFja05vZGU7XHJcbiAgICAgICAgICAgIHRoaXMuX3JlbW92ZUREKG4uZWwpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuZW5naW5lLnJlbW92ZUFsbChyZW1vdmVET00pO1xyXG4gICAgICAgIHRoaXMuX3RyaWdnZXJSZW1vdmVFdmVudCgpO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBUb2dnbGUgdGhlIGdyaWQgYW5pbWF0aW9uIHN0YXRlLiAgVG9nZ2xlcyB0aGUgYGdyaWQtc3RhY2stYW5pbWF0ZWAgY2xhc3MuXHJcbiAgICAgKiBAcGFyYW0gZG9BbmltYXRlIGlmIHRydWUgdGhlIGdyaWQgd2lsbCBhbmltYXRlLlxyXG4gICAgICovXHJcbiAgICBzZXRBbmltYXRpb24oZG9BbmltYXRlKSB7XHJcbiAgICAgICAgaWYgKGRvQW5pbWF0ZSkge1xyXG4gICAgICAgICAgICB0aGlzLmVsLmNsYXNzTGlzdC5hZGQoJ2dyaWQtc3RhY2stYW5pbWF0ZScpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5lbC5jbGFzc0xpc3QucmVtb3ZlKCdncmlkLXN0YWNrLWFuaW1hdGUnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFRvZ2dsZSB0aGUgZ3JpZCBzdGF0aWMgc3RhdGUsIHdoaWNoIHBlcm1hbmVudGx5IHJlbW92ZXMvYWRkIERyYWcmRHJvcCBzdXBwb3J0LCB1bmxpa2UgZGlzYWJsZSgpL2VuYWJsZSgpIHRoYXQganVzdCB0dXJucyBpdCBvZmYvb24uXHJcbiAgICAgKiBBbHNvIHRvZ2dsZSB0aGUgZ3JpZC1zdGFjay1zdGF0aWMgY2xhc3MuXHJcbiAgICAgKiBAcGFyYW0gdmFsIGlmIHRydWUgdGhlIGdyaWQgYmVjb21lIHN0YXRpYy5cclxuICAgICAqIEBwYXJhbSB1cGRhdGVDbGFzcyB0cnVlIChkZWZhdWx0KSBpZiBjc3MgY2xhc3MgZ2V0cyB1cGRhdGVkXHJcbiAgICAgKiBAcGFyYW0gcmVjdXJzZSB0cnVlIChkZWZhdWx0KSBpZiBzdWItZ3JpZHMgYWxzbyBnZXQgdXBkYXRlZFxyXG4gICAgICovXHJcbiAgICBzZXRTdGF0aWModmFsLCB1cGRhdGVDbGFzcyA9IHRydWUsIHJlY3Vyc2UgPSB0cnVlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMub3B0cy5zdGF0aWNHcmlkID09PSB2YWwpXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgIHRoaXMub3B0cy5zdGF0aWNHcmlkID0gdmFsO1xyXG4gICAgICAgIHRoaXMuX3NldHVwUmVtb3ZlRHJvcCgpO1xyXG4gICAgICAgIHRoaXMuX3NldHVwQWNjZXB0V2lkZ2V0KCk7XHJcbiAgICAgICAgdGhpcy5lbmdpbmUubm9kZXMuZm9yRWFjaChuID0+IHtcclxuICAgICAgICAgICAgdGhpcy5fcHJlcGFyZURyYWdEcm9wQnlOb2RlKG4pOyAvLyBlaXRoZXIgZGVsZXRlIG9yIGluaXQgRHJhZyZkcm9wXHJcbiAgICAgICAgICAgIGlmIChuLnN1YkdyaWQgJiYgcmVjdXJzZSlcclxuICAgICAgICAgICAgICAgIG4uc3ViR3JpZC5zZXRTdGF0aWModmFsLCB1cGRhdGVDbGFzcywgcmVjdXJzZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKHVwZGF0ZUNsYXNzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3NldFN0YXRpY0NsYXNzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGVzIHdpZGdldCBwb3NpdGlvbi9zaXplIGFuZCBvdGhlciBpbmZvLiBOb3RlOiBpZiB5b3UgbmVlZCB0byBjYWxsIHRoaXMgb24gYWxsIG5vZGVzLCB1c2UgbG9hZCgpIGluc3RlYWQgd2hpY2ggd2lsbCB1cGRhdGUgd2hhdCBjaGFuZ2VkLlxyXG4gICAgICogQHBhcmFtIGVscyAgd2lkZ2V0IG9yIHNlbGVjdG9yIG9mIG9iamVjdHMgdG8gbW9kaWZ5IChub3RlOiBzZXR0aW5nIHRoZSBzYW1lIHgseSBmb3IgbXVsdGlwbGUgaXRlbXMgd2lsbCBiZSBpbmRldGVybWluaXN0aWMgYW5kIGxpa2VseSB1bndhbnRlZClcclxuICAgICAqIEBwYXJhbSBvcHQgbmV3IHdpZGdldCBvcHRpb25zICh4LHksdyxoLCBldGMuLikuIE9ubHkgdGhvc2Ugc2V0IHdpbGwgYmUgdXBkYXRlZC5cclxuICAgICAqL1xyXG4gICAgdXBkYXRlKGVscywgb3B0KSB7XHJcbiAgICAgICAgLy8gc3VwcG9ydCBsZWdhY3kgY2FsbCBmb3Igbm93ID9cclxuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDIpIHtcclxuICAgICAgICAgICAgY29uc29sZS53YXJuKCdncmlkc3RhY2sudHM6IGB1cGRhdGUoZWwsIHgsIHksIHcsIGgpYCBpcyBkZXByZWNhdGVkLiBVc2UgYHVwZGF0ZShlbCwge3gsIHcsIGNvbnRlbnQsIC4uLn0pYC4gSXQgd2lsbCBiZSByZW1vdmVkIHNvb24nKTtcclxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1yZXN0LXBhcmFtc1xyXG4gICAgICAgICAgICBsZXQgYSA9IGFyZ3VtZW50cywgaSA9IDE7XHJcbiAgICAgICAgICAgIG9wdCA9IHsgeDogYVtpKytdLCB5OiBhW2krK10sIHc6IGFbaSsrXSwgaDogYVtpKytdIH07XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZShlbHMsIG9wdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIEdyaWRTdGFjay5nZXRFbGVtZW50cyhlbHMpLmZvckVhY2goZWwgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIWVsIHx8ICFlbC5ncmlkc3RhY2tOb2RlKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICBsZXQgbiA9IGVsLmdyaWRzdGFja05vZGU7XHJcbiAgICAgICAgICAgIGxldCB3ID0gdXRpbHNfMS5VdGlscy5jbG9uZURlZXAob3B0KTsgLy8gbWFrZSBhIGNvcHkgd2UgY2FuIG1vZGlmeSBpbiBjYXNlIHRoZXkgcmUtdXNlIGl0IG9yIG11bHRpcGxlIGl0ZW1zXHJcbiAgICAgICAgICAgIGRlbGV0ZSB3LmF1dG9Qb3NpdGlvbjtcclxuICAgICAgICAgICAgLy8gbW92ZS9yZXNpemUgd2lkZ2V0IGlmIGFueXRoaW5nIGNoYW5nZWRcclxuICAgICAgICAgICAgbGV0IGtleXMgPSBbJ3gnLCAneScsICd3JywgJ2gnXTtcclxuICAgICAgICAgICAgbGV0IG07XHJcbiAgICAgICAgICAgIGlmIChrZXlzLnNvbWUoayA9PiB3W2tdICE9PSB1bmRlZmluZWQgJiYgd1trXSAhPT0gbltrXSkpIHtcclxuICAgICAgICAgICAgICAgIG0gPSB7fTtcclxuICAgICAgICAgICAgICAgIGtleXMuZm9yRWFjaChrID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBtW2tdID0gKHdba10gIT09IHVuZGVmaW5lZCkgPyB3W2tdIDogbltrXTtcclxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgd1trXTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIGZvciBhIG1vdmUgYXMgd2VsbCBJRkYgdGhlcmUgaXMgYW55IG1pbi9tYXggZmllbGRzIHNldFxyXG4gICAgICAgICAgICBpZiAoIW0gJiYgKHcubWluVyB8fCB3Lm1pbkggfHwgdy5tYXhXIHx8IHcubWF4SCkpIHtcclxuICAgICAgICAgICAgICAgIG0gPSB7fTsgLy8gd2lsbCB1c2Ugbm9kZSBwb3NpdGlvbiBidXQgdmFsaWRhdGUgdmFsdWVzXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gY2hlY2sgZm9yIGNvbnRlbnQgY2hhbmdpbmdcclxuICAgICAgICAgICAgaWYgKHcuY29udGVudCkge1xyXG4gICAgICAgICAgICAgICAgbGV0IHN1YiA9IGVsLnF1ZXJ5U2VsZWN0b3IoJy5ncmlkLXN0YWNrLWl0ZW0tY29udGVudCcpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHN1YiAmJiBzdWIuaW5uZXJIVE1MICE9PSB3LmNvbnRlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICBzdWIuaW5uZXJIVE1MID0gdy5jb250ZW50O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZGVsZXRlIHcuY29udGVudDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBhbnkgcmVtYWluaW5nIGZpZWxkcyBhcmUgYXNzaWduZWQsIGJ1dCBjaGVjayBmb3IgZHJhZ2dpbmcgY2hhbmdlcywgcmVzaXplIGNvbnN0cmFpblxyXG4gICAgICAgICAgICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBsZXQgZGRDaGFuZ2VkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIHcpIHtcclxuICAgICAgICAgICAgICAgIGlmIChrZXlbMF0gIT09ICdfJyAmJiBuW2tleV0gIT09IHdba2V5XSkge1xyXG4gICAgICAgICAgICAgICAgICAgIG5ba2V5XSA9IHdba2V5XTtcclxuICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBkZENoYW5nZWQgPSBkZENoYW5nZWQgfHwgKCF0aGlzLm9wdHMuc3RhdGljR3JpZCAmJiAoa2V5ID09PSAnbm9SZXNpemUnIHx8IGtleSA9PT0gJ25vTW92ZScgfHwga2V5ID09PSAnbG9ja2VkJykpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIGZpbmFsbHkgbW92ZSB0aGUgd2lkZ2V0XHJcbiAgICAgICAgICAgIGlmIChtKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVuZ2luZS5jbGVhbk5vZGVzKClcclxuICAgICAgICAgICAgICAgICAgICAuYmVnaW5VcGRhdGUobilcclxuICAgICAgICAgICAgICAgICAgICAubW92ZU5vZGUobiwgbSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVDb250YWluZXJIZWlnaHQoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3RyaWdnZXJDaGFuZ2VFdmVudCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5lbmdpbmUuZW5kVXBkYXRlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGNoYW5nZWQpIHsgLy8gbW92ZSB3aWxsIG9ubHkgdXBkYXRlIHgseSx3LGggc28gdXBkYXRlIHRoZSByZXN0IHRvb1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fd3JpdGVBdHRyKGVsLCBuKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoZGRDaGFuZ2VkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9wcmVwYXJlRHJhZ0Ryb3BCeU5vZGUobik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlcyB0aGUgbWFyZ2lucyB3aGljaCB3aWxsIHNldCBhbGwgNCBzaWRlcyBhdCBvbmNlIC0gc2VlIGBHcmlkU3RhY2tPcHRpb25zLm1hcmdpbmAgZm9yIGZvcm1hdCBvcHRpb25zIChDU1Mgc3RyaW5nIGZvcm1hdCBvZiAxLDIsNCB2YWx1ZXMgb3Igc2luZ2xlIG51bWJlcikuXHJcbiAgICAgKiBAcGFyYW0gdmFsdWUgbWFyZ2luIHZhbHVlXHJcbiAgICAgKi9cclxuICAgIG1hcmdpbih2YWx1ZSkge1xyXG4gICAgICAgIGxldCBpc011bHRpVmFsdWUgPSAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5zcGxpdCgnICcpLmxlbmd0aCA+IDEpO1xyXG4gICAgICAgIC8vIGNoZWNrIGlmIHdlIGNhbiBza2lwIHJlLWNyZWF0aW5nIG91ciBDU1MgZmlsZS4uLiB3b24ndCBjaGVjayBpZiBtdWx0aSB2YWx1ZXMgKHRvbyBtdWNoIGhhc3NsZSlcclxuICAgICAgICBpZiAoIWlzTXVsdGlWYWx1ZSkge1xyXG4gICAgICAgICAgICBsZXQgZGF0YSA9IHV0aWxzXzEuVXRpbHMucGFyc2VIZWlnaHQodmFsdWUpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRzLm1hcmdpblVuaXQgPT09IGRhdGEudW5pdCAmJiB0aGlzLm9wdHMubWFyZ2luID09PSBkYXRhLmgpXHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHJlLXVzZSBleGlzdGluZyBtYXJnaW4gaGFuZGxpbmdcclxuICAgICAgICB0aGlzLm9wdHMubWFyZ2luID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy5vcHRzLm1hcmdpblRvcCA9IHRoaXMub3B0cy5tYXJnaW5Cb3R0b20gPSB0aGlzLm9wdHMubWFyZ2luTGVmdCA9IHRoaXMub3B0cy5tYXJnaW5SaWdodCA9IHVuZGVmaW5lZDtcclxuICAgICAgICB0aGlzLl9pbml0TWFyZ2luKCk7XHJcbiAgICAgICAgdGhpcy5fdXBkYXRlU3R5bGVzKHRydWUpOyAvLyB0cnVlID0gZm9yY2UgcmUtY3JlYXRlXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICAvKiogcmV0dXJucyBjdXJyZW50IG1hcmdpbiBudW1iZXIgdmFsdWUgKHVuZGVmaW5lZCBpZiA0IHNpZGVzIGRvbid0IG1hdGNoKSAqL1xyXG4gICAgZ2V0TWFyZ2luKCkgeyByZXR1cm4gdGhpcy5vcHRzLm1hcmdpbjsgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGhlaWdodCBvZiB0aGUgZ3JpZCB3aWxsIGJlIGxlc3MgdGhhbiB0aGUgdmVydGljYWxcclxuICAgICAqIGNvbnN0cmFpbnQuIEFsd2F5cyByZXR1cm5zIHRydWUgaWYgZ3JpZCBkb2Vzbid0IGhhdmUgaGVpZ2h0IGNvbnN0cmFpbnQuXHJcbiAgICAgKiBAcGFyYW0gbm9kZSBjb250YWlucyB4LHksdyxoLGF1dG8tcG9zaXRpb24gb3B0aW9uc1xyXG4gICAgICpcclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiBpZiAoZ3JpZC53aWxsSXRGaXQobmV3V2lkZ2V0KSkge1xyXG4gICAgICogICBncmlkLmFkZFdpZGdldChuZXdXaWRnZXQpO1xyXG4gICAgICogfSBlbHNlIHtcclxuICAgICAqICAgYWxlcnQoJ05vdCBlbm91Z2ggZnJlZSBzcGFjZSB0byBwbGFjZSB0aGUgd2lkZ2V0Jyk7XHJcbiAgICAgKiB9XHJcbiAgICAgKi9cclxuICAgIHdpbGxJdEZpdChub2RlKSB7XHJcbiAgICAgICAgLy8gc3VwcG9ydCBsZWdhY3kgY2FsbCBmb3Igbm93XHJcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignZ3JpZHN0YWNrLnRzOiBgd2lsbEl0Rml0KHgseSx3LGgsYXV0b1Bvc2l0aW9uKWAgaXMgZGVwcmVjYXRlZC4gVXNlIGB3aWxsSXRGaXQoe3gsIHksLi4ufSlgLiBJdCB3aWxsIGJlIHJlbW92ZWQgc29vbicpO1xyXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLXJlc3QtcGFyYW1zXHJcbiAgICAgICAgICAgIGxldCBhID0gYXJndW1lbnRzLCBpID0gMCwgdyA9IHsgeDogYVtpKytdLCB5OiBhW2krK10sIHc6IGFbaSsrXSwgaDogYVtpKytdLCBhdXRvUG9zaXRpb246IGFbaSsrXSB9O1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy53aWxsSXRGaXQodyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLmVuZ2luZS53aWxsSXRGaXQobm9kZSk7XHJcbiAgICB9XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBfdHJpZ2dlckNoYW5nZUV2ZW50KCkge1xyXG4gICAgICAgIGlmICh0aGlzLmVuZ2luZS5iYXRjaE1vZGUpXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgIGxldCBlbGVtZW50cyA9IHRoaXMuZW5naW5lLmdldERpcnR5Tm9kZXModHJ1ZSk7IC8vIHZlcmlmeSB0aGV5IHJlYWxseSBjaGFuZ2VkXHJcbiAgICAgICAgaWYgKGVsZW1lbnRzICYmIGVsZW1lbnRzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuX2lnbm9yZUxheW91dHNOb2RlQ2hhbmdlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVuZ2luZS5sYXlvdXRzTm9kZXNDaGFuZ2UoZWxlbWVudHMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX3RyaWdnZXJFdmVudCgnY2hhbmdlJywgZWxlbWVudHMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmVuZ2luZS5zYXZlSW5pdGlhbCgpOyAvLyB3ZSBjYWxsZWQsIG5vdyByZXNldCBpbml0aWFsIHZhbHVlcyAmIGRpcnR5IGZsYWdzXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBfdHJpZ2dlckFkZEV2ZW50KCkge1xyXG4gICAgICAgIGlmICh0aGlzLmVuZ2luZS5iYXRjaE1vZGUpXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgIGlmICh0aGlzLmVuZ2luZS5hZGRlZE5vZGVzICYmIHRoaXMuZW5naW5lLmFkZGVkTm9kZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuX2lnbm9yZUxheW91dHNOb2RlQ2hhbmdlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVuZ2luZS5sYXlvdXRzTm9kZXNDaGFuZ2UodGhpcy5lbmdpbmUuYWRkZWROb2Rlcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gcHJldmVudCBhZGRlZCBub2RlcyBmcm9tIGFsc28gdHJpZ2dlcmluZyAnY2hhbmdlJyBldmVudCAod2hpY2ggaXMgY2FsbGVkIG5leHQpXHJcbiAgICAgICAgICAgIHRoaXMuZW5naW5lLmFkZGVkTm9kZXMuZm9yRWFjaChuID0+IHsgZGVsZXRlIG4uX2RpcnR5OyB9KTtcclxuICAgICAgICAgICAgdGhpcy5fdHJpZ2dlckV2ZW50KCdhZGRlZCcsIHRoaXMuZW5naW5lLmFkZGVkTm9kZXMpO1xyXG4gICAgICAgICAgICB0aGlzLmVuZ2luZS5hZGRlZE5vZGVzID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgX3RyaWdnZXJSZW1vdmVFdmVudCgpIHtcclxuICAgICAgICBpZiAodGhpcy5lbmdpbmUuYmF0Y2hNb2RlKVxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICBpZiAodGhpcy5lbmdpbmUucmVtb3ZlZE5vZGVzICYmIHRoaXMuZW5naW5lLnJlbW92ZWROb2Rlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3RyaWdnZXJFdmVudCgncmVtb3ZlZCcsIHRoaXMuZW5naW5lLnJlbW92ZWROb2Rlcyk7XHJcbiAgICAgICAgICAgIHRoaXMuZW5naW5lLnJlbW92ZWROb2RlcyA9IFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIF90cmlnZ2VyRXZlbnQodHlwZSwgZGF0YSkge1xyXG4gICAgICAgIGxldCBldmVudCA9IGRhdGEgPyBuZXcgQ3VzdG9tRXZlbnQodHlwZSwgeyBidWJibGVzOiBmYWxzZSwgZGV0YWlsOiBkYXRhIH0pIDogbmV3IEV2ZW50KHR5cGUpO1xyXG4gICAgICAgIHRoaXMuZWwuZGlzcGF0Y2hFdmVudChldmVudCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICAvKiogQGludGVybmFsIGNhbGxlZCB0byBkZWxldGUgdGhlIGN1cnJlbnQgZHluYW1pYyBzdHlsZSBzaGVldCB1c2VkIGZvciBvdXIgbGF5b3V0ICovXHJcbiAgICBfcmVtb3ZlU3R5bGVzaGVldCgpIHtcclxuICAgICAgICBpZiAodGhpcy5fc3R5bGVzKSB7XHJcbiAgICAgICAgICAgIHV0aWxzXzEuVXRpbHMucmVtb3ZlU3R5bGVzaGVldCh0aGlzLl9zdHlsZVNoZWV0Q2xhc3MpO1xyXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fc3R5bGVzO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICAgIC8qKiBAaW50ZXJuYWwgdXBkYXRlZC9jcmVhdGUgdGhlIENTUyBzdHlsZXMgZm9yIHJvdyBiYXNlZCBsYXlvdXQgYW5kIGluaXRpYWwgbWFyZ2luIHNldHRpbmcgKi9cclxuICAgIF91cGRhdGVTdHlsZXMoZm9yY2VVcGRhdGUgPSBmYWxzZSwgbWF4SCkge1xyXG4gICAgICAgIC8vIGNhbGwgdG8gZGVsZXRlIGV4aXN0aW5nIG9uZSBpZiB3ZSBjaGFuZ2UgY2VsbEhlaWdodCAvIG1hcmdpblxyXG4gICAgICAgIGlmIChmb3JjZVVwZGF0ZSkge1xyXG4gICAgICAgICAgICB0aGlzLl9yZW1vdmVTdHlsZXNoZWV0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghbWF4SClcclxuICAgICAgICAgICAgbWF4SCA9IHRoaXMuZ2V0Um93KCk7XHJcbiAgICAgICAgdGhpcy5fdXBkYXRlQ29udGFpbmVySGVpZ2h0KCk7XHJcbiAgICAgICAgLy8gaWYgdXNlciBpcyB0ZWxsaW5nIHVzIHRoZXkgd2lsbCBoYW5kbGUgdGhlIENTUyB0aGVtc2VsdmVzIGJ5IHNldHRpbmcgaGVpZ2h0cyB0byAwLiBEbyB3ZSBuZWVkIHRoaXMgb3B0cyByZWFsbHkgPz9cclxuICAgICAgICBpZiAodGhpcy5vcHRzLmNlbGxIZWlnaHQgPT09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBjZWxsSGVpZ2h0ID0gdGhpcy5vcHRzLmNlbGxIZWlnaHQ7XHJcbiAgICAgICAgbGV0IGNlbGxIZWlnaHRVbml0ID0gdGhpcy5vcHRzLmNlbGxIZWlnaHRVbml0O1xyXG4gICAgICAgIGxldCBwcmVmaXggPSBgLiR7dGhpcy5fc3R5bGVTaGVldENsYXNzfSA+IC4ke3RoaXMub3B0cy5pdGVtQ2xhc3N9YDtcclxuICAgICAgICAvLyBjcmVhdGUgb25lIGFzIG5lZWRlZFxyXG4gICAgICAgIGlmICghdGhpcy5fc3R5bGVzKSB7XHJcbiAgICAgICAgICAgIC8vIGluc2VydCBzdHlsZSB0byBwYXJlbnQgKGluc3RlYWQgb2YgJ2hlYWQnIGJ5IGRlZmF1bHQpIHRvIHN1cHBvcnQgV2ViQ29tcG9uZW50XHJcbiAgICAgICAgICAgIGxldCBzdHlsZUxvY2F0aW9uID0gdGhpcy5vcHRzLnN0eWxlSW5IZWFkID8gdW5kZWZpbmVkIDogdGhpcy5lbC5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICB0aGlzLl9zdHlsZXMgPSB1dGlsc18xLlV0aWxzLmNyZWF0ZVN0eWxlc2hlZXQodGhpcy5fc3R5bGVTaGVldENsYXNzLCBzdHlsZUxvY2F0aW9uLCB7XHJcbiAgICAgICAgICAgICAgICBub25jZTogdGhpcy5vcHRzLm5vbmNlLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLl9zdHlsZXMpXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICAgICAgdGhpcy5fc3R5bGVzLl9tYXggPSAwO1xyXG4gICAgICAgICAgICAvLyB0aGVzZSBhcmUgZG9uZSBvbmNlIG9ubHlcclxuICAgICAgICAgICAgdXRpbHNfMS5VdGlscy5hZGRDU1NSdWxlKHRoaXMuX3N0eWxlcywgcHJlZml4LCBgbWluLWhlaWdodDogJHtjZWxsSGVpZ2h0fSR7Y2VsbEhlaWdodFVuaXR9YCk7XHJcbiAgICAgICAgICAgIC8vIGNvbnRlbnQgbWFyZ2luc1xyXG4gICAgICAgICAgICBsZXQgdG9wID0gdGhpcy5vcHRzLm1hcmdpblRvcCArIHRoaXMub3B0cy5tYXJnaW5Vbml0O1xyXG4gICAgICAgICAgICBsZXQgYm90dG9tID0gdGhpcy5vcHRzLm1hcmdpbkJvdHRvbSArIHRoaXMub3B0cy5tYXJnaW5Vbml0O1xyXG4gICAgICAgICAgICBsZXQgcmlnaHQgPSB0aGlzLm9wdHMubWFyZ2luUmlnaHQgKyB0aGlzLm9wdHMubWFyZ2luVW5pdDtcclxuICAgICAgICAgICAgbGV0IGxlZnQgPSB0aGlzLm9wdHMubWFyZ2luTGVmdCArIHRoaXMub3B0cy5tYXJnaW5Vbml0O1xyXG4gICAgICAgICAgICBsZXQgY29udGVudCA9IGAke3ByZWZpeH0gPiAuZ3JpZC1zdGFjay1pdGVtLWNvbnRlbnRgO1xyXG4gICAgICAgICAgICBsZXQgcGxhY2Vob2xkZXIgPSBgLiR7dGhpcy5fc3R5bGVTaGVldENsYXNzfSA+IC5ncmlkLXN0YWNrLXBsYWNlaG9sZGVyID4gLnBsYWNlaG9sZGVyLWNvbnRlbnRgO1xyXG4gICAgICAgICAgICB1dGlsc18xLlV0aWxzLmFkZENTU1J1bGUodGhpcy5fc3R5bGVzLCBjb250ZW50LCBgdG9wOiAke3RvcH07IHJpZ2h0OiAke3JpZ2h0fTsgYm90dG9tOiAke2JvdHRvbX07IGxlZnQ6ICR7bGVmdH07YCk7XHJcbiAgICAgICAgICAgIHV0aWxzXzEuVXRpbHMuYWRkQ1NTUnVsZSh0aGlzLl9zdHlsZXMsIHBsYWNlaG9sZGVyLCBgdG9wOiAke3RvcH07IHJpZ2h0OiAke3JpZ2h0fTsgYm90dG9tOiAke2JvdHRvbX07IGxlZnQ6ICR7bGVmdH07YCk7XHJcbiAgICAgICAgICAgIC8vIHJlc2l6ZSBoYW5kbGVzIG9mZnNldCAodG8gbWF0Y2ggbWFyZ2luKVxyXG4gICAgICAgICAgICB1dGlsc18xLlV0aWxzLmFkZENTU1J1bGUodGhpcy5fc3R5bGVzLCBgJHtwcmVmaXh9ID4gLnVpLXJlc2l6YWJsZS1uZWAsIGByaWdodDogJHtyaWdodH1gKTtcclxuICAgICAgICAgICAgdXRpbHNfMS5VdGlscy5hZGRDU1NSdWxlKHRoaXMuX3N0eWxlcywgYCR7cHJlZml4fSA+IC51aS1yZXNpemFibGUtZWAsIGByaWdodDogJHtyaWdodH1gKTtcclxuICAgICAgICAgICAgdXRpbHNfMS5VdGlscy5hZGRDU1NSdWxlKHRoaXMuX3N0eWxlcywgYCR7cHJlZml4fSA+IC51aS1yZXNpemFibGUtc2VgLCBgcmlnaHQ6ICR7cmlnaHR9OyBib3R0b206ICR7Ym90dG9tfWApO1xyXG4gICAgICAgICAgICB1dGlsc18xLlV0aWxzLmFkZENTU1J1bGUodGhpcy5fc3R5bGVzLCBgJHtwcmVmaXh9ID4gLnVpLXJlc2l6YWJsZS1ud2AsIGBsZWZ0OiAke2xlZnR9YCk7XHJcbiAgICAgICAgICAgIHV0aWxzXzEuVXRpbHMuYWRkQ1NTUnVsZSh0aGlzLl9zdHlsZXMsIGAke3ByZWZpeH0gPiAudWktcmVzaXphYmxlLXdgLCBgbGVmdDogJHtsZWZ0fWApO1xyXG4gICAgICAgICAgICB1dGlsc18xLlV0aWxzLmFkZENTU1J1bGUodGhpcy5fc3R5bGVzLCBgJHtwcmVmaXh9ID4gLnVpLXJlc2l6YWJsZS1zd2AsIGBsZWZ0OiAke2xlZnR9OyBib3R0b206ICR7Ym90dG9tfWApO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBub3cgdXBkYXRlIHRoZSBoZWlnaHQgc3BlY2lmaWMgZmllbGRzXHJcbiAgICAgICAgbWF4SCA9IG1heEggfHwgdGhpcy5fc3R5bGVzLl9tYXg7XHJcbiAgICAgICAgaWYgKG1heEggPiB0aGlzLl9zdHlsZXMuX21heCkge1xyXG4gICAgICAgICAgICBsZXQgZ2V0SGVpZ2h0ID0gKHJvd3MpID0+IChjZWxsSGVpZ2h0ICogcm93cykgKyBjZWxsSGVpZ2h0VW5pdDtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuX3N0eWxlcy5fbWF4ICsgMTsgaSA8PSBtYXhIOyBpKyspIHsgLy8gc3RhcnQgYXQgMVxyXG4gICAgICAgICAgICAgICAgbGV0IGggPSBnZXRIZWlnaHQoaSk7XHJcbiAgICAgICAgICAgICAgICB1dGlsc18xLlV0aWxzLmFkZENTU1J1bGUodGhpcy5fc3R5bGVzLCBgJHtwcmVmaXh9W2dzLXk9XCIke2kgLSAxfVwiXWAsIGB0b3A6ICR7Z2V0SGVpZ2h0KGkgLSAxKX1gKTsgLy8gc3RhcnQgYXQgMFxyXG4gICAgICAgICAgICAgICAgdXRpbHNfMS5VdGlscy5hZGRDU1NSdWxlKHRoaXMuX3N0eWxlcywgYCR7cHJlZml4fVtncy1oPVwiJHtpfVwiXWAsIGBoZWlnaHQ6ICR7aH1gKTtcclxuICAgICAgICAgICAgICAgIHV0aWxzXzEuVXRpbHMuYWRkQ1NTUnVsZSh0aGlzLl9zdHlsZXMsIGAke3ByZWZpeH1bZ3MtbWluLWg9XCIke2l9XCJdYCwgYG1pbi1oZWlnaHQ6ICR7aH1gKTtcclxuICAgICAgICAgICAgICAgIHV0aWxzXzEuVXRpbHMuYWRkQ1NTUnVsZSh0aGlzLl9zdHlsZXMsIGAke3ByZWZpeH1bZ3MtbWF4LWg9XCIke2l9XCJdYCwgYG1heC1oZWlnaHQ6ICR7aH1gKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLl9zdHlsZXMuX21heCA9IG1heEg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgX3VwZGF0ZUNvbnRhaW5lckhlaWdodCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuZW5naW5lIHx8IHRoaXMuZW5naW5lLmJhdGNoTW9kZSlcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgbGV0IHJvdyA9IHRoaXMuZ2V0Um93KCkgKyB0aGlzLl9leHRyYURyYWdSb3c7IC8vIGNoZWNrcyBmb3IgbWluUm93IGFscmVhZHlcclxuICAgICAgICAvLyBjaGVjayBmb3IgY3NzIG1pbiBoZWlnaHRcclxuICAgICAgICAvLyBOb3RlOiB3ZSBkb24ndCBoYW5kbGUgJSxyZW0gY29ycmVjdGx5IHNvIGNvbW1lbnQgb3V0LCBiZXNpZGUgd2UgZG9uJ3QgbmVlZCBuZWVkIHRvIGNyZWF0ZSB1bi1uZWNlc3NhcnlcclxuICAgICAgICAvLyByb3dzIGFzIHRoZSBDU1Mgd2lsbCBtYWtlIHVzIGJpZ2dlciB0aGFuIG91ciBzZXQgaGVpZ2h0IGlmIG5lZWRlZC4uLiBub3Qgc3VyZSB3aHkgd2UgaGFkIHRoaXMuXHJcbiAgICAgICAgLy8gbGV0IGNzc01pbkhlaWdodCA9IHBhcnNlSW50KGdldENvbXB1dGVkU3R5bGUodGhpcy5lbClbJ21pbi1oZWlnaHQnXSk7XHJcbiAgICAgICAgLy8gaWYgKGNzc01pbkhlaWdodCA+IDApIHtcclxuICAgICAgICAvLyAgIGxldCBtaW5Sb3cgPSBNYXRoLnJvdW5kKGNzc01pbkhlaWdodCAvIHRoaXMuZ2V0Q2VsbEhlaWdodCh0cnVlKSk7XHJcbiAgICAgICAgLy8gICBpZiAocm93IDwgbWluUm93KSB7XHJcbiAgICAgICAgLy8gICAgIHJvdyA9IG1pblJvdztcclxuICAgICAgICAvLyAgIH1cclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgdGhpcy5lbC5zZXRBdHRyaWJ1dGUoJ2dzLWN1cnJlbnQtcm93JywgU3RyaW5nKHJvdykpO1xyXG4gICAgICAgIGlmIChyb3cgPT09IDApIHtcclxuICAgICAgICAgICAgdGhpcy5lbC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnbWluLWhlaWdodCcpO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGNlbGxIZWlnaHQgPSB0aGlzLm9wdHMuY2VsbEhlaWdodDtcclxuICAgICAgICBsZXQgdW5pdCA9IHRoaXMub3B0cy5jZWxsSGVpZ2h0VW5pdDtcclxuICAgICAgICBpZiAoIWNlbGxIZWlnaHQpXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgIHRoaXMuZWwuc3R5bGUubWluSGVpZ2h0ID0gcm93ICogY2VsbEhlaWdodCArIHVuaXQ7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBfcHJlcGFyZUVsZW1lbnQoZWwsIHRyaWdnZXJBZGRFdmVudCA9IGZhbHNlLCBub2RlKSB7XHJcbiAgICAgICAgZWwuY2xhc3NMaXN0LmFkZCh0aGlzLm9wdHMuaXRlbUNsYXNzKTtcclxuICAgICAgICBub2RlID0gbm9kZSB8fCB0aGlzLl9yZWFkQXR0cihlbCk7XHJcbiAgICAgICAgZWwuZ3JpZHN0YWNrTm9kZSA9IG5vZGU7XHJcbiAgICAgICAgbm9kZS5lbCA9IGVsO1xyXG4gICAgICAgIG5vZGUuZ3JpZCA9IHRoaXM7XHJcbiAgICAgICAgbGV0IGNvcHkgPSBPYmplY3QuYXNzaWduKHt9LCBub2RlKTtcclxuICAgICAgICBub2RlID0gdGhpcy5lbmdpbmUuYWRkTm9kZShub2RlLCB0cmlnZ2VyQWRkRXZlbnQpO1xyXG4gICAgICAgIC8vIHdyaXRlIG5vZGUgYXR0ciBiYWNrIGluIGNhc2UgdGhlcmUgd2FzIGNvbGxpc2lvbiBvciB3ZSBoYXZlIHRvIGZpeCBiYWQgdmFsdWVzIGR1cmluZyBhZGROb2RlKClcclxuICAgICAgICBpZiAoIXV0aWxzXzEuVXRpbHMuc2FtZShub2RlLCBjb3B5KSkge1xyXG4gICAgICAgICAgICB0aGlzLl93cml0ZUF0dHIoZWwsIG5vZGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9wcmVwYXJlRHJhZ0Ryb3BCeU5vZGUobm9kZSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICAvKiogQGludGVybmFsIGNhbGwgdG8gd3JpdGUgcG9zaXRpb24geCx5LHcsaCBhdHRyaWJ1dGVzIGJhY2sgdG8gZWxlbWVudCAqL1xyXG4gICAgX3dyaXRlUG9zQXR0cihlbCwgbikge1xyXG4gICAgICAgIGlmIChuLnggIT09IHVuZGVmaW5lZCAmJiBuLnggIT09IG51bGwpIHtcclxuICAgICAgICAgICAgZWwuc2V0QXR0cmlidXRlKCdncy14JywgU3RyaW5nKG4ueCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobi55ICE9PSB1bmRlZmluZWQgJiYgbi55ICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZSgnZ3MteScsIFN0cmluZyhuLnkpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG4udykge1xyXG4gICAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoJ2dzLXcnLCBTdHJpbmcobi53KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChuLmgpIHtcclxuICAgICAgICAgICAgZWwuc2V0QXR0cmlidXRlKCdncy1oJywgU3RyaW5nKG4uaCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICAgIC8qKiBAaW50ZXJuYWwgY2FsbCB0byB3cml0ZSBhbnkgZGVmYXVsdCBhdHRyaWJ1dGVzIGJhY2sgdG8gZWxlbWVudCAqL1xyXG4gICAgX3dyaXRlQXR0cihlbCwgbm9kZSkge1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgdGhpcy5fd3JpdGVQb3NBdHRyKGVsLCBub2RlKTtcclxuICAgICAgICBsZXQgYXR0cnMgLyo6IEdyaWRTdGFja1dpZGdldCBidXQgc3RyaW5ncyAqLyA9IHtcclxuICAgICAgICAgICAgYXV0b1Bvc2l0aW9uOiAnZ3MtYXV0by1wb3NpdGlvbicsXHJcbiAgICAgICAgICAgIG1pblc6ICdncy1taW4tdycsXHJcbiAgICAgICAgICAgIG1pbkg6ICdncy1taW4taCcsXHJcbiAgICAgICAgICAgIG1heFc6ICdncy1tYXgtdycsXHJcbiAgICAgICAgICAgIG1heEg6ICdncy1tYXgtaCcsXHJcbiAgICAgICAgICAgIG5vUmVzaXplOiAnZ3Mtbm8tcmVzaXplJyxcclxuICAgICAgICAgICAgbm9Nb3ZlOiAnZ3Mtbm8tbW92ZScsXHJcbiAgICAgICAgICAgIGxvY2tlZDogJ2dzLWxvY2tlZCcsXHJcbiAgICAgICAgICAgIGlkOiAnZ3MtaWQnLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gYXR0cnMpIHtcclxuICAgICAgICAgICAgaWYgKG5vZGVba2V5XSkgeyAvLyAwIGlzIHZhbGlkIGZvciB4LHkgb25seSBidXQgZG9uZSBhYm92ZSBhbHJlYWR5IGFuZCBub3QgaW4gbGlzdCBhbnl3YXlcclxuICAgICAgICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZShhdHRyc1trZXldLCBTdHJpbmcobm9kZVtrZXldKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoYXR0cnNba2V5XSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICAvKiogQGludGVybmFsIGNhbGwgdG8gcmVhZCBhbnkgZGVmYXVsdCBhdHRyaWJ1dGVzIGZyb20gZWxlbWVudCAqL1xyXG4gICAgX3JlYWRBdHRyKGVsKSB7XHJcbiAgICAgICAgbGV0IG5vZGUgPSB7fTtcclxuICAgICAgICBub2RlLnggPSB1dGlsc18xLlV0aWxzLnRvTnVtYmVyKGVsLmdldEF0dHJpYnV0ZSgnZ3MteCcpKTtcclxuICAgICAgICBub2RlLnkgPSB1dGlsc18xLlV0aWxzLnRvTnVtYmVyKGVsLmdldEF0dHJpYnV0ZSgnZ3MteScpKTtcclxuICAgICAgICBub2RlLncgPSB1dGlsc18xLlV0aWxzLnRvTnVtYmVyKGVsLmdldEF0dHJpYnV0ZSgnZ3MtdycpKTtcclxuICAgICAgICBub2RlLmggPSB1dGlsc18xLlV0aWxzLnRvTnVtYmVyKGVsLmdldEF0dHJpYnV0ZSgnZ3MtaCcpKTtcclxuICAgICAgICBub2RlLm1heFcgPSB1dGlsc18xLlV0aWxzLnRvTnVtYmVyKGVsLmdldEF0dHJpYnV0ZSgnZ3MtbWF4LXcnKSk7XHJcbiAgICAgICAgbm9kZS5taW5XID0gdXRpbHNfMS5VdGlscy50b051bWJlcihlbC5nZXRBdHRyaWJ1dGUoJ2dzLW1pbi13JykpO1xyXG4gICAgICAgIG5vZGUubWF4SCA9IHV0aWxzXzEuVXRpbHMudG9OdW1iZXIoZWwuZ2V0QXR0cmlidXRlKCdncy1tYXgtaCcpKTtcclxuICAgICAgICBub2RlLm1pbkggPSB1dGlsc18xLlV0aWxzLnRvTnVtYmVyKGVsLmdldEF0dHJpYnV0ZSgnZ3MtbWluLWgnKSk7XHJcbiAgICAgICAgbm9kZS5hdXRvUG9zaXRpb24gPSB1dGlsc18xLlV0aWxzLnRvQm9vbChlbC5nZXRBdHRyaWJ1dGUoJ2dzLWF1dG8tcG9zaXRpb24nKSk7XHJcbiAgICAgICAgbm9kZS5ub1Jlc2l6ZSA9IHV0aWxzXzEuVXRpbHMudG9Cb29sKGVsLmdldEF0dHJpYnV0ZSgnZ3Mtbm8tcmVzaXplJykpO1xyXG4gICAgICAgIG5vZGUubm9Nb3ZlID0gdXRpbHNfMS5VdGlscy50b0Jvb2woZWwuZ2V0QXR0cmlidXRlKCdncy1uby1tb3ZlJykpO1xyXG4gICAgICAgIG5vZGUubG9ja2VkID0gdXRpbHNfMS5VdGlscy50b0Jvb2woZWwuZ2V0QXR0cmlidXRlKCdncy1sb2NrZWQnKSk7XHJcbiAgICAgICAgbm9kZS5pZCA9IGVsLmdldEF0dHJpYnV0ZSgnZ3MtaWQnKTtcclxuICAgICAgICAvLyByZW1vdmUgYW55IGtleSBub3QgZm91bmQgKG51bGwgb3IgZmFsc2Ugd2hpY2ggaXMgZGVmYXVsdClcclxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBub2RlKSB7XHJcbiAgICAgICAgICAgIGlmICghbm9kZS5oYXNPd25Qcm9wZXJ0eShrZXkpKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICBpZiAoIW5vZGVba2V5XSAmJiBub2RlW2tleV0gIT09IDApIHsgLy8gMCBjYW4gYmUgdmFsaWQgdmFsdWUgKHgseSBvbmx5IHJlYWxseSlcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSBub2RlW2tleV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG5vZGU7XHJcbiAgICB9XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBfc2V0U3RhdGljQ2xhc3MoKSB7XHJcbiAgICAgICAgbGV0IGNsYXNzZXMgPSBbJ2dyaWQtc3RhY2stc3RhdGljJ107XHJcbiAgICAgICAgaWYgKHRoaXMub3B0cy5zdGF0aWNHcmlkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZWwuY2xhc3NMaXN0LmFkZCguLi5jbGFzc2VzKTtcclxuICAgICAgICAgICAgdGhpcy5lbC5zZXRBdHRyaWJ1dGUoJ2dzLXN0YXRpYycsICd0cnVlJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmVsLmNsYXNzTGlzdC5yZW1vdmUoLi4uY2xhc3Nlcyk7XHJcbiAgICAgICAgICAgIHRoaXMuZWwucmVtb3ZlQXR0cmlidXRlKCdncy1zdGF0aWMnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIGNhbGxlZCB3aGVuIHdlIGFyZSBiZWluZyByZXNpemVkIGJ5IHRoZSB3aW5kb3cgLSBjaGVjayBpZiB0aGUgb25lIENvbHVtbiBNb2RlIG5lZWRzIHRvIGJlIHR1cm5lZCBvbi9vZmZcclxuICAgICAqIGFuZCByZW1lbWJlciB0aGUgcHJldiBjb2x1bW5zIHdlIHVzZWQsIG9yIGdldCBvdXIgY291bnQgZnJvbSBwYXJlbnQsIGFzIHdlbGwgYXMgY2hlY2sgZm9yIGF1dG8gY2VsbCBoZWlnaHQgKHNxdWFyZSlcclxuICAgICAqL1xyXG4gICAgb25QYXJlbnRSZXNpemUoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmVsIHx8ICF0aGlzLmVsLmNsaWVudFdpZHRoKVxyXG4gICAgICAgICAgICByZXR1cm47IC8vIHJldHVybiBpZiB3ZSdyZSBnb25lIG9yIG5vIHNpemUgeWV0ICh3aWxsIGdldCBjYWxsZWQgYWdhaW4pXHJcbiAgICAgICAgbGV0IGNoYW5nZWRDb2x1bW4gPSBmYWxzZTtcclxuICAgICAgICAvLyBzZWUgaWYgd2UncmUgbmVzdGVkIGFuZCB0YWtlIG91ciBjb2x1bW4gY291bnQgZnJvbSBvdXIgcGFyZW50Li4uLlxyXG4gICAgICAgIGlmICh0aGlzLl9hdXRvQ29sdW1uICYmIHRoaXMucGFyZW50R3JpZEl0ZW0pIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMub3B0cy5jb2x1bW4gIT09IHRoaXMucGFyZW50R3JpZEl0ZW0udykge1xyXG4gICAgICAgICAgICAgICAgY2hhbmdlZENvbHVtbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbHVtbih0aGlzLnBhcmVudEdyaWRJdGVtLncsICdub25lJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIGVsc2UgY2hlY2sgZm9yIDEgY29sdW1uIGluL291dCBiZWhhdmlvclxyXG4gICAgICAgICAgICBsZXQgb25lQ29sdW1uID0gIXRoaXMub3B0cy5kaXNhYmxlT25lQ29sdW1uTW9kZSAmJiB0aGlzLmVsLmNsaWVudFdpZHRoIDw9IHRoaXMub3B0cy5vbmVDb2x1bW5TaXplO1xyXG4gICAgICAgICAgICBpZiAoKHRoaXMub3B0cy5jb2x1bW4gPT09IDEpICE9PSBvbmVDb2x1bW4pIHtcclxuICAgICAgICAgICAgICAgIGNoYW5nZWRDb2x1bW4gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0cy5hbmltYXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBbmltYXRpb24oZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgfSAvLyAxIDwtPiAxMiBpcyB0b28gcmFkaWNhbCwgdHVybiBvZmYgYW5pbWF0aW9uXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbHVtbihvbmVDb2x1bW4gPyAxIDogdGhpcy5fcHJldkNvbHVtbik7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRzLmFuaW1hdGUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEFuaW1hdGlvbih0cnVlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBtYWtlIHRoZSBjZWxscyBjb250ZW50IHNxdWFyZSBhZ2FpblxyXG4gICAgICAgIGlmICh0aGlzLl9pc0F1dG9DZWxsSGVpZ2h0KSB7XHJcbiAgICAgICAgICAgIGlmICghY2hhbmdlZENvbHVtbiAmJiB0aGlzLm9wdHMuY2VsbEhlaWdodFRocm90dGxlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2NlbGxIZWlnaHRUaHJvdHRsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NlbGxIZWlnaHRUaHJvdHRsZSA9IHV0aWxzXzEuVXRpbHMudGhyb3R0bGUoKCkgPT4gdGhpcy5jZWxsSGVpZ2h0KCksIHRoaXMub3B0cy5jZWxsSGVpZ2h0VGhyb3R0bGUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5fY2VsbEhlaWdodFRocm90dGxlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBpbW1lZGlhdGUgdXBkYXRlIGlmIHdlJ3ZlIGNoYW5nZWQgY29sdW1uIGNvdW50IG9yIGhhdmUgbm8gdGhyZXNob2xkXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNlbGxIZWlnaHQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBmaW5hbGx5IHVwZGF0ZSBhbnkgbmVzdGVkIGdyaWRzXHJcbiAgICAgICAgdGhpcy5lbmdpbmUubm9kZXMuZm9yRWFjaChuID0+IHtcclxuICAgICAgICAgICAgaWYgKG4uc3ViR3JpZCkge1xyXG4gICAgICAgICAgICAgICAgbi5zdWJHcmlkLm9uUGFyZW50UmVzaXplKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICAgIC8qKiBhZGQgb3IgcmVtb3ZlIHRoZSB3aW5kb3cgc2l6ZSBldmVudCBoYW5kbGVyICovXHJcbiAgICBfdXBkYXRlV2luZG93UmVzaXplRXZlbnQoZm9yY2VSZW1vdmUgPSBmYWxzZSkge1xyXG4gICAgICAgIC8vIG9ubHkgYWRkIGV2ZW50IGlmIHdlJ3JlIG5vdCBuZXN0ZWQgKHBhcmVudCB3aWxsIGNhbGwgdXMpIGFuZCB3ZSdyZSBhdXRvIHNpemluZyBjZWxscyBvciBzdXBwb3J0aW5nIG9uZUNvbHVtbiAoaS5lLiBkb2luZyB3b3JrKVxyXG4gICAgICAgIGNvbnN0IHdvcmtUb2RvID0gKHRoaXMuX2lzQXV0b0NlbGxIZWlnaHQgfHwgIXRoaXMub3B0cy5kaXNhYmxlT25lQ29sdW1uTW9kZSkgJiYgIXRoaXMucGFyZW50R3JpZEl0ZW07XHJcbiAgICAgICAgaWYgKCFmb3JjZVJlbW92ZSAmJiB3b3JrVG9kbyAmJiAhdGhpcy5fd2luZG93UmVzaXplQmluZCkge1xyXG4gICAgICAgICAgICB0aGlzLl93aW5kb3dSZXNpemVCaW5kID0gdGhpcy5vblBhcmVudFJlc2l6ZS5iaW5kKHRoaXMpOyAvLyBzbyB3ZSBjYW4gcHJvcGVybHkgcmVtb3ZlIGxhdGVyXHJcbiAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLl93aW5kb3dSZXNpemVCaW5kKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoKGZvcmNlUmVtb3ZlIHx8ICF3b3JrVG9kbykgJiYgdGhpcy5fd2luZG93UmVzaXplQmluZCkge1xyXG4gICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5fd2luZG93UmVzaXplQmluZCk7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl93aW5kb3dSZXNpemVCaW5kOyAvLyByZW1vdmUgbGluayB0byB1cyBzbyB3ZSBjYW4gZnJlZVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICAgIC8qKiBAaW50ZXJuYWwgY29udmVydCBhIHBvdGVudGlhbCBzZWxlY3RvciBpbnRvIGFjdHVhbCBlbGVtZW50ICovXHJcbiAgICBzdGF0aWMgZ2V0RWxlbWVudChlbHMgPSAnLmdyaWQtc3RhY2staXRlbScpIHsgcmV0dXJuIHV0aWxzXzEuVXRpbHMuZ2V0RWxlbWVudChlbHMpOyB9XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBzdGF0aWMgZ2V0RWxlbWVudHMoZWxzID0gJy5ncmlkLXN0YWNrLWl0ZW0nKSB7IHJldHVybiB1dGlsc18xLlV0aWxzLmdldEVsZW1lbnRzKGVscyk7IH1cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHN0YXRpYyBnZXRHcmlkRWxlbWVudChlbHMpIHsgcmV0dXJuIEdyaWRTdGFjay5nZXRFbGVtZW50KGVscyk7IH1cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHN0YXRpYyBnZXRHcmlkRWxlbWVudHMoZWxzKSB7IHJldHVybiB1dGlsc18xLlV0aWxzLmdldEVsZW1lbnRzKGVscyk7IH1cclxuICAgIC8qKiBAaW50ZXJuYWwgaW5pdGlhbGl6ZSBtYXJnaW4gdG9wL2JvdHRvbS9sZWZ0L3JpZ2h0IGFuZCB1bml0cyAqL1xyXG4gICAgX2luaXRNYXJnaW4oKSB7XHJcbiAgICAgICAgbGV0IGRhdGE7XHJcbiAgICAgICAgbGV0IG1hcmdpbiA9IDA7XHJcbiAgICAgICAgLy8gc3VwcG9ydCBwYXNzaW5nIG11bHRpcGxlIHZhbHVlcyBsaWtlIENTUyAoZXg6ICc1cHggMTBweCAwIDIwcHgnKVxyXG4gICAgICAgIGxldCBtYXJnaW5zID0gW107XHJcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdHMubWFyZ2luID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBtYXJnaW5zID0gdGhpcy5vcHRzLm1hcmdpbi5zcGxpdCgnICcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobWFyZ2lucy5sZW5ndGggPT09IDIpIHsgLy8gdG9wL2JvdCwgbGVmdC9yaWdodCBsaWtlIENTU1xyXG4gICAgICAgICAgICB0aGlzLm9wdHMubWFyZ2luVG9wID0gdGhpcy5vcHRzLm1hcmdpbkJvdHRvbSA9IG1hcmdpbnNbMF07XHJcbiAgICAgICAgICAgIHRoaXMub3B0cy5tYXJnaW5MZWZ0ID0gdGhpcy5vcHRzLm1hcmdpblJpZ2h0ID0gbWFyZ2luc1sxXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAobWFyZ2lucy5sZW5ndGggPT09IDQpIHsgLy8gQ2xvY2t3aXNlIGxpa2UgQ1NTXHJcbiAgICAgICAgICAgIHRoaXMub3B0cy5tYXJnaW5Ub3AgPSBtYXJnaW5zWzBdO1xyXG4gICAgICAgICAgICB0aGlzLm9wdHMubWFyZ2luUmlnaHQgPSBtYXJnaW5zWzFdO1xyXG4gICAgICAgICAgICB0aGlzLm9wdHMubWFyZ2luQm90dG9tID0gbWFyZ2luc1syXTtcclxuICAgICAgICAgICAgdGhpcy5vcHRzLm1hcmdpbkxlZnQgPSBtYXJnaW5zWzNdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgZGF0YSA9IHV0aWxzXzEuVXRpbHMucGFyc2VIZWlnaHQodGhpcy5vcHRzLm1hcmdpbik7XHJcbiAgICAgICAgICAgIHRoaXMub3B0cy5tYXJnaW5Vbml0ID0gZGF0YS51bml0O1xyXG4gICAgICAgICAgICBtYXJnaW4gPSB0aGlzLm9wdHMubWFyZ2luID0gZGF0YS5oO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBzZWUgaWYgdG9wL2JvdHRvbS9sZWZ0L3JpZ2h0IG5lZWQgdG8gYmUgc2V0IGFzIHdlbGxcclxuICAgICAgICBpZiAodGhpcy5vcHRzLm1hcmdpblRvcCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMub3B0cy5tYXJnaW5Ub3AgPSBtYXJnaW47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBkYXRhID0gdXRpbHNfMS5VdGlscy5wYXJzZUhlaWdodCh0aGlzLm9wdHMubWFyZ2luVG9wKTtcclxuICAgICAgICAgICAgdGhpcy5vcHRzLm1hcmdpblRvcCA9IGRhdGEuaDtcclxuICAgICAgICAgICAgZGVsZXRlIHRoaXMub3B0cy5tYXJnaW47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLm9wdHMubWFyZ2luQm90dG9tID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5vcHRzLm1hcmdpbkJvdHRvbSA9IG1hcmdpbjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGRhdGEgPSB1dGlsc18xLlV0aWxzLnBhcnNlSGVpZ2h0KHRoaXMub3B0cy5tYXJnaW5Cb3R0b20pO1xyXG4gICAgICAgICAgICB0aGlzLm9wdHMubWFyZ2luQm90dG9tID0gZGF0YS5oO1xyXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5vcHRzLm1hcmdpbjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMub3B0cy5tYXJnaW5SaWdodCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMub3B0cy5tYXJnaW5SaWdodCA9IG1hcmdpbjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGRhdGEgPSB1dGlsc18xLlV0aWxzLnBhcnNlSGVpZ2h0KHRoaXMub3B0cy5tYXJnaW5SaWdodCk7XHJcbiAgICAgICAgICAgIHRoaXMub3B0cy5tYXJnaW5SaWdodCA9IGRhdGEuaDtcclxuICAgICAgICAgICAgZGVsZXRlIHRoaXMub3B0cy5tYXJnaW47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLm9wdHMubWFyZ2luTGVmdCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMub3B0cy5tYXJnaW5MZWZ0ID0gbWFyZ2luO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgZGF0YSA9IHV0aWxzXzEuVXRpbHMucGFyc2VIZWlnaHQodGhpcy5vcHRzLm1hcmdpbkxlZnQpO1xyXG4gICAgICAgICAgICB0aGlzLm9wdHMubWFyZ2luTGVmdCA9IGRhdGEuaDtcclxuICAgICAgICAgICAgZGVsZXRlIHRoaXMub3B0cy5tYXJnaW47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMub3B0cy5tYXJnaW5Vbml0ID0gZGF0YS51bml0OyAvLyBpbiBjYXNlIHNpZGUgd2VyZSBzcGVsbGVkIG91dCwgdXNlIHRob3NlIHVuaXRzIGluc3RlYWQuLi5cclxuICAgICAgICBpZiAodGhpcy5vcHRzLm1hcmdpblRvcCA9PT0gdGhpcy5vcHRzLm1hcmdpbkJvdHRvbSAmJiB0aGlzLm9wdHMubWFyZ2luTGVmdCA9PT0gdGhpcy5vcHRzLm1hcmdpblJpZ2h0ICYmIHRoaXMub3B0cy5tYXJnaW5Ub3AgPT09IHRoaXMub3B0cy5tYXJnaW5SaWdodCkge1xyXG4gICAgICAgICAgICB0aGlzLm9wdHMubWFyZ2luID0gdGhpcy5vcHRzLm1hcmdpblRvcDsgLy8gbWFrZXMgaXQgZWFzaWVyIHRvIGNoZWNrIGZvciBuby1vcHMgaW4gc2V0TWFyZ2luKClcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgICAgKiBkcmFnJmRyb3AgbWV0aG9kcyB0aGF0IHVzZWQgdG8gYmUgc3R1YmJlZCBvdXQgYW5kIGltcGxlbWVudGVkIGluIGRkLWdyaWRzdGFjay50c1xyXG4gICAgICogYnV0IGNhdXNlZCBsb2FkaW5nIGlzc3VlcyBpbiBwcm9kIC0gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9ncmlkc3RhY2svZ3JpZHN0YWNrLmpzL2lzc3Vlcy8yMDM5XHJcbiAgICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgICAgKi9cclxuICAgIC8qKiBnZXQgdGhlIGdsb2JhbCAoYnV0IHN0YXRpYyB0byB0aGlzIGNvZGUpIEREIGltcGxlbWVudGF0aW9uICovXHJcbiAgICBzdGF0aWMgZ2V0REQoKSB7XHJcbiAgICAgICAgcmV0dXJuIGRkO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBjYWxsIHRvIHNldHVwIGRyYWdnaW5nIGluIGZyb20gdGhlIG91dHNpZGUgKHNheSB0b29sYmFyKSwgYnkgc3BlY2lmeWluZyB0aGUgY2xhc3Mgc2VsZWN0aW9uIGFuZCBvcHRpb25zLlxyXG4gICAgICogQ2FsbGVkIGR1cmluZyBHcmlkU3RhY2suaW5pdCgpIGFzIG9wdGlvbnMsIGJ1dCBjYW4gYWxzbyBiZSBjYWxsZWQgZGlyZWN0bHkgKGxhc3QgcGFyYW0gYXJlIHVzZWQpIGluIGNhc2UgdGhlIHRvb2xiYXJcclxuICAgICAqIGlzIGR5bmFtaWNhbGx5IGNyZWF0ZSBhbmQgbmVlZHMgdG8gYmUgc2V0IGxhdGVyLlxyXG4gICAgICogQHBhcmFtIGRyYWdJbiBzdHJpbmcgc2VsZWN0b3IgKGV4OiAnLnNpZGViYXIgLmdyaWQtc3RhY2staXRlbScpXHJcbiAgICAgKiBAcGFyYW0gZHJhZ0luT3B0aW9ucyBvcHRpb25zIC0gc2VlIERERHJhZ0luT3B0LiAoZGVmYXVsdDoge2hhbmRsZTogJy5ncmlkLXN0YWNrLWl0ZW0tY29udGVudCcsIGFwcGVuZFRvOiAnYm9keSd9XHJcbiAgICAgKiovXHJcbiAgICBzdGF0aWMgc2V0dXBEcmFnSW4oZHJhZ0luLCBkcmFnSW5PcHRpb25zKSB7XHJcbiAgICAgICAgaWYgKChkcmFnSW5PcHRpb25zID09PSBudWxsIHx8IGRyYWdJbk9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRyYWdJbk9wdGlvbnMucGF1c2UpICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgZGRfbWFuYWdlcl8xLkRETWFuYWdlci5wYXVzZURyYWcgPSBkcmFnSW5PcHRpb25zLnBhdXNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodHlwZW9mIGRyYWdJbiA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgZHJhZ0luT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdHlwZXNfMS5kcmFnSW5EZWZhdWx0T3B0aW9ucyksIChkcmFnSW5PcHRpb25zIHx8IHt9KSk7XHJcbiAgICAgICAgICAgIHV0aWxzXzEuVXRpbHMuZ2V0RWxlbWVudHMoZHJhZ0luKS5mb3JFYWNoKGVsID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICghZGQuaXNEcmFnZ2FibGUoZWwpKVxyXG4gICAgICAgICAgICAgICAgICAgIGRkLmRyYWdJbihlbCwgZHJhZ0luT3B0aW9ucyk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRW5hYmxlcy9EaXNhYmxlcyBkcmFnZ2luZyBieSB0aGUgdXNlciBvZiBzcGVjaWZpYyBncmlkIGVsZW1lbnQuIElmIHlvdSB3YW50IGFsbCBpdGVtcywgYW5kIGhhdmUgaXQgYWZmZWN0IGZ1dHVyZSBpdGVtcywgdXNlIGVuYWJsZU1vdmUoKSBpbnN0ZWFkLiBOby1vcCBmb3Igc3RhdGljIGdyaWRzLlxyXG4gICAgICogSUYgeW91IGFyZSBsb29raW5nIHRvIHByZXZlbnQgYW4gaXRlbSBmcm9tIG1vdmluZyAoZHVlIHRvIGJlaW5nIHB1c2hlZCBhcm91bmQgYnkgYW5vdGhlciBkdXJpbmcgY29sbGlzaW9uKSB1c2UgbG9ja2VkIHByb3BlcnR5IGluc3RlYWQuXHJcbiAgICAgKiBAcGFyYW0gZWxzIHdpZGdldCBvciBzZWxlY3RvciB0byBtb2RpZnkuXHJcbiAgICAgKiBAcGFyYW0gdmFsIGlmIHRydWUgd2lkZ2V0IHdpbGwgYmUgZHJhZ2dhYmxlLlxyXG4gICAgICovXHJcbiAgICBtb3ZhYmxlKGVscywgdmFsKSB7XHJcbiAgICAgICAgaWYgKHRoaXMub3B0cy5zdGF0aWNHcmlkKVxyXG4gICAgICAgICAgICByZXR1cm4gdGhpczsgLy8gY2FuJ3QgbW92ZSBhIHN0YXRpYyBncmlkIVxyXG4gICAgICAgIEdyaWRTdGFjay5nZXRFbGVtZW50cyhlbHMpLmZvckVhY2goZWwgPT4ge1xyXG4gICAgICAgICAgICBsZXQgbm9kZSA9IGVsLmdyaWRzdGFja05vZGU7XHJcbiAgICAgICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKHZhbClcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSBub2RlLm5vTW92ZTtcclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgbm9kZS5ub01vdmUgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLl9wcmVwYXJlRHJhZ0Ryb3BCeU5vZGUobm9kZSk7IC8vIGluaXQgREQgaWYgbmVlZCBiZSwgYW5kIGFkanVzdFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBFbmFibGVzL0Rpc2FibGVzIHVzZXIgcmVzaXppbmcgb2Ygc3BlY2lmaWMgZ3JpZCBlbGVtZW50LiBJZiB5b3Ugd2FudCBhbGwgaXRlbXMsIGFuZCBoYXZlIGl0IGFmZmVjdCBmdXR1cmUgaXRlbXMsIHVzZSBlbmFibGVSZXNpemUoKSBpbnN0ZWFkLiBOby1vcCBmb3Igc3RhdGljIGdyaWRzLlxyXG4gICAgICogQHBhcmFtIGVscyAgd2lkZ2V0IG9yIHNlbGVjdG9yIHRvIG1vZGlmeVxyXG4gICAgICogQHBhcmFtIHZhbCAgaWYgdHJ1ZSB3aWRnZXQgd2lsbCBiZSByZXNpemFibGUuXHJcbiAgICAgKi9cclxuICAgIHJlc2l6YWJsZShlbHMsIHZhbCkge1xyXG4gICAgICAgIGlmICh0aGlzLm9wdHMuc3RhdGljR3JpZClcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7IC8vIGNhbid0IHJlc2l6ZSBhIHN0YXRpYyBncmlkIVxyXG4gICAgICAgIEdyaWRTdGFjay5nZXRFbGVtZW50cyhlbHMpLmZvckVhY2goZWwgPT4ge1xyXG4gICAgICAgICAgICBsZXQgbm9kZSA9IGVsLmdyaWRzdGFja05vZGU7XHJcbiAgICAgICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKHZhbClcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSBub2RlLm5vUmVzaXplO1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBub2RlLm5vUmVzaXplID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5fcHJlcGFyZURyYWdEcm9wQnlOb2RlKG5vZGUpOyAvLyBpbml0IEREIGlmIG5lZWQgYmUsIGFuZCBhZGp1c3RcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogVGVtcG9yYXJpbHkgZGlzYWJsZXMgd2lkZ2V0cyBtb3ZpbmcvcmVzaXppbmcuXHJcbiAgICAgKiBJZiB5b3Ugd2FudCBhIG1vcmUgcGVybWFuZW50IHdheSAod2hpY2ggZnJlZXplcyB1cCByZXNvdXJjZXMpIHVzZSBgc2V0U3RhdGljKHRydWUpYCBpbnN0ZWFkLlxyXG4gICAgICogTm90ZTogbm8tb3AgZm9yIHN0YXRpYyBncmlkXHJcbiAgICAgKiBUaGlzIGlzIGEgc2hvcnRjdXQgZm9yOlxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqICBncmlkLmVuYWJsZU1vdmUoZmFsc2UpO1xyXG4gICAgICogIGdyaWQuZW5hYmxlUmVzaXplKGZhbHNlKTtcclxuICAgICAqIEBwYXJhbSByZWN1cnNlIHRydWUgKGRlZmF1bHQpIGlmIHN1Yi1ncmlkcyBhbHNvIGdldCB1cGRhdGVkXHJcbiAgICAgKi9cclxuICAgIGRpc2FibGUocmVjdXJzZSA9IHRydWUpIHtcclxuICAgICAgICBpZiAodGhpcy5vcHRzLnN0YXRpY0dyaWQpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB0aGlzLmVuYWJsZU1vdmUoZmFsc2UsIHJlY3Vyc2UpO1xyXG4gICAgICAgIHRoaXMuZW5hYmxlUmVzaXplKGZhbHNlLCByZWN1cnNlKTsgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgIHRoaXMuX3RyaWdnZXJFdmVudCgnZGlzYWJsZScpO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZS1lbmFibGVzIHdpZGdldHMgbW92aW5nL3Jlc2l6aW5nIC0gc2VlIGRpc2FibGUoKS5cclxuICAgICAqIE5vdGU6IG5vLW9wIGZvciBzdGF0aWMgZ3JpZC5cclxuICAgICAqIFRoaXMgaXMgYSBzaG9ydGN1dCBmb3I6XHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogIGdyaWQuZW5hYmxlTW92ZSh0cnVlKTtcclxuICAgICAqICBncmlkLmVuYWJsZVJlc2l6ZSh0cnVlKTtcclxuICAgICAqIEBwYXJhbSByZWN1cnNlIHRydWUgKGRlZmF1bHQpIGlmIHN1Yi1ncmlkcyBhbHNvIGdldCB1cGRhdGVkXHJcbiAgICAgKi9cclxuICAgIGVuYWJsZShyZWN1cnNlID0gdHJ1ZSkge1xyXG4gICAgICAgIGlmICh0aGlzLm9wdHMuc3RhdGljR3JpZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMuZW5hYmxlTW92ZSh0cnVlLCByZWN1cnNlKTtcclxuICAgICAgICB0aGlzLmVuYWJsZVJlc2l6ZSh0cnVlLCByZWN1cnNlKTsgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgIHRoaXMuX3RyaWdnZXJFdmVudCgnZW5hYmxlJyk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEVuYWJsZXMvZGlzYWJsZXMgd2lkZ2V0IG1vdmluZy4gTm8tb3AgZm9yIHN0YXRpYyBncmlkcy5cclxuICAgICAqIEBwYXJhbSByZWN1cnNlIHRydWUgKGRlZmF1bHQpIGlmIHN1Yi1ncmlkcyBhbHNvIGdldCB1cGRhdGVkXHJcbiAgICAgKi9cclxuICAgIGVuYWJsZU1vdmUoZG9FbmFibGUsIHJlY3Vyc2UgPSB0cnVlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMub3B0cy5zdGF0aWNHcmlkKVxyXG4gICAgICAgICAgICByZXR1cm4gdGhpczsgLy8gY2FuJ3QgbW92ZSBhIHN0YXRpYyBncmlkIVxyXG4gICAgICAgIHRoaXMub3B0cy5kaXNhYmxlRHJhZyA9ICFkb0VuYWJsZTsgLy8gRklSU1QgYmVmb3JlIHdlIHVwZGF0ZSBjaGlsZHJlbiBhcyBncmlkIG92ZXJyaWRlcyAjMTY1OFxyXG4gICAgICAgIHRoaXMuZW5naW5lLm5vZGVzLmZvckVhY2gobiA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubW92YWJsZShuLmVsLCBkb0VuYWJsZSk7XHJcbiAgICAgICAgICAgIGlmIChuLnN1YkdyaWQgJiYgcmVjdXJzZSlcclxuICAgICAgICAgICAgICAgIG4uc3ViR3JpZC5lbmFibGVNb3ZlKGRvRW5hYmxlLCByZWN1cnNlKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRW5hYmxlcy9kaXNhYmxlcyB3aWRnZXQgcmVzaXppbmcuIE5vLW9wIGZvciBzdGF0aWMgZ3JpZHMuXHJcbiAgICAgKiBAcGFyYW0gcmVjdXJzZSB0cnVlIChkZWZhdWx0KSBpZiBzdWItZ3JpZHMgYWxzbyBnZXQgdXBkYXRlZFxyXG4gICAgICovXHJcbiAgICBlbmFibGVSZXNpemUoZG9FbmFibGUsIHJlY3Vyc2UgPSB0cnVlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMub3B0cy5zdGF0aWNHcmlkKVxyXG4gICAgICAgICAgICByZXR1cm4gdGhpczsgLy8gY2FuJ3Qgc2l6ZSBhIHN0YXRpYyBncmlkIVxyXG4gICAgICAgIHRoaXMub3B0cy5kaXNhYmxlUmVzaXplID0gIWRvRW5hYmxlOyAvLyBGSVJTVCBiZWZvcmUgd2UgdXBkYXRlIGNoaWxkcmVuIGFzIGdyaWQgb3ZlcnJpZGVzICMxNjU4XHJcbiAgICAgICAgdGhpcy5lbmdpbmUubm9kZXMuZm9yRWFjaChuID0+IHtcclxuICAgICAgICAgICAgdGhpcy5yZXNpemFibGUobi5lbCwgZG9FbmFibGUpO1xyXG4gICAgICAgICAgICBpZiAobi5zdWJHcmlkICYmIHJlY3Vyc2UpXHJcbiAgICAgICAgICAgICAgICBuLnN1YkdyaWQuZW5hYmxlUmVzaXplKGRvRW5hYmxlLCByZWN1cnNlKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICAgIC8qKiBAaW50ZXJuYWwgcmVtb3ZlcyBhbnkgZHJhZyZkcm9wIHByZXNlbnQgKGNhbGxlZCBkdXJpbmcgZGVzdHJveSkgKi9cclxuICAgIF9yZW1vdmVERChlbCkge1xyXG4gICAgICAgIGRkLmRyYWdnYWJsZShlbCwgJ2Rlc3Ryb3knKS5yZXNpemFibGUoZWwsICdkZXN0cm95Jyk7XHJcbiAgICAgICAgaWYgKGVsLmdyaWRzdGFja05vZGUpIHtcclxuICAgICAgICAgICAgZGVsZXRlIGVsLmdyaWRzdGFja05vZGUuX2luaXRERDsgLy8gcmVzZXQgb3VyIEREIGluaXQgZmxhZ1xyXG4gICAgICAgIH1cclxuICAgICAgICBkZWxldGUgZWwuZGRFbGVtZW50O1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gICAgLyoqIEBpbnRlcm5hbCBjYWxsZWQgdG8gYWRkIGRyYWcgb3ZlciB0byBzdXBwb3J0IHdpZGdldHMgYmVpbmcgYWRkZWQgZXh0ZXJuYWxseSAqL1xyXG4gICAgX3NldHVwQWNjZXB0V2lkZ2V0KCkge1xyXG4gICAgICAgIC8vIGNoZWNrIGlmIHdlIG5lZWQgdG8gZGlzYWJsZSB0aGluZ3NcclxuICAgICAgICBpZiAodGhpcy5vcHRzLnN0YXRpY0dyaWQgfHwgKCF0aGlzLm9wdHMuYWNjZXB0V2lkZ2V0cyAmJiAhdGhpcy5vcHRzLnJlbW92YWJsZSkpIHtcclxuICAgICAgICAgICAgZGQuZHJvcHBhYmxlKHRoaXMuZWwsICdkZXN0cm95Jyk7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyB2YXJzIHNoYXJlZCBhY3Jvc3MgYWxsIG1ldGhvZHNcclxuICAgICAgICBsZXQgY2VsbEhlaWdodCwgY2VsbFdpZHRoO1xyXG4gICAgICAgIGxldCBvbkRyYWcgPSAoZXZlbnQsIGVsLCBoZWxwZXIpID0+IHtcclxuICAgICAgICAgICAgbGV0IG5vZGUgPSBlbC5ncmlkc3RhY2tOb2RlO1xyXG4gICAgICAgICAgICBpZiAoIW5vZGUpXHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIGhlbHBlciA9IGhlbHBlciB8fCBlbDtcclxuICAgICAgICAgICAgbGV0IHBhcmVudCA9IHRoaXMuZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgICAgIGxldCB7IHRvcCwgbGVmdCB9ID0gaGVscGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgICAgICBsZWZ0IC09IHBhcmVudC5sZWZ0O1xyXG4gICAgICAgICAgICB0b3AgLT0gcGFyZW50LnRvcDtcclxuICAgICAgICAgICAgbGV0IHVpID0geyBwb3NpdGlvbjogeyB0b3AsIGxlZnQgfSB9O1xyXG4gICAgICAgICAgICBpZiAobm9kZS5fdGVtcG9yYXJ5UmVtb3ZlZCkge1xyXG4gICAgICAgICAgICAgICAgbm9kZS54ID0gTWF0aC5tYXgoMCwgTWF0aC5yb3VuZChsZWZ0IC8gY2VsbFdpZHRoKSk7XHJcbiAgICAgICAgICAgICAgICBub2RlLnkgPSBNYXRoLm1heCgwLCBNYXRoLnJvdW5kKHRvcCAvIGNlbGxIZWlnaHQpKTtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSBub2RlLmF1dG9Qb3NpdGlvbjtcclxuICAgICAgICAgICAgICAgIHRoaXMuZW5naW5lLm5vZGVCb3VuZEZpeChub2RlKTtcclxuICAgICAgICAgICAgICAgIC8vIGRvbid0IGFjY2VwdCAqaW5pdGlhbCogbG9jYXRpb24gaWYgZG9lc24ndCBmaXQgIzE0MTkgKGxvY2tlZCBkcm9wIHJlZ2lvbiwgb3IgY2FuJ3QgZ3JvdyksIGJ1dCBtYXliZSB0cnkgaWYgaXQgd2lsbCBnbyBzb21ld2hlcmVcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5lbmdpbmUud2lsbEl0Rml0KG5vZGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5hdXRvUG9zaXRpb24gPSB0cnVlOyAvLyBpZ25vcmUgeCx5IGFuZCB0cnkgZm9yIGFueSBzbG90Li4uXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmVuZ2luZS53aWxsSXRGaXQobm9kZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGQub2ZmKGVsLCAnZHJhZycpOyAvLyBzdG9wIGNhbGxpbmcgdXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBmdWxsIGdyaWQgb3IgY2FuJ3QgZ3Jvd1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS5fd2lsbEZpdFBvcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2UgdGhlIGF1dG8gcG9zaXRpb24gaW5zdGVhZCAjMTY4N1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1dGlsc18xLlV0aWxzLmNvcHlQb3Mobm9kZSwgbm9kZS5fd2lsbEZpdFBvcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBub2RlLl93aWxsRml0UG9zO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIHJlLXVzZSB0aGUgZXhpc3Rpbmcgbm9kZSBkcmFnZ2luZyBtZXRob2RcclxuICAgICAgICAgICAgICAgIHRoaXMuX29uU3RhcnRNb3ZpbmcoaGVscGVyLCBldmVudCwgdWksIG5vZGUsIGNlbGxXaWR0aCwgY2VsbEhlaWdodCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyByZS11c2UgdGhlIGV4aXN0aW5nIG5vZGUgZHJhZ2dpbmcgdGhhdCBkb2VzIHNvIG11Y2ggb2YgdGhlIGNvbGxpc2lvbiBkZXRlY3Rpb25cclxuICAgICAgICAgICAgICAgIHRoaXMuX2RyYWdPclJlc2l6ZShoZWxwZXIsIGV2ZW50LCB1aSwgbm9kZSwgY2VsbFdpZHRoLCBjZWxsSGVpZ2h0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgZGQuZHJvcHBhYmxlKHRoaXMuZWwsIHtcclxuICAgICAgICAgICAgYWNjZXB0OiAoZWwpID0+IHtcclxuICAgICAgICAgICAgICAgIGxldCBub2RlID0gZWwuZ3JpZHN0YWNrTm9kZTtcclxuICAgICAgICAgICAgICAgIC8vIHNldCBhY2NlcHQgZHJvcCB0byB0cnVlIG9uIG91cnNlbGYgKHdoaWNoIHdlIGlnbm9yZSkgc28gd2UgZG9uJ3QgZ2V0IFwiY2FuJ3QgZHJvcFwiIGljb24gaW4gSFRNTDUgbW9kZSB3aGlsZSBtb3ZpbmdcclxuICAgICAgICAgICAgICAgIGlmICgobm9kZSA9PT0gbnVsbCB8fCBub2RlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBub2RlLmdyaWQpID09PSB0aGlzKVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdHMuYWNjZXB0V2lkZ2V0cylcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAvLyBjaGVjayBmb3IgYWNjZXB0IG1ldGhvZCBvciBjbGFzcyBtYXRjaGluZ1xyXG4gICAgICAgICAgICAgICAgbGV0IGNhbkFjY2VwdCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMub3B0cy5hY2NlcHRXaWRnZXRzID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FuQWNjZXB0ID0gdGhpcy5vcHRzLmFjY2VwdFdpZGdldHMoZWwpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNlbGVjdG9yID0gKHRoaXMub3B0cy5hY2NlcHRXaWRnZXRzID09PSB0cnVlID8gJy5ncmlkLXN0YWNrLWl0ZW0nIDogdGhpcy5vcHRzLmFjY2VwdFdpZGdldHMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbkFjY2VwdCA9IGVsLm1hdGNoZXMoc2VsZWN0b3IpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8gZmluYWxseSBjaGVjayB0byBtYWtlIHN1cmUgd2UgYWN0dWFsbHkgaGF2ZSBzcGFjZSBsZWZ0ICMxNTcxXHJcbiAgICAgICAgICAgICAgICBpZiAoY2FuQWNjZXB0ICYmIG5vZGUgJiYgdGhpcy5vcHRzLm1heFJvdykge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBuID0geyB3OiBub2RlLncsIGg6IG5vZGUuaCwgbWluVzogbm9kZS5taW5XLCBtaW5IOiBub2RlLm1pbkggfTsgLy8gb25seSB3aWR0aC9oZWlnaHQgbWF0dGVycyBhbmQgYXV0b1Bvc2l0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgY2FuQWNjZXB0ID0gdGhpcy5lbmdpbmUud2lsbEl0Rml0KG4pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbkFjY2VwdDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiBlbnRlcmluZyBvdXIgZ3JpZCBhcmVhXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICAub24odGhpcy5lbCwgJ2Ryb3BvdmVyJywgKGV2ZW50LCBlbCwgaGVscGVyKSA9PiB7XHJcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGBvdmVyICR7dGhpcy5lbC5ncmlkc3RhY2sub3B0cy5pZH0gJHtjb3VudCsrfWApOyAvLyBURVNUXHJcbiAgICAgICAgICAgIGxldCBub2RlID0gZWwuZ3JpZHN0YWNrTm9kZTtcclxuICAgICAgICAgICAgLy8gaWdub3JlIGRyb3AgZW50ZXIgb24gb3Vyc2VsZiAodW5sZXNzIHdlIHRlbXBvcmFyaWx5IHJlbW92ZWQpIHdoaWNoIGhhcHBlbnMgb24gYSBzaW1wbGUgZHJhZyBvZiBvdXIgaXRlbVxyXG4gICAgICAgICAgICBpZiAoKG5vZGUgPT09IG51bGwgfHwgbm9kZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogbm9kZS5ncmlkKSA9PT0gdGhpcyAmJiAhbm9kZS5fdGVtcG9yYXJ5UmVtb3ZlZCkge1xyXG4gICAgICAgICAgICAgICAgLy8gZGVsZXRlIG5vZGUuX2FkZGVkOyAvLyByZXNldCB0aGlzIHRvIHRyYWNrIHBsYWNlaG9sZGVyIGFnYWluIGluIGNhc2Ugd2Ugd2VyZSBvdmVyIG90aGVyIGdyaWQgIzE0ODQgKGRyb3BvdXQgZG9lc24ndCBhbHdheXMgY2xlYXIpXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIHByZXZlbnQgcGFyZW50IGZyb20gcmVjZWl2aW5nIG1zZyAod2hpY2ggbWF5IGJlIGEgZ3JpZCBhcyB3ZWxsKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIGZpeCAjMTU3OCB3aGVuIGRyYWdnaW5nIGZhc3QsIHdlIG1heSBub3QgZ2V0IGEgbGVhdmUgb24gdGhlIHByZXZpb3VzIGdyaWQgc28gZm9yY2Ugb25lIG5vd1xyXG4gICAgICAgICAgICBpZiAoKG5vZGUgPT09IG51bGwgfHwgbm9kZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogbm9kZS5ncmlkKSAmJiBub2RlLmdyaWQgIT09IHRoaXMgJiYgIW5vZGUuX3RlbXBvcmFyeVJlbW92ZWQpIHtcclxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdkcm9wb3ZlciB3aXRob3V0IGxlYXZlJyk7IC8vIFRFU1RcclxuICAgICAgICAgICAgICAgIGxldCBvdGhlckdyaWQgPSBub2RlLmdyaWQ7XHJcbiAgICAgICAgICAgICAgICBvdGhlckdyaWQuX2xlYXZlKGVsLCBoZWxwZXIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIGNhY2hlIGNlbGwgZGltZW5zaW9ucyAod2hpY2ggZG9uJ3QgY2hhbmdlKSwgcG9zaXRpb24gY2FuIGFuaW1hdGUgaWYgd2UgcmVtb3ZlZCBhbiBpdGVtIGluIG90aGVyR3JpZCB0aGF0IGFmZmVjdHMgdXMuLi5cclxuICAgICAgICAgICAgY2VsbFdpZHRoID0gdGhpcy5jZWxsV2lkdGgoKTtcclxuICAgICAgICAgICAgY2VsbEhlaWdodCA9IHRoaXMuZ2V0Q2VsbEhlaWdodCh0cnVlKTtcclxuICAgICAgICAgICAgLy8gbG9hZCBhbnkgZWxlbWVudCBhdHRyaWJ1dGVzIGlmIHdlIGRvbid0IGhhdmUgYSBub2RlXHJcbiAgICAgICAgICAgIGlmICghbm9kZSkgeyAvLyBAdHMtaWdub3JlIHByaXZhdGUgcmVhZCBvbmx5IG9uIG91cnNlbGZcclxuICAgICAgICAgICAgICAgIG5vZGUgPSB0aGlzLl9yZWFkQXR0cihlbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCFub2RlLmdyaWQpIHtcclxuICAgICAgICAgICAgICAgIG5vZGUuX2lzRXh0ZXJuYWwgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgZWwuZ3JpZHN0YWNrTm9kZSA9IG5vZGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gY2FsY3VsYXRlIHRoZSBncmlkIHNpemUgYmFzZWQgb24gZWxlbWVudCBvdXRlciBzaXplXHJcbiAgICAgICAgICAgIGhlbHBlciA9IGhlbHBlciB8fCBlbDtcclxuICAgICAgICAgICAgbGV0IHcgPSBub2RlLncgfHwgTWF0aC5yb3VuZChoZWxwZXIub2Zmc2V0V2lkdGggLyBjZWxsV2lkdGgpIHx8IDE7XHJcbiAgICAgICAgICAgIGxldCBoID0gbm9kZS5oIHx8IE1hdGgucm91bmQoaGVscGVyLm9mZnNldEhlaWdodCAvIGNlbGxIZWlnaHQpIHx8IDE7XHJcbiAgICAgICAgICAgIC8vIGlmIHRoZSBpdGVtIGNhbWUgZnJvbSBhbm90aGVyIGdyaWQsIG1ha2UgYSBjb3B5IGFuZCBzYXZlIHRoZSBvcmlnaW5hbCBpbmZvIGluIGNhc2Ugd2UgZ28gYmFjayB0aGVyZVxyXG4gICAgICAgICAgICBpZiAobm9kZS5ncmlkICYmIG5vZGUuZ3JpZCAhPT0gdGhpcykge1xyXG4gICAgICAgICAgICAgICAgLy8gY29weSB0aGUgbm9kZSBvcmlnaW5hbCB2YWx1ZXMgKG1pbi9tYXgvaWQvZXRjLi4uKSBidXQgb3ZlcnJpZGUgd2lkdGgvaGVpZ2h0L290aGVyIGZsYWdzIHdoaWNoIGFyZSB0aGlzIGdyaWQgc3BlY2lmaWNcclxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdkcm9wb3ZlciBjbG9uaW5nIG5vZGUnKTsgLy8gVEVTVFxyXG4gICAgICAgICAgICAgICAgaWYgKCFlbC5fZ3JpZHN0YWNrTm9kZU9yaWcpXHJcbiAgICAgICAgICAgICAgICAgICAgZWwuX2dyaWRzdGFja05vZGVPcmlnID0gbm9kZTsgLy8gc2hvdWxkbid0IGhhdmUgbXVsdGlwbGUgbmVzdGVkIVxyXG4gICAgICAgICAgICAgICAgZWwuZ3JpZHN0YWNrTm9kZSA9IG5vZGUgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG5vZGUpLCB7IHcsIGgsIGdyaWQ6IHRoaXMgfSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVuZ2luZS5jbGVhbnVwTm9kZShub2RlKVxyXG4gICAgICAgICAgICAgICAgICAgIC5ub2RlQm91bmRGaXgobm9kZSk7XHJcbiAgICAgICAgICAgICAgICAvLyByZXN0b3JlIHNvbWUgaW50ZXJuYWwgZmllbGRzIHdlIG5lZWQgYWZ0ZXIgY2xlYXJpbmcgdGhlbSBhbGxcclxuICAgICAgICAgICAgICAgIG5vZGUuX2luaXRERCA9XHJcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5faXNFeHRlcm5hbCA9IC8vIERPTSBuZWVkcyB0byBiZSByZS1wYXJlbnRlZCBvbiBhIGRyb3BcclxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5fdGVtcG9yYXJ5UmVtb3ZlZCA9IHRydWU7IC8vIHNvIGl0IGNhbiBiZSBpbnNlcnRlZCBvbkRyYWcgYmVsb3dcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG5vZGUudyA9IHc7XHJcbiAgICAgICAgICAgICAgICBub2RlLmggPSBoO1xyXG4gICAgICAgICAgICAgICAgbm9kZS5fdGVtcG9yYXJ5UmVtb3ZlZCA9IHRydWU7IC8vIHNvIHdlIGNhbiBpbnNlcnQgaXRcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBjbGVhciBhbnkgbWFya2VkIGZvciBjb21wbGV0ZSByZW1vdmFsIChOb3RlOiBkb24ndCBjaGVjayBfaXNBYm91dFRvUmVtb3ZlIGFzIHRoYXQgaXMgY2xlYXJlZCBhYm92ZSAtIGp1c3QgZG8gaXQpXHJcbiAgICAgICAgICAgIHRoaXMuX2l0ZW1SZW1vdmluZyhub2RlLmVsLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIGRkLm9uKGVsLCAnZHJhZycsIG9uRHJhZyk7XHJcbiAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGlzIGlzIGNhbGxlZCBhdCBsZWFzdCBvbmNlIHdoZW4gZ29pbmcgZmFzdCAjMTU3OFxyXG4gICAgICAgICAgICBvbkRyYWcoZXZlbnQsIGVsLCBoZWxwZXIpO1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIHByZXZlbnQgcGFyZW50IGZyb20gcmVjZWl2aW5nIG1zZyAod2hpY2ggbWF5IGJlIGEgZ3JpZCBhcyB3ZWxsKVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiBMZWF2aW5nIG91ciBncmlkIGFyZWEuLi5cclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIC5vbih0aGlzLmVsLCAnZHJvcG91dCcsIChldmVudCwgZWwsIGhlbHBlcikgPT4ge1xyXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhgb3V0ICR7dGhpcy5lbC5ncmlkc3RhY2sub3B0cy5pZH0gJHtjb3VudCsrfWApOyAvLyBURVNUXHJcbiAgICAgICAgICAgIGxldCBub2RlID0gZWwuZ3JpZHN0YWNrTm9kZTtcclxuICAgICAgICAgICAgaWYgKCFub2RlKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAvLyBmaXggIzE1Nzggd2hlbiBkcmFnZ2luZyBmYXN0LCB3ZSBtaWdodCBnZXQgbGVhdmUgYWZ0ZXIgb3RoZXIgZ3JpZCBnZXRzIGVudGVyICh3aGljaCBjYWxscyB1cyB0byBjbGVhbilcclxuICAgICAgICAgICAgLy8gc28gc2tpcCB0aGlzIG9uZSBpZiB3ZSdyZSBub3QgdGhlIGFjdGl2ZSBncmlkIHJlYWxseS4uXHJcbiAgICAgICAgICAgIGlmICghbm9kZS5ncmlkIHx8IG5vZGUuZ3JpZCA9PT0gdGhpcykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbGVhdmUoZWwsIGhlbHBlcik7XHJcbiAgICAgICAgICAgICAgICAvLyBpZiB3ZSB3ZXJlIGNyZWF0ZWQgYXMgdGVtcG9yYXJ5IG5lc3RlZCBncmlkLCBnbyBiYWNrIHRvIGJlZm9yZSBzdGF0ZVxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2lzVGVtcCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlQXNTdWJHcmlkKG5vZGUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gcHJldmVudCBwYXJlbnQgZnJvbSByZWNlaXZpbmcgbXNnICh3aGljaCBtYXkgYmUgZ3JpZCBhcyB3ZWxsKVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiBlbmQgLSByZWxlYXNpbmcgdGhlIG1vdXNlXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICAub24odGhpcy5lbCwgJ2Ryb3AnLCAoZXZlbnQsIGVsLCBoZWxwZXIpID0+IHtcclxuICAgICAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICAgICAgbGV0IG5vZGUgPSBlbC5ncmlkc3RhY2tOb2RlO1xyXG4gICAgICAgICAgICAvLyBpZ25vcmUgZHJvcCBvbiBvdXJzZWxmIGZyb20gb3Vyc2VsZiB0aGF0IGRpZG4ndCBjb21lIGZyb20gdGhlIG91dHNpZGUgLSBkcmFnZW5kIHdpbGwgaGFuZGxlIHRoZSBzaW1wbGUgbW92ZSBpbnN0ZWFkXHJcbiAgICAgICAgICAgIGlmICgobm9kZSA9PT0gbnVsbCB8fCBub2RlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBub2RlLmdyaWQpID09PSB0aGlzICYmICFub2RlLl9pc0V4dGVybmFsKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICBsZXQgd2FzQWRkZWQgPSAhIXRoaXMucGxhY2Vob2xkZXIucGFyZW50RWxlbWVudDsgLy8gc2tpcCBpdGVtcyBub3QgYWN0dWFsbHkgYWRkZWQgdG8gdXMgYmVjYXVzZSBvZiBjb25zdHJhaW5zLCBidXQgZG8gY2xlYW51cCAjMTQxOVxyXG4gICAgICAgICAgICB0aGlzLnBsYWNlaG9sZGVyLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAvLyBub3RpZnkgcHJldmlvdXMgZ3JpZCBvZiByZW1vdmFsXHJcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdkcm9wIGRlbGV0ZSBfZ3JpZHN0YWNrTm9kZU9yaWcnKSAvLyBURVNUXHJcbiAgICAgICAgICAgIGxldCBvcmlnTm9kZSA9IGVsLl9ncmlkc3RhY2tOb2RlT3JpZztcclxuICAgICAgICAgICAgZGVsZXRlIGVsLl9ncmlkc3RhY2tOb2RlT3JpZztcclxuICAgICAgICAgICAgaWYgKHdhc0FkZGVkICYmIChvcmlnTm9kZSA9PT0gbnVsbCB8fCBvcmlnTm9kZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3JpZ05vZGUuZ3JpZCkgJiYgb3JpZ05vZGUuZ3JpZCAhPT0gdGhpcykge1xyXG4gICAgICAgICAgICAgICAgbGV0IG9HcmlkID0gb3JpZ05vZGUuZ3JpZDtcclxuICAgICAgICAgICAgICAgIG9HcmlkLmVuZ2luZS5yZW1vdmVkTm9kZXMucHVzaChvcmlnTm9kZSk7XHJcbiAgICAgICAgICAgICAgICBvR3JpZC5fdHJpZ2dlclJlbW92ZUV2ZW50KCkuX3RyaWdnZXJDaGFuZ2VFdmVudCgpO1xyXG4gICAgICAgICAgICAgICAgLy8gaWYgaXQncyBhbiBlbXB0eSBzdWItZ3JpZCB0aGF0IGdvdCBhdXRvLWNyZWF0ZWQsIG51a2UgaXRcclxuICAgICAgICAgICAgICAgIGlmIChvR3JpZC5wYXJlbnRHcmlkSXRlbSAmJiAhb0dyaWQuZW5naW5lLm5vZGVzLmxlbmd0aCAmJiBvR3JpZC5vcHRzLnN1YkdyaWREeW5hbWljKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb0dyaWQucmVtb3ZlQXNTdWJHcmlkKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCFub2RlKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAvLyB1c2UgZXhpc3RpbmcgcGxhY2Vob2xkZXIgbm9kZSBhcyBpdCdzIGFscmVhZHkgaW4gb3VyIGxpc3Qgd2l0aCBkcm9wIGxvY2F0aW9uXHJcbiAgICAgICAgICAgIGlmICh3YXNBZGRlZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5lbmdpbmUuY2xlYW51cE5vZGUobm9kZSk7IC8vIHJlbW92ZXMgYWxsIGludGVybmFsIF94eXogdmFsdWVzXHJcbiAgICAgICAgICAgICAgICBub2RlLmdyaWQgPSB0aGlzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGRkLm9mZihlbCwgJ2RyYWcnKTtcclxuICAgICAgICAgICAgLy8gaWYgd2UgbWFkZSBhIGNvcHkgKCdoZWxwZXInIHdoaWNoIGlzIHRlbXApIG9mIHRoZSBvcmlnaW5hbCBub2RlIHRoZW4gaW5zZXJ0IGEgY29weSwgZWxzZSB3ZSBtb3ZlIHRoZSBvcmlnaW5hbCBub2RlICgjMTEwMilcclxuICAgICAgICAgICAgLy8gYXMgdGhlIGhlbHBlciB3aWxsIGJlIG51a2VkIGJ5IGpxdWVyeS11aSBvdGhlcndpc2UuIFRPRE86IHVwZGF0ZSBvbGQgY29kZSBwYXRoXHJcbiAgICAgICAgICAgIGlmIChoZWxwZXIgIT09IGVsKSB7XHJcbiAgICAgICAgICAgICAgICBoZWxwZXIucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgICAgICBlbC5ncmlkc3RhY2tOb2RlID0gb3JpZ05vZGU7IC8vIG9yaWdpbmFsIGl0ZW0gKGxlZnQgYmVoaW5kKSBpcyByZS1zdG9yZWQgdG8gcHJlIGRyYWdnaW5nIGFzIHRoZSBub2RlIG5vdyBoYXMgZHJvcCBpbmZvXHJcbiAgICAgICAgICAgICAgICBpZiAod2FzQWRkZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBlbCA9IGVsLmNsb25lTm9kZSh0cnVlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGVsLnJlbW92ZSgpOyAvLyByZWR1Y2UgZmxpY2tlciBhcyB3ZSBjaGFuZ2UgZGVwdGggaGVyZSwgYW5kIHNpemUgZnVydGhlciBkb3duXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9yZW1vdmVERChlbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCF3YXNBZGRlZClcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgZWwuZ3JpZHN0YWNrTm9kZSA9IG5vZGU7XHJcbiAgICAgICAgICAgIG5vZGUuZWwgPSBlbDtcclxuICAgICAgICAgICAgbGV0IHN1YkdyaWQgPSAoX2IgPSAoX2EgPSBub2RlLnN1YkdyaWQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5lbCkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmdyaWRzdGFjazsgLy8gc2V0IHdoZW4gYWN0dWFsIHN1Yi1ncmlkIHByZXNlbnRcclxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICB1dGlsc18xLlV0aWxzLmNvcHlQb3Mobm9kZSwgdGhpcy5fcmVhZEF0dHIodGhpcy5wbGFjZWhvbGRlcikpOyAvLyBwbGFjZWhvbGRlciB2YWx1ZXMgYXMgbW92aW5nIFZFUlkgZmFzdCBjYW4gdGhyb3cgdGhpbmdzIG9mZiAjMTU3OFxyXG4gICAgICAgICAgICB1dGlsc18xLlV0aWxzLnJlbW92ZVBvc2l0aW9uaW5nU3R5bGVzKGVsKTsgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICB0aGlzLl93cml0ZUF0dHIoZWwsIG5vZGUpO1xyXG4gICAgICAgICAgICBlbC5jbGFzc0xpc3QuYWRkKHR5cGVzXzEuZ3JpZERlZmF1bHRzLml0ZW1DbGFzcywgdGhpcy5vcHRzLml0ZW1DbGFzcyk7XHJcbiAgICAgICAgICAgIHRoaXMuZWwuYXBwZW5kQ2hpbGQoZWwpOyAvLyBAdHMtaWdub3JlIC8vIFRPRE86IG5vdyB3b3VsZCBiZSBpZGVhbCB0aW1lIHRvIF9yZW1vdmVIZWxwZXJTdHlsZSgpIG92ZXJyaWRpbmcgZmxvYXRpbmcgc3R5bGVzIChuYXRpdmUgb25seSlcclxuICAgICAgICAgICAgaWYgKHN1YkdyaWQpIHtcclxuICAgICAgICAgICAgICAgIHN1YkdyaWQucGFyZW50R3JpZEl0ZW0gPSBub2RlO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFzdWJHcmlkLm9wdHMuc3R5bGVJbkhlYWQpXHJcbiAgICAgICAgICAgICAgICAgICAgc3ViR3JpZC5fdXBkYXRlU3R5bGVzKHRydWUpOyAvLyByZS1jcmVhdGUgc3ViLWdyaWQgc3R5bGVzIG5vdyB0aGF0IHdlJ3ZlIG1vdmVkXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fdXBkYXRlQ29udGFpbmVySGVpZ2h0KCk7XHJcbiAgICAgICAgICAgIHRoaXMuZW5naW5lLmFkZGVkTm9kZXMucHVzaChub2RlKTsgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICB0aGlzLl90cmlnZ2VyQWRkRXZlbnQoKTsgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICB0aGlzLl90cmlnZ2VyQ2hhbmdlRXZlbnQoKTtcclxuICAgICAgICAgICAgdGhpcy5lbmdpbmUuZW5kVXBkYXRlKCk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9nc0V2ZW50SGFuZGxlclsnZHJvcHBlZCddKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9nc0V2ZW50SGFuZGxlclsnZHJvcHBlZCddKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZXZlbnQpLCB7IHR5cGU6ICdkcm9wcGVkJyB9KSwgb3JpZ05vZGUgJiYgb3JpZ05vZGUuZ3JpZCA/IG9yaWdOb2RlIDogdW5kZWZpbmVkLCBub2RlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyB3YWl0IHRpbGwgd2UgcmV0dXJuIG91dCBvZiB0aGUgZHJhZyBjYWxsYmFjayB0byBzZXQgdGhlIG5ldyBkcmFnJnJlc2l6ZSBoYW5kbGVyIG9yIHRoZXkgbWF5IGdldCBtZXNzZWQgdXBcclxuICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy8gSUZGIHdlIGFyZSBzdGlsbCB0aGVyZSAoc29tZSBhcHBsaWNhdGlvbiB3aWxsIHVzZSBhcyBwbGFjZWhvbGRlciBhbmQgaW5zZXJ0IHRoZWlyIHJlYWwgd2lkZ2V0IGluc3RlYWQgYW5kIGJldHRlciBjYWxsIG1ha2VXaWRnZXQoKSlcclxuICAgICAgICAgICAgICAgIGlmIChub2RlLmVsICYmIG5vZGUuZWwucGFyZW50RWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3ByZXBhcmVEcmFnRHJvcEJ5Tm9kZShub2RlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW5naW5lLnJlbW92ZU5vZGUobm9kZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgbm9kZS5ncmlkLl9pc1RlbXA7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIHByZXZlbnQgcGFyZW50IGZyb20gcmVjZWl2aW5nIG1zZyAod2hpY2ggbWF5IGJlIGdyaWQgYXMgd2VsbClcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICAgIC8qKiBAaW50ZXJuYWwgbWFyayBpdGVtIGZvciByZW1vdmFsICovXHJcbiAgICBfaXRlbVJlbW92aW5nKGVsLCByZW1vdmUpIHtcclxuICAgICAgICBsZXQgbm9kZSA9IGVsID8gZWwuZ3JpZHN0YWNrTm9kZSA6IHVuZGVmaW5lZDtcclxuICAgICAgICBpZiAoIW5vZGUgfHwgIW5vZGUuZ3JpZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHJlbW92ZSA/IG5vZGUuX2lzQWJvdXRUb1JlbW92ZSA9IHRydWUgOiBkZWxldGUgbm9kZS5faXNBYm91dFRvUmVtb3ZlO1xyXG4gICAgICAgIHJlbW92ZSA/IGVsLmNsYXNzTGlzdC5hZGQoJ2dyaWQtc3RhY2staXRlbS1yZW1vdmluZycpIDogZWwuY2xhc3NMaXN0LnJlbW92ZSgnZ3JpZC1zdGFjay1pdGVtLXJlbW92aW5nJyk7XHJcbiAgICB9XHJcbiAgICAvKiogQGludGVybmFsIGNhbGxlZCB0byBzZXR1cCBhIHRyYXNoIGRyb3Agem9uZSBpZiB0aGUgdXNlciBzcGVjaWZpZXMgaXQgKi9cclxuICAgIF9zZXR1cFJlbW92ZURyb3AoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLm9wdHMuc3RhdGljR3JpZCAmJiB0eXBlb2YgdGhpcy5vcHRzLnJlbW92YWJsZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgbGV0IHRyYXNoRWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRoaXMub3B0cy5yZW1vdmFibGUpO1xyXG4gICAgICAgICAgICBpZiAoIXRyYXNoRWwpXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICAgICAgLy8gb25seSByZWdpc3RlciBPTkUgZHJvcC1vdmVyL2Ryb3BvdXQgY2FsbGJhY2sgZm9yIHRoZSAndHJhc2gnLCBhbmQgaXQgd2lsbFxyXG4gICAgICAgICAgICAvLyB1cGRhdGUgdGhlIHBhc3NlZCBpbiBpdGVtIGFuZCBwYXJlbnQgZ3JpZCBiZWNhdXNlIHRoZSAndHJhc2gnIGlzIGEgc2hhcmVkIHJlc291cmNlIGFueXdheSxcclxuICAgICAgICAgICAgLy8gYW5kIE5hdGl2ZSBERCBvbmx5IGhhcyAxIGV2ZW50IENCIChoYXZpbmcgYSBsaXN0IGFuZCB0ZWNobmljYWxseSBhIHBlciBncmlkIHJlbW92YWJsZU9wdGlvbnMgY29tcGxpY2F0ZXMgdGhpbmdzIGdyZWF0bHkpXHJcbiAgICAgICAgICAgIGlmICghZGQuaXNEcm9wcGFibGUodHJhc2hFbCkpIHtcclxuICAgICAgICAgICAgICAgIGRkLmRyb3BwYWJsZSh0cmFzaEVsLCB0aGlzLm9wdHMucmVtb3ZhYmxlT3B0aW9ucylcclxuICAgICAgICAgICAgICAgICAgICAub24odHJhc2hFbCwgJ2Ryb3BvdmVyJywgKGV2ZW50LCBlbCkgPT4gdGhpcy5faXRlbVJlbW92aW5nKGVsLCB0cnVlKSlcclxuICAgICAgICAgICAgICAgICAgICAub24odHJhc2hFbCwgJ2Ryb3BvdXQnLCAoZXZlbnQsIGVsKSA9PiB0aGlzLl9pdGVtUmVtb3ZpbmcoZWwsIGZhbHNlKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICAvKiogQGludGVybmFsIHByZXBhcmVzIHRoZSBlbGVtZW50IGZvciBkcmFnJmRyb3AgKiovXHJcbiAgICBfcHJlcGFyZURyYWdEcm9wQnlOb2RlKG5vZGUpIHtcclxuICAgICAgICBsZXQgZWwgPSBub2RlLmVsO1xyXG4gICAgICAgIGNvbnN0IG5vTW92ZSA9IG5vZGUubm9Nb3ZlIHx8IHRoaXMub3B0cy5kaXNhYmxlRHJhZztcclxuICAgICAgICBjb25zdCBub1Jlc2l6ZSA9IG5vZGUubm9SZXNpemUgfHwgdGhpcy5vcHRzLmRpc2FibGVSZXNpemU7XHJcbiAgICAgICAgLy8gY2hlY2sgZm9yIGRpc2FibGVkIGdyaWQgZmlyc3RcclxuICAgICAgICBpZiAodGhpcy5vcHRzLnN0YXRpY0dyaWQgfHwgKG5vTW92ZSAmJiBub1Jlc2l6ZSkpIHtcclxuICAgICAgICAgICAgaWYgKG5vZGUuX2luaXRERCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcmVtb3ZlREQoZWwpOyAvLyBudWtlcyBldmVyeXRoaW5nIGluc3RlYWQgb2YganVzdCBkaXNhYmxlLCB3aWxsIGFkZCBzb21lIHN0eWxlcyBiYWNrIG5leHRcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSBub2RlLl9pbml0REQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWwuY2xhc3NMaXN0LmFkZCgndWktZHJhZ2dhYmxlLWRpc2FibGVkJywgJ3VpLXJlc2l6YWJsZS1kaXNhYmxlZCcpOyAvLyBhZGQgc3R5bGVzIG9uZSBtaWdodCBkZXBlbmQgb24gIzE0MzVcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghbm9kZS5faW5pdEREKSB7XHJcbiAgICAgICAgICAgIC8vIHZhcmlhYmxlcyB1c2VkL2Nhc2hlZCBiZXR3ZWVuIHRoZSAzIHN0YXJ0L21vdmUvZW5kIG1ldGhvZHMsIGluIGFkZGl0aW9uIHRvIG5vZGUgcGFzc2VkIGFib3ZlXHJcbiAgICAgICAgICAgIGxldCBjZWxsV2lkdGg7XHJcbiAgICAgICAgICAgIGxldCBjZWxsSGVpZ2h0O1xyXG4gICAgICAgICAgICAvKiogY2FsbGVkIHdoZW4gaXRlbSBzdGFydHMgbW92aW5nL3Jlc2l6aW5nICovXHJcbiAgICAgICAgICAgIGxldCBvblN0YXJ0TW92aW5nID0gKGV2ZW50LCB1aSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy8gdHJpZ2dlciBhbnkgJ2RyYWdzdGFydCcgLyAncmVzaXplc3RhcnQnIG1hbnVhbGx5XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fZ3NFdmVudEhhbmRsZXJbZXZlbnQudHlwZV0pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9nc0V2ZW50SGFuZGxlcltldmVudC50eXBlXShldmVudCwgZXZlbnQudGFyZ2V0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNlbGxXaWR0aCA9IHRoaXMuY2VsbFdpZHRoKCk7XHJcbiAgICAgICAgICAgICAgICBjZWxsSGVpZ2h0ID0gdGhpcy5nZXRDZWxsSGVpZ2h0KHRydWUpOyAvLyBmb3JjZSBwaXhlbHMgZm9yIGNhbGN1bGF0aW9uc1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fb25TdGFydE1vdmluZyhlbCwgZXZlbnQsIHVpLCBub2RlLCBjZWxsV2lkdGgsIGNlbGxIZWlnaHQpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAvKiogY2FsbGVkIHdoZW4gaXRlbSBpcyBiZWluZyBkcmFnZ2VkL3Jlc2l6ZWQgKi9cclxuICAgICAgICAgICAgbGV0IGRyYWdPclJlc2l6ZSA9IChldmVudCwgdWkpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2RyYWdPclJlc2l6ZShlbCwgZXZlbnQsIHVpLCBub2RlLCBjZWxsV2lkdGgsIGNlbGxIZWlnaHQpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAvKiogY2FsbGVkIHdoZW4gdGhlIGl0ZW0gc3RvcHMgbW92aW5nL3Jlc2l6aW5nICovXHJcbiAgICAgICAgICAgIGxldCBvbkVuZE1vdmluZyA9IChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wbGFjZWhvbGRlci5yZW1vdmUoKTtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSBub2RlLl9tb3Zpbmc7XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgbm9kZS5fZXZlbnQ7XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgbm9kZS5fbGFzdFRyaWVkO1xyXG4gICAgICAgICAgICAgICAgLy8gaWYgdGhlIGl0ZW0gaGFzIG1vdmVkIHRvIGFub3RoZXIgZ3JpZCwgd2UncmUgZG9uZSBoZXJlXHJcbiAgICAgICAgICAgICAgICBsZXQgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0YXJnZXQuZ3JpZHN0YWNrTm9kZSB8fCB0YXJnZXQuZ3JpZHN0YWNrTm9kZS5ncmlkICE9PSB0aGlzKVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIG5vZGUuZWwgPSB0YXJnZXQ7XHJcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5faXNBYm91dFRvUmVtb3ZlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGdyaWRUb05vdGlmeSA9IGVsLmdyaWRzdGFja05vZGUuZ3JpZDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZ3JpZFRvTm90aWZ5Ll9nc0V2ZW50SGFuZGxlcltldmVudC50eXBlXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBncmlkVG9Ob3RpZnkuX2dzRXZlbnRIYW5kbGVyW2V2ZW50LnR5cGVdKGV2ZW50LCB0YXJnZXQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZW1vdmVERChlbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZ3JpZFRvTm90aWZ5LmVuZ2luZS5yZW1vdmVkTm9kZXMucHVzaChub2RlKTtcclxuICAgICAgICAgICAgICAgICAgICBncmlkVG9Ob3RpZnkuX3RyaWdnZXJSZW1vdmVFdmVudCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGJyZWFrIGNpcmN1bGFyIGxpbmtzIGFuZCByZW1vdmUgRE9NXHJcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGVsLmdyaWRzdGFja05vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG5vZGUuZWw7XHJcbiAgICAgICAgICAgICAgICAgICAgZWwucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB1dGlsc18xLlV0aWxzLnJlbW92ZVBvc2l0aW9uaW5nU3R5bGVzKHRhcmdldCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUuX3RlbXBvcmFyeVJlbW92ZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ290IHJlbW92ZWQgLSByZXN0b3JlIGl0ZW0gYmFjayB0byBiZWZvcmUgZHJhZ2dpbmcgcG9zaXRpb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgdXRpbHNfMS5VdGlscy5jb3B5UG9zKG5vZGUsIG5vZGUuX29yaWcpOyAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3dyaXRlUG9zQXR0cih0YXJnZXQsIG5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVuZ2luZS5hZGROb2RlKG5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbW92ZSB0byBuZXcgcGxhY2Vob2xkZXIgbG9jYXRpb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fd3JpdGVQb3NBdHRyKHRhcmdldCwgbm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9nc0V2ZW50SGFuZGxlcltldmVudC50eXBlXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9nc0V2ZW50SGFuZGxlcltldmVudC50eXBlXShldmVudCwgdGFyZ2V0KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9leHRyYURyYWdSb3cgPSAwOyAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVDb250YWluZXJIZWlnaHQoKTsgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICAgICAgdGhpcy5fdHJpZ2dlckNoYW5nZUV2ZW50KCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVuZ2luZS5lbmRVcGRhdGUoKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgZGQuZHJhZ2dhYmxlKGVsLCB7XHJcbiAgICAgICAgICAgICAgICBzdGFydDogb25TdGFydE1vdmluZyxcclxuICAgICAgICAgICAgICAgIHN0b3A6IG9uRW5kTW92aW5nLFxyXG4gICAgICAgICAgICAgICAgZHJhZzogZHJhZ09yUmVzaXplXHJcbiAgICAgICAgICAgIH0pLnJlc2l6YWJsZShlbCwge1xyXG4gICAgICAgICAgICAgICAgc3RhcnQ6IG9uU3RhcnRNb3ZpbmcsXHJcbiAgICAgICAgICAgICAgICBzdG9wOiBvbkVuZE1vdmluZyxcclxuICAgICAgICAgICAgICAgIHJlc2l6ZTogZHJhZ09yUmVzaXplXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBub2RlLl9pbml0REQgPSB0cnVlOyAvLyB3ZSd2ZSBzZXQgREQgc3VwcG9ydCBub3dcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gZmluYWxseSBmaW5lIHR1bmUgbW92ZSB2cyByZXNpemUgYnkgZGlzYWJsaW5nIGFueSBwYXJ0Li4uXHJcbiAgICAgICAgZGQuZHJhZ2dhYmxlKGVsLCBub01vdmUgPyAnZGlzYWJsZScgOiAnZW5hYmxlJylcclxuICAgICAgICAgICAgLnJlc2l6YWJsZShlbCwgbm9SZXNpemUgPyAnZGlzYWJsZScgOiAnZW5hYmxlJyk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICAvKiogQGludGVybmFsIGhhbmRsZXMgYWN0dWFsIGRyYWcvcmVzaXplIHN0YXJ0ICoqL1xyXG4gICAgX29uU3RhcnRNb3ZpbmcoZWwsIGV2ZW50LCB1aSwgbm9kZSwgY2VsbFdpZHRoLCBjZWxsSGVpZ2h0KSB7XHJcbiAgICAgICAgdGhpcy5lbmdpbmUuY2xlYW5Ob2RlcygpXHJcbiAgICAgICAgICAgIC5iZWdpblVwZGF0ZShub2RlKTtcclxuICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgdGhpcy5fd3JpdGVQb3NBdHRyKHRoaXMucGxhY2Vob2xkZXIsIG5vZGUpO1xyXG4gICAgICAgIHRoaXMuZWwuYXBwZW5kQ2hpbGQodGhpcy5wbGFjZWhvbGRlcik7XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ19vblN0YXJ0TW92aW5nIHBsYWNlaG9sZGVyJykgLy8gVEVTVFxyXG4gICAgICAgIG5vZGUuZWwgPSB0aGlzLnBsYWNlaG9sZGVyO1xyXG4gICAgICAgIG5vZGUuX2xhc3RVaVBvc2l0aW9uID0gdWkucG9zaXRpb247XHJcbiAgICAgICAgbm9kZS5fcHJldllQaXggPSB1aS5wb3NpdGlvbi50b3A7XHJcbiAgICAgICAgbm9kZS5fbW92aW5nID0gKGV2ZW50LnR5cGUgPT09ICdkcmFnc3RhcnQnKTsgLy8gJ2Ryb3BvdmVyJyBhcmUgbm90IGluaXRpYWxseSBtb3Zpbmcgc28gdGhleSBjYW4gZ28gZXhhY3RseSB3aGVyZSB0aGV5IGVudGVyICh3aWxsIHB1c2ggc3R1ZmYgb3V0IG9mIHRoZSB3YXkpXHJcbiAgICAgICAgZGVsZXRlIG5vZGUuX2xhc3RUcmllZDtcclxuICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2Ryb3BvdmVyJyAmJiBub2RlLl90ZW1wb3JhcnlSZW1vdmVkKSB7XHJcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdlbmdpbmUuYWRkTm9kZSB4PScgKyBub2RlLngpOyAvLyBURVNUXHJcbiAgICAgICAgICAgIHRoaXMuZW5naW5lLmFkZE5vZGUobm9kZSk7IC8vIHdpbGwgYWRkLCBmaXggY29sbGlzaW9ucywgdXBkYXRlIGF0dHIgYW5kIGNsZWFyIF90ZW1wb3JhcnlSZW1vdmVkXHJcbiAgICAgICAgICAgIG5vZGUuX21vdmluZyA9IHRydWU7IC8vIEFGVEVSLCBtYXJrIGFzIG1vdmluZyBvYmplY3QgKHdhbnRlZCBmaXggbG9jYXRpb24gYmVmb3JlKVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBzZXQgdGhlIG1pbi9tYXggcmVzaXplIGluZm9cclxuICAgICAgICB0aGlzLmVuZ2luZS5jYWNoZVJlY3RzKGNlbGxXaWR0aCwgY2VsbEhlaWdodCwgdGhpcy5vcHRzLm1hcmdpblRvcCwgdGhpcy5vcHRzLm1hcmdpblJpZ2h0LCB0aGlzLm9wdHMubWFyZ2luQm90dG9tLCB0aGlzLm9wdHMubWFyZ2luTGVmdCk7XHJcbiAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICdyZXNpemVzdGFydCcpIHtcclxuICAgICAgICAgICAgZGQucmVzaXphYmxlKGVsLCAnb3B0aW9uJywgJ21pbldpZHRoJywgY2VsbFdpZHRoICogKG5vZGUubWluVyB8fCAxKSlcclxuICAgICAgICAgICAgICAgIC5yZXNpemFibGUoZWwsICdvcHRpb24nLCAnbWluSGVpZ2h0JywgY2VsbEhlaWdodCAqIChub2RlLm1pbkggfHwgMSkpO1xyXG4gICAgICAgICAgICBpZiAobm9kZS5tYXhXKSB7XHJcbiAgICAgICAgICAgICAgICBkZC5yZXNpemFibGUoZWwsICdvcHRpb24nLCAnbWF4V2lkdGgnLCBjZWxsV2lkdGggKiBub2RlLm1heFcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChub2RlLm1heEgpIHtcclxuICAgICAgICAgICAgICAgIGRkLnJlc2l6YWJsZShlbCwgJ29wdGlvbicsICdtYXhIZWlnaHQnLCBjZWxsSGVpZ2h0ICogbm9kZS5tYXhIKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKiBAaW50ZXJuYWwgaGFuZGxlcyBhY3R1YWwgZHJhZy9yZXNpemUgKiovXHJcbiAgICBfZHJhZ09yUmVzaXplKGVsLCBldmVudCwgdWksIG5vZGUsIGNlbGxXaWR0aCwgY2VsbEhlaWdodCkge1xyXG4gICAgICAgIGxldCBwID0gT2JqZWN0LmFzc2lnbih7fSwgbm9kZS5fb3JpZyk7IC8vIGNvdWxkIGJlIHVuZGVmaW5lZCAoX2lzRXh0ZXJuYWwpIHdoaWNoIGlzIG9rIChkcmFnIG9ubHkgc2V0IHgseSBhbmQgdyxoIHdpbGwgZGVmYXVsdCB0byBub2RlIHZhbHVlKVxyXG4gICAgICAgIGxldCByZXNpemluZztcclxuICAgICAgICBsZXQgbUxlZnQgPSB0aGlzLm9wdHMubWFyZ2luTGVmdCwgbVJpZ2h0ID0gdGhpcy5vcHRzLm1hcmdpblJpZ2h0LCBtVG9wID0gdGhpcy5vcHRzLm1hcmdpblRvcCwgbUJvdHRvbSA9IHRoaXMub3B0cy5tYXJnaW5Cb3R0b207XHJcbiAgICAgICAgLy8gaWYgbWFyZ2lucyAod2hpY2ggYXJlIHVzZWQgdG8gcGFzcyBtaWQgcG9pbnQgYnkpIGFyZSBsYXJnZSByZWxhdGl2ZSB0byBjZWxsIGhlaWdodC93aWR0aCwgcmVkdWNlIHRoZW0gZG93biAjMTg1NVxyXG4gICAgICAgIGxldCBtSGVpZ2h0ID0gTWF0aC5yb3VuZChjZWxsSGVpZ2h0ICogMC4xKSwgbVdpZHRoID0gTWF0aC5yb3VuZChjZWxsV2lkdGggKiAwLjEpO1xyXG4gICAgICAgIG1MZWZ0ID0gTWF0aC5taW4obUxlZnQsIG1XaWR0aCk7XHJcbiAgICAgICAgbVJpZ2h0ID0gTWF0aC5taW4obVJpZ2h0LCBtV2lkdGgpO1xyXG4gICAgICAgIG1Ub3AgPSBNYXRoLm1pbihtVG9wLCBtSGVpZ2h0KTtcclxuICAgICAgICBtQm90dG9tID0gTWF0aC5taW4obUJvdHRvbSwgbUhlaWdodCk7XHJcbiAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICdkcmFnJykge1xyXG4gICAgICAgICAgICBpZiAobm9kZS5fdGVtcG9yYXJ5UmVtb3ZlZClcclxuICAgICAgICAgICAgICAgIHJldHVybjsgLy8gaGFuZGxlZCBieSBkcm9wb3ZlclxyXG4gICAgICAgICAgICBsZXQgZGlzdGFuY2UgPSB1aS5wb3NpdGlvbi50b3AgLSBub2RlLl9wcmV2WVBpeDtcclxuICAgICAgICAgICAgbm9kZS5fcHJldllQaXggPSB1aS5wb3NpdGlvbi50b3A7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdHMuZHJhZ2dhYmxlLnNjcm9sbCAhPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgIHV0aWxzXzEuVXRpbHMudXBkYXRlU2Nyb2xsUG9zaXRpb24oZWwsIHVpLnBvc2l0aW9uLCBkaXN0YW5jZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gZ2V0IG5ldyBwb3NpdGlvbiB0YWtpbmcgaW50byBhY2NvdW50IHRoZSBtYXJnaW4gaW4gdGhlIGRpcmVjdGlvbiB3ZSBhcmUgbW92aW5nISAobmVlZCB0byBwYXNzIG1pZCBwb2ludCBieSBtYXJnaW4pXHJcbiAgICAgICAgICAgIGxldCBsZWZ0ID0gdWkucG9zaXRpb24ubGVmdCArICh1aS5wb3NpdGlvbi5sZWZ0ID4gbm9kZS5fbGFzdFVpUG9zaXRpb24ubGVmdCA/IC1tUmlnaHQgOiBtTGVmdCk7XHJcbiAgICAgICAgICAgIGxldCB0b3AgPSB1aS5wb3NpdGlvbi50b3AgKyAodWkucG9zaXRpb24udG9wID4gbm9kZS5fbGFzdFVpUG9zaXRpb24udG9wID8gLW1Cb3R0b20gOiBtVG9wKTtcclxuICAgICAgICAgICAgcC54ID0gTWF0aC5yb3VuZChsZWZ0IC8gY2VsbFdpZHRoKTtcclxuICAgICAgICAgICAgcC55ID0gTWF0aC5yb3VuZCh0b3AgLyBjZWxsSGVpZ2h0KTtcclxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZS8vIGlmIHdlJ3JlIGF0IHRoZSBib3R0b20gaGl0dGluZyBzb21ldGhpbmcgZWxzZSwgZ3JvdyB0aGUgZ3JpZCBzbyBjdXJzb3IgZG9lc24ndCBsZWF2ZSB3aGVuIHRyeWluZyB0byBwbGFjZSBiZWxvdyBvdGhlcnNcclxuICAgICAgICAgICAgbGV0IHByZXYgPSB0aGlzLl9leHRyYURyYWdSb3c7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmVuZ2luZS5jb2xsaWRlKG5vZGUsIHApKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgcm93ID0gdGhpcy5nZXRSb3coKTtcclxuICAgICAgICAgICAgICAgIGxldCBleHRyYSA9IE1hdGgubWF4KDAsIChwLnkgKyBub2RlLmgpIC0gcm93KTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdHMubWF4Um93ICYmIHJvdyArIGV4dHJhID4gdGhpcy5vcHRzLm1heFJvdykge1xyXG4gICAgICAgICAgICAgICAgICAgIGV4dHJhID0gTWF0aC5tYXgoMCwgdGhpcy5vcHRzLm1heFJvdyAtIHJvdyk7XHJcbiAgICAgICAgICAgICAgICB9IC8vIEB0cy1pZ25vcmVcclxuICAgICAgICAgICAgICAgIHRoaXMuX2V4dHJhRHJhZ1JvdyA9IGV4dHJhOyAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgdGhpcy5fZXh0cmFEcmFnUm93ID0gMDsgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICBpZiAodGhpcy5fZXh0cmFEcmFnUm93ICE9PSBwcmV2KVxyXG4gICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlQ29udGFpbmVySGVpZ2h0KCk7XHJcbiAgICAgICAgICAgIGlmIChub2RlLnggPT09IHAueCAmJiBub2RlLnkgPT09IHAueSlcclxuICAgICAgICAgICAgICAgIHJldHVybjsgLy8gc2tpcCBzYW1lXHJcbiAgICAgICAgICAgIC8vIERPTidUIHNraXAgb25lIHdlIHRyaWVkIGFzIHdlIG1pZ2h0IGhhdmUgZmFpbGVkIGJlY2F1c2Ugb2YgY292ZXJhZ2UgPDUwJSBiZWZvcmVcclxuICAgICAgICAgICAgLy8gaWYgKG5vZGUuX2xhc3RUcmllZCAmJiBub2RlLl9sYXN0VHJpZWQueCA9PT0geCAmJiBub2RlLl9sYXN0VHJpZWQueSA9PT0geSkgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChldmVudC50eXBlID09PSAncmVzaXplJykge1xyXG4gICAgICAgICAgICBpZiAocC54IDwgMClcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgLy8gU2Nyb2xsaW5nIHBhZ2UgaWYgbmVlZGVkXHJcbiAgICAgICAgICAgIHV0aWxzXzEuVXRpbHMudXBkYXRlU2Nyb2xsUmVzaXplKGV2ZW50LCBlbCwgY2VsbEhlaWdodCk7XHJcbiAgICAgICAgICAgIC8vIGdldCBuZXcgc2l6ZVxyXG4gICAgICAgICAgICBwLncgPSBNYXRoLnJvdW5kKCh1aS5zaXplLndpZHRoIC0gbUxlZnQpIC8gY2VsbFdpZHRoKTtcclxuICAgICAgICAgICAgcC5oID0gTWF0aC5yb3VuZCgodWkuc2l6ZS5oZWlnaHQgLSBtVG9wKSAvIGNlbGxIZWlnaHQpO1xyXG4gICAgICAgICAgICBpZiAobm9kZS53ID09PSBwLncgJiYgbm9kZS5oID09PSBwLmgpXHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIGlmIChub2RlLl9sYXN0VHJpZWQgJiYgbm9kZS5fbGFzdFRyaWVkLncgPT09IHAudyAmJiBub2RlLl9sYXN0VHJpZWQuaCA9PT0gcC5oKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBza2lwIG9uZSB3ZSB0cmllZCAoYnV0IGZhaWxlZClcclxuICAgICAgICAgICAgLy8gaWYgd2Ugc2l6ZSBvbiBsZWZ0L3RvcCBzaWRlIHRoaXMgbWlnaHQgbW92ZSB1cywgc28gZ2V0IHBvc3NpYmxlIG5ldyBwb3NpdGlvbiBhcyB3ZWxsXHJcbiAgICAgICAgICAgIGxldCBsZWZ0ID0gdWkucG9zaXRpb24ubGVmdCArIG1MZWZ0O1xyXG4gICAgICAgICAgICBsZXQgdG9wID0gdWkucG9zaXRpb24udG9wICsgbVRvcDtcclxuICAgICAgICAgICAgcC54ID0gTWF0aC5yb3VuZChsZWZ0IC8gY2VsbFdpZHRoKTtcclxuICAgICAgICAgICAgcC55ID0gTWF0aC5yb3VuZCh0b3AgLyBjZWxsSGVpZ2h0KTtcclxuICAgICAgICAgICAgcmVzaXppbmcgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBub2RlLl9ldmVudCA9IGV2ZW50O1xyXG4gICAgICAgIG5vZGUuX2xhc3RUcmllZCA9IHA7IC8vIHNldCBhcyBsYXN0IHRyaWVkICh3aWxsIG51a2UgaWYgd2UgZ28gdGhlcmUpXHJcbiAgICAgICAgbGV0IHJlY3QgPSB7XHJcbiAgICAgICAgICAgIHg6IHVpLnBvc2l0aW9uLmxlZnQgKyBtTGVmdCxcclxuICAgICAgICAgICAgeTogdWkucG9zaXRpb24udG9wICsgbVRvcCxcclxuICAgICAgICAgICAgdzogKHVpLnNpemUgPyB1aS5zaXplLndpZHRoIDogbm9kZS53ICogY2VsbFdpZHRoKSAtIG1MZWZ0IC0gbVJpZ2h0LFxyXG4gICAgICAgICAgICBoOiAodWkuc2l6ZSA/IHVpLnNpemUuaGVpZ2h0IDogbm9kZS5oICogY2VsbEhlaWdodCkgLSBtVG9wIC0gbUJvdHRvbVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgaWYgKHRoaXMuZW5naW5lLm1vdmVOb2RlQ2hlY2sobm9kZSwgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwKSwgeyBjZWxsV2lkdGgsIGNlbGxIZWlnaHQsIHJlY3QsIHJlc2l6aW5nIH0pKSkge1xyXG4gICAgICAgICAgICBub2RlLl9sYXN0VWlQb3NpdGlvbiA9IHVpLnBvc2l0aW9uO1xyXG4gICAgICAgICAgICB0aGlzLmVuZ2luZS5jYWNoZVJlY3RzKGNlbGxXaWR0aCwgY2VsbEhlaWdodCwgbVRvcCwgbVJpZ2h0LCBtQm90dG9tLCBtTGVmdCk7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBub2RlLl9za2lwRG93bjtcclxuICAgICAgICAgICAgaWYgKHJlc2l6aW5nICYmIG5vZGUuc3ViR3JpZCkge1xyXG4gICAgICAgICAgICAgICAgbm9kZS5zdWJHcmlkLm9uUGFyZW50UmVzaXplKCk7XHJcbiAgICAgICAgICAgIH0gLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICB0aGlzLl9leHRyYURyYWdSb3cgPSAwOyAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUNvbnRhaW5lckhlaWdodCgpO1xyXG4gICAgICAgICAgICBsZXQgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0OyAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgICAgIHRoaXMuX3dyaXRlUG9zQXR0cih0YXJnZXQsIG5vZGUpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fZ3NFdmVudEhhbmRsZXJbZXZlbnQudHlwZV0pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2dzRXZlbnRIYW5kbGVyW2V2ZW50LnR5cGVdKGV2ZW50LCB0YXJnZXQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyoqIEBpbnRlcm5hbCBjYWxsZWQgd2hlbiBpdGVtIGxlYXZpbmcgb3VyIGFyZWEgYnkgZWl0aGVyIGN1cnNvciBkcm9wb3V0IGV2ZW50XHJcbiAgICAgKiBvciBzaGFwZSBpcyBvdXRzaWRlIG91ciBib3VuZGFyaWVzLiByZW1vdmUgaXQgZnJvbSB1cywgYW5kIG1hcmsgdGVtcG9yYXJ5IGlmIHRoaXMgd2FzXHJcbiAgICAgKiBvdXIgaXRlbSB0byBzdGFydCB3aXRoIGVsc2UgcmVzdG9yZSBwcmV2IG5vZGUgdmFsdWVzIGZyb20gcHJldiBncmlkIGl0IGNhbWUgZnJvbS5cclxuICAgICAqKi9cclxuICAgIF9sZWF2ZShlbCwgaGVscGVyKSB7XHJcbiAgICAgICAgbGV0IG5vZGUgPSBlbC5ncmlkc3RhY2tOb2RlO1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGRkLm9mZihlbCwgJ2RyYWcnKTsgLy8gbm8gbmVlZCB0byB0cmFjayB3aGlsZSBiZWluZyBvdXRzaWRlXHJcbiAgICAgICAgLy8gdGhpcyBnZXRzIGNhbGxlZCB3aGVuIGN1cnNvciBsZWF2ZXMgYW5kIHNoYXBlIGlzIG91dHNpZGUsIHNvIG9ubHkgZG8gdGhpcyBvbmNlXHJcbiAgICAgICAgaWYgKG5vZGUuX3RlbXBvcmFyeVJlbW92ZWQpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBub2RlLl90ZW1wb3JhcnlSZW1vdmVkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmVuZ2luZS5yZW1vdmVOb2RlKG5vZGUpOyAvLyByZW1vdmUgcGxhY2Vob2xkZXIgYXMgd2VsbCwgb3RoZXJ3aXNlIGl0J3MgYSBzaWduIG5vZGUgaXMgbm90IGluIG91ciBsaXN0LCB3aGljaCBpcyBhIGJpZ2dlciBpc3N1ZVxyXG4gICAgICAgIG5vZGUuZWwgPSBub2RlLl9pc0V4dGVybmFsICYmIGhlbHBlciA/IGhlbHBlciA6IGVsOyAvLyBwb2ludCBiYWNrIHRvIHJlYWwgaXRlbSBiZWluZyBkcmFnZ2VkXHJcbiAgICAgICAgaWYgKHRoaXMub3B0cy5yZW1vdmFibGUgPT09IHRydWUpIHsgLy8gYm9vbGVhbiB2cyBhIGNsYXNzIHN0cmluZ1xyXG4gICAgICAgICAgICAvLyBpdGVtIGxlYXZpbmcgdXMgYW5kIHdlIGFyZSBzdXBwb3NlZCB0byByZW1vdmUgb24gbGVhdmUgKG5vIG5lZWQgdG8gZHJhZyBvbnRvIHRyYXNoKSBtYXJrIGl0IHNvXHJcbiAgICAgICAgICAgIHRoaXMuX2l0ZW1SZW1vdmluZyhlbCwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGZpbmFsbHkgaWYgaXRlbSBvcmlnaW5hbGx5IGNhbWUgZnJvbSBhbm90aGVyIGdyaWQsIGJ1dCBsZWZ0IHVzLCByZXN0b3JlIHRoaW5ncyBiYWNrIHRvIHByZXYgaW5mb1xyXG4gICAgICAgIGlmIChlbC5fZ3JpZHN0YWNrTm9kZU9yaWcpIHtcclxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ2xlYXZlIGRlbGV0ZSBfZ3JpZHN0YWNrTm9kZU9yaWcnKSAvLyBURVNUXHJcbiAgICAgICAgICAgIGVsLmdyaWRzdGFja05vZGUgPSBlbC5fZ3JpZHN0YWNrTm9kZU9yaWc7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBlbC5fZ3JpZHN0YWNrTm9kZU9yaWc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKG5vZGUuX2lzRXh0ZXJuYWwpIHtcclxuICAgICAgICAgICAgLy8gaXRlbSBjYW1lIGZyb20gb3V0c2lkZSAobGlrZSBhIHRvb2xiYXIpIHNvIG51a2UgYW55IG5vZGUgaW5mb1xyXG4gICAgICAgICAgICBkZWxldGUgbm9kZS5lbDtcclxuICAgICAgICAgICAgZGVsZXRlIGVsLmdyaWRzdGFja05vZGU7XHJcbiAgICAgICAgICAgIC8vIGFuZCByZXN0b3JlIGFsbCBub2RlcyBiYWNrIHRvIG9yaWdpbmFsXHJcbiAgICAgICAgICAgIHRoaXMuZW5naW5lLnJlc3RvcmVJbml0aWFsKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gbGVnYWN5IG1ldGhvZCByZW1vdmVkXHJcbiAgICBjb21taXQoKSB7IHV0aWxzXzEub2Jzb2xldGUodGhpcywgdGhpcy5iYXRjaFVwZGF0ZShmYWxzZSksICdjb21taXQnLCAnYmF0Y2hVcGRhdGUnLCAnNS4yJyk7IHJldHVybiB0aGlzOyB9XHJcbn1cclxuZXhwb3J0cy5HcmlkU3RhY2sgPSBHcmlkU3RhY2s7XHJcbi8qKiBzY29waW5nIHNvIHVzZXJzIGNhbiBjYWxsIEdyaWRTdGFjay5VdGlscy5zb3J0KCkgZm9yIGV4YW1wbGUgKi9cclxuR3JpZFN0YWNrLlV0aWxzID0gdXRpbHNfMS5VdGlscztcclxuLyoqIHNjb3Bpbmcgc28gdXNlcnMgY2FuIGNhbGwgbmV3IEdyaWRTdGFjay5FbmdpbmUoMTIpIGZvciBleGFtcGxlICovXHJcbkdyaWRTdGFjay5FbmdpbmUgPSBncmlkc3RhY2tfZW5naW5lXzEuR3JpZFN0YWNrRW5naW5lO1xyXG5HcmlkU3RhY2suR0RSZXYgPSAnNy4zLjAnO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1ncmlkc3RhY2suanMubWFwIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///3624\n")},1032:(__unused_webpack_module,exports)=>{"use strict";eval("\r\n/**\r\n * types.ts 7.3.0\r\n * Copyright (c) 2021 Alain Dumesny - see GridStack root license\r\n */\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.dragInDefaultOptions = exports.gridDefaults = void 0;\r\n// default values for grid options - used during init and when saving out\r\nexports.gridDefaults = {\r\n alwaysShowResizeHandle: 'mobile',\r\n animate: true,\r\n auto: true,\r\n cellHeight: 'auto',\r\n cellHeightThrottle: 100,\r\n cellHeightUnit: 'px',\r\n column: 12,\r\n draggable: { handle: '.grid-stack-item-content', appendTo: 'body', scroll: true },\r\n handle: '.grid-stack-item-content',\r\n itemClass: 'grid-stack-item',\r\n margin: 10,\r\n marginUnit: 'px',\r\n maxRow: 0,\r\n minRow: 0,\r\n oneColumnSize: 768,\r\n placeholderClass: 'grid-stack-placeholder',\r\n placeholderText: '',\r\n removableOptions: { accept: '.grid-stack-item' },\r\n resizable: { handles: 'se' },\r\n rtl: 'auto',\r\n};\r\n/** default dragIn options */\r\nexports.dragInDefaultOptions = {\r\n handle: '.grid-stack-item-content',\r\n appendTo: 'body',\r\n};\r\n//# sourceMappingURL=types.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTAzMi5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELDRCQUE0QixHQUFHLG9CQUFvQjtBQUNuRDtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixvRUFBb0U7QUFDckY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLDRCQUE0QjtBQUNwRCxpQkFBaUIsZUFBZTtBQUNoQztBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9kYXNoYm9hcmQtYWR2YW5jZWQvLi4vbm9kZV9tb2R1bGVzL2dyaWRzdGFjay9kaXN0L3R5cGVzLmpzPzg2MDQiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XHJcbi8qKlxyXG4gKiB0eXBlcy50cyA3LjMuMFxyXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjEgQWxhaW4gRHVtZXNueSAtIHNlZSBHcmlkU3RhY2sgcm9vdCBsaWNlbnNlXHJcbiAqL1xyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XHJcbmV4cG9ydHMuZHJhZ0luRGVmYXVsdE9wdGlvbnMgPSBleHBvcnRzLmdyaWREZWZhdWx0cyA9IHZvaWQgMDtcclxuLy8gZGVmYXVsdCB2YWx1ZXMgZm9yIGdyaWQgb3B0aW9ucyAtIHVzZWQgZHVyaW5nIGluaXQgYW5kIHdoZW4gc2F2aW5nIG91dFxyXG5leHBvcnRzLmdyaWREZWZhdWx0cyA9IHtcclxuICAgIGFsd2F5c1Nob3dSZXNpemVIYW5kbGU6ICdtb2JpbGUnLFxyXG4gICAgYW5pbWF0ZTogdHJ1ZSxcclxuICAgIGF1dG86IHRydWUsXHJcbiAgICBjZWxsSGVpZ2h0OiAnYXV0bycsXHJcbiAgICBjZWxsSGVpZ2h0VGhyb3R0bGU6IDEwMCxcclxuICAgIGNlbGxIZWlnaHRVbml0OiAncHgnLFxyXG4gICAgY29sdW1uOiAxMixcclxuICAgIGRyYWdnYWJsZTogeyBoYW5kbGU6ICcuZ3JpZC1zdGFjay1pdGVtLWNvbnRlbnQnLCBhcHBlbmRUbzogJ2JvZHknLCBzY3JvbGw6IHRydWUgfSxcclxuICAgIGhhbmRsZTogJy5ncmlkLXN0YWNrLWl0ZW0tY29udGVudCcsXHJcbiAgICBpdGVtQ2xhc3M6ICdncmlkLXN0YWNrLWl0ZW0nLFxyXG4gICAgbWFyZ2luOiAxMCxcclxuICAgIG1hcmdpblVuaXQ6ICdweCcsXHJcbiAgICBtYXhSb3c6IDAsXHJcbiAgICBtaW5Sb3c6IDAsXHJcbiAgICBvbmVDb2x1bW5TaXplOiA3NjgsXHJcbiAgICBwbGFjZWhvbGRlckNsYXNzOiAnZ3JpZC1zdGFjay1wbGFjZWhvbGRlcicsXHJcbiAgICBwbGFjZWhvbGRlclRleHQ6ICcnLFxyXG4gICAgcmVtb3ZhYmxlT3B0aW9uczogeyBhY2NlcHQ6ICcuZ3JpZC1zdGFjay1pdGVtJyB9LFxyXG4gICAgcmVzaXphYmxlOiB7IGhhbmRsZXM6ICdzZScgfSxcclxuICAgIHJ0bDogJ2F1dG8nLFxyXG59O1xyXG4vKiogZGVmYXVsdCBkcmFnSW4gb3B0aW9ucyAqL1xyXG5leHBvcnRzLmRyYWdJbkRlZmF1bHRPcHRpb25zID0ge1xyXG4gICAgaGFuZGxlOiAnLmdyaWQtc3RhY2staXRlbS1jb250ZW50JyxcclxuICAgIGFwcGVuZFRvOiAnYm9keScsXHJcbn07XHJcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXR5cGVzLmpzLm1hcCJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///1032\n")},6480:(__unused_webpack_module,exports)=>{"use strict";eval("\r\n/**\r\n * utils.ts 7.3.0\r\n * Copyright (c) 2021 Alain Dumesny - see GridStack root license\r\n */\r\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\r\nexports.Utils = exports.obsoleteAttr = exports.obsoleteOptsDel = exports.obsoleteOpts = exports.obsolete = void 0;\r\n/** checks for obsolete method names */\r\n// eslint-disable-next-line\r\nfunction obsolete(self, f, oldName, newName, rev) {\r\n let wrapper = (...args) => {\r\n console.warn('gridstack.js: Function `' + oldName + '` is deprecated in ' + rev + ' and has been replaced ' +\r\n 'with `' + newName + '`. It will be **removed** in a future release');\r\n return f.apply(self, args);\r\n };\r\n wrapper.prototype = f.prototype;\r\n return wrapper;\r\n}\r\nexports.obsolete = obsolete;\r\n/** checks for obsolete grid options (can be used for any fields, but msg is about options) */\r\nfunction obsoleteOpts(opts, oldName, newName, rev) {\r\n if (opts[oldName] !== undefined) {\r\n opts[newName] = opts[oldName];\r\n console.warn('gridstack.js: Option `' + oldName + '` is deprecated in ' + rev + ' and has been replaced with `' +\r\n newName + '`. It will be **removed** in a future release');\r\n }\r\n}\r\nexports.obsoleteOpts = obsoleteOpts;\r\n/** checks for obsolete grid options which are gone */\r\nfunction obsoleteOptsDel(opts, oldName, rev, info) {\r\n if (opts[oldName] !== undefined) {\r\n console.warn('gridstack.js: Option `' + oldName + '` is deprecated in ' + rev + info);\r\n }\r\n}\r\nexports.obsoleteOptsDel = obsoleteOptsDel;\r\n/** checks for obsolete Jquery element attributes */\r\nfunction obsoleteAttr(el, oldName, newName, rev) {\r\n let oldAttr = el.getAttribute(oldName);\r\n if (oldAttr !== null) {\r\n el.setAttribute(newName, oldAttr);\r\n console.warn('gridstack.js: attribute `' + oldName + '`=' + oldAttr + ' is deprecated on this object in ' + rev + ' and has been replaced with `' +\r\n newName + '`. It will be **removed** in a future release');\r\n }\r\n}\r\nexports.obsoleteAttr = obsoleteAttr;\r\n/**\r\n * Utility methods\r\n */\r\nclass Utils {\r\n /** convert a potential selector into actual list of html elements */\r\n static getElements(els) {\r\n if (typeof els === 'string') {\r\n let list = document.querySelectorAll(els);\r\n if (!list.length && els[0] !== '.' && els[0] !== '#') {\r\n list = document.querySelectorAll('.' + els);\r\n if (!list.length) {\r\n list = document.querySelectorAll('#' + els);\r\n }\r\n }\r\n return Array.from(list);\r\n }\r\n return [els];\r\n }\r\n /** convert a potential selector into actual single element */\r\n static getElement(els) {\r\n if (typeof els === 'string') {\r\n if (!els.length)\r\n return null;\r\n if (els[0] === '#') {\r\n return document.getElementById(els.substring(1));\r\n }\r\n if (els[0] === '.' || els[0] === '[') {\r\n return document.querySelector(els);\r\n }\r\n // if we start with a digit, assume it's an id (error calling querySelector('#1')) as class are not valid CSS\r\n if (!isNaN(+els[0])) { // start with digit\r\n return document.getElementById(els);\r\n }\r\n // finally try string, then id then class\r\n let el = document.querySelector(els);\r\n if (!el) {\r\n el = document.getElementById(els);\r\n }\r\n if (!el) {\r\n el = document.querySelector('.' + els);\r\n }\r\n return el;\r\n }\r\n return els;\r\n }\r\n /** returns true if a and b overlap */\r\n static isIntercepted(a, b) {\r\n return !(a.y >= b.y + b.h || a.y + a.h <= b.y || a.x + a.w <= b.x || a.x >= b.x + b.w);\r\n }\r\n /** returns true if a and b touch edges or corners */\r\n static isTouching(a, b) {\r\n return Utils.isIntercepted(a, { x: b.x - 0.5, y: b.y - 0.5, w: b.w + 1, h: b.h + 1 });\r\n }\r\n /** returns the area a and b overlap */\r\n static areaIntercept(a, b) {\r\n let x0 = (a.x > b.x) ? a.x : b.x;\r\n let x1 = (a.x + a.w < b.x + b.w) ? a.x + a.w : b.x + b.w;\r\n if (x1 <= x0)\r\n return 0; // no overlap\r\n let y0 = (a.y > b.y) ? a.y : b.y;\r\n let y1 = (a.y + a.h < b.y + b.h) ? a.y + a.h : b.y + b.h;\r\n if (y1 <= y0)\r\n return 0; // no overlap\r\n return (x1 - x0) * (y1 - y0);\r\n }\r\n /** returns the area */\r\n static area(a) {\r\n return a.w * a.h;\r\n }\r\n /**\r\n * Sorts array of nodes\r\n * @param nodes array to sort\r\n * @param dir 1 for asc, -1 for desc (optional)\r\n * @param width width of the grid. If undefined the width will be calculated automatically (optional).\r\n **/\r\n static sort(nodes, dir, column) {\r\n column = column || nodes.reduce((col, n) => Math.max(n.x + n.w, col), 0) || 12;\r\n if (dir === -1)\r\n return nodes.sort((a, b) => (b.x + b.y * column) - (a.x + a.y * column));\r\n else\r\n return nodes.sort((b, a) => (b.x + b.y * column) - (a.x + a.y * column));\r\n }\r\n /**\r\n * creates a style sheet with style id under given parent\r\n * @param id will set the 'gs-style-id' attribute to that id\r\n * @param parent to insert the stylesheet as first child,\r\n * if none supplied it will be appended to the document head instead.\r\n */\r\n static createStylesheet(id, parent, options) {\r\n let style = document.createElement('style');\r\n const nonce = options === null || options === void 0 ? void 0 : options.nonce;\r\n if (nonce)\r\n style.nonce = nonce;\r\n style.setAttribute('type', 'text/css');\r\n style.setAttribute('gs-style-id', id);\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n if (style.styleSheet) { // TODO: only CSSImportRule have that and different beast ??\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n style.styleSheet.cssText = '';\r\n }\r\n else {\r\n style.appendChild(document.createTextNode('')); // WebKit hack\r\n }\r\n if (!parent) {\r\n // default to head\r\n parent = document.getElementsByTagName('head')[0];\r\n parent.appendChild(style);\r\n }\r\n else {\r\n parent.insertBefore(style, parent.firstChild);\r\n }\r\n return style.sheet;\r\n }\r\n /** removed the given stylesheet id */\r\n static removeStylesheet(id) {\r\n let el = document.querySelector('STYLE[gs-style-id=' + id + ']');\r\n if (el && el.parentNode)\r\n el.remove();\r\n }\r\n /** inserts a CSS rule */\r\n static addCSSRule(sheet, selector, rules) {\r\n if (typeof sheet.addRule === 'function') {\r\n sheet.addRule(selector, rules);\r\n }\r\n else if (typeof sheet.insertRule === 'function') {\r\n sheet.insertRule(`${selector}{${rules}}`);\r\n }\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n static toBool(v) {\r\n if (typeof v === 'boolean') {\r\n return v;\r\n }\r\n if (typeof v === 'string') {\r\n v = v.toLowerCase();\r\n return !(v === '' || v === 'no' || v === 'false' || v === '0');\r\n }\r\n return Boolean(v);\r\n }\r\n static toNumber(value) {\r\n return (value === null || value.length === 0) ? undefined : Number(value);\r\n }\r\n static parseHeight(val) {\r\n let h;\r\n let unit = 'px';\r\n if (typeof val === 'string') {\r\n let match = val.match(/^(-[0-9]+\\.[0-9]+|[0-9]*\\.[0-9]+|-[0-9]+|[0-9]+)(px|em|rem|vh|vw|%)?$/);\r\n if (!match) {\r\n throw new Error('Invalid height');\r\n }\r\n unit = match[2] || 'px';\r\n h = parseFloat(match[1]);\r\n }\r\n else {\r\n h = val;\r\n }\r\n return { h, unit };\r\n }\r\n /** copies unset fields in target to use the given default sources values */\r\n // eslint-disable-next-line\r\n static defaults(target, ...sources) {\r\n sources.forEach(source => {\r\n for (const key in source) {\r\n if (!source.hasOwnProperty(key))\r\n return;\r\n if (target[key] === null || target[key] === undefined) {\r\n target[key] = source[key];\r\n }\r\n else if (typeof source[key] === 'object' && typeof target[key] === 'object') {\r\n // property is an object, recursively add it's field over... #1373\r\n this.defaults(target[key], source[key]);\r\n }\r\n }\r\n });\r\n return target;\r\n }\r\n /** given 2 objects return true if they have the same values. Checks for Object {} having same fields and values (just 1 level down) */\r\n static same(a, b) {\r\n if (typeof a !== 'object')\r\n return a == b;\r\n if (typeof a !== typeof b)\r\n return false;\r\n // else we have object, check just 1 level deep for being same things...\r\n if (Object.keys(a).length !== Object.keys(b).length)\r\n return false;\r\n for (const key in a) {\r\n if (a[key] !== b[key])\r\n return false;\r\n }\r\n return true;\r\n }\r\n /** copies over b size & position (GridStackPosition), and optionally min/max as well */\r\n static copyPos(a, b, doMinMax = false) {\r\n a.x = b.x;\r\n a.y = b.y;\r\n a.w = b.w;\r\n a.h = b.h;\r\n if (doMinMax) {\r\n if (b.minW)\r\n a.minW = b.minW;\r\n if (b.minH)\r\n a.minH = b.minH;\r\n if (b.maxW)\r\n a.maxW = b.maxW;\r\n if (b.maxH)\r\n a.maxH = b.maxH;\r\n }\r\n return a;\r\n }\r\n /** true if a and b has same size & position */\r\n static samePos(a, b) {\r\n return a && b && a.x === b.x && a.y === b.y && a.w === b.w && a.h === b.h;\r\n }\r\n /** removes field from the first object if same as the second objects (like diffing) and internal '_' for saving */\r\n static removeInternalAndSame(a, b) {\r\n if (typeof a !== 'object' || typeof b !== 'object')\r\n return;\r\n for (let key in a) {\r\n let val = a[key];\r\n if (key[0] === '_' || val === b[key]) {\r\n delete a[key];\r\n }\r\n else if (val && typeof val === 'object' && b[key] !== undefined) {\r\n for (let i in val) {\r\n if (val[i] === b[key][i] || i[0] === '_') {\r\n delete val[i];\r\n }\r\n }\r\n if (!Object.keys(val).length) {\r\n delete a[key];\r\n }\r\n }\r\n }\r\n }\r\n /** removes internal fields '_' and default values for saving */\r\n static removeInternalForSave(n, removeEl = true) {\r\n for (let key in n) {\r\n if (key[0] === '_' || n[key] === null || n[key] === undefined)\r\n delete n[key];\r\n }\r\n delete n.grid;\r\n if (removeEl)\r\n delete n.el;\r\n // delete default values (will be re-created on read)\r\n if (!n.autoPosition)\r\n delete n.autoPosition;\r\n if (!n.noResize)\r\n delete n.noResize;\r\n if (!n.noMove)\r\n delete n.noMove;\r\n if (!n.locked)\r\n delete n.locked;\r\n if (n.w === 1 || n.w === n.minW)\r\n delete n.w;\r\n if (n.h === 1 || n.h === n.minH)\r\n delete n.h;\r\n }\r\n /** return the closest parent (or itself) matching the given class */\r\n static closestUpByClass(el, name) {\r\n while (el) {\r\n if (el.classList.contains(name))\r\n return el;\r\n el = el.parentElement;\r\n }\r\n return null;\r\n }\r\n /** delay calling the given function for given delay, preventing new calls from happening while waiting */\r\n static throttle(func, delay) {\r\n let isWaiting = false;\r\n return (...args) => {\r\n if (!isWaiting) {\r\n isWaiting = true;\r\n setTimeout(() => { func(...args); isWaiting = false; }, delay);\r\n }\r\n };\r\n }\r\n static removePositioningStyles(el) {\r\n let style = el.style;\r\n if (style.position) {\r\n style.removeProperty('position');\r\n }\r\n if (style.left) {\r\n style.removeProperty('left');\r\n }\r\n if (style.top) {\r\n style.removeProperty('top');\r\n }\r\n if (style.width) {\r\n style.removeProperty('width');\r\n }\r\n if (style.height) {\r\n style.removeProperty('height');\r\n }\r\n }\r\n /** @internal returns the passed element if scrollable, else the closest parent that will, up to the entire document scrolling element */\r\n static getScrollElement(el) {\r\n if (!el)\r\n return document.scrollingElement || document.documentElement; // IE support\r\n const style = getComputedStyle(el);\r\n const overflowRegex = /(auto|scroll)/;\r\n if (overflowRegex.test(style.overflow + style.overflowY)) {\r\n return el;\r\n }\r\n else {\r\n return this.getScrollElement(el.parentElement);\r\n }\r\n }\r\n /** @internal */\r\n static updateScrollPosition(el, position, distance) {\r\n // is widget in view?\r\n let rect = el.getBoundingClientRect();\r\n let innerHeightOrClientHeight = (window.innerHeight || document.documentElement.clientHeight);\r\n if (rect.top < 0 ||\r\n rect.bottom > innerHeightOrClientHeight) {\r\n // set scrollTop of first parent that scrolls\r\n // if parent is larger than el, set as low as possible\r\n // to get entire widget on screen\r\n let offsetDiffDown = rect.bottom - innerHeightOrClientHeight;\r\n let offsetDiffUp = rect.top;\r\n let scrollEl = this.getScrollElement(el);\r\n if (scrollEl !== null) {\r\n let prevScroll = scrollEl.scrollTop;\r\n if (rect.top < 0 && distance < 0) {\r\n // moving up\r\n if (el.offsetHeight > innerHeightOrClientHeight) {\r\n scrollEl.scrollTop += distance;\r\n }\r\n else {\r\n scrollEl.scrollTop += Math.abs(offsetDiffUp) > Math.abs(distance) ? distance : offsetDiffUp;\r\n }\r\n }\r\n else if (distance > 0) {\r\n // moving down\r\n if (el.offsetHeight > innerHeightOrClientHeight) {\r\n scrollEl.scrollTop += distance;\r\n }\r\n else {\r\n scrollEl.scrollTop += offsetDiffDown > distance ? distance : offsetDiffDown;\r\n }\r\n }\r\n // move widget y by amount scrolled\r\n position.top += scrollEl.scrollTop - prevScroll;\r\n }\r\n }\r\n }\r\n /**\r\n * @internal Function used to scroll the page.\r\n *\r\n * @param event `MouseEvent` that triggers the resize\r\n * @param el `HTMLElement` that's being resized\r\n * @param distance Distance from the V edges to start scrolling\r\n */\r\n static updateScrollResize(event, el, distance) {\r\n const scrollEl = this.getScrollElement(el);\r\n const height = scrollEl.clientHeight;\r\n // #1727 event.clientY is relative to viewport, so must compare this against position of scrollEl getBoundingClientRect().top\r\n // #1745 Special situation if scrollEl is document 'html': here browser spec states that\r\n // clientHeight is height of viewport, but getBoundingClientRect() is rectangle of html element;\r\n // this discrepancy arises because in reality scrollbar is attached to viewport, not html element itself.\r\n const offsetTop = (scrollEl === this.getScrollElement()) ? 0 : scrollEl.getBoundingClientRect().top;\r\n const pointerPosY = event.clientY - offsetTop;\r\n const top = pointerPosY < distance;\r\n const bottom = pointerPosY > height - distance;\r\n if (top) {\r\n // This also can be done with a timeout to keep scrolling while the mouse is\r\n // in the scrolling zone. (will have smoother behavior)\r\n scrollEl.scrollBy({ behavior: 'smooth', top: pointerPosY - distance });\r\n }\r\n else if (bottom) {\r\n scrollEl.scrollBy({ behavior: 'smooth', top: distance - (height - pointerPosY) });\r\n }\r\n }\r\n /** single level clone, returning a new object with same top fields. This will share sub objects and arrays */\r\n static clone(obj) {\r\n if (obj === null || obj === undefined || typeof (obj) !== 'object') {\r\n return obj;\r\n }\r\n // return Object.assign({}, obj);\r\n if (obj instanceof Array) {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n return [...obj];\r\n }\r\n return Object.assign({}, obj);\r\n }\r\n /**\r\n * Recursive clone version that returns a full copy, checking for nested objects and arrays ONLY.\r\n * Note: this will use as-is any key starting with double __ (and not copy inside) some lib have circular dependencies.\r\n */\r\n static cloneDeep(obj) {\r\n // list of fields we will skip during cloneDeep (nested objects, other internal)\r\n const skipFields = ['parentGrid', 'el', 'grid', 'subGrid', 'engine'];\r\n // return JSON.parse(JSON.stringify(obj)); // doesn't work with date format ?\r\n const ret = Utils.clone(obj);\r\n for (const key in ret) {\r\n // NOTE: we don't support function/circular dependencies so skip those properties for now...\r\n if (ret.hasOwnProperty(key) && typeof (ret[key]) === 'object' && key.substring(0, 2) !== '__' && !skipFields.find(k => k === key)) {\r\n ret[key] = Utils.cloneDeep(obj[key]);\r\n }\r\n }\r\n return ret;\r\n }\r\n /** deep clone the given HTML node, removing teh unique id field */\r\n static cloneNode(el) {\r\n const node = el.cloneNode(true);\r\n node.removeAttribute('id');\r\n return node;\r\n }\r\n static appendTo(el, parent) {\r\n let parentNode;\r\n if (typeof parent === 'string') {\r\n parentNode = document.querySelector(parent);\r\n }\r\n else {\r\n parentNode = parent;\r\n }\r\n if (parentNode) {\r\n parentNode.appendChild(el);\r\n }\r\n }\r\n // public static setPositionRelative(el: HTMLElement): void {\r\n // if (!(/^(?:r|a|f)/).test(window.getComputedStyle(el).position)) {\r\n // el.style.position = \"relative\";\r\n // }\r\n // }\r\n static addElStyles(el, styles) {\r\n if (styles instanceof Object) {\r\n for (const s in styles) {\r\n if (styles.hasOwnProperty(s)) {\r\n if (Array.isArray(styles[s])) {\r\n // support fallback value\r\n styles[s].forEach(val => {\r\n el.style[s] = val;\r\n });\r\n }\r\n else {\r\n el.style[s] = styles[s];\r\n }\r\n }\r\n }\r\n }\r\n }\r\n static initEvent(e, info) {\r\n const evt = { type: info.type };\r\n const obj = {\r\n button: 0,\r\n which: 0,\r\n buttons: 1,\r\n bubbles: true,\r\n cancelable: true,\r\n target: info.target ? info.target : e.target\r\n };\r\n // don't check for `instanceof DragEvent` as Safari use MouseEvent #1540\r\n if (e.dataTransfer) {\r\n evt['dataTransfer'] = e.dataTransfer; // workaround 'readonly' field.\r\n }\r\n ['altKey', 'ctrlKey', 'metaKey', 'shiftKey'].forEach(p => evt[p] = e[p]); // keys\r\n ['pageX', 'pageY', 'clientX', 'clientY', 'screenX', 'screenY'].forEach(p => evt[p] = e[p]); // point info\r\n return Object.assign(Object.assign({}, evt), obj);\r\n }\r\n /** copies the MouseEvent properties and sends it as another event to the given target */\r\n static simulateMouseEvent(e, simulatedType, target) {\r\n const simulatedEvent = document.createEvent('MouseEvents');\r\n simulatedEvent.initMouseEvent(simulatedType, // type\r\n true, // bubbles\r\n true, // cancelable\r\n window, // view\r\n 1, // detail\r\n e.screenX, // screenX\r\n e.screenY, // screenY\r\n e.clientX, // clientX\r\n e.clientY, // clientY\r\n e.ctrlKey, // ctrlKey\r\n e.altKey, // altKey\r\n e.shiftKey, // shiftKey\r\n e.metaKey, // metaKey\r\n 0, // button\r\n e.target // relatedTarget\r\n );\r\n (target || e.target).dispatchEvent(simulatedEvent);\r\n }\r\n}\r\nexports.Utils = Utils;\r\n//# sourceMappingURL=utils.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjQ4MC5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELGFBQWEsR0FBRyxvQkFBb0IsR0FBRyx1QkFBdUIsR0FBRyxvQkFBb0IsR0FBRyxnQkFBZ0I7QUFDeEc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0Msb0RBQW9EO0FBQzVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNERBQTREO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsVUFBVSxFQUFFLE9BQU87QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSx1RkFBdUY7QUFDdkY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQyxlQUFlLG9CQUFvQjtBQUN0RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwRUFBMEU7QUFDMUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxpREFBaUQ7QUFDakY7QUFDQTtBQUNBLGdDQUFnQyw0REFBNEQ7QUFDNUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0M7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRDtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrREFBa0Q7QUFDbEQ7QUFDQSxrRkFBa0Y7QUFDbEYsb0dBQW9HO0FBQ3BHLDZDQUE2QztBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZGFzaGJvYXJkLWFkdmFuY2VkLy4uL25vZGVfbW9kdWxlcy9ncmlkc3RhY2svZGlzdC91dGlscy5qcz9iODgwIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xyXG4vKipcclxuICogdXRpbHMudHMgNy4zLjBcclxuICogQ29weXJpZ2h0IChjKSAyMDIxIEFsYWluIER1bWVzbnkgLSBzZWUgR3JpZFN0YWNrIHJvb3QgbGljZW5zZVxyXG4gKi9cclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xyXG5leHBvcnRzLlV0aWxzID0gZXhwb3J0cy5vYnNvbGV0ZUF0dHIgPSBleHBvcnRzLm9ic29sZXRlT3B0c0RlbCA9IGV4cG9ydHMub2Jzb2xldGVPcHRzID0gZXhwb3J0cy5vYnNvbGV0ZSA9IHZvaWQgMDtcclxuLyoqIGNoZWNrcyBmb3Igb2Jzb2xldGUgbWV0aG9kIG5hbWVzICovXHJcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxyXG5mdW5jdGlvbiBvYnNvbGV0ZShzZWxmLCBmLCBvbGROYW1lLCBuZXdOYW1lLCByZXYpIHtcclxuICAgIGxldCB3cmFwcGVyID0gKC4uLmFyZ3MpID0+IHtcclxuICAgICAgICBjb25zb2xlLndhcm4oJ2dyaWRzdGFjay5qczogRnVuY3Rpb24gYCcgKyBvbGROYW1lICsgJ2AgaXMgZGVwcmVjYXRlZCBpbiAnICsgcmV2ICsgJyBhbmQgaGFzIGJlZW4gcmVwbGFjZWQgJyArXHJcbiAgICAgICAgICAgICd3aXRoIGAnICsgbmV3TmFtZSArICdgLiBJdCB3aWxsIGJlICoqcmVtb3ZlZCoqIGluIGEgZnV0dXJlIHJlbGVhc2UnKTtcclxuICAgICAgICByZXR1cm4gZi5hcHBseShzZWxmLCBhcmdzKTtcclxuICAgIH07XHJcbiAgICB3cmFwcGVyLnByb3RvdHlwZSA9IGYucHJvdG90eXBlO1xyXG4gICAgcmV0dXJuIHdyYXBwZXI7XHJcbn1cclxuZXhwb3J0cy5vYnNvbGV0ZSA9IG9ic29sZXRlO1xyXG4vKiogY2hlY2tzIGZvciBvYnNvbGV0ZSBncmlkIG9wdGlvbnMgKGNhbiBiZSB1c2VkIGZvciBhbnkgZmllbGRzLCBidXQgbXNnIGlzIGFib3V0IG9wdGlvbnMpICovXHJcbmZ1bmN0aW9uIG9ic29sZXRlT3B0cyhvcHRzLCBvbGROYW1lLCBuZXdOYW1lLCByZXYpIHtcclxuICAgIGlmIChvcHRzW29sZE5hbWVdICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBvcHRzW25ld05hbWVdID0gb3B0c1tvbGROYW1lXTtcclxuICAgICAgICBjb25zb2xlLndhcm4oJ2dyaWRzdGFjay5qczogT3B0aW9uIGAnICsgb2xkTmFtZSArICdgIGlzIGRlcHJlY2F0ZWQgaW4gJyArIHJldiArICcgYW5kIGhhcyBiZWVuIHJlcGxhY2VkIHdpdGggYCcgK1xyXG4gICAgICAgICAgICBuZXdOYW1lICsgJ2AuIEl0IHdpbGwgYmUgKipyZW1vdmVkKiogaW4gYSBmdXR1cmUgcmVsZWFzZScpO1xyXG4gICAgfVxyXG59XHJcbmV4cG9ydHMub2Jzb2xldGVPcHRzID0gb2Jzb2xldGVPcHRzO1xyXG4vKiogY2hlY2tzIGZvciBvYnNvbGV0ZSBncmlkIG9wdGlvbnMgd2hpY2ggYXJlIGdvbmUgKi9cclxuZnVuY3Rpb24gb2Jzb2xldGVPcHRzRGVsKG9wdHMsIG9sZE5hbWUsIHJldiwgaW5mbykge1xyXG4gICAgaWYgKG9wdHNbb2xkTmFtZV0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGNvbnNvbGUud2FybignZ3JpZHN0YWNrLmpzOiBPcHRpb24gYCcgKyBvbGROYW1lICsgJ2AgaXMgZGVwcmVjYXRlZCBpbiAnICsgcmV2ICsgaW5mbyk7XHJcbiAgICB9XHJcbn1cclxuZXhwb3J0cy5vYnNvbGV0ZU9wdHNEZWwgPSBvYnNvbGV0ZU9wdHNEZWw7XHJcbi8qKiBjaGVja3MgZm9yIG9ic29sZXRlIEpxdWVyeSBlbGVtZW50IGF0dHJpYnV0ZXMgKi9cclxuZnVuY3Rpb24gb2Jzb2xldGVBdHRyKGVsLCBvbGROYW1lLCBuZXdOYW1lLCByZXYpIHtcclxuICAgIGxldCBvbGRBdHRyID0gZWwuZ2V0QXR0cmlidXRlKG9sZE5hbWUpO1xyXG4gICAgaWYgKG9sZEF0dHIgIT09IG51bGwpIHtcclxuICAgICAgICBlbC5zZXRBdHRyaWJ1dGUobmV3TmFtZSwgb2xkQXR0cik7XHJcbiAgICAgICAgY29uc29sZS53YXJuKCdncmlkc3RhY2suanM6IGF0dHJpYnV0ZSBgJyArIG9sZE5hbWUgKyAnYD0nICsgb2xkQXR0ciArICcgaXMgZGVwcmVjYXRlZCBvbiB0aGlzIG9iamVjdCBpbiAnICsgcmV2ICsgJyBhbmQgaGFzIGJlZW4gcmVwbGFjZWQgd2l0aCBgJyArXHJcbiAgICAgICAgICAgIG5ld05hbWUgKyAnYC4gSXQgd2lsbCBiZSAqKnJlbW92ZWQqKiBpbiBhIGZ1dHVyZSByZWxlYXNlJyk7XHJcbiAgICB9XHJcbn1cclxuZXhwb3J0cy5vYnNvbGV0ZUF0dHIgPSBvYnNvbGV0ZUF0dHI7XHJcbi8qKlxyXG4gKiBVdGlsaXR5IG1ldGhvZHNcclxuICovXHJcbmNsYXNzIFV0aWxzIHtcclxuICAgIC8qKiBjb252ZXJ0IGEgcG90ZW50aWFsIHNlbGVjdG9yIGludG8gYWN0dWFsIGxpc3Qgb2YgaHRtbCBlbGVtZW50cyAqL1xyXG4gICAgc3RhdGljIGdldEVsZW1lbnRzKGVscykge1xyXG4gICAgICAgIGlmICh0eXBlb2YgZWxzID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBsZXQgbGlzdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoZWxzKTtcclxuICAgICAgICAgICAgaWYgKCFsaXN0Lmxlbmd0aCAmJiBlbHNbMF0gIT09ICcuJyAmJiBlbHNbMF0gIT09ICcjJykge1xyXG4gICAgICAgICAgICAgICAgbGlzdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy4nICsgZWxzKTtcclxuICAgICAgICAgICAgICAgIGlmICghbGlzdC5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICBsaXN0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnIycgKyBlbHMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKGxpc3QpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gW2Vsc107XHJcbiAgICB9XHJcbiAgICAvKiogY29udmVydCBhIHBvdGVudGlhbCBzZWxlY3RvciBpbnRvIGFjdHVhbCBzaW5nbGUgZWxlbWVudCAqL1xyXG4gICAgc3RhdGljIGdldEVsZW1lbnQoZWxzKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBlbHMgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIGlmICghZWxzLmxlbmd0aClcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICBpZiAoZWxzWzBdID09PSAnIycpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbHMuc3Vic3RyaW5nKDEpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoZWxzWzBdID09PSAnLicgfHwgZWxzWzBdID09PSAnWycpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGVscyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gaWYgd2Ugc3RhcnQgd2l0aCBhIGRpZ2l0LCBhc3N1bWUgaXQncyBhbiBpZCAoZXJyb3IgY2FsbGluZyBxdWVyeVNlbGVjdG9yKCcjMScpKSBhcyBjbGFzcyBhcmUgbm90IHZhbGlkIENTU1xyXG4gICAgICAgICAgICBpZiAoIWlzTmFOKCtlbHNbMF0pKSB7IC8vIHN0YXJ0IHdpdGggZGlnaXRcclxuICAgICAgICAgICAgICAgIHJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbHMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIGZpbmFsbHkgdHJ5IHN0cmluZywgdGhlbiBpZCB0aGVuIGNsYXNzXHJcbiAgICAgICAgICAgIGxldCBlbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZWxzKTtcclxuICAgICAgICAgICAgaWYgKCFlbCkge1xyXG4gICAgICAgICAgICAgICAgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbHMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghZWwpIHtcclxuICAgICAgICAgICAgICAgIGVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLicgKyBlbHMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBlbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGVscztcclxuICAgIH1cclxuICAgIC8qKiByZXR1cm5zIHRydWUgaWYgYSBhbmQgYiBvdmVybGFwICovXHJcbiAgICBzdGF0aWMgaXNJbnRlcmNlcHRlZChhLCBiKSB7XHJcbiAgICAgICAgcmV0dXJuICEoYS55ID49IGIueSArIGIuaCB8fCBhLnkgKyBhLmggPD0gYi55IHx8IGEueCArIGEudyA8PSBiLnggfHwgYS54ID49IGIueCArIGIudyk7XHJcbiAgICB9XHJcbiAgICAvKiogcmV0dXJucyB0cnVlIGlmIGEgYW5kIGIgdG91Y2ggZWRnZXMgb3IgY29ybmVycyAqL1xyXG4gICAgc3RhdGljIGlzVG91Y2hpbmcoYSwgYikge1xyXG4gICAgICAgIHJldHVybiBVdGlscy5pc0ludGVyY2VwdGVkKGEsIHsgeDogYi54IC0gMC41LCB5OiBiLnkgLSAwLjUsIHc6IGIudyArIDEsIGg6IGIuaCArIDEgfSk7XHJcbiAgICB9XHJcbiAgICAvKiogcmV0dXJucyB0aGUgYXJlYSBhIGFuZCBiIG92ZXJsYXAgKi9cclxuICAgIHN0YXRpYyBhcmVhSW50ZXJjZXB0KGEsIGIpIHtcclxuICAgICAgICBsZXQgeDAgPSAoYS54ID4gYi54KSA/IGEueCA6IGIueDtcclxuICAgICAgICBsZXQgeDEgPSAoYS54ICsgYS53IDwgYi54ICsgYi53KSA/IGEueCArIGEudyA6IGIueCArIGIudztcclxuICAgICAgICBpZiAoeDEgPD0geDApXHJcbiAgICAgICAgICAgIHJldHVybiAwOyAvLyBubyBvdmVybGFwXHJcbiAgICAgICAgbGV0IHkwID0gKGEueSA+IGIueSkgPyBhLnkgOiBiLnk7XHJcbiAgICAgICAgbGV0IHkxID0gKGEueSArIGEuaCA8IGIueSArIGIuaCkgPyBhLnkgKyBhLmggOiBiLnkgKyBiLmg7XHJcbiAgICAgICAgaWYgKHkxIDw9IHkwKVxyXG4gICAgICAgICAgICByZXR1cm4gMDsgLy8gbm8gb3ZlcmxhcFxyXG4gICAgICAgIHJldHVybiAoeDEgLSB4MCkgKiAoeTEgLSB5MCk7XHJcbiAgICB9XHJcbiAgICAvKiogcmV0dXJucyB0aGUgYXJlYSAqL1xyXG4gICAgc3RhdGljIGFyZWEoYSkge1xyXG4gICAgICAgIHJldHVybiBhLncgKiBhLmg7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFNvcnRzIGFycmF5IG9mIG5vZGVzXHJcbiAgICAgKiBAcGFyYW0gbm9kZXMgYXJyYXkgdG8gc29ydFxyXG4gICAgICogQHBhcmFtIGRpciAxIGZvciBhc2MsIC0xIGZvciBkZXNjIChvcHRpb25hbClcclxuICAgICAqIEBwYXJhbSB3aWR0aCB3aWR0aCBvZiB0aGUgZ3JpZC4gSWYgdW5kZWZpbmVkIHRoZSB3aWR0aCB3aWxsIGJlIGNhbGN1bGF0ZWQgYXV0b21hdGljYWxseSAob3B0aW9uYWwpLlxyXG4gICAgICoqL1xyXG4gICAgc3RhdGljIHNvcnQobm9kZXMsIGRpciwgY29sdW1uKSB7XHJcbiAgICAgICAgY29sdW1uID0gY29sdW1uIHx8IG5vZGVzLnJlZHVjZSgoY29sLCBuKSA9PiBNYXRoLm1heChuLnggKyBuLncsIGNvbCksIDApIHx8IDEyO1xyXG4gICAgICAgIGlmIChkaXIgPT09IC0xKVxyXG4gICAgICAgICAgICByZXR1cm4gbm9kZXMuc29ydCgoYSwgYikgPT4gKGIueCArIGIueSAqIGNvbHVtbikgLSAoYS54ICsgYS55ICogY29sdW1uKSk7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICByZXR1cm4gbm9kZXMuc29ydCgoYiwgYSkgPT4gKGIueCArIGIueSAqIGNvbHVtbikgLSAoYS54ICsgYS55ICogY29sdW1uKSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIGNyZWF0ZXMgYSBzdHlsZSBzaGVldCB3aXRoIHN0eWxlIGlkIHVuZGVyIGdpdmVuIHBhcmVudFxyXG4gICAgICogQHBhcmFtIGlkIHdpbGwgc2V0IHRoZSAnZ3Mtc3R5bGUtaWQnIGF0dHJpYnV0ZSB0byB0aGF0IGlkXHJcbiAgICAgKiBAcGFyYW0gcGFyZW50IHRvIGluc2VydCB0aGUgc3R5bGVzaGVldCBhcyBmaXJzdCBjaGlsZCxcclxuICAgICAqIGlmIG5vbmUgc3VwcGxpZWQgaXQgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgZG9jdW1lbnQgaGVhZCBpbnN0ZWFkLlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgY3JlYXRlU3R5bGVzaGVldChpZCwgcGFyZW50LCBvcHRpb25zKSB7XHJcbiAgICAgICAgbGV0IHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcclxuICAgICAgICBjb25zdCBub25jZSA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5ub25jZTtcclxuICAgICAgICBpZiAobm9uY2UpXHJcbiAgICAgICAgICAgIHN0eWxlLm5vbmNlID0gbm9uY2U7XHJcbiAgICAgICAgc3R5bGUuc2V0QXR0cmlidXRlKCd0eXBlJywgJ3RleHQvY3NzJyk7XHJcbiAgICAgICAgc3R5bGUuc2V0QXR0cmlidXRlKCdncy1zdHlsZS1pZCcsIGlkKTtcclxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gICAgICAgIGlmIChzdHlsZS5zdHlsZVNoZWV0KSB7IC8vIFRPRE86IG9ubHkgQ1NTSW1wb3J0UnVsZSBoYXZlIHRoYXQgYW5kIGRpZmZlcmVudCBiZWFzdCA/P1xyXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gICAgICAgICAgICBzdHlsZS5zdHlsZVNoZWV0LmNzc1RleHQgPSAnJztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHN0eWxlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKSk7IC8vIFdlYktpdCBoYWNrXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghcGFyZW50KSB7XHJcbiAgICAgICAgICAgIC8vIGRlZmF1bHQgdG8gaGVhZFxyXG4gICAgICAgICAgICBwYXJlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdO1xyXG4gICAgICAgICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShzdHlsZSwgcGFyZW50LmZpcnN0Q2hpbGQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc3R5bGUuc2hlZXQ7XHJcbiAgICB9XHJcbiAgICAvKiogcmVtb3ZlZCB0aGUgZ2l2ZW4gc3R5bGVzaGVldCBpZCAqL1xyXG4gICAgc3RhdGljIHJlbW92ZVN0eWxlc2hlZXQoaWQpIHtcclxuICAgICAgICBsZXQgZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdTVFlMRVtncy1zdHlsZS1pZD0nICsgaWQgKyAnXScpO1xyXG4gICAgICAgIGlmIChlbCAmJiBlbC5wYXJlbnROb2RlKVxyXG4gICAgICAgICAgICBlbC5yZW1vdmUoKTtcclxuICAgIH1cclxuICAgIC8qKiBpbnNlcnRzIGEgQ1NTIHJ1bGUgKi9cclxuICAgIHN0YXRpYyBhZGRDU1NSdWxlKHNoZWV0LCBzZWxlY3RvciwgcnVsZXMpIHtcclxuICAgICAgICBpZiAodHlwZW9mIHNoZWV0LmFkZFJ1bGUgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgc2hlZXQuYWRkUnVsZShzZWxlY3RvciwgcnVsZXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0eXBlb2Ygc2hlZXQuaW5zZXJ0UnVsZSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICBzaGVldC5pbnNlcnRSdWxlKGAke3NlbGVjdG9yfXske3J1bGVzfX1gKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gICAgc3RhdGljIHRvQm9vbCh2KSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB2ID09PSAnYm9vbGVhbicpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHY7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0eXBlb2YgdiA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgdiA9IHYudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICAgICAgcmV0dXJuICEodiA9PT0gJycgfHwgdiA9PT0gJ25vJyB8fCB2ID09PSAnZmFsc2UnIHx8IHYgPT09ICcwJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBCb29sZWFuKHYpO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIHRvTnVtYmVyKHZhbHVlKSB7XHJcbiAgICAgICAgcmV0dXJuICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZS5sZW5ndGggPT09IDApID8gdW5kZWZpbmVkIDogTnVtYmVyKHZhbHVlKTtcclxuICAgIH1cclxuICAgIHN0YXRpYyBwYXJzZUhlaWdodCh2YWwpIHtcclxuICAgICAgICBsZXQgaDtcclxuICAgICAgICBsZXQgdW5pdCA9ICdweCc7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIGxldCBtYXRjaCA9IHZhbC5tYXRjaCgvXigtWzAtOV0rXFwuWzAtOV0rfFswLTldKlxcLlswLTldK3wtWzAtOV0rfFswLTldKykocHh8ZW18cmVtfHZofHZ3fCUpPyQvKTtcclxuICAgICAgICAgICAgaWYgKCFtYXRjaCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGhlaWdodCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHVuaXQgPSBtYXRjaFsyXSB8fCAncHgnO1xyXG4gICAgICAgICAgICBoID0gcGFyc2VGbG9hdChtYXRjaFsxXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBoID0gdmFsO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyBoLCB1bml0IH07XHJcbiAgICB9XHJcbiAgICAvKiogY29waWVzIHVuc2V0IGZpZWxkcyBpbiB0YXJnZXQgdG8gdXNlIHRoZSBnaXZlbiBkZWZhdWx0IHNvdXJjZXMgdmFsdWVzICovXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcclxuICAgIHN0YXRpYyBkZWZhdWx0cyh0YXJnZXQsIC4uLnNvdXJjZXMpIHtcclxuICAgICAgICBzb3VyY2VzLmZvckVhY2goc291cmNlID0+IHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gc291cmNlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXNvdXJjZS5oYXNPd25Qcm9wZXJ0eShrZXkpKVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIGlmICh0YXJnZXRba2V5XSA9PT0gbnVsbCB8fCB0YXJnZXRba2V5XSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBzb3VyY2Vba2V5XSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHRhcmdldFtrZXldID09PSAnb2JqZWN0Jykge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHByb3BlcnR5IGlzIGFuIG9iamVjdCwgcmVjdXJzaXZlbHkgYWRkIGl0J3MgZmllbGQgb3Zlci4uLiAjMTM3M1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdHModGFyZ2V0W2tleV0sIHNvdXJjZVtrZXldKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiB0YXJnZXQ7XHJcbiAgICB9XHJcbiAgICAvKiogZ2l2ZW4gMiBvYmplY3RzIHJldHVybiB0cnVlIGlmIHRoZXkgaGF2ZSB0aGUgc2FtZSB2YWx1ZXMuIENoZWNrcyBmb3IgT2JqZWN0IHt9IGhhdmluZyBzYW1lIGZpZWxkcyBhbmQgdmFsdWVzIChqdXN0IDEgbGV2ZWwgZG93bikgKi9cclxuICAgIHN0YXRpYyBzYW1lKGEsIGIpIHtcclxuICAgICAgICBpZiAodHlwZW9mIGEgIT09ICdvYmplY3QnKVxyXG4gICAgICAgICAgICByZXR1cm4gYSA9PSBiO1xyXG4gICAgICAgIGlmICh0eXBlb2YgYSAhPT0gdHlwZW9mIGIpXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAvLyBlbHNlIHdlIGhhdmUgb2JqZWN0LCBjaGVjayBqdXN0IDEgbGV2ZWwgZGVlcCBmb3IgYmVpbmcgc2FtZSB0aGluZ3MuLi5cclxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoYSkubGVuZ3RoICE9PSBPYmplY3Qua2V5cyhiKS5sZW5ndGgpXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBhKSB7XHJcbiAgICAgICAgICAgIGlmIChhW2tleV0gIT09IGJba2V5XSlcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICAvKiogY29waWVzIG92ZXIgYiBzaXplICYgcG9zaXRpb24gKEdyaWRTdGFja1Bvc2l0aW9uKSwgYW5kIG9wdGlvbmFsbHkgbWluL21heCBhcyB3ZWxsICovXHJcbiAgICBzdGF0aWMgY29weVBvcyhhLCBiLCBkb01pbk1heCA9IGZhbHNlKSB7XHJcbiAgICAgICAgYS54ID0gYi54O1xyXG4gICAgICAgIGEueSA9IGIueTtcclxuICAgICAgICBhLncgPSBiLnc7XHJcbiAgICAgICAgYS5oID0gYi5oO1xyXG4gICAgICAgIGlmIChkb01pbk1heCkge1xyXG4gICAgICAgICAgICBpZiAoYi5taW5XKVxyXG4gICAgICAgICAgICAgICAgYS5taW5XID0gYi5taW5XO1xyXG4gICAgICAgICAgICBpZiAoYi5taW5IKVxyXG4gICAgICAgICAgICAgICAgYS5taW5IID0gYi5taW5IO1xyXG4gICAgICAgICAgICBpZiAoYi5tYXhXKVxyXG4gICAgICAgICAgICAgICAgYS5tYXhXID0gYi5tYXhXO1xyXG4gICAgICAgICAgICBpZiAoYi5tYXhIKVxyXG4gICAgICAgICAgICAgICAgYS5tYXhIID0gYi5tYXhIO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYTtcclxuICAgIH1cclxuICAgIC8qKiB0cnVlIGlmIGEgYW5kIGIgaGFzIHNhbWUgc2l6ZSAmIHBvc2l0aW9uICovXHJcbiAgICBzdGF0aWMgc2FtZVBvcyhhLCBiKSB7XHJcbiAgICAgICAgcmV0dXJuIGEgJiYgYiAmJiBhLnggPT09IGIueCAmJiBhLnkgPT09IGIueSAmJiBhLncgPT09IGIudyAmJiBhLmggPT09IGIuaDtcclxuICAgIH1cclxuICAgIC8qKiByZW1vdmVzIGZpZWxkIGZyb20gdGhlIGZpcnN0IG9iamVjdCBpZiBzYW1lIGFzIHRoZSBzZWNvbmQgb2JqZWN0cyAobGlrZSBkaWZmaW5nKSBhbmQgaW50ZXJuYWwgJ18nIGZvciBzYXZpbmcgKi9cclxuICAgIHN0YXRpYyByZW1vdmVJbnRlcm5hbEFuZFNhbWUoYSwgYikge1xyXG4gICAgICAgIGlmICh0eXBlb2YgYSAhPT0gJ29iamVjdCcgfHwgdHlwZW9mIGIgIT09ICdvYmplY3QnKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgZm9yIChsZXQga2V5IGluIGEpIHtcclxuICAgICAgICAgICAgbGV0IHZhbCA9IGFba2V5XTtcclxuICAgICAgICAgICAgaWYgKGtleVswXSA9PT0gJ18nIHx8IHZhbCA9PT0gYltrZXldKSB7XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgYVtrZXldO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHZhbCAmJiB0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJiBiW2tleV0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSBpbiB2YWwpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsW2ldID09PSBiW2tleV1baV0gfHwgaVswXSA9PT0gJ18nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB2YWxbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKCFPYmplY3Qua2V5cyh2YWwpLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBhW2tleV07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKiogcmVtb3ZlcyBpbnRlcm5hbCBmaWVsZHMgJ18nIGFuZCBkZWZhdWx0IHZhbHVlcyBmb3Igc2F2aW5nICovXHJcbiAgICBzdGF0aWMgcmVtb3ZlSW50ZXJuYWxGb3JTYXZlKG4sIHJlbW92ZUVsID0gdHJ1ZSkge1xyXG4gICAgICAgIGZvciAobGV0IGtleSBpbiBuKSB7XHJcbiAgICAgICAgICAgIGlmIChrZXlbMF0gPT09ICdfJyB8fCBuW2tleV0gPT09IG51bGwgfHwgbltrZXldID09PSB1bmRlZmluZWQpXHJcbiAgICAgICAgICAgICAgICBkZWxldGUgbltrZXldO1xyXG4gICAgICAgIH1cclxuICAgICAgICBkZWxldGUgbi5ncmlkO1xyXG4gICAgICAgIGlmIChyZW1vdmVFbClcclxuICAgICAgICAgICAgZGVsZXRlIG4uZWw7XHJcbiAgICAgICAgLy8gZGVsZXRlIGRlZmF1bHQgdmFsdWVzICh3aWxsIGJlIHJlLWNyZWF0ZWQgb24gcmVhZClcclxuICAgICAgICBpZiAoIW4uYXV0b1Bvc2l0aW9uKVxyXG4gICAgICAgICAgICBkZWxldGUgbi5hdXRvUG9zaXRpb247XHJcbiAgICAgICAgaWYgKCFuLm5vUmVzaXplKVxyXG4gICAgICAgICAgICBkZWxldGUgbi5ub1Jlc2l6ZTtcclxuICAgICAgICBpZiAoIW4ubm9Nb3ZlKVxyXG4gICAgICAgICAgICBkZWxldGUgbi5ub01vdmU7XHJcbiAgICAgICAgaWYgKCFuLmxvY2tlZClcclxuICAgICAgICAgICAgZGVsZXRlIG4ubG9ja2VkO1xyXG4gICAgICAgIGlmIChuLncgPT09IDEgfHwgbi53ID09PSBuLm1pblcpXHJcbiAgICAgICAgICAgIGRlbGV0ZSBuLnc7XHJcbiAgICAgICAgaWYgKG4uaCA9PT0gMSB8fCBuLmggPT09IG4ubWluSClcclxuICAgICAgICAgICAgZGVsZXRlIG4uaDtcclxuICAgIH1cclxuICAgIC8qKiByZXR1cm4gdGhlIGNsb3Nlc3QgcGFyZW50IChvciBpdHNlbGYpIG1hdGNoaW5nIHRoZSBnaXZlbiBjbGFzcyAqL1xyXG4gICAgc3RhdGljIGNsb3Nlc3RVcEJ5Q2xhc3MoZWwsIG5hbWUpIHtcclxuICAgICAgICB3aGlsZSAoZWwpIHtcclxuICAgICAgICAgICAgaWYgKGVsLmNsYXNzTGlzdC5jb250YWlucyhuYW1lKSlcclxuICAgICAgICAgICAgICAgIHJldHVybiBlbDtcclxuICAgICAgICAgICAgZWwgPSBlbC5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIC8qKiBkZWxheSBjYWxsaW5nIHRoZSBnaXZlbiBmdW5jdGlvbiBmb3IgZ2l2ZW4gZGVsYXksIHByZXZlbnRpbmcgbmV3IGNhbGxzIGZyb20gaGFwcGVuaW5nIHdoaWxlIHdhaXRpbmcgKi9cclxuICAgIHN0YXRpYyB0aHJvdHRsZShmdW5jLCBkZWxheSkge1xyXG4gICAgICAgIGxldCBpc1dhaXRpbmcgPSBmYWxzZTtcclxuICAgICAgICByZXR1cm4gKC4uLmFyZ3MpID0+IHtcclxuICAgICAgICAgICAgaWYgKCFpc1dhaXRpbmcpIHtcclxuICAgICAgICAgICAgICAgIGlzV2FpdGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgZnVuYyguLi5hcmdzKTsgaXNXYWl0aW5nID0gZmFsc2U7IH0sIGRlbGF5KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgcmVtb3ZlUG9zaXRpb25pbmdTdHlsZXMoZWwpIHtcclxuICAgICAgICBsZXQgc3R5bGUgPSBlbC5zdHlsZTtcclxuICAgICAgICBpZiAoc3R5bGUucG9zaXRpb24pIHtcclxuICAgICAgICAgICAgc3R5bGUucmVtb3ZlUHJvcGVydHkoJ3Bvc2l0aW9uJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChzdHlsZS5sZWZ0KSB7XHJcbiAgICAgICAgICAgIHN0eWxlLnJlbW92ZVByb3BlcnR5KCdsZWZ0Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChzdHlsZS50b3ApIHtcclxuICAgICAgICAgICAgc3R5bGUucmVtb3ZlUHJvcGVydHkoJ3RvcCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoc3R5bGUud2lkdGgpIHtcclxuICAgICAgICAgICAgc3R5bGUucmVtb3ZlUHJvcGVydHkoJ3dpZHRoJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChzdHlsZS5oZWlnaHQpIHtcclxuICAgICAgICAgICAgc3R5bGUucmVtb3ZlUHJvcGVydHkoJ2hlaWdodCcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKiBAaW50ZXJuYWwgcmV0dXJucyB0aGUgcGFzc2VkIGVsZW1lbnQgaWYgc2Nyb2xsYWJsZSwgZWxzZSB0aGUgY2xvc2VzdCBwYXJlbnQgdGhhdCB3aWxsLCB1cCB0byB0aGUgZW50aXJlIGRvY3VtZW50IHNjcm9sbGluZyBlbGVtZW50ICovXHJcbiAgICBzdGF0aWMgZ2V0U2Nyb2xsRWxlbWVudChlbCkge1xyXG4gICAgICAgIGlmICghZWwpXHJcbiAgICAgICAgICAgIHJldHVybiBkb2N1bWVudC5zY3JvbGxpbmdFbGVtZW50IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsgLy8gSUUgc3VwcG9ydFxyXG4gICAgICAgIGNvbnN0IHN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShlbCk7XHJcbiAgICAgICAgY29uc3Qgb3ZlcmZsb3dSZWdleCA9IC8oYXV0b3xzY3JvbGwpLztcclxuICAgICAgICBpZiAob3ZlcmZsb3dSZWdleC50ZXN0KHN0eWxlLm92ZXJmbG93ICsgc3R5bGUub3ZlcmZsb3dZKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZWw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRTY3JvbGxFbGVtZW50KGVsLnBhcmVudEVsZW1lbnQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHN0YXRpYyB1cGRhdGVTY3JvbGxQb3NpdGlvbihlbCwgcG9zaXRpb24sIGRpc3RhbmNlKSB7XHJcbiAgICAgICAgLy8gaXMgd2lkZ2V0IGluIHZpZXc/XHJcbiAgICAgICAgbGV0IHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICBsZXQgaW5uZXJIZWlnaHRPckNsaWVudEhlaWdodCA9ICh3aW5kb3cuaW5uZXJIZWlnaHQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCk7XHJcbiAgICAgICAgaWYgKHJlY3QudG9wIDwgMCB8fFxyXG4gICAgICAgICAgICByZWN0LmJvdHRvbSA+IGlubmVySGVpZ2h0T3JDbGllbnRIZWlnaHQpIHtcclxuICAgICAgICAgICAgLy8gc2V0IHNjcm9sbFRvcCBvZiBmaXJzdCBwYXJlbnQgdGhhdCBzY3JvbGxzXHJcbiAgICAgICAgICAgIC8vIGlmIHBhcmVudCBpcyBsYXJnZXIgdGhhbiBlbCwgc2V0IGFzIGxvdyBhcyBwb3NzaWJsZVxyXG4gICAgICAgICAgICAvLyB0byBnZXQgZW50aXJlIHdpZGdldCBvbiBzY3JlZW5cclxuICAgICAgICAgICAgbGV0IG9mZnNldERpZmZEb3duID0gcmVjdC5ib3R0b20gLSBpbm5lckhlaWdodE9yQ2xpZW50SGVpZ2h0O1xyXG4gICAgICAgICAgICBsZXQgb2Zmc2V0RGlmZlVwID0gcmVjdC50b3A7XHJcbiAgICAgICAgICAgIGxldCBzY3JvbGxFbCA9IHRoaXMuZ2V0U2Nyb2xsRWxlbWVudChlbCk7XHJcbiAgICAgICAgICAgIGlmIChzY3JvbGxFbCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgbGV0IHByZXZTY3JvbGwgPSBzY3JvbGxFbC5zY3JvbGxUb3A7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVjdC50b3AgPCAwICYmIGRpc3RhbmNlIDwgMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIG1vdmluZyB1cFxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlbC5vZmZzZXRIZWlnaHQgPiBpbm5lckhlaWdodE9yQ2xpZW50SGVpZ2h0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbEVsLnNjcm9sbFRvcCArPSBkaXN0YW5jZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbEVsLnNjcm9sbFRvcCArPSBNYXRoLmFicyhvZmZzZXREaWZmVXApID4gTWF0aC5hYnMoZGlzdGFuY2UpID8gZGlzdGFuY2UgOiBvZmZzZXREaWZmVXA7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZGlzdGFuY2UgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gbW92aW5nIGRvd25cclxuICAgICAgICAgICAgICAgICAgICBpZiAoZWwub2Zmc2V0SGVpZ2h0ID4gaW5uZXJIZWlnaHRPckNsaWVudEhlaWdodCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxFbC5zY3JvbGxUb3AgKz0gZGlzdGFuY2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxFbC5zY3JvbGxUb3AgKz0gb2Zmc2V0RGlmZkRvd24gPiBkaXN0YW5jZSA/IGRpc3RhbmNlIDogb2Zmc2V0RGlmZkRvd247XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8gbW92ZSB3aWRnZXQgeSBieSBhbW91bnQgc2Nyb2xsZWRcclxuICAgICAgICAgICAgICAgIHBvc2l0aW9uLnRvcCArPSBzY3JvbGxFbC5zY3JvbGxUb3AgLSBwcmV2U2Nyb2xsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBAaW50ZXJuYWwgRnVuY3Rpb24gdXNlZCB0byBzY3JvbGwgdGhlIHBhZ2UuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGV2ZW50IGBNb3VzZUV2ZW50YCB0aGF0IHRyaWdnZXJzIHRoZSByZXNpemVcclxuICAgICAqIEBwYXJhbSBlbCBgSFRNTEVsZW1lbnRgIHRoYXQncyBiZWluZyByZXNpemVkXHJcbiAgICAgKiBAcGFyYW0gZGlzdGFuY2UgRGlzdGFuY2UgZnJvbSB0aGUgViBlZGdlcyB0byBzdGFydCBzY3JvbGxpbmdcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHVwZGF0ZVNjcm9sbFJlc2l6ZShldmVudCwgZWwsIGRpc3RhbmNlKSB7XHJcbiAgICAgICAgY29uc3Qgc2Nyb2xsRWwgPSB0aGlzLmdldFNjcm9sbEVsZW1lbnQoZWwpO1xyXG4gICAgICAgIGNvbnN0IGhlaWdodCA9IHNjcm9sbEVsLmNsaWVudEhlaWdodDtcclxuICAgICAgICAvLyAjMTcyNyBldmVudC5jbGllbnRZIGlzIHJlbGF0aXZlIHRvIHZpZXdwb3J0LCBzbyBtdXN0IGNvbXBhcmUgdGhpcyBhZ2FpbnN0IHBvc2l0aW9uIG9mIHNjcm9sbEVsIGdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcFxyXG4gICAgICAgIC8vICMxNzQ1IFNwZWNpYWwgc2l0dWF0aW9uIGlmIHNjcm9sbEVsIGlzIGRvY3VtZW50ICdodG1sJzogaGVyZSBicm93c2VyIHNwZWMgc3RhdGVzIHRoYXRcclxuICAgICAgICAvLyBjbGllbnRIZWlnaHQgaXMgaGVpZ2h0IG9mIHZpZXdwb3J0LCBidXQgZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkgaXMgcmVjdGFuZ2xlIG9mIGh0bWwgZWxlbWVudDtcclxuICAgICAgICAvLyB0aGlzIGRpc2NyZXBhbmN5IGFyaXNlcyBiZWNhdXNlIGluIHJlYWxpdHkgc2Nyb2xsYmFyIGlzIGF0dGFjaGVkIHRvIHZpZXdwb3J0LCBub3QgaHRtbCBlbGVtZW50IGl0c2VsZi5cclxuICAgICAgICBjb25zdCBvZmZzZXRUb3AgPSAoc2Nyb2xsRWwgPT09IHRoaXMuZ2V0U2Nyb2xsRWxlbWVudCgpKSA/IDAgOiBzY3JvbGxFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3A7XHJcbiAgICAgICAgY29uc3QgcG9pbnRlclBvc1kgPSBldmVudC5jbGllbnRZIC0gb2Zmc2V0VG9wO1xyXG4gICAgICAgIGNvbnN0IHRvcCA9IHBvaW50ZXJQb3NZIDwgZGlzdGFuY2U7XHJcbiAgICAgICAgY29uc3QgYm90dG9tID0gcG9pbnRlclBvc1kgPiBoZWlnaHQgLSBkaXN0YW5jZTtcclxuICAgICAgICBpZiAodG9wKSB7XHJcbiAgICAgICAgICAgIC8vIFRoaXMgYWxzbyBjYW4gYmUgZG9uZSB3aXRoIGEgdGltZW91dCB0byBrZWVwIHNjcm9sbGluZyB3aGlsZSB0aGUgbW91c2UgaXNcclxuICAgICAgICAgICAgLy8gaW4gdGhlIHNjcm9sbGluZyB6b25lLiAod2lsbCBoYXZlIHNtb290aGVyIGJlaGF2aW9yKVxyXG4gICAgICAgICAgICBzY3JvbGxFbC5zY3JvbGxCeSh7IGJlaGF2aW9yOiAnc21vb3RoJywgdG9wOiBwb2ludGVyUG9zWSAtIGRpc3RhbmNlIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChib3R0b20pIHtcclxuICAgICAgICAgICAgc2Nyb2xsRWwuc2Nyb2xsQnkoeyBiZWhhdmlvcjogJ3Ntb290aCcsIHRvcDogZGlzdGFuY2UgLSAoaGVpZ2h0IC0gcG9pbnRlclBvc1kpIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKiBzaW5nbGUgbGV2ZWwgY2xvbmUsIHJldHVybmluZyBhIG5ldyBvYmplY3Qgd2l0aCBzYW1lIHRvcCBmaWVsZHMuIFRoaXMgd2lsbCBzaGFyZSBzdWIgb2JqZWN0cyBhbmQgYXJyYXlzICovXHJcbiAgICBzdGF0aWMgY2xvbmUob2JqKSB7XHJcbiAgICAgICAgaWYgKG9iaiA9PT0gbnVsbCB8fCBvYmogPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgKG9iaikgIT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBvYmo7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBvYmopO1xyXG4gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBBcnJheSkge1xyXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gICAgICAgICAgICByZXR1cm4gWy4uLm9ial07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBvYmopO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWN1cnNpdmUgY2xvbmUgdmVyc2lvbiB0aGF0IHJldHVybnMgYSBmdWxsIGNvcHksIGNoZWNraW5nIGZvciBuZXN0ZWQgb2JqZWN0cyBhbmQgYXJyYXlzIE9OTFkuXHJcbiAgICAgKiBOb3RlOiB0aGlzIHdpbGwgdXNlIGFzLWlzIGFueSBrZXkgc3RhcnRpbmcgd2l0aCBkb3VibGUgX18gKGFuZCBub3QgY29weSBpbnNpZGUpIHNvbWUgbGliIGhhdmUgY2lyY3VsYXIgZGVwZW5kZW5jaWVzLlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgY2xvbmVEZWVwKG9iaikge1xyXG4gICAgICAgIC8vIGxpc3Qgb2YgZmllbGRzIHdlIHdpbGwgc2tpcCBkdXJpbmcgY2xvbmVEZWVwIChuZXN0ZWQgb2JqZWN0cywgb3RoZXIgaW50ZXJuYWwpXHJcbiAgICAgICAgY29uc3Qgc2tpcEZpZWxkcyA9IFsncGFyZW50R3JpZCcsICdlbCcsICdncmlkJywgJ3N1YkdyaWQnLCAnZW5naW5lJ107XHJcbiAgICAgICAgLy8gcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkob2JqKSk7IC8vIGRvZXNuJ3Qgd29yayB3aXRoIGRhdGUgZm9ybWF0ID9cclxuICAgICAgICBjb25zdCByZXQgPSBVdGlscy5jbG9uZShvYmopO1xyXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHJldCkge1xyXG4gICAgICAgICAgICAvLyBOT1RFOiB3ZSBkb24ndCBzdXBwb3J0IGZ1bmN0aW9uL2NpcmN1bGFyIGRlcGVuZGVuY2llcyBzbyBza2lwIHRob3NlIHByb3BlcnRpZXMgZm9yIG5vdy4uLlxyXG4gICAgICAgICAgICBpZiAocmV0Lmhhc093blByb3BlcnR5KGtleSkgJiYgdHlwZW9mIChyZXRba2V5XSkgPT09ICdvYmplY3QnICYmIGtleS5zdWJzdHJpbmcoMCwgMikgIT09ICdfXycgJiYgIXNraXBGaWVsZHMuZmluZChrID0+IGsgPT09IGtleSkpIHtcclxuICAgICAgICAgICAgICAgIHJldFtrZXldID0gVXRpbHMuY2xvbmVEZWVwKG9ialtrZXldKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmV0O1xyXG4gICAgfVxyXG4gICAgLyoqIGRlZXAgY2xvbmUgdGhlIGdpdmVuIEhUTUwgbm9kZSwgcmVtb3ZpbmcgdGVoIHVuaXF1ZSBpZCBmaWVsZCAqL1xyXG4gICAgc3RhdGljIGNsb25lTm9kZShlbCkge1xyXG4gICAgICAgIGNvbnN0IG5vZGUgPSBlbC5jbG9uZU5vZGUodHJ1ZSk7XHJcbiAgICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoJ2lkJyk7XHJcbiAgICAgICAgcmV0dXJuIG5vZGU7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgYXBwZW5kVG8oZWwsIHBhcmVudCkge1xyXG4gICAgICAgIGxldCBwYXJlbnROb2RlO1xyXG4gICAgICAgIGlmICh0eXBlb2YgcGFyZW50ID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBwYXJlbnROb2RlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihwYXJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcGFyZW50Tm9kZSA9IHBhcmVudDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHBhcmVudE5vZGUpIHtcclxuICAgICAgICAgICAgcGFyZW50Tm9kZS5hcHBlbmRDaGlsZChlbCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gcHVibGljIHN0YXRpYyBzZXRQb3NpdGlvblJlbGF0aXZlKGVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xyXG4gICAgLy8gICBpZiAoISgvXig/OnJ8YXxmKS8pLnRlc3Qod2luZG93LmdldENvbXB1dGVkU3R5bGUoZWwpLnBvc2l0aW9uKSkge1xyXG4gICAgLy8gICAgIGVsLnN0eWxlLnBvc2l0aW9uID0gXCJyZWxhdGl2ZVwiO1xyXG4gICAgLy8gICB9XHJcbiAgICAvLyB9XHJcbiAgICBzdGF0aWMgYWRkRWxTdHlsZXMoZWwsIHN0eWxlcykge1xyXG4gICAgICAgIGlmIChzdHlsZXMgaW5zdGFuY2VvZiBPYmplY3QpIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBzIGluIHN0eWxlcykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHN0eWxlcy5oYXNPd25Qcm9wZXJ0eShzKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHN0eWxlc1tzXSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VwcG9ydCBmYWxsYmFjayB2YWx1ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZXNbc10uZm9yRWFjaCh2YWwgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWwuc3R5bGVbc10gPSB2YWw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWwuc3R5bGVbc10gPSBzdHlsZXNbc107XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgc3RhdGljIGluaXRFdmVudChlLCBpbmZvKSB7XHJcbiAgICAgICAgY29uc3QgZXZ0ID0geyB0eXBlOiBpbmZvLnR5cGUgfTtcclxuICAgICAgICBjb25zdCBvYmogPSB7XHJcbiAgICAgICAgICAgIGJ1dHRvbjogMCxcclxuICAgICAgICAgICAgd2hpY2g6IDAsXHJcbiAgICAgICAgICAgIGJ1dHRvbnM6IDEsXHJcbiAgICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXHJcbiAgICAgICAgICAgIGNhbmNlbGFibGU6IHRydWUsXHJcbiAgICAgICAgICAgIHRhcmdldDogaW5mby50YXJnZXQgPyBpbmZvLnRhcmdldCA6IGUudGFyZ2V0XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvLyBkb24ndCBjaGVjayBmb3IgYGluc3RhbmNlb2YgRHJhZ0V2ZW50YCBhcyBTYWZhcmkgdXNlIE1vdXNlRXZlbnQgIzE1NDBcclxuICAgICAgICBpZiAoZS5kYXRhVHJhbnNmZXIpIHtcclxuICAgICAgICAgICAgZXZ0WydkYXRhVHJhbnNmZXInXSA9IGUuZGF0YVRyYW5zZmVyOyAvLyB3b3JrYXJvdW5kICdyZWFkb25seScgZmllbGQuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIFsnYWx0S2V5JywgJ2N0cmxLZXknLCAnbWV0YUtleScsICdzaGlmdEtleSddLmZvckVhY2gocCA9PiBldnRbcF0gPSBlW3BdKTsgLy8ga2V5c1xyXG4gICAgICAgIFsncGFnZVgnLCAncGFnZVknLCAnY2xpZW50WCcsICdjbGllbnRZJywgJ3NjcmVlblgnLCAnc2NyZWVuWSddLmZvckVhY2gocCA9PiBldnRbcF0gPSBlW3BdKTsgLy8gcG9pbnQgaW5mb1xyXG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGV2dCksIG9iaik7XHJcbiAgICB9XHJcbiAgICAvKiogY29waWVzIHRoZSBNb3VzZUV2ZW50IHByb3BlcnRpZXMgYW5kIHNlbmRzIGl0IGFzIGFub3RoZXIgZXZlbnQgdG8gdGhlIGdpdmVuIHRhcmdldCAqL1xyXG4gICAgc3RhdGljIHNpbXVsYXRlTW91c2VFdmVudChlLCBzaW11bGF0ZWRUeXBlLCB0YXJnZXQpIHtcclxuICAgICAgICBjb25zdCBzaW11bGF0ZWRFdmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdNb3VzZUV2ZW50cycpO1xyXG4gICAgICAgIHNpbXVsYXRlZEV2ZW50LmluaXRNb3VzZUV2ZW50KHNpbXVsYXRlZFR5cGUsIC8vIHR5cGVcclxuICAgICAgICB0cnVlLCAvLyBidWJibGVzXHJcbiAgICAgICAgdHJ1ZSwgLy8gY2FuY2VsYWJsZVxyXG4gICAgICAgIHdpbmRvdywgLy8gdmlld1xyXG4gICAgICAgIDEsIC8vIGRldGFpbFxyXG4gICAgICAgIGUuc2NyZWVuWCwgLy8gc2NyZWVuWFxyXG4gICAgICAgIGUuc2NyZWVuWSwgLy8gc2NyZWVuWVxyXG4gICAgICAgIGUuY2xpZW50WCwgLy8gY2xpZW50WFxyXG4gICAgICAgIGUuY2xpZW50WSwgLy8gY2xpZW50WVxyXG4gICAgICAgIGUuY3RybEtleSwgLy8gY3RybEtleVxyXG4gICAgICAgIGUuYWx0S2V5LCAvLyBhbHRLZXlcclxuICAgICAgICBlLnNoaWZ0S2V5LCAvLyBzaGlmdEtleVxyXG4gICAgICAgIGUubWV0YUtleSwgLy8gbWV0YUtleVxyXG4gICAgICAgIDAsIC8vIGJ1dHRvblxyXG4gICAgICAgIGUudGFyZ2V0IC8vIHJlbGF0ZWRUYXJnZXRcclxuICAgICAgICApO1xyXG4gICAgICAgICh0YXJnZXQgfHwgZS50YXJnZXQpLmRpc3BhdGNoRXZlbnQoc2ltdWxhdGVkRXZlbnQpO1xyXG4gICAgfVxyXG59XHJcbmV4cG9ydHMuVXRpbHMgPSBVdGlscztcclxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXRpbHMuanMubWFwIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///6480\n")},2204:t=>{"use strict";t.exports="data:image/svg+xml,%3csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%27-4 -4 8 8%27%3e%3ccircle r=%272%27 fill=%27%23fff%27/%3e%3c/svg%3e"},9609:t=>{"use strict";t.exports="data:image/svg+xml,%3csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%27-4 -4 8 8%27%3e%3ccircle r=%273%27 fill=%27%2386b7fe%27/%3e%3c/svg%3e"},2469:t=>{"use strict";t.exports="data:image/svg+xml,%3csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%27-4 -4 8 8%27%3e%3ccircle r=%273%27 fill=%27%23fff%27/%3e%3c/svg%3e"},5296:t=>{"use strict";t.exports="data:image/svg+xml,%3csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%27-4 -4 8 8%27%3e%3ccircle r=%273%27 fill=%27rgba%280,0,0,0.25%29%27/%3e%3c/svg%3e"},6774:t=>{"use strict";t.exports="data:image/svg+xml,%3csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%27-4 -4 8 8%27%3e%3ccircle r=%273%27 fill=%27rgba%28255,255,255,0.25%29%27/%3e%3c/svg%3e"},4144:t=>{"use strict";t.exports="data:image/svg+xml,%3csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 12 12%27 width=%2712%27 height=%2712%27 fill=%27none%27 stroke=%27%23dc3545%27%3e%3ccircle cx=%276%27 cy=%276%27 r=%274.5%27/%3e%3cpath stroke-linejoin=%27round%27 d=%27M5.8 3.6h.4L6 6.5z%27/%3e%3ccircle cx=%276%27 cy=%278.2%27 r=%27.6%27 fill=%27%23dc3545%27 stroke=%27none%27/%3e%3c/svg%3e"},6254:t=>{"use strict";t.exports="data:image/svg+xml,%3csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 16 16%27 fill=%27%23000%27%3e%3cpath d=%27M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z%27/%3e%3c/svg%3e"},5321:t=>{"use strict";t.exports="data:image/svg+xml,%3csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 16 16%27 fill=%27%23052c65%27%3e%3cpath fill-rule=%27evenodd%27 d=%27M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z%27/%3e%3c/svg%3e"},3460:t=>{"use strict";t.exports="data:image/svg+xml,%3csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 16 16%27 fill=%27%23212529%27%3e%3cpath fill-rule=%27evenodd%27 d=%27M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z%27/%3e%3c/svg%3e"},1281:t=>{"use strict";t.exports="data:image/svg+xml,%3csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 16 16%27 fill=%27%236ea8fe%27%3e%3cpath fill-rule=%27evenodd%27 d=%27M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z%27/%3e%3c/svg%3e"},5647:t=>{"use strict";t.exports="data:image/svg+xml,%3csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 16 16%27 fill=%27%23fff%27%3e%3cpath d=%27M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z%27/%3e%3c/svg%3e"},1692:t=>{"use strict";t.exports="data:image/svg+xml,%3csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 16 16%27 fill=%27%23fff%27%3e%3cpath d=%27M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z%27/%3e%3c/svg%3e"},6770:t=>{"use strict";t.exports="data:image/svg+xml,%3csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 16 16%27%3e%3cpath fill=%27none%27 stroke=%27%23343a40%27 stroke-linecap=%27round%27 stroke-linejoin=%27round%27 stroke-width=%272%27 d=%27m2 5 6 6 6-6%27/%3e%3c/svg%3e"},6711:t=>{"use strict";t.exports="data:image/svg+xml,%3csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 16 16%27%3e%3cpath fill=%27none%27 stroke=%27%23dee2e6%27 stroke-linecap=%27round%27 stroke-linejoin=%27round%27 stroke-width=%272%27 d=%27m2 5 6 6 6-6%27/%3e%3c/svg%3e"},8931:t=>{"use strict";t.exports="data:image/svg+xml,%3csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 20 20%27%3e%3cpath fill=%27none%27 stroke=%27%23fff%27 stroke-linecap=%27round%27 stroke-linejoin=%27round%27 stroke-width=%273%27 d=%27M6 10h8%27/%3e%3c/svg%3e"},6199:t=>{"use strict";t.exports="data:image/svg+xml,%3csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 20 20%27%3e%3cpath fill=%27none%27 stroke=%27%23fff%27 stroke-linecap=%27round%27 stroke-linejoin=%27round%27 stroke-width=%273%27 d=%27m6 10 3 3 6-6%27/%3e%3c/svg%3e"},5851:t=>{"use strict";t.exports="data:image/svg+xml,%3csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 30 30%27%3e%3cpath stroke=%27rgba%28255,255,255,0.55%29%27 stroke-linecap=%27round%27 stroke-miterlimit=%2710%27 stroke-width=%272%27 d=%27M4 7h22M4 15h22M4 23h22%27/%3e%3c/svg%3e"},5120:t=>{"use strict";t.exports="data:image/svg+xml,%3csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 30 30%27%3e%3cpath stroke=%27rgba%2833,37,41,0.75%29%27 stroke-linecap=%27round%27 stroke-miterlimit=%2710%27 stroke-width=%272%27 d=%27M4 7h22M4 15h22M4 23h22%27/%3e%3c/svg%3e"},5122:t=>{"use strict";t.exports="data:image/svg+xml,%3csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 8 8%27%3e%3cpath fill=%27%23198754%27 d=%27M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z%27/%3e%3c/svg%3e"},2810:t=>{"use strict";t.exports="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMTYuMC4wLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgLS0+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4PSIwcHgiIHk9IjBweCIgd2lkdGg9IjE2cHgiIGhlaWdodD0iMTZweCIgdmlld0JveD0iMCAwIDUxMS42MjYgNTExLjYyNyIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNTExLjYyNiA1MTEuNjI3OyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxnPgoJPHBhdGggZD0iTTMyOC45MDYsNDAxLjk5NGgtMzYuNTUzVjEwOS42MzZoMzYuNTUzYzQuOTQ4LDAsOS4yMzYtMS44MDksMTIuODQ3LTUuNDI2YzMuNjEzLTMuNjE1LDUuNDIxLTcuODk4LDUuNDIxLTEyLjg0NSAgIGMwLTQuOTQ5LTEuODAxLTkuMjMxLTUuNDI4LTEyLjg1MWwtNzMuMDg3LTczLjA5QzI2NS4wNDQsMS44MDksMjYwLjc2LDAsMjU1LjgxMywwYy00Ljk0OCwwLTkuMjI5LDEuODA5LTEyLjg0Nyw1LjQyNCAgIGwtNzMuMDg4LDczLjA5Yy0zLjYxOCwzLjYxOS01LjQyNCw3LjkwMi01LjQyNCwxMi44NTFjMCw0Ljk0NiwxLjgwNyw5LjIyOSw1LjQyNCwxMi44NDVjMy42MTksMy42MTcsNy45MDEsNS40MjYsMTIuODUsNS40MjYgICBoMzYuNTQ1djI5Mi4zNThoLTM2LjU0MmMtNC45NTIsMC05LjIzNSwxLjgwOC0xMi44NSw1LjQyMWMtMy42MTcsMy42MjEtNS40MjQsNy45MDUtNS40MjQsMTIuODU0ICAgYzAsNC45NDUsMS44MDcsOS4yMjcsNS40MjQsMTIuODQ3bDczLjA4OSw3My4wODhjMy42MTcsMy42MTcsNy44OTgsNS40MjQsMTIuODQ3LDUuNDI0YzQuOTUsMCw5LjIzNC0xLjgwNywxMi44NDktNS40MjQgICBsNzMuMDg3LTczLjA4OGMzLjYxMy0zLjYyLDUuNDIxLTcuOTAxLDUuNDIxLTEyLjg0N2MwLTQuOTQ4LTEuODA4LTkuMjMyLTUuNDIxLTEyLjg1NCAgIEMzMzguMTQyLDQwMy44MDIsMzMzLjg1Nyw0MDEuOTk0LDMyOC45MDYsNDAxLjk5NHoiIGZpbGw9IiM2NjY2NjYiLz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8L3N2Zz4K"}},__webpack_module_cache__={},leafPrototypes,getProto;function __webpack_require__(t){var n=__webpack_module_cache__[t];if(void 0!==n)return n.exports;var g=__webpack_module_cache__[t]={id:t,exports:{}};return __webpack_modules__[t].call(g.exports,g,g.exports,__webpack_require__),g.exports}__webpack_require__.m=__webpack_modules__,__webpack_require__.n=t=>{var n=t&&t.__esModule?()=>t.default:()=>t;return __webpack_require__.d(n,{a:n}),n},getProto=Object.getPrototypeOf?t=>Object.getPrototypeOf(t):t=>t.__proto__,__webpack_require__.t=function(t,n){if(1&n&&(t=this(t)),8&n)return t;if("object"==typeof t&&t){if(4&n&&t.__esModule)return t;if(16&n&&"function"==typeof t.then)return t}var g=Object.create(null);__webpack_require__.r(g);var I={};leafPrototypes=leafPrototypes||[null,getProto({}),getProto([]),getProto(getProto)];for(var e=2&n&&t;"object"==typeof e&&!~leafPrototypes.indexOf(e);e=getProto(e))Object.getOwnPropertyNames(e).forEach((n=>I[n]=()=>t[n]));return I.default=()=>t,__webpack_require__.d(g,I),g},__webpack_require__.d=(t,n)=>{for(var g in n)__webpack_require__.o(n,g)&&!__webpack_require__.o(t,g)&&Object.defineProperty(t,g,{enumerable:!0,get:n[g]})},__webpack_require__.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),__webpack_require__.o=(t,n)=>Object.prototype.hasOwnProperty.call(t,n),__webpack_require__.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},(()=>{var t;__webpack_require__.g.importScripts&&(t=__webpack_require__.g.location+"");var n=__webpack_require__.g.document;if(!t&&n&&(n.currentScript&&(t=n.currentScript.src),!t)){var g=n.getElementsByTagName("script");if(g.length)for(var I=g.length-1;I>-1&&!t;)t=g[I--].src}if(!t)throw new Error("Automatic publicPath is not supported in this browser");t=t.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),__webpack_require__.p=t})(),__webpack_require__.b=document.baseURI||self.location.href,__webpack_require__.nc=void 0;var __webpack_exports__=__webpack_require__(8054)})(); \ No newline at end of file diff --git a/advanced/dist/index.html b/advanced/dist/index.html new file mode 100644 index 0000000000000000000000000000000000000000..098ad1af16ba37325ddffd2c3d605f076f5a344d --- /dev/null +++ b/advanced/dist/index.html @@ -0,0 +1 @@ +<!doctype html><html dir="ltr" lang="en"><head><meta charset="utf-8"/><meta http-equiv="x-ua-compatible" content="ie=edge"/><meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no"/><title>Polaris Dashboard</title><script defer="defer" src="/bundle.js"></script></head><body></body></html> \ No newline at end of file diff --git a/advanced/package-lock.json b/advanced/package-lock.json new file mode 100644 index 0000000000000000000000000000000000000000..aa81bef4e8bf03fabf245f0380583d3c58352564 --- /dev/null +++ b/advanced/package-lock.json @@ -0,0 +1,14016 @@ +{ + "name": "dashboard-advanced", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "dashboard-advanced", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "@babel/plugin-proposal-object-rest-spread": "^7.20.7", + "@fortawesome/fontawesome-svg-core": "^6.5.1", + "@fortawesome/free-solid-svg-icons": "^6.5.1", + "@fortawesome/react-fontawesome": "^0.2.0", + "@polaris/dashboard-sdk": "file:../", + "bootstrap": "^5.3.2", + "react": "^18.2.0", + "react-bootstrap": "^2.9.1", + "react-dom": "^18.2.0", + "react-grid-layout": "^1.4.4", + "react-router-dom": "^6.20.1", + "react-syntax-highlighter": "^15.5.0", + "typewriter-effect": "^2.21.0" + }, + "devDependencies": { + "@babel/core": "^7.22.15", + "@babel/preset-env": "^7.22.15", + "@babel/preset-react": "^7.23.3", + "babel-loader": "^9.1.3", + "css-loader": "^6.8.1", + "html-webpack-plugin": "^5.5.3", + "mini-css-extract-plugin": "^2.7.6", + "node-sass": "^9.0.0", + "sass-loader": "^13.3.2", + "style-loader": "^3.3.3", + "webpack": "^5.88.2", + "webpack-cli": "^5.1.4", + "webpack-dev-server": "^4.15.1" + } + }, + "..": { + "name": "@polaris/dashboard-sdk", + "version": "1.0.8", + "license": "ISC", + "dependencies": { + "@babel/plugin-proposal-object-rest-spread": "^7.20.7", + "chart.js": "^4.3.1", + "d3": "^7.7.0", + "d3-scale-chromatic": "^3.0.0", + "uuid": "^9.0.1" + }, + "devDependencies": { + "@babel/core": "^7.20.5", + "@babel/preset-env": "^7.20.2", + "babel-loader": "^9.1.0", + "css-loader": "^6.7.2", + "html-webpack-plugin": "^5.5.0", + "mini-css-extract-plugin": "^2.7.2", + "node-sass": "^9.0.0", + "sass-loader": "^13.2.2", + "style-loader": "^3.3.1", + "webpack": "^5.75.0", + "webpack-cli": "^5.0.1", + "webpack-dev-server": "^4.11.1" + }, + "peerDependencies": { + "gridstack": "^7.1.1" + } + }, + "../node_modules/@ampproject/remapping": { + "version": "2.2.1", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "../node_modules/@babel/code-frame": { + "version": "7.22.13", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" + } + }, + "../node_modules/@babel/compat-data": { + "version": "7.22.9" + }, + "../node_modules/@babel/core": { + "version": "7.22.15", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.22.15", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.22.15", + "@babel/helpers": "^7.22.15", + "@babel/parser": "^7.22.15", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.22.15", + "@babel/types": "^7.22.15", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + } + }, + "../node_modules/@babel/generator": { + "version": "7.22.15", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + } + }, + "../node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + } + }, + "../node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.22.15", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15" + } + }, + "../node_modules/@babel/helper-compilation-targets": { + "version": "7.22.15", + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.15", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + } + }, + "../node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.22.15", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" + } + }, + "../node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.22.15", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" + } + }, + "../node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.4.2", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + } + }, + "../node_modules/@babel/helper-environment-visitor": { + "version": "7.22.5", + "dev": true + }, + "../node_modules/@babel/helper-function-name": { + "version": "7.22.5", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" + } + }, + "../node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + } + }, + "../node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.22.15", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15" + } + }, + "../node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15" + } + }, + "../node_modules/@babel/helper-module-transforms": { + "version": "7.22.15", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.15" + } + }, + "../node_modules/@babel/helper-optimise-call-expression": { + "version": "7.22.5", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + } + }, + "../node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5" + }, + "../node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.22.9", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-wrap-function": "^7.22.9" + } + }, + "../node_modules/@babel/helper-replace-supers": { + "version": "7.22.9", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5" + } + }, + "../node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + } + }, + "../node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + } + }, + "../node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + } + }, + "../node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "dev": true + }, + "../node_modules/@babel/helper-validator-identifier": { + "version": "7.22.15", + "dev": true + }, + "../node_modules/@babel/helper-validator-option": { + "version": "7.22.15" + }, + "../node_modules/@babel/helper-wrap-function": { + "version": "7.22.10", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.10" + } + }, + "../node_modules/@babel/helpers": { + "version": "7.22.15", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.22.15", + "@babel/types": "^7.22.15" + } + }, + "../node_modules/@babel/highlight": { + "version": "7.22.13", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + } + }, + "../node_modules/@babel/parser": { + "version": "7.22.15", + "dev": true + }, + "../node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.22.15", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "../node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.22.15", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.22.15" + } + }, + "../node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.20.7", + "dependencies": { + "@babel/compat-data": "^7.20.5", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.20.7" + } + }, + "../node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "dev": true + }, + "../node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "../node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "../node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "../node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "../node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "../node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.22.5", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "../node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.22.5", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "../node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "../node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "../node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "../node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "../node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "../node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "../node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "../node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "../node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "../node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "../node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "../node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.22.5", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "../node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.22.15", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.9", + "@babel/plugin-syntax-async-generators": "^7.8.4" + } + }, + "../node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.22.5", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.5" + } + }, + "../node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.22.5", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "../node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.22.15", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "../node_modules/@babel/plugin-transform-class-properties": { + "version": "7.22.5", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "../node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.22.11", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.11", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + } + }, + "../node_modules/@babel/plugin-transform-classes": { + "version": "7.22.15", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-split-export-declaration": "^7.22.6", + "globals": "^11.1.0" + } + }, + "../node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.22.5", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.5" + } + }, + "../node_modules/@babel/plugin-transform-destructuring": { + "version": "7.22.15", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "../node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.22.5", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "../node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.22.5", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "../node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.22.11", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + } + }, + "../node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.22.5", + "dev": true, + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "../node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.22.11", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } + }, + "../node_modules/@babel/plugin-transform-for-of": { + "version": "7.22.15", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "../node_modules/@babel/plugin-transform-function-name": { + "version": "7.22.5", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "../node_modules/@babel/plugin-transform-json-strings": { + "version": "7.22.11", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + } + }, + "../node_modules/@babel/plugin-transform-literals": { + "version": "7.22.5", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "../node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.22.11", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } + }, + "../node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.22.5", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "../node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.22.5", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "../node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.22.15", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" + } + }, + "../node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.22.11", + "dev": true, + "dependencies": { + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.22.9", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5" + } + }, + "../node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.22.5", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "../node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.22.5", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "../node_modules/@babel/plugin-transform-new-target": { + "version": "7.22.5", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "../node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.22.11", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + } + }, + "../node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.22.11", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "../node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.22.15", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.22.15" + } + }, + "../node_modules/@babel/plugin-transform-object-super": { + "version": "7.22.5", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5" + } + }, + "../node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.22.11", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + } + }, + "../node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.22.15", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + } + }, + "../node_modules/@babel/plugin-transform-parameters": { + "version": "7.22.15", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "../node_modules/@babel/plugin-transform-private-methods": { + "version": "7.22.5", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "../node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.22.11", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.11", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + } + }, + "../node_modules/@babel/plugin-transform-property-literals": { + "version": "7.22.5", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "../node_modules/@babel/plugin-transform-regenerator": { + "version": "7.22.10", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "regenerator-transform": "^0.15.2" + } + }, + "../node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.22.5", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "../node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.22.5", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "../node_modules/@babel/plugin-transform-spread": { + "version": "7.22.5", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + } + }, + "../node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.22.5", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "../node_modules/@babel/plugin-transform-template-literals": { + "version": "7.22.5", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "../node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.22.5", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "../node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.22.10", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "../node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.22.5", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "../node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.22.5", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "../node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.22.5", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "../node_modules/@babel/preset-env": { + "version": "7.22.15", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.15", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.15", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.22.5", + "@babel/plugin-syntax-import-attributes": "^7.22.5", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.22.5", + "@babel/plugin-transform-async-generator-functions": "^7.22.15", + "@babel/plugin-transform-async-to-generator": "^7.22.5", + "@babel/plugin-transform-block-scoped-functions": "^7.22.5", + "@babel/plugin-transform-block-scoping": "^7.22.15", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-class-static-block": "^7.22.11", + "@babel/plugin-transform-classes": "^7.22.15", + "@babel/plugin-transform-computed-properties": "^7.22.5", + "@babel/plugin-transform-destructuring": "^7.22.15", + "@babel/plugin-transform-dotall-regex": "^7.22.5", + "@babel/plugin-transform-duplicate-keys": "^7.22.5", + "@babel/plugin-transform-dynamic-import": "^7.22.11", + "@babel/plugin-transform-exponentiation-operator": "^7.22.5", + "@babel/plugin-transform-export-namespace-from": "^7.22.11", + "@babel/plugin-transform-for-of": "^7.22.15", + "@babel/plugin-transform-function-name": "^7.22.5", + "@babel/plugin-transform-json-strings": "^7.22.11", + "@babel/plugin-transform-literals": "^7.22.5", + "@babel/plugin-transform-logical-assignment-operators": "^7.22.11", + "@babel/plugin-transform-member-expression-literals": "^7.22.5", + "@babel/plugin-transform-modules-amd": "^7.22.5", + "@babel/plugin-transform-modules-commonjs": "^7.22.15", + "@babel/plugin-transform-modules-systemjs": "^7.22.11", + "@babel/plugin-transform-modules-umd": "^7.22.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.22.5", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.11", + "@babel/plugin-transform-numeric-separator": "^7.22.11", + "@babel/plugin-transform-object-rest-spread": "^7.22.15", + "@babel/plugin-transform-object-super": "^7.22.5", + "@babel/plugin-transform-optional-catch-binding": "^7.22.11", + "@babel/plugin-transform-optional-chaining": "^7.22.15", + "@babel/plugin-transform-parameters": "^7.22.15", + "@babel/plugin-transform-private-methods": "^7.22.5", + "@babel/plugin-transform-private-property-in-object": "^7.22.11", + "@babel/plugin-transform-property-literals": "^7.22.5", + "@babel/plugin-transform-regenerator": "^7.22.10", + "@babel/plugin-transform-reserved-words": "^7.22.5", + "@babel/plugin-transform-shorthand-properties": "^7.22.5", + "@babel/plugin-transform-spread": "^7.22.5", + "@babel/plugin-transform-sticky-regex": "^7.22.5", + "@babel/plugin-transform-template-literals": "^7.22.5", + "@babel/plugin-transform-typeof-symbol": "^7.22.5", + "@babel/plugin-transform-unicode-escapes": "^7.22.10", + "@babel/plugin-transform-unicode-property-regex": "^7.22.5", + "@babel/plugin-transform-unicode-regex": "^7.22.5", + "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "@babel/types": "^7.22.15", + "babel-plugin-polyfill-corejs2": "^0.4.5", + "babel-plugin-polyfill-corejs3": "^0.8.3", + "babel-plugin-polyfill-regenerator": "^0.5.2", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" + } + }, + "../node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "../node_modules/@babel/regjsgen": { + "version": "0.8.0", + "dev": true + }, + "../node_modules/@babel/runtime": { + "version": "7.22.15", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.14.0" + } + }, + "../node_modules/@babel/template": { + "version": "7.22.15", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + } + }, + "../node_modules/@babel/traverse": { + "version": "7.22.15", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.22.15", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "../node_modules/@babel/types": { + "version": "7.22.15", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.15", + "to-fast-properties": "^2.0.0" + } + }, + "../node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "dev": true + }, + "../node_modules/@gar/promisify": { + "version": "1.1.3", + "dev": true + }, + "../node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "../node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "dev": true + }, + "../node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "dev": true + }, + "../node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "../node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "dev": true + }, + "../node_modules/@jridgewell/trace-mapping": { + "version": "0.3.19", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "../node_modules/@kurkle/color": { + "version": "0.3.2" + }, + "../node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.4", + "dev": true + }, + "../node_modules/@npmcli/fs": { + "version": "2.1.2", + "dev": true, + "dependencies": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + } + }, + "../node_modules/@npmcli/fs/node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + } + }, + "../node_modules/@npmcli/fs/node_modules/semver": { + "version": "7.5.4", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + } + }, + "../node_modules/@npmcli/fs/node_modules/yallist": { + "version": "4.0.0", + "dev": true + }, + "../node_modules/@npmcli/move-file": { + "version": "2.0.1", + "dev": true, + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + } + }, + "../node_modules/@tootallnate/once": { + "version": "2.0.0", + "dev": true + }, + "../node_modules/@types/body-parser": { + "version": "1.19.2", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "../node_modules/@types/bonjour": { + "version": "3.5.10", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "../node_modules/@types/connect": { + "version": "3.4.36", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "../node_modules/@types/connect-history-api-fallback": { + "version": "1.5.1", + "dev": true, + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "../node_modules/@types/eslint": { + "version": "8.44.2", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "../node_modules/@types/eslint-scope": { + "version": "3.7.4", + "dev": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "../node_modules/@types/estree": { + "version": "1.0.1", + "dev": true + }, + "../node_modules/@types/express": { + "version": "4.17.17", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "../node_modules/@types/express-serve-static-core": { + "version": "4.17.36", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "../node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "dev": true + }, + "../node_modules/@types/http-errors": { + "version": "2.0.1", + "dev": true + }, + "../node_modules/@types/http-proxy": { + "version": "1.17.11", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "../node_modules/@types/json-schema": { + "version": "7.0.12", + "dev": true + }, + "../node_modules/@types/mime": { + "version": "1.3.2", + "dev": true + }, + "../node_modules/@types/minimist": { + "version": "1.2.2", + "dev": true + }, + "../node_modules/@types/node": { + "version": "20.5.9", + "dev": true + }, + "../node_modules/@types/normalize-package-data": { + "version": "2.4.1", + "dev": true + }, + "../node_modules/@types/qs": { + "version": "6.9.8", + "dev": true + }, + "../node_modules/@types/range-parser": { + "version": "1.2.4", + "dev": true + }, + "../node_modules/@types/retry": { + "version": "0.12.0", + "dev": true + }, + "../node_modules/@types/send": { + "version": "0.17.1", + "dev": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "../node_modules/@types/serve-index": { + "version": "1.9.1", + "dev": true, + "dependencies": { + "@types/express": "*" + } + }, + "../node_modules/@types/serve-static": { + "version": "1.15.2", + "dev": true, + "dependencies": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, + "../node_modules/@types/sockjs": { + "version": "0.3.33", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "../node_modules/@types/ws": { + "version": "8.5.5", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "../node_modules/@webassemblyjs/ast": { + "version": "1.11.6", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "../node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "dev": true + }, + "../node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "dev": true + }, + "../node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.6", + "dev": true + }, + "../node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "dev": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "../node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "dev": true + }, + "../node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.6", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" + } + }, + "../node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "../node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "dev": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "../node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "dev": true + }, + "../node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.6", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" + } + }, + "../node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.6", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "../node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.6", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" + } + }, + "../node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.6", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "../node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.6", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "../node_modules/@webpack-cli/configtest": { + "version": "2.1.1", + "dev": true + }, + "../node_modules/@webpack-cli/info": { + "version": "2.0.2", + "dev": true + }, + "../node_modules/@webpack-cli/serve": { + "version": "2.0.5", + "dev": true + }, + "../node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "dev": true + }, + "../node_modules/@xtuc/long": { + "version": "4.2.2", + "dev": true + }, + "../node_modules/abbrev": { + "version": "1.1.1", + "dev": true + }, + "../node_modules/accepts": { + "version": "1.3.8", + "dev": true, + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, + "../node_modules/acorn": { + "version": "8.10.0", + "dev": true + }, + "../node_modules/acorn-import-assertions": { + "version": "1.9.0", + "dev": true + }, + "../node_modules/agent-base": { + "version": "6.0.2", + "dev": true, + "dependencies": { + "debug": "4" + } + }, + "../node_modules/agentkeepalive": { + "version": "4.5.0", + "dev": true, + "dependencies": { + "humanize-ms": "^1.2.1" + } + }, + "../node_modules/aggregate-error": { + "version": "3.1.0", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "../node_modules/ajv": { + "version": "8.12.0", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "../node_modules/ajv-formats": { + "version": "2.1.1", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + } + }, + "../node_modules/ajv-keywords": { + "version": "5.1.0", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + } + }, + "../node_modules/ansi-html-community": { + "version": "0.0.8", + "dev": true + }, + "../node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true + }, + "../node_modules/ansi-styles": { + "version": "3.2.1", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + } + }, + "../node_modules/anymatch": { + "version": "3.1.3", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "../node_modules/aproba": { + "version": "2.0.0", + "dev": true + }, + "../node_modules/are-we-there-yet": { + "version": "3.0.1", + "dev": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + } + }, + "../node_modules/array-flatten": { + "version": "2.1.2", + "dev": true + }, + "../node_modules/arrify": { + "version": "1.0.1", + "dev": true + }, + "../node_modules/async-foreach": { + "version": "0.1.3", + "dev": true + }, + "../node_modules/babel-loader": { + "version": "9.1.3", + "dev": true, + "dependencies": { + "find-cache-dir": "^4.0.0", + "schema-utils": "^4.0.0" + } + }, + "../node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.5", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.4.2", + "semver": "^6.3.1" + } + }, + "../node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.8.3", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.4.2", + "core-js-compat": "^3.31.0" + } + }, + "../node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.5.2", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.4.2" + } + }, + "../node_modules/balanced-match": { + "version": "1.0.2", + "dev": true + }, + "../node_modules/batch": { + "version": "0.6.1", + "dev": true + }, + "../node_modules/binary-extensions": { + "version": "2.2.0", + "dev": true + }, + "../node_modules/body-parser": { + "version": "1.20.1", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + } + }, + "../node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "dev": true + }, + "../node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "../node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.4.24", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "../node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "dev": true + }, + "../node_modules/bonjour-service": { + "version": "1.1.1", + "dev": true, + "dependencies": { + "array-flatten": "^2.1.2", + "dns-equal": "^1.0.0", + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "../node_modules/boolbase": { + "version": "1.0.0", + "dev": true + }, + "../node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "../node_modules/braces": { + "version": "3.0.2", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + } + }, + "../node_modules/browserslist": { + "version": "4.21.10", + "dependencies": { + "caniuse-lite": "^1.0.30001517", + "electron-to-chromium": "^1.4.477", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.11" + } + }, + "../node_modules/buffer-from": { + "version": "1.1.2", + "dev": true + }, + "../node_modules/bytes": { + "version": "3.0.0", + "dev": true + }, + "../node_modules/cacache": { + "version": "16.1.3", + "dev": true, + "dependencies": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" + } + }, + "../node_modules/cacache/node_modules/brace-expansion": { + "version": "2.0.1", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "../node_modules/cacache/node_modules/glob": { + "version": "8.1.0", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + }, + "../node_modules/cacache/node_modules/lru-cache": { + "version": "7.18.3", + "dev": true + }, + "../node_modules/cacache/node_modules/minimatch": { + "version": "5.1.6", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + } + }, + "../node_modules/call-bind": { + "version": "1.0.2", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "../node_modules/camel-case": { + "version": "4.1.2", + "dev": true, + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "../node_modules/camelcase": { + "version": "5.3.1", + "dev": true + }, + "../node_modules/camelcase-keys": { + "version": "6.2.2", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + } + }, + "../node_modules/caniuse-lite": { + "version": "1.0.30001527" + }, + "../node_modules/chalk": { + "version": "2.4.2", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "../node_modules/chart.js": { + "version": "4.4.0", + "dependencies": { + "@kurkle/color": "^0.3.0" + } + }, + "../node_modules/chokidar": { + "version": "3.5.3", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "../node_modules/chownr": { + "version": "2.0.0", + "dev": true + }, + "../node_modules/chrome-trace-event": { + "version": "1.0.3", + "dev": true + }, + "../node_modules/clean-css": { + "version": "5.3.2", + "dev": true, + "dependencies": { + "source-map": "~0.6.0" + } + }, + "../node_modules/clean-stack": { + "version": "2.2.0", + "dev": true + }, + "../node_modules/cliui": { + "version": "8.0.1", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } + }, + "../node_modules/clone-deep": { + "version": "4.0.1", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, + "../node_modules/color-convert": { + "version": "1.9.3", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "../node_modules/color-name": { + "version": "1.1.3", + "dev": true + }, + "../node_modules/color-support": { + "version": "1.1.3", + "dev": true + }, + "../node_modules/colorette": { + "version": "2.0.20", + "dev": true + }, + "../node_modules/commander": { + "version": "7.2.0" + }, + "../node_modules/common-path-prefix": { + "version": "3.0.0", + "dev": true + }, + "../node_modules/compressible": { + "version": "2.0.18", + "dev": true, + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "../node_modules/compression": { + "version": "1.7.4", + "dev": true, + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + } + }, + "../node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "../node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "dev": true + }, + "../node_modules/compression/node_modules/safe-buffer": { + "version": "5.1.2", + "dev": true + }, + "../node_modules/concat-map": { + "version": "0.0.1", + "dev": true + }, + "../node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "dev": true + }, + "../node_modules/console-control-strings": { + "version": "1.1.0", + "dev": true + }, + "../node_modules/content-disposition": { + "version": "0.5.4", + "dev": true, + "dependencies": { + "safe-buffer": "5.2.1" + } + }, + "../node_modules/content-type": { + "version": "1.0.5", + "dev": true + }, + "../node_modules/convert-source-map": { + "version": "1.9.0", + "dev": true + }, + "../node_modules/cookie": { + "version": "0.5.0", + "dev": true + }, + "../node_modules/cookie-signature": { + "version": "1.0.6", + "dev": true + }, + "../node_modules/core-js-compat": { + "version": "3.32.1", + "dev": true, + "dependencies": { + "browserslist": "^4.21.10" + } + }, + "../node_modules/core-util-is": { + "version": "1.0.3", + "dev": true + }, + "../node_modules/cross-spawn": { + "version": "7.0.3", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "../node_modules/css-loader": { + "version": "6.8.1", + "dev": true, + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.21", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.3", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.3.8" + } + }, + "../node_modules/css-loader/node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + } + }, + "../node_modules/css-loader/node_modules/semver": { + "version": "7.5.4", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + } + }, + "../node_modules/css-loader/node_modules/yallist": { + "version": "4.0.0", + "dev": true + }, + "../node_modules/css-select": { + "version": "4.3.0", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + } + }, + "../node_modules/css-what": { + "version": "6.1.0", + "dev": true + }, + "../node_modules/cssesc": { + "version": "3.0.0", + "dev": true + }, + "../node_modules/d3": { + "version": "7.8.5", + "dependencies": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "4", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + } + }, + "../node_modules/d3-array": { + "version": "3.2.4", + "dependencies": { + "internmap": "1 - 2" + } + }, + "../node_modules/d3-axis": { + "version": "3.0.0" + }, + "../node_modules/d3-brush": { + "version": "3.0.0", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + } + }, + "../node_modules/d3-chord": { + "version": "3.0.1", + "dependencies": { + "d3-path": "1 - 3" + } + }, + "../node_modules/d3-color": { + "version": "3.1.0" + }, + "../node_modules/d3-contour": { + "version": "4.0.2", + "dependencies": { + "d3-array": "^3.2.0" + } + }, + "../node_modules/d3-delaunay": { + "version": "6.0.4", + "dependencies": { + "delaunator": "5" + } + }, + "../node_modules/d3-dispatch": { + "version": "3.0.1" + }, + "../node_modules/d3-drag": { + "version": "3.0.0", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + } + }, + "../node_modules/d3-dsv": { + "version": "3.0.1", + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + } + }, + "../node_modules/d3-ease": { + "version": "3.0.1" + }, + "../node_modules/d3-fetch": { + "version": "3.0.1", + "dependencies": { + "d3-dsv": "1 - 3" + } + }, + "../node_modules/d3-force": { + "version": "3.0.0", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + } + }, + "../node_modules/d3-format": { + "version": "3.1.0" + }, + "../node_modules/d3-geo": { + "version": "3.1.0", + "dependencies": { + "d3-array": "2.5.0 - 3" + } + }, + "../node_modules/d3-hierarchy": { + "version": "3.1.2" + }, + "../node_modules/d3-interpolate": { + "version": "3.0.1", + "dependencies": { + "d3-color": "1 - 3" + } + }, + "../node_modules/d3-path": { + "version": "3.1.0" + }, + "../node_modules/d3-polygon": { + "version": "3.0.1" + }, + "../node_modules/d3-quadtree": { + "version": "3.0.1" + }, + "../node_modules/d3-random": { + "version": "3.0.1" + }, + "../node_modules/d3-scale": { + "version": "4.0.2", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + } + }, + "../node_modules/d3-scale-chromatic": { + "version": "3.0.0", + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + } + }, + "../node_modules/d3-selection": { + "version": "3.0.0" + }, + "../node_modules/d3-shape": { + "version": "3.2.0", + "dependencies": { + "d3-path": "^3.1.0" + } + }, + "../node_modules/d3-time": { + "version": "3.1.0", + "dependencies": { + "d3-array": "2 - 3" + } + }, + "../node_modules/d3-time-format": { + "version": "4.1.0", + "dependencies": { + "d3-time": "1 - 3" + } + }, + "../node_modules/d3-timer": { + "version": "3.0.1" + }, + "../node_modules/d3-transition": { + "version": "3.0.1", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + } + }, + "../node_modules/d3-zoom": { + "version": "3.0.0", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + } + }, + "../node_modules/debug": { + "version": "4.3.4", + "dev": true, + "dependencies": { + "ms": "2.1.2" + } + }, + "../node_modules/decamelize": { + "version": "1.2.0", + "dev": true + }, + "../node_modules/decamelize-keys": { + "version": "1.1.1", + "dev": true, + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + } + }, + "../node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "dev": true + }, + "../node_modules/default-gateway": { + "version": "6.0.3", + "dev": true, + "dependencies": { + "execa": "^5.0.0" + } + }, + "../node_modules/define-lazy-prop": { + "version": "2.0.0", + "dev": true + }, + "../node_modules/delaunator": { + "version": "5.0.0", + "dependencies": { + "robust-predicates": "^3.0.0" + } + }, + "../node_modules/delegates": { + "version": "1.0.0", + "dev": true + }, + "../node_modules/depd": { + "version": "2.0.0", + "dev": true + }, + "../node_modules/destroy": { + "version": "1.2.0", + "dev": true + }, + "../node_modules/detect-node": { + "version": "2.1.0", + "dev": true + }, + "../node_modules/dns-equal": { + "version": "1.0.0", + "dev": true + }, + "../node_modules/dns-packet": { + "version": "5.6.1", + "dev": true, + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + } + }, + "../node_modules/dom-converter": { + "version": "0.2.0", + "dev": true, + "dependencies": { + "utila": "~0.4" + } + }, + "../node_modules/dom-serializer": { + "version": "1.4.1", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "../node_modules/domelementtype": { + "version": "2.3.0", + "dev": true + }, + "../node_modules/domhandler": { + "version": "4.3.1", + "dev": true, + "dependencies": { + "domelementtype": "^2.2.0" + } + }, + "../node_modules/domutils": { + "version": "2.8.0", + "dev": true, + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "../node_modules/dot-case": { + "version": "3.0.4", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "../node_modules/ee-first": { + "version": "1.1.1", + "dev": true + }, + "../node_modules/electron-to-chromium": { + "version": "1.4.508" + }, + "../node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true + }, + "../node_modules/encodeurl": { + "version": "1.0.2", + "dev": true + }, + "../node_modules/encoding": { + "version": "0.1.13", + "dev": true, + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "../node_modules/enhanced-resolve": { + "version": "5.15.0", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + } + }, + "../node_modules/entities": { + "version": "2.2.0", + "dev": true + }, + "../node_modules/env-paths": { + "version": "2.2.1", + "dev": true + }, + "../node_modules/envinfo": { + "version": "7.10.0", + "dev": true + }, + "../node_modules/err-code": { + "version": "2.0.3", + "dev": true + }, + "../node_modules/error-ex": { + "version": "1.3.2", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "../node_modules/es-module-lexer": { + "version": "1.3.0", + "dev": true + }, + "../node_modules/escalade": { + "version": "3.1.1" + }, + "../node_modules/escape-html": { + "version": "1.0.3", + "dev": true + }, + "../node_modules/escape-string-regexp": { + "version": "1.0.5", + "dev": true + }, + "../node_modules/eslint-scope": { + "version": "5.1.1", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "../node_modules/esrecurse": { + "version": "4.3.0", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + } + }, + "../node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "dev": true + }, + "../node_modules/estraverse": { + "version": "4.3.0", + "dev": true + }, + "../node_modules/esutils": { + "version": "2.0.3", + "dev": true + }, + "../node_modules/etag": { + "version": "1.8.1", + "dev": true + }, + "../node_modules/eventemitter3": { + "version": "4.0.7", + "dev": true + }, + "../node_modules/events": { + "version": "3.3.0", + "dev": true + }, + "../node_modules/execa": { + "version": "5.1.1", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "../node_modules/express": { + "version": "4.18.2", + "dev": true, + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + } + }, + "../node_modules/express/node_modules/array-flatten": { + "version": "1.1.1", + "dev": true + }, + "../node_modules/express/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "../node_modules/express/node_modules/ms": { + "version": "2.0.0", + "dev": true + }, + "../node_modules/fast-deep-equal": { + "version": "3.1.3", + "dev": true + }, + "../node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "dev": true + }, + "../node_modules/fastest-levenshtein": { + "version": "1.0.16", + "dev": true + }, + "../node_modules/faye-websocket": { + "version": "0.11.4", + "dev": true, + "dependencies": { + "websocket-driver": ">=0.5.1" + } + }, + "../node_modules/fill-range": { + "version": "7.0.1", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + } + }, + "../node_modules/finalhandler": { + "version": "1.2.0", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + } + }, + "../node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "../node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "dev": true + }, + "../node_modules/find-cache-dir": { + "version": "4.0.0", + "dev": true, + "dependencies": { + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" + } + }, + "../node_modules/find-up": { + "version": "6.3.0", + "dev": true, + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + } + }, + "../node_modules/follow-redirects": { + "version": "1.15.2", + "dev": true + }, + "../node_modules/forwarded": { + "version": "0.2.0", + "dev": true + }, + "../node_modules/fresh": { + "version": "0.5.2", + "dev": true + }, + "../node_modules/fs-minipass": { + "version": "2.1.0", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + } + }, + "../node_modules/fs-monkey": { + "version": "1.0.4", + "dev": true + }, + "../node_modules/fs.realpath": { + "version": "1.0.0", + "dev": true + }, + "../node_modules/function-bind": { + "version": "1.1.1", + "dev": true + }, + "../node_modules/gauge": { + "version": "4.0.4", + "dev": true, + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + } + }, + "../node_modules/gaze": { + "version": "1.1.3", + "dev": true, + "dependencies": { + "globule": "^1.0.0" + } + }, + "../node_modules/gensync": { + "version": "1.0.0-beta.2", + "dev": true + }, + "../node_modules/get-caller-file": { + "version": "2.0.5", + "dev": true + }, + "../node_modules/get-intrinsic": { + "version": "1.2.1", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "../node_modules/get-stdin": { + "version": "4.0.1", + "dev": true + }, + "../node_modules/get-stream": { + "version": "6.0.1", + "dev": true + }, + "../node_modules/glob": { + "version": "7.2.3", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "../node_modules/glob-parent": { + "version": "5.1.2", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + } + }, + "../node_modules/glob-to-regexp": { + "version": "0.4.1", + "dev": true + }, + "../node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + } + }, + "../node_modules/globals": { + "version": "11.12.0", + "dev": true + }, + "../node_modules/globule": { + "version": "1.3.4", + "dev": true, + "dependencies": { + "glob": "~7.1.1", + "lodash": "^4.17.21", + "minimatch": "~3.0.2" + } + }, + "../node_modules/globule/node_modules/glob": { + "version": "7.1.7", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "../node_modules/graceful-fs": { + "version": "4.2.11", + "dev": true + }, + "../node_modules/gridstack": { + "version": "7.3.0", + "peer": true + }, + "../node_modules/handle-thing": { + "version": "2.0.1", + "dev": true + }, + "../node_modules/hard-rejection": { + "version": "2.1.0", + "dev": true + }, + "../node_modules/has": { + "version": "1.0.3", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + } + }, + "../node_modules/has-flag": { + "version": "3.0.0", + "dev": true + }, + "../node_modules/has-proto": { + "version": "1.0.1", + "dev": true + }, + "../node_modules/has-symbols": { + "version": "1.0.3", + "dev": true + }, + "../node_modules/has-unicode": { + "version": "2.0.1", + "dev": true + }, + "../node_modules/he": { + "version": "1.2.0", + "dev": true + }, + "../node_modules/hosted-git-info": { + "version": "4.1.0", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + } + }, + "../node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + } + }, + "../node_modules/hosted-git-info/node_modules/yallist": { + "version": "4.0.0", + "dev": true + }, + "../node_modules/hpack.js": { + "version": "2.1.6", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "../node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "../node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "dev": true + }, + "../node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "../node_modules/html-entities": { + "version": "2.4.0", + "dev": true + }, + "../node_modules/html-minifier-terser": { + "version": "6.1.0", + "dev": true, + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + } + }, + "../node_modules/html-minifier-terser/node_modules/commander": { + "version": "8.3.0", + "dev": true + }, + "../node_modules/html-webpack-plugin": { + "version": "5.5.3", + "dev": true, + "dependencies": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + } + }, + "../node_modules/htmlparser2": { + "version": "6.1.0", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "../node_modules/http-cache-semantics": { + "version": "4.1.1", + "dev": true + }, + "../node_modules/http-deceiver": { + "version": "1.2.7", + "dev": true + }, + "../node_modules/http-errors": { + "version": "2.0.0", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "../node_modules/http-parser-js": { + "version": "0.5.8", + "dev": true + }, + "../node_modules/http-proxy": { + "version": "1.18.1", + "dev": true, + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "../node_modules/http-proxy-agent": { + "version": "5.0.0", + "dev": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + } + }, + "../node_modules/http-proxy-middleware": { + "version": "2.0.6", + "dev": true, + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + } + }, + "../node_modules/http-proxy-middleware/node_modules/is-plain-obj": { + "version": "3.0.0", + "dev": true + }, + "../node_modules/https-proxy-agent": { + "version": "5.0.1", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + } + }, + "../node_modules/human-signals": { + "version": "2.1.0", + "dev": true + }, + "../node_modules/humanize-ms": { + "version": "1.2.1", + "dev": true, + "dependencies": { + "ms": "^2.0.0" + } + }, + "../node_modules/iconv-lite": { + "version": "0.6.3", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "../node_modules/icss-utils": { + "version": "5.1.0", + "dev": true + }, + "../node_modules/import-local": { + "version": "3.1.0", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, + "../node_modules/import-local/node_modules/find-up": { + "version": "4.1.0", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "../node_modules/import-local/node_modules/locate-path": { + "version": "5.0.0", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + } + }, + "../node_modules/import-local/node_modules/p-limit": { + "version": "2.3.0", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + } + }, + "../node_modules/import-local/node_modules/p-locate": { + "version": "4.1.0", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + } + }, + "../node_modules/import-local/node_modules/path-exists": { + "version": "4.0.0", + "dev": true + }, + "../node_modules/import-local/node_modules/pkg-dir": { + "version": "4.2.0", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + } + }, + "../node_modules/imurmurhash": { + "version": "0.1.4", + "dev": true + }, + "../node_modules/indent-string": { + "version": "4.0.0", + "dev": true + }, + "../node_modules/infer-owner": { + "version": "1.0.4", + "dev": true + }, + "../node_modules/inflight": { + "version": "1.0.6", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "../node_modules/inherits": { + "version": "2.0.4", + "dev": true + }, + "../node_modules/internmap": { + "version": "2.0.3" + }, + "../node_modules/interpret": { + "version": "3.1.1", + "dev": true + }, + "../node_modules/ip": { + "version": "2.0.0", + "dev": true + }, + "../node_modules/ipaddr.js": { + "version": "2.1.0", + "dev": true + }, + "../node_modules/is-arrayish": { + "version": "0.2.1", + "dev": true + }, + "../node_modules/is-binary-path": { + "version": "2.1.0", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + } + }, + "../node_modules/is-core-module": { + "version": "2.13.0", + "dev": true, + "dependencies": { + "has": "^1.0.3" + } + }, + "../node_modules/is-docker": { + "version": "2.2.1", + "dev": true + }, + "../node_modules/is-extglob": { + "version": "2.1.1", + "dev": true + }, + "../node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true + }, + "../node_modules/is-glob": { + "version": "4.0.3", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + } + }, + "../node_modules/is-lambda": { + "version": "1.0.1", + "dev": true + }, + "../node_modules/is-number": { + "version": "7.0.0", + "dev": true + }, + "../node_modules/is-plain-obj": { + "version": "1.1.0", + "dev": true + }, + "../node_modules/is-plain-object": { + "version": "2.0.4", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + } + }, + "../node_modules/is-stream": { + "version": "2.0.1", + "dev": true + }, + "../node_modules/is-wsl": { + "version": "2.2.0", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + } + }, + "../node_modules/isarray": { + "version": "1.0.0", + "dev": true + }, + "../node_modules/isexe": { + "version": "2.0.0", + "dev": true + }, + "../node_modules/isobject": { + "version": "3.0.1", + "dev": true + }, + "../node_modules/jest-worker": { + "version": "27.5.1", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + } + }, + "../node_modules/jest-worker/node_modules/has-flag": { + "version": "4.0.0", + "dev": true + }, + "../node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + } + }, + "../node_modules/js-base64": { + "version": "2.6.4", + "dev": true + }, + "../node_modules/js-tokens": { + "version": "4.0.0", + "dev": true + }, + "../node_modules/jsesc": { + "version": "2.5.2", + "dev": true + }, + "../node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "dev": true + }, + "../node_modules/json-schema-traverse": { + "version": "1.0.0", + "dev": true + }, + "../node_modules/json5": { + "version": "2.2.3", + "dev": true + }, + "../node_modules/kind-of": { + "version": "6.0.3", + "dev": true + }, + "../node_modules/launch-editor": { + "version": "2.6.0", + "dev": true, + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.7.3" + } + }, + "../node_modules/lines-and-columns": { + "version": "1.2.4", + "dev": true + }, + "../node_modules/loader-runner": { + "version": "4.3.0", + "dev": true + }, + "../node_modules/locate-path": { + "version": "7.2.0", + "dev": true, + "dependencies": { + "p-locate": "^6.0.0" + } + }, + "../node_modules/lodash": { + "version": "4.17.21", + "dev": true + }, + "../node_modules/lodash.debounce": { + "version": "4.0.8", + "dev": true + }, + "../node_modules/lower-case": { + "version": "2.0.2", + "dev": true, + "dependencies": { + "tslib": "^2.0.3" + } + }, + "../node_modules/lru-cache": { + "version": "5.1.1", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "../node_modules/make-fetch-happen": { + "version": "10.2.1", + "dev": true, + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^9.0.0" + } + }, + "../node_modules/make-fetch-happen/node_modules/lru-cache": { + "version": "7.18.3", + "dev": true + }, + "../node_modules/map-obj": { + "version": "4.3.0", + "dev": true + }, + "../node_modules/media-typer": { + "version": "0.3.0", + "dev": true + }, + "../node_modules/memfs": { + "version": "3.5.3", + "dev": true, + "dependencies": { + "fs-monkey": "^1.0.4" + } + }, + "../node_modules/meow": { + "version": "9.0.0", + "dev": true, + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize": "^1.2.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + } + }, + "../node_modules/merge-descriptors": { + "version": "1.0.1", + "dev": true + }, + "../node_modules/merge-stream": { + "version": "2.0.0", + "dev": true + }, + "../node_modules/methods": { + "version": "1.1.2", + "dev": true + }, + "../node_modules/micromatch": { + "version": "4.0.5", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "../node_modules/mime": { + "version": "1.6.0", + "dev": true + }, + "../node_modules/mime-db": { + "version": "1.52.0", + "dev": true + }, + "../node_modules/mime-types": { + "version": "2.1.35", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + } + }, + "../node_modules/mimic-fn": { + "version": "2.1.0", + "dev": true + }, + "../node_modules/min-indent": { + "version": "1.0.1", + "dev": true + }, + "../node_modules/mini-css-extract-plugin": { + "version": "2.7.6", + "dev": true, + "dependencies": { + "schema-utils": "^4.0.0" + } + }, + "../node_modules/minimalistic-assert": { + "version": "1.0.1", + "dev": true + }, + "../node_modules/minimatch": { + "version": "3.0.8", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + } + }, + "../node_modules/minimist-options": { + "version": "4.1.0", + "dev": true, + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + } + }, + "../node_modules/minipass": { + "version": "3.3.6", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + } + }, + "../node_modules/minipass-collect": { + "version": "1.0.2", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + } + }, + "../node_modules/minipass-fetch": { + "version": "2.1.2", + "dev": true, + "dependencies": { + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "../node_modules/minipass-flush": { + "version": "1.0.5", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + } + }, + "../node_modules/minipass-pipeline": { + "version": "1.2.4", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + } + }, + "../node_modules/minipass-sized": { + "version": "1.0.3", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + } + }, + "../node_modules/minipass/node_modules/yallist": { + "version": "4.0.0", + "dev": true + }, + "../node_modules/minizlib": { + "version": "2.1.2", + "dev": true, + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "../node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "dev": true + }, + "../node_modules/mkdirp": { + "version": "1.0.4", + "dev": true + }, + "../node_modules/ms": { + "version": "2.1.2", + "dev": true + }, + "../node_modules/multicast-dns": { + "version": "7.2.5", + "dev": true, + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + } + }, + "../node_modules/nan": { + "version": "2.17.0", + "dev": true + }, + "../node_modules/nanoid": { + "version": "3.3.6", + "dev": true + }, + "../node_modules/negotiator": { + "version": "0.6.3", + "dev": true + }, + "../node_modules/neo-async": { + "version": "2.6.2", + "dev": true + }, + "../node_modules/no-case": { + "version": "3.0.4", + "dev": true, + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "../node_modules/node-forge": { + "version": "1.3.1", + "dev": true + }, + "../node_modules/node-gyp": { + "version": "8.4.1", + "dev": true, + "dependencies": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^9.1.0", + "nopt": "^5.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + } + }, + "../node_modules/node-gyp/node_modules/@npmcli/fs": { + "version": "1.1.1", + "dev": true, + "dependencies": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + } + }, + "../node_modules/node-gyp/node_modules/@npmcli/move-file": { + "version": "1.1.2", + "dev": true, + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + } + }, + "../node_modules/node-gyp/node_modules/@tootallnate/once": { + "version": "1.1.2", + "dev": true + }, + "../node_modules/node-gyp/node_modules/cacache": { + "version": "15.3.0", + "dev": true, + "dependencies": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + } + }, + "../node_modules/node-gyp/node_modules/http-proxy-agent": { + "version": "4.0.1", + "dev": true, + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + } + }, + "../node_modules/node-gyp/node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + } + }, + "../node_modules/node-gyp/node_modules/make-fetch-happen": { + "version": "9.1.0", + "dev": true, + "dependencies": { + "agentkeepalive": "^4.1.3", + "cacache": "^15.2.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.2", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^6.0.0", + "ssri": "^8.0.0" + } + }, + "../node_modules/node-gyp/node_modules/minipass-fetch": { + "version": "1.4.1", + "dev": true, + "dependencies": { + "minipass": "^3.1.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.12" + } + }, + "../node_modules/node-gyp/node_modules/semver": { + "version": "7.5.4", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + } + }, + "../node_modules/node-gyp/node_modules/socks-proxy-agent": { + "version": "6.2.1", + "dev": true, + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + } + }, + "../node_modules/node-gyp/node_modules/ssri": { + "version": "8.0.1", + "dev": true, + "dependencies": { + "minipass": "^3.1.1" + } + }, + "../node_modules/node-gyp/node_modules/unique-filename": { + "version": "1.1.1", + "dev": true, + "dependencies": { + "unique-slug": "^2.0.0" + } + }, + "../node_modules/node-gyp/node_modules/unique-slug": { + "version": "2.0.2", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, + "../node_modules/node-gyp/node_modules/yallist": { + "version": "4.0.0", + "dev": true + }, + "../node_modules/node-releases": { + "version": "2.0.13" + }, + "../node_modules/node-sass": { + "version": "8.0.0", + "dev": true, + "dependencies": { + "async-foreach": "^0.1.3", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.3", + "gaze": "^1.0.0", + "get-stdin": "^4.0.1", + "glob": "^7.0.3", + "lodash": "^4.17.15", + "make-fetch-happen": "^10.0.4", + "meow": "^9.0.0", + "nan": "^2.17.0", + "node-gyp": "^8.4.1", + "sass-graph": "^4.0.1", + "stdout-stream": "^1.4.0", + "true-case-path": "^2.2.1" + } + }, + "../node_modules/node-sass/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + } + }, + "../node_modules/node-sass/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "../node_modules/node-sass/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + } + }, + "../node_modules/node-sass/node_modules/color-name": { + "version": "1.1.4", + "dev": true + }, + "../node_modules/node-sass/node_modules/has-flag": { + "version": "4.0.0", + "dev": true + }, + "../node_modules/node-sass/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + } + }, + "../node_modules/nopt": { + "version": "5.0.0", + "dev": true, + "dependencies": { + "abbrev": "1" + } + }, + "../node_modules/normalize-package-data": { + "version": "3.0.3", + "dev": true, + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + } + }, + "../node_modules/normalize-package-data/node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + } + }, + "../node_modules/normalize-package-data/node_modules/semver": { + "version": "7.5.4", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + } + }, + "../node_modules/normalize-package-data/node_modules/yallist": { + "version": "4.0.0", + "dev": true + }, + "../node_modules/normalize-path": { + "version": "3.0.0", + "dev": true + }, + "../node_modules/npm-run-path": { + "version": "4.0.1", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + } + }, + "../node_modules/npmlog": { + "version": "6.0.2", + "dev": true, + "dependencies": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + } + }, + "../node_modules/nth-check": { + "version": "2.1.1", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + } + }, + "../node_modules/object-inspect": { + "version": "1.12.3", + "dev": true + }, + "../node_modules/obuf": { + "version": "1.1.2", + "dev": true + }, + "../node_modules/on-finished": { + "version": "2.4.1", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + } + }, + "../node_modules/on-headers": { + "version": "1.0.2", + "dev": true + }, + "../node_modules/once": { + "version": "1.4.0", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "../node_modules/onetime": { + "version": "5.1.2", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + } + }, + "../node_modules/open": { + "version": "8.4.2", + "dev": true, + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + } + }, + "../node_modules/p-limit": { + "version": "4.0.0", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + } + }, + "../node_modules/p-locate": { + "version": "6.0.0", + "dev": true, + "dependencies": { + "p-limit": "^4.0.0" + } + }, + "../node_modules/p-map": { + "version": "4.0.0", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + } + }, + "../node_modules/p-retry": { + "version": "4.6.2", + "dev": true, + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + } + }, + "../node_modules/p-retry/node_modules/retry": { + "version": "0.13.1", + "dev": true + }, + "../node_modules/p-try": { + "version": "2.2.0", + "dev": true + }, + "../node_modules/param-case": { + "version": "3.0.4", + "dev": true, + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "../node_modules/parse-json": { + "version": "5.2.0", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "../node_modules/parseurl": { + "version": "1.3.3", + "dev": true + }, + "../node_modules/pascal-case": { + "version": "3.1.2", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "../node_modules/path-exists": { + "version": "5.0.0", + "dev": true + }, + "../node_modules/path-is-absolute": { + "version": "1.0.1", + "dev": true + }, + "../node_modules/path-key": { + "version": "3.1.1", + "dev": true + }, + "../node_modules/path-parse": { + "version": "1.0.7", + "dev": true + }, + "../node_modules/path-to-regexp": { + "version": "0.1.7", + "dev": true + }, + "../node_modules/picocolors": { + "version": "1.0.0" + }, + "../node_modules/picomatch": { + "version": "2.3.1", + "dev": true + }, + "../node_modules/pkg-dir": { + "version": "7.0.0", + "dev": true, + "dependencies": { + "find-up": "^6.3.0" + } + }, + "../node_modules/postcss": { + "version": "8.4.29", + "dev": true, + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "../node_modules/postcss-modules-extract-imports": { + "version": "3.0.0", + "dev": true + }, + "../node_modules/postcss-modules-local-by-default": { + "version": "4.0.3", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + } + }, + "../node_modules/postcss-modules-scope": { + "version": "3.0.0", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.4" + } + }, + "../node_modules/postcss-modules-values": { + "version": "4.0.0", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0" + } + }, + "../node_modules/postcss-selector-parser": { + "version": "6.0.13", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "../node_modules/postcss-value-parser": { + "version": "4.2.0", + "dev": true + }, + "../node_modules/pretty-error": { + "version": "4.0.0", + "dev": true, + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "../node_modules/process-nextick-args": { + "version": "2.0.1", + "dev": true + }, + "../node_modules/promise-inflight": { + "version": "1.0.1", + "dev": true + }, + "../node_modules/promise-retry": { + "version": "2.0.1", + "dev": true, + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + } + }, + "../node_modules/proxy-addr": { + "version": "2.0.7", + "dev": true, + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, + "../node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "dev": true + }, + "../node_modules/punycode": { + "version": "2.3.0", + "dev": true + }, + "../node_modules/qs": { + "version": "6.11.0", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + } + }, + "../node_modules/quick-lru": { + "version": "4.0.1", + "dev": true + }, + "../node_modules/randombytes": { + "version": "2.1.0", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "../node_modules/range-parser": { + "version": "1.2.1", + "dev": true + }, + "../node_modules/raw-body": { + "version": "2.5.1", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "../node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "dev": true + }, + "../node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.4.24", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "../node_modules/read-pkg": { + "version": "5.2.0", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + } + }, + "../node_modules/read-pkg-up": { + "version": "7.0.1", + "dev": true, + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + } + }, + "../node_modules/read-pkg-up/node_modules/find-up": { + "version": "4.1.0", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "../node_modules/read-pkg-up/node_modules/locate-path": { + "version": "5.0.0", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + } + }, + "../node_modules/read-pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + } + }, + "../node_modules/read-pkg-up/node_modules/p-locate": { + "version": "4.1.0", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + } + }, + "../node_modules/read-pkg-up/node_modules/path-exists": { + "version": "4.0.0", + "dev": true + }, + "../node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "dev": true + }, + "../node_modules/read-pkg/node_modules/hosted-git-info": { + "version": "2.8.9", + "dev": true + }, + "../node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "../node_modules/read-pkg/node_modules/semver": { + "version": "5.7.2", + "dev": true + }, + "../node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "dev": true + }, + "../node_modules/readable-stream": { + "version": "3.6.2", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "../node_modules/readdirp": { + "version": "3.6.0", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + } + }, + "../node_modules/rechoir": { + "version": "0.8.0", + "dev": true, + "dependencies": { + "resolve": "^1.20.0" + } + }, + "../node_modules/redent": { + "version": "3.0.0", + "dev": true, + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + } + }, + "../node_modules/regenerate": { + "version": "1.4.2", + "dev": true + }, + "../node_modules/regenerate-unicode-properties": { + "version": "10.1.0", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2" + } + }, + "../node_modules/regenerator-runtime": { + "version": "0.14.0", + "dev": true + }, + "../node_modules/regenerator-transform": { + "version": "0.15.2", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "../node_modules/regexpu-core": { + "version": "5.3.2", + "dev": true, + "dependencies": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + } + }, + "../node_modules/regjsparser": { + "version": "0.9.1", + "dev": true, + "dependencies": { + "jsesc": "~0.5.0" + } + }, + "../node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "dev": true + }, + "../node_modules/relateurl": { + "version": "0.2.7", + "dev": true + }, + "../node_modules/renderkid": { + "version": "3.0.0", + "dev": true, + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "../node_modules/require-directory": { + "version": "2.1.1", + "dev": true + }, + "../node_modules/require-from-string": { + "version": "2.0.2", + "dev": true + }, + "../node_modules/requires-port": { + "version": "1.0.0", + "dev": true + }, + "../node_modules/resolve": { + "version": "1.22.4", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "../node_modules/resolve-cwd": { + "version": "3.0.0", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + } + }, + "../node_modules/resolve-from": { + "version": "5.0.0", + "dev": true + }, + "../node_modules/retry": { + "version": "0.12.0", + "dev": true + }, + "../node_modules/rimraf": { + "version": "3.0.2", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + } + }, + "../node_modules/robust-predicates": { + "version": "3.0.2" + }, + "../node_modules/rw": { + "version": "1.3.3" + }, + "../node_modules/safe-buffer": { + "version": "5.2.1", + "dev": true + }, + "../node_modules/safer-buffer": { + "version": "2.1.2" + }, + "../node_modules/sass-graph": { + "version": "4.0.1", + "dev": true, + "dependencies": { + "glob": "^7.0.0", + "lodash": "^4.17.11", + "scss-tokenizer": "^0.4.3", + "yargs": "^17.2.1" + } + }, + "../node_modules/sass-loader": { + "version": "13.3.2", + "dev": true, + "dependencies": { + "neo-async": "^2.6.2" + } + }, + "../node_modules/schema-utils": { + "version": "4.2.0", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + } + }, + "../node_modules/scss-tokenizer": { + "version": "0.4.3", + "dev": true, + "dependencies": { + "js-base64": "^2.4.9", + "source-map": "^0.7.3" + } + }, + "../node_modules/scss-tokenizer/node_modules/source-map": { + "version": "0.7.4", + "dev": true + }, + "../node_modules/select-hose": { + "version": "2.0.0", + "dev": true + }, + "../node_modules/selfsigned": { + "version": "2.1.1", + "dev": true, + "dependencies": { + "node-forge": "^1" + } + }, + "../node_modules/semver": { + "version": "6.3.1" + }, + "../node_modules/send": { + "version": "0.18.0", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + } + }, + "../node_modules/send/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "../node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "dev": true + }, + "../node_modules/send/node_modules/ms": { + "version": "2.1.3", + "dev": true + }, + "../node_modules/serialize-javascript": { + "version": "6.0.1", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "../node_modules/serve-index": { + "version": "1.9.1", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + } + }, + "../node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "../node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "dev": true + }, + "../node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "../node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "dev": true + }, + "../node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "dev": true + }, + "../node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "dev": true + }, + "../node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "dev": true + }, + "../node_modules/serve-static": { + "version": "1.15.0", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + } + }, + "../node_modules/set-blocking": { + "version": "2.0.0", + "dev": true + }, + "../node_modules/setprototypeof": { + "version": "1.2.0", + "dev": true + }, + "../node_modules/shallow-clone": { + "version": "3.0.1", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + } + }, + "../node_modules/shebang-command": { + "version": "2.0.0", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + } + }, + "../node_modules/shebang-regex": { + "version": "3.0.0", + "dev": true + }, + "../node_modules/shell-quote": { + "version": "1.8.1", + "dev": true + }, + "../node_modules/side-channel": { + "version": "1.0.4", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "../node_modules/signal-exit": { + "version": "3.0.7", + "dev": true + }, + "../node_modules/smart-buffer": { + "version": "4.2.0", + "dev": true + }, + "../node_modules/sockjs": { + "version": "0.3.24", + "dev": true, + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "../node_modules/socks": { + "version": "2.7.1", + "dev": true, + "dependencies": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + } + }, + "../node_modules/socks-proxy-agent": { + "version": "7.0.0", + "dev": true, + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + } + }, + "../node_modules/source-map": { + "version": "0.6.1", + "dev": true + }, + "../node_modules/source-map-js": { + "version": "1.0.2", + "dev": true + }, + "../node_modules/source-map-support": { + "version": "0.5.21", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "../node_modules/spdx-correct": { + "version": "3.2.0", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "../node_modules/spdx-exceptions": { + "version": "2.3.0", + "dev": true + }, + "../node_modules/spdx-expression-parse": { + "version": "3.0.1", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "../node_modules/spdx-license-ids": { + "version": "3.0.13", + "dev": true + }, + "../node_modules/spdy": { + "version": "4.0.2", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + } + }, + "../node_modules/spdy-transport": { + "version": "3.0.0", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "../node_modules/ssri": { + "version": "9.0.1", + "dev": true, + "dependencies": { + "minipass": "^3.1.1" + } + }, + "../node_modules/statuses": { + "version": "2.0.1", + "dev": true + }, + "../node_modules/stdout-stream": { + "version": "1.4.1", + "dev": true, + "dependencies": { + "readable-stream": "^2.0.1" + } + }, + "../node_modules/stdout-stream/node_modules/readable-stream": { + "version": "2.3.8", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "../node_modules/stdout-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "dev": true + }, + "../node_modules/stdout-stream/node_modules/string_decoder": { + "version": "1.1.1", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "../node_modules/string_decoder": { + "version": "1.3.0", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "../node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "../node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + } + }, + "../node_modules/strip-final-newline": { + "version": "2.0.0", + "dev": true + }, + "../node_modules/strip-indent": { + "version": "3.0.0", + "dev": true, + "dependencies": { + "min-indent": "^1.0.0" + } + }, + "../node_modules/style-loader": { + "version": "3.3.3", + "dev": true + }, + "../node_modules/supports-color": { + "version": "5.5.0", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + } + }, + "../node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "dev": true + }, + "../node_modules/tapable": { + "version": "2.2.1", + "dev": true + }, + "../node_modules/tar": { + "version": "6.2.0", + "dev": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + } + }, + "../node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "dev": true + }, + "../node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "dev": true + }, + "../node_modules/terser": { + "version": "5.19.4", + "dev": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + } + }, + "../node_modules/terser-webpack-plugin": { + "version": "5.3.9", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.17", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.16.8" + } + }, + "../node_modules/terser-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "../node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { + "version": "3.5.2", + "dev": true + }, + "../node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { + "version": "0.4.1", + "dev": true + }, + "../node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.3.0", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "../node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "dev": true + }, + "../node_modules/thunky": { + "version": "1.1.0", + "dev": true + }, + "../node_modules/to-fast-properties": { + "version": "2.0.0", + "dev": true + }, + "../node_modules/to-regex-range": { + "version": "5.0.1", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + } + }, + "../node_modules/toidentifier": { + "version": "1.0.1", + "dev": true + }, + "../node_modules/trim-newlines": { + "version": "3.0.1", + "dev": true + }, + "../node_modules/true-case-path": { + "version": "2.2.1", + "dev": true + }, + "../node_modules/tslib": { + "version": "2.6.2", + "dev": true + }, + "../node_modules/type-fest": { + "version": "0.18.1", + "dev": true + }, + "../node_modules/type-is": { + "version": "1.6.18", + "dev": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "../node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "dev": true + }, + "../node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "dev": true, + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + } + }, + "../node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "dev": true + }, + "../node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "dev": true + }, + "../node_modules/unique-filename": { + "version": "2.0.1", + "dev": true, + "dependencies": { + "unique-slug": "^3.0.0" + } + }, + "../node_modules/unique-slug": { + "version": "3.0.0", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, + "../node_modules/unpipe": { + "version": "1.0.0", + "dev": true + }, + "../node_modules/update-browserslist-db": { + "version": "1.0.11", + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, + "../node_modules/uri-js": { + "version": "4.4.1", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "../node_modules/util-deprecate": { + "version": "1.0.2", + "dev": true + }, + "../node_modules/utila": { + "version": "0.4.0", + "dev": true + }, + "../node_modules/utils-merge": { + "version": "1.0.1", + "dev": true + }, + "../node_modules/uuid": { + "version": "8.3.2" + }, + "../node_modules/validate-npm-package-license": { + "version": "3.0.4", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "../node_modules/vary": { + "version": "1.1.2", + "dev": true + }, + "../node_modules/watchpack": { + "version": "2.4.0", + "dev": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + } + }, + "../node_modules/wbuf": { + "version": "1.7.3", + "dev": true, + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "../node_modules/webpack": { + "version": "5.88.2", + "dev": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.7", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + } + }, + "../node_modules/webpack-cli": { + "version": "5.1.4", + "dev": true, + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^2.1.1", + "@webpack-cli/info": "^2.0.2", + "@webpack-cli/serve": "^2.0.5", + "colorette": "^2.0.14", + "commander": "^10.0.1", + "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "webpack-merge": "^5.7.3" + } + }, + "../node_modules/webpack-cli/node_modules/commander": { + "version": "10.0.1", + "dev": true + }, + "../node_modules/webpack-dev-middleware": { + "version": "5.3.3", + "dev": true, + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + } + }, + "../node_modules/webpack-dev-server": { + "version": "4.15.1", + "dev": true, + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.5", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.13.0" + } + }, + "../node_modules/webpack-merge": { + "version": "5.9.0", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + } + }, + "../node_modules/webpack-sources": { + "version": "3.2.3", + "dev": true + }, + "../node_modules/webpack/node_modules/ajv": { + "version": "6.12.6", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "../node_modules/webpack/node_modules/ajv-keywords": { + "version": "3.5.2", + "dev": true + }, + "../node_modules/webpack/node_modules/json-schema-traverse": { + "version": "0.4.1", + "dev": true + }, + "../node_modules/webpack/node_modules/schema-utils": { + "version": "3.3.0", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "../node_modules/websocket-driver": { + "version": "0.7.4", + "dev": true, + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "../node_modules/websocket-extensions": { + "version": "0.1.4", + "dev": true + }, + "../node_modules/which": { + "version": "2.0.2", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + } + }, + "../node_modules/wide-align": { + "version": "1.1.5", + "dev": true, + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "../node_modules/wildcard": { + "version": "2.0.1", + "dev": true + }, + "../node_modules/wrap-ansi": { + "version": "7.0.0", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "../node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + } + }, + "../node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + } + }, + "../node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "dev": true + }, + "../node_modules/wrappy": { + "version": "1.0.2", + "dev": true + }, + "../node_modules/ws": { + "version": "8.14.0", + "dev": true + }, + "../node_modules/y18n": { + "version": "5.0.8", + "dev": true + }, + "../node_modules/yallist": { + "version": "3.1.1" + }, + "../node_modules/yargs": { + "version": "17.7.2", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + } + }, + "../node_modules/yargs-parser": { + "version": "20.2.9", + "dev": true + }, + "../node_modules/yargs/node_modules/yargs-parser": { + "version": "21.1.1", + "dev": true + }, + "../node_modules/yocto-queue": { + "version": "1.0.0", + "dev": true + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "dependencies": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", + "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.6.tgz", + "integrity": "sha512-FxpRyGjrMJXh7X3wGLGhNDCRiwpWEF74sKjTLDJSG5Kyvow3QZaG0Adbqzi9ZrVjTWpsX+2cxWXD71NMg93kdw==", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.6", + "@babel/parser": "^7.23.6", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.6", + "@babel/types": "^7.23.6", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "dependencies": { + "@babel/types": "^7.23.6", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", + "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "dependencies": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.6.tgz", + "integrity": "sha512-cBXU1vZni/CpGF29iTu4YRbOZt3Wat6zCoMDxRF1MayiEc4URxOj31tT65HUM0CRpMowA3HCJaAOVOUnMf96cw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-member-expression-to-functions": "^7.23.0", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", + "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.4.tgz", + "integrity": "sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", + "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", + "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-wrap-function": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", + "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", + "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.15", + "@babel/types": "^7.22.19" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.6.tgz", + "integrity": "sha512-wCfsbN4nBidDRhpDhvcKlzHWCTlgJYUUdSJfzXb2NuBssDSIjc3xcb+znA7l+zYsFljAcGM0aFkN40cR3lXiGA==", + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.6", + "@babel/types": "^7.23.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", + "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz", + "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz", + "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.3.tgz", + "integrity": "sha512-XaJak1qcityzrX0/IU5nKHb34VaibwP3saKqG6a/tppelgllOH13LUann4ZCIBcVOeE6H18K4Vx9QKkVww3z/w==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", + "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead.", + "dependencies": { + "@babel/compat-data": "^7.20.5", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz", + "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz", + "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", + "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", + "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.4.tgz", + "integrity": "sha512-efdkfPhHYTtn0G6n2ddrESE91fgXxjlqLsnUtPWnJs4a4mZIbUaK7ffqKIIUKXSHwcDvaCVX6GXkaJJFqtX7jw==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.20", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz", + "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", + "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz", + "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz", + "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz", + "integrity": "sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.5.tgz", + "integrity": "sha512-jvOTR4nicqYC9yzOHIhXG5emiFEOpappSJAl73SDSEDcybD+Puuze8Tnpb9p9qEyYup24tq891gkaygIFvWDqg==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-split-export-declaration": "^7.22.6", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", + "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", + "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz", + "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz", + "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz", + "integrity": "sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", + "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", + "dev": true, + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz", + "integrity": "sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz", + "integrity": "sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz", + "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz", + "integrity": "sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", + "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz", + "integrity": "sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", + "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz", + "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", + "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.3.tgz", + "integrity": "sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==", + "dev": true, + "dependencies": { + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz", + "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz", + "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz", + "integrity": "sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz", + "integrity": "sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz", + "integrity": "sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.23.3", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", + "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz", + "integrity": "sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz", + "integrity": "sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", + "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz", + "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz", + "integrity": "sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", + "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.23.3.tgz", + "integrity": "sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz", + "integrity": "sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.23.3", + "@babel/types": "^7.23.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz", + "integrity": "sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==", + "dev": true, + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.23.3.tgz", + "integrity": "sha512-qMFdSS+TUhB7Q/3HVPnEdYJDQIk57jkntAwSuz9xfSE4n+3I+vHYCli3HoHawN1Z3RfCz/y1zXA/JXjG6cVImQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", + "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz", + "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", + "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", + "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", + "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", + "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", + "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz", + "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz", + "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", + "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz", + "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.6.tgz", + "integrity": "sha512-2XPn/BqKkZCpzYhUUNZ1ssXw7DcXfKQEjv/uXZUXgaebCMYmkEsfZ2yY+vv+xtXv50WmL5SGhyB6/xsWxIvvOQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.23.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.3", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.23.3", + "@babel/plugin-syntax-import-attributes": "^7.23.3", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.23.3", + "@babel/plugin-transform-async-generator-functions": "^7.23.4", + "@babel/plugin-transform-async-to-generator": "^7.23.3", + "@babel/plugin-transform-block-scoped-functions": "^7.23.3", + "@babel/plugin-transform-block-scoping": "^7.23.4", + "@babel/plugin-transform-class-properties": "^7.23.3", + "@babel/plugin-transform-class-static-block": "^7.23.4", + "@babel/plugin-transform-classes": "^7.23.5", + "@babel/plugin-transform-computed-properties": "^7.23.3", + "@babel/plugin-transform-destructuring": "^7.23.3", + "@babel/plugin-transform-dotall-regex": "^7.23.3", + "@babel/plugin-transform-duplicate-keys": "^7.23.3", + "@babel/plugin-transform-dynamic-import": "^7.23.4", + "@babel/plugin-transform-exponentiation-operator": "^7.23.3", + "@babel/plugin-transform-export-namespace-from": "^7.23.4", + "@babel/plugin-transform-for-of": "^7.23.6", + "@babel/plugin-transform-function-name": "^7.23.3", + "@babel/plugin-transform-json-strings": "^7.23.4", + "@babel/plugin-transform-literals": "^7.23.3", + "@babel/plugin-transform-logical-assignment-operators": "^7.23.4", + "@babel/plugin-transform-member-expression-literals": "^7.23.3", + "@babel/plugin-transform-modules-amd": "^7.23.3", + "@babel/plugin-transform-modules-commonjs": "^7.23.3", + "@babel/plugin-transform-modules-systemjs": "^7.23.3", + "@babel/plugin-transform-modules-umd": "^7.23.3", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.23.3", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.4", + "@babel/plugin-transform-numeric-separator": "^7.23.4", + "@babel/plugin-transform-object-rest-spread": "^7.23.4", + "@babel/plugin-transform-object-super": "^7.23.3", + "@babel/plugin-transform-optional-catch-binding": "^7.23.4", + "@babel/plugin-transform-optional-chaining": "^7.23.4", + "@babel/plugin-transform-parameters": "^7.23.3", + "@babel/plugin-transform-private-methods": "^7.23.3", + "@babel/plugin-transform-private-property-in-object": "^7.23.4", + "@babel/plugin-transform-property-literals": "^7.23.3", + "@babel/plugin-transform-regenerator": "^7.23.3", + "@babel/plugin-transform-reserved-words": "^7.23.3", + "@babel/plugin-transform-shorthand-properties": "^7.23.3", + "@babel/plugin-transform-spread": "^7.23.3", + "@babel/plugin-transform-sticky-regex": "^7.23.3", + "@babel/plugin-transform-template-literals": "^7.23.3", + "@babel/plugin-transform-typeof-symbol": "^7.23.3", + "@babel/plugin-transform-unicode-escapes": "^7.23.3", + "@babel/plugin-transform-unicode-property-regex": "^7.23.3", + "@babel/plugin-transform-unicode-regex": "^7.23.3", + "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.6", + "babel-plugin-polyfill-corejs3": "^0.8.5", + "babel-plugin-polyfill-regenerator": "^0.5.3", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.23.3.tgz", + "integrity": "sha512-tbkHOS9axH6Ysf2OUEqoSZ6T3Fa2SrNH6WTWSPBboxKzdxNc9qOICeLXkNG0ZEwbQ1HY8liwOce4aN/Ceyuq6w==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", + "@babel/plugin-transform-react-display-name": "^7.23.3", + "@babel/plugin-transform-react-jsx": "^7.22.15", + "@babel/plugin-transform-react-jsx-development": "^7.22.5", + "@babel/plugin-transform-react-pure-annotations": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", + "dev": true + }, + "node_modules/@babel/runtime": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.6.tgz", + "integrity": "sha512-zHd0eUrf5GZoOWVCXp6koAKQTfZV07eit6bGPmJgnZdnSAvvZee6zniW2XMF7Cmc4ISOOnPy3QaSiIJGJkVEDQ==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.6.tgz", + "integrity": "sha512-czastdK1e8YByZqezMPFiZ8ahwVMh/ESl9vPgvgdB9AmFMGP5jfpFax74AQgl5zj4XHzqeYAg2l8PuUeRS1MgQ==", + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.6", + "@babel/types": "^7.23.6", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", + "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@fortawesome/fontawesome-common-types": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.5.1.tgz", + "integrity": "sha512-GkWzv+L6d2bI5f/Vk6ikJ9xtl7dfXtoRu3YGE6nq0p/FFqA1ebMOAWg3XgRyb0I6LYyYkiAo+3/KrwuBp8xG7A==", + "hasInstallScript": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/fontawesome-svg-core": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.5.1.tgz", + "integrity": "sha512-MfRCYlQPXoLlpem+egxjfkEuP9UQswTrlCOsknus/NcMoblTH2g0jPrapbcIb04KGA7E2GZxbAccGZfWoYgsrQ==", + "hasInstallScript": true, + "dependencies": { + "@fortawesome/fontawesome-common-types": "6.5.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/free-solid-svg-icons": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.5.1.tgz", + "integrity": "sha512-S1PPfU3mIJa59biTtXJz1oI0+KAXW6bkAb31XKhxdxtuXDiUIFsih4JR1v5BbxY7hVHsD1RKq+jRkVRaf773NQ==", + "hasInstallScript": true, + "dependencies": { + "@fortawesome/fontawesome-common-types": "6.5.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/react-fontawesome": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.0.tgz", + "integrity": "sha512-uHg75Rb/XORTtVt7OS9WoK8uM276Ufi7gCzshVWkUJbHhh3svsUUeqXerrM96Wm7fRiDzfKRwSoahhMIkGAYHw==", + "dependencies": { + "prop-types": "^15.8.1" + }, + "peerDependencies": { + "@fortawesome/fontawesome-svg-core": "~1 || ~6", + "react": ">=16.3" + } + }, + "node_modules/@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "dev": true + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", + "dev": true + }, + "node_modules/@npmcli/fs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", + "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", + "dev": true, + "dependencies": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@npmcli/fs/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/fs/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/fs/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/@npmcli/move-file": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", + "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", + "deprecated": "This functionality has been moved to @npmcli/fs", + "dev": true, + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@polaris/dashboard-sdk": { + "resolved": "..", + "link": true + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@react-aria/ssr": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.0.tgz", + "integrity": "sha512-Bz6BqP6ZorCme9tSWHZVmmY+s7AU8l6Vl2NUYmBzezD//fVHHfFo4lFBn5tBuAaJEm3AuCLaJQ6H2qhxNSb7zg==", + "dependencies": { + "@swc/helpers": "^0.5.0" + }, + "engines": { + "node": ">= 12" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + } + }, + "node_modules/@remix-run/router": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.13.1.tgz", + "integrity": "sha512-so+DHzZKsoOcoXrILB4rqDkMDy7NLMErRdOxvzvOKb507YINKUP4Di+shbTZDhSE/pBZ+vr7XGIpcOO0VLSA+Q==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@restart/hooks": { + "version": "0.4.15", + "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.4.15.tgz", + "integrity": "sha512-cZFXYTxbpzYcieq/mBwSyXgqnGMHoBVh3J7MU0CCoIB4NRZxV9/TuwTBAaLMqpNhC3zTPMCgkQ5Ey07L02Xmcw==", + "dependencies": { + "dequal": "^2.0.3" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@restart/ui": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/@restart/ui/-/ui-1.6.6.tgz", + "integrity": "sha512-eC3puKuWE1SRYbojWHXnvCNHGgf3uzHCb6JOhnF4OXPibOIPEkR1sqDSkL643ydigxwh+ruCa1CmYHlzk7ikKA==", + "dependencies": { + "@babel/runtime": "^7.21.0", + "@popperjs/core": "^2.11.6", + "@react-aria/ssr": "^3.5.0", + "@restart/hooks": "^0.4.9", + "@types/warning": "^3.0.0", + "dequal": "^2.0.3", + "dom-helpers": "^5.2.0", + "uncontrollable": "^8.0.1", + "warning": "^4.0.3" + }, + "peerDependencies": { + "react": ">=16.14.0", + "react-dom": ">=16.14.0" + } + }, + "node_modules/@restart/ui/node_modules/uncontrollable": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-8.0.4.tgz", + "integrity": "sha512-ulRWYWHvscPFc0QQXvyJjY6LIXU56f0h8pQFvhxiKk5V1fcI8gp9Ht9leVAhrVjzqMw0BgjspBINx9r6oyJUvQ==", + "peerDependencies": { + "react": ">=16.14.0" + } + }, + "node_modules/@swc/helpers": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.3.tgz", + "integrity": "sha512-FaruWX6KdudYloq1AHD/4nU+UsMTdNE8CKyrseXWEcgjDAbvkwJg2QGPAnfIJLIWsjZOSPLOAykK6fuYp4vp4A==", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + "dev": true, + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/eslint": { + "version": "8.44.9", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.9.tgz", + "integrity": "sha512-6yBxcvwnnYoYT1Uk2d+jvIfsuP4mb2EdIxFnrPABj5a/838qe5bGkNLFOiipX4ULQ7XVQvTxOh7jO+BTAiqsEw==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "node_modules/@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.41", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.41.tgz", + "integrity": "sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/hast": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.8.tgz", + "integrity": "sha512-aMIqAlFd2wTIDZuvLbhUT+TGvMxrNC8ECUIVtH6xxy0sQLs3iu6NO8Kp/VT5je7i5ufnebXzdV1dNDMnvaH6IQ==", + "dependencies": { + "@types/unist": "^2" + } + }, + "node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + "dev": true + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "dev": true + }, + "node_modules/@types/http-proxy": { + "version": "1.17.14", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", + "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true + }, + "node_modules/@types/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.10.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.4.tgz", + "integrity": "sha512-D08YG6rr8X90YB56tSIuBaddy/UXAA9RKJoFvrsnogAum/0pmjkgi4+2nx96A330FmioegBWmEYQ+syqCFaveg==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.10", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.10.tgz", + "integrity": "sha512-y6PJDYN4xYBxwd22l+OVH35N+1fCYWiuC3aiP2SlXVE6Lo7SS+rSx9r89hLxrP4pn6n1lBGhHJ12pj3F3Mpttw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", + "dev": true + }, + "node_modules/@types/prop-types": { + "version": "15.7.11", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", + "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==" + }, + "node_modules/@types/qs": { + "version": "6.9.10", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.10.tgz", + "integrity": "sha512-3Gnx08Ns1sEoCrWssEgTSJs/rsT2vhGP+Ja9cnnk9k4ALxinORlQneLXFeFKOTJMOeZUFD1s7w+w2AphTpvzZw==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true + }, + "node_modules/@types/react": { + "version": "18.2.45", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.45.tgz", + "integrity": "sha512-TtAxCNrlrBp8GoeEp1npd5g+d/OejJHFxS3OWmrPBMFaVQMSN0OFySozJio5BHxTuTeug00AVXVAjfDSfk+lUg==", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-transition-group": { + "version": "4.4.10", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz", + "integrity": "sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "dev": true + }, + "node_modules/@types/scheduler": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", + "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==" + }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dev": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", + "dev": true, + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", + "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", + "dev": true, + "dependencies": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/unist": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", + "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==" + }, + "node_modules/@types/warning": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.3.tgz", + "integrity": "sha512-D1XC7WK8K+zZEveUPY+cf4+kgauk8N4eHr/XIHXGlGYkHLud6hK9lYfZk1ry1TNh798cZUCgb6MqGEG8DkJt6Q==" + }, + "node_modules/@types/ws": { + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", + "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dev": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webpack-cli/configtest": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", + "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", + "dev": true, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", + "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", + "dev": true, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", + "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", + "dev": true, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "dev": true, + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agentkeepalive": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", + "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", + "dev": true, + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true + }, + "node_modules/are-we-there-yet": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "dev": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/async-foreach": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", + "integrity": "sha512-VUeSMD8nEGBWaZK4lizI1sf3yEC7pnAQ/mrI7pC2fBz2s/tq5jWWEngTwaf0Gruu/OoXRGLGg1XFqpYBiGTYJA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/babel-loader": { + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", + "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", + "dev": true, + "dependencies": { + "find-cache-dir": "^4.0.0", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0", + "webpack": ">=5" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.7.tgz", + "integrity": "sha512-LidDk/tEGDfuHW2DWh/Hgo4rmnw3cduK6ZkOI1NPFceSK3n/yAGeOsNT7FLnSGHkXj3RHGSEVkN3FsCTY6w2CQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.4.4", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.7.tgz", + "integrity": "sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.4.4", + "core-js-compat": "^3.33.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.4.tgz", + "integrity": "sha512-S/x2iOCvDaCASLYsOOgWOq4bCfKYVqvO/uxjkaYyZ3rVsVE3CeAI/c84NpyuBBymEgNvHgjEot3a9/Z/kXvqsg==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.4.4" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/bonjour-service": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz", + "integrity": "sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==", + "dev": true, + "dependencies": { + "array-flatten": "^2.1.2", + "dns-equal": "^1.0.0", + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "node_modules/bootstrap": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.2.tgz", + "integrity": "sha512-D32nmNWiQHo94BKHLmOrdjlL05q1c8oxbtBphQFb9Z5to6eGRDCm0QgeaZ4zFBHzfg2++rqa2JkqCcxDy0sH0g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/twbs" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + } + ], + "peerDependencies": { + "@popperjs/core": "^2.11.8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", + "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001565", + "electron-to-chromium": "^1.4.601", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacache": { + "version": "16.1.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", + "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", + "dev": true, + "dependencies": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/cacache/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/cacache/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/cacache/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/call-bind": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001570", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001570.tgz", + "integrity": "sha512-+3e0ASu4sw1SWaoCtvPeyXp+5PsjigkSt8OXZbF9StH5pQWbxEjLAZE3n8Aup5udop1uRiKA7a4utUk/uoSpUw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/character-entities": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", + "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", + "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", + "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/classnames": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", + "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" + }, + "node_modules/clean-css": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", + "dev": true, + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clsx": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", + "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "node_modules/comma-separated-tokens": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", + "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", + "dev": true + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/compression/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "dev": true + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true + }, + "node_modules/core-js-compat": { + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.34.0.tgz", + "integrity": "sha512-4ZIyeNbW/Cn1wkMMDy+mvrRUxrwFNjKwbhCfQpDd+eLgYipDqp8oGFGtLmhh18EDPKA0g3VUBYOxQGGwvWLVpA==", + "dev": true, + "dependencies": { + "browserslist": "^4.22.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-loader": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.8.1.tgz", + "integrity": "sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==", + "dev": true, + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.21", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.3", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/css-loader/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/css-loader/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/css-loader/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", + "dev": true, + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dev": true, + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true + }, + "node_modules/dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", + "dev": true + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "dev": true, + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.4.611", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.611.tgz", + "integrity": "sha512-ZtRpDxrjHapOwxtv+nuth5ByB8clyn8crVynmRNGO3wG3LOp8RTcyZDqwaI6Ng6y8FCK2hVZmJoqwCskKbNMaw==" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/envinfo": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.0.tgz", + "integrity": "sha512-G9/6xF1FPbIw0TtalAMaVPpiq2aDEuKLXM314jPVAO9r2fo2a4BLqMNkmRS7O/xPPZ+COAhGIz3ETvHEV3eUcg==", + "dev": true, + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-module-lexer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", + "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", + "dev": true + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-equals": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-4.0.3.tgz", + "integrity": "sha512-G3BSX9cfKttjr+2o1O22tYMLq0DPluZnYtq1rXumE1SpL/F/SLIfHx08WYQoWSIpeMYf8sRbJ8++71+v6Pnxfg==" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/fault": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz", + "integrity": "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==", + "dependencies": { + "format": "^0.2.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/find-cache-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", + "dev": true, + "dependencies": { + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dev": true, + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/format": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", + "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-monkey": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", + "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "dev": true, + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/gaze": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", + "dev": true, + "dependencies": { + "globule": "^1.0.0" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/globule": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.4.tgz", + "integrity": "sha512-OPTIfhMBh7JbBYDpa5b+Q5ptmMWKwcNcFSR/0c6t8V4f3ZAVBEsKNY37QdVqmLRYSMhOUGYrY0QhSoEpzGr/Eg==", + "dev": true, + "dependencies": { + "glob": "~7.1.1", + "lodash": "^4.17.21", + "minimatch": "~3.0.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/globule/node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "node_modules/hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true + }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", + "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", + "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", + "dependencies": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^1.0.0", + "hast-util-parse-selector": "^2.0.0", + "property-information": "^5.0.0", + "space-separated-tokens": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "engines": { + "node": "*" + } + }, + "node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hosted-git-info/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-entities": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", + "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ] + }, + "node_modules/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "dev": true, + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-webpack-plugin": { + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.4.tgz", + "integrity": "sha512-3wNSaVVxdxcu0jd4FpQFoICdqgxs4zIQQvj+2yQKFfBOnLETQ6X5CDWdeasuGlSsooFlMkEioWDTqBv1wvw5Iw==", + "dev": true, + "dependencies": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "webpack": "^5.20.0" + } + }, + "node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "dev": true + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "dev": true + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "dev": true + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "dev": true, + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "dev": true, + "dependencies": { + "ms": "^2.0.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local/node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/interpret": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", + "dev": true + }, + "node_modules/ipaddr.js": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", + "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-alphabetical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", + "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", + "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", + "dependencies": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", + "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", + "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "dev": true + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-base64": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", + "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==", + "dev": true + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/launch-editor": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz", + "integrity": "sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==", + "dev": true, + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.8.1" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lowlight": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-1.20.0.tgz", + "integrity": "sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==", + "dependencies": { + "fault": "^1.0.0", + "highlight.js": "~10.7.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-fetch-happen": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", + "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", + "dev": true, + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^9.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "dev": true, + "dependencies": { + "fs-monkey": "^1.0.4" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/meow": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", + "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", + "dev": true, + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize": "^1.2.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "dev": true + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.7.6", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz", + "integrity": "sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==", + "dev": true, + "dependencies": { + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "node_modules/minimatch": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", + "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-fetch": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", + "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", + "dev": true, + "dependencies": { + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dev": true, + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/nan": { + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.18.0.tgz", + "integrity": "sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true, + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-gyp": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", + "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", + "dev": true, + "dependencies": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^9.1.0", + "nopt": "^5.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": ">= 10.12.0" + } + }, + "node_modules/node-gyp/node_modules/@npmcli/fs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", + "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", + "dev": true, + "dependencies": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + } + }, + "node_modules/node-gyp/node_modules/@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "deprecated": "This functionality has been moved to @npmcli/fs", + "dev": true, + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-gyp/node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/node-gyp/node_modules/cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "dev": true, + "dependencies": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/node-gyp/node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/node-gyp/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-gyp/node_modules/make-fetch-happen": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", + "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", + "dev": true, + "dependencies": { + "agentkeepalive": "^4.1.3", + "cacache": "^15.2.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.2", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^6.0.0", + "ssri": "^8.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/node-gyp/node_modules/minipass-fetch": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", + "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", + "dev": true, + "dependencies": { + "minipass": "^3.1.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "optionalDependencies": { + "encoding": "^0.1.12" + } + }, + "node_modules/node-gyp/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-gyp/node_modules/socks-proxy-agent": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", + "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==", + "dev": true, + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/node-gyp/node_modules/ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "dev": true, + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/node-gyp/node_modules/unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "dependencies": { + "unique-slug": "^2.0.0" + } + }, + "node_modules/node-gyp/node_modules/unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, + "node_modules/node-gyp/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" + }, + "node_modules/node-sass": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-9.0.0.tgz", + "integrity": "sha512-yltEuuLrfH6M7Pq2gAj5B6Zm7m+gdZoG66wTqG6mIZV/zijq3M2OO2HswtT6oBspPyFhHDcaxWpsBm0fRNDHPg==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "async-foreach": "^0.1.3", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.3", + "gaze": "^1.0.0", + "get-stdin": "^4.0.1", + "glob": "^7.0.3", + "lodash": "^4.17.15", + "make-fetch-happen": "^10.0.4", + "meow": "^9.0.0", + "nan": "^2.17.0", + "node-gyp": "^8.4.1", + "sass-graph": "^4.0.1", + "stdout-stream": "^1.4.0", + "true-case-path": "^2.2.1" + }, + "bin": { + "node-sass": "bin/node-sass" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/node-sass/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/node-sass/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/node-sass/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/node-sass/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/node-sass/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/node-sass/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/normalize-package-data/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/normalize-package-data/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "dev": true, + "dependencies": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dev": true, + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-retry/node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dev": true, + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/parse-entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", + "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", + "dependencies": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "dev": true + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "dev": true, + "dependencies": { + "find-up": "^6.3.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/postcss": { + "version": "8.4.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz", + "integrity": "sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz", + "integrity": "sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "dev": true, + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "node_modules/prismjs": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", + "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "dev": true + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types-extra": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.1.tgz", + "integrity": "sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew==", + "dependencies": { + "react-is": "^16.3.2", + "warning": "^4.0.0" + }, + "peerDependencies": { + "react": ">=0.14.0" + } + }, + "node_modules/property-information": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", + "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", + "dependencies": { + "xtend": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/raf": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", + "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", + "dependencies": { + "performance-now": "^2.1.0" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-bootstrap": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-2.9.1.tgz", + "integrity": "sha512-ezgmh/ARCYp18LbZEqPp0ppvy+ytCmycDORqc8vXSKYV3cer4VH7OReV8uMOoKXmYzivJTxgzGHalGrHamryHA==", + "dependencies": { + "@babel/runtime": "^7.22.5", + "@restart/hooks": "^0.4.9", + "@restart/ui": "^1.6.6", + "@types/react-transition-group": "^4.4.6", + "classnames": "^2.3.2", + "dom-helpers": "^5.2.1", + "invariant": "^2.2.4", + "prop-types": "^15.8.1", + "prop-types-extra": "^1.1.0", + "react-transition-group": "^4.4.5", + "uncontrollable": "^7.2.1", + "warning": "^4.0.3" + }, + "peerDependencies": { + "@types/react": ">=16.14.8", + "react": ">=16.14.0", + "react-dom": ">=16.14.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-draggable": { + "version": "4.4.6", + "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-4.4.6.tgz", + "integrity": "sha512-LtY5Xw1zTPqHkVmtM3X8MUOxNDOUhv/khTgBgrUvwaS064bwVvxT+q5El0uUFNx5IEPKXuRejr7UqLwBIg5pdw==", + "dependencies": { + "clsx": "^1.1.1", + "prop-types": "^15.8.1" + }, + "peerDependencies": { + "react": ">= 16.3.0", + "react-dom": ">= 16.3.0" + } + }, + "node_modules/react-draggable/node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/react-grid-layout": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/react-grid-layout/-/react-grid-layout-1.4.4.tgz", + "integrity": "sha512-7+Lg8E8O8HfOH5FrY80GCIR1SHTn2QnAYKh27/5spoz+OHhMmEhU/14gIkRzJOtympDPaXcVRX/nT1FjmeOUmQ==", + "dependencies": { + "clsx": "^2.0.0", + "fast-equals": "^4.0.3", + "prop-types": "^15.8.1", + "react-draggable": "^4.4.5", + "react-resizable": "^3.0.5", + "resize-observer-polyfill": "^1.5.1" + }, + "peerDependencies": { + "react": ">= 16.3.0", + "react-dom": ">= 16.3.0" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + }, + "node_modules/react-resizable": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/react-resizable/-/react-resizable-3.0.5.tgz", + "integrity": "sha512-vKpeHhI5OZvYn82kXOs1bC8aOXktGU5AmKAgaZS4F5JPburCtbmDPqE7Pzp+1kN4+Wb81LlF33VpGwWwtXem+w==", + "dependencies": { + "prop-types": "15.x", + "react-draggable": "^4.0.3" + }, + "peerDependencies": { + "react": ">= 16.3" + } + }, + "node_modules/react-router": { + "version": "6.20.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.20.1.tgz", + "integrity": "sha512-ccvLrB4QeT5DlaxSFFYi/KR8UMQ4fcD8zBcR71Zp1kaYTC5oJKYAp1cbavzGrogwxca+ubjkd7XjFZKBW8CxPA==", + "dependencies": { + "@remix-run/router": "1.13.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.20.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.20.1.tgz", + "integrity": "sha512-npzfPWcxfQN35psS7rJgi/EW0Gx6EsNjfdJSAk73U/HqMEJZ2k/8puxfwHFgDQhBGmS3+sjnGbMdMSV45axPQw==", + "dependencies": { + "@remix-run/router": "1.13.1", + "react-router": "6.20.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/react-syntax-highlighter": { + "version": "15.5.0", + "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-15.5.0.tgz", + "integrity": "sha512-+zq2myprEnQmH5yw6Gqc8lD55QHnpKaU8TOcFeC/Lg/MQSs8UknEA0JC4nTZGFAXC2J2Hyj/ijJ7NlabyPi2gg==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "highlight.js": "^10.4.1", + "lowlight": "^1.17.0", + "prismjs": "^1.27.0", + "refractor": "^3.6.0" + }, + "peerDependencies": { + "react": ">= 0.14.0" + } + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, + "node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/read-pkg/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "dev": true, + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/refractor": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/refractor/-/refractor-3.6.0.tgz", + "integrity": "sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==", + "dependencies": { + "hastscript": "^6.0.0", + "parse-entities": "^2.0.0", + "prismjs": "~1.27.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/refractor/node_modules/prismjs": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.27.0.tgz", + "integrity": "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "dev": true, + "dependencies": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dev": true, + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "dev": true, + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/sass-graph": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-4.0.1.tgz", + "integrity": "sha512-5YCfmGBmxoIRYHnKK2AKzrAkCoQ8ozO+iumT8K4tXJXRVCPf+7s1/9KxTSW3Rbvf+7Y7b4FR3mWyLnQr3PHocA==", + "dev": true, + "dependencies": { + "glob": "^7.0.0", + "lodash": "^4.17.11", + "scss-tokenizer": "^0.4.3", + "yargs": "^17.2.1" + }, + "bin": { + "sassgraph": "bin/sassgraph" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/sass-loader": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.3.2.tgz", + "integrity": "sha512-CQbKl57kdEv+KDLquhC+gE3pXt74LEAzm+tzywcA0/aHZuub8wTErbjAoNI57rPUWRYRNC5WUnNl8eGJNbDdwg==", + "dev": true, + "dependencies": { + "neo-async": "^2.6.2" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "fibers": ">= 3.1.0", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", + "sass": "^1.3.0", + "sass-embedded": "*", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "fibers": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + } + } + }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/scss-tokenizer": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.4.3.tgz", + "integrity": "sha512-raKLgf1LI5QMQnG+RxHz6oK0sL3x3I4FN2UDLqgLOGO8hodECNnNh5BXn7fAyBxrA8zVzdQizQ6XjNJQ+uBwMw==", + "dev": true, + "dependencies": { + "js-base64": "^2.4.9", + "source-map": "^0.7.3" + } + }, + "node_modules/scss-tokenizer/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "dev": true + }, + "node_modules/selfsigned": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "dev": true, + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/serialize-javascript": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, + "node_modules/set-function-length": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dev": true, + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/socks": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "dev": true, + "dependencies": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", + "dev": true, + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", + "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", + "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", + "dev": true + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/ssri": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", + "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", + "dev": true, + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stdout-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", + "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", + "dev": true, + "dependencies": { + "readable-stream": "^2.0.1" + } + }, + "node_modules/stdout-stream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/stdout-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/stdout-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/style-loader": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.3.tgz", + "integrity": "sha512-53BiGLXAcll9maCYtZi2RCQZKa8NQQai5C4horqKyRmHj9H7QmcUyucrH+4KW/gBQbXM2AsB0axoEcFZPlfPcw==", + "dev": true, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", + "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", + "dev": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/terser": { + "version": "5.26.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.26.0.tgz", + "integrity": "sha512-dytTGoE2oHgbNV9nTzgBEPaqAWvcJNl66VZ0BkJqlvp71IjO8CxdBx/ykCNb47cLnCmCvRZ6ZR0tLkqvZCdVBQ==", + "dev": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", + "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.17", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.16.8" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/true-case-path": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-2.2.1.tgz", + "integrity": "sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q==", + "dev": true + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typewriter-effect": { + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/typewriter-effect/-/typewriter-effect-2.21.0.tgz", + "integrity": "sha512-Y3VL1fuJpUBj0gS4OTXBLzy1gnYTYaBuVuuO99tGNyTkkub5CXi+b/hsV7Og9fp6HlhogOwWJwgq7iXI5sQlEg==", + "dependencies": { + "prop-types": "^15.8.1", + "raf": "^3.4.1" + }, + "peerDependencies": { + "react": "^17.x || ^18.x", + "react-dom": "^17.x || ^18.x" + } + }, + "node_modules/uncontrollable": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.2.1.tgz", + "integrity": "sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ==", + "dependencies": { + "@babel/runtime": "^7.6.3", + "@types/react": ">=16.9.11", + "invariant": "^2.2.4", + "react-lifecycles-compat": "^3.0.4" + }, + "peerDependencies": { + "react": ">=15.0.0" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unique-filename": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", + "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", + "dev": true, + "dependencies": { + "unique-slug": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/unique-slug": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", + "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", + "dev": true + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dev": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/webpack": { + "version": "5.89.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz", + "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==", + "dev": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.7", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-cli": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", + "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", + "dev": true, + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^2.1.1", + "@webpack-cli/info": "^2.0.2", + "@webpack-cli/serve": "^2.0.5", + "colorette": "^2.0.14", + "commander": "^10.0.1", + "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", + "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", + "dev": true, + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-server": { + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", + "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", + "dev": true, + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.5", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.13.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/webpack/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/ws": { + "version": "8.15.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.15.1.tgz", + "integrity": "sha512-W5OZiCjXEmk0yZ66ZN82beM5Sz7l7coYxpRkzS+p9PP+ToQry8szKh+61eNktr7EA9DOwvFGhfC605jDHbP6QQ==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/advanced/package.json b/advanced/package.json new file mode 100644 index 0000000000000000000000000000000000000000..fc97545aa1bf2f4aff3eed29626aec0b48f40924 --- /dev/null +++ b/advanced/package.json @@ -0,0 +1,44 @@ +{ + "name": "dashboard-advanced", + "version": "1.0.0", + "description": "", + "main": "src/index.js", + "scripts": { + "dev": "webpack-dev-server --mode development", + "build": "webpack --mode production", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC", + "devDependencies": { + "@babel/core": "^7.22.15", + "@babel/preset-env": "^7.22.15", + "@babel/preset-react": "^7.23.3", + "babel-loader": "^9.1.3", + "css-loader": "^6.8.1", + "html-webpack-plugin": "^5.5.3", + "mini-css-extract-plugin": "^2.7.6", + "node-sass": "^9.0.0", + "sass-loader": "^13.3.2", + "style-loader": "^3.3.3", + "webpack": "^5.88.2", + "webpack-cli": "^5.1.4", + "webpack-dev-server": "^4.15.1" + }, + "dependencies": { + "@babel/plugin-proposal-object-rest-spread": "^7.20.7", + "@fortawesome/fontawesome-svg-core": "^6.5.1", + "@fortawesome/free-solid-svg-icons": "^6.5.1", + "@fortawesome/react-fontawesome": "^0.2.0", + "@polaris/dashboard-sdk": "file:../", + "bootstrap": "^5.3.2", + "react": "^18.2.0", + "react-bootstrap": "^2.9.1", + "react-dom": "^18.2.0", + "react-grid-layout": "^1.4.4", + "react-router-dom": "^6.20.1", + "react-syntax-highlighter": "^15.5.0", + "typewriter-effect": "^2.21.0" + } +} diff --git a/advanced/src/app/components/PolarisDashboard.js b/advanced/src/app/components/PolarisDashboard.js new file mode 100644 index 0000000000000000000000000000000000000000..0915624910d973da7f447cd6aff97991b9289d14 --- /dev/null +++ b/advanced/src/app/components/PolarisDashboard.js @@ -0,0 +1,81 @@ +import React, { useEffect, useState } from "react"; +import GridLayout, { WidthProvider } from "react-grid-layout"; +import PolarisBaseWidget from "./widgets/PolarisBaseWidget"; +import { Button, Offcanvas } from "react-bootstrap"; +import { faPenToSquare, faPlus, faXmark } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; + + +const ResponsiveGridLayout = WidthProvider(GridLayout); + +export default function PolarisDashboard({config}) { + + const id = config.id; + const debug = config.debug; + let [generatedWidgets, setGeneratedWidgets] = useState([]) + let [layout, setLayout] = useState([]) + let [isResizable, setIsResizable] = useState(false) + let [isDraggable, setIsDraggable] = useState(false) + let [showAddDrawer, setShowAddDrawer] = useState(false) + + + useEffect(() => { + if(config == null) + { + + } + forceRender() + },[config, isDraggable,isResizable]) + + + const handleClose = () => setShowAddDrawer(false); + + const forceRender = () => { + let widgets = []; + Object.keys(config?.widgets).forEach((key, _) => { widgets.push(<div key={key}><PolarisBaseWidget isDraggable={isDraggable} isResizable={isResizable} config={config?.widgets[key]} widgetKey={key}/></div>);}) + setGeneratedWidgets(widgets) + + let tempLayout = []; + Object.keys(config?.widgets).forEach((key, _) => { tempLayout.push({x: 0, y: 0, w: 2, h: 2, ...config?.widgets[key]?.layout, i: key})}) + setLayout(tempLayout); + } + + return <> + <div className="d-flex justify-content-between"> + <h5>{config.name}</h5> + <div className="d-flex"> + {config.interaction?.allowEdit ? <Button variant="primary" className="m-1" onClick={() => { + setIsDraggable(!isDraggable) + setIsResizable(!isResizable) + }}>{ isDraggable || isResizable ? <FontAwesomeIcon icon={faXmark} /> : <FontAwesomeIcon icon={faPenToSquare} />}</Button> : null } + {config.interaction?.allowAdd ? <Button variant="outline-secondary" className="m-1" onClick={() => { + setShowAddDrawer(true) + }}><FontAwesomeIcon icon={faPlus} /></Button> : null } + </div> + </div> + + {generatedWidgets?.length > 0 ? + <ResponsiveGridLayout + className="layout" + layout={layout} + isDraggable={isDraggable} + isResizable={isResizable} + compactType={"horizontal"} + autoSize={config?.grid?.autoSize ?? false} + > + {generatedWidgets?.map((widget) => { + return widget; + })} + </ResponsiveGridLayout> : null } + + <Offcanvas show={showAddDrawer} onHide={handleClose}> + <Offcanvas.Header closeButton> + <Offcanvas.Title>Widgets hinzufügen</Offcanvas.Title> + </Offcanvas.Header> + <Offcanvas.Body> + Klicken Sie ein Widget an, um es dem Dashboard hinzuzufügen. Danach können Sie es verschieben und anpassen. + </Offcanvas.Body> + </Offcanvas> + </> + +} diff --git a/advanced/src/app/components/PolarisDashboardSplitView.js b/advanced/src/app/components/PolarisDashboardSplitView.js new file mode 100644 index 0000000000000000000000000000000000000000..8dc1e3d26f379a1516f7a71e4efc7605f7155d8e --- /dev/null +++ b/advanced/src/app/components/PolarisDashboardSplitView.js @@ -0,0 +1,28 @@ +import React from "react"; +import { Col, Container, Row } from "react-bootstrap"; +import PolarisDashboard from "./PolarisDashboard"; +import { docco } from 'react-syntax-highlighter/dist/esm/styles/hljs'; +import SyntaxHighlighter from "react-syntax-highlighter/dist/esm/default-highlight"; + +export default function PolarisDashboardSplitView({config, title, hideConfig = false, height = "auto"}) +{ + + const dashboardConfig = hideConfig ? "// Die Konfiguration ist ausgeblendet" : 'let dashboardConfig= ' + JSON.stringify(config, null, "\t") + ";"; + + return <Container fluid style={{height: height}}> + <Row> + <h3>{title}</h3> + </Row> + <Row> + + <Col xs={6}> + <PolarisDashboard config={config}/> + </Col> + <Col xs={6}> + <SyntaxHighlighter language="javascript" style={docco}> + {dashboardConfig} + </SyntaxHighlighter> + </Col> + </Row> + </Container> +} \ No newline at end of file diff --git a/advanced/src/app/components/widgets/PolarisBarChart.js b/advanced/src/app/components/widgets/PolarisBarChart.js new file mode 100644 index 0000000000000000000000000000000000000000..38789c53be941807b66410c49f3b8fa41da1d455 --- /dev/null +++ b/advanced/src/app/components/widgets/PolarisBarChart.js @@ -0,0 +1,43 @@ +import React, { useEffect, useRef, useState } from "react"; +import { BarChartWidget } from "@polaris/dashboard-sdk"; +import { Card } from "react-bootstrap"; + +export default function PolarisBarChart({parameters, isEdit}) +{ + + const ref = useRef(null) + + const [plotData, setPlotData] = useState("") + + useEffect(() => { + if(isEdit) + setPlotData(lineChartLib.plot(ref.current.clientWidth,ref.current.clientHeight)) + }) + + useEffect(() => { + setPlotData(lineChartLib.plot(ref.current.clientWidth,ref.current.clientHeight)) + },[ref.current?.clientWidth, ref.current?.clientHeight]) + + + const data = Object.keys(parameters?.data).map(key => ({column1: key, column2: parameters?.data[key]})); + + console.log(data) + + const lineChartLib = new BarChartWidget( + parameters?.headline, + parameters?.description, + data, + { + showLegend: false, + xAxisLabel: parameters?.xAxisLabel, + yAxisLabel: parameters?.yAxisLabel, + onShowDesc: () => { + + }, + disableBackground: true, + disableQuestionMark: true, + } + ); + + return <Card style={{height: "100%"}} ref={ref} dangerouslySetInnerHTML={{__html: plotData }}/> +} \ No newline at end of file diff --git a/advanced/src/app/components/widgets/PolarisBaseCard.js b/advanced/src/app/components/widgets/PolarisBaseCard.js new file mode 100644 index 0000000000000000000000000000000000000000..508f73ec73250eff381f40f7188d083649fe37a6 --- /dev/null +++ b/advanced/src/app/components/widgets/PolarisBaseCard.js @@ -0,0 +1,14 @@ +import React from "react"; +import { Card } from "react-bootstrap"; + +export default function PolarisBaseCard({parameters}) +{ + return <Card style={{ height: "100%"}} bg={parameters.variant} + text={parameters.variant == null || parameters.variant.toLowerCase() === 'light' ? 'dark' : 'white'}> + <Card.Body> + <Card.Title> + {parameters.headline}</Card.Title> + <Card.Text dangerouslySetInnerHTML={{ __html: parameters.body}}></Card.Text> + </Card.Body> + </Card> +} \ No newline at end of file diff --git a/advanced/src/app/components/widgets/PolarisBaseWidget.js b/advanced/src/app/components/widgets/PolarisBaseWidget.js new file mode 100644 index 0000000000000000000000000000000000000000..e5461a0f7e8db46a148674769562ed79d16b81c8 --- /dev/null +++ b/advanced/src/app/components/widgets/PolarisBaseWidget.js @@ -0,0 +1,27 @@ +import React from "react"; +import PolarisBaseCard from "./PolarisBaseCard"; +import { FontAwesomeIcon, solid } from "@fortawesome/react-fontawesome"; +import { faStar, faThumbsDown, faThumbsUp } from "@fortawesome/free-solid-svg-icons"; +import PolarisLineChart from "./PolarisLineChart"; +import PolarisBarChart from "./PolarisBarChart"; + +export default class PolarisBaseWidget extends React.Component { + + render() { + console.log(this.props) + return <div style={{height: "100%"}} className={this.props.isResizable || this.props.isDraggable ? "db-shaking": ""} > + {!this.props.isDraggable && !this.props.isResizable && this.props.config.feedback?.mode == "thumbs" ? + <div className="d-flex" style={{position:"absolute", zIndex: 10, right: "5px", color: this.props.config.feedback?.color == "light" ? "#fff": "#000"}}> + <FontAwesomeIcon icon={faThumbsDown} className="m-1" onClick={(evt) => { evt.preventDefault(); alert("test") }} /> + <FontAwesomeIcon icon={faThumbsUp} className="m-1" onClick={(evt) => { evt.preventDefault() }} /> + </div> : null } + {!this.props.isDraggable && !this.props.isResizable && this.props.config.feedback?.mode == "star" ? + <div className="d-flex" style={{position:"absolute", zIndex: 10, right: "5px", color: this.props.config.feedback?.color == "light" ? "#fff": "#000"}}> + <FontAwesomeIcon icon={faStar} className="m-1" onClick={(evt) => { evt.preventDefault() }} /> + </div>: null} + {this.props.config?.type === "card" ? <PolarisBaseCard parameters={this.props.config?.parameters}/> : null} + {this.props.config?.type === "lineChart" ? <PolarisLineChart parameters={this.props.config?.parameters} isEdit={this.props.isResizable || this.props.isDraggable}/> : null} + {this.props.config?.type === "barChart" ? <PolarisBarChart parameters={this.props.config?.parameters} isEdit={this.props.isResizable || this.props.isDraggable}/> : null} + </div> + } +} \ No newline at end of file diff --git a/advanced/src/app/components/widgets/PolarisLineChart.js b/advanced/src/app/components/widgets/PolarisLineChart.js new file mode 100644 index 0000000000000000000000000000000000000000..275f7e069270132d519769da47ce1f6b731d8ad2 --- /dev/null +++ b/advanced/src/app/components/widgets/PolarisLineChart.js @@ -0,0 +1,38 @@ +import React, { useEffect, useRef, useState } from "react"; +import { LineChartWidget } from "@polaris/dashboard-sdk"; +import { Card } from "react-bootstrap"; + +export default function PolarisLineChart({parameters, isEdit}) +{ + + const ref = useRef(null) + + const [plotData, setPlotData] = useState("") + + useEffect(() => { + if(isEdit) + setPlotData(lineChartLib.plot(ref.current.clientWidth,ref.current.clientHeight)) + }) + + useEffect(() => { + setPlotData(lineChartLib.plot(ref.current.clientWidth,ref.current.clientHeight)) + },[ref.current?.clientWidth, ref.current?.clientHeight]) + + const lineChartLib = new LineChartWidget( + parameters?.headline, + parameters?.description, + parameters?.data, + { + showLegend: false, + xAxisLabel: parameters?.xAxisLabel, + yAxisLabel: parameters?.yAxisLabel, + onShowDesc: () => { + + }, + disableBackground: true, + disableQuestionMark: true, + } + ); + + return <Card style={{height: "100%"}} ref={ref} dangerouslySetInnerHTML={{__html: plotData }}/> +} \ No newline at end of file diff --git a/advanced/src/app/layout/errorpage.js b/advanced/src/app/layout/errorpage.js new file mode 100644 index 0000000000000000000000000000000000000000..e98a3b4f9b73643f15540a17c48aae64d54998f9 --- /dev/null +++ b/advanced/src/app/layout/errorpage.js @@ -0,0 +1,17 @@ +import React from "react"; +import { useRouteError } from "react-router-dom"; + +export default function ErrorPage() { + const error = useRouteError(); + console.error(error); + + return ( + <div id="error-page"> + <h1>Oops!</h1> + <p>Sorry, an unexpected error has occurred.</p> + <p> + <i>{error.statusText || error.message}</i> + </p> + </div> + ); +} \ No newline at end of file diff --git a/advanced/src/app/layout/layout.js b/advanced/src/app/layout/layout.js new file mode 100644 index 0000000000000000000000000000000000000000..ba7e252322fec3483f2801c80426904729afb2d6 --- /dev/null +++ b/advanced/src/app/layout/layout.js @@ -0,0 +1,33 @@ +import React from 'react'; +import { Container, Nav, NavDropdown, Navbar } from 'react-bootstrap'; +import { Outlet } from 'react-router-dom'; + +export default function Layout() { + return ( + <> + <Navbar expand="lg" bg="primary" data-bs-theme="dark"> + <Container fluid> + <Navbar.Brand href="/">Polaris Dashboard</Navbar.Brand> + <Navbar.Toggle aria-controls="basic-navbar-nav" /> + <Navbar.Collapse id="basic-navbar-nav"> + <Nav className="me-auto"> + <Nav.Link href="/">Home</Nav.Link> + <Nav.Link href="#link">Datenerfassung</Nav.Link> + <NavDropdown title="Dashboards" id="basic-nav-dropdown"> + <NavDropdown.Item href="/dashboard/1">Dashboard Base SDK</NavDropdown.Item> + <NavDropdown.Item href="/dashboard/2">Dashboard Advanced SDK + </NavDropdown.Item> + </NavDropdown> + + <NavDropdown title="Entwickler Tools" id="basic-nav-dropdown"> + <NavDropdown.Item href="#action/3.1">xAPI Statements Viewer</NavDropdown.Item> + </NavDropdown> + </Nav> + </Navbar.Collapse> + </Container> + </Navbar> + + <Outlet /> + </> + ); + } \ No newline at end of file diff --git a/advanced/src/app/pages/aurora-borealis-sky.jpg b/advanced/src/app/pages/aurora-borealis-sky.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0a8eaad9b87ea845bef7026059dc602ba16940bd Binary files /dev/null and b/advanced/src/app/pages/aurora-borealis-sky.jpg differ diff --git a/advanced/src/app/pages/cover.jpg b/advanced/src/app/pages/cover.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0b76436e82e1e81e19f2f85202c4c37139c2bd71 Binary files /dev/null and b/advanced/src/app/pages/cover.jpg differ diff --git a/advanced/src/app/pages/dashboard.js b/advanced/src/app/pages/dashboard.js new file mode 100644 index 0000000000000000000000000000000000000000..75851de63d18b3e06071dfb38618ad90dc23ef6a --- /dev/null +++ b/advanced/src/app/pages/dashboard.js @@ -0,0 +1,129 @@ +import React, { useEffect } from 'react'; +import {mockBarChart, mockChartJSBarChart} from "../../mock_charts/mock_bar_chart"; +import {mockGrid} from "../../mock_charts/mock_grid"; +import {mockScatterGrid} from "../../mock_charts/mock_scatter_grid"; +import {mockPieGrid} from "../../mock_charts/mock_pie_grid"; +import {mockDeadlines} from "../../mock_charts/mock_deadlines"; +import {mockProgressHeat} from "../../mock_charts/mock_progress_heat"; +import {mockProgressBox} from "../../mock_charts/mock_progress_box"; +import {mockFeedback} from "../../mock_charts/mock_feedback"; +import {mockLineChart} from "../../mock_charts/mock_line_chart"; +import { initGrid } from '../../../../src/js/utils'; + + +const widgets_config = [ + { + x: 0, + y: 0, + w: 4, + h: 6, + widgetId: "scatter-grid-widget", + }, + { + x: 4, + y: 0, + w: 4, + h: 6, + widgetId: "grid-widget", + }, + { + x: 8, + y: 0, + w: 4, + h: 7, + widgetId: "chartjs-barchart-widget", + }, + + { + x: 0, + y: 6, + w: 2, + h: 5, + widgetId: "heat-progress-widget", + }, + { + x: 2, + y: 6, + w: 2, + h: 5, + widgetId: "box-progress-widget" + }, + { + x: 0, + y: 11, + h: 6, + w: 4, + widgetId: "line-chart-widget" + }, + { + x: 4, + y: 6, + w: 4, + h: 8, + widgetId: "mc-pie-grid-widget", + }, + { + x: 8, + y: 6, + w: 4, + h: 3, + widgetId: "deadlines-grid-widget", + }, + { + x: 8, + y: 9, + w: 4, + h: 5, + widgetId: "feedback-grid-widget", + } +]; + + +export default function Dashboard() { + + const onShowDesc = (desc) => { + const modalContent = document.getElementById("modal-content-body"); + modalContent.innerText = desc; + const modal = new bootstrap.Modal(document.getElementById("myModal"), {}); + modal.show(); +}; + +/** + * Opens bootstrap error modal. + * @param {*} message + */ +const showErrorModal = (message) => { + const modalContent = document.getElementById("error-modal-content-body"); + modalContent.innerText = message; + const modal = new bootstrap.Modal(document.getElementById("myErrorModal"), {}); + modal.show(); +}; + + const buildWidgets = (data) => { + const widgets = { + //...mockBarChart, + ...mockChartJSBarChart(onShowDesc), + ...mockGrid(onShowDesc), + ...mockScatterGrid(onShowDesc), + ...mockPieGrid(onShowDesc), + ...mockDeadlines(onShowDesc), + ...mockProgressHeat(onShowDesc), + ...mockProgressBox(onShowDesc), + ...mockFeedback(onShowDesc), + ...mockLineChart(onShowDesc) + }; + + return widgets; + }; + + useEffect(() => { + const widgets = buildWidgets([]); + + // Initialize grid with widgets at configured positions + let grid = initGrid(widgets, widgets_config); + }, []) + + return <div class="grid"> + <div class="grid-stack"></div> + </div> +} \ No newline at end of file diff --git a/advanced/src/app/pages/dashboard_2.js b/advanced/src/app/pages/dashboard_2.js new file mode 100644 index 0000000000000000000000000000000000000000..c35eefc0c9cb8a0d3a26bd426a9121554f0a5fea --- /dev/null +++ b/advanced/src/app/pages/dashboard_2.js @@ -0,0 +1,258 @@ +import React, { useEffect } from 'react'; +import {mockBarChart, mockChartJSBarChart} from "../../mock_charts/mock_bar_chart"; +import {mockGrid} from "../../mock_charts/mock_grid"; +import {mockScatterGrid} from "../../mock_charts/mock_scatter_grid"; +import {mockPieGrid} from "../../mock_charts/mock_pie_grid"; +import {mockDeadlines} from "../../mock_charts/mock_deadlines"; +import {mockProgressHeat} from "../../mock_charts/mock_progress_heat"; +import {mockProgressBox} from "../../mock_charts/mock_progress_box"; +import {mockFeedback} from "../../mock_charts/mock_feedback"; +import GridLayout from "react-grid-layout"; +import PolarisDashboard from '../components/PolarisDashboard'; +import PolarisDashboardSplitView from '../components/PolarisDashboardSplitView'; + + +export default function Dashboard2() { + + const dashboardConfig = { + "id": "new-unique-id", + "name": "Simple Dashboard", + "visualisationToken": "", + "rights_engine": "https://polaris.digitallearning.gmbh", + "grid": { + "cols": 6 + }, + "widgets": { + "welcome-card": { + "type": "card", + "parameters": { + "headline": "Das ist eine einfache Karte", + "body": "Hier könnte ein erklärender Text stehen" + } + } + } + }; + + const dashboardConfig2 = { + "id": "new-unique-id", + "name": "Simple Dashboard", + "visualisationToken": "", + "rights_engine": "https://polaris.digitallearning.gmbh", + "widgets": { + "welcome-card": { + "type": "card", + "parameters": { + "headline": "Das ist eine einfache Karte", + "body": "Hier könnte ein erklärender Text stehen" + } + }, + "info-card": { + "type": "card", + "parameters": { + "headline": "Das ist eine zweite Karte", + "body": "Diese Karte kann man bewerten und man kann HTML verwenden <b>HTML</b>", + "variant": "primary", + }, + "feedback": { + "mode": "thumbs", + "color": "light", + } + } + } + }; + + const dashboardConfig3 = { + "id": "new-unique-id", + "name": "Simple Dashboard", + "visualisationToken": "", + "rights_engine": "https://polaris.digitallearning.gmbh", + "interaction": { + "allowEdit": true, + "allowRemove": true, + "allowAdd": true, + }, + "widgets": { + "welcome-card": { + "type": "card", + "parameters": { + "headline": "Das ist eine einfache Karte", + "body": "Hier könnte ein erklärender Text stehen" + } + }, + "info-card": { + "type": "card", + "parameters": { + "headline": "Das ist eine zweite Karte", + "body": "Diese Karte kann man bewerten und man kann HTML verwenden <b>HTML</b>", + "variant": "primary", + }, + "feedback": { + "mode": "thumbs", + "color": "light", + } + } + } + }; + + const dashboardConfig4 = { + "id": "new-unique-id", + "name": "Simple Dashboard", + "visualisationToken": "", + "rights_engine": "https://polaris.digitallearning.gmbh", + "widgets": { + "no-rating-card": { + "type": "card", + "parameters": { + "headline": "Eine Karte ohne Feedback", + "body": "Diese Karte kann nicht bewertet werden" + } + }, + "thumbs-card": { + "type": "card", + "parameters": { + "headline": "Daumen hoch/runter", + "body": "Diese Karte kann mit <b>Daumen hoch</b> oder <i>Daumen runter</i> bewertet werden", + "variant": "primary", + }, + "feedback": { + "mode": "thumbs", + "color": "light", + }, + "layout": { + "w": 4 + } + }, + "start-card": { + "type": "card", + "parameters": { + "headline": "Diese Karte kann per Sterne bewertet werden", + "body": "Diese Karte kann man mit Sternen bewerten", + "variant": "warning", + }, + "feedback": { + "mode": "star", + "color": "light", + } + } + } + }; + + const dashboardConfig5 = { + "id": "new-unique-id", + "name": "Simple Dashboard", + "visualisationToken": "", + "rights_engine": "https://polaris.digitallearning.gmbh", + "interaction": { + "allowEdit": true, + "allowRemove": true, + "allowAdd": true, + }, + "widgets": { + "no-rating-card": { + "type": "card", + "parameters": { + "headline": "Eine Karte ohne Feedback", + "body": "Diese Karte kann nicht bewertet werden" + } + }, + "linechart": { + "type": "lineChart", + "parameters": { + "headline": "Kursnutzung", + "description": "Durchschnittliche Kursnutzung nach Blöcken", + "data": [ {column1: 0, column2: 80}, + {column1: 10, column2: 60}, + {column1: 20, column2: 70}, + {column1: 30, column2: 20}, + {column1: 40, column2: 0}, + {column1: 50, column2: 60}, + {column1: 60, column2: 70}, + {column1: 70, column2: 80}, + {column1: 80, column2: 76}, + {column1: 90, column2: 60}, + {column1: 100, column2: 70}], + "yAxisLabel": "Teilnahme", + "xAxisLabel": "Blöcke" + }, + "layout": { + "w": 8 + } + }, + } + }; + + const dashboardConfig6 = { + "id": "new-unique-id", + "name": "Simple Dashboard", + "visualisationToken": "", + "rights_engine": "https://polaris.digitallearning.gmbh", + "interaction": { + "allowEdit": true, + "allowRemove": true, + "allowAdd": true, + }, + "widgets": { + "no-rating-card": { + "type": "card", + "parameters": { + "headline": "Eine Karte ohne Feedback", + "body": "Diese Karte kann nicht bewertet werden" + } + }, + "linechart": { + "type": "lineChart", + "parameters": { + "headline": "Kursnutzung", + "description": "Durchschnittliche Kursnutzung nach Blöcken", + "data": [ {column1: 0, column2: 80}, + {column1: 10, column2: 60}, + {column1: 20, column2: 70}, + {column1: 30, column2: 20}, + {column1: 40, column2: 0}, + {column1: 50, column2: 60}, + {column1: 60, column2: 70}, + {column1: 70, column2: 80}, + {column1: 80, column2: 76}, + {column1: 90, column2: 60}, + {column1: 100, column2: 70}], + "yAxisLabel": "Teilnahme", + "xAxisLabel": "Blöcke" + }, + "layout": { + "w": 8 + } + }, + "barchart": { + "type": "barChart", + "parameters": { + "headline": "A sample bar chart", + "description": "Beschreibung", + "data": { + "accessed": 98, + "started": 7, + "graded": 7, + "submitted": 7, + "answered": 38, + "leftUnanswered": 4 + }, + "yAxisLabel": "Status", + "xAxisLabel": "Anzahl" + }, + "layout": { + "w": 4 + } + }, + } + }; + + + return <> + <PolarisDashboardSplitView config={dashboardConfig} title={"Base example"}/> + <PolarisDashboardSplitView config={dashboardConfig2} title={"Base example with two Widgets"}/> + <PolarisDashboardSplitView config={dashboardConfig3} title={"Base example with edit mode"}/> + <PolarisDashboardSplitView config={dashboardConfig4} title={"Rating examples"}/> + <PolarisDashboardSplitView config={dashboardConfig5} title={"Chart examples"}/> + <PolarisDashboardSplitView config={dashboardConfig6} title={"Complex Chart examples"} hideConfig={true} height={"800px"}/> + </> + +} \ No newline at end of file diff --git a/advanced/src/app/pages/login.js b/advanced/src/app/pages/login.js new file mode 100644 index 0000000000000000000000000000000000000000..49eb66fcf6b3b7f85ad09bd69a664a93c2b31850 --- /dev/null +++ b/advanced/src/app/pages/login.js @@ -0,0 +1,64 @@ +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import React, { useState } from "react"; +import { Button, Col, Container, Row } from "react-bootstrap"; + +import CoverImage from "./cover.jpg" + +export default function Login() { + + + const [username, setUsername] = useState("") + const [password, setPassword] = useState("") + const [isLoading, setIsLoading] = useState(false) + + const login = () => { + window.location.href = "/" + } + + const onKeyDown = (event) => { + if (event.key === "Enter") { + event.preventDefault(); + login() + } + } + + + + + return <Container fluid><Row style={{minHeight: "100vh"}}> + <Col md={4} lg={6} xl={8} className={"d-none d-md-block video-container"} style={{backgroundImage: "url("+ CoverImage + ")", backgroundSize: "cover"}}> + </Col> + <Col md={8} lg={6} xl={4}> + <div className="form-left px-5"> + <div className="row g-4" style={{marginTop: "50px"}}> + <h3>Polaris</h3> + </div> + <div className="row g-4 mt-2" style={{borderLeft: "4px solid #3f51b5"}}> + <h4 className={""}>Bitte melden Sie sich an.</h4> + <div className="col-12"> + <label>Nutzername<span className="text-danger">*</span></label> + <div className="input-group"> + <div className="input-group-text"><FontAwesomeIcon icon="fa-solid fa-user" /></div> + <input onKeyDown={onKeyDown} onChange={(e) => setUsername(e.target.value)} value={username} type="text" className="form-control" placeholder="E-Mail Adresse"/> + </div> + </div> + + <div className="col-12"> + <label>Passwort<span className="text-danger">*</span></label> + <div className="input-group"> + <div className="input-group-text"><FontAwesomeIcon icon="fa-solid fa-key" /></div> + <input onKeyDown={onKeyDown} onChange={(e) => setPassword(e.target.value)} value={password} type="password" className="form-control" placeholder="Bitte geben Sie Ihr Passwort ein"/> + </div> + </div> + + <div className="col-sm-12"> + <Button onClick={() => login()} className="btn btn-primary px-4 float-end"><FontAwesomeIcon icon="sign-in"/> Anmelden </Button> + </div> + </div> + <div className={"text-center text-muted"}> + Impressum • Datenschutz + </div> + </div> + </Col> +</Row></Container> +} \ No newline at end of file diff --git a/advanced/src/app/pages/welcome.js b/advanced/src/app/pages/welcome.js new file mode 100644 index 0000000000000000000000000000000000000000..d00c10efcdf773e558093c21d644664fbed0b681 --- /dev/null +++ b/advanced/src/app/pages/welcome.js @@ -0,0 +1,8 @@ +import React from "react"; + +export default function Welcome() { + + return <> + Hi welcome + </> +} \ No newline at end of file diff --git a/advanced/src/index.html b/advanced/src/index.html new file mode 100644 index 0000000000000000000000000000000000000000..3b80c454620bc89f599bf4f0a38d239a683d5804 --- /dev/null +++ b/advanced/src/index.html @@ -0,0 +1,12 @@ +<!DOCTYPE html> +<html dir="ltr" lang="en"> +<head> + <meta charset="utf-8" /> + <meta http-equiv="x-ua-compatible" content="ie=edge" /> + <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" /> + <title>Polaris Dashboard</title> + <script defer src="/bundle.js"></script> +</head> +<body> +</body> +</html> diff --git a/advanced/src/index.js b/advanced/src/index.js new file mode 100644 index 0000000000000000000000000000000000000000..a11dca52db0eff255b45cf5a258607c07c559480 --- /dev/null +++ b/advanced/src/index.js @@ -0,0 +1,52 @@ +import React from 'react'; +import { createRoot } from 'react-dom/client'; +import { + createBrowserRouter, + RouterProvider, + } from "react-router-dom"; +import './index.scss'; +import Layout from './app/layout/layout'; +import ErrorPage from './app/layout/errorpage'; +import Dashboard from './app/pages/dashboard'; +import Login from './app/pages/login'; +import Dashboard2 from './app/pages/dashboard_2'; +import Welcome from './app/pages/welcome'; + +// Clear the existing HTML content +document.body.innerHTML = '<div id="app"></div>'; + + +const router = createBrowserRouter([ + { + path: "/", + element: <Layout />, + errorElement: <ErrorPage />, + children: [ + { + path: "/", + element: <Welcome />, + }, + { + path: "dashboard/1", + element: <Dashboard />, + }, + { + path: "dashboard/2", + element: <Dashboard2 />, + }, + ], + }, + { + path: "/login", + element: <Login />, + errorElement: <ErrorPage /> + }, + ]); + +// Render your React component instead +const root = createRoot(document.getElementById('app')); +root.render( + <React.StrictMode> + <RouterProvider router={router} /> + </React.StrictMode> +); diff --git a/advanced/src/index.scss b/advanced/src/index.scss new file mode 100644 index 0000000000000000000000000000000000000000..2d14e3a8c900a7a48d4d87005f73c6e3050e1b66 --- /dev/null +++ b/advanced/src/index.scss @@ -0,0 +1,315 @@ +.grid-title { + margin-left: 5px; + margin-top: 2px; +} + + +*, +*::before, +*::after { + box-sizing: border-box; +} + +.card { + position: relative; + display: -ms-flexbox; + display: flex; + -ms-flex-direction: column; + flex-direction: column; + min-width: 0; + word-wrap: break-word; + background-color: #fff; + background-clip: border-box; + border: 1px solid rgba(0, 0, 0, 0.125); + border-radius: 0.25rem; +} + +.card > hr { + margin-right: 0; + margin-left: 0; +} + +.card > .list-group:first-child .list-group-item:first-child { + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem; +} + +.card > .list-group:last-child .list-group-item:last-child { + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; +} + +.card-body { + -ms-flex: 1 1 auto; + flex: 1 1 auto; + min-height: 1px; + padding: 1.25rem; +} + +.card-title { + margin-bottom: 0.75rem; +} + +.card-subtitle { + margin-top: -0.375rem; + margin-bottom: 0; +} + +.card-text:last-child { + margin-bottom: 0; +} + +.card-link:hover { + text-decoration: none; +} + +.card-link + .card-link { + margin-left: 1.25rem; +} + +.card-header { + padding: 0.75rem 1.25rem; + margin-bottom: 0; + background-color: rgba(0, 0, 0, 0.03); + border-bottom: 1px solid rgba(0, 0, 0, 0.125); +} + +.card-header:first-child { + border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0; +} + +.card-header + .list-group .list-group-item:first-child { + border-top: 0; +} + +.card-footer { + padding: 0.75rem 1.25rem; + background-color: rgba(0, 0, 0, 0.03); + border-top: 1px solid rgba(0, 0, 0, 0.125); +} + +.card-footer:last-child { + border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px); +} + +.card-header-tabs { + margin-right: -0.625rem; + margin-bottom: -0.75rem; + margin-left: -0.625rem; + border-bottom: 0; +} + +.card-header-pills { + margin-right: -0.625rem; + margin-left: -0.625rem; +} + +.card-img-overlay { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + padding: 1.25rem; +} + +.card-img, +.card-img-top, +.card-img-bottom { + -ms-flex-negative: 0; + flex-shrink: 0; + width: 100%; +} + +.card-img, +.card-img-top { + border-top-left-radius: calc(0.25rem - 1px); + border-top-right-radius: calc(0.25rem - 1px); +} + +.card-img, +.card-img-bottom { + border-bottom-right-radius: calc(0.25rem - 1px); + border-bottom-left-radius: calc(0.25rem - 1px); +} + +.card-deck .card { + margin-bottom: 15px; +} + +@media (min-width: 576px) { + .card-deck { + display: -ms-flexbox; + display: flex; + -ms-flex-flow: row wrap; + flex-flow: row wrap; + margin-right: -15px; + margin-left: -15px; + } + .card-deck .card { + -ms-flex: 1 0 0%; + flex: 1 0 0%; + margin-right: 15px; + margin-bottom: 0; + margin-left: 15px; + } +} + +.card-group > .card { + margin-bottom: 15px; +} + +@media (min-width: 576px) { + .card-group { + display: -ms-flexbox; + display: flex; + -ms-flex-flow: row wrap; + flex-flow: row wrap; + } + .card-group > .card { + -ms-flex: 1 0 0%; + flex: 1 0 0%; + margin-bottom: 0; + } + .card-group > .card + .card { + margin-left: 0; + border-left: 0; + } + .card-group > .card:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + .card-group > .card:not(:last-child) .card-img-top, + .card-group > .card:not(:last-child) .card-header { + border-top-right-radius: 0; + } + .card-group > .card:not(:last-child) .card-img-bottom, + .card-group > .card:not(:last-child) .card-footer { + border-bottom-right-radius: 0; + } + .card-group > .card:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + } + .card-group > .card:not(:first-child) .card-img-top, + .card-group > .card:not(:first-child) .card-header { + border-top-left-radius: 0; + } + .card-group > .card:not(:first-child) .card-img-bottom, + .card-group > .card:not(:first-child) .card-footer { + border-bottom-left-radius: 0; + } +} + +.form-control { + display: block; + width: 100%; + height: calc(1.5em + 0.75rem + 2px); + padding: 0.375rem 0.75rem; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #495057; + background-color: #fff; + background-clip: padding-box; + border: 1px solid #ced4da; + border-radius: 0.25rem; + transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} + +@media (prefers-reduced-motion: reduce) { + .form-control { + transition: none; + } +} + +.form-control::-ms-expand { + background-color: transparent; + border: 0; +} + +.form-control:-moz-focusring { + color: transparent; + text-shadow: 0 0 0 #495057; +} + +.form-control:focus { + color: #495057; + background-color: #fff; + border-color: #80bdff; + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); +} + +.form-control::-webkit-input-placeholder { + color: #6c757d; + opacity: 1; +} + +.form-control::-moz-placeholder { + color: #6c757d; + opacity: 1; +} + +.form-control:-ms-input-placeholder { + color: #6c757d; + opacity: 1; +} + +.form-control::-ms-input-placeholder { + color: #6c757d; + opacity: 1; +} + +.form-control::placeholder { + color: #6c757d; + opacity: 1; +} + +.form-control:disabled, .form-control[readonly] { + background-color: #e9ecef; + opacity: 1; +} + +select.form-control:focus::-ms-value { + color: #495057; + background-color: #fff; +} + +.form-control-file, +.form-control-range { + display: block; + width: 100%; +} +textarea.form-control { + height: auto; +} +$primary: #3f51b5; + + +@import '~bootstrap/scss/bootstrap'; +@import '~react-grid-layout/css/styles.css'; +@import '~react-resizable/css/styles.css'; + +.db-shaking { + animation: shake 1s; + animation-iteration-count: infinite; +} + +@keyframes shake { + 0% { + transform:rotate(0deg) + } + 25% { + transform:rotate(0.25deg) + } + 50% { + transform:rotate(0deg) + } + 75% { + transform:rotate(-0.25deg) + } + 100% { + transform: rotate(0deg) + } +} diff --git a/advanced/src/mock_charts/mock_bar_chart.js b/advanced/src/mock_charts/mock_bar_chart.js new file mode 100644 index 0000000000000000000000000000000000000000..e423d577ccf6e5686a79b86da36dd4accaf861bc --- /dev/null +++ b/advanced/src/mock_charts/mock_bar_chart.js @@ -0,0 +1,61 @@ +import { BarChartWidget, ChartJSWidget } from "@polaris/dashboard-sdk"; + +const dict = { + "accessed": 98, + "started": 7, + "graded": 7, + "submitted": 7, + "answered": 38, + "leftUnanswered": 4 +} +const data = Object.keys(dict).map(key => ({column1: key, column2: dict[key]})); + +export const mockBarChart = { "barchart-widget" : + new BarChartWidget( + "Kursnutzung", + "Darstellung des Fortschritts der Teilnehmer anhand der Nutzung der Lerninhalte", + data, + { + showLegend: true, + xAxisLabel: "Status", + yAxisLabel: "Anzahl" + }) +} + + +const chartjs_data = {datasets: [{data: Object.keys(dict).map(key => dict[key])}], labels: Object.keys(dict)}; + +export function mockChartJSBarChart(onShowDesc) +{ + return { "chartjs-barchart-widget" : + new ChartJSWidget( + "Kursnutzung", + "Darstellung des Fortschritts der Teilnehmer anhand der Nutzung der Lerninhalte", + chartjs_data, + { + chartjs_options: { + scales: { + x: { + title: { + display: true, + text: "Status" + } + }, + y: { + title: { + display: true, + text: "Anzahl" + } + } + }, + plugins: { + legend: { + display: false, + } + }, + }, + onShowDesc: onShowDesc + } + ) + } +} diff --git a/advanced/src/mock_charts/mock_deadlines.js b/advanced/src/mock_charts/mock_deadlines.js new file mode 100644 index 0000000000000000000000000000000000000000..17f3d0ee79358ac9ea4b2505ad4ff481c9459c73 --- /dev/null +++ b/advanced/src/mock_charts/mock_deadlines.js @@ -0,0 +1,49 @@ +import { GridWidget } from "@polaris/dashboard-sdk"; + +const data = [ + { + type: "textElement", + name: "Block 1", + options: { + showLegend: false, + }, + data: { + text: "00.00.00 - noch ... Tage" + } + }, + { + type: "textElement", + name: "Block 2", + options: { + showLegend: false, + }, + data: { + text: "00.00.00 - noch ... Tage" + } + }, + { + type: "textElement", + name: "Block 3", + options: { + showLegend: false, + }, + data: { + text: "00.00.00 - noch ... Tage" + } + }, +] + + +export function mockDeadlines(onShowDesc) { + return { + "deadlines-grid-widget": + new GridWidget( + "Deadlines", + "Deadlines verschiedener Blöcke", + data, + { + direction: "column", + onShowDesc: onShowDesc + }) + } +} \ No newline at end of file diff --git a/advanced/src/mock_charts/mock_feedback.js b/advanced/src/mock_charts/mock_feedback.js new file mode 100644 index 0000000000000000000000000000000000000000..218db2a16d7d68af0c4ceb79689f45ba4678bd11 --- /dev/null +++ b/advanced/src/mock_charts/mock_feedback.js @@ -0,0 +1,29 @@ +import { GridWidget } from "@polaris/dashboard-sdk"; + +const data = [ + { + type: "textAreaElement", + name: "", + options: { + showLegend: false, + }, + data: { + text: "Gib hier dein Feedback ein", + } + } +] + + +export function mockFeedback(onShowDesc) { + return { + "feedback-grid-widget": + new GridWidget( + "Feedback", + "Feedback Element", + data, + { + direction: "column", + onShowDesc: onShowDesc + }) + } +} diff --git a/advanced/src/mock_charts/mock_grid.js b/advanced/src/mock_charts/mock_grid.js new file mode 100644 index 0000000000000000000000000000000000000000..1c67750e12a1f5335ce1952679b2a3d06bfa82a0 --- /dev/null +++ b/advanced/src/mock_charts/mock_grid.js @@ -0,0 +1,350 @@ +import { GridWidget } from "@polaris/dashboard-sdk"; + +const data = [ + { + type: "heatmap", + name: "Block 1", + options: { + showLegend: false, + }, + data: + [ + { + group: "A", + variable: "v1", + value: 12 + }, + { + group: "A", + variable: "v2", + value: 1 + }, + { + group: "A", + variable: "v3", + value: 26 + }, + { + group: "A", + variable: "v4", + value: 86 + }, + { + group: "A", + variable: "v5", + value: 10 + }, + { + group: "B", + variable: "v1", + value: 82 + }, + { + group: "B", + variable: "v2", + value: 65 + }, + { + group: "B", + variable: "v3", + value: 51 + }, + { + group: "B", + variable: "v4", + value: 2 + }, + { + group: "B", + variable: "v5", + value: 15 + }, + { + group: "C", + variable: "v1", + value: 23 + }, + { + group: "C", + variable: "v2", + value: 35 + }, + { + group: "C", + variable: "v3", + value: 45 + }, + { + group: "C", + variable: "v4", + value: 36 + }, + { + group: "C", + variable: "v5", + value: 19 + }, + { + group: "D", + variable: "v1", + value: 89 + }, + { + group: "D", + variable: "v2", + value: 64 + }, + { + group: "D", + variable: "v3", + value: 4 + }, + { + group: "D", + variable: "v4", + value: 39 + }, + { + group: "D", + variable: "v5", + value: 75 + }, + ] + }, + { + type: "heatmap", + name: "Block 2", + options: { + showLegend: false, + }, + data: + [ + { + group: "A", + variable: "v1", + value: 12 + }, + { + group: "A", + variable: "v2", + value: 1 + }, + { + group: "A", + variable: "v3", + value: 26 + }, + { + group: "A", + variable: "v4", + value: 86 + }, + { + group: "A", + variable: "v5", + value: 10 + }, + { + group: "B", + variable: "v1", + value: 82 + }, + { + group: "B", + variable: "v2", + value: 65 + }, + { + group: "B", + variable: "v3", + value: 51 + }, + { + group: "B", + variable: "v4", + value: 2 + }, + { + group: "B", + variable: "v5", + value: 15 + }, + { + group: "C", + variable: "v1", + value: 23 + }, + { + group: "C", + variable: "v2", + value: 35 + }, + { + group: "C", + variable: "v3", + value: 45 + }, + { + group: "C", + variable: "v4", + value: 36 + }, + { + group: "C", + variable: "v5", + value: 19 + }, + { + group: "D", + variable: "v1", + value: 89 + }, + { + group: "D", + variable: "v2", + value: 64 + }, + { + group: "D", + variable: "v3", + value: 4 + }, + { + group: "D", + variable: "v4", + value: 39 + }, + { + group: "D", + variable: "v5", + value: 75 + }, + ] + }, + { + type: "heatmap", + name: "Block 3", + options: { + showLegend: false, + }, + data: + [ + { + group: "A", + variable: "v1", + value: 12 + }, + { + group: "A", + variable: "v2", + value: 1 + }, + { + group: "A", + variable: "v3", + value: 26 + }, + { + group: "A", + variable: "v4", + value: 86 + }, + { + group: "A", + variable: "v5", + value: 10 + }, + { + group: "B", + variable: "v1", + value: 82 + }, + { + group: "B", + variable: "v2", + value: 65 + }, + { + group: "B", + variable: "v3", + value: 51 + }, + { + group: "B", + variable: "v4", + value: 2 + }, + { + group: "B", + variable: "v5", + value: 15 + }, + { + group: "C", + variable: "v1", + value: 23 + }, + { + group: "C", + variable: "v2", + value: 35 + }, + { + group: "C", + variable: "v3", + value: 45 + }, + { + group: "C", + variable: "v4", + value: 36 + }, + { + group: "C", + variable: "v5", + value: 19 + }, + { + group: "D", + variable: "v1", + value: 89 + }, + { + group: "D", + variable: "v2", + value: 64 + }, + { + group: "D", + variable: "v3", + value: 4 + }, + { + group: "D", + variable: "v4", + value: 39 + }, + { + group: "D", + variable: "v5", + value: 75 + }, + ] + } +] + + +export function mockGrid(onShowDesc) +{ + return { "grid-widget" : + new GridWidget( + "Kursnutzung in Blocks", + "Verteilung der Nutzungsaktivität über die einzelnen Lern-Blocks", + data, + { + direction: "row", + onShowDesc: onShowDesc + }) + } +} + diff --git a/advanced/src/mock_charts/mock_line_chart.js b/advanced/src/mock_charts/mock_line_chart.js new file mode 100644 index 0000000000000000000000000000000000000000..227e9be9286b224694aca86ba4cf1d6a579a4454 --- /dev/null +++ b/advanced/src/mock_charts/mock_line_chart.js @@ -0,0 +1,30 @@ +import { LineChartWidget } from "@polaris/dashboard-sdk"; + +const data = [ + {column1: 0, column2: 80}, + {column1: 10, column2: 60}, + {column1: 20, column2: 70}, + {column1: 30, column2: 20}, + {column1: 40, column2: 0}, + {column1: 50, column2: 60}, + {column1: 60, column2: 70}, + {column1: 70, column2: 80}, + {column1: 80, column2: 76}, + {column1: 90, column2: 60}, + {column1: 100, column2: 70}, +] + +export function mockLineChart(onShowDesc) { + return { "line-chart-widget" : + new LineChartWidget( + "Kursnutzung", + "Durchschnittliche Kursnutzung nach Blöcken", + data, + { + showLegend: false, + xAxisLabel: "Blöcke", + yAxisLabel: "Teilnahme", + onShowDesc: onShowDesc + }) + } +} \ No newline at end of file diff --git a/advanced/src/mock_charts/mock_pie_grid.js b/advanced/src/mock_charts/mock_pie_grid.js new file mode 100644 index 0000000000000000000000000000000000000000..c2e4b4d4888513e4d13394115a464eb54b35ac8f --- /dev/null +++ b/advanced/src/mock_charts/mock_pie_grid.js @@ -0,0 +1,154 @@ +import { GridWidget } from "@polaris/dashboard-sdk"; + +const data = [ + { + type: "grid", + name: "Block 1", + options: { + direction: "column", + }, + data: [ + { + type: "piechart", + name: "", + options: { + showLegend: false + }, + data: + [ + {column1: "bestanden", column2: 75}, + {column1: "durchgefallen", column2: 25}, + ] + }, + { + type: "piechart", + name: "", + options: { + showLegend: false + }, + data: + [ + {column1: "bestanden", column2: 68}, + {column1: "durchgefallen", column2: 32}, + ] + }, + { + type: "piechart", + name: "", + options: { + showLegend: false + }, + data: + [ + {column1: "bestanden", column2: 91}, + {column1: "durchgefallen", column2: 9}, + ] + } + ] + }, + { + type: "grid", + name: "Block 2", + options: { + direction: "column", + }, + data: [ + { + type: "piechart", + name: "", + options: { + showLegend: false + }, + data: + [ + {column1: "bestanden", column2: 83}, + {column1: "durchgefallen", column2: 17}, + ] + }, + { + type: "piechart", + name: "", + options: { + showLegend: false + }, + data: + [ + {column1: "bestanden", column2: 91}, + {column1: "durchgefallen", column2: 9}, + ] + }, + { + type: "piechart", + name: "", + options: { + showLegend: false + }, + data: + [ + {column1: "bestanden", column2: 76}, + {column1: "durchgefallen", column2: 24}, + ] + } + ] + }, + { + type: "grid", + name: "Block 2", + options: { + direction: "column", + }, + data: [ + { + type: "piechart", + name: "", + options: { + showLegend: false + }, + data: + [ + {column1: "bestanden", column2: 95}, + {column1: "durchgefallen", column2: 5}, + ] + }, + { + type: "piechart", + name: "", + options: { + showLegend: false + }, + data: + [ + {column1: "bestanden", column2: 35}, + {column1: "durchgefallen", column2: 65}, + ] + }, + { + type: "piechart", + name: "", + options: { + showLegend: false + }, + data: + [ + {column1: "bestanden", column2: 45}, + {column1: "durchgefallen", column2: 55}, + ] + } + ] + } +] + + +export function mockPieGrid(onShowDesc) +{ + return { "mc-pie-grid-widget" : + new GridWidget( + "MC-Tests", + "Vergleich von Multiple-Choice Elementen", + data, + { + direction: "row", + onShowDesc: onShowDesc + }) + } +} \ No newline at end of file diff --git a/advanced/src/mock_charts/mock_progress_box.js b/advanced/src/mock_charts/mock_progress_box.js new file mode 100644 index 0000000000000000000000000000000000000000..2761c74aa4d3773c68c7ca8ea15467788f9fd127 --- /dev/null +++ b/advanced/src/mock_charts/mock_progress_box.js @@ -0,0 +1,64 @@ +import { GridWidget } from "@polaris/dashboard-sdk"; +import { BoxPlotWidget } from "@polaris/dashboard-sdk"; + +const data = [ + { + type: "boxplot", + name: "Block 1", + options: { + showLegend: false, + }, + data: + { + min: 0, + max: 100, + q1: 34.8, + median: 35, + q3: 35.2, + }, + }, + { + type: "boxplot", + name: "Block 2", + options: { + showLegend: false, + }, + data: + { + min: 0, + max: 100, + q1: 67.8, + median: 68, + q3: 68.2, + }, + }, + { + type: "boxplot", + name: "Block 3", + options: { + showLegend: false, + }, + data: + { + min: 0, + max: 100, + q1: 64.8, + median: 65, + q3: 65.2, + }, + } +] + + +export function mockProgressBox(onShowDesc) { + return { "box-progress-widget" : + new GridWidget( + "Kursfortschritt", + "Fortschritt in den einzelnen Kursblöcken", + data, + { + direction: "column", + onShowDesc: onShowDesc + }) + } +} diff --git a/advanced/src/mock_charts/mock_progress_heat.js b/advanced/src/mock_charts/mock_progress_heat.js new file mode 100644 index 0000000000000000000000000000000000000000..6c4b7602ae609a3fc9b194211db54bda44cf5dd0 --- /dev/null +++ b/advanced/src/mock_charts/mock_progress_heat.js @@ -0,0 +1,153 @@ +import { GridWidget } from "@polaris/dashboard-sdk"; + +const data = [ + { + type: "heatmap", + name: "Block 1", + options: { + showLegend: false, + }, + data: + [ + { + group: "A", + variable: "v1", + value: 12 + }, + { + group: "B", + variable: "v1", + value: 82 + }, + { + group: "C", + variable: "v1", + value: 23 + }, + { + group: "D", + variable: "v1", + value: 89 + }, + { + group: "E", + variable: "v1", + value: 75 + }, + { + group: "F", + variable: "v1", + value: 38 + }, + { + group: "G", + variable: "v1", + value: 25 + }, + ] + }, + { + type: "heatmap", + name: "Block 2", + options: { + showLegend: false, + }, + data: + [ + { + group: "A", + variable: "v1", + value: 12 + }, + { + group: "B", + variable: "v1", + value: 82 + }, + { + group: "C", + variable: "v1", + value: 23 + }, + { + group: "D", + variable: "v1", + value: 89 + }, + { + group: "E", + variable: "v1", + value: 75 + }, + { + group: "F", + variable: "v1", + value: 38 + }, + { + group: "G", + variable: "v1", + value: 25 + }, + ] + }, + { + type: "heatmap", + name: "Block 3", + options: { + showLegend: false, + }, + data: + [ + { + group: "A", + variable: "v1", + value: 12 + }, + { + group: "B", + variable: "v1", + value: 82 + }, + { + group: "C", + variable: "v1", + value: 23 + }, + { + group: "D", + variable: "v1", + value: 89 + }, + { + group: "E", + variable: "v1", + value: 75 + }, + { + group: "F", + variable: "v1", + value: 38 + }, + { + group: "G", + variable: "v1", + value: 25 + }, + ] + } +] + + +export function mockProgressHeat(onShowDesc) { + return { "heat-progress-widget" : + new GridWidget( + "Kursfortschritt", + "Fortschritt in den einzelnen Kursblöcken", + data, + { + direction: "column", + onShowDesc: onShowDesc + }) + } +} diff --git a/advanced/src/mock_charts/mock_scatter_grid.js b/advanced/src/mock_charts/mock_scatter_grid.js new file mode 100644 index 0000000000000000000000000000000000000000..70bf01291fe08874168606f1dac0f96b994f0acb --- /dev/null +++ b/advanced/src/mock_charts/mock_scatter_grid.js @@ -0,0 +1,137 @@ +import { GridWidget } from "@polaris/dashboard-sdk"; + +const data = [ + { + type: "scatterchart", + name: "0-25%", + options: { + showLegend: false, + showAxes: false, + xmax: 10, + ymax: 100 + }, + data: + [ + {column1: 0, column2: 40, highlight: false}, + {column1: 2, column2: 26, highlight: false}, + {column1: 5, column2: 28, highlight: false}, + {column1: 7, column2: 17, highlight: false}, + {column1: 9, column2: 39, highlight: false}, + {column1: 10, column2: 60, highlight: false}, + {column1: 8, column2: 78, highlight: false}, + {column1: 6, column2: 15, highlight: false}, + {column1: 4, column2: 4, highlight: false}, + ] + }, + { + type: "scatterchart", + name: "26-50%", + options: { + showLegend: false, + showAxes: false, + xmax: 10, + ymax: 100 + }, + data: + [ + {column1: 1, column2: 42, highlight: false}, + {column1: 2, column2: 54, highlight: false}, + {column1: 3, column2: 87, highlight: false}, + {column1: 4, column2: 65, highlight: false}, + {column1: 5, column2: 78, highlight: false}, + {column1: 6, column2: 92, highlight: false}, + {column1: 7, column2: 12, highlight: false}, + {column1: 8, column2: 54, highlight: false}, + {column1: 9, column2: 34, highlight: false}, + {column1: 10, column2: 42, highlight: false}, + {column1: 1, column2: 27, highlight: false}, + {column1: 2, column2: 29, highlight: false}, + {column1: 3, column2: 11, highlight: false}, + {column1: 4, column2: 37, highlight: false}, + {column1: 5, column2: 10, highlight: false}, + {column1: 6, column2: 18, highlight: false}, + {column1: 7, column2: 95, highlight: false}, + {column1: 8, column2: 2, highlight: false}, + ] + }, + { + type: "scatterchart", + name: "51-75%", + options: { + showLegend: false, + showAxes: false, + xmax: 10, + ymax: 100 + }, + data: + [ + {column1: 1, column2: 32, highlight: false}, + {column1: 2, column2: 34, highlight: false}, + {column1: 3, column2: 27, highlight: false}, + {column1: 4, column2: 45, highlight: false}, + {column1: 5, column2: 58, highlight: false}, + {column1: 6, column2: 72, highlight: false}, + {column1: 7, column2: 87, highlight: false}, + {column1: 8, column2: 80, highlight: false}, + {column1: 9, column2: 18, highlight: false}, + {column1: 10, column2: 25, highlight: false}, + {column1: 1, column2: 34, highlight: false}, + {column1: 2, column2: 46, highlight: false}, + {column1: 3, column2: 58, highlight: false}, + {column1: 4, column2: 37, highlight: false}, + {column1: 5, column2: 9, highlight: false}, + {column1: 6, column2: 10, highlight: false}, + ] + }, + { + type: "scatterchart", + name: "76-100%", + options: { + showLegend: false, + showAxes: false, + xmax: 10, + ymax: 100 + }, + data: + [ + {column1: 1, column2: 32, highlight: false}, + {column1: 2, column2: 34, highlight: false}, + {column1: 3, column2: 27, highlight: false}, + {column1: 4, column2: 75, highlight: false}, + {column1: 5, column2: 98, highlight: false}, + {column1: 6, column2: 62, highlight: false}, + {column1: 7, column2: 72, highlight: false}, + {column1: 8, column2: 24, highlight: false}, + {column1: 9, column2: 34, highlight: true}, + {column1: 10, column2: 44, highlight: false}, + {column1: 1, column2: 67, highlight: false}, + {column1: 2, column2: 89, highlight: false}, + {column1: 3, column2: 21, highlight: false}, + {column1: 4, column2: 17, highlight: false}, + {column1: 5, column2: 80, highlight: false}, + {column1: 6, column2: 68, highlight: false}, + {column1: 7, column2: 45, highlight: false}, + {column1: 8, column2: 44, highlight: false}, + {column1: 9, column2: 26, highlight: false}, + {column1: 10, column2: 28, highlight: false}, + {column1: 1, column2: 17, highlight: false}, + {column1: 2, column2: 9, highlight: false}, + {column1: 3, column2: 6, highlight: false}, + ] + } +] + + +export function mockScatterGrid(onShowDesc) +{ + return { "scatter-grid-widget" : + new GridWidget( + "Kursvergleich", + "Vergleich mit anderen Studierenden", + data, + { + direction: "row", + onShowDesc: onShowDesc + }) + } +} diff --git a/advanced/webpack.config.js b/advanced/webpack.config.js new file mode 100644 index 0000000000000000000000000000000000000000..5e7070616f457d7987ab5715ad059cea84c0f082 --- /dev/null +++ b/advanced/webpack.config.js @@ -0,0 +1,75 @@ +const HtmlWebpackPlugin = require("html-webpack-plugin"); +const MiniCssExtractPlugin = require("mini-css-extract-plugin"); +const path = require("path"); + +module.exports = { + entry: "./src/index.js", + output: { + path: path.resolve(__dirname, "dist"), + filename: "bundle.js", + assetModuleFilename: 'assets/[hash][ext][query]' + }, + devtool: 'eval-source-map', + + module: { + rules: [ + { + test: /\.js$/, + exclude: /(node_modules|bower_components)/, + use: { + loader: "babel-loader", + options: { + presets: ["@babel/preset-env", "@babel/preset-react"], + plugins: ["@babel/plugin-proposal-object-rest-spread"], + }, + }, + }, + + { + test: /\.(scss|css)$/, + use: ['style-loader', 'css-loader', 'sass-loader'], + }, + + { + test: /\.(gif|jpeg|jpg|png|svg|webp)$/, + type: 'asset' + }, + + { + test: /\.(eot|svg|ttf|woff|woff2)$/, + use: [ + { + loader: "file-loader", + options: { + name: "[path]/[name].[ext]", + include: [/fonts/], + }, + }, + ], + }, + ], + }, + + plugins: [ + new HtmlWebpackPlugin({ + title: "RUB Dashboard", + template: "src/index.html", + inject: false, + }), + ], + devServer: { + static: { + directory: path.join(__dirname, ""), + }, + host: "0.0.0.0", + port: 8005, + allowedHosts: "all", + client: { + overlay: { + errors: true, + }, + progress: true, + }, + historyApiFallback: { index: "/", disableDotRule: true }, + }, +}; diff --git a/dist/bundle.js b/dist/bundle.js index 3bc72e3476f8a68cf9f5b085ea8ff61b7bbbfaa8..adf0bbbe7ef348fef1cdb4df78f690603871cd8a 100644 --- a/dist/bundle.js +++ b/dist/bundle.js @@ -1,2 +1,2 @@ /*! For license information please see bundle.js.LICENSE.txt */ -!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports["dashboard-sdk"]=e():t["dashboard-sdk"]=e()}(self,(()=>(()=>{var t={280:()=>{},744:(t,e,i)=>{"use strict";i.d(e,{Z:()=>d});var n=i(81),r=i.n(n),o=i(645),s=i.n(o),a=i(667),l=i.n(a),c=new URL(i(810),i.b),h=s()(r()),u=l()(c);h.push([t.id,":root .grid-stack-item>.ui-resizable-handle{filter:none}.grid-stack{position:relative}.grid-stack.grid-stack-rtl{direction:ltr}.grid-stack.grid-stack-rtl>.grid-stack-item{direction:rtl}.grid-stack .grid-stack-placeholder>.placeholder-content{background-color:rgba(0,0,0,0.1);margin:0;position:absolute;width:auto;z-index:0 !important;text-align:center}.grid-stack>.grid-stack-item{min-width:8.3333333333%;position:absolute;padding:0}.grid-stack>.grid-stack-item>.grid-stack-item-content{margin:0;position:absolute;width:auto;overflow-x:hidden;overflow-y:auto}.grid-stack>.grid-stack-item>.ui-resizable-handle{position:absolute;font-size:.1px;display:block;-ms-touch-action:none;touch-action:none}.grid-stack>.grid-stack-item.ui-resizable-autohide>.ui-resizable-handle,.grid-stack>.grid-stack-item.ui-resizable-disabled>.ui-resizable-handle{display:none}.grid-stack>.grid-stack-item>.ui-resizable-se,.grid-stack>.grid-stack-item>.ui-resizable-sw{background-image:url("+u+');background-repeat:no-repeat;background-position:center;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg)}.grid-stack>.grid-stack-item>.ui-resizable-se{-webkit-transform:rotate(-45deg);-moz-transform:rotate(-45deg);-ms-transform:rotate(-45deg);-o-transform:rotate(-45deg);transform:rotate(-45deg)}.grid-stack>.grid-stack-item>.ui-resizable-nw{cursor:nw-resize;width:20px;height:20px;top:0}.grid-stack>.grid-stack-item>.ui-resizable-n{cursor:n-resize;height:10px;top:0;left:25px;right:25px}.grid-stack>.grid-stack-item>.ui-resizable-ne{cursor:ne-resize;width:20px;height:20px;top:0}.grid-stack>.grid-stack-item>.ui-resizable-e{cursor:e-resize;width:10px;top:15px;bottom:15px}.grid-stack>.grid-stack-item>.ui-resizable-se{cursor:se-resize;width:20px;height:20px}.grid-stack>.grid-stack-item>.ui-resizable-s{cursor:s-resize;height:10px;left:25px;bottom:0;right:25px}.grid-stack>.grid-stack-item>.ui-resizable-sw{cursor:sw-resize;width:20px;height:20px}.grid-stack>.grid-stack-item>.ui-resizable-w{cursor:w-resize;width:10px;top:15px;bottom:15px}.grid-stack>.grid-stack-item.ui-draggable-dragging>.ui-resizable-handle{display:none !important}.grid-stack>.grid-stack-item[gs-w="0"]{width:0%}.grid-stack>.grid-stack-item[gs-x="0"]{left:0}.grid-stack>.grid-stack-item[gs-min-w="0"]{min-width:0}.grid-stack>.grid-stack-item[gs-max-w="0"]{max-width:0%}.grid-stack>.grid-stack-item[gs-w="1"]{width:8.3333333333%}.grid-stack>.grid-stack-item[gs-x="1"]{left:8.3333333333%}.grid-stack>.grid-stack-item[gs-min-w="1"]{min-width:8.3333333333%}.grid-stack>.grid-stack-item[gs-max-w="1"]{max-width:8.3333333333%}.grid-stack>.grid-stack-item[gs-w="2"]{width:16.6666666667%}.grid-stack>.grid-stack-item[gs-x="2"]{left:16.6666666667%}.grid-stack>.grid-stack-item[gs-min-w="2"]{min-width:16.6666666667%}.grid-stack>.grid-stack-item[gs-max-w="2"]{max-width:16.6666666667%}.grid-stack>.grid-stack-item[gs-w="3"]{width:25%}.grid-stack>.grid-stack-item[gs-x="3"]{left:25%}.grid-stack>.grid-stack-item[gs-min-w="3"]{min-width:25%}.grid-stack>.grid-stack-item[gs-max-w="3"]{max-width:25%}.grid-stack>.grid-stack-item[gs-w="4"]{width:33.3333333333%}.grid-stack>.grid-stack-item[gs-x="4"]{left:33.3333333333%}.grid-stack>.grid-stack-item[gs-min-w="4"]{min-width:33.3333333333%}.grid-stack>.grid-stack-item[gs-max-w="4"]{max-width:33.3333333333%}.grid-stack>.grid-stack-item[gs-w="5"]{width:41.6666666667%}.grid-stack>.grid-stack-item[gs-x="5"]{left:41.6666666667%}.grid-stack>.grid-stack-item[gs-min-w="5"]{min-width:41.6666666667%}.grid-stack>.grid-stack-item[gs-max-w="5"]{max-width:41.6666666667%}.grid-stack>.grid-stack-item[gs-w="6"]{width:50%}.grid-stack>.grid-stack-item[gs-x="6"]{left:50%}.grid-stack>.grid-stack-item[gs-min-w="6"]{min-width:50%}.grid-stack>.grid-stack-item[gs-max-w="6"]{max-width:50%}.grid-stack>.grid-stack-item[gs-w="7"]{width:58.3333333333%}.grid-stack>.grid-stack-item[gs-x="7"]{left:58.3333333333%}.grid-stack>.grid-stack-item[gs-min-w="7"]{min-width:58.3333333333%}.grid-stack>.grid-stack-item[gs-max-w="7"]{max-width:58.3333333333%}.grid-stack>.grid-stack-item[gs-w="8"]{width:66.6666666667%}.grid-stack>.grid-stack-item[gs-x="8"]{left:66.6666666667%}.grid-stack>.grid-stack-item[gs-min-w="8"]{min-width:66.6666666667%}.grid-stack>.grid-stack-item[gs-max-w="8"]{max-width:66.6666666667%}.grid-stack>.grid-stack-item[gs-w="9"]{width:75%}.grid-stack>.grid-stack-item[gs-x="9"]{left:75%}.grid-stack>.grid-stack-item[gs-min-w="9"]{min-width:75%}.grid-stack>.grid-stack-item[gs-max-w="9"]{max-width:75%}.grid-stack>.grid-stack-item[gs-w="10"]{width:83.3333333333%}.grid-stack>.grid-stack-item[gs-x="10"]{left:83.3333333333%}.grid-stack>.grid-stack-item[gs-min-w="10"]{min-width:83.3333333333%}.grid-stack>.grid-stack-item[gs-max-w="10"]{max-width:83.3333333333%}.grid-stack>.grid-stack-item[gs-w="11"]{width:91.6666666667%}.grid-stack>.grid-stack-item[gs-x="11"]{left:91.6666666667%}.grid-stack>.grid-stack-item[gs-min-w="11"]{min-width:91.6666666667%}.grid-stack>.grid-stack-item[gs-max-w="11"]{max-width:91.6666666667%}.grid-stack>.grid-stack-item[gs-w="12"]{width:100%}.grid-stack>.grid-stack-item[gs-x="12"]{left:100%}.grid-stack>.grid-stack-item[gs-min-w="12"]{min-width:100%}.grid-stack>.grid-stack-item[gs-max-w="12"]{max-width:100%}.grid-stack.grid-stack-1>.grid-stack-item{min-width:100%}.grid-stack.grid-stack-1>.grid-stack-item[gs-w="1"]{width:100%}.grid-stack.grid-stack-1>.grid-stack-item[gs-x="1"]{left:100%}.grid-stack.grid-stack-1>.grid-stack-item[gs-min-w="1"]{min-width:100%}.grid-stack.grid-stack-1>.grid-stack-item[gs-max-w="1"]{max-width:100%}.grid-stack.grid-stack-animate,.grid-stack.grid-stack-animate .grid-stack-item{-webkit-transition:left .3s,top .3s,height .3s,width .3s;-moz-transition:left .3s,top .3s,height .3s,width .3s;-ms-transition:left .3s,top .3s,height .3s,width .3s;-o-transition:left .3s,top .3s,height .3s,width .3s;transition:left .3s,top .3s,height .3s,width .3s}.grid-stack.grid-stack-animate .grid-stack-item.grid-stack-placeholder,.grid-stack.grid-stack-animate .grid-stack-item.ui-draggable-dragging,.grid-stack.grid-stack-animate .grid-stack-item.ui-resizable-resizing{-webkit-transition:left 0s,top 0s,height 0s,width 0s;-moz-transition:left 0s,top 0s,height 0s,width 0s;-ms-transition:left 0s,top 0s,height 0s,width 0s;-o-transition:left 0s,top 0s,height 0s,width 0s;transition:left 0s,top 0s,height 0s,width 0s}.ui-draggable-dragging,.ui-resizable-resizing{z-index:100}.ui-draggable-dragging>.grid-stack-item-content,.ui-resizable-resizing>.grid-stack-item-content{box-shadow:1px 4px 6px rgba(0,0,0,0.2);opacity:.8}.ui-draggable-dragging{will-change:left,top;cursor:move}.ui-resizable-resizing{will-change:width,height}\n',""]);const d=h},466:(t,e,i)=>{"use strict";i.d(e,{Z:()=>a});var n=i(81),r=i.n(n),o=i(645),s=i.n(o)()(r());s.push([t.id,'.chart-title{font-size:20px;font-weight:bold}.chart-subtitle{font-size:15px;font-weight:bold;text-align:center}.chart-subtitle.column{width:100%;text-align:left !important}.chart-error-message{font-size:15px;font-style:italic}.chart-path{fill:none;stroke-width:1.5}.chart-area{stroke-width:1.5}.listening-rect{stroke:grey;fill:white}.question-mark{cursor:pointer;opacity:0.2;transform:scale(0.05);-ms-transform:scale(0.05);-webkit-transform:scale(0.05)}.question-mark:hover{opacity:0.5}.question-mark-legacy{cursor:pointer;opacity:0.2;float:right;margin-right:5px;border:3px solid black;border-radius:15px;height:30px;width:30px;text-align:center;line-height:22px;font-family:monospace;font-weight:bold;font-size:27px;transform:scale(0.8);-ms-transform:scale(0.8);-webkit-transform:scale(0.8)}.question-mark-legacy:hover{opacity:0.5}.grid-stack-item-content{overflow:hidden !important;box-shadow:0 1px 3px rgba(0,0,0,0.12),0 1px 2px rgba(0,0,0,0.24);transition:all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1);background:#fff}.grid-stack-item-removing{opacity:0.5}.subgrid{margin-right:20px}.grid-stack>.grid-stack-item.grid-stack-sub-grid>.grid-stack-item-content{background:rgba(0,0,0,0.05)}.grid-stack.grid-stack-nested{background:none;position:absolute;inset:0}body{height:100%;margin:0;padding:0}.wrapper{display:flex;font-family:"Roboto"}.grid{width:100%;height:100%}.grid .grid-stack{min-height:500px}.sidebar-hidden{visibility:hidden;display:none}.sidebar{visibility:visible;display:flex;flex-direction:column;gap:10px;padding:10px}.dropzone-remove{border:3px dashed red;opacity:0.5;height:100px;display:flex;justify-content:center;align-items:center}.dropzone-remove:hover{opacity:1}.available-widgets{border:3px dashed grey;padding:10px;display:flex;flex-direction:column;gap:10px}\n',""]);const a=s},645:t=>{"use strict";t.exports=function(t){var e=[];return e.toString=function(){return this.map((function(e){var i="",n=void 0!==e[5];return e[4]&&(i+="@supports (".concat(e[4],") {")),e[2]&&(i+="@media ".concat(e[2]," {")),n&&(i+="@layer".concat(e[5].length>0?" ".concat(e[5]):""," {")),i+=t(e),n&&(i+="}"),e[2]&&(i+="}"),e[4]&&(i+="}"),i})).join("")},e.i=function(t,i,n,r,o){"string"==typeof t&&(t=[[null,t,void 0]]);var s={};if(n)for(var a=0;a<this.length;a++){var l=this[a][0];null!=l&&(s[l]=!0)}for(var c=0;c<t.length;c++){var h=[].concat(t[c]);n&&s[h[0]]||(void 0!==o&&(void 0===h[5]||(h[1]="@layer".concat(h[5].length>0?" ".concat(h[5]):""," {").concat(h[1],"}")),h[5]=o),i&&(h[2]?(h[1]="@media ".concat(h[2]," {").concat(h[1],"}"),h[2]=i):h[2]=i),r&&(h[4]?(h[1]="@supports (".concat(h[4],") {").concat(h[1],"}"),h[4]=r):h[4]="".concat(r)),e.push(h))}},e}},667:t=>{"use strict";t.exports=function(t,e){return e||(e={}),t?(t=String(t.__esModule?t.default:t),/^['"].*['"]$/.test(t)&&(t=t.slice(1,-1)),e.hash&&(t+=e.hash),/["'() \t\n]|(%20)/.test(t)||e.needQuotes?'"'.concat(t.replace(/"/g,'\\"').replace(/\n/g,"\\n"),'"'):t):t}},81:t=>{"use strict";t.exports=function(t){return t[1]}},249:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DDBaseImplement=void 0,e.DDBaseImplement=class{constructor(){this._eventRegister={}}get disabled(){return this._disabled}on(t,e){this._eventRegister[t]=e}off(t){delete this._eventRegister[t]}enable(){this._disabled=!1}disable(){this._disabled=!0}destroy(){delete this._eventRegister}triggerEvent(t,e){if(!this.disabled&&this._eventRegister&&this._eventRegister[t])return this._eventRegister[t](e)}}},529:(t,e,i)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DDDraggable=void 0;const n=i(427),r=i(284),o=i(249),s=i(168);class a extends o.DDBaseImplement{constructor(t,e={}){super(),this.el=t,this.option=e;let i=e.handle.substring(1);this.dragEl=t.classList.contains(i)?t:t.querySelector(e.handle)||t,this._mouseDown=this._mouseDown.bind(this),this._mouseMove=this._mouseMove.bind(this),this._mouseUp=this._mouseUp.bind(this),this.enable()}on(t,e){super.on(t,e)}off(t){super.off(t)}enable(){!1!==this.disabled&&(super.enable(),this.dragEl.addEventListener("mousedown",this._mouseDown),s.isTouch&&(this.dragEl.addEventListener("touchstart",s.touchstart),this.dragEl.addEventListener("pointerdown",s.pointerdown)),this.el.classList.remove("ui-draggable-disabled"),this.el.classList.add("ui-draggable"))}disable(t=!1){!0!==this.disabled&&(super.disable(),this.dragEl.removeEventListener("mousedown",this._mouseDown),s.isTouch&&(this.dragEl.removeEventListener("touchstart",s.touchstart),this.dragEl.removeEventListener("pointerdown",s.pointerdown)),this.el.classList.remove("ui-draggable"),t||this.el.classList.add("ui-draggable-disabled"))}destroy(){this.dragTimeout&&window.clearTimeout(this.dragTimeout),delete this.dragTimeout,this.dragging&&this._mouseUp(this.mouseDownEvent),this.disable(!0),delete this.el,delete this.helper,delete this.option,super.destroy()}updateOption(t){return Object.keys(t).forEach((e=>this.option[e]=t[e])),this}_mouseDown(t){if(n.DDManager.mouseHandled)return;if(0!==t.button)return!0;const e=t.target.nodeName.toLowerCase();return["input","textarea","button","select","option"].find((t=>t===e))||t.target.closest('[contenteditable="true"]')||(this.mouseDownEvent=t,delete this.dragging,delete n.DDManager.dragElement,delete n.DDManager.dropElement,document.addEventListener("mousemove",this._mouseMove,!0),document.addEventListener("mouseup",this._mouseUp,!0),s.isTouch&&(this.dragEl.addEventListener("touchmove",s.touchmove),this.dragEl.addEventListener("touchend",s.touchend)),t.preventDefault(),document.activeElement&&document.activeElement.blur(),n.DDManager.mouseHandled=!0),!0}_callDrag(t){if(!this.dragging)return;const e=r.Utils.initEvent(t,{target:this.el,type:"drag"});this.option.drag&&this.option.drag(e,this.ui()),this.triggerEvent("drag",e)}_mouseMove(t){var e;let i=this.mouseDownEvent;if(this.dragging)if(this._dragFollow(t),n.DDManager.pauseDrag){const e=Number.isInteger(n.DDManager.pauseDrag)?n.DDManager.pauseDrag:100;this.dragTimeout&&window.clearTimeout(this.dragTimeout),this.dragTimeout=window.setTimeout((()=>this._callDrag(t)),e)}else this._callDrag(t);else if(Math.abs(t.x-i.x)+Math.abs(t.y-i.y)>3){this.dragging=!0,n.DDManager.dragElement=this;let i=null===(e=this.el.gridstackNode)||void 0===e?void 0:e.grid;i?n.DDManager.dropElement=i.el.ddElement.ddDroppable:delete n.DDManager.dropElement,this.helper=this._createHelper(t),this._setupHelperContainmentStyle(),this.dragOffset=this._getDragOffset(t,this.el,this.helperContainment);const o=r.Utils.initEvent(t,{target:this.el,type:"dragstart"});this._setupHelperStyle(t),this.option.start&&this.option.start(o,this.ui()),this.triggerEvent("dragstart",o)}return t.preventDefault(),!0}_mouseUp(t){var e;if(document.removeEventListener("mousemove",this._mouseMove,!0),document.removeEventListener("mouseup",this._mouseUp,!0),s.isTouch&&(this.dragEl.removeEventListener("touchmove",s.touchmove,!0),this.dragEl.removeEventListener("touchend",s.touchend,!0)),this.dragging){delete this.dragging,(null===(e=n.DDManager.dropElement)||void 0===e?void 0:e.el)===this.el.parentElement&&delete n.DDManager.dropElement,this.helperContainment.style.position=this.parentOriginStylePosition||null,this.helper===this.el?this._removeHelperStyle():this.helper.remove();const i=r.Utils.initEvent(t,{target:this.el,type:"dragstop"});this.option.stop&&this.option.stop(i),this.triggerEvent("dragstop",i),n.DDManager.dropElement&&n.DDManager.dropElement.drop(t)}delete this.helper,delete this.mouseDownEvent,delete n.DDManager.dragElement,delete n.DDManager.dropElement,delete n.DDManager.mouseHandled,t.preventDefault()}_createHelper(t){let e=this.el;return"function"==typeof this.option.helper?e=this.option.helper(t):"clone"===this.option.helper&&(e=r.Utils.cloneNode(this.el)),document.body.contains(e)||r.Utils.appendTo(e,"parent"===this.option.appendTo?this.el.parentNode:this.option.appendTo),e===this.el&&(this.dragElementOriginStyle=a.originStyleProp.map((t=>this.el.style[t]))),e}_setupHelperStyle(t){this.helper.classList.add("ui-draggable-dragging");const e=this.helper.style;return e.pointerEvents="none",e["min-width"]=0,e.width=this.dragOffset.width+"px",e.height=this.dragOffset.height+"px",e.willChange="left, top",e.position="fixed",this._dragFollow(t),e.transition="none",setTimeout((()=>{this.helper&&(e.transition=null)}),0),this}_removeHelperStyle(){var t;this.helper.classList.remove("ui-draggable-dragging");let e=null===(t=this.helper)||void 0===t?void 0:t.gridstackNode;if(this.dragElementOriginStyle&&(!e||!e._isAboutToRemove)){let t=this.helper,e=this.dragElementOriginStyle.transition||null;t.style.transition=this.dragElementOriginStyle.transition="none",a.originStyleProp.forEach((e=>t.style[e]=this.dragElementOriginStyle[e]||null)),setTimeout((()=>t.style.transition=e),50)}return delete this.dragElementOriginStyle,this}_dragFollow(t){const e=this.helper.style,i=this.dragOffset;e.left=t.clientX+i.offsetLeft-0+"px",e.top=t.clientY+i.offsetTop-0+"px"}_setupHelperContainmentStyle(){return this.helperContainment=this.helper.parentElement,"fixed"!==this.helper.style.position&&(this.parentOriginStylePosition=this.helperContainment.style.position,window.getComputedStyle(this.helperContainment).position.match(/static/)&&(this.helperContainment.style.position="relative")),this}_getDragOffset(t,e,i){let n=0,o=0;if(i){const t=document.createElement("div");r.Utils.addElStyles(t,{opacity:"0",position:"fixed",top:"0px",left:"0px",width:"1px",height:"1px",zIndex:"-999999"}),i.appendChild(t);const e=t.getBoundingClientRect();i.removeChild(t),n=e.left,o=e.top}const s=e.getBoundingClientRect();return{left:s.left,top:s.top,offsetLeft:-t.clientX+s.left-n,offsetTop:-t.clientY+s.top-o,width:s.width,height:s.height}}ui(){const t=this.el.parentElement.getBoundingClientRect(),e=this.helper.getBoundingClientRect();return{position:{top:e.top-t.top,left:e.left-t.left}}}}e.DDDraggable=a,a.originStyleProp=["transition","pointerEvents","position","left","top"]},514:(t,e,i)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DDDroppable=void 0;const n=i(427),r=i(249),o=i(284),s=i(168);class a extends r.DDBaseImplement{constructor(t,e={}){super(),this.el=t,this.option=e,this._mouseEnter=this._mouseEnter.bind(this),this._mouseLeave=this._mouseLeave.bind(this),this.enable(),this._setupAccept()}on(t,e){super.on(t,e)}off(t){super.off(t)}enable(){!1!==this.disabled&&(super.enable(),this.el.classList.add("ui-droppable"),this.el.classList.remove("ui-droppable-disabled"),this.el.addEventListener("mouseenter",this._mouseEnter),this.el.addEventListener("mouseleave",this._mouseLeave),s.isTouch&&(this.el.addEventListener("pointerenter",s.pointerenter),this.el.addEventListener("pointerleave",s.pointerleave)))}disable(t=!1){!0!==this.disabled&&(super.disable(),this.el.classList.remove("ui-droppable"),t||this.el.classList.add("ui-droppable-disabled"),this.el.removeEventListener("mouseenter",this._mouseEnter),this.el.removeEventListener("mouseleave",this._mouseLeave),s.isTouch&&(this.el.removeEventListener("pointerenter",s.pointerenter),this.el.removeEventListener("pointerleave",s.pointerleave)))}destroy(){this.disable(!0),this.el.classList.remove("ui-droppable"),this.el.classList.remove("ui-droppable-disabled"),super.destroy()}updateOption(t){return Object.keys(t).forEach((e=>this.option[e]=t[e])),this._setupAccept(),this}_mouseEnter(t){if(!n.DDManager.dragElement)return;if(!this._canDrop(n.DDManager.dragElement.el))return;t.preventDefault(),t.stopPropagation(),n.DDManager.dropElement&&n.DDManager.dropElement!==this&&n.DDManager.dropElement._mouseLeave(t),n.DDManager.dropElement=this;const e=o.Utils.initEvent(t,{target:this.el,type:"dropover"});this.option.over&&this.option.over(e,this._ui(n.DDManager.dragElement)),this.triggerEvent("dropover",e),this.el.classList.add("ui-droppable-over")}_mouseLeave(t){var e;if(!n.DDManager.dragElement||n.DDManager.dropElement!==this)return;t.preventDefault(),t.stopPropagation();const i=o.Utils.initEvent(t,{target:this.el,type:"dropout"});if(this.option.out&&this.option.out(i,this._ui(n.DDManager.dragElement)),this.triggerEvent("dropout",i),n.DDManager.dropElement===this){let i;delete n.DDManager.dropElement;let r=this.el.parentElement;for(;!i&&r;)i=null===(e=r.ddElement)||void 0===e?void 0:e.ddDroppable,r=r.parentElement;i&&i._mouseEnter(t)}}drop(t){t.preventDefault();const e=o.Utils.initEvent(t,{target:this.el,type:"drop"});this.option.drop&&this.option.drop(e,this._ui(n.DDManager.dragElement)),this.triggerEvent("drop",e)}_canDrop(t){return t&&(!this.accept||this.accept(t))}_setupAccept(){return this.option.accept?("string"==typeof this.option.accept?this.accept=t=>t.matches(this.option.accept):this.accept=this.option.accept,this):this}_ui(t){return Object.assign({draggable:t.el},t.ui())}}e.DDDroppable=a},474:(t,e,i)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DDElement=void 0;const n=i(945),r=i(529),o=i(514);class s{constructor(t){this.el=t}static init(t){return t.ddElement||(t.ddElement=new s(t)),t.ddElement}on(t,e){return this.ddDraggable&&["drag","dragstart","dragstop"].indexOf(t)>-1?this.ddDraggable.on(t,e):this.ddDroppable&&["drop","dropover","dropout"].indexOf(t)>-1?this.ddDroppable.on(t,e):this.ddResizable&&["resizestart","resize","resizestop"].indexOf(t)>-1&&this.ddResizable.on(t,e),this}off(t){return this.ddDraggable&&["drag","dragstart","dragstop"].indexOf(t)>-1?this.ddDraggable.off(t):this.ddDroppable&&["drop","dropover","dropout"].indexOf(t)>-1?this.ddDroppable.off(t):this.ddResizable&&["resizestart","resize","resizestop"].indexOf(t)>-1&&this.ddResizable.off(t),this}setupDraggable(t){return this.ddDraggable?this.ddDraggable.updateOption(t):this.ddDraggable=new r.DDDraggable(this.el,t),this}cleanDraggable(){return this.ddDraggable&&(this.ddDraggable.destroy(),delete this.ddDraggable),this}setupResizable(t){return this.ddResizable?this.ddResizable.updateOption(t):this.ddResizable=new n.DDResizable(this.el,t),this}cleanResizable(){return this.ddResizable&&(this.ddResizable.destroy(),delete this.ddResizable),this}setupDroppable(t){return this.ddDroppable?this.ddDroppable.updateOption(t):this.ddDroppable=new o.DDDroppable(this.el,t),this}cleanDroppable(){return this.ddDroppable&&(this.ddDroppable.destroy(),delete this.ddDroppable),this}}e.DDElement=s},470:(t,e,i)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DDGridStack=void 0;const n=i(523),r=i(929),o=i(284),s=i(427),a=i(474);class l{static get(){return c}resizable(t,e,i,n){return this._getDDElements(t).forEach((t=>{if("disable"===e||"enable"===e)t.ddResizable&&t.ddResizable[e]();else if("destroy"===e)t.ddResizable&&t.cleanResizable();else if("option"===e)t.setupResizable({[i]:n});else{const i=t.el.gridstackNode.grid;let n=t.el.getAttribute("gs-resize-handles")?t.el.getAttribute("gs-resize-handles"):i.opts.resizable.handles,r=!i.opts.alwaysShowResizeHandle;t.setupResizable(Object.assign(Object.assign(Object.assign({},i.opts.resizable),{handles:n,autoHide:r}),{start:e.start,stop:e.stop,resize:e.resize}))}})),this}draggable(t,e,i,n){return this._getDDElements(t).forEach((t=>{if("disable"===e||"enable"===e)t.ddDraggable&&t.ddDraggable[e]();else if("destroy"===e)t.ddDraggable&&t.cleanDraggable();else if("option"===e)t.setupDraggable({[i]:n});else{const i=t.el.gridstackNode.grid;t.setupDraggable(Object.assign(Object.assign({},i.opts.draggable),{start:e.start,stop:e.stop,drag:e.drag}))}})),this}dragIn(t,e){return this._getDDElements(t).forEach((t=>t.setupDraggable(e))),this}droppable(t,e,i,n){return"function"!=typeof e.accept||e._accept||(e._accept=e.accept,e.accept=t=>e._accept(t)),this._getDDElements(t).forEach((t=>{"disable"===e||"enable"===e?t.ddDroppable&&t.ddDroppable[e]():"destroy"===e?t.ddDroppable&&t.cleanDroppable():"option"===e?t.setupDroppable({[i]:n}):t.setupDroppable(e)})),this}isDroppable(t){return!(!(t&&t.ddElement&&t.ddElement.ddDroppable)||t.ddElement.ddDroppable.disabled)}isDraggable(t){return!(!(t&&t.ddElement&&t.ddElement.ddDraggable)||t.ddElement.ddDraggable.disabled)}isResizable(t){return!(!(t&&t.ddElement&&t.ddElement.ddResizable)||t.ddElement.ddResizable.disabled)}on(t,e,i){return this._getDDElements(t).forEach((t=>t.on(e,(t=>{i(t,s.DDManager.dragElement?s.DDManager.dragElement.el:t.target,s.DDManager.dragElement?s.DDManager.dragElement.helper:null)})))),this}off(t,e){return this._getDDElements(t).forEach((t=>t.off(e))),this}_getDDElements(t,e=!0){let i=o.Utils.getElements(t);if(!i.length)return[];let n=i.map((t=>t.ddElement||(e?a.DDElement.init(t):null)));return e||n.filter((t=>t)),n}}e.DDGridStack=l;const c=new l;function h(t,e){let i=t?t.gridstackNode:void 0;i&&i.grid&&(e?i._isAboutToRemove=!0:delete i._isAboutToRemove,e?t.classList.add("grid-stack-item-removing"):t.classList.remove("grid-stack-item-removing"))}r.GridStack.prototype._setupAcceptWidget=function(){if(this.opts.staticGrid||!this.opts.acceptWidgets&&!this.opts.removable)return c.droppable(this.el,"destroy"),this;let t,e,i=(i,n,r)=>{let s=n.gridstackNode;if(!s)return;r=r||n;let a=this.el.getBoundingClientRect(),{top:l,left:h}=r.getBoundingClientRect();h-=a.left,l-=a.top;let u={position:{top:l,left:h}};if(s._temporaryRemoved){if(s.x=Math.max(0,Math.round(h/e)),s.y=Math.max(0,Math.round(l/t)),delete s.autoPosition,this.engine.nodeBoundFix(s),!this.engine.willItFit(s)){if(s.autoPosition=!0,!this.engine.willItFit(s))return void c.off(n,"drag");s._willFitPos&&(o.Utils.copyPos(s,s._willFitPos),delete s._willFitPos)}this._onStartMoving(r,i,u,s,e,t)}else this._dragOrResize(r,i,u,s,e,t)};return c.droppable(this.el,{accept:t=>{let e=t.gridstackNode;if((null==e?void 0:e.grid)===this)return!0;if(!this.opts.acceptWidgets)return!1;let i=!0;if("function"==typeof this.opts.acceptWidgets)i=this.opts.acceptWidgets(t);else{let e=!0===this.opts.acceptWidgets?".grid-stack-item":this.opts.acceptWidgets;i=t.matches(e)}if(i&&e&&this.opts.maxRow){let t={w:e.w,h:e.h,minW:e.minW,minH:e.minH};i=this.engine.willItFit(t)}return i}}).on(this.el,"dropover",((n,r,o)=>{let s=r.gridstackNode;if((null==s?void 0:s.grid)===this&&!s._temporaryRemoved)return!1;(null==s?void 0:s.grid)&&s.grid!==this&&!s._temporaryRemoved&&s.grid._leave(r,o),e=this.cellWidth(),t=this.getCellHeight(!0),s||(s=this._readAttr(r)),s.grid||(s._isExternal=!0,r.gridstackNode=s),o=o||r;let a=s.w||Math.round(o.offsetWidth/e)||1,l=s.h||Math.round(o.offsetHeight/t)||1;return s.grid&&s.grid!==this?(r._gridstackNodeOrig||(r._gridstackNodeOrig=s),r.gridstackNode=s=Object.assign(Object.assign({},s),{w:a,h:l,grid:this}),this.engine.cleanupNode(s).nodeBoundFix(s),s._initDD=s._isExternal=s._temporaryRemoved=!0):(s.w=a,s.h=l,s._temporaryRemoved=!0),h(s.el,!1),c.on(r,"drag",i),i(n,r,o),!1})).on(this.el,"dropout",((t,e,i)=>{let n=e.gridstackNode;return!!n&&(n.grid&&n.grid!==this||(this._leave(e,i),this._isTemp&&this.removeAsSubGrid(n)),!1)})).on(this.el,"drop",((t,e,i)=>{var n,r;let s=e.gridstackNode;if((null==s?void 0:s.grid)===this&&!s._isExternal)return!1;let a=!!this.placeholder.parentElement;this.placeholder.remove();let l=e._gridstackNodeOrig;if(delete e._gridstackNodeOrig,a&&(null==l?void 0:l.grid)&&l.grid!==this){let t=l.grid;t.engine.removedNodes.push(l),t._triggerRemoveEvent(),t.parentGridItem&&!t.engine.nodes.length&&t.opts.subGridDynamic&&t.removeAsSubGrid()}if(!s)return!1;if(a&&(this.engine.cleanupNode(s),s.grid=this),c.off(e,"drag"),i!==e?(i.remove(),e.gridstackNode=l,a&&(e=e.cloneNode(!0))):(e.remove(),this._removeDD(e)),!a)return!1;e.gridstackNode=s,s.el=e;let h=null===(r=null===(n=s.subGrid)||void 0===n?void 0:n.el)||void 0===r?void 0:r.gridstack;return o.Utils.copyPos(s,this._readAttr(this.placeholder)),o.Utils.removePositioningStyles(e),this._writeAttr(e,s),this.el.appendChild(e),h&&(h.parentGridItem=s,h.opts.styleInHead||h._updateStyles(!0)),this._updateContainerHeight(),this.engine.addedNodes.push(s),this._triggerAddEvent(),this._triggerChangeEvent(),this.engine.endUpdate(),this._gsEventHandler.dropped&&this._gsEventHandler.dropped(Object.assign(Object.assign({},t),{type:"dropped"}),l&&l.grid?l:void 0,s),window.setTimeout((()=>{s.el&&s.el.parentElement?this._prepareDragDropByNode(s):this.engine.removeNode(s),delete s.grid._isTemp})),!1})),this},r.GridStack.prototype._setupRemoveDrop=function(){if(!this.opts.staticGrid&&"string"==typeof this.opts.removable){let t=document.querySelector(this.opts.removable);if(!t)return this;c.isDroppable(t)||c.droppable(t,this.opts.removableOptions).on(t,"dropover",((t,e)=>h(e,!0))).on(t,"dropout",((t,e)=>h(e,!1)))}return this},r.GridStack.setupDragIn=function(t,e){void 0!==(null==e?void 0:e.pause)&&(s.DDManager.pauseDrag=e.pause),"string"==typeof t&&(e=Object.assign(Object.assign({},n.dragInDefaultOptions),e||{}),o.Utils.getElements(t).forEach((t=>{c.isDraggable(t)||c.dragIn(t,e)})))},r.GridStack.prototype._prepareDragDropByNode=function(t){let e=t.el;const i=t.noMove||this.opts.disableDrag,n=t.noResize||this.opts.disableResize;if(this.opts.staticGrid||i&&n)return t._initDD&&(this._removeDD(e),delete t._initDD),e.classList.add("ui-draggable-disabled","ui-resizable-disabled"),this;if(!t._initDD){let i,n,r=(r,o)=>{this._gsEventHandler[r.type]&&this._gsEventHandler[r.type](r,r.target),i=this.cellWidth(),n=this.getCellHeight(!0),this._onStartMoving(e,r,o,t,i,n)},s=(r,o)=>{this._dragOrResize(e,r,o,t,i,n)},a=i=>{this.placeholder.remove(),delete t._moving,delete t._event,delete t._lastTried;let n=i.target;if(n.gridstackNode&&n.gridstackNode.grid===this){if(t.el=n,t._isAboutToRemove){let r=e.gridstackNode.grid;r._gsEventHandler[i.type]&&r._gsEventHandler[i.type](i,n),this._removeDD(e),r.engine.removedNodes.push(t),r._triggerRemoveEvent(),delete e.gridstackNode,delete t.el,e.remove()}else o.Utils.removePositioningStyles(n),t._temporaryRemoved?(o.Utils.copyPos(t,t._orig),this._writePosAttr(n,t),this.engine.addNode(t)):this._writePosAttr(n,t),this._gsEventHandler[i.type]&&this._gsEventHandler[i.type](i,n);this._extraDragRow=0,this._updateContainerHeight(),this._triggerChangeEvent(),this.engine.endUpdate()}};c.draggable(e,{start:r,stop:a,drag:s}).resizable(e,{start:r,stop:a,resize:s}),t._initDD=!0}return c.draggable(e,i?"disable":"enable").resizable(e,n?"disable":"enable"),this},r.GridStack.prototype._onStartMoving=function(t,e,i,n,r,o){this.engine.cleanNodes().beginUpdate(n),this._writePosAttr(this.placeholder,n),this.el.appendChild(this.placeholder),n.el=this.placeholder,n._lastUiPosition=i.position,n._prevYPix=i.position.top,n._moving="dragstart"===e.type,delete n._lastTried,"dropover"===e.type&&n._temporaryRemoved&&(this.engine.addNode(n),n._moving=!0),this.engine.cacheRects(r,o,this.opts.marginTop,this.opts.marginRight,this.opts.marginBottom,this.opts.marginLeft),"resizestart"===e.type&&(c.resizable(t,"option","minWidth",r*(n.minW||1)).resizable(t,"option","minHeight",o*(n.minH||1)),n.maxW&&c.resizable(t,"option","maxWidth",r*n.maxW),n.maxH&&c.resizable(t,"option","maxHeight",o*n.maxH))},r.GridStack.prototype._leave=function(t,e){let i=t.gridstackNode;i&&(c.off(t,"drag"),i._temporaryRemoved||(i._temporaryRemoved=!0,this.engine.removeNode(i),i.el=i._isExternal&&e?e:t,!0===this.opts.removable&&h(t,!0),t._gridstackNodeOrig?(t.gridstackNode=t._gridstackNodeOrig,delete t._gridstackNodeOrig):i._isExternal&&(delete i.el,delete t.gridstackNode,this.engine.restoreInitial())))},r.GridStack.prototype._dragOrResize=function(t,e,i,n,r,s){let a,l=Object.assign({},n._orig),c=this.opts.marginLeft,h=this.opts.marginRight,u=this.opts.marginTop,d=this.opts.marginBottom,f=Math.round(.1*s),p=Math.round(.1*r);if(c=Math.min(c,p),h=Math.min(h,p),u=Math.min(u,f),d=Math.min(d,f),"drag"===e.type){if(n._temporaryRemoved)return;let e=i.position.top-n._prevYPix;n._prevYPix=i.position.top,o.Utils.updateScrollPosition(t,i.position,e);let a=i.position.left+(i.position.left>n._lastUiPosition.left?-h:c),f=i.position.top+(i.position.top>n._lastUiPosition.top?-d:u);l.x=Math.round(a/r),l.y=Math.round(f/s);let p=this._extraDragRow;if(this.engine.collide(n,l)){let t=this.getRow(),e=Math.max(0,l.y+n.h-t);this.opts.maxRow&&t+e>this.opts.maxRow&&(e=Math.max(0,this.opts.maxRow-t)),this._extraDragRow=e}else this._extraDragRow=0;if(this._extraDragRow!==p&&this._updateContainerHeight(),n.x===l.x&&n.y===l.y)return}else if("resize"===e.type){if(l.x<0)return;if(o.Utils.updateScrollResize(e,t,s),l.w=Math.round((i.size.width-c)/r),l.h=Math.round((i.size.height-u)/s),n.w===l.w&&n.h===l.h)return;if(n._lastTried&&n._lastTried.w===l.w&&n._lastTried.h===l.h)return;let h=i.position.left+c,d=i.position.top+u;l.x=Math.round(h/r),l.y=Math.round(d/s),a=!0}n._event=e,n._lastTried=l;let g={x:i.position.left+c,y:i.position.top+u,w:(i.size?i.size.width:n.w*r)-c-h,h:(i.size?i.size.height:n.h*s)-u-d};if(this.engine.moveNodeCheck(n,Object.assign(Object.assign({},l),{cellWidth:r,cellHeight:s,rect:g,resizing:a}))){n._lastUiPosition=i.position,this.engine.cacheRects(r,s,u,h,d,c),delete n._skipDown,a&&n.subGrid&&n.subGrid.onParentResize(),this._extraDragRow=0,this._updateContainerHeight();let t=e.target;this._writePosAttr(t,n),this._gsEventHandler[e.type]&&this._gsEventHandler[e.type](e,t)}},r.GridStack.prototype.movable=function(t,e){return this.opts.staticGrid||r.GridStack.getElements(t).forEach((t=>{let i=t.gridstackNode;i&&(e?delete i.noMove:i.noMove=!0,this._prepareDragDropByNode(i))})),this},r.GridStack.prototype.resizable=function(t,e){return this.opts.staticGrid||r.GridStack.getElements(t).forEach((t=>{let i=t.gridstackNode;i&&(e?delete i.noResize:i.noResize=!0,this._prepareDragDropByNode(i))})),this},r.GridStack.prototype.disable=function(){if(!this.opts.staticGrid)return this.enableMove(!1),this.enableResize(!1),this._triggerEvent("disable"),this},r.GridStack.prototype.enable=function(){if(!this.opts.staticGrid)return this.enableMove(!0),this.enableResize(!0),this._triggerEvent("enable"),this},r.GridStack.prototype.enableMove=function(t){return this.opts.staticGrid||(this.opts.disableDrag=!t,this.engine.nodes.forEach((e=>this.movable(e.el,t)))),this},r.GridStack.prototype.enableResize=function(t){return this.opts.staticGrid||(this.opts.disableResize=!t,this.engine.nodes.forEach((e=>this.resizable(e.el,t)))),this},r.GridStack.prototype._removeDD=function(t){return c.draggable(t,"destroy").resizable(t,"destroy"),t.gridstackNode&&delete t.gridstackNode._initDD,delete t.ddElement,this}},427:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DDManager=void 0,e.DDManager=class{}},952:(t,e,i)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DDResizableHandle=void 0;const n=i(168);class r{constructor(t,e,i){this.moving=!1,this.host=t,this.dir=e,this.option=i,this._mouseDown=this._mouseDown.bind(this),this._mouseMove=this._mouseMove.bind(this),this._mouseUp=this._mouseUp.bind(this),this._init()}_init(){const t=document.createElement("div");return t.classList.add("ui-resizable-handle"),t.classList.add(`${r.prefix}${this.dir}`),t.style.zIndex="100",t.style.userSelect="none",this.el=t,this.host.appendChild(this.el),this.el.addEventListener("mousedown",this._mouseDown),n.isTouch&&(this.el.addEventListener("touchstart",n.touchstart),this.el.addEventListener("pointerdown",n.pointerdown)),this}destroy(){return this.moving&&this._mouseUp(this.mouseDownEvent),this.el.removeEventListener("mousedown",this._mouseDown),n.isTouch&&(this.el.removeEventListener("touchstart",n.touchstart),this.el.removeEventListener("pointerdown",n.pointerdown)),this.host.removeChild(this.el),delete this.el,delete this.host,this}_mouseDown(t){this.mouseDownEvent=t,document.addEventListener("mousemove",this._mouseMove,!0),document.addEventListener("mouseup",this._mouseUp,!0),n.isTouch&&(this.el.addEventListener("touchmove",n.touchmove),this.el.addEventListener("touchend",n.touchend)),t.stopPropagation(),t.preventDefault()}_mouseMove(t){let e=this.mouseDownEvent;this.moving?this._triggerEvent("move",t):Math.abs(t.x-e.x)+Math.abs(t.y-e.y)>2&&(this.moving=!0,this._triggerEvent("start",this.mouseDownEvent),this._triggerEvent("move",t)),t.stopPropagation(),t.preventDefault()}_mouseUp(t){this.moving&&this._triggerEvent("stop",t),document.removeEventListener("mousemove",this._mouseMove,!0),document.removeEventListener("mouseup",this._mouseUp,!0),n.isTouch&&(this.el.removeEventListener("touchmove",n.touchmove),this.el.removeEventListener("touchend",n.touchend)),delete this.moving,delete this.mouseDownEvent,t.stopPropagation(),t.preventDefault()}_triggerEvent(t,e){return this.option[t]&&this.option[t](e),this}}e.DDResizableHandle=r,r.prefix="ui-resizable-"},945:(t,e,i)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DDResizable=void 0;const n=i(952),r=i(249),o=i(284),s=i(427);class a extends r.DDBaseImplement{constructor(t,e={}){super(),this._ui=()=>{const t=this.el.parentElement.getBoundingClientRect(),e={width:this.originalRect.width,height:this.originalRect.height+this.scrolled,left:this.originalRect.left,top:this.originalRect.top-this.scrolled},i=this.temporalRect||e;return{position:{left:i.left-t.left,top:i.top-t.top},size:{width:i.width,height:i.height}}},this.el=t,this.option=e,this._mouseOver=this._mouseOver.bind(this),this._mouseOut=this._mouseOut.bind(this),this.enable(),this._setupAutoHide(this.option.autoHide),this._setupHandlers()}on(t,e){super.on(t,e)}off(t){super.off(t)}enable(){super.enable(),this.el.classList.add("ui-resizable"),this.el.classList.remove("ui-resizable-disabled"),this._setupAutoHide(this.option.autoHide)}disable(){super.disable(),this.el.classList.add("ui-resizable-disabled"),this.el.classList.remove("ui-resizable"),this._setupAutoHide(!1)}destroy(){this._removeHandlers(),this._setupAutoHide(!1),this.el.classList.remove("ui-resizable"),delete this.el,super.destroy()}updateOption(t){let e=t.handles&&t.handles!==this.option.handles,i=t.autoHide&&t.autoHide!==this.option.autoHide;return Object.keys(t).forEach((e=>this.option[e]=t[e])),e&&(this._removeHandlers(),this._setupHandlers()),i&&this._setupAutoHide(this.option.autoHide),this}_setupAutoHide(t){return t?(this.el.classList.add("ui-resizable-autohide"),this.el.addEventListener("mouseover",this._mouseOver),this.el.addEventListener("mouseout",this._mouseOut)):(this.el.classList.remove("ui-resizable-autohide"),this.el.removeEventListener("mouseover",this._mouseOver),this.el.removeEventListener("mouseout",this._mouseOut),s.DDManager.overResizeElement===this&&delete s.DDManager.overResizeElement),this}_mouseOver(t){s.DDManager.overResizeElement||s.DDManager.dragElement||(s.DDManager.overResizeElement=this,this.el.classList.remove("ui-resizable-autohide"))}_mouseOut(t){s.DDManager.overResizeElement===this&&(delete s.DDManager.overResizeElement,this.el.classList.add("ui-resizable-autohide"))}_setupHandlers(){let t=this.option.handles||"e,s,se";return"all"===t&&(t="n,e,s,w,se,sw,ne,nw"),this.handlers=t.split(",").map((t=>t.trim())).map((t=>new n.DDResizableHandle(this.el,t,{start:t=>{this._resizeStart(t)},stop:t=>{this._resizeStop(t)},move:e=>{this._resizing(e,t)}}))),this}_resizeStart(t){this.originalRect=this.el.getBoundingClientRect(),this.scrollEl=o.Utils.getScrollElement(this.el),this.scrollY=this.scrollEl.scrollTop,this.scrolled=0,this.startEvent=t,this._setupHelper(),this._applyChange();const e=o.Utils.initEvent(t,{type:"resizestart",target:this.el});return this.option.start&&this.option.start(e,this._ui()),this.el.classList.add("ui-resizable-resizing"),this.triggerEvent("resizestart",e),this}_resizing(t,e){this.scrolled=this.scrollEl.scrollTop-this.scrollY,this.temporalRect=this._getChange(t,e),this._applyChange();const i=o.Utils.initEvent(t,{type:"resize",target:this.el});return this.option.resize&&this.option.resize(i,this._ui()),this.triggerEvent("resize",i),this}_resizeStop(t){const e=o.Utils.initEvent(t,{type:"resizestop",target:this.el});return this.option.stop&&this.option.stop(e),this.el.classList.remove("ui-resizable-resizing"),this.triggerEvent("resizestop",e),this._cleanHelper(),delete this.startEvent,delete this.originalRect,delete this.temporalRect,delete this.scrollY,delete this.scrolled,this}_setupHelper(){return this.elOriginStyleVal=a._originStyleProp.map((t=>this.el.style[t])),this.parentOriginStylePosition=this.el.parentElement.style.position,window.getComputedStyle(this.el.parentElement).position.match(/static/)&&(this.el.parentElement.style.position="relative"),this.el.style.position="absolute",this.el.style.opacity="0.8",this}_cleanHelper(){return a._originStyleProp.forEach(((t,e)=>{this.el.style[t]=this.elOriginStyleVal[e]||null})),this.el.parentElement.style.position=this.parentOriginStylePosition||null,this}_getChange(t,e){const i=this.startEvent,n={width:this.originalRect.width,height:this.originalRect.height+this.scrolled,left:this.originalRect.left,top:this.originalRect.top-this.scrolled},r=t.clientX-i.clientX,o=t.clientY-i.clientY;e.indexOf("e")>-1?n.width+=r:e.indexOf("w")>-1&&(n.width-=r,n.left+=r),e.indexOf("s")>-1?n.height+=o:e.indexOf("n")>-1&&(n.height-=o,n.top+=o);const s=this._constrainSize(n.width,n.height);return Math.round(n.width)!==Math.round(s.width)&&(e.indexOf("w")>-1&&(n.left+=n.width-s.width),n.width=s.width),Math.round(n.height)!==Math.round(s.height)&&(e.indexOf("n")>-1&&(n.top+=n.height-s.height),n.height=s.height),n}_constrainSize(t,e){const i=this.option.maxWidth||Number.MAX_SAFE_INTEGER,n=this.option.minWidth||t,r=this.option.maxHeight||Number.MAX_SAFE_INTEGER,o=this.option.minHeight||e;return{width:Math.min(i,Math.max(n,t)),height:Math.min(r,Math.max(o,e))}}_applyChange(){let t={left:0,top:0,width:0,height:0};if("absolute"===this.el.style.position){const e=this.el.parentElement,{left:i,top:n}=e.getBoundingClientRect();t={left:i,top:n,width:0,height:0}}return this.temporalRect?(Object.keys(this.temporalRect).forEach((e=>{const i=this.temporalRect[e];this.el.style[e]=i-t[e]+"px"})),this):this}_removeHandlers(){return this.handlers.forEach((t=>t.destroy())),delete this.handlers,this}}e.DDResizable=a,a._originStyleProp=["width","height","position","left","top","opacity","zIndex"]},168:(t,e,i)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.pointerleave=e.pointerenter=e.pointerdown=e.touchend=e.touchmove=e.touchstart=e.isTouch=void 0;const n=i(427);e.isTouch="undefined"!=typeof window&&"undefined"!=typeof document&&("ontouchstart"in document||"ontouchstart"in window||window.DocumentTouch&&document instanceof window.DocumentTouch||navigator.maxTouchPoints>0||navigator.msMaxTouchPoints>0);class r{}function o(t,e){if(t.touches.length>1)return;t.cancelable&&t.preventDefault();const i=t.changedTouches[0],n=document.createEvent("MouseEvents");n.initMouseEvent(e,!0,!0,window,1,i.screenX,i.screenY,i.clientX,i.clientY,!1,!1,!1,!1,0,null),t.target.dispatchEvent(n)}function s(t,e){t.cancelable&&t.preventDefault();const i=document.createEvent("MouseEvents");i.initMouseEvent(e,!0,!0,window,1,t.screenX,t.screenY,t.clientX,t.clientY,!1,!1,!1,!1,0,null),t.target.dispatchEvent(i)}e.touchstart=function(t){r.touchHandled||(r.touchHandled=!0,o(t,"mousedown"))},e.touchmove=function(t){r.touchHandled&&o(t,"mousemove")},e.touchend=function(t){if(!r.touchHandled)return;r.pointerLeaveTimeout&&(window.clearTimeout(r.pointerLeaveTimeout),delete r.pointerLeaveTimeout);const e=!!n.DDManager.dragElement;o(t,"mouseup"),e||o(t,"click"),r.touchHandled=!1},e.pointerdown=function(t){t.target.releasePointerCapture(t.pointerId)},e.pointerenter=function(t){n.DDManager.dragElement&&s(t,"mouseenter")},e.pointerleave=function(t){n.DDManager.dragElement&&(r.pointerLeaveTimeout=window.setTimeout((()=>{delete r.pointerLeaveTimeout,s(t,"mouseleave")}),10))}},935:(t,e,i)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.GridStackEngine=void 0;const n=i(284);class r{constructor(t={}){this.addedNodes=[],this.removedNodes=[],this.column=t.column||12,this.maxRow=t.maxRow,this._float=t.float,this.nodes=t.nodes||[],this.onChange=t.onChange}batchUpdate(t=!0){return!!this.batchMode===t||(this.batchMode=t,t?(this._prevFloat=this._float,this._float=!0,this.saveInitial()):(this._float=this._prevFloat,delete this._prevFloat,this._packNodes()._notify())),this}_useEntireRowArea(t,e){return!this.float&&!this._hasLocked&&(!t._moving||t._skipDown||e.y<=t.y)}_fixCollisions(t,e=t,i,r={}){if(this.sortNodes(-1),!(i=i||this.collide(t,e)))return!1;if(t._moving&&!r.nested&&!this.float&&this.swap(t,i))return!0;let o=e;this._useEntireRowArea(t,e)&&(o={x:0,w:this.column,y:e.y,h:e.h},i=this.collide(t,o,r.skip));let s=!1,a={nested:!0,pack:!1};for(;i=i||this.collide(t,o,r.skip);){let o;if(i.locked||t._moving&&!t._skipDown&&e.y>t.y&&!this.float&&(!this.collide(i,Object.assign(Object.assign({},i),{y:t.y}),t)||!this.collide(i,Object.assign(Object.assign({},i),{y:e.y-i.h}),t))?(t._skipDown=t._skipDown||e.y>t.y,o=this.moveNode(t,Object.assign(Object.assign(Object.assign({},e),{y:i.y+i.h}),a)),i.locked&&o?n.Utils.copyPos(e,t):!i.locked&&o&&r.pack&&(this._packNodes(),e.y=i.y+i.h,n.Utils.copyPos(t,e)),s=s||o):o=this.moveNode(i,Object.assign(Object.assign(Object.assign({},i),{y:e.y+e.h,skip:t}),a)),!o)return s;i=void 0}return s}collide(t,e=t,i){return this.nodes.find((r=>r!==t&&r!==i&&n.Utils.isIntercepted(r,e)))}collideAll(t,e=t,i){return this.nodes.filter((r=>r!==t&&r!==i&&n.Utils.isIntercepted(r,e)))}directionCollideCoverage(t,e,i){if(!e.rect||!t._rect)return;let n,r=t._rect,o=Object.assign({},e.rect);return o.y>r.y?(o.h+=o.y-r.y,o.y=r.y):o.h+=r.y-o.y,o.x>r.x?(o.w+=o.x-r.x,o.x=r.x):o.w+=r.x-o.x,i.forEach((t=>{if(t.locked||!t._rect)return;let e=t._rect,i=Number.MAX_VALUE,s=Number.MAX_VALUE,a=.5;r.y<e.y?i=(o.y+o.h-e.y)/e.h:r.y+r.h>e.y+e.h&&(i=(e.y+e.h-o.y)/e.h),r.x<e.x?s=(o.x+o.w-e.x)/e.w:r.x+r.w>e.x+e.w&&(s=(e.x+e.w-o.x)/e.w);let l=Math.min(s,i);l>a&&(a=l,n=t)})),e.collide=n,n}cacheRects(t,e,i,n,r,o){return this.nodes.forEach((s=>s._rect={y:s.y*e+i,x:s.x*t+o,w:s.w*t-o-n,h:s.h*e-i-r})),this}swap(t,e){if(!e||e.locked||!t||t.locked)return!1;function i(){let i=e.x,n=e.y;return e.x=t.x,e.y=t.y,t.h!=e.h?(t.x=i,t.y=e.y+e.h):t.w!=e.w?(t.x=e.x+e.w,t.y=n):(t.x=i,t.y=n),t._dirty=e._dirty=!0,!0}let r;if(t.w===e.w&&t.h===e.h&&(t.x===e.x||t.y===e.y)&&(r=n.Utils.isTouching(t,e)))return i();if(!1!==r){if(t.w===e.w&&t.x===e.x&&(r||(r=n.Utils.isTouching(t,e)))){if(e.y<t.y){let i=t;t=e,e=i}return i()}if(!1!==r){if(t.h===e.h&&t.y===e.y&&(r||(r=n.Utils.isTouching(t,e)))){if(e.x<t.x){let i=t;t=e,e=i}return i()}return!1}}}isAreaEmpty(t,e,i,n){let r={x:t||0,y:e||0,w:i||1,h:n||1};return!this.collide(r)}compact(){if(0===this.nodes.length)return this;this.batchUpdate().sortNodes();let t=this.nodes;return this.nodes=[],t.forEach((t=>{t.locked||(t.autoPosition=!0),this.addNode(t,!1),t._dirty=!0})),this.batchUpdate(!1)}set float(t){this._float!==t&&(this._float=t||!1,t||this._packNodes()._notify())}get float(){return this._float||!1}sortNodes(t){return this.nodes=n.Utils.sort(this.nodes,t,this.column),this}_packNodes(){return this.batchMode||(this.sortNodes(),this.float?this.nodes.forEach((t=>{if(t._updating||void 0===t._orig||t.y===t._orig.y)return;let e=t.y;for(;e>t._orig.y;)--e,this.collide(t,{x:t.x,y:e,w:t.w,h:t.h})||(t._dirty=!0,t.y=e)})):this.nodes.forEach(((t,e)=>{if(!t.locked)for(;t.y>0;){let i=0===e?0:t.y-1;if(0!==e&&this.collide(t,{x:t.x,y:i,w:t.w,h:t.h}))break;t._dirty=t.y!==i,t.y=i}}))),this}prepareNode(t,e){(t=t||{})._id=t._id||r._idSeq++,void 0!==t.x&&void 0!==t.y&&null!==t.x&&null!==t.y||(t.autoPosition=!0);let i={x:0,y:0,w:1,h:1};return n.Utils.defaults(t,i),t.autoPosition||delete t.autoPosition,t.noResize||delete t.noResize,t.noMove||delete t.noMove,"string"==typeof t.x&&(t.x=Number(t.x)),"string"==typeof t.y&&(t.y=Number(t.y)),"string"==typeof t.w&&(t.w=Number(t.w)),"string"==typeof t.h&&(t.h=Number(t.h)),isNaN(t.x)&&(t.x=i.x,t.autoPosition=!0),isNaN(t.y)&&(t.y=i.y,t.autoPosition=!0),isNaN(t.w)&&(t.w=i.w),isNaN(t.h)&&(t.h=i.h),this.nodeBoundFix(t,e)}nodeBoundFix(t,e){let i=t._orig||n.Utils.copyPos({},t);if(t.maxW&&(t.w=Math.min(t.w,t.maxW)),t.maxH&&(t.h=Math.min(t.h,t.maxH)),t.minW&&t.minW<=this.column&&(t.w=Math.max(t.w,t.minW)),t.minH&&(t.h=Math.max(t.h,t.minH)),(1===this.column||t.x+t.w>this.column)&&this.column<12&&!this._inColumnResize&&!t.autoPosition&&t._id&&-1===this.findCacheLayout(t,12)){let e=Object.assign({},t);e.x=Math.min(11,e.x),e.w=Math.min(12,e.w),this.cacheOneLayout(e,12)}return t.w>this.column?t.w=this.column:t.w<1&&(t.w=1),this.maxRow&&t.h>this.maxRow?t.h=this.maxRow:t.h<1&&(t.h=1),t.x<0&&(t.x=0),t.y<0&&(t.y=0),t.x+t.w>this.column&&(e?t.w=this.column-t.x:t.x=this.column-t.w),this.maxRow&&t.y+t.h>this.maxRow&&(e?t.h=this.maxRow-t.y:t.y=this.maxRow-t.h),n.Utils.samePos(t,i)||(t._dirty=!0),t}getDirtyNodes(t){return t?this.nodes.filter((t=>t._dirty&&!n.Utils.samePos(t,t._orig))):this.nodes.filter((t=>t._dirty))}_notify(t){if(this.batchMode||!this.onChange)return this;let e=(t||[]).concat(this.getDirtyNodes());return this.onChange(e),this}cleanNodes(){return this.batchMode||this.nodes.forEach((t=>{delete t._dirty,delete t._lastTried})),this}saveInitial(){return this.nodes.forEach((t=>{t._orig=n.Utils.copyPos({},t),delete t._dirty})),this._hasLocked=this.nodes.some((t=>t.locked)),this}restoreInitial(){return this.nodes.forEach((t=>{n.Utils.samePos(t,t._orig)||(n.Utils.copyPos(t,t._orig),t._dirty=!0)})),this._notify(),this}findEmptyPosition(t){this.sortNodes();let e=!1;for(let i=0;!e;++i){let r=i%this.column,o=Math.floor(i/this.column);if(r+t.w>this.column)continue;let s={x:r,y:o,w:t.w,h:t.h};this.nodes.find((t=>n.Utils.isIntercepted(s,t)))||(t.x=r,t.y=o,e=!0)}return e}addNode(t,e=!1){return this.nodes.find((e=>e._id===t._id))||(delete(t=this._inColumnResize?this.nodeBoundFix(t):this.prepareNode(t))._temporaryRemoved,delete t._removeDOM,t.autoPosition&&this.findEmptyPosition(t)&&delete t.autoPosition,this.nodes.push(t),e&&this.addedNodes.push(t),this._fixCollisions(t),this.batchMode||this._packNodes()._notify(),t)}removeNode(t,e=!0,i=!1){return this.nodes.find((e=>e===t))?(i&&this.removedNodes.push(t),e&&(t._removeDOM=!0),this.nodes=this.nodes.filter((e=>e!==t)),this._packNodes()._notify([t])):this}removeAll(t=!0){return delete this._layouts,0===this.nodes.length?this:(t&&this.nodes.forEach((t=>t._removeDOM=!0)),this.removedNodes=this.nodes,this.nodes=[],this._notify(this.removedNodes))}moveNodeCheck(t,e){if(!this.changedPosConstrain(t,e))return!1;if(e.pack=!0,!this.maxRow)return this.moveNode(t,e);let i,o=new r({column:this.column,float:this.float,nodes:this.nodes.map((e=>e===t?(i=Object.assign({},e),i):Object.assign({},e)))});if(!i)return!1;let s=o.moveNode(i,e)&&o.getRow()<=this.maxRow;if(!s&&!e.resizing&&e.collide){let i=e.collide.el.gridstackNode;if(this.swap(t,i))return this._notify(),!0}return!!s&&(o.nodes.filter((t=>t._dirty)).forEach((t=>{let e=this.nodes.find((e=>e._id===t._id));e&&(n.Utils.copyPos(e,t),e._dirty=!0)})),this._notify(),!0)}willItFit(t){if(delete t._willFitPos,!this.maxRow)return!0;let e=new r({column:this.column,float:this.float,nodes:this.nodes.map((t=>Object.assign({},t)))}),i=Object.assign({},t);return this.cleanupNode(i),delete i.el,delete i._id,delete i.content,delete i.grid,e.addNode(i),e.getRow()<=this.maxRow&&(t._willFitPos=n.Utils.copyPos({},i),!0)}changedPosConstrain(t,e){return e.w=e.w||t.w,e.h=e.h||t.h,t.x!==e.x||t.y!==e.y||(t.maxW&&(e.w=Math.min(e.w,t.maxW)),t.maxH&&(e.h=Math.min(e.h,t.maxH)),t.minW&&(e.w=Math.max(e.w,t.minW)),t.minH&&(e.h=Math.max(e.h,t.minH)),t.w!==e.w||t.h!==e.h)}moveNode(t,e){var i,r;if(!t||!e)return!1;let o;void 0===e.pack&&(o=e.pack=!0),"number"!=typeof e.x&&(e.x=t.x),"number"!=typeof e.y&&(e.y=t.y),"number"!=typeof e.w&&(e.w=t.w),"number"!=typeof e.h&&(e.h=t.h);let s=t.w!==e.w||t.h!==e.h,a=n.Utils.copyPos({},t,!0);if(n.Utils.copyPos(a,e),a=this.nodeBoundFix(a,s),n.Utils.copyPos(e,a),n.Utils.samePos(t,e))return!1;let l=n.Utils.copyPos({},t),c=this.collideAll(t,a,e.skip),h=!0;if(c.length){let s=t._moving&&!e.nested,l=s?this.directionCollideCoverage(t,e,c):c[0];if(s&&l&&(null===(r=null===(i=t.grid)||void 0===i?void 0:i.opts)||void 0===r?void 0:r.subGridDynamic)&&!t.grid._isTemp){let i=n.Utils.areaIntercept(e.rect,l._rect),r=n.Utils.area(e.rect),o=n.Utils.area(l._rect);i/(r<o?r:o)>.8&&(l.grid.makeSubGrid(l.el,void 0,t),l=void 0)}l?h=!this._fixCollisions(t,a,l,e):(h=!1,o&&delete e.pack)}return h&&(t._dirty=!0,n.Utils.copyPos(t,a)),e.pack&&this._packNodes()._notify(),!n.Utils.samePos(t,l)}getRow(){return this.nodes.reduce(((t,e)=>Math.max(t,e.y+e.h)),0)}beginUpdate(t){return t._updating||(t._updating=!0,delete t._skipDown,this.batchMode||this.saveInitial()),this}endUpdate(){let t=this.nodes.find((t=>t._updating));return t&&(delete t._updating,delete t._skipDown),this}save(t=!0){var e;let i=null===(e=this._layouts)||void 0===e?void 0:e.length,r=i&&this.column!==i-1?this._layouts[i-1]:null,o=[];return this.sortNodes(),this.nodes.forEach((e=>{let i=null==r?void 0:r.find((t=>t._id===e._id)),s=Object.assign({},e);i&&(s.x=i.x,s.y=i.y,s.w=i.w),n.Utils.removeInternalForSave(s,!t),o.push(s)})),o}layoutsNodesChange(t){return!this._layouts||this._inColumnResize||this._layouts.forEach(((e,i)=>{if(!e||i===this.column)return this;if(i<this.column)this._layouts[i]=void 0;else{let n=i/this.column;t.forEach((t=>{if(!t._orig)return;let i=e.find((e=>e._id===t._id));i&&(t.y!==t._orig.y&&(i.y+=t.y-t._orig.y),t.x!==t._orig.x&&(i.x=Math.round(t.x*n)),t.w!==t._orig.w&&(i.w=Math.round(t.w*n)))}))}})),this}updateNodeWidths(t,e,i,r="moveScale"){var o;if(!this.nodes.length||!e||t===e)return this;this.cacheLayout(this.nodes,t),this.batchUpdate();let s=[],a=!1;if(1===e&&(null==i?void 0:i.length)){a=!0;let t=0;i.forEach((e=>{e.x=0,e.w=1,e.y=Math.max(e.y,t),t=e.y+e.h})),s=i,i=[]}else i=n.Utils.sort(this.nodes,-1,t);let l=[];if(e>t){l=this._layouts[e]||[];let n=this._layouts.length-1;!l.length&&t!==n&&(null===(o=this._layouts[n])||void 0===o?void 0:o.length)&&(t=n,this._layouts[n].forEach((t=>{let e=i.find((e=>e._id===t._id));e&&(e.x=t.x,e.y=t.y,e.w=t.w)})))}if(l.forEach((t=>{let e=i.findIndex((e=>e._id===t._id));-1!==e&&(i[e].x=t.x,i[e].y=t.y,i[e].w=t.w,s.push(i[e]),i.splice(e,1))})),i.length)if("function"==typeof r)r(e,t,s,i);else if(!a){let n=e/t,o="move"===r||"moveScale"===r,a="scale"===r||"moveScale"===r;i.forEach((i=>{i.x=1===e?0:o?Math.round(i.x*n):Math.min(i.x,e-1),i.w=1===e||1===t?1:a?Math.round(i.w*n)||1:Math.min(i.w,e),s.push(i)})),i=[]}return a||(s=n.Utils.sort(s,-1,e)),this._inColumnResize=!0,this.nodes=[],s.forEach((t=>{this.addNode(t,!1),delete t._orig})),this.batchUpdate(!1),delete this._inColumnResize,this}cacheLayout(t,e,i=!1){let n=[];return t.forEach(((t,e)=>{t._id=t._id||r._idSeq++,n[e]={x:t.x,y:t.y,w:t.w,_id:t._id}})),this._layouts=i?[]:this._layouts||[],this._layouts[e]=n,this}cacheOneLayout(t,e){t._id=t._id||r._idSeq++;let i={x:t.x,y:t.y,w:t.w,_id:t._id};this._layouts=this._layouts||[],this._layouts[e]=this._layouts[e]||[];let n=this.findCacheLayout(t,e);return-1===n?this._layouts[e].push(i):this._layouts[e][n]=i,this}findCacheLayout(t,e){var i,n,r;return null!==(r=null===(n=null===(i=this._layouts)||void 0===i?void 0:i[e])||void 0===n?void 0:n.findIndex((e=>e._id===t._id)))&&void 0!==r?r:-1}cleanupNode(t){for(let e in t)"_"===e[0]&&"_id"!==e&&delete t[e];return this}}e.GridStackEngine=r,r._idSeq=1},929:function(t,e,i){"use strict";var n=this&&this.__createBinding||(Object.create?function(t,e,i,n){void 0===n&&(n=i),Object.defineProperty(t,n,{enumerable:!0,get:function(){return e[i]}})}:function(t,e,i,n){void 0===n&&(n=i),t[n]=e[i]}),r=this&&this.__exportStar||function(t,e){for(var i in t)"default"===i||e.hasOwnProperty(i)||n(e,t,i)};Object.defineProperty(e,"__esModule",{value:!0}),e.GridStack=void 0;const o=i(935),s=i(284),a=i(523);r(i(523),e),r(i(284),e),r(i(935),e);class l{constructor(t,e={}){var i,n;this._gsEventHandler={},this._extraDragRow=0,this.el=t,(e=e||{}).row&&(e.minRow=e.maxRow=e.row,delete e.row);let r=s.Utils.toNumber(t.getAttribute("gs-row"));"auto"===e.column&&delete e.column;let u=e;void 0!==u.minWidth&&(e.oneColumnSize=e.oneColumnSize||u.minWidth,delete u.minWidth),void 0!==e.alwaysShowResizeHandle&&(e._alwaysShowResizeHandle=e.alwaysShowResizeHandle);let d=Object.assign(Object.assign({},s.Utils.cloneDeep(a.gridDefaults)),{column:s.Utils.toNumber(t.getAttribute("gs-column"))||a.gridDefaults.column,minRow:r||s.Utils.toNumber(t.getAttribute("gs-min-row"))||a.gridDefaults.minRow,maxRow:r||s.Utils.toNumber(t.getAttribute("gs-max-row"))||a.gridDefaults.maxRow,staticGrid:s.Utils.toBool(t.getAttribute("gs-static"))||a.gridDefaults.staticGrid,draggable:{handle:(e.handleClass?"."+e.handleClass:e.handle?e.handle:"")||a.gridDefaults.draggable.handle},removableOptions:{accept:e.itemClass?"."+e.itemClass:a.gridDefaults.removableOptions.accept}});t.getAttribute("gs-animate")&&(d.animate=s.Utils.toBool(t.getAttribute("gs-animate"))),this.opts=s.Utils.defaults(e,d),e=null,this._initMargin(),1!==this.opts.column&&!this.opts.disableOneColumnMode&&this._widthOrContainer()<=this.opts.oneColumnSize&&(this._prevColumn=this.getColumn(),this.opts.column=1),"auto"===this.opts.rtl&&(this.opts.rtl="rtl"===t.style.direction),this.opts.rtl&&this.el.classList.add("grid-stack-rtl");let f=null===(i=s.Utils.closestUpByClass(this.el,a.gridDefaults.itemClass))||void 0===i?void 0:i.gridstackNode;f&&(f.subGrid=this,this.parentGridItem=f,this.el.classList.add("grid-stack-nested"),f.el.classList.add("grid-stack-sub-grid")),this._isAutoCellHeight="auto"===this.opts.cellHeight,this._isAutoCellHeight||"initial"===this.opts.cellHeight?this.cellHeight(void 0,!1):("number"==typeof this.opts.cellHeight&&this.opts.cellHeightUnit&&this.opts.cellHeightUnit!==a.gridDefaults.cellHeightUnit&&(this.opts.cellHeight=this.opts.cellHeight+this.opts.cellHeightUnit,delete this.opts.cellHeightUnit),this.cellHeight(this.opts.cellHeight,!1)),"mobile"===this.opts.alwaysShowResizeHandle&&(this.opts.alwaysShowResizeHandle=c.isTouch),this._styleSheetClass="grid-stack-instance-"+o.GridStackEngine._idSeq++,this.el.classList.add(this._styleSheetClass),this._setStaticClass();let p=this.opts.engineClass||l.engineClass||o.GridStackEngine;if(this.engine=new p({column:this.getColumn(),float:this.opts.float,maxRow:this.opts.maxRow,onChange:t=>{let e=0;this.engine.nodes.forEach((t=>{e=Math.max(e,t.y+t.h)})),t.forEach((t=>{let e=t.el;e&&(t._removeDOM?(e&&e.remove(),delete t._removeDOM):this._writePosAttr(e,t))})),this._updateStyles(!1,e)}}),this.opts.auto){this.batchUpdate();let t=[],e=this.getColumn();1===e&&this._prevColumn&&(e=this._prevColumn),this.getGridItems().forEach((i=>{let n=parseInt(i.getAttribute("gs-x")),r=parseInt(i.getAttribute("gs-y"));t.push({el:i,i:(Number.isNaN(n)?1e3:n)+(Number.isNaN(r)?1e3:r)*e})})),t.sort(((t,e)=>e.i-t.i)).forEach((t=>this._prepareElement(t.el))),this.batchUpdate(!1)}this.setAnimation(this.opts.animate),this._updateStyles(),12!=this.opts.column&&this.el.classList.add("grid-stack-"+this.opts.column),this.opts.dragIn&&l.setupDragIn(this.opts.dragIn,this.opts.dragInOptions),delete this.opts.dragIn,delete this.opts.dragInOptions,this.opts.subGridDynamic&&!h.DDManager.pauseDrag&&(h.DDManager.pauseDrag=!0),void 0!==(null===(n=this.opts.draggable)||void 0===n?void 0:n.pause)&&(h.DDManager.pauseDrag=this.opts.draggable.pause),this._setupRemoveDrop(),this._setupAcceptWidget(),this._updateWindowResizeEvent()}static init(t={},e=".grid-stack"){let i=l.getGridElement(e);return i?(i.gridstack||(i.gridstack=new l(i,s.Utils.cloneDeep(t))),i.gridstack):("string"==typeof e?console.error('GridStack.initAll() no grid was found with selector "'+e+'" - element missing or wrong selector ?\nNote: ".grid-stack" is required for proper CSS styling and drag/drop, and is the default selector.'):console.error("GridStack.init() no grid element was passed."),null)}static initAll(t={},e=".grid-stack"){let i=[];return l.getGridElements(e).forEach((e=>{e.gridstack||(e.gridstack=new l(e,s.Utils.cloneDeep(t)),delete t.dragIn,delete t.dragInOptions),i.push(e.gridstack)})),0===i.length&&console.error('GridStack.initAll() no grid was found with selector "'+e+'" - element missing or wrong selector ?\nNote: ".grid-stack" is required for proper CSS styling and drag/drop, and is the default selector.'),i}static addGrid(t,e={}){if(!t)return null;let i=t;if(!t.classList.contains("grid-stack")){let n=document.implementation.createHTMLDocument("");n.body.innerHTML=`<div class="grid-stack ${e.class||""}"></div>`,i=n.body.children[0],t.appendChild(i)}let n=l.init(e,i);if(n.opts.children){let t=n.opts.children;delete n.opts.children,n.load(t)}return n}static registerEngine(t){l.engineClass=t}get placeholder(){if(!this._placeholder){let t=document.createElement("div");t.className="placeholder-content",this.opts.placeholderText&&(t.innerHTML=this.opts.placeholderText),this._placeholder=document.createElement("div"),this._placeholder.classList.add(this.opts.placeholderClass,a.gridDefaults.itemClass,this.opts.itemClass),this.placeholder.appendChild(t)}return this._placeholder}addWidget(t,e){let i;if("string"==typeof t){let e=document.implementation.createHTMLDocument("");e.body.innerHTML=t,i=e.body.children[0]}else if(0===arguments.length||1===arguments.length&&(void 0!==(n=t).x||void 0!==n.y||void 0!==n.w||void 0!==n.h||void 0!==n.content)){let n=t&&t.content||"";e=t;let r=document.implementation.createHTMLDocument("");r.body.innerHTML=`<div class="grid-stack-item ${this.opts.itemClass||""}"><div class="grid-stack-item-content">${n}</div></div>`,i=r.body.children[0]}else i=t;var n;let r=this._readAttr(i);e=s.Utils.cloneDeep(e)||{},s.Utils.defaults(e,r);let o=this.engine.prepareNode(e);return this._writeAttr(i,e),this._insertNotAppend?this.el.prepend(i):this.el.appendChild(i),this._prepareElement(i,!0,e),this._updateContainerHeight(),o.subGrid&&this.makeSubGrid(o.el,void 0,void 0,!1),this._prevColumn&&1===this.opts.column&&(this._ignoreLayoutsNodeChange=!0),this._triggerAddEvent(),this._triggerChangeEvent(),delete this._ignoreLayoutsNodeChange,i}makeSubGrid(t,e,i,n=!0){var r;let o,a=t.gridstackNode;if(a||(a=this.makeWidget(t).gridstackNode),null===(r=a.subGrid)||void 0===r?void 0:r.el)return a.subGrid;(e=s.Utils.cloneDeep(e||a.subGrid||Object.assign(Object.assign({},this.opts.subGrid),{children:void 0}))).subGrid=s.Utils.cloneDeep(e),a.subGrid=e,"auto"===e.column&&(o=!0,e.column=Math.max(a.w||1,(null==i?void 0:i.w)||1),e.disableOneColumnMode=!0);let c,h,u=a.el.querySelector(".grid-stack-item-content");if(n){this._removeDD(a.el);let t=document.implementation.createHTMLDocument("");t.body.innerHTML='<div class="grid-stack-item"></div>',c=t.body.children[0],c.appendChild(u),h=Object.assign(Object.assign({},a),{x:0,y:0}),s.Utils.removeInternalForSave(h),delete h.subGrid,a.content&&(h.content=a.content,delete a.content),t.body.innerHTML='<div class="grid-stack-item-content"></div>',u=t.body.children[0],a.el.appendChild(u),this._prepareDragDropByNode(a)}if(i){let t=o?e.column:a.w,n=a.h+i.h,r=a.el.style;r.transition="none",this.update(a.el,{w:t,h:n}),setTimeout((()=>r.transition=null))}let d=a.subGrid=l.addGrid(u,e);return(null==i?void 0:i._moving)&&(d._isTemp=!0),o&&(d._autoColumn=!0),n&&d.addWidget(c,h),i&&(i._moving?window.setTimeout((()=>s.Utils.simulateMouseEvent(i._event,"mouseenter",d.el)),0):d.addWidget(a.el,a)),d}removeAsSubGrid(t){var e;let i=null===(e=this.parentGridItem)||void 0===e?void 0:e.grid;i&&(i.batchUpdate(),i.removeWidget(this.parentGridItem.el,!0,!0),this.engine.nodes.forEach((t=>{t.x+=this.parentGridItem.x,t.y+=this.parentGridItem.y,i.addWidget(t.el,t)})),i.batchUpdate(!1),delete this.parentGridItem,t&&window.setTimeout((()=>s.Utils.simulateMouseEvent(t._event,"mouseenter",i.el)),0))}save(t=!0,e=!1){let i=this.engine.save(t);if(i.forEach((e=>{if(t&&e.el&&!e.subGrid){let t=e.el.querySelector(".grid-stack-item-content");e.content=t?t.innerHTML:void 0,e.content||delete e.content}else t||delete e.content,e.subGrid&&(e.subGrid=e.subGrid.save(t,!0));delete e.el})),e){let t=s.Utils.cloneDeep(this.opts);t.marginBottom===t.marginTop&&t.marginRight===t.marginLeft&&t.marginTop===t.marginRight&&(t.margin=t.marginTop,delete t.marginTop,delete t.marginRight,delete t.marginBottom,delete t.marginLeft),t.rtl===("rtl"===this.el.style.direction)&&(t.rtl="auto"),this._isAutoCellHeight&&(t.cellHeight="auto"),this._autoColumn&&(t.column="auto",delete t.disableOneColumnMode);const e=t._alwaysShowResizeHandle;return delete t._alwaysShowResizeHandle,void 0!==e?t.alwaysShowResizeHandle=e:delete t.alwaysShowResizeHandle,s.Utils.removeInternalAndSame(t,a.gridDefaults),t.children=i,t}return i}load(t,e=!0){let i=l.Utils.sort([...t],-1,this._prevColumn||this.getColumn());this._insertNotAppend=!0,this._prevColumn&&this._prevColumn!==this.opts.column&&i.some((t=>t.x+t.w>this.opts.column))&&(this._ignoreLayoutsNodeChange=!0,this.engine.cacheLayout(i,this._prevColumn,!0));let n=[];return this.batchUpdate(),e&&[...this.engine.nodes].forEach((t=>{i.find((e=>t.id===e.id))||("function"==typeof e?e(this,t,!1):(n.push(t),this.removeWidget(t.el,!0,!1)))})),i.forEach((t=>{let i=t.id||0===t.id?this.engine.nodes.find((e=>e.id===t.id)):void 0;if(i){if(this.update(i.el,t),t.subGrid&&t.subGrid.children){let e=i.el.querySelector(".grid-stack");e&&e.gridstack&&(e.gridstack.load(t.subGrid.children),this._insertNotAppend=!0)}}else e&&(t="function"==typeof e?e(this,t,!0).gridstackNode:this.addWidget(t).gridstackNode)})),this.engine.removedNodes=n,this.batchUpdate(!1),delete this._ignoreLayoutsNodeChange,delete this._insertNotAppend,this}batchUpdate(t=!0){return this.engine.batchUpdate(t),t||(this._triggerRemoveEvent(),this._triggerAddEvent(),this._triggerChangeEvent()),this}getCellHeight(t=!1){if(this.opts.cellHeight&&"auto"!==this.opts.cellHeight&&(!t||!this.opts.cellHeightUnit||"px"===this.opts.cellHeightUnit))return this.opts.cellHeight;let e=this.el.querySelector("."+this.opts.itemClass);if(e){let t=s.Utils.toNumber(e.getAttribute("gs-h"));return Math.round(e.offsetHeight/t)}let i=parseInt(this.el.getAttribute("gs-current-row"));return i?Math.round(this.el.getBoundingClientRect().height/i):this.opts.cellHeight}cellHeight(t,e=!0){if(e&&void 0!==t&&this._isAutoCellHeight!==("auto"===t)&&(this._isAutoCellHeight="auto"===t,this._updateWindowResizeEvent()),"initial"!==t&&"auto"!==t||(t=void 0),void 0===t){let e=-this.opts.marginRight-this.opts.marginLeft+this.opts.marginTop+this.opts.marginBottom;t=this.cellWidth()+e}let i=s.Utils.parseHeight(t);return this.opts.cellHeightUnit===i.unit&&this.opts.cellHeight===i.h||(this.opts.cellHeightUnit=i.unit,this.opts.cellHeight=i.h,e&&this._updateStyles(!0)),this}cellWidth(){return this._widthOrContainer()/this.getColumn()}_widthOrContainer(){return this.el.clientWidth||this.el.parentElement.clientWidth||window.innerWidth}compact(){return this.engine.compact(),this._triggerChangeEvent(),this}column(t,e="moveScale"){if(t<1||this.opts.column===t)return this;let i,n=this.getColumn();return 1===t?this._prevColumn=n:delete this._prevColumn,this.el.classList.remove("grid-stack-"+n),this.el.classList.add("grid-stack-"+t),this.opts.column=this.engine.column=t,1===t&&this.opts.oneColumnModeDomSort&&(i=[],this.getGridItems().forEach((t=>{t.gridstackNode&&i.push(t.gridstackNode)})),i.length||(i=void 0)),this.engine.updateNodeWidths(n,t,i,e),this._isAutoCellHeight&&this.cellHeight(),this._ignoreLayoutsNodeChange=!0,this._triggerChangeEvent(),delete this._ignoreLayoutsNodeChange,this}getColumn(){return this.opts.column}getGridItems(){return Array.from(this.el.children).filter((t=>t.matches("."+this.opts.itemClass)&&!t.matches("."+this.opts.placeholderClass)))}destroy(t=!0){if(this.el)return this._updateWindowResizeEvent(!0),this.setStatic(!0,!1),this.setAnimation(!1),t?this.el.parentNode.removeChild(this.el):(this.removeAll(t),this.el.classList.remove(this._styleSheetClass)),this._removeStylesheet(),this.el.removeAttribute("gs-current-row"),delete this.parentGridItem,delete this.opts,delete this._placeholder,delete this.engine,delete this.el.gridstack,delete this.el,this}float(t){return this.opts.float!==t&&(this.opts.float=this.engine.float=t,this._triggerChangeEvent()),this}getFloat(){return this.engine.float}getCellFromPixel(t,e=!1){let i,n=this.el.getBoundingClientRect();i=e?{top:n.top+document.documentElement.scrollTop,left:n.left}:{top:this.el.offsetTop,left:this.el.offsetLeft};let r=t.left-i.left,o=t.top-i.top,s=n.width/this.getColumn(),a=n.height/parseInt(this.el.getAttribute("gs-current-row"));return{x:Math.floor(r/s),y:Math.floor(o/a)}}getRow(){return Math.max(this.engine.getRow(),this.opts.minRow)}isAreaEmpty(t,e,i,n){return this.engine.isAreaEmpty(t,e,i,n)}makeWidget(t){let e=l.getElement(t);return this._prepareElement(e,!0),this._updateContainerHeight(),this._triggerAddEvent(),this._triggerChangeEvent(),e}on(t,e){if(-1!==t.indexOf(" "))return t.split(" ").forEach((t=>this.on(t,e))),this;if("change"===t||"added"===t||"removed"===t||"enable"===t||"disable"===t){let i="enable"===t||"disable"===t;this._gsEventHandler[t]=i?t=>e(t):t=>e(t,t.detail),this.el.addEventListener(t,this._gsEventHandler[t])}else"drag"===t||"dragstart"===t||"dragstop"===t||"resizestart"===t||"resize"===t||"resizestop"===t||"dropped"===t?this._gsEventHandler[t]=e:console.log("GridStack.on("+t+') event not supported, but you can still use $(".grid-stack").on(...) while jquery-ui is still used internally.');return this}off(t){return-1!==t.indexOf(" ")?(t.split(" ").forEach((t=>this.off(t))),this):("change"!==t&&"added"!==t&&"removed"!==t&&"enable"!==t&&"disable"!==t||this._gsEventHandler[t]&&this.el.removeEventListener(t,this._gsEventHandler[t]),delete this._gsEventHandler[t],this)}removeWidget(t,e=!0,i=!0){return l.getElements(t).forEach((t=>{if(t.parentElement&&t.parentElement!==this.el)return;let n=t.gridstackNode;n||(n=this.engine.nodes.find((e=>t===e.el))),n&&(delete t.gridstackNode,this._removeDD(t),this.engine.removeNode(n,e,i),e&&t.parentElement&&t.remove())})),i&&(this._triggerRemoveEvent(),this._triggerChangeEvent()),this}removeAll(t=!0){return this.engine.nodes.forEach((t=>{delete t.el.gridstackNode,this._removeDD(t.el)})),this.engine.removeAll(t),this._triggerRemoveEvent(),this}setAnimation(t){return t?this.el.classList.add("grid-stack-animate"):this.el.classList.remove("grid-stack-animate"),this}setStatic(t,e=!0){return this.opts.staticGrid===t||(this.opts.staticGrid=t,this._setupRemoveDrop(),this._setupAcceptWidget(),this.engine.nodes.forEach((t=>this._prepareDragDropByNode(t))),e&&this._setStaticClass()),this}update(t,e){if(arguments.length>2){console.warn("gridstack.ts: `update(el, x, y, w, h)` is deprecated. Use `update(el, {x, w, content, ...})`. It will be removed soon");let i=arguments,n=1;return e={x:i[n++],y:i[n++],w:i[n++],h:i[n++]},this.update(t,e)}return l.getElements(t).forEach((t=>{if(!t||!t.gridstackNode)return;let i=t.gridstackNode,n=s.Utils.cloneDeep(e);delete n.autoPosition;let r,o=["x","y","w","h"];if(o.some((t=>void 0!==n[t]&&n[t]!==i[t]))&&(r={},o.forEach((t=>{r[t]=void 0!==n[t]?n[t]:i[t],delete n[t]}))),!r&&(n.minW||n.minH||n.maxW||n.maxH)&&(r={}),n.content){let e=t.querySelector(".grid-stack-item-content");e&&e.innerHTML!==n.content&&(e.innerHTML=n.content),delete n.content}let a=!1,l=!1;for(const t in n)"_"!==t[0]&&i[t]!==n[t]&&(i[t]=n[t],a=!0,l=l||!this.opts.staticGrid&&("noResize"===t||"noMove"===t||"locked"===t));r&&(this.engine.cleanNodes().beginUpdate(i).moveNode(i,r),this._updateContainerHeight(),this._triggerChangeEvent(),this.engine.endUpdate()),a&&this._writeAttr(t,i),l&&this._prepareDragDropByNode(i)})),this}margin(t){if(!("string"==typeof t&&t.split(" ").length>1)){let e=s.Utils.parseHeight(t);if(this.opts.marginUnit===e.unit&&this.opts.margin===e.h)return}return this.opts.margin=t,this.opts.marginTop=this.opts.marginBottom=this.opts.marginLeft=this.opts.marginRight=void 0,this._initMargin(),this._updateStyles(!0),this}getMargin(){return this.opts.margin}willItFit(t){if(arguments.length>1){console.warn("gridstack.ts: `willItFit(x,y,w,h,autoPosition)` is deprecated. Use `willItFit({x, y,...})`. It will be removed soon");let t=arguments,e=0,i={x:t[e++],y:t[e++],w:t[e++],h:t[e++],autoPosition:t[e++]};return this.willItFit(i)}return this.engine.willItFit(t)}_triggerChangeEvent(){if(this.engine.batchMode)return this;let t=this.engine.getDirtyNodes(!0);return t&&t.length&&(this._ignoreLayoutsNodeChange||this.engine.layoutsNodesChange(t),this._triggerEvent("change",t)),this.engine.saveInitial(),this}_triggerAddEvent(){return this.engine.batchMode||this.engine.addedNodes&&this.engine.addedNodes.length>0&&(this._ignoreLayoutsNodeChange||this.engine.layoutsNodesChange(this.engine.addedNodes),this.engine.addedNodes.forEach((t=>{delete t._dirty})),this._triggerEvent("added",this.engine.addedNodes),this.engine.addedNodes=[]),this}_triggerRemoveEvent(){return this.engine.batchMode||this.engine.removedNodes&&this.engine.removedNodes.length>0&&(this._triggerEvent("removed",this.engine.removedNodes),this.engine.removedNodes=[]),this}_triggerEvent(t,e){let i=e?new CustomEvent(t,{bubbles:!1,detail:e}):new Event(t);return this.el.dispatchEvent(i),this}_removeStylesheet(){return this._styles&&(s.Utils.removeStylesheet(this._styleSheetClass),delete this._styles),this}_updateStyles(t=!1,e){if(t&&this._removeStylesheet(),e||(e=this.getRow()),this._updateContainerHeight(),0===this.opts.cellHeight)return this;let i=this.opts.cellHeight,n=this.opts.cellHeightUnit,r=`.${this._styleSheetClass} > .${this.opts.itemClass}`;if(!this._styles){let t=this.opts.styleInHead?void 0:this.el.parentNode;if(this._styles=s.Utils.createStylesheet(this._styleSheetClass,t),!this._styles)return this;this._styles._max=0,s.Utils.addCSSRule(this._styles,r,`min-height: ${i}${n}`);let e=this.opts.marginTop+this.opts.marginUnit,o=this.opts.marginBottom+this.opts.marginUnit,a=this.opts.marginRight+this.opts.marginUnit,l=this.opts.marginLeft+this.opts.marginUnit,c=`${r} > .grid-stack-item-content`,h=`.${this._styleSheetClass} > .grid-stack-placeholder > .placeholder-content`;s.Utils.addCSSRule(this._styles,c,`top: ${e}; right: ${a}; bottom: ${o}; left: ${l};`),s.Utils.addCSSRule(this._styles,h,`top: ${e}; right: ${a}; bottom: ${o}; left: ${l};`),s.Utils.addCSSRule(this._styles,`${r} > .ui-resizable-ne`,`right: ${a}`),s.Utils.addCSSRule(this._styles,`${r} > .ui-resizable-e`,`right: ${a}`),s.Utils.addCSSRule(this._styles,`${r} > .ui-resizable-se`,`right: ${a}; bottom: ${o}`),s.Utils.addCSSRule(this._styles,`${r} > .ui-resizable-nw`,`left: ${l}`),s.Utils.addCSSRule(this._styles,`${r} > .ui-resizable-w`,`left: ${l}`),s.Utils.addCSSRule(this._styles,`${r} > .ui-resizable-sw`,`left: ${l}; bottom: ${o}`)}if((e=e||this._styles._max)>this._styles._max){let t=t=>i*t+n;for(let i=this._styles._max+1;i<=e;i++){let e=t(i);s.Utils.addCSSRule(this._styles,`${r}[gs-y="${i-1}"]`,`top: ${t(i-1)}`),s.Utils.addCSSRule(this._styles,`${r}[gs-h="${i}"]`,`height: ${e}`),s.Utils.addCSSRule(this._styles,`${r}[gs-min-h="${i}"]`,`min-height: ${e}`),s.Utils.addCSSRule(this._styles,`${r}[gs-max-h="${i}"]`,`max-height: ${e}`)}this._styles._max=e}return this}_updateContainerHeight(){if(!this.engine||this.engine.batchMode)return this;let t=this.getRow()+this._extraDragRow;if(this.el.setAttribute("gs-current-row",String(t)),0===t)return this.el.style.removeProperty("min-height"),this;let e=this.opts.cellHeight,i=this.opts.cellHeightUnit;return e?(this.el.style.minHeight=t*e+i,this):this}_prepareElement(t,e=!1,i){i||(t.classList.add(this.opts.itemClass),i=this._readAttr(t)),t.gridstackNode=i,i.el=t,i.grid=this;let n=Object.assign({},i);return i=this.engine.addNode(i,e),s.Utils.same(i,n)||this._writeAttr(t,i),this._prepareDragDropByNode(i),this}_writePosAttr(t,e){return void 0!==e.x&&null!==e.x&&t.setAttribute("gs-x",String(e.x)),void 0!==e.y&&null!==e.y&&t.setAttribute("gs-y",String(e.y)),e.w&&t.setAttribute("gs-w",String(e.w)),e.h&&t.setAttribute("gs-h",String(e.h)),this}_writeAttr(t,e){if(!e)return this;this._writePosAttr(t,e);let i={autoPosition:"gs-auto-position",minW:"gs-min-w",minH:"gs-min-h",maxW:"gs-max-w",maxH:"gs-max-h",noResize:"gs-no-resize",noMove:"gs-no-move",locked:"gs-locked",id:"gs-id",resizeHandles:"gs-resize-handles"};for(const n in i)e[n]?t.setAttribute(i[n],String(e[n])):t.removeAttribute(i[n]);return this}_readAttr(t){let e={};e.x=s.Utils.toNumber(t.getAttribute("gs-x")),e.y=s.Utils.toNumber(t.getAttribute("gs-y")),e.w=s.Utils.toNumber(t.getAttribute("gs-w")),e.h=s.Utils.toNumber(t.getAttribute("gs-h")),e.maxW=s.Utils.toNumber(t.getAttribute("gs-max-w")),e.minW=s.Utils.toNumber(t.getAttribute("gs-min-w")),e.maxH=s.Utils.toNumber(t.getAttribute("gs-max-h")),e.minH=s.Utils.toNumber(t.getAttribute("gs-min-h")),e.autoPosition=s.Utils.toBool(t.getAttribute("gs-auto-position")),e.noResize=s.Utils.toBool(t.getAttribute("gs-no-resize")),e.noMove=s.Utils.toBool(t.getAttribute("gs-no-move")),e.locked=s.Utils.toBool(t.getAttribute("gs-locked")),e.resizeHandles=t.getAttribute("gs-resize-handles"),e.id=t.getAttribute("gs-id");for(const t in e){if(!e.hasOwnProperty(t))return;e[t]||0===e[t]||delete e[t]}return e}_setStaticClass(){let t=["grid-stack-static"];return this.opts.staticGrid?(this.el.classList.add(...t),this.el.setAttribute("gs-static","true")):(this.el.classList.remove(...t),this.el.removeAttribute("gs-static")),this}onParentResize(){if(!this.el||!this.el.clientWidth)return;let t=!1;if(this._autoColumn&&this.parentGridItem)this.opts.column!==this.parentGridItem.w&&(t=!0,this.column(this.parentGridItem.w,"none"));else{let e=!this.opts.disableOneColumnMode&&this.el.clientWidth<=this.opts.oneColumnSize;1===this.opts.column!==e&&(t=!0,this.opts.animate&&this.setAnimation(!1),this.column(e?1:this._prevColumn),this.opts.animate&&this.setAnimation(!0))}return this._isAutoCellHeight&&(!t&&this.opts.cellHeightThrottle?(this._cellHeightThrottle||(this._cellHeightThrottle=s.Utils.throttle((()=>this.cellHeight()),this.opts.cellHeightThrottle)),this._cellHeightThrottle()):this.cellHeight()),this.engine.nodes.forEach((t=>{t.subGrid&&t.subGrid.onParentResize()})),this}_updateWindowResizeEvent(t=!1){const e=(this._isAutoCellHeight||!this.opts.disableOneColumnMode)&&!this.parentGridItem;return t||!e||this._windowResizeBind?!t&&e||!this._windowResizeBind||(window.removeEventListener("resize",this._windowResizeBind),delete this._windowResizeBind):(this._windowResizeBind=this.onParentResize.bind(this),window.addEventListener("resize",this._windowResizeBind)),this}static getElement(t=".grid-stack-item"){return s.Utils.getElement(t)}static getElements(t=".grid-stack-item"){return s.Utils.getElements(t)}static getGridElement(t){return l.getElement(t)}static getGridElements(t){return s.Utils.getElements(t)}_initMargin(){let t,e=0,i=[];return"string"==typeof this.opts.margin&&(i=this.opts.margin.split(" ")),2===i.length?(this.opts.marginTop=this.opts.marginBottom=i[0],this.opts.marginLeft=this.opts.marginRight=i[1]):4===i.length?(this.opts.marginTop=i[0],this.opts.marginRight=i[1],this.opts.marginBottom=i[2],this.opts.marginLeft=i[3]):(t=s.Utils.parseHeight(this.opts.margin),this.opts.marginUnit=t.unit,e=this.opts.margin=t.h),void 0===this.opts.marginTop?this.opts.marginTop=e:(t=s.Utils.parseHeight(this.opts.marginTop),this.opts.marginTop=t.h,delete this.opts.margin),void 0===this.opts.marginBottom?this.opts.marginBottom=e:(t=s.Utils.parseHeight(this.opts.marginBottom),this.opts.marginBottom=t.h,delete this.opts.margin),void 0===this.opts.marginRight?this.opts.marginRight=e:(t=s.Utils.parseHeight(this.opts.marginRight),this.opts.marginRight=t.h,delete this.opts.margin),void 0===this.opts.marginLeft?this.opts.marginLeft=e:(t=s.Utils.parseHeight(this.opts.marginLeft),this.opts.marginLeft=t.h,delete this.opts.margin),this.opts.marginUnit=t.unit,this.opts.marginTop===this.opts.marginBottom&&this.opts.marginLeft===this.opts.marginRight&&this.opts.marginTop===this.opts.marginRight&&(this.opts.margin=this.opts.marginTop),this}static setupDragIn(t,e){}movable(t,e){return this}resizable(t,e){return this}disable(){return this}enable(){return this}enableMove(t){return this}enableResize(t){return this}_removeDD(t){return this}_setupAcceptWidget(){return this}_setupRemoveDrop(){return this}_prepareDragDropByNode(t){return this}_onStartMoving(t,e,i,n,r,o){}_dragOrResize(t,e,i,n,r,o){}_leave(t,e){}commit(){return s.obsolete(this,this.batchUpdate(!1),"commit","batchUpdate","5.2"),this}}e.GridStack=l,l.Utils=s.Utils,l.Engine=o.GridStackEngine,l.GDRev="7.1.1";const c=i(168),h=i(427);r(i(470),e)},523:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.dragInDefaultOptions=e.gridDefaults=void 0,e.gridDefaults={alwaysShowResizeHandle:"mobile",animate:!0,auto:!0,cellHeight:"auto",cellHeightThrottle:100,cellHeightUnit:"px",column:12,draggable:{handle:".grid-stack-item-content",appendTo:"body"},handle:".grid-stack-item-content",itemClass:"grid-stack-item",margin:10,marginUnit:"px",maxRow:0,minRow:0,oneColumnSize:768,placeholderClass:"grid-stack-placeholder",placeholderText:"",removableOptions:{accept:".grid-stack-item"},resizable:{handles:"se"},rtl:"auto"},e.dragInDefaultOptions={handle:".grid-stack-item-content",appendTo:"body"}},284:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Utils=e.obsoleteAttr=e.obsoleteOptsDel=e.obsoleteOpts=e.obsolete=void 0,e.obsolete=function(t,e,i,n,r){let o=(...o)=>(console.warn("gridstack.js: Function `"+i+"` is deprecated in "+r+" and has been replaced with `"+n+"`. It will be **removed** in a future release"),e.apply(t,o));return o.prototype=e.prototype,o},e.obsoleteOpts=function(t,e,i,n){void 0!==t[e]&&(t[i]=t[e],console.warn("gridstack.js: Option `"+e+"` is deprecated in "+n+" and has been replaced with `"+i+"`. It will be **removed** in a future release"))},e.obsoleteOptsDel=function(t,e,i,n){void 0!==t[e]&&console.warn("gridstack.js: Option `"+e+"` is deprecated in "+i+n)},e.obsoleteAttr=function(t,e,i,n){let r=t.getAttribute(e);null!==r&&(t.setAttribute(i,r),console.warn("gridstack.js: attribute `"+e+"`="+r+" is deprecated on this object in "+n+" and has been replaced with `"+i+"`. It will be **removed** in a future release"))};class i{static getElements(t){if("string"==typeof t){let e=document.querySelectorAll(t);return e.length||"."===t[0]||"#"===t[0]||(e=document.querySelectorAll("."+t),e.length||(e=document.querySelectorAll("#"+t))),Array.from(e)}return[t]}static getElement(t){if("string"==typeof t){if(!t.length)return null;if("#"===t[0])return document.getElementById(t.substring(1));if("."===t[0]||"["===t[0])return document.querySelector(t);if(!isNaN(+t[0]))return document.getElementById(t);let e=document.querySelector(t);return e||(e=document.getElementById(t)),e||(e=document.querySelector("."+t)),e}return t}static isIntercepted(t,e){return!(t.y>=e.y+e.h||t.y+t.h<=e.y||t.x+t.w<=e.x||t.x>=e.x+e.w)}static isTouching(t,e){return i.isIntercepted(t,{x:e.x-.5,y:e.y-.5,w:e.w+1,h:e.h+1})}static areaIntercept(t,e){let i=t.x>e.x?t.x:e.x,n=t.x+t.w<e.x+e.w?t.x+t.w:e.x+e.w;if(n<=i)return 0;let r=t.y>e.y?t.y:e.y,o=t.y+t.h<e.y+e.h?t.y+t.h:e.y+e.h;return o<=r?0:(n-i)*(o-r)}static area(t){return t.w*t.h}static sort(t,e,i){return i=i||t.reduce(((t,e)=>Math.max(e.x+e.w,t)),0)||12,-1===e?t.sort(((t,e)=>e.x+e.y*i-(t.x+t.y*i))):t.sort(((t,e)=>t.x+t.y*i-(e.x+e.y*i)))}static createStylesheet(t,e){let i=document.createElement("style");return i.setAttribute("type","text/css"),i.setAttribute("gs-style-id",t),i.styleSheet?i.styleSheet.cssText="":i.appendChild(document.createTextNode("")),e?e.insertBefore(i,e.firstChild):(e=document.getElementsByTagName("head")[0]).appendChild(i),i.sheet}static removeStylesheet(t){let e=document.querySelector("STYLE[gs-style-id="+t+"]");e&&e.parentNode&&e.remove()}static addCSSRule(t,e,i){"function"==typeof t.addRule?t.addRule(e,i):"function"==typeof t.insertRule&&t.insertRule(`${e}{${i}}`)}static toBool(t){return"boolean"==typeof t?t:"string"==typeof t?!(""===(t=t.toLowerCase())||"no"===t||"false"===t||"0"===t):Boolean(t)}static toNumber(t){return null===t||0===t.length?void 0:Number(t)}static parseHeight(t){let e,i="px";if("string"==typeof t){let n=t.match(/^(-[0-9]+\.[0-9]+|[0-9]*\.[0-9]+|-[0-9]+|[0-9]+)(px|em|rem|vh|vw|%)?$/);if(!n)throw new Error("Invalid height");i=n[2]||"px",e=parseFloat(n[1])}else e=t;return{h:e,unit:i}}static defaults(t,...e){return e.forEach((e=>{for(const i in e){if(!e.hasOwnProperty(i))return;null===t[i]||void 0===t[i]?t[i]=e[i]:"object"==typeof e[i]&&"object"==typeof t[i]&&this.defaults(t[i],e[i])}})),t}static same(t,e){if("object"!=typeof t)return t==e;if(typeof t!=typeof e)return!1;if(Object.keys(t).length!==Object.keys(e).length)return!1;for(const i in t)if(t[i]!==e[i])return!1;return!0}static copyPos(t,e,i=!1){return t.x=e.x,t.y=e.y,t.w=e.w,t.h=e.h,i&&(e.minW&&(t.minW=e.minW),e.minH&&(t.minH=e.minH),e.maxW&&(t.maxW=e.maxW),e.maxH&&(t.maxH=e.maxH)),t}static samePos(t,e){return t&&e&&t.x===e.x&&t.y===e.y&&t.w===e.w&&t.h===e.h}static removeInternalAndSame(t,e){if("object"==typeof t&&"object"==typeof e)for(let i in t){let n=t[i];if("_"===i[0]||n===e[i])delete t[i];else if(n&&"object"==typeof n&&void 0!==e[i]){for(let t in n)n[t]!==e[i][t]&&"_"!==t[0]||delete n[t];Object.keys(n).length||delete t[i]}}}static removeInternalForSave(t,e=!0){for(let e in t)"_"!==e[0]&&null!==t[e]&&void 0!==t[e]||delete t[e];delete t.grid,e&&delete t.el,t.autoPosition||delete t.autoPosition,t.noResize||delete t.noResize,t.noMove||delete t.noMove,t.locked||delete t.locked,1!==t.w&&t.w!==t.minW||delete t.w,1!==t.h&&t.h!==t.minH||delete t.h}static closestUpByClass(t,e){for(;t;){if(t.classList.contains(e))return t;t=t.parentElement}return null}static throttle(t,e){let i=!1;return(...n)=>{i||(i=!0,setTimeout((()=>{t(...n),i=!1}),e))}}static removePositioningStyles(t){let e=t.style;e.position&&e.removeProperty("position"),e.left&&e.removeProperty("left"),e.top&&e.removeProperty("top"),e.width&&e.removeProperty("width"),e.height&&e.removeProperty("height")}static getScrollElement(t){if(!t)return document.scrollingElement||document.documentElement;const e=getComputedStyle(t);return/(auto|scroll)/.test(e.overflow+e.overflowY)?t:this.getScrollElement(t.parentElement)}static updateScrollPosition(t,e,i){let n=t.getBoundingClientRect(),r=window.innerHeight||document.documentElement.clientHeight;if(n.top<0||n.bottom>r){let o=n.bottom-r,s=n.top,a=this.getScrollElement(t);if(null!==a){let l=a.scrollTop;n.top<0&&i<0?t.offsetHeight>r?a.scrollTop+=i:a.scrollTop+=Math.abs(s)>Math.abs(i)?i:s:i>0&&(t.offsetHeight>r?a.scrollTop+=i:a.scrollTop+=o>i?i:o),e.top+=a.scrollTop-l}}}static updateScrollResize(t,e,i){const n=this.getScrollElement(e),r=n.clientHeight,o=n===this.getScrollElement()?0:n.getBoundingClientRect().top,s=t.clientY-o,a=s>r-i;s<i?n.scrollBy({behavior:"smooth",top:s-i}):a&&n.scrollBy({behavior:"smooth",top:i-(r-s)})}static clone(t){return null==t||"object"!=typeof t?t:t instanceof Array?[...t]:Object.assign({},t)}static cloneDeep(t){const e=["parentGrid","el","grid","subGrid","engine"],n=i.clone(t);for(const r in n)n.hasOwnProperty(r)&&"object"==typeof n[r]&&"__"!==r.substring(0,2)&&!e.find((t=>t===r))&&(n[r]=i.cloneDeep(t[r]));return n}static cloneNode(t){const e=t.cloneNode(!0);return e.removeAttribute("id"),e}static appendTo(t,e){let i;i="string"==typeof e?document.querySelector(e):e,i&&i.appendChild(t)}static addElStyles(t,e){if(e instanceof Object)for(const i in e)e.hasOwnProperty(i)&&(Array.isArray(e[i])?e[i].forEach((e=>{t.style[i]=e})):t.style[i]=e[i])}static initEvent(t,e){const i={type:e.type},n={button:0,which:0,buttons:1,bubbles:!0,cancelable:!0,target:e.target?e.target:t.target};return t.dataTransfer&&(i.dataTransfer=t.dataTransfer),["altKey","ctrlKey","metaKey","shiftKey"].forEach((e=>i[e]=t[e])),["pageX","pageY","clientX","clientY","screenX","screenY"].forEach((e=>i[e]=t[e])),Object.assign(Object.assign({},i),n)}static simulateMouseEvent(t,e,i){const n=document.createEvent("MouseEvents");n.initMouseEvent(e,!0,!0,window,1,t.screenX,t.screenY,t.clientX,t.clientY,t.ctrlKey,t.altKey,t.shiftKey,t.metaKey,0,t.target),(i||t.target).dispatchEvent(n)}}e.Utils=i},379:t=>{"use strict";var e=[];function i(t){for(var i=-1,n=0;n<e.length;n++)if(e[n].identifier===t){i=n;break}return i}function n(t,n){for(var o={},s=[],a=0;a<t.length;a++){var l=t[a],c=n.base?l[0]+n.base:l[0],h=o[c]||0,u="".concat(c," ").concat(h);o[c]=h+1;var d=i(u),f={css:l[1],media:l[2],sourceMap:l[3],supports:l[4],layer:l[5]};if(-1!==d)e[d].references++,e[d].updater(f);else{var p=r(f,n);n.byIndex=a,e.splice(a,0,{identifier:u,updater:p,references:1})}s.push(u)}return s}function r(t,e){var i=e.domAPI(e);return i.update(t),function(e){if(e){if(e.css===t.css&&e.media===t.media&&e.sourceMap===t.sourceMap&&e.supports===t.supports&&e.layer===t.layer)return;i.update(t=e)}else i.remove()}}t.exports=function(t,r){var o=n(t=t||[],r=r||{});return function(t){t=t||[];for(var s=0;s<o.length;s++){var a=i(o[s]);e[a].references--}for(var l=n(t,r),c=0;c<o.length;c++){var h=i(o[c]);0===e[h].references&&(e[h].updater(),e.splice(h,1))}o=l}}},569:t=>{"use strict";var e={};t.exports=function(t,i){var n=function(t){if(void 0===e[t]){var i=document.querySelector(t);if(window.HTMLIFrameElement&&i instanceof window.HTMLIFrameElement)try{i=i.contentDocument.head}catch(t){i=null}e[t]=i}return e[t]}(t);if(!n)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");n.appendChild(i)}},216:t=>{"use strict";t.exports=function(t){var e=document.createElement("style");return t.setAttributes(e,t.attributes),t.insert(e,t.options),e}},565:(t,e,i)=>{"use strict";t.exports=function(t){var e=i.nc;e&&t.setAttribute("nonce",e)}},795:t=>{"use strict";t.exports=function(t){var e=t.insertStyleElement(t);return{update:function(i){!function(t,e,i){var n="";i.supports&&(n+="@supports (".concat(i.supports,") {")),i.media&&(n+="@media ".concat(i.media," {"));var r=void 0!==i.layer;r&&(n+="@layer".concat(i.layer.length>0?" ".concat(i.layer):""," {")),n+=i.css,r&&(n+="}"),i.media&&(n+="}"),i.supports&&(n+="}");var o=i.sourceMap;o&&"undefined"!=typeof btoa&&(n+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(o))))," */")),e.styleTagTransform(n,t,e.options)}(e,t,i)},remove:function(){!function(t){if(null===t.parentNode)return!1;t.parentNode.removeChild(t)}(e)}}}},589:t=>{"use strict";t.exports=function(t,e){if(e.styleSheet)e.styleSheet.cssText=t;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(t))}}},810:t=>{"use strict";t.exports="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMTYuMC4wLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgLS0+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4PSIwcHgiIHk9IjBweCIgd2lkdGg9IjE2cHgiIGhlaWdodD0iMTZweCIgdmlld0JveD0iMCAwIDUxMS42MjYgNTExLjYyNyIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNTExLjYyNiA1MTEuNjI3OyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxnPgoJPHBhdGggZD0iTTMyOC45MDYsNDAxLjk5NGgtMzYuNTUzVjEwOS42MzZoMzYuNTUzYzQuOTQ4LDAsOS4yMzYtMS44MDksMTIuODQ3LTUuNDI2YzMuNjEzLTMuNjE1LDUuNDIxLTcuODk4LDUuNDIxLTEyLjg0NSAgIGMwLTQuOTQ5LTEuODAxLTkuMjMxLTUuNDI4LTEyLjg1MWwtNzMuMDg3LTczLjA5QzI2NS4wNDQsMS44MDksMjYwLjc2LDAsMjU1LjgxMywwYy00Ljk0OCwwLTkuMjI5LDEuODA5LTEyLjg0Nyw1LjQyNCAgIGwtNzMuMDg4LDczLjA5Yy0zLjYxOCwzLjYxOS01LjQyNCw3LjkwMi01LjQyNCwxMi44NTFjMCw0Ljk0NiwxLjgwNyw5LjIyOSw1LjQyNCwxMi44NDVjMy42MTksMy42MTcsNy45MDEsNS40MjYsMTIuODUsNS40MjYgICBoMzYuNTQ1djI5Mi4zNThoLTM2LjU0MmMtNC45NTIsMC05LjIzNSwxLjgwOC0xMi44NSw1LjQyMWMtMy42MTcsMy42MjEtNS40MjQsNy45MDUtNS40MjQsMTIuODU0ICAgYzAsNC45NDUsMS44MDcsOS4yMjcsNS40MjQsMTIuODQ3bDczLjA4OSw3My4wODhjMy42MTcsMy42MTcsNy44OTgsNS40MjQsMTIuODQ3LDUuNDI0YzQuOTUsMCw5LjIzNC0xLjgwNywxMi44NDktNS40MjQgICBsNzMuMDg3LTczLjA4OGMzLjYxMy0zLjYyLDUuNDIxLTcuOTAxLDUuNDIxLTEyLjg0N2MwLTQuOTQ4LTEuODA4LTkuMjMyLTUuNDIxLTEyLjg1NCAgIEMzMzguMTQyLDQwMy44MDIsMzMzLjg1Nyw0MDEuOTk0LDMyOC45MDYsNDAxLjk5NHoiIGZpbGw9IiM2NjY2NjYiLz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8L3N2Zz4K"}},e={};function i(n){var r=e[n];if(void 0!==r)return r.exports;var o=e[n]={id:n,exports:{}};return t[n].call(o.exports,o,o.exports,i),o.exports}i.m=t,i.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return i.d(e,{a:e}),e},i.d=(t,e)=>{for(var n in e)i.o(e,n)&&!i.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},i.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),i.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},i.b=document.baseURI||self.location.href,i.nc=void 0;var n={};return(()=>{"use strict";i.r(n),i.d(n,{AreaChartWidget:()=>pl,BarChartWidget:()=>Qa,BaseChartWidget:()=>za,BoxPlotWidget:()=>Nm,ChartJSWidget:()=>Jg,GridWidget:()=>Vm,GroupedBarChartWidget:()=>Ll,HeatMapWidget:()=>sm,LineChartWidget:()=>$a,PieChartWidget:()=>sl,SimpleGroupedBarChartWidget:()=>Gl,StackedBarChartWidget:()=>Dl,TextAreaElement:()=>Mm,TextElement:()=>mm,getResult:()=>S,initGrid:()=>A,polarisDashboard:()=>m.polarisDashboard});var t=i(379),e=i.n(t),r=i(795),o=i.n(r),s=i(569),a=i.n(s),l=i(565),c=i.n(l),h=i(216),u=i.n(h),d=i(589),f=i.n(d),p=i(466),g={};g.styleTagTransform=f(),g.setAttributes=c(),g.insert=a().bind(null,"head"),g.domAPI=o(),g.insertStyleElement=u(),e()(p.Z,g),p.Z&&p.Z.locals&&p.Z.locals;var m=i(280),y=i(744),b={};b.styleTagTransform=f(),b.setAttributes=c(),b.insert=a().bind(null,"head"),b.domAPI=o(),b.insertStyleElement=u(),e()(y.Z,b),y.Z&&y.Z.locals&&y.Z.locals;var v=i(929);function x(t){return x="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},x(t)}function _(){_=function(){return t};var t={},e=Object.prototype,i=e.hasOwnProperty,n=Object.defineProperty||function(t,e,i){t[e]=i.value},r="function"==typeof Symbol?Symbol:{},o=r.iterator||"@@iterator",s=r.asyncIterator||"@@asyncIterator",a=r.toStringTag||"@@toStringTag";function l(t,e,i){return Object.defineProperty(t,e,{value:i,enumerable:!0,configurable:!0,writable:!0}),t[e]}try{l({},"")}catch(t){l=function(t,e,i){return t[e]=i}}function c(t,e,i,r){var o=e&&e.prototype instanceof d?e:d,s=Object.create(o.prototype),a=new E(r||[]);return n(s,"_invoke",{value:M(t,i,a)}),s}function h(t,e,i){try{return{type:"normal",arg:t.call(e,i)}}catch(t){return{type:"throw",arg:t}}}t.wrap=c;var u={};function d(){}function f(){}function p(){}var g={};l(g,o,(function(){return this}));var m=Object.getPrototypeOf,y=m&&m(m(O([])));y&&y!==e&&i.call(y,o)&&(g=y);var b=p.prototype=d.prototype=Object.create(g);function v(t){["next","throw","return"].forEach((function(e){l(t,e,(function(t){return this._invoke(e,t)}))}))}function w(t,e){function r(n,o,s,a){var l=h(t[n],t,o);if("throw"!==l.type){var c=l.arg,u=c.value;return u&&"object"==x(u)&&i.call(u,"__await")?e.resolve(u.__await).then((function(t){r("next",t,s,a)}),(function(t){r("throw",t,s,a)})):e.resolve(u).then((function(t){c.value=t,s(c)}),(function(t){return r("throw",t,s,a)}))}a(l.arg)}var o;n(this,"_invoke",{value:function(t,i){function n(){return new e((function(e,n){r(t,i,e,n)}))}return o=o?o.then(n,n):n()}})}function M(t,e,i){var n="suspendedStart";return function(r,o){if("executing"===n)throw new Error("Generator is already running");if("completed"===n){if("throw"===r)throw o;return{value:void 0,done:!0}}for(i.method=r,i.arg=o;;){var s=i.delegate;if(s){var a=k(s,i);if(a){if(a===u)continue;return a}}if("next"===i.method)i.sent=i._sent=i.arg;else if("throw"===i.method){if("suspendedStart"===n)throw n="completed",i.arg;i.dispatchException(i.arg)}else"return"===i.method&&i.abrupt("return",i.arg);n="executing";var l=h(t,e,i);if("normal"===l.type){if(n=i.done?"completed":"suspendedYield",l.arg===u)continue;return{value:l.arg,done:i.done}}"throw"===l.type&&(n="completed",i.method="throw",i.arg=l.arg)}}}function k(t,e){var i=e.method,n=t.iterator[i];if(void 0===n)return e.delegate=null,"throw"===i&&t.iterator.return&&(e.method="return",e.arg=void 0,k(t,e),"throw"===e.method)||"return"!==i&&(e.method="throw",e.arg=new TypeError("The iterator does not provide a '"+i+"' method")),u;var r=h(n,t.iterator,e.arg);if("throw"===r.type)return e.method="throw",e.arg=r.arg,e.delegate=null,u;var o=r.arg;return o?o.done?(e[t.resultName]=o.value,e.next=t.nextLoc,"return"!==e.method&&(e.method="next",e.arg=void 0),e.delegate=null,u):o:(e.method="throw",e.arg=new TypeError("iterator result is not an object"),e.delegate=null,u)}function S(t){var e={tryLoc:t[0]};1 in t&&(e.catchLoc=t[1]),2 in t&&(e.finallyLoc=t[2],e.afterLoc=t[3]),this.tryEntries.push(e)}function D(t){var e=t.completion||{};e.type="normal",delete e.arg,t.completion=e}function E(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(S,this),this.reset(!0)}function O(t){if(t){var e=t[o];if(e)return e.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var n=-1,r=function e(){for(;++n<t.length;)if(i.call(t,n))return e.value=t[n],e.done=!1,e;return e.value=void 0,e.done=!0,e};return r.next=r}}return{next:P}}function P(){return{value:void 0,done:!0}}return f.prototype=p,n(b,"constructor",{value:p,configurable:!0}),n(p,"constructor",{value:f,configurable:!0}),f.displayName=l(p,a,"GeneratorFunction"),t.isGeneratorFunction=function(t){var e="function"==typeof t&&t.constructor;return!!e&&(e===f||"GeneratorFunction"===(e.displayName||e.name))},t.mark=function(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,p):(t.__proto__=p,l(t,a,"GeneratorFunction")),t.prototype=Object.create(b),t},t.awrap=function(t){return{__await:t}},v(w.prototype),l(w.prototype,s,(function(){return this})),t.AsyncIterator=w,t.async=function(e,i,n,r,o){void 0===o&&(o=Promise);var s=new w(c(e,i,n,r),o);return t.isGeneratorFunction(i)?s:s.next().then((function(t){return t.done?t.value:s.next()}))},v(b),l(b,a,"Generator"),l(b,o,(function(){return this})),l(b,"toString",(function(){return"[object Generator]"})),t.keys=function(t){var e=Object(t),i=[];for(var n in e)i.push(n);return i.reverse(),function t(){for(;i.length;){var n=i.pop();if(n in e)return t.value=n,t.done=!1,t}return t.done=!0,t}},t.values=O,E.prototype={constructor:E,reset:function(t){if(this.prev=0,this.next=0,this.sent=this._sent=void 0,this.done=!1,this.delegate=null,this.method="next",this.arg=void 0,this.tryEntries.forEach(D),!t)for(var e in this)"t"===e.charAt(0)&&i.call(this,e)&&!isNaN(+e.slice(1))&&(this[e]=void 0)},stop:function(){this.done=!0;var t=this.tryEntries[0].completion;if("throw"===t.type)throw t.arg;return this.rval},dispatchException:function(t){if(this.done)throw t;var e=this;function n(i,n){return s.type="throw",s.arg=t,e.next=i,n&&(e.method="next",e.arg=void 0),!!n}for(var r=this.tryEntries.length-1;r>=0;--r){var o=this.tryEntries[r],s=o.completion;if("root"===o.tryLoc)return n("end");if(o.tryLoc<=this.prev){var a=i.call(o,"catchLoc"),l=i.call(o,"finallyLoc");if(a&&l){if(this.prev<o.catchLoc)return n(o.catchLoc,!0);if(this.prev<o.finallyLoc)return n(o.finallyLoc)}else if(a){if(this.prev<o.catchLoc)return n(o.catchLoc,!0)}else{if(!l)throw new Error("try statement without catch or finally");if(this.prev<o.finallyLoc)return n(o.finallyLoc)}}}},abrupt:function(t,e){for(var n=this.tryEntries.length-1;n>=0;--n){var r=this.tryEntries[n];if(r.tryLoc<=this.prev&&i.call(r,"finallyLoc")&&this.prev<r.finallyLoc){var o=r;break}}o&&("break"===t||"continue"===t)&&o.tryLoc<=e&&e<=o.finallyLoc&&(o=null);var s=o?o.completion:{};return s.type=t,s.arg=e,o?(this.method="next",this.next=o.finallyLoc,u):this.complete(s)},complete:function(t,e){if("throw"===t.type)throw t.arg;return"break"===t.type||"continue"===t.type?this.next=t.arg:"return"===t.type?(this.rval=this.arg=t.arg,this.method="return",this.next="end"):"normal"===t.type&&e&&(this.next=e),u},finish:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var i=this.tryEntries[e];if(i.finallyLoc===t)return this.complete(i.completion,i.afterLoc),D(i),u}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var i=this.tryEntries[e];if(i.tryLoc===t){var n=i.completion;if("throw"===n.type){var r=n.arg;D(i)}return r}}throw new Error("illegal catch attempt")},delegateYield:function(t,e,i){return this.delegate={iterator:O(t),resultName:e,nextLoc:i},"next"===this.method&&(this.arg=void 0),u}},t}function w(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,n=new Array(e);i<e;i++)n[i]=t[i];return n}function M(t,e,i,n,r,o,s){try{var a=t[o](s),l=a.value}catch(t){return void i(t)}a.done?e(l):Promise.resolve(l).then(n,r)}function k(t){return function(){var e=this,i=arguments;return new Promise((function(n,r){var o=t.apply(e,i);function s(t){M(o,n,r,s,a,"next",t)}function a(t){M(o,n,r,s,a,"throw",t)}s(void 0)}))}}function S(t,e){return D.apply(this,arguments)}function D(){return(D=k(_().mark((function t(e,i){var n,r;return _().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,fetch(i,{headers:{Authorization:"Basic ".concat(e)}});case 2:return n=t.sent,t.next=5,n.json();case 5:if(r=t.sent,200===n.status){t.next=8;break}throw Error(r.message);case 8:return t.abrupt("return",r);case 9:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function E(t,e){var i,n=function(t,e){var i="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!i){if(Array.isArray(t)||(i=function(t,e){if(t){if("string"==typeof t)return w(t,e);var i=Object.prototype.toString.call(t).slice(8,-1);return"Object"===i&&t.constructor&&(i=t.constructor.name),"Map"===i||"Set"===i?Array.from(t):"Arguments"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?w(t,e):void 0}}(t))||e&&t&&"number"==typeof t.length){i&&(t=i);var n=0,r=function(){};return{s:r,n:function(){return n>=t.length?{done:!0}:{done:!1,value:t[n++]}},e:function(t){throw t},f:r}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){i=i.call(t)},n:function(){var t=i.next();return s=t.done,t},e:function(t){a=!0,o=t},f:function(){try{s||null==i.return||i.return()}finally{if(a)throw o}}}}(t);try{for(n.s();!(i=n.n()).done;){var r=i.value;if(r.subGrid)E(r.subGrid.engine.nodes,e);else{var o=e[r.widgetId];if(o)O(r,o);else if(r.el.getAttribute("widgetId")){var s=r.el.getAttribute("widgetId");O(r,e[s])}else console.error("Couldn't find widget by id ".concat(r.widgetId))}}}catch(t){n.e(t)}finally{n.f()}}function O(t,e){var i=t.el.querySelector(".grid-stack-item-content");i.innerHTML="";var n=i.offsetWidth,r=i.offsetHeight,o=e.plot(n,r,i);null!=o&&(i.innerHTML=o)}function P(t){var e=t.srcElement.closest(".newWidget").cloneNode(!0);return e.style.removeProperty("newWidget"),e}function A(t,e){var i=t,n=v.GridStack.init({cellHeight:70,acceptWidgets:!0,removable:".dropzone-remove",minRow:2,subGrid:{disableOneColumnMode:!0,minRow:2,cellHeight:70,margin:5,acceptWidgets:!0,locked:!0,noResize:!0,noMove:!0,removable:".dropzone-remove"},subGridDynamic:!0});function r(){n.enableResize(!0),n.enableMove(!0),n.engine.nodes.map((function(t){t.subGrid&&(t.subGrid.enableResize(!0),t.subGrid.enableMove(!0))}))}function o(){n.enableResize(!1),n.enableMove(!1),n.engine.nodes.map((function(t){t.subGrid&&(t.subGrid.enableResize(!1),t.subGrid.enableMove(!1))}))}return n.load(e),n.setAnimation(!1),function(t){window.addEventListener("resize",(function(e){E(t.engine.nodes,i)}),!0)}(n),E(n.engine.nodes,i),o(),n.engine.nodes.map((function(t){t.subGrid&&t.subGrid.on("resizestop",(function(t,e){E(n.engine.nodes,i)}))})),n.on("removed change",(function(t,e){E(n.engine.nodes,i)})),n.on("added",(function(t,e){E(n.engine.nodes,i)})),{grid:n,toggleSidebar:function(){var t=document.getElementById("sidebar");"sidebar"===t.className?(o(),t.className="sidebar-hidden",function(t){for(;t.firstChild;)t.removeChild(t.firstChild)}(document.getElementById("available-widgets")),E(n.engine.nodes,i)):(t.className="sidebar",function(t){for(var e=document.getElementById("available-widgets"),i=0,n=Object.keys(t);i<n.length;i++){var r=n[i],o=document.createElement("div");e.appendChild(o,r),o.innerHTML='<div class="newWidget grid-stack-item" widgetId="'.concat(r,'"><div class="grid-stack-item-content"></div></div>'),s=t[r],a=void 0,l=void 0,a=o.querySelector(".grid-stack-item-content"),null!=(l=s.plot(400,400,a))&&(a.innerHTML=l)}var s,a,l}(i),v.GridStack.setupDragIn(".newWidget",{revert:"invalid",scroll:!1,appendTo:"body",helper:P}),r(),E(n.engine.nodes,i))},save:function(){return n.save().map((function(t){return t.subGrid?{x:t.x,y:t.y,w:t.w,h:t.h,subGrid:{x:t.subGrid.x,y:t.subGrid.y,w:t.subGrid.w,h:t.subGrid.h,children:t.subGrid.children.map((function(t){return{x:t.x,y:t.y,w:t.w,h:t.h,widgetId:t.widgetId}}))}}:{x:t.x,y:t.y,w:t.w,h:t.h,widgetId:t.widgetId}}))},load:function(t){n.removeAll(),n.load(t),E(n.engine.nodes,i),o()},enableWidgetMoveAndResize:r,disableWidgetMoveAndResize:o,refreshWidgets:function(t){i=t,E(n.engine.nodes,i)}}}function C(t,e){let i,n;if(void 0===e)for(const e of t)null!=e&&(void 0===i?e>=e&&(i=n=e):(i>e&&(i=e),n<e&&(n=e)));else{let r=-1;for(let o of t)null!=(o=e(o,++r,t))&&(void 0===i?o>=o&&(i=n=o):(i>o&&(i=o),n<o&&(n=o)))}return[i,n]}function T(t,e){let i;if(void 0===e)for(const e of t)null!=e&&(i<e||void 0===i&&e>=e)&&(i=e);else{let n=-1;for(let r of t)null!=(r=e(r,++n,t))&&(i<r||void 0===i&&r>=r)&&(i=r)}return i}function L(t,e,i){t=+t,e=+e,i=(r=arguments.length)<2?(e=t,t=0,1):r<3?1:+i;for(var n=-1,r=0|Math.max(0,Math.ceil((e-t)/i)),o=new Array(r);++n<r;)o[n]=t+n*i;return o}function R(t,e){if("function"!=typeof t[Symbol.iterator])throw new TypeError("values is not iterable");if("function"!=typeof e)throw new TypeError("mapper is not a function");return Array.from(t,((i,n)=>e(i,n,t)))}class j extends Map{constructor(t,e=U){if(super(),Object.defineProperties(this,{_intern:{value:new Map},_key:{value:e}}),null!=t)for(const[e,i]of t)this.set(e,i)}get(t){return super.get(N(this,t))}has(t){return super.has(N(this,t))}set(t,e){return super.set(I(this,t),e)}delete(t){return super.delete(H(this,t))}}class z extends Set{constructor(t,e=U){if(super(),Object.defineProperties(this,{_intern:{value:new Map},_key:{value:e}}),null!=t)for(const e of t)this.add(e)}has(t){return super.has(N(this,t))}add(t){return super.add(I(this,t))}delete(t){return super.delete(H(this,t))}}function N({_intern:t,_key:e},i){const n=e(i);return t.has(n)?t.get(n):i}function I({_intern:t,_key:e},i){const n=e(i);return t.has(n)?t.get(n):(t.set(n,i),i)}function H({_intern:t,_key:e},i){const n=e(i);return t.has(n)&&(i=t.get(n),t.delete(n)),i}function U(t){return null!==t&&"object"==typeof t?t.valueOf():t}function F(t){return t}var B=1e-6;function W(t){return"translate("+t+",0)"}function V(t){return"translate(0,"+t+")"}function $(t){return e=>+t(e)}function Y(t,e){return e=Math.max(0,t.bandwidth()-2*e)/2,t.round()&&(e=Math.round(e)),i=>+t(i)+e}function G(){return!this.__axis}function X(t,e){var i=[],n=null,r=null,o=6,s=6,a=3,l="undefined"!=typeof window&&window.devicePixelRatio>1?0:.5,c=1===t||4===t?-1:1,h=4===t||2===t?"x":"y",u=1===t||3===t?W:V;function d(d){var f=null==n?e.ticks?e.ticks.apply(e,i):e.domain():n,p=null==r?e.tickFormat?e.tickFormat.apply(e,i):F:r,g=Math.max(o,0)+a,m=e.range(),y=+m[0]+l,b=+m[m.length-1]+l,v=(e.bandwidth?Y:$)(e.copy(),l),x=d.selection?d.selection():d,_=x.selectAll(".domain").data([null]),w=x.selectAll(".tick").data(f,e).order(),M=w.exit(),k=w.enter().append("g").attr("class","tick"),S=w.select("line"),D=w.select("text");_=_.merge(_.enter().insert("path",".tick").attr("class","domain").attr("stroke","currentColor")),w=w.merge(k),S=S.merge(k.append("line").attr("stroke","currentColor").attr(h+"2",c*o)),D=D.merge(k.append("text").attr("fill","currentColor").attr(h,c*g).attr("dy",1===t?"0em":3===t?"0.71em":"0.32em")),d!==x&&(_=_.transition(d),w=w.transition(d),S=S.transition(d),D=D.transition(d),M=M.transition(d).attr("opacity",B).attr("transform",(function(t){return isFinite(t=v(t))?u(t+l):this.getAttribute("transform")})),k.attr("opacity",B).attr("transform",(function(t){var e=this.parentNode.__axis;return u((e&&isFinite(e=e(t))?e:v(t))+l)}))),M.remove(),_.attr("d",4===t||2===t?s?"M"+c*s+","+y+"H"+l+"V"+b+"H"+c*s:"M"+l+","+y+"V"+b:s?"M"+y+","+c*s+"V"+l+"H"+b+"V"+c*s:"M"+y+","+l+"H"+b),w.attr("opacity",1).attr("transform",(function(t){return u(v(t)+l)})),S.attr(h+"2",c*o),D.attr(h,c*g).text(p),x.filter(G).attr("fill","none").attr("font-size",10).attr("font-family","sans-serif").attr("text-anchor",2===t?"start":4===t?"end":"middle"),x.each((function(){this.__axis=v}))}return d.scale=function(t){return arguments.length?(e=t,d):e},d.ticks=function(){return i=Array.from(arguments),d},d.tickArguments=function(t){return arguments.length?(i=null==t?[]:Array.from(t),d):i.slice()},d.tickValues=function(t){return arguments.length?(n=null==t?null:Array.from(t),d):n&&n.slice()},d.tickFormat=function(t){return arguments.length?(r=t,d):r},d.tickSize=function(t){return arguments.length?(o=s=+t,d):o},d.tickSizeInner=function(t){return arguments.length?(o=+t,d):o},d.tickSizeOuter=function(t){return arguments.length?(s=+t,d):s},d.tickPadding=function(t){return arguments.length?(a=+t,d):a},d.offset=function(t){return arguments.length?(l=+t,d):l},d}function q(t){return X(3,t)}function Z(t){return X(4,t)}function K(){}function Q(t){return null==t?K:function(){return this.querySelector(t)}}function J(t){return null==t?[]:Array.isArray(t)?t:Array.from(t)}function tt(){return[]}function et(t){return null==t?tt:function(){return this.querySelectorAll(t)}}function it(t){return function(){return this.matches(t)}}function nt(t){return function(e){return e.matches(t)}}var rt=Array.prototype.find;function ot(){return this.firstElementChild}var st=Array.prototype.filter;function at(){return Array.from(this.children)}function lt(t){return new Array(t.length)}function ct(t,e){this.ownerDocument=t.ownerDocument,this.namespaceURI=t.namespaceURI,this._next=null,this._parent=t,this.__data__=e}function ht(t){return function(){return t}}function ut(t,e,i,n,r,o){for(var s,a=0,l=e.length,c=o.length;a<c;++a)(s=e[a])?(s.__data__=o[a],n[a]=s):i[a]=new ct(t,o[a]);for(;a<l;++a)(s=e[a])&&(r[a]=s)}function dt(t,e,i,n,r,o,s){var a,l,c,h=new Map,u=e.length,d=o.length,f=new Array(u);for(a=0;a<u;++a)(l=e[a])&&(f[a]=c=s.call(l,l.__data__,a,e)+"",h.has(c)?r[a]=l:h.set(c,l));for(a=0;a<d;++a)c=s.call(t,o[a],a,o)+"",(l=h.get(c))?(n[a]=l,l.__data__=o[a],h.delete(c)):i[a]=new ct(t,o[a]);for(a=0;a<u;++a)(l=e[a])&&h.get(f[a])===l&&(r[a]=l)}function ft(t){return t.__data__}function pt(t){return"object"==typeof t&&"length"in t?t:Array.from(t)}function gt(t,e){return t<e?-1:t>e?1:t>=e?0:NaN}ct.prototype={constructor:ct,appendChild:function(t){return this._parent.insertBefore(t,this._next)},insertBefore:function(t,e){return this._parent.insertBefore(t,e)},querySelector:function(t){return this._parent.querySelector(t)},querySelectorAll:function(t){return this._parent.querySelectorAll(t)}};var mt="http://www.w3.org/1999/xhtml";const yt={svg:"http://www.w3.org/2000/svg",xhtml:mt,xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};function bt(t){var e=t+="",i=e.indexOf(":");return i>=0&&"xmlns"!==(e=t.slice(0,i))&&(t=t.slice(i+1)),yt.hasOwnProperty(e)?{space:yt[e],local:t}:t}function vt(t){return function(){this.removeAttribute(t)}}function xt(t){return function(){this.removeAttributeNS(t.space,t.local)}}function _t(t,e){return function(){this.setAttribute(t,e)}}function wt(t,e){return function(){this.setAttributeNS(t.space,t.local,e)}}function Mt(t,e){return function(){var i=e.apply(this,arguments);null==i?this.removeAttribute(t):this.setAttribute(t,i)}}function kt(t,e){return function(){var i=e.apply(this,arguments);null==i?this.removeAttributeNS(t.space,t.local):this.setAttributeNS(t.space,t.local,i)}}function St(t){return t.ownerDocument&&t.ownerDocument.defaultView||t.document&&t||t.defaultView}function Dt(t){return function(){this.style.removeProperty(t)}}function Et(t,e,i){return function(){this.style.setProperty(t,e,i)}}function Ot(t,e,i){return function(){var n=e.apply(this,arguments);null==n?this.style.removeProperty(t):this.style.setProperty(t,n,i)}}function Pt(t,e){return t.style.getPropertyValue(e)||St(t).getComputedStyle(t,null).getPropertyValue(e)}function At(t){return function(){delete this[t]}}function Ct(t,e){return function(){this[t]=e}}function Tt(t,e){return function(){var i=e.apply(this,arguments);null==i?delete this[t]:this[t]=i}}function Lt(t){return t.trim().split(/^|\s+/)}function Rt(t){return t.classList||new jt(t)}function jt(t){this._node=t,this._names=Lt(t.getAttribute("class")||"")}function zt(t,e){for(var i=Rt(t),n=-1,r=e.length;++n<r;)i.add(e[n])}function Nt(t,e){for(var i=Rt(t),n=-1,r=e.length;++n<r;)i.remove(e[n])}function It(t){return function(){zt(this,t)}}function Ht(t){return function(){Nt(this,t)}}function Ut(t,e){return function(){(e.apply(this,arguments)?zt:Nt)(this,t)}}function Ft(){this.textContent=""}function Bt(t){return function(){this.textContent=t}}function Wt(t){return function(){var e=t.apply(this,arguments);this.textContent=null==e?"":e}}function Vt(){this.innerHTML=""}function $t(t){return function(){this.innerHTML=t}}function Yt(t){return function(){var e=t.apply(this,arguments);this.innerHTML=null==e?"":e}}function Gt(){this.nextSibling&&this.parentNode.appendChild(this)}function Xt(){this.previousSibling&&this.parentNode.insertBefore(this,this.parentNode.firstChild)}function qt(t){return function(){var e=this.ownerDocument,i=this.namespaceURI;return i===mt&&e.documentElement.namespaceURI===mt?e.createElement(t):e.createElementNS(i,t)}}function Zt(t){return function(){return this.ownerDocument.createElementNS(t.space,t.local)}}function Kt(t){var e=bt(t);return(e.local?Zt:qt)(e)}function Qt(){return null}function Jt(){var t=this.parentNode;t&&t.removeChild(this)}function te(){var t=this.cloneNode(!1),e=this.parentNode;return e?e.insertBefore(t,this.nextSibling):t}function ee(){var t=this.cloneNode(!0),e=this.parentNode;return e?e.insertBefore(t,this.nextSibling):t}function ie(t){return t.trim().split(/^|\s+/).map((function(t){var e="",i=t.indexOf(".");return i>=0&&(e=t.slice(i+1),t=t.slice(0,i)),{type:t,name:e}}))}function ne(t){return function(){var e=this.__on;if(e){for(var i,n=0,r=-1,o=e.length;n<o;++n)i=e[n],t.type&&i.type!==t.type||i.name!==t.name?e[++r]=i:this.removeEventListener(i.type,i.listener,i.options);++r?e.length=r:delete this.__on}}}function re(t,e,i){return function(){var n,r=this.__on,o=function(t){return function(e){t.call(this,e,this.__data__)}}(e);if(r)for(var s=0,a=r.length;s<a;++s)if((n=r[s]).type===t.type&&n.name===t.name)return this.removeEventListener(n.type,n.listener,n.options),this.addEventListener(n.type,n.listener=o,n.options=i),void(n.value=e);this.addEventListener(t.type,o,i),n={type:t.type,name:t.name,value:e,listener:o,options:i},r?r.push(n):this.__on=[n]}}function oe(t,e,i){var n=St(t),r=n.CustomEvent;"function"==typeof r?r=new r(e,i):(r=n.document.createEvent("Event"),i?(r.initEvent(e,i.bubbles,i.cancelable),r.detail=i.detail):r.initEvent(e,!1,!1)),t.dispatchEvent(r)}function se(t,e){return function(){return oe(this,t,e)}}function ae(t,e){return function(){return oe(this,t,e.apply(this,arguments))}}jt.prototype={add:function(t){this._names.indexOf(t)<0&&(this._names.push(t),this._node.setAttribute("class",this._names.join(" ")))},remove:function(t){var e=this._names.indexOf(t);e>=0&&(this._names.splice(e,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(t){return this._names.indexOf(t)>=0}};var le=[null];function ce(t,e){this._groups=t,this._parents=e}function he(){return new ce([[document.documentElement]],le)}ce.prototype=he.prototype={constructor:ce,select:function(t){"function"!=typeof t&&(t=Q(t));for(var e=this._groups,i=e.length,n=new Array(i),r=0;r<i;++r)for(var o,s,a=e[r],l=a.length,c=n[r]=new Array(l),h=0;h<l;++h)(o=a[h])&&(s=t.call(o,o.__data__,h,a))&&("__data__"in o&&(s.__data__=o.__data__),c[h]=s);return new ce(n,this._parents)},selectAll:function(t){t="function"==typeof t?function(t){return function(){return J(t.apply(this,arguments))}}(t):et(t);for(var e=this._groups,i=e.length,n=[],r=[],o=0;o<i;++o)for(var s,a=e[o],l=a.length,c=0;c<l;++c)(s=a[c])&&(n.push(t.call(s,s.__data__,c,a)),r.push(s));return new ce(n,r)},selectChild:function(t){return this.select(null==t?ot:function(t){return function(){return rt.call(this.children,t)}}("function"==typeof t?t:nt(t)))},selectChildren:function(t){return this.selectAll(null==t?at:function(t){return function(){return st.call(this.children,t)}}("function"==typeof t?t:nt(t)))},filter:function(t){"function"!=typeof t&&(t=it(t));for(var e=this._groups,i=e.length,n=new Array(i),r=0;r<i;++r)for(var o,s=e[r],a=s.length,l=n[r]=[],c=0;c<a;++c)(o=s[c])&&t.call(o,o.__data__,c,s)&&l.push(o);return new ce(n,this._parents)},data:function(t,e){if(!arguments.length)return Array.from(this,ft);var i=e?dt:ut,n=this._parents,r=this._groups;"function"!=typeof t&&(t=ht(t));for(var o=r.length,s=new Array(o),a=new Array(o),l=new Array(o),c=0;c<o;++c){var h=n[c],u=r[c],d=u.length,f=pt(t.call(h,h&&h.__data__,c,n)),p=f.length,g=a[c]=new Array(p),m=s[c]=new Array(p),y=l[c]=new Array(d);i(h,u,g,m,y,f,e);for(var b,v,x=0,_=0;x<p;++x)if(b=g[x]){for(x>=_&&(_=x+1);!(v=m[_])&&++_<p;);b._next=v||null}}return(s=new ce(s,n))._enter=a,s._exit=l,s},enter:function(){return new ce(this._enter||this._groups.map(lt),this._parents)},exit:function(){return new ce(this._exit||this._groups.map(lt),this._parents)},join:function(t,e,i){var n=this.enter(),r=this,o=this.exit();return"function"==typeof t?(n=t(n))&&(n=n.selection()):n=n.append(t+""),null!=e&&(r=e(r))&&(r=r.selection()),null==i?o.remove():i(o),n&&r?n.merge(r).order():r},merge:function(t){for(var e=t.selection?t.selection():t,i=this._groups,n=e._groups,r=i.length,o=n.length,s=Math.min(r,o),a=new Array(r),l=0;l<s;++l)for(var c,h=i[l],u=n[l],d=h.length,f=a[l]=new Array(d),p=0;p<d;++p)(c=h[p]||u[p])&&(f[p]=c);for(;l<r;++l)a[l]=i[l];return new ce(a,this._parents)},selection:function(){return this},order:function(){for(var t=this._groups,e=-1,i=t.length;++e<i;)for(var n,r=t[e],o=r.length-1,s=r[o];--o>=0;)(n=r[o])&&(s&&4^n.compareDocumentPosition(s)&&s.parentNode.insertBefore(n,s),s=n);return this},sort:function(t){function e(e,i){return e&&i?t(e.__data__,i.__data__):!e-!i}t||(t=gt);for(var i=this._groups,n=i.length,r=new Array(n),o=0;o<n;++o){for(var s,a=i[o],l=a.length,c=r[o]=new Array(l),h=0;h<l;++h)(s=a[h])&&(c[h]=s);c.sort(e)}return new ce(r,this._parents).order()},call:function(){var t=arguments[0];return arguments[0]=this,t.apply(null,arguments),this},nodes:function(){return Array.from(this)},node:function(){for(var t=this._groups,e=0,i=t.length;e<i;++e)for(var n=t[e],r=0,o=n.length;r<o;++r){var s=n[r];if(s)return s}return null},size:function(){let t=0;for(const e of this)++t;return t},empty:function(){return!this.node()},each:function(t){for(var e=this._groups,i=0,n=e.length;i<n;++i)for(var r,o=e[i],s=0,a=o.length;s<a;++s)(r=o[s])&&t.call(r,r.__data__,s,o);return this},attr:function(t,e){var i=bt(t);if(arguments.length<2){var n=this.node();return i.local?n.getAttributeNS(i.space,i.local):n.getAttribute(i)}return this.each((null==e?i.local?xt:vt:"function"==typeof e?i.local?kt:Mt:i.local?wt:_t)(i,e))},style:function(t,e,i){return arguments.length>1?this.each((null==e?Dt:"function"==typeof e?Ot:Et)(t,e,null==i?"":i)):Pt(this.node(),t)},property:function(t,e){return arguments.length>1?this.each((null==e?At:"function"==typeof e?Tt:Ct)(t,e)):this.node()[t]},classed:function(t,e){var i=Lt(t+"");if(arguments.length<2){for(var n=Rt(this.node()),r=-1,o=i.length;++r<o;)if(!n.contains(i[r]))return!1;return!0}return this.each(("function"==typeof e?Ut:e?It:Ht)(i,e))},text:function(t){return arguments.length?this.each(null==t?Ft:("function"==typeof t?Wt:Bt)(t)):this.node().textContent},html:function(t){return arguments.length?this.each(null==t?Vt:("function"==typeof t?Yt:$t)(t)):this.node().innerHTML},raise:function(){return this.each(Gt)},lower:function(){return this.each(Xt)},append:function(t){var e="function"==typeof t?t:Kt(t);return this.select((function(){return this.appendChild(e.apply(this,arguments))}))},insert:function(t,e){var i="function"==typeof t?t:Kt(t),n=null==e?Qt:"function"==typeof e?e:Q(e);return this.select((function(){return this.insertBefore(i.apply(this,arguments),n.apply(this,arguments)||null)}))},remove:function(){return this.each(Jt)},clone:function(t){return this.select(t?ee:te)},datum:function(t){return arguments.length?this.property("__data__",t):this.node().__data__},on:function(t,e,i){var n,r,o=ie(t+""),s=o.length;if(!(arguments.length<2)){for(a=e?re:ne,n=0;n<s;++n)this.each(a(o[n],e,i));return this}var a=this.node().__on;if(a)for(var l,c=0,h=a.length;c<h;++c)for(n=0,l=a[c];n<s;++n)if((r=o[n]).type===l.type&&r.name===l.name)return l.value},dispatch:function(t,e){return this.each(("function"==typeof e?ae:se)(t,e))},[Symbol.iterator]:function*(){for(var t=this._groups,e=0,i=t.length;e<i;++e)for(var n,r=t[e],o=0,s=r.length;o<s;++o)(n=r[o])&&(yield n)}};const ue=he;var de={value:()=>{}};function fe(){for(var t,e=0,i=arguments.length,n={};e<i;++e){if(!(t=arguments[e]+"")||t in n||/[\s.]/.test(t))throw new Error("illegal type: "+t);n[t]=[]}return new pe(n)}function pe(t){this._=t}function ge(t,e){return t.trim().split(/^|\s+/).map((function(t){var i="",n=t.indexOf(".");if(n>=0&&(i=t.slice(n+1),t=t.slice(0,n)),t&&!e.hasOwnProperty(t))throw new Error("unknown type: "+t);return{type:t,name:i}}))}function me(t,e){for(var i,n=0,r=t.length;n<r;++n)if((i=t[n]).name===e)return i.value}function ye(t,e,i){for(var n=0,r=t.length;n<r;++n)if(t[n].name===e){t[n]=de,t=t.slice(0,n).concat(t.slice(n+1));break}return null!=i&&t.push({name:e,value:i}),t}pe.prototype=fe.prototype={constructor:pe,on:function(t,e){var i,n=this._,r=ge(t+"",n),o=-1,s=r.length;if(!(arguments.length<2)){if(null!=e&&"function"!=typeof e)throw new Error("invalid callback: "+e);for(;++o<s;)if(i=(t=r[o]).type)n[i]=ye(n[i],t.name,e);else if(null==e)for(i in n)n[i]=ye(n[i],t.name,null);return this}for(;++o<s;)if((i=(t=r[o]).type)&&(i=me(n[i],t.name)))return i},copy:function(){var t={},e=this._;for(var i in e)t[i]=e[i].slice();return new pe(t)},call:function(t,e){if((i=arguments.length-2)>0)for(var i,n,r=new Array(i),o=0;o<i;++o)r[o]=arguments[o+2];if(!this._.hasOwnProperty(t))throw new Error("unknown type: "+t);for(o=0,i=(n=this._[t]).length;o<i;++o)n[o].value.apply(e,r)},apply:function(t,e,i){if(!this._.hasOwnProperty(t))throw new Error("unknown type: "+t);for(var n=this._[t],r=0,o=n.length;r<o;++r)n[r].value.apply(e,i)}};const be=fe;var ve,xe,_e=0,we=0,Me=0,ke=0,Se=0,De=0,Ee="object"==typeof performance&&performance.now?performance:Date,Oe="object"==typeof window&&window.requestAnimationFrame?window.requestAnimationFrame.bind(window):function(t){setTimeout(t,17)};function Pe(){return Se||(Oe(Ae),Se=Ee.now()+De)}function Ae(){Se=0}function Ce(){this._call=this._time=this._next=null}function Te(t,e,i){var n=new Ce;return n.restart(t,e,i),n}function Le(){Se=(ke=Ee.now())+De,_e=we=0;try{!function(){Pe(),++_e;for(var t,e=ve;e;)(t=Se-e._time)>=0&&e._call.call(void 0,t),e=e._next;--_e}()}finally{_e=0,function(){for(var t,e,i=ve,n=1/0;i;)i._call?(n>i._time&&(n=i._time),t=i,i=i._next):(e=i._next,i._next=null,i=t?t._next=e:ve=e);xe=t,je(n)}(),Se=0}}function Re(){var t=Ee.now(),e=t-ke;e>1e3&&(De-=e,ke=t)}function je(t){_e||(we&&(we=clearTimeout(we)),t-Se>24?(t<1/0&&(we=setTimeout(Le,t-Ee.now()-De)),Me&&(Me=clearInterval(Me))):(Me||(ke=Ee.now(),Me=setInterval(Re,1e3)),_e=1,Oe(Le)))}function ze(t,e,i){var n=new Ce;return e=null==e?0:+e,n.restart((i=>{n.stop(),t(i+e)}),e,i),n}Ce.prototype=Te.prototype={constructor:Ce,restart:function(t,e,i){if("function"!=typeof t)throw new TypeError("callback is not a function");i=(null==i?Pe():+i)+(null==e?0:+e),this._next||xe===this||(xe?xe._next=this:ve=this,xe=this),this._call=t,this._time=i,je()},stop:function(){this._call&&(this._call=null,this._time=1/0,je())}};var Ne=be("start","end","cancel","interrupt"),Ie=[];function He(t,e,i,n,r,o){var s=t.__transition;if(s){if(i in s)return}else t.__transition={};!function(t,e,i){var n,r=t.__transition;function o(l){var c,h,u,d;if(1!==i.state)return a();for(c in r)if((d=r[c]).name===i.name){if(3===d.state)return ze(o);4===d.state?(d.state=6,d.timer.stop(),d.on.call("interrupt",t,t.__data__,d.index,d.group),delete r[c]):+c<e&&(d.state=6,d.timer.stop(),d.on.call("cancel",t,t.__data__,d.index,d.group),delete r[c])}if(ze((function(){3===i.state&&(i.state=4,i.timer.restart(s,i.delay,i.time),s(l))})),i.state=2,i.on.call("start",t,t.__data__,i.index,i.group),2===i.state){for(i.state=3,n=new Array(u=i.tween.length),c=0,h=-1;c<u;++c)(d=i.tween[c].value.call(t,t.__data__,i.index,i.group))&&(n[++h]=d);n.length=h+1}}function s(e){for(var r=e<i.duration?i.ease.call(null,e/i.duration):(i.timer.restart(a),i.state=5,1),o=-1,s=n.length;++o<s;)n[o].call(t,r);5===i.state&&(i.on.call("end",t,t.__data__,i.index,i.group),a())}function a(){for(var n in i.state=6,i.timer.stop(),delete r[e],r)return;delete t.__transition}r[e]=i,i.timer=Te((function(t){i.state=1,i.timer.restart(o,i.delay,i.time),i.delay<=t&&o(t-i.delay)}),0,i.time)}(t,i,{name:e,index:n,group:r,on:Ne,tween:Ie,time:o.time,delay:o.delay,duration:o.duration,ease:o.ease,timer:null,state:0})}function Ue(t,e){var i=Be(t,e);if(i.state>0)throw new Error("too late; already scheduled");return i}function Fe(t,e){var i=Be(t,e);if(i.state>3)throw new Error("too late; already running");return i}function Be(t,e){var i=t.__transition;if(!i||!(i=i[e]))throw new Error("transition not found");return i}function We(t,e){return t=+t,e=+e,function(i){return t*(1-i)+e*i}}var Ve,$e=180/Math.PI,Ye={translateX:0,translateY:0,rotate:0,skewX:0,scaleX:1,scaleY:1};function Ge(t,e,i,n,r,o){var s,a,l;return(s=Math.sqrt(t*t+e*e))&&(t/=s,e/=s),(l=t*i+e*n)&&(i-=t*l,n-=e*l),(a=Math.sqrt(i*i+n*n))&&(i/=a,n/=a,l/=a),t*n<e*i&&(t=-t,e=-e,l=-l,s=-s),{translateX:r,translateY:o,rotate:Math.atan2(e,t)*$e,skewX:Math.atan(l)*$e,scaleX:s,scaleY:a}}function Xe(t,e,i,n){function r(t){return t.length?t.pop()+" ":""}return function(o,s){var a=[],l=[];return o=t(o),s=t(s),function(t,n,r,o,s,a){if(t!==r||n!==o){var l=s.push("translate(",null,e,null,i);a.push({i:l-4,x:We(t,r)},{i:l-2,x:We(n,o)})}else(r||o)&&s.push("translate("+r+e+o+i)}(o.translateX,o.translateY,s.translateX,s.translateY,a,l),function(t,e,i,o){t!==e?(t-e>180?e+=360:e-t>180&&(t+=360),o.push({i:i.push(r(i)+"rotate(",null,n)-2,x:We(t,e)})):e&&i.push(r(i)+"rotate("+e+n)}(o.rotate,s.rotate,a,l),function(t,e,i,o){t!==e?o.push({i:i.push(r(i)+"skewX(",null,n)-2,x:We(t,e)}):e&&i.push(r(i)+"skewX("+e+n)}(o.skewX,s.skewX,a,l),function(t,e,i,n,o,s){if(t!==i||e!==n){var a=o.push(r(o)+"scale(",null,",",null,")");s.push({i:a-4,x:We(t,i)},{i:a-2,x:We(e,n)})}else 1===i&&1===n||o.push(r(o)+"scale("+i+","+n+")")}(o.scaleX,o.scaleY,s.scaleX,s.scaleY,a,l),o=s=null,function(t){for(var e,i=-1,n=l.length;++i<n;)a[(e=l[i]).i]=e.x(t);return a.join("")}}}var qe=Xe((function(t){const e=new("function"==typeof DOMMatrix?DOMMatrix:WebKitCSSMatrix)(t+"");return e.isIdentity?Ye:Ge(e.a,e.b,e.c,e.d,e.e,e.f)}),"px, ","px)","deg)"),Ze=Xe((function(t){return null==t?Ye:(Ve||(Ve=document.createElementNS("http://www.w3.org/2000/svg","g")),Ve.setAttribute("transform",t),(t=Ve.transform.baseVal.consolidate())?Ge((t=t.matrix).a,t.b,t.c,t.d,t.e,t.f):Ye)}),", ",")",")");function Ke(t,e){var i,n;return function(){var r=Fe(this,t),o=r.tween;if(o!==i)for(var s=0,a=(n=i=o).length;s<a;++s)if(n[s].name===e){(n=n.slice()).splice(s,1);break}r.tween=n}}function Qe(t,e,i){var n,r;if("function"!=typeof i)throw new Error;return function(){var o=Fe(this,t),s=o.tween;if(s!==n){r=(n=s).slice();for(var a={name:e,value:i},l=0,c=r.length;l<c;++l)if(r[l].name===e){r[l]=a;break}l===c&&r.push(a)}o.tween=r}}function Je(t,e,i){var n=t._id;return t.each((function(){var t=Fe(this,n);(t.value||(t.value={}))[e]=i.apply(this,arguments)})),function(t){return Be(t,n).value[e]}}function ti(t,e,i){t.prototype=e.prototype=i,i.constructor=t}function ei(t,e){var i=Object.create(t.prototype);for(var n in e)i[n]=e[n];return i}function ii(){}var ni=.7,ri=1/ni,oi="\\s*([+-]?\\d+)\\s*",si="\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)\\s*",ai="\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)%\\s*",li=/^#([0-9a-f]{3,8})$/,ci=new RegExp(`^rgb\\(${oi},${oi},${oi}\\)$`),hi=new RegExp(`^rgb\\(${ai},${ai},${ai}\\)$`),ui=new RegExp(`^rgba\\(${oi},${oi},${oi},${si}\\)$`),di=new RegExp(`^rgba\\(${ai},${ai},${ai},${si}\\)$`),fi=new RegExp(`^hsl\\(${si},${ai},${ai}\\)$`),pi=new RegExp(`^hsla\\(${si},${ai},${ai},${si}\\)$`),gi={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074};function mi(){return this.rgb().formatHex()}function yi(){return this.rgb().formatRgb()}function bi(t){var e,i;return t=(t+"").trim().toLowerCase(),(e=li.exec(t))?(i=e[1].length,e=parseInt(e[1],16),6===i?vi(e):3===i?new Mi(e>>8&15|e>>4&240,e>>4&15|240&e,(15&e)<<4|15&e,1):8===i?xi(e>>24&255,e>>16&255,e>>8&255,(255&e)/255):4===i?xi(e>>12&15|e>>8&240,e>>8&15|e>>4&240,e>>4&15|240&e,((15&e)<<4|15&e)/255):null):(e=ci.exec(t))?new Mi(e[1],e[2],e[3],1):(e=hi.exec(t))?new Mi(255*e[1]/100,255*e[2]/100,255*e[3]/100,1):(e=ui.exec(t))?xi(e[1],e[2],e[3],e[4]):(e=di.exec(t))?xi(255*e[1]/100,255*e[2]/100,255*e[3]/100,e[4]):(e=fi.exec(t))?Pi(e[1],e[2]/100,e[3]/100,1):(e=pi.exec(t))?Pi(e[1],e[2]/100,e[3]/100,e[4]):gi.hasOwnProperty(t)?vi(gi[t]):"transparent"===t?new Mi(NaN,NaN,NaN,0):null}function vi(t){return new Mi(t>>16&255,t>>8&255,255&t,1)}function xi(t,e,i,n){return n<=0&&(t=e=i=NaN),new Mi(t,e,i,n)}function _i(t){return t instanceof ii||(t=bi(t)),t?new Mi((t=t.rgb()).r,t.g,t.b,t.opacity):new Mi}function wi(t,e,i,n){return 1===arguments.length?_i(t):new Mi(t,e,i,null==n?1:n)}function Mi(t,e,i,n){this.r=+t,this.g=+e,this.b=+i,this.opacity=+n}function ki(){return`#${Oi(this.r)}${Oi(this.g)}${Oi(this.b)}`}function Si(){const t=Di(this.opacity);return`${1===t?"rgb(":"rgba("}${Ei(this.r)}, ${Ei(this.g)}, ${Ei(this.b)}${1===t?")":`, ${t})`}`}function Di(t){return isNaN(t)?1:Math.max(0,Math.min(1,t))}function Ei(t){return Math.max(0,Math.min(255,Math.round(t)||0))}function Oi(t){return((t=Ei(t))<16?"0":"")+t.toString(16)}function Pi(t,e,i,n){return n<=0?t=e=i=NaN:i<=0||i>=1?t=e=NaN:e<=0&&(t=NaN),new Ci(t,e,i,n)}function Ai(t){if(t instanceof Ci)return new Ci(t.h,t.s,t.l,t.opacity);if(t instanceof ii||(t=bi(t)),!t)return new Ci;if(t instanceof Ci)return t;var e=(t=t.rgb()).r/255,i=t.g/255,n=t.b/255,r=Math.min(e,i,n),o=Math.max(e,i,n),s=NaN,a=o-r,l=(o+r)/2;return a?(s=e===o?(i-n)/a+6*(i<n):i===o?(n-e)/a+2:(e-i)/a+4,a/=l<.5?o+r:2-o-r,s*=60):a=l>0&&l<1?0:s,new Ci(s,a,l,t.opacity)}function Ci(t,e,i,n){this.h=+t,this.s=+e,this.l=+i,this.opacity=+n}function Ti(t){return(t=(t||0)%360)<0?t+360:t}function Li(t){return Math.max(0,Math.min(1,t||0))}function Ri(t,e,i){return 255*(t<60?e+(i-e)*t/60:t<180?i:t<240?e+(i-e)*(240-t)/60:e)}function ji(t,e,i,n,r){var o=t*t,s=o*t;return((1-3*t+3*o-s)*e+(4-6*o+3*s)*i+(1+3*t+3*o-3*s)*n+s*r)/6}ti(ii,bi,{copy(t){return Object.assign(new this.constructor,this,t)},displayable(){return this.rgb().displayable()},hex:mi,formatHex:mi,formatHex8:function(){return this.rgb().formatHex8()},formatHsl:function(){return Ai(this).formatHsl()},formatRgb:yi,toString:yi}),ti(Mi,wi,ei(ii,{brighter(t){return t=null==t?ri:Math.pow(ri,t),new Mi(this.r*t,this.g*t,this.b*t,this.opacity)},darker(t){return t=null==t?ni:Math.pow(ni,t),new Mi(this.r*t,this.g*t,this.b*t,this.opacity)},rgb(){return this},clamp(){return new Mi(Ei(this.r),Ei(this.g),Ei(this.b),Di(this.opacity))},displayable(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:ki,formatHex:ki,formatHex8:function(){return`#${Oi(this.r)}${Oi(this.g)}${Oi(this.b)}${Oi(255*(isNaN(this.opacity)?1:this.opacity))}`},formatRgb:Si,toString:Si})),ti(Ci,(function(t,e,i,n){return 1===arguments.length?Ai(t):new Ci(t,e,i,null==n?1:n)}),ei(ii,{brighter(t){return t=null==t?ri:Math.pow(ri,t),new Ci(this.h,this.s,this.l*t,this.opacity)},darker(t){return t=null==t?ni:Math.pow(ni,t),new Ci(this.h,this.s,this.l*t,this.opacity)},rgb(){var t=this.h%360+360*(this.h<0),e=isNaN(t)||isNaN(this.s)?0:this.s,i=this.l,n=i+(i<.5?i:1-i)*e,r=2*i-n;return new Mi(Ri(t>=240?t-240:t+120,r,n),Ri(t,r,n),Ri(t<120?t+240:t-120,r,n),this.opacity)},clamp(){return new Ci(Ti(this.h),Li(this.s),Li(this.l),Di(this.opacity))},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl(){const t=Di(this.opacity);return`${1===t?"hsl(":"hsla("}${Ti(this.h)}, ${100*Li(this.s)}%, ${100*Li(this.l)}%${1===t?")":`, ${t})`}`}}));const zi=t=>()=>t;function Ni(t,e){var i=e-t;return i?function(t,e){return function(i){return t+i*e}}(t,i):zi(isNaN(t)?e:t)}const Ii=function t(e){var i=function(t){return 1==(t=+t)?Ni:function(e,i){return i-e?function(t,e,i){return t=Math.pow(t,i),e=Math.pow(e,i)-t,i=1/i,function(n){return Math.pow(t+n*e,i)}}(e,i,t):zi(isNaN(e)?i:e)}}(e);function n(t,e){var n=i((t=wi(t)).r,(e=wi(e)).r),r=i(t.g,e.g),o=i(t.b,e.b),s=Ni(t.opacity,e.opacity);return function(e){return t.r=n(e),t.g=r(e),t.b=o(e),t.opacity=s(e),t+""}}return n.gamma=t,n}(1);function Hi(t){return function(e){var i,n,r=e.length,o=new Array(r),s=new Array(r),a=new Array(r);for(i=0;i<r;++i)n=wi(e[i]),o[i]=n.r||0,s[i]=n.g||0,a[i]=n.b||0;return o=t(o),s=t(s),a=t(a),n.opacity=1,function(t){return n.r=o(t),n.g=s(t),n.b=a(t),n+""}}}var Ui=Hi((function(t){var e=t.length-1;return function(i){var n=i<=0?i=0:i>=1?(i=1,e-1):Math.floor(i*e),r=t[n],o=t[n+1],s=n>0?t[n-1]:2*r-o,a=n<e-1?t[n+2]:2*o-r;return ji((i-n/e)*e,s,r,o,a)}})),Fi=(Hi((function(t){var e=t.length;return function(i){var n=Math.floor(((i%=1)<0?++i:i)*e),r=t[(n+e-1)%e],o=t[n%e],s=t[(n+1)%e],a=t[(n+2)%e];return ji((i-n/e)*e,r,o,s,a)}})),/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g),Bi=new RegExp(Fi.source,"g");function Wi(t,e){var i,n,r,o=Fi.lastIndex=Bi.lastIndex=0,s=-1,a=[],l=[];for(t+="",e+="";(i=Fi.exec(t))&&(n=Bi.exec(e));)(r=n.index)>o&&(r=e.slice(o,r),a[s]?a[s]+=r:a[++s]=r),(i=i[0])===(n=n[0])?a[s]?a[s]+=n:a[++s]=n:(a[++s]=null,l.push({i:s,x:We(i,n)})),o=Bi.lastIndex;return o<e.length&&(r=e.slice(o),a[s]?a[s]+=r:a[++s]=r),a.length<2?l[0]?function(t){return function(e){return t(e)+""}}(l[0].x):function(t){return function(){return t}}(e):(e=l.length,function(t){for(var i,n=0;n<e;++n)a[(i=l[n]).i]=i.x(t);return a.join("")})}function Vi(t,e){var i;return("number"==typeof e?We:e instanceof bi?Ii:(i=bi(e))?(e=i,Ii):Wi)(t,e)}function $i(t){return function(){this.removeAttribute(t)}}function Yi(t){return function(){this.removeAttributeNS(t.space,t.local)}}function Gi(t,e,i){var n,r,o=i+"";return function(){var s=this.getAttribute(t);return s===o?null:s===n?r:r=e(n=s,i)}}function Xi(t,e,i){var n,r,o=i+"";return function(){var s=this.getAttributeNS(t.space,t.local);return s===o?null:s===n?r:r=e(n=s,i)}}function qi(t,e,i){var n,r,o;return function(){var s,a,l=i(this);if(null!=l)return(s=this.getAttribute(t))===(a=l+"")?null:s===n&&a===r?o:(r=a,o=e(n=s,l));this.removeAttribute(t)}}function Zi(t,e,i){var n,r,o;return function(){var s,a,l=i(this);if(null!=l)return(s=this.getAttributeNS(t.space,t.local))===(a=l+"")?null:s===n&&a===r?o:(r=a,o=e(n=s,l));this.removeAttributeNS(t.space,t.local)}}function Ki(t,e){return function(i){this.setAttribute(t,e.call(this,i))}}function Qi(t,e){return function(i){this.setAttributeNS(t.space,t.local,e.call(this,i))}}function Ji(t,e){var i,n;function r(){var r=e.apply(this,arguments);return r!==n&&(i=(n=r)&&Qi(t,r)),i}return r._value=e,r}function tn(t,e){var i,n;function r(){var r=e.apply(this,arguments);return r!==n&&(i=(n=r)&&Ki(t,r)),i}return r._value=e,r}function en(t,e){return function(){Ue(this,t).delay=+e.apply(this,arguments)}}function nn(t,e){return e=+e,function(){Ue(this,t).delay=e}}function rn(t,e){return function(){Fe(this,t).duration=+e.apply(this,arguments)}}function on(t,e){return e=+e,function(){Fe(this,t).duration=e}}function sn(t,e){if("function"!=typeof e)throw new Error;return function(){Fe(this,t).ease=e}}function an(t,e,i){var n,r,o=function(t){return(t+"").trim().split(/^|\s+/).every((function(t){var e=t.indexOf(".");return e>=0&&(t=t.slice(0,e)),!t||"start"===t}))}(e)?Ue:Fe;return function(){var s=o(this,t),a=s.on;a!==n&&(r=(n=a).copy()).on(e,i),s.on=r}}var ln=ue.prototype.constructor;function cn(t){return function(){this.style.removeProperty(t)}}function hn(t,e,i){return function(n){this.style.setProperty(t,e.call(this,n),i)}}function un(t,e,i){var n,r;function o(){var o=e.apply(this,arguments);return o!==r&&(n=(r=o)&&hn(t,o,i)),n}return o._value=e,o}function dn(t){return function(e){this.textContent=t.call(this,e)}}function fn(t){var e,i;function n(){var n=t.apply(this,arguments);return n!==i&&(e=(i=n)&&dn(n)),e}return n._value=t,n}var pn=0;function gn(t,e,i,n){this._groups=t,this._parents=e,this._name=i,this._id=n}function mn(){return++pn}var yn=ue.prototype;gn.prototype=function(t){return ue().transition(t)}.prototype={constructor:gn,select:function(t){var e=this._name,i=this._id;"function"!=typeof t&&(t=Q(t));for(var n=this._groups,r=n.length,o=new Array(r),s=0;s<r;++s)for(var a,l,c=n[s],h=c.length,u=o[s]=new Array(h),d=0;d<h;++d)(a=c[d])&&(l=t.call(a,a.__data__,d,c))&&("__data__"in a&&(l.__data__=a.__data__),u[d]=l,He(u[d],e,i,d,u,Be(a,i)));return new gn(o,this._parents,e,i)},selectAll:function(t){var e=this._name,i=this._id;"function"!=typeof t&&(t=et(t));for(var n=this._groups,r=n.length,o=[],s=[],a=0;a<r;++a)for(var l,c=n[a],h=c.length,u=0;u<h;++u)if(l=c[u]){for(var d,f=t.call(l,l.__data__,u,c),p=Be(l,i),g=0,m=f.length;g<m;++g)(d=f[g])&&He(d,e,i,g,f,p);o.push(f),s.push(l)}return new gn(o,s,e,i)},selectChild:yn.selectChild,selectChildren:yn.selectChildren,filter:function(t){"function"!=typeof t&&(t=it(t));for(var e=this._groups,i=e.length,n=new Array(i),r=0;r<i;++r)for(var o,s=e[r],a=s.length,l=n[r]=[],c=0;c<a;++c)(o=s[c])&&t.call(o,o.__data__,c,s)&&l.push(o);return new gn(n,this._parents,this._name,this._id)},merge:function(t){if(t._id!==this._id)throw new Error;for(var e=this._groups,i=t._groups,n=e.length,r=i.length,o=Math.min(n,r),s=new Array(n),a=0;a<o;++a)for(var l,c=e[a],h=i[a],u=c.length,d=s[a]=new Array(u),f=0;f<u;++f)(l=c[f]||h[f])&&(d[f]=l);for(;a<n;++a)s[a]=e[a];return new gn(s,this._parents,this._name,this._id)},selection:function(){return new ln(this._groups,this._parents)},transition:function(){for(var t=this._name,e=this._id,i=mn(),n=this._groups,r=n.length,o=0;o<r;++o)for(var s,a=n[o],l=a.length,c=0;c<l;++c)if(s=a[c]){var h=Be(s,e);He(s,t,i,c,a,{time:h.time+h.delay+h.duration,delay:0,duration:h.duration,ease:h.ease})}return new gn(n,this._parents,t,i)},call:yn.call,nodes:yn.nodes,node:yn.node,size:yn.size,empty:yn.empty,each:yn.each,on:function(t,e){var i=this._id;return arguments.length<2?Be(this.node(),i).on.on(t):this.each(an(i,t,e))},attr:function(t,e){var i=bt(t),n="transform"===i?Ze:Vi;return this.attrTween(t,"function"==typeof e?(i.local?Zi:qi)(i,n,Je(this,"attr."+t,e)):null==e?(i.local?Yi:$i)(i):(i.local?Xi:Gi)(i,n,e))},attrTween:function(t,e){var i="attr."+t;if(arguments.length<2)return(i=this.tween(i))&&i._value;if(null==e)return this.tween(i,null);if("function"!=typeof e)throw new Error;var n=bt(t);return this.tween(i,(n.local?Ji:tn)(n,e))},style:function(t,e,i){var n="transform"==(t+="")?qe:Vi;return null==e?this.styleTween(t,function(t,e){var i,n,r;return function(){var o=Pt(this,t),s=(this.style.removeProperty(t),Pt(this,t));return o===s?null:o===i&&s===n?r:r=e(i=o,n=s)}}(t,n)).on("end.style."+t,cn(t)):"function"==typeof e?this.styleTween(t,function(t,e,i){var n,r,o;return function(){var s=Pt(this,t),a=i(this),l=a+"";return null==a&&(this.style.removeProperty(t),l=a=Pt(this,t)),s===l?null:s===n&&l===r?o:(r=l,o=e(n=s,a))}}(t,n,Je(this,"style."+t,e))).each(function(t,e){var i,n,r,o,s="style."+e,a="end."+s;return function(){var l=Fe(this,t),c=l.on,h=null==l.value[s]?o||(o=cn(e)):void 0;c===i&&r===h||(n=(i=c).copy()).on(a,r=h),l.on=n}}(this._id,t)):this.styleTween(t,function(t,e,i){var n,r,o=i+"";return function(){var s=Pt(this,t);return s===o?null:s===n?r:r=e(n=s,i)}}(t,n,e),i).on("end.style."+t,null)},styleTween:function(t,e,i){var n="style."+(t+="");if(arguments.length<2)return(n=this.tween(n))&&n._value;if(null==e)return this.tween(n,null);if("function"!=typeof e)throw new Error;return this.tween(n,un(t,e,null==i?"":i))},text:function(t){return this.tween("text","function"==typeof t?function(t){return function(){var e=t(this);this.textContent=null==e?"":e}}(Je(this,"text",t)):function(t){return function(){this.textContent=t}}(null==t?"":t+""))},textTween:function(t){var e="text";if(arguments.length<1)return(e=this.tween(e))&&e._value;if(null==t)return this.tween(e,null);if("function"!=typeof t)throw new Error;return this.tween(e,fn(t))},remove:function(){return this.on("end.remove",function(t){return function(){var e=this.parentNode;for(var i in this.__transition)if(+i!==t)return;e&&e.removeChild(this)}}(this._id))},tween:function(t,e){var i=this._id;if(t+="",arguments.length<2){for(var n,r=Be(this.node(),i).tween,o=0,s=r.length;o<s;++o)if((n=r[o]).name===t)return n.value;return null}return this.each((null==e?Ke:Qe)(i,t,e))},delay:function(t){var e=this._id;return arguments.length?this.each(("function"==typeof t?en:nn)(e,t)):Be(this.node(),e).delay},duration:function(t){var e=this._id;return arguments.length?this.each(("function"==typeof t?rn:on)(e,t)):Be(this.node(),e).duration},ease:function(t){var e=this._id;return arguments.length?this.each(sn(e,t)):Be(this.node(),e).ease},easeVarying:function(t){if("function"!=typeof t)throw new Error;return this.each(function(t,e){return function(){var i=e.apply(this,arguments);if("function"!=typeof i)throw new Error;Fe(this,t).ease=i}}(this._id,t))},end:function(){var t,e,i=this,n=i._id,r=i.size();return new Promise((function(o,s){var a={value:s},l={value:function(){0==--r&&o()}};i.each((function(){var i=Fe(this,n),r=i.on;r!==t&&((e=(t=r).copy())._.cancel.push(a),e._.interrupt.push(a),e._.end.push(l)),i.on=e})),0===r&&o()}))},[Symbol.iterator]:yn[Symbol.iterator]};var bn={time:null,delay:0,duration:250,ease:function(t){return((t*=2)<=1?t*t*t:(t-=2)*t*t+2)/2}};function vn(t,e){for(var i;!(i=t.__transition)||!(i=i[e]);)if(!(t=t.parentNode))throw new Error(`transition ${e} not found`);return i}ue.prototype.interrupt=function(t){return this.each((function(){!function(t,e){var i,n,r,o=t.__transition,s=!0;if(o){for(r in e=null==e?null:e+"",o)(i=o[r]).name===e?(n=i.state>2&&i.state<5,i.state=6,i.timer.stop(),i.on.call(n?"interrupt":"cancel",t,t.__data__,i.index,i.group),delete o[r]):s=!1;s&&delete t.__transition}}(this,t)}))},ue.prototype.transition=function(t){var e,i;t instanceof gn?(e=t._id,t=t._name):(e=mn(),(i=bn).time=Pe(),t=null==t?null:t+"");for(var n=this._groups,r=n.length,o=0;o<r;++o)for(var s,a=n[o],l=a.length,c=0;c<l;++c)(s=a[c])&&He(s,t,e,c,a,i||vn(s,e));return new gn(n,this._parents,t,e)};const{abs:xn,max:_n,min:wn}=Math;function Mn(t){return{type:t}}function kn(t,e){switch(arguments.length){case 0:break;case 1:this.range(t);break;default:this.range(e).domain(t)}return this}function Sn(t,e){switch(arguments.length){case 0:break;case 1:"function"==typeof t?this.interpolator(t):this.range(t);break;default:this.domain(t),"function"==typeof e?this.interpolator(e):this.range(e)}return this}["w","e"].map(Mn),["n","s"].map(Mn),["n","w","e","s","nw","ne","sw","se"].map(Mn);const Dn=Symbol("implicit");function En(){var t=new j,e=[],i=[],n=Dn;function r(r){let o=t.get(r);if(void 0===o){if(n!==Dn)return n;t.set(r,o=e.push(r)-1)}return i[o%i.length]}return r.domain=function(i){if(!arguments.length)return e.slice();e=[],t=new j;for(const n of i)t.has(n)||t.set(n,e.push(n)-1);return r},r.range=function(t){return arguments.length?(i=Array.from(t),r):i.slice()},r.unknown=function(t){return arguments.length?(n=t,r):n},r.copy=function(){return En(e,i).unknown(n)},kn.apply(r,arguments),r}function On(){var t,e,i=En().unknown(void 0),n=i.domain,r=i.range,o=0,s=1,a=!1,l=0,c=0,h=.5;function u(){var i=n().length,u=s<o,d=u?s:o,f=u?o:s;t=(f-d)/Math.max(1,i-l+2*c),a&&(t=Math.floor(t)),d+=(f-d-t*(i-l))*h,e=t*(1-l),a&&(d=Math.round(d),e=Math.round(e));var p=L(i).map((function(e){return d+t*e}));return r(u?p.reverse():p)}return delete i.unknown,i.domain=function(t){return arguments.length?(n(t),u()):n()},i.range=function(t){return arguments.length?([o,s]=t,o=+o,s=+s,u()):[o,s]},i.rangeRound=function(t){return[o,s]=t,o=+o,s=+s,a=!0,u()},i.bandwidth=function(){return e},i.step=function(){return t},i.round=function(t){return arguments.length?(a=!!t,u()):a},i.padding=function(t){return arguments.length?(l=Math.min(1,c=+t),u()):l},i.paddingInner=function(t){return arguments.length?(l=Math.min(1,t),u()):l},i.paddingOuter=function(t){return arguments.length?(c=+t,u()):c},i.align=function(t){return arguments.length?(h=Math.max(0,Math.min(1,t)),u()):h},i.copy=function(){return On(n(),[o,s]).round(a).paddingInner(l).paddingOuter(c).align(h)},kn.apply(u(),arguments)}var Pn=Math.sqrt(50),An=Math.sqrt(10),Cn=Math.sqrt(2);function Tn(t,e,i){var n=(e-t)/Math.max(0,i),r=Math.floor(Math.log(n)/Math.LN10),o=n/Math.pow(10,r);return r>=0?(o>=Pn?10:o>=An?5:o>=Cn?2:1)*Math.pow(10,r):-Math.pow(10,-r)/(o>=Pn?10:o>=An?5:o>=Cn?2:1)}function Ln(t,e,i){var n=Math.abs(e-t)/Math.max(0,i),r=Math.pow(10,Math.floor(Math.log(n)/Math.LN10)),o=n/r;return o>=Pn?r*=10:o>=An?r*=5:o>=Cn&&(r*=2),e<t?-r:r}function Rn(t,e){return null==t||null==e?NaN:t<e?-1:t>e?1:t>=e?0:NaN}function jn(t,e){return null==t||null==e?NaN:e<t?-1:e>t?1:e>=t?0:NaN}function zn(t){let e,i,n;function r(t,n,r=0,o=t.length){if(r<o){if(0!==e(n,n))return o;do{const e=r+o>>>1;i(t[e],n)<0?r=e+1:o=e}while(r<o)}return r}return 2!==t.length?(e=Rn,i=(e,i)=>Rn(t(e),i),n=(e,i)=>t(e)-i):(e=t===Rn||t===jn?t:Nn,i=t,n=t),{left:r,center:function(t,e,i=0,o=t.length){const s=r(t,e,i,o-1);return s>i&&n(t[s-1],e)>-n(t[s],e)?s-1:s},right:function(t,n,r=0,o=t.length){if(r<o){if(0!==e(n,n))return o;do{const e=r+o>>>1;i(t[e],n)<=0?r=e+1:o=e}while(r<o)}return r}}}function Nn(){return 0}const In=zn(Rn),Hn=In.right,Un=(In.left,zn((function(t){return null===t?NaN:+t})).center,Hn);function Fn(t,e){var i,n=e?e.length:0,r=t?Math.min(n,t.length):0,o=new Array(r),s=new Array(n);for(i=0;i<r;++i)o[i]=$n(t[i],e[i]);for(;i<n;++i)s[i]=e[i];return function(t){for(i=0;i<r;++i)s[i]=o[i](t);return s}}function Bn(t,e){var i=new Date;return t=+t,e=+e,function(n){return i.setTime(t*(1-n)+e*n),i}}function Wn(t,e){var i,n={},r={};for(i in null!==t&&"object"==typeof t||(t={}),null!==e&&"object"==typeof e||(e={}),e)i in t?n[i]=$n(t[i],e[i]):r[i]=e[i];return function(t){for(i in n)r[i]=n[i](t);return r}}function Vn(t,e){e||(e=[]);var i,n=t?Math.min(e.length,t.length):0,r=e.slice();return function(o){for(i=0;i<n;++i)r[i]=t[i]*(1-o)+e[i]*o;return r}}function $n(t,e){var i,n,r=typeof e;return null==e||"boolean"===r?zi(e):("number"===r?We:"string"===r?(i=bi(e))?(e=i,Ii):Wi:e instanceof bi?Ii:e instanceof Date?Bn:(n=e,!ArrayBuffer.isView(n)||n instanceof DataView?Array.isArray(e)?Fn:"function"!=typeof e.valueOf&&"function"!=typeof e.toString||isNaN(e)?Wn:We:Vn))(t,e)}function Yn(t,e){return t=+t,e=+e,function(i){return Math.round(t*(1-i)+e*i)}}function Gn(t){return+t}var Xn=[0,1];function qn(t){return t}function Zn(t,e){return(e-=t=+t)?function(i){return(i-t)/e}:(i=isNaN(e)?NaN:.5,function(){return i});var i}function Kn(t,e,i){var n=t[0],r=t[1],o=e[0],s=e[1];return r<n?(n=Zn(r,n),o=i(s,o)):(n=Zn(n,r),o=i(o,s)),function(t){return o(n(t))}}function Qn(t,e,i){var n=Math.min(t.length,e.length)-1,r=new Array(n),o=new Array(n),s=-1;for(t[n]<t[0]&&(t=t.slice().reverse(),e=e.slice().reverse());++s<n;)r[s]=Zn(t[s],t[s+1]),o[s]=i(e[s],e[s+1]);return function(e){var i=Un(t,e,1,n)-1;return o[i](r[i](e))}}function Jn(t,e){return e.domain(t.domain()).range(t.range()).interpolate(t.interpolate()).clamp(t.clamp()).unknown(t.unknown())}function tr(){return function(){var t,e,i,n,r,o,s=Xn,a=Xn,l=$n,c=qn;function h(){var t,e,i,l=Math.min(s.length,a.length);return c!==qn&&(t=s[0],e=s[l-1],t>e&&(i=t,t=e,e=i),c=function(i){return Math.max(t,Math.min(e,i))}),n=l>2?Qn:Kn,r=o=null,u}function u(e){return null==e||isNaN(e=+e)?i:(r||(r=n(s.map(t),a,l)))(t(c(e)))}return u.invert=function(i){return c(e((o||(o=n(a,s.map(t),We)))(i)))},u.domain=function(t){return arguments.length?(s=Array.from(t,Gn),h()):s.slice()},u.range=function(t){return arguments.length?(a=Array.from(t),h()):a.slice()},u.rangeRound=function(t){return a=Array.from(t),l=Yn,h()},u.clamp=function(t){return arguments.length?(c=!!t||qn,h()):c!==qn},u.interpolate=function(t){return arguments.length?(l=t,h()):l},u.unknown=function(t){return arguments.length?(i=t,u):i},function(i,n){return t=i,e=n,h()}}()(qn,qn)}var er,ir=/^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;function nr(t){if(!(e=ir.exec(t)))throw new Error("invalid format: "+t);var e;return new rr({fill:e[1],align:e[2],sign:e[3],symbol:e[4],zero:e[5],width:e[6],comma:e[7],precision:e[8]&&e[8].slice(1),trim:e[9],type:e[10]})}function rr(t){this.fill=void 0===t.fill?" ":t.fill+"",this.align=void 0===t.align?">":t.align+"",this.sign=void 0===t.sign?"-":t.sign+"",this.symbol=void 0===t.symbol?"":t.symbol+"",this.zero=!!t.zero,this.width=void 0===t.width?void 0:+t.width,this.comma=!!t.comma,this.precision=void 0===t.precision?void 0:+t.precision,this.trim=!!t.trim,this.type=void 0===t.type?"":t.type+""}function or(t,e){if((i=(t=e?t.toExponential(e-1):t.toExponential()).indexOf("e"))<0)return null;var i,n=t.slice(0,i);return[n.length>1?n[0]+n.slice(2):n,+t.slice(i+1)]}function sr(t){return(t=or(Math.abs(t)))?t[1]:NaN}function ar(t,e){var i=or(t,e);if(!i)return t+"";var n=i[0],r=i[1];return r<0?"0."+new Array(-r).join("0")+n:n.length>r+1?n.slice(0,r+1)+"."+n.slice(r+1):n+new Array(r-n.length+2).join("0")}nr.prototype=rr.prototype,rr.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(void 0===this.width?"":Math.max(1,0|this.width))+(this.comma?",":"")+(void 0===this.precision?"":"."+Math.max(0,0|this.precision))+(this.trim?"~":"")+this.type};const lr={"%":(t,e)=>(100*t).toFixed(e),b:t=>Math.round(t).toString(2),c:t=>t+"",d:function(t){return Math.abs(t=Math.round(t))>=1e21?t.toLocaleString("en").replace(/,/g,""):t.toString(10)},e:(t,e)=>t.toExponential(e),f:(t,e)=>t.toFixed(e),g:(t,e)=>t.toPrecision(e),o:t=>Math.round(t).toString(8),p:(t,e)=>ar(100*t,e),r:ar,s:function(t,e){var i=or(t,e);if(!i)return t+"";var n=i[0],r=i[1],o=r-(er=3*Math.max(-8,Math.min(8,Math.floor(r/3))))+1,s=n.length;return o===s?n:o>s?n+new Array(o-s+1).join("0"):o>0?n.slice(0,o)+"."+n.slice(o):"0."+new Array(1-o).join("0")+or(t,Math.max(0,e+o-1))[0]},X:t=>Math.round(t).toString(16).toUpperCase(),x:t=>Math.round(t).toString(16)};function cr(t){return t}var hr,ur,dr,fr=Array.prototype.map,pr=["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"];function gr(t){var e=t.domain;return t.ticks=function(t){var i=e();return function(t,e,i){var n,r,o,s,a=-1;if(i=+i,(t=+t)==(e=+e)&&i>0)return[t];if((n=e<t)&&(r=t,t=e,e=r),0===(s=Tn(t,e,i))||!isFinite(s))return[];if(s>0){let i=Math.round(t/s),n=Math.round(e/s);for(i*s<t&&++i,n*s>e&&--n,o=new Array(r=n-i+1);++a<r;)o[a]=(i+a)*s}else{s=-s;let i=Math.round(t*s),n=Math.round(e*s);for(i/s<t&&++i,n/s>e&&--n,o=new Array(r=n-i+1);++a<r;)o[a]=(i+a)/s}return n&&o.reverse(),o}(i[0],i[i.length-1],null==t?10:t)},t.tickFormat=function(t,i){var n=e();return function(t,e,i,n){var r,o=Ln(t,e,i);switch((n=nr(null==n?",f":n)).type){case"s":var s=Math.max(Math.abs(t),Math.abs(e));return null!=n.precision||isNaN(r=function(t,e){return Math.max(0,3*Math.max(-8,Math.min(8,Math.floor(sr(e)/3)))-sr(Math.abs(t)))}(o,s))||(n.precision=r),dr(n,s);case"":case"e":case"g":case"p":case"r":null!=n.precision||isNaN(r=function(t,e){return t=Math.abs(t),e=Math.abs(e)-t,Math.max(0,sr(e)-sr(t))+1}(o,Math.max(Math.abs(t),Math.abs(e))))||(n.precision=r-("e"===n.type));break;case"f":case"%":null!=n.precision||isNaN(r=function(t){return Math.max(0,-sr(Math.abs(t)))}(o))||(n.precision=r-2*("%"===n.type))}return ur(n)}(n[0],n[n.length-1],null==t?10:t,i)},t.nice=function(i){null==i&&(i=10);var n,r,o=e(),s=0,a=o.length-1,l=o[s],c=o[a],h=10;for(c<l&&(r=l,l=c,c=r,r=s,s=a,a=r);h-- >0;){if((r=Tn(l,c,i))===n)return o[s]=l,o[a]=c,e(o);if(r>0)l=Math.floor(l/r)*r,c=Math.ceil(c/r)*r;else{if(!(r<0))break;l=Math.ceil(l*r)/r,c=Math.floor(c*r)/r}n=r}return t},t}function mr(){var t=tr();return t.copy=function(){return Jn(t,mr())},kn.apply(t,arguments),gr(t)}hr=function(t){var e,i,n=void 0===t.grouping||void 0===t.thousands?cr:(e=fr.call(t.grouping,Number),i=t.thousands+"",function(t,n){for(var r=t.length,o=[],s=0,a=e[0],l=0;r>0&&a>0&&(l+a+1>n&&(a=Math.max(1,n-l)),o.push(t.substring(r-=a,r+a)),!((l+=a+1)>n));)a=e[s=(s+1)%e.length];return o.reverse().join(i)}),r=void 0===t.currency?"":t.currency[0]+"",o=void 0===t.currency?"":t.currency[1]+"",s=void 0===t.decimal?".":t.decimal+"",a=void 0===t.numerals?cr:function(t){return function(e){return e.replace(/[0-9]/g,(function(e){return t[+e]}))}}(fr.call(t.numerals,String)),l=void 0===t.percent?"%":t.percent+"",c=void 0===t.minus?"−":t.minus+"",h=void 0===t.nan?"NaN":t.nan+"";function u(t){var e=(t=nr(t)).fill,i=t.align,u=t.sign,d=t.symbol,f=t.zero,p=t.width,g=t.comma,m=t.precision,y=t.trim,b=t.type;"n"===b?(g=!0,b="g"):lr[b]||(void 0===m&&(m=12),y=!0,b="g"),(f||"0"===e&&"="===i)&&(f=!0,e="0",i="=");var v="$"===d?r:"#"===d&&/[boxX]/.test(b)?"0"+b.toLowerCase():"",x="$"===d?o:/[%p]/.test(b)?l:"",_=lr[b],w=/[defgprs%]/.test(b);function M(t){var r,o,l,d=v,M=x;if("c"===b)M=_(t)+M,t="";else{var k=(t=+t)<0||1/t<0;if(t=isNaN(t)?h:_(Math.abs(t),m),y&&(t=function(t){t:for(var e,i=t.length,n=1,r=-1;n<i;++n)switch(t[n]){case".":r=e=n;break;case"0":0===r&&(r=n),e=n;break;default:if(!+t[n])break t;r>0&&(r=0)}return r>0?t.slice(0,r)+t.slice(e+1):t}(t)),k&&0==+t&&"+"!==u&&(k=!1),d=(k?"("===u?u:c:"-"===u||"("===u?"":u)+d,M=("s"===b?pr[8+er/3]:"")+M+(k&&"("===u?")":""),w)for(r=-1,o=t.length;++r<o;)if(48>(l=t.charCodeAt(r))||l>57){M=(46===l?s+t.slice(r+1):t.slice(r))+M,t=t.slice(0,r);break}}g&&!f&&(t=n(t,1/0));var S=d.length+t.length+M.length,D=S<p?new Array(p-S+1).join(e):"";switch(g&&f&&(t=n(D+t,D.length?p-M.length:1/0),D=""),i){case"<":t=d+t+M+D;break;case"=":t=d+D+t+M;break;case"^":t=D.slice(0,S=D.length>>1)+d+t+M+D.slice(S);break;default:t=D+d+t+M}return a(t)}return m=void 0===m?6:/[gprs]/.test(b)?Math.max(1,Math.min(21,m)):Math.max(0,Math.min(20,m)),M.toString=function(){return t+""},M}return{format:u,formatPrefix:function(t,e){var i=u(((t=nr(t)).type="f",t)),n=3*Math.max(-8,Math.min(8,Math.floor(sr(e)/3))),r=Math.pow(10,-n),o=pr[8+n/3];return function(t){return i(r*t)+o}}}}({thousands:",",grouping:[3],currency:["$",""]}),ur=hr.format,dr=hr.formatPrefix;const yr=1e3,br=6e4,vr=36e5,xr=864e5,_r=6048e5,wr=31536e6,Mr=new Date,kr=new Date;function Sr(t,e,i,n){function r(e){return t(e=0===arguments.length?new Date:new Date(+e)),e}return r.floor=e=>(t(e=new Date(+e)),e),r.ceil=i=>(t(i=new Date(i-1)),e(i,1),t(i),i),r.round=t=>{const e=r(t),i=r.ceil(t);return t-e<i-t?e:i},r.offset=(t,i)=>(e(t=new Date(+t),null==i?1:Math.floor(i)),t),r.range=(i,n,o)=>{const s=[];if(i=r.ceil(i),o=null==o?1:Math.floor(o),!(i<n&&o>0))return s;let a;do{s.push(a=new Date(+i)),e(i,o),t(i)}while(a<i&&i<n);return s},r.filter=i=>Sr((e=>{if(e>=e)for(;t(e),!i(e);)e.setTime(e-1)}),((t,n)=>{if(t>=t)if(n<0)for(;++n<=0;)for(;e(t,-1),!i(t););else for(;--n>=0;)for(;e(t,1),!i(t););})),i&&(r.count=(e,n)=>(Mr.setTime(+e),kr.setTime(+n),t(Mr),t(kr),Math.floor(i(Mr,kr))),r.every=t=>(t=Math.floor(t),isFinite(t)&&t>0?t>1?r.filter(n?e=>n(e)%t==0:e=>r.count(0,e)%t==0):r:null)),r}const Dr=Sr((()=>{}),((t,e)=>{t.setTime(+t+e)}),((t,e)=>e-t));Dr.every=t=>(t=Math.floor(t),isFinite(t)&&t>0?t>1?Sr((e=>{e.setTime(Math.floor(e/t)*t)}),((e,i)=>{e.setTime(+e+i*t)}),((e,i)=>(i-e)/t)):Dr:null),Dr.range;const Er=Sr((t=>{t.setTime(t-t.getMilliseconds())}),((t,e)=>{t.setTime(+t+e*yr)}),((t,e)=>(e-t)/yr),(t=>t.getUTCSeconds())),Or=(Er.range,Sr((t=>{t.setTime(t-t.getMilliseconds()-t.getSeconds()*yr)}),((t,e)=>{t.setTime(+t+e*br)}),((t,e)=>(e-t)/br),(t=>t.getMinutes()))),Pr=(Or.range,Sr((t=>{t.setUTCSeconds(0,0)}),((t,e)=>{t.setTime(+t+e*br)}),((t,e)=>(e-t)/br),(t=>t.getUTCMinutes()))),Ar=(Pr.range,Sr((t=>{t.setTime(t-t.getMilliseconds()-t.getSeconds()*yr-t.getMinutes()*br)}),((t,e)=>{t.setTime(+t+e*vr)}),((t,e)=>(e-t)/vr),(t=>t.getHours()))),Cr=(Ar.range,Sr((t=>{t.setUTCMinutes(0,0,0)}),((t,e)=>{t.setTime(+t+e*vr)}),((t,e)=>(e-t)/vr),(t=>t.getUTCHours()))),Tr=(Cr.range,Sr((t=>t.setHours(0,0,0,0)),((t,e)=>t.setDate(t.getDate()+e)),((t,e)=>(e-t-(e.getTimezoneOffset()-t.getTimezoneOffset())*br)/xr),(t=>t.getDate()-1))),Lr=(Tr.range,Sr((t=>{t.setUTCHours(0,0,0,0)}),((t,e)=>{t.setUTCDate(t.getUTCDate()+e)}),((t,e)=>(e-t)/xr),(t=>t.getUTCDate()-1))),Rr=(Lr.range,Sr((t=>{t.setUTCHours(0,0,0,0)}),((t,e)=>{t.setUTCDate(t.getUTCDate()+e)}),((t,e)=>(e-t)/xr),(t=>Math.floor(t/xr))));function jr(t){return Sr((e=>{e.setDate(e.getDate()-(e.getDay()+7-t)%7),e.setHours(0,0,0,0)}),((t,e)=>{t.setDate(t.getDate()+7*e)}),((t,e)=>(e-t-(e.getTimezoneOffset()-t.getTimezoneOffset())*br)/_r))}Rr.range;const zr=jr(0),Nr=jr(1),Ir=jr(2),Hr=jr(3),Ur=jr(4),Fr=jr(5),Br=jr(6);function Wr(t){return Sr((e=>{e.setUTCDate(e.getUTCDate()-(e.getUTCDay()+7-t)%7),e.setUTCHours(0,0,0,0)}),((t,e)=>{t.setUTCDate(t.getUTCDate()+7*e)}),((t,e)=>(e-t)/_r))}zr.range,Nr.range,Ir.range,Hr.range,Ur.range,Fr.range,Br.range;const Vr=Wr(0),$r=Wr(1),Yr=Wr(2),Gr=Wr(3),Xr=Wr(4),qr=Wr(5),Zr=Wr(6),Kr=(Vr.range,$r.range,Yr.range,Gr.range,Xr.range,qr.range,Zr.range,Sr((t=>{t.setDate(1),t.setHours(0,0,0,0)}),((t,e)=>{t.setMonth(t.getMonth()+e)}),((t,e)=>e.getMonth()-t.getMonth()+12*(e.getFullYear()-t.getFullYear())),(t=>t.getMonth()))),Qr=(Kr.range,Sr((t=>{t.setUTCDate(1),t.setUTCHours(0,0,0,0)}),((t,e)=>{t.setUTCMonth(t.getUTCMonth()+e)}),((t,e)=>e.getUTCMonth()-t.getUTCMonth()+12*(e.getUTCFullYear()-t.getUTCFullYear())),(t=>t.getUTCMonth()))),Jr=(Qr.range,Sr((t=>{t.setMonth(0,1),t.setHours(0,0,0,0)}),((t,e)=>{t.setFullYear(t.getFullYear()+e)}),((t,e)=>e.getFullYear()-t.getFullYear()),(t=>t.getFullYear())));Jr.every=t=>isFinite(t=Math.floor(t))&&t>0?Sr((e=>{e.setFullYear(Math.floor(e.getFullYear()/t)*t),e.setMonth(0,1),e.setHours(0,0,0,0)}),((e,i)=>{e.setFullYear(e.getFullYear()+i*t)})):null,Jr.range;const to=Sr((t=>{t.setUTCMonth(0,1),t.setUTCHours(0,0,0,0)}),((t,e)=>{t.setUTCFullYear(t.getUTCFullYear()+e)}),((t,e)=>e.getUTCFullYear()-t.getUTCFullYear()),(t=>t.getUTCFullYear()));function eo(t,e,i,n,r,o){const s=[[Er,1,yr],[Er,5,5e3],[Er,15,15e3],[Er,30,3e4],[o,1,br],[o,5,3e5],[o,15,9e5],[o,30,18e5],[r,1,vr],[r,3,108e5],[r,6,216e5],[r,12,432e5],[n,1,xr],[n,2,1728e5],[i,1,_r],[e,1,2592e6],[e,3,7776e6],[t,1,wr]];function a(e,i,n){const r=Math.abs(i-e)/n,o=zn((([,,t])=>t)).right(s,r);if(o===s.length)return t.every(Ln(e/wr,i/wr,n));if(0===o)return Dr.every(Math.max(Ln(e,i,n),1));const[a,l]=s[r/s[o-1][2]<s[o][2]/r?o-1:o];return a.every(l)}return[function(t,e,i){const n=e<t;n&&([t,e]=[e,t]);const r=i&&"function"==typeof i.range?i:a(t,e,i),o=r?r.range(t,+e+1):[];return n?o.reverse():o},a]}to.every=t=>isFinite(t=Math.floor(t))&&t>0?Sr((e=>{e.setUTCFullYear(Math.floor(e.getUTCFullYear()/t)*t),e.setUTCMonth(0,1),e.setUTCHours(0,0,0,0)}),((e,i)=>{e.setUTCFullYear(e.getUTCFullYear()+i*t)})):null,to.range;const[io,no]=eo(to,Qr,Vr,Rr,Cr,Pr),[ro,oo]=eo(Jr,Kr,zr,Tr,Ar,Or);function so(t){if(0<=t.y&&t.y<100){var e=new Date(-1,t.m,t.d,t.H,t.M,t.S,t.L);return e.setFullYear(t.y),e}return new Date(t.y,t.m,t.d,t.H,t.M,t.S,t.L)}function ao(t){if(0<=t.y&&t.y<100){var e=new Date(Date.UTC(-1,t.m,t.d,t.H,t.M,t.S,t.L));return e.setUTCFullYear(t.y),e}return new Date(Date.UTC(t.y,t.m,t.d,t.H,t.M,t.S,t.L))}function lo(t,e,i){return{y:t,m:e,d:i,H:0,M:0,S:0,L:0}}var co,ho,uo={"-":"",_:" ",0:"0"},fo=/^\s*\d+/,po=/^%/,go=/[\\^$*+?|[\]().{}]/g;function mo(t,e,i){var n=t<0?"-":"",r=(n?-t:t)+"",o=r.length;return n+(o<i?new Array(i-o+1).join(e)+r:r)}function yo(t){return t.replace(go,"\\$&")}function bo(t){return new RegExp("^(?:"+t.map(yo).join("|")+")","i")}function vo(t){return new Map(t.map(((t,e)=>[t.toLowerCase(),e])))}function xo(t,e,i){var n=fo.exec(e.slice(i,i+1));return n?(t.w=+n[0],i+n[0].length):-1}function _o(t,e,i){var n=fo.exec(e.slice(i,i+1));return n?(t.u=+n[0],i+n[0].length):-1}function wo(t,e,i){var n=fo.exec(e.slice(i,i+2));return n?(t.U=+n[0],i+n[0].length):-1}function Mo(t,e,i){var n=fo.exec(e.slice(i,i+2));return n?(t.V=+n[0],i+n[0].length):-1}function ko(t,e,i){var n=fo.exec(e.slice(i,i+2));return n?(t.W=+n[0],i+n[0].length):-1}function So(t,e,i){var n=fo.exec(e.slice(i,i+4));return n?(t.y=+n[0],i+n[0].length):-1}function Do(t,e,i){var n=fo.exec(e.slice(i,i+2));return n?(t.y=+n[0]+(+n[0]>68?1900:2e3),i+n[0].length):-1}function Eo(t,e,i){var n=/^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(e.slice(i,i+6));return n?(t.Z=n[1]?0:-(n[2]+(n[3]||"00")),i+n[0].length):-1}function Oo(t,e,i){var n=fo.exec(e.slice(i,i+1));return n?(t.q=3*n[0]-3,i+n[0].length):-1}function Po(t,e,i){var n=fo.exec(e.slice(i,i+2));return n?(t.m=n[0]-1,i+n[0].length):-1}function Ao(t,e,i){var n=fo.exec(e.slice(i,i+2));return n?(t.d=+n[0],i+n[0].length):-1}function Co(t,e,i){var n=fo.exec(e.slice(i,i+3));return n?(t.m=0,t.d=+n[0],i+n[0].length):-1}function To(t,e,i){var n=fo.exec(e.slice(i,i+2));return n?(t.H=+n[0],i+n[0].length):-1}function Lo(t,e,i){var n=fo.exec(e.slice(i,i+2));return n?(t.M=+n[0],i+n[0].length):-1}function Ro(t,e,i){var n=fo.exec(e.slice(i,i+2));return n?(t.S=+n[0],i+n[0].length):-1}function jo(t,e,i){var n=fo.exec(e.slice(i,i+3));return n?(t.L=+n[0],i+n[0].length):-1}function zo(t,e,i){var n=fo.exec(e.slice(i,i+6));return n?(t.L=Math.floor(n[0]/1e3),i+n[0].length):-1}function No(t,e,i){var n=po.exec(e.slice(i,i+1));return n?i+n[0].length:-1}function Io(t,e,i){var n=fo.exec(e.slice(i));return n?(t.Q=+n[0],i+n[0].length):-1}function Ho(t,e,i){var n=fo.exec(e.slice(i));return n?(t.s=+n[0],i+n[0].length):-1}function Uo(t,e){return mo(t.getDate(),e,2)}function Fo(t,e){return mo(t.getHours(),e,2)}function Bo(t,e){return mo(t.getHours()%12||12,e,2)}function Wo(t,e){return mo(1+Tr.count(Jr(t),t),e,3)}function Vo(t,e){return mo(t.getMilliseconds(),e,3)}function $o(t,e){return Vo(t,e)+"000"}function Yo(t,e){return mo(t.getMonth()+1,e,2)}function Go(t,e){return mo(t.getMinutes(),e,2)}function Xo(t,e){return mo(t.getSeconds(),e,2)}function qo(t){var e=t.getDay();return 0===e?7:e}function Zo(t,e){return mo(zr.count(Jr(t)-1,t),e,2)}function Ko(t){var e=t.getDay();return e>=4||0===e?Ur(t):Ur.ceil(t)}function Qo(t,e){return t=Ko(t),mo(Ur.count(Jr(t),t)+(4===Jr(t).getDay()),e,2)}function Jo(t){return t.getDay()}function ts(t,e){return mo(Nr.count(Jr(t)-1,t),e,2)}function es(t,e){return mo(t.getFullYear()%100,e,2)}function is(t,e){return mo((t=Ko(t)).getFullYear()%100,e,2)}function ns(t,e){return mo(t.getFullYear()%1e4,e,4)}function rs(t,e){var i=t.getDay();return mo((t=i>=4||0===i?Ur(t):Ur.ceil(t)).getFullYear()%1e4,e,4)}function os(t){var e=t.getTimezoneOffset();return(e>0?"-":(e*=-1,"+"))+mo(e/60|0,"0",2)+mo(e%60,"0",2)}function ss(t,e){return mo(t.getUTCDate(),e,2)}function as(t,e){return mo(t.getUTCHours(),e,2)}function ls(t,e){return mo(t.getUTCHours()%12||12,e,2)}function cs(t,e){return mo(1+Lr.count(to(t),t),e,3)}function hs(t,e){return mo(t.getUTCMilliseconds(),e,3)}function us(t,e){return hs(t,e)+"000"}function ds(t,e){return mo(t.getUTCMonth()+1,e,2)}function fs(t,e){return mo(t.getUTCMinutes(),e,2)}function ps(t,e){return mo(t.getUTCSeconds(),e,2)}function gs(t){var e=t.getUTCDay();return 0===e?7:e}function ms(t,e){return mo(Vr.count(to(t)-1,t),e,2)}function ys(t){var e=t.getUTCDay();return e>=4||0===e?Xr(t):Xr.ceil(t)}function bs(t,e){return t=ys(t),mo(Xr.count(to(t),t)+(4===to(t).getUTCDay()),e,2)}function vs(t){return t.getUTCDay()}function xs(t,e){return mo($r.count(to(t)-1,t),e,2)}function _s(t,e){return mo(t.getUTCFullYear()%100,e,2)}function ws(t,e){return mo((t=ys(t)).getUTCFullYear()%100,e,2)}function Ms(t,e){return mo(t.getUTCFullYear()%1e4,e,4)}function ks(t,e){var i=t.getUTCDay();return mo((t=i>=4||0===i?Xr(t):Xr.ceil(t)).getUTCFullYear()%1e4,e,4)}function Ss(){return"+0000"}function Ds(){return"%"}function Es(t){return+t}function Os(t){return Math.floor(+t/1e3)}function Ps(t){return new Date(t)}function As(t){return t instanceof Date?+t:+new Date(+t)}function Cs(t,e,i,n,r,o,s,a,l,c){var h=tr(),u=h.invert,d=h.domain,f=c(".%L"),p=c(":%S"),g=c("%I:%M"),m=c("%I %p"),y=c("%a %d"),b=c("%b %d"),v=c("%B"),x=c("%Y");function _(t){return(l(t)<t?f:a(t)<t?p:s(t)<t?g:o(t)<t?m:n(t)<t?r(t)<t?y:b:i(t)<t?v:x)(t)}return h.invert=function(t){return new Date(u(t))},h.domain=function(t){return arguments.length?d(Array.from(t,As)):d().map(Ps)},h.ticks=function(e){var i=d();return t(i[0],i[i.length-1],null==e?10:e)},h.tickFormat=function(t,e){return null==e?_:c(e)},h.nice=function(t){var i=d();return t&&"function"==typeof t.range||(t=e(i[0],i[i.length-1],null==t?10:t)),t?d(function(t,e){var i,n=0,r=(t=t.slice()).length-1,o=t[n],s=t[r];return s<o&&(i=n,n=r,r=i,i=o,o=s,s=i),t[n]=e.floor(o),t[r]=e.ceil(s),t}(i,t)):h},h.copy=function(){return Jn(h,Cs(t,e,i,n,r,o,s,a,l,c))},h}function Ts(){return kn.apply(Cs(ro,oo,Jr,Kr,zr,Tr,Ar,Or,Er,ho).domain([new Date(2e3,0,1),new Date(2e3,0,2)]),arguments)}function Ls(){var t,e,i,n,r,o=0,s=1,a=qn,l=!1;function c(e){return null==e||isNaN(e=+e)?r:a(0===i?.5:(e=(n(e)-t)*i,l?Math.max(0,Math.min(1,e)):e))}function h(t){return function(e){var i,n;return arguments.length?([i,n]=e,a=t(i,n),c):[a(0),a(1)]}}return c.domain=function(r){return arguments.length?([o,s]=r,t=n(o=+o),e=n(s=+s),i=t===e?0:1/(e-t),c):[o,s]},c.clamp=function(t){return arguments.length?(l=!!t,c):l},c.interpolator=function(t){return arguments.length?(a=t,c):a},c.range=h($n),c.rangeRound=h(Yn),c.unknown=function(t){return arguments.length?(r=t,c):r},function(r){return n=r,t=r(o),e=r(s),i=t===e?0:1/(e-t),c}}function Rs(t,e){return e.domain(t.domain()).interpolator(t.interpolator()).clamp(t.clamp()).unknown(t.unknown())}function js(){var t=gr(Ls()(qn));return t.copy=function(){return Rs(t,js())},Sn.apply(t,arguments)}function zs(t){for(var e=t.length/6|0,i=new Array(e),n=0;n<e;)i[n]="#"+t.slice(6*n,6*++n);return i}co=function(t){var e=t.dateTime,i=t.date,n=t.time,r=t.periods,o=t.days,s=t.shortDays,a=t.months,l=t.shortMonths,c=bo(r),h=vo(r),u=bo(o),d=vo(o),f=bo(s),p=vo(s),g=bo(a),m=vo(a),y=bo(l),b=vo(l),v={a:function(t){return s[t.getDay()]},A:function(t){return o[t.getDay()]},b:function(t){return l[t.getMonth()]},B:function(t){return a[t.getMonth()]},c:null,d:Uo,e:Uo,f:$o,g:is,G:rs,H:Fo,I:Bo,j:Wo,L:Vo,m:Yo,M:Go,p:function(t){return r[+(t.getHours()>=12)]},q:function(t){return 1+~~(t.getMonth()/3)},Q:Es,s:Os,S:Xo,u:qo,U:Zo,V:Qo,w:Jo,W:ts,x:null,X:null,y:es,Y:ns,Z:os,"%":Ds},x={a:function(t){return s[t.getUTCDay()]},A:function(t){return o[t.getUTCDay()]},b:function(t){return l[t.getUTCMonth()]},B:function(t){return a[t.getUTCMonth()]},c:null,d:ss,e:ss,f:us,g:ws,G:ks,H:as,I:ls,j:cs,L:hs,m:ds,M:fs,p:function(t){return r[+(t.getUTCHours()>=12)]},q:function(t){return 1+~~(t.getUTCMonth()/3)},Q:Es,s:Os,S:ps,u:gs,U:ms,V:bs,w:vs,W:xs,x:null,X:null,y:_s,Y:Ms,Z:Ss,"%":Ds},_={a:function(t,e,i){var n=f.exec(e.slice(i));return n?(t.w=p.get(n[0].toLowerCase()),i+n[0].length):-1},A:function(t,e,i){var n=u.exec(e.slice(i));return n?(t.w=d.get(n[0].toLowerCase()),i+n[0].length):-1},b:function(t,e,i){var n=y.exec(e.slice(i));return n?(t.m=b.get(n[0].toLowerCase()),i+n[0].length):-1},B:function(t,e,i){var n=g.exec(e.slice(i));return n?(t.m=m.get(n[0].toLowerCase()),i+n[0].length):-1},c:function(t,i,n){return k(t,e,i,n)},d:Ao,e:Ao,f:zo,g:Do,G:So,H:To,I:To,j:Co,L:jo,m:Po,M:Lo,p:function(t,e,i){var n=c.exec(e.slice(i));return n?(t.p=h.get(n[0].toLowerCase()),i+n[0].length):-1},q:Oo,Q:Io,s:Ho,S:Ro,u:_o,U:wo,V:Mo,w:xo,W:ko,x:function(t,e,n){return k(t,i,e,n)},X:function(t,e,i){return k(t,n,e,i)},y:Do,Y:So,Z:Eo,"%":No};function w(t,e){return function(i){var n,r,o,s=[],a=-1,l=0,c=t.length;for(i instanceof Date||(i=new Date(+i));++a<c;)37===t.charCodeAt(a)&&(s.push(t.slice(l,a)),null!=(r=uo[n=t.charAt(++a)])?n=t.charAt(++a):r="e"===n?" ":"0",(o=e[n])&&(n=o(i,r)),s.push(n),l=a+1);return s.push(t.slice(l,a)),s.join("")}}function M(t,e){return function(i){var n,r,o=lo(1900,void 0,1);if(k(o,t,i+="",0)!=i.length)return null;if("Q"in o)return new Date(o.Q);if("s"in o)return new Date(1e3*o.s+("L"in o?o.L:0));if(e&&!("Z"in o)&&(o.Z=0),"p"in o&&(o.H=o.H%12+12*o.p),void 0===o.m&&(o.m="q"in o?o.q:0),"V"in o){if(o.V<1||o.V>53)return null;"w"in o||(o.w=1),"Z"in o?(r=(n=ao(lo(o.y,0,1))).getUTCDay(),n=r>4||0===r?$r.ceil(n):$r(n),n=Lr.offset(n,7*(o.V-1)),o.y=n.getUTCFullYear(),o.m=n.getUTCMonth(),o.d=n.getUTCDate()+(o.w+6)%7):(r=(n=so(lo(o.y,0,1))).getDay(),n=r>4||0===r?Nr.ceil(n):Nr(n),n=Tr.offset(n,7*(o.V-1)),o.y=n.getFullYear(),o.m=n.getMonth(),o.d=n.getDate()+(o.w+6)%7)}else("W"in o||"U"in o)&&("w"in o||(o.w="u"in o?o.u%7:"W"in o?1:0),r="Z"in o?ao(lo(o.y,0,1)).getUTCDay():so(lo(o.y,0,1)).getDay(),o.m=0,o.d="W"in o?(o.w+6)%7+7*o.W-(r+5)%7:o.w+7*o.U-(r+6)%7);return"Z"in o?(o.H+=o.Z/100|0,o.M+=o.Z%100,ao(o)):so(o)}}function k(t,e,i,n){for(var r,o,s=0,a=e.length,l=i.length;s<a;){if(n>=l)return-1;if(37===(r=e.charCodeAt(s++))){if(r=e.charAt(s++),!(o=_[r in uo?e.charAt(s++):r])||(n=o(t,i,n))<0)return-1}else if(r!=i.charCodeAt(n++))return-1}return n}return v.x=w(i,v),v.X=w(n,v),v.c=w(e,v),x.x=w(i,x),x.X=w(n,x),x.c=w(e,x),{format:function(t){var e=w(t+="",v);return e.toString=function(){return t},e},parse:function(t){var e=M(t+="",!1);return e.toString=function(){return t},e},utcFormat:function(t){var e=w(t+="",x);return e.toString=function(){return t},e},utcParse:function(t){var e=M(t+="",!0);return e.toString=function(){return t},e}}}({dateTime:"%x, %X",date:"%-m/%-d/%Y",time:"%-I:%M:%S %p",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]}),ho=co.format,co.parse,co.utcFormat,co.utcParse;const Ns=zs("4e79a7f28e2ce1575976b7b259a14fedc949af7aa1ff9da79c755fbab0ab"),Is=t=>Ui(t[t.length-1]);var Hs=new Array(3).concat("fc8d59ffffbf99d594","d7191cfdae61abdda42b83ba","d7191cfdae61ffffbfabdda42b83ba","d53e4ffc8d59fee08be6f59899d5943288bd","d53e4ffc8d59fee08bffffbfe6f59899d5943288bd","d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd","d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd","9e0142d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd5e4fa2","9e0142d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd5e4fa2").map(zs);Is(Hs);const Us=Is(new Array(3).concat("e5f5e0a1d99b31a354","edf8e9bae4b374c476238b45","edf8e9bae4b374c47631a354006d2c","edf8e9c7e9c0a1d99b74c47631a354006d2c","edf8e9c7e9c0a1d99b74c47641ab5d238b45005a32","f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45005a32","f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45006d2c00441b").map(zs));function Fs(t){return"string"==typeof t?new ce([[document.querySelector(t)]],[document.documentElement]):new ce([[t]],le)}const Bs=Math.PI,Ws=2*Bs,Vs=1e-6,$s=Ws-Vs;function Ys(){this._x0=this._y0=this._x1=this._y1=null,this._=""}function Gs(){return new Ys}Ys.prototype=Gs.prototype={constructor:Ys,moveTo:function(t,e){this._+="M"+(this._x0=this._x1=+t)+","+(this._y0=this._y1=+e)},closePath:function(){null!==this._x1&&(this._x1=this._x0,this._y1=this._y0,this._+="Z")},lineTo:function(t,e){this._+="L"+(this._x1=+t)+","+(this._y1=+e)},quadraticCurveTo:function(t,e,i,n){this._+="Q"+ +t+","+ +e+","+(this._x1=+i)+","+(this._y1=+n)},bezierCurveTo:function(t,e,i,n,r,o){this._+="C"+ +t+","+ +e+","+ +i+","+ +n+","+(this._x1=+r)+","+(this._y1=+o)},arcTo:function(t,e,i,n,r){t=+t,e=+e,i=+i,n=+n,r=+r;var o=this._x1,s=this._y1,a=i-t,l=n-e,c=o-t,h=s-e,u=c*c+h*h;if(r<0)throw new Error("negative radius: "+r);if(null===this._x1)this._+="M"+(this._x1=t)+","+(this._y1=e);else if(u>Vs)if(Math.abs(h*a-l*c)>Vs&&r){var d=i-o,f=n-s,p=a*a+l*l,g=d*d+f*f,m=Math.sqrt(p),y=Math.sqrt(u),b=r*Math.tan((Bs-Math.acos((p+u-g)/(2*m*y)))/2),v=b/y,x=b/m;Math.abs(v-1)>Vs&&(this._+="L"+(t+v*c)+","+(e+v*h)),this._+="A"+r+","+r+",0,0,"+ +(h*d>c*f)+","+(this._x1=t+x*a)+","+(this._y1=e+x*l)}else this._+="L"+(this._x1=t)+","+(this._y1=e)},arc:function(t,e,i,n,r,o){t=+t,e=+e,o=!!o;var s=(i=+i)*Math.cos(n),a=i*Math.sin(n),l=t+s,c=e+a,h=1^o,u=o?n-r:r-n;if(i<0)throw new Error("negative radius: "+i);null===this._x1?this._+="M"+l+","+c:(Math.abs(this._x1-l)>Vs||Math.abs(this._y1-c)>Vs)&&(this._+="L"+l+","+c),i&&(u<0&&(u=u%Ws+Ws),u>$s?this._+="A"+i+","+i+",0,1,"+h+","+(t-s)+","+(e-a)+"A"+i+","+i+",0,1,"+h+","+(this._x1=l)+","+(this._y1=c):u>Vs&&(this._+="A"+i+","+i+",0,"+ +(u>=Bs)+","+h+","+(this._x1=t+i*Math.cos(r))+","+(this._y1=e+i*Math.sin(r))))},rect:function(t,e,i,n){this._+="M"+(this._x0=this._x1=+t)+","+(this._y0=this._y1=+e)+"h"+ +i+"v"+ +n+"h"+-i+"Z"},toString:function(){return this._}};const Xs=Gs;function qs(t){return function(){return t}}const Zs=Math.abs,Ks=Math.atan2,Qs=Math.cos,Js=Math.max,ta=Math.min,ea=Math.sin,ia=Math.sqrt,na=1e-12,ra=Math.PI,oa=ra/2,sa=2*ra;function aa(t){return t>1?0:t<-1?ra:Math.acos(t)}function la(t){return t>=1?oa:t<=-1?-oa:Math.asin(t)}function ca(t){return t.innerRadius}function ha(t){return t.outerRadius}function ua(t){return t.startAngle}function da(t){return t.endAngle}function fa(t){return t&&t.padAngle}function pa(t,e,i,n,r,o,s,a){var l=i-t,c=n-e,h=s-r,u=a-o,d=u*l-h*c;if(!(d*d<na))return[t+(d=(h*(e-o)-u*(t-r))/d)*l,e+d*c]}function ga(t,e,i,n,r,o,s){var a=t-i,l=e-n,c=(s?o:-o)/ia(a*a+l*l),h=c*l,u=-c*a,d=t+h,f=e+u,p=i+h,g=n+u,m=(d+p)/2,y=(f+g)/2,b=p-d,v=g-f,x=b*b+v*v,_=r-o,w=d*g-p*f,M=(v<0?-1:1)*ia(Js(0,_*_*x-w*w)),k=(w*v-b*M)/x,S=(-w*b-v*M)/x,D=(w*v+b*M)/x,E=(-w*b+v*M)/x,O=k-m,P=S-y,A=D-m,C=E-y;return O*O+P*P>A*A+C*C&&(k=D,S=E),{cx:k,cy:S,x01:-h,y01:-u,x11:k*(r/_-1),y11:S*(r/_-1)}}function ma(){var t=ca,e=ha,i=qs(0),n=null,r=ua,o=da,s=fa,a=null;function l(){var l,c,h=+t.apply(this,arguments),u=+e.apply(this,arguments),d=r.apply(this,arguments)-oa,f=o.apply(this,arguments)-oa,p=Zs(f-d),g=f>d;if(a||(a=l=Xs()),u<h&&(c=u,u=h,h=c),u>na)if(p>sa-na)a.moveTo(u*Qs(d),u*ea(d)),a.arc(0,0,u,d,f,!g),h>na&&(a.moveTo(h*Qs(f),h*ea(f)),a.arc(0,0,h,f,d,g));else{var m,y,b=d,v=f,x=d,_=f,w=p,M=p,k=s.apply(this,arguments)/2,S=k>na&&(n?+n.apply(this,arguments):ia(h*h+u*u)),D=ta(Zs(u-h)/2,+i.apply(this,arguments)),E=D,O=D;if(S>na){var P=la(S/h*ea(k)),A=la(S/u*ea(k));(w-=2*P)>na?(x+=P*=g?1:-1,_-=P):(w=0,x=_=(d+f)/2),(M-=2*A)>na?(b+=A*=g?1:-1,v-=A):(M=0,b=v=(d+f)/2)}var C=u*Qs(b),T=u*ea(b),L=h*Qs(_),R=h*ea(_);if(D>na){var j,z=u*Qs(v),N=u*ea(v),I=h*Qs(x),H=h*ea(x);if(p<ra&&(j=pa(C,T,I,H,z,N,L,R))){var U=C-j[0],F=T-j[1],B=z-j[0],W=N-j[1],V=1/ea(aa((U*B+F*W)/(ia(U*U+F*F)*ia(B*B+W*W)))/2),$=ia(j[0]*j[0]+j[1]*j[1]);E=ta(D,(h-$)/(V-1)),O=ta(D,(u-$)/(V+1))}}M>na?O>na?(m=ga(I,H,C,T,u,O,g),y=ga(z,N,L,R,u,O,g),a.moveTo(m.cx+m.x01,m.cy+m.y01),O<D?a.arc(m.cx,m.cy,O,Ks(m.y01,m.x01),Ks(y.y01,y.x01),!g):(a.arc(m.cx,m.cy,O,Ks(m.y01,m.x01),Ks(m.y11,m.x11),!g),a.arc(0,0,u,Ks(m.cy+m.y11,m.cx+m.x11),Ks(y.cy+y.y11,y.cx+y.x11),!g),a.arc(y.cx,y.cy,O,Ks(y.y11,y.x11),Ks(y.y01,y.x01),!g))):(a.moveTo(C,T),a.arc(0,0,u,b,v,!g)):a.moveTo(C,T),h>na&&w>na?E>na?(m=ga(L,R,z,N,h,-E,g),y=ga(C,T,I,H,h,-E,g),a.lineTo(m.cx+m.x01,m.cy+m.y01),E<D?a.arc(m.cx,m.cy,E,Ks(m.y01,m.x01),Ks(y.y01,y.x01),!g):(a.arc(m.cx,m.cy,E,Ks(m.y01,m.x01),Ks(m.y11,m.x11),!g),a.arc(0,0,h,Ks(m.cy+m.y11,m.cx+m.x11),Ks(y.cy+y.y11,y.cx+y.x11),g),a.arc(y.cx,y.cy,E,Ks(y.y11,y.x11),Ks(y.y01,y.x01),!g))):a.arc(0,0,h,_,x,g):a.lineTo(L,R)}else a.moveTo(0,0);if(a.closePath(),l)return a=null,l+""||null}return l.centroid=function(){var i=(+t.apply(this,arguments)+ +e.apply(this,arguments))/2,n=(+r.apply(this,arguments)+ +o.apply(this,arguments))/2-ra/2;return[Qs(n)*i,ea(n)*i]},l.innerRadius=function(e){return arguments.length?(t="function"==typeof e?e:qs(+e),l):t},l.outerRadius=function(t){return arguments.length?(e="function"==typeof t?t:qs(+t),l):e},l.cornerRadius=function(t){return arguments.length?(i="function"==typeof t?t:qs(+t),l):i},l.padRadius=function(t){return arguments.length?(n=null==t?null:"function"==typeof t?t:qs(+t),l):n},l.startAngle=function(t){return arguments.length?(r="function"==typeof t?t:qs(+t),l):r},l.endAngle=function(t){return arguments.length?(o="function"==typeof t?t:qs(+t),l):o},l.padAngle=function(t){return arguments.length?(s="function"==typeof t?t:qs(+t),l):s},l.context=function(t){return arguments.length?(a=null==t?null:t,l):a},l}function ya(t){return"object"==typeof t&&"length"in t?t:Array.from(t)}function ba(t){this._context=t}function va(t){return new ba(t)}function xa(t){return t[0]}function _a(t){return t[1]}function wa(t,e){var i=qs(!0),n=null,r=va,o=null;function s(s){var a,l,c,h=(s=ya(s)).length,u=!1;for(null==n&&(o=r(c=Xs())),a=0;a<=h;++a)!(a<h&&i(l=s[a],a,s))===u&&((u=!u)?o.lineStart():o.lineEnd()),u&&o.point(+t(l,a,s),+e(l,a,s));if(c)return o=null,c+""||null}return t="function"==typeof t?t:void 0===t?xa:qs(t),e="function"==typeof e?e:void 0===e?_a:qs(e),s.x=function(e){return arguments.length?(t="function"==typeof e?e:qs(+e),s):t},s.y=function(t){return arguments.length?(e="function"==typeof t?t:qs(+t),s):e},s.defined=function(t){return arguments.length?(i="function"==typeof t?t:qs(!!t),s):i},s.curve=function(t){return arguments.length?(r=t,null!=n&&(o=r(n)),s):r},s.context=function(t){return arguments.length?(null==t?n=o=null:o=r(n=t),s):n},s}function Ma(t,e){return e<t?-1:e>t?1:e>=t?0:NaN}function ka(t){return t}function Sa(t,e){if((r=t.length)>1)for(var i,n,r,o=1,s=t[e[0]],a=s.length;o<r;++o)for(n=s,s=t[e[o]],i=0;i<a;++i)s[i][1]+=s[i][0]=isNaN(n[i][1])?n[i][0]:n[i][1]}function Da(t){for(var e=t.length,i=new Array(e);--e>=0;)i[e]=e;return i}function Ea(t,e){return t[e]}function Oa(t){const e=[];return e.key=t,e}function Pa(t,e,i){this.k=t,this.x=e,this.y=i}function Aa(t){return Aa="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Aa(t)}function Ca(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function Ta(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,Ra(n.key),n)}}function La(t,e,i){return(e=Ra(e))in t?Object.defineProperty(t,e,{value:i,enumerable:!0,configurable:!0,writable:!0}):t[e]=i,t}function Ra(t){var e=function(t,e){if("object"!==Aa(t)||null===t)return t;var i=t[Symbol.toPrimitive];if(void 0!==i){var n=i.call(t,"string");if("object"!==Aa(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"===Aa(e)?e:String(e)}Array.prototype.slice,ba.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;default:this._context.lineTo(t,e)}}},Pa.prototype={constructor:Pa,scale:function(t){return 1===t?this:new Pa(this.k*t,this.x,this.y)},translate:function(t,e){return 0===t&0===e?this:new Pa(this.k,this.x+this.k*t,this.y+this.k*e)},apply:function(t){return[t[0]*this.k+this.x,t[1]*this.k+this.y]},applyX:function(t){return t*this.k+this.x},applyY:function(t){return t*this.k+this.y},invert:function(t){return[(t[0]-this.x)/this.k,(t[1]-this.y)/this.k]},invertX:function(t){return(t-this.x)/this.k},invertY:function(t){return(t-this.y)/this.k},rescaleX:function(t){return t.copy().domain(t.range().map(this.invertX,this).map(t.invert,t))},rescaleY:function(t){return t.copy().domain(t.range().map(this.invertY,this).map(t.invert,t))},toString:function(){return"translate("+this.x+","+this.y+") scale("+this.k+")"}},new Pa(1,0,0),Pa.prototype;var ja=["#1f77b4","#aec7e8","#ff7f0e","#ffbb78","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5","#e377c2","#f7b6d2","#7f7f7f","#c7c7c7","#bcbd22","#dbdb8d","#17becf","#9edae5","salmon","lightsalmon","lightsteelblue","steelblue","yellow","orange","#cccccc","#dddddd","#eee","#aaa","#123456","black"],za=function(){function t(e,i,n){var r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};Ca(this,t),La(this,"marginRight",150),La(this,"marginBottom",150),La(this,"colorRange",ja),this.title=e,this.description=i,this.data=n,this.options=r,this.dataIsValid=Array.isArray(n)?n.length>0:!!n,this.wrapper=document.createElement("div"),this.svg=Fs(this.wrapper).append("svg")}var e,i;return e=t,i=[{key:"clearAndScaleSvg",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:null;this.g&&this.g.remove(),this.svg.selectAll("*").remove();var r=i||100,o=n||50,s=this.title?[5,35]:[0,0];this.svg.append("rect").attr("width",this.title?t-10:t).attr("height",this.title?e-40:e).attr("fill","white").attr("rx",3).attr("ry",3).attr("transform","translate(".concat(s[0],",").concat(s[1],")")),this.g=this.svg.append("g").attr("transform","translate(".concat(r,",").concat(o,")")),this.svg.attr("height",e).attr("width",t),this.svg.attr("style","background-color: #f5f5f5");var a=this.svg.attr("width")-this.marginRight,l=this.svg.attr("height")-this.marginBottom;return[a,l]}},{key:"drawTitle",value:function(){var t=this;if(this.title&&this.svg.append("g").attr("transform","translate(10, 0)").append("text").attr("text-anchor","start").attr("x",0).attr("y",25).attr("class","chart-title").text(this.title),this.description){var e=Date.now();this.svg.append("g").attr("transform","translate(".concat(this.svg.attr("width")-40,", 5)")).append("path").attr("class","question-mark").attr("id","id-".concat(e)).attr("d","M256 8C119.043 8 8 119.083 8 256c0 136.997 111.043 248 248 248s248-111.003 248-248C504 119.083 392.957 8 256 8zm0 448c-110.532 0-200-89.431-200-200 0-110.495 89.472-200 200-200 110.491 0 200 89.471 200 200 0 110.53-89.431 200-200 200zm107.244-255.2c0 67.052-72.421 68.084-72.421 92.863V300c0 6.627-5.373 12-12 12h-45.647c-6.627 0-12-5.373-12-12v-8.659c0-35.745 27.1-50.034 47.579-61.516 17.561-9.845 28.324-16.541 28.324-29.579 0-17.246-21.999-28.693-39.784-28.693-23.189 0-33.894 10.977-48.942 29.969-4.057 5.12-11.46 6.071-16.666 2.124l-27.824-21.098c-5.107-3.872-6.251-11.066-2.644-16.363C184.846 131.491 214.94 112 261.794 112c49.071 0 101.45 38.304 101.45 88.8zM298 368c0 23.159-18.841 42-42 42s-42-18.841-42-42 18.841-42 42-42 42 18.841 42 42z"),setTimeout((function(){var i=document.getElementById("id-".concat(e));i&&i.addEventListener("click",(function(e){t.options.onShowDesc(t.description)}))}))}}},{key:"appendXAxis",value:function(t,e){var i=this.options.ticks?q(t).ticks(this.options.ticks).tickFormat(ho("%d.%m.%Y %H:%M")):q(t).tickFormat(ho("%d.%m.%Y %H:%M"));this.g.append("g").attr("transform","translate(0,"+e+")").call(i)}},{key:"appendXAxisLabel",value:function(t,e){this.options.xAxisLabel&&this.g.append("g").append("text").attr("x",t).attr("y",e+50).attr("text-anchor","end").attr("font-size","18px").attr("fill","black").text(this.options.xAxisLabel)}},{key:"appendYAxisLabel",value:function(){this.options.yAxisLabel&&this.g.append("g").append("text").attr("transform","rotate(-90)").attr("y",6).attr("dy","-4em").attr("text-anchor","end").attr("font-size","18px").attr("fill","black").text(this.options.yAxisLabel)}},{key:"showErrorMessage",value:function(t,e){this.g.append("g").append("text").attr("x",t/2-140).attr("y",e/2-20).attr("class","chart-error-message").text("No data available.")}},{key:"showLegend",value:function(t,e,i){this.svg.append("g").selectAll("g").data(t).enter().append("circle").attr("cx",i-120).attr("cy",(function(t,e){return 25+25*e})).attr("r",7).style("fill",(function(t){return e(t)})),this.svg.selectAll("label").data(t).enter().append("text").attr("x",i-100).attr("y",(function(t,e){return 25+25*e})).style("fill",(function(t){return e(t)})).text((function(t){return t})).attr("text-anchor","left").style("alignment-baseline","middle")}}],i&&Ta(e.prototype,i),Object.defineProperty(e,"prototype",{writable:!1}),t}();function Na(t){return Na="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Na(t)}function Ia(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){var i=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=i){var n,r,o,s,a=[],l=!0,c=!1;try{if(o=(i=i.call(t)).next,0===e){if(Object(i)!==i)return;l=!1}else for(;!(l=(n=o.call(i)).done)&&(a.push(n.value),a.length!==e);l=!0);}catch(t){c=!0,r=t}finally{try{if(!l&&null!=i.return&&(s=i.return(),Object(s)!==s))return}finally{if(c)throw r}}return a}}(t,e)||function(t,e){if(t){if("string"==typeof t)return Ha(t,e);var i=Object.prototype.toString.call(t).slice(8,-1);return"Object"===i&&t.constructor&&(i=t.constructor.name),"Map"===i||"Set"===i?Array.from(t):"Arguments"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?Ha(t,e):void 0}}(t,e)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Ha(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,n=new Array(e);i<e;i++)n[i]=t[i];return n}function Ua(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function Fa(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,(void 0,r=function(t,e){if("object"!==Na(t)||null===t)return t;var i=t[Symbol.toPrimitive];if(void 0!==i){var n=i.call(t,"string");if("object"!==Na(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(n.key),"symbol"===Na(r)?r:String(r)),n)}var r}function Ba(t,e){return Ba=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},Ba(t,e)}function Wa(t,e){if(e&&("object"===Na(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t)}function Va(t){return Va=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},Va(t)}var $a=function(t){!function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&Ba(t,e)}(s,t);var e,i,n,r,o=(n=s,r=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}}(),function(){var t,e=Va(n);if(r){var i=Va(this).constructor;t=Reflect.construct(e,arguments,i)}else t=e.apply(this,arguments);return Wa(this,t)});function s(){var t,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",i=arguments.length>1?arguments[1]:void 0,n=arguments.length>2?arguments[2]:void 0,r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};return Ua(this,s),r.transform&&(n=(null!==(t=n)&&void 0!==t?t:[]).map(r.transform)),o.call(this,e,i,n,r)}return e=s,i=[{key:"plot",value:function(t,e,i){var n=Ia(this.clearAndScaleSvg(t,e),2),r=n[0],o=n[1];if(this.drawTitle(),!this.dataIsValid)return this.showErrorMessage(t,e),this.wrapper.innerHTML;var s=Ia(C(this.data,(function(t){return t.column1})),2),a=s[0],l=s[1],c=null;c=this.options.useTimeScale?Ts().domain([a,l]).range([0,r]):mr().domain([a,l]).range([0,r]),this.appendXAxis(c,o),this.appendXAxisLabel(r,o),this.appendYAxisLabel();var h=T(this.data,(function(t){return+t.column2})),u=mr().domain([0,h]).range([o,0]);this.g.append("g").call(Z(u));var d=En().range(this.colorRange);return this.g.append("path").datum(this.data).attr("stroke",(function(t){return d(t.column2)})).attr("class","chart-path").attr("d",wa().x((function(t){return c(t.column1)})).y((function(t){return u(t.column2)}))),this.options.showLegend&&this.showLegend(this.data.map((function(t){return t.column1})),d,t),this.wrapper.innerHTML}},{key:"appendXAxis",value:function(t,e){var i=this.options.ticks?q(t).ticks(this.options.ticks):q(t);this.options.useTimeScale&&i.tickFormat(ho("%d.%m.%Y %H:%M")),this.g.append("g").attr("transform","translate(0,"+e+")").call(i)}}],i&&Fa(e.prototype,i),Object.defineProperty(e,"prototype",{writable:!1}),s}(za);function Ya(t){return Ya="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Ya(t)}function Ga(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,n=new Array(e);i<e;i++)n[i]=t[i];return n}function Xa(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,(void 0,r=function(t,e){if("object"!==Ya(t)||null===t)return t;var i=t[Symbol.toPrimitive];if(void 0!==i){var n=i.call(t,"string");if("object"!==Ya(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(n.key),"symbol"===Ya(r)?r:String(r)),n)}var r}function qa(t,e){return qa=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},qa(t,e)}function Za(t,e){if(e&&("object"===Ya(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t)}function Ka(t){return Ka=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},Ka(t)}var Qa=function(t){!function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&qa(t,e)}(s,t);var e,i,n,r,o=(n=s,r=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}}(),function(){var t,e=Ka(n);if(r){var i=Ka(this).constructor;t=Reflect.construct(e,arguments,i)}else t=e.apply(this,arguments);return Za(this,t)});function s(t,e,i,n){var r;return function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,s),n.transform&&(i=(null!==(r=i)&&void 0!==r?r:[]).map(n.transform)),o.call(this,t,e,i,n)}return e=s,i=[{key:"plot",value:function(t,e,i){var n,r,o=(n=this.clearAndScaleSvg(t,e),r=2,function(t){if(Array.isArray(t))return t}(n)||function(t,e){var i=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=i){var n,r,o,s,a=[],l=!0,c=!1;try{if(o=(i=i.call(t)).next,0===e){if(Object(i)!==i)return;l=!1}else for(;!(l=(n=o.call(i)).done)&&(a.push(n.value),a.length!==e);l=!0);}catch(t){c=!0,r=t}finally{try{if(!l&&null!=i.return&&(s=i.return(),Object(s)!==s))return}finally{if(c)throw r}}return a}}(n,r)||function(t,e){if(t){if("string"==typeof t)return Ga(t,e);var i=Object.prototype.toString.call(t).slice(8,-1);return"Object"===i&&t.constructor&&(i=t.constructor.name),"Map"===i||"Set"===i?Array.from(t):"Arguments"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?Ga(t,e):void 0}}(n,r)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),s=o[0],a=o[1];if(this.drawTitle(),!this.dataIsValid)return this.showErrorMessage(t,e),this.wrapper.innerHTML;var l=On().range([0,s]).padding(.4),c=mr().range([a,0]),h=T(this.data,(function(t){return t.column2}));l.domain(this.data.map((function(t){return t.column1}))),c.domain([0,h]),this.appendXAxis(l,a),this.appendXAxisLabel(s,a),this.appendYAxisLabel(),this.g.append("g").attr("transform","translate(0, 0)").call(Z(c));var u=En().range(this.colorRange);return this.g.selectAll(".bar").data(this.data).enter().append("rect").attr("fill",(function(t){return u(t.column2)})).attr("x",(function(t){return l(t.column1)})).attr("y",(function(t){return c(t.column2)})).attr("width",l.bandwidth()).attr("height",(function(t){return a-c(t.column2)})),this.options.showLegend&&this.showLegend(this.data.map((function(t){return t.column1})),u,t),this.wrapper.innerHTML}}],i&&Xa(e.prototype,i),Object.defineProperty(e,"prototype",{writable:!1}),s}(za);function Ja(t){return Ja="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Ja(t)}function tl(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,n=new Array(e);i<e;i++)n[i]=t[i];return n}function el(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function il(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,(void 0,r=function(t,e){if("object"!==Ja(t)||null===t)return t;var i=t[Symbol.toPrimitive];if(void 0!==i){var n=i.call(t,"string");if("object"!==Ja(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(n.key),"symbol"===Ja(r)?r:String(r)),n)}var r}function nl(t,e){return nl=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},nl(t,e)}function rl(t,e){if(e&&("object"===Ja(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t)}function ol(t){return ol=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},ol(t)}var sl=function(t){!function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&nl(t,e)}(s,t);var e,i,n,r,o=(n=s,r=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}}(),function(){var t,e=ol(n);if(r){var i=ol(this).constructor;t=Reflect.construct(e,arguments,i)}else t=e.apply(this,arguments);return rl(this,t)});function s(){var t,e,i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",n=arguments.length>1?arguments[1]:void 0,r=arguments.length>2?arguments[2]:void 0,a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};return el(this,s),a.transform&&(r=(null!==(t=r)&&void 0!==t?t:[]).map(a.transform)),(e=o.call(this,i,n,r,a)).marginRight=100,e.marginBottom=60,e}return e=s,i=[{key:"plot",value:function(t,e,i){var n=t/2,r=e/2;if(!this.dataIsValid)return this.clearAndScaleSvg(t,e),this.drawTitle(),this.showErrorMessage(t,e),this.wrapper.innerHTML;var o,s,a=(o=this.clearAndScaleSvg(t,e,n,r),s=2,function(t){if(Array.isArray(t))return t}(o)||function(t,e){var i=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=i){var n,r,o,s,a=[],l=!0,c=!1;try{if(o=(i=i.call(t)).next,0===e){if(Object(i)!==i)return;l=!1}else for(;!(l=(n=o.call(i)).done)&&(a.push(n.value),a.length!==e);l=!0);}catch(t){c=!0,r=t}finally{try{if(!l&&null!=i.return&&(s=i.return(),Object(s)!==s))return}finally{if(c)throw r}}return a}}(o,s)||function(t,e){if(t){if("string"==typeof t)return tl(t,e);var i=Object.prototype.toString.call(t).slice(8,-1);return"Object"===i&&t.constructor&&(i=t.constructor.name),"Map"===i||"Set"===i?Array.from(t):"Arguments"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?tl(t,e):void 0}}(o,s)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),l=a[0],c=a[1];this.drawTitle();var h=Math.min(l,c)/1.5,u=function(){var t=ka,e=Ma,i=null,n=qs(0),r=qs(sa),o=qs(0);function s(s){var a,l,c,h,u,d=(s=ya(s)).length,f=0,p=new Array(d),g=new Array(d),m=+n.apply(this,arguments),y=Math.min(sa,Math.max(-sa,r.apply(this,arguments)-m)),b=Math.min(Math.abs(y)/d,o.apply(this,arguments)),v=b*(y<0?-1:1);for(a=0;a<d;++a)(u=g[p[a]=a]=+t(s[a],a,s))>0&&(f+=u);for(null!=e?p.sort((function(t,i){return e(g[t],g[i])})):null!=i&&p.sort((function(t,e){return i(s[t],s[e])})),a=0,c=f?(y-d*v)/f:0;a<d;++a,m=h)l=p[a],h=m+((u=g[l])>0?u*c:0)+v,g[l]={data:s[l],index:a,value:u,startAngle:m,endAngle:h,padAngle:b};return g}return s.value=function(e){return arguments.length?(t="function"==typeof e?e:qs(+e),s):t},s.sortValues=function(t){return arguments.length?(e=t,i=null,s):e},s.sort=function(t){return arguments.length?(i=t,e=null,s):i},s.startAngle=function(t){return arguments.length?(n="function"==typeof t?t:qs(+t),s):n},s.endAngle=function(t){return arguments.length?(r="function"==typeof t?t:qs(+t),s):r},s.padAngle=function(t){return arguments.length?(o="function"==typeof t?t:qs(+t),s):o},s}().value((function(t){return t.column2})),d=ma().outerRadius(h-10).innerRadius(0),f=(ma().outerRadius(h).innerRadius(h-80),this.g.selectAll(".arc").data(u(this.data)).enter().append("g").attr("class","arc")),p=En().domain(this.data).range(this.colorRange);return f.append("path").attr("d",d).attr("fill",(function(t){return p(t.data.column1)})),f.append("text").attr("transform",(function(t){return"translate("+(h+50)*Math.sin((t.endAngle-t.startAngle)/2+t.startAngle)+", "+-1*(h-10)*Math.cos((t.endAngle-t.startAngle)/2+t.startAngle)+")"})).attr("dy",".5em").text((function(t){return"".concat(t.data.column2," %")})),this.options.showLegend&&this.showLegend(this.data.map((function(t){return t.column1})),p,t),this.wrapper.innerHTML}}],i&&il(e.prototype,i),Object.defineProperty(e,"prototype",{writable:!1}),s}(za);function al(t){return al="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},al(t)}function ll(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,n=new Array(e);i<e;i++)n[i]=t[i];return n}function cl(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function hl(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,(void 0,r=function(t,e){if("object"!==al(t)||null===t)return t;var i=t[Symbol.toPrimitive];if(void 0!==i){var n=i.call(t,"string");if("object"!==al(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(n.key),"symbol"===al(r)?r:String(r)),n)}var r}function ul(t,e){return ul=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},ul(t,e)}function dl(t,e){if(e&&("object"===al(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t)}function fl(t){return fl=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},fl(t)}var pl=function(t){!function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&ul(t,e)}(s,t);var e,i,n,r,o=(n=s,r=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}}(),function(){var t,e=fl(n);if(r){var i=fl(this).constructor;t=Reflect.construct(e,arguments,i)}else t=e.apply(this,arguments);return dl(this,t)});function s(){var t,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",i=arguments.length>1?arguments[1]:void 0,n=arguments.length>2?arguments[2]:void 0,r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};return cl(this,s),r.transform&&(n=(null!==(t=n)&&void 0!==t?t:[]).map(r.transform)),o.call(this,e,i,n,r)}return e=s,i=[{key:"plot",value:function(t,e,i){var n,r,o=(n=this.clearAndScaleSvg(t,e),r=2,function(t){if(Array.isArray(t))return t}(n)||function(t,e){var i=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=i){var n,r,o,s,a=[],l=!0,c=!1;try{if(o=(i=i.call(t)).next,0===e){if(Object(i)!==i)return;l=!1}else for(;!(l=(n=o.call(i)).done)&&(a.push(n.value),a.length!==e);l=!0);}catch(t){c=!0,r=t}finally{try{if(!l&&null!=i.return&&(s=i.return(),Object(s)!==s))return}finally{if(c)throw r}}return a}}(n,r)||function(t,e){if(t){if("string"==typeof t)return ll(t,e);var i=Object.prototype.toString.call(t).slice(8,-1);return"Object"===i&&t.constructor&&(i=t.constructor.name),"Map"===i||"Set"===i?Array.from(t):"Arguments"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?ll(t,e):void 0}}(n,r)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),s=o[0],a=o[1];if(this.drawTitle(),!this.dataIsValid)return this.showErrorMessage(t,e),this.wrapper.innerHTML;var l=Ts().domain(C(this.data,(function(t){return t.column1}))).range([0,s]);this.appendXAxis(l,a),this.appendXAxisLabel(s,a),this.appendYAxisLabel();var c=mr().domain([0,T(this.data,(function(t){return+t.column2}))]).range([a,0]);this.g.append("g").call(Z(c));var h=En().range(this.colorRange);return this.g.append("path").datum(this.data).attr("fill",(function(t){return h(t.column2)})).attr("class","chart-area").attr("d",function(t,e,i){var n=null,r=qs(!0),o=null,s=va,a=null;function l(l){var c,h,u,d,f,p=(l=ya(l)).length,g=!1,m=new Array(p),y=new Array(p);for(null==o&&(a=s(f=Xs())),c=0;c<=p;++c){if(!(c<p&&r(d=l[c],c,l))===g)if(g=!g)h=c,a.areaStart(),a.lineStart();else{for(a.lineEnd(),a.lineStart(),u=c-1;u>=h;--u)a.point(m[u],y[u]);a.lineEnd(),a.areaEnd()}g&&(m[c]=+t(d,c,l),y[c]=+e(d,c,l),a.point(n?+n(d,c,l):m[c],i?+i(d,c,l):y[c]))}if(f)return a=null,f+""||null}function c(){return wa().defined(r).curve(s).context(o)}return t="function"==typeof t?t:void 0===t?xa:qs(+t),e="function"==typeof e?e:qs(void 0===e?0:+e),i="function"==typeof i?i:void 0===i?_a:qs(+i),l.x=function(e){return arguments.length?(t="function"==typeof e?e:qs(+e),n=null,l):t},l.x0=function(e){return arguments.length?(t="function"==typeof e?e:qs(+e),l):t},l.x1=function(t){return arguments.length?(n=null==t?null:"function"==typeof t?t:qs(+t),l):n},l.y=function(t){return arguments.length?(e="function"==typeof t?t:qs(+t),i=null,l):e},l.y0=function(t){return arguments.length?(e="function"==typeof t?t:qs(+t),l):e},l.y1=function(t){return arguments.length?(i=null==t?null:"function"==typeof t?t:qs(+t),l):i},l.lineX0=l.lineY0=function(){return c().x(t).y(e)},l.lineY1=function(){return c().x(t).y(i)},l.lineX1=function(){return c().x(n).y(e)},l.defined=function(t){return arguments.length?(r="function"==typeof t?t:qs(!!t),l):r},l.curve=function(t){return arguments.length?(s=t,null!=o&&(a=s(o)),l):s},l.context=function(t){return arguments.length?(null==t?o=a=null:a=s(o=t),l):o},l}().x((function(t){return l(t.column1)})).y0(c(0)).y1((function(t){return c(t.column2)}))),this.options.showLegend&&this.showLegend(this.data.map((function(t){return t.column1})),h,t),this.wrapper.innerHTML}}],i&&hl(e.prototype,i),Object.defineProperty(e,"prototype",{writable:!1}),s}(za);function gl(t){return gl="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},gl(t)}function ml(t,e){var i=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),i.push.apply(i,n)}return i}function yl(t){for(var e=1;e<arguments.length;e++){var i=null!=arguments[e]?arguments[e]:{};e%2?ml(Object(i),!0).forEach((function(e){bl(t,e,i[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(i)):ml(Object(i)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(i,e))}))}return t}function bl(t,e,i){return(e=wl(e))in t?Object.defineProperty(t,e,{value:i,enumerable:!0,configurable:!0,writable:!0}):t[e]=i,t}function vl(t,e){if(t){if("string"==typeof t)return xl(t,e);var i=Object.prototype.toString.call(t).slice(8,-1);return"Object"===i&&t.constructor&&(i=t.constructor.name),"Map"===i||"Set"===i?Array.from(t):"Arguments"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?xl(t,e):void 0}}function xl(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,n=new Array(e);i<e;i++)n[i]=t[i];return n}function _l(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,wl(n.key),n)}}function wl(t){var e=function(t,e){if("object"!==gl(t)||null===t)return t;var i=t[Symbol.toPrimitive];if(void 0!==i){var n=i.call(t,"string");if("object"!==gl(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"===gl(e)?e:String(e)}function Ml(t,e){return Ml=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},Ml(t,e)}function kl(t,e){if(e&&("object"===gl(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t)}function Sl(t){return Sl=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},Sl(t)}var Dl=function(t){!function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&Ml(t,e)}(s,t);var e,i,n,r,o=(n=s,r=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}}(),function(){var t,e=Sl(n);if(r){var i=Sl(this).constructor;t=Reflect.construct(e,arguments,i)}else t=e.apply(this,arguments);return kl(this,t)});function s(t,e,i,n,r){var a,l;return function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,s),r.transform&&(i=(null!==(a=i)&&void 0!==a?a:[]).map(r.transform)),(l=o.call(this,t,e,i,r)).groups=n,l}return e=s,i=[{key:"plot",value:function(t,e,i){var n,r,o=this,s=(n=this.clearAndScaleSvg(t,e),r=2,function(t){if(Array.isArray(t))return t}(n)||function(t,e){var i=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=i){var n,r,o,s,a=[],l=!0,c=!1;try{if(o=(i=i.call(t)).next,0===e){if(Object(i)!==i)return;l=!1}else for(;!(l=(n=o.call(i)).done)&&(a.push(n.value),a.length!==e);l=!0);}catch(t){c=!0,r=t}finally{try{if(!l&&null!=i.return&&(s=i.return(),Object(s)!==s))return}finally{if(c)throw r}}return a}}(n,r)||vl(n,r)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),a=s[0],l=s[1];if(this.drawTitle(),!this.dataIsValid)return this.showErrorMessage(t,e),this.wrapper.innerHTML;var c=Object.keys(this.data.overall[0]),h=Object.keys(this.data),u=Object.keys(this.data).reduce((function(t,e){return[].concat(function(t){return function(t){if(Array.isArray(t))return xl(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||vl(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}(t),[yl(yl({},o.data[e][0]),{},{group:e})])}),[]),d=function(){var t=qs([]),e=Da,i=Sa,n=Ea;function r(r){var o,s,a=Array.from(t.apply(this,arguments),Oa),l=a.length,c=-1;for(const t of r)for(o=0,++c;o<l;++o)(a[o][c]=[0,+n(t,a[o].key,c,r)]).data=t;for(o=0,s=ya(e(a));o<l;++o)a[s[o]].index=o;return i(a,s),a}return r.keys=function(e){return arguments.length?(t="function"==typeof e?e:qs(Array.from(e)),r):t},r.value=function(t){return arguments.length?(n="function"==typeof t?t:qs(+t),r):n},r.order=function(t){return arguments.length?(e=null==t?Da:"function"==typeof t?t:qs(Array.from(t)),r):e},r.offset=function(t){return arguments.length?(i=null==t?Sa:t,r):i},r}().keys(c)(u),f=d[0][0][0],p=d[d.length-1][0][1],g=On().domain(h).range([0,a]).padding([.2]);this.g.append("g").attr("transform","translate(0, ".concat(l,")")).call(q(g).tickSizeOuter(0));var m=mr().domain([f,p]).range([l,0]);this.g.append("g").call(Z(m));var y=En().domain(["overall"]).range(this.colorRange);return this.g.append("g").selectAll("g").data(d).join("g").attr("fill",(function(t){return y(t.key)})).selectAll("rect").data((function(t){return t})).join("rect").attr("x",(function(t){return g(t.data.group)})).attr("x",(function(t){return g(t.data.group)})).attr("y",(function(t){return m(t[1])})).attr("height",(function(t){return m(t[0])-m(t[1])})).attr("width",g.bandwidth()),this.options.showLegend&&this.showLegend(c,y,t),this.wrapper.innerHTML}}],i&&_l(e.prototype,i),Object.defineProperty(e,"prototype",{writable:!1}),s}(za);function El(t){return El="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},El(t)}function Ol(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,n=new Array(e);i<e;i++)n[i]=t[i];return n}function Pl(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,(void 0,r=function(t,e){if("object"!==El(t)||null===t)return t;var i=t[Symbol.toPrimitive];if(void 0!==i){var n=i.call(t,"string");if("object"!==El(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(n.key),"symbol"===El(r)?r:String(r)),n)}var r}function Al(t,e){return Al=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},Al(t,e)}function Cl(t,e){if(e&&("object"===El(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t)}function Tl(t){return Tl=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},Tl(t)}var Ll=function(t){!function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&Al(t,e)}(s,t);var e,i,n,r,o=(n=s,r=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}}(),function(){var t,e=Tl(n);if(r){var i=Tl(this).constructor;t=Reflect.construct(e,arguments,i)}else t=e.apply(this,arguments);return Cl(this,t)});function s(t,e,i,n){var r,a,l=n.transform,c=n.x,h=void 0===c?function(t,e){return e}:c,u=n.y,d=void 0===u?function(t){return t}:u,f=n.z,p=void 0===f?function(){return 1}:f,g=n.title,m=n.marginTop,y=void 0===m?0:m,b=n.marginRight,v=void 0===b?0:b,x=n.marginBottom,_=void 0===x?0:x,w=n.marginLeft,M=void 0===w?40:w,k=n.width,S=void 0===k?640:k,D=n.height,E=void 0===D?400:D,O=n.xDomain,P=n.xRange,A=void 0===P?[M,S-v]:P,C=n.xPadding,T=void 0===C?.1:C,L=n.yType,R=void 0===L?mr:L,j=n.yDomain,z=n.yRange,N=void 0===z?[E-_,y]:z,I=n.zDomain,H=n.zPadding,U=void 0===H?.05:H,F=n.yFormat,B=n.yLabel,W=n.colors,V=void 0===W?Ns:W,$=n.drawLegend,Y=void 0===$||$;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,s),l&&(i=(null!==(r=i)&&void 0!==r?r:[]).map(l));var G={transform:l,x:h,y:d,z:p,title:g,marginTop:y,marginRight:v,marginBottom:_,marginLeft:M,width:S,height:E,xDomain:O,xRange:A,xPadding:T,yType:R,yDomain:j,yRange:N,zDomain:I,zPadding:U,yFormat:F,yLabel:B,colors:V,drawLegend:Y};return(a=o.call(this,g,e,i,G)).options=G,a.data=i,a.wrapper=document.createElement("div"),a.svg=Fs(a.wrapper).append("svg"),a}return e=s,i=[{key:"plot",value:function(t,e,i){var n,r,o,s=this,a=(r=this.clearAndScaleSvg(t,e),o=2,function(t){if(Array.isArray(t))return t}(r)||function(t,e){var i=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=i){var n,r,o,s,a=[],l=!0,c=!1;try{if(o=(i=i.call(t)).next,0===e){if(Object(i)!==i)return;l=!1}else for(;!(l=(n=o.call(i)).done)&&(a.push(n.value),a.length!==e);l=!0);}catch(t){c=!0,r=t}finally{try{if(!l&&null!=i.return&&(s=i.return(),Object(s)!==s))return}finally{if(c)throw r}}return a}}(r,o)||function(t,e){if(t){if("string"==typeof t)return Ol(t,e);var i=Object.prototype.toString.call(t).slice(8,-1);return"Object"===i&&t.constructor&&(i=t.constructor.name),"Map"===i||"Set"===i?Array.from(t):"Arguments"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?Ol(t,e):void 0}}(r,o)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),l=a[0],c=a[1],h=this.options,u=h.x,d=h.y,f=h.z,p=h.title,g=h.marginTop,m=h.marginRight,y=h.marginBottom,b=h.marginLeft,v=h.width,x=h.height,_=h.xDomain,w=h.xRange,M=h.xPadding,k=h.yType,S=h.yDomain,D=h.yRange,E=h.zDomain,O=h.zPadding,P=h.yFormat,A=h.yLabel,C=h.colors,j=h.drawLegend;v=l,x=c+150,g=15*(null!==(n=E)&&void 0!==n?n:[]).length,m=this.marginRight,D=[x-(y=this.marginBottom),g],w=[b,v-m];var N=this.data,I=R(N,u),H=R(N,d),U=R(N,f);void 0===_&&(_=I),void 0===S&&(S=[0,T(H)]),void 0===E&&(E=U),_=new z(_),E=new z(E);var F=L(I.length).filter((function(t){return _.has(I[t])&&E.has(U[t])})),B=On(_,w).paddingInner(M),W=On(E,[0,B.bandwidth()]).padding(O),V=k(S,D),$=En(E,C),Y=q(B).tickSizeOuter(0),G=Z(V).ticks(x/60,P);if(void 0===p){var X=V.tickFormat(100,P);p=function(t){return"".concat(I[t],"\n").concat(U[t],"\n").concat(X(H[t]))}}else{var K=R(N,(function(t){return t})),Q=p;p=function(t){return Q(K[t],t,N)}}if(this.g.append("g").attr("transform","translate(".concat(b,",0)")).call(G).call((function(t){return t.select(".domain").remove()})).call((function(t){return t.selectAll(".tick line").clone().attr("x2",v-b-m).attr("stroke-opacity",.1)})).call((function(t){return t.append("text").attr("x",-b).attr("y",100).attr("fill","currentColor").attr("text-anchor","start").text(A)})),this.g.append("g").selectAll("rect").data(F).join("rect").attr("x",(function(t){return B(I[t])+W(U[t])})).attr("y",(function(t){return V(H[t])})).attr("width",W.bandwidth()).attr("height",(function(t){return V(0)-V(H[t])})).attr("fill",(function(t){return $(U[t])})),j){var J,tt=2;(null!==(J=E)&&void 0!==J?J:[]).forEach((function(t){tt+=1;var e=$(t),i=15*tt/2,n=tt%2?0:200;s.g.append("circle").attr("cx",n).attr("cy",i).attr("r",5).style("fill",e),s.g.append("text").attr("x",n+10).attr("y",i+4).text(t).style("font-size","15px").attr("alignment-baseline","middle")}))}return p&&this.g.append("title").text(p),this.g.append("g").attr("transform","translate(0,".concat(x-y,")")).call(Y),this.wrapper.innerHTML}}],i&&Pl(e.prototype,i),Object.defineProperty(e,"prototype",{writable:!1}),s}(za);function Rl(t){return Rl="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Rl(t)}function jl(t,e){var i=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),i.push.apply(i,n)}return i}function zl(t){for(var e=1;e<arguments.length;e++){var i=null!=arguments[e]?arguments[e]:{};e%2?jl(Object(i),!0).forEach((function(e){Nl(t,e,i[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(i)):jl(Object(i)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(i,e))}))}return t}function Nl(t,e,i){return(e=Wl(e))in t?Object.defineProperty(t,e,{value:i,enumerable:!0,configurable:!0,writable:!0}):t[e]=i,t}function Il(t){return function(t){if(Array.isArray(t))return Ul(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||Hl(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Hl(t,e){if(t){if("string"==typeof t)return Ul(t,e);var i=Object.prototype.toString.call(t).slice(8,-1);return"Object"===i&&t.constructor&&(i=t.constructor.name),"Map"===i||"Set"===i?Array.from(t):"Arguments"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?Ul(t,e):void 0}}function Ul(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,n=new Array(e);i<e;i++)n[i]=t[i];return n}function Fl(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function Bl(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,Wl(n.key),n)}}function Wl(t){var e=function(t,e){if("object"!==Rl(t)||null===t)return t;var i=t[Symbol.toPrimitive];if(void 0!==i){var n=i.call(t,"string");if("object"!==Rl(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"===Rl(e)?e:String(e)}function Vl(t,e){return Vl=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},Vl(t,e)}function $l(t,e){if(e&&("object"===Rl(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t)}function Yl(t){return Yl=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},Yl(t)}var Gl=function(t){!function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&Vl(t,e)}(s,t);var e,i,n,r,o=(n=s,r=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}}(),function(){var t,e=Yl(n);if(r){var i=Yl(this).constructor;t=Reflect.construct(e,arguments,i)}else t=e.apply(this,arguments);return $l(this,t)});function s(t,e,i){var n,r,a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},l=a.title,c=a.marginTop,h=void 0===c?0:c,u=a.marginRight,d=void 0===u?0:u,f=a.marginBottom,p=void 0===f?0:f,g=a.marginLeft,m=void 0===g?40:g,y=a.width,b=void 0===y?640:y,v=a.height,x=void 0===v?400:v,_=(a.xDomain,a.xRange),w=void 0===_?[m,b-d]:_,M=a.xPadding,k=void 0===M?.1:M,S=a.yType,D=void 0===S?mr:S,E=a.yDomain,O=a.yRange,P=void 0===O?[x-p,h]:O,A=a.zDomain,C=a.zPadding,T=void 0===C?.05:C,L=a.yFormat,R=a.yLabel,j=(a.colors,a.drawLegend),z=void 0===j||j;Fl(this,s);var N=Object.keys(i).reduce((function(t,e){return[].concat(Il(t),[zl(zl({},i[e]),{},{name:e})])}),[]),I=Array.from(new Set(N.flatMap((function(t){return Object.keys(t)})))).filter((function(t){return"name"!=t})),H=N.reduce((function(t,e){return[].concat(Il(t),[e.name])}),[]),U=I.flatMap((function(t){return N.map((function(e){return{name:e.name,category:t,value:e[t]}}))})),F=(Nl(n={x:function(t){return t.name},y:function(t){return t.value},z:function(t){return t.category},title:l,marginTop:h,marginRight:d,marginBottom:p,marginLeft:m,width:b,height:x,xRange:w,xPadding:k,yType:D,yDomain:E,yRange:P,zDomain:A,zPadding:T,yFormat:L,yLabel:R,drawLegend:z,xDomain:H},"zDomain",I),Nl(n,"colors",Hs[I.length<10?10:I.length]),n);return(r=o.call(this,l,e,U,F)).options=F,r.dataFlatted=U,r.wrapper=document.createElement("div"),r.svg=Fs(r.wrapper).append("svg"),r}return e=s,i=[{key:"plot",value:function(t,e,i){var n,r,o,s=this,a=(r=this.clearAndScaleSvg(t,e),o=2,function(t){if(Array.isArray(t))return t}(r)||function(t,e){var i=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=i){var n,r,o,s,a=[],l=!0,c=!1;try{if(o=(i=i.call(t)).next,0===e){if(Object(i)!==i)return;l=!1}else for(;!(l=(n=o.call(i)).done)&&(a.push(n.value),a.length!==e);l=!0);}catch(t){c=!0,r=t}finally{try{if(!l&&null!=i.return&&(s=i.return(),Object(s)!==s))return}finally{if(c)throw r}}return a}}(r,o)||Hl(r,o)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),l=a[0],c=a[1],h=this.options,u=h.x,d=h.y,f=h.z,p=h.title,g=h.marginTop,m=h.marginRight,y=h.marginBottom,b=h.marginLeft,v=h.width,x=h.height,_=h.xDomain,w=h.xRange,M=h.xPadding,k=h.yType,S=h.yDomain,D=h.yRange,E=h.zDomain,O=h.zPadding,P=h.yFormat,A=h.yLabel,C=h.colors,j=h.drawLegend;v=l,x=c+150,g=15*(null!==(n=E)&&void 0!==n?n:[]).length,m=this.marginRight,D=[x-(y=this.marginBottom),g],w=[b,v-m];var N=this.dataFlatted,I=R(N,u),H=R(N,d),U=R(N,f);void 0===_&&(_=I),void 0===S&&(S=[0,T(H)]),void 0===E&&(E=U),_=new z(_),E=new z(E);var F=L(I.length).filter((function(t){return _.has(I[t])&&E.has(U[t])})),B=On(_,w).paddingInner(M),W=On(E,[0,B.bandwidth()]).padding(O),V=k(S,D),$=En(E,C),Y=q(B).tickSizeOuter(0),G=Z(V).ticks(x/60,P);if(void 0===p){var X=V.tickFormat(100,P);p=function(t){return"".concat(I[t],"\n").concat(U[t],"\n").concat(X(H[t]))}}else{var K=R(N,(function(t){return t})),Q=p;p=function(t){return Q(K[t],t,N)}}if(this.g.append("g").attr("transform","translate(".concat(b,",0)")).call(G).call((function(t){return t.select(".domain").remove()})).call((function(t){return t.selectAll(".tick line").clone().attr("x2",v-b-m).attr("stroke-opacity",.1)})).call((function(t){return t.append("text").attr("x",-b).attr("y",100).attr("fill","currentColor").attr("text-anchor","start").text(A)})),this.g.append("g").selectAll("rect").data(F).join("rect").attr("x",(function(t){return B(I[t])+W(U[t])})).attr("y",(function(t){return V(H[t])})).attr("width",W.bandwidth()).attr("height",(function(t){return V(0)-V(H[t])})).attr("fill",(function(t){return $(U[t])})),j){var J,tt=2;(null!==(J=E)&&void 0!==J?J:[]).forEach((function(t){tt+=1;var e=$(t),i=15*tt/2,n=tt%2?0:200;s.g.append("circle").attr("cx",n).attr("cy",i).attr("r",5).style("fill",e),s.g.append("text").attr("x",n+10).attr("y",i+4).text(t).style("font-size","15px").attr("alignment-baseline","middle")}))}return p&&this.g.append("title").text(p),this.g.append("g").attr("transform","translate(0,".concat(x-y,")")).call(Y),this.wrapper.innerHTML}}],i&&Bl(e.prototype,i),Object.defineProperty(e,"prototype",{writable:!1}),s}(za);function Xl(t){return t+.5|0}const ql=(t,e,i)=>Math.max(Math.min(t,i),e);function Zl(t){return ql(Xl(2.55*t),0,255)}function Kl(t){return ql(Xl(255*t),0,255)}function Ql(t){return ql(Xl(t/2.55)/100,0,1)}function Jl(t){return ql(Xl(100*t),0,100)}const tc={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,A:10,B:11,C:12,D:13,E:14,F:15,a:10,b:11,c:12,d:13,e:14,f:15},ec=[..."0123456789ABCDEF"],ic=t=>ec[15&t],nc=t=>ec[(240&t)>>4]+ec[15&t],rc=t=>(240&t)>>4==(15&t);const oc=/^(hsla?|hwb|hsv)\(\s*([-+.e\d]+)(?:deg)?[\s,]+([-+.e\d]+)%[\s,]+([-+.e\d]+)%(?:[\s,]+([-+.e\d]+)(%)?)?\s*\)$/;function sc(t,e,i){const n=e*Math.min(i,1-i),r=(e,r=(e+t/30)%12)=>i-n*Math.max(Math.min(r-3,9-r,1),-1);return[r(0),r(8),r(4)]}function ac(t,e,i){const n=(n,r=(n+t/60)%6)=>i-i*e*Math.max(Math.min(r,4-r,1),0);return[n(5),n(3),n(1)]}function lc(t,e,i){const n=sc(t,1,.5);let r;for(e+i>1&&(r=1/(e+i),e*=r,i*=r),r=0;r<3;r++)n[r]*=1-e-i,n[r]+=e;return n}function cc(t){const e=t.r/255,i=t.g/255,n=t.b/255,r=Math.max(e,i,n),o=Math.min(e,i,n),s=(r+o)/2;let a,l,c;return r!==o&&(c=r-o,l=s>.5?c/(2-r-o):c/(r+o),a=function(t,e,i,n,r){return t===r?(e-i)/n+(e<i?6:0):e===r?(i-t)/n+2:(t-e)/n+4}(e,i,n,c,r),a=60*a+.5),[0|a,l||0,s]}function hc(t,e,i,n){return(Array.isArray(e)?t(e[0],e[1],e[2]):t(e,i,n)).map(Kl)}function uc(t,e,i){return hc(sc,t,e,i)}function dc(t){return(t%360+360)%360}const fc={x:"dark",Z:"light",Y:"re",X:"blu",W:"gr",V:"medium",U:"slate",A:"ee",T:"ol",S:"or",B:"ra",C:"lateg",D:"ights",R:"in",Q:"turquois",E:"hi",P:"ro",O:"al",N:"le",M:"de",L:"yello",F:"en",K:"ch",G:"arks",H:"ea",I:"ightg",J:"wh"},pc={OiceXe:"f0f8ff",antiquewEte:"faebd7",aqua:"ffff",aquamarRe:"7fffd4",azuY:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"0",blanKedOmond:"ffebcd",Xe:"ff",XeviTet:"8a2be2",bPwn:"a52a2a",burlywood:"deb887",caMtXe:"5f9ea0",KartYuse:"7fff00",KocTate:"d2691e",cSO:"ff7f50",cSnflowerXe:"6495ed",cSnsilk:"fff8dc",crimson:"dc143c",cyan:"ffff",xXe:"8b",xcyan:"8b8b",xgTMnPd:"b8860b",xWay:"a9a9a9",xgYF:"6400",xgYy:"a9a9a9",xkhaki:"bdb76b",xmagFta:"8b008b",xTivegYF:"556b2f",xSange:"ff8c00",xScEd:"9932cc",xYd:"8b0000",xsOmon:"e9967a",xsHgYF:"8fbc8f",xUXe:"483d8b",xUWay:"2f4f4f",xUgYy:"2f4f4f",xQe:"ced1",xviTet:"9400d3",dAppRk:"ff1493",dApskyXe:"bfff",dimWay:"696969",dimgYy:"696969",dodgerXe:"1e90ff",fiYbrick:"b22222",flSOwEte:"fffaf0",foYstWAn:"228b22",fuKsia:"ff00ff",gaRsbSo:"dcdcdc",ghostwEte:"f8f8ff",gTd:"ffd700",gTMnPd:"daa520",Way:"808080",gYF:"8000",gYFLw:"adff2f",gYy:"808080",honeyMw:"f0fff0",hotpRk:"ff69b4",RdianYd:"cd5c5c",Rdigo:"4b0082",ivSy:"fffff0",khaki:"f0e68c",lavFMr:"e6e6fa",lavFMrXsh:"fff0f5",lawngYF:"7cfc00",NmoncEffon:"fffacd",ZXe:"add8e6",ZcSO:"f08080",Zcyan:"e0ffff",ZgTMnPdLw:"fafad2",ZWay:"d3d3d3",ZgYF:"90ee90",ZgYy:"d3d3d3",ZpRk:"ffb6c1",ZsOmon:"ffa07a",ZsHgYF:"20b2aa",ZskyXe:"87cefa",ZUWay:"778899",ZUgYy:"778899",ZstAlXe:"b0c4de",ZLw:"ffffe0",lime:"ff00",limegYF:"32cd32",lRF:"faf0e6",magFta:"ff00ff",maPon:"800000",VaquamarRe:"66cdaa",VXe:"cd",VScEd:"ba55d3",VpurpN:"9370db",VsHgYF:"3cb371",VUXe:"7b68ee",VsprRggYF:"fa9a",VQe:"48d1cc",VviTetYd:"c71585",midnightXe:"191970",mRtcYam:"f5fffa",mistyPse:"ffe4e1",moccasR:"ffe4b5",navajowEte:"ffdead",navy:"80",Tdlace:"fdf5e6",Tive:"808000",TivedBb:"6b8e23",Sange:"ffa500",SangeYd:"ff4500",ScEd:"da70d6",pOegTMnPd:"eee8aa",pOegYF:"98fb98",pOeQe:"afeeee",pOeviTetYd:"db7093",papayawEp:"ffefd5",pHKpuff:"ffdab9",peru:"cd853f",pRk:"ffc0cb",plum:"dda0dd",powMrXe:"b0e0e6",purpN:"800080",YbeccapurpN:"663399",Yd:"ff0000",Psybrown:"bc8f8f",PyOXe:"4169e1",saddNbPwn:"8b4513",sOmon:"fa8072",sandybPwn:"f4a460",sHgYF:"2e8b57",sHshell:"fff5ee",siFna:"a0522d",silver:"c0c0c0",skyXe:"87ceeb",UXe:"6a5acd",UWay:"708090",UgYy:"708090",snow:"fffafa",sprRggYF:"ff7f",stAlXe:"4682b4",tan:"d2b48c",teO:"8080",tEstN:"d8bfd8",tomato:"ff6347",Qe:"40e0d0",viTet:"ee82ee",JHt:"f5deb3",wEte:"ffffff",wEtesmoke:"f5f5f5",Lw:"ffff00",LwgYF:"9acd32"};let gc;const mc=/^rgba?\(\s*([-+.\d]+)(%)?[\s,]+([-+.e\d]+)(%)?[\s,]+([-+.e\d]+)(%)?(?:[\s,/]+([-+.e\d]+)(%)?)?\s*\)$/,yc=t=>t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-.055,bc=t=>t<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4);function vc(t,e,i){if(t){let n=cc(t);n[e]=Math.max(0,Math.min(n[e]+n[e]*i,0===e?360:1)),n=uc(n),t.r=n[0],t.g=n[1],t.b=n[2]}}function xc(t,e){return t?Object.assign(e||{},t):t}function _c(t){var e={r:0,g:0,b:0,a:255};return Array.isArray(t)?t.length>=3&&(e={r:t[0],g:t[1],b:t[2],a:255},t.length>3&&(e.a=Kl(t[3]))):(e=xc(t,{r:0,g:0,b:0,a:1})).a=Kl(e.a),e}function wc(t){return"r"===t.charAt(0)?function(t){const e=mc.exec(t);let i,n,r,o=255;if(e){if(e[7]!==i){const t=+e[7];o=e[8]?Zl(t):ql(255*t,0,255)}return i=+e[1],n=+e[3],r=+e[5],i=255&(e[2]?Zl(i):ql(i,0,255)),n=255&(e[4]?Zl(n):ql(n,0,255)),r=255&(e[6]?Zl(r):ql(r,0,255)),{r:i,g:n,b:r,a:o}}}(t):function(t){const e=oc.exec(t);let i,n=255;if(!e)return;e[5]!==i&&(n=e[6]?Zl(+e[5]):Kl(+e[5]));const r=dc(+e[2]),o=+e[3]/100,s=+e[4]/100;return i="hwb"===e[1]?function(t,e,i){return hc(lc,t,e,i)}(r,o,s):"hsv"===e[1]?function(t,e,i){return hc(ac,t,e,i)}(r,o,s):uc(r,o,s),{r:i[0],g:i[1],b:i[2],a:n}}(t)}class Mc{constructor(t){if(t instanceof Mc)return t;const e=typeof t;let i;var n,r,o;"object"===e?i=_c(t):"string"===e&&(o=(n=t).length,"#"===n[0]&&(4===o||5===o?r={r:255&17*tc[n[1]],g:255&17*tc[n[2]],b:255&17*tc[n[3]],a:5===o?17*tc[n[4]]:255}:7!==o&&9!==o||(r={r:tc[n[1]]<<4|tc[n[2]],g:tc[n[3]]<<4|tc[n[4]],b:tc[n[5]]<<4|tc[n[6]],a:9===o?tc[n[7]]<<4|tc[n[8]]:255})),i=r||function(t){gc||(gc=function(){const t={},e=Object.keys(pc),i=Object.keys(fc);let n,r,o,s,a;for(n=0;n<e.length;n++){for(s=a=e[n],r=0;r<i.length;r++)o=i[r],a=a.replace(o,fc[o]);o=parseInt(pc[s],16),t[a]=[o>>16&255,o>>8&255,255&o]}return t}(),gc.transparent=[0,0,0,0]);const e=gc[t.toLowerCase()];return e&&{r:e[0],g:e[1],b:e[2],a:4===e.length?e[3]:255}}(t)||wc(t)),this._rgb=i,this._valid=!!i}get valid(){return this._valid}get rgb(){var t=xc(this._rgb);return t&&(t.a=Ql(t.a)),t}set rgb(t){this._rgb=_c(t)}rgbString(){return this._valid?(t=this._rgb)&&(t.a<255?`rgba(${t.r}, ${t.g}, ${t.b}, ${Ql(t.a)})`:`rgb(${t.r}, ${t.g}, ${t.b})`):void 0;var t}hexString(){return this._valid?(t=this._rgb,e=(t=>rc(t.r)&&rc(t.g)&&rc(t.b)&&rc(t.a))(t)?ic:nc,t?"#"+e(t.r)+e(t.g)+e(t.b)+((t,e)=>t<255?e(t):"")(t.a,e):void 0):void 0;var t,e}hslString(){return this._valid?function(t){if(!t)return;const e=cc(t),i=e[0],n=Jl(e[1]),r=Jl(e[2]);return t.a<255?`hsla(${i}, ${n}%, ${r}%, ${Ql(t.a)})`:`hsl(${i}, ${n}%, ${r}%)`}(this._rgb):void 0}mix(t,e){if(t){const i=this.rgb,n=t.rgb;let r;const o=e===r?.5:e,s=2*o-1,a=i.a-n.a,l=((s*a==-1?s:(s+a)/(1+s*a))+1)/2;r=1-l,i.r=255&l*i.r+r*n.r+.5,i.g=255&l*i.g+r*n.g+.5,i.b=255&l*i.b+r*n.b+.5,i.a=o*i.a+(1-o)*n.a,this.rgb=i}return this}interpolate(t,e){return t&&(this._rgb=function(t,e,i){const n=bc(Ql(t.r)),r=bc(Ql(t.g)),o=bc(Ql(t.b));return{r:Kl(yc(n+i*(bc(Ql(e.r))-n))),g:Kl(yc(r+i*(bc(Ql(e.g))-r))),b:Kl(yc(o+i*(bc(Ql(e.b))-o))),a:t.a+i*(e.a-t.a)}}(this._rgb,t._rgb,e)),this}clone(){return new Mc(this.rgb)}alpha(t){return this._rgb.a=Kl(t),this}clearer(t){return this._rgb.a*=1-t,this}greyscale(){const t=this._rgb,e=Xl(.3*t.r+.59*t.g+.11*t.b);return t.r=t.g=t.b=e,this}opaquer(t){return this._rgb.a*=1+t,this}negate(){const t=this._rgb;return t.r=255-t.r,t.g=255-t.g,t.b=255-t.b,this}lighten(t){return vc(this._rgb,2,t),this}darken(t){return vc(this._rgb,2,-t),this}saturate(t){return vc(this._rgb,1,t),this}desaturate(t){return vc(this._rgb,1,-t),this}rotate(t){return function(t,e){var i=cc(t);i[0]=dc(i[0]+e),i=uc(i),t.r=i[0],t.g=i[1],t.b=i[2]}(this._rgb,t),this}}function kc(){}const Sc=(()=>{let t=0;return()=>t++})();function Dc(t){return null==t}function Ec(t){if(Array.isArray&&Array.isArray(t))return!0;const e=Object.prototype.toString.call(t);return"[object"===e.slice(0,7)&&"Array]"===e.slice(-6)}function Oc(t){return null!==t&&"[object Object]"===Object.prototype.toString.call(t)}function Pc(t){return("number"==typeof t||t instanceof Number)&&isFinite(+t)}function Ac(t,e){return Pc(t)?t:e}function Cc(t,e){return void 0===t?e:t}const Tc=(t,e)=>"string"==typeof t&&t.endsWith("%")?parseFloat(t)/100*e:+t;function Lc(t,e,i){if(t&&"function"==typeof t.call)return t.apply(i,e)}function Rc(t,e,i,n){let r,o,s;if(Ec(t))if(o=t.length,n)for(r=o-1;r>=0;r--)e.call(i,t[r],r);else for(r=0;r<o;r++)e.call(i,t[r],r);else if(Oc(t))for(s=Object.keys(t),o=s.length,r=0;r<o;r++)e.call(i,t[s[r]],s[r])}function jc(t,e){let i,n,r,o;if(!t||!e||t.length!==e.length)return!1;for(i=0,n=t.length;i<n;++i)if(r=t[i],o=e[i],r.datasetIndex!==o.datasetIndex||r.index!==o.index)return!1;return!0}function zc(t){if(Ec(t))return t.map(zc);if(Oc(t)){const e=Object.create(null),i=Object.keys(t),n=i.length;let r=0;for(;r<n;++r)e[i[r]]=zc(t[i[r]]);return e}return t}function Nc(t){return-1===["__proto__","prototype","constructor"].indexOf(t)}function Ic(t,e,i,n){if(!Nc(t))return;const r=e[t],o=i[t];Oc(r)&&Oc(o)?Hc(r,o,n):e[t]=zc(o)}function Hc(t,e,i){const n=Ec(e)?e:[e],r=n.length;if(!Oc(t))return t;const o=(i=i||{}).merger||Ic;let s;for(let e=0;e<r;++e){if(s=n[e],!Oc(s))continue;const r=Object.keys(s);for(let e=0,n=r.length;e<n;++e)o(r[e],t,s,i)}return t}function Uc(t,e){return Hc(t,e,{merger:Fc})}function Fc(t,e,i){if(!Nc(t))return;const n=e[t],r=i[t];Oc(n)&&Oc(r)?Uc(n,r):Object.prototype.hasOwnProperty.call(e,t)||(e[t]=zc(r))}const Bc={"":t=>t,x:t=>t.x,y:t=>t.y};function Wc(t,e){const i=Bc[e]||(Bc[e]=function(t){const e=function(t){const e=t.split("."),i=[];let n="";for(const t of e)n+=t,n.endsWith("\\")?n=n.slice(0,-1)+".":(i.push(n),n="");return i}(t);return t=>{for(const i of e){if(""===i)break;t=t&&t[i]}return t}}(e));return i(t)}function Vc(t){return t.charAt(0).toUpperCase()+t.slice(1)}const $c=t=>void 0!==t,Yc=t=>"function"==typeof t,Gc=(t,e)=>{if(t.size!==e.size)return!1;for(const i of t)if(!e.has(i))return!1;return!0},Xc=Math.PI,qc=2*Xc,Zc=qc+Xc,Kc=Number.POSITIVE_INFINITY,Qc=Xc/180,Jc=Xc/2,th=Xc/4,eh=2*Xc/3,ih=Math.log10,nh=Math.sign;function rh(t,e,i){return Math.abs(t-e)<i}function oh(t){const e=Math.round(t);t=rh(t,e,t/1e3)?e:t;const i=Math.pow(10,Math.floor(ih(t))),n=t/i;return(n<=1?1:n<=2?2:n<=5?5:10)*i}function sh(t){return!isNaN(parseFloat(t))&&isFinite(t)}function ah(t,e,i){let n,r,o;for(n=0,r=t.length;n<r;n++)o=t[n][i],isNaN(o)||(e.min=Math.min(e.min,o),e.max=Math.max(e.max,o))}function lh(t){return t*(Xc/180)}function ch(t){return t*(180/Xc)}function hh(t){if(!Pc(t))return;let e=1,i=0;for(;Math.round(t*e)/e!==t;)e*=10,i++;return i}function uh(t,e){const i=e.x-t.x,n=e.y-t.y,r=Math.sqrt(i*i+n*n);let o=Math.atan2(n,i);return o<-.5*Xc&&(o+=qc),{angle:o,distance:r}}function dh(t,e){return Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))}function fh(t,e){return(t-e+Zc)%qc-Xc}function ph(t){return(t%qc+qc)%qc}function gh(t,e,i,n){const r=ph(t),o=ph(e),s=ph(i),a=ph(o-r),l=ph(s-r),c=ph(r-o),h=ph(r-s);return r===o||r===s||n&&o===s||a>l&&c<h}function mh(t,e,i){return Math.max(e,Math.min(i,t))}function yh(t,e,i,n=1e-6){return t>=Math.min(e,i)-n&&t<=Math.max(e,i)+n}function bh(t,e,i){i=i||(i=>t[i]<e);let n,r=t.length-1,o=0;for(;r-o>1;)n=o+r>>1,i(n)?o=n:r=n;return{lo:o,hi:r}}const vh=(t,e,i,n)=>bh(t,i,n?n=>{const r=t[n][e];return r<i||r===i&&t[n+1][e]===i}:n=>t[n][e]<i),xh=(t,e,i)=>bh(t,i,(n=>t[n][e]>=i)),_h=["push","pop","shift","splice","unshift"];function wh(t,e){const i=t._chartjs;if(!i)return;const n=i.listeners,r=n.indexOf(e);-1!==r&&n.splice(r,1),n.length>0||(_h.forEach((e=>{delete t[e]})),delete t._chartjs)}function Mh(t){const e=new Set(t);return e.size===t.length?t:Array.from(e)}const kh="undefined"==typeof window?function(t){return t()}:window.requestAnimationFrame;function Sh(t,e){let i=[],n=!1;return function(...r){i=r,n||(n=!0,kh.call(window,(()=>{n=!1,t.apply(e,i)})))}}const Dh=t=>"start"===t?"left":"end"===t?"right":"center",Eh=(t,e,i)=>"start"===t?e:"end"===t?i:(e+i)/2;function Oh(t,e,i){const n=e.length;let r=0,o=n;if(t._sorted){const{iScale:s,_parsed:a}=t,l=s.axis,{min:c,max:h,minDefined:u,maxDefined:d}=s.getUserBounds();u&&(r=mh(Math.min(vh(a,l,c).lo,i?n:vh(e,l,s.getPixelForValue(c)).lo),0,n-1)),o=d?mh(Math.max(vh(a,s.axis,h,!0).hi+1,i?0:vh(e,l,s.getPixelForValue(h),!0).hi+1),r,n)-r:n-r}return{start:r,count:o}}function Ph(t){const{xScale:e,yScale:i,_scaleRanges:n}=t,r={xmin:e.min,xmax:e.max,ymin:i.min,ymax:i.max};if(!n)return t._scaleRanges=r,!0;const o=n.xmin!==e.min||n.xmax!==e.max||n.ymin!==i.min||n.ymax!==i.max;return Object.assign(n,r),o}const Ah=t=>0===t||1===t,Ch=(t,e,i)=>-Math.pow(2,10*(t-=1))*Math.sin((t-e)*qc/i),Th=(t,e,i)=>Math.pow(2,-10*t)*Math.sin((t-e)*qc/i)+1,Lh={linear:t=>t,easeInQuad:t=>t*t,easeOutQuad:t=>-t*(t-2),easeInOutQuad:t=>(t/=.5)<1?.5*t*t:-.5*(--t*(t-2)-1),easeInCubic:t=>t*t*t,easeOutCubic:t=>(t-=1)*t*t+1,easeInOutCubic:t=>(t/=.5)<1?.5*t*t*t:.5*((t-=2)*t*t+2),easeInQuart:t=>t*t*t*t,easeOutQuart:t=>-((t-=1)*t*t*t-1),easeInOutQuart:t=>(t/=.5)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2),easeInQuint:t=>t*t*t*t*t,easeOutQuint:t=>(t-=1)*t*t*t*t+1,easeInOutQuint:t=>(t/=.5)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2),easeInSine:t=>1-Math.cos(t*Jc),easeOutSine:t=>Math.sin(t*Jc),easeInOutSine:t=>-.5*(Math.cos(Xc*t)-1),easeInExpo:t=>0===t?0:Math.pow(2,10*(t-1)),easeOutExpo:t=>1===t?1:1-Math.pow(2,-10*t),easeInOutExpo:t=>Ah(t)?t:t<.5?.5*Math.pow(2,10*(2*t-1)):.5*(2-Math.pow(2,-10*(2*t-1))),easeInCirc:t=>t>=1?t:-(Math.sqrt(1-t*t)-1),easeOutCirc:t=>Math.sqrt(1-(t-=1)*t),easeInOutCirc:t=>(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1),easeInElastic:t=>Ah(t)?t:Ch(t,.075,.3),easeOutElastic:t=>Ah(t)?t:Th(t,.075,.3),easeInOutElastic(t){const e=.1125;return Ah(t)?t:t<.5?.5*Ch(2*t,e,.45):.5+.5*Th(2*t-1,e,.45)},easeInBack(t){const e=1.70158;return t*t*((e+1)*t-e)},easeOutBack(t){const e=1.70158;return(t-=1)*t*((e+1)*t+e)+1},easeInOutBack(t){let e=1.70158;return(t/=.5)<1?t*t*((1+(e*=1.525))*t-e)*.5:.5*((t-=2)*t*((1+(e*=1.525))*t+e)+2)},easeInBounce:t=>1-Lh.easeOutBounce(1-t),easeOutBounce(t){const e=7.5625,i=2.75;return t<1/i?e*t*t:t<2/i?e*(t-=1.5/i)*t+.75:t<2.5/i?e*(t-=2.25/i)*t+.9375:e*(t-=2.625/i)*t+.984375},easeInOutBounce:t=>t<.5?.5*Lh.easeInBounce(2*t):.5*Lh.easeOutBounce(2*t-1)+.5};function Rh(t){if(t&&"object"==typeof t){const e=t.toString();return"[object CanvasPattern]"===e||"[object CanvasGradient]"===e}return!1}function jh(t){return Rh(t)?t:new Mc(t)}function zh(t){return Rh(t)?t:new Mc(t).saturate(.5).darken(.1).hexString()}const Nh=["x","y","borderWidth","radius","tension"],Ih=["color","borderColor","backgroundColor"],Hh=new Map;function Uh(t,e,i){return function(t,e){e=e||{};const i=t+JSON.stringify(e);let n=Hh.get(i);return n||(n=new Intl.NumberFormat(t,e),Hh.set(i,n)),n}(e,i).format(t)}const Fh={values:t=>Ec(t)?t:""+t,numeric(t,e,i){if(0===t)return"0";const n=this.chart.options.locale;let r,o=t;if(i.length>1){const e=Math.max(Math.abs(i[0].value),Math.abs(i[i.length-1].value));(e<1e-4||e>1e15)&&(r="scientific"),o=function(t,e){let i=e.length>3?e[2].value-e[1].value:e[1].value-e[0].value;return Math.abs(i)>=1&&t!==Math.floor(t)&&(i=t-Math.floor(t)),i}(t,i)}const s=ih(Math.abs(o)),a=isNaN(s)?1:Math.max(Math.min(-1*Math.floor(s),20),0),l={notation:r,minimumFractionDigits:a,maximumFractionDigits:a};return Object.assign(l,this.options.ticks.format),Uh(t,n,l)},logarithmic(t,e,i){if(0===t)return"0";const n=i[e].significand||t/Math.pow(10,Math.floor(ih(t)));return[1,2,3,5,10,15].includes(n)||e>.8*i.length?Fh.numeric.call(this,t,e,i):""}};var Bh={formatters:Fh};const Wh=Object.create(null),Vh=Object.create(null);function $h(t,e){if(!e)return t;const i=e.split(".");for(let e=0,n=i.length;e<n;++e){const n=i[e];t=t[n]||(t[n]=Object.create(null))}return t}function Yh(t,e,i){return"string"==typeof e?Hc($h(t,e),i):Hc($h(t,""),e)}class Gh{constructor(t,e){this.animation=void 0,this.backgroundColor="rgba(0,0,0,0.1)",this.borderColor="rgba(0,0,0,0.1)",this.color="#666",this.datasets={},this.devicePixelRatio=t=>t.chart.platform.getDevicePixelRatio(),this.elements={},this.events=["mousemove","mouseout","click","touchstart","touchmove"],this.font={family:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",size:12,style:"normal",lineHeight:1.2,weight:null},this.hover={},this.hoverBackgroundColor=(t,e)=>zh(e.backgroundColor),this.hoverBorderColor=(t,e)=>zh(e.borderColor),this.hoverColor=(t,e)=>zh(e.color),this.indexAxis="x",this.interaction={mode:"nearest",intersect:!0,includeInvisible:!1},this.maintainAspectRatio=!0,this.onHover=null,this.onClick=null,this.parsing=!0,this.plugins={},this.responsive=!0,this.scale=void 0,this.scales={},this.showLine=!0,this.drawActiveElementsOnTop=!0,this.describe(t),this.apply(e)}set(t,e){return Yh(this,t,e)}get(t){return $h(this,t)}describe(t,e){return Yh(Vh,t,e)}override(t,e){return Yh(Wh,t,e)}route(t,e,i,n){const r=$h(this,t),o=$h(this,i),s="_"+e;Object.defineProperties(r,{[s]:{value:r[e],writable:!0},[e]:{enumerable:!0,get(){const t=this[s],e=o[n];return Oc(t)?Object.assign({},e,t):Cc(t,e)},set(t){this[s]=t}}})}apply(t){t.forEach((t=>t(this)))}}var Xh=new Gh({_scriptable:t=>!t.startsWith("on"),_indexable:t=>"events"!==t,hover:{_fallback:"interaction"},interaction:{_scriptable:!1,_indexable:!1}},[function(t){t.set("animation",{delay:void 0,duration:1e3,easing:"easeOutQuart",fn:void 0,from:void 0,loop:void 0,to:void 0,type:void 0}),t.describe("animation",{_fallback:!1,_indexable:!1,_scriptable:t=>"onProgress"!==t&&"onComplete"!==t&&"fn"!==t}),t.set("animations",{colors:{type:"color",properties:Ih},numbers:{type:"number",properties:Nh}}),t.describe("animations",{_fallback:"animation"}),t.set("transitions",{active:{animation:{duration:400}},resize:{animation:{duration:0}},show:{animations:{colors:{from:"transparent"},visible:{type:"boolean",duration:0}}},hide:{animations:{colors:{to:"transparent"},visible:{type:"boolean",easing:"linear",fn:t=>0|t}}}})},function(t){t.set("layout",{autoPadding:!0,padding:{top:0,right:0,bottom:0,left:0}})},function(t){t.set("scale",{display:!0,offset:!1,reverse:!1,beginAtZero:!1,bounds:"ticks",grace:0,grid:{display:!0,lineWidth:1,drawOnChartArea:!0,drawTicks:!0,tickLength:8,tickWidth:(t,e)=>e.lineWidth,tickColor:(t,e)=>e.color,offset:!1},border:{display:!0,dash:[],dashOffset:0,width:1},title:{display:!1,text:"",padding:{top:4,bottom:4}},ticks:{minRotation:0,maxRotation:50,mirror:!1,textStrokeWidth:0,textStrokeColor:"",padding:3,display:!0,autoSkip:!0,autoSkipPadding:3,labelOffset:0,callback:Bh.formatters.values,minor:{},major:{},align:"center",crossAlign:"near",showLabelBackdrop:!1,backdropColor:"rgba(255, 255, 255, 0.75)",backdropPadding:2}}),t.route("scale.ticks","color","","color"),t.route("scale.grid","color","","borderColor"),t.route("scale.border","color","","borderColor"),t.route("scale.title","color","","color"),t.describe("scale",{_fallback:!1,_scriptable:t=>!t.startsWith("before")&&!t.startsWith("after")&&"callback"!==t&&"parser"!==t,_indexable:t=>"borderDash"!==t&&"tickBorderDash"!==t&&"dash"!==t}),t.describe("scales",{_fallback:"scale"}),t.describe("scale.ticks",{_scriptable:t=>"backdropPadding"!==t&&"callback"!==t,_indexable:t=>"backdropPadding"!==t})}]);function qh(t,e,i,n,r){let o=e[r];return o||(o=e[r]=t.measureText(r).width,i.push(r)),o>n&&(n=o),n}function Zh(t,e,i,n){let r=(n=n||{}).data=n.data||{},o=n.garbageCollect=n.garbageCollect||[];n.font!==e&&(r=n.data={},o=n.garbageCollect=[],n.font=e),t.save(),t.font=e;let s=0;const a=i.length;let l,c,h,u,d;for(l=0;l<a;l++)if(u=i[l],null==u||Ec(u)){if(Ec(u))for(c=0,h=u.length;c<h;c++)d=u[c],null==d||Ec(d)||(s=qh(t,r,o,s,d))}else s=qh(t,r,o,s,u);t.restore();const f=o.length/2;if(f>i.length){for(l=0;l<f;l++)delete r[o[l]];o.splice(0,f)}return s}function Kh(t,e,i){const n=t.currentDevicePixelRatio,r=0!==i?Math.max(i/2,.5):0;return Math.round((e-r)*n)/n+r}function Qh(t,e){(e=e||t.getContext("2d")).save(),e.resetTransform(),e.clearRect(0,0,t.width,t.height),e.restore()}function Jh(t,e,i,n){tu(t,e,i,n,null)}function tu(t,e,i,n,r){let o,s,a,l,c,h,u,d;const f=e.pointStyle,p=e.rotation,g=e.radius;let m=(p||0)*Qc;if(f&&"object"==typeof f&&(o=f.toString(),"[object HTMLImageElement]"===o||"[object HTMLCanvasElement]"===o))return t.save(),t.translate(i,n),t.rotate(m),t.drawImage(f,-f.width/2,-f.height/2,f.width,f.height),void t.restore();if(!(isNaN(g)||g<=0)){switch(t.beginPath(),f){default:r?t.ellipse(i,n,r/2,g,0,0,qc):t.arc(i,n,g,0,qc),t.closePath();break;case"triangle":h=r?r/2:g,t.moveTo(i+Math.sin(m)*h,n-Math.cos(m)*g),m+=eh,t.lineTo(i+Math.sin(m)*h,n-Math.cos(m)*g),m+=eh,t.lineTo(i+Math.sin(m)*h,n-Math.cos(m)*g),t.closePath();break;case"rectRounded":c=.516*g,l=g-c,s=Math.cos(m+th)*l,u=Math.cos(m+th)*(r?r/2-c:l),a=Math.sin(m+th)*l,d=Math.sin(m+th)*(r?r/2-c:l),t.arc(i-u,n-a,c,m-Xc,m-Jc),t.arc(i+d,n-s,c,m-Jc,m),t.arc(i+u,n+a,c,m,m+Jc),t.arc(i-d,n+s,c,m+Jc,m+Xc),t.closePath();break;case"rect":if(!p){l=Math.SQRT1_2*g,h=r?r/2:l,t.rect(i-h,n-l,2*h,2*l);break}m+=th;case"rectRot":u=Math.cos(m)*(r?r/2:g),s=Math.cos(m)*g,a=Math.sin(m)*g,d=Math.sin(m)*(r?r/2:g),t.moveTo(i-u,n-a),t.lineTo(i+d,n-s),t.lineTo(i+u,n+a),t.lineTo(i-d,n+s),t.closePath();break;case"crossRot":m+=th;case"cross":u=Math.cos(m)*(r?r/2:g),s=Math.cos(m)*g,a=Math.sin(m)*g,d=Math.sin(m)*(r?r/2:g),t.moveTo(i-u,n-a),t.lineTo(i+u,n+a),t.moveTo(i+d,n-s),t.lineTo(i-d,n+s);break;case"star":u=Math.cos(m)*(r?r/2:g),s=Math.cos(m)*g,a=Math.sin(m)*g,d=Math.sin(m)*(r?r/2:g),t.moveTo(i-u,n-a),t.lineTo(i+u,n+a),t.moveTo(i+d,n-s),t.lineTo(i-d,n+s),m+=th,u=Math.cos(m)*(r?r/2:g),s=Math.cos(m)*g,a=Math.sin(m)*g,d=Math.sin(m)*(r?r/2:g),t.moveTo(i-u,n-a),t.lineTo(i+u,n+a),t.moveTo(i+d,n-s),t.lineTo(i-d,n+s);break;case"line":s=r?r/2:Math.cos(m)*g,a=Math.sin(m)*g,t.moveTo(i-s,n-a),t.lineTo(i+s,n+a);break;case"dash":t.moveTo(i,n),t.lineTo(i+Math.cos(m)*(r?r/2:g),n+Math.sin(m)*g);break;case!1:t.closePath()}t.fill(),e.borderWidth>0&&t.stroke()}}function eu(t,e,i){return i=i||.5,!e||t&&t.x>e.left-i&&t.x<e.right+i&&t.y>e.top-i&&t.y<e.bottom+i}function iu(t,e){t.save(),t.beginPath(),t.rect(e.left,e.top,e.right-e.left,e.bottom-e.top),t.clip()}function nu(t){t.restore()}function ru(t,e,i,n,r){if(!e)return t.lineTo(i.x,i.y);if("middle"===r){const n=(e.x+i.x)/2;t.lineTo(n,e.y),t.lineTo(n,i.y)}else"after"===r!=!!n?t.lineTo(e.x,i.y):t.lineTo(i.x,e.y);t.lineTo(i.x,i.y)}function ou(t,e,i,n){if(!e)return t.lineTo(i.x,i.y);t.bezierCurveTo(n?e.cp1x:e.cp2x,n?e.cp1y:e.cp2y,n?i.cp2x:i.cp1x,n?i.cp2y:i.cp1y,i.x,i.y)}function su(t,e,i,n,r){if(r.strikethrough||r.underline){const o=t.measureText(n),s=e-o.actualBoundingBoxLeft,a=e+o.actualBoundingBoxRight,l=i-o.actualBoundingBoxAscent,c=i+o.actualBoundingBoxDescent,h=r.strikethrough?(l+c)/2:c;t.strokeStyle=t.fillStyle,t.beginPath(),t.lineWidth=r.decorationWidth||2,t.moveTo(s,h),t.lineTo(a,h),t.stroke()}}function au(t,e){const i=t.fillStyle;t.fillStyle=e.color,t.fillRect(e.left,e.top,e.width,e.height),t.fillStyle=i}function lu(t,e,i,n,r,o={}){const s=Ec(e)?e:[e],a=o.strokeWidth>0&&""!==o.strokeColor;let l,c;for(t.save(),t.font=r.string,function(t,e){e.translation&&t.translate(e.translation[0],e.translation[1]),Dc(e.rotation)||t.rotate(e.rotation),e.color&&(t.fillStyle=e.color),e.textAlign&&(t.textAlign=e.textAlign),e.textBaseline&&(t.textBaseline=e.textBaseline)}(t,o),l=0;l<s.length;++l)c=s[l],o.backdrop&&au(t,o.backdrop),a&&(o.strokeColor&&(t.strokeStyle=o.strokeColor),Dc(o.strokeWidth)||(t.lineWidth=o.strokeWidth),t.strokeText(c,i,n,o.maxWidth)),t.fillText(c,i,n,o.maxWidth),su(t,i,n,c,o),n+=Number(r.lineHeight);t.restore()}function cu(t,e){const{x:i,y:n,w:r,h:o,radius:s}=e;t.arc(i+s.topLeft,n+s.topLeft,s.topLeft,-Jc,Xc,!0),t.lineTo(i,n+o-s.bottomLeft),t.arc(i+s.bottomLeft,n+o-s.bottomLeft,s.bottomLeft,Xc,Jc,!0),t.lineTo(i+r-s.bottomRight,n+o),t.arc(i+r-s.bottomRight,n+o-s.bottomRight,s.bottomRight,Jc,0,!0),t.lineTo(i+r,n+s.topRight),t.arc(i+r-s.topRight,n+s.topRight,s.topRight,0,-Jc,!0),t.lineTo(i+s.topLeft,n)}const hu=/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/,uu=/^(normal|italic|initial|inherit|unset|(oblique( -?[0-9]?[0-9]deg)?))$/;function du(t,e){const i=(""+t).match(hu);if(!i||"normal"===i[1])return 1.2*e;switch(t=+i[2],i[3]){case"px":return t;case"%":t/=100}return e*t}function fu(t,e){const i={},n=Oc(e),r=n?Object.keys(e):e,o=Oc(t)?n?i=>Cc(t[i],t[e[i]]):e=>t[e]:()=>t;for(const t of r)i[t]=+o(t)||0;return i}function pu(t){return fu(t,{top:"y",right:"x",bottom:"y",left:"x"})}function gu(t){return fu(t,["topLeft","topRight","bottomLeft","bottomRight"])}function mu(t){const e=pu(t);return e.width=e.left+e.right,e.height=e.top+e.bottom,e}function yu(t,e){t=t||{},e=e||Xh.font;let i=Cc(t.size,e.size);"string"==typeof i&&(i=parseInt(i,10));let n=Cc(t.style,e.style);n&&!(""+n).match(uu)&&(console.warn('Invalid font style specified: "'+n+'"'),n=void 0);const r={family:Cc(t.family,e.family),lineHeight:du(Cc(t.lineHeight,e.lineHeight),i),size:i,style:n,weight:Cc(t.weight,e.weight),string:""};return r.string=function(t){return!t||Dc(t.size)||Dc(t.family)?null:(t.style?t.style+" ":"")+(t.weight?t.weight+" ":"")+t.size+"px "+t.family}(r),r}function bu(t,e,i,n){let r,o,s,a=!0;for(r=0,o=t.length;r<o;++r)if(s=t[r],void 0!==s&&(void 0!==e&&"function"==typeof s&&(s=s(e),a=!1),void 0!==i&&Ec(s)&&(s=s[i%s.length],a=!1),void 0!==s))return n&&!a&&(n.cacheable=!1),s}function vu(t,e){return Object.assign(Object.create(t),e)}function xu(t,e=[""],i,n,r=(()=>t[0])){const o=i||t;void 0===n&&(n=Cu("_fallback",t));const s={[Symbol.toStringTag]:"Object",_cacheable:!0,_scopes:t,_rootScopes:o,_fallback:n,_getTarget:r,override:i=>xu([i,...t],e,o,n)};return new Proxy(s,{deleteProperty:(e,i)=>(delete e[i],delete e._keys,delete t[0][i],!0),get:(i,n)=>Su(i,n,(()=>function(t,e,i,n){let r;for(const o of e)if(r=Cu(Mu(o,t),i),void 0!==r)return ku(t,r)?Pu(i,n,t,r):r}(n,e,t,i))),getOwnPropertyDescriptor:(t,e)=>Reflect.getOwnPropertyDescriptor(t._scopes[0],e),getPrototypeOf:()=>Reflect.getPrototypeOf(t[0]),has:(t,e)=>Tu(t).includes(e),ownKeys:t=>Tu(t),set(t,e,i){const n=t._storage||(t._storage=r());return t[e]=n[e]=i,delete t._keys,!0}})}function _u(t,e,i,n){const r={_cacheable:!1,_proxy:t,_context:e,_subProxy:i,_stack:new Set,_descriptors:wu(t,n),setContext:e=>_u(t,e,i,n),override:r=>_u(t.override(r),e,i,n)};return new Proxy(r,{deleteProperty:(e,i)=>(delete e[i],delete t[i],!0),get:(t,e,i)=>Su(t,e,(()=>function(t,e,i){const{_proxy:n,_context:r,_subProxy:o,_descriptors:s}=t;let a=n[e];return Yc(a)&&s.isScriptable(e)&&(a=function(t,e,i,n){const{_proxy:r,_context:o,_subProxy:s,_stack:a}=i;if(a.has(t))throw new Error("Recursion detected: "+Array.from(a).join("->")+"->"+t);a.add(t);let l=e(o,s||n);return a.delete(t),ku(t,l)&&(l=Pu(r._scopes,r,t,l)),l}(e,a,t,i)),Ec(a)&&a.length&&(a=function(t,e,i,n){const{_proxy:r,_context:o,_subProxy:s,_descriptors:a}=i;if(void 0!==o.index&&n(t))return e[o.index%e.length];if(Oc(e[0])){const i=e,n=r._scopes.filter((t=>t!==i));e=[];for(const l of i){const i=Pu(n,r,t,l);e.push(_u(i,o,s&&s[t],a))}}return e}(e,a,t,s.isIndexable)),ku(e,a)&&(a=_u(a,r,o&&o[e],s)),a}(t,e,i))),getOwnPropertyDescriptor:(e,i)=>e._descriptors.allKeys?Reflect.has(t,i)?{enumerable:!0,configurable:!0}:void 0:Reflect.getOwnPropertyDescriptor(t,i),getPrototypeOf:()=>Reflect.getPrototypeOf(t),has:(e,i)=>Reflect.has(t,i),ownKeys:()=>Reflect.ownKeys(t),set:(e,i,n)=>(t[i]=n,delete e[i],!0)})}function wu(t,e={scriptable:!0,indexable:!0}){const{_scriptable:i=e.scriptable,_indexable:n=e.indexable,_allKeys:r=e.allKeys}=t;return{allKeys:r,scriptable:i,indexable:n,isScriptable:Yc(i)?i:()=>i,isIndexable:Yc(n)?n:()=>n}}const Mu=(t,e)=>t?t+Vc(e):e,ku=(t,e)=>Oc(e)&&"adapters"!==t&&(null===Object.getPrototypeOf(e)||e.constructor===Object);function Su(t,e,i){if(Object.prototype.hasOwnProperty.call(t,e))return t[e];const n=i();return t[e]=n,n}function Du(t,e,i){return Yc(t)?t(e,i):t}const Eu=(t,e)=>!0===t?e:"string"==typeof t?Wc(e,t):void 0;function Ou(t,e,i,n,r){for(const o of e){const e=Eu(i,o);if(e){t.add(e);const o=Du(e._fallback,i,r);if(void 0!==o&&o!==i&&o!==n)return o}else if(!1===e&&void 0!==n&&i!==n)return null}return!1}function Pu(t,e,i,n){const r=e._rootScopes,o=Du(e._fallback,i,n),s=[...t,...r],a=new Set;a.add(n);let l=Au(a,s,i,o||i,n);return null!==l&&(void 0===o||o===i||(l=Au(a,s,o,l,n),null!==l))&&xu(Array.from(a),[""],r,o,(()=>function(t,e,i){const n=t._getTarget();e in n||(n[e]={});const r=n[e];return Ec(r)&&Oc(i)?i:r||{}}(e,i,n)))}function Au(t,e,i,n,r){for(;i;)i=Ou(t,e,i,n,r);return i}function Cu(t,e){for(const i of e){if(!i)continue;const e=i[t];if(void 0!==e)return e}}function Tu(t){let e=t._keys;return e||(e=t._keys=function(t){const e=new Set;for(const i of t)for(const t of Object.keys(i).filter((t=>!t.startsWith("_"))))e.add(t);return Array.from(e)}(t._scopes)),e}function Lu(t,e,i,n){const{iScale:r}=t,{key:o="r"}=this._parsing,s=new Array(n);let a,l,c,h;for(a=0,l=n;a<l;++a)c=a+i,h=e[c],s[a]={r:r.parse(Wc(h,o),c)};return s}const Ru=Number.EPSILON||1e-14,ju=(t,e)=>e<t.length&&!t[e].skip&&t[e],zu=t=>"x"===t?"y":"x";function Nu(t,e,i,n){const r=t.skip?e:t,o=e,s=i.skip?e:i,a=dh(o,r),l=dh(s,o);let c=a/(a+l),h=l/(a+l);c=isNaN(c)?0:c,h=isNaN(h)?0:h;const u=n*c,d=n*h;return{previous:{x:o.x-u*(s.x-r.x),y:o.y-u*(s.y-r.y)},next:{x:o.x+d*(s.x-r.x),y:o.y+d*(s.y-r.y)}}}function Iu(t,e,i){return Math.max(Math.min(t,i),e)}function Hu(t,e,i,n,r){let o,s,a,l;if(e.spanGaps&&(t=t.filter((t=>!t.skip))),"monotone"===e.cubicInterpolationMode)!function(t,e="x"){const i=zu(e),n=t.length,r=Array(n).fill(0),o=Array(n);let s,a,l,c=ju(t,0);for(s=0;s<n;++s)if(a=l,l=c,c=ju(t,s+1),l){if(c){const t=c[e]-l[e];r[s]=0!==t?(c[i]-l[i])/t:0}o[s]=a?c?nh(r[s-1])!==nh(r[s])?0:(r[s-1]+r[s])/2:r[s-1]:r[s]}!function(t,e,i){const n=t.length;let r,o,s,a,l,c=ju(t,0);for(let h=0;h<n-1;++h)l=c,c=ju(t,h+1),l&&c&&(rh(e[h],0,Ru)?i[h]=i[h+1]=0:(r=i[h]/e[h],o=i[h+1]/e[h],a=Math.pow(r,2)+Math.pow(o,2),a<=9||(s=3/Math.sqrt(a),i[h]=r*s*e[h],i[h+1]=o*s*e[h])))}(t,r,o),function(t,e,i="x"){const n=zu(i),r=t.length;let o,s,a,l=ju(t,0);for(let c=0;c<r;++c){if(s=a,a=l,l=ju(t,c+1),!a)continue;const r=a[i],h=a[n];s&&(o=(r-s[i])/3,a[`cp1${i}`]=r-o,a[`cp1${n}`]=h-o*e[c]),l&&(o=(l[i]-r)/3,a[`cp2${i}`]=r+o,a[`cp2${n}`]=h+o*e[c])}}(t,o,e)}(t,r);else{let i=n?t[t.length-1]:t[0];for(o=0,s=t.length;o<s;++o)a=t[o],l=Nu(i,a,t[Math.min(o+1,s-(n?0:1))%s],e.tension),a.cp1x=l.previous.x,a.cp1y=l.previous.y,a.cp2x=l.next.x,a.cp2y=l.next.y,i=a}e.capBezierPoints&&function(t,e){let i,n,r,o,s,a=eu(t[0],e);for(i=0,n=t.length;i<n;++i)s=o,o=a,a=i<n-1&&eu(t[i+1],e),o&&(r=t[i],s&&(r.cp1x=Iu(r.cp1x,e.left,e.right),r.cp1y=Iu(r.cp1y,e.top,e.bottom)),a&&(r.cp2x=Iu(r.cp2x,e.left,e.right),r.cp2y=Iu(r.cp2y,e.top,e.bottom)))}(t,i)}function Uu(){return"undefined"!=typeof window&&"undefined"!=typeof document}function Fu(t){let e=t.parentNode;return e&&"[object ShadowRoot]"===e.toString()&&(e=e.host),e}function Bu(t,e,i){let n;return"string"==typeof t?(n=parseInt(t,10),-1!==t.indexOf("%")&&(n=n/100*e.parentNode[i])):n=t,n}const Wu=t=>t.ownerDocument.defaultView.getComputedStyle(t,null),Vu=["top","right","bottom","left"];function $u(t,e,i){const n={};i=i?"-"+i:"";for(let r=0;r<4;r++){const o=Vu[r];n[o]=parseFloat(t[e+"-"+o+i])||0}return n.width=n.left+n.right,n.height=n.top+n.bottom,n}function Yu(t,e){if("native"in t)return t;const{canvas:i,currentDevicePixelRatio:n}=e,r=Wu(i),o="border-box"===r.boxSizing,s=$u(r,"padding"),a=$u(r,"border","width"),{x:l,y:c,box:h}=function(t,e){const i=t.touches,n=i&&i.length?i[0]:t,{offsetX:r,offsetY:o}=n;let s,a,l=!1;if(((t,e,i)=>(t>0||e>0)&&(!i||!i.shadowRoot))(r,o,t.target))s=r,a=o;else{const t=e.getBoundingClientRect();s=n.clientX-t.left,a=n.clientY-t.top,l=!0}return{x:s,y:a,box:l}}(t,i),u=s.left+(h&&a.left),d=s.top+(h&&a.top);let{width:f,height:p}=e;return o&&(f-=s.width+a.width,p-=s.height+a.height),{x:Math.round((l-u)/f*i.width/n),y:Math.round((c-d)/p*i.height/n)}}const Gu=t=>Math.round(10*t)/10;function Xu(t,e,i){const n=e||1,r=Math.floor(t.height*n),o=Math.floor(t.width*n);t.height=Math.floor(t.height),t.width=Math.floor(t.width);const s=t.canvas;return s.style&&(i||!s.style.height&&!s.style.width)&&(s.style.height=`${t.height}px`,s.style.width=`${t.width}px`),(t.currentDevicePixelRatio!==n||s.height!==r||s.width!==o)&&(t.currentDevicePixelRatio=n,s.height=r,s.width=o,t.ctx.setTransform(n,0,0,n,0,0),!0)}const qu=function(){let t=!1;try{const e={get passive(){return t=!0,!1}};window.addEventListener("test",null,e),window.removeEventListener("test",null,e)}catch(t){}return t}();function Zu(t,e){const i=function(t,e){return Wu(t).getPropertyValue(e)}(t,e),n=i&&i.match(/^(\d+)(\.\d+)?px$/);return n?+n[1]:void 0}function Ku(t,e,i,n){return{x:t.x+i*(e.x-t.x),y:t.y+i*(e.y-t.y)}}function Qu(t,e,i,n){return{x:t.x+i*(e.x-t.x),y:"middle"===n?i<.5?t.y:e.y:"after"===n?i<1?t.y:e.y:i>0?e.y:t.y}}function Ju(t,e,i,n){const r={x:t.cp2x,y:t.cp2y},o={x:e.cp1x,y:e.cp1y},s=Ku(t,r,i),a=Ku(r,o,i),l=Ku(o,e,i),c=Ku(s,a,i),h=Ku(a,l,i);return Ku(c,h,i)}function td(t,e,i){return t?function(t,e){return{x:i=>t+t+e-i,setWidth(t){e=t},textAlign:t=>"center"===t?t:"right"===t?"left":"right",xPlus:(t,e)=>t-e,leftForLtr:(t,e)=>t-e}}(e,i):{x:t=>t,setWidth(t){},textAlign:t=>t,xPlus:(t,e)=>t+e,leftForLtr:(t,e)=>t}}function ed(t,e){let i,n;"ltr"!==e&&"rtl"!==e||(i=t.canvas.style,n=[i.getPropertyValue("direction"),i.getPropertyPriority("direction")],i.setProperty("direction",e,"important"),t.prevTextDirection=n)}function id(t,e){void 0!==e&&(delete t.prevTextDirection,t.canvas.style.setProperty("direction",e[0],e[1]))}function nd(t){return"angle"===t?{between:gh,compare:fh,normalize:ph}:{between:yh,compare:(t,e)=>t-e,normalize:t=>t}}function rd({start:t,end:e,count:i,loop:n,style:r}){return{start:t%i,end:e%i,loop:n&&(e-t+1)%i==0,style:r}}function od(t,e,i){if(!i)return[t];const{property:n,start:r,end:o}=i,s=e.length,{compare:a,between:l,normalize:c}=nd(n),{start:h,end:u,loop:d,style:f}=function(t,e,i){const{property:n,start:r,end:o}=i,{between:s,normalize:a}=nd(n),l=e.length;let c,h,{start:u,end:d,loop:f}=t;if(f){for(u+=l,d+=l,c=0,h=l;c<h&&s(a(e[u%l][n]),r,o);++c)u--,d--;u%=l,d%=l}return d<u&&(d+=l),{start:u,end:d,loop:f,style:t.style}}(t,e,i),p=[];let g,m,y,b=!1,v=null;for(let t=h,i=h;t<=u;++t)m=e[t%s],m.skip||(g=c(m[n]),g!==y&&(b=l(g,r,o),null===v&&(b||l(r,y,g)&&0!==a(r,y))&&(v=0===a(g,r)?t:i),null!==v&&(!b||0===a(o,g)||l(o,y,g))&&(p.push(rd({start:v,end:t,loop:d,count:s,style:f})),v=null),i=t,y=g));return null!==v&&p.push(rd({start:v,end:u,loop:d,count:s,style:f})),p}function sd(t,e){const i=[],n=t.segments;for(let r=0;r<n.length;r++){const o=od(n[r],t.points,e);o.length&&i.push(...o)}return i}function ad(t){return{backgroundColor:t.backgroundColor,borderCapStyle:t.borderCapStyle,borderDash:t.borderDash,borderDashOffset:t.borderDashOffset,borderJoinStyle:t.borderJoinStyle,borderWidth:t.borderWidth,borderColor:t.borderColor}}function ld(t,e){if(!e)return!1;const i=[],n=function(t,e){return Rh(e)?(i.includes(e)||i.push(e),i.indexOf(e)):e};return JSON.stringify(t,n)!==JSON.stringify(e,n)}class cd{constructor(){this._request=null,this._charts=new Map,this._running=!1,this._lastDate=void 0}_notify(t,e,i,n){const r=e.listeners[n],o=e.duration;r.forEach((n=>n({chart:t,initial:e.initial,numSteps:o,currentStep:Math.min(i-e.start,o)})))}_refresh(){this._request||(this._running=!0,this._request=kh.call(window,(()=>{this._update(),this._request=null,this._running&&this._refresh()})))}_update(t=Date.now()){let e=0;this._charts.forEach(((i,n)=>{if(!i.running||!i.items.length)return;const r=i.items;let o,s=r.length-1,a=!1;for(;s>=0;--s)o=r[s],o._active?(o._total>i.duration&&(i.duration=o._total),o.tick(t),a=!0):(r[s]=r[r.length-1],r.pop());a&&(n.draw(),this._notify(n,i,t,"progress")),r.length||(i.running=!1,this._notify(n,i,t,"complete"),i.initial=!1),e+=r.length})),this._lastDate=t,0===e&&(this._running=!1)}_getAnims(t){const e=this._charts;let i=e.get(t);return i||(i={running:!1,initial:!0,items:[],listeners:{complete:[],progress:[]}},e.set(t,i)),i}listen(t,e,i){this._getAnims(t).listeners[e].push(i)}add(t,e){e&&e.length&&this._getAnims(t).items.push(...e)}has(t){return this._getAnims(t).items.length>0}start(t){const e=this._charts.get(t);e&&(e.running=!0,e.start=Date.now(),e.duration=e.items.reduce(((t,e)=>Math.max(t,e._duration)),0),this._refresh())}running(t){if(!this._running)return!1;const e=this._charts.get(t);return!!(e&&e.running&&e.items.length)}stop(t){const e=this._charts.get(t);if(!e||!e.items.length)return;const i=e.items;let n=i.length-1;for(;n>=0;--n)i[n].cancel();e.items=[],this._notify(t,e,Date.now(),"complete")}remove(t){return this._charts.delete(t)}}var hd=new cd;const ud="transparent",dd={boolean:(t,e,i)=>i>.5?e:t,color(t,e,i){const n=jh(t||ud),r=n.valid&&jh(e||ud);return r&&r.valid?r.mix(n,i).hexString():e},number:(t,e,i)=>t+(e-t)*i};class fd{constructor(t,e,i,n){const r=e[i];n=bu([t.to,n,r,t.from]);const o=bu([t.from,r,n]);this._active=!0,this._fn=t.fn||dd[t.type||typeof o],this._easing=Lh[t.easing]||Lh.linear,this._start=Math.floor(Date.now()+(t.delay||0)),this._duration=this._total=Math.floor(t.duration),this._loop=!!t.loop,this._target=e,this._prop=i,this._from=o,this._to=n,this._promises=void 0}active(){return this._active}update(t,e,i){if(this._active){this._notify(!1);const n=this._target[this._prop],r=i-this._start,o=this._duration-r;this._start=i,this._duration=Math.floor(Math.max(o,t.duration)),this._total+=r,this._loop=!!t.loop,this._to=bu([t.to,e,n,t.from]),this._from=bu([t.from,n,e])}}cancel(){this._active&&(this.tick(Date.now()),this._active=!1,this._notify(!1))}tick(t){const e=t-this._start,i=this._duration,n=this._prop,r=this._from,o=this._loop,s=this._to;let a;if(this._active=r!==s&&(o||e<i),!this._active)return this._target[n]=s,void this._notify(!0);e<0?this._target[n]=r:(a=e/i%2,a=o&&a>1?2-a:a,a=this._easing(Math.min(1,Math.max(0,a))),this._target[n]=this._fn(r,s,a))}wait(){const t=this._promises||(this._promises=[]);return new Promise(((e,i)=>{t.push({res:e,rej:i})}))}_notify(t){const e=t?"res":"rej",i=this._promises||[];for(let t=0;t<i.length;t++)i[t][e]()}}class pd{constructor(t,e){this._chart=t,this._properties=new Map,this.configure(e)}configure(t){if(!Oc(t))return;const e=Object.keys(Xh.animation),i=this._properties;Object.getOwnPropertyNames(t).forEach((n=>{const r=t[n];if(!Oc(r))return;const o={};for(const t of e)o[t]=r[t];(Ec(r.properties)&&r.properties||[n]).forEach((t=>{t!==n&&i.has(t)||i.set(t,o)}))}))}_animateOptions(t,e){const i=e.options,n=function(t,e){if(!e)return;let i=t.options;if(i)return i.$shared&&(t.options=i=Object.assign({},i,{$shared:!1,$animations:{}})),i;t.options=e}(t,i);if(!n)return[];const r=this._createAnimations(n,i);return i.$shared&&function(t,e){const i=[],n=Object.keys(e);for(let e=0;e<n.length;e++){const r=t[n[e]];r&&r.active()&&i.push(r.wait())}return Promise.all(i)}(t.options.$animations,i).then((()=>{t.options=i}),(()=>{})),r}_createAnimations(t,e){const i=this._properties,n=[],r=t.$animations||(t.$animations={}),o=Object.keys(e),s=Date.now();let a;for(a=o.length-1;a>=0;--a){const l=o[a];if("$"===l.charAt(0))continue;if("options"===l){n.push(...this._animateOptions(t,e));continue}const c=e[l];let h=r[l];const u=i.get(l);if(h){if(u&&h.active()){h.update(u,c,s);continue}h.cancel()}u&&u.duration?(r[l]=h=new fd(u,t,l,c),n.push(h)):t[l]=c}return n}update(t,e){if(0===this._properties.size)return void Object.assign(t,e);const i=this._createAnimations(t,e);return i.length?(hd.add(this._chart,i),!0):void 0}}function gd(t,e){const i=t&&t.options||{},n=i.reverse,r=void 0===i.min?e:0,o=void 0===i.max?e:0;return{start:n?o:r,end:n?r:o}}function md(t,e){const i=[],n=t._getSortedDatasetMetas(e);let r,o;for(r=0,o=n.length;r<o;++r)i.push(n[r].index);return i}function yd(t,e,i,n={}){const r=t.keys,o="single"===n.mode;let s,a,l,c;if(null!==e){for(s=0,a=r.length;s<a;++s){if(l=+r[s],l===i){if(n.all)continue;break}c=t.values[l],Pc(c)&&(o||0===e||nh(e)===nh(c))&&(e+=c)}return e}}function bd(t,e){const i=t&&t.options.stacked;return i||void 0===i&&void 0!==e.stack}function vd(t,e,i){const n=t[e]||(t[e]={});return n[i]||(n[i]={})}function xd(t,e,i,n){for(const r of e.getMatchingVisibleMetas(n).reverse()){const e=t[r.index];if(i&&e>0||!i&&e<0)return r.index}return null}function _d(t,e){const{chart:i,_cachedMeta:n}=t,r=i._stacks||(i._stacks={}),{iScale:o,vScale:s,index:a}=n,l=o.axis,c=s.axis,h=function(t,e,i){return`${t.id}.${e.id}.${i.stack||i.type}`}(o,s,n),u=e.length;let d;for(let t=0;t<u;++t){const i=e[t],{[l]:o,[c]:u}=i;d=(i._stacks||(i._stacks={}))[c]=vd(r,h,o),d[a]=u,d._top=xd(d,s,!0,n.type),d._bottom=xd(d,s,!1,n.type),(d._visualValues||(d._visualValues={}))[a]=u}}function wd(t,e){const i=t.scales;return Object.keys(i).filter((t=>i[t].axis===e)).shift()}function Md(t,e){const i=t.controller.index,n=t.vScale&&t.vScale.axis;if(n){e=e||t._parsed;for(const t of e){const e=t._stacks;if(!e||void 0===e[n]||void 0===e[n][i])return;delete e[n][i],void 0!==e[n]._visualValues&&void 0!==e[n]._visualValues[i]&&delete e[n]._visualValues[i]}}}const kd=t=>"reset"===t||"none"===t,Sd=(t,e)=>e?t:Object.assign({},t);class Dd{static defaults={};static datasetElementType=null;static dataElementType=null;constructor(t,e){this.chart=t,this._ctx=t.ctx,this.index=e,this._cachedDataOpts={},this._cachedMeta=this.getMeta(),this._type=this._cachedMeta.type,this.options=void 0,this._parsing=!1,this._data=void 0,this._objectData=void 0,this._sharedOptions=void 0,this._drawStart=void 0,this._drawCount=void 0,this.enableOptionSharing=!1,this.supportsDecimation=!1,this.$context=void 0,this._syncList=[],this.datasetElementType=new.target.datasetElementType,this.dataElementType=new.target.dataElementType,this.initialize()}initialize(){const t=this._cachedMeta;this.configure(),this.linkScales(),t._stacked=bd(t.vScale,t),this.addElements(),this.options.fill&&!this.chart.isPluginEnabled("filler")&&console.warn("Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options")}updateIndex(t){this.index!==t&&Md(this._cachedMeta),this.index=t}linkScales(){const t=this.chart,e=this._cachedMeta,i=this.getDataset(),n=(t,e,i,n)=>"x"===t?e:"r"===t?n:i,r=e.xAxisID=Cc(i.xAxisID,wd(t,"x")),o=e.yAxisID=Cc(i.yAxisID,wd(t,"y")),s=e.rAxisID=Cc(i.rAxisID,wd(t,"r")),a=e.indexAxis,l=e.iAxisID=n(a,r,o,s),c=e.vAxisID=n(a,o,r,s);e.xScale=this.getScaleForId(r),e.yScale=this.getScaleForId(o),e.rScale=this.getScaleForId(s),e.iScale=this.getScaleForId(l),e.vScale=this.getScaleForId(c)}getDataset(){return this.chart.data.datasets[this.index]}getMeta(){return this.chart.getDatasetMeta(this.index)}getScaleForId(t){return this.chart.scales[t]}_getOtherScale(t){const e=this._cachedMeta;return t===e.iScale?e.vScale:e.iScale}reset(){this._update("reset")}_destroy(){const t=this._cachedMeta;this._data&&wh(this._data,this),t._stacked&&Md(t)}_dataCheck(){const t=this.getDataset(),e=t.data||(t.data=[]),i=this._data;if(Oc(e))this._data=function(t){const e=Object.keys(t),i=new Array(e.length);let n,r,o;for(n=0,r=e.length;n<r;++n)o=e[n],i[n]={x:o,y:t[o]};return i}(e);else if(i!==e){if(i){wh(i,this);const t=this._cachedMeta;Md(t),t._parsed=[]}e&&Object.isExtensible(e)&&function(t,e){t._chartjs?t._chartjs.listeners.push(e):(Object.defineProperty(t,"_chartjs",{configurable:!0,enumerable:!1,value:{listeners:[e]}}),_h.forEach((e=>{const i="_onData"+Vc(e),n=t[e];Object.defineProperty(t,e,{configurable:!0,enumerable:!1,value(...e){const r=n.apply(this,e);return t._chartjs.listeners.forEach((t=>{"function"==typeof t[i]&&t[i](...e)})),r}})})))}(e,this),this._syncList=[],this._data=e}}addElements(){const t=this._cachedMeta;this._dataCheck(),this.datasetElementType&&(t.dataset=new this.datasetElementType)}buildOrUpdateElements(t){const e=this._cachedMeta,i=this.getDataset();let n=!1;this._dataCheck();const r=e._stacked;e._stacked=bd(e.vScale,e),e.stack!==i.stack&&(n=!0,Md(e),e.stack=i.stack),this._resyncElements(t),(n||r!==e._stacked)&&_d(this,e._parsed)}configure(){const t=this.chart.config,e=t.datasetScopeKeys(this._type),i=t.getOptionScopes(this.getDataset(),e,!0);this.options=t.createResolver(i,this.getContext()),this._parsing=this.options.parsing,this._cachedDataOpts={}}parse(t,e){const{_cachedMeta:i,_data:n}=this,{iScale:r,_stacked:o}=i,s=r.axis;let a,l,c,h=0===t&&e===n.length||i._sorted,u=t>0&&i._parsed[t-1];if(!1===this._parsing)i._parsed=n,i._sorted=!0,c=n;else{c=Ec(n[t])?this.parseArrayData(i,n,t,e):Oc(n[t])?this.parseObjectData(i,n,t,e):this.parsePrimitiveData(i,n,t,e);const r=()=>null===l[s]||u&&l[s]<u[s];for(a=0;a<e;++a)i._parsed[a+t]=l=c[a],h&&(r()&&(h=!1),u=l);i._sorted=h}o&&_d(this,c)}parsePrimitiveData(t,e,i,n){const{iScale:r,vScale:o}=t,s=r.axis,a=o.axis,l=r.getLabels(),c=r===o,h=new Array(n);let u,d,f;for(u=0,d=n;u<d;++u)f=u+i,h[u]={[s]:c||r.parse(l[f],f),[a]:o.parse(e[f],f)};return h}parseArrayData(t,e,i,n){const{xScale:r,yScale:o}=t,s=new Array(n);let a,l,c,h;for(a=0,l=n;a<l;++a)c=a+i,h=e[c],s[a]={x:r.parse(h[0],c),y:o.parse(h[1],c)};return s}parseObjectData(t,e,i,n){const{xScale:r,yScale:o}=t,{xAxisKey:s="x",yAxisKey:a="y"}=this._parsing,l=new Array(n);let c,h,u,d;for(c=0,h=n;c<h;++c)u=c+i,d=e[u],l[c]={x:r.parse(Wc(d,s),u),y:o.parse(Wc(d,a),u)};return l}getParsed(t){return this._cachedMeta._parsed[t]}getDataElement(t){return this._cachedMeta.data[t]}applyStack(t,e,i){const n=this.chart,r=this._cachedMeta,o=e[t.axis];return yd({keys:md(n,!0),values:e._stacks[t.axis]._visualValues},o,r.index,{mode:i})}updateRangeFromParsed(t,e,i,n){const r=i[e.axis];let o=null===r?NaN:r;const s=n&&i._stacks[e.axis];n&&s&&(n.values=s,o=yd(n,r,this._cachedMeta.index)),t.min=Math.min(t.min,o),t.max=Math.max(t.max,o)}getMinMax(t,e){const i=this._cachedMeta,n=i._parsed,r=i._sorted&&t===i.iScale,o=n.length,s=this._getOtherScale(t),a=((t,e,i)=>t&&!e.hidden&&e._stacked&&{keys:md(i,!0),values:null})(e,i,this.chart),l={min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY},{min:c,max:h}=function(t){const{min:e,max:i,minDefined:n,maxDefined:r}=t.getUserBounds();return{min:n?e:Number.NEGATIVE_INFINITY,max:r?i:Number.POSITIVE_INFINITY}}(s);let u,d;function f(){d=n[u];const e=d[s.axis];return!Pc(d[t.axis])||c>e||h<e}for(u=0;u<o&&(f()||(this.updateRangeFromParsed(l,t,d,a),!r));++u);if(r)for(u=o-1;u>=0;--u)if(!f()){this.updateRangeFromParsed(l,t,d,a);break}return l}getAllParsedValues(t){const e=this._cachedMeta._parsed,i=[];let n,r,o;for(n=0,r=e.length;n<r;++n)o=e[n][t.axis],Pc(o)&&i.push(o);return i}getMaxOverflow(){return!1}getLabelAndValue(t){const e=this._cachedMeta,i=e.iScale,n=e.vScale,r=this.getParsed(t);return{label:i?""+i.getLabelForValue(r[i.axis]):"",value:n?""+n.getLabelForValue(r[n.axis]):""}}_update(t){const e=this._cachedMeta;this.update(t||"default"),e._clip=function(t){let e,i,n,r;return Oc(t)?(e=t.top,i=t.right,n=t.bottom,r=t.left):e=i=n=r=t,{top:e,right:i,bottom:n,left:r,disabled:!1===t}}(Cc(this.options.clip,function(t,e,i){if(!1===i)return!1;const n=gd(t,i),r=gd(e,i);return{top:r.end,right:n.end,bottom:r.start,left:n.start}}(e.xScale,e.yScale,this.getMaxOverflow())))}update(t){}draw(){const t=this._ctx,e=this.chart,i=this._cachedMeta,n=i.data||[],r=e.chartArea,o=[],s=this._drawStart||0,a=this._drawCount||n.length-s,l=this.options.drawActiveElementsOnTop;let c;for(i.dataset&&i.dataset.draw(t,r,s,a),c=s;c<s+a;++c){const e=n[c];e.hidden||(e.active&&l?o.push(e):e.draw(t,r))}for(c=0;c<o.length;++c)o[c].draw(t,r)}getStyle(t,e){const i=e?"active":"default";return void 0===t&&this._cachedMeta.dataset?this.resolveDatasetElementOptions(i):this.resolveDataElementOptions(t||0,i)}getContext(t,e,i){const n=this.getDataset();let r;if(t>=0&&t<this._cachedMeta.data.length){const e=this._cachedMeta.data[t];r=e.$context||(e.$context=function(t,e,i){return vu(t,{active:!1,dataIndex:e,parsed:void 0,raw:void 0,element:i,index:e,mode:"default",type:"data"})}(this.getContext(),t,e)),r.parsed=this.getParsed(t),r.raw=n.data[t],r.index=r.dataIndex=t}else r=this.$context||(this.$context=function(t,e){return vu(t,{active:!1,dataset:void 0,datasetIndex:e,index:e,mode:"default",type:"dataset"})}(this.chart.getContext(),this.index)),r.dataset=n,r.index=r.datasetIndex=this.index;return r.active=!!e,r.mode=i,r}resolveDatasetElementOptions(t){return this._resolveElementOptions(this.datasetElementType.id,t)}resolveDataElementOptions(t,e){return this._resolveElementOptions(this.dataElementType.id,e,t)}_resolveElementOptions(t,e="default",i){const n="active"===e,r=this._cachedDataOpts,o=t+"-"+e,s=r[o],a=this.enableOptionSharing&&$c(i);if(s)return Sd(s,a);const l=this.chart.config,c=l.datasetElementScopeKeys(this._type,t),h=n?[`${t}Hover`,"hover",t,""]:[t,""],u=l.getOptionScopes(this.getDataset(),c),d=Object.keys(Xh.elements[t]),f=l.resolveNamedOptions(u,d,(()=>this.getContext(i,n,e)),h);return f.$shared&&(f.$shared=a,r[o]=Object.freeze(Sd(f,a))),f}_resolveAnimations(t,e,i){const n=this.chart,r=this._cachedDataOpts,o=`animation-${e}`,s=r[o];if(s)return s;let a;if(!1!==n.options.animation){const n=this.chart.config,r=n.datasetAnimationScopeKeys(this._type,e),o=n.getOptionScopes(this.getDataset(),r);a=n.createResolver(o,this.getContext(t,i,e))}const l=new pd(n,a&&a.animations);return a&&a._cacheable&&(r[o]=Object.freeze(l)),l}getSharedOptions(t){if(t.$shared)return this._sharedOptions||(this._sharedOptions=Object.assign({},t))}includeOptions(t,e){return!e||kd(t)||this.chart._animationsDisabled}_getSharedOptions(t,e){const i=this.resolveDataElementOptions(t,e),n=this._sharedOptions,r=this.getSharedOptions(i),o=this.includeOptions(e,r)||r!==n;return this.updateSharedOptions(r,e,i),{sharedOptions:r,includeOptions:o}}updateElement(t,e,i,n){kd(n)?Object.assign(t,i):this._resolveAnimations(e,n).update(t,i)}updateSharedOptions(t,e,i){t&&!kd(e)&&this._resolveAnimations(void 0,e).update(t,i)}_setStyle(t,e,i,n){t.active=n;const r=this.getStyle(e,n);this._resolveAnimations(e,i,n).update(t,{options:!n&&this.getSharedOptions(r)||r})}removeHoverStyle(t,e,i){this._setStyle(t,i,"active",!1)}setHoverStyle(t,e,i){this._setStyle(t,i,"active",!0)}_removeDatasetHoverStyle(){const t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!1)}_setDatasetHoverStyle(){const t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!0)}_resyncElements(t){const e=this._data,i=this._cachedMeta.data;for(const[t,e,i]of this._syncList)this[t](e,i);this._syncList=[];const n=i.length,r=e.length,o=Math.min(r,n);o&&this.parse(0,o),r>n?this._insertElements(n,r-n,t):r<n&&this._removeElements(r,n-r)}_insertElements(t,e,i=!0){const n=this._cachedMeta,r=n.data,o=t+e;let s;const a=t=>{for(t.length+=e,s=t.length-1;s>=o;s--)t[s]=t[s-e]};for(a(r),s=t;s<o;++s)r[s]=new this.dataElementType;this._parsing&&a(n._parsed),this.parse(t,e),i&&this.updateElements(r,t,e,"reset")}updateElements(t,e,i,n){}_removeElements(t,e){const i=this._cachedMeta;if(this._parsing){const n=i._parsed.splice(t,e);i._stacked&&Md(i,n)}i.data.splice(t,e)}_sync(t){if(this._parsing)this._syncList.push(t);else{const[e,i,n]=t;this[e](i,n)}this.chart._dataChanges.push([this.index,...t])}_onDataPush(){const t=arguments.length;this._sync(["_insertElements",this.getDataset().data.length-t,t])}_onDataPop(){this._sync(["_removeElements",this._cachedMeta.data.length-1,1])}_onDataShift(){this._sync(["_removeElements",0,1])}_onDataSplice(t,e){e&&this._sync(["_removeElements",t,e]);const i=arguments.length-2;i&&this._sync(["_insertElements",t,i])}_onDataUnshift(){this._sync(["_insertElements",0,arguments.length])}}function Ed(t){const e=t.iScale,i=function(t,e){if(!t._cache.$bar){const i=t.getMatchingVisibleMetas(e);let n=[];for(let e=0,r=i.length;e<r;e++)n=n.concat(i[e].controller.getAllParsedValues(t));t._cache.$bar=Mh(n.sort(((t,e)=>t-e)))}return t._cache.$bar}(e,t.type);let n,r,o,s,a=e._length;const l=()=>{32767!==o&&-32768!==o&&($c(s)&&(a=Math.min(a,Math.abs(o-s)||a)),s=o)};for(n=0,r=i.length;n<r;++n)o=e.getPixelForValue(i[n]),l();for(s=void 0,n=0,r=e.ticks.length;n<r;++n)o=e.getPixelForTick(n),l();return a}function Od(t,e,i,n){return Ec(t)?function(t,e,i,n){const r=i.parse(t[0],n),o=i.parse(t[1],n),s=Math.min(r,o),a=Math.max(r,o);let l=s,c=a;Math.abs(s)>Math.abs(a)&&(l=a,c=s),e[i.axis]=c,e._custom={barStart:l,barEnd:c,start:r,end:o,min:s,max:a}}(t,e,i,n):e[i.axis]=i.parse(t,n),e}function Pd(t,e,i,n){const r=t.iScale,o=t.vScale,s=r.getLabels(),a=r===o,l=[];let c,h,u,d;for(c=i,h=i+n;c<h;++c)d=e[c],u={},u[r.axis]=a||r.parse(s[c],c),l.push(Od(d,u,o,c));return l}function Ad(t){return t&&void 0!==t.barStart&&void 0!==t.barEnd}function Cd(t,e,i,n){let r=e.borderSkipped;const o={};if(!r)return void(t.borderSkipped=o);if(!0===r)return void(t.borderSkipped={top:!0,right:!0,bottom:!0,left:!0});const{start:s,end:a,reverse:l,top:c,bottom:h}=function(t){let e,i,n,r,o;return t.horizontal?(e=t.base>t.x,i="left",n="right"):(e=t.base<t.y,i="bottom",n="top"),e?(r="end",o="start"):(r="start",o="end"),{start:i,end:n,reverse:e,top:r,bottom:o}}(t);"middle"===r&&i&&(t.enableBorderRadius=!0,(i._top||0)===n?r=c:(i._bottom||0)===n?r=h:(o[Td(h,s,a,l)]=!0,r=c)),o[Td(r,s,a,l)]=!0,t.borderSkipped=o}function Td(t,e,i,n){var r,o,s;return n?(s=i,t=Ld(t=(r=t)===(o=e)?s:r===s?o:r,i,e)):t=Ld(t,e,i),t}function Ld(t,e,i){return"start"===t?e:"end"===t?i:t}function Rd(t,{inflateAmount:e},i){t.inflateAmount="auto"===e?1===i?.33:0:e}class jd extends Dd{static id="doughnut";static defaults={datasetElementType:!1,dataElementType:"arc",animation:{animateRotate:!0,animateScale:!1},animations:{numbers:{type:"number",properties:["circumference","endAngle","innerRadius","outerRadius","startAngle","x","y","offset","borderWidth","spacing"]}},cutout:"50%",rotation:0,circumference:360,radius:"100%",spacing:0,indexAxis:"r"};static descriptors={_scriptable:t=>"spacing"!==t,_indexable:t=>"spacing"!==t&&!t.startsWith("borderDash")&&!t.startsWith("hoverBorderDash")};static overrides={aspectRatio:1,plugins:{legend:{labels:{generateLabels(t){const e=t.data;if(e.labels.length&&e.datasets.length){const{labels:{pointStyle:i,color:n}}=t.legend.options;return e.labels.map(((e,r)=>{const o=t.getDatasetMeta(0).controller.getStyle(r);return{text:e,fillStyle:o.backgroundColor,strokeStyle:o.borderColor,fontColor:n,lineWidth:o.borderWidth,pointStyle:i,hidden:!t.getDataVisibility(r),index:r}}))}return[]}},onClick(t,e,i){i.chart.toggleDataVisibility(e.index),i.chart.update()}}}};constructor(t,e){super(t,e),this.enableOptionSharing=!0,this.innerRadius=void 0,this.outerRadius=void 0,this.offsetX=void 0,this.offsetY=void 0}linkScales(){}parse(t,e){const i=this.getDataset().data,n=this._cachedMeta;if(!1===this._parsing)n._parsed=i;else{let r,o,s=t=>+i[t];if(Oc(i[t])){const{key:t="value"}=this._parsing;s=e=>+Wc(i[e],t)}for(r=t,o=t+e;r<o;++r)n._parsed[r]=s(r)}}_getRotation(){return lh(this.options.rotation-90)}_getCircumference(){return lh(this.options.circumference)}_getRotationExtents(){let t=qc,e=-qc;for(let i=0;i<this.chart.data.datasets.length;++i)if(this.chart.isDatasetVisible(i)&&this.chart.getDatasetMeta(i).type===this._type){const n=this.chart.getDatasetMeta(i).controller,r=n._getRotation(),o=n._getCircumference();t=Math.min(t,r),e=Math.max(e,r+o)}return{rotation:t,circumference:e-t}}update(t){const e=this.chart,{chartArea:i}=e,n=this._cachedMeta,r=n.data,o=this.getMaxBorderWidth()+this.getMaxOffset(r)+this.options.spacing,s=Math.max((Math.min(i.width,i.height)-o)/2,0),a=Math.min(((t,e)=>"string"==typeof t&&t.endsWith("%")?parseFloat(t)/100:+t/e)(this.options.cutout,s),1),l=this._getRingWeight(this.index),{circumference:c,rotation:h}=this._getRotationExtents(),{ratioX:u,ratioY:d,offsetX:f,offsetY:p}=function(t,e,i){let n=1,r=1,o=0,s=0;if(e<qc){const a=t,l=a+e,c=Math.cos(a),h=Math.sin(a),u=Math.cos(l),d=Math.sin(l),f=(t,e,n)=>gh(t,a,l,!0)?1:Math.max(e,e*i,n,n*i),p=(t,e,n)=>gh(t,a,l,!0)?-1:Math.min(e,e*i,n,n*i),g=f(0,c,u),m=f(Jc,h,d),y=p(Xc,c,u),b=p(Xc+Jc,h,d);n=(g-y)/2,r=(m-b)/2,o=-(g+y)/2,s=-(m+b)/2}return{ratioX:n,ratioY:r,offsetX:o,offsetY:s}}(h,c,a),g=(i.width-o)/u,m=(i.height-o)/d,y=Math.max(Math.min(g,m)/2,0),b=Tc(this.options.radius,y),v=(b-Math.max(b*a,0))/this._getVisibleDatasetWeightTotal();this.offsetX=f*b,this.offsetY=p*b,n.total=this.calculateTotal(),this.outerRadius=b-v*this._getRingWeightOffset(this.index),this.innerRadius=Math.max(this.outerRadius-v*l,0),this.updateElements(r,0,r.length,t)}_circumference(t,e){const i=this.options,n=this._cachedMeta,r=this._getCircumference();return e&&i.animation.animateRotate||!this.chart.getDataVisibility(t)||null===n._parsed[t]||n.data[t].hidden?0:this.calculateCircumference(n._parsed[t]*r/qc)}updateElements(t,e,i,n){const r="reset"===n,o=this.chart,s=o.chartArea,a=o.options.animation,l=(s.left+s.right)/2,c=(s.top+s.bottom)/2,h=r&&a.animateScale,u=h?0:this.innerRadius,d=h?0:this.outerRadius,{sharedOptions:f,includeOptions:p}=this._getSharedOptions(e,n);let g,m=this._getRotation();for(g=0;g<e;++g)m+=this._circumference(g,r);for(g=e;g<e+i;++g){const e=this._circumference(g,r),i=t[g],o={x:l+this.offsetX,y:c+this.offsetY,startAngle:m,endAngle:m+e,circumference:e,outerRadius:d,innerRadius:u};p&&(o.options=f||this.resolveDataElementOptions(g,i.active?"active":n)),m+=e,this.updateElement(i,g,o,n)}}calculateTotal(){const t=this._cachedMeta,e=t.data;let i,n=0;for(i=0;i<e.length;i++){const r=t._parsed[i];null===r||isNaN(r)||!this.chart.getDataVisibility(i)||e[i].hidden||(n+=Math.abs(r))}return n}calculateCircumference(t){const e=this._cachedMeta.total;return e>0&&!isNaN(t)?qc*(Math.abs(t)/e):0}getLabelAndValue(t){const e=this._cachedMeta,i=this.chart,n=i.data.labels||[],r=Uh(e._parsed[t],i.options.locale);return{label:n[t]||"",value:r}}getMaxBorderWidth(t){let e=0;const i=this.chart;let n,r,o,s,a;if(!t)for(n=0,r=i.data.datasets.length;n<r;++n)if(i.isDatasetVisible(n)){o=i.getDatasetMeta(n),t=o.data,s=o.controller;break}if(!t)return 0;for(n=0,r=t.length;n<r;++n)a=s.resolveDataElementOptions(n),"inner"!==a.borderAlign&&(e=Math.max(e,a.borderWidth||0,a.hoverBorderWidth||0));return e}getMaxOffset(t){let e=0;for(let i=0,n=t.length;i<n;++i){const t=this.resolveDataElementOptions(i);e=Math.max(e,t.offset||0,t.hoverOffset||0)}return e}_getRingWeightOffset(t){let e=0;for(let i=0;i<t;++i)this.chart.isDatasetVisible(i)&&(e+=this._getRingWeight(i));return e}_getRingWeight(t){return Math.max(Cc(this.chart.data.datasets[t].weight,1),0)}_getVisibleDatasetWeightTotal(){return this._getRingWeightOffset(this.chart.data.datasets.length)||1}}class zd extends Dd{static id="polarArea";static defaults={dataElementType:"arc",animation:{animateRotate:!0,animateScale:!0},animations:{numbers:{type:"number",properties:["x","y","startAngle","endAngle","innerRadius","outerRadius"]}},indexAxis:"r",startAngle:0};static overrides={aspectRatio:1,plugins:{legend:{labels:{generateLabels(t){const e=t.data;if(e.labels.length&&e.datasets.length){const{labels:{pointStyle:i,color:n}}=t.legend.options;return e.labels.map(((e,r)=>{const o=t.getDatasetMeta(0).controller.getStyle(r);return{text:e,fillStyle:o.backgroundColor,strokeStyle:o.borderColor,fontColor:n,lineWidth:o.borderWidth,pointStyle:i,hidden:!t.getDataVisibility(r),index:r}}))}return[]}},onClick(t,e,i){i.chart.toggleDataVisibility(e.index),i.chart.update()}}},scales:{r:{type:"radialLinear",angleLines:{display:!1},beginAtZero:!0,grid:{circular:!0},pointLabels:{display:!1},startAngle:0}}};constructor(t,e){super(t,e),this.innerRadius=void 0,this.outerRadius=void 0}getLabelAndValue(t){const e=this._cachedMeta,i=this.chart,n=i.data.labels||[],r=Uh(e._parsed[t].r,i.options.locale);return{label:n[t]||"",value:r}}parseObjectData(t,e,i,n){return Lu.bind(this)(t,e,i,n)}update(t){const e=this._cachedMeta.data;this._updateRadius(),this.updateElements(e,0,e.length,t)}getMinMax(){const t=this._cachedMeta,e={min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY};return t.data.forEach(((t,i)=>{const n=this.getParsed(i).r;!isNaN(n)&&this.chart.getDataVisibility(i)&&(n<e.min&&(e.min=n),n>e.max&&(e.max=n))})),e}_updateRadius(){const t=this.chart,e=t.chartArea,i=t.options,n=Math.min(e.right-e.left,e.bottom-e.top),r=Math.max(n/2,0),o=(r-Math.max(i.cutoutPercentage?r/100*i.cutoutPercentage:1,0))/t.getVisibleDatasetCount();this.outerRadius=r-o*this.index,this.innerRadius=this.outerRadius-o}updateElements(t,e,i,n){const r="reset"===n,o=this.chart,s=o.options.animation,a=this._cachedMeta.rScale,l=a.xCenter,c=a.yCenter,h=a.getIndexAngle(0)-.5*Xc;let u,d=h;const f=360/this.countVisibleElements();for(u=0;u<e;++u)d+=this._computeAngle(u,n,f);for(u=e;u<e+i;u++){const e=t[u];let i=d,p=d+this._computeAngle(u,n,f),g=o.getDataVisibility(u)?a.getDistanceFromCenterForValue(this.getParsed(u).r):0;d=p,r&&(s.animateScale&&(g=0),s.animateRotate&&(i=p=h));const m={x:l,y:c,innerRadius:0,outerRadius:g,startAngle:i,endAngle:p,options:this.resolveDataElementOptions(u,e.active?"active":n)};this.updateElement(e,u,m,n)}}countVisibleElements(){const t=this._cachedMeta;let e=0;return t.data.forEach(((t,i)=>{!isNaN(this.getParsed(i).r)&&this.chart.getDataVisibility(i)&&e++})),e}_computeAngle(t,e,i){return this.chart.getDataVisibility(t)?lh(this.resolveDataElementOptions(t,e).angle||i):0}}var Nd=Object.freeze({__proto__:null,BarController:class extends Dd{static id="bar";static defaults={datasetElementType:!1,dataElementType:"bar",categoryPercentage:.8,barPercentage:.9,grouped:!0,animations:{numbers:{type:"number",properties:["x","y","base","width","height"]}}};static overrides={scales:{_index_:{type:"category",offset:!0,grid:{offset:!0}},_value_:{type:"linear",beginAtZero:!0}}};parsePrimitiveData(t,e,i,n){return Pd(t,e,i,n)}parseArrayData(t,e,i,n){return Pd(t,e,i,n)}parseObjectData(t,e,i,n){const{iScale:r,vScale:o}=t,{xAxisKey:s="x",yAxisKey:a="y"}=this._parsing,l="x"===r.axis?s:a,c="x"===o.axis?s:a,h=[];let u,d,f,p;for(u=i,d=i+n;u<d;++u)p=e[u],f={},f[r.axis]=r.parse(Wc(p,l),u),h.push(Od(Wc(p,c),f,o,u));return h}updateRangeFromParsed(t,e,i,n){super.updateRangeFromParsed(t,e,i,n);const r=i._custom;r&&e===this._cachedMeta.vScale&&(t.min=Math.min(t.min,r.min),t.max=Math.max(t.max,r.max))}getMaxOverflow(){return 0}getLabelAndValue(t){const e=this._cachedMeta,{iScale:i,vScale:n}=e,r=this.getParsed(t),o=r._custom,s=Ad(o)?"["+o.start+", "+o.end+"]":""+n.getLabelForValue(r[n.axis]);return{label:""+i.getLabelForValue(r[i.axis]),value:s}}initialize(){this.enableOptionSharing=!0,super.initialize(),this._cachedMeta.stack=this.getDataset().stack}update(t){const e=this._cachedMeta;this.updateElements(e.data,0,e.data.length,t)}updateElements(t,e,i,n){const r="reset"===n,{index:o,_cachedMeta:{vScale:s}}=this,a=s.getBasePixel(),l=s.isHorizontal(),c=this._getRuler(),{sharedOptions:h,includeOptions:u}=this._getSharedOptions(e,n);for(let d=e;d<e+i;d++){const e=this.getParsed(d),i=r||Dc(e[s.axis])?{base:a,head:a}:this._calculateBarValuePixels(d),f=this._calculateBarIndexPixels(d,c),p=(e._stacks||{})[s.axis],g={horizontal:l,base:i.base,enableBorderRadius:!p||Ad(e._custom)||o===p._top||o===p._bottom,x:l?i.head:f.center,y:l?f.center:i.head,height:l?f.size:Math.abs(i.size),width:l?Math.abs(i.size):f.size};u&&(g.options=h||this.resolveDataElementOptions(d,t[d].active?"active":n));const m=g.options||t[d].options;Cd(g,m,p,o),Rd(g,m,c.ratio),this.updateElement(t[d],d,g,n)}}_getStacks(t,e){const{iScale:i}=this._cachedMeta,n=i.getMatchingVisibleMetas(this._type).filter((t=>t.controller.options.grouped)),r=i.options.stacked,o=[],s=t=>{const i=t.controller.getParsed(e),n=i&&i[t.vScale.axis];if(Dc(n)||isNaN(n))return!0};for(const i of n)if((void 0===e||!s(i))&&((!1===r||-1===o.indexOf(i.stack)||void 0===r&&void 0===i.stack)&&o.push(i.stack),i.index===t))break;return o.length||o.push(void 0),o}_getStackCount(t){return this._getStacks(void 0,t).length}_getStackIndex(t,e,i){const n=this._getStacks(t,i),r=void 0!==e?n.indexOf(e):-1;return-1===r?n.length-1:r}_getRuler(){const t=this.options,e=this._cachedMeta,i=e.iScale,n=[];let r,o;for(r=0,o=e.data.length;r<o;++r)n.push(i.getPixelForValue(this.getParsed(r)[i.axis],r));const s=t.barThickness;return{min:s||Ed(e),pixels:n,start:i._startPixel,end:i._endPixel,stackCount:this._getStackCount(),scale:i,grouped:t.grouped,ratio:s?1:t.categoryPercentage*t.barPercentage}}_calculateBarValuePixels(t){const{_cachedMeta:{vScale:e,_stacked:i,index:n},options:{base:r,minBarLength:o}}=this,s=r||0,a=this.getParsed(t),l=a._custom,c=Ad(l);let h,u,d=a[e.axis],f=0,p=i?this.applyStack(e,a,i):d;p!==d&&(f=p-d,p=d),c&&(d=l.barStart,p=l.barEnd-l.barStart,0!==d&&nh(d)!==nh(l.barEnd)&&(f=0),f+=d);const g=Dc(r)||c?f:r;let m=e.getPixelForValue(g);if(h=this.chart.getDataVisibility(t)?e.getPixelForValue(f+p):m,u=h-m,Math.abs(u)<o){u=function(t,e,i){return 0!==t?nh(t):(e.isHorizontal()?1:-1)*(e.min>=i?1:-1)}(u,e,s)*o,d===s&&(m-=u/2);const t=e.getPixelForDecimal(0),r=e.getPixelForDecimal(1),l=Math.min(t,r),f=Math.max(t,r);m=Math.max(Math.min(m,f),l),h=m+u,i&&!c&&(a._stacks[e.axis]._visualValues[n]=e.getValueForPixel(h)-e.getValueForPixel(m))}if(m===e.getPixelForValue(s)){const t=nh(u)*e.getLineWidthForValue(s)/2;m+=t,u-=t}return{size:u,base:m,head:h,center:h+u/2}}_calculateBarIndexPixels(t,e){const i=e.scale,n=this.options,r=n.skipNull,o=Cc(n.maxBarThickness,1/0);let s,a;if(e.grouped){const i=r?this._getStackCount(t):e.stackCount,l="flex"===n.barThickness?function(t,e,i,n){const r=e.pixels,o=r[t];let s=t>0?r[t-1]:null,a=t<r.length-1?r[t+1]:null;const l=i.categoryPercentage;null===s&&(s=o-(null===a?e.end-e.start:a-o)),null===a&&(a=o+o-s);const c=o-(o-Math.min(s,a))/2*l;return{chunk:Math.abs(a-s)/2*l/n,ratio:i.barPercentage,start:c}}(t,e,n,i):function(t,e,i,n){const r=i.barThickness;let o,s;return Dc(r)?(o=e.min*i.categoryPercentage,s=i.barPercentage):(o=r*n,s=1),{chunk:o/n,ratio:s,start:e.pixels[t]-o/2}}(t,e,n,i),c=this._getStackIndex(this.index,this._cachedMeta.stack,r?t:void 0);s=l.start+l.chunk*c+l.chunk/2,a=Math.min(o,l.chunk*l.ratio)}else s=i.getPixelForValue(this.getParsed(t)[i.axis],t),a=Math.min(o,e.min*e.ratio);return{base:s-a/2,head:s+a/2,center:s,size:a}}draw(){const t=this._cachedMeta,e=t.vScale,i=t.data,n=i.length;let r=0;for(;r<n;++r)null!==this.getParsed(r)[e.axis]&&i[r].draw(this._ctx)}},BubbleController:class extends Dd{static id="bubble";static defaults={datasetElementType:!1,dataElementType:"point",animations:{numbers:{type:"number",properties:["x","y","borderWidth","radius"]}}};static overrides={scales:{x:{type:"linear"},y:{type:"linear"}}};initialize(){this.enableOptionSharing=!0,super.initialize()}parsePrimitiveData(t,e,i,n){const r=super.parsePrimitiveData(t,e,i,n);for(let t=0;t<r.length;t++)r[t]._custom=this.resolveDataElementOptions(t+i).radius;return r}parseArrayData(t,e,i,n){const r=super.parseArrayData(t,e,i,n);for(let t=0;t<r.length;t++){const n=e[i+t];r[t]._custom=Cc(n[2],this.resolveDataElementOptions(t+i).radius)}return r}parseObjectData(t,e,i,n){const r=super.parseObjectData(t,e,i,n);for(let t=0;t<r.length;t++){const n=e[i+t];r[t]._custom=Cc(n&&n.r&&+n.r,this.resolveDataElementOptions(t+i).radius)}return r}getMaxOverflow(){const t=this._cachedMeta.data;let e=0;for(let i=t.length-1;i>=0;--i)e=Math.max(e,t[i].size(this.resolveDataElementOptions(i))/2);return e>0&&e}getLabelAndValue(t){const e=this._cachedMeta,i=this.chart.data.labels||[],{xScale:n,yScale:r}=e,o=this.getParsed(t),s=n.getLabelForValue(o.x),a=r.getLabelForValue(o.y),l=o._custom;return{label:i[t]||"",value:"("+s+", "+a+(l?", "+l:"")+")"}}update(t){const e=this._cachedMeta.data;this.updateElements(e,0,e.length,t)}updateElements(t,e,i,n){const r="reset"===n,{iScale:o,vScale:s}=this._cachedMeta,{sharedOptions:a,includeOptions:l}=this._getSharedOptions(e,n),c=o.axis,h=s.axis;for(let u=e;u<e+i;u++){const e=t[u],i=!r&&this.getParsed(u),d={},f=d[c]=r?o.getPixelForDecimal(.5):o.getPixelForValue(i[c]),p=d[h]=r?s.getBasePixel():s.getPixelForValue(i[h]);d.skip=isNaN(f)||isNaN(p),l&&(d.options=a||this.resolveDataElementOptions(u,e.active?"active":n),r&&(d.options.radius=0)),this.updateElement(e,u,d,n)}}resolveDataElementOptions(t,e){const i=this.getParsed(t);let n=super.resolveDataElementOptions(t,e);n.$shared&&(n=Object.assign({},n,{$shared:!1}));const r=n.radius;return"active"!==e&&(n.radius=0),n.radius+=Cc(i&&i._custom,r),n}},DoughnutController:jd,LineController:class extends Dd{static id="line";static defaults={datasetElementType:"line",dataElementType:"point",showLine:!0,spanGaps:!1};static overrides={scales:{_index_:{type:"category"},_value_:{type:"linear"}}};initialize(){this.enableOptionSharing=!0,this.supportsDecimation=!0,super.initialize()}update(t){const e=this._cachedMeta,{dataset:i,data:n=[],_dataset:r}=e,o=this.chart._animationsDisabled;let{start:s,count:a}=Oh(e,n,o);this._drawStart=s,this._drawCount=a,Ph(e)&&(s=0,a=n.length),i._chart=this.chart,i._datasetIndex=this.index,i._decimated=!!r._decimated,i.points=n.slice(Math.max(this._drawStart-1,0),this._drawStart+this._drawCount);const l=this.resolveDatasetElementOptions(t);this.options.showLine||(l.borderWidth=0),l.segment=this.options.segment,this.updateElement(i,void 0,{animated:!o,options:l},t),this.updateElements(n,s,a,t)}updateElements(t,e,i,n){const r="reset"===n,{iScale:o,vScale:s,_stacked:a,_dataset:l}=this._cachedMeta,{sharedOptions:c,includeOptions:h}=this._getSharedOptions(e,n),u=o.axis,d=s.axis,{spanGaps:f,segment:p}=this.options,g=sh(f)?f:Number.POSITIVE_INFINITY,m=this.chart._animationsDisabled||r||"none"===n,y=e+i,b=t.length;let v=e>0&&this.getParsed(e-1);for(let i=0;i<b;++i){const f=t[i],b=m?f:{};if(i<e||i>=y){b.skip=!0;continue}const x=this.getParsed(i),_=Dc(x[d]),w=b[u]=o.getPixelForValue(x[u],i),M=b[d]=r||_?s.getBasePixel():s.getPixelForValue(a?this.applyStack(s,x,a):x[d],i);b.skip=isNaN(w)||isNaN(M)||_,b.stop=i>0&&Math.abs(x[u]-v[u])>g,p&&(b.parsed=x,b.raw=l.data[i]),h&&(b.options=c||this.resolveDataElementOptions(i,f.active?"active":n)),m||this.updateElement(f,i,b,n),v=x}}getMaxOverflow(){const t=this._cachedMeta,e=t.dataset,i=e.options&&e.options.borderWidth||0,n=t.data||[];if(!n.length)return i;const r=n[0].size(this.resolveDataElementOptions(0)),o=n[n.length-1].size(this.resolveDataElementOptions(n.length-1));return Math.max(i,r,o)/2}draw(){const t=this._cachedMeta;t.dataset.updateControlPoints(this.chart.chartArea,t.iScale.axis),super.draw()}},PieController:class extends jd{static id="pie";static defaults={cutout:0,rotation:0,circumference:360,radius:"100%"}},PolarAreaController:zd,RadarController:class extends Dd{static id="radar";static defaults={datasetElementType:"line",dataElementType:"point",indexAxis:"r",showLine:!0,elements:{line:{fill:"start"}}};static overrides={aspectRatio:1,scales:{r:{type:"radialLinear"}}};getLabelAndValue(t){const e=this._cachedMeta.vScale,i=this.getParsed(t);return{label:e.getLabels()[t],value:""+e.getLabelForValue(i[e.axis])}}parseObjectData(t,e,i,n){return Lu.bind(this)(t,e,i,n)}update(t){const e=this._cachedMeta,i=e.dataset,n=e.data||[],r=e.iScale.getLabels();if(i.points=n,"resize"!==t){const e=this.resolveDatasetElementOptions(t);this.options.showLine||(e.borderWidth=0);const o={_loop:!0,_fullLoop:r.length===n.length,options:e};this.updateElement(i,void 0,o,t)}this.updateElements(n,0,n.length,t)}updateElements(t,e,i,n){const r=this._cachedMeta.rScale,o="reset"===n;for(let s=e;s<e+i;s++){const e=t[s],i=this.resolveDataElementOptions(s,e.active?"active":n),a=r.getPointPositionForValue(s,this.getParsed(s).r),l=o?r.xCenter:a.x,c=o?r.yCenter:a.y,h={x:l,y:c,angle:a.angle,skip:isNaN(l)||isNaN(c),options:i};this.updateElement(e,s,h,n)}}},ScatterController:class extends Dd{static id="scatter";static defaults={datasetElementType:!1,dataElementType:"point",showLine:!1,fill:!1};static overrides={interaction:{mode:"point"},scales:{x:{type:"linear"},y:{type:"linear"}}};getLabelAndValue(t){const e=this._cachedMeta,i=this.chart.data.labels||[],{xScale:n,yScale:r}=e,o=this.getParsed(t),s=n.getLabelForValue(o.x),a=r.getLabelForValue(o.y);return{label:i[t]||"",value:"("+s+", "+a+")"}}update(t){const e=this._cachedMeta,{data:i=[]}=e,n=this.chart._animationsDisabled;let{start:r,count:o}=Oh(e,i,n);if(this._drawStart=r,this._drawCount=o,Ph(e)&&(r=0,o=i.length),this.options.showLine){this.datasetElementType||this.addElements();const{dataset:r,_dataset:o}=e;r._chart=this.chart,r._datasetIndex=this.index,r._decimated=!!o._decimated,r.points=i;const s=this.resolveDatasetElementOptions(t);s.segment=this.options.segment,this.updateElement(r,void 0,{animated:!n,options:s},t)}else this.datasetElementType&&(delete e.dataset,this.datasetElementType=!1);this.updateElements(i,r,o,t)}addElements(){const{showLine:t}=this.options;!this.datasetElementType&&t&&(this.datasetElementType=this.chart.registry.getElement("line")),super.addElements()}updateElements(t,e,i,n){const r="reset"===n,{iScale:o,vScale:s,_stacked:a,_dataset:l}=this._cachedMeta,c=this.resolveDataElementOptions(e,n),h=this.getSharedOptions(c),u=this.includeOptions(n,h),d=o.axis,f=s.axis,{spanGaps:p,segment:g}=this.options,m=sh(p)?p:Number.POSITIVE_INFINITY,y=this.chart._animationsDisabled||r||"none"===n;let b=e>0&&this.getParsed(e-1);for(let c=e;c<e+i;++c){const e=t[c],i=this.getParsed(c),p=y?e:{},v=Dc(i[f]),x=p[d]=o.getPixelForValue(i[d],c),_=p[f]=r||v?s.getBasePixel():s.getPixelForValue(a?this.applyStack(s,i,a):i[f],c);p.skip=isNaN(x)||isNaN(_)||v,p.stop=c>0&&Math.abs(i[d]-b[d])>m,g&&(p.parsed=i,p.raw=l.data[c]),u&&(p.options=h||this.resolveDataElementOptions(c,e.active?"active":n)),y||this.updateElement(e,c,p,n),b=i}this.updateSharedOptions(h,n,c)}getMaxOverflow(){const t=this._cachedMeta,e=t.data||[];if(!this.options.showLine){let t=0;for(let i=e.length-1;i>=0;--i)t=Math.max(t,e[i].size(this.resolveDataElementOptions(i))/2);return t>0&&t}const i=t.dataset,n=i.options&&i.options.borderWidth||0;if(!e.length)return n;const r=e[0].size(this.resolveDataElementOptions(0)),o=e[e.length-1].size(this.resolveDataElementOptions(e.length-1));return Math.max(n,r,o)/2}}});function Id(){throw new Error("This method is not implemented: Check that a complete date adapter is provided.")}class Hd{static override(t){Object.assign(Hd.prototype,t)}options;constructor(t){this.options=t||{}}init(){}formats(){return Id()}parse(){return Id()}format(){return Id()}add(){return Id()}diff(){return Id()}startOf(){return Id()}endOf(){return Id()}}var Ud=Hd;function Fd(t,e,i,n){const{controller:r,data:o,_sorted:s}=t,a=r._cachedMeta.iScale;if(a&&e===a.axis&&"r"!==e&&s&&o.length){const t=a._reversePixels?xh:vh;if(!n)return t(o,e,i);if(r._sharedOptions){const n=o[0],r="function"==typeof n.getRange&&n.getRange(e);if(r){const n=t(o,e,i-r),s=t(o,e,i+r);return{lo:n.lo,hi:s.hi}}}}return{lo:0,hi:o.length-1}}function Bd(t,e,i,n,r){const o=t.getSortedVisibleDatasetMetas(),s=i[e];for(let t=0,i=o.length;t<i;++t){const{index:i,data:a}=o[t],{lo:l,hi:c}=Fd(o[t],e,s,r);for(let t=l;t<=c;++t){const e=a[t];e.skip||n(e,i,t)}}}function Wd(t,e,i,n,r){const o=[];return r||t.isPointInArea(e)?(Bd(t,i,e,(function(i,s,a){(r||eu(i,t.chartArea,0))&&i.inRange(e.x,e.y,n)&&o.push({element:i,datasetIndex:s,index:a})}),!0),o):o}function Vd(t,e,i,n,r,o){return o||t.isPointInArea(e)?"r"!==i||n?function(t,e,i,n,r,o){let s=[];const a=function(t){const e=-1!==t.indexOf("x"),i=-1!==t.indexOf("y");return function(t,n){const r=e?Math.abs(t.x-n.x):0,o=i?Math.abs(t.y-n.y):0;return Math.sqrt(Math.pow(r,2)+Math.pow(o,2))}}(i);let l=Number.POSITIVE_INFINITY;return Bd(t,i,e,(function(i,c,h){const u=i.inRange(e.x,e.y,r);if(n&&!u)return;const d=i.getCenterPoint(r);if(!o&&!t.isPointInArea(d)&&!u)return;const f=a(e,d);f<l?(s=[{element:i,datasetIndex:c,index:h}],l=f):f===l&&s.push({element:i,datasetIndex:c,index:h})})),s}(t,e,i,n,r,o):function(t,e,i,n){let r=[];return Bd(t,i,e,(function(t,i,o){const{startAngle:s,endAngle:a}=t.getProps(["startAngle","endAngle"],n),{angle:l}=uh(t,{x:e.x,y:e.y});gh(l,s,a)&&r.push({element:t,datasetIndex:i,index:o})})),r}(t,e,i,r):[]}function $d(t,e,i,n,r){const o=[],s="x"===i?"inXRange":"inYRange";let a=!1;return Bd(t,i,e,((t,n,l)=>{t[s](e[i],r)&&(o.push({element:t,datasetIndex:n,index:l}),a=a||t.inRange(e.x,e.y,r))})),n&&!a?[]:o}var Yd={evaluateInteractionItems:Bd,modes:{index(t,e,i,n){const r=Yu(e,t),o=i.axis||"x",s=i.includeInvisible||!1,a=i.intersect?Wd(t,r,o,n,s):Vd(t,r,o,!1,n,s),l=[];return a.length?(t.getSortedVisibleDatasetMetas().forEach((t=>{const e=a[0].index,i=t.data[e];i&&!i.skip&&l.push({element:i,datasetIndex:t.index,index:e})})),l):[]},dataset(t,e,i,n){const r=Yu(e,t),o=i.axis||"xy",s=i.includeInvisible||!1;let a=i.intersect?Wd(t,r,o,n,s):Vd(t,r,o,!1,n,s);if(a.length>0){const e=a[0].datasetIndex,i=t.getDatasetMeta(e).data;a=[];for(let t=0;t<i.length;++t)a.push({element:i[t],datasetIndex:e,index:t})}return a},point:(t,e,i,n)=>Wd(t,Yu(e,t),i.axis||"xy",n,i.includeInvisible||!1),nearest(t,e,i,n){const r=Yu(e,t),o=i.axis||"xy",s=i.includeInvisible||!1;return Vd(t,r,o,i.intersect,n,s)},x:(t,e,i,n)=>$d(t,Yu(e,t),"x",i.intersect,n),y:(t,e,i,n)=>$d(t,Yu(e,t),"y",i.intersect,n)}};const Gd=["left","top","right","bottom"];function Xd(t,e){return t.filter((t=>t.pos===e))}function qd(t,e){return t.filter((t=>-1===Gd.indexOf(t.pos)&&t.box.axis===e))}function Zd(t,e){return t.sort(((t,i)=>{const n=e?i:t,r=e?t:i;return n.weight===r.weight?n.index-r.index:n.weight-r.weight}))}function Kd(t,e,i,n){return Math.max(t[i],e[i])+Math.max(t[n],e[n])}function Qd(t,e){t.top=Math.max(t.top,e.top),t.left=Math.max(t.left,e.left),t.bottom=Math.max(t.bottom,e.bottom),t.right=Math.max(t.right,e.right)}function Jd(t,e,i,n){const{pos:r,box:o}=i,s=t.maxPadding;if(!Oc(r)){i.size&&(t[r]-=i.size);const e=n[i.stack]||{size:0,count:1};e.size=Math.max(e.size,i.horizontal?o.height:o.width),i.size=e.size/e.count,t[r]+=i.size}o.getPadding&&Qd(s,o.getPadding());const a=Math.max(0,e.outerWidth-Kd(s,t,"left","right")),l=Math.max(0,e.outerHeight-Kd(s,t,"top","bottom")),c=a!==t.w,h=l!==t.h;return t.w=a,t.h=l,i.horizontal?{same:c,other:h}:{same:h,other:c}}function tf(t,e){const i=e.maxPadding;return function(t){const n={left:0,top:0,right:0,bottom:0};return t.forEach((t=>{n[t]=Math.max(e[t],i[t])})),n}(t?["left","right"]:["top","bottom"])}function ef(t,e,i,n){const r=[];let o,s,a,l,c,h;for(o=0,s=t.length,c=0;o<s;++o){a=t[o],l=a.box,l.update(a.width||e.w,a.height||e.h,tf(a.horizontal,e));const{same:s,other:u}=Jd(e,i,a,n);c|=s&&r.length,h=h||u,l.fullSize||r.push(a)}return c&&ef(r,e,i,n)||h}function nf(t,e,i,n,r){t.top=i,t.left=e,t.right=e+n,t.bottom=i+r,t.width=n,t.height=r}function rf(t,e,i,n){const r=i.padding;let{x:o,y:s}=e;for(const a of t){const t=a.box,l=n[a.stack]||{count:1,placed:0,weight:1},c=a.stackWeight/l.weight||1;if(a.horizontal){const n=e.w*c,o=l.size||t.height;$c(l.start)&&(s=l.start),t.fullSize?nf(t,r.left,s,i.outerWidth-r.right-r.left,o):nf(t,e.left+l.placed,s,n,o),l.start=s,l.placed+=n,s=t.bottom}else{const n=e.h*c,s=l.size||t.width;$c(l.start)&&(o=l.start),t.fullSize?nf(t,o,r.top,s,i.outerHeight-r.bottom-r.top):nf(t,o,e.top+l.placed,s,n),l.start=o,l.placed+=n,o=t.right}}e.x=o,e.y=s}var of={addBox(t,e){t.boxes||(t.boxes=[]),e.fullSize=e.fullSize||!1,e.position=e.position||"top",e.weight=e.weight||0,e._layers=e._layers||function(){return[{z:0,draw(t){e.draw(t)}}]},t.boxes.push(e)},removeBox(t,e){const i=t.boxes?t.boxes.indexOf(e):-1;-1!==i&&t.boxes.splice(i,1)},configure(t,e,i){e.fullSize=i.fullSize,e.position=i.position,e.weight=i.weight},update(t,e,i,n){if(!t)return;const r=mu(t.options.layout.padding),o=Math.max(e-r.width,0),s=Math.max(i-r.height,0),a=function(t){const e=function(t){const e=[];let i,n,r,o,s,a;for(i=0,n=(t||[]).length;i<n;++i)r=t[i],({position:o,options:{stack:s,stackWeight:a=1}}=r),e.push({index:i,box:r,pos:o,horizontal:r.isHorizontal(),weight:r.weight,stack:s&&o+s,stackWeight:a});return e}(t),i=Zd(e.filter((t=>t.box.fullSize)),!0),n=Zd(Xd(e,"left"),!0),r=Zd(Xd(e,"right")),o=Zd(Xd(e,"top"),!0),s=Zd(Xd(e,"bottom")),a=qd(e,"x"),l=qd(e,"y");return{fullSize:i,leftAndTop:n.concat(o),rightAndBottom:r.concat(l).concat(s).concat(a),chartArea:Xd(e,"chartArea"),vertical:n.concat(r).concat(l),horizontal:o.concat(s).concat(a)}}(t.boxes),l=a.vertical,c=a.horizontal;Rc(t.boxes,(t=>{"function"==typeof t.beforeLayout&&t.beforeLayout()}));const h=l.reduce(((t,e)=>e.box.options&&!1===e.box.options.display?t:t+1),0)||1,u=Object.freeze({outerWidth:e,outerHeight:i,padding:r,availableWidth:o,availableHeight:s,vBoxMaxWidth:o/2/h,hBoxMaxHeight:s/2}),d=Object.assign({},r);Qd(d,mu(n));const f=Object.assign({maxPadding:d,w:o,h:s,x:r.left,y:r.top},r),p=function(t,e){const i=function(t){const e={};for(const i of t){const{stack:t,pos:n,stackWeight:r}=i;if(!t||!Gd.includes(n))continue;const o=e[t]||(e[t]={count:0,placed:0,weight:0,size:0});o.count++,o.weight+=r}return e}(t),{vBoxMaxWidth:n,hBoxMaxHeight:r}=e;let o,s,a;for(o=0,s=t.length;o<s;++o){a=t[o];const{fullSize:s}=a.box,l=i[a.stack],c=l&&a.stackWeight/l.weight;a.horizontal?(a.width=c?c*n:s&&e.availableWidth,a.height=r):(a.width=n,a.height=c?c*r:s&&e.availableHeight)}return i}(l.concat(c),u);ef(a.fullSize,f,u,p),ef(l,f,u,p),ef(c,f,u,p)&&ef(l,f,u,p),function(t){const e=t.maxPadding;function i(i){const n=Math.max(e[i]-t[i],0);return t[i]+=n,n}t.y+=i("top"),t.x+=i("left"),i("right"),i("bottom")}(f),rf(a.leftAndTop,f,u,p),f.x+=f.w,f.y+=f.h,rf(a.rightAndBottom,f,u,p),t.chartArea={left:f.left,top:f.top,right:f.left+f.w,bottom:f.top+f.h,height:f.h,width:f.w},Rc(a.chartArea,(e=>{const i=e.box;Object.assign(i,t.chartArea),i.update(f.w,f.h,{left:0,top:0,right:0,bottom:0})}))}};class sf{acquireContext(t,e){}releaseContext(t){return!1}addEventListener(t,e,i){}removeEventListener(t,e,i){}getDevicePixelRatio(){return 1}getMaximumSize(t,e,i,n){return e=Math.max(0,e||t.width),i=i||t.height,{width:e,height:Math.max(0,n?Math.floor(e/n):i)}}isAttached(t){return!0}updateConfig(t){}}class af extends sf{acquireContext(t){return t&&t.getContext&&t.getContext("2d")||null}updateConfig(t){t.options.animation=!1}}const lf="$chartjs",cf={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"},hf=t=>null===t||""===t,uf=!!qu&&{passive:!0};function df(t,e,i){t.canvas.removeEventListener(e,i,uf)}function ff(t,e){for(const i of t)if(i===e||i.contains(e))return!0}function pf(t,e,i){const n=t.canvas,r=new MutationObserver((t=>{let e=!1;for(const i of t)e=e||ff(i.addedNodes,n),e=e&&!ff(i.removedNodes,n);e&&i()}));return r.observe(document,{childList:!0,subtree:!0}),r}function gf(t,e,i){const n=t.canvas,r=new MutationObserver((t=>{let e=!1;for(const i of t)e=e||ff(i.removedNodes,n),e=e&&!ff(i.addedNodes,n);e&&i()}));return r.observe(document,{childList:!0,subtree:!0}),r}const mf=new Map;let yf=0;function bf(){const t=window.devicePixelRatio;t!==yf&&(yf=t,mf.forEach(((e,i)=>{i.currentDevicePixelRatio!==t&&e()})))}function vf(t,e,i){const n=t.canvas,r=n&&Fu(n);if(!r)return;const o=Sh(((t,e)=>{const n=r.clientWidth;i(t,e),n<r.clientWidth&&i()}),window),s=new ResizeObserver((t=>{const e=t[0],i=e.contentRect.width,n=e.contentRect.height;0===i&&0===n||o(i,n)}));return s.observe(r),function(t,e){mf.size||window.addEventListener("resize",bf),mf.set(t,e)}(t,o),s}function xf(t,e,i){i&&i.disconnect(),"resize"===e&&function(t){mf.delete(t),mf.size||window.removeEventListener("resize",bf)}(t)}function _f(t,e,i){const n=t.canvas,r=Sh((e=>{null!==t.ctx&&i(function(t,e){const i=cf[t.type]||t.type,{x:n,y:r}=Yu(t,e);return{type:i,chart:e,native:t,x:void 0!==n?n:null,y:void 0!==r?r:null}}(e,t))}),t);return function(t,e,i){t.addEventListener(e,i,uf)}(n,e,r),r}class wf extends sf{acquireContext(t,e){const i=t&&t.getContext&&t.getContext("2d");return i&&i.canvas===t?(function(t,e){const i=t.style,n=t.getAttribute("height"),r=t.getAttribute("width");if(t[lf]={initial:{height:n,width:r,style:{display:i.display,height:i.height,width:i.width}}},i.display=i.display||"block",i.boxSizing=i.boxSizing||"border-box",hf(r)){const e=Zu(t,"width");void 0!==e&&(t.width=e)}if(hf(n))if(""===t.style.height)t.height=t.width/(e||2);else{const e=Zu(t,"height");void 0!==e&&(t.height=e)}}(t,e),i):null}releaseContext(t){const e=t.canvas;if(!e[lf])return!1;const i=e[lf].initial;["height","width"].forEach((t=>{const n=i[t];Dc(n)?e.removeAttribute(t):e.setAttribute(t,n)}));const n=i.style||{};return Object.keys(n).forEach((t=>{e.style[t]=n[t]})),e.width=e.width,delete e[lf],!0}addEventListener(t,e,i){this.removeEventListener(t,e);const n=t.$proxies||(t.$proxies={}),r={attach:pf,detach:gf,resize:vf}[e]||_f;n[e]=r(t,e,i)}removeEventListener(t,e){const i=t.$proxies||(t.$proxies={}),n=i[e];n&&(({attach:xf,detach:xf,resize:xf}[e]||df)(t,e,n),i[e]=void 0)}getDevicePixelRatio(){return window.devicePixelRatio}getMaximumSize(t,e,i,n){return function(t,e,i,n){const r=Wu(t),o=$u(r,"margin"),s=Bu(r.maxWidth,t,"clientWidth")||Kc,a=Bu(r.maxHeight,t,"clientHeight")||Kc,l=function(t,e,i){let n,r;if(void 0===e||void 0===i){const o=Fu(t);if(o){const t=o.getBoundingClientRect(),s=Wu(o),a=$u(s,"border","width"),l=$u(s,"padding");e=t.width-l.width-a.width,i=t.height-l.height-a.height,n=Bu(s.maxWidth,o,"clientWidth"),r=Bu(s.maxHeight,o,"clientHeight")}else e=t.clientWidth,i=t.clientHeight}return{width:e,height:i,maxWidth:n||Kc,maxHeight:r||Kc}}(t,e,i);let{width:c,height:h}=l;if("content-box"===r.boxSizing){const t=$u(r,"border","width"),e=$u(r,"padding");c-=e.width+t.width,h-=e.height+t.height}return c=Math.max(0,c-o.width),h=Math.max(0,n?c/n:h-o.height),c=Gu(Math.min(c,s,l.maxWidth)),h=Gu(Math.min(h,a,l.maxHeight)),c&&!h&&(h=Gu(c/2)),(void 0!==e||void 0!==i)&&n&&l.height&&h>l.height&&(h=l.height,c=Gu(Math.floor(h*n))),{width:c,height:h}}(t,e,i,n)}isAttached(t){const e=Fu(t);return!(!e||!e.isConnected)}}class Mf{static defaults={};static defaultRoutes=void 0;x;y;active=!1;options;$animations;tooltipPosition(t){const{x:e,y:i}=this.getProps(["x","y"],t);return{x:e,y:i}}hasValue(){return sh(this.x)&&sh(this.y)}getProps(t,e){const i=this.$animations;if(!e||!i)return this;const n={};return t.forEach((t=>{n[t]=i[t]&&i[t].active()?i[t]._to:this[t]})),n}}function kf(t,e,i,n,r){const o=Cc(n,0),s=Math.min(Cc(r,t.length),t.length);let a,l,c,h=0;for(i=Math.ceil(i),r&&(a=r-n,i=a/Math.floor(a/i)),c=o;c<0;)h++,c=Math.round(o+h*i);for(l=Math.max(o,0);l<s;l++)l===c&&(e.push(t[l]),h++,c=Math.round(o+h*i))}const Sf=(t,e,i)=>"top"===e||"left"===e?t[e]+i:t[e]-i,Df=(t,e)=>Math.min(e||t,t);function Ef(t,e){const i=[],n=t.length/e,r=t.length;let o=0;for(;o<r;o+=n)i.push(t[Math.floor(o)]);return i}function Of(t,e,i){const n=t.ticks.length,r=Math.min(e,n-1),o=t._startPixel,s=t._endPixel,a=1e-6;let l,c=t.getPixelForTick(r);if(!(i&&(l=1===n?Math.max(c-o,s-c):0===e?(t.getPixelForTick(1)-c)/2:(c-t.getPixelForTick(r-1))/2,c+=r<e?l:-l,c<o-a||c>s+a)))return c}function Pf(t){return t.drawTicks?t.tickLength:0}function Af(t,e){if(!t.display)return 0;const i=yu(t.font,e),n=mu(t.padding);return(Ec(t.text)?t.text.length:1)*i.lineHeight+n.height}function Cf(t,e,i){let n=Dh(t);return(i&&"right"!==e||!i&&"right"===e)&&(n=(t=>"left"===t?"right":"right"===t?"left":t)(n)),n}class Tf extends Mf{constructor(t){super(),this.id=t.id,this.type=t.type,this.options=void 0,this.ctx=t.ctx,this.chart=t.chart,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.width=void 0,this.height=void 0,this._margins={left:0,right:0,top:0,bottom:0},this.maxWidth=void 0,this.maxHeight=void 0,this.paddingTop=void 0,this.paddingBottom=void 0,this.paddingLeft=void 0,this.paddingRight=void 0,this.axis=void 0,this.labelRotation=void 0,this.min=void 0,this.max=void 0,this._range=void 0,this.ticks=[],this._gridLineItems=null,this._labelItems=null,this._labelSizes=null,this._length=0,this._maxLength=0,this._longestTextCache={},this._startPixel=void 0,this._endPixel=void 0,this._reversePixels=!1,this._userMax=void 0,this._userMin=void 0,this._suggestedMax=void 0,this._suggestedMin=void 0,this._ticksLength=0,this._borderValue=0,this._cache={},this._dataLimitsCached=!1,this.$context=void 0}init(t){this.options=t.setContext(this.getContext()),this.axis=t.axis,this._userMin=this.parse(t.min),this._userMax=this.parse(t.max),this._suggestedMin=this.parse(t.suggestedMin),this._suggestedMax=this.parse(t.suggestedMax)}parse(t,e){return t}getUserBounds(){let{_userMin:t,_userMax:e,_suggestedMin:i,_suggestedMax:n}=this;return t=Ac(t,Number.POSITIVE_INFINITY),e=Ac(e,Number.NEGATIVE_INFINITY),i=Ac(i,Number.POSITIVE_INFINITY),n=Ac(n,Number.NEGATIVE_INFINITY),{min:Ac(t,i),max:Ac(e,n),minDefined:Pc(t),maxDefined:Pc(e)}}getMinMax(t){let e,{min:i,max:n,minDefined:r,maxDefined:o}=this.getUserBounds();if(r&&o)return{min:i,max:n};const s=this.getMatchingVisibleMetas();for(let a=0,l=s.length;a<l;++a)e=s[a].controller.getMinMax(this,t),r||(i=Math.min(i,e.min)),o||(n=Math.max(n,e.max));return i=o&&i>n?n:i,n=r&&i>n?i:n,{min:Ac(i,Ac(n,i)),max:Ac(n,Ac(i,n))}}getPadding(){return{left:this.paddingLeft||0,top:this.paddingTop||0,right:this.paddingRight||0,bottom:this.paddingBottom||0}}getTicks(){return this.ticks}getLabels(){const t=this.chart.data;return this.options.labels||(this.isHorizontal()?t.xLabels:t.yLabels)||t.labels||[]}getLabelItems(t=this.chart.chartArea){return this._labelItems||(this._labelItems=this._computeLabelItems(t))}beforeLayout(){this._cache={},this._dataLimitsCached=!1}beforeUpdate(){Lc(this.options.beforeUpdate,[this])}update(t,e,i){const{beginAtZero:n,grace:r,ticks:o}=this.options,s=o.sampleSize;this.beforeUpdate(),this.maxWidth=t,this.maxHeight=e,this._margins=i=Object.assign({left:0,right:0,top:0,bottom:0},i),this.ticks=null,this._labelSizes=null,this._gridLineItems=null,this._labelItems=null,this.beforeSetDimensions(),this.setDimensions(),this.afterSetDimensions(),this._maxLength=this.isHorizontal()?this.width+i.left+i.right:this.height+i.top+i.bottom,this._dataLimitsCached||(this.beforeDataLimits(),this.determineDataLimits(),this.afterDataLimits(),this._range=function(t,e,i){const{min:n,max:r}=t,o=Tc(e,(r-n)/2),s=(t,e)=>i&&0===t?0:t+e;return{min:s(n,-Math.abs(o)),max:s(r,o)}}(this,r,n),this._dataLimitsCached=!0),this.beforeBuildTicks(),this.ticks=this.buildTicks()||[],this.afterBuildTicks();const a=s<this.ticks.length;this._convertTicksToLabels(a?Ef(this.ticks,s):this.ticks),this.configure(),this.beforeCalculateLabelRotation(),this.calculateLabelRotation(),this.afterCalculateLabelRotation(),o.display&&(o.autoSkip||"auto"===o.source)&&(this.ticks=function(t,e){const i=t.options.ticks,n=function(t){const e=t.options.offset,i=t._tickSize(),n=t._length/i+(e?0:1),r=t._maxLength/i;return Math.floor(Math.min(n,r))}(t),r=Math.min(i.maxTicksLimit||n,n),o=i.major.enabled?function(t){const e=[];let i,n;for(i=0,n=t.length;i<n;i++)t[i].major&&e.push(i);return e}(e):[],s=o.length,a=o[0],l=o[s-1],c=[];if(s>r)return function(t,e,i,n){let r,o=0,s=i[0];for(n=Math.ceil(n),r=0;r<t.length;r++)r===s&&(e.push(t[r]),o++,s=i[o*n])}(e,c,o,s/r),c;const h=function(t,e,i){const n=function(t){const e=t.length;let i,n;if(e<2)return!1;for(n=t[0],i=1;i<e;++i)if(t[i]-t[i-1]!==n)return!1;return n}(t),r=e.length/i;if(!n)return Math.max(r,1);const o=function(t){const e=[],i=Math.sqrt(t);let n;for(n=1;n<i;n++)t%n==0&&(e.push(n),e.push(t/n));return i===(0|i)&&e.push(i),e.sort(((t,e)=>t-e)).pop(),e}(n);for(let t=0,e=o.length-1;t<e;t++){const e=o[t];if(e>r)return e}return Math.max(r,1)}(o,e,r);if(s>0){let t,i;const n=s>1?Math.round((l-a)/(s-1)):null;for(kf(e,c,h,Dc(n)?0:a-n,a),t=0,i=s-1;t<i;t++)kf(e,c,h,o[t],o[t+1]);return kf(e,c,h,l,Dc(n)?e.length:l+n),c}return kf(e,c,h),c}(this,this.ticks),this._labelSizes=null,this.afterAutoSkip()),a&&this._convertTicksToLabels(this.ticks),this.beforeFit(),this.fit(),this.afterFit(),this.afterUpdate()}configure(){let t,e,i=this.options.reverse;this.isHorizontal()?(t=this.left,e=this.right):(t=this.top,e=this.bottom,i=!i),this._startPixel=t,this._endPixel=e,this._reversePixels=i,this._length=e-t,this._alignToPixels=this.options.alignToPixels}afterUpdate(){Lc(this.options.afterUpdate,[this])}beforeSetDimensions(){Lc(this.options.beforeSetDimensions,[this])}setDimensions(){this.isHorizontal()?(this.width=this.maxWidth,this.left=0,this.right=this.width):(this.height=this.maxHeight,this.top=0,this.bottom=this.height),this.paddingLeft=0,this.paddingTop=0,this.paddingRight=0,this.paddingBottom=0}afterSetDimensions(){Lc(this.options.afterSetDimensions,[this])}_callHooks(t){this.chart.notifyPlugins(t,this.getContext()),Lc(this.options[t],[this])}beforeDataLimits(){this._callHooks("beforeDataLimits")}determineDataLimits(){}afterDataLimits(){this._callHooks("afterDataLimits")}beforeBuildTicks(){this._callHooks("beforeBuildTicks")}buildTicks(){return[]}afterBuildTicks(){this._callHooks("afterBuildTicks")}beforeTickToLabelConversion(){Lc(this.options.beforeTickToLabelConversion,[this])}generateTickLabels(t){const e=this.options.ticks;let i,n,r;for(i=0,n=t.length;i<n;i++)r=t[i],r.label=Lc(e.callback,[r.value,i,t],this)}afterTickToLabelConversion(){Lc(this.options.afterTickToLabelConversion,[this])}beforeCalculateLabelRotation(){Lc(this.options.beforeCalculateLabelRotation,[this])}calculateLabelRotation(){const t=this.options,e=t.ticks,i=Df(this.ticks.length,t.ticks.maxTicksLimit),n=e.minRotation||0,r=e.maxRotation;let o,s,a,l=n;if(!this._isVisible()||!e.display||n>=r||i<=1||!this.isHorizontal())return void(this.labelRotation=n);const c=this._getLabelSizes(),h=c.widest.width,u=c.highest.height,d=mh(this.chart.width-h,0,this.maxWidth);o=t.offset?this.maxWidth/i:d/(i-1),h+6>o&&(o=d/(i-(t.offset?.5:1)),s=this.maxHeight-Pf(t.grid)-e.padding-Af(t.title,this.chart.options.font),a=Math.sqrt(h*h+u*u),l=ch(Math.min(Math.asin(mh((c.highest.height+6)/o,-1,1)),Math.asin(mh(s/a,-1,1))-Math.asin(mh(u/a,-1,1)))),l=Math.max(n,Math.min(r,l))),this.labelRotation=l}afterCalculateLabelRotation(){Lc(this.options.afterCalculateLabelRotation,[this])}afterAutoSkip(){}beforeFit(){Lc(this.options.beforeFit,[this])}fit(){const t={width:0,height:0},{chart:e,options:{ticks:i,title:n,grid:r}}=this,o=this._isVisible(),s=this.isHorizontal();if(o){const o=Af(n,e.options.font);if(s?(t.width=this.maxWidth,t.height=Pf(r)+o):(t.height=this.maxHeight,t.width=Pf(r)+o),i.display&&this.ticks.length){const{first:e,last:n,widest:r,highest:o}=this._getLabelSizes(),a=2*i.padding,l=lh(this.labelRotation),c=Math.cos(l),h=Math.sin(l);if(s){const e=i.mirror?0:h*r.width+c*o.height;t.height=Math.min(this.maxHeight,t.height+e+a)}else{const e=i.mirror?0:c*r.width+h*o.height;t.width=Math.min(this.maxWidth,t.width+e+a)}this._calculatePadding(e,n,h,c)}}this._handleMargins(),s?(this.width=this._length=e.width-this._margins.left-this._margins.right,this.height=t.height):(this.width=t.width,this.height=this._length=e.height-this._margins.top-this._margins.bottom)}_calculatePadding(t,e,i,n){const{ticks:{align:r,padding:o},position:s}=this.options,a=0!==this.labelRotation,l="top"!==s&&"x"===this.axis;if(this.isHorizontal()){const s=this.getPixelForTick(0)-this.left,c=this.right-this.getPixelForTick(this.ticks.length-1);let h=0,u=0;a?l?(h=n*t.width,u=i*e.height):(h=i*t.height,u=n*e.width):"start"===r?u=e.width:"end"===r?h=t.width:"inner"!==r&&(h=t.width/2,u=e.width/2),this.paddingLeft=Math.max((h-s+o)*this.width/(this.width-s),0),this.paddingRight=Math.max((u-c+o)*this.width/(this.width-c),0)}else{let i=e.height/2,n=t.height/2;"start"===r?(i=0,n=t.height):"end"===r&&(i=e.height,n=0),this.paddingTop=i+o,this.paddingBottom=n+o}}_handleMargins(){this._margins&&(this._margins.left=Math.max(this.paddingLeft,this._margins.left),this._margins.top=Math.max(this.paddingTop,this._margins.top),this._margins.right=Math.max(this.paddingRight,this._margins.right),this._margins.bottom=Math.max(this.paddingBottom,this._margins.bottom))}afterFit(){Lc(this.options.afterFit,[this])}isHorizontal(){const{axis:t,position:e}=this.options;return"top"===e||"bottom"===e||"x"===t}isFullSize(){return this.options.fullSize}_convertTicksToLabels(t){let e,i;for(this.beforeTickToLabelConversion(),this.generateTickLabels(t),e=0,i=t.length;e<i;e++)Dc(t[e].label)&&(t.splice(e,1),i--,e--);this.afterTickToLabelConversion()}_getLabelSizes(){let t=this._labelSizes;if(!t){const e=this.options.ticks.sampleSize;let i=this.ticks;e<i.length&&(i=Ef(i,e)),this._labelSizes=t=this._computeLabelSizes(i,i.length,this.options.ticks.maxTicksLimit)}return t}_computeLabelSizes(t,e,i){const{ctx:n,_longestTextCache:r}=this,o=[],s=[],a=Math.floor(e/Df(e,i));let l,c,h,u,d,f,p,g,m,y,b,v=0,x=0;for(l=0;l<e;l+=a){if(u=t[l].label,d=this._resolveTickFontOptions(l),n.font=f=d.string,p=r[f]=r[f]||{data:{},gc:[]},g=d.lineHeight,m=y=0,Dc(u)||Ec(u)){if(Ec(u))for(c=0,h=u.length;c<h;++c)b=u[c],Dc(b)||Ec(b)||(m=qh(n,p.data,p.gc,m,b),y+=g)}else m=qh(n,p.data,p.gc,m,u),y=g;o.push(m),s.push(y),v=Math.max(m,v),x=Math.max(y,x)}!function(t,e){Rc(t,(t=>{const i=t.gc,n=i.length/2;let r;if(n>e){for(r=0;r<n;++r)delete t.data[i[r]];i.splice(0,n)}}))}(r,e);const _=o.indexOf(v),w=s.indexOf(x),M=t=>({width:o[t]||0,height:s[t]||0});return{first:M(0),last:M(e-1),widest:M(_),highest:M(w),widths:o,heights:s}}getLabelForValue(t){return t}getPixelForValue(t,e){return NaN}getValueForPixel(t){}getPixelForTick(t){const e=this.ticks;return t<0||t>e.length-1?null:this.getPixelForValue(e[t].value)}getPixelForDecimal(t){this._reversePixels&&(t=1-t);const e=this._startPixel+t*this._length;return function(t){return mh(t,-32768,32767)}(this._alignToPixels?Kh(this.chart,e,0):e)}getDecimalForPixel(t){const e=(t-this._startPixel)/this._length;return this._reversePixels?1-e:e}getBasePixel(){return this.getPixelForValue(this.getBaseValue())}getBaseValue(){const{min:t,max:e}=this;return t<0&&e<0?e:t>0&&e>0?t:0}getContext(t){const e=this.ticks||[];if(t>=0&&t<e.length){const i=e[t];return i.$context||(i.$context=function(t,e,i){return vu(t,{tick:i,index:e,type:"tick"})}(this.getContext(),t,i))}return this.$context||(this.$context=vu(this.chart.getContext(),{scale:this,type:"scale"}))}_tickSize(){const t=this.options.ticks,e=lh(this.labelRotation),i=Math.abs(Math.cos(e)),n=Math.abs(Math.sin(e)),r=this._getLabelSizes(),o=t.autoSkipPadding||0,s=r?r.widest.width+o:0,a=r?r.highest.height+o:0;return this.isHorizontal()?a*i>s*n?s/i:a/n:a*n<s*i?a/i:s/n}_isVisible(){const t=this.options.display;return"auto"!==t?!!t:this.getMatchingVisibleMetas().length>0}_computeGridLineItems(t){const e=this.axis,i=this.chart,n=this.options,{grid:r,position:o,border:s}=n,a=r.offset,l=this.isHorizontal(),c=this.ticks.length+(a?1:0),h=Pf(r),u=[],d=s.setContext(this.getContext()),f=d.display?d.width:0,p=f/2,g=function(t){return Kh(i,t,f)};let m,y,b,v,x,_,w,M,k,S,D,E;if("top"===o)m=g(this.bottom),_=this.bottom-h,M=m-p,S=g(t.top)+p,E=t.bottom;else if("bottom"===o)m=g(this.top),S=t.top,E=g(t.bottom)-p,_=m+p,M=this.top+h;else if("left"===o)m=g(this.right),x=this.right-h,w=m-p,k=g(t.left)+p,D=t.right;else if("right"===o)m=g(this.left),k=t.left,D=g(t.right)-p,x=m+p,w=this.left+h;else if("x"===e){if("center"===o)m=g((t.top+t.bottom)/2+.5);else if(Oc(o)){const t=Object.keys(o)[0],e=o[t];m=g(this.chart.scales[t].getPixelForValue(e))}S=t.top,E=t.bottom,_=m+p,M=_+h}else if("y"===e){if("center"===o)m=g((t.left+t.right)/2);else if(Oc(o)){const t=Object.keys(o)[0],e=o[t];m=g(this.chart.scales[t].getPixelForValue(e))}x=m-p,w=x-h,k=t.left,D=t.right}const O=Cc(n.ticks.maxTicksLimit,c),P=Math.max(1,Math.ceil(c/O));for(y=0;y<c;y+=P){const t=this.getContext(y),e=r.setContext(t),n=s.setContext(t),o=e.lineWidth,c=e.color,h=n.dash||[],d=n.dashOffset,f=e.tickWidth,p=e.tickColor,g=e.tickBorderDash||[],m=e.tickBorderDashOffset;b=Of(this,y,a),void 0!==b&&(v=Kh(i,b,o),l?x=w=k=D=v:_=M=S=E=v,u.push({tx1:x,ty1:_,tx2:w,ty2:M,x1:k,y1:S,x2:D,y2:E,width:o,color:c,borderDash:h,borderDashOffset:d,tickWidth:f,tickColor:p,tickBorderDash:g,tickBorderDashOffset:m}))}return this._ticksLength=c,this._borderValue=m,u}_computeLabelItems(t){const e=this.axis,i=this.options,{position:n,ticks:r}=i,o=this.isHorizontal(),s=this.ticks,{align:a,crossAlign:l,padding:c,mirror:h}=r,u=Pf(i.grid),d=u+c,f=h?-c:d,p=-lh(this.labelRotation),g=[];let m,y,b,v,x,_,w,M,k,S,D,E,O="middle";if("top"===n)_=this.bottom-f,w=this._getXAxisLabelAlignment();else if("bottom"===n)_=this.top+f,w=this._getXAxisLabelAlignment();else if("left"===n){const t=this._getYAxisLabelAlignment(u);w=t.textAlign,x=t.x}else if("right"===n){const t=this._getYAxisLabelAlignment(u);w=t.textAlign,x=t.x}else if("x"===e){if("center"===n)_=(t.top+t.bottom)/2+d;else if(Oc(n)){const t=Object.keys(n)[0],e=n[t];_=this.chart.scales[t].getPixelForValue(e)+d}w=this._getXAxisLabelAlignment()}else if("y"===e){if("center"===n)x=(t.left+t.right)/2-d;else if(Oc(n)){const t=Object.keys(n)[0],e=n[t];x=this.chart.scales[t].getPixelForValue(e)}w=this._getYAxisLabelAlignment(u).textAlign}"y"===e&&("start"===a?O="top":"end"===a&&(O="bottom"));const P=this._getLabelSizes();for(m=0,y=s.length;m<y;++m){b=s[m],v=b.label;const t=r.setContext(this.getContext(m));M=this.getPixelForTick(m)+r.labelOffset,k=this._resolveTickFontOptions(m),S=k.lineHeight,D=Ec(v)?v.length:1;const e=D/2,i=t.color,a=t.textStrokeColor,c=t.textStrokeWidth;let u,d=w;if(o?(x=M,"inner"===w&&(d=m===y-1?this.options.reverse?"left":"right":0===m?this.options.reverse?"right":"left":"center"),E="top"===n?"near"===l||0!==p?-D*S+S/2:"center"===l?-P.highest.height/2-e*S+S:-P.highest.height+S/2:"near"===l||0!==p?S/2:"center"===l?P.highest.height/2-e*S:P.highest.height-D*S,h&&(E*=-1),0===p||t.showLabelBackdrop||(x+=S/2*Math.sin(p))):(_=M,E=(1-D)*S/2),t.showLabelBackdrop){const e=mu(t.backdropPadding),i=P.heights[m],n=P.widths[m];let r=E-e.top,o=0-e.left;switch(O){case"middle":r-=i/2;break;case"bottom":r-=i}switch(w){case"center":o-=n/2;break;case"right":o-=n}u={left:o,top:r,width:n+e.width,height:i+e.height,color:t.backdropColor}}g.push({label:v,font:k,textOffset:E,options:{rotation:p,color:i,strokeColor:a,strokeWidth:c,textAlign:d,textBaseline:O,translation:[x,_],backdrop:u}})}return g}_getXAxisLabelAlignment(){const{position:t,ticks:e}=this.options;if(-lh(this.labelRotation))return"top"===t?"left":"right";let i="center";return"start"===e.align?i="left":"end"===e.align?i="right":"inner"===e.align&&(i="inner"),i}_getYAxisLabelAlignment(t){const{position:e,ticks:{crossAlign:i,mirror:n,padding:r}}=this.options,o=t+r,s=this._getLabelSizes().widest.width;let a,l;return"left"===e?n?(l=this.right+r,"near"===i?a="left":"center"===i?(a="center",l+=s/2):(a="right",l+=s)):(l=this.right-o,"near"===i?a="right":"center"===i?(a="center",l-=s/2):(a="left",l=this.left)):"right"===e?n?(l=this.left+r,"near"===i?a="right":"center"===i?(a="center",l-=s/2):(a="left",l-=s)):(l=this.left+o,"near"===i?a="left":"center"===i?(a="center",l+=s/2):(a="right",l=this.right)):a="right",{textAlign:a,x:l}}_computeLabelArea(){if(this.options.ticks.mirror)return;const t=this.chart,e=this.options.position;return"left"===e||"right"===e?{top:0,left:this.left,bottom:t.height,right:this.right}:"top"===e||"bottom"===e?{top:this.top,left:0,bottom:this.bottom,right:t.width}:void 0}drawBackground(){const{ctx:t,options:{backgroundColor:e},left:i,top:n,width:r,height:o}=this;e&&(t.save(),t.fillStyle=e,t.fillRect(i,n,r,o),t.restore())}getLineWidthForValue(t){const e=this.options.grid;if(!this._isVisible()||!e.display)return 0;const i=this.ticks.findIndex((e=>e.value===t));return i>=0?e.setContext(this.getContext(i)).lineWidth:0}drawGrid(t){const e=this.options.grid,i=this.ctx,n=this._gridLineItems||(this._gridLineItems=this._computeGridLineItems(t));let r,o;const s=(t,e,n)=>{n.width&&n.color&&(i.save(),i.lineWidth=n.width,i.strokeStyle=n.color,i.setLineDash(n.borderDash||[]),i.lineDashOffset=n.borderDashOffset,i.beginPath(),i.moveTo(t.x,t.y),i.lineTo(e.x,e.y),i.stroke(),i.restore())};if(e.display)for(r=0,o=n.length;r<o;++r){const t=n[r];e.drawOnChartArea&&s({x:t.x1,y:t.y1},{x:t.x2,y:t.y2},t),e.drawTicks&&s({x:t.tx1,y:t.ty1},{x:t.tx2,y:t.ty2},{color:t.tickColor,width:t.tickWidth,borderDash:t.tickBorderDash,borderDashOffset:t.tickBorderDashOffset})}}drawBorder(){const{chart:t,ctx:e,options:{border:i,grid:n}}=this,r=i.setContext(this.getContext()),o=i.display?r.width:0;if(!o)return;const s=n.setContext(this.getContext(0)).lineWidth,a=this._borderValue;let l,c,h,u;this.isHorizontal()?(l=Kh(t,this.left,o)-o/2,c=Kh(t,this.right,s)+s/2,h=u=a):(h=Kh(t,this.top,o)-o/2,u=Kh(t,this.bottom,s)+s/2,l=c=a),e.save(),e.lineWidth=r.width,e.strokeStyle=r.color,e.beginPath(),e.moveTo(l,h),e.lineTo(c,u),e.stroke(),e.restore()}drawLabels(t){if(!this.options.ticks.display)return;const e=this.ctx,i=this._computeLabelArea();i&&iu(e,i);const n=this.getLabelItems(t);for(const t of n){const i=t.options,n=t.font;lu(e,t.label,0,t.textOffset,n,i)}i&&nu(e)}drawTitle(){const{ctx:t,options:{position:e,title:i,reverse:n}}=this;if(!i.display)return;const r=yu(i.font),o=mu(i.padding),s=i.align;let a=r.lineHeight/2;"bottom"===e||"center"===e||Oc(e)?(a+=o.bottom,Ec(i.text)&&(a+=r.lineHeight*(i.text.length-1))):a+=o.top;const{titleX:l,titleY:c,maxWidth:h,rotation:u}=function(t,e,i,n){const{top:r,left:o,bottom:s,right:a,chart:l}=t,{chartArea:c,scales:h}=l;let u,d,f,p=0;const g=s-r,m=a-o;if(t.isHorizontal()){if(d=Eh(n,o,a),Oc(i)){const t=Object.keys(i)[0],n=i[t];f=h[t].getPixelForValue(n)+g-e}else f="center"===i?(c.bottom+c.top)/2+g-e:Sf(t,i,e);u=a-o}else{if(Oc(i)){const t=Object.keys(i)[0],n=i[t];d=h[t].getPixelForValue(n)-m+e}else d="center"===i?(c.left+c.right)/2-m+e:Sf(t,i,e);f=Eh(n,s,r),p="left"===i?-Jc:Jc}return{titleX:d,titleY:f,maxWidth:u,rotation:p}}(this,a,e,s);lu(t,i.text,0,0,r,{color:i.color,maxWidth:h,rotation:u,textAlign:Cf(s,e,n),textBaseline:"middle",translation:[l,c]})}draw(t){this._isVisible()&&(this.drawBackground(),this.drawGrid(t),this.drawBorder(),this.drawTitle(),this.drawLabels(t))}_layers(){const t=this.options,e=t.ticks&&t.ticks.z||0,i=Cc(t.grid&&t.grid.z,-1),n=Cc(t.border&&t.border.z,0);return this._isVisible()&&this.draw===Tf.prototype.draw?[{z:i,draw:t=>{this.drawBackground(),this.drawGrid(t),this.drawTitle()}},{z:n,draw:()=>{this.drawBorder()}},{z:e,draw:t=>{this.drawLabels(t)}}]:[{z:e,draw:t=>{this.draw(t)}}]}getMatchingVisibleMetas(t){const e=this.chart.getSortedVisibleDatasetMetas(),i=this.axis+"AxisID",n=[];let r,o;for(r=0,o=e.length;r<o;++r){const o=e[r];o[i]!==this.id||t&&o.type!==t||n.push(o)}return n}_resolveTickFontOptions(t){return yu(this.options.ticks.setContext(this.getContext(t)).font)}_maxDigits(){const t=this._resolveTickFontOptions(0).lineHeight;return(this.isHorizontal()?this.width:this.height)/t}}class Lf{constructor(t,e,i){this.type=t,this.scope=e,this.override=i,this.items=Object.create(null)}isForType(t){return Object.prototype.isPrototypeOf.call(this.type.prototype,t.prototype)}register(t){const e=Object.getPrototypeOf(t);let i;(function(t){return"id"in t&&"defaults"in t})(e)&&(i=this.register(e));const n=this.items,r=t.id,o=this.scope+"."+r;if(!r)throw new Error("class does not have id: "+t);return r in n||(n[r]=t,function(t,e,i){const n=Hc(Object.create(null),[i?Xh.get(i):{},Xh.get(e),t.defaults]);Xh.set(e,n),t.defaultRoutes&&function(t,e){Object.keys(e).forEach((i=>{const n=i.split("."),r=n.pop(),o=[t].concat(n).join("."),s=e[i].split("."),a=s.pop(),l=s.join(".");Xh.route(o,r,l,a)}))}(e,t.defaultRoutes),t.descriptors&&Xh.describe(e,t.descriptors)}(t,o,i),this.override&&Xh.override(t.id,t.overrides)),o}get(t){return this.items[t]}unregister(t){const e=this.items,i=t.id,n=this.scope;i in e&&delete e[i],n&&i in Xh[n]&&(delete Xh[n][i],this.override&&delete Wh[i])}}class Rf{constructor(){this.controllers=new Lf(Dd,"datasets",!0),this.elements=new Lf(Mf,"elements"),this.plugins=new Lf(Object,"plugins"),this.scales=new Lf(Tf,"scales"),this._typedRegistries=[this.controllers,this.scales,this.elements]}add(...t){this._each("register",t)}remove(...t){this._each("unregister",t)}addControllers(...t){this._each("register",t,this.controllers)}addElements(...t){this._each("register",t,this.elements)}addPlugins(...t){this._each("register",t,this.plugins)}addScales(...t){this._each("register",t,this.scales)}getController(t){return this._get(t,this.controllers,"controller")}getElement(t){return this._get(t,this.elements,"element")}getPlugin(t){return this._get(t,this.plugins,"plugin")}getScale(t){return this._get(t,this.scales,"scale")}removeControllers(...t){this._each("unregister",t,this.controllers)}removeElements(...t){this._each("unregister",t,this.elements)}removePlugins(...t){this._each("unregister",t,this.plugins)}removeScales(...t){this._each("unregister",t,this.scales)}_each(t,e,i){[...e].forEach((e=>{const n=i||this._getRegistryForType(e);i||n.isForType(e)||n===this.plugins&&e.id?this._exec(t,n,e):Rc(e,(e=>{const n=i||this._getRegistryForType(e);this._exec(t,n,e)}))}))}_exec(t,e,i){const n=Vc(t);Lc(i["before"+n],[],i),e[t](i),Lc(i["after"+n],[],i)}_getRegistryForType(t){for(let e=0;e<this._typedRegistries.length;e++){const i=this._typedRegistries[e];if(i.isForType(t))return i}return this.plugins}_get(t,e,i){const n=e.get(t);if(void 0===n)throw new Error('"'+t+'" is not a registered '+i+".");return n}}var jf=new Rf;class zf{constructor(){this._init=[]}notify(t,e,i,n){"beforeInit"===e&&(this._init=this._createDescriptors(t,!0),this._notify(this._init,t,"install"));const r=n?this._descriptors(t).filter(n):this._descriptors(t),o=this._notify(r,t,e,i);return"afterDestroy"===e&&(this._notify(r,t,"stop"),this._notify(this._init,t,"uninstall")),o}_notify(t,e,i,n){n=n||{};for(const r of t){const t=r.plugin;if(!1===Lc(t[i],[e,n,r.options],t)&&n.cancelable)return!1}return!0}invalidate(){Dc(this._cache)||(this._oldCache=this._cache,this._cache=void 0)}_descriptors(t){if(this._cache)return this._cache;const e=this._cache=this._createDescriptors(t);return this._notifyStateChanges(t),e}_createDescriptors(t,e){const i=t&&t.config,n=Cc(i.options&&i.options.plugins,{}),r=function(t){const e={},i=[],n=Object.keys(jf.plugins.items);for(let t=0;t<n.length;t++)i.push(jf.getPlugin(n[t]));const r=t.plugins||[];for(let t=0;t<r.length;t++){const n=r[t];-1===i.indexOf(n)&&(i.push(n),e[n.id]=!0)}return{plugins:i,localIds:e}}(i);return!1!==n||e?function(t,{plugins:e,localIds:i},n,r){const o=[],s=t.getContext();for(const a of e){const e=a.id,l=Nf(n[e],r);null!==l&&o.push({plugin:a,options:If(t.config,{plugin:a,local:i[e]},l,s)})}return o}(t,r,n,e):[]}_notifyStateChanges(t){const e=this._oldCache||[],i=this._cache,n=(t,e)=>t.filter((t=>!e.some((e=>t.plugin.id===e.plugin.id))));this._notify(n(e,i),t,"stop"),this._notify(n(i,e),t,"start")}}function Nf(t,e){return e||!1!==t?!0===t?{}:t:null}function If(t,{plugin:e,local:i},n,r){const o=t.pluginScopeKeys(e),s=t.getOptionScopes(n,o);return i&&e.defaults&&s.push(e.defaults),t.createResolver(s,r,[""],{scriptable:!1,indexable:!1,allKeys:!0})}function Hf(t,e){const i=Xh.datasets[t]||{};return((e.datasets||{})[t]||{}).indexAxis||e.indexAxis||i.indexAxis||"x"}function Uf(t){if("x"===t||"y"===t||"r"===t)return t}function Ff(t,...e){if(Uf(t))return t;for(const n of e){const e=n.axis||("top"===(i=n.position)||"bottom"===i?"x":"left"===i||"right"===i?"y":void 0)||t.length>1&&Uf(t[0].toLowerCase());if(e)return e}var i;throw new Error(`Cannot determine type of '${t}' axis. Please provide 'axis' or 'position' option.`)}function Bf(t,e,i){if(i[e+"AxisID"]===t)return{axis:e}}function Wf(t){const e=t.options||(t.options={});e.plugins=Cc(e.plugins,{}),e.scales=function(t,e){const i=Wh[t.type]||{scales:{}},n=e.scales||{},r=Hf(t.type,e),o=Object.create(null);return Object.keys(n).forEach((e=>{const s=n[e];if(!Oc(s))return console.error(`Invalid scale configuration for scale: ${e}`);if(s._proxy)return console.warn(`Ignoring resolver passed as options for scale: ${e}`);const a=Ff(e,s,function(t,e){if(e.data&&e.data.datasets){const i=e.data.datasets.filter((e=>e.xAxisID===t||e.yAxisID===t));if(i.length)return Bf(t,"x",i[0])||Bf(t,"y",i[0])}return{}}(e,t),Xh.scales[s.type]),l=function(t,e){return t===e?"_index_":"_value_"}(a,r),c=i.scales||{};o[e]=Uc(Object.create(null),[{axis:a},s,c[a],c[l]])})),t.data.datasets.forEach((i=>{const r=i.type||t.type,s=i.indexAxis||Hf(r,e),a=(Wh[r]||{}).scales||{};Object.keys(a).forEach((t=>{const e=function(t,e){let i=t;return"_index_"===t?i=e:"_value_"===t&&(i="x"===e?"y":"x"),i}(t,s),r=i[e+"AxisID"]||e;o[r]=o[r]||Object.create(null),Uc(o[r],[{axis:e},n[r],a[t]])}))})),Object.keys(o).forEach((t=>{const e=o[t];Uc(e,[Xh.scales[e.type],Xh.scale])})),o}(t,e)}function Vf(t){return(t=t||{}).datasets=t.datasets||[],t.labels=t.labels||[],t}const $f=new Map,Yf=new Set;function Gf(t,e){let i=$f.get(t);return i||(i=e(),$f.set(t,i),Yf.add(i)),i}const Xf=(t,e,i)=>{const n=Wc(e,i);void 0!==n&&t.add(n)};class qf{constructor(t){this._config=function(t){return(t=t||{}).data=Vf(t.data),Wf(t),t}(t),this._scopeCache=new Map,this._resolverCache=new Map}get platform(){return this._config.platform}get type(){return this._config.type}set type(t){this._config.type=t}get data(){return this._config.data}set data(t){this._config.data=Vf(t)}get options(){return this._config.options}set options(t){this._config.options=t}get plugins(){return this._config.plugins}update(){const t=this._config;this.clearCache(),Wf(t)}clearCache(){this._scopeCache.clear(),this._resolverCache.clear()}datasetScopeKeys(t){return Gf(t,(()=>[[`datasets.${t}`,""]]))}datasetAnimationScopeKeys(t,e){return Gf(`${t}.transition.${e}`,(()=>[[`datasets.${t}.transitions.${e}`,`transitions.${e}`],[`datasets.${t}`,""]]))}datasetElementScopeKeys(t,e){return Gf(`${t}-${e}`,(()=>[[`datasets.${t}.elements.${e}`,`datasets.${t}`,`elements.${e}`,""]]))}pluginScopeKeys(t){const e=t.id;return Gf(`${this.type}-plugin-${e}`,(()=>[[`plugins.${e}`,...t.additionalOptionScopes||[]]]))}_cachedScopes(t,e){const i=this._scopeCache;let n=i.get(t);return n&&!e||(n=new Map,i.set(t,n)),n}getOptionScopes(t,e,i){const{options:n,type:r}=this,o=this._cachedScopes(t,i),s=o.get(e);if(s)return s;const a=new Set;e.forEach((e=>{t&&(a.add(t),e.forEach((e=>Xf(a,t,e)))),e.forEach((t=>Xf(a,n,t))),e.forEach((t=>Xf(a,Wh[r]||{},t))),e.forEach((t=>Xf(a,Xh,t))),e.forEach((t=>Xf(a,Vh,t)))}));const l=Array.from(a);return 0===l.length&&l.push(Object.create(null)),Yf.has(e)&&o.set(e,l),l}chartOptionScopes(){const{options:t,type:e}=this;return[t,Wh[e]||{},Xh.datasets[e]||{},{type:e},Xh,Vh]}resolveNamedOptions(t,e,i,n=[""]){const r={$shared:!0},{resolver:o,subPrefixes:s}=Zf(this._resolverCache,t,n);let a=o;(function(t,e){const{isScriptable:i,isIndexable:n}=wu(t);for(const r of e){const e=i(r),o=n(r),s=(o||e)&&t[r];if(e&&(Yc(s)||Kf(s))||o&&Ec(s))return!0}return!1})(o,e)&&(r.$shared=!1,a=_u(o,i=Yc(i)?i():i,this.createResolver(t,i,s)));for(const t of e)r[t]=a[t];return r}createResolver(t,e,i=[""],n){const{resolver:r}=Zf(this._resolverCache,t,i);return Oc(e)?_u(r,e,void 0,n):r}}function Zf(t,e,i){let n=t.get(e);n||(n=new Map,t.set(e,n));const r=i.join();let o=n.get(r);return o||(o={resolver:xu(e,i),subPrefixes:i.filter((t=>!t.toLowerCase().includes("hover")))},n.set(r,o)),o}const Kf=t=>Oc(t)&&Object.getOwnPropertyNames(t).reduce(((e,i)=>e||Yc(t[i])),!1),Qf=["top","bottom","left","right","chartArea"];function Jf(t,e){return"top"===t||"bottom"===t||-1===Qf.indexOf(t)&&"x"===e}function tp(t,e){return function(i,n){return i[t]===n[t]?i[e]-n[e]:i[t]-n[t]}}function ep(t){const e=t.chart,i=e.options.animation;e.notifyPlugins("afterRender"),Lc(i&&i.onComplete,[t],e)}function ip(t){const e=t.chart,i=e.options.animation;Lc(i&&i.onProgress,[t],e)}function np(t){return Uu()&&"string"==typeof t?t=document.getElementById(t):t&&t.length&&(t=t[0]),t&&t.canvas&&(t=t.canvas),t}const rp={},op=t=>{const e=np(t);return Object.values(rp).filter((t=>t.canvas===e)).pop()};function sp(t,e,i){const n=Object.keys(t);for(const r of n){const n=+r;if(n>=e){const o=t[r];delete t[r],(i>0||n>e)&&(t[n+i]=o)}}}class ap{static defaults=Xh;static instances=rp;static overrides=Wh;static registry=jf;static version="4.3.1";static getChart=op;static register(...t){jf.add(...t),lp()}static unregister(...t){jf.remove(...t),lp()}constructor(t,e){const i=this.config=new qf(e),n=np(t),r=op(n);if(r)throw new Error("Canvas is already in use. Chart with ID '"+r.id+"' must be destroyed before the canvas with ID '"+r.canvas.id+"' can be reused.");const o=i.createResolver(i.chartOptionScopes(),this.getContext());this.platform=new(i.platform||function(t){return!Uu()||"undefined"!=typeof OffscreenCanvas&&t instanceof OffscreenCanvas?af:wf}(n)),this.platform.updateConfig(i);const s=this.platform.acquireContext(n,o.aspectRatio),a=s&&s.canvas,l=a&&a.height,c=a&&a.width;this.id=Sc(),this.ctx=s,this.canvas=a,this.width=c,this.height=l,this._options=o,this._aspectRatio=this.aspectRatio,this._layers=[],this._metasets=[],this._stacks=void 0,this.boxes=[],this.currentDevicePixelRatio=void 0,this.chartArea=void 0,this._active=[],this._lastEvent=void 0,this._listeners={},this._responsiveListeners=void 0,this._sortedMetasets=[],this.scales={},this._plugins=new zf,this.$proxies={},this._hiddenIndices={},this.attached=!1,this._animationsDisabled=void 0,this.$context=void 0,this._doResize=function(t,e){let i;return function(...n){return e?(clearTimeout(i),i=setTimeout(t,e,n)):t.apply(this,n),e}}((t=>this.update(t)),o.resizeDelay||0),this._dataChanges=[],rp[this.id]=this,s&&a?(hd.listen(this,"complete",ep),hd.listen(this,"progress",ip),this._initialize(),this.attached&&this.update()):console.error("Failed to create chart: can't acquire context from the given item")}get aspectRatio(){const{options:{aspectRatio:t,maintainAspectRatio:e},width:i,height:n,_aspectRatio:r}=this;return Dc(t)?e&&r?r:n?i/n:null:t}get data(){return this.config.data}set data(t){this.config.data=t}get options(){return this._options}set options(t){this.config.options=t}get registry(){return jf}_initialize(){return this.notifyPlugins("beforeInit"),this.options.responsive?this.resize():Xu(this,this.options.devicePixelRatio),this.bindEvents(),this.notifyPlugins("afterInit"),this}clear(){return Qh(this.canvas,this.ctx),this}stop(){return hd.stop(this),this}resize(t,e){hd.running(this)?this._resizeBeforeDraw={width:t,height:e}:this._resize(t,e)}_resize(t,e){const i=this.options,n=this.canvas,r=i.maintainAspectRatio&&this.aspectRatio,o=this.platform.getMaximumSize(n,t,e,r),s=i.devicePixelRatio||this.platform.getDevicePixelRatio(),a=this.width?"resize":"attach";this.width=o.width,this.height=o.height,this._aspectRatio=this.aspectRatio,Xu(this,s,!0)&&(this.notifyPlugins("resize",{size:o}),Lc(i.onResize,[this,o],this),this.attached&&this._doResize(a)&&this.render())}ensureScalesHaveIDs(){Rc(this.options.scales||{},((t,e)=>{t.id=e}))}buildOrUpdateScales(){const t=this.options,e=t.scales,i=this.scales,n=Object.keys(i).reduce(((t,e)=>(t[e]=!1,t)),{});let r=[];e&&(r=r.concat(Object.keys(e).map((t=>{const i=e[t],n=Ff(t,i),r="r"===n,o="x"===n;return{options:i,dposition:r?"chartArea":o?"bottom":"left",dtype:r?"radialLinear":o?"category":"linear"}})))),Rc(r,(e=>{const r=e.options,o=r.id,s=Ff(o,r),a=Cc(r.type,e.dtype);void 0!==r.position&&Jf(r.position,s)===Jf(e.dposition)||(r.position=e.dposition),n[o]=!0;let l=null;o in i&&i[o].type===a?l=i[o]:(l=new(jf.getScale(a))({id:o,type:a,ctx:this.ctx,chart:this}),i[l.id]=l),l.init(r,t)})),Rc(n,((t,e)=>{t||delete i[e]})),Rc(i,(t=>{of.configure(this,t,t.options),of.addBox(this,t)}))}_updateMetasets(){const t=this._metasets,e=this.data.datasets.length,i=t.length;if(t.sort(((t,e)=>t.index-e.index)),i>e){for(let t=e;t<i;++t)this._destroyDatasetMeta(t);t.splice(e,i-e)}this._sortedMetasets=t.slice(0).sort(tp("order","index"))}_removeUnreferencedMetasets(){const{_metasets:t,data:{datasets:e}}=this;t.length>e.length&&delete this._stacks,t.forEach(((t,i)=>{0===e.filter((e=>e===t._dataset)).length&&this._destroyDatasetMeta(i)}))}buildOrUpdateControllers(){const t=[],e=this.data.datasets;let i,n;for(this._removeUnreferencedMetasets(),i=0,n=e.length;i<n;i++){const n=e[i];let r=this.getDatasetMeta(i);const o=n.type||this.config.type;if(r.type&&r.type!==o&&(this._destroyDatasetMeta(i),r=this.getDatasetMeta(i)),r.type=o,r.indexAxis=n.indexAxis||Hf(o,this.options),r.order=n.order||0,r.index=i,r.label=""+n.label,r.visible=this.isDatasetVisible(i),r.controller)r.controller.updateIndex(i),r.controller.linkScales();else{const e=jf.getController(o),{datasetElementType:n,dataElementType:s}=Xh.datasets[o];Object.assign(e,{dataElementType:jf.getElement(s),datasetElementType:n&&jf.getElement(n)}),r.controller=new e(this,i),t.push(r.controller)}}return this._updateMetasets(),t}_resetElements(){Rc(this.data.datasets,((t,e)=>{this.getDatasetMeta(e).controller.reset()}),this)}reset(){this._resetElements(),this.notifyPlugins("reset")}update(t){const e=this.config;e.update();const i=this._options=e.createResolver(e.chartOptionScopes(),this.getContext()),n=this._animationsDisabled=!i.animation;if(this._updateScales(),this._checkEventBindings(),this._updateHiddenIndices(),this._plugins.invalidate(),!1===this.notifyPlugins("beforeUpdate",{mode:t,cancelable:!0}))return;const r=this.buildOrUpdateControllers();this.notifyPlugins("beforeElementsUpdate");let o=0;for(let t=0,e=this.data.datasets.length;t<e;t++){const{controller:e}=this.getDatasetMeta(t),i=!n&&-1===r.indexOf(e);e.buildOrUpdateElements(i),o=Math.max(+e.getMaxOverflow(),o)}o=this._minPadding=i.layout.autoPadding?o:0,this._updateLayout(o),n||Rc(r,(t=>{t.reset()})),this._updateDatasets(t),this.notifyPlugins("afterUpdate",{mode:t}),this._layers.sort(tp("z","_idx"));const{_active:s,_lastEvent:a}=this;a?this._eventHandler(a,!0):s.length&&this._updateHoverStyles(s,s,!0),this.render()}_updateScales(){Rc(this.scales,(t=>{of.removeBox(this,t)})),this.ensureScalesHaveIDs(),this.buildOrUpdateScales()}_checkEventBindings(){const t=this.options,e=new Set(Object.keys(this._listeners)),i=new Set(t.events);Gc(e,i)&&!!this._responsiveListeners===t.responsive||(this.unbindEvents(),this.bindEvents())}_updateHiddenIndices(){const{_hiddenIndices:t}=this,e=this._getUniformDataChanges()||[];for(const{method:i,start:n,count:r}of e)sp(t,n,"_removeElements"===i?-r:r)}_getUniformDataChanges(){const t=this._dataChanges;if(!t||!t.length)return;this._dataChanges=[];const e=this.data.datasets.length,i=e=>new Set(t.filter((t=>t[0]===e)).map(((t,e)=>e+","+t.splice(1).join(",")))),n=i(0);for(let t=1;t<e;t++)if(!Gc(n,i(t)))return;return Array.from(n).map((t=>t.split(","))).map((t=>({method:t[1],start:+t[2],count:+t[3]})))}_updateLayout(t){if(!1===this.notifyPlugins("beforeLayout",{cancelable:!0}))return;of.update(this,this.width,this.height,t);const e=this.chartArea,i=e.width<=0||e.height<=0;this._layers=[],Rc(this.boxes,(t=>{i&&"chartArea"===t.position||(t.configure&&t.configure(),this._layers.push(...t._layers()))}),this),this._layers.forEach(((t,e)=>{t._idx=e})),this.notifyPlugins("afterLayout")}_updateDatasets(t){if(!1!==this.notifyPlugins("beforeDatasetsUpdate",{mode:t,cancelable:!0})){for(let t=0,e=this.data.datasets.length;t<e;++t)this.getDatasetMeta(t).controller.configure();for(let e=0,i=this.data.datasets.length;e<i;++e)this._updateDataset(e,Yc(t)?t({datasetIndex:e}):t);this.notifyPlugins("afterDatasetsUpdate",{mode:t})}}_updateDataset(t,e){const i=this.getDatasetMeta(t),n={meta:i,index:t,mode:e,cancelable:!0};!1!==this.notifyPlugins("beforeDatasetUpdate",n)&&(i.controller._update(e),n.cancelable=!1,this.notifyPlugins("afterDatasetUpdate",n))}render(){!1!==this.notifyPlugins("beforeRender",{cancelable:!0})&&(hd.has(this)?this.attached&&!hd.running(this)&&hd.start(this):(this.draw(),ep({chart:this})))}draw(){let t;if(this._resizeBeforeDraw){const{width:t,height:e}=this._resizeBeforeDraw;this._resize(t,e),this._resizeBeforeDraw=null}if(this.clear(),this.width<=0||this.height<=0)return;if(!1===this.notifyPlugins("beforeDraw",{cancelable:!0}))return;const e=this._layers;for(t=0;t<e.length&&e[t].z<=0;++t)e[t].draw(this.chartArea);for(this._drawDatasets();t<e.length;++t)e[t].draw(this.chartArea);this.notifyPlugins("afterDraw")}_getSortedDatasetMetas(t){const e=this._sortedMetasets,i=[];let n,r;for(n=0,r=e.length;n<r;++n){const r=e[n];t&&!r.visible||i.push(r)}return i}getSortedVisibleDatasetMetas(){return this._getSortedDatasetMetas(!0)}_drawDatasets(){if(!1===this.notifyPlugins("beforeDatasetsDraw",{cancelable:!0}))return;const t=this.getSortedVisibleDatasetMetas();for(let e=t.length-1;e>=0;--e)this._drawDataset(t[e]);this.notifyPlugins("afterDatasetsDraw")}_drawDataset(t){const e=this.ctx,i=t._clip,n=!i.disabled,r=function(t){const{xScale:e,yScale:i}=t;if(e&&i)return{left:e.left,right:e.right,top:i.top,bottom:i.bottom}}(t)||this.chartArea,o={meta:t,index:t.index,cancelable:!0};!1!==this.notifyPlugins("beforeDatasetDraw",o)&&(n&&iu(e,{left:!1===i.left?0:r.left-i.left,right:!1===i.right?this.width:r.right+i.right,top:!1===i.top?0:r.top-i.top,bottom:!1===i.bottom?this.height:r.bottom+i.bottom}),t.controller.draw(),n&&nu(e),o.cancelable=!1,this.notifyPlugins("afterDatasetDraw",o))}isPointInArea(t){return eu(t,this.chartArea,this._minPadding)}getElementsAtEventForMode(t,e,i,n){const r=Yd.modes[e];return"function"==typeof r?r(this,t,i,n):[]}getDatasetMeta(t){const e=this.data.datasets[t],i=this._metasets;let n=i.filter((t=>t&&t._dataset===e)).pop();return n||(n={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null,order:e&&e.order||0,index:t,_dataset:e,_parsed:[],_sorted:!1},i.push(n)),n}getContext(){return this.$context||(this.$context=vu(null,{chart:this,type:"chart"}))}getVisibleDatasetCount(){return this.getSortedVisibleDatasetMetas().length}isDatasetVisible(t){const e=this.data.datasets[t];if(!e)return!1;const i=this.getDatasetMeta(t);return"boolean"==typeof i.hidden?!i.hidden:!e.hidden}setDatasetVisibility(t,e){this.getDatasetMeta(t).hidden=!e}toggleDataVisibility(t){this._hiddenIndices[t]=!this._hiddenIndices[t]}getDataVisibility(t){return!this._hiddenIndices[t]}_updateVisibility(t,e,i){const n=i?"show":"hide",r=this.getDatasetMeta(t),o=r.controller._resolveAnimations(void 0,n);$c(e)?(r.data[e].hidden=!i,this.update()):(this.setDatasetVisibility(t,i),o.update(r,{visible:i}),this.update((e=>e.datasetIndex===t?n:void 0)))}hide(t,e){this._updateVisibility(t,e,!1)}show(t,e){this._updateVisibility(t,e,!0)}_destroyDatasetMeta(t){const e=this._metasets[t];e&&e.controller&&e.controller._destroy(),delete this._metasets[t]}_stop(){let t,e;for(this.stop(),hd.remove(this),t=0,e=this.data.datasets.length;t<e;++t)this._destroyDatasetMeta(t)}destroy(){this.notifyPlugins("beforeDestroy");const{canvas:t,ctx:e}=this;this._stop(),this.config.clearCache(),t&&(this.unbindEvents(),Qh(t,e),this.platform.releaseContext(e),this.canvas=null,this.ctx=null),delete rp[this.id],this.notifyPlugins("afterDestroy")}toBase64Image(...t){return this.canvas.toDataURL(...t)}bindEvents(){this.bindUserEvents(),this.options.responsive?this.bindResponsiveEvents():this.attached=!0}bindUserEvents(){const t=this._listeners,e=this.platform,i=(i,n)=>{e.addEventListener(this,i,n),t[i]=n},n=(t,e,i)=>{t.offsetX=e,t.offsetY=i,this._eventHandler(t)};Rc(this.options.events,(t=>i(t,n)))}bindResponsiveEvents(){this._responsiveListeners||(this._responsiveListeners={});const t=this._responsiveListeners,e=this.platform,i=(i,n)=>{e.addEventListener(this,i,n),t[i]=n},n=(i,n)=>{t[i]&&(e.removeEventListener(this,i,n),delete t[i])},r=(t,e)=>{this.canvas&&this.resize(t,e)};let o;const s=()=>{n("attach",s),this.attached=!0,this.resize(),i("resize",r),i("detach",o)};o=()=>{this.attached=!1,n("resize",r),this._stop(),this._resize(0,0),i("attach",s)},e.isAttached(this.canvas)?s():o()}unbindEvents(){Rc(this._listeners,((t,e)=>{this.platform.removeEventListener(this,e,t)})),this._listeners={},Rc(this._responsiveListeners,((t,e)=>{this.platform.removeEventListener(this,e,t)})),this._responsiveListeners=void 0}updateHoverStyle(t,e,i){const n=i?"set":"remove";let r,o,s,a;for("dataset"===e&&(r=this.getDatasetMeta(t[0].datasetIndex),r.controller["_"+n+"DatasetHoverStyle"]()),s=0,a=t.length;s<a;++s){o=t[s];const e=o&&this.getDatasetMeta(o.datasetIndex).controller;e&&e[n+"HoverStyle"](o.element,o.datasetIndex,o.index)}}getActiveElements(){return this._active||[]}setActiveElements(t){const e=this._active||[],i=t.map((({datasetIndex:t,index:e})=>{const i=this.getDatasetMeta(t);if(!i)throw new Error("No dataset found at index "+t);return{datasetIndex:t,element:i.data[e],index:e}}));!jc(i,e)&&(this._active=i,this._lastEvent=null,this._updateHoverStyles(i,e))}notifyPlugins(t,e,i){return this._plugins.notify(this,t,e,i)}isPluginEnabled(t){return 1===this._plugins._cache.filter((e=>e.plugin.id===t)).length}_updateHoverStyles(t,e,i){const n=this.options.hover,r=(t,e)=>t.filter((t=>!e.some((e=>t.datasetIndex===e.datasetIndex&&t.index===e.index)))),o=r(e,t),s=i?t:r(t,e);o.length&&this.updateHoverStyle(o,n.mode,!1),s.length&&n.mode&&this.updateHoverStyle(s,n.mode,!0)}_eventHandler(t,e){const i={event:t,replay:e,cancelable:!0,inChartArea:this.isPointInArea(t)},n=e=>(e.options.events||this.options.events).includes(t.native.type);if(!1===this.notifyPlugins("beforeEvent",i,n))return;const r=this._handleEvent(t,e,i.inChartArea);return i.cancelable=!1,this.notifyPlugins("afterEvent",i,n),(r||i.changed)&&this.render(),this}_handleEvent(t,e,i){const{_active:n=[],options:r}=this,o=e,s=this._getActiveElements(t,n,i,o),a=function(t){return"mouseup"===t.type||"click"===t.type||"contextmenu"===t.type}(t),l=function(t,e,i,n){return i&&"mouseout"!==t.type?n?e:t:null}(t,this._lastEvent,i,a);i&&(this._lastEvent=null,Lc(r.onHover,[t,s,this],this),a&&Lc(r.onClick,[t,s,this],this));const c=!jc(s,n);return(c||e)&&(this._active=s,this._updateHoverStyles(s,n,e)),this._lastEvent=l,c}_getActiveElements(t,e,i,n){if("mouseout"===t.type)return[];if(!i)return e;const r=this.options.hover;return this.getElementsAtEventForMode(t,r.mode,r,n)}}function lp(){return Rc(ap.instances,(t=>t._plugins.invalidate()))}function cp(t,e,i,n){return{x:i+t*Math.cos(e),y:n+t*Math.sin(e)}}function hp(t,e,i,n,r,o){const{x:s,y:a,startAngle:l,pixelMargin:c,innerRadius:h}=e,u=Math.max(e.outerRadius+n+i-c,0),d=h>0?h+n+i+c:0;let f=0;const p=r-l;if(n){const t=((h>0?h-n:0)+(u>0?u-n:0))/2;f=(p-(0!==t?p*t/(t+n):p))/2}const g=(p-Math.max(.001,p*u-i/Xc)/u)/2,m=l+g+f,y=r-g-f,{outerStart:b,outerEnd:v,innerStart:x,innerEnd:_}=function(t,e,i,n){const r=function(t){return fu(t,["outerStart","outerEnd","innerStart","innerEnd"])}(t.options.borderRadius),o=(i-e)/2,s=Math.min(o,n*e/2),a=t=>{const e=(i-Math.min(o,t))*n/2;return mh(t,0,Math.min(o,e))};return{outerStart:a(r.outerStart),outerEnd:a(r.outerEnd),innerStart:mh(r.innerStart,0,s),innerEnd:mh(r.innerEnd,0,s)}}(e,d,u,y-m),w=u-b,M=u-v,k=m+b/w,S=y-v/M,D=d+x,E=d+_,O=m+x/D,P=y-_/E;if(t.beginPath(),o){const e=(k+S)/2;if(t.arc(s,a,u,k,e),t.arc(s,a,u,e,S),v>0){const e=cp(M,S,s,a);t.arc(e.x,e.y,v,S,y+Jc)}const i=cp(E,y,s,a);if(t.lineTo(i.x,i.y),_>0){const e=cp(E,P,s,a);t.arc(e.x,e.y,_,y+Jc,P+Math.PI)}const n=(y-_/d+(m+x/d))/2;if(t.arc(s,a,d,y-_/d,n,!0),t.arc(s,a,d,n,m+x/d,!0),x>0){const e=cp(D,O,s,a);t.arc(e.x,e.y,x,O+Math.PI,m-Jc)}const r=cp(w,m,s,a);if(t.lineTo(r.x,r.y),b>0){const e=cp(w,k,s,a);t.arc(e.x,e.y,b,m-Jc,k)}}else{t.moveTo(s,a);const e=Math.cos(k)*u+s,i=Math.sin(k)*u+a;t.lineTo(e,i);const n=Math.cos(S)*u+s,r=Math.sin(S)*u+a;t.lineTo(n,r)}t.closePath()}function up(t,e,i=e){t.lineCap=Cc(i.borderCapStyle,e.borderCapStyle),t.setLineDash(Cc(i.borderDash,e.borderDash)),t.lineDashOffset=Cc(i.borderDashOffset,e.borderDashOffset),t.lineJoin=Cc(i.borderJoinStyle,e.borderJoinStyle),t.lineWidth=Cc(i.borderWidth,e.borderWidth),t.strokeStyle=Cc(i.borderColor,e.borderColor)}function dp(t,e,i){t.lineTo(i.x,i.y)}function fp(t,e,i={}){const n=t.length,{start:r=0,end:o=n-1}=i,{start:s,end:a}=e,l=Math.max(r,s),c=Math.min(o,a),h=r<s&&o<s||r>a&&o>a;return{count:n,start:l,loop:e.loop,ilen:c<l&&!h?n+c-l:c-l}}function pp(t,e,i,n){const{points:r,options:o}=e,{count:s,start:a,loop:l,ilen:c}=fp(r,i,n),h=function(t){return t.stepped?ru:t.tension||"monotone"===t.cubicInterpolationMode?ou:dp}(o);let u,d,f,{move:p=!0,reverse:g}=n||{};for(u=0;u<=c;++u)d=r[(a+(g?c-u:u))%s],d.skip||(p?(t.moveTo(d.x,d.y),p=!1):h(t,f,d,g,o.stepped),f=d);return l&&(d=r[(a+(g?c:0))%s],h(t,f,d,g,o.stepped)),!!l}function gp(t,e,i,n){const r=e.points,{count:o,start:s,ilen:a}=fp(r,i,n),{move:l=!0,reverse:c}=n||{};let h,u,d,f,p,g,m=0,y=0;const b=t=>(s+(c?a-t:t))%o,v=()=>{f!==p&&(t.lineTo(m,p),t.lineTo(m,f),t.lineTo(m,g))};for(l&&(u=r[b(0)],t.moveTo(u.x,u.y)),h=0;h<=a;++h){if(u=r[b(h)],u.skip)continue;const e=u.x,i=u.y,n=0|e;n===d?(i<f?f=i:i>p&&(p=i),m=(y*m+e)/++y):(v(),t.lineTo(e,i),d=n,y=0,f=p=i),g=i}v()}function mp(t){const e=t.options,i=e.borderDash&&e.borderDash.length;return t._decimated||t._loop||e.tension||"monotone"===e.cubicInterpolationMode||e.stepped||i?pp:gp}const yp="function"==typeof Path2D;class bp extends Mf{static id="line";static defaults={borderCapStyle:"butt",borderDash:[],borderDashOffset:0,borderJoinStyle:"miter",borderWidth:3,capBezierPoints:!0,cubicInterpolationMode:"default",fill:!1,spanGaps:!1,stepped:!1,tension:0};static defaultRoutes={backgroundColor:"backgroundColor",borderColor:"borderColor"};static descriptors={_scriptable:!0,_indexable:t=>"borderDash"!==t&&"fill"!==t};constructor(t){super(),this.animated=!0,this.options=void 0,this._chart=void 0,this._loop=void 0,this._fullLoop=void 0,this._path=void 0,this._points=void 0,this._segments=void 0,this._decimated=!1,this._pointsUpdated=!1,this._datasetIndex=void 0,t&&Object.assign(this,t)}updateControlPoints(t,e){const i=this.options;if((i.tension||"monotone"===i.cubicInterpolationMode)&&!i.stepped&&!this._pointsUpdated){const n=i.spanGaps?this._loop:this._fullLoop;Hu(this._points,i,t,n,e),this._pointsUpdated=!0}}set points(t){this._points=t,delete this._segments,delete this._path,this._pointsUpdated=!1}get points(){return this._points}get segments(){return this._segments||(this._segments=function(t,e){const i=t.points,n=t.options.spanGaps,r=i.length;if(!r)return[];const o=!!t._loop,{start:s,end:a}=function(t,e,i,n){let r=0,o=e-1;if(i&&!n)for(;r<e&&!t[r].skip;)r++;for(;r<e&&t[r].skip;)r++;for(r%=e,i&&(o+=r);o>r&&t[o%e].skip;)o--;return o%=e,{start:r,end:o}}(i,r,o,n);return function(t,e,i,n){return n&&n.setContext&&i?function(t,e,i,n){const r=t._chart.getContext(),o=ad(t.options),{_datasetIndex:s,options:{spanGaps:a}}=t,l=i.length,c=[];let h=o,u=e[0].start,d=u;function f(t,e,n,r){const o=a?-1:1;if(t!==e){for(t+=l;i[t%l].skip;)t-=o;for(;i[e%l].skip;)e+=o;t%l!=e%l&&(c.push({start:t%l,end:e%l,loop:n,style:r}),h=r,u=e%l)}}for(const t of e){u=a?u:t.start;let e,o=i[u%l];for(d=u+1;d<=t.end;d++){const a=i[d%l];e=ad(n.setContext(vu(r,{type:"segment",p0:o,p1:a,p0DataIndex:(d-1)%l,p1DataIndex:d%l,datasetIndex:s}))),ld(e,h)&&f(u,d-1,t.loop,h),o=a,h=e}u<d-1&&f(u,d-1,t.loop,h)}return c}(t,e,i,n):e}(t,!0===n?[{start:s,end:a,loop:o}]:function(t,e,i,n){const r=t.length,o=[];let s,a=e,l=t[e];for(s=e+1;s<=i;++s){const i=t[s%r];i.skip||i.stop?l.skip||(n=!1,o.push({start:e%r,end:(s-1)%r,loop:n}),e=a=i.stop?s:null):(a=s,l.skip&&(e=s)),l=i}return null!==a&&o.push({start:e%r,end:a%r,loop:n}),o}(i,s,a<s?a+r:a,!!t._fullLoop&&0===s&&a===r-1),i,e)}(this,this.options.segment))}first(){const t=this.segments,e=this.points;return t.length&&e[t[0].start]}last(){const t=this.segments,e=this.points,i=t.length;return i&&e[t[i-1].end]}interpolate(t,e){const i=this.options,n=t[e],r=this.points,o=sd(this,{property:e,start:n,end:n});if(!o.length)return;const s=[],a=function(t){return t.stepped?Qu:t.tension||"monotone"===t.cubicInterpolationMode?Ju:Ku}(i);let l,c;for(l=0,c=o.length;l<c;++l){const{start:c,end:h}=o[l],u=r[c],d=r[h];if(u===d){s.push(u);continue}const f=a(u,d,Math.abs((n-u[e])/(d[e]-u[e])),i.stepped);f[e]=t[e],s.push(f)}return 1===s.length?s[0]:s}pathSegment(t,e,i){return mp(this)(t,this,e,i)}path(t,e,i){const n=this.segments,r=mp(this);let o=this._loop;e=e||0,i=i||this.points.length-e;for(const s of n)o&=r(t,this,s,{start:e,end:e+i-1});return!!o}draw(t,e,i,n){const r=this.options||{};(this.points||[]).length&&r.borderWidth&&(t.save(),function(t,e,i,n){yp&&!e.options.segment?function(t,e,i,n){let r=e._path;r||(r=e._path=new Path2D,e.path(r,i,n)&&r.closePath()),up(t,e.options),t.stroke(r)}(t,e,i,n):function(t,e,i,n){const{segments:r,options:o}=e,s=mp(e);for(const a of r)up(t,o,a.style),t.beginPath(),s(t,e,a,{start:i,end:i+n-1})&&t.closePath(),t.stroke()}(t,e,i,n)}(t,this,i,n),t.restore()),this.animated&&(this._pointsUpdated=!1,this._path=void 0)}}function vp(t,e,i,n){const r=t.options,{[i]:o}=t.getProps([i],n);return Math.abs(e-o)<r.radius+r.hitRadius}function xp(t,e){const{x:i,y:n,base:r,width:o,height:s}=t.getProps(["x","y","base","width","height"],e);let a,l,c,h,u;return t.horizontal?(u=s/2,a=Math.min(i,r),l=Math.max(i,r),c=n-u,h=n+u):(u=o/2,a=i-u,l=i+u,c=Math.min(n,r),h=Math.max(n,r)),{left:a,top:c,right:l,bottom:h}}function _p(t,e,i,n){return t?0:mh(e,i,n)}function wp(t,e,i,n){const r=null===e,o=null===i,s=t&&!(r&&o)&&xp(t,n);return s&&(r||yh(e,s.left,s.right))&&(o||yh(i,s.top,s.bottom))}function Mp(t,e){t.rect(e.x,e.y,e.w,e.h)}function kp(t,e,i={}){const n=t.x!==i.x?-e:0,r=t.y!==i.y?-e:0,o=(t.x+t.w!==i.x+i.w?e:0)-n,s=(t.y+t.h!==i.y+i.h?e:0)-r;return{x:t.x+n,y:t.y+r,w:t.w+o,h:t.h+s,radius:t.radius}}var Sp=Object.freeze({__proto__:null,ArcElement:class extends Mf{static id="arc";static defaults={borderAlign:"center",borderColor:"#fff",borderDash:[],borderDashOffset:0,borderJoinStyle:void 0,borderRadius:0,borderWidth:2,offset:0,spacing:0,angle:void 0,circular:!0};static defaultRoutes={backgroundColor:"backgroundColor"};static descriptors={_scriptable:!0,_indexable:t=>"borderDash"!==t};circumference;endAngle;fullCircles;innerRadius;outerRadius;pixelMargin;startAngle;constructor(t){super(),this.options=void 0,this.circumference=void 0,this.startAngle=void 0,this.endAngle=void 0,this.innerRadius=void 0,this.outerRadius=void 0,this.pixelMargin=0,this.fullCircles=0,t&&Object.assign(this,t)}inRange(t,e,i){const n=this.getProps(["x","y"],i),{angle:r,distance:o}=uh(n,{x:t,y:e}),{startAngle:s,endAngle:a,innerRadius:l,outerRadius:c,circumference:h}=this.getProps(["startAngle","endAngle","innerRadius","outerRadius","circumference"],i),u=(this.options.spacing+this.options.borderWidth)/2,d=Cc(h,a-s)>=qc||gh(r,s,a),f=yh(o,l+u,c+u);return d&&f}getCenterPoint(t){const{x:e,y:i,startAngle:n,endAngle:r,innerRadius:o,outerRadius:s}=this.getProps(["x","y","startAngle","endAngle","innerRadius","outerRadius"],t),{offset:a,spacing:l}=this.options,c=(n+r)/2,h=(o+s+l+a)/2;return{x:e+Math.cos(c)*h,y:i+Math.sin(c)*h}}tooltipPosition(t){return this.getCenterPoint(t)}draw(t){const{options:e,circumference:i}=this,n=(e.offset||0)/4,r=(e.spacing||0)/2,o=e.circular;if(this.pixelMargin="inner"===e.borderAlign?.33:0,this.fullCircles=i>qc?Math.floor(i/qc):0,0===i||this.innerRadius<0||this.outerRadius<0)return;t.save();const s=(this.startAngle+this.endAngle)/2;t.translate(Math.cos(s)*n,Math.sin(s)*n);const a=n*(1-Math.sin(Math.min(Xc,i||0)));t.fillStyle=e.backgroundColor,t.strokeStyle=e.borderColor,function(t,e,i,n,r){const{fullCircles:o,startAngle:s,circumference:a}=e;let l=e.endAngle;if(o){hp(t,e,i,n,l,r);for(let e=0;e<o;++e)t.fill();isNaN(a)||(l=s+(a%qc||qc))}hp(t,e,i,n,l,r),t.fill()}(t,this,a,r,o),function(t,e,i,n,r){const{fullCircles:o,startAngle:s,circumference:a,options:l}=e,{borderWidth:c,borderJoinStyle:h,borderDash:u,borderDashOffset:d}=l,f="inner"===l.borderAlign;if(!c)return;t.setLineDash(u||[]),t.lineDashOffset=d,f?(t.lineWidth=2*c,t.lineJoin=h||"round"):(t.lineWidth=c,t.lineJoin=h||"bevel");let p=e.endAngle;if(o){hp(t,e,i,n,p,r);for(let e=0;e<o;++e)t.stroke();isNaN(a)||(p=s+(a%qc||qc))}f&&function(t,e,i){const{startAngle:n,pixelMargin:r,x:o,y:s,outerRadius:a,innerRadius:l}=e;let c=r/a;t.beginPath(),t.arc(o,s,a,n-c,i+c),l>r?(c=r/l,t.arc(o,s,l,i+c,n-c,!0)):t.arc(o,s,r,i+Jc,n-Jc),t.closePath(),t.clip()}(t,e,p),o||(hp(t,e,i,n,p,r),t.stroke())}(t,this,a,r,o),t.restore()}},BarElement:class extends Mf{static id="bar";static defaults={borderSkipped:"start",borderWidth:0,borderRadius:0,inflateAmount:"auto",pointStyle:void 0};static defaultRoutes={backgroundColor:"backgroundColor",borderColor:"borderColor"};constructor(t){super(),this.options=void 0,this.horizontal=void 0,this.base=void 0,this.width=void 0,this.height=void 0,this.inflateAmount=void 0,t&&Object.assign(this,t)}draw(t){const{inflateAmount:e,options:{borderColor:i,backgroundColor:n}}=this,{inner:r,outer:o}=function(t){const e=xp(t),i=e.right-e.left,n=e.bottom-e.top,r=function(t,e,i){const n=t.options.borderWidth,r=t.borderSkipped,o=pu(n);return{t:_p(r.top,o.top,0,i),r:_p(r.right,o.right,0,e),b:_p(r.bottom,o.bottom,0,i),l:_p(r.left,o.left,0,e)}}(t,i/2,n/2),o=function(t,e,i){const{enableBorderRadius:n}=t.getProps(["enableBorderRadius"]),r=t.options.borderRadius,o=gu(r),s=Math.min(e,i),a=t.borderSkipped,l=n||Oc(r);return{topLeft:_p(!l||a.top||a.left,o.topLeft,0,s),topRight:_p(!l||a.top||a.right,o.topRight,0,s),bottomLeft:_p(!l||a.bottom||a.left,o.bottomLeft,0,s),bottomRight:_p(!l||a.bottom||a.right,o.bottomRight,0,s)}}(t,i/2,n/2);return{outer:{x:e.left,y:e.top,w:i,h:n,radius:o},inner:{x:e.left+r.l,y:e.top+r.t,w:i-r.l-r.r,h:n-r.t-r.b,radius:{topLeft:Math.max(0,o.topLeft-Math.max(r.t,r.l)),topRight:Math.max(0,o.topRight-Math.max(r.t,r.r)),bottomLeft:Math.max(0,o.bottomLeft-Math.max(r.b,r.l)),bottomRight:Math.max(0,o.bottomRight-Math.max(r.b,r.r))}}}}(this),s=(a=o.radius).topLeft||a.topRight||a.bottomLeft||a.bottomRight?cu:Mp;var a;t.save(),o.w===r.w&&o.h===r.h||(t.beginPath(),s(t,kp(o,e,r)),t.clip(),s(t,kp(r,-e,o)),t.fillStyle=i,t.fill("evenodd")),t.beginPath(),s(t,kp(r,e)),t.fillStyle=n,t.fill(),t.restore()}inRange(t,e,i){return wp(this,t,e,i)}inXRange(t,e){return wp(this,t,null,e)}inYRange(t,e){return wp(this,null,t,e)}getCenterPoint(t){const{x:e,y:i,base:n,horizontal:r}=this.getProps(["x","y","base","horizontal"],t);return{x:r?(e+n)/2:e,y:r?i:(i+n)/2}}getRange(t){return"x"===t?this.width/2:this.height/2}},LineElement:bp,PointElement:class extends Mf{static id="point";parsed;skip;stop;static defaults={borderWidth:1,hitRadius:1,hoverBorderWidth:1,hoverRadius:4,pointStyle:"circle",radius:3,rotation:0};static defaultRoutes={backgroundColor:"backgroundColor",borderColor:"borderColor"};constructor(t){super(),this.options=void 0,this.parsed=void 0,this.skip=void 0,this.stop=void 0,t&&Object.assign(this,t)}inRange(t,e,i){const n=this.options,{x:r,y:o}=this.getProps(["x","y"],i);return Math.pow(t-r,2)+Math.pow(e-o,2)<Math.pow(n.hitRadius+n.radius,2)}inXRange(t,e){return vp(this,t,"x",e)}inYRange(t,e){return vp(this,t,"y",e)}getCenterPoint(t){const{x:e,y:i}=this.getProps(["x","y"],t);return{x:e,y:i}}size(t){let e=(t=t||this.options||{}).radius||0;return e=Math.max(e,e&&t.hoverRadius||0),2*(e+(e&&t.borderWidth||0))}draw(t,e){const i=this.options;this.skip||i.radius<.1||!eu(this,e,this.size(i)/2)||(t.strokeStyle=i.borderColor,t.lineWidth=i.borderWidth,t.fillStyle=i.backgroundColor,Jh(t,i,this.x,this.y))}getRange(){const t=this.options||{};return t.radius+t.hitRadius}}});const Dp=["rgb(54, 162, 235)","rgb(255, 99, 132)","rgb(255, 159, 64)","rgb(255, 205, 86)","rgb(75, 192, 192)","rgb(153, 102, 255)","rgb(201, 203, 207)"],Ep=Dp.map((t=>t.replace("rgb(","rgba(").replace(")",", 0.5)")));function Op(t){return Dp[t%Dp.length]}function Pp(t){return Ep[t%Ep.length]}function Ap(t){let e;for(e in t)if(t[e].borderColor||t[e].backgroundColor)return!0;return!1}var Cp={id:"colors",defaults:{enabled:!0,forceOverride:!1},beforeLayout(t,e,i){if(!i.enabled)return;const{data:{datasets:n},options:r}=t.config,{elements:o}=r;if(!i.forceOverride&&(Ap(n)||(s=r)&&(s.borderColor||s.backgroundColor)||o&&Ap(o)))return;var s;const a=function(t){let e=0;return(i,n)=>{const r=t.getDatasetMeta(n).controller;r instanceof jd?e=function(t,e){return t.backgroundColor=t.data.map((()=>Op(e++))),e}(i,e):r instanceof zd?e=function(t,e){return t.backgroundColor=t.data.map((()=>Pp(e++))),e}(i,e):r&&(e=function(t,e){return t.borderColor=Op(e),t.backgroundColor=Pp(e),++e}(i,e))}}(t);n.forEach(a)}};function Tp(t){if(t._decimated){const e=t._data;delete t._decimated,delete t._data,Object.defineProperty(t,"data",{configurable:!0,enumerable:!0,writable:!0,value:e})}}function Lp(t){t.data.datasets.forEach((t=>{Tp(t)}))}var Rp={id:"decimation",defaults:{algorithm:"min-max",enabled:!1},beforeElementsUpdate:(t,e,i)=>{if(!i.enabled)return void Lp(t);const n=t.width;t.data.datasets.forEach(((e,r)=>{const{_data:o,indexAxis:s}=e,a=t.getDatasetMeta(r),l=o||e.data;if("y"===bu([s,t.options.indexAxis]))return;if(!a.controller.supportsDecimation)return;const c=t.scales[a.xAxisID];if("linear"!==c.type&&"time"!==c.type)return;if(t.options.parsing)return;let h,{start:u,count:d}=function(t,e){const i=e.length;let n,r=0;const{iScale:o}=t,{min:s,max:a,minDefined:l,maxDefined:c}=o.getUserBounds();return l&&(r=mh(vh(e,o.axis,s).lo,0,i-1)),n=c?mh(vh(e,o.axis,a).hi+1,r,i)-r:i-r,{start:r,count:n}}(a,l);if(d<=(i.threshold||4*n))Tp(e);else{switch(Dc(o)&&(e._data=l,delete e.data,Object.defineProperty(e,"data",{configurable:!0,enumerable:!0,get:function(){return this._decimated},set:function(t){this._data=t}})),i.algorithm){case"lttb":h=function(t,e,i,n,r){const o=r.samples||n;if(o>=i)return t.slice(e,e+i);const s=[],a=(i-2)/(o-2);let l=0;const c=e+i-1;let h,u,d,f,p,g=e;for(s[l++]=t[g],h=0;h<o-2;h++){let n,r=0,o=0;const c=Math.floor((h+1)*a)+1+e,m=Math.min(Math.floor((h+2)*a)+1,i)+e,y=m-c;for(n=c;n<m;n++)r+=t[n].x,o+=t[n].y;r/=y,o/=y;const b=Math.floor(h*a)+1+e,v=Math.min(Math.floor((h+1)*a)+1,i)+e,{x,y:_}=t[g];for(d=f=-1,n=b;n<v;n++)f=.5*Math.abs((x-r)*(t[n].y-_)-(x-t[n].x)*(o-_)),f>d&&(d=f,u=t[n],p=n);s[l++]=u,g=p}return s[l++]=t[c],s}(l,u,d,n,i);break;case"min-max":h=function(t,e,i,n){let r,o,s,a,l,c,h,u,d,f,p=0,g=0;const m=[],y=e+i-1,b=t[e].x,v=t[y].x-b;for(r=e;r<e+i;++r){o=t[r],s=(o.x-b)/v*n,a=o.y;const e=0|s;if(e===l)a<d?(d=a,c=r):a>f&&(f=a,h=r),p=(g*p+o.x)/++g;else{const i=r-1;if(!Dc(c)&&!Dc(h)){const e=Math.min(c,h),n=Math.max(c,h);e!==u&&e!==i&&m.push({...t[e],x:p}),n!==u&&n!==i&&m.push({...t[n],x:p})}r>0&&i!==u&&m.push(t[i]),m.push(o),l=e,g=0,d=f=a,c=h=u=r}}return m}(l,u,d,n);break;default:throw new Error(`Unsupported decimation algorithm '${i.algorithm}'`)}e._decimated=h}}))},destroy(t){Lp(t)}};function jp(t,e,i,n){if(n)return;let r=e[t],o=i[t];return"angle"===t&&(r=ph(r),o=ph(o)),{property:t,start:r,end:o}}function zp(t,e,i){for(;e>t;e--){const t=i[e];if(!isNaN(t.x)&&!isNaN(t.y))break}return e}function Np(t,e,i,n){return t&&e?n(t[i],e[i]):t?t[i]:e?e[i]:0}function Ip(t,e){let i=[],n=!1;return Ec(t)?(n=!0,i=t):i=function(t,e){const{x:i=null,y:n=null}=t||{},r=e.points,o=[];return e.segments.forEach((({start:t,end:e})=>{e=zp(t,e,r);const s=r[t],a=r[e];null!==n?(o.push({x:s.x,y:n}),o.push({x:a.x,y:n})):null!==i&&(o.push({x:i,y:s.y}),o.push({x:i,y:a.y}))})),o}(t,e),i.length?new bp({points:i,options:{tension:0},_loop:n,_fullLoop:n}):null}function Hp(t){return t&&!1!==t.fill}function Up(t,e,i){let n=t[e].fill;const r=[e];let o;if(!i)return n;for(;!1!==n&&-1===r.indexOf(n);){if(!Pc(n))return n;if(o=t[n],!o)return!1;if(o.visible)return n;r.push(n),n=o.fill}return!1}function Fp(t,e,i){const n=function(t){const e=t.options,i=e.fill;let n=Cc(i&&i.target,i);return void 0===n&&(n=!!e.backgroundColor),!1!==n&&null!==n&&(!0===n?"origin":n)}(t);if(Oc(n))return!isNaN(n.value)&&n;let r=parseFloat(n);return Pc(r)&&Math.floor(r)===r?function(t,e,i,n){return"-"!==t&&"+"!==t||(i=e+i),!(i===e||i<0||i>=n)&&i}(n[0],e,r,i):["origin","start","end","stack","shape"].indexOf(n)>=0&&n}function Bp(t,e,i){const n=[];for(let r=0;r<i.length;r++){const o=i[r],{first:s,last:a,point:l}=Wp(o,e,"x");if(!(!l||s&&a))if(s)n.unshift(l);else if(t.push(l),!a)break}t.push(...n)}function Wp(t,e,i){const n=t.interpolate(e,i);if(!n)return{};const r=n[i],o=t.segments,s=t.points;let a=!1,l=!1;for(let t=0;t<o.length;t++){const e=o[t],n=s[e.start][i],c=s[e.end][i];if(yh(r,n,c)){a=r===n,l=r===c;break}}return{first:a,last:l,point:n}}class Vp{constructor(t){this.x=t.x,this.y=t.y,this.radius=t.radius}pathSegment(t,e,i){const{x:n,y:r,radius:o}=this;return e=e||{start:0,end:qc},t.arc(n,r,o,e.end,e.start,!0),!i.bounds}interpolate(t){const{x:e,y:i,radius:n}=this,r=t.angle;return{x:e+Math.cos(r)*n,y:i+Math.sin(r)*n,angle:r}}}function $p(t,e,i){const n=function(t){const{chart:e,fill:i,line:n}=t;if(Pc(i))return function(t,e){const i=t.getDatasetMeta(e);return i&&t.isDatasetVisible(e)?i.dataset:null}(e,i);if("stack"===i)return function(t){const{scale:e,index:i,line:n}=t,r=[],o=n.segments,s=n.points,a=function(t,e){const i=[],n=t.getMatchingVisibleMetas("line");for(let t=0;t<n.length;t++){const r=n[t];if(r.index===e)break;r.hidden||i.unshift(r.dataset)}return i}(e,i);a.push(Ip({x:null,y:e.bottom},n));for(let t=0;t<o.length;t++){const e=o[t];for(let t=e.start;t<=e.end;t++)Bp(r,s[t],a)}return new bp({points:r,options:{}})}(t);if("shape"===i)return!0;const r=function(t){return(t.scale||{}).getPointPositionForValue?function(t){const{scale:e,fill:i}=t,n=e.options,r=e.getLabels().length,o=n.reverse?e.max:e.min,s=function(t,e,i){let n;return n="start"===t?i:"end"===t?e.options.reverse?e.min:e.max:Oc(t)?t.value:e.getBaseValue(),n}(i,e,o),a=[];if(n.grid.circular){const t=e.getPointPositionForValue(0,o);return new Vp({x:t.x,y:t.y,radius:e.getDistanceFromCenterForValue(s)})}for(let t=0;t<r;++t)a.push(e.getPointPositionForValue(t,s));return a}(t):function(t){const{scale:e={},fill:i}=t,n=function(t,e){let i=null;return"start"===t?i=e.bottom:"end"===t?i=e.top:Oc(t)?i=e.getPixelForValue(t.value):e.getBasePixel&&(i=e.getBasePixel()),i}(i,e);if(Pc(n)){const t=e.isHorizontal();return{x:t?n:null,y:t?null:n}}return null}(t)}(t);return r instanceof Vp?r:Ip(r,n)}(e),{line:r,scale:o,axis:s}=e,a=r.options,l=a.fill,c=a.backgroundColor,{above:h=c,below:u=c}=l||{};n&&r.points.length&&(iu(t,i),function(t,e){const{line:i,target:n,above:r,below:o,area:s,scale:a}=e,l=i._loop?"angle":e.axis;t.save(),"x"===l&&o!==r&&(Yp(t,n,s.top),Gp(t,{line:i,target:n,color:r,scale:a,property:l}),t.restore(),t.save(),Yp(t,n,s.bottom)),Gp(t,{line:i,target:n,color:o,scale:a,property:l}),t.restore()}(t,{line:r,target:n,above:h,below:u,area:i,scale:o,axis:s}),nu(t))}function Yp(t,e,i){const{segments:n,points:r}=e;let o=!0,s=!1;t.beginPath();for(const a of n){const{start:n,end:l}=a,c=r[n],h=r[zp(n,l,r)];o?(t.moveTo(c.x,c.y),o=!1):(t.lineTo(c.x,i),t.lineTo(c.x,c.y)),s=!!e.pathSegment(t,a,{move:s}),s?t.closePath():t.lineTo(h.x,i)}t.lineTo(e.first().x,i),t.closePath(),t.clip()}function Gp(t,e){const{line:i,target:n,property:r,color:o,scale:s}=e,a=function(t,e,i){const n=t.segments,r=t.points,o=e.points,s=[];for(const t of n){let{start:n,end:a}=t;a=zp(n,a,r);const l=jp(i,r[n],r[a],t.loop);if(!e.segments){s.push({source:t,target:l,start:r[n],end:r[a]});continue}const c=sd(e,l);for(const e of c){const n=jp(i,o[e.start],o[e.end],e.loop),a=od(t,r,n);for(const t of a)s.push({source:t,target:e,start:{[i]:Np(l,n,"start",Math.max)},end:{[i]:Np(l,n,"end",Math.min)}})}}return s}(i,n,r);for(const{source:e,target:l,start:c,end:h}of a){const{style:{backgroundColor:a=o}={}}=e,u=!0!==n;t.save(),t.fillStyle=a,Xp(t,s,u&&jp(r,c,h)),t.beginPath();const d=!!i.pathSegment(t,e);let f;if(u){d?t.closePath():qp(t,n,h,r);const e=!!n.pathSegment(t,l,{move:d,reverse:!0});f=d&&e,f||qp(t,n,c,r)}t.closePath(),t.fill(f?"evenodd":"nonzero"),t.restore()}}function Xp(t,e,i){const{top:n,bottom:r}=e.chart.chartArea,{property:o,start:s,end:a}=i||{};"x"===o&&(t.beginPath(),t.rect(s,n,a-s,r-n),t.clip())}function qp(t,e,i,n){const r=e.interpolate(i,n);r&&t.lineTo(r.x,r.y)}var Zp={id:"filler",afterDatasetsUpdate(t,e,i){const n=(t.data.datasets||[]).length,r=[];let o,s,a,l;for(s=0;s<n;++s)o=t.getDatasetMeta(s),a=o.dataset,l=null,a&&a.options&&a instanceof bp&&(l={visible:t.isDatasetVisible(s),index:s,fill:Fp(a,s,n),chart:t,axis:o.controller.options.indexAxis,scale:o.vScale,line:a}),o.$filler=l,r.push(l);for(s=0;s<n;++s)l=r[s],l&&!1!==l.fill&&(l.fill=Up(r,s,i.propagate))},beforeDraw(t,e,i){const n="beforeDraw"===i.drawTime,r=t.getSortedVisibleDatasetMetas(),o=t.chartArea;for(let e=r.length-1;e>=0;--e){const i=r[e].$filler;i&&(i.line.updateControlPoints(o,i.axis),n&&i.fill&&$p(t.ctx,i,o))}},beforeDatasetsDraw(t,e,i){if("beforeDatasetsDraw"!==i.drawTime)return;const n=t.getSortedVisibleDatasetMetas();for(let e=n.length-1;e>=0;--e){const i=n[e].$filler;Hp(i)&&$p(t.ctx,i,t.chartArea)}},beforeDatasetDraw(t,e,i){const n=e.meta.$filler;Hp(n)&&"beforeDatasetDraw"===i.drawTime&&$p(t.ctx,n,t.chartArea)},defaults:{propagate:!0,drawTime:"beforeDatasetDraw"}};const Kp=(t,e)=>{let{boxHeight:i=e,boxWidth:n=e}=t;return t.usePointStyle&&(i=Math.min(i,e),n=t.pointStyleWidth||Math.min(n,e)),{boxWidth:n,boxHeight:i,itemHeight:Math.max(e,i)}};class Qp extends Mf{constructor(t){super(),this._added=!1,this.legendHitBoxes=[],this._hoveredItem=null,this.doughnutMode=!1,this.chart=t.chart,this.options=t.options,this.ctx=t.ctx,this.legendItems=void 0,this.columnSizes=void 0,this.lineWidths=void 0,this.maxHeight=void 0,this.maxWidth=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.height=void 0,this.width=void 0,this._margins=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(t,e,i){this.maxWidth=t,this.maxHeight=e,this._margins=i,this.setDimensions(),this.buildLabels(),this.fit()}setDimensions(){this.isHorizontal()?(this.width=this.maxWidth,this.left=this._margins.left,this.right=this.width):(this.height=this.maxHeight,this.top=this._margins.top,this.bottom=this.height)}buildLabels(){const t=this.options.labels||{};let e=Lc(t.generateLabels,[this.chart],this)||[];t.filter&&(e=e.filter((e=>t.filter(e,this.chart.data)))),t.sort&&(e=e.sort(((e,i)=>t.sort(e,i,this.chart.data)))),this.options.reverse&&e.reverse(),this.legendItems=e}fit(){const{options:t,ctx:e}=this;if(!t.display)return void(this.width=this.height=0);const i=t.labels,n=yu(i.font),r=n.size,o=this._computeTitleHeight(),{boxWidth:s,itemHeight:a}=Kp(i,r);let l,c;e.font=n.string,this.isHorizontal()?(l=this.maxWidth,c=this._fitRows(o,r,s,a)+10):(c=this.maxHeight,l=this._fitCols(o,n,s,a)+10),this.width=Math.min(l,t.maxWidth||this.maxWidth),this.height=Math.min(c,t.maxHeight||this.maxHeight)}_fitRows(t,e,i,n){const{ctx:r,maxWidth:o,options:{labels:{padding:s}}}=this,a=this.legendHitBoxes=[],l=this.lineWidths=[0],c=n+s;let h=t;r.textAlign="left",r.textBaseline="middle";let u=-1,d=-c;return this.legendItems.forEach(((t,f)=>{const p=i+e/2+r.measureText(t.text).width;(0===f||l[l.length-1]+p+2*s>o)&&(h+=c,l[l.length-(f>0?0:1)]=0,d+=c,u++),a[f]={left:0,top:d,row:u,width:p,height:n},l[l.length-1]+=p+s})),h}_fitCols(t,e,i,n){const{ctx:r,maxHeight:o,options:{labels:{padding:s}}}=this,a=this.legendHitBoxes=[],l=this.columnSizes=[],c=o-t;let h=s,u=0,d=0,f=0,p=0;return this.legendItems.forEach(((t,o)=>{const{itemWidth:g,itemHeight:m}=function(t,e,i,n,r){const o=function(t,e,i,n){let r=t.text;return r&&"string"!=typeof r&&(r=r.reduce(((t,e)=>t.length>e.length?t:e))),e+i.size/2+n.measureText(r).width}(n,t,e,i),s=function(t,e,i){let n=t;return"string"!=typeof e.text&&(n=Jp(e,i)),n}(r,n,e.lineHeight);return{itemWidth:o,itemHeight:s}}(i,e,r,t,n);o>0&&d+m+2*s>c&&(h+=u+s,l.push({width:u,height:d}),f+=u+s,p++,u=d=0),a[o]={left:f,top:d,col:p,width:g,height:m},u=Math.max(u,g),d+=m+s})),h+=u,l.push({width:u,height:d}),h}adjustHitBoxes(){if(!this.options.display)return;const t=this._computeTitleHeight(),{legendHitBoxes:e,options:{align:i,labels:{padding:n},rtl:r}}=this,o=td(r,this.left,this.width);if(this.isHorizontal()){let r=0,s=Eh(i,this.left+n,this.right-this.lineWidths[r]);for(const a of e)r!==a.row&&(r=a.row,s=Eh(i,this.left+n,this.right-this.lineWidths[r])),a.top+=this.top+t+n,a.left=o.leftForLtr(o.x(s),a.width),s+=a.width+n}else{let r=0,s=Eh(i,this.top+t+n,this.bottom-this.columnSizes[r].height);for(const a of e)a.col!==r&&(r=a.col,s=Eh(i,this.top+t+n,this.bottom-this.columnSizes[r].height)),a.top=s,a.left+=this.left+n,a.left=o.leftForLtr(o.x(a.left),a.width),s+=a.height+n}}isHorizontal(){return"top"===this.options.position||"bottom"===this.options.position}draw(){if(this.options.display){const t=this.ctx;iu(t,this),this._draw(),nu(t)}}_draw(){const{options:t,columnSizes:e,lineWidths:i,ctx:n}=this,{align:r,labels:o}=t,s=Xh.color,a=td(t.rtl,this.left,this.width),l=yu(o.font),{padding:c}=o,h=l.size,u=h/2;let d;this.drawTitle(),n.textAlign=a.textAlign("left"),n.textBaseline="middle",n.lineWidth=.5,n.font=l.string;const{boxWidth:f,boxHeight:p,itemHeight:g}=Kp(o,h),m=this.isHorizontal(),y=this._computeTitleHeight();d=m?{x:Eh(r,this.left+c,this.right-i[0]),y:this.top+c+y,line:0}:{x:this.left+c,y:Eh(r,this.top+y+c,this.bottom-e[0].height),line:0},ed(this.ctx,t.textDirection);const b=g+c;this.legendItems.forEach(((v,x)=>{n.strokeStyle=v.fontColor,n.fillStyle=v.fontColor;const _=n.measureText(v.text).width,w=a.textAlign(v.textAlign||(v.textAlign=o.textAlign)),M=f+u+_;let k=d.x,S=d.y;if(a.setWidth(this.width),m?x>0&&k+M+c>this.right&&(S=d.y+=b,d.line++,k=d.x=Eh(r,this.left+c,this.right-i[d.line])):x>0&&S+b>this.bottom&&(k=d.x=k+e[d.line].width+c,d.line++,S=d.y=Eh(r,this.top+y+c,this.bottom-e[d.line].height)),function(t,e,i){if(isNaN(f)||f<=0||isNaN(p)||p<0)return;n.save();const r=Cc(i.lineWidth,1);if(n.fillStyle=Cc(i.fillStyle,s),n.lineCap=Cc(i.lineCap,"butt"),n.lineDashOffset=Cc(i.lineDashOffset,0),n.lineJoin=Cc(i.lineJoin,"miter"),n.lineWidth=r,n.strokeStyle=Cc(i.strokeStyle,s),n.setLineDash(Cc(i.lineDash,[])),o.usePointStyle){const s={radius:p*Math.SQRT2/2,pointStyle:i.pointStyle,rotation:i.rotation,borderWidth:r},l=a.xPlus(t,f/2);tu(n,s,l,e+u,o.pointStyleWidth&&f)}else{const o=e+Math.max((h-p)/2,0),s=a.leftForLtr(t,f),l=gu(i.borderRadius);n.beginPath(),Object.values(l).some((t=>0!==t))?cu(n,{x:s,y:o,w:f,h:p,radius:l}):n.rect(s,o,f,p),n.fill(),0!==r&&n.stroke()}n.restore()}(a.x(k),S,v),k=((t,e,i,n)=>t===(n?"left":"right")?i:"center"===t?(e+i)/2:e)(w,k+f+u,m?k+M:this.right,t.rtl),function(t,e,i){lu(n,i.text,t,e+g/2,l,{strikethrough:i.hidden,textAlign:a.textAlign(i.textAlign)})}(a.x(k),S,v),m)d.x+=M+c;else if("string"!=typeof v.text){const t=l.lineHeight;d.y+=Jp(v,t)+c}else d.y+=b})),id(this.ctx,t.textDirection)}drawTitle(){const t=this.options,e=t.title,i=yu(e.font),n=mu(e.padding);if(!e.display)return;const r=td(t.rtl,this.left,this.width),o=this.ctx,s=e.position,a=i.size/2,l=n.top+a;let c,h=this.left,u=this.width;if(this.isHorizontal())u=Math.max(...this.lineWidths),c=this.top+l,h=Eh(t.align,h,this.right-u);else{const e=this.columnSizes.reduce(((t,e)=>Math.max(t,e.height)),0);c=l+Eh(t.align,this.top,this.bottom-e-t.labels.padding-this._computeTitleHeight())}const d=Eh(s,h,h+u);o.textAlign=r.textAlign(Dh(s)),o.textBaseline="middle",o.strokeStyle=e.color,o.fillStyle=e.color,o.font=i.string,lu(o,e.text,d,c,i)}_computeTitleHeight(){const t=this.options.title,e=yu(t.font),i=mu(t.padding);return t.display?e.lineHeight+i.height:0}_getLegendItemAt(t,e){let i,n,r;if(yh(t,this.left,this.right)&&yh(e,this.top,this.bottom))for(r=this.legendHitBoxes,i=0;i<r.length;++i)if(n=r[i],yh(t,n.left,n.left+n.width)&&yh(e,n.top,n.top+n.height))return this.legendItems[i];return null}handleEvent(t){const e=this.options;if(!function(t,e){return!("mousemove"!==t&&"mouseout"!==t||!e.onHover&&!e.onLeave)||!(!e.onClick||"click"!==t&&"mouseup"!==t)}(t.type,e))return;const i=this._getLegendItemAt(t.x,t.y);if("mousemove"===t.type||"mouseout"===t.type){const o=this._hoveredItem,s=(r=i,null!==(n=o)&&null!==r&&n.datasetIndex===r.datasetIndex&&n.index===r.index);o&&!s&&Lc(e.onLeave,[t,o,this],this),this._hoveredItem=i,i&&!s&&Lc(e.onHover,[t,i,this],this)}else i&&Lc(e.onClick,[t,i,this],this);var n,r}}function Jp(t,e){return e*(t.text?t.text.length:0)}var tg={id:"legend",_element:Qp,start(t,e,i){const n=t.legend=new Qp({ctx:t.ctx,options:i,chart:t});of.configure(t,n,i),of.addBox(t,n)},stop(t){of.removeBox(t,t.legend),delete t.legend},beforeUpdate(t,e,i){const n=t.legend;of.configure(t,n,i),n.options=i},afterUpdate(t){const e=t.legend;e.buildLabels(),e.adjustHitBoxes()},afterEvent(t,e){e.replay||t.legend.handleEvent(e.event)},defaults:{display:!0,position:"top",align:"center",fullSize:!0,reverse:!1,weight:1e3,onClick(t,e,i){const n=e.datasetIndex,r=i.chart;r.isDatasetVisible(n)?(r.hide(n),e.hidden=!0):(r.show(n),e.hidden=!1)},onHover:null,onLeave:null,labels:{color:t=>t.chart.options.color,boxWidth:40,padding:10,generateLabels(t){const e=t.data.datasets,{labels:{usePointStyle:i,pointStyle:n,textAlign:r,color:o,useBorderRadius:s,borderRadius:a}}=t.legend.options;return t._getSortedDatasetMetas().map((t=>{const l=t.controller.getStyle(i?0:void 0),c=mu(l.borderWidth);return{text:e[t.index].label,fillStyle:l.backgroundColor,fontColor:o,hidden:!t.visible,lineCap:l.borderCapStyle,lineDash:l.borderDash,lineDashOffset:l.borderDashOffset,lineJoin:l.borderJoinStyle,lineWidth:(c.width+c.height)/4,strokeStyle:l.borderColor,pointStyle:n||l.pointStyle,rotation:l.rotation,textAlign:r||l.textAlign,borderRadius:s&&(a||l.borderRadius),datasetIndex:t.index}}),this)}},title:{color:t=>t.chart.options.color,display:!1,position:"center",text:""}},descriptors:{_scriptable:t=>!t.startsWith("on"),labels:{_scriptable:t=>!["generateLabels","filter","sort"].includes(t)}}};class eg extends Mf{constructor(t){super(),this.chart=t.chart,this.options=t.options,this.ctx=t.ctx,this._padding=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.width=void 0,this.height=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(t,e){const i=this.options;if(this.left=0,this.top=0,!i.display)return void(this.width=this.height=this.right=this.bottom=0);this.width=this.right=t,this.height=this.bottom=e;const n=Ec(i.text)?i.text.length:1;this._padding=mu(i.padding);const r=n*yu(i.font).lineHeight+this._padding.height;this.isHorizontal()?this.height=r:this.width=r}isHorizontal(){const t=this.options.position;return"top"===t||"bottom"===t}_drawArgs(t){const{top:e,left:i,bottom:n,right:r,options:o}=this,s=o.align;let a,l,c,h=0;return this.isHorizontal()?(l=Eh(s,i,r),c=e+t,a=r-i):("left"===o.position?(l=i+t,c=Eh(s,n,e),h=-.5*Xc):(l=r-t,c=Eh(s,e,n),h=.5*Xc),a=n-e),{titleX:l,titleY:c,maxWidth:a,rotation:h}}draw(){const t=this.ctx,e=this.options;if(!e.display)return;const i=yu(e.font),n=i.lineHeight/2+this._padding.top,{titleX:r,titleY:o,maxWidth:s,rotation:a}=this._drawArgs(n);lu(t,e.text,0,0,i,{color:e.color,maxWidth:s,rotation:a,textAlign:Dh(e.align),textBaseline:"middle",translation:[r,o]})}}var ig={id:"title",_element:eg,start(t,e,i){!function(t,e){const i=new eg({ctx:t.ctx,options:e,chart:t});of.configure(t,i,e),of.addBox(t,i),t.titleBlock=i}(t,i)},stop(t){const e=t.titleBlock;of.removeBox(t,e),delete t.titleBlock},beforeUpdate(t,e,i){const n=t.titleBlock;of.configure(t,n,i),n.options=i},defaults:{align:"center",display:!1,font:{weight:"bold"},fullSize:!0,padding:10,position:"top",text:"",weight:2e3},defaultRoutes:{color:"color"},descriptors:{_scriptable:!0,_indexable:!1}};const ng=new WeakMap;var rg={id:"subtitle",start(t,e,i){const n=new eg({ctx:t.ctx,options:i,chart:t});of.configure(t,n,i),of.addBox(t,n),ng.set(t,n)},stop(t){of.removeBox(t,ng.get(t)),ng.delete(t)},beforeUpdate(t,e,i){const n=ng.get(t);of.configure(t,n,i),n.options=i},defaults:{align:"center",display:!1,font:{weight:"normal"},fullSize:!0,padding:0,position:"top",text:"",weight:1500},defaultRoutes:{color:"color"},descriptors:{_scriptable:!0,_indexable:!1}};const og={average(t){if(!t.length)return!1;let e,i,n=0,r=0,o=0;for(e=0,i=t.length;e<i;++e){const i=t[e].element;if(i&&i.hasValue()){const t=i.tooltipPosition();n+=t.x,r+=t.y,++o}}return{x:n/o,y:r/o}},nearest(t,e){if(!t.length)return!1;let i,n,r,o=e.x,s=e.y,a=Number.POSITIVE_INFINITY;for(i=0,n=t.length;i<n;++i){const n=t[i].element;if(n&&n.hasValue()){const t=dh(e,n.getCenterPoint());t<a&&(a=t,r=n)}}if(r){const t=r.tooltipPosition();o=t.x,s=t.y}return{x:o,y:s}}};function sg(t,e){return e&&(Ec(e)?Array.prototype.push.apply(t,e):t.push(e)),t}function ag(t){return("string"==typeof t||t instanceof String)&&t.indexOf("\n")>-1?t.split("\n"):t}function lg(t,e){const{element:i,datasetIndex:n,index:r}=e,o=t.getDatasetMeta(n).controller,{label:s,value:a}=o.getLabelAndValue(r);return{chart:t,label:s,parsed:o.getParsed(r),raw:t.data.datasets[n].data[r],formattedValue:a,dataset:o.getDataset(),dataIndex:r,datasetIndex:n,element:i}}function cg(t,e){const i=t.chart.ctx,{body:n,footer:r,title:o}=t,{boxWidth:s,boxHeight:a}=e,l=yu(e.bodyFont),c=yu(e.titleFont),h=yu(e.footerFont),u=o.length,d=r.length,f=n.length,p=mu(e.padding);let g=p.height,m=0,y=n.reduce(((t,e)=>t+e.before.length+e.lines.length+e.after.length),0);y+=t.beforeBody.length+t.afterBody.length,u&&(g+=u*c.lineHeight+(u-1)*e.titleSpacing+e.titleMarginBottom),y&&(g+=f*(e.displayColors?Math.max(a,l.lineHeight):l.lineHeight)+(y-f)*l.lineHeight+(y-1)*e.bodySpacing),d&&(g+=e.footerMarginTop+d*h.lineHeight+(d-1)*e.footerSpacing);let b=0;const v=function(t){m=Math.max(m,i.measureText(t).width+b)};return i.save(),i.font=c.string,Rc(t.title,v),i.font=l.string,Rc(t.beforeBody.concat(t.afterBody),v),b=e.displayColors?s+2+e.boxPadding:0,Rc(n,(t=>{Rc(t.before,v),Rc(t.lines,v),Rc(t.after,v)})),b=0,i.font=h.string,Rc(t.footer,v),i.restore(),m+=p.width,{width:m,height:g}}function hg(t,e,i,n){const{x:r,width:o}=i,{width:s,chartArea:{left:a,right:l}}=t;let c="center";return"center"===n?c=r<=(a+l)/2?"left":"right":r<=o/2?c="left":r>=s-o/2&&(c="right"),function(t,e,i,n){const{x:r,width:o}=n,s=i.caretSize+i.caretPadding;return"left"===t&&r+o+s>e.width||"right"===t&&r-o-s<0||void 0}(c,t,e,i)&&(c="center"),c}function ug(t,e,i){const n=i.yAlign||e.yAlign||function(t,e){const{y:i,height:n}=e;return i<n/2?"top":i>t.height-n/2?"bottom":"center"}(t,i);return{xAlign:i.xAlign||e.xAlign||hg(t,e,i,n),yAlign:n}}function dg(t,e,i,n){const{caretSize:r,caretPadding:o,cornerRadius:s}=t,{xAlign:a,yAlign:l}=i,c=r+o,{topLeft:h,topRight:u,bottomLeft:d,bottomRight:f}=gu(s);let p=function(t,e){let{x:i,width:n}=t;return"right"===e?i-=n:"center"===e&&(i-=n/2),i}(e,a);const g=function(t,e,i){let{y:n,height:r}=t;return"top"===e?n+=i:n-="bottom"===e?r+i:r/2,n}(e,l,c);return"center"===l?"left"===a?p+=c:"right"===a&&(p-=c):"left"===a?p-=Math.max(h,d)+r:"right"===a&&(p+=Math.max(u,f)+r),{x:mh(p,0,n.width-e.width),y:mh(g,0,n.height-e.height)}}function fg(t,e,i){const n=mu(i.padding);return"center"===e?t.x+t.width/2:"right"===e?t.x+t.width-n.right:t.x+n.left}function pg(t){return sg([],ag(t))}function gg(t,e){const i=e&&e.dataset&&e.dataset.tooltip&&e.dataset.tooltip.callbacks;return i?t.override(i):t}const mg={beforeTitle:kc,title(t){if(t.length>0){const e=t[0],i=e.chart.data.labels,n=i?i.length:0;if(this&&this.options&&"dataset"===this.options.mode)return e.dataset.label||"";if(e.label)return e.label;if(n>0&&e.dataIndex<n)return i[e.dataIndex]}return""},afterTitle:kc,beforeBody:kc,beforeLabel:kc,label(t){if(this&&this.options&&"dataset"===this.options.mode)return t.label+": "+t.formattedValue||t.formattedValue;let e=t.dataset.label||"";e&&(e+=": ");const i=t.formattedValue;return Dc(i)||(e+=i),e},labelColor(t){const e=t.chart.getDatasetMeta(t.datasetIndex).controller.getStyle(t.dataIndex);return{borderColor:e.borderColor,backgroundColor:e.backgroundColor,borderWidth:e.borderWidth,borderDash:e.borderDash,borderDashOffset:e.borderDashOffset,borderRadius:0}},labelTextColor(){return this.options.bodyColor},labelPointStyle(t){const e=t.chart.getDatasetMeta(t.datasetIndex).controller.getStyle(t.dataIndex);return{pointStyle:e.pointStyle,rotation:e.rotation}},afterLabel:kc,afterBody:kc,beforeFooter:kc,footer:kc,afterFooter:kc};function yg(t,e,i,n){const r=t[e].call(i,n);return void 0===r?mg[e].call(i,n):r}class bg extends Mf{static positioners=og;constructor(t){super(),this.opacity=0,this._active=[],this._eventPosition=void 0,this._size=void 0,this._cachedAnimations=void 0,this._tooltipItems=[],this.$animations=void 0,this.$context=void 0,this.chart=t.chart,this.options=t.options,this.dataPoints=void 0,this.title=void 0,this.beforeBody=void 0,this.body=void 0,this.afterBody=void 0,this.footer=void 0,this.xAlign=void 0,this.yAlign=void 0,this.x=void 0,this.y=void 0,this.height=void 0,this.width=void 0,this.caretX=void 0,this.caretY=void 0,this.labelColors=void 0,this.labelPointStyles=void 0,this.labelTextColors=void 0}initialize(t){this.options=t,this._cachedAnimations=void 0,this.$context=void 0}_resolveAnimations(){const t=this._cachedAnimations;if(t)return t;const e=this.chart,i=this.options.setContext(this.getContext()),n=i.enabled&&e.options.animation&&i.animations,r=new pd(this.chart,n);return n._cacheable&&(this._cachedAnimations=Object.freeze(r)),r}getContext(){return this.$context||(this.$context=(this,vu(this.chart.getContext(),{tooltip:this,tooltipItems:this._tooltipItems,type:"tooltip"})))}getTitle(t,e){const{callbacks:i}=e,n=yg(i,"beforeTitle",this,t),r=yg(i,"title",this,t),o=yg(i,"afterTitle",this,t);let s=[];return s=sg(s,ag(n)),s=sg(s,ag(r)),s=sg(s,ag(o)),s}getBeforeBody(t,e){return pg(yg(e.callbacks,"beforeBody",this,t))}getBody(t,e){const{callbacks:i}=e,n=[];return Rc(t,(t=>{const e={before:[],lines:[],after:[]},r=gg(i,t);sg(e.before,ag(yg(r,"beforeLabel",this,t))),sg(e.lines,yg(r,"label",this,t)),sg(e.after,ag(yg(r,"afterLabel",this,t))),n.push(e)})),n}getAfterBody(t,e){return pg(yg(e.callbacks,"afterBody",this,t))}getFooter(t,e){const{callbacks:i}=e,n=yg(i,"beforeFooter",this,t),r=yg(i,"footer",this,t),o=yg(i,"afterFooter",this,t);let s=[];return s=sg(s,ag(n)),s=sg(s,ag(r)),s=sg(s,ag(o)),s}_createItems(t){const e=this._active,i=this.chart.data,n=[],r=[],o=[];let s,a,l=[];for(s=0,a=e.length;s<a;++s)l.push(lg(this.chart,e[s]));return t.filter&&(l=l.filter(((e,n,r)=>t.filter(e,n,r,i)))),t.itemSort&&(l=l.sort(((e,n)=>t.itemSort(e,n,i)))),Rc(l,(e=>{const i=gg(t.callbacks,e);n.push(yg(i,"labelColor",this,e)),r.push(yg(i,"labelPointStyle",this,e)),o.push(yg(i,"labelTextColor",this,e))})),this.labelColors=n,this.labelPointStyles=r,this.labelTextColors=o,this.dataPoints=l,l}update(t,e){const i=this.options.setContext(this.getContext()),n=this._active;let r,o=[];if(n.length){const t=og[i.position].call(this,n,this._eventPosition);o=this._createItems(i),this.title=this.getTitle(o,i),this.beforeBody=this.getBeforeBody(o,i),this.body=this.getBody(o,i),this.afterBody=this.getAfterBody(o,i),this.footer=this.getFooter(o,i);const e=this._size=cg(this,i),s=Object.assign({},t,e),a=ug(this.chart,i,s),l=dg(i,s,a,this.chart);this.xAlign=a.xAlign,this.yAlign=a.yAlign,r={opacity:1,x:l.x,y:l.y,width:e.width,height:e.height,caretX:t.x,caretY:t.y}}else 0!==this.opacity&&(r={opacity:0});this._tooltipItems=o,this.$context=void 0,r&&this._resolveAnimations().update(this,r),t&&i.external&&i.external.call(this,{chart:this.chart,tooltip:this,replay:e})}drawCaret(t,e,i,n){const r=this.getCaretPosition(t,i,n);e.lineTo(r.x1,r.y1),e.lineTo(r.x2,r.y2),e.lineTo(r.x3,r.y3)}getCaretPosition(t,e,i){const{xAlign:n,yAlign:r}=this,{caretSize:o,cornerRadius:s}=i,{topLeft:a,topRight:l,bottomLeft:c,bottomRight:h}=gu(s),{x:u,y:d}=t,{width:f,height:p}=e;let g,m,y,b,v,x;return"center"===r?(v=d+p/2,"left"===n?(g=u,m=g-o,b=v+o,x=v-o):(g=u+f,m=g+o,b=v-o,x=v+o),y=g):(m="left"===n?u+Math.max(a,c)+o:"right"===n?u+f-Math.max(l,h)-o:this.caretX,"top"===r?(b=d,v=b-o,g=m-o,y=m+o):(b=d+p,v=b+o,g=m+o,y=m-o),x=b),{x1:g,x2:m,x3:y,y1:b,y2:v,y3:x}}drawTitle(t,e,i){const n=this.title,r=n.length;let o,s,a;if(r){const l=td(i.rtl,this.x,this.width);for(t.x=fg(this,i.titleAlign,i),e.textAlign=l.textAlign(i.titleAlign),e.textBaseline="middle",o=yu(i.titleFont),s=i.titleSpacing,e.fillStyle=i.titleColor,e.font=o.string,a=0;a<r;++a)e.fillText(n[a],l.x(t.x),t.y+o.lineHeight/2),t.y+=o.lineHeight+s,a+1===r&&(t.y+=i.titleMarginBottom-s)}}_drawColorBox(t,e,i,n,r){const o=this.labelColors[i],s=this.labelPointStyles[i],{boxHeight:a,boxWidth:l}=r,c=yu(r.bodyFont),h=fg(this,"left",r),u=n.x(h),d=a<c.lineHeight?(c.lineHeight-a)/2:0,f=e.y+d;if(r.usePointStyle){const e={radius:Math.min(l,a)/2,pointStyle:s.pointStyle,rotation:s.rotation,borderWidth:1},i=n.leftForLtr(u,l)+l/2,c=f+a/2;t.strokeStyle=r.multiKeyBackground,t.fillStyle=r.multiKeyBackground,Jh(t,e,i,c),t.strokeStyle=o.borderColor,t.fillStyle=o.backgroundColor,Jh(t,e,i,c)}else{t.lineWidth=Oc(o.borderWidth)?Math.max(...Object.values(o.borderWidth)):o.borderWidth||1,t.strokeStyle=o.borderColor,t.setLineDash(o.borderDash||[]),t.lineDashOffset=o.borderDashOffset||0;const e=n.leftForLtr(u,l),i=n.leftForLtr(n.xPlus(u,1),l-2),s=gu(o.borderRadius);Object.values(s).some((t=>0!==t))?(t.beginPath(),t.fillStyle=r.multiKeyBackground,cu(t,{x:e,y:f,w:l,h:a,radius:s}),t.fill(),t.stroke(),t.fillStyle=o.backgroundColor,t.beginPath(),cu(t,{x:i,y:f+1,w:l-2,h:a-2,radius:s}),t.fill()):(t.fillStyle=r.multiKeyBackground,t.fillRect(e,f,l,a),t.strokeRect(e,f,l,a),t.fillStyle=o.backgroundColor,t.fillRect(i,f+1,l-2,a-2))}t.fillStyle=this.labelTextColors[i]}drawBody(t,e,i){const{body:n}=this,{bodySpacing:r,bodyAlign:o,displayColors:s,boxHeight:a,boxWidth:l,boxPadding:c}=i,h=yu(i.bodyFont);let u=h.lineHeight,d=0;const f=td(i.rtl,this.x,this.width),p=function(i){e.fillText(i,f.x(t.x+d),t.y+u/2),t.y+=u+r},g=f.textAlign(o);let m,y,b,v,x,_,w;for(e.textAlign=o,e.textBaseline="middle",e.font=h.string,t.x=fg(this,g,i),e.fillStyle=i.bodyColor,Rc(this.beforeBody,p),d=s&&"right"!==g?"center"===o?l/2+c:l+2+c:0,v=0,_=n.length;v<_;++v){for(m=n[v],y=this.labelTextColors[v],e.fillStyle=y,Rc(m.before,p),b=m.lines,s&&b.length&&(this._drawColorBox(e,t,v,f,i),u=Math.max(h.lineHeight,a)),x=0,w=b.length;x<w;++x)p(b[x]),u=h.lineHeight;Rc(m.after,p)}d=0,u=h.lineHeight,Rc(this.afterBody,p),t.y-=r}drawFooter(t,e,i){const n=this.footer,r=n.length;let o,s;if(r){const a=td(i.rtl,this.x,this.width);for(t.x=fg(this,i.footerAlign,i),t.y+=i.footerMarginTop,e.textAlign=a.textAlign(i.footerAlign),e.textBaseline="middle",o=yu(i.footerFont),e.fillStyle=i.footerColor,e.font=o.string,s=0;s<r;++s)e.fillText(n[s],a.x(t.x),t.y+o.lineHeight/2),t.y+=o.lineHeight+i.footerSpacing}}drawBackground(t,e,i,n){const{xAlign:r,yAlign:o}=this,{x:s,y:a}=t,{width:l,height:c}=i,{topLeft:h,topRight:u,bottomLeft:d,bottomRight:f}=gu(n.cornerRadius);e.fillStyle=n.backgroundColor,e.strokeStyle=n.borderColor,e.lineWidth=n.borderWidth,e.beginPath(),e.moveTo(s+h,a),"top"===o&&this.drawCaret(t,e,i,n),e.lineTo(s+l-u,a),e.quadraticCurveTo(s+l,a,s+l,a+u),"center"===o&&"right"===r&&this.drawCaret(t,e,i,n),e.lineTo(s+l,a+c-f),e.quadraticCurveTo(s+l,a+c,s+l-f,a+c),"bottom"===o&&this.drawCaret(t,e,i,n),e.lineTo(s+d,a+c),e.quadraticCurveTo(s,a+c,s,a+c-d),"center"===o&&"left"===r&&this.drawCaret(t,e,i,n),e.lineTo(s,a+h),e.quadraticCurveTo(s,a,s+h,a),e.closePath(),e.fill(),n.borderWidth>0&&e.stroke()}_updateAnimationTarget(t){const e=this.chart,i=this.$animations,n=i&&i.x,r=i&&i.y;if(n||r){const i=og[t.position].call(this,this._active,this._eventPosition);if(!i)return;const o=this._size=cg(this,t),s=Object.assign({},i,this._size),a=ug(e,t,s),l=dg(t,s,a,e);n._to===l.x&&r._to===l.y||(this.xAlign=a.xAlign,this.yAlign=a.yAlign,this.width=o.width,this.height=o.height,this.caretX=i.x,this.caretY=i.y,this._resolveAnimations().update(this,l))}}_willRender(){return!!this.opacity}draw(t){const e=this.options.setContext(this.getContext());let i=this.opacity;if(!i)return;this._updateAnimationTarget(e);const n={width:this.width,height:this.height},r={x:this.x,y:this.y};i=Math.abs(i)<.001?0:i;const o=mu(e.padding),s=this.title.length||this.beforeBody.length||this.body.length||this.afterBody.length||this.footer.length;e.enabled&&s&&(t.save(),t.globalAlpha=i,this.drawBackground(r,t,n,e),ed(t,e.textDirection),r.y+=o.top,this.drawTitle(r,t,e),this.drawBody(r,t,e),this.drawFooter(r,t,e),id(t,e.textDirection),t.restore())}getActiveElements(){return this._active||[]}setActiveElements(t,e){const i=this._active,n=t.map((({datasetIndex:t,index:e})=>{const i=this.chart.getDatasetMeta(t);if(!i)throw new Error("Cannot find a dataset at index "+t);return{datasetIndex:t,element:i.data[e],index:e}})),r=!jc(i,n),o=this._positionChanged(n,e);(r||o)&&(this._active=n,this._eventPosition=e,this._ignoreReplayEvents=!0,this.update(!0))}handleEvent(t,e,i=!0){if(e&&this._ignoreReplayEvents)return!1;this._ignoreReplayEvents=!1;const n=this.options,r=this._active||[],o=this._getActiveElements(t,r,e,i),s=this._positionChanged(o,t),a=e||!jc(o,r)||s;return a&&(this._active=o,(n.enabled||n.external)&&(this._eventPosition={x:t.x,y:t.y},this.update(!0,e))),a}_getActiveElements(t,e,i,n){const r=this.options;if("mouseout"===t.type)return[];if(!n)return e;const o=this.chart.getElementsAtEventForMode(t,r.mode,r,i);return r.reverse&&o.reverse(),o}_positionChanged(t,e){const{caretX:i,caretY:n,options:r}=this,o=og[r.position].call(this,t,e);return!1!==o&&(i!==o.x||n!==o.y)}}var vg={id:"tooltip",_element:bg,positioners:og,afterInit(t,e,i){i&&(t.tooltip=new bg({chart:t,options:i}))},beforeUpdate(t,e,i){t.tooltip&&t.tooltip.initialize(i)},reset(t,e,i){t.tooltip&&t.tooltip.initialize(i)},afterDraw(t){const e=t.tooltip;if(e&&e._willRender()){const i={tooltip:e};if(!1===t.notifyPlugins("beforeTooltipDraw",{...i,cancelable:!0}))return;e.draw(t.ctx),t.notifyPlugins("afterTooltipDraw",i)}},afterEvent(t,e){if(t.tooltip){const i=e.replay;t.tooltip.handleEvent(e.event,i,e.inChartArea)&&(e.changed=!0)}},defaults:{enabled:!0,external:null,position:"average",backgroundColor:"rgba(0,0,0,0.8)",titleColor:"#fff",titleFont:{weight:"bold"},titleSpacing:2,titleMarginBottom:6,titleAlign:"left",bodyColor:"#fff",bodySpacing:2,bodyFont:{},bodyAlign:"left",footerColor:"#fff",footerSpacing:2,footerMarginTop:6,footerFont:{weight:"bold"},footerAlign:"left",padding:6,caretPadding:2,caretSize:5,cornerRadius:6,boxHeight:(t,e)=>e.bodyFont.size,boxWidth:(t,e)=>e.bodyFont.size,multiKeyBackground:"#fff",displayColors:!0,boxPadding:0,borderColor:"rgba(0,0,0,0)",borderWidth:0,animation:{duration:400,easing:"easeOutQuart"},animations:{numbers:{type:"number",properties:["x","y","width","height","caretX","caretY"]},opacity:{easing:"linear",duration:200}},callbacks:mg},defaultRoutes:{bodyFont:"font",footerFont:"font",titleFont:"font"},descriptors:{_scriptable:t=>"filter"!==t&&"itemSort"!==t&&"external"!==t,_indexable:!1,callbacks:{_scriptable:!1,_indexable:!1},animation:{_fallback:!1},animations:{_fallback:"animation"}},additionalOptionScopes:["interaction"]},xg=Object.freeze({__proto__:null,Colors:Cp,Decimation:Rp,Filler:Zp,Legend:tg,SubTitle:rg,Title:ig,Tooltip:vg});function _g(t){const e=this.getLabels();return t>=0&&t<e.length?e[t]:t}function wg(t,e,{horizontal:i,minRotation:n}){const r=lh(n),o=(i?Math.sin(r):Math.cos(r))||.001,s=.75*e*(""+t).length;return Math.min(e/o,s)}class Mg extends Tf{constructor(t){super(t),this.start=void 0,this.end=void 0,this._startValue=void 0,this._endValue=void 0,this._valueRange=0}parse(t,e){return Dc(t)||("number"==typeof t||t instanceof Number)&&!isFinite(+t)?null:+t}handleTickRangeOptions(){const{beginAtZero:t}=this.options,{minDefined:e,maxDefined:i}=this.getUserBounds();let{min:n,max:r}=this;const o=t=>n=e?n:t,s=t=>r=i?r:t;if(t){const t=nh(n),e=nh(r);t<0&&e<0?s(0):t>0&&e>0&&o(0)}if(n===r){let e=0===r?1:Math.abs(.05*r);s(r+e),t||o(n-e)}this.min=n,this.max=r}getTickLimit(){const t=this.options.ticks;let e,{maxTicksLimit:i,stepSize:n}=t;return n?(e=Math.ceil(this.max/n)-Math.floor(this.min/n)+1,e>1e3&&(console.warn(`scales.${this.id}.ticks.stepSize: ${n} would result generating up to ${e} ticks. Limiting to 1000.`),e=1e3)):(e=this.computeTickLimit(),i=i||11),i&&(e=Math.min(i,e)),e}computeTickLimit(){return Number.POSITIVE_INFINITY}buildTicks(){const t=this.options,e=t.ticks;let i=this.getTickLimit();i=Math.max(2,i);const n=function(t,e){const i=[],{bounds:n,step:r,min:o,max:s,precision:a,count:l,maxTicks:c,maxDigits:h,includeBounds:u}=t,d=r||1,f=c-1,{min:p,max:g}=e,m=!Dc(o),y=!Dc(s),b=!Dc(l),v=(g-p)/(h+1);let x,_,w,M,k=oh((g-p)/f/d)*d;if(k<1e-14&&!m&&!y)return[{value:p},{value:g}];M=Math.ceil(g/k)-Math.floor(p/k),M>f&&(k=oh(M*k/f/d)*d),Dc(a)||(x=Math.pow(10,a),k=Math.ceil(k*x)/x),"ticks"===n?(_=Math.floor(p/k)*k,w=Math.ceil(g/k)*k):(_=p,w=g),m&&y&&r&&function(t,e){const i=Math.round(t);return i-e<=t&&i+e>=t}((s-o)/r,k/1e3)?(M=Math.round(Math.min((s-o)/k,c)),k=(s-o)/M,_=o,w=s):b?(_=m?o:_,w=y?s:w,M=l-1,k=(w-_)/M):(M=(w-_)/k,M=rh(M,Math.round(M),k/1e3)?Math.round(M):Math.ceil(M));const S=Math.max(hh(k),hh(_));x=Math.pow(10,Dc(a)?S:a),_=Math.round(_*x)/x,w=Math.round(w*x)/x;let D=0;for(m&&(u&&_!==o?(i.push({value:o}),_<o&&D++,rh(Math.round((_+D*k)*x)/x,o,wg(o,v,t))&&D++):_<o&&D++);D<M;++D){const t=Math.round((_+D*k)*x)/x;if(y&&t>s)break;i.push({value:t})}return y&&u&&w!==s?i.length&&rh(i[i.length-1].value,s,wg(s,v,t))?i[i.length-1].value=s:i.push({value:s}):y&&w!==s||i.push({value:w}),i}({maxTicks:i,bounds:t.bounds,min:t.min,max:t.max,precision:e.precision,step:e.stepSize,count:e.count,maxDigits:this._maxDigits(),horizontal:this.isHorizontal(),minRotation:e.minRotation||0,includeBounds:!1!==e.includeBounds},this._range||this);return"ticks"===t.bounds&&ah(n,this,"value"),t.reverse?(n.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),n}configure(){const t=this.ticks;let e=this.min,i=this.max;if(super.configure(),this.options.offset&&t.length){const n=(i-e)/Math.max(t.length-1,1)/2;e-=n,i+=n}this._startValue=e,this._endValue=i,this._valueRange=i-e}getLabelForValue(t){return Uh(t,this.chart.options.locale,this.options.ticks.format)}}class kg extends Mg{static id="linear";static defaults={ticks:{callback:Bh.formatters.numeric}};determineDataLimits(){const{min:t,max:e}=this.getMinMax(!0);this.min=Pc(t)?t:0,this.max=Pc(e)?e:1,this.handleTickRangeOptions()}computeTickLimit(){const t=this.isHorizontal(),e=t?this.width:this.height,i=lh(this.options.ticks.minRotation),n=(t?Math.sin(i):Math.cos(i))||.001,r=this._resolveTickFontOptions(0);return Math.ceil(e/Math.min(40,r.lineHeight/n))}getPixelForValue(t){return null===t?NaN:this.getPixelForDecimal((t-this._startValue)/this._valueRange)}getValueForPixel(t){return this._startValue+this.getDecimalForPixel(t)*this._valueRange}}const Sg=t=>Math.floor(ih(t)),Dg=(t,e)=>Math.pow(10,Sg(t)+e);function Eg(t){return 1==t/Math.pow(10,Sg(t))}function Og(t,e,i){const n=Math.pow(10,i),r=Math.floor(t/n);return Math.ceil(e/n)-r}class Pg extends Tf{static id="logarithmic";static defaults={ticks:{callback:Bh.formatters.logarithmic,major:{enabled:!0}}};constructor(t){super(t),this.start=void 0,this.end=void 0,this._startValue=void 0,this._valueRange=0}parse(t,e){const i=Mg.prototype.parse.apply(this,[t,e]);if(0!==i)return Pc(i)&&i>0?i:null;this._zero=!0}determineDataLimits(){const{min:t,max:e}=this.getMinMax(!0);this.min=Pc(t)?Math.max(0,t):null,this.max=Pc(e)?Math.max(0,e):null,this.options.beginAtZero&&(this._zero=!0),this._zero&&this.min!==this._suggestedMin&&!Pc(this._userMin)&&(this.min=t===Dg(this.min,0)?Dg(this.min,-1):Dg(this.min,0)),this.handleTickRangeOptions()}handleTickRangeOptions(){const{minDefined:t,maxDefined:e}=this.getUserBounds();let i=this.min,n=this.max;const r=e=>i=t?i:e,o=t=>n=e?n:t;i===n&&(i<=0?(r(1),o(10)):(r(Dg(i,-1)),o(Dg(n,1)))),i<=0&&r(Dg(n,-1)),n<=0&&o(Dg(i,1)),this.min=i,this.max=n}buildTicks(){const t=this.options,e=function(t,{min:e,max:i}){e=Ac(t.min,e);const n=[],r=Sg(e);let o=function(t,e){let i=Sg(e-t);for(;Og(t,e,i)>10;)i++;for(;Og(t,e,i)<10;)i--;return Math.min(i,Sg(t))}(e,i),s=o<0?Math.pow(10,Math.abs(o)):1;const a=Math.pow(10,o),l=r>o?Math.pow(10,r):0,c=Math.round((e-l)*s)/s,h=Math.floor((e-l)/a/10)*a*10;let u=Math.floor((c-h)/Math.pow(10,o)),d=Ac(t.min,Math.round((l+h+u*Math.pow(10,o))*s)/s);for(;d<i;)n.push({value:d,major:Eg(d),significand:u}),u>=10?u=u<15?15:20:u++,u>=20&&(o++,u=2,s=o>=0?1:s),d=Math.round((l+h+u*Math.pow(10,o))*s)/s;const f=Ac(t.max,d);return n.push({value:f,major:Eg(f),significand:u}),n}({min:this._userMin,max:this._userMax},this);return"ticks"===t.bounds&&ah(e,this,"value"),t.reverse?(e.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),e}getLabelForValue(t){return void 0===t?"0":Uh(t,this.chart.options.locale,this.options.ticks.format)}configure(){const t=this.min;super.configure(),this._startValue=ih(t),this._valueRange=ih(this.max)-ih(t)}getPixelForValue(t){return void 0!==t&&0!==t||(t=this.min),null===t||isNaN(t)?NaN:this.getPixelForDecimal(t===this.min?0:(ih(t)-this._startValue)/this._valueRange)}getValueForPixel(t){const e=this.getDecimalForPixel(t);return Math.pow(10,this._startValue+e*this._valueRange)}}function Ag(t){const e=t.ticks;if(e.display&&t.display){const t=mu(e.backdropPadding);return Cc(e.font&&e.font.size,Xh.font.size)+t.height}return 0}function Cg(t,e,i,n,r){return t===n||t===r?{start:e-i/2,end:e+i/2}:t<n||t>r?{start:e-i,end:e}:{start:e,end:e+i}}function Tg(t,e,i,n,r){const o=Math.abs(Math.sin(i)),s=Math.abs(Math.cos(i));let a=0,l=0;n.start<e.l?(a=(e.l-n.start)/o,t.l=Math.min(t.l,e.l-a)):n.end>e.r&&(a=(n.end-e.r)/o,t.r=Math.max(t.r,e.r+a)),r.start<e.t?(l=(e.t-r.start)/s,t.t=Math.min(t.t,e.t-l)):r.end>e.b&&(l=(r.end-e.b)/s,t.b=Math.max(t.b,e.b+l))}function Lg(t,e,i){const n=t.drawingArea,{extra:r,additionalAngle:o,padding:s,size:a}=i,l=t.getPointPosition(e,n+r+s,o),c=Math.round(ch(ph(l.angle+Jc))),h=function(t,e,i){return 90===i||270===i?t-=e/2:(i>270||i<90)&&(t-=e),t}(l.y,a.h,c),u=function(t){return 0===t||180===t?"center":t<180?"left":"right"}(c),d=(f=l.x,p=a.w,"right"===(g=u)?f-=p:"center"===g&&(f-=p/2),f);var f,p,g;return{visible:!0,x:l.x,y:h,textAlign:u,left:d,top:h,right:d+a.w,bottom:h+a.h}}function Rg(t,e){if(!e)return!0;const{left:i,top:n,right:r,bottom:o}=t;return!(eu({x:i,y:n},e)||eu({x:i,y:o},e)||eu({x:r,y:n},e)||eu({x:r,y:o},e))}function jg(t,e,i){const{left:n,top:r,right:o,bottom:s}=i,{backdropColor:a}=e;if(!Dc(a)){const i=gu(e.borderRadius),l=mu(e.backdropPadding);t.fillStyle=a;const c=n-l.left,h=r-l.top,u=o-n+l.width,d=s-r+l.height;Object.values(i).some((t=>0!==t))?(t.beginPath(),cu(t,{x:c,y:h,w:u,h:d,radius:i}),t.fill()):t.fillRect(c,h,u,d)}}function zg(t,e,i,n){const{ctx:r}=t;if(i)r.arc(t.xCenter,t.yCenter,e,0,qc);else{let i=t.getPointPosition(0,e);r.moveTo(i.x,i.y);for(let o=1;o<n;o++)i=t.getPointPosition(o,e),r.lineTo(i.x,i.y)}}class Ng extends Mg{static id="radialLinear";static defaults={display:!0,animate:!0,position:"chartArea",angleLines:{display:!0,lineWidth:1,borderDash:[],borderDashOffset:0},grid:{circular:!1},startAngle:0,ticks:{showLabelBackdrop:!0,callback:Bh.formatters.numeric},pointLabels:{backdropColor:void 0,backdropPadding:2,display:!0,font:{size:10},callback:t=>t,padding:5,centerPointLabels:!1}};static defaultRoutes={"angleLines.color":"borderColor","pointLabels.color":"color","ticks.color":"color"};static descriptors={angleLines:{_fallback:"grid"}};constructor(t){super(t),this.xCenter=void 0,this.yCenter=void 0,this.drawingArea=void 0,this._pointLabels=[],this._pointLabelItems=[]}setDimensions(){const t=this._padding=mu(Ag(this.options)/2),e=this.width=this.maxWidth-t.width,i=this.height=this.maxHeight-t.height;this.xCenter=Math.floor(this.left+e/2+t.left),this.yCenter=Math.floor(this.top+i/2+t.top),this.drawingArea=Math.floor(Math.min(e,i)/2)}determineDataLimits(){const{min:t,max:e}=this.getMinMax(!1);this.min=Pc(t)&&!isNaN(t)?t:0,this.max=Pc(e)&&!isNaN(e)?e:0,this.handleTickRangeOptions()}computeTickLimit(){return Math.ceil(this.drawingArea/Ag(this.options))}generateTickLabels(t){Mg.prototype.generateTickLabels.call(this,t),this._pointLabels=this.getLabels().map(((t,e)=>{const i=Lc(this.options.pointLabels.callback,[t,e],this);return i||0===i?i:""})).filter(((t,e)=>this.chart.getDataVisibility(e)))}fit(){const t=this.options;t.display&&t.pointLabels.display?function(t){const e={l:t.left+t._padding.left,r:t.right-t._padding.right,t:t.top+t._padding.top,b:t.bottom-t._padding.bottom},i=Object.assign({},e),n=[],r=[],o=t._pointLabels.length,s=t.options.pointLabels,a=s.centerPointLabels?Xc/o:0;for(let u=0;u<o;u++){const o=s.setContext(t.getPointLabelContext(u));r[u]=o.padding;const d=t.getPointPosition(u,t.drawingArea+r[u],a),f=yu(o.font),p=(l=t.ctx,c=f,h=Ec(h=t._pointLabels[u])?h:[h],{w:Zh(l,c.string,h),h:h.length*c.lineHeight});n[u]=p;const g=ph(t.getIndexAngle(u)+a),m=Math.round(ch(g));Tg(i,e,g,Cg(m,d.x,p.w,0,180),Cg(m,d.y,p.h,90,270))}var l,c,h;t.setCenterPoint(e.l-i.l,i.r-e.r,e.t-i.t,i.b-e.b),t._pointLabelItems=function(t,e,i){const n=[],r=t._pointLabels.length,o=t.options,{centerPointLabels:s,display:a}=o.pointLabels,l={extra:Ag(o)/2,additionalAngle:s?Xc/r:0};let c;for(let o=0;o<r;o++){l.padding=i[o],l.size=e[o];const r=Lg(t,o,l);n.push(r),"auto"===a&&(r.visible=Rg(r,c),r.visible&&(c=r))}return n}(t,n,r)}(this):this.setCenterPoint(0,0,0,0)}setCenterPoint(t,e,i,n){this.xCenter+=Math.floor((t-e)/2),this.yCenter+=Math.floor((i-n)/2),this.drawingArea-=Math.min(this.drawingArea/2,Math.max(t,e,i,n))}getIndexAngle(t){return ph(t*(qc/(this._pointLabels.length||1))+lh(this.options.startAngle||0))}getDistanceFromCenterForValue(t){if(Dc(t))return NaN;const e=this.drawingArea/(this.max-this.min);return this.options.reverse?(this.max-t)*e:(t-this.min)*e}getValueForDistanceFromCenter(t){if(Dc(t))return NaN;const e=t/(this.drawingArea/(this.max-this.min));return this.options.reverse?this.max-e:this.min+e}getPointLabelContext(t){const e=this._pointLabels||[];if(t>=0&&t<e.length){const i=e[t];return function(t,e,i){return vu(t,{label:i,index:e,type:"pointLabel"})}(this.getContext(),t,i)}}getPointPosition(t,e,i=0){const n=this.getIndexAngle(t)-Jc+i;return{x:Math.cos(n)*e+this.xCenter,y:Math.sin(n)*e+this.yCenter,angle:n}}getPointPositionForValue(t,e){return this.getPointPosition(t,this.getDistanceFromCenterForValue(e))}getBasePosition(t){return this.getPointPositionForValue(t||0,this.getBaseValue())}getPointLabelPosition(t){const{left:e,top:i,right:n,bottom:r}=this._pointLabelItems[t];return{left:e,top:i,right:n,bottom:r}}drawBackground(){const{backgroundColor:t,grid:{circular:e}}=this.options;if(t){const i=this.ctx;i.save(),i.beginPath(),zg(this,this.getDistanceFromCenterForValue(this._endValue),e,this._pointLabels.length),i.closePath(),i.fillStyle=t,i.fill(),i.restore()}}drawGrid(){const t=this.ctx,e=this.options,{angleLines:i,grid:n,border:r}=e,o=this._pointLabels.length;let s,a,l;if(e.pointLabels.display&&function(t,e){const{ctx:i,options:{pointLabels:n}}=t;for(let r=e-1;r>=0;r--){const e=t._pointLabelItems[r];if(!e.visible)continue;const o=n.setContext(t.getPointLabelContext(r));jg(i,o,e);const s=yu(o.font),{x:a,y:l,textAlign:c}=e;lu(i,t._pointLabels[r],a,l+s.lineHeight/2,s,{color:o.color,textAlign:c,textBaseline:"middle"})}}(this,o),n.display&&this.ticks.forEach(((t,e)=>{if(0!==e){a=this.getDistanceFromCenterForValue(t.value);const i=this.getContext(e),s=n.setContext(i),l=r.setContext(i);!function(t,e,i,n,r){const o=t.ctx,s=e.circular,{color:a,lineWidth:l}=e;!s&&!n||!a||!l||i<0||(o.save(),o.strokeStyle=a,o.lineWidth=l,o.setLineDash(r.dash),o.lineDashOffset=r.dashOffset,o.beginPath(),zg(t,i,s,n),o.closePath(),o.stroke(),o.restore())}(this,s,a,o,l)}})),i.display){for(t.save(),s=o-1;s>=0;s--){const n=i.setContext(this.getPointLabelContext(s)),{color:r,lineWidth:o}=n;o&&r&&(t.lineWidth=o,t.strokeStyle=r,t.setLineDash(n.borderDash),t.lineDashOffset=n.borderDashOffset,a=this.getDistanceFromCenterForValue(e.ticks.reverse?this.min:this.max),l=this.getPointPosition(s,a),t.beginPath(),t.moveTo(this.xCenter,this.yCenter),t.lineTo(l.x,l.y),t.stroke())}t.restore()}}drawBorder(){}drawLabels(){const t=this.ctx,e=this.options,i=e.ticks;if(!i.display)return;const n=this.getIndexAngle(0);let r,o;t.save(),t.translate(this.xCenter,this.yCenter),t.rotate(n),t.textAlign="center",t.textBaseline="middle",this.ticks.forEach(((n,s)=>{if(0===s&&!e.reverse)return;const a=i.setContext(this.getContext(s)),l=yu(a.font);if(r=this.getDistanceFromCenterForValue(this.ticks[s].value),a.showLabelBackdrop){t.font=l.string,o=t.measureText(n.label).width,t.fillStyle=a.backdropColor;const e=mu(a.backdropPadding);t.fillRect(-o/2-e.left,-r-l.size/2-e.top,o+e.width,l.size+e.height)}lu(t,n.label,0,-r,l,{color:a.color,strokeColor:a.textStrokeColor,strokeWidth:a.textStrokeWidth})})),t.restore()}drawTitle(){}}const Ig={millisecond:{common:!0,size:1,steps:1e3},second:{common:!0,size:1e3,steps:60},minute:{common:!0,size:6e4,steps:60},hour:{common:!0,size:36e5,steps:24},day:{common:!0,size:864e5,steps:30},week:{common:!1,size:6048e5,steps:4},month:{common:!0,size:2628e6,steps:12},quarter:{common:!1,size:7884e6,steps:4},year:{common:!0,size:3154e7}},Hg=Object.keys(Ig);function Ug(t,e){return t-e}function Fg(t,e){if(Dc(e))return null;const i=t._adapter,{parser:n,round:r,isoWeekday:o}=t._parseOpts;let s=e;return"function"==typeof n&&(s=n(s)),Pc(s)||(s="string"==typeof n?i.parse(s,n):i.parse(s)),null===s?null:(r&&(s="week"!==r||!sh(o)&&!0!==o?i.startOf(s,r):i.startOf(s,"isoWeek",o)),+s)}function Bg(t,e,i,n){const r=Hg.length;for(let o=Hg.indexOf(t);o<r-1;++o){const t=Ig[Hg[o]],r=t.steps?t.steps:Number.MAX_SAFE_INTEGER;if(t.common&&Math.ceil((i-e)/(r*t.size))<=n)return Hg[o]}return Hg[r-1]}function Wg(t,e,i){if(i){if(i.length){const{lo:n,hi:r}=bh(i,e);t[i[n]>=e?i[n]:i[r]]=!0}}else t[e]=!0}function Vg(t,e,i){const n=[],r={},o=e.length;let s,a;for(s=0;s<o;++s)a=e[s],r[a]=s,n.push({value:a,major:!1});return 0!==o&&i?function(t,e,i,n){const r=t._adapter,o=+r.startOf(e[0].value,n),s=e[e.length-1].value;let a,l;for(a=o;a<=s;a=+r.add(a,1,n))l=i[a],l>=0&&(e[l].major=!0);return e}(t,n,r,i):n}class $g extends Tf{static id="time";static defaults={bounds:"data",adapters:{},time:{parser:!1,unit:!1,round:!1,isoWeekday:!1,minUnit:"millisecond",displayFormats:{}},ticks:{source:"auto",callback:!1,major:{enabled:!1}}};constructor(t){super(t),this._cache={data:[],labels:[],all:[]},this._unit="day",this._majorUnit=void 0,this._offsets={},this._normalized=!1,this._parseOpts=void 0}init(t,e={}){const i=t.time||(t.time={}),n=this._adapter=new Ud(t.adapters.date);n.init(e),Uc(i.displayFormats,n.formats()),this._parseOpts={parser:i.parser,round:i.round,isoWeekday:i.isoWeekday},super.init(t),this._normalized=e.normalized}parse(t,e){return void 0===t?null:Fg(this,t)}beforeLayout(){super.beforeLayout(),this._cache={data:[],labels:[],all:[]}}determineDataLimits(){const t=this.options,e=this._adapter,i=t.time.unit||"day";let{min:n,max:r,minDefined:o,maxDefined:s}=this.getUserBounds();function a(t){o||isNaN(t.min)||(n=Math.min(n,t.min)),s||isNaN(t.max)||(r=Math.max(r,t.max))}o&&s||(a(this._getLabelBounds()),"ticks"===t.bounds&&"labels"===t.ticks.source||a(this.getMinMax(!1))),n=Pc(n)&&!isNaN(n)?n:+e.startOf(Date.now(),i),r=Pc(r)&&!isNaN(r)?r:+e.endOf(Date.now(),i)+1,this.min=Math.min(n,r-1),this.max=Math.max(n+1,r)}_getLabelBounds(){const t=this.getLabelTimestamps();let e=Number.POSITIVE_INFINITY,i=Number.NEGATIVE_INFINITY;return t.length&&(e=t[0],i=t[t.length-1]),{min:e,max:i}}buildTicks(){const t=this.options,e=t.time,i=t.ticks,n="labels"===i.source?this.getLabelTimestamps():this._generate();"ticks"===t.bounds&&n.length&&(this.min=this._userMin||n[0],this.max=this._userMax||n[n.length-1]);const r=this.min,o=function(t,e,i){let n=0,r=t.length;for(;n<r&&t[n]<e;)n++;for(;r>n&&t[r-1]>i;)r--;return n>0||r<t.length?t.slice(n,r):t}(n,r,this.max);return this._unit=e.unit||(i.autoSkip?Bg(e.minUnit,this.min,this.max,this._getLabelCapacity(r)):function(t,e,i,n,r){for(let o=Hg.length-1;o>=Hg.indexOf(i);o--){const i=Hg[o];if(Ig[i].common&&t._adapter.diff(r,n,i)>=e-1)return i}return Hg[i?Hg.indexOf(i):0]}(this,o.length,e.minUnit,this.min,this.max)),this._majorUnit=i.major.enabled&&"year"!==this._unit?function(t){for(let e=Hg.indexOf(t)+1,i=Hg.length;e<i;++e)if(Ig[Hg[e]].common)return Hg[e]}(this._unit):void 0,this.initOffsets(n),t.reverse&&o.reverse(),Vg(this,o,this._majorUnit)}afterAutoSkip(){this.options.offsetAfterAutoskip&&this.initOffsets(this.ticks.map((t=>+t.value)))}initOffsets(t=[]){let e,i,n=0,r=0;this.options.offset&&t.length&&(e=this.getDecimalForValue(t[0]),n=1===t.length?1-e:(this.getDecimalForValue(t[1])-e)/2,i=this.getDecimalForValue(t[t.length-1]),r=1===t.length?i:(i-this.getDecimalForValue(t[t.length-2]))/2);const o=t.length<3?.5:.25;n=mh(n,0,o),r=mh(r,0,o),this._offsets={start:n,end:r,factor:1/(n+1+r)}}_generate(){const t=this._adapter,e=this.min,i=this.max,n=this.options,r=n.time,o=r.unit||Bg(r.minUnit,e,i,this._getLabelCapacity(e)),s=Cc(n.ticks.stepSize,1),a="week"===o&&r.isoWeekday,l=sh(a)||!0===a,c={};let h,u,d=e;if(l&&(d=+t.startOf(d,"isoWeek",a)),d=+t.startOf(d,l?"day":o),t.diff(i,e,o)>1e5*s)throw new Error(e+" and "+i+" are too far apart with stepSize of "+s+" "+o);const f="data"===n.ticks.source&&this.getDataTimestamps();for(h=d,u=0;h<i;h=+t.add(h,s,o),u++)Wg(c,h,f);return h!==i&&"ticks"!==n.bounds&&1!==u||Wg(c,h,f),Object.keys(c).sort(Ug).map((t=>+t))}getLabelForValue(t){const e=this._adapter,i=this.options.time;return i.tooltipFormat?e.format(t,i.tooltipFormat):e.format(t,i.displayFormats.datetime)}format(t,e){const i=this.options.time.displayFormats,n=this._unit,r=e||i[n];return this._adapter.format(t,r)}_tickFormatFunction(t,e,i,n){const r=this.options,o=r.ticks.callback;if(o)return Lc(o,[t,e,i],this);const s=r.time.displayFormats,a=this._unit,l=this._majorUnit,c=a&&s[a],h=l&&s[l],u=i[e],d=l&&h&&u&&u.major;return this._adapter.format(t,n||(d?h:c))}generateTickLabels(t){let e,i,n;for(e=0,i=t.length;e<i;++e)n=t[e],n.label=this._tickFormatFunction(n.value,e,t)}getDecimalForValue(t){return null===t?NaN:(t-this.min)/(this.max-this.min)}getPixelForValue(t){const e=this._offsets,i=this.getDecimalForValue(t);return this.getPixelForDecimal((e.start+i)*e.factor)}getValueForPixel(t){const e=this._offsets,i=this.getDecimalForPixel(t)/e.factor-e.end;return this.min+i*(this.max-this.min)}_getLabelSize(t){const e=this.options.ticks,i=this.ctx.measureText(t).width,n=lh(this.isHorizontal()?e.maxRotation:e.minRotation),r=Math.cos(n),o=Math.sin(n),s=this._resolveTickFontOptions(0).size;return{w:i*r+s*o,h:i*o+s*r}}_getLabelCapacity(t){const e=this.options.time,i=e.displayFormats,n=i[e.unit]||i.millisecond,r=this._tickFormatFunction(t,0,Vg(this,[t],this._majorUnit),n),o=this._getLabelSize(r),s=Math.floor(this.isHorizontal()?this.width/o.w:this.height/o.h)-1;return s>0?s:1}getDataTimestamps(){let t,e,i=this._cache.data||[];if(i.length)return i;const n=this.getMatchingVisibleMetas();if(this._normalized&&n.length)return this._cache.data=n[0].controller.getAllParsedValues(this);for(t=0,e=n.length;t<e;++t)i=i.concat(n[t].controller.getAllParsedValues(this));return this._cache.data=this.normalize(i)}getLabelTimestamps(){const t=this._cache.labels||[];let e,i;if(t.length)return t;const n=this.getLabels();for(e=0,i=n.length;e<i;++e)t.push(Fg(this,n[e]));return this._cache.labels=this._normalized?t:this.normalize(t)}normalize(t){return Mh(t.sort(Ug))}}function Yg(t,e,i){let n,r,o,s,a=0,l=t.length-1;i?(e>=t[a].pos&&e<=t[l].pos&&({lo:a,hi:l}=vh(t,"pos",e)),({pos:n,time:o}=t[a]),({pos:r,time:s}=t[l])):(e>=t[a].time&&e<=t[l].time&&({lo:a,hi:l}=vh(t,"time",e)),({time:n,pos:o}=t[a]),({time:r,pos:s}=t[l]));const c=r-n;return c?o+(s-o)*(e-n)/c:o}var Gg=Object.freeze({__proto__:null,CategoryScale:class extends Tf{static id="category";static defaults={ticks:{callback:_g}};constructor(t){super(t),this._startValue=void 0,this._valueRange=0,this._addedLabels=[]}init(t){const e=this._addedLabels;if(e.length){const t=this.getLabels();for(const{index:i,label:n}of e)t[i]===n&&t.splice(i,1);this._addedLabels=[]}super.init(t)}parse(t,e){if(Dc(t))return null;const i=this.getLabels();return((t,e)=>null===t?null:mh(Math.round(t),0,e))(e=isFinite(e)&&i[e]===t?e:function(t,e,i,n){const r=t.indexOf(e);return-1===r?((t,e,i,n)=>("string"==typeof e?(i=t.push(e)-1,n.unshift({index:i,label:e})):isNaN(e)&&(i=null),i))(t,e,i,n):r!==t.lastIndexOf(e)?i:r}(i,t,Cc(e,t),this._addedLabels),i.length-1)}determineDataLimits(){const{minDefined:t,maxDefined:e}=this.getUserBounds();let{min:i,max:n}=this.getMinMax(!0);"ticks"===this.options.bounds&&(t||(i=0),e||(n=this.getLabels().length-1)),this.min=i,this.max=n}buildTicks(){const t=this.min,e=this.max,i=this.options.offset,n=[];let r=this.getLabels();r=0===t&&e===r.length-1?r:r.slice(t,e+1),this._valueRange=Math.max(r.length-(i?0:1),1),this._startValue=this.min-(i?.5:0);for(let i=t;i<=e;i++)n.push({value:i});return n}getLabelForValue(t){return _g.call(this,t)}configure(){super.configure(),this.isHorizontal()||(this._reversePixels=!this._reversePixels)}getPixelForValue(t){return"number"!=typeof t&&(t=this.parse(t)),null===t?NaN:this.getPixelForDecimal((t-this._startValue)/this._valueRange)}getPixelForTick(t){const e=this.ticks;return t<0||t>e.length-1?null:this.getPixelForValue(e[t].value)}getValueForPixel(t){return Math.round(this._startValue+this.getDecimalForPixel(t)*this._valueRange)}getBasePixel(){return this.bottom}},LinearScale:kg,LogarithmicScale:Pg,RadialLinearScale:Ng,TimeScale:$g,TimeSeriesScale:class extends $g{static id="timeseries";static defaults=$g.defaults;constructor(t){super(t),this._table=[],this._minPos=void 0,this._tableRange=void 0}initOffsets(){const t=this._getTimestampsForTable(),e=this._table=this.buildLookupTable(t);this._minPos=Yg(e,this.min),this._tableRange=Yg(e,this.max)-this._minPos,super.initOffsets(t)}buildLookupTable(t){const{min:e,max:i}=this,n=[],r=[];let o,s,a,l,c;for(o=0,s=t.length;o<s;++o)l=t[o],l>=e&&l<=i&&n.push(l);if(n.length<2)return[{time:e,pos:0},{time:i,pos:1}];for(o=0,s=n.length;o<s;++o)c=n[o+1],a=n[o-1],l=n[o],Math.round((c+a)/2)!==l&&r.push({time:l,pos:o/(s-1)});return r}_generate(){const t=this.min,e=this.max;let i=super.getDataTimestamps();return i.includes(t)&&i.length||i.splice(0,0,t),i.includes(e)&&1!==i.length||i.push(e),i.sort(((t,e)=>t-e))}_getTimestampsForTable(){let t=this._cache.all||[];if(t.length)return t;const e=this.getDataTimestamps(),i=this.getLabelTimestamps();return t=e.length&&i.length?this.normalize(e.concat(i)):e.length?e:i,t=this._cache.all=t,t}getDecimalForValue(t){return(Yg(this._table,t)-this._minPos)/this._tableRange}getValueForPixel(t){const e=this._offsets,i=this.getDecimalForPixel(t)/e.factor-e.end;return Yg(this._table,i*this._tableRange+this._minPos,!0)}}});const Xg=[Nd,Sp,xg,Gg];ap.register(...Xg);const qg=ap;function Zg(t){return Zg="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Zg(t)}function Kg(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function Qg(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,(void 0,r=function(t,e){if("object"!==Zg(t)||null===t)return t;var i=t[Symbol.toPrimitive];if(void 0!==i){var n=i.call(t,"string");if("object"!==Zg(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(n.key),"symbol"===Zg(r)?r:String(r)),n)}var r}var Jg=function(){function t(e,i,n){var r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"bar";Kg(this,t),this.title=e,this.description=i,this.data=n,this.options=r,this.type=o,this.dataIsValid=Array.isArray(n)?n.length>0:!!n}var e,i;return e=t,(i=[{key:"plot",value:function(t,e,i){var n=this;i.style="background-color: #f5f5f5; padding: 5px;";var r=document.createElement("div");if(r.className="chart-title grid-title",r.innerHTML=this.title,r.style="margin-bottom: 5px",this.description){var o=document.createElement("div");o.className="question-mark-legacy",o.innerHTML="?";var s=Date.now();o.id="id-".concat(s),r.appendChild(o),setTimeout((function(){var t=document.getElementById("id-".concat(s));t&&t.addEventListener("click",(function(t){n.options.onShowDesc(n.description)}))}))}i.appendChild(r);var a=document.createElement("div");return a.className="card",i.appendChild(a),this.canvas=document.createElement("canvas"),this.canvas.id=self.crypto.randomUUID(),a.appendChild(this.canvas),this.canvas.style.backgroundColor="#fff",this.chart=new qg(this.canvas.id,{type:this.type,data:this.data,options:this.options.chartjs_options}),null}}])&&Qg(e.prototype,i),Object.defineProperty(e,"prototype",{writable:!1}),t}();function tm(t){return tm="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},tm(t)}function em(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,n=new Array(e);i<e;i++)n[i]=t[i];return n}function im(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,(void 0,r=function(t,e){if("object"!==tm(t)||null===t)return t;var i=t[Symbol.toPrimitive];if(void 0!==i){var n=i.call(t,"string");if("object"!==tm(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(n.key),"symbol"===tm(r)?r:String(r)),n)}var r}function nm(t,e){return nm=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},nm(t,e)}function rm(t,e){if(e&&("object"===tm(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t)}function om(t){return om=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},om(t)}var sm=function(t){!function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&nm(t,e)}(s,t);var e,i,n,r,o=(n=s,r=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}}(),function(){var t,e=om(n);if(r){var i=om(this).constructor;t=Reflect.construct(e,arguments,i)}else t=e.apply(this,arguments);return rm(this,t)});function s(t,e,i,n){var r;return function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,s),n.transform&&(i=(null!==(r=i)&&void 0!==r?r:[]).map(n.transform)),o.call(this,t,e,i,n)}return e=s,i=[{key:"plot",value:function(t,e,i){this.marginRight=40,this.marginBottom=40;var n,r,o=(n=this.clearAndScaleSvg(t,e,20,20),r=2,function(t){if(Array.isArray(t))return t}(n)||function(t,e){var i=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=i){var n,r,o,s,a=[],l=!0,c=!1;try{if(o=(i=i.call(t)).next,0===e){if(Object(i)!==i)return;l=!1}else for(;!(l=(n=o.call(i)).done)&&(a.push(n.value),a.length!==e);l=!0);}catch(t){c=!0,r=t}finally{try{if(!l&&null!=i.return&&(s=i.return(),Object(s)!==s))return}finally{if(c)throw r}}return a}}(n,r)||function(t,e){if(t){if("string"==typeof t)return em(t,e);var i=Object.prototype.toString.call(t).slice(8,-1);return"Object"===i&&t.constructor&&(i=t.constructor.name),"Map"===i||"Set"===i?Array.from(t):"Arguments"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?em(t,e):void 0}}(n,r)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),s=o[0],a=o[1];if(this.drawTitle(),!this.dataIsValid)return this.showErrorMessage(t,e),this.wrapper.innerHTML;var l=R(this.data,(function(t){return t.group})),c=R(this.data,(function(t){return t.variable})),h=On().range([0,s]).padding(.1),u=On().range([a,0]).padding(.1);h.domain(l),u.domain(c),this.options.showLegend&&(this.g.append("g").style("font-size",15).attr("transform","translate(0,"+a+")").call(q(h).tickSize(0)).select(".domain").remove(),this.g.append("g").style("font-size",15).call(Z(u).tickSize(0)).select(".domain").remove());var d=T(this.data,(function(t){return t.value})),f=js().interpolator(Us).domain([0,d]);return this.g.selectAll().data(this.data,(function(t){return t.group+":"+t.variable})).enter().append("rect").attr("x",(function(t){return h(t.group)})).attr("y",(function(t){return u(t.variable)})).attr("rx",4).attr("ry",4).attr("width",h.bandwidth()).attr("height",u.bandwidth()).style("fill",(function(t){return f(t.value)})).style("stroke-width",4).style("stroke","none").style("opacity",.8),this.wrapper.innerHTML}}],i&&im(e.prototype,i),Object.defineProperty(e,"prototype",{writable:!1}),s}(za);function am(t){return am="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},am(t)}function lm(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,(void 0,r=function(t,e){if("object"!==am(t)||null===t)return t;var i=t[Symbol.toPrimitive];if(void 0!==i){var n=i.call(t,"string");if("object"!==am(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(n.key),"symbol"===am(r)?r:String(r)),n)}var r}var cm=function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t)}var e,i;return e=t,(i=[{key:"plot",value:function(t,e,i){}}])&&lm(e.prototype,i),Object.defineProperty(e,"prototype",{writable:!1}),t}();function hm(t){return hm="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},hm(t)}function um(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function dm(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,(void 0,r=function(t,e){if("object"!==hm(t)||null===t)return t;var i=t[Symbol.toPrimitive];if(void 0!==i){var n=i.call(t,"string");if("object"!==hm(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(n.key),"symbol"===hm(r)?r:String(r)),n)}var r}function fm(t,e){return fm=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},fm(t,e)}function pm(t,e){if(e&&("object"===hm(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t)}function gm(t){return gm=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},gm(t)}var mm=function(t){!function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&fm(t,e)}(s,t);var e,i,n,r,o=(n=s,r=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}}(),function(){var t,e=gm(n);if(r){var i=gm(this).constructor;t=Reflect.construct(e,arguments,i)}else t=e.apply(this,arguments);return pm(this,t)});function s(t){var e,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return um(this,s),(e=o.call(this,i)).text=t,e}return e=s,(i=[{key:"plot",value:function(t,e,i){var n=document.createElement("div");n.innerHTML=this.text,i.appendChild(n)}}])&&dm(e.prototype,i),Object.defineProperty(e,"prototype",{writable:!1}),s}(cm);function ym(t){return ym="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},ym(t)}function bm(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function vm(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,(void 0,r=function(t,e){if("object"!==ym(t)||null===t)return t;var i=t[Symbol.toPrimitive];if(void 0!==i){var n=i.call(t,"string");if("object"!==ym(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(n.key),"symbol"===ym(r)?r:String(r)),n)}var r}function xm(t,e){return xm=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},xm(t,e)}function _m(t,e){if(e&&("object"===ym(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t)}function wm(t){return wm=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},wm(t)}var Mm=function(t){!function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&xm(t,e)}(s,t);var e,i,n,r,o=(n=s,r=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}}(),function(){var t,e=wm(n);if(r){var i=wm(this).constructor;t=Reflect.construct(e,arguments,i)}else t=e.apply(this,arguments);return _m(this,t)});function s(t){var e,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return bm(this,s),(e=o.call(this,i)).text=t,e}return e=s,(i=[{key:"plot",value:function(t,e,i){var n=document.createElement("textarea");n.placeholder=this.text,n.rows=e/24,n.height=e,n.className="form-control",i.appendChild(n)}}])&&vm(e.prototype,i),Object.defineProperty(e,"prototype",{writable:!1}),s}(cm);function km(t){return km="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},km(t)}function Sm(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,n=new Array(e);i<e;i++)n[i]=t[i];return n}function Dm(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,(void 0,r=function(t,e){if("object"!==km(t)||null===t)return t;var i=t[Symbol.toPrimitive];if(void 0!==i){var n=i.call(t,"string");if("object"!==km(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(n.key),"symbol"===km(r)?r:String(r)),n)}var r}function Em(t,e){return Em=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},Em(t,e)}function Om(t,e){if(e&&("object"===km(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t)}function Pm(t){return Pm=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},Pm(t)}var Am=function(t){!function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&Em(t,e)}(s,t);var e,i,n,r,o=(n=s,r=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}}(),function(){var t,e=Pm(n);if(r){var i=Pm(this).constructor;t=Reflect.construct(e,arguments,i)}else t=e.apply(this,arguments);return Om(this,t)});function s(t,e,i,n){var r;return function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,s),n.transform&&(i=(null!==(r=i)&&void 0!==r?r:[]).map(n.transform)),o.call(this,t,e,i,n)}return e=s,(i=[{key:"plot",value:function(t,e,i){this.marginRight=50,this.marginBottom=50;var n,r,o=(n=this.clearAndScaleSvg(t,e,20,40),r=2,function(t){if(Array.isArray(t))return t}(n)||function(t,e){var i=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=i){var n,r,o,s,a=[],l=!0,c=!1;try{if(o=(i=i.call(t)).next,0===e){if(Object(i)!==i)return;l=!1}else for(;!(l=(n=o.call(i)).done)&&(a.push(n.value),a.length!==e);l=!0);}catch(t){c=!0,r=t}finally{try{if(!l&&null!=i.return&&(s=i.return(),Object(s)!==s))return}finally{if(c)throw r}}return a}}(n,r)||function(t,e){if(t){if("string"==typeof t)return Sm(t,e);var i=Object.prototype.toString.call(t).slice(8,-1);return"Object"===i&&t.constructor&&(i=t.constructor.name),"Map"===i||"Set"===i?Array.from(t):"Arguments"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?Sm(t,e):void 0}}(n,r)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),s=o[0],a=o[1];if(this.drawTitle(),!this.dataIsValid)return this.showErrorMessage(t,e),this.wrapper.innerHTML;var l="color"in this.options?this.options.color:"#001122",c="highlight_color"in this.options?this.options.highlight_color:"#00AA44",h="xmax"in this.options?this.options.xmax:T(this.data,(function(t){return t.column1})),u="ymax"in this.options?this.options.ymax:T(this.data,(function(t){return t.column2})),d=mr().range([0,s]),f=mr().range([0,a]);return d.domain([0,h]),f.domain([0,u]),(!("showAxes"in this.options)||this.options.showAxes)&&(this.appendXAxis(d,a),this.appendXAxisLabel(s,a),this.appendYAxisLabel(),this.g.append("g").attr("transform","translate(0, 0)").call(Z(f))),this.g.append("g").selectAll("dot").data(this.data).enter().append("circle").attr("cx",(function(t){return d(t.column1)})).attr("cy",(function(t){return f(t.column2)})).attr("r",2.5).style("fill",(function(t){return"highlight"in t&&t.highlight?c:l})),this.wrapper.innerHTML}}])&&Dm(e.prototype,i),Object.defineProperty(e,"prototype",{writable:!1}),s}(za);function Cm(t){return Cm="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Cm(t)}function Tm(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,n=new Array(e);i<e;i++)n[i]=t[i];return n}function Lm(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,(void 0,r=function(t,e){if("object"!==Cm(t)||null===t)return t;var i=t[Symbol.toPrimitive];if(void 0!==i){var n=i.call(t,"string");if("object"!==Cm(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(n.key),"symbol"===Cm(r)?r:String(r)),n)}var r}function Rm(t,e){return Rm=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},Rm(t,e)}function jm(t,e){if(e&&("object"===Cm(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t)}function zm(t){return zm=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},zm(t)}var Nm=function(t){!function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&Rm(t,e)}(s,t);var e,i,n,r,o=(n=s,r=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}}(),function(){var t,e=zm(n);if(r){var i=zm(this).constructor;t=Reflect.construct(e,arguments,i)}else t=e.apply(this,arguments);return jm(this,t)});function s(t,e,i,n){var r,a;return function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,s),n.transform&&(i=(null!==(r=i)&&void 0!==r?r:[]).map(n.transform)),(a=o.call(this,t,e,i,n)).marginRight=10,a.marginBottom=20,a}return e=s,i=[{key:"plot",value:function(t,e,i){var n,r,o=(n=this.clearAndScaleSvg(t,e,5,10),r=2,function(t){if(Array.isArray(t))return t}(n)||function(t,e){var i=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=i){var n,r,o,s,a=[],l=!0,c=!1;try{if(o=(i=i.call(t)).next,0===e){if(Object(i)!==i)return;l=!1}else for(;!(l=(n=o.call(i)).done)&&(a.push(n.value),a.length!==e);l=!0);}catch(t){c=!0,r=t}finally{try{if(!l&&null!=i.return&&(s=i.return(),Object(s)!==s))return}finally{if(c)throw r}}return a}}(n,r)||function(t,e){if(t){if("string"==typeof t)return Tm(t,e);var i=Object.prototype.toString.call(t).slice(8,-1);return"Object"===i&&t.constructor&&(i=t.constructor.name),"Map"===i||"Set"===i?Array.from(t):"Arguments"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?Tm(t,e):void 0}}(n,r)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),s=o[0],a=o[1];this.drawTitle();var l=mr().domain([this.data.min,this.data.max]).range([s,0]),c=a/2;return this.g.append("line").attr("x1",l(this.data.min)).attr("x2",l(this.data.max)).attr("y1",c).attr("y2",c).attr("stroke","black"),this.g.append("rect").attr("x",l(this.data.q3)).attr("y",c-a/2).attr("height",a).attr("width",l(this.data.q1)-l(this.data.q3)).attr("stroke","black").style("fill","#69b3a2"),this.g.selectAll("toto").data([this.data.min,this.data.median,this.data.max]).enter().append("line").attr("x1",(function(t){return l(t)})).attr("x2",(function(t){return l(t)})).attr("y1",c-a/2).attr("y2",c+a/2).attr("stroke","black"),this.wrapper.innerHTML}}],i&&Lm(e.prototype,i),Object.defineProperty(e,"prototype",{writable:!1}),s}(za);function Im(t){return Im="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Im(t)}function Hm(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,n=new Array(e);i<e;i++)n[i]=t[i];return n}function Um(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,(void 0,r=function(t,e){if("object"!==Im(t)||null===t)return t;var i=t[Symbol.toPrimitive];if(void 0!==i){var n=i.call(t,"string");if("object"!==Im(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(n.key),"symbol"===Im(r)?r:String(r)),n)}var r}function Fm(t,e){return Fm=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},Fm(t,e)}function Bm(t,e){if(e&&("object"===Im(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t)}function Wm(t){return Wm=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},Wm(t)}var Vm=function(t){!function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&Fm(t,e)}(s,t);var e,i,n,r,o=(n=s,r=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}}(),function(){var t,e=Wm(n);if(r){var i=Wm(this).constructor;t=Reflect.construct(e,arguments,i)}else t=e.apply(this,arguments);return Bm(this,t)});function s(t,e,i,n){var r,a;return function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,s),n.transform&&(i=(null!==(r=i)&&void 0!==r?r:[]).map(n.transform)),(a=o.call(this,t,e,i,n)).svg.remove(),delete a.svg,delete a.wrapper,a}return e=s,(i=[{key:"plot",value:function(t,e,i){var n=this;if(!this.dataIsValid)return console.log("Error: Grid data invalid"),"";var r=document.createElement("div");if(r.className="chart-title grid-title",r.innerHTML=this.title,this.description){var o=document.createElement("div");o.className="question-mark-legacy",o.innerHTML="?";var a=Date.now();o.id="id-".concat(a),r.appendChild(o),setTimeout((function(){var t=document.getElementById("id-".concat(a));t&&t.addEventListener("click",(function(t){n.options.onShowDesc(n.description)}))}))}i.appendChild(r),i.style="background-color: #f5f5f5";var l=t,c=e,h=document.createElement("div");h.className="card",h.style="margin: 5px";var u=document.createElement("div");u.style.display="flex",this.options.direction?u.style.flexDirection=this.options.direction:u.style.flexDirection="row";var d=document.createElement("div");d.className="chart-subtitle",d.innerHTML="temp",i.appendChild(d),c-=r.offsetHeight,c-=d.offsetHeight,c-=12,i.removeChild(d),h.appendChild(u),i.appendChild(h),"row"==u.style.flexDirection?(l-=12,l/=this.data.length):(c-=16*this.data.filter((function(t){return""!=t.name})).length,c/=this.data.length,l-=12);var f,p=!0,g=function(t,e){var i="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!i){if(Array.isArray(t)||(i=function(t,e){if(t){if("string"==typeof t)return Hm(t,e);var i=Object.prototype.toString.call(t).slice(8,-1);return"Object"===i&&t.constructor&&(i=t.constructor.name),"Map"===i||"Set"===i?Array.from(t):"Arguments"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?Hm(t,e):void 0}}(t))||e&&t&&"number"==typeof t.length){i&&(t=i);var n=0,r=function(){};return{s:r,n:function(){return n>=t.length?{done:!0}:{done:!1,value:t[n++]}},e:function(t){throw t},f:r}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){i=i.call(t)},n:function(){var t=i.next();return s=t.done,t},e:function(t){a=!0,o=t},f:function(){try{s||null==i.return||i.return()}finally{if(a)throw o}}}}(this.data);try{for(g.s();!(f=g.n()).done;){var m=f.value,y=document.createElement("div");p||"column"===this.options.direction||(y.style="border-left: 1px solid grey"),u.appendChild(y);var b=null;switch(m.type){case"textAreaElement":b=new Mm(m.data.text,m.options);break;case"textElement":b=new mm(m.data.text,m.options);break;case"areachart":b=new pl("","",m.data,m.options);break;case"barchart":b=new Qa("","",m.data,m.options);break;case"boxplot":b=new Nm("","",m.data,m.options);break;case"chartjs":b=new Jg("","",m.data,m.options);break;case"grid":b=new s("","",m.data,m.options);break;case"grouped_barchart":b=new Ll("","",m.data,m.options);break;case"heatmap":b=new sm("","",m.data,m.options);break;case"linechart":b=new $a("","",m.data,m.options);break;case"piechart":b=new sl("","",m.data,m.options);break;case"simple_grouped_barchart":b=new Gl("","",m.data,m.options);break;case"stacked_barchart":b=new Dl("","",m.data,m.options);break;case"scatterchart":b=new Am("","",m.data,m.options);break;default:u.removeChild(y);continue}if("column"===this.options.direction){var v,x;null===(v=y.querySelector(".chart-title"))||void 0===v||v.parentElement.remove(),null===(x=y.querySelector(".question-mark"))||void 0===x||x.parentElement.remove();var _=document.createElement("div");_.className="chart-subtitle column",_.innerHTML=m.name,y.appendChild(_);var w=b.plot(l,c,y);null!=w&&(y.innerHTML=y.innerHTML+w)}else{var M,k;null===(M=y.querySelector(".chart-title"))||void 0===M||M.parentElement.remove(),null===(k=y.querySelector(".question-mark"))||void 0===k||k.parentElement.remove();var S=document.createElement("div");S.className="chart-subtitle",S.innerHTML=m.name,y.appendChild(S);var D=b.plot(l,c,y);null!=D&&(y.innerHTML=y.innerHTML+D)}p=!1}}catch(t){g.e(t)}finally{g.f()}return null}}])&&Um(e.prototype,i),Object.defineProperty(e,"prototype",{writable:!1}),s}(za)})(),n})())); \ No newline at end of file +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports["dashboard-sdk"]=e():t["dashboard-sdk"]=e()}(self,(()=>(()=>{var t={437:(t,e,i)=>{var n={IFI:i(550),polaris:i(252)};t.exports=n},793:t=>{t.exports=function(t){var e=t.name,i=t.homePage;return{key:"account",getStatement:function(){return{name:e,homePage:i}}}}},392:t=>{function e(t){return e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},e(t)}t.exports=function(t,i){var n,r,o,s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"en-US";return{id:t.toString(),description:(n={},r=s,o=i,(r=function(t){var i=function(t,i){if("object"!==e(t)||null===t)return t;var n=t[Symbol.toPrimitive];if(void 0!==n){var r=n.call(t,"string");if("object"!==e(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"===e(i)?i:String(i)}(r))in n?Object.defineProperty(n,r,{value:o,enumerable:!0,configurable:!0,writable:!0}):n[r]=o,n)}}},550:(t,e,i)=>{var n={account:i(793),mbox:i(917),opeinId:i(722),choice:i(392)};t.exports=n},917:t=>{t.exports=function(t){return{key:arguments.length>1&&void 0!==arguments[1]&&arguments[1]?"mbox_sha1sum":"mbox",getStatement:function(){return t}}}},722:t=>{t.exports=function(t){return{key:"openid",getStatement:function(){return t}}}},163:t=>{function e(t){return e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},e(t)}function i(t,e){var i=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),i.push.apply(i,n)}return i}function n(t){for(var e=1;e<arguments.length;e++){var n=null!=arguments[e]?arguments[e]:{};e%2?i(Object(n),!0).forEach((function(e){r(t,e,n[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(n)):i(Object(n)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(n,e))}))}return t}function r(t,i,n){return(i=function(t){var i=function(t,i){if("object"!==e(t)||null===t)return t;var n=t[Symbol.toPrimitive];if(void 0!==n){var r=n.call(t,"string");if("object"!==e(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"===e(i)?i:String(i)}(i))in t?Object.defineProperty(t,i,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[i]=n,t}t.exports=function(t){if("account"!==t.key)throw new Error("Actor must be identified by account https://github.com/AICC/CMI-5_Spec_Current/blob/quartz/cmi5_spec.md#92-actor");var e=r({objectType:"Agent"},t.key,t.getStatement());return{key:"actor",name:function(t){return e=n(n({},e),{},{name:t}),this},getStatement:function(){return e}}}},252:(t,e,i)=>{var n={actor:i(163),answered:i(122),completed:i(900),failed:i(378),initialized:i(672),passed:i(456),registered:i(88),terminated:i(126),resized:i(406)};t.exports=n},122:(t,e,i)=>{function n(t){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},n(t)}function r(t,e){var i=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),i.push.apply(i,n)}return i}function o(t){for(var e=1;e<arguments.length;e++){var i=null!=arguments[e]?arguments[e]:{};e%2?r(Object(i),!0).forEach((function(e){var r,o,s;r=t,o=e,s=i[e],(o=function(t){var e=function(t,e){if("object"!==n(t)||null===t)return t;var i=t[Symbol.toPrimitive];if(void 0!==i){var r=i.call(t,"string");if("object"!==n(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"===n(e)?e:String(e)}(o))in r?Object.defineProperty(r,o,{value:s,enumerable:!0,configurable:!0,writable:!0}):r[o]=s})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(i)):r(Object(i)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(i,e))}))}return t}var s=i(533),a=i(502).cmi5;t.exports=function(){var t={},e=s(a.answered);return o(o({},e),{},{result:function(e,i,n,r,o,s){return t={result:{score:e,success:i,completion:n,duration:r,response:o,extensions:{"https://w3id.org/xapi/cmi5/result/extensions/progress":s}}},this},getStatement:function(){return o(o({},e.getStatement()),t)}})}},900:(t,e,i)=>{function n(t){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},n(t)}function r(t,e){var i=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),i.push.apply(i,n)}return i}function o(t){for(var e=1;e<arguments.length;e++){var i=null!=arguments[e]?arguments[e]:{};e%2?r(Object(i),!0).forEach((function(e){var r,o,s;r=t,o=e,s=i[e],(o=function(t){var e=function(t,e){if("object"!==n(t)||null===t)return t;var i=t[Symbol.toPrimitive];if(void 0!==i){var r=i.call(t,"string");if("object"!==n(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"===n(e)?e:String(e)}(o))in r?Object.defineProperty(r,o,{value:s,enumerable:!0,configurable:!0,writable:!0}):r[o]=s})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(i)):r(Object(i)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(i,e))}))}return t}var s=i(533),a=i(502).cmi5;t.exports=function(){var t={},e=s(a.completed);return o(o({},e),{},{result:function(e){return t={result:{completion:!0,duration:e,extensions:{"https://w3id.org/xapi/cmi5/result/extensions/progress":100}}},this},getStatement:function(){return o(o({},e.getStatement()),t)}})}},378:(t,e,i)=>{function n(t){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},n(t)}function r(t,e){var i=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),i.push.apply(i,n)}return i}function o(t){for(var e=1;e<arguments.length;e++){var i=null!=arguments[e]?arguments[e]:{};e%2?r(Object(i),!0).forEach((function(e){var r,o,s;r=t,o=e,s=i[e],(o=function(t){var e=function(t,e){if("object"!==n(t)||null===t)return t;var i=t[Symbol.toPrimitive];if(void 0!==i){var r=i.call(t,"string");if("object"!==n(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"===n(e)?e:String(e)}(o))in r?Object.defineProperty(r,o,{value:s,enumerable:!0,configurable:!0,writable:!0}):r[o]=s})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(i)):r(Object(i)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(i,e))}))}return t}var s=i(533),a=i(502).cmi5;t.exports=function(){var t={},e=s(a.failed);return o(o({},e),{},{result:function(e,i,n){return t={result:{score:e,success:!1,completion:!0,duration:i,extensions:{"https://w3id.org/xapi/cmi5/result/extensions/progress":n}}},this},getStatement:function(){return o(o({},e.getStatement()),t)}})}},672:(t,e,i)=>{function n(t){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},n(t)}function r(t,e){var i=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),i.push.apply(i,n)}return i}function o(t){for(var e=1;e<arguments.length;e++){var i=null!=arguments[e]?arguments[e]:{};e%2?r(Object(i),!0).forEach((function(e){var r,o,s;r=t,o=e,s=i[e],(o=function(t){var e=function(t,e){if("object"!==n(t)||null===t)return t;var i=t[Symbol.toPrimitive];if(void 0!==i){var r=i.call(t,"string");if("object"!==n(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"===n(e)?e:String(e)}(o))in r?Object.defineProperty(r,o,{value:s,enumerable:!0,configurable:!0,writable:!0}):r[o]=s})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(i)):r(Object(i)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(i,e))}))}return t}var s=i(533),a=i(502).cmi5;t.exports=function(){var t=o({},a.initialized);return o({},s(t))}},456:(t,e,i)=>{function n(t){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},n(t)}function r(t,e){var i=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),i.push.apply(i,n)}return i}function o(t){for(var e=1;e<arguments.length;e++){var i=null!=arguments[e]?arguments[e]:{};e%2?r(Object(i),!0).forEach((function(e){var r,o,s;r=t,o=e,s=i[e],(o=function(t){var e=function(t,e){if("object"!==n(t)||null===t)return t;var i=t[Symbol.toPrimitive];if(void 0!==i){var r=i.call(t,"string");if("object"!==n(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"===n(e)?e:String(e)}(o))in r?Object.defineProperty(r,o,{value:s,enumerable:!0,configurable:!0,writable:!0}):r[o]=s})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(i)):r(Object(i)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(i,e))}))}return t}var s=i(533),a=i(502).cmi5;t.exports=function(){var t={},e=s(a.passed);return o(o({},e),{},{result:function(e,i,n){return t={result:{score:e,success:!0,completion:!0,duration:i,extensions:{"https://w3id.org/xapi/cmi5/result/extensions/progress":n}}},this},getStatement:function(){return o(o({},e.getStatement()),t)}})}},88:(t,e,i)=>{function n(t){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},n(t)}function r(t,e){var i=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),i.push.apply(i,n)}return i}function o(t){for(var e=1;e<arguments.length;e++){var i=null!=arguments[e]?arguments[e]:{};e%2?r(Object(i),!0).forEach((function(e){var r,o,s;r=t,o=e,s=i[e],(o=function(t){var e=function(t,e){if("object"!==n(t)||null===t)return t;var i=t[Symbol.toPrimitive];if(void 0!==i){var r=i.call(t,"string");if("object"!==n(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"===n(e)?e:String(e)}(o))in r?Object.defineProperty(r,o,{value:s,enumerable:!0,configurable:!0,writable:!0}):r[o]=s})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(i)):r(Object(i)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(i,e))}))}return t}var s=i(533),a=i(502).cmi5;t.exports=function(){var t=o({},a.registered);return o({},s(t))}},406:(t,e,i)=>{function n(t){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},n(t)}function r(t,e){var i=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),i.push.apply(i,n)}return i}function o(t){for(var e=1;e<arguments.length;e++){var i=null!=arguments[e]?arguments[e]:{};e%2?r(Object(i),!0).forEach((function(e){var r,o,s;r=t,o=e,s=i[e],(o=function(t){var e=function(t,e){if("object"!==n(t)||null===t)return t;var i=t[Symbol.toPrimitive];if(void 0!==i){var r=i.call(t,"string");if("object"!==n(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"===n(e)?e:String(e)}(o))in r?Object.defineProperty(r,o,{value:s,enumerable:!0,configurable:!0,writable:!0}):r[o]=s})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(i)):r(Object(i)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(i,e))}))}return t}var s=i(533),a=i(502).polaris;t.exports=function(){var t={},e=s(a.resized);return o(o({},e),{},{getStatement:function(){return o(o({},e.getStatement()),t)}})}},126:(t,e,i)=>{function n(t){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},n(t)}function r(t,e){var i=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),i.push.apply(i,n)}return i}function o(t){for(var e=1;e<arguments.length;e++){var i=null!=arguments[e]?arguments[e]:{};e%2?r(Object(i),!0).forEach((function(e){var r,o,s;r=t,o=e,s=i[e],(o=function(t){var e=function(t,e){if("object"!==n(t)||null===t)return t;var i=t[Symbol.toPrimitive];if(void 0!==i){var r=i.call(t,"string");if("object"!==n(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"===n(e)?e:String(e)}(o))in r?Object.defineProperty(r,o,{value:s,enumerable:!0,configurable:!0,writable:!0}):r[o]=s})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(i)):r(Object(i)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(i,e))}))}return t}var s=i(533),a=i(502).cmi5;t.exports=function(){var t=o({},a.terminated);return o({},s(t))}},502:(t,e,i)=>{var n=i(750);t.exports={polaris:{resized:{object:{objectType:"Activity",definition:{type:"http://polaris.io/xapi/activities/polaris.dashboard.widget"}},verb:n.resize}},cmi5:{answered:{object:{objectType:"Activity",definition:{type:"http://adlnet.gov/expapi/activities/cmi.interaction"}},verb:n.answered},completed:{object:{objectType:"Activity",definition:{type:"http://adlnet.gov/expapi/activities/cmi.interaction"}},verb:n.completed},failed:{object:{objectType:"Activity",definition:{type:"http://adlnet.gov/expapi/activities/cmi.interaction"}},verb:n.failed},initialized:{object:{objectType:"Activity",definition:{type:"http://adlnet.gov/expapi/activities/cmi.interaction"}},verb:n.initialized},passed:{object:{objectType:"Activity",definition:{type:"http://adlnet.gov/expapi/activities/cmi.interaction"}},verb:n.passed},registered:{object:{objectType:"Activity",definition:{type:"http://adlnet.gov/expapi/activities/cmi.interaction"}},verb:n.registered},terminated:{object:{objectType:"Activity",definition:{type:"http://adlnet.gov/expapi/activities/cmi.interaction"}},verb:n.terminated}},link:{registered:{object:{objectType:"Activity",definition:{type:"http://adlnet.gov/expapi/activities/link"}},verb:n.registered}}}},533:t=>{function e(t){return e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},e(t)}function i(t,e){var i=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),i.push.apply(i,n)}return i}function n(t){for(var e=1;e<arguments.length;e++){var n=null!=arguments[e]?arguments[e]:{};e%2?i(Object(n),!0).forEach((function(e){r(t,e,n[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(n)):i(Object(n)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(n,e))}))}return t}function r(t,i,n){return(i=function(t){var i=function(t,i){if("object"!==e(t)||null===t)return t;var n=t[Symbol.toPrimitive];if(void 0!==n){var r=n.call(t,"string");if("object"!==e(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"===e(i)?i:String(i)}(i))in t?Object.defineProperty(t,i,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[i]=n,t}function o(t,e,i,o){return n(n({},t),{},r({},e,r({},i,o)))}t.exports=function(t){return{actor:function(e){return t=n(n({},t),{},{actor:e.getStatement()}),this},when:function(e){return t=n(n({},t),{},{timestamp:e}),this},activityId:function(e){return t=n(n({},t),{},{object:n(n({},t.object),{},{id:e})}),this},activityName:function(e){var i=e.value,r=e.locale,s=void 0===r?"en-US":r;return t=n(n({},t),{},{object:n(n({},t.object),{},{definition:n({},o(t.object?t.object.definition:{},"name",s,i))})}),this},activityDescription:function(e){var i=e.value,r=e.locale,s=void 0===r?"en-US":r;return t=n(n({},t),{},{object:n(n({},t.object),{},{definition:n({},o(t.object?t.object.definition:{},"description",s,i))})}),this},interactionType:function(e){return t=n(n({},t),{},{object:n(n({},t.object),{},{definition:n(n({},t.object.definition),{},{interactionType:e})})}),this},correctResponsesPattern:function(e){return t=n(n({},t),{},{object:n(n({},t.object),{},{definition:n(n({},t.object.definition),{},{correctResponsesPattern:[e]})})}),this},choices:function(e){return t=n(n({},t),{},{object:n(n({},t.object),{},{definition:n(n({},t.object.definition),{},{choices:e})})}),this},authority:function(e){var i,o=e.name,s=e.IFI;return t=n(n({},t),{},{authority:(i={objectType:"Agent"},r(i,s.key,s.getStatement()),r(i,"name",o),i)}),this},getStatement:function(){return n({version:"1.0.0"},t)}}}},750:t=>{t.exports={answered:{id:"http://adlnet.gov/expapi/verbs/answered",display:{"en-US":"answered"}},attempted:{id:"http://adlnet.gov/expapi/verbs/attempted",display:{"en-US":"attempted"}},attended:{id:"http://adlnet.gov/expapi/verbs/attended",display:{"en-US":"attended"}},commented:{id:"http://adlnet.gov/expapi/verbs/commented",display:{"en-US":"commented"}},completed:{id:"http://adlnet.gov/expapi/verbs/completed",display:{"en-US":"completed"}},failed:{id:"http://adlnet.gov/expapi/verbs/failed",display:{"en-US":"failed"}},initialized:{id:"http://adlnet.gov/expapi/verbs/initialized",display:{"en-US":"initialized"}},interacted:{id:"http://adlnet.gov/expapi/verbs/interacted",display:{"en-US":"interacted"}},launched:{id:"http://adlnet.gov/expapi/verbs/launched",display:{"en-US":"launched"}},mastered:{id:"http://adlnet.gov/expapi/verbs/mastered",display:{"en-US":"mastered"}},passed:{id:"http://adlnet.gov/expapi/verbs/passed",display:{"en-US":"passed"}},progressed:{id:"http://adlnet.gov/expapi/verbs/progressed",display:{"en-US":"progressed"}},registered:{id:"http://adlnet.gov/expapi/verbs/registered",display:{"en-US":"registered"}},resumed:{id:"http://adlnet.gov/expapi/verbs/resumed",display:{"en-US":"resumed"}},scored:{id:"http://adlnet.gov/expapi/verbs/scored",display:{"en-US":"scored"}},shared:{id:"http://adlnet.gov/expapi/verbs/shared",display:{"en-US":"shared"}},suspended:{id:"http://adlnet.gov/expapi/verbs/suspended",display:{"en-US":"suspended"}},terminated:{id:"http://adlnet.gov/expapi/verbs/terminated",display:{"en-US":"terminated"}},voided:{id:"http://adlnet.gov/expapi/verbs/voided",display:{"en-US":"voided"}},resize:{id:"http://polaris.io/xapi/verbs/polaris.dashboard.resize",display:{"en-US":"resize"}},drag:{id:"http://polaris.io/xapi/verbs/polaris.dashboard.drag",display:{"en-US":"drag"}},add:{id:"http://polaris.io/xapi/verbs/polaris.dashboard.add",display:{"en-US":"add"}},evaluate:{id:"http://polaris.io/xapi/verbs/polaris.dashboard.evaluate",display:{"en-US":"evaluate"}}}},744:(t,e,i)=>{"use strict";i.d(e,{Z:()=>d});var n=i(81),r=i.n(n),o=i(645),s=i.n(o),a=i(667),l=i.n(a),c=new URL(i(810),i.b),h=s()(r()),u=l()(c);h.push([t.id,`:root .grid-stack-item>.ui-resizable-handle{filter:none}.grid-stack{position:relative}.grid-stack.grid-stack-rtl{direction:ltr}.grid-stack.grid-stack-rtl>.grid-stack-item{direction:rtl}.grid-stack .grid-stack-placeholder>.placeholder-content{background-color:rgba(0,0,0,0.1);margin:0;position:absolute;width:auto;z-index:0 !important;text-align:center}.grid-stack>.grid-stack-item{min-width:8.3333333333%;position:absolute;padding:0}.grid-stack>.grid-stack-item>.grid-stack-item-content{margin:0;position:absolute;width:auto;overflow-x:hidden;overflow-y:auto}.grid-stack>.grid-stack-item>.ui-resizable-handle{position:absolute;font-size:.1px;display:block;-ms-touch-action:none;touch-action:none}.grid-stack>.grid-stack-item.ui-resizable-autohide>.ui-resizable-handle,.grid-stack>.grid-stack-item.ui-resizable-disabled>.ui-resizable-handle{display:none}.grid-stack>.grid-stack-item>.ui-resizable-se,.grid-stack>.grid-stack-item>.ui-resizable-sw{background-image:url(${u});background-repeat:no-repeat;background-position:center;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg)}.grid-stack>.grid-stack-item>.ui-resizable-se{-webkit-transform:rotate(-45deg);-moz-transform:rotate(-45deg);-ms-transform:rotate(-45deg);-o-transform:rotate(-45deg);transform:rotate(-45deg)}.grid-stack>.grid-stack-item>.ui-resizable-nw{cursor:nw-resize;width:20px;height:20px;top:0}.grid-stack>.grid-stack-item>.ui-resizable-n{cursor:n-resize;height:10px;top:0;left:25px;right:25px}.grid-stack>.grid-stack-item>.ui-resizable-ne{cursor:ne-resize;width:20px;height:20px;top:0}.grid-stack>.grid-stack-item>.ui-resizable-e{cursor:e-resize;width:10px;top:15px;bottom:15px}.grid-stack>.grid-stack-item>.ui-resizable-se{cursor:se-resize;width:20px;height:20px}.grid-stack>.grid-stack-item>.ui-resizable-s{cursor:s-resize;height:10px;left:25px;bottom:0;right:25px}.grid-stack>.grid-stack-item>.ui-resizable-sw{cursor:sw-resize;width:20px;height:20px}.grid-stack>.grid-stack-item>.ui-resizable-w{cursor:w-resize;width:10px;top:15px;bottom:15px}.grid-stack>.grid-stack-item.ui-draggable-dragging>.ui-resizable-handle{display:none !important}.grid-stack>.grid-stack-item[gs-w="0"]{width:0%}.grid-stack>.grid-stack-item[gs-x="0"]{left:0}.grid-stack>.grid-stack-item[gs-min-w="0"]{min-width:0}.grid-stack>.grid-stack-item[gs-max-w="0"]{max-width:0%}.grid-stack>.grid-stack-item[gs-w="1"]{width:8.3333333333%}.grid-stack>.grid-stack-item[gs-x="1"]{left:8.3333333333%}.grid-stack>.grid-stack-item[gs-min-w="1"]{min-width:8.3333333333%}.grid-stack>.grid-stack-item[gs-max-w="1"]{max-width:8.3333333333%}.grid-stack>.grid-stack-item[gs-w="2"]{width:16.6666666667%}.grid-stack>.grid-stack-item[gs-x="2"]{left:16.6666666667%}.grid-stack>.grid-stack-item[gs-min-w="2"]{min-width:16.6666666667%}.grid-stack>.grid-stack-item[gs-max-w="2"]{max-width:16.6666666667%}.grid-stack>.grid-stack-item[gs-w="3"]{width:25%}.grid-stack>.grid-stack-item[gs-x="3"]{left:25%}.grid-stack>.grid-stack-item[gs-min-w="3"]{min-width:25%}.grid-stack>.grid-stack-item[gs-max-w="3"]{max-width:25%}.grid-stack>.grid-stack-item[gs-w="4"]{width:33.3333333333%}.grid-stack>.grid-stack-item[gs-x="4"]{left:33.3333333333%}.grid-stack>.grid-stack-item[gs-min-w="4"]{min-width:33.3333333333%}.grid-stack>.grid-stack-item[gs-max-w="4"]{max-width:33.3333333333%}.grid-stack>.grid-stack-item[gs-w="5"]{width:41.6666666667%}.grid-stack>.grid-stack-item[gs-x="5"]{left:41.6666666667%}.grid-stack>.grid-stack-item[gs-min-w="5"]{min-width:41.6666666667%}.grid-stack>.grid-stack-item[gs-max-w="5"]{max-width:41.6666666667%}.grid-stack>.grid-stack-item[gs-w="6"]{width:50%}.grid-stack>.grid-stack-item[gs-x="6"]{left:50%}.grid-stack>.grid-stack-item[gs-min-w="6"]{min-width:50%}.grid-stack>.grid-stack-item[gs-max-w="6"]{max-width:50%}.grid-stack>.grid-stack-item[gs-w="7"]{width:58.3333333333%}.grid-stack>.grid-stack-item[gs-x="7"]{left:58.3333333333%}.grid-stack>.grid-stack-item[gs-min-w="7"]{min-width:58.3333333333%}.grid-stack>.grid-stack-item[gs-max-w="7"]{max-width:58.3333333333%}.grid-stack>.grid-stack-item[gs-w="8"]{width:66.6666666667%}.grid-stack>.grid-stack-item[gs-x="8"]{left:66.6666666667%}.grid-stack>.grid-stack-item[gs-min-w="8"]{min-width:66.6666666667%}.grid-stack>.grid-stack-item[gs-max-w="8"]{max-width:66.6666666667%}.grid-stack>.grid-stack-item[gs-w="9"]{width:75%}.grid-stack>.grid-stack-item[gs-x="9"]{left:75%}.grid-stack>.grid-stack-item[gs-min-w="9"]{min-width:75%}.grid-stack>.grid-stack-item[gs-max-w="9"]{max-width:75%}.grid-stack>.grid-stack-item[gs-w="10"]{width:83.3333333333%}.grid-stack>.grid-stack-item[gs-x="10"]{left:83.3333333333%}.grid-stack>.grid-stack-item[gs-min-w="10"]{min-width:83.3333333333%}.grid-stack>.grid-stack-item[gs-max-w="10"]{max-width:83.3333333333%}.grid-stack>.grid-stack-item[gs-w="11"]{width:91.6666666667%}.grid-stack>.grid-stack-item[gs-x="11"]{left:91.6666666667%}.grid-stack>.grid-stack-item[gs-min-w="11"]{min-width:91.6666666667%}.grid-stack>.grid-stack-item[gs-max-w="11"]{max-width:91.6666666667%}.grid-stack>.grid-stack-item[gs-w="12"]{width:100%}.grid-stack>.grid-stack-item[gs-x="12"]{left:100%}.grid-stack>.grid-stack-item[gs-min-w="12"]{min-width:100%}.grid-stack>.grid-stack-item[gs-max-w="12"]{max-width:100%}.grid-stack.grid-stack-1>.grid-stack-item{min-width:100%}.grid-stack.grid-stack-1>.grid-stack-item[gs-w="1"]{width:100%}.grid-stack.grid-stack-1>.grid-stack-item[gs-x="1"]{left:100%}.grid-stack.grid-stack-1>.grid-stack-item[gs-min-w="1"]{min-width:100%}.grid-stack.grid-stack-1>.grid-stack-item[gs-max-w="1"]{max-width:100%}.grid-stack.grid-stack-animate,.grid-stack.grid-stack-animate .grid-stack-item{-webkit-transition:left .3s,top .3s,height .3s,width .3s;-moz-transition:left .3s,top .3s,height .3s,width .3s;-ms-transition:left .3s,top .3s,height .3s,width .3s;-o-transition:left .3s,top .3s,height .3s,width .3s;transition:left .3s,top .3s,height .3s,width .3s}.grid-stack.grid-stack-animate .grid-stack-item.grid-stack-placeholder,.grid-stack.grid-stack-animate .grid-stack-item.ui-draggable-dragging,.grid-stack.grid-stack-animate .grid-stack-item.ui-resizable-resizing{-webkit-transition:left 0s,top 0s,height 0s,width 0s;-moz-transition:left 0s,top 0s,height 0s,width 0s;-ms-transition:left 0s,top 0s,height 0s,width 0s;-o-transition:left 0s,top 0s,height 0s,width 0s;transition:left 0s,top 0s,height 0s,width 0s}.ui-draggable-dragging,.ui-resizable-resizing{z-index:100}.ui-draggable-dragging>.grid-stack-item-content,.ui-resizable-resizing>.grid-stack-item-content{box-shadow:1px 4px 6px rgba(0,0,0,0.2);opacity:.8}.ui-draggable-dragging{will-change:left,top;cursor:move}.ui-resizable-resizing{will-change:width,height}\n`,""]);const d=h},466:(t,e,i)=>{"use strict";i.d(e,{Z:()=>a});var n=i(81),r=i.n(n),o=i(645),s=i.n(o)()(r());s.push([t.id,'.chart-title{font-size:20px;font-weight:bold}.chart-subtitle{font-size:15px;font-weight:bold;text-align:center}.chart-subtitle.column{width:100%;text-align:left !important}.chart-error-message{font-size:15px;font-style:italic}.chart-path{fill:none;stroke-width:1.5}.chart-area{stroke-width:1.5}.listening-rect{stroke:grey;fill:white}.question-mark{cursor:pointer;opacity:0.2;transform:scale(0.05);-ms-transform:scale(0.05);-webkit-transform:scale(0.05)}.question-mark:hover{opacity:0.5}.question-mark-legacy{cursor:pointer;opacity:0.2;float:right;margin-right:5px;border:3px solid black;border-radius:15px;height:30px;width:30px;text-align:center;line-height:22px;font-family:monospace;font-weight:bold;font-size:27px;transform:scale(0.8);-ms-transform:scale(0.8);-webkit-transform:scale(0.8)}.question-mark-legacy:hover{opacity:0.5}.grid-stack-item-content{overflow:hidden !important;box-shadow:0 1px 3px rgba(0,0,0,0.12),0 1px 2px rgba(0,0,0,0.24);transition:all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1);background:#fff}.grid-stack-item-removing{opacity:0.5}.subgrid{margin-right:20px}.grid-stack>.grid-stack-item.grid-stack-sub-grid>.grid-stack-item-content{background:rgba(0,0,0,0.05)}.grid-stack.grid-stack-nested{background:none;position:absolute;inset:0}body{height:100%;margin:0;padding:0}.wrapper{display:flex;font-family:"Roboto"}.grid{width:100%;height:100%}.grid .grid-stack{min-height:500px}.sidebar-hidden{visibility:hidden;display:none}.sidebar{visibility:visible;display:flex;flex-direction:column;gap:10px;padding:10px}.dropzone-remove{border:3px dashed red;opacity:0.5;height:100px;display:flex;justify-content:center;align-items:center}.dropzone-remove:hover{opacity:1}.available-widgets{border:3px dashed grey;padding:10px;display:flex;flex-direction:column;gap:10px}\n',""]);const a=s},645:t=>{"use strict";t.exports=function(t){var e=[];return e.toString=function(){return this.map((function(e){var i="",n=void 0!==e[5];return e[4]&&(i+="@supports (".concat(e[4],") {")),e[2]&&(i+="@media ".concat(e[2]," {")),n&&(i+="@layer".concat(e[5].length>0?" ".concat(e[5]):""," {")),i+=t(e),n&&(i+="}"),e[2]&&(i+="}"),e[4]&&(i+="}"),i})).join("")},e.i=function(t,i,n,r,o){"string"==typeof t&&(t=[[null,t,void 0]]);var s={};if(n)for(var a=0;a<this.length;a++){var l=this[a][0];null!=l&&(s[l]=!0)}for(var c=0;c<t.length;c++){var h=[].concat(t[c]);n&&s[h[0]]||(void 0!==o&&(void 0===h[5]||(h[1]="@layer".concat(h[5].length>0?" ".concat(h[5]):""," {").concat(h[1],"}")),h[5]=o),i&&(h[2]?(h[1]="@media ".concat(h[2]," {").concat(h[1],"}"),h[2]=i):h[2]=i),r&&(h[4]?(h[1]="@supports (".concat(h[4],") {").concat(h[1],"}"),h[4]=r):h[4]="".concat(r)),e.push(h))}},e}},667:t=>{"use strict";t.exports=function(t,e){return e||(e={}),t?(t=String(t.__esModule?t.default:t),/^['"].*['"]$/.test(t)&&(t=t.slice(1,-1)),e.hash&&(t+=e.hash),/["'() \t\n]|(%20)/.test(t)||e.needQuotes?'"'.concat(t.replace(/"/g,'\\"').replace(/\n/g,"\\n"),'"'):t):t}},81:t=>{"use strict";t.exports=function(t){return t[1]}},249:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DDBaseImplement=void 0,e.DDBaseImplement=class{constructor(){this._eventRegister={}}get disabled(){return this._disabled}on(t,e){this._eventRegister[t]=e}off(t){delete this._eventRegister[t]}enable(){this._disabled=!1}disable(){this._disabled=!0}destroy(){delete this._eventRegister}triggerEvent(t,e){if(!this.disabled&&this._eventRegister&&this._eventRegister[t])return this._eventRegister[t](e)}}},529:(t,e,i)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DDDraggable=void 0;const n=i(427),r=i(284),o=i(249),s=i(168);class a extends o.DDBaseImplement{constructor(t,e={}){super(),this.el=t,this.option=e;let i=e.handle.substring(1);this.dragEl=t.classList.contains(i)?t:t.querySelector(e.handle)||t,this._mouseDown=this._mouseDown.bind(this),this._mouseMove=this._mouseMove.bind(this),this._mouseUp=this._mouseUp.bind(this),this.enable()}on(t,e){super.on(t,e)}off(t){super.off(t)}enable(){!1!==this.disabled&&(super.enable(),this.dragEl.addEventListener("mousedown",this._mouseDown),s.isTouch&&(this.dragEl.addEventListener("touchstart",s.touchstart),this.dragEl.addEventListener("pointerdown",s.pointerdown)),this.el.classList.remove("ui-draggable-disabled"),this.el.classList.add("ui-draggable"))}disable(t=!1){!0!==this.disabled&&(super.disable(),this.dragEl.removeEventListener("mousedown",this._mouseDown),s.isTouch&&(this.dragEl.removeEventListener("touchstart",s.touchstart),this.dragEl.removeEventListener("pointerdown",s.pointerdown)),this.el.classList.remove("ui-draggable"),t||this.el.classList.add("ui-draggable-disabled"))}destroy(){this.dragTimeout&&window.clearTimeout(this.dragTimeout),delete this.dragTimeout,this.dragging&&this._mouseUp(this.mouseDownEvent),this.disable(!0),delete this.el,delete this.helper,delete this.option,super.destroy()}updateOption(t){return Object.keys(t).forEach((e=>this.option[e]=t[e])),this}_mouseDown(t){if(n.DDManager.mouseHandled)return;if(0!==t.button)return!0;const e=t.target.nodeName.toLowerCase();return["input","textarea","button","select","option"].find((t=>t===e))||t.target.closest('[contenteditable="true"]')||(this.mouseDownEvent=t,delete this.dragging,delete n.DDManager.dragElement,delete n.DDManager.dropElement,document.addEventListener("mousemove",this._mouseMove,!0),document.addEventListener("mouseup",this._mouseUp,!0),s.isTouch&&(this.dragEl.addEventListener("touchmove",s.touchmove),this.dragEl.addEventListener("touchend",s.touchend)),t.preventDefault(),document.activeElement&&document.activeElement.blur(),n.DDManager.mouseHandled=!0),!0}_callDrag(t){if(!this.dragging)return;const e=r.Utils.initEvent(t,{target:this.el,type:"drag"});this.option.drag&&this.option.drag(e,this.ui()),this.triggerEvent("drag",e)}_mouseMove(t){var e;let i=this.mouseDownEvent;if(this.dragging)if(this._dragFollow(t),n.DDManager.pauseDrag){const e=Number.isInteger(n.DDManager.pauseDrag)?n.DDManager.pauseDrag:100;this.dragTimeout&&window.clearTimeout(this.dragTimeout),this.dragTimeout=window.setTimeout((()=>this._callDrag(t)),e)}else this._callDrag(t);else if(Math.abs(t.x-i.x)+Math.abs(t.y-i.y)>3){this.dragging=!0,n.DDManager.dragElement=this;let i=null===(e=this.el.gridstackNode)||void 0===e?void 0:e.grid;i?n.DDManager.dropElement=i.el.ddElement.ddDroppable:delete n.DDManager.dropElement,this.helper=this._createHelper(t),this._setupHelperContainmentStyle(),this.dragOffset=this._getDragOffset(t,this.el,this.helperContainment);const o=r.Utils.initEvent(t,{target:this.el,type:"dragstart"});this._setupHelperStyle(t),this.option.start&&this.option.start(o,this.ui()),this.triggerEvent("dragstart",o)}return t.preventDefault(),!0}_mouseUp(t){var e;if(document.removeEventListener("mousemove",this._mouseMove,!0),document.removeEventListener("mouseup",this._mouseUp,!0),s.isTouch&&(this.dragEl.removeEventListener("touchmove",s.touchmove,!0),this.dragEl.removeEventListener("touchend",s.touchend,!0)),this.dragging){delete this.dragging,(null===(e=n.DDManager.dropElement)||void 0===e?void 0:e.el)===this.el.parentElement&&delete n.DDManager.dropElement,this.helperContainment.style.position=this.parentOriginStylePosition||null,this.helper===this.el?this._removeHelperStyle():this.helper.remove();const i=r.Utils.initEvent(t,{target:this.el,type:"dragstop"});this.option.stop&&this.option.stop(i),this.triggerEvent("dragstop",i),n.DDManager.dropElement&&n.DDManager.dropElement.drop(t)}delete this.helper,delete this.mouseDownEvent,delete n.DDManager.dragElement,delete n.DDManager.dropElement,delete n.DDManager.mouseHandled,t.preventDefault()}_createHelper(t){let e=this.el;return"function"==typeof this.option.helper?e=this.option.helper(t):"clone"===this.option.helper&&(e=r.Utils.cloneNode(this.el)),document.body.contains(e)||r.Utils.appendTo(e,"parent"===this.option.appendTo?this.el.parentNode:this.option.appendTo),e===this.el&&(this.dragElementOriginStyle=a.originStyleProp.map((t=>this.el.style[t]))),e}_setupHelperStyle(t){this.helper.classList.add("ui-draggable-dragging");const e=this.helper.style;return e.pointerEvents="none",e["min-width"]=0,e.width=this.dragOffset.width+"px",e.height=this.dragOffset.height+"px",e.willChange="left, top",e.position="fixed",this._dragFollow(t),e.transition="none",setTimeout((()=>{this.helper&&(e.transition=null)}),0),this}_removeHelperStyle(){var t;this.helper.classList.remove("ui-draggable-dragging");let e=null===(t=this.helper)||void 0===t?void 0:t.gridstackNode;if(!(null==e?void 0:e._isAboutToRemove)&&this.dragElementOriginStyle){let t=this.helper,e=this.dragElementOriginStyle.transition||null;t.style.transition=this.dragElementOriginStyle.transition="none",a.originStyleProp.forEach((e=>t.style[e]=this.dragElementOriginStyle[e]||null)),setTimeout((()=>t.style.transition=e),50)}return delete this.dragElementOriginStyle,this}_dragFollow(t){const e=this.helper.style,i=this.dragOffset;e.left=t.clientX+i.offsetLeft-0+"px",e.top=t.clientY+i.offsetTop-0+"px"}_setupHelperContainmentStyle(){return this.helperContainment=this.helper.parentElement,"fixed"!==this.helper.style.position&&(this.parentOriginStylePosition=this.helperContainment.style.position,window.getComputedStyle(this.helperContainment).position.match(/static/)&&(this.helperContainment.style.position="relative")),this}_getDragOffset(t,e,i){let n=0,o=0;if(i){const t=document.createElement("div");r.Utils.addElStyles(t,{opacity:"0",position:"fixed",top:"0px",left:"0px",width:"1px",height:"1px",zIndex:"-999999"}),i.appendChild(t);const e=t.getBoundingClientRect();i.removeChild(t),n=e.left,o=e.top}const s=e.getBoundingClientRect();return{left:s.left,top:s.top,offsetLeft:-t.clientX+s.left-n,offsetTop:-t.clientY+s.top-o,width:s.width,height:s.height}}ui(){const t=this.el.parentElement.getBoundingClientRect(),e=this.helper.getBoundingClientRect();return{position:{top:e.top-t.top,left:e.left-t.left}}}}e.DDDraggable=a,a.originStyleProp=["transition","pointerEvents","position","left","top","minWidth","willChange"]},514:(t,e,i)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DDDroppable=void 0;const n=i(427),r=i(249),o=i(284),s=i(168);class a extends r.DDBaseImplement{constructor(t,e={}){super(),this.el=t,this.option=e,this._mouseEnter=this._mouseEnter.bind(this),this._mouseLeave=this._mouseLeave.bind(this),this.enable(),this._setupAccept()}on(t,e){super.on(t,e)}off(t){super.off(t)}enable(){!1!==this.disabled&&(super.enable(),this.el.classList.add("ui-droppable"),this.el.classList.remove("ui-droppable-disabled"),this.el.addEventListener("mouseenter",this._mouseEnter),this.el.addEventListener("mouseleave",this._mouseLeave),s.isTouch&&(this.el.addEventListener("pointerenter",s.pointerenter),this.el.addEventListener("pointerleave",s.pointerleave)))}disable(t=!1){!0!==this.disabled&&(super.disable(),this.el.classList.remove("ui-droppable"),t||this.el.classList.add("ui-droppable-disabled"),this.el.removeEventListener("mouseenter",this._mouseEnter),this.el.removeEventListener("mouseleave",this._mouseLeave),s.isTouch&&(this.el.removeEventListener("pointerenter",s.pointerenter),this.el.removeEventListener("pointerleave",s.pointerleave)))}destroy(){this.disable(!0),this.el.classList.remove("ui-droppable"),this.el.classList.remove("ui-droppable-disabled"),super.destroy()}updateOption(t){return Object.keys(t).forEach((e=>this.option[e]=t[e])),this._setupAccept(),this}_mouseEnter(t){if(!n.DDManager.dragElement)return;if(!this._canDrop(n.DDManager.dragElement.el))return;t.preventDefault(),t.stopPropagation(),n.DDManager.dropElement&&n.DDManager.dropElement!==this&&n.DDManager.dropElement._mouseLeave(t),n.DDManager.dropElement=this;const e=o.Utils.initEvent(t,{target:this.el,type:"dropover"});this.option.over&&this.option.over(e,this._ui(n.DDManager.dragElement)),this.triggerEvent("dropover",e),this.el.classList.add("ui-droppable-over")}_mouseLeave(t){var e;if(!n.DDManager.dragElement||n.DDManager.dropElement!==this)return;t.preventDefault(),t.stopPropagation();const i=o.Utils.initEvent(t,{target:this.el,type:"dropout"});if(this.option.out&&this.option.out(i,this._ui(n.DDManager.dragElement)),this.triggerEvent("dropout",i),n.DDManager.dropElement===this){let i;delete n.DDManager.dropElement;let r=this.el.parentElement;for(;!i&&r;)i=null===(e=r.ddElement)||void 0===e?void 0:e.ddDroppable,r=r.parentElement;i&&i._mouseEnter(t)}}drop(t){t.preventDefault();const e=o.Utils.initEvent(t,{target:this.el,type:"drop"});this.option.drop&&this.option.drop(e,this._ui(n.DDManager.dragElement)),this.triggerEvent("drop",e)}_canDrop(t){return t&&(!this.accept||this.accept(t))}_setupAccept(){return this.option.accept?("string"==typeof this.option.accept?this.accept=t=>t.matches(this.option.accept):this.accept=this.option.accept,this):this}_ui(t){return Object.assign({draggable:t.el},t.ui())}}e.DDDroppable=a},474:(t,e,i)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DDElement=void 0;const n=i(945),r=i(529),o=i(514);class s{constructor(t){this.el=t}static init(t){return t.ddElement||(t.ddElement=new s(t)),t.ddElement}on(t,e){return this.ddDraggable&&["drag","dragstart","dragstop"].indexOf(t)>-1?this.ddDraggable.on(t,e):this.ddDroppable&&["drop","dropover","dropout"].indexOf(t)>-1?this.ddDroppable.on(t,e):this.ddResizable&&["resizestart","resize","resizestop"].indexOf(t)>-1&&this.ddResizable.on(t,e),this}off(t){return this.ddDraggable&&["drag","dragstart","dragstop"].indexOf(t)>-1?this.ddDraggable.off(t):this.ddDroppable&&["drop","dropover","dropout"].indexOf(t)>-1?this.ddDroppable.off(t):this.ddResizable&&["resizestart","resize","resizestop"].indexOf(t)>-1&&this.ddResizable.off(t),this}setupDraggable(t){return this.ddDraggable?this.ddDraggable.updateOption(t):this.ddDraggable=new r.DDDraggable(this.el,t),this}cleanDraggable(){return this.ddDraggable&&(this.ddDraggable.destroy(),delete this.ddDraggable),this}setupResizable(t){return this.ddResizable?this.ddResizable.updateOption(t):this.ddResizable=new n.DDResizable(this.el,t),this}cleanResizable(){return this.ddResizable&&(this.ddResizable.destroy(),delete this.ddResizable),this}setupDroppable(t){return this.ddDroppable?this.ddDroppable.updateOption(t):this.ddDroppable=new o.DDDroppable(this.el,t),this}cleanDroppable(){return this.ddDroppable&&(this.ddDroppable.destroy(),delete this.ddDroppable),this}}e.DDElement=s},470:(t,e,i)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DDGridStack=void 0;const n=i(284),r=i(427),o=i(474);e.DDGridStack=class{resizable(t,e,i,n){return this._getDDElements(t).forEach((t=>{if("disable"===e||"enable"===e)t.ddResizable&&t.ddResizable[e]();else if("destroy"===e)t.ddResizable&&t.cleanResizable();else if("option"===e)t.setupResizable({[i]:n});else{const i=t.el.gridstackNode.grid;let n=t.el.getAttribute("gs-resize-handles")?t.el.getAttribute("gs-resize-handles"):i.opts.resizable.handles,r=!i.opts.alwaysShowResizeHandle;t.setupResizable(Object.assign(Object.assign(Object.assign({},i.opts.resizable),{handles:n,autoHide:r}),{start:e.start,stop:e.stop,resize:e.resize}))}})),this}draggable(t,e,i,n){return this._getDDElements(t).forEach((t=>{if("disable"===e||"enable"===e)t.ddDraggable&&t.ddDraggable[e]();else if("destroy"===e)t.ddDraggable&&t.cleanDraggable();else if("option"===e)t.setupDraggable({[i]:n});else{const i=t.el.gridstackNode.grid;t.setupDraggable(Object.assign(Object.assign({},i.opts.draggable),{start:e.start,stop:e.stop,drag:e.drag}))}})),this}dragIn(t,e){return this._getDDElements(t).forEach((t=>t.setupDraggable(e))),this}droppable(t,e,i,n){return"function"!=typeof e.accept||e._accept||(e._accept=e.accept,e.accept=t=>e._accept(t)),this._getDDElements(t).forEach((t=>{"disable"===e||"enable"===e?t.ddDroppable&&t.ddDroppable[e]():"destroy"===e?t.ddDroppable&&t.cleanDroppable():"option"===e?t.setupDroppable({[i]:n}):t.setupDroppable(e)})),this}isDroppable(t){return!(!(t&&t.ddElement&&t.ddElement.ddDroppable)||t.ddElement.ddDroppable.disabled)}isDraggable(t){return!(!(t&&t.ddElement&&t.ddElement.ddDraggable)||t.ddElement.ddDraggable.disabled)}isResizable(t){return!(!(t&&t.ddElement&&t.ddElement.ddResizable)||t.ddElement.ddResizable.disabled)}on(t,e,i){return this._getDDElements(t).forEach((t=>t.on(e,(t=>{i(t,r.DDManager.dragElement?r.DDManager.dragElement.el:t.target,r.DDManager.dragElement?r.DDManager.dragElement.helper:null)})))),this}off(t,e){return this._getDDElements(t).forEach((t=>t.off(e))),this}_getDDElements(t,e=!0){let i=n.Utils.getElements(t);if(!i.length)return[];let r=i.map((t=>t.ddElement||(e?o.DDElement.init(t):null)));return e||r.filter((t=>t)),r}}},427:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DDManager=void 0,e.DDManager=class{}},90:(t,e,i)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DDResizableHandle=void 0;const n=i(168);class r{constructor(t,e,i){this.moving=!1,this.host=t,this.dir=e,this.option=i,this._mouseDown=this._mouseDown.bind(this),this._mouseMove=this._mouseMove.bind(this),this._mouseUp=this._mouseUp.bind(this),this._init()}_init(){const t=document.createElement("div");return t.classList.add("ui-resizable-handle"),t.classList.add(`${r.prefix}${this.dir}`),t.style.zIndex="100",t.style.userSelect="none",this.el=t,this.host.appendChild(this.el),this.el.addEventListener("mousedown",this._mouseDown),n.isTouch&&(this.el.addEventListener("touchstart",n.touchstart),this.el.addEventListener("pointerdown",n.pointerdown)),this}destroy(){return this.moving&&this._mouseUp(this.mouseDownEvent),this.el.removeEventListener("mousedown",this._mouseDown),n.isTouch&&(this.el.removeEventListener("touchstart",n.touchstart),this.el.removeEventListener("pointerdown",n.pointerdown)),this.host.removeChild(this.el),delete this.el,delete this.host,this}_mouseDown(t){this.mouseDownEvent=t,document.addEventListener("mousemove",this._mouseMove,!0),document.addEventListener("mouseup",this._mouseUp,!0),n.isTouch&&(this.el.addEventListener("touchmove",n.touchmove),this.el.addEventListener("touchend",n.touchend)),t.stopPropagation(),t.preventDefault()}_mouseMove(t){let e=this.mouseDownEvent;this.moving?this._triggerEvent("move",t):Math.abs(t.x-e.x)+Math.abs(t.y-e.y)>2&&(this.moving=!0,this._triggerEvent("start",this.mouseDownEvent),this._triggerEvent("move",t)),t.stopPropagation(),t.preventDefault()}_mouseUp(t){this.moving&&this._triggerEvent("stop",t),document.removeEventListener("mousemove",this._mouseMove,!0),document.removeEventListener("mouseup",this._mouseUp,!0),n.isTouch&&(this.el.removeEventListener("touchmove",n.touchmove),this.el.removeEventListener("touchend",n.touchend)),delete this.moving,delete this.mouseDownEvent,t.stopPropagation(),t.preventDefault()}_triggerEvent(t,e){return this.option[t]&&this.option[t](e),this}}e.DDResizableHandle=r,r.prefix="ui-resizable-"},945:(t,e,i)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DDResizable=void 0;const n=i(90),r=i(249),o=i(284),s=i(427);class a extends r.DDBaseImplement{constructor(t,e={}){super(),this._ui=()=>{const t=this.el.parentElement.getBoundingClientRect(),e={width:this.originalRect.width,height:this.originalRect.height+this.scrolled,left:this.originalRect.left,top:this.originalRect.top-this.scrolled},i=this.temporalRect||e;return{position:{left:i.left-t.left,top:i.top-t.top},size:{width:i.width,height:i.height}}},this.el=t,this.option=e,this._mouseOver=this._mouseOver.bind(this),this._mouseOut=this._mouseOut.bind(this),this.enable(),this._setupAutoHide(this.option.autoHide),this._setupHandlers()}on(t,e){super.on(t,e)}off(t){super.off(t)}enable(){super.enable(),this.el.classList.add("ui-resizable"),this.el.classList.remove("ui-resizable-disabled"),this._setupAutoHide(this.option.autoHide)}disable(){super.disable(),this.el.classList.add("ui-resizable-disabled"),this.el.classList.remove("ui-resizable"),this._setupAutoHide(!1)}destroy(){this._removeHandlers(),this._setupAutoHide(!1),this.el.classList.remove("ui-resizable"),delete this.el,super.destroy()}updateOption(t){let e=t.handles&&t.handles!==this.option.handles,i=t.autoHide&&t.autoHide!==this.option.autoHide;return Object.keys(t).forEach((e=>this.option[e]=t[e])),e&&(this._removeHandlers(),this._setupHandlers()),i&&this._setupAutoHide(this.option.autoHide),this}_setupAutoHide(t){return t?(this.el.classList.add("ui-resizable-autohide"),this.el.addEventListener("mouseover",this._mouseOver),this.el.addEventListener("mouseout",this._mouseOut)):(this.el.classList.remove("ui-resizable-autohide"),this.el.removeEventListener("mouseover",this._mouseOver),this.el.removeEventListener("mouseout",this._mouseOut),s.DDManager.overResizeElement===this&&delete s.DDManager.overResizeElement),this}_mouseOver(t){s.DDManager.overResizeElement||s.DDManager.dragElement||(s.DDManager.overResizeElement=this,this.el.classList.remove("ui-resizable-autohide"))}_mouseOut(t){s.DDManager.overResizeElement===this&&(delete s.DDManager.overResizeElement,this.el.classList.add("ui-resizable-autohide"))}_setupHandlers(){let t=this.option.handles||"e,s,se";return"all"===t&&(t="n,e,s,w,se,sw,ne,nw"),this.handlers=t.split(",").map((t=>t.trim())).map((t=>new n.DDResizableHandle(this.el,t,{start:t=>{this._resizeStart(t)},stop:t=>{this._resizeStop(t)},move:e=>{this._resizing(e,t)}}))),this}_resizeStart(t){this.originalRect=this.el.getBoundingClientRect(),this.scrollEl=o.Utils.getScrollElement(this.el),this.scrollY=this.scrollEl.scrollTop,this.scrolled=0,this.startEvent=t,this._setupHelper(),this._applyChange();const e=o.Utils.initEvent(t,{type:"resizestart",target:this.el});return this.option.start&&this.option.start(e,this._ui()),this.el.classList.add("ui-resizable-resizing"),this.triggerEvent("resizestart",e),this}_resizing(t,e){this.scrolled=this.scrollEl.scrollTop-this.scrollY,this.temporalRect=this._getChange(t,e),this._applyChange();const i=o.Utils.initEvent(t,{type:"resize",target:this.el});return this.option.resize&&this.option.resize(i,this._ui()),this.triggerEvent("resize",i),this}_resizeStop(t){const e=o.Utils.initEvent(t,{type:"resizestop",target:this.el});return this.option.stop&&this.option.stop(e),this.el.classList.remove("ui-resizable-resizing"),this.triggerEvent("resizestop",e),this._cleanHelper(),delete this.startEvent,delete this.originalRect,delete this.temporalRect,delete this.scrollY,delete this.scrolled,this}_setupHelper(){return this.elOriginStyleVal=a._originStyleProp.map((t=>this.el.style[t])),this.parentOriginStylePosition=this.el.parentElement.style.position,window.getComputedStyle(this.el.parentElement).position.match(/static/)&&(this.el.parentElement.style.position="relative"),this.el.style.position="absolute",this.el.style.opacity="0.8",this}_cleanHelper(){return a._originStyleProp.forEach(((t,e)=>{this.el.style[t]=this.elOriginStyleVal[e]||null})),this.el.parentElement.style.position=this.parentOriginStylePosition||null,this}_getChange(t,e){const i=this.startEvent,n={width:this.originalRect.width,height:this.originalRect.height+this.scrolled,left:this.originalRect.left,top:this.originalRect.top-this.scrolled},r=t.clientX-i.clientX,o=t.clientY-i.clientY;e.indexOf("e")>-1?n.width+=r:e.indexOf("w")>-1&&(n.width-=r,n.left+=r),e.indexOf("s")>-1?n.height+=o:e.indexOf("n")>-1&&(n.height-=o,n.top+=o);const s=this._constrainSize(n.width,n.height);return Math.round(n.width)!==Math.round(s.width)&&(e.indexOf("w")>-1&&(n.left+=n.width-s.width),n.width=s.width),Math.round(n.height)!==Math.round(s.height)&&(e.indexOf("n")>-1&&(n.top+=n.height-s.height),n.height=s.height),n}_constrainSize(t,e){const i=this.option.maxWidth||Number.MAX_SAFE_INTEGER,n=this.option.minWidth||t,r=this.option.maxHeight||Number.MAX_SAFE_INTEGER,o=this.option.minHeight||e;return{width:Math.min(i,Math.max(n,t)),height:Math.min(r,Math.max(o,e))}}_applyChange(){let t={left:0,top:0,width:0,height:0};if("absolute"===this.el.style.position){const e=this.el.parentElement,{left:i,top:n}=e.getBoundingClientRect();t={left:i,top:n,width:0,height:0}}return this.temporalRect?(Object.keys(this.temporalRect).forEach((e=>{const i=this.temporalRect[e];this.el.style[e]=i-t[e]+"px"})),this):this}_removeHandlers(){return this.handlers.forEach((t=>t.destroy())),delete this.handlers,this}}e.DDResizable=a,a._originStyleProp=["width","height","position","left","top","opacity","zIndex"]},168:(t,e,i)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.pointerleave=e.pointerenter=e.pointerdown=e.touchend=e.touchmove=e.touchstart=e.isTouch=void 0;const n=i(427);e.isTouch="undefined"!=typeof window&&"undefined"!=typeof document&&("ontouchstart"in document||"ontouchstart"in window||window.DocumentTouch&&document instanceof window.DocumentTouch||navigator.maxTouchPoints>0||navigator.msMaxTouchPoints>0);class r{}function o(t,e){if(t.touches.length>1)return;t.cancelable&&t.preventDefault();const i=t.changedTouches[0],n=document.createEvent("MouseEvents");n.initMouseEvent(e,!0,!0,window,1,i.screenX,i.screenY,i.clientX,i.clientY,!1,!1,!1,!1,0,null),t.target.dispatchEvent(n)}function s(t,e){t.cancelable&&t.preventDefault();const i=document.createEvent("MouseEvents");i.initMouseEvent(e,!0,!0,window,1,t.screenX,t.screenY,t.clientX,t.clientY,!1,!1,!1,!1,0,null),t.target.dispatchEvent(i)}e.touchstart=function(t){r.touchHandled||(r.touchHandled=!0,o(t,"mousedown"))},e.touchmove=function(t){r.touchHandled&&o(t,"mousemove")},e.touchend=function(t){if(!r.touchHandled)return;r.pointerLeaveTimeout&&(window.clearTimeout(r.pointerLeaveTimeout),delete r.pointerLeaveTimeout);const e=!!n.DDManager.dragElement;o(t,"mouseup"),e||o(t,"click"),r.touchHandled=!1},e.pointerdown=function(t){t.target.releasePointerCapture(t.pointerId)},e.pointerenter=function(t){n.DDManager.dragElement&&s(t,"mouseenter")},e.pointerleave=function(t){n.DDManager.dragElement&&(r.pointerLeaveTimeout=window.setTimeout((()=>{delete r.pointerLeaveTimeout,s(t,"mouseleave")}),10))}},935:(t,e,i)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.GridStackEngine=void 0;const n=i(284);class r{constructor(t={}){this.addedNodes=[],this.removedNodes=[],this.column=t.column||12,this.maxRow=t.maxRow,this._float=t.float,this.nodes=t.nodes||[],this.onChange=t.onChange}batchUpdate(t=!0){return!!this.batchMode===t||(this.batchMode=t,t?(this._prevFloat=this._float,this._float=!0,this.saveInitial()):(this._float=this._prevFloat,delete this._prevFloat,this._packNodes()._notify())),this}_useEntireRowArea(t,e){return(!this.float||this.batchMode&&!this._prevFloat)&&!this._hasLocked&&(!t._moving||t._skipDown||e.y<=t.y)}_fixCollisions(t,e=t,i,r={}){if(this.sortNodes(-1),!(i=i||this.collide(t,e)))return!1;if(t._moving&&!r.nested&&!this.float&&this.swap(t,i))return!0;let o=e;this._useEntireRowArea(t,e)&&(o={x:0,w:this.column,y:e.y,h:e.h},i=this.collide(t,o,r.skip));let s=!1,a={nested:!0,pack:!1};for(;i=i||this.collide(t,o,r.skip);){let o;if(i.locked||t._moving&&!t._skipDown&&e.y>t.y&&!this.float&&(!this.collide(i,Object.assign(Object.assign({},i),{y:t.y}),t)||!this.collide(i,Object.assign(Object.assign({},i),{y:e.y-i.h}),t))?(t._skipDown=t._skipDown||e.y>t.y,o=this.moveNode(t,Object.assign(Object.assign(Object.assign({},e),{y:i.y+i.h}),a)),i.locked&&o?n.Utils.copyPos(e,t):!i.locked&&o&&r.pack&&(this._packNodes(),e.y=i.y+i.h,n.Utils.copyPos(t,e)),s=s||o):o=this.moveNode(i,Object.assign(Object.assign(Object.assign({},i),{y:e.y+e.h,skip:t}),a)),!o)return s;i=void 0}return s}collide(t,e=t,i){return this.nodes.find((r=>r!==t&&r!==i&&n.Utils.isIntercepted(r,e)))}collideAll(t,e=t,i){return this.nodes.filter((r=>r!==t&&r!==i&&n.Utils.isIntercepted(r,e)))}directionCollideCoverage(t,e,i){if(!e.rect||!t._rect)return;let n,r=t._rect,o=Object.assign({},e.rect);return o.y>r.y?(o.h+=o.y-r.y,o.y=r.y):o.h+=r.y-o.y,o.x>r.x?(o.w+=o.x-r.x,o.x=r.x):o.w+=r.x-o.x,i.forEach((t=>{if(t.locked||!t._rect)return;let e=t._rect,i=Number.MAX_VALUE,s=Number.MAX_VALUE,a=.5;r.y<e.y?i=(o.y+o.h-e.y)/e.h:r.y+r.h>e.y+e.h&&(i=(e.y+e.h-o.y)/e.h),r.x<e.x?s=(o.x+o.w-e.x)/e.w:r.x+r.w>e.x+e.w&&(s=(e.x+e.w-o.x)/e.w);let l=Math.min(s,i);l>a&&(a=l,n=t)})),e.collide=n,n}cacheRects(t,e,i,n,r,o){return this.nodes.forEach((s=>s._rect={y:s.y*e+i,x:s.x*t+o,w:s.w*t-o-n,h:s.h*e-i-r})),this}swap(t,e){if(!e||e.locked||!t||t.locked)return!1;function i(){let i=e.x,n=e.y;return e.x=t.x,e.y=t.y,t.h!=e.h?(t.x=i,t.y=e.y+e.h):t.w!=e.w?(t.x=e.x+e.w,t.y=n):(t.x=i,t.y=n),t._dirty=e._dirty=!0,!0}let r;if(t.w===e.w&&t.h===e.h&&(t.x===e.x||t.y===e.y)&&(r=n.Utils.isTouching(t,e)))return i();if(!1!==r){if(t.w===e.w&&t.x===e.x&&(r||(r=n.Utils.isTouching(t,e)))){if(e.y<t.y){let i=t;t=e,e=i}return i()}if(!1!==r){if(t.h===e.h&&t.y===e.y&&(r||(r=n.Utils.isTouching(t,e)))){if(e.x<t.x){let i=t;t=e,e=i}return i()}return!1}}}isAreaEmpty(t,e,i,n){let r={x:t||0,y:e||0,w:i||1,h:n||1};return!this.collide(r)}compact(){if(0===this.nodes.length)return this;this.batchUpdate().sortNodes();let t=this.nodes;return this.nodes=[],t.forEach((t=>{t.locked||(t.autoPosition=!0),this.addNode(t,!1),t._dirty=!0})),this.batchUpdate(!1)}set float(t){this._float!==t&&(this._float=t||!1,t||this._packNodes()._notify())}get float(){return this._float||!1}sortNodes(t){return this.nodes=n.Utils.sort(this.nodes,t,this.column),this}_packNodes(){return this.batchMode||(this.sortNodes(),this.float?this.nodes.forEach((t=>{if(t._updating||void 0===t._orig||t.y===t._orig.y)return;let e=t.y;for(;e>t._orig.y;)--e,this.collide(t,{x:t.x,y:e,w:t.w,h:t.h})||(t._dirty=!0,t.y=e)})):this.nodes.forEach(((t,e)=>{if(!t.locked)for(;t.y>0;){let i=0===e?0:t.y-1;if(0!==e&&this.collide(t,{x:t.x,y:i,w:t.w,h:t.h}))break;t._dirty=t.y!==i,t.y=i}}))),this}prepareNode(t,e){(t=t||{})._id=t._id||r._idSeq++,void 0!==t.x&&void 0!==t.y&&null!==t.x&&null!==t.y||(t.autoPosition=!0);let i={x:0,y:0,w:1,h:1};return n.Utils.defaults(t,i),t.autoPosition||delete t.autoPosition,t.noResize||delete t.noResize,t.noMove||delete t.noMove,"string"==typeof t.x&&(t.x=Number(t.x)),"string"==typeof t.y&&(t.y=Number(t.y)),"string"==typeof t.w&&(t.w=Number(t.w)),"string"==typeof t.h&&(t.h=Number(t.h)),isNaN(t.x)&&(t.x=i.x,t.autoPosition=!0),isNaN(t.y)&&(t.y=i.y,t.autoPosition=!0),isNaN(t.w)&&(t.w=i.w),isNaN(t.h)&&(t.h=i.h),this.nodeBoundFix(t,e)}nodeBoundFix(t,e){let i=t._orig||n.Utils.copyPos({},t);if(t.maxW&&(t.w=Math.min(t.w,t.maxW)),t.maxH&&(t.h=Math.min(t.h,t.maxH)),t.minW&&t.minW<=this.column&&(t.w=Math.max(t.w,t.minW)),t.minH&&(t.h=Math.max(t.h,t.minH)),(1===this.column||t.x+t.w>this.column)&&this.column<12&&!this._inColumnResize&&t._id&&-1===this.findCacheLayout(t,12)){let e=Object.assign({},t);e.autoPosition?(delete e.x,delete e.y):e.x=Math.min(11,e.x),e.w=Math.min(12,e.w),this.cacheOneLayout(e,12)}return t.w>this.column?t.w=this.column:t.w<1&&(t.w=1),this.maxRow&&t.h>this.maxRow?t.h=this.maxRow:t.h<1&&(t.h=1),t.x<0&&(t.x=0),t.y<0&&(t.y=0),t.x+t.w>this.column&&(e?t.w=this.column-t.x:t.x=this.column-t.w),this.maxRow&&t.y+t.h>this.maxRow&&(e?t.h=this.maxRow-t.y:t.y=this.maxRow-t.h),n.Utils.samePos(t,i)||(t._dirty=!0),t}getDirtyNodes(t){return t?this.nodes.filter((t=>t._dirty&&!n.Utils.samePos(t,t._orig))):this.nodes.filter((t=>t._dirty))}_notify(t){if(this.batchMode||!this.onChange)return this;let e=(t||[]).concat(this.getDirtyNodes());return this.onChange(e),this}cleanNodes(){return this.batchMode||this.nodes.forEach((t=>{delete t._dirty,delete t._lastTried})),this}saveInitial(){return this.nodes.forEach((t=>{t._orig=n.Utils.copyPos({},t),delete t._dirty})),this._hasLocked=this.nodes.some((t=>t.locked)),this}restoreInitial(){return this.nodes.forEach((t=>{n.Utils.samePos(t,t._orig)||(n.Utils.copyPos(t,t._orig),t._dirty=!0)})),this._notify(),this}findEmptyPosition(t,e=this.nodes,i=this.column){e=n.Utils.sort(e,-1,i);let r=!1;for(let o=0;!r;++o){let s=o%i,a=Math.floor(o/i);if(s+t.w>i)continue;let l={x:s,y:a,w:t.w,h:t.h};e.find((t=>n.Utils.isIntercepted(l,t)))||(t.x=s,t.y=a,delete t.autoPosition,r=!0)}return r}addNode(t,e=!1){return this.nodes.find((e=>e._id===t._id))||(delete(t=this._inColumnResize?this.nodeBoundFix(t):this.prepareNode(t))._temporaryRemoved,delete t._removeDOM,t.autoPosition&&this.findEmptyPosition(t)&&delete t.autoPosition,this.nodes.push(t),e&&this.addedNodes.push(t),this._fixCollisions(t),this.batchMode||this._packNodes()._notify(),t)}removeNode(t,e=!0,i=!1){return this.nodes.find((e=>e===t))?(i&&this.removedNodes.push(t),e&&(t._removeDOM=!0),this.nodes=this.nodes.filter((e=>e!==t)),this._packNodes()._notify([t])):this}removeAll(t=!0){return delete this._layouts,0===this.nodes.length?this:(t&&this.nodes.forEach((t=>t._removeDOM=!0)),this.removedNodes=this.nodes,this.nodes=[],this._notify(this.removedNodes))}moveNodeCheck(t,e){if(!this.changedPosConstrain(t,e))return!1;if(e.pack=!0,!this.maxRow)return this.moveNode(t,e);let i,o=new r({column:this.column,float:this.float,nodes:this.nodes.map((e=>e===t?(i=Object.assign({},e),i):Object.assign({},e)))});if(!i)return!1;let s=o.moveNode(i,e)&&o.getRow()<=this.maxRow;if(!s&&!e.resizing&&e.collide){let i=e.collide.el.gridstackNode;if(this.swap(t,i))return this._notify(),!0}return!!s&&(o.nodes.filter((t=>t._dirty)).forEach((t=>{let e=this.nodes.find((e=>e._id===t._id));e&&(n.Utils.copyPos(e,t),e._dirty=!0)})),this._notify(),!0)}willItFit(t){if(delete t._willFitPos,!this.maxRow)return!0;let e=new r({column:this.column,float:this.float,nodes:this.nodes.map((t=>Object.assign({},t)))}),i=Object.assign({},t);return this.cleanupNode(i),delete i.el,delete i._id,delete i.content,delete i.grid,e.addNode(i),e.getRow()<=this.maxRow&&(t._willFitPos=n.Utils.copyPos({},i),!0)}changedPosConstrain(t,e){return e.w=e.w||t.w,e.h=e.h||t.h,t.x!==e.x||t.y!==e.y||(t.maxW&&(e.w=Math.min(e.w,t.maxW)),t.maxH&&(e.h=Math.min(e.h,t.maxH)),t.minW&&(e.w=Math.max(e.w,t.minW)),t.minH&&(e.h=Math.max(e.h,t.minH)),t.w!==e.w||t.h!==e.h)}moveNode(t,e){var i,r;if(!t||!e)return!1;let o;void 0===e.pack&&(o=e.pack=!0),"number"!=typeof e.x&&(e.x=t.x),"number"!=typeof e.y&&(e.y=t.y),"number"!=typeof e.w&&(e.w=t.w),"number"!=typeof e.h&&(e.h=t.h);let s=t.w!==e.w||t.h!==e.h,a=n.Utils.copyPos({},t,!0);if(n.Utils.copyPos(a,e),a=this.nodeBoundFix(a,s),n.Utils.copyPos(e,a),n.Utils.samePos(t,e))return!1;let l=n.Utils.copyPos({},t),c=this.collideAll(t,a,e.skip),h=!0;if(c.length){let s=t._moving&&!e.nested,l=s?this.directionCollideCoverage(t,e,c):c[0];if(s&&l&&(null===(r=null===(i=t.grid)||void 0===i?void 0:i.opts)||void 0===r?void 0:r.subGridDynamic)&&!t.grid._isTemp){let i=n.Utils.areaIntercept(e.rect,l._rect),r=n.Utils.area(e.rect),o=n.Utils.area(l._rect);i/(r<o?r:o)>.8&&(l.grid.makeSubGrid(l.el,void 0,t),l=void 0)}l?h=!this._fixCollisions(t,a,l,e):(h=!1,o&&delete e.pack)}return h&&(t._dirty=!0,n.Utils.copyPos(t,a)),e.pack&&this._packNodes()._notify(),!n.Utils.samePos(t,l)}getRow(){return this.nodes.reduce(((t,e)=>Math.max(t,e.y+e.h)),0)}beginUpdate(t){return t._updating||(t._updating=!0,delete t._skipDown,this.batchMode||this.saveInitial()),this}endUpdate(){let t=this.nodes.find((t=>t._updating));return t&&(delete t._updating,delete t._skipDown),this}save(t=!0){var e;let i=null===(e=this._layouts)||void 0===e?void 0:e.length,r=i&&this.column!==i-1?this._layouts[i-1]:null,o=[];return this.sortNodes(),this.nodes.forEach((e=>{let i=null==r?void 0:r.find((t=>t._id===e._id)),s=Object.assign({},e);i&&(s.x=i.x,s.y=i.y,s.w=i.w),n.Utils.removeInternalForSave(s,!t),o.push(s)})),o}layoutsNodesChange(t){return!this._layouts||this._inColumnResize||this._layouts.forEach(((e,i)=>{if(!e||i===this.column)return this;if(i<this.column)this._layouts[i]=void 0;else{let n=i/this.column;t.forEach((t=>{if(!t._orig)return;let i=e.find((e=>e._id===t._id));i&&(t.y!==t._orig.y&&(i.y+=t.y-t._orig.y),t.x!==t._orig.x&&(i.x=Math.round(t.x*n)),t.w!==t._orig.w&&(i.w=Math.round(t.w*n)))}))}})),this}updateNodeWidths(t,e,i,r="moveScale"){var o;if(!this.nodes.length||!e||t===e)return this;this.cacheLayout(this.nodes,t),this.batchUpdate();let s=[],a=!1;if(1===e&&(null==i?void 0:i.length)){a=!0;let t=0;i.forEach((e=>{e.x=0,e.w=1,e.y=Math.max(e.y,t),t=e.y+e.h})),s=i,i=[]}else i=n.Utils.sort(this.nodes,-1,t);let l=[];if(e>t){l=this._layouts[e]||[];let n=this._layouts.length-1;!l.length&&t!==n&&(null===(o=this._layouts[n])||void 0===o?void 0:o.length)&&(t=n,this._layouts[n].forEach((t=>{let e=i.find((e=>e._id===t._id));e&&(e.x=t.x,e.y=t.y,e.w=t.w)})))}if(l.forEach((t=>{let e=i.findIndex((e=>e._id===t._id));-1!==e&&((t.autoPosition||isNaN(t.x)||isNaN(t.y))&&this.findEmptyPosition(t,s),t.autoPosition||(i[e].x=t.x,i[e].y=t.y,i[e].w=t.w,s.push(i[e])),i.splice(e,1))})),i.length)if("function"==typeof r)r(e,t,s,i);else if(!a){let n=e/t,o="move"===r||"moveScale"===r,a="scale"===r||"moveScale"===r;i.forEach((i=>{i.x=1===e?0:o?Math.round(i.x*n):Math.min(i.x,e-1),i.w=1===e||1===t?1:a?Math.round(i.w*n)||1:Math.min(i.w,e),s.push(i)})),i=[]}return a||(s=n.Utils.sort(s,-1,e)),this._inColumnResize=!0,this.nodes=[],s.forEach((t=>{this.addNode(t,!1),delete t._orig})),this.batchUpdate(!1),delete this._inColumnResize,this}cacheLayout(t,e,i=!1){let n=[];return t.forEach(((t,e)=>{t._id=t._id||r._idSeq++,n[e]={x:t.x,y:t.y,w:t.w,_id:t._id}})),this._layouts=i?[]:this._layouts||[],this._layouts[e]=n,this}cacheOneLayout(t,e){t._id=t._id||r._idSeq++;let i={x:t.x,y:t.y,w:t.w,_id:t._id};t.autoPosition&&(delete i.x,delete i.y,i.autoPosition=!0),this._layouts=this._layouts||[],this._layouts[e]=this._layouts[e]||[];let n=this.findCacheLayout(t,e);return-1===n?this._layouts[e].push(i):this._layouts[e][n]=i,this}findCacheLayout(t,e){var i,n,r;return null!==(r=null===(n=null===(i=this._layouts)||void 0===i?void 0:i[e])||void 0===n?void 0:n.findIndex((e=>e._id===t._id)))&&void 0!==r?r:-1}cleanupNode(t){for(let e in t)"_"===e[0]&&"_id"!==e&&delete t[e];return this}}e.GridStackEngine=r,r._idSeq=1},929:function(t,e,i){"use strict";var n=this&&this.__createBinding||(Object.create?function(t,e,i,n){void 0===n&&(n=i),Object.defineProperty(t,n,{enumerable:!0,get:function(){return e[i]}})}:function(t,e,i,n){void 0===n&&(n=i),t[n]=e[i]}),r=this&&this.__exportStar||function(t,e){for(var i in t)"default"===i||e.hasOwnProperty(i)||n(e,t,i)};Object.defineProperty(e,"__esModule",{value:!0}),e.GridStack=void 0;const o=i(935),s=i(284),a=i(523),l=i(470),c=i(168),h=i(427),u=new l.DDGridStack;r(i(523),e),r(i(284),e),r(i(935),e),r(i(470),e);class d{constructor(t,e={}){var i,n;this._gsEventHandler={},this._extraDragRow=0,this.el=t,e=e||{},t.classList.contains("grid-stack")||this.el.classList.add("grid-stack"),e.row&&(e.minRow=e.maxRow=e.row,delete e.row);let r=s.Utils.toNumber(t.getAttribute("gs-row"));"auto"===e.column&&delete e.column;let l=e;void 0!==l.minWidth&&(e.oneColumnSize=e.oneColumnSize||l.minWidth,delete l.minWidth),void 0!==e.alwaysShowResizeHandle&&(e._alwaysShowResizeHandle=e.alwaysShowResizeHandle);let u=Object.assign(Object.assign({},s.Utils.cloneDeep(a.gridDefaults)),{column:s.Utils.toNumber(t.getAttribute("gs-column"))||a.gridDefaults.column,minRow:r||s.Utils.toNumber(t.getAttribute("gs-min-row"))||a.gridDefaults.minRow,maxRow:r||s.Utils.toNumber(t.getAttribute("gs-max-row"))||a.gridDefaults.maxRow,staticGrid:s.Utils.toBool(t.getAttribute("gs-static"))||a.gridDefaults.staticGrid,draggable:{handle:(e.handleClass?"."+e.handleClass:e.handle?e.handle:"")||a.gridDefaults.draggable.handle},removableOptions:{accept:e.itemClass?"."+e.itemClass:a.gridDefaults.removableOptions.accept}});t.getAttribute("gs-animate")&&(u.animate=s.Utils.toBool(t.getAttribute("gs-animate"))),this.opts=s.Utils.defaults(e,u),e=null,this._initMargin(),1!==this.opts.column&&!this.opts.disableOneColumnMode&&this._widthOrContainer()<=this.opts.oneColumnSize&&(this._prevColumn=this.getColumn(),this.opts.column=1),"auto"===this.opts.rtl&&(this.opts.rtl="rtl"===t.style.direction),this.opts.rtl&&this.el.classList.add("grid-stack-rtl");let f=null===(i=s.Utils.closestUpByClass(this.el,a.gridDefaults.itemClass))||void 0===i?void 0:i.gridstackNode;f&&(f.subGrid=this,this.parentGridItem=f,this.el.classList.add("grid-stack-nested"),f.el.classList.add("grid-stack-sub-grid")),this._isAutoCellHeight="auto"===this.opts.cellHeight,this._isAutoCellHeight||"initial"===this.opts.cellHeight?this.cellHeight(void 0,!1):("number"==typeof this.opts.cellHeight&&this.opts.cellHeightUnit&&this.opts.cellHeightUnit!==a.gridDefaults.cellHeightUnit&&(this.opts.cellHeight=this.opts.cellHeight+this.opts.cellHeightUnit,delete this.opts.cellHeightUnit),this.cellHeight(this.opts.cellHeight,!1)),"mobile"===this.opts.alwaysShowResizeHandle&&(this.opts.alwaysShowResizeHandle=c.isTouch),this._styleSheetClass="grid-stack-instance-"+o.GridStackEngine._idSeq++,this.el.classList.add(this._styleSheetClass),this._setStaticClass();let p=this.opts.engineClass||d.engineClass||o.GridStackEngine;if(this.engine=new p({column:this.getColumn(),float:this.opts.float,maxRow:this.opts.maxRow,onChange:t=>{let e=0;this.engine.nodes.forEach((t=>{e=Math.max(e,t.y+t.h)})),t.forEach((t=>{let e=t.el;e&&(t._removeDOM?(e&&e.remove(),delete t._removeDOM):this._writePosAttr(e,t))})),this._updateStyles(!1,e)}}),this.opts.auto&&(this.batchUpdate(),this.getGridItems().forEach((t=>this._prepareElement(t))),this.batchUpdate(!1)),this.opts.children){let t=this.opts.children;delete this.opts.children,t.length&&this.load(t)}this.setAnimation(this.opts.animate),this._updateStyles(),12!=this.opts.column&&this.el.classList.add("grid-stack-"+this.opts.column),this.opts.dragIn&&d.setupDragIn(this.opts.dragIn,this.opts.dragInOptions),delete this.opts.dragIn,delete this.opts.dragInOptions,this.opts.subGridDynamic&&!h.DDManager.pauseDrag&&(h.DDManager.pauseDrag=!0),void 0!==(null===(n=this.opts.draggable)||void 0===n?void 0:n.pause)&&(h.DDManager.pauseDrag=this.opts.draggable.pause),this._setupRemoveDrop(),this._setupAcceptWidget(),this._updateWindowResizeEvent()}static init(t={},e=".grid-stack"){let i=d.getGridElement(e);return i?(i.gridstack||(i.gridstack=new d(i,s.Utils.cloneDeep(t))),i.gridstack):("string"==typeof e?console.error('GridStack.initAll() no grid was found with selector "'+e+'" - element missing or wrong selector ?\nNote: ".grid-stack" is required for proper CSS styling and drag/drop, and is the default selector.'):console.error("GridStack.init() no grid element was passed."),null)}static initAll(t={},e=".grid-stack"){let i=[];return d.getGridElements(e).forEach((e=>{e.gridstack||(e.gridstack=new d(e,s.Utils.cloneDeep(t)),delete t.dragIn,delete t.dragInOptions),i.push(e.gridstack)})),0===i.length&&console.error('GridStack.initAll() no grid was found with selector "'+e+'" - element missing or wrong selector ?\nNote: ".grid-stack" is required for proper CSS styling and drag/drop, and is the default selector.'),i}static addGrid(t,e={}){if(!t)return null;let i=t;if(!t.classList.contains("grid-stack")||e.addRemoveCB)if(e.addRemoveCB)i=e.addRemoveCB(t,e,!0,!0);else{let n=document.implementation.createHTMLDocument("");n.body.innerHTML=`<div class="grid-stack ${e.class||""}"></div>`,i=n.body.children[0],t.appendChild(i)}return d.init(e,i)}static registerEngine(t){d.engineClass=t}get placeholder(){if(!this._placeholder){let t=document.createElement("div");t.className="placeholder-content",this.opts.placeholderText&&(t.innerHTML=this.opts.placeholderText),this._placeholder=document.createElement("div"),this._placeholder.classList.add(this.opts.placeholderClass,a.gridDefaults.itemClass,this.opts.itemClass),this.placeholder.appendChild(t)}return this._placeholder}addWidget(t,e){let i,n;if("string"==typeof t){let e=document.implementation.createHTMLDocument("");e.body.innerHTML=t,i=e.body.children[0]}else if(0===arguments.length||1===arguments.length&&(void 0!==(r=t).el||void 0!==r.x||void 0!==r.y||void 0!==r.w||void 0!==r.h||void 0!==r.content))if(n=e=t,null==n?void 0:n.el)i=n.el;else if(this.opts.addRemoveCB)i=this.opts.addRemoveCB(this.el,e,!0,!1);else{let t=(null==e?void 0:e.content)||"",n=document.implementation.createHTMLDocument("");n.body.innerHTML=`<div class="grid-stack-item ${this.opts.itemClass||""}"><div class="grid-stack-item-content">${t}</div></div>`,i=n.body.children[0]}else i=t;var r;if(!i)return;let o=this._readAttr(i);return e=s.Utils.cloneDeep(e)||{},s.Utils.defaults(e,o),n=this.engine.prepareNode(e),this._writeAttr(i,e),this._insertNotAppend?this.el.prepend(i):this.el.appendChild(i),this._prepareElement(i,!0,e),this._updateContainerHeight(),n.subGrid&&this.makeSubGrid(n.el,void 0,void 0,!1),this._prevColumn&&1===this.opts.column&&(this._ignoreLayoutsNodeChange=!0),this._triggerAddEvent(),this._triggerChangeEvent(),delete this._ignoreLayoutsNodeChange,i}makeSubGrid(t,e,i,n=!0){var r,o,a;let l,c=t.gridstackNode;if(c||(c=this.makeWidget(t).gridstackNode),null===(r=c.subGrid)||void 0===r?void 0:r.el)return c.subGrid;let h,u=this;for(;u&&!l;)l=null===(o=u.opts)||void 0===o?void 0:o.subGrid,u=null===(a=u.parentGridItem)||void 0===a?void 0:a.grid;e=s.Utils.cloneDeep(Object.assign(Object.assign(Object.assign({},l||{}),{children:void 0}),e||c.subGrid)),c.subGrid=e,"auto"===e.column&&(h=!0,e.column=Math.max(c.w||1,(null==i?void 0:i.w)||1),e.disableOneColumnMode=!0);let f,p,g=c.el.querySelector(".grid-stack-item-content");if(n){if(this._removeDD(c.el),p=Object.assign(Object.assign({},c),{x:0,y:0}),s.Utils.removeInternalForSave(p),delete p.subGrid,c.content&&(p.content=c.content,delete c.content),this.opts.addRemoveCB)f=this.opts.addRemoveCB(this.el,p,!0,!1);else{let t=document.implementation.createHTMLDocument("");t.body.innerHTML='<div class="grid-stack-item"></div>',f=t.body.children[0],f.appendChild(g),t.body.innerHTML='<div class="grid-stack-item-content"></div>',g=t.body.children[0],c.el.appendChild(g)}this._prepareDragDropByNode(c)}if(i){let t=h?e.column:c.w,n=c.h+i.h,r=c.el.style;r.transition="none",this.update(c.el,{w:t,h:n}),setTimeout((()=>r.transition=null))}this.opts.addRemoveCB&&(e.addRemoveCB=e.addRemoveCB||this.opts.addRemoveCB);let m=c.subGrid=d.addGrid(g,e);return(null==i?void 0:i._moving)&&(m._isTemp=!0),h&&(m._autoColumn=!0),n&&m.addWidget(f,p),i&&(i._moving?window.setTimeout((()=>s.Utils.simulateMouseEvent(i._event,"mouseenter",m.el)),0):m.addWidget(c.el,c)),m}removeAsSubGrid(t){var e;let i=null===(e=this.parentGridItem)||void 0===e?void 0:e.grid;i&&(i.batchUpdate(),i.removeWidget(this.parentGridItem.el,!0,!0),this.engine.nodes.forEach((t=>{t.x+=this.parentGridItem.x,t.y+=this.parentGridItem.y,i.addWidget(t.el,t)})),i.batchUpdate(!1),this.parentGridItem&&delete this.parentGridItem.subGrid,delete this.parentGridItem,t&&window.setTimeout((()=>s.Utils.simulateMouseEvent(t._event,"mouseenter",i.el)),0))}save(t=!0,e=!1){let i=this.engine.save(t);if(i.forEach((i=>{var n;if(t&&i.el&&!i.subGrid){let t=i.el.querySelector(".grid-stack-item-content");i.content=t?t.innerHTML:void 0,i.content||delete i.content}else if(t||delete i.content,null===(n=i.subGrid)||void 0===n?void 0:n.el){const n=i.subGrid.save(t,e);i.subGrid=e?n:{children:n}}delete i.el})),e){let t=s.Utils.cloneDeep(this.opts);t.marginBottom===t.marginTop&&t.marginRight===t.marginLeft&&t.marginTop===t.marginRight&&(t.margin=t.marginTop,delete t.marginTop,delete t.marginRight,delete t.marginBottom,delete t.marginLeft),t.rtl===("rtl"===this.el.style.direction)&&(t.rtl="auto"),this._isAutoCellHeight&&(t.cellHeight="auto"),this._autoColumn&&(t.column="auto",delete t.disableOneColumnMode);const e=t._alwaysShowResizeHandle;return delete t._alwaysShowResizeHandle,void 0!==e?t.alwaysShowResizeHandle=e:delete t.alwaysShowResizeHandle,s.Utils.removeInternalAndSame(t,a.gridDefaults),t.children=i,t}return i}load(t,e=this.opts.addRemoveCB||!0){let i=d.Utils.sort([...t],-1,this._prevColumn||this.getColumn());this._insertNotAppend=!0,this._prevColumn&&this._prevColumn!==this.opts.column&&i.some((t=>t.x+t.w>this.opts.column))&&(this._ignoreLayoutsNodeChange=!0,this.engine.cacheLayout(i,this._prevColumn,!0));const n=this.opts.addRemoveCB;"function"==typeof e&&(this.opts.addRemoveCB=e);let r=[];return this.batchUpdate(),e&&[...this.engine.nodes].forEach((t=>{i.find((e=>t.id===e.id))||(this.opts.addRemoveCB&&this.opts.addRemoveCB(this.el,t,!1,!1),r.push(t),this.removeWidget(t.el,!0,!1))})),i.forEach((t=>{let i=t.id||0===t.id?this.engine.nodes.find((e=>e.id===t.id)):void 0;if(i){if(this.update(i.el,t),t.subGrid&&t.subGrid.children){let e=i.el.querySelector(".grid-stack");e&&e.gridstack&&(e.gridstack.load(t.subGrid.children),this._insertNotAppend=!0)}}else e&&this.addWidget(t)})),this.engine.removedNodes=r,this.batchUpdate(!1),delete this._ignoreLayoutsNodeChange,delete this._insertNotAppend,n?this.opts.addRemoveCB=n:delete this.opts.addRemoveCB,this}batchUpdate(t=!0){return this.engine.batchUpdate(t),t||(this._triggerRemoveEvent(),this._triggerAddEvent(),this._triggerChangeEvent()),this}getCellHeight(t=!1){if(this.opts.cellHeight&&"auto"!==this.opts.cellHeight&&(!t||!this.opts.cellHeightUnit||"px"===this.opts.cellHeightUnit))return this.opts.cellHeight;let e=this.el.querySelector("."+this.opts.itemClass);if(e){let t=s.Utils.toNumber(e.getAttribute("gs-h"));return Math.round(e.offsetHeight/t)}let i=parseInt(this.el.getAttribute("gs-current-row"));return i?Math.round(this.el.getBoundingClientRect().height/i):this.opts.cellHeight}cellHeight(t,e=!0){if(e&&void 0!==t&&this._isAutoCellHeight!==("auto"===t)&&(this._isAutoCellHeight="auto"===t,this._updateWindowResizeEvent()),"initial"!==t&&"auto"!==t||(t=void 0),void 0===t){let e=-this.opts.marginRight-this.opts.marginLeft+this.opts.marginTop+this.opts.marginBottom;t=this.cellWidth()+e}let i=s.Utils.parseHeight(t);return this.opts.cellHeightUnit===i.unit&&this.opts.cellHeight===i.h||(this.opts.cellHeightUnit=i.unit,this.opts.cellHeight=i.h,e&&this._updateStyles(!0)),this}cellWidth(){return this._widthOrContainer()/this.getColumn()}_widthOrContainer(){return this.el.clientWidth||this.el.parentElement.clientWidth||window.innerWidth}compact(){return this.engine.compact(),this._triggerChangeEvent(),this}column(t,e="moveScale"){if(t<1||this.opts.column===t)return this;let i,n=this.getColumn();return 1===t?this._prevColumn=n:delete this._prevColumn,this.el.classList.remove("grid-stack-"+n),this.el.classList.add("grid-stack-"+t),this.opts.column=this.engine.column=t,1===t&&this.opts.oneColumnModeDomSort&&(i=[],this.getGridItems().forEach((t=>{t.gridstackNode&&i.push(t.gridstackNode)})),i.length||(i=void 0)),this.engine.updateNodeWidths(n,t,i,e),this._isAutoCellHeight&&this.cellHeight(),this._ignoreLayoutsNodeChange=!0,this._triggerChangeEvent(),delete this._ignoreLayoutsNodeChange,this}getColumn(){return this.opts.column}getGridItems(){return Array.from(this.el.children).filter((t=>t.matches("."+this.opts.itemClass)&&!t.matches("."+this.opts.placeholderClass)))}destroy(t=!0){if(this.el)return this._updateWindowResizeEvent(!0),this.setStatic(!0,!1),this.setAnimation(!1),t?this.el.parentNode.removeChild(this.el):(this.removeAll(t),this.el.classList.remove(this._styleSheetClass)),this._removeStylesheet(),this.el.removeAttribute("gs-current-row"),this.parentGridItem&&delete this.parentGridItem.subGrid,delete this.parentGridItem,delete this.opts,delete this._placeholder,delete this.engine,delete this.el.gridstack,delete this.el,this}float(t){return this.opts.float!==t&&(this.opts.float=this.engine.float=t,this._triggerChangeEvent()),this}getFloat(){return this.engine.float}getCellFromPixel(t,e=!1){let i,n=this.el.getBoundingClientRect();i=e?{top:n.top+document.documentElement.scrollTop,left:n.left}:{top:this.el.offsetTop,left:this.el.offsetLeft};let r=t.left-i.left,o=t.top-i.top,s=n.width/this.getColumn(),a=n.height/parseInt(this.el.getAttribute("gs-current-row"));return{x:Math.floor(r/s),y:Math.floor(o/a)}}getRow(){return Math.max(this.engine.getRow(),this.opts.minRow)}isAreaEmpty(t,e,i,n){return this.engine.isAreaEmpty(t,e,i,n)}makeWidget(t){let e=d.getElement(t);return this._prepareElement(e,!0),this._updateContainerHeight(),this._triggerAddEvent(),this._triggerChangeEvent(),e}on(t,e){if(-1!==t.indexOf(" "))return t.split(" ").forEach((t=>this.on(t,e))),this;if("change"===t||"added"===t||"removed"===t||"enable"===t||"disable"===t){let i="enable"===t||"disable"===t;this._gsEventHandler[t]=i?t=>e(t):t=>e(t,t.detail),this.el.addEventListener(t,this._gsEventHandler[t])}else"drag"===t||"dragstart"===t||"dragstop"===t||"resizestart"===t||"resize"===t||"resizestop"===t||"dropped"===t?this._gsEventHandler[t]=e:console.log("GridStack.on("+t+') event not supported, but you can still use $(".grid-stack").on(...) while jquery-ui is still used internally.');return this}off(t){return-1!==t.indexOf(" ")?(t.split(" ").forEach((t=>this.off(t))),this):("change"!==t&&"added"!==t&&"removed"!==t&&"enable"!==t&&"disable"!==t||this._gsEventHandler[t]&&this.el.removeEventListener(t,this._gsEventHandler[t]),delete this._gsEventHandler[t],this)}removeWidget(t,e=!0,i=!0){return d.getElements(t).forEach((t=>{if(t.parentElement&&t.parentElement!==this.el)return;let n=t.gridstackNode;n||(n=this.engine.nodes.find((e=>t===e.el))),n&&(delete t.gridstackNode,this._removeDD(t),this.engine.removeNode(n,e,i),e&&t.parentElement&&t.remove())})),i&&(this._triggerRemoveEvent(),this._triggerChangeEvent()),this}removeAll(t=!0){return this.engine.nodes.forEach((t=>{delete t.el.gridstackNode,this._removeDD(t.el)})),this.engine.removeAll(t),this._triggerRemoveEvent(),this}setAnimation(t){return t?this.el.classList.add("grid-stack-animate"):this.el.classList.remove("grid-stack-animate"),this}setStatic(t,e=!0,i=!0){return this.opts.staticGrid===t||(this.opts.staticGrid=t,this._setupRemoveDrop(),this._setupAcceptWidget(),this.engine.nodes.forEach((n=>{this._prepareDragDropByNode(n),n.subGrid&&i&&n.subGrid.setStatic(t,e,i)})),e&&this._setStaticClass()),this}update(t,e){if(arguments.length>2){console.warn("gridstack.ts: `update(el, x, y, w, h)` is deprecated. Use `update(el, {x, w, content, ...})`. It will be removed soon");let i=arguments,n=1;return e={x:i[n++],y:i[n++],w:i[n++],h:i[n++]},this.update(t,e)}return d.getElements(t).forEach((t=>{if(!t||!t.gridstackNode)return;let i=t.gridstackNode,n=s.Utils.cloneDeep(e);delete n.autoPosition;let r,o=["x","y","w","h"];if(o.some((t=>void 0!==n[t]&&n[t]!==i[t]))&&(r={},o.forEach((t=>{r[t]=void 0!==n[t]?n[t]:i[t],delete n[t]}))),!r&&(n.minW||n.minH||n.maxW||n.maxH)&&(r={}),n.content){let e=t.querySelector(".grid-stack-item-content");e&&e.innerHTML!==n.content&&(e.innerHTML=n.content),delete n.content}let a=!1,l=!1;for(const t in n)"_"!==t[0]&&i[t]!==n[t]&&(i[t]=n[t],a=!0,l=l||!this.opts.staticGrid&&("noResize"===t||"noMove"===t||"locked"===t));r&&(this.engine.cleanNodes().beginUpdate(i).moveNode(i,r),this._updateContainerHeight(),this._triggerChangeEvent(),this.engine.endUpdate()),a&&this._writeAttr(t,i),l&&this._prepareDragDropByNode(i)})),this}margin(t){if(!("string"==typeof t&&t.split(" ").length>1)){let e=s.Utils.parseHeight(t);if(this.opts.marginUnit===e.unit&&this.opts.margin===e.h)return}return this.opts.margin=t,this.opts.marginTop=this.opts.marginBottom=this.opts.marginLeft=this.opts.marginRight=void 0,this._initMargin(),this._updateStyles(!0),this}getMargin(){return this.opts.margin}willItFit(t){if(arguments.length>1){console.warn("gridstack.ts: `willItFit(x,y,w,h,autoPosition)` is deprecated. Use `willItFit({x, y,...})`. It will be removed soon");let t=arguments,e=0,i={x:t[e++],y:t[e++],w:t[e++],h:t[e++],autoPosition:t[e++]};return this.willItFit(i)}return this.engine.willItFit(t)}_triggerChangeEvent(){if(this.engine.batchMode)return this;let t=this.engine.getDirtyNodes(!0);return t&&t.length&&(this._ignoreLayoutsNodeChange||this.engine.layoutsNodesChange(t),this._triggerEvent("change",t)),this.engine.saveInitial(),this}_triggerAddEvent(){return this.engine.batchMode||this.engine.addedNodes&&this.engine.addedNodes.length>0&&(this._ignoreLayoutsNodeChange||this.engine.layoutsNodesChange(this.engine.addedNodes),this.engine.addedNodes.forEach((t=>{delete t._dirty})),this._triggerEvent("added",this.engine.addedNodes),this.engine.addedNodes=[]),this}_triggerRemoveEvent(){return this.engine.batchMode||this.engine.removedNodes&&this.engine.removedNodes.length>0&&(this._triggerEvent("removed",this.engine.removedNodes),this.engine.removedNodes=[]),this}_triggerEvent(t,e){let i=e?new CustomEvent(t,{bubbles:!1,detail:e}):new Event(t);return this.el.dispatchEvent(i),this}_removeStylesheet(){return this._styles&&(s.Utils.removeStylesheet(this._styleSheetClass),delete this._styles),this}_updateStyles(t=!1,e){if(t&&this._removeStylesheet(),e||(e=this.getRow()),this._updateContainerHeight(),0===this.opts.cellHeight)return this;let i=this.opts.cellHeight,n=this.opts.cellHeightUnit,r=`.${this._styleSheetClass} > .${this.opts.itemClass}`;if(!this._styles){let t=this.opts.styleInHead?void 0:this.el.parentNode;if(this._styles=s.Utils.createStylesheet(this._styleSheetClass,t,{nonce:this.opts.nonce}),!this._styles)return this;this._styles._max=0,s.Utils.addCSSRule(this._styles,r,`min-height: ${i}${n}`);let e=this.opts.marginTop+this.opts.marginUnit,o=this.opts.marginBottom+this.opts.marginUnit,a=this.opts.marginRight+this.opts.marginUnit,l=this.opts.marginLeft+this.opts.marginUnit,c=`${r} > .grid-stack-item-content`,h=`.${this._styleSheetClass} > .grid-stack-placeholder > .placeholder-content`;s.Utils.addCSSRule(this._styles,c,`top: ${e}; right: ${a}; bottom: ${o}; left: ${l};`),s.Utils.addCSSRule(this._styles,h,`top: ${e}; right: ${a}; bottom: ${o}; left: ${l};`),s.Utils.addCSSRule(this._styles,`${r} > .ui-resizable-ne`,`right: ${a}`),s.Utils.addCSSRule(this._styles,`${r} > .ui-resizable-e`,`right: ${a}`),s.Utils.addCSSRule(this._styles,`${r} > .ui-resizable-se`,`right: ${a}; bottom: ${o}`),s.Utils.addCSSRule(this._styles,`${r} > .ui-resizable-nw`,`left: ${l}`),s.Utils.addCSSRule(this._styles,`${r} > .ui-resizable-w`,`left: ${l}`),s.Utils.addCSSRule(this._styles,`${r} > .ui-resizable-sw`,`left: ${l}; bottom: ${o}`)}if((e=e||this._styles._max)>this._styles._max){let t=t=>i*t+n;for(let i=this._styles._max+1;i<=e;i++){let e=t(i);s.Utils.addCSSRule(this._styles,`${r}[gs-y="${i-1}"]`,`top: ${t(i-1)}`),s.Utils.addCSSRule(this._styles,`${r}[gs-h="${i}"]`,`height: ${e}`),s.Utils.addCSSRule(this._styles,`${r}[gs-min-h="${i}"]`,`min-height: ${e}`),s.Utils.addCSSRule(this._styles,`${r}[gs-max-h="${i}"]`,`max-height: ${e}`)}this._styles._max=e}return this}_updateContainerHeight(){if(!this.engine||this.engine.batchMode)return this;let t=this.getRow()+this._extraDragRow;if(this.el.setAttribute("gs-current-row",String(t)),0===t)return this.el.style.removeProperty("min-height"),this;let e=this.opts.cellHeight,i=this.opts.cellHeightUnit;return e?(this.el.style.minHeight=t*e+i,this):this}_prepareElement(t,e=!1,i){t.classList.add(this.opts.itemClass),i=i||this._readAttr(t),t.gridstackNode=i,i.el=t,i.grid=this;let n=Object.assign({},i);return i=this.engine.addNode(i,e),s.Utils.same(i,n)||this._writeAttr(t,i),this._prepareDragDropByNode(i),this}_writePosAttr(t,e){return void 0!==e.x&&null!==e.x&&t.setAttribute("gs-x",String(e.x)),void 0!==e.y&&null!==e.y&&t.setAttribute("gs-y",String(e.y)),e.w&&t.setAttribute("gs-w",String(e.w)),e.h&&t.setAttribute("gs-h",String(e.h)),this}_writeAttr(t,e){if(!e)return this;this._writePosAttr(t,e);let i={autoPosition:"gs-auto-position",minW:"gs-min-w",minH:"gs-min-h",maxW:"gs-max-w",maxH:"gs-max-h",noResize:"gs-no-resize",noMove:"gs-no-move",locked:"gs-locked",id:"gs-id"};for(const n in i)e[n]?t.setAttribute(i[n],String(e[n])):t.removeAttribute(i[n]);return this}_readAttr(t){let e={};e.x=s.Utils.toNumber(t.getAttribute("gs-x")),e.y=s.Utils.toNumber(t.getAttribute("gs-y")),e.w=s.Utils.toNumber(t.getAttribute("gs-w")),e.h=s.Utils.toNumber(t.getAttribute("gs-h")),e.maxW=s.Utils.toNumber(t.getAttribute("gs-max-w")),e.minW=s.Utils.toNumber(t.getAttribute("gs-min-w")),e.maxH=s.Utils.toNumber(t.getAttribute("gs-max-h")),e.minH=s.Utils.toNumber(t.getAttribute("gs-min-h")),e.autoPosition=s.Utils.toBool(t.getAttribute("gs-auto-position")),e.noResize=s.Utils.toBool(t.getAttribute("gs-no-resize")),e.noMove=s.Utils.toBool(t.getAttribute("gs-no-move")),e.locked=s.Utils.toBool(t.getAttribute("gs-locked")),e.id=t.getAttribute("gs-id");for(const t in e){if(!e.hasOwnProperty(t))return;e[t]||0===e[t]||delete e[t]}return e}_setStaticClass(){let t=["grid-stack-static"];return this.opts.staticGrid?(this.el.classList.add(...t),this.el.setAttribute("gs-static","true")):(this.el.classList.remove(...t),this.el.removeAttribute("gs-static")),this}onParentResize(){if(!this.el||!this.el.clientWidth)return;let t=!1;if(this._autoColumn&&this.parentGridItem)this.opts.column!==this.parentGridItem.w&&(t=!0,this.column(this.parentGridItem.w,"none"));else{let e=!this.opts.disableOneColumnMode&&this.el.clientWidth<=this.opts.oneColumnSize;1===this.opts.column!==e&&(t=!0,this.opts.animate&&this.setAnimation(!1),this.column(e?1:this._prevColumn),this.opts.animate&&this.setAnimation(!0))}return this._isAutoCellHeight&&(!t&&this.opts.cellHeightThrottle?(this._cellHeightThrottle||(this._cellHeightThrottle=s.Utils.throttle((()=>this.cellHeight()),this.opts.cellHeightThrottle)),this._cellHeightThrottle()):this.cellHeight()),this.engine.nodes.forEach((t=>{t.subGrid&&t.subGrid.onParentResize()})),this}_updateWindowResizeEvent(t=!1){const e=(this._isAutoCellHeight||!this.opts.disableOneColumnMode)&&!this.parentGridItem;return t||!e||this._windowResizeBind?!t&&e||!this._windowResizeBind||(window.removeEventListener("resize",this._windowResizeBind),delete this._windowResizeBind):(this._windowResizeBind=this.onParentResize.bind(this),window.addEventListener("resize",this._windowResizeBind)),this}static getElement(t=".grid-stack-item"){return s.Utils.getElement(t)}static getElements(t=".grid-stack-item"){return s.Utils.getElements(t)}static getGridElement(t){return d.getElement(t)}static getGridElements(t){return s.Utils.getElements(t)}_initMargin(){let t,e=0,i=[];return"string"==typeof this.opts.margin&&(i=this.opts.margin.split(" ")),2===i.length?(this.opts.marginTop=this.opts.marginBottom=i[0],this.opts.marginLeft=this.opts.marginRight=i[1]):4===i.length?(this.opts.marginTop=i[0],this.opts.marginRight=i[1],this.opts.marginBottom=i[2],this.opts.marginLeft=i[3]):(t=s.Utils.parseHeight(this.opts.margin),this.opts.marginUnit=t.unit,e=this.opts.margin=t.h),void 0===this.opts.marginTop?this.opts.marginTop=e:(t=s.Utils.parseHeight(this.opts.marginTop),this.opts.marginTop=t.h,delete this.opts.margin),void 0===this.opts.marginBottom?this.opts.marginBottom=e:(t=s.Utils.parseHeight(this.opts.marginBottom),this.opts.marginBottom=t.h,delete this.opts.margin),void 0===this.opts.marginRight?this.opts.marginRight=e:(t=s.Utils.parseHeight(this.opts.marginRight),this.opts.marginRight=t.h,delete this.opts.margin),void 0===this.opts.marginLeft?this.opts.marginLeft=e:(t=s.Utils.parseHeight(this.opts.marginLeft),this.opts.marginLeft=t.h,delete this.opts.margin),this.opts.marginUnit=t.unit,this.opts.marginTop===this.opts.marginBottom&&this.opts.marginLeft===this.opts.marginRight&&this.opts.marginTop===this.opts.marginRight&&(this.opts.margin=this.opts.marginTop),this}static getDD(){return u}static setupDragIn(t,e){void 0!==(null==e?void 0:e.pause)&&(h.DDManager.pauseDrag=e.pause),"string"==typeof t&&(e=Object.assign(Object.assign({},a.dragInDefaultOptions),e||{}),s.Utils.getElements(t).forEach((t=>{u.isDraggable(t)||u.dragIn(t,e)})))}movable(t,e){return this.opts.staticGrid||d.getElements(t).forEach((t=>{let i=t.gridstackNode;i&&(e?delete i.noMove:i.noMove=!0,this._prepareDragDropByNode(i))})),this}resizable(t,e){return this.opts.staticGrid||d.getElements(t).forEach((t=>{let i=t.gridstackNode;i&&(e?delete i.noResize:i.noResize=!0,this._prepareDragDropByNode(i))})),this}disable(t=!0){if(!this.opts.staticGrid)return this.enableMove(!1,t),this.enableResize(!1,t),this._triggerEvent("disable"),this}enable(t=!0){if(!this.opts.staticGrid)return this.enableMove(!0,t),this.enableResize(!0,t),this._triggerEvent("enable"),this}enableMove(t,e=!0){return this.opts.staticGrid||(this.opts.disableDrag=!t,this.engine.nodes.forEach((i=>{this.movable(i.el,t),i.subGrid&&e&&i.subGrid.enableMove(t,e)}))),this}enableResize(t,e=!0){return this.opts.staticGrid||(this.opts.disableResize=!t,this.engine.nodes.forEach((i=>{this.resizable(i.el,t),i.subGrid&&e&&i.subGrid.enableResize(t,e)}))),this}_removeDD(t){return u.draggable(t,"destroy").resizable(t,"destroy"),t.gridstackNode&&delete t.gridstackNode._initDD,delete t.ddElement,this}_setupAcceptWidget(){if(this.opts.staticGrid||!this.opts.acceptWidgets&&!this.opts.removable)return u.droppable(this.el,"destroy"),this;let t,e,i=(i,n,r)=>{let o=n.gridstackNode;if(!o)return;r=r||n;let a=this.el.getBoundingClientRect(),{top:l,left:c}=r.getBoundingClientRect();c-=a.left,l-=a.top;let h={position:{top:l,left:c}};if(o._temporaryRemoved){if(o.x=Math.max(0,Math.round(c/e)),o.y=Math.max(0,Math.round(l/t)),delete o.autoPosition,this.engine.nodeBoundFix(o),!this.engine.willItFit(o)){if(o.autoPosition=!0,!this.engine.willItFit(o))return void u.off(n,"drag");o._willFitPos&&(s.Utils.copyPos(o,o._willFitPos),delete o._willFitPos)}this._onStartMoving(r,i,h,o,e,t)}else this._dragOrResize(r,i,h,o,e,t)};return u.droppable(this.el,{accept:t=>{let e=t.gridstackNode;if((null==e?void 0:e.grid)===this)return!0;if(!this.opts.acceptWidgets)return!1;let i=!0;if("function"==typeof this.opts.acceptWidgets)i=this.opts.acceptWidgets(t);else{let e=!0===this.opts.acceptWidgets?".grid-stack-item":this.opts.acceptWidgets;i=t.matches(e)}if(i&&e&&this.opts.maxRow){let t={w:e.w,h:e.h,minW:e.minW,minH:e.minH};i=this.engine.willItFit(t)}return i}}).on(this.el,"dropover",((n,r,o)=>{let s=r.gridstackNode;if((null==s?void 0:s.grid)===this&&!s._temporaryRemoved)return!1;(null==s?void 0:s.grid)&&s.grid!==this&&!s._temporaryRemoved&&s.grid._leave(r,o),e=this.cellWidth(),t=this.getCellHeight(!0),s||(s=this._readAttr(r)),s.grid||(s._isExternal=!0,r.gridstackNode=s),o=o||r;let a=s.w||Math.round(o.offsetWidth/e)||1,l=s.h||Math.round(o.offsetHeight/t)||1;return s.grid&&s.grid!==this?(r._gridstackNodeOrig||(r._gridstackNodeOrig=s),r.gridstackNode=s=Object.assign(Object.assign({},s),{w:a,h:l,grid:this}),this.engine.cleanupNode(s).nodeBoundFix(s),s._initDD=s._isExternal=s._temporaryRemoved=!0):(s.w=a,s.h=l,s._temporaryRemoved=!0),this._itemRemoving(s.el,!1),u.on(r,"drag",i),i(n,r,o),!1})).on(this.el,"dropout",((t,e,i)=>{let n=e.gridstackNode;return!!n&&(n.grid&&n.grid!==this||(this._leave(e,i),this._isTemp&&this.removeAsSubGrid(n)),!1)})).on(this.el,"drop",((t,e,i)=>{var n,r;let o=e.gridstackNode;if((null==o?void 0:o.grid)===this&&!o._isExternal)return!1;let l=!!this.placeholder.parentElement;this.placeholder.remove();let c=e._gridstackNodeOrig;if(delete e._gridstackNodeOrig,l&&(null==c?void 0:c.grid)&&c.grid!==this){let t=c.grid;t.engine.removedNodes.push(c),t._triggerRemoveEvent()._triggerChangeEvent(),t.parentGridItem&&!t.engine.nodes.length&&t.opts.subGridDynamic&&t.removeAsSubGrid()}if(!o)return!1;if(l&&(this.engine.cleanupNode(o),o.grid=this),u.off(e,"drag"),i!==e?(i.remove(),e.gridstackNode=c,l&&(e=e.cloneNode(!0))):(e.remove(),this._removeDD(e)),!l)return!1;e.gridstackNode=o,o.el=e;let h=null===(r=null===(n=o.subGrid)||void 0===n?void 0:n.el)||void 0===r?void 0:r.gridstack;return s.Utils.copyPos(o,this._readAttr(this.placeholder)),s.Utils.removePositioningStyles(e),this._writeAttr(e,o),e.classList.add(a.gridDefaults.itemClass,this.opts.itemClass),this.el.appendChild(e),h&&(h.parentGridItem=o,h.opts.styleInHead||h._updateStyles(!0)),this._updateContainerHeight(),this.engine.addedNodes.push(o),this._triggerAddEvent(),this._triggerChangeEvent(),this.engine.endUpdate(),this._gsEventHandler.dropped&&this._gsEventHandler.dropped(Object.assign(Object.assign({},t),{type:"dropped"}),c&&c.grid?c:void 0,o),window.setTimeout((()=>{o.el&&o.el.parentElement?this._prepareDragDropByNode(o):this.engine.removeNode(o),delete o.grid._isTemp})),!1})),this}_itemRemoving(t,e){let i=t?t.gridstackNode:void 0;i&&i.grid&&(e?i._isAboutToRemove=!0:delete i._isAboutToRemove,e?t.classList.add("grid-stack-item-removing"):t.classList.remove("grid-stack-item-removing"))}_setupRemoveDrop(){if(!this.opts.staticGrid&&"string"==typeof this.opts.removable){let t=document.querySelector(this.opts.removable);if(!t)return this;u.isDroppable(t)||u.droppable(t,this.opts.removableOptions).on(t,"dropover",((t,e)=>this._itemRemoving(e,!0))).on(t,"dropout",((t,e)=>this._itemRemoving(e,!1)))}return this}_prepareDragDropByNode(t){let e=t.el;const i=t.noMove||this.opts.disableDrag,n=t.noResize||this.opts.disableResize;if(this.opts.staticGrid||i&&n)return t._initDD&&(this._removeDD(e),delete t._initDD),e.classList.add("ui-draggable-disabled","ui-resizable-disabled"),this;if(!t._initDD){let i,n,r=(r,o)=>{this._gsEventHandler[r.type]&&this._gsEventHandler[r.type](r,r.target),i=this.cellWidth(),n=this.getCellHeight(!0),this._onStartMoving(e,r,o,t,i,n)},o=(r,o)=>{this._dragOrResize(e,r,o,t,i,n)},a=i=>{this.placeholder.remove(),delete t._moving,delete t._event,delete t._lastTried;let n=i.target;if(n.gridstackNode&&n.gridstackNode.grid===this){if(t.el=n,t._isAboutToRemove){let r=e.gridstackNode.grid;r._gsEventHandler[i.type]&&r._gsEventHandler[i.type](i,n),this._removeDD(e),r.engine.removedNodes.push(t),r._triggerRemoveEvent(),delete e.gridstackNode,delete t.el,e.remove()}else s.Utils.removePositioningStyles(n),t._temporaryRemoved?(s.Utils.copyPos(t,t._orig),this._writePosAttr(n,t),this.engine.addNode(t)):this._writePosAttr(n,t),this._gsEventHandler[i.type]&&this._gsEventHandler[i.type](i,n);this._extraDragRow=0,this._updateContainerHeight(),this._triggerChangeEvent(),this.engine.endUpdate()}};u.draggable(e,{start:r,stop:a,drag:o}).resizable(e,{start:r,stop:a,resize:o}),t._initDD=!0}return u.draggable(e,i?"disable":"enable").resizable(e,n?"disable":"enable"),this}_onStartMoving(t,e,i,n,r,o){this.engine.cleanNodes().beginUpdate(n),this._writePosAttr(this.placeholder,n),this.el.appendChild(this.placeholder),n.el=this.placeholder,n._lastUiPosition=i.position,n._prevYPix=i.position.top,n._moving="dragstart"===e.type,delete n._lastTried,"dropover"===e.type&&n._temporaryRemoved&&(this.engine.addNode(n),n._moving=!0),this.engine.cacheRects(r,o,this.opts.marginTop,this.opts.marginRight,this.opts.marginBottom,this.opts.marginLeft),"resizestart"===e.type&&(u.resizable(t,"option","minWidth",r*(n.minW||1)).resizable(t,"option","minHeight",o*(n.minH||1)),n.maxW&&u.resizable(t,"option","maxWidth",r*n.maxW),n.maxH&&u.resizable(t,"option","maxHeight",o*n.maxH))}_dragOrResize(t,e,i,n,r,o){let a,l=Object.assign({},n._orig),c=this.opts.marginLeft,h=this.opts.marginRight,u=this.opts.marginTop,d=this.opts.marginBottom,f=Math.round(.1*o),p=Math.round(.1*r);if(c=Math.min(c,p),h=Math.min(h,p),u=Math.min(u,f),d=Math.min(d,f),"drag"===e.type){if(n._temporaryRemoved)return;let e=i.position.top-n._prevYPix;n._prevYPix=i.position.top,!1!==this.opts.draggable.scroll&&s.Utils.updateScrollPosition(t,i.position,e);let a=i.position.left+(i.position.left>n._lastUiPosition.left?-h:c),f=i.position.top+(i.position.top>n._lastUiPosition.top?-d:u);l.x=Math.round(a/r),l.y=Math.round(f/o);let p=this._extraDragRow;if(this.engine.collide(n,l)){let t=this.getRow(),e=Math.max(0,l.y+n.h-t);this.opts.maxRow&&t+e>this.opts.maxRow&&(e=Math.max(0,this.opts.maxRow-t)),this._extraDragRow=e}else this._extraDragRow=0;if(this._extraDragRow!==p&&this._updateContainerHeight(),n.x===l.x&&n.y===l.y)return}else if("resize"===e.type){if(l.x<0)return;if(s.Utils.updateScrollResize(e,t,o),l.w=Math.round((i.size.width-c)/r),l.h=Math.round((i.size.height-u)/o),n.w===l.w&&n.h===l.h)return;if(n._lastTried&&n._lastTried.w===l.w&&n._lastTried.h===l.h)return;let h=i.position.left+c,d=i.position.top+u;l.x=Math.round(h/r),l.y=Math.round(d/o),a=!0}n._event=e,n._lastTried=l;let g={x:i.position.left+c,y:i.position.top+u,w:(i.size?i.size.width:n.w*r)-c-h,h:(i.size?i.size.height:n.h*o)-u-d};if(this.engine.moveNodeCheck(n,Object.assign(Object.assign({},l),{cellWidth:r,cellHeight:o,rect:g,resizing:a}))){n._lastUiPosition=i.position,this.engine.cacheRects(r,o,u,h,d,c),delete n._skipDown,a&&n.subGrid&&n.subGrid.onParentResize(),this._extraDragRow=0,this._updateContainerHeight();let t=e.target;this._writePosAttr(t,n),this._gsEventHandler[e.type]&&this._gsEventHandler[e.type](e,t)}}_leave(t,e){let i=t.gridstackNode;i&&(u.off(t,"drag"),i._temporaryRemoved||(i._temporaryRemoved=!0,this.engine.removeNode(i),i.el=i._isExternal&&e?e:t,!0===this.opts.removable&&this._itemRemoving(t,!0),t._gridstackNodeOrig?(t.gridstackNode=t._gridstackNodeOrig,delete t._gridstackNodeOrig):i._isExternal&&(delete i.el,delete t.gridstackNode,this.engine.restoreInitial())))}commit(){return s.obsolete(this,this.batchUpdate(!1),"commit","batchUpdate","5.2"),this}}e.GridStack=d,d.Utils=s.Utils,d.Engine=o.GridStackEngine,d.GDRev="7.3.0"},523:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.dragInDefaultOptions=e.gridDefaults=void 0,e.gridDefaults={alwaysShowResizeHandle:"mobile",animate:!0,auto:!0,cellHeight:"auto",cellHeightThrottle:100,cellHeightUnit:"px",column:12,draggable:{handle:".grid-stack-item-content",appendTo:"body",scroll:!0},handle:".grid-stack-item-content",itemClass:"grid-stack-item",margin:10,marginUnit:"px",maxRow:0,minRow:0,oneColumnSize:768,placeholderClass:"grid-stack-placeholder",placeholderText:"",removableOptions:{accept:".grid-stack-item"},resizable:{handles:"se"},rtl:"auto"},e.dragInDefaultOptions={handle:".grid-stack-item-content",appendTo:"body"}},284:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Utils=e.obsoleteAttr=e.obsoleteOptsDel=e.obsoleteOpts=e.obsolete=void 0,e.obsolete=function(t,e,i,n,r){let o=(...o)=>(console.warn("gridstack.js: Function `"+i+"` is deprecated in "+r+" and has been replaced with `"+n+"`. It will be **removed** in a future release"),e.apply(t,o));return o.prototype=e.prototype,o},e.obsoleteOpts=function(t,e,i,n){void 0!==t[e]&&(t[i]=t[e],console.warn("gridstack.js: Option `"+e+"` is deprecated in "+n+" and has been replaced with `"+i+"`. It will be **removed** in a future release"))},e.obsoleteOptsDel=function(t,e,i,n){void 0!==t[e]&&console.warn("gridstack.js: Option `"+e+"` is deprecated in "+i+n)},e.obsoleteAttr=function(t,e,i,n){let r=t.getAttribute(e);null!==r&&(t.setAttribute(i,r),console.warn("gridstack.js: attribute `"+e+"`="+r+" is deprecated on this object in "+n+" and has been replaced with `"+i+"`. It will be **removed** in a future release"))};class i{static getElements(t){if("string"==typeof t){let e=document.querySelectorAll(t);return e.length||"."===t[0]||"#"===t[0]||(e=document.querySelectorAll("."+t),e.length||(e=document.querySelectorAll("#"+t))),Array.from(e)}return[t]}static getElement(t){if("string"==typeof t){if(!t.length)return null;if("#"===t[0])return document.getElementById(t.substring(1));if("."===t[0]||"["===t[0])return document.querySelector(t);if(!isNaN(+t[0]))return document.getElementById(t);let e=document.querySelector(t);return e||(e=document.getElementById(t)),e||(e=document.querySelector("."+t)),e}return t}static isIntercepted(t,e){return!(t.y>=e.y+e.h||t.y+t.h<=e.y||t.x+t.w<=e.x||t.x>=e.x+e.w)}static isTouching(t,e){return i.isIntercepted(t,{x:e.x-.5,y:e.y-.5,w:e.w+1,h:e.h+1})}static areaIntercept(t,e){let i=t.x>e.x?t.x:e.x,n=t.x+t.w<e.x+e.w?t.x+t.w:e.x+e.w;if(n<=i)return 0;let r=t.y>e.y?t.y:e.y,o=t.y+t.h<e.y+e.h?t.y+t.h:e.y+e.h;return o<=r?0:(n-i)*(o-r)}static area(t){return t.w*t.h}static sort(t,e,i){return i=i||t.reduce(((t,e)=>Math.max(e.x+e.w,t)),0)||12,-1===e?t.sort(((t,e)=>e.x+e.y*i-(t.x+t.y*i))):t.sort(((t,e)=>t.x+t.y*i-(e.x+e.y*i)))}static createStylesheet(t,e,i){let n=document.createElement("style");const r=null==i?void 0:i.nonce;return r&&(n.nonce=r),n.setAttribute("type","text/css"),n.setAttribute("gs-style-id",t),n.styleSheet?n.styleSheet.cssText="":n.appendChild(document.createTextNode("")),e?e.insertBefore(n,e.firstChild):(e=document.getElementsByTagName("head")[0]).appendChild(n),n.sheet}static removeStylesheet(t){let e=document.querySelector("STYLE[gs-style-id="+t+"]");e&&e.parentNode&&e.remove()}static addCSSRule(t,e,i){"function"==typeof t.addRule?t.addRule(e,i):"function"==typeof t.insertRule&&t.insertRule(`${e}{${i}}`)}static toBool(t){return"boolean"==typeof t?t:"string"==typeof t?!(""===(t=t.toLowerCase())||"no"===t||"false"===t||"0"===t):Boolean(t)}static toNumber(t){return null===t||0===t.length?void 0:Number(t)}static parseHeight(t){let e,i="px";if("string"==typeof t){let n=t.match(/^(-[0-9]+\.[0-9]+|[0-9]*\.[0-9]+|-[0-9]+|[0-9]+)(px|em|rem|vh|vw|%)?$/);if(!n)throw new Error("Invalid height");i=n[2]||"px",e=parseFloat(n[1])}else e=t;return{h:e,unit:i}}static defaults(t,...e){return e.forEach((e=>{for(const i in e){if(!e.hasOwnProperty(i))return;null===t[i]||void 0===t[i]?t[i]=e[i]:"object"==typeof e[i]&&"object"==typeof t[i]&&this.defaults(t[i],e[i])}})),t}static same(t,e){if("object"!=typeof t)return t==e;if(typeof t!=typeof e)return!1;if(Object.keys(t).length!==Object.keys(e).length)return!1;for(const i in t)if(t[i]!==e[i])return!1;return!0}static copyPos(t,e,i=!1){return t.x=e.x,t.y=e.y,t.w=e.w,t.h=e.h,i&&(e.minW&&(t.minW=e.minW),e.minH&&(t.minH=e.minH),e.maxW&&(t.maxW=e.maxW),e.maxH&&(t.maxH=e.maxH)),t}static samePos(t,e){return t&&e&&t.x===e.x&&t.y===e.y&&t.w===e.w&&t.h===e.h}static removeInternalAndSame(t,e){if("object"==typeof t&&"object"==typeof e)for(let i in t){let n=t[i];if("_"===i[0]||n===e[i])delete t[i];else if(n&&"object"==typeof n&&void 0!==e[i]){for(let t in n)n[t]!==e[i][t]&&"_"!==t[0]||delete n[t];Object.keys(n).length||delete t[i]}}}static removeInternalForSave(t,e=!0){for(let e in t)"_"!==e[0]&&null!==t[e]&&void 0!==t[e]||delete t[e];delete t.grid,e&&delete t.el,t.autoPosition||delete t.autoPosition,t.noResize||delete t.noResize,t.noMove||delete t.noMove,t.locked||delete t.locked,1!==t.w&&t.w!==t.minW||delete t.w,1!==t.h&&t.h!==t.minH||delete t.h}static closestUpByClass(t,e){for(;t;){if(t.classList.contains(e))return t;t=t.parentElement}return null}static throttle(t,e){let i=!1;return(...n)=>{i||(i=!0,setTimeout((()=>{t(...n),i=!1}),e))}}static removePositioningStyles(t){let e=t.style;e.position&&e.removeProperty("position"),e.left&&e.removeProperty("left"),e.top&&e.removeProperty("top"),e.width&&e.removeProperty("width"),e.height&&e.removeProperty("height")}static getScrollElement(t){if(!t)return document.scrollingElement||document.documentElement;const e=getComputedStyle(t);return/(auto|scroll)/.test(e.overflow+e.overflowY)?t:this.getScrollElement(t.parentElement)}static updateScrollPosition(t,e,i){let n=t.getBoundingClientRect(),r=window.innerHeight||document.documentElement.clientHeight;if(n.top<0||n.bottom>r){let o=n.bottom-r,s=n.top,a=this.getScrollElement(t);if(null!==a){let l=a.scrollTop;n.top<0&&i<0?t.offsetHeight>r?a.scrollTop+=i:a.scrollTop+=Math.abs(s)>Math.abs(i)?i:s:i>0&&(t.offsetHeight>r?a.scrollTop+=i:a.scrollTop+=o>i?i:o),e.top+=a.scrollTop-l}}}static updateScrollResize(t,e,i){const n=this.getScrollElement(e),r=n.clientHeight,o=n===this.getScrollElement()?0:n.getBoundingClientRect().top,s=t.clientY-o,a=s>r-i;s<i?n.scrollBy({behavior:"smooth",top:s-i}):a&&n.scrollBy({behavior:"smooth",top:i-(r-s)})}static clone(t){return null==t||"object"!=typeof t?t:t instanceof Array?[...t]:Object.assign({},t)}static cloneDeep(t){const e=["parentGrid","el","grid","subGrid","engine"],n=i.clone(t);for(const r in n)n.hasOwnProperty(r)&&"object"==typeof n[r]&&"__"!==r.substring(0,2)&&!e.find((t=>t===r))&&(n[r]=i.cloneDeep(t[r]));return n}static cloneNode(t){const e=t.cloneNode(!0);return e.removeAttribute("id"),e}static appendTo(t,e){let i;i="string"==typeof e?document.querySelector(e):e,i&&i.appendChild(t)}static addElStyles(t,e){if(e instanceof Object)for(const i in e)e.hasOwnProperty(i)&&(Array.isArray(e[i])?e[i].forEach((e=>{t.style[i]=e})):t.style[i]=e[i])}static initEvent(t,e){const i={type:e.type},n={button:0,which:0,buttons:1,bubbles:!0,cancelable:!0,target:e.target?e.target:t.target};return t.dataTransfer&&(i.dataTransfer=t.dataTransfer),["altKey","ctrlKey","metaKey","shiftKey"].forEach((e=>i[e]=t[e])),["pageX","pageY","clientX","clientY","screenX","screenY"].forEach((e=>i[e]=t[e])),Object.assign(Object.assign({},i),n)}static simulateMouseEvent(t,e,i){const n=document.createEvent("MouseEvents");n.initMouseEvent(e,!0,!0,window,1,t.screenX,t.screenY,t.clientX,t.clientY,t.ctrlKey,t.altKey,t.shiftKey,t.metaKey,0,t.target),(i||t.target).dispatchEvent(n)}}e.Utils=i},379:t=>{"use strict";var e=[];function i(t){for(var i=-1,n=0;n<e.length;n++)if(e[n].identifier===t){i=n;break}return i}function n(t,n){for(var o={},s=[],a=0;a<t.length;a++){var l=t[a],c=n.base?l[0]+n.base:l[0],h=o[c]||0,u="".concat(c," ").concat(h);o[c]=h+1;var d=i(u),f={css:l[1],media:l[2],sourceMap:l[3],supports:l[4],layer:l[5]};if(-1!==d)e[d].references++,e[d].updater(f);else{var p=r(f,n);n.byIndex=a,e.splice(a,0,{identifier:u,updater:p,references:1})}s.push(u)}return s}function r(t,e){var i=e.domAPI(e);return i.update(t),function(e){if(e){if(e.css===t.css&&e.media===t.media&&e.sourceMap===t.sourceMap&&e.supports===t.supports&&e.layer===t.layer)return;i.update(t=e)}else i.remove()}}t.exports=function(t,r){var o=n(t=t||[],r=r||{});return function(t){t=t||[];for(var s=0;s<o.length;s++){var a=i(o[s]);e[a].references--}for(var l=n(t,r),c=0;c<o.length;c++){var h=i(o[c]);0===e[h].references&&(e[h].updater(),e.splice(h,1))}o=l}}},569:t=>{"use strict";var e={};t.exports=function(t,i){var n=function(t){if(void 0===e[t]){var i=document.querySelector(t);if(window.HTMLIFrameElement&&i instanceof window.HTMLIFrameElement)try{i=i.contentDocument.head}catch(t){i=null}e[t]=i}return e[t]}(t);if(!n)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");n.appendChild(i)}},216:t=>{"use strict";t.exports=function(t){var e=document.createElement("style");return t.setAttributes(e,t.attributes),t.insert(e,t.options),e}},565:(t,e,i)=>{"use strict";t.exports=function(t){var e=i.nc;e&&t.setAttribute("nonce",e)}},795:t=>{"use strict";t.exports=function(t){if("undefined"==typeof document)return{update:function(){},remove:function(){}};var e=t.insertStyleElement(t);return{update:function(i){!function(t,e,i){var n="";i.supports&&(n+="@supports (".concat(i.supports,") {")),i.media&&(n+="@media ".concat(i.media," {"));var r=void 0!==i.layer;r&&(n+="@layer".concat(i.layer.length>0?" ".concat(i.layer):""," {")),n+=i.css,r&&(n+="}"),i.media&&(n+="}"),i.supports&&(n+="}");var o=i.sourceMap;o&&"undefined"!=typeof btoa&&(n+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(o))))," */")),e.styleTagTransform(n,t,e.options)}(e,t,i)},remove:function(){!function(t){if(null===t.parentNode)return!1;t.parentNode.removeChild(t)}(e)}}}},589:t=>{"use strict";t.exports=function(t,e){if(e.styleSheet)e.styleSheet.cssText=t;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(t))}}},810:t=>{"use strict";t.exports="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMTYuMC4wLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgLS0+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4PSIwcHgiIHk9IjBweCIgd2lkdGg9IjE2cHgiIGhlaWdodD0iMTZweCIgdmlld0JveD0iMCAwIDUxMS42MjYgNTExLjYyNyIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNTExLjYyNiA1MTEuNjI3OyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxnPgoJPHBhdGggZD0iTTMyOC45MDYsNDAxLjk5NGgtMzYuNTUzVjEwOS42MzZoMzYuNTUzYzQuOTQ4LDAsOS4yMzYtMS44MDksMTIuODQ3LTUuNDI2YzMuNjEzLTMuNjE1LDUuNDIxLTcuODk4LDUuNDIxLTEyLjg0NSAgIGMwLTQuOTQ5LTEuODAxLTkuMjMxLTUuNDI4LTEyLjg1MWwtNzMuMDg3LTczLjA5QzI2NS4wNDQsMS44MDksMjYwLjc2LDAsMjU1LjgxMywwYy00Ljk0OCwwLTkuMjI5LDEuODA5LTEyLjg0Nyw1LjQyNCAgIGwtNzMuMDg4LDczLjA5Yy0zLjYxOCwzLjYxOS01LjQyNCw3LjkwMi01LjQyNCwxMi44NTFjMCw0Ljk0NiwxLjgwNyw5LjIyOSw1LjQyNCwxMi44NDVjMy42MTksMy42MTcsNy45MDEsNS40MjYsMTIuODUsNS40MjYgICBoMzYuNTQ1djI5Mi4zNThoLTM2LjU0MmMtNC45NTIsMC05LjIzNSwxLjgwOC0xMi44NSw1LjQyMWMtMy42MTcsMy42MjEtNS40MjQsNy45MDUtNS40MjQsMTIuODU0ICAgYzAsNC45NDUsMS44MDcsOS4yMjcsNS40MjQsMTIuODQ3bDczLjA4OSw3My4wODhjMy42MTcsMy42MTcsNy44OTgsNS40MjQsMTIuODQ3LDUuNDI0YzQuOTUsMCw5LjIzNC0xLjgwNywxMi44NDktNS40MjQgICBsNzMuMDg3LTczLjA4OGMzLjYxMy0zLjYyLDUuNDIxLTcuOTAxLDUuNDIxLTEyLjg0N2MwLTQuOTQ4LTEuODA4LTkuMjMyLTUuNDIxLTEyLjg1NCAgIEMzMzguMTQyLDQwMy44MDIsMzMzLjg1Nyw0MDEuOTk0LDMyOC45MDYsNDAxLjk5NHoiIGZpbGw9IiM2NjY2NjYiLz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8L3N2Zz4K"}},e={};function i(n){var r=e[n];if(void 0!==r)return r.exports;var o=e[n]={id:n,exports:{}};return t[n].call(o.exports,o,o.exports,i),o.exports}i.m=t,i.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return i.d(e,{a:e}),e},i.d=(t,e)=>{for(var n in e)i.o(e,n)&&!i.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},i.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),i.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},i.b=document.baseURI||self.location.href,i.nc=void 0;var n={};return(()=>{"use strict";i.r(n),i.d(n,{AreaChartWidget:()=>Ja,BarChartWidget:()=>Fa,BaseChartWidget:()=>Ea,BoxPlotWidget:()=>vm,ChartJSWidget:()=>Bg,GridWidget:()=>Sm,GroupedBarChartWidget:()=>ml,HeatMapWidget:()=>Xg,LineChartWidget:()=>La,PieChartWidget:()=>Ga,SimpleGroupedBarChartWidget:()=>El,StackedBarChartWidget:()=>hl,TextAreaElement:()=>am,TextElement:()=>im,getResult:()=>D,initGrid:()=>A,polarisDashboard:()=>v});var t=i(379),e=i.n(t),r=i(795),o=i.n(r),s=i(569),a=i.n(s),l=i(565),c=i.n(l),h=i(216),u=i.n(h),d=i(589),f=i.n(d),p=i(466),g={};g.styleTagTransform=f(),g.setAttributes=c(),g.insert=a().bind(null,"head"),g.domAPI=o(),g.insertStyleElement=u(),e()(p.Z,g),p.Z&&p.Z.locals&&p.Z.locals;var m,y=i(437),b=i.n(y);function v(t,e,i){return m=b().IFI.account({name:t,homePage:"https://polaris.io/"+e}),i.grid.on("added",(function(t,e){console.log("addd");var i=b().polaris.completed().actor(m);console.log(i.getStatement())})),i.grid.on("drag",(function(t,e){console.log("drag")})),i.grid.on("resize",(function(t,e){console.log("resize");var i=b().polaris.resized().actor(m);console.log(i.getStatement())})),authority}var x=i(744),_={};_.styleTagTransform=f(),_.setAttributes=c(),_.insert=a().bind(null,"head"),_.domAPI=o(),_.insertStyleElement=u(),e()(x.Z,_),x.Z&&x.Z.locals&&x.Z.locals;var w=i(929);function M(t){return M="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},M(t)}function k(){k=function(){return e};var t,e={},i=Object.prototype,n=i.hasOwnProperty,r=Object.defineProperty||function(t,e,i){t[e]=i.value},o="function"==typeof Symbol?Symbol:{},s=o.iterator||"@@iterator",a=o.asyncIterator||"@@asyncIterator",l=o.toStringTag||"@@toStringTag";function c(t,e,i){return Object.defineProperty(t,e,{value:i,enumerable:!0,configurable:!0,writable:!0}),t[e]}try{c({},"")}catch(t){c=function(t,e,i){return t[e]=i}}function h(t,e,i,n){var o=e&&e.prototype instanceof y?e:y,s=Object.create(o.prototype),a=new A(n||[]);return r(s,"_invoke",{value:E(t,i,a)}),s}function u(t,e,i){try{return{type:"normal",arg:t.call(e,i)}}catch(t){return{type:"throw",arg:t}}}e.wrap=h;var d="suspendedStart",f="suspendedYield",p="executing",g="completed",m={};function y(){}function b(){}function v(){}var x={};c(x,s,(function(){return this}));var _=Object.getPrototypeOf,w=_&&_(_(j([])));w&&w!==i&&n.call(w,s)&&(x=w);var S=v.prototype=y.prototype=Object.create(x);function O(t){["next","throw","return"].forEach((function(e){c(t,e,(function(t){return this._invoke(e,t)}))}))}function D(t,e){function i(r,o,s,a){var l=u(t[r],t,o);if("throw"!==l.type){var c=l.arg,h=c.value;return h&&"object"==M(h)&&n.call(h,"__await")?e.resolve(h.__await).then((function(t){i("next",t,s,a)}),(function(t){i("throw",t,s,a)})):e.resolve(h).then((function(t){c.value=t,s(c)}),(function(t){return i("throw",t,s,a)}))}a(l.arg)}var o;r(this,"_invoke",{value:function(t,n){function r(){return new e((function(e,r){i(t,n,e,r)}))}return o=o?o.then(r,r):r()}})}function E(e,i,n){var r=d;return function(o,s){if(r===p)throw new Error("Generator is already running");if(r===g){if("throw"===o)throw s;return{value:t,done:!0}}for(n.method=o,n.arg=s;;){var a=n.delegate;if(a){var l=P(a,n);if(l){if(l===m)continue;return l}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if(r===d)throw r=g,n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);r=p;var c=u(e,i,n);if("normal"===c.type){if(r=n.done?g:f,c.arg===m)continue;return{value:c.arg,done:n.done}}"throw"===c.type&&(r=g,n.method="throw",n.arg=c.arg)}}}function P(e,i){var n=i.method,r=e.iterator[n];if(r===t)return i.delegate=null,"throw"===n&&e.iterator.return&&(i.method="return",i.arg=t,P(e,i),"throw"===i.method)||"return"!==n&&(i.method="throw",i.arg=new TypeError("The iterator does not provide a '"+n+"' method")),m;var o=u(r,e.iterator,i.arg);if("throw"===o.type)return i.method="throw",i.arg=o.arg,i.delegate=null,m;var s=o.arg;return s?s.done?(i[e.resultName]=s.value,i.next=e.nextLoc,"return"!==i.method&&(i.method="next",i.arg=t),i.delegate=null,m):s:(i.method="throw",i.arg=new TypeError("iterator result is not an object"),i.delegate=null,m)}function T(t){var e={tryLoc:t[0]};1 in t&&(e.catchLoc=t[1]),2 in t&&(e.finallyLoc=t[2],e.afterLoc=t[3]),this.tryEntries.push(e)}function C(t){var e=t.completion||{};e.type="normal",delete e.arg,t.completion=e}function A(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(T,this),this.reset(!0)}function j(e){if(e||""===e){var i=e[s];if(i)return i.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var r=-1,o=function i(){for(;++r<e.length;)if(n.call(e,r))return i.value=e[r],i.done=!1,i;return i.value=t,i.done=!0,i};return o.next=o}}throw new TypeError(M(e)+" is not iterable")}return b.prototype=v,r(S,"constructor",{value:v,configurable:!0}),r(v,"constructor",{value:b,configurable:!0}),b.displayName=c(v,l,"GeneratorFunction"),e.isGeneratorFunction=function(t){var e="function"==typeof t&&t.constructor;return!!e&&(e===b||"GeneratorFunction"===(e.displayName||e.name))},e.mark=function(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,v):(t.__proto__=v,c(t,l,"GeneratorFunction")),t.prototype=Object.create(S),t},e.awrap=function(t){return{__await:t}},O(D.prototype),c(D.prototype,a,(function(){return this})),e.AsyncIterator=D,e.async=function(t,i,n,r,o){void 0===o&&(o=Promise);var s=new D(h(t,i,n,r),o);return e.isGeneratorFunction(i)?s:s.next().then((function(t){return t.done?t.value:s.next()}))},O(S),c(S,l,"Generator"),c(S,s,(function(){return this})),c(S,"toString",(function(){return"[object Generator]"})),e.keys=function(t){var e=Object(t),i=[];for(var n in e)i.push(n);return i.reverse(),function t(){for(;i.length;){var n=i.pop();if(n in e)return t.value=n,t.done=!1,t}return t.done=!0,t}},e.values=j,A.prototype={constructor:A,reset:function(e){if(this.prev=0,this.next=0,this.sent=this._sent=t,this.done=!1,this.delegate=null,this.method="next",this.arg=t,this.tryEntries.forEach(C),!e)for(var i in this)"t"===i.charAt(0)&&n.call(this,i)&&!isNaN(+i.slice(1))&&(this[i]=t)},stop:function(){this.done=!0;var t=this.tryEntries[0].completion;if("throw"===t.type)throw t.arg;return this.rval},dispatchException:function(e){if(this.done)throw e;var i=this;function r(n,r){return a.type="throw",a.arg=e,i.next=n,r&&(i.method="next",i.arg=t),!!r}for(var o=this.tryEntries.length-1;o>=0;--o){var s=this.tryEntries[o],a=s.completion;if("root"===s.tryLoc)return r("end");if(s.tryLoc<=this.prev){var l=n.call(s,"catchLoc"),c=n.call(s,"finallyLoc");if(l&&c){if(this.prev<s.catchLoc)return r(s.catchLoc,!0);if(this.prev<s.finallyLoc)return r(s.finallyLoc)}else if(l){if(this.prev<s.catchLoc)return r(s.catchLoc,!0)}else{if(!c)throw new Error("try statement without catch or finally");if(this.prev<s.finallyLoc)return r(s.finallyLoc)}}}},abrupt:function(t,e){for(var i=this.tryEntries.length-1;i>=0;--i){var r=this.tryEntries[i];if(r.tryLoc<=this.prev&&n.call(r,"finallyLoc")&&this.prev<r.finallyLoc){var o=r;break}}o&&("break"===t||"continue"===t)&&o.tryLoc<=e&&e<=o.finallyLoc&&(o=null);var s=o?o.completion:{};return s.type=t,s.arg=e,o?(this.method="next",this.next=o.finallyLoc,m):this.complete(s)},complete:function(t,e){if("throw"===t.type)throw t.arg;return"break"===t.type||"continue"===t.type?this.next=t.arg:"return"===t.type?(this.rval=this.arg=t.arg,this.method="return",this.next="end"):"normal"===t.type&&e&&(this.next=e),m},finish:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var i=this.tryEntries[e];if(i.finallyLoc===t)return this.complete(i.completion,i.afterLoc),C(i),m}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var i=this.tryEntries[e];if(i.tryLoc===t){var n=i.completion;if("throw"===n.type){var r=n.arg;C(i)}return r}}throw new Error("illegal catch attempt")},delegateYield:function(e,i,n){return this.delegate={iterator:j(e),resultName:i,nextLoc:n},"next"===this.method&&(this.arg=t),m}},e}function S(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,n=new Array(e);i<e;i++)n[i]=t[i];return n}function O(t,e,i,n,r,o,s){try{var a=t[o](s),l=a.value}catch(t){return void i(t)}a.done?e(l):Promise.resolve(l).then(n,r)}function D(t,e){return E.apply(this,arguments)}function E(){var t;return t=k().mark((function t(e,i){var n,r;return k().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,fetch(i,{headers:{Authorization:"Basic ".concat(e)}});case 2:return n=t.sent,t.next=5,n.json();case 5:if(r=t.sent,200===n.status){t.next=8;break}throw Error(r.message);case 8:return t.abrupt("return",r);case 9:case"end":return t.stop()}}),t)})),E=function(){var e=this,i=arguments;return new Promise((function(n,r){var o=t.apply(e,i);function s(t){O(o,n,r,s,a,"next",t)}function a(t){O(o,n,r,s,a,"throw",t)}s(void 0)}))},E.apply(this,arguments)}function P(t,e){var i,n=function(t,e){var i="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!i){if(Array.isArray(t)||(i=function(t,e){if(t){if("string"==typeof t)return S(t,e);var i=Object.prototype.toString.call(t).slice(8,-1);return"Object"===i&&t.constructor&&(i=t.constructor.name),"Map"===i||"Set"===i?Array.from(t):"Arguments"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?S(t,e):void 0}}(t))||e&&t&&"number"==typeof t.length){i&&(t=i);var n=0,r=function(){};return{s:r,n:function(){return n>=t.length?{done:!0}:{done:!1,value:t[n++]}},e:function(t){throw t},f:r}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){i=i.call(t)},n:function(){var t=i.next();return s=t.done,t},e:function(t){a=!0,o=t},f:function(){try{s||null==i.return||i.return()}finally{if(a)throw o}}}}(t);try{for(n.s();!(i=n.n()).done;){var r=i.value;if(r.subGrid)P(r.subGrid.engine.nodes,e);else{var o=e[r.widgetId];if(o)T(r,o);else if(r.el.getAttribute("widgetId")){var s=r.el.getAttribute("widgetId");T(r,e[s])}else console.error("Couldn't find widget by id ".concat(r.widgetId))}}}catch(t){n.e(t)}finally{n.f()}}function T(t,e){var i=t.el.querySelector(".grid-stack-item-content");i.innerHTML="";var n=i.offsetWidth,r=i.offsetHeight,o=e.plot(n,r,i);null!=o&&(i.innerHTML=o)}function C(t){var e=t.srcElement.closest(".newWidget").cloneNode(!0);return e.style.removeProperty("newWidget"),e}function A(t,e){var i=t,n=w.GridStack.init({cellHeight:70,acceptWidgets:!0,removable:".dropzone-remove",minRow:2,subGrid:{disableOneColumnMode:!0,minRow:2,cellHeight:70,margin:5,acceptWidgets:!0,locked:!0,noResize:!0,noMove:!0,removable:".dropzone-remove"},subGridDynamic:!0});function r(){n.enableResize(!0),n.enableMove(!0),n.engine.nodes.map((function(t){t.subGrid&&(t.subGrid.enableResize(!0),t.subGrid.enableMove(!0))}))}function o(){n.enableResize(!1),n.enableMove(!1),n.engine.nodes.map((function(t){t.subGrid&&(t.subGrid.enableResize(!1),t.subGrid.enableMove(!1))}))}return n.load(e),n.setAnimation(!1),function(t){window.addEventListener("resize",(function(e){P(t.engine.nodes,i)}),!0)}(n),P(n.engine.nodes,i),o(),n.engine.nodes.map((function(t){t.subGrid&&t.subGrid.on("resizestop",(function(t,e){P(n.engine.nodes,i)}))})),n.on("removed change",(function(t,e){P(n.engine.nodes,i)})),n.on("added",(function(t,e){P(n.engine.nodes,i)})),{grid:n,toggleSidebar:function(){var t=document.getElementById("sidebar");"sidebar"===t.className?(o(),t.className="sidebar-hidden",function(t){for(;t.firstChild;)t.removeChild(t.firstChild)}(document.getElementById("available-widgets")),P(n.engine.nodes,i)):(t.className="sidebar",function(t){for(var e=document.getElementById("available-widgets"),i=0,n=Object.keys(t);i<n.length;i++){var r=n[i],o=document.createElement("div");e.appendChild(o,r),o.innerHTML='<div class="newWidget grid-stack-item" widgetId="'.concat(r,'"><div class="grid-stack-item-content"></div></div>'),s=t[r],a=void 0,l=void 0,a=o.querySelector(".grid-stack-item-content"),null!=(l=s.plot(400,400,a))&&(a.innerHTML=l)}var s,a,l}(i),w.GridStack.setupDragIn(".newWidget",{revert:"invalid",scroll:!1,appendTo:"body",helper:C}),r(),P(n.engine.nodes,i))},save:function(){return n.save().map((function(t){return t.subGrid?{x:t.x,y:t.y,w:t.w,h:t.h,subGrid:{x:t.subGrid.x,y:t.subGrid.y,w:t.subGrid.w,h:t.subGrid.h,children:t.subGrid.children.map((function(t){return{x:t.x,y:t.y,w:t.w,h:t.h,widgetId:t.widgetId}}))}}:{x:t.x,y:t.y,w:t.w,h:t.h,widgetId:t.widgetId}}))},load:function(t){n.removeAll(),n.load(t),P(n.engine.nodes,i),o()},enableWidgetMoveAndResize:r,disableWidgetMoveAndResize:o,refreshWidgets:function(t){i=t,P(n.engine.nodes,i)}}}function j(t,e){let i,n;if(void 0===e)for(const e of t)null!=e&&(void 0===i?e>=e&&(i=n=e):(i>e&&(i=e),n<e&&(n=e)));else{let r=-1;for(let o of t)null!=(o=e(o,++r,t))&&(void 0===i?o>=o&&(i=n=o):(i>o&&(i=o),n<o&&(n=o)))}return[i,n]}function R(t,e){let i;if(void 0===e)for(const e of t)null!=e&&(i<e||void 0===i&&e>=e)&&(i=e);else{let n=-1;for(let r of t)null!=(r=e(r,++n,t))&&(i<r||void 0===i&&r>=r)&&(i=r)}return i}function L(t,e,i){t=+t,e=+e,i=(r=arguments.length)<2?(e=t,t=0,1):r<3?1:+i;for(var n=-1,r=0|Math.max(0,Math.ceil((e-t)/i)),o=new Array(r);++n<r;)o[n]=t+n*i;return o}function z(t,e){if("function"!=typeof t[Symbol.iterator])throw new TypeError("values is not iterable");if("function"!=typeof e)throw new TypeError("mapper is not a function");return Array.from(t,((i,n)=>e(i,n,t)))}class N extends Map{constructor(t,e=B){if(super(),Object.defineProperties(this,{_intern:{value:new Map},_key:{value:e}}),null!=t)for(const[e,i]of t)this.set(e,i)}get(t){return super.get(H(this,t))}has(t){return super.has(H(this,t))}set(t,e){return super.set(U(this,t),e)}delete(t){return super.delete(F(this,t))}}class I extends Set{constructor(t,e=B){if(super(),Object.defineProperties(this,{_intern:{value:new Map},_key:{value:e}}),null!=t)for(const e of t)this.add(e)}has(t){return super.has(H(this,t))}add(t){return super.add(U(this,t))}delete(t){return super.delete(F(this,t))}}function H({_intern:t,_key:e},i){const n=e(i);return t.has(n)?t.get(n):i}function U({_intern:t,_key:e},i){const n=e(i);return t.has(n)?t.get(n):(t.set(n,i),i)}function F({_intern:t,_key:e},i){const n=e(i);return t.has(n)&&(i=t.get(n),t.delete(n)),i}function B(t){return null!==t&&"object"==typeof t?t.valueOf():t}function W(t){return t}var $=1,V=2,Y=3,G=4,X=1e-6;function q(t){return"translate("+t+",0)"}function Z(t){return"translate(0,"+t+")"}function K(t){return e=>+t(e)}function Q(t,e){return e=Math.max(0,t.bandwidth()-2*e)/2,t.round()&&(e=Math.round(e)),i=>+t(i)+e}function J(){return!this.__axis}function tt(t,e){var i=[],n=null,r=null,o=6,s=6,a=3,l="undefined"!=typeof window&&window.devicePixelRatio>1?0:.5,c=t===$||t===G?-1:1,h=t===G||t===V?"x":"y",u=t===$||t===Y?q:Z;function d(d){var f=null==n?e.ticks?e.ticks.apply(e,i):e.domain():n,p=null==r?e.tickFormat?e.tickFormat.apply(e,i):W:r,g=Math.max(o,0)+a,m=e.range(),y=+m[0]+l,b=+m[m.length-1]+l,v=(e.bandwidth?Q:K)(e.copy(),l),x=d.selection?d.selection():d,_=x.selectAll(".domain").data([null]),w=x.selectAll(".tick").data(f,e).order(),M=w.exit(),k=w.enter().append("g").attr("class","tick"),S=w.select("line"),O=w.select("text");_=_.merge(_.enter().insert("path",".tick").attr("class","domain").attr("stroke","currentColor")),w=w.merge(k),S=S.merge(k.append("line").attr("stroke","currentColor").attr(h+"2",c*o)),O=O.merge(k.append("text").attr("fill","currentColor").attr(h,c*g).attr("dy",t===$?"0em":t===Y?"0.71em":"0.32em")),d!==x&&(_=_.transition(d),w=w.transition(d),S=S.transition(d),O=O.transition(d),M=M.transition(d).attr("opacity",X).attr("transform",(function(t){return isFinite(t=v(t))?u(t+l):this.getAttribute("transform")})),k.attr("opacity",X).attr("transform",(function(t){var e=this.parentNode.__axis;return u((e&&isFinite(e=e(t))?e:v(t))+l)}))),M.remove(),_.attr("d",t===G||t===V?s?"M"+c*s+","+y+"H"+l+"V"+b+"H"+c*s:"M"+l+","+y+"V"+b:s?"M"+y+","+c*s+"V"+l+"H"+b+"V"+c*s:"M"+y+","+l+"H"+b),w.attr("opacity",1).attr("transform",(function(t){return u(v(t)+l)})),S.attr(h+"2",c*o),O.attr(h,c*g).text(p),x.filter(J).attr("fill","none").attr("font-size",10).attr("font-family","sans-serif").attr("text-anchor",t===V?"start":t===G?"end":"middle"),x.each((function(){this.__axis=v}))}return d.scale=function(t){return arguments.length?(e=t,d):e},d.ticks=function(){return i=Array.from(arguments),d},d.tickArguments=function(t){return arguments.length?(i=null==t?[]:Array.from(t),d):i.slice()},d.tickValues=function(t){return arguments.length?(n=null==t?null:Array.from(t),d):n&&n.slice()},d.tickFormat=function(t){return arguments.length?(r=t,d):r},d.tickSize=function(t){return arguments.length?(o=s=+t,d):o},d.tickSizeInner=function(t){return arguments.length?(o=+t,d):o},d.tickSizeOuter=function(t){return arguments.length?(s=+t,d):s},d.tickPadding=function(t){return arguments.length?(a=+t,d):a},d.offset=function(t){return arguments.length?(l=+t,d):l},d}function et(t){return tt(Y,t)}function it(t){return tt(G,t)}function nt(){}function rt(t){return null==t?nt:function(){return this.querySelector(t)}}function ot(){return[]}function st(t){return null==t?ot:function(){return this.querySelectorAll(t)}}function at(t){return function(){return this.matches(t)}}function lt(t){return function(e){return e.matches(t)}}var ct=Array.prototype.find;function ht(){return this.firstElementChild}var ut=Array.prototype.filter;function dt(){return Array.from(this.children)}function ft(t){return new Array(t.length)}function pt(t,e){this.ownerDocument=t.ownerDocument,this.namespaceURI=t.namespaceURI,this._next=null,this._parent=t,this.__data__=e}function gt(t,e,i,n,r,o){for(var s,a=0,l=e.length,c=o.length;a<c;++a)(s=e[a])?(s.__data__=o[a],n[a]=s):i[a]=new pt(t,o[a]);for(;a<l;++a)(s=e[a])&&(r[a]=s)}function mt(t,e,i,n,r,o,s){var a,l,c,h=new Map,u=e.length,d=o.length,f=new Array(u);for(a=0;a<u;++a)(l=e[a])&&(f[a]=c=s.call(l,l.__data__,a,e)+"",h.has(c)?r[a]=l:h.set(c,l));for(a=0;a<d;++a)c=s.call(t,o[a],a,o)+"",(l=h.get(c))?(n[a]=l,l.__data__=o[a],h.delete(c)):i[a]=new pt(t,o[a]);for(a=0;a<u;++a)(l=e[a])&&h.get(f[a])===l&&(r[a]=l)}function yt(t){return t.__data__}function bt(t){return"object"==typeof t&&"length"in t?t:Array.from(t)}function vt(t,e){return t<e?-1:t>e?1:t>=e?0:NaN}pt.prototype={constructor:pt,appendChild:function(t){return this._parent.insertBefore(t,this._next)},insertBefore:function(t,e){return this._parent.insertBefore(t,e)},querySelector:function(t){return this._parent.querySelector(t)},querySelectorAll:function(t){return this._parent.querySelectorAll(t)}};var xt="http://www.w3.org/1999/xhtml";const _t={svg:"http://www.w3.org/2000/svg",xhtml:xt,xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};function wt(t){var e=t+="",i=e.indexOf(":");return i>=0&&"xmlns"!==(e=t.slice(0,i))&&(t=t.slice(i+1)),_t.hasOwnProperty(e)?{space:_t[e],local:t}:t}function Mt(t){return function(){this.removeAttribute(t)}}function kt(t){return function(){this.removeAttributeNS(t.space,t.local)}}function St(t,e){return function(){this.setAttribute(t,e)}}function Ot(t,e){return function(){this.setAttributeNS(t.space,t.local,e)}}function Dt(t,e){return function(){var i=e.apply(this,arguments);null==i?this.removeAttribute(t):this.setAttribute(t,i)}}function Et(t,e){return function(){var i=e.apply(this,arguments);null==i?this.removeAttributeNS(t.space,t.local):this.setAttributeNS(t.space,t.local,i)}}function Pt(t){return t.ownerDocument&&t.ownerDocument.defaultView||t.document&&t||t.defaultView}function Tt(t){return function(){this.style.removeProperty(t)}}function Ct(t,e,i){return function(){this.style.setProperty(t,e,i)}}function At(t,e,i){return function(){var n=e.apply(this,arguments);null==n?this.style.removeProperty(t):this.style.setProperty(t,n,i)}}function jt(t,e){return t.style.getPropertyValue(e)||Pt(t).getComputedStyle(t,null).getPropertyValue(e)}function Rt(t){return function(){delete this[t]}}function Lt(t,e){return function(){this[t]=e}}function zt(t,e){return function(){var i=e.apply(this,arguments);null==i?delete this[t]:this[t]=i}}function Nt(t){return t.trim().split(/^|\s+/)}function It(t){return t.classList||new Ht(t)}function Ht(t){this._node=t,this._names=Nt(t.getAttribute("class")||"")}function Ut(t,e){for(var i=It(t),n=-1,r=e.length;++n<r;)i.add(e[n])}function Ft(t,e){for(var i=It(t),n=-1,r=e.length;++n<r;)i.remove(e[n])}function Bt(t){return function(){Ut(this,t)}}function Wt(t){return function(){Ft(this,t)}}function $t(t,e){return function(){(e.apply(this,arguments)?Ut:Ft)(this,t)}}function Vt(){this.textContent=""}function Yt(t){return function(){this.textContent=t}}function Gt(t){return function(){var e=t.apply(this,arguments);this.textContent=null==e?"":e}}function Xt(){this.innerHTML=""}function qt(t){return function(){this.innerHTML=t}}function Zt(t){return function(){var e=t.apply(this,arguments);this.innerHTML=null==e?"":e}}function Kt(){this.nextSibling&&this.parentNode.appendChild(this)}function Qt(){this.previousSibling&&this.parentNode.insertBefore(this,this.parentNode.firstChild)}function Jt(t){return function(){var e=this.ownerDocument,i=this.namespaceURI;return i===xt&&e.documentElement.namespaceURI===xt?e.createElement(t):e.createElementNS(i,t)}}function te(t){return function(){return this.ownerDocument.createElementNS(t.space,t.local)}}function ee(t){var e=wt(t);return(e.local?te:Jt)(e)}function ie(){return null}function ne(){var t=this.parentNode;t&&t.removeChild(this)}function re(){var t=this.cloneNode(!1),e=this.parentNode;return e?e.insertBefore(t,this.nextSibling):t}function oe(){var t=this.cloneNode(!0),e=this.parentNode;return e?e.insertBefore(t,this.nextSibling):t}function se(t){return function(){var e=this.__on;if(e){for(var i,n=0,r=-1,o=e.length;n<o;++n)i=e[n],t.type&&i.type!==t.type||i.name!==t.name?e[++r]=i:this.removeEventListener(i.type,i.listener,i.options);++r?e.length=r:delete this.__on}}}function ae(t,e,i){return function(){var n,r=this.__on,o=function(t){return function(e){t.call(this,e,this.__data__)}}(e);if(r)for(var s=0,a=r.length;s<a;++s)if((n=r[s]).type===t.type&&n.name===t.name)return this.removeEventListener(n.type,n.listener,n.options),this.addEventListener(n.type,n.listener=o,n.options=i),void(n.value=e);this.addEventListener(t.type,o,i),n={type:t.type,name:t.name,value:e,listener:o,options:i},r?r.push(n):this.__on=[n]}}function le(t,e,i){var n=Pt(t),r=n.CustomEvent;"function"==typeof r?r=new r(e,i):(r=n.document.createEvent("Event"),i?(r.initEvent(e,i.bubbles,i.cancelable),r.detail=i.detail):r.initEvent(e,!1,!1)),t.dispatchEvent(r)}function ce(t,e){return function(){return le(this,t,e)}}function he(t,e){return function(){return le(this,t,e.apply(this,arguments))}}Ht.prototype={add:function(t){this._names.indexOf(t)<0&&(this._names.push(t),this._node.setAttribute("class",this._names.join(" ")))},remove:function(t){var e=this._names.indexOf(t);e>=0&&(this._names.splice(e,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(t){return this._names.indexOf(t)>=0}};var ue=[null];function de(t,e){this._groups=t,this._parents=e}function fe(){return new de([[document.documentElement]],ue)}de.prototype=fe.prototype={constructor:de,select:function(t){"function"!=typeof t&&(t=rt(t));for(var e=this._groups,i=e.length,n=new Array(i),r=0;r<i;++r)for(var o,s,a=e[r],l=a.length,c=n[r]=new Array(l),h=0;h<l;++h)(o=a[h])&&(s=t.call(o,o.__data__,h,a))&&("__data__"in o&&(s.__data__=o.__data__),c[h]=s);return new de(n,this._parents)},selectAll:function(t){t="function"==typeof t?function(t){return function(){return null==(e=t.apply(this,arguments))?[]:Array.isArray(e)?e:Array.from(e);var e}}(t):st(t);for(var e=this._groups,i=e.length,n=[],r=[],o=0;o<i;++o)for(var s,a=e[o],l=a.length,c=0;c<l;++c)(s=a[c])&&(n.push(t.call(s,s.__data__,c,a)),r.push(s));return new de(n,r)},selectChild:function(t){return this.select(null==t?ht:function(t){return function(){return ct.call(this.children,t)}}("function"==typeof t?t:lt(t)))},selectChildren:function(t){return this.selectAll(null==t?dt:function(t){return function(){return ut.call(this.children,t)}}("function"==typeof t?t:lt(t)))},filter:function(t){"function"!=typeof t&&(t=at(t));for(var e=this._groups,i=e.length,n=new Array(i),r=0;r<i;++r)for(var o,s=e[r],a=s.length,l=n[r]=[],c=0;c<a;++c)(o=s[c])&&t.call(o,o.__data__,c,s)&&l.push(o);return new de(n,this._parents)},data:function(t,e){if(!arguments.length)return Array.from(this,yt);var i,n=e?mt:gt,r=this._parents,o=this._groups;"function"!=typeof t&&(i=t,t=function(){return i});for(var s=o.length,a=new Array(s),l=new Array(s),c=new Array(s),h=0;h<s;++h){var u=r[h],d=o[h],f=d.length,p=bt(t.call(u,u&&u.__data__,h,r)),g=p.length,m=l[h]=new Array(g),y=a[h]=new Array(g);n(u,d,m,y,c[h]=new Array(f),p,e);for(var b,v,x=0,_=0;x<g;++x)if(b=m[x]){for(x>=_&&(_=x+1);!(v=y[_])&&++_<g;);b._next=v||null}}return(a=new de(a,r))._enter=l,a._exit=c,a},enter:function(){return new de(this._enter||this._groups.map(ft),this._parents)},exit:function(){return new de(this._exit||this._groups.map(ft),this._parents)},join:function(t,e,i){var n=this.enter(),r=this,o=this.exit();return"function"==typeof t?(n=t(n))&&(n=n.selection()):n=n.append(t+""),null!=e&&(r=e(r))&&(r=r.selection()),null==i?o.remove():i(o),n&&r?n.merge(r).order():r},merge:function(t){for(var e=t.selection?t.selection():t,i=this._groups,n=e._groups,r=i.length,o=n.length,s=Math.min(r,o),a=new Array(r),l=0;l<s;++l)for(var c,h=i[l],u=n[l],d=h.length,f=a[l]=new Array(d),p=0;p<d;++p)(c=h[p]||u[p])&&(f[p]=c);for(;l<r;++l)a[l]=i[l];return new de(a,this._parents)},selection:function(){return this},order:function(){for(var t=this._groups,e=-1,i=t.length;++e<i;)for(var n,r=t[e],o=r.length-1,s=r[o];--o>=0;)(n=r[o])&&(s&&4^n.compareDocumentPosition(s)&&s.parentNode.insertBefore(n,s),s=n);return this},sort:function(t){function e(e,i){return e&&i?t(e.__data__,i.__data__):!e-!i}t||(t=vt);for(var i=this._groups,n=i.length,r=new Array(n),o=0;o<n;++o){for(var s,a=i[o],l=a.length,c=r[o]=new Array(l),h=0;h<l;++h)(s=a[h])&&(c[h]=s);c.sort(e)}return new de(r,this._parents).order()},call:function(){var t=arguments[0];return arguments[0]=this,t.apply(null,arguments),this},nodes:function(){return Array.from(this)},node:function(){for(var t=this._groups,e=0,i=t.length;e<i;++e)for(var n=t[e],r=0,o=n.length;r<o;++r){var s=n[r];if(s)return s}return null},size:function(){let t=0;for(const e of this)++t;return t},empty:function(){return!this.node()},each:function(t){for(var e=this._groups,i=0,n=e.length;i<n;++i)for(var r,o=e[i],s=0,a=o.length;s<a;++s)(r=o[s])&&t.call(r,r.__data__,s,o);return this},attr:function(t,e){var i=wt(t);if(arguments.length<2){var n=this.node();return i.local?n.getAttributeNS(i.space,i.local):n.getAttribute(i)}return this.each((null==e?i.local?kt:Mt:"function"==typeof e?i.local?Et:Dt:i.local?Ot:St)(i,e))},style:function(t,e,i){return arguments.length>1?this.each((null==e?Tt:"function"==typeof e?At:Ct)(t,e,null==i?"":i)):jt(this.node(),t)},property:function(t,e){return arguments.length>1?this.each((null==e?Rt:"function"==typeof e?zt:Lt)(t,e)):this.node()[t]},classed:function(t,e){var i=Nt(t+"");if(arguments.length<2){for(var n=It(this.node()),r=-1,o=i.length;++r<o;)if(!n.contains(i[r]))return!1;return!0}return this.each(("function"==typeof e?$t:e?Bt:Wt)(i,e))},text:function(t){return arguments.length?this.each(null==t?Vt:("function"==typeof t?Gt:Yt)(t)):this.node().textContent},html:function(t){return arguments.length?this.each(null==t?Xt:("function"==typeof t?Zt:qt)(t)):this.node().innerHTML},raise:function(){return this.each(Kt)},lower:function(){return this.each(Qt)},append:function(t){var e="function"==typeof t?t:ee(t);return this.select((function(){return this.appendChild(e.apply(this,arguments))}))},insert:function(t,e){var i="function"==typeof t?t:ee(t),n=null==e?ie:"function"==typeof e?e:rt(e);return this.select((function(){return this.insertBefore(i.apply(this,arguments),n.apply(this,arguments)||null)}))},remove:function(){return this.each(ne)},clone:function(t){return this.select(t?oe:re)},datum:function(t){return arguments.length?this.property("__data__",t):this.node().__data__},on:function(t,e,i){var n,r,o=function(t){return t.trim().split(/^|\s+/).map((function(t){var e="",i=t.indexOf(".");return i>=0&&(e=t.slice(i+1),t=t.slice(0,i)),{type:t,name:e}}))}(t+""),s=o.length;if(!(arguments.length<2)){for(a=e?ae:se,n=0;n<s;++n)this.each(a(o[n],e,i));return this}var a=this.node().__on;if(a)for(var l,c=0,h=a.length;c<h;++c)for(n=0,l=a[c];n<s;++n)if((r=o[n]).type===l.type&&r.name===l.name)return l.value},dispatch:function(t,e){return this.each(("function"==typeof e?he:ce)(t,e))},[Symbol.iterator]:function*(){for(var t=this._groups,e=0,i=t.length;e<i;++e)for(var n,r=t[e],o=0,s=r.length;o<s;++o)(n=r[o])&&(yield n)}};const pe=fe;var ge={value:()=>{}};function me(){for(var t,e=0,i=arguments.length,n={};e<i;++e){if(!(t=arguments[e]+"")||t in n||/[\s.]/.test(t))throw new Error("illegal type: "+t);n[t]=[]}return new ye(n)}function ye(t){this._=t}function be(t,e){for(var i,n=0,r=t.length;n<r;++n)if((i=t[n]).name===e)return i.value}function ve(t,e,i){for(var n=0,r=t.length;n<r;++n)if(t[n].name===e){t[n]=ge,t=t.slice(0,n).concat(t.slice(n+1));break}return null!=i&&t.push({name:e,value:i}),t}ye.prototype=me.prototype={constructor:ye,on:function(t,e){var i,n,r=this._,o=(n=r,(t+"").trim().split(/^|\s+/).map((function(t){var e="",i=t.indexOf(".");if(i>=0&&(e=t.slice(i+1),t=t.slice(0,i)),t&&!n.hasOwnProperty(t))throw new Error("unknown type: "+t);return{type:t,name:e}}))),s=-1,a=o.length;if(!(arguments.length<2)){if(null!=e&&"function"!=typeof e)throw new Error("invalid callback: "+e);for(;++s<a;)if(i=(t=o[s]).type)r[i]=ve(r[i],t.name,e);else if(null==e)for(i in r)r[i]=ve(r[i],t.name,null);return this}for(;++s<a;)if((i=(t=o[s]).type)&&(i=be(r[i],t.name)))return i},copy:function(){var t={},e=this._;for(var i in e)t[i]=e[i].slice();return new ye(t)},call:function(t,e){if((i=arguments.length-2)>0)for(var i,n,r=new Array(i),o=0;o<i;++o)r[o]=arguments[o+2];if(!this._.hasOwnProperty(t))throw new Error("unknown type: "+t);for(o=0,i=(n=this._[t]).length;o<i;++o)n[o].value.apply(e,r)},apply:function(t,e,i){if(!this._.hasOwnProperty(t))throw new Error("unknown type: "+t);for(var n=this._[t],r=0,o=n.length;r<o;++r)n[r].value.apply(e,i)}};const xe=me;var _e,we,Me=0,ke=0,Se=0,Oe=1e3,De=0,Ee=0,Pe=0,Te="object"==typeof performance&&performance.now?performance:Date,Ce="object"==typeof window&&window.requestAnimationFrame?window.requestAnimationFrame.bind(window):function(t){setTimeout(t,17)};function Ae(){return Ee||(Ce(je),Ee=Te.now()+Pe)}function je(){Ee=0}function Re(){this._call=this._time=this._next=null}function Le(t,e,i){var n=new Re;return n.restart(t,e,i),n}function ze(){Ee=(De=Te.now())+Pe,Me=ke=0;try{!function(){Ae(),++Me;for(var t,e=_e;e;)(t=Ee-e._time)>=0&&e._call.call(void 0,t),e=e._next;--Me}()}finally{Me=0,function(){for(var t,e,i=_e,n=1/0;i;)i._call?(n>i._time&&(n=i._time),t=i,i=i._next):(e=i._next,i._next=null,i=t?t._next=e:_e=e);we=t,Ie(n)}(),Ee=0}}function Ne(){var t=Te.now(),e=t-De;e>Oe&&(Pe-=e,De=t)}function Ie(t){Me||(ke&&(ke=clearTimeout(ke)),t-Ee>24?(t<1/0&&(ke=setTimeout(ze,t-Te.now()-Pe)),Se&&(Se=clearInterval(Se))):(Se||(De=Te.now(),Se=setInterval(Ne,Oe)),Me=1,Ce(ze)))}function He(t,e,i){var n=new Re;return e=null==e?0:+e,n.restart((i=>{n.stop(),t(i+e)}),e,i),n}Re.prototype=Le.prototype={constructor:Re,restart:function(t,e,i){if("function"!=typeof t)throw new TypeError("callback is not a function");i=(null==i?Ae():+i)+(null==e?0:+e),this._next||we===this||(we?we._next=this:_e=this,we=this),this._call=t,this._time=i,Ie()},stop:function(){this._call&&(this._call=null,this._time=1/0,Ie())}};var Ue=xe("start","end","cancel","interrupt"),Fe=[],Be=0,We=3;function $e(t,e,i,n,r,o){var s=t.__transition;if(s){if(i in s)return}else t.__transition={};!function(t,e,i){var n,r=t.__transition;function o(l){var c,h,u,d;if(1!==i.state)return a();for(c in r)if((d=r[c]).name===i.name){if(d.state===We)return He(o);4===d.state?(d.state=6,d.timer.stop(),d.on.call("interrupt",t,t.__data__,d.index,d.group),delete r[c]):+c<e&&(d.state=6,d.timer.stop(),d.on.call("cancel",t,t.__data__,d.index,d.group),delete r[c])}if(He((function(){i.state===We&&(i.state=4,i.timer.restart(s,i.delay,i.time),s(l))})),i.state=2,i.on.call("start",t,t.__data__,i.index,i.group),2===i.state){for(i.state=We,n=new Array(u=i.tween.length),c=0,h=-1;c<u;++c)(d=i.tween[c].value.call(t,t.__data__,i.index,i.group))&&(n[++h]=d);n.length=h+1}}function s(e){for(var r=e<i.duration?i.ease.call(null,e/i.duration):(i.timer.restart(a),i.state=5,1),o=-1,s=n.length;++o<s;)n[o].call(t,r);5===i.state&&(i.on.call("end",t,t.__data__,i.index,i.group),a())}function a(){for(var n in i.state=6,i.timer.stop(),delete r[e],r)return;delete t.__transition}r[e]=i,i.timer=Le((function(t){i.state=1,i.timer.restart(o,i.delay,i.time),i.delay<=t&&o(t-i.delay)}),0,i.time)}(t,i,{name:e,index:n,group:r,on:Ue,tween:Fe,time:o.time,delay:o.delay,duration:o.duration,ease:o.ease,timer:null,state:Be})}function Ve(t,e){var i=Ge(t,e);if(i.state>Be)throw new Error("too late; already scheduled");return i}function Ye(t,e){var i=Ge(t,e);if(i.state>We)throw new Error("too late; already running");return i}function Ge(t,e){var i=t.__transition;if(!i||!(i=i[e]))throw new Error("transition not found");return i}function Xe(t,e){return t=+t,e=+e,function(i){return t*(1-i)+e*i}}var qe,Ze=180/Math.PI,Ke={translateX:0,translateY:0,rotate:0,skewX:0,scaleX:1,scaleY:1};function Qe(t,e,i,n,r,o){var s,a,l;return(s=Math.sqrt(t*t+e*e))&&(t/=s,e/=s),(l=t*i+e*n)&&(i-=t*l,n-=e*l),(a=Math.sqrt(i*i+n*n))&&(i/=a,n/=a,l/=a),t*n<e*i&&(t=-t,e=-e,l=-l,s=-s),{translateX:r,translateY:o,rotate:Math.atan2(e,t)*Ze,skewX:Math.atan(l)*Ze,scaleX:s,scaleY:a}}function Je(t,e,i,n){function r(t){return t.length?t.pop()+" ":""}return function(o,s){var a=[],l=[];return o=t(o),s=t(s),function(t,n,r,o,s,a){if(t!==r||n!==o){var l=s.push("translate(",null,e,null,i);a.push({i:l-4,x:Xe(t,r)},{i:l-2,x:Xe(n,o)})}else(r||o)&&s.push("translate("+r+e+o+i)}(o.translateX,o.translateY,s.translateX,s.translateY,a,l),function(t,e,i,o){t!==e?(t-e>180?e+=360:e-t>180&&(t+=360),o.push({i:i.push(r(i)+"rotate(",null,n)-2,x:Xe(t,e)})):e&&i.push(r(i)+"rotate("+e+n)}(o.rotate,s.rotate,a,l),function(t,e,i,o){t!==e?o.push({i:i.push(r(i)+"skewX(",null,n)-2,x:Xe(t,e)}):e&&i.push(r(i)+"skewX("+e+n)}(o.skewX,s.skewX,a,l),function(t,e,i,n,o,s){if(t!==i||e!==n){var a=o.push(r(o)+"scale(",null,",",null,")");s.push({i:a-4,x:Xe(t,i)},{i:a-2,x:Xe(e,n)})}else 1===i&&1===n||o.push(r(o)+"scale("+i+","+n+")")}(o.scaleX,o.scaleY,s.scaleX,s.scaleY,a,l),o=s=null,function(t){for(var e,i=-1,n=l.length;++i<n;)a[(e=l[i]).i]=e.x(t);return a.join("")}}}var ti=Je((function(t){const e=new("function"==typeof DOMMatrix?DOMMatrix:WebKitCSSMatrix)(t+"");return e.isIdentity?Ke:Qe(e.a,e.b,e.c,e.d,e.e,e.f)}),"px, ","px)","deg)"),ei=Je((function(t){return null==t?Ke:(qe||(qe=document.createElementNS("http://www.w3.org/2000/svg","g")),qe.setAttribute("transform",t),(t=qe.transform.baseVal.consolidate())?Qe((t=t.matrix).a,t.b,t.c,t.d,t.e,t.f):Ke)}),", ",")",")");function ii(t,e){var i,n;return function(){var r=Ye(this,t),o=r.tween;if(o!==i)for(var s=0,a=(n=i=o).length;s<a;++s)if(n[s].name===e){(n=n.slice()).splice(s,1);break}r.tween=n}}function ni(t,e,i){var n,r;if("function"!=typeof i)throw new Error;return function(){var o=Ye(this,t),s=o.tween;if(s!==n){r=(n=s).slice();for(var a={name:e,value:i},l=0,c=r.length;l<c;++l)if(r[l].name===e){r[l]=a;break}l===c&&r.push(a)}o.tween=r}}function ri(t,e,i){var n=t._id;return t.each((function(){var t=Ye(this,n);(t.value||(t.value={}))[e]=i.apply(this,arguments)})),function(t){return Ge(t,n).value[e]}}function oi(t,e,i){t.prototype=e.prototype=i,i.constructor=t}function si(t,e){var i=Object.create(t.prototype);for(var n in e)i[n]=e[n];return i}function ai(){}var li=.7,ci=1/li,hi="\\s*([+-]?\\d+)\\s*",ui="\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)\\s*",di="\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)%\\s*",fi=/^#([0-9a-f]{3,8})$/,pi=new RegExp(`^rgb\\(${hi},${hi},${hi}\\)$`),gi=new RegExp(`^rgb\\(${di},${di},${di}\\)$`),mi=new RegExp(`^rgba\\(${hi},${hi},${hi},${ui}\\)$`),yi=new RegExp(`^rgba\\(${di},${di},${di},${ui}\\)$`),bi=new RegExp(`^hsl\\(${ui},${di},${di}\\)$`),vi=new RegExp(`^hsla\\(${ui},${di},${di},${ui}\\)$`),xi={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074};function _i(){return this.rgb().formatHex()}function wi(){return this.rgb().formatRgb()}function Mi(t){var e,i;return t=(t+"").trim().toLowerCase(),(e=fi.exec(t))?(i=e[1].length,e=parseInt(e[1],16),6===i?ki(e):3===i?new Di(e>>8&15|e>>4&240,e>>4&15|240&e,(15&e)<<4|15&e,1):8===i?Si(e>>24&255,e>>16&255,e>>8&255,(255&e)/255):4===i?Si(e>>12&15|e>>8&240,e>>8&15|e>>4&240,e>>4&15|240&e,((15&e)<<4|15&e)/255):null):(e=pi.exec(t))?new Di(e[1],e[2],e[3],1):(e=gi.exec(t))?new Di(255*e[1]/100,255*e[2]/100,255*e[3]/100,1):(e=mi.exec(t))?Si(e[1],e[2],e[3],e[4]):(e=yi.exec(t))?Si(255*e[1]/100,255*e[2]/100,255*e[3]/100,e[4]):(e=bi.exec(t))?ji(e[1],e[2]/100,e[3]/100,1):(e=vi.exec(t))?ji(e[1],e[2]/100,e[3]/100,e[4]):xi.hasOwnProperty(t)?ki(xi[t]):"transparent"===t?new Di(NaN,NaN,NaN,0):null}function ki(t){return new Di(t>>16&255,t>>8&255,255&t,1)}function Si(t,e,i,n){return n<=0&&(t=e=i=NaN),new Di(t,e,i,n)}function Oi(t,e,i,n){return 1===arguments.length?((r=t)instanceof ai||(r=Mi(r)),r?new Di((r=r.rgb()).r,r.g,r.b,r.opacity):new Di):new Di(t,e,i,null==n?1:n);var r}function Di(t,e,i,n){this.r=+t,this.g=+e,this.b=+i,this.opacity=+n}function Ei(){return`#${Ai(this.r)}${Ai(this.g)}${Ai(this.b)}`}function Pi(){const t=Ti(this.opacity);return`${1===t?"rgb(":"rgba("}${Ci(this.r)}, ${Ci(this.g)}, ${Ci(this.b)}${1===t?")":`, ${t})`}`}function Ti(t){return isNaN(t)?1:Math.max(0,Math.min(1,t))}function Ci(t){return Math.max(0,Math.min(255,Math.round(t)||0))}function Ai(t){return((t=Ci(t))<16?"0":"")+t.toString(16)}function ji(t,e,i,n){return n<=0?t=e=i=NaN:i<=0||i>=1?t=e=NaN:e<=0&&(t=NaN),new Li(t,e,i,n)}function Ri(t){if(t instanceof Li)return new Li(t.h,t.s,t.l,t.opacity);if(t instanceof ai||(t=Mi(t)),!t)return new Li;if(t instanceof Li)return t;var e=(t=t.rgb()).r/255,i=t.g/255,n=t.b/255,r=Math.min(e,i,n),o=Math.max(e,i,n),s=NaN,a=o-r,l=(o+r)/2;return a?(s=e===o?(i-n)/a+6*(i<n):i===o?(n-e)/a+2:(e-i)/a+4,a/=l<.5?o+r:2-o-r,s*=60):a=l>0&&l<1?0:s,new Li(s,a,l,t.opacity)}function Li(t,e,i,n){this.h=+t,this.s=+e,this.l=+i,this.opacity=+n}function zi(t){return(t=(t||0)%360)<0?t+360:t}function Ni(t){return Math.max(0,Math.min(1,t||0))}function Ii(t,e,i){return 255*(t<60?e+(i-e)*t/60:t<180?i:t<240?e+(i-e)*(240-t)/60:e)}function Hi(t,e,i,n,r){var o=t*t,s=o*t;return((1-3*t+3*o-s)*e+(4-6*o+3*s)*i+(1+3*t+3*o-3*s)*n+s*r)/6}oi(ai,Mi,{copy(t){return Object.assign(new this.constructor,this,t)},displayable(){return this.rgb().displayable()},hex:_i,formatHex:_i,formatHex8:function(){return this.rgb().formatHex8()},formatHsl:function(){return Ri(this).formatHsl()},formatRgb:wi,toString:wi}),oi(Di,Oi,si(ai,{brighter(t){return t=null==t?ci:Math.pow(ci,t),new Di(this.r*t,this.g*t,this.b*t,this.opacity)},darker(t){return t=null==t?li:Math.pow(li,t),new Di(this.r*t,this.g*t,this.b*t,this.opacity)},rgb(){return this},clamp(){return new Di(Ci(this.r),Ci(this.g),Ci(this.b),Ti(this.opacity))},displayable(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:Ei,formatHex:Ei,formatHex8:function(){return`#${Ai(this.r)}${Ai(this.g)}${Ai(this.b)}${Ai(255*(isNaN(this.opacity)?1:this.opacity))}`},formatRgb:Pi,toString:Pi})),oi(Li,(function(t,e,i,n){return 1===arguments.length?Ri(t):new Li(t,e,i,null==n?1:n)}),si(ai,{brighter(t){return t=null==t?ci:Math.pow(ci,t),new Li(this.h,this.s,this.l*t,this.opacity)},darker(t){return t=null==t?li:Math.pow(li,t),new Li(this.h,this.s,this.l*t,this.opacity)},rgb(){var t=this.h%360+360*(this.h<0),e=isNaN(t)||isNaN(this.s)?0:this.s,i=this.l,n=i+(i<.5?i:1-i)*e,r=2*i-n;return new Di(Ii(t>=240?t-240:t+120,r,n),Ii(t,r,n),Ii(t<120?t+240:t-120,r,n),this.opacity)},clamp(){return new Li(zi(this.h),Ni(this.s),Ni(this.l),Ti(this.opacity))},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl(){const t=Ti(this.opacity);return`${1===t?"hsl(":"hsla("}${zi(this.h)}, ${100*Ni(this.s)}%, ${100*Ni(this.l)}%${1===t?")":`, ${t})`}`}}));const Ui=t=>()=>t;function Fi(t,e){var i=e-t;return i?function(t,e){return function(i){return t+i*e}}(t,i):Ui(isNaN(t)?e:t)}const Bi=function t(e){var i=function(t){return 1==(t=+t)?Fi:function(e,i){return i-e?function(t,e,i){return t=Math.pow(t,i),e=Math.pow(e,i)-t,i=1/i,function(n){return Math.pow(t+n*e,i)}}(e,i,t):Ui(isNaN(e)?i:e)}}(e);function n(t,e){var n=i((t=Oi(t)).r,(e=Oi(e)).r),r=i(t.g,e.g),o=i(t.b,e.b),s=Fi(t.opacity,e.opacity);return function(e){return t.r=n(e),t.g=r(e),t.b=o(e),t.opacity=s(e),t+""}}return n.gamma=t,n}(1);function Wi(t){return function(e){var i,n,r=e.length,o=new Array(r),s=new Array(r),a=new Array(r);for(i=0;i<r;++i)n=Oi(e[i]),o[i]=n.r||0,s[i]=n.g||0,a[i]=n.b||0;return o=t(o),s=t(s),a=t(a),n.opacity=1,function(t){return n.r=o(t),n.g=s(t),n.b=a(t),n+""}}}var $i=Wi((function(t){var e=t.length-1;return function(i){var n=i<=0?i=0:i>=1?(i=1,e-1):Math.floor(i*e),r=t[n],o=t[n+1],s=n>0?t[n-1]:2*r-o,a=n<e-1?t[n+2]:2*o-r;return Hi((i-n/e)*e,s,r,o,a)}})),Vi=(Wi((function(t){var e=t.length;return function(i){var n=Math.floor(((i%=1)<0?++i:i)*e),r=t[(n+e-1)%e],o=t[n%e],s=t[(n+1)%e],a=t[(n+2)%e];return Hi((i-n/e)*e,r,o,s,a)}})),/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g),Yi=new RegExp(Vi.source,"g");function Gi(t,e){var i,n,r,o=Vi.lastIndex=Yi.lastIndex=0,s=-1,a=[],l=[];for(t+="",e+="";(i=Vi.exec(t))&&(n=Yi.exec(e));)(r=n.index)>o&&(r=e.slice(o,r),a[s]?a[s]+=r:a[++s]=r),(i=i[0])===(n=n[0])?a[s]?a[s]+=n:a[++s]=n:(a[++s]=null,l.push({i:s,x:Xe(i,n)})),o=Yi.lastIndex;return o<e.length&&(r=e.slice(o),a[s]?a[s]+=r:a[++s]=r),a.length<2?l[0]?function(t){return function(e){return t(e)+""}}(l[0].x):function(t){return function(){return t}}(e):(e=l.length,function(t){for(var i,n=0;n<e;++n)a[(i=l[n]).i]=i.x(t);return a.join("")})}function Xi(t,e){var i;return("number"==typeof e?Xe:e instanceof Mi?Bi:(i=Mi(e))?(e=i,Bi):Gi)(t,e)}function qi(t){return function(){this.removeAttribute(t)}}function Zi(t){return function(){this.removeAttributeNS(t.space,t.local)}}function Ki(t,e,i){var n,r,o=i+"";return function(){var s=this.getAttribute(t);return s===o?null:s===n?r:r=e(n=s,i)}}function Qi(t,e,i){var n,r,o=i+"";return function(){var s=this.getAttributeNS(t.space,t.local);return s===o?null:s===n?r:r=e(n=s,i)}}function Ji(t,e,i){var n,r,o;return function(){var s,a,l=i(this);if(null!=l)return(s=this.getAttribute(t))===(a=l+"")?null:s===n&&a===r?o:(r=a,o=e(n=s,l));this.removeAttribute(t)}}function tn(t,e,i){var n,r,o;return function(){var s,a,l=i(this);if(null!=l)return(s=this.getAttributeNS(t.space,t.local))===(a=l+"")?null:s===n&&a===r?o:(r=a,o=e(n=s,l));this.removeAttributeNS(t.space,t.local)}}function en(t,e){var i,n;function r(){var r=e.apply(this,arguments);return r!==n&&(i=(n=r)&&function(t,e){return function(i){this.setAttributeNS(t.space,t.local,e.call(this,i))}}(t,r)),i}return r._value=e,r}function nn(t,e){var i,n;function r(){var r=e.apply(this,arguments);return r!==n&&(i=(n=r)&&function(t,e){return function(i){this.setAttribute(t,e.call(this,i))}}(t,r)),i}return r._value=e,r}function rn(t,e){return function(){Ve(this,t).delay=+e.apply(this,arguments)}}function on(t,e){return e=+e,function(){Ve(this,t).delay=e}}function sn(t,e){return function(){Ye(this,t).duration=+e.apply(this,arguments)}}function an(t,e){return e=+e,function(){Ye(this,t).duration=e}}var ln=pe.prototype.constructor;function cn(t){return function(){this.style.removeProperty(t)}}var hn=0;function un(t,e,i,n){this._groups=t,this._parents=e,this._name=i,this._id=n}function dn(){return++hn}var fn=pe.prototype;un.prototype=function(t){return pe().transition(t)}.prototype={constructor:un,select:function(t){var e=this._name,i=this._id;"function"!=typeof t&&(t=rt(t));for(var n=this._groups,r=n.length,o=new Array(r),s=0;s<r;++s)for(var a,l,c=n[s],h=c.length,u=o[s]=new Array(h),d=0;d<h;++d)(a=c[d])&&(l=t.call(a,a.__data__,d,c))&&("__data__"in a&&(l.__data__=a.__data__),u[d]=l,$e(u[d],e,i,d,u,Ge(a,i)));return new un(o,this._parents,e,i)},selectAll:function(t){var e=this._name,i=this._id;"function"!=typeof t&&(t=st(t));for(var n=this._groups,r=n.length,o=[],s=[],a=0;a<r;++a)for(var l,c=n[a],h=c.length,u=0;u<h;++u)if(l=c[u]){for(var d,f=t.call(l,l.__data__,u,c),p=Ge(l,i),g=0,m=f.length;g<m;++g)(d=f[g])&&$e(d,e,i,g,f,p);o.push(f),s.push(l)}return new un(o,s,e,i)},selectChild:fn.selectChild,selectChildren:fn.selectChildren,filter:function(t){"function"!=typeof t&&(t=at(t));for(var e=this._groups,i=e.length,n=new Array(i),r=0;r<i;++r)for(var o,s=e[r],a=s.length,l=n[r]=[],c=0;c<a;++c)(o=s[c])&&t.call(o,o.__data__,c,s)&&l.push(o);return new un(n,this._parents,this._name,this._id)},merge:function(t){if(t._id!==this._id)throw new Error;for(var e=this._groups,i=t._groups,n=e.length,r=i.length,o=Math.min(n,r),s=new Array(n),a=0;a<o;++a)for(var l,c=e[a],h=i[a],u=c.length,d=s[a]=new Array(u),f=0;f<u;++f)(l=c[f]||h[f])&&(d[f]=l);for(;a<n;++a)s[a]=e[a];return new un(s,this._parents,this._name,this._id)},selection:function(){return new ln(this._groups,this._parents)},transition:function(){for(var t=this._name,e=this._id,i=dn(),n=this._groups,r=n.length,o=0;o<r;++o)for(var s,a=n[o],l=a.length,c=0;c<l;++c)if(s=a[c]){var h=Ge(s,e);$e(s,t,i,c,a,{time:h.time+h.delay+h.duration,delay:0,duration:h.duration,ease:h.ease})}return new un(n,this._parents,t,i)},call:fn.call,nodes:fn.nodes,node:fn.node,size:fn.size,empty:fn.empty,each:fn.each,on:function(t,e){var i=this._id;return arguments.length<2?Ge(this.node(),i).on.on(t):this.each(function(t,e,i){var n,r,o=function(t){return(t+"").trim().split(/^|\s+/).every((function(t){var e=t.indexOf(".");return e>=0&&(t=t.slice(0,e)),!t||"start"===t}))}(e)?Ve:Ye;return function(){var s=o(this,t),a=s.on;a!==n&&(r=(n=a).copy()).on(e,i),s.on=r}}(i,t,e))},attr:function(t,e){var i=wt(t),n="transform"===i?ei:Xi;return this.attrTween(t,"function"==typeof e?(i.local?tn:Ji)(i,n,ri(this,"attr."+t,e)):null==e?(i.local?Zi:qi)(i):(i.local?Qi:Ki)(i,n,e))},attrTween:function(t,e){var i="attr."+t;if(arguments.length<2)return(i=this.tween(i))&&i._value;if(null==e)return this.tween(i,null);if("function"!=typeof e)throw new Error;var n=wt(t);return this.tween(i,(n.local?en:nn)(n,e))},style:function(t,e,i){var n="transform"==(t+="")?ti:Xi;return null==e?this.styleTween(t,function(t,e){var i,n,r;return function(){var o=jt(this,t),s=(this.style.removeProperty(t),jt(this,t));return o===s?null:o===i&&s===n?r:r=e(i=o,n=s)}}(t,n)).on("end.style."+t,cn(t)):"function"==typeof e?this.styleTween(t,function(t,e,i){var n,r,o;return function(){var s=jt(this,t),a=i(this),l=a+"";return null==a&&(this.style.removeProperty(t),l=a=jt(this,t)),s===l?null:s===n&&l===r?o:(r=l,o=e(n=s,a))}}(t,n,ri(this,"style."+t,e))).each(function(t,e){var i,n,r,o,s="style."+e,a="end."+s;return function(){var l=Ye(this,t),c=l.on,h=null==l.value[s]?o||(o=cn(e)):void 0;c===i&&r===h||(n=(i=c).copy()).on(a,r=h),l.on=n}}(this._id,t)):this.styleTween(t,function(t,e,i){var n,r,o=i+"";return function(){var s=jt(this,t);return s===o?null:s===n?r:r=e(n=s,i)}}(t,n,e),i).on("end.style."+t,null)},styleTween:function(t,e,i){var n="style."+(t+="");if(arguments.length<2)return(n=this.tween(n))&&n._value;if(null==e)return this.tween(n,null);if("function"!=typeof e)throw new Error;return this.tween(n,function(t,e,i){var n,r;function o(){var o=e.apply(this,arguments);return o!==r&&(n=(r=o)&&function(t,e,i){return function(n){this.style.setProperty(t,e.call(this,n),i)}}(t,o,i)),n}return o._value=e,o}(t,e,null==i?"":i))},text:function(t){return this.tween("text","function"==typeof t?function(t){return function(){var e=t(this);this.textContent=null==e?"":e}}(ri(this,"text",t)):function(t){return function(){this.textContent=t}}(null==t?"":t+""))},textTween:function(t){var e="text";if(arguments.length<1)return(e=this.tween(e))&&e._value;if(null==t)return this.tween(e,null);if("function"!=typeof t)throw new Error;return this.tween(e,function(t){var e,i;function n(){var n=t.apply(this,arguments);return n!==i&&(e=(i=n)&&function(t){return function(e){this.textContent=t.call(this,e)}}(n)),e}return n._value=t,n}(t))},remove:function(){return this.on("end.remove",function(t){return function(){var e=this.parentNode;for(var i in this.__transition)if(+i!==t)return;e&&e.removeChild(this)}}(this._id))},tween:function(t,e){var i=this._id;if(t+="",arguments.length<2){for(var n,r=Ge(this.node(),i).tween,o=0,s=r.length;o<s;++o)if((n=r[o]).name===t)return n.value;return null}return this.each((null==e?ii:ni)(i,t,e))},delay:function(t){var e=this._id;return arguments.length?this.each(("function"==typeof t?rn:on)(e,t)):Ge(this.node(),e).delay},duration:function(t){var e=this._id;return arguments.length?this.each(("function"==typeof t?sn:an)(e,t)):Ge(this.node(),e).duration},ease:function(t){var e=this._id;return arguments.length?this.each(function(t,e){if("function"!=typeof e)throw new Error;return function(){Ye(this,t).ease=e}}(e,t)):Ge(this.node(),e).ease},easeVarying:function(t){if("function"!=typeof t)throw new Error;return this.each(function(t,e){return function(){var i=e.apply(this,arguments);if("function"!=typeof i)throw new Error;Ye(this,t).ease=i}}(this._id,t))},end:function(){var t,e,i=this,n=i._id,r=i.size();return new Promise((function(o,s){var a={value:s},l={value:function(){0==--r&&o()}};i.each((function(){var i=Ye(this,n),r=i.on;r!==t&&((e=(t=r).copy())._.cancel.push(a),e._.interrupt.push(a),e._.end.push(l)),i.on=e})),0===r&&o()}))},[Symbol.iterator]:fn[Symbol.iterator]};var pn={time:null,delay:0,duration:250,ease:function(t){return((t*=2)<=1?t*t*t:(t-=2)*t*t+2)/2}};function gn(t,e){for(var i;!(i=t.__transition)||!(i=i[e]);)if(!(t=t.parentNode))throw new Error(`transition ${e} not found`);return i}pe.prototype.interrupt=function(t){return this.each((function(){!function(t,e){var i,n,r,o=t.__transition,s=!0;if(o){for(r in e=null==e?null:e+"",o)(i=o[r]).name===e?(n=i.state>2&&i.state<5,i.state=6,i.timer.stop(),i.on.call(n?"interrupt":"cancel",t,t.__data__,i.index,i.group),delete o[r]):s=!1;s&&delete t.__transition}}(this,t)}))},pe.prototype.transition=function(t){var e,i;t instanceof un?(e=t._id,t=t._name):(e=dn(),(i=pn).time=Ae(),t=null==t?null:t+"");for(var n=this._groups,r=n.length,o=0;o<r;++o)for(var s,a=n[o],l=a.length,c=0;c<l;++c)(s=a[c])&&$e(s,t,e,c,a,i||gn(s,e));return new un(n,this._parents,t,e)};const{abs:mn,max:yn,min:bn}=Math;function vn(t){return{type:t}}function xn(t,e){switch(arguments.length){case 0:break;case 1:this.range(t);break;default:this.range(e).domain(t)}return this}function _n(t,e){switch(arguments.length){case 0:break;case 1:"function"==typeof t?this.interpolator(t):this.range(t);break;default:this.domain(t),"function"==typeof e?this.interpolator(e):this.range(e)}return this}["w","e"].map(vn),["n","s"].map(vn),["n","w","e","s","nw","ne","sw","se"].map(vn);const wn=Symbol("implicit");function Mn(){var t=new N,e=[],i=[],n=wn;function r(r){let o=t.get(r);if(void 0===o){if(n!==wn)return n;t.set(r,o=e.push(r)-1)}return i[o%i.length]}return r.domain=function(i){if(!arguments.length)return e.slice();e=[],t=new N;for(const n of i)t.has(n)||t.set(n,e.push(n)-1);return r},r.range=function(t){return arguments.length?(i=Array.from(t),r):i.slice()},r.unknown=function(t){return arguments.length?(n=t,r):n},r.copy=function(){return Mn(e,i).unknown(n)},xn.apply(r,arguments),r}function kn(){var t,e,i=Mn().unknown(void 0),n=i.domain,r=i.range,o=0,s=1,a=!1,l=0,c=0,h=.5;function u(){var i=n().length,u=s<o,d=u?s:o,f=u?o:s;t=(f-d)/Math.max(1,i-l+2*c),a&&(t=Math.floor(t)),d+=(f-d-t*(i-l))*h,e=t*(1-l),a&&(d=Math.round(d),e=Math.round(e));var p=L(i).map((function(e){return d+t*e}));return r(u?p.reverse():p)}return delete i.unknown,i.domain=function(t){return arguments.length?(n(t),u()):n()},i.range=function(t){return arguments.length?([o,s]=t,o=+o,s=+s,u()):[o,s]},i.rangeRound=function(t){return[o,s]=t,o=+o,s=+s,a=!0,u()},i.bandwidth=function(){return e},i.step=function(){return t},i.round=function(t){return arguments.length?(a=!!t,u()):a},i.padding=function(t){return arguments.length?(l=Math.min(1,c=+t),u()):l},i.paddingInner=function(t){return arguments.length?(l=Math.min(1,t),u()):l},i.paddingOuter=function(t){return arguments.length?(c=+t,u()):c},i.align=function(t){return arguments.length?(h=Math.max(0,Math.min(1,t)),u()):h},i.copy=function(){return kn(n(),[o,s]).round(a).paddingInner(l).paddingOuter(c).align(h)},xn.apply(u(),arguments)}const Sn=Math.sqrt(50),On=Math.sqrt(10),Dn=Math.sqrt(2);function En(t,e,i){const n=(e-t)/Math.max(0,i),r=Math.floor(Math.log10(n)),o=n/Math.pow(10,r),s=o>=Sn?10:o>=On?5:o>=Dn?2:1;let a,l,c;return r<0?(c=Math.pow(10,-r)/s,a=Math.round(t*c),l=Math.round(e*c),a/c<t&&++a,l/c>e&&--l,c=-c):(c=Math.pow(10,r)*s,a=Math.round(t/c),l=Math.round(e/c),a*c<t&&++a,l*c>e&&--l),l<a&&.5<=i&&i<2?En(t,e,2*i):[a,l,c]}function Pn(t,e,i){return En(t=+t,e=+e,i=+i)[2]}function Tn(t,e,i){i=+i;const n=(e=+e)<(t=+t),r=n?Pn(e,t,i):Pn(t,e,i);return(n?-1:1)*(r<0?1/-r:r)}function Cn(t,e){return null==t||null==e?NaN:t<e?-1:t>e?1:t>=e?0:NaN}function An(t,e){return null==t||null==e?NaN:e<t?-1:e>t?1:e>=t?0:NaN}function jn(t){let e,i,n;function r(t,n,r=0,o=t.length){if(r<o){if(0!==e(n,n))return o;do{const e=r+o>>>1;i(t[e],n)<0?r=e+1:o=e}while(r<o)}return r}return 2!==t.length?(e=Cn,i=(e,i)=>Cn(t(e),i),n=(e,i)=>t(e)-i):(e=t===Cn||t===An?t:Rn,i=t,n=t),{left:r,center:function(t,e,i=0,o=t.length){const s=r(t,e,i,o-1);return s>i&&n(t[s-1],e)>-n(t[s],e)?s-1:s},right:function(t,n,r=0,o=t.length){if(r<o){if(0!==e(n,n))return o;do{const e=r+o>>>1;i(t[e],n)<=0?r=e+1:o=e}while(r<o)}return r}}}function Rn(){return 0}const Ln=jn(Cn),zn=Ln.right,Nn=(Ln.left,jn((function(t){return null===t?NaN:+t})).center,zn);function In(t,e){var i,n=e?e.length:0,r=t?Math.min(n,t.length):0,o=new Array(r),s=new Array(n);for(i=0;i<r;++i)o[i]=Bn(t[i],e[i]);for(;i<n;++i)s[i]=e[i];return function(t){for(i=0;i<r;++i)s[i]=o[i](t);return s}}function Hn(t,e){var i=new Date;return t=+t,e=+e,function(n){return i.setTime(t*(1-n)+e*n),i}}function Un(t,e){var i,n={},r={};for(i in null!==t&&"object"==typeof t||(t={}),null!==e&&"object"==typeof e||(e={}),e)i in t?n[i]=Bn(t[i],e[i]):r[i]=e[i];return function(t){for(i in n)r[i]=n[i](t);return r}}function Fn(t,e){e||(e=[]);var i,n=t?Math.min(e.length,t.length):0,r=e.slice();return function(o){for(i=0;i<n;++i)r[i]=t[i]*(1-o)+e[i]*o;return r}}function Bn(t,e){var i,n,r=typeof e;return null==e||"boolean"===r?Ui(e):("number"===r?Xe:"string"===r?(i=Mi(e))?(e=i,Bi):Gi:e instanceof Mi?Bi:e instanceof Date?Hn:(n=e,!ArrayBuffer.isView(n)||n instanceof DataView?Array.isArray(e)?In:"function"!=typeof e.valueOf&&"function"!=typeof e.toString||isNaN(e)?Un:Xe:Fn))(t,e)}function Wn(t,e){return t=+t,e=+e,function(i){return Math.round(t*(1-i)+e*i)}}function $n(t){return+t}var Vn=[0,1];function Yn(t){return t}function Gn(t,e){return(e-=t=+t)?function(i){return(i-t)/e}:(i=isNaN(e)?NaN:.5,function(){return i});var i}function Xn(t,e,i){var n=t[0],r=t[1],o=e[0],s=e[1];return r<n?(n=Gn(r,n),o=i(s,o)):(n=Gn(n,r),o=i(o,s)),function(t){return o(n(t))}}function qn(t,e,i){var n=Math.min(t.length,e.length)-1,r=new Array(n),o=new Array(n),s=-1;for(t[n]<t[0]&&(t=t.slice().reverse(),e=e.slice().reverse());++s<n;)r[s]=Gn(t[s],t[s+1]),o[s]=i(e[s],e[s+1]);return function(e){var i=Nn(t,e,1,n)-1;return o[i](r[i](e))}}function Zn(t,e){return e.domain(t.domain()).range(t.range()).interpolate(t.interpolate()).clamp(t.clamp()).unknown(t.unknown())}function Kn(){return function(){var t,e,i,n,r,o,s=Vn,a=Vn,l=Bn,c=Yn;function h(){var t,e,i,l=Math.min(s.length,a.length);return c!==Yn&&(t=s[0],e=s[l-1],t>e&&(i=t,t=e,e=i),c=function(i){return Math.max(t,Math.min(e,i))}),n=l>2?qn:Xn,r=o=null,u}function u(e){return null==e||isNaN(e=+e)?i:(r||(r=n(s.map(t),a,l)))(t(c(e)))}return u.invert=function(i){return c(e((o||(o=n(a,s.map(t),Xe)))(i)))},u.domain=function(t){return arguments.length?(s=Array.from(t,$n),h()):s.slice()},u.range=function(t){return arguments.length?(a=Array.from(t),h()):a.slice()},u.rangeRound=function(t){return a=Array.from(t),l=Wn,h()},u.clamp=function(t){return arguments.length?(c=!!t||Yn,h()):c!==Yn},u.interpolate=function(t){return arguments.length?(l=t,h()):l},u.unknown=function(t){return arguments.length?(i=t,u):i},function(i,n){return t=i,e=n,h()}}()(Yn,Yn)}var Qn,Jn=/^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;function tr(t){if(!(e=Jn.exec(t)))throw new Error("invalid format: "+t);var e;return new er({fill:e[1],align:e[2],sign:e[3],symbol:e[4],zero:e[5],width:e[6],comma:e[7],precision:e[8]&&e[8].slice(1),trim:e[9],type:e[10]})}function er(t){this.fill=void 0===t.fill?" ":t.fill+"",this.align=void 0===t.align?">":t.align+"",this.sign=void 0===t.sign?"-":t.sign+"",this.symbol=void 0===t.symbol?"":t.symbol+"",this.zero=!!t.zero,this.width=void 0===t.width?void 0:+t.width,this.comma=!!t.comma,this.precision=void 0===t.precision?void 0:+t.precision,this.trim=!!t.trim,this.type=void 0===t.type?"":t.type+""}function ir(t,e){if((i=(t=e?t.toExponential(e-1):t.toExponential()).indexOf("e"))<0)return null;var i,n=t.slice(0,i);return[n.length>1?n[0]+n.slice(2):n,+t.slice(i+1)]}function nr(t){return(t=ir(Math.abs(t)))?t[1]:NaN}function rr(t,e){var i=ir(t,e);if(!i)return t+"";var n=i[0],r=i[1];return r<0?"0."+new Array(-r).join("0")+n:n.length>r+1?n.slice(0,r+1)+"."+n.slice(r+1):n+new Array(r-n.length+2).join("0")}tr.prototype=er.prototype,er.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(void 0===this.width?"":Math.max(1,0|this.width))+(this.comma?",":"")+(void 0===this.precision?"":"."+Math.max(0,0|this.precision))+(this.trim?"~":"")+this.type};const or={"%":(t,e)=>(100*t).toFixed(e),b:t=>Math.round(t).toString(2),c:t=>t+"",d:function(t){return Math.abs(t=Math.round(t))>=1e21?t.toLocaleString("en").replace(/,/g,""):t.toString(10)},e:(t,e)=>t.toExponential(e),f:(t,e)=>t.toFixed(e),g:(t,e)=>t.toPrecision(e),o:t=>Math.round(t).toString(8),p:(t,e)=>rr(100*t,e),r:rr,s:function(t,e){var i=ir(t,e);if(!i)return t+"";var n=i[0],r=i[1],o=r-(Qn=3*Math.max(-8,Math.min(8,Math.floor(r/3))))+1,s=n.length;return o===s?n:o>s?n+new Array(o-s+1).join("0"):o>0?n.slice(0,o)+"."+n.slice(o):"0."+new Array(1-o).join("0")+ir(t,Math.max(0,e+o-1))[0]},X:t=>Math.round(t).toString(16).toUpperCase(),x:t=>Math.round(t).toString(16)};function sr(t){return t}var ar,lr,cr,hr=Array.prototype.map,ur=["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"];function dr(t){var e=t.domain;return t.ticks=function(t){var i=e();return function(t,e,i){if(!((i=+i)>0))return[];if((t=+t)==(e=+e))return[t];const n=e<t,[r,o,s]=n?En(e,t,i):En(t,e,i);if(!(o>=r))return[];const a=o-r+1,l=new Array(a);if(n)if(s<0)for(let t=0;t<a;++t)l[t]=(o-t)/-s;else for(let t=0;t<a;++t)l[t]=(o-t)*s;else if(s<0)for(let t=0;t<a;++t)l[t]=(r+t)/-s;else for(let t=0;t<a;++t)l[t]=(r+t)*s;return l}(i[0],i[i.length-1],null==t?10:t)},t.tickFormat=function(t,i){var n=e();return function(t,e,i,n){var r,o=Tn(t,e,i);switch((n=tr(null==n?",f":n)).type){case"s":var s=Math.max(Math.abs(t),Math.abs(e));return null!=n.precision||isNaN(r=function(t,e){return Math.max(0,3*Math.max(-8,Math.min(8,Math.floor(nr(e)/3)))-nr(Math.abs(t)))}(o,s))||(n.precision=r),cr(n,s);case"":case"e":case"g":case"p":case"r":null!=n.precision||isNaN(r=function(t,e){return t=Math.abs(t),e=Math.abs(e)-t,Math.max(0,nr(e)-nr(t))+1}(o,Math.max(Math.abs(t),Math.abs(e))))||(n.precision=r-("e"===n.type));break;case"f":case"%":null!=n.precision||isNaN(r=function(t){return Math.max(0,-nr(Math.abs(t)))}(o))||(n.precision=r-2*("%"===n.type))}return lr(n)}(n[0],n[n.length-1],null==t?10:t,i)},t.nice=function(i){null==i&&(i=10);var n,r,o=e(),s=0,a=o.length-1,l=o[s],c=o[a],h=10;for(c<l&&(r=l,l=c,c=r,r=s,s=a,a=r);h-- >0;){if((r=Pn(l,c,i))===n)return o[s]=l,o[a]=c,e(o);if(r>0)l=Math.floor(l/r)*r,c=Math.ceil(c/r)*r;else{if(!(r<0))break;l=Math.ceil(l*r)/r,c=Math.floor(c*r)/r}n=r}return t},t}function fr(){var t=Kn();return t.copy=function(){return Zn(t,fr())},xn.apply(t,arguments),dr(t)}ar=function(t){var e,i,n=void 0===t.grouping||void 0===t.thousands?sr:(e=hr.call(t.grouping,Number),i=t.thousands+"",function(t,n){for(var r=t.length,o=[],s=0,a=e[0],l=0;r>0&&a>0&&(l+a+1>n&&(a=Math.max(1,n-l)),o.push(t.substring(r-=a,r+a)),!((l+=a+1)>n));)a=e[s=(s+1)%e.length];return o.reverse().join(i)}),r=void 0===t.currency?"":t.currency[0]+"",o=void 0===t.currency?"":t.currency[1]+"",s=void 0===t.decimal?".":t.decimal+"",a=void 0===t.numerals?sr:function(t){return function(e){return e.replace(/[0-9]/g,(function(e){return t[+e]}))}}(hr.call(t.numerals,String)),l=void 0===t.percent?"%":t.percent+"",c=void 0===t.minus?"−":t.minus+"",h=void 0===t.nan?"NaN":t.nan+"";function u(t){var e=(t=tr(t)).fill,i=t.align,u=t.sign,d=t.symbol,f=t.zero,p=t.width,g=t.comma,m=t.precision,y=t.trim,b=t.type;"n"===b?(g=!0,b="g"):or[b]||(void 0===m&&(m=12),y=!0,b="g"),(f||"0"===e&&"="===i)&&(f=!0,e="0",i="=");var v="$"===d?r:"#"===d&&/[boxX]/.test(b)?"0"+b.toLowerCase():"",x="$"===d?o:/[%p]/.test(b)?l:"",_=or[b],w=/[defgprs%]/.test(b);function M(t){var r,o,l,d=v,M=x;if("c"===b)M=_(t)+M,t="";else{var k=(t=+t)<0||1/t<0;if(t=isNaN(t)?h:_(Math.abs(t),m),y&&(t=function(t){t:for(var e,i=t.length,n=1,r=-1;n<i;++n)switch(t[n]){case".":r=e=n;break;case"0":0===r&&(r=n),e=n;break;default:if(!+t[n])break t;r>0&&(r=0)}return r>0?t.slice(0,r)+t.slice(e+1):t}(t)),k&&0==+t&&"+"!==u&&(k=!1),d=(k?"("===u?u:c:"-"===u||"("===u?"":u)+d,M=("s"===b?ur[8+Qn/3]:"")+M+(k&&"("===u?")":""),w)for(r=-1,o=t.length;++r<o;)if(48>(l=t.charCodeAt(r))||l>57){M=(46===l?s+t.slice(r+1):t.slice(r))+M,t=t.slice(0,r);break}}g&&!f&&(t=n(t,1/0));var S=d.length+t.length+M.length,O=S<p?new Array(p-S+1).join(e):"";switch(g&&f&&(t=n(O+t,O.length?p-M.length:1/0),O=""),i){case"<":t=d+t+M+O;break;case"=":t=d+O+t+M;break;case"^":t=O.slice(0,S=O.length>>1)+d+t+M+O.slice(S);break;default:t=O+d+t+M}return a(t)}return m=void 0===m?6:/[gprs]/.test(b)?Math.max(1,Math.min(21,m)):Math.max(0,Math.min(20,m)),M.toString=function(){return t+""},M}return{format:u,formatPrefix:function(t,e){var i=u(((t=tr(t)).type="f",t)),n=3*Math.max(-8,Math.min(8,Math.floor(nr(e)/3))),r=Math.pow(10,-n),o=ur[8+n/3];return function(t){return i(r*t)+o}}}}({thousands:",",grouping:[3],currency:["$",""]}),lr=ar.format,cr=ar.formatPrefix;const pr=1e3,gr=6e4,mr=36e5,yr=864e5,br=6048e5,vr=31536e6,xr=new Date,_r=new Date;function wr(t,e,i,n){function r(e){return t(e=0===arguments.length?new Date:new Date(+e)),e}return r.floor=e=>(t(e=new Date(+e)),e),r.ceil=i=>(t(i=new Date(i-1)),e(i,1),t(i),i),r.round=t=>{const e=r(t),i=r.ceil(t);return t-e<i-t?e:i},r.offset=(t,i)=>(e(t=new Date(+t),null==i?1:Math.floor(i)),t),r.range=(i,n,o)=>{const s=[];if(i=r.ceil(i),o=null==o?1:Math.floor(o),!(i<n&&o>0))return s;let a;do{s.push(a=new Date(+i)),e(i,o),t(i)}while(a<i&&i<n);return s},r.filter=i=>wr((e=>{if(e>=e)for(;t(e),!i(e);)e.setTime(e-1)}),((t,n)=>{if(t>=t)if(n<0)for(;++n<=0;)for(;e(t,-1),!i(t););else for(;--n>=0;)for(;e(t,1),!i(t););})),i&&(r.count=(e,n)=>(xr.setTime(+e),_r.setTime(+n),t(xr),t(_r),Math.floor(i(xr,_r))),r.every=t=>(t=Math.floor(t),isFinite(t)&&t>0?t>1?r.filter(n?e=>n(e)%t==0:e=>r.count(0,e)%t==0):r:null)),r}const Mr=wr((()=>{}),((t,e)=>{t.setTime(+t+e)}),((t,e)=>e-t));Mr.every=t=>(t=Math.floor(t),isFinite(t)&&t>0?t>1?wr((e=>{e.setTime(Math.floor(e/t)*t)}),((e,i)=>{e.setTime(+e+i*t)}),((e,i)=>(i-e)/t)):Mr:null),Mr.range;const kr=wr((t=>{t.setTime(t-t.getMilliseconds())}),((t,e)=>{t.setTime(+t+e*pr)}),((t,e)=>(e-t)/pr),(t=>t.getUTCSeconds())),Sr=(kr.range,wr((t=>{t.setTime(t-t.getMilliseconds()-t.getSeconds()*pr)}),((t,e)=>{t.setTime(+t+e*gr)}),((t,e)=>(e-t)/gr),(t=>t.getMinutes()))),Or=(Sr.range,wr((t=>{t.setUTCSeconds(0,0)}),((t,e)=>{t.setTime(+t+e*gr)}),((t,e)=>(e-t)/gr),(t=>t.getUTCMinutes()))),Dr=(Or.range,wr((t=>{t.setTime(t-t.getMilliseconds()-t.getSeconds()*pr-t.getMinutes()*gr)}),((t,e)=>{t.setTime(+t+e*mr)}),((t,e)=>(e-t)/mr),(t=>t.getHours()))),Er=(Dr.range,wr((t=>{t.setUTCMinutes(0,0,0)}),((t,e)=>{t.setTime(+t+e*mr)}),((t,e)=>(e-t)/mr),(t=>t.getUTCHours()))),Pr=(Er.range,wr((t=>t.setHours(0,0,0,0)),((t,e)=>t.setDate(t.getDate()+e)),((t,e)=>(e-t-(e.getTimezoneOffset()-t.getTimezoneOffset())*gr)/yr),(t=>t.getDate()-1))),Tr=(Pr.range,wr((t=>{t.setUTCHours(0,0,0,0)}),((t,e)=>{t.setUTCDate(t.getUTCDate()+e)}),((t,e)=>(e-t)/yr),(t=>t.getUTCDate()-1))),Cr=(Tr.range,wr((t=>{t.setUTCHours(0,0,0,0)}),((t,e)=>{t.setUTCDate(t.getUTCDate()+e)}),((t,e)=>(e-t)/yr),(t=>Math.floor(t/yr))));function Ar(t){return wr((e=>{e.setDate(e.getDate()-(e.getDay()+7-t)%7),e.setHours(0,0,0,0)}),((t,e)=>{t.setDate(t.getDate()+7*e)}),((t,e)=>(e-t-(e.getTimezoneOffset()-t.getTimezoneOffset())*gr)/br))}Cr.range;const jr=Ar(0),Rr=Ar(1),Lr=Ar(2),zr=Ar(3),Nr=Ar(4),Ir=Ar(5),Hr=Ar(6);function Ur(t){return wr((e=>{e.setUTCDate(e.getUTCDate()-(e.getUTCDay()+7-t)%7),e.setUTCHours(0,0,0,0)}),((t,e)=>{t.setUTCDate(t.getUTCDate()+7*e)}),((t,e)=>(e-t)/br))}jr.range,Rr.range,Lr.range,zr.range,Nr.range,Ir.range,Hr.range;const Fr=Ur(0),Br=Ur(1),Wr=Ur(2),$r=Ur(3),Vr=Ur(4),Yr=Ur(5),Gr=Ur(6),Xr=(Fr.range,Br.range,Wr.range,$r.range,Vr.range,Yr.range,Gr.range,wr((t=>{t.setDate(1),t.setHours(0,0,0,0)}),((t,e)=>{t.setMonth(t.getMonth()+e)}),((t,e)=>e.getMonth()-t.getMonth()+12*(e.getFullYear()-t.getFullYear())),(t=>t.getMonth()))),qr=(Xr.range,wr((t=>{t.setUTCDate(1),t.setUTCHours(0,0,0,0)}),((t,e)=>{t.setUTCMonth(t.getUTCMonth()+e)}),((t,e)=>e.getUTCMonth()-t.getUTCMonth()+12*(e.getUTCFullYear()-t.getUTCFullYear())),(t=>t.getUTCMonth()))),Zr=(qr.range,wr((t=>{t.setMonth(0,1),t.setHours(0,0,0,0)}),((t,e)=>{t.setFullYear(t.getFullYear()+e)}),((t,e)=>e.getFullYear()-t.getFullYear()),(t=>t.getFullYear())));Zr.every=t=>isFinite(t=Math.floor(t))&&t>0?wr((e=>{e.setFullYear(Math.floor(e.getFullYear()/t)*t),e.setMonth(0,1),e.setHours(0,0,0,0)}),((e,i)=>{e.setFullYear(e.getFullYear()+i*t)})):null,Zr.range;const Kr=wr((t=>{t.setUTCMonth(0,1),t.setUTCHours(0,0,0,0)}),((t,e)=>{t.setUTCFullYear(t.getUTCFullYear()+e)}),((t,e)=>e.getUTCFullYear()-t.getUTCFullYear()),(t=>t.getUTCFullYear()));function Qr(t,e,i,n,r,o){const s=[[kr,1,pr],[kr,5,5e3],[kr,15,15e3],[kr,30,3e4],[o,1,gr],[o,5,3e5],[o,15,9e5],[o,30,18e5],[r,1,mr],[r,3,108e5],[r,6,216e5],[r,12,432e5],[n,1,yr],[n,2,1728e5],[i,1,br],[e,1,2592e6],[e,3,7776e6],[t,1,vr]];function a(e,i,n){const r=Math.abs(i-e)/n,o=jn((([,,t])=>t)).right(s,r);if(o===s.length)return t.every(Tn(e/vr,i/vr,n));if(0===o)return Mr.every(Math.max(Tn(e,i,n),1));const[a,l]=s[r/s[o-1][2]<s[o][2]/r?o-1:o];return a.every(l)}return[function(t,e,i){const n=e<t;n&&([t,e]=[e,t]);const r=i&&"function"==typeof i.range?i:a(t,e,i),o=r?r.range(t,+e+1):[];return n?o.reverse():o},a]}Kr.every=t=>isFinite(t=Math.floor(t))&&t>0?wr((e=>{e.setUTCFullYear(Math.floor(e.getUTCFullYear()/t)*t),e.setUTCMonth(0,1),e.setUTCHours(0,0,0,0)}),((e,i)=>{e.setUTCFullYear(e.getUTCFullYear()+i*t)})):null,Kr.range;const[Jr,to]=Qr(Kr,qr,Fr,Cr,Er,Or),[eo,io]=Qr(Zr,Xr,jr,Pr,Dr,Sr);function no(t){if(0<=t.y&&t.y<100){var e=new Date(-1,t.m,t.d,t.H,t.M,t.S,t.L);return e.setFullYear(t.y),e}return new Date(t.y,t.m,t.d,t.H,t.M,t.S,t.L)}function ro(t){if(0<=t.y&&t.y<100){var e=new Date(Date.UTC(-1,t.m,t.d,t.H,t.M,t.S,t.L));return e.setUTCFullYear(t.y),e}return new Date(Date.UTC(t.y,t.m,t.d,t.H,t.M,t.S,t.L))}function oo(t,e,i){return{y:t,m:e,d:i,H:0,M:0,S:0,L:0}}var so,ao,lo={"-":"",_:" ",0:"0"},co=/^\s*\d+/,ho=/^%/,uo=/[\\^$*+?|[\]().{}]/g;function fo(t,e,i){var n=t<0?"-":"",r=(n?-t:t)+"",o=r.length;return n+(o<i?new Array(i-o+1).join(e)+r:r)}function po(t){return t.replace(uo,"\\$&")}function go(t){return new RegExp("^(?:"+t.map(po).join("|")+")","i")}function mo(t){return new Map(t.map(((t,e)=>[t.toLowerCase(),e])))}function yo(t,e,i){var n=co.exec(e.slice(i,i+1));return n?(t.w=+n[0],i+n[0].length):-1}function bo(t,e,i){var n=co.exec(e.slice(i,i+1));return n?(t.u=+n[0],i+n[0].length):-1}function vo(t,e,i){var n=co.exec(e.slice(i,i+2));return n?(t.U=+n[0],i+n[0].length):-1}function xo(t,e,i){var n=co.exec(e.slice(i,i+2));return n?(t.V=+n[0],i+n[0].length):-1}function _o(t,e,i){var n=co.exec(e.slice(i,i+2));return n?(t.W=+n[0],i+n[0].length):-1}function wo(t,e,i){var n=co.exec(e.slice(i,i+4));return n?(t.y=+n[0],i+n[0].length):-1}function Mo(t,e,i){var n=co.exec(e.slice(i,i+2));return n?(t.y=+n[0]+(+n[0]>68?1900:2e3),i+n[0].length):-1}function ko(t,e,i){var n=/^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(e.slice(i,i+6));return n?(t.Z=n[1]?0:-(n[2]+(n[3]||"00")),i+n[0].length):-1}function So(t,e,i){var n=co.exec(e.slice(i,i+1));return n?(t.q=3*n[0]-3,i+n[0].length):-1}function Oo(t,e,i){var n=co.exec(e.slice(i,i+2));return n?(t.m=n[0]-1,i+n[0].length):-1}function Do(t,e,i){var n=co.exec(e.slice(i,i+2));return n?(t.d=+n[0],i+n[0].length):-1}function Eo(t,e,i){var n=co.exec(e.slice(i,i+3));return n?(t.m=0,t.d=+n[0],i+n[0].length):-1}function Po(t,e,i){var n=co.exec(e.slice(i,i+2));return n?(t.H=+n[0],i+n[0].length):-1}function To(t,e,i){var n=co.exec(e.slice(i,i+2));return n?(t.M=+n[0],i+n[0].length):-1}function Co(t,e,i){var n=co.exec(e.slice(i,i+2));return n?(t.S=+n[0],i+n[0].length):-1}function Ao(t,e,i){var n=co.exec(e.slice(i,i+3));return n?(t.L=+n[0],i+n[0].length):-1}function jo(t,e,i){var n=co.exec(e.slice(i,i+6));return n?(t.L=Math.floor(n[0]/1e3),i+n[0].length):-1}function Ro(t,e,i){var n=ho.exec(e.slice(i,i+1));return n?i+n[0].length:-1}function Lo(t,e,i){var n=co.exec(e.slice(i));return n?(t.Q=+n[0],i+n[0].length):-1}function zo(t,e,i){var n=co.exec(e.slice(i));return n?(t.s=+n[0],i+n[0].length):-1}function No(t,e){return fo(t.getDate(),e,2)}function Io(t,e){return fo(t.getHours(),e,2)}function Ho(t,e){return fo(t.getHours()%12||12,e,2)}function Uo(t,e){return fo(1+Pr.count(Zr(t),t),e,3)}function Fo(t,e){return fo(t.getMilliseconds(),e,3)}function Bo(t,e){return Fo(t,e)+"000"}function Wo(t,e){return fo(t.getMonth()+1,e,2)}function $o(t,e){return fo(t.getMinutes(),e,2)}function Vo(t,e){return fo(t.getSeconds(),e,2)}function Yo(t){var e=t.getDay();return 0===e?7:e}function Go(t,e){return fo(jr.count(Zr(t)-1,t),e,2)}function Xo(t){var e=t.getDay();return e>=4||0===e?Nr(t):Nr.ceil(t)}function qo(t,e){return t=Xo(t),fo(Nr.count(Zr(t),t)+(4===Zr(t).getDay()),e,2)}function Zo(t){return t.getDay()}function Ko(t,e){return fo(Rr.count(Zr(t)-1,t),e,2)}function Qo(t,e){return fo(t.getFullYear()%100,e,2)}function Jo(t,e){return fo((t=Xo(t)).getFullYear()%100,e,2)}function ts(t,e){return fo(t.getFullYear()%1e4,e,4)}function es(t,e){var i=t.getDay();return fo((t=i>=4||0===i?Nr(t):Nr.ceil(t)).getFullYear()%1e4,e,4)}function is(t){var e=t.getTimezoneOffset();return(e>0?"-":(e*=-1,"+"))+fo(e/60|0,"0",2)+fo(e%60,"0",2)}function ns(t,e){return fo(t.getUTCDate(),e,2)}function rs(t,e){return fo(t.getUTCHours(),e,2)}function os(t,e){return fo(t.getUTCHours()%12||12,e,2)}function ss(t,e){return fo(1+Tr.count(Kr(t),t),e,3)}function as(t,e){return fo(t.getUTCMilliseconds(),e,3)}function ls(t,e){return as(t,e)+"000"}function cs(t,e){return fo(t.getUTCMonth()+1,e,2)}function hs(t,e){return fo(t.getUTCMinutes(),e,2)}function us(t,e){return fo(t.getUTCSeconds(),e,2)}function ds(t){var e=t.getUTCDay();return 0===e?7:e}function fs(t,e){return fo(Fr.count(Kr(t)-1,t),e,2)}function ps(t){var e=t.getUTCDay();return e>=4||0===e?Vr(t):Vr.ceil(t)}function gs(t,e){return t=ps(t),fo(Vr.count(Kr(t),t)+(4===Kr(t).getUTCDay()),e,2)}function ms(t){return t.getUTCDay()}function ys(t,e){return fo(Br.count(Kr(t)-1,t),e,2)}function bs(t,e){return fo(t.getUTCFullYear()%100,e,2)}function vs(t,e){return fo((t=ps(t)).getUTCFullYear()%100,e,2)}function xs(t,e){return fo(t.getUTCFullYear()%1e4,e,4)}function _s(t,e){var i=t.getUTCDay();return fo((t=i>=4||0===i?Vr(t):Vr.ceil(t)).getUTCFullYear()%1e4,e,4)}function ws(){return"+0000"}function Ms(){return"%"}function ks(t){return+t}function Ss(t){return Math.floor(+t/1e3)}function Os(t){return new Date(t)}function Ds(t){return t instanceof Date?+t:+new Date(+t)}function Es(t,e,i,n,r,o,s,a,l,c){var h=Kn(),u=h.invert,d=h.domain,f=c(".%L"),p=c(":%S"),g=c("%I:%M"),m=c("%I %p"),y=c("%a %d"),b=c("%b %d"),v=c("%B"),x=c("%Y");function _(t){return(l(t)<t?f:a(t)<t?p:s(t)<t?g:o(t)<t?m:n(t)<t?r(t)<t?y:b:i(t)<t?v:x)(t)}return h.invert=function(t){return new Date(u(t))},h.domain=function(t){return arguments.length?d(Array.from(t,Ds)):d().map(Os)},h.ticks=function(e){var i=d();return t(i[0],i[i.length-1],null==e?10:e)},h.tickFormat=function(t,e){return null==e?_:c(e)},h.nice=function(t){var i=d();return t&&"function"==typeof t.range||(t=e(i[0],i[i.length-1],null==t?10:t)),t?d(function(t,e){var i,n=0,r=(t=t.slice()).length-1,o=t[n],s=t[r];return s<o&&(i=n,n=r,r=i,i=o,o=s,s=i),t[n]=e.floor(o),t[r]=e.ceil(s),t}(i,t)):h},h.copy=function(){return Zn(h,Es(t,e,i,n,r,o,s,a,l,c))},h}function Ps(){return xn.apply(Es(eo,io,Zr,Xr,jr,Pr,Dr,Sr,kr,ao).domain([new Date(2e3,0,1),new Date(2e3,0,2)]),arguments)}function Ts(){var t=dr(function(){var t,e,i,n,r,o=0,s=1,a=Yn,l=!1;function c(e){return null==e||isNaN(e=+e)?r:a(0===i?.5:(e=(n(e)-t)*i,l?Math.max(0,Math.min(1,e)):e))}function h(t){return function(e){var i,n;return arguments.length?([i,n]=e,a=t(i,n),c):[a(0),a(1)]}}return c.domain=function(r){return arguments.length?([o,s]=r,t=n(o=+o),e=n(s=+s),i=t===e?0:1/(e-t),c):[o,s]},c.clamp=function(t){return arguments.length?(l=!!t,c):l},c.interpolator=function(t){return arguments.length?(a=t,c):a},c.range=h(Bn),c.rangeRound=h(Wn),c.unknown=function(t){return arguments.length?(r=t,c):r},function(r){return n=r,t=r(o),e=r(s),i=t===e?0:1/(e-t),c}}()(Yn));return t.copy=function(){return e=t,Ts().domain(e.domain()).interpolator(e.interpolator()).clamp(e.clamp()).unknown(e.unknown());var e},_n.apply(t,arguments)}function Cs(t){for(var e=t.length/6|0,i=new Array(e),n=0;n<e;)i[n]="#"+t.slice(6*n,6*++n);return i}so=function(t){var e=t.dateTime,i=t.date,n=t.time,r=t.periods,o=t.days,s=t.shortDays,a=t.months,l=t.shortMonths,c=go(r),h=mo(r),u=go(o),d=mo(o),f=go(s),p=mo(s),g=go(a),m=mo(a),y=go(l),b=mo(l),v={a:function(t){return s[t.getDay()]},A:function(t){return o[t.getDay()]},b:function(t){return l[t.getMonth()]},B:function(t){return a[t.getMonth()]},c:null,d:No,e:No,f:Bo,g:Jo,G:es,H:Io,I:Ho,j:Uo,L:Fo,m:Wo,M:$o,p:function(t){return r[+(t.getHours()>=12)]},q:function(t){return 1+~~(t.getMonth()/3)},Q:ks,s:Ss,S:Vo,u:Yo,U:Go,V:qo,w:Zo,W:Ko,x:null,X:null,y:Qo,Y:ts,Z:is,"%":Ms},x={a:function(t){return s[t.getUTCDay()]},A:function(t){return o[t.getUTCDay()]},b:function(t){return l[t.getUTCMonth()]},B:function(t){return a[t.getUTCMonth()]},c:null,d:ns,e:ns,f:ls,g:vs,G:_s,H:rs,I:os,j:ss,L:as,m:cs,M:hs,p:function(t){return r[+(t.getUTCHours()>=12)]},q:function(t){return 1+~~(t.getUTCMonth()/3)},Q:ks,s:Ss,S:us,u:ds,U:fs,V:gs,w:ms,W:ys,x:null,X:null,y:bs,Y:xs,Z:ws,"%":Ms},_={a:function(t,e,i){var n=f.exec(e.slice(i));return n?(t.w=p.get(n[0].toLowerCase()),i+n[0].length):-1},A:function(t,e,i){var n=u.exec(e.slice(i));return n?(t.w=d.get(n[0].toLowerCase()),i+n[0].length):-1},b:function(t,e,i){var n=y.exec(e.slice(i));return n?(t.m=b.get(n[0].toLowerCase()),i+n[0].length):-1},B:function(t,e,i){var n=g.exec(e.slice(i));return n?(t.m=m.get(n[0].toLowerCase()),i+n[0].length):-1},c:function(t,i,n){return k(t,e,i,n)},d:Do,e:Do,f:jo,g:Mo,G:wo,H:Po,I:Po,j:Eo,L:Ao,m:Oo,M:To,p:function(t,e,i){var n=c.exec(e.slice(i));return n?(t.p=h.get(n[0].toLowerCase()),i+n[0].length):-1},q:So,Q:Lo,s:zo,S:Co,u:bo,U:vo,V:xo,w:yo,W:_o,x:function(t,e,n){return k(t,i,e,n)},X:function(t,e,i){return k(t,n,e,i)},y:Mo,Y:wo,Z:ko,"%":Ro};function w(t,e){return function(i){var n,r,o,s=[],a=-1,l=0,c=t.length;for(i instanceof Date||(i=new Date(+i));++a<c;)37===t.charCodeAt(a)&&(s.push(t.slice(l,a)),null!=(r=lo[n=t.charAt(++a)])?n=t.charAt(++a):r="e"===n?" ":"0",(o=e[n])&&(n=o(i,r)),s.push(n),l=a+1);return s.push(t.slice(l,a)),s.join("")}}function M(t,e){return function(i){var n,r,o=oo(1900,void 0,1);if(k(o,t,i+="",0)!=i.length)return null;if("Q"in o)return new Date(o.Q);if("s"in o)return new Date(1e3*o.s+("L"in o?o.L:0));if(e&&!("Z"in o)&&(o.Z=0),"p"in o&&(o.H=o.H%12+12*o.p),void 0===o.m&&(o.m="q"in o?o.q:0),"V"in o){if(o.V<1||o.V>53)return null;"w"in o||(o.w=1),"Z"in o?(r=(n=ro(oo(o.y,0,1))).getUTCDay(),n=r>4||0===r?Br.ceil(n):Br(n),n=Tr.offset(n,7*(o.V-1)),o.y=n.getUTCFullYear(),o.m=n.getUTCMonth(),o.d=n.getUTCDate()+(o.w+6)%7):(r=(n=no(oo(o.y,0,1))).getDay(),n=r>4||0===r?Rr.ceil(n):Rr(n),n=Pr.offset(n,7*(o.V-1)),o.y=n.getFullYear(),o.m=n.getMonth(),o.d=n.getDate()+(o.w+6)%7)}else("W"in o||"U"in o)&&("w"in o||(o.w="u"in o?o.u%7:"W"in o?1:0),r="Z"in o?ro(oo(o.y,0,1)).getUTCDay():no(oo(o.y,0,1)).getDay(),o.m=0,o.d="W"in o?(o.w+6)%7+7*o.W-(r+5)%7:o.w+7*o.U-(r+6)%7);return"Z"in o?(o.H+=o.Z/100|0,o.M+=o.Z%100,ro(o)):no(o)}}function k(t,e,i,n){for(var r,o,s=0,a=e.length,l=i.length;s<a;){if(n>=l)return-1;if(37===(r=e.charCodeAt(s++))){if(r=e.charAt(s++),!(o=_[r in lo?e.charAt(s++):r])||(n=o(t,i,n))<0)return-1}else if(r!=i.charCodeAt(n++))return-1}return n}return v.x=w(i,v),v.X=w(n,v),v.c=w(e,v),x.x=w(i,x),x.X=w(n,x),x.c=w(e,x),{format:function(t){var e=w(t+="",v);return e.toString=function(){return t},e},parse:function(t){var e=M(t+="",!1);return e.toString=function(){return t},e},utcFormat:function(t){var e=w(t+="",x);return e.toString=function(){return t},e},utcParse:function(t){var e=M(t+="",!0);return e.toString=function(){return t},e}}}({dateTime:"%x, %X",date:"%-m/%-d/%Y",time:"%-I:%M:%S %p",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]}),ao=so.format,so.parse,so.utcFormat,so.utcParse;const As=Cs("4e79a7f28e2ce1575976b7b259a14fedc949af7aa1ff9da79c755fbab0ab"),js=t=>$i(t[t.length-1]);var Rs=new Array(3).concat("fc8d59ffffbf99d594","d7191cfdae61abdda42b83ba","d7191cfdae61ffffbfabdda42b83ba","d53e4ffc8d59fee08be6f59899d5943288bd","d53e4ffc8d59fee08bffffbfe6f59899d5943288bd","d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd","d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd","9e0142d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd5e4fa2","9e0142d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd5e4fa2").map(Cs);js(Rs);const Ls=js(new Array(3).concat("e5f5e0a1d99b31a354","edf8e9bae4b374c476238b45","edf8e9bae4b374c47631a354006d2c","edf8e9c7e9c0a1d99b74c47631a354006d2c","edf8e9c7e9c0a1d99b74c47641ab5d238b45005a32","f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45005a32","f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45006d2c00441b").map(Cs));function zs(t){return"string"==typeof t?new de([[document.querySelector(t)]],[document.documentElement]):new de([[t]],ue)}function Ns(t){return function(){return t}}const Is=Math.abs,Hs=Math.atan2,Us=Math.cos,Fs=Math.max,Bs=Math.min,Ws=Math.sin,$s=Math.sqrt,Vs=1e-12,Ys=Math.PI,Gs=Ys/2,Xs=2*Ys;function qs(t){return t>=1?Gs:t<=-1?-Gs:Math.asin(t)}const Zs=Math.PI,Ks=2*Zs,Qs=1e-6,Js=Ks-Qs;function ta(t){this._+=t[0];for(let e=1,i=t.length;e<i;++e)this._+=arguments[e]+t[e]}class ea{constructor(t){this._x0=this._y0=this._x1=this._y1=null,this._="",this._append=null==t?ta:function(t){let e=Math.floor(t);if(!(e>=0))throw new Error(`invalid digits: ${t}`);if(e>15)return ta;const i=10**e;return function(t){this._+=t[0];for(let e=1,n=t.length;e<n;++e)this._+=Math.round(arguments[e]*i)/i+t[e]}}(t)}moveTo(t,e){this._append`M${this._x0=this._x1=+t},${this._y0=this._y1=+e}`}closePath(){null!==this._x1&&(this._x1=this._x0,this._y1=this._y0,this._append`Z`)}lineTo(t,e){this._append`L${this._x1=+t},${this._y1=+e}`}quadraticCurveTo(t,e,i,n){this._append`Q${+t},${+e},${this._x1=+i},${this._y1=+n}`}bezierCurveTo(t,e,i,n,r,o){this._append`C${+t},${+e},${+i},${+n},${this._x1=+r},${this._y1=+o}`}arcTo(t,e,i,n,r){if(t=+t,e=+e,i=+i,n=+n,(r=+r)<0)throw new Error(`negative radius: ${r}`);let o=this._x1,s=this._y1,a=i-t,l=n-e,c=o-t,h=s-e,u=c*c+h*h;if(null===this._x1)this._append`M${this._x1=t},${this._y1=e}`;else if(u>Qs)if(Math.abs(h*a-l*c)>Qs&&r){let d=i-o,f=n-s,p=a*a+l*l,g=d*d+f*f,m=Math.sqrt(p),y=Math.sqrt(u),b=r*Math.tan((Zs-Math.acos((p+u-g)/(2*m*y)))/2),v=b/y,x=b/m;Math.abs(v-1)>Qs&&this._append`L${t+v*c},${e+v*h}`,this._append`A${r},${r},0,0,${+(h*d>c*f)},${this._x1=t+x*a},${this._y1=e+x*l}`}else this._append`L${this._x1=t},${this._y1=e}`}arc(t,e,i,n,r,o){if(t=+t,e=+e,o=!!o,(i=+i)<0)throw new Error(`negative radius: ${i}`);let s=i*Math.cos(n),a=i*Math.sin(n),l=t+s,c=e+a,h=1^o,u=o?n-r:r-n;null===this._x1?this._append`M${l},${c}`:(Math.abs(this._x1-l)>Qs||Math.abs(this._y1-c)>Qs)&&this._append`L${l},${c}`,i&&(u<0&&(u=u%Ks+Ks),u>Js?this._append`A${i},${i},0,1,${h},${t-s},${e-a}A${i},${i},0,1,${h},${this._x1=l},${this._y1=c}`:u>Qs&&this._append`A${i},${i},0,${+(u>=Zs)},${h},${this._x1=t+i*Math.cos(r)},${this._y1=e+i*Math.sin(r)}`)}rect(t,e,i,n){this._append`M${this._x0=this._x1=+t},${this._y0=this._y1=+e}h${i=+i}v${+n}h${-i}Z`}toString(){return this._}}function ia(t){let e=3;return t.digits=function(i){if(!arguments.length)return e;if(null==i)e=null;else{const t=Math.floor(i);if(!(t>=0))throw new RangeError(`invalid digits: ${i}`);e=t}return t},()=>new ea(e)}function na(t){return t.innerRadius}function ra(t){return t.outerRadius}function oa(t){return t.startAngle}function sa(t){return t.endAngle}function aa(t){return t&&t.padAngle}function la(t,e,i,n,r,o,s){var a=t-i,l=e-n,c=(s?o:-o)/$s(a*a+l*l),h=c*l,u=-c*a,d=t+h,f=e+u,p=i+h,g=n+u,m=(d+p)/2,y=(f+g)/2,b=p-d,v=g-f,x=b*b+v*v,_=r-o,w=d*g-p*f,M=(v<0?-1:1)*$s(Fs(0,_*_*x-w*w)),k=(w*v-b*M)/x,S=(-w*b-v*M)/x,O=(w*v+b*M)/x,D=(-w*b+v*M)/x,E=k-m,P=S-y,T=O-m,C=D-y;return E*E+P*P>T*T+C*C&&(k=O,S=D),{cx:k,cy:S,x01:-h,y01:-u,x11:k*(r/_-1),y11:S*(r/_-1)}}function ca(){var t=na,e=ra,i=Ns(0),n=null,r=oa,o=sa,s=aa,a=null,l=ia(c);function c(){var c,h,u,d=+t.apply(this,arguments),f=+e.apply(this,arguments),p=r.apply(this,arguments)-Gs,g=o.apply(this,arguments)-Gs,m=Is(g-p),y=g>p;if(a||(a=c=l()),f<d&&(h=f,f=d,d=h),f>Vs)if(m>Xs-Vs)a.moveTo(f*Us(p),f*Ws(p)),a.arc(0,0,f,p,g,!y),d>Vs&&(a.moveTo(d*Us(g),d*Ws(g)),a.arc(0,0,d,g,p,y));else{var b,v,x=p,_=g,w=p,M=g,k=m,S=m,O=s.apply(this,arguments)/2,D=O>Vs&&(n?+n.apply(this,arguments):$s(d*d+f*f)),E=Bs(Is(f-d)/2,+i.apply(this,arguments)),P=E,T=E;if(D>Vs){var C=qs(D/d*Ws(O)),A=qs(D/f*Ws(O));(k-=2*C)>Vs?(w+=C*=y?1:-1,M-=C):(k=0,w=M=(p+g)/2),(S-=2*A)>Vs?(x+=A*=y?1:-1,_-=A):(S=0,x=_=(p+g)/2)}var j=f*Us(x),R=f*Ws(x),L=d*Us(M),z=d*Ws(M);if(E>Vs){var N,I=f*Us(_),H=f*Ws(_),U=d*Us(w),F=d*Ws(w);if(m<Ys)if(N=function(t,e,i,n,r,o,s,a){var l=i-t,c=n-e,h=s-r,u=a-o,d=u*l-h*c;if(!(d*d<Vs))return[t+(d=(h*(e-o)-u*(t-r))/d)*l,e+d*c]}(j,R,U,F,I,H,L,z)){var B=j-N[0],W=R-N[1],$=I-N[0],V=H-N[1],Y=1/Ws(((u=(B*$+W*V)/($s(B*B+W*W)*$s($*$+V*V)))>1?0:u<-1?Ys:Math.acos(u))/2),G=$s(N[0]*N[0]+N[1]*N[1]);P=Bs(E,(d-G)/(Y-1)),T=Bs(E,(f-G)/(Y+1))}else P=T=0}S>Vs?T>Vs?(b=la(U,F,j,R,f,T,y),v=la(I,H,L,z,f,T,y),a.moveTo(b.cx+b.x01,b.cy+b.y01),T<E?a.arc(b.cx,b.cy,T,Hs(b.y01,b.x01),Hs(v.y01,v.x01),!y):(a.arc(b.cx,b.cy,T,Hs(b.y01,b.x01),Hs(b.y11,b.x11),!y),a.arc(0,0,f,Hs(b.cy+b.y11,b.cx+b.x11),Hs(v.cy+v.y11,v.cx+v.x11),!y),a.arc(v.cx,v.cy,T,Hs(v.y11,v.x11),Hs(v.y01,v.x01),!y))):(a.moveTo(j,R),a.arc(0,0,f,x,_,!y)):a.moveTo(j,R),d>Vs&&k>Vs?P>Vs?(b=la(L,z,I,H,d,-P,y),v=la(j,R,U,F,d,-P,y),a.lineTo(b.cx+b.x01,b.cy+b.y01),P<E?a.arc(b.cx,b.cy,P,Hs(b.y01,b.x01),Hs(v.y01,v.x01),!y):(a.arc(b.cx,b.cy,P,Hs(b.y01,b.x01),Hs(b.y11,b.x11),!y),a.arc(0,0,d,Hs(b.cy+b.y11,b.cx+b.x11),Hs(v.cy+v.y11,v.cx+v.x11),y),a.arc(v.cx,v.cy,P,Hs(v.y11,v.x11),Hs(v.y01,v.x01),!y))):a.arc(0,0,d,M,w,y):a.lineTo(L,z)}else a.moveTo(0,0);if(a.closePath(),c)return a=null,c+""||null}return c.centroid=function(){var i=(+t.apply(this,arguments)+ +e.apply(this,arguments))/2,n=(+r.apply(this,arguments)+ +o.apply(this,arguments))/2-Ys/2;return[Us(n)*i,Ws(n)*i]},c.innerRadius=function(e){return arguments.length?(t="function"==typeof e?e:Ns(+e),c):t},c.outerRadius=function(t){return arguments.length?(e="function"==typeof t?t:Ns(+t),c):e},c.cornerRadius=function(t){return arguments.length?(i="function"==typeof t?t:Ns(+t),c):i},c.padRadius=function(t){return arguments.length?(n=null==t?null:"function"==typeof t?t:Ns(+t),c):n},c.startAngle=function(t){return arguments.length?(r="function"==typeof t?t:Ns(+t),c):r},c.endAngle=function(t){return arguments.length?(o="function"==typeof t?t:Ns(+t),c):o},c.padAngle=function(t){return arguments.length?(s="function"==typeof t?t:Ns(+t),c):s},c.context=function(t){return arguments.length?(a=null==t?null:t,c):a},c}function ha(t){return"object"==typeof t&&"length"in t?t:Array.from(t)}function ua(t){this._context=t}function da(t){return new ua(t)}function fa(t){return t[0]}function pa(t){return t[1]}function ga(t,e){var i=Ns(!0),n=null,r=da,o=null,s=ia(a);function a(a){var l,c,h,u=(a=ha(a)).length,d=!1;for(null==n&&(o=r(h=s())),l=0;l<=u;++l)!(l<u&&i(c=a[l],l,a))===d&&((d=!d)?o.lineStart():o.lineEnd()),d&&o.point(+t(c,l,a),+e(c,l,a));if(h)return o=null,h+""||null}return t="function"==typeof t?t:void 0===t?fa:Ns(t),e="function"==typeof e?e:void 0===e?pa:Ns(e),a.x=function(e){return arguments.length?(t="function"==typeof e?e:Ns(+e),a):t},a.y=function(t){return arguments.length?(e="function"==typeof t?t:Ns(+t),a):e},a.defined=function(t){return arguments.length?(i="function"==typeof t?t:Ns(!!t),a):i},a.curve=function(t){return arguments.length?(r=t,null!=n&&(o=r(n)),a):r},a.context=function(t){return arguments.length?(null==t?n=o=null:o=r(n=t),a):n},a}function ma(t,e){return e<t?-1:e>t?1:e>=t?0:NaN}function ya(t){return t}function ba(t,e){if((r=t.length)>1)for(var i,n,r,o=1,s=t[e[0]],a=s.length;o<r;++o)for(n=s,s=t[e[o]],i=0;i<a;++i)s[i][1]+=s[i][0]=isNaN(n[i][1])?n[i][0]:n[i][1]}function va(t){for(var e=t.length,i=new Array(e);--e>=0;)i[e]=e;return i}function xa(t,e){return t[e]}function _a(t){const e=[];return e.key=t,e}function wa(t,e,i){this.k=t,this.x=e,this.y=i}function Ma(t){return Ma="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Ma(t)}function ka(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,Oa(n.key),n)}}function Sa(t,e,i){return(e=Oa(e))in t?Object.defineProperty(t,e,{value:i,enumerable:!0,configurable:!0,writable:!0}):t[e]=i,t}function Oa(t){var e=function(t,e){if("object"!==Ma(t)||null===t)return t;var i=t[Symbol.toPrimitive];if(void 0!==i){var n=i.call(t,"string");if("object"!==Ma(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"===Ma(e)?e:String(e)}ea.prototype,Array.prototype.slice,ua.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;default:this._context.lineTo(t,e)}}},wa.prototype={constructor:wa,scale:function(t){return 1===t?this:new wa(this.k*t,this.x,this.y)},translate:function(t,e){return 0===t&0===e?this:new wa(this.k,this.x+this.k*t,this.y+this.k*e)},apply:function(t){return[t[0]*this.k+this.x,t[1]*this.k+this.y]},applyX:function(t){return t*this.k+this.x},applyY:function(t){return t*this.k+this.y},invert:function(t){return[(t[0]-this.x)/this.k,(t[1]-this.y)/this.k]},invertX:function(t){return(t-this.x)/this.k},invertY:function(t){return(t-this.y)/this.k},rescaleX:function(t){return t.copy().domain(t.range().map(this.invertX,this).map(t.invert,t))},rescaleY:function(t){return t.copy().domain(t.range().map(this.invertY,this).map(t.invert,t))},toString:function(){return"translate("+this.x+","+this.y+") scale("+this.k+")"}},new wa(1,0,0),wa.prototype;var Da=["#1f77b4","#aec7e8","#ff7f0e","#ffbb78","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5","#e377c2","#f7b6d2","#7f7f7f","#c7c7c7","#bcbd22","#dbdb8d","#17becf","#9edae5","salmon","lightsalmon","lightsteelblue","steelblue","yellow","orange","#cccccc","#dddddd","#eee","#aaa","#123456","black"],Ea=function(){function t(e,i,n){var r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),Sa(this,"marginRight",150),Sa(this,"marginBottom",150),Sa(this,"colorRange",Da),this.title=e,this.description=i,this.data=n,this.options=r,this.dataIsValid=Array.isArray(n)?n.length>0:!!n,this.wrapper=document.createElement("div"),this.svg=zs(this.wrapper).append("svg")}var e,i;return e=t,i=[{key:"clearAndScaleSvg",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:null;this.g&&this.g.remove(),this.svg.selectAll("*").remove();var r=i||100,o=n||50,s=this.title?[5,35]:[0,0];return this.svg.append("rect").attr("width",this.title?t-10:t).attr("height",this.title?e-40:e).attr("fill","white").attr("rx",3).attr("ry",3).attr("transform","translate(".concat(s[0],",").concat(s[1],")")),this.g=this.svg.append("g").attr("transform","translate(".concat(r,",").concat(o,")")),this.svg.attr("height",e).attr("width",t),this.svg.attr("style","background-color: #f5f5f5"),[this.svg.attr("width")-this.marginRight,this.svg.attr("height")-this.marginBottom]}},{key:"drawTitle",value:function(){var t=this;if(this.title&&this.svg.append("g").attr("transform","translate(10, 0)").append("text").attr("text-anchor","start").attr("x",0).attr("y",25).attr("class","chart-title").text(this.title),this.description){var e=Date.now();this.svg.append("g").attr("transform","translate(".concat(this.svg.attr("width")-40,", 5)")).append("path").attr("class","question-mark").attr("id","id-".concat(e)).attr("d","M256 8C119.043 8 8 119.083 8 256c0 136.997 111.043 248 248 248s248-111.003 248-248C504 119.083 392.957 8 256 8zm0 448c-110.532 0-200-89.431-200-200 0-110.495 89.472-200 200-200 110.491 0 200 89.471 200 200 0 110.53-89.431 200-200 200zm107.244-255.2c0 67.052-72.421 68.084-72.421 92.863V300c0 6.627-5.373 12-12 12h-45.647c-6.627 0-12-5.373-12-12v-8.659c0-35.745 27.1-50.034 47.579-61.516 17.561-9.845 28.324-16.541 28.324-29.579 0-17.246-21.999-28.693-39.784-28.693-23.189 0-33.894 10.977-48.942 29.969-4.057 5.12-11.46 6.071-16.666 2.124l-27.824-21.098c-5.107-3.872-6.251-11.066-2.644-16.363C184.846 131.491 214.94 112 261.794 112c49.071 0 101.45 38.304 101.45 88.8zM298 368c0 23.159-18.841 42-42 42s-42-18.841-42-42 18.841-42 42-42 42 18.841 42 42z"),setTimeout((function(){var i=document.getElementById("id-".concat(e));i&&i.addEventListener("click",(function(e){t.options.onShowDesc(t.description)}))}))}}},{key:"appendXAxis",value:function(t,e){var i=this.options.ticks?et(t).ticks(this.options.ticks).tickFormat(ao("%d.%m.%Y %H:%M")):et(t).tickFormat(ao("%d.%m.%Y %H:%M"));this.g.append("g").attr("transform","translate(0,"+e+")").call(i)}},{key:"appendXAxisLabel",value:function(t,e){this.options.xAxisLabel&&this.g.append("g").append("text").attr("x",t).attr("y",e+50).attr("text-anchor","end").attr("font-size","18px").attr("fill","black").text(this.options.xAxisLabel)}},{key:"appendYAxisLabel",value:function(){this.options.yAxisLabel&&this.g.append("g").append("text").attr("transform","rotate(-90)").attr("y",6).attr("dy","-4em").attr("text-anchor","end").attr("font-size","18px").attr("fill","black").text(this.options.yAxisLabel)}},{key:"showErrorMessage",value:function(t,e){this.g.append("g").append("text").attr("x",t/2-140).attr("y",e/2-20).attr("class","chart-error-message").text("No data available.")}},{key:"showLegend",value:function(t,e,i){this.svg.append("g").selectAll("g").data(t).enter().append("circle").attr("cx",i-120).attr("cy",(function(t,e){return 25+25*e})).attr("r",7).style("fill",(function(t){return e(t)})),this.svg.selectAll("label").data(t).enter().append("text").attr("x",i-100).attr("y",(function(t,e){return 25+25*e})).style("fill",(function(t){return e(t)})).text((function(t){return t})).attr("text-anchor","left").style("alignment-baseline","middle")}}],i&&ka(e.prototype,i),Object.defineProperty(e,"prototype",{writable:!1}),t}();function Pa(t){return Pa="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Pa(t)}function Ta(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){var i=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=i){var n,r,o,s,a=[],l=!0,c=!1;try{if(o=(i=i.call(t)).next,0===e){if(Object(i)!==i)return;l=!1}else for(;!(l=(n=o.call(i)).done)&&(a.push(n.value),a.length!==e);l=!0);}catch(t){c=!0,r=t}finally{try{if(!l&&null!=i.return&&(s=i.return(),Object(s)!==s))return}finally{if(c)throw r}}return a}}(t,e)||function(t,e){if(t){if("string"==typeof t)return Ca(t,e);var i=Object.prototype.toString.call(t).slice(8,-1);return"Object"===i&&t.constructor&&(i=t.constructor.name),"Map"===i||"Set"===i?Array.from(t):"Arguments"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?Ca(t,e):void 0}}(t,e)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Ca(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,n=new Array(e);i<e;i++)n[i]=t[i];return n}function Aa(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,(void 0,r=function(t,e){if("object"!==Pa(t)||null===t)return t;var i=t[Symbol.toPrimitive];if(void 0!==i){var n=i.call(t,"string");if("object"!==Pa(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(n.key),"symbol"===Pa(r)?r:String(r)),n)}var r}function ja(t,e){return ja=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},ja(t,e)}function Ra(t){return Ra=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},Ra(t)}var La=function(t){!function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&ja(t,e)}(s,t);var e,i,n,r,o=(n=s,r=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}}(),function(){var t,e=Ra(n);if(r){var i=Ra(this).constructor;t=Reflect.construct(e,arguments,i)}else t=e.apply(this,arguments);return function(t,e){if(e&&("object"===Pa(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t)}(this,t)});function s(){var t,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",i=arguments.length>1?arguments[1]:void 0,n=arguments.length>2?arguments[2]:void 0,r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};return function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,s),r.transform&&(n=(null!==(t=n)&&void 0!==t?t:[]).map(r.transform)),o.call(this,e,i,n,r)}return e=s,i=[{key:"plot",value:function(t,e,i){var n=Ta(this.clearAndScaleSvg(t,e),2),r=n[0],o=n[1];if(this.drawTitle(),!this.dataIsValid)return this.showErrorMessage(t,e),this.wrapper.innerHTML;var s=Ta(j(this.data,(function(t){return t.column1})),2),a=s[0],l=s[1],c=null;c=this.options.useTimeScale?Ps().domain([a,l]).range([0,r]):fr().domain([a,l]).range([0,r]),this.appendXAxis(c,o),this.appendXAxisLabel(r,o),this.appendYAxisLabel();var h=R(this.data,(function(t){return+t.column2})),u=fr().domain([0,h]).range([o,0]);this.g.append("g").call(it(u));var d=Mn().range(this.colorRange);return this.g.append("path").datum(this.data).attr("stroke",(function(t){return d(t.column2)})).attr("class","chart-path").attr("d",ga().x((function(t){return c(t.column1)})).y((function(t){return u(t.column2)}))),this.options.showLegend&&this.showLegend(this.data.map((function(t){return t.column1})),d,t),this.wrapper.innerHTML}},{key:"appendXAxis",value:function(t,e){var i=this.options.ticks?et(t).ticks(this.options.ticks):et(t);this.options.useTimeScale&&i.tickFormat(ao("%d.%m.%Y %H:%M")),this.g.append("g").attr("transform","translate(0,"+e+")").call(i)}}],i&&Aa(e.prototype,i),Object.defineProperty(e,"prototype",{writable:!1}),s}(Ea);function za(t){return za="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},za(t)}function Na(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,n=new Array(e);i<e;i++)n[i]=t[i];return n}function Ia(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,(void 0,r=function(t,e){if("object"!==za(t)||null===t)return t;var i=t[Symbol.toPrimitive];if(void 0!==i){var n=i.call(t,"string");if("object"!==za(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(n.key),"symbol"===za(r)?r:String(r)),n)}var r}function Ha(t,e){return Ha=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},Ha(t,e)}function Ua(t){return Ua=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},Ua(t)}var Fa=function(t){!function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&Ha(t,e)}(s,t);var e,i,n,r,o=(n=s,r=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}}(),function(){var t,e=Ua(n);if(r){var i=Ua(this).constructor;t=Reflect.construct(e,arguments,i)}else t=e.apply(this,arguments);return function(t,e){if(e&&("object"===za(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t)}(this,t)});function s(t,e,i,n){var r;return function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,s),n.transform&&(i=(null!==(r=i)&&void 0!==r?r:[]).map(n.transform)),o.call(this,t,e,i,n)}return e=s,i=[{key:"plot",value:function(t,e,i){var n,r,o=(n=this.clearAndScaleSvg(t,e),r=2,function(t){if(Array.isArray(t))return t}(n)||function(t,e){var i=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=i){var n,r,o,s,a=[],l=!0,c=!1;try{if(o=(i=i.call(t)).next,0===e){if(Object(i)!==i)return;l=!1}else for(;!(l=(n=o.call(i)).done)&&(a.push(n.value),a.length!==e);l=!0);}catch(t){c=!0,r=t}finally{try{if(!l&&null!=i.return&&(s=i.return(),Object(s)!==s))return}finally{if(c)throw r}}return a}}(n,r)||function(t,e){if(t){if("string"==typeof t)return Na(t,e);var i=Object.prototype.toString.call(t).slice(8,-1);return"Object"===i&&t.constructor&&(i=t.constructor.name),"Map"===i||"Set"===i?Array.from(t):"Arguments"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?Na(t,e):void 0}}(n,r)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),s=o[0],a=o[1];if(this.drawTitle(),!this.dataIsValid)return this.showErrorMessage(t,e),this.wrapper.innerHTML;var l=kn().range([0,s]).padding(.4),c=fr().range([a,0]),h=R(this.data,(function(t){return t.column2}));l.domain(this.data.map((function(t){return t.column1}))),c.domain([0,h]),this.appendXAxis(l,a),this.appendXAxisLabel(s,a),this.appendYAxisLabel(),this.g.append("g").attr("transform","translate(0, 0)").call(it(c));var u=Mn().range(this.colorRange);return this.g.selectAll(".bar").data(this.data).enter().append("rect").attr("fill",(function(t){return u(t.column2)})).attr("x",(function(t){return l(t.column1)})).attr("y",(function(t){return c(t.column2)})).attr("width",l.bandwidth()).attr("height",(function(t){return a-c(t.column2)})),this.options.showLegend&&this.showLegend(this.data.map((function(t){return t.column1})),u,t),this.wrapper.innerHTML}}],i&&Ia(e.prototype,i),Object.defineProperty(e,"prototype",{writable:!1}),s}(Ea);function Ba(t){return Ba="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Ba(t)}function Wa(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,n=new Array(e);i<e;i++)n[i]=t[i];return n}function $a(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,(void 0,r=function(t,e){if("object"!==Ba(t)||null===t)return t;var i=t[Symbol.toPrimitive];if(void 0!==i){var n=i.call(t,"string");if("object"!==Ba(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(n.key),"symbol"===Ba(r)?r:String(r)),n)}var r}function Va(t,e){return Va=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},Va(t,e)}function Ya(t){return Ya=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},Ya(t)}var Ga=function(t){!function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&Va(t,e)}(s,t);var e,i,n,r,o=(n=s,r=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}}(),function(){var t,e=Ya(n);if(r){var i=Ya(this).constructor;t=Reflect.construct(e,arguments,i)}else t=e.apply(this,arguments);return function(t,e){if(e&&("object"===Ba(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t)}(this,t)});function s(){var t,e,i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",n=arguments.length>1?arguments[1]:void 0,r=arguments.length>2?arguments[2]:void 0,a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};return function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,s),a.transform&&(r=(null!==(t=r)&&void 0!==t?t:[]).map(a.transform)),(e=o.call(this,i,n,r,a)).marginRight=100,e.marginBottom=60,e}return e=s,i=[{key:"plot",value:function(t,e,i){var n=t/2,r=e/2;if(!this.dataIsValid)return this.clearAndScaleSvg(t,e),this.drawTitle(),this.showErrorMessage(t,e),this.wrapper.innerHTML;var o,s,a=(o=this.clearAndScaleSvg(t,e,n,r),s=2,function(t){if(Array.isArray(t))return t}(o)||function(t,e){var i=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=i){var n,r,o,s,a=[],l=!0,c=!1;try{if(o=(i=i.call(t)).next,0===e){if(Object(i)!==i)return;l=!1}else for(;!(l=(n=o.call(i)).done)&&(a.push(n.value),a.length!==e);l=!0);}catch(t){c=!0,r=t}finally{try{if(!l&&null!=i.return&&(s=i.return(),Object(s)!==s))return}finally{if(c)throw r}}return a}}(o,s)||function(t,e){if(t){if("string"==typeof t)return Wa(t,e);var i=Object.prototype.toString.call(t).slice(8,-1);return"Object"===i&&t.constructor&&(i=t.constructor.name),"Map"===i||"Set"===i?Array.from(t):"Arguments"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?Wa(t,e):void 0}}(o,s)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),l=a[0],c=a[1];this.drawTitle();var h=Math.min(l,c)/1.5,u=function(){var t=ya,e=ma,i=null,n=Ns(0),r=Ns(Xs),o=Ns(0);function s(s){var a,l,c,h,u,d=(s=ha(s)).length,f=0,p=new Array(d),g=new Array(d),m=+n.apply(this,arguments),y=Math.min(Xs,Math.max(-Xs,r.apply(this,arguments)-m)),b=Math.min(Math.abs(y)/d,o.apply(this,arguments)),v=b*(y<0?-1:1);for(a=0;a<d;++a)(u=g[p[a]=a]=+t(s[a],a,s))>0&&(f+=u);for(null!=e?p.sort((function(t,i){return e(g[t],g[i])})):null!=i&&p.sort((function(t,e){return i(s[t],s[e])})),a=0,c=f?(y-d*v)/f:0;a<d;++a,m=h)l=p[a],h=m+((u=g[l])>0?u*c:0)+v,g[l]={data:s[l],index:a,value:u,startAngle:m,endAngle:h,padAngle:b};return g}return s.value=function(e){return arguments.length?(t="function"==typeof e?e:Ns(+e),s):t},s.sortValues=function(t){return arguments.length?(e=t,i=null,s):e},s.sort=function(t){return arguments.length?(i=t,e=null,s):i},s.startAngle=function(t){return arguments.length?(n="function"==typeof t?t:Ns(+t),s):n},s.endAngle=function(t){return arguments.length?(r="function"==typeof t?t:Ns(+t),s):r},s.padAngle=function(t){return arguments.length?(o="function"==typeof t?t:Ns(+t),s):o},s}().value((function(t){return t.column2})),d=ca().outerRadius(h-10).innerRadius(0),f=(ca().outerRadius(h).innerRadius(h-80),this.g.selectAll(".arc").data(u(this.data)).enter().append("g").attr("class","arc")),p=Mn().domain(this.data).range(this.colorRange);return f.append("path").attr("d",d).attr("fill",(function(t){return p(t.data.column1)})),f.append("text").attr("transform",(function(t){return"translate("+(h+50)*Math.sin((t.endAngle-t.startAngle)/2+t.startAngle)+", "+-1*(h-10)*Math.cos((t.endAngle-t.startAngle)/2+t.startAngle)+")"})).attr("dy",".5em").text((function(t){return"".concat(t.data.column2," %")})),this.options.showLegend&&this.showLegend(this.data.map((function(t){return t.column1})),p,t),this.wrapper.innerHTML}}],i&&$a(e.prototype,i),Object.defineProperty(e,"prototype",{writable:!1}),s}(Ea);function Xa(t){return Xa="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Xa(t)}function qa(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,n=new Array(e);i<e;i++)n[i]=t[i];return n}function Za(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,(void 0,r=function(t,e){if("object"!==Xa(t)||null===t)return t;var i=t[Symbol.toPrimitive];if(void 0!==i){var n=i.call(t,"string");if("object"!==Xa(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(n.key),"symbol"===Xa(r)?r:String(r)),n)}var r}function Ka(t,e){return Ka=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},Ka(t,e)}function Qa(t){return Qa=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},Qa(t)}var Ja=function(t){!function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&Ka(t,e)}(s,t);var e,i,n,r,o=(n=s,r=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}}(),function(){var t,e=Qa(n);if(r){var i=Qa(this).constructor;t=Reflect.construct(e,arguments,i)}else t=e.apply(this,arguments);return function(t,e){if(e&&("object"===Xa(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t)}(this,t)});function s(){var t,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",i=arguments.length>1?arguments[1]:void 0,n=arguments.length>2?arguments[2]:void 0,r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};return function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,s),r.transform&&(n=(null!==(t=n)&&void 0!==t?t:[]).map(r.transform)),o.call(this,e,i,n,r)}return e=s,i=[{key:"plot",value:function(t,e,i){var n,r,o=(n=this.clearAndScaleSvg(t,e),r=2,function(t){if(Array.isArray(t))return t}(n)||function(t,e){var i=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=i){var n,r,o,s,a=[],l=!0,c=!1;try{if(o=(i=i.call(t)).next,0===e){if(Object(i)!==i)return;l=!1}else for(;!(l=(n=o.call(i)).done)&&(a.push(n.value),a.length!==e);l=!0);}catch(t){c=!0,r=t}finally{try{if(!l&&null!=i.return&&(s=i.return(),Object(s)!==s))return}finally{if(c)throw r}}return a}}(n,r)||function(t,e){if(t){if("string"==typeof t)return qa(t,e);var i=Object.prototype.toString.call(t).slice(8,-1);return"Object"===i&&t.constructor&&(i=t.constructor.name),"Map"===i||"Set"===i?Array.from(t):"Arguments"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?qa(t,e):void 0}}(n,r)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),s=o[0],a=o[1];if(this.drawTitle(),!this.dataIsValid)return this.showErrorMessage(t,e),this.wrapper.innerHTML;var l=Ps().domain(j(this.data,(function(t){return t.column1}))).range([0,s]);this.appendXAxis(l,a),this.appendXAxisLabel(s,a),this.appendYAxisLabel();var c=fr().domain([0,R(this.data,(function(t){return+t.column2}))]).range([a,0]);this.g.append("g").call(it(c));var h=Mn().range(this.colorRange);return this.g.append("path").datum(this.data).attr("fill",(function(t){return h(t.column2)})).attr("class","chart-area").attr("d",function(t,e,i){var n=null,r=Ns(!0),o=null,s=da,a=null,l=ia(c);function c(c){var h,u,d,f,p,g=(c=ha(c)).length,m=!1,y=new Array(g),b=new Array(g);for(null==o&&(a=s(p=l())),h=0;h<=g;++h){if(!(h<g&&r(f=c[h],h,c))===m)if(m=!m)u=h,a.areaStart(),a.lineStart();else{for(a.lineEnd(),a.lineStart(),d=h-1;d>=u;--d)a.point(y[d],b[d]);a.lineEnd(),a.areaEnd()}m&&(y[h]=+t(f,h,c),b[h]=+e(f,h,c),a.point(n?+n(f,h,c):y[h],i?+i(f,h,c):b[h]))}if(p)return a=null,p+""||null}function h(){return ga().defined(r).curve(s).context(o)}return t="function"==typeof t?t:void 0===t?fa:Ns(+t),e="function"==typeof e?e:Ns(void 0===e?0:+e),i="function"==typeof i?i:void 0===i?pa:Ns(+i),c.x=function(e){return arguments.length?(t="function"==typeof e?e:Ns(+e),n=null,c):t},c.x0=function(e){return arguments.length?(t="function"==typeof e?e:Ns(+e),c):t},c.x1=function(t){return arguments.length?(n=null==t?null:"function"==typeof t?t:Ns(+t),c):n},c.y=function(t){return arguments.length?(e="function"==typeof t?t:Ns(+t),i=null,c):e},c.y0=function(t){return arguments.length?(e="function"==typeof t?t:Ns(+t),c):e},c.y1=function(t){return arguments.length?(i=null==t?null:"function"==typeof t?t:Ns(+t),c):i},c.lineX0=c.lineY0=function(){return h().x(t).y(e)},c.lineY1=function(){return h().x(t).y(i)},c.lineX1=function(){return h().x(n).y(e)},c.defined=function(t){return arguments.length?(r="function"==typeof t?t:Ns(!!t),c):r},c.curve=function(t){return arguments.length?(s=t,null!=o&&(a=s(o)),c):s},c.context=function(t){return arguments.length?(null==t?o=a=null:a=s(o=t),c):o},c}().x((function(t){return l(t.column1)})).y0(c(0)).y1((function(t){return c(t.column2)}))),this.options.showLegend&&this.showLegend(this.data.map((function(t){return t.column1})),h,t),this.wrapper.innerHTML}}],i&&Za(e.prototype,i),Object.defineProperty(e,"prototype",{writable:!1}),s}(Ea);function tl(t){return tl="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},tl(t)}function el(t,e){var i=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),i.push.apply(i,n)}return i}function il(t){for(var e=1;e<arguments.length;e++){var i=null!=arguments[e]?arguments[e]:{};e%2?el(Object(i),!0).forEach((function(e){nl(t,e,i[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(i)):el(Object(i)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(i,e))}))}return t}function nl(t,e,i){return(e=al(e))in t?Object.defineProperty(t,e,{value:i,enumerable:!0,configurable:!0,writable:!0}):t[e]=i,t}function rl(t,e){if(t){if("string"==typeof t)return ol(t,e);var i=Object.prototype.toString.call(t).slice(8,-1);return"Object"===i&&t.constructor&&(i=t.constructor.name),"Map"===i||"Set"===i?Array.from(t):"Arguments"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?ol(t,e):void 0}}function ol(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,n=new Array(e);i<e;i++)n[i]=t[i];return n}function sl(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,al(n.key),n)}}function al(t){var e=function(t,e){if("object"!==tl(t)||null===t)return t;var i=t[Symbol.toPrimitive];if(void 0!==i){var n=i.call(t,"string");if("object"!==tl(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"===tl(e)?e:String(e)}function ll(t,e){return ll=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},ll(t,e)}function cl(t){return cl=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},cl(t)}var hl=function(t){!function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&ll(t,e)}(s,t);var e,i,n,r,o=(n=s,r=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}}(),function(){var t,e=cl(n);if(r){var i=cl(this).constructor;t=Reflect.construct(e,arguments,i)}else t=e.apply(this,arguments);return function(t,e){if(e&&("object"===tl(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t)}(this,t)});function s(t,e,i,n,r){var a,l;return function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,s),r.transform&&(i=(null!==(a=i)&&void 0!==a?a:[]).map(r.transform)),(l=o.call(this,t,e,i,r)).groups=n,l}return e=s,i=[{key:"plot",value:function(t,e,i){var n,r,o=this,s=(n=this.clearAndScaleSvg(t,e),r=2,function(t){if(Array.isArray(t))return t}(n)||function(t,e){var i=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=i){var n,r,o,s,a=[],l=!0,c=!1;try{if(o=(i=i.call(t)).next,0===e){if(Object(i)!==i)return;l=!1}else for(;!(l=(n=o.call(i)).done)&&(a.push(n.value),a.length!==e);l=!0);}catch(t){c=!0,r=t}finally{try{if(!l&&null!=i.return&&(s=i.return(),Object(s)!==s))return}finally{if(c)throw r}}return a}}(n,r)||rl(n,r)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),a=s[0],l=s[1];if(this.drawTitle(),!this.dataIsValid)return this.showErrorMessage(t,e),this.wrapper.innerHTML;var c=Object.keys(this.data.overall[0]),h=Object.keys(this.data),u=Object.keys(this.data).reduce((function(t,e){return[].concat(function(t){return function(t){if(Array.isArray(t))return ol(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||rl(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}(t),[il(il({},o.data[e][0]),{},{group:e})])}),[]),d=function(){var t=Ns([]),e=va,i=ba,n=xa;function r(r){var o,s,a=Array.from(t.apply(this,arguments),_a),l=a.length,c=-1;for(const t of r)for(o=0,++c;o<l;++o)(a[o][c]=[0,+n(t,a[o].key,c,r)]).data=t;for(o=0,s=ha(e(a));o<l;++o)a[s[o]].index=o;return i(a,s),a}return r.keys=function(e){return arguments.length?(t="function"==typeof e?e:Ns(Array.from(e)),r):t},r.value=function(t){return arguments.length?(n="function"==typeof t?t:Ns(+t),r):n},r.order=function(t){return arguments.length?(e=null==t?va:"function"==typeof t?t:Ns(Array.from(t)),r):e},r.offset=function(t){return arguments.length?(i=null==t?ba:t,r):i},r}().keys(c)(u),f=d[0][0][0],p=d[d.length-1][0][1],g=kn().domain(h).range([0,a]).padding([.2]);this.g.append("g").attr("transform","translate(0, ".concat(l,")")).call(et(g).tickSizeOuter(0));var m=fr().domain([f,p]).range([l,0]);this.g.append("g").call(it(m));var y=Mn().domain(["overall"]).range(this.colorRange);return this.g.append("g").selectAll("g").data(d).join("g").attr("fill",(function(t){return y(t.key)})).selectAll("rect").data((function(t){return t})).join("rect").attr("x",(function(t){return g(t.data.group)})).attr("x",(function(t){return g(t.data.group)})).attr("y",(function(t){return m(t[1])})).attr("height",(function(t){return m(t[0])-m(t[1])})).attr("width",g.bandwidth()),this.options.showLegend&&this.showLegend(c,y,t),this.wrapper.innerHTML}}],i&&sl(e.prototype,i),Object.defineProperty(e,"prototype",{writable:!1}),s}(Ea);function ul(t){return ul="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},ul(t)}function dl(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,n=new Array(e);i<e;i++)n[i]=t[i];return n}function fl(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,(void 0,r=function(t,e){if("object"!==ul(t)||null===t)return t;var i=t[Symbol.toPrimitive];if(void 0!==i){var n=i.call(t,"string");if("object"!==ul(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(n.key),"symbol"===ul(r)?r:String(r)),n)}var r}function pl(t,e){return pl=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},pl(t,e)}function gl(t){return gl=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},gl(t)}var ml=function(t){!function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&pl(t,e)}(s,t);var e,i,n,r,o=(n=s,r=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}}(),function(){var t,e=gl(n);if(r){var i=gl(this).constructor;t=Reflect.construct(e,arguments,i)}else t=e.apply(this,arguments);return function(t,e){if(e&&("object"===ul(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t)}(this,t)});function s(t,e,i,n){var r,a,l=n.transform,c=n.x,h=void 0===c?function(t,e){return e}:c,u=n.y,d=void 0===u?function(t){return t}:u,f=n.z,p=void 0===f?function(){return 1}:f,g=n.title,m=n.marginTop,y=void 0===m?0:m,b=n.marginRight,v=void 0===b?0:b,x=n.marginBottom,_=void 0===x?0:x,w=n.marginLeft,M=void 0===w?40:w,k=n.width,S=void 0===k?640:k,O=n.height,D=void 0===O?400:O,E=n.xDomain,P=n.xRange,T=void 0===P?[M,S-v]:P,C=n.xPadding,A=void 0===C?.1:C,j=n.yType,R=void 0===j?fr:j,L=n.yDomain,z=n.yRange,N=void 0===z?[D-_,y]:z,I=n.zDomain,H=n.zPadding,U=void 0===H?.05:H,F=n.yFormat,B=n.yLabel,W=n.colors,$=void 0===W?As:W,V=n.drawLegend,Y=void 0===V||V;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,s),l&&(i=(null!==(r=i)&&void 0!==r?r:[]).map(l));var G={transform:l,x:h,y:d,z:p,title:g,marginTop:y,marginRight:v,marginBottom:_,marginLeft:M,width:S,height:D,xDomain:E,xRange:T,xPadding:A,yType:R,yDomain:L,yRange:N,zDomain:I,zPadding:U,yFormat:F,yLabel:B,colors:$,drawLegend:Y};return(a=o.call(this,g,e,i,G)).options=G,a.data=i,a.wrapper=document.createElement("div"),a.svg=zs(a.wrapper).append("svg"),a}return e=s,i=[{key:"plot",value:function(t,e,i){var n,r,o,s=this,a=(r=this.clearAndScaleSvg(t,e),o=2,function(t){if(Array.isArray(t))return t}(r)||function(t,e){var i=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=i){var n,r,o,s,a=[],l=!0,c=!1;try{if(o=(i=i.call(t)).next,0===e){if(Object(i)!==i)return;l=!1}else for(;!(l=(n=o.call(i)).done)&&(a.push(n.value),a.length!==e);l=!0);}catch(t){c=!0,r=t}finally{try{if(!l&&null!=i.return&&(s=i.return(),Object(s)!==s))return}finally{if(c)throw r}}return a}}(r,o)||function(t,e){if(t){if("string"==typeof t)return dl(t,e);var i=Object.prototype.toString.call(t).slice(8,-1);return"Object"===i&&t.constructor&&(i=t.constructor.name),"Map"===i||"Set"===i?Array.from(t):"Arguments"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?dl(t,e):void 0}}(r,o)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),l=a[0],c=a[1],h=this.options,u=h.x,d=h.y,f=h.z,p=h.title,g=h.marginTop,m=h.marginRight,y=h.marginBottom,b=h.marginLeft,v=h.width,x=h.height,_=h.xDomain,w=h.xRange,M=h.xPadding,k=h.yType,S=h.yDomain,O=h.yRange,D=h.zDomain,E=h.zPadding,P=h.yFormat,T=h.yLabel,C=h.colors,A=h.drawLegend;v=l,x=c+150,g=15*(null!==(n=D)&&void 0!==n?n:[]).length,m=this.marginRight,O=[x-(y=this.marginBottom),g],w=[b,v-m];var j=this.data,N=z(j,u),H=z(j,d),U=z(j,f);void 0===_&&(_=N),void 0===S&&(S=[0,R(H)]),void 0===D&&(D=U),_=new I(_),D=new I(D);var F=L(N.length).filter((function(t){return _.has(N[t])&&D.has(U[t])})),B=kn(_,w).paddingInner(M),W=kn(D,[0,B.bandwidth()]).padding(E),$=k(S,O),V=Mn(D,C),Y=et(B).tickSizeOuter(0),G=it($).ticks(x/60,P);if(void 0===p){var X=$.tickFormat(100,P);p=function(t){return"".concat(N[t],"\n").concat(U[t],"\n").concat(X(H[t]))}}else{var q=z(j,(function(t){return t})),Z=p;p=function(t){return Z(q[t],t,j)}}if(this.g.append("g").attr("transform","translate(".concat(b,",0)")).call(G).call((function(t){return t.select(".domain").remove()})).call((function(t){return t.selectAll(".tick line").clone().attr("x2",v-b-m).attr("stroke-opacity",.1)})).call((function(t){return t.append("text").attr("x",-b).attr("y",100).attr("fill","currentColor").attr("text-anchor","start").text(T)})),this.g.append("g").selectAll("rect").data(F).join("rect").attr("x",(function(t){return B(N[t])+W(U[t])})).attr("y",(function(t){return $(H[t])})).attr("width",W.bandwidth()).attr("height",(function(t){return $(0)-$(H[t])})).attr("fill",(function(t){return V(U[t])})),A){var K,Q=2;(null!==(K=D)&&void 0!==K?K:[]).forEach((function(t){Q+=1;var e=V(t),i=15*Q/2,n=Q%2?0:200;s.g.append("circle").attr("cx",n).attr("cy",i).attr("r",5).style("fill",e),s.g.append("text").attr("x",n+10).attr("y",i+4).text(t).style("font-size","15px").attr("alignment-baseline","middle")}))}return p&&this.g.append("title").text(p),this.g.append("g").attr("transform","translate(0,".concat(x-y,")")).call(Y),this.wrapper.innerHTML}}],i&&fl(e.prototype,i),Object.defineProperty(e,"prototype",{writable:!1}),s}(Ea);function yl(t){return yl="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},yl(t)}function bl(t,e){var i=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),i.push.apply(i,n)}return i}function vl(t){for(var e=1;e<arguments.length;e++){var i=null!=arguments[e]?arguments[e]:{};e%2?bl(Object(i),!0).forEach((function(e){xl(t,e,i[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(i)):bl(Object(i)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(i,e))}))}return t}function xl(t,e,i){return(e=Sl(e))in t?Object.defineProperty(t,e,{value:i,enumerable:!0,configurable:!0,writable:!0}):t[e]=i,t}function _l(t){return function(t){if(Array.isArray(t))return Ml(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||wl(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function wl(t,e){if(t){if("string"==typeof t)return Ml(t,e);var i=Object.prototype.toString.call(t).slice(8,-1);return"Object"===i&&t.constructor&&(i=t.constructor.name),"Map"===i||"Set"===i?Array.from(t):"Arguments"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?Ml(t,e):void 0}}function Ml(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,n=new Array(e);i<e;i++)n[i]=t[i];return n}function kl(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,Sl(n.key),n)}}function Sl(t){var e=function(t,e){if("object"!==yl(t)||null===t)return t;var i=t[Symbol.toPrimitive];if(void 0!==i){var n=i.call(t,"string");if("object"!==yl(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"===yl(e)?e:String(e)}function Ol(t,e){return Ol=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},Ol(t,e)}function Dl(t){return Dl=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},Dl(t)}var El=function(t){!function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&Ol(t,e)}(s,t);var e,i,n,r,o=(n=s,r=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}}(),function(){var t,e=Dl(n);if(r){var i=Dl(this).constructor;t=Reflect.construct(e,arguments,i)}else t=e.apply(this,arguments);return function(t,e){if(e&&("object"===yl(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t)}(this,t)});function s(t,e,i){var n,r,a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},l=a.title,c=a.marginTop,h=void 0===c?0:c,u=a.marginRight,d=void 0===u?0:u,f=a.marginBottom,p=void 0===f?0:f,g=a.marginLeft,m=void 0===g?40:g,y=a.width,b=void 0===y?640:y,v=a.height,x=void 0===v?400:v,_=(a.xDomain,a.xRange),w=void 0===_?[m,b-d]:_,M=a.xPadding,k=void 0===M?.1:M,S=a.yType,O=void 0===S?fr:S,D=a.yDomain,E=a.yRange,P=void 0===E?[x-p,h]:E,T=a.zDomain,C=a.zPadding,A=void 0===C?.05:C,j=a.yFormat,R=a.yLabel,L=(a.colors,a.drawLegend),z=void 0===L||L;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,s);var N=Object.keys(i).reduce((function(t,e){return[].concat(_l(t),[vl(vl({},i[e]),{},{name:e})])}),[]),I=Array.from(new Set(N.flatMap((function(t){return Object.keys(t)})))).filter((function(t){return"name"!=t})),H=N.reduce((function(t,e){return[].concat(_l(t),[e.name])}),[]),U=I.flatMap((function(t){return N.map((function(e){return{name:e.name,category:t,value:e[t]}}))})),F=(xl(n={x:function(t){return t.name},y:function(t){return t.value},z:function(t){return t.category},title:l,marginTop:h,marginRight:d,marginBottom:p,marginLeft:m,width:b,height:x,xRange:w,xPadding:k,yType:O,yDomain:D,yRange:P,zDomain:T,zPadding:A,yFormat:j,yLabel:R,drawLegend:z,xDomain:H},"zDomain",I),xl(n,"colors",Rs[I.length<10?10:I.length]),n);return(r=o.call(this,l,e,U,F)).options=F,r.dataFlatted=U,r.wrapper=document.createElement("div"),r.svg=zs(r.wrapper).append("svg"),r}return e=s,i=[{key:"plot",value:function(t,e,i){var n,r,o,s=this,a=(r=this.clearAndScaleSvg(t,e),o=2,function(t){if(Array.isArray(t))return t}(r)||function(t,e){var i=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=i){var n,r,o,s,a=[],l=!0,c=!1;try{if(o=(i=i.call(t)).next,0===e){if(Object(i)!==i)return;l=!1}else for(;!(l=(n=o.call(i)).done)&&(a.push(n.value),a.length!==e);l=!0);}catch(t){c=!0,r=t}finally{try{if(!l&&null!=i.return&&(s=i.return(),Object(s)!==s))return}finally{if(c)throw r}}return a}}(r,o)||wl(r,o)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),l=a[0],c=a[1],h=this.options,u=h.x,d=h.y,f=h.z,p=h.title,g=h.marginTop,m=h.marginRight,y=h.marginBottom,b=h.marginLeft,v=h.width,x=h.height,_=h.xDomain,w=h.xRange,M=h.xPadding,k=h.yType,S=h.yDomain,O=h.yRange,D=h.zDomain,E=h.zPadding,P=h.yFormat,T=h.yLabel,C=h.colors,A=h.drawLegend;v=l,x=c+150,g=15*(null!==(n=D)&&void 0!==n?n:[]).length,m=this.marginRight,O=[x-(y=this.marginBottom),g],w=[b,v-m];var j=this.dataFlatted,N=z(j,u),H=z(j,d),U=z(j,f);void 0===_&&(_=N),void 0===S&&(S=[0,R(H)]),void 0===D&&(D=U),_=new I(_),D=new I(D);var F=L(N.length).filter((function(t){return _.has(N[t])&&D.has(U[t])})),B=kn(_,w).paddingInner(M),W=kn(D,[0,B.bandwidth()]).padding(E),$=k(S,O),V=Mn(D,C),Y=et(B).tickSizeOuter(0),G=it($).ticks(x/60,P);if(void 0===p){var X=$.tickFormat(100,P);p=function(t){return"".concat(N[t],"\n").concat(U[t],"\n").concat(X(H[t]))}}else{var q=z(j,(function(t){return t})),Z=p;p=function(t){return Z(q[t],t,j)}}if(this.g.append("g").attr("transform","translate(".concat(b,",0)")).call(G).call((function(t){return t.select(".domain").remove()})).call((function(t){return t.selectAll(".tick line").clone().attr("x2",v-b-m).attr("stroke-opacity",.1)})).call((function(t){return t.append("text").attr("x",-b).attr("y",100).attr("fill","currentColor").attr("text-anchor","start").text(T)})),this.g.append("g").selectAll("rect").data(F).join("rect").attr("x",(function(t){return B(N[t])+W(U[t])})).attr("y",(function(t){return $(H[t])})).attr("width",W.bandwidth()).attr("height",(function(t){return $(0)-$(H[t])})).attr("fill",(function(t){return V(U[t])})),A){var K,Q=2;(null!==(K=D)&&void 0!==K?K:[]).forEach((function(t){Q+=1;var e=V(t),i=15*Q/2,n=Q%2?0:200;s.g.append("circle").attr("cx",n).attr("cy",i).attr("r",5).style("fill",e),s.g.append("text").attr("x",n+10).attr("y",i+4).text(t).style("font-size","15px").attr("alignment-baseline","middle")}))}return p&&this.g.append("title").text(p),this.g.append("g").attr("transform","translate(0,".concat(x-y,")")).call(Y),this.wrapper.innerHTML}}],i&&kl(e.prototype,i),Object.defineProperty(e,"prototype",{writable:!1}),s}(Ea);function Pl(t){return t+.5|0}const Tl=(t,e,i)=>Math.max(Math.min(t,i),e);function Cl(t){return Tl(Pl(2.55*t),0,255)}function Al(t){return Tl(Pl(255*t),0,255)}function jl(t){return Tl(Pl(t/2.55)/100,0,1)}function Rl(t){return Tl(Pl(100*t),0,100)}const Ll={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,A:10,B:11,C:12,D:13,E:14,F:15,a:10,b:11,c:12,d:13,e:14,f:15},zl=[..."0123456789ABCDEF"],Nl=t=>zl[15&t],Il=t=>zl[(240&t)>>4]+zl[15&t],Hl=t=>(240&t)>>4==(15&t);const Ul=/^(hsla?|hwb|hsv)\(\s*([-+.e\d]+)(?:deg)?[\s,]+([-+.e\d]+)%[\s,]+([-+.e\d]+)%(?:[\s,]+([-+.e\d]+)(%)?)?\s*\)$/;function Fl(t,e,i){const n=e*Math.min(i,1-i),r=(e,r=(e+t/30)%12)=>i-n*Math.max(Math.min(r-3,9-r,1),-1);return[r(0),r(8),r(4)]}function Bl(t,e,i){const n=(n,r=(n+t/60)%6)=>i-i*e*Math.max(Math.min(r,4-r,1),0);return[n(5),n(3),n(1)]}function Wl(t,e,i){const n=Fl(t,1,.5);let r;for(e+i>1&&(r=1/(e+i),e*=r,i*=r),r=0;r<3;r++)n[r]*=1-e-i,n[r]+=e;return n}function $l(t){const e=t.r/255,i=t.g/255,n=t.b/255,r=Math.max(e,i,n),o=Math.min(e,i,n),s=(r+o)/2;let a,l,c;return r!==o&&(c=r-o,l=s>.5?c/(2-r-o):c/(r+o),a=function(t,e,i,n,r){return t===r?(e-i)/n+(e<i?6:0):e===r?(i-t)/n+2:(t-e)/n+4}(e,i,n,c,r),a=60*a+.5),[0|a,l||0,s]}function Vl(t,e,i,n){return(Array.isArray(e)?t(e[0],e[1],e[2]):t(e,i,n)).map(Al)}function Yl(t,e,i){return Vl(Fl,t,e,i)}function Gl(t){return(t%360+360)%360}const Xl={x:"dark",Z:"light",Y:"re",X:"blu",W:"gr",V:"medium",U:"slate",A:"ee",T:"ol",S:"or",B:"ra",C:"lateg",D:"ights",R:"in",Q:"turquois",E:"hi",P:"ro",O:"al",N:"le",M:"de",L:"yello",F:"en",K:"ch",G:"arks",H:"ea",I:"ightg",J:"wh"},ql={OiceXe:"f0f8ff",antiquewEte:"faebd7",aqua:"ffff",aquamarRe:"7fffd4",azuY:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"0",blanKedOmond:"ffebcd",Xe:"ff",XeviTet:"8a2be2",bPwn:"a52a2a",burlywood:"deb887",caMtXe:"5f9ea0",KartYuse:"7fff00",KocTate:"d2691e",cSO:"ff7f50",cSnflowerXe:"6495ed",cSnsilk:"fff8dc",crimson:"dc143c",cyan:"ffff",xXe:"8b",xcyan:"8b8b",xgTMnPd:"b8860b",xWay:"a9a9a9",xgYF:"6400",xgYy:"a9a9a9",xkhaki:"bdb76b",xmagFta:"8b008b",xTivegYF:"556b2f",xSange:"ff8c00",xScEd:"9932cc",xYd:"8b0000",xsOmon:"e9967a",xsHgYF:"8fbc8f",xUXe:"483d8b",xUWay:"2f4f4f",xUgYy:"2f4f4f",xQe:"ced1",xviTet:"9400d3",dAppRk:"ff1493",dApskyXe:"bfff",dimWay:"696969",dimgYy:"696969",dodgerXe:"1e90ff",fiYbrick:"b22222",flSOwEte:"fffaf0",foYstWAn:"228b22",fuKsia:"ff00ff",gaRsbSo:"dcdcdc",ghostwEte:"f8f8ff",gTd:"ffd700",gTMnPd:"daa520",Way:"808080",gYF:"8000",gYFLw:"adff2f",gYy:"808080",honeyMw:"f0fff0",hotpRk:"ff69b4",RdianYd:"cd5c5c",Rdigo:"4b0082",ivSy:"fffff0",khaki:"f0e68c",lavFMr:"e6e6fa",lavFMrXsh:"fff0f5",lawngYF:"7cfc00",NmoncEffon:"fffacd",ZXe:"add8e6",ZcSO:"f08080",Zcyan:"e0ffff",ZgTMnPdLw:"fafad2",ZWay:"d3d3d3",ZgYF:"90ee90",ZgYy:"d3d3d3",ZpRk:"ffb6c1",ZsOmon:"ffa07a",ZsHgYF:"20b2aa",ZskyXe:"87cefa",ZUWay:"778899",ZUgYy:"778899",ZstAlXe:"b0c4de",ZLw:"ffffe0",lime:"ff00",limegYF:"32cd32",lRF:"faf0e6",magFta:"ff00ff",maPon:"800000",VaquamarRe:"66cdaa",VXe:"cd",VScEd:"ba55d3",VpurpN:"9370db",VsHgYF:"3cb371",VUXe:"7b68ee",VsprRggYF:"fa9a",VQe:"48d1cc",VviTetYd:"c71585",midnightXe:"191970",mRtcYam:"f5fffa",mistyPse:"ffe4e1",moccasR:"ffe4b5",navajowEte:"ffdead",navy:"80",Tdlace:"fdf5e6",Tive:"808000",TivedBb:"6b8e23",Sange:"ffa500",SangeYd:"ff4500",ScEd:"da70d6",pOegTMnPd:"eee8aa",pOegYF:"98fb98",pOeQe:"afeeee",pOeviTetYd:"db7093",papayawEp:"ffefd5",pHKpuff:"ffdab9",peru:"cd853f",pRk:"ffc0cb",plum:"dda0dd",powMrXe:"b0e0e6",purpN:"800080",YbeccapurpN:"663399",Yd:"ff0000",Psybrown:"bc8f8f",PyOXe:"4169e1",saddNbPwn:"8b4513",sOmon:"fa8072",sandybPwn:"f4a460",sHgYF:"2e8b57",sHshell:"fff5ee",siFna:"a0522d",silver:"c0c0c0",skyXe:"87ceeb",UXe:"6a5acd",UWay:"708090",UgYy:"708090",snow:"fffafa",sprRggYF:"ff7f",stAlXe:"4682b4",tan:"d2b48c",teO:"8080",tEstN:"d8bfd8",tomato:"ff6347",Qe:"40e0d0",viTet:"ee82ee",JHt:"f5deb3",wEte:"ffffff",wEtesmoke:"f5f5f5",Lw:"ffff00",LwgYF:"9acd32"};let Zl;const Kl=/^rgba?\(\s*([-+.\d]+)(%)?[\s,]+([-+.e\d]+)(%)?[\s,]+([-+.e\d]+)(%)?(?:[\s,/]+([-+.e\d]+)(%)?)?\s*\)$/,Ql=t=>t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-.055,Jl=t=>t<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4);function tc(t,e,i){if(t){let n=$l(t);n[e]=Math.max(0,Math.min(n[e]+n[e]*i,0===e?360:1)),n=Yl(n),t.r=n[0],t.g=n[1],t.b=n[2]}}function ec(t,e){return t?Object.assign(e||{},t):t}function ic(t){var e={r:0,g:0,b:0,a:255};return Array.isArray(t)?t.length>=3&&(e={r:t[0],g:t[1],b:t[2],a:255},t.length>3&&(e.a=Al(t[3]))):(e=ec(t,{r:0,g:0,b:0,a:1})).a=Al(e.a),e}function nc(t){return"r"===t.charAt(0)?function(t){const e=Kl.exec(t);let i,n,r,o=255;if(e){if(e[7]!==i){const t=+e[7];o=e[8]?Cl(t):Tl(255*t,0,255)}return i=+e[1],n=+e[3],r=+e[5],i=255&(e[2]?Cl(i):Tl(i,0,255)),n=255&(e[4]?Cl(n):Tl(n,0,255)),r=255&(e[6]?Cl(r):Tl(r,0,255)),{r:i,g:n,b:r,a:o}}}(t):function(t){const e=Ul.exec(t);let i,n=255;if(!e)return;e[5]!==i&&(n=e[6]?Cl(+e[5]):Al(+e[5]));const r=Gl(+e[2]),o=+e[3]/100,s=+e[4]/100;return i="hwb"===e[1]?function(t,e,i){return Vl(Wl,t,e,i)}(r,o,s):"hsv"===e[1]?function(t,e,i){return Vl(Bl,t,e,i)}(r,o,s):Yl(r,o,s),{r:i[0],g:i[1],b:i[2],a:n}}(t)}class rc{constructor(t){if(t instanceof rc)return t;const e=typeof t;let i;var n,r,o;"object"===e?i=ic(t):"string"===e&&(o=(n=t).length,"#"===n[0]&&(4===o||5===o?r={r:255&17*Ll[n[1]],g:255&17*Ll[n[2]],b:255&17*Ll[n[3]],a:5===o?17*Ll[n[4]]:255}:7!==o&&9!==o||(r={r:Ll[n[1]]<<4|Ll[n[2]],g:Ll[n[3]]<<4|Ll[n[4]],b:Ll[n[5]]<<4|Ll[n[6]],a:9===o?Ll[n[7]]<<4|Ll[n[8]]:255})),i=r||function(t){Zl||(Zl=function(){const t={},e=Object.keys(ql),i=Object.keys(Xl);let n,r,o,s,a;for(n=0;n<e.length;n++){for(s=a=e[n],r=0;r<i.length;r++)o=i[r],a=a.replace(o,Xl[o]);o=parseInt(ql[s],16),t[a]=[o>>16&255,o>>8&255,255&o]}return t}(),Zl.transparent=[0,0,0,0]);const e=Zl[t.toLowerCase()];return e&&{r:e[0],g:e[1],b:e[2],a:4===e.length?e[3]:255}}(t)||nc(t)),this._rgb=i,this._valid=!!i}get valid(){return this._valid}get rgb(){var t=ec(this._rgb);return t&&(t.a=jl(t.a)),t}set rgb(t){this._rgb=ic(t)}rgbString(){return this._valid?(t=this._rgb)&&(t.a<255?`rgba(${t.r}, ${t.g}, ${t.b}, ${jl(t.a)})`:`rgb(${t.r}, ${t.g}, ${t.b})`):void 0;var t}hexString(){return this._valid?(t=this._rgb,e=(t=>Hl(t.r)&&Hl(t.g)&&Hl(t.b)&&Hl(t.a))(t)?Nl:Il,t?"#"+e(t.r)+e(t.g)+e(t.b)+((t,e)=>t<255?e(t):"")(t.a,e):void 0):void 0;var t,e}hslString(){return this._valid?function(t){if(!t)return;const e=$l(t),i=e[0],n=Rl(e[1]),r=Rl(e[2]);return t.a<255?`hsla(${i}, ${n}%, ${r}%, ${jl(t.a)})`:`hsl(${i}, ${n}%, ${r}%)`}(this._rgb):void 0}mix(t,e){if(t){const i=this.rgb,n=t.rgb;let r;const o=e===r?.5:e,s=2*o-1,a=i.a-n.a,l=((s*a==-1?s:(s+a)/(1+s*a))+1)/2;r=1-l,i.r=255&l*i.r+r*n.r+.5,i.g=255&l*i.g+r*n.g+.5,i.b=255&l*i.b+r*n.b+.5,i.a=o*i.a+(1-o)*n.a,this.rgb=i}return this}interpolate(t,e){return t&&(this._rgb=function(t,e,i){const n=Jl(jl(t.r)),r=Jl(jl(t.g)),o=Jl(jl(t.b));return{r:Al(Ql(n+i*(Jl(jl(e.r))-n))),g:Al(Ql(r+i*(Jl(jl(e.g))-r))),b:Al(Ql(o+i*(Jl(jl(e.b))-o))),a:t.a+i*(e.a-t.a)}}(this._rgb,t._rgb,e)),this}clone(){return new rc(this.rgb)}alpha(t){return this._rgb.a=Al(t),this}clearer(t){return this._rgb.a*=1-t,this}greyscale(){const t=this._rgb,e=Pl(.3*t.r+.59*t.g+.11*t.b);return t.r=t.g=t.b=e,this}opaquer(t){return this._rgb.a*=1+t,this}negate(){const t=this._rgb;return t.r=255-t.r,t.g=255-t.g,t.b=255-t.b,this}lighten(t){return tc(this._rgb,2,t),this}darken(t){return tc(this._rgb,2,-t),this}saturate(t){return tc(this._rgb,1,t),this}desaturate(t){return tc(this._rgb,1,-t),this}rotate(t){return function(t,e){var i=$l(t);i[0]=Gl(i[0]+e),i=Yl(i),t.r=i[0],t.g=i[1],t.b=i[2]}(this._rgb,t),this}}function oc(){}const sc=(()=>{let t=0;return()=>t++})();function ac(t){return null==t}function lc(t){if(Array.isArray&&Array.isArray(t))return!0;const e=Object.prototype.toString.call(t);return"[object"===e.slice(0,7)&&"Array]"===e.slice(-6)}function cc(t){return null!==t&&"[object Object]"===Object.prototype.toString.call(t)}function hc(t){return("number"==typeof t||t instanceof Number)&&isFinite(+t)}function uc(t,e){return hc(t)?t:e}function dc(t,e){return void 0===t?e:t}const fc=(t,e)=>"string"==typeof t&&t.endsWith("%")?parseFloat(t)/100*e:+t;function pc(t,e,i){if(t&&"function"==typeof t.call)return t.apply(i,e)}function gc(t,e,i,n){let r,o,s;if(lc(t))if(o=t.length,n)for(r=o-1;r>=0;r--)e.call(i,t[r],r);else for(r=0;r<o;r++)e.call(i,t[r],r);else if(cc(t))for(s=Object.keys(t),o=s.length,r=0;r<o;r++)e.call(i,t[s[r]],s[r])}function mc(t,e){let i,n,r,o;if(!t||!e||t.length!==e.length)return!1;for(i=0,n=t.length;i<n;++i)if(r=t[i],o=e[i],r.datasetIndex!==o.datasetIndex||r.index!==o.index)return!1;return!0}function yc(t){if(lc(t))return t.map(yc);if(cc(t)){const e=Object.create(null),i=Object.keys(t),n=i.length;let r=0;for(;r<n;++r)e[i[r]]=yc(t[i[r]]);return e}return t}function bc(t){return-1===["__proto__","prototype","constructor"].indexOf(t)}function vc(t,e,i,n){if(!bc(t))return;const r=e[t],o=i[t];cc(r)&&cc(o)?xc(r,o,n):e[t]=yc(o)}function xc(t,e,i){const n=lc(e)?e:[e],r=n.length;if(!cc(t))return t;const o=(i=i||{}).merger||vc;let s;for(let e=0;e<r;++e){if(s=n[e],!cc(s))continue;const r=Object.keys(s);for(let e=0,n=r.length;e<n;++e)o(r[e],t,s,i)}return t}function _c(t,e){return xc(t,e,{merger:wc})}function wc(t,e,i){if(!bc(t))return;const n=e[t],r=i[t];cc(n)&&cc(r)?_c(n,r):Object.prototype.hasOwnProperty.call(e,t)||(e[t]=yc(r))}const Mc={"":t=>t,x:t=>t.x,y:t=>t.y};function kc(t,e){const i=Mc[e]||(Mc[e]=function(t){const e=function(t){const e=t.split("."),i=[];let n="";for(const t of e)n+=t,n.endsWith("\\")?n=n.slice(0,-1)+".":(i.push(n),n="");return i}(t);return t=>{for(const i of e){if(""===i)break;t=t&&t[i]}return t}}(e));return i(t)}function Sc(t){return t.charAt(0).toUpperCase()+t.slice(1)}const Oc=t=>void 0!==t,Dc=t=>"function"==typeof t,Ec=(t,e)=>{if(t.size!==e.size)return!1;for(const i of t)if(!e.has(i))return!1;return!0},Pc=Math.PI,Tc=2*Pc,Cc=Tc+Pc,Ac=Number.POSITIVE_INFINITY,jc=Pc/180,Rc=Pc/2,Lc=Pc/4,zc=2*Pc/3,Nc=Math.log10,Ic=Math.sign;function Hc(t,e,i){return Math.abs(t-e)<i}function Uc(t){const e=Math.round(t);t=Hc(t,e,t/1e3)?e:t;const i=Math.pow(10,Math.floor(Nc(t))),n=t/i;return(n<=1?1:n<=2?2:n<=5?5:10)*i}function Fc(t){return!isNaN(parseFloat(t))&&isFinite(t)}function Bc(t,e,i){let n,r,o;for(n=0,r=t.length;n<r;n++)o=t[n][i],isNaN(o)||(e.min=Math.min(e.min,o),e.max=Math.max(e.max,o))}function Wc(t){return t*(Pc/180)}function $c(t){return t*(180/Pc)}function Vc(t){if(!hc(t))return;let e=1,i=0;for(;Math.round(t*e)/e!==t;)e*=10,i++;return i}function Yc(t,e){const i=e.x-t.x,n=e.y-t.y,r=Math.sqrt(i*i+n*n);let o=Math.atan2(n,i);return o<-.5*Pc&&(o+=Tc),{angle:o,distance:r}}function Gc(t,e){return Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))}function Xc(t,e){return(t-e+Cc)%Tc-Pc}function qc(t){return(t%Tc+Tc)%Tc}function Zc(t,e,i,n){const r=qc(t),o=qc(e),s=qc(i),a=qc(o-r),l=qc(s-r),c=qc(r-o),h=qc(r-s);return r===o||r===s||n&&o===s||a>l&&c<h}function Kc(t,e,i){return Math.max(e,Math.min(i,t))}function Qc(t,e,i,n=1e-6){return t>=Math.min(e,i)-n&&t<=Math.max(e,i)+n}function Jc(t,e,i){i=i||(i=>t[i]<e);let n,r=t.length-1,o=0;for(;r-o>1;)n=o+r>>1,i(n)?o=n:r=n;return{lo:o,hi:r}}const th=(t,e,i,n)=>Jc(t,i,n?n=>{const r=t[n][e];return r<i||r===i&&t[n+1][e]===i}:n=>t[n][e]<i),eh=(t,e,i)=>Jc(t,i,(n=>t[n][e]>=i)),ih=["push","pop","shift","splice","unshift"];function nh(t,e){const i=t._chartjs;if(!i)return;const n=i.listeners,r=n.indexOf(e);-1!==r&&n.splice(r,1),n.length>0||(ih.forEach((e=>{delete t[e]})),delete t._chartjs)}function rh(t){const e=new Set(t);return e.size===t.length?t:Array.from(e)}const oh="undefined"==typeof window?function(t){return t()}:window.requestAnimationFrame;function sh(t,e){let i=[],n=!1;return function(...r){i=r,n||(n=!0,oh.call(window,(()=>{n=!1,t.apply(e,i)})))}}const ah=t=>"start"===t?"left":"end"===t?"right":"center",lh=(t,e,i)=>"start"===t?e:"end"===t?i:(e+i)/2;function ch(t,e,i){const n=e.length;let r=0,o=n;if(t._sorted){const{iScale:s,_parsed:a}=t,l=s.axis,{min:c,max:h,minDefined:u,maxDefined:d}=s.getUserBounds();u&&(r=Kc(Math.min(th(a,l,c).lo,i?n:th(e,l,s.getPixelForValue(c)).lo),0,n-1)),o=d?Kc(Math.max(th(a,s.axis,h,!0).hi+1,i?0:th(e,l,s.getPixelForValue(h),!0).hi+1),r,n)-r:n-r}return{start:r,count:o}}function hh(t){const{xScale:e,yScale:i,_scaleRanges:n}=t,r={xmin:e.min,xmax:e.max,ymin:i.min,ymax:i.max};if(!n)return t._scaleRanges=r,!0;const o=n.xmin!==e.min||n.xmax!==e.max||n.ymin!==i.min||n.ymax!==i.max;return Object.assign(n,r),o}const uh=t=>0===t||1===t,dh=(t,e,i)=>-Math.pow(2,10*(t-=1))*Math.sin((t-e)*Tc/i),fh=(t,e,i)=>Math.pow(2,-10*t)*Math.sin((t-e)*Tc/i)+1,ph={linear:t=>t,easeInQuad:t=>t*t,easeOutQuad:t=>-t*(t-2),easeInOutQuad:t=>(t/=.5)<1?.5*t*t:-.5*(--t*(t-2)-1),easeInCubic:t=>t*t*t,easeOutCubic:t=>(t-=1)*t*t+1,easeInOutCubic:t=>(t/=.5)<1?.5*t*t*t:.5*((t-=2)*t*t+2),easeInQuart:t=>t*t*t*t,easeOutQuart:t=>-((t-=1)*t*t*t-1),easeInOutQuart:t=>(t/=.5)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2),easeInQuint:t=>t*t*t*t*t,easeOutQuint:t=>(t-=1)*t*t*t*t+1,easeInOutQuint:t=>(t/=.5)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2),easeInSine:t=>1-Math.cos(t*Rc),easeOutSine:t=>Math.sin(t*Rc),easeInOutSine:t=>-.5*(Math.cos(Pc*t)-1),easeInExpo:t=>0===t?0:Math.pow(2,10*(t-1)),easeOutExpo:t=>1===t?1:1-Math.pow(2,-10*t),easeInOutExpo:t=>uh(t)?t:t<.5?.5*Math.pow(2,10*(2*t-1)):.5*(2-Math.pow(2,-10*(2*t-1))),easeInCirc:t=>t>=1?t:-(Math.sqrt(1-t*t)-1),easeOutCirc:t=>Math.sqrt(1-(t-=1)*t),easeInOutCirc:t=>(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1),easeInElastic:t=>uh(t)?t:dh(t,.075,.3),easeOutElastic:t=>uh(t)?t:fh(t,.075,.3),easeInOutElastic(t){const e=.1125;return uh(t)?t:t<.5?.5*dh(2*t,e,.45):.5+.5*fh(2*t-1,e,.45)},easeInBack(t){const e=1.70158;return t*t*((e+1)*t-e)},easeOutBack(t){const e=1.70158;return(t-=1)*t*((e+1)*t+e)+1},easeInOutBack(t){let e=1.70158;return(t/=.5)<1?t*t*((1+(e*=1.525))*t-e)*.5:.5*((t-=2)*t*((1+(e*=1.525))*t+e)+2)},easeInBounce:t=>1-ph.easeOutBounce(1-t),easeOutBounce(t){const e=7.5625,i=2.75;return t<1/i?e*t*t:t<2/i?e*(t-=1.5/i)*t+.75:t<2.5/i?e*(t-=2.25/i)*t+.9375:e*(t-=2.625/i)*t+.984375},easeInOutBounce:t=>t<.5?.5*ph.easeInBounce(2*t):.5*ph.easeOutBounce(2*t-1)+.5};function gh(t){if(t&&"object"==typeof t){const e=t.toString();return"[object CanvasPattern]"===e||"[object CanvasGradient]"===e}return!1}function mh(t){return gh(t)?t:new rc(t)}function yh(t){return gh(t)?t:new rc(t).saturate(.5).darken(.1).hexString()}const bh=["x","y","borderWidth","radius","tension"],vh=["color","borderColor","backgroundColor"],xh=new Map;function _h(t,e,i){return function(t,e){e=e||{};const i=t+JSON.stringify(e);let n=xh.get(i);return n||(n=new Intl.NumberFormat(t,e),xh.set(i,n)),n}(e,i).format(t)}const wh={values:t=>lc(t)?t:""+t,numeric(t,e,i){if(0===t)return"0";const n=this.chart.options.locale;let r,o=t;if(i.length>1){const e=Math.max(Math.abs(i[0].value),Math.abs(i[i.length-1].value));(e<1e-4||e>1e15)&&(r="scientific"),o=function(t,e){let i=e.length>3?e[2].value-e[1].value:e[1].value-e[0].value;return Math.abs(i)>=1&&t!==Math.floor(t)&&(i=t-Math.floor(t)),i}(t,i)}const s=Nc(Math.abs(o)),a=isNaN(s)?1:Math.max(Math.min(-1*Math.floor(s),20),0),l={notation:r,minimumFractionDigits:a,maximumFractionDigits:a};return Object.assign(l,this.options.ticks.format),_h(t,n,l)},logarithmic(t,e,i){if(0===t)return"0";const n=i[e].significand||t/Math.pow(10,Math.floor(Nc(t)));return[1,2,3,5,10,15].includes(n)||e>.8*i.length?wh.numeric.call(this,t,e,i):""}};var Mh={formatters:wh};const kh=Object.create(null),Sh=Object.create(null);function Oh(t,e){if(!e)return t;const i=e.split(".");for(let e=0,n=i.length;e<n;++e){const n=i[e];t=t[n]||(t[n]=Object.create(null))}return t}function Dh(t,e,i){return"string"==typeof e?xc(Oh(t,e),i):xc(Oh(t,""),e)}class Eh{constructor(t,e){this.animation=void 0,this.backgroundColor="rgba(0,0,0,0.1)",this.borderColor="rgba(0,0,0,0.1)",this.color="#666",this.datasets={},this.devicePixelRatio=t=>t.chart.platform.getDevicePixelRatio(),this.elements={},this.events=["mousemove","mouseout","click","touchstart","touchmove"],this.font={family:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",size:12,style:"normal",lineHeight:1.2,weight:null},this.hover={},this.hoverBackgroundColor=(t,e)=>yh(e.backgroundColor),this.hoverBorderColor=(t,e)=>yh(e.borderColor),this.hoverColor=(t,e)=>yh(e.color),this.indexAxis="x",this.interaction={mode:"nearest",intersect:!0,includeInvisible:!1},this.maintainAspectRatio=!0,this.onHover=null,this.onClick=null,this.parsing=!0,this.plugins={},this.responsive=!0,this.scale=void 0,this.scales={},this.showLine=!0,this.drawActiveElementsOnTop=!0,this.describe(t),this.apply(e)}set(t,e){return Dh(this,t,e)}get(t){return Oh(this,t)}describe(t,e){return Dh(Sh,t,e)}override(t,e){return Dh(kh,t,e)}route(t,e,i,n){const r=Oh(this,t),o=Oh(this,i),s="_"+e;Object.defineProperties(r,{[s]:{value:r[e],writable:!0},[e]:{enumerable:!0,get(){const t=this[s],e=o[n];return cc(t)?Object.assign({},e,t):dc(t,e)},set(t){this[s]=t}}})}apply(t){t.forEach((t=>t(this)))}}var Ph=new Eh({_scriptable:t=>!t.startsWith("on"),_indexable:t=>"events"!==t,hover:{_fallback:"interaction"},interaction:{_scriptable:!1,_indexable:!1}},[function(t){t.set("animation",{delay:void 0,duration:1e3,easing:"easeOutQuart",fn:void 0,from:void 0,loop:void 0,to:void 0,type:void 0}),t.describe("animation",{_fallback:!1,_indexable:!1,_scriptable:t=>"onProgress"!==t&&"onComplete"!==t&&"fn"!==t}),t.set("animations",{colors:{type:"color",properties:vh},numbers:{type:"number",properties:bh}}),t.describe("animations",{_fallback:"animation"}),t.set("transitions",{active:{animation:{duration:400}},resize:{animation:{duration:0}},show:{animations:{colors:{from:"transparent"},visible:{type:"boolean",duration:0}}},hide:{animations:{colors:{to:"transparent"},visible:{type:"boolean",easing:"linear",fn:t=>0|t}}}})},function(t){t.set("layout",{autoPadding:!0,padding:{top:0,right:0,bottom:0,left:0}})},function(t){t.set("scale",{display:!0,offset:!1,reverse:!1,beginAtZero:!1,bounds:"ticks",clip:!0,grace:0,grid:{display:!0,lineWidth:1,drawOnChartArea:!0,drawTicks:!0,tickLength:8,tickWidth:(t,e)=>e.lineWidth,tickColor:(t,e)=>e.color,offset:!1},border:{display:!0,dash:[],dashOffset:0,width:1},title:{display:!1,text:"",padding:{top:4,bottom:4}},ticks:{minRotation:0,maxRotation:50,mirror:!1,textStrokeWidth:0,textStrokeColor:"",padding:3,display:!0,autoSkip:!0,autoSkipPadding:3,labelOffset:0,callback:Mh.formatters.values,minor:{},major:{},align:"center",crossAlign:"near",showLabelBackdrop:!1,backdropColor:"rgba(255, 255, 255, 0.75)",backdropPadding:2}}),t.route("scale.ticks","color","","color"),t.route("scale.grid","color","","borderColor"),t.route("scale.border","color","","borderColor"),t.route("scale.title","color","","color"),t.describe("scale",{_fallback:!1,_scriptable:t=>!t.startsWith("before")&&!t.startsWith("after")&&"callback"!==t&&"parser"!==t,_indexable:t=>"borderDash"!==t&&"tickBorderDash"!==t&&"dash"!==t}),t.describe("scales",{_fallback:"scale"}),t.describe("scale.ticks",{_scriptable:t=>"backdropPadding"!==t&&"callback"!==t,_indexable:t=>"backdropPadding"!==t})}]);function Th(t,e,i,n,r){let o=e[r];return o||(o=e[r]=t.measureText(r).width,i.push(r)),o>n&&(n=o),n}function Ch(t,e,i,n){let r=(n=n||{}).data=n.data||{},o=n.garbageCollect=n.garbageCollect||[];n.font!==e&&(r=n.data={},o=n.garbageCollect=[],n.font=e),t.save(),t.font=e;let s=0;const a=i.length;let l,c,h,u,d;for(l=0;l<a;l++)if(u=i[l],null==u||lc(u)){if(lc(u))for(c=0,h=u.length;c<h;c++)d=u[c],null==d||lc(d)||(s=Th(t,r,o,s,d))}else s=Th(t,r,o,s,u);t.restore();const f=o.length/2;if(f>i.length){for(l=0;l<f;l++)delete r[o[l]];o.splice(0,f)}return s}function Ah(t,e,i){const n=t.currentDevicePixelRatio,r=0!==i?Math.max(i/2,.5):0;return Math.round((e-r)*n)/n+r}function jh(t,e){(e=e||t.getContext("2d")).save(),e.resetTransform(),e.clearRect(0,0,t.width,t.height),e.restore()}function Rh(t,e,i,n){Lh(t,e,i,n,null)}function Lh(t,e,i,n,r){let o,s,a,l,c,h,u,d;const f=e.pointStyle,p=e.rotation,g=e.radius;let m=(p||0)*jc;if(f&&"object"==typeof f&&(o=f.toString(),"[object HTMLImageElement]"===o||"[object HTMLCanvasElement]"===o))return t.save(),t.translate(i,n),t.rotate(m),t.drawImage(f,-f.width/2,-f.height/2,f.width,f.height),void t.restore();if(!(isNaN(g)||g<=0)){switch(t.beginPath(),f){default:r?t.ellipse(i,n,r/2,g,0,0,Tc):t.arc(i,n,g,0,Tc),t.closePath();break;case"triangle":h=r?r/2:g,t.moveTo(i+Math.sin(m)*h,n-Math.cos(m)*g),m+=zc,t.lineTo(i+Math.sin(m)*h,n-Math.cos(m)*g),m+=zc,t.lineTo(i+Math.sin(m)*h,n-Math.cos(m)*g),t.closePath();break;case"rectRounded":c=.516*g,l=g-c,s=Math.cos(m+Lc)*l,u=Math.cos(m+Lc)*(r?r/2-c:l),a=Math.sin(m+Lc)*l,d=Math.sin(m+Lc)*(r?r/2-c:l),t.arc(i-u,n-a,c,m-Pc,m-Rc),t.arc(i+d,n-s,c,m-Rc,m),t.arc(i+u,n+a,c,m,m+Rc),t.arc(i-d,n+s,c,m+Rc,m+Pc),t.closePath();break;case"rect":if(!p){l=Math.SQRT1_2*g,h=r?r/2:l,t.rect(i-h,n-l,2*h,2*l);break}m+=Lc;case"rectRot":u=Math.cos(m)*(r?r/2:g),s=Math.cos(m)*g,a=Math.sin(m)*g,d=Math.sin(m)*(r?r/2:g),t.moveTo(i-u,n-a),t.lineTo(i+d,n-s),t.lineTo(i+u,n+a),t.lineTo(i-d,n+s),t.closePath();break;case"crossRot":m+=Lc;case"cross":u=Math.cos(m)*(r?r/2:g),s=Math.cos(m)*g,a=Math.sin(m)*g,d=Math.sin(m)*(r?r/2:g),t.moveTo(i-u,n-a),t.lineTo(i+u,n+a),t.moveTo(i+d,n-s),t.lineTo(i-d,n+s);break;case"star":u=Math.cos(m)*(r?r/2:g),s=Math.cos(m)*g,a=Math.sin(m)*g,d=Math.sin(m)*(r?r/2:g),t.moveTo(i-u,n-a),t.lineTo(i+u,n+a),t.moveTo(i+d,n-s),t.lineTo(i-d,n+s),m+=Lc,u=Math.cos(m)*(r?r/2:g),s=Math.cos(m)*g,a=Math.sin(m)*g,d=Math.sin(m)*(r?r/2:g),t.moveTo(i-u,n-a),t.lineTo(i+u,n+a),t.moveTo(i+d,n-s),t.lineTo(i-d,n+s);break;case"line":s=r?r/2:Math.cos(m)*g,a=Math.sin(m)*g,t.moveTo(i-s,n-a),t.lineTo(i+s,n+a);break;case"dash":t.moveTo(i,n),t.lineTo(i+Math.cos(m)*(r?r/2:g),n+Math.sin(m)*g);break;case!1:t.closePath()}t.fill(),e.borderWidth>0&&t.stroke()}}function zh(t,e,i){return i=i||.5,!e||t&&t.x>e.left-i&&t.x<e.right+i&&t.y>e.top-i&&t.y<e.bottom+i}function Nh(t,e){t.save(),t.beginPath(),t.rect(e.left,e.top,e.right-e.left,e.bottom-e.top),t.clip()}function Ih(t){t.restore()}function Hh(t,e,i,n,r){if(!e)return t.lineTo(i.x,i.y);if("middle"===r){const n=(e.x+i.x)/2;t.lineTo(n,e.y),t.lineTo(n,i.y)}else"after"===r!=!!n?t.lineTo(e.x,i.y):t.lineTo(i.x,e.y);t.lineTo(i.x,i.y)}function Uh(t,e,i,n){if(!e)return t.lineTo(i.x,i.y);t.bezierCurveTo(n?e.cp1x:e.cp2x,n?e.cp1y:e.cp2y,n?i.cp2x:i.cp1x,n?i.cp2y:i.cp1y,i.x,i.y)}function Fh(t,e,i,n,r){if(r.strikethrough||r.underline){const o=t.measureText(n),s=e-o.actualBoundingBoxLeft,a=e+o.actualBoundingBoxRight,l=i-o.actualBoundingBoxAscent,c=i+o.actualBoundingBoxDescent,h=r.strikethrough?(l+c)/2:c;t.strokeStyle=t.fillStyle,t.beginPath(),t.lineWidth=r.decorationWidth||2,t.moveTo(s,h),t.lineTo(a,h),t.stroke()}}function Bh(t,e){const i=t.fillStyle;t.fillStyle=e.color,t.fillRect(e.left,e.top,e.width,e.height),t.fillStyle=i}function Wh(t,e,i,n,r,o={}){const s=lc(e)?e:[e],a=o.strokeWidth>0&&""!==o.strokeColor;let l,c;for(t.save(),t.font=r.string,function(t,e){e.translation&&t.translate(e.translation[0],e.translation[1]),ac(e.rotation)||t.rotate(e.rotation),e.color&&(t.fillStyle=e.color),e.textAlign&&(t.textAlign=e.textAlign),e.textBaseline&&(t.textBaseline=e.textBaseline)}(t,o),l=0;l<s.length;++l)c=s[l],o.backdrop&&Bh(t,o.backdrop),a&&(o.strokeColor&&(t.strokeStyle=o.strokeColor),ac(o.strokeWidth)||(t.lineWidth=o.strokeWidth),t.strokeText(c,i,n,o.maxWidth)),t.fillText(c,i,n,o.maxWidth),Fh(t,i,n,c,o),n+=Number(r.lineHeight);t.restore()}function $h(t,e){const{x:i,y:n,w:r,h:o,radius:s}=e;t.arc(i+s.topLeft,n+s.topLeft,s.topLeft,1.5*Pc,Pc,!0),t.lineTo(i,n+o-s.bottomLeft),t.arc(i+s.bottomLeft,n+o-s.bottomLeft,s.bottomLeft,Pc,Rc,!0),t.lineTo(i+r-s.bottomRight,n+o),t.arc(i+r-s.bottomRight,n+o-s.bottomRight,s.bottomRight,Rc,0,!0),t.lineTo(i+r,n+s.topRight),t.arc(i+r-s.topRight,n+s.topRight,s.topRight,0,-Rc,!0),t.lineTo(i+s.topLeft,n)}const Vh=/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/,Yh=/^(normal|italic|initial|inherit|unset|(oblique( -?[0-9]?[0-9]deg)?))$/;function Gh(t,e){const i=(""+t).match(Vh);if(!i||"normal"===i[1])return 1.2*e;switch(t=+i[2],i[3]){case"px":return t;case"%":t/=100}return e*t}const Xh=t=>+t||0;function qh(t,e){const i={},n=cc(e),r=n?Object.keys(e):e,o=cc(t)?n?i=>dc(t[i],t[e[i]]):e=>t[e]:()=>t;for(const t of r)i[t]=Xh(o(t));return i}function Zh(t){return qh(t,{top:"y",right:"x",bottom:"y",left:"x"})}function Kh(t){return qh(t,["topLeft","topRight","bottomLeft","bottomRight"])}function Qh(t){const e=Zh(t);return e.width=e.left+e.right,e.height=e.top+e.bottom,e}function Jh(t,e){t=t||{},e=e||Ph.font;let i=dc(t.size,e.size);"string"==typeof i&&(i=parseInt(i,10));let n=dc(t.style,e.style);n&&!(""+n).match(Yh)&&(console.warn('Invalid font style specified: "'+n+'"'),n=void 0);const r={family:dc(t.family,e.family),lineHeight:Gh(dc(t.lineHeight,e.lineHeight),i),size:i,style:n,weight:dc(t.weight,e.weight),string:""};return r.string=function(t){return!t||ac(t.size)||ac(t.family)?null:(t.style?t.style+" ":"")+(t.weight?t.weight+" ":"")+t.size+"px "+t.family}(r),r}function tu(t,e,i,n){let r,o,s,a=!0;for(r=0,o=t.length;r<o;++r)if(s=t[r],void 0!==s&&(void 0!==e&&"function"==typeof s&&(s=s(e),a=!1),void 0!==i&&lc(s)&&(s=s[i%s.length],a=!1),void 0!==s))return n&&!a&&(n.cacheable=!1),s}function eu(t,e){return Object.assign(Object.create(t),e)}function iu(t,e=[""],i,n,r=(()=>t[0])){const o=i||t;void 0===n&&(n=fu("_fallback",t));const s={[Symbol.toStringTag]:"Object",_cacheable:!0,_scopes:t,_rootScopes:o,_fallback:n,_getTarget:r,override:i=>iu([i,...t],e,o,n)};return new Proxy(s,{deleteProperty:(e,i)=>(delete e[i],delete e._keys,delete t[0][i],!0),get:(i,n)=>au(i,n,(()=>function(t,e,i,n){let r;for(const o of e)if(r=fu(ou(o,t),i),void 0!==r)return su(t,r)?uu(i,n,t,r):r}(n,e,t,i))),getOwnPropertyDescriptor:(t,e)=>Reflect.getOwnPropertyDescriptor(t._scopes[0],e),getPrototypeOf:()=>Reflect.getPrototypeOf(t[0]),has:(t,e)=>pu(t).includes(e),ownKeys:t=>pu(t),set(t,e,i){const n=t._storage||(t._storage=r());return t[e]=n[e]=i,delete t._keys,!0}})}function nu(t,e,i,n){const r={_cacheable:!1,_proxy:t,_context:e,_subProxy:i,_stack:new Set,_descriptors:ru(t,n),setContext:e=>nu(t,e,i,n),override:r=>nu(t.override(r),e,i,n)};return new Proxy(r,{deleteProperty:(e,i)=>(delete e[i],delete t[i],!0),get:(t,e,i)=>au(t,e,(()=>function(t,e,i){const{_proxy:n,_context:r,_subProxy:o,_descriptors:s}=t;let a=n[e];return Dc(a)&&s.isScriptable(e)&&(a=function(t,e,i,n){const{_proxy:r,_context:o,_subProxy:s,_stack:a}=i;if(a.has(t))throw new Error("Recursion detected: "+Array.from(a).join("->")+"->"+t);a.add(t);let l=e(o,s||n);return a.delete(t),su(t,l)&&(l=uu(r._scopes,r,t,l)),l}(e,a,t,i)),lc(a)&&a.length&&(a=function(t,e,i,n){const{_proxy:r,_context:o,_subProxy:s,_descriptors:a}=i;if(void 0!==o.index&&n(t))return e[o.index%e.length];if(cc(e[0])){const i=e,n=r._scopes.filter((t=>t!==i));e=[];for(const l of i){const i=uu(n,r,t,l);e.push(nu(i,o,s&&s[t],a))}}return e}(e,a,t,s.isIndexable)),su(e,a)&&(a=nu(a,r,o&&o[e],s)),a}(t,e,i))),getOwnPropertyDescriptor:(e,i)=>e._descriptors.allKeys?Reflect.has(t,i)?{enumerable:!0,configurable:!0}:void 0:Reflect.getOwnPropertyDescriptor(t,i),getPrototypeOf:()=>Reflect.getPrototypeOf(t),has:(e,i)=>Reflect.has(t,i),ownKeys:()=>Reflect.ownKeys(t),set:(e,i,n)=>(t[i]=n,delete e[i],!0)})}function ru(t,e={scriptable:!0,indexable:!0}){const{_scriptable:i=e.scriptable,_indexable:n=e.indexable,_allKeys:r=e.allKeys}=t;return{allKeys:r,scriptable:i,indexable:n,isScriptable:Dc(i)?i:()=>i,isIndexable:Dc(n)?n:()=>n}}const ou=(t,e)=>t?t+Sc(e):e,su=(t,e)=>cc(e)&&"adapters"!==t&&(null===Object.getPrototypeOf(e)||e.constructor===Object);function au(t,e,i){if(Object.prototype.hasOwnProperty.call(t,e))return t[e];const n=i();return t[e]=n,n}function lu(t,e,i){return Dc(t)?t(e,i):t}const cu=(t,e)=>!0===t?e:"string"==typeof t?kc(e,t):void 0;function hu(t,e,i,n,r){for(const o of e){const e=cu(i,o);if(e){t.add(e);const o=lu(e._fallback,i,r);if(void 0!==o&&o!==i&&o!==n)return o}else if(!1===e&&void 0!==n&&i!==n)return null}return!1}function uu(t,e,i,n){const r=e._rootScopes,o=lu(e._fallback,i,n),s=[...t,...r],a=new Set;a.add(n);let l=du(a,s,i,o||i,n);return null!==l&&(void 0===o||o===i||(l=du(a,s,o,l,n),null!==l))&&iu(Array.from(a),[""],r,o,(()=>function(t,e,i){const n=t._getTarget();e in n||(n[e]={});const r=n[e];return lc(r)&&cc(i)?i:r||{}}(e,i,n)))}function du(t,e,i,n,r){for(;i;)i=hu(t,e,i,n,r);return i}function fu(t,e){for(const i of e){if(!i)continue;const e=i[t];if(void 0!==e)return e}}function pu(t){let e=t._keys;return e||(e=t._keys=function(t){const e=new Set;for(const i of t)for(const t of Object.keys(i).filter((t=>!t.startsWith("_"))))e.add(t);return Array.from(e)}(t._scopes)),e}function gu(t,e,i,n){const{iScale:r}=t,{key:o="r"}=this._parsing,s=new Array(n);let a,l,c,h;for(a=0,l=n;a<l;++a)c=a+i,h=e[c],s[a]={r:r.parse(kc(h,o),c)};return s}const mu=Number.EPSILON||1e-14,yu=(t,e)=>e<t.length&&!t[e].skip&&t[e],bu=t=>"x"===t?"y":"x";function vu(t,e,i,n){const r=t.skip?e:t,o=e,s=i.skip?e:i,a=Gc(o,r),l=Gc(s,o);let c=a/(a+l),h=l/(a+l);c=isNaN(c)?0:c,h=isNaN(h)?0:h;const u=n*c,d=n*h;return{previous:{x:o.x-u*(s.x-r.x),y:o.y-u*(s.y-r.y)},next:{x:o.x+d*(s.x-r.x),y:o.y+d*(s.y-r.y)}}}function xu(t,e,i){return Math.max(Math.min(t,i),e)}function _u(t,e,i,n,r){let o,s,a,l;if(e.spanGaps&&(t=t.filter((t=>!t.skip))),"monotone"===e.cubicInterpolationMode)!function(t,e="x"){const i=bu(e),n=t.length,r=Array(n).fill(0),o=Array(n);let s,a,l,c=yu(t,0);for(s=0;s<n;++s)if(a=l,l=c,c=yu(t,s+1),l){if(c){const t=c[e]-l[e];r[s]=0!==t?(c[i]-l[i])/t:0}o[s]=a?c?Ic(r[s-1])!==Ic(r[s])?0:(r[s-1]+r[s])/2:r[s-1]:r[s]}!function(t,e,i){const n=t.length;let r,o,s,a,l,c=yu(t,0);for(let h=0;h<n-1;++h)l=c,c=yu(t,h+1),l&&c&&(Hc(e[h],0,mu)?i[h]=i[h+1]=0:(r=i[h]/e[h],o=i[h+1]/e[h],a=Math.pow(r,2)+Math.pow(o,2),a<=9||(s=3/Math.sqrt(a),i[h]=r*s*e[h],i[h+1]=o*s*e[h])))}(t,r,o),function(t,e,i="x"){const n=bu(i),r=t.length;let o,s,a,l=yu(t,0);for(let c=0;c<r;++c){if(s=a,a=l,l=yu(t,c+1),!a)continue;const r=a[i],h=a[n];s&&(o=(r-s[i])/3,a[`cp1${i}`]=r-o,a[`cp1${n}`]=h-o*e[c]),l&&(o=(l[i]-r)/3,a[`cp2${i}`]=r+o,a[`cp2${n}`]=h+o*e[c])}}(t,o,e)}(t,r);else{let i=n?t[t.length-1]:t[0];for(o=0,s=t.length;o<s;++o)a=t[o],l=vu(i,a,t[Math.min(o+1,s-(n?0:1))%s],e.tension),a.cp1x=l.previous.x,a.cp1y=l.previous.y,a.cp2x=l.next.x,a.cp2y=l.next.y,i=a}e.capBezierPoints&&function(t,e){let i,n,r,o,s,a=zh(t[0],e);for(i=0,n=t.length;i<n;++i)s=o,o=a,a=i<n-1&&zh(t[i+1],e),o&&(r=t[i],s&&(r.cp1x=xu(r.cp1x,e.left,e.right),r.cp1y=xu(r.cp1y,e.top,e.bottom)),a&&(r.cp2x=xu(r.cp2x,e.left,e.right),r.cp2y=xu(r.cp2y,e.top,e.bottom)))}(t,i)}function wu(){return"undefined"!=typeof window&&"undefined"!=typeof document}function Mu(t){let e=t.parentNode;return e&&"[object ShadowRoot]"===e.toString()&&(e=e.host),e}function ku(t,e,i){let n;return"string"==typeof t?(n=parseInt(t,10),-1!==t.indexOf("%")&&(n=n/100*e.parentNode[i])):n=t,n}const Su=t=>t.ownerDocument.defaultView.getComputedStyle(t,null),Ou=["top","right","bottom","left"];function Du(t,e,i){const n={};i=i?"-"+i:"";for(let r=0;r<4;r++){const o=Ou[r];n[o]=parseFloat(t[e+"-"+o+i])||0}return n.width=n.left+n.right,n.height=n.top+n.bottom,n}const Eu=(t,e,i)=>(t>0||e>0)&&(!i||!i.shadowRoot);function Pu(t,e){if("native"in t)return t;const{canvas:i,currentDevicePixelRatio:n}=e,r=Su(i),o="border-box"===r.boxSizing,s=Du(r,"padding"),a=Du(r,"border","width"),{x:l,y:c,box:h}=function(t,e){const i=t.touches,n=i&&i.length?i[0]:t,{offsetX:r,offsetY:o}=n;let s,a,l=!1;if(Eu(r,o,t.target))s=r,a=o;else{const t=e.getBoundingClientRect();s=n.clientX-t.left,a=n.clientY-t.top,l=!0}return{x:s,y:a,box:l}}(t,i),u=s.left+(h&&a.left),d=s.top+(h&&a.top);let{width:f,height:p}=e;return o&&(f-=s.width+a.width,p-=s.height+a.height),{x:Math.round((l-u)/f*i.width/n),y:Math.round((c-d)/p*i.height/n)}}const Tu=t=>Math.round(10*t)/10;function Cu(t,e,i){const n=e||1,r=Math.floor(t.height*n),o=Math.floor(t.width*n);t.height=Math.floor(t.height),t.width=Math.floor(t.width);const s=t.canvas;return s.style&&(i||!s.style.height&&!s.style.width)&&(s.style.height=`${t.height}px`,s.style.width=`${t.width}px`),(t.currentDevicePixelRatio!==n||s.height!==r||s.width!==o)&&(t.currentDevicePixelRatio=n,s.height=r,s.width=o,t.ctx.setTransform(n,0,0,n,0,0),!0)}const Au=function(){let t=!1;try{const e={get passive(){return t=!0,!1}};window.addEventListener("test",null,e),window.removeEventListener("test",null,e)}catch(t){}return t}();function ju(t,e){const i=function(t,e){return Su(t).getPropertyValue(e)}(t,e),n=i&&i.match(/^(\d+)(\.\d+)?px$/);return n?+n[1]:void 0}function Ru(t,e,i,n){return{x:t.x+i*(e.x-t.x),y:t.y+i*(e.y-t.y)}}function Lu(t,e,i,n){return{x:t.x+i*(e.x-t.x),y:"middle"===n?i<.5?t.y:e.y:"after"===n?i<1?t.y:e.y:i>0?e.y:t.y}}function zu(t,e,i,n){const r={x:t.cp2x,y:t.cp2y},o={x:e.cp1x,y:e.cp1y},s=Ru(t,r,i),a=Ru(r,o,i),l=Ru(o,e,i),c=Ru(s,a,i),h=Ru(a,l,i);return Ru(c,h,i)}function Nu(t,e,i){return t?function(t,e){return{x:i=>t+t+e-i,setWidth(t){e=t},textAlign:t=>"center"===t?t:"right"===t?"left":"right",xPlus:(t,e)=>t-e,leftForLtr:(t,e)=>t-e}}(e,i):{x:t=>t,setWidth(t){},textAlign:t=>t,xPlus:(t,e)=>t+e,leftForLtr:(t,e)=>t}}function Iu(t,e){let i,n;"ltr"!==e&&"rtl"!==e||(i=t.canvas.style,n=[i.getPropertyValue("direction"),i.getPropertyPriority("direction")],i.setProperty("direction",e,"important"),t.prevTextDirection=n)}function Hu(t,e){void 0!==e&&(delete t.prevTextDirection,t.canvas.style.setProperty("direction",e[0],e[1]))}function Uu(t){return"angle"===t?{between:Zc,compare:Xc,normalize:qc}:{between:Qc,compare:(t,e)=>t-e,normalize:t=>t}}function Fu({start:t,end:e,count:i,loop:n,style:r}){return{start:t%i,end:e%i,loop:n&&(e-t+1)%i==0,style:r}}function Bu(t,e,i){if(!i)return[t];const{property:n,start:r,end:o}=i,s=e.length,{compare:a,between:l,normalize:c}=Uu(n),{start:h,end:u,loop:d,style:f}=function(t,e,i){const{property:n,start:r,end:o}=i,{between:s,normalize:a}=Uu(n),l=e.length;let c,h,{start:u,end:d,loop:f}=t;if(f){for(u+=l,d+=l,c=0,h=l;c<h&&s(a(e[u%l][n]),r,o);++c)u--,d--;u%=l,d%=l}return d<u&&(d+=l),{start:u,end:d,loop:f,style:t.style}}(t,e,i),p=[];let g,m,y,b=!1,v=null;for(let t=h,i=h;t<=u;++t)m=e[t%s],m.skip||(g=c(m[n]),g!==y&&(b=l(g,r,o),null===v&&(b||l(r,y,g)&&0!==a(r,y))&&(v=0===a(g,r)?t:i),null!==v&&(!b||0===a(o,g)||l(o,y,g))&&(p.push(Fu({start:v,end:t,loop:d,count:s,style:f})),v=null),i=t,y=g));return null!==v&&p.push(Fu({start:v,end:u,loop:d,count:s,style:f})),p}function Wu(t,e){const i=[],n=t.segments;for(let r=0;r<n.length;r++){const o=Bu(n[r],t.points,e);o.length&&i.push(...o)}return i}function $u(t){return{backgroundColor:t.backgroundColor,borderCapStyle:t.borderCapStyle,borderDash:t.borderDash,borderDashOffset:t.borderDashOffset,borderJoinStyle:t.borderJoinStyle,borderWidth:t.borderWidth,borderColor:t.borderColor}}function Vu(t,e){if(!e)return!1;const i=[],n=function(t,e){return gh(e)?(i.includes(e)||i.push(e),i.indexOf(e)):e};return JSON.stringify(t,n)!==JSON.stringify(e,n)}class Yu{constructor(){this._request=null,this._charts=new Map,this._running=!1,this._lastDate=void 0}_notify(t,e,i,n){const r=e.listeners[n],o=e.duration;r.forEach((n=>n({chart:t,initial:e.initial,numSteps:o,currentStep:Math.min(i-e.start,o)})))}_refresh(){this._request||(this._running=!0,this._request=oh.call(window,(()=>{this._update(),this._request=null,this._running&&this._refresh()})))}_update(t=Date.now()){let e=0;this._charts.forEach(((i,n)=>{if(!i.running||!i.items.length)return;const r=i.items;let o,s=r.length-1,a=!1;for(;s>=0;--s)o=r[s],o._active?(o._total>i.duration&&(i.duration=o._total),o.tick(t),a=!0):(r[s]=r[r.length-1],r.pop());a&&(n.draw(),this._notify(n,i,t,"progress")),r.length||(i.running=!1,this._notify(n,i,t,"complete"),i.initial=!1),e+=r.length})),this._lastDate=t,0===e&&(this._running=!1)}_getAnims(t){const e=this._charts;let i=e.get(t);return i||(i={running:!1,initial:!0,items:[],listeners:{complete:[],progress:[]}},e.set(t,i)),i}listen(t,e,i){this._getAnims(t).listeners[e].push(i)}add(t,e){e&&e.length&&this._getAnims(t).items.push(...e)}has(t){return this._getAnims(t).items.length>0}start(t){const e=this._charts.get(t);e&&(e.running=!0,e.start=Date.now(),e.duration=e.items.reduce(((t,e)=>Math.max(t,e._duration)),0),this._refresh())}running(t){if(!this._running)return!1;const e=this._charts.get(t);return!!(e&&e.running&&e.items.length)}stop(t){const e=this._charts.get(t);if(!e||!e.items.length)return;const i=e.items;let n=i.length-1;for(;n>=0;--n)i[n].cancel();e.items=[],this._notify(t,e,Date.now(),"complete")}remove(t){return this._charts.delete(t)}}var Gu=new Yu;const Xu="transparent",qu={boolean:(t,e,i)=>i>.5?e:t,color(t,e,i){const n=mh(t||Xu),r=n.valid&&mh(e||Xu);return r&&r.valid?r.mix(n,i).hexString():e},number:(t,e,i)=>t+(e-t)*i};class Zu{constructor(t,e,i,n){const r=e[i];n=tu([t.to,n,r,t.from]);const o=tu([t.from,r,n]);this._active=!0,this._fn=t.fn||qu[t.type||typeof o],this._easing=ph[t.easing]||ph.linear,this._start=Math.floor(Date.now()+(t.delay||0)),this._duration=this._total=Math.floor(t.duration),this._loop=!!t.loop,this._target=e,this._prop=i,this._from=o,this._to=n,this._promises=void 0}active(){return this._active}update(t,e,i){if(this._active){this._notify(!1);const n=this._target[this._prop],r=i-this._start,o=this._duration-r;this._start=i,this._duration=Math.floor(Math.max(o,t.duration)),this._total+=r,this._loop=!!t.loop,this._to=tu([t.to,e,n,t.from]),this._from=tu([t.from,n,e])}}cancel(){this._active&&(this.tick(Date.now()),this._active=!1,this._notify(!1))}tick(t){const e=t-this._start,i=this._duration,n=this._prop,r=this._from,o=this._loop,s=this._to;let a;if(this._active=r!==s&&(o||e<i),!this._active)return this._target[n]=s,void this._notify(!0);e<0?this._target[n]=r:(a=e/i%2,a=o&&a>1?2-a:a,a=this._easing(Math.min(1,Math.max(0,a))),this._target[n]=this._fn(r,s,a))}wait(){const t=this._promises||(this._promises=[]);return new Promise(((e,i)=>{t.push({res:e,rej:i})}))}_notify(t){const e=t?"res":"rej",i=this._promises||[];for(let t=0;t<i.length;t++)i[t][e]()}}class Ku{constructor(t,e){this._chart=t,this._properties=new Map,this.configure(e)}configure(t){if(!cc(t))return;const e=Object.keys(Ph.animation),i=this._properties;Object.getOwnPropertyNames(t).forEach((n=>{const r=t[n];if(!cc(r))return;const o={};for(const t of e)o[t]=r[t];(lc(r.properties)&&r.properties||[n]).forEach((t=>{t!==n&&i.has(t)||i.set(t,o)}))}))}_animateOptions(t,e){const i=e.options,n=function(t,e){if(!e)return;let i=t.options;if(i)return i.$shared&&(t.options=i=Object.assign({},i,{$shared:!1,$animations:{}})),i;t.options=e}(t,i);if(!n)return[];const r=this._createAnimations(n,i);return i.$shared&&function(t,e){const i=[],n=Object.keys(e);for(let e=0;e<n.length;e++){const r=t[n[e]];r&&r.active()&&i.push(r.wait())}return Promise.all(i)}(t.options.$animations,i).then((()=>{t.options=i}),(()=>{})),r}_createAnimations(t,e){const i=this._properties,n=[],r=t.$animations||(t.$animations={}),o=Object.keys(e),s=Date.now();let a;for(a=o.length-1;a>=0;--a){const l=o[a];if("$"===l.charAt(0))continue;if("options"===l){n.push(...this._animateOptions(t,e));continue}const c=e[l];let h=r[l];const u=i.get(l);if(h){if(u&&h.active()){h.update(u,c,s);continue}h.cancel()}u&&u.duration?(r[l]=h=new Zu(u,t,l,c),n.push(h)):t[l]=c}return n}update(t,e){if(0===this._properties.size)return void Object.assign(t,e);const i=this._createAnimations(t,e);return i.length?(Gu.add(this._chart,i),!0):void 0}}function Qu(t,e){const i=t&&t.options||{},n=i.reverse,r=void 0===i.min?e:0,o=void 0===i.max?e:0;return{start:n?o:r,end:n?r:o}}function Ju(t,e){const i=[],n=t._getSortedDatasetMetas(e);let r,o;for(r=0,o=n.length;r<o;++r)i.push(n[r].index);return i}function td(t,e,i,n={}){const r=t.keys,o="single"===n.mode;let s,a,l,c;if(null!==e){for(s=0,a=r.length;s<a;++s){if(l=+r[s],l===i){if(n.all)continue;break}c=t.values[l],hc(c)&&(o||0===e||Ic(e)===Ic(c))&&(e+=c)}return e}}function ed(t,e){const i=t&&t.options.stacked;return i||void 0===i&&void 0!==e.stack}function id(t,e,i){const n=t[e]||(t[e]={});return n[i]||(n[i]={})}function nd(t,e,i,n){for(const r of e.getMatchingVisibleMetas(n).reverse()){const e=t[r.index];if(i&&e>0||!i&&e<0)return r.index}return null}function rd(t,e){const{chart:i,_cachedMeta:n}=t,r=i._stacks||(i._stacks={}),{iScale:o,vScale:s,index:a}=n,l=o.axis,c=s.axis,h=function(t,e,i){return`${t.id}.${e.id}.${i.stack||i.type}`}(o,s,n),u=e.length;let d;for(let t=0;t<u;++t){const i=e[t],{[l]:o,[c]:u}=i;d=(i._stacks||(i._stacks={}))[c]=id(r,h,o),d[a]=u,d._top=nd(d,s,!0,n.type),d._bottom=nd(d,s,!1,n.type),(d._visualValues||(d._visualValues={}))[a]=u}}function od(t,e){const i=t.scales;return Object.keys(i).filter((t=>i[t].axis===e)).shift()}function sd(t,e){const i=t.controller.index,n=t.vScale&&t.vScale.axis;if(n){e=e||t._parsed;for(const t of e){const e=t._stacks;if(!e||void 0===e[n]||void 0===e[n][i])return;delete e[n][i],void 0!==e[n]._visualValues&&void 0!==e[n]._visualValues[i]&&delete e[n]._visualValues[i]}}}const ad=t=>"reset"===t||"none"===t,ld=(t,e)=>e?t:Object.assign({},t);class cd{static defaults={};static datasetElementType=null;static dataElementType=null;constructor(t,e){this.chart=t,this._ctx=t.ctx,this.index=e,this._cachedDataOpts={},this._cachedMeta=this.getMeta(),this._type=this._cachedMeta.type,this.options=void 0,this._parsing=!1,this._data=void 0,this._objectData=void 0,this._sharedOptions=void 0,this._drawStart=void 0,this._drawCount=void 0,this.enableOptionSharing=!1,this.supportsDecimation=!1,this.$context=void 0,this._syncList=[],this.datasetElementType=new.target.datasetElementType,this.dataElementType=new.target.dataElementType,this.initialize()}initialize(){const t=this._cachedMeta;this.configure(),this.linkScales(),t._stacked=ed(t.vScale,t),this.addElements(),this.options.fill&&!this.chart.isPluginEnabled("filler")&&console.warn("Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options")}updateIndex(t){this.index!==t&&sd(this._cachedMeta),this.index=t}linkScales(){const t=this.chart,e=this._cachedMeta,i=this.getDataset(),n=(t,e,i,n)=>"x"===t?e:"r"===t?n:i,r=e.xAxisID=dc(i.xAxisID,od(t,"x")),o=e.yAxisID=dc(i.yAxisID,od(t,"y")),s=e.rAxisID=dc(i.rAxisID,od(t,"r")),a=e.indexAxis,l=e.iAxisID=n(a,r,o,s),c=e.vAxisID=n(a,o,r,s);e.xScale=this.getScaleForId(r),e.yScale=this.getScaleForId(o),e.rScale=this.getScaleForId(s),e.iScale=this.getScaleForId(l),e.vScale=this.getScaleForId(c)}getDataset(){return this.chart.data.datasets[this.index]}getMeta(){return this.chart.getDatasetMeta(this.index)}getScaleForId(t){return this.chart.scales[t]}_getOtherScale(t){const e=this._cachedMeta;return t===e.iScale?e.vScale:e.iScale}reset(){this._update("reset")}_destroy(){const t=this._cachedMeta;this._data&&nh(this._data,this),t._stacked&&sd(t)}_dataCheck(){const t=this.getDataset(),e=t.data||(t.data=[]),i=this._data;if(cc(e))this._data=function(t){const e=Object.keys(t),i=new Array(e.length);let n,r,o;for(n=0,r=e.length;n<r;++n)o=e[n],i[n]={x:o,y:t[o]};return i}(e);else if(i!==e){if(i){nh(i,this);const t=this._cachedMeta;sd(t),t._parsed=[]}e&&Object.isExtensible(e)&&(r=this,(n=e)._chartjs?n._chartjs.listeners.push(r):(Object.defineProperty(n,"_chartjs",{configurable:!0,enumerable:!1,value:{listeners:[r]}}),ih.forEach((t=>{const e="_onData"+Sc(t),i=n[t];Object.defineProperty(n,t,{configurable:!0,enumerable:!1,value(...t){const r=i.apply(this,t);return n._chartjs.listeners.forEach((i=>{"function"==typeof i[e]&&i[e](...t)})),r}})})))),this._syncList=[],this._data=e}var n,r}addElements(){const t=this._cachedMeta;this._dataCheck(),this.datasetElementType&&(t.dataset=new this.datasetElementType)}buildOrUpdateElements(t){const e=this._cachedMeta,i=this.getDataset();let n=!1;this._dataCheck();const r=e._stacked;e._stacked=ed(e.vScale,e),e.stack!==i.stack&&(n=!0,sd(e),e.stack=i.stack),this._resyncElements(t),(n||r!==e._stacked)&&rd(this,e._parsed)}configure(){const t=this.chart.config,e=t.datasetScopeKeys(this._type),i=t.getOptionScopes(this.getDataset(),e,!0);this.options=t.createResolver(i,this.getContext()),this._parsing=this.options.parsing,this._cachedDataOpts={}}parse(t,e){const{_cachedMeta:i,_data:n}=this,{iScale:r,_stacked:o}=i,s=r.axis;let a,l,c,h=0===t&&e===n.length||i._sorted,u=t>0&&i._parsed[t-1];if(!1===this._parsing)i._parsed=n,i._sorted=!0,c=n;else{c=lc(n[t])?this.parseArrayData(i,n,t,e):cc(n[t])?this.parseObjectData(i,n,t,e):this.parsePrimitiveData(i,n,t,e);const r=()=>null===l[s]||u&&l[s]<u[s];for(a=0;a<e;++a)i._parsed[a+t]=l=c[a],h&&(r()&&(h=!1),u=l);i._sorted=h}o&&rd(this,c)}parsePrimitiveData(t,e,i,n){const{iScale:r,vScale:o}=t,s=r.axis,a=o.axis,l=r.getLabels(),c=r===o,h=new Array(n);let u,d,f;for(u=0,d=n;u<d;++u)f=u+i,h[u]={[s]:c||r.parse(l[f],f),[a]:o.parse(e[f],f)};return h}parseArrayData(t,e,i,n){const{xScale:r,yScale:o}=t,s=new Array(n);let a,l,c,h;for(a=0,l=n;a<l;++a)c=a+i,h=e[c],s[a]={x:r.parse(h[0],c),y:o.parse(h[1],c)};return s}parseObjectData(t,e,i,n){const{xScale:r,yScale:o}=t,{xAxisKey:s="x",yAxisKey:a="y"}=this._parsing,l=new Array(n);let c,h,u,d;for(c=0,h=n;c<h;++c)u=c+i,d=e[u],l[c]={x:r.parse(kc(d,s),u),y:o.parse(kc(d,a),u)};return l}getParsed(t){return this._cachedMeta._parsed[t]}getDataElement(t){return this._cachedMeta.data[t]}applyStack(t,e,i){const n=this.chart,r=this._cachedMeta,o=e[t.axis];return td({keys:Ju(n,!0),values:e._stacks[t.axis]._visualValues},o,r.index,{mode:i})}updateRangeFromParsed(t,e,i,n){const r=i[e.axis];let o=null===r?NaN:r;const s=n&&i._stacks[e.axis];n&&s&&(n.values=s,o=td(n,r,this._cachedMeta.index)),t.min=Math.min(t.min,o),t.max=Math.max(t.max,o)}getMinMax(t,e){const i=this._cachedMeta,n=i._parsed,r=i._sorted&&t===i.iScale,o=n.length,s=this._getOtherScale(t),a=((t,e,i)=>t&&!e.hidden&&e._stacked&&{keys:Ju(i,!0),values:null})(e,i,this.chart),l={min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY},{min:c,max:h}=function(t){const{min:e,max:i,minDefined:n,maxDefined:r}=t.getUserBounds();return{min:n?e:Number.NEGATIVE_INFINITY,max:r?i:Number.POSITIVE_INFINITY}}(s);let u,d;function f(){d=n[u];const e=d[s.axis];return!hc(d[t.axis])||c>e||h<e}for(u=0;u<o&&(f()||(this.updateRangeFromParsed(l,t,d,a),!r));++u);if(r)for(u=o-1;u>=0;--u)if(!f()){this.updateRangeFromParsed(l,t,d,a);break}return l}getAllParsedValues(t){const e=this._cachedMeta._parsed,i=[];let n,r,o;for(n=0,r=e.length;n<r;++n)o=e[n][t.axis],hc(o)&&i.push(o);return i}getMaxOverflow(){return!1}getLabelAndValue(t){const e=this._cachedMeta,i=e.iScale,n=e.vScale,r=this.getParsed(t);return{label:i?""+i.getLabelForValue(r[i.axis]):"",value:n?""+n.getLabelForValue(r[n.axis]):""}}_update(t){const e=this._cachedMeta;this.update(t||"default"),e._clip=function(t){let e,i,n,r;return cc(t)?(e=t.top,i=t.right,n=t.bottom,r=t.left):e=i=n=r=t,{top:e,right:i,bottom:n,left:r,disabled:!1===t}}(dc(this.options.clip,function(t,e,i){if(!1===i)return!1;const n=Qu(t,i),r=Qu(e,i);return{top:r.end,right:n.end,bottom:r.start,left:n.start}}(e.xScale,e.yScale,this.getMaxOverflow())))}update(t){}draw(){const t=this._ctx,e=this.chart,i=this._cachedMeta,n=i.data||[],r=e.chartArea,o=[],s=this._drawStart||0,a=this._drawCount||n.length-s,l=this.options.drawActiveElementsOnTop;let c;for(i.dataset&&i.dataset.draw(t,r,s,a),c=s;c<s+a;++c){const e=n[c];e.hidden||(e.active&&l?o.push(e):e.draw(t,r))}for(c=0;c<o.length;++c)o[c].draw(t,r)}getStyle(t,e){const i=e?"active":"default";return void 0===t&&this._cachedMeta.dataset?this.resolveDatasetElementOptions(i):this.resolveDataElementOptions(t||0,i)}getContext(t,e,i){const n=this.getDataset();let r;if(t>=0&&t<this._cachedMeta.data.length){const e=this._cachedMeta.data[t];r=e.$context||(e.$context=function(t,e,i){return eu(t,{active:!1,dataIndex:e,parsed:void 0,raw:void 0,element:i,index:e,mode:"default",type:"data"})}(this.getContext(),t,e)),r.parsed=this.getParsed(t),r.raw=n.data[t],r.index=r.dataIndex=t}else r=this.$context||(this.$context=function(t,e){return eu(t,{active:!1,dataset:void 0,datasetIndex:e,index:e,mode:"default",type:"dataset"})}(this.chart.getContext(),this.index)),r.dataset=n,r.index=r.datasetIndex=this.index;return r.active=!!e,r.mode=i,r}resolveDatasetElementOptions(t){return this._resolveElementOptions(this.datasetElementType.id,t)}resolveDataElementOptions(t,e){return this._resolveElementOptions(this.dataElementType.id,e,t)}_resolveElementOptions(t,e="default",i){const n="active"===e,r=this._cachedDataOpts,o=t+"-"+e,s=r[o],a=this.enableOptionSharing&&Oc(i);if(s)return ld(s,a);const l=this.chart.config,c=l.datasetElementScopeKeys(this._type,t),h=n?[`${t}Hover`,"hover",t,""]:[t,""],u=l.getOptionScopes(this.getDataset(),c),d=Object.keys(Ph.elements[t]),f=l.resolveNamedOptions(u,d,(()=>this.getContext(i,n,e)),h);return f.$shared&&(f.$shared=a,r[o]=Object.freeze(ld(f,a))),f}_resolveAnimations(t,e,i){const n=this.chart,r=this._cachedDataOpts,o=`animation-${e}`,s=r[o];if(s)return s;let a;if(!1!==n.options.animation){const n=this.chart.config,r=n.datasetAnimationScopeKeys(this._type,e),o=n.getOptionScopes(this.getDataset(),r);a=n.createResolver(o,this.getContext(t,i,e))}const l=new Ku(n,a&&a.animations);return a&&a._cacheable&&(r[o]=Object.freeze(l)),l}getSharedOptions(t){if(t.$shared)return this._sharedOptions||(this._sharedOptions=Object.assign({},t))}includeOptions(t,e){return!e||ad(t)||this.chart._animationsDisabled}_getSharedOptions(t,e){const i=this.resolveDataElementOptions(t,e),n=this._sharedOptions,r=this.getSharedOptions(i),o=this.includeOptions(e,r)||r!==n;return this.updateSharedOptions(r,e,i),{sharedOptions:r,includeOptions:o}}updateElement(t,e,i,n){ad(n)?Object.assign(t,i):this._resolveAnimations(e,n).update(t,i)}updateSharedOptions(t,e,i){t&&!ad(e)&&this._resolveAnimations(void 0,e).update(t,i)}_setStyle(t,e,i,n){t.active=n;const r=this.getStyle(e,n);this._resolveAnimations(e,i,n).update(t,{options:!n&&this.getSharedOptions(r)||r})}removeHoverStyle(t,e,i){this._setStyle(t,i,"active",!1)}setHoverStyle(t,e,i){this._setStyle(t,i,"active",!0)}_removeDatasetHoverStyle(){const t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!1)}_setDatasetHoverStyle(){const t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!0)}_resyncElements(t){const e=this._data,i=this._cachedMeta.data;for(const[t,e,i]of this._syncList)this[t](e,i);this._syncList=[];const n=i.length,r=e.length,o=Math.min(r,n);o&&this.parse(0,o),r>n?this._insertElements(n,r-n,t):r<n&&this._removeElements(r,n-r)}_insertElements(t,e,i=!0){const n=this._cachedMeta,r=n.data,o=t+e;let s;const a=t=>{for(t.length+=e,s=t.length-1;s>=o;s--)t[s]=t[s-e]};for(a(r),s=t;s<o;++s)r[s]=new this.dataElementType;this._parsing&&a(n._parsed),this.parse(t,e),i&&this.updateElements(r,t,e,"reset")}updateElements(t,e,i,n){}_removeElements(t,e){const i=this._cachedMeta;if(this._parsing){const n=i._parsed.splice(t,e);i._stacked&&sd(i,n)}i.data.splice(t,e)}_sync(t){if(this._parsing)this._syncList.push(t);else{const[e,i,n]=t;this[e](i,n)}this.chart._dataChanges.push([this.index,...t])}_onDataPush(){const t=arguments.length;this._sync(["_insertElements",this.getDataset().data.length-t,t])}_onDataPop(){this._sync(["_removeElements",this._cachedMeta.data.length-1,1])}_onDataShift(){this._sync(["_removeElements",0,1])}_onDataSplice(t,e){e&&this._sync(["_removeElements",t,e]);const i=arguments.length-2;i&&this._sync(["_insertElements",t,i])}_onDataUnshift(){this._sync(["_insertElements",0,arguments.length])}}function hd(t){const e=t.iScale,i=function(t,e){if(!t._cache.$bar){const i=t.getMatchingVisibleMetas(e);let n=[];for(let e=0,r=i.length;e<r;e++)n=n.concat(i[e].controller.getAllParsedValues(t));t._cache.$bar=rh(n.sort(((t,e)=>t-e)))}return t._cache.$bar}(e,t.type);let n,r,o,s,a=e._length;const l=()=>{32767!==o&&-32768!==o&&(Oc(s)&&(a=Math.min(a,Math.abs(o-s)||a)),s=o)};for(n=0,r=i.length;n<r;++n)o=e.getPixelForValue(i[n]),l();for(s=void 0,n=0,r=e.ticks.length;n<r;++n)o=e.getPixelForTick(n),l();return a}function ud(t,e,i,n){return lc(t)?function(t,e,i,n){const r=i.parse(t[0],n),o=i.parse(t[1],n),s=Math.min(r,o),a=Math.max(r,o);let l=s,c=a;Math.abs(s)>Math.abs(a)&&(l=a,c=s),e[i.axis]=c,e._custom={barStart:l,barEnd:c,start:r,end:o,min:s,max:a}}(t,e,i,n):e[i.axis]=i.parse(t,n),e}function dd(t,e,i,n){const r=t.iScale,o=t.vScale,s=r.getLabels(),a=r===o,l=[];let c,h,u,d;for(c=i,h=i+n;c<h;++c)d=e[c],u={},u[r.axis]=a||r.parse(s[c],c),l.push(ud(d,u,o,c));return l}function fd(t){return t&&void 0!==t.barStart&&void 0!==t.barEnd}function pd(t,e,i,n){let r=e.borderSkipped;const o={};if(!r)return void(t.borderSkipped=o);if(!0===r)return void(t.borderSkipped={top:!0,right:!0,bottom:!0,left:!0});const{start:s,end:a,reverse:l,top:c,bottom:h}=function(t){let e,i,n,r,o;return t.horizontal?(e=t.base>t.x,i="left",n="right"):(e=t.base<t.y,i="bottom",n="top"),e?(r="end",o="start"):(r="start",o="end"),{start:i,end:n,reverse:e,top:r,bottom:o}}(t);"middle"===r&&i&&(t.enableBorderRadius=!0,(i._top||0)===n?r=c:(i._bottom||0)===n?r=h:(o[gd(h,s,a,l)]=!0,r=c)),o[gd(r,s,a,l)]=!0,t.borderSkipped=o}function gd(t,e,i,n){var r,o,s;return n?(s=i,t=md(t=(r=t)===(o=e)?s:r===s?o:r,i,e)):t=md(t,e,i),t}function md(t,e,i){return"start"===t?e:"end"===t?i:t}function yd(t,{inflateAmount:e},i){t.inflateAmount="auto"===e?1===i?.33:0:e}class bd extends cd{static id="doughnut";static defaults={datasetElementType:!1,dataElementType:"arc",animation:{animateRotate:!0,animateScale:!1},animations:{numbers:{type:"number",properties:["circumference","endAngle","innerRadius","outerRadius","startAngle","x","y","offset","borderWidth","spacing"]}},cutout:"50%",rotation:0,circumference:360,radius:"100%",spacing:0,indexAxis:"r"};static descriptors={_scriptable:t=>"spacing"!==t,_indexable:t=>"spacing"!==t&&!t.startsWith("borderDash")&&!t.startsWith("hoverBorderDash")};static overrides={aspectRatio:1,plugins:{legend:{labels:{generateLabels(t){const e=t.data;if(e.labels.length&&e.datasets.length){const{labels:{pointStyle:i,color:n}}=t.legend.options;return e.labels.map(((e,r)=>{const o=t.getDatasetMeta(0).controller.getStyle(r);return{text:e,fillStyle:o.backgroundColor,strokeStyle:o.borderColor,fontColor:n,lineWidth:o.borderWidth,pointStyle:i,hidden:!t.getDataVisibility(r),index:r}}))}return[]}},onClick(t,e,i){i.chart.toggleDataVisibility(e.index),i.chart.update()}}}};constructor(t,e){super(t,e),this.enableOptionSharing=!0,this.innerRadius=void 0,this.outerRadius=void 0,this.offsetX=void 0,this.offsetY=void 0}linkScales(){}parse(t,e){const i=this.getDataset().data,n=this._cachedMeta;if(!1===this._parsing)n._parsed=i;else{let r,o,s=t=>+i[t];if(cc(i[t])){const{key:t="value"}=this._parsing;s=e=>+kc(i[e],t)}for(r=t,o=t+e;r<o;++r)n._parsed[r]=s(r)}}_getRotation(){return Wc(this.options.rotation-90)}_getCircumference(){return Wc(this.options.circumference)}_getRotationExtents(){let t=Tc,e=-Tc;for(let i=0;i<this.chart.data.datasets.length;++i)if(this.chart.isDatasetVisible(i)&&this.chart.getDatasetMeta(i).type===this._type){const n=this.chart.getDatasetMeta(i).controller,r=n._getRotation(),o=n._getCircumference();t=Math.min(t,r),e=Math.max(e,r+o)}return{rotation:t,circumference:e-t}}update(t){const e=this.chart,{chartArea:i}=e,n=this._cachedMeta,r=n.data,o=this.getMaxBorderWidth()+this.getMaxOffset(r)+this.options.spacing,s=Math.max((Math.min(i.width,i.height)-o)/2,0),a=Math.min(((t,e)=>"string"==typeof t&&t.endsWith("%")?parseFloat(t)/100:+t/e)(this.options.cutout,s),1),l=this._getRingWeight(this.index),{circumference:c,rotation:h}=this._getRotationExtents(),{ratioX:u,ratioY:d,offsetX:f,offsetY:p}=function(t,e,i){let n=1,r=1,o=0,s=0;if(e<Tc){const a=t,l=a+e,c=Math.cos(a),h=Math.sin(a),u=Math.cos(l),d=Math.sin(l),f=(t,e,n)=>Zc(t,a,l,!0)?1:Math.max(e,e*i,n,n*i),p=(t,e,n)=>Zc(t,a,l,!0)?-1:Math.min(e,e*i,n,n*i),g=f(0,c,u),m=f(Rc,h,d),y=p(Pc,c,u),b=p(Pc+Rc,h,d);n=(g-y)/2,r=(m-b)/2,o=-(g+y)/2,s=-(m+b)/2}return{ratioX:n,ratioY:r,offsetX:o,offsetY:s}}(h,c,a),g=(i.width-o)/u,m=(i.height-o)/d,y=Math.max(Math.min(g,m)/2,0),b=fc(this.options.radius,y),v=(b-Math.max(b*a,0))/this._getVisibleDatasetWeightTotal();this.offsetX=f*b,this.offsetY=p*b,n.total=this.calculateTotal(),this.outerRadius=b-v*this._getRingWeightOffset(this.index),this.innerRadius=Math.max(this.outerRadius-v*l,0),this.updateElements(r,0,r.length,t)}_circumference(t,e){const i=this.options,n=this._cachedMeta,r=this._getCircumference();return e&&i.animation.animateRotate||!this.chart.getDataVisibility(t)||null===n._parsed[t]||n.data[t].hidden?0:this.calculateCircumference(n._parsed[t]*r/Tc)}updateElements(t,e,i,n){const r="reset"===n,o=this.chart,s=o.chartArea,a=o.options.animation,l=(s.left+s.right)/2,c=(s.top+s.bottom)/2,h=r&&a.animateScale,u=h?0:this.innerRadius,d=h?0:this.outerRadius,{sharedOptions:f,includeOptions:p}=this._getSharedOptions(e,n);let g,m=this._getRotation();for(g=0;g<e;++g)m+=this._circumference(g,r);for(g=e;g<e+i;++g){const e=this._circumference(g,r),i=t[g],o={x:l+this.offsetX,y:c+this.offsetY,startAngle:m,endAngle:m+e,circumference:e,outerRadius:d,innerRadius:u};p&&(o.options=f||this.resolveDataElementOptions(g,i.active?"active":n)),m+=e,this.updateElement(i,g,o,n)}}calculateTotal(){const t=this._cachedMeta,e=t.data;let i,n=0;for(i=0;i<e.length;i++){const r=t._parsed[i];null===r||isNaN(r)||!this.chart.getDataVisibility(i)||e[i].hidden||(n+=Math.abs(r))}return n}calculateCircumference(t){const e=this._cachedMeta.total;return e>0&&!isNaN(t)?Tc*(Math.abs(t)/e):0}getLabelAndValue(t){const e=this._cachedMeta,i=this.chart,n=i.data.labels||[],r=_h(e._parsed[t],i.options.locale);return{label:n[t]||"",value:r}}getMaxBorderWidth(t){let e=0;const i=this.chart;let n,r,o,s,a;if(!t)for(n=0,r=i.data.datasets.length;n<r;++n)if(i.isDatasetVisible(n)){o=i.getDatasetMeta(n),t=o.data,s=o.controller;break}if(!t)return 0;for(n=0,r=t.length;n<r;++n)a=s.resolveDataElementOptions(n),"inner"!==a.borderAlign&&(e=Math.max(e,a.borderWidth||0,a.hoverBorderWidth||0));return e}getMaxOffset(t){let e=0;for(let i=0,n=t.length;i<n;++i){const t=this.resolveDataElementOptions(i);e=Math.max(e,t.offset||0,t.hoverOffset||0)}return e}_getRingWeightOffset(t){let e=0;for(let i=0;i<t;++i)this.chart.isDatasetVisible(i)&&(e+=this._getRingWeight(i));return e}_getRingWeight(t){return Math.max(dc(this.chart.data.datasets[t].weight,1),0)}_getVisibleDatasetWeightTotal(){return this._getRingWeightOffset(this.chart.data.datasets.length)||1}}class vd extends cd{static id="polarArea";static defaults={dataElementType:"arc",animation:{animateRotate:!0,animateScale:!0},animations:{numbers:{type:"number",properties:["x","y","startAngle","endAngle","innerRadius","outerRadius"]}},indexAxis:"r",startAngle:0};static overrides={aspectRatio:1,plugins:{legend:{labels:{generateLabels(t){const e=t.data;if(e.labels.length&&e.datasets.length){const{labels:{pointStyle:i,color:n}}=t.legend.options;return e.labels.map(((e,r)=>{const o=t.getDatasetMeta(0).controller.getStyle(r);return{text:e,fillStyle:o.backgroundColor,strokeStyle:o.borderColor,fontColor:n,lineWidth:o.borderWidth,pointStyle:i,hidden:!t.getDataVisibility(r),index:r}}))}return[]}},onClick(t,e,i){i.chart.toggleDataVisibility(e.index),i.chart.update()}}},scales:{r:{type:"radialLinear",angleLines:{display:!1},beginAtZero:!0,grid:{circular:!0},pointLabels:{display:!1},startAngle:0}}};constructor(t,e){super(t,e),this.innerRadius=void 0,this.outerRadius=void 0}getLabelAndValue(t){const e=this._cachedMeta,i=this.chart,n=i.data.labels||[],r=_h(e._parsed[t].r,i.options.locale);return{label:n[t]||"",value:r}}parseObjectData(t,e,i,n){return gu.bind(this)(t,e,i,n)}update(t){const e=this._cachedMeta.data;this._updateRadius(),this.updateElements(e,0,e.length,t)}getMinMax(){const t=this._cachedMeta,e={min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY};return t.data.forEach(((t,i)=>{const n=this.getParsed(i).r;!isNaN(n)&&this.chart.getDataVisibility(i)&&(n<e.min&&(e.min=n),n>e.max&&(e.max=n))})),e}_updateRadius(){const t=this.chart,e=t.chartArea,i=t.options,n=Math.min(e.right-e.left,e.bottom-e.top),r=Math.max(n/2,0),o=(r-Math.max(i.cutoutPercentage?r/100*i.cutoutPercentage:1,0))/t.getVisibleDatasetCount();this.outerRadius=r-o*this.index,this.innerRadius=this.outerRadius-o}updateElements(t,e,i,n){const r="reset"===n,o=this.chart,s=o.options.animation,a=this._cachedMeta.rScale,l=a.xCenter,c=a.yCenter,h=a.getIndexAngle(0)-.5*Pc;let u,d=h;const f=360/this.countVisibleElements();for(u=0;u<e;++u)d+=this._computeAngle(u,n,f);for(u=e;u<e+i;u++){const e=t[u];let i=d,p=d+this._computeAngle(u,n,f),g=o.getDataVisibility(u)?a.getDistanceFromCenterForValue(this.getParsed(u).r):0;d=p,r&&(s.animateScale&&(g=0),s.animateRotate&&(i=p=h));const m={x:l,y:c,innerRadius:0,outerRadius:g,startAngle:i,endAngle:p,options:this.resolveDataElementOptions(u,e.active?"active":n)};this.updateElement(e,u,m,n)}}countVisibleElements(){const t=this._cachedMeta;let e=0;return t.data.forEach(((t,i)=>{!isNaN(this.getParsed(i).r)&&this.chart.getDataVisibility(i)&&e++})),e}_computeAngle(t,e,i){return this.chart.getDataVisibility(t)?Wc(this.resolveDataElementOptions(t,e).angle||i):0}}var xd=Object.freeze({__proto__:null,BarController:class extends cd{static id="bar";static defaults={datasetElementType:!1,dataElementType:"bar",categoryPercentage:.8,barPercentage:.9,grouped:!0,animations:{numbers:{type:"number",properties:["x","y","base","width","height"]}}};static overrides={scales:{_index_:{type:"category",offset:!0,grid:{offset:!0}},_value_:{type:"linear",beginAtZero:!0}}};parsePrimitiveData(t,e,i,n){return dd(t,e,i,n)}parseArrayData(t,e,i,n){return dd(t,e,i,n)}parseObjectData(t,e,i,n){const{iScale:r,vScale:o}=t,{xAxisKey:s="x",yAxisKey:a="y"}=this._parsing,l="x"===r.axis?s:a,c="x"===o.axis?s:a,h=[];let u,d,f,p;for(u=i,d=i+n;u<d;++u)p=e[u],f={},f[r.axis]=r.parse(kc(p,l),u),h.push(ud(kc(p,c),f,o,u));return h}updateRangeFromParsed(t,e,i,n){super.updateRangeFromParsed(t,e,i,n);const r=i._custom;r&&e===this._cachedMeta.vScale&&(t.min=Math.min(t.min,r.min),t.max=Math.max(t.max,r.max))}getMaxOverflow(){return 0}getLabelAndValue(t){const e=this._cachedMeta,{iScale:i,vScale:n}=e,r=this.getParsed(t),o=r._custom,s=fd(o)?"["+o.start+", "+o.end+"]":""+n.getLabelForValue(r[n.axis]);return{label:""+i.getLabelForValue(r[i.axis]),value:s}}initialize(){this.enableOptionSharing=!0,super.initialize(),this._cachedMeta.stack=this.getDataset().stack}update(t){const e=this._cachedMeta;this.updateElements(e.data,0,e.data.length,t)}updateElements(t,e,i,n){const r="reset"===n,{index:o,_cachedMeta:{vScale:s}}=this,a=s.getBasePixel(),l=s.isHorizontal(),c=this._getRuler(),{sharedOptions:h,includeOptions:u}=this._getSharedOptions(e,n);for(let d=e;d<e+i;d++){const e=this.getParsed(d),i=r||ac(e[s.axis])?{base:a,head:a}:this._calculateBarValuePixels(d),f=this._calculateBarIndexPixels(d,c),p=(e._stacks||{})[s.axis],g={horizontal:l,base:i.base,enableBorderRadius:!p||fd(e._custom)||o===p._top||o===p._bottom,x:l?i.head:f.center,y:l?f.center:i.head,height:l?f.size:Math.abs(i.size),width:l?Math.abs(i.size):f.size};u&&(g.options=h||this.resolveDataElementOptions(d,t[d].active?"active":n));const m=g.options||t[d].options;pd(g,m,p,o),yd(g,m,c.ratio),this.updateElement(t[d],d,g,n)}}_getStacks(t,e){const{iScale:i}=this._cachedMeta,n=i.getMatchingVisibleMetas(this._type).filter((t=>t.controller.options.grouped)),r=i.options.stacked,o=[],s=t=>{const i=t.controller.getParsed(e),n=i&&i[t.vScale.axis];if(ac(n)||isNaN(n))return!0};for(const i of n)if((void 0===e||!s(i))&&((!1===r||-1===o.indexOf(i.stack)||void 0===r&&void 0===i.stack)&&o.push(i.stack),i.index===t))break;return o.length||o.push(void 0),o}_getStackCount(t){return this._getStacks(void 0,t).length}_getStackIndex(t,e,i){const n=this._getStacks(t,i),r=void 0!==e?n.indexOf(e):-1;return-1===r?n.length-1:r}_getRuler(){const t=this.options,e=this._cachedMeta,i=e.iScale,n=[];let r,o;for(r=0,o=e.data.length;r<o;++r)n.push(i.getPixelForValue(this.getParsed(r)[i.axis],r));const s=t.barThickness;return{min:s||hd(e),pixels:n,start:i._startPixel,end:i._endPixel,stackCount:this._getStackCount(),scale:i,grouped:t.grouped,ratio:s?1:t.categoryPercentage*t.barPercentage}}_calculateBarValuePixels(t){const{_cachedMeta:{vScale:e,_stacked:i,index:n},options:{base:r,minBarLength:o}}=this,s=r||0,a=this.getParsed(t),l=a._custom,c=fd(l);let h,u,d=a[e.axis],f=0,p=i?this.applyStack(e,a,i):d;p!==d&&(f=p-d,p=d),c&&(d=l.barStart,p=l.barEnd-l.barStart,0!==d&&Ic(d)!==Ic(l.barEnd)&&(f=0),f+=d);const g=ac(r)||c?f:r;let m=e.getPixelForValue(g);if(h=this.chart.getDataVisibility(t)?e.getPixelForValue(f+p):m,u=h-m,Math.abs(u)<o){u=function(t,e,i){return 0!==t?Ic(t):(e.isHorizontal()?1:-1)*(e.min>=i?1:-1)}(u,e,s)*o,d===s&&(m-=u/2);const t=e.getPixelForDecimal(0),r=e.getPixelForDecimal(1),l=Math.min(t,r),f=Math.max(t,r);m=Math.max(Math.min(m,f),l),h=m+u,i&&!c&&(a._stacks[e.axis]._visualValues[n]=e.getValueForPixel(h)-e.getValueForPixel(m))}if(m===e.getPixelForValue(s)){const t=Ic(u)*e.getLineWidthForValue(s)/2;m+=t,u-=t}return{size:u,base:m,head:h,center:h+u/2}}_calculateBarIndexPixels(t,e){const i=e.scale,n=this.options,r=n.skipNull,o=dc(n.maxBarThickness,1/0);let s,a;if(e.grouped){const i=r?this._getStackCount(t):e.stackCount,l="flex"===n.barThickness?function(t,e,i,n){const r=e.pixels,o=r[t];let s=t>0?r[t-1]:null,a=t<r.length-1?r[t+1]:null;const l=i.categoryPercentage;null===s&&(s=o-(null===a?e.end-e.start:a-o)),null===a&&(a=o+o-s);const c=o-(o-Math.min(s,a))/2*l;return{chunk:Math.abs(a-s)/2*l/n,ratio:i.barPercentage,start:c}}(t,e,n,i):function(t,e,i,n){const r=i.barThickness;let o,s;return ac(r)?(o=e.min*i.categoryPercentage,s=i.barPercentage):(o=r*n,s=1),{chunk:o/n,ratio:s,start:e.pixels[t]-o/2}}(t,e,n,i),c=this._getStackIndex(this.index,this._cachedMeta.stack,r?t:void 0);s=l.start+l.chunk*c+l.chunk/2,a=Math.min(o,l.chunk*l.ratio)}else s=i.getPixelForValue(this.getParsed(t)[i.axis],t),a=Math.min(o,e.min*e.ratio);return{base:s-a/2,head:s+a/2,center:s,size:a}}draw(){const t=this._cachedMeta,e=t.vScale,i=t.data,n=i.length;let r=0;for(;r<n;++r)null!==this.getParsed(r)[e.axis]&&i[r].draw(this._ctx)}},BubbleController:class extends cd{static id="bubble";static defaults={datasetElementType:!1,dataElementType:"point",animations:{numbers:{type:"number",properties:["x","y","borderWidth","radius"]}}};static overrides={scales:{x:{type:"linear"},y:{type:"linear"}}};initialize(){this.enableOptionSharing=!0,super.initialize()}parsePrimitiveData(t,e,i,n){const r=super.parsePrimitiveData(t,e,i,n);for(let t=0;t<r.length;t++)r[t]._custom=this.resolveDataElementOptions(t+i).radius;return r}parseArrayData(t,e,i,n){const r=super.parseArrayData(t,e,i,n);for(let t=0;t<r.length;t++){const n=e[i+t];r[t]._custom=dc(n[2],this.resolveDataElementOptions(t+i).radius)}return r}parseObjectData(t,e,i,n){const r=super.parseObjectData(t,e,i,n);for(let t=0;t<r.length;t++){const n=e[i+t];r[t]._custom=dc(n&&n.r&&+n.r,this.resolveDataElementOptions(t+i).radius)}return r}getMaxOverflow(){const t=this._cachedMeta.data;let e=0;for(let i=t.length-1;i>=0;--i)e=Math.max(e,t[i].size(this.resolveDataElementOptions(i))/2);return e>0&&e}getLabelAndValue(t){const e=this._cachedMeta,i=this.chart.data.labels||[],{xScale:n,yScale:r}=e,o=this.getParsed(t),s=n.getLabelForValue(o.x),a=r.getLabelForValue(o.y),l=o._custom;return{label:i[t]||"",value:"("+s+", "+a+(l?", "+l:"")+")"}}update(t){const e=this._cachedMeta.data;this.updateElements(e,0,e.length,t)}updateElements(t,e,i,n){const r="reset"===n,{iScale:o,vScale:s}=this._cachedMeta,{sharedOptions:a,includeOptions:l}=this._getSharedOptions(e,n),c=o.axis,h=s.axis;for(let u=e;u<e+i;u++){const e=t[u],i=!r&&this.getParsed(u),d={},f=d[c]=r?o.getPixelForDecimal(.5):o.getPixelForValue(i[c]),p=d[h]=r?s.getBasePixel():s.getPixelForValue(i[h]);d.skip=isNaN(f)||isNaN(p),l&&(d.options=a||this.resolveDataElementOptions(u,e.active?"active":n),r&&(d.options.radius=0)),this.updateElement(e,u,d,n)}}resolveDataElementOptions(t,e){const i=this.getParsed(t);let n=super.resolveDataElementOptions(t,e);n.$shared&&(n=Object.assign({},n,{$shared:!1}));const r=n.radius;return"active"!==e&&(n.radius=0),n.radius+=dc(i&&i._custom,r),n}},DoughnutController:bd,LineController:class extends cd{static id="line";static defaults={datasetElementType:"line",dataElementType:"point",showLine:!0,spanGaps:!1};static overrides={scales:{_index_:{type:"category"},_value_:{type:"linear"}}};initialize(){this.enableOptionSharing=!0,this.supportsDecimation=!0,super.initialize()}update(t){const e=this._cachedMeta,{dataset:i,data:n=[],_dataset:r}=e,o=this.chart._animationsDisabled;let{start:s,count:a}=ch(e,n,o);this._drawStart=s,this._drawCount=a,hh(e)&&(s=0,a=n.length),i._chart=this.chart,i._datasetIndex=this.index,i._decimated=!!r._decimated,i.points=n;const l=this.resolveDatasetElementOptions(t);this.options.showLine||(l.borderWidth=0),l.segment=this.options.segment,this.updateElement(i,void 0,{animated:!o,options:l},t),this.updateElements(n,s,a,t)}updateElements(t,e,i,n){const r="reset"===n,{iScale:o,vScale:s,_stacked:a,_dataset:l}=this._cachedMeta,{sharedOptions:c,includeOptions:h}=this._getSharedOptions(e,n),u=o.axis,d=s.axis,{spanGaps:f,segment:p}=this.options,g=Fc(f)?f:Number.POSITIVE_INFINITY,m=this.chart._animationsDisabled||r||"none"===n,y=e+i,b=t.length;let v=e>0&&this.getParsed(e-1);for(let i=0;i<b;++i){const f=t[i],b=m?f:{};if(i<e||i>=y){b.skip=!0;continue}const x=this.getParsed(i),_=ac(x[d]),w=b[u]=o.getPixelForValue(x[u],i),M=b[d]=r||_?s.getBasePixel():s.getPixelForValue(a?this.applyStack(s,x,a):x[d],i);b.skip=isNaN(w)||isNaN(M)||_,b.stop=i>0&&Math.abs(x[u]-v[u])>g,p&&(b.parsed=x,b.raw=l.data[i]),h&&(b.options=c||this.resolveDataElementOptions(i,f.active?"active":n)),m||this.updateElement(f,i,b,n),v=x}}getMaxOverflow(){const t=this._cachedMeta,e=t.dataset,i=e.options&&e.options.borderWidth||0,n=t.data||[];if(!n.length)return i;const r=n[0].size(this.resolveDataElementOptions(0)),o=n[n.length-1].size(this.resolveDataElementOptions(n.length-1));return Math.max(i,r,o)/2}draw(){const t=this._cachedMeta;t.dataset.updateControlPoints(this.chart.chartArea,t.iScale.axis),super.draw()}},PieController:class extends bd{static id="pie";static defaults={cutout:0,rotation:0,circumference:360,radius:"100%"}},PolarAreaController:vd,RadarController:class extends cd{static id="radar";static defaults={datasetElementType:"line",dataElementType:"point",indexAxis:"r",showLine:!0,elements:{line:{fill:"start"}}};static overrides={aspectRatio:1,scales:{r:{type:"radialLinear"}}};getLabelAndValue(t){const e=this._cachedMeta.vScale,i=this.getParsed(t);return{label:e.getLabels()[t],value:""+e.getLabelForValue(i[e.axis])}}parseObjectData(t,e,i,n){return gu.bind(this)(t,e,i,n)}update(t){const e=this._cachedMeta,i=e.dataset,n=e.data||[],r=e.iScale.getLabels();if(i.points=n,"resize"!==t){const e=this.resolveDatasetElementOptions(t);this.options.showLine||(e.borderWidth=0);const o={_loop:!0,_fullLoop:r.length===n.length,options:e};this.updateElement(i,void 0,o,t)}this.updateElements(n,0,n.length,t)}updateElements(t,e,i,n){const r=this._cachedMeta.rScale,o="reset"===n;for(let s=e;s<e+i;s++){const e=t[s],i=this.resolveDataElementOptions(s,e.active?"active":n),a=r.getPointPositionForValue(s,this.getParsed(s).r),l=o?r.xCenter:a.x,c=o?r.yCenter:a.y,h={x:l,y:c,angle:a.angle,skip:isNaN(l)||isNaN(c),options:i};this.updateElement(e,s,h,n)}}},ScatterController:class extends cd{static id="scatter";static defaults={datasetElementType:!1,dataElementType:"point",showLine:!1,fill:!1};static overrides={interaction:{mode:"point"},scales:{x:{type:"linear"},y:{type:"linear"}}};getLabelAndValue(t){const e=this._cachedMeta,i=this.chart.data.labels||[],{xScale:n,yScale:r}=e,o=this.getParsed(t),s=n.getLabelForValue(o.x),a=r.getLabelForValue(o.y);return{label:i[t]||"",value:"("+s+", "+a+")"}}update(t){const e=this._cachedMeta,{data:i=[]}=e,n=this.chart._animationsDisabled;let{start:r,count:o}=ch(e,i,n);if(this._drawStart=r,this._drawCount=o,hh(e)&&(r=0,o=i.length),this.options.showLine){this.datasetElementType||this.addElements();const{dataset:r,_dataset:o}=e;r._chart=this.chart,r._datasetIndex=this.index,r._decimated=!!o._decimated,r.points=i;const s=this.resolveDatasetElementOptions(t);s.segment=this.options.segment,this.updateElement(r,void 0,{animated:!n,options:s},t)}else this.datasetElementType&&(delete e.dataset,this.datasetElementType=!1);this.updateElements(i,r,o,t)}addElements(){const{showLine:t}=this.options;!this.datasetElementType&&t&&(this.datasetElementType=this.chart.registry.getElement("line")),super.addElements()}updateElements(t,e,i,n){const r="reset"===n,{iScale:o,vScale:s,_stacked:a,_dataset:l}=this._cachedMeta,c=this.resolveDataElementOptions(e,n),h=this.getSharedOptions(c),u=this.includeOptions(n,h),d=o.axis,f=s.axis,{spanGaps:p,segment:g}=this.options,m=Fc(p)?p:Number.POSITIVE_INFINITY,y=this.chart._animationsDisabled||r||"none"===n;let b=e>0&&this.getParsed(e-1);for(let c=e;c<e+i;++c){const e=t[c],i=this.getParsed(c),p=y?e:{},v=ac(i[f]),x=p[d]=o.getPixelForValue(i[d],c),_=p[f]=r||v?s.getBasePixel():s.getPixelForValue(a?this.applyStack(s,i,a):i[f],c);p.skip=isNaN(x)||isNaN(_)||v,p.stop=c>0&&Math.abs(i[d]-b[d])>m,g&&(p.parsed=i,p.raw=l.data[c]),u&&(p.options=h||this.resolveDataElementOptions(c,e.active?"active":n)),y||this.updateElement(e,c,p,n),b=i}this.updateSharedOptions(h,n,c)}getMaxOverflow(){const t=this._cachedMeta,e=t.data||[];if(!this.options.showLine){let t=0;for(let i=e.length-1;i>=0;--i)t=Math.max(t,e[i].size(this.resolveDataElementOptions(i))/2);return t>0&&t}const i=t.dataset,n=i.options&&i.options.borderWidth||0;if(!e.length)return n;const r=e[0].size(this.resolveDataElementOptions(0)),o=e[e.length-1].size(this.resolveDataElementOptions(e.length-1));return Math.max(n,r,o)/2}}});function _d(){throw new Error("This method is not implemented: Check that a complete date adapter is provided.")}class wd{static override(t){Object.assign(wd.prototype,t)}options;constructor(t){this.options=t||{}}init(){}formats(){return _d()}parse(){return _d()}format(){return _d()}add(){return _d()}diff(){return _d()}startOf(){return _d()}endOf(){return _d()}}var Md=wd;function kd(t,e,i,n){const{controller:r,data:o,_sorted:s}=t,a=r._cachedMeta.iScale;if(a&&e===a.axis&&"r"!==e&&s&&o.length){const t=a._reversePixels?eh:th;if(!n)return t(o,e,i);if(r._sharedOptions){const n=o[0],r="function"==typeof n.getRange&&n.getRange(e);if(r){const n=t(o,e,i-r),s=t(o,e,i+r);return{lo:n.lo,hi:s.hi}}}}return{lo:0,hi:o.length-1}}function Sd(t,e,i,n,r){const o=t.getSortedVisibleDatasetMetas(),s=i[e];for(let t=0,i=o.length;t<i;++t){const{index:i,data:a}=o[t],{lo:l,hi:c}=kd(o[t],e,s,r);for(let t=l;t<=c;++t){const e=a[t];e.skip||n(e,i,t)}}}function Od(t,e,i,n,r){const o=[];return r||t.isPointInArea(e)?(Sd(t,i,e,(function(i,s,a){(r||zh(i,t.chartArea,0))&&i.inRange(e.x,e.y,n)&&o.push({element:i,datasetIndex:s,index:a})}),!0),o):o}function Dd(t,e,i,n,r,o){return o||t.isPointInArea(e)?"r"!==i||n?function(t,e,i,n,r,o){let s=[];const a=function(t){const e=-1!==t.indexOf("x"),i=-1!==t.indexOf("y");return function(t,n){const r=e?Math.abs(t.x-n.x):0,o=i?Math.abs(t.y-n.y):0;return Math.sqrt(Math.pow(r,2)+Math.pow(o,2))}}(i);let l=Number.POSITIVE_INFINITY;return Sd(t,i,e,(function(i,c,h){const u=i.inRange(e.x,e.y,r);if(n&&!u)return;const d=i.getCenterPoint(r);if(!o&&!t.isPointInArea(d)&&!u)return;const f=a(e,d);f<l?(s=[{element:i,datasetIndex:c,index:h}],l=f):f===l&&s.push({element:i,datasetIndex:c,index:h})})),s}(t,e,i,n,r,o):function(t,e,i,n){let r=[];return Sd(t,i,e,(function(t,i,o){const{startAngle:s,endAngle:a}=t.getProps(["startAngle","endAngle"],n),{angle:l}=Yc(t,{x:e.x,y:e.y});Zc(l,s,a)&&r.push({element:t,datasetIndex:i,index:o})})),r}(t,e,i,r):[]}function Ed(t,e,i,n,r){const o=[],s="x"===i?"inXRange":"inYRange";let a=!1;return Sd(t,i,e,((t,n,l)=>{t[s](e[i],r)&&(o.push({element:t,datasetIndex:n,index:l}),a=a||t.inRange(e.x,e.y,r))})),n&&!a?[]:o}var Pd={evaluateInteractionItems:Sd,modes:{index(t,e,i,n){const r=Pu(e,t),o=i.axis||"x",s=i.includeInvisible||!1,a=i.intersect?Od(t,r,o,n,s):Dd(t,r,o,!1,n,s),l=[];return a.length?(t.getSortedVisibleDatasetMetas().forEach((t=>{const e=a[0].index,i=t.data[e];i&&!i.skip&&l.push({element:i,datasetIndex:t.index,index:e})})),l):[]},dataset(t,e,i,n){const r=Pu(e,t),o=i.axis||"xy",s=i.includeInvisible||!1;let a=i.intersect?Od(t,r,o,n,s):Dd(t,r,o,!1,n,s);if(a.length>0){const e=a[0].datasetIndex,i=t.getDatasetMeta(e).data;a=[];for(let t=0;t<i.length;++t)a.push({element:i[t],datasetIndex:e,index:t})}return a},point:(t,e,i,n)=>Od(t,Pu(e,t),i.axis||"xy",n,i.includeInvisible||!1),nearest(t,e,i,n){const r=Pu(e,t),o=i.axis||"xy",s=i.includeInvisible||!1;return Dd(t,r,o,i.intersect,n,s)},x:(t,e,i,n)=>Ed(t,Pu(e,t),"x",i.intersect,n),y:(t,e,i,n)=>Ed(t,Pu(e,t),"y",i.intersect,n)}};const Td=["left","top","right","bottom"];function Cd(t,e){return t.filter((t=>t.pos===e))}function Ad(t,e){return t.filter((t=>-1===Td.indexOf(t.pos)&&t.box.axis===e))}function jd(t,e){return t.sort(((t,i)=>{const n=e?i:t,r=e?t:i;return n.weight===r.weight?n.index-r.index:n.weight-r.weight}))}function Rd(t,e,i,n){return Math.max(t[i],e[i])+Math.max(t[n],e[n])}function Ld(t,e){t.top=Math.max(t.top,e.top),t.left=Math.max(t.left,e.left),t.bottom=Math.max(t.bottom,e.bottom),t.right=Math.max(t.right,e.right)}function zd(t,e,i,n){const{pos:r,box:o}=i,s=t.maxPadding;if(!cc(r)){i.size&&(t[r]-=i.size);const e=n[i.stack]||{size:0,count:1};e.size=Math.max(e.size,i.horizontal?o.height:o.width),i.size=e.size/e.count,t[r]+=i.size}o.getPadding&&Ld(s,o.getPadding());const a=Math.max(0,e.outerWidth-Rd(s,t,"left","right")),l=Math.max(0,e.outerHeight-Rd(s,t,"top","bottom")),c=a!==t.w,h=l!==t.h;return t.w=a,t.h=l,i.horizontal?{same:c,other:h}:{same:h,other:c}}function Nd(t,e){const i=e.maxPadding;return function(t){const n={left:0,top:0,right:0,bottom:0};return t.forEach((t=>{n[t]=Math.max(e[t],i[t])})),n}(t?["left","right"]:["top","bottom"])}function Id(t,e,i,n){const r=[];let o,s,a,l,c,h;for(o=0,s=t.length,c=0;o<s;++o){a=t[o],l=a.box,l.update(a.width||e.w,a.height||e.h,Nd(a.horizontal,e));const{same:s,other:u}=zd(e,i,a,n);c|=s&&r.length,h=h||u,l.fullSize||r.push(a)}return c&&Id(r,e,i,n)||h}function Hd(t,e,i,n,r){t.top=i,t.left=e,t.right=e+n,t.bottom=i+r,t.width=n,t.height=r}function Ud(t,e,i,n){const r=i.padding;let{x:o,y:s}=e;for(const a of t){const t=a.box,l=n[a.stack]||{count:1,placed:0,weight:1},c=a.stackWeight/l.weight||1;if(a.horizontal){const n=e.w*c,o=l.size||t.height;Oc(l.start)&&(s=l.start),t.fullSize?Hd(t,r.left,s,i.outerWidth-r.right-r.left,o):Hd(t,e.left+l.placed,s,n,o),l.start=s,l.placed+=n,s=t.bottom}else{const n=e.h*c,s=l.size||t.width;Oc(l.start)&&(o=l.start),t.fullSize?Hd(t,o,r.top,s,i.outerHeight-r.bottom-r.top):Hd(t,o,e.top+l.placed,s,n),l.start=o,l.placed+=n,o=t.right}}e.x=o,e.y=s}var Fd={addBox(t,e){t.boxes||(t.boxes=[]),e.fullSize=e.fullSize||!1,e.position=e.position||"top",e.weight=e.weight||0,e._layers=e._layers||function(){return[{z:0,draw(t){e.draw(t)}}]},t.boxes.push(e)},removeBox(t,e){const i=t.boxes?t.boxes.indexOf(e):-1;-1!==i&&t.boxes.splice(i,1)},configure(t,e,i){e.fullSize=i.fullSize,e.position=i.position,e.weight=i.weight},update(t,e,i,n){if(!t)return;const r=Qh(t.options.layout.padding),o=Math.max(e-r.width,0),s=Math.max(i-r.height,0),a=function(t){const e=function(t){const e=[];let i,n,r,o,s,a;for(i=0,n=(t||[]).length;i<n;++i)r=t[i],({position:o,options:{stack:s,stackWeight:a=1}}=r),e.push({index:i,box:r,pos:o,horizontal:r.isHorizontal(),weight:r.weight,stack:s&&o+s,stackWeight:a});return e}(t),i=jd(e.filter((t=>t.box.fullSize)),!0),n=jd(Cd(e,"left"),!0),r=jd(Cd(e,"right")),o=jd(Cd(e,"top"),!0),s=jd(Cd(e,"bottom")),a=Ad(e,"x"),l=Ad(e,"y");return{fullSize:i,leftAndTop:n.concat(o),rightAndBottom:r.concat(l).concat(s).concat(a),chartArea:Cd(e,"chartArea"),vertical:n.concat(r).concat(l),horizontal:o.concat(s).concat(a)}}(t.boxes),l=a.vertical,c=a.horizontal;gc(t.boxes,(t=>{"function"==typeof t.beforeLayout&&t.beforeLayout()}));const h=l.reduce(((t,e)=>e.box.options&&!1===e.box.options.display?t:t+1),0)||1,u=Object.freeze({outerWidth:e,outerHeight:i,padding:r,availableWidth:o,availableHeight:s,vBoxMaxWidth:o/2/h,hBoxMaxHeight:s/2}),d=Object.assign({},r);Ld(d,Qh(n));const f=Object.assign({maxPadding:d,w:o,h:s,x:r.left,y:r.top},r),p=function(t,e){const i=function(t){const e={};for(const i of t){const{stack:t,pos:n,stackWeight:r}=i;if(!t||!Td.includes(n))continue;const o=e[t]||(e[t]={count:0,placed:0,weight:0,size:0});o.count++,o.weight+=r}return e}(t),{vBoxMaxWidth:n,hBoxMaxHeight:r}=e;let o,s,a;for(o=0,s=t.length;o<s;++o){a=t[o];const{fullSize:s}=a.box,l=i[a.stack],c=l&&a.stackWeight/l.weight;a.horizontal?(a.width=c?c*n:s&&e.availableWidth,a.height=r):(a.width=n,a.height=c?c*r:s&&e.availableHeight)}return i}(l.concat(c),u);Id(a.fullSize,f,u,p),Id(l,f,u,p),Id(c,f,u,p)&&Id(l,f,u,p),function(t){const e=t.maxPadding;function i(i){const n=Math.max(e[i]-t[i],0);return t[i]+=n,n}t.y+=i("top"),t.x+=i("left"),i("right"),i("bottom")}(f),Ud(a.leftAndTop,f,u,p),f.x+=f.w,f.y+=f.h,Ud(a.rightAndBottom,f,u,p),t.chartArea={left:f.left,top:f.top,right:f.left+f.w,bottom:f.top+f.h,height:f.h,width:f.w},gc(a.chartArea,(e=>{const i=e.box;Object.assign(i,t.chartArea),i.update(f.w,f.h,{left:0,top:0,right:0,bottom:0})}))}};class Bd{acquireContext(t,e){}releaseContext(t){return!1}addEventListener(t,e,i){}removeEventListener(t,e,i){}getDevicePixelRatio(){return 1}getMaximumSize(t,e,i,n){return e=Math.max(0,e||t.width),i=i||t.height,{width:e,height:Math.max(0,n?Math.floor(e/n):i)}}isAttached(t){return!0}updateConfig(t){}}class Wd extends Bd{acquireContext(t){return t&&t.getContext&&t.getContext("2d")||null}updateConfig(t){t.options.animation=!1}}const $d="$chartjs",Vd={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"},Yd=t=>null===t||""===t,Gd=!!Au&&{passive:!0};function Xd(t,e,i){t.canvas.removeEventListener(e,i,Gd)}function qd(t,e){for(const i of t)if(i===e||i.contains(e))return!0}function Zd(t,e,i){const n=t.canvas,r=new MutationObserver((t=>{let e=!1;for(const i of t)e=e||qd(i.addedNodes,n),e=e&&!qd(i.removedNodes,n);e&&i()}));return r.observe(document,{childList:!0,subtree:!0}),r}function Kd(t,e,i){const n=t.canvas,r=new MutationObserver((t=>{let e=!1;for(const i of t)e=e||qd(i.removedNodes,n),e=e&&!qd(i.addedNodes,n);e&&i()}));return r.observe(document,{childList:!0,subtree:!0}),r}const Qd=new Map;let Jd=0;function tf(){const t=window.devicePixelRatio;t!==Jd&&(Jd=t,Qd.forEach(((e,i)=>{i.currentDevicePixelRatio!==t&&e()})))}function ef(t,e,i){const n=t.canvas,r=n&&Mu(n);if(!r)return;const o=sh(((t,e)=>{const n=r.clientWidth;i(t,e),n<r.clientWidth&&i()}),window),s=new ResizeObserver((t=>{const e=t[0],i=e.contentRect.width,n=e.contentRect.height;0===i&&0===n||o(i,n)}));return s.observe(r),function(t,e){Qd.size||window.addEventListener("resize",tf),Qd.set(t,e)}(t,o),s}function nf(t,e,i){i&&i.disconnect(),"resize"===e&&function(t){Qd.delete(t),Qd.size||window.removeEventListener("resize",tf)}(t)}function rf(t,e,i){const n=t.canvas,r=sh((e=>{null!==t.ctx&&i(function(t,e){const i=Vd[t.type]||t.type,{x:n,y:r}=Pu(t,e);return{type:i,chart:e,native:t,x:void 0!==n?n:null,y:void 0!==r?r:null}}(e,t))}),t);return function(t,e,i){t.addEventListener(e,i,Gd)}(n,e,r),r}class of extends Bd{acquireContext(t,e){const i=t&&t.getContext&&t.getContext("2d");return i&&i.canvas===t?(function(t,e){const i=t.style,n=t.getAttribute("height"),r=t.getAttribute("width");if(t[$d]={initial:{height:n,width:r,style:{display:i.display,height:i.height,width:i.width}}},i.display=i.display||"block",i.boxSizing=i.boxSizing||"border-box",Yd(r)){const e=ju(t,"width");void 0!==e&&(t.width=e)}if(Yd(n))if(""===t.style.height)t.height=t.width/(e||2);else{const e=ju(t,"height");void 0!==e&&(t.height=e)}}(t,e),i):null}releaseContext(t){const e=t.canvas;if(!e[$d])return!1;const i=e[$d].initial;["height","width"].forEach((t=>{const n=i[t];ac(n)?e.removeAttribute(t):e.setAttribute(t,n)}));const n=i.style||{};return Object.keys(n).forEach((t=>{e.style[t]=n[t]})),e.width=e.width,delete e[$d],!0}addEventListener(t,e,i){this.removeEventListener(t,e);const n=t.$proxies||(t.$proxies={}),r={attach:Zd,detach:Kd,resize:ef}[e]||rf;n[e]=r(t,e,i)}removeEventListener(t,e){const i=t.$proxies||(t.$proxies={}),n=i[e];n&&(({attach:nf,detach:nf,resize:nf}[e]||Xd)(t,e,n),i[e]=void 0)}getDevicePixelRatio(){return window.devicePixelRatio}getMaximumSize(t,e,i,n){return function(t,e,i,n){const r=Su(t),o=Du(r,"margin"),s=ku(r.maxWidth,t,"clientWidth")||Ac,a=ku(r.maxHeight,t,"clientHeight")||Ac,l=function(t,e,i){let n,r;if(void 0===e||void 0===i){const o=Mu(t);if(o){const t=o.getBoundingClientRect(),s=Su(o),a=Du(s,"border","width"),l=Du(s,"padding");e=t.width-l.width-a.width,i=t.height-l.height-a.height,n=ku(s.maxWidth,o,"clientWidth"),r=ku(s.maxHeight,o,"clientHeight")}else e=t.clientWidth,i=t.clientHeight}return{width:e,height:i,maxWidth:n||Ac,maxHeight:r||Ac}}(t,e,i);let{width:c,height:h}=l;if("content-box"===r.boxSizing){const t=Du(r,"border","width"),e=Du(r,"padding");c-=e.width+t.width,h-=e.height+t.height}return c=Math.max(0,c-o.width),h=Math.max(0,n?c/n:h-o.height),c=Tu(Math.min(c,s,l.maxWidth)),h=Tu(Math.min(h,a,l.maxHeight)),c&&!h&&(h=Tu(c/2)),(void 0!==e||void 0!==i)&&n&&l.height&&h>l.height&&(h=l.height,c=Tu(Math.floor(h*n))),{width:c,height:h}}(t,e,i,n)}isAttached(t){const e=Mu(t);return!(!e||!e.isConnected)}}class sf{static defaults={};static defaultRoutes=void 0;x;y;active=!1;options;$animations;tooltipPosition(t){const{x:e,y:i}=this.getProps(["x","y"],t);return{x:e,y:i}}hasValue(){return Fc(this.x)&&Fc(this.y)}getProps(t,e){const i=this.$animations;if(!e||!i)return this;const n={};return t.forEach((t=>{n[t]=i[t]&&i[t].active()?i[t]._to:this[t]})),n}}function af(t,e,i,n,r){const o=dc(n,0),s=Math.min(dc(r,t.length),t.length);let a,l,c,h=0;for(i=Math.ceil(i),r&&(a=r-n,i=a/Math.floor(a/i)),c=o;c<0;)h++,c=Math.round(o+h*i);for(l=Math.max(o,0);l<s;l++)l===c&&(e.push(t[l]),h++,c=Math.round(o+h*i))}const lf=(t,e,i)=>"top"===e||"left"===e?t[e]+i:t[e]-i,cf=(t,e)=>Math.min(e||t,t);function hf(t,e){const i=[],n=t.length/e,r=t.length;let o=0;for(;o<r;o+=n)i.push(t[Math.floor(o)]);return i}function uf(t,e,i){const n=t.ticks.length,r=Math.min(e,n-1),o=t._startPixel,s=t._endPixel,a=1e-6;let l,c=t.getPixelForTick(r);if(!(i&&(l=1===n?Math.max(c-o,s-c):0===e?(t.getPixelForTick(1)-c)/2:(c-t.getPixelForTick(r-1))/2,c+=r<e?l:-l,c<o-a||c>s+a)))return c}function df(t){return t.drawTicks?t.tickLength:0}function ff(t,e){if(!t.display)return 0;const i=Jh(t.font,e),n=Qh(t.padding);return(lc(t.text)?t.text.length:1)*i.lineHeight+n.height}function pf(t,e,i){let n=ah(t);return(i&&"right"!==e||!i&&"right"===e)&&(n=(t=>"left"===t?"right":"right"===t?"left":t)(n)),n}class gf extends sf{constructor(t){super(),this.id=t.id,this.type=t.type,this.options=void 0,this.ctx=t.ctx,this.chart=t.chart,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.width=void 0,this.height=void 0,this._margins={left:0,right:0,top:0,bottom:0},this.maxWidth=void 0,this.maxHeight=void 0,this.paddingTop=void 0,this.paddingBottom=void 0,this.paddingLeft=void 0,this.paddingRight=void 0,this.axis=void 0,this.labelRotation=void 0,this.min=void 0,this.max=void 0,this._range=void 0,this.ticks=[],this._gridLineItems=null,this._labelItems=null,this._labelSizes=null,this._length=0,this._maxLength=0,this._longestTextCache={},this._startPixel=void 0,this._endPixel=void 0,this._reversePixels=!1,this._userMax=void 0,this._userMin=void 0,this._suggestedMax=void 0,this._suggestedMin=void 0,this._ticksLength=0,this._borderValue=0,this._cache={},this._dataLimitsCached=!1,this.$context=void 0}init(t){this.options=t.setContext(this.getContext()),this.axis=t.axis,this._userMin=this.parse(t.min),this._userMax=this.parse(t.max),this._suggestedMin=this.parse(t.suggestedMin),this._suggestedMax=this.parse(t.suggestedMax)}parse(t,e){return t}getUserBounds(){let{_userMin:t,_userMax:e,_suggestedMin:i,_suggestedMax:n}=this;return t=uc(t,Number.POSITIVE_INFINITY),e=uc(e,Number.NEGATIVE_INFINITY),i=uc(i,Number.POSITIVE_INFINITY),n=uc(n,Number.NEGATIVE_INFINITY),{min:uc(t,i),max:uc(e,n),minDefined:hc(t),maxDefined:hc(e)}}getMinMax(t){let e,{min:i,max:n,minDefined:r,maxDefined:o}=this.getUserBounds();if(r&&o)return{min:i,max:n};const s=this.getMatchingVisibleMetas();for(let a=0,l=s.length;a<l;++a)e=s[a].controller.getMinMax(this,t),r||(i=Math.min(i,e.min)),o||(n=Math.max(n,e.max));return i=o&&i>n?n:i,n=r&&i>n?i:n,{min:uc(i,uc(n,i)),max:uc(n,uc(i,n))}}getPadding(){return{left:this.paddingLeft||0,top:this.paddingTop||0,right:this.paddingRight||0,bottom:this.paddingBottom||0}}getTicks(){return this.ticks}getLabels(){const t=this.chart.data;return this.options.labels||(this.isHorizontal()?t.xLabels:t.yLabels)||t.labels||[]}getLabelItems(t=this.chart.chartArea){return this._labelItems||(this._labelItems=this._computeLabelItems(t))}beforeLayout(){this._cache={},this._dataLimitsCached=!1}beforeUpdate(){pc(this.options.beforeUpdate,[this])}update(t,e,i){const{beginAtZero:n,grace:r,ticks:o}=this.options,s=o.sampleSize;this.beforeUpdate(),this.maxWidth=t,this.maxHeight=e,this._margins=i=Object.assign({left:0,right:0,top:0,bottom:0},i),this.ticks=null,this._labelSizes=null,this._gridLineItems=null,this._labelItems=null,this.beforeSetDimensions(),this.setDimensions(),this.afterSetDimensions(),this._maxLength=this.isHorizontal()?this.width+i.left+i.right:this.height+i.top+i.bottom,this._dataLimitsCached||(this.beforeDataLimits(),this.determineDataLimits(),this.afterDataLimits(),this._range=function(t,e,i){const{min:n,max:r}=t,o=fc(e,(r-n)/2),s=(t,e)=>i&&0===t?0:t+e;return{min:s(n,-Math.abs(o)),max:s(r,o)}}(this,r,n),this._dataLimitsCached=!0),this.beforeBuildTicks(),this.ticks=this.buildTicks()||[],this.afterBuildTicks();const a=s<this.ticks.length;this._convertTicksToLabels(a?hf(this.ticks,s):this.ticks),this.configure(),this.beforeCalculateLabelRotation(),this.calculateLabelRotation(),this.afterCalculateLabelRotation(),o.display&&(o.autoSkip||"auto"===o.source)&&(this.ticks=function(t,e){const i=t.options.ticks,n=function(t){const e=t.options.offset,i=t._tickSize(),n=t._length/i+(e?0:1),r=t._maxLength/i;return Math.floor(Math.min(n,r))}(t),r=Math.min(i.maxTicksLimit||n,n),o=i.major.enabled?function(t){const e=[];let i,n;for(i=0,n=t.length;i<n;i++)t[i].major&&e.push(i);return e}(e):[],s=o.length,a=o[0],l=o[s-1],c=[];if(s>r)return function(t,e,i,n){let r,o=0,s=i[0];for(n=Math.ceil(n),r=0;r<t.length;r++)r===s&&(e.push(t[r]),o++,s=i[o*n])}(e,c,o,s/r),c;const h=function(t,e,i){const n=function(t){const e=t.length;let i,n;if(e<2)return!1;for(n=t[0],i=1;i<e;++i)if(t[i]-t[i-1]!==n)return!1;return n}(t),r=e.length/i;if(!n)return Math.max(r,1);const o=function(t){const e=[],i=Math.sqrt(t);let n;for(n=1;n<i;n++)t%n==0&&(e.push(n),e.push(t/n));return i===(0|i)&&e.push(i),e.sort(((t,e)=>t-e)).pop(),e}(n);for(let t=0,e=o.length-1;t<e;t++){const e=o[t];if(e>r)return e}return Math.max(r,1)}(o,e,r);if(s>0){let t,i;const n=s>1?Math.round((l-a)/(s-1)):null;for(af(e,c,h,ac(n)?0:a-n,a),t=0,i=s-1;t<i;t++)af(e,c,h,o[t],o[t+1]);return af(e,c,h,l,ac(n)?e.length:l+n),c}return af(e,c,h),c}(this,this.ticks),this._labelSizes=null,this.afterAutoSkip()),a&&this._convertTicksToLabels(this.ticks),this.beforeFit(),this.fit(),this.afterFit(),this.afterUpdate()}configure(){let t,e,i=this.options.reverse;this.isHorizontal()?(t=this.left,e=this.right):(t=this.top,e=this.bottom,i=!i),this._startPixel=t,this._endPixel=e,this._reversePixels=i,this._length=e-t,this._alignToPixels=this.options.alignToPixels}afterUpdate(){pc(this.options.afterUpdate,[this])}beforeSetDimensions(){pc(this.options.beforeSetDimensions,[this])}setDimensions(){this.isHorizontal()?(this.width=this.maxWidth,this.left=0,this.right=this.width):(this.height=this.maxHeight,this.top=0,this.bottom=this.height),this.paddingLeft=0,this.paddingTop=0,this.paddingRight=0,this.paddingBottom=0}afterSetDimensions(){pc(this.options.afterSetDimensions,[this])}_callHooks(t){this.chart.notifyPlugins(t,this.getContext()),pc(this.options[t],[this])}beforeDataLimits(){this._callHooks("beforeDataLimits")}determineDataLimits(){}afterDataLimits(){this._callHooks("afterDataLimits")}beforeBuildTicks(){this._callHooks("beforeBuildTicks")}buildTicks(){return[]}afterBuildTicks(){this._callHooks("afterBuildTicks")}beforeTickToLabelConversion(){pc(this.options.beforeTickToLabelConversion,[this])}generateTickLabels(t){const e=this.options.ticks;let i,n,r;for(i=0,n=t.length;i<n;i++)r=t[i],r.label=pc(e.callback,[r.value,i,t],this)}afterTickToLabelConversion(){pc(this.options.afterTickToLabelConversion,[this])}beforeCalculateLabelRotation(){pc(this.options.beforeCalculateLabelRotation,[this])}calculateLabelRotation(){const t=this.options,e=t.ticks,i=cf(this.ticks.length,t.ticks.maxTicksLimit),n=e.minRotation||0,r=e.maxRotation;let o,s,a,l=n;if(!this._isVisible()||!e.display||n>=r||i<=1||!this.isHorizontal())return void(this.labelRotation=n);const c=this._getLabelSizes(),h=c.widest.width,u=c.highest.height,d=Kc(this.chart.width-h,0,this.maxWidth);o=t.offset?this.maxWidth/i:d/(i-1),h+6>o&&(o=d/(i-(t.offset?.5:1)),s=this.maxHeight-df(t.grid)-e.padding-ff(t.title,this.chart.options.font),a=Math.sqrt(h*h+u*u),l=$c(Math.min(Math.asin(Kc((c.highest.height+6)/o,-1,1)),Math.asin(Kc(s/a,-1,1))-Math.asin(Kc(u/a,-1,1)))),l=Math.max(n,Math.min(r,l))),this.labelRotation=l}afterCalculateLabelRotation(){pc(this.options.afterCalculateLabelRotation,[this])}afterAutoSkip(){}beforeFit(){pc(this.options.beforeFit,[this])}fit(){const t={width:0,height:0},{chart:e,options:{ticks:i,title:n,grid:r}}=this,o=this._isVisible(),s=this.isHorizontal();if(o){const o=ff(n,e.options.font);if(s?(t.width=this.maxWidth,t.height=df(r)+o):(t.height=this.maxHeight,t.width=df(r)+o),i.display&&this.ticks.length){const{first:e,last:n,widest:r,highest:o}=this._getLabelSizes(),a=2*i.padding,l=Wc(this.labelRotation),c=Math.cos(l),h=Math.sin(l);if(s){const e=i.mirror?0:h*r.width+c*o.height;t.height=Math.min(this.maxHeight,t.height+e+a)}else{const e=i.mirror?0:c*r.width+h*o.height;t.width=Math.min(this.maxWidth,t.width+e+a)}this._calculatePadding(e,n,h,c)}}this._handleMargins(),s?(this.width=this._length=e.width-this._margins.left-this._margins.right,this.height=t.height):(this.width=t.width,this.height=this._length=e.height-this._margins.top-this._margins.bottom)}_calculatePadding(t,e,i,n){const{ticks:{align:r,padding:o},position:s}=this.options,a=0!==this.labelRotation,l="top"!==s&&"x"===this.axis;if(this.isHorizontal()){const s=this.getPixelForTick(0)-this.left,c=this.right-this.getPixelForTick(this.ticks.length-1);let h=0,u=0;a?l?(h=n*t.width,u=i*e.height):(h=i*t.height,u=n*e.width):"start"===r?u=e.width:"end"===r?h=t.width:"inner"!==r&&(h=t.width/2,u=e.width/2),this.paddingLeft=Math.max((h-s+o)*this.width/(this.width-s),0),this.paddingRight=Math.max((u-c+o)*this.width/(this.width-c),0)}else{let i=e.height/2,n=t.height/2;"start"===r?(i=0,n=t.height):"end"===r&&(i=e.height,n=0),this.paddingTop=i+o,this.paddingBottom=n+o}}_handleMargins(){this._margins&&(this._margins.left=Math.max(this.paddingLeft,this._margins.left),this._margins.top=Math.max(this.paddingTop,this._margins.top),this._margins.right=Math.max(this.paddingRight,this._margins.right),this._margins.bottom=Math.max(this.paddingBottom,this._margins.bottom))}afterFit(){pc(this.options.afterFit,[this])}isHorizontal(){const{axis:t,position:e}=this.options;return"top"===e||"bottom"===e||"x"===t}isFullSize(){return this.options.fullSize}_convertTicksToLabels(t){let e,i;for(this.beforeTickToLabelConversion(),this.generateTickLabels(t),e=0,i=t.length;e<i;e++)ac(t[e].label)&&(t.splice(e,1),i--,e--);this.afterTickToLabelConversion()}_getLabelSizes(){let t=this._labelSizes;if(!t){const e=this.options.ticks.sampleSize;let i=this.ticks;e<i.length&&(i=hf(i,e)),this._labelSizes=t=this._computeLabelSizes(i,i.length,this.options.ticks.maxTicksLimit)}return t}_computeLabelSizes(t,e,i){const{ctx:n,_longestTextCache:r}=this,o=[],s=[],a=Math.floor(e/cf(e,i));let l,c,h,u,d,f,p,g,m,y,b,v=0,x=0;for(l=0;l<e;l+=a){if(u=t[l].label,d=this._resolveTickFontOptions(l),n.font=f=d.string,p=r[f]=r[f]||{data:{},gc:[]},g=d.lineHeight,m=y=0,ac(u)||lc(u)){if(lc(u))for(c=0,h=u.length;c<h;++c)b=u[c],ac(b)||lc(b)||(m=Th(n,p.data,p.gc,m,b),y+=g)}else m=Th(n,p.data,p.gc,m,u),y=g;o.push(m),s.push(y),v=Math.max(m,v),x=Math.max(y,x)}!function(t,e){gc(t,(t=>{const i=t.gc,n=i.length/2;let r;if(n>e){for(r=0;r<n;++r)delete t.data[i[r]];i.splice(0,n)}}))}(r,e);const _=o.indexOf(v),w=s.indexOf(x),M=t=>({width:o[t]||0,height:s[t]||0});return{first:M(0),last:M(e-1),widest:M(_),highest:M(w),widths:o,heights:s}}getLabelForValue(t){return t}getPixelForValue(t,e){return NaN}getValueForPixel(t){}getPixelForTick(t){const e=this.ticks;return t<0||t>e.length-1?null:this.getPixelForValue(e[t].value)}getPixelForDecimal(t){this._reversePixels&&(t=1-t);const e=this._startPixel+t*this._length;return function(t){return Kc(t,-32768,32767)}(this._alignToPixels?Ah(this.chart,e,0):e)}getDecimalForPixel(t){const e=(t-this._startPixel)/this._length;return this._reversePixels?1-e:e}getBasePixel(){return this.getPixelForValue(this.getBaseValue())}getBaseValue(){const{min:t,max:e}=this;return t<0&&e<0?e:t>0&&e>0?t:0}getContext(t){const e=this.ticks||[];if(t>=0&&t<e.length){const i=e[t];return i.$context||(i.$context=function(t,e,i){return eu(t,{tick:i,index:e,type:"tick"})}(this.getContext(),t,i))}return this.$context||(this.$context=eu(this.chart.getContext(),{scale:this,type:"scale"}))}_tickSize(){const t=this.options.ticks,e=Wc(this.labelRotation),i=Math.abs(Math.cos(e)),n=Math.abs(Math.sin(e)),r=this._getLabelSizes(),o=t.autoSkipPadding||0,s=r?r.widest.width+o:0,a=r?r.highest.height+o:0;return this.isHorizontal()?a*i>s*n?s/i:a/n:a*n<s*i?a/i:s/n}_isVisible(){const t=this.options.display;return"auto"!==t?!!t:this.getMatchingVisibleMetas().length>0}_computeGridLineItems(t){const e=this.axis,i=this.chart,n=this.options,{grid:r,position:o,border:s}=n,a=r.offset,l=this.isHorizontal(),c=this.ticks.length+(a?1:0),h=df(r),u=[],d=s.setContext(this.getContext()),f=d.display?d.width:0,p=f/2,g=function(t){return Ah(i,t,f)};let m,y,b,v,x,_,w,M,k,S,O,D;if("top"===o)m=g(this.bottom),_=this.bottom-h,M=m-p,S=g(t.top)+p,D=t.bottom;else if("bottom"===o)m=g(this.top),S=t.top,D=g(t.bottom)-p,_=m+p,M=this.top+h;else if("left"===o)m=g(this.right),x=this.right-h,w=m-p,k=g(t.left)+p,O=t.right;else if("right"===o)m=g(this.left),k=t.left,O=g(t.right)-p,x=m+p,w=this.left+h;else if("x"===e){if("center"===o)m=g((t.top+t.bottom)/2+.5);else if(cc(o)){const t=Object.keys(o)[0],e=o[t];m=g(this.chart.scales[t].getPixelForValue(e))}S=t.top,D=t.bottom,_=m+p,M=_+h}else if("y"===e){if("center"===o)m=g((t.left+t.right)/2);else if(cc(o)){const t=Object.keys(o)[0],e=o[t];m=g(this.chart.scales[t].getPixelForValue(e))}x=m-p,w=x-h,k=t.left,O=t.right}const E=dc(n.ticks.maxTicksLimit,c),P=Math.max(1,Math.ceil(c/E));for(y=0;y<c;y+=P){const t=this.getContext(y),e=r.setContext(t),n=s.setContext(t),o=e.lineWidth,c=e.color,h=n.dash||[],d=n.dashOffset,f=e.tickWidth,p=e.tickColor,g=e.tickBorderDash||[],m=e.tickBorderDashOffset;b=uf(this,y,a),void 0!==b&&(v=Ah(i,b,o),l?x=w=k=O=v:_=M=S=D=v,u.push({tx1:x,ty1:_,tx2:w,ty2:M,x1:k,y1:S,x2:O,y2:D,width:o,color:c,borderDash:h,borderDashOffset:d,tickWidth:f,tickColor:p,tickBorderDash:g,tickBorderDashOffset:m}))}return this._ticksLength=c,this._borderValue=m,u}_computeLabelItems(t){const e=this.axis,i=this.options,{position:n,ticks:r}=i,o=this.isHorizontal(),s=this.ticks,{align:a,crossAlign:l,padding:c,mirror:h}=r,u=df(i.grid),d=u+c,f=h?-c:d,p=-Wc(this.labelRotation),g=[];let m,y,b,v,x,_,w,M,k,S,O,D,E="middle";if("top"===n)_=this.bottom-f,w=this._getXAxisLabelAlignment();else if("bottom"===n)_=this.top+f,w=this._getXAxisLabelAlignment();else if("left"===n){const t=this._getYAxisLabelAlignment(u);w=t.textAlign,x=t.x}else if("right"===n){const t=this._getYAxisLabelAlignment(u);w=t.textAlign,x=t.x}else if("x"===e){if("center"===n)_=(t.top+t.bottom)/2+d;else if(cc(n)){const t=Object.keys(n)[0],e=n[t];_=this.chart.scales[t].getPixelForValue(e)+d}w=this._getXAxisLabelAlignment()}else if("y"===e){if("center"===n)x=(t.left+t.right)/2-d;else if(cc(n)){const t=Object.keys(n)[0],e=n[t];x=this.chart.scales[t].getPixelForValue(e)}w=this._getYAxisLabelAlignment(u).textAlign}"y"===e&&("start"===a?E="top":"end"===a&&(E="bottom"));const P=this._getLabelSizes();for(m=0,y=s.length;m<y;++m){b=s[m],v=b.label;const t=r.setContext(this.getContext(m));M=this.getPixelForTick(m)+r.labelOffset,k=this._resolveTickFontOptions(m),S=k.lineHeight,O=lc(v)?v.length:1;const e=O/2,i=t.color,a=t.textStrokeColor,c=t.textStrokeWidth;let u,d=w;if(o?(x=M,"inner"===w&&(d=m===y-1?this.options.reverse?"left":"right":0===m?this.options.reverse?"right":"left":"center"),D="top"===n?"near"===l||0!==p?-O*S+S/2:"center"===l?-P.highest.height/2-e*S+S:-P.highest.height+S/2:"near"===l||0!==p?S/2:"center"===l?P.highest.height/2-e*S:P.highest.height-O*S,h&&(D*=-1),0===p||t.showLabelBackdrop||(x+=S/2*Math.sin(p))):(_=M,D=(1-O)*S/2),t.showLabelBackdrop){const e=Qh(t.backdropPadding),i=P.heights[m],n=P.widths[m];let r=D-e.top,o=0-e.left;switch(E){case"middle":r-=i/2;break;case"bottom":r-=i}switch(w){case"center":o-=n/2;break;case"right":o-=n}u={left:o,top:r,width:n+e.width,height:i+e.height,color:t.backdropColor}}g.push({label:v,font:k,textOffset:D,options:{rotation:p,color:i,strokeColor:a,strokeWidth:c,textAlign:d,textBaseline:E,translation:[x,_],backdrop:u}})}return g}_getXAxisLabelAlignment(){const{position:t,ticks:e}=this.options;if(-Wc(this.labelRotation))return"top"===t?"left":"right";let i="center";return"start"===e.align?i="left":"end"===e.align?i="right":"inner"===e.align&&(i="inner"),i}_getYAxisLabelAlignment(t){const{position:e,ticks:{crossAlign:i,mirror:n,padding:r}}=this.options,o=t+r,s=this._getLabelSizes().widest.width;let a,l;return"left"===e?n?(l=this.right+r,"near"===i?a="left":"center"===i?(a="center",l+=s/2):(a="right",l+=s)):(l=this.right-o,"near"===i?a="right":"center"===i?(a="center",l-=s/2):(a="left",l=this.left)):"right"===e?n?(l=this.left+r,"near"===i?a="right":"center"===i?(a="center",l-=s/2):(a="left",l-=s)):(l=this.left+o,"near"===i?a="left":"center"===i?(a="center",l+=s/2):(a="right",l=this.right)):a="right",{textAlign:a,x:l}}_computeLabelArea(){if(this.options.ticks.mirror)return;const t=this.chart,e=this.options.position;return"left"===e||"right"===e?{top:0,left:this.left,bottom:t.height,right:this.right}:"top"===e||"bottom"===e?{top:this.top,left:0,bottom:this.bottom,right:t.width}:void 0}drawBackground(){const{ctx:t,options:{backgroundColor:e},left:i,top:n,width:r,height:o}=this;e&&(t.save(),t.fillStyle=e,t.fillRect(i,n,r,o),t.restore())}getLineWidthForValue(t){const e=this.options.grid;if(!this._isVisible()||!e.display)return 0;const i=this.ticks.findIndex((e=>e.value===t));return i>=0?e.setContext(this.getContext(i)).lineWidth:0}drawGrid(t){const e=this.options.grid,i=this.ctx,n=this._gridLineItems||(this._gridLineItems=this._computeGridLineItems(t));let r,o;const s=(t,e,n)=>{n.width&&n.color&&(i.save(),i.lineWidth=n.width,i.strokeStyle=n.color,i.setLineDash(n.borderDash||[]),i.lineDashOffset=n.borderDashOffset,i.beginPath(),i.moveTo(t.x,t.y),i.lineTo(e.x,e.y),i.stroke(),i.restore())};if(e.display)for(r=0,o=n.length;r<o;++r){const t=n[r];e.drawOnChartArea&&s({x:t.x1,y:t.y1},{x:t.x2,y:t.y2},t),e.drawTicks&&s({x:t.tx1,y:t.ty1},{x:t.tx2,y:t.ty2},{color:t.tickColor,width:t.tickWidth,borderDash:t.tickBorderDash,borderDashOffset:t.tickBorderDashOffset})}}drawBorder(){const{chart:t,ctx:e,options:{border:i,grid:n}}=this,r=i.setContext(this.getContext()),o=i.display?r.width:0;if(!o)return;const s=n.setContext(this.getContext(0)).lineWidth,a=this._borderValue;let l,c,h,u;this.isHorizontal()?(l=Ah(t,this.left,o)-o/2,c=Ah(t,this.right,s)+s/2,h=u=a):(h=Ah(t,this.top,o)-o/2,u=Ah(t,this.bottom,s)+s/2,l=c=a),e.save(),e.lineWidth=r.width,e.strokeStyle=r.color,e.beginPath(),e.moveTo(l,h),e.lineTo(c,u),e.stroke(),e.restore()}drawLabels(t){if(!this.options.ticks.display)return;const e=this.ctx,i=this._computeLabelArea();i&&Nh(e,i);const n=this.getLabelItems(t);for(const t of n){const i=t.options,n=t.font;Wh(e,t.label,0,t.textOffset,n,i)}i&&Ih(e)}drawTitle(){const{ctx:t,options:{position:e,title:i,reverse:n}}=this;if(!i.display)return;const r=Jh(i.font),o=Qh(i.padding),s=i.align;let a=r.lineHeight/2;"bottom"===e||"center"===e||cc(e)?(a+=o.bottom,lc(i.text)&&(a+=r.lineHeight*(i.text.length-1))):a+=o.top;const{titleX:l,titleY:c,maxWidth:h,rotation:u}=function(t,e,i,n){const{top:r,left:o,bottom:s,right:a,chart:l}=t,{chartArea:c,scales:h}=l;let u,d,f,p=0;const g=s-r,m=a-o;if(t.isHorizontal()){if(d=lh(n,o,a),cc(i)){const t=Object.keys(i)[0],n=i[t];f=h[t].getPixelForValue(n)+g-e}else f="center"===i?(c.bottom+c.top)/2+g-e:lf(t,i,e);u=a-o}else{if(cc(i)){const t=Object.keys(i)[0],n=i[t];d=h[t].getPixelForValue(n)-m+e}else d="center"===i?(c.left+c.right)/2-m+e:lf(t,i,e);f=lh(n,s,r),p="left"===i?-Rc:Rc}return{titleX:d,titleY:f,maxWidth:u,rotation:p}}(this,a,e,s);Wh(t,i.text,0,0,r,{color:i.color,maxWidth:h,rotation:u,textAlign:pf(s,e,n),textBaseline:"middle",translation:[l,c]})}draw(t){this._isVisible()&&(this.drawBackground(),this.drawGrid(t),this.drawBorder(),this.drawTitle(),this.drawLabels(t))}_layers(){const t=this.options,e=t.ticks&&t.ticks.z||0,i=dc(t.grid&&t.grid.z,-1),n=dc(t.border&&t.border.z,0);return this._isVisible()&&this.draw===gf.prototype.draw?[{z:i,draw:t=>{this.drawBackground(),this.drawGrid(t),this.drawTitle()}},{z:n,draw:()=>{this.drawBorder()}},{z:e,draw:t=>{this.drawLabels(t)}}]:[{z:e,draw:t=>{this.draw(t)}}]}getMatchingVisibleMetas(t){const e=this.chart.getSortedVisibleDatasetMetas(),i=this.axis+"AxisID",n=[];let r,o;for(r=0,o=e.length;r<o;++r){const o=e[r];o[i]!==this.id||t&&o.type!==t||n.push(o)}return n}_resolveTickFontOptions(t){return Jh(this.options.ticks.setContext(this.getContext(t)).font)}_maxDigits(){const t=this._resolveTickFontOptions(0).lineHeight;return(this.isHorizontal()?this.width:this.height)/t}}class mf{constructor(t,e,i){this.type=t,this.scope=e,this.override=i,this.items=Object.create(null)}isForType(t){return Object.prototype.isPrototypeOf.call(this.type.prototype,t.prototype)}register(t){const e=Object.getPrototypeOf(t);let i;(function(t){return"id"in t&&"defaults"in t})(e)&&(i=this.register(e));const n=this.items,r=t.id,o=this.scope+"."+r;if(!r)throw new Error("class does not have id: "+t);return r in n||(n[r]=t,function(t,e,i){const n=xc(Object.create(null),[i?Ph.get(i):{},Ph.get(e),t.defaults]);Ph.set(e,n),t.defaultRoutes&&function(t,e){Object.keys(e).forEach((i=>{const n=i.split("."),r=n.pop(),o=[t].concat(n).join("."),s=e[i].split("."),a=s.pop(),l=s.join(".");Ph.route(o,r,l,a)}))}(e,t.defaultRoutes),t.descriptors&&Ph.describe(e,t.descriptors)}(t,o,i),this.override&&Ph.override(t.id,t.overrides)),o}get(t){return this.items[t]}unregister(t){const e=this.items,i=t.id,n=this.scope;i in e&&delete e[i],n&&i in Ph[n]&&(delete Ph[n][i],this.override&&delete kh[i])}}class yf{constructor(){this.controllers=new mf(cd,"datasets",!0),this.elements=new mf(sf,"elements"),this.plugins=new mf(Object,"plugins"),this.scales=new mf(gf,"scales"),this._typedRegistries=[this.controllers,this.scales,this.elements]}add(...t){this._each("register",t)}remove(...t){this._each("unregister",t)}addControllers(...t){this._each("register",t,this.controllers)}addElements(...t){this._each("register",t,this.elements)}addPlugins(...t){this._each("register",t,this.plugins)}addScales(...t){this._each("register",t,this.scales)}getController(t){return this._get(t,this.controllers,"controller")}getElement(t){return this._get(t,this.elements,"element")}getPlugin(t){return this._get(t,this.plugins,"plugin")}getScale(t){return this._get(t,this.scales,"scale")}removeControllers(...t){this._each("unregister",t,this.controllers)}removeElements(...t){this._each("unregister",t,this.elements)}removePlugins(...t){this._each("unregister",t,this.plugins)}removeScales(...t){this._each("unregister",t,this.scales)}_each(t,e,i){[...e].forEach((e=>{const n=i||this._getRegistryForType(e);i||n.isForType(e)||n===this.plugins&&e.id?this._exec(t,n,e):gc(e,(e=>{const n=i||this._getRegistryForType(e);this._exec(t,n,e)}))}))}_exec(t,e,i){const n=Sc(t);pc(i["before"+n],[],i),e[t](i),pc(i["after"+n],[],i)}_getRegistryForType(t){for(let e=0;e<this._typedRegistries.length;e++){const i=this._typedRegistries[e];if(i.isForType(t))return i}return this.plugins}_get(t,e,i){const n=e.get(t);if(void 0===n)throw new Error('"'+t+'" is not a registered '+i+".");return n}}var bf=new yf;class vf{constructor(){this._init=[]}notify(t,e,i,n){"beforeInit"===e&&(this._init=this._createDescriptors(t,!0),this._notify(this._init,t,"install"));const r=n?this._descriptors(t).filter(n):this._descriptors(t),o=this._notify(r,t,e,i);return"afterDestroy"===e&&(this._notify(r,t,"stop"),this._notify(this._init,t,"uninstall")),o}_notify(t,e,i,n){n=n||{};for(const r of t){const t=r.plugin;if(!1===pc(t[i],[e,n,r.options],t)&&n.cancelable)return!1}return!0}invalidate(){ac(this._cache)||(this._oldCache=this._cache,this._cache=void 0)}_descriptors(t){if(this._cache)return this._cache;const e=this._cache=this._createDescriptors(t);return this._notifyStateChanges(t),e}_createDescriptors(t,e){const i=t&&t.config,n=dc(i.options&&i.options.plugins,{}),r=function(t){const e={},i=[],n=Object.keys(bf.plugins.items);for(let t=0;t<n.length;t++)i.push(bf.getPlugin(n[t]));const r=t.plugins||[];for(let t=0;t<r.length;t++){const n=r[t];-1===i.indexOf(n)&&(i.push(n),e[n.id]=!0)}return{plugins:i,localIds:e}}(i);return!1!==n||e?function(t,{plugins:e,localIds:i},n,r){const o=[],s=t.getContext();for(const a of e){const e=a.id,l=xf(n[e],r);null!==l&&o.push({plugin:a,options:_f(t.config,{plugin:a,local:i[e]},l,s)})}return o}(t,r,n,e):[]}_notifyStateChanges(t){const e=this._oldCache||[],i=this._cache,n=(t,e)=>t.filter((t=>!e.some((e=>t.plugin.id===e.plugin.id))));this._notify(n(e,i),t,"stop"),this._notify(n(i,e),t,"start")}}function xf(t,e){return e||!1!==t?!0===t?{}:t:null}function _f(t,{plugin:e,local:i},n,r){const o=t.pluginScopeKeys(e),s=t.getOptionScopes(n,o);return i&&e.defaults&&s.push(e.defaults),t.createResolver(s,r,[""],{scriptable:!1,indexable:!1,allKeys:!0})}function wf(t,e){const i=Ph.datasets[t]||{};return((e.datasets||{})[t]||{}).indexAxis||e.indexAxis||i.indexAxis||"x"}function Mf(t){if("x"===t||"y"===t||"r"===t)return t}function kf(t,...e){if(Mf(t))return t;for(const n of e){const e=n.axis||("top"===(i=n.position)||"bottom"===i?"x":"left"===i||"right"===i?"y":void 0)||t.length>1&&Mf(t[0].toLowerCase());if(e)return e}var i;throw new Error(`Cannot determine type of '${t}' axis. Please provide 'axis' or 'position' option.`)}function Sf(t,e,i){if(i[e+"AxisID"]===t)return{axis:e}}function Of(t){const e=t.options||(t.options={});e.plugins=dc(e.plugins,{}),e.scales=function(t,e){const i=kh[t.type]||{scales:{}},n=e.scales||{},r=wf(t.type,e),o=Object.create(null);return Object.keys(n).forEach((e=>{const s=n[e];if(!cc(s))return console.error(`Invalid scale configuration for scale: ${e}`);if(s._proxy)return console.warn(`Ignoring resolver passed as options for scale: ${e}`);const a=kf(e,s,function(t,e){if(e.data&&e.data.datasets){const i=e.data.datasets.filter((e=>e.xAxisID===t||e.yAxisID===t));if(i.length)return Sf(t,"x",i[0])||Sf(t,"y",i[0])}return{}}(e,t),Ph.scales[s.type]),l=function(t,e){return t===e?"_index_":"_value_"}(a,r),c=i.scales||{};o[e]=_c(Object.create(null),[{axis:a},s,c[a],c[l]])})),t.data.datasets.forEach((i=>{const r=i.type||t.type,s=i.indexAxis||wf(r,e),a=(kh[r]||{}).scales||{};Object.keys(a).forEach((t=>{const e=function(t,e){let i=t;return"_index_"===t?i=e:"_value_"===t&&(i="x"===e?"y":"x"),i}(t,s),r=i[e+"AxisID"]||e;o[r]=o[r]||Object.create(null),_c(o[r],[{axis:e},n[r],a[t]])}))})),Object.keys(o).forEach((t=>{const e=o[t];_c(e,[Ph.scales[e.type],Ph.scale])})),o}(t,e)}function Df(t){return(t=t||{}).datasets=t.datasets||[],t.labels=t.labels||[],t}const Ef=new Map,Pf=new Set;function Tf(t,e){let i=Ef.get(t);return i||(i=e(),Ef.set(t,i),Pf.add(i)),i}const Cf=(t,e,i)=>{const n=kc(e,i);void 0!==n&&t.add(n)};class Af{constructor(t){this._config=function(t){return(t=t||{}).data=Df(t.data),Of(t),t}(t),this._scopeCache=new Map,this._resolverCache=new Map}get platform(){return this._config.platform}get type(){return this._config.type}set type(t){this._config.type=t}get data(){return this._config.data}set data(t){this._config.data=Df(t)}get options(){return this._config.options}set options(t){this._config.options=t}get plugins(){return this._config.plugins}update(){const t=this._config;this.clearCache(),Of(t)}clearCache(){this._scopeCache.clear(),this._resolverCache.clear()}datasetScopeKeys(t){return Tf(t,(()=>[[`datasets.${t}`,""]]))}datasetAnimationScopeKeys(t,e){return Tf(`${t}.transition.${e}`,(()=>[[`datasets.${t}.transitions.${e}`,`transitions.${e}`],[`datasets.${t}`,""]]))}datasetElementScopeKeys(t,e){return Tf(`${t}-${e}`,(()=>[[`datasets.${t}.elements.${e}`,`datasets.${t}`,`elements.${e}`,""]]))}pluginScopeKeys(t){const e=t.id;return Tf(`${this.type}-plugin-${e}`,(()=>[[`plugins.${e}`,...t.additionalOptionScopes||[]]]))}_cachedScopes(t,e){const i=this._scopeCache;let n=i.get(t);return n&&!e||(n=new Map,i.set(t,n)),n}getOptionScopes(t,e,i){const{options:n,type:r}=this,o=this._cachedScopes(t,i),s=o.get(e);if(s)return s;const a=new Set;e.forEach((e=>{t&&(a.add(t),e.forEach((e=>Cf(a,t,e)))),e.forEach((t=>Cf(a,n,t))),e.forEach((t=>Cf(a,kh[r]||{},t))),e.forEach((t=>Cf(a,Ph,t))),e.forEach((t=>Cf(a,Sh,t)))}));const l=Array.from(a);return 0===l.length&&l.push(Object.create(null)),Pf.has(e)&&o.set(e,l),l}chartOptionScopes(){const{options:t,type:e}=this;return[t,kh[e]||{},Ph.datasets[e]||{},{type:e},Ph,Sh]}resolveNamedOptions(t,e,i,n=[""]){const r={$shared:!0},{resolver:o,subPrefixes:s}=jf(this._resolverCache,t,n);let a=o;(function(t,e){const{isScriptable:i,isIndexable:n}=ru(t);for(const r of e){const e=i(r),o=n(r),s=(o||e)&&t[r];if(e&&(Dc(s)||Rf(s))||o&&lc(s))return!0}return!1})(o,e)&&(r.$shared=!1,a=nu(o,i=Dc(i)?i():i,this.createResolver(t,i,s)));for(const t of e)r[t]=a[t];return r}createResolver(t,e,i=[""],n){const{resolver:r}=jf(this._resolverCache,t,i);return cc(e)?nu(r,e,void 0,n):r}}function jf(t,e,i){let n=t.get(e);n||(n=new Map,t.set(e,n));const r=i.join();let o=n.get(r);return o||(o={resolver:iu(e,i),subPrefixes:i.filter((t=>!t.toLowerCase().includes("hover")))},n.set(r,o)),o}const Rf=t=>cc(t)&&Object.getOwnPropertyNames(t).reduce(((e,i)=>e||Dc(t[i])),!1),Lf=["top","bottom","left","right","chartArea"];function zf(t,e){return"top"===t||"bottom"===t||-1===Lf.indexOf(t)&&"x"===e}function Nf(t,e){return function(i,n){return i[t]===n[t]?i[e]-n[e]:i[t]-n[t]}}function If(t){const e=t.chart,i=e.options.animation;e.notifyPlugins("afterRender"),pc(i&&i.onComplete,[t],e)}function Hf(t){const e=t.chart,i=e.options.animation;pc(i&&i.onProgress,[t],e)}function Uf(t){return wu()&&"string"==typeof t?t=document.getElementById(t):t&&t.length&&(t=t[0]),t&&t.canvas&&(t=t.canvas),t}const Ff={},Bf=t=>{const e=Uf(t);return Object.values(Ff).filter((t=>t.canvas===e)).pop()};function Wf(t,e,i){const n=Object.keys(t);for(const r of n){const n=+r;if(n>=e){const o=t[r];delete t[r],(i>0||n>e)&&(t[n+i]=o)}}}function $f(t,e,i){return t.options.clip?t[i]:e[i]}class Vf{static defaults=Ph;static instances=Ff;static overrides=kh;static registry=bf;static version="4.4.0";static getChart=Bf;static register(...t){bf.add(...t),Yf()}static unregister(...t){bf.remove(...t),Yf()}constructor(t,e){const i=this.config=new Af(e),n=Uf(t),r=Bf(n);if(r)throw new Error("Canvas is already in use. Chart with ID '"+r.id+"' must be destroyed before the canvas with ID '"+r.canvas.id+"' can be reused.");const o=i.createResolver(i.chartOptionScopes(),this.getContext());this.platform=new(i.platform||function(t){return!wu()||"undefined"!=typeof OffscreenCanvas&&t instanceof OffscreenCanvas?Wd:of}(n)),this.platform.updateConfig(i);const s=this.platform.acquireContext(n,o.aspectRatio),a=s&&s.canvas,l=a&&a.height,c=a&&a.width;this.id=sc(),this.ctx=s,this.canvas=a,this.width=c,this.height=l,this._options=o,this._aspectRatio=this.aspectRatio,this._layers=[],this._metasets=[],this._stacks=void 0,this.boxes=[],this.currentDevicePixelRatio=void 0,this.chartArea=void 0,this._active=[],this._lastEvent=void 0,this._listeners={},this._responsiveListeners=void 0,this._sortedMetasets=[],this.scales={},this._plugins=new vf,this.$proxies={},this._hiddenIndices={},this.attached=!1,this._animationsDisabled=void 0,this.$context=void 0,this._doResize=function(t,e){let i;return function(...n){return e?(clearTimeout(i),i=setTimeout(t,e,n)):t.apply(this,n),e}}((t=>this.update(t)),o.resizeDelay||0),this._dataChanges=[],Ff[this.id]=this,s&&a?(Gu.listen(this,"complete",If),Gu.listen(this,"progress",Hf),this._initialize(),this.attached&&this.update()):console.error("Failed to create chart: can't acquire context from the given item")}get aspectRatio(){const{options:{aspectRatio:t,maintainAspectRatio:e},width:i,height:n,_aspectRatio:r}=this;return ac(t)?e&&r?r:n?i/n:null:t}get data(){return this.config.data}set data(t){this.config.data=t}get options(){return this._options}set options(t){this.config.options=t}get registry(){return bf}_initialize(){return this.notifyPlugins("beforeInit"),this.options.responsive?this.resize():Cu(this,this.options.devicePixelRatio),this.bindEvents(),this.notifyPlugins("afterInit"),this}clear(){return jh(this.canvas,this.ctx),this}stop(){return Gu.stop(this),this}resize(t,e){Gu.running(this)?this._resizeBeforeDraw={width:t,height:e}:this._resize(t,e)}_resize(t,e){const i=this.options,n=this.canvas,r=i.maintainAspectRatio&&this.aspectRatio,o=this.platform.getMaximumSize(n,t,e,r),s=i.devicePixelRatio||this.platform.getDevicePixelRatio(),a=this.width?"resize":"attach";this.width=o.width,this.height=o.height,this._aspectRatio=this.aspectRatio,Cu(this,s,!0)&&(this.notifyPlugins("resize",{size:o}),pc(i.onResize,[this,o],this),this.attached&&this._doResize(a)&&this.render())}ensureScalesHaveIDs(){gc(this.options.scales||{},((t,e)=>{t.id=e}))}buildOrUpdateScales(){const t=this.options,e=t.scales,i=this.scales,n=Object.keys(i).reduce(((t,e)=>(t[e]=!1,t)),{});let r=[];e&&(r=r.concat(Object.keys(e).map((t=>{const i=e[t],n=kf(t,i),r="r"===n,o="x"===n;return{options:i,dposition:r?"chartArea":o?"bottom":"left",dtype:r?"radialLinear":o?"category":"linear"}})))),gc(r,(e=>{const r=e.options,o=r.id,s=kf(o,r),a=dc(r.type,e.dtype);void 0!==r.position&&zf(r.position,s)===zf(e.dposition)||(r.position=e.dposition),n[o]=!0;let l=null;o in i&&i[o].type===a?l=i[o]:(l=new(bf.getScale(a))({id:o,type:a,ctx:this.ctx,chart:this}),i[l.id]=l),l.init(r,t)})),gc(n,((t,e)=>{t||delete i[e]})),gc(i,(t=>{Fd.configure(this,t,t.options),Fd.addBox(this,t)}))}_updateMetasets(){const t=this._metasets,e=this.data.datasets.length,i=t.length;if(t.sort(((t,e)=>t.index-e.index)),i>e){for(let t=e;t<i;++t)this._destroyDatasetMeta(t);t.splice(e,i-e)}this._sortedMetasets=t.slice(0).sort(Nf("order","index"))}_removeUnreferencedMetasets(){const{_metasets:t,data:{datasets:e}}=this;t.length>e.length&&delete this._stacks,t.forEach(((t,i)=>{0===e.filter((e=>e===t._dataset)).length&&this._destroyDatasetMeta(i)}))}buildOrUpdateControllers(){const t=[],e=this.data.datasets;let i,n;for(this._removeUnreferencedMetasets(),i=0,n=e.length;i<n;i++){const n=e[i];let r=this.getDatasetMeta(i);const o=n.type||this.config.type;if(r.type&&r.type!==o&&(this._destroyDatasetMeta(i),r=this.getDatasetMeta(i)),r.type=o,r.indexAxis=n.indexAxis||wf(o,this.options),r.order=n.order||0,r.index=i,r.label=""+n.label,r.visible=this.isDatasetVisible(i),r.controller)r.controller.updateIndex(i),r.controller.linkScales();else{const e=bf.getController(o),{datasetElementType:n,dataElementType:s}=Ph.datasets[o];Object.assign(e,{dataElementType:bf.getElement(s),datasetElementType:n&&bf.getElement(n)}),r.controller=new e(this,i),t.push(r.controller)}}return this._updateMetasets(),t}_resetElements(){gc(this.data.datasets,((t,e)=>{this.getDatasetMeta(e).controller.reset()}),this)}reset(){this._resetElements(),this.notifyPlugins("reset")}update(t){const e=this.config;e.update();const i=this._options=e.createResolver(e.chartOptionScopes(),this.getContext()),n=this._animationsDisabled=!i.animation;if(this._updateScales(),this._checkEventBindings(),this._updateHiddenIndices(),this._plugins.invalidate(),!1===this.notifyPlugins("beforeUpdate",{mode:t,cancelable:!0}))return;const r=this.buildOrUpdateControllers();this.notifyPlugins("beforeElementsUpdate");let o=0;for(let t=0,e=this.data.datasets.length;t<e;t++){const{controller:e}=this.getDatasetMeta(t),i=!n&&-1===r.indexOf(e);e.buildOrUpdateElements(i),o=Math.max(+e.getMaxOverflow(),o)}o=this._minPadding=i.layout.autoPadding?o:0,this._updateLayout(o),n||gc(r,(t=>{t.reset()})),this._updateDatasets(t),this.notifyPlugins("afterUpdate",{mode:t}),this._layers.sort(Nf("z","_idx"));const{_active:s,_lastEvent:a}=this;a?this._eventHandler(a,!0):s.length&&this._updateHoverStyles(s,s,!0),this.render()}_updateScales(){gc(this.scales,(t=>{Fd.removeBox(this,t)})),this.ensureScalesHaveIDs(),this.buildOrUpdateScales()}_checkEventBindings(){const t=this.options,e=new Set(Object.keys(this._listeners)),i=new Set(t.events);Ec(e,i)&&!!this._responsiveListeners===t.responsive||(this.unbindEvents(),this.bindEvents())}_updateHiddenIndices(){const{_hiddenIndices:t}=this,e=this._getUniformDataChanges()||[];for(const{method:i,start:n,count:r}of e)Wf(t,n,"_removeElements"===i?-r:r)}_getUniformDataChanges(){const t=this._dataChanges;if(!t||!t.length)return;this._dataChanges=[];const e=this.data.datasets.length,i=e=>new Set(t.filter((t=>t[0]===e)).map(((t,e)=>e+","+t.splice(1).join(",")))),n=i(0);for(let t=1;t<e;t++)if(!Ec(n,i(t)))return;return Array.from(n).map((t=>t.split(","))).map((t=>({method:t[1],start:+t[2],count:+t[3]})))}_updateLayout(t){if(!1===this.notifyPlugins("beforeLayout",{cancelable:!0}))return;Fd.update(this,this.width,this.height,t);const e=this.chartArea,i=e.width<=0||e.height<=0;this._layers=[],gc(this.boxes,(t=>{i&&"chartArea"===t.position||(t.configure&&t.configure(),this._layers.push(...t._layers()))}),this),this._layers.forEach(((t,e)=>{t._idx=e})),this.notifyPlugins("afterLayout")}_updateDatasets(t){if(!1!==this.notifyPlugins("beforeDatasetsUpdate",{mode:t,cancelable:!0})){for(let t=0,e=this.data.datasets.length;t<e;++t)this.getDatasetMeta(t).controller.configure();for(let e=0,i=this.data.datasets.length;e<i;++e)this._updateDataset(e,Dc(t)?t({datasetIndex:e}):t);this.notifyPlugins("afterDatasetsUpdate",{mode:t})}}_updateDataset(t,e){const i=this.getDatasetMeta(t),n={meta:i,index:t,mode:e,cancelable:!0};!1!==this.notifyPlugins("beforeDatasetUpdate",n)&&(i.controller._update(e),n.cancelable=!1,this.notifyPlugins("afterDatasetUpdate",n))}render(){!1!==this.notifyPlugins("beforeRender",{cancelable:!0})&&(Gu.has(this)?this.attached&&!Gu.running(this)&&Gu.start(this):(this.draw(),If({chart:this})))}draw(){let t;if(this._resizeBeforeDraw){const{width:t,height:e}=this._resizeBeforeDraw;this._resize(t,e),this._resizeBeforeDraw=null}if(this.clear(),this.width<=0||this.height<=0)return;if(!1===this.notifyPlugins("beforeDraw",{cancelable:!0}))return;const e=this._layers;for(t=0;t<e.length&&e[t].z<=0;++t)e[t].draw(this.chartArea);for(this._drawDatasets();t<e.length;++t)e[t].draw(this.chartArea);this.notifyPlugins("afterDraw")}_getSortedDatasetMetas(t){const e=this._sortedMetasets,i=[];let n,r;for(n=0,r=e.length;n<r;++n){const r=e[n];t&&!r.visible||i.push(r)}return i}getSortedVisibleDatasetMetas(){return this._getSortedDatasetMetas(!0)}_drawDatasets(){if(!1===this.notifyPlugins("beforeDatasetsDraw",{cancelable:!0}))return;const t=this.getSortedVisibleDatasetMetas();for(let e=t.length-1;e>=0;--e)this._drawDataset(t[e]);this.notifyPlugins("afterDatasetsDraw")}_drawDataset(t){const e=this.ctx,i=t._clip,n=!i.disabled,r=function(t,e){const{xScale:i,yScale:n}=t;return i&&n?{left:$f(i,e,"left"),right:$f(i,e,"right"),top:$f(n,e,"top"),bottom:$f(n,e,"bottom")}:e}(t,this.chartArea),o={meta:t,index:t.index,cancelable:!0};!1!==this.notifyPlugins("beforeDatasetDraw",o)&&(n&&Nh(e,{left:!1===i.left?0:r.left-i.left,right:!1===i.right?this.width:r.right+i.right,top:!1===i.top?0:r.top-i.top,bottom:!1===i.bottom?this.height:r.bottom+i.bottom}),t.controller.draw(),n&&Ih(e),o.cancelable=!1,this.notifyPlugins("afterDatasetDraw",o))}isPointInArea(t){return zh(t,this.chartArea,this._minPadding)}getElementsAtEventForMode(t,e,i,n){const r=Pd.modes[e];return"function"==typeof r?r(this,t,i,n):[]}getDatasetMeta(t){const e=this.data.datasets[t],i=this._metasets;let n=i.filter((t=>t&&t._dataset===e)).pop();return n||(n={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null,order:e&&e.order||0,index:t,_dataset:e,_parsed:[],_sorted:!1},i.push(n)),n}getContext(){return this.$context||(this.$context=eu(null,{chart:this,type:"chart"}))}getVisibleDatasetCount(){return this.getSortedVisibleDatasetMetas().length}isDatasetVisible(t){const e=this.data.datasets[t];if(!e)return!1;const i=this.getDatasetMeta(t);return"boolean"==typeof i.hidden?!i.hidden:!e.hidden}setDatasetVisibility(t,e){this.getDatasetMeta(t).hidden=!e}toggleDataVisibility(t){this._hiddenIndices[t]=!this._hiddenIndices[t]}getDataVisibility(t){return!this._hiddenIndices[t]}_updateVisibility(t,e,i){const n=i?"show":"hide",r=this.getDatasetMeta(t),o=r.controller._resolveAnimations(void 0,n);Oc(e)?(r.data[e].hidden=!i,this.update()):(this.setDatasetVisibility(t,i),o.update(r,{visible:i}),this.update((e=>e.datasetIndex===t?n:void 0)))}hide(t,e){this._updateVisibility(t,e,!1)}show(t,e){this._updateVisibility(t,e,!0)}_destroyDatasetMeta(t){const e=this._metasets[t];e&&e.controller&&e.controller._destroy(),delete this._metasets[t]}_stop(){let t,e;for(this.stop(),Gu.remove(this),t=0,e=this.data.datasets.length;t<e;++t)this._destroyDatasetMeta(t)}destroy(){this.notifyPlugins("beforeDestroy");const{canvas:t,ctx:e}=this;this._stop(),this.config.clearCache(),t&&(this.unbindEvents(),jh(t,e),this.platform.releaseContext(e),this.canvas=null,this.ctx=null),delete Ff[this.id],this.notifyPlugins("afterDestroy")}toBase64Image(...t){return this.canvas.toDataURL(...t)}bindEvents(){this.bindUserEvents(),this.options.responsive?this.bindResponsiveEvents():this.attached=!0}bindUserEvents(){const t=this._listeners,e=this.platform,i=(i,n)=>{e.addEventListener(this,i,n),t[i]=n},n=(t,e,i)=>{t.offsetX=e,t.offsetY=i,this._eventHandler(t)};gc(this.options.events,(t=>i(t,n)))}bindResponsiveEvents(){this._responsiveListeners||(this._responsiveListeners={});const t=this._responsiveListeners,e=this.platform,i=(i,n)=>{e.addEventListener(this,i,n),t[i]=n},n=(i,n)=>{t[i]&&(e.removeEventListener(this,i,n),delete t[i])},r=(t,e)=>{this.canvas&&this.resize(t,e)};let o;const s=()=>{n("attach",s),this.attached=!0,this.resize(),i("resize",r),i("detach",o)};o=()=>{this.attached=!1,n("resize",r),this._stop(),this._resize(0,0),i("attach",s)},e.isAttached(this.canvas)?s():o()}unbindEvents(){gc(this._listeners,((t,e)=>{this.platform.removeEventListener(this,e,t)})),this._listeners={},gc(this._responsiveListeners,((t,e)=>{this.platform.removeEventListener(this,e,t)})),this._responsiveListeners=void 0}updateHoverStyle(t,e,i){const n=i?"set":"remove";let r,o,s,a;for("dataset"===e&&(r=this.getDatasetMeta(t[0].datasetIndex),r.controller["_"+n+"DatasetHoverStyle"]()),s=0,a=t.length;s<a;++s){o=t[s];const e=o&&this.getDatasetMeta(o.datasetIndex).controller;e&&e[n+"HoverStyle"](o.element,o.datasetIndex,o.index)}}getActiveElements(){return this._active||[]}setActiveElements(t){const e=this._active||[],i=t.map((({datasetIndex:t,index:e})=>{const i=this.getDatasetMeta(t);if(!i)throw new Error("No dataset found at index "+t);return{datasetIndex:t,element:i.data[e],index:e}}));!mc(i,e)&&(this._active=i,this._lastEvent=null,this._updateHoverStyles(i,e))}notifyPlugins(t,e,i){return this._plugins.notify(this,t,e,i)}isPluginEnabled(t){return 1===this._plugins._cache.filter((e=>e.plugin.id===t)).length}_updateHoverStyles(t,e,i){const n=this.options.hover,r=(t,e)=>t.filter((t=>!e.some((e=>t.datasetIndex===e.datasetIndex&&t.index===e.index)))),o=r(e,t),s=i?t:r(t,e);o.length&&this.updateHoverStyle(o,n.mode,!1),s.length&&n.mode&&this.updateHoverStyle(s,n.mode,!0)}_eventHandler(t,e){const i={event:t,replay:e,cancelable:!0,inChartArea:this.isPointInArea(t)},n=e=>(e.options.events||this.options.events).includes(t.native.type);if(!1===this.notifyPlugins("beforeEvent",i,n))return;const r=this._handleEvent(t,e,i.inChartArea);return i.cancelable=!1,this.notifyPlugins("afterEvent",i,n),(r||i.changed)&&this.render(),this}_handleEvent(t,e,i){const{_active:n=[],options:r}=this,o=e,s=this._getActiveElements(t,n,i,o),a=function(t){return"mouseup"===t.type||"click"===t.type||"contextmenu"===t.type}(t),l=function(t,e,i,n){return i&&"mouseout"!==t.type?n?e:t:null}(t,this._lastEvent,i,a);i&&(this._lastEvent=null,pc(r.onHover,[t,s,this],this),a&&pc(r.onClick,[t,s,this],this));const c=!mc(s,n);return(c||e)&&(this._active=s,this._updateHoverStyles(s,n,e)),this._lastEvent=l,c}_getActiveElements(t,e,i,n){if("mouseout"===t.type)return[];if(!i)return e;const r=this.options.hover;return this.getElementsAtEventForMode(t,r.mode,r,n)}}function Yf(){return gc(Vf.instances,(t=>t._plugins.invalidate()))}function Gf(t,e,i,n){return{x:i+t*Math.cos(e),y:n+t*Math.sin(e)}}function Xf(t,e,i,n,r,o){const{x:s,y:a,startAngle:l,pixelMargin:c,innerRadius:h}=e,u=Math.max(e.outerRadius+n+i-c,0),d=h>0?h+n+i+c:0;let f=0;const p=r-l;if(n){const t=((h>0?h-n:0)+(u>0?u-n:0))/2;f=(p-(0!==t?p*t/(t+n):p))/2}const g=(p-Math.max(.001,p*u-i/Pc)/u)/2,m=l+g+f,y=r-g-f,{outerStart:b,outerEnd:v,innerStart:x,innerEnd:_}=function(t,e,i,n){const r=function(t){return qh(t,["outerStart","outerEnd","innerStart","innerEnd"])}(t.options.borderRadius),o=(i-e)/2,s=Math.min(o,n*e/2),a=t=>{const e=(i-Math.min(o,t))*n/2;return Kc(t,0,Math.min(o,e))};return{outerStart:a(r.outerStart),outerEnd:a(r.outerEnd),innerStart:Kc(r.innerStart,0,s),innerEnd:Kc(r.innerEnd,0,s)}}(e,d,u,y-m),w=u-b,M=u-v,k=m+b/w,S=y-v/M,O=d+x,D=d+_,E=m+x/O,P=y-_/D;if(t.beginPath(),o){const e=(k+S)/2;if(t.arc(s,a,u,k,e),t.arc(s,a,u,e,S),v>0){const e=Gf(M,S,s,a);t.arc(e.x,e.y,v,S,y+Rc)}const i=Gf(D,y,s,a);if(t.lineTo(i.x,i.y),_>0){const e=Gf(D,P,s,a);t.arc(e.x,e.y,_,y+Rc,P+Math.PI)}const n=(y-_/d+(m+x/d))/2;if(t.arc(s,a,d,y-_/d,n,!0),t.arc(s,a,d,n,m+x/d,!0),x>0){const e=Gf(O,E,s,a);t.arc(e.x,e.y,x,E+Math.PI,m-Rc)}const r=Gf(w,m,s,a);if(t.lineTo(r.x,r.y),b>0){const e=Gf(w,k,s,a);t.arc(e.x,e.y,b,m-Rc,k)}}else{t.moveTo(s,a);const e=Math.cos(k)*u+s,i=Math.sin(k)*u+a;t.lineTo(e,i);const n=Math.cos(S)*u+s,r=Math.sin(S)*u+a;t.lineTo(n,r)}t.closePath()}function qf(t,e,i=e){t.lineCap=dc(i.borderCapStyle,e.borderCapStyle),t.setLineDash(dc(i.borderDash,e.borderDash)),t.lineDashOffset=dc(i.borderDashOffset,e.borderDashOffset),t.lineJoin=dc(i.borderJoinStyle,e.borderJoinStyle),t.lineWidth=dc(i.borderWidth,e.borderWidth),t.strokeStyle=dc(i.borderColor,e.borderColor)}function Zf(t,e,i){t.lineTo(i.x,i.y)}function Kf(t,e,i={}){const n=t.length,{start:r=0,end:o=n-1}=i,{start:s,end:a}=e,l=Math.max(r,s),c=Math.min(o,a),h=r<s&&o<s||r>a&&o>a;return{count:n,start:l,loop:e.loop,ilen:c<l&&!h?n+c-l:c-l}}function Qf(t,e,i,n){const{points:r,options:o}=e,{count:s,start:a,loop:l,ilen:c}=Kf(r,i,n),h=function(t){return t.stepped?Hh:t.tension||"monotone"===t.cubicInterpolationMode?Uh:Zf}(o);let u,d,f,{move:p=!0,reverse:g}=n||{};for(u=0;u<=c;++u)d=r[(a+(g?c-u:u))%s],d.skip||(p?(t.moveTo(d.x,d.y),p=!1):h(t,f,d,g,o.stepped),f=d);return l&&(d=r[(a+(g?c:0))%s],h(t,f,d,g,o.stepped)),!!l}function Jf(t,e,i,n){const r=e.points,{count:o,start:s,ilen:a}=Kf(r,i,n),{move:l=!0,reverse:c}=n||{};let h,u,d,f,p,g,m=0,y=0;const b=t=>(s+(c?a-t:t))%o,v=()=>{f!==p&&(t.lineTo(m,p),t.lineTo(m,f),t.lineTo(m,g))};for(l&&(u=r[b(0)],t.moveTo(u.x,u.y)),h=0;h<=a;++h){if(u=r[b(h)],u.skip)continue;const e=u.x,i=u.y,n=0|e;n===d?(i<f?f=i:i>p&&(p=i),m=(y*m+e)/++y):(v(),t.lineTo(e,i),d=n,y=0,f=p=i),g=i}v()}function tp(t){const e=t.options,i=e.borderDash&&e.borderDash.length;return t._decimated||t._loop||e.tension||"monotone"===e.cubicInterpolationMode||e.stepped||i?Qf:Jf}const ep="function"==typeof Path2D;class ip extends sf{static id="line";static defaults={borderCapStyle:"butt",borderDash:[],borderDashOffset:0,borderJoinStyle:"miter",borderWidth:3,capBezierPoints:!0,cubicInterpolationMode:"default",fill:!1,spanGaps:!1,stepped:!1,tension:0};static defaultRoutes={backgroundColor:"backgroundColor",borderColor:"borderColor"};static descriptors={_scriptable:!0,_indexable:t=>"borderDash"!==t&&"fill"!==t};constructor(t){super(),this.animated=!0,this.options=void 0,this._chart=void 0,this._loop=void 0,this._fullLoop=void 0,this._path=void 0,this._points=void 0,this._segments=void 0,this._decimated=!1,this._pointsUpdated=!1,this._datasetIndex=void 0,t&&Object.assign(this,t)}updateControlPoints(t,e){const i=this.options;if((i.tension||"monotone"===i.cubicInterpolationMode)&&!i.stepped&&!this._pointsUpdated){const n=i.spanGaps?this._loop:this._fullLoop;_u(this._points,i,t,n,e),this._pointsUpdated=!0}}set points(t){this._points=t,delete this._segments,delete this._path,this._pointsUpdated=!1}get points(){return this._points}get segments(){return this._segments||(this._segments=function(t,e){const i=t.points,n=t.options.spanGaps,r=i.length;if(!r)return[];const o=!!t._loop,{start:s,end:a}=function(t,e,i,n){let r=0,o=e-1;if(i&&!n)for(;r<e&&!t[r].skip;)r++;for(;r<e&&t[r].skip;)r++;for(r%=e,i&&(o+=r);o>r&&t[o%e].skip;)o--;return o%=e,{start:r,end:o}}(i,r,o,n);return function(t,e,i,n){return n&&n.setContext&&i?function(t,e,i,n){const r=t._chart.getContext(),o=$u(t.options),{_datasetIndex:s,options:{spanGaps:a}}=t,l=i.length,c=[];let h=o,u=e[0].start,d=u;function f(t,e,n,r){const o=a?-1:1;if(t!==e){for(t+=l;i[t%l].skip;)t-=o;for(;i[e%l].skip;)e+=o;t%l!=e%l&&(c.push({start:t%l,end:e%l,loop:n,style:r}),h=r,u=e%l)}}for(const t of e){u=a?u:t.start;let e,o=i[u%l];for(d=u+1;d<=t.end;d++){const a=i[d%l];e=$u(n.setContext(eu(r,{type:"segment",p0:o,p1:a,p0DataIndex:(d-1)%l,p1DataIndex:d%l,datasetIndex:s}))),Vu(e,h)&&f(u,d-1,t.loop,h),o=a,h=e}u<d-1&&f(u,d-1,t.loop,h)}return c}(t,e,i,n):e}(t,!0===n?[{start:s,end:a,loop:o}]:function(t,e,i,n){const r=t.length,o=[];let s,a=e,l=t[e];for(s=e+1;s<=i;++s){const i=t[s%r];i.skip||i.stop?l.skip||(n=!1,o.push({start:e%r,end:(s-1)%r,loop:n}),e=a=i.stop?s:null):(a=s,l.skip&&(e=s)),l=i}return null!==a&&o.push({start:e%r,end:a%r,loop:n}),o}(i,s,a<s?a+r:a,!!t._fullLoop&&0===s&&a===r-1),i,e)}(this,this.options.segment))}first(){const t=this.segments,e=this.points;return t.length&&e[t[0].start]}last(){const t=this.segments,e=this.points,i=t.length;return i&&e[t[i-1].end]}interpolate(t,e){const i=this.options,n=t[e],r=this.points,o=Wu(this,{property:e,start:n,end:n});if(!o.length)return;const s=[],a=function(t){return t.stepped?Lu:t.tension||"monotone"===t.cubicInterpolationMode?zu:Ru}(i);let l,c;for(l=0,c=o.length;l<c;++l){const{start:c,end:h}=o[l],u=r[c],d=r[h];if(u===d){s.push(u);continue}const f=a(u,d,Math.abs((n-u[e])/(d[e]-u[e])),i.stepped);f[e]=t[e],s.push(f)}return 1===s.length?s[0]:s}pathSegment(t,e,i){return tp(this)(t,this,e,i)}path(t,e,i){const n=this.segments,r=tp(this);let o=this._loop;e=e||0,i=i||this.points.length-e;for(const s of n)o&=r(t,this,s,{start:e,end:e+i-1});return!!o}draw(t,e,i,n){const r=this.options||{};(this.points||[]).length&&r.borderWidth&&(t.save(),function(t,e,i,n){ep&&!e.options.segment?function(t,e,i,n){let r=e._path;r||(r=e._path=new Path2D,e.path(r,i,n)&&r.closePath()),qf(t,e.options),t.stroke(r)}(t,e,i,n):function(t,e,i,n){const{segments:r,options:o}=e,s=tp(e);for(const a of r)qf(t,o,a.style),t.beginPath(),s(t,e,a,{start:i,end:i+n-1})&&t.closePath(),t.stroke()}(t,e,i,n)}(t,this,i,n),t.restore()),this.animated&&(this._pointsUpdated=!1,this._path=void 0)}}function np(t,e,i,n){const r=t.options,{[i]:o}=t.getProps([i],n);return Math.abs(e-o)<r.radius+r.hitRadius}function rp(t,e){const{x:i,y:n,base:r,width:o,height:s}=t.getProps(["x","y","base","width","height"],e);let a,l,c,h,u;return t.horizontal?(u=s/2,a=Math.min(i,r),l=Math.max(i,r),c=n-u,h=n+u):(u=o/2,a=i-u,l=i+u,c=Math.min(n,r),h=Math.max(n,r)),{left:a,top:c,right:l,bottom:h}}function op(t,e,i,n){return t?0:Kc(e,i,n)}function sp(t,e,i,n){const r=null===e,o=null===i,s=t&&!(r&&o)&&rp(t,n);return s&&(r||Qc(e,s.left,s.right))&&(o||Qc(i,s.top,s.bottom))}function ap(t,e){t.rect(e.x,e.y,e.w,e.h)}function lp(t,e,i={}){const n=t.x!==i.x?-e:0,r=t.y!==i.y?-e:0,o=(t.x+t.w!==i.x+i.w?e:0)-n,s=(t.y+t.h!==i.y+i.h?e:0)-r;return{x:t.x+n,y:t.y+r,w:t.w+o,h:t.h+s,radius:t.radius}}var cp=Object.freeze({__proto__:null,ArcElement:class extends sf{static id="arc";static defaults={borderAlign:"center",borderColor:"#fff",borderDash:[],borderDashOffset:0,borderJoinStyle:void 0,borderRadius:0,borderWidth:2,offset:0,spacing:0,angle:void 0,circular:!0};static defaultRoutes={backgroundColor:"backgroundColor"};static descriptors={_scriptable:!0,_indexable:t=>"borderDash"!==t};circumference;endAngle;fullCircles;innerRadius;outerRadius;pixelMargin;startAngle;constructor(t){super(),this.options=void 0,this.circumference=void 0,this.startAngle=void 0,this.endAngle=void 0,this.innerRadius=void 0,this.outerRadius=void 0,this.pixelMargin=0,this.fullCircles=0,t&&Object.assign(this,t)}inRange(t,e,i){const n=this.getProps(["x","y"],i),{angle:r,distance:o}=Yc(n,{x:t,y:e}),{startAngle:s,endAngle:a,innerRadius:l,outerRadius:c,circumference:h}=this.getProps(["startAngle","endAngle","innerRadius","outerRadius","circumference"],i),u=(this.options.spacing+this.options.borderWidth)/2,d=dc(h,a-s)>=Tc||Zc(r,s,a),f=Qc(o,l+u,c+u);return d&&f}getCenterPoint(t){const{x:e,y:i,startAngle:n,endAngle:r,innerRadius:o,outerRadius:s}=this.getProps(["x","y","startAngle","endAngle","innerRadius","outerRadius"],t),{offset:a,spacing:l}=this.options,c=(n+r)/2,h=(o+s+l+a)/2;return{x:e+Math.cos(c)*h,y:i+Math.sin(c)*h}}tooltipPosition(t){return this.getCenterPoint(t)}draw(t){const{options:e,circumference:i}=this,n=(e.offset||0)/4,r=(e.spacing||0)/2,o=e.circular;if(this.pixelMargin="inner"===e.borderAlign?.33:0,this.fullCircles=i>Tc?Math.floor(i/Tc):0,0===i||this.innerRadius<0||this.outerRadius<0)return;t.save();const s=(this.startAngle+this.endAngle)/2;t.translate(Math.cos(s)*n,Math.sin(s)*n);const a=n*(1-Math.sin(Math.min(Pc,i||0)));t.fillStyle=e.backgroundColor,t.strokeStyle=e.borderColor,function(t,e,i,n,r){const{fullCircles:o,startAngle:s,circumference:a}=e;let l=e.endAngle;if(o){Xf(t,e,i,n,l,r);for(let e=0;e<o;++e)t.fill();isNaN(a)||(l=s+(a%Tc||Tc))}Xf(t,e,i,n,l,r),t.fill()}(t,this,a,r,o),function(t,e,i,n,r){const{fullCircles:o,startAngle:s,circumference:a,options:l}=e,{borderWidth:c,borderJoinStyle:h,borderDash:u,borderDashOffset:d}=l,f="inner"===l.borderAlign;if(!c)return;t.setLineDash(u||[]),t.lineDashOffset=d,f?(t.lineWidth=2*c,t.lineJoin=h||"round"):(t.lineWidth=c,t.lineJoin=h||"bevel");let p=e.endAngle;if(o){Xf(t,e,i,n,p,r);for(let e=0;e<o;++e)t.stroke();isNaN(a)||(p=s+(a%Tc||Tc))}f&&function(t,e,i){const{startAngle:n,pixelMargin:r,x:o,y:s,outerRadius:a,innerRadius:l}=e;let c=r/a;t.beginPath(),t.arc(o,s,a,n-c,i+c),l>r?(c=r/l,t.arc(o,s,l,i+c,n-c,!0)):t.arc(o,s,r,i+Rc,n-Rc),t.closePath(),t.clip()}(t,e,p),o||(Xf(t,e,i,n,p,r),t.stroke())}(t,this,a,r,o),t.restore()}},BarElement:class extends sf{static id="bar";static defaults={borderSkipped:"start",borderWidth:0,borderRadius:0,inflateAmount:"auto",pointStyle:void 0};static defaultRoutes={backgroundColor:"backgroundColor",borderColor:"borderColor"};constructor(t){super(),this.options=void 0,this.horizontal=void 0,this.base=void 0,this.width=void 0,this.height=void 0,this.inflateAmount=void 0,t&&Object.assign(this,t)}draw(t){const{inflateAmount:e,options:{borderColor:i,backgroundColor:n}}=this,{inner:r,outer:o}=function(t){const e=rp(t),i=e.right-e.left,n=e.bottom-e.top,r=function(t,e,i){const n=t.options.borderWidth,r=t.borderSkipped,o=Zh(n);return{t:op(r.top,o.top,0,i),r:op(r.right,o.right,0,e),b:op(r.bottom,o.bottom,0,i),l:op(r.left,o.left,0,e)}}(t,i/2,n/2),o=function(t,e,i){const{enableBorderRadius:n}=t.getProps(["enableBorderRadius"]),r=t.options.borderRadius,o=Kh(r),s=Math.min(e,i),a=t.borderSkipped,l=n||cc(r);return{topLeft:op(!l||a.top||a.left,o.topLeft,0,s),topRight:op(!l||a.top||a.right,o.topRight,0,s),bottomLeft:op(!l||a.bottom||a.left,o.bottomLeft,0,s),bottomRight:op(!l||a.bottom||a.right,o.bottomRight,0,s)}}(t,i/2,n/2);return{outer:{x:e.left,y:e.top,w:i,h:n,radius:o},inner:{x:e.left+r.l,y:e.top+r.t,w:i-r.l-r.r,h:n-r.t-r.b,radius:{topLeft:Math.max(0,o.topLeft-Math.max(r.t,r.l)),topRight:Math.max(0,o.topRight-Math.max(r.t,r.r)),bottomLeft:Math.max(0,o.bottomLeft-Math.max(r.b,r.l)),bottomRight:Math.max(0,o.bottomRight-Math.max(r.b,r.r))}}}}(this),s=(a=o.radius).topLeft||a.topRight||a.bottomLeft||a.bottomRight?$h:ap;var a;t.save(),o.w===r.w&&o.h===r.h||(t.beginPath(),s(t,lp(o,e,r)),t.clip(),s(t,lp(r,-e,o)),t.fillStyle=i,t.fill("evenodd")),t.beginPath(),s(t,lp(r,e)),t.fillStyle=n,t.fill(),t.restore()}inRange(t,e,i){return sp(this,t,e,i)}inXRange(t,e){return sp(this,t,null,e)}inYRange(t,e){return sp(this,null,t,e)}getCenterPoint(t){const{x:e,y:i,base:n,horizontal:r}=this.getProps(["x","y","base","horizontal"],t);return{x:r?(e+n)/2:e,y:r?i:(i+n)/2}}getRange(t){return"x"===t?this.width/2:this.height/2}},LineElement:ip,PointElement:class extends sf{static id="point";parsed;skip;stop;static defaults={borderWidth:1,hitRadius:1,hoverBorderWidth:1,hoverRadius:4,pointStyle:"circle",radius:3,rotation:0};static defaultRoutes={backgroundColor:"backgroundColor",borderColor:"borderColor"};constructor(t){super(),this.options=void 0,this.parsed=void 0,this.skip=void 0,this.stop=void 0,t&&Object.assign(this,t)}inRange(t,e,i){const n=this.options,{x:r,y:o}=this.getProps(["x","y"],i);return Math.pow(t-r,2)+Math.pow(e-o,2)<Math.pow(n.hitRadius+n.radius,2)}inXRange(t,e){return np(this,t,"x",e)}inYRange(t,e){return np(this,t,"y",e)}getCenterPoint(t){const{x:e,y:i}=this.getProps(["x","y"],t);return{x:e,y:i}}size(t){let e=(t=t||this.options||{}).radius||0;return e=Math.max(e,e&&t.hoverRadius||0),2*(e+(e&&t.borderWidth||0))}draw(t,e){const i=this.options;this.skip||i.radius<.1||!zh(this,e,this.size(i)/2)||(t.strokeStyle=i.borderColor,t.lineWidth=i.borderWidth,t.fillStyle=i.backgroundColor,Rh(t,i,this.x,this.y))}getRange(){const t=this.options||{};return t.radius+t.hitRadius}}});const hp=["rgb(54, 162, 235)","rgb(255, 99, 132)","rgb(255, 159, 64)","rgb(255, 205, 86)","rgb(75, 192, 192)","rgb(153, 102, 255)","rgb(201, 203, 207)"],up=hp.map((t=>t.replace("rgb(","rgba(").replace(")",", 0.5)")));function dp(t){return hp[t%hp.length]}function fp(t){return up[t%up.length]}function pp(t){let e;for(e in t)if(t[e].borderColor||t[e].backgroundColor)return!0;return!1}var gp={id:"colors",defaults:{enabled:!0,forceOverride:!1},beforeLayout(t,e,i){if(!i.enabled)return;const{data:{datasets:n},options:r}=t.config,{elements:o}=r;if(!i.forceOverride&&(pp(n)||(s=r)&&(s.borderColor||s.backgroundColor)||o&&pp(o)))return;var s;const a=function(t){let e=0;return(i,n)=>{const r=t.getDatasetMeta(n).controller;r instanceof bd?e=function(t,e){return t.backgroundColor=t.data.map((()=>dp(e++))),e}(i,e):r instanceof vd?e=function(t,e){return t.backgroundColor=t.data.map((()=>fp(e++))),e}(i,e):r&&(e=function(t,e){return t.borderColor=dp(e),t.backgroundColor=fp(e),++e}(i,e))}}(t);n.forEach(a)}};function mp(t){if(t._decimated){const e=t._data;delete t._decimated,delete t._data,Object.defineProperty(t,"data",{configurable:!0,enumerable:!0,writable:!0,value:e})}}function yp(t){t.data.datasets.forEach((t=>{mp(t)}))}var bp={id:"decimation",defaults:{algorithm:"min-max",enabled:!1},beforeElementsUpdate:(t,e,i)=>{if(!i.enabled)return void yp(t);const n=t.width;t.data.datasets.forEach(((e,r)=>{const{_data:o,indexAxis:s}=e,a=t.getDatasetMeta(r),l=o||e.data;if("y"===tu([s,t.options.indexAxis]))return;if(!a.controller.supportsDecimation)return;const c=t.scales[a.xAxisID];if("linear"!==c.type&&"time"!==c.type)return;if(t.options.parsing)return;let h,{start:u,count:d}=function(t,e){const i=e.length;let n,r=0;const{iScale:o}=t,{min:s,max:a,minDefined:l,maxDefined:c}=o.getUserBounds();return l&&(r=Kc(th(e,o.axis,s).lo,0,i-1)),n=c?Kc(th(e,o.axis,a).hi+1,r,i)-r:i-r,{start:r,count:n}}(a,l);if(d<=(i.threshold||4*n))mp(e);else{switch(ac(o)&&(e._data=l,delete e.data,Object.defineProperty(e,"data",{configurable:!0,enumerable:!0,get:function(){return this._decimated},set:function(t){this._data=t}})),i.algorithm){case"lttb":h=function(t,e,i,n,r){const o=r.samples||n;if(o>=i)return t.slice(e,e+i);const s=[],a=(i-2)/(o-2);let l=0;const c=e+i-1;let h,u,d,f,p,g=e;for(s[l++]=t[g],h=0;h<o-2;h++){let n,r=0,o=0;const c=Math.floor((h+1)*a)+1+e,m=Math.min(Math.floor((h+2)*a)+1,i)+e,y=m-c;for(n=c;n<m;n++)r+=t[n].x,o+=t[n].y;r/=y,o/=y;const b=Math.floor(h*a)+1+e,v=Math.min(Math.floor((h+1)*a)+1,i)+e,{x,y:_}=t[g];for(d=f=-1,n=b;n<v;n++)f=.5*Math.abs((x-r)*(t[n].y-_)-(x-t[n].x)*(o-_)),f>d&&(d=f,u=t[n],p=n);s[l++]=u,g=p}return s[l++]=t[c],s}(l,u,d,n,i);break;case"min-max":h=function(t,e,i,n){let r,o,s,a,l,c,h,u,d,f,p=0,g=0;const m=[],y=e+i-1,b=t[e].x,v=t[y].x-b;for(r=e;r<e+i;++r){o=t[r],s=(o.x-b)/v*n,a=o.y;const e=0|s;if(e===l)a<d?(d=a,c=r):a>f&&(f=a,h=r),p=(g*p+o.x)/++g;else{const i=r-1;if(!ac(c)&&!ac(h)){const e=Math.min(c,h),n=Math.max(c,h);e!==u&&e!==i&&m.push({...t[e],x:p}),n!==u&&n!==i&&m.push({...t[n],x:p})}r>0&&i!==u&&m.push(t[i]),m.push(o),l=e,g=0,d=f=a,c=h=u=r}}return m}(l,u,d,n);break;default:throw new Error(`Unsupported decimation algorithm '${i.algorithm}'`)}e._decimated=h}}))},destroy(t){yp(t)}};function vp(t,e,i,n){if(n)return;let r=e[t],o=i[t];return"angle"===t&&(r=qc(r),o=qc(o)),{property:t,start:r,end:o}}function xp(t,e,i){for(;e>t;e--){const t=i[e];if(!isNaN(t.x)&&!isNaN(t.y))break}return e}function _p(t,e,i,n){return t&&e?n(t[i],e[i]):t?t[i]:e?e[i]:0}function wp(t,e){let i=[],n=!1;return lc(t)?(n=!0,i=t):i=function(t,e){const{x:i=null,y:n=null}=t||{},r=e.points,o=[];return e.segments.forEach((({start:t,end:e})=>{e=xp(t,e,r);const s=r[t],a=r[e];null!==n?(o.push({x:s.x,y:n}),o.push({x:a.x,y:n})):null!==i&&(o.push({x:i,y:s.y}),o.push({x:i,y:a.y}))})),o}(t,e),i.length?new ip({points:i,options:{tension:0},_loop:n,_fullLoop:n}):null}function Mp(t){return t&&!1!==t.fill}function kp(t,e,i){let n=t[e].fill;const r=[e];let o;if(!i)return n;for(;!1!==n&&-1===r.indexOf(n);){if(!hc(n))return n;if(o=t[n],!o)return!1;if(o.visible)return n;r.push(n),n=o.fill}return!1}function Sp(t,e,i){const n=function(t){const e=t.options,i=e.fill;let n=dc(i&&i.target,i);return void 0===n&&(n=!!e.backgroundColor),!1!==n&&null!==n&&(!0===n?"origin":n)}(t);if(cc(n))return!isNaN(n.value)&&n;let r=parseFloat(n);return hc(r)&&Math.floor(r)===r?function(t,e,i,n){return"-"!==t&&"+"!==t||(i=e+i),!(i===e||i<0||i>=n)&&i}(n[0],e,r,i):["origin","start","end","stack","shape"].indexOf(n)>=0&&n}function Op(t,e,i){const n=[];for(let r=0;r<i.length;r++){const o=i[r],{first:s,last:a,point:l}=Dp(o,e,"x");if(!(!l||s&&a))if(s)n.unshift(l);else if(t.push(l),!a)break}t.push(...n)}function Dp(t,e,i){const n=t.interpolate(e,i);if(!n)return{};const r=n[i],o=t.segments,s=t.points;let a=!1,l=!1;for(let t=0;t<o.length;t++){const e=o[t],n=s[e.start][i],c=s[e.end][i];if(Qc(r,n,c)){a=r===n,l=r===c;break}}return{first:a,last:l,point:n}}class Ep{constructor(t){this.x=t.x,this.y=t.y,this.radius=t.radius}pathSegment(t,e,i){const{x:n,y:r,radius:o}=this;return e=e||{start:0,end:Tc},t.arc(n,r,o,e.end,e.start,!0),!i.bounds}interpolate(t){const{x:e,y:i,radius:n}=this,r=t.angle;return{x:e+Math.cos(r)*n,y:i+Math.sin(r)*n,angle:r}}}function Pp(t,e,i){const n=function(t){const{chart:e,fill:i,line:n}=t;if(hc(i))return function(t,e){const i=t.getDatasetMeta(e);return i&&t.isDatasetVisible(e)?i.dataset:null}(e,i);if("stack"===i)return function(t){const{scale:e,index:i,line:n}=t,r=[],o=n.segments,s=n.points,a=function(t,e){const i=[],n=t.getMatchingVisibleMetas("line");for(let t=0;t<n.length;t++){const r=n[t];if(r.index===e)break;r.hidden||i.unshift(r.dataset)}return i}(e,i);a.push(wp({x:null,y:e.bottom},n));for(let t=0;t<o.length;t++){const e=o[t];for(let t=e.start;t<=e.end;t++)Op(r,s[t],a)}return new ip({points:r,options:{}})}(t);if("shape"===i)return!0;const r=function(t){return(t.scale||{}).getPointPositionForValue?function(t){const{scale:e,fill:i}=t,n=e.options,r=e.getLabels().length,o=n.reverse?e.max:e.min,s=function(t,e,i){let n;return n="start"===t?i:"end"===t?e.options.reverse?e.min:e.max:cc(t)?t.value:e.getBaseValue(),n}(i,e,o),a=[];if(n.grid.circular){const t=e.getPointPositionForValue(0,o);return new Ep({x:t.x,y:t.y,radius:e.getDistanceFromCenterForValue(s)})}for(let t=0;t<r;++t)a.push(e.getPointPositionForValue(t,s));return a}(t):function(t){const{scale:e={},fill:i}=t,n=function(t,e){let i=null;return"start"===t?i=e.bottom:"end"===t?i=e.top:cc(t)?i=e.getPixelForValue(t.value):e.getBasePixel&&(i=e.getBasePixel()),i}(i,e);if(hc(n)){const t=e.isHorizontal();return{x:t?n:null,y:t?null:n}}return null}(t)}(t);return r instanceof Ep?r:wp(r,n)}(e),{line:r,scale:o,axis:s}=e,a=r.options,l=a.fill,c=a.backgroundColor,{above:h=c,below:u=c}=l||{};n&&r.points.length&&(Nh(t,i),function(t,e){const{line:i,target:n,above:r,below:o,area:s,scale:a}=e,l=i._loop?"angle":e.axis;t.save(),"x"===l&&o!==r&&(Tp(t,n,s.top),Cp(t,{line:i,target:n,color:r,scale:a,property:l}),t.restore(),t.save(),Tp(t,n,s.bottom)),Cp(t,{line:i,target:n,color:o,scale:a,property:l}),t.restore()}(t,{line:r,target:n,above:h,below:u,area:i,scale:o,axis:s}),Ih(t))}function Tp(t,e,i){const{segments:n,points:r}=e;let o=!0,s=!1;t.beginPath();for(const a of n){const{start:n,end:l}=a,c=r[n],h=r[xp(n,l,r)];o?(t.moveTo(c.x,c.y),o=!1):(t.lineTo(c.x,i),t.lineTo(c.x,c.y)),s=!!e.pathSegment(t,a,{move:s}),s?t.closePath():t.lineTo(h.x,i)}t.lineTo(e.first().x,i),t.closePath(),t.clip()}function Cp(t,e){const{line:i,target:n,property:r,color:o,scale:s}=e,a=function(t,e,i){const n=t.segments,r=t.points,o=e.points,s=[];for(const t of n){let{start:n,end:a}=t;a=xp(n,a,r);const l=vp(i,r[n],r[a],t.loop);if(!e.segments){s.push({source:t,target:l,start:r[n],end:r[a]});continue}const c=Wu(e,l);for(const e of c){const n=vp(i,o[e.start],o[e.end],e.loop),a=Bu(t,r,n);for(const t of a)s.push({source:t,target:e,start:{[i]:_p(l,n,"start",Math.max)},end:{[i]:_p(l,n,"end",Math.min)}})}}return s}(i,n,r);for(const{source:e,target:l,start:c,end:h}of a){const{style:{backgroundColor:a=o}={}}=e,u=!0!==n;t.save(),t.fillStyle=a,Ap(t,s,u&&vp(r,c,h)),t.beginPath();const d=!!i.pathSegment(t,e);let f;if(u){d?t.closePath():jp(t,n,h,r);const e=!!n.pathSegment(t,l,{move:d,reverse:!0});f=d&&e,f||jp(t,n,c,r)}t.closePath(),t.fill(f?"evenodd":"nonzero"),t.restore()}}function Ap(t,e,i){const{top:n,bottom:r}=e.chart.chartArea,{property:o,start:s,end:a}=i||{};"x"===o&&(t.beginPath(),t.rect(s,n,a-s,r-n),t.clip())}function jp(t,e,i,n){const r=e.interpolate(i,n);r&&t.lineTo(r.x,r.y)}var Rp={id:"filler",afterDatasetsUpdate(t,e,i){const n=(t.data.datasets||[]).length,r=[];let o,s,a,l;for(s=0;s<n;++s)o=t.getDatasetMeta(s),a=o.dataset,l=null,a&&a.options&&a instanceof ip&&(l={visible:t.isDatasetVisible(s),index:s,fill:Sp(a,s,n),chart:t,axis:o.controller.options.indexAxis,scale:o.vScale,line:a}),o.$filler=l,r.push(l);for(s=0;s<n;++s)l=r[s],l&&!1!==l.fill&&(l.fill=kp(r,s,i.propagate))},beforeDraw(t,e,i){const n="beforeDraw"===i.drawTime,r=t.getSortedVisibleDatasetMetas(),o=t.chartArea;for(let e=r.length-1;e>=0;--e){const i=r[e].$filler;i&&(i.line.updateControlPoints(o,i.axis),n&&i.fill&&Pp(t.ctx,i,o))}},beforeDatasetsDraw(t,e,i){if("beforeDatasetsDraw"!==i.drawTime)return;const n=t.getSortedVisibleDatasetMetas();for(let e=n.length-1;e>=0;--e){const i=n[e].$filler;Mp(i)&&Pp(t.ctx,i,t.chartArea)}},beforeDatasetDraw(t,e,i){const n=e.meta.$filler;Mp(n)&&"beforeDatasetDraw"===i.drawTime&&Pp(t.ctx,n,t.chartArea)},defaults:{propagate:!0,drawTime:"beforeDatasetDraw"}};const Lp=(t,e)=>{let{boxHeight:i=e,boxWidth:n=e}=t;return t.usePointStyle&&(i=Math.min(i,e),n=t.pointStyleWidth||Math.min(n,e)),{boxWidth:n,boxHeight:i,itemHeight:Math.max(e,i)}};class zp extends sf{constructor(t){super(),this._added=!1,this.legendHitBoxes=[],this._hoveredItem=null,this.doughnutMode=!1,this.chart=t.chart,this.options=t.options,this.ctx=t.ctx,this.legendItems=void 0,this.columnSizes=void 0,this.lineWidths=void 0,this.maxHeight=void 0,this.maxWidth=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.height=void 0,this.width=void 0,this._margins=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(t,e,i){this.maxWidth=t,this.maxHeight=e,this._margins=i,this.setDimensions(),this.buildLabels(),this.fit()}setDimensions(){this.isHorizontal()?(this.width=this.maxWidth,this.left=this._margins.left,this.right=this.width):(this.height=this.maxHeight,this.top=this._margins.top,this.bottom=this.height)}buildLabels(){const t=this.options.labels||{};let e=pc(t.generateLabels,[this.chart],this)||[];t.filter&&(e=e.filter((e=>t.filter(e,this.chart.data)))),t.sort&&(e=e.sort(((e,i)=>t.sort(e,i,this.chart.data)))),this.options.reverse&&e.reverse(),this.legendItems=e}fit(){const{options:t,ctx:e}=this;if(!t.display)return void(this.width=this.height=0);const i=t.labels,n=Jh(i.font),r=n.size,o=this._computeTitleHeight(),{boxWidth:s,itemHeight:a}=Lp(i,r);let l,c;e.font=n.string,this.isHorizontal()?(l=this.maxWidth,c=this._fitRows(o,r,s,a)+10):(c=this.maxHeight,l=this._fitCols(o,n,s,a)+10),this.width=Math.min(l,t.maxWidth||this.maxWidth),this.height=Math.min(c,t.maxHeight||this.maxHeight)}_fitRows(t,e,i,n){const{ctx:r,maxWidth:o,options:{labels:{padding:s}}}=this,a=this.legendHitBoxes=[],l=this.lineWidths=[0],c=n+s;let h=t;r.textAlign="left",r.textBaseline="middle";let u=-1,d=-c;return this.legendItems.forEach(((t,f)=>{const p=i+e/2+r.measureText(t.text).width;(0===f||l[l.length-1]+p+2*s>o)&&(h+=c,l[l.length-(f>0?0:1)]=0,d+=c,u++),a[f]={left:0,top:d,row:u,width:p,height:n},l[l.length-1]+=p+s})),h}_fitCols(t,e,i,n){const{ctx:r,maxHeight:o,options:{labels:{padding:s}}}=this,a=this.legendHitBoxes=[],l=this.columnSizes=[],c=o-t;let h=s,u=0,d=0,f=0,p=0;return this.legendItems.forEach(((t,o)=>{const{itemWidth:g,itemHeight:m}=function(t,e,i,n,r){const o=function(t,e,i,n){let r=t.text;return r&&"string"!=typeof r&&(r=r.reduce(((t,e)=>t.length>e.length?t:e))),e+i.size/2+n.measureText(r).width}(n,t,e,i),s=function(t,e,i){let n=t;return"string"!=typeof e.text&&(n=Np(e,i)),n}(r,n,e.lineHeight);return{itemWidth:o,itemHeight:s}}(i,e,r,t,n);o>0&&d+m+2*s>c&&(h+=u+s,l.push({width:u,height:d}),f+=u+s,p++,u=d=0),a[o]={left:f,top:d,col:p,width:g,height:m},u=Math.max(u,g),d+=m+s})),h+=u,l.push({width:u,height:d}),h}adjustHitBoxes(){if(!this.options.display)return;const t=this._computeTitleHeight(),{legendHitBoxes:e,options:{align:i,labels:{padding:n},rtl:r}}=this,o=Nu(r,this.left,this.width);if(this.isHorizontal()){let r=0,s=lh(i,this.left+n,this.right-this.lineWidths[r]);for(const a of e)r!==a.row&&(r=a.row,s=lh(i,this.left+n,this.right-this.lineWidths[r])),a.top+=this.top+t+n,a.left=o.leftForLtr(o.x(s),a.width),s+=a.width+n}else{let r=0,s=lh(i,this.top+t+n,this.bottom-this.columnSizes[r].height);for(const a of e)a.col!==r&&(r=a.col,s=lh(i,this.top+t+n,this.bottom-this.columnSizes[r].height)),a.top=s,a.left+=this.left+n,a.left=o.leftForLtr(o.x(a.left),a.width),s+=a.height+n}}isHorizontal(){return"top"===this.options.position||"bottom"===this.options.position}draw(){if(this.options.display){const t=this.ctx;Nh(t,this),this._draw(),Ih(t)}}_draw(){const{options:t,columnSizes:e,lineWidths:i,ctx:n}=this,{align:r,labels:o}=t,s=Ph.color,a=Nu(t.rtl,this.left,this.width),l=Jh(o.font),{padding:c}=o,h=l.size,u=h/2;let d;this.drawTitle(),n.textAlign=a.textAlign("left"),n.textBaseline="middle",n.lineWidth=.5,n.font=l.string;const{boxWidth:f,boxHeight:p,itemHeight:g}=Lp(o,h),m=this.isHorizontal(),y=this._computeTitleHeight();d=m?{x:lh(r,this.left+c,this.right-i[0]),y:this.top+c+y,line:0}:{x:this.left+c,y:lh(r,this.top+y+c,this.bottom-e[0].height),line:0},Iu(this.ctx,t.textDirection);const b=g+c;this.legendItems.forEach(((v,x)=>{n.strokeStyle=v.fontColor,n.fillStyle=v.fontColor;const _=n.measureText(v.text).width,w=a.textAlign(v.textAlign||(v.textAlign=o.textAlign)),M=f+u+_;let k=d.x,S=d.y;if(a.setWidth(this.width),m?x>0&&k+M+c>this.right&&(S=d.y+=b,d.line++,k=d.x=lh(r,this.left+c,this.right-i[d.line])):x>0&&S+b>this.bottom&&(k=d.x=k+e[d.line].width+c,d.line++,S=d.y=lh(r,this.top+y+c,this.bottom-e[d.line].height)),function(t,e,i){if(isNaN(f)||f<=0||isNaN(p)||p<0)return;n.save();const r=dc(i.lineWidth,1);if(n.fillStyle=dc(i.fillStyle,s),n.lineCap=dc(i.lineCap,"butt"),n.lineDashOffset=dc(i.lineDashOffset,0),n.lineJoin=dc(i.lineJoin,"miter"),n.lineWidth=r,n.strokeStyle=dc(i.strokeStyle,s),n.setLineDash(dc(i.lineDash,[])),o.usePointStyle){const s={radius:p*Math.SQRT2/2,pointStyle:i.pointStyle,rotation:i.rotation,borderWidth:r},l=a.xPlus(t,f/2);Lh(n,s,l,e+u,o.pointStyleWidth&&f)}else{const o=e+Math.max((h-p)/2,0),s=a.leftForLtr(t,f),l=Kh(i.borderRadius);n.beginPath(),Object.values(l).some((t=>0!==t))?$h(n,{x:s,y:o,w:f,h:p,radius:l}):n.rect(s,o,f,p),n.fill(),0!==r&&n.stroke()}n.restore()}(a.x(k),S,v),k=((t,e,i,n)=>t===(n?"left":"right")?i:"center"===t?(e+i)/2:e)(w,k+f+u,m?k+M:this.right,t.rtl),function(t,e,i){Wh(n,i.text,t,e+g/2,l,{strikethrough:i.hidden,textAlign:a.textAlign(i.textAlign)})}(a.x(k),S,v),m)d.x+=M+c;else if("string"!=typeof v.text){const t=l.lineHeight;d.y+=Np(v,t)+c}else d.y+=b})),Hu(this.ctx,t.textDirection)}drawTitle(){const t=this.options,e=t.title,i=Jh(e.font),n=Qh(e.padding);if(!e.display)return;const r=Nu(t.rtl,this.left,this.width),o=this.ctx,s=e.position,a=i.size/2,l=n.top+a;let c,h=this.left,u=this.width;if(this.isHorizontal())u=Math.max(...this.lineWidths),c=this.top+l,h=lh(t.align,h,this.right-u);else{const e=this.columnSizes.reduce(((t,e)=>Math.max(t,e.height)),0);c=l+lh(t.align,this.top,this.bottom-e-t.labels.padding-this._computeTitleHeight())}const d=lh(s,h,h+u);o.textAlign=r.textAlign(ah(s)),o.textBaseline="middle",o.strokeStyle=e.color,o.fillStyle=e.color,o.font=i.string,Wh(o,e.text,d,c,i)}_computeTitleHeight(){const t=this.options.title,e=Jh(t.font),i=Qh(t.padding);return t.display?e.lineHeight+i.height:0}_getLegendItemAt(t,e){let i,n,r;if(Qc(t,this.left,this.right)&&Qc(e,this.top,this.bottom))for(r=this.legendHitBoxes,i=0;i<r.length;++i)if(n=r[i],Qc(t,n.left,n.left+n.width)&&Qc(e,n.top,n.top+n.height))return this.legendItems[i];return null}handleEvent(t){const e=this.options;if(!function(t,e){return!("mousemove"!==t&&"mouseout"!==t||!e.onHover&&!e.onLeave)||!(!e.onClick||"click"!==t&&"mouseup"!==t)}(t.type,e))return;const i=this._getLegendItemAt(t.x,t.y);if("mousemove"===t.type||"mouseout"===t.type){const o=this._hoveredItem,s=(r=i,null!==(n=o)&&null!==r&&n.datasetIndex===r.datasetIndex&&n.index===r.index);o&&!s&&pc(e.onLeave,[t,o,this],this),this._hoveredItem=i,i&&!s&&pc(e.onHover,[t,i,this],this)}else i&&pc(e.onClick,[t,i,this],this);var n,r}}function Np(t,e){return e*(t.text?t.text.length:0)}var Ip={id:"legend",_element:zp,start(t,e,i){const n=t.legend=new zp({ctx:t.ctx,options:i,chart:t});Fd.configure(t,n,i),Fd.addBox(t,n)},stop(t){Fd.removeBox(t,t.legend),delete t.legend},beforeUpdate(t,e,i){const n=t.legend;Fd.configure(t,n,i),n.options=i},afterUpdate(t){const e=t.legend;e.buildLabels(),e.adjustHitBoxes()},afterEvent(t,e){e.replay||t.legend.handleEvent(e.event)},defaults:{display:!0,position:"top",align:"center",fullSize:!0,reverse:!1,weight:1e3,onClick(t,e,i){const n=e.datasetIndex,r=i.chart;r.isDatasetVisible(n)?(r.hide(n),e.hidden=!0):(r.show(n),e.hidden=!1)},onHover:null,onLeave:null,labels:{color:t=>t.chart.options.color,boxWidth:40,padding:10,generateLabels(t){const e=t.data.datasets,{labels:{usePointStyle:i,pointStyle:n,textAlign:r,color:o,useBorderRadius:s,borderRadius:a}}=t.legend.options;return t._getSortedDatasetMetas().map((t=>{const l=t.controller.getStyle(i?0:void 0),c=Qh(l.borderWidth);return{text:e[t.index].label,fillStyle:l.backgroundColor,fontColor:o,hidden:!t.visible,lineCap:l.borderCapStyle,lineDash:l.borderDash,lineDashOffset:l.borderDashOffset,lineJoin:l.borderJoinStyle,lineWidth:(c.width+c.height)/4,strokeStyle:l.borderColor,pointStyle:n||l.pointStyle,rotation:l.rotation,textAlign:r||l.textAlign,borderRadius:s&&(a||l.borderRadius),datasetIndex:t.index}}),this)}},title:{color:t=>t.chart.options.color,display:!1,position:"center",text:""}},descriptors:{_scriptable:t=>!t.startsWith("on"),labels:{_scriptable:t=>!["generateLabels","filter","sort"].includes(t)}}};class Hp extends sf{constructor(t){super(),this.chart=t.chart,this.options=t.options,this.ctx=t.ctx,this._padding=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.width=void 0,this.height=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(t,e){const i=this.options;if(this.left=0,this.top=0,!i.display)return void(this.width=this.height=this.right=this.bottom=0);this.width=this.right=t,this.height=this.bottom=e;const n=lc(i.text)?i.text.length:1;this._padding=Qh(i.padding);const r=n*Jh(i.font).lineHeight+this._padding.height;this.isHorizontal()?this.height=r:this.width=r}isHorizontal(){const t=this.options.position;return"top"===t||"bottom"===t}_drawArgs(t){const{top:e,left:i,bottom:n,right:r,options:o}=this,s=o.align;let a,l,c,h=0;return this.isHorizontal()?(l=lh(s,i,r),c=e+t,a=r-i):("left"===o.position?(l=i+t,c=lh(s,n,e),h=-.5*Pc):(l=r-t,c=lh(s,e,n),h=.5*Pc),a=n-e),{titleX:l,titleY:c,maxWidth:a,rotation:h}}draw(){const t=this.ctx,e=this.options;if(!e.display)return;const i=Jh(e.font),n=i.lineHeight/2+this._padding.top,{titleX:r,titleY:o,maxWidth:s,rotation:a}=this._drawArgs(n);Wh(t,e.text,0,0,i,{color:e.color,maxWidth:s,rotation:a,textAlign:ah(e.align),textBaseline:"middle",translation:[r,o]})}}var Up={id:"title",_element:Hp,start(t,e,i){!function(t,e){const i=new Hp({ctx:t.ctx,options:e,chart:t});Fd.configure(t,i,e),Fd.addBox(t,i),t.titleBlock=i}(t,i)},stop(t){const e=t.titleBlock;Fd.removeBox(t,e),delete t.titleBlock},beforeUpdate(t,e,i){const n=t.titleBlock;Fd.configure(t,n,i),n.options=i},defaults:{align:"center",display:!1,font:{weight:"bold"},fullSize:!0,padding:10,position:"top",text:"",weight:2e3},defaultRoutes:{color:"color"},descriptors:{_scriptable:!0,_indexable:!1}};const Fp=new WeakMap;var Bp={id:"subtitle",start(t,e,i){const n=new Hp({ctx:t.ctx,options:i,chart:t});Fd.configure(t,n,i),Fd.addBox(t,n),Fp.set(t,n)},stop(t){Fd.removeBox(t,Fp.get(t)),Fp.delete(t)},beforeUpdate(t,e,i){const n=Fp.get(t);Fd.configure(t,n,i),n.options=i},defaults:{align:"center",display:!1,font:{weight:"normal"},fullSize:!0,padding:0,position:"top",text:"",weight:1500},defaultRoutes:{color:"color"},descriptors:{_scriptable:!0,_indexable:!1}};const Wp={average(t){if(!t.length)return!1;let e,i,n=0,r=0,o=0;for(e=0,i=t.length;e<i;++e){const i=t[e].element;if(i&&i.hasValue()){const t=i.tooltipPosition();n+=t.x,r+=t.y,++o}}return{x:n/o,y:r/o}},nearest(t,e){if(!t.length)return!1;let i,n,r,o=e.x,s=e.y,a=Number.POSITIVE_INFINITY;for(i=0,n=t.length;i<n;++i){const n=t[i].element;if(n&&n.hasValue()){const t=Gc(e,n.getCenterPoint());t<a&&(a=t,r=n)}}if(r){const t=r.tooltipPosition();o=t.x,s=t.y}return{x:o,y:s}}};function $p(t,e){return e&&(lc(e)?Array.prototype.push.apply(t,e):t.push(e)),t}function Vp(t){return("string"==typeof t||t instanceof String)&&t.indexOf("\n")>-1?t.split("\n"):t}function Yp(t,e){const{element:i,datasetIndex:n,index:r}=e,o=t.getDatasetMeta(n).controller,{label:s,value:a}=o.getLabelAndValue(r);return{chart:t,label:s,parsed:o.getParsed(r),raw:t.data.datasets[n].data[r],formattedValue:a,dataset:o.getDataset(),dataIndex:r,datasetIndex:n,element:i}}function Gp(t,e){const i=t.chart.ctx,{body:n,footer:r,title:o}=t,{boxWidth:s,boxHeight:a}=e,l=Jh(e.bodyFont),c=Jh(e.titleFont),h=Jh(e.footerFont),u=o.length,d=r.length,f=n.length,p=Qh(e.padding);let g=p.height,m=0,y=n.reduce(((t,e)=>t+e.before.length+e.lines.length+e.after.length),0);y+=t.beforeBody.length+t.afterBody.length,u&&(g+=u*c.lineHeight+(u-1)*e.titleSpacing+e.titleMarginBottom),y&&(g+=f*(e.displayColors?Math.max(a,l.lineHeight):l.lineHeight)+(y-f)*l.lineHeight+(y-1)*e.bodySpacing),d&&(g+=e.footerMarginTop+d*h.lineHeight+(d-1)*e.footerSpacing);let b=0;const v=function(t){m=Math.max(m,i.measureText(t).width+b)};return i.save(),i.font=c.string,gc(t.title,v),i.font=l.string,gc(t.beforeBody.concat(t.afterBody),v),b=e.displayColors?s+2+e.boxPadding:0,gc(n,(t=>{gc(t.before,v),gc(t.lines,v),gc(t.after,v)})),b=0,i.font=h.string,gc(t.footer,v),i.restore(),m+=p.width,{width:m,height:g}}function Xp(t,e,i,n){const{x:r,width:o}=i,{width:s,chartArea:{left:a,right:l}}=t;let c="center";return"center"===n?c=r<=(a+l)/2?"left":"right":r<=o/2?c="left":r>=s-o/2&&(c="right"),function(t,e,i,n){const{x:r,width:o}=n,s=i.caretSize+i.caretPadding;return"left"===t&&r+o+s>e.width||"right"===t&&r-o-s<0||void 0}(c,t,e,i)&&(c="center"),c}function qp(t,e,i){const n=i.yAlign||e.yAlign||function(t,e){const{y:i,height:n}=e;return i<n/2?"top":i>t.height-n/2?"bottom":"center"}(t,i);return{xAlign:i.xAlign||e.xAlign||Xp(t,e,i,n),yAlign:n}}function Zp(t,e,i,n){const{caretSize:r,caretPadding:o,cornerRadius:s}=t,{xAlign:a,yAlign:l}=i,c=r+o,{topLeft:h,topRight:u,bottomLeft:d,bottomRight:f}=Kh(s);let p=function(t,e){let{x:i,width:n}=t;return"right"===e?i-=n:"center"===e&&(i-=n/2),i}(e,a);const g=function(t,e,i){let{y:n,height:r}=t;return"top"===e?n+=i:n-="bottom"===e?r+i:r/2,n}(e,l,c);return"center"===l?"left"===a?p+=c:"right"===a&&(p-=c):"left"===a?p-=Math.max(h,d)+r:"right"===a&&(p+=Math.max(u,f)+r),{x:Kc(p,0,n.width-e.width),y:Kc(g,0,n.height-e.height)}}function Kp(t,e,i){const n=Qh(i.padding);return"center"===e?t.x+t.width/2:"right"===e?t.x+t.width-n.right:t.x+n.left}function Qp(t){return $p([],Vp(t))}function Jp(t,e){const i=e&&e.dataset&&e.dataset.tooltip&&e.dataset.tooltip.callbacks;return i?t.override(i):t}const tg={beforeTitle:oc,title(t){if(t.length>0){const e=t[0],i=e.chart.data.labels,n=i?i.length:0;if(this&&this.options&&"dataset"===this.options.mode)return e.dataset.label||"";if(e.label)return e.label;if(n>0&&e.dataIndex<n)return i[e.dataIndex]}return""},afterTitle:oc,beforeBody:oc,beforeLabel:oc,label(t){if(this&&this.options&&"dataset"===this.options.mode)return t.label+": "+t.formattedValue||t.formattedValue;let e=t.dataset.label||"";e&&(e+=": ");const i=t.formattedValue;return ac(i)||(e+=i),e},labelColor(t){const e=t.chart.getDatasetMeta(t.datasetIndex).controller.getStyle(t.dataIndex);return{borderColor:e.borderColor,backgroundColor:e.backgroundColor,borderWidth:e.borderWidth,borderDash:e.borderDash,borderDashOffset:e.borderDashOffset,borderRadius:0}},labelTextColor(){return this.options.bodyColor},labelPointStyle(t){const e=t.chart.getDatasetMeta(t.datasetIndex).controller.getStyle(t.dataIndex);return{pointStyle:e.pointStyle,rotation:e.rotation}},afterLabel:oc,afterBody:oc,beforeFooter:oc,footer:oc,afterFooter:oc};function eg(t,e,i,n){const r=t[e].call(i,n);return void 0===r?tg[e].call(i,n):r}class ig extends sf{static positioners=Wp;constructor(t){super(),this.opacity=0,this._active=[],this._eventPosition=void 0,this._size=void 0,this._cachedAnimations=void 0,this._tooltipItems=[],this.$animations=void 0,this.$context=void 0,this.chart=t.chart,this.options=t.options,this.dataPoints=void 0,this.title=void 0,this.beforeBody=void 0,this.body=void 0,this.afterBody=void 0,this.footer=void 0,this.xAlign=void 0,this.yAlign=void 0,this.x=void 0,this.y=void 0,this.height=void 0,this.width=void 0,this.caretX=void 0,this.caretY=void 0,this.labelColors=void 0,this.labelPointStyles=void 0,this.labelTextColors=void 0}initialize(t){this.options=t,this._cachedAnimations=void 0,this.$context=void 0}_resolveAnimations(){const t=this._cachedAnimations;if(t)return t;const e=this.chart,i=this.options.setContext(this.getContext()),n=i.enabled&&e.options.animation&&i.animations,r=new Ku(this.chart,n);return n._cacheable&&(this._cachedAnimations=Object.freeze(r)),r}getContext(){return this.$context||(this.$context=(this,eu(this.chart.getContext(),{tooltip:this,tooltipItems:this._tooltipItems,type:"tooltip"})))}getTitle(t,e){const{callbacks:i}=e,n=eg(i,"beforeTitle",this,t),r=eg(i,"title",this,t),o=eg(i,"afterTitle",this,t);let s=[];return s=$p(s,Vp(n)),s=$p(s,Vp(r)),s=$p(s,Vp(o)),s}getBeforeBody(t,e){return Qp(eg(e.callbacks,"beforeBody",this,t))}getBody(t,e){const{callbacks:i}=e,n=[];return gc(t,(t=>{const e={before:[],lines:[],after:[]},r=Jp(i,t);$p(e.before,Vp(eg(r,"beforeLabel",this,t))),$p(e.lines,eg(r,"label",this,t)),$p(e.after,Vp(eg(r,"afterLabel",this,t))),n.push(e)})),n}getAfterBody(t,e){return Qp(eg(e.callbacks,"afterBody",this,t))}getFooter(t,e){const{callbacks:i}=e,n=eg(i,"beforeFooter",this,t),r=eg(i,"footer",this,t),o=eg(i,"afterFooter",this,t);let s=[];return s=$p(s,Vp(n)),s=$p(s,Vp(r)),s=$p(s,Vp(o)),s}_createItems(t){const e=this._active,i=this.chart.data,n=[],r=[],o=[];let s,a,l=[];for(s=0,a=e.length;s<a;++s)l.push(Yp(this.chart,e[s]));return t.filter&&(l=l.filter(((e,n,r)=>t.filter(e,n,r,i)))),t.itemSort&&(l=l.sort(((e,n)=>t.itemSort(e,n,i)))),gc(l,(e=>{const i=Jp(t.callbacks,e);n.push(eg(i,"labelColor",this,e)),r.push(eg(i,"labelPointStyle",this,e)),o.push(eg(i,"labelTextColor",this,e))})),this.labelColors=n,this.labelPointStyles=r,this.labelTextColors=o,this.dataPoints=l,l}update(t,e){const i=this.options.setContext(this.getContext()),n=this._active;let r,o=[];if(n.length){const t=Wp[i.position].call(this,n,this._eventPosition);o=this._createItems(i),this.title=this.getTitle(o,i),this.beforeBody=this.getBeforeBody(o,i),this.body=this.getBody(o,i),this.afterBody=this.getAfterBody(o,i),this.footer=this.getFooter(o,i);const e=this._size=Gp(this,i),s=Object.assign({},t,e),a=qp(this.chart,i,s),l=Zp(i,s,a,this.chart);this.xAlign=a.xAlign,this.yAlign=a.yAlign,r={opacity:1,x:l.x,y:l.y,width:e.width,height:e.height,caretX:t.x,caretY:t.y}}else 0!==this.opacity&&(r={opacity:0});this._tooltipItems=o,this.$context=void 0,r&&this._resolveAnimations().update(this,r),t&&i.external&&i.external.call(this,{chart:this.chart,tooltip:this,replay:e})}drawCaret(t,e,i,n){const r=this.getCaretPosition(t,i,n);e.lineTo(r.x1,r.y1),e.lineTo(r.x2,r.y2),e.lineTo(r.x3,r.y3)}getCaretPosition(t,e,i){const{xAlign:n,yAlign:r}=this,{caretSize:o,cornerRadius:s}=i,{topLeft:a,topRight:l,bottomLeft:c,bottomRight:h}=Kh(s),{x:u,y:d}=t,{width:f,height:p}=e;let g,m,y,b,v,x;return"center"===r?(v=d+p/2,"left"===n?(g=u,m=g-o,b=v+o,x=v-o):(g=u+f,m=g+o,b=v-o,x=v+o),y=g):(m="left"===n?u+Math.max(a,c)+o:"right"===n?u+f-Math.max(l,h)-o:this.caretX,"top"===r?(b=d,v=b-o,g=m-o,y=m+o):(b=d+p,v=b+o,g=m+o,y=m-o),x=b),{x1:g,x2:m,x3:y,y1:b,y2:v,y3:x}}drawTitle(t,e,i){const n=this.title,r=n.length;let o,s,a;if(r){const l=Nu(i.rtl,this.x,this.width);for(t.x=Kp(this,i.titleAlign,i),e.textAlign=l.textAlign(i.titleAlign),e.textBaseline="middle",o=Jh(i.titleFont),s=i.titleSpacing,e.fillStyle=i.titleColor,e.font=o.string,a=0;a<r;++a)e.fillText(n[a],l.x(t.x),t.y+o.lineHeight/2),t.y+=o.lineHeight+s,a+1===r&&(t.y+=i.titleMarginBottom-s)}}_drawColorBox(t,e,i,n,r){const o=this.labelColors[i],s=this.labelPointStyles[i],{boxHeight:a,boxWidth:l}=r,c=Jh(r.bodyFont),h=Kp(this,"left",r),u=n.x(h),d=a<c.lineHeight?(c.lineHeight-a)/2:0,f=e.y+d;if(r.usePointStyle){const e={radius:Math.min(l,a)/2,pointStyle:s.pointStyle,rotation:s.rotation,borderWidth:1},i=n.leftForLtr(u,l)+l/2,c=f+a/2;t.strokeStyle=r.multiKeyBackground,t.fillStyle=r.multiKeyBackground,Rh(t,e,i,c),t.strokeStyle=o.borderColor,t.fillStyle=o.backgroundColor,Rh(t,e,i,c)}else{t.lineWidth=cc(o.borderWidth)?Math.max(...Object.values(o.borderWidth)):o.borderWidth||1,t.strokeStyle=o.borderColor,t.setLineDash(o.borderDash||[]),t.lineDashOffset=o.borderDashOffset||0;const e=n.leftForLtr(u,l),i=n.leftForLtr(n.xPlus(u,1),l-2),s=Kh(o.borderRadius);Object.values(s).some((t=>0!==t))?(t.beginPath(),t.fillStyle=r.multiKeyBackground,$h(t,{x:e,y:f,w:l,h:a,radius:s}),t.fill(),t.stroke(),t.fillStyle=o.backgroundColor,t.beginPath(),$h(t,{x:i,y:f+1,w:l-2,h:a-2,radius:s}),t.fill()):(t.fillStyle=r.multiKeyBackground,t.fillRect(e,f,l,a),t.strokeRect(e,f,l,a),t.fillStyle=o.backgroundColor,t.fillRect(i,f+1,l-2,a-2))}t.fillStyle=this.labelTextColors[i]}drawBody(t,e,i){const{body:n}=this,{bodySpacing:r,bodyAlign:o,displayColors:s,boxHeight:a,boxWidth:l,boxPadding:c}=i,h=Jh(i.bodyFont);let u=h.lineHeight,d=0;const f=Nu(i.rtl,this.x,this.width),p=function(i){e.fillText(i,f.x(t.x+d),t.y+u/2),t.y+=u+r},g=f.textAlign(o);let m,y,b,v,x,_,w;for(e.textAlign=o,e.textBaseline="middle",e.font=h.string,t.x=Kp(this,g,i),e.fillStyle=i.bodyColor,gc(this.beforeBody,p),d=s&&"right"!==g?"center"===o?l/2+c:l+2+c:0,v=0,_=n.length;v<_;++v){for(m=n[v],y=this.labelTextColors[v],e.fillStyle=y,gc(m.before,p),b=m.lines,s&&b.length&&(this._drawColorBox(e,t,v,f,i),u=Math.max(h.lineHeight,a)),x=0,w=b.length;x<w;++x)p(b[x]),u=h.lineHeight;gc(m.after,p)}d=0,u=h.lineHeight,gc(this.afterBody,p),t.y-=r}drawFooter(t,e,i){const n=this.footer,r=n.length;let o,s;if(r){const a=Nu(i.rtl,this.x,this.width);for(t.x=Kp(this,i.footerAlign,i),t.y+=i.footerMarginTop,e.textAlign=a.textAlign(i.footerAlign),e.textBaseline="middle",o=Jh(i.footerFont),e.fillStyle=i.footerColor,e.font=o.string,s=0;s<r;++s)e.fillText(n[s],a.x(t.x),t.y+o.lineHeight/2),t.y+=o.lineHeight+i.footerSpacing}}drawBackground(t,e,i,n){const{xAlign:r,yAlign:o}=this,{x:s,y:a}=t,{width:l,height:c}=i,{topLeft:h,topRight:u,bottomLeft:d,bottomRight:f}=Kh(n.cornerRadius);e.fillStyle=n.backgroundColor,e.strokeStyle=n.borderColor,e.lineWidth=n.borderWidth,e.beginPath(),e.moveTo(s+h,a),"top"===o&&this.drawCaret(t,e,i,n),e.lineTo(s+l-u,a),e.quadraticCurveTo(s+l,a,s+l,a+u),"center"===o&&"right"===r&&this.drawCaret(t,e,i,n),e.lineTo(s+l,a+c-f),e.quadraticCurveTo(s+l,a+c,s+l-f,a+c),"bottom"===o&&this.drawCaret(t,e,i,n),e.lineTo(s+d,a+c),e.quadraticCurveTo(s,a+c,s,a+c-d),"center"===o&&"left"===r&&this.drawCaret(t,e,i,n),e.lineTo(s,a+h),e.quadraticCurveTo(s,a,s+h,a),e.closePath(),e.fill(),n.borderWidth>0&&e.stroke()}_updateAnimationTarget(t){const e=this.chart,i=this.$animations,n=i&&i.x,r=i&&i.y;if(n||r){const i=Wp[t.position].call(this,this._active,this._eventPosition);if(!i)return;const o=this._size=Gp(this,t),s=Object.assign({},i,this._size),a=qp(e,t,s),l=Zp(t,s,a,e);n._to===l.x&&r._to===l.y||(this.xAlign=a.xAlign,this.yAlign=a.yAlign,this.width=o.width,this.height=o.height,this.caretX=i.x,this.caretY=i.y,this._resolveAnimations().update(this,l))}}_willRender(){return!!this.opacity}draw(t){const e=this.options.setContext(this.getContext());let i=this.opacity;if(!i)return;this._updateAnimationTarget(e);const n={width:this.width,height:this.height},r={x:this.x,y:this.y};i=Math.abs(i)<.001?0:i;const o=Qh(e.padding),s=this.title.length||this.beforeBody.length||this.body.length||this.afterBody.length||this.footer.length;e.enabled&&s&&(t.save(),t.globalAlpha=i,this.drawBackground(r,t,n,e),Iu(t,e.textDirection),r.y+=o.top,this.drawTitle(r,t,e),this.drawBody(r,t,e),this.drawFooter(r,t,e),Hu(t,e.textDirection),t.restore())}getActiveElements(){return this._active||[]}setActiveElements(t,e){const i=this._active,n=t.map((({datasetIndex:t,index:e})=>{const i=this.chart.getDatasetMeta(t);if(!i)throw new Error("Cannot find a dataset at index "+t);return{datasetIndex:t,element:i.data[e],index:e}})),r=!mc(i,n),o=this._positionChanged(n,e);(r||o)&&(this._active=n,this._eventPosition=e,this._ignoreReplayEvents=!0,this.update(!0))}handleEvent(t,e,i=!0){if(e&&this._ignoreReplayEvents)return!1;this._ignoreReplayEvents=!1;const n=this.options,r=this._active||[],o=this._getActiveElements(t,r,e,i),s=this._positionChanged(o,t),a=e||!mc(o,r)||s;return a&&(this._active=o,(n.enabled||n.external)&&(this._eventPosition={x:t.x,y:t.y},this.update(!0,e))),a}_getActiveElements(t,e,i,n){const r=this.options;if("mouseout"===t.type)return[];if(!n)return e;const o=this.chart.getElementsAtEventForMode(t,r.mode,r,i);return r.reverse&&o.reverse(),o}_positionChanged(t,e){const{caretX:i,caretY:n,options:r}=this,o=Wp[r.position].call(this,t,e);return!1!==o&&(i!==o.x||n!==o.y)}}var ng={id:"tooltip",_element:ig,positioners:Wp,afterInit(t,e,i){i&&(t.tooltip=new ig({chart:t,options:i}))},beforeUpdate(t,e,i){t.tooltip&&t.tooltip.initialize(i)},reset(t,e,i){t.tooltip&&t.tooltip.initialize(i)},afterDraw(t){const e=t.tooltip;if(e&&e._willRender()){const i={tooltip:e};if(!1===t.notifyPlugins("beforeTooltipDraw",{...i,cancelable:!0}))return;e.draw(t.ctx),t.notifyPlugins("afterTooltipDraw",i)}},afterEvent(t,e){if(t.tooltip){const i=e.replay;t.tooltip.handleEvent(e.event,i,e.inChartArea)&&(e.changed=!0)}},defaults:{enabled:!0,external:null,position:"average",backgroundColor:"rgba(0,0,0,0.8)",titleColor:"#fff",titleFont:{weight:"bold"},titleSpacing:2,titleMarginBottom:6,titleAlign:"left",bodyColor:"#fff",bodySpacing:2,bodyFont:{},bodyAlign:"left",footerColor:"#fff",footerSpacing:2,footerMarginTop:6,footerFont:{weight:"bold"},footerAlign:"left",padding:6,caretPadding:2,caretSize:5,cornerRadius:6,boxHeight:(t,e)=>e.bodyFont.size,boxWidth:(t,e)=>e.bodyFont.size,multiKeyBackground:"#fff",displayColors:!0,boxPadding:0,borderColor:"rgba(0,0,0,0)",borderWidth:0,animation:{duration:400,easing:"easeOutQuart"},animations:{numbers:{type:"number",properties:["x","y","width","height","caretX","caretY"]},opacity:{easing:"linear",duration:200}},callbacks:tg},defaultRoutes:{bodyFont:"font",footerFont:"font",titleFont:"font"},descriptors:{_scriptable:t=>"filter"!==t&&"itemSort"!==t&&"external"!==t,_indexable:!1,callbacks:{_scriptable:!1,_indexable:!1},animation:{_fallback:!1},animations:{_fallback:"animation"}},additionalOptionScopes:["interaction"]},rg=Object.freeze({__proto__:null,Colors:gp,Decimation:bp,Filler:Rp,Legend:Ip,SubTitle:Bp,Title:Up,Tooltip:ng});function og(t){const e=this.getLabels();return t>=0&&t<e.length?e[t]:t}function sg(t,e,{horizontal:i,minRotation:n}){const r=Wc(n),o=(i?Math.sin(r):Math.cos(r))||.001,s=.75*e*(""+t).length;return Math.min(e/o,s)}class ag extends gf{constructor(t){super(t),this.start=void 0,this.end=void 0,this._startValue=void 0,this._endValue=void 0,this._valueRange=0}parse(t,e){return ac(t)||("number"==typeof t||t instanceof Number)&&!isFinite(+t)?null:+t}handleTickRangeOptions(){const{beginAtZero:t}=this.options,{minDefined:e,maxDefined:i}=this.getUserBounds();let{min:n,max:r}=this;const o=t=>n=e?n:t,s=t=>r=i?r:t;if(t){const t=Ic(n),e=Ic(r);t<0&&e<0?s(0):t>0&&e>0&&o(0)}if(n===r){let e=0===r?1:Math.abs(.05*r);s(r+e),t||o(n-e)}this.min=n,this.max=r}getTickLimit(){const t=this.options.ticks;let e,{maxTicksLimit:i,stepSize:n}=t;return n?(e=Math.ceil(this.max/n)-Math.floor(this.min/n)+1,e>1e3&&(console.warn(`scales.${this.id}.ticks.stepSize: ${n} would result generating up to ${e} ticks. Limiting to 1000.`),e=1e3)):(e=this.computeTickLimit(),i=i||11),i&&(e=Math.min(i,e)),e}computeTickLimit(){return Number.POSITIVE_INFINITY}buildTicks(){const t=this.options,e=t.ticks;let i=this.getTickLimit();i=Math.max(2,i);const n=function(t,e){const i=[],{bounds:n,step:r,min:o,max:s,precision:a,count:l,maxTicks:c,maxDigits:h,includeBounds:u}=t,d=r||1,f=c-1,{min:p,max:g}=e,m=!ac(o),y=!ac(s),b=!ac(l),v=(g-p)/(h+1);let x,_,w,M,k=Uc((g-p)/f/d)*d;if(k<1e-14&&!m&&!y)return[{value:p},{value:g}];M=Math.ceil(g/k)-Math.floor(p/k),M>f&&(k=Uc(M*k/f/d)*d),ac(a)||(x=Math.pow(10,a),k=Math.ceil(k*x)/x),"ticks"===n?(_=Math.floor(p/k)*k,w=Math.ceil(g/k)*k):(_=p,w=g),m&&y&&r&&function(t,e){const i=Math.round(t);return i-e<=t&&i+e>=t}((s-o)/r,k/1e3)?(M=Math.round(Math.min((s-o)/k,c)),k=(s-o)/M,_=o,w=s):b?(_=m?o:_,w=y?s:w,M=l-1,k=(w-_)/M):(M=(w-_)/k,M=Hc(M,Math.round(M),k/1e3)?Math.round(M):Math.ceil(M));const S=Math.max(Vc(k),Vc(_));x=Math.pow(10,ac(a)?S:a),_=Math.round(_*x)/x,w=Math.round(w*x)/x;let O=0;for(m&&(u&&_!==o?(i.push({value:o}),_<o&&O++,Hc(Math.round((_+O*k)*x)/x,o,sg(o,v,t))&&O++):_<o&&O++);O<M;++O){const t=Math.round((_+O*k)*x)/x;if(y&&t>s)break;i.push({value:t})}return y&&u&&w!==s?i.length&&Hc(i[i.length-1].value,s,sg(s,v,t))?i[i.length-1].value=s:i.push({value:s}):y&&w!==s||i.push({value:w}),i}({maxTicks:i,bounds:t.bounds,min:t.min,max:t.max,precision:e.precision,step:e.stepSize,count:e.count,maxDigits:this._maxDigits(),horizontal:this.isHorizontal(),minRotation:e.minRotation||0,includeBounds:!1!==e.includeBounds},this._range||this);return"ticks"===t.bounds&&Bc(n,this,"value"),t.reverse?(n.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),n}configure(){const t=this.ticks;let e=this.min,i=this.max;if(super.configure(),this.options.offset&&t.length){const n=(i-e)/Math.max(t.length-1,1)/2;e-=n,i+=n}this._startValue=e,this._endValue=i,this._valueRange=i-e}getLabelForValue(t){return _h(t,this.chart.options.locale,this.options.ticks.format)}}class lg extends ag{static id="linear";static defaults={ticks:{callback:Mh.formatters.numeric}};determineDataLimits(){const{min:t,max:e}=this.getMinMax(!0);this.min=hc(t)?t:0,this.max=hc(e)?e:1,this.handleTickRangeOptions()}computeTickLimit(){const t=this.isHorizontal(),e=t?this.width:this.height,i=Wc(this.options.ticks.minRotation),n=(t?Math.sin(i):Math.cos(i))||.001,r=this._resolveTickFontOptions(0);return Math.ceil(e/Math.min(40,r.lineHeight/n))}getPixelForValue(t){return null===t?NaN:this.getPixelForDecimal((t-this._startValue)/this._valueRange)}getValueForPixel(t){return this._startValue+this.getDecimalForPixel(t)*this._valueRange}}const cg=t=>Math.floor(Nc(t)),hg=(t,e)=>Math.pow(10,cg(t)+e);function ug(t){return 1==t/Math.pow(10,cg(t))}function dg(t,e,i){const n=Math.pow(10,i),r=Math.floor(t/n);return Math.ceil(e/n)-r}class fg extends gf{static id="logarithmic";static defaults={ticks:{callback:Mh.formatters.logarithmic,major:{enabled:!0}}};constructor(t){super(t),this.start=void 0,this.end=void 0,this._startValue=void 0,this._valueRange=0}parse(t,e){const i=ag.prototype.parse.apply(this,[t,e]);if(0!==i)return hc(i)&&i>0?i:null;this._zero=!0}determineDataLimits(){const{min:t,max:e}=this.getMinMax(!0);this.min=hc(t)?Math.max(0,t):null,this.max=hc(e)?Math.max(0,e):null,this.options.beginAtZero&&(this._zero=!0),this._zero&&this.min!==this._suggestedMin&&!hc(this._userMin)&&(this.min=t===hg(this.min,0)?hg(this.min,-1):hg(this.min,0)),this.handleTickRangeOptions()}handleTickRangeOptions(){const{minDefined:t,maxDefined:e}=this.getUserBounds();let i=this.min,n=this.max;const r=e=>i=t?i:e,o=t=>n=e?n:t;i===n&&(i<=0?(r(1),o(10)):(r(hg(i,-1)),o(hg(n,1)))),i<=0&&r(hg(n,-1)),n<=0&&o(hg(i,1)),this.min=i,this.max=n}buildTicks(){const t=this.options,e=function(t,{min:e,max:i}){e=uc(t.min,e);const n=[],r=cg(e);let o=function(t,e){let i=cg(e-t);for(;dg(t,e,i)>10;)i++;for(;dg(t,e,i)<10;)i--;return Math.min(i,cg(t))}(e,i),s=o<0?Math.pow(10,Math.abs(o)):1;const a=Math.pow(10,o),l=r>o?Math.pow(10,r):0,c=Math.round((e-l)*s)/s,h=Math.floor((e-l)/a/10)*a*10;let u=Math.floor((c-h)/Math.pow(10,o)),d=uc(t.min,Math.round((l+h+u*Math.pow(10,o))*s)/s);for(;d<i;)n.push({value:d,major:ug(d),significand:u}),u>=10?u=u<15?15:20:u++,u>=20&&(o++,u=2,s=o>=0?1:s),d=Math.round((l+h+u*Math.pow(10,o))*s)/s;const f=uc(t.max,d);return n.push({value:f,major:ug(f),significand:u}),n}({min:this._userMin,max:this._userMax},this);return"ticks"===t.bounds&&Bc(e,this,"value"),t.reverse?(e.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),e}getLabelForValue(t){return void 0===t?"0":_h(t,this.chart.options.locale,this.options.ticks.format)}configure(){const t=this.min;super.configure(),this._startValue=Nc(t),this._valueRange=Nc(this.max)-Nc(t)}getPixelForValue(t){return void 0!==t&&0!==t||(t=this.min),null===t||isNaN(t)?NaN:this.getPixelForDecimal(t===this.min?0:(Nc(t)-this._startValue)/this._valueRange)}getValueForPixel(t){const e=this.getDecimalForPixel(t);return Math.pow(10,this._startValue+e*this._valueRange)}}function pg(t){const e=t.ticks;if(e.display&&t.display){const t=Qh(e.backdropPadding);return dc(e.font&&e.font.size,Ph.font.size)+t.height}return 0}function gg(t,e,i,n,r){return t===n||t===r?{start:e-i/2,end:e+i/2}:t<n||t>r?{start:e-i,end:e}:{start:e,end:e+i}}function mg(t,e,i,n,r){const o=Math.abs(Math.sin(i)),s=Math.abs(Math.cos(i));let a=0,l=0;n.start<e.l?(a=(e.l-n.start)/o,t.l=Math.min(t.l,e.l-a)):n.end>e.r&&(a=(n.end-e.r)/o,t.r=Math.max(t.r,e.r+a)),r.start<e.t?(l=(e.t-r.start)/s,t.t=Math.min(t.t,e.t-l)):r.end>e.b&&(l=(r.end-e.b)/s,t.b=Math.max(t.b,e.b+l))}function yg(t,e,i){const n=t.drawingArea,{extra:r,additionalAngle:o,padding:s,size:a}=i,l=t.getPointPosition(e,n+r+s,o),c=Math.round($c(qc(l.angle+Rc))),h=function(t,e,i){return 90===i||270===i?t-=e/2:(i>270||i<90)&&(t-=e),t}(l.y,a.h,c),u=function(t){return 0===t||180===t?"center":t<180?"left":"right"}(c),d=(f=l.x,p=a.w,"right"===(g=u)?f-=p:"center"===g&&(f-=p/2),f);var f,p,g;return{visible:!0,x:l.x,y:h,textAlign:u,left:d,top:h,right:d+a.w,bottom:h+a.h}}function bg(t,e){if(!e)return!0;const{left:i,top:n,right:r,bottom:o}=t;return!(zh({x:i,y:n},e)||zh({x:i,y:o},e)||zh({x:r,y:n},e)||zh({x:r,y:o},e))}function vg(t,e,i){const{left:n,top:r,right:o,bottom:s}=i,{backdropColor:a}=e;if(!ac(a)){const i=Kh(e.borderRadius),l=Qh(e.backdropPadding);t.fillStyle=a;const c=n-l.left,h=r-l.top,u=o-n+l.width,d=s-r+l.height;Object.values(i).some((t=>0!==t))?(t.beginPath(),$h(t,{x:c,y:h,w:u,h:d,radius:i}),t.fill()):t.fillRect(c,h,u,d)}}function xg(t,e,i,n){const{ctx:r}=t;if(i)r.arc(t.xCenter,t.yCenter,e,0,Tc);else{let i=t.getPointPosition(0,e);r.moveTo(i.x,i.y);for(let o=1;o<n;o++)i=t.getPointPosition(o,e),r.lineTo(i.x,i.y)}}class _g extends ag{static id="radialLinear";static defaults={display:!0,animate:!0,position:"chartArea",angleLines:{display:!0,lineWidth:1,borderDash:[],borderDashOffset:0},grid:{circular:!1},startAngle:0,ticks:{showLabelBackdrop:!0,callback:Mh.formatters.numeric},pointLabels:{backdropColor:void 0,backdropPadding:2,display:!0,font:{size:10},callback:t=>t,padding:5,centerPointLabels:!1}};static defaultRoutes={"angleLines.color":"borderColor","pointLabels.color":"color","ticks.color":"color"};static descriptors={angleLines:{_fallback:"grid"}};constructor(t){super(t),this.xCenter=void 0,this.yCenter=void 0,this.drawingArea=void 0,this._pointLabels=[],this._pointLabelItems=[]}setDimensions(){const t=this._padding=Qh(pg(this.options)/2),e=this.width=this.maxWidth-t.width,i=this.height=this.maxHeight-t.height;this.xCenter=Math.floor(this.left+e/2+t.left),this.yCenter=Math.floor(this.top+i/2+t.top),this.drawingArea=Math.floor(Math.min(e,i)/2)}determineDataLimits(){const{min:t,max:e}=this.getMinMax(!1);this.min=hc(t)&&!isNaN(t)?t:0,this.max=hc(e)&&!isNaN(e)?e:0,this.handleTickRangeOptions()}computeTickLimit(){return Math.ceil(this.drawingArea/pg(this.options))}generateTickLabels(t){ag.prototype.generateTickLabels.call(this,t),this._pointLabels=this.getLabels().map(((t,e)=>{const i=pc(this.options.pointLabels.callback,[t,e],this);return i||0===i?i:""})).filter(((t,e)=>this.chart.getDataVisibility(e)))}fit(){const t=this.options;t.display&&t.pointLabels.display?function(t){const e={l:t.left+t._padding.left,r:t.right-t._padding.right,t:t.top+t._padding.top,b:t.bottom-t._padding.bottom},i=Object.assign({},e),n=[],r=[],o=t._pointLabels.length,s=t.options.pointLabels,a=s.centerPointLabels?Pc/o:0;for(let u=0;u<o;u++){const o=s.setContext(t.getPointLabelContext(u));r[u]=o.padding;const d=t.getPointPosition(u,t.drawingArea+r[u],a),f=Jh(o.font),p=(l=t.ctx,c=f,h=lc(h=t._pointLabels[u])?h:[h],{w:Ch(l,c.string,h),h:h.length*c.lineHeight});n[u]=p;const g=qc(t.getIndexAngle(u)+a),m=Math.round($c(g));mg(i,e,g,gg(m,d.x,p.w,0,180),gg(m,d.y,p.h,90,270))}var l,c,h;t.setCenterPoint(e.l-i.l,i.r-e.r,e.t-i.t,i.b-e.b),t._pointLabelItems=function(t,e,i){const n=[],r=t._pointLabels.length,o=t.options,{centerPointLabels:s,display:a}=o.pointLabels,l={extra:pg(o)/2,additionalAngle:s?Pc/r:0};let c;for(let o=0;o<r;o++){l.padding=i[o],l.size=e[o];const r=yg(t,o,l);n.push(r),"auto"===a&&(r.visible=bg(r,c),r.visible&&(c=r))}return n}(t,n,r)}(this):this.setCenterPoint(0,0,0,0)}setCenterPoint(t,e,i,n){this.xCenter+=Math.floor((t-e)/2),this.yCenter+=Math.floor((i-n)/2),this.drawingArea-=Math.min(this.drawingArea/2,Math.max(t,e,i,n))}getIndexAngle(t){return qc(t*(Tc/(this._pointLabels.length||1))+Wc(this.options.startAngle||0))}getDistanceFromCenterForValue(t){if(ac(t))return NaN;const e=this.drawingArea/(this.max-this.min);return this.options.reverse?(this.max-t)*e:(t-this.min)*e}getValueForDistanceFromCenter(t){if(ac(t))return NaN;const e=t/(this.drawingArea/(this.max-this.min));return this.options.reverse?this.max-e:this.min+e}getPointLabelContext(t){const e=this._pointLabels||[];if(t>=0&&t<e.length){const i=e[t];return function(t,e,i){return eu(t,{label:i,index:e,type:"pointLabel"})}(this.getContext(),t,i)}}getPointPosition(t,e,i=0){const n=this.getIndexAngle(t)-Rc+i;return{x:Math.cos(n)*e+this.xCenter,y:Math.sin(n)*e+this.yCenter,angle:n}}getPointPositionForValue(t,e){return this.getPointPosition(t,this.getDistanceFromCenterForValue(e))}getBasePosition(t){return this.getPointPositionForValue(t||0,this.getBaseValue())}getPointLabelPosition(t){const{left:e,top:i,right:n,bottom:r}=this._pointLabelItems[t];return{left:e,top:i,right:n,bottom:r}}drawBackground(){const{backgroundColor:t,grid:{circular:e}}=this.options;if(t){const i=this.ctx;i.save(),i.beginPath(),xg(this,this.getDistanceFromCenterForValue(this._endValue),e,this._pointLabels.length),i.closePath(),i.fillStyle=t,i.fill(),i.restore()}}drawGrid(){const t=this.ctx,e=this.options,{angleLines:i,grid:n,border:r}=e,o=this._pointLabels.length;let s,a,l;if(e.pointLabels.display&&function(t,e){const{ctx:i,options:{pointLabels:n}}=t;for(let r=e-1;r>=0;r--){const e=t._pointLabelItems[r];if(!e.visible)continue;const o=n.setContext(t.getPointLabelContext(r));vg(i,o,e);const s=Jh(o.font),{x:a,y:l,textAlign:c}=e;Wh(i,t._pointLabels[r],a,l+s.lineHeight/2,s,{color:o.color,textAlign:c,textBaseline:"middle"})}}(this,o),n.display&&this.ticks.forEach(((t,e)=>{if(0!==e){a=this.getDistanceFromCenterForValue(t.value);const i=this.getContext(e),s=n.setContext(i),l=r.setContext(i);!function(t,e,i,n,r){const o=t.ctx,s=e.circular,{color:a,lineWidth:l}=e;!s&&!n||!a||!l||i<0||(o.save(),o.strokeStyle=a,o.lineWidth=l,o.setLineDash(r.dash),o.lineDashOffset=r.dashOffset,o.beginPath(),xg(t,i,s,n),o.closePath(),o.stroke(),o.restore())}(this,s,a,o,l)}})),i.display){for(t.save(),s=o-1;s>=0;s--){const n=i.setContext(this.getPointLabelContext(s)),{color:r,lineWidth:o}=n;o&&r&&(t.lineWidth=o,t.strokeStyle=r,t.setLineDash(n.borderDash),t.lineDashOffset=n.borderDashOffset,a=this.getDistanceFromCenterForValue(e.ticks.reverse?this.min:this.max),l=this.getPointPosition(s,a),t.beginPath(),t.moveTo(this.xCenter,this.yCenter),t.lineTo(l.x,l.y),t.stroke())}t.restore()}}drawBorder(){}drawLabels(){const t=this.ctx,e=this.options,i=e.ticks;if(!i.display)return;const n=this.getIndexAngle(0);let r,o;t.save(),t.translate(this.xCenter,this.yCenter),t.rotate(n),t.textAlign="center",t.textBaseline="middle",this.ticks.forEach(((n,s)=>{if(0===s&&!e.reverse)return;const a=i.setContext(this.getContext(s)),l=Jh(a.font);if(r=this.getDistanceFromCenterForValue(this.ticks[s].value),a.showLabelBackdrop){t.font=l.string,o=t.measureText(n.label).width,t.fillStyle=a.backdropColor;const e=Qh(a.backdropPadding);t.fillRect(-o/2-e.left,-r-l.size/2-e.top,o+e.width,l.size+e.height)}Wh(t,n.label,0,-r,l,{color:a.color,strokeColor:a.textStrokeColor,strokeWidth:a.textStrokeWidth})})),t.restore()}drawTitle(){}}const wg={millisecond:{common:!0,size:1,steps:1e3},second:{common:!0,size:1e3,steps:60},minute:{common:!0,size:6e4,steps:60},hour:{common:!0,size:36e5,steps:24},day:{common:!0,size:864e5,steps:30},week:{common:!1,size:6048e5,steps:4},month:{common:!0,size:2628e6,steps:12},quarter:{common:!1,size:7884e6,steps:4},year:{common:!0,size:3154e7}},Mg=Object.keys(wg);function kg(t,e){return t-e}function Sg(t,e){if(ac(e))return null;const i=t._adapter,{parser:n,round:r,isoWeekday:o}=t._parseOpts;let s=e;return"function"==typeof n&&(s=n(s)),hc(s)||(s="string"==typeof n?i.parse(s,n):i.parse(s)),null===s?null:(r&&(s="week"!==r||!Fc(o)&&!0!==o?i.startOf(s,r):i.startOf(s,"isoWeek",o)),+s)}function Og(t,e,i,n){const r=Mg.length;for(let o=Mg.indexOf(t);o<r-1;++o){const t=wg[Mg[o]],r=t.steps?t.steps:Number.MAX_SAFE_INTEGER;if(t.common&&Math.ceil((i-e)/(r*t.size))<=n)return Mg[o]}return Mg[r-1]}function Dg(t,e,i){if(i){if(i.length){const{lo:n,hi:r}=Jc(i,e);t[i[n]>=e?i[n]:i[r]]=!0}}else t[e]=!0}function Eg(t,e,i){const n=[],r={},o=e.length;let s,a;for(s=0;s<o;++s)a=e[s],r[a]=s,n.push({value:a,major:!1});return 0!==o&&i?function(t,e,i,n){const r=t._adapter,o=+r.startOf(e[0].value,n),s=e[e.length-1].value;let a,l;for(a=o;a<=s;a=+r.add(a,1,n))l=i[a],l>=0&&(e[l].major=!0);return e}(t,n,r,i):n}class Pg extends gf{static id="time";static defaults={bounds:"data",adapters:{},time:{parser:!1,unit:!1,round:!1,isoWeekday:!1,minUnit:"millisecond",displayFormats:{}},ticks:{source:"auto",callback:!1,major:{enabled:!1}}};constructor(t){super(t),this._cache={data:[],labels:[],all:[]},this._unit="day",this._majorUnit=void 0,this._offsets={},this._normalized=!1,this._parseOpts=void 0}init(t,e={}){const i=t.time||(t.time={}),n=this._adapter=new Md(t.adapters.date);n.init(e),_c(i.displayFormats,n.formats()),this._parseOpts={parser:i.parser,round:i.round,isoWeekday:i.isoWeekday},super.init(t),this._normalized=e.normalized}parse(t,e){return void 0===t?null:Sg(this,t)}beforeLayout(){super.beforeLayout(),this._cache={data:[],labels:[],all:[]}}determineDataLimits(){const t=this.options,e=this._adapter,i=t.time.unit||"day";let{min:n,max:r,minDefined:o,maxDefined:s}=this.getUserBounds();function a(t){o||isNaN(t.min)||(n=Math.min(n,t.min)),s||isNaN(t.max)||(r=Math.max(r,t.max))}o&&s||(a(this._getLabelBounds()),"ticks"===t.bounds&&"labels"===t.ticks.source||a(this.getMinMax(!1))),n=hc(n)&&!isNaN(n)?n:+e.startOf(Date.now(),i),r=hc(r)&&!isNaN(r)?r:+e.endOf(Date.now(),i)+1,this.min=Math.min(n,r-1),this.max=Math.max(n+1,r)}_getLabelBounds(){const t=this.getLabelTimestamps();let e=Number.POSITIVE_INFINITY,i=Number.NEGATIVE_INFINITY;return t.length&&(e=t[0],i=t[t.length-1]),{min:e,max:i}}buildTicks(){const t=this.options,e=t.time,i=t.ticks,n="labels"===i.source?this.getLabelTimestamps():this._generate();"ticks"===t.bounds&&n.length&&(this.min=this._userMin||n[0],this.max=this._userMax||n[n.length-1]);const r=this.min,o=function(t,e,i){let n=0,r=t.length;for(;n<r&&t[n]<e;)n++;for(;r>n&&t[r-1]>i;)r--;return n>0||r<t.length?t.slice(n,r):t}(n,r,this.max);return this._unit=e.unit||(i.autoSkip?Og(e.minUnit,this.min,this.max,this._getLabelCapacity(r)):function(t,e,i,n,r){for(let o=Mg.length-1;o>=Mg.indexOf(i);o--){const i=Mg[o];if(wg[i].common&&t._adapter.diff(r,n,i)>=e-1)return i}return Mg[i?Mg.indexOf(i):0]}(this,o.length,e.minUnit,this.min,this.max)),this._majorUnit=i.major.enabled&&"year"!==this._unit?function(t){for(let e=Mg.indexOf(t)+1,i=Mg.length;e<i;++e)if(wg[Mg[e]].common)return Mg[e]}(this._unit):void 0,this.initOffsets(n),t.reverse&&o.reverse(),Eg(this,o,this._majorUnit)}afterAutoSkip(){this.options.offsetAfterAutoskip&&this.initOffsets(this.ticks.map((t=>+t.value)))}initOffsets(t=[]){let e,i,n=0,r=0;this.options.offset&&t.length&&(e=this.getDecimalForValue(t[0]),n=1===t.length?1-e:(this.getDecimalForValue(t[1])-e)/2,i=this.getDecimalForValue(t[t.length-1]),r=1===t.length?i:(i-this.getDecimalForValue(t[t.length-2]))/2);const o=t.length<3?.5:.25;n=Kc(n,0,o),r=Kc(r,0,o),this._offsets={start:n,end:r,factor:1/(n+1+r)}}_generate(){const t=this._adapter,e=this.min,i=this.max,n=this.options,r=n.time,o=r.unit||Og(r.minUnit,e,i,this._getLabelCapacity(e)),s=dc(n.ticks.stepSize,1),a="week"===o&&r.isoWeekday,l=Fc(a)||!0===a,c={};let h,u,d=e;if(l&&(d=+t.startOf(d,"isoWeek",a)),d=+t.startOf(d,l?"day":o),t.diff(i,e,o)>1e5*s)throw new Error(e+" and "+i+" are too far apart with stepSize of "+s+" "+o);const f="data"===n.ticks.source&&this.getDataTimestamps();for(h=d,u=0;h<i;h=+t.add(h,s,o),u++)Dg(c,h,f);return h!==i&&"ticks"!==n.bounds&&1!==u||Dg(c,h,f),Object.keys(c).sort(kg).map((t=>+t))}getLabelForValue(t){const e=this._adapter,i=this.options.time;return i.tooltipFormat?e.format(t,i.tooltipFormat):e.format(t,i.displayFormats.datetime)}format(t,e){const i=this.options.time.displayFormats,n=this._unit,r=e||i[n];return this._adapter.format(t,r)}_tickFormatFunction(t,e,i,n){const r=this.options,o=r.ticks.callback;if(o)return pc(o,[t,e,i],this);const s=r.time.displayFormats,a=this._unit,l=this._majorUnit,c=a&&s[a],h=l&&s[l],u=i[e],d=l&&h&&u&&u.major;return this._adapter.format(t,n||(d?h:c))}generateTickLabels(t){let e,i,n;for(e=0,i=t.length;e<i;++e)n=t[e],n.label=this._tickFormatFunction(n.value,e,t)}getDecimalForValue(t){return null===t?NaN:(t-this.min)/(this.max-this.min)}getPixelForValue(t){const e=this._offsets,i=this.getDecimalForValue(t);return this.getPixelForDecimal((e.start+i)*e.factor)}getValueForPixel(t){const e=this._offsets,i=this.getDecimalForPixel(t)/e.factor-e.end;return this.min+i*(this.max-this.min)}_getLabelSize(t){const e=this.options.ticks,i=this.ctx.measureText(t).width,n=Wc(this.isHorizontal()?e.maxRotation:e.minRotation),r=Math.cos(n),o=Math.sin(n),s=this._resolveTickFontOptions(0).size;return{w:i*r+s*o,h:i*o+s*r}}_getLabelCapacity(t){const e=this.options.time,i=e.displayFormats,n=i[e.unit]||i.millisecond,r=this._tickFormatFunction(t,0,Eg(this,[t],this._majorUnit),n),o=this._getLabelSize(r),s=Math.floor(this.isHorizontal()?this.width/o.w:this.height/o.h)-1;return s>0?s:1}getDataTimestamps(){let t,e,i=this._cache.data||[];if(i.length)return i;const n=this.getMatchingVisibleMetas();if(this._normalized&&n.length)return this._cache.data=n[0].controller.getAllParsedValues(this);for(t=0,e=n.length;t<e;++t)i=i.concat(n[t].controller.getAllParsedValues(this));return this._cache.data=this.normalize(i)}getLabelTimestamps(){const t=this._cache.labels||[];let e,i;if(t.length)return t;const n=this.getLabels();for(e=0,i=n.length;e<i;++e)t.push(Sg(this,n[e]));return this._cache.labels=this._normalized?t:this.normalize(t)}normalize(t){return rh(t.sort(kg))}}function Tg(t,e,i){let n,r,o,s,a=0,l=t.length-1;i?(e>=t[a].pos&&e<=t[l].pos&&({lo:a,hi:l}=th(t,"pos",e)),({pos:n,time:o}=t[a]),({pos:r,time:s}=t[l])):(e>=t[a].time&&e<=t[l].time&&({lo:a,hi:l}=th(t,"time",e)),({time:n,pos:o}=t[a]),({time:r,pos:s}=t[l]));const c=r-n;return c?o+(s-o)*(e-n)/c:o}var Cg=Object.freeze({__proto__:null,CategoryScale:class extends gf{static id="category";static defaults={ticks:{callback:og}};constructor(t){super(t),this._startValue=void 0,this._valueRange=0,this._addedLabels=[]}init(t){const e=this._addedLabels;if(e.length){const t=this.getLabels();for(const{index:i,label:n}of e)t[i]===n&&t.splice(i,1);this._addedLabels=[]}super.init(t)}parse(t,e){if(ac(t))return null;const i=this.getLabels();return((t,e)=>null===t?null:Kc(Math.round(t),0,e))(e=isFinite(e)&&i[e]===t?e:function(t,e,i,n){const r=t.indexOf(e);return-1===r?((t,e,i,n)=>("string"==typeof e?(i=t.push(e)-1,n.unshift({index:i,label:e})):isNaN(e)&&(i=null),i))(t,e,i,n):r!==t.lastIndexOf(e)?i:r}(i,t,dc(e,t),this._addedLabels),i.length-1)}determineDataLimits(){const{minDefined:t,maxDefined:e}=this.getUserBounds();let{min:i,max:n}=this.getMinMax(!0);"ticks"===this.options.bounds&&(t||(i=0),e||(n=this.getLabels().length-1)),this.min=i,this.max=n}buildTicks(){const t=this.min,e=this.max,i=this.options.offset,n=[];let r=this.getLabels();r=0===t&&e===r.length-1?r:r.slice(t,e+1),this._valueRange=Math.max(r.length-(i?0:1),1),this._startValue=this.min-(i?.5:0);for(let i=t;i<=e;i++)n.push({value:i});return n}getLabelForValue(t){return og.call(this,t)}configure(){super.configure(),this.isHorizontal()||(this._reversePixels=!this._reversePixels)}getPixelForValue(t){return"number"!=typeof t&&(t=this.parse(t)),null===t?NaN:this.getPixelForDecimal((t-this._startValue)/this._valueRange)}getPixelForTick(t){const e=this.ticks;return t<0||t>e.length-1?null:this.getPixelForValue(e[t].value)}getValueForPixel(t){return Math.round(this._startValue+this.getDecimalForPixel(t)*this._valueRange)}getBasePixel(){return this.bottom}},LinearScale:lg,LogarithmicScale:fg,RadialLinearScale:_g,TimeScale:Pg,TimeSeriesScale:class extends Pg{static id="timeseries";static defaults=Pg.defaults;constructor(t){super(t),this._table=[],this._minPos=void 0,this._tableRange=void 0}initOffsets(){const t=this._getTimestampsForTable(),e=this._table=this.buildLookupTable(t);this._minPos=Tg(e,this.min),this._tableRange=Tg(e,this.max)-this._minPos,super.initOffsets(t)}buildLookupTable(t){const{min:e,max:i}=this,n=[],r=[];let o,s,a,l,c;for(o=0,s=t.length;o<s;++o)l=t[o],l>=e&&l<=i&&n.push(l);if(n.length<2)return[{time:e,pos:0},{time:i,pos:1}];for(o=0,s=n.length;o<s;++o)c=n[o+1],a=n[o-1],l=n[o],Math.round((c+a)/2)!==l&&r.push({time:l,pos:o/(s-1)});return r}_generate(){const t=this.min,e=this.max;let i=super.getDataTimestamps();return i.includes(t)&&i.length||i.splice(0,0,t),i.includes(e)&&1!==i.length||i.push(e),i.sort(((t,e)=>t-e))}_getTimestampsForTable(){let t=this._cache.all||[];if(t.length)return t;const e=this.getDataTimestamps(),i=this.getLabelTimestamps();return t=e.length&&i.length?this.normalize(e.concat(i)):e.length?e:i,t=this._cache.all=t,t}getDecimalForValue(t){return(Tg(this._table,t)-this._minPos)/this._tableRange}getValueForPixel(t){const e=this._offsets,i=this.getDecimalForPixel(t)/e.factor-e.end;return Tg(this._table,i*this._tableRange+this._minPos,!0)}}});const Ag=[xd,cp,rg,Cg];Vf.register(...Ag);const jg=Vf,Rg={randomUUID:"undefined"!=typeof crypto&&crypto.randomUUID&&crypto.randomUUID.bind(crypto)};let Lg;const zg=new Uint8Array(16);function Ng(){if(!Lg&&(Lg="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto),!Lg))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return Lg(zg)}const Ig=[];for(let t=0;t<256;++t)Ig.push((t+256).toString(16).slice(1));const Hg=function(t,e,i){if(Rg.randomUUID&&!e&&!t)return Rg.randomUUID();const n=(t=t||{}).random||(t.rng||Ng)();if(n[6]=15&n[6]|64,n[8]=63&n[8]|128,e){i=i||0;for(let t=0;t<16;++t)e[i+t]=n[t];return e}return function(t,e=0){return Ig[t[e+0]]+Ig[t[e+1]]+Ig[t[e+2]]+Ig[t[e+3]]+"-"+Ig[t[e+4]]+Ig[t[e+5]]+"-"+Ig[t[e+6]]+Ig[t[e+7]]+"-"+Ig[t[e+8]]+Ig[t[e+9]]+"-"+Ig[t[e+10]]+Ig[t[e+11]]+Ig[t[e+12]]+Ig[t[e+13]]+Ig[t[e+14]]+Ig[t[e+15]]}(n)};function Ug(t){return Ug="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Ug(t)}function Fg(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,(void 0,r=function(t,e){if("object"!==Ug(t)||null===t)return t;var i=t[Symbol.toPrimitive];if(void 0!==i){var n=i.call(t,"string");if("object"!==Ug(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(n.key),"symbol"===Ug(r)?r:String(r)),n)}var r}var Bg=function(){function t(e,i,n){var r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"bar";!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.title=e,this.description=i,this.data=n,this.options=r,this.type=o,this.dataIsValid=Array.isArray(n)?n.length>0:!!n}var e,i;return e=t,(i=[{key:"plot",value:function(t,e,i){var n=this;i.style="background-color: #f5f5f5; padding: 5px;";var r=document.createElement("div");if(r.className="chart-title grid-title",r.innerHTML=this.title,r.style="margin-bottom: 5px",this.description){var o=document.createElement("div");o.className="question-mark-legacy",o.innerHTML="?";var s=Date.now();o.id="id-".concat(s),r.appendChild(o),setTimeout((function(){var t=document.getElementById("id-".concat(s));t&&t.addEventListener("click",(function(t){n.options.onShowDesc(n.description)}))}))}i.appendChild(r);var a=document.createElement("div");return a.className="card",i.appendChild(a),this.canvas=document.createElement("canvas"),this.canvas.id=Hg(),a.appendChild(this.canvas),this.canvas.style.backgroundColor="#fff",this.chart=new jg(this.canvas.id,{type:this.type,data:this.data,options:this.options.chartjs_options}),null}}])&&Fg(e.prototype,i),Object.defineProperty(e,"prototype",{writable:!1}),t}();function Wg(t){return Wg="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Wg(t)}function $g(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,n=new Array(e);i<e;i++)n[i]=t[i];return n}function Vg(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,(void 0,r=function(t,e){if("object"!==Wg(t)||null===t)return t;var i=t[Symbol.toPrimitive];if(void 0!==i){var n=i.call(t,"string");if("object"!==Wg(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(n.key),"symbol"===Wg(r)?r:String(r)),n)}var r}function Yg(t,e){return Yg=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},Yg(t,e)}function Gg(t){return Gg=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},Gg(t)}var Xg=function(t){!function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&Yg(t,e)}(s,t);var e,i,n,r,o=(n=s,r=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}}(),function(){var t,e=Gg(n);if(r){var i=Gg(this).constructor;t=Reflect.construct(e,arguments,i)}else t=e.apply(this,arguments);return function(t,e){if(e&&("object"===Wg(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t)}(this,t)});function s(t,e,i,n){var r;return function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,s),n.transform&&(i=(null!==(r=i)&&void 0!==r?r:[]).map(n.transform)),o.call(this,t,e,i,n)}return e=s,i=[{key:"plot",value:function(t,e,i){this.marginRight=40,this.marginBottom=40;var n,r,o=(n=this.clearAndScaleSvg(t,e,20,20),r=2,function(t){if(Array.isArray(t))return t}(n)||function(t,e){var i=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=i){var n,r,o,s,a=[],l=!0,c=!1;try{if(o=(i=i.call(t)).next,0===e){if(Object(i)!==i)return;l=!1}else for(;!(l=(n=o.call(i)).done)&&(a.push(n.value),a.length!==e);l=!0);}catch(t){c=!0,r=t}finally{try{if(!l&&null!=i.return&&(s=i.return(),Object(s)!==s))return}finally{if(c)throw r}}return a}}(n,r)||function(t,e){if(t){if("string"==typeof t)return $g(t,e);var i=Object.prototype.toString.call(t).slice(8,-1);return"Object"===i&&t.constructor&&(i=t.constructor.name),"Map"===i||"Set"===i?Array.from(t):"Arguments"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?$g(t,e):void 0}}(n,r)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),s=o[0],a=o[1];if(this.drawTitle(),!this.dataIsValid)return this.showErrorMessage(t,e),this.wrapper.innerHTML;var l=z(this.data,(function(t){return t.group})),c=z(this.data,(function(t){return t.variable})),h=kn().range([0,s]).padding(.1),u=kn().range([a,0]).padding(.1);h.domain(l),u.domain(c),this.options.showLegend&&(this.g.append("g").style("font-size",15).attr("transform","translate(0,"+a+")").call(et(h).tickSize(0)).select(".domain").remove(),this.g.append("g").style("font-size",15).call(it(u).tickSize(0)).select(".domain").remove());var d=R(this.data,(function(t){return t.value})),f=Ts().interpolator(Ls).domain([0,d]);return this.g.selectAll().data(this.data,(function(t){return t.group+":"+t.variable})).enter().append("rect").attr("x",(function(t){return h(t.group)})).attr("y",(function(t){return u(t.variable)})).attr("rx",4).attr("ry",4).attr("width",h.bandwidth()).attr("height",u.bandwidth()).style("fill",(function(t){return f(t.value)})).style("stroke-width",4).style("stroke","none").style("opacity",.8),this.wrapper.innerHTML}}],i&&Vg(e.prototype,i),Object.defineProperty(e,"prototype",{writable:!1}),s}(Ea);function qg(t){return qg="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},qg(t)}function Zg(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,(void 0,r=function(t,e){if("object"!==qg(t)||null===t)return t;var i=t[Symbol.toPrimitive];if(void 0!==i){var n=i.call(t,"string");if("object"!==qg(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(n.key),"symbol"===qg(r)?r:String(r)),n)}var r}var Kg=function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t)}var e,i;return e=t,(i=[{key:"plot",value:function(t,e,i){}}])&&Zg(e.prototype,i),Object.defineProperty(e,"prototype",{writable:!1}),t}();function Qg(t){return Qg="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Qg(t)}function Jg(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,(void 0,r=function(t,e){if("object"!==Qg(t)||null===t)return t;var i=t[Symbol.toPrimitive];if(void 0!==i){var n=i.call(t,"string");if("object"!==Qg(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(n.key),"symbol"===Qg(r)?r:String(r)),n)}var r}function tm(t,e){return tm=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},tm(t,e)}function em(t){return em=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},em(t)}var im=function(t){!function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&tm(t,e)}(s,t);var e,i,n,r,o=(n=s,r=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}}(),function(){var t,e=em(n);if(r){var i=em(this).constructor;t=Reflect.construct(e,arguments,i)}else t=e.apply(this,arguments);return function(t,e){if(e&&("object"===Qg(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t)}(this,t)});function s(t){var e,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,s),(e=o.call(this,i)).text=t,e}return e=s,(i=[{key:"plot",value:function(t,e,i){var n=document.createElement("div");n.innerHTML=this.text,i.appendChild(n)}}])&&Jg(e.prototype,i),Object.defineProperty(e,"prototype",{writable:!1}),s}(Kg);function nm(t){return nm="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},nm(t)}function rm(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,(void 0,r=function(t,e){if("object"!==nm(t)||null===t)return t;var i=t[Symbol.toPrimitive];if(void 0!==i){var n=i.call(t,"string");if("object"!==nm(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(n.key),"symbol"===nm(r)?r:String(r)),n)}var r}function om(t,e){return om=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},om(t,e)}function sm(t){return sm=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},sm(t)}var am=function(t){!function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&om(t,e)}(s,t);var e,i,n,r,o=(n=s,r=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}}(),function(){var t,e=sm(n);if(r){var i=sm(this).constructor;t=Reflect.construct(e,arguments,i)}else t=e.apply(this,arguments);return function(t,e){if(e&&("object"===nm(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t)}(this,t)});function s(t){var e,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,s),(e=o.call(this,i)).text=t,e}return e=s,(i=[{key:"plot",value:function(t,e,i){var n=document.createElement("textarea");n.placeholder=this.text,n.rows=e/24,n.height=e,n.className="form-control",i.appendChild(n)}}])&&rm(e.prototype,i),Object.defineProperty(e,"prototype",{writable:!1}),s}(Kg);function lm(t){return lm="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},lm(t)}function cm(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,n=new Array(e);i<e;i++)n[i]=t[i];return n}function hm(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,(void 0,r=function(t,e){if("object"!==lm(t)||null===t)return t;var i=t[Symbol.toPrimitive];if(void 0!==i){var n=i.call(t,"string");if("object"!==lm(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(n.key),"symbol"===lm(r)?r:String(r)),n)}var r}function um(t,e){return um=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},um(t,e)}function dm(t){return dm=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},dm(t)}var fm=function(t){!function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&um(t,e)}(s,t);var e,i,n,r,o=(n=s,r=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}}(),function(){var t,e=dm(n);if(r){var i=dm(this).constructor;t=Reflect.construct(e,arguments,i)}else t=e.apply(this,arguments);return function(t,e){if(e&&("object"===lm(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t)}(this,t)});function s(t,e,i,n){var r;return function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,s),n.transform&&(i=(null!==(r=i)&&void 0!==r?r:[]).map(n.transform)),o.call(this,t,e,i,n)}return e=s,(i=[{key:"plot",value:function(t,e,i){this.marginRight=50,this.marginBottom=50;var n,r,o=(n=this.clearAndScaleSvg(t,e,20,40),r=2,function(t){if(Array.isArray(t))return t}(n)||function(t,e){var i=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=i){var n,r,o,s,a=[],l=!0,c=!1;try{if(o=(i=i.call(t)).next,0===e){if(Object(i)!==i)return;l=!1}else for(;!(l=(n=o.call(i)).done)&&(a.push(n.value),a.length!==e);l=!0);}catch(t){c=!0,r=t}finally{try{if(!l&&null!=i.return&&(s=i.return(),Object(s)!==s))return}finally{if(c)throw r}}return a}}(n,r)||function(t,e){if(t){if("string"==typeof t)return cm(t,e);var i=Object.prototype.toString.call(t).slice(8,-1);return"Object"===i&&t.constructor&&(i=t.constructor.name),"Map"===i||"Set"===i?Array.from(t):"Arguments"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?cm(t,e):void 0}}(n,r)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),s=o[0],a=o[1];if(this.drawTitle(),!this.dataIsValid)return this.showErrorMessage(t,e),this.wrapper.innerHTML;var l="color"in this.options?this.options.color:"#001122",c="highlight_color"in this.options?this.options.highlight_color:"#00AA44",h="xmax"in this.options?this.options.xmax:R(this.data,(function(t){return t.column1})),u="ymax"in this.options?this.options.ymax:R(this.data,(function(t){return t.column2})),d=fr().range([0,s]),f=fr().range([0,a]);return d.domain([0,h]),f.domain([0,u]),(!("showAxes"in this.options)||this.options.showAxes)&&(this.appendXAxis(d,a),this.appendXAxisLabel(s,a),this.appendYAxisLabel(),this.g.append("g").attr("transform","translate(0, 0)").call(it(f))),this.g.append("g").selectAll("dot").data(this.data).enter().append("circle").attr("cx",(function(t){return d(t.column1)})).attr("cy",(function(t){return f(t.column2)})).attr("r",2.5).style("fill",(function(t){return"highlight"in t&&t.highlight?c:l})),this.wrapper.innerHTML}}])&&hm(e.prototype,i),Object.defineProperty(e,"prototype",{writable:!1}),s}(Ea);function pm(t){return pm="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},pm(t)}function gm(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,n=new Array(e);i<e;i++)n[i]=t[i];return n}function mm(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,(void 0,r=function(t,e){if("object"!==pm(t)||null===t)return t;var i=t[Symbol.toPrimitive];if(void 0!==i){var n=i.call(t,"string");if("object"!==pm(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(n.key),"symbol"===pm(r)?r:String(r)),n)}var r}function ym(t,e){return ym=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},ym(t,e)}function bm(t){return bm=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},bm(t)}var vm=function(t){!function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&ym(t,e)}(s,t);var e,i,n,r,o=(n=s,r=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}}(),function(){var t,e=bm(n);if(r){var i=bm(this).constructor;t=Reflect.construct(e,arguments,i)}else t=e.apply(this,arguments);return function(t,e){if(e&&("object"===pm(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t)}(this,t)});function s(t,e,i,n){var r,a;return function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,s),n.transform&&(i=(null!==(r=i)&&void 0!==r?r:[]).map(n.transform)),(a=o.call(this,t,e,i,n)).marginRight=10,a.marginBottom=20,a}return e=s,i=[{key:"plot",value:function(t,e,i){var n,r,o=(n=this.clearAndScaleSvg(t,e,5,10),r=2,function(t){if(Array.isArray(t))return t}(n)||function(t,e){var i=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=i){var n,r,o,s,a=[],l=!0,c=!1;try{if(o=(i=i.call(t)).next,0===e){if(Object(i)!==i)return;l=!1}else for(;!(l=(n=o.call(i)).done)&&(a.push(n.value),a.length!==e);l=!0);}catch(t){c=!0,r=t}finally{try{if(!l&&null!=i.return&&(s=i.return(),Object(s)!==s))return}finally{if(c)throw r}}return a}}(n,r)||function(t,e){if(t){if("string"==typeof t)return gm(t,e);var i=Object.prototype.toString.call(t).slice(8,-1);return"Object"===i&&t.constructor&&(i=t.constructor.name),"Map"===i||"Set"===i?Array.from(t):"Arguments"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?gm(t,e):void 0}}(n,r)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),s=o[0],a=o[1];this.drawTitle();var l=fr().domain([this.data.min,this.data.max]).range([s,0]),c=a/2;return this.g.append("line").attr("x1",l(this.data.min)).attr("x2",l(this.data.max)).attr("y1",c).attr("y2",c).attr("stroke","black"),this.g.append("rect").attr("x",l(this.data.q3)).attr("y",c-a/2).attr("height",a).attr("width",l(this.data.q1)-l(this.data.q3)).attr("stroke","black").style("fill","#69b3a2"),this.g.selectAll("toto").data([this.data.min,this.data.median,this.data.max]).enter().append("line").attr("x1",(function(t){return l(t)})).attr("x2",(function(t){return l(t)})).attr("y1",c-a/2).attr("y2",c+a/2).attr("stroke","black"),this.wrapper.innerHTML}}],i&&mm(e.prototype,i),Object.defineProperty(e,"prototype",{writable:!1}),s}(Ea);function xm(t){return xm="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},xm(t)}function _m(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,n=new Array(e);i<e;i++)n[i]=t[i];return n}function wm(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,(void 0,r=function(t,e){if("object"!==xm(t)||null===t)return t;var i=t[Symbol.toPrimitive];if(void 0!==i){var n=i.call(t,"string");if("object"!==xm(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(n.key),"symbol"===xm(r)?r:String(r)),n)}var r}function Mm(t,e){return Mm=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},Mm(t,e)}function km(t){return km=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},km(t)}var Sm=function(t){!function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&Mm(t,e)}(s,t);var e,i,n,r,o=(n=s,r=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}}(),function(){var t,e=km(n);if(r){var i=km(this).constructor;t=Reflect.construct(e,arguments,i)}else t=e.apply(this,arguments);return function(t,e){if(e&&("object"===xm(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t)}(this,t)});function s(t,e,i,n){var r,a;return function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,s),n.transform&&(i=(null!==(r=i)&&void 0!==r?r:[]).map(n.transform)),(a=o.call(this,t,e,i,n)).svg.remove(),delete a.svg,delete a.wrapper,a}return e=s,(i=[{key:"plot",value:function(t,e,i){var n=this;if(!this.dataIsValid)return console.log("Error: Grid data invalid"),"";var r=document.createElement("div");if(r.className="chart-title grid-title",r.innerHTML=this.title,this.description){var o=document.createElement("div");o.className="question-mark-legacy",o.innerHTML="?";var a=Date.now();o.id="id-".concat(a),r.appendChild(o),setTimeout((function(){var t=document.getElementById("id-".concat(a));t&&t.addEventListener("click",(function(t){n.options.onShowDesc(n.description)}))}))}i.appendChild(r),i.style="background-color: #f5f5f5";var l=t,c=e,h=document.createElement("div");h.className="card",h.style="margin: 5px";var u=document.createElement("div");u.style.display="flex",this.options.direction?u.style.flexDirection=this.options.direction:u.style.flexDirection="row";var d=document.createElement("div");d.className="chart-subtitle",d.innerHTML="temp",i.appendChild(d),c-=r.offsetHeight,c-=d.offsetHeight,c-=12,i.removeChild(d),h.appendChild(u),i.appendChild(h),"row"==u.style.flexDirection?(l-=12,l/=this.data.length):(c-=16*this.data.filter((function(t){return""!=t.name})).length,c/=this.data.length,l-=12);var f,p=!0,g=function(t,e){var i="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!i){if(Array.isArray(t)||(i=function(t,e){if(t){if("string"==typeof t)return _m(t,e);var i=Object.prototype.toString.call(t).slice(8,-1);return"Object"===i&&t.constructor&&(i=t.constructor.name),"Map"===i||"Set"===i?Array.from(t):"Arguments"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?_m(t,e):void 0}}(t))||e&&t&&"number"==typeof t.length){i&&(t=i);var n=0,r=function(){};return{s:r,n:function(){return n>=t.length?{done:!0}:{done:!1,value:t[n++]}},e:function(t){throw t},f:r}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){i=i.call(t)},n:function(){var t=i.next();return s=t.done,t},e:function(t){a=!0,o=t},f:function(){try{s||null==i.return||i.return()}finally{if(a)throw o}}}}(this.data);try{for(g.s();!(f=g.n()).done;){var m=f.value,y=document.createElement("div");p||"column"===this.options.direction||(y.style="border-left: 1px solid grey"),u.appendChild(y);var b=null;switch(m.type){case"textAreaElement":b=new am(m.data.text,m.options);break;case"textElement":b=new im(m.data.text,m.options);break;case"areachart":b=new Ja("","",m.data,m.options);break;case"barchart":b=new Fa("","",m.data,m.options);break;case"boxplot":b=new vm("","",m.data,m.options);break;case"chartjs":b=new Bg("","",m.data,m.options);break;case"grid":b=new s("","",m.data,m.options);break;case"grouped_barchart":b=new ml("","",m.data,m.options);break;case"heatmap":b=new Xg("","",m.data,m.options);break;case"linechart":b=new La("","",m.data,m.options);break;case"piechart":b=new Ga("","",m.data,m.options);break;case"simple_grouped_barchart":b=new El("","",m.data,m.options);break;case"stacked_barchart":b=new hl("","",m.data,m.options);break;case"scatterchart":b=new fm("","",m.data,m.options);break;default:u.removeChild(y);continue}if("column"===this.options.direction){var v,x;null===(v=y.querySelector(".chart-title"))||void 0===v||v.parentElement.remove(),null===(x=y.querySelector(".question-mark"))||void 0===x||x.parentElement.remove();var _=document.createElement("div");_.className="chart-subtitle column",_.innerHTML=m.name,y.appendChild(_);var w=b.plot(l,c,y);null!=w&&(y.innerHTML=y.innerHTML+w)}else{var M,k;null===(M=y.querySelector(".chart-title"))||void 0===M||M.parentElement.remove(),null===(k=y.querySelector(".question-mark"))||void 0===k||k.parentElement.remove();var S=document.createElement("div");S.className="chart-subtitle",S.innerHTML=m.name,y.appendChild(S);var O=b.plot(l,c,y);null!=O&&(y.innerHTML=y.innerHTML+O)}p=!1}}catch(t){g.e(t)}finally{g.f()}return null}}])&&wm(e.prototype,i),Object.defineProperty(e,"prototype",{writable:!1}),s}(Ea)})(),n})())); \ No newline at end of file diff --git a/dist/bundle.js.LICENSE.txt b/dist/bundle.js.LICENSE.txt index fd3788aeed8d0fb5f0df9510b93501802778fd0d..21194c6a8fc9c783fdceb986227fef5fcb5ccd19 100644 --- a/dist/bundle.js.LICENSE.txt +++ b/dist/bundle.js.LICENSE.txt @@ -6,14 +6,14 @@ */ /*! - * Chart.js v4.3.1 + * Chart.js v4.4.0 * https://www.chartjs.org * (c) 2023 Chart.js Contributors * Released under the MIT License */ /*! - * GridStack 7.1.1 + * GridStack 7.3.0 * https://gridstackjs.com/ * * Copyright (c) 2021-2022 Alain Dumesny diff --git a/package-lock.json b/package-lock.json index ff414a1263b2a4456338aa5bdffddfea2ad4b353..c5cd583052a0023cea3b80163b487013cced6071 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,8 @@ "@babel/plugin-proposal-object-rest-spread": "^7.20.7", "chart.js": "^4.3.1", "d3": "^7.7.0", - "d3-scale-chromatic": "^3.0.0" + "d3-scale-chromatic": "^3.0.0", + "uuid": "^9.0.1" }, "devDependencies": { "@babel/core": "^7.20.5", @@ -21,8 +22,8 @@ "css-loader": "^6.7.2", "html-webpack-plugin": "^5.5.0", "mini-css-extract-plugin": "^2.7.2", - "node-sass": "^8.0.0", - "sass-loader": "^13.2.0", + "node-sass": "^9.0.0", + "sass-loader": "^13.2.2", "style-loader": "^3.3.1", "webpack": "^5.75.0", "webpack-cli": "^5.0.1", @@ -1947,9 +1948,9 @@ "dev": true }, "node_modules/@types/minimist": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", - "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", "dev": true }, "node_modules/@types/node": { @@ -1959,9 +1960,9 @@ "dev": true }, "node_modules/@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", "dev": true }, "node_modules/@types/qs": { @@ -5693,9 +5694,9 @@ } }, "node_modules/nan": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", - "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==", + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.18.0.tgz", + "integrity": "sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==", "dev": true }, "node_modules/nanoid": { @@ -5977,9 +5978,9 @@ "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==" }, "node_modules/node-sass": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-8.0.0.tgz", - "integrity": "sha512-jPzqCF2/e6JXw6r3VxfIqYc8tKQdkj5Z/BDATYyG6FL6b/LuYBNFGFVhus0mthcWifHm/JzBpKAd+3eXsWeK/A==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-9.0.0.tgz", + "integrity": "sha512-yltEuuLrfH6M7Pq2gAj5B6Zm7m+gdZoG66wTqG6mIZV/zijq3M2OO2HswtT6oBspPyFhHDcaxWpsBm0fRNDHPg==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -6002,7 +6003,7 @@ "node-sass": "bin/node-sass" }, "engines": { - "node": ">=14" + "node": ">=16" } }, "node_modules/node-sass/node_modules/ansi-styles": { @@ -7471,6 +7472,15 @@ "websocket-driver": "^0.7.4" } }, + "node_modules/sockjs/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/socks": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", @@ -7554,9 +7564,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", - "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", + "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", "dev": true }, "node_modules/spdy": { @@ -8106,10 +8116,13 @@ } }, "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], "bin": { "uuid": "dist/bin/uuid" } diff --git a/package.json b/package.json index 0066148cba95e82e4ad6395db5aae48a26eed91c..71dc9b95f7235cf9da130cf8f651e1e3724c82c5 100644 --- a/package.json +++ b/package.json @@ -17,8 +17,8 @@ "css-loader": "^6.7.2", "html-webpack-plugin": "^5.5.0", "mini-css-extract-plugin": "^2.7.2", - "node-sass": "^8.0.0", - "sass-loader": "^13.2.0", + "node-sass": "^9.0.0", + "sass-loader": "^13.2.2", "style-loader": "^3.3.1", "webpack": "^5.75.0", "webpack-cli": "^5.0.1", @@ -28,7 +28,8 @@ "@babel/plugin-proposal-object-rest-spread": "^7.20.7", "chart.js": "^4.3.1", "d3": "^7.7.0", - "d3-scale-chromatic": "^3.0.0" + "d3-scale-chromatic": "^3.0.0", + "uuid": "^9.0.1" }, "peerDependencies": { "gridstack": "^7.1.1" diff --git a/src/js/charts/base.js b/src/js/charts/base.js index 16c72ae10682eed3a35eeba57e06d52b7d749260..7d635174c60800338691a8dc2aca7f86df2d7465 100644 --- a/src/js/charts/base.js +++ b/src/js/charts/base.js @@ -81,7 +81,8 @@ export class BaseChartWidget { this.g = this.svg.append("g").attr("transform", `translate(${x},${y})`); this.svg.attr("height", divHeight).attr("width", divWidth); - this.svg.attr("style", "background-color: #f5f5f5"); + if(!this.options?.disableBackground) + this.svg.attr("style", "background-color: #f5f5f5"); const width = this.svg.attr("width") - this.marginRight; const height = this.svg.attr("height") - this.marginBottom; @@ -100,7 +101,7 @@ export class BaseChartWidget { .attr("class", "chart-title") .text(this.title); - if (this.description) { + if (this.description && !this.options?.disableQuestionMark) { const randomId = Date.now(); this.svg .append("g") diff --git a/src/js/charts/chartjs.js b/src/js/charts/chartjs.js index 0b7419767d673f9b5232d0558f3ab0d9d28a1a37..206aeea8e0fd807fc1d9ad667d6006780232b074 100644 --- a/src/js/charts/chartjs.js +++ b/src/js/charts/chartjs.js @@ -1,4 +1,5 @@ import Chart from 'chart.js/auto'; +import { v4 as uuidv4 } from 'uuid'; export class ChartJSWidget { constructor(title, description, data, options = {}, type="bar") { @@ -42,7 +43,7 @@ export class ChartJSWidget { element.appendChild(card_element); this.canvas = document.createElement("canvas"); - this.canvas.id = self.crypto.randomUUID(); + this.canvas.id = uuidv4(); card_element.appendChild(this.canvas); this.canvas.style.backgroundColor = '#fff';